<?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>MediaCenter</name>
	<version>0.3</version>
  <mincmsversion>1.8</mincmsversion>
	<help><![CDATA[PGgzPldoYXQgRG9lcyBUaGlzIERvPzwvaDM+DQo8cD5UaGlzIG1vZHVsZSBhbGxvd3MgeW91IHRvIGRpc3BsYXkgZGF0YSBmcm9tIG90aGVyIHBhZ2VzIG9uIHlvdXIgc2l0ZS4gDQpDdXJyZW50bHkgeW91IGNhbiBkaXNwbGF5IGRhdGEgZnJvbSBCaW5nLmNvbSAod2ViIHBhZ2VzLCBwaWN0dXJlcywgdmlkZW9zKSwgWW91VHViZS5jb20gYW5kIFR3aXR0ZXIuY29tIDwvcD4NCjxoND5Vc2luZyBCaW5nPC9oND4NCjxwPkdlbmVyYXRlIEFwaSBrZXkgZnJvbSA8YSBocmVmPSJodHRwOi8vd3d3LmJpbmcuY29tL2RldmVsb3BlcnMvIj53d3cuYmluZy5jb20vZGV2ZWxvcGVyczwvYT4uIFRoaXMgS2V5IHBhc3RlIGluIHRoZSBzZXR0aW5ncyB0YWIgIE1lZGlhIENlbnRlciBtb2R1bGUuPC9wPg0KPHA+VXNlIHRhZzxiciAvPg0Ke2Ntc19tb2R1bGUgbW9kdWxlPSJNZWRpYUNlbnRlciIgc291cmNlPSJiaW5nIiB0eXBlPSJXZWIiIGRpc3BsYXl0ZW1wbGF0ZT0iQmluZ1dlYiIga2V5d29yZD0ia2V5d29yZHMifTxiciAvPg0Kb3Ige2Ntc19tb2R1bGUgbW9kdWxlPSJNZWRpYUNlbnRlciIgc291cmNlPSJiaW5nIiB0eXBlPSJJbWFnZSIgZGlzcGxheXRlbXBsYXRlPSJCaW5nSW1hZ2UiIGtleXdvcmQ9ImtleXdvcmRzIn08YnIgLz4NCm9yIHtjbXNfbW9kdWxlIG1vZHVsZT0iTWVkaWFDZW50ZXIiIHNvdXJjZT0iYmluZyIgdHlwZT0iVmlkZW8iIGRpc3BsYXl0ZW1wbGF0ZT0iQmluZ1ZpZGVvIiBrZXl3b3JkPSJrZXl3b3JkcyJ9Lg0KPC9wPg0KPGg0PlVzaW5nIFlvdXR1YmU8L2g0Pg0KPHA+VXNlIHRhZyA8YnIgLz57Y21zX21vZHVsZSBtb2R1bGU9Ik1lZGlhQ2VudGVyIiBzb3VyY2U9InlvdXR1YmUiIGRpc3BsYXl0ZW1wbGF0ZT0iWW91dHViZSIga2V5d29yZD0ia2V5d29yZHMifTwvcD4NCjxoND5Vc2luZyBUd2l0dGVyPC9oND4NCjxwPlVzZSB0YWcgPGJyIC8+e2Ntc19tb2R1bGUgbW9kdWxlPSJNZWRpYUNlbnRlciIgc291cmNlPSJ0d2l0dGVyIiBkaXNwbGF5dGVtcGxhdGU9IlR3aXR0ZXIiIGtleXdvcmQ9ImtleXdvcmRzIn08L3A+DQo8aDE+RGVtbyAmYW1wOyBEb25hdGUgKHRoYW5rIHlvdSk8L2gxPg0KPHA+PGEgaHJlZj0iaHR0cDovL2t1em1hbnkuYml6L2VuL2Ntcy1tYWRlLXNpbXBsZS9tZWRpYWNlbnRlci8iPmh0dHA6Ly9rdXptYW55LmJpei9lbi9jbXMtbWFkZS1zaW1wbGUvbWVkaWFjZW50ZXIvPC9hPjwvcD4NCjxoMz5EZXBlbmRlbmNpZXM8L2gzPjx1bD48bGk+Q0dFeHRlbnNpb25zID0mZ3Q7IDEuMTg8L2xpPjwvdWw+PGgzPlBhcmFtZXRlcnM8L2gzPjx1bD48bGk+PGVtPihvcHRpb25hbCk8L2VtPiBsYW5nPSJlbl9VUyIgLSBQYXJhbWV0ZXIgaXMgdXNlZCB0byBzcGVjaWZ5IHdoYXQgbGFuZ3VhZ2UgdG8gdXNlIGZvciBkaXNwbGF5IG9uIHRoZSBmcm9udGVuZC4gTm90IGFsbCBtb2R1bGVzIHN1cHBvcnQgb3IgbmVlZCB0aGlzLjwvbGk+PGxpPjxlbT4ob3B0aW9uYWwpPC9lbT4gbGltaXQ9IjIwIiAtIE51bWJlciBvZiBpdGVtczwvbGk+PGxpPjxlbT4ob3B0aW9uYWwpPC9lbT4ga2V5d29yZD0iIiAtIEtleXdvcmRzIGZvciBzZWFyY2ggPC9saT48bGk+PGVtPihvcHRpb25hbCk8L2VtPiBzb3VyY2U9IiIgLSBTb3VyY2UgKHlvdXR1YmUsIGJpbmcgb3IgdHdpdHRlcik8L2xpPjxsaT48ZW0+KG9wdGlvbmFsKTwvZW0+IHR5cGU9IiIgLSBUeXBlcyBkaXNwbGF5LiBQb3NzaWJsZSBwYXJhbWV0cmVzOiAgV2ViLCBJbWFnZSwgVmlkZW8uIE9ubHkgaWYgc291cmNlPSJiaW5nIjwvbGk+PGxpPjxlbT4ob3B0aW9uYWwpPC9lbT4gZGlzcGxheXRlbXBsYXRlPSIiIC0gVmlldyB0ZW1wbGF0ZTwvbGk+PC91bD4=]]></help>
	<about><![CDATA[PGJyIC8+QXV0aG9yOiBLdXptYW55ICZsdDt6ZGVub0BrdXptYW55LmJpeiZndDs8YnIgLz48YnIgLz5WZXJzaW9uOiAwLjM8YnIgLz48YnIgLz5DaGFuZ2UgSGlzdG9yeTo8YnIgLz48dWw+DQo8bGk+VmVyc2lvbiAwLjMsIFNlcHQgMjAxMCAtIEFkZCBUd2l0dGVyLCBuZXcgQmluZyBQSFAgU0RLLCBuZXcgTmV0dGUgY2FjaGUuIEJldHRlciwgYmV0dGVyLCBiZXR0ZXIuPC9saT4NCjxsaT5WZXJzaW9uIDAuMSwgT2N0IDIwMDkgLSBpbml0aWFsIHJlbGVhc2U8L2xpPjwvdWw+PGJyIC8+]]></about>
	<description><![CDATA[Displaying data from YouTube, Bingu]]></description>
	<requires>
	  <requiredname>CGExtensions</requiredname>
	  <requiredversion>1.18</requiredversion>
	</requires>
	<file>
	  <filename>/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/.gitignore</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[DQovbGFuZy8uc3ZuL2VudHJpZXMNCi8uZ2l0aWdub3JlDQovLnN2bi9lbnRyaWVzDQovLnN2bi90ZXh0LWJhc2UvTWVkaWFDZW50ZXIubW9kdWxlLnBocC5zdm4tYmFzZQ0KLy5zdm4vdGV4dC1iYXNlL2FjdGlvbi5hZG1pbl9zYXZlcHJlZnMucGhwLnN2bi1iYXNlDQovLnN2bi90ZXh0LWJhc2UvYWN0aW9uLmJpbmcucGhwLnN2bi1iYXNlDQovLnN2bi90ZXh0LWJhc2UvYWN0aW9uLmRlZmF1bHQucGhwLnN2bi1iYXNlDQovLnN2bi90ZXh0LWJhc2UvYWN0aW9uLmRlZmF1bHRhZG1pbi5waHAuc3ZuLWJhc2UNCi8uc3ZuL3RleHQtYmFzZS9hY3Rpb24ueW91dHViZS5waHAuc3ZuLWJhc2UNCi8uc3ZuL3RleHQtYmFzZS9mdW5jdGlvbi5hZG1pbl9wcmVmc190YWIucGhwLnN2bi1iYXNlDQovLnN2bi90ZXh0LWJhc2UvZnVuY3Rpb24uYWRtaW5fdGVtcGxhdGVzdGFicy5waHAuc3ZuLWJhc2UNCi8uc3ZuL3RleHQtYmFzZS9pbmRleC5odG1sLnN2bi1iYXNlDQovLnN2bi90ZXh0LWJhc2UvbWV0aG9kLmluc3RhbGwucGhwLnN2bi1iYXNlDQovLnN2bi90ZXh0LWJhc2UvbWV0aG9kLnVuaW5zdGFsbC5waHAuc3ZuLWJhc2UNCi8uc3ZuL3RleHQtYmFzZS9tZXRob2QudXBncmFkZS5waHAuc3ZuLWJhc2UNCi9pbWFnZXMvLnN2bi9lbnRyaWVzDQovaW1hZ2VzLy5zdm4vcHJvcC1iYXNlL2ljb24uZ2lmLnN2bi1iYXNlDQovaW1hZ2VzLy5zdm4vdGV4dC1iYXNlL2ljb24uZ2lmLnN2bi1iYXNlDQovbGFuZy8uc3ZuL2FsbC13Y3Byb3BzDQovbGFuZy8uc3ZuL3RleHQtYmFzZS9lbl9VUy5waHAuc3ZuLWJhc2UNCi9saWIvLnN2bi9hbGwtd2Nwcm9wcw0KL2xpYi8uc3ZuL2VudHJpZXMNCi9saWIvLnN2bi90ZXh0LWJhc2UvQmluZ0FQSS5waHAuc3ZuLWJhc2UNCi9saWIvLnN2bi90ZXh0LWJhc2UvSlNPTi5waHAuc3ZuLWJhc2UNCi9saWIvLnN2bi90ZXh0LWJhc2Uvc2ltcGxlcGllLmluYy5zdm4tYmFzZQ0KL2xpYi8uc3ZuL3RleHQtYmFzZS94bWxpemUucGhwLnN2bi1iYXNlDQovdGVtcGxhdGVzLy5zdm4vYWxsLXdjcHJvcHMNCi90ZW1wbGF0ZXMvLnN2bi9lbnRyaWVzDQovdGVtcGxhdGVzLy5zdm4vdGV4dC1iYXNlL2FkZF9lZGl0LnRwbC5zdm4tYmFzZQ0KL3RlbXBsYXRlcy8uc3ZuL3RleHQtYmFzZS9vcmlnX2JpbmdfaW1hZ2UudHBsLnN2bi1iYXNlDQovdGVtcGxhdGVzLy5zdm4vdGV4dC1iYXNlL29yaWdfYmluZ192aWRlby50cGwuc3ZuLWJhc2UNCi90ZW1wbGF0ZXMvLnN2bi90ZXh0LWJhc2Uvb3JpZ19iaW5nX3dlYi50cGwuc3ZuLWJhc2UNCi90ZW1wbGF0ZXMvLnN2bi90ZXh0LWJhc2Uvb3JpZ19uZXdfc2FtcGxlLnRwbC5zdm4tYmFzZQ0KL3RlbXBsYXRlcy8uc3ZuL3RleHQtYmFzZS9vcmlnX3lvdXR1YmVfc2FtcGxlLnRwbC5zdm4tYmFzZQ0KL3RlbXBsYXRlcy8uc3ZuL3RleHQtYmFzZS9wcmVmcy50cGwuc3ZuLWJhc2U=]]></data>
	</file>
	<file>
	  <filename>/action.admin_saveprefs.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIE1vZHVsZTogTWVkaWFDZW50ZXINCiMNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIENNUyAtIENNUyBNYWRlIFNpbXBsZSBpcyAoYykgMjAwNSBieSBUZWQgS3VscCAod2lzaHlAY21zbWFkZXNpbXBsZS5vcmcpDQojIFRoaXMgcHJvamVjdCdzIGhvbWVwYWdlIGlzOiBodHRwOi8vd3d3LmNtc21hZGVzaW1wbGUub3JnDQojIFRoZSBtb2R1bGUncyBob21lcGFnZSBpczogaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy9wcm9qZWN0cy9tZWRpYWNlbnRlci8NCiMNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojDQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5DQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5DQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yDQojIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uDQojDQojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZg0KIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlDQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlDQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBDQojIE9yIHJlYWQgaXQgb25saW5lOiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwNCiMNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCmlmKCAhaXNzZXQoICRnQ21zICkgKSByZXR1cm47DQoNCiR0aGlzLT5TZXRDdXJyZW50VGFiKCdwcmVmcycpOw0KDQppZiAoISR0aGlzLT5DaGVja1Blcm1pc3Npb24oJ01vZGlmeSBTaXRlIFByZWZlcmVuY2VzJykpDQp7DQoJZWNobyAkdGhpcy0+U2hvd0Vycm9ycygkdGhpcy0+TGFuZygnbm9fcGVybWlzaW9uJykpOw0KCXJldHVybjsNCn0NCg0KaWYoICFpc3NldCggJHBhcmFtc1snc3VibWl0J10gKSApDQp7DQoJJHRoaXMtPlJlZGlyZWN0VG9UYWIoJGlkKTsNCn0NCg0KaWYoIGlzc2V0KCRwYXJhbXNbJ2NhY2hlX3RpbWVvdXQnXSkgKQ0Kew0KCSR0aGlzLT5TZXRQcmVmZXJlbmNlKCdjYWNoZV90aW1lb3V0JywkcGFyYW1zWydjYWNoZV90aW1lb3V0J10pOw0KfQ0KDQppZiggaXNzZXQoJHBhcmFtc1sneW91dHViZV9tYXgnXSkgKQ0Kew0KCSR0aGlzLT5TZXRQcmVmZXJlbmNlKCd5b3V0dWJlX21heCcsJHBhcmFtc1sneW91dHViZV9tYXgnXSk7DQp9DQoNCg0KaWYoIGlzc2V0KCRwYXJhbXNbJ2JpbmdfbWF4J10pICkNCnsNCgkkdGhpcy0+U2V0UHJlZmVyZW5jZSgnYmluZ19tYXgnLCRwYXJhbXNbJ2JpbmdfbWF4J10pOw0KfQ0KDQppZiggaXNzZXQoJHBhcmFtc1snYmluZ19hcGlfa2V5J10pICkNCnsNCgkkdGhpcy0+U2V0UHJlZmVyZW5jZSgnYmluZ19hcGlfa2V5JywkcGFyYW1zWydiaW5nX2FwaV9rZXknXSk7DQp9DQoNCiR0aGlzLT5jbGVhclRlbXBEaXIoKTsNCg0KJHRoaXMtPlJlZGlyZWN0VG9UYWIoJGlkKTsNCj8+]]></data>
	</file>
	<file>
	  <filename>/action.bing.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCg0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgTW9kdWxlOiBNZWRpYUNlbnRlcg0KIw0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykNCiMgVGhpcyBwcm9qZWN0J3MgaG9tZXBhZ2UgaXM6IGh0dHA6Ly93d3cuY21zbWFkZXNpbXBsZS5vcmcNCiMgVGhlIG1vZHVsZSdzIGhvbWVwYWdlIGlzOiBodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnL3Byb2plY3RzL21lZGlhY2VudGVyLw0KIw0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMNCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkNCiMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkNCiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3INCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4NCiMNCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsDQojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUNCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0ENCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTA0KIw0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KaWYgKCFpc3NldCgkZ0NtcykpDQogICAgZXhpdDsNCg0KaWYgKCRwYXJhbXNbImxpbWl0Il0pDQogICAgJHRoaXMtPmxpbWl0ID0gJHBhcmFtc1sibGltaXQiXTsNCg0KJGJpbmdfYXBpX2tleSA9ICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdiaW5nX2FwaV9rZXknKTsNCg0KaWYgKCEkY2FjaGVfdGltZW91dCB8fCAhJGJpbmdfYXBpX2tleSkgew0KICAgIGVjaG8gJHRoaXMtPkRpc3BsYXlFcnJvck1lc3NhZ2UoJHRoaXMtPkxhbmcoJ2Vycm9yX21pc3NfcGFyJykpOw0KICAgIHJldHVybjsNCn0NCg0KDQokdGhpcy0+dHlwZSA9ICRwYXJhbXNbInR5cGUiXSA/ICRwYXJhbXNbInR5cGUiXSA6ICJXZWIiOw0KLy8gaW5pdCBjYWNoZQ0KJGNhY2hlX2tleXdvcmQgPSAnYmluZycgLiAkdGhpcy0+dHlwZSAuICRrZXl3b3JkOw0KJGNhY2hlID0gJHRoaXMtPm5ldHRlQ2FjaGUoKTsNCg0KaWYgKGlzU2V0KCRjYWNoZVskY2FjaGVfa2V5d29yZF0pKSB7DQogICAgLy8gbG9hZCBjYWNoZQ0KICAgICRpdGVtcyA9ICRjYWNoZVskY2FjaGVfa2V5d29yZF07DQp9IGVsc2Ugew0KICAgICRyZXN1bHRzID0gJHRoaXMtPmxvYWRCaW5nKCRrZXl3b3JkKTsNCiAgICAkaXRlbXMgPSAkcmVzdWx0czsNCiAgICAkY2FjaGUtPnNhdmUoJGNhY2hlX2tleXdvcmQsICRpdGVtcywgYXJyYXkoJ2V4cGlyZScgPT4gJGNhY2hlX3RpbWVvdXQpKTsNCn0NCiRzbWFydHktPmFzc2lnbl9ieV9yZWYoJ2l0ZW1zJywgJGl0ZW1zKTsNCiRzbWFydHktPmFzc2lnbigncmVzdWx0cycsIGNvdW50KCRpdGVtcykpOw0KJHNtYXJ0eS0+YXNzaWduKCdrZXl3b3JkJywgJGtleXdvcmQpOw0KDQoNCmVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZUZyb21EYXRhYmFzZSgkdGhldGVtcGxhdGUpOw0KDQpyZXR1cm47DQo/Pg==]]></data>
	</file>
	<file>
	  <filename>/action.default.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgTW9kdWxlOiBNZWRpYUNlbnRlcgojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykKIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZwojIFRoZSBtb2R1bGUncyBob21lcGFnZSBpczogaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy9wcm9qZWN0cy9tZWRpYWNlbnRlci8KIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgppZiAoIWlzc2V0KCRnQ21zKSkKICAgIGV4aXQ7CgovLyBjYWNoZSB0aW1vdXQKJGNhY2hlX3RpbWVvdXQgPSBpc1NldCgkcGFyYW1zWyJ0aW1lb3V0Il0pID8gJHBhcmFtc1sidGltZW91dCJdIDogJHRoaXMtPkdldFByZWZlcmVuY2UoJ2NhY2hlX3RpbWVvdXQnLCAzNjAwICogMjQgKiAyKTsKCi8vIGNoZWNrIHJlcXVpcmVkIHBhcmFtcwokc291cmNlID0gdHJpbSgkcGFyYW1zWyJzb3VyY2UiXSk7CiRrZXl3b3JkID0gdHJpbSgkcGFyYW1zWyJrZXl3b3JkIl0pOwppZiAoISRzb3VyY2UgfHwgISRrZXl3b3JkKSB7CiAgICBlY2hvICR0aGlzLT5EaXNwbGF5RXJyb3JNZXNzYWdlKCR0aGlzLT5MYW5nKCdlcnJvcl9taXNzX3BhcicpKTsKICAgIHJldHVybjsKfQoKLy8gbG9hZCB0ZW1wbGF0ZQokdGhldGVtcGxhdGUgPSAnZGlzcGxheV8nIC4gJHRoaXMtPkdldFByZWZlcmVuY2UoTUVESUFDRU5URVJfUFJFRl9ORVdNRURJQUNFTlRFUl9URU1QTEFURSk7CmlmIChpc3NldCgkcGFyYW1zWydkaXNwbGF5dGVtcGxhdGUnXSkpIHsKICAgICR0aGV0ZW1wbGF0ZSA9ICdkaXNwbGF5XycgLiAkcGFyYW1zWydkaXNwbGF5dGVtcGxhdGUnXTsKfQoKJGVudHJ5YXJyYXkgPSBhcnJheSgpOwoKZ2xvYmFsICRnQ21zOwokY29uZmlnID0gJiAkZ0Ntcy0+R2V0Q29uZmlnKCk7Cgpzd2l0Y2ggKCRzb3VyY2UpIHsKICAgIGNhc2UgInlvdXR1YmUiOgogICAgICAgIGluY2x1ZGUoZGlybmFtZShfX0ZJTEVfXykgLiAnL2FjdGlvbi55b3V0dWJlLnBocCcpOwogICAgICAgIGJyZWFrOwogICAgY2FzZSAiYmluZyI6CiAgICAgICAgaW5jbHVkZShkaXJuYW1lKF9fRklMRV9fKSAuICcvYWN0aW9uLmJpbmcucGhwJyk7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlICJ0d2l0dGVyIjoKICAgICAgICBpbmNsdWRlKGRpcm5hbWUoX19GSUxFX18pIC4gJy9hY3Rpb24udHdpdHRlci5waHAnKTsKICAgICAgICBicmVhazsKfQo/Pg==]]></data>
	</file>
	<file>
	  <filename>/action.defaultadmin.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIE1vZHVsZTogTWVkaWFDZW50ZXINCiMNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIENNUyAtIENNUyBNYWRlIFNpbXBsZSBpcyAoYykgMjAwNSBieSBUZWQgS3VscCAod2lzaHlAY21zbWFkZXNpbXBsZS5vcmcpDQojIFRoaXMgcHJvamVjdCdzIGhvbWVwYWdlIGlzOiBodHRwOi8vd3d3LmNtc21hZGVzaW1wbGUub3JnDQojIFRoZSBtb2R1bGUncyBob21lcGFnZSBpczogaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy9wcm9qZWN0cy9tZWRpYWNlbnRlci8NCiMNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojDQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5DQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5DQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yDQojIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uDQojDQojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZg0KIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlDQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlDQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBDQojIE9yIHJlYWQgaXQgb25saW5lOiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwNCiMNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCmlmICghaXNzZXQoJGdDbXMpKSBleGl0Ow0KDQppZiAoISR0aGlzLT5DaGVja1Blcm1pc3Npb24oJ01vZGlmeSBNZWRpYSBDZW50ZXInKSl7DQoJZWNobyAkdGhpcy0+U2hvd0Vycm9ycygkdGhpcy0+TGFuZygnbm9fcGVybWlzaW9uJykpOw0KCXJldHVybjsNCn0NCg0KDQojVGhlIHRhYnMNCmVjaG8gJHRoaXMtPlN0YXJ0VGFiSGVhZGVycygpOw0KDQppZiAoJHRoaXMtPkNoZWNrUGVybWlzc2lvbignTW9kaWZ5IFRlbXBsYXRlcycpKQ0Kew0KCWVjaG8gJHRoaXMtPlNldFRhYkhlYWRlcignZGlzcGxheV90ZW1wbGF0ZScsJHRoaXMtPkxhbmcoJ2Rpc3BsYXl0ZW1wbGF0ZXMnKSk7DQp9DQoNCmlmICgkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdNb2RpZnkgU2l0ZSBQcmVmZXJlbmNlcycpKQ0Kew0KCWVjaG8gJHRoaXMtPlNldFRhYkhlYWRlcigncHJlZnMnLCR0aGlzLT5MYW5nKCdzZXR0aW5ncycpKTsNCn0NCg0KZWNobyAkdGhpcy0+RW5kVGFiSGVhZGVycygpOw0KDQojVGhlIGNvbnRlbnQgb2YgdGhlIHRhYnMNCmVjaG8gJHRoaXMtPlN0YXJ0VGFiQ29udGVudCgpOw0KDQppZiggJHRoaXMtPkNoZWNrUGVybWlzc2lvbiggJ01vZGlmeSBUZW1wbGF0ZXMnICkgKQ0Kew0KCWluY2x1ZGUoZGlybmFtZShfX0ZJTEVfXykuJy9mdW5jdGlvbi5hZG1pbl90ZW1wbGF0ZXN0YWJzLnBocCcpOw0KfQ0KDQppZiAoJHRoaXMtPkNoZWNrUGVybWlzc2lvbignTW9kaWZ5IFNpdGUgUHJlZmVyZW5jZXMnKSkNCnsNCgllY2hvICR0aGlzLT5TdGFydFRhYigncHJlZnMnLCAkcGFyYW1zKTsNCglpbmNsdWRlKGRpcm5hbWUoX19GSUxFX18pLicvZnVuY3Rpb24uYWRtaW5fcHJlZnNfdGFiLnBocCcpOw0KCWVjaG8gJHRoaXMtPkVuZFRhYigpOw0KfQ0KDQplY2hvICR0aGlzLT5FbmRUYWJDb250ZW50KCk7DQoNCj8+]]></data>
	</file>
	<file>
	  <filename>/action.twitter.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIE1vZHVsZTogTWVkaWFDZW50ZXINCiMNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIENNUyAtIENNUyBNYWRlIFNpbXBsZSBpcyAoYykgMjAwNSBieSBUZWQgS3VscCAod2lzaHlAY21zbWFkZXNpbXBsZS5vcmcpDQojIFRoaXMgcHJvamVjdCdzIGhvbWVwYWdlIGlzOiBodHRwOi8vd3d3LmNtc21hZGVzaW1wbGUub3JnDQojIFRoZSBtb2R1bGUncyBob21lcGFnZSBpczogaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy9wcm9qZWN0cy9tZWRpYWNlbnRlci8NCiMNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojDQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5DQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5DQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yDQojIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uDQojDQojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZg0KIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlDQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlDQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBDQojIE9yIHJlYWQgaXQgb25saW5lOiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwNCiMNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCmlmICghaXNzZXQoJGdDbXMpKSBleGl0Ow0KDQovLyBpbml0IGNhY2hlDQokY2FjaGVfa2V5d29yZCA9ICd0d2l0dGVyJyAuICRrZXl3b3JkOw0KJGNhY2hlID0gJHRoaXMtPm5ldHRlQ2FjaGUoKTsNCg0KaWYoaXNTZXQoJGNhY2hlWyRjYWNoZV9rZXl3b3JkXSkpew0KICAgIC8vIGxvYWQgY2FjaGUNCiAgICAkaXRlbXMgPSAgJGNhY2hlWyRjYWNoZV9rZXl3b3JkXTsNCn1lbHNlew0KICANCiAgICAkaXRlbXMgPSAkdGhpcy0+bG9hZFR3aXR0ZXIoJGtleXdvcmQpOw0KICAgICRjYWNoZS0+c2F2ZSgkY2FjaGVfa2V5d29yZCwgJGl0ZW1zLCBhcnJheSgnZXhwaXJlJyA9PiAkY2FjaGVfdGltZW91dCkpOw0KfQ0KDQokc21hcnR5LT5hc3NpZ25fYnlfcmVmKCdpdGVtcycsICRpdGVtcyk7DQokc21hcnR5LT5hc3NpZ24oJ3Jlc3VsdHMnLGNvdW50KCRpdGVtcykpOw0KJHNtYXJ0eS0+YXNzaWduKCdrZXl3b3JkJywka2V5d29yZCk7DQoNCmVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZUZyb21EYXRhYmFzZSgkdGhldGVtcGxhdGUpOw0KDQo/Pg==]]></data>
	</file>
	<file>
	  <filename>/action.youtube.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCg0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgTW9kdWxlOiBNZWRpYUNlbnRlcg0KIw0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykNCiMgVGhpcyBwcm9qZWN0J3MgaG9tZXBhZ2UgaXM6IGh0dHA6Ly93d3cuY21zbWFkZXNpbXBsZS5vcmcNCiMgVGhlIG1vZHVsZSdzIGhvbWVwYWdlIGlzOiBodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnL3Byb2plY3RzL21lZGlhY2VudGVyLw0KIw0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMNCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkNCiMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkNCiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3INCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4NCiMNCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsDQojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUNCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0ENCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTA0KIw0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCmlmICghaXNzZXQoJGdDbXMpKQ0KICAgIGV4aXQ7DQoNCiRsaW1pdCA9ICR0aGlzLT5HZXRQcmVmZXJlbmNlKCd5b3V0dWJlX21heCcsIDIwKTsNCmlmICgkcGFyYW1zWyJsaW1pdCJdKQ0KICAgICRsaW1pdCA9ICRwYXJhbXNbImxpbWl0Il07DQokdGhpcy0+bGltaXQgPSAkbGltaXQ7DQoNCi8vIGluaXQgY2FjaGUNCiRjYWNoZV9rZXl3b3JkID0gJ3lvdXR1YmUnIC4gJGtleXdvcmQ7DQokY2FjaGUgPSAkdGhpcy0+bmV0dGVDYWNoZSgpOw0KDQppZiAoaXNTZXQoJGNhY2hlWyRjYWNoZV9rZXl3b3JkXSkpIHsNCiAgICAvLyBsb2FkIGNhY2hlDQogICAgJGl0ZW1zID0gJGNhY2hlWyRjYWNoZV9rZXl3b3JkXTsNCn0gZWxzZSB7DQoNCiAgICAkaXRlbXMgPSAkdGhpcy0+bG9hZFlvdXR1YmUoJGtleXdvcmQpOw0KICAgICRjYWNoZS0+c2F2ZSgkY2FjaGVfa2V5d29yZCwgJGl0ZW1zLCBhcnJheSgnZXhwaXJlJyA9PiAkY2FjaGVfdGltZW91dCkpOw0KfQ0KDQppZighJGl0ZW1zKSByZXR1cm47DQoNCmZvcmVhY2ggKCRpdGVtcyBhcyAka2V5ID0+ICRpdGVtKSB7DQoNCiAgICAkb25lcm93ID0gbmV3IHN0ZENsYXNzKCk7DQoNCiAgICAkbm9lbWJlZCA9ICRpdGVtLT5nZXRfaXRlbV90YWdzKCdodHRwOi8vZ2RhdGEueW91dHViZS5jb20vc2NoZW1hcy8yMDA3JywgJ25vZW1iZWQnKTsNCiAgICBpZiAoJG5vZW1iZWQpDQogICAgICAgIGNvbnRpbnVlOw0KDQogICAgJG1lZGlhX2dyb3VwID0gJGl0ZW0tPmdldF9pdGVtX3RhZ3MoJ2h0dHA6Ly9zZWFyY2gueWFob28uY29tL21yc3MvJywgJ2dyb3VwJyk7DQogICAgJG1lZGlhX3RodW1ibmFpbCA9ICRtZWRpYV9ncm91cFswXVsnY2hpbGQnXVsnaHR0cDovL3NlYXJjaC55YWhvby5jb20vbXJzcy8nXVsndGh1bWJuYWlsJ107DQogICAgJHRodW1ibmFpbCA9ICRtZWRpYV90aHVtYm5haWxbMF1bJ2F0dHJpYnMnXVsnJ11bJ3VybCddOw0KDQogICAgaWYgKCRlbmMgPSAkaXRlbS0+Z2V0X2VuY2xvc3VyZSgpKSB7DQogICAgICAgICR0aHVtYnMgPSAkZW5jLT5nZXRfdGh1bWJuYWlscygpOw0KICAgICAgICAkdGh1bWJuYWlsID0gJHRodW1ic1swXTsNCiAgICAgICAgJGR1cmF0aW9uID0gJGVuYy0+Z2V0X2R1cmF0aW9uKCk7DQogICAgICAgICRkZXNjcmlwdGlvbiA9ICRlbmMtPmdldF9kZXNjcmlwdGlvbigpOw0KICAgIH0NCiAgICAkcmVzdWx0MiA9IHByZWdfbWF0Y2goIi92PShbXiZdKykvIiwgJGl0ZW0tPmdldF9saW5rKCksICR2aWRlb19pZCk7DQoNCiAgICAkb25lcm93LT50aHVtYm5haWwgPSAkdGh1bWJuYWlsOw0KICAgICRvbmVyb3ctPmxpbmsgPSAkaXRlbS0+Z2V0X2xpbmsoKTsNCiAgICAkb25lcm93LT52aWRlb19pZCA9ICR2aWRlb19pZFsxXTsNCiAgICAkb25lcm93LT50aXRsZSA9ICRpdGVtLT5nZXRfdGl0bGUoKTsNCiAgICAkb25lcm93LT5sZW5naHQgPSAkbGVuZ2h0Ow0KICAgICRvbmVyb3ctPmRlc2NyaXB0aW9uID0gJGRlc2NyaXB0aW9uOw0KDQogICAgJGVudHJ5YXJyYXlbXSA9ICRvbmVyb3c7DQogICAgLy8kb25lcm93ID0gJHRoaXMtPkFycmF5VG9PYmplY3QoJHJvdyk7DQp9DQoNCiRzbWFydHktPmFzc2lnbl9ieV9yZWYoJ2l0ZW1zJywgJGVudHJ5YXJyYXkpOw0KJHNtYXJ0eS0+YXNzaWduKCdyZXN1bHRzJywgJGxpbWl0KTsNCiRzbWFydHktPmFzc2lnbigna2V5d29yZCcsICRrZXl3b3JkKTsNCg0KZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlRnJvbURhdGFiYXNlKCR0aGV0ZW1wbGF0ZSk7DQo/Pg==]]></data>
	</file>
	<file>
	  <filename>/function.admin_prefs_tab.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIE1vZHVsZTogTWVkaWFDZW50ZXINCiMNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIENNUyAtIENNUyBNYWRlIFNpbXBsZSBpcyAoYykgMjAwNSBieSBUZWQgS3VscCAod2lzaHlAY21zbWFkZXNpbXBsZS5vcmcpDQojIFRoaXMgcHJvamVjdCdzIGhvbWVwYWdlIGlzOiBodHRwOi8vd3d3LmNtc21hZGVzaW1wbGUub3JnDQojIFRoZSBtb2R1bGUncyBob21lcGFnZSBpczogaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy9wcm9qZWN0cy9tZWRpYWNlbnRlci8NCiMNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojDQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5DQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5DQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yDQojIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uDQojDQojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZg0KIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlDQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlDQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBDQojIE9yIHJlYWQgaXQgb25saW5lOiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwNCiMNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCmlmICghaXNzZXQoJGdDbXMpKSBleGl0Ow0KJHRoaXMtPlNldEN1cnJlbnRUYWIoJ3ByZWZzJyk7DQoNCiR0aGlzLT5zbWFydHktPmFzc2lnbignc3RhcnRmb3JtJywgJHRoaXMtPkNyZWF0ZUZvcm1TdGFydCgkaWQsICdhZG1pbl9zYXZlcHJlZnMnLCAkcmV0dXJuaWQsICdwb3N0JywgJ211bHRpcGFydC9mb3JtLWRhdGEnKSk7DQokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2VuZGZvcm0nLCAkdGhpcy0+Q3JlYXRlRm9ybUVuZCgpKTsNCg0KDQokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2NhY2hlJywgJHRoaXMtPkxhbmcoJ2NhY2hlJykpOw0KDQokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3Byb21wdF9jYWNoZV90aW1lb3V0JywgJHRoaXMtPkxhbmcoJ2NhY2hlX3RpbWVvdXQnKSk7DQokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2lucHV0X2NhY2hlX3RpbWVvdXQnLCAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCRpZCwgJ2NhY2hlX3RpbWVvdXQnLCAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnY2FjaGVfdGltZW91dCcpLDgsMTYpKTsNCg0KJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCd0aXRsZV95b3V0dWJlJywgJHRoaXMtPkxhbmcoInlvdXR1YmUiKSk7DQoNCiR0aGlzLT5zbWFydHktPmFzc2lnbigncHJvbXB0X3lvdXR1YmVfbWF4JywgJHRoaXMtPkxhbmcoJ3lvdXR1YmVfbWF4JykpOw0KJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpbnB1dF95b3V0dWJlX21heCcsICR0aGlzLT5DcmVhdGVJbnB1dFRleHQoJGlkLCAneW91dHViZV9tYXgnLCAkdGhpcy0+R2V0UHJlZmVyZW5jZSgneW91dHViZV9tYXgnKSwgOCwgMTIpKTsNCg0KDQokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3RpdGxlX2JpbmcnLCAkdGhpcy0+TGFuZygiYmluZyIpKTsNCg0KJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdwcm9tcHRfYmluZ19tYXgnLCAkdGhpcy0+TGFuZygnYmluZ19tYXgnKSk7DQokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2lucHV0X2JpbmdfbWF4JywgJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCgkaWQsICdiaW5nX21heCcsICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdiaW5nX21heCcpLCA4LCAxMikpOw0KDQokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3Byb21wdF9iaW5nX2FwaV9rZXknLCAkdGhpcy0+TGFuZygnYmluZ19hcGlfa2V5JykpOw0KJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpbnB1dF9iaW5nX2FwaV9rZXknLCAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCRpZCwgJ2JpbmdfYXBpX2tleScsICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdiaW5nX2FwaV9rZXknKSwgNDApKTsNCg0KJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdoaWRkZW4nLCAnJyk7DQokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3N1Ym1pdCcsICR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCgkaWQsICdzdWJtaXQnLCBsYW5nKCdzdWJtaXQnKSkpOw0KJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdjYW5jZWwnLCAkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQoJGlkLCAnY2FuY2VsJywgbGFuZygnY2FuY2VsJykpKTsNCg0KZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCdwcmVmcy50cGwnKTsNCg0KPz4=]]></data>
	</file>
	<file>
	  <filename>/function.admin_templatestabs.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIE1vZHVsZTogTWVkaWFDZW50ZXINCiMNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIENNUyAtIENNUyBNYWRlIFNpbXBsZSBpcyAoYykgMjAwNSBieSBUZWQgS3VscCAod2lzaHlAY21zbWFkZXNpbXBsZS5vcmcpDQojIFRoaXMgcHJvamVjdCdzIGhvbWVwYWdlIGlzOiBodHRwOi8vd3d3LmNtc21hZGVzaW1wbGUub3JnDQojIFRoZSBtb2R1bGUncyBob21lcGFnZSBpczogaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy9wcm9qZWN0cy9tZWRpYWNlbnRlci8NCiMNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojDQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5DQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5DQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yDQojIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uDQojDQojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZg0KIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlDQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlDQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBDQojIE9yIHJlYWQgaXQgb25saW5lOiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwNCiMNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCmlmKCAhaXNzZXQoJGdDbXMpICkgZXhpdCgpOw0KDQppZiggJHRoaXMtPkNoZWNrUGVybWlzc2lvbiggJ01vZGlmeSBUZW1wbGF0ZXMnICkgKQ0Kew0KICBlY2hvICR0aGlzLT5TdGFydFRhYignZGlzcGxheV90ZW1wbGF0ZScsICRwYXJhbXMpOw0KICB7DQogICAgDQogICAgZWNobyAkdGhpcy0+U2hvd1RlbXBsYXRlTGlzdCgkaWQsJHJldHVybmlkLCdkaXNwbGF5XycsDQoJCQkgICAgIE1FRElBQ0VOVEVSX1BSRUZfTkVXTUVESUFDRU5URVJfVEVNUExBVEUsDQoJCQkgICAgICdhZG1pbl9kaXNwbGF5X3RlbXBsYXRlJywNCgkJCSAgICAgTUVESUFDRU5URVJfUFJFRl9ORVdNRURJQUNFTlRFUl9URU1QTEFURSwNCgkJCSAgICAgJHRoaXMtPkxhbmcoJ2Rpc3BsYXlfYWRkZWRpdCcpKTsNCiAgfQ0KICBlY2hvICR0aGlzLT5FbmRUYWIoKTsNCg0KfQ0KDQo/Pg==]]></data>
	</file>
	<file>
	  <filename>/images/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/images/icon.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhMgAXANUAAJWVlaWlpbW1tfj4+BcXF+rq6pmZmcHBweLi4vr6+o2Nja2trSsrKzMzMyIiIsXFxZGRkfLy8m1tbc7OzomJieXl5UVFRf39/WFhYdXV1XZ2dtnZ2VxcXNHR0Xl5eWlpaWVlZX5+fk1NTYSEhFlZWe7u7pycnAcHB1JSUlVVVYGBgUlJSUBAQLm5uaqqqsrKyt7e3r6+vj09PaCgoHJycqKiojk5OaioqLCwsLy8vJ6ensjIyPX19fb29gAAAP///yH5BAAAAAAALAAAAAAyABcAAAb/wJ/wl7j8bjIRZhSIZDgYEE1FgQAAppnOpJvNarfAbRwIuM6LBQ4naLeGQiOAZSGFcJcFRmN6TR4xgQeBMQeDhQ87L4uLExOLDweAgXBDHhYWIh4xESESNSUFDwEzBgYmBhAmVwZYM1cAChQUV1YABgELLjiVQiF0Fh8HFSAhMAM3KCsiKRgSNBoe0h4hIxQKClZeN205hgcTOw+9PwoyKxYpAjAcFDw7GB4QBjVnLrouAgstLWz6Ai0WxJjQIcOLXQJwHCBXI4mIFSYmrDDAY4aJBTdaufJiYhWFalQM4HixAcaBVfVeZEBQgtwDOiIs0HjAYEYBATWymagBwBMH/xQiWKxAIUEBjgkIJghQ8OEDgAcICpSIUKEDuQE0ZFhYwSIHgxAIcBpQ4EFEAwcOGDSwAMJohgIIAkhgYcOChBwF8kY4KIEBuR8CuFqwMQKEjA0CANBocOJE2gYsPhjIsaFAi74ECDAIFkPvAAoETjTwS66EBhEyWKTQcELAAQUnfGhWa0FBi7cbMMQ+obkBihpRQ42ILVvG3x8xMChjoYEBidc+fDy2YKJDBQQqHET3wdtBAw1QCwww4YB3aAfHP//MJIHAKgLSISvIUCKGjejEuXuHsDICAhIMoIUWAcf9AAMNP7EAwjIuoCCbDSBM0IML8DWW34MmbFBBBHMw4P/hhz9cYAQ5AnyAAQl2aQIAYw3MMEAAu+G3XXQOAJBBBRmkMFgDPNpgg4hA9pKACRKAgIIFGnwwgwIOELBDBQzwZuGUxIFwowA2NICaDKlZIGICRQQ5RAkKSPBBCiiEoMINTJrAZIBNEhBnZhbWUMACFjhgQ0yYrADmAGCCCeSIFZT5AQkpSDDCKx9IIEOWH8I54HkTHMABC1qmIMKmA3TqaaeCivgDAhSYSYIIHGgQwBYSLMdlljzy6CEBJGSgwYkpcKArBp/2CiqYP1QAAQ0mkkACBiFkUSoHaG4qAgoo5IrBiTqMIAII007LQac9dDtAtz34ekEJLiT5AbZQ0ECCiwIjeKBBNNKEcA0E2RiAKAYcYGvAt93ywAO44faawAAPGPoMNCEAkE9CLpAChhlt4NDCDRqAIAEHACTQg78c+wswv98OcEEBOCiggZoKmHADGy0c4AdJUklFVQk8dFADBS4k8EPHPPfcMaAldHAADvu4vJJUPPDbb7+A8rCBzj8EAQA7]]></data>
	</file>
	<file>
	  <filename>/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[]]></data>
	</file>
	<file>
	  <filename>/lang/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lang/en_US.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCiRsYW5nWydmcmllbmRseW5hbWUnXSA9ICdNZWRpYUNlbnRlcic7DQokbGFuZ1sncG9zdGluc3RhbGwnXSA9ICdNb2R1bCBpbnN0YWxsZWQnOw0KJGxhbmdbJ3Bvc3R1bmluc3RhbGwnXSA9ICdNb2R1bCB1bmlpbnN0YWxsZWQnOw0KJGxhbmdbJ3JlYWxseV91bmluc3RhbGwnXSA9ICdSZW1vdmluZyB0aGlzIG1vZHVsZSB3aWxsIGFsc28gcmVtb3ZlIGFsbCBhc3NvY2lhdGVkIGRhdGEsIGFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBwcm9jZWVkPyc7DQokbGFuZ1sndW5pbnN0YWxsZWQnXSA9ICdNb2R1bCB1bmluc3RhbGxlZCc7DQokbGFuZ1snaW5zdGFsbGVkJ10gPSAnTW9kdWwgaW5zdGFsbGVkJzsNCiRsYW5nWydwcmVmc3VwZGF0ZWQnXSA9ICdTZXR0aW5ncyB1cGRhdGVkJzsNCiRsYW5nWydzdWJtaXQnXSA9ICdTYXZlJzsNCg0KJGxhbmdbJ2NhY2hlJ10gPSAnQ2FjaGUnOw0KJGxhbmdbJ2NhY2hlX2RpciddID0gJ0NhY2hlIGRpcic7DQokbGFuZ1snY2FjaGVfdGltZW91dCddID0gJ0NhY2hlIHRpbWUnOw0KDQokbGFuZ1sneW91dHViZSddID0gJ1lvdXR1YmUnOw0KJGxhbmdbJ3lvdXR1YmVfbWF4J10gPSAnTGltaXQnOw0KDQoNCg0KJGxhbmdbJ2JpbmcnXSA9ICdCaW5nJzsNCiRsYW5nWydiaW5nX21heCddID0gJ0xpbWl0JzsNCiRsYW5nWydiaW5nX2FwaV9rZXknXSA9ICdBcGkga2V5JzsNCg0KJGxhbmdbJ2Rpc3BsYXl0ZW1wbGF0ZXMnXSA9ICdWaWV3IHRlbXBsYXRlcyc7DQokbGFuZ1snZGVmYXVsdHRlbXBsYXRlcyddID0gJ0RlZmF1bHQgdGVtcGxhdGVzJzsNCg0KJGxhbmdbJ2Rpc3BsYXlfYWRkZWRpdCddID0gJ0FkZC9FZGl0IHZpZXcgdGVtcGxhdGUnOw0KJGxhbmdbJ2Vycm9yX21pc3NfcGFyJ10gPSAnU2VsZWN0ZWQgaW5wdXQgcGFyYW1ldGVycyBhcmUgbWlzc2luZyc7DQoNCiRsYW5nWydzZXR0aW5ncyddID0gJ1NldHRpbmdzJzsNCg0KI2hlbHANCiRsYW5nWydoZWxwX2xpbWl0J10gPSAnTnVtYmVyIG9mIGl0ZW1zJyA7DQokbGFuZ1snaGVscF9rZXl3b3JkJ10gPSAnS2V5d29yZHMgZm9yIHNlYXJjaCAnIDsNCiRsYW5nWydoZWxwX3NvdXJjZSddID0gJ1NvdXJjZSAoeW91dHViZSwgYmluZyBvciB0d2l0dGVyKScgOw0KJGxhbmdbJ2hlbHBfdHlwZSddID0gJ1R5cGVzIGRpc3BsYXkuIFBvc3NpYmxlIHBhcmFtZXRyZXM6ICBXZWIsIEltYWdlLCBWaWRlby4gT25seSBpZiBzb3VyY2U9ImJpbmciJzsNCiRsYW5nWydoZWxwX2Rpc3BsYXl0ZW1wbGF0ZSddID0gJ1ZpZXcgdGVtcGxhdGUnIDsNCg0KJGxhbmdbJ21vZGRlc2NyaXB0aW9uJ10gPSAnRGlzcGxheWluZyBkYXRhIGZyb20gWW91VHViZSwgQmluZ3UnOw0KJGxhbmdbJ2NoYW5nZWxvZyddID0gJzx1bD4NCjxsaT5WZXJzaW9uIDAuMywgU2VwdCAyMDEwIC0gQWRkIFR3aXR0ZXIsIG5ldyBCaW5nIFBIUCBTREssIG5ldyBOZXR0ZSBjYWNoZS4gQmV0dGVyLCBiZXR0ZXIsIGJldHRlci48L2xpPg0KPGxpPlZlcnNpb24gMC4xLCBPY3QgMjAwOSAtIGluaXRpYWwgcmVsZWFzZTwvbGk+PC91bD4nOw0KJGxhbmdbJ2hlbHAnXSA9ICc8aDM+V2hhdCBEb2VzIFRoaXMgRG8/PC9oMz4NCjxwPlRoaXMgbW9kdWxlIGFsbG93cyB5b3UgdG8gZGlzcGxheSBkYXRhIGZyb20gb3RoZXIgcGFnZXMgb24geW91ciBzaXRlLiANCkN1cnJlbnRseSB5b3UgY2FuIGRpc3BsYXkgZGF0YSBmcm9tIEJpbmcuY29tICh3ZWIgcGFnZXMsIHBpY3R1cmVzLCB2aWRlb3MpLCBZb3VUdWJlLmNvbSBhbmQgVHdpdHRlci5jb20gPC9wPg0KPGg0PlVzaW5nIEJpbmc8L2g0Pg0KPHA+R2VuZXJhdGUgQXBpIGtleSBmcm9tIDxhIGhyZWY9Imh0dHA6Ly93d3cuYmluZy5jb20vZGV2ZWxvcGVycy8iPnd3dy5iaW5nLmNvbS9kZXZlbG9wZXJzPC9hPi4gVGhpcyBLZXkgcGFzdGUgaW4gdGhlIHNldHRpbmdzIHRhYiAgTWVkaWEgQ2VudGVyIG1vZHVsZS48L3A+DQo8cD5Vc2UgdGFnPGJyIC8+DQp7Y21zX21vZHVsZSBtb2R1bGU9Ik1lZGlhQ2VudGVyIiBzb3VyY2U9ImJpbmciIHR5cGU9IldlYiIgZGlzcGxheXRlbXBsYXRlPSJCaW5nV2ViIiBrZXl3b3JkPSJrZXl3b3JkcyJ9PGJyIC8+DQpvciB7Y21zX21vZHVsZSBtb2R1bGU9Ik1lZGlhQ2VudGVyIiBzb3VyY2U9ImJpbmciIHR5cGU9IkltYWdlIiBkaXNwbGF5dGVtcGxhdGU9IkJpbmdJbWFnZSIga2V5d29yZD0ia2V5d29yZHMifTxiciAvPg0Kb3Ige2Ntc19tb2R1bGUgbW9kdWxlPSJNZWRpYUNlbnRlciIgc291cmNlPSJiaW5nIiB0eXBlPSJWaWRlbyIgZGlzcGxheXRlbXBsYXRlPSJCaW5nVmlkZW8iIGtleXdvcmQ9ImtleXdvcmRzIn0uDQo8L3A+DQo8aDQ+VXNpbmcgWW91dHViZTwvaDQ+DQo8cD5Vc2UgdGFnIDxiciAvPntjbXNfbW9kdWxlIG1vZHVsZT0iTWVkaWFDZW50ZXIiIHNvdXJjZT0ieW91dHViZSIgZGlzcGxheXRlbXBsYXRlPSJZb3V0dWJlIiBrZXl3b3JkPSJrZXl3b3JkcyJ9PC9wPg0KPGg0PlVzaW5nIFR3aXR0ZXI8L2g0Pg0KPHA+VXNlIHRhZyA8YnIgLz57Y21zX21vZHVsZSBtb2R1bGU9Ik1lZGlhQ2VudGVyIiBzb3VyY2U9InR3aXR0ZXIiIGRpc3BsYXl0ZW1wbGF0ZT0iVHdpdHRlciIga2V5d29yZD0ia2V5d29yZHMifTwvcD4NCjxoMT5EZW1vICZhbXA7IERvbmF0ZSAodGhhbmsgeW91KTwvaDE+DQo8cD48YSBocmVmPSJodHRwOi8va3V6bWFueS5iaXovZW4vY21zLW1hZGUtc2ltcGxlL21lZGlhY2VudGVyLyI+aHR0cDovL2t1em1hbnkuYml6L2VuL2Ntcy1tYWRlLXNpbXBsZS9tZWRpYWNlbnRlci88L2E+PC9wPg0KJzsNCj8+]]></data>
	</file>
	<file>
	  <filename>/lang/ext/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lang/ext/fr_FR.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ01lZGlhQ2VudGVyICc7CiRsYW5nWydwb3N0aW5zdGFsbCddID0gJ0xlIG1vZHVsZSBNZWRpYUNlbnRlciBhICZlYWN1dGU7dCZlYWN1dGU7IGluc3RhbGwmZWFjdXRlOyc7CiRsYW5nWydwb3N0dW5pbnN0YWxsJ10gPSAnTGUgbW9kdWxlIE1lZGlhQ2VudGVyIGEgJmVhY3V0ZTt0JmVhY3V0ZTsgZCZlYWN1dGU7c2luc3RhbGwmZWFjdXRlOyc7CiRsYW5nWydyZWFsbHlfdW5pbnN0YWxsJ10gPSAnU3VwcHJpbWVyIGNlIG1vZHVsZSB2YSAmZWFjdXRlO2dhbGVtZW50IHN1cHByaW1lciB0b3V0ZXMgbGVzIGRvbm4mZWFjdXRlO2VzIGFzc29jaSZlYWN1dGU7ZXMuICZFY2lyYzt0ZXMtdm91cyBzJnVjaXJjO3IgZGUgdm91bG9pciBjb250aW51ZXIgPyc7CiRsYW5nWyd1bmluc3RhbGxlZCddID0gJ01vZHVsZSBNZWRpYUNlbnRlciBkJmVhY3V0ZTtzaW5zdGFsbCZlYWN1dGU7JzsKJGxhbmdbJ2luc3RhbGxlZCddID0gJ01vZHVsZSBNZWRpYUNlbnRlciBpbnN0YWxsJmVhY3V0ZTsnOwokbGFuZ1sncHJlZnN1cGRhdGVkJ10gPSAnUGFyYW0mZWdyYXZlO3RyZXMgbWlzICZhZ3JhdmU7IGpvdXInOwokbGFuZ1snc3VibWl0J10gPSAnRW5yZWdpc3RyZXInOwokbGFuZ1snY2FjaGUnXSA9ICdDYWNoZSAnOwokbGFuZ1snY2FjaGVfZGlyJ10gPSAnUiZlYWN1dGU7cGVydG9pcmUgZGUgY2FjaGUnOwokbGFuZ1snY2FjaGVfdGltZW91dCddID0gJ0R1ciZlYWN1dGU7ZSBkZSBjYWNoZSc7CiRsYW5nWyd5b3V0dWJlJ10gPSAnWW91dHViZSAnOwokbGFuZ1sneW91dHViZV9tYXgnXSA9ICdMaW1pdGUnOwokbGFuZ1snaW1lZW0nXSA9ICdJbWVlbSAnOwokbGFuZ1snaW1lZW1fbWF4J10gPSAnTGltaXRlJzsKJGxhbmdbJ2ltZWVtX2FwaV9rZXknXSA9ICdDbGVmIGQmIzAzOTtBcGknOwokbGFuZ1snaW1lZW1fc2VjcmV0X2tleSddID0gJ0NsZWYgc2VjciZlZ3JhdmU7dGUnOwokbGFuZ1snYmluZyddID0gJ0JpbmcgJzsKJGxhbmdbJ2JpbmdfbWF4J10gPSAnTGltaXRlJzsKJGxhbmdbJ2JpbmdfYXBpX2tleSddID0gJ0NsZWYgZCYjMDM5O0FwaSc7CiRsYW5nWydkaXNwbGF5dGVtcGxhdGVzJ10gPSAnR2FiYXJpdHMgZCYjMDM5O2FmZmljaGFnZSc7CiRsYW5nWydkZWZhdWx0dGVtcGxhdGVzJ10gPSAnR2FiYXJpdHMgcGFyIGQmZWFjdXRlO2ZhdXQnOwokbGFuZ1snZGlzcGxheV9hZGRlZGl0J10gPSAnQWpvdXRlci9FZGl0ZXIgdW4gZ2FiYXJpdCBkJiMwMzk7YWZmaWNoYWdlJzsKJGxhbmdbJ2Vycm9yX21pc3NfcGFyJ10gPSAnTGVzIHBhcmFtJmVncmF2ZTt0cmVzIGQmIzAzOTtlbnRyJmVhY3V0ZTtlIHMmZWFjdXRlO2xlY3Rpb25uJmVhY3V0ZTtzIHNvbnQgbWFucXVhbnQnOwokbGFuZ1snc2V0dGluZ3MnXSA9ICdQYXJhbSZlZ3JhdmU7dHJlcyc7CiRsYW5nWydoZWxwX2xpbWl0J10gPSAnTm9tYnJlIGQmIzAzOTtpdGVtcyc7CiRsYW5nWydoZWxwX2tleXdvcmQnXSA9ICdNb3RzIGNsZWZzJzsKJGxhbmdbJ2hlbHBfc291cmNlJ10gPSAnU291cmNlJm5ic3A7LSZuYnNwO3lvdXR1YmUsIGJpbmcsIGltZWVtJzsKJGxhbmdbJ2hlbHBfdHlwZSddID0gJ3R5cGVzIGQmIzAzOTthZmZpY2hhZ2UuIFBhcmFtZXRyZXMgIFdlYiwgSW1hZ2UsIFZpZGVvLiBPbmx5IGlmIHNvdXJjZT0mcXVvdDtiaW5nJnF1b3Q7JzsKJGxhbmdbJ2hlbHBfZGlzcGxheXRlbXBsYXRlJ10gPSAnR2FiYXJpdCBkJiMwMzk7YWZmaWNoYWdlJzsKJGxhbmdbJ21vZGRlc2NyaXB0aW9uJ10gPSAnQWZmaWNoZSBkZXMgZG9ubiZlYWN1dGU7ZXMgZGUgWW91VHViZSwgQmluZ3UsIEltZWVtLic7CiRsYW5nWydjaGFuZ2Vsb2cnXSA9ICc8dWw+DQo8bGk+VmVyc2lvbiAwLjksIE9jdCAyMDA5IC0gdmVyc2lvbiBpbml0aWFsZTwvbGk+PC91bD4nOwokbGFuZ1snaGVscCddID0gJzxoMz5RdWUgZmFpdCBjZSBtb2R1bGUgPzwvaDM+DQo8cD5DZSBtb2R1bGUgcGVybWV0IGQmIzAzOTthZmZpY2hlciBzdXIgdm90cmUgc2l0ZSBkZXMgZG9ubiZlYWN1dGU7ZXMgaXNzdWVzIGQmIzAzOTthdXRyZXMgcGFnZXMgZXh0ZXJuZXMuIA0KQWN0dWVsbGVtZW50LCB2b3VzIHBvdXZleiBhZmZpY2hlciBkZXMgZG9ubiZlYWN1dGU7ZXMgZGUgQmluZy5jb20gKHBhZ2VzIHdlYiwgaW1hZ2VzLCB2aWRlb3MpLCBZb3VUdWJlLmNvbSBldCBJbWVlbS5jb208L3A+DQo8aDQ+UG91ciBwb3V2b2lyIHV0aWxpc2VyIEJpbmc8L2g0Pg0KPHA+RyZlYWN1dGU7biZlYWN1dGU7cmVyIGxhIGNsZWYgZCYjMDM5O0FwaSBkZXB1aXMgPGEgaHJlZj0iaHR0cDovL3d3dy5iaW5nLmNvbS9kZXZlbG9wZXJzLyI+d3d3LmJpbmcuY29tL2RldmVsb3BlcnM8L2E+LiBDb3BpZXIgY2V0dGUgY2xlZiBkYW5zIGwmIzAzOTtvbmdsZXQgUGFyYW0mZWdyYXZlO3RyZXMgZHUgbW9kdWxlIE1lZGlhQ2VudGVyLjwvcD4NCjxwPlV0aWxpc2F0aW9uIGRlcyBiYWxpc2VzIDo8YnIgLz4NCntjbXNfbW9kdWxlIG1vZHVsZT0mcXVvdDtNZWRpYUNlbnRlciZxdW90OyBzb3VyY2U9JnF1b3Q7YmluZyZxdW90OyB0eXBlPSZxdW90O1dlYiZxdW90OyBkaXNwbGF5dGVtcGxhdGU9JnF1b3Q7QmluZ1dlYiZxdW90OyBrZXl3b3JkPSZxdW90O2tleXdvcmRzJnF1b3Q7fTxiciAvPg0Kb3Uge2Ntc19tb2R1bGUgbW9kdWxlPSZxdW90O01lZGlhQ2VudGVyJnF1b3Q7IHNvdXJjZT0mcXVvdDtiaW5nJnF1b3Q7IHR5cGU9JnF1b3Q7SW1hZ2UmcXVvdDsgZGlzcGxheXRlbXBsYXRlPSZxdW90O0JpbmdJbWFnZSZxdW90OyBrZXl3b3JkPSZxdW90O2tleXdvcmRzJnF1b3Q7fTxiciAvPg0Kb3Uge2Ntc19tb2R1bGUgbW9kdWxlPSZxdW90O01lZGlhQ2VudGVyJnF1b3Q7IHNvdXJjZT0mcXVvdDtiaW5nJnF1b3Q7IHR5cGU9JnF1b3Q7VmlkZW8mcXVvdDsgZGlzcGxheXRlbXBsYXRlPSZxdW90O0JpbmdWaWRlbyZxdW90OyBrZXl3b3JkPSZxdW90O2tleXdvcmRzJnF1b3Q7fS4NCjwvcD4NCjxoND5Qb3VyIHV0aWxpc2VyIEltZWVtPC9oND4NCjxwPkcmZWFjdXRlO24mZWFjdXRlO3JlciB1bmUgY2xlZiBkJiMwMzk7QXBpIGV0IHVuZSBjbGVmIHNlY3ImZWdyYXZlO3RlIGRlcHVpcyA8YSBocmVmPSJodHRwOi8vd3d3LmltZWVtLmNvbS9kZXZlbG9wZXJzLyI+d3d3LmltZWVtLmNvbS9kZXZlbG9wZXJzPC9hPi4gQ29waWVyIGNlcyBjbGVmcyBkYW5zIGwmIzAzOTtvbmdsZXQgUGFyYW0mZWdyYXZlO3RyZXMgZHUgbW9kdWxlIE1lZGlhQ2VudGVyLjwvcD4NCjxwPlV0aWxpc2F0aW9uIGRlcyBiYWxpc2VzIDo8YnIgLz4NCntjbXNfbW9kdWxlIG1vZHVsZT0mcXVvdDtNZWRpYUNlbnRlciZxdW90OyBzb3VyY2U9JnF1b3Q7aW1lZW0mcXVvdDsgZGlzcGxheXRlbXBsYXRlPSZxdW90O0ltZWVtJnF1b3Q7IGtleXdvcmQ9JnF1b3Q7a2V5d29yZHMmcXVvdDt9PC9wPiANCjxoND5Qb3VyIHV0aWxpc2VyIFlvdXR1YmU8L2g0Pg0KPHA+VXRpbGlzYXRpb24gZGVzIGJhbGlzZXMgOjxiciAvPntjbXNfbW9kdWxlIG1vZHVsZT0mcXVvdDtNZWRpYUNlbnRlciZxdW90OyBzb3VyY2U9JnF1b3Q7eW91dHViZSZxdW90OyBkaXNwbGF5dGVtcGxhdGU9JnF1b3Q7WW91dHViZSZxdW90OyBrZXl3b3JkPSZxdW90O0vEviZ1YWN1dGU7xI1vdiZlYWN1dGU7IHNsb3YmYWFjdXRlOyBwcmUgdnloxL5hZCZhYWN1dGU7dmFuaWUmcXVvdDt9PC9wPiANCic7Cj8+]]></data>
	</file>
	<file>
	  <filename>/lang/ext/nl_NL.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ01lZGlhIENlbnRlcic7CiRsYW5nWydwb3N0aW5zdGFsbCddID0gJ01vZHVsZSBnZSZpdW1sO25zdGFsbGVlcmQnOwokbGFuZ1sncG9zdHVuaW5zdGFsbCddID0gJ01vZHVsZSBnZWRlJml1bWw7bnN0YWxsZWVyZCc7CiRsYW5nWydyZWFsbHlfdW5pbnN0YWxsJ10gPSAnVmVyd2lqZGVyZW4gdmFuIGRlemUgbW9kdWxlIHJlc3VsdGVlcmQgb29rIGluIGhldCB2ZXJ3aWpkZXJlbiB2YW4gYWxsZSBnZWFzc29jaWVlcmRlIGRhdGEuIFdlZXQgdSB6ZWtlciBkYXQgdSB3aWx0IHZlcmRlciBnYWFuPyc7CiRsYW5nWyd1bmluc3RhbGxlZCddID0gJ01vZHVsZSBnZWRlJml1bWw7bnN0YWxsZWVyZCc7CiRsYW5nWydpbnN0YWxsZWQnXSA9ICdNb2R1bGUgZ2UmaXVtbDtuc3RhbGxlZXJkJzsKJGxhbmdbJ3ByZWZzdXBkYXRlZCddID0gJ0luc3RlbGxpbmdlbiBvcHNsYWFuJzsKJGxhbmdbJ3N1Ym1pdCddID0gJ09wc2xhYW4nOwokbGFuZ1snY2FjaGUnXSA9ICdCdWZmZXInOwokbGFuZ1snY2FjaGVfZGlyJ10gPSAnQnVmZmVyIG1hcCc7CiRsYW5nWydjYWNoZV90aW1lb3V0J10gPSAnQnVmZmVyIHRpamQnOwokbGFuZ1sneW91dHViZSddID0gJ1lvdVR1YmUgJzsKJGxhbmdbJ3lvdXR1YmVfbWF4J10gPSAnTGltaWV0JzsKJGxhbmdbJ2ltZWVtJ10gPSAnSW1lZW0gJzsKJGxhbmdbJ2ltZWVtX21heCddID0gJ0xpbWlldCc7CiRsYW5nWydpbWVlbV9hcGlfa2V5J10gPSAnQXBpIHNsZXV0ZWwnOwokbGFuZ1snaW1lZW1fc2VjcmV0X2tleSddID0gJ0dlaGVpbWUgc2xldXRlbCc7CiRsYW5nWydiaW5nJ10gPSAnQmluZyAnOwokbGFuZ1snYmluZ19tYXgnXSA9ICdMaW1pZXQnOwokbGFuZ1snYmluZ19hcGlfa2V5J10gPSAnQXBpIHNsZXV0ZWwnOwokbGFuZ1snZGlzcGxheXRlbXBsYXRlcyddID0gJ092ZXJ6aWNodCBzamFibG9uZW4nOwokbGFuZ1snZGVmYXVsdHRlbXBsYXRlcyddID0gJ1N0YW5kYWFyZCBzamFibG9vbic7CiRsYW5nWydkaXNwbGF5X2FkZGVkaXQnXSA9ICdUb2V2b2VnZW4vd2lqemlnZW4gT3ZlcnppY2h0IFNqYWJsb25lbic7CiRsYW5nWydlcnJvcl9taXNzX3BhciddID0gJ0RlIGdlc2VsZWN0ZWVyZGUgaW5wdXQgcGFyYW1ldGVycyB6aWpuIG5pZXQgYWFud2V6aWcnOwokbGFuZ1snc2V0dGluZ3MnXSA9ICdJbnN0ZWxsaW5nZW4nOwokbGFuZ1snaGVscF9saW1pdCddID0gJ0FhbnRhbCBpdGVtcyc7CiRsYW5nWydoZWxwX2tleXdvcmQnXSA9ICdTbGV1dGVsd29vcmRlbic7CiRsYW5nWydoZWxwX3NvdXJjZSddID0gJ0Jyb24gLSBZb3VUdWJlLCBCaW5nLCBJbWVlbSc7CiRsYW5nWydoZWxwX3R5cGUnXSA9ICdkaXNwbGF5IHR5cGVzLiBQYXJhbWV0cmVzICBXZWIsIEltYWdlLCBWaWRlby4gT25seSBpZiBzb3VyY2U9JnF1b3Q7YmluZyZxdW90Oyc7CiRsYW5nWydoZWxwX2Rpc3BsYXl0ZW1wbGF0ZSddID0gJ092ZXJ6aWNodCBzamFibG9vbic7CiRsYW5nWydtb2RkZXNjcmlwdGlvbiddID0gJ1Rvb24gZGF0YSB2YW4gWW91VHViZSwgQmluZ3UsIEltZWVtLic7CiRsYW5nWydjaGFuZ2Vsb2cnXSA9ICc8dWw+DQo8bGk+VmVyc2lvbiAwLjksIE9jdCAyMDA5IC0gaW5pdGlhbCByZWxlYXNlIDwvbGk+PC91bD4nOwokbGFuZ1snaGVscCddID0gJzxoMz5XaGF0IERvZXMgVGhpcyBEbz8gPC9oMz4NCjxwPlRoaXMgbW9kdWxlIGFsbG93cyB5b3UgdG8gZGlzcGxheSBkYXRhIGZyb20gb3RoZXIgcGFnZXMgb24geW91ciBzaXRlLiANCkN1cnJlbnRseSB5b3UgY2FuIGRpc3BsYXkgZGF0YSBmcm9tIEJpbmcuY29tICh3ZWIgcGFnZXMsIHBpY3R1cmVzLCB2aWRlb3MpLCBZb3VUdWJlLmNvbSBhbmQgSW1lZW0uY29tPC9wPg0KPGg0PlVzaW5nIEJpbmc8L2g0Pg0KPHA+R2VuZXJhdGUgQXBpIGtleSBmcm9tIDxhIGhyZWY9Imh0dHA6Ly93d3cuYmluZy5jb20vZGV2ZWxvcGVycy8iPnd3dy5iaW5nLmNvbS9kZXZlbG9wZXJzPC9hPi4gVGhpcyBLZXkgcGFzdGUgaW4gdGhlIHNldHRpbmdzIHRhYiAgTWVkaWEgQ2VudGVyIG1vZHVsZS48L3A+DQo8cD5Vc2UgdGFnPGJyIC8+DQp7Y21zX21vZHVsZSBtb2R1bGU9JnF1b3Q7TWVkaWFDZW50ZXImcXVvdDsgc291cmNlPSZxdW90O2JpbmcmcXVvdDsgdHlwZT0mcXVvdDtXZWImcXVvdDsgZGlzcGxheXRlbXBsYXRlPSZxdW90O0JpbmdXZWImcXVvdDsga2V5d29yZD0mcXVvdDtrZXl3b3JkcyZxdW90O308YnIgLz4NCm9yIHtjbXNfbW9kdWxlIG1vZHVsZT0mcXVvdDtNZWRpYUNlbnRlciZxdW90OyBzb3VyY2U9JnF1b3Q7YmluZyZxdW90OyB0eXBlPSZxdW90O0ltYWdlJnF1b3Q7IGRpc3BsYXl0ZW1wbGF0ZT0mcXVvdDtCaW5nSW1hZ2UmcXVvdDsga2V5d29yZD0mcXVvdDtrZXl3b3JkcyZxdW90O308YnIgLz4NCm9yIHtjbXNfbW9kdWxlIG1vZHVsZT0mcXVvdDtNZWRpYUNlbnRlciZxdW90OyBzb3VyY2U9JnF1b3Q7YmluZyZxdW90OyB0eXBlPSZxdW90O1ZpZGVvJnF1b3Q7IGRpc3BsYXl0ZW1wbGF0ZT0mcXVvdDtCaW5nVmlkZW8mcXVvdDsga2V5d29yZD0mcXVvdDtrZXl3b3JkcyZxdW90O30uDQo8L3A+DQo8aDQ+VXNpbmcgSW1lZW08L2g0Pg0KPHA+R2VuZXJhdGUgQXBpIGtleSBhIFNlY3JldCBrZXkgb24gPGEgaHJlZj0iaHR0cDovL3d3dy5pbWVlbS5jb20vZGV2ZWxvcGVycy8iPnd3dy5pbWVlbS5jb20vZGV2ZWxvcGVyczwvYT4uIFRoZXNlIGtleXMgcGFzdGUgaW4gdGhlIHNldHRpbmdzIHRhYiAgTWVkaWEgQ2VudGVyIG1vZHVsZS48L3A+DQo8cD5Vc2UgdGFnIDxiciAvPntjbXNfbW9kdWxlIG1vZHVsZT0mcXVvdDtNZWRpYUNlbnRlciZxdW90OyBzb3VyY2U9JnF1b3Q7aW1lZW0mcXVvdDsgZGlzcGxheXRlbXBsYXRlPSZxdW90O0ltZWVtJnF1b3Q7IGtleXdvcmQ9JnF1b3Q7a2V5d29yZHMmcXVvdDt9PC9wPiANCjxoND5Vc2luZyBZb3V0dWJlPC9oND4NCjxwPlVzZSB0YWcgPGJyIC8+e2Ntc19tb2R1bGUgbW9kdWxlPSZxdW90O01lZGlhQ2VudGVyJnF1b3Q7IHNvdXJjZT0mcXVvdDt5b3V0dWJlJnF1b3Q7IGRpc3BsYXl0ZW1wbGF0ZT0mcXVvdDtZb3V0dWJlJnF1b3Q7IGtleXdvcmQ9JnF1b3Q7S8S+JnVhY3V0ZTvEjW92JmVhY3V0ZTsgc2xvdiZhYWN1dGU7IHByZSB2eWjEvmFkJmFhY3V0ZTt2YW5pZSZxdW90O308L3A+IA0KJzsKJGxhbmdbJ3V0bWEnXSA9ICcxNTY4NjEzNTMuMTk0NTIzNzUwMy4xMjU3NDI3NjU0LjEyNTgwNDg1NjcuMTI1ODA0ODYxNi4zOCc7CiRsYW5nWyd1dG16J10gPSAnMTU2ODYxMzUzLjEyNTgwMjI0MTIuMzMuMi51dG1jY249KHJlZmVycmFsKXx1dG1jc3I9Zm9ydW0uY21zbWFkZXNpbXBsZS5vcmd8dXRtY2N0PS9pbmRleC5waHAvdG9waWMsMzkwMDUuMC5odG1sfHV0bWNtZD1yZWZlcnJhbCc7CiRsYW5nWydxY2EnXSA9ICdQMC0xMjk0NDAyNzYwLTEyNTc0Mjc2NTQ0MDgnOwokbGFuZ1sndXRtYiddID0gJzE1Njg2MTM1My4xLjEwLjEyNTgwNDg2MTYnOwokbGFuZ1sndXRtYyddID0gJzE1Njg2MTM1Myc7Cj8+]]></data>
	</file>
	<file>
	  <filename>/lang/ext/sk_SK.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0NlbnRydW0gbSZlYWN1dGU7ZGlpJzsKJGxhbmdbJ3Bvc3RpbnN0YWxsJ10gPSAnTW9kdWwgbmFpbiZzY2Fyb247dGFsb3ZhbiZ5YWN1dGU7JzsKJGxhbmdbJ3Bvc3R1bmluc3RhbGwnXSA9ICdNb2R1bCBvZGluJnNjYXJvbjt0YWxvdmFuJnlhY3V0ZTsnOwokbGFuZ1sncmVhbGx5X3VuaW5zdGFsbCddID0gJ09kc3RyJmFhY3V0ZTtuZW4maWFjdXRlO20gbW9kdWx1IHZ5bWHFvmV0ZSB2JnNjYXJvbjtldGt5IHByaXNsdWNoJmFhY3V0ZTtqJnVhY3V0ZTtjZSBkJmFhY3V0ZTt0YS4gQ2hjZXRlIHBva3JhxI1vdmHFpT8nOwokbGFuZ1sndW5pbnN0YWxsZWQnXSA9ICdNb2R1bCBvZGluJnNjYXJvbjt0YWxvdmFuJnlhY3V0ZTsnOwokbGFuZ1snaW5zdGFsbGVkJ10gPSAnTW9kdWwgbmFpbiZzY2Fyb247dGFsb3ZhbiZ5YWN1dGU7JzsKJGxhbmdbJ3ByZWZzdXBkYXRlZCddID0gJ05hc3RhdmVuaWEgdXByYXZlbiZlYWN1dGU7JzsKJGxhbmdbJ3N1Ym1pdCddID0gJ1Vsb8W+acWlJzsKJGxhbmdbJ2NhY2hlJ10gPSAnS2Umc2Nhcm9uOyc7CiRsYW5nWydjYWNoZV9kaXInXSA9ICdBZHJlcyZhYWN1dGU7ciBwcmUga2Umc2Nhcm9uO292YW5pZSc7CiRsYW5nWydjYWNoZV90aW1lb3V0J10gPSAnxIxhcyBrZSZzY2Fyb247b3ZhbmlhJzsKJGxhbmdbJ3lvdXR1YmUnXSA9ICdZb3V0dWJlJzsKJGxhbmdbJ3lvdXR1YmVfbWF4J10gPSAnTGltaXQnOwokbGFuZ1snYmluZyddID0gJ0JpbmcnOwokbGFuZ1snYmluZ19tYXgnXSA9ICdMaW1pdCc7CiRsYW5nWydiaW5nX2FwaV9rZXknXSA9ICdBcGkga8S+JnVhY3V0ZTvEjSc7CiRsYW5nWydkaXNwbGF5dGVtcGxhdGVzJ10gPSAnJlNjYXJvbjthYmwmb2FjdXRlO25hIHpvYnJhemVuaWEnOwokbGFuZ1snZGVmYXVsdHRlbXBsYXRlcyddID0gJ1ByZWRuYXN0YXZlbiZlYWN1dGU7ICZzY2Fyb247YWJsJm9hY3V0ZTtueSc7CiRsYW5nWydkaXNwbGF5X2FkZGVkaXQnXSA9ICdQcmlkYcWlL1VwcmF2acWlICZzY2Fyb247YWJsJm9hY3V0ZTtudSB6b2JyYXplbmlhJzsKJGxhbmdbJ2Vycm9yX21pc3NfcGFyJ10gPSAnVnlicmFuJmVhY3V0ZTsgdnN0dXBuJmVhY3V0ZTsgcGFyYW1ldHJlIG5lYm9saSB6YWRhbiZlYWN1dGU7JzsKJGxhbmdbJ3NldHRpbmdzJ10gPSAnTmFzdGF2ZW5pYSc7CiRsYW5nWydoZWxwX2xpbWl0J10gPSAnUG/EjWV0IHBvbG/Fvmllayc7CiRsYW5nWydoZWxwX2tleXdvcmQnXSA9ICdLxL4mdWFjdXRlO8SNb3YmZWFjdXRlOyBzbG92JmFhY3V0ZTsnOwokbGFuZ1snaGVscF90eXBlJ10gPSAndHlwIHpvYnJhemVuaWEuIFBhcmFtZXRyZSBXZWIsIEltYWdlLCBWaWRlby4gSWJhIHByaSBzb3VyY2U9JnF1b3Q7YmluZyZxdW90Oyc7CiRsYW5nWydoZWxwX2Rpc3BsYXl0ZW1wbGF0ZSddID0gJyZTY2Fyb247YWJsJm9hY3V0ZTtuYSB6b2JyYXplbmlhJzsKJGxhbmdbJ21vZGRlc2NyaXB0aW9uJ10gPSAnWm9icmF6ZW5pZSBkJmFhY3V0ZTt0IHogWW91VHViZSBhIEJpbmd1JzsKJGxhbmdbJ2NoYW5nZWxvZyddID0gJzx1bD4NCjxsaT5WZXJzaW9uIDAuOSwgT2N0IDIwMDkgLSBwcnYmZWFjdXRlOyB2eWRhbmllPC9saT48L3VsPic7CiRsYW5nWydoZWxwJ10gPSAnPGgzPldoYXQgRG9lcyBUaGlzIERvPzwvaDM+DQo8cD5UaGlzIG1vZHVsZSBhbGxvd3MgeW91IHRvIGRpc3BsYXkgZGF0YSBmcm9tIG90aGVyIHBhZ2VzIG9uIHlvdXIgc2l0ZS4gDQpDdXJyZW50bHkgeW91IGNhbiBkaXNwbGF5IGRhdGEgZnJvbSBCaW5nLmNvbSAod2ViIHBhZ2VzLCBwaWN0dXJlcywgdmlkZW9zKSwgWW91VHViZS5jb20gPC9wPg0KPGg0PlVzaW5nIEJpbmc8L2g0Pg0KPHA+R2VuZXJhdGUgQXBpIGtleSBmcm9tIDxhIGhyZWY9Imh0dHA6Ly93d3cuYmluZy5jb20vZGV2ZWxvcGVycy8iPnd3dy5iaW5nLmNvbS9kZXZlbG9wZXJzPC9hPi4gVGhpcyBLZXkgcGFzdGUgaW4gdGhlIHNldHRpbmdzIHRhYiAgTWVkaWEgQ2VudGVyIG1vZHVsZS48L3A+DQo8cD5Vc2UgdGFnPGJyIC8+DQp7Y21zX21vZHVsZSBtb2R1bGU9JnF1b3Q7TWVkaWFDZW50ZXImcXVvdDsgc291cmNlPSZxdW90O2JpbmcmcXVvdDsgdHlwZT0mcXVvdDtXZWImcXVvdDsgZGlzcGxheXRlbXBsYXRlPSZxdW90O0JpbmdXZWImcXVvdDsga2V5d29yZD0mcXVvdDtrZXl3b3JkcyZxdW90O308YnIgLz4NCm9yIHtjbXNfbW9kdWxlIG1vZHVsZT0mcXVvdDtNZWRpYUNlbnRlciZxdW90OyBzb3VyY2U9JnF1b3Q7YmluZyZxdW90OyB0eXBlPSZxdW90O0ltYWdlJnF1b3Q7IGRpc3BsYXl0ZW1wbGF0ZT0mcXVvdDtCaW5nSW1hZ2UmcXVvdDsga2V5d29yZD0mcXVvdDtrZXl3b3JkcyZxdW90O308YnIgLz4NCm9yIHtjbXNfbW9kdWxlIG1vZHVsZT0mcXVvdDtNZWRpYUNlbnRlciZxdW90OyBzb3VyY2U9JnF1b3Q7YmluZyZxdW90OyB0eXBlPSZxdW90O1ZpZGVvJnF1b3Q7IGRpc3BsYXl0ZW1wbGF0ZT0mcXVvdDtCaW5nVmlkZW8mcXVvdDsga2V5d29yZD0mcXVvdDtrZXl3b3JkcyZxdW90O30uDQo8L3A+DQo8aDQ+VXNpbmcgWW91dHViZTwvaDQ+DQo8cD5Vc2UgdGFnIDxiciAvPntjbXNfbW9kdWxlIG1vZHVsZT0mcXVvdDtNZWRpYUNlbnRlciZxdW90OyBzb3VyY2U9JnF1b3Q7eW91dHViZSZxdW90OyBkaXNwbGF5dGVtcGxhdGU9JnF1b3Q7WW91dHViZSZxdW90OyBrZXl3b3JkPSZxdW90O0vEviZ1YWN1dGU7xI1vdiZlYWN1dGU7IHNsb3YmYWFjdXRlOyBwcmUgdnloxL5hZCZhYWN1dGU7dmFuaWUmcXVvdDt9PC9wPiANCic7CiRsYW5nWyd1dG1hJ10gPSAnMTU2ODYxMzUzLjE0MjMxMDk3MjUuMTI4MDI1OTAxNi4xMjgzODgzMzk1LjEyODQxNDc5OTUuMzInOwokbGFuZ1sndXRteiddID0gJzE1Njg2MTM1My4xMjg0MTQ3OTk1LjMyLjMwLnV0bWNzcj1kZXYuY21zbWFkZXNpbXBsZS5vcmd8dXRtY2NuPShyZWZlcnJhbCl8dXRtY21kPXJlZmVycmFsfHV0bWNjdD0vcHJvamVjdC9maWxlcy84NzMnOwokbGFuZ1sncWNhJ10gPSAnUDAtNzQ4NDM5MTMxLTEyODAyNTkwMTc1MjQnOwokbGFuZ1sndXRtYiddID0gJzE1Njg2MTM1My4yLjEwLjEyODQxNDc5OTUnOwokbGFuZ1sndXRtYyddID0gJzE1Njg2MTM1Myc7Cj8+]]></data>
	</file>
	<file>
	  <filename>/lib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/Bing/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/Bing/Search/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/class.facebook.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCmlmICghZnVuY3Rpb25fZXhpc3RzKCdjdXJsX2luaXQnKSkgewogIHRocm93IG5ldyBFeGNlcHRpb24oJ0ZhY2Vib29rIG5lZWRzIHRoZSBDVVJMIFBIUCBleHRlbnNpb24uJyk7Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2pzb25fZGVjb2RlJykpIHsKICB0aHJvdyBuZXcgRXhjZXB0aW9uKCdGYWNlYm9vayBuZWVkcyB0aGUgSlNPTiBQSFAgZXh0ZW5zaW9uLicpOwp9CgovKioKICogVGhyb3duIHdoZW4gYW4gQVBJIGNhbGwgcmV0dXJucyBhbiBleGNlcHRpb24uCiAqCiAqIEBhdXRob3IgTmFpdGlrIFNoYWggPG5haXRpa0BmYWNlYm9vay5jb20+CiAqLwpjbGFzcyBGYWNlYm9va0FwaUV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbgp7CiAgLyoqCiAgICogVGhlIHJlc3VsdCBmcm9tIHRoZSBBUEkgc2VydmVyIHRoYXQgcmVwcmVzZW50cyB0aGUgZXhjZXB0aW9uIGluZm9ybWF0aW9uLgogICAqLwogIHByb3RlY3RlZCAkcmVzdWx0OwoKICAvKioKICAgKiBNYWtlIGEgbmV3IEFQSSBFeGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gcmVzdWx0LgogICAqCiAgICogQHBhcmFtIEFycmF5ICRyZXN1bHQgdGhlIHJlc3VsdCBmcm9tIHRoZSBBUEkgc2VydmVyCiAgICovCiAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRyZXN1bHQpIHsKICAgICR0aGlzLT5yZXN1bHQgPSAkcmVzdWx0OwoKICAgICRjb2RlID0gaXNzZXQoJHJlc3VsdFsnZXJyb3JfY29kZSddKSA/ICRyZXN1bHRbJ2Vycm9yX2NvZGUnXSA6IDA7CiAgICAkbXNnICA9IGlzc2V0KCRyZXN1bHRbJ2Vycm9yJ10pCiAgICAgICAgICAgICAgPyAkcmVzdWx0WydlcnJvciddWydtZXNzYWdlJ10gOiAkcmVzdWx0WydlcnJvcl9tc2cnXTsKICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoJG1zZywgJGNvZGUpOwogIH0KCiAgLyoqCiAgICogUmV0dXJuIHRoZSBhc3NvY2lhdGVkIHJlc3VsdCBvYmplY3QgcmV0dXJuZWQgYnkgdGhlIEFQSSBzZXJ2ZXIuCiAgICoKICAgKiBAcmV0dXJucyBBcnJheSB0aGUgcmVzdWx0IGZyb20gdGhlIEFQSSBzZXJ2ZXIKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gZ2V0UmVzdWx0KCkgewogICAgcmV0dXJuICR0aGlzLT5yZXN1bHQ7CiAgfQoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBhc3NvY2lhdGVkIHR5cGUgZm9yIHRoZSBlcnJvci4gVGhpcyB3aWxsIGRlZmF1bHQgdG8KICAgKiAnRXhjZXB0aW9uJyB3aGVuIGEgdHlwZSBpcyBub3QgYXZhaWxhYmxlLgogICAqCiAgICogQHJldHVybiBTdHJpbmcKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gZ2V0VHlwZSgpIHsKICAgIHJldHVybgogICAgICBpc3NldCgkdGhpcy0+cmVzdWx0WydlcnJvciddKSAmJiBpc3NldCgkdGhpcy0+cmVzdWx0WydlcnJvciddWyd0eXBlJ10pCiAgICAgID8gJHRoaXMtPnJlc3VsdFsnZXJyb3InXVsndHlwZSddCiAgICAgIDogJ0V4Y2VwdGlvbic7CiAgfQoKICAvKioKICAgKiBUbyBtYWtlIGRlYnVnZ2luZyBlYXNpZXIuCiAgICoKICAgKiBAcmV0dXJucyBTdHJpbmcgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZXJyb3IKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gX190b1N0cmluZygpIHsKICAgICRzdHIgPSAkdGhpcy0+Z2V0VHlwZSgpIC4gJzogJzsKICAgIGlmICgkdGhpcy0+Y29kZSAhPSAwKSB7CiAgICAgICRzdHIgLj0gJHRoaXMtPmNvZGUgLiAnOiAnOwogICAgfQogICAgcmV0dXJuICRzdHIgLiAkdGhpcy0+bWVzc2FnZTsKICB9Cn0KCi8qKgogKiBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIEZhY2Vib29rIFBsYXRmb3JtLgogKgogKiBAYXV0aG9yIE5haXRpayBTaGFoIDxuYWl0aWtAZmFjZWJvb2suY29tPgogKi8KY2xhc3MgRmFjZWJvb2sKewogIC8qKgogICAqIFZlcnNpb24uCiAgICovCiAgY29uc3QgVkVSU0lPTiA9ICcyLjEuMSc7CgogIC8qKgogICAqIERlZmF1bHQgb3B0aW9ucyBmb3IgY3VybC4KICAgKi8KICBwdWJsaWMgc3RhdGljICRDVVJMX09QVFMgPSBhcnJheSgKICAgIENVUkxPUFRfQ09OTkVDVFRJTUVPVVQgPT4gMTAsCiAgICBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSID0+IHRydWUsCiAgICBDVVJMT1BUX1RJTUVPVVQgICAgICAgID0+IDYwLAogICAgQ1VSTE9QVF9VU0VSQUdFTlQgICAgICA9PiAnZmFjZWJvb2stcGhwLTIuMCcsCiAgKTsKCiAgLyoqCiAgICogTGlzdCBvZiBxdWVyeSBwYXJhbWV0ZXJzIHRoYXQgZ2V0IGF1dG9tYXRpY2FsbHkgZHJvcHBlZCB3aGVuIHJlYnVpbGRpbmcKICAgKiB0aGUgY3VycmVudCBVUkwuCiAgICovCiAgcHJvdGVjdGVkIHN0YXRpYyAkRFJPUF9RVUVSWV9QQVJBTVMgPSBhcnJheSgKICAgICdzZXNzaW9uJywKICAgICdzaWduZWRfcmVxdWVzdCcsCiAgKTsKCiAgLyoqCiAgICogTWFwcyBhbGlhc2VzIHRvIEZhY2Vib29rIGRvbWFpbnMuCiAgICovCiAgcHVibGljIHN0YXRpYyAkRE9NQUlOX01BUCA9IGFycmF5KAogICAgJ2FwaScgICAgICA9PiAnaHR0cHM6Ly9hcGkuZmFjZWJvb2suY29tLycsCiAgICAnYXBpX3JlYWQnID0+ICdodHRwczovL2FwaS1yZWFkLmZhY2Vib29rLmNvbS8nLAogICAgJ2dyYXBoJyAgICA9PiAnaHR0cHM6Ly9ncmFwaC5mYWNlYm9vay5jb20vJywKICAgICd3d3cnICAgICAgPT4gJ2h0dHBzOi8vd3d3LmZhY2Vib29rLmNvbS8nLAogICk7CgogIC8qKgogICAqIFRoZSBBcHBsaWNhdGlvbiBJRC4KICAgKi8KICBwcm90ZWN0ZWQgJGFwcElkOwoKICAvKioKICAgKiBUaGUgQXBwbGljYXRpb24gQVBJIFNlY3JldC4KICAgKi8KICBwcm90ZWN0ZWQgJGFwaVNlY3JldDsKCiAgLyoqCiAgICogVGhlIGFjdGl2ZSB1c2VyIHNlc3Npb24sIGlmIG9uZSBpcyBhdmFpbGFibGUuCiAgICovCiAgcHJvdGVjdGVkICRzZXNzaW9uOwoKICAvKioKICAgKiBUaGUgZGF0YSBmcm9tIHRoZSBzaWduZWRfcmVxdWVzdCB0b2tlbi4KICAgKi8KICBwcm90ZWN0ZWQgJHNpZ25lZFJlcXVlc3Q7CgogIC8qKgogICAqIEluZGljYXRlcyB0aGF0IHdlIGFscmVhZHkgbG9hZGVkIHRoZSBzZXNzaW9uIGFzIGJlc3QgYXMgd2UgY291bGQuCiAgICovCiAgcHJvdGVjdGVkICRzZXNzaW9uTG9hZGVkID0gZmFsc2U7CgogIC8qKgogICAqIEluZGljYXRlcyBpZiBDb29raWUgc3VwcG9ydCBzaG91bGQgYmUgZW5hYmxlZC4KICAgKi8KICBwcm90ZWN0ZWQgJGNvb2tpZVN1cHBvcnQgPSBmYWxzZTsKCiAgLyoqCiAgICogQmFzZSBkb21haW4gZm9yIHRoZSBDb29raWUuCiAgICovCiAgcHJvdGVjdGVkICRiYXNlRG9tYWluID0gJyc7CgogIC8qKgogICAqIEluZGljYXRlcyBpZiB0aGUgQ1VSTCBiYXNlZCBAIHN5bnRheCBmb3IgZmlsZSB1cGxvYWRzIGlzIGVuYWJsZWQuCiAgICovCiAgcHJvdGVjdGVkICRmaWxlVXBsb2FkU3VwcG9ydCA9IGZhbHNlOwoKICAvKioKICAgKiBJbml0aWFsaXplIGEgRmFjZWJvb2sgQXBwbGljYXRpb24uCiAgICoKICAgKiBUaGUgY29uZmlndXJhdGlvbjoKICAgKiAtIGFwcElkOiB0aGUgYXBwbGljYXRpb24gSUQKICAgKiAtIHNlY3JldDogdGhlIGFwcGxpY2F0aW9uIHNlY3JldAogICAqIC0gY29va2llOiAob3B0aW9uYWwpIGJvb2xlYW4gdHJ1ZSB0byBlbmFibGUgY29va2llIHN1cHBvcnQKICAgKiAtIGRvbWFpbjogKG9wdGlvbmFsKSBkb21haW4gZm9yIHRoZSBjb29raWUKICAgKiAtIGZpbGVVcGxvYWQ6IChvcHRpb25hbCkgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIGZpbGUgdXBsb2FkcyBhcmUgZW5hYmxlZAogICAqCiAgICogQHBhcmFtIEFycmF5ICRjb25maWcgdGhlIGFwcGxpY2F0aW9uIGNvbmZpZ3VyYXRpb24KICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGNvbmZpZykgewogICAgJHRoaXMtPnNldEFwcElkKCRjb25maWdbJ2FwcElkJ10pOwogICAgJHRoaXMtPnNldEFwaVNlY3JldCgkY29uZmlnWydzZWNyZXQnXSk7CiAgICBpZiAoaXNzZXQoJGNvbmZpZ1snY29va2llJ10pKSB7CiAgICAgICR0aGlzLT5zZXRDb29raWVTdXBwb3J0KCRjb25maWdbJ2Nvb2tpZSddKTsKICAgIH0KICAgIGlmIChpc3NldCgkY29uZmlnWydkb21haW4nXSkpIHsKICAgICAgJHRoaXMtPnNldEJhc2VEb21haW4oJGNvbmZpZ1snZG9tYWluJ10pOwogICAgfQogICAgaWYgKGlzc2V0KCRjb25maWdbJ2ZpbGVVcGxvYWQnXSkpIHsKICAgICAgJHRoaXMtPnNldEZpbGVVcGxvYWRTdXBwb3J0KCRjb25maWdbJ2ZpbGVVcGxvYWQnXSk7CiAgICB9CiAgfQoKICAvKioKICAgKiBTZXQgdGhlIEFwcGxpY2F0aW9uIElELgogICAqCiAgICogQHBhcmFtIFN0cmluZyAkYXBwSWQgdGhlIEFwcGxpY2F0aW9uIElECiAgICovCiAgcHVibGljIGZ1bmN0aW9uIHNldEFwcElkKCRhcHBJZCkgewogICAgJHRoaXMtPmFwcElkID0gJGFwcElkOwogICAgcmV0dXJuICR0aGlzOwogIH0KCiAgLyoqCiAgICogR2V0IHRoZSBBcHBsaWNhdGlvbiBJRC4KICAgKgogICAqIEByZXR1cm4gU3RyaW5nIHRoZSBBcHBsaWNhdGlvbiBJRAogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBnZXRBcHBJZCgpIHsKICAgIHJldHVybiAkdGhpcy0+YXBwSWQ7CiAgfQoKICAvKioKICAgKiBTZXQgdGhlIEFQSSBTZWNyZXQuCiAgICoKICAgKiBAcGFyYW0gU3RyaW5nICRhcHBJZCB0aGUgQVBJIFNlY3JldAogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBzZXRBcGlTZWNyZXQoJGFwaVNlY3JldCkgewogICAgJHRoaXMtPmFwaVNlY3JldCA9ICRhcGlTZWNyZXQ7CiAgICByZXR1cm4gJHRoaXM7CiAgfQoKICAvKioKICAgKiBHZXQgdGhlIEFQSSBTZWNyZXQuCiAgICoKICAgKiBAcmV0dXJuIFN0cmluZyB0aGUgQVBJIFNlY3JldAogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBnZXRBcGlTZWNyZXQoKSB7CiAgICByZXR1cm4gJHRoaXMtPmFwaVNlY3JldDsKICB9CgogIC8qKgogICAqIFNldCB0aGUgQ29va2llIFN1cHBvcnQgc3RhdHVzLgogICAqCiAgICogQHBhcmFtIEJvb2xlYW4gJGNvb2tpZVN1cHBvcnQgdGhlIENvb2tpZSBTdXBwb3J0IHN0YXR1cwogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBzZXRDb29raWVTdXBwb3J0KCRjb29raWVTdXBwb3J0KSB7CiAgICAkdGhpcy0+Y29va2llU3VwcG9ydCA9ICRjb29raWVTdXBwb3J0OwogICAgcmV0dXJuICR0aGlzOwogIH0KCiAgLyoqCiAgICogR2V0IHRoZSBDb29raWUgU3VwcG9ydCBzdGF0dXMuCiAgICoKICAgKiBAcmV0dXJuIEJvb2xlYW4gdGhlIENvb2tpZSBTdXBwb3J0IHN0YXR1cwogICAqLwogIHB1YmxpYyBmdW5jdGlvbiB1c2VDb29raWVTdXBwb3J0KCkgewogICAgcmV0dXJuICR0aGlzLT5jb29raWVTdXBwb3J0OwogIH0KCiAgLyoqCiAgICogU2V0IHRoZSBiYXNlIGRvbWFpbiBmb3IgdGhlIENvb2tpZS4KICAgKgogICAqIEBwYXJhbSBTdHJpbmcgJGRvbWFpbiB0aGUgYmFzZSBkb21haW4KICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gc2V0QmFzZURvbWFpbigkZG9tYWluKSB7CiAgICAkdGhpcy0+YmFzZURvbWFpbiA9ICRkb21haW47CiAgICByZXR1cm4gJHRoaXM7CiAgfQoKICAvKioKICAgKiBHZXQgdGhlIGJhc2UgZG9tYWluIGZvciB0aGUgQ29va2llLgogICAqCiAgICogQHJldHVybiBTdHJpbmcgdGhlIGJhc2UgZG9tYWluCiAgICovCiAgcHVibGljIGZ1bmN0aW9uIGdldEJhc2VEb21haW4oKSB7CiAgICByZXR1cm4gJHRoaXMtPmJhc2VEb21haW47CiAgfQoKICAvKioKICAgKiBTZXQgdGhlIGZpbGUgdXBsb2FkIHN1cHBvcnQgc3RhdHVzLgogICAqCiAgICogQHBhcmFtIFN0cmluZyAkZG9tYWluIHRoZSBiYXNlIGRvbWFpbgogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBzZXRGaWxlVXBsb2FkU3VwcG9ydCgkZmlsZVVwbG9hZFN1cHBvcnQpIHsKICAgICR0aGlzLT5maWxlVXBsb2FkU3VwcG9ydCA9ICRmaWxlVXBsb2FkU3VwcG9ydDsKICAgIHJldHVybiAkdGhpczsKICB9CgogIC8qKgogICAqIEdldCB0aGUgZmlsZSB1cGxvYWQgc3VwcG9ydCBzdGF0dXMuCiAgICoKICAgKiBAcmV0dXJuIFN0cmluZyB0aGUgYmFzZSBkb21haW4KICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gdXNlRmlsZVVwbG9hZFN1cHBvcnQoKSB7CiAgICByZXR1cm4gJHRoaXMtPmZpbGVVcGxvYWRTdXBwb3J0OwogIH0KCiAgLyoqCiAgICogR2V0IHRoZSBkYXRhIGZyb20gYSBzaWduZWRfcmVxdWVzdCB0b2tlbgogICAqCiAgICogQHJldHVybiBTdHJpbmcgdGhlIGJhc2UgZG9tYWluCiAgICovCiAgcHVibGljIGZ1bmN0aW9uIGdldFNpZ25lZFJlcXVlc3QoKSB7CiAgICBpZiAoISR0aGlzLT5zaWduZWRSZXF1ZXN0KSB7CiAgICAgIGlmIChpc3NldCgkX1JFUVVFU1RbJ3NpZ25lZF9yZXF1ZXN0J10pKSB7CiAgICAgICAgJHRoaXMtPnNpZ25lZFJlcXVlc3QgPSAkdGhpcy0+cGFyc2VTaWduZWRSZXF1ZXN0KAogICAgICAgICAgJF9SRVFVRVNUWydzaWduZWRfcmVxdWVzdCddKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuICR0aGlzLT5zaWduZWRSZXF1ZXN0OwogIH0KCiAgLyoqCiAgICogU2V0IHRoZSBTZXNzaW9uLgogICAqCiAgICogQHBhcmFtIEFycmF5ICRzZXNzaW9uIHRoZSBzZXNzaW9uCiAgICogQHBhcmFtIEJvb2xlYW4gJHdyaXRlX2Nvb2tpZSBpbmRpY2F0ZSBpZiBhIGNvb2tpZSBzaG91bGQgYmUgd3JpdHRlbi4gdGhpcwogICAqIHZhbHVlIGlzIGlnbm9yZWQgaWYgY29va2llIHN1cHBvcnQgaGFzIGJlZW4gZGlzYWJsZWQuCiAgICovCiAgcHVibGljIGZ1bmN0aW9uIHNldFNlc3Npb24oJHNlc3Npb249bnVsbCwgJHdyaXRlX2Nvb2tpZT10cnVlKSB7CiAgICAkc2Vzc2lvbiA9ICR0aGlzLT52YWxpZGF0ZVNlc3Npb25PYmplY3QoJHNlc3Npb24pOwogICAgJHRoaXMtPnNlc3Npb25Mb2FkZWQgPSB0cnVlOwogICAgJHRoaXMtPnNlc3Npb24gPSAkc2Vzc2lvbjsKICAgIGlmICgkd3JpdGVfY29va2llKSB7CiAgICAgICR0aGlzLT5zZXRDb29raWVGcm9tU2Vzc2lvbigkc2Vzc2lvbik7CiAgICB9CiAgICByZXR1cm4gJHRoaXM7CiAgfQoKICAvKioKICAgKiBHZXQgdGhlIHNlc3Npb24gb2JqZWN0LiBUaGlzIHdpbGwgYXV0b21hdGljYWxseSBsb29rIGZvciBhIHNpZ25lZCBzZXNzaW9uCiAgICogc2VudCB2aWEgdGhlIHNpZ25lZF9yZXF1ZXN0LCBDb29raWUgb3IgUXVlcnkgUGFyYW1ldGVycyBpZiBuZWVkZWQuCiAgICoKICAgKiBAcmV0dXJuIEFycmF5IHRoZSBzZXNzaW9uCiAgICovCiAgcHVibGljIGZ1bmN0aW9uIGdldFNlc3Npb24oKSB7CiAgICBpZiAoISR0aGlzLT5zZXNzaW9uTG9hZGVkKSB7CiAgICAgICRzZXNzaW9uID0gbnVsbDsKICAgICAgJHdyaXRlX2Nvb2tpZSA9IHRydWU7CgogICAgICAvLyB0cnkgbG9hZGluZyBzZXNzaW9uIGZyb20gc2lnbmVkX3JlcXVlc3QgaW4gJF9SRVFVRVNUCiAgICAgICRzaWduZWRSZXF1ZXN0ID0gJHRoaXMtPmdldFNpZ25lZFJlcXVlc3QoKTsKICAgICAgaWYgKCRzaWduZWRSZXF1ZXN0KSB7CiAgICAgICAgLy8gc2lnIGlzIGdvb2QsIHVzZSB0aGUgc2lnbmVkUmVxdWVzdAogICAgICAgICRzZXNzaW9uID0gJHRoaXMtPmNyZWF0ZVNlc3Npb25Gcm9tU2lnbmVkUmVxdWVzdCgkc2lnbmVkUmVxdWVzdCk7CiAgICAgIH0KCiAgICAgIC8vIHRyeSBsb2FkaW5nIHNlc3Npb24gZnJvbSAkX1JFUVVFU1QKICAgICAgaWYgKCEkc2Vzc2lvbiAmJiBpc3NldCgkX1JFUVVFU1RbJ3Nlc3Npb24nXSkpIHsKICAgICAgICAkc2Vzc2lvbiA9IGpzb25fZGVjb2RlKAogICAgICAgICAgZ2V0X21hZ2ljX3F1b3Rlc19ncGMoKQogICAgICAgICAgICA/IHN0cmlwc2xhc2hlcygkX1JFUVVFU1RbJ3Nlc3Npb24nXSkKICAgICAgICAgICAgOiAkX1JFUVVFU1RbJ3Nlc3Npb24nXSwKICAgICAgICAgIHRydWUKICAgICAgICApOwogICAgICAgICRzZXNzaW9uID0gJHRoaXMtPnZhbGlkYXRlU2Vzc2lvbk9iamVjdCgkc2Vzc2lvbik7CiAgICAgIH0KCiAgICAgIC8vIHRyeSBsb2FkaW5nIHNlc3Npb24gZnJvbSBjb29raWUgaWYgbmVjZXNzYXJ5CiAgICAgIGlmICghJHNlc3Npb24gJiYgJHRoaXMtPnVzZUNvb2tpZVN1cHBvcnQoKSkgewogICAgICAgICRjb29raWVOYW1lID0gJHRoaXMtPmdldFNlc3Npb25Db29raWVOYW1lKCk7CiAgICAgICAgaWYgKGlzc2V0KCRfQ09PS0lFWyRjb29raWVOYW1lXSkpIHsKICAgICAgICAgICRzZXNzaW9uID0gYXJyYXkoKTsKICAgICAgICAgIHBhcnNlX3N0cih0cmltKAogICAgICAgICAgICBnZXRfbWFnaWNfcXVvdGVzX2dwYygpCiAgICAgICAgICAgICAgPyBzdHJpcHNsYXNoZXMoJF9DT09LSUVbJGNvb2tpZU5hbWVdKQogICAgICAgICAgICAgIDogJF9DT09LSUVbJGNvb2tpZU5hbWVdLAogICAgICAgICAgICAnIicKICAgICAgICAgICksICRzZXNzaW9uKTsKICAgICAgICAgICRzZXNzaW9uID0gJHRoaXMtPnZhbGlkYXRlU2Vzc2lvbk9iamVjdCgkc2Vzc2lvbik7CiAgICAgICAgICAvLyB3cml0ZSBvbmx5IGlmIHdlIG5lZWQgdG8gZGVsZXRlIGEgaW52YWxpZCBzZXNzaW9uIGNvb2tpZQogICAgICAgICAgJHdyaXRlX2Nvb2tpZSA9IGVtcHR5KCRzZXNzaW9uKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgICR0aGlzLT5zZXRTZXNzaW9uKCRzZXNzaW9uLCAkd3JpdGVfY29va2llKTsKICAgIH0KCiAgICByZXR1cm4gJHRoaXMtPnNlc3Npb247CiAgfQoKICAvKioKICAgKiBHZXQgdGhlIFVJRCBmcm9tIHRoZSBzZXNzaW9uLgogICAqCiAgICogQHJldHVybiBTdHJpbmcgdGhlIFVJRCBpZiBhdmFpbGFibGUKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gZ2V0VXNlcigpIHsKICAgICRzZXNzaW9uID0gJHRoaXMtPmdldFNlc3Npb24oKTsKICAgIHJldHVybiAkc2Vzc2lvbiA/ICRzZXNzaW9uWyd1aWQnXSA6IG51bGw7CiAgfQoKICAvKioKICAgKiBHZXRzIGEgT0F1dGggYWNjZXNzIHRva2VuLgogICAqCiAgICogQHJldHVybiBTdHJpbmcgdGhlIGFjY2VzcyB0b2tlbgogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBnZXRBY2Nlc3NUb2tlbigpIHsKICAgICRzZXNzaW9uID0gJHRoaXMtPmdldFNlc3Npb24oKTsKICAgIC8vIGVpdGhlciB1c2VyIHNlc3Npb24gc2lnbmVkLCBvciBhcHAgc2lnbmVkCiAgICBpZiAoJHNlc3Npb24pIHsKICAgICAgcmV0dXJuICRzZXNzaW9uWydhY2Nlc3NfdG9rZW4nXTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+Z2V0QXBwSWQoKSAuJ3wnLiAkdGhpcy0+Z2V0QXBpU2VjcmV0KCk7CiAgICB9CiAgfQoKICAvKioKICAgKiBHZXQgYSBMb2dpbiBVUkwgZm9yIHVzZSB3aXRoIHJlZGlyZWN0cy4gQnkgZGVmYXVsdCwgZnVsbCBwYWdlIHJlZGlyZWN0IGlzCiAgICogYXNzdW1lZC4gSWYgeW91IGFyZSB1c2luZyB0aGUgZ2VuZXJhdGVkIFVSTCB3aXRoIGEgd2luZG93Lm9wZW4oKSBjYWxsIGluCiAgICogSmF2YVNjcmlwdCwgeW91IGNhbiBwYXNzIGluIGRpc3BsYXk9cG9wdXAgYXMgcGFydCBvZiB0aGUgJHBhcmFtcy4KICAgKgogICAqIFRoZSBwYXJhbWV0ZXJzOgogICAqIC0gbmV4dDogdGhlIHVybCB0byBnbyB0byBhZnRlciBhIHN1Y2Nlc3NmdWwgbG9naW4KICAgKiAtIGNhbmNlbF91cmw6IHRoZSB1cmwgdG8gZ28gdG8gYWZ0ZXIgdGhlIHVzZXIgY2FuY2VscwogICAqIC0gcmVxX3Blcm1zOiBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiByZXF1ZXN0ZWQgZXh0ZW5kZWQgcGVybXMKICAgKiAtIGRpc3BsYXk6IGNhbiBiZSAicGFnZSIgKGRlZmF1bHQsIGZ1bGwgcGFnZSkgb3IgInBvcHVwIgogICAqCiAgICogQHBhcmFtIEFycmF5ICRwYXJhbXMgcHJvdmlkZSBjdXN0b20gcGFyYW1ldGVycwogICAqIEByZXR1cm4gU3RyaW5nIHRoZSBVUkwgZm9yIHRoZSBsb2dpbiBmbG93CiAgICovCiAgcHVibGljIGZ1bmN0aW9uIGdldExvZ2luVXJsKCRwYXJhbXM9YXJyYXkoKSkgewogICAgJGN1cnJlbnRVcmwgPSAkdGhpcy0+Z2V0Q3VycmVudFVybCgpOwogICAgcmV0dXJuICR0aGlzLT5nZXRVcmwoCiAgICAgICd3d3cnLAogICAgICAnbG9naW4ucGhwJywKICAgICAgYXJyYXlfbWVyZ2UoYXJyYXkoCiAgICAgICAgJ2FwaV9rZXknICAgICAgICAgPT4gJHRoaXMtPmdldEFwcElkKCksCiAgICAgICAgJ2NhbmNlbF91cmwnICAgICAgPT4gJGN1cnJlbnRVcmwsCiAgICAgICAgJ2Rpc3BsYXknICAgICAgICAgPT4gJ3BhZ2UnLAogICAgICAgICdmYmNvbm5lY3QnICAgICAgID0+IDEsCiAgICAgICAgJ25leHQnICAgICAgICAgICAgPT4gJGN1cnJlbnRVcmwsCiAgICAgICAgJ3JldHVybl9zZXNzaW9uJyAgPT4gMSwKICAgICAgICAnc2Vzc2lvbl92ZXJzaW9uJyA9PiAzLAogICAgICAgICd2JyAgICAgICAgICAgICAgID0+ICcxLjAnLAogICAgICApLCAkcGFyYW1zKQogICAgKTsKICB9CgogIC8qKgogICAqIEdldCBhIExvZ291dCBVUkwgc3VpdGFibGUgZm9yIHVzZSB3aXRoIHJlZGlyZWN0cy4KICAgKgogICAqIFRoZSBwYXJhbWV0ZXJzOgogICAqIC0gbmV4dDogdGhlIHVybCB0byBnbyB0byBhZnRlciBhIHN1Y2Nlc3NmdWwgbG9nb3V0CiAgICoKICAgKiBAcGFyYW0gQXJyYXkgJHBhcmFtcyBwcm92aWRlIGN1c3RvbSBwYXJhbWV0ZXJzCiAgICogQHJldHVybiBTdHJpbmcgdGhlIFVSTCBmb3IgdGhlIGxvZ291dCBmbG93CiAgICovCiAgcHVibGljIGZ1bmN0aW9uIGdldExvZ291dFVybCgkcGFyYW1zPWFycmF5KCkpIHsKICAgIHJldHVybiAkdGhpcy0+Z2V0VXJsKAogICAgICAnd3d3JywKICAgICAgJ2xvZ291dC5waHAnLAogICAgICBhcnJheV9tZXJnZShhcnJheSgKICAgICAgICAnbmV4dCcgICAgICAgICA9PiAkdGhpcy0+Z2V0Q3VycmVudFVybCgpLAogICAgICAgICdhY2Nlc3NfdG9rZW4nID0+ICR0aGlzLT5nZXRBY2Nlc3NUb2tlbigpLAogICAgICApLCAkcGFyYW1zKQogICAgKTsKICB9CgogIC8qKgogICAqIEdldCBhIGxvZ2luIHN0YXR1cyBVUkwgdG8gZmV0Y2ggdGhlIHN0YXR1cyBmcm9tIGZhY2Vib29rLgogICAqCiAgICogVGhlIHBhcmFtZXRlcnM6CiAgICogLSBva19zZXNzaW9uOiB0aGUgVVJMIHRvIGdvIHRvIGlmIGEgc2Vzc2lvbiBpcyBmb3VuZAogICAqIC0gbm9fc2Vzc2lvbjogdGhlIFVSTCB0byBnbyB0byBpZiB0aGUgdXNlciBpcyBub3QgY29ubmVjdGVkCiAgICogLSBub191c2VyOiB0aGUgVVJMIHRvIGdvIHRvIGlmIHRoZSB1c2VyIGlzIG5vdCBzaWduZWQgaW50byBmYWNlYm9vawogICAqCiAgICogQHBhcmFtIEFycmF5ICRwYXJhbXMgcHJvdmlkZSBjdXN0b20gcGFyYW1ldGVycwogICAqIEByZXR1cm4gU3RyaW5nIHRoZSBVUkwgZm9yIHRoZSBsb2dvdXQgZmxvdwogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBnZXRMb2dpblN0YXR1c1VybCgkcGFyYW1zPWFycmF5KCkpIHsKICAgIHJldHVybiAkdGhpcy0+Z2V0VXJsKAogICAgICAnd3d3JywKICAgICAgJ2V4dGVybi9sb2dpbl9zdGF0dXMucGhwJywKICAgICAgYXJyYXlfbWVyZ2UoYXJyYXkoCiAgICAgICAgJ2FwaV9rZXknICAgICAgICAgPT4gJHRoaXMtPmdldEFwcElkKCksCiAgICAgICAgJ25vX3Nlc3Npb24nICAgICAgPT4gJHRoaXMtPmdldEN1cnJlbnRVcmwoKSwKICAgICAgICAnbm9fdXNlcicgICAgICAgICA9PiAkdGhpcy0+Z2V0Q3VycmVudFVybCgpLAogICAgICAgICdva19zZXNzaW9uJyAgICAgID0+ICR0aGlzLT5nZXRDdXJyZW50VXJsKCksCiAgICAgICAgJ3Nlc3Npb25fdmVyc2lvbicgPT4gMywKICAgICAgKSwgJHBhcmFtcykKICAgICk7CiAgfQoKICAvKioKICAgKiBNYWtlIGFuIEFQSSBjYWxsLgogICAqCiAgICogQHBhcmFtIEFycmF5ICRwYXJhbXMgdGhlIEFQSSBjYWxsIHBhcmFtZXRlcnMKICAgKiBAcmV0dXJuIHRoZSBkZWNvZGVkIHJlc3BvbnNlCiAgICovCiAgcHVibGljIGZ1bmN0aW9uIGFwaSgvKiBwb2x5bW9ycGhpYyAqLykgewogICAgJGFyZ3MgPSBmdW5jX2dldF9hcmdzKCk7CiAgICBpZiAoaXNfYXJyYXkoJGFyZ3NbMF0pKSB7CiAgICAgIHJldHVybiAkdGhpcy0+X3Jlc3RzZXJ2ZXIoJGFyZ3NbMF0pOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIGNhbGxfdXNlcl9mdW5jX2FycmF5KGFycmF5KCR0aGlzLCAnX2dyYXBoJyksICRhcmdzKTsKICAgIH0KICB9CgogIC8qKgogICAqIEludm9rZSB0aGUgb2xkIHJlc3RzZXJ2ZXIucGhwIGVuZHBvaW50LgogICAqCiAgICogQHBhcmFtIEFycmF5ICRwYXJhbXMgbWV0aG9kIGNhbGwgb2JqZWN0CiAgICogQHJldHVybiB0aGUgZGVjb2RlZCByZXNwb25zZSBvYmplY3QKICAgKiBAdGhyb3dzIEZhY2Vib29rQXBpRXhjZXB0aW9uCiAgICovCiAgcHJvdGVjdGVkIGZ1bmN0aW9uIF9yZXN0c2VydmVyKCRwYXJhbXMpIHsKICAgIC8vIGdlbmVyaWMgYXBwbGljYXRpb24gbGV2ZWwgcGFyYW1ldGVycwogICAgJHBhcmFtc1snYXBpX2tleSddID0gJHRoaXMtPmdldEFwcElkKCk7CiAgICAkcGFyYW1zWydmb3JtYXQnXSA9ICdqc29uLXN0cmluZ3MnOwoKICAgICRyZXN1bHQgPSBqc29uX2RlY29kZSgkdGhpcy0+X29hdXRoUmVxdWVzdCgKICAgICAgJHRoaXMtPmdldEFwaVVybCgkcGFyYW1zWydtZXRob2QnXSksCiAgICAgICRwYXJhbXMKICAgICksIHRydWUpOwoKICAgIC8vIHJlc3VsdHMgYXJlIHJldHVybmVkLCBlcnJvcnMgYXJlIHRocm93bgogICAgaWYgKGlzX2FycmF5KCRyZXN1bHQpICYmIGlzc2V0KCRyZXN1bHRbJ2Vycm9yX2NvZGUnXSkpIHsKICAgICAgdGhyb3cgbmV3IEZhY2Vib29rQXBpRXhjZXB0aW9uKCRyZXN1bHQpOwogICAgfQogICAgcmV0dXJuICRyZXN1bHQ7CiAgfQoKICAvKioKICAgKiBJbnZva2UgdGhlIEdyYXBoIEFQSS4KICAgKgogICAqIEBwYXJhbSBTdHJpbmcgJHBhdGggdGhlIHBhdGggKHJlcXVpcmVkKQogICAqIEBwYXJhbSBTdHJpbmcgJG1ldGhvZCB0aGUgaHR0cCBtZXRob2QgKGRlZmF1bHQgJ0dFVCcpCiAgICogQHBhcmFtIEFycmF5ICRwYXJhbXMgdGhlIHF1ZXJ5L3Bvc3QgZGF0YQogICAqIEByZXR1cm4gdGhlIGRlY29kZWQgcmVzcG9uc2Ugb2JqZWN0CiAgICogQHRocm93cyBGYWNlYm9va0FwaUV4Y2VwdGlvbgogICAqLwogIHByb3RlY3RlZCBmdW5jdGlvbiBfZ3JhcGgoJHBhdGgsICRtZXRob2Q9J0dFVCcsICRwYXJhbXM9YXJyYXkoKSkgewogICAgaWYgKGlzX2FycmF5KCRtZXRob2QpICYmIGVtcHR5KCRwYXJhbXMpKSB7CiAgICAgICRwYXJhbXMgPSAkbWV0aG9kOwogICAgICAkbWV0aG9kID0gJ0dFVCc7CiAgICB9CiAgICAkcGFyYW1zWydtZXRob2QnXSA9ICRtZXRob2Q7IC8vIG1ldGhvZCBvdmVycmlkZSBhcyB3ZSBhbHdheXMgZG8gYSBQT1NUCgogICAgJHJlc3VsdCA9IGpzb25fZGVjb2RlKCR0aGlzLT5fb2F1dGhSZXF1ZXN0KAogICAgICAkdGhpcy0+Z2V0VXJsKCdncmFwaCcsICRwYXRoKSwKICAgICAgJHBhcmFtcwogICAgKSwgdHJ1ZSk7CgogICAgLy8gcmVzdWx0cyBhcmUgcmV0dXJuZWQsIGVycm9ycyBhcmUgdGhyb3duCiAgICBpZiAoaXNfYXJyYXkoJHJlc3VsdCkgJiYgaXNzZXQoJHJlc3VsdFsnZXJyb3InXSkpIHsKICAgICAgJGUgPSBuZXcgRmFjZWJvb2tBcGlFeGNlcHRpb24oJHJlc3VsdCk7CiAgICAgIGlmICgkZS0+Z2V0VHlwZSgpID09PSAnT0F1dGhFeGNlcHRpb24nKSB7CiAgICAgICAgJHRoaXMtPnNldFNlc3Npb24obnVsbCk7CiAgICAgIH0KICAgICAgdGhyb3cgJGU7CiAgICB9CiAgICByZXR1cm4gJHJlc3VsdDsKICB9CgogIC8qKgogICAqIE1ha2UgYSBPQXV0aCBSZXF1ZXN0CiAgICoKICAgKiBAcGFyYW0gU3RyaW5nICRwYXRoIHRoZSBwYXRoIChyZXF1aXJlZCkKICAgKiBAcGFyYW0gQXJyYXkgJHBhcmFtcyB0aGUgcXVlcnkvcG9zdCBkYXRhCiAgICogQHJldHVybiB0aGUgZGVjb2RlZCByZXNwb25zZSBvYmplY3QKICAgKiBAdGhyb3dzIEZhY2Vib29rQXBpRXhjZXB0aW9uCiAgICovCiAgcHJvdGVjdGVkIGZ1bmN0aW9uIF9vYXV0aFJlcXVlc3QoJHVybCwgJHBhcmFtcykgewogICAgaWYgKCFpc3NldCgkcGFyYW1zWydhY2Nlc3NfdG9rZW4nXSkpIHsKICAgICAgJHBhcmFtc1snYWNjZXNzX3Rva2VuJ10gPSAkdGhpcy0+Z2V0QWNjZXNzVG9rZW4oKTsKICAgIH0KCiAgICAvLyBqc29uX2VuY29kZSBhbGwgcGFyYW1zIHZhbHVlcyB0aGF0IGFyZSBub3Qgc3RyaW5ncwogICAgZm9yZWFjaCAoJHBhcmFtcyBhcyAka2V5ID0+ICR2YWx1ZSkgewogICAgICBpZiAoIWlzX3N0cmluZygkdmFsdWUpKSB7CiAgICAgICAgJHBhcmFtc1ska2V5XSA9IGpzb25fZW5jb2RlKCR2YWx1ZSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiAkdGhpcy0+bWFrZVJlcXVlc3QoJHVybCwgJHBhcmFtcyk7CiAgfQoKICAvKioKICAgKiBNYWtlcyBhbiBIVFRQIHJlcXVlc3QuIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZW4gYnkgc3ViY2xhc3NlcyBpZgogICAqIGRldmVsb3BlcnMgd2FudCB0byBkbyBmYW5jaWVyIHRoaW5ncyBvciB1c2Ugc29tZXRoaW5nIG90aGVyIHRoYW4gY3VybCB0bwogICAqIG1ha2UgdGhlIHJlcXVlc3QuCiAgICoKICAgKiBAcGFyYW0gU3RyaW5nICR1cmwgdGhlIFVSTCB0byBtYWtlIHRoZSByZXF1ZXN0IHRvCiAgICogQHBhcmFtIEFycmF5ICRwYXJhbXMgdGhlIHBhcmFtZXRlcnMgdG8gdXNlIGZvciB0aGUgUE9TVCBib2R5CiAgICogQHBhcmFtIEN1cmxIYW5kbGVyICRjaCBvcHRpb25hbCBpbml0aWFsaXplZCBjdXJsIGhhbmRsZQogICAqIEByZXR1cm4gU3RyaW5nIHRoZSByZXNwb25zZSB0ZXh0CiAgICovCiAgcHJvdGVjdGVkIGZ1bmN0aW9uIG1ha2VSZXF1ZXN0KCR1cmwsICRwYXJhbXMsICRjaD1udWxsKSB7CiAgICBpZiAoISRjaCkgewogICAgICAkY2ggPSBjdXJsX2luaXQoKTsKICAgIH0KCiAgICAkb3B0cyA9IHNlbGY6OiRDVVJMX09QVFM7CiAgICBpZiAoJHRoaXMtPnVzZUZpbGVVcGxvYWRTdXBwb3J0KCkpIHsKICAgICAgJG9wdHNbQ1VSTE9QVF9QT1NURklFTERTXSA9ICRwYXJhbXM7CiAgICB9IGVsc2UgewogICAgICAkb3B0c1tDVVJMT1BUX1BPU1RGSUVMRFNdID0gaHR0cF9idWlsZF9xdWVyeSgkcGFyYW1zLCBudWxsLCAnJicpOwogICAgfQogICAgJG9wdHNbQ1VSTE9QVF9VUkxdID0gJHVybDsKCiAgICAvLyBkaXNhYmxlIHRoZSAnRXhwZWN0OiAxMDAtY29udGludWUnIGJlaGF2aW91ci4gVGhpcyBjYXVzZXMgQ1VSTCB0byB3YWl0CiAgICAvLyBmb3IgMiBzZWNvbmRzIGlmIHRoZSBzZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGhlYWRlci4KICAgIGlmIChpc3NldCgkb3B0c1tDVVJMT1BUX0hUVFBIRUFERVJdKSkgewogICAgICAkZXhpc3RpbmdfaGVhZGVycyA9ICRvcHRzW0NVUkxPUFRfSFRUUEhFQURFUl07CiAgICAgICRleGlzdGluZ19oZWFkZXJzW10gPSAnRXhwZWN0Oic7CiAgICAgICRvcHRzW0NVUkxPUFRfSFRUUEhFQURFUl0gPSAkZXhpc3RpbmdfaGVhZGVyczsKICAgIH0gZWxzZSB7CiAgICAgICRvcHRzW0NVUkxPUFRfSFRUUEhFQURFUl0gPSBhcnJheSgnRXhwZWN0OicpOwogICAgfQoKICAgIGN1cmxfc2V0b3B0X2FycmF5KCRjaCwgJG9wdHMpOwogICAgJHJlc3VsdCA9IGN1cmxfZXhlYygkY2gpOwogICAgaWYgKCRyZXN1bHQgPT09IGZhbHNlKSB7CiAgICAgICRlID0gbmV3IEZhY2Vib29rQXBpRXhjZXB0aW9uKGFycmF5KAogICAgICAgICdlcnJvcl9jb2RlJyA9PiBjdXJsX2Vycm5vKCRjaCksCiAgICAgICAgJ2Vycm9yJyAgICAgID0+IGFycmF5KAogICAgICAgICAgJ21lc3NhZ2UnID0+IGN1cmxfZXJyb3IoJGNoKSwKICAgICAgICAgICd0eXBlJyAgICA9PiAnQ3VybEV4Y2VwdGlvbicsCiAgICAgICAgKSwKICAgICAgKSk7CiAgICAgIGN1cmxfY2xvc2UoJGNoKTsKICAgICAgdGhyb3cgJGU7CiAgICB9CiAgICBjdXJsX2Nsb3NlKCRjaCk7CiAgICByZXR1cm4gJHJlc3VsdDsKICB9CgogIC8qKgogICAqIFRoZSBuYW1lIG9mIHRoZSBDb29raWUgdGhhdCBjb250YWlucyB0aGUgc2Vzc2lvbi4KICAgKgogICAqIEByZXR1cm4gU3RyaW5nIHRoZSBjb29raWUgbmFtZQogICAqLwogIHByb3RlY3RlZCBmdW5jdGlvbiBnZXRTZXNzaW9uQ29va2llTmFtZSgpIHsKICAgIHJldHVybiAnZmJzXycgLiAkdGhpcy0+Z2V0QXBwSWQoKTsKICB9CgogIC8qKgogICAqIFNldCBhIEpTIENvb2tpZSBiYXNlZCBvbiB0aGUgX3Bhc3NlZCBpbl8gc2Vzc2lvbi4gSXQgZG9lcyBub3QgdXNlIHRoZQogICAqIGN1cnJlbnRseSBzdG9yZWQgc2Vzc2lvbiAtLSB5b3UgbmVlZCB0byBleHBsaWNpdGx5IHBhc3MgaXQgaW4uCiAgICoKICAgKiBAcGFyYW0gQXJyYXkgJHNlc3Npb24gdGhlIHNlc3Npb24gdG8gdXNlIGZvciBzZXR0aW5nIHRoZSBjb29raWUKICAgKi8KICBwcm90ZWN0ZWQgZnVuY3Rpb24gc2V0Q29va2llRnJvbVNlc3Npb24oJHNlc3Npb249bnVsbCkgewogICAgaWYgKCEkdGhpcy0+dXNlQ29va2llU3VwcG9ydCgpKSB7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICAkY29va2llTmFtZSA9ICR0aGlzLT5nZXRTZXNzaW9uQ29va2llTmFtZSgpOwogICAgJHZhbHVlID0gJ2RlbGV0ZWQnOwogICAgJGV4cGlyZXMgPSB0aW1lKCkgLSAzNjAwOwogICAgJGRvbWFpbiA9ICR0aGlzLT5nZXRCYXNlRG9tYWluKCk7CiAgICBpZiAoJHNlc3Npb24pIHsKICAgICAgJHZhbHVlID0gJyInIC4gaHR0cF9idWlsZF9xdWVyeSgkc2Vzc2lvbiwgbnVsbCwgJyYnKSAuICciJzsKICAgICAgaWYgKGlzc2V0KCRzZXNzaW9uWydiYXNlX2RvbWFpbiddKSkgewogICAgICAgICRkb21haW4gPSAkc2Vzc2lvblsnYmFzZV9kb21haW4nXTsKICAgICAgfQogICAgICAkZXhwaXJlcyA9ICRzZXNzaW9uWydleHBpcmVzJ107CiAgICB9CgogICAgLy8gcHJlcGVuZCBkb3QgaWYgYSBkb21haW4gaXMgZm91bmQKICAgIGlmICgkZG9tYWluKSB7CiAgICAgICRkb21haW4gPSAnLicgLiAkZG9tYWluOwogICAgfQoKICAgIC8vIGlmIGFuIGV4aXN0aW5nIGNvb2tpZSBpcyBub3Qgc2V0LCB3ZSBkb250IG5lZWQgdG8gZGVsZXRlIGl0CiAgICBpZiAoJHZhbHVlID09ICdkZWxldGVkJyAmJiBlbXB0eSgkX0NPT0tJRVskY29va2llTmFtZV0pKSB7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoaGVhZGVyc19zZW50KCkpIHsKICAgICAgc2VsZjo6ZXJyb3JMb2coJ0NvdWxkIG5vdCBzZXQgY29va2llLiBIZWFkZXJzIGFscmVhZHkgc2VudC4nKTsKCiAgICAvLyBpZ25vcmUgZm9yIGNvZGUgY292ZXJhZ2UgYXMgd2Ugd2lsbCBuZXZlciBiZSBhYmxlIHRvIHNldGNvb2tpZSBpbiBhIENMSQogICAgLy8gZW52aXJvbm1lbnQKICAgIC8vIEBjb2RlQ292ZXJhZ2VJZ25vcmVTdGFydAogICAgfSBlbHNlIHsKICAgICAgc2V0Y29va2llKCRjb29raWVOYW1lLCAkdmFsdWUsICRleHBpcmVzLCAnLycsICRkb21haW4pOwogICAgfQogICAgLy8gQGNvZGVDb3ZlcmFnZUlnbm9yZUVuZAogIH0KCiAgLyoqCiAgICogVmFsaWRhdGVzIGEgc2Vzc2lvbl92ZXJzaW9uPTMgc3R5bGUgc2Vzc2lvbiBvYmplY3QuCiAgICoKICAgKiBAcGFyYW0gQXJyYXkgJHNlc3Npb24gdGhlIHNlc3Npb24gb2JqZWN0CiAgICogQHJldHVybiBBcnJheSB0aGUgc2Vzc2lvbiBvYmplY3QgaWYgaXQgdmFsaWRhdGVzLCBudWxsIG90aGVyd2lzZQogICAqLwogIHByb3RlY3RlZCBmdW5jdGlvbiB2YWxpZGF0ZVNlc3Npb25PYmplY3QoJHNlc3Npb24pIHsKICAgIC8vIG1ha2Ugc3VyZSBzb21lIGVzc2VudGlhbCBmaWVsZHMgZXhpc3QKICAgIGlmIChpc19hcnJheSgkc2Vzc2lvbikgJiYKICAgICAgICBpc3NldCgkc2Vzc2lvblsndWlkJ10pICYmCiAgICAgICAgaXNzZXQoJHNlc3Npb25bJ2FjY2Vzc190b2tlbiddKSAmJgogICAgICAgIGlzc2V0KCRzZXNzaW9uWydzaWcnXSkpIHsKICAgICAgLy8gdmFsaWRhdGUgdGhlIHNpZ25hdHVyZQogICAgICAkc2Vzc2lvbl93aXRob3V0X3NpZyA9ICRzZXNzaW9uOwogICAgICB1bnNldCgkc2Vzc2lvbl93aXRob3V0X3NpZ1snc2lnJ10pOwogICAgICAkZXhwZWN0ZWRfc2lnID0gc2VsZjo6Z2VuZXJhdGVTaWduYXR1cmUoCiAgICAgICAgJHNlc3Npb25fd2l0aG91dF9zaWcsCiAgICAgICAgJHRoaXMtPmdldEFwaVNlY3JldCgpCiAgICAgICk7CiAgICAgIGlmICgkc2Vzc2lvblsnc2lnJ10gIT0gJGV4cGVjdGVkX3NpZykgewogICAgICAgIHNlbGY6OmVycm9yTG9nKCdHb3QgaW52YWxpZCBzZXNzaW9uIHNpZ25hdHVyZSBpbiBjb29raWUuJyk7CiAgICAgICAgJHNlc3Npb24gPSBudWxsOwogICAgICB9CiAgICAgIC8vIGNoZWNrIGV4cGlyeSB0aW1lCiAgICB9IGVsc2UgewogICAgICAkc2Vzc2lvbiA9IG51bGw7CiAgICB9CiAgICByZXR1cm4gJHNlc3Npb247CiAgfQoKICAvKioKICAgKiBSZXR1cm5zIHNvbWV0aGluZyB0aGF0IGxvb2tzIGxpa2Ugb3VyIEpTIHNlc3Npb24gb2JqZWN0IGZyb20gdGhlCiAgICogc2lnbmVkIHRva2VuJ3MgZGF0YQogICAqCiAgICogVE9ETzogTnVrZSB0aGlzIG9uY2UgdGhlIGxvZ2luIGZsb3cgdXNlcyBPQXV0aDIKICAgKgogICAqIEBwYXJhbSBBcnJheSB0aGUgb3V0cHV0IG9mIGdldFNpZ25lZFJlcXVlc3QKICAgKiBAcmV0dXJuIEFycmF5IFNvbWV0aGluZyB0aGF0IHdpbGwgd29yayBhcyBhIHNlc3Npb24KICAgKi8KICBwcm90ZWN0ZWQgZnVuY3Rpb24gY3JlYXRlU2Vzc2lvbkZyb21TaWduZWRSZXF1ZXN0KCRkYXRhKSB7CiAgICBpZiAoIWlzc2V0KCRkYXRhWydvYXV0aF90b2tlbiddKSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICAkc2Vzc2lvbiA9IGFycmF5KAogICAgICAndWlkJyAgICAgICAgICA9PiAkZGF0YVsndXNlcl9pZCddLAogICAgICAnYWNjZXNzX3Rva2VuJyA9PiAkZGF0YVsnb2F1dGhfdG9rZW4nXSwKICAgICAgJ2V4cGlyZXMnICAgICAgPT4gJGRhdGFbJ2V4cGlyZXMnXSwKICAgICk7CgogICAgLy8gcHV0IGEgcmVhbCBzaWcsIHNvIHRoYXQgdmFsaWRhdGVTaWduYXR1cmUgd29ya3MKICAgICRzZXNzaW9uWydzaWcnXSA9IHNlbGY6OmdlbmVyYXRlU2lnbmF0dXJlKAogICAgICAkc2Vzc2lvbiwKICAgICAgJHRoaXMtPmdldEFwaVNlY3JldCgpCiAgICApOwoKICAgIHJldHVybiAkc2Vzc2lvbjsKICB9CgogIC8qKgogICAqIFBhcnNlcyBhIHNpZ25lZF9yZXF1ZXN0IGFuZCB2YWxpZGF0ZXMgdGhlIHNpZ25hdHVyZS4KICAgKiBUaGVuIHNhdmVzIGl0IGluICR0aGlzLT5zaWduZWRfZGF0YQogICAqCiAgICogQHBhcmFtIFN0cmluZyBBIHNpZ25lZCB0b2tlbgogICAqIEBwYXJhbSBCb29sZWFuIFNob3VsZCB3ZSByZW1vdmUgdGhlIHBhcnRzIG9mIHRoZSBwYXlsb2FkIHRoYXQKICAgKiAgICAgICAgICAgICAgICBhcmUgdXNlZCBieSB0aGUgYWxnb3JpdGhtPwogICAqIEByZXR1cm4gQXJyYXkgdGhlIHBheWxvYWQgaW5zaWRlIGl0IG9yIG51bGwgaWYgdGhlIHNpZyBpcyB3cm9uZwogICAqLwogIHByb3RlY3RlZCBmdW5jdGlvbiBwYXJzZVNpZ25lZFJlcXVlc3QoJHNpZ25lZF9yZXF1ZXN0KSB7CiAgICBsaXN0KCRlbmNvZGVkX3NpZywgJHBheWxvYWQpID0gZXhwbG9kZSgnLicsICRzaWduZWRfcmVxdWVzdCwgMik7CgogICAgLy8gZGVjb2RlIHRoZSBkYXRhCiAgICAkc2lnID0gc2VsZjo6YmFzZTY0VXJsRGVjb2RlKCRlbmNvZGVkX3NpZyk7CiAgICAkZGF0YSA9IGpzb25fZGVjb2RlKHNlbGY6OmJhc2U2NFVybERlY29kZSgkcGF5bG9hZCksIHRydWUpOwoKICAgIGlmIChzdHJ0b3VwcGVyKCRkYXRhWydhbGdvcml0aG0nXSkgIT09ICdITUFDLVNIQTI1NicpIHsKICAgICAgc2VsZjo6ZXJyb3JMb2coJ1Vua25vd24gYWxnb3JpdGhtLiBFeHBlY3RlZCBITUFDLVNIQTI1NicpOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICAvLyBjaGVjayBzaWcKICAgICRleHBlY3RlZF9zaWcgPSBoYXNoX2htYWMoJ3NoYTI1NicsICRwYXlsb2FkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+Z2V0QXBpU2VjcmV0KCksICRyYXcgPSB0cnVlKTsKICAgIGlmICgkc2lnICE9PSAkZXhwZWN0ZWRfc2lnKSB7CiAgICAgIHNlbGY6OmVycm9yTG9nKCdCYWQgU2lnbmVkIEpTT04gc2lnbmF0dXJlIScpOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICByZXR1cm4gJGRhdGE7CiAgfQoKICAvKioKICAgKiBCdWlsZCB0aGUgVVJMIGZvciBhcGkgZ2l2ZW4gcGFyYW1ldGVycy4KICAgKgogICAqIEBwYXJhbSAkbWV0aG9kIFN0cmluZyB0aGUgbWV0aG9kIG5hbWUuCiAgICogQHJldHVybiBTdHJpbmcgdGhlIFVSTCBmb3IgdGhlIGdpdmVuIHBhcmFtZXRlcnMKICAgKi8KICBwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0QXBpVXJsKCRtZXRob2QpIHsKICAgIHN0YXRpYyAkUkVBRF9PTkxZX0NBTExTID0KICAgICAgYXJyYXkoJ2FkbWluLmdldGFsbG9jYXRpb24nID0+IDEsCiAgICAgICAgICAgICdhZG1pbi5nZXRhcHBwcm9wZXJ0aWVzJyA9PiAxLAogICAgICAgICAgICAnYWRtaW4uZ2V0YmFubmVkdXNlcnMnID0+IDEsCiAgICAgICAgICAgICdhZG1pbi5nZXRsaXZlc3RyZWFtdmlhbGluaycgPT4gMSwKICAgICAgICAgICAgJ2FkbWluLmdldG1ldHJpY3MnID0+IDEsCiAgICAgICAgICAgICdhZG1pbi5nZXRyZXN0cmljdGlvbmluZm8nID0+IDEsCiAgICAgICAgICAgICdhcHBsaWNhdGlvbi5nZXRwdWJsaWNpbmZvJyA9PiAxLAogICAgICAgICAgICAnYXV0aC5nZXRhcHBwdWJsaWNrZXknID0+IDEsCiAgICAgICAgICAgICdhdXRoLmdldHNlc3Npb24nID0+IDEsCiAgICAgICAgICAgICdhdXRoLmdldHNpZ25lZHB1YmxpY3Nlc3Npb25kYXRhJyA9PiAxLAogICAgICAgICAgICAnY29tbWVudHMuZ2V0JyA9PiAxLAogICAgICAgICAgICAnY29ubmVjdC5nZXR1bmNvbm5lY3RlZGZyaWVuZHNjb3VudCcgPT4gMSwKICAgICAgICAgICAgJ2Rhc2hib2FyZC5nZXRhY3Rpdml0eScgPT4gMSwKICAgICAgICAgICAgJ2Rhc2hib2FyZC5nZXRjb3VudCcgPT4gMSwKICAgICAgICAgICAgJ2Rhc2hib2FyZC5nZXRnbG9iYWxuZXdzJyA9PiAxLAogICAgICAgICAgICAnZGFzaGJvYXJkLmdldG5ld3MnID0+IDEsCiAgICAgICAgICAgICdkYXNoYm9hcmQubXVsdGlnZXRjb3VudCcgPT4gMSwKICAgICAgICAgICAgJ2Rhc2hib2FyZC5tdWx0aWdldG5ld3MnID0+IDEsCiAgICAgICAgICAgICdkYXRhLmdldGNvb2tpZXMnID0+IDEsCiAgICAgICAgICAgICdldmVudHMuZ2V0JyA9PiAxLAogICAgICAgICAgICAnZXZlbnRzLmdldG1lbWJlcnMnID0+IDEsCiAgICAgICAgICAgICdmYm1sLmdldGN1c3RvbXRhZ3MnID0+IDEsCiAgICAgICAgICAgICdmZWVkLmdldGFwcGZyaWVuZHN0b3JpZXMnID0+IDEsCiAgICAgICAgICAgICdmZWVkLmdldHJlZ2lzdGVyZWR0ZW1wbGF0ZWJ1bmRsZWJ5aWQnID0+IDEsCiAgICAgICAgICAgICdmZWVkLmdldHJlZ2lzdGVyZWR0ZW1wbGF0ZWJ1bmRsZXMnID0+IDEsCiAgICAgICAgICAgICdmcWwubXVsdGlxdWVyeScgPT4gMSwKICAgICAgICAgICAgJ2ZxbC5xdWVyeScgPT4gMSwKICAgICAgICAgICAgJ2ZyaWVuZHMuYXJlZnJpZW5kcycgPT4gMSwKICAgICAgICAgICAgJ2ZyaWVuZHMuZ2V0JyA9PiAxLAogICAgICAgICAgICAnZnJpZW5kcy5nZXRhcHB1c2VycycgPT4gMSwKICAgICAgICAgICAgJ2ZyaWVuZHMuZ2V0bGlzdHMnID0+IDEsCiAgICAgICAgICAgICdmcmllbmRzLmdldG11dHVhbGZyaWVuZHMnID0+IDEsCiAgICAgICAgICAgICdnaWZ0cy5nZXQnID0+IDEsCiAgICAgICAgICAgICdncm91cHMuZ2V0JyA9PiAxLAogICAgICAgICAgICAnZ3JvdXBzLmdldG1lbWJlcnMnID0+IDEsCiAgICAgICAgICAgICdpbnRsLmdldHRyYW5zbGF0aW9ucycgPT4gMSwKICAgICAgICAgICAgJ2xpbmtzLmdldCcgPT4gMSwKICAgICAgICAgICAgJ25vdGVzLmdldCcgPT4gMSwKICAgICAgICAgICAgJ25vdGlmaWNhdGlvbnMuZ2V0JyA9PiAxLAogICAgICAgICAgICAncGFnZXMuZ2V0aW5mbycgPT4gMSwKICAgICAgICAgICAgJ3BhZ2VzLmlzYWRtaW4nID0+IDEsCiAgICAgICAgICAgICdwYWdlcy5pc2FwcGFkZGVkJyA9PiAxLAogICAgICAgICAgICAncGFnZXMuaXNmYW4nID0+IDEsCiAgICAgICAgICAgICdwZXJtaXNzaW9ucy5jaGVja2F2YWlsYWJsZWFwaWFjY2VzcycgPT4gMSwKICAgICAgICAgICAgJ3Blcm1pc3Npb25zLmNoZWNrZ3JhbnRlZGFwaWFjY2VzcycgPT4gMSwKICAgICAgICAgICAgJ3Bob3Rvcy5nZXQnID0+IDEsCiAgICAgICAgICAgICdwaG90b3MuZ2V0YWxidW1zJyA9PiAxLAogICAgICAgICAgICAncGhvdG9zLmdldHRhZ3MnID0+IDEsCiAgICAgICAgICAgICdwcm9maWxlLmdldGluZm8nID0+IDEsCiAgICAgICAgICAgICdwcm9maWxlLmdldGluZm9vcHRpb25zJyA9PiAxLAogICAgICAgICAgICAnc3RyZWFtLmdldCcgPT4gMSwKICAgICAgICAgICAgJ3N0cmVhbS5nZXRjb21tZW50cycgPT4gMSwKICAgICAgICAgICAgJ3N0cmVhbS5nZXRmaWx0ZXJzJyA9PiAxLAogICAgICAgICAgICAndXNlcnMuZ2V0aW5mbycgPT4gMSwKICAgICAgICAgICAgJ3VzZXJzLmdldGxvZ2dlZGludXNlcicgPT4gMSwKICAgICAgICAgICAgJ3VzZXJzLmdldHN0YW5kYXJkaW5mbycgPT4gMSwKICAgICAgICAgICAgJ3VzZXJzLmhhc2FwcHBlcm1pc3Npb24nID0+IDEsCiAgICAgICAgICAgICd1c2Vycy5pc2FwcHVzZXInID0+IDEsCiAgICAgICAgICAgICd1c2Vycy5pc3ZlcmlmaWVkJyA9PiAxLAogICAgICAgICAgICAndmlkZW8uZ2V0dXBsb2FkbGltaXRzJyA9PiAxKTsKICAgICRuYW1lID0gJ2FwaSc7CiAgICBpZiAoaXNzZXQoJFJFQURfT05MWV9DQUxMU1tzdHJ0b2xvd2VyKCRtZXRob2QpXSkpIHsKICAgICAgJG5hbWUgPSAnYXBpX3JlYWQnOwogICAgfQogICAgcmV0dXJuIHNlbGY6OmdldFVybCgkbmFtZSwgJ3Jlc3RzZXJ2ZXIucGhwJyk7CiAgfQoKICAvKioKICAgKiBCdWlsZCB0aGUgVVJMIGZvciBnaXZlbiBkb21haW4gYWxpYXMsIHBhdGggYW5kIHBhcmFtZXRlcnMuCiAgICoKICAgKiBAcGFyYW0gJG5hbWUgU3RyaW5nIHRoZSBuYW1lIG9mIHRoZSBkb21haW4KICAgKiBAcGFyYW0gJHBhdGggU3RyaW5nIG9wdGlvbmFsIHBhdGggKHdpdGhvdXQgYSBsZWFkaW5nIHNsYXNoKQogICAqIEBwYXJhbSAkcGFyYW1zIEFycmF5IG9wdGlvbmFsIHF1ZXJ5IHBhcmFtZXRlcnMKICAgKiBAcmV0dXJuIFN0cmluZyB0aGUgVVJMIGZvciB0aGUgZ2l2ZW4gcGFyYW1ldGVycwogICAqLwogIHByb3RlY3RlZCBmdW5jdGlvbiBnZXRVcmwoJG5hbWUsICRwYXRoPScnLCAkcGFyYW1zPWFycmF5KCkpIHsKICAgICR1cmwgPSBzZWxmOjokRE9NQUlOX01BUFskbmFtZV07CiAgICBpZiAoJHBhdGgpIHsKICAgICAgaWYgKCRwYXRoWzBdID09PSAnLycpIHsKICAgICAgICAkcGF0aCA9IHN1YnN0cigkcGF0aCwgMSk7CiAgICAgIH0KICAgICAgJHVybCAuPSAkcGF0aDsKICAgIH0KICAgIGlmICgkcGFyYW1zKSB7CiAgICAgICR1cmwgLj0gJz8nIC4gaHR0cF9idWlsZF9xdWVyeSgkcGFyYW1zLCBudWxsLCAnJicpOwogICAgfQogICAgcmV0dXJuICR1cmw7CiAgfQoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBDdXJyZW50IFVSTCwgc3RyaXBwaW5nIGl0IG9mIGtub3duIEZCIHBhcmFtZXRlcnMgdGhhdCBzaG91bGQKICAgKiBub3QgcGVyc2lzdC4KICAgKgogICAqIEByZXR1cm4gU3RyaW5nIHRoZSBjdXJyZW50IFVSTAogICAqLwogIHByb3RlY3RlZCBmdW5jdGlvbiBnZXRDdXJyZW50VXJsKCkgewogICAgJHByb3RvY29sID0gaXNzZXQoJF9TRVJWRVJbJ0hUVFBTJ10pICYmICRfU0VSVkVSWydIVFRQUyddID09ICdvbicKICAgICAgPyAnaHR0cHM6Ly8nCiAgICAgIDogJ2h0dHA6Ly8nOwogICAgJGN1cnJlbnRVcmwgPSAkcHJvdG9jb2wgLiAkX1NFUlZFUlsnSFRUUF9IT1NUJ10gLiAkX1NFUlZFUlsnUkVRVUVTVF9VUkknXTsKICAgICRwYXJ0cyA9IHBhcnNlX3VybCgkY3VycmVudFVybCk7CgogICAgLy8gZHJvcCBrbm93biBmYiBwYXJhbXMKICAgICRxdWVyeSA9ICcnOwogICAgaWYgKCFlbXB0eSgkcGFydHNbJ3F1ZXJ5J10pKSB7CiAgICAgICRwYXJhbXMgPSBhcnJheSgpOwogICAgICBwYXJzZV9zdHIoJHBhcnRzWydxdWVyeSddLCAkcGFyYW1zKTsKICAgICAgZm9yZWFjaChzZWxmOjokRFJPUF9RVUVSWV9QQVJBTVMgYXMgJGtleSkgewogICAgICAgIHVuc2V0KCRwYXJhbXNbJGtleV0pOwogICAgICB9CiAgICAgIGlmICghZW1wdHkoJHBhcmFtcykpIHsKICAgICAgICAkcXVlcnkgPSAnPycgLiBodHRwX2J1aWxkX3F1ZXJ5KCRwYXJhbXMsIG51bGwsICcmJyk7CiAgICAgIH0KICAgIH0KCiAgICAvLyB1c2UgcG9ydCBpZiBub24gZGVmYXVsdAogICAgJHBvcnQgPQogICAgICBpc3NldCgkcGFydHNbJ3BvcnQnXSkgJiYKICAgICAgKCgkcHJvdG9jb2wgPT09ICdodHRwOi8vJyAmJiAkcGFydHNbJ3BvcnQnXSAhPT0gODApIHx8CiAgICAgICAoJHByb3RvY29sID09PSAnaHR0cHM6Ly8nICYmICRwYXJ0c1sncG9ydCddICE9PSA0NDMpKQogICAgICA/ICc6JyAuICRwYXJ0c1sncG9ydCddIDogJyc7CgogICAgLy8gcmVidWlsZAogICAgcmV0dXJuICRwcm90b2NvbCAuICRwYXJ0c1snaG9zdCddIC4gJHBvcnQgLiAkcGFydHNbJ3BhdGgnXSAuICRxdWVyeTsKICB9CgogIC8qKgogICAqIEdlbmVyYXRlIGEgc2lnbmF0dXJlIGZvciB0aGUgZ2l2ZW4gcGFyYW1zIGFuZCBzZWNyZXQuCiAgICoKICAgKiBAcGFyYW0gQXJyYXkgJHBhcmFtcyB0aGUgcGFyYW1ldGVycyB0byBzaWduCiAgICogQHBhcmFtIFN0cmluZyAkc2VjcmV0IHRoZSBzZWNyZXQgdG8gc2lnbiB3aXRoCiAgICogQHJldHVybiBTdHJpbmcgdGhlIGdlbmVyYXRlZCBzaWduYXR1cmUKICAgKi8KICBwcm90ZWN0ZWQgc3RhdGljIGZ1bmN0aW9uIGdlbmVyYXRlU2lnbmF0dXJlKCRwYXJhbXMsICRzZWNyZXQpIHsKICAgIC8vIHdvcmsgd2l0aCBzb3J0ZWQgZGF0YQogICAga3NvcnQoJHBhcmFtcyk7CgogICAgLy8gZ2VuZXJhdGUgdGhlIGJhc2Ugc3RyaW5nCiAgICAkYmFzZV9zdHJpbmcgPSAnJzsKICAgIGZvcmVhY2goJHBhcmFtcyBhcyAka2V5ID0+ICR2YWx1ZSkgewogICAgICAkYmFzZV9zdHJpbmcgLj0gJGtleSAuICc9JyAuICR2YWx1ZTsKICAgIH0KICAgICRiYXNlX3N0cmluZyAuPSAkc2VjcmV0OwoKICAgIHJldHVybiBtZDUoJGJhc2Vfc3RyaW5nKTsKICB9CgogIC8qKgogICAqIFByaW50cyB0byB0aGUgZXJyb3IgbG9nIGlmIHlvdSBhcmVuJ3QgaW4gY29tbWFuZCBsaW5lIG1vZGUuCiAgICoKICAgKiBAcGFyYW0gU3RyaW5nIGxvZyBtZXNzYWdlCiAgICovCiAgcHJvdGVjdGVkIHN0YXRpYyBmdW5jdGlvbiBlcnJvckxvZygkbXNnKSB7CiAgICAvLyBkaXNhYmxlIGVycm9yIGxvZyBpZiB3ZSBhcmUgcnVubmluZyBpbiBhIENMSSBlbnZpcm9ubWVudAogICAgLy8gQGNvZGVDb3ZlcmFnZUlnbm9yZVN0YXJ0CiAgICBpZiAocGhwX3NhcGlfbmFtZSgpICE9ICdjbGknKSB7CiAgICAgIGVycm9yX2xvZygkbXNnKTsKICAgIH0KICAgIC8vIHVuY29tbWVudCB0aGlzIGlmIHlvdSB3YW50IHRvIHNlZSB0aGUgZXJyb3JzIG9uIHRoZSBwYWdlCiAgICAvLyBwcmludCAnZXJyb3JfbG9nOiAnLiRtc2cuIlxuIjsKICAgIC8vIEBjb2RlQ292ZXJhZ2VJZ25vcmVFbmQKICB9CgogIC8qKgogICAqIEJhc2U2NCBlbmNvZGluZyB0aGF0IGRvZXNuJ3QgbmVlZCB0byBiZSB1cmxlbmNvZGUoKWVkLgogICAqIEV4YWN0bHkgdGhlIHNhbWUgYXMgYmFzZTY0X2VuY29kZSBleGNlcHQgaXQgdXNlcwogICAqICAgLSBpbnN0ZWFkIG9mICsKICAgKiAgIF8gaW5zdGVhZCBvZiAvCiAgICoKICAgKiBAcGFyYW0gU3RyaW5nIGJhc2U2NFVybEVuY29kZWRlZCBzdHJpbmcKICAgKi8KICBwcm90ZWN0ZWQgc3RhdGljIGZ1bmN0aW9uIGJhc2U2NFVybERlY29kZSgkaW5wdXQpIHsKICAgIHJldHVybiBiYXNlNjRfZGVjb2RlKHN0cnRyKCRpbnB1dCwgJy1fJywgJysvJykpOwogIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/class.Msft_Bing_Search.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9QSFAKLyoqCiAqIE1pY3Jvc29mdCBCaW5nIFNlYXJjaAogKiAKICogUEhQIGxpYnJhcnkgdG8gc3VwcG9ydCB0aGUgTWljcm9zb2Z0IEJpbmcgU2VhcmNoIEFQSS4KICoKICogUEhQIFZlcnNpb24gNQogKiAgCiAqIEBjYXRlZ29yeSAgTXNmdAogKiBAcGFja2FnZSAgIE1zZnQKICogQGF1dGhvciAgICBDYWwgRXZhbnMgCiAqIEBjb3B5cmlnaHQgMjAxMCBNaWNyb3NvZnQKICogQGxpY2Vuc2UgICBOZXcgQlNEIExpY2Vuc2UgKEJTRCkgaHR0cDovL2JpbmdwaHAuY29kZXBsZXguY29tL2xpY2Vuc2UKICogQHZlcnNpb24gICBTVk46ICRJZDogU2VhcmNoLnBocCA0OSAyMDEwLTAzLTIzIDE5OjMyOjMxWiBjYWwgJAogKiBAbGluayAgICAgIGh0dHA6Ly9iaW5ncGhwLmNvZGVwbGV4LmNvbQogKi8KCi8qKgogKiBTZWFyY2ggY2xhc3MgZm9yIHRoZSBCaW5nIFNlYXJjaCBBUEkuCiAqIAogKiBAY2F0ZWdvcnkgICBNc2Z0CiAqIEBwYWNrYWdlICAgIE1zZnQKICogQHN1YnBhY2thZ2UgQmluZwogKiBAYXV0aG9yICAgICBDYWwgRXZhbnMgCiAqIEBsaWNlbnNlICAgIE5ldyBCU0QgTGljZW5zZSAoQlNEKSBodHRwOi8vYmluZ3BocC5jb2RlcGxleC5jb20vbGljZW5zZQogKiBAbGluayAgICAgICBodHRwOi8vYmluZ3BocC5jb2RlcGxleC5jb20KICovCmNsYXNzIE1zZnRfQmluZ19TZWFyY2gKewogICAgLyoqCiAgICAgKiBBZHVsdCBmaWx0ZXIgc2V0dGluZwogICAgICovCiAgICBwcm90ZWN0ZWQgJGFkdWx0ID0gJ01vZGVyYXRlJzsKCiAgICAvKioKICAgICAqIEJpbmcgQXBwbGljYXRpb24gSUQgLSBodHRwOi8vd3d3LmJpbmcuY29tL2RldmVsb3BlcnMvY3JlYXRlYXBwLmFzcHgKICAgICAqLwogICAgcHJvdGVjdGVkICRhcHBpZCA9ICcnOwoKICAgIC8qKgogICAgICogQmFzZSBiaW5nIFVSTAogICAgICovCiAgICBwcm90ZWN0ZWQgJGJhc2VVcmwgPSAnaHR0cDovL2FwaS5iaW5nLm5ldC8nOwoKICAgIC8qKgogICAgICogRmxhZ3MgdGhhdCBoYXZlIGJlZW4gc2V0LgogICAgICovCiAgICBwcm90ZWN0ZWQgJGZsYWdzID0gYXJyYXkoKTsKCiAgICAvKioKICAgICAqIExpc3Qgb2YgcHJlZmVycmVkIGZpbGUgdHlwZXMgdG8gcmV0dXJuCiAgICAgKi8KICAgIHByb3RlY3RlZCAkZmlsZXR5cGUgPSBhcnJheSgpOwoKICAgIC8qKgogICAgICogT3V0cHV0IGZvcm1hdCAoanNvbnx4bWwpCiAgICAgKi8KICAgIHByb3RlY3RlZCAkZm9ybWF0ID0gJ2pzb24nOwoKICAgIC8qKgogICAgICogTnVtYmVyIG9mIGltYWdlIHJlc3VsdHMgdG8gcmV0dXJuICgxLTEwMCkKICAgICAqLwogICAgcHJvdGVjdGVkICRpbWFnZWNvdW50ID0gMTA7CgogICAgLyoqCiAgICAgKiBKU09OIGZvcm1hdCBvcHRpb24gKHJhd3xjYWxsYmFjaykKICAgICAqLwogICAgcHJvdGVjdGVkICRqc29udHlwZSA9ICdyYXcnOwoKICAgIC8qKgogICAgICogTGFuZ3VhZ2UgKHNlZSBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvZGQyNTEwNjQuYXNweCkKICAgICAqLwogICAgcHJvdGVjdGVkICRtYXJrZXQgPSAnJzsKCiAgICAvKioKICAgICAqIFRoZSBxdWVyeSBzdHJpbmcKICAgICAqLwogICAgcHJvdGVjdGVkICRxdWVyeSA9ICcnOwoKICAgIC8qKgogICAgICogU2l0ZSB0byBsaW1pdCB0aGUgc2VhcmNoIHRvCiAgICAgKi8KICAgIHByb3RlY3RlZCAkc2l0ZSA9ICcnOwoKICAgIC8qKgogICAgICogU291cmNlcyB0byBkcmF3IGZyb20gd2hlbiBzZWFyY2hpbmcgW3dlYnxpbWFnZXxzcGVsbF0KICAgICAqLwogICAgcHJvdGVjdGVkICRzb3VyY2VzID0gYXJyYXkoKTsKCiAgICAvKioKICAgICAqIFZhbGlkIGZpbGUgdHlwZXMgdGhhdCBjYW4gYmUgc3BlY2lmaWVkLgogICAgICovCiAgICBwcm90ZWN0ZWQgJHZhbGlkRmlsZVR5cGVzID0gYXJyYXkoKTsKCiAgICAvKioKICAgICAqIFZhbGlkIGZsYWdzIHRoYXQgY2FuIGJlIHNwZWNpZmllZC4KICAgICAqLwogICAgcHJvdGVjdGVkICR2YWxpZEZsYWdzID0gYXJyYXkoKTsKCiAgICAvKioKICAgICAqIFZhbGlkIGZvcm1hdHMgdGhhdCBjYW4gYmUgc3BlY2lmaWVkLgogICAgICovCiAgICBwcm90ZWN0ZWQgJHZhbGlkRm9ybWF0cyA9IGFycmF5KCk7CgogICAgLyoqCiAgICAgKiBWYWxpZCBmb3JtYXRzIG9wdGlvbnMgdGhhdCBjYW4gYmUgc3BlY2lmaWVkLgogICAgICovCiAgICBwcm90ZWN0ZWQgJHZhbGlkRm9ybWF0T3B0aW9ucyA9IGFycmF5KCk7CgogICAgLyoqCiAgICAgKiBWYWxpZCBzb3VyY2VzIHRoYXQgY2FuIGJlIHNwZWNpZmllZC4KICAgICAqLwogICAgcHJvdGVjdGVkICR2YWxpZFNvdXJjZXMgPSBhcnJheSgpOwoKICAgIC8qKgogICAgICogQVBJIHZlcnNpb24gKDIuMHwyLjIpCiAgICAgKi8KICAgIHByb3RlY3RlZCAkdmVyc2lvbiA9IDIuMjsKCiAgICAvKioKICAgICAqIFVSTCB1c2VkIGluIHRoZSBsYXN0IHNlYXJjaCBwZXJmb3JtZWQgYnkgdGhlIGNsYXNzCiAgICAgKi8KICAgIHByb3RlY3RlZCAkdXJsID0gbnVsbDsKCiAgICAvKioKICAgICAqIE51bWJlciBvZiB3ZWIgcmVzdWx0cyB0byByZXR1cm4gKDEtMTAwKQogICAgICovCiAgICBwcm90ZWN0ZWQgJHdlYmNvdW50ID0gMTA7CgogICAgLyoqCiAgICAgKiBPZmZzZXQgZnJvbSAwIHRvIGJlZ2luIHRoZSBsaXN0IG9mIHVybHMgcmV0dXJuZWQuICgwLTEwMCkKICAgICAqLwogICAgcHJvdGVjdGVkICR3ZWJvZmZzZXQgPSBudWxsOwoKICAgIC8qKgogICAgICogWE1MIG91dHB1dCB0eXBlIHNwZWNpZmllZAogICAgICovCiAgICBwcm90ZWN0ZWQgJHhtbHR5cGUgPSAnJzsKICAgIAogICAgLyoqCiAgICAgKiBjb25zdHJ1Y3RvcgogICAgICogCiAgICAgKiBAcGFyYW0gc3RyaW5nICRhcHBJZCBUaGUgQmluZyBBUFAgSUQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRhcHBJZD0nJykKICAgIHsKICAgICAgICAkdGhpcy0+dmFsaWRGaWxlVHlwZXMgICAgID0gYXJyYXkoJ0RPQycsJ0RXRicsJ0ZFRUQnLCdIVE0nLCdIVE1MJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1BERicsJ1BQVCcsJ1BTJywnUlRGJywnVEVYVCcsJ1RYVCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdYTFMnKTsKICAgICAgICAkdGhpcy0+dmFsaWRGbGFncyAgICAgICAgID0gYXJyYXkoJ0Rpc2FibGVIb3N0Q29sbGFwc2luZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdEaXNhYmxlUXVlcnlBbHRlcmF0aW9ucycpOwogICAgICAgICR0aGlzLT52YWxpZFNvdXJjZXMgICAgICAgPSBhcnJheSgnSW1hZ2UnLCdJbnN0YW50QW5zd2VyJywnTW9iaWxlV2ViJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ05ld3MnLCdQaG9uZUJvb2snLCdSZWxhdGVkU2VhcmNoJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU3BlbGwnLCdUcmFuc2xhdGlvbicsJ1ZpZGVvJywnV2ViJyk7CiAgICAgICAgJHRoaXMtPnZhbGlkRm9ybWF0cyAgICAgICA9IGFycmF5KCdqc29uJywneG1sJyk7CiAgICAgICAgJHRoaXMtPnZhbGlkRm9ybWF0T3B0aW9ucyA9IGFycmF5KCdqc29uJyA9PiBhcnJheSgncmF3JywnY2FsbGJhY2snKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd4bWwnICA9PiBhcnJheSgnZWxlbWVudGJhc2VkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXR0cmlidXRlYmFzZWQnKSk7CiAgICAgICAgaWYgKCFlbXB0eSgkYXBwSWQpKSB7CiAgICAgICAgICAgICR0aGlzLT5hcHBpZCA9ICRhcHBJZDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuOwogICAgfSAvLyBmdW5jdGlvbiBfX2NvbnN0cnVjdAoKICAgIC8qKgogICAgICogQXR0ZW1wdHMgdG8gZXhlY3V0ZSB0aGUgY3VycmVudGx5LXNwZWNpZmllZCBzZWFyY2gKICAgICAqIAogICAgICogQHJldHVybiBzdHJpbmcgVGhlIHJlc3VsdHMgZnJvbSB0aGUgcXVlcnkKICAgICAqIEB0aHJvd3MgTXNmdF9CaW5nX1NlYXJjaF9FeGNlcHRpb24KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNlYXJjaCgpCiAgICB7CiAgICAgICAgaWYgKGVtcHR5KCR0aGlzLT5hcHBpZCkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IE1zZnRfQmluZ19TZWFyY2hfRXhjZXB0aW9uKCdFbXB0eSBBcHBJZCcpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZiAoZW1wdHkoJHRoaXMtPnNvdXJjZXMpKSB7CiAgICAgICAgICAgICR0aGlzLT5zb3VyY2VzW109J3dlYic7CiAgICAgICAgfQogICAgICAgIAogICAgICAgICAgICAgCiAgICAgICAgJHRoaXMtPnVybCA9ICR0aGlzLT5idWlsZFVybCgpOwogICAgICAgIAogICAgICAgIGlmICgkc3RyZWFtID0gQGZvcGVuKCR0aGlzLT51cmwsICdyJykpIHsKICAgICAgICAgICAgJG91dHB1dCA9IHN0cmVhbV9nZXRfY29udGVudHMoJHN0cmVhbSk7CiAgICAgICAgICAgIGZDbG9zZSgkc3RyZWFtKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aHJvdyBuZXcgTXNmdF9CaW5nX1NlYXJjaF9FeGNlcHRpb24oJ1Byb2JsZW0gb3BlbmluZyBzdHJlYW0nKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRvdXRwdXQ7CiAgICB9IC8vIHB1YmxpYyBmdW5jdGlvbiBzZWFyY2goKQoKICAgIC8qKgogICAgICogQ29uc3RydWN0IHRoZSBVUkwgdXNlZCBpbiB0aGUgc2VhcmNoCiAgICAgKiAKICAgICAqIEByZXR1cm4gc3RyaW5nIHRoZSB1cmwKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGJ1aWxkVXJsKCkKICAgIHsKICAgICAgICAkdXJsID0gJHRoaXMtPmJhc2VVcmwgLiAkdGhpcy0+Z2V0Rm9ybWF0KCkgLiAnLmFzcHgnOwogICAgICAgICR1cmwgLj0gIj8iCiAgICAgICAgICAgICAuICR0aGlzLT5nZXRQYXJhbWV0ZXIoJ0FwcElkJywgdHJ1ZSkKICAgICAgICAgICAgIC4gJHRoaXMtPmdldFBhcmFtZXRlcignQWR1bHQnKQogICAgICAgICAgICAgLiAkdGhpcy0+Z2V0UGFyYW1ldGVyKCdWZXJzaW9uJykKICAgICAgICAgICAgIC4gJHRoaXMtPmdldFBhcmFtZXRlcignTWFya2V0JykKICAgICAgICAgICAgIC4gJHRoaXMtPmdldFBhcmFtZXRlcignU291cmNlcycpCiAgICAgICAgICAgICAuICR0aGlzLT5nZXRQYXJhbWV0ZXIoJ1dlYi5Db3VudCcpCiAgICAgICAgICAgICAuICR0aGlzLT5nZXRQYXJhbWV0ZXIoJ0ltYWdlLkNvdW50JykKICAgICAgICAgICAgIC4gJHRoaXMtPmdldFBhcmFtZXRlcignV2ViLk9mZnNldCcpCiAgICAgICAgICAgICAuICR0aGlzLT5nZXRQYXJhbWV0ZXIoJ0ZpbGVUeXBlJykKICAgICAgICAgICAgIC4gJHRoaXMtPmdldFBhcmFtZXRlcignRmxhZ3MnKQogICAgICAgICAgICAgLiAkdGhpcy0+Z2V0UGFyYW1ldGVyKCdKc29uVHlwZScpCiAgICAgICAgICAgICAuICR0aGlzLT5nZXRQYXJhbWV0ZXIoJ1htbFR5cGUnKSAgICAgICAgICAgIAogICAgICAgICAgICAgLiAnJlF1ZXJ5PScuJHRoaXMtPmdldFF1ZXJ5KHRydWUpOwogICAgICAgICAgICAgcmV0dXJuICR1cmw7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm4gZWl0aGVyIHRoZSB2YWx1ZSBwYXNzZWQgaW4gaWYgaXQncyBiZXR3ZWVuIHRoZSBtaW4gYW5kIG1heCBvciB0aGUKICAgICAqIG1pbiBvciBtYXguCiAgICAgKgogICAgICogQHBhcmFtIG51bWJlciAkdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrCiAgICAgKiBAcGFyYW0gbnVtYmVyICRtaW4gICBUaGUgbWluaW11bSBhbGxvd2FibGUgdmFsdWUKICAgICAqIEBwYXJhbSBudW1iZXIgJG1heCAgIFRoZSBtYXhpbXVtIGFsbG93YWJsZSB2YWx1ZQogICAgICogCiAgICAgKiBAcmV0dXJuIG51bWJlcgogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gYmV0d2VlbigkdmFsdWUsICRtaW4sICRtYXgpCiAgICB7CiAgICAgICAgJHZhbHVlID0gKGludCkkdmFsdWU7CiAgICAgICAgJHZhbHVlID0gbWF4KCRtaW4sICR2YWx1ZSk7CiAgICAgICAgJHZhbHVlID0gbWluKCRtYXgsICR2YWx1ZSk7CiAgICAgICAgcmV0dXJuICR2YWx1ZTsgICAgICAgIAogICAgfQoKICAgIC8qKgogICAgICogUHJvcGVybHkgZm9ybWF0IGFuZCB1cmxlbmNvZGUgdGhlIGtleT12YWx1ZSBwYWlyIHJlcXVlc3RlZC4KICAgICAqIAogICAgICogQHBhcmFtIHN0cmluZyAgJG5hbWUgICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyCiAgICAgKiBAcGFyYW0gYm9vbGVhbiAkaWdub3JlQW1wZXJzYW5kIElmIHRydWUsIGRvZXMgbm90IHByZXBlbmQgdGhlIG91dHB1dCB3aXRoCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuIGFtcGVyc2FuZC4gRGVmYXVsdCBiZWhhdmlvdXIgaXMgdG8KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlcGVuZCB0aGUgYW1wZXJzYW5kLgogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAqIEByZXR1cm4gbWl4ZWQKICAgICAqIAogICAgICogQHRocm93cyBNc2Z0X0JpbmdfU2VhcmNoX0V4Y2VwdGlvbgogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0UGFyYW1ldGVyKCRuYW1lLCAkaWdub3JlQW1wZXJzYW5kPWZhbHNlKQogICAgewogICAgICAgIAogICAgICAgICRwYXJhbU5hbWUgICAgPSBzdHJfcmVwbGFjZSgnLicsICcnLCBzdHJ0b2xvd2VyKCRuYW1lKSk7ICAgICAgICAKICAgICAgICAkcmV0dXJuVmFsdWUgPSAnJzsKICAgICAgICAKICAgICAgICBpZiAoIXByb3BlcnR5X2V4aXN0cygkdGhpcywgJHBhcmFtTmFtZSkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IE1zZnRfQmluZ19TZWFyY2hfRXhjZXB0aW9uKCRwYXJhbU5hbWUuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIGlzIGFuIGludmxhaWQgcGFyYW1ldGVyJyk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIElmIChpc19hcnJheSgkdGhpcy0+JHBhcmFtTmFtZSkpIHsKICAgICAgICAgICAgJGFsbFZhbHVlcyA9IGltcGxvZGUoJyAnLCAkdGhpcy0+JHBhcmFtTmFtZSk7CiAgICAgICAgICAgICRyZXR1cm5WYWx1ZSAuPSAoIWVtcHR5KCRhbGxWYWx1ZXMpPygkbmFtZS4nPScpOicnKS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybGVuY29kZSh0cmltKCRhbGxWYWx1ZXMpKTsKICAgICAgICB9IGVsc2UgewoKICAgICAgICAgICAgaWYgKGlzc2V0KCR0aGlzLT4kcGFyYW1OYW1lKSBhbmQgIWVtcHR5KCR0aGlzLT4kcGFyYW1OYW1lKSkgewogICAgICAgICAgICAgICAgJHJldHVyblZhbHVlIC49ICRuYW1lLic9Jy51cmxlbmNvZGUoJHRoaXMtPiRwYXJhbU5hbWUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghZW1wdHkoJHJldHVyblZhbHVlKSkgewogICAgICAgICAgICAkcmV0dXJuVmFsdWUgID0gKChib29sZWFuKSRpZ25vcmVBbXBlcnNhbmQ/Jyc6JyYnKS4kcmV0dXJuVmFsdWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkcmV0dXJuVmFsdWU7CiAgICB9IC8vIHByb3RlY3RlZCBmdW5jdGlvbiBnZXRQYXJhbWV0ZXIoJG5hbWUpCgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgYWR1bHQgZmlsdGVyCiAgICAgKiAKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRBZHVsdCgpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5hZHVsdDsKICAgIH0gLy8gcHVibGljIGZ1bmN0aW9uIGdldEFkdWx0KCkKICAgIAogICAgLyoqCiAgICAgKiBTZXRzIHRoZSB2YWx1ZSBmb3IgdGhlIGFkdWx0IGZpbHRlcgogICAgICogCiAgICAgKiBAcGFyYW0gc3RyaW5nICR2YWx1ZSBUaGUgbmV3IHZhbHVlIChPZmZ8TW9kZXJhdGV8U3RyaWN0KQogICAgICogCiAgICAgKiBAcmV0dXJuIE1zZnRfQmluZ19TZWFyY2gKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNldEFkdWx0KCR2YWx1ZSkKICAgIHsKICAgICAgICAkdGhpcy0+YWR1bHQgPSAkdmFsdWU7CiAgICAgICAgcmV0dXJuICR0aGlzOwogICAgfSAvLyBwdWJsaWMgZnVuY3Rpb24gc2V0QWR1bHQoJHZhbHVlKQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIEFwcElEIGN1cnJlbnRseSBzZXQgaW4gdGhlIG9iamVjdAogICAgICogCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0QXBwSWQoKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+YXBwaWQ7CiAgICB9IC8vIHB1YmxpYyBmdW5jdGlvbiBnZXRBcHBJZCgpCiAgICAKICAgIC8qKgogICAgICogU2V0IHRoZSBBcHBJRCBmb3IgdGhpcyBvYmplY3QKICAgICAqIAogICAgICogQHBhcmFtIHN0cmluZyAkdmFsdWUgVGhlIEJpbmcgYXBwbGljYXRpb24gaWQKICAgICAqIAogICAgICogQHJldHVybiBNc2Z0X0JpbmdfU2VhcmNoCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRBcHBJZCgkdmFsdWUpCiAgICB7CiAgICAgICAgaWYgKCFpc19udWxsKCR2YWx1ZSkpIHsKICAgICAgICAgICAgJHRoaXMtPmFwcGlkID0gJHZhbHVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJHRoaXM7CiAgICB9IC8vIHB1YmxpYyBmdW5jdGlvbiBzZXRBcHBJZCgkdmFsdWUpCiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGJhc2UgQmluZyBVUkwKICAgICAqIAogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldEJhc2VVcmwoKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+YmFzZVVybDsKICAgIH0gLy8gcHVibGljIGZ1bmN0aW9uIGdldEJhc2VVcmwoKQogICAgCiAgICAvKioKICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBiYXNlIEJpbmcgVVJMCiAgICAgKiAKICAgICAqIEBwYXJhbSBzdHJpbmcgJHZhbHVlIFRoZSBuZXcgYmFzZSB1cmwKICAgICAqIAogICAgICogQHJldHVybiBNc2Z0X0JpbmdfU2VhcmNoCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRCYXNlVXJsKCR2YWx1ZSkKICAgIHsKICAgICAgICBpZiAoIWlzX251bGwoJHZhbHVlKSkgewogICAgICAgICAgICAkdGhpcy0+YmFzZVVybCA9ICR2YWx1ZSAuIChzdWJzdHIoJHZhbHVlLCAtMSwgMSkhPScvJz8nLyc6JycpOwogICAgICAgIH0gLy8gaWYgKCFpc19udWxsKCR2YWx1ZSkpCiAgICAgICAgcmV0dXJuICR0aGlzOwogICAgfSAvLyBwdWJsaWMgZnVuY3Rpb24gc2V0QmFzZVVybCgkdmFsdWUpCiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgbWF4aW11bSBudW1iZXIgb2Ygd2ViIHJlc3VsdHMgdG8gYmUgcmVxdWVzdGVkCiAgICAgKiAKICAgICAqIEByZXR1cm4gaW50ZWdlcgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0V2ViQ291bnQoKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+d2ViY291bnQ7CiAgICB9IC8vIHB1YmxpYyBmdW5jdGlvbiBnZXRDb3VudCgpCiAgICAKICAgIC8qKgogICAgICogc2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiB3ZWIgcmVzdWx0cyB0byBiZSByZXF1ZXN0ZWQKICAgICAqIAogICAgICogQHBhcmFtIGludCAkdmFsdWUgMS0xMDAgVGhlIG5ldyB2YWx1ZSBvZiBXZWJTb3VyY2UuY291bnQKICAgICAqIAogICAgICogQHJldHVybiBNc2Z0X0JpbmdfU2VhcmNoCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRXZWJDb3VudCgkdmFsdWUpCiAgICB7CiAgICAgICAgJHRoaXMtPndlYmNvdW50ID0gJHRoaXMtPmJldHdlZW4oJHZhbHVlLCAxLCAxMDApOwogICAgICAgIHJldHVybiAkdGhpczsKICAgIH0gLy8gcHVibGljIGZ1bmN0aW9uIHNldENvdW50KCR2YWx1ZSkKCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGltYWdlIHJlc3VsdHMgdG8gYmUgcmVxdWVzdGVkCiAgICAgKiAKICAgICAqIEByZXR1cm4gaW50ZWdlcgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0SW1hZ2VDb3VudCgpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5pbWFnZWNvdW50OwogICAgfSAvLyBwdWJsaWMgZnVuY3Rpb24gZ2V0SW1hZ2VDb3VudCgpCiAgICAKICAgIC8qKgogICAgICogU2V0cyB0aGUgbWF4aW11bSBudW1iZXIgb2YgaW1hZ2UgcmVzdWx0cyB0byBiZSByZXF1ZXN0ZWQKICAgICAqIAogICAgICogQHBhcmFtIGludCAkdmFsdWUgMS0xMDAgVGhlIG5ldyB2YWx1ZSBvZiBJbWFnZVNvdXJjZS5jb3VudAogICAgICogCiAgICAgKiBAcmV0dXJuIE1zZnRfQmluZ19TZWFyY2gKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNldEltYWdlQ291bnQoJHZhbHVlKQogICAgewogICAgICAgICR0aGlzLT5pbWFnZWNvdW50ID0gJHRoaXMtPmJldHdlZW4oJHZhbHVlLCAxLCAxMDApOwogICAgICAgIHJldHVybiAkdGhpczsKICAgIH0gLy8gcHVibGljIGZ1bmN0aW9uIHNldEltYWdlQ291bnQoJHZhbHVlKQoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmVxdWVzdGVkIHJlc3VsdCBmb3JtYXQKICAgICAqIAogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldEZvcm1hdCgpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5mb3JtYXQ7CiAgICB9IC8vIHB1YmxpYyBmdW5jdGlvbiBnZXRGb3JtYXQoKQogICAgCiAgICAvKioKICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSByZXF1ZXN0ZWQgcmVzdWx0IGZvcm1hdC4gZm9ybWF0IGlzIHZhbGlkYXRlZAogICAgICogYWdhaW5zdCB2YWxpZEZvcm1hdHMuIGZvcm1hdE9wdGlvbiBpcyByZXNldCB0byB0aGUgZmlyc3QgbGlzdGVkCiAgICAgKiB2YWxpZEZvcm1hdE9wdGlvbi4gT3RoZXIgb3B0aW9ucyBhcmUgY2xlYXJlZC4KICAgICAqIAogICAgICogQHBhcmFtIHN0cmluZyAkdmFsdWUgVGhlIG5ldyB2YWx1ZQogICAgICogCiAgICAgKiBAcmV0dXJuIE1zZnRfQmluZ19TZWFyY2gKICAgICAqIAogICAgICogQHRocm93cyBNc2Z0X0JpbmdfU2VhcmNoX0V4Y2VwdGlvbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0Rm9ybWF0KCR2YWx1ZSkKICAgIHsKICAgICAgICAkdmFsdWUgPSBzdHJ0b2xvd2VyKCR2YWx1ZSk7CiAgICAgICAgaWYgKGluX2FycmF5KCR2YWx1ZSwgJHRoaXMtPnZhbGlkRm9ybWF0cykpIHsKICAgICAgICAgICAgJHRoaXMtPmZvcm1hdCA9ICR2YWx1ZTsKICAgICAgICAgICAgJHRoaXMtPl9mcm9tYXRPcHRpb24gPSAkdGhpcy0+dmFsaWRGb3JtYXRPcHRpb25zWyR2YWx1ZV1bMF07CiAgICAgICAgICAgIGZvcmVhY2ggKCR0aGlzLT52YWxpZEZvcm1hdHMgYXMgJGtleSkgewogICAgICAgICAgICAgICAgJHByb3BlcnR5ID0gJ18nLiRrZXkuJ3R5cGUnOwogICAgICAgICAgICAgICAgJHRoaXMtPiRwcm9wZXJ0eSA9ICcnOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhyb3cgbmV3IE1zZnRfQmluZ19TZWFyY2hfRXhjZXB0aW9uKCR2YWx1ZS4nIGlzIGFuIGludmFsaWQgZm9ybWF0LicpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJHRoaXM7CiAgICB9IC8vIHB1YmxpYyBmdW5jdGlvbiBzZXRGb3JtYXQoJHZhbHVlKQoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBmb3JtYXQgb3B0aW9ucy4KICAgICAqIAogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldEZvcm1hdE9wdGlvbigpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5mb3JtYXRPcHRpb247CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXRzIHRoZSBzcGVjaWZpZWQgZm9ybWF0IG9wdGlvbi4gb3B0aW9uIGlzIHZhbGlkYXRlZCBhZ2FpbnN0CiAgICAgKiB0aGUgdmFsaWRGb3JtYXRzIGFycmF5CiAgICAgKiAKICAgICAqIEBwYXJhbSBzdHJpbmcgJHZhbHVlIFRoZSBuZXcgdmFsdWUKICAgICAqIAogICAgICogQHJldHVybiBNc2Z0X0JpbmdfU2VhcmNoCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRGb3JtYXRPcHRpb24oJHZhbHVlKQogICAgewogICAgICAgICR2YWx1ZSA9IHN0cnRvbG93ZXIoJHZhbHVlKTsKICAgICAgICBpZiAoaW5fYXJyYXkoJHZhbHVlLCAkdGhpcy0+dmFsaWRGb3JtYXRPcHRpb25zWyR0aGlzLT5mb3JtYXRdKSkgewogICAgICAgICAgICAkdGhpcy0+Zm9ybWF0b3B0aW9uID0gJHZhbHVlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRocm93IG5ldyBNc2Z0X0JpbmdfU2VhcmNoX0V4Y2VwdGlvbigkdmFsdWUuCiAgICAgICAgICAgICAgICAgICAgICAgJyBpcyBub3QgYSB2YWxpZCBvcHRpb24gZm9yIHRoZSBmb3JtYXQgJy4kdGhpcy0+Zm9ybWF0KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICR0aGlzOyAgICAgICAgCiAgICB9IC8vIHB1YmxpYyBmdW5jdGlvbiBzZXRGb3JtYXRPcHRpb24oJGtleSkKICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBsYW5ndWFnZSBvZiB0aGUgcmVzdWx0cwogICAgICogCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0TWFya2V0KCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPm1hcmtldDsKICAgIH0gLy8gcHVibGljIGZ1bmN0aW9uIGdldE1hcmtldCgpCgogICAgLyoqCiAgICAgKiBTZXRzIHRoZSBsYW5ndWFnZSBvZiB0aGUgcmVzdWx0cwogICAgICogCiAgICAgKiBAcGFyYW0gc3RyaW5nICR2YWx1ZSBUaGUgbmV3IHZhbHVlCiAgICAgKiAKICAgICAqIEByZXR1cm4gTXNmdF9CaW5nX1NlYXJjaAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0TWFya2V0KCR2YWx1ZSkKICAgIHsKICAgICAgICAkdGhpcy0+bWFya2V0ID0gJHZhbHVlOwogICAgICAgIHJldHVybiAkdGhpczsKICAgIH0gLy8gcHVibGljIGZ1bmN0aW9uIHNldE1hcmtldCgkdmFsdWUpCiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHJlcXVlc3RlZCByZXN1bHQgb2Zmc2V0CiAgICAgKiAKICAgICAqIEByZXR1cm4gaW50ZWdlcgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0V2ViT2Zmc2V0KCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPndlYm9mZnNldDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgcmVxdWVzdGVkIHJlc3VsdCBvZmZzZXQKICAgICAqIAogICAgICogQHBhcmFtIGludGVnZXIgJHZhbHVlIFRoZSBuZXcgdmFsdWUKICAgICAqIAogICAgICogQHJldHVybiBNc2Z0X0JpbmdfU2VhcmNoCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRXZWJPZmZzZXQoJHZhbHVlKQogICAgewogICAgICAgICR0aGlzLT53ZWJvZmZzZXQgPSAkdGhpcy0+YmV0d2VlbigkdmFsdWUsIDAsIDEwMDApOwogICAgICAgIHJldHVybiAkdGhpczsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBCaW5nIEFQSSB2ZXJzaW9uIHVzZWQgYnkgdGhlIG9iamVjdAogICAgICogCiAgICAgKiBAcmV0dXJuIGZsb2F0CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRWZXJzaW9uKCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnZlcnNpb247ICAgICAgICAKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgQmluZyBBUEkgdmVyc2lvbiB0byB1c2UKICAgICAqIAogICAgICogQHBhcmFtIGZsb2F0ICR2YWx1ZSBUaGUgbmV3IHZhbHVlCiAgICAgKiAKICAgICAqIEByZXR1cm4gTXNmdF9CaW5nX1NlYXJjaAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0VmVyc2lvbigkdmFsdWUpCiAgICB7CiAgICAgICAgJHRoaXMtPnZlcnNpb24gPSAoZmxvYXQpJHZhbHVlOwogICAgICAgIHJldHVybiAkdGhpczsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcmVmZXJyZWQgZmlsZSB0eXBlcyBmb3IgdGhlIG9iamVjdAogICAgICogCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRGaWxlVHlwZXMoKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+ZmlsZXR5cGU7CiAgICB9IC8vIHB1YmxpYyBmdW5jdGlvbiBnZXRGaWxlVHlwZSgpCiAgICAKICAgIC8qKgogICAgICogVG9nZ2xlcyBhIHZhbHVlIGluIHRoZSBsaXN0IG9mIHByZWZlcnJlZCBmaWxlIHR5cGVzLiAKICAgICAqIAogICAgICogQHBhcmFtIHN0cmluZyAkdmFsdWUgVGhlIHZhbHVlIHRvIGJlIHRvZ2dsZWQKICAgICAqIAogICAgICogQHJldHVybiBNc2Z0X0JpbmdfU2VhcmNoCiAgICAgKiAKICAgICAqIEB0aHJvd3MgTXNmdF9CaW5nX1NlYXJjaF9FeGNlcHRpb24KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNldEZpbGVUeXBlKCR2YWx1ZSkKICAgIHsKICAgICAgICAkdmFsdWUgICA9IHN0cnRvdXBwZXIoJHZhbHVlKTsKICAgICAgICAkdGVzdEtleSA9IGFycmF5X3NlYXJjaCgkdmFsdWUsICR0aGlzLT52YWxpZEZpbGVUeXBlcyk7CiAgICAgICAgCiAgICAgICAgaWYgKCR0ZXN0S2V5IT09ZmFsc2UpIHsKICAgICAgICAgICAgJGtleSA9IGFycmF5X3NlYXJjaCgkdmFsdWUsICR0aGlzLT5maWxldHlwZSk7CiAgICAgICAgICAgIGlmICgka2V5PT09ZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+ZmlsZXR5cGVbXSA9ICR2YWx1ZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHVuc2V0KCR0aGlzLT5maWxldHlwZVska2V5XSk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aHJvdyBuZXcgTXNmdF9CaW5nX1NlYXJjaF9FeGNlcHRpb24oJHZhbHVlLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyBpcyBub3QgYSB2YWxpZCBGaWxlIFR5cGUnKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICR0aGlzOwogICAgfSAvLyBwdWJsaWMgZnVuY3Rpb24gc2V0RmlsZVR5cGUoJGtleSkKICAgIAogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBhcnJheSBvZiBmbGFncyBzcGVjaWZpZWQgZm9yIHRoZSBvYmplY3QKICAgICAqIAogICAgICogQHJldHVybiBhcnJheQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0RmxhZ3MoKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+ZmxhZ3M7CiAgICB9IC8vIHB1YmxpYyBmdW5jdGlvbiBnZXRGbGFnc3MoKQogICAgCiAgICAvKioKICAgICAqIFRvZ2dsZXMgYSB2YWx1ZSBpbiB0aGUgbGlzdCBvZiBhY2NlcHRhYmxlIGZsYWdzLgogICAgICogCiAgICAgKiBAcGFyYW0gc3RyaW5nICR2YWx1ZSBUaGUgdmFsdWUgdG8gYmUgdG9nZ2xlZAogICAgICogCiAgICAgKiBAcmV0dXJuIE1zZnRfQmluZ19TZWFyY2gKICAgICAqIAogICAgICogQHRocm93cyBNc2Z0X0JpbmdfU2VhcmNoX0V4Y2VwdGlvbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0RmxhZygkdmFsdWUpCiAgICB7CiAgICAgICAgJHRlc3RLZXkgPSBhcnJheV9zZWFyY2goJHZhbHVlLCAkdGhpcy0+dmFsaWRGbGFncyk7CiAgICAgICAgCiAgICAgICAgaWYgKCR0ZXN0S2V5IT09ZmFsc2UpIHsKICAgICAgICAgICAgJGtleSA9IGFycmF5X3NlYXJjaCgkdmFsdWUsICR0aGlzLT5mbGFncyk7CiAgICAgICAgICAgIGlmICgka2V5PT09ZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+ZmxhZ3NbXSA9ICR2YWx1ZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHVuc2V0KCR0aGlzLT5mbGFnc1ska2V5XSk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aHJvdyBuZXcgTXNmdF9CaW5nX1NlYXJjaF9FeGNlcHRpb24oJHZhbHVlLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyBpcyBub3QgYSB2YWxpZCBGbGFnLicpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJHRoaXM7CiAgICB9IC8vIHB1YmxpYyBmdW5jdGlvbiBzZXRPcHRpb24oJGtleSwgJHZhbHVlKQoKICAgIC8qKgogICAgICogUmV0dXJucyBhbiBhcnJheSBvZiB0aGUgc291cmNlcyBzcGVjaWZpZWQgZm9yIHRoZSBvYmplY3QKICAgICAqIAogICAgICogQHJldHVybiBhcnJheQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0U291cmNlcygpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5zb3VyY2VzOwogICAgfSAvLyBwdWJsaWMgZnVuY3Rpb24gZ2V0U291cmNlKCRrZXkpCiAgICAKICAgIC8qKgogICAgICogVG9nZ2xlcyBhIHZhbHVlIGluIHRoZSBsaXN0IG9mIHJlcXVlc3RlZCBzb3VyY2VzCiAgICAgKiAKICAgICAqIEBwYXJhbSBzdHJpbmcgJHZhbHVlIFRoZSB2YWx1ZSB0byBiZSB0b2dnbGVkCiAgICAgKiAKICAgICAqIEByZXR1cm4gTXNmdF9CaW5nX1NlYXJjaAogICAgICogCiAgICAgKiBAdGhyb3dzIE1zZnRfQmluZ19TZWFyY2hfRXhjZXB0aW9uCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRTb3VyY2UoJHZhbHVlKQogICAgewogICAgICAgICR0ZXN0S2V5ID0gYXJyYXlfc2VhcmNoKCR2YWx1ZSwgJHRoaXMtPnZhbGlkU291cmNlcyk7CiAgICAgICAgCiAgICAgICAgaWYgKCR0ZXN0S2V5IT09ZmFsc2UpIHsKICAgICAgICAgICAgJGtleSA9IGFycmF5X3NlYXJjaCgkdmFsdWUsICR0aGlzLT5zb3VyY2VzKTsKICAgICAgICAgICAgaWYgKCRrZXk9PT1mYWxzZSkgewogICAgICAgICAgICAgICAgICAgICR0aGlzLT5zb3VyY2VzW10gPSAkdmFsdWU7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB1bnNldCgkdGhpcy0+c291cmNlc1ska2V5XSk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aHJvdyBuZXcgTXNmdF9CaW5nX1NlYXJjaF9FeGNlcHRpb24oJHZhbHVlLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyBpcyBub3QgYSB2YWxpZCBTb3VyY2UuJyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkdGhpczsKICAgIH0gLy8gcHVibGljIGZ1bmN0aW9uIHNldFNvdXJjZSgka2V5LCAkdmFsdWUpCiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHNlYXJjaCBxdWVyeQogICAgICogCiAgICAgKiBAcGFyYW0gYm9vbCAkZW5jb2RlIHRydWUgaWYgdGhlIHJldHVybiB2YWx1ZSBzaG91bGQgYmUgdXJsZW5jb2RlZC4KICAgICAqIAogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldFF1ZXJ5KCRlbmNvZGU9ZmFsc2UpCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT5pc1NpdGVTcGVjaWZpYygpKSB7CiAgICAgICAgICAgICRyZXR1cm5WYWx1ZSA9ICdzaXRlOicuJHRoaXMtPmdldFNpdGUoKS4iICI7CiAgICAgICAgfQoKICAgICAgICAkcmV0dXJuVmFsdWUgLj0gJHRoaXMtPnF1ZXJ5OyAgICAKICAgICAgICAKICAgICAgICBpZiAoJGVuY29kZSkgewogICAgICAgICAgICAkcmV0dXJuVmFsdWUgPSB1cmxlbmNvZGUoJHJldHVyblZhbHVlKTsKICAgICAgICB9IC8vIGlmICgkZW5jb2RlKQogICAgICAgIAogICAgICAgIHJldHVybiAkcmV0dXJuVmFsdWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXRzIHRoZSBzZWFyY2ggcXVlcnkKICAgICAqIAogICAgICogQHBhcmFtIHN0cmluZyAkdmFsdWUgdGhlIG5ldyB2YWx1ZQogICAgICogCiAgICAgKiBAcmV0dXJuIE1zZnRfQmluZ19TZWFyY2gKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNldFF1ZXJ5KCR2YWx1ZSkKICAgIHsKICAgICAgICAkdGhpcy0+cXVlcnkgPSAkdmFsdWU7CiAgICAgICAgcmV0dXJuICR0aGlzOwogICAgfSAvLyBwdWJsaWMgZnVuY3Rpb24gc2V0U291cmNlKCRrZXksICR2YWx1ZSkKICAgICAgICAKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHNpdGUgc3BlY2lmaWVkIGZvciBhIHNpdGUtc3BlY2lmaWMgc2VhcmNoLgogICAgICogCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0U2l0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5zaXRlOwogICAgfQoKICAgIC8qKgogICAgICogU2V0cyB0aGUgc2l0ZSBhZGRyZXNzIGZvciBhIHNpdGUtc3BlY2lmaWMgc2VhcmNoCiAgICAgKiAKICAgICAqIEBwYXJhbSBzdHJpbmcgJHZhbHVlIFRoZSBzaXRlIGFkZHJlc3MgKG5vIGh0dHA6Ly8gb3IgaHR0cHM6Ly8pCiAgICAgKiAKICAgICAqIEByZXR1cm4gTXNmdF9CaW5nX1NlYXJjaAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0U2l0ZSgkdmFsdWUpCiAgICB7CiAgICAgICAgJHRoaXMtPnNpdGUgPSAkdmFsdWU7CiAgICAgICAgcmV0dXJuICR0aGlzOwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2VhcmNoIGlzIHNpdGUgc3BlY2lmaWMKICAgICAqIAogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBpc1NpdGVTcGVjaWZpYygpCiAgICB7CiAgICAgICAgcmV0dXJuIChpc3NldCgkdGhpcy0+c2l0ZSkgYW5kCiAgICAgICAgICAgICAgICAhZW1wdHkoJHRoaXMtPnNpdGUpKTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIFVSTCBvZiB0aGUgbGFzdCBzZWFyY2ggZXhlY3V0ZWQgYnkgdGhlIG9iamVjdAogICAgICogCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0VXJsKCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnVybDsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/class.Msft_Bing_Search_Exception.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9QSFAKLyoqCiAqIE1pY3Jvc29mdCBCaW5nIFNlYXJjaAogKiAKICogUEhQIGxpYnJhcnkgdG8gc3VwcG9ydCB0aGUgTWljcm9zb2Z0IEJpbmcgU2VhcmNoIEFQSS4KICoKICogUEhQIFZlcnNpb24gNQogKiAgCiAqIEBjYXRlZ29yeSAgTXNmdAogKiBAcGFja2FnZSAgIE1zZnQKICogQGF1dGhvciAgICBDYWwgRXZhbnMgCiAqIEBjb3B5cmlnaHQgMjAxMCBNaWNyb3NvZnQKICogQGxpY2Vuc2UgICBOZXcgQlNEIExpY2Vuc2UgKEJTRCkgaHR0cDovL2JpbmdwaHAuY29kZXBsZXguY29tL2xpY2Vuc2UKICogQHZlcnNpb24gICBTVk46ICRJZDogRXhjZXB0aW9uLnBocCA0OCAyMDEwLTAzLTIwIDE0OjIzOjQxWiBjYWwgJAogKiBAbGluayAgICAgIGh0dHA6Ly9iaW5ncGhwLmNvZGVwbGV4LmNvbQogKgogKi8KCi8qKgogKiBFeGNlcHRpb24gY2xhc3MgZm9yIHRoZSBNaWNyb3NvZnQgQmluZyBTZWFyY2ggTGlicmFyeQogKiAKICogQGNhdGVnb3J5ICAgTXNmdAogKiBAcGFja2FnZSAgICBNc2Z0CiAqIEBzdWJwYWNrYWdlIEJpbmcKICogQGF1dGhvciAgICAgQ2FsIEV2YW5zIAogKiBAbGljZW5zZSAgICBOZXcgQlNEIExpY2Vuc2UgKEJTRCkgaHR0cDovL2JpbmdwaHAuY29kZXBsZXguY29tL2xpY2Vuc2UKICogQGxpbmsgICAgICAgaHR0cDovL2JpbmdwaHAuY29kZXBsZXguY29tCiAqLwpjbGFzcyBNc2Z0X0JpbmdfU2VhcmNoX0V4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbgp7CiAgICAKfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/class.SimplePie.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIFNpbXBsZVBpZQogKgogKiBBIFBIUC1CYXNlZCBSU1MgYW5kIEF0b20gRmVlZCBGcmFtZXdvcmsuCiAqIFRha2VzIHRoZSBoYXJkIHdvcmsgb3V0IG9mIG1hbmFnaW5nIGEgY29tcGxldGUgUlNTL0F0b20gc29sdXRpb24uCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA4LCBSeWFuIFBhcm1hbiBhbmQgR2VvZmZyZXkgU25lZGRvbgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKgogKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUKICogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CiAqCiAqIAkqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mCiAqIAkgIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KICoKICogCSogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3QKICogCSAgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKICogCSAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgogKgogKiAJKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTaW1wbGVQaWUgVGVhbSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQKICogCSAgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKICogCSAgd3JpdHRlbiBwZXJtaXNzaW9uLgogKgogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTCiAqIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZCiAqIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVJTCiAqIEFORCBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgogKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCiAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCiAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SCiAqIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAqCiAqIEBwYWNrYWdlIFNpbXBsZVBpZQogKiBAdmVyc2lvbiAxLjEuMwogKiBAY29weXJpZ2h0IDIwMDQtMjAwOCBSeWFuIFBhcm1hbiwgR2VvZmZyZXkgU25lZGRvbgogKiBAYXV0aG9yIFJ5YW4gUGFybWFuCiAqIEBhdXRob3IgR2VvZmZyZXkgU25lZGRvbgogKiBAbGluayBodHRwOi8vc2ltcGxlcGllLm9yZy8gU2ltcGxlUGllCiAqIEBsaW5rIGh0dHA6Ly9zaW1wbGVwaWUub3JnL3N1cHBvcnQvIFBsZWFzZSBzdWJtaXQgYWxsIGJ1ZyByZXBvcnRzIGFuZCBmZWF0dXJlIHJlcXVlc3RzIHRvIHRoZSBTaW1wbGVQaWUgZm9ydW1zCiAqIEBsaWNlbnNlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UucGhwIEJTRCBMaWNlbnNlCiAqIEB0b2RvIHBocERvYyBjb21tZW50cwogKi8KCi8qKgogKiBTaW1wbGVQaWUgTmFtZQogKi8KZGVmaW5lKCdTSU1QTEVQSUVfTkFNRScsICdTaW1wbGVQaWUnKTsKCi8qKgogKiBTaW1wbGVQaWUgVmVyc2lvbgogKi8KZGVmaW5lKCdTSU1QTEVQSUVfVkVSU0lPTicsICcxLjEuMycpOwoKLyoqCiAqIFNpbXBsZVBpZSBCdWlsZAogKi8KZGVmaW5lKCdTSU1QTEVQSUVfQlVJTEQnLCAyMDA4MTIxOSk7CgovKioKICogU2ltcGxlUGllIFdlYnNpdGUgVVJMCiAqLwpkZWZpbmUoJ1NJTVBMRVBJRV9VUkwnLCAnaHR0cDovL3NpbXBsZXBpZS5vcmcnKTsKCi8qKgogKiBTaW1wbGVQaWUgVXNlcmFnZW50CiAqIEBzZWUgU2ltcGxlUGllOjpzZXRfdXNlcmFnZW50KCkKICovCmRlZmluZSgnU0lNUExFUElFX1VTRVJBR0VOVCcsIFNJTVBMRVBJRV9OQU1FIC4gJy8nIC4gU0lNUExFUElFX1ZFUlNJT04gLiAnIChGZWVkIFBhcnNlcjsgJyAuIFNJTVBMRVBJRV9VUkwgLiAnOyBBbGxvdyBsaWtlIEdlY2tvKSBCdWlsZC8nIC4gU0lNUExFUElFX0JVSUxEKTsKCi8qKgogKiBTaW1wbGVQaWUgTGlua2JhY2sKICovCmRlZmluZSgnU0lNUExFUElFX0xJTktCQUNLJywgJzxhIGhyZWY9IicgLiBTSU1QTEVQSUVfVVJMIC4gJyIgdGl0bGU9IicgLiBTSU1QTEVQSUVfTkFNRSAuICcgJyAuIFNJTVBMRVBJRV9WRVJTSU9OIC4gJyI+JyAuIFNJTVBMRVBJRV9OQU1FIC4gJzwvYT4nKTsKCi8qKgogKiBObyBBdXRvZGlzY292ZXJ5CiAqIEBzZWUgU2ltcGxlUGllOjpzZXRfYXV0b2Rpc2NvdmVyeV9sZXZlbCgpCiAqLwpkZWZpbmUoJ1NJTVBMRVBJRV9MT0NBVE9SX05PTkUnLCAwKTsKCi8qKgogKiBGZWVkIExpbmsgRWxlbWVudCBBdXRvZGlzY292ZXJ5CiAqIEBzZWUgU2ltcGxlUGllOjpzZXRfYXV0b2Rpc2NvdmVyeV9sZXZlbCgpCiAqLwpkZWZpbmUoJ1NJTVBMRVBJRV9MT0NBVE9SX0FVVE9ESVNDT1ZFUlknLCAxKTsKCi8qKgogKiBMb2NhbCBGZWVkIEV4dGVuc2lvbiBBdXRvZGlzY292ZXJ5CiAqIEBzZWUgU2ltcGxlUGllOjpzZXRfYXV0b2Rpc2NvdmVyeV9sZXZlbCgpCiAqLwpkZWZpbmUoJ1NJTVBMRVBJRV9MT0NBVE9SX0xPQ0FMX0VYVEVOU0lPTicsIDIpOwoKLyoqCiAqIExvY2FsIEZlZWQgQm9keSBBdXRvZGlzY292ZXJ5CiAqIEBzZWUgU2ltcGxlUGllOjpzZXRfYXV0b2Rpc2NvdmVyeV9sZXZlbCgpCiAqLwpkZWZpbmUoJ1NJTVBMRVBJRV9MT0NBVE9SX0xPQ0FMX0JPRFknLCA0KTsKCi8qKgogKiBSZW1vdGUgRmVlZCBFeHRlbnNpb24gQXV0b2Rpc2NvdmVyeQogKiBAc2VlIFNpbXBsZVBpZTo6c2V0X2F1dG9kaXNjb3ZlcnlfbGV2ZWwoKQogKi8KZGVmaW5lKCdTSU1QTEVQSUVfTE9DQVRPUl9SRU1PVEVfRVhURU5TSU9OJywgOCk7CgovKioKICogUmVtb3RlIEZlZWQgQm9keSBBdXRvZGlzY292ZXJ5CiAqIEBzZWUgU2ltcGxlUGllOjpzZXRfYXV0b2Rpc2NvdmVyeV9sZXZlbCgpCiAqLwpkZWZpbmUoJ1NJTVBMRVBJRV9MT0NBVE9SX1JFTU9URV9CT0RZJywgMTYpOwoKLyoqCiAqIEFsbCBGZWVkIEF1dG9kaXNjb3ZlcnkKICogQHNlZSBTaW1wbGVQaWU6OnNldF9hdXRvZGlzY292ZXJ5X2xldmVsKCkKICovCmRlZmluZSgnU0lNUExFUElFX0xPQ0FUT1JfQUxMJywgMzEpOwoKLyoqCiAqIE5vIGtub3duIGZlZWQgdHlwZQogKi8KZGVmaW5lKCdTSU1QTEVQSUVfVFlQRV9OT05FJywgMCk7CgovKioKICogUlNTIDAuOTAKICovCmRlZmluZSgnU0lNUExFUElFX1RZUEVfUlNTXzA5MCcsIDEpOwoKLyoqCiAqIFJTUyAwLjkxIChOZXRzY2FwZSkKICovCmRlZmluZSgnU0lNUExFUElFX1RZUEVfUlNTXzA5MV9ORVRTQ0FQRScsIDIpOwoKLyoqCiAqIFJTUyAwLjkxIChVc2VybGFuZCkKICovCmRlZmluZSgnU0lNUExFUElFX1RZUEVfUlNTXzA5MV9VU0VSTEFORCcsIDQpOwoKLyoqCiAqIFJTUyAwLjkxIChib3RoIE5ldHNjYXBlIGFuZCBVc2VybGFuZCkKICovCmRlZmluZSgnU0lNUExFUElFX1RZUEVfUlNTXzA5MScsIDYpOwoKLyoqCiAqIFJTUyAwLjkyCiAqLwpkZWZpbmUoJ1NJTVBMRVBJRV9UWVBFX1JTU18wOTInLCA4KTsKCi8qKgogKiBSU1MgMC45MwogKi8KZGVmaW5lKCdTSU1QTEVQSUVfVFlQRV9SU1NfMDkzJywgMTYpOwoKLyoqCiAqIFJTUyAwLjk0CiAqLwpkZWZpbmUoJ1NJTVBMRVBJRV9UWVBFX1JTU18wOTQnLCAzMik7CgovKioKICogUlNTIDEuMAogKi8KZGVmaW5lKCdTSU1QTEVQSUVfVFlQRV9SU1NfMTAnLCA2NCk7CgovKioKICogUlNTIDIuMAogKi8KZGVmaW5lKCdTSU1QTEVQSUVfVFlQRV9SU1NfMjAnLCAxMjgpOwoKLyoqCiAqIFJERi1iYXNlZCBSU1MKICovCmRlZmluZSgnU0lNUExFUElFX1RZUEVfUlNTX1JERicsIDY1KTsKCi8qKgogKiBOb24tUkRGLWJhc2VkIFJTUyAodHJ1bHkgaW50ZW5kZWQgYXMgc3luZGljYXRpb24gZm9ybWF0KQogKi8KZGVmaW5lKCdTSU1QTEVQSUVfVFlQRV9SU1NfU1lORElDQVRJT04nLCAxOTApOwoKLyoqCiAqIEFsbCBSU1MKICovCmRlZmluZSgnU0lNUExFUElFX1RZUEVfUlNTX0FMTCcsIDI1NSk7CgovKioKICogQXRvbSAwLjMKICovCmRlZmluZSgnU0lNUExFUElFX1RZUEVfQVRPTV8wMycsIDI1Nik7CgovKioKICogQXRvbSAxLjAKICovCmRlZmluZSgnU0lNUExFUElFX1RZUEVfQVRPTV8xMCcsIDUxMik7CgovKioKICogQWxsIEF0b20KICovCmRlZmluZSgnU0lNUExFUElFX1RZUEVfQVRPTV9BTEwnLCA3NjgpOwoKLyoqCiAqIEFsbCBmZWVkIHR5cGVzCiAqLwpkZWZpbmUoJ1NJTVBMRVBJRV9UWVBFX0FMTCcsIDEwMjMpOwoKLyoqCiAqIE5vIGNvbnN0cnVjdAogKi8KZGVmaW5lKCdTSU1QTEVQSUVfQ09OU1RSVUNUX05PTkUnLCAwKTsKCi8qKgogKiBUZXh0IGNvbnN0cnVjdAogKi8KZGVmaW5lKCdTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQnLCAxKTsKCi8qKgogKiBIVE1MIGNvbnN0cnVjdAogKi8KZGVmaW5lKCdTSU1QTEVQSUVfQ09OU1RSVUNUX0hUTUwnLCAyKTsKCi8qKgogKiBYSFRNTCBjb25zdHJ1Y3QKICovCmRlZmluZSgnU0lNUExFUElFX0NPTlNUUlVDVF9YSFRNTCcsIDQpOwoKLyoqCiAqIGJhc2U2NC1lbmNvZGVkIGNvbnN0cnVjdAogKi8KZGVmaW5lKCdTSU1QTEVQSUVfQ09OU1RSVUNUX0JBU0U2NCcsIDgpOwoKLyoqCiAqIElSSSBjb25zdHJ1Y3QKICovCmRlZmluZSgnU0lNUExFUElFX0NPTlNUUlVDVF9JUkknLCAxNik7CgovKioKICogQSBjb25zdHJ1Y3QgdGhhdCBtaWdodCBiZSBIVE1MCiAqLwpkZWZpbmUoJ1NJTVBMRVBJRV9DT05TVFJVQ1RfTUFZQkVfSFRNTCcsIDMyKTsKCi8qKgogKiBBbGwgY29uc3RydWN0cwogKi8KZGVmaW5lKCdTSU1QTEVQSUVfQ09OU1RSVUNUX0FMTCcsIDYzKTsKCi8qKgogKiBQQ1JFIGZvciBIVE1MIGF0dHJpYnV0ZXMKICovCmRlZmluZSgnU0lNUExFUElFX1BDUkVfSFRNTF9BVFRSSUJVVEUnLCAnKCg/OltceDA5XHgwQVx4MEJceDBDXHgwRFx4MjBdK1teXHgwOVx4MEFceDBCXHgwQ1x4MERceDIwXHgyRlx4M0VdW15ceDA5XHgwQVx4MEJceDBDXHgwRFx4MjBceDJGXHgzRFx4M0VdKig/OltceDA5XHgwQVx4MEJceDBDXHgwRFx4MjBdKj1bXHgwOVx4MEFceDBCXHgwQ1x4MERceDIwXSooPzoiKD86W14iXSopInxcJyg/OlteXCddKilcJ3woPzpbXlx4MDlceDBBXHgwQlx4MENceDBEXHgyMFx4MjJceDI3XHgzRV1bXlx4MDlceDBBXHgwQlx4MENceDBEXHgyMFx4M0VdKik/KSk/KSopW1x4MDlceDBBXHgwQlx4MENceDBEXHgyMF0qJyk7CgovKioKICogUENSRSBmb3IgWE1MIGF0dHJpYnV0ZXMKICovCmRlZmluZSgnU0lNUExFUElFX1BDUkVfWE1MX0FUVFJJQlVURScsICcoKD86XHMrKD86KD86W15cczpdKzopP1teXHM6XSspXHMqPVxzKig/OiIoPzpbXiJdKikifFwnKD86W15cJ10qKVwnKSkqKVxzKicpOwoKLyoqCiAqIFhNTCBOYW1lc3BhY2UKICovCmRlZmluZSgnU0lNUExFUElFX05BTUVTUEFDRV9YTUwnLCAnaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlJyk7CgovKioKICogQXRvbSAxLjAgTmFtZXNwYWNlCiAqLwpkZWZpbmUoJ1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMCcsICdodHRwOi8vd3d3LnczLm9yZy8yMDA1L0F0b20nKTsKCi8qKgogKiBBdG9tIDAuMyBOYW1lc3BhY2UKICovCmRlZmluZSgnU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzAzJywgJ2h0dHA6Ly9wdXJsLm9yZy9hdG9tL25zIycpOwoKLyoqCiAqIFJERiBOYW1lc3BhY2UKICovCmRlZmluZSgnU0lNUExFUElFX05BTUVTUEFDRV9SREYnLCAnaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIycpOwoKLyoqCiAqIFJTUyAwLjkwIE5hbWVzcGFjZQogKi8KZGVmaW5lKCdTSU1QTEVQSUVfTkFNRVNQQUNFX1JTU18wOTAnLCAnaHR0cDovL215Lm5ldHNjYXBlLmNvbS9yZGYvc2ltcGxlLzAuOS8nKTsKCi8qKgogKiBSU1MgMS4wIE5hbWVzcGFjZQogKi8KZGVmaW5lKCdTSU1QTEVQSUVfTkFNRVNQQUNFX1JTU18xMCcsICdodHRwOi8vcHVybC5vcmcvcnNzLzEuMC8nKTsKCi8qKgogKiBSU1MgMS4wIENvbnRlbnQgTW9kdWxlIE5hbWVzcGFjZQogKi8KZGVmaW5lKCdTSU1QTEVQSUVfTkFNRVNQQUNFX1JTU18xMF9NT0RVTEVTX0NPTlRFTlQnLCAnaHR0cDovL3B1cmwub3JnL3Jzcy8xLjAvbW9kdWxlcy9jb250ZW50LycpOwoKLyoqCiAqIFJTUyAyLjAgTmFtZXNwYWNlCiAqIChTdHVwaWQsIEkga25vdywgYnV0IEknbSBjZXJ0YWluIGl0IHdpbGwgY29uZnVzZSBwZW9wbGUgbGVzcyB3aXRoIHN1cHBvcnQuKQogKi8KZGVmaW5lKCdTSU1QTEVQSUVfTkFNRVNQQUNFX1JTU18yMCcsICcnKTsKCi8qKgogKiBEQyAxLjAgTmFtZXNwYWNlCiAqLwpkZWZpbmUoJ1NJTVBMRVBJRV9OQU1FU1BBQ0VfRENfMTAnLCAnaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMC8nKTsKCi8qKgogKiBEQyAxLjEgTmFtZXNwYWNlCiAqLwpkZWZpbmUoJ1NJTVBMRVBJRV9OQU1FU1BBQ0VfRENfMTEnLCAnaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8nKTsKCi8qKgogKiBXM0MgQmFzaWMgR2VvIChXR1M4NCBsYXQvbG9uZykgVm9jYWJ1bGFyeSBOYW1lc3BhY2UKICovCmRlZmluZSgnU0lNUExFUElFX05BTUVTUEFDRV9XM0NfQkFTSUNfR0VPJywgJ2h0dHA6Ly93d3cudzMub3JnLzIwMDMvMDEvZ2VvL3dnczg0X3BvcyMnKTsKCi8qKgogKiBHZW9SU1MgTmFtZXNwYWNlCiAqLwpkZWZpbmUoJ1NJTVBMRVBJRV9OQU1FU1BBQ0VfR0VPUlNTJywgJ2h0dHA6Ly93d3cuZ2VvcnNzLm9yZy9nZW9yc3MnKTsKCi8qKgogKiBNZWRpYSBSU1MgTmFtZXNwYWNlCiAqLwpkZWZpbmUoJ1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1MnLCAnaHR0cDovL3NlYXJjaC55YWhvby5jb20vbXJzcy8nKTsKCi8qKgogKiBXcm9uZyBNZWRpYSBSU1MgTmFtZXNwYWNlCiAqLwpkZWZpbmUoJ1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NfV1JPTkcnLCAnaHR0cDovL3NlYXJjaC55YWhvby5jb20vbXJzcycpOwoKLyoqCiAqIGlUdW5lcyBSU1MgTmFtZXNwYWNlCiAqLwpkZWZpbmUoJ1NJTVBMRVBJRV9OQU1FU1BBQ0VfSVRVTkVTJywgJ2h0dHA6Ly93d3cuaXR1bmVzLmNvbS9kdGRzL3BvZGNhc3QtMS4wLmR0ZCcpOwoKLyoqCiAqIFhIVE1MIE5hbWVzcGFjZQogKi8KZGVmaW5lKCdTSU1QTEVQSUVfTkFNRVNQQUNFX1hIVE1MJywgJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnKTsKCi8qKgogKiBJQU5BIExpbmsgUmVsYXRpb25zIFJlZ2lzdHJ5CiAqLwpkZWZpbmUoJ1NJTVBMRVBJRV9JQU5BX0xJTktfUkVMQVRJT05TX1JFR0lTVFJZJywgJ2h0dHA6Ly93d3cuaWFuYS5vcmcvYXNzaWdubWVudHMvcmVsYXRpb24vJyk7CgovKioKICogV2hldGhlciB3ZSdyZSBydW5uaW5nIG9uIFBIUDUKICovCmRlZmluZSgnU0lNUExFUElFX1BIUDUnLCB2ZXJzaW9uX2NvbXBhcmUoUEhQX1ZFUlNJT04sICc1LjAuMCcsICc+PScpKTsKCi8qKgogKiBObyBmaWxlIHNvdXJjZQogKi8KZGVmaW5lKCdTSU1QTEVQSUVfRklMRV9TT1VSQ0VfTk9ORScsIDApOwoKLyoqCiAqIFJlbW90ZSBmaWxlIHNvdXJjZQogKi8KZGVmaW5lKCdTSU1QTEVQSUVfRklMRV9TT1VSQ0VfUkVNT1RFJywgMSk7CgovKioKICogTG9jYWwgZmlsZSBzb3VyY2UKICovCmRlZmluZSgnU0lNUExFUElFX0ZJTEVfU09VUkNFX0xPQ0FMJywgMik7CgovKioKICogZnNvY2tvcGVuKCkgZmlsZSBzb3VyY2UKICovCmRlZmluZSgnU0lNUExFUElFX0ZJTEVfU09VUkNFX0ZTT0NLT1BFTicsIDQpOwoKLyoqCiAqIGNVUkwgZmlsZSBzb3VyY2UKICovCmRlZmluZSgnU0lNUExFUElFX0ZJTEVfU09VUkNFX0NVUkwnLCA4KTsKCi8qKgogKiBmaWxlX2dldF9jb250ZW50cygpIGZpbGUgc291cmNlCiAqLwpkZWZpbmUoJ1NJTVBMRVBJRV9GSUxFX1NPVVJDRV9GSUxFX0dFVF9DT05URU5UUycsIDE2KTsKCi8qKgogKiBTaW1wbGVQaWUKICoKICogQHBhY2thZ2UgU2ltcGxlUGllCiAqIEB2ZXJzaW9uICJSYXp6bGViZXJyeSIKICogQGNvcHlyaWdodCAyMDA0LTIwMDcgUnlhbiBQYXJtYW4sIEdlb2ZmcmV5IFNuZWRkb24KICogQGF1dGhvciBSeWFuIFBhcm1hbgogKiBAYXV0aG9yIEdlb2ZmcmV5IFNuZWRkb24KICogQHRvZG8gT3B0aW9uIGZvciB0eXBlIG9mIGZldGNoaW5nIChjYWNoZSwgbm90IG1vZGlmaWVkIGhlYWRlciwgZmV0Y2gsIGV0Yy4pCiAqLwpjbGFzcyBTaW1wbGVQaWUKewoJLyoqCgkgKiBAdmFyIGFycmF5IFJhdyBkYXRhCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJdmFyICRkYXRhID0gYXJyYXkoKTsKCgkvKioKCSAqIEB2YXIgbWl4ZWQgRXJyb3Igc3RyaW5nCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJdmFyICRlcnJvcjsKCgkvKioKCSAqIEB2YXIgb2JqZWN0IEluc3RhbmNlIG9mIFNpbXBsZVBpZV9TYW5pdGl6ZSAob3Igb3RoZXIgY2xhc3MpCgkgKiBAc2VlIFNpbXBsZVBpZTo6c2V0X3Nhbml0aXplX2NsYXNzKCkKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCgl2YXIgJHNhbml0aXplOwoKCS8qKgoJICogQHZhciBzdHJpbmcgU2ltcGxlUGllIFVzZXJhZ2VudAoJICogQHNlZSBTaW1wbGVQaWU6OnNldF91c2VyYWdlbnQoKQoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCXZhciAkdXNlcmFnZW50ID0gU0lNUExFUElFX1VTRVJBR0VOVDsKCgkvKioKCSAqIEB2YXIgc3RyaW5nIEZlZWQgVVJMCgkgKiBAc2VlIFNpbXBsZVBpZTo6c2V0X2ZlZWRfdXJsKCkKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCgl2YXIgJGZlZWRfdXJsOwoKCS8qKgoJICogQHZhciBvYmplY3QgSW5zdGFuY2Ugb2YgU2ltcGxlUGllX0ZpbGUgdG8gdXNlIGFzIGEgZmVlZAoJICogQHNlZSBTaW1wbGVQaWU6OnNldF9maWxlKCkKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCgl2YXIgJGZpbGU7CgoJLyoqCgkgKiBAdmFyIHN0cmluZyBSYXcgZmVlZCBkYXRhCgkgKiBAc2VlIFNpbXBsZVBpZTo6c2V0X3Jhd19kYXRhKCkKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCgl2YXIgJHJhd19kYXRhOwoKCS8qKgoJICogQHZhciBpbnQgVGltZW91dCBmb3IgZmV0Y2hpbmcgcmVtb3RlIGZpbGVzCgkgKiBAc2VlIFNpbXBsZVBpZTo6c2V0X3RpbWVvdXQoKQoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCXZhciAkdGltZW91dCA9IDEwOwoKCS8qKgoJICogQHZhciBib29sIEZvcmNlcyBmc29ja29wZW4oKSB0byBiZSB1c2VkIGZvciByZW1vdGUgZmlsZXMgaW5zdGVhZAoJICogb2YgY1VSTCwgZXZlbiBpZiBhIG5ldyBlbm91Z2ggdmVyc2lvbiBpcyBpbnN0YWxsZWQKCSAqIEBzZWUgU2ltcGxlUGllOjpmb3JjZV9mc29ja29wZW4oKQoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCXZhciAkZm9yY2VfZnNvY2tvcGVuID0gZmFsc2U7CgoJLyoqCgkgKiBAdmFyIGJvb2wgRm9yY2UgdGhlIGdpdmVuIGRhdGEvVVJMIHRvIGJlIHRyZWF0ZWQgYXMgYSBmZWVkIG5vIG1hdHRlciB3aGF0CgkgKiBpdCBhcHBlYXJzIGxpa2UKCSAqIEBzZWUgU2ltcGxlUGllOjpmb3JjZV9mZWVkKCkKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCgl2YXIgJGZvcmNlX2ZlZWQgPSBmYWxzZTsKCgkvKioKCSAqIEB2YXIgYm9vbCBFbmFibGUvRGlzYWJsZSBYTUwgZHVtcAoJICogQHNlZSBTaW1wbGVQaWU6OmVuYWJsZV94bWxfZHVtcCgpCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJdmFyICR4bWxfZHVtcCA9IGZhbHNlOwoKCS8qKgoJICogQHZhciBib29sIEVuYWJsZS9EaXNhYmxlIENhY2hpbmcKCSAqIEBzZWUgU2ltcGxlUGllOjplbmFibGVfY2FjaGUoKQoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCXZhciAkY2FjaGUgPSB0cnVlOwoKCS8qKgoJICogQHZhciBpbnQgQ2FjaGUgZHVyYXRpb24gKGluIHNlY29uZHMpCgkgKiBAc2VlIFNpbXBsZVBpZTo6c2V0X2NhY2hlX2R1cmF0aW9uKCkKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCgl2YXIgJGNhY2hlX2R1cmF0aW9uID0gMzYwMDsKCgkvKioKCSAqIEB2YXIgaW50IEF1dG8tZGlzY292ZXJ5IGNhY2hlIGR1cmF0aW9uIChpbiBzZWNvbmRzKQoJICogQHNlZSBTaW1wbGVQaWU6OnNldF9hdXRvZGlzY292ZXJ5X2NhY2hlX2R1cmF0aW9uKCkKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCgl2YXIgJGF1dG9kaXNjb3ZlcnlfY2FjaGVfZHVyYXRpb24gPSA2MDQ4MDA7IC8vIDcgRGF5cy4KCgkvKioKCSAqIEB2YXIgc3RyaW5nIENhY2hlIGxvY2F0aW9uIChyZWxhdGl2ZSB0byBleGVjdXRpbmcgc2NyaXB0KQoJICogQHNlZSBTaW1wbGVQaWU6OnNldF9jYWNoZV9sb2NhdGlvbigpCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJdmFyICRjYWNoZV9sb2NhdGlvbiA9ICcuL2NhY2hlJzsKCgkvKioKCSAqIEB2YXIgc3RyaW5nIEZ1bmN0aW9uIHRoYXQgY3JlYXRlcyB0aGUgY2FjaGUgZmlsZW5hbWUKCSAqIEBzZWUgU2ltcGxlUGllOjpzZXRfY2FjaGVfbmFtZV9mdW5jdGlvbigpCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJdmFyICRjYWNoZV9uYW1lX2Z1bmN0aW9uID0gJ21kNSc7CgoJLyoqCgkgKiBAdmFyIGJvb2wgUmVvcmRlciBmZWVkIGJ5IGRhdGUgZGVzY2VuZGluZwoJICogQHNlZSBTaW1wbGVQaWU6OmVuYWJsZV9vcmRlcl9ieV9kYXRlKCkKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCgl2YXIgJG9yZGVyX2J5X2RhdGUgPSB0cnVlOwoKCS8qKgoJICogQHZhciBtaXhlZCBGb3JjZSBpbnB1dCBlbmNvZGluZyB0byBiZSBzZXQgdG8gdGhlIGZvbGxvdyB2YWx1ZQoJICogKGZhbHNlLCBvciBhbnl0aGluZyB0eXBlLWNhc3QgdG8gZmFsc2UsIGRpc2FibGVzIHRoaXMgZmVhdHVyZSkKCSAqIEBzZWUgU2ltcGxlUGllOjpzZXRfaW5wdXRfZW5jb2RpbmcoKQoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCXZhciAkaW5wdXRfZW5jb2RpbmcgPSBmYWxzZTsKCgkvKioKCSAqIEB2YXIgaW50IEZlZWQgQXV0b2Rpc2NvdmVyeSBMZXZlbAoJICogQHNlZSBTaW1wbGVQaWU6OnNldF9hdXRvZGlzY292ZXJ5X2xldmVsKCkKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCgl2YXIgJGF1dG9kaXNjb3ZlcnkgPSBTSU1QTEVQSUVfTE9DQVRPUl9BTEw7CgoJLyoqCgkgKiBAdmFyIHN0cmluZyBDbGFzcyB1c2VkIGZvciBjYWNoaW5nIGZlZWRzCgkgKiBAc2VlIFNpbXBsZVBpZTo6c2V0X2NhY2hlX2NsYXNzKCkKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCgl2YXIgJGNhY2hlX2NsYXNzID0gJ1NpbXBsZVBpZV9DYWNoZSc7CgoJLyoqCgkgKiBAdmFyIHN0cmluZyBDbGFzcyB1c2VkIGZvciBsb2NhdGluZyBmZWVkcwoJICogQHNlZSBTaW1wbGVQaWU6OnNldF9sb2NhdG9yX2NsYXNzKCkKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCgl2YXIgJGxvY2F0b3JfY2xhc3MgPSAnU2ltcGxlUGllX0xvY2F0b3InOwoKCS8qKgoJICogQHZhciBzdHJpbmcgQ2xhc3MgdXNlZCBmb3IgcGFyc2luZyBmZWVkcwoJICogQHNlZSBTaW1wbGVQaWU6OnNldF9wYXJzZXJfY2xhc3MoKQoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCXZhciAkcGFyc2VyX2NsYXNzID0gJ1NpbXBsZVBpZV9QYXJzZXInOwoKCS8qKgoJICogQHZhciBzdHJpbmcgQ2xhc3MgdXNlZCBmb3IgZmV0Y2hpbmcgZmVlZHMKCSAqIEBzZWUgU2ltcGxlUGllOjpzZXRfZmlsZV9jbGFzcygpCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJdmFyICRmaWxlX2NsYXNzID0gJ1NpbXBsZVBpZV9GaWxlJzsKCgkvKioKCSAqIEB2YXIgc3RyaW5nIENsYXNzIHVzZWQgZm9yIGl0ZW1zCgkgKiBAc2VlIFNpbXBsZVBpZTo6c2V0X2l0ZW1fY2xhc3MoKQoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCXZhciAkaXRlbV9jbGFzcyA9ICdTaW1wbGVQaWVfSXRlbSc7CgoJLyoqCgkgKiBAdmFyIHN0cmluZyBDbGFzcyB1c2VkIGZvciBhdXRob3JzCgkgKiBAc2VlIFNpbXBsZVBpZTo6c2V0X2F1dGhvcl9jbGFzcygpCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJdmFyICRhdXRob3JfY2xhc3MgPSAnU2ltcGxlUGllX0F1dGhvcic7CgoJLyoqCgkgKiBAdmFyIHN0cmluZyBDbGFzcyB1c2VkIGZvciBjYXRlZ29yaWVzCgkgKiBAc2VlIFNpbXBsZVBpZTo6c2V0X2NhdGVnb3J5X2NsYXNzKCkKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCgl2YXIgJGNhdGVnb3J5X2NsYXNzID0gJ1NpbXBsZVBpZV9DYXRlZ29yeSc7CgoJLyoqCgkgKiBAdmFyIHN0cmluZyBDbGFzcyB1c2VkIGZvciBlbmNsb3N1cmVzCgkgKiBAc2VlIFNpbXBsZVBpZTo6c2V0X2VuY2xvc3VyZXNfY2xhc3MoKQoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCXZhciAkZW5jbG9zdXJlX2NsYXNzID0gJ1NpbXBsZVBpZV9FbmNsb3N1cmUnOwoKCS8qKgoJICogQHZhciBzdHJpbmcgQ2xhc3MgdXNlZCBmb3IgTWVkaWEgUlNTIDxtZWRpYTp0ZXh0PiBjYXB0aW9ucwoJICogQHNlZSBTaW1wbGVQaWU6OnNldF9jYXB0aW9uX2NsYXNzKCkKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCgl2YXIgJGNhcHRpb25fY2xhc3MgPSAnU2ltcGxlUGllX0NhcHRpb24nOwoKCS8qKgoJICogQHZhciBzdHJpbmcgQ2xhc3MgdXNlZCBmb3IgTWVkaWEgUlNTIDxtZWRpYTpjb3B5cmlnaHQ+CgkgKiBAc2VlIFNpbXBsZVBpZTo6c2V0X2NvcHlyaWdodF9jbGFzcygpCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJdmFyICRjb3B5cmlnaHRfY2xhc3MgPSAnU2ltcGxlUGllX0NvcHlyaWdodCc7CgoJLyoqCgkgKiBAdmFyIHN0cmluZyBDbGFzcyB1c2VkIGZvciBNZWRpYSBSU1MgPG1lZGlhOmNyZWRpdD4KCSAqIEBzZWUgU2ltcGxlUGllOjpzZXRfY3JlZGl0X2NsYXNzKCkKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCgl2YXIgJGNyZWRpdF9jbGFzcyA9ICdTaW1wbGVQaWVfQ3JlZGl0JzsKCgkvKioKCSAqIEB2YXIgc3RyaW5nIENsYXNzIHVzZWQgZm9yIE1lZGlhIFJTUyA8bWVkaWE6cmF0aW5nPgoJICogQHNlZSBTaW1wbGVQaWU6OnNldF9yYXRpbmdfY2xhc3MoKQoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCXZhciAkcmF0aW5nX2NsYXNzID0gJ1NpbXBsZVBpZV9SYXRpbmcnOwoKCS8qKgoJICogQHZhciBzdHJpbmcgQ2xhc3MgdXNlZCBmb3IgTWVkaWEgUlNTIDxtZWRpYTpyZXN0cmljdGlvbj4KCSAqIEBzZWUgU2ltcGxlUGllOjpzZXRfcmVzdHJpY3Rpb25fY2xhc3MoKQoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCXZhciAkcmVzdHJpY3Rpb25fY2xhc3MgPSAnU2ltcGxlUGllX1Jlc3RyaWN0aW9uJzsKCgkvKioKCSAqIEB2YXIgc3RyaW5nIENsYXNzIHVzZWQgZm9yIGNvbnRlbnQtdHlwZSBzbmlmZmluZwoJICogQHNlZSBTaW1wbGVQaWU6OnNldF9jb250ZW50X3R5cGVfc25pZmZlcl9jbGFzcygpCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJdmFyICRjb250ZW50X3R5cGVfc25pZmZlcl9jbGFzcyA9ICdTaW1wbGVQaWVfQ29udGVudF9UeXBlX1NuaWZmZXInOwoKCS8qKgoJICogQHZhciBzdHJpbmcgQ2xhc3MgdXNlZCBmb3IgaXRlbSBzb3VyY2VzLgoJICogQHNlZSBTaW1wbGVQaWU6OnNldF9zb3VyY2VfY2xhc3MoKQoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCXZhciAkc291cmNlX2NsYXNzID0gJ1NpbXBsZVBpZV9Tb3VyY2UnOwoKCS8qKgoJICogQHZhciBtaXhlZCBTZXQgamF2YXNjcmlwdCBxdWVyeSBzdHJpbmcgcGFyYW1ldGVyIChmYWxzZSwgb3IKCSAqIGFueXRoaW5nIHR5cGUtY2FzdCB0byBmYWxzZSwgZGlzYWJsZXMgdGhpcyBmZWF0dXJlKQoJICogQHNlZSBTaW1wbGVQaWU6OnNldF9qYXZhc2NyaXB0KCkKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCgl2YXIgJGphdmFzY3JpcHQgPSAnanMnOwoKCS8qKgoJICogQHZhciBpbnQgTWF4aW11bSBudW1iZXIgb2YgZmVlZHMgdG8gY2hlY2sgd2l0aCBhdXRvZGlzY292ZXJ5CgkgKiBAc2VlIFNpbXBsZVBpZTo6c2V0X21heF9jaGVja2VkX2ZlZWRzKCkKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCgl2YXIgJG1heF9jaGVja2VkX2ZlZWRzID0gMTA7CgoJLyoqCgkgKiBAdmFyIHN0cmluZyBXZWItYWNjZXNzaWJsZSBwYXRoIHRvIHRoZSBoYW5kbGVyX2Zhdmljb24ucGhwIGZpbGUuCgkgKiBAc2VlIFNpbXBsZVBpZTo6c2V0X2Zhdmljb25faGFuZGxlcigpCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJdmFyICRmYXZpY29uX2hhbmRsZXIgPSAnJzsKCgkvKioKCSAqIEB2YXIgc3RyaW5nIFdlYi1hY2Nlc3NpYmxlIHBhdGggdG8gdGhlIGhhbmRsZXJfaW1hZ2UucGhwIGZpbGUuCgkgKiBAc2VlIFNpbXBsZVBpZTo6c2V0X2ltYWdlX2hhbmRsZXIoKQoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCXZhciAkaW1hZ2VfaGFuZGxlciA9ICcnOwoKCS8qKgoJICogQHZhciBhcnJheSBTdG9yZXMgdGhlIFVSTHMgd2hlbiBtdWx0aXBsZSBmZWVkcyBhcmUgYmVpbmcgaW5pdGlhbGl6ZWQuCgkgKiBAc2VlIFNpbXBsZVBpZTo6c2V0X2ZlZWRfdXJsKCkKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCgl2YXIgJG11bHRpZmVlZF91cmwgPSBhcnJheSgpOwoKCS8qKgoJICogQHZhciBhcnJheSBTdG9yZXMgU2ltcGxlUGllIG9iamVjdHMgd2hlbiBtdWx0aXBsZSBmZWVkcyBpbml0aWFsaXplZC4KCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCgl2YXIgJG11bHRpZmVlZF9vYmplY3RzID0gYXJyYXkoKTsKCgkvKioKCSAqIEB2YXIgYXJyYXkgU3RvcmVzIHRoZSBnZXRfb2JqZWN0X3ZhcnMoKSBhcnJheSBmb3IgdXNlIHdpdGggbXVsdGlmZWVkcy4KCSAqIEBzZWUgU2ltcGxlUGllOjpzZXRfZmVlZF91cmwoKQoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCXZhciAkY29uZmlnX3NldHRpbmdzID0gbnVsbDsKCgkvKioKCSAqIEB2YXIgaW50ZWdlciBTdG9yZXMgdGhlIG51bWJlciBvZiBpdGVtcyB0byByZXR1cm4gcGVyLWZlZWQgd2l0aCBtdWx0aWZlZWRzLgoJICogQHNlZSBTaW1wbGVQaWU6OnNldF9pdGVtX2xpbWl0KCkKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCgl2YXIgJGl0ZW1fbGltaXQgPSAwOwoKCS8qKgoJICogQHZhciBhcnJheSBTdG9yZXMgdGhlIGRlZmF1bHQgYXR0cmlidXRlcyB0byBiZSBzdHJpcHBlZCBieSBzdHJpcF9hdHRyaWJ1dGVzKCkuCgkgKiBAc2VlIFNpbXBsZVBpZTo6c3RyaXBfYXR0cmlidXRlcygpCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJdmFyICRzdHJpcF9hdHRyaWJ1dGVzID0gYXJyYXkoJ2Jnc291bmQnLCAnY2xhc3MnLCAnZXhwcicsICdpZCcsICdzdHlsZScsICdvbmNsaWNrJywgJ29uZXJyb3InLCAnb25maW5pc2gnLCAnb25tb3VzZW92ZXInLCAnb25tb3VzZW91dCcsICdvbmZvY3VzJywgJ29uYmx1cicsICdsb3dzcmMnLCAnZHluc3JjJyk7CgoJLyoqCgkgKiBAdmFyIGFycmF5IFN0b3JlcyB0aGUgZGVmYXVsdCB0YWdzIHRvIGJlIHN0cmlwcGVkIGJ5IHN0cmlwX2h0bWx0YWdzKCkuCgkgKiBAc2VlIFNpbXBsZVBpZTo6c3RyaXBfaHRtbHRhZ3MoKQoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCXZhciAkc3RyaXBfaHRtbHRhZ3MgPSBhcnJheSgnYmFzZScsICdibGluaycsICdib2R5JywgJ2RvY3R5cGUnLCAnZW1iZWQnLCAnZm9udCcsICdmb3JtJywgJ2ZyYW1lJywgJ2ZyYW1lc2V0JywgJ2h0bWwnLCAnaWZyYW1lJywgJ2lucHV0JywgJ21hcnF1ZWUnLCAnbWV0YScsICdub3NjcmlwdCcsICdvYmplY3QnLCAncGFyYW0nLCAnc2NyaXB0JywgJ3N0eWxlJyk7CgoJLyoqCgkgKiBUaGUgU2ltcGxlUGllIGNsYXNzIGNvbnRhaW5zIGZlZWQgbGV2ZWwgZGF0YSBhbmQgb3B0aW9ucwoJICoKCSAqIFRoZXJlIGFyZSB0d28gd2F5cyB0aGF0IHlvdSBjYW4gY3JlYXRlIGEgbmV3IFNpbXBsZVBpZSBvYmplY3QuIFRoZSBmaXJzdAoJICogaXMgYnkgcGFzc2luZyBhIGZlZWQgVVJMIGFzIGEgcGFyYW1ldGVyIHRvIHRoZSBTaW1wbGVQaWUgY29uc3RydWN0b3IKCSAqIChhcyB3ZWxsIGFzIG9wdGlvbmFsbHkgc2V0dGluZyB0aGUgY2FjaGUgbG9jYXRpb24gYW5kIGNhY2hlIGV4cGlyeSkuIFRoaXMKCSAqIHdpbGwgaW5pdGlhbGlzZSB0aGUgd2hvbGUgZmVlZCB3aXRoIGFsbCBvZiB0aGUgZGVmYXVsdCBzZXR0aW5ncywgYW5kIHlvdQoJICogY2FuIGJlZ2luIGFjY2Vzc2luZyBtZXRob2RzIGFuZCBwcm9wZXJ0aWVzIGltbWVkaWF0ZWx5LgoJICoKCSAqIFRoZSBzZWNvbmQgd2F5IGlzIHRvIGNyZWF0ZSB0aGUgU2ltcGxlUGllIG9iamVjdCB3aXRoIG5vIHBhcmFtZXRlcnMKCSAqIGF0IGFsbC4gVGhpcyB3aWxsIGVuYWJsZSB5b3UgdG8gc2V0IGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4gQWZ0ZXIgc2V0dGluZwoJICogdGhlbSwgeW91IG11c3QgaW5pdGlhbGlzZSB0aGUgZmVlZCB1c2luZyAkZmVlZC0+aW5pdCgpLiBBdCB0aGF0IHBvaW50IHRoZQoJICogb2JqZWN0J3MgbWV0aG9kcyBhbmQgcHJvcGVydGllcyB3aWxsIGJlIGF2YWlsYWJsZSB0byB5b3UuIFRoaXMgZm9ybWF0IGlzCgkgKiB3aGF0IGlzIHVzZWQgdGhyb3VnaG91dCB0aGlzIGRvY3VtZW50YXRpb24uCgkgKgoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEBzaW5jZSAxLjAgUHJldmlldyBSZWxlYXNlCgkgKiBAcGFyYW0gc3RyaW5nICRmZWVkX3VybCBUaGlzIGlzIHRoZSBVUkwgeW91IHdhbnQgdG8gcGFyc2UuCgkgKiBAcGFyYW0gc3RyaW5nICRjYWNoZV9sb2NhdGlvbiBUaGlzIGlzIHdoZXJlIHlvdSB3YW50IHRoZSBjYWNoZSB0byBiZSBzdG9yZWQuCgkgKiBAcGFyYW0gaW50ICRjYWNoZV9kdXJhdGlvbiBUaGlzIGlzIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyB0aGF0IHlvdSB3YW50IHRvIHN0b3JlIHRoZSBjYWNoZSBmaWxlIGZvci4KCSAqLwoJZnVuY3Rpb24gU2ltcGxlUGllKCRmZWVkX3VybCA9IG51bGwsICRjYWNoZV9sb2NhdGlvbiA9IG51bGwsICRjYWNoZV9kdXJhdGlvbiA9IG51bGwpCgl7CgkJLy8gT3RoZXIgb2JqZWN0cywgaW5zdGFuY2VzIGNyZWF0ZWQgaGVyZSBzbyB3ZSBjYW4gc2V0IG9wdGlvbnMgb24gdGhlbQoJCSR0aGlzLT5zYW5pdGl6ZSA9JiBuZXcgU2ltcGxlUGllX1Nhbml0aXplOwoKCQkvLyBTZXQgb3B0aW9ucyBpZiB0aGV5J3JlIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3IKCQlpZiAoJGNhY2hlX2xvY2F0aW9uICE9PSBudWxsKQoJCXsKCQkJJHRoaXMtPnNldF9jYWNoZV9sb2NhdGlvbigkY2FjaGVfbG9jYXRpb24pOwoJCX0KCgkJaWYgKCRjYWNoZV9kdXJhdGlvbiAhPT0gbnVsbCkKCQl7CgkJCSR0aGlzLT5zZXRfY2FjaGVfZHVyYXRpb24oJGNhY2hlX2R1cmF0aW9uKTsKCQl9CgoJCS8vIE9ubHkgaW5pdCB0aGUgc2NyaXB0IGlmIHdlJ3JlIHBhc3NlZCBhIGZlZWQgVVJMCgkJaWYgKCRmZWVkX3VybCAhPT0gbnVsbCkKCQl7CgkJCSR0aGlzLT5zZXRfZmVlZF91cmwoJGZlZWRfdXJsKTsKCQkJJHRoaXMtPmluaXQoKTsKCQl9Cgl9CgoJLyoqCgkgKiBVc2VkIGZvciBjb252ZXJ0aW5nIG9iamVjdCB0byBhIHN0cmluZwoJICovCglmdW5jdGlvbiBfX3RvU3RyaW5nKCkKCXsKCQlyZXR1cm4gbWQ1KHNlcmlhbGl6ZSgkdGhpcy0+ZGF0YSkpOwoJfQoKCS8qKgoJICogUmVtb3ZlIGl0ZW1zIHRoYXQgbGluayBiYWNrIHRvIHRoaXMgYmVmb3JlIGRlc3Ryb3lpbmcgdGhpcyBvYmplY3QKCSAqLwoJZnVuY3Rpb24gX19kZXN0cnVjdCgpCgl7CgkJaWYgKCFlbXB0eSgkdGhpcy0+ZGF0YVsnaXRlbXMnXSkpCgkJewoJCQlmb3JlYWNoICgkdGhpcy0+ZGF0YVsnaXRlbXMnXSBhcyAkaXRlbSkKCQkJewoJCQkJJGl0ZW0tPl9fZGVzdHJ1Y3QoKTsKCQkJfQoJCQl1bnNldCgkdGhpcy0+ZGF0YVsnaXRlbXMnXSk7CgkJfQoJCWlmICghZW1wdHkoJHRoaXMtPmRhdGFbJ29yZGVyZWRfaXRlbXMnXSkpCgkJewoJCQlmb3JlYWNoICgkdGhpcy0+ZGF0YVsnb3JkZXJlZF9pdGVtcyddIGFzICRpdGVtKQoJCQl7CgkJCQkkaXRlbS0+X19kZXN0cnVjdCgpOwoJCQl9CgkJCXVuc2V0KCR0aGlzLT5kYXRhWydvcmRlcmVkX2l0ZW1zJ10pOwoJCX0KCX0KCgkvKioKCSAqIEZvcmNlIHRoZSBnaXZlbiBkYXRhL1VSTCB0byBiZSB0cmVhdGVkIGFzIGEgZmVlZCBubyBtYXR0ZXIgd2hhdCBpdAoJICogYXBwZWFycyBsaWtlCgkgKgoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEBzaW5jZSAxLjEKCSAqIEBwYXJhbSBib29sICRlbmFibGUgRm9yY2UgdGhlIGdpdmVuIGRhdGEvVVJMIHRvIGJlIHRyZWF0ZWQgYXMgYSBmZWVkCgkgKi8KCWZ1bmN0aW9uIGZvcmNlX2ZlZWQoJGVuYWJsZSA9IGZhbHNlKQoJewoJCSR0aGlzLT5mb3JjZV9mZWVkID0gKGJvb2wpICRlbmFibGU7Cgl9CgoJLyoqCgkgKiBUaGlzIGlzIHRoZSBVUkwgb2YgdGhlIGZlZWQgeW91IHdhbnQgdG8gcGFyc2UuCgkgKgoJICogVGhpcyBhbGxvd3MgeW91IHRvIGVudGVyIHRoZSBVUkwgb2YgdGhlIGZlZWQgeW91IHdhbnQgdG8gcGFyc2UsIG9yIHRoZQoJICogd2Vic2l0ZSB5b3Ugd2FudCB0byB0cnkgdG8gdXNlIGF1dG8tZGlzY292ZXJ5IG9uLiBUaGlzIHRha2VzIHByaW9yaXR5CgkgKiBvdmVyIGFueSBzZXQgcmF3IGRhdGEuCgkgKgoJICogWW91IGNhbiBzZXQgbXVsdGlwbGUgZmVlZHMgdG8gbWFzaCB0b2dldGhlciBieSBwYXNzaW5nIGFuIGFycmF5IGluc3RlYWQKCSAqIG9mIGEgc3RyaW5nIGZvciB0aGUgJHVybC4gUmVtZW1iZXIgdGhhdCB3aXRoIGVhY2ggYWRkaXRpb25hbCBmZWVkIGNvbWVzCgkgKiBhZGRpdGlvbmFsIHByb2Nlc3NpbmcgYW5kIHJlc291cmNlcy4KCSAqCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHNpbmNlIDEuMCBQcmV2aWV3IFJlbGVhc2UKCSAqIEBwYXJhbSBtaXhlZCAkdXJsIFRoaXMgaXMgdGhlIFVSTCAob3IgYXJyYXkgb2YgVVJMcykgdGhhdCB5b3Ugd2FudCB0byBwYXJzZS4KCSAqIEBzZWUgU2ltcGxlUGllOjpzZXRfcmF3X2RhdGEoKQoJICovCglmdW5jdGlvbiBzZXRfZmVlZF91cmwoJHVybCkKCXsKCQlpZiAoaXNfYXJyYXkoJHVybCkpCgkJewoJCQkkdGhpcy0+bXVsdGlmZWVkX3VybCA9IGFycmF5KCk7CgkJCWZvcmVhY2ggKCR1cmwgYXMgJHZhbHVlKQoJCQl7CgkJCQkkdGhpcy0+bXVsdGlmZWVkX3VybFtdID0gU2ltcGxlUGllX01pc2M6OmZpeF9wcm90b2NvbCgkdmFsdWUsIDEpOwoJCQl9CgkJfQoJCWVsc2UKCQl7CgkJCSR0aGlzLT5mZWVkX3VybCA9IFNpbXBsZVBpZV9NaXNjOjpmaXhfcHJvdG9jb2woJHVybCwgMSk7CgkJfQoJfQoKCS8qKgoJICogUHJvdmlkZXMgYW4gaW5zdGFuY2Ugb2YgU2ltcGxlUGllX0ZpbGUgdG8gdXNlIGFzIGEgZmVlZAoJICoKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAcGFyYW0gb2JqZWN0ICYkZmlsZSBJbnN0YW5jZSBvZiBTaW1wbGVQaWVfRmlsZSAob3Igc3ViY2xhc3MpCgkgKiBAcmV0dXJuIGJvb2wgVHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvbiBmYWlsdXJlCgkgKi8KCWZ1bmN0aW9uIHNldF9maWxlKCYkZmlsZSkKCXsKCQlpZiAoaXNfYSgkZmlsZSwgJ1NpbXBsZVBpZV9GaWxlJykpCgkJewoJCQkkdGhpcy0+ZmVlZF91cmwgPSAkZmlsZS0+dXJsOwoJCQkkdGhpcy0+ZmlsZSA9JiAkZmlsZTsKCQkJcmV0dXJuIHRydWU7CgkJfQoJCXJldHVybiBmYWxzZTsKCX0KCgkvKioKCSAqIEFsbG93cyB5b3UgdG8gdXNlIGEgc3RyaW5nIG9mIFJTUy9BdG9tIGRhdGEgaW5zdGVhZCBvZiBhIHJlbW90ZSBmZWVkLgoJICoKCSAqIElmIHlvdSBoYXZlIGEgZmVlZCBhdmFpbGFibGUgYXMgYSBzdHJpbmcgaW4gUEhQLCB5b3UgY2FuIHRlbGwgU2ltcGxlUGllCgkgKiB0byBwYXJzZSB0aGF0IGRhdGEgc3RyaW5nIGluc3RlYWQgb2YgYSByZW1vdGUgZmVlZC4gQW55IHNldCBmZWVkIFVSTAoJICogdGFrZXMgcHJlY2VkZW5jZS4KCSAqCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHNpbmNlIDEuMCBCZXRhIDMKCSAqIEBwYXJhbSBzdHJpbmcgJGRhdGEgUlNTIG9yIEF0b20gZGF0YSBhcyBhIHN0cmluZy4KCSAqIEBzZWUgU2ltcGxlUGllOjpzZXRfZmVlZF91cmwoKQoJICovCglmdW5jdGlvbiBzZXRfcmF3X2RhdGEoJGRhdGEpCgl7CgkJJHRoaXMtPnJhd19kYXRhID0gJGRhdGE7Cgl9CgoJLyoqCgkgKiBBbGxvd3MgeW91IHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHRpbWVvdXQgZm9yIGZldGNoaW5nIHJlbW90ZSBmZWVkcy4KCSAqCgkgKiBUaGlzIGFsbG93cyB5b3UgdG8gY2hhbmdlIHRoZSBtYXhpbXVtIHRpbWUgdGhlIGZlZWQncyBzZXJ2ZXIgdG8gcmVzcG9uZAoJICogYW5kIHNlbmQgdGhlIGZlZWQgYmFjay4KCSAqCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHNpbmNlIDEuMCBCZXRhIDMKCSAqIEBwYXJhbSBpbnQgJHRpbWVvdXQgVGhlIG1heGltdW0gbnVtYmVyIG9mIHNlY29uZHMgdG8gc3BlbmQgd2FpdGluZyB0byByZXRyaWV2ZSBhIGZlZWQuCgkgKi8KCWZ1bmN0aW9uIHNldF90aW1lb3V0KCR0aW1lb3V0ID0gMTApCgl7CgkJJHRoaXMtPnRpbWVvdXQgPSAoaW50KSAkdGltZW91dDsKCX0KCgkvKioKCSAqIEZvcmNlcyBTaW1wbGVQaWUgdG8gdXNlIGZzb2Nrb3BlbigpIGluc3RlYWQgb2YgdGhlIHByZWZlcnJlZCBjVVJMCgkgKiBmdW5jdGlvbnMuCgkgKgoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEBzaW5jZSAxLjAgQmV0YSAzCgkgKiBAcGFyYW0gYm9vbCAkZW5hYmxlIEZvcmNlIGZzb2Nrb3BlbigpIHRvIGJlIHVzZWQKCSAqLwoJZnVuY3Rpb24gZm9yY2VfZnNvY2tvcGVuKCRlbmFibGUgPSBmYWxzZSkKCXsKCQkkdGhpcy0+Zm9yY2VfZnNvY2tvcGVuID0gKGJvb2wpICRlbmFibGU7Cgl9CgoJLyoqCgkgKiBPdXRwdXRzIHRoZSByYXcgWE1MIGNvbnRlbnQgb2YgdGhlIGZlZWQsIGFmdGVyIGl0IGhhcyBnb25lIHRocm91Z2gKCSAqIFNpbXBsZVBpZSdzIGZpbHRlcnMuCgkgKgoJICogVXNlZCBvbmx5IGZvciBkZWJ1Z2dpbmcsIHRoaXMgZnVuY3Rpb24gd2lsbCBvdXRwdXQgdGhlIFhNTCBjb250ZW50IGFzCgkgKiB0ZXh0L3htbC4gV2hlbiBTaW1wbGVQaWUgcmVhZHMgaW4gYSBmZWVkLCBpdCBkb2VzIGEgYml0IG9mIGNsZWFuaW5nIHVwCgkgKiBiZWZvcmUgdHJ5aW5nIHRvIHBhcnNlIGl0LiBNYW55IHBhcnRzIG9mIHRoZSBmZWVkIGFyZSByZS13cml0dGVuIGluCgkgKiBtZW1vcnksIGFuZCBpbiB0aGUgZW5kLCB5b3UgaGF2ZSBhIHBhcnNhYmxlIGZlZWQuIFhNTCBkdW1wIHNob3dzIHlvdSB0aGUKCSAqIGFjdHVhbCBYTUwgdGhhdCBTaW1wbGVQaWUgdHJpZXMgdG8gcGFyc2UsIHdoaWNoIG1heSBvciBtYXkgbm90IGJlIHZlcnkKCSAqIGRpZmZlcmVudCBmcm9tIHRoZSBvcmlnaW5hbCBmZWVkLgoJICoKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAc2luY2UgMS4wIFByZXZpZXcgUmVsZWFzZQoJICogQHBhcmFtIGJvb2wgJGVuYWJsZSBFbmFibGUgWE1MIGR1bXAKCSAqLwoJZnVuY3Rpb24gZW5hYmxlX3htbF9kdW1wKCRlbmFibGUgPSBmYWxzZSkKCXsKCQkkdGhpcy0+eG1sX2R1bXAgPSAoYm9vbCkgJGVuYWJsZTsKCX0KCgkvKioKCSAqIEVuYWJsZXMvZGlzYWJsZXMgY2FjaGluZyBpbiBTaW1wbGVQaWUuCgkgKgoJICogVGhpcyBvcHRpb24gYWxsb3dzIHlvdSB0byBkaXNhYmxlIGNhY2hpbmcgYWxsLXRvZ2V0aGVyIGluIFNpbXBsZVBpZS4KCSAqIEhvd2V2ZXIsIGRpc2FibGluZyB0aGUgY2FjaGUgY2FuIGxlYWQgdG8gbG9uZ2VyIGxvYWQgdGltZXMuCgkgKgoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEBzaW5jZSAxLjAgUHJldmlldyBSZWxlYXNlCgkgKiBAcGFyYW0gYm9vbCAkZW5hYmxlIEVuYWJsZSBjYWNoaW5nCgkgKi8KCWZ1bmN0aW9uIGVuYWJsZV9jYWNoZSgkZW5hYmxlID0gdHJ1ZSkKCXsKCQkkdGhpcy0+Y2FjaGUgPSAoYm9vbCkgJGVuYWJsZTsKCX0KCgkvKioKCSAqIFNldCB0aGUgbGVuZ3RoIG9mIHRpbWUgKGluIHNlY29uZHMpIHRoYXQgdGhlIGNvbnRlbnRzIG9mIGEgZmVlZAoJICogd2lsbCBiZSBjYWNoZWQuCgkgKgoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEBwYXJhbSBpbnQgJHNlY29uZHMgVGhlIGZlZWQgY29udGVudCBjYWNoZSBkdXJhdGlvbi4KCSAqLwoJZnVuY3Rpb24gc2V0X2NhY2hlX2R1cmF0aW9uKCRzZWNvbmRzID0gMzYwMCkKCXsKCQkkdGhpcy0+Y2FjaGVfZHVyYXRpb24gPSAoaW50KSAkc2Vjb25kczsKCX0KCgkvKioKCSAqIFNldCB0aGUgbGVuZ3RoIG9mIHRpbWUgKGluIHNlY29uZHMpIHRoYXQgdGhlIGF1dG9kaXNjb3ZlcmVkIGZlZWQKCSAqIFVSTCB3aWxsIGJlIGNhY2hlZC4KCSAqCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHBhcmFtIGludCAkc2Vjb25kcyBUaGUgYXV0b2Rpc2NvdmVyZWQgZmVlZCBVUkwgY2FjaGUgZHVyYXRpb24uCgkgKi8KCWZ1bmN0aW9uIHNldF9hdXRvZGlzY292ZXJ5X2NhY2hlX2R1cmF0aW9uKCRzZWNvbmRzID0gNjA0ODAwKQoJewoJCSR0aGlzLT5hdXRvZGlzY292ZXJ5X2NhY2hlX2R1cmF0aW9uID0gKGludCkgJHNlY29uZHM7Cgl9CgoJLyoqCgkgKiBTZXQgdGhlIGZpbGUgc3lzdGVtIGxvY2F0aW9uIHdoZXJlIHRoZSBjYWNoZWQgZmlsZXMgc2hvdWxkIGJlIHN0b3JlZC4KCSAqCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHBhcmFtIHN0cmluZyAkbG9jYXRpb24gVGhlIGZpbGUgc3lzdGVtIGxvY2F0aW9uLgoJICovCglmdW5jdGlvbiBzZXRfY2FjaGVfbG9jYXRpb24oJGxvY2F0aW9uID0gJy4vY2FjaGUnKQoJewoJCSR0aGlzLT5jYWNoZV9sb2NhdGlvbiA9IChzdHJpbmcpICRsb2NhdGlvbjsKCX0KCgkvKioKCSAqIERldGVybWluZXMgd2hldGhlciBmZWVkIGl0ZW1zIHNob3VsZCBiZSBzb3J0ZWQgaW50byByZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXIuCgkgKgoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEBwYXJhbSBib29sICRlbmFibGUgU29ydCBhcyByZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXIuCgkgKi8KCWZ1bmN0aW9uIGVuYWJsZV9vcmRlcl9ieV9kYXRlKCRlbmFibGUgPSB0cnVlKQoJewoJCSR0aGlzLT5vcmRlcl9ieV9kYXRlID0gKGJvb2wpICRlbmFibGU7Cgl9CgoJLyoqCgkgKiBBbGxvd3MgeW91IHRvIG92ZXJyaWRlIHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcgcmVwb3J0ZWQgYnkgdGhlIGZlZWQuCgkgKgoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEBwYXJhbSBzdHJpbmcgJGVuY29kaW5nIENoYXJhY3RlciBlbmNvZGluZy4KCSAqLwoJZnVuY3Rpb24gc2V0X2lucHV0X2VuY29kaW5nKCRlbmNvZGluZyA9IGZhbHNlKQoJewoJCWlmICgkZW5jb2RpbmcpCgkJewoJCQkkdGhpcy0+aW5wdXRfZW5jb2RpbmcgPSAoc3RyaW5nKSAkZW5jb2Rpbmc7CgkJfQoJCWVsc2UKCQl7CgkJCSR0aGlzLT5pbnB1dF9lbmNvZGluZyA9IGZhbHNlOwoJCX0KCX0KCgkvKioKCSAqIFNldCBob3cgbXVjaCBmZWVkIGF1dG9kaXNjb3ZlcnkgdG8gZG8KCSAqCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHNlZSBTSU1QTEVQSUVfTE9DQVRPUl9OT05FCgkgKiBAc2VlIFNJTVBMRVBJRV9MT0NBVE9SX0FVVE9ESVNDT1ZFUlkKCSAqIEBzZWUgU0lNUExFUElFX0xPQ0FUT1JfTE9DQUxfRVhURU5TSU9OCgkgKiBAc2VlIFNJTVBMRVBJRV9MT0NBVE9SX0xPQ0FMX0JPRFkKCSAqIEBzZWUgU0lNUExFUElFX0xPQ0FUT1JfUkVNT1RFX0VYVEVOU0lPTgoJICogQHNlZSBTSU1QTEVQSUVfTE9DQVRPUl9SRU1PVEVfQk9EWQoJICogQHNlZSBTSU1QTEVQSUVfTE9DQVRPUl9BTEwKCSAqIEBwYXJhbSBpbnQgJGxldmVsIEZlZWQgQXV0b2Rpc2NvdmVyeSBMZXZlbCAobGV2ZWwgY2FuIGJlIGEKCSAqIGNvbWJpbmF0aW9uIG9mIHRoZSBhYm92ZSBjb25zdGFudHMsIHNlZSBiaXR3aXNlIE9SIG9wZXJhdG9yKQoJICovCglmdW5jdGlvbiBzZXRfYXV0b2Rpc2NvdmVyeV9sZXZlbCgkbGV2ZWwgPSBTSU1QTEVQSUVfTE9DQVRPUl9BTEwpCgl7CgkJJHRoaXMtPmF1dG9kaXNjb3ZlcnkgPSAoaW50KSAkbGV2ZWw7Cgl9CgoJLyoqCgkgKiBBbGxvd3MgeW91IHRvIGNoYW5nZSB3aGljaCBjbGFzcyBTaW1wbGVQaWUgdXNlcyBmb3IgY2FjaGluZy4KCSAqIFVzZWZ1bCB3aGVuIHlvdSBhcmUgb3ZlcmxvYWRpbmcgb3IgZXh0ZW5kaW5nIFNpbXBsZVBpZSdzIGRlZmF1bHQgY2xhc3Nlcy4KCSAqCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHBhcmFtIHN0cmluZyAkY2xhc3MgTmFtZSBvZiBjdXN0b20gY2xhc3MuCgkgKiBAbGluayBodHRwOi8vcGhwLm5ldC9tYW51YWwvZW4va2V5d29yZC5leHRlbmRzLnBocCBQSFA0IGV4dGVuZHMgZG9jdW1lbnRhdGlvbgoJICogQGxpbmsgaHR0cDovL3BocC5uZXQvbWFudWFsL2VuL2xhbmd1YWdlLm9vcDUuYmFzaWMucGhwI2xhbmd1YWdlLm9vcDUuYmFzaWMuZXh0ZW5kcyBQSFA1IGV4dGVuZHMgZG9jdW1lbnRhdGlvbgoJICovCglmdW5jdGlvbiBzZXRfY2FjaGVfY2xhc3MoJGNsYXNzID0gJ1NpbXBsZVBpZV9DYWNoZScpCgl7CgkJaWYgKFNpbXBsZVBpZV9NaXNjOjppc19zdWJjbGFzc19vZigkY2xhc3MsICdTaW1wbGVQaWVfQ2FjaGUnKSkKCQl7CgkJCSR0aGlzLT5jYWNoZV9jbGFzcyA9ICRjbGFzczsKCQkJcmV0dXJuIHRydWU7CgkJfQoJCXJldHVybiBmYWxzZTsKCX0KCgkvKioKCSAqIEFsbG93cyB5b3UgdG8gY2hhbmdlIHdoaWNoIGNsYXNzIFNpbXBsZVBpZSB1c2VzIGZvciBhdXRvLWRpc2NvdmVyeS4KCSAqIFVzZWZ1bCB3aGVuIHlvdSBhcmUgb3ZlcmxvYWRpbmcgb3IgZXh0ZW5kaW5nIFNpbXBsZVBpZSdzIGRlZmF1bHQgY2xhc3Nlcy4KCSAqCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHBhcmFtIHN0cmluZyAkY2xhc3MgTmFtZSBvZiBjdXN0b20gY2xhc3MuCgkgKiBAbGluayBodHRwOi8vcGhwLm5ldC9tYW51YWwvZW4va2V5d29yZC5leHRlbmRzLnBocCBQSFA0IGV4dGVuZHMgZG9jdW1lbnRhdGlvbgoJICogQGxpbmsgaHR0cDovL3BocC5uZXQvbWFudWFsL2VuL2xhbmd1YWdlLm9vcDUuYmFzaWMucGhwI2xhbmd1YWdlLm9vcDUuYmFzaWMuZXh0ZW5kcyBQSFA1IGV4dGVuZHMgZG9jdW1lbnRhdGlvbgoJICovCglmdW5jdGlvbiBzZXRfbG9jYXRvcl9jbGFzcygkY2xhc3MgPSAnU2ltcGxlUGllX0xvY2F0b3InKQoJewoJCWlmIChTaW1wbGVQaWVfTWlzYzo6aXNfc3ViY2xhc3Nfb2YoJGNsYXNzLCAnU2ltcGxlUGllX0xvY2F0b3InKSkKCQl7CgkJCSR0aGlzLT5sb2NhdG9yX2NsYXNzID0gJGNsYXNzOwoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgkJcmV0dXJuIGZhbHNlOwoJfQoKCS8qKgoJICogQWxsb3dzIHlvdSB0byBjaGFuZ2Ugd2hpY2ggY2xhc3MgU2ltcGxlUGllIHVzZXMgZm9yIFhNTCBwYXJzaW5nLgoJICogVXNlZnVsIHdoZW4geW91IGFyZSBvdmVybG9hZGluZyBvciBleHRlbmRpbmcgU2ltcGxlUGllJ3MgZGVmYXVsdCBjbGFzc2VzLgoJICoKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAcGFyYW0gc3RyaW5nICRjbGFzcyBOYW1lIG9mIGN1c3RvbSBjbGFzcy4KCSAqIEBsaW5rIGh0dHA6Ly9waHAubmV0L21hbnVhbC9lbi9rZXl3b3JkLmV4dGVuZHMucGhwIFBIUDQgZXh0ZW5kcyBkb2N1bWVudGF0aW9uCgkgKiBAbGluayBodHRwOi8vcGhwLm5ldC9tYW51YWwvZW4vbGFuZ3VhZ2Uub29wNS5iYXNpYy5waHAjbGFuZ3VhZ2Uub29wNS5iYXNpYy5leHRlbmRzIFBIUDUgZXh0ZW5kcyBkb2N1bWVudGF0aW9uCgkgKi8KCWZ1bmN0aW9uIHNldF9wYXJzZXJfY2xhc3MoJGNsYXNzID0gJ1NpbXBsZVBpZV9QYXJzZXInKQoJewoJCWlmIChTaW1wbGVQaWVfTWlzYzo6aXNfc3ViY2xhc3Nfb2YoJGNsYXNzLCAnU2ltcGxlUGllX1BhcnNlcicpKQoJCXsKCQkJJHRoaXMtPnBhcnNlcl9jbGFzcyA9ICRjbGFzczsKCQkJcmV0dXJuIHRydWU7CgkJfQoJCXJldHVybiBmYWxzZTsKCX0KCgkvKioKCSAqIEFsbG93cyB5b3UgdG8gY2hhbmdlIHdoaWNoIGNsYXNzIFNpbXBsZVBpZSB1c2VzIGZvciByZW1vdGUgZmlsZSBmZXRjaGluZy4KCSAqIFVzZWZ1bCB3aGVuIHlvdSBhcmUgb3ZlcmxvYWRpbmcgb3IgZXh0ZW5kaW5nIFNpbXBsZVBpZSdzIGRlZmF1bHQgY2xhc3Nlcy4KCSAqCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHBhcmFtIHN0cmluZyAkY2xhc3MgTmFtZSBvZiBjdXN0b20gY2xhc3MuCgkgKiBAbGluayBodHRwOi8vcGhwLm5ldC9tYW51YWwvZW4va2V5d29yZC5leHRlbmRzLnBocCBQSFA0IGV4dGVuZHMgZG9jdW1lbnRhdGlvbgoJICogQGxpbmsgaHR0cDovL3BocC5uZXQvbWFudWFsL2VuL2xhbmd1YWdlLm9vcDUuYmFzaWMucGhwI2xhbmd1YWdlLm9vcDUuYmFzaWMuZXh0ZW5kcyBQSFA1IGV4dGVuZHMgZG9jdW1lbnRhdGlvbgoJICovCglmdW5jdGlvbiBzZXRfZmlsZV9jbGFzcygkY2xhc3MgPSAnU2ltcGxlUGllX0ZpbGUnKQoJewoJCWlmIChTaW1wbGVQaWVfTWlzYzo6aXNfc3ViY2xhc3Nfb2YoJGNsYXNzLCAnU2ltcGxlUGllX0ZpbGUnKSkKCQl7CgkJCSR0aGlzLT5maWxlX2NsYXNzID0gJGNsYXNzOwoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgkJcmV0dXJuIGZhbHNlOwoJfQoKCS8qKgoJICogQWxsb3dzIHlvdSB0byBjaGFuZ2Ugd2hpY2ggY2xhc3MgU2ltcGxlUGllIHVzZXMgZm9yIGRhdGEgc2FuaXRpemF0aW9uLgoJICogVXNlZnVsIHdoZW4geW91IGFyZSBvdmVybG9hZGluZyBvciBleHRlbmRpbmcgU2ltcGxlUGllJ3MgZGVmYXVsdCBjbGFzc2VzLgoJICoKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAcGFyYW0gc3RyaW5nICRjbGFzcyBOYW1lIG9mIGN1c3RvbSBjbGFzcy4KCSAqIEBsaW5rIGh0dHA6Ly9waHAubmV0L21hbnVhbC9lbi9rZXl3b3JkLmV4dGVuZHMucGhwIFBIUDQgZXh0ZW5kcyBkb2N1bWVudGF0aW9uCgkgKiBAbGluayBodHRwOi8vcGhwLm5ldC9tYW51YWwvZW4vbGFuZ3VhZ2Uub29wNS5iYXNpYy5waHAjbGFuZ3VhZ2Uub29wNS5iYXNpYy5leHRlbmRzIFBIUDUgZXh0ZW5kcyBkb2N1bWVudGF0aW9uCgkgKi8KCWZ1bmN0aW9uIHNldF9zYW5pdGl6ZV9jbGFzcygkY2xhc3MgPSAnU2ltcGxlUGllX1Nhbml0aXplJykKCXsKCQlpZiAoU2ltcGxlUGllX01pc2M6OmlzX3N1YmNsYXNzX29mKCRjbGFzcywgJ1NpbXBsZVBpZV9TYW5pdGl6ZScpKQoJCXsKCQkJJHRoaXMtPnNhbml0aXplID0mIG5ldyAkY2xhc3M7CgkJCXJldHVybiB0cnVlOwoJCX0KCQlyZXR1cm4gZmFsc2U7Cgl9CgoJLyoqCgkgKiBBbGxvd3MgeW91IHRvIGNoYW5nZSB3aGljaCBjbGFzcyBTaW1wbGVQaWUgdXNlcyBmb3IgaGFuZGxpbmcgZmVlZCBpdGVtcy4KCSAqIFVzZWZ1bCB3aGVuIHlvdSBhcmUgb3ZlcmxvYWRpbmcgb3IgZXh0ZW5kaW5nIFNpbXBsZVBpZSdzIGRlZmF1bHQgY2xhc3Nlcy4KCSAqCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHBhcmFtIHN0cmluZyAkY2xhc3MgTmFtZSBvZiBjdXN0b20gY2xhc3MuCgkgKiBAbGluayBodHRwOi8vcGhwLm5ldC9tYW51YWwvZW4va2V5d29yZC5leHRlbmRzLnBocCBQSFA0IGV4dGVuZHMgZG9jdW1lbnRhdGlvbgoJICogQGxpbmsgaHR0cDovL3BocC5uZXQvbWFudWFsL2VuL2xhbmd1YWdlLm9vcDUuYmFzaWMucGhwI2xhbmd1YWdlLm9vcDUuYmFzaWMuZXh0ZW5kcyBQSFA1IGV4dGVuZHMgZG9jdW1lbnRhdGlvbgoJICovCglmdW5jdGlvbiBzZXRfaXRlbV9jbGFzcygkY2xhc3MgPSAnU2ltcGxlUGllX0l0ZW0nKQoJewoJCWlmIChTaW1wbGVQaWVfTWlzYzo6aXNfc3ViY2xhc3Nfb2YoJGNsYXNzLCAnU2ltcGxlUGllX0l0ZW0nKSkKCQl7CgkJCSR0aGlzLT5pdGVtX2NsYXNzID0gJGNsYXNzOwoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgkJcmV0dXJuIGZhbHNlOwoJfQoKCS8qKgoJICogQWxsb3dzIHlvdSB0byBjaGFuZ2Ugd2hpY2ggY2xhc3MgU2ltcGxlUGllIHVzZXMgZm9yIGhhbmRsaW5nIGF1dGhvciBkYXRhLgoJICogVXNlZnVsIHdoZW4geW91IGFyZSBvdmVybG9hZGluZyBvciBleHRlbmRpbmcgU2ltcGxlUGllJ3MgZGVmYXVsdCBjbGFzc2VzLgoJICoKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAcGFyYW0gc3RyaW5nICRjbGFzcyBOYW1lIG9mIGN1c3RvbSBjbGFzcy4KCSAqIEBsaW5rIGh0dHA6Ly9waHAubmV0L21hbnVhbC9lbi9rZXl3b3JkLmV4dGVuZHMucGhwIFBIUDQgZXh0ZW5kcyBkb2N1bWVudGF0aW9uCgkgKiBAbGluayBodHRwOi8vcGhwLm5ldC9tYW51YWwvZW4vbGFuZ3VhZ2Uub29wNS5iYXNpYy5waHAjbGFuZ3VhZ2Uub29wNS5iYXNpYy5leHRlbmRzIFBIUDUgZXh0ZW5kcyBkb2N1bWVudGF0aW9uCgkgKi8KCWZ1bmN0aW9uIHNldF9hdXRob3JfY2xhc3MoJGNsYXNzID0gJ1NpbXBsZVBpZV9BdXRob3InKQoJewoJCWlmIChTaW1wbGVQaWVfTWlzYzo6aXNfc3ViY2xhc3Nfb2YoJGNsYXNzLCAnU2ltcGxlUGllX0F1dGhvcicpKQoJCXsKCQkJJHRoaXMtPmF1dGhvcl9jbGFzcyA9ICRjbGFzczsKCQkJcmV0dXJuIHRydWU7CgkJfQoJCXJldHVybiBmYWxzZTsKCX0KCgkvKioKCSAqIEFsbG93cyB5b3UgdG8gY2hhbmdlIHdoaWNoIGNsYXNzIFNpbXBsZVBpZSB1c2VzIGZvciBoYW5kbGluZyBjYXRlZ29yeSBkYXRhLgoJICogVXNlZnVsIHdoZW4geW91IGFyZSBvdmVybG9hZGluZyBvciBleHRlbmRpbmcgU2ltcGxlUGllJ3MgZGVmYXVsdCBjbGFzc2VzLgoJICoKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAcGFyYW0gc3RyaW5nICRjbGFzcyBOYW1lIG9mIGN1c3RvbSBjbGFzcy4KCSAqIEBsaW5rIGh0dHA6Ly9waHAubmV0L21hbnVhbC9lbi9rZXl3b3JkLmV4dGVuZHMucGhwIFBIUDQgZXh0ZW5kcyBkb2N1bWVudGF0aW9uCgkgKiBAbGluayBodHRwOi8vcGhwLm5ldC9tYW51YWwvZW4vbGFuZ3VhZ2Uub29wNS5iYXNpYy5waHAjbGFuZ3VhZ2Uub29wNS5iYXNpYy5leHRlbmRzIFBIUDUgZXh0ZW5kcyBkb2N1bWVudGF0aW9uCgkgKi8KCWZ1bmN0aW9uIHNldF9jYXRlZ29yeV9jbGFzcygkY2xhc3MgPSAnU2ltcGxlUGllX0NhdGVnb3J5JykKCXsKCQlpZiAoU2ltcGxlUGllX01pc2M6OmlzX3N1YmNsYXNzX29mKCRjbGFzcywgJ1NpbXBsZVBpZV9DYXRlZ29yeScpKQoJCXsKCQkJJHRoaXMtPmNhdGVnb3J5X2NsYXNzID0gJGNsYXNzOwoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgkJcmV0dXJuIGZhbHNlOwoJfQoKCS8qKgoJICogQWxsb3dzIHlvdSB0byBjaGFuZ2Ugd2hpY2ggY2xhc3MgU2ltcGxlUGllIHVzZXMgZm9yIGZlZWQgZW5jbG9zdXJlcy4KCSAqIFVzZWZ1bCB3aGVuIHlvdSBhcmUgb3ZlcmxvYWRpbmcgb3IgZXh0ZW5kaW5nIFNpbXBsZVBpZSdzIGRlZmF1bHQgY2xhc3Nlcy4KCSAqCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHBhcmFtIHN0cmluZyAkY2xhc3MgTmFtZSBvZiBjdXN0b20gY2xhc3MuCgkgKiBAbGluayBodHRwOi8vcGhwLm5ldC9tYW51YWwvZW4va2V5d29yZC5leHRlbmRzLnBocCBQSFA0IGV4dGVuZHMgZG9jdW1lbnRhdGlvbgoJICogQGxpbmsgaHR0cDovL3BocC5uZXQvbWFudWFsL2VuL2xhbmd1YWdlLm9vcDUuYmFzaWMucGhwI2xhbmd1YWdlLm9vcDUuYmFzaWMuZXh0ZW5kcyBQSFA1IGV4dGVuZHMgZG9jdW1lbnRhdGlvbgoJICovCglmdW5jdGlvbiBzZXRfZW5jbG9zdXJlX2NsYXNzKCRjbGFzcyA9ICdTaW1wbGVQaWVfRW5jbG9zdXJlJykKCXsKCQlpZiAoU2ltcGxlUGllX01pc2M6OmlzX3N1YmNsYXNzX29mKCRjbGFzcywgJ1NpbXBsZVBpZV9FbmNsb3N1cmUnKSkKCQl7CgkJCSR0aGlzLT5lbmNsb3N1cmVfY2xhc3MgPSAkY2xhc3M7CgkJCXJldHVybiB0cnVlOwoJCX0KCQlyZXR1cm4gZmFsc2U7Cgl9CgoJLyoqCgkgKiBBbGxvd3MgeW91IHRvIGNoYW5nZSB3aGljaCBjbGFzcyBTaW1wbGVQaWUgdXNlcyBmb3IgPG1lZGlhOnRleHQ+IGNhcHRpb25zCgkgKiBVc2VmdWwgd2hlbiB5b3UgYXJlIG92ZXJsb2FkaW5nIG9yIGV4dGVuZGluZyBTaW1wbGVQaWUncyBkZWZhdWx0IGNsYXNzZXMuCgkgKgoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEBwYXJhbSBzdHJpbmcgJGNsYXNzIE5hbWUgb2YgY3VzdG9tIGNsYXNzLgoJICogQGxpbmsgaHR0cDovL3BocC5uZXQvbWFudWFsL2VuL2tleXdvcmQuZXh0ZW5kcy5waHAgUEhQNCBleHRlbmRzIGRvY3VtZW50YXRpb24KCSAqIEBsaW5rIGh0dHA6Ly9waHAubmV0L21hbnVhbC9lbi9sYW5ndWFnZS5vb3A1LmJhc2ljLnBocCNsYW5ndWFnZS5vb3A1LmJhc2ljLmV4dGVuZHMgUEhQNSBleHRlbmRzIGRvY3VtZW50YXRpb24KCSAqLwoJZnVuY3Rpb24gc2V0X2NhcHRpb25fY2xhc3MoJGNsYXNzID0gJ1NpbXBsZVBpZV9DYXB0aW9uJykKCXsKCQlpZiAoU2ltcGxlUGllX01pc2M6OmlzX3N1YmNsYXNzX29mKCRjbGFzcywgJ1NpbXBsZVBpZV9DYXB0aW9uJykpCgkJewoJCQkkdGhpcy0+Y2FwdGlvbl9jbGFzcyA9ICRjbGFzczsKCQkJcmV0dXJuIHRydWU7CgkJfQoJCXJldHVybiBmYWxzZTsKCX0KCgkvKioKCSAqIEFsbG93cyB5b3UgdG8gY2hhbmdlIHdoaWNoIGNsYXNzIFNpbXBsZVBpZSB1c2VzIGZvciA8bWVkaWE6Y29weXJpZ2h0PgoJICogVXNlZnVsIHdoZW4geW91IGFyZSBvdmVybG9hZGluZyBvciBleHRlbmRpbmcgU2ltcGxlUGllJ3MgZGVmYXVsdCBjbGFzc2VzLgoJICoKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAcGFyYW0gc3RyaW5nICRjbGFzcyBOYW1lIG9mIGN1c3RvbSBjbGFzcy4KCSAqIEBsaW5rIGh0dHA6Ly9waHAubmV0L21hbnVhbC9lbi9rZXl3b3JkLmV4dGVuZHMucGhwIFBIUDQgZXh0ZW5kcyBkb2N1bWVudGF0aW9uCgkgKiBAbGluayBodHRwOi8vcGhwLm5ldC9tYW51YWwvZW4vbGFuZ3VhZ2Uub29wNS5iYXNpYy5waHAjbGFuZ3VhZ2Uub29wNS5iYXNpYy5leHRlbmRzIFBIUDUgZXh0ZW5kcyBkb2N1bWVudGF0aW9uCgkgKi8KCWZ1bmN0aW9uIHNldF9jb3B5cmlnaHRfY2xhc3MoJGNsYXNzID0gJ1NpbXBsZVBpZV9Db3B5cmlnaHQnKQoJewoJCWlmIChTaW1wbGVQaWVfTWlzYzo6aXNfc3ViY2xhc3Nfb2YoJGNsYXNzLCAnU2ltcGxlUGllX0NvcHlyaWdodCcpKQoJCXsKCQkJJHRoaXMtPmNvcHlyaWdodF9jbGFzcyA9ICRjbGFzczsKCQkJcmV0dXJuIHRydWU7CgkJfQoJCXJldHVybiBmYWxzZTsKCX0KCgkvKioKCSAqIEFsbG93cyB5b3UgdG8gY2hhbmdlIHdoaWNoIGNsYXNzIFNpbXBsZVBpZSB1c2VzIGZvciA8bWVkaWE6Y3JlZGl0PgoJICogVXNlZnVsIHdoZW4geW91IGFyZSBvdmVybG9hZGluZyBvciBleHRlbmRpbmcgU2ltcGxlUGllJ3MgZGVmYXVsdCBjbGFzc2VzLgoJICoKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAcGFyYW0gc3RyaW5nICRjbGFzcyBOYW1lIG9mIGN1c3RvbSBjbGFzcy4KCSAqIEBsaW5rIGh0dHA6Ly9waHAubmV0L21hbnVhbC9lbi9rZXl3b3JkLmV4dGVuZHMucGhwIFBIUDQgZXh0ZW5kcyBkb2N1bWVudGF0aW9uCgkgKiBAbGluayBodHRwOi8vcGhwLm5ldC9tYW51YWwvZW4vbGFuZ3VhZ2Uub29wNS5iYXNpYy5waHAjbGFuZ3VhZ2Uub29wNS5iYXNpYy5leHRlbmRzIFBIUDUgZXh0ZW5kcyBkb2N1bWVudGF0aW9uCgkgKi8KCWZ1bmN0aW9uIHNldF9jcmVkaXRfY2xhc3MoJGNsYXNzID0gJ1NpbXBsZVBpZV9DcmVkaXQnKQoJewoJCWlmIChTaW1wbGVQaWVfTWlzYzo6aXNfc3ViY2xhc3Nfb2YoJGNsYXNzLCAnU2ltcGxlUGllX0NyZWRpdCcpKQoJCXsKCQkJJHRoaXMtPmNyZWRpdF9jbGFzcyA9ICRjbGFzczsKCQkJcmV0dXJuIHRydWU7CgkJfQoJCXJldHVybiBmYWxzZTsKCX0KCgkvKioKCSAqIEFsbG93cyB5b3UgdG8gY2hhbmdlIHdoaWNoIGNsYXNzIFNpbXBsZVBpZSB1c2VzIGZvciA8bWVkaWE6cmF0aW5nPgoJICogVXNlZnVsIHdoZW4geW91IGFyZSBvdmVybG9hZGluZyBvciBleHRlbmRpbmcgU2ltcGxlUGllJ3MgZGVmYXVsdCBjbGFzc2VzLgoJICoKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAcGFyYW0gc3RyaW5nICRjbGFzcyBOYW1lIG9mIGN1c3RvbSBjbGFzcy4KCSAqIEBsaW5rIGh0dHA6Ly9waHAubmV0L21hbnVhbC9lbi9rZXl3b3JkLmV4dGVuZHMucGhwIFBIUDQgZXh0ZW5kcyBkb2N1bWVudGF0aW9uCgkgKiBAbGluayBodHRwOi8vcGhwLm5ldC9tYW51YWwvZW4vbGFuZ3VhZ2Uub29wNS5iYXNpYy5waHAjbGFuZ3VhZ2Uub29wNS5iYXNpYy5leHRlbmRzIFBIUDUgZXh0ZW5kcyBkb2N1bWVudGF0aW9uCgkgKi8KCWZ1bmN0aW9uIHNldF9yYXRpbmdfY2xhc3MoJGNsYXNzID0gJ1NpbXBsZVBpZV9SYXRpbmcnKQoJewoJCWlmIChTaW1wbGVQaWVfTWlzYzo6aXNfc3ViY2xhc3Nfb2YoJGNsYXNzLCAnU2ltcGxlUGllX1JhdGluZycpKQoJCXsKCQkJJHRoaXMtPnJhdGluZ19jbGFzcyA9ICRjbGFzczsKCQkJcmV0dXJuIHRydWU7CgkJfQoJCXJldHVybiBmYWxzZTsKCX0KCgkvKioKCSAqIEFsbG93cyB5b3UgdG8gY2hhbmdlIHdoaWNoIGNsYXNzIFNpbXBsZVBpZSB1c2VzIGZvciA8bWVkaWE6cmVzdHJpY3Rpb24+CgkgKiBVc2VmdWwgd2hlbiB5b3UgYXJlIG92ZXJsb2FkaW5nIG9yIGV4dGVuZGluZyBTaW1wbGVQaWUncyBkZWZhdWx0IGNsYXNzZXMuCgkgKgoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEBwYXJhbSBzdHJpbmcgJGNsYXNzIE5hbWUgb2YgY3VzdG9tIGNsYXNzLgoJICogQGxpbmsgaHR0cDovL3BocC5uZXQvbWFudWFsL2VuL2tleXdvcmQuZXh0ZW5kcy5waHAgUEhQNCBleHRlbmRzIGRvY3VtZW50YXRpb24KCSAqIEBsaW5rIGh0dHA6Ly9waHAubmV0L21hbnVhbC9lbi9sYW5ndWFnZS5vb3A1LmJhc2ljLnBocCNsYW5ndWFnZS5vb3A1LmJhc2ljLmV4dGVuZHMgUEhQNSBleHRlbmRzIGRvY3VtZW50YXRpb24KCSAqLwoJZnVuY3Rpb24gc2V0X3Jlc3RyaWN0aW9uX2NsYXNzKCRjbGFzcyA9ICdTaW1wbGVQaWVfUmVzdHJpY3Rpb24nKQoJewoJCWlmIChTaW1wbGVQaWVfTWlzYzo6aXNfc3ViY2xhc3Nfb2YoJGNsYXNzLCAnU2ltcGxlUGllX1Jlc3RyaWN0aW9uJykpCgkJewoJCQkkdGhpcy0+cmVzdHJpY3Rpb25fY2xhc3MgPSAkY2xhc3M7CgkJCXJldHVybiB0cnVlOwoJCX0KCQlyZXR1cm4gZmFsc2U7Cgl9CgoJLyoqCgkgKiBBbGxvd3MgeW91IHRvIGNoYW5nZSB3aGljaCBjbGFzcyBTaW1wbGVQaWUgdXNlcyBmb3IgY29udGVudC10eXBlIHNuaWZmaW5nLgoJICogVXNlZnVsIHdoZW4geW91IGFyZSBvdmVybG9hZGluZyBvciBleHRlbmRpbmcgU2ltcGxlUGllJ3MgZGVmYXVsdCBjbGFzc2VzLgoJICoKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAcGFyYW0gc3RyaW5nICRjbGFzcyBOYW1lIG9mIGN1c3RvbSBjbGFzcy4KCSAqIEBsaW5rIGh0dHA6Ly9waHAubmV0L21hbnVhbC9lbi9rZXl3b3JkLmV4dGVuZHMucGhwIFBIUDQgZXh0ZW5kcyBkb2N1bWVudGF0aW9uCgkgKiBAbGluayBodHRwOi8vcGhwLm5ldC9tYW51YWwvZW4vbGFuZ3VhZ2Uub29wNS5iYXNpYy5waHAjbGFuZ3VhZ2Uub29wNS5iYXNpYy5leHRlbmRzIFBIUDUgZXh0ZW5kcyBkb2N1bWVudGF0aW9uCgkgKi8KCWZ1bmN0aW9uIHNldF9jb250ZW50X3R5cGVfc25pZmZlcl9jbGFzcygkY2xhc3MgPSAnU2ltcGxlUGllX0NvbnRlbnRfVHlwZV9TbmlmZmVyJykKCXsKCQlpZiAoU2ltcGxlUGllX01pc2M6OmlzX3N1YmNsYXNzX29mKCRjbGFzcywgJ1NpbXBsZVBpZV9Db250ZW50X1R5cGVfU25pZmZlcicpKQoJCXsKCQkJJHRoaXMtPmNvbnRlbnRfdHlwZV9zbmlmZmVyX2NsYXNzID0gJGNsYXNzOwoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgkJcmV0dXJuIGZhbHNlOwoJfQoKCS8qKgoJICogQWxsb3dzIHlvdSB0byBjaGFuZ2Ugd2hpY2ggY2xhc3MgU2ltcGxlUGllIHVzZXMgaXRlbSBzb3VyY2VzLgoJICogVXNlZnVsIHdoZW4geW91IGFyZSBvdmVybG9hZGluZyBvciBleHRlbmRpbmcgU2ltcGxlUGllJ3MgZGVmYXVsdCBjbGFzc2VzLgoJICoKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAcGFyYW0gc3RyaW5nICRjbGFzcyBOYW1lIG9mIGN1c3RvbSBjbGFzcy4KCSAqIEBsaW5rIGh0dHA6Ly9waHAubmV0L21hbnVhbC9lbi9rZXl3b3JkLmV4dGVuZHMucGhwIFBIUDQgZXh0ZW5kcyBkb2N1bWVudGF0aW9uCgkgKiBAbGluayBodHRwOi8vcGhwLm5ldC9tYW51YWwvZW4vbGFuZ3VhZ2Uub29wNS5iYXNpYy5waHAjbGFuZ3VhZ2Uub29wNS5iYXNpYy5leHRlbmRzIFBIUDUgZXh0ZW5kcyBkb2N1bWVudGF0aW9uCgkgKi8KCWZ1bmN0aW9uIHNldF9zb3VyY2VfY2xhc3MoJGNsYXNzID0gJ1NpbXBsZVBpZV9Tb3VyY2UnKQoJewoJCWlmIChTaW1wbGVQaWVfTWlzYzo6aXNfc3ViY2xhc3Nfb2YoJGNsYXNzLCAnU2ltcGxlUGllX1NvdXJjZScpKQoJCXsKCQkJJHRoaXMtPnNvdXJjZV9jbGFzcyA9ICRjbGFzczsKCQkJcmV0dXJuIHRydWU7CgkJfQoJCXJldHVybiBmYWxzZTsKCX0KCgkvKioKCSAqIEFsbG93cyB5b3UgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgdXNlciBhZ2VudCBzdHJpbmcuCgkgKgoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEBwYXJhbSBzdHJpbmcgJHVhIE5ldyB1c2VyIGFnZW50IHN0cmluZy4KCSAqLwoJZnVuY3Rpb24gc2V0X3VzZXJhZ2VudCgkdWEgPSBTSU1QTEVQSUVfVVNFUkFHRU5UKQoJewoJCSR0aGlzLT51c2VyYWdlbnQgPSAoc3RyaW5nKSAkdWE7Cgl9CgoJLyoqCgkgKiBTZXQgY2FsbGJhY2sgZnVuY3Rpb24gdG8gY3JlYXRlIGNhY2hlIGZpbGVuYW1lIHdpdGgKCSAqCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHBhcmFtIG1peGVkICRmdW5jdGlvbiBDYWxsYmFjayBmdW5jdGlvbgoJICovCglmdW5jdGlvbiBzZXRfY2FjaGVfbmFtZV9mdW5jdGlvbigkZnVuY3Rpb24gPSAnbWQ1JykKCXsKCQlpZiAoaXNfY2FsbGFibGUoJGZ1bmN0aW9uKSkKCQl7CgkJCSR0aGlzLT5jYWNoZV9uYW1lX2Z1bmN0aW9uID0gJGZ1bmN0aW9uOwoJCX0KCX0KCgkvKioKCSAqIFNldCBqYXZhc2NyaXB0IHF1ZXJ5IHN0cmluZyBwYXJhbWV0ZXIKCSAqCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHBhcmFtIG1peGVkICRnZXQgSmF2YXNjcmlwdCBxdWVyeSBzdHJpbmcgcGFyYW1ldGVyCgkgKi8KCWZ1bmN0aW9uIHNldF9qYXZhc2NyaXB0KCRnZXQgPSAnanMnKQoJewoJCWlmICgkZ2V0KQoJCXsKCQkJJHRoaXMtPmphdmFzY3JpcHQgPSAoc3RyaW5nKSAkZ2V0OwoJCX0KCQllbHNlCgkJewoJCQkkdGhpcy0+amF2YXNjcmlwdCA9IGZhbHNlOwoJCX0KCX0KCgkvKioKCSAqIFNldCBvcHRpb25zIHRvIG1ha2UgU1AgYXMgZmFzdCBhcyBwb3NzaWJsZS4gIEZvcmdvZXMgYQoJICogc3Vic3RhbnRpYWwgYW1vdW50IG9mIGRhdGEgc2FuaXRpemF0aW9uIGluIGZhdm9yIG9mIHNwZWVkLgoJICoKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAcGFyYW0gYm9vbCAkc2V0IFdoZXRoZXIgdG8gc2V0IHRoZW0gb3Igbm90CgkgKi8KCWZ1bmN0aW9uIHNldF9zdHVwaWRseV9mYXN0KCRzZXQgPSBmYWxzZSkKCXsKCQlpZiAoJHNldCkKCQl7CgkJCSR0aGlzLT5lbmFibGVfb3JkZXJfYnlfZGF0ZShmYWxzZSk7CgkJCSR0aGlzLT5yZW1vdmVfZGl2KGZhbHNlKTsKCQkJJHRoaXMtPnN0cmlwX2NvbW1lbnRzKGZhbHNlKTsKCQkJJHRoaXMtPnN0cmlwX2h0bWx0YWdzKGZhbHNlKTsKCQkJJHRoaXMtPnN0cmlwX2F0dHJpYnV0ZXMoZmFsc2UpOwoJCQkkdGhpcy0+c2V0X2ltYWdlX2hhbmRsZXIoZmFsc2UpOwoJCX0KCX0KCgkvKioKCSAqIFNldCBtYXhpbXVtIG51bWJlciBvZiBmZWVkcyB0byBjaGVjayB3aXRoIGF1dG9kaXNjb3ZlcnkKCSAqCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHBhcmFtIGludCAkbWF4IE1heGltdW0gbnVtYmVyIG9mIGZlZWRzIHRvIGNoZWNrCgkgKi8KCWZ1bmN0aW9uIHNldF9tYXhfY2hlY2tlZF9mZWVkcygkbWF4ID0gMTApCgl7CgkJJHRoaXMtPm1heF9jaGVja2VkX2ZlZWRzID0gKGludCkgJG1heDsKCX0KCglmdW5jdGlvbiByZW1vdmVfZGl2KCRlbmFibGUgPSB0cnVlKQoJewoJCSR0aGlzLT5zYW5pdGl6ZS0+cmVtb3ZlX2RpdigkZW5hYmxlKTsKCX0KCglmdW5jdGlvbiBzdHJpcF9odG1sdGFncygkdGFncyA9ICcnLCAkZW5jb2RlID0gbnVsbCkKCXsKCQlpZiAoJHRhZ3MgPT09ICcnKQoJCXsKCQkJJHRhZ3MgPSAkdGhpcy0+c3RyaXBfaHRtbHRhZ3M7CgkJfQoJCSR0aGlzLT5zYW5pdGl6ZS0+c3RyaXBfaHRtbHRhZ3MoJHRhZ3MpOwoJCWlmICgkZW5jb2RlICE9PSBudWxsKQoJCXsKCQkJJHRoaXMtPnNhbml0aXplLT5lbmNvZGVfaW5zdGVhZF9vZl9zdHJpcCgkdGFncyk7CgkJfQoJfQoKCWZ1bmN0aW9uIGVuY29kZV9pbnN0ZWFkX29mX3N0cmlwKCRlbmFibGUgPSB0cnVlKQoJewoJCSR0aGlzLT5zYW5pdGl6ZS0+ZW5jb2RlX2luc3RlYWRfb2Zfc3RyaXAoJGVuYWJsZSk7Cgl9CgoJZnVuY3Rpb24gc3RyaXBfYXR0cmlidXRlcygkYXR0cmlicyA9ICcnKQoJewoJCWlmICgkYXR0cmlicyA9PT0gJycpCgkJewoJCQkkYXR0cmlicyA9ICR0aGlzLT5zdHJpcF9hdHRyaWJ1dGVzOwoJCX0KCQkkdGhpcy0+c2FuaXRpemUtPnN0cmlwX2F0dHJpYnV0ZXMoJGF0dHJpYnMpOwoJfQoKCWZ1bmN0aW9uIHNldF9vdXRwdXRfZW5jb2RpbmcoJGVuY29kaW5nID0gJ1VURi04JykKCXsKCQkkdGhpcy0+c2FuaXRpemUtPnNldF9vdXRwdXRfZW5jb2RpbmcoJGVuY29kaW5nKTsKCX0KCglmdW5jdGlvbiBzdHJpcF9jb21tZW50cygkc3RyaXAgPSBmYWxzZSkKCXsKCQkkdGhpcy0+c2FuaXRpemUtPnN0cmlwX2NvbW1lbnRzKCRzdHJpcCk7Cgl9CgoJLyoqCgkgKiBTZXQgZWxlbWVudC9hdHRyaWJ1dGUga2V5L3ZhbHVlIHBhaXJzIG9mIEhUTUwgYXR0cmlidXRlcwoJICogY29udGFpbmluZyBVUkxzIHRoYXQgbmVlZCB0byBiZSByZXNvbHZlZCByZWxhdGl2ZSB0byB0aGUgZmVlZAoJICoKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAc2luY2UgMS4wCgkgKiBAcGFyYW0gYXJyYXkgJGVsZW1lbnRfYXR0cmlidXRlIEVsZW1lbnQvYXR0cmlidXRlIGtleS92YWx1ZSBwYWlycwoJICovCglmdW5jdGlvbiBzZXRfdXJsX3JlcGxhY2VtZW50cygkZWxlbWVudF9hdHRyaWJ1dGUgPSBhcnJheSgnYScgPT4gJ2hyZWYnLCAnYXJlYScgPT4gJ2hyZWYnLCAnYmxvY2txdW90ZScgPT4gJ2NpdGUnLCAnZGVsJyA9PiAnY2l0ZScsICdmb3JtJyA9PiAnYWN0aW9uJywgJ2ltZycgPT4gYXJyYXkoJ2xvbmdkZXNjJywgJ3NyYycpLCAnaW5wdXQnID0+ICdzcmMnLCAnaW5zJyA9PiAnY2l0ZScsICdxJyA9PiAnY2l0ZScpKQoJewoJCSR0aGlzLT5zYW5pdGl6ZS0+c2V0X3VybF9yZXBsYWNlbWVudHMoJGVsZW1lbnRfYXR0cmlidXRlKTsKCX0KCgkvKioKCSAqIFNldCB0aGUgaGFuZGxlciB0byBlbmFibGUgdGhlIGRpc3BsYXkgb2YgY2FjaGVkIGZhdmljb25zLgoJICoKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAcGFyYW0gc3RyICRwYWdlIFdlYi1hY2Nlc3NpYmxlIHBhdGggdG8gdGhlIGhhbmRsZXJfZmF2aWNvbi5waHAgZmlsZS4KCSAqIEBwYXJhbSBzdHIgJHFzIFRoZSBxdWVyeSBzdHJpbmcgdGhhdCB0aGUgdmFsdWUgc2hvdWxkIGJlIHBhc3NlZCB0by4KCSAqLwoJZnVuY3Rpb24gc2V0X2Zhdmljb25faGFuZGxlcigkcGFnZSA9IGZhbHNlLCAkcXMgPSAnaScpCgl7CgkJaWYgKCRwYWdlICE9IGZhbHNlKQoJCXsKCQkJJHRoaXMtPmZhdmljb25faGFuZGxlciA9ICRwYWdlIC4gJz8nIC4gJHFzIC4gJz0nOwoJCX0KCQllbHNlCgkJewoJCQkkdGhpcy0+ZmF2aWNvbl9oYW5kbGVyID0gJyc7CgkJfQoJfQoKCS8qKgoJICogU2V0IHRoZSBoYW5kbGVyIHRvIGVuYWJsZSB0aGUgZGlzcGxheSBvZiBjYWNoZWQgaW1hZ2VzLgoJICoKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAcGFyYW0gc3RyICRwYWdlIFdlYi1hY2Nlc3NpYmxlIHBhdGggdG8gdGhlIGhhbmRsZXJfaW1hZ2UucGhwIGZpbGUuCgkgKiBAcGFyYW0gc3RyICRxcyBUaGUgcXVlcnkgc3RyaW5nIHRoYXQgdGhlIHZhbHVlIHNob3VsZCBiZSBwYXNzZWQgdG8uCgkgKi8KCWZ1bmN0aW9uIHNldF9pbWFnZV9oYW5kbGVyKCRwYWdlID0gZmFsc2UsICRxcyA9ICdpJykKCXsKCQlpZiAoJHBhZ2UgIT0gZmFsc2UpCgkJewoJCQkkdGhpcy0+c2FuaXRpemUtPnNldF9pbWFnZV9oYW5kbGVyKCRwYWdlIC4gJz8nIC4gJHFzIC4gJz0nKTsKCQl9CgkJZWxzZQoJCXsKCQkJJHRoaXMtPmltYWdlX2hhbmRsZXIgPSAnJzsKCQl9Cgl9CgoJLyoqCgkgKiBTZXQgdGhlIGxpbWl0IGZvciBpdGVtcyByZXR1cm5lZCBwZXItZmVlZCB3aXRoIG11bHRpZmVlZHMuCgkgKgoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEBwYXJhbSBpbnRlZ2VyICRsaW1pdCBUaGUgbWF4aW11bSBudW1iZXIgb2YgaXRlbXMgdG8gcmV0dXJuLgoJICovCglmdW5jdGlvbiBzZXRfaXRlbV9saW1pdCgkbGltaXQgPSAwKQoJewoJCSR0aGlzLT5pdGVtX2xpbWl0ID0gKGludCkgJGxpbWl0OwoJfQoKCWZ1bmN0aW9uIGluaXQoKQoJewoJCWlmICgoZnVuY3Rpb25fZXhpc3RzKCd2ZXJzaW9uX2NvbXBhcmUnKSAmJiB2ZXJzaW9uX2NvbXBhcmUoUEhQX1ZFUlNJT04sICc0LjMuMCcsICc8JykpIHx8ICFleHRlbnNpb25fbG9hZGVkKCd4bWwnKSB8fCAhZXh0ZW5zaW9uX2xvYWRlZCgncGNyZScpKQoJCXsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQlpZiAoaXNzZXQoJF9HRVRbJHRoaXMtPmphdmFzY3JpcHRdKSkKCQl7CgkJCWlmIChmdW5jdGlvbl9leGlzdHMoJ29iX2d6aGFuZGxlcicpKQoJCQl7CgkJCQlvYl9zdGFydCgnb2JfZ3poYW5kbGVyJyk7CgkJCX0KCQkJaGVhZGVyKCdDb250ZW50LXR5cGU6IHRleHQvamF2YXNjcmlwdDsgY2hhcnNldDogVVRGLTgnKTsKCQkJaGVhZGVyKCdDYWNoZS1Db250cm9sOiBtdXN0LXJldmFsaWRhdGUnKTsKCQkJaGVhZGVyKCdFeHBpcmVzOiAnIC4gZ21kYXRlKCdELCBkIE0gWSBIOmk6cycsIHRpbWUoKSArIDYwNDgwMCkgLiAnIEdNVCcpOyAvLyA3IGRheXMKCQkJPz4KZnVuY3Rpb24gZW1iZWRfb2RlbyhsaW5rKSB7Cglkb2N1bWVudC53cml0ZWxuKCc8ZW1iZWQgc3JjPSJodHRwOi8vb2Rlby5jb20vZmxhc2gvYXVkaW9fcGxheWVyX2Z1bGxzaXplLnN3ZiIgcGx1Z2luc3BhZ2U9Imh0dHA6Ly93d3cubWFjcm9tZWRpYS5jb20vZ28vZ2V0Zmxhc2hwbGF5ZXIiIHR5cGU9ImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIiBxdWFsaXR5PSJoaWdoIiB3aWR0aD0iNDQwIiBoZWlnaHQ9IjgwIiB3bW9kZT0idHJhbnNwYXJlbnQiIGFsbG93U2NyaXB0QWNjZXNzPSJhbnkiIGZsYXNodmFycz0idmFsaWRfc2FtcGxlX3JhdGU9dHJ1ZSZleHRlcm5hbF91cmw9JytsaW5rKyciPjwvZW1iZWQ+Jyk7Cn0KCmZ1bmN0aW9uIGVtYmVkX3F1aWNrdGltZSh0eXBlLCBiZ2NvbG9yLCB3aWR0aCwgaGVpZ2h0LCBsaW5rLCBwbGFjZWhvbGRlciwgbG9vcCkgewoJaWYgKHBsYWNlaG9sZGVyICE9ICcnKSB7CgkJZG9jdW1lbnQud3JpdGVsbignPGVtYmVkIHR5cGU9IicrdHlwZSsnIiBzdHlsZT0iY3Vyc29yOmhhbmQ7IGN1cnNvcjpwb2ludGVyOyIgaHJlZj0iJytsaW5rKyciIHNyYz0iJytwbGFjZWhvbGRlcisnIiB3aWR0aD0iJyt3aWR0aCsnIiBoZWlnaHQ9IicraGVpZ2h0KyciIGF1dG9wbGF5PSJmYWxzZSIgdGFyZ2V0PSJteXNlbGYiIGNvbnRyb2xsZXI9ImZhbHNlIiBsb29wPSInK2xvb3ArJyIgc2NhbGU9ImFzcGVjdCIgYmdjb2xvcj0iJytiZ2NvbG9yKyciIHBsdWdpbnNwYWdlPSJodHRwOi8vd3d3LmFwcGxlLmNvbS9xdWlja3RpbWUvZG93bmxvYWQvIj48L2VtYmVkPicpOwoJfQoJZWxzZSB7CgkJZG9jdW1lbnQud3JpdGVsbignPGVtYmVkIHR5cGU9IicrdHlwZSsnIiBzdHlsZT0iY3Vyc29yOmhhbmQ7IGN1cnNvcjpwb2ludGVyOyIgc3JjPSInK2xpbmsrJyIgd2lkdGg9Iicrd2lkdGgrJyIgaGVpZ2h0PSInK2hlaWdodCsnIiBhdXRvcGxheT0iZmFsc2UiIHRhcmdldD0ibXlzZWxmIiBjb250cm9sbGVyPSJ0cnVlIiBsb29wPSInK2xvb3ArJyIgc2NhbGU9ImFzcGVjdCIgYmdjb2xvcj0iJytiZ2NvbG9yKyciIHBsdWdpbnNwYWdlPSJodHRwOi8vd3d3LmFwcGxlLmNvbS9xdWlja3RpbWUvZG93bmxvYWQvIj48L2VtYmVkPicpOwoJfQp9CgpmdW5jdGlvbiBlbWJlZF9mbGFzaChiZ2NvbG9yLCB3aWR0aCwgaGVpZ2h0LCBsaW5rLCBsb29wLCB0eXBlKSB7Cglkb2N1bWVudC53cml0ZWxuKCc8ZW1iZWQgc3JjPSInK2xpbmsrJyIgcGx1Z2luc3BhZ2U9Imh0dHA6Ly93d3cubWFjcm9tZWRpYS5jb20vZ28vZ2V0Zmxhc2hwbGF5ZXIiIHR5cGU9IicrdHlwZSsnIiBxdWFsaXR5PSJoaWdoIiB3aWR0aD0iJyt3aWR0aCsnIiBoZWlnaHQ9IicraGVpZ2h0KyciIGJnY29sb3I9IicrYmdjb2xvcisnIiBsb29wPSInK2xvb3ArJyI+PC9lbWJlZD4nKTsKfQoKZnVuY3Rpb24gZW1iZWRfZmx2KHdpZHRoLCBoZWlnaHQsIGxpbmssIHBsYWNlaG9sZGVyLCBsb29wLCBwbGF5ZXIpIHsKCWRvY3VtZW50LndyaXRlbG4oJzxlbWJlZCBzcmM9IicrcGxheWVyKyciIHBsdWdpbnNwYWdlPSJodHRwOi8vd3d3Lm1hY3JvbWVkaWEuY29tL2dvL2dldGZsYXNocGxheWVyIiB0eXBlPSJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCIgcXVhbGl0eT0iaGlnaCIgd2lkdGg9Iicrd2lkdGgrJyIgaGVpZ2h0PSInK2hlaWdodCsnIiB3bW9kZT0idHJhbnNwYXJlbnQiIGZsYXNodmFycz0iZmlsZT0nK2xpbmsrJyZhdXRvc3RhcnQ9ZmFsc2UmcmVwZWF0PScrbG9vcCsnJnNob3dkaWdpdHM9dHJ1ZSZzaG93ZnNidXR0b249ZmFsc2UiPjwvZW1iZWQ+Jyk7Cn0KCmZ1bmN0aW9uIGVtYmVkX3dtZWRpYSh3aWR0aCwgaGVpZ2h0LCBsaW5rKSB7Cglkb2N1bWVudC53cml0ZWxuKCc8ZW1iZWQgdHlwZT0iYXBwbGljYXRpb24veC1tcGxheWVyMiIgc3JjPSInK2xpbmsrJyIgYXV0b3NpemU9IjEiIHdpZHRoPSInK3dpZHRoKyciIGhlaWdodD0iJytoZWlnaHQrJyIgc2hvd2NvbnRyb2xzPSIxIiBzaG93c3RhdHVzYmFyPSIwIiBzaG93ZGlzcGxheT0iMCIgYXV0b3N0YXJ0PSIwIj48L2VtYmVkPicpOwp9CgkJCTw/cGhwCgkJCWV4aXQ7CgkJfQoKCQkvLyBQYXNzIHdoYXRldmVyIHdhcyBzZXQgd2l0aCBjb25maWcgb3B0aW9ucyBvdmVyIHRvIHRoZSBzYW5pdGl6ZXIuCgkJJHRoaXMtPnNhbml0aXplLT5wYXNzX2NhY2hlX2RhdGEoJHRoaXMtPmNhY2hlLCAkdGhpcy0+Y2FjaGVfbG9jYXRpb24sICR0aGlzLT5jYWNoZV9uYW1lX2Z1bmN0aW9uLCAkdGhpcy0+Y2FjaGVfY2xhc3MpOwoJCSR0aGlzLT5zYW5pdGl6ZS0+cGFzc19maWxlX2RhdGEoJHRoaXMtPmZpbGVfY2xhc3MsICR0aGlzLT50aW1lb3V0LCAkdGhpcy0+dXNlcmFnZW50LCAkdGhpcy0+Zm9yY2VfZnNvY2tvcGVuKTsKCgkJaWYgKCR0aGlzLT5mZWVkX3VybCAhPT0gbnVsbCB8fCAkdGhpcy0+cmF3X2RhdGEgIT09IG51bGwpCgkJewoJCQkkdGhpcy0+ZGF0YSA9IGFycmF5KCk7CgkJCSR0aGlzLT5tdWx0aWZlZWRfb2JqZWN0cyA9IGFycmF5KCk7CgkJCSRjYWNoZSA9IGZhbHNlOwoKCQkJaWYgKCR0aGlzLT5mZWVkX3VybCAhPT0gbnVsbCkKCQkJewoJCQkJJHBhcnNlZF9mZWVkX3VybCA9IFNpbXBsZVBpZV9NaXNjOjpwYXJzZV91cmwoJHRoaXMtPmZlZWRfdXJsKTsKCQkJCS8vIERlY2lkZSB3aGV0aGVyIHRvIGVuYWJsZSBjYWNoaW5nCgkJCQlpZiAoJHRoaXMtPmNhY2hlICYmICRwYXJzZWRfZmVlZF91cmxbJ3NjaGVtZSddICE9PSAnJykKCQkJCXsKCQkJCQkkY2FjaGUgPSBjYWxsX3VzZXJfZnVuYyhhcnJheSgkdGhpcy0+Y2FjaGVfY2xhc3MsICdjcmVhdGUnKSwgJHRoaXMtPmNhY2hlX2xvY2F0aW9uLCBjYWxsX3VzZXJfZnVuYygkdGhpcy0+Y2FjaGVfbmFtZV9mdW5jdGlvbiwgJHRoaXMtPmZlZWRfdXJsKSwgJ3NwYycpOwoJCQkJfQoJCQkJLy8gSWYgaXQncyBlbmFibGVkIGFuZCB3ZSBkb24ndCB3YW50IGFuIFhNTCBkdW1wLCB1c2UgdGhlIGNhY2hlCgkJCQlpZiAoJGNhY2hlICYmICEkdGhpcy0+eG1sX2R1bXApCgkJCQl7CgkJCQkJLy8gTG9hZCB0aGUgQ2FjaGUKCQkJCQkkdGhpcy0+ZGF0YSA9ICRjYWNoZS0+bG9hZCgpOwoJCQkJCWlmICghZW1wdHkoJHRoaXMtPmRhdGEpKQoJCQkJCXsKCQkJCQkJLy8gSWYgdGhlIGNhY2hlIGlzIGZvciBhbiBvdXRkYXRlZCBidWlsZCBvZiBTaW1wbGVQaWUKCQkJCQkJaWYgKCFpc3NldCgkdGhpcy0+ZGF0YVsnYnVpbGQnXSkgfHwgJHRoaXMtPmRhdGFbJ2J1aWxkJ10gIT0gU0lNUExFUElFX0JVSUxEKQoJCQkJCQl7CgkJCQkJCQkkY2FjaGUtPnVubGluaygpOwoJCQkJCQkJJHRoaXMtPmRhdGEgPSBhcnJheSgpOwoJCQkJCQl9CgkJCQkJCS8vIElmIHdlJ3ZlIGhpdCBhIGNvbGxpc2lvbiBqdXN0IHJlcnVuIGl0IHdpdGggY2FjaGluZyBkaXNhYmxlZAoJCQkJCQllbHNlaWYgKGlzc2V0KCR0aGlzLT5kYXRhWyd1cmwnXSkgJiYgJHRoaXMtPmRhdGFbJ3VybCddICE9ICR0aGlzLT5mZWVkX3VybCkKCQkJCQkJewoJCQkJCQkJJGNhY2hlID0gZmFsc2U7CgkJCQkJCQkkdGhpcy0+ZGF0YSA9IGFycmF5KCk7CgkJCQkJCX0KCQkJCQkJLy8gSWYgd2UndmUgZ290IGEgbm9uIGZlZWRfdXJsIHN0b3JlZCAoaWYgdGhlIHBhZ2UgaXNuJ3QgYWN0dWFsbHkgYSBmZWVkLCBvciBpcyBhIHJlZGlyZWN0KSB1c2UgdGhhdCBVUkwuCgkJCQkJCWVsc2VpZiAoaXNzZXQoJHRoaXMtPmRhdGFbJ2ZlZWRfdXJsJ10pKQoJCQkJCQl7CgkJCQkJCQkvLyBJZiB0aGUgYXV0b2Rpc2NvdmVyeSBjYWNoZSBpcyBzdGlsbCB2YWxpZCB1c2UgaXQuCgkJCQkJCQlpZiAoJGNhY2hlLT5tdGltZSgpICsgJHRoaXMtPmF1dG9kaXNjb3ZlcnlfY2FjaGVfZHVyYXRpb24gPiB0aW1lKCkpCgkJCQkJCQl7CgkJCQkJCQkJLy8gRG8gbm90IG5lZWQgdG8gZG8gZmVlZCBhdXRvZGlzY292ZXJ5IHlldC4KCQkJCQkJCQlpZiAoJHRoaXMtPmRhdGFbJ2ZlZWRfdXJsJ10gPT0gJHRoaXMtPmRhdGFbJ3VybCddKQoJCQkJCQkJCXsKCQkJCQkJCQkJJGNhY2hlLT51bmxpbmsoKTsKCQkJCQkJCQkJJHRoaXMtPmRhdGEgPSBhcnJheSgpOwoJCQkJCQkJCX0KCQkJCQkJCQllbHNlCgkJCQkJCQkJewoJCQkJCQkJCQkkdGhpcy0+c2V0X2ZlZWRfdXJsKCR0aGlzLT5kYXRhWydmZWVkX3VybCddKTsKCQkJCQkJCQkJcmV0dXJuICR0aGlzLT5pbml0KCk7CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCS8vIENoZWNrIGlmIHRoZSBjYWNoZSBoYXMgYmVlbiB1cGRhdGVkCgkJCQkJCWVsc2VpZiAoJGNhY2hlLT5tdGltZSgpICsgJHRoaXMtPmNhY2hlX2R1cmF0aW9uIDwgdGltZSgpKQoJCQkJCQl7CgkJCQkJCQkvLyBJZiB3ZSBoYXZlIGxhc3QtbW9kaWZpZWQgYW5kL29yIGV0YWcgc2V0CgkJCQkJCQlpZiAoaXNzZXQoJHRoaXMtPmRhdGFbJ2hlYWRlcnMnXVsnbGFzdC1tb2RpZmllZCddKSB8fCBpc3NldCgkdGhpcy0+ZGF0YVsnaGVhZGVycyddWydldGFnJ10pKQoJCQkJCQkJewoJCQkJCQkJCSRoZWFkZXJzID0gYXJyYXkoKTsKCQkJCQkJCQlpZiAoaXNzZXQoJHRoaXMtPmRhdGFbJ2hlYWRlcnMnXVsnbGFzdC1tb2RpZmllZCddKSkKCQkJCQkJCQl7CgkJCQkJCQkJCSRoZWFkZXJzWydpZi1tb2RpZmllZC1zaW5jZSddID0gJHRoaXMtPmRhdGFbJ2hlYWRlcnMnXVsnbGFzdC1tb2RpZmllZCddOwoJCQkJCQkJCX0KCQkJCQkJCQlpZiAoaXNzZXQoJHRoaXMtPmRhdGFbJ2hlYWRlcnMnXVsnZXRhZyddKSkKCQkJCQkJCQl7CgkJCQkJCQkJCSRoZWFkZXJzWydpZi1ub25lLW1hdGNoJ10gPSAnIicgLiAkdGhpcy0+ZGF0YVsnaGVhZGVycyddWydldGFnJ10gLiAnIic7CgkJCQkJCQkJfQoJCQkJCQkJCSRmaWxlID0mIG5ldyAkdGhpcy0+ZmlsZV9jbGFzcygkdGhpcy0+ZmVlZF91cmwsICR0aGlzLT50aW1lb3V0LzEwLCA1LCAkaGVhZGVycywgJHRoaXMtPnVzZXJhZ2VudCwgJHRoaXMtPmZvcmNlX2Zzb2Nrb3Blbik7CgkJCQkJCQkJaWYgKCRmaWxlLT5zdWNjZXNzKQoJCQkJCQkJCXsKCQkJCQkJCQkJaWYgKCRmaWxlLT5zdGF0dXNfY29kZSA9PSAzMDQpCgkJCQkJCQkJCXsKCQkJCQkJCQkJCSRjYWNoZS0+dG91Y2goKTsKCQkJCQkJCQkJCXJldHVybiB0cnVlOwoJCQkJCQkJCQl9CgkJCQkJCQkJCWVsc2UKCQkJCQkJCQkJewoJCQkJCQkJCQkJJGhlYWRlcnMgPSAkZmlsZS0+aGVhZGVyczsKCQkJCQkJCQkJfQoJCQkJCQkJCX0KCQkJCQkJCQllbHNlCgkJCQkJCQkJewoJCQkJCQkJCQl1bnNldCgkZmlsZSk7CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCS8vIElmIHRoZSBjYWNoZSBpcyBzdGlsbCB2YWxpZCwganVzdCByZXR1cm4gdHJ1ZQoJCQkJCQllbHNlCgkJCQkJCXsKCQkJCQkJCXJldHVybiB0cnVlOwoJCQkJCQl9CgkJCQkJfQoJCQkJCS8vIElmIHRoZSBjYWNoZSBpcyBlbXB0eSwgZGVsZXRlIGl0CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJJGNhY2hlLT51bmxpbmsoKTsKCQkJCQkJJHRoaXMtPmRhdGEgPSBhcnJheSgpOwoJCQkJCX0KCQkJCX0KCQkJCS8vIElmIHdlIGRvbid0IGFscmVhZHkgaGF2ZSB0aGUgZmlsZSAoaXQnbGwgb25seSBleGlzdCBpZiB3ZSd2ZSBvcGVuZWQgaXQgdG8gY2hlY2sgaWYgdGhlIGNhY2hlIGhhcyBiZWVuIG1vZGlmaWVkKSwgb3BlbiBpdC4KCQkJCWlmICghaXNzZXQoJGZpbGUpKQoJCQkJewoJCQkJCWlmIChpc19hKCR0aGlzLT5maWxlLCAnU2ltcGxlUGllX0ZpbGUnKSAmJiAkdGhpcy0+ZmlsZS0+dXJsID09ICR0aGlzLT5mZWVkX3VybCkKCQkJCQl7CgkJCQkJCSRmaWxlID0mICR0aGlzLT5maWxlOwoJCQkJCX0KCQkJCQllbHNlCgkJCQkJewoJCQkJCQkkZmlsZSA9JiBuZXcgJHRoaXMtPmZpbGVfY2xhc3MoJHRoaXMtPmZlZWRfdXJsLCAkdGhpcy0+dGltZW91dCwgNSwgbnVsbCwgJHRoaXMtPnVzZXJhZ2VudCwgJHRoaXMtPmZvcmNlX2Zzb2Nrb3Blbik7CgkJCQkJfQoJCQkJfQoJCQkJLy8gSWYgdGhlIGZpbGUgY29ubmVjdGlvbiBoYXMgYW4gZXJyb3IsIHNldCBTaW1wbGVQaWU6OmVycm9yIHRvIHRoYXQgYW5kIHF1aXQKCQkJCWlmICghJGZpbGUtPnN1Y2Nlc3MpCgkJCQl7CgkJCQkJJHRoaXMtPmVycm9yID0gJGZpbGUtPmVycm9yOwoJCQkJCWlmICghZW1wdHkoJHRoaXMtPmRhdGEpKQoJCQkJCXsKCQkJCQkJcmV0dXJuIHRydWU7CgkJCQkJfQoJCQkJCWVsc2UKCQkJCQl7CgkJCQkJCXJldHVybiBmYWxzZTsKCQkJCQl9CgkJCQl9CgoJCQkJaWYgKCEkdGhpcy0+Zm9yY2VfZmVlZCkKCQkJCXsKCQkJCQkvLyBDaGVjayBpZiB0aGUgc3VwcGxpZWQgVVJMIGlzIGEgZmVlZCwgaWYgaXQgaXNuJ3QsIGxvb2sgZm9yIGl0LgoJCQkJCSRsb2NhdGUgPSYgbmV3ICR0aGlzLT5sb2NhdG9yX2NsYXNzKCRmaWxlLCAkdGhpcy0+dGltZW91dCwgJHRoaXMtPnVzZXJhZ2VudCwgJHRoaXMtPmZpbGVfY2xhc3MsICR0aGlzLT5tYXhfY2hlY2tlZF9mZWVkcywgJHRoaXMtPmNvbnRlbnRfdHlwZV9zbmlmZmVyX2NsYXNzKTsKCQkJCQlpZiAoISRsb2NhdGUtPmlzX2ZlZWQoJGZpbGUpKQoJCQkJCXsKCQkJCQkJLy8gV2UgbmVlZCB0byB1bnNldCB0aGlzIHNvIHRoYXQgaWYgU2ltcGxlUGllOjpzZXRfZmlsZSgpIGhhcyBiZWVuIGNhbGxlZCB0aGF0IG9iamVjdCBpcyB1bnRvdWNoZWQKCQkJCQkJdW5zZXQoJGZpbGUpOwoJCQkJCQlpZiAoJGZpbGUgPSAkbG9jYXRlLT5maW5kKCR0aGlzLT5hdXRvZGlzY292ZXJ5KSkKCQkJCQkJewoJCQkJCQkJaWYgKCRjYWNoZSkKCQkJCQkJCXsKCQkJCQkJCQkkdGhpcy0+ZGF0YSA9IGFycmF5KCd1cmwnID0+ICR0aGlzLT5mZWVkX3VybCwgJ2ZlZWRfdXJsJyA9PiAkZmlsZS0+dXJsLCAnYnVpbGQnID0+IFNJTVBMRVBJRV9CVUlMRCk7CgkJCQkJCQkJaWYgKCEkY2FjaGUtPnNhdmUoJHRoaXMpKQoJCQkJCQkJCXsKCQkJCQkJCQkJdHJpZ2dlcl9lcnJvcigiJGNhY2hlLT5uYW1lIGlzIG5vdCB3cml0ZWFibGUiLCBFX1VTRVJfV0FSTklORyk7CgkJCQkJCQkJfQoJCQkJCQkJCSRjYWNoZSA9IGNhbGxfdXNlcl9mdW5jKGFycmF5KCR0aGlzLT5jYWNoZV9jbGFzcywgJ2NyZWF0ZScpLCAkdGhpcy0+Y2FjaGVfbG9jYXRpb24sIGNhbGxfdXNlcl9mdW5jKCR0aGlzLT5jYWNoZV9uYW1lX2Z1bmN0aW9uLCAkZmlsZS0+dXJsKSwgJ3NwYycpOwoJCQkJCQkJfQoJCQkJCQkJJHRoaXMtPmZlZWRfdXJsID0gJGZpbGUtPnVybDsKCQkJCQkJfQoJCQkJCQllbHNlCgkJCQkJCXsKCQkJCQkJCSR0aGlzLT5lcnJvciA9ICJBIGZlZWQgY291bGQgbm90IGJlIGZvdW5kIGF0ICR0aGlzLT5mZWVkX3VybCI7CgkJCQkJCQlTaW1wbGVQaWVfTWlzYzo6ZXJyb3IoJHRoaXMtPmVycm9yLCBFX1VTRVJfTk9USUNFLCBfX0ZJTEVfXywgX19MSU5FX18pOwoJCQkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJCQl9CgkJCQkJfQoJCQkJCSRsb2NhdGUgPSBudWxsOwoJCQkJfQoKCQkJCSRoZWFkZXJzID0gJGZpbGUtPmhlYWRlcnM7CgkJCQkkZGF0YSA9ICRmaWxlLT5ib2R5OwoJCQkJJHNuaWZmZXIgPSBuZXcgJHRoaXMtPmNvbnRlbnRfdHlwZV9zbmlmZmVyX2NsYXNzKCRmaWxlKTsKCQkJCSRzbmlmZmVkID0gJHNuaWZmZXItPmdldF90eXBlKCk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQkkZGF0YSA9ICR0aGlzLT5yYXdfZGF0YTsKCQkJfQoKCQkJLy8gU2V0IHVwIGFycmF5IG9mIHBvc3NpYmxlIGVuY29kaW5ncwoJCQkkZW5jb2RpbmdzID0gYXJyYXkoKTsKCgkJCS8vIEZpcnN0IGNoZWNrIHRvIHNlZSBpZiBpbnB1dCBoYXMgYmVlbiBvdmVycmlkZGVuLgoJCQlpZiAoJHRoaXMtPmlucHV0X2VuY29kaW5nICE9PSBmYWxzZSkKCQkJewoJCQkJJGVuY29kaW5nc1tdID0gJHRoaXMtPmlucHV0X2VuY29kaW5nOwoJCQl9CgoJCQkkYXBwbGljYXRpb25fdHlwZXMgPSBhcnJheSgnYXBwbGljYXRpb24veG1sJywgJ2FwcGxpY2F0aW9uL3htbC1kdGQnLCAnYXBwbGljYXRpb24veG1sLWV4dGVybmFsLXBhcnNlZC1lbnRpdHknKTsKCQkJJHRleHRfdHlwZXMgPSBhcnJheSgndGV4dC94bWwnLCAndGV4dC94bWwtZXh0ZXJuYWwtcGFyc2VkLWVudGl0eScpOwoKCQkJLy8gUkZDIDMwMjMgKG9ubHkgYXBwbGllcyB0byBzbmlmZmVkIGNvbnRlbnQpCgkJCWlmIChpc3NldCgkc25pZmZlZCkpCgkJCXsKCQkJCWlmIChpbl9hcnJheSgkc25pZmZlZCwgJGFwcGxpY2F0aW9uX3R5cGVzKSB8fCBzdWJzdHIoJHNuaWZmZWQsIDAsIDEyKSA9PT0gJ2FwcGxpY2F0aW9uLycgJiYgc3Vic3RyKCRzbmlmZmVkLCAtNCkgPT09ICcreG1sJykKCQkJCXsKCQkJCQlpZiAoaXNzZXQoJGhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddKSAmJiBwcmVnX21hdGNoKCcvO1x4MjA/Y2hhcnNldD0oW147XSopL2knLCAkaGVhZGVyc1snY29udGVudC10eXBlJ10sICRjaGFyc2V0KSkKCQkJCQl7CgkJCQkJCSRlbmNvZGluZ3NbXSA9IHN0cnRvdXBwZXIoJGNoYXJzZXRbMV0pOwoJCQkJCX0KCQkJCQkkZW5jb2RpbmdzID0gYXJyYXlfbWVyZ2UoJGVuY29kaW5ncywgU2ltcGxlUGllX01pc2M6OnhtbF9lbmNvZGluZygkZGF0YSkpOwoJCQkJCSRlbmNvZGluZ3NbXSA9ICdVVEYtOCc7CgkJCQl9CgkJCQllbHNlaWYgKGluX2FycmF5KCRzbmlmZmVkLCAkdGV4dF90eXBlcykgfHwgc3Vic3RyKCRzbmlmZmVkLCAwLCA1KSA9PT0gJ3RleHQvJyAmJiBzdWJzdHIoJHNuaWZmZWQsIC00KSA9PT0gJyt4bWwnKQoJCQkJewoJCQkJCWlmIChpc3NldCgkaGVhZGVyc1snY29udGVudC10eXBlJ10pICYmIHByZWdfbWF0Y2goJy87XHgyMD9jaGFyc2V0PShbXjtdKikvaScsICRoZWFkZXJzWydjb250ZW50LXR5cGUnXSwgJGNoYXJzZXQpKQoJCQkJCXsKCQkJCQkJJGVuY29kaW5nc1tdID0gJGNoYXJzZXRbMV07CgkJCQkJfQoJCQkJCSRlbmNvZGluZ3NbXSA9ICdVUy1BU0NJSSc7CgkJCQl9CgkJCQkvLyBUZXh0IE1JTUUtdHlwZSBkZWZhdWx0CgkJCQllbHNlaWYgKHN1YnN0cigkc25pZmZlZCwgMCwgNSkgPT09ICd0ZXh0LycpCgkJCQl7CgkJCQkJJGVuY29kaW5nc1tdID0gJ1VTLUFTQ0lJJzsKCQkJCX0KCQkJfQoKCQkJLy8gRmFsbGJhY2sgdG8gWE1MIDEuMCBBcHBlbmRpeCBGLjEvVVRGLTgvSVNPLTg4NTktMQoJCQkkZW5jb2RpbmdzID0gYXJyYXlfbWVyZ2UoJGVuY29kaW5ncywgU2ltcGxlUGllX01pc2M6OnhtbF9lbmNvZGluZygkZGF0YSkpOwoJCQkkZW5jb2RpbmdzW10gPSAnVVRGLTgnOwoJCQkkZW5jb2RpbmdzW10gPSAnSVNPLTg4NTktMSc7CgoJCQkvLyBUaGVyZSdzIG5vIHBvaW50IGluIHRyeWluZyBhbiBlbmNvZGluZyB0d2ljZQoJCQkkZW5jb2RpbmdzID0gYXJyYXlfdW5pcXVlKCRlbmNvZGluZ3MpOwoKCQkJLy8gSWYgd2Ugd2FudCB0aGUgWE1MLCBqdXN0IG91dHB1dCB0aGF0IHdpdGggdGhlIG1vc3QgbGlrZWx5IGVuY29kaW5nIGFuZCBxdWl0CgkJCWlmICgkdGhpcy0+eG1sX2R1bXApCgkJCXsKCQkJCWhlYWRlcignQ29udGVudC10eXBlOiB0ZXh0L3htbDsgY2hhcnNldD0nIC4gJGVuY29kaW5nc1swXSk7CgkJCQllY2hvICRkYXRhOwoJCQkJZXhpdDsKCQkJfQoKCQkJLy8gTG9vcCB0aHJvdWdoIGVhY2ggcG9zc2libGUgZW5jb2RpbmcsIHRpbGwgd2UgcmV0dXJuIHNvbWV0aGluZywgb3IgcnVuIG91dCBvZiBwb3NzaWJpbGl0aWVzCgkJCWZvcmVhY2ggKCRlbmNvZGluZ3MgYXMgJGVuY29kaW5nKQoJCQl7CgkJCQkvLyBDaGFuZ2UgdGhlIGVuY29kaW5nIHRvIFVURi04IChhcyB3ZSBhbHdheXMgdXNlIFVURi04IGludGVybmFsbHkpCgkJCQlpZiAoJHV0ZjhfZGF0YSA9IFNpbXBsZVBpZV9NaXNjOjpjaGFuZ2VfZW5jb2RpbmcoJGRhdGEsICRlbmNvZGluZywgJ1VURi04JykpCgkJCQl7CgkJCQkJLy8gQ3JlYXRlIG5ldyBwYXJzZXIKCQkJCQkkcGFyc2VyID0mIG5ldyAkdGhpcy0+cGFyc2VyX2NsYXNzKCk7CgoJCQkJCS8vIElmIGl0J3MgcGFyc2VkIGZpbmUKCQkJCQlpZiAoJHBhcnNlci0+cGFyc2UoJHV0ZjhfZGF0YSwgJ1VURi04JykpCgkJCQkJewoJCQkJCQkkdGhpcy0+ZGF0YSA9ICRwYXJzZXItPmdldF9kYXRhKCk7CgkJCQkJCWlmICgkdGhpcy0+Z2V0X3R5cGUoKSAmIH5TSU1QTEVQSUVfVFlQRV9OT05FKQoJCQkJCQl7CgkJCQkJCQlpZiAoaXNzZXQoJGhlYWRlcnMpKQoJCQkJCQkJewoJCQkJCQkJCSR0aGlzLT5kYXRhWydoZWFkZXJzJ10gPSAkaGVhZGVyczsKCQkJCQkJCX0KCQkJCQkJCSR0aGlzLT5kYXRhWydidWlsZCddID0gU0lNUExFUElFX0JVSUxEOwoKCQkJCQkJCS8vIENhY2hlIHRoZSBmaWxlIGlmIGNhY2hpbmcgaXMgZW5hYmxlZAoJCQkJCQkJaWYgKCRjYWNoZSAmJiAhJGNhY2hlLT5zYXZlKCR0aGlzKSkKCQkJCQkJCXsKCQkJCQkJCQl0cmlnZ2VyX2Vycm9yKCIkY2FjaGUtPm5hbWUgaXMgbm90IHdyaXRlYWJsZSIsIEVfVVNFUl9XQVJOSU5HKTsKCQkJCQkJCX0KCQkJCQkJCXJldHVybiB0cnVlOwoJCQkJCQl9CgkJCQkJCWVsc2UKCQkJCQkJewoJCQkJCQkJJHRoaXMtPmVycm9yID0gIkEgZmVlZCBjb3VsZCBub3QgYmUgZm91bmQgYXQgJHRoaXMtPmZlZWRfdXJsIjsKCQkJCQkJCVNpbXBsZVBpZV9NaXNjOjplcnJvcigkdGhpcy0+ZXJyb3IsIEVfVVNFUl9OT1RJQ0UsIF9fRklMRV9fLCBfX0xJTkVfXyk7CgkJCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCX0KCQkJLy8gV2UgaGF2ZSBhbiBlcnJvciwganVzdCBzZXQgU2ltcGxlUGllOjplcnJvciB0byBpdCBhbmQgcXVpdAoJCQkkdGhpcy0+ZXJyb3IgPSBzcHJpbnRmKCdYTUwgZXJyb3I6ICVzIGF0IGxpbmUgJWQsIGNvbHVtbiAlZCcsICRwYXJzZXItPmdldF9lcnJvcl9zdHJpbmcoKSwgJHBhcnNlci0+Z2V0X2N1cnJlbnRfbGluZSgpLCAkcGFyc2VyLT5nZXRfY3VycmVudF9jb2x1bW4oKSk7CgkJCVNpbXBsZVBpZV9NaXNjOjplcnJvcigkdGhpcy0+ZXJyb3IsIEVfVVNFUl9OT1RJQ0UsIF9fRklMRV9fLCBfX0xJTkVfXyk7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJZWxzZWlmICghZW1wdHkoJHRoaXMtPm11bHRpZmVlZF91cmwpKQoJCXsKCQkJJGkgPSAwOwoJCQkkc3VjY2VzcyA9IDA7CgkJCSR0aGlzLT5tdWx0aWZlZWRfb2JqZWN0cyA9IGFycmF5KCk7CgkJCWZvcmVhY2ggKCR0aGlzLT5tdWx0aWZlZWRfdXJsIGFzICR1cmwpCgkJCXsKCQkJCWlmIChTSU1QTEVQSUVfUEhQNSkKCQkJCXsKCQkJCQkvLyBUaGlzIGtleXdvcmQgbmVlZHMgdG8gZGVmeSBjb2Rpbmcgc3RhbmRhcmRzIGZvciBQSFA0IGNvbXBhdGliaWxpdHkKCQkJCQkkdGhpcy0+bXVsdGlmZWVkX29iamVjdHNbJGldID0gY2xvbmUoJHRoaXMpOwoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCSR0aGlzLT5tdWx0aWZlZWRfb2JqZWN0c1skaV0gPSAkdGhpczsKCQkJCX0KCQkJCSR0aGlzLT5tdWx0aWZlZWRfb2JqZWN0c1skaV0tPnNldF9mZWVkX3VybCgkdXJsKTsKCQkJCSRzdWNjZXNzIHw9ICR0aGlzLT5tdWx0aWZlZWRfb2JqZWN0c1skaV0tPmluaXQoKTsKCQkJCSRpKys7CgkJCX0KCQkJcmV0dXJuIChib29sKSAkc3VjY2VzczsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCX0KCgkvKioKCSAqIFJldHVybiB0aGUgZXJyb3IgbWVzc2FnZSBmb3IgdGhlIG9jY3VyZWQgZXJyb3IKCSAqCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHJldHVybiBzdHJpbmcgRXJyb3IgbWVzc2FnZQoJICovCglmdW5jdGlvbiBlcnJvcigpCgl7CgkJcmV0dXJuICR0aGlzLT5lcnJvcjsKCX0KCglmdW5jdGlvbiBnZXRfZW5jb2RpbmcoKQoJewoJCXJldHVybiAkdGhpcy0+c2FuaXRpemUtPm91dHB1dF9lbmNvZGluZzsKCX0KCglmdW5jdGlvbiBoYW5kbGVfY29udGVudF90eXBlKCRtaW1lID0gJ3RleHQvaHRtbCcpCgl7CgkJaWYgKCFoZWFkZXJzX3NlbnQoKSkKCQl7CgkJCSRoZWFkZXIgPSAiQ29udGVudC10eXBlOiAkbWltZTsiOwoJCQlpZiAoJHRoaXMtPmdldF9lbmNvZGluZygpKQoJCQl7CgkJCQkkaGVhZGVyIC49ICcgY2hhcnNldD0nIC4gJHRoaXMtPmdldF9lbmNvZGluZygpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJJGhlYWRlciAuPSAnIGNoYXJzZXQ9VVRGLTgnOwoJCQl9CgkJCWhlYWRlcigkaGVhZGVyKTsKCQl9Cgl9CgoJZnVuY3Rpb24gZ2V0X3R5cGUoKQoJewoJCWlmICghaXNzZXQoJHRoaXMtPmRhdGFbJ3R5cGUnXSkpCgkJewoJCQkkdGhpcy0+ZGF0YVsndHlwZSddID0gU0lNUExFUElFX1RZUEVfQUxMOwoJCQlpZiAoaXNzZXQoJHRoaXMtPmRhdGFbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzEwXVsnZmVlZCddKSkKCQkJewoJCQkJJHRoaXMtPmRhdGFbJ3R5cGUnXSAmPSBTSU1QTEVQSUVfVFlQRV9BVE9NXzEwOwoJCQl9CgkJCWVsc2VpZiAoaXNzZXQoJHRoaXMtPmRhdGFbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzAzXVsnZmVlZCddKSkKCQkJewoJCQkJJHRoaXMtPmRhdGFbJ3R5cGUnXSAmPSBTSU1QTEVQSUVfVFlQRV9BVE9NXzAzOwoJCQl9CgkJCWVsc2VpZiAoaXNzZXQoJHRoaXMtPmRhdGFbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9SREZdWydSREYnXSkpCgkJCXsKCQkJCWlmIChpc3NldCgkdGhpcy0+ZGF0YVsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX1JERl1bJ1JERiddWzBdWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfUlNTXzEwXVsnY2hhbm5lbCddKQoJCQkJfHwgaXNzZXQoJHRoaXMtPmRhdGFbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9SREZdWydSREYnXVswXVsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX1JTU18xMF1bJ2ltYWdlJ10pCgkJCQl8fCBpc3NldCgkdGhpcy0+ZGF0YVsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX1JERl1bJ1JERiddWzBdWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfUlNTXzEwXVsnaXRlbSddKQoJCQkJfHwgaXNzZXQoJHRoaXMtPmRhdGFbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9SREZdWydSREYnXVswXVsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX1JTU18xMF1bJ3RleHRpbnB1dCddKSkKCQkJCXsKCQkJCQkkdGhpcy0+ZGF0YVsndHlwZSddICY9IFNJTVBMRVBJRV9UWVBFX1JTU18xMDsKCQkJCX0KCQkJCWlmIChpc3NldCgkdGhpcy0+ZGF0YVsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX1JERl1bJ1JERiddWzBdWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfUlNTXzA5MF1bJ2NoYW5uZWwnXSkKCQkJCXx8IGlzc2V0KCR0aGlzLT5kYXRhWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfUkRGXVsnUkRGJ11bMF1bJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9SU1NfMDkwXVsnaW1hZ2UnXSkKCQkJCXx8IGlzc2V0KCR0aGlzLT5kYXRhWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfUkRGXVsnUkRGJ11bMF1bJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9SU1NfMDkwXVsnaXRlbSddKQoJCQkJfHwgaXNzZXQoJHRoaXMtPmRhdGFbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9SREZdWydSREYnXVswXVsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX1JTU18wOTBdWyd0ZXh0aW5wdXQnXSkpCgkJCQl7CgkJCQkJJHRoaXMtPmRhdGFbJ3R5cGUnXSAmPSBTSU1QTEVQSUVfVFlQRV9SU1NfMDkwOwoJCQkJfQoJCQl9CgkJCWVsc2VpZiAoaXNzZXQoJHRoaXMtPmRhdGFbJ2NoaWxkJ11bJyddWydyc3MnXSkpCgkJCXsKCQkJCSR0aGlzLT5kYXRhWyd0eXBlJ10gJj0gU0lNUExFUElFX1RZUEVfUlNTX0FMTDsKCQkJCWlmIChpc3NldCgkdGhpcy0+ZGF0YVsnY2hpbGQnXVsnJ11bJ3JzcyddWzBdWydhdHRyaWJzJ11bJyddWyd2ZXJzaW9uJ10pKQoJCQkJewoJCQkJCXN3aXRjaCAodHJpbSgkdGhpcy0+ZGF0YVsnY2hpbGQnXVsnJ11bJ3JzcyddWzBdWydhdHRyaWJzJ11bJyddWyd2ZXJzaW9uJ10pKQoJCQkJCXsKCQkJCQkJY2FzZSAnMC45MSc6CgkJCQkJCQkkdGhpcy0+ZGF0YVsndHlwZSddICY9IFNJTVBMRVBJRV9UWVBFX1JTU18wOTE7CgkJCQkJCQlpZiAoaXNzZXQoJHRoaXMtPmRhdGFbJ2NoaWxkJ11bJyddWydyc3MnXVswXVsnY2hpbGQnXVsnJ11bJ3NraXBob3VycyddWydob3VyJ11bMF1bJ2RhdGEnXSkpCgkJCQkJCQl7CgkJCQkJCQkJc3dpdGNoICh0cmltKCR0aGlzLT5kYXRhWydjaGlsZCddWycnXVsncnNzJ11bMF1bJ2NoaWxkJ11bJyddWydza2lwaG91cnMnXVsnaG91ciddWzBdWydkYXRhJ10pKQoJCQkJCQkJCXsKCQkJCQkJCQkJY2FzZSAnMCc6CgkJCQkJCQkJCQkkdGhpcy0+ZGF0YVsndHlwZSddICY9IFNJTVBMRVBJRV9UWVBFX1JTU18wOTFfTkVUU0NBUEU7CgkJCQkJCQkJCQlicmVhazsKCgkJCQkJCQkJCWNhc2UgJzI0JzoKCQkJCQkJCQkJCSR0aGlzLT5kYXRhWyd0eXBlJ10gJj0gU0lNUExFUElFX1RZUEVfUlNTXzA5MV9VU0VSTEFORDsKCQkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCX0KCQkJCQkJCX0KCQkJCQkJCWJyZWFrOwoKCQkJCQkJY2FzZSAnMC45Mic6CgkJCQkJCQkkdGhpcy0+ZGF0YVsndHlwZSddICY9IFNJTVBMRVBJRV9UWVBFX1JTU18wOTI7CgkJCQkJCQlicmVhazsKCgkJCQkJCWNhc2UgJzAuOTMnOgoJCQkJCQkJJHRoaXMtPmRhdGFbJ3R5cGUnXSAmPSBTSU1QTEVQSUVfVFlQRV9SU1NfMDkzOwoJCQkJCQkJYnJlYWs7CgoJCQkJCQljYXNlICcwLjk0JzoKCQkJCQkJCSR0aGlzLT5kYXRhWyd0eXBlJ10gJj0gU0lNUExFUElFX1RZUEVfUlNTXzA5NDsKCQkJCQkJCWJyZWFrOwoKCQkJCQkJY2FzZSAnMi4wJzoKCQkJCQkJCSR0aGlzLT5kYXRhWyd0eXBlJ10gJj0gU0lNUExFUElFX1RZUEVfUlNTXzIwOwoJCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJfQoJCQl9CgkJCWVsc2UKCQkJewoJCQkJJHRoaXMtPmRhdGFbJ3R5cGUnXSA9IFNJTVBMRVBJRV9UWVBFX05PTkU7CgkJCX0KCQl9CgkJcmV0dXJuICR0aGlzLT5kYXRhWyd0eXBlJ107Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSBVUkwgZm9yIHRoZSBmYXZpY29uIG9mIHRoZSBmZWVkJ3Mgd2Vic2l0ZS4KCSAqCgkgKiBAdG9kbyBDYWNoZSBhdG9tOmljb24KCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAc2luY2UgMS4wCgkgKi8KCWZ1bmN0aW9uIGdldF9mYXZpY29uKCkKCXsKCQlpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfY2hhbm5lbF90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMCwgJ2ljb24nKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSwgJHRoaXMtPmdldF9iYXNlKCRyZXR1cm5bMF0pKTsKCQl9CgkJZWxzZWlmICgoJHVybCA9ICR0aGlzLT5nZXRfbGluaygpKSAhPT0gbnVsbCAmJiBwcmVnX21hdGNoKCcvXmh0dHAocyk/OlwvXC8vaScsICR1cmwpKQoJCXsKCQkJJGZhdmljb24gPSBTaW1wbGVQaWVfTWlzYzo6YWJzb2x1dGl6ZV91cmwoJy9mYXZpY29uLmljbycsICR1cmwpOwoKCQkJaWYgKCR0aGlzLT5jYWNoZSAmJiAkdGhpcy0+ZmF2aWNvbl9oYW5kbGVyKQoJCQl7CgkJCQkkZmF2aWNvbl9maWxlbmFtZSA9IGNhbGxfdXNlcl9mdW5jKCR0aGlzLT5jYWNoZV9uYW1lX2Z1bmN0aW9uLCAkZmF2aWNvbik7CgkJCQkkY2FjaGUgPSBjYWxsX3VzZXJfZnVuYyhhcnJheSgkdGhpcy0+Y2FjaGVfY2xhc3MsICdjcmVhdGUnKSwgJHRoaXMtPmNhY2hlX2xvY2F0aW9uLCAkZmF2aWNvbl9maWxlbmFtZSwgJ3NwaScpOwoKCQkJCWlmICgkY2FjaGUtPmxvYWQoKSkKCQkJCXsKCQkJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCR0aGlzLT5mYXZpY29uX2hhbmRsZXIgLiAkZmF2aWNvbl9maWxlbmFtZSwgU0lNUExFUElFX0NPTlNUUlVDVF9JUkkpOwoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCSRmaWxlID0mIG5ldyAkdGhpcy0+ZmlsZV9jbGFzcygkZmF2aWNvbiwgJHRoaXMtPnRpbWVvdXQgLyAxMCwgNSwgYXJyYXkoJ1gtRk9SV0FSREVELUZPUicgPT4gJF9TRVJWRVJbJ1JFTU9URV9BRERSJ10pLCAkdGhpcy0+dXNlcmFnZW50LCAkdGhpcy0+Zm9yY2VfZnNvY2tvcGVuKTsKCgkJCQkJaWYgKCRmaWxlLT5zdWNjZXNzICYmICgkZmlsZS0+c3RhdHVzX2NvZGUgPT0gMjAwIHx8ICgkZmlsZS0+c3RhdHVzX2NvZGUgPiAyMDYgJiYgJGZpbGUtPnN0YXR1c19jb2RlIDwgMzAwKSkgJiYgc3RybGVuKCRmaWxlLT5ib2R5KSA+IDApCgkJCQkJewoJCQkJCQkkc25pZmZlciA9IG5ldyAkdGhpcy0+Y29udGVudF90eXBlX3NuaWZmZXJfY2xhc3MoJGZpbGUpOwoJCQkJCQlpZiAoc3Vic3RyKCRzbmlmZmVyLT5nZXRfdHlwZSgpLCAwLCA2KSA9PT0gJ2ltYWdlLycpCgkJCQkJCXsKCQkJCQkJCWlmICgkY2FjaGUtPnNhdmUoYXJyYXkoJ2hlYWRlcnMnID0+ICRmaWxlLT5oZWFkZXJzLCAnYm9keScgPT4gJGZpbGUtPmJvZHkpKSkKCQkJCQkJCXsKCQkJCQkJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCR0aGlzLT5mYXZpY29uX2hhbmRsZXIgLiAkZmF2aWNvbl9maWxlbmFtZSwgU0lNUExFUElFX0NPTlNUUlVDVF9JUkkpOwoJCQkJCQkJfQoJCQkJCQkJZWxzZQoJCQkJCQkJewoJCQkJCQkJCXRyaWdnZXJfZXJyb3IoIiRjYWNoZS0+bmFtZSBpcyBub3Qgd3JpdGVhYmxlIiwgRV9VU0VSX1dBUk5JTkcpOwoJCQkJCQkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJGZhdmljb24sIFNJTVBMRVBJRV9DT05TVFJVQ1RfSVJJKTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoJCQllbHNlCgkJCXsKCQkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJGZhdmljb24sIFNJTVBMRVBJRV9DT05TVFJVQ1RfSVJJKTsKCQkJfQoJCX0KCQlyZXR1cm4gZmFsc2U7Cgl9CgoJLyoqCgkgKiBAdG9kbyBJZiB3ZSBoYXZlIGEgcGVybSByZWRpcmVjdCB3ZSBzaG91bGQgcmV0dXJuIHRoZSBuZXcgVVJMCgkgKiBAdG9kbyBXaGVuIHdlIG1ha2UgdGhlIGFib3ZlIGNoYW5nZSwgbGV0J3Mgc3VwcG9ydCA8aXR1bmVzOm5ldy1mZWVkLXVybD4gYXMgd2VsbAoJICogQHRvZG8gQWxzbywgfGF0b206bGlua3xAcmVsPXNlbGYKCSAqLwoJZnVuY3Rpb24gc3Vic2NyaWJlX3VybCgpCgl7CgkJaWYgKCR0aGlzLT5mZWVkX3VybCAhPT0gbnVsbCkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHRoaXMtPmZlZWRfdXJsLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSk7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCglmdW5jdGlvbiBzdWJzY3JpYmVfZmVlZCgpCgl7CgkJaWYgKCR0aGlzLT5mZWVkX3VybCAhPT0gbnVsbCkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoU2ltcGxlUGllX01pc2M6OmZpeF9wcm90b2NvbCgkdGhpcy0+ZmVlZF91cmwsIDIpLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSk7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCglmdW5jdGlvbiBzdWJzY3JpYmVfb3V0bG9vaygpCgl7CgkJaWYgKCR0aGlzLT5mZWVkX3VybCAhPT0gbnVsbCkKCQl7CgkJCXJldHVybiAnb3V0bG9vaycgLiAkdGhpcy0+c2FuaXRpemUoU2ltcGxlUGllX01pc2M6OmZpeF9wcm90b2NvbCgkdGhpcy0+ZmVlZF91cmwsIDIpLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSk7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCglmdW5jdGlvbiBzdWJzY3JpYmVfcG9kY2FzdCgpCgl7CgkJaWYgKCR0aGlzLT5mZWVkX3VybCAhPT0gbnVsbCkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoU2ltcGxlUGllX01pc2M6OmZpeF9wcm90b2NvbCgkdGhpcy0+ZmVlZF91cmwsIDMpLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSk7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCglmdW5jdGlvbiBzdWJzY3JpYmVfaXR1bmVzKCkKCXsKCQlpZiAoJHRoaXMtPmZlZWRfdXJsICE9PSBudWxsKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZShTaW1wbGVQaWVfTWlzYzo6Zml4X3Byb3RvY29sKCR0aGlzLT5mZWVkX3VybCwgNCksIFNJTVBMRVBJRV9DT05TVFJVQ1RfSVJJKTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCS8qKgoJICogQ3JlYXRlcyB0aGUgc3Vic2NyaWJlXyogbWV0aG9kcycgcmV0dXJuIGRhdGEKCSAqCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqIEBwYXJhbSBzdHJpbmcgJGZlZWRfdXJsIFN0cmluZyB0byBwcmVmaXggdG8gdGhlIGZlZWQgVVJMCgkgKiBAcGFyYW0gc3RyaW5nICRzaXRlX3VybCBTdHJpbmcgdG8gcHJlZml4IHRvIHRoZSBzaXRlIFVSTCAoYW5kCgkgKiBzdWZmaXggdG8gdGhlIGZlZWQgVVJMKQoJICogQHJldHVybiBtaXhlZCBVUkwgaWYgZmVlZCBleGlzdHMsIGZhbHNlIG90aGVyd2lzZQoJICovCglmdW5jdGlvbiBzdWJzY3JpYmVfc2VydmljZSgkZmVlZF91cmwsICRzaXRlX3VybCA9IG51bGwpCgl7CgkJaWYgKCR0aGlzLT5zdWJzY3JpYmVfdXJsKCkpCgkJewoJCQkkcmV0dXJuID0gJHRoaXMtPnNhbml0aXplKCRmZWVkX3VybCwgU0lNUExFUElFX0NPTlNUUlVDVF9JUkkpIC4gcmF3dXJsZW5jb2RlKCR0aGlzLT5mZWVkX3VybCk7CgkJCWlmICgkc2l0ZV91cmwgIT09IG51bGwgJiYgJHRoaXMtPmdldF9saW5rKCkgIT09IG51bGwpCgkJCXsKCQkJCSRyZXR1cm4gLj0gJHRoaXMtPnNhbml0aXplKCRzaXRlX3VybCwgU0lNUExFUElFX0NPTlNUUlVDVF9JUkkpIC4gcmF3dXJsZW5jb2RlKCR0aGlzLT5nZXRfbGluaygpKTsKCQkJfQoJCQlyZXR1cm4gJHJldHVybjsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCWZ1bmN0aW9uIHN1YnNjcmliZV9hb2woKQoJewoJCXJldHVybiAkdGhpcy0+c3Vic2NyaWJlX3NlcnZpY2UoJ2h0dHA6Ly9mZWVkcy5teS5hb2wuY29tL2FkZC5qc3A/dXJsPScpOwoJfQoKCWZ1bmN0aW9uIHN1YnNjcmliZV9ibG9nbGluZXMoKQoJewoJCXJldHVybiB1cmxkZWNvZGUoJHRoaXMtPnN1YnNjcmliZV9zZXJ2aWNlKCdodHRwOi8vd3d3LmJsb2dsaW5lcy5jb20vc3ViLycpKTsKCX0KCglmdW5jdGlvbiBzdWJzY3JpYmVfZXNrb2JvKCkKCXsKCQlyZXR1cm4gJHRoaXMtPnN1YnNjcmliZV9zZXJ2aWNlKCdodHRwOi8vd3d3LmVza29iby5jb20vP0FkZFRvTXlQYWdlPScpOwoJfQoKCWZ1bmN0aW9uIHN1YnNjcmliZV9mZWVkZmVlZHMoKQoJewoJCXJldHVybiAkdGhpcy0+c3Vic2NyaWJlX3NlcnZpY2UoJ2h0dHA6Ly93d3cuZmVlZGZlZWRzLmNvbS9hZGQ/ZmVlZD0nKTsKCX0KCglmdW5jdGlvbiBzdWJzY3JpYmVfZmVlZHN0ZXIoKQoJewoJCXJldHVybiAkdGhpcy0+c3Vic2NyaWJlX3NlcnZpY2UoJ2h0dHA6Ly93d3cuZmVlZHN0ZXIuY29tL215ZmVlZHN0ZXIucGhwP2FjdGlvbj1hZGRyc3MmY29uZmlybT1ubyZyc3N1cmw9Jyk7Cgl9CgoJZnVuY3Rpb24gc3Vic2NyaWJlX2dvb2dsZSgpCgl7CgkJcmV0dXJuICR0aGlzLT5zdWJzY3JpYmVfc2VydmljZSgnaHR0cDovL2Z1c2lvbi5nb29nbGUuY29tL2FkZD9mZWVkdXJsPScpOwoJfQoKCWZ1bmN0aW9uIHN1YnNjcmliZV9ncml0d2lyZSgpCgl7CgkJcmV0dXJuICR0aGlzLT5zdWJzY3JpYmVfc2VydmljZSgnaHR0cDovL215LmdyaXR3aXJlLmNvbS9mZWVkcy9hZGRFeHRlcm5hbEZlZWQuYXNweD9GZWVkVXJsPScpOwoJfQoKCWZ1bmN0aW9uIHN1YnNjcmliZV9tc24oKQoJewoJCXJldHVybiAkdGhpcy0+c3Vic2NyaWJlX3NlcnZpY2UoJ2h0dHA6Ly9teS5tc24uY29tL2FkZHRvbXltc24uYXJteD9pZD1yc3MmdXQ9JywgJyZydT0nKTsKCX0KCglmdW5jdGlvbiBzdWJzY3JpYmVfbmV0dmliZXMoKQoJewoJCXJldHVybiAkdGhpcy0+c3Vic2NyaWJlX3NlcnZpY2UoJ2h0dHA6Ly93d3cubmV0dmliZXMuY29tL3N1YnNjcmliZS5waHA/dXJsPScpOwoJfQoKCWZ1bmN0aW9uIHN1YnNjcmliZV9uZXdzYnVyc3QoKQoJewoJCXJldHVybiAkdGhpcy0+c3Vic2NyaWJlX3NlcnZpY2UoJ2h0dHA6Ly93d3cubmV3c2J1cnN0LmNvbS9Tb3VyY2UvP2FkZD0nKTsKCX0KCglmdW5jdGlvbiBzdWJzY3JpYmVfbmV3c2dhdG9yKCkKCXsKCQlyZXR1cm4gJHRoaXMtPnN1YnNjcmliZV9zZXJ2aWNlKCdodHRwOi8vd3d3Lm5ld3NnYXRvci5jb20vbmdzL3N1YnNjcmliZXIvc3ViZXh0LmFzcHg/dXJsPScpOwoJfQoKCWZ1bmN0aW9uIHN1YnNjcmliZV9vZGVvKCkKCXsKCQlyZXR1cm4gJHRoaXMtPnN1YnNjcmliZV9zZXJ2aWNlKCdodHRwOi8vd3d3Lm9kZW8uY29tL2xpc3Rlbi9zdWJzY3JpYmU/ZmVlZD0nKTsKCX0KCglmdW5jdGlvbiBzdWJzY3JpYmVfcG9kbm92YSgpCgl7CgkJcmV0dXJuICR0aGlzLT5zdWJzY3JpYmVfc2VydmljZSgnaHR0cDovL3d3dy5wb2Rub3ZhLmNvbS9pbmRleF95b3VyX3BvZGNhc3RzLnNyZj9hY3Rpb249YWRkJnVybD0nKTsKCX0KCglmdW5jdGlvbiBzdWJzY3JpYmVfcm9qbygpCgl7CgkJcmV0dXJuICR0aGlzLT5zdWJzY3JpYmVfc2VydmljZSgnaHR0cDovL3d3dy5yb2pvLmNvbS9hZGQtc3Vic2NyaXB0aW9uP3Jlc291cmNlPScpOwoJfQoKCWZ1bmN0aW9uIHN1YnNjcmliZV95YWhvbygpCgl7CgkJcmV0dXJuICR0aGlzLT5zdWJzY3JpYmVfc2VydmljZSgnaHR0cDovL2FkZC5teS55YWhvby5jb20vcnNzP3VybD0nKTsKCX0KCglmdW5jdGlvbiBnZXRfZmVlZF90YWdzKCRuYW1lc3BhY2UsICR0YWcpCgl7CgkJJHR5cGUgPSAkdGhpcy0+Z2V0X3R5cGUoKTsKCQlpZiAoJHR5cGUgJiBTSU1QTEVQSUVfVFlQRV9BVE9NXzEwKQoJCXsKCQkJaWYgKGlzc2V0KCR0aGlzLT5kYXRhWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMF1bJ2ZlZWQnXVswXVsnY2hpbGQnXVskbmFtZXNwYWNlXVskdGFnXSkpCgkJCXsKCQkJCXJldHVybiAkdGhpcy0+ZGF0YVsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTBdWydmZWVkJ11bMF1bJ2NoaWxkJ11bJG5hbWVzcGFjZV1bJHRhZ107CgkJCX0KCQl9CgkJaWYgKCR0eXBlICYgU0lNUExFUElFX1RZUEVfQVRPTV8wMykKCQl7CgkJCWlmIChpc3NldCgkdGhpcy0+ZGF0YVsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDNdWydmZWVkJ11bMF1bJ2NoaWxkJ11bJG5hbWVzcGFjZV1bJHRhZ10pKQoJCQl7CgkJCQlyZXR1cm4gJHRoaXMtPmRhdGFbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzAzXVsnZmVlZCddWzBdWydjaGlsZCddWyRuYW1lc3BhY2VdWyR0YWddOwoJCQl9CgkJfQoJCWlmICgkdHlwZSAmIFNJTVBMRVBJRV9UWVBFX1JTU19SREYpCgkJewoJCQlpZiAoaXNzZXQoJHRoaXMtPmRhdGFbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9SREZdWydSREYnXVswXVsnY2hpbGQnXVskbmFtZXNwYWNlXVskdGFnXSkpCgkJCXsKCQkJCXJldHVybiAkdGhpcy0+ZGF0YVsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX1JERl1bJ1JERiddWzBdWydjaGlsZCddWyRuYW1lc3BhY2VdWyR0YWddOwoJCQl9CgkJfQoJCWlmICgkdHlwZSAmIFNJTVBMRVBJRV9UWVBFX1JTU19TWU5ESUNBVElPTikKCQl7CgkJCWlmIChpc3NldCgkdGhpcy0+ZGF0YVsnY2hpbGQnXVsnJ11bJ3JzcyddWzBdWydjaGlsZCddWyRuYW1lc3BhY2VdWyR0YWddKSkKCQkJewoJCQkJcmV0dXJuICR0aGlzLT5kYXRhWydjaGlsZCddWycnXVsncnNzJ11bMF1bJ2NoaWxkJ11bJG5hbWVzcGFjZV1bJHRhZ107CgkJCX0KCQl9CgkJcmV0dXJuIG51bGw7Cgl9CgoJZnVuY3Rpb24gZ2V0X2NoYW5uZWxfdGFncygkbmFtZXNwYWNlLCAkdGFnKQoJewoJCSR0eXBlID0gJHRoaXMtPmdldF90eXBlKCk7CgkJaWYgKCR0eXBlICYgU0lNUExFUElFX1RZUEVfQVRPTV9BTEwpCgkJewoJCQlpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfZmVlZF90YWdzKCRuYW1lc3BhY2UsICR0YWcpKQoJCQl7CgkJCQlyZXR1cm4gJHJldHVybjsKCQkJfQoJCX0KCQlpZiAoJHR5cGUgJiBTSU1QTEVQSUVfVFlQRV9SU1NfMTApCgkJewoJCQlpZiAoJGNoYW5uZWwgPSAkdGhpcy0+Z2V0X2ZlZWRfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX1JTU18xMCwgJ2NoYW5uZWwnKSkKCQkJewoJCQkJaWYgKGlzc2V0KCRjaGFubmVsWzBdWydjaGlsZCddWyRuYW1lc3BhY2VdWyR0YWddKSkKCQkJCXsKCQkJCQlyZXR1cm4gJGNoYW5uZWxbMF1bJ2NoaWxkJ11bJG5hbWVzcGFjZV1bJHRhZ107CgkJCQl9CgkJCX0KCQl9CgkJaWYgKCR0eXBlICYgU0lNUExFUElFX1RZUEVfUlNTXzA5MCkKCQl7CgkJCWlmICgkY2hhbm5lbCA9ICR0aGlzLT5nZXRfZmVlZF90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfUlNTXzA5MCwgJ2NoYW5uZWwnKSkKCQkJewoJCQkJaWYgKGlzc2V0KCRjaGFubmVsWzBdWydjaGlsZCddWyRuYW1lc3BhY2VdWyR0YWddKSkKCQkJCXsKCQkJCQlyZXR1cm4gJGNoYW5uZWxbMF1bJ2NoaWxkJ11bJG5hbWVzcGFjZV1bJHRhZ107CgkJCQl9CgkJCX0KCQl9CgkJaWYgKCR0eXBlICYgU0lNUExFUElFX1RZUEVfUlNTX1NZTkRJQ0FUSU9OKQoJCXsKCQkJaWYgKCRjaGFubmVsID0gJHRoaXMtPmdldF9mZWVkX3RhZ3MoJycsICdjaGFubmVsJykpCgkJCXsKCQkJCWlmIChpc3NldCgkY2hhbm5lbFswXVsnY2hpbGQnXVskbmFtZXNwYWNlXVskdGFnXSkpCgkJCQl7CgkJCQkJcmV0dXJuICRjaGFubmVsWzBdWydjaGlsZCddWyRuYW1lc3BhY2VdWyR0YWddOwoJCQkJfQoJCQl9CgkJfQoJCXJldHVybiBudWxsOwoJfQoKCWZ1bmN0aW9uIGdldF9pbWFnZV90YWdzKCRuYW1lc3BhY2UsICR0YWcpCgl7CgkJJHR5cGUgPSAkdGhpcy0+Z2V0X3R5cGUoKTsKCQlpZiAoJHR5cGUgJiBTSU1QTEVQSUVfVFlQRV9SU1NfMTApCgkJewoJCQlpZiAoJGltYWdlID0gJHRoaXMtPmdldF9mZWVkX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9SU1NfMTAsICdpbWFnZScpKQoJCQl7CgkJCQlpZiAoaXNzZXQoJGltYWdlWzBdWydjaGlsZCddWyRuYW1lc3BhY2VdWyR0YWddKSkKCQkJCXsKCQkJCQlyZXR1cm4gJGltYWdlWzBdWydjaGlsZCddWyRuYW1lc3BhY2VdWyR0YWddOwoJCQkJfQoJCQl9CgkJfQoJCWlmICgkdHlwZSAmIFNJTVBMRVBJRV9UWVBFX1JTU18wOTApCgkJewoJCQlpZiAoJGltYWdlID0gJHRoaXMtPmdldF9mZWVkX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9SU1NfMDkwLCAnaW1hZ2UnKSkKCQkJewoJCQkJaWYgKGlzc2V0KCRpbWFnZVswXVsnY2hpbGQnXVskbmFtZXNwYWNlXVskdGFnXSkpCgkJCQl7CgkJCQkJcmV0dXJuICRpbWFnZVswXVsnY2hpbGQnXVskbmFtZXNwYWNlXVskdGFnXTsKCQkJCX0KCQkJfQoJCX0KCQlpZiAoJHR5cGUgJiBTSU1QTEVQSUVfVFlQRV9SU1NfU1lORElDQVRJT04pCgkJewoJCQlpZiAoJGltYWdlID0gJHRoaXMtPmdldF9jaGFubmVsX3RhZ3MoJycsICdpbWFnZScpKQoJCQl7CgkJCQlpZiAoaXNzZXQoJGltYWdlWzBdWydjaGlsZCddWyRuYW1lc3BhY2VdWyR0YWddKSkKCQkJCXsKCQkJCQlyZXR1cm4gJGltYWdlWzBdWydjaGlsZCddWyRuYW1lc3BhY2VdWyR0YWddOwoJCQkJfQoJCQl9CgkJfQoJCXJldHVybiBudWxsOwoJfQoKCWZ1bmN0aW9uIGdldF9iYXNlKCRlbGVtZW50ID0gYXJyYXkoKSkKCXsKCQlpZiAoISgkdGhpcy0+Z2V0X3R5cGUoKSAmIFNJTVBMRVBJRV9UWVBFX1JTU19TWU5ESUNBVElPTikgJiYgIWVtcHR5KCRlbGVtZW50Wyd4bWxfYmFzZV9leHBsaWNpdCddKSAmJiBpc3NldCgkZWxlbWVudFsneG1sX2Jhc2UnXSkpCgkJewoJCQlyZXR1cm4gJGVsZW1lbnRbJ3htbF9iYXNlJ107CgkJfQoJCWVsc2VpZiAoJHRoaXMtPmdldF9saW5rKCkgIT09IG51bGwpCgkJewoJCQlyZXR1cm4gJHRoaXMtPmdldF9saW5rKCk7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiAkdGhpcy0+c3Vic2NyaWJlX3VybCgpOwoJCX0KCX0KCglmdW5jdGlvbiBzYW5pdGl6ZSgkZGF0YSwgJHR5cGUsICRiYXNlID0gJycpCgl7CgkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZS0+c2FuaXRpemUoJGRhdGEsICR0eXBlLCAkYmFzZSk7Cgl9CgoJZnVuY3Rpb24gZ2V0X3RpdGxlKCkKCXsKCQlpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfY2hhbm5lbF90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMCwgJ3RpdGxlJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU2ltcGxlUGllX01pc2M6OmF0b21fMTBfY29uc3RydWN0X3R5cGUoJHJldHVyblswXVsnYXR0cmlicyddKSwgJHRoaXMtPmdldF9iYXNlKCRyZXR1cm5bMF0pKTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9jaGFubmVsX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzAzLCAndGl0bGUnKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCBTaW1wbGVQaWVfTWlzYzo6YXRvbV8wM19jb25zdHJ1Y3RfdHlwZSgkcmV0dXJuWzBdWydhdHRyaWJzJ10pLCAkdGhpcy0+Z2V0X2Jhc2UoJHJldHVyblswXSkpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2NoYW5uZWxfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX1JTU18xMCwgJ3RpdGxlJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9NQVlCRV9IVE1MLCAkdGhpcy0+Z2V0X2Jhc2UoJHJldHVyblswXSkpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2NoYW5uZWxfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX1JTU18wOTAsICd0aXRsZScpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfTUFZQkVfSFRNTCwgJHRoaXMtPmdldF9iYXNlKCRyZXR1cm5bMF0pKTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9jaGFubmVsX3RhZ3MoJycsICd0aXRsZScpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfTUFZQkVfSFRNTCwgJHRoaXMtPmdldF9iYXNlKCRyZXR1cm5bMF0pKTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9jaGFubmVsX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9EQ18xMSwgJ3RpdGxlJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9jaGFubmVsX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9EQ18xMCwgJ3RpdGxlJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCWZ1bmN0aW9uIGdldF9jYXRlZ29yeSgka2V5ID0gMCkKCXsKCQkkY2F0ZWdvcmllcyA9ICR0aGlzLT5nZXRfY2F0ZWdvcmllcygpOwoJCWlmIChpc3NldCgkY2F0ZWdvcmllc1ska2V5XSkpCgkJewoJCQlyZXR1cm4gJGNhdGVnb3JpZXNbJGtleV07CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCglmdW5jdGlvbiBnZXRfY2F0ZWdvcmllcygpCgl7CgkJJGNhdGVnb3JpZXMgPSBhcnJheSgpOwoKCQlmb3JlYWNoICgoYXJyYXkpICR0aGlzLT5nZXRfY2hhbm5lbF90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMCwgJ2NhdGVnb3J5JykgYXMgJGNhdGVnb3J5KQoJCXsKCQkJJHRlcm0gPSBudWxsOwoJCQkkc2NoZW1lID0gbnVsbDsKCQkJJGxhYmVsID0gbnVsbDsKCQkJaWYgKGlzc2V0KCRjYXRlZ29yeVsnYXR0cmlicyddWycnXVsndGVybSddKSkKCQkJewoJCQkJJHRlcm0gPSAkdGhpcy0+c2FuaXRpemUoJGNhdGVnb3J5WydhdHRyaWJzJ11bJyddWyd0ZXJtJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCX0KCQkJaWYgKGlzc2V0KCRjYXRlZ29yeVsnYXR0cmlicyddWycnXVsnc2NoZW1lJ10pKQoJCQl7CgkJCQkkc2NoZW1lID0gJHRoaXMtPnNhbml0aXplKCRjYXRlZ29yeVsnYXR0cmlicyddWycnXVsnc2NoZW1lJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCX0KCQkJaWYgKGlzc2V0KCRjYXRlZ29yeVsnYXR0cmlicyddWycnXVsnbGFiZWwnXSkpCgkJCXsKCQkJCSRsYWJlbCA9ICR0aGlzLT5zYW5pdGl6ZSgkY2F0ZWdvcnlbJ2F0dHJpYnMnXVsnJ11bJ2xhYmVsJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCX0KCQkJJGNhdGVnb3JpZXNbXSA9JiBuZXcgJHRoaXMtPmNhdGVnb3J5X2NsYXNzKCR0ZXJtLCAkc2NoZW1lLCAkbGFiZWwpOwoJCX0KCQlmb3JlYWNoICgoYXJyYXkpICR0aGlzLT5nZXRfY2hhbm5lbF90YWdzKCcnLCAnY2F0ZWdvcnknKSBhcyAkY2F0ZWdvcnkpCgkJewoJCQkkY2F0ZWdvcmllc1tdID0mIG5ldyAkdGhpcy0+Y2F0ZWdvcnlfY2xhc3MoJHRoaXMtPnNhbml0aXplKCRjYXRlZ29yeVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpLCBudWxsLCBudWxsKTsKCQl9CgkJZm9yZWFjaCAoKGFycmF5KSAkdGhpcy0+Z2V0X2NoYW5uZWxfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0RDXzExLCAnc3ViamVjdCcpIGFzICRjYXRlZ29yeSkKCQl7CgkJCSRjYXRlZ29yaWVzW10gPSYgbmV3ICR0aGlzLT5jYXRlZ29yeV9jbGFzcygkdGhpcy0+c2FuaXRpemUoJGNhdGVnb3J5WydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCksIG51bGwsIG51bGwpOwoJCX0KCQlmb3JlYWNoICgoYXJyYXkpICR0aGlzLT5nZXRfY2hhbm5lbF90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfRENfMTAsICdzdWJqZWN0JykgYXMgJGNhdGVnb3J5KQoJCXsKCQkJJGNhdGVnb3JpZXNbXSA9JiBuZXcgJHRoaXMtPmNhdGVnb3J5X2NsYXNzKCR0aGlzLT5zYW5pdGl6ZSgkY2F0ZWdvcnlbJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKSwgbnVsbCwgbnVsbCk7CgkJfQoKCQlpZiAoIWVtcHR5KCRjYXRlZ29yaWVzKSkKCQl7CgkJCXJldHVybiBTaW1wbGVQaWVfTWlzYzo6YXJyYXlfdW5pcXVlKCRjYXRlZ29yaWVzKTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCWZ1bmN0aW9uIGdldF9hdXRob3IoJGtleSA9IDApCgl7CgkJJGF1dGhvcnMgPSAkdGhpcy0+Z2V0X2F1dGhvcnMoKTsKCQlpZiAoaXNzZXQoJGF1dGhvcnNbJGtleV0pKQoJCXsKCQkJcmV0dXJuICRhdXRob3JzWyRrZXldOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJZnVuY3Rpb24gZ2V0X2F1dGhvcnMoKQoJewoJCSRhdXRob3JzID0gYXJyYXkoKTsKCQlmb3JlYWNoICgoYXJyYXkpICR0aGlzLT5nZXRfY2hhbm5lbF90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMCwgJ2F1dGhvcicpIGFzICRhdXRob3IpCgkJewoJCQkkbmFtZSA9IG51bGw7CgkJCSR1cmkgPSBudWxsOwoJCQkkZW1haWwgPSBudWxsOwoJCQlpZiAoaXNzZXQoJGF1dGhvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTBdWyduYW1lJ11bMF1bJ2RhdGEnXSkpCgkJCXsKCQkJCSRuYW1lID0gJHRoaXMtPnNhbml0aXplKCRhdXRob3JbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzEwXVsnbmFtZSddWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCX0KCQkJaWYgKGlzc2V0KCRhdXRob3JbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzEwXVsndXJpJ11bMF1bJ2RhdGEnXSkpCgkJCXsKCQkJCSR1cmkgPSAkdGhpcy0+c2FuaXRpemUoJGF1dGhvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTBdWyd1cmknXVswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSwgJHRoaXMtPmdldF9iYXNlKCRhdXRob3JbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzEwXVsndXJpJ11bMF0pKTsKCQkJfQoJCQlpZiAoaXNzZXQoJGF1dGhvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTBdWydlbWFpbCddWzBdWydkYXRhJ10pKQoJCQl7CgkJCQkkZW1haWwgPSAkdGhpcy0+c2FuaXRpemUoJGF1dGhvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTBdWydlbWFpbCddWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCX0KCQkJaWYgKCRuYW1lICE9PSBudWxsIHx8ICRlbWFpbCAhPT0gbnVsbCB8fCAkdXJpICE9PSBudWxsKQoJCQl7CgkJCQkkYXV0aG9yc1tdID0mIG5ldyAkdGhpcy0+YXV0aG9yX2NsYXNzKCRuYW1lLCAkdXJpLCAkZW1haWwpOwoJCQl9CgkJfQoJCWlmICgkYXV0aG9yID0gJHRoaXMtPmdldF9jaGFubmVsX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzAzLCAnYXV0aG9yJykpCgkJewoJCQkkbmFtZSA9IG51bGw7CgkJCSR1cmwgPSBudWxsOwoJCQkkZW1haWwgPSBudWxsOwoJCQlpZiAoaXNzZXQoJGF1dGhvclswXVsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDNdWyduYW1lJ11bMF1bJ2RhdGEnXSkpCgkJCXsKCQkJCSRuYW1lID0gJHRoaXMtPnNhbml0aXplKCRhdXRob3JbMF1bJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzAzXVsnbmFtZSddWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCX0KCQkJaWYgKGlzc2V0KCRhdXRob3JbMF1bJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzAzXVsndXJsJ11bMF1bJ2RhdGEnXSkpCgkJCXsKCQkJCSR1cmwgPSAkdGhpcy0+c2FuaXRpemUoJGF1dGhvclswXVsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDNdWyd1cmwnXVswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSwgJHRoaXMtPmdldF9iYXNlKCRhdXRob3JbMF1bJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzAzXVsndXJsJ11bMF0pKTsKCQkJfQoJCQlpZiAoaXNzZXQoJGF1dGhvclswXVsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDNdWydlbWFpbCddWzBdWydkYXRhJ10pKQoJCQl7CgkJCQkkZW1haWwgPSAkdGhpcy0+c2FuaXRpemUoJGF1dGhvclswXVsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDNdWydlbWFpbCddWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCX0KCQkJaWYgKCRuYW1lICE9PSBudWxsIHx8ICRlbWFpbCAhPT0gbnVsbCB8fCAkdXJsICE9PSBudWxsKQoJCQl7CgkJCQkkYXV0aG9yc1tdID0mIG5ldyAkdGhpcy0+YXV0aG9yX2NsYXNzKCRuYW1lLCAkdXJsLCAkZW1haWwpOwoJCQl9CgkJfQoJCWZvcmVhY2ggKChhcnJheSkgJHRoaXMtPmdldF9jaGFubmVsX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9EQ18xMSwgJ2NyZWF0b3InKSBhcyAkYXV0aG9yKQoJCXsKCQkJJGF1dGhvcnNbXSA9JiBuZXcgJHRoaXMtPmF1dGhvcl9jbGFzcygkdGhpcy0+c2FuaXRpemUoJGF1dGhvclsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpLCBudWxsLCBudWxsKTsKCQl9CgkJZm9yZWFjaCAoKGFycmF5KSAkdGhpcy0+Z2V0X2NoYW5uZWxfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0RDXzEwLCAnY3JlYXRvcicpIGFzICRhdXRob3IpCgkJewoJCQkkYXV0aG9yc1tdID0mIG5ldyAkdGhpcy0+YXV0aG9yX2NsYXNzKCR0aGlzLT5zYW5pdGl6ZSgkYXV0aG9yWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCksIG51bGwsIG51bGwpOwoJCX0KCQlmb3JlYWNoICgoYXJyYXkpICR0aGlzLT5nZXRfY2hhbm5lbF90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfSVRVTkVTLCAnYXV0aG9yJykgYXMgJGF1dGhvcikKCQl7CgkJCSRhdXRob3JzW10gPSYgbmV3ICR0aGlzLT5hdXRob3JfY2xhc3MoJHRoaXMtPnNhbml0aXplKCRhdXRob3JbJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKSwgbnVsbCwgbnVsbCk7CgkJfQoKCQlpZiAoIWVtcHR5KCRhdXRob3JzKSkKCQl7CgkJCXJldHVybiBTaW1wbGVQaWVfTWlzYzo6YXJyYXlfdW5pcXVlKCRhdXRob3JzKTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCWZ1bmN0aW9uIGdldF9jb250cmlidXRvcigka2V5ID0gMCkKCXsKCQkkY29udHJpYnV0b3JzID0gJHRoaXMtPmdldF9jb250cmlidXRvcnMoKTsKCQlpZiAoaXNzZXQoJGNvbnRyaWJ1dG9yc1ska2V5XSkpCgkJewoJCQlyZXR1cm4gJGNvbnRyaWJ1dG9yc1ska2V5XTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCWZ1bmN0aW9uIGdldF9jb250cmlidXRvcnMoKQoJewoJCSRjb250cmlidXRvcnMgPSBhcnJheSgpOwoJCWZvcmVhY2ggKChhcnJheSkgJHRoaXMtPmdldF9jaGFubmVsX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzEwLCAnY29udHJpYnV0b3InKSBhcyAkY29udHJpYnV0b3IpCgkJewoJCQkkbmFtZSA9IG51bGw7CgkJCSR1cmkgPSBudWxsOwoJCQkkZW1haWwgPSBudWxsOwoJCQlpZiAoaXNzZXQoJGNvbnRyaWJ1dG9yWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMF1bJ25hbWUnXVswXVsnZGF0YSddKSkKCQkJewoJCQkJJG5hbWUgPSAkdGhpcy0+c2FuaXRpemUoJGNvbnRyaWJ1dG9yWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMF1bJ25hbWUnXVswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQl9CgkJCWlmIChpc3NldCgkY29udHJpYnV0b3JbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzEwXVsndXJpJ11bMF1bJ2RhdGEnXSkpCgkJCXsKCQkJCSR1cmkgPSAkdGhpcy0+c2FuaXRpemUoJGNvbnRyaWJ1dG9yWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMF1bJ3VyaSddWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfSVJJLCAkdGhpcy0+Z2V0X2Jhc2UoJGNvbnRyaWJ1dG9yWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMF1bJ3VyaSddWzBdKSk7CgkJCX0KCQkJaWYgKGlzc2V0KCRjb250cmlidXRvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTBdWydlbWFpbCddWzBdWydkYXRhJ10pKQoJCQl7CgkJCQkkZW1haWwgPSAkdGhpcy0+c2FuaXRpemUoJGNvbnRyaWJ1dG9yWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMF1bJ2VtYWlsJ11bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJfQoJCQlpZiAoJG5hbWUgIT09IG51bGwgfHwgJGVtYWlsICE9PSBudWxsIHx8ICR1cmkgIT09IG51bGwpCgkJCXsKCQkJCSRjb250cmlidXRvcnNbXSA9JiBuZXcgJHRoaXMtPmF1dGhvcl9jbGFzcygkbmFtZSwgJHVyaSwgJGVtYWlsKTsKCQkJfQoJCX0KCQlmb3JlYWNoICgoYXJyYXkpICR0aGlzLT5nZXRfY2hhbm5lbF90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wMywgJ2NvbnRyaWJ1dG9yJykgYXMgJGNvbnRyaWJ1dG9yKQoJCXsKCQkJJG5hbWUgPSBudWxsOwoJCQkkdXJsID0gbnVsbDsKCQkJJGVtYWlsID0gbnVsbDsKCQkJaWYgKGlzc2V0KCRjb250cmlidXRvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDNdWyduYW1lJ11bMF1bJ2RhdGEnXSkpCgkJCXsKCQkJCSRuYW1lID0gJHRoaXMtPnNhbml0aXplKCRjb250cmlidXRvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDNdWyduYW1lJ11bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJfQoJCQlpZiAoaXNzZXQoJGNvbnRyaWJ1dG9yWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wM11bJ3VybCddWzBdWydkYXRhJ10pKQoJCQl7CgkJCQkkdXJsID0gJHRoaXMtPnNhbml0aXplKCRjb250cmlidXRvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDNdWyd1cmwnXVswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSwgJHRoaXMtPmdldF9iYXNlKCRjb250cmlidXRvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDNdWyd1cmwnXVswXSkpOwoJCQl9CgkJCWlmIChpc3NldCgkY29udHJpYnV0b3JbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzAzXVsnZW1haWwnXVswXVsnZGF0YSddKSkKCQkJewoJCQkJJGVtYWlsID0gJHRoaXMtPnNhbml0aXplKCRjb250cmlidXRvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDNdWydlbWFpbCddWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCX0KCQkJaWYgKCRuYW1lICE9PSBudWxsIHx8ICRlbWFpbCAhPT0gbnVsbCB8fCAkdXJsICE9PSBudWxsKQoJCQl7CgkJCQkkY29udHJpYnV0b3JzW10gPSYgbmV3ICR0aGlzLT5hdXRob3JfY2xhc3MoJG5hbWUsICR1cmwsICRlbWFpbCk7CgkJCX0KCQl9CgoJCWlmICghZW1wdHkoJGNvbnRyaWJ1dG9ycykpCgkJewoJCQlyZXR1cm4gU2ltcGxlUGllX01pc2M6OmFycmF5X3VuaXF1ZSgkY29udHJpYnV0b3JzKTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCWZ1bmN0aW9uIGdldF9saW5rKCRrZXkgPSAwLCAkcmVsID0gJ2FsdGVybmF0ZScpCgl7CgkJJGxpbmtzID0gJHRoaXMtPmdldF9saW5rcygkcmVsKTsKCQlpZiAoaXNzZXQoJGxpbmtzWyRrZXldKSkKCQl7CgkJCXJldHVybiAkbGlua3NbJGtleV07CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCgkvKioKCSAqIEFkZGVkIGZvciBwYXJpdHkgYmV0d2VlbiB0aGUgcGFyZW50LWxldmVsIGFuZCB0aGUgaXRlbS9lbnRyeS1sZXZlbC4KCSAqLwoJZnVuY3Rpb24gZ2V0X3Blcm1hbGluaygpCgl7CgkJcmV0dXJuICR0aGlzLT5nZXRfbGluaygwKTsKCX0KCglmdW5jdGlvbiBnZXRfbGlua3MoJHJlbCA9ICdhbHRlcm5hdGUnKQoJewoJCWlmICghaXNzZXQoJHRoaXMtPmRhdGFbJ2xpbmtzJ10pKQoJCXsKCQkJJHRoaXMtPmRhdGFbJ2xpbmtzJ10gPSBhcnJheSgpOwoJCQlpZiAoJGxpbmtzID0gJHRoaXMtPmdldF9jaGFubmVsX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzEwLCAnbGluaycpKQoJCQl7CgkJCQlmb3JlYWNoICgkbGlua3MgYXMgJGxpbmspCgkJCQl7CgkJCQkJaWYgKGlzc2V0KCRsaW5rWydhdHRyaWJzJ11bJyddWydocmVmJ10pKQoJCQkJCXsKCQkJCQkJJGxpbmtfcmVsID0gKGlzc2V0KCRsaW5rWydhdHRyaWJzJ11bJyddWydyZWwnXSkpID8gJGxpbmtbJ2F0dHJpYnMnXVsnJ11bJ3JlbCddIDogJ2FsdGVybmF0ZSc7CgkJCQkJCSR0aGlzLT5kYXRhWydsaW5rcyddWyRsaW5rX3JlbF1bXSA9ICR0aGlzLT5zYW5pdGl6ZSgkbGlua1snYXR0cmlicyddWycnXVsnaHJlZiddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSwgJHRoaXMtPmdldF9iYXNlKCRsaW5rKSk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJCWlmICgkbGlua3MgPSAkdGhpcy0+Z2V0X2NoYW5uZWxfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDMsICdsaW5rJykpCgkJCXsKCQkJCWZvcmVhY2ggKCRsaW5rcyBhcyAkbGluaykKCQkJCXsKCQkJCQlpZiAoaXNzZXQoJGxpbmtbJ2F0dHJpYnMnXVsnJ11bJ2hyZWYnXSkpCgkJCQkJewoJCQkJCQkkbGlua19yZWwgPSAoaXNzZXQoJGxpbmtbJ2F0dHJpYnMnXVsnJ11bJ3JlbCddKSkgPyAkbGlua1snYXR0cmlicyddWycnXVsncmVsJ10gOiAnYWx0ZXJuYXRlJzsKCQkJCQkJJHRoaXMtPmRhdGFbJ2xpbmtzJ11bJGxpbmtfcmVsXVtdID0gJHRoaXMtPnNhbml0aXplKCRsaW5rWydhdHRyaWJzJ11bJyddWydocmVmJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfSVJJLCAkdGhpcy0+Z2V0X2Jhc2UoJGxpbmspKTsKCgkJCQkJfQoJCQkJfQoJCQl9CgkJCWlmICgkbGlua3MgPSAkdGhpcy0+Z2V0X2NoYW5uZWxfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX1JTU18xMCwgJ2xpbmsnKSkKCQkJewoJCQkJJHRoaXMtPmRhdGFbJ2xpbmtzJ11bJ2FsdGVybmF0ZSddW10gPSAkdGhpcy0+c2FuaXRpemUoJGxpbmtzWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfSVJJLCAkdGhpcy0+Z2V0X2Jhc2UoJGxpbmtzWzBdKSk7CgkJCX0KCQkJaWYgKCRsaW5rcyA9ICR0aGlzLT5nZXRfY2hhbm5lbF90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfUlNTXzA5MCwgJ2xpbmsnKSkKCQkJewoJCQkJJHRoaXMtPmRhdGFbJ2xpbmtzJ11bJ2FsdGVybmF0ZSddW10gPSAkdGhpcy0+c2FuaXRpemUoJGxpbmtzWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfSVJJLCAkdGhpcy0+Z2V0X2Jhc2UoJGxpbmtzWzBdKSk7CgkJCX0KCQkJaWYgKCRsaW5rcyA9ICR0aGlzLT5nZXRfY2hhbm5lbF90YWdzKCcnLCAnbGluaycpKQoJCQl7CgkJCQkkdGhpcy0+ZGF0YVsnbGlua3MnXVsnYWx0ZXJuYXRlJ11bXSA9ICR0aGlzLT5zYW5pdGl6ZSgkbGlua3NbMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9JUkksICR0aGlzLT5nZXRfYmFzZSgkbGlua3NbMF0pKTsKCQkJfQoKCQkJJGtleXMgPSBhcnJheV9rZXlzKCR0aGlzLT5kYXRhWydsaW5rcyddKTsKCQkJZm9yZWFjaCAoJGtleXMgYXMgJGtleSkKCQkJewoJCQkJaWYgKFNpbXBsZVBpZV9NaXNjOjppc19pc2VnbWVudF9uel9uYygka2V5KSkKCQkJCXsKCQkJCQlpZiAoaXNzZXQoJHRoaXMtPmRhdGFbJ2xpbmtzJ11bU0lNUExFUElFX0lBTkFfTElOS19SRUxBVElPTlNfUkVHSVNUUlkgLiAka2V5XSkpCgkJCQkJewoJCQkJCQkkdGhpcy0+ZGF0YVsnbGlua3MnXVtTSU1QTEVQSUVfSUFOQV9MSU5LX1JFTEFUSU9OU19SRUdJU1RSWSAuICRrZXldID0gYXJyYXlfbWVyZ2UoJHRoaXMtPmRhdGFbJ2xpbmtzJ11bJGtleV0sICR0aGlzLT5kYXRhWydsaW5rcyddW1NJTVBMRVBJRV9JQU5BX0xJTktfUkVMQVRJT05TX1JFR0lTVFJZIC4gJGtleV0pOwoJCQkJCQkkdGhpcy0+ZGF0YVsnbGlua3MnXVska2V5XSA9JiAkdGhpcy0+ZGF0YVsnbGlua3MnXVtTSU1QTEVQSUVfSUFOQV9MSU5LX1JFTEFUSU9OU19SRUdJU1RSWSAuICRrZXldOwoJCQkJCX0KCQkJCQllbHNlCgkJCQkJewoJCQkJCQkkdGhpcy0+ZGF0YVsnbGlua3MnXVtTSU1QTEVQSUVfSUFOQV9MSU5LX1JFTEFUSU9OU19SRUdJU1RSWSAuICRrZXldID0mICR0aGlzLT5kYXRhWydsaW5rcyddWyRrZXldOwoJCQkJCX0KCQkJCX0KCQkJCWVsc2VpZiAoc3Vic3RyKCRrZXksIDAsIDQxKSA9PSBTSU1QTEVQSUVfSUFOQV9MSU5LX1JFTEFUSU9OU19SRUdJU1RSWSkKCQkJCXsKCQkJCQkkdGhpcy0+ZGF0YVsnbGlua3MnXVtzdWJzdHIoJGtleSwgNDEpXSA9JiAkdGhpcy0+ZGF0YVsnbGlua3MnXVska2V5XTsKCQkJCX0KCQkJCSR0aGlzLT5kYXRhWydsaW5rcyddWyRrZXldID0gYXJyYXlfdW5pcXVlKCR0aGlzLT5kYXRhWydsaW5rcyddWyRrZXldKTsKCQkJfQoJCX0KCgkJaWYgKGlzc2V0KCR0aGlzLT5kYXRhWydsaW5rcyddWyRyZWxdKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+ZGF0YVsnbGlua3MnXVskcmVsXTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCWZ1bmN0aW9uIGdldF9kZXNjcmlwdGlvbigpCgl7CgkJaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2NoYW5uZWxfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTAsICdzdWJ0aXRsZScpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNpbXBsZVBpZV9NaXNjOjphdG9tXzEwX2NvbnN0cnVjdF90eXBlKCRyZXR1cm5bMF1bJ2F0dHJpYnMnXSksICR0aGlzLT5nZXRfYmFzZSgkcmV0dXJuWzBdKSk7CgkJfQoJCWVsc2VpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfY2hhbm5lbF90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wMywgJ3RhZ2xpbmUnKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCBTaW1wbGVQaWVfTWlzYzo6YXRvbV8wM19jb25zdHJ1Y3RfdHlwZSgkcmV0dXJuWzBdWydhdHRyaWJzJ10pLCAkdGhpcy0+Z2V0X2Jhc2UoJHJldHVyblswXSkpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2NoYW5uZWxfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX1JTU18xMCwgJ2Rlc2NyaXB0aW9uJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9NQVlCRV9IVE1MLCAkdGhpcy0+Z2V0X2Jhc2UoJHJldHVyblswXSkpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2NoYW5uZWxfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX1JTU18wOTAsICdkZXNjcmlwdGlvbicpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfTUFZQkVfSFRNTCwgJHRoaXMtPmdldF9iYXNlKCRyZXR1cm5bMF0pKTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9jaGFubmVsX3RhZ3MoJycsICdkZXNjcmlwdGlvbicpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfTUFZQkVfSFRNTCwgJHRoaXMtPmdldF9iYXNlKCRyZXR1cm5bMF0pKTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9jaGFubmVsX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9EQ18xMSwgJ2Rlc2NyaXB0aW9uJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9jaGFubmVsX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9EQ18xMCwgJ2Rlc2NyaXB0aW9uJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9jaGFubmVsX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9JVFVORVMsICdzdW1tYXJ5JykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9IVE1MLCAkdGhpcy0+Z2V0X2Jhc2UoJHJldHVyblswXSkpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2NoYW5uZWxfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0lUVU5FUywgJ3N1YnRpdGxlJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9IVE1MLCAkdGhpcy0+Z2V0X2Jhc2UoJHJldHVyblswXSkpOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJZnVuY3Rpb24gZ2V0X2NvcHlyaWdodCgpCgl7CgkJaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2NoYW5uZWxfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTAsICdyaWdodHMnKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCBTaW1wbGVQaWVfTWlzYzo6YXRvbV8xMF9jb25zdHJ1Y3RfdHlwZSgkcmV0dXJuWzBdWydhdHRyaWJzJ10pLCAkdGhpcy0+Z2V0X2Jhc2UoJHJldHVyblswXSkpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2NoYW5uZWxfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDMsICdjb3B5cmlnaHQnKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCBTaW1wbGVQaWVfTWlzYzo6YXRvbV8wM19jb25zdHJ1Y3RfdHlwZSgkcmV0dXJuWzBdWydhdHRyaWJzJ10pLCAkdGhpcy0+Z2V0X2Jhc2UoJHJldHVyblswXSkpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2NoYW5uZWxfdGFncygnJywgJ2NvcHlyaWdodCcpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJfQoJCWVsc2VpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfY2hhbm5lbF90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfRENfMTEsICdyaWdodHMnKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2NoYW5uZWxfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0RDXzEwLCAncmlnaHRzJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCWZ1bmN0aW9uIGdldF9sYW5ndWFnZSgpCgl7CgkJaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2NoYW5uZWxfdGFncygnJywgJ2xhbmd1YWdlJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9jaGFubmVsX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9EQ18xMSwgJ2xhbmd1YWdlJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9jaGFubmVsX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9EQ18xMCwgJ2xhbmd1YWdlJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQl9CgkJZWxzZWlmIChpc3NldCgkdGhpcy0+ZGF0YVsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTBdWydmZWVkJ11bMF1bJ3htbF9sYW5nJ10pKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkdGhpcy0+ZGF0YVsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTBdWydmZWVkJ11bMF1bJ3htbF9sYW5nJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJfQoJCWVsc2VpZiAoaXNzZXQoJHRoaXMtPmRhdGFbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzAzXVsnZmVlZCddWzBdWyd4bWxfbGFuZyddKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHRoaXMtPmRhdGFbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzAzXVsnZmVlZCddWzBdWyd4bWxfbGFuZyddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCX0KCQllbHNlaWYgKGlzc2V0KCR0aGlzLT5kYXRhWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfUkRGXVsnUkRGJ11bMF1bJ3htbF9sYW5nJ10pKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkdGhpcy0+ZGF0YVsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX1JERl1bJ1JERiddWzBdWyd4bWxfbGFuZyddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCX0KCQllbHNlaWYgKGlzc2V0KCR0aGlzLT5kYXRhWydoZWFkZXJzJ11bJ2NvbnRlbnQtbGFuZ3VhZ2UnXSkpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCR0aGlzLT5kYXRhWydoZWFkZXJzJ11bJ2NvbnRlbnQtbGFuZ3VhZ2UnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCWZ1bmN0aW9uIGdldF9sYXRpdHVkZSgpCgl7CgkJaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2NoYW5uZWxfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX1czQ19CQVNJQ19HRU8sICdsYXQnKSkKCQl7CgkJCXJldHVybiAoZmxvYXQpICRyZXR1cm5bMF1bJ2RhdGEnXTsKCQl9CgkJZWxzZWlmICgoJHJldHVybiA9ICR0aGlzLT5nZXRfY2hhbm5lbF90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfR0VPUlNTLCAncG9pbnQnKSkgJiYgcHJlZ19tYXRjaCgnL14oKD86LSk/WzAtOV0rKD86XC5bMC05XSspKSAoKD86LSk/WzAtOV0rKD86XC5bMC05XSspKSQvJywgJHJldHVyblswXVsnZGF0YSddLCAkbWF0Y2gpKQoJCXsKCQkJcmV0dXJuIChmbG9hdCkgJG1hdGNoWzFdOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJZnVuY3Rpb24gZ2V0X2xvbmdpdHVkZSgpCgl7CgkJaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2NoYW5uZWxfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX1czQ19CQVNJQ19HRU8sICdsb25nJykpCgkJewoJCQlyZXR1cm4gKGZsb2F0KSAkcmV0dXJuWzBdWydkYXRhJ107CgkJfQoJCWVsc2VpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfY2hhbm5lbF90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfVzNDX0JBU0lDX0dFTywgJ2xvbicpKQoJCXsKCQkJcmV0dXJuIChmbG9hdCkgJHJldHVyblswXVsnZGF0YSddOwoJCX0KCQllbHNlaWYgKCgkcmV0dXJuID0gJHRoaXMtPmdldF9jaGFubmVsX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9HRU9SU1MsICdwb2ludCcpKSAmJiBwcmVnX21hdGNoKCcvXigoPzotKT9bMC05XSsoPzpcLlswLTldKykpICgoPzotKT9bMC05XSsoPzpcLlswLTldKykpJC8nLCAkcmV0dXJuWzBdWydkYXRhJ10sICRtYXRjaCkpCgkJewoJCQlyZXR1cm4gKGZsb2F0KSAkbWF0Y2hbMl07CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCglmdW5jdGlvbiBnZXRfaW1hZ2VfdGl0bGUoKQoJewoJCWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9pbWFnZV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfUlNTXzEwLCAndGl0bGUnKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2ltYWdlX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9SU1NfMDkwLCAndGl0bGUnKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2ltYWdlX3RhZ3MoJycsICd0aXRsZScpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJfQoJCWVsc2VpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfaW1hZ2VfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0RDXzExLCAndGl0bGUnKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2ltYWdlX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9EQ18xMCwgJ3RpdGxlJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCWZ1bmN0aW9uIGdldF9pbWFnZV91cmwoKQoJewoJCWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9jaGFubmVsX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9JVFVORVMsICdpbWFnZScpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydhdHRyaWJzJ11bJyddWydocmVmJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfSVJJKTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9jaGFubmVsX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzEwLCAnbG9nbycpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfSVJJLCAkdGhpcy0+Z2V0X2Jhc2UoJHJldHVyblswXSkpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2NoYW5uZWxfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTAsICdpY29uJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9JUkksICR0aGlzLT5nZXRfYmFzZSgkcmV0dXJuWzBdKSk7CgkJfQoJCWVsc2VpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfaW1hZ2VfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX1JTU18xMCwgJ3VybCcpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfSVJJLCAkdGhpcy0+Z2V0X2Jhc2UoJHJldHVyblswXSkpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2ltYWdlX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9SU1NfMDkwLCAndXJsJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9JUkksICR0aGlzLT5nZXRfYmFzZSgkcmV0dXJuWzBdKSk7CgkJfQoJCWVsc2VpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfaW1hZ2VfdGFncygnJywgJ3VybCcpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfSVJJLCAkdGhpcy0+Z2V0X2Jhc2UoJHJldHVyblswXSkpOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJZnVuY3Rpb24gZ2V0X2ltYWdlX2xpbmsoKQoJewoJCWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9pbWFnZV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfUlNTXzEwLCAnbGluaycpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfSVJJLCAkdGhpcy0+Z2V0X2Jhc2UoJHJldHVyblswXSkpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2ltYWdlX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9SU1NfMDkwLCAnbGluaycpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfSVJJLCAkdGhpcy0+Z2V0X2Jhc2UoJHJldHVyblswXSkpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2ltYWdlX3RhZ3MoJycsICdsaW5rJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9JUkksICR0aGlzLT5nZXRfYmFzZSgkcmV0dXJuWzBdKSk7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCglmdW5jdGlvbiBnZXRfaW1hZ2Vfd2lkdGgoKQoJewoJCWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9pbWFnZV90YWdzKCcnLCAnd2lkdGgnKSkKCQl7CgkJCXJldHVybiByb3VuZCgkcmV0dXJuWzBdWydkYXRhJ10pOwoJCX0KCQllbHNlaWYgKCR0aGlzLT5nZXRfdHlwZSgpICYgU0lNUExFUElFX1RZUEVfUlNTX1NZTkRJQ0FUSU9OICYmICR0aGlzLT5nZXRfaW1hZ2VfdGFncygnJywgJ3VybCcpKQoJCXsKCQkJcmV0dXJuIDg4LjA7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCglmdW5jdGlvbiBnZXRfaW1hZ2VfaGVpZ2h0KCkKCXsKCQlpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfaW1hZ2VfdGFncygnJywgJ2hlaWdodCcpKQoJCXsKCQkJcmV0dXJuIHJvdW5kKCRyZXR1cm5bMF1bJ2RhdGEnXSk7CgkJfQoJCWVsc2VpZiAoJHRoaXMtPmdldF90eXBlKCkgJiBTSU1QTEVQSUVfVFlQRV9SU1NfU1lORElDQVRJT04gJiYgJHRoaXMtPmdldF9pbWFnZV90YWdzKCcnLCAndXJsJykpCgkJewoJCQlyZXR1cm4gMzEuMDsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCWZ1bmN0aW9uIGdldF9pdGVtX3F1YW50aXR5KCRtYXggPSAwKQoJewoJCSRxdHkgPSBjb3VudCgkdGhpcy0+Z2V0X2l0ZW1zKCkpOwoJCWlmICgkbWF4ID09IDApCgkJewoJCQlyZXR1cm4gJHF0eTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuICgkcXR5ID4gJG1heCkgPyAkbWF4IDogJHF0eTsKCQl9Cgl9CgoJZnVuY3Rpb24gZ2V0X2l0ZW0oJGtleSA9IDApCgl7CgkJJGl0ZW1zID0gJHRoaXMtPmdldF9pdGVtcygpOwoJCWlmIChpc3NldCgkaXRlbXNbJGtleV0pKQoJCXsKCQkJcmV0dXJuICRpdGVtc1ska2V5XTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCWZ1bmN0aW9uIGdldF9pdGVtcygkc3RhcnQgPSAwLCAkZW5kID0gMCkKCXsKCQlpZiAoIWVtcHR5KCR0aGlzLT5tdWx0aWZlZWRfb2JqZWN0cykpCgkJewoJCQlyZXR1cm4gU2ltcGxlUGllOjptZXJnZV9pdGVtcygkdGhpcy0+bXVsdGlmZWVkX29iamVjdHMsICRzdGFydCwgJGVuZCwgJHRoaXMtPml0ZW1fbGltaXQpOwoJCX0KCQllbHNlaWYgKCFpc3NldCgkdGhpcy0+ZGF0YVsnaXRlbXMnXSkpCgkJewoJCQlpZiAoJGl0ZW1zID0gJHRoaXMtPmdldF9mZWVkX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzEwLCAnZW50cnknKSkKCQkJewoJCQkJJGtleXMgPSBhcnJheV9rZXlzKCRpdGVtcyk7CgkJCQlmb3JlYWNoICgka2V5cyBhcyAka2V5KQoJCQkJewoJCQkJCSR0aGlzLT5kYXRhWydpdGVtcyddW10gPSYgbmV3ICR0aGlzLT5pdGVtX2NsYXNzKCR0aGlzLCAkaXRlbXNbJGtleV0pOwoJCQkJfQoJCQl9CgkJCWlmICgkaXRlbXMgPSAkdGhpcy0+Z2V0X2ZlZWRfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDMsICdlbnRyeScpKQoJCQl7CgkJCQkka2V5cyA9IGFycmF5X2tleXMoJGl0ZW1zKTsKCQkJCWZvcmVhY2ggKCRrZXlzIGFzICRrZXkpCgkJCQl7CgkJCQkJJHRoaXMtPmRhdGFbJ2l0ZW1zJ11bXSA9JiBuZXcgJHRoaXMtPml0ZW1fY2xhc3MoJHRoaXMsICRpdGVtc1ska2V5XSk7CgkJCQl9CgkJCX0KCQkJaWYgKCRpdGVtcyA9ICR0aGlzLT5nZXRfZmVlZF90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfUlNTXzEwLCAnaXRlbScpKQoJCQl7CgkJCQkka2V5cyA9IGFycmF5X2tleXMoJGl0ZW1zKTsKCQkJCWZvcmVhY2ggKCRrZXlzIGFzICRrZXkpCgkJCQl7CgkJCQkJJHRoaXMtPmRhdGFbJ2l0ZW1zJ11bXSA9JiBuZXcgJHRoaXMtPml0ZW1fY2xhc3MoJHRoaXMsICRpdGVtc1ska2V5XSk7CgkJCQl9CgkJCX0KCQkJaWYgKCRpdGVtcyA9ICR0aGlzLT5nZXRfZmVlZF90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfUlNTXzA5MCwgJ2l0ZW0nKSkKCQkJewoJCQkJJGtleXMgPSBhcnJheV9rZXlzKCRpdGVtcyk7CgkJCQlmb3JlYWNoICgka2V5cyBhcyAka2V5KQoJCQkJewoJCQkJCSR0aGlzLT5kYXRhWydpdGVtcyddW10gPSYgbmV3ICR0aGlzLT5pdGVtX2NsYXNzKCR0aGlzLCAkaXRlbXNbJGtleV0pOwoJCQkJfQoJCQl9CgkJCWlmICgkaXRlbXMgPSAkdGhpcy0+Z2V0X2NoYW5uZWxfdGFncygnJywgJ2l0ZW0nKSkKCQkJewoJCQkJJGtleXMgPSBhcnJheV9rZXlzKCRpdGVtcyk7CgkJCQlmb3JlYWNoICgka2V5cyBhcyAka2V5KQoJCQkJewoJCQkJCSR0aGlzLT5kYXRhWydpdGVtcyddW10gPSYgbmV3ICR0aGlzLT5pdGVtX2NsYXNzKCR0aGlzLCAkaXRlbXNbJGtleV0pOwoJCQkJfQoJCQl9CgkJfQoKCQlpZiAoIWVtcHR5KCR0aGlzLT5kYXRhWydpdGVtcyddKSkKCQl7CgkJCS8vIElmIHdlIHdhbnQgdG8gb3JkZXIgaXQgYnkgZGF0ZSwgY2hlY2sgaWYgYWxsIGl0ZW1zIGhhdmUgYSBkYXRlLCBhbmQgdGhlbiBzb3J0IGl0CgkJCWlmICgkdGhpcy0+b3JkZXJfYnlfZGF0ZSkKCQkJewoJCQkJaWYgKCFpc3NldCgkdGhpcy0+ZGF0YVsnb3JkZXJlZF9pdGVtcyddKSkKCQkJCXsKCQkJCQkkZG9fc29ydCA9IHRydWU7CgkJCQkJZm9yZWFjaCAoJHRoaXMtPmRhdGFbJ2l0ZW1zJ10gYXMgJGl0ZW0pCgkJCQkJewoJCQkJCQlpZiAoISRpdGVtLT5nZXRfZGF0ZSgnVScpKQoJCQkJCQl7CgkJCQkJCQkkZG9fc29ydCA9IGZhbHNlOwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQl9CgkJCQkJJGl0ZW0gPSBudWxsOwoJCQkJCSR0aGlzLT5kYXRhWydvcmRlcmVkX2l0ZW1zJ10gPSAkdGhpcy0+ZGF0YVsnaXRlbXMnXTsKCQkJCQlpZiAoJGRvX3NvcnQpCgkJCQkJewoJCQkJCQl1c29ydCgkdGhpcy0+ZGF0YVsnb3JkZXJlZF9pdGVtcyddLCBhcnJheSgmJHRoaXMsICdzb3J0X2l0ZW1zJykpOwoJCQkJCX0KCQkJCX0KCQkJCSRpdGVtcyA9ICR0aGlzLT5kYXRhWydvcmRlcmVkX2l0ZW1zJ107CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQkkaXRlbXMgPSAkdGhpcy0+ZGF0YVsnaXRlbXMnXTsKCQkJfQoKCQkJLy8gU2xpY2UgdGhlIGRhdGEgYXMgZGVzaXJlZAoJCQlpZiAoJGVuZCA9PSAwKQoJCQl7CgkJCQlyZXR1cm4gYXJyYXlfc2xpY2UoJGl0ZW1zLCAkc3RhcnQpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJcmV0dXJuIGFycmF5X3NsaWNlKCRpdGVtcywgJHN0YXJ0LCAkZW5kKTsKCQkJfQoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gYXJyYXkoKTsKCQl9Cgl9CgoJZnVuY3Rpb24gc29ydF9pdGVtcygkYSwgJGIpCgl7CgkJcmV0dXJuICRhLT5nZXRfZGF0ZSgnVScpIDw9ICRiLT5nZXRfZGF0ZSgnVScpOwoJfQoKCWZ1bmN0aW9uIG1lcmdlX2l0ZW1zKCR1cmxzLCAkc3RhcnQgPSAwLCAkZW5kID0gMCwgJGxpbWl0ID0gMCkKCXsKCQlpZiAoaXNfYXJyYXkoJHVybHMpICYmIHNpemVvZigkdXJscykgPiAwKQoJCXsKCQkJJGl0ZW1zID0gYXJyYXkoKTsKCQkJZm9yZWFjaCAoJHVybHMgYXMgJGFyZykKCQkJewoJCQkJaWYgKGlzX2EoJGFyZywgJ1NpbXBsZVBpZScpKQoJCQkJewoJCQkJCSRpdGVtcyA9IGFycmF5X21lcmdlKCRpdGVtcywgJGFyZy0+Z2V0X2l0ZW1zKDAsICRsaW1pdCkpOwoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCXRyaWdnZXJfZXJyb3IoJ0FyZ3VtZW50cyBtdXN0IGJlIFNpbXBsZVBpZSBvYmplY3RzJywgRV9VU0VSX1dBUk5JTkcpOwoJCQkJfQoJCQl9CgoJCQkkZG9fc29ydCA9IHRydWU7CgkJCWZvcmVhY2ggKCRpdGVtcyBhcyAkaXRlbSkKCQkJewoJCQkJaWYgKCEkaXRlbS0+Z2V0X2RhdGUoJ1UnKSkKCQkJCXsKCQkJCQkkZG9fc29ydCA9IGZhbHNlOwoJCQkJCWJyZWFrOwoJCQkJfQoJCQl9CgkJCSRpdGVtID0gbnVsbDsKCQkJaWYgKCRkb19zb3J0KQoJCQl7CgkJCQl1c29ydCgkaXRlbXMsIGFycmF5KCdTaW1wbGVQaWUnLCAnc29ydF9pdGVtcycpKTsKCQkJfQoKCQkJaWYgKCRlbmQgPT0gMCkKCQkJewoJCQkJcmV0dXJuIGFycmF5X3NsaWNlKCRpdGVtcywgJHN0YXJ0KTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCXJldHVybiBhcnJheV9zbGljZSgkaXRlbXMsICRzdGFydCwgJGVuZCk7CgkJCX0KCQl9CgkJZWxzZQoJCXsKCQkJdHJpZ2dlcl9lcnJvcignQ2Fubm90IG1lcmdlIHplcm8gU2ltcGxlUGllIG9iamVjdHMnLCBFX1VTRVJfV0FSTklORyk7CgkJCXJldHVybiBhcnJheSgpOwoJCX0KCX0KfQoKY2xhc3MgU2ltcGxlUGllX0l0ZW0KewoJdmFyICRmZWVkOwoJdmFyICRkYXRhID0gYXJyYXkoKTsKCglmdW5jdGlvbiBTaW1wbGVQaWVfSXRlbSgkZmVlZCwgJGRhdGEpCgl7CgkJJHRoaXMtPmZlZWQgPSAkZmVlZDsKCQkkdGhpcy0+ZGF0YSA9ICRkYXRhOwoJfQoKCWZ1bmN0aW9uIF9fdG9TdHJpbmcoKQoJewoJCXJldHVybiBtZDUoc2VyaWFsaXplKCR0aGlzLT5kYXRhKSk7Cgl9CgoJLyoqCgkgKiBSZW1vdmUgaXRlbXMgdGhhdCBsaW5rIGJhY2sgdG8gdGhpcyBiZWZvcmUgZGVzdHJveWluZyB0aGlzIG9iamVjdAoJICovCglmdW5jdGlvbiBfX2Rlc3RydWN0KCkKCXsKCQl1bnNldCgkdGhpcy0+ZmVlZCk7Cgl9CgoJZnVuY3Rpb24gZ2V0X2l0ZW1fdGFncygkbmFtZXNwYWNlLCAkdGFnKQoJewoJCWlmIChpc3NldCgkdGhpcy0+ZGF0YVsnY2hpbGQnXVskbmFtZXNwYWNlXVskdGFnXSkpCgkJewoJCQlyZXR1cm4gJHRoaXMtPmRhdGFbJ2NoaWxkJ11bJG5hbWVzcGFjZV1bJHRhZ107CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCglmdW5jdGlvbiBnZXRfYmFzZSgkZWxlbWVudCA9IGFycmF5KCkpCgl7CgkJcmV0dXJuICR0aGlzLT5mZWVkLT5nZXRfYmFzZSgkZWxlbWVudCk7Cgl9CgoJZnVuY3Rpb24gc2FuaXRpemUoJGRhdGEsICR0eXBlLCAkYmFzZSA9ICcnKQoJewoJCXJldHVybiAkdGhpcy0+ZmVlZC0+c2FuaXRpemUoJGRhdGEsICR0eXBlLCAkYmFzZSk7Cgl9CgoJZnVuY3Rpb24gZ2V0X2ZlZWQoKQoJewoJCXJldHVybiAkdGhpcy0+ZmVlZDsKCX0KCglmdW5jdGlvbiBnZXRfaWQoJGhhc2ggPSBmYWxzZSkKCXsKCQlpZiAoISRoYXNoKQoJCXsKCQkJaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2l0ZW1fdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTAsICdpZCcpKQoJCQl7CgkJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJfQoJCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2l0ZW1fdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDMsICdpZCcpKQoJCQl7CgkJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJfQoJCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2l0ZW1fdGFncygnJywgJ2d1aWQnKSkKCQkJewoJCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCX0KCQkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9EQ18xMSwgJ2lkZW50aWZpZXInKSkKCQkJewoJCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCX0KCQkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9EQ18xMCwgJ2lkZW50aWZpZXInKSkKCQkJewoJCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCX0KCQkJZWxzZWlmICgoJHJldHVybiA9ICR0aGlzLT5nZXRfcGVybWFsaW5rKCkpICE9PSBudWxsKQoJCQl7CgkJCQlyZXR1cm4gJHJldHVybjsKCQkJfQoJCQllbHNlaWYgKCgkcmV0dXJuID0gJHRoaXMtPmdldF90aXRsZSgpKSAhPT0gbnVsbCkKCQkJewoJCQkJcmV0dXJuICRyZXR1cm47CgkJCX0KCQl9CgkJaWYgKCR0aGlzLT5nZXRfcGVybWFsaW5rKCkgIT09IG51bGwgfHwgJHRoaXMtPmdldF90aXRsZSgpICE9PSBudWxsKQoJCXsKCQkJcmV0dXJuIG1kNSgkdGhpcy0+Z2V0X3Blcm1hbGluaygpIC4gJHRoaXMtPmdldF90aXRsZSgpKTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG1kNShzZXJpYWxpemUoJHRoaXMtPmRhdGEpKTsKCQl9Cgl9CgoJZnVuY3Rpb24gZ2V0X3RpdGxlKCkKCXsKCQlpZiAoIWlzc2V0KCR0aGlzLT5kYXRhWyd0aXRsZSddKSkKCQl7CgkJCWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzEwLCAndGl0bGUnKSkKCQkJewoJCQkJJHRoaXMtPmRhdGFbJ3RpdGxlJ10gPSAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCBTaW1wbGVQaWVfTWlzYzo6YXRvbV8xMF9jb25zdHJ1Y3RfdHlwZSgkcmV0dXJuWzBdWydhdHRyaWJzJ10pLCAkdGhpcy0+Z2V0X2Jhc2UoJHJldHVyblswXSkpOwoJCQl9CgkJCWVsc2VpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfaXRlbV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wMywgJ3RpdGxlJykpCgkJCXsKCQkJCSR0aGlzLT5kYXRhWyd0aXRsZSddID0gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU2ltcGxlUGllX01pc2M6OmF0b21fMDNfY29uc3RydWN0X3R5cGUoJHJldHVyblswXVsnYXR0cmlicyddKSwgJHRoaXMtPmdldF9iYXNlKCRyZXR1cm5bMF0pKTsKCQkJfQoJCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2l0ZW1fdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX1JTU18xMCwgJ3RpdGxlJykpCgkJCXsKCQkJCSR0aGlzLT5kYXRhWyd0aXRsZSddID0gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9NQVlCRV9IVE1MLCAkdGhpcy0+Z2V0X2Jhc2UoJHJldHVyblswXSkpOwoJCQl9CgkJCWVsc2VpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfaXRlbV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfUlNTXzA5MCwgJ3RpdGxlJykpCgkJCXsKCQkJCSR0aGlzLT5kYXRhWyd0aXRsZSddID0gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9NQVlCRV9IVE1MLCAkdGhpcy0+Z2V0X2Jhc2UoJHJldHVyblswXSkpOwoJCQl9CgkJCWVsc2VpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfaXRlbV90YWdzKCcnLCAndGl0bGUnKSkKCQkJewoJCQkJJHRoaXMtPmRhdGFbJ3RpdGxlJ10gPSAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX01BWUJFX0hUTUwsICR0aGlzLT5nZXRfYmFzZSgkcmV0dXJuWzBdKSk7CgkJCX0KCQkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9EQ18xMSwgJ3RpdGxlJykpCgkJCXsKCQkJCSR0aGlzLT5kYXRhWyd0aXRsZSddID0gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJfQoJCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2l0ZW1fdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0RDXzEwLCAndGl0bGUnKSkKCQkJewoJCQkJJHRoaXMtPmRhdGFbJ3RpdGxlJ10gPSAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJJHRoaXMtPmRhdGFbJ3RpdGxlJ10gPSBudWxsOwoJCQl9CgkJfQoJCXJldHVybiAkdGhpcy0+ZGF0YVsndGl0bGUnXTsKCX0KCglmdW5jdGlvbiBnZXRfZGVzY3JpcHRpb24oJGRlc2NyaXB0aW9uX29ubHkgPSBmYWxzZSkKCXsKCQlpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfaXRlbV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMCwgJ3N1bW1hcnknKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCBTaW1wbGVQaWVfTWlzYzo6YXRvbV8xMF9jb25zdHJ1Y3RfdHlwZSgkcmV0dXJuWzBdWydhdHRyaWJzJ10pLCAkdGhpcy0+Z2V0X2Jhc2UoJHJldHVyblswXSkpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2l0ZW1fdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDMsICdzdW1tYXJ5JykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU2ltcGxlUGllX01pc2M6OmF0b21fMDNfY29uc3RydWN0X3R5cGUoJHJldHVyblswXVsnYXR0cmlicyddKSwgJHRoaXMtPmdldF9iYXNlKCRyZXR1cm5bMF0pKTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9SU1NfMTAsICdkZXNjcmlwdGlvbicpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfTUFZQkVfSFRNTCwgJHRoaXMtPmdldF9iYXNlKCRyZXR1cm5bMF0pKTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoJycsICdkZXNjcmlwdGlvbicpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfSFRNTCwgJHRoaXMtPmdldF9iYXNlKCRyZXR1cm5bMF0pKTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9EQ18xMSwgJ2Rlc2NyaXB0aW9uJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9EQ18xMCwgJ2Rlc2NyaXB0aW9uJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9JVFVORVMsICdzdW1tYXJ5JykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9IVE1MLCAkdGhpcy0+Z2V0X2Jhc2UoJHJldHVyblswXSkpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2l0ZW1fdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0lUVU5FUywgJ3N1YnRpdGxlJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQl9CgkJZWxzZWlmICghJGRlc2NyaXB0aW9uX29ubHkpCgkJewoJCQlyZXR1cm4gJHRoaXMtPmdldF9jb250ZW50KHRydWUpOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJZnVuY3Rpb24gZ2V0X2NvbnRlbnQoJGNvbnRlbnRfb25seSA9IGZhbHNlKQoJewoJCWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzEwLCAnY29udGVudCcpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNpbXBsZVBpZV9NaXNjOjphdG9tXzEwX2NvbnRlbnRfY29uc3RydWN0X3R5cGUoJHJldHVyblswXVsnYXR0cmlicyddKSwgJHRoaXMtPmdldF9iYXNlKCRyZXR1cm5bMF0pKTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzAzLCAnY29udGVudCcpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNpbXBsZVBpZV9NaXNjOjphdG9tXzAzX2NvbnN0cnVjdF90eXBlKCRyZXR1cm5bMF1bJ2F0dHJpYnMnXSksICR0aGlzLT5nZXRfYmFzZSgkcmV0dXJuWzBdKSk7CgkJfQoJCWVsc2VpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfaXRlbV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfUlNTXzEwX01PRFVMRVNfQ09OVEVOVCwgJ2VuY29kZWQnKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0hUTUwsICR0aGlzLT5nZXRfYmFzZSgkcmV0dXJuWzBdKSk7CgkJfQoJCWVsc2VpZiAoISRjb250ZW50X29ubHkpCgkJewoJCQlyZXR1cm4gJHRoaXMtPmdldF9kZXNjcmlwdGlvbih0cnVlKTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCWZ1bmN0aW9uIGdldF9jYXRlZ29yeSgka2V5ID0gMCkKCXsKCQkkY2F0ZWdvcmllcyA9ICR0aGlzLT5nZXRfY2F0ZWdvcmllcygpOwoJCWlmIChpc3NldCgkY2F0ZWdvcmllc1ska2V5XSkpCgkJewoJCQlyZXR1cm4gJGNhdGVnb3JpZXNbJGtleV07CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCglmdW5jdGlvbiBnZXRfY2F0ZWdvcmllcygpCgl7CgkJJGNhdGVnb3JpZXMgPSBhcnJheSgpOwoKCQlmb3JlYWNoICgoYXJyYXkpICR0aGlzLT5nZXRfaXRlbV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMCwgJ2NhdGVnb3J5JykgYXMgJGNhdGVnb3J5KQoJCXsKCQkJJHRlcm0gPSBudWxsOwoJCQkkc2NoZW1lID0gbnVsbDsKCQkJJGxhYmVsID0gbnVsbDsKCQkJaWYgKGlzc2V0KCRjYXRlZ29yeVsnYXR0cmlicyddWycnXVsndGVybSddKSkKCQkJewoJCQkJJHRlcm0gPSAkdGhpcy0+c2FuaXRpemUoJGNhdGVnb3J5WydhdHRyaWJzJ11bJyddWyd0ZXJtJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCX0KCQkJaWYgKGlzc2V0KCRjYXRlZ29yeVsnYXR0cmlicyddWycnXVsnc2NoZW1lJ10pKQoJCQl7CgkJCQkkc2NoZW1lID0gJHRoaXMtPnNhbml0aXplKCRjYXRlZ29yeVsnYXR0cmlicyddWycnXVsnc2NoZW1lJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCX0KCQkJaWYgKGlzc2V0KCRjYXRlZ29yeVsnYXR0cmlicyddWycnXVsnbGFiZWwnXSkpCgkJCXsKCQkJCSRsYWJlbCA9ICR0aGlzLT5zYW5pdGl6ZSgkY2F0ZWdvcnlbJ2F0dHJpYnMnXVsnJ11bJ2xhYmVsJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCX0KCQkJJGNhdGVnb3JpZXNbXSA9JiBuZXcgJHRoaXMtPmZlZWQtPmNhdGVnb3J5X2NsYXNzKCR0ZXJtLCAkc2NoZW1lLCAkbGFiZWwpOwoJCX0KCQlmb3JlYWNoICgoYXJyYXkpICR0aGlzLT5nZXRfaXRlbV90YWdzKCcnLCAnY2F0ZWdvcnknKSBhcyAkY2F0ZWdvcnkpCgkJewoJCQkkY2F0ZWdvcmllc1tdID0mIG5ldyAkdGhpcy0+ZmVlZC0+Y2F0ZWdvcnlfY2xhc3MoJHRoaXMtPnNhbml0aXplKCRjYXRlZ29yeVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpLCBudWxsLCBudWxsKTsKCQl9CgkJZm9yZWFjaCAoKGFycmF5KSAkdGhpcy0+Z2V0X2l0ZW1fdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0RDXzExLCAnc3ViamVjdCcpIGFzICRjYXRlZ29yeSkKCQl7CgkJCSRjYXRlZ29yaWVzW10gPSYgbmV3ICR0aGlzLT5mZWVkLT5jYXRlZ29yeV9jbGFzcygkdGhpcy0+c2FuaXRpemUoJGNhdGVnb3J5WydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCksIG51bGwsIG51bGwpOwoJCX0KCQlmb3JlYWNoICgoYXJyYXkpICR0aGlzLT5nZXRfaXRlbV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfRENfMTAsICdzdWJqZWN0JykgYXMgJGNhdGVnb3J5KQoJCXsKCQkJJGNhdGVnb3JpZXNbXSA9JiBuZXcgJHRoaXMtPmZlZWQtPmNhdGVnb3J5X2NsYXNzKCR0aGlzLT5zYW5pdGl6ZSgkY2F0ZWdvcnlbJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKSwgbnVsbCwgbnVsbCk7CgkJfQoKCQlpZiAoIWVtcHR5KCRjYXRlZ29yaWVzKSkKCQl7CgkJCXJldHVybiBTaW1wbGVQaWVfTWlzYzo6YXJyYXlfdW5pcXVlKCRjYXRlZ29yaWVzKTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCWZ1bmN0aW9uIGdldF9hdXRob3IoJGtleSA9IDApCgl7CgkJJGF1dGhvcnMgPSAkdGhpcy0+Z2V0X2F1dGhvcnMoKTsKCQlpZiAoaXNzZXQoJGF1dGhvcnNbJGtleV0pKQoJCXsKCQkJcmV0dXJuICRhdXRob3JzWyRrZXldOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJZnVuY3Rpb24gZ2V0X2NvbnRyaWJ1dG9yKCRrZXkgPSAwKQoJewoJCSRjb250cmlidXRvcnMgPSAkdGhpcy0+Z2V0X2NvbnRyaWJ1dG9ycygpOwoJCWlmIChpc3NldCgkY29udHJpYnV0b3JzWyRrZXldKSkKCQl7CgkJCXJldHVybiAkY29udHJpYnV0b3JzWyRrZXldOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJZnVuY3Rpb24gZ2V0X2NvbnRyaWJ1dG9ycygpCgl7CgkJJGNvbnRyaWJ1dG9ycyA9IGFycmF5KCk7CgkJZm9yZWFjaCAoKGFycmF5KSAkdGhpcy0+Z2V0X2l0ZW1fdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTAsICdjb250cmlidXRvcicpIGFzICRjb250cmlidXRvcikKCQl7CgkJCSRuYW1lID0gbnVsbDsKCQkJJHVyaSA9IG51bGw7CgkJCSRlbWFpbCA9IG51bGw7CgkJCWlmIChpc3NldCgkY29udHJpYnV0b3JbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzEwXVsnbmFtZSddWzBdWydkYXRhJ10pKQoJCQl7CgkJCQkkbmFtZSA9ICR0aGlzLT5zYW5pdGl6ZSgkY29udHJpYnV0b3JbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzEwXVsnbmFtZSddWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCX0KCQkJaWYgKGlzc2V0KCRjb250cmlidXRvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTBdWyd1cmknXVswXVsnZGF0YSddKSkKCQkJewoJCQkJJHVyaSA9ICR0aGlzLT5zYW5pdGl6ZSgkY29udHJpYnV0b3JbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzEwXVsndXJpJ11bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9JUkksICR0aGlzLT5nZXRfYmFzZSgkY29udHJpYnV0b3JbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzEwXVsndXJpJ11bMF0pKTsKCQkJfQoJCQlpZiAoaXNzZXQoJGNvbnRyaWJ1dG9yWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMF1bJ2VtYWlsJ11bMF1bJ2RhdGEnXSkpCgkJCXsKCQkJCSRlbWFpbCA9ICR0aGlzLT5zYW5pdGl6ZSgkY29udHJpYnV0b3JbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzEwXVsnZW1haWwnXVswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQl9CgkJCWlmICgkbmFtZSAhPT0gbnVsbCB8fCAkZW1haWwgIT09IG51bGwgfHwgJHVyaSAhPT0gbnVsbCkKCQkJewoJCQkJJGNvbnRyaWJ1dG9yc1tdID0mIG5ldyAkdGhpcy0+ZmVlZC0+YXV0aG9yX2NsYXNzKCRuYW1lLCAkdXJpLCAkZW1haWwpOwoJCQl9CgkJfQoJCWZvcmVhY2ggKChhcnJheSkgJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzAzLCAnY29udHJpYnV0b3InKSBhcyAkY29udHJpYnV0b3IpCgkJewoJCQkkbmFtZSA9IG51bGw7CgkJCSR1cmwgPSBudWxsOwoJCQkkZW1haWwgPSBudWxsOwoJCQlpZiAoaXNzZXQoJGNvbnRyaWJ1dG9yWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wM11bJ25hbWUnXVswXVsnZGF0YSddKSkKCQkJewoJCQkJJG5hbWUgPSAkdGhpcy0+c2FuaXRpemUoJGNvbnRyaWJ1dG9yWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wM11bJ25hbWUnXVswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQl9CgkJCWlmIChpc3NldCgkY29udHJpYnV0b3JbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzAzXVsndXJsJ11bMF1bJ2RhdGEnXSkpCgkJCXsKCQkJCSR1cmwgPSAkdGhpcy0+c2FuaXRpemUoJGNvbnRyaWJ1dG9yWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wM11bJ3VybCddWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfSVJJLCAkdGhpcy0+Z2V0X2Jhc2UoJGNvbnRyaWJ1dG9yWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wM11bJ3VybCddWzBdKSk7CgkJCX0KCQkJaWYgKGlzc2V0KCRjb250cmlidXRvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDNdWydlbWFpbCddWzBdWydkYXRhJ10pKQoJCQl7CgkJCQkkZW1haWwgPSAkdGhpcy0+c2FuaXRpemUoJGNvbnRyaWJ1dG9yWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wM11bJ2VtYWlsJ11bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJfQoJCQlpZiAoJG5hbWUgIT09IG51bGwgfHwgJGVtYWlsICE9PSBudWxsIHx8ICR1cmwgIT09IG51bGwpCgkJCXsKCQkJCSRjb250cmlidXRvcnNbXSA9JiBuZXcgJHRoaXMtPmZlZWQtPmF1dGhvcl9jbGFzcygkbmFtZSwgJHVybCwgJGVtYWlsKTsKCQkJfQoJCX0KCgkJaWYgKCFlbXB0eSgkY29udHJpYnV0b3JzKSkKCQl7CgkJCXJldHVybiBTaW1wbGVQaWVfTWlzYzo6YXJyYXlfdW5pcXVlKCRjb250cmlidXRvcnMpOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJLyoqCgkgKiBAdG9kbyBBdG9tIGluaGVyaXRhbmNlIChpdGVtIGF1dGhvciwgc291cmNlIGF1dGhvciwgZmVlZCBhdXRob3IpCgkgKi8KCWZ1bmN0aW9uIGdldF9hdXRob3JzKCkKCXsKCQkkYXV0aG9ycyA9IGFycmF5KCk7CgkJZm9yZWFjaCAoKGFycmF5KSAkdGhpcy0+Z2V0X2l0ZW1fdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTAsICdhdXRob3InKSBhcyAkYXV0aG9yKQoJCXsKCQkJJG5hbWUgPSBudWxsOwoJCQkkdXJpID0gbnVsbDsKCQkJJGVtYWlsID0gbnVsbDsKCQkJaWYgKGlzc2V0KCRhdXRob3JbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzEwXVsnbmFtZSddWzBdWydkYXRhJ10pKQoJCQl7CgkJCQkkbmFtZSA9ICR0aGlzLT5zYW5pdGl6ZSgkYXV0aG9yWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMF1bJ25hbWUnXVswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQl9CgkJCWlmIChpc3NldCgkYXV0aG9yWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMF1bJ3VyaSddWzBdWydkYXRhJ10pKQoJCQl7CgkJCQkkdXJpID0gJHRoaXMtPnNhbml0aXplKCRhdXRob3JbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzEwXVsndXJpJ11bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9JUkksICR0aGlzLT5nZXRfYmFzZSgkYXV0aG9yWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMF1bJ3VyaSddWzBdKSk7CgkJCX0KCQkJaWYgKGlzc2V0KCRhdXRob3JbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzEwXVsnZW1haWwnXVswXVsnZGF0YSddKSkKCQkJewoJCQkJJGVtYWlsID0gJHRoaXMtPnNhbml0aXplKCRhdXRob3JbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzEwXVsnZW1haWwnXVswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQl9CgkJCWlmICgkbmFtZSAhPT0gbnVsbCB8fCAkZW1haWwgIT09IG51bGwgfHwgJHVyaSAhPT0gbnVsbCkKCQkJewoJCQkJJGF1dGhvcnNbXSA9JiBuZXcgJHRoaXMtPmZlZWQtPmF1dGhvcl9jbGFzcygkbmFtZSwgJHVyaSwgJGVtYWlsKTsKCQkJfQoJCX0KCQlpZiAoJGF1dGhvciA9ICR0aGlzLT5nZXRfaXRlbV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wMywgJ2F1dGhvcicpKQoJCXsKCQkJJG5hbWUgPSBudWxsOwoJCQkkdXJsID0gbnVsbDsKCQkJJGVtYWlsID0gbnVsbDsKCQkJaWYgKGlzc2V0KCRhdXRob3JbMF1bJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzAzXVsnbmFtZSddWzBdWydkYXRhJ10pKQoJCQl7CgkJCQkkbmFtZSA9ICR0aGlzLT5zYW5pdGl6ZSgkYXV0aG9yWzBdWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wM11bJ25hbWUnXVswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQl9CgkJCWlmIChpc3NldCgkYXV0aG9yWzBdWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wM11bJ3VybCddWzBdWydkYXRhJ10pKQoJCQl7CgkJCQkkdXJsID0gJHRoaXMtPnNhbml0aXplKCRhdXRob3JbMF1bJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzAzXVsndXJsJ11bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9JUkksICR0aGlzLT5nZXRfYmFzZSgkYXV0aG9yWzBdWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wM11bJ3VybCddWzBdKSk7CgkJCX0KCQkJaWYgKGlzc2V0KCRhdXRob3JbMF1bJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzAzXVsnZW1haWwnXVswXVsnZGF0YSddKSkKCQkJewoJCQkJJGVtYWlsID0gJHRoaXMtPnNhbml0aXplKCRhdXRob3JbMF1bJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzAzXVsnZW1haWwnXVswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQl9CgkJCWlmICgkbmFtZSAhPT0gbnVsbCB8fCAkZW1haWwgIT09IG51bGwgfHwgJHVybCAhPT0gbnVsbCkKCQkJewoJCQkJJGF1dGhvcnNbXSA9JiBuZXcgJHRoaXMtPmZlZWQtPmF1dGhvcl9jbGFzcygkbmFtZSwgJHVybCwgJGVtYWlsKTsKCQkJfQoJCX0KCQlpZiAoJGF1dGhvciA9ICR0aGlzLT5nZXRfaXRlbV90YWdzKCcnLCAnYXV0aG9yJykpCgkJewoJCQkkYXV0aG9yc1tdID0mIG5ldyAkdGhpcy0+ZmVlZC0+YXV0aG9yX2NsYXNzKG51bGwsIG51bGwsICR0aGlzLT5zYW5pdGl6ZSgkYXV0aG9yWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCkpOwoJCX0KCQlmb3JlYWNoICgoYXJyYXkpICR0aGlzLT5nZXRfaXRlbV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfRENfMTEsICdjcmVhdG9yJykgYXMgJGF1dGhvcikKCQl7CgkJCSRhdXRob3JzW10gPSYgbmV3ICR0aGlzLT5mZWVkLT5hdXRob3JfY2xhc3MoJHRoaXMtPnNhbml0aXplKCRhdXRob3JbJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKSwgbnVsbCwgbnVsbCk7CgkJfQoJCWZvcmVhY2ggKChhcnJheSkgJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9EQ18xMCwgJ2NyZWF0b3InKSBhcyAkYXV0aG9yKQoJCXsKCQkJJGF1dGhvcnNbXSA9JiBuZXcgJHRoaXMtPmZlZWQtPmF1dGhvcl9jbGFzcygkdGhpcy0+c2FuaXRpemUoJGF1dGhvclsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpLCBudWxsLCBudWxsKTsKCQl9CgkJZm9yZWFjaCAoKGFycmF5KSAkdGhpcy0+Z2V0X2l0ZW1fdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0lUVU5FUywgJ2F1dGhvcicpIGFzICRhdXRob3IpCgkJewoJCQkkYXV0aG9yc1tdID0mIG5ldyAkdGhpcy0+ZmVlZC0+YXV0aG9yX2NsYXNzKCR0aGlzLT5zYW5pdGl6ZSgkYXV0aG9yWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCksIG51bGwsIG51bGwpOwoJCX0KCgkJaWYgKCFlbXB0eSgkYXV0aG9ycykpCgkJewoJCQlyZXR1cm4gU2ltcGxlUGllX01pc2M6OmFycmF5X3VuaXF1ZSgkYXV0aG9ycyk7CgkJfQoJCWVsc2VpZiAoKCRzb3VyY2UgPSAkdGhpcy0+Z2V0X3NvdXJjZSgpKSAmJiAoJGF1dGhvcnMgPSAkc291cmNlLT5nZXRfYXV0aG9ycygpKSkKCQl7CgkJCXJldHVybiAkYXV0aG9yczsKCQl9CgkJZWxzZWlmICgkYXV0aG9ycyA9ICR0aGlzLT5mZWVkLT5nZXRfYXV0aG9ycygpKQoJCXsKCQkJcmV0dXJuICRhdXRob3JzOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJZnVuY3Rpb24gZ2V0X2NvcHlyaWdodCgpCgl7CgkJaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2l0ZW1fdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTAsICdyaWdodHMnKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCBTaW1wbGVQaWVfTWlzYzo6YXRvbV8xMF9jb25zdHJ1Y3RfdHlwZSgkcmV0dXJuWzBdWydhdHRyaWJzJ10pLCAkdGhpcy0+Z2V0X2Jhc2UoJHJldHVyblswXSkpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2l0ZW1fdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0RDXzExLCAncmlnaHRzJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9EQ18xMCwgJ3JpZ2h0cycpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCglmdW5jdGlvbiBnZXRfZGF0ZSgkZGF0ZV9mb3JtYXQgPSAnaiBGIFksIGc6aSBhJykKCXsKCQlpZiAoIWlzc2V0KCR0aGlzLT5kYXRhWydkYXRlJ10pKQoJCXsKCQkJaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2l0ZW1fdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTAsICdwdWJsaXNoZWQnKSkKCQkJewoJCQkJJHRoaXMtPmRhdGFbJ2RhdGUnXVsncmF3J10gPSAkcmV0dXJuWzBdWydkYXRhJ107CgkJCX0KCQkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzEwLCAndXBkYXRlZCcpKQoJCQl7CgkJCQkkdGhpcy0+ZGF0YVsnZGF0ZSddWydyYXcnXSA9ICRyZXR1cm5bMF1bJ2RhdGEnXTsKCQkJfQoJCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2l0ZW1fdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDMsICdpc3N1ZWQnKSkKCQkJewoJCQkJJHRoaXMtPmRhdGFbJ2RhdGUnXVsncmF3J10gPSAkcmV0dXJuWzBdWydkYXRhJ107CgkJCX0KCQkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzAzLCAnY3JlYXRlZCcpKQoJCQl7CgkJCQkkdGhpcy0+ZGF0YVsnZGF0ZSddWydyYXcnXSA9ICRyZXR1cm5bMF1bJ2RhdGEnXTsKCQkJfQoJCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2l0ZW1fdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDMsICdtb2RpZmllZCcpKQoJCQl7CgkJCQkkdGhpcy0+ZGF0YVsnZGF0ZSddWydyYXcnXSA9ICRyZXR1cm5bMF1bJ2RhdGEnXTsKCQkJfQoJCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2l0ZW1fdGFncygnJywgJ3B1YkRhdGUnKSkKCQkJewoJCQkJJHRoaXMtPmRhdGFbJ2RhdGUnXVsncmF3J10gPSAkcmV0dXJuWzBdWydkYXRhJ107CgkJCX0KCQkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9EQ18xMSwgJ2RhdGUnKSkKCQkJewoJCQkJJHRoaXMtPmRhdGFbJ2RhdGUnXVsncmF3J10gPSAkcmV0dXJuWzBdWydkYXRhJ107CgkJCX0KCQkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9EQ18xMCwgJ2RhdGUnKSkKCQkJewoJCQkJJHRoaXMtPmRhdGFbJ2RhdGUnXVsncmF3J10gPSAkcmV0dXJuWzBdWydkYXRhJ107CgkJCX0KCgkJCWlmICghZW1wdHkoJHRoaXMtPmRhdGFbJ2RhdGUnXVsncmF3J10pKQoJCQl7CgkJCQkkcGFyc2VyID0gU2ltcGxlUGllX1BhcnNlX0RhdGU6OmdldCgpOwoJCQkJJHRoaXMtPmRhdGFbJ2RhdGUnXVsncGFyc2VkJ10gPSAkcGFyc2VyLT5wYXJzZSgkdGhpcy0+ZGF0YVsnZGF0ZSddWydyYXcnXSk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQkkdGhpcy0+ZGF0YVsnZGF0ZSddID0gbnVsbDsKCQkJfQoJCX0KCQlpZiAoJHRoaXMtPmRhdGFbJ2RhdGUnXSkKCQl7CgkJCSRkYXRlX2Zvcm1hdCA9IChzdHJpbmcpICRkYXRlX2Zvcm1hdDsKCQkJc3dpdGNoICgkZGF0ZV9mb3JtYXQpCgkJCXsKCQkJCWNhc2UgJyc6CgkJCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkdGhpcy0+ZGF0YVsnZGF0ZSddWydyYXcnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCgkJCQljYXNlICdVJzoKCQkJCQlyZXR1cm4gJHRoaXMtPmRhdGFbJ2RhdGUnXVsncGFyc2VkJ107CgoJCQkJZGVmYXVsdDoKCQkJCQlyZXR1cm4gZGF0ZSgkZGF0ZV9mb3JtYXQsICR0aGlzLT5kYXRhWydkYXRlJ11bJ3BhcnNlZCddKTsKCQkJfQoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJZnVuY3Rpb24gZ2V0X2xvY2FsX2RhdGUoJGRhdGVfZm9ybWF0ID0gJyVjJykKCXsKCQlpZiAoISRkYXRlX2Zvcm1hdCkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHRoaXMtPmdldF9kYXRlKCcnKSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQl9CgkJZWxzZWlmICgoJGRhdGUgPSAkdGhpcy0+Z2V0X2RhdGUoJ1UnKSkgIT09IG51bGwpCgkJewoJCQlyZXR1cm4gc3RyZnRpbWUoJGRhdGVfZm9ybWF0LCAkZGF0ZSk7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCglmdW5jdGlvbiBnZXRfcGVybWFsaW5rKCkKCXsKCQkkbGluayA9ICR0aGlzLT5nZXRfbGluaygpOwoJCSRlbmNsb3N1cmUgPSAkdGhpcy0+Z2V0X2VuY2xvc3VyZSgwKTsKCQlpZiAoJGxpbmsgIT09IG51bGwpCgkJewoJCQlyZXR1cm4gJGxpbms7CgkJfQoJCWVsc2VpZiAoJGVuY2xvc3VyZSAhPT0gbnVsbCkKCQl7CgkJCXJldHVybiAkZW5jbG9zdXJlLT5nZXRfbGluaygpOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJZnVuY3Rpb24gZ2V0X2xpbmsoJGtleSA9IDAsICRyZWwgPSAnYWx0ZXJuYXRlJykKCXsKCQkkbGlua3MgPSAkdGhpcy0+Z2V0X2xpbmtzKCRyZWwpOwoJCWlmICgkbGlua3NbJGtleV0gIT09IG51bGwpCgkJewoJCQlyZXR1cm4gJGxpbmtzWyRrZXldOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJZnVuY3Rpb24gZ2V0X2xpbmtzKCRyZWwgPSAnYWx0ZXJuYXRlJykKCXsKCQlpZiAoIWlzc2V0KCR0aGlzLT5kYXRhWydsaW5rcyddKSkKCQl7CgkJCSR0aGlzLT5kYXRhWydsaW5rcyddID0gYXJyYXkoKTsKCQkJZm9yZWFjaCAoKGFycmF5KSAkdGhpcy0+Z2V0X2l0ZW1fdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTAsICdsaW5rJykgYXMgJGxpbmspCgkJCXsKCQkJCWlmIChpc3NldCgkbGlua1snYXR0cmlicyddWycnXVsnaHJlZiddKSkKCQkJCXsKCQkJCQkkbGlua19yZWwgPSAoaXNzZXQoJGxpbmtbJ2F0dHJpYnMnXVsnJ11bJ3JlbCddKSkgPyAkbGlua1snYXR0cmlicyddWycnXVsncmVsJ10gOiAnYWx0ZXJuYXRlJzsKCQkJCQkkdGhpcy0+ZGF0YVsnbGlua3MnXVskbGlua19yZWxdW10gPSAkdGhpcy0+c2FuaXRpemUoJGxpbmtbJ2F0dHJpYnMnXVsnJ11bJ2hyZWYnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9JUkksICR0aGlzLT5nZXRfYmFzZSgkbGluaykpOwoKCQkJCX0KCQkJfQoJCQlmb3JlYWNoICgoYXJyYXkpICR0aGlzLT5nZXRfaXRlbV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wMywgJ2xpbmsnKSBhcyAkbGluaykKCQkJewoJCQkJaWYgKGlzc2V0KCRsaW5rWydhdHRyaWJzJ11bJyddWydocmVmJ10pKQoJCQkJewoJCQkJCSRsaW5rX3JlbCA9IChpc3NldCgkbGlua1snYXR0cmlicyddWycnXVsncmVsJ10pKSA/ICRsaW5rWydhdHRyaWJzJ11bJyddWydyZWwnXSA6ICdhbHRlcm5hdGUnOwoJCQkJCSR0aGlzLT5kYXRhWydsaW5rcyddWyRsaW5rX3JlbF1bXSA9ICR0aGlzLT5zYW5pdGl6ZSgkbGlua1snYXR0cmlicyddWycnXVsnaHJlZiddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSwgJHRoaXMtPmdldF9iYXNlKCRsaW5rKSk7CgkJCQl9CgkJCX0KCQkJaWYgKCRsaW5rcyA9ICR0aGlzLT5nZXRfaXRlbV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfUlNTXzEwLCAnbGluaycpKQoJCQl7CgkJCQkkdGhpcy0+ZGF0YVsnbGlua3MnXVsnYWx0ZXJuYXRlJ11bXSA9ICR0aGlzLT5zYW5pdGl6ZSgkbGlua3NbMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9JUkksICR0aGlzLT5nZXRfYmFzZSgkbGlua3NbMF0pKTsKCQkJfQoJCQlpZiAoJGxpbmtzID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9SU1NfMDkwLCAnbGluaycpKQoJCQl7CgkJCQkkdGhpcy0+ZGF0YVsnbGlua3MnXVsnYWx0ZXJuYXRlJ11bXSA9ICR0aGlzLT5zYW5pdGl6ZSgkbGlua3NbMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9JUkksICR0aGlzLT5nZXRfYmFzZSgkbGlua3NbMF0pKTsKCQkJfQoJCQlpZiAoJGxpbmtzID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoJycsICdsaW5rJykpCgkJCXsKCQkJCSR0aGlzLT5kYXRhWydsaW5rcyddWydhbHRlcm5hdGUnXVtdID0gJHRoaXMtPnNhbml0aXplKCRsaW5rc1swXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSwgJHRoaXMtPmdldF9iYXNlKCRsaW5rc1swXSkpOwoJCQl9CgkJCWlmICgkbGlua3MgPSAkdGhpcy0+Z2V0X2l0ZW1fdGFncygnJywgJ2d1aWQnKSkKCQkJewoJCQkJaWYgKCFpc3NldCgkbGlua3NbMF1bJ2F0dHJpYnMnXVsnJ11bJ2lzUGVybWFMaW5rJ10pIHx8IHN0cnRvbG93ZXIodHJpbSgkbGlua3NbMF1bJ2F0dHJpYnMnXVsnJ11bJ2lzUGVybWFMaW5rJ10pKSA9PSAndHJ1ZScpCgkJCQl7CgkJCQkJJHRoaXMtPmRhdGFbJ2xpbmtzJ11bJ2FsdGVybmF0ZSddW10gPSAkdGhpcy0+c2FuaXRpemUoJGxpbmtzWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfSVJJLCAkdGhpcy0+Z2V0X2Jhc2UoJGxpbmtzWzBdKSk7CgkJCQl9CgkJCX0KCgkJCSRrZXlzID0gYXJyYXlfa2V5cygkdGhpcy0+ZGF0YVsnbGlua3MnXSk7CgkJCWZvcmVhY2ggKCRrZXlzIGFzICRrZXkpCgkJCXsKCQkJCWlmIChTaW1wbGVQaWVfTWlzYzo6aXNfaXNlZ21lbnRfbnpfbmMoJGtleSkpCgkJCQl7CgkJCQkJaWYgKGlzc2V0KCR0aGlzLT5kYXRhWydsaW5rcyddW1NJTVBMRVBJRV9JQU5BX0xJTktfUkVMQVRJT05TX1JFR0lTVFJZIC4gJGtleV0pKQoJCQkJCXsKCQkJCQkJJHRoaXMtPmRhdGFbJ2xpbmtzJ11bU0lNUExFUElFX0lBTkFfTElOS19SRUxBVElPTlNfUkVHSVNUUlkgLiAka2V5XSA9IGFycmF5X21lcmdlKCR0aGlzLT5kYXRhWydsaW5rcyddWyRrZXldLCAkdGhpcy0+ZGF0YVsnbGlua3MnXVtTSU1QTEVQSUVfSUFOQV9MSU5LX1JFTEFUSU9OU19SRUdJU1RSWSAuICRrZXldKTsKCQkJCQkJJHRoaXMtPmRhdGFbJ2xpbmtzJ11bJGtleV0gPSYgJHRoaXMtPmRhdGFbJ2xpbmtzJ11bU0lNUExFUElFX0lBTkFfTElOS19SRUxBVElPTlNfUkVHSVNUUlkgLiAka2V5XTsKCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJJHRoaXMtPmRhdGFbJ2xpbmtzJ11bU0lNUExFUElFX0lBTkFfTElOS19SRUxBVElPTlNfUkVHSVNUUlkgLiAka2V5XSA9JiAkdGhpcy0+ZGF0YVsnbGlua3MnXVska2V5XTsKCQkJCQl9CgkJCQl9CgkJCQllbHNlaWYgKHN1YnN0cigka2V5LCAwLCA0MSkgPT0gU0lNUExFUElFX0lBTkFfTElOS19SRUxBVElPTlNfUkVHSVNUUlkpCgkJCQl7CgkJCQkJJHRoaXMtPmRhdGFbJ2xpbmtzJ11bc3Vic3RyKCRrZXksIDQxKV0gPSYgJHRoaXMtPmRhdGFbJ2xpbmtzJ11bJGtleV07CgkJCQl9CgkJCQkkdGhpcy0+ZGF0YVsnbGlua3MnXVska2V5XSA9IGFycmF5X3VuaXF1ZSgkdGhpcy0+ZGF0YVsnbGlua3MnXVska2V5XSk7CgkJCX0KCQl9CgkJaWYgKGlzc2V0KCR0aGlzLT5kYXRhWydsaW5rcyddWyRyZWxdKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+ZGF0YVsnbGlua3MnXVskcmVsXTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCS8qKgoJICogQHRvZG8gQWRkIGFiaWxpdHkgdG8gcHJlZmVyIG9uZSB0eXBlIG9mIGNvbnRlbnQgb3ZlciBhbm90aGVyIChpbiBhIG1lZGlhIGdyb3VwKS4KCSAqLwoJZnVuY3Rpb24gZ2V0X2VuY2xvc3VyZSgka2V5ID0gMCwgJHByZWZlciA9IG51bGwpCgl7CgkJJGVuY2xvc3VyZXMgPSAkdGhpcy0+Z2V0X2VuY2xvc3VyZXMoKTsKCQlpZiAoaXNzZXQoJGVuY2xvc3VyZXNbJGtleV0pKQoJCXsKCQkJcmV0dXJuICRlbmNsb3N1cmVzWyRrZXldOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJLyoqCgkgKiBHcmFicyBhbGwgYXZhaWxhYmxlIGVuY2xvc3VyZXMgKHBvZGNhc3RzLCBldGMuKQoJICoKCSAqIFN1cHBvcnRzIHRoZSA8ZW5jbG9zdXJlPiBSU1MgdGFnLCBhcyB3ZWxsIGFzIE1lZGlhIFJTUyBhbmQgaVR1bmVzIFJTUy4KCSAqCgkgKiBBdCB0aGlzIHBvaW50LCB3ZSdyZSBwcmV0dHkgbXVjaCBhc3N1bWluZyB0aGF0IGFsbCBlbmNsb3N1cmVzIGZvciBhbiBpdGVtIGFyZSB0aGUgc2FtZSBjb250ZW50LiAgQW55dGhpbmcgZWxzZSBpcyB0b28gY29tcGxpY2F0ZWQgdG8gcHJvcGVybHkgc3VwcG9ydC4KCSAqCgkgKiBAdG9kbyBBZGQgc3VwcG9ydCBmb3IgZW5kLXVzZXIgZGVmaW5lZCBzb3J0aW5nIG9mIGVuY2xvc3VyZXMgYnkgdHlwZS9oYW5kbGVyIChzbyB3ZSBjYW4gcHJlZmVyIHRoZSBmYXN0ZXItbG9hZGluZyBGTFYgb3ZlciBNUDQpLgoJICogQHRvZG8gSWYgYW4gZWxlbWVudCBleGlzdHMgYXQgYSBsZXZlbCwgYnV0IGl0J3MgdmFsdWUgaXMgZW1wdHksIHdlIHNob3VsZCBmYWxsIGJhY2sgdG8gdGhlIHZhbHVlIGZyb20gdGhlIHBhcmVudCAoaWYgaXQgZXhpc3RzKS4KCSAqLwoJZnVuY3Rpb24gZ2V0X2VuY2xvc3VyZXMoKQoJewoJCWlmICghaXNzZXQoJHRoaXMtPmRhdGFbJ2VuY2xvc3VyZXMnXSkpCgkJewoJCQkkdGhpcy0+ZGF0YVsnZW5jbG9zdXJlcyddID0gYXJyYXkoKTsKCgkJCS8vIEVsZW1lbnRzCgkJCSRjYXB0aW9uc19wYXJlbnQgPSBudWxsOwoJCQkkY2F0ZWdvcmllc19wYXJlbnQgPSBudWxsOwoJCQkkY29weXJpZ2h0c19wYXJlbnQgPSBudWxsOwoJCQkkY3JlZGl0c19wYXJlbnQgPSBudWxsOwoJCQkkZGVzY3JpcHRpb25fcGFyZW50ID0gbnVsbDsKCQkJJGR1cmF0aW9uX3BhcmVudCA9IG51bGw7CgkJCSRoYXNoZXNfcGFyZW50ID0gbnVsbDsKCQkJJGtleXdvcmRzX3BhcmVudCA9IG51bGw7CgkJCSRwbGF5ZXJfcGFyZW50ID0gbnVsbDsKCQkJJHJhdGluZ3NfcGFyZW50ID0gbnVsbDsKCQkJJHJlc3RyaWN0aW9uc19wYXJlbnQgPSBudWxsOwoJCQkkdGh1bWJuYWlsc19wYXJlbnQgPSBudWxsOwoJCQkkdGl0bGVfcGFyZW50ID0gbnVsbDsKCgkJCS8vIExldCdzIGRvIHRoZSBjaGFubmVsIGFuZCBpdGVtLWxldmVsIG9uZXMgZmlyc3QsIGFuZCBqdXN0IHJlLXVzZSB0aGVtIGlmIHdlIG5lZWQgdG8uCgkJCSRwYXJlbnQgPSAkdGhpcy0+Z2V0X2ZlZWQoKTsKCgkJCS8vIENBUFRJT05TCgkJCWlmICgkY2FwdGlvbnMgPSAkdGhpcy0+Z2V0X2l0ZW1fdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTLCAndGV4dCcpKQoJCQl7CgkJCQlmb3JlYWNoICgkY2FwdGlvbnMgYXMgJGNhcHRpb24pCgkJCQl7CgkJCQkJJGNhcHRpb25fdHlwZSA9IG51bGw7CgkJCQkJJGNhcHRpb25fbGFuZyA9IG51bGw7CgkJCQkJJGNhcHRpb25fc3RhcnRUaW1lID0gbnVsbDsKCQkJCQkkY2FwdGlvbl9lbmRUaW1lID0gbnVsbDsKCQkJCQkkY2FwdGlvbl90ZXh0ID0gbnVsbDsKCQkJCQlpZiAoaXNzZXQoJGNhcHRpb25bJ2F0dHJpYnMnXVsnJ11bJ3R5cGUnXSkpCgkJCQkJewoJCQkJCQkkY2FwdGlvbl90eXBlID0gJHRoaXMtPnNhbml0aXplKCRjYXB0aW9uWydhdHRyaWJzJ11bJyddWyd0eXBlJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJfQoJCQkJCWlmIChpc3NldCgkY2FwdGlvblsnYXR0cmlicyddWycnXVsnbGFuZyddKSkKCQkJCQl7CgkJCQkJCSRjYXB0aW9uX2xhbmcgPSAkdGhpcy0+c2FuaXRpemUoJGNhcHRpb25bJ2F0dHJpYnMnXVsnJ11bJ2xhbmcnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQl9CgkJCQkJaWYgKGlzc2V0KCRjYXB0aW9uWydhdHRyaWJzJ11bJyddWydzdGFydCddKSkKCQkJCQl7CgkJCQkJCSRjYXB0aW9uX3N0YXJ0VGltZSA9ICR0aGlzLT5zYW5pdGl6ZSgkY2FwdGlvblsnYXR0cmlicyddWycnXVsnc3RhcnQnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQl9CgkJCQkJaWYgKGlzc2V0KCRjYXB0aW9uWydhdHRyaWJzJ11bJyddWydlbmQnXSkpCgkJCQkJewoJCQkJCQkkY2FwdGlvbl9lbmRUaW1lID0gJHRoaXMtPnNhbml0aXplKCRjYXB0aW9uWydhdHRyaWJzJ11bJyddWydlbmQnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQl9CgkJCQkJaWYgKGlzc2V0KCRjYXB0aW9uWydkYXRhJ10pKQoJCQkJCXsKCQkJCQkJJGNhcHRpb25fdGV4dCA9ICR0aGlzLT5zYW5pdGl6ZSgkY2FwdGlvblsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCX0KCQkJCQkkY2FwdGlvbnNfcGFyZW50W10gPSYgbmV3ICR0aGlzLT5mZWVkLT5jYXB0aW9uX2NsYXNzKCRjYXB0aW9uX3R5cGUsICRjYXB0aW9uX2xhbmcsICRjYXB0aW9uX3N0YXJ0VGltZSwgJGNhcHRpb25fZW5kVGltZSwgJGNhcHRpb25fdGV4dCk7CgkJCQl9CgkJCX0KCQkJZWxzZWlmICgkY2FwdGlvbnMgPSAkcGFyZW50LT5nZXRfY2hhbm5lbF90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1MsICd0ZXh0JykpCgkJCXsKCQkJCWZvcmVhY2ggKCRjYXB0aW9ucyBhcyAkY2FwdGlvbikKCQkJCXsKCQkJCQkkY2FwdGlvbl90eXBlID0gbnVsbDsKCQkJCQkkY2FwdGlvbl9sYW5nID0gbnVsbDsKCQkJCQkkY2FwdGlvbl9zdGFydFRpbWUgPSBudWxsOwoJCQkJCSRjYXB0aW9uX2VuZFRpbWUgPSBudWxsOwoJCQkJCSRjYXB0aW9uX3RleHQgPSBudWxsOwoJCQkJCWlmIChpc3NldCgkY2FwdGlvblsnYXR0cmlicyddWycnXVsndHlwZSddKSkKCQkJCQl7CgkJCQkJCSRjYXB0aW9uX3R5cGUgPSAkdGhpcy0+c2FuaXRpemUoJGNhcHRpb25bJ2F0dHJpYnMnXVsnJ11bJ3R5cGUnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQl9CgkJCQkJaWYgKGlzc2V0KCRjYXB0aW9uWydhdHRyaWJzJ11bJyddWydsYW5nJ10pKQoJCQkJCXsKCQkJCQkJJGNhcHRpb25fbGFuZyA9ICR0aGlzLT5zYW5pdGl6ZSgkY2FwdGlvblsnYXR0cmlicyddWycnXVsnbGFuZyddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCX0KCQkJCQlpZiAoaXNzZXQoJGNhcHRpb25bJ2F0dHJpYnMnXVsnJ11bJ3N0YXJ0J10pKQoJCQkJCXsKCQkJCQkJJGNhcHRpb25fc3RhcnRUaW1lID0gJHRoaXMtPnNhbml0aXplKCRjYXB0aW9uWydhdHRyaWJzJ11bJyddWydzdGFydCddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCX0KCQkJCQlpZiAoaXNzZXQoJGNhcHRpb25bJ2F0dHJpYnMnXVsnJ11bJ2VuZCddKSkKCQkJCQl7CgkJCQkJCSRjYXB0aW9uX2VuZFRpbWUgPSAkdGhpcy0+c2FuaXRpemUoJGNhcHRpb25bJ2F0dHJpYnMnXVsnJ11bJ2VuZCddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCX0KCQkJCQlpZiAoaXNzZXQoJGNhcHRpb25bJ2RhdGEnXSkpCgkJCQkJewoJCQkJCQkkY2FwdGlvbl90ZXh0ID0gJHRoaXMtPnNhbml0aXplKCRjYXB0aW9uWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJfQoJCQkJCSRjYXB0aW9uc19wYXJlbnRbXSA9JiBuZXcgJHRoaXMtPmZlZWQtPmNhcHRpb25fY2xhc3MoJGNhcHRpb25fdHlwZSwgJGNhcHRpb25fbGFuZywgJGNhcHRpb25fc3RhcnRUaW1lLCAkY2FwdGlvbl9lbmRUaW1lLCAkY2FwdGlvbl90ZXh0KTsKCQkJCX0KCQkJfQoJCQlpZiAoaXNfYXJyYXkoJGNhcHRpb25zX3BhcmVudCkpCgkJCXsKCQkJCSRjYXB0aW9uc19wYXJlbnQgPSBhcnJheV92YWx1ZXMoU2ltcGxlUGllX01pc2M6OmFycmF5X3VuaXF1ZSgkY2FwdGlvbnNfcGFyZW50KSk7CgkJCX0KCgkJCS8vIENBVEVHT1JJRVMKCQkJZm9yZWFjaCAoKGFycmF5KSAkdGhpcy0+Z2V0X2l0ZW1fdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTLCAnY2F0ZWdvcnknKSBhcyAkY2F0ZWdvcnkpCgkJCXsKCQkJCSR0ZXJtID0gbnVsbDsKCQkJCSRzY2hlbWUgPSBudWxsOwoJCQkJJGxhYmVsID0gbnVsbDsKCQkJCWlmIChpc3NldCgkY2F0ZWdvcnlbJ2RhdGEnXSkpCgkJCQl7CgkJCQkJJHRlcm0gPSAkdGhpcy0+c2FuaXRpemUoJGNhdGVnb3J5WydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQl9CgkJCQlpZiAoaXNzZXQoJGNhdGVnb3J5WydhdHRyaWJzJ11bJyddWydzY2hlbWUnXSkpCgkJCQl7CgkJCQkJJHNjaGVtZSA9ICR0aGlzLT5zYW5pdGl6ZSgkY2F0ZWdvcnlbJ2F0dHJpYnMnXVsnJ11bJ3NjaGVtZSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCSRzY2hlbWUgPSAnaHR0cDovL3NlYXJjaC55YWhvby5jb20vbXJzcy9jYXRlZ29yeV9zY2hlbWEnOwoJCQkJfQoJCQkJaWYgKGlzc2V0KCRjYXRlZ29yeVsnYXR0cmlicyddWycnXVsnbGFiZWwnXSkpCgkJCQl7CgkJCQkJJGxhYmVsID0gJHRoaXMtPnNhbml0aXplKCRjYXRlZ29yeVsnYXR0cmlicyddWycnXVsnbGFiZWwnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCX0KCQkJCSRjYXRlZ29yaWVzX3BhcmVudFtdID0mIG5ldyAkdGhpcy0+ZmVlZC0+Y2F0ZWdvcnlfY2xhc3MoJHRlcm0sICRzY2hlbWUsICRsYWJlbCk7CgkJCX0KCQkJZm9yZWFjaCAoKGFycmF5KSAkcGFyZW50LT5nZXRfY2hhbm5lbF90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1MsICdjYXRlZ29yeScpIGFzICRjYXRlZ29yeSkKCQkJewoJCQkJJHRlcm0gPSBudWxsOwoJCQkJJHNjaGVtZSA9IG51bGw7CgkJCQkkbGFiZWwgPSBudWxsOwoJCQkJaWYgKGlzc2V0KCRjYXRlZ29yeVsnZGF0YSddKSkKCQkJCXsKCQkJCQkkdGVybSA9ICR0aGlzLT5zYW5pdGl6ZSgkY2F0ZWdvcnlbJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCX0KCQkJCWlmIChpc3NldCgkY2F0ZWdvcnlbJ2F0dHJpYnMnXVsnJ11bJ3NjaGVtZSddKSkKCQkJCXsKCQkJCQkkc2NoZW1lID0gJHRoaXMtPnNhbml0aXplKCRjYXRlZ29yeVsnYXR0cmlicyddWycnXVsnc2NoZW1lJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJJHNjaGVtZSA9ICdodHRwOi8vc2VhcmNoLnlhaG9vLmNvbS9tcnNzL2NhdGVnb3J5X3NjaGVtYSc7CgkJCQl9CgkJCQlpZiAoaXNzZXQoJGNhdGVnb3J5WydhdHRyaWJzJ11bJyddWydsYWJlbCddKSkKCQkJCXsKCQkJCQkkbGFiZWwgPSAkdGhpcy0+c2FuaXRpemUoJGNhdGVnb3J5WydhdHRyaWJzJ11bJyddWydsYWJlbCddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJfQoJCQkJJGNhdGVnb3JpZXNfcGFyZW50W10gPSYgbmV3ICR0aGlzLT5mZWVkLT5jYXRlZ29yeV9jbGFzcygkdGVybSwgJHNjaGVtZSwgJGxhYmVsKTsKCQkJfQoJCQlmb3JlYWNoICgoYXJyYXkpICRwYXJlbnQtPmdldF9jaGFubmVsX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9JVFVORVMsICdjYXRlZ29yeScpIGFzICRjYXRlZ29yeSkKCQkJewoJCQkJJHRlcm0gPSBudWxsOwoJCQkJJHNjaGVtZSA9ICdodHRwOi8vd3d3Lml0dW5lcy5jb20vZHRkcy9wb2RjYXN0LTEuMC5kdGQnOwoJCQkJJGxhYmVsID0gbnVsbDsKCQkJCWlmIChpc3NldCgkY2F0ZWdvcnlbJ2F0dHJpYnMnXVsnJ11bJ3RleHQnXSkpCgkJCQl7CgkJCQkJJGxhYmVsID0gJHRoaXMtPnNhbml0aXplKCRjYXRlZ29yeVsnYXR0cmlicyddWycnXVsndGV4dCddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJfQoJCQkJJGNhdGVnb3JpZXNfcGFyZW50W10gPSYgbmV3ICR0aGlzLT5mZWVkLT5jYXRlZ29yeV9jbGFzcygkdGVybSwgJHNjaGVtZSwgJGxhYmVsKTsKCgkJCQlpZiAoaXNzZXQoJGNhdGVnb3J5WydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfSVRVTkVTXVsnY2F0ZWdvcnknXSkpCgkJCQl7CgkJCQkJZm9yZWFjaCAoKGFycmF5KSAkY2F0ZWdvcnlbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9JVFVORVNdWydjYXRlZ29yeSddIGFzICRzdWJjYXRlZ29yeSkKCQkJCQl7CgkJCQkJCWlmIChpc3NldCgkc3ViY2F0ZWdvcnlbJ2F0dHJpYnMnXVsnJ11bJ3RleHQnXSkpCgkJCQkJCXsKCQkJCQkJCSRsYWJlbCA9ICR0aGlzLT5zYW5pdGl6ZSgkc3ViY2F0ZWdvcnlbJ2F0dHJpYnMnXVsnJ11bJ3RleHQnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJfQoJCQkJCQkkY2F0ZWdvcmllc19wYXJlbnRbXSA9JiBuZXcgJHRoaXMtPmZlZWQtPmNhdGVnb3J5X2NsYXNzKCR0ZXJtLCAkc2NoZW1lLCAkbGFiZWwpOwoJCQkJCX0KCQkJCX0KCQkJfQoJCQlpZiAoaXNfYXJyYXkoJGNhdGVnb3JpZXNfcGFyZW50KSkKCQkJewoJCQkJJGNhdGVnb3JpZXNfcGFyZW50ID0gYXJyYXlfdmFsdWVzKFNpbXBsZVBpZV9NaXNjOjphcnJheV91bmlxdWUoJGNhdGVnb3JpZXNfcGFyZW50KSk7CgkJCX0KCgkJCS8vIENPUFlSSUdIVAoJCQlpZiAoJGNvcHlyaWdodCA9ICR0aGlzLT5nZXRfaXRlbV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1MsICdjb3B5cmlnaHQnKSkKCQkJewoJCQkJJGNvcHlyaWdodF91cmwgPSBudWxsOwoJCQkJJGNvcHlyaWdodF9sYWJlbCA9IG51bGw7CgkJCQlpZiAoaXNzZXQoJGNvcHlyaWdodFswXVsnYXR0cmlicyddWycnXVsndXJsJ10pKQoJCQkJewoJCQkJCSRjb3B5cmlnaHRfdXJsID0gJHRoaXMtPnNhbml0aXplKCRjb3B5cmlnaHRbMF1bJ2F0dHJpYnMnXVsnJ11bJ3VybCddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJfQoJCQkJaWYgKGlzc2V0KCRjb3B5cmlnaHRbMF1bJ2RhdGEnXSkpCgkJCQl7CgkJCQkJJGNvcHlyaWdodF9sYWJlbCA9ICR0aGlzLT5zYW5pdGl6ZSgkY29weXJpZ2h0WzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQl9CgkJCQkkY29weXJpZ2h0c19wYXJlbnQgPSYgbmV3ICR0aGlzLT5mZWVkLT5jb3B5cmlnaHRfY2xhc3MoJGNvcHlyaWdodF91cmwsICRjb3B5cmlnaHRfbGFiZWwpOwoJCQl9CgkJCWVsc2VpZiAoJGNvcHlyaWdodCA9ICRwYXJlbnQtPmdldF9jaGFubmVsX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTUywgJ2NvcHlyaWdodCcpKQoJCQl7CgkJCQkkY29weXJpZ2h0X3VybCA9IG51bGw7CgkJCQkkY29weXJpZ2h0X2xhYmVsID0gbnVsbDsKCQkJCWlmIChpc3NldCgkY29weXJpZ2h0WzBdWydhdHRyaWJzJ11bJyddWyd1cmwnXSkpCgkJCQl7CgkJCQkJJGNvcHlyaWdodF91cmwgPSAkdGhpcy0+c2FuaXRpemUoJGNvcHlyaWdodFswXVsnYXR0cmlicyddWycnXVsndXJsJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQl9CgkJCQlpZiAoaXNzZXQoJGNvcHlyaWdodFswXVsnZGF0YSddKSkKCQkJCXsKCQkJCQkkY29weXJpZ2h0X2xhYmVsID0gJHRoaXMtPnNhbml0aXplKCRjb3B5cmlnaHRbMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCX0KCQkJCSRjb3B5cmlnaHRzX3BhcmVudCA9JiBuZXcgJHRoaXMtPmZlZWQtPmNvcHlyaWdodF9jbGFzcygkY29weXJpZ2h0X3VybCwgJGNvcHlyaWdodF9sYWJlbCk7CgkJCX0KCgkJCS8vIENSRURJVFMKCQkJaWYgKCRjcmVkaXRzID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTUywgJ2NyZWRpdCcpKQoJCQl7CgkJCQlmb3JlYWNoICgkY3JlZGl0cyBhcyAkY3JlZGl0KQoJCQkJewoJCQkJCSRjcmVkaXRfcm9sZSA9IG51bGw7CgkJCQkJJGNyZWRpdF9zY2hlbWUgPSBudWxsOwoJCQkJCSRjcmVkaXRfbmFtZSA9IG51bGw7CgkJCQkJaWYgKGlzc2V0KCRjcmVkaXRbJ2F0dHJpYnMnXVsnJ11bJ3JvbGUnXSkpCgkJCQkJewoJCQkJCQkkY3JlZGl0X3JvbGUgPSAkdGhpcy0+c2FuaXRpemUoJGNyZWRpdFsnYXR0cmlicyddWycnXVsncm9sZSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCX0KCQkJCQlpZiAoaXNzZXQoJGNyZWRpdFsnYXR0cmlicyddWycnXVsnc2NoZW1lJ10pKQoJCQkJCXsKCQkJCQkJJGNyZWRpdF9zY2hlbWUgPSAkdGhpcy0+c2FuaXRpemUoJGNyZWRpdFsnYXR0cmlicyddWycnXVsnc2NoZW1lJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJfQoJCQkJCWVsc2UKCQkJCQl7CgkJCQkJCSRjcmVkaXRfc2NoZW1lID0gJ3VybjplYnUnOwoJCQkJCX0KCQkJCQlpZiAoaXNzZXQoJGNyZWRpdFsnZGF0YSddKSkKCQkJCQl7CgkJCQkJCSRjcmVkaXRfbmFtZSA9ICR0aGlzLT5zYW5pdGl6ZSgkY3JlZGl0WydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJfQoJCQkJCSRjcmVkaXRzX3BhcmVudFtdID0mIG5ldyAkdGhpcy0+ZmVlZC0+Y3JlZGl0X2NsYXNzKCRjcmVkaXRfcm9sZSwgJGNyZWRpdF9zY2hlbWUsICRjcmVkaXRfbmFtZSk7CgkJCQl9CgkJCX0KCQkJZWxzZWlmICgkY3JlZGl0cyA9ICRwYXJlbnQtPmdldF9jaGFubmVsX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTUywgJ2NyZWRpdCcpKQoJCQl7CgkJCQlmb3JlYWNoICgkY3JlZGl0cyBhcyAkY3JlZGl0KQoJCQkJewoJCQkJCSRjcmVkaXRfcm9sZSA9IG51bGw7CgkJCQkJJGNyZWRpdF9zY2hlbWUgPSBudWxsOwoJCQkJCSRjcmVkaXRfbmFtZSA9IG51bGw7CgkJCQkJaWYgKGlzc2V0KCRjcmVkaXRbJ2F0dHJpYnMnXVsnJ11bJ3JvbGUnXSkpCgkJCQkJewoJCQkJCQkkY3JlZGl0X3JvbGUgPSAkdGhpcy0+c2FuaXRpemUoJGNyZWRpdFsnYXR0cmlicyddWycnXVsncm9sZSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCX0KCQkJCQlpZiAoaXNzZXQoJGNyZWRpdFsnYXR0cmlicyddWycnXVsnc2NoZW1lJ10pKQoJCQkJCXsKCQkJCQkJJGNyZWRpdF9zY2hlbWUgPSAkdGhpcy0+c2FuaXRpemUoJGNyZWRpdFsnYXR0cmlicyddWycnXVsnc2NoZW1lJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJfQoJCQkJCWVsc2UKCQkJCQl7CgkJCQkJCSRjcmVkaXRfc2NoZW1lID0gJ3VybjplYnUnOwoJCQkJCX0KCQkJCQlpZiAoaXNzZXQoJGNyZWRpdFsnZGF0YSddKSkKCQkJCQl7CgkJCQkJCSRjcmVkaXRfbmFtZSA9ICR0aGlzLT5zYW5pdGl6ZSgkY3JlZGl0WydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJfQoJCQkJCSRjcmVkaXRzX3BhcmVudFtdID0mIG5ldyAkdGhpcy0+ZmVlZC0+Y3JlZGl0X2NsYXNzKCRjcmVkaXRfcm9sZSwgJGNyZWRpdF9zY2hlbWUsICRjcmVkaXRfbmFtZSk7CgkJCQl9CgkJCX0KCQkJaWYgKGlzX2FycmF5KCRjcmVkaXRzX3BhcmVudCkpCgkJCXsKCQkJCSRjcmVkaXRzX3BhcmVudCA9IGFycmF5X3ZhbHVlcyhTaW1wbGVQaWVfTWlzYzo6YXJyYXlfdW5pcXVlKCRjcmVkaXRzX3BhcmVudCkpOwoJCQl9CgoJCQkvLyBERVNDUklQVElPTgoJCQlpZiAoJGRlc2NyaXB0aW9uX3BhcmVudCA9ICR0aGlzLT5nZXRfaXRlbV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1MsICdkZXNjcmlwdGlvbicpKQoJCQl7CgkJCQlpZiAoaXNzZXQoJGRlc2NyaXB0aW9uX3BhcmVudFswXVsnZGF0YSddKSkKCQkJCXsKCQkJCQkkZGVzY3JpcHRpb25fcGFyZW50ID0gJHRoaXMtPnNhbml0aXplKCRkZXNjcmlwdGlvbl9wYXJlbnRbMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCX0KCQkJfQoJCQllbHNlaWYgKCRkZXNjcmlwdGlvbl9wYXJlbnQgPSAkcGFyZW50LT5nZXRfY2hhbm5lbF90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1MsICdkZXNjcmlwdGlvbicpKQoJCQl7CgkJCQlpZiAoaXNzZXQoJGRlc2NyaXB0aW9uX3BhcmVudFswXVsnZGF0YSddKSkKCQkJCXsKCQkJCQkkZGVzY3JpcHRpb25fcGFyZW50ID0gJHRoaXMtPnNhbml0aXplKCRkZXNjcmlwdGlvbl9wYXJlbnRbMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCX0KCQkJfQoKCQkJLy8gRFVSQVRJT04KCQkJaWYgKCRkdXJhdGlvbl9wYXJlbnQgPSAkdGhpcy0+Z2V0X2l0ZW1fdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0lUVU5FUywgJ2R1cmF0aW9uJykpCgkJCXsKCQkJCSRzZWNvbmRzID0gbnVsbDsKCQkJCSRtaW51dGVzID0gbnVsbDsKCQkJCSRob3VycyA9IG51bGw7CgkJCQlpZiAoaXNzZXQoJGR1cmF0aW9uX3BhcmVudFswXVsnZGF0YSddKSkKCQkJCXsKCQkJCQkkdGVtcCA9IGV4cGxvZGUoJzonLCAkdGhpcy0+c2FuaXRpemUoJGR1cmF0aW9uX3BhcmVudFswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpKTsKCQkJCQlpZiAoc2l6ZW9mKCR0ZW1wKSA+IDApCgkJCQkJewoJCQkJCQkoaW50KSAkc2Vjb25kcyA9IGFycmF5X3BvcCgkdGVtcCk7CgkJCQkJfQoJCQkJCWlmIChzaXplb2YoJHRlbXApID4gMCkKCQkJCQl7CgkJCQkJCShpbnQpICRtaW51dGVzID0gYXJyYXlfcG9wKCR0ZW1wKTsKCQkJCQkJJHNlY29uZHMgKz0gJG1pbnV0ZXMgKiA2MDsKCQkJCQl9CgkJCQkJaWYgKHNpemVvZigkdGVtcCkgPiAwKQoJCQkJCXsKCQkJCQkJKGludCkgJGhvdXJzID0gYXJyYXlfcG9wKCR0ZW1wKTsKCQkJCQkJJHNlY29uZHMgKz0gJGhvdXJzICogMzYwMDsKCQkJCQl9CgkJCQkJdW5zZXQoJHRlbXApOwoJCQkJCSRkdXJhdGlvbl9wYXJlbnQgPSAkc2Vjb25kczsKCQkJCX0KCQkJfQoKCQkJLy8gSEFTSEVTCgkJCWlmICgkaGFzaGVzX2l0ZXJhdG9yID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTUywgJ2hhc2gnKSkKCQkJewoJCQkJZm9yZWFjaCAoJGhhc2hlc19pdGVyYXRvciBhcyAkaGFzaCkKCQkJCXsKCQkJCQkkdmFsdWUgPSBudWxsOwoJCQkJCSRhbGdvID0gbnVsbDsKCQkJCQlpZiAoaXNzZXQoJGhhc2hbJ2RhdGEnXSkpCgkJCQkJewoJCQkJCQkkdmFsdWUgPSAkdGhpcy0+c2FuaXRpemUoJGhhc2hbJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQl9CgkJCQkJaWYgKGlzc2V0KCRoYXNoWydhdHRyaWJzJ11bJyddWydhbGdvJ10pKQoJCQkJCXsKCQkJCQkJJGFsZ28gPSAkdGhpcy0+c2FuaXRpemUoJGhhc2hbJ2F0dHJpYnMnXVsnJ11bJ2FsZ28nXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJJGFsZ28gPSAnbWQ1JzsKCQkJCQl9CgkJCQkJJGhhc2hlc19wYXJlbnRbXSA9ICRhbGdvLic6Jy4kdmFsdWU7CgkJCQl9CgkJCX0KCQkJZWxzZWlmICgkaGFzaGVzX2l0ZXJhdG9yID0gJHBhcmVudC0+Z2V0X2NoYW5uZWxfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTLCAnaGFzaCcpKQoJCQl7CgkJCQlmb3JlYWNoICgkaGFzaGVzX2l0ZXJhdG9yIGFzICRoYXNoKQoJCQkJewoJCQkJCSR2YWx1ZSA9IG51bGw7CgkJCQkJJGFsZ28gPSBudWxsOwoJCQkJCWlmIChpc3NldCgkaGFzaFsnZGF0YSddKSkKCQkJCQl7CgkJCQkJCSR2YWx1ZSA9ICR0aGlzLT5zYW5pdGl6ZSgkaGFzaFsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCX0KCQkJCQlpZiAoaXNzZXQoJGhhc2hbJ2F0dHJpYnMnXVsnJ11bJ2FsZ28nXSkpCgkJCQkJewoJCQkJCQkkYWxnbyA9ICR0aGlzLT5zYW5pdGl6ZSgkaGFzaFsnYXR0cmlicyddWycnXVsnYWxnbyddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCX0KCQkJCQllbHNlCgkJCQkJewoJCQkJCQkkYWxnbyA9ICdtZDUnOwoJCQkJCX0KCQkJCQkkaGFzaGVzX3BhcmVudFtdID0gJGFsZ28uJzonLiR2YWx1ZTsKCQkJCX0KCQkJfQoJCQlpZiAoaXNfYXJyYXkoJGhhc2hlc19wYXJlbnQpKQoJCQl7CgkJCQkkaGFzaGVzX3BhcmVudCA9IGFycmF5X3ZhbHVlcyhTaW1wbGVQaWVfTWlzYzo6YXJyYXlfdW5pcXVlKCRoYXNoZXNfcGFyZW50KSk7CgkJCX0KCgkJCS8vIEtFWVdPUkRTCgkJCWlmICgka2V5d29yZHMgPSAkdGhpcy0+Z2V0X2l0ZW1fdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTLCAna2V5d29yZHMnKSkKCQkJewoJCQkJaWYgKGlzc2V0KCRrZXl3b3Jkc1swXVsnZGF0YSddKSkKCQkJCXsKCQkJCQkkdGVtcCA9IGV4cGxvZGUoJywnLCAkdGhpcy0+c2FuaXRpemUoJGtleXdvcmRzWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCkpOwoJCQkJCWZvcmVhY2ggKCR0ZW1wIGFzICR3b3JkKQoJCQkJCXsKCQkJCQkJJGtleXdvcmRzX3BhcmVudFtdID0gdHJpbSgkd29yZCk7CgkJCQkJfQoJCQkJfQoJCQkJdW5zZXQoJHRlbXApOwoJCQl9CgkJCWVsc2VpZiAoJGtleXdvcmRzID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9JVFVORVMsICdrZXl3b3JkcycpKQoJCQl7CgkJCQlpZiAoaXNzZXQoJGtleXdvcmRzWzBdWydkYXRhJ10pKQoJCQkJewoJCQkJCSR0ZW1wID0gZXhwbG9kZSgnLCcsICR0aGlzLT5zYW5pdGl6ZSgka2V5d29yZHNbMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKSk7CgkJCQkJZm9yZWFjaCAoJHRlbXAgYXMgJHdvcmQpCgkJCQkJewoJCQkJCQkka2V5d29yZHNfcGFyZW50W10gPSB0cmltKCR3b3JkKTsKCQkJCQl9CgkJCQl9CgkJCQl1bnNldCgkdGVtcCk7CgkJCX0KCQkJZWxzZWlmICgka2V5d29yZHMgPSAkcGFyZW50LT5nZXRfY2hhbm5lbF90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1MsICdrZXl3b3JkcycpKQoJCQl7CgkJCQlpZiAoaXNzZXQoJGtleXdvcmRzWzBdWydkYXRhJ10pKQoJCQkJewoJCQkJCSR0ZW1wID0gZXhwbG9kZSgnLCcsICR0aGlzLT5zYW5pdGl6ZSgka2V5d29yZHNbMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKSk7CgkJCQkJZm9yZWFjaCAoJHRlbXAgYXMgJHdvcmQpCgkJCQkJewoJCQkJCQkka2V5d29yZHNfcGFyZW50W10gPSB0cmltKCR3b3JkKTsKCQkJCQl9CgkJCQl9CgkJCQl1bnNldCgkdGVtcCk7CgkJCX0KCQkJZWxzZWlmICgka2V5d29yZHMgPSAkcGFyZW50LT5nZXRfY2hhbm5lbF90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfSVRVTkVTLCAna2V5d29yZHMnKSkKCQkJewoJCQkJaWYgKGlzc2V0KCRrZXl3b3Jkc1swXVsnZGF0YSddKSkKCQkJCXsKCQkJCQkkdGVtcCA9IGV4cGxvZGUoJywnLCAkdGhpcy0+c2FuaXRpemUoJGtleXdvcmRzWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCkpOwoJCQkJCWZvcmVhY2ggKCR0ZW1wIGFzICR3b3JkKQoJCQkJCXsKCQkJCQkJJGtleXdvcmRzX3BhcmVudFtdID0gdHJpbSgkd29yZCk7CgkJCQkJfQoJCQkJfQoJCQkJdW5zZXQoJHRlbXApOwoJCQl9CgkJCWlmIChpc19hcnJheSgka2V5d29yZHNfcGFyZW50KSkKCQkJewoJCQkJJGtleXdvcmRzX3BhcmVudCA9IGFycmF5X3ZhbHVlcyhTaW1wbGVQaWVfTWlzYzo6YXJyYXlfdW5pcXVlKCRrZXl3b3Jkc19wYXJlbnQpKTsKCQkJfQoKCQkJLy8gUExBWUVSCgkJCWlmICgkcGxheWVyX3BhcmVudCA9ICR0aGlzLT5nZXRfaXRlbV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1MsICdwbGF5ZXInKSkKCQkJewoJCQkJaWYgKGlzc2V0KCRwbGF5ZXJfcGFyZW50WzBdWydhdHRyaWJzJ11bJyddWyd1cmwnXSkpCgkJCQl7CgkJCQkJJHBsYXllcl9wYXJlbnQgPSAkdGhpcy0+c2FuaXRpemUoJHBsYXllcl9wYXJlbnRbMF1bJ2F0dHJpYnMnXVsnJ11bJ3VybCddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSk7CgkJCQl9CgkJCX0KCQkJZWxzZWlmICgkcGxheWVyX3BhcmVudCA9ICRwYXJlbnQtPmdldF9jaGFubmVsX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTUywgJ3BsYXllcicpKQoJCQl7CgkJCQlpZiAoaXNzZXQoJHBsYXllcl9wYXJlbnRbMF1bJ2F0dHJpYnMnXVsnJ11bJ3VybCddKSkKCQkJCXsKCQkJCQkkcGxheWVyX3BhcmVudCA9ICR0aGlzLT5zYW5pdGl6ZSgkcGxheWVyX3BhcmVudFswXVsnYXR0cmlicyddWycnXVsndXJsJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfSVJJKTsKCQkJCX0KCQkJfQoKCQkJLy8gUkFUSU5HUwoJCQlpZiAoJHJhdGluZ3MgPSAkdGhpcy0+Z2V0X2l0ZW1fdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTLCAncmF0aW5nJykpCgkJCXsKCQkJCWZvcmVhY2ggKCRyYXRpbmdzIGFzICRyYXRpbmcpCgkJCQl7CgkJCQkJJHJhdGluZ19zY2hlbWUgPSBudWxsOwoJCQkJCSRyYXRpbmdfdmFsdWUgPSBudWxsOwoJCQkJCWlmIChpc3NldCgkcmF0aW5nWydhdHRyaWJzJ11bJyddWydzY2hlbWUnXSkpCgkJCQkJewoJCQkJCQkkcmF0aW5nX3NjaGVtZSA9ICR0aGlzLT5zYW5pdGl6ZSgkcmF0aW5nWydhdHRyaWJzJ11bJyddWydzY2hlbWUnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJJHJhdGluZ19zY2hlbWUgPSAndXJuOnNpbXBsZSc7CgkJCQkJfQoJCQkJCWlmIChpc3NldCgkcmF0aW5nWydkYXRhJ10pKQoJCQkJCXsKCQkJCQkJJHJhdGluZ192YWx1ZSA9ICR0aGlzLT5zYW5pdGl6ZSgkcmF0aW5nWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJfQoJCQkJCSRyYXRpbmdzX3BhcmVudFtdID0mIG5ldyAkdGhpcy0+ZmVlZC0+cmF0aW5nX2NsYXNzKCRyYXRpbmdfc2NoZW1lLCAkcmF0aW5nX3ZhbHVlKTsKCQkJCX0KCQkJfQoJCQllbHNlaWYgKCRyYXRpbmdzID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9JVFVORVMsICdleHBsaWNpdCcpKQoJCQl7CgkJCQlmb3JlYWNoICgkcmF0aW5ncyBhcyAkcmF0aW5nKQoJCQkJewoJCQkJCSRyYXRpbmdfc2NoZW1lID0gJ3VybjppdHVuZXMnOwoJCQkJCSRyYXRpbmdfdmFsdWUgPSBudWxsOwoJCQkJCWlmIChpc3NldCgkcmF0aW5nWydkYXRhJ10pKQoJCQkJCXsKCQkJCQkJJHJhdGluZ192YWx1ZSA9ICR0aGlzLT5zYW5pdGl6ZSgkcmF0aW5nWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJfQoJCQkJCSRyYXRpbmdzX3BhcmVudFtdID0mIG5ldyAkdGhpcy0+ZmVlZC0+cmF0aW5nX2NsYXNzKCRyYXRpbmdfc2NoZW1lLCAkcmF0aW5nX3ZhbHVlKTsKCQkJCX0KCQkJfQoJCQllbHNlaWYgKCRyYXRpbmdzID0gJHBhcmVudC0+Z2V0X2NoYW5uZWxfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTLCAncmF0aW5nJykpCgkJCXsKCQkJCWZvcmVhY2ggKCRyYXRpbmdzIGFzICRyYXRpbmcpCgkJCQl7CgkJCQkJJHJhdGluZ19zY2hlbWUgPSBudWxsOwoJCQkJCSRyYXRpbmdfdmFsdWUgPSBudWxsOwoJCQkJCWlmIChpc3NldCgkcmF0aW5nWydhdHRyaWJzJ11bJyddWydzY2hlbWUnXSkpCgkJCQkJewoJCQkJCQkkcmF0aW5nX3NjaGVtZSA9ICR0aGlzLT5zYW5pdGl6ZSgkcmF0aW5nWydhdHRyaWJzJ11bJyddWydzY2hlbWUnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJJHJhdGluZ19zY2hlbWUgPSAndXJuOnNpbXBsZSc7CgkJCQkJfQoJCQkJCWlmIChpc3NldCgkcmF0aW5nWydkYXRhJ10pKQoJCQkJCXsKCQkJCQkJJHJhdGluZ192YWx1ZSA9ICR0aGlzLT5zYW5pdGl6ZSgkcmF0aW5nWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJfQoJCQkJCSRyYXRpbmdzX3BhcmVudFtdID0mIG5ldyAkdGhpcy0+ZmVlZC0+cmF0aW5nX2NsYXNzKCRyYXRpbmdfc2NoZW1lLCAkcmF0aW5nX3ZhbHVlKTsKCQkJCX0KCQkJfQoJCQllbHNlaWYgKCRyYXRpbmdzID0gJHBhcmVudC0+Z2V0X2NoYW5uZWxfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0lUVU5FUywgJ2V4cGxpY2l0JykpCgkJCXsKCQkJCWZvcmVhY2ggKCRyYXRpbmdzIGFzICRyYXRpbmcpCgkJCQl7CgkJCQkJJHJhdGluZ19zY2hlbWUgPSAndXJuOml0dW5lcyc7CgkJCQkJJHJhdGluZ192YWx1ZSA9IG51bGw7CgkJCQkJaWYgKGlzc2V0KCRyYXRpbmdbJ2RhdGEnXSkpCgkJCQkJewoJCQkJCQkkcmF0aW5nX3ZhbHVlID0gJHRoaXMtPnNhbml0aXplKCRyYXRpbmdbJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQl9CgkJCQkJJHJhdGluZ3NfcGFyZW50W10gPSYgbmV3ICR0aGlzLT5mZWVkLT5yYXRpbmdfY2xhc3MoJHJhdGluZ19zY2hlbWUsICRyYXRpbmdfdmFsdWUpOwoJCQkJfQoJCQl9CgkJCWlmIChpc19hcnJheSgkcmF0aW5nc19wYXJlbnQpKQoJCQl7CgkJCQkkcmF0aW5nc19wYXJlbnQgPSBhcnJheV92YWx1ZXMoU2ltcGxlUGllX01pc2M6OmFycmF5X3VuaXF1ZSgkcmF0aW5nc19wYXJlbnQpKTsKCQkJfQoKCQkJLy8gUkVTVFJJQ1RJT05TCgkJCWlmICgkcmVzdHJpY3Rpb25zID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTUywgJ3Jlc3RyaWN0aW9uJykpCgkJCXsKCQkJCWZvcmVhY2ggKCRyZXN0cmljdGlvbnMgYXMgJHJlc3RyaWN0aW9uKQoJCQkJewoJCQkJCSRyZXN0cmljdGlvbl9yZWxhdGlvbnNoaXAgPSBudWxsOwoJCQkJCSRyZXN0cmljdGlvbl90eXBlID0gbnVsbDsKCQkJCQkkcmVzdHJpY3Rpb25fdmFsdWUgPSBudWxsOwoJCQkJCWlmIChpc3NldCgkcmVzdHJpY3Rpb25bJ2F0dHJpYnMnXVsnJ11bJ3JlbGF0aW9uc2hpcCddKSkKCQkJCQl7CgkJCQkJCSRyZXN0cmljdGlvbl9yZWxhdGlvbnNoaXAgPSAkdGhpcy0+c2FuaXRpemUoJHJlc3RyaWN0aW9uWydhdHRyaWJzJ11bJyddWydyZWxhdGlvbnNoaXAnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQl9CgkJCQkJaWYgKGlzc2V0KCRyZXN0cmljdGlvblsnYXR0cmlicyddWycnXVsndHlwZSddKSkKCQkJCQl7CgkJCQkJCSRyZXN0cmljdGlvbl90eXBlID0gJHRoaXMtPnNhbml0aXplKCRyZXN0cmljdGlvblsnYXR0cmlicyddWycnXVsndHlwZSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCX0KCQkJCQlpZiAoaXNzZXQoJHJlc3RyaWN0aW9uWydkYXRhJ10pKQoJCQkJCXsKCQkJCQkJJHJlc3RyaWN0aW9uX3ZhbHVlID0gJHRoaXMtPnNhbml0aXplKCRyZXN0cmljdGlvblsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCX0KCQkJCQkkcmVzdHJpY3Rpb25zX3BhcmVudFtdID0mIG5ldyAkdGhpcy0+ZmVlZC0+cmVzdHJpY3Rpb25fY2xhc3MoJHJlc3RyaWN0aW9uX3JlbGF0aW9uc2hpcCwgJHJlc3RyaWN0aW9uX3R5cGUsICRyZXN0cmljdGlvbl92YWx1ZSk7CgkJCQl9CgkJCX0KCQkJZWxzZWlmICgkcmVzdHJpY3Rpb25zID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9JVFVORVMsICdibG9jaycpKQoJCQl7CgkJCQlmb3JlYWNoICgkcmVzdHJpY3Rpb25zIGFzICRyZXN0cmljdGlvbikKCQkJCXsKCQkJCQkkcmVzdHJpY3Rpb25fcmVsYXRpb25zaGlwID0gJ2FsbG93JzsKCQkJCQkkcmVzdHJpY3Rpb25fdHlwZSA9IG51bGw7CgkJCQkJJHJlc3RyaWN0aW9uX3ZhbHVlID0gJ2l0dW5lcyc7CgkJCQkJaWYgKGlzc2V0KCRyZXN0cmljdGlvblsnZGF0YSddKSAmJiBzdHJ0b2xvd2VyKCRyZXN0cmljdGlvblsnZGF0YSddKSA9PSAneWVzJykKCQkJCQl7CgkJCQkJCSRyZXN0cmljdGlvbl9yZWxhdGlvbnNoaXAgPSAnZGVueSc7CgkJCQkJfQoJCQkJCSRyZXN0cmljdGlvbnNfcGFyZW50W10gPSYgbmV3ICR0aGlzLT5mZWVkLT5yZXN0cmljdGlvbl9jbGFzcygkcmVzdHJpY3Rpb25fcmVsYXRpb25zaGlwLCAkcmVzdHJpY3Rpb25fdHlwZSwgJHJlc3RyaWN0aW9uX3ZhbHVlKTsKCQkJCX0KCQkJfQoJCQllbHNlaWYgKCRyZXN0cmljdGlvbnMgPSAkcGFyZW50LT5nZXRfY2hhbm5lbF90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1MsICdyZXN0cmljdGlvbicpKQoJCQl7CgkJCQlmb3JlYWNoICgkcmVzdHJpY3Rpb25zIGFzICRyZXN0cmljdGlvbikKCQkJCXsKCQkJCQkkcmVzdHJpY3Rpb25fcmVsYXRpb25zaGlwID0gbnVsbDsKCQkJCQkkcmVzdHJpY3Rpb25fdHlwZSA9IG51bGw7CgkJCQkJJHJlc3RyaWN0aW9uX3ZhbHVlID0gbnVsbDsKCQkJCQlpZiAoaXNzZXQoJHJlc3RyaWN0aW9uWydhdHRyaWJzJ11bJyddWydyZWxhdGlvbnNoaXAnXSkpCgkJCQkJewoJCQkJCQkkcmVzdHJpY3Rpb25fcmVsYXRpb25zaGlwID0gJHRoaXMtPnNhbml0aXplKCRyZXN0cmljdGlvblsnYXR0cmlicyddWycnXVsncmVsYXRpb25zaGlwJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJfQoJCQkJCWlmIChpc3NldCgkcmVzdHJpY3Rpb25bJ2F0dHJpYnMnXVsnJ11bJ3R5cGUnXSkpCgkJCQkJewoJCQkJCQkkcmVzdHJpY3Rpb25fdHlwZSA9ICR0aGlzLT5zYW5pdGl6ZSgkcmVzdHJpY3Rpb25bJ2F0dHJpYnMnXVsnJ11bJ3R5cGUnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQl9CgkJCQkJaWYgKGlzc2V0KCRyZXN0cmljdGlvblsnZGF0YSddKSkKCQkJCQl7CgkJCQkJCSRyZXN0cmljdGlvbl92YWx1ZSA9ICR0aGlzLT5zYW5pdGl6ZSgkcmVzdHJpY3Rpb25bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQl9CgkJCQkJJHJlc3RyaWN0aW9uc19wYXJlbnRbXSA9JiBuZXcgJHRoaXMtPmZlZWQtPnJlc3RyaWN0aW9uX2NsYXNzKCRyZXN0cmljdGlvbl9yZWxhdGlvbnNoaXAsICRyZXN0cmljdGlvbl90eXBlLCAkcmVzdHJpY3Rpb25fdmFsdWUpOwoJCQkJfQoJCQl9CgkJCWVsc2VpZiAoJHJlc3RyaWN0aW9ucyA9ICRwYXJlbnQtPmdldF9jaGFubmVsX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9JVFVORVMsICdibG9jaycpKQoJCQl7CgkJCQlmb3JlYWNoICgkcmVzdHJpY3Rpb25zIGFzICRyZXN0cmljdGlvbikKCQkJCXsKCQkJCQkkcmVzdHJpY3Rpb25fcmVsYXRpb25zaGlwID0gJ2FsbG93JzsKCQkJCQkkcmVzdHJpY3Rpb25fdHlwZSA9IG51bGw7CgkJCQkJJHJlc3RyaWN0aW9uX3ZhbHVlID0gJ2l0dW5lcyc7CgkJCQkJaWYgKGlzc2V0KCRyZXN0cmljdGlvblsnZGF0YSddKSAmJiBzdHJ0b2xvd2VyKCRyZXN0cmljdGlvblsnZGF0YSddKSA9PSAneWVzJykKCQkJCQl7CgkJCQkJCSRyZXN0cmljdGlvbl9yZWxhdGlvbnNoaXAgPSAnZGVueSc7CgkJCQkJfQoJCQkJCSRyZXN0cmljdGlvbnNfcGFyZW50W10gPSYgbmV3ICR0aGlzLT5mZWVkLT5yZXN0cmljdGlvbl9jbGFzcygkcmVzdHJpY3Rpb25fcmVsYXRpb25zaGlwLCAkcmVzdHJpY3Rpb25fdHlwZSwgJHJlc3RyaWN0aW9uX3ZhbHVlKTsKCQkJCX0KCQkJfQoJCQlpZiAoaXNfYXJyYXkoJHJlc3RyaWN0aW9uc19wYXJlbnQpKQoJCQl7CgkJCQkkcmVzdHJpY3Rpb25zX3BhcmVudCA9IGFycmF5X3ZhbHVlcyhTaW1wbGVQaWVfTWlzYzo6YXJyYXlfdW5pcXVlKCRyZXN0cmljdGlvbnNfcGFyZW50KSk7CgkJCX0KCgkJCS8vIFRIVU1CTkFJTFMKCQkJaWYgKCR0aHVtYm5haWxzID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTUywgJ3RodW1ibmFpbCcpKQoJCQl7CgkJCQlmb3JlYWNoICgkdGh1bWJuYWlscyBhcyAkdGh1bWJuYWlsKQoJCQkJewoJCQkJCWlmIChpc3NldCgkdGh1bWJuYWlsWydhdHRyaWJzJ11bJyddWyd1cmwnXSkpCgkJCQkJewoJCQkJCQkkdGh1bWJuYWlsc19wYXJlbnRbXSA9ICR0aGlzLT5zYW5pdGl6ZSgkdGh1bWJuYWlsWydhdHRyaWJzJ11bJyddWyd1cmwnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9JUkkpOwoJCQkJCX0KCQkJCX0KCQkJfQoJCQllbHNlaWYgKCR0aHVtYm5haWxzID0gJHBhcmVudC0+Z2V0X2NoYW5uZWxfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTLCAndGh1bWJuYWlsJykpCgkJCXsKCQkJCWZvcmVhY2ggKCR0aHVtYm5haWxzIGFzICR0aHVtYm5haWwpCgkJCQl7CgkJCQkJaWYgKGlzc2V0KCR0aHVtYm5haWxbJ2F0dHJpYnMnXVsnJ11bJ3VybCddKSkKCQkJCQl7CgkJCQkJCSR0aHVtYm5haWxzX3BhcmVudFtdID0gJHRoaXMtPnNhbml0aXplKCR0aHVtYm5haWxbJ2F0dHJpYnMnXVsnJ11bJ3VybCddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSk7CgkJCQkJfQoJCQkJfQoJCQl9CgoJCQkvLyBUSVRMRVMKCQkJaWYgKCR0aXRsZV9wYXJlbnQgPSAkdGhpcy0+Z2V0X2l0ZW1fdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTLCAndGl0bGUnKSkKCQkJewoJCQkJaWYgKGlzc2V0KCR0aXRsZV9wYXJlbnRbMF1bJ2RhdGEnXSkpCgkJCQl7CgkJCQkJJHRpdGxlX3BhcmVudCA9ICR0aGlzLT5zYW5pdGl6ZSgkdGl0bGVfcGFyZW50WzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQl9CgkJCX0KCQkJZWxzZWlmICgkdGl0bGVfcGFyZW50ID0gJHBhcmVudC0+Z2V0X2NoYW5uZWxfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTLCAndGl0bGUnKSkKCQkJewoJCQkJaWYgKGlzc2V0KCR0aXRsZV9wYXJlbnRbMF1bJ2RhdGEnXSkpCgkJCQl7CgkJCQkJJHRpdGxlX3BhcmVudCA9ICR0aGlzLT5zYW5pdGl6ZSgkdGl0bGVfcGFyZW50WzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQl9CgkJCX0KCgkJCS8vIENsZWFyIHRoZSBtZW1vcnkKCQkJdW5zZXQoJHBhcmVudCk7CgoJCQkvLyBBdHRyaWJ1dGVzCgkJCSRiaXRyYXRlID0gbnVsbDsKCQkJJGNoYW5uZWxzID0gbnVsbDsKCQkJJGR1cmF0aW9uID0gbnVsbDsKCQkJJGV4cHJlc3Npb24gPSBudWxsOwoJCQkkZnJhbWVyYXRlID0gbnVsbDsKCQkJJGhlaWdodCA9IG51bGw7CgkJCSRqYXZhc2NyaXB0ID0gbnVsbDsKCQkJJGxhbmcgPSBudWxsOwoJCQkkbGVuZ3RoID0gbnVsbDsKCQkJJG1lZGl1bSA9IG51bGw7CgkJCSRzYW1wbGluZ3JhdGUgPSBudWxsOwoJCQkkdHlwZSA9IG51bGw7CgkJCSR1cmwgPSBudWxsOwoJCQkkd2lkdGggPSBudWxsOwoKCQkJLy8gRWxlbWVudHMKCQkJJGNhcHRpb25zID0gbnVsbDsKCQkJJGNhdGVnb3JpZXMgPSBudWxsOwoJCQkkY29weXJpZ2h0cyA9IG51bGw7CgkJCSRjcmVkaXRzID0gbnVsbDsKCQkJJGRlc2NyaXB0aW9uID0gbnVsbDsKCQkJJGhhc2hlcyA9IG51bGw7CgkJCSRrZXl3b3JkcyA9IG51bGw7CgkJCSRwbGF5ZXIgPSBudWxsOwoJCQkkcmF0aW5ncyA9IG51bGw7CgkJCSRyZXN0cmljdGlvbnMgPSBudWxsOwoJCQkkdGh1bWJuYWlscyA9IG51bGw7CgkJCSR0aXRsZSA9IG51bGw7CgoJCQkvLyBJZiB3ZSBoYXZlIG1lZGlhOmdyb3VwIHRhZ3MsIGxvb3AgdGhyb3VnaCB0aGVtLgoJCQlmb3JlYWNoICgoYXJyYXkpICR0aGlzLT5nZXRfaXRlbV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1MsICdncm91cCcpIGFzICRncm91cCkKCQkJewoJCQkJLy8gSWYgd2UgaGF2ZSBtZWRpYTpjb250ZW50IHRhZ3MsIGxvb3AgdGhyb3VnaCB0aGVtLgoJCQkJZm9yZWFjaCAoKGFycmF5KSAkZ3JvdXBbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ2NvbnRlbnQnXSBhcyAkY29udGVudCkKCQkJCXsKCQkJCQlpZiAoaXNzZXQoJGNvbnRlbnRbJ2F0dHJpYnMnXVsnJ11bJ3VybCddKSkKCQkJCQl7CgkJCQkJCS8vIEF0dHJpYnV0ZXMKCQkJCQkJJGJpdHJhdGUgPSBudWxsOwoJCQkJCQkkY2hhbm5lbHMgPSBudWxsOwoJCQkJCQkkZHVyYXRpb24gPSBudWxsOwoJCQkJCQkkZXhwcmVzc2lvbiA9IG51bGw7CgkJCQkJCSRmcmFtZXJhdGUgPSBudWxsOwoJCQkJCQkkaGVpZ2h0ID0gbnVsbDsKCQkJCQkJJGphdmFzY3JpcHQgPSBudWxsOwoJCQkJCQkkbGFuZyA9IG51bGw7CgkJCQkJCSRsZW5ndGggPSBudWxsOwoJCQkJCQkkbWVkaXVtID0gbnVsbDsKCQkJCQkJJHNhbXBsaW5ncmF0ZSA9IG51bGw7CgkJCQkJCSR0eXBlID0gbnVsbDsKCQkJCQkJJHVybCA9IG51bGw7CgkJCQkJCSR3aWR0aCA9IG51bGw7CgoJCQkJCQkvLyBFbGVtZW50cwoJCQkJCQkkY2FwdGlvbnMgPSBudWxsOwoJCQkJCQkkY2F0ZWdvcmllcyA9IG51bGw7CgkJCQkJCSRjb3B5cmlnaHRzID0gbnVsbDsKCQkJCQkJJGNyZWRpdHMgPSBudWxsOwoJCQkJCQkkZGVzY3JpcHRpb24gPSBudWxsOwoJCQkJCQkkaGFzaGVzID0gbnVsbDsKCQkJCQkJJGtleXdvcmRzID0gbnVsbDsKCQkJCQkJJHBsYXllciA9IG51bGw7CgkJCQkJCSRyYXRpbmdzID0gbnVsbDsKCQkJCQkJJHJlc3RyaWN0aW9ucyA9IG51bGw7CgkJCQkJCSR0aHVtYm5haWxzID0gbnVsbDsKCQkJCQkJJHRpdGxlID0gbnVsbDsKCgkJCQkJCS8vIFN0YXJ0IGNoZWNraW5nIHRoZSBhdHRyaWJ1dGVzIG9mIG1lZGlhOmNvbnRlbnQKCQkJCQkJaWYgKGlzc2V0KCRjb250ZW50WydhdHRyaWJzJ11bJyddWydiaXRyYXRlJ10pKQoJCQkJCQl7CgkJCQkJCQkkYml0cmF0ZSA9ICR0aGlzLT5zYW5pdGl6ZSgkY29udGVudFsnYXR0cmlicyddWycnXVsnYml0cmF0ZSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQl9CgkJCQkJCWlmIChpc3NldCgkY29udGVudFsnYXR0cmlicyddWycnXVsnY2hhbm5lbHMnXSkpCgkJCQkJCXsKCQkJCQkJCSRjaGFubmVscyA9ICR0aGlzLT5zYW5pdGl6ZSgkY29udGVudFsnYXR0cmlicyddWycnXVsnY2hhbm5lbHMnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJfQoJCQkJCQlpZiAoaXNzZXQoJGNvbnRlbnRbJ2F0dHJpYnMnXVsnJ11bJ2R1cmF0aW9uJ10pKQoJCQkJCQl7CgkJCQkJCQkkZHVyYXRpb24gPSAkdGhpcy0+c2FuaXRpemUoJGNvbnRlbnRbJ2F0dHJpYnMnXVsnJ11bJ2R1cmF0aW9uJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCX0KCQkJCQkJZWxzZQoJCQkJCQl7CgkJCQkJCQkkZHVyYXRpb24gPSAkZHVyYXRpb25fcGFyZW50OwoJCQkJCQl9CgkJCQkJCWlmIChpc3NldCgkY29udGVudFsnYXR0cmlicyddWycnXVsnZXhwcmVzc2lvbiddKSkKCQkJCQkJewoJCQkJCQkJJGV4cHJlc3Npb24gPSAkdGhpcy0+c2FuaXRpemUoJGNvbnRlbnRbJ2F0dHJpYnMnXVsnJ11bJ2V4cHJlc3Npb24nXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJfQoJCQkJCQlpZiAoaXNzZXQoJGNvbnRlbnRbJ2F0dHJpYnMnXVsnJ11bJ2ZyYW1lcmF0ZSddKSkKCQkJCQkJewoJCQkJCQkJJGZyYW1lcmF0ZSA9ICR0aGlzLT5zYW5pdGl6ZSgkY29udGVudFsnYXR0cmlicyddWycnXVsnZnJhbWVyYXRlJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCX0KCQkJCQkJaWYgKGlzc2V0KCRjb250ZW50WydhdHRyaWJzJ11bJyddWydoZWlnaHQnXSkpCgkJCQkJCXsKCQkJCQkJCSRoZWlnaHQgPSAkdGhpcy0+c2FuaXRpemUoJGNvbnRlbnRbJ2F0dHJpYnMnXVsnJ11bJ2hlaWdodCddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQl9CgkJCQkJCWlmIChpc3NldCgkY29udGVudFsnYXR0cmlicyddWycnXVsnbGFuZyddKSkKCQkJCQkJewoJCQkJCQkJJGxhbmcgPSAkdGhpcy0+c2FuaXRpemUoJGNvbnRlbnRbJ2F0dHJpYnMnXVsnJ11bJ2xhbmcnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJfQoJCQkJCQlpZiAoaXNzZXQoJGNvbnRlbnRbJ2F0dHJpYnMnXVsnJ11bJ2ZpbGVTaXplJ10pKQoJCQkJCQl7CgkJCQkJCQkkbGVuZ3RoID0gY2VpbCgkY29udGVudFsnYXR0cmlicyddWycnXVsnZmlsZVNpemUnXSk7CgkJCQkJCX0KCQkJCQkJaWYgKGlzc2V0KCRjb250ZW50WydhdHRyaWJzJ11bJyddWydtZWRpdW0nXSkpCgkJCQkJCXsKCQkJCQkJCSRtZWRpdW0gPSAkdGhpcy0+c2FuaXRpemUoJGNvbnRlbnRbJ2F0dHJpYnMnXVsnJ11bJ21lZGl1bSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQl9CgkJCQkJCWlmIChpc3NldCgkY29udGVudFsnYXR0cmlicyddWycnXVsnc2FtcGxpbmdyYXRlJ10pKQoJCQkJCQl7CgkJCQkJCQkkc2FtcGxpbmdyYXRlID0gJHRoaXMtPnNhbml0aXplKCRjb250ZW50WydhdHRyaWJzJ11bJyddWydzYW1wbGluZ3JhdGUnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJfQoJCQkJCQlpZiAoaXNzZXQoJGNvbnRlbnRbJ2F0dHJpYnMnXVsnJ11bJ3R5cGUnXSkpCgkJCQkJCXsKCQkJCQkJCSR0eXBlID0gJHRoaXMtPnNhbml0aXplKCRjb250ZW50WydhdHRyaWJzJ11bJyddWyd0eXBlJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCX0KCQkJCQkJaWYgKGlzc2V0KCRjb250ZW50WydhdHRyaWJzJ11bJyddWyd3aWR0aCddKSkKCQkJCQkJewoJCQkJCQkJJHdpZHRoID0gJHRoaXMtPnNhbml0aXplKCRjb250ZW50WydhdHRyaWJzJ11bJyddWyd3aWR0aCddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQl9CgkJCQkJCSR1cmwgPSAkdGhpcy0+c2FuaXRpemUoJGNvbnRlbnRbJ2F0dHJpYnMnXVsnJ11bJ3VybCddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSk7CgoJCQkJCQkvLyBDaGVja2luZyB0aGUgb3RoZXIgb3B0aW9uYWwgbWVkaWE6IGVsZW1lbnRzLiBQcmlvcml0eTogbWVkaWE6Y29udGVudCwgbWVkaWE6Z3JvdXAsIGl0ZW0sIGNoYW5uZWwKCgkJCQkJCS8vIENBUFRJT05TCgkJCQkJCWlmIChpc3NldCgkY29udGVudFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsndGV4dCddKSkKCQkJCQkJewoJCQkJCQkJZm9yZWFjaCAoJGNvbnRlbnRbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ3RleHQnXSBhcyAkY2FwdGlvbikKCQkJCQkJCXsKCQkJCQkJCQkkY2FwdGlvbl90eXBlID0gbnVsbDsKCQkJCQkJCQkkY2FwdGlvbl9sYW5nID0gbnVsbDsKCQkJCQkJCQkkY2FwdGlvbl9zdGFydFRpbWUgPSBudWxsOwoJCQkJCQkJCSRjYXB0aW9uX2VuZFRpbWUgPSBudWxsOwoJCQkJCQkJCSRjYXB0aW9uX3RleHQgPSBudWxsOwoJCQkJCQkJCWlmIChpc3NldCgkY2FwdGlvblsnYXR0cmlicyddWycnXVsndHlwZSddKSkKCQkJCQkJCQl7CgkJCQkJCQkJCSRjYXB0aW9uX3R5cGUgPSAkdGhpcy0+c2FuaXRpemUoJGNhcHRpb25bJ2F0dHJpYnMnXVsnJ11bJ3R5cGUnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJCQl9CgkJCQkJCQkJaWYgKGlzc2V0KCRjYXB0aW9uWydhdHRyaWJzJ11bJyddWydsYW5nJ10pKQoJCQkJCQkJCXsKCQkJCQkJCQkJJGNhcHRpb25fbGFuZyA9ICR0aGlzLT5zYW5pdGl6ZSgkY2FwdGlvblsnYXR0cmlicyddWycnXVsnbGFuZyddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQkJCX0KCQkJCQkJCQlpZiAoaXNzZXQoJGNhcHRpb25bJ2F0dHJpYnMnXVsnJ11bJ3N0YXJ0J10pKQoJCQkJCQkJCXsKCQkJCQkJCQkJJGNhcHRpb25fc3RhcnRUaW1lID0gJHRoaXMtPnNhbml0aXplKCRjYXB0aW9uWydhdHRyaWJzJ11bJyddWydzdGFydCddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQkJCX0KCQkJCQkJCQlpZiAoaXNzZXQoJGNhcHRpb25bJ2F0dHJpYnMnXVsnJ11bJ2VuZCddKSkKCQkJCQkJCQl7CgkJCQkJCQkJCSRjYXB0aW9uX2VuZFRpbWUgPSAkdGhpcy0+c2FuaXRpemUoJGNhcHRpb25bJ2F0dHJpYnMnXVsnJ11bJ2VuZCddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQkJCX0KCQkJCQkJCQlpZiAoaXNzZXQoJGNhcHRpb25bJ2RhdGEnXSkpCgkJCQkJCQkJewoJCQkJCQkJCQkkY2FwdGlvbl90ZXh0ID0gJHRoaXMtPnNhbml0aXplKCRjYXB0aW9uWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCQkJfQoJCQkJCQkJCSRjYXB0aW9uc1tdID0mIG5ldyAkdGhpcy0+ZmVlZC0+Y2FwdGlvbl9jbGFzcygkY2FwdGlvbl90eXBlLCAkY2FwdGlvbl9sYW5nLCAkY2FwdGlvbl9zdGFydFRpbWUsICRjYXB0aW9uX2VuZFRpbWUsICRjYXB0aW9uX3RleHQpOwoJCQkJCQkJfQoJCQkJCQkJaWYgKGlzX2FycmF5KCRjYXB0aW9ucykpCgkJCQkJCQl7CgkJCQkJCQkJJGNhcHRpb25zID0gYXJyYXlfdmFsdWVzKFNpbXBsZVBpZV9NaXNjOjphcnJheV91bmlxdWUoJGNhcHRpb25zKSk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQkJZWxzZWlmIChpc3NldCgkZ3JvdXBbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ3RleHQnXSkpCgkJCQkJCXsKCQkJCQkJCWZvcmVhY2ggKCRncm91cFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsndGV4dCddIGFzICRjYXB0aW9uKQoJCQkJCQkJewoJCQkJCQkJCSRjYXB0aW9uX3R5cGUgPSBudWxsOwoJCQkJCQkJCSRjYXB0aW9uX2xhbmcgPSBudWxsOwoJCQkJCQkJCSRjYXB0aW9uX3N0YXJ0VGltZSA9IG51bGw7CgkJCQkJCQkJJGNhcHRpb25fZW5kVGltZSA9IG51bGw7CgkJCQkJCQkJJGNhcHRpb25fdGV4dCA9IG51bGw7CgkJCQkJCQkJaWYgKGlzc2V0KCRjYXB0aW9uWydhdHRyaWJzJ11bJyddWyd0eXBlJ10pKQoJCQkJCQkJCXsKCQkJCQkJCQkJJGNhcHRpb25fdHlwZSA9ICR0aGlzLT5zYW5pdGl6ZSgkY2FwdGlvblsnYXR0cmlicyddWycnXVsndHlwZSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQkJCX0KCQkJCQkJCQlpZiAoaXNzZXQoJGNhcHRpb25bJ2F0dHJpYnMnXVsnJ11bJ2xhbmcnXSkpCgkJCQkJCQkJewoJCQkJCQkJCQkkY2FwdGlvbl9sYW5nID0gJHRoaXMtPnNhbml0aXplKCRjYXB0aW9uWydhdHRyaWJzJ11bJyddWydsYW5nJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCQkJfQoJCQkJCQkJCWlmIChpc3NldCgkY2FwdGlvblsnYXR0cmlicyddWycnXVsnc3RhcnQnXSkpCgkJCQkJCQkJewoJCQkJCQkJCQkkY2FwdGlvbl9zdGFydFRpbWUgPSAkdGhpcy0+c2FuaXRpemUoJGNhcHRpb25bJ2F0dHJpYnMnXVsnJ11bJ3N0YXJ0J10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCQkJfQoJCQkJCQkJCWlmIChpc3NldCgkY2FwdGlvblsnYXR0cmlicyddWycnXVsnZW5kJ10pKQoJCQkJCQkJCXsKCQkJCQkJCQkJJGNhcHRpb25fZW5kVGltZSA9ICR0aGlzLT5zYW5pdGl6ZSgkY2FwdGlvblsnYXR0cmlicyddWycnXVsnZW5kJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCQkJfQoJCQkJCQkJCWlmIChpc3NldCgkY2FwdGlvblsnZGF0YSddKSkKCQkJCQkJCQl7CgkJCQkJCQkJCSRjYXB0aW9uX3RleHQgPSAkdGhpcy0+c2FuaXRpemUoJGNhcHRpb25bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJCQl9CgkJCQkJCQkJJGNhcHRpb25zW10gPSYgbmV3ICR0aGlzLT5mZWVkLT5jYXB0aW9uX2NsYXNzKCRjYXB0aW9uX3R5cGUsICRjYXB0aW9uX2xhbmcsICRjYXB0aW9uX3N0YXJ0VGltZSwgJGNhcHRpb25fZW5kVGltZSwgJGNhcHRpb25fdGV4dCk7CgkJCQkJCQl9CgkJCQkJCQlpZiAoaXNfYXJyYXkoJGNhcHRpb25zKSkKCQkJCQkJCXsKCQkJCQkJCQkkY2FwdGlvbnMgPSBhcnJheV92YWx1ZXMoU2ltcGxlUGllX01pc2M6OmFycmF5X3VuaXF1ZSgkY2FwdGlvbnMpKTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQllbHNlCgkJCQkJCXsKCQkJCQkJCSRjYXB0aW9ucyA9ICRjYXB0aW9uc19wYXJlbnQ7CgkJCQkJCX0KCgkJCQkJCS8vIENBVEVHT1JJRVMKCQkJCQkJaWYgKGlzc2V0KCRjb250ZW50WydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWydjYXRlZ29yeSddKSkKCQkJCQkJewoJCQkJCQkJZm9yZWFjaCAoKGFycmF5KSAkY29udGVudFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsnY2F0ZWdvcnknXSBhcyAkY2F0ZWdvcnkpCgkJCQkJCQl7CgkJCQkJCQkJJHRlcm0gPSBudWxsOwoJCQkJCQkJCSRzY2hlbWUgPSBudWxsOwoJCQkJCQkJCSRsYWJlbCA9IG51bGw7CgkJCQkJCQkJaWYgKGlzc2V0KCRjYXRlZ29yeVsnZGF0YSddKSkKCQkJCQkJCQl7CgkJCQkJCQkJCSR0ZXJtID0gJHRoaXMtPnNhbml0aXplKCRjYXRlZ29yeVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQkJCX0KCQkJCQkJCQlpZiAoaXNzZXQoJGNhdGVnb3J5WydhdHRyaWJzJ11bJyddWydzY2hlbWUnXSkpCgkJCQkJCQkJewoJCQkJCQkJCQkkc2NoZW1lID0gJHRoaXMtPnNhbml0aXplKCRjYXRlZ29yeVsnYXR0cmlicyddWycnXVsnc2NoZW1lJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCQkJfQoJCQkJCQkJCWVsc2UKCQkJCQkJCQl7CgkJCQkJCQkJCSRzY2hlbWUgPSAnaHR0cDovL3NlYXJjaC55YWhvby5jb20vbXJzcy9jYXRlZ29yeV9zY2hlbWEnOwoJCQkJCQkJCX0KCQkJCQkJCQlpZiAoaXNzZXQoJGNhdGVnb3J5WydhdHRyaWJzJ11bJyddWydsYWJlbCddKSkKCQkJCQkJCQl7CgkJCQkJCQkJCSRsYWJlbCA9ICR0aGlzLT5zYW5pdGl6ZSgkY2F0ZWdvcnlbJ2F0dHJpYnMnXVsnJ11bJ2xhYmVsJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCQkJfQoJCQkJCQkJCSRjYXRlZ29yaWVzW10gPSYgbmV3ICR0aGlzLT5mZWVkLT5jYXRlZ29yeV9jbGFzcygkdGVybSwgJHNjaGVtZSwgJGxhYmVsKTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQlpZiAoaXNzZXQoJGdyb3VwWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWydjYXRlZ29yeSddKSkKCQkJCQkJewoJCQkJCQkJZm9yZWFjaCAoKGFycmF5KSAkZ3JvdXBbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ2NhdGVnb3J5J10gYXMgJGNhdGVnb3J5KQoJCQkJCQkJewoJCQkJCQkJCSR0ZXJtID0gbnVsbDsKCQkJCQkJCQkkc2NoZW1lID0gbnVsbDsKCQkJCQkJCQkkbGFiZWwgPSBudWxsOwoJCQkJCQkJCWlmIChpc3NldCgkY2F0ZWdvcnlbJ2RhdGEnXSkpCgkJCQkJCQkJewoJCQkJCQkJCQkkdGVybSA9ICR0aGlzLT5zYW5pdGl6ZSgkY2F0ZWdvcnlbJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJCQl9CgkJCQkJCQkJaWYgKGlzc2V0KCRjYXRlZ29yeVsnYXR0cmlicyddWycnXVsnc2NoZW1lJ10pKQoJCQkJCQkJCXsKCQkJCQkJCQkJJHNjaGVtZSA9ICR0aGlzLT5zYW5pdGl6ZSgkY2F0ZWdvcnlbJ2F0dHJpYnMnXVsnJ11bJ3NjaGVtZSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQkJCX0KCQkJCQkJCQllbHNlCgkJCQkJCQkJewoJCQkJCQkJCQkkc2NoZW1lID0gJ2h0dHA6Ly9zZWFyY2gueWFob28uY29tL21yc3MvY2F0ZWdvcnlfc2NoZW1hJzsKCQkJCQkJCQl9CgkJCQkJCQkJaWYgKGlzc2V0KCRjYXRlZ29yeVsnYXR0cmlicyddWycnXVsnbGFiZWwnXSkpCgkJCQkJCQkJewoJCQkJCQkJCQkkbGFiZWwgPSAkdGhpcy0+c2FuaXRpemUoJGNhdGVnb3J5WydhdHRyaWJzJ11bJyddWydsYWJlbCddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQkJCX0KCQkJCQkJCQkkY2F0ZWdvcmllc1tdID0mIG5ldyAkdGhpcy0+ZmVlZC0+Y2F0ZWdvcnlfY2xhc3MoJHRlcm0sICRzY2hlbWUsICRsYWJlbCk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQkJaWYgKGlzX2FycmF5KCRjYXRlZ29yaWVzKSAmJiBpc19hcnJheSgkY2F0ZWdvcmllc19wYXJlbnQpKQoJCQkJCQl7CgkJCQkJCQkkY2F0ZWdvcmllcyA9IGFycmF5X3ZhbHVlcyhTaW1wbGVQaWVfTWlzYzo6YXJyYXlfdW5pcXVlKGFycmF5X21lcmdlKCRjYXRlZ29yaWVzLCAkY2F0ZWdvcmllc19wYXJlbnQpKSk7CgkJCQkJCX0KCQkJCQkJZWxzZWlmIChpc19hcnJheSgkY2F0ZWdvcmllcykpCgkJCQkJCXsKCQkJCQkJCSRjYXRlZ29yaWVzID0gYXJyYXlfdmFsdWVzKFNpbXBsZVBpZV9NaXNjOjphcnJheV91bmlxdWUoJGNhdGVnb3JpZXMpKTsKCQkJCQkJfQoJCQkJCQllbHNlaWYgKGlzX2FycmF5KCRjYXRlZ29yaWVzX3BhcmVudCkpCgkJCQkJCXsKCQkJCQkJCSRjYXRlZ29yaWVzID0gYXJyYXlfdmFsdWVzKFNpbXBsZVBpZV9NaXNjOjphcnJheV91bmlxdWUoJGNhdGVnb3JpZXNfcGFyZW50KSk7CgkJCQkJCX0KCgkJCQkJCS8vIENPUFlSSUdIVFMKCQkJCQkJaWYgKGlzc2V0KCRjb250ZW50WydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWydjb3B5cmlnaHQnXSkpCgkJCQkJCXsKCQkJCQkJCSRjb3B5cmlnaHRfdXJsID0gbnVsbDsKCQkJCQkJCSRjb3B5cmlnaHRfbGFiZWwgPSBudWxsOwoJCQkJCQkJaWYgKGlzc2V0KCRjb250ZW50WydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWydjb3B5cmlnaHQnXVswXVsnYXR0cmlicyddWycnXVsndXJsJ10pKQoJCQkJCQkJewoJCQkJCQkJCSRjb3B5cmlnaHRfdXJsID0gJHRoaXMtPnNhbml0aXplKCRjb250ZW50WydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWydjb3B5cmlnaHQnXVswXVsnYXR0cmlicyddWycnXVsndXJsJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCQl9CgkJCQkJCQlpZiAoaXNzZXQoJGNvbnRlbnRbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ2NvcHlyaWdodCddWzBdWydkYXRhJ10pKQoJCQkJCQkJewoJCQkJCQkJCSRjb3B5cmlnaHRfbGFiZWwgPSAkdGhpcy0+c2FuaXRpemUoJGNvbnRlbnRbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ2NvcHlyaWdodCddWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCQl9CgkJCQkJCQkkY29weXJpZ2h0cyA9JiBuZXcgJHRoaXMtPmZlZWQtPmNvcHlyaWdodF9jbGFzcygkY29weXJpZ2h0X3VybCwgJGNvcHlyaWdodF9sYWJlbCk7CgkJCQkJCX0KCQkJCQkJZWxzZWlmIChpc3NldCgkZ3JvdXBbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ2NvcHlyaWdodCddKSkKCQkJCQkJewoJCQkJCQkJJGNvcHlyaWdodF91cmwgPSBudWxsOwoJCQkJCQkJJGNvcHlyaWdodF9sYWJlbCA9IG51bGw7CgkJCQkJCQlpZiAoaXNzZXQoJGdyb3VwWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWydjb3B5cmlnaHQnXVswXVsnYXR0cmlicyddWycnXVsndXJsJ10pKQoJCQkJCQkJewoJCQkJCQkJCSRjb3B5cmlnaHRfdXJsID0gJHRoaXMtPnNhbml0aXplKCRncm91cFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsnY29weXJpZ2h0J11bMF1bJ2F0dHJpYnMnXVsnJ11bJ3VybCddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQkJfQoJCQkJCQkJaWYgKGlzc2V0KCRncm91cFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsnY29weXJpZ2h0J11bMF1bJ2RhdGEnXSkpCgkJCQkJCQl7CgkJCQkJCQkJJGNvcHlyaWdodF9sYWJlbCA9ICR0aGlzLT5zYW5pdGl6ZSgkZ3JvdXBbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ2NvcHlyaWdodCddWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCQl9CgkJCQkJCQkkY29weXJpZ2h0cyA9JiBuZXcgJHRoaXMtPmZlZWQtPmNvcHlyaWdodF9jbGFzcygkY29weXJpZ2h0X3VybCwgJGNvcHlyaWdodF9sYWJlbCk7CgkJCQkJCX0KCQkJCQkJZWxzZQoJCQkJCQl7CgkJCQkJCQkkY29weXJpZ2h0cyA9ICRjb3B5cmlnaHRzX3BhcmVudDsKCQkJCQkJfQoKCQkJCQkJLy8gQ1JFRElUUwoJCQkJCQlpZiAoaXNzZXQoJGNvbnRlbnRbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ2NyZWRpdCddKSkKCQkJCQkJewoJCQkJCQkJZm9yZWFjaCAoJGNvbnRlbnRbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ2NyZWRpdCddIGFzICRjcmVkaXQpCgkJCQkJCQl7CgkJCQkJCQkJJGNyZWRpdF9yb2xlID0gbnVsbDsKCQkJCQkJCQkkY3JlZGl0X3NjaGVtZSA9IG51bGw7CgkJCQkJCQkJJGNyZWRpdF9uYW1lID0gbnVsbDsKCQkJCQkJCQlpZiAoaXNzZXQoJGNyZWRpdFsnYXR0cmlicyddWycnXVsncm9sZSddKSkKCQkJCQkJCQl7CgkJCQkJCQkJCSRjcmVkaXRfcm9sZSA9ICR0aGlzLT5zYW5pdGl6ZSgkY3JlZGl0WydhdHRyaWJzJ11bJyddWydyb2xlJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCQkJfQoJCQkJCQkJCWlmIChpc3NldCgkY3JlZGl0WydhdHRyaWJzJ11bJyddWydzY2hlbWUnXSkpCgkJCQkJCQkJewoJCQkJCQkJCQkkY3JlZGl0X3NjaGVtZSA9ICR0aGlzLT5zYW5pdGl6ZSgkY3JlZGl0WydhdHRyaWJzJ11bJyddWydzY2hlbWUnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJCQl9CgkJCQkJCQkJZWxzZQoJCQkJCQkJCXsKCQkJCQkJCQkJJGNyZWRpdF9zY2hlbWUgPSAndXJuOmVidSc7CgkJCQkJCQkJfQoJCQkJCQkJCWlmIChpc3NldCgkY3JlZGl0WydkYXRhJ10pKQoJCQkJCQkJCXsKCQkJCQkJCQkJJGNyZWRpdF9uYW1lID0gJHRoaXMtPnNhbml0aXplKCRjcmVkaXRbJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJCQl9CgkJCQkJCQkJJGNyZWRpdHNbXSA9JiBuZXcgJHRoaXMtPmZlZWQtPmNyZWRpdF9jbGFzcygkY3JlZGl0X3JvbGUsICRjcmVkaXRfc2NoZW1lLCAkY3JlZGl0X25hbWUpOwoJCQkJCQkJfQoJCQkJCQkJaWYgKGlzX2FycmF5KCRjcmVkaXRzKSkKCQkJCQkJCXsKCQkJCQkJCQkkY3JlZGl0cyA9IGFycmF5X3ZhbHVlcyhTaW1wbGVQaWVfTWlzYzo6YXJyYXlfdW5pcXVlKCRjcmVkaXRzKSk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQkJZWxzZWlmIChpc3NldCgkZ3JvdXBbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ2NyZWRpdCddKSkKCQkJCQkJewoJCQkJCQkJZm9yZWFjaCAoJGdyb3VwWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWydjcmVkaXQnXSBhcyAkY3JlZGl0KQoJCQkJCQkJewoJCQkJCQkJCSRjcmVkaXRfcm9sZSA9IG51bGw7CgkJCQkJCQkJJGNyZWRpdF9zY2hlbWUgPSBudWxsOwoJCQkJCQkJCSRjcmVkaXRfbmFtZSA9IG51bGw7CgkJCQkJCQkJaWYgKGlzc2V0KCRjcmVkaXRbJ2F0dHJpYnMnXVsnJ11bJ3JvbGUnXSkpCgkJCQkJCQkJewoJCQkJCQkJCQkkY3JlZGl0X3JvbGUgPSAkdGhpcy0+c2FuaXRpemUoJGNyZWRpdFsnYXR0cmlicyddWycnXVsncm9sZSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQkJCX0KCQkJCQkJCQlpZiAoaXNzZXQoJGNyZWRpdFsnYXR0cmlicyddWycnXVsnc2NoZW1lJ10pKQoJCQkJCQkJCXsKCQkJCQkJCQkJJGNyZWRpdF9zY2hlbWUgPSAkdGhpcy0+c2FuaXRpemUoJGNyZWRpdFsnYXR0cmlicyddWycnXVsnc2NoZW1lJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCQkJfQoJCQkJCQkJCWVsc2UKCQkJCQkJCQl7CgkJCQkJCQkJCSRjcmVkaXRfc2NoZW1lID0gJ3VybjplYnUnOwoJCQkJCQkJCX0KCQkJCQkJCQlpZiAoaXNzZXQoJGNyZWRpdFsnZGF0YSddKSkKCQkJCQkJCQl7CgkJCQkJCQkJCSRjcmVkaXRfbmFtZSA9ICR0aGlzLT5zYW5pdGl6ZSgkY3JlZGl0WydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCQkJfQoJCQkJCQkJCSRjcmVkaXRzW10gPSYgbmV3ICR0aGlzLT5mZWVkLT5jcmVkaXRfY2xhc3MoJGNyZWRpdF9yb2xlLCAkY3JlZGl0X3NjaGVtZSwgJGNyZWRpdF9uYW1lKTsKCQkJCQkJCX0KCQkJCQkJCWlmIChpc19hcnJheSgkY3JlZGl0cykpCgkJCQkJCQl7CgkJCQkJCQkJJGNyZWRpdHMgPSBhcnJheV92YWx1ZXMoU2ltcGxlUGllX01pc2M6OmFycmF5X3VuaXF1ZSgkY3JlZGl0cykpOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCWVsc2UKCQkJCQkJewoJCQkJCQkJJGNyZWRpdHMgPSAkY3JlZGl0c19wYXJlbnQ7CgkJCQkJCX0KCgkJCQkJCS8vIERFU0NSSVBUSU9OCgkJCQkJCWlmIChpc3NldCgkY29udGVudFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsnZGVzY3JpcHRpb24nXSkpCgkJCQkJCXsKCQkJCQkJCSRkZXNjcmlwdGlvbiA9ICR0aGlzLT5zYW5pdGl6ZSgkY29udGVudFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsnZGVzY3JpcHRpb24nXVswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQl9CgkJCQkJCWVsc2VpZiAoaXNzZXQoJGdyb3VwWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWydkZXNjcmlwdGlvbiddKSkKCQkJCQkJewoJCQkJCQkJJGRlc2NyaXB0aW9uID0gJHRoaXMtPnNhbml0aXplKCRncm91cFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsnZGVzY3JpcHRpb24nXVswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQl9CgkJCQkJCWVsc2UKCQkJCQkJewoJCQkJCQkJJGRlc2NyaXB0aW9uID0gJGRlc2NyaXB0aW9uX3BhcmVudDsKCQkJCQkJfQoKCQkJCQkJLy8gSEFTSEVTCgkJCQkJCWlmIChpc3NldCgkY29udGVudFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsnaGFzaCddKSkKCQkJCQkJewoJCQkJCQkJZm9yZWFjaCAoJGNvbnRlbnRbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ2hhc2gnXSBhcyAkaGFzaCkKCQkJCQkJCXsKCQkJCQkJCQkkdmFsdWUgPSBudWxsOwoJCQkJCQkJCSRhbGdvID0gbnVsbDsKCQkJCQkJCQlpZiAoaXNzZXQoJGhhc2hbJ2RhdGEnXSkpCgkJCQkJCQkJewoJCQkJCQkJCQkkdmFsdWUgPSAkdGhpcy0+c2FuaXRpemUoJGhhc2hbJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJCQl9CgkJCQkJCQkJaWYgKGlzc2V0KCRoYXNoWydhdHRyaWJzJ11bJyddWydhbGdvJ10pKQoJCQkJCQkJCXsKCQkJCQkJCQkJJGFsZ28gPSAkdGhpcy0+c2FuaXRpemUoJGhhc2hbJ2F0dHJpYnMnXVsnJ11bJ2FsZ28nXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJCQl9CgkJCQkJCQkJZWxzZQoJCQkJCQkJCXsKCQkJCQkJCQkJJGFsZ28gPSAnbWQ1JzsKCQkJCQkJCQl9CgkJCQkJCQkJJGhhc2hlc1tdID0gJGFsZ28uJzonLiR2YWx1ZTsKCQkJCQkJCX0KCQkJCQkJCWlmIChpc19hcnJheSgkaGFzaGVzKSkKCQkJCQkJCXsKCQkJCQkJCQkkaGFzaGVzID0gYXJyYXlfdmFsdWVzKFNpbXBsZVBpZV9NaXNjOjphcnJheV91bmlxdWUoJGhhc2hlcykpOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCWVsc2VpZiAoaXNzZXQoJGdyb3VwWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWydoYXNoJ10pKQoJCQkJCQl7CgkJCQkJCQlmb3JlYWNoICgkZ3JvdXBbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ2hhc2gnXSBhcyAkaGFzaCkKCQkJCQkJCXsKCQkJCQkJCQkkdmFsdWUgPSBudWxsOwoJCQkJCQkJCSRhbGdvID0gbnVsbDsKCQkJCQkJCQlpZiAoaXNzZXQoJGhhc2hbJ2RhdGEnXSkpCgkJCQkJCQkJewoJCQkJCQkJCQkkdmFsdWUgPSAkdGhpcy0+c2FuaXRpemUoJGhhc2hbJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJCQl9CgkJCQkJCQkJaWYgKGlzc2V0KCRoYXNoWydhdHRyaWJzJ11bJyddWydhbGdvJ10pKQoJCQkJCQkJCXsKCQkJCQkJCQkJJGFsZ28gPSAkdGhpcy0+c2FuaXRpemUoJGhhc2hbJ2F0dHJpYnMnXVsnJ11bJ2FsZ28nXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJCQl9CgkJCQkJCQkJZWxzZQoJCQkJCQkJCXsKCQkJCQkJCQkJJGFsZ28gPSAnbWQ1JzsKCQkJCQkJCQl9CgkJCQkJCQkJJGhhc2hlc1tdID0gJGFsZ28uJzonLiR2YWx1ZTsKCQkJCQkJCX0KCQkJCQkJCWlmIChpc19hcnJheSgkaGFzaGVzKSkKCQkJCQkJCXsKCQkJCQkJCQkkaGFzaGVzID0gYXJyYXlfdmFsdWVzKFNpbXBsZVBpZV9NaXNjOjphcnJheV91bmlxdWUoJGhhc2hlcykpOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCWVsc2UKCQkJCQkJewoJCQkJCQkJJGhhc2hlcyA9ICRoYXNoZXNfcGFyZW50OwoJCQkJCQl9CgoJCQkJCQkvLyBLRVlXT1JEUwoJCQkJCQlpZiAoaXNzZXQoJGNvbnRlbnRbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ2tleXdvcmRzJ10pKQoJCQkJCQl7CgkJCQkJCQlpZiAoaXNzZXQoJGNvbnRlbnRbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ2tleXdvcmRzJ11bMF1bJ2RhdGEnXSkpCgkJCQkJCQl7CgkJCQkJCQkJJHRlbXAgPSBleHBsb2RlKCcsJywgJHRoaXMtPnNhbml0aXplKCRjb250ZW50WydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWydrZXl3b3JkcyddWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCkpOwoJCQkJCQkJCWZvcmVhY2ggKCR0ZW1wIGFzICR3b3JkKQoJCQkJCQkJCXsKCQkJCQkJCQkJJGtleXdvcmRzW10gPSB0cmltKCR3b3JkKTsKCQkJCQkJCQl9CgkJCQkJCQkJdW5zZXQoJHRlbXApOwoJCQkJCQkJfQoJCQkJCQkJaWYgKGlzX2FycmF5KCRrZXl3b3JkcykpCgkJCQkJCQl7CgkJCQkJCQkJJGtleXdvcmRzID0gYXJyYXlfdmFsdWVzKFNpbXBsZVBpZV9NaXNjOjphcnJheV91bmlxdWUoJGtleXdvcmRzKSk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQkJZWxzZWlmIChpc3NldCgkZ3JvdXBbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ2tleXdvcmRzJ10pKQoJCQkJCQl7CgkJCQkJCQlpZiAoaXNzZXQoJGdyb3VwWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWydrZXl3b3JkcyddWzBdWydkYXRhJ10pKQoJCQkJCQkJewoJCQkJCQkJCSR0ZW1wID0gZXhwbG9kZSgnLCcsICR0aGlzLT5zYW5pdGl6ZSgkZ3JvdXBbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ2tleXdvcmRzJ11bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKSk7CgkJCQkJCQkJZm9yZWFjaCAoJHRlbXAgYXMgJHdvcmQpCgkJCQkJCQkJewoJCQkJCQkJCQkka2V5d29yZHNbXSA9IHRyaW0oJHdvcmQpOwoJCQkJCQkJCX0KCQkJCQkJCQl1bnNldCgkdGVtcCk7CgkJCQkJCQl9CgkJCQkJCQlpZiAoaXNfYXJyYXkoJGtleXdvcmRzKSkKCQkJCQkJCXsKCQkJCQkJCQkka2V5d29yZHMgPSBhcnJheV92YWx1ZXMoU2ltcGxlUGllX01pc2M6OmFycmF5X3VuaXF1ZSgka2V5d29yZHMpKTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQllbHNlCgkJCQkJCXsKCQkJCQkJCSRrZXl3b3JkcyA9ICRrZXl3b3Jkc19wYXJlbnQ7CgkJCQkJCX0KCgkJCQkJCS8vIFBMQVlFUgoJCQkJCQlpZiAoaXNzZXQoJGNvbnRlbnRbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ3BsYXllciddKSkKCQkJCQkJewoJCQkJCQkJJHBsYXllciA9ICR0aGlzLT5zYW5pdGl6ZSgkY29udGVudFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsncGxheWVyJ11bMF1bJ2F0dHJpYnMnXVsnJ11bJ3VybCddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSk7CgkJCQkJCX0KCQkJCQkJZWxzZWlmIChpc3NldCgkZ3JvdXBbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ3BsYXllciddKSkKCQkJCQkJewoJCQkJCQkJJHBsYXllciA9ICR0aGlzLT5zYW5pdGl6ZSgkZ3JvdXBbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ3BsYXllciddWzBdWydhdHRyaWJzJ11bJyddWyd1cmwnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9JUkkpOwoJCQkJCQl9CgkJCQkJCWVsc2UKCQkJCQkJewoJCQkJCQkJJHBsYXllciA9ICRwbGF5ZXJfcGFyZW50OwoJCQkJCQl9CgoJCQkJCQkvLyBSQVRJTkdTCgkJCQkJCWlmIChpc3NldCgkY29udGVudFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsncmF0aW5nJ10pKQoJCQkJCQl7CgkJCQkJCQlmb3JlYWNoICgkY29udGVudFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsncmF0aW5nJ10gYXMgJHJhdGluZykKCQkJCQkJCXsKCQkJCQkJCQkkcmF0aW5nX3NjaGVtZSA9IG51bGw7CgkJCQkJCQkJJHJhdGluZ192YWx1ZSA9IG51bGw7CgkJCQkJCQkJaWYgKGlzc2V0KCRyYXRpbmdbJ2F0dHJpYnMnXVsnJ11bJ3NjaGVtZSddKSkKCQkJCQkJCQl7CgkJCQkJCQkJCSRyYXRpbmdfc2NoZW1lID0gJHRoaXMtPnNhbml0aXplKCRyYXRpbmdbJ2F0dHJpYnMnXVsnJ11bJ3NjaGVtZSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQkJCX0KCQkJCQkJCQllbHNlCgkJCQkJCQkJewoJCQkJCQkJCQkkcmF0aW5nX3NjaGVtZSA9ICd1cm46c2ltcGxlJzsKCQkJCQkJCQl9CgkJCQkJCQkJaWYgKGlzc2V0KCRyYXRpbmdbJ2RhdGEnXSkpCgkJCQkJCQkJewoJCQkJCQkJCQkkcmF0aW5nX3ZhbHVlID0gJHRoaXMtPnNhbml0aXplKCRyYXRpbmdbJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJCQl9CgkJCQkJCQkJJHJhdGluZ3NbXSA9JiBuZXcgJHRoaXMtPmZlZWQtPnJhdGluZ19jbGFzcygkcmF0aW5nX3NjaGVtZSwgJHJhdGluZ192YWx1ZSk7CgkJCQkJCQl9CgkJCQkJCQlpZiAoaXNfYXJyYXkoJHJhdGluZ3MpKQoJCQkJCQkJewoJCQkJCQkJCSRyYXRpbmdzID0gYXJyYXlfdmFsdWVzKFNpbXBsZVBpZV9NaXNjOjphcnJheV91bmlxdWUoJHJhdGluZ3MpKTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQllbHNlaWYgKGlzc2V0KCRncm91cFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsncmF0aW5nJ10pKQoJCQkJCQl7CgkJCQkJCQlmb3JlYWNoICgkZ3JvdXBbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ3JhdGluZyddIGFzICRyYXRpbmcpCgkJCQkJCQl7CgkJCQkJCQkJJHJhdGluZ19zY2hlbWUgPSBudWxsOwoJCQkJCQkJCSRyYXRpbmdfdmFsdWUgPSBudWxsOwoJCQkJCQkJCWlmIChpc3NldCgkcmF0aW5nWydhdHRyaWJzJ11bJyddWydzY2hlbWUnXSkpCgkJCQkJCQkJewoJCQkJCQkJCQkkcmF0aW5nX3NjaGVtZSA9ICR0aGlzLT5zYW5pdGl6ZSgkcmF0aW5nWydhdHRyaWJzJ11bJyddWydzY2hlbWUnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJCQl9CgkJCQkJCQkJZWxzZQoJCQkJCQkJCXsKCQkJCQkJCQkJJHJhdGluZ19zY2hlbWUgPSAndXJuOnNpbXBsZSc7CgkJCQkJCQkJfQoJCQkJCQkJCWlmIChpc3NldCgkcmF0aW5nWydkYXRhJ10pKQoJCQkJCQkJCXsKCQkJCQkJCQkJJHJhdGluZ192YWx1ZSA9ICR0aGlzLT5zYW5pdGl6ZSgkcmF0aW5nWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCQkJfQoJCQkJCQkJCSRyYXRpbmdzW10gPSYgbmV3ICR0aGlzLT5mZWVkLT5yYXRpbmdfY2xhc3MoJHJhdGluZ19zY2hlbWUsICRyYXRpbmdfdmFsdWUpOwoJCQkJCQkJfQoJCQkJCQkJaWYgKGlzX2FycmF5KCRyYXRpbmdzKSkKCQkJCQkJCXsKCQkJCQkJCQkkcmF0aW5ncyA9IGFycmF5X3ZhbHVlcyhTaW1wbGVQaWVfTWlzYzo6YXJyYXlfdW5pcXVlKCRyYXRpbmdzKSk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQkJZWxzZQoJCQkJCQl7CgkJCQkJCQkkcmF0aW5ncyA9ICRyYXRpbmdzX3BhcmVudDsKCQkJCQkJfQoKCQkJCQkJLy8gUkVTVFJJQ1RJT05TCgkJCQkJCWlmIChpc3NldCgkY29udGVudFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsncmVzdHJpY3Rpb24nXSkpCgkJCQkJCXsKCQkJCQkJCWZvcmVhY2ggKCRjb250ZW50WydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWydyZXN0cmljdGlvbiddIGFzICRyZXN0cmljdGlvbikKCQkJCQkJCXsKCQkJCQkJCQkkcmVzdHJpY3Rpb25fcmVsYXRpb25zaGlwID0gbnVsbDsKCQkJCQkJCQkkcmVzdHJpY3Rpb25fdHlwZSA9IG51bGw7CgkJCQkJCQkJJHJlc3RyaWN0aW9uX3ZhbHVlID0gbnVsbDsKCQkJCQkJCQlpZiAoaXNzZXQoJHJlc3RyaWN0aW9uWydhdHRyaWJzJ11bJyddWydyZWxhdGlvbnNoaXAnXSkpCgkJCQkJCQkJewoJCQkJCQkJCQkkcmVzdHJpY3Rpb25fcmVsYXRpb25zaGlwID0gJHRoaXMtPnNhbml0aXplKCRyZXN0cmljdGlvblsnYXR0cmlicyddWycnXVsncmVsYXRpb25zaGlwJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCQkJfQoJCQkJCQkJCWlmIChpc3NldCgkcmVzdHJpY3Rpb25bJ2F0dHJpYnMnXVsnJ11bJ3R5cGUnXSkpCgkJCQkJCQkJewoJCQkJCQkJCQkkcmVzdHJpY3Rpb25fdHlwZSA9ICR0aGlzLT5zYW5pdGl6ZSgkcmVzdHJpY3Rpb25bJ2F0dHJpYnMnXVsnJ11bJ3R5cGUnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJCQl9CgkJCQkJCQkJaWYgKGlzc2V0KCRyZXN0cmljdGlvblsnZGF0YSddKSkKCQkJCQkJCQl7CgkJCQkJCQkJCSRyZXN0cmljdGlvbl92YWx1ZSA9ICR0aGlzLT5zYW5pdGl6ZSgkcmVzdHJpY3Rpb25bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJCQl9CgkJCQkJCQkJJHJlc3RyaWN0aW9uc1tdID0mIG5ldyAkdGhpcy0+ZmVlZC0+cmVzdHJpY3Rpb25fY2xhc3MoJHJlc3RyaWN0aW9uX3JlbGF0aW9uc2hpcCwgJHJlc3RyaWN0aW9uX3R5cGUsICRyZXN0cmljdGlvbl92YWx1ZSk7CgkJCQkJCQl9CgkJCQkJCQlpZiAoaXNfYXJyYXkoJHJlc3RyaWN0aW9ucykpCgkJCQkJCQl7CgkJCQkJCQkJJHJlc3RyaWN0aW9ucyA9IGFycmF5X3ZhbHVlcyhTaW1wbGVQaWVfTWlzYzo6YXJyYXlfdW5pcXVlKCRyZXN0cmljdGlvbnMpKTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQllbHNlaWYgKGlzc2V0KCRncm91cFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsncmVzdHJpY3Rpb24nXSkpCgkJCQkJCXsKCQkJCQkJCWZvcmVhY2ggKCRncm91cFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsncmVzdHJpY3Rpb24nXSBhcyAkcmVzdHJpY3Rpb24pCgkJCQkJCQl7CgkJCQkJCQkJJHJlc3RyaWN0aW9uX3JlbGF0aW9uc2hpcCA9IG51bGw7CgkJCQkJCQkJJHJlc3RyaWN0aW9uX3R5cGUgPSBudWxsOwoJCQkJCQkJCSRyZXN0cmljdGlvbl92YWx1ZSA9IG51bGw7CgkJCQkJCQkJaWYgKGlzc2V0KCRyZXN0cmljdGlvblsnYXR0cmlicyddWycnXVsncmVsYXRpb25zaGlwJ10pKQoJCQkJCQkJCXsKCQkJCQkJCQkJJHJlc3RyaWN0aW9uX3JlbGF0aW9uc2hpcCA9ICR0aGlzLT5zYW5pdGl6ZSgkcmVzdHJpY3Rpb25bJ2F0dHJpYnMnXVsnJ11bJ3JlbGF0aW9uc2hpcCddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQkJCX0KCQkJCQkJCQlpZiAoaXNzZXQoJHJlc3RyaWN0aW9uWydhdHRyaWJzJ11bJyddWyd0eXBlJ10pKQoJCQkJCQkJCXsKCQkJCQkJCQkJJHJlc3RyaWN0aW9uX3R5cGUgPSAkdGhpcy0+c2FuaXRpemUoJHJlc3RyaWN0aW9uWydhdHRyaWJzJ11bJyddWyd0eXBlJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCQkJfQoJCQkJCQkJCWlmIChpc3NldCgkcmVzdHJpY3Rpb25bJ2RhdGEnXSkpCgkJCQkJCQkJewoJCQkJCQkJCQkkcmVzdHJpY3Rpb25fdmFsdWUgPSAkdGhpcy0+c2FuaXRpemUoJHJlc3RyaWN0aW9uWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCQkJfQoJCQkJCQkJCSRyZXN0cmljdGlvbnNbXSA9JiBuZXcgJHRoaXMtPmZlZWQtPnJlc3RyaWN0aW9uX2NsYXNzKCRyZXN0cmljdGlvbl9yZWxhdGlvbnNoaXAsICRyZXN0cmljdGlvbl90eXBlLCAkcmVzdHJpY3Rpb25fdmFsdWUpOwoJCQkJCQkJfQoJCQkJCQkJaWYgKGlzX2FycmF5KCRyZXN0cmljdGlvbnMpKQoJCQkJCQkJewoJCQkJCQkJCSRyZXN0cmljdGlvbnMgPSBhcnJheV92YWx1ZXMoU2ltcGxlUGllX01pc2M6OmFycmF5X3VuaXF1ZSgkcmVzdHJpY3Rpb25zKSk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQkJZWxzZQoJCQkJCQl7CgkJCQkJCQkkcmVzdHJpY3Rpb25zID0gJHJlc3RyaWN0aW9uc19wYXJlbnQ7CgkJCQkJCX0KCgkJCQkJCS8vIFRIVU1CTkFJTFMKCQkJCQkJaWYgKGlzc2V0KCRjb250ZW50WydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWyd0aHVtYm5haWwnXSkpCgkJCQkJCXsKCQkJCQkJCWZvcmVhY2ggKCRjb250ZW50WydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWyd0aHVtYm5haWwnXSBhcyAkdGh1bWJuYWlsKQoJCQkJCQkJewoJCQkJCQkJCSR0aHVtYm5haWxzW10gPSAkdGhpcy0+c2FuaXRpemUoJHRodW1ibmFpbFsnYXR0cmlicyddWycnXVsndXJsJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfSVJJKTsKCQkJCQkJCX0KCQkJCQkJCWlmIChpc19hcnJheSgkdGh1bWJuYWlscykpCgkJCQkJCQl7CgkJCQkJCQkJJHRodW1ibmFpbHMgPSBhcnJheV92YWx1ZXMoU2ltcGxlUGllX01pc2M6OmFycmF5X3VuaXF1ZSgkdGh1bWJuYWlscykpOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCWVsc2VpZiAoaXNzZXQoJGdyb3VwWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWyd0aHVtYm5haWwnXSkpCgkJCQkJCXsKCQkJCQkJCWZvcmVhY2ggKCRncm91cFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsndGh1bWJuYWlsJ10gYXMgJHRodW1ibmFpbCkKCQkJCQkJCXsKCQkJCQkJCQkkdGh1bWJuYWlsc1tdID0gJHRoaXMtPnNhbml0aXplKCR0aHVtYm5haWxbJ2F0dHJpYnMnXVsnJ11bJ3VybCddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSk7CgkJCQkJCQl9CgkJCQkJCQlpZiAoaXNfYXJyYXkoJHRodW1ibmFpbHMpKQoJCQkJCQkJewoJCQkJCQkJCSR0aHVtYm5haWxzID0gYXJyYXlfdmFsdWVzKFNpbXBsZVBpZV9NaXNjOjphcnJheV91bmlxdWUoJHRodW1ibmFpbHMpKTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQllbHNlCgkJCQkJCXsKCQkJCQkJCSR0aHVtYm5haWxzID0gJHRodW1ibmFpbHNfcGFyZW50OwoJCQkJCQl9CgoJCQkJCQkvLyBUSVRMRVMKCQkJCQkJaWYgKGlzc2V0KCRjb250ZW50WydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWyd0aXRsZSddKSkKCQkJCQkJewoJCQkJCQkJJHRpdGxlID0gJHRoaXMtPnNhbml0aXplKCRjb250ZW50WydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWyd0aXRsZSddWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCX0KCQkJCQkJZWxzZWlmIChpc3NldCgkZ3JvdXBbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ3RpdGxlJ10pKQoJCQkJCQl7CgkJCQkJCQkkdGl0bGUgPSAkdGhpcy0+c2FuaXRpemUoJGdyb3VwWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWyd0aXRsZSddWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCX0KCQkJCQkJZWxzZQoJCQkJCQl7CgkJCQkJCQkkdGl0bGUgPSAkdGl0bGVfcGFyZW50OwoJCQkJCQl9CgoJCQkJCQkkdGhpcy0+ZGF0YVsnZW5jbG9zdXJlcyddW10gPSYgbmV3ICR0aGlzLT5mZWVkLT5lbmNsb3N1cmVfY2xhc3MoJHVybCwgJHR5cGUsICRsZW5ndGgsICR0aGlzLT5mZWVkLT5qYXZhc2NyaXB0LCAkYml0cmF0ZSwgJGNhcHRpb25zLCAkY2F0ZWdvcmllcywgJGNoYW5uZWxzLCAkY29weXJpZ2h0cywgJGNyZWRpdHMsICRkZXNjcmlwdGlvbiwgJGR1cmF0aW9uLCAkZXhwcmVzc2lvbiwgJGZyYW1lcmF0ZSwgJGhhc2hlcywgJGhlaWdodCwgJGtleXdvcmRzLCAkbGFuZywgJG1lZGl1bSwgJHBsYXllciwgJHJhdGluZ3MsICRyZXN0cmljdGlvbnMsICRzYW1wbGluZ3JhdGUsICR0aHVtYm5haWxzLCAkdGl0bGUsICR3aWR0aCk7CgkJCQkJfQoJCQkJfQoJCQl9CgoJCQkvLyBJZiB3ZSBoYXZlIHN0YW5kYWxvbmUgbWVkaWE6Y29udGVudCB0YWdzLCBsb29wIHRocm91Z2ggdGhlbS4KCQkJaWYgKGlzc2V0KCR0aGlzLT5kYXRhWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWydjb250ZW50J10pKQoJCQl7CgkJCQlmb3JlYWNoICgoYXJyYXkpICR0aGlzLT5kYXRhWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWydjb250ZW50J10gYXMgJGNvbnRlbnQpCgkJCQl7CgkJCQkJaWYgKGlzc2V0KCRjb250ZW50WydhdHRyaWJzJ11bJyddWyd1cmwnXSkpCgkJCQkJewoJCQkJCQkvLyBBdHRyaWJ1dGVzCgkJCQkJCSRiaXRyYXRlID0gbnVsbDsKCQkJCQkJJGNoYW5uZWxzID0gbnVsbDsKCQkJCQkJJGR1cmF0aW9uID0gbnVsbDsKCQkJCQkJJGV4cHJlc3Npb24gPSBudWxsOwoJCQkJCQkkZnJhbWVyYXRlID0gbnVsbDsKCQkJCQkJJGhlaWdodCA9IG51bGw7CgkJCQkJCSRqYXZhc2NyaXB0ID0gbnVsbDsKCQkJCQkJJGxhbmcgPSBudWxsOwoJCQkJCQkkbGVuZ3RoID0gbnVsbDsKCQkJCQkJJG1lZGl1bSA9IG51bGw7CgkJCQkJCSRzYW1wbGluZ3JhdGUgPSBudWxsOwoJCQkJCQkkdHlwZSA9IG51bGw7CgkJCQkJCSR1cmwgPSBudWxsOwoJCQkJCQkkd2lkdGggPSBudWxsOwoKCQkJCQkJLy8gRWxlbWVudHMKCQkJCQkJJGNhcHRpb25zID0gbnVsbDsKCQkJCQkJJGNhdGVnb3JpZXMgPSBudWxsOwoJCQkJCQkkY29weXJpZ2h0cyA9IG51bGw7CgkJCQkJCSRjcmVkaXRzID0gbnVsbDsKCQkJCQkJJGRlc2NyaXB0aW9uID0gbnVsbDsKCQkJCQkJJGhhc2hlcyA9IG51bGw7CgkJCQkJCSRrZXl3b3JkcyA9IG51bGw7CgkJCQkJCSRwbGF5ZXIgPSBudWxsOwoJCQkJCQkkcmF0aW5ncyA9IG51bGw7CgkJCQkJCSRyZXN0cmljdGlvbnMgPSBudWxsOwoJCQkJCQkkdGh1bWJuYWlscyA9IG51bGw7CgkJCQkJCSR0aXRsZSA9IG51bGw7CgoJCQkJCQkvLyBTdGFydCBjaGVja2luZyB0aGUgYXR0cmlidXRlcyBvZiBtZWRpYTpjb250ZW50CgkJCQkJCWlmIChpc3NldCgkY29udGVudFsnYXR0cmlicyddWycnXVsnYml0cmF0ZSddKSkKCQkJCQkJewoJCQkJCQkJJGJpdHJhdGUgPSAkdGhpcy0+c2FuaXRpemUoJGNvbnRlbnRbJ2F0dHJpYnMnXVsnJ11bJ2JpdHJhdGUnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJfQoJCQkJCQlpZiAoaXNzZXQoJGNvbnRlbnRbJ2F0dHJpYnMnXVsnJ11bJ2NoYW5uZWxzJ10pKQoJCQkJCQl7CgkJCQkJCQkkY2hhbm5lbHMgPSAkdGhpcy0+c2FuaXRpemUoJGNvbnRlbnRbJ2F0dHJpYnMnXVsnJ11bJ2NoYW5uZWxzJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCX0KCQkJCQkJaWYgKGlzc2V0KCRjb250ZW50WydhdHRyaWJzJ11bJyddWydkdXJhdGlvbiddKSkKCQkJCQkJewoJCQkJCQkJJGR1cmF0aW9uID0gJHRoaXMtPnNhbml0aXplKCRjb250ZW50WydhdHRyaWJzJ11bJyddWydkdXJhdGlvbiddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQl9CgkJCQkJCWVsc2UKCQkJCQkJewoJCQkJCQkJJGR1cmF0aW9uID0gJGR1cmF0aW9uX3BhcmVudDsKCQkJCQkJfQoJCQkJCQlpZiAoaXNzZXQoJGNvbnRlbnRbJ2F0dHJpYnMnXVsnJ11bJ2V4cHJlc3Npb24nXSkpCgkJCQkJCXsKCQkJCQkJCSRleHByZXNzaW9uID0gJHRoaXMtPnNhbml0aXplKCRjb250ZW50WydhdHRyaWJzJ11bJyddWydleHByZXNzaW9uJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCX0KCQkJCQkJaWYgKGlzc2V0KCRjb250ZW50WydhdHRyaWJzJ11bJyddWydmcmFtZXJhdGUnXSkpCgkJCQkJCXsKCQkJCQkJCSRmcmFtZXJhdGUgPSAkdGhpcy0+c2FuaXRpemUoJGNvbnRlbnRbJ2F0dHJpYnMnXVsnJ11bJ2ZyYW1lcmF0ZSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQl9CgkJCQkJCWlmIChpc3NldCgkY29udGVudFsnYXR0cmlicyddWycnXVsnaGVpZ2h0J10pKQoJCQkJCQl7CgkJCQkJCQkkaGVpZ2h0ID0gJHRoaXMtPnNhbml0aXplKCRjb250ZW50WydhdHRyaWJzJ11bJyddWydoZWlnaHQnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJfQoJCQkJCQlpZiAoaXNzZXQoJGNvbnRlbnRbJ2F0dHJpYnMnXVsnJ11bJ2xhbmcnXSkpCgkJCQkJCXsKCQkJCQkJCSRsYW5nID0gJHRoaXMtPnNhbml0aXplKCRjb250ZW50WydhdHRyaWJzJ11bJyddWydsYW5nJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCX0KCQkJCQkJaWYgKGlzc2V0KCRjb250ZW50WydhdHRyaWJzJ11bJyddWydmaWxlU2l6ZSddKSkKCQkJCQkJewoJCQkJCQkJJGxlbmd0aCA9IGNlaWwoJGNvbnRlbnRbJ2F0dHJpYnMnXVsnJ11bJ2ZpbGVTaXplJ10pOwoJCQkJCQl9CgkJCQkJCWlmIChpc3NldCgkY29udGVudFsnYXR0cmlicyddWycnXVsnbWVkaXVtJ10pKQoJCQkJCQl7CgkJCQkJCQkkbWVkaXVtID0gJHRoaXMtPnNhbml0aXplKCRjb250ZW50WydhdHRyaWJzJ11bJyddWydtZWRpdW0nXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJfQoJCQkJCQlpZiAoaXNzZXQoJGNvbnRlbnRbJ2F0dHJpYnMnXVsnJ11bJ3NhbXBsaW5ncmF0ZSddKSkKCQkJCQkJewoJCQkJCQkJJHNhbXBsaW5ncmF0ZSA9ICR0aGlzLT5zYW5pdGl6ZSgkY29udGVudFsnYXR0cmlicyddWycnXVsnc2FtcGxpbmdyYXRlJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCX0KCQkJCQkJaWYgKGlzc2V0KCRjb250ZW50WydhdHRyaWJzJ11bJyddWyd0eXBlJ10pKQoJCQkJCQl7CgkJCQkJCQkkdHlwZSA9ICR0aGlzLT5zYW5pdGl6ZSgkY29udGVudFsnYXR0cmlicyddWycnXVsndHlwZSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQl9CgkJCQkJCWlmIChpc3NldCgkY29udGVudFsnYXR0cmlicyddWycnXVsnd2lkdGgnXSkpCgkJCQkJCXsKCQkJCQkJCSR3aWR0aCA9ICR0aGlzLT5zYW5pdGl6ZSgkY29udGVudFsnYXR0cmlicyddWycnXVsnd2lkdGgnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJfQoJCQkJCQkkdXJsID0gJHRoaXMtPnNhbml0aXplKCRjb250ZW50WydhdHRyaWJzJ11bJyddWyd1cmwnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9JUkkpOwoKCQkJCQkJLy8gQ2hlY2tpbmcgdGhlIG90aGVyIG9wdGlvbmFsIG1lZGlhOiBlbGVtZW50cy4gUHJpb3JpdHk6IG1lZGlhOmNvbnRlbnQsIG1lZGlhOmdyb3VwLCBpdGVtLCBjaGFubmVsCgoJCQkJCQkvLyBDQVBUSU9OUwoJCQkJCQlpZiAoaXNzZXQoJGNvbnRlbnRbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ3RleHQnXSkpCgkJCQkJCXsKCQkJCQkJCWZvcmVhY2ggKCRjb250ZW50WydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWyd0ZXh0J10gYXMgJGNhcHRpb24pCgkJCQkJCQl7CgkJCQkJCQkJJGNhcHRpb25fdHlwZSA9IG51bGw7CgkJCQkJCQkJJGNhcHRpb25fbGFuZyA9IG51bGw7CgkJCQkJCQkJJGNhcHRpb25fc3RhcnRUaW1lID0gbnVsbDsKCQkJCQkJCQkkY2FwdGlvbl9lbmRUaW1lID0gbnVsbDsKCQkJCQkJCQkkY2FwdGlvbl90ZXh0ID0gbnVsbDsKCQkJCQkJCQlpZiAoaXNzZXQoJGNhcHRpb25bJ2F0dHJpYnMnXVsnJ11bJ3R5cGUnXSkpCgkJCQkJCQkJewoJCQkJCQkJCQkkY2FwdGlvbl90eXBlID0gJHRoaXMtPnNhbml0aXplKCRjYXB0aW9uWydhdHRyaWJzJ11bJyddWyd0eXBlJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCQkJfQoJCQkJCQkJCWlmIChpc3NldCgkY2FwdGlvblsnYXR0cmlicyddWycnXVsnbGFuZyddKSkKCQkJCQkJCQl7CgkJCQkJCQkJCSRjYXB0aW9uX2xhbmcgPSAkdGhpcy0+c2FuaXRpemUoJGNhcHRpb25bJ2F0dHJpYnMnXVsnJ11bJ2xhbmcnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJCQl9CgkJCQkJCQkJaWYgKGlzc2V0KCRjYXB0aW9uWydhdHRyaWJzJ11bJyddWydzdGFydCddKSkKCQkJCQkJCQl7CgkJCQkJCQkJCSRjYXB0aW9uX3N0YXJ0VGltZSA9ICR0aGlzLT5zYW5pdGl6ZSgkY2FwdGlvblsnYXR0cmlicyddWycnXVsnc3RhcnQnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJCQl9CgkJCQkJCQkJaWYgKGlzc2V0KCRjYXB0aW9uWydhdHRyaWJzJ11bJyddWydlbmQnXSkpCgkJCQkJCQkJewoJCQkJCQkJCQkkY2FwdGlvbl9lbmRUaW1lID0gJHRoaXMtPnNhbml0aXplKCRjYXB0aW9uWydhdHRyaWJzJ11bJyddWydlbmQnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJCQl9CgkJCQkJCQkJaWYgKGlzc2V0KCRjYXB0aW9uWydkYXRhJ10pKQoJCQkJCQkJCXsKCQkJCQkJCQkJJGNhcHRpb25fdGV4dCA9ICR0aGlzLT5zYW5pdGl6ZSgkY2FwdGlvblsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQkJCX0KCQkJCQkJCQkkY2FwdGlvbnNbXSA9JiBuZXcgJHRoaXMtPmZlZWQtPmNhcHRpb25fY2xhc3MoJGNhcHRpb25fdHlwZSwgJGNhcHRpb25fbGFuZywgJGNhcHRpb25fc3RhcnRUaW1lLCAkY2FwdGlvbl9lbmRUaW1lLCAkY2FwdGlvbl90ZXh0KTsKCQkJCQkJCX0KCQkJCQkJCWlmIChpc19hcnJheSgkY2FwdGlvbnMpKQoJCQkJCQkJewoJCQkJCQkJCSRjYXB0aW9ucyA9IGFycmF5X3ZhbHVlcyhTaW1wbGVQaWVfTWlzYzo6YXJyYXlfdW5pcXVlKCRjYXB0aW9ucykpOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCWVsc2UKCQkJCQkJewoJCQkJCQkJJGNhcHRpb25zID0gJGNhcHRpb25zX3BhcmVudDsKCQkJCQkJfQoKCQkJCQkJLy8gQ0FURUdPUklFUwoJCQkJCQlpZiAoaXNzZXQoJGNvbnRlbnRbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ2NhdGVnb3J5J10pKQoJCQkJCQl7CgkJCQkJCQlmb3JlYWNoICgoYXJyYXkpICRjb250ZW50WydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWydjYXRlZ29yeSddIGFzICRjYXRlZ29yeSkKCQkJCQkJCXsKCQkJCQkJCQkkdGVybSA9IG51bGw7CgkJCQkJCQkJJHNjaGVtZSA9IG51bGw7CgkJCQkJCQkJJGxhYmVsID0gbnVsbDsKCQkJCQkJCQlpZiAoaXNzZXQoJGNhdGVnb3J5WydkYXRhJ10pKQoJCQkJCQkJCXsKCQkJCQkJCQkJJHRlcm0gPSAkdGhpcy0+c2FuaXRpemUoJGNhdGVnb3J5WydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCQkJfQoJCQkJCQkJCWlmIChpc3NldCgkY2F0ZWdvcnlbJ2F0dHJpYnMnXVsnJ11bJ3NjaGVtZSddKSkKCQkJCQkJCQl7CgkJCQkJCQkJCSRzY2hlbWUgPSAkdGhpcy0+c2FuaXRpemUoJGNhdGVnb3J5WydhdHRyaWJzJ11bJyddWydzY2hlbWUnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJCQl9CgkJCQkJCQkJZWxzZQoJCQkJCQkJCXsKCQkJCQkJCQkJJHNjaGVtZSA9ICdodHRwOi8vc2VhcmNoLnlhaG9vLmNvbS9tcnNzL2NhdGVnb3J5X3NjaGVtYSc7CgkJCQkJCQkJfQoJCQkJCQkJCWlmIChpc3NldCgkY2F0ZWdvcnlbJ2F0dHJpYnMnXVsnJ11bJ2xhYmVsJ10pKQoJCQkJCQkJCXsKCQkJCQkJCQkJJGxhYmVsID0gJHRoaXMtPnNhbml0aXplKCRjYXRlZ29yeVsnYXR0cmlicyddWycnXVsnbGFiZWwnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJCQl9CgkJCQkJCQkJJGNhdGVnb3JpZXNbXSA9JiBuZXcgJHRoaXMtPmZlZWQtPmNhdGVnb3J5X2NsYXNzKCR0ZXJtLCAkc2NoZW1lLCAkbGFiZWwpOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCWlmIChpc19hcnJheSgkY2F0ZWdvcmllcykgJiYgaXNfYXJyYXkoJGNhdGVnb3JpZXNfcGFyZW50KSkKCQkJCQkJewoJCQkJCQkJJGNhdGVnb3JpZXMgPSBhcnJheV92YWx1ZXMoU2ltcGxlUGllX01pc2M6OmFycmF5X3VuaXF1ZShhcnJheV9tZXJnZSgkY2F0ZWdvcmllcywgJGNhdGVnb3JpZXNfcGFyZW50KSkpOwoJCQkJCQl9CgkJCQkJCWVsc2VpZiAoaXNfYXJyYXkoJGNhdGVnb3JpZXMpKQoJCQkJCQl7CgkJCQkJCQkkY2F0ZWdvcmllcyA9IGFycmF5X3ZhbHVlcyhTaW1wbGVQaWVfTWlzYzo6YXJyYXlfdW5pcXVlKCRjYXRlZ29yaWVzKSk7CgkJCQkJCX0KCQkJCQkJZWxzZWlmIChpc19hcnJheSgkY2F0ZWdvcmllc19wYXJlbnQpKQoJCQkJCQl7CgkJCQkJCQkkY2F0ZWdvcmllcyA9IGFycmF5X3ZhbHVlcyhTaW1wbGVQaWVfTWlzYzo6YXJyYXlfdW5pcXVlKCRjYXRlZ29yaWVzX3BhcmVudCkpOwoJCQkJCQl9CgkJCQkJCWVsc2UKCQkJCQkJewoJCQkJCQkJJGNhdGVnb3JpZXMgPSBudWxsOwoJCQkJCQl9CgoJCQkJCQkvLyBDT1BZUklHSFRTCgkJCQkJCWlmIChpc3NldCgkY29udGVudFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsnY29weXJpZ2h0J10pKQoJCQkJCQl7CgkJCQkJCQkkY29weXJpZ2h0X3VybCA9IG51bGw7CgkJCQkJCQkkY29weXJpZ2h0X2xhYmVsID0gbnVsbDsKCQkJCQkJCWlmIChpc3NldCgkY29udGVudFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsnY29weXJpZ2h0J11bMF1bJ2F0dHJpYnMnXVsnJ11bJ3VybCddKSkKCQkJCQkJCXsKCQkJCQkJCQkkY29weXJpZ2h0X3VybCA9ICR0aGlzLT5zYW5pdGl6ZSgkY29udGVudFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsnY29weXJpZ2h0J11bMF1bJ2F0dHJpYnMnXVsnJ11bJ3VybCddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQkJfQoJCQkJCQkJaWYgKGlzc2V0KCRjb250ZW50WydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWydjb3B5cmlnaHQnXVswXVsnZGF0YSddKSkKCQkJCQkJCXsKCQkJCQkJCQkkY29weXJpZ2h0X2xhYmVsID0gJHRoaXMtPnNhbml0aXplKCRjb250ZW50WydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWydjb3B5cmlnaHQnXVswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQkJfQoJCQkJCQkJJGNvcHlyaWdodHMgPSYgbmV3ICR0aGlzLT5mZWVkLT5jb3B5cmlnaHRfY2xhc3MoJGNvcHlyaWdodF91cmwsICRjb3B5cmlnaHRfbGFiZWwpOwoJCQkJCQl9CgkJCQkJCWVsc2UKCQkJCQkJewoJCQkJCQkJJGNvcHlyaWdodHMgPSAkY29weXJpZ2h0c19wYXJlbnQ7CgkJCQkJCX0KCgkJCQkJCS8vIENSRURJVFMKCQkJCQkJaWYgKGlzc2V0KCRjb250ZW50WydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWydjcmVkaXQnXSkpCgkJCQkJCXsKCQkJCQkJCWZvcmVhY2ggKCRjb250ZW50WydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWydjcmVkaXQnXSBhcyAkY3JlZGl0KQoJCQkJCQkJewoJCQkJCQkJCSRjcmVkaXRfcm9sZSA9IG51bGw7CgkJCQkJCQkJJGNyZWRpdF9zY2hlbWUgPSBudWxsOwoJCQkJCQkJCSRjcmVkaXRfbmFtZSA9IG51bGw7CgkJCQkJCQkJaWYgKGlzc2V0KCRjcmVkaXRbJ2F0dHJpYnMnXVsnJ11bJ3JvbGUnXSkpCgkJCQkJCQkJewoJCQkJCQkJCQkkY3JlZGl0X3JvbGUgPSAkdGhpcy0+c2FuaXRpemUoJGNyZWRpdFsnYXR0cmlicyddWycnXVsncm9sZSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQkJCX0KCQkJCQkJCQlpZiAoaXNzZXQoJGNyZWRpdFsnYXR0cmlicyddWycnXVsnc2NoZW1lJ10pKQoJCQkJCQkJCXsKCQkJCQkJCQkJJGNyZWRpdF9zY2hlbWUgPSAkdGhpcy0+c2FuaXRpemUoJGNyZWRpdFsnYXR0cmlicyddWycnXVsnc2NoZW1lJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCQkJfQoJCQkJCQkJCWVsc2UKCQkJCQkJCQl7CgkJCQkJCQkJCSRjcmVkaXRfc2NoZW1lID0gJ3VybjplYnUnOwoJCQkJCQkJCX0KCQkJCQkJCQlpZiAoaXNzZXQoJGNyZWRpdFsnZGF0YSddKSkKCQkJCQkJCQl7CgkJCQkJCQkJCSRjcmVkaXRfbmFtZSA9ICR0aGlzLT5zYW5pdGl6ZSgkY3JlZGl0WydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCQkJfQoJCQkJCQkJCSRjcmVkaXRzW10gPSYgbmV3ICR0aGlzLT5mZWVkLT5jcmVkaXRfY2xhc3MoJGNyZWRpdF9yb2xlLCAkY3JlZGl0X3NjaGVtZSwgJGNyZWRpdF9uYW1lKTsKCQkJCQkJCX0KCQkJCQkJCWlmIChpc19hcnJheSgkY3JlZGl0cykpCgkJCQkJCQl7CgkJCQkJCQkJJGNyZWRpdHMgPSBhcnJheV92YWx1ZXMoU2ltcGxlUGllX01pc2M6OmFycmF5X3VuaXF1ZSgkY3JlZGl0cykpOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCWVsc2UKCQkJCQkJewoJCQkJCQkJJGNyZWRpdHMgPSAkY3JlZGl0c19wYXJlbnQ7CgkJCQkJCX0KCgkJCQkJCS8vIERFU0NSSVBUSU9OCgkJCQkJCWlmIChpc3NldCgkY29udGVudFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsnZGVzY3JpcHRpb24nXSkpCgkJCQkJCXsKCQkJCQkJCSRkZXNjcmlwdGlvbiA9ICR0aGlzLT5zYW5pdGl6ZSgkY29udGVudFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsnZGVzY3JpcHRpb24nXVswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQl9CgkJCQkJCWVsc2UKCQkJCQkJewoJCQkJCQkJJGRlc2NyaXB0aW9uID0gJGRlc2NyaXB0aW9uX3BhcmVudDsKCQkJCQkJfQoKCQkJCQkJLy8gSEFTSEVTCgkJCQkJCWlmIChpc3NldCgkY29udGVudFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsnaGFzaCddKSkKCQkJCQkJewoJCQkJCQkJZm9yZWFjaCAoJGNvbnRlbnRbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ2hhc2gnXSBhcyAkaGFzaCkKCQkJCQkJCXsKCQkJCQkJCQkkdmFsdWUgPSBudWxsOwoJCQkJCQkJCSRhbGdvID0gbnVsbDsKCQkJCQkJCQlpZiAoaXNzZXQoJGhhc2hbJ2RhdGEnXSkpCgkJCQkJCQkJewoJCQkJCQkJCQkkdmFsdWUgPSAkdGhpcy0+c2FuaXRpemUoJGhhc2hbJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJCQl9CgkJCQkJCQkJaWYgKGlzc2V0KCRoYXNoWydhdHRyaWJzJ11bJyddWydhbGdvJ10pKQoJCQkJCQkJCXsKCQkJCQkJCQkJJGFsZ28gPSAkdGhpcy0+c2FuaXRpemUoJGhhc2hbJ2F0dHJpYnMnXVsnJ11bJ2FsZ28nXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJCQl9CgkJCQkJCQkJZWxzZQoJCQkJCQkJCXsKCQkJCQkJCQkJJGFsZ28gPSAnbWQ1JzsKCQkJCQkJCQl9CgkJCQkJCQkJJGhhc2hlc1tdID0gJGFsZ28uJzonLiR2YWx1ZTsKCQkJCQkJCX0KCQkJCQkJCWlmIChpc19hcnJheSgkaGFzaGVzKSkKCQkJCQkJCXsKCQkJCQkJCQkkaGFzaGVzID0gYXJyYXlfdmFsdWVzKFNpbXBsZVBpZV9NaXNjOjphcnJheV91bmlxdWUoJGhhc2hlcykpOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCWVsc2UKCQkJCQkJewoJCQkJCQkJJGhhc2hlcyA9ICRoYXNoZXNfcGFyZW50OwoJCQkJCQl9CgoJCQkJCQkvLyBLRVlXT1JEUwoJCQkJCQlpZiAoaXNzZXQoJGNvbnRlbnRbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ2tleXdvcmRzJ10pKQoJCQkJCQl7CgkJCQkJCQlpZiAoaXNzZXQoJGNvbnRlbnRbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ2tleXdvcmRzJ11bMF1bJ2RhdGEnXSkpCgkJCQkJCQl7CgkJCQkJCQkJJHRlbXAgPSBleHBsb2RlKCcsJywgJHRoaXMtPnNhbml0aXplKCRjb250ZW50WydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWydrZXl3b3JkcyddWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCkpOwoJCQkJCQkJCWZvcmVhY2ggKCR0ZW1wIGFzICR3b3JkKQoJCQkJCQkJCXsKCQkJCQkJCQkJJGtleXdvcmRzW10gPSB0cmltKCR3b3JkKTsKCQkJCQkJCQl9CgkJCQkJCQkJdW5zZXQoJHRlbXApOwoJCQkJCQkJfQoJCQkJCQkJaWYgKGlzX2FycmF5KCRrZXl3b3JkcykpCgkJCQkJCQl7CgkJCQkJCQkJJGtleXdvcmRzID0gYXJyYXlfdmFsdWVzKFNpbXBsZVBpZV9NaXNjOjphcnJheV91bmlxdWUoJGtleXdvcmRzKSk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQkJZWxzZQoJCQkJCQl7CgkJCQkJCQkka2V5d29yZHMgPSAka2V5d29yZHNfcGFyZW50OwoJCQkJCQl9CgoJCQkJCQkvLyBQTEFZRVIKCQkJCQkJaWYgKGlzc2V0KCRjb250ZW50WydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWydwbGF5ZXInXSkpCgkJCQkJCXsKCQkJCQkJCSRwbGF5ZXIgPSAkdGhpcy0+c2FuaXRpemUoJGNvbnRlbnRbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ3BsYXllciddWzBdWydhdHRyaWJzJ11bJyddWyd1cmwnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9JUkkpOwoJCQkJCQl9CgkJCQkJCWVsc2UKCQkJCQkJewoJCQkJCQkJJHBsYXllciA9ICRwbGF5ZXJfcGFyZW50OwoJCQkJCQl9CgoJCQkJCQkvLyBSQVRJTkdTCgkJCQkJCWlmIChpc3NldCgkY29udGVudFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsncmF0aW5nJ10pKQoJCQkJCQl7CgkJCQkJCQlmb3JlYWNoICgkY29udGVudFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsncmF0aW5nJ10gYXMgJHJhdGluZykKCQkJCQkJCXsKCQkJCQkJCQkkcmF0aW5nX3NjaGVtZSA9IG51bGw7CgkJCQkJCQkJJHJhdGluZ192YWx1ZSA9IG51bGw7CgkJCQkJCQkJaWYgKGlzc2V0KCRyYXRpbmdbJ2F0dHJpYnMnXVsnJ11bJ3NjaGVtZSddKSkKCQkJCQkJCQl7CgkJCQkJCQkJCSRyYXRpbmdfc2NoZW1lID0gJHRoaXMtPnNhbml0aXplKCRyYXRpbmdbJ2F0dHJpYnMnXVsnJ11bJ3NjaGVtZSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQkJCX0KCQkJCQkJCQllbHNlCgkJCQkJCQkJewoJCQkJCQkJCQkkcmF0aW5nX3NjaGVtZSA9ICd1cm46c2ltcGxlJzsKCQkJCQkJCQl9CgkJCQkJCQkJaWYgKGlzc2V0KCRyYXRpbmdbJ2RhdGEnXSkpCgkJCQkJCQkJewoJCQkJCQkJCQkkcmF0aW5nX3ZhbHVlID0gJHRoaXMtPnNhbml0aXplKCRyYXRpbmdbJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJCQl9CgkJCQkJCQkJJHJhdGluZ3NbXSA9JiBuZXcgJHRoaXMtPmZlZWQtPnJhdGluZ19jbGFzcygkcmF0aW5nX3NjaGVtZSwgJHJhdGluZ192YWx1ZSk7CgkJCQkJCQl9CgkJCQkJCQlpZiAoaXNfYXJyYXkoJHJhdGluZ3MpKQoJCQkJCQkJewoJCQkJCQkJCSRyYXRpbmdzID0gYXJyYXlfdmFsdWVzKFNpbXBsZVBpZV9NaXNjOjphcnJheV91bmlxdWUoJHJhdGluZ3MpKTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQllbHNlCgkJCQkJCXsKCQkJCQkJCSRyYXRpbmdzID0gJHJhdGluZ3NfcGFyZW50OwoJCQkJCQl9CgoJCQkJCQkvLyBSRVNUUklDVElPTlMKCQkJCQkJaWYgKGlzc2V0KCRjb250ZW50WydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWydyZXN0cmljdGlvbiddKSkKCQkJCQkJewoJCQkJCQkJZm9yZWFjaCAoJGNvbnRlbnRbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9NRURJQVJTU11bJ3Jlc3RyaWN0aW9uJ10gYXMgJHJlc3RyaWN0aW9uKQoJCQkJCQkJewoJCQkJCQkJCSRyZXN0cmljdGlvbl9yZWxhdGlvbnNoaXAgPSBudWxsOwoJCQkJCQkJCSRyZXN0cmljdGlvbl90eXBlID0gbnVsbDsKCQkJCQkJCQkkcmVzdHJpY3Rpb25fdmFsdWUgPSBudWxsOwoJCQkJCQkJCWlmIChpc3NldCgkcmVzdHJpY3Rpb25bJ2F0dHJpYnMnXVsnJ11bJ3JlbGF0aW9uc2hpcCddKSkKCQkJCQkJCQl7CgkJCQkJCQkJCSRyZXN0cmljdGlvbl9yZWxhdGlvbnNoaXAgPSAkdGhpcy0+c2FuaXRpemUoJHJlc3RyaWN0aW9uWydhdHRyaWJzJ11bJyddWydyZWxhdGlvbnNoaXAnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQkJCQl9CgkJCQkJCQkJaWYgKGlzc2V0KCRyZXN0cmljdGlvblsnYXR0cmlicyddWycnXVsndHlwZSddKSkKCQkJCQkJCQl7CgkJCQkJCQkJCSRyZXN0cmljdGlvbl90eXBlID0gJHRoaXMtPnNhbml0aXplKCRyZXN0cmljdGlvblsnYXR0cmlicyddWycnXVsndHlwZSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQkJCX0KCQkJCQkJCQlpZiAoaXNzZXQoJHJlc3RyaWN0aW9uWydkYXRhJ10pKQoJCQkJCQkJCXsKCQkJCQkJCQkJJHJlc3RyaWN0aW9uX3ZhbHVlID0gJHRoaXMtPnNhbml0aXplKCRyZXN0cmljdGlvblsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCQkJCX0KCQkJCQkJCQkkcmVzdHJpY3Rpb25zW10gPSYgbmV3ICR0aGlzLT5mZWVkLT5yZXN0cmljdGlvbl9jbGFzcygkcmVzdHJpY3Rpb25fcmVsYXRpb25zaGlwLCAkcmVzdHJpY3Rpb25fdHlwZSwgJHJlc3RyaWN0aW9uX3ZhbHVlKTsKCQkJCQkJCX0KCQkJCQkJCWlmIChpc19hcnJheSgkcmVzdHJpY3Rpb25zKSkKCQkJCQkJCXsKCQkJCQkJCQkkcmVzdHJpY3Rpb25zID0gYXJyYXlfdmFsdWVzKFNpbXBsZVBpZV9NaXNjOjphcnJheV91bmlxdWUoJHJlc3RyaWN0aW9ucykpOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCWVsc2UKCQkJCQkJewoJCQkJCQkJJHJlc3RyaWN0aW9ucyA9ICRyZXN0cmljdGlvbnNfcGFyZW50OwoJCQkJCQl9CgoJCQkJCQkvLyBUSFVNQk5BSUxTCgkJCQkJCWlmIChpc3NldCgkY29udGVudFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsndGh1bWJuYWlsJ10pKQoJCQkJCQl7CgkJCQkJCQlmb3JlYWNoICgkY29udGVudFsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX01FRElBUlNTXVsndGh1bWJuYWlsJ10gYXMgJHRodW1ibmFpbCkKCQkJCQkJCXsKCQkJCQkJCQkkdGh1bWJuYWlsc1tdID0gJHRoaXMtPnNhbml0aXplKCR0aHVtYm5haWxbJ2F0dHJpYnMnXVsnJ11bJ3VybCddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSk7CgkJCQkJCQl9CgkJCQkJCQlpZiAoaXNfYXJyYXkoJHRodW1ibmFpbHMpKQoJCQkJCQkJewoJCQkJCQkJCSR0aHVtYm5haWxzID0gYXJyYXlfdmFsdWVzKFNpbXBsZVBpZV9NaXNjOjphcnJheV91bmlxdWUoJHRodW1ibmFpbHMpKTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQllbHNlCgkJCQkJCXsKCQkJCQkJCSR0aHVtYm5haWxzID0gJHRodW1ibmFpbHNfcGFyZW50OwoJCQkJCQl9CgoJCQkJCQkvLyBUSVRMRVMKCQkJCQkJaWYgKGlzc2V0KCRjb250ZW50WydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWyd0aXRsZSddKSkKCQkJCQkJewoJCQkJCQkJJHRpdGxlID0gJHRoaXMtPnNhbml0aXplKCRjb250ZW50WydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NdWyd0aXRsZSddWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCQkJCX0KCQkJCQkJZWxzZQoJCQkJCQl7CgkJCQkJCQkkdGl0bGUgPSAkdGl0bGVfcGFyZW50OwoJCQkJCQl9CgoJCQkJCQkkdGhpcy0+ZGF0YVsnZW5jbG9zdXJlcyddW10gPSYgbmV3ICR0aGlzLT5mZWVkLT5lbmNsb3N1cmVfY2xhc3MoJHVybCwgJHR5cGUsICRsZW5ndGgsICR0aGlzLT5mZWVkLT5qYXZhc2NyaXB0LCAkYml0cmF0ZSwgJGNhcHRpb25zLCAkY2F0ZWdvcmllcywgJGNoYW5uZWxzLCAkY29weXJpZ2h0cywgJGNyZWRpdHMsICRkZXNjcmlwdGlvbiwgJGR1cmF0aW9uLCAkZXhwcmVzc2lvbiwgJGZyYW1lcmF0ZSwgJGhhc2hlcywgJGhlaWdodCwgJGtleXdvcmRzLCAkbGFuZywgJG1lZGl1bSwgJHBsYXllciwgJHJhdGluZ3MsICRyZXN0cmljdGlvbnMsICRzYW1wbGluZ3JhdGUsICR0aHVtYm5haWxzLCAkdGl0bGUsICR3aWR0aCk7CgkJCQkJfQoJCQkJfQoJCQl9CgoJCQlmb3JlYWNoICgoYXJyYXkpICR0aGlzLT5nZXRfaXRlbV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMCwgJ2xpbmsnKSBhcyAkbGluaykKCQkJewoJCQkJaWYgKGlzc2V0KCRsaW5rWydhdHRyaWJzJ11bJyddWydocmVmJ10pICYmICFlbXB0eSgkbGlua1snYXR0cmlicyddWycnXVsncmVsJ10pICYmICRsaW5rWydhdHRyaWJzJ11bJyddWydyZWwnXSA9PSAnZW5jbG9zdXJlJykKCQkJCXsKCQkJCQkvLyBBdHRyaWJ1dGVzCgkJCQkJJGJpdHJhdGUgPSBudWxsOwoJCQkJCSRjaGFubmVscyA9IG51bGw7CgkJCQkJJGR1cmF0aW9uID0gbnVsbDsKCQkJCQkkZXhwcmVzc2lvbiA9IG51bGw7CgkJCQkJJGZyYW1lcmF0ZSA9IG51bGw7CgkJCQkJJGhlaWdodCA9IG51bGw7CgkJCQkJJGphdmFzY3JpcHQgPSBudWxsOwoJCQkJCSRsYW5nID0gbnVsbDsKCQkJCQkkbGVuZ3RoID0gbnVsbDsKCQkJCQkkbWVkaXVtID0gbnVsbDsKCQkJCQkkc2FtcGxpbmdyYXRlID0gbnVsbDsKCQkJCQkkdHlwZSA9IG51bGw7CgkJCQkJJHVybCA9IG51bGw7CgkJCQkJJHdpZHRoID0gbnVsbDsKCgkJCQkJJHVybCA9ICR0aGlzLT5zYW5pdGl6ZSgkbGlua1snYXR0cmlicyddWycnXVsnaHJlZiddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSwgJHRoaXMtPmdldF9iYXNlKCRsaW5rKSk7CgkJCQkJaWYgKGlzc2V0KCRsaW5rWydhdHRyaWJzJ11bJyddWyd0eXBlJ10pKQoJCQkJCXsKCQkJCQkJJHR5cGUgPSAkdGhpcy0+c2FuaXRpemUoJGxpbmtbJ2F0dHJpYnMnXVsnJ11bJ3R5cGUnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQl9CgkJCQkJaWYgKGlzc2V0KCRsaW5rWydhdHRyaWJzJ11bJyddWydsZW5ndGgnXSkpCgkJCQkJewoJCQkJCQkkbGVuZ3RoID0gY2VpbCgkbGlua1snYXR0cmlicyddWycnXVsnbGVuZ3RoJ10pOwoJCQkJCX0KCgkJCQkJLy8gU2luY2Ugd2UgZG9uJ3QgaGF2ZSBncm91cCBvciBjb250ZW50IGZvciB0aGVzZSwgd2UnbGwganVzdCBwYXNzIHRoZSAnKl9wYXJlbnQnIHZhcmlhYmxlcyBkaXJlY3RseSB0byB0aGUgY29uc3RydWN0b3IKCQkJCQkkdGhpcy0+ZGF0YVsnZW5jbG9zdXJlcyddW10gPSYgbmV3ICR0aGlzLT5mZWVkLT5lbmNsb3N1cmVfY2xhc3MoJHVybCwgJHR5cGUsICRsZW5ndGgsICR0aGlzLT5mZWVkLT5qYXZhc2NyaXB0LCAkYml0cmF0ZSwgJGNhcHRpb25zX3BhcmVudCwgJGNhdGVnb3JpZXNfcGFyZW50LCAkY2hhbm5lbHMsICRjb3B5cmlnaHRzX3BhcmVudCwgJGNyZWRpdHNfcGFyZW50LCAkZGVzY3JpcHRpb25fcGFyZW50LCAkZHVyYXRpb25fcGFyZW50LCAkZXhwcmVzc2lvbiwgJGZyYW1lcmF0ZSwgJGhhc2hlc19wYXJlbnQsICRoZWlnaHQsICRrZXl3b3Jkc19wYXJlbnQsICRsYW5nLCAkbWVkaXVtLCAkcGxheWVyX3BhcmVudCwgJHJhdGluZ3NfcGFyZW50LCAkcmVzdHJpY3Rpb25zX3BhcmVudCwgJHNhbXBsaW5ncmF0ZSwgJHRodW1ibmFpbHNfcGFyZW50LCAkdGl0bGVfcGFyZW50LCAkd2lkdGgpOwoJCQkJfQoJCQl9CgoJCQlmb3JlYWNoICgoYXJyYXkpICR0aGlzLT5nZXRfaXRlbV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wMywgJ2xpbmsnKSBhcyAkbGluaykKCQkJewoJCQkJaWYgKGlzc2V0KCRsaW5rWydhdHRyaWJzJ11bJyddWydocmVmJ10pICYmICFlbXB0eSgkbGlua1snYXR0cmlicyddWycnXVsncmVsJ10pICYmICRsaW5rWydhdHRyaWJzJ11bJyddWydyZWwnXSA9PSAnZW5jbG9zdXJlJykKCQkJCXsKCQkJCQkvLyBBdHRyaWJ1dGVzCgkJCQkJJGJpdHJhdGUgPSBudWxsOwoJCQkJCSRjaGFubmVscyA9IG51bGw7CgkJCQkJJGR1cmF0aW9uID0gbnVsbDsKCQkJCQkkZXhwcmVzc2lvbiA9IG51bGw7CgkJCQkJJGZyYW1lcmF0ZSA9IG51bGw7CgkJCQkJJGhlaWdodCA9IG51bGw7CgkJCQkJJGphdmFzY3JpcHQgPSBudWxsOwoJCQkJCSRsYW5nID0gbnVsbDsKCQkJCQkkbGVuZ3RoID0gbnVsbDsKCQkJCQkkbWVkaXVtID0gbnVsbDsKCQkJCQkkc2FtcGxpbmdyYXRlID0gbnVsbDsKCQkJCQkkdHlwZSA9IG51bGw7CgkJCQkJJHVybCA9IG51bGw7CgkJCQkJJHdpZHRoID0gbnVsbDsKCgkJCQkJJHVybCA9ICR0aGlzLT5zYW5pdGl6ZSgkbGlua1snYXR0cmlicyddWycnXVsnaHJlZiddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSwgJHRoaXMtPmdldF9iYXNlKCRsaW5rKSk7CgkJCQkJaWYgKGlzc2V0KCRsaW5rWydhdHRyaWJzJ11bJyddWyd0eXBlJ10pKQoJCQkJCXsKCQkJCQkJJHR5cGUgPSAkdGhpcy0+c2FuaXRpemUoJGxpbmtbJ2F0dHJpYnMnXVsnJ11bJ3R5cGUnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJCQl9CgkJCQkJaWYgKGlzc2V0KCRsaW5rWydhdHRyaWJzJ11bJyddWydsZW5ndGgnXSkpCgkJCQkJewoJCQkJCQkkbGVuZ3RoID0gY2VpbCgkbGlua1snYXR0cmlicyddWycnXVsnbGVuZ3RoJ10pOwoJCQkJCX0KCgkJCQkJLy8gU2luY2Ugd2UgZG9uJ3QgaGF2ZSBncm91cCBvciBjb250ZW50IGZvciB0aGVzZSwgd2UnbGwganVzdCBwYXNzIHRoZSAnKl9wYXJlbnQnIHZhcmlhYmxlcyBkaXJlY3RseSB0byB0aGUgY29uc3RydWN0b3IKCQkJCQkkdGhpcy0+ZGF0YVsnZW5jbG9zdXJlcyddW10gPSYgbmV3ICR0aGlzLT5mZWVkLT5lbmNsb3N1cmVfY2xhc3MoJHVybCwgJHR5cGUsICRsZW5ndGgsICR0aGlzLT5mZWVkLT5qYXZhc2NyaXB0LCAkYml0cmF0ZSwgJGNhcHRpb25zX3BhcmVudCwgJGNhdGVnb3JpZXNfcGFyZW50LCAkY2hhbm5lbHMsICRjb3B5cmlnaHRzX3BhcmVudCwgJGNyZWRpdHNfcGFyZW50LCAkZGVzY3JpcHRpb25fcGFyZW50LCAkZHVyYXRpb25fcGFyZW50LCAkZXhwcmVzc2lvbiwgJGZyYW1lcmF0ZSwgJGhhc2hlc19wYXJlbnQsICRoZWlnaHQsICRrZXl3b3Jkc19wYXJlbnQsICRsYW5nLCAkbWVkaXVtLCAkcGxheWVyX3BhcmVudCwgJHJhdGluZ3NfcGFyZW50LCAkcmVzdHJpY3Rpb25zX3BhcmVudCwgJHNhbXBsaW5ncmF0ZSwgJHRodW1ibmFpbHNfcGFyZW50LCAkdGl0bGVfcGFyZW50LCAkd2lkdGgpOwoJCQkJfQoJCQl9CgoJCQlpZiAoJGVuY2xvc3VyZSA9ICR0aGlzLT5nZXRfaXRlbV90YWdzKCcnLCAnZW5jbG9zdXJlJykpCgkJCXsKCQkJCWlmIChpc3NldCgkZW5jbG9zdXJlWzBdWydhdHRyaWJzJ11bJyddWyd1cmwnXSkpCgkJCQl7CgkJCQkJLy8gQXR0cmlidXRlcwoJCQkJCSRiaXRyYXRlID0gbnVsbDsKCQkJCQkkY2hhbm5lbHMgPSBudWxsOwoJCQkJCSRkdXJhdGlvbiA9IG51bGw7CgkJCQkJJGV4cHJlc3Npb24gPSBudWxsOwoJCQkJCSRmcmFtZXJhdGUgPSBudWxsOwoJCQkJCSRoZWlnaHQgPSBudWxsOwoJCQkJCSRqYXZhc2NyaXB0ID0gbnVsbDsKCQkJCQkkbGFuZyA9IG51bGw7CgkJCQkJJGxlbmd0aCA9IG51bGw7CgkJCQkJJG1lZGl1bSA9IG51bGw7CgkJCQkJJHNhbXBsaW5ncmF0ZSA9IG51bGw7CgkJCQkJJHR5cGUgPSBudWxsOwoJCQkJCSR1cmwgPSBudWxsOwoJCQkJCSR3aWR0aCA9IG51bGw7CgoJCQkJCSR1cmwgPSAkdGhpcy0+c2FuaXRpemUoJGVuY2xvc3VyZVswXVsnYXR0cmlicyddWycnXVsndXJsJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfSVJJLCAkdGhpcy0+Z2V0X2Jhc2UoJGVuY2xvc3VyZVswXSkpOwoJCQkJCWlmIChpc3NldCgkZW5jbG9zdXJlWzBdWydhdHRyaWJzJ11bJyddWyd0eXBlJ10pKQoJCQkJCXsKCQkJCQkJJHR5cGUgPSAkdGhpcy0+c2FuaXRpemUoJGVuY2xvc3VyZVswXVsnYXR0cmlicyddWycnXVsndHlwZSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQkJCX0KCQkJCQlpZiAoaXNzZXQoJGVuY2xvc3VyZVswXVsnYXR0cmlicyddWycnXVsnbGVuZ3RoJ10pKQoJCQkJCXsKCQkJCQkJJGxlbmd0aCA9IGNlaWwoJGVuY2xvc3VyZVswXVsnYXR0cmlicyddWycnXVsnbGVuZ3RoJ10pOwoJCQkJCX0KCgkJCQkJLy8gU2luY2Ugd2UgZG9uJ3QgaGF2ZSBncm91cCBvciBjb250ZW50IGZvciB0aGVzZSwgd2UnbGwganVzdCBwYXNzIHRoZSAnKl9wYXJlbnQnIHZhcmlhYmxlcyBkaXJlY3RseSB0byB0aGUgY29uc3RydWN0b3IKCQkJCQkkdGhpcy0+ZGF0YVsnZW5jbG9zdXJlcyddW10gPSYgbmV3ICR0aGlzLT5mZWVkLT5lbmNsb3N1cmVfY2xhc3MoJHVybCwgJHR5cGUsICRsZW5ndGgsICR0aGlzLT5mZWVkLT5qYXZhc2NyaXB0LCAkYml0cmF0ZSwgJGNhcHRpb25zX3BhcmVudCwgJGNhdGVnb3JpZXNfcGFyZW50LCAkY2hhbm5lbHMsICRjb3B5cmlnaHRzX3BhcmVudCwgJGNyZWRpdHNfcGFyZW50LCAkZGVzY3JpcHRpb25fcGFyZW50LCAkZHVyYXRpb25fcGFyZW50LCAkZXhwcmVzc2lvbiwgJGZyYW1lcmF0ZSwgJGhhc2hlc19wYXJlbnQsICRoZWlnaHQsICRrZXl3b3Jkc19wYXJlbnQsICRsYW5nLCAkbWVkaXVtLCAkcGxheWVyX3BhcmVudCwgJHJhdGluZ3NfcGFyZW50LCAkcmVzdHJpY3Rpb25zX3BhcmVudCwgJHNhbXBsaW5ncmF0ZSwgJHRodW1ibmFpbHNfcGFyZW50LCAkdGl0bGVfcGFyZW50LCAkd2lkdGgpOwoJCQkJfQoJCQl9CgoJCQlpZiAoc2l6ZW9mKCR0aGlzLT5kYXRhWydlbmNsb3N1cmVzJ10pID09IDAgJiYgKCR1cmwgfHwgJHR5cGUgfHwgJGxlbmd0aCB8fCAkYml0cmF0ZSB8fCAkY2FwdGlvbnNfcGFyZW50IHx8ICRjYXRlZ29yaWVzX3BhcmVudCB8fCAkY2hhbm5lbHMgfHwgJGNvcHlyaWdodHNfcGFyZW50IHx8ICRjcmVkaXRzX3BhcmVudCB8fCAkZGVzY3JpcHRpb25fcGFyZW50IHx8ICRkdXJhdGlvbl9wYXJlbnQgfHwgJGV4cHJlc3Npb24gfHwgJGZyYW1lcmF0ZSB8fCAkaGFzaGVzX3BhcmVudCB8fCAkaGVpZ2h0IHx8ICRrZXl3b3Jkc19wYXJlbnQgfHwgJGxhbmcgfHwgJG1lZGl1bSB8fCAkcGxheWVyX3BhcmVudCB8fCAkcmF0aW5nc19wYXJlbnQgfHwgJHJlc3RyaWN0aW9uc19wYXJlbnQgfHwgJHNhbXBsaW5ncmF0ZSB8fCAkdGh1bWJuYWlsc19wYXJlbnQgfHwgJHRpdGxlX3BhcmVudCB8fCAkd2lkdGgpKQoJCQl7CgkJCQkvLyBTaW5jZSB3ZSBkb24ndCBoYXZlIGdyb3VwIG9yIGNvbnRlbnQgZm9yIHRoZXNlLCB3ZSdsbCBqdXN0IHBhc3MgdGhlICcqX3BhcmVudCcgdmFyaWFibGVzIGRpcmVjdGx5IHRvIHRoZSBjb25zdHJ1Y3RvcgoJCQkJJHRoaXMtPmRhdGFbJ2VuY2xvc3VyZXMnXVtdID0mIG5ldyAkdGhpcy0+ZmVlZC0+ZW5jbG9zdXJlX2NsYXNzKCR1cmwsICR0eXBlLCAkbGVuZ3RoLCAkdGhpcy0+ZmVlZC0+amF2YXNjcmlwdCwgJGJpdHJhdGUsICRjYXB0aW9uc19wYXJlbnQsICRjYXRlZ29yaWVzX3BhcmVudCwgJGNoYW5uZWxzLCAkY29weXJpZ2h0c19wYXJlbnQsICRjcmVkaXRzX3BhcmVudCwgJGRlc2NyaXB0aW9uX3BhcmVudCwgJGR1cmF0aW9uX3BhcmVudCwgJGV4cHJlc3Npb24sICRmcmFtZXJhdGUsICRoYXNoZXNfcGFyZW50LCAkaGVpZ2h0LCAka2V5d29yZHNfcGFyZW50LCAkbGFuZywgJG1lZGl1bSwgJHBsYXllcl9wYXJlbnQsICRyYXRpbmdzX3BhcmVudCwgJHJlc3RyaWN0aW9uc19wYXJlbnQsICRzYW1wbGluZ3JhdGUsICR0aHVtYm5haWxzX3BhcmVudCwgJHRpdGxlX3BhcmVudCwgJHdpZHRoKTsKCQkJfQoKCQkJJHRoaXMtPmRhdGFbJ2VuY2xvc3VyZXMnXSA9IGFycmF5X3ZhbHVlcyhTaW1wbGVQaWVfTWlzYzo6YXJyYXlfdW5pcXVlKCR0aGlzLT5kYXRhWydlbmNsb3N1cmVzJ10pKTsKCQl9CgkJaWYgKCFlbXB0eSgkdGhpcy0+ZGF0YVsnZW5jbG9zdXJlcyddKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+ZGF0YVsnZW5jbG9zdXJlcyddOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJZnVuY3Rpb24gZ2V0X2xhdGl0dWRlKCkKCXsKCQlpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfaXRlbV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfVzNDX0JBU0lDX0dFTywgJ2xhdCcpKQoJCXsKCQkJcmV0dXJuIChmbG9hdCkgJHJldHVyblswXVsnZGF0YSddOwoJCX0KCQllbHNlaWYgKCgkcmV0dXJuID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9HRU9SU1MsICdwb2ludCcpKSAmJiBwcmVnX21hdGNoKCcvXigoPzotKT9bMC05XSsoPzpcLlswLTldKykpICgoPzotKT9bMC05XSsoPzpcLlswLTldKykpJC8nLCAkcmV0dXJuWzBdWydkYXRhJ10sICRtYXRjaCkpCgkJewoJCQlyZXR1cm4gKGZsb2F0KSAkbWF0Y2hbMV07CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCglmdW5jdGlvbiBnZXRfbG9uZ2l0dWRlKCkKCXsKCQlpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfaXRlbV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfVzNDX0JBU0lDX0dFTywgJ2xvbmcnKSkKCQl7CgkJCXJldHVybiAoZmxvYXQpICRyZXR1cm5bMF1bJ2RhdGEnXTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9XM0NfQkFTSUNfR0VPLCAnbG9uJykpCgkJewoJCQlyZXR1cm4gKGZsb2F0KSAkcmV0dXJuWzBdWydkYXRhJ107CgkJfQoJCWVsc2VpZiAoKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X2l0ZW1fdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0dFT1JTUywgJ3BvaW50JykpICYmIHByZWdfbWF0Y2goJy9eKCg/Oi0pP1swLTldKyg/OlwuWzAtOV0rKSkgKCg/Oi0pP1swLTldKyg/OlwuWzAtOV0rKSkkLycsICRyZXR1cm5bMF1bJ2RhdGEnXSwgJG1hdGNoKSkKCQl7CgkJCXJldHVybiAoZmxvYXQpICRtYXRjaFsyXTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCWZ1bmN0aW9uIGdldF9zb3VyY2UoKQoJewoJCWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9pdGVtX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzEwLCAnc291cmNlJykpCgkJewoJCQlyZXR1cm4gbmV3ICR0aGlzLT5mZWVkLT5zb3VyY2VfY2xhc3MoJHRoaXMsICRyZXR1cm5bMF0pOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJLyoqCgkgKiBDcmVhdGVzIHRoZSBhZGRfdG9fKiBtZXRob2RzJyByZXR1cm4gZGF0YQoJICoKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICogQHBhcmFtIHN0cmluZyAkaXRlbV91cmwgU3RyaW5nIHRvIHByZWZpeCB0byB0aGUgaXRlbSBwZXJtYWxpbmsKCSAqIEBwYXJhbSBzdHJpbmcgJHRpdGxlX3VybCBTdHJpbmcgdG8gcHJlZml4IHRvIHRoZSBpdGVtIHRpdGxlCgkgKiAoYW5kIHN1ZmZpeCB0byB0aGUgaXRlbSBwZXJtYWxpbmspCgkgKiBAcmV0dXJuIG1peGVkIFVSTCBpZiBmZWVkIGV4aXN0cywgZmFsc2Ugb3RoZXJ3aXNlCgkgKi8KCWZ1bmN0aW9uIGFkZF90b19zZXJ2aWNlKCRpdGVtX3VybCwgJHRpdGxlX3VybCA9IG51bGwsICRzdW1tYXJ5X3VybCA9IG51bGwpCgl7CgkJaWYgKCR0aGlzLT5nZXRfcGVybWFsaW5rKCkgIT09IG51bGwpCgkJewoJCQkkcmV0dXJuID0gJHRoaXMtPnNhbml0aXplKCRpdGVtX3VybCwgU0lNUExFUElFX0NPTlNUUlVDVF9JUkkpIC4gcmF3dXJsZW5jb2RlKCR0aGlzLT5nZXRfcGVybWFsaW5rKCkpOwoJCQlpZiAoJHRpdGxlX3VybCAhPT0gbnVsbCAmJiAkdGhpcy0+Z2V0X3RpdGxlKCkgIT09IG51bGwpCgkJCXsKCQkJCSRyZXR1cm4gLj0gJHRoaXMtPnNhbml0aXplKCR0aXRsZV91cmwsIFNJTVBMRVBJRV9DT05TVFJVQ1RfSVJJKSAuIHJhd3VybGVuY29kZSgkdGhpcy0+Z2V0X3RpdGxlKCkpOwoJCQl9CgkJCWlmICgkc3VtbWFyeV91cmwgIT09IG51bGwgJiYgJHRoaXMtPmdldF9kZXNjcmlwdGlvbigpICE9PSBudWxsKQoJCQl7CgkJCQkkcmV0dXJuIC49ICR0aGlzLT5zYW5pdGl6ZSgkc3VtbWFyeV91cmwsIFNJTVBMRVBJRV9DT05TVFJVQ1RfSVJJKSAuIHJhd3VybGVuY29kZSgkdGhpcy0+Z2V0X2Rlc2NyaXB0aW9uKCkpOwoJCQl9CgkJCXJldHVybiAkcmV0dXJuOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJZnVuY3Rpb24gYWRkX3RvX2JsaW5rbGlzdCgpCgl7CgkJcmV0dXJuICR0aGlzLT5hZGRfdG9fc2VydmljZSgnaHR0cDovL3d3dy5ibGlua2xpc3QuY29tL2luZGV4LnBocD9BY3Rpb249QmxpbmsvYWRkYmxpbmsucGhwJkRlc2NyaXB0aW9uPSZVcmw9JywgJyZUaXRsZT0nKTsKCX0KCglmdW5jdGlvbiBhZGRfdG9fYmxvZ21hcmtzKCkKCXsKCQlyZXR1cm4gJHRoaXMtPmFkZF90b19zZXJ2aWNlKCdodHRwOi8vYmxvZ21hcmtzLm5ldC9teS9uZXcucGhwP21pbmk9MSZzaW1wbGU9MSZ1cmw9JywgJyZ0aXRsZT0nKTsKCX0KCglmdW5jdGlvbiBhZGRfdG9fZGVsaWNpb3VzKCkKCXsKCQlyZXR1cm4gJHRoaXMtPmFkZF90b19zZXJ2aWNlKCdodHRwOi8vZGVsLmljaW8udXMvcG9zdC8/dj00JnVybD0nLCAnJnRpdGxlPScpOwoJfQoKCWZ1bmN0aW9uIGFkZF90b19kaWdnKCkKCXsKCQlyZXR1cm4gJHRoaXMtPmFkZF90b19zZXJ2aWNlKCdodHRwOi8vZGlnZy5jb20vc3VibWl0P3VybD0nLCAnJnRpdGxlPScsICcmYm9keXRleHQ9Jyk7Cgl9CgoJZnVuY3Rpb24gYWRkX3RvX2Z1cmwoKQoJewoJCXJldHVybiAkdGhpcy0+YWRkX3RvX3NlcnZpY2UoJ2h0dHA6Ly93d3cuZnVybC5uZXQvc3RvcmVJdC5qc3A/dT0nLCAnJnQ9Jyk7Cgl9CgoJZnVuY3Rpb24gYWRkX3RvX21hZ25vbGlhKCkKCXsKCQlyZXR1cm4gJHRoaXMtPmFkZF90b19zZXJ2aWNlKCdodHRwOi8vbWEuZ25vbGlhLmNvbS9ib29rbWFya2xldC9hZGQ/dXJsPScsICcmdGl0bGU9Jyk7Cgl9CgoJZnVuY3Rpb24gYWRkX3RvX215d2ViMjAoKQoJewoJCXJldHVybiAkdGhpcy0+YWRkX3RvX3NlcnZpY2UoJ2h0dHA6Ly9teXdlYjIuc2VhcmNoLnlhaG9vLmNvbS9teXJlc3VsdHMvYm9va21hcmtsZXQ/dT0nLCAnJnQ9Jyk7Cgl9CgoJZnVuY3Rpb24gYWRkX3RvX25ld3N2aW5lKCkKCXsKCQlyZXR1cm4gJHRoaXMtPmFkZF90b19zZXJ2aWNlKCdodHRwOi8vd3d3Lm5ld3N2aW5lLmNvbS9fd2luZS9zYXZlP3U9JywgJyZoPScpOwoJfQoKCWZ1bmN0aW9uIGFkZF90b19yZWRkaXQoKQoJewoJCXJldHVybiAkdGhpcy0+YWRkX3RvX3NlcnZpY2UoJ2h0dHA6Ly9yZWRkaXQuY29tL3N1Ym1pdD91cmw9JywgJyZ0aXRsZT0nKTsKCX0KCglmdW5jdGlvbiBhZGRfdG9fc2VnbmFsbygpCgl7CgkJcmV0dXJuICR0aGlzLT5hZGRfdG9fc2VydmljZSgnaHR0cDovL3NlZ25hbG8uY29tL3Bvc3QuaHRtbC5waHA/dXJsPScsICcmdGl0bGU9Jyk7Cgl9CgoJZnVuY3Rpb24gYWRkX3RvX3NpbXB5KCkKCXsKCQlyZXR1cm4gJHRoaXMtPmFkZF90b19zZXJ2aWNlKCdodHRwOi8vd3d3LnNpbXB5LmNvbS9zaW1weS9MaW5rQWRkLmRvP2hyZWY9JywgJyZ0aXRsZT0nKTsKCX0KCglmdW5jdGlvbiBhZGRfdG9fc3B1cmwoKQoJewoJCXJldHVybiAkdGhpcy0+YWRkX3RvX3NlcnZpY2UoJ2h0dHA6Ly93d3cuc3B1cmwubmV0L3NwdXJsLnBocD92PTMmdXJsPScsICcmdGl0bGU9Jyk7Cgl9CgoJZnVuY3Rpb24gYWRkX3RvX3dpc3RzKCkKCXsKCQlyZXR1cm4gJHRoaXMtPmFkZF90b19zZXJ2aWNlKCdodHRwOi8vd2lzdHMuY29tL3IucGhwP2M9JnI9JywgJyZ0aXRsZT0nKTsKCX0KCglmdW5jdGlvbiBzZWFyY2hfdGVjaG5vcmF0aSgpCgl7CgkJcmV0dXJuICR0aGlzLT5hZGRfdG9fc2VydmljZSgnaHR0cDovL3d3dy50ZWNobm9yYXRpLmNvbS9zZWFyY2gvJyk7Cgl9Cn0KCmNsYXNzIFNpbXBsZVBpZV9Tb3VyY2UKewoJdmFyICRpdGVtOwoJdmFyICRkYXRhID0gYXJyYXkoKTsKCglmdW5jdGlvbiBTaW1wbGVQaWVfU291cmNlKCRpdGVtLCAkZGF0YSkKCXsKCQkkdGhpcy0+aXRlbSA9ICRpdGVtOwoJCSR0aGlzLT5kYXRhID0gJGRhdGE7Cgl9CgoJZnVuY3Rpb24gX190b1N0cmluZygpCgl7CgkJcmV0dXJuIG1kNShzZXJpYWxpemUoJHRoaXMtPmRhdGEpKTsKCX0KCgkvKioKCSAqIFJlbW92ZSBpdGVtcyB0aGF0IGxpbmsgYmFjayB0byB0aGlzIGJlZm9yZSBkZXN0cm95aW5nIHRoaXMgb2JqZWN0CgkgKi8KCWZ1bmN0aW9uIF9fZGVzdHJ1Y3QoKQoJewoJCXVuc2V0KCR0aGlzLT5pdGVtKTsKCX0KCglmdW5jdGlvbiBnZXRfc291cmNlX3RhZ3MoJG5hbWVzcGFjZSwgJHRhZykKCXsKCQlpZiAoaXNzZXQoJHRoaXMtPmRhdGFbJ2NoaWxkJ11bJG5hbWVzcGFjZV1bJHRhZ10pKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5kYXRhWydjaGlsZCddWyRuYW1lc3BhY2VdWyR0YWddOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJZnVuY3Rpb24gZ2V0X2Jhc2UoJGVsZW1lbnQgPSBhcnJheSgpKQoJewoJCXJldHVybiAkdGhpcy0+aXRlbS0+Z2V0X2Jhc2UoJGVsZW1lbnQpOwoJfQoKCWZ1bmN0aW9uIHNhbml0aXplKCRkYXRhLCAkdHlwZSwgJGJhc2UgPSAnJykKCXsKCQlyZXR1cm4gJHRoaXMtPml0ZW0tPnNhbml0aXplKCRkYXRhLCAkdHlwZSwgJGJhc2UpOwoJfQoKCWZ1bmN0aW9uIGdldF9pdGVtKCkKCXsKCQlyZXR1cm4gJHRoaXMtPml0ZW07Cgl9CgoJZnVuY3Rpb24gZ2V0X3RpdGxlKCkKCXsKCQlpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfc291cmNlX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzEwLCAndGl0bGUnKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCBTaW1wbGVQaWVfTWlzYzo6YXRvbV8xMF9jb25zdHJ1Y3RfdHlwZSgkcmV0dXJuWzBdWydhdHRyaWJzJ10pLCAkdGhpcy0+Z2V0X2Jhc2UoJHJldHVyblswXSkpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X3NvdXJjZV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wMywgJ3RpdGxlJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU2ltcGxlUGllX01pc2M6OmF0b21fMDNfY29uc3RydWN0X3R5cGUoJHJldHVyblswXVsnYXR0cmlicyddKSwgJHRoaXMtPmdldF9iYXNlKCRyZXR1cm5bMF0pKTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9zb3VyY2VfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX1JTU18xMCwgJ3RpdGxlJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9NQVlCRV9IVE1MLCAkdGhpcy0+Z2V0X2Jhc2UoJHJldHVyblswXSkpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X3NvdXJjZV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfUlNTXzA5MCwgJ3RpdGxlJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9NQVlCRV9IVE1MLCAkdGhpcy0+Z2V0X2Jhc2UoJHJldHVyblswXSkpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X3NvdXJjZV90YWdzKCcnLCAndGl0bGUnKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX01BWUJFX0hUTUwsICR0aGlzLT5nZXRfYmFzZSgkcmV0dXJuWzBdKSk7CgkJfQoJCWVsc2VpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfc291cmNlX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9EQ18xMSwgJ3RpdGxlJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9zb3VyY2VfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0RDXzEwLCAndGl0bGUnKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJZnVuY3Rpb24gZ2V0X2NhdGVnb3J5KCRrZXkgPSAwKQoJewoJCSRjYXRlZ29yaWVzID0gJHRoaXMtPmdldF9jYXRlZ29yaWVzKCk7CgkJaWYgKGlzc2V0KCRjYXRlZ29yaWVzWyRrZXldKSkKCQl7CgkJCXJldHVybiAkY2F0ZWdvcmllc1ska2V5XTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCWZ1bmN0aW9uIGdldF9jYXRlZ29yaWVzKCkKCXsKCQkkY2F0ZWdvcmllcyA9IGFycmF5KCk7CgoJCWZvcmVhY2ggKChhcnJheSkgJHRoaXMtPmdldF9zb3VyY2VfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTAsICdjYXRlZ29yeScpIGFzICRjYXRlZ29yeSkKCQl7CgkJCSR0ZXJtID0gbnVsbDsKCQkJJHNjaGVtZSA9IG51bGw7CgkJCSRsYWJlbCA9IG51bGw7CgkJCWlmIChpc3NldCgkY2F0ZWdvcnlbJ2F0dHJpYnMnXVsnJ11bJ3Rlcm0nXSkpCgkJCXsKCQkJCSR0ZXJtID0gJHRoaXMtPnNhbml0aXplKCRjYXRlZ29yeVsnYXR0cmlicyddWycnXVsndGVybSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQl9CgkJCWlmIChpc3NldCgkY2F0ZWdvcnlbJ2F0dHJpYnMnXVsnJ11bJ3NjaGVtZSddKSkKCQkJewoJCQkJJHNjaGVtZSA9ICR0aGlzLT5zYW5pdGl6ZSgkY2F0ZWdvcnlbJ2F0dHJpYnMnXVsnJ11bJ3NjaGVtZSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQl9CgkJCWlmIChpc3NldCgkY2F0ZWdvcnlbJ2F0dHJpYnMnXVsnJ11bJ2xhYmVsJ10pKQoJCQl7CgkJCQkkbGFiZWwgPSAkdGhpcy0+c2FuaXRpemUoJGNhdGVnb3J5WydhdHRyaWJzJ11bJyddWydsYWJlbCddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCQl9CgkJCSRjYXRlZ29yaWVzW10gPSYgbmV3ICR0aGlzLT5pdGVtLT5mZWVkLT5jYXRlZ29yeV9jbGFzcygkdGVybSwgJHNjaGVtZSwgJGxhYmVsKTsKCQl9CgkJZm9yZWFjaCAoKGFycmF5KSAkdGhpcy0+Z2V0X3NvdXJjZV90YWdzKCcnLCAnY2F0ZWdvcnknKSBhcyAkY2F0ZWdvcnkpCgkJewoJCQkkY2F0ZWdvcmllc1tdID0mIG5ldyAkdGhpcy0+aXRlbS0+ZmVlZC0+Y2F0ZWdvcnlfY2xhc3MoJHRoaXMtPnNhbml0aXplKCRjYXRlZ29yeVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpLCBudWxsLCBudWxsKTsKCQl9CgkJZm9yZWFjaCAoKGFycmF5KSAkdGhpcy0+Z2V0X3NvdXJjZV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfRENfMTEsICdzdWJqZWN0JykgYXMgJGNhdGVnb3J5KQoJCXsKCQkJJGNhdGVnb3JpZXNbXSA9JiBuZXcgJHRoaXMtPml0ZW0tPmZlZWQtPmNhdGVnb3J5X2NsYXNzKCR0aGlzLT5zYW5pdGl6ZSgkY2F0ZWdvcnlbJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKSwgbnVsbCwgbnVsbCk7CgkJfQoJCWZvcmVhY2ggKChhcnJheSkgJHRoaXMtPmdldF9zb3VyY2VfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0RDXzEwLCAnc3ViamVjdCcpIGFzICRjYXRlZ29yeSkKCQl7CgkJCSRjYXRlZ29yaWVzW10gPSYgbmV3ICR0aGlzLT5pdGVtLT5mZWVkLT5jYXRlZ29yeV9jbGFzcygkdGhpcy0+c2FuaXRpemUoJGNhdGVnb3J5WydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCksIG51bGwsIG51bGwpOwoJCX0KCgkJaWYgKCFlbXB0eSgkY2F0ZWdvcmllcykpCgkJewoJCQlyZXR1cm4gU2ltcGxlUGllX01pc2M6OmFycmF5X3VuaXF1ZSgkY2F0ZWdvcmllcyk7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCglmdW5jdGlvbiBnZXRfYXV0aG9yKCRrZXkgPSAwKQoJewoJCSRhdXRob3JzID0gJHRoaXMtPmdldF9hdXRob3JzKCk7CgkJaWYgKGlzc2V0KCRhdXRob3JzWyRrZXldKSkKCQl7CgkJCXJldHVybiAkYXV0aG9yc1ska2V5XTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCWZ1bmN0aW9uIGdldF9hdXRob3JzKCkKCXsKCQkkYXV0aG9ycyA9IGFycmF5KCk7CgkJZm9yZWFjaCAoKGFycmF5KSAkdGhpcy0+Z2V0X3NvdXJjZV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMCwgJ2F1dGhvcicpIGFzICRhdXRob3IpCgkJewoJCQkkbmFtZSA9IG51bGw7CgkJCSR1cmkgPSBudWxsOwoJCQkkZW1haWwgPSBudWxsOwoJCQlpZiAoaXNzZXQoJGF1dGhvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTBdWyduYW1lJ11bMF1bJ2RhdGEnXSkpCgkJCXsKCQkJCSRuYW1lID0gJHRoaXMtPnNhbml0aXplKCRhdXRob3JbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzEwXVsnbmFtZSddWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCX0KCQkJaWYgKGlzc2V0KCRhdXRob3JbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzEwXVsndXJpJ11bMF1bJ2RhdGEnXSkpCgkJCXsKCQkJCSR1cmkgPSAkdGhpcy0+c2FuaXRpemUoJGF1dGhvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTBdWyd1cmknXVswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSwgJHRoaXMtPmdldF9iYXNlKCRhdXRob3JbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzEwXVsndXJpJ11bMF0pKTsKCQkJfQoJCQlpZiAoaXNzZXQoJGF1dGhvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTBdWydlbWFpbCddWzBdWydkYXRhJ10pKQoJCQl7CgkJCQkkZW1haWwgPSAkdGhpcy0+c2FuaXRpemUoJGF1dGhvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTBdWydlbWFpbCddWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCX0KCQkJaWYgKCRuYW1lICE9PSBudWxsIHx8ICRlbWFpbCAhPT0gbnVsbCB8fCAkdXJpICE9PSBudWxsKQoJCQl7CgkJCQkkYXV0aG9yc1tdID0mIG5ldyAkdGhpcy0+aXRlbS0+ZmVlZC0+YXV0aG9yX2NsYXNzKCRuYW1lLCAkdXJpLCAkZW1haWwpOwoJCQl9CgkJfQoJCWlmICgkYXV0aG9yID0gJHRoaXMtPmdldF9zb3VyY2VfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDMsICdhdXRob3InKSkKCQl7CgkJCSRuYW1lID0gbnVsbDsKCQkJJHVybCA9IG51bGw7CgkJCSRlbWFpbCA9IG51bGw7CgkJCWlmIChpc3NldCgkYXV0aG9yWzBdWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wM11bJ25hbWUnXVswXVsnZGF0YSddKSkKCQkJewoJCQkJJG5hbWUgPSAkdGhpcy0+c2FuaXRpemUoJGF1dGhvclswXVsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDNdWyduYW1lJ11bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJfQoJCQlpZiAoaXNzZXQoJGF1dGhvclswXVsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDNdWyd1cmwnXVswXVsnZGF0YSddKSkKCQkJewoJCQkJJHVybCA9ICR0aGlzLT5zYW5pdGl6ZSgkYXV0aG9yWzBdWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wM11bJ3VybCddWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfSVJJLCAkdGhpcy0+Z2V0X2Jhc2UoJGF1dGhvclswXVsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDNdWyd1cmwnXVswXSkpOwoJCQl9CgkJCWlmIChpc3NldCgkYXV0aG9yWzBdWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wM11bJ2VtYWlsJ11bMF1bJ2RhdGEnXSkpCgkJCXsKCQkJCSRlbWFpbCA9ICR0aGlzLT5zYW5pdGl6ZSgkYXV0aG9yWzBdWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wM11bJ2VtYWlsJ11bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJfQoJCQlpZiAoJG5hbWUgIT09IG51bGwgfHwgJGVtYWlsICE9PSBudWxsIHx8ICR1cmwgIT09IG51bGwpCgkJCXsKCQkJCSRhdXRob3JzW10gPSYgbmV3ICR0aGlzLT5pdGVtLT5mZWVkLT5hdXRob3JfY2xhc3MoJG5hbWUsICR1cmwsICRlbWFpbCk7CgkJCX0KCQl9CgkJZm9yZWFjaCAoKGFycmF5KSAkdGhpcy0+Z2V0X3NvdXJjZV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfRENfMTEsICdjcmVhdG9yJykgYXMgJGF1dGhvcikKCQl7CgkJCSRhdXRob3JzW10gPSYgbmV3ICR0aGlzLT5pdGVtLT5mZWVkLT5hdXRob3JfY2xhc3MoJHRoaXMtPnNhbml0aXplKCRhdXRob3JbJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKSwgbnVsbCwgbnVsbCk7CgkJfQoJCWZvcmVhY2ggKChhcnJheSkgJHRoaXMtPmdldF9zb3VyY2VfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0RDXzEwLCAnY3JlYXRvcicpIGFzICRhdXRob3IpCgkJewoJCQkkYXV0aG9yc1tdID0mIG5ldyAkdGhpcy0+aXRlbS0+ZmVlZC0+YXV0aG9yX2NsYXNzKCR0aGlzLT5zYW5pdGl6ZSgkYXV0aG9yWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCksIG51bGwsIG51bGwpOwoJCX0KCQlmb3JlYWNoICgoYXJyYXkpICR0aGlzLT5nZXRfc291cmNlX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9JVFVORVMsICdhdXRob3InKSBhcyAkYXV0aG9yKQoJCXsKCQkJJGF1dGhvcnNbXSA9JiBuZXcgJHRoaXMtPml0ZW0tPmZlZWQtPmF1dGhvcl9jbGFzcygkdGhpcy0+c2FuaXRpemUoJGF1dGhvclsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpLCBudWxsLCBudWxsKTsKCQl9CgoJCWlmICghZW1wdHkoJGF1dGhvcnMpKQoJCXsKCQkJcmV0dXJuIFNpbXBsZVBpZV9NaXNjOjphcnJheV91bmlxdWUoJGF1dGhvcnMpOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJZnVuY3Rpb24gZ2V0X2NvbnRyaWJ1dG9yKCRrZXkgPSAwKQoJewoJCSRjb250cmlidXRvcnMgPSAkdGhpcy0+Z2V0X2NvbnRyaWJ1dG9ycygpOwoJCWlmIChpc3NldCgkY29udHJpYnV0b3JzWyRrZXldKSkKCQl7CgkJCXJldHVybiAkY29udHJpYnV0b3JzWyRrZXldOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJZnVuY3Rpb24gZ2V0X2NvbnRyaWJ1dG9ycygpCgl7CgkJJGNvbnRyaWJ1dG9ycyA9IGFycmF5KCk7CgkJZm9yZWFjaCAoKGFycmF5KSAkdGhpcy0+Z2V0X3NvdXJjZV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMCwgJ2NvbnRyaWJ1dG9yJykgYXMgJGNvbnRyaWJ1dG9yKQoJCXsKCQkJJG5hbWUgPSBudWxsOwoJCQkkdXJpID0gbnVsbDsKCQkJJGVtYWlsID0gbnVsbDsKCQkJaWYgKGlzc2V0KCRjb250cmlidXRvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTBdWyduYW1lJ11bMF1bJ2RhdGEnXSkpCgkJCXsKCQkJCSRuYW1lID0gJHRoaXMtPnNhbml0aXplKCRjb250cmlidXRvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTBdWyduYW1lJ11bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJfQoJCQlpZiAoaXNzZXQoJGNvbnRyaWJ1dG9yWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMF1bJ3VyaSddWzBdWydkYXRhJ10pKQoJCQl7CgkJCQkkdXJpID0gJHRoaXMtPnNhbml0aXplKCRjb250cmlidXRvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTBdWyd1cmknXVswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSwgJHRoaXMtPmdldF9iYXNlKCRjb250cmlidXRvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTBdWyd1cmknXVswXSkpOwoJCQl9CgkJCWlmIChpc3NldCgkY29udHJpYnV0b3JbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzEwXVsnZW1haWwnXVswXVsnZGF0YSddKSkKCQkJewoJCQkJJGVtYWlsID0gJHRoaXMtPnNhbml0aXplKCRjb250cmlidXRvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTBdWydlbWFpbCddWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCX0KCQkJaWYgKCRuYW1lICE9PSBudWxsIHx8ICRlbWFpbCAhPT0gbnVsbCB8fCAkdXJpICE9PSBudWxsKQoJCQl7CgkJCQkkY29udHJpYnV0b3JzW10gPSYgbmV3ICR0aGlzLT5pdGVtLT5mZWVkLT5hdXRob3JfY2xhc3MoJG5hbWUsICR1cmksICRlbWFpbCk7CgkJCX0KCQl9CgkJZm9yZWFjaCAoKGFycmF5KSAkdGhpcy0+Z2V0X3NvdXJjZV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wMywgJ2NvbnRyaWJ1dG9yJykgYXMgJGNvbnRyaWJ1dG9yKQoJCXsKCQkJJG5hbWUgPSBudWxsOwoJCQkkdXJsID0gbnVsbDsKCQkJJGVtYWlsID0gbnVsbDsKCQkJaWYgKGlzc2V0KCRjb250cmlidXRvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDNdWyduYW1lJ11bMF1bJ2RhdGEnXSkpCgkJCXsKCQkJCSRuYW1lID0gJHRoaXMtPnNhbml0aXplKCRjb250cmlidXRvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDNdWyduYW1lJ11bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQkJfQoJCQlpZiAoaXNzZXQoJGNvbnRyaWJ1dG9yWydjaGlsZCddW1NJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wM11bJ3VybCddWzBdWydkYXRhJ10pKQoJCQl7CgkJCQkkdXJsID0gJHRoaXMtPnNhbml0aXplKCRjb250cmlidXRvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDNdWyd1cmwnXVswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSwgJHRoaXMtPmdldF9iYXNlKCRjb250cmlidXRvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDNdWyd1cmwnXVswXSkpOwoJCQl9CgkJCWlmIChpc3NldCgkY29udHJpYnV0b3JbJ2NoaWxkJ11bU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzAzXVsnZW1haWwnXVswXVsnZGF0YSddKSkKCQkJewoJCQkJJGVtYWlsID0gJHRoaXMtPnNhbml0aXplKCRjb250cmlidXRvclsnY2hpbGQnXVtTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMDNdWydlbWFpbCddWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJCX0KCQkJaWYgKCRuYW1lICE9PSBudWxsIHx8ICRlbWFpbCAhPT0gbnVsbCB8fCAkdXJsICE9PSBudWxsKQoJCQl7CgkJCQkkY29udHJpYnV0b3JzW10gPSYgbmV3ICR0aGlzLT5pdGVtLT5mZWVkLT5hdXRob3JfY2xhc3MoJG5hbWUsICR1cmwsICRlbWFpbCk7CgkJCX0KCQl9CgoJCWlmICghZW1wdHkoJGNvbnRyaWJ1dG9ycykpCgkJewoJCQlyZXR1cm4gU2ltcGxlUGllX01pc2M6OmFycmF5X3VuaXF1ZSgkY29udHJpYnV0b3JzKTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCWZ1bmN0aW9uIGdldF9saW5rKCRrZXkgPSAwLCAkcmVsID0gJ2FsdGVybmF0ZScpCgl7CgkJJGxpbmtzID0gJHRoaXMtPmdldF9saW5rcygkcmVsKTsKCQlpZiAoaXNzZXQoJGxpbmtzWyRrZXldKSkKCQl7CgkJCXJldHVybiAkbGlua3NbJGtleV07CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCgkvKioKCSAqIEFkZGVkIGZvciBwYXJpdHkgYmV0d2VlbiB0aGUgcGFyZW50LWxldmVsIGFuZCB0aGUgaXRlbS9lbnRyeS1sZXZlbC4KCSAqLwoJZnVuY3Rpb24gZ2V0X3Blcm1hbGluaygpCgl7CgkJcmV0dXJuICR0aGlzLT5nZXRfbGluaygwKTsKCX0KCglmdW5jdGlvbiBnZXRfbGlua3MoJHJlbCA9ICdhbHRlcm5hdGUnKQoJewoJCWlmICghaXNzZXQoJHRoaXMtPmRhdGFbJ2xpbmtzJ10pKQoJCXsKCQkJJHRoaXMtPmRhdGFbJ2xpbmtzJ10gPSBhcnJheSgpOwoJCQlpZiAoJGxpbmtzID0gJHRoaXMtPmdldF9zb3VyY2VfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTAsICdsaW5rJykpCgkJCXsKCQkJCWZvcmVhY2ggKCRsaW5rcyBhcyAkbGluaykKCQkJCXsKCQkJCQlpZiAoaXNzZXQoJGxpbmtbJ2F0dHJpYnMnXVsnJ11bJ2hyZWYnXSkpCgkJCQkJewoJCQkJCQkkbGlua19yZWwgPSAoaXNzZXQoJGxpbmtbJ2F0dHJpYnMnXVsnJ11bJ3JlbCddKSkgPyAkbGlua1snYXR0cmlicyddWycnXVsncmVsJ10gOiAnYWx0ZXJuYXRlJzsKCQkJCQkJJHRoaXMtPmRhdGFbJ2xpbmtzJ11bJGxpbmtfcmVsXVtdID0gJHRoaXMtPnNhbml0aXplKCRsaW5rWydhdHRyaWJzJ11bJyddWydocmVmJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfSVJJLCAkdGhpcy0+Z2V0X2Jhc2UoJGxpbmspKTsKCQkJCQl9CgkJCQl9CgkJCX0KCQkJaWYgKCRsaW5rcyA9ICR0aGlzLT5nZXRfc291cmNlX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzAzLCAnbGluaycpKQoJCQl7CgkJCQlmb3JlYWNoICgkbGlua3MgYXMgJGxpbmspCgkJCQl7CgkJCQkJaWYgKGlzc2V0KCRsaW5rWydhdHRyaWJzJ11bJyddWydocmVmJ10pKQoJCQkJCXsKCQkJCQkJJGxpbmtfcmVsID0gKGlzc2V0KCRsaW5rWydhdHRyaWJzJ11bJyddWydyZWwnXSkpID8gJGxpbmtbJ2F0dHJpYnMnXVsnJ11bJ3JlbCddIDogJ2FsdGVybmF0ZSc7CgkJCQkJCSR0aGlzLT5kYXRhWydsaW5rcyddWyRsaW5rX3JlbF1bXSA9ICR0aGlzLT5zYW5pdGl6ZSgkbGlua1snYXR0cmlicyddWycnXVsnaHJlZiddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSwgJHRoaXMtPmdldF9iYXNlKCRsaW5rKSk7CgoJCQkJCX0KCQkJCX0KCQkJfQoJCQlpZiAoJGxpbmtzID0gJHRoaXMtPmdldF9zb3VyY2VfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX1JTU18xMCwgJ2xpbmsnKSkKCQkJewoJCQkJJHRoaXMtPmRhdGFbJ2xpbmtzJ11bJ2FsdGVybmF0ZSddW10gPSAkdGhpcy0+c2FuaXRpemUoJGxpbmtzWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfSVJJLCAkdGhpcy0+Z2V0X2Jhc2UoJGxpbmtzWzBdKSk7CgkJCX0KCQkJaWYgKCRsaW5rcyA9ICR0aGlzLT5nZXRfc291cmNlX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9SU1NfMDkwLCAnbGluaycpKQoJCQl7CgkJCQkkdGhpcy0+ZGF0YVsnbGlua3MnXVsnYWx0ZXJuYXRlJ11bXSA9ICR0aGlzLT5zYW5pdGl6ZSgkbGlua3NbMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9JUkksICR0aGlzLT5nZXRfYmFzZSgkbGlua3NbMF0pKTsKCQkJfQoJCQlpZiAoJGxpbmtzID0gJHRoaXMtPmdldF9zb3VyY2VfdGFncygnJywgJ2xpbmsnKSkKCQkJewoJCQkJJHRoaXMtPmRhdGFbJ2xpbmtzJ11bJ2FsdGVybmF0ZSddW10gPSAkdGhpcy0+c2FuaXRpemUoJGxpbmtzWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfSVJJLCAkdGhpcy0+Z2V0X2Jhc2UoJGxpbmtzWzBdKSk7CgkJCX0KCgkJCSRrZXlzID0gYXJyYXlfa2V5cygkdGhpcy0+ZGF0YVsnbGlua3MnXSk7CgkJCWZvcmVhY2ggKCRrZXlzIGFzICRrZXkpCgkJCXsKCQkJCWlmIChTaW1wbGVQaWVfTWlzYzo6aXNfaXNlZ21lbnRfbnpfbmMoJGtleSkpCgkJCQl7CgkJCQkJaWYgKGlzc2V0KCR0aGlzLT5kYXRhWydsaW5rcyddW1NJTVBMRVBJRV9JQU5BX0xJTktfUkVMQVRJT05TX1JFR0lTVFJZIC4gJGtleV0pKQoJCQkJCXsKCQkJCQkJJHRoaXMtPmRhdGFbJ2xpbmtzJ11bU0lNUExFUElFX0lBTkFfTElOS19SRUxBVElPTlNfUkVHSVNUUlkgLiAka2V5XSA9IGFycmF5X21lcmdlKCR0aGlzLT5kYXRhWydsaW5rcyddWyRrZXldLCAkdGhpcy0+ZGF0YVsnbGlua3MnXVtTSU1QTEVQSUVfSUFOQV9MSU5LX1JFTEFUSU9OU19SRUdJU1RSWSAuICRrZXldKTsKCQkJCQkJJHRoaXMtPmRhdGFbJ2xpbmtzJ11bJGtleV0gPSYgJHRoaXMtPmRhdGFbJ2xpbmtzJ11bU0lNUExFUElFX0lBTkFfTElOS19SRUxBVElPTlNfUkVHSVNUUlkgLiAka2V5XTsKCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJJHRoaXMtPmRhdGFbJ2xpbmtzJ11bU0lNUExFUElFX0lBTkFfTElOS19SRUxBVElPTlNfUkVHSVNUUlkgLiAka2V5XSA9JiAkdGhpcy0+ZGF0YVsnbGlua3MnXVska2V5XTsKCQkJCQl9CgkJCQl9CgkJCQllbHNlaWYgKHN1YnN0cigka2V5LCAwLCA0MSkgPT0gU0lNUExFUElFX0lBTkFfTElOS19SRUxBVElPTlNfUkVHSVNUUlkpCgkJCQl7CgkJCQkJJHRoaXMtPmRhdGFbJ2xpbmtzJ11bc3Vic3RyKCRrZXksIDQxKV0gPSYgJHRoaXMtPmRhdGFbJ2xpbmtzJ11bJGtleV07CgkJCQl9CgkJCQkkdGhpcy0+ZGF0YVsnbGlua3MnXVska2V5XSA9IGFycmF5X3VuaXF1ZSgkdGhpcy0+ZGF0YVsnbGlua3MnXVska2V5XSk7CgkJCX0KCQl9CgoJCWlmIChpc3NldCgkdGhpcy0+ZGF0YVsnbGlua3MnXVskcmVsXSkpCgkJewoJCQlyZXR1cm4gJHRoaXMtPmRhdGFbJ2xpbmtzJ11bJHJlbF07CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCglmdW5jdGlvbiBnZXRfZGVzY3JpcHRpb24oKQoJewoJCWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9zb3VyY2VfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTAsICdzdWJ0aXRsZScpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNpbXBsZVBpZV9NaXNjOjphdG9tXzEwX2NvbnN0cnVjdF90eXBlKCRyZXR1cm5bMF1bJ2F0dHJpYnMnXSksICR0aGlzLT5nZXRfYmFzZSgkcmV0dXJuWzBdKSk7CgkJfQoJCWVsc2VpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfc291cmNlX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzAzLCAndGFnbGluZScpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNpbXBsZVBpZV9NaXNjOjphdG9tXzAzX2NvbnN0cnVjdF90eXBlKCRyZXR1cm5bMF1bJ2F0dHJpYnMnXSksICR0aGlzLT5nZXRfYmFzZSgkcmV0dXJuWzBdKSk7CgkJfQoJCWVsc2VpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfc291cmNlX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9SU1NfMTAsICdkZXNjcmlwdGlvbicpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfTUFZQkVfSFRNTCwgJHRoaXMtPmdldF9iYXNlKCRyZXR1cm5bMF0pKTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9zb3VyY2VfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX1JTU18wOTAsICdkZXNjcmlwdGlvbicpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfTUFZQkVfSFRNTCwgJHRoaXMtPmdldF9iYXNlKCRyZXR1cm5bMF0pKTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9zb3VyY2VfdGFncygnJywgJ2Rlc2NyaXB0aW9uJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9NQVlCRV9IVE1MLCAkdGhpcy0+Z2V0X2Jhc2UoJHJldHVyblswXSkpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X3NvdXJjZV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfRENfMTEsICdkZXNjcmlwdGlvbicpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJfQoJCWVsc2VpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfc291cmNlX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9EQ18xMCwgJ2Rlc2NyaXB0aW9uJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9zb3VyY2VfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0lUVU5FUywgJ3N1bW1hcnknKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0hUTUwsICR0aGlzLT5nZXRfYmFzZSgkcmV0dXJuWzBdKSk7CgkJfQoJCWVsc2VpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfc291cmNlX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9JVFVORVMsICdzdWJ0aXRsZScpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfSFRNTCwgJHRoaXMtPmdldF9iYXNlKCRyZXR1cm5bMF0pKTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCWZ1bmN0aW9uIGdldF9jb3B5cmlnaHQoKQoJewoJCWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9zb3VyY2VfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTAsICdyaWdodHMnKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCBTaW1wbGVQaWVfTWlzYzo6YXRvbV8xMF9jb25zdHJ1Y3RfdHlwZSgkcmV0dXJuWzBdWydhdHRyaWJzJ10pLCAkdGhpcy0+Z2V0X2Jhc2UoJHJldHVyblswXSkpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X3NvdXJjZV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wMywgJ2NvcHlyaWdodCcpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNpbXBsZVBpZV9NaXNjOjphdG9tXzAzX2NvbnN0cnVjdF90eXBlKCRyZXR1cm5bMF1bJ2F0dHJpYnMnXSksICR0aGlzLT5nZXRfYmFzZSgkcmV0dXJuWzBdKSk7CgkJfQoJCWVsc2VpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfc291cmNlX3RhZ3MoJycsICdjb3B5cmlnaHQnKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X3NvdXJjZV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfRENfMTEsICdyaWdodHMnKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X3NvdXJjZV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfRENfMTAsICdyaWdodHMnKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJZnVuY3Rpb24gZ2V0X2xhbmd1YWdlKCkKCXsKCQlpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfc291cmNlX3RhZ3MoJycsICdsYW5ndWFnZScpKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW5pdGl6ZSgkcmV0dXJuWzBdWydkYXRhJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJfQoJCWVsc2VpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfc291cmNlX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9EQ18xMSwgJ2xhbmd1YWdlJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9URVhUKTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9zb3VyY2VfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0RDXzEwLCAnbGFuZ3VhZ2UnKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQpOwoJCX0KCQllbHNlaWYgKGlzc2V0KCR0aGlzLT5kYXRhWyd4bWxfbGFuZyddKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHRoaXMtPmRhdGFbJ3htbF9sYW5nJ10sIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCk7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCglmdW5jdGlvbiBnZXRfbGF0aXR1ZGUoKQoJewoJCWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9zb3VyY2VfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX1czQ19CQVNJQ19HRU8sICdsYXQnKSkKCQl7CgkJCXJldHVybiAoZmxvYXQpICRyZXR1cm5bMF1bJ2RhdGEnXTsKCQl9CgkJZWxzZWlmICgoJHJldHVybiA9ICR0aGlzLT5nZXRfc291cmNlX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9HRU9SU1MsICdwb2ludCcpKSAmJiBwcmVnX21hdGNoKCcvXigoPzotKT9bMC05XSsoPzpcLlswLTldKykpICgoPzotKT9bMC05XSsoPzpcLlswLTldKykpJC8nLCAkcmV0dXJuWzBdWydkYXRhJ10sICRtYXRjaCkpCgkJewoJCQlyZXR1cm4gKGZsb2F0KSAkbWF0Y2hbMV07CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCglmdW5jdGlvbiBnZXRfbG9uZ2l0dWRlKCkKCXsKCQlpZiAoJHJldHVybiA9ICR0aGlzLT5nZXRfc291cmNlX3RhZ3MoU0lNUExFUElFX05BTUVTUEFDRV9XM0NfQkFTSUNfR0VPLCAnbG9uZycpKQoJCXsKCQkJcmV0dXJuIChmbG9hdCkgJHJldHVyblswXVsnZGF0YSddOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X3NvdXJjZV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfVzNDX0JBU0lDX0dFTywgJ2xvbicpKQoJCXsKCQkJcmV0dXJuIChmbG9hdCkgJHJldHVyblswXVsnZGF0YSddOwoJCX0KCQllbHNlaWYgKCgkcmV0dXJuID0gJHRoaXMtPmdldF9zb3VyY2VfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0dFT1JTUywgJ3BvaW50JykpICYmIHByZWdfbWF0Y2goJy9eKCg/Oi0pP1swLTldKyg/OlwuWzAtOV0rKSkgKCg/Oi0pP1swLTldKyg/OlwuWzAtOV0rKSkkLycsICRyZXR1cm5bMF1bJ2RhdGEnXSwgJG1hdGNoKSkKCQl7CgkJCXJldHVybiAoZmxvYXQpICRtYXRjaFsyXTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCWZ1bmN0aW9uIGdldF9pbWFnZV91cmwoKQoJewoJCWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9zb3VyY2VfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0lUVU5FUywgJ2ltYWdlJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2F0dHJpYnMnXVsnJ11bJ2hyZWYnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9JUkkpOwoJCX0KCQllbHNlaWYgKCRyZXR1cm4gPSAkdGhpcy0+Z2V0X3NvdXJjZV90YWdzKFNJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMCwgJ2xvZ28nKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2FuaXRpemUoJHJldHVyblswXVsnZGF0YSddLCBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSwgJHRoaXMtPmdldF9iYXNlKCRyZXR1cm5bMF0pKTsKCQl9CgkJZWxzZWlmICgkcmV0dXJuID0gJHRoaXMtPmdldF9zb3VyY2VfdGFncyhTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTAsICdpY29uJykpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnNhbml0aXplKCRyZXR1cm5bMF1bJ2RhdGEnXSwgU0lNUExFUElFX0NPTlNUUlVDVF9JUkksICR0aGlzLT5nZXRfYmFzZSgkcmV0dXJuWzBdKSk7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KfQoKY2xhc3MgU2ltcGxlUGllX0F1dGhvcgp7Cgl2YXIgJG5hbWU7Cgl2YXIgJGxpbms7Cgl2YXIgJGVtYWlsOwoKCS8vIENvbnN0cnVjdG9yLCB1c2VkIHRvIGlucHV0IHRoZSBkYXRhCglmdW5jdGlvbiBTaW1wbGVQaWVfQXV0aG9yKCRuYW1lID0gbnVsbCwgJGxpbmsgPSBudWxsLCAkZW1haWwgPSBudWxsKQoJewoJCSR0aGlzLT5uYW1lID0gJG5hbWU7CgkJJHRoaXMtPmxpbmsgPSAkbGluazsKCQkkdGhpcy0+ZW1haWwgPSAkZW1haWw7Cgl9CgoJZnVuY3Rpb24gX190b1N0cmluZygpCgl7CgkJLy8gVGhlcmUgaXMgbm8gJHRoaXMtPmRhdGEgaGVyZQoJCXJldHVybiBtZDUoc2VyaWFsaXplKCR0aGlzKSk7Cgl9CgoJZnVuY3Rpb24gZ2V0X25hbWUoKQoJewoJCWlmICgkdGhpcy0+bmFtZSAhPT0gbnVsbCkKCQl7CgkJCXJldHVybiAkdGhpcy0+bmFtZTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCWZ1bmN0aW9uIGdldF9saW5rKCkKCXsKCQlpZiAoJHRoaXMtPmxpbmsgIT09IG51bGwpCgkJewoJCQlyZXR1cm4gJHRoaXMtPmxpbms7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCglmdW5jdGlvbiBnZXRfZW1haWwoKQoJewoJCWlmICgkdGhpcy0+ZW1haWwgIT09IG51bGwpCgkJewoJCQlyZXR1cm4gJHRoaXMtPmVtYWlsOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9Cn0KCmNsYXNzIFNpbXBsZVBpZV9DYXRlZ29yeQp7Cgl2YXIgJHRlcm07Cgl2YXIgJHNjaGVtZTsKCXZhciAkbGFiZWw7CgoJLy8gQ29uc3RydWN0b3IsIHVzZWQgdG8gaW5wdXQgdGhlIGRhdGEKCWZ1bmN0aW9uIFNpbXBsZVBpZV9DYXRlZ29yeSgkdGVybSA9IG51bGwsICRzY2hlbWUgPSBudWxsLCAkbGFiZWwgPSBudWxsKQoJewoJCSR0aGlzLT50ZXJtID0gJHRlcm07CgkJJHRoaXMtPnNjaGVtZSA9ICRzY2hlbWU7CgkJJHRoaXMtPmxhYmVsID0gJGxhYmVsOwoJfQoKCWZ1bmN0aW9uIF9fdG9TdHJpbmcoKQoJewoJCS8vIFRoZXJlIGlzIG5vICR0aGlzLT5kYXRhIGhlcmUKCQlyZXR1cm4gbWQ1KHNlcmlhbGl6ZSgkdGhpcykpOwoJfQoKCWZ1bmN0aW9uIGdldF90ZXJtKCkKCXsKCQlpZiAoJHRoaXMtPnRlcm0gIT09IG51bGwpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnRlcm07CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCglmdW5jdGlvbiBnZXRfc2NoZW1lKCkKCXsKCQlpZiAoJHRoaXMtPnNjaGVtZSAhPT0gbnVsbCkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2NoZW1lOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJZnVuY3Rpb24gZ2V0X2xhYmVsKCkKCXsKCQlpZiAoJHRoaXMtPmxhYmVsICE9PSBudWxsKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5sYWJlbDsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuICR0aGlzLT5nZXRfdGVybSgpOwoJCX0KCX0KfQoKY2xhc3MgU2ltcGxlUGllX0VuY2xvc3VyZQp7Cgl2YXIgJGJpdHJhdGU7Cgl2YXIgJGNhcHRpb25zOwoJdmFyICRjYXRlZ29yaWVzOwoJdmFyICRjaGFubmVsczsKCXZhciAkY29weXJpZ2h0OwoJdmFyICRjcmVkaXRzOwoJdmFyICRkZXNjcmlwdGlvbjsKCXZhciAkZHVyYXRpb247Cgl2YXIgJGV4cHJlc3Npb247Cgl2YXIgJGZyYW1lcmF0ZTsKCXZhciAkaGFuZGxlcjsKCXZhciAkaGFzaGVzOwoJdmFyICRoZWlnaHQ7Cgl2YXIgJGphdmFzY3JpcHQ7Cgl2YXIgJGtleXdvcmRzOwoJdmFyICRsYW5nOwoJdmFyICRsZW5ndGg7Cgl2YXIgJGxpbms7Cgl2YXIgJG1lZGl1bTsKCXZhciAkcGxheWVyOwoJdmFyICRyYXRpbmdzOwoJdmFyICRyZXN0cmljdGlvbnM7Cgl2YXIgJHNhbXBsaW5ncmF0ZTsKCXZhciAkdGh1bWJuYWlsczsKCXZhciAkdGl0bGU7Cgl2YXIgJHR5cGU7Cgl2YXIgJHdpZHRoOwoKCS8vIENvbnN0cnVjdG9yLCB1c2VkIHRvIGlucHV0IHRoZSBkYXRhCglmdW5jdGlvbiBTaW1wbGVQaWVfRW5jbG9zdXJlKCRsaW5rID0gbnVsbCwgJHR5cGUgPSBudWxsLCAkbGVuZ3RoID0gbnVsbCwgJGphdmFzY3JpcHQgPSBudWxsLCAkYml0cmF0ZSA9IG51bGwsICRjYXB0aW9ucyA9IG51bGwsICRjYXRlZ29yaWVzID0gbnVsbCwgJGNoYW5uZWxzID0gbnVsbCwgJGNvcHlyaWdodCA9IG51bGwsICRjcmVkaXRzID0gbnVsbCwgJGRlc2NyaXB0aW9uID0gbnVsbCwgJGR1cmF0aW9uID0gbnVsbCwgJGV4cHJlc3Npb24gPSBudWxsLCAkZnJhbWVyYXRlID0gbnVsbCwgJGhhc2hlcyA9IG51bGwsICRoZWlnaHQgPSBudWxsLCAka2V5d29yZHMgPSBudWxsLCAkbGFuZyA9IG51bGwsICRtZWRpdW0gPSBudWxsLCAkcGxheWVyID0gbnVsbCwgJHJhdGluZ3MgPSBudWxsLCAkcmVzdHJpY3Rpb25zID0gbnVsbCwgJHNhbXBsaW5ncmF0ZSA9IG51bGwsICR0aHVtYm5haWxzID0gbnVsbCwgJHRpdGxlID0gbnVsbCwgJHdpZHRoID0gbnVsbCkKCXsKCQkkdGhpcy0+Yml0cmF0ZSA9ICRiaXRyYXRlOwoJCSR0aGlzLT5jYXB0aW9ucyA9ICRjYXB0aW9uczsKCQkkdGhpcy0+Y2F0ZWdvcmllcyA9ICRjYXRlZ29yaWVzOwoJCSR0aGlzLT5jaGFubmVscyA9ICRjaGFubmVsczsKCQkkdGhpcy0+Y29weXJpZ2h0ID0gJGNvcHlyaWdodDsKCQkkdGhpcy0+Y3JlZGl0cyA9ICRjcmVkaXRzOwoJCSR0aGlzLT5kZXNjcmlwdGlvbiA9ICRkZXNjcmlwdGlvbjsKCQkkdGhpcy0+ZHVyYXRpb24gPSAkZHVyYXRpb247CgkJJHRoaXMtPmV4cHJlc3Npb24gPSAkZXhwcmVzc2lvbjsKCQkkdGhpcy0+ZnJhbWVyYXRlID0gJGZyYW1lcmF0ZTsKCQkkdGhpcy0+aGFzaGVzID0gJGhhc2hlczsKCQkkdGhpcy0+aGVpZ2h0ID0gJGhlaWdodDsKCQkkdGhpcy0+amF2YXNjcmlwdCA9ICRqYXZhc2NyaXB0OwoJCSR0aGlzLT5rZXl3b3JkcyA9ICRrZXl3b3JkczsKCQkkdGhpcy0+bGFuZyA9ICRsYW5nOwoJCSR0aGlzLT5sZW5ndGggPSAkbGVuZ3RoOwoJCSR0aGlzLT5saW5rID0gJGxpbms7CgkJJHRoaXMtPm1lZGl1bSA9ICRtZWRpdW07CgkJJHRoaXMtPnBsYXllciA9ICRwbGF5ZXI7CgkJJHRoaXMtPnJhdGluZ3MgPSAkcmF0aW5nczsKCQkkdGhpcy0+cmVzdHJpY3Rpb25zID0gJHJlc3RyaWN0aW9uczsKCQkkdGhpcy0+c2FtcGxpbmdyYXRlID0gJHNhbXBsaW5ncmF0ZTsKCQkkdGhpcy0+dGh1bWJuYWlscyA9ICR0aHVtYm5haWxzOwoJCSR0aGlzLT50aXRsZSA9ICR0aXRsZTsKCQkkdGhpcy0+dHlwZSA9ICR0eXBlOwoJCSR0aGlzLT53aWR0aCA9ICR3aWR0aDsKCQlpZiAoY2xhc3NfZXhpc3RzKCdpZG5hX2NvbnZlcnQnKSkKCQl7CgkJCSRpZG4gPSYgbmV3IGlkbmFfY29udmVydDsKCQkJJHBhcnNlZCA9IFNpbXBsZVBpZV9NaXNjOjpwYXJzZV91cmwoJGxpbmspOwoJCQkkdGhpcy0+bGluayA9IFNpbXBsZVBpZV9NaXNjOjpjb21wcmVzc19wYXJzZV91cmwoJHBhcnNlZFsnc2NoZW1lJ10sICRpZG4tPmVuY29kZSgkcGFyc2VkWydhdXRob3JpdHknXSksICRwYXJzZWRbJ3BhdGgnXSwgJHBhcnNlZFsncXVlcnknXSwgJHBhcnNlZFsnZnJhZ21lbnQnXSk7CgkJfQoJCSR0aGlzLT5oYW5kbGVyID0gJHRoaXMtPmdldF9oYW5kbGVyKCk7IC8vIE5lZWRzIHRvIGxvYWQgbGFzdAoJfQoKCWZ1bmN0aW9uIF9fdG9TdHJpbmcoKQoJewoJCS8vIFRoZXJlIGlzIG5vICR0aGlzLT5kYXRhIGhlcmUKCQlyZXR1cm4gbWQ1KHNlcmlhbGl6ZSgkdGhpcykpOwoJfQoKCWZ1bmN0aW9uIGdldF9iaXRyYXRlKCkKCXsKCQlpZiAoJHRoaXMtPmJpdHJhdGUgIT09IG51bGwpCgkJewoJCQlyZXR1cm4gJHRoaXMtPmJpdHJhdGU7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCglmdW5jdGlvbiBnZXRfY2FwdGlvbigka2V5ID0gMCkKCXsKCQkkY2FwdGlvbnMgPSAkdGhpcy0+Z2V0X2NhcHRpb25zKCk7CgkJaWYgKGlzc2V0KCRjYXB0aW9uc1ska2V5XSkpCgkJewoJCQlyZXR1cm4gJGNhcHRpb25zWyRrZXldOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJZnVuY3Rpb24gZ2V0X2NhcHRpb25zKCkKCXsKCQlpZiAoJHRoaXMtPmNhcHRpb25zICE9PSBudWxsKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5jYXB0aW9uczsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCWZ1bmN0aW9uIGdldF9jYXRlZ29yeSgka2V5ID0gMCkKCXsKCQkkY2F0ZWdvcmllcyA9ICR0aGlzLT5nZXRfY2F0ZWdvcmllcygpOwoJCWlmIChpc3NldCgkY2F0ZWdvcmllc1ska2V5XSkpCgkJewoJCQlyZXR1cm4gJGNhdGVnb3JpZXNbJGtleV07CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCglmdW5jdGlvbiBnZXRfY2F0ZWdvcmllcygpCgl7CgkJaWYgKCR0aGlzLT5jYXRlZ29yaWVzICE9PSBudWxsKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5jYXRlZ29yaWVzOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJZnVuY3Rpb24gZ2V0X2NoYW5uZWxzKCkKCXsKCQlpZiAoJHRoaXMtPmNoYW5uZWxzICE9PSBudWxsKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5jaGFubmVsczsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCWZ1bmN0aW9uIGdldF9jb3B5cmlnaHQoKQoJewoJCWlmICgkdGhpcy0+Y29weXJpZ2h0ICE9PSBudWxsKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5jb3B5cmlnaHQ7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCglmdW5jdGlvbiBnZXRfY3JlZGl0KCRrZXkgPSAwKQoJewoJCSRjcmVkaXRzID0gJHRoaXMtPmdldF9jcmVkaXRzKCk7CgkJaWYgKGlzc2V0KCRjcmVkaXRzWyRrZXldKSkKCQl7CgkJCXJldHVybiAkY3JlZGl0c1ska2V5XTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCWZ1bmN0aW9uIGdldF9jcmVkaXRzKCkKCXsKCQlpZiAoJHRoaXMtPmNyZWRpdHMgIT09IG51bGwpCgkJewoJCQlyZXR1cm4gJHRoaXMtPmNyZWRpdHM7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCglmdW5jdGlvbiBnZXRfZGVzY3JpcHRpb24oKQoJewoJCWlmICgkdGhpcy0+ZGVzY3JpcHRpb24gIT09IG51bGwpCgkJewoJCQlyZXR1cm4gJHRoaXMtPmRlc2NyaXB0aW9uOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJZnVuY3Rpb24gZ2V0X2R1cmF0aW9uKCRjb252ZXJ0ID0gZmFsc2UpCgl7CgkJaWYgKCR0aGlzLT5kdXJhdGlvbiAhPT0gbnVsbCkKCQl7CgkJCWlmICgkY29udmVydCkKCQkJewoJCQkJJHRpbWUgPSBTaW1wbGVQaWVfTWlzYzo6dGltZV9obXMoJHRoaXMtPmR1cmF0aW9uKTsKCQkJCXJldHVybiAkdGltZTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCXJldHVybiAkdGhpcy0+ZHVyYXRpb247CgkJCX0KCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCWZ1bmN0aW9uIGdldF9leHByZXNzaW9uKCkKCXsKCQlpZiAoJHRoaXMtPmV4cHJlc3Npb24gIT09IG51bGwpCgkJewoJCQlyZXR1cm4gJHRoaXMtPmV4cHJlc3Npb247CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiAnZnVsbCc7CgkJfQoJfQoKCWZ1bmN0aW9uIGdldF9leHRlbnNpb24oKQoJewoJCWlmICgkdGhpcy0+bGluayAhPT0gbnVsbCkKCQl7CgkJCSR1cmwgPSBTaW1wbGVQaWVfTWlzYzo6cGFyc2VfdXJsKCR0aGlzLT5saW5rKTsKCQkJaWYgKCR1cmxbJ3BhdGgnXSAhPT0gJycpCgkJCXsKCQkJCXJldHVybiBwYXRoaW5mbygkdXJsWydwYXRoJ10sIFBBVEhJTkZPX0VYVEVOU0lPTik7CgkJCX0KCQl9CgkJcmV0dXJuIG51bGw7Cgl9CgoJZnVuY3Rpb24gZ2V0X2ZyYW1lcmF0ZSgpCgl7CgkJaWYgKCR0aGlzLT5mcmFtZXJhdGUgIT09IG51bGwpCgkJewoJCQlyZXR1cm4gJHRoaXMtPmZyYW1lcmF0ZTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCWZ1bmN0aW9uIGdldF9oYW5kbGVyKCkKCXsKCQlyZXR1cm4gJHRoaXMtPmdldF9yZWFsX3R5cGUodHJ1ZSk7Cgl9CgoJZnVuY3Rpb24gZ2V0X2hhc2goJGtleSA9IDApCgl7CgkJJGhhc2hlcyA9ICR0aGlzLT5nZXRfaGFzaGVzKCk7CgkJaWYgKGlzc2V0KCRoYXNoZXNbJGtleV0pKQoJCXsKCQkJcmV0dXJuICRoYXNoZXNbJGtleV07CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCglmdW5jdGlvbiBnZXRfaGFzaGVzKCkKCXsKCQlpZiAoJHRoaXMtPmhhc2hlcyAhPT0gbnVsbCkKCQl7CgkJCXJldHVybiAkdGhpcy0+aGFzaGVzOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJZnVuY3Rpb24gZ2V0X2hlaWdodCgpCgl7CgkJaWYgKCR0aGlzLT5oZWlnaHQgIT09IG51bGwpCgkJewoJCQlyZXR1cm4gJHRoaXMtPmhlaWdodDsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCWZ1bmN0aW9uIGdldF9sYW5ndWFnZSgpCgl7CgkJaWYgKCR0aGlzLT5sYW5nICE9PSBudWxsKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5sYW5nOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJZnVuY3Rpb24gZ2V0X2tleXdvcmQoJGtleSA9IDApCgl7CgkJJGtleXdvcmRzID0gJHRoaXMtPmdldF9rZXl3b3JkcygpOwoJCWlmIChpc3NldCgka2V5d29yZHNbJGtleV0pKQoJCXsKCQkJcmV0dXJuICRrZXl3b3Jkc1ska2V5XTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCWZ1bmN0aW9uIGdldF9rZXl3b3JkcygpCgl7CgkJaWYgKCR0aGlzLT5rZXl3b3JkcyAhPT0gbnVsbCkKCQl7CgkJCXJldHVybiAkdGhpcy0+a2V5d29yZHM7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCglmdW5jdGlvbiBnZXRfbGVuZ3RoKCkKCXsKCQlpZiAoJHRoaXMtPmxlbmd0aCAhPT0gbnVsbCkKCQl7CgkJCXJldHVybiAkdGhpcy0+bGVuZ3RoOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJZnVuY3Rpb24gZ2V0X2xpbmsoKQoJewoJCWlmICgkdGhpcy0+bGluayAhPT0gbnVsbCkKCQl7CgkJCXJldHVybiB1cmxkZWNvZGUoJHRoaXMtPmxpbmspOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJZnVuY3Rpb24gZ2V0X21lZGl1bSgpCgl7CgkJaWYgKCR0aGlzLT5tZWRpdW0gIT09IG51bGwpCgkJewoJCQlyZXR1cm4gJHRoaXMtPm1lZGl1bTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCWZ1bmN0aW9uIGdldF9wbGF5ZXIoKQoJewoJCWlmICgkdGhpcy0+cGxheWVyICE9PSBudWxsKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5wbGF5ZXI7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCglmdW5jdGlvbiBnZXRfcmF0aW5nKCRrZXkgPSAwKQoJewoJCSRyYXRpbmdzID0gJHRoaXMtPmdldF9yYXRpbmdzKCk7CgkJaWYgKGlzc2V0KCRyYXRpbmdzWyRrZXldKSkKCQl7CgkJCXJldHVybiAkcmF0aW5nc1ska2V5XTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCWZ1bmN0aW9uIGdldF9yYXRpbmdzKCkKCXsKCQlpZiAoJHRoaXMtPnJhdGluZ3MgIT09IG51bGwpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnJhdGluZ3M7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCglmdW5jdGlvbiBnZXRfcmVzdHJpY3Rpb24oJGtleSA9IDApCgl7CgkJJHJlc3RyaWN0aW9ucyA9ICR0aGlzLT5nZXRfcmVzdHJpY3Rpb25zKCk7CgkJaWYgKGlzc2V0KCRyZXN0cmljdGlvbnNbJGtleV0pKQoJCXsKCQkJcmV0dXJuICRyZXN0cmljdGlvbnNbJGtleV07CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCglmdW5jdGlvbiBnZXRfcmVzdHJpY3Rpb25zKCkKCXsKCQlpZiAoJHRoaXMtPnJlc3RyaWN0aW9ucyAhPT0gbnVsbCkKCQl7CgkJCXJldHVybiAkdGhpcy0+cmVzdHJpY3Rpb25zOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJZnVuY3Rpb24gZ2V0X3NhbXBsaW5nX3JhdGUoKQoJewoJCWlmICgkdGhpcy0+c2FtcGxpbmdyYXRlICE9PSBudWxsKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zYW1wbGluZ3JhdGU7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCglmdW5jdGlvbiBnZXRfc2l6ZSgpCgl7CgkJJGxlbmd0aCA9ICR0aGlzLT5nZXRfbGVuZ3RoKCk7CgkJaWYgKCRsZW5ndGggIT09IG51bGwpCgkJewoJCQlyZXR1cm4gcm91bmQoJGxlbmd0aC8xMDQ4NTc2LCAyKTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCWZ1bmN0aW9uIGdldF90aHVtYm5haWwoJGtleSA9IDApCgl7CgkJJHRodW1ibmFpbHMgPSAkdGhpcy0+Z2V0X3RodW1ibmFpbHMoKTsKCQlpZiAoaXNzZXQoJHRodW1ibmFpbHNbJGtleV0pKQoJCXsKCQkJcmV0dXJuICR0aHVtYm5haWxzWyRrZXldOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJZnVuY3Rpb24gZ2V0X3RodW1ibmFpbHMoKQoJewoJCWlmICgkdGhpcy0+dGh1bWJuYWlscyAhPT0gbnVsbCkKCQl7CgkJCXJldHVybiAkdGhpcy0+dGh1bWJuYWlsczsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCWZ1bmN0aW9uIGdldF90aXRsZSgpCgl7CgkJaWYgKCR0aGlzLT50aXRsZSAhPT0gbnVsbCkKCQl7CgkJCXJldHVybiAkdGhpcy0+dGl0bGU7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCglmdW5jdGlvbiBnZXRfdHlwZSgpCgl7CgkJaWYgKCR0aGlzLT50eXBlICE9PSBudWxsKQoJCXsKCQkJcmV0dXJuICR0aGlzLT50eXBlOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJZnVuY3Rpb24gZ2V0X3dpZHRoKCkKCXsKCQlpZiAoJHRoaXMtPndpZHRoICE9PSBudWxsKQoJCXsKCQkJcmV0dXJuICR0aGlzLT53aWR0aDsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCWZ1bmN0aW9uIG5hdGl2ZV9lbWJlZCgkb3B0aW9ucz0nJykKCXsKCQlyZXR1cm4gJHRoaXMtPmVtYmVkKCRvcHRpb25zLCB0cnVlKTsKCX0KCgkvKioKCSAqIEB0b2RvIElmIHRoZSBkaW1lbnNpb25zIGZvciBtZWRpYTpjb250ZW50IGFyZSBkZWZpbmVkLCB1c2UgdGhlbSB3aGVuIHdpZHRoL2hlaWdodCBhcmUgc2V0IHRvICdhdXRvJy4KCSAqLwoJZnVuY3Rpb24gZW1iZWQoJG9wdGlvbnMgPSAnJywgJG5hdGl2ZSA9IGZhbHNlKQoJewoJCS8vIFNldCB1cCBkZWZhdWx0cwoJCSRhdWRpbyA9ICcnOwoJCSR2aWRlbyA9ICcnOwoJCSRhbHQgPSAnJzsKCQkkYWx0Y2xhc3MgPSAnJzsKCQkkbG9vcCA9ICdmYWxzZSc7CgkJJHdpZHRoID0gJ2F1dG8nOwoJCSRoZWlnaHQgPSAnYXV0byc7CgkJJGJnY29sb3IgPSAnI2ZmZmZmZic7CgkJJG1lZGlhcGxheWVyID0gJyc7CgkJJHdpZGVzY3JlZW4gPSBmYWxzZTsKCQkkaGFuZGxlciA9ICR0aGlzLT5nZXRfaGFuZGxlcigpOwoJCSR0eXBlID0gJHRoaXMtPmdldF9yZWFsX3R5cGUoKTsKCgkJLy8gUHJvY2VzcyBvcHRpb25zIGFuZCByZWFzc2lnbiB2YWx1ZXMgYXMgbmVjZXNzYXJ5CgkJaWYgKGlzX2FycmF5KCRvcHRpb25zKSkKCQl7CgkJCWV4dHJhY3QoJG9wdGlvbnMpOwoJCX0KCQllbHNlCgkJewoJCQkkb3B0aW9ucyA9IGV4cGxvZGUoJywnLCAkb3B0aW9ucyk7CgkJCWZvcmVhY2goJG9wdGlvbnMgYXMgJG9wdGlvbikKCQkJewoJCQkJJG9wdCA9IGV4cGxvZGUoJzonLCAkb3B0aW9uLCAyKTsKCQkJCWlmIChpc3NldCgkb3B0WzBdLCAkb3B0WzFdKSkKCQkJCXsKCQkJCQkkb3B0WzBdID0gdHJpbSgkb3B0WzBdKTsKCQkJCQkkb3B0WzFdID0gdHJpbSgkb3B0WzFdKTsKCQkJCQlzd2l0Y2ggKCRvcHRbMF0pCgkJCQkJewoJCQkJCQljYXNlICdhdWRpbyc6CgkJCQkJCQkkYXVkaW8gPSAkb3B0WzFdOwoJCQkJCQkJYnJlYWs7CgoJCQkJCQljYXNlICd2aWRlbyc6CgkJCQkJCQkkdmlkZW8gPSAkb3B0WzFdOwoJCQkJCQkJYnJlYWs7CgoJCQkJCQljYXNlICdhbHQnOgoJCQkJCQkJJGFsdCA9ICRvcHRbMV07CgkJCQkJCQlicmVhazsKCgkJCQkJCWNhc2UgJ2FsdGNsYXNzJzoKCQkJCQkJCSRhbHRjbGFzcyA9ICRvcHRbMV07CgkJCQkJCQlicmVhazsKCgkJCQkJCWNhc2UgJ2xvb3AnOgoJCQkJCQkJJGxvb3AgPSAkb3B0WzFdOwoJCQkJCQkJYnJlYWs7CgoJCQkJCQljYXNlICd3aWR0aCc6CgkJCQkJCQkkd2lkdGggPSAkb3B0WzFdOwoJCQkJCQkJYnJlYWs7CgoJCQkJCQljYXNlICdoZWlnaHQnOgoJCQkJCQkJJGhlaWdodCA9ICRvcHRbMV07CgkJCQkJCQlicmVhazsKCgkJCQkJCWNhc2UgJ2JnY29sb3InOgoJCQkJCQkJJGJnY29sb3IgPSAkb3B0WzFdOwoJCQkJCQkJYnJlYWs7CgoJCQkJCQljYXNlICdtZWRpYXBsYXllcic6CgkJCQkJCQkkbWVkaWFwbGF5ZXIgPSAkb3B0WzFdOwoJCQkJCQkJYnJlYWs7CgoJCQkJCQljYXNlICd3aWRlc2NyZWVuJzoKCQkJCQkJCSR3aWRlc2NyZWVuID0gJG9wdFsxXTsKCQkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCgkJJG1pbWUgPSBleHBsb2RlKCcvJywgJHR5cGUsIDIpOwoJCSRtaW1lID0gJG1pbWVbMF07CgoJCS8vIFByb2Nlc3MgdmFsdWVzIGZvciAnYXV0bycKCQlpZiAoJHdpZHRoID09ICdhdXRvJykKCQl7CgkJCWlmICgkbWltZSA9PSAndmlkZW8nKQoJCQl7CgkJCQlpZiAoJGhlaWdodCA9PSAnYXV0bycpCgkJCQl7CgkJCQkJJHdpZHRoID0gNDgwOwoJCQkJfQoJCQkJZWxzZWlmICgkd2lkZXNjcmVlbikKCQkJCXsKCQkJCQkkd2lkdGggPSByb3VuZCgoaW50dmFsKCRoZWlnaHQpLzkpKjE2KTsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQkkd2lkdGggPSByb3VuZCgoaW50dmFsKCRoZWlnaHQpLzMpKjQpOwoJCQkJfQoJCQl9CgkJCWVsc2UKCQkJewoJCQkJJHdpZHRoID0gJzEwMCUnOwoJCQl9CgkJfQoKCQlpZiAoJGhlaWdodCA9PSAnYXV0bycpCgkJewoJCQlpZiAoJG1pbWUgPT0gJ2F1ZGlvJykKCQkJewoJCQkJJGhlaWdodCA9IDA7CgkJCX0KCQkJZWxzZWlmICgkbWltZSA9PSAndmlkZW8nKQoJCQl7CgkJCQlpZiAoJHdpZHRoID09ICdhdXRvJykKCQkJCXsKCQkJCQlpZiAoJHdpZGVzY3JlZW4pCgkJCQkJewoJCQkJCQkkaGVpZ2h0ID0gMjcwOwoJCQkJCX0KCQkJCQllbHNlCgkJCQkJewoJCQkJCQkkaGVpZ2h0ID0gMzYwOwoJCQkJCX0KCQkJCX0KCQkJCWVsc2VpZiAoJHdpZGVzY3JlZW4pCgkJCQl7CgkJCQkJJGhlaWdodCA9IHJvdW5kKChpbnR2YWwoJHdpZHRoKS8xNikqOSk7CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJJGhlaWdodCA9IHJvdW5kKChpbnR2YWwoJHdpZHRoKS80KSozKTsKCQkJCX0KCQkJfQoJCQllbHNlCgkJCXsKCQkJCSRoZWlnaHQgPSAzNzY7CgkJCX0KCQl9CgkJZWxzZWlmICgkbWltZSA9PSAnYXVkaW8nKQoJCXsKCQkJJGhlaWdodCA9IDA7CgkJfQoKCQkvLyBTZXQgcHJvcGVyIHBsYWNlaG9sZGVyIHZhbHVlCgkJaWYgKCRtaW1lID09ICdhdWRpbycpCgkJewoJCQkkcGxhY2Vob2xkZXIgPSAkYXVkaW87CgkJfQoJCWVsc2VpZiAoJG1pbWUgPT0gJ3ZpZGVvJykKCQl7CgkJCSRwbGFjZWhvbGRlciA9ICR2aWRlbzsKCQl9CgoJCSRlbWJlZCA9ICcnOwoKCQkvLyBNYWtlIHN1cmUgdGhlIEpTIGxpYnJhcnkgaXMgaW5jbHVkZWQKCQlpZiAoISRuYXRpdmUpCgkJewoJCQlzdGF0aWMgJGphdmFzY3JpcHRfb3V0cHV0dGVkID0gbnVsbDsKCQkJaWYgKCEkamF2YXNjcmlwdF9vdXRwdXR0ZWQgJiYgJHRoaXMtPmphdmFzY3JpcHQpCgkJCXsKCQkJCSRlbWJlZCAuPSAnPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iPycgLiBodG1sc3BlY2lhbGNoYXJzKCR0aGlzLT5qYXZhc2NyaXB0KSAuICciPjwvc2NyaXB0Pic7CgkJCQkkamF2YXNjcmlwdF9vdXRwdXR0ZWQgPSB0cnVlOwoJCQl9CgkJfQoKCQkvLyBPZGVvIEZlZWQgTVAzJ3MKCQlpZiAoJGhhbmRsZXIgPT0gJ29kZW8nKQoJCXsKCQkJaWYgKCRuYXRpdmUpCgkJCXsKCQkJCSRlbWJlZCAuPSAnPGVtYmVkIHNyYz0iaHR0cDovL29kZW8uY29tL2ZsYXNoL2F1ZGlvX3BsYXllcl9mdWxsc2l6ZS5zd2YiIHBsdWdpbnNwYWdlPSJodHRwOi8vYWRvYmUuY29tL2dvL2dldGZsYXNocGxheWVyIiB0eXBlPSJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCIgcXVhbGl0eT0iaGlnaCIgd2lkdGg9IjQ0MCIgaGVpZ2h0PSI4MCIgd21vZGU9InRyYW5zcGFyZW50IiBhbGxvd1NjcmlwdEFjY2Vzcz0iYW55IiBmbGFzaHZhcnM9InZhbGlkX3NhbXBsZV9yYXRlPXRydWUmZXh0ZXJuYWxfdXJsPScgLiAkdGhpcy0+Z2V0X2xpbmsoKSAuICciPjwvZW1iZWQ+JzsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCSRlbWJlZCAuPSAnPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPmVtYmVkX29kZW8oIicgLiAkdGhpcy0+Z2V0X2xpbmsoKSAuICciKTs8L3NjcmlwdD4nOwoJCQl9CgkJfQoKCQkvLyBGbGFzaAoJCWVsc2VpZiAoJGhhbmRsZXIgPT0gJ2ZsYXNoJykKCQl7CgkJCWlmICgkbmF0aXZlKQoJCQl7CgkJCQkkZW1iZWQgLj0gIjxlbWJlZCBzcmM9XCIiIC4gJHRoaXMtPmdldF9saW5rKCkgLiAiXCIgcGx1Z2luc3BhZ2U9XCJodHRwOi8vYWRvYmUuY29tL2dvL2dldGZsYXNocGxheWVyXCIgdHlwZT1cIiR0eXBlXCIgcXVhbGl0eT1cImhpZ2hcIiB3aWR0aD1cIiR3aWR0aFwiIGhlaWdodD1cIiRoZWlnaHRcIiBiZ2NvbG9yPVwiJGJnY29sb3JcIiBsb29wPVwiJGxvb3BcIj48L2VtYmVkPiI7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQkkZW1iZWQgLj0gIjxzY3JpcHQgdHlwZT0ndGV4dC9qYXZhc2NyaXB0Jz5lbWJlZF9mbGFzaCgnJGJnY29sb3InLCAnJHdpZHRoJywgJyRoZWlnaHQnLCAnIiAuICR0aGlzLT5nZXRfbGluaygpIC4gIicsICckbG9vcCcsICckdHlwZScpOzwvc2NyaXB0PiI7CgkJCX0KCQl9CgoJCS8vIEZsYXNoIE1lZGlhIFBsYXllciBmaWxlIHR5cGVzLgoJCS8vIFByZWZlcnJlZCBoYW5kbGVyIGZvciBNUDMgZmlsZSB0eXBlcy4KCQllbHNlaWYgKCRoYW5kbGVyID09ICdmbWVkaWEnIHx8ICgkaGFuZGxlciA9PSAnbXAzJyAmJiAkbWVkaWFwbGF5ZXIgIT0gJycpKQoJCXsKCQkJJGhlaWdodCArPSAyMDsKCQkJaWYgKCRuYXRpdmUpCgkJCXsKCQkJCSRlbWJlZCAuPSAiPGVtYmVkIHNyYz1cIiRtZWRpYXBsYXllclwiIHBsdWdpbnNwYWdlPVwiaHR0cDovL2Fkb2JlLmNvbS9nby9nZXRmbGFzaHBsYXllclwiIHR5cGU9XCJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaFwiIHF1YWxpdHk9XCJoaWdoXCIgd2lkdGg9XCIkd2lkdGhcIiBoZWlnaHQ9XCIkaGVpZ2h0XCIgd21vZGU9XCJ0cmFuc3BhcmVudFwiIGZsYXNodmFycz1cImZpbGU9IiAuIHJhd3VybGVuY29kZSgkdGhpcy0+Z2V0X2xpbmsoKS4nP2ZpbGVfZXh0ZW5zaW9uPS4nLiR0aGlzLT5nZXRfZXh0ZW5zaW9uKCkpIC4gIiZhdXRvc3RhcnQ9ZmFsc2UmcmVwZWF0PSRsb29wJnNob3dkaWdpdHM9dHJ1ZSZzaG93ZnNidXR0b249ZmFsc2VcIj48L2VtYmVkPiI7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQkkZW1iZWQgLj0gIjxzY3JpcHQgdHlwZT0ndGV4dC9qYXZhc2NyaXB0Jz5lbWJlZF9mbHYoJyR3aWR0aCcsICckaGVpZ2h0JywgJyIgLiByYXd1cmxlbmNvZGUoJHRoaXMtPmdldF9saW5rKCkuJz9maWxlX2V4dGVuc2lvbj0uJy4kdGhpcy0+Z2V0X2V4dGVuc2lvbigpKSAuICInLCAnJHBsYWNlaG9sZGVyJywgJyRsb29wJywgJyRtZWRpYXBsYXllcicpOzwvc2NyaXB0PiI7CgkJCX0KCQl9CgoJCS8vIFF1aWNrVGltZSA3IGZpbGUgdHlwZXMuICBOZWVkIHRvIHRlc3Qgd2l0aCBRdWlja1RpbWUgNi4KCQkvLyBPbmx5IGhhbmRsZSBNUDMncyBpZiB0aGUgRmxhc2ggTWVkaWEgUGxheWVyIGlzIG5vdCBwcmVzZW50LgoJCWVsc2VpZiAoJGhhbmRsZXIgPT0gJ3F1aWNrdGltZScgfHwgKCRoYW5kbGVyID09ICdtcDMnICYmICRtZWRpYXBsYXllciA9PSAnJykpCgkJewoJCQkkaGVpZ2h0ICs9IDE2OwoJCQlpZiAoJG5hdGl2ZSkKCQkJewoJCQkJaWYgKCRwbGFjZWhvbGRlciAhPSAiIil7CgkJCQkJJGVtYmVkIC49ICI8ZW1iZWQgdHlwZT1cIiR0eXBlXCIgc3R5bGU9XCJjdXJzb3I6aGFuZDsgY3Vyc29yOnBvaW50ZXI7XCIgaHJlZj1cIiIgLiAkdGhpcy0+Z2V0X2xpbmsoKSAuICJcIiBzcmM9XCIkcGxhY2Vob2xkZXJcIiB3aWR0aD1cIiR3aWR0aFwiIGhlaWdodD1cIiRoZWlnaHRcIiBhdXRvcGxheT1cImZhbHNlXCIgdGFyZ2V0PVwibXlzZWxmXCIgY29udHJvbGxlcj1cImZhbHNlXCIgbG9vcD1cIiRsb29wXCIgc2NhbGU9XCJhc3BlY3RcIiBiZ2NvbG9yPVwiJGJnY29sb3JcIiBwbHVnaW5zcGFnZT1cImh0dHA6Ly9hcHBsZS5jb20vcXVpY2t0aW1lL2Rvd25sb2FkL1wiPjwvZW1iZWQ+IjsKCQkJCX0KCQkJCWVsc2UgewoJCQkJCSRlbWJlZCAuPSAiPGVtYmVkIHR5cGU9XCIkdHlwZVwiIHN0eWxlPVwiY3Vyc29yOmhhbmQ7IGN1cnNvcjpwb2ludGVyO1wiIHNyYz1cIiIgLiAkdGhpcy0+Z2V0X2xpbmsoKSAuICJcIiB3aWR0aD1cIiR3aWR0aFwiIGhlaWdodD1cIiRoZWlnaHRcIiBhdXRvcGxheT1cImZhbHNlXCIgdGFyZ2V0PVwibXlzZWxmXCIgY29udHJvbGxlcj1cInRydWVcIiBsb29wPVwiJGxvb3BcIiBzY2FsZT1cImFzcGVjdFwiIGJnY29sb3I9XCIkYmdjb2xvclwiIHBsdWdpbnNwYWdlPVwiaHR0cDovL2FwcGxlLmNvbS9xdWlja3RpbWUvZG93bmxvYWQvXCI+PC9lbWJlZD4iOwoJCQkJfQoJCQl9CgkJCWVsc2UKCQkJewoJCQkJJGVtYmVkIC49ICI8c2NyaXB0IHR5cGU9J3RleHQvamF2YXNjcmlwdCc+ZW1iZWRfcXVpY2t0aW1lKCckdHlwZScsICckYmdjb2xvcicsICckd2lkdGgnLCAnJGhlaWdodCcsICciIC4gJHRoaXMtPmdldF9saW5rKCkgLiAiJywgJyRwbGFjZWhvbGRlcicsICckbG9vcCcpOzwvc2NyaXB0PiI7CgkJCX0KCQl9CgoJCS8vIFdpbmRvd3MgTWVkaWEKCQllbHNlaWYgKCRoYW5kbGVyID09ICd3bWVkaWEnKQoJCXsKCQkJJGhlaWdodCArPSA0NTsKCQkJaWYgKCRuYXRpdmUpCgkJCXsKCQkJCSRlbWJlZCAuPSAiPGVtYmVkIHR5cGU9XCJhcHBsaWNhdGlvbi94LW1wbGF5ZXIyXCIgc3JjPVwiIiAuICR0aGlzLT5nZXRfbGluaygpIC4gIlwiIGF1dG9zaXplPVwiMVwiIHdpZHRoPVwiJHdpZHRoXCIgaGVpZ2h0PVwiJGhlaWdodFwiIHNob3djb250cm9scz1cIjFcIiBzaG93c3RhdHVzYmFyPVwiMFwiIHNob3dkaXNwbGF5PVwiMFwiIGF1dG9zdGFydD1cIjBcIj48L2VtYmVkPiI7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQkkZW1iZWQgLj0gIjxzY3JpcHQgdHlwZT0ndGV4dC9qYXZhc2NyaXB0Jz5lbWJlZF93bWVkaWEoJyR3aWR0aCcsICckaGVpZ2h0JywgJyIgLiAkdGhpcy0+Z2V0X2xpbmsoKSAuICInKTs8L3NjcmlwdD4iOwoJCQl9CgkJfQoKCQkvLyBFdmVyeXRoaW5nIGVsc2UKCQllbHNlICRlbWJlZCAuPSAnPGEgaHJlZj0iJyAuICR0aGlzLT5nZXRfbGluaygpIC4gJyIgY2xhc3M9IicgLiAkYWx0Y2xhc3MgLiAnIj4nIC4gJGFsdCAuICc8L2E+JzsKCgkJcmV0dXJuICRlbWJlZDsKCX0KCglmdW5jdGlvbiBnZXRfcmVhbF90eXBlKCRmaW5kX2hhbmRsZXIgPSBmYWxzZSkKCXsKCQkvLyBJZiBpdCdzIE9kZW8sIGxldCdzIGdldCBpdCBvdXQgb2YgdGhlIHdheS4KCQlpZiAoc3Vic3RyKHN0cnRvbG93ZXIoJHRoaXMtPmdldF9saW5rKCkpLCAwLCAxNSkgPT0gJ2h0dHA6Ly9vZGVvLmNvbScpCgkJewoJCQlyZXR1cm4gJ29kZW8nOwoJCX0KCgkJLy8gTWltZS10eXBlcyBieSBoYW5kbGVyLgoJCSR0eXBlc19mbGFzaCA9IGFycmF5KCdhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCcsICdhcHBsaWNhdGlvbi9mdXR1cmVzcGxhc2gnKTsgLy8gRmxhc2gKCQkkdHlwZXNfZm1lZGlhID0gYXJyYXkoJ3ZpZGVvL2ZsdicsICd2aWRlby94LWZsdicsJ2Zsdi1hcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nKTsgLy8gRmxhc2ggTWVkaWEgUGxheWVyCgkJJHR5cGVzX3F1aWNrdGltZSA9IGFycmF5KCdhdWRpby8zZ3BwJywgJ2F1ZGlvLzNncHAyJywgJ2F1ZGlvL2FhYycsICdhdWRpby94LWFhYycsICdhdWRpby9haWZmJywgJ2F1ZGlvL3gtYWlmZicsICdhdWRpby9taWQnLCAnYXVkaW8vbWlkaScsICdhdWRpby94LW1pZGknLCAnYXVkaW8vbXA0JywgJ2F1ZGlvL200YScsICdhdWRpby94LW00YScsICdhdWRpby93YXYnLCAnYXVkaW8veC13YXYnLCAndmlkZW8vM2dwcCcsICd2aWRlby8zZ3BwMicsICd2aWRlby9tNHYnLCAndmlkZW8veC1tNHYnLCAndmlkZW8vbXA0JywgJ3ZpZGVvL21wZWcnLCAndmlkZW8veC1tcGVnJywgJ3ZpZGVvL3F1aWNrdGltZScsICd2aWRlby9zZC12aWRlbycpOyAvLyBRdWlja1RpbWUKCQkkdHlwZXNfd21lZGlhID0gYXJyYXkoJ2FwcGxpY2F0aW9uL2FzeCcsICdhcHBsaWNhdGlvbi94LW1wbGF5ZXIyJywgJ2F1ZGlvL3gtbXMtd21hJywgJ2F1ZGlvL3gtbXMtd2F4JywgJ3ZpZGVvL3gtbXMtYXNmLXBsdWdpbicsICd2aWRlby94LW1zLWFzZicsICd2aWRlby94LW1zLXdtJywgJ3ZpZGVvL3gtbXMtd212JywgJ3ZpZGVvL3gtbXMtd3Z4Jyk7IC8vIFdpbmRvd3MgTWVkaWEKCQkkdHlwZXNfbXAzID0gYXJyYXkoJ2F1ZGlvL21wMycsICdhdWRpby94LW1wMycsICdhdWRpby9tcGVnJywgJ2F1ZGlvL3gtbXBlZycpOyAvLyBNUDMKCgkJaWYgKCR0aGlzLT5nZXRfdHlwZSgpICE9PSBudWxsKQoJCXsKCQkJJHR5cGUgPSBzdHJ0b2xvd2VyKCR0aGlzLT50eXBlKTsKCQl9CgkJZWxzZQoJCXsKCQkJJHR5cGUgPSBudWxsOwoJCX0KCgkJLy8gSWYgd2UgZW5jb3VudGVyIGFuIHVuc3VwcG9ydGVkIG1pbWUtdHlwZSwgY2hlY2sgdGhlIGZpbGUgZXh0ZW5zaW9uIGFuZCBndWVzcyBpbnRlbGxpZ2VudGx5LgoJCWlmICghaW5fYXJyYXkoJHR5cGUsIGFycmF5X21lcmdlKCR0eXBlc19mbGFzaCwgJHR5cGVzX2ZtZWRpYSwgJHR5cGVzX3F1aWNrdGltZSwgJHR5cGVzX3dtZWRpYSwgJHR5cGVzX21wMykpKQoJCXsKCQkJc3dpdGNoIChzdHJ0b2xvd2VyKCR0aGlzLT5nZXRfZXh0ZW5zaW9uKCkpKQoJCQl7CgkJCQkvLyBBdWRpbyBtaW1lLXR5cGVzCgkJCQljYXNlICdhYWMnOgoJCQkJY2FzZSAnYWR0cyc6CgkJCQkJJHR5cGUgPSAnYXVkaW8vYWNjJzsKCQkJCQlicmVhazsKCgkJCQljYXNlICdhaWYnOgoJCQkJY2FzZSAnYWlmYyc6CgkJCQljYXNlICdhaWZmJzoKCQkJCWNhc2UgJ2NkZGEnOgoJCQkJCSR0eXBlID0gJ2F1ZGlvL2FpZmYnOwoJCQkJCWJyZWFrOwoKCQkJCWNhc2UgJ2J3Zic6CgkJCQkJJHR5cGUgPSAnYXVkaW8vd2F2JzsKCQkJCQlicmVhazsKCgkJCQljYXNlICdrYXInOgoJCQkJY2FzZSAnbWlkJzoKCQkJCWNhc2UgJ21pZGknOgoJCQkJY2FzZSAnc21mJzoKCQkJCQkkdHlwZSA9ICdhdWRpby9taWRpJzsKCQkJCQlicmVhazsKCgkJCQljYXNlICdtNGEnOgoJCQkJCSR0eXBlID0gJ2F1ZGlvL3gtbTRhJzsKCQkJCQlicmVhazsKCgkJCQljYXNlICdtcDMnOgoJCQkJY2FzZSAnc3dhJzoKCQkJCQkkdHlwZSA9ICdhdWRpby9tcDMnOwoJCQkJCWJyZWFrOwoKCQkJCWNhc2UgJ3dhdic6CgkJCQkJJHR5cGUgPSAnYXVkaW8vd2F2JzsKCQkJCQlicmVhazsKCgkJCQljYXNlICd3YXgnOgoJCQkJCSR0eXBlID0gJ2F1ZGlvL3gtbXMtd2F4JzsKCQkJCQlicmVhazsKCgkJCQljYXNlICd3bWEnOgoJCQkJCSR0eXBlID0gJ2F1ZGlvL3gtbXMtd21hJzsKCQkJCQlicmVhazsKCgkJCQkvLyBWaWRlbyBtaW1lLXR5cGVzCgkJCQljYXNlICczZ3AnOgoJCQkJY2FzZSAnM2dwcCc6CgkJCQkJJHR5cGUgPSAndmlkZW8vM2dwcCc7CgkJCQkJYnJlYWs7CgoJCQkJY2FzZSAnM2cyJzoKCQkJCWNhc2UgJzNncDInOgoJCQkJCSR0eXBlID0gJ3ZpZGVvLzNncHAyJzsKCQkJCQlicmVhazsKCgkJCQljYXNlICdhc2YnOgoJCQkJCSR0eXBlID0gJ3ZpZGVvL3gtbXMtYXNmJzsKCQkJCQlicmVhazsKCgkJCQljYXNlICdmbHYnOgoJCQkJCSR0eXBlID0gJ3ZpZGVvL3gtZmx2JzsKCQkJCQlicmVhazsKCgkJCQljYXNlICdtMWEnOgoJCQkJY2FzZSAnbTFzJzoKCQkJCWNhc2UgJ20xdic6CgkJCQljYXNlICdtMTUnOgoJCQkJY2FzZSAnbTc1JzoKCQkJCWNhc2UgJ21wMic6CgkJCQljYXNlICdtcGEnOgoJCQkJY2FzZSAnbXBlZyc6CgkJCQljYXNlICdtcGcnOgoJCQkJY2FzZSAnbXBtJzoKCQkJCWNhc2UgJ21wdic6CgkJCQkJJHR5cGUgPSAndmlkZW8vbXBlZyc7CgkJCQkJYnJlYWs7CgoJCQkJY2FzZSAnbTR2JzoKCQkJCQkkdHlwZSA9ICd2aWRlby94LW00dic7CgkJCQkJYnJlYWs7CgoJCQkJY2FzZSAnbW92JzoKCQkJCWNhc2UgJ3F0JzoKCQkJCQkkdHlwZSA9ICd2aWRlby9xdWlja3RpbWUnOwoJCQkJCWJyZWFrOwoKCQkJCWNhc2UgJ21wNCc6CgkJCQljYXNlICdtcGc0JzoKCQkJCQkkdHlwZSA9ICd2aWRlby9tcDQnOwoJCQkJCWJyZWFrOwoKCQkJCWNhc2UgJ3Nkdic6CgkJCQkJJHR5cGUgPSAndmlkZW8vc2QtdmlkZW8nOwoJCQkJCWJyZWFrOwoKCQkJCWNhc2UgJ3dtJzoKCQkJCQkkdHlwZSA9ICd2aWRlby94LW1zLXdtJzsKCQkJCQlicmVhazsKCgkJCQljYXNlICd3bXYnOgoJCQkJCSR0eXBlID0gJ3ZpZGVvL3gtbXMtd212JzsKCQkJCQlicmVhazsKCgkJCQljYXNlICd3dngnOgoJCQkJCSR0eXBlID0gJ3ZpZGVvL3gtbXMtd3Z4JzsKCQkJCQlicmVhazsKCgkJCQkvLyBGbGFzaCBtaW1lLXR5cGVzCgkJCQljYXNlICdzcGwnOgoJCQkJCSR0eXBlID0gJ2FwcGxpY2F0aW9uL2Z1dHVyZXNwbGFzaCc7CgkJCQkJYnJlYWs7CgoJCQkJY2FzZSAnc3dmJzoKCQkJCQkkdHlwZSA9ICdhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCc7CgkJCQkJYnJlYWs7CgkJCX0KCQl9CgoJCWlmICgkZmluZF9oYW5kbGVyKQoJCXsKCQkJaWYgKGluX2FycmF5KCR0eXBlLCAkdHlwZXNfZmxhc2gpKQoJCQl7CgkJCQlyZXR1cm4gJ2ZsYXNoJzsKCQkJfQoJCQllbHNlaWYgKGluX2FycmF5KCR0eXBlLCAkdHlwZXNfZm1lZGlhKSkKCQkJewoJCQkJcmV0dXJuICdmbWVkaWEnOwoJCQl9CgkJCWVsc2VpZiAoaW5fYXJyYXkoJHR5cGUsICR0eXBlc19xdWlja3RpbWUpKQoJCQl7CgkJCQlyZXR1cm4gJ3F1aWNrdGltZSc7CgkJCX0KCQkJZWxzZWlmIChpbl9hcnJheSgkdHlwZSwgJHR5cGVzX3dtZWRpYSkpCgkJCXsKCQkJCXJldHVybiAnd21lZGlhJzsKCQkJfQoJCQllbHNlaWYgKGluX2FycmF5KCR0eXBlLCAkdHlwZXNfbXAzKSkKCQkJewoJCQkJcmV0dXJuICdtcDMnOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJcmV0dXJuIG51bGw7CgkJCX0KCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuICR0eXBlOwoJCX0KCX0KfQoKY2xhc3MgU2ltcGxlUGllX0NhcHRpb24KewoJdmFyICR0eXBlOwoJdmFyICRsYW5nOwoJdmFyICRzdGFydFRpbWU7Cgl2YXIgJGVuZFRpbWU7Cgl2YXIgJHRleHQ7CgoJLy8gQ29uc3RydWN0b3IsIHVzZWQgdG8gaW5wdXQgdGhlIGRhdGEKCWZ1bmN0aW9uIFNpbXBsZVBpZV9DYXB0aW9uKCR0eXBlID0gbnVsbCwgJGxhbmcgPSBudWxsLCAkc3RhcnRUaW1lID0gbnVsbCwgJGVuZFRpbWUgPSBudWxsLCAkdGV4dCA9IG51bGwpCgl7CgkJJHRoaXMtPnR5cGUgPSAkdHlwZTsKCQkkdGhpcy0+bGFuZyA9ICRsYW5nOwoJCSR0aGlzLT5zdGFydFRpbWUgPSAkc3RhcnRUaW1lOwoJCSR0aGlzLT5lbmRUaW1lID0gJGVuZFRpbWU7CgkJJHRoaXMtPnRleHQgPSAkdGV4dDsKCX0KCglmdW5jdGlvbiBfX3RvU3RyaW5nKCkKCXsKCQkvLyBUaGVyZSBpcyBubyAkdGhpcy0+ZGF0YSBoZXJlCgkJcmV0dXJuIG1kNShzZXJpYWxpemUoJHRoaXMpKTsKCX0KCglmdW5jdGlvbiBnZXRfZW5kdGltZSgpCgl7CgkJaWYgKCR0aGlzLT5lbmRUaW1lICE9PSBudWxsKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5lbmRUaW1lOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJZnVuY3Rpb24gZ2V0X2xhbmd1YWdlKCkKCXsKCQlpZiAoJHRoaXMtPmxhbmcgIT09IG51bGwpCgkJewoJCQlyZXR1cm4gJHRoaXMtPmxhbmc7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCglmdW5jdGlvbiBnZXRfc3RhcnR0aW1lKCkKCXsKCQlpZiAoJHRoaXMtPnN0YXJ0VGltZSAhPT0gbnVsbCkKCQl7CgkJCXJldHVybiAkdGhpcy0+c3RhcnRUaW1lOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJZnVuY3Rpb24gZ2V0X3RleHQoKQoJewoJCWlmICgkdGhpcy0+dGV4dCAhPT0gbnVsbCkKCQl7CgkJCXJldHVybiAkdGhpcy0+dGV4dDsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCWZ1bmN0aW9uIGdldF90eXBlKCkKCXsKCQlpZiAoJHRoaXMtPnR5cGUgIT09IG51bGwpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnR5cGU7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KfQoKY2xhc3MgU2ltcGxlUGllX0NyZWRpdAp7Cgl2YXIgJHJvbGU7Cgl2YXIgJHNjaGVtZTsKCXZhciAkbmFtZTsKCgkvLyBDb25zdHJ1Y3RvciwgdXNlZCB0byBpbnB1dCB0aGUgZGF0YQoJZnVuY3Rpb24gU2ltcGxlUGllX0NyZWRpdCgkcm9sZSA9IG51bGwsICRzY2hlbWUgPSBudWxsLCAkbmFtZSA9IG51bGwpCgl7CgkJJHRoaXMtPnJvbGUgPSAkcm9sZTsKCQkkdGhpcy0+c2NoZW1lID0gJHNjaGVtZTsKCQkkdGhpcy0+bmFtZSA9ICRuYW1lOwoJfQoKCWZ1bmN0aW9uIF9fdG9TdHJpbmcoKQoJewoJCS8vIFRoZXJlIGlzIG5vICR0aGlzLT5kYXRhIGhlcmUKCQlyZXR1cm4gbWQ1KHNlcmlhbGl6ZSgkdGhpcykpOwoJfQoKCWZ1bmN0aW9uIGdldF9yb2xlKCkKCXsKCQlpZiAoJHRoaXMtPnJvbGUgIT09IG51bGwpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnJvbGU7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCglmdW5jdGlvbiBnZXRfc2NoZW1lKCkKCXsKCQlpZiAoJHRoaXMtPnNjaGVtZSAhPT0gbnVsbCkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2NoZW1lOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJZnVuY3Rpb24gZ2V0X25hbWUoKQoJewoJCWlmICgkdGhpcy0+bmFtZSAhPT0gbnVsbCkKCQl7CgkJCXJldHVybiAkdGhpcy0+bmFtZTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQp9CgpjbGFzcyBTaW1wbGVQaWVfQ29weXJpZ2h0CnsKCXZhciAkdXJsOwoJdmFyICRsYWJlbDsKCgkvLyBDb25zdHJ1Y3RvciwgdXNlZCB0byBpbnB1dCB0aGUgZGF0YQoJZnVuY3Rpb24gU2ltcGxlUGllX0NvcHlyaWdodCgkdXJsID0gbnVsbCwgJGxhYmVsID0gbnVsbCkKCXsKCQkkdGhpcy0+dXJsID0gJHVybDsKCQkkdGhpcy0+bGFiZWwgPSAkbGFiZWw7Cgl9CgoJZnVuY3Rpb24gX190b1N0cmluZygpCgl7CgkJLy8gVGhlcmUgaXMgbm8gJHRoaXMtPmRhdGEgaGVyZQoJCXJldHVybiBtZDUoc2VyaWFsaXplKCR0aGlzKSk7Cgl9CgoJZnVuY3Rpb24gZ2V0X3VybCgpCgl7CgkJaWYgKCR0aGlzLT51cmwgIT09IG51bGwpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnVybDsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCWZ1bmN0aW9uIGdldF9hdHRyaWJ1dGlvbigpCgl7CgkJaWYgKCR0aGlzLT5sYWJlbCAhPT0gbnVsbCkKCQl7CgkJCXJldHVybiAkdGhpcy0+bGFiZWw7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KfQoKY2xhc3MgU2ltcGxlUGllX1JhdGluZwp7Cgl2YXIgJHNjaGVtZTsKCXZhciAkdmFsdWU7CgoJLy8gQ29uc3RydWN0b3IsIHVzZWQgdG8gaW5wdXQgdGhlIGRhdGEKCWZ1bmN0aW9uIFNpbXBsZVBpZV9SYXRpbmcoJHNjaGVtZSA9IG51bGwsICR2YWx1ZSA9IG51bGwpCgl7CgkJJHRoaXMtPnNjaGVtZSA9ICRzY2hlbWU7CgkJJHRoaXMtPnZhbHVlID0gJHZhbHVlOwoJfQoKCWZ1bmN0aW9uIF9fdG9TdHJpbmcoKQoJewoJCS8vIFRoZXJlIGlzIG5vICR0aGlzLT5kYXRhIGhlcmUKCQlyZXR1cm4gbWQ1KHNlcmlhbGl6ZSgkdGhpcykpOwoJfQoKCWZ1bmN0aW9uIGdldF9zY2hlbWUoKQoJewoJCWlmICgkdGhpcy0+c2NoZW1lICE9PSBudWxsKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5zY2hlbWU7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCglmdW5jdGlvbiBnZXRfdmFsdWUoKQoJewoJCWlmICgkdGhpcy0+dmFsdWUgIT09IG51bGwpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnZhbHVlOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9Cn0KCmNsYXNzIFNpbXBsZVBpZV9SZXN0cmljdGlvbgp7Cgl2YXIgJHJlbGF0aW9uc2hpcDsKCXZhciAkdHlwZTsKCXZhciAkdmFsdWU7CgoJLy8gQ29uc3RydWN0b3IsIHVzZWQgdG8gaW5wdXQgdGhlIGRhdGEKCWZ1bmN0aW9uIFNpbXBsZVBpZV9SZXN0cmljdGlvbigkcmVsYXRpb25zaGlwID0gbnVsbCwgJHR5cGUgPSBudWxsLCAkdmFsdWUgPSBudWxsKQoJewoJCSR0aGlzLT5yZWxhdGlvbnNoaXAgPSAkcmVsYXRpb25zaGlwOwoJCSR0aGlzLT50eXBlID0gJHR5cGU7CgkJJHRoaXMtPnZhbHVlID0gJHZhbHVlOwoJfQoKCWZ1bmN0aW9uIF9fdG9TdHJpbmcoKQoJewoJCS8vIFRoZXJlIGlzIG5vICR0aGlzLT5kYXRhIGhlcmUKCQlyZXR1cm4gbWQ1KHNlcmlhbGl6ZSgkdGhpcykpOwoJfQoKCWZ1bmN0aW9uIGdldF9yZWxhdGlvbnNoaXAoKQoJewoJCWlmICgkdGhpcy0+cmVsYXRpb25zaGlwICE9PSBudWxsKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5yZWxhdGlvbnNoaXA7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCglmdW5jdGlvbiBnZXRfdHlwZSgpCgl7CgkJaWYgKCR0aGlzLT50eXBlICE9PSBudWxsKQoJCXsKCQkJcmV0dXJuICR0aGlzLT50eXBlOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJZnVuY3Rpb24gZ2V0X3ZhbHVlKCkKCXsKCQlpZiAoJHRoaXMtPnZhbHVlICE9PSBudWxsKQoJCXsKCQkJcmV0dXJuICR0aGlzLT52YWx1ZTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQp9CgovKioKICogQHRvZG8gTW92ZSB0byBwcm9wZXJseSBzdXBwb3J0aW5nIFJGQzI2MTYgKEhUVFAvMS4xKQogKi8KY2xhc3MgU2ltcGxlUGllX0ZpbGUKewoJdmFyICR1cmw7Cgl2YXIgJHVzZXJhZ2VudDsKCXZhciAkc3VjY2VzcyA9IHRydWU7Cgl2YXIgJGhlYWRlcnMgPSBhcnJheSgpOwoJdmFyICRib2R5OwoJdmFyICRzdGF0dXNfY29kZTsKCXZhciAkcmVkaXJlY3RzID0gMDsKCXZhciAkZXJyb3I7Cgl2YXIgJG1ldGhvZCA9IFNJTVBMRVBJRV9GSUxFX1NPVVJDRV9OT05FOwoKCWZ1bmN0aW9uIFNpbXBsZVBpZV9GaWxlKCR1cmwsICR0aW1lb3V0ID0gMTAsICRyZWRpcmVjdHMgPSA1LCAkaGVhZGVycyA9IG51bGwsICR1c2VyYWdlbnQgPSBudWxsLCAkZm9yY2VfZnNvY2tvcGVuID0gZmFsc2UpCgl7CgkJaWYgKGNsYXNzX2V4aXN0cygnaWRuYV9jb252ZXJ0JykpCgkJewoJCQkkaWRuID0mIG5ldyBpZG5hX2NvbnZlcnQ7CgkJCSRwYXJzZWQgPSBTaW1wbGVQaWVfTWlzYzo6cGFyc2VfdXJsKCR1cmwpOwoJCQkkdXJsID0gU2ltcGxlUGllX01pc2M6OmNvbXByZXNzX3BhcnNlX3VybCgkcGFyc2VkWydzY2hlbWUnXSwgJGlkbi0+ZW5jb2RlKCRwYXJzZWRbJ2F1dGhvcml0eSddKSwgJHBhcnNlZFsncGF0aCddLCAkcGFyc2VkWydxdWVyeSddLCAkcGFyc2VkWydmcmFnbWVudCddKTsKCQl9CgkJJHRoaXMtPnVybCA9ICR1cmw7CgkJJHRoaXMtPnVzZXJhZ2VudCA9ICR1c2VyYWdlbnQ7CgkJaWYgKHByZWdfbWF0Y2goJy9eaHR0cChzKT86XC9cLy9pJywgJHVybCkpCgkJewoJCQlpZiAoJHVzZXJhZ2VudCA9PT0gbnVsbCkKCQkJewoJCQkJJHVzZXJhZ2VudCA9IGluaV9nZXQoJ3VzZXJfYWdlbnQnKTsKCQkJCSR0aGlzLT51c2VyYWdlbnQgPSAkdXNlcmFnZW50OwoJCQl9CgkJCWlmICghaXNfYXJyYXkoJGhlYWRlcnMpKQoJCQl7CgkJCQkkaGVhZGVycyA9IGFycmF5KCk7CgkJCX0KCQkJaWYgKCEkZm9yY2VfZnNvY2tvcGVuICYmIGZ1bmN0aW9uX2V4aXN0cygnY3VybF9leGVjJykpCgkJCXsKCQkJCSR0aGlzLT5tZXRob2QgPSBTSU1QTEVQSUVfRklMRV9TT1VSQ0VfUkVNT1RFIHwgU0lNUExFUElFX0ZJTEVfU09VUkNFX0NVUkw7CgkJCQkkZnAgPSBjdXJsX2luaXQoKTsKCQkJCSRoZWFkZXJzMiA9IGFycmF5KCk7CgkJCQlmb3JlYWNoICgkaGVhZGVycyBhcyAka2V5ID0+ICR2YWx1ZSkKCQkJCXsKCQkJCQkkaGVhZGVyczJbXSA9ICIka2V5OiAkdmFsdWUiOwoJCQkJfQoJCQkJaWYgKHZlcnNpb25fY29tcGFyZShTaW1wbGVQaWVfTWlzYzo6Z2V0X2N1cmxfdmVyc2lvbigpLCAnNy4xMC41JywgJz49JykpCgkJCQl7CgkJCQkJY3VybF9zZXRvcHQoJGZwLCBDVVJMT1BUX0VOQ09ESU5HLCAnJyk7CgkJCQl9CgkJCQljdXJsX3NldG9wdCgkZnAsIENVUkxPUFRfVVJMLCAkdXJsKTsKCQkJCWN1cmxfc2V0b3B0KCRmcCwgQ1VSTE9QVF9IRUFERVIsIDEpOwoJCQkJY3VybF9zZXRvcHQoJGZwLCBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLCAxKTsKCQkJCWN1cmxfc2V0b3B0KCRmcCwgQ1VSTE9QVF9USU1FT1VULCAkdGltZW91dCk7CgkJCQljdXJsX3NldG9wdCgkZnAsIENVUkxPUFRfQ09OTkVDVFRJTUVPVVQsICR0aW1lb3V0KTsKCQkJCWN1cmxfc2V0b3B0KCRmcCwgQ1VSTE9QVF9SRUZFUkVSLCAkdXJsKTsKCQkJCWN1cmxfc2V0b3B0KCRmcCwgQ1VSTE9QVF9VU0VSQUdFTlQsICR1c2VyYWdlbnQpOwoJCQkJY3VybF9zZXRvcHQoJGZwLCBDVVJMT1BUX0hUVFBIRUFERVIsICRoZWFkZXJzMik7CgkJCQlpZiAoIWluaV9nZXQoJ29wZW5fYmFzZWRpcicpICYmICFpbmlfZ2V0KCdzYWZlX21vZGUnKSAmJiB2ZXJzaW9uX2NvbXBhcmUoU2ltcGxlUGllX01pc2M6OmdldF9jdXJsX3ZlcnNpb24oKSwgJzcuMTUuMicsICc+PScpKQoJCQkJewoJCQkJCWN1cmxfc2V0b3B0KCRmcCwgQ1VSTE9QVF9GT0xMT1dMT0NBVElPTiwgMSk7CgkJCQkJY3VybF9zZXRvcHQoJGZwLCBDVVJMT1BUX01BWFJFRElSUywgJHJlZGlyZWN0cyk7CgkJCQl9CgoJCQkJJHRoaXMtPmhlYWRlcnMgPSBjdXJsX2V4ZWMoJGZwKTsKCQkJCWlmIChjdXJsX2Vycm5vKCRmcCkgPT0gMjMgfHwgY3VybF9lcnJubygkZnApID09IDYxKQoJCQkJewoJCQkJCWN1cmxfc2V0b3B0KCRmcCwgQ1VSTE9QVF9FTkNPRElORywgJ25vbmUnKTsKCQkJCQkkdGhpcy0+aGVhZGVycyA9IGN1cmxfZXhlYygkZnApOwoJCQkJfQoJCQkJaWYgKGN1cmxfZXJybm8oJGZwKSkKCQkJCXsKCQkJCQkkdGhpcy0+ZXJyb3IgPSAnY1VSTCBlcnJvciAnIC4gY3VybF9lcnJubygkZnApIC4gJzogJyAuIGN1cmxfZXJyb3IoJGZwKTsKCQkJCQkkdGhpcy0+c3VjY2VzcyA9IGZhbHNlOwoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCSRpbmZvID0gY3VybF9nZXRpbmZvKCRmcCk7CgkJCQkJY3VybF9jbG9zZSgkZnApOwoJCQkJCSR0aGlzLT5oZWFkZXJzID0gZXhwbG9kZSgiXHJcblxyXG4iLCAkdGhpcy0+aGVhZGVycywgJGluZm9bJ3JlZGlyZWN0X2NvdW50J10gKyAxKTsKCQkJCQkkdGhpcy0+aGVhZGVycyA9IGFycmF5X3BvcCgkdGhpcy0+aGVhZGVycyk7CgkJCQkJJHBhcnNlciA9JiBuZXcgU2ltcGxlUGllX0hUVFBfUGFyc2VyKCR0aGlzLT5oZWFkZXJzKTsKCQkJCQlpZiAoJHBhcnNlci0+cGFyc2UoKSkKCQkJCQl7CgkJCQkJCSR0aGlzLT5oZWFkZXJzID0gJHBhcnNlci0+aGVhZGVyczsKCQkJCQkJJHRoaXMtPmJvZHkgPSAkcGFyc2VyLT5ib2R5OwoJCQkJCQkkdGhpcy0+c3RhdHVzX2NvZGUgPSAkcGFyc2VyLT5zdGF0dXNfY29kZTsKCQkJCQkJaWYgKCgkdGhpcy0+c3RhdHVzX2NvZGUgPT0gMzAwIHx8ICR0aGlzLT5zdGF0dXNfY29kZSA9PSAzMDEgfHwgJHRoaXMtPnN0YXR1c19jb2RlID09IDMwMiB8fCAkdGhpcy0+c3RhdHVzX2NvZGUgPT0gMzAzIHx8ICR0aGlzLT5zdGF0dXNfY29kZSA9PSAzMDcgfHwgJHRoaXMtPnN0YXR1c19jb2RlID4gMzA3ICYmICR0aGlzLT5zdGF0dXNfY29kZSA8IDQwMCkgJiYgaXNzZXQoJHRoaXMtPmhlYWRlcnNbJ2xvY2F0aW9uJ10pICYmICR0aGlzLT5yZWRpcmVjdHMgPCAkcmVkaXJlY3RzKQoJCQkJCQl7CgkJCQkJCQkkdGhpcy0+cmVkaXJlY3RzKys7CgkJCQkJCQkkbG9jYXRpb24gPSBTaW1wbGVQaWVfTWlzYzo6YWJzb2x1dGl6ZV91cmwoJHRoaXMtPmhlYWRlcnNbJ2xvY2F0aW9uJ10sICR1cmwpOwoJCQkJCQkJcmV0dXJuICR0aGlzLT5TaW1wbGVQaWVfRmlsZSgkbG9jYXRpb24sICR0aW1lb3V0LCAkcmVkaXJlY3RzLCAkaGVhZGVycywgJHVzZXJhZ2VudCwgJGZvcmNlX2Zzb2Nrb3Blbik7CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQkkdGhpcy0+bWV0aG9kID0gU0lNUExFUElFX0ZJTEVfU09VUkNFX1JFTU9URSB8IFNJTVBMRVBJRV9GSUxFX1NPVVJDRV9GU09DS09QRU47CgkJCQkkdXJsX3BhcnRzID0gcGFyc2VfdXJsKCR1cmwpOwoJCQkJaWYgKGlzc2V0KCR1cmxfcGFydHNbJ3NjaGVtZSddKSAmJiBzdHJ0b2xvd2VyKCR1cmxfcGFydHNbJ3NjaGVtZSddKSA9PSAnaHR0cHMnKQoJCQkJewoJCQkJCSR1cmxfcGFydHNbJ2hvc3QnXSA9ICJzc2w6Ly8kdXJsX3BhcnRzW2hvc3RdIjsKCQkJCQkkdXJsX3BhcnRzWydwb3J0J10gPSA0NDM7CgkJCQl9CgkJCQlpZiAoIWlzc2V0KCR1cmxfcGFydHNbJ3BvcnQnXSkpCgkJCQl7CgkJCQkJJHVybF9wYXJ0c1sncG9ydCddID0gODA7CgkJCQl9CgkJCQkkZnAgPSBAZnNvY2tvcGVuKCR1cmxfcGFydHNbJ2hvc3QnXSwgJHVybF9wYXJ0c1sncG9ydCddLCAkZXJybm8sICRlcnJzdHIsICR0aW1lb3V0KTsKCQkJCWlmICghJGZwKQoJCQkJewoJCQkJCSR0aGlzLT5lcnJvciA9ICdmc29ja29wZW4gZXJyb3I6ICcgLiAkZXJyc3RyOwoJCQkJCSR0aGlzLT5zdWNjZXNzID0gZmFsc2U7CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJc3RyZWFtX3NldF90aW1lb3V0KCRmcCwgJHRpbWVvdXQpOwoJCQkJCWlmIChpc3NldCgkdXJsX3BhcnRzWydwYXRoJ10pKQoJCQkJCXsKCQkJCQkJaWYgKGlzc2V0KCR1cmxfcGFydHNbJ3F1ZXJ5J10pKQoJCQkJCQl7CgkJCQkJCQkkZ2V0ID0gIiR1cmxfcGFydHNbcGF0aF0/JHVybF9wYXJ0c1txdWVyeV0iOwoJCQkJCQl9CgkJCQkJCWVsc2UKCQkJCQkJewoJCQkJCQkJJGdldCA9ICR1cmxfcGFydHNbJ3BhdGgnXTsKCQkJCQkJfQoJCQkJCX0KCQkJCQllbHNlCgkJCQkJewoJCQkJCQkkZ2V0ID0gJy8nOwoJCQkJCX0KCQkJCQkkb3V0ID0gIkdFVCAkZ2V0IEhUVFAvMS4wXHJcbiI7CgkJCQkJJG91dCAuPSAiSG9zdDogJHVybF9wYXJ0c1tob3N0XVxyXG4iOwoJCQkJCSRvdXQgLj0gIlVzZXItQWdlbnQ6ICR1c2VyYWdlbnRcclxuIjsKCQkJCQlpZiAoZXh0ZW5zaW9uX2xvYWRlZCgnemxpYicpKQoJCQkJCXsKCQkJCQkJJG91dCAuPSAiQWNjZXB0LUVuY29kaW5nOiB4LWd6aXAsZ3ppcCxkZWZsYXRlXHJcbiI7CgkJCQkJfQoKCQkJCQlpZiAoaXNzZXQoJHVybF9wYXJ0c1sndXNlciddKSAmJiBpc3NldCgkdXJsX3BhcnRzWydwYXNzJ10pKQoJCQkJCXsKCQkJCQkJJG91dCAuPSAiQXV0aG9yaXphdGlvbjogQmFzaWMgIiAuIGJhc2U2NF9lbmNvZGUoIiR1cmxfcGFydHNbdXNlcl06JHVybF9wYXJ0c1twYXNzXSIpIC4gIlxyXG4iOwoJCQkJCX0KCQkJCQlmb3JlYWNoICgkaGVhZGVycyBhcyAka2V5ID0+ICR2YWx1ZSkKCQkJCQl7CgkJCQkJCSRvdXQgLj0gIiRrZXk6ICR2YWx1ZVxyXG4iOwoJCQkJCX0KCQkJCQkkb3V0IC49ICJDb25uZWN0aW9uOiBDbG9zZVxyXG5cclxuIjsKCQkJCQlmd3JpdGUoJGZwLCAkb3V0KTsKCgkJCQkJJGluZm8gPSBzdHJlYW1fZ2V0X21ldGFfZGF0YSgkZnApOwoKCQkJCQkkdGhpcy0+aGVhZGVycyA9ICcnOwoJCQkJCXdoaWxlICghJGluZm9bJ2VvZiddICYmICEkaW5mb1sndGltZWRfb3V0J10pCgkJCQkJewoJCQkJCQkkdGhpcy0+aGVhZGVycyAuPSBmcmVhZCgkZnAsIDExNjApOwoJCQkJCQkkaW5mbyA9IHN0cmVhbV9nZXRfbWV0YV9kYXRhKCRmcCk7CgkJCQkJfQoJCQkJCWlmICghJGluZm9bJ3RpbWVkX291dCddKQoJCQkJCXsKCQkJCQkJJHBhcnNlciA9JiBuZXcgU2ltcGxlUGllX0hUVFBfUGFyc2VyKCR0aGlzLT5oZWFkZXJzKTsKCQkJCQkJaWYgKCRwYXJzZXItPnBhcnNlKCkpCgkJCQkJCXsKCQkJCQkJCSR0aGlzLT5oZWFkZXJzID0gJHBhcnNlci0+aGVhZGVyczsKCQkJCQkJCSR0aGlzLT5ib2R5ID0gJHBhcnNlci0+Ym9keTsKCQkJCQkJCSR0aGlzLT5zdGF0dXNfY29kZSA9ICRwYXJzZXItPnN0YXR1c19jb2RlOwoJCQkJCQkJaWYgKCgkdGhpcy0+c3RhdHVzX2NvZGUgPT0gMzAwIHx8ICR0aGlzLT5zdGF0dXNfY29kZSA9PSAzMDEgfHwgJHRoaXMtPnN0YXR1c19jb2RlID09IDMwMiB8fCAkdGhpcy0+c3RhdHVzX2NvZGUgPT0gMzAzIHx8ICR0aGlzLT5zdGF0dXNfY29kZSA9PSAzMDcgfHwgJHRoaXMtPnN0YXR1c19jb2RlID4gMzA3ICYmICR0aGlzLT5zdGF0dXNfY29kZSA8IDQwMCkgJiYgaXNzZXQoJHRoaXMtPmhlYWRlcnNbJ2xvY2F0aW9uJ10pICYmICR0aGlzLT5yZWRpcmVjdHMgPCAkcmVkaXJlY3RzKQoJCQkJCQkJewoJCQkJCQkJCSR0aGlzLT5yZWRpcmVjdHMrKzsKCQkJCQkJCQkkbG9jYXRpb24gPSBTaW1wbGVQaWVfTWlzYzo6YWJzb2x1dGl6ZV91cmwoJHRoaXMtPmhlYWRlcnNbJ2xvY2F0aW9uJ10sICR1cmwpOwoJCQkJCQkJCXJldHVybiAkdGhpcy0+U2ltcGxlUGllX0ZpbGUoJGxvY2F0aW9uLCAkdGltZW91dCwgJHJlZGlyZWN0cywgJGhlYWRlcnMsICR1c2VyYWdlbnQsICRmb3JjZV9mc29ja29wZW4pOwoJCQkJCQkJfQoJCQkJCQkJaWYgKGlzc2V0KCR0aGlzLT5oZWFkZXJzWydjb250ZW50LWVuY29kaW5nJ10pKQoJCQkJCQkJewoJCQkJCQkJCS8vIEhleSwgd2UgYWN0IGR1bWIgZWxzZXdoZXJlLCBzbyBsZXQncyBkbyB0aGF0IGhlcmUgdG9vCgkJCQkJCQkJc3dpdGNoIChzdHJ0b2xvd2VyKHRyaW0oJHRoaXMtPmhlYWRlcnNbJ2NvbnRlbnQtZW5jb2RpbmcnXSwgIlx4MDlceDBBXHgwRFx4MjAiKSkpCgkJCQkJCQkJewoJCQkJCQkJCQljYXNlICdnemlwJzoKCQkJCQkJCQkJY2FzZSAneC1nemlwJzoKCQkJCQkJCQkJCSRkZWNvZGVyID0gbmV3IFNpbXBsZVBpZV9nemRlY29kZSgkdGhpcy0+Ym9keSk7CgkJCQkJCQkJCQlpZiAoISRkZWNvZGVyLT5wYXJzZSgpKQoJCQkJCQkJCQkJewoJCQkJCQkJCQkJCSR0aGlzLT5lcnJvciA9ICdVbmFibGUgdG8gZGVjb2RlIEhUVFAgImd6aXAiIHN0cmVhbSc7CgkJCQkJCQkJCQkJJHRoaXMtPnN1Y2Nlc3MgPSBmYWxzZTsKCQkJCQkJCQkJCX0KCQkJCQkJCQkJCWVsc2UKCQkJCQkJCQkJCXsKCQkJCQkJCQkJCQkkdGhpcy0+Ym9keSA9ICRkZWNvZGVyLT5kYXRhOwoJCQkJCQkJCQkJfQoJCQkJCQkJCQkJYnJlYWs7CgoJCQkJCQkJCQljYXNlICdkZWZsYXRlJzoKCQkJCQkJCQkJCWlmICgoJGJvZHkgPSBnenVuY29tcHJlc3MoJHRoaXMtPmJvZHkpKSA9PT0gZmFsc2UpCgkJCQkJCQkJCQl7CgkJCQkJCQkJCQkJaWYgKCgkYm9keSA9IGd6aW5mbGF0ZSgkdGhpcy0+Ym9keSkpID09PSBmYWxzZSkKCQkJCQkJCQkJCQl7CgkJCQkJCQkJCQkJCSR0aGlzLT5lcnJvciA9ICdVbmFibGUgdG8gZGVjb2RlIEhUVFAgImRlZmxhdGUiIHN0cmVhbSc7CgkJCQkJCQkJCQkJCSR0aGlzLT5zdWNjZXNzID0gZmFsc2U7CgkJCQkJCQkJCQkJfQoJCQkJCQkJCQkJfQoJCQkJCQkJCQkJJHRoaXMtPmJvZHkgPSAkYm9keTsKCQkJCQkJCQkJCWJyZWFrOwoKCQkJCQkJCQkJZGVmYXVsdDoKCQkJCQkJCQkJCSR0aGlzLT5lcnJvciA9ICdVbmtub3duIGNvbnRlbnQgY29kaW5nJzsKCQkJCQkJCQkJCSR0aGlzLT5zdWNjZXNzID0gZmFsc2U7CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoJCQkJCWVsc2UKCQkJCQl7CgkJCQkJCSR0aGlzLT5lcnJvciA9ICdmc29ja2V0IHRpbWVkIG91dCc7CgkJCQkJCSR0aGlzLT5zdWNjZXNzID0gZmFsc2U7CgkJCQkJfQoJCQkJCWZjbG9zZSgkZnApOwoJCQkJfQoJCQl9CgkJfQoJCWVsc2UKCQl7CgkJCSR0aGlzLT5tZXRob2QgPSBTSU1QTEVQSUVfRklMRV9TT1VSQ0VfTE9DQUwgfCBTSU1QTEVQSUVfRklMRV9TT1VSQ0VfRklMRV9HRVRfQ09OVEVOVFM7CgkJCWlmICghJHRoaXMtPmJvZHkgPSBmaWxlX2dldF9jb250ZW50cygkdXJsKSkKCQkJewoJCQkJJHRoaXMtPmVycm9yID0gJ2ZpbGVfZ2V0X2NvbnRlbnRzIGNvdWxkIG5vdCByZWFkIHRoZSBmaWxlJzsKCQkJCSR0aGlzLT5zdWNjZXNzID0gZmFsc2U7CgkJCX0KCQl9Cgl9Cn0KCi8qKgogKiBIVFRQIFJlc3BvbnNlIFBhcnNlcgogKgogKiBAcGFja2FnZSBTaW1wbGVQaWUKICovCmNsYXNzIFNpbXBsZVBpZV9IVFRQX1BhcnNlcgp7CgkvKioKCSAqIEhUVFAgVmVyc2lvbgoJICoKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAdmFyIGZsb2F0CgkgKi8KCXZhciAkaHR0cF92ZXJzaW9uID0gMC4wOwoKCS8qKgoJICogU3RhdHVzIGNvZGUKCSAqCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHZhciBpbnQKCSAqLwoJdmFyICRzdGF0dXNfY29kZSA9IDA7CgoJLyoqCgkgKiBSZWFzb24gcGhyYXNlCgkgKgoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXZhciAkcmVhc29uID0gJyc7CgoJLyoqCgkgKiBLZXkvdmFsdWUgcGFpcnMgb2YgdGhlIGhlYWRlcnMKCSAqCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHZhciBhcnJheQoJICovCgl2YXIgJGhlYWRlcnMgPSBhcnJheSgpOwoKCS8qKgoJICogQm9keSBvZiB0aGUgcmVzcG9uc2UKCSAqCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHZhciBzdHJpbmcKCSAqLwoJdmFyICRib2R5ID0gJyc7CgoJLyoqCgkgKiBDdXJyZW50IHN0YXRlIG9mIHRoZSBzdGF0ZSBtYWNoaW5lCgkgKgoJICogQGFjY2VzcyBwcml2YXRlCgkgKiBAdmFyIHN0cmluZwoJICovCgl2YXIgJHN0YXRlID0gJ2h0dHBfdmVyc2lvbic7CgoJLyoqCgkgKiBJbnB1dCBkYXRhCgkgKgoJICogQGFjY2VzcyBwcml2YXRlCgkgKiBAdmFyIHN0cmluZwoJICovCgl2YXIgJGRhdGEgPSAnJzsKCgkvKioKCSAqIElucHV0IGRhdGEgbGVuZ3RoICh0byBhdm9pZCBjYWxsaW5nIHN0cmxlbigpIGV2ZXJ5dGltZSB0aGlzIGlzIG5lZWRlZCkKCSAqCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqIEB2YXIgaW50CgkgKi8KCXZhciAkZGF0YV9sZW5ndGggPSAwOwoKCS8qKgoJICogQ3VycmVudCBwb3NpdGlvbiBvZiB0aGUgcG9pbnRlcgoJICoKCSAqIEB2YXIgaW50CgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJdmFyICRwb3NpdGlvbiA9IDA7CgoJLyoqCgkgKiBOYW1lIG9mIHRoZSBoZWRhZXIgY3VycmVudGx5IGJlaW5nIHBhcnNlZAoJICoKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICogQHZhciBzdHJpbmcKCSAqLwoJdmFyICRuYW1lID0gJyc7CgoJLyoqCgkgKiBWYWx1ZSBvZiB0aGUgaGVkYWVyIGN1cnJlbnRseSBiZWluZyBwYXJzZWQKCSAqCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXZhciAkdmFsdWUgPSAnJzsKCgkvKioKCSAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgY2xhc3Mgd2l0aCB0aGUgaW5wdXQgZGF0YQoJICoKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAcGFyYW0gc3RyaW5nICRkYXRhIElucHV0IGRhdGEKCSAqLwoJZnVuY3Rpb24gU2ltcGxlUGllX0hUVFBfUGFyc2VyKCRkYXRhKQoJewoJCSR0aGlzLT5kYXRhID0gJGRhdGE7CgkJJHRoaXMtPmRhdGFfbGVuZ3RoID0gc3RybGVuKCR0aGlzLT5kYXRhKTsKCX0KCgkvKioKCSAqIFBhcnNlIHRoZSBpbnB1dCBkYXRhCgkgKgoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEByZXR1cm4gYm9vbCB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG9uIGZhaWx1cmUKCSAqLwoJZnVuY3Rpb24gcGFyc2UoKQoJewoJCXdoaWxlICgkdGhpcy0+c3RhdGUgJiYgJHRoaXMtPnN0YXRlICE9PSAnZW1pdCcgJiYgJHRoaXMtPmhhc19kYXRhKCkpCgkJewoJCQkkc3RhdGUgPSAkdGhpcy0+c3RhdGU7CgkJCSR0aGlzLT4kc3RhdGUoKTsKCQl9CgkJJHRoaXMtPmRhdGEgPSAnJzsKCQlpZiAoJHRoaXMtPnN0YXRlID09PSAnZW1pdCcgfHwgJHRoaXMtPnN0YXRlID09PSAnYm9keScpCgkJewoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgkJZWxzZQoJCXsKCQkJJHRoaXMtPmh0dHBfdmVyc2lvbiA9ICcnOwoJCQkkdGhpcy0+c3RhdHVzX2NvZGUgPSAnJzsKCQkJJHRoaXMtPnJlYXNvbiA9ICcnOwoJCQkkdGhpcy0+aGVhZGVycyA9IGFycmF5KCk7CgkJCSR0aGlzLT5ib2R5ID0gJyc7CgkJCXJldHVybiBmYWxzZTsKCQl9Cgl9CgoJLyoqCgkgKiBDaGVjayB3aGV0aGVyIHRoZXJlIGlzIGRhdGEgYmV5b25kIHRoZSBwb2ludGVyCgkgKgoJICogQGFjY2VzcyBwcml2YXRlCgkgKiBAcmV0dXJuIGJvb2wgdHJ1ZSBpZiB0aGVyZSBpcyBmdXJ0aGVyIGRhdGEsIGZhbHNlIGlmIG5vdAoJICovCglmdW5jdGlvbiBoYXNfZGF0YSgpCgl7CgkJcmV0dXJuIChib29sKSAoJHRoaXMtPnBvc2l0aW9uIDwgJHRoaXMtPmRhdGFfbGVuZ3RoKTsKCX0KCgkvKioKCSAqIFNlZSBpZiB0aGUgbmV4dCBjaGFyYWN0ZXIgaXMgTFdTCgkgKgoJICogQGFjY2VzcyBwcml2YXRlCgkgKiBAcmV0dXJuIGJvb2wgdHJ1ZSBpZiB0aGUgbmV4dCBjaGFyYWN0ZXIgaXMgTFdTLCBmYWxzZSBpZiBub3QKCSAqLwoJZnVuY3Rpb24gaXNfbGluZWFyX3doaXRlc3BhY2UoKQoJewoJCXJldHVybiAoYm9vbCkgKCR0aGlzLT5kYXRhWyR0aGlzLT5wb3NpdGlvbl0gPT09ICJceDA5IgoJCQl8fCAkdGhpcy0+ZGF0YVskdGhpcy0+cG9zaXRpb25dID09PSAiXHgyMCIKCQkJfHwgKCR0aGlzLT5kYXRhWyR0aGlzLT5wb3NpdGlvbl0gPT09ICJceDBBIgoJCQkJJiYgaXNzZXQoJHRoaXMtPmRhdGFbJHRoaXMtPnBvc2l0aW9uICsgMV0pCgkJCQkmJiAoJHRoaXMtPmRhdGFbJHRoaXMtPnBvc2l0aW9uICsgMV0gPT09ICJceDA5IiB8fCAkdGhpcy0+ZGF0YVskdGhpcy0+cG9zaXRpb24gKyAxXSA9PT0gIlx4MjAiKSkpOwoJfQoKCS8qKgoJICogUGFyc2UgdGhlIEhUVFAgdmVyc2lvbgoJICoKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCglmdW5jdGlvbiBodHRwX3ZlcnNpb24oKQoJewoJCWlmIChzdHJwb3MoJHRoaXMtPmRhdGEsICJceDBBIikgIT09IGZhbHNlICYmIHN0cnRvdXBwZXIoc3Vic3RyKCR0aGlzLT5kYXRhLCAwLCA1KSkgPT09ICdIVFRQLycpCgkJewoJCQkkbGVuID0gc3Ryc3BuKCR0aGlzLT5kYXRhLCAnMDEyMzQ1Njc4OS4nLCA1KTsKCQkJJHRoaXMtPmh0dHBfdmVyc2lvbiA9IHN1YnN0cigkdGhpcy0+ZGF0YSwgNSwgJGxlbik7CgkJCSR0aGlzLT5wb3NpdGlvbiArPSA1ICsgJGxlbjsKCQkJaWYgKHN1YnN0cl9jb3VudCgkdGhpcy0+aHR0cF92ZXJzaW9uLCAnLicpIDw9IDEpCgkJCXsKCQkJCSR0aGlzLT5odHRwX3ZlcnNpb24gPSAoZmxvYXQpICR0aGlzLT5odHRwX3ZlcnNpb247CgkJCQkkdGhpcy0+cG9zaXRpb24gKz0gc3Ryc3BuKCR0aGlzLT5kYXRhLCAiXHgwOVx4MjAiLCAkdGhpcy0+cG9zaXRpb24pOwoJCQkJJHRoaXMtPnN0YXRlID0gJ3N0YXR1cyc7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQkkdGhpcy0+c3RhdGUgPSBmYWxzZTsKCQkJfQoJCX0KCQllbHNlCgkJewoJCQkkdGhpcy0+c3RhdGUgPSBmYWxzZTsKCQl9Cgl9CgoJLyoqCgkgKiBQYXJzZSB0aGUgc3RhdHVzIGNvZGUKCSAqCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJZnVuY3Rpb24gc3RhdHVzKCkKCXsKCQlpZiAoJGxlbiA9IHN0cnNwbigkdGhpcy0+ZGF0YSwgJzAxMjM0NTY3ODknLCAkdGhpcy0+cG9zaXRpb24pKQoJCXsKCQkJJHRoaXMtPnN0YXR1c19jb2RlID0gKGludCkgc3Vic3RyKCR0aGlzLT5kYXRhLCAkdGhpcy0+cG9zaXRpb24sICRsZW4pOwoJCQkkdGhpcy0+cG9zaXRpb24gKz0gJGxlbjsKCQkJJHRoaXMtPnN0YXRlID0gJ3JlYXNvbic7CgkJfQoJCWVsc2UKCQl7CgkJCSR0aGlzLT5zdGF0ZSA9IGZhbHNlOwoJCX0KCX0KCgkvKioKCSAqIFBhcnNlIHRoZSByZWFzb24gcGhyYXNlCgkgKgoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCWZ1bmN0aW9uIHJlYXNvbigpCgl7CgkJJGxlbiA9IHN0cmNzcG4oJHRoaXMtPmRhdGEsICJceDBBIiwgJHRoaXMtPnBvc2l0aW9uKTsKCQkkdGhpcy0+cmVhc29uID0gdHJpbShzdWJzdHIoJHRoaXMtPmRhdGEsICR0aGlzLT5wb3NpdGlvbiwgJGxlbiksICJceDA5XHgwRFx4MjAiKTsKCQkkdGhpcy0+cG9zaXRpb24gKz0gJGxlbiArIDE7CgkJJHRoaXMtPnN0YXRlID0gJ25ld19saW5lJzsKCX0KCgkvKioKCSAqIERlYWwgd2l0aCBhIG5ldyBsaW5lLCBzaGlmdGluZyBkYXRhIGFyb3VuZCBhcyBuZWVkZWQKCSAqCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJZnVuY3Rpb24gbmV3X2xpbmUoKQoJewoJCSR0aGlzLT52YWx1ZSA9IHRyaW0oJHRoaXMtPnZhbHVlLCAiXHgwRFx4MjAiKTsKCQlpZiAoJHRoaXMtPm5hbWUgIT09ICcnICYmICR0aGlzLT52YWx1ZSAhPT0gJycpCgkJewoJCQkkdGhpcy0+bmFtZSA9IHN0cnRvbG93ZXIoJHRoaXMtPm5hbWUpOwoJCQlpZiAoaXNzZXQoJHRoaXMtPmhlYWRlcnNbJHRoaXMtPm5hbWVdKSkKCQkJewoJCQkJJHRoaXMtPmhlYWRlcnNbJHRoaXMtPm5hbWVdIC49ICcsICcgLiAkdGhpcy0+dmFsdWU7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQkkdGhpcy0+aGVhZGVyc1skdGhpcy0+bmFtZV0gPSAkdGhpcy0+dmFsdWU7CgkJCX0KCQl9CgkJJHRoaXMtPm5hbWUgPSAnJzsKCQkkdGhpcy0+dmFsdWUgPSAnJzsKCQlpZiAoc3Vic3RyKCR0aGlzLT5kYXRhWyR0aGlzLT5wb3NpdGlvbl0sIDAsIDIpID09PSAiXHgwRFx4MEEiKQoJCXsKCQkJJHRoaXMtPnBvc2l0aW9uICs9IDI7CgkJCSR0aGlzLT5zdGF0ZSA9ICdib2R5JzsKCQl9CgkJZWxzZWlmICgkdGhpcy0+ZGF0YVskdGhpcy0+cG9zaXRpb25dID09PSAiXHgwQSIpCgkJewoJCQkkdGhpcy0+cG9zaXRpb24rKzsKCQkJJHRoaXMtPnN0YXRlID0gJ2JvZHknOwoJCX0KCQllbHNlCgkJewoJCQkkdGhpcy0+c3RhdGUgPSAnbmFtZSc7CgkJfQoJfQoKCS8qKgoJICogUGFyc2UgYSBoZWFkZXIgbmFtZQoJICoKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCglmdW5jdGlvbiBuYW1lKCkKCXsKCQkkbGVuID0gc3RyY3NwbigkdGhpcy0+ZGF0YSwgIlx4MEE6IiwgJHRoaXMtPnBvc2l0aW9uKTsKCQlpZiAoaXNzZXQoJHRoaXMtPmRhdGFbJHRoaXMtPnBvc2l0aW9uICsgJGxlbl0pKQoJCXsKCQkJaWYgKCR0aGlzLT5kYXRhWyR0aGlzLT5wb3NpdGlvbiArICRsZW5dID09PSAiXHgwQSIpCgkJCXsKCQkJCSR0aGlzLT5wb3NpdGlvbiArPSAkbGVuOwoJCQkJJHRoaXMtPnN0YXRlID0gJ25ld19saW5lJzsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCSR0aGlzLT5uYW1lID0gc3Vic3RyKCR0aGlzLT5kYXRhLCAkdGhpcy0+cG9zaXRpb24sICRsZW4pOwoJCQkJJHRoaXMtPnBvc2l0aW9uICs9ICRsZW4gKyAxOwoJCQkJJHRoaXMtPnN0YXRlID0gJ3ZhbHVlJzsKCQkJfQoJCX0KCQllbHNlCgkJewoJCQkkdGhpcy0+c3RhdGUgPSBmYWxzZTsKCQl9Cgl9CgoJLyoqCgkgKiBQYXJzZSBMV1MsIHJlcGxhY2luZyBjb25zZWN1dGl2ZSBMV1MgY2hhcmFjdGVycyB3aXRoIGEgc2luZ2xlIHNwYWNlCgkgKgoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCWZ1bmN0aW9uIGxpbmVhcl93aGl0ZXNwYWNlKCkKCXsKCQlkbwoJCXsKCQkJaWYgKHN1YnN0cigkdGhpcy0+ZGF0YSwgJHRoaXMtPnBvc2l0aW9uLCAyKSA9PT0gIlx4MERceDBBIikKCQkJewoJCQkJJHRoaXMtPnBvc2l0aW9uICs9IDI7CgkJCX0KCQkJZWxzZWlmICgkdGhpcy0+ZGF0YVskdGhpcy0+cG9zaXRpb25dID09PSAiXHgwQSIpCgkJCXsKCQkJCSR0aGlzLT5wb3NpdGlvbisrOwoJCQl9CgkJCSR0aGlzLT5wb3NpdGlvbiArPSBzdHJzcG4oJHRoaXMtPmRhdGEsICJceDA5XHgyMCIsICR0aGlzLT5wb3NpdGlvbik7CgkJfSB3aGlsZSAoJHRoaXMtPmhhc19kYXRhKCkgJiYgJHRoaXMtPmlzX2xpbmVhcl93aGl0ZXNwYWNlKCkpOwoJCSR0aGlzLT52YWx1ZSAuPSAiXHgyMCI7Cgl9CgoJLyoqCgkgKiBTZWUgd2hhdCBzdGF0ZSB0byBtb3ZlIHRvIHdoaWxlIHdpdGhpbiBub24tcXVvdGVkIGhlYWRlciB2YWx1ZXMKCSAqCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJZnVuY3Rpb24gdmFsdWUoKQoJewoJCWlmICgkdGhpcy0+aXNfbGluZWFyX3doaXRlc3BhY2UoKSkKCQl7CgkJCSR0aGlzLT5saW5lYXJfd2hpdGVzcGFjZSgpOwoJCX0KCQllbHNlCgkJewoJCQlzd2l0Y2ggKCR0aGlzLT5kYXRhWyR0aGlzLT5wb3NpdGlvbl0pCgkJCXsKCQkJCWNhc2UgJyInOgoJCQkJCSR0aGlzLT5wb3NpdGlvbisrOwoJCQkJCSR0aGlzLT5zdGF0ZSA9ICdxdW90ZSc7CgkJCQkJYnJlYWs7CgoJCQkJY2FzZSAiXHgwQSI6CgkJCQkJJHRoaXMtPnBvc2l0aW9uKys7CgkJCQkJJHRoaXMtPnN0YXRlID0gJ25ld19saW5lJzsKCQkJCQlicmVhazsKCgkJCQlkZWZhdWx0OgoJCQkJCSR0aGlzLT5zdGF0ZSA9ICd2YWx1ZV9jaGFyJzsKCQkJCQlicmVhazsKCQkJfQoJCX0KCX0KCgkvKioKCSAqIFBhcnNlIGEgaGVhZGVyIHZhbHVlIHdoaWxlIG91dHNpZGUgcXVvdGVzCgkgKgoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCWZ1bmN0aW9uIHZhbHVlX2NoYXIoKQoJewoJCSRsZW4gPSBzdHJjc3BuKCR0aGlzLT5kYXRhLCAiXHgwOVx4MjBceDBBXCIiLCAkdGhpcy0+cG9zaXRpb24pOwoJCSR0aGlzLT52YWx1ZSAuPSBzdWJzdHIoJHRoaXMtPmRhdGEsICR0aGlzLT5wb3NpdGlvbiwgJGxlbik7CgkJJHRoaXMtPnBvc2l0aW9uICs9ICRsZW47CgkJJHRoaXMtPnN0YXRlID0gJ3ZhbHVlJzsKCX0KCgkvKioKCSAqIFNlZSB3aGF0IHN0YXRlIHRvIG1vdmUgdG8gd2hpbGUgd2l0aGluIHF1b3RlZCBoZWFkZXIgdmFsdWVzCgkgKgoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCWZ1bmN0aW9uIHF1b3RlKCkKCXsKCQlpZiAoJHRoaXMtPmlzX2xpbmVhcl93aGl0ZXNwYWNlKCkpCgkJewoJCQkkdGhpcy0+bGluZWFyX3doaXRlc3BhY2UoKTsKCQl9CgkJZWxzZQoJCXsKCQkJc3dpdGNoICgkdGhpcy0+ZGF0YVskdGhpcy0+cG9zaXRpb25dKQoJCQl7CgkJCQljYXNlICciJzoKCQkJCQkkdGhpcy0+cG9zaXRpb24rKzsKCQkJCQkkdGhpcy0+c3RhdGUgPSAndmFsdWUnOwoJCQkJCWJyZWFrOwoKCQkJCWNhc2UgIlx4MEEiOgoJCQkJCSR0aGlzLT5wb3NpdGlvbisrOwoJCQkJCSR0aGlzLT5zdGF0ZSA9ICduZXdfbGluZSc7CgkJCQkJYnJlYWs7CgoJCQkJY2FzZSAnXFwnOgoJCQkJCSR0aGlzLT5wb3NpdGlvbisrOwoJCQkJCSR0aGlzLT5zdGF0ZSA9ICdxdW90ZV9lc2NhcGVkJzsKCQkJCQlicmVhazsKCgkJCQlkZWZhdWx0OgoJCQkJCSR0aGlzLT5zdGF0ZSA9ICdxdW90ZV9jaGFyJzsKCQkJCQlicmVhazsKCQkJfQoJCX0KCX0KCgkvKioKCSAqIFBhcnNlIGEgaGVhZGVyIHZhbHVlIHdoaWxlIHdpdGhpbiBxdW90ZXMKCSAqCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJZnVuY3Rpb24gcXVvdGVfY2hhcigpCgl7CgkJJGxlbiA9IHN0cmNzcG4oJHRoaXMtPmRhdGEsICJceDA5XHgyMFx4MEFcIlxcIiwgJHRoaXMtPnBvc2l0aW9uKTsKCQkkdGhpcy0+dmFsdWUgLj0gc3Vic3RyKCR0aGlzLT5kYXRhLCAkdGhpcy0+cG9zaXRpb24sICRsZW4pOwoJCSR0aGlzLT5wb3NpdGlvbiArPSAkbGVuOwoJCSR0aGlzLT5zdGF0ZSA9ICd2YWx1ZSc7Cgl9CgoJLyoqCgkgKiBQYXJzZSBhbiBlc2NhcGVkIGNoYXJhY3RlciB3aXRoaW4gcXVvdGVzCgkgKgoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCWZ1bmN0aW9uIHF1b3RlX2VzY2FwZWQoKQoJewoJCSR0aGlzLT52YWx1ZSAuPSAkdGhpcy0+ZGF0YVskdGhpcy0+cG9zaXRpb25dOwoJCSR0aGlzLT5wb3NpdGlvbisrOwoJCSR0aGlzLT5zdGF0ZSA9ICdxdW90ZSc7Cgl9CgoJLyoqCgkgKiBQYXJzZSB0aGUgYm9keQoJICoKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCglmdW5jdGlvbiBib2R5KCkKCXsKCQkkdGhpcy0+Ym9keSA9IHN1YnN0cigkdGhpcy0+ZGF0YSwgJHRoaXMtPnBvc2l0aW9uKTsKCQkkdGhpcy0+c3RhdGUgPSAnZW1pdCc7Cgl9Cn0KCi8qKgogKiBnemRlY29kZQogKgogKiBAcGFja2FnZSBTaW1wbGVQaWUKICovCmNsYXNzIFNpbXBsZVBpZV9nemRlY29kZQp7CgkvKioKCSAqIENvbXByZXNzZWQgZGF0YQoJICoKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICogQHNlZSBnemRlY29kZTo6JGRhdGEKCSAqLwoJdmFyICRjb21wcmVzc2VkX2RhdGE7CgoJLyoqCgkgKiBTaXplIG9mIGNvbXByZXNzZWQgZGF0YQoJICoKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCgl2YXIgJGNvbXByZXNzZWRfc2l6ZTsKCgkvKioKCSAqIE1pbmltdW0gc2l6ZSBvZiBhIHZhbGlkIGd6aXAgc3RyaW5nCgkgKgoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCXZhciAkbWluX2NvbXByZXNzZWRfc2l6ZSA9IDE4OwoKCS8qKgoJICogQ3VycmVudCBwb3NpdGlvbiBvZiBwb2ludGVyCgkgKgoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCXZhciAkcG9zaXRpb24gPSAwOwoKCS8qKgoJICogRmxhZ3MgKEZMRykKCSAqCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJdmFyICRmbGFnczsKCgkvKioKCSAqIFVuY29tcHJlc3NlZCBkYXRhCgkgKgoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEBzZWUgZ3pkZWNvZGU6OiRjb21wcmVzc2VkX2RhdGEKCSAqLwoJdmFyICRkYXRhOwoKCS8qKgoJICogTW9kaWZpZWQgdGltZQoJICoKCSAqIEBhY2Nlc3MgcHVibGljCgkgKi8KCXZhciAkTVRJTUU7CgoJLyoqCgkgKiBFeHRyYSBGbGFncwoJICoKCSAqIEBhY2Nlc3MgcHVibGljCgkgKi8KCXZhciAkWEZMOwoKCS8qKgoJICogT3BlcmF0aW5nIFN5c3RlbQoJICoKCSAqIEBhY2Nlc3MgcHVibGljCgkgKi8KCXZhciAkT1M7CgoJLyoqCgkgKiBTdWJmaWVsZCBJRCAxCgkgKgoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEBzZWUgZ3pkZWNvZGU6OiRleHRyYV9maWVsZAoJICogQHNlZSBnemRlY29kZTo6JFNJMgoJICovCgl2YXIgJFNJMTsKCgkvKioKCSAqIFN1YmZpZWxkIElEIDIKCSAqCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHNlZSBnemRlY29kZTo6JGV4dHJhX2ZpZWxkCgkgKiBAc2VlIGd6ZGVjb2RlOjokU0kxCgkgKi8KCXZhciAkU0kyOwoKCS8qKgoJICogRXh0cmEgZmllbGQgY29udGVudAoJICoKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAc2VlIGd6ZGVjb2RlOjokU0kxCgkgKiBAc2VlIGd6ZGVjb2RlOjokU0kyCgkgKi8KCXZhciAkZXh0cmFfZmllbGQ7CgoJLyoqCgkgKiBPcmlnaW5hbCBmaWxlbmFtZQoJICoKCSAqIEBhY2Nlc3MgcHVibGljCgkgKi8KCXZhciAkZmlsZW5hbWU7CgoJLyoqCgkgKiBIdW1hbiByZWFkYWJsZSBjb21tZW50CgkgKgoJICogQGFjY2VzcyBwdWJsaWMKCSAqLwoJdmFyICRjb21tZW50OwoKCS8qKgoJICogRG9uJ3QgYWxsb3cgYW55dGhpbmcgdG8gYmUgc2V0CgkgKgoJICogQGFjY2VzcyBwdWJsaWMKCSAqLwoJZnVuY3Rpb24gX19zZXQoJG5hbWUsICR2YWx1ZSkKCXsKCQl0cmlnZ2VyX2Vycm9yKCJDYW5ub3Qgd3JpdGUgcHJvcGVydHkgJG5hbWUiLCBFX1VTRVJfRVJST1IpOwoJfQoKCS8qKgoJICogU2V0IHRoZSBjb21wcmVzc2VkIHN0cmluZyBhbmQgcmVsYXRlZCBwcm9wZXJ0aWVzCgkgKgoJICogQGFjY2VzcyBwdWJsaWMKCSAqLwoJZnVuY3Rpb24gU2ltcGxlUGllX2d6ZGVjb2RlKCRkYXRhKQoJewoJCSR0aGlzLT5jb21wcmVzc2VkX2RhdGEgPSAkZGF0YTsKCQkkdGhpcy0+Y29tcHJlc3NlZF9zaXplID0gc3RybGVuKCRkYXRhKTsKCX0KCgkvKioKCSAqIERlY29kZSB0aGUgR1pJUCBzdHJlYW0KCSAqCgkgKiBAYWNjZXNzIHB1YmxpYwoJICovCglmdW5jdGlvbiBwYXJzZSgpCgl7CgkJaWYgKCR0aGlzLT5jb21wcmVzc2VkX3NpemUgPj0gJHRoaXMtPm1pbl9jb21wcmVzc2VkX3NpemUpCgkJewoJCQkvLyBDaGVjayBJRDEsIElEMiwgYW5kIENNCgkJCWlmIChzdWJzdHIoJHRoaXMtPmNvbXByZXNzZWRfZGF0YSwgMCwgMykgIT09ICJceDFGXHg4Qlx4MDgiKQoJCQl7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCgkJCS8vIEdldCB0aGUgRkxHIChGTGFHcykKCQkJJHRoaXMtPmZsYWdzID0gb3JkKCR0aGlzLT5jb21wcmVzc2VkX2RhdGFbM10pOwoKCQkJLy8gRkxHIGJpdHMgYWJvdmUgKDEgPDwgNCkgYXJlIHJlc2VydmVkCgkJCWlmICgkdGhpcy0+ZmxhZ3MgPiAweDFGKQoJCQl7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCgkJCS8vIEFkdmFuY2UgdGhlIHBvaW50ZXIgYWZ0ZXIgdGhlIGFib3ZlCgkJCSR0aGlzLT5wb3NpdGlvbiArPSA0OwoKCQkJLy8gTVRJTUUKCQkJJG10aW1lID0gc3Vic3RyKCR0aGlzLT5jb21wcmVzc2VkX2RhdGEsICR0aGlzLT5wb3NpdGlvbiwgNCk7CgkJCS8vIFJldmVyc2UgdGhlIHN0cmluZyBpZiB3ZSdyZSBvbiBhIGJpZy1lbmRpYW4gYXJjaCBiZWNhdXNlIGwgaXMgdGhlIG9ubHkgc2lnbmVkIGxvbmcgYW5kIGlzIG1hY2hpbmUgZW5kaWFubmVzcwoJCQlpZiAoY3VycmVudCh1bnBhY2soJ1MnLCAiXHgwMFx4MDEiKSkgPT09IDEpCgkJCXsKCQkJCSRtdGltZSA9IHN0cnJldigkbXRpbWUpOwoJCQl9CgkJCSR0aGlzLT5NVElNRSA9IGN1cnJlbnQodW5wYWNrKCdsJywgJG10aW1lKSk7CgkJCSR0aGlzLT5wb3NpdGlvbiArPSA0OwoKCQkJLy8gR2V0IHRoZSBYRkwgKGVYdHJhIEZMYWdzKQoJCQkkdGhpcy0+WEZMID0gb3JkKCR0aGlzLT5jb21wcmVzc2VkX2RhdGFbJHRoaXMtPnBvc2l0aW9uKytdKTsKCgkJCS8vIEdldCB0aGUgT1MgKE9wZXJhdGluZyBTeXN0ZW0pCgkJCSR0aGlzLT5PUyA9IG9yZCgkdGhpcy0+Y29tcHJlc3NlZF9kYXRhWyR0aGlzLT5wb3NpdGlvbisrXSk7CgoJCQkvLyBQYXJzZSB0aGUgRkVYVFJBCgkJCWlmICgkdGhpcy0+ZmxhZ3MgJiA0KQoJCQl7CgkJCQkvLyBSZWFkIHN1YmZpZWxkIElEcwoJCQkJJHRoaXMtPlNJMSA9ICR0aGlzLT5jb21wcmVzc2VkX2RhdGFbJHRoaXMtPnBvc2l0aW9uKytdOwoJCQkJJHRoaXMtPlNJMiA9ICR0aGlzLT5jb21wcmVzc2VkX2RhdGFbJHRoaXMtPnBvc2l0aW9uKytdOwoKCQkJCS8vIFNJMiBzZXQgdG8gemVybyBpcyByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZQoJCQkJaWYgKCR0aGlzLT5TSTIgPT09ICJceDAwIikKCQkJCXsKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9CgoJCQkJLy8gR2V0IHRoZSBsZW5ndGggb2YgdGhlIGV4dHJhIGZpZWxkCgkJCQkkbGVuID0gY3VycmVudCh1bnBhY2soJ3YnLCBzdWJzdHIoJHRoaXMtPmNvbXByZXNzZWRfZGF0YSwgJHRoaXMtPnBvc2l0aW9uLCAyKSkpOwoJCQkJJHBvc2l0aW9uICs9IDI7CgoJCQkJLy8gQ2hlY2sgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIGlzIHN0aWxsIHZhbGlkCgkJCQkkdGhpcy0+bWluX2NvbXByZXNzZWRfc2l6ZSArPSAkbGVuICsgNDsKCQkJCWlmICgkdGhpcy0+Y29tcHJlc3NlZF9zaXplID49ICR0aGlzLT5taW5fY29tcHJlc3NlZF9zaXplKQoJCQkJewoJCQkJCS8vIFNldCB0aGUgZXh0cmEgZmllbGQgdG8gdGhlIGdpdmVuIGRhdGEKCQkJCQkkdGhpcy0+ZXh0cmFfZmllbGQgPSBzdWJzdHIoJHRoaXMtPmNvbXByZXNzZWRfZGF0YSwgJHRoaXMtPnBvc2l0aW9uLCAkbGVuKTsKCQkJCQkkdGhpcy0+cG9zaXRpb24gKz0gJGxlbjsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9CgkJCX0KCgkJCS8vIFBhcnNlIHRoZSBGTkFNRQoJCQlpZiAoJHRoaXMtPmZsYWdzICYgOCkKCQkJewoJCQkJLy8gR2V0IHRoZSBsZW5ndGggb2YgdGhlIGZpbGVuYW1lCgkJCQkkbGVuID0gc3Ryc3BuKCR0aGlzLT5jb21wcmVzc2VkX2RhdGEsICJceDAwIiwgJHRoaXMtPnBvc2l0aW9uKTsKCgkJCQkvLyBDaGVjayB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgaXMgc3RpbGwgdmFsaWQKCQkJCSR0aGlzLT5taW5fY29tcHJlc3NlZF9zaXplICs9ICRsZW4gKyAxOwoJCQkJaWYgKCR0aGlzLT5jb21wcmVzc2VkX3NpemUgPj0gJHRoaXMtPm1pbl9jb21wcmVzc2VkX3NpemUpCgkJCQl7CgkJCQkJLy8gU2V0IHRoZSBvcmlnaW5hbCBmaWxlbmFtZSB0byB0aGUgZ2l2ZW4gc3RyaW5nCgkJCQkJJHRoaXMtPmZpbGVuYW1lID0gc3Vic3RyKCR0aGlzLT5jb21wcmVzc2VkX2RhdGEsICR0aGlzLT5wb3NpdGlvbiwgJGxlbik7CgkJCQkJJHRoaXMtPnBvc2l0aW9uICs9ICRsZW4gKyAxOwoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCXJldHVybiBmYWxzZTsKCQkJCX0KCQkJfQoKCQkJLy8gUGFyc2UgdGhlIEZDT01NRU5UCgkJCWlmICgkdGhpcy0+ZmxhZ3MgJiAxNikKCQkJewoJCQkJLy8gR2V0IHRoZSBsZW5ndGggb2YgdGhlIGNvbW1lbnQKCQkJCSRsZW4gPSBzdHJzcG4oJHRoaXMtPmNvbXByZXNzZWRfZGF0YSwgIlx4MDAiLCAkdGhpcy0+cG9zaXRpb24pOwoKCQkJCS8vIENoZWNrIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyBpcyBzdGlsbCB2YWxpZAoJCQkJJHRoaXMtPm1pbl9jb21wcmVzc2VkX3NpemUgKz0gJGxlbiArIDE7CgkJCQlpZiAoJHRoaXMtPmNvbXByZXNzZWRfc2l6ZSA+PSAkdGhpcy0+bWluX2NvbXByZXNzZWRfc2l6ZSkKCQkJCXsKCQkJCQkvLyBTZXQgdGhlIG9yaWdpbmFsIGNvbW1lbnQgdG8gdGhlIGdpdmVuIHN0cmluZwoJCQkJCSR0aGlzLT5jb21tZW50ID0gc3Vic3RyKCR0aGlzLT5jb21wcmVzc2VkX2RhdGEsICR0aGlzLT5wb3NpdGlvbiwgJGxlbik7CgkJCQkJJHRoaXMtPnBvc2l0aW9uICs9ICRsZW4gKyAxOwoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCXJldHVybiBmYWxzZTsKCQkJCX0KCQkJfQoKCQkJLy8gUGFyc2UgdGhlIEZIQ1JDCgkJCWlmICgkdGhpcy0+ZmxhZ3MgJiAyKQoJCQl7CgkJCQkvLyBDaGVjayB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgaXMgc3RpbGwgdmFsaWQKCQkJCSR0aGlzLT5taW5fY29tcHJlc3NlZF9zaXplICs9ICRsZW4gKyAyOwoJCQkJaWYgKCR0aGlzLT5jb21wcmVzc2VkX3NpemUgPj0gJHRoaXMtPm1pbl9jb21wcmVzc2VkX3NpemUpCgkJCQl7CgkJCQkJLy8gUmVhZCB0aGUgQ1JDCgkJCQkJJGNyYyA9IGN1cnJlbnQodW5wYWNrKCd2Jywgc3Vic3RyKCR0aGlzLT5jb21wcmVzc2VkX2RhdGEsICR0aGlzLT5wb3NpdGlvbiwgMikpKTsKCgkJCQkJLy8gQ2hlY2sgdGhlIENSQyBtYXRjaGVzCgkJCQkJaWYgKChjcmMzMihzdWJzdHIoJHRoaXMtPmNvbXByZXNzZWRfZGF0YSwgMCwgJHRoaXMtPnBvc2l0aW9uKSkgJiAweEZGRkYpID09PSAkY3JjKQoJCQkJCXsKCQkJCQkJJHRoaXMtPnBvc2l0aW9uICs9IDI7CgkJCQkJfQoJCQkJCWVsc2UKCQkJCQl7CgkJCQkJCXJldHVybiBmYWxzZTsKCQkJCQl9CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9CgoJCQkvLyBEZWNvbXByZXNzIHRoZSBhY3R1YWwgZGF0YQoJCQlpZiAoKCR0aGlzLT5kYXRhID0gZ3ppbmZsYXRlKHN1YnN0cigkdGhpcy0+Y29tcHJlc3NlZF9kYXRhLCAkdGhpcy0+cG9zaXRpb24sIC04KSkpID09PSBmYWxzZSkKCQkJewoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJJHRoaXMtPnBvc2l0aW9uID0gJHRoaXMtPmNvbXByZXNzZWRfc2l6ZSAtIDg7CgkJCX0KCgkJCS8vIENoZWNrIENSQyBvZiBkYXRhCgkJCSRjcmMgPSBjdXJyZW50KHVucGFjaygnVicsIHN1YnN0cigkdGhpcy0+Y29tcHJlc3NlZF9kYXRhLCAkdGhpcy0+cG9zaXRpb24sIDQpKSk7CgkJCSR0aGlzLT5wb3NpdGlvbiArPSA0OwoJCQkvKmlmIChleHRlbnNpb25fbG9hZGVkKCdoYXNoJykgJiYgc3ByaW50ZignJXUnLCBjdXJyZW50KHVucGFjaygnVicsIGhhc2goJ2NyYzMyYicsICR0aGlzLT5kYXRhKSkpKSAhPT0gc3ByaW50ZignJXUnLCAkY3JjKSkKCQkJewoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9Ki8KCgkJCS8vIENoZWNrIElTSVpFIG9mIGRhdGEKCQkJJGlzaXplID0gY3VycmVudCh1bnBhY2soJ1YnLCBzdWJzdHIoJHRoaXMtPmNvbXByZXNzZWRfZGF0YSwgJHRoaXMtPnBvc2l0aW9uLCA0KSkpOwoJCQkkdGhpcy0+cG9zaXRpb24gKz0gNDsKCQkJaWYgKHNwcmludGYoJyV1Jywgc3RybGVuKCR0aGlzLT5kYXRhKSAmIDB4RkZGRkZGRkYpICE9PSBzcHJpbnRmKCcldScsICRpc2l6ZSkpCgkJCXsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoKCQkJLy8gV293LCBhZ2FpbnN0IGFsbCBvZGRzLCB3ZSd2ZSBhY3R1YWxseSBnb3QgYSB2YWxpZCBnemlwIHN0cmluZwoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCX0KfQoKY2xhc3MgU2ltcGxlUGllX0NhY2hlCnsKCS8qKgoJICogRG9uJ3QgY2FsbCB0aGUgY29uc3RydWN0b3IuIFBsZWFzZS4KCSAqCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJZnVuY3Rpb24gU2ltcGxlUGllX0NhY2hlKCkKCXsKCQl0cmlnZ2VyX2Vycm9yKCdQbGVhc2UgY2FsbCBTaW1wbGVQaWVfQ2FjaGU6OmNyZWF0ZSgpIGluc3RlYWQgb2YgdGhlIGNvbnN0cnVjdG9yJywgRV9VU0VSX0VSUk9SKTsKCX0KCgkvKioKCSAqIENyZWF0ZSBhIG5ldyBTaW1wbGVQaWVfQ2FjaGUgb2JqZWN0CgkgKgoJICogQHN0YXRpYwoJICogQGFjY2VzcyBwdWJsaWMKCSAqLwoJZnVuY3Rpb24gY3JlYXRlKCRsb2NhdGlvbiwgJGZpbGVuYW1lLCAkZXh0ZW5zaW9uKQoJewoJCXJldHVybiBuZXcgU2ltcGxlUGllX0NhY2hlX0ZpbGUoJGxvY2F0aW9uLCAkZmlsZW5hbWUsICRleHRlbnNpb24pOwoJfQp9CgpjbGFzcyBTaW1wbGVQaWVfQ2FjaGVfRmlsZQp7Cgl2YXIgJGxvY2F0aW9uOwoJdmFyICRmaWxlbmFtZTsKCXZhciAkZXh0ZW5zaW9uOwoJdmFyICRuYW1lOwoKCWZ1bmN0aW9uIFNpbXBsZVBpZV9DYWNoZV9GaWxlKCRsb2NhdGlvbiwgJGZpbGVuYW1lLCAkZXh0ZW5zaW9uKQoJewoJCSR0aGlzLT5sb2NhdGlvbiA9ICRsb2NhdGlvbjsKCQkkdGhpcy0+ZmlsZW5hbWUgPSByYXd1cmxlbmNvZGUoJGZpbGVuYW1lKTsKCQkkdGhpcy0+ZXh0ZW5zaW9uID0gcmF3dXJsZW5jb2RlKCRleHRlbnNpb24pOwoJCSR0aGlzLT5uYW1lID0gIiRsb2NhdGlvbi8kdGhpcy0+ZmlsZW5hbWUuJHRoaXMtPmV4dGVuc2lvbiI7Cgl9CgoJZnVuY3Rpb24gc2F2ZSgkZGF0YSkKCXsKCQlpZiAoZmlsZV9leGlzdHMoJHRoaXMtPm5hbWUpICYmIGlzX3dyaXRlYWJsZSgkdGhpcy0+bmFtZSkgfHwgZmlsZV9leGlzdHMoJHRoaXMtPmxvY2F0aW9uKSAmJiBpc193cml0ZWFibGUoJHRoaXMtPmxvY2F0aW9uKSkKCQl7CgkJCWlmIChpc19hKCRkYXRhLCAnU2ltcGxlUGllJykpCgkJCXsKCQkJCSRkYXRhID0gJGRhdGEtPmRhdGE7CgkJCX0KCgkJCSRkYXRhID0gc2VyaWFsaXplKCRkYXRhKTsKCgkJCWlmIChmdW5jdGlvbl9leGlzdHMoJ2ZpbGVfcHV0X2NvbnRlbnRzJykpCgkJCXsKCQkJCXJldHVybiAoYm9vbCkgZmlsZV9wdXRfY29udGVudHMoJHRoaXMtPm5hbWUsICRkYXRhKTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCSRmcCA9IGZvcGVuKCR0aGlzLT5uYW1lLCAnd2InKTsKCQkJCWlmICgkZnApCgkJCQl7CgkJCQkJZndyaXRlKCRmcCwgJGRhdGEpOwoJCQkJCWZjbG9zZSgkZnApOwoJCQkJCXJldHVybiB0cnVlOwoJCQkJfQoJCQl9CgkJfQoJCXJldHVybiBmYWxzZTsKCX0KCglmdW5jdGlvbiBsb2FkKCkKCXsKCQlpZiAoZmlsZV9leGlzdHMoJHRoaXMtPm5hbWUpICYmIGlzX3JlYWRhYmxlKCR0aGlzLT5uYW1lKSkKCQl7CgkJCXJldHVybiB1bnNlcmlhbGl6ZShmaWxlX2dldF9jb250ZW50cygkdGhpcy0+bmFtZSkpOwoJCX0KCQlyZXR1cm4gZmFsc2U7Cgl9CgoJZnVuY3Rpb24gbXRpbWUoKQoJewoJCWlmIChmaWxlX2V4aXN0cygkdGhpcy0+bmFtZSkpCgkJewoJCQlyZXR1cm4gZmlsZW10aW1lKCR0aGlzLT5uYW1lKTsKCQl9CgkJcmV0dXJuIGZhbHNlOwoJfQoKCWZ1bmN0aW9uIHRvdWNoKCkKCXsKCQlpZiAoZmlsZV9leGlzdHMoJHRoaXMtPm5hbWUpKQoJCXsKCQkJcmV0dXJuIHRvdWNoKCR0aGlzLT5uYW1lKTsKCQl9CgkJcmV0dXJuIGZhbHNlOwoJfQoKCWZ1bmN0aW9uIHVubGluaygpCgl7CgkJaWYgKGZpbGVfZXhpc3RzKCR0aGlzLT5uYW1lKSkKCQl7CgkJCXJldHVybiB1bmxpbmsoJHRoaXMtPm5hbWUpOwoJCX0KCQlyZXR1cm4gZmFsc2U7Cgl9Cn0KCmNsYXNzIFNpbXBsZVBpZV9NaXNjCnsKCWZ1bmN0aW9uIHRpbWVfaG1zKCRzZWNvbmRzKQoJewoJCSR0aW1lID0gJyc7CgoJCSRob3VycyA9IGZsb29yKCRzZWNvbmRzIC8gMzYwMCk7CgkJJHJlbWFpbmRlciA9ICRzZWNvbmRzICUgMzYwMDsKCQlpZiAoJGhvdXJzID4gMCkKCQl7CgkJCSR0aW1lIC49ICRob3Vycy4nOic7CgkJfQoKCQkkbWludXRlcyA9IGZsb29yKCRyZW1haW5kZXIgLyA2MCk7CgkJJHNlY29uZHMgPSAkcmVtYWluZGVyICUgNjA7CgkJaWYgKCRtaW51dGVzIDwgMTAgJiYgJGhvdXJzID4gMCkKCQl7CgkJCSRtaW51dGVzID0gJzAnIC4gJG1pbnV0ZXM7CgkJfQoJCWlmICgkc2Vjb25kcyA8IDEwKQoJCXsKCQkJJHNlY29uZHMgPSAnMCcgLiAkc2Vjb25kczsKCQl9CgoJCSR0aW1lIC49ICRtaW51dGVzLic6JzsKCQkkdGltZSAuPSAkc2Vjb25kczsKCgkJcmV0dXJuICR0aW1lOwoJfQoKCWZ1bmN0aW9uIGFic29sdXRpemVfdXJsKCRyZWxhdGl2ZSwgJGJhc2UpCgl7CgkJaWYgKCRyZWxhdGl2ZSAhPT0gJycpCgkJewoJCQkkcmVsYXRpdmUgPSBTaW1wbGVQaWVfTWlzYzo6cGFyc2VfdXJsKCRyZWxhdGl2ZSk7CgkJCWlmICgkcmVsYXRpdmVbJ3NjaGVtZSddICE9PSAnJykKCQkJewoJCQkJJHRhcmdldCA9ICRyZWxhdGl2ZTsKCQkJfQoJCQllbHNlaWYgKCRiYXNlICE9PSAnJykKCQkJewoJCQkJJGJhc2UgPSBTaW1wbGVQaWVfTWlzYzo6cGFyc2VfdXJsKCRiYXNlKTsKCQkJCSR0YXJnZXQgPSBTaW1wbGVQaWVfTWlzYzo6cGFyc2VfdXJsKCcnKTsKCQkJCWlmICgkcmVsYXRpdmVbJ2F1dGhvcml0eSddICE9PSAnJykKCQkJCXsKCQkJCQkkdGFyZ2V0ID0gJHJlbGF0aXZlOwoJCQkJCSR0YXJnZXRbJ3NjaGVtZSddID0gJGJhc2VbJ3NjaGVtZSddOwoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCSR0YXJnZXRbJ3NjaGVtZSddID0gJGJhc2VbJ3NjaGVtZSddOwoJCQkJCSR0YXJnZXRbJ2F1dGhvcml0eSddID0gJGJhc2VbJ2F1dGhvcml0eSddOwoJCQkJCWlmICgkcmVsYXRpdmVbJ3BhdGgnXSAhPT0gJycpCgkJCQkJewoJCQkJCQlpZiAoc3RycG9zKCRyZWxhdGl2ZVsncGF0aCddLCAnLycpID09PSAwKQoJCQkJCQl7CgkJCQkJCQkkdGFyZ2V0WydwYXRoJ10gPSAkcmVsYXRpdmVbJ3BhdGgnXTsKCQkJCQkJfQoJCQkJCQllbHNlaWYgKCRiYXNlWydhdXRob3JpdHknXSAhPT0gJycgJiYgJGJhc2VbJ3BhdGgnXSA9PT0gJycpCgkJCQkJCXsKCQkJCQkJCSR0YXJnZXRbJ3BhdGgnXSA9ICcvJyAuICRyZWxhdGl2ZVsncGF0aCddOwoJCQkJCQl9CgkJCQkJCWVsc2VpZiAoKCRsYXN0X3NlZ21lbnQgPSBzdHJycG9zKCRiYXNlWydwYXRoJ10sICcvJykpICE9PSBmYWxzZSkKCQkJCQkJewoJCQkJCQkJJHRhcmdldFsncGF0aCddID0gc3Vic3RyKCRiYXNlWydwYXRoJ10sIDAsICRsYXN0X3NlZ21lbnQgKyAxKSAuICRyZWxhdGl2ZVsncGF0aCddOwoJCQkJCQl9CgkJCQkJCWVsc2UKCQkJCQkJewoJCQkJCQkJJHRhcmdldFsncGF0aCddID0gJHJlbGF0aXZlWydwYXRoJ107CgkJCQkJCX0KCQkJCQkJJHRhcmdldFsncXVlcnknXSA9ICRyZWxhdGl2ZVsncXVlcnknXTsKCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJJHRhcmdldFsncGF0aCddID0gJGJhc2VbJ3BhdGgnXTsKCQkJCQkJaWYgKCRyZWxhdGl2ZVsncXVlcnknXSAhPT0gJycpCgkJCQkJCXsKCQkJCQkJCSR0YXJnZXRbJ3F1ZXJ5J10gPSAkcmVsYXRpdmVbJ3F1ZXJ5J107CgkJCQkJCX0KCQkJCQkJZWxzZWlmICgkYmFzZVsncXVlcnknXSAhPT0gJycpCgkJCQkJCXsKCQkJCQkJCSR0YXJnZXRbJ3F1ZXJ5J10gPSAkYmFzZVsncXVlcnknXTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJCSR0YXJnZXRbJ2ZyYWdtZW50J10gPSAkcmVsYXRpdmVbJ2ZyYWdtZW50J107CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQkvLyBObyBiYXNlIFVSTCwganVzdCByZXR1cm4gdGhlIHJlbGF0aXZlIFVSTAoJCQkJJHRhcmdldCA9ICRyZWxhdGl2ZTsKCQkJfQoJCQkkcmV0dXJuID0gU2ltcGxlUGllX01pc2M6OmNvbXByZXNzX3BhcnNlX3VybCgkdGFyZ2V0WydzY2hlbWUnXSwgJHRhcmdldFsnYXV0aG9yaXR5J10sICR0YXJnZXRbJ3BhdGgnXSwgJHRhcmdldFsncXVlcnknXSwgJHRhcmdldFsnZnJhZ21lbnQnXSk7CgkJfQoJCWVsc2UKCQl7CgkJCSRyZXR1cm4gPSAkYmFzZTsKCQl9CgkJJHJldHVybiA9IFNpbXBsZVBpZV9NaXNjOjpub3JtYWxpemVfdXJsKCRyZXR1cm4pOwoJCXJldHVybiAkcmV0dXJuOwoJfQoKCWZ1bmN0aW9uIHJlbW92ZV9kb3Rfc2VnbWVudHMoJGlucHV0KQoJewoJCSRvdXRwdXQgPSAnJzsKCQl3aGlsZSAoc3RycG9zKCRpbnB1dCwgJy4vJykgIT09IGZhbHNlIHx8IHN0cnBvcygkaW5wdXQsICcvLicpICE9PSBmYWxzZSB8fCAkaW5wdXQgPT0gJy4nIHx8ICRpbnB1dCA9PSAnLi4nKQoJCXsKCQkJLy8gQTogSWYgdGhlIGlucHV0IGJ1ZmZlciBiZWdpbnMgd2l0aCBhIHByZWZpeCBvZiAiLi4vIiBvciAiLi8iLCB0aGVuIHJlbW92ZSB0aGF0IHByZWZpeCBmcm9tIHRoZSBpbnB1dCBidWZmZXI7IG90aGVyd2lzZSwKCQkJaWYgKHN0cnBvcygkaW5wdXQsICcuLi8nKSA9PT0gMCkKCQkJewoJCQkJJGlucHV0ID0gc3Vic3RyKCRpbnB1dCwgMyk7CgkJCX0KCQkJZWxzZWlmIChzdHJwb3MoJGlucHV0LCAnLi8nKSA9PT0gMCkKCQkJewoJCQkJJGlucHV0ID0gc3Vic3RyKCRpbnB1dCwgMik7CgkJCX0KCQkJLy8gQjogaWYgdGhlIGlucHV0IGJ1ZmZlciBiZWdpbnMgd2l0aCBhIHByZWZpeCBvZiAiLy4vIiBvciAiLy4iLCB3aGVyZSAiLiIgaXMgYSBjb21wbGV0ZSBwYXRoIHNlZ21lbnQsIHRoZW4gcmVwbGFjZSB0aGF0IHByZWZpeCB3aXRoICIvIiBpbiB0aGUgaW5wdXQgYnVmZmVyOyBvdGhlcndpc2UsCgkJCWVsc2VpZiAoc3RycG9zKCRpbnB1dCwgJy8uLycpID09PSAwKQoJCQl7CgkJCQkkaW5wdXQgPSBzdWJzdHJfcmVwbGFjZSgkaW5wdXQsICcvJywgMCwgMyk7CgkJCX0KCQkJZWxzZWlmICgkaW5wdXQgPT0gJy8uJykKCQkJewoJCQkJJGlucHV0ID0gJy8nOwoJCQl9CgkJCS8vIEM6IGlmIHRoZSBpbnB1dCBidWZmZXIgYmVnaW5zIHdpdGggYSBwcmVmaXggb2YgIi8uLi8iIG9yICIvLi4iLCB3aGVyZSAiLi4iIGlzIGEgY29tcGxldGUgcGF0aCBzZWdtZW50LCB0aGVuIHJlcGxhY2UgdGhhdCBwcmVmaXggd2l0aCAiLyIgaW4gdGhlIGlucHV0IGJ1ZmZlciBhbmQgcmVtb3ZlIHRoZSBsYXN0IHNlZ21lbnQgYW5kIGl0cyBwcmVjZWRpbmcgIi8iIChpZiBhbnkpIGZyb20gdGhlIG91dHB1dCBidWZmZXI7IG90aGVyd2lzZSwKCQkJZWxzZWlmIChzdHJwb3MoJGlucHV0LCAnLy4uLycpID09PSAwKQoJCQl7CgkJCQkkaW5wdXQgPSBzdWJzdHJfcmVwbGFjZSgkaW5wdXQsICcvJywgMCwgNCk7CgkJCQkkb3V0cHV0ID0gc3Vic3RyX3JlcGxhY2UoJG91dHB1dCwgJycsIHN0cnJwb3MoJG91dHB1dCwgJy8nKSk7CgkJCX0KCQkJZWxzZWlmICgkaW5wdXQgPT0gJy8uLicpCgkJCXsKCQkJCSRpbnB1dCA9ICcvJzsKCQkJCSRvdXRwdXQgPSBzdWJzdHJfcmVwbGFjZSgkb3V0cHV0LCAnJywgc3RycnBvcygkb3V0cHV0LCAnLycpKTsKCQkJfQoJCQkvLyBEOiBpZiB0aGUgaW5wdXQgYnVmZmVyIGNvbnNpc3RzIG9ubHkgb2YgIi4iIG9yICIuLiIsIHRoZW4gcmVtb3ZlIHRoYXQgZnJvbSB0aGUgaW5wdXQgYnVmZmVyOyBvdGhlcndpc2UsCgkJCWVsc2VpZiAoJGlucHV0ID09ICcuJyB8fCAkaW5wdXQgPT0gJy4uJykKCQkJewoJCQkJJGlucHV0ID0gJyc7CgkJCX0KCQkJLy8gRTogbW92ZSB0aGUgZmlyc3QgcGF0aCBzZWdtZW50IGluIHRoZSBpbnB1dCBidWZmZXIgdG8gdGhlIGVuZCBvZiB0aGUgb3V0cHV0IGJ1ZmZlciwgaW5jbHVkaW5nIHRoZSBpbml0aWFsICIvIiBjaGFyYWN0ZXIgKGlmIGFueSkgYW5kIGFueSBzdWJzZXF1ZW50IGNoYXJhY3RlcnMgdXAgdG8sIGJ1dCBub3QgaW5jbHVkaW5nLCB0aGUgbmV4dCAiLyIgY2hhcmFjdGVyIG9yIHRoZSBlbmQgb2YgdGhlIGlucHV0IGJ1ZmZlcgoJCQllbHNlaWYgKCgkcG9zID0gc3RycG9zKCRpbnB1dCwgJy8nLCAxKSkgIT09IGZhbHNlKQoJCQl7CgkJCQkkb3V0cHV0IC49IHN1YnN0cigkaW5wdXQsIDAsICRwb3MpOwoJCQkJJGlucHV0ID0gc3Vic3RyX3JlcGxhY2UoJGlucHV0LCAnJywgMCwgJHBvcyk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQkkb3V0cHV0IC49ICRpbnB1dDsKCQkJCSRpbnB1dCA9ICcnOwoJCQl9CgkJfQoJCXJldHVybiAkb3V0cHV0IC4gJGlucHV0OwoJfQoKCWZ1bmN0aW9uIGdldF9lbGVtZW50KCRyZWFsbmFtZSwgJHN0cmluZykKCXsKCQkkcmV0dXJuID0gYXJyYXkoKTsKCQkkbmFtZSA9IHByZWdfcXVvdGUoJHJlYWxuYW1lLCAnLycpOwoJCWlmIChwcmVnX21hdGNoX2FsbCgiLzwoJG5hbWUpIiAuIFNJTVBMRVBJRV9QQ1JFX0hUTUxfQVRUUklCVVRFIC4gIig+KC4qKTxcLyRuYW1lPnwoXC8pPz4pL3NpVSIsICRzdHJpbmcsICRtYXRjaGVzLCBQUkVHX1NFVF9PUkRFUiB8IFBSRUdfT0ZGU0VUX0NBUFRVUkUpKQoJCXsKCQkJZm9yICgkaSA9IDAsICR0b3RhbF9tYXRjaGVzID0gY291bnQoJG1hdGNoZXMpOyAkaSA8ICR0b3RhbF9tYXRjaGVzOyAkaSsrKQoJCQl7CgkJCQkkcmV0dXJuWyRpXVsndGFnJ10gPSAkcmVhbG5hbWU7CgkJCQkkcmV0dXJuWyRpXVsnZnVsbCddID0gJG1hdGNoZXNbJGldWzBdWzBdOwoJCQkJJHJldHVyblskaV1bJ29mZnNldCddID0gJG1hdGNoZXNbJGldWzBdWzFdOwoJCQkJaWYgKHN0cmxlbigkbWF0Y2hlc1skaV1bM11bMF0pIDw9IDIpCgkJCQl7CgkJCQkJJHJldHVyblskaV1bJ3NlbGZfY2xvc2luZyddID0gdHJ1ZTsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQkkcmV0dXJuWyRpXVsnc2VsZl9jbG9zaW5nJ10gPSBmYWxzZTsKCQkJCQkkcmV0dXJuWyRpXVsnY29udGVudCddID0gJG1hdGNoZXNbJGldWzRdWzBdOwoJCQkJfQoJCQkJJHJldHVyblskaV1bJ2F0dHJpYnMnXSA9IGFycmF5KCk7CgkJCQlpZiAoaXNzZXQoJG1hdGNoZXNbJGldWzJdWzBdKSAmJiBwcmVnX21hdGNoX2FsbCgnL1tceDA5XHgwQVx4MEJceDBDXHgwRFx4MjBdKyhbXlx4MDlceDBBXHgwQlx4MENceDBEXHgyMFx4MkZceDNFXVteXHgwOVx4MEFceDBCXHgwQ1x4MERceDIwXHgyRlx4M0RceDNFXSopKD86W1x4MDlceDBBXHgwQlx4MENceDBEXHgyMF0qPVtceDA5XHgwQVx4MEJceDBDXHgwRFx4MjBdKig/OiIoW14iXSopInxcJyhbXlwnXSopXCd8KFteXHgwOVx4MEFceDBCXHgwQ1x4MERceDIwXHgyMlx4MjdceDNFXVteXHgwOVx4MEFceDBCXHgwQ1x4MERceDIwXHgzRV0qKT8pKT8vJywgJyAnIC4gJG1hdGNoZXNbJGldWzJdWzBdIC4gJyAnLCAkYXR0cmlicywgUFJFR19TRVRfT1JERVIpKQoJCQkJewoJCQkJCWZvciAoJGogPSAwLCAkdG90YWxfYXR0cmlicyA9IGNvdW50KCRhdHRyaWJzKTsgJGogPCAkdG90YWxfYXR0cmliczsgJGorKykKCQkJCQl7CgkJCQkJCWlmIChjb3VudCgkYXR0cmlic1skal0pID09IDIpCgkJCQkJCXsKCQkJCQkJCSRhdHRyaWJzWyRqXVsyXSA9ICRhdHRyaWJzWyRqXVsxXTsKCQkJCQkJfQoJCQkJCQkkcmV0dXJuWyRpXVsnYXR0cmlicyddW3N0cnRvbG93ZXIoJGF0dHJpYnNbJGpdWzFdKV1bJ2RhdGEnXSA9IFNpbXBsZVBpZV9NaXNjOjplbnRpdGllc19kZWNvZGUoZW5kKCRhdHRyaWJzWyRqXSksICdVVEYtOCcpOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCQlyZXR1cm4gJHJldHVybjsKCX0KCglmdW5jdGlvbiBlbGVtZW50X2ltcGxvZGUoJGVsZW1lbnQpCgl7CgkJJGZ1bGwgPSAiPCRlbGVtZW50W3RhZ10iOwoJCWZvcmVhY2ggKCRlbGVtZW50WydhdHRyaWJzJ10gYXMgJGtleSA9PiAkdmFsdWUpCgkJewoJCQkka2V5ID0gc3RydG9sb3dlcigka2V5KTsKCQkJJGZ1bGwgLj0gIiAka2V5PVwiIiAuIGh0bWxzcGVjaWFsY2hhcnMoJHZhbHVlWydkYXRhJ10pIC4gJyInOwoJCX0KCQlpZiAoJGVsZW1lbnRbJ3NlbGZfY2xvc2luZyddKQoJCXsKCQkJJGZ1bGwgLj0gJyAvPic7CgkJfQoJCWVsc2UKCQl7CgkJCSRmdWxsIC49ICI+JGVsZW1lbnRbY29udGVudF08LyRlbGVtZW50W3RhZ10+IjsKCQl9CgkJcmV0dXJuICRmdWxsOwoJfQoKCWZ1bmN0aW9uIGVycm9yKCRtZXNzYWdlLCAkbGV2ZWwsICRmaWxlLCAkbGluZSkKCXsKCQlzd2l0Y2ggKCRsZXZlbCkKCQl7CgkJCWNhc2UgRV9VU0VSX0VSUk9SOgoJCQkJJG5vdGUgPSAnUEhQIEVycm9yJzsKCQkJCWJyZWFrOwoJCQljYXNlIEVfVVNFUl9XQVJOSU5HOgoJCQkJJG5vdGUgPSAnUEhQIFdhcm5pbmcnOwoJCQkJYnJlYWs7CgkJCWNhc2UgRV9VU0VSX05PVElDRToKCQkJCSRub3RlID0gJ1BIUCBOb3RpY2UnOwoJCQkJYnJlYWs7CgkJCWRlZmF1bHQ6CgkJCQkkbm90ZSA9ICdVbmtub3duIEVycm9yJzsKCQkJCWJyZWFrOwoJCX0KCQllcnJvcl9sb2coIiRub3RlOiAkbWVzc2FnZSBpbiAkZmlsZSBvbiBsaW5lICRsaW5lIiwgMCk7CgkJcmV0dXJuICRtZXNzYWdlOwoJfQoKCS8qKgoJICogSWYgYSBmaWxlIGhhcyBiZWVuIGNhY2hlZCwgcmV0cmlldmUgYW5kIGRpc3BsYXkgaXQuCgkgKgoJICogVGhpcyBpcyBtb3N0IHVzZWZ1bCBmb3IgY2FjaGluZyBpbWFnZXMgKGdldF9mYXZpY29uKCksIGV0Yy4pLAoJICogaG93ZXZlciBpdCB3b3JrcyBmb3IgYWxsIGNhY2hlZCBmaWxlcy4gIFRoaXMgV0lMTCBOT1QgZGlzcGxheSBBTlkKCSAqIGZpbGUvaW1hZ2UvcGFnZS93aGF0ZXZlciwgYnV0IHJhdGhlciBvbmx5IGRpc3BsYXkgd2hhdCBoYXMgYWxyZWFkeQoJICogYmVlbiBjYWNoZWQgYnkgU2ltcGxlUGllLgoJICoKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAc2VlIFNpbXBsZVBpZTo6Z2V0X2Zhdmljb24oKQoJICogQHBhcmFtIHN0ciAkaWRlbnRpZmllcl91cmwgVVJMIHRoYXQgaXMgdXNlZCB0byBpZGVudGlmeSB0aGUgY29udGVudC4KCSAqIFRoaXMgbWF5IG9yIG1heSBub3QgYmUgdGhlIGFjdHVhbCBVUkwgb2YgdGhlIGxpdmUgY29udGVudC4KCSAqIEBwYXJhbSBzdHIgJGNhY2hlX2xvY2F0aW9uIExvY2F0aW9uIG9mIFNpbXBsZVBpZSdzIGNhY2hlLiAgRGVmYXVsdHMKCSAqIHRvICcuL2NhY2hlJy4KCSAqIEBwYXJhbSBzdHIgJGNhY2hlX2V4dGVuc2lvbiBUaGUgZmlsZSBleHRlbnNpb24gdGhhdCB0aGUgZmlsZSB3YXMKCSAqIGNhY2hlZCB3aXRoLiAgRGVmYXVsdHMgdG8gJ3NwYycuCgkgKiBAcGFyYW0gc3RyICRjYWNoZV9jbGFzcyBOYW1lIG9mIHRoZSBjYWNoZS1oYW5kbGluZyBjbGFzcyBiZWluZyB1c2VkCgkgKiBpbiBTaW1wbGVQaWUuICBEZWZhdWx0cyB0byAnU2ltcGxlUGllX0NhY2hlJywgYW5kIHNob3VsZCBiZSBsZWZ0CgkgKiBhcy1pcyB1bmxlc3MgeW91J3ZlIG92ZXJsb2FkZWQgdGhlIGNsYXNzLgoJICogQHBhcmFtIHN0ciAkY2FjaGVfbmFtZV9mdW5jdGlvbiBPYnNvbGV0ZS4gRXhpc3RzIGZvciBiYWNrd2FyZHMKCSAqIGNvbXBhdGliaWxpdHkgcmVhc29ucyBvbmx5LgoJICovCglmdW5jdGlvbiBkaXNwbGF5X2NhY2hlZF9maWxlKCRpZGVudGlmaWVyX3VybCwgJGNhY2hlX2xvY2F0aW9uID0gJy4vY2FjaGUnLCAkY2FjaGVfZXh0ZW5zaW9uID0gJ3NwYycsICRjYWNoZV9jbGFzcyA9ICdTaW1wbGVQaWVfQ2FjaGUnLCAkY2FjaGVfbmFtZV9mdW5jdGlvbiA9ICdtZDUnKQoJewoJCSRjYWNoZSA9IGNhbGxfdXNlcl9mdW5jKGFycmF5KCRjYWNoZV9jbGFzcywgJ2NyZWF0ZScpLCAkY2FjaGVfbG9jYXRpb24sICRpZGVudGlmaWVyX3VybCwgJGNhY2hlX2V4dGVuc2lvbik7CgoJCWlmICgkZmlsZSA9ICRjYWNoZS0+bG9hZCgpKQoJCXsKCQkJaWYgKGlzc2V0KCRmaWxlWydoZWFkZXJzJ11bJ2NvbnRlbnQtdHlwZSddKSkKCQkJewoJCQkJaGVhZGVyKCdDb250ZW50LXR5cGU6JyAuICRmaWxlWydoZWFkZXJzJ11bJ2NvbnRlbnQtdHlwZSddKTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCWhlYWRlcignQ29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nKTsKCQkJfQoJCQloZWFkZXIoJ0V4cGlyZXM6ICcgLiBnbWRhdGUoJ0QsIGQgTSBZIEg6aTpzJywgdGltZSgpICsgNjA0ODAwKSAuICcgR01UJyk7IC8vIDcgZGF5cwoJCQllY2hvICRmaWxlWydib2R5J107CgkJCWV4aXQ7CgkJfQoKCQlkaWUoJ0NhY2hlZCBmaWxlIGZvciAnIC4gJGlkZW50aWZpZXJfdXJsIC4gJyBjYW5ub3QgYmUgZm91bmQuJyk7Cgl9CgoJZnVuY3Rpb24gZml4X3Byb3RvY29sKCR1cmwsICRodHRwID0gMSkKCXsKCQkkdXJsID0gU2ltcGxlUGllX01pc2M6Om5vcm1hbGl6ZV91cmwoJHVybCk7CgkJJHBhcnNlZCA9IFNpbXBsZVBpZV9NaXNjOjpwYXJzZV91cmwoJHVybCk7CgkJaWYgKCRwYXJzZWRbJ3NjaGVtZSddICE9PSAnJyAmJiAkcGFyc2VkWydzY2hlbWUnXSAhPSAnaHR0cCcgJiYgJHBhcnNlZFsnc2NoZW1lJ10gIT0gJ2h0dHBzJykKCQl7CgkJCXJldHVybiBTaW1wbGVQaWVfTWlzYzo6Zml4X3Byb3RvY29sKFNpbXBsZVBpZV9NaXNjOjpjb21wcmVzc19wYXJzZV91cmwoJ2h0dHAnLCAkcGFyc2VkWydhdXRob3JpdHknXSwgJHBhcnNlZFsncGF0aCddLCAkcGFyc2VkWydxdWVyeSddLCAkcGFyc2VkWydmcmFnbWVudCddKSwgJGh0dHApOwoJCX0KCgkJaWYgKCRwYXJzZWRbJ3NjaGVtZSddID09PSAnJyAmJiAkcGFyc2VkWydhdXRob3JpdHknXSA9PT0gJycgJiYgIWZpbGVfZXhpc3RzKCR1cmwpKQoJCXsKCQkJcmV0dXJuIFNpbXBsZVBpZV9NaXNjOjpmaXhfcHJvdG9jb2woU2ltcGxlUGllX01pc2M6OmNvbXByZXNzX3BhcnNlX3VybCgnaHR0cCcsICRwYXJzZWRbJ3BhdGgnXSwgJycsICRwYXJzZWRbJ3F1ZXJ5J10sICRwYXJzZWRbJ2ZyYWdtZW50J10pLCAkaHR0cCk7CgkJfQoKCQlpZiAoJGh0dHAgPT0gMiAmJiAkcGFyc2VkWydzY2hlbWUnXSAhPT0gJycpCgkJewoJCQlyZXR1cm4gImZlZWQ6JHVybCI7CgkJfQoJCWVsc2VpZiAoJGh0dHAgPT0gMyAmJiBzdHJ0b2xvd2VyKCRwYXJzZWRbJ3NjaGVtZSddKSA9PSAnaHR0cCcpCgkJewoJCQlyZXR1cm4gc3Vic3RyX3JlcGxhY2UoJHVybCwgJ3BvZGNhc3QnLCAwLCA0KTsKCQl9CgkJZWxzZWlmICgkaHR0cCA9PSA0ICYmIHN0cnRvbG93ZXIoJHBhcnNlZFsnc2NoZW1lJ10pID09ICdodHRwJykKCQl7CgkJCXJldHVybiBzdWJzdHJfcmVwbGFjZSgkdXJsLCAnaXRwYycsIDAsIDQpOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gJHVybDsKCQl9Cgl9CgoJZnVuY3Rpb24gcGFyc2VfdXJsKCR1cmwpCgl7CgkJc3RhdGljICRjYWNoZSA9IGFycmF5KCk7CgkJaWYgKGlzc2V0KCRjYWNoZVskdXJsXSkpCgkJewoJCQlyZXR1cm4gJGNhY2hlWyR1cmxdOwoJCX0KCQllbHNlaWYgKHByZWdfbWF0Y2goJy9eKChbXjpcLz8jXSspOik/KFwvXC8oW15cLz8jXSopKT8oW14/I10qKShcPyhbXiNdKikpPygjKC4qKSk/JC8nLCAkdXJsLCAkbWF0Y2gpKQoJCXsKCQkJZm9yICgkaSA9IGNvdW50KCRtYXRjaCk7ICRpIDw9IDk7ICRpKyspCgkJCXsKCQkJCSRtYXRjaFskaV0gPSAnJzsKCQkJfQoJCQlyZXR1cm4gJGNhY2hlWyR1cmxdID0gYXJyYXkoJ3NjaGVtZScgPT4gJG1hdGNoWzJdLCAnYXV0aG9yaXR5JyA9PiAkbWF0Y2hbNF0sICdwYXRoJyA9PiAkbWF0Y2hbNV0sICdxdWVyeScgPT4gJG1hdGNoWzddLCAnZnJhZ21lbnQnID0+ICRtYXRjaFs5XSk7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiAkY2FjaGVbJHVybF0gPSBhcnJheSgnc2NoZW1lJyA9PiAnJywgJ2F1dGhvcml0eScgPT4gJycsICdwYXRoJyA9PiAnJywgJ3F1ZXJ5JyA9PiAnJywgJ2ZyYWdtZW50JyA9PiAnJyk7CgkJfQoJfQoKCWZ1bmN0aW9uIGNvbXByZXNzX3BhcnNlX3VybCgkc2NoZW1lID0gJycsICRhdXRob3JpdHkgPSAnJywgJHBhdGggPSAnJywgJHF1ZXJ5ID0gJycsICRmcmFnbWVudCA9ICcnKQoJewoJCSRyZXR1cm4gPSAnJzsKCQlpZiAoJHNjaGVtZSAhPT0gJycpCgkJewoJCQkkcmV0dXJuIC49ICIkc2NoZW1lOiI7CgkJfQoJCWlmICgkYXV0aG9yaXR5ICE9PSAnJykKCQl7CgkJCSRyZXR1cm4gLj0gIi8vJGF1dGhvcml0eSI7CgkJfQoJCWlmICgkcGF0aCAhPT0gJycpCgkJewoJCQkkcmV0dXJuIC49ICRwYXRoOwoJCX0KCQlpZiAoJHF1ZXJ5ICE9PSAnJykKCQl7CgkJCSRyZXR1cm4gLj0gIj8kcXVlcnkiOwoJCX0KCQlpZiAoJGZyYWdtZW50ICE9PSAnJykKCQl7CgkJCSRyZXR1cm4gLj0gIiMkZnJhZ21lbnQiOwoJCX0KCQlyZXR1cm4gJHJldHVybjsKCX0KCglmdW5jdGlvbiBub3JtYWxpemVfdXJsKCR1cmwpCgl7CgkJJHVybCA9IHByZWdfcmVwbGFjZV9jYWxsYmFjaygnLyUoWzAtOUEtRmEtZl17Mn0pLycsIGFycmF5KCdTaW1wbGVQaWVfTWlzYycsICdwZXJjZW50X2VuY29kaW5nX25vcm1hbGl6YXRpb24nKSwgJHVybCk7CgkJJHVybCA9IFNpbXBsZVBpZV9NaXNjOjpwYXJzZV91cmwoJHVybCk7CgkJJHVybFsnc2NoZW1lJ10gPSBzdHJ0b2xvd2VyKCR1cmxbJ3NjaGVtZSddKTsKCQlpZiAoJHVybFsnYXV0aG9yaXR5J10gIT09ICcnKQoJCXsKCQkJJHVybFsnYXV0aG9yaXR5J10gPSBzdHJ0b2xvd2VyKCR1cmxbJ2F1dGhvcml0eSddKTsKCQkJJHVybFsncGF0aCddID0gU2ltcGxlUGllX01pc2M6OnJlbW92ZV9kb3Rfc2VnbWVudHMoJHVybFsncGF0aCddKTsKCQl9CgkJcmV0dXJuIFNpbXBsZVBpZV9NaXNjOjpjb21wcmVzc19wYXJzZV91cmwoJHVybFsnc2NoZW1lJ10sICR1cmxbJ2F1dGhvcml0eSddLCAkdXJsWydwYXRoJ10sICR1cmxbJ3F1ZXJ5J10sICR1cmxbJ2ZyYWdtZW50J10pOwoJfQoKCWZ1bmN0aW9uIHBlcmNlbnRfZW5jb2Rpbmdfbm9ybWFsaXphdGlvbigkbWF0Y2gpCgl7CgkJJGludGVnZXIgPSBoZXhkZWMoJG1hdGNoWzFdKTsKCQlpZiAoJGludGVnZXIgPj0gMHg0MSAmJiAkaW50ZWdlciA8PSAweDVBIHx8ICRpbnRlZ2VyID49IDB4NjEgJiYgJGludGVnZXIgPD0gMHg3QSB8fCAkaW50ZWdlciA+PSAweDMwICYmICRpbnRlZ2VyIDw9IDB4MzkgfHwgJGludGVnZXIgPT0gMHgyRCB8fCAkaW50ZWdlciA9PSAweDJFIHx8ICRpbnRlZ2VyID09IDB4NUYgfHwgJGludGVnZXIgPT0gMHg3RSkKCQl7CgkJCXJldHVybiBjaHIoJGludGVnZXIpOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gc3RydG91cHBlcigkbWF0Y2hbMF0pOwoJCX0KCX0KCgkvKioKCSAqIFJlbW92ZSBiYWQgVVRGLTggYnl0ZXMKCSAqCgkgKiBQQ1JFIFBhdHRlcm4gdG8gbG9jYXRlIGJhZCBieXRlcyBpbiBhIFVURi04IHN0cmluZyBjb21lcyBmcm9tIFczQwoJICogRkFROiBNdWx0aWxpbmd1YWwgRm9ybXMgKG1vZGlmaWVkIHRvIGluY2x1ZGUgZnVsbCBBU0NJSSByYW5nZSkKCSAqCgkgKiBAYXV0aG9yIEdlb2ZmcmV5IFNuZWRkb24KCSAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvSW50ZXJuYXRpb25hbC9xdWVzdGlvbnMvcWEtZm9ybXMtdXRmLTgKCSAqIEBwYXJhbSBzdHJpbmcgJHN0ciBTdHJpbmcgdG8gcmVtb3ZlIGJhZCBVVEYtOCBieXRlcyBmcm9tCgkgKiBAcmV0dXJuIHN0cmluZyBVVEYtOCBzdHJpbmcKCSAqLwoJZnVuY3Rpb24gdXRmOF9iYWRfcmVwbGFjZSgkc3RyKQoJewoJCWlmIChmdW5jdGlvbl9leGlzdHMoJ2ljb252JykgJiYgKCRyZXR1cm4gPSBAaWNvbnYoJ1VURi04JywgJ1VURi04Ly9JR05PUkUnLCAkc3RyKSkpCgkJewoJCQlyZXR1cm4gJHJldHVybjsKCQl9CgkJZWxzZWlmIChmdW5jdGlvbl9leGlzdHMoJ21iX2NvbnZlcnRfZW5jb2RpbmcnKSAmJiAoJHJldHVybiA9IEBtYl9jb252ZXJ0X2VuY29kaW5nKCRzdHIsICdVVEYtOCcsICdVVEYtOCcpKSkKCQl7CgkJCXJldHVybiAkcmV0dXJuOwoJCX0KCQllbHNlaWYgKHByZWdfbWF0Y2hfYWxsKCcvKD86W1x4MDAtXHg3Rl18W1x4QzItXHhERl1bXHg4MC1ceEJGXXxceEUwW1x4QTAtXHhCRl1bXHg4MC1ceEJGXXxbXHhFMS1ceEVDXHhFRVx4RUZdW1x4ODAtXHhCRl17Mn18XHhFRFtceDgwLVx4OUZdW1x4ODAtXHhCRl18XHhGMFtceDkwLVx4QkZdW1x4ODAtXHhCRl17Mn18W1x4RjEtXHhGM11bXHg4MC1ceEJGXXszfXxceEY0W1x4ODAtXHg4Rl1bXHg4MC1ceEJGXXsyfSkrLycsICRzdHIsICRtYXRjaGVzKSkKCQl7CgkJCXJldHVybiBpbXBsb2RlKCJceEVGXHhCRlx4QkQiLCAkbWF0Y2hlc1swXSk7CgkJfQoJCWVsc2VpZiAoJHN0ciAhPT0gJycpCgkJewoJCQlyZXR1cm4gIlx4RUZceEJGXHhCRCI7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiAnJzsKCQl9Cgl9CgoJLyoqCgkgKiBDb252ZXJ0cyBhIFdpbmRvd3MtMTI1MiBlbmNvZGVkIHN0cmluZyB0byBhIFVURi04IGVuY29kZWQgc3RyaW5nCgkgKgoJICogQHN0YXRpYwoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEBwYXJhbSBzdHJpbmcgJHN0cmluZyBXaW5kb3dzLTEyNTIgZW5jb2RlZCBzdHJpbmcKCSAqIEByZXR1cm4gc3RyaW5nIFVURi04IGVuY29kZWQgc3RyaW5nCgkgKi8KCWZ1bmN0aW9uIHdpbmRvd3NfMTI1Ml90b191dGY4KCRzdHJpbmcpCgl7CgkJc3RhdGljICRjb252ZXJ0X3RhYmxlID0gYXJyYXkoIlx4ODAiID0+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+ICJceEMzXHhCRCIsICJceEZFIiA9PiAiXHhDM1x4QkUiLCAiXHhGRiIgPT4gIlx4QzNceEJGIik7CgoJCXJldHVybiBzdHJ0cigkc3RyaW5nLCAkY29udmVydF90YWJsZSk7Cgl9CgoJZnVuY3Rpb24gY2hhbmdlX2VuY29kaW5nKCRkYXRhLCAkaW5wdXQsICRvdXRwdXQpCgl7CgkJJGlucHV0ID0gU2ltcGxlUGllX01pc2M6OmVuY29kaW5nKCRpbnB1dCk7CgkJJG91dHB1dCA9IFNpbXBsZVBpZV9NaXNjOjplbmNvZGluZygkb3V0cHV0KTsKCgkJLy8gV2UgZmFpbCB0byBmYWlsIG9uIG5vbiBVUy1BU0NJSSBieXRlcwoJCWlmICgkaW5wdXQgPT09ICdVUy1BU0NJSScpCgkJewoJCQlzdGF0aWMgJG5vbl9hc2NpaV9vY3RlY3RzID0gJyc7CgkJCWlmICghJG5vbl9hc2NpaV9vY3RlY3RzKQoJCQl7CgkJCQlmb3IgKCRpID0gMHg4MDsgJGkgPD0gMHhGRjsgJGkrKykKCQkJCXsKCQkJCQkkbm9uX2FzY2lpX29jdGVjdHMgLj0gY2hyKCRpKTsKCQkJCX0KCQkJfQoJCQkkZGF0YSA9IHN1YnN0cigkZGF0YSwgMCwgc3RyY3NwbigkZGF0YSwgJG5vbl9hc2NpaV9vY3RlY3RzKSk7CgkJfQoKCQkvLyBUaGlzIGlzIGZpcnN0LCBhcyBiZWhhdmlvdXIgb2YgdGhpcyBpcyBjb21wbGV0ZWx5IHByZWRpY3RhYmxlCgkJaWYgKCRpbnB1dCA9PT0gJ1dpbmRvd3MtMTI1MicgJiYgJG91dHB1dCA9PT0gJ1VURi04JykKCQl7CgkJCXJldHVybiBTaW1wbGVQaWVfTWlzYzo6d2luZG93c18xMjUyX3RvX3V0ZjgoJGRhdGEpOwoJCX0KCQkvLyBUaGlzIGlzIHNlY29uZCwgYXMgYmVoYXZpb3VyIG9mIHRoaXMgdmFyaWVzIG9ubHkgd2l0aCBQSFAgdmVyc2lvbgoJCWVsc2VpZiAoZnVuY3Rpb25fZXhpc3RzKCdtYl9jb252ZXJ0X2VuY29kaW5nJykgJiYgKCRyZXR1cm4gPSBAbWJfY29udmVydF9lbmNvZGluZygkZGF0YSwgJG91dHB1dCwgJGlucHV0KSkpCgkJewoJCQlyZXR1cm4gJHJldHVybjsKCQl9CgkJLy8gVGhpcyBpcyBsYXN0LCBhcyBiZWhhdmlvdXIgb2YgdGhpcyB2YXJpZXMgd2l0aCBPUyB1c2VybGFuZCBhbmQgUEhQIHZlcnNpb24KCQllbHNlaWYgKGZ1bmN0aW9uX2V4aXN0cygnaWNvbnYnKSAmJiAoJHJldHVybiA9IEBpY29udigkaW5wdXQsICRvdXRwdXQsICRkYXRhKSkpCgkJewoJCQlyZXR1cm4gJHJldHVybjsKCQl9CgkJLy8gSWYgd2UgY2FuJ3QgZG8gYW55dGhpbmcsIGp1c3QgZmFpbAoJCWVsc2UKCQl7CgkJCXJldHVybiBmYWxzZTsKCQl9Cgl9CgoJZnVuY3Rpb24gZW5jb2RpbmcoJGNoYXJzZXQpCgl7CgkJLyogQ2hhcmFjdGVyIHNldHMgYXJlIGNhc2UtaW5zZW5zaXRpdmUsIGFuZCBhbHNvIG5lZWQgc29tZSBmdXJ0aGVyCgkJbm9ybWFsaXphdGlvbiBpbiB0aGUgcmVhbCB3b3JsZCAodGhvdWdoIHdlJ2xsIHJldHVybiB0aGVtIGluIHRoZSBmb3JtIGdpdmVuCgkJaW4gdGhlaXIgcmVnaXN0cmF0aW9uKS4gKi8KCQlzd2l0Y2ggKHN0cnRvbG93ZXIocHJlZ19yZXBsYWNlKCcvW1x4MDktXHgwRFx4MjAtXHgyRlx4M0EtXHg0MFx4NUItXHg2MFx4N0ItXHg3RV0vJywgJycsICRjaGFyc2V0KSkpCgkJewoJCQljYXNlICdhZG9iZXN0YW5kYXJkZW5jb2RpbmcnOgoJCQljYXNlICdjc2Fkb2Jlc3RhbmRhcmRlbmNvZGluZyc6CgkJCQlyZXR1cm4gJ0Fkb2JlLVN0YW5kYXJkLUVuY29kaW5nJzsKCgkJCWNhc2UgJ2Fkb2Jlc3ltYm9sZW5jb2RpbmcnOgoJCQljYXNlICdjc2hwcHNtYXRoJzoKCQkJCXJldHVybiAnQWRvYmUtU3ltYm9sLUVuY29kaW5nJzsKCgkJCWNhc2UgJ2FtaTEyNTEnOgoJCQljYXNlICdhbWkxMjUxJzoKCQkJY2FzZSAnYW1pZ2ExMjUxJzoKCQkJY2FzZSAnYW1pZ2ExMjUxJzoKCQkJCXJldHVybiAnQW1pZ2EtMTI1MSc7CgoJCQljYXNlICdhbnNpeDMxMTAxOTgzJzoKCQkJY2FzZSAnY3NhdDUwMDE5ODMnOgoJCQljYXNlICdjc2lzbzk5bmFwbHBzJzoKCQkJY2FzZSAnaXNvaXI5OSc6CgkJCWNhc2UgJ25hcGxwcyc6CgkJCQlyZXR1cm4gJ0FOU0lfWDMuMTEwLTE5ODMnOwoKCQkJY2FzZSAnYXJhYmljNyc6CgkJCWNhc2UgJ2FzbW80NDknOgoJCQljYXNlICdjc2lzbzg5YXNtbzQ0OSc6CgkJCWNhc2UgJ2lzb2lyODknOgoJCQljYXNlICdpc285MDM2JzoKCQkJCXJldHVybiAnQVNNT180NDknOwoKCQkJY2FzZSAnYmlnNSc6CgkJCWNhc2UgJ2NzYmlnNSc6CgkJCWNhc2UgJ3h4YmlnNSc6CgkJCQlyZXR1cm4gJ0JpZzUnOwoKCQkJY2FzZSAnYmlnNWhrc2NzJzoKCQkJCXJldHVybiAnQmlnNS1IS1NDUyc7CgoJCQljYXNlICdib2N1MSc6CgkJCWNhc2UgJ2NzYm9jdTEnOgoJCQkJcmV0dXJuICdCT0NVLTEnOwoKCQkJY2FzZSAnYnJmJzoKCQkJY2FzZSAnY3NicmYnOgoJCQkJcmV0dXJuICdCUkYnOwoKCQkJY2FzZSAnYnM0NzMwJzoKCQkJY2FzZSAnY3Npc280dW5pdGVka2luZ2RvbSc6CgkJCWNhc2UgJ2diJzoKCQkJY2FzZSAnaXNvaXI0JzoKCQkJY2FzZSAnaXNvNjQ2Z2InOgoJCQljYXNlICd1ayc6CgkJCQlyZXR1cm4gJ0JTXzQ3MzAnOwoKCQkJY2FzZSAnYnN2aWV3ZGF0YSc6CgkJCWNhc2UgJ2NzaXNvNDdic3ZpZXdkYXRhJzoKCQkJY2FzZSAnaXNvaXI0Nyc6CgkJCQlyZXR1cm4gJ0JTX3ZpZXdkYXRhJzsKCgkJCWNhc2UgJ2Nlc3U4JzoKCQkJY2FzZSAnY3NjZXN1OCc6CgkJCQlyZXR1cm4gJ0NFU1UtOCc7CgoJCQljYXNlICdjYSc6CgkJCWNhc2UgJ2NzYTcxJzoKCQkJY2FzZSAnY3NhejI0MzQxOTg1MSc6CgkJCWNhc2UgJ2NzaXNvMTIxY2FuYWRpYW4xJzoKCQkJY2FzZSAnaXNvaXIxMjEnOgoJCQljYXNlICdpc282NDZjYSc6CgkJCQlyZXR1cm4gJ0NTQV9aMjQzLjQtMTk4NS0xJzsKCgkJCWNhc2UgJ2NzYTcyJzoKCQkJY2FzZSAnY3NhejI0MzQxOTg1Mic6CgkJCWNhc2UgJ2NzaXNvMTIyY2FuYWRpYW4yJzoKCQkJY2FzZSAnaXNvaXIxMjInOgoJCQljYXNlICdpc282NDZjYTInOgoJCQkJcmV0dXJuICdDU0FfWjI0My40LTE5ODUtMic7CgoJCQljYXNlICdjc2F6MjQzNDE5ODVncic6CgkJCWNhc2UgJ2NzaXNvMTIzY3NhejI0MzQxOTg1Z3InOgoJCQljYXNlICdpc29pcjEyMyc6CgkJCQlyZXR1cm4gJ0NTQV9aMjQzLjQtMTk4NS1ncic7CgoJCQljYXNlICdjc2lzbzEzOWNzbjM2OTEwMyc6CgkJCWNhc2UgJ2NzbjM2OTEwMyc6CgkJCWNhc2UgJ2lzb2lyMTM5JzoKCQkJCXJldHVybiAnQ1NOXzM2OTEwMyc7CgoJCQljYXNlICdjc2RlY21jcyc6CgkJCWNhc2UgJ2RlYyc6CgkJCWNhc2UgJ2RlY21jcyc6CgkJCQlyZXR1cm4gJ0RFQy1NQ1MnOwoKCQkJY2FzZSAnY3Npc28yMWdlcm1hbic6CgkJCWNhc2UgJ2RlJzoKCQkJY2FzZSAnZGluNjYwMDMnOgoJCQljYXNlICdpc29pcjIxJzoKCQkJY2FzZSAnaXNvNjQ2ZGUnOgoJCQkJcmV0dXJuICdESU5fNjYwMDMnOwoKCQkJY2FzZSAnY3Nka3VzJzoKCQkJY2FzZSAnZGt1cyc6CgkJCQlyZXR1cm4gJ2RrLXVzJzsKCgkJCWNhc2UgJ2NzaXNvNjQ2ZGFuaXNoJzoKCQkJY2FzZSAnZGsnOgoJCQljYXNlICdkczIwODknOgoJCQljYXNlICdkczIwODknOgoJCQljYXNlICdpc282NDZkayc6CgkJCQlyZXR1cm4gJ0RTXzIwODknOwoKCQkJY2FzZSAnY3NpYm1lYmNkaWNhdGRlJzoKCQkJY2FzZSAnZWJjZGljYXRkZSc6CgkJCQlyZXR1cm4gJ0VCQ0RJQy1BVC1ERSc7CgoJCQljYXNlICdjc2ViY2RpY2F0ZGVhJzoKCQkJY2FzZSAnZWJjZGljYXRkZWEnOgoJCQkJcmV0dXJuICdFQkNESUMtQVQtREUtQSc7CgoJCQljYXNlICdjc2ViY2RpY2NhZnInOgoJCQljYXNlICdlYmNkaWNjYWZyJzoKCQkJCXJldHVybiAnRUJDRElDLUNBLUZSJzsKCgkJCWNhc2UgJ2NzZWJjZGljZGtubyc6CgkJCWNhc2UgJ2ViY2RpY2Rrbm8nOgoJCQkJcmV0dXJuICdFQkNESUMtREstTk8nOwoKCQkJY2FzZSAnY3NlYmNkaWNka25vYSc6CgkJCWNhc2UgJ2ViY2RpY2Rrbm9hJzoKCQkJCXJldHVybiAnRUJDRElDLURLLU5PLUEnOwoKCQkJY2FzZSAnY3NlYmNkaWNlcyc6CgkJCWNhc2UgJ2ViY2RpY2VzJzoKCQkJCXJldHVybiAnRUJDRElDLUVTJzsKCgkJCWNhc2UgJ2NzZWJjZGljZXNhJzoKCQkJY2FzZSAnZWJjZGljZXNhJzoKCQkJCXJldHVybiAnRUJDRElDLUVTLUEnOwoKCQkJY2FzZSAnY3NlYmNkaWNlc3MnOgoJCQljYXNlICdlYmNkaWNlc3MnOgoJCQkJcmV0dXJuICdFQkNESUMtRVMtUyc7CgoJCQljYXNlICdjc2ViY2RpY2Zpc2UnOgoJCQljYXNlICdlYmNkaWNmaXNlJzoKCQkJCXJldHVybiAnRUJDRElDLUZJLVNFJzsKCgkJCWNhc2UgJ2NzZWJjZGljZmlzZWEnOgoJCQljYXNlICdlYmNkaWNmaXNlYSc6CgkJCQlyZXR1cm4gJ0VCQ0RJQy1GSS1TRS1BJzsKCgkJCWNhc2UgJ2NzZWJjZGljZnInOgoJCQljYXNlICdlYmNkaWNmcic6CgkJCQlyZXR1cm4gJ0VCQ0RJQy1GUic7CgoJCQljYXNlICdjc2ViY2RpY2l0JzoKCQkJY2FzZSAnZWJjZGljaXQnOgoJCQkJcmV0dXJuICdFQkNESUMtSVQnOwoKCQkJY2FzZSAnY3NlYmNkaWNwdCc6CgkJCWNhc2UgJ2ViY2RpY3B0JzoKCQkJCXJldHVybiAnRUJDRElDLVBUJzsKCgkJCWNhc2UgJ2NzZWJjZGljdWsnOgoJCQljYXNlICdlYmNkaWN1ayc6CgkJCQlyZXR1cm4gJ0VCQ0RJQy1VSyc7CgoJCQljYXNlICdjc2ViY2RpY3VzJzoKCQkJY2FzZSAnZWJjZGljdXMnOgoJCQkJcmV0dXJuICdFQkNESUMtVVMnOwoKCQkJY2FzZSAnY3Npc28xMTFlY21hY3lyaWxsaWMnOgoJCQljYXNlICdlY21hY3lyaWxsaWMnOgoJCQljYXNlICdpc29pcjExMSc6CgkJCWNhc2UgJ2tvaThlJzoKCQkJCXJldHVybiAnRUNNQS1jeXJpbGxpYyc7CgoJCQljYXNlICdjc2lzbzE3c3BhbmlzaCc6CgkJCWNhc2UgJ2VzJzoKCQkJY2FzZSAnaXNvaXIxNyc6CgkJCWNhc2UgJ2lzbzY0NmVzJzoKCQkJCXJldHVybiAnRVMnOwoKCQkJY2FzZSAnY3Npc284NXNwYW5pc2gyJzoKCQkJY2FzZSAnZXMyJzoKCQkJY2FzZSAnaXNvaXI4NSc6CgkJCWNhc2UgJ2lzbzY0NmVzMic6CgkJCQlyZXR1cm4gJ0VTMic7CgoJCQljYXNlICdjc2V1Y2ZpeHdpZGphcGFuZXNlJzoKCQkJY2FzZSAnZXh0ZW5kZWR1bml4Y29kZWZpeGVkd2lkdGhmb3JqYXBhbmVzZSc6CgkJCQlyZXR1cm4gJ0V4dGVuZGVkX1VOSVhfQ29kZV9GaXhlZF9XaWR0aF9mb3JfSmFwYW5lc2UnOwoKCQkJY2FzZSAnY3NldWNwa2RmbXRqYXBhbmVzZSc6CgkJCWNhc2UgJ2V1Y2pwJzoKCQkJY2FzZSAnZXh0ZW5kZWR1bml4Y29kZXBhY2tlZGZvcm1hdGZvcmphcGFuZXNlJzoKCQkJCXJldHVybiAnRXh0ZW5kZWRfVU5JWF9Db2RlX1BhY2tlZF9Gb3JtYXRfZm9yX0phcGFuZXNlJzsKCgkJCWNhc2UgJ2diMTgwMzAnOgoJCQkJcmV0dXJuICdHQjE4MDMwJzsKCgkJCWNhc2UgJ2NwOTM2JzoKCQkJY2FzZSAnZ2JrJzoKCQkJY2FzZSAnbXM5MzYnOgoJCQljYXNlICd3aW5kb3dzOTM2JzoKCQkJY2FzZSAnY3NnYjIzMTInOgoJCQljYXNlICdnYjIzMTInOgoJCQljYXNlICdjaGluZXNlJzoKCQkJY2FzZSAnY3Npc281OGdiMjMxMjgwJzoKCQkJY2FzZSAnZ2IyMzEyODAnOgoJCQljYXNlICdpc29pcjU4JzoKCQkJCXJldHVybiAnR0JLJzsKCgkJCWNhc2UgJ2NuJzoKCQkJY2FzZSAnY3Npc281N2diMTk4OCc6CgkJCWNhc2UgJ2diMTk4ODgwJzoKCQkJY2FzZSAnaXNvaXI1Nyc6CgkJCWNhc2UgJ2lzbzY0NmNuJzoKCQkJCXJldHVybiAnR0JfMTk4OC04MCc7CgoJCQljYXNlICdjc2lzbzE1M2dvc3QxOTc2ODc0JzoKCQkJY2FzZSAnZ29zdDE5NzY4NzQnOgoJCQljYXNlICdpc29pcjE1Myc6CgkJCWNhc2UgJ3N0c2V2MzU4ODgnOgoJCQkJcmV0dXJuICdHT1NUXzE5NzY4LTc0JzsKCgkJCWNhc2UgJ2NzaXNvMTUwJzoKCQkJY2FzZSAnY3Npc28xNTBncmVla2NjaXR0JzoKCQkJY2FzZSAnZ3JlZWtjY2l0dCc6CgkJCWNhc2UgJ2lzb2lyMTUwJzoKCQkJCXJldHVybiAnZ3JlZWstY2NpdHQnOwoKCQkJY2FzZSAnY3Npc284OGdyZWVrNyc6CgkJCWNhc2UgJ2dyZWVrNyc6CgkJCWNhc2UgJ2lzb2lyODgnOgoJCQkJcmV0dXJuICdncmVlazcnOwoKCQkJY2FzZSAnY3Npc28xOGdyZWVrN29sZCc6CgkJCWNhc2UgJ2dyZWVrN29sZCc6CgkJCWNhc2UgJ2lzb2lyMTgnOgoJCQkJcmV0dXJuICdncmVlazctb2xkJzsKCgkJCWNhc2UgJ2NzaHBkZXNrdG9wJzoKCQkJY2FzZSAnaHBkZXNrdG9wJzoKCQkJCXJldHVybiAnSFAtRGVza1RvcCc7CgoJCQljYXNlICdjc2hwbGVnYWwnOgoJCQljYXNlICdocGxlZ2FsJzoKCQkJCXJldHVybiAnSFAtTGVnYWwnOwoKCQkJY2FzZSAnY3NocG1hdGg4JzoKCQkJY2FzZSAnaHBtYXRoOCc6CgkJCQlyZXR1cm4gJ0hQLU1hdGg4JzsKCgkJCWNhc2UgJ2NzaHBwaWZvbnQnOgoJCQljYXNlICdocHBpZm9udCc6CgkJCQlyZXR1cm4gJ0hQLVBpLWZvbnQnOwoKCQkJY2FzZSAnY3NocHJvbWFuOCc6CgkJCWNhc2UgJ2hwcm9tYW44JzoKCQkJY2FzZSAncjgnOgoJCQljYXNlICdyb21hbjgnOgoJCQkJcmV0dXJuICdocC1yb21hbjgnOwoKCQkJY2FzZSAnaHpnYjIzMTInOgoJCQkJcmV0dXJuICdIWi1HQi0yMzEyJzsKCgkJCWNhc2UgJ2NzaWJtc3ltYm9scyc6CgkJCWNhc2UgJ2libXN5bWJvbHMnOgoJCQkJcmV0dXJuICdJQk0tU3ltYm9scyc7CgoJCQljYXNlICdjc2libXRoYWknOgoJCQljYXNlICdpYm10aGFpJzoKCQkJCXJldHVybiAnSUJNLVRoYWknOwoKCQkJY2FzZSAnY2NzaWQwMDg1OCc6CgkJCWNhc2UgJ2NwMDA4NTgnOgoJCQljYXNlICdpYm0wMDg1OCc6CgkJCWNhc2UgJ3BjbXVsdGlsaW5ndWFsODUwZXVybyc6CgkJCQlyZXR1cm4gJ0lCTTAwODU4JzsKCgkJCWNhc2UgJ2Njc2lkMDA5MjQnOgoJCQljYXNlICdjcDAwOTI0JzoKCQkJY2FzZSAnZWJjZGljbGF0aW45ZXVybyc6CgkJCWNhc2UgJ2libTAwOTI0JzoKCQkJCXJldHVybiAnSUJNMDA5MjQnOwoKCQkJY2FzZSAnY2NzaWQwMTE0MCc6CgkJCWNhc2UgJ2NwMDExNDAnOgoJCQljYXNlICdlYmNkaWN1czM3ZXVybyc6CgkJCWNhc2UgJ2libTAxMTQwJzoKCQkJCXJldHVybiAnSUJNMDExNDAnOwoKCQkJY2FzZSAnY2NzaWQwMTE0MSc6CgkJCWNhc2UgJ2NwMDExNDEnOgoJCQljYXNlICdlYmNkaWNkZTI3M2V1cm8nOgoJCQljYXNlICdpYm0wMTE0MSc6CgkJCQlyZXR1cm4gJ0lCTTAxMTQxJzsKCgkJCWNhc2UgJ2Njc2lkMDExNDInOgoJCQljYXNlICdjcDAxMTQyJzoKCQkJY2FzZSAnZWJjZGljZGsyNzdldXJvJzoKCQkJY2FzZSAnZWJjZGljbm8yNzdldXJvJzoKCQkJY2FzZSAnaWJtMDExNDInOgoJCQkJcmV0dXJuICdJQk0wMTE0Mic7CgoJCQljYXNlICdjY3NpZDAxMTQzJzoKCQkJY2FzZSAnY3AwMTE0Myc6CgkJCWNhc2UgJ2ViY2RpY2ZpMjc4ZXVybyc6CgkJCWNhc2UgJ2ViY2RpY3NlMjc4ZXVybyc6CgkJCWNhc2UgJ2libTAxMTQzJzoKCQkJCXJldHVybiAnSUJNMDExNDMnOwoKCQkJY2FzZSAnY2NzaWQwMTE0NCc6CgkJCWNhc2UgJ2NwMDExNDQnOgoJCQljYXNlICdlYmNkaWNpdDI4MGV1cm8nOgoJCQljYXNlICdpYm0wMTE0NCc6CgkJCQlyZXR1cm4gJ0lCTTAxMTQ0JzsKCgkJCWNhc2UgJ2Njc2lkMDExNDUnOgoJCQljYXNlICdjcDAxMTQ1JzoKCQkJY2FzZSAnZWJjZGljZXMyODRldXJvJzoKCQkJY2FzZSAnaWJtMDExNDUnOgoJCQkJcmV0dXJuICdJQk0wMTE0NSc7CgoJCQljYXNlICdjY3NpZDAxMTQ2JzoKCQkJY2FzZSAnY3AwMTE0Nic6CgkJCWNhc2UgJ2ViY2RpY2diMjg1ZXVybyc6CgkJCWNhc2UgJ2libTAxMTQ2JzoKCQkJCXJldHVybiAnSUJNMDExNDYnOwoKCQkJY2FzZSAnY2NzaWQwMTE0Nyc6CgkJCWNhc2UgJ2NwMDExNDcnOgoJCQljYXNlICdlYmNkaWNmcjI5N2V1cm8nOgoJCQljYXNlICdpYm0wMTE0Nyc6CgkJCQlyZXR1cm4gJ0lCTTAxMTQ3JzsKCgkJCWNhc2UgJ2Njc2lkMDExNDgnOgoJCQljYXNlICdjcDAxMTQ4JzoKCQkJY2FzZSAnZWJjZGljaW50ZXJuYXRpb25hbDUwMGV1cm8nOgoJCQljYXNlICdpYm0wMTE0OCc6CgkJCQlyZXR1cm4gJ0lCTTAxMTQ4JzsKCgkJCWNhc2UgJ2Njc2lkMDExNDknOgoJCQljYXNlICdjcDAxMTQ5JzoKCQkJY2FzZSAnZWJjZGljaXM4NzFldXJvJzoKCQkJY2FzZSAnaWJtMDExNDknOgoJCQkJcmV0dXJuICdJQk0wMTE0OSc7CgoJCQljYXNlICdjcDAzNyc6CgkJCWNhc2UgJ2NzaWJtMDM3JzoKCQkJY2FzZSAnZWJjZGljY3BjYSc6CgkJCWNhc2UgJ2ViY2RpY2NwbmwnOgoJCQljYXNlICdlYmNkaWNjcHVzJzoKCQkJY2FzZSAnZWJjZGljY3B3dCc6CgkJCWNhc2UgJ2libTAzNyc6CgkJCQlyZXR1cm4gJ0lCTTAzNyc7CgoJCQljYXNlICdjcDAzOCc6CgkJCWNhc2UgJ2NzaWJtMDM4JzoKCQkJY2FzZSAnZWJjZGljaW50JzoKCQkJY2FzZSAnaWJtMDM4JzoKCQkJCXJldHVybiAnSUJNMDM4JzsKCgkJCWNhc2UgJ2NwMjczJzoKCQkJY2FzZSAnY3NpYm0yNzMnOgoJCQljYXNlICdpYm0yNzMnOgoJCQkJcmV0dXJuICdJQk0yNzMnOwoKCQkJY2FzZSAnY3AyNzQnOgoJCQljYXNlICdjc2libTI3NCc6CgkJCWNhc2UgJ2ViY2RpY2JlJzoKCQkJY2FzZSAnaWJtMjc0JzoKCQkJCXJldHVybiAnSUJNMjc0JzsKCgkJCWNhc2UgJ2NwMjc1JzoKCQkJY2FzZSAnY3NpYm0yNzUnOgoJCQljYXNlICdlYmNkaWNicic6CgkJCWNhc2UgJ2libTI3NSc6CgkJCQlyZXR1cm4gJ0lCTTI3NSc7CgoJCQljYXNlICdjc2libTI3Nyc6CgkJCWNhc2UgJ2ViY2RpY2NwZGsnOgoJCQljYXNlICdlYmNkaWNjcG5vJzoKCQkJY2FzZSAnaWJtMjc3JzoKCQkJCXJldHVybiAnSUJNMjc3JzsKCgkJCWNhc2UgJ2NwMjc4JzoKCQkJY2FzZSAnY3NpYm0yNzgnOgoJCQljYXNlICdlYmNkaWNjcGZpJzoKCQkJY2FzZSAnZWJjZGljY3BzZSc6CgkJCWNhc2UgJ2libTI3OCc6CgkJCQlyZXR1cm4gJ0lCTTI3OCc7CgoJCQljYXNlICdjcDI4MCc6CgkJCWNhc2UgJ2NzaWJtMjgwJzoKCQkJY2FzZSAnZWJjZGljY3BpdCc6CgkJCWNhc2UgJ2libTI4MCc6CgkJCQlyZXR1cm4gJ0lCTTI4MCc7CgoJCQljYXNlICdjcDI4MSc6CgkJCWNhc2UgJ2NzaWJtMjgxJzoKCQkJY2FzZSAnZWJjZGljanBlJzoKCQkJY2FzZSAnaWJtMjgxJzoKCQkJCXJldHVybiAnSUJNMjgxJzsKCgkJCWNhc2UgJ2NwMjg0JzoKCQkJY2FzZSAnY3NpYm0yODQnOgoJCQljYXNlICdlYmNkaWNjcGVzJzoKCQkJY2FzZSAnaWJtMjg0JzoKCQkJCXJldHVybiAnSUJNMjg0JzsKCgkJCWNhc2UgJ2NwMjg1JzoKCQkJY2FzZSAnY3NpYm0yODUnOgoJCQljYXNlICdlYmNkaWNjcGdiJzoKCQkJY2FzZSAnaWJtMjg1JzoKCQkJCXJldHVybiAnSUJNMjg1JzsKCgkJCWNhc2UgJ2NwMjkwJzoKCQkJY2FzZSAnY3NpYm0yOTAnOgoJCQljYXNlICdlYmNkaWNqcGthbmEnOgoJCQljYXNlICdpYm0yOTAnOgoJCQkJcmV0dXJuICdJQk0yOTAnOwoKCQkJY2FzZSAnY3AyOTcnOgoJCQljYXNlICdjc2libTI5Nyc6CgkJCWNhc2UgJ2ViY2RpY2NwZnInOgoJCQljYXNlICdpYm0yOTcnOgoJCQkJcmV0dXJuICdJQk0yOTcnOwoKCQkJY2FzZSAnY3A0MjAnOgoJCQljYXNlICdjc2libTQyMCc6CgkJCWNhc2UgJ2ViY2RpY2NwYXIxJzoKCQkJY2FzZSAnaWJtNDIwJzoKCQkJCXJldHVybiAnSUJNNDIwJzsKCgkJCWNhc2UgJ2NwNDIzJzoKCQkJY2FzZSAnY3NpYm00MjMnOgoJCQljYXNlICdlYmNkaWNjcGdyJzoKCQkJY2FzZSAnaWJtNDIzJzoKCQkJCXJldHVybiAnSUJNNDIzJzsKCgkJCWNhc2UgJ2NwNDI0JzoKCQkJY2FzZSAnY3NpYm00MjQnOgoJCQljYXNlICdlYmNkaWNjcGhlJzoKCQkJY2FzZSAnaWJtNDI0JzoKCQkJCXJldHVybiAnSUJNNDI0JzsKCgkJCWNhc2UgJzQzNyc6CgkJCWNhc2UgJ2NwNDM3JzoKCQkJY2FzZSAnY3NwYzhjb2RlcGFnZTQzNyc6CgkJCWNhc2UgJ2libTQzNyc6CgkJCQlyZXR1cm4gJ0lCTTQzNyc7CgoJCQljYXNlICdjcDUwMCc6CgkJCWNhc2UgJ2NzaWJtNTAwJzoKCQkJY2FzZSAnZWJjZGljY3BiZSc6CgkJCWNhc2UgJ2ViY2RpY2NwY2gnOgoJCQljYXNlICdpYm01MDAnOgoJCQkJcmV0dXJuICdJQk01MDAnOwoKCQkJY2FzZSAnY3A3NzUnOgoJCQljYXNlICdjc3BjNzc1YmFsdGljJzoKCQkJY2FzZSAnaWJtNzc1JzoKCQkJCXJldHVybiAnSUJNNzc1JzsKCgkJCWNhc2UgJzg1MCc6CgkJCWNhc2UgJ2NwODUwJzoKCQkJY2FzZSAnY3NwYzg1MG11bHRpbGluZ3VhbCc6CgkJCWNhc2UgJ2libTg1MCc6CgkJCQlyZXR1cm4gJ0lCTTg1MCc7CgoJCQljYXNlICc4NTEnOgoJCQljYXNlICdjcDg1MSc6CgkJCWNhc2UgJ2NzaWJtODUxJzoKCQkJY2FzZSAnaWJtODUxJzoKCQkJCXJldHVybiAnSUJNODUxJzsKCgkJCWNhc2UgJzg1Mic6CgkJCWNhc2UgJ2NwODUyJzoKCQkJY2FzZSAnY3NwY3A4NTInOgoJCQljYXNlICdpYm04NTInOgoJCQkJcmV0dXJuICdJQk04NTInOwoKCQkJY2FzZSAnODU1JzoKCQkJY2FzZSAnY3A4NTUnOgoJCQljYXNlICdjc2libTg1NSc6CgkJCWNhc2UgJ2libTg1NSc6CgkJCQlyZXR1cm4gJ0lCTTg1NSc7CgoJCQljYXNlICc4NTcnOgoJCQljYXNlICdjcDg1Nyc6CgkJCWNhc2UgJ2NzaWJtODU3JzoKCQkJY2FzZSAnaWJtODU3JzoKCQkJCXJldHVybiAnSUJNODU3JzsKCgkJCWNhc2UgJzg2MCc6CgkJCWNhc2UgJ2NwODYwJzoKCQkJY2FzZSAnY3NpYm04NjAnOgoJCQljYXNlICdpYm04NjAnOgoJCQkJcmV0dXJuICdJQk04NjAnOwoKCQkJY2FzZSAnODYxJzoKCQkJY2FzZSAnY3Bpcyc6CgkJCWNhc2UgJ2NwODYxJzoKCQkJY2FzZSAnY3NpYm04NjEnOgoJCQljYXNlICdpYm04NjEnOgoJCQkJcmV0dXJuICdJQk04NjEnOwoKCQkJY2FzZSAnODYyJzoKCQkJY2FzZSAnY3A4NjInOgoJCQljYXNlICdjc3BjODYybGF0aW5oZWJyZXcnOgoJCQljYXNlICdpYm04NjInOgoJCQkJcmV0dXJuICdJQk04NjInOwoKCQkJY2FzZSAnODYzJzoKCQkJY2FzZSAnY3A4NjMnOgoJCQljYXNlICdjc2libTg2Myc6CgkJCWNhc2UgJ2libTg2Myc6CgkJCQlyZXR1cm4gJ0lCTTg2Myc7CgoJCQljYXNlICdjcDg2NCc6CgkJCWNhc2UgJ2NzaWJtODY0JzoKCQkJY2FzZSAnaWJtODY0JzoKCQkJCXJldHVybiAnSUJNODY0JzsKCgkJCWNhc2UgJzg2NSc6CgkJCWNhc2UgJ2NwODY1JzoKCQkJY2FzZSAnY3NpYm04NjUnOgoJCQljYXNlICdpYm04NjUnOgoJCQkJcmV0dXJuICdJQk04NjUnOwoKCQkJY2FzZSAnODY2JzoKCQkJY2FzZSAnY3A4NjYnOgoJCQljYXNlICdjc2libTg2Nic6CgkJCWNhc2UgJ2libTg2Nic6CgkJCQlyZXR1cm4gJ0lCTTg2Nic7CgoJCQljYXNlICdjcGFyJzoKCQkJY2FzZSAnY3A4NjgnOgoJCQljYXNlICdjc2libTg2OCc6CgkJCWNhc2UgJ2libTg2OCc6CgkJCQlyZXR1cm4gJ0lCTTg2OCc7CgoJCQljYXNlICc4NjknOgoJCQljYXNlICdjcGdyJzoKCQkJY2FzZSAnY3A4NjknOgoJCQljYXNlICdjc2libTg2OSc6CgkJCWNhc2UgJ2libTg2OSc6CgkJCQlyZXR1cm4gJ0lCTTg2OSc7CgoJCQljYXNlICdjcDg3MCc6CgkJCWNhc2UgJ2NzaWJtODcwJzoKCQkJY2FzZSAnZWJjZGljY3Byb2VjZSc6CgkJCWNhc2UgJ2ViY2RpY2NweXUnOgoJCQljYXNlICdpYm04NzAnOgoJCQkJcmV0dXJuICdJQk04NzAnOwoKCQkJY2FzZSAnY3A4NzEnOgoJCQljYXNlICdjc2libTg3MSc6CgkJCWNhc2UgJ2ViY2RpY2NwaXMnOgoJCQljYXNlICdpYm04NzEnOgoJCQkJcmV0dXJuICdJQk04NzEnOwoKCQkJY2FzZSAnY3A4ODAnOgoJCQljYXNlICdjc2libTg4MCc6CgkJCWNhc2UgJ2ViY2RpY2N5cmlsbGljJzoKCQkJY2FzZSAnaWJtODgwJzoKCQkJCXJldHVybiAnSUJNODgwJzsKCgkJCWNhc2UgJ2NwODkxJzoKCQkJY2FzZSAnY3NpYm04OTEnOgoJCQljYXNlICdpYm04OTEnOgoJCQkJcmV0dXJuICdJQk04OTEnOwoKCQkJY2FzZSAnY3A5MDMnOgoJCQljYXNlICdjc2libTkwMyc6CgkJCWNhc2UgJ2libTkwMyc6CgkJCQlyZXR1cm4gJ0lCTTkwMyc7CgoJCQljYXNlICc5MDQnOgoJCQljYXNlICdjcDkwNCc6CgkJCWNhc2UgJ2NzaWJibTkwNCc6CgkJCWNhc2UgJ2libTkwNCc6CgkJCQlyZXR1cm4gJ0lCTTkwNCc7CgoJCQljYXNlICdjcDkwNSc6CgkJCWNhc2UgJ2NzaWJtOTA1JzoKCQkJY2FzZSAnZWJjZGljY3B0cic6CgkJCWNhc2UgJ2libTkwNSc6CgkJCQlyZXR1cm4gJ0lCTTkwNSc7CgoJCQljYXNlICdjcDkxOCc6CgkJCWNhc2UgJ2NzaWJtOTE4JzoKCQkJY2FzZSAnZWJjZGljY3BhcjInOgoJCQljYXNlICdpYm05MTgnOgoJCQkJcmV0dXJuICdJQk05MTgnOwoKCQkJY2FzZSAnY3AxMDI2JzoKCQkJY2FzZSAnY3NpYm0xMDI2JzoKCQkJY2FzZSAnaWJtMTAyNic6CgkJCQlyZXR1cm4gJ0lCTTEwMjYnOwoKCQkJY2FzZSAnaWJtMTA0Nyc6CgkJCWNhc2UgJ2libTEwNDcnOgoJCQkJcmV0dXJuICdJQk0xMDQ3JzsKCgkJCWNhc2UgJ2NzaXNvMTQzaWVjcDI3MSc6CgkJCWNhc2UgJ2llY3AyNzEnOgoJCQljYXNlICdpc29pcjE0Myc6CgkJCQlyZXR1cm4gJ0lFQ19QMjctMSc7CgoJCQljYXNlICdjc2lzbzQ5aW5pcyc6CgkJCWNhc2UgJ2luaXMnOgoJCQljYXNlICdpc29pcjQ5JzoKCQkJCXJldHVybiAnSU5JUyc7CgoJCQljYXNlICdjc2lzbzUwaW5pczgnOgoJCQljYXNlICdpbmlzOCc6CgkJCWNhc2UgJ2lzb2lyNTAnOgoJCQkJcmV0dXJuICdJTklTLTgnOwoKCQkJY2FzZSAnY3Npc281MWluaXNjeXJpbGxpYyc6CgkJCWNhc2UgJ2luaXNjeXJpbGxpYyc6CgkJCWNhc2UgJ2lzb2lyNTEnOgoJCQkJcmV0dXJuICdJTklTLWN5cmlsbGljJzsKCgkJCWNhc2UgJ2NzaW52YXJpYW50JzoKCQkJY2FzZSAnaW52YXJpYW50JzoKCQkJCXJldHVybiAnSU5WQVJJQU5UJzsKCgkJCWNhc2UgJ2lzbzIwMjJjbic6CgkJCQlyZXR1cm4gJ0lTTy0yMDIyLUNOJzsKCgkJCWNhc2UgJ2lzbzIwMjJjbmV4dCc6CgkJCQlyZXR1cm4gJ0lTTy0yMDIyLUNOLUVYVCc7CgoJCQljYXNlICdjc2lzbzIwMjJqcCc6CgkJCWNhc2UgJ2lzbzIwMjJqcCc6CgkJCQlyZXR1cm4gJ0lTTy0yMDIyLUpQJzsKCgkJCWNhc2UgJ2NzaXNvMjAyMmpwMic6CgkJCWNhc2UgJ2lzbzIwMjJqcDInOgoJCQkJcmV0dXJuICdJU08tMjAyMi1KUC0yJzsKCgkJCWNhc2UgJ2NzaXNvMjAyMmtyJzoKCQkJY2FzZSAnaXNvMjAyMmtyJzoKCQkJCXJldHVybiAnSVNPLTIwMjItS1InOwoKCQkJY2FzZSAnY3N3aW5kb3dzMzBsYXRpbjEnOgoJCQljYXNlICdpc284ODU5MXdpbmRvd3MzMGxhdGluMSc6CgkJCQlyZXR1cm4gJ0lTTy04ODU5LTEtV2luZG93cy0zLjAtTGF0aW4tMSc7CgoJCQljYXNlICdjc3dpbmRvd3MzMWxhdGluMSc6CgkJCWNhc2UgJ2lzbzg4NTkxd2luZG93czMxbGF0aW4xJzoKCQkJCXJldHVybiAnSVNPLTg4NTktMS1XaW5kb3dzLTMuMS1MYXRpbi0xJzsKCgkJCWNhc2UgJ2NzaXNvbGF0aW4yJzoKCQkJY2FzZSAnaXNvODg1OTInOgoJCQljYXNlICdpc29pcjEwMSc6CgkJCWNhc2UgJ2lzbzg4NTkyJzoKCQkJY2FzZSAnaXNvODg1OTIxOTg3JzoKCQkJY2FzZSAnbDInOgoJCQljYXNlICdsYXRpbjInOgoJCQkJcmV0dXJuICdJU08tODg1OS0yJzsKCgkJCWNhc2UgJ2Nzd2luZG93czMxbGF0aW4yJzoKCQkJY2FzZSAnaXNvODg1OTJ3aW5kb3dzbGF0aW4yJzoKCQkJCXJldHVybiAnSVNPLTg4NTktMi1XaW5kb3dzLUxhdGluLTInOwoKCQkJY2FzZSAnY3Npc29sYXRpbjMnOgoJCQljYXNlICdpc284ODU5Myc6CgkJCWNhc2UgJ2lzb2lyMTA5JzoKCQkJY2FzZSAnaXNvODg1OTMnOgoJCQljYXNlICdpc284ODU5MzE5ODgnOgoJCQljYXNlICdsMyc6CgkJCWNhc2UgJ2xhdGluMyc6CgkJCQlyZXR1cm4gJ0lTTy04ODU5LTMnOwoKCQkJY2FzZSAnY3Npc29sYXRpbjQnOgoJCQljYXNlICdpc284ODU5NCc6CgkJCWNhc2UgJ2lzb2lyMTEwJzoKCQkJY2FzZSAnaXNvODg1OTQnOgoJCQljYXNlICdpc284ODU5NDE5ODgnOgoJCQljYXNlICdsNCc6CgkJCWNhc2UgJ2xhdGluNCc6CgkJCQlyZXR1cm4gJ0lTTy04ODU5LTQnOwoKCQkJY2FzZSAnY3Npc29sYXRpbmN5cmlsbGljJzoKCQkJY2FzZSAnY3lyaWxsaWMnOgoJCQljYXNlICdpc284ODU5NSc6CgkJCWNhc2UgJ2lzb2lyMTQ0JzoKCQkJY2FzZSAnaXNvODg1OTUnOgoJCQljYXNlICdpc284ODU5NTE5ODgnOgoJCQkJcmV0dXJuICdJU08tODg1OS01JzsKCgkJCWNhc2UgJ2FyYWJpYyc6CgkJCWNhc2UgJ2FzbW83MDgnOgoJCQljYXNlICdjc2lzb2xhdGluYXJhYmljJzoKCQkJY2FzZSAnZWNtYTExNCc6CgkJCWNhc2UgJ2lzbzg4NTk2JzoKCQkJY2FzZSAnaXNvaXIxMjcnOgoJCQljYXNlICdpc284ODU5Nic6CgkJCWNhc2UgJ2lzbzg4NTk2MTk4Nyc6CgkJCQlyZXR1cm4gJ0lTTy04ODU5LTYnOwoKCQkJY2FzZSAnY3Npc284ODU5NmUnOgoJCQljYXNlICdpc284ODU5NmUnOgoJCQljYXNlICdpc284ODU5NmUnOgoJCQkJcmV0dXJuICdJU08tODg1OS02LUUnOwoKCQkJY2FzZSAnY3Npc284ODU5NmknOgoJCQljYXNlICdpc284ODU5NmknOgoJCQljYXNlICdpc284ODU5NmknOgoJCQkJcmV0dXJuICdJU08tODg1OS02LUknOwoKCQkJY2FzZSAnY3Npc29sYXRpbmdyZWVrJzoKCQkJY2FzZSAnZWNtYTExOCc6CgkJCWNhc2UgJ2Vsb3Q5MjgnOgoJCQljYXNlICdncmVlayc6CgkJCWNhc2UgJ2dyZWVrOCc6CgkJCWNhc2UgJ2lzbzg4NTk3JzoKCQkJY2FzZSAnaXNvaXIxMjYnOgoJCQljYXNlICdpc284ODU5Nyc6CgkJCWNhc2UgJ2lzbzg4NTk3MTk4Nyc6CgkJCQlyZXR1cm4gJ0lTTy04ODU5LTcnOwoKCQkJY2FzZSAnY3Npc29sYXRpbmhlYnJldyc6CgkJCWNhc2UgJ2hlYnJldyc6CgkJCWNhc2UgJ2lzbzg4NTk4JzoKCQkJY2FzZSAnaXNvaXIxMzgnOgoJCQljYXNlICdpc284ODU5OCc6CgkJCWNhc2UgJ2lzbzg4NTk4MTk4OCc6CgkJCQlyZXR1cm4gJ0lTTy04ODU5LTgnOwoKCQkJY2FzZSAnY3Npc284ODU5OGUnOgoJCQljYXNlICdpc284ODU5OGUnOgoJCQljYXNlICdpc284ODU5OGUnOgoJCQkJcmV0dXJuICdJU08tODg1OS04LUUnOwoKCQkJY2FzZSAnY3Npc284ODU5OGknOgoJCQljYXNlICdpc284ODU5OGknOgoJCQljYXNlICdpc284ODU5OGknOgoJCQkJcmV0dXJuICdJU08tODg1OS04LUknOwoKCQkJY2FzZSAnY3N3aW5kb3dzMzFsYXRpbjUnOgoJCQljYXNlICdpc284ODU5OXdpbmRvd3NsYXRpbjUnOgoJCQkJcmV0dXJuICdJU08tODg1OS05LVdpbmRvd3MtTGF0aW4tNSc7CgoJCQljYXNlICdjc2lzb2xhdGluNic6CgkJCWNhc2UgJ2lzbzg4NTkxMCc6CgkJCWNhc2UgJ2lzb2lyMTU3JzoKCQkJY2FzZSAnaXNvODg1OTEwMTk5Mic6CgkJCWNhc2UgJ2w2JzoKCQkJY2FzZSAnbGF0aW42JzoKCQkJCXJldHVybiAnSVNPLTg4NTktMTAnOwoKCQkJY2FzZSAnaXNvODg1OTEzJzoKCQkJCXJldHVybiAnSVNPLTg4NTktMTMnOwoKCQkJY2FzZSAnaXNvODg1OTE0JzoKCQkJY2FzZSAnaXNvY2VsdGljJzoKCQkJY2FzZSAnaXNvaXIxOTknOgoJCQljYXNlICdpc284ODU5MTQnOgoJCQljYXNlICdpc284ODU5MTQxOTk4JzoKCQkJY2FzZSAnbDgnOgoJCQljYXNlICdsYXRpbjgnOgoJCQkJcmV0dXJuICdJU08tODg1OS0xNCc7CgoJCQljYXNlICdpc284ODU5MTUnOgoJCQljYXNlICdpc284ODU5MTUnOgoJCQljYXNlICdsYXRpbjknOgoJCQkJcmV0dXJuICdJU08tODg1OS0xNSc7CgoJCQljYXNlICdpc284ODU5MTYnOgoJCQljYXNlICdpc29pcjIyNic6CgkJCWNhc2UgJ2lzbzg4NTkxNic6CgkJCWNhc2UgJ2lzbzg4NTkxNjIwMDEnOgoJCQljYXNlICdsMTAnOgoJCQljYXNlICdsYXRpbjEwJzoKCQkJCXJldHVybiAnSVNPLTg4NTktMTYnOwoKCQkJY2FzZSAnaXNvMTA2NDZqMSc6CgkJCQlyZXR1cm4gJ0lTTy0xMDY0Ni1KLTEnOwoKCQkJY2FzZSAnY3N1bmljb2RlJzoKCQkJY2FzZSAnaXNvMTA2NDZ1Y3MyJzoKCQkJCXJldHVybiAnSVNPLTEwNjQ2LVVDUy0yJzsKCgkJCWNhc2UgJ2NzdWNzNCc6CgkJCWNhc2UgJ2lzbzEwNjQ2dWNzNCc6CgkJCQlyZXR1cm4gJ0lTTy0xMDY0Ni1VQ1MtNCc7CgoJCQljYXNlICdjc3VuaWNvZGVhc2NpaSc6CgkJCWNhc2UgJ2lzbzEwNjQ2dWNzYmFzaWMnOgoJCQkJcmV0dXJuICdJU08tMTA2NDYtVUNTLUJhc2ljJzsKCgkJCWNhc2UgJ2NzdW5pY29kZWxhdGluMSc6CgkJCWNhc2UgJ2lzbzEwNjQ2JzoKCQkJY2FzZSAnaXNvMTA2NDZ1bmljb2RlbGF0aW4xJzoKCQkJCXJldHVybiAnSVNPLTEwNjQ2LVVuaWNvZGUtTGF0aW4xJzsKCgkJCWNhc2UgJ2NzaXNvMTA2NDZ1dGYxJzoKCQkJY2FzZSAnaXNvMTA2NDZ1dGYxJzoKCQkJCXJldHVybiAnSVNPLTEwNjQ2LVVURi0xJzsKCgkJCWNhc2UgJ2NzaXNvMTE1NDgxJzoKCQkJY2FzZSAnaXNvMTE1NDgxJzoKCQkJY2FzZSAnaXNvMTE1NDgxJzoKCQkJY2FzZSAnaXNvdHIxMTU0ODEnOgoJCQkJcmV0dXJuICdJU08tMTE1NDgtMSc7CgoJCQljYXNlICdjc2lzbzkwJzoKCQkJY2FzZSAnaXNvaXI5MCc6CgkJCQlyZXR1cm4gJ2lzby1pci05MCc7CgoJCQljYXNlICdjc3VuaWNvZGVpYm0xMjYxJzoKCQkJY2FzZSAnaXNvdW5pY29kZWlibTEyNjEnOgoJCQkJcmV0dXJuICdJU08tVW5pY29kZS1JQk0tMTI2MSc7CgoJCQljYXNlICdjc3VuaWNvZGVpYm0xMjY0JzoKCQkJY2FzZSAnaXNvdW5pY29kZWlibTEyNjQnOgoJCQkJcmV0dXJuICdJU08tVW5pY29kZS1JQk0tMTI2NCc7CgoJCQljYXNlICdjc3VuaWNvZGVpYm0xMjY1JzoKCQkJY2FzZSAnaXNvdW5pY29kZWlibTEyNjUnOgoJCQkJcmV0dXJuICdJU08tVW5pY29kZS1JQk0tMTI2NSc7CgoJCQljYXNlICdjc3VuaWNvZGVpYm0xMjY4JzoKCQkJY2FzZSAnaXNvdW5pY29kZWlibTEyNjgnOgoJCQkJcmV0dXJuICdJU08tVW5pY29kZS1JQk0tMTI2OCc7CgoJCQljYXNlICdjc3VuaWNvZGVpYm0xMjc2JzoKCQkJY2FzZSAnaXNvdW5pY29kZWlibTEyNzYnOgoJCQkJcmV0dXJuICdJU08tVW5pY29kZS1JQk0tMTI3Nic7CgoJCQljYXNlICdjc2lzbzY0NmJhc2ljMTk4Myc6CgkJCWNhc2UgJ2lzbzY0NmJhc2ljMTk4Myc6CgkJCWNhc2UgJ3JlZic6CgkJCQlyZXR1cm4gJ0lTT182NDYuYmFzaWM6MTk4Myc7CgoJCQljYXNlICdjc2lzbzJpbnRscmVmdmVyc2lvbic6CgkJCWNhc2UgJ2lydic6CgkJCWNhc2UgJ2lzb2lyMic6CgkJCWNhc2UgJ2lzbzY0NmlydjE5ODMnOgoJCQkJcmV0dXJuICdJU09fNjQ2LmlydjoxOTgzJzsKCgkJCWNhc2UgJ2NzaXNvMjAzMyc6CgkJCWNhc2UgJ2UxM2InOgoJCQljYXNlICdpc29pcjk4JzoKCQkJY2FzZSAnaXNvMjAzMzE5ODMnOgoJCQkJcmV0dXJuICdJU09fMjAzMy0xOTgzJzsKCgkJCWNhc2UgJ2NzaXNvNTQyN2N5cmlsbGljJzoKCQkJY2FzZSAnaXNvaXIzNyc6CgkJCWNhc2UgJ2lzbzU0MjcnOgoJCQkJcmV0dXJuICdJU09fNTQyNyc7CgoJCQljYXNlICdpc29pcjU0JzoKCQkJY2FzZSAnaXNvNTQyN2N5cmlsbGljMTk4MSc6CgkJCWNhc2UgJ2lzbzU0MjcxOTgxJzoKCQkJCXJldHVybiAnSVNPXzU0Mjc6MTk4MSc7CgoJCQljYXNlICdjc2lzbzU0MjhncmVlayc6CgkJCWNhc2UgJ2lzb2lyNTUnOgoJCQljYXNlICdpc281NDI4MTk4MCc6CgkJCQlyZXR1cm4gJ0lTT181NDI4OjE5ODAnOwoKCQkJY2FzZSAnY3Npc282OTM3YWRkJzoKCQkJY2FzZSAnaXNvaXIxNTInOgoJCQljYXNlICdpc282OTM3MjI1JzoKCQkJCXJldHVybiAnSVNPXzY5MzctMi0yNSc7CgoJCQljYXNlICdjc2lzb3RleHRjb21tJzoKCQkJY2FzZSAnaXNvaXIxNDInOgoJCQljYXNlICdpc282OTM3MmFkZCc6CgkJCQlyZXR1cm4gJ0lTT182OTM3LTItYWRkJzsKCgkJCWNhc2UgJ2NzaXNvODg1OXN1cHAnOgoJCQljYXNlICdpc29pcjE1NCc6CgkJCWNhc2UgJ2lzbzg4NTlzdXBwJzoKCQkJY2FzZSAnbGF0aW4xMjUnOgoJCQkJcmV0dXJuICdJU09fODg1OS1zdXBwJzsKCgkJCWNhc2UgJ2NzaXNvMTAzNjdib3gnOgoJCQljYXNlICdpc29pcjE1NSc6CgkJCWNhc2UgJ2lzbzEwMzY3Ym94JzoKCQkJCXJldHVybiAnSVNPXzEwMzY3LWJveCc7CgoJCQljYXNlICdjc2lzbzE1aXRhbGlhbic6CgkJCWNhc2UgJ2lzb2lyMTUnOgoJCQljYXNlICdpc282NDZpdCc6CgkJCWNhc2UgJ2l0JzoKCQkJCXJldHVybiAnSVQnOwoKCQkJY2FzZSAnY3Npc28xM2ppc2M2MjIwanAnOgoJCQljYXNlICdpc29pcjEzJzoKCQkJY2FzZSAnamlzYzYyMjAxOTY5JzoKCQkJY2FzZSAnamlzYzYyMjAxOTY5anAnOgoJCQljYXNlICdrYXRha2FuYSc6CgkJCWNhc2UgJ3gwMjAxNyc6CgkJCQlyZXR1cm4gJ0pJU19DNjIyMC0xOTY5LWpwJzsKCgkJCWNhc2UgJ2NzaXNvMTRqaXNjNjIyMHJvJzoKCQkJY2FzZSAnaXNvaXIxNCc6CgkJCWNhc2UgJ2lzbzY0NmpwJzoKCQkJY2FzZSAnamlzYzYyMjAxOTY5cm8nOgoJCQljYXNlICdqcCc6CgkJCQlyZXR1cm4gJ0pJU19DNjIyMC0xOTY5LXJvJzsKCgkJCWNhc2UgJ2NzaXNvNDJqaXNjNjIyNjE5NzgnOgoJCQljYXNlICdpc29pcjQyJzoKCQkJY2FzZSAnamlzYzYyMjYxOTc4JzoKCQkJCXJldHVybiAnSklTX0M2MjI2LTE5NzgnOwoKCQkJY2FzZSAnY3Npc284N2ppc3gwMjA4JzoKCQkJY2FzZSAnaXNvaXI4Nyc6CgkJCWNhc2UgJ2ppc2M2MjI2MTk4Myc6CgkJCWNhc2UgJ2ppc3gwMjA4MTk4Myc6CgkJCWNhc2UgJ3gwMjA4JzoKCQkJCXJldHVybiAnSklTX0M2MjI2LTE5ODMnOwoKCQkJY2FzZSAnY3Npc285MWppc2M2MjI5MTk4NGEnOgoJCQljYXNlICdpc29pcjkxJzoKCQkJY2FzZSAnamlzYzYyMjkxOTg0YSc6CgkJCWNhc2UgJ2pwb2NyYSc6CgkJCQlyZXR1cm4gJ0pJU19DNjIyOS0xOTg0LWEnOwoKCQkJY2FzZSAnY3Npc285Mmppc2M2Mjk5MTk4NGInOgoJCQljYXNlICdpc29pcjkyJzoKCQkJY2FzZSAnaXNvNjQ2anBvY3JiJzoKCQkJY2FzZSAnamlzYzYyMjkxOTg0Yic6CgkJCWNhc2UgJ2pwb2NyYic6CgkJCQlyZXR1cm4gJ0pJU19DNjIyOS0xOTg0LWInOwoKCQkJY2FzZSAnY3Npc285M2ppczYyMjkxOTg0YmFkZCc6CgkJCWNhc2UgJ2lzb2lyOTMnOgoJCQljYXNlICdqaXNjNjIyOTE5ODRiYWRkJzoKCQkJY2FzZSAnanBvY3JiYWRkJzoKCQkJCXJldHVybiAnSklTX0M2MjI5LTE5ODQtYi1hZGQnOwoKCQkJY2FzZSAnY3Npc285NGppczYyMjkxOTg0aGFuZCc6CgkJCWNhc2UgJ2lzb2lyOTQnOgoJCQljYXNlICdqaXNjNjIyOTE5ODRoYW5kJzoKCQkJY2FzZSAnanBvY3JoYW5kJzoKCQkJCXJldHVybiAnSklTX0M2MjI5LTE5ODQtaGFuZCc7CgoJCQljYXNlICdjc2lzbzk1amlzNjIyOTE5ODRoYW5kYWRkJzoKCQkJY2FzZSAnaXNvaXI5NSc6CgkJCWNhc2UgJ2ppc2M2MjI5MTk4NGhhbmRhZGQnOgoJCQljYXNlICdqcG9jcmhhbmRhZGQnOgoJCQkJcmV0dXJuICdKSVNfQzYyMjktMTk4NC1oYW5kLWFkZCc7CgoJCQljYXNlICdjc2lzbzk2amlzYzYyMjkxOTg0a2FuYSc6CgkJCWNhc2UgJ2lzb2lyOTYnOgoJCQljYXNlICdqaXNjNjIyOTE5ODRrYW5hJzoKCQkJCXJldHVybiAnSklTX0M2MjI5LTE5ODQta2FuYSc7CgoJCQljYXNlICdjc2ppc2VuY29kaW5nJzoKCQkJY2FzZSAnamlzZW5jb2RpbmcnOgoJCQkJcmV0dXJuICdKSVNfRW5jb2RpbmcnOwoKCQkJY2FzZSAnY3NoYWxmd2lkdGhrYXRha2FuYSc6CgkJCWNhc2UgJ2ppc3gwMjAxJzoKCQkJY2FzZSAneDAyMDEnOgoJCQkJcmV0dXJuICdKSVNfWDAyMDEnOwoKCQkJY2FzZSAnY3Npc28xNTlqaXN4MDIxMjE5OTAnOgoJCQljYXNlICdpc29pcjE1OSc6CgkJCWNhc2UgJ2ppc3gwMjEyMTk5MCc6CgkJCWNhc2UgJ3gwMjEyJzoKCQkJCXJldHVybiAnSklTX1gwMjEyLTE5OTAnOwoKCQkJY2FzZSAnY3Npc28xNDFqdXNpYjEwMDInOgoJCQljYXNlICdpc29pcjE0MSc6CgkJCWNhc2UgJ2lzbzY0Nnl1JzoKCQkJY2FzZSAnanMnOgoJCQljYXNlICdqdXNpYjEwMDInOgoJCQljYXNlICd5dSc6CgkJCQlyZXR1cm4gJ0pVU19JLkIxLjAwMic7CgoJCQljYXNlICdjc2lzbzE0N21hY2Vkb25pYW4nOgoJCQljYXNlICdpc29pcjE0Nyc6CgkJCWNhc2UgJ2p1c2liMTAwM21hYyc6CgkJCWNhc2UgJ21hY2Vkb25pYW4nOgoJCQkJcmV0dXJuICdKVVNfSS5CMS4wMDMtbWFjJzsKCgkJCWNhc2UgJ2NzaXNvMTQ2c2VyYmlhbic6CgkJCWNhc2UgJ2lzb2lyMTQ2JzoKCQkJY2FzZSAnanVzaWIxMDAzc2VyYic6CgkJCWNhc2UgJ3NlcmJpYW4nOgoJCQkJcmV0dXJuICdKVVNfSS5CMS4wMDMtc2VyYic7CgoJCQljYXNlICdrb2k3c3dpdGNoZWQnOgoJCQkJcmV0dXJuICdLT0k3LXN3aXRjaGVkJzsKCgkJCWNhc2UgJ2Nza29pOHInOgoJCQljYXNlICdrb2k4cic6CgkJCQlyZXR1cm4gJ0tPSTgtUic7CgoJCQljYXNlICdrb2k4dSc6CgkJCQlyZXR1cm4gJ0tPSTgtVSc7CgoJCQljYXNlICdjc2tzYzU2MzYnOgoJCQljYXNlICdpc282NDZrcic6CgkJCWNhc2UgJ2tzYzU2MzYnOgoJCQkJcmV0dXJuICdLU0M1NjM2JzsKCgkJCWNhc2UgJ2Nza3oxMDQ4JzoKCQkJY2FzZSAna3oxMDQ4JzoKCQkJY2FzZSAncmsxMDQ4JzoKCQkJY2FzZSAnc3RyazEwNDgyMDAyJzoKCQkJCXJldHVybiAnS1otMTA0OCc7CgoJCQljYXNlICdjc2lzbzE5bGF0aW5ncmVlayc6CgkJCWNhc2UgJ2lzb2lyMTknOgoJCQljYXNlICdsYXRpbmdyZWVrJzoKCQkJCXJldHVybiAnbGF0aW4tZ3JlZWsnOwoKCQkJY2FzZSAnY3Npc28yN2xhdGluZ3JlZWsxJzoKCQkJY2FzZSAnaXNvaXIyNyc6CgkJCWNhc2UgJ2xhdGluZ3JlZWsxJzoKCQkJCXJldHVybiAnTGF0aW4tZ3JlZWstMSc7CgoJCQljYXNlICdjc2lzbzE1OGxhcCc6CgkJCWNhc2UgJ2lzb2lyMTU4JzoKCQkJY2FzZSAnbGFwJzoKCQkJY2FzZSAnbGF0aW5sYXAnOgoJCQkJcmV0dXJuICdsYXRpbi1sYXAnOwoKCQkJY2FzZSAnY3NtYWNpbnRvc2gnOgoJCQljYXNlICdtYWMnOgoJCQljYXNlICdtYWNpbnRvc2gnOgoJCQkJcmV0dXJuICdtYWNpbnRvc2gnOwoKCQkJY2FzZSAnY3NtaWNyb3NvZnRwdWJsaXNoaW5nJzoKCQkJY2FzZSAnbWljcm9zb2Z0cHVibGlzaGluZyc6CgkJCQlyZXR1cm4gJ01pY3Jvc29mdC1QdWJsaXNoaW5nJzsKCgkJCWNhc2UgJ2NzbW5lbSc6CgkJCWNhc2UgJ21uZW0nOgoJCQkJcmV0dXJuICdNTkVNJzsKCgkJCWNhc2UgJ2NzbW5lbW9uaWMnOgoJCQljYXNlICdtbmVtb25pYyc6CgkJCQlyZXR1cm4gJ01ORU1PTklDJzsKCgkJCWNhc2UgJ2NzaXNvODZodW5nYXJpYW4nOgoJCQljYXNlICdodSc6CgkJCWNhc2UgJ2lzb2lyODYnOgoJCQljYXNlICdpc282NDZodSc6CgkJCWNhc2UgJ21zejc3OTUzJzoKCQkJCXJldHVybiAnTVNaXzc3OTUuMyc7CgoJCQljYXNlICdjc25hdHNkYW5vJzoKCQkJY2FzZSAnaXNvaXI5MSc6CgkJCWNhc2UgJ25hdHNkYW5vJzoKCQkJCXJldHVybiAnTkFUUy1EQU5PJzsKCgkJCWNhc2UgJ2NzbmF0c2Rhbm9hZGQnOgoJCQljYXNlICdpc29pcjkyJzoKCQkJY2FzZSAnbmF0c2Rhbm9hZGQnOgoJCQkJcmV0dXJuICdOQVRTLURBTk8tQUREJzsKCgkJCWNhc2UgJ2NzbmF0c3NlZmknOgoJCQljYXNlICdpc29pcjgxJzoKCQkJY2FzZSAnbmF0c3NlZmknOgoJCQkJcmV0dXJuICdOQVRTLVNFRkknOwoKCQkJY2FzZSAnY3NuYXRzc2VmaWFkZCc6CgkJCWNhc2UgJ2lzb2lyODInOgoJCQljYXNlICduYXRzc2VmaWFkZCc6CgkJCQlyZXR1cm4gJ05BVFMtU0VGSS1BREQnOwoKCQkJY2FzZSAnY3Npc28xNTFjdWJhJzoKCQkJY2FzZSAnY3ViYSc6CgkJCWNhc2UgJ2lzb2lyMTUxJzoKCQkJY2FzZSAnaXNvNjQ2Y3UnOgoJCQljYXNlICduY25jMDAxMDgxJzoKCQkJCXJldHVybiAnTkNfTkMwMC0xMDo4MSc7CgoJCQljYXNlICdjc2lzbzY5ZnJlbmNoJzoKCQkJY2FzZSAnZnInOgoJCQljYXNlICdpc29pcjY5JzoKCQkJY2FzZSAnaXNvNjQ2ZnInOgoJCQljYXNlICduZno2MjAxMCc6CgkJCQlyZXR1cm4gJ05GX1pfNjItMDEwJzsKCgkJCWNhc2UgJ2NzaXNvMjVmcmVuY2gnOgoJCQljYXNlICdpc29pcjI1JzoKCQkJY2FzZSAnaXNvNjQ2ZnIxJzoKCQkJY2FzZSAnbmZ6NjIwMTAxOTczJzoKCQkJCXJldHVybiAnTkZfWl82Mi0wMTBfKDE5NzMpJzsKCgkJCWNhc2UgJ2NzaXNvNjBkYW5pc2hub3J3ZWdpYW4nOgoJCQljYXNlICdjc2lzbzYwbm9yd2VnaWFuMSc6CgkJCWNhc2UgJ2lzb2lyNjAnOgoJCQljYXNlICdpc282NDZubyc6CgkJCWNhc2UgJ25vJzoKCQkJY2FzZSAnbnM0NTUxMSc6CgkJCQlyZXR1cm4gJ05TXzQ1NTEtMSc7CgoJCQljYXNlICdjc2lzbzYxbm9yd2VnaWFuMic6CgkJCWNhc2UgJ2lzb2lyNjEnOgoJCQljYXNlICdpc282NDZubzInOgoJCQljYXNlICdubzInOgoJCQljYXNlICduczQ1NTEyJzoKCQkJCXJldHVybiAnTlNfNDU1MS0yJzsKCgkJCWNhc2UgJ29zZGViY2RpY2RmMDNpcnYnOgoJCQkJcmV0dXJuICdPU0RfRUJDRElDX0RGMDNfSVJWJzsKCgkJCWNhc2UgJ29zZGViY2RpY2RmMDQxJzoKCQkJCXJldHVybiAnT1NEX0VCQ0RJQ19ERjA0XzEnOwoKCQkJY2FzZSAnb3NkZWJjZGljZGYwNDE1JzoKCQkJCXJldHVybiAnT1NEX0VCQ0RJQ19ERjA0XzE1JzsKCgkJCWNhc2UgJ2NzcGM4ZGFuaXNobm9yd2VnaWFuJzoKCQkJY2FzZSAncGM4ZGFuaXNobm9yd2VnaWFuJzoKCQkJCXJldHVybiAnUEM4LURhbmlzaC1Ob3J3ZWdpYW4nOwoKCQkJY2FzZSAnY3NwYzh0dXJraXNoJzoKCQkJY2FzZSAncGM4dHVya2lzaCc6CgkJCQlyZXR1cm4gJ1BDOC1UdXJraXNoJzsKCgkJCWNhc2UgJ2NzaXNvMTZwb3J0dWd1ZXNlJzoKCQkJY2FzZSAnaXNvaXIxNic6CgkJCWNhc2UgJ2lzbzY0NnB0JzoKCQkJY2FzZSAncHQnOgoJCQkJcmV0dXJuICdQVCc7CgoJCQljYXNlICdjc2lzbzg0cG9ydHVndWVzZTInOgoJCQljYXNlICdpc29pcjg0JzoKCQkJY2FzZSAnaXNvNjQ2cHQyJzoKCQkJY2FzZSAncHQyJzoKCQkJCXJldHVybiAnUFQyJzsKCgkJCWNhc2UgJ2NwMTU0JzoKCQkJY2FzZSAnY3NwdGNwMTU0JzoKCQkJY2FzZSAnY3lyaWxsaWNhc2lhbic6CgkJCWNhc2UgJ3B0MTU0JzoKCQkJY2FzZSAncHRjcDE1NCc6CgkJCQlyZXR1cm4gJ1BUQ1AxNTQnOwoKCQkJY2FzZSAnc2NzdSc6CgkJCQlyZXR1cm4gJ1NDU1UnOwoKCQkJY2FzZSAnY3Npc28xMHN3ZWRpc2gnOgoJCQljYXNlICdmaSc6CgkJCWNhc2UgJ2lzb2lyMTAnOgoJCQljYXNlICdpc282NDZmaSc6CgkJCWNhc2UgJ2lzbzY0NnNlJzoKCQkJY2FzZSAnc2UnOgoJCQljYXNlICdzZW44NTAyMDBiJzoKCQkJCXJldHVybiAnU0VOXzg1MDIwMF9CJzsKCgkJCWNhc2UgJ2NzaXNvMTFzd2VkaXNoZm9ybmFtZXMnOgoJCQljYXNlICdpc29pcjExJzoKCQkJY2FzZSAnaXNvNjQ2c2UyJzoKCQkJY2FzZSAnc2UyJzoKCQkJY2FzZSAnc2VuODUwMjAwYyc6CgkJCQlyZXR1cm4gJ1NFTl84NTAyMDBfQyc7CgoJCQljYXNlICdjc3NoaWZ0amlzJzoKCQkJY2FzZSAnbXNrYW5qaSc6CgkJCWNhc2UgJ3NoaWZ0amlzJzoKCQkJCXJldHVybiAnU2hpZnRfSklTJzsKCgkJCWNhc2UgJ2NzaXNvMTAydDYxN2JpdCc6CgkJCWNhc2UgJ2lzb2lyMTAyJzoKCQkJY2FzZSAndDYxN2JpdCc6CgkJCQlyZXR1cm4gJ1QuNjEtN2JpdCc7CgoJCQljYXNlICdjc2lzbzEwM3Q2MThiaXQnOgoJCQljYXNlICdpc29pcjEwMyc6CgkJCWNhc2UgJ3Q2MSc6CgkJCWNhc2UgJ3Q2MThiaXQnOgoJCQkJcmV0dXJuICdULjYxLThiaXQnOwoKCQkJY2FzZSAnY3Npc28xMjh0MTAxZzInOgoJCQljYXNlICdpc29pcjEyOCc6CgkJCWNhc2UgJ3QxMDFnMic6CgkJCQlyZXR1cm4gJ1QuMTAxLUcyJzsKCgkJCWNhc2UgJ2NzdHNjaWknOgoJCQljYXNlICd0c2NpaSc6CgkJCQlyZXR1cm4gJ1RTQ0lJJzsKCgkJCWNhc2UgJ2NzdW5pY29kZTExJzoKCQkJY2FzZSAndW5pY29kZTExJzoKCQkJCXJldHVybiAnVU5JQ09ERS0xLTEnOwoKCQkJY2FzZSAnY3N1bmljb2RlMTF1dGY3JzoKCQkJY2FzZSAndW5pY29kZTExdXRmNyc6CgkJCQlyZXR1cm4gJ1VOSUNPREUtMS0xLVVURi03JzsKCgkJCWNhc2UgJ2NzdW5rbm93bjhiaXQnOgoJCQljYXNlICd1bmtub3duOGJpdCc6CgkJCQlyZXR1cm4gJ1VOS05PV04tOEJJVCc7CgoJCQljYXNlICdhbnNpeDM0MTk2OCc6CgkJCWNhc2UgJ2Fuc2l4MzQxOTg2JzoKCQkJY2FzZSAnYXNjaWknOgoJCQljYXNlICdjcDM2Nyc6CgkJCWNhc2UgJ2NzYXNjaWknOgoJCQljYXNlICdpYm0zNjcnOgoJCQljYXNlICdpc29pcjYnOgoJCQljYXNlICdpc282NDZ1cyc6CgkJCWNhc2UgJ2lzbzY0NmlydjE5OTEnOgoJCQljYXNlICd1cyc6CgkJCWNhc2UgJ3VzYXNjaWknOgoJCQkJcmV0dXJuICdVUy1BU0NJSSc7CgoJCQljYXNlICdjc3VzZGsnOgoJCQljYXNlICd1c2RrJzoKCQkJCXJldHVybiAndXMtZGsnOwoKCQkJY2FzZSAndXRmNyc6CgkJCQlyZXR1cm4gJ1VURi03JzsKCgkJCWNhc2UgJ3V0ZjgnOgoJCQkJcmV0dXJuICdVVEYtOCc7CgoJCQljYXNlICd1dGYxNic6CgkJCQlyZXR1cm4gJ1VURi0xNic7CgoJCQljYXNlICd1dGYxNmJlJzoKCQkJCXJldHVybiAnVVRGLTE2QkUnOwoKCQkJY2FzZSAndXRmMTZsZSc6CgkJCQlyZXR1cm4gJ1VURi0xNkxFJzsKCgkJCWNhc2UgJ3V0ZjMyJzoKCQkJCXJldHVybiAnVVRGLTMyJzsKCgkJCWNhc2UgJ3V0ZjMyYmUnOgoJCQkJcmV0dXJuICdVVEYtMzJCRSc7CgoJCQljYXNlICd1dGYzMmxlJzoKCQkJCXJldHVybiAnVVRGLTMyTEUnOwoKCQkJY2FzZSAnY3N2ZW50dXJhaW50ZXJuYXRpb25hbCc6CgkJCWNhc2UgJ3ZlbnR1cmFpbnRlcm5hdGlvbmFsJzoKCQkJCXJldHVybiAnVmVudHVyYS1JbnRlcm5hdGlvbmFsJzsKCgkJCWNhc2UgJ2NzdmVudHVyYW1hdGgnOgoJCQljYXNlICd2ZW50dXJhbWF0aCc6CgkJCQlyZXR1cm4gJ1ZlbnR1cmEtTWF0aCc7CgoJCQljYXNlICdjc3ZlbnR1cmF1cyc6CgkJCWNhc2UgJ3ZlbnR1cmF1cyc6CgkJCQlyZXR1cm4gJ1ZlbnR1cmEtVVMnOwoKCQkJY2FzZSAnY3Npc283MHZpZGVvdGV4c3VwcDEnOgoJCQljYXNlICdpc29pcjcwJzoKCQkJY2FzZSAndmlkZW90ZXhzdXBwbCc6CgkJCQlyZXR1cm4gJ3ZpZGVvdGV4LXN1cHBsJzsKCgkJCWNhc2UgJ2Nzdmlxcic6CgkJCWNhc2UgJ3ZpcXInOgoJCQkJcmV0dXJuICdWSVFSJzsKCgkJCWNhc2UgJ2NzdmlzY2lpJzoKCQkJY2FzZSAndmlzY2lpJzoKCQkJCXJldHVybiAnVklTQ0lJJzsKCgkJCWNhc2UgJ2Nzd2luZG93czMxaic6CgkJCWNhc2UgJ3dpbmRvd3MzMWonOgoJCQkJcmV0dXJuICdXaW5kb3dzLTMxSic7CgoJCQljYXNlICdpc284ODU5MTEnOgoJCQljYXNlICd0aXM2MjAnOgoJCQkJcmV0dXJuICdXaW5kb3dzLTg3NCc7CgoJCQljYXNlICdjc2V1Y2tyJzoKCQkJY2FzZSAnZXVja3InOgoJCQljYXNlICd3aW5kb3dzOTQ5JzoKCQkJY2FzZSAnY3Nrc2M1NjAxMTk4Nyc6CgkJCWNhc2UgJ2lzb2lyMTQ5JzoKCQkJY2FzZSAna29yZWFuJzoKCQkJY2FzZSAna3NjNTYwMSc6CgkJCWNhc2UgJ2tzYzU2MDExOTg3JzoKCQkJY2FzZSAna3NjNTYwMTE5ODknOgoJCQkJcmV0dXJuICdXaW5kb3dzLTk0OSc7CgoJCQljYXNlICd3aW5kb3dzMTI1MCc6CgkJCQlyZXR1cm4gJ3dpbmRvd3MtMTI1MCc7CgoJCQljYXNlICd3aW5kb3dzMTI1MSc6CgkJCQlyZXR1cm4gJ3dpbmRvd3MtMTI1MSc7CgoJCQljYXNlICdjcDgxOSc6CgkJCWNhc2UgJ2NzaXNvbGF0aW4xJzoKCQkJY2FzZSAnaWJtODE5JzoKCQkJY2FzZSAnaXNvODg1OTEnOgoJCQljYXNlICdpc29pcjEwMCc6CgkJCWNhc2UgJ2lzbzg4NTkxMTk4Nyc6CgkJCWNhc2UgJ2wxJzoKCQkJY2FzZSAnbGF0aW4xJzoKCQkJY2FzZSAnd2luZG93czEyNTInOgoJCQkJcmV0dXJuICdXaW5kb3dzLTEyNTInOwoKCQkJY2FzZSAnd2luZG93czEyNTInOgoJCQkJcmV0dXJuICd3aW5kb3dzLTEyNTInOwoKCQkJY2FzZSAnd2luZG93czEyNTMnOgoJCQkJcmV0dXJuICd3aW5kb3dzLTEyNTMnOwoKCQkJY2FzZSAnY3Npc29sYXRpbjUnOgoJCQljYXNlICdpc284ODU5OSc6CgkJCWNhc2UgJ2lzb2lyMTQ4JzoKCQkJY2FzZSAnaXNvODg1OTkxOTg5JzoKCQkJY2FzZSAnbDUnOgoJCQljYXNlICdsYXRpbjUnOgoJCQljYXNlICd3aW5kb3dzMTI1NCc6CgkJCQlyZXR1cm4gJ1dpbmRvd3MtMTI1NCc7CgoJCQljYXNlICd3aW5kb3dzMTI1NCc6CgkJCQlyZXR1cm4gJ3dpbmRvd3MtMTI1NCc7CgoJCQljYXNlICd3aW5kb3dzMTI1NSc6CgkJCQlyZXR1cm4gJ3dpbmRvd3MtMTI1NSc7CgoJCQljYXNlICd3aW5kb3dzMTI1Nic6CgkJCQlyZXR1cm4gJ3dpbmRvd3MtMTI1Nic7CgoJCQljYXNlICd3aW5kb3dzMTI1Nyc6CgkJCQlyZXR1cm4gJ3dpbmRvd3MtMTI1Nyc7CgoJCQljYXNlICd3aW5kb3dzMTI1OCc6CgkJCQlyZXR1cm4gJ3dpbmRvd3MtMTI1OCc7CgoJCQlkZWZhdWx0OgoJCQkJcmV0dXJuICRjaGFyc2V0OwoJCX0KCX0KCglmdW5jdGlvbiBnZXRfY3VybF92ZXJzaW9uKCkKCXsKCQlpZiAoaXNfYXJyYXkoJGN1cmwgPSBjdXJsX3ZlcnNpb24oKSkpCgkJewoJCQkkY3VybCA9ICRjdXJsWyd2ZXJzaW9uJ107CgkJfQoJCWVsc2VpZiAoc3Vic3RyKCRjdXJsLCAwLCA1KSA9PSAnY3VybC8nKQoJCXsKCQkJJGN1cmwgPSBzdWJzdHIoJGN1cmwsIDUsIHN0cmNzcG4oJGN1cmwsICJceDA5XHgwQVx4MEJceDBDXHgwRCIsIDUpKTsKCQl9CgkJZWxzZWlmIChzdWJzdHIoJGN1cmwsIDAsIDgpID09ICdsaWJjdXJsLycpCgkJewoJCQkkY3VybCA9IHN1YnN0cigkY3VybCwgOCwgc3RyY3NwbigkY3VybCwgIlx4MDlceDBBXHgwQlx4MENceDBEIiwgOCkpOwoJCX0KCQllbHNlCgkJewoJCQkkY3VybCA9IDA7CgkJfQoJCXJldHVybiAkY3VybDsKCX0KCglmdW5jdGlvbiBpc19zdWJjbGFzc19vZigkY2xhc3MxLCAkY2xhc3MyKQoJewoJCWlmIChmdW5jX251bV9hcmdzKCkgIT0gMikKCQl7CgkJCXRyaWdnZXJfZXJyb3IoJ1dyb25nIHBhcmFtZXRlciBjb3VudCBmb3IgU2ltcGxlUGllX01pc2M6OmlzX3N1YmNsYXNzX29mKCknLCBFX1VTRVJfV0FSTklORyk7CgkJfQoJCWVsc2VpZiAodmVyc2lvbl9jb21wYXJlKFBIUF9WRVJTSU9OLCAnNS4wLjMnLCAnPj0nKSB8fCBpc19vYmplY3QoJGNsYXNzMSkpCgkJewoJCQlyZXR1cm4gaXNfc3ViY2xhc3Nfb2YoJGNsYXNzMSwgJGNsYXNzMik7CgkJfQoJCWVsc2VpZiAoaXNfc3RyaW5nKCRjbGFzczEpICYmIGlzX3N0cmluZygkY2xhc3MyKSkKCQl7CgkJCWlmIChjbGFzc19leGlzdHMoJGNsYXNzMSkpCgkJCXsKCQkJCWlmIChjbGFzc19leGlzdHMoJGNsYXNzMikpCgkJCQl7CgkJCQkJJGNsYXNzMiA9IHN0cnRvbG93ZXIoJGNsYXNzMik7CgkJCQkJd2hpbGUgKCRjbGFzczEgPSBzdHJ0b2xvd2VyKGdldF9wYXJlbnRfY2xhc3MoJGNsYXNzMSkpKQoJCQkJCXsKCQkJCQkJaWYgKCRjbGFzczEgPT0gJGNsYXNzMikKCQkJCQkJewoJCQkJCQkJcmV0dXJuIHRydWU7CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQl0cmlnZ2VyX2Vycm9yKCdVbmtub3duIGNsYXNzIHBhc3NlZCBhcyBwYXJhbWV0ZXInLCBFX1VTRVJfV0FSTk5HKTsKCQkJfQoJCX0KCQlyZXR1cm4gZmFsc2U7Cgl9CgoJLyoqCgkgKiBTdHJpcCBIVE1MIGNvbW1lbnRzCgkgKgoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEBwYXJhbSBzdHJpbmcgJGRhdGEgRGF0YSB0byBzdHJpcCBjb21tZW50cyBmcm9tCgkgKiBAcmV0dXJuIHN0cmluZyBDb21tZW50IHN0cmlwcGVkIHN0cmluZwoJICovCglmdW5jdGlvbiBzdHJpcF9jb21tZW50cygkZGF0YSkKCXsKCQkkb3V0cHV0ID0gJyc7CgkJd2hpbGUgKCgkc3RhcnQgPSBzdHJwb3MoJGRhdGEsICc8IS0tJykpICE9PSBmYWxzZSkKCQl7CgkJCSRvdXRwdXQgLj0gc3Vic3RyKCRkYXRhLCAwLCAkc3RhcnQpOwoJCQlpZiAoKCRlbmQgPSBzdHJwb3MoJGRhdGEsICctLT4nLCAkc3RhcnQpKSAhPT0gZmFsc2UpCgkJCXsKCQkJCSRkYXRhID0gc3Vic3RyX3JlcGxhY2UoJGRhdGEsICcnLCAwLCAkZW5kICsgMyk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQkkZGF0YSA9ICcnOwoJCQl9CgkJfQoJCXJldHVybiAkb3V0cHV0IC4gJGRhdGE7Cgl9CgoJZnVuY3Rpb24gcGFyc2VfZGF0ZSgkZHQpCgl7CgkJJHBhcnNlciA9IFNpbXBsZVBpZV9QYXJzZV9EYXRlOjpnZXQoKTsKCQlyZXR1cm4gJHBhcnNlci0+cGFyc2UoJGR0KTsKCX0KCgkvKioKCSAqIERlY29kZSBIVE1MIGVudGl0aWVzCgkgKgoJICogQHN0YXRpYwoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEBwYXJhbSBzdHJpbmcgJGRhdGEgSW5wdXQgZGF0YQoJICogQHJldHVybiBzdHJpbmcgT3V0cHV0IGRhdGEKCSAqLwoJZnVuY3Rpb24gZW50aXRpZXNfZGVjb2RlKCRkYXRhKQoJewoJCSRkZWNvZGVyID0gbmV3IFNpbXBsZVBpZV9EZWNvZGVfSFRNTF9FbnRpdGllcygkZGF0YSk7CgkJcmV0dXJuICRkZWNvZGVyLT5wYXJzZSgpOwoJfQoKCS8qKgoJICogUmVtb3ZlIFJGQzgyMiBjb21tZW50cwoJICoKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAcGFyYW0gc3RyaW5nICRkYXRhIERhdGEgdG8gc3RyaXAgY29tbWVudHMgZnJvbQoJICogQHJldHVybiBzdHJpbmcgQ29tbWVudCBzdHJpcHBlZCBzdHJpbmcKCSAqLwoJZnVuY3Rpb24gdW5jb21tZW50X3JmYzgyMigkc3RyaW5nKQoJewoJCSRzdHJpbmcgPSAoc3RyaW5nKSAkc3RyaW5nOwoJCSRwb3NpdGlvbiA9IDA7CgkJJGxlbmd0aCA9IHN0cmxlbigkc3RyaW5nKTsKCQkkZGVwdGggPSAwOwoKCQkkb3V0cHV0ID0gJyc7CgoJCXdoaWxlICgkcG9zaXRpb24gPCAkbGVuZ3RoICYmICgkcG9zID0gc3RycG9zKCRzdHJpbmcsICcoJywgJHBvc2l0aW9uKSkgIT09IGZhbHNlKQoJCXsKCQkJJG91dHB1dCAuPSBzdWJzdHIoJHN0cmluZywgJHBvc2l0aW9uLCAkcG9zIC0gJHBvc2l0aW9uKTsKCQkJJHBvc2l0aW9uID0gJHBvcyArIDE7CgkJCWlmICgkc3RyaW5nWyRwb3MgLSAxXSAhPT0gJ1xcJykKCQkJewoJCQkJJGRlcHRoKys7CgkJCQl3aGlsZSAoJGRlcHRoICYmICRwb3NpdGlvbiA8ICRsZW5ndGgpCgkJCQl7CgkJCQkJJHBvc2l0aW9uICs9IHN0cmNzcG4oJHN0cmluZywgJygpJywgJHBvc2l0aW9uKTsKCQkJCQlpZiAoJHN0cmluZ1skcG9zaXRpb24gLSAxXSA9PT0gJ1xcJykKCQkJCQl7CgkJCQkJCSRwb3NpdGlvbisrOwoJCQkJCQljb250aW51ZTsKCQkJCQl9CgkJCQkJZWxzZWlmIChpc3NldCgkc3RyaW5nWyRwb3NpdGlvbl0pKQoJCQkJCXsKCQkJCQkJc3dpdGNoICgkc3RyaW5nWyRwb3NpdGlvbl0pCgkJCQkJCXsKCQkJCQkJCWNhc2UgJygnOgoJCQkJCQkJCSRkZXB0aCsrOwoJCQkJCQkJCWJyZWFrOwoKCQkJCQkJCWNhc2UgJyknOgoJCQkJCQkJCSRkZXB0aC0tOwoJCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJCSRwb3NpdGlvbisrOwoJCQkJCX0KCQkJCQllbHNlCgkJCQkJewoJCQkJCQlicmVhazsKCQkJCQl9CgkJCQl9CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQkkb3V0cHV0IC49ICcoJzsKCQkJfQoJCX0KCQkkb3V0cHV0IC49IHN1YnN0cigkc3RyaW5nLCAkcG9zaXRpb24pOwoKCQlyZXR1cm4gJG91dHB1dDsKCX0KCglmdW5jdGlvbiBwYXJzZV9taW1lKCRtaW1lKQoJewoJCWlmICgoJHBvcyA9IHN0cnBvcygkbWltZSwgJzsnKSkgPT09IGZhbHNlKQoJCXsKCQkJcmV0dXJuIHRyaW0oJG1pbWUpOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gdHJpbShzdWJzdHIoJG1pbWUsIDAsICRwb3MpKTsKCQl9Cgl9CgoJZnVuY3Rpb24gaHRtbHNwZWNpYWxjaGFyc19kZWNvZGUoJHN0cmluZywgJHF1b3RlX3N0eWxlKQoJewoJCWlmIChmdW5jdGlvbl9leGlzdHMoJ2h0bWxzcGVjaWFsY2hhcnNfZGVjb2RlJykpCgkJewoJCQlyZXR1cm4gaHRtbHNwZWNpYWxjaGFyc19kZWNvZGUoJHN0cmluZywgJHF1b3RlX3N0eWxlKTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIHN0cnRyKCRzdHJpbmcsIGFycmF5X2ZsaXAoZ2V0X2h0bWxfdHJhbnNsYXRpb25fdGFibGUoSFRNTF9TUEVDSUFMQ0hBUlMsICRxdW90ZV9zdHlsZSkpKTsKCQl9Cgl9CgoJZnVuY3Rpb24gYXRvbV8wM19jb25zdHJ1Y3RfdHlwZSgkYXR0cmlicykKCXsKCQlpZiAoaXNzZXQoJGF0dHJpYnNbJyddWydtb2RlJ10pICYmIHN0cnRvbG93ZXIodHJpbSgkYXR0cmlic1snJ11bJ21vZGUnXSkgPT0gJ2Jhc2U2NCcpKQoJCXsKCQkJJG1vZGUgPSBTSU1QTEVQSUVfQ09OU1RSVUNUX0JBU0U2NDsKCQl9CgkJZWxzZQoJCXsKCQkJJG1vZGUgPSBTSU1QTEVQSUVfQ09OU1RSVUNUX05PTkU7CgkJfQoJCWlmIChpc3NldCgkYXR0cmlic1snJ11bJ3R5cGUnXSkpCgkJewoJCQlzd2l0Y2ggKHN0cnRvbG93ZXIodHJpbSgkYXR0cmlic1snJ11bJ3R5cGUnXSkpKQoJCQl7CgkJCQljYXNlICd0ZXh0JzoKCQkJCWNhc2UgJ3RleHQvcGxhaW4nOgoJCQkJCXJldHVybiBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQgfCAkbW9kZTsKCgkJCQljYXNlICdodG1sJzoKCQkJCWNhc2UgJ3RleHQvaHRtbCc6CgkJCQkJcmV0dXJuIFNJTVBMRVBJRV9DT05TVFJVQ1RfSFRNTCB8ICRtb2RlOwoKCQkJCWNhc2UgJ3hodG1sJzoKCQkJCWNhc2UgJ2FwcGxpY2F0aW9uL3hodG1sK3htbCc6CgkJCQkJcmV0dXJuIFNJTVBMRVBJRV9DT05TVFJVQ1RfWEhUTUwgfCAkbW9kZTsKCgkJCQlkZWZhdWx0OgoJCQkJCXJldHVybiBTSU1QTEVQSUVfQ09OU1RSVUNUX05PTkUgfCAkbW9kZTsKCQkJfQoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gU0lNUExFUElFX0NPTlNUUlVDVF9URVhUIHwgJG1vZGU7CgkJfQoJfQoKCWZ1bmN0aW9uIGF0b21fMTBfY29uc3RydWN0X3R5cGUoJGF0dHJpYnMpCgl7CgkJaWYgKGlzc2V0KCRhdHRyaWJzWycnXVsndHlwZSddKSkKCQl7CgkJCXN3aXRjaCAoc3RydG9sb3dlcih0cmltKCRhdHRyaWJzWycnXVsndHlwZSddKSkpCgkJCXsKCQkJCWNhc2UgJ3RleHQnOgoJCQkJCXJldHVybiBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQ7CgoJCQkJY2FzZSAnaHRtbCc6CgkJCQkJcmV0dXJuIFNJTVBMRVBJRV9DT05TVFJVQ1RfSFRNTDsKCgkJCQljYXNlICd4aHRtbCc6CgkJCQkJcmV0dXJuIFNJTVBMRVBJRV9DT05TVFJVQ1RfWEhUTUw7CgoJCQkJZGVmYXVsdDoKCQkJCQlyZXR1cm4gU0lNUExFUElFX0NPTlNUUlVDVF9OT05FOwoJCQl9CgkJfQoJCXJldHVybiBTSU1QTEVQSUVfQ09OU1RSVUNUX1RFWFQ7Cgl9CgoJZnVuY3Rpb24gYXRvbV8xMF9jb250ZW50X2NvbnN0cnVjdF90eXBlKCRhdHRyaWJzKQoJewoJCWlmIChpc3NldCgkYXR0cmlic1snJ11bJ3R5cGUnXSkpCgkJewoJCQkkdHlwZSA9IHN0cnRvbG93ZXIodHJpbSgkYXR0cmlic1snJ11bJ3R5cGUnXSkpOwoJCQlzd2l0Y2ggKCR0eXBlKQoJCQl7CgkJCQljYXNlICd0ZXh0JzoKCQkJCQlyZXR1cm4gU0lNUExFUElFX0NPTlNUUlVDVF9URVhUOwoKCQkJCWNhc2UgJ2h0bWwnOgoJCQkJCXJldHVybiBTSU1QTEVQSUVfQ09OU1RSVUNUX0hUTUw7CgoJCQkJY2FzZSAneGh0bWwnOgoJCQkJCXJldHVybiBTSU1QTEVQSUVfQ09OU1RSVUNUX1hIVE1MOwoJCQl9CgkJCWlmIChpbl9hcnJheShzdWJzdHIoJHR5cGUsIC00KSwgYXJyYXkoJyt4bWwnLCAnL3htbCcpKSB8fCBzdWJzdHIoJHR5cGUsIDAsIDUpID09ICd0ZXh0LycpCgkJCXsKCQkJCXJldHVybiBTSU1QTEVQSUVfQ09OU1RSVUNUX05PTkU7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlyZXR1cm4gU0lNUExFUElFX0NPTlNUUlVDVF9CQVNFNjQ7CgkJCX0KCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVDsKCQl9Cgl9CgoJZnVuY3Rpb24gaXNfaXNlZ21lbnRfbnpfbmMoJHN0cmluZykKCXsKCQlyZXR1cm4gKGJvb2wpIHByZWdfbWF0Y2goJy9eKFtBLVphLXowLTlcLS5fflx4e0EwfS1ceHtEN0ZGfVx4e0Y5MDB9LVx4e0ZEQ0Z9XHh7RkRGMH0tXHh7RkZFRn1ceHsxMDAwMH0tXHh7MUZGRkR9XHh7MjAwMDB9LVx4ezJGRkZEfVx4ezMwMDAwfS1ceHszRkZGRH1ceHs0MDAwMH0tXHh7NEZGRkR9XHh7NTAwMDB9LVx4ezVGRkZEfVx4ezYwMDAwfS1ceHs2RkZGRH1ceHs3MDAwMH0tXHh7N0ZGRkR9XHh7ODAwMDB9LVx4ezhGRkZEfVx4ezkwMDAwfS1ceHs5RkZGRH1ceHtBMDAwMH0tXHh7QUZGRkR9XHh7QjAwMDB9LVx4e0JGRkZEfVx4e0MwMDAwfS1ceHtDRkZGRH1ceHtEMDAwMH0tXHh7REZGRkR9XHh7RTEwMDB9LVx4e0VGRkZEfSEkJlwnKCkqKyw7PUBdfCglWzAtOUFCQ0RFRl17Mn0pKSskL3UnLCAkc3RyaW5nKTsKCX0KCglmdW5jdGlvbiBzcGFjZV9zZXBlcmF0ZWRfdG9rZW5zKCRzdHJpbmcpCgl7CgkJJHNwYWNlX2NoYXJhY3RlcnMgPSAiXHgyMFx4MDlceDBBXHgwQlx4MENceDBEIjsKCQkkc3RyaW5nX2xlbmd0aCA9IHN0cmxlbigkc3RyaW5nKTsKCgkJJHBvc2l0aW9uID0gc3Ryc3BuKCRzdHJpbmcsICRzcGFjZV9jaGFyYWN0ZXJzKTsKCQkkdG9rZW5zID0gYXJyYXkoKTsKCgkJd2hpbGUgKCRwb3NpdGlvbiA8ICRzdHJpbmdfbGVuZ3RoKQoJCXsKCQkJJGxlbiA9IHN0cmNzcG4oJHN0cmluZywgJHNwYWNlX2NoYXJhY3RlcnMsICRwb3NpdGlvbik7CgkJCSR0b2tlbnNbXSA9IHN1YnN0cigkc3RyaW5nLCAkcG9zaXRpb24sICRsZW4pOwoJCQkkcG9zaXRpb24gKz0gJGxlbjsKCQkJJHBvc2l0aW9uICs9IHN0cnNwbigkc3RyaW5nLCAkc3BhY2VfY2hhcmFjdGVycywgJHBvc2l0aW9uKTsKCQl9CgoJCXJldHVybiAkdG9rZW5zOwoJfQoKCWZ1bmN0aW9uIGFycmF5X3VuaXF1ZSgkYXJyYXkpCgl7CgkJaWYgKHZlcnNpb25fY29tcGFyZShQSFBfVkVSU0lPTiwgJzUuMicsICc+PScpKQoJCXsKCQkJcmV0dXJuIGFycmF5X3VuaXF1ZSgkYXJyYXkpOwoJCX0KCQllbHNlCgkJewoJCQkkYXJyYXkgPSAoYXJyYXkpICRhcnJheTsKCQkJJG5ld19hcnJheSA9IGFycmF5KCk7CgkJCSRuZXdfYXJyYXlfc3RyaW5ncyA9IGFycmF5KCk7CgkJCWZvcmVhY2ggKCRhcnJheSBhcyAka2V5ID0+ICR2YWx1ZSkKCQkJewoJCQkJaWYgKGlzX29iamVjdCgkdmFsdWUpKQoJCQkJewoJCQkJCWlmIChtZXRob2RfZXhpc3RzKCR2YWx1ZSwgJ19fdG9TdHJpbmcnKSkKCQkJCQl7CgkJCQkJCSRjbXAgPSAkdmFsdWUtPl9fdG9TdHJpbmcoKTsKCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJdHJpZ2dlcl9lcnJvcignT2JqZWN0IG9mIGNsYXNzICcgLiBnZXRfY2xhc3MoJHZhbHVlKSAuICcgY291bGQgbm90IGJlIGNvbnZlcnRlZCB0byBzdHJpbmcnLCBFX1VTRVJfRVJST1IpOwoJCQkJCX0KCQkJCX0KCQkJCWVsc2VpZiAoaXNfYXJyYXkoJHZhbHVlKSkKCQkJCXsKCQkJCQkkY21wID0gKHN0cmluZykgcmVzZXQoJHZhbHVlKTsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQkkY21wID0gKHN0cmluZykgJHZhbHVlOwoJCQkJfQoJCQkJaWYgKCFpbl9hcnJheSgkY21wLCAkbmV3X2FycmF5X3N0cmluZ3MpKQoJCQkJewoJCQkJCSRuZXdfYXJyYXlbJGtleV0gPSAkdmFsdWU7CgkJCQkJJG5ld19hcnJheV9zdHJpbmdzW10gPSAkY21wOwoJCQkJfQoJCQl9CgkJCXJldHVybiAkbmV3X2FycmF5OwoJCX0KCX0KCgkvKioKCSAqIENvbnZlcnRzIGEgdW5pY29kZSBjb2RlcG9pbnQgdG8gYSBVVEYtOCBjaGFyYWN0ZXIKCSAqCgkgKiBAc3RhdGljCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHBhcmFtIGludCAkY29kZXBvaW50IFVuaWNvZGUgY29kZXBvaW50CgkgKiBAcmV0dXJuIHN0cmluZyBVVEYtOCBjaGFyYWN0ZXIKCSAqLwoJZnVuY3Rpb24gY29kZXBvaW50X3RvX3V0ZjgoJGNvZGVwb2ludCkKCXsKCQlzdGF0aWMgJGNhY2hlID0gYXJyYXkoKTsKCQkkY29kZXBvaW50ID0gKGludCkgJGNvZGVwb2ludDsKCQlpZiAoaXNzZXQoJGNhY2hlWyRjb2RlcG9pbnRdKSkKCQl7CgkJCXJldHVybiAkY2FjaGVbJGNvZGVwb2ludF07CgkJfQoJCWVsc2VpZiAoJGNvZGVwb2ludCA8IDApCgkJewoJCQlyZXR1cm4gJGNhY2hlWyRjb2RlcG9pbnRdID0gZmFsc2U7CgkJfQoJCWVsc2UgaWYgKCRjb2RlcG9pbnQgPD0gMHg3ZikKCQl7CgkJCXJldHVybiAkY2FjaGVbJGNvZGVwb2ludF0gPSBjaHIoJGNvZGVwb2ludCk7CgkJfQoJCWVsc2UgaWYgKCRjb2RlcG9pbnQgPD0gMHg3ZmYpCgkJewoJCQlyZXR1cm4gJGNhY2hlWyRjb2RlcG9pbnRdID0gY2hyKDB4YzAgfCAoJGNvZGVwb2ludCA+PiA2KSkgLiBjaHIoMHg4MCB8ICgkY29kZXBvaW50ICYgMHgzZikpOwoJCX0KCQllbHNlIGlmICgkY29kZXBvaW50IDw9IDB4ZmZmZikKCQl7CgkJCXJldHVybiAkY2FjaGVbJGNvZGVwb2ludF0gPSBjaHIoMHhlMCB8ICgkY29kZXBvaW50ID4+IDEyKSkgLiBjaHIoMHg4MCB8ICgoJGNvZGVwb2ludCA+PiA2KSAmIDB4M2YpKSAuIGNocigweDgwIHwgKCRjb2RlcG9pbnQgJiAweDNmKSk7CgkJfQoJCWVsc2UgaWYgKCRjb2RlcG9pbnQgPD0gMHgxMGZmZmYpCgkJewoJCQlyZXR1cm4gJGNhY2hlWyRjb2RlcG9pbnRdID0gY2hyKDB4ZjAgfCAoJGNvZGVwb2ludCA+PiAxOCkpIC4gY2hyKDB4ODAgfCAoKCRjb2RlcG9pbnQgPj4gMTIpICYgMHgzZikpIC4gY2hyKDB4ODAgfCAoKCRjb2RlcG9pbnQgPj4gNikgJiAweDNmKSkgLiBjaHIoMHg4MCB8ICgkY29kZXBvaW50ICYgMHgzZikpOwoJCX0KCQllbHNlCgkJewoJCQkvLyBVK0ZGRkQgUkVQTEFDRU1FTlQgQ0hBUkFDVEVSCgkJCXJldHVybiAkY2FjaGVbJGNvZGVwb2ludF0gPSAiXHhFRlx4QkZceEJEIjsKCQl9Cgl9CgoJLyoqCgkgKiBSZS1pbXBsZW1lbnRhdGlvbiBvZiBQSFAgNSdzIHN0cmlwb3MoKQoJICoKCSAqIFJldHVybnMgdGhlIG51bWVyaWMgcG9zaXRpb24gb2YgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgbmVlZGxlIGluIHRoZQoJICogaGF5c3RhY2sgc3RyaW5nLgoJICoKCSAqIEBzdGF0aWMKCSAqIEBhY2Nlc3Mgc3RyaW5nCgkgKiBAcGFyYW0gb2JqZWN0ICRoYXlzdGFjawoJICogQHBhcmFtIHN0cmluZyAkbmVlZGxlIE5vdGUgdGhhdCB0aGUgbmVlZGxlIG1heSBiZSBhIHN0cmluZyBvZiBvbmUgb3IgbW9yZQoJICogICAgIGNoYXJhY3RlcnMuIElmIG5lZWRsZSBpcyBub3QgYSBzdHJpbmcsIGl0IGlzIGNvbnZlcnRlZCB0byBhbiBpbnRlZ2VyCgkgKiAgICAgYW5kIGFwcGxpZWQgYXMgdGhlIG9yZGluYWwgdmFsdWUgb2YgYSBjaGFyYWN0ZXIuCgkgKiBAcGFyYW0gaW50ICRvZmZzZXQgVGhlIG9wdGlvbmFsIG9mZnNldCBwYXJhbWV0ZXIgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHdoaWNoCgkgKiAgICAgY2hhcmFjdGVyIGluIGhheXN0YWNrIHRvIHN0YXJ0IHNlYXJjaGluZy4gVGhlIHBvc2l0aW9uIHJldHVybmVkIGlzIHN0aWxsCgkgKiAgICAgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiBoYXlzdGFjay4KCSAqIEByZXR1cm4gYm9vbCBJZiBuZWVkbGUgaXMgbm90IGZvdW5kLCBzdHJpcG9zKCkgd2lsbCByZXR1cm4gYm9vbGVhbiBmYWxzZS4KCSAqLwoJZnVuY3Rpb24gc3RyaXBvcygkaGF5c3RhY2ssICRuZWVkbGUsICRvZmZzZXQgPSAwKQoJewoJCWlmIChmdW5jdGlvbl9leGlzdHMoJ3N0cmlwb3MnKSkKCQl7CgkJCXJldHVybiBzdHJpcG9zKCRoYXlzdGFjaywgJG5lZWRsZSwgJG9mZnNldCk7CgkJfQoJCWVsc2UKCQl7CgkJCWlmIChpc19zdHJpbmcoJG5lZWRsZSkpCgkJCXsKCQkJCSRuZWVkbGUgPSBzdHJ0b2xvd2VyKCRuZWVkbGUpOwoJCQl9CgkJCWVsc2VpZiAoaXNfaW50KCRuZWVkbGUpIHx8IGlzX2Jvb2woJG5lZWRsZSkgfHwgaXNfZG91YmxlKCRuZWVkbGUpKQoJCQl7CgkJCQkkbmVlZGxlID0gc3RydG9sb3dlcihjaHIoJG5lZWRsZSkpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJdHJpZ2dlcl9lcnJvcignbmVlZGxlIGlzIG5vdCBhIHN0cmluZyBvciBhbiBpbnRlZ2VyJywgRV9VU0VSX1dBUk5JTkcpOwoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgoJCQlyZXR1cm4gc3RycG9zKHN0cnRvbG93ZXIoJGhheXN0YWNrKSwgJG5lZWRsZSwgJG9mZnNldCk7CgkJfQoJfQoKCS8qKgoJICogU2ltaWxhciB0byBwYXJzZV9zdHIoKQoJICoKCSAqIFJldHVybnMgYW4gYXNzb2NpYXRpdmUgYXJyYXkgb2YgbmFtZS92YWx1ZSBwYWlycywgd2hlcmUgdGhlIHZhbHVlIGlzIGFuCgkgKiBhcnJheSBvZiB2YWx1ZXMgdGhhdCBoYXZlIHVzZWQgdGhlIHNhbWUgbmFtZQoJICoKCSAqIEBzdGF0aWMKCSAqIEBhY2Nlc3Mgc3RyaW5nCgkgKiBAcGFyYW0gc3RyaW5nICRzdHIgVGhlIGlucHV0IHN0cmluZy4KCSAqIEByZXR1cm4gYXJyYXkKCSAqLwoJZnVuY3Rpb24gcGFyc2Vfc3RyKCRzdHIpCgl7CgkJJHJldHVybiA9IGFycmF5KCk7CgkJJHN0ciA9IGV4cGxvZGUoJyYnLCAkc3RyKTsKCgkJZm9yZWFjaCAoJHN0ciBhcyAkc2VjdGlvbikKCQl7CgkJCWlmIChzdHJwb3MoJHNlY3Rpb24sICc9JykgIT09IGZhbHNlKQoJCQl7CgkJCQlsaXN0KCRuYW1lLCAkdmFsdWUpID0gZXhwbG9kZSgnPScsICRzZWN0aW9uLCAyKTsKCQkJCSRyZXR1cm5bdXJsZGVjb2RlKCRuYW1lKV1bXSA9IHVybGRlY29kZSgkdmFsdWUpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJJHJldHVyblt1cmxkZWNvZGUoJHNlY3Rpb24pXVtdID0gbnVsbDsKCQkJfQoJCX0KCgkJcmV0dXJuICRyZXR1cm47Cgl9CgoJLyoqCgkgKiBEZXRlY3QgWE1MIGVuY29kaW5nLCBhcyBwZXIgWE1MIDEuMCBBcHBlbmRpeCBGLjEKCSAqCgkgKiBAdG9kbyBBZGQgc3VwcG9ydCBmb3IgRUJDRElDCgkgKiBAcGFyYW0gc3RyaW5nICRkYXRhIFhNTCBkYXRhCgkgKiBAcmV0dXJuIGFycmF5IFBvc3NpYmxlIGVuY29kaW5ncwoJICovCglmdW5jdGlvbiB4bWxfZW5jb2RpbmcoJGRhdGEpCgl7CgkJLy8gVVRGLTMyIEJpZyBFbmRpYW4gQk9NCgkJaWYgKHN1YnN0cigkZGF0YSwgMCwgNCkgPT09ICJceDAwXHgwMFx4RkVceEZGIikKCQl7CgkJCSRlbmNvZGluZ1tdID0gJ1VURi0zMkJFJzsKCQl9CgkJLy8gVVRGLTMyIExpdHRsZSBFbmRpYW4gQk9NCgkJZWxzZWlmIChzdWJzdHIoJGRhdGEsIDAsIDQpID09PSAiXHhGRlx4RkVceDAwXHgwMCIpCgkJewoJCQkkZW5jb2RpbmdbXSA9ICdVVEYtMzJMRSc7CgkJfQoJCS8vIFVURi0xNiBCaWcgRW5kaWFuIEJPTQoJCWVsc2VpZiAoc3Vic3RyKCRkYXRhLCAwLCAyKSA9PT0gIlx4RkVceEZGIikKCQl7CgkJCSRlbmNvZGluZ1tdID0gJ1VURi0xNkJFJzsKCQl9CgkJLy8gVVRGLTE2IExpdHRsZSBFbmRpYW4gQk9NCgkJZWxzZWlmIChzdWJzdHIoJGRhdGEsIDAsIDIpID09PSAiXHhGRlx4RkUiKQoJCXsKCQkJJGVuY29kaW5nW10gPSAnVVRGLTE2TEUnOwoJCX0KCQkvLyBVVEYtOCBCT00KCQllbHNlaWYgKHN1YnN0cigkZGF0YSwgMCwgMykgPT09ICJceEVGXHhCQlx4QkYiKQoJCXsKCQkJJGVuY29kaW5nW10gPSAnVVRGLTgnOwoJCX0KCQkvLyBVVEYtMzIgQmlnIEVuZGlhbiBXaXRob3V0IEJPTQoJCWVsc2VpZiAoc3Vic3RyKCRkYXRhLCAwLCAyMCkgPT09ICJceDAwXHgwMFx4MDBceDNDXHgwMFx4MDBceDAwXHgzRlx4MDBceDAwXHgwMFx4NzhceDAwXHgwMFx4MDBceDZEXHgwMFx4MDBceDAwXHg2QyIpCgkJewoJCQlpZiAoJHBvcyA9IHN0cnBvcygkZGF0YSwgIlx4MDBceDAwXHgwMFx4M0ZceDAwXHgwMFx4MDBceDNFIikpCgkJCXsKCQkJCSRwYXJzZXIgPSBuZXcgU2ltcGxlUGllX1hNTF9EZWNsYXJhdGlvbl9QYXJzZXIoU2ltcGxlUGllX01pc2M6OmNoYW5nZV9lbmNvZGluZyhzdWJzdHIoJGRhdGEsIDIwLCAkcG9zIC0gMjApLCAnVVRGLTMyQkUnLCAnVVRGLTgnKSk7CgkJCQlpZiAoJHBhcnNlci0+cGFyc2UoKSkKCQkJCXsKCQkJCQkkZW5jb2RpbmdbXSA9ICRwYXJzZXItPmVuY29kaW5nOwoJCQkJfQoJCQl9CgkJCSRlbmNvZGluZ1tdID0gJ1VURi0zMkJFJzsKCQl9CgkJLy8gVVRGLTMyIExpdHRsZSBFbmRpYW4gV2l0aG91dCBCT00KCQllbHNlaWYgKHN1YnN0cigkZGF0YSwgMCwgMjApID09PSAiXHgzQ1x4MDBceDAwXHgwMFx4M0ZceDAwXHgwMFx4MDBceDc4XHgwMFx4MDBceDAwXHg2RFx4MDBceDAwXHgwMFx4NkNceDAwXHgwMFx4MDAiKQoJCXsKCQkJaWYgKCRwb3MgPSBzdHJwb3MoJGRhdGEsICJceDNGXHgwMFx4MDBceDAwXHgzRVx4MDBceDAwXHgwMCIpKQoJCQl7CgkJCQkkcGFyc2VyID0gbmV3IFNpbXBsZVBpZV9YTUxfRGVjbGFyYXRpb25fUGFyc2VyKFNpbXBsZVBpZV9NaXNjOjpjaGFuZ2VfZW5jb2Rpbmcoc3Vic3RyKCRkYXRhLCAyMCwgJHBvcyAtIDIwKSwgJ1VURi0zMkxFJywgJ1VURi04JykpOwoJCQkJaWYgKCRwYXJzZXItPnBhcnNlKCkpCgkJCQl7CgkJCQkJJGVuY29kaW5nW10gPSAkcGFyc2VyLT5lbmNvZGluZzsKCQkJCX0KCQkJfQoJCQkkZW5jb2RpbmdbXSA9ICdVVEYtMzJMRSc7CgkJfQoJCS8vIFVURi0xNiBCaWcgRW5kaWFuIFdpdGhvdXQgQk9NCgkJZWxzZWlmIChzdWJzdHIoJGRhdGEsIDAsIDEwKSA9PT0gIlx4MDBceDNDXHgwMFx4M0ZceDAwXHg3OFx4MDBceDZEXHgwMFx4NkMiKQoJCXsKCQkJaWYgKCRwb3MgPSBzdHJwb3MoJGRhdGEsICJceDAwXHgzRlx4MDBceDNFIikpCgkJCXsKCQkJCSRwYXJzZXIgPSBuZXcgU2ltcGxlUGllX1hNTF9EZWNsYXJhdGlvbl9QYXJzZXIoU2ltcGxlUGllX01pc2M6OmNoYW5nZV9lbmNvZGluZyhzdWJzdHIoJGRhdGEsIDIwLCAkcG9zIC0gMTApLCAnVVRGLTE2QkUnLCAnVVRGLTgnKSk7CgkJCQlpZiAoJHBhcnNlci0+cGFyc2UoKSkKCQkJCXsKCQkJCQkkZW5jb2RpbmdbXSA9ICRwYXJzZXItPmVuY29kaW5nOwoJCQkJfQoJCQl9CgkJCSRlbmNvZGluZ1tdID0gJ1VURi0xNkJFJzsKCQl9CgkJLy8gVVRGLTE2IExpdHRsZSBFbmRpYW4gV2l0aG91dCBCT00KCQllbHNlaWYgKHN1YnN0cigkZGF0YSwgMCwgMTApID09PSAiXHgzQ1x4MDBceDNGXHgwMFx4NzhceDAwXHg2RFx4MDBceDZDXHgwMCIpCgkJewoJCQlpZiAoJHBvcyA9IHN0cnBvcygkZGF0YSwgIlx4M0ZceDAwXHgzRVx4MDAiKSkKCQkJewoJCQkJJHBhcnNlciA9IG5ldyBTaW1wbGVQaWVfWE1MX0RlY2xhcmF0aW9uX1BhcnNlcihTaW1wbGVQaWVfTWlzYzo6Y2hhbmdlX2VuY29kaW5nKHN1YnN0cigkZGF0YSwgMjAsICRwb3MgLSAxMCksICdVVEYtMTZMRScsICdVVEYtOCcpKTsKCQkJCWlmICgkcGFyc2VyLT5wYXJzZSgpKQoJCQkJewoJCQkJCSRlbmNvZGluZ1tdID0gJHBhcnNlci0+ZW5jb2Rpbmc7CgkJCQl9CgkJCX0KCQkJJGVuY29kaW5nW10gPSAnVVRGLTE2TEUnOwoJCX0KCQkvLyBVUy1BU0NJSSAob3Igc3VwZXJzZXQpCgkJZWxzZWlmIChzdWJzdHIoJGRhdGEsIDAsIDUpID09PSAiXHgzQ1x4M0ZceDc4XHg2RFx4NkMiKQoJCXsKCQkJaWYgKCRwb3MgPSBzdHJwb3MoJGRhdGEsICJceDNGXHgzRSIpKQoJCQl7CgkJCQkkcGFyc2VyID0gbmV3IFNpbXBsZVBpZV9YTUxfRGVjbGFyYXRpb25fUGFyc2VyKHN1YnN0cigkZGF0YSwgNSwgJHBvcyAtIDUpKTsKCQkJCWlmICgkcGFyc2VyLT5wYXJzZSgpKQoJCQkJewoJCQkJCSRlbmNvZGluZ1tdID0gJHBhcnNlci0+ZW5jb2Rpbmc7CgkJCQl9CgkJCX0KCQkJJGVuY29kaW5nW10gPSAnVVRGLTgnOwoJCX0KCQkvLyBGYWxsYmFjayB0byBVVEYtOAoJCWVsc2UKCQl7CgkJCSRlbmNvZGluZ1tdID0gJ1VURi04JzsKCQl9CgkJcmV0dXJuICRlbmNvZGluZzsKCX0KfQoKLyoqCiAqIERlY29kZSBIVE1MIEVudGl0aWVzCiAqCiAqIFRoaXMgaW1wbGVtZW50cyBIVE1MNSBhcyBvZiByZXZpc2lvbiA5NjcgKDIwMDctMDYtMjgpCiAqCiAqIEBwYWNrYWdlIFNpbXBsZVBpZQogKi8KY2xhc3MgU2ltcGxlUGllX0RlY29kZV9IVE1MX0VudGl0aWVzCnsKCS8qKgoJICogRGF0YSB0byBiZSBwYXJzZWQKCSAqCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXZhciAkZGF0YSA9ICcnOwoKCS8qKgoJICogQ3VycmVudGx5IGNvbnN1bWVkIGJ5dGVzCgkgKgoJICogQGFjY2VzcyBwcml2YXRlCgkgKiBAdmFyIHN0cmluZwoJICovCgl2YXIgJGNvbnN1bWVkID0gJyc7CgoJLyoqCgkgKiBQb3NpdGlvbiBvZiB0aGUgY3VycmVudCBieXRlIGJlaW5nIHBhcnNlZAoJICoKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICogQHZhciBpbnQKCSAqLwoJdmFyICRwb3NpdGlvbiA9IDA7CgoJLyoqCgkgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIHdpdGggdGhlIGlucHV0IGRhdGEKCSAqCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHBhcmFtIHN0cmluZyAkZGF0YSBJbnB1dCBkYXRhCgkgKi8KCWZ1bmN0aW9uIFNpbXBsZVBpZV9EZWNvZGVfSFRNTF9FbnRpdGllcygkZGF0YSkKCXsKCQkkdGhpcy0+ZGF0YSA9ICRkYXRhOwoJfQoKCS8qKgoJICogUGFyc2UgdGhlIGlucHV0IGRhdGEKCSAqCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHJldHVybiBzdHJpbmcgT3V0cHV0IGRhdGEKCSAqLwoJZnVuY3Rpb24gcGFyc2UoKQoJewoJCXdoaWxlICgoJHRoaXMtPnBvc2l0aW9uID0gc3RycG9zKCR0aGlzLT5kYXRhLCAnJicsICR0aGlzLT5wb3NpdGlvbikpICE9PSBmYWxzZSkKCQl7CgkJCSR0aGlzLT5jb25zdW1lKCk7CgkJCSR0aGlzLT5lbnRpdHkoKTsKCQkJJHRoaXMtPmNvbnN1bWVkID0gJyc7CgkJfQoJCXJldHVybiAkdGhpcy0+ZGF0YTsKCX0KCgkvKioKCSAqIENvbnN1bWUgdGhlIG5leHQgYnl0ZQoJICoKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICogQHJldHVybiBtaXhlZCBUaGUgbmV4dCBieXRlLCBvciBmYWxzZSwgaWYgdGhlcmUgaXMgbm8gbW9yZSBkYXRhCgkgKi8KCWZ1bmN0aW9uIGNvbnN1bWUoKQoJewoJCWlmIChpc3NldCgkdGhpcy0+ZGF0YVskdGhpcy0+cG9zaXRpb25dKSkKCQl7CgkJCSR0aGlzLT5jb25zdW1lZCAuPSAkdGhpcy0+ZGF0YVskdGhpcy0+cG9zaXRpb25dOwoJCQlyZXR1cm4gJHRoaXMtPmRhdGFbJHRoaXMtPnBvc2l0aW9uKytdOwoJCX0KCQllbHNlCgkJewoJCQkkdGhpcy0+Y29uc3VtZWQgPSBmYWxzZTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCX0KCgkvKioKCSAqIENvbnN1bWUgYSByYW5nZSBvZiBjaGFyYWN0ZXJzCgkgKgoJICogQGFjY2VzcyBwcml2YXRlCgkgKiBAcGFyYW0gc3RyaW5nICRjaGFycyBDaGFyYWN0ZXJzIHRvIGNvbnN1bWUKCSAqIEByZXR1cm4gbWl4ZWQgQSBzZXJpZXMgb2YgY2hhcmFjdGVycyB0aGF0IG1hdGNoIHRoZSByYW5nZSwgb3IgZmFsc2UKCSAqLwoJZnVuY3Rpb24gY29uc3VtZV9yYW5nZSgkY2hhcnMpCgl7CgkJaWYgKCRsZW4gPSBzdHJzcG4oJHRoaXMtPmRhdGEsICRjaGFycywgJHRoaXMtPnBvc2l0aW9uKSkKCQl7CgkJCSRkYXRhID0gc3Vic3RyKCR0aGlzLT5kYXRhLCAkdGhpcy0+cG9zaXRpb24sICRsZW4pOwoJCQkkdGhpcy0+Y29uc3VtZWQgLj0gJGRhdGE7CgkJCSR0aGlzLT5wb3NpdGlvbiArPSAkbGVuOwoJCQlyZXR1cm4gJGRhdGE7CgkJfQoJCWVsc2UKCQl7CgkJCSR0aGlzLT5jb25zdW1lZCA9IGZhbHNlOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJfQoKCS8qKgoJICogVW5jb25zdW1lIG9uZSBieXRlCgkgKgoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCWZ1bmN0aW9uIHVuY29uc3VtZSgpCgl7CgkJJHRoaXMtPmNvbnN1bWVkID0gc3Vic3RyKCR0aGlzLT5jb25zdW1lZCwgMCwgLTEpOwoJCSR0aGlzLT5wb3NpdGlvbi0tOwoJfQoKCS8qKgoJICogRGVjb2RlIGFuIGVudGl0eQoJICoKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCglmdW5jdGlvbiBlbnRpdHkoKQoJewoJCXN3aXRjaCAoJHRoaXMtPmNvbnN1bWUoKSkKCQl7CgkJCWNhc2UgIlx4MDkiOgoJCQljYXNlICJceDBBIjoKCQkJY2FzZSAiXHgwQiI6CgkJCWNhc2UgIlx4MEIiOgoJCQljYXNlICJceDBDIjoKCQkJY2FzZSAiXHgyMCI6CgkJCWNhc2UgIlx4M0MiOgoJCQljYXNlICJceDI2IjoKCQkJY2FzZSBmYWxzZToKCQkJCWJyZWFrOwoKCQkJY2FzZSAiXHgyMyI6CgkJCQlzd2l0Y2ggKCR0aGlzLT5jb25zdW1lKCkpCgkJCQl7CgkJCQkJY2FzZSAiXHg3OCI6CgkJCQkJY2FzZSAiXHg1OCI6CgkJCQkJCSRyYW5nZSA9ICcwMTIzNDU2Nzg5QUJDREVGYWJjZGVmJzsKCQkJCQkJJGhleCA9IHRydWU7CgkJCQkJCWJyZWFrOwoKCQkJCQlkZWZhdWx0OgoJCQkJCQkkcmFuZ2UgPSAnMDEyMzQ1Njc4OSc7CgkJCQkJCSRoZXggPSBmYWxzZTsKCQkJCQkJJHRoaXMtPnVuY29uc3VtZSgpOwoJCQkJCQlicmVhazsKCQkJCX0KCgkJCQlpZiAoJGNvZGVwb2ludCA9ICR0aGlzLT5jb25zdW1lX3JhbmdlKCRyYW5nZSkpCgkJCQl7CgkJCQkJc3RhdGljICR3aW5kb3dzXzEyNTJfc3BlY2lhbHMgPSBhcnJheSgweDBEID0+ICJceDBBIiwgMHg4MCA9PiAiXHhFMlx4ODJceEFDIiwgMHg4MSA9PiAiXHhFRlx4QkZceEJEIiwgMHg4MiA9PiAiXHhFMlx4ODBceDlBIiwgMHg4MyA9PiAiXHhDNlx4OTIiLCAweDg0ID0+ICJceEUyXHg4MFx4OUUiLCAweDg1ID0+ICJceEUyXHg4MFx4QTYiLCAweDg2ID0+ICJceEUyXHg4MFx4QTAiLCAweDg3ID0+ICJceEUyXHg4MFx4QTEiLCAweDg4ID0+ICJceENCXHg4NiIsIDB4ODkgPT4gIlx4RTJceDgwXHhCMCIsIDB4OEEgPT4gIlx4QzVceEEwIiwgMHg4QiA9PiAiXHhFMlx4ODBceEI5IiwgMHg4QyA9PiAiXHhDNVx4OTIiLCAweDhEID0+ICJceEVGXHhCRlx4QkQiLCAweDhFID0+ICJceEM1XHhCRCIsIDB4OEYgPT4gIlx4RUZceEJGXHhCRCIsIDB4OTAgPT4gIlx4RUZceEJGXHhCRCIsIDB4OTEgPT4gIlx4RTJceDgwXHg5OCIsIDB4OTIgPT4gIlx4RTJceDgwXHg5OSIsIDB4OTMgPT4gIlx4RTJceDgwXHg5QyIsIDB4OTQgPT4gIlx4RTJceDgwXHg5RCIsIDB4OTUgPT4gIlx4RTJceDgwXHhBMiIsIDB4OTYgPT4gIlx4RTJceDgwXHg5MyIsIDB4OTcgPT4gIlx4RTJceDgwXHg5NCIsIDB4OTggPT4gIlx4Q0JceDlDIiwgMHg5OSA9PiAiXHhFMlx4ODRceEEyIiwgMHg5QSA9PiAiXHhDNVx4QTEiLCAweDlCID0+ICJceEUyXHg4MFx4QkEiLCAweDlDID0+ICJceEM1XHg5MyIsIDB4OUQgPT4gIlx4RUZceEJGXHhCRCIsIDB4OUUgPT4gIlx4QzVceEJFIiwgMHg5RiA9PiAiXHhDNVx4QjgiKTsKCgkJCQkJaWYgKCRoZXgpCgkJCQkJewoJCQkJCQkkY29kZXBvaW50ID0gaGV4ZGVjKCRjb2RlcG9pbnQpOwoJCQkJCX0KCQkJCQllbHNlCgkJCQkJewoJCQkJCQkkY29kZXBvaW50ID0gaW50dmFsKCRjb2RlcG9pbnQpOwoJCQkJCX0KCgkJCQkJaWYgKGlzc2V0KCR3aW5kb3dzXzEyNTJfc3BlY2lhbHNbJGNvZGVwb2ludF0pKQoJCQkJCXsKCQkJCQkJJHJlcGxhY2VtZW50ID0gJHdpbmRvd3NfMTI1Ml9zcGVjaWFsc1skY29kZXBvaW50XTsKCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJJHJlcGxhY2VtZW50ID0gU2ltcGxlUGllX01pc2M6OmNvZGVwb2ludF90b191dGY4KCRjb2RlcG9pbnQpOwoJCQkJCX0KCgkJCQkJaWYgKCR0aGlzLT5jb25zdW1lKCkgIT0gJzsnKQoJCQkJCXsKCQkJCQkJJHRoaXMtPnVuY29uc3VtZSgpOwoJCQkJCX0KCgkJCQkJJGNvbnN1bWVkX2xlbmd0aCA9IHN0cmxlbigkdGhpcy0+Y29uc3VtZWQpOwoJCQkJCSR0aGlzLT5kYXRhID0gc3Vic3RyX3JlcGxhY2UoJHRoaXMtPmRhdGEsICRyZXBsYWNlbWVudCwgJHRoaXMtPnBvc2l0aW9uIC0gJGNvbnN1bWVkX2xlbmd0aCwgJGNvbnN1bWVkX2xlbmd0aCk7CgkJCQkJJHRoaXMtPnBvc2l0aW9uICs9IHN0cmxlbigkcmVwbGFjZW1lbnQpIC0gJGNvbnN1bWVkX2xlbmd0aDsKCQkJCX0KCQkJCWJyZWFrOwoKCQkJZGVmYXVsdDoKCQkJCXN0YXRpYyAkZW50aXRpZXMgPSBhcnJheSgnQWFjdXRlJyA9PiAiXHhDM1x4ODEiLCAnYWFjdXRlJyA9PiAiXHhDM1x4QTEiLCAnQWFjdXRlOycgPT4gIlx4QzNceDgxIiwgJ2FhY3V0ZTsnID0+ICJceEMzXHhBMSIsICdBY2lyYycgPT4gIlx4QzNceDgyIiwgJ2FjaXJjJyA9PiAiXHhDM1x4QTIiLCAnQWNpcmM7JyA9PiAiXHhDM1x4ODIiLCAnYWNpcmM7JyA9PiAiXHhDM1x4QTIiLCAnYWN1dGUnID0+ICJceEMyXHhCNCIsICdhY3V0ZTsnID0+ICJceEMyXHhCNCIsICdBRWxpZycgPT4gIlx4QzNceDg2IiwgJ2FlbGlnJyA9PiAiXHhDM1x4QTYiLCAnQUVsaWc7JyA9PiAiXHhDM1x4ODYiLCAnYWVsaWc7JyA9PiAiXHhDM1x4QTYiLCAnQWdyYXZlJyA9PiAiXHhDM1x4ODAiLCAnYWdyYXZlJyA9PiAiXHhDM1x4QTAiLCAnQWdyYXZlOycgPT4gIlx4QzNceDgwIiwgJ2FncmF2ZTsnID0+ICJceEMzXHhBMCIsICdhbGVmc3ltOycgPT4gIlx4RTJceDg0XHhCNSIsICdBbHBoYTsnID0+ICJceENFXHg5MSIsICdhbHBoYTsnID0+ICJceENFXHhCMSIsICdBTVAnID0+ICJceDI2IiwgJ2FtcCcgPT4gIlx4MjYiLCAnQU1QOycgPT4gIlx4MjYiLCAnYW1wOycgPT4gIlx4MjYiLCAnYW5kOycgPT4gIlx4RTJceDg4XHhBNyIsICdhbmc7JyA9PiAiXHhFMlx4ODhceEEwIiwgJ2Fwb3M7JyA9PiAiXHgyNyIsICdBcmluZycgPT4gIlx4QzNceDg1IiwgJ2FyaW5nJyA9PiAiXHhDM1x4QTUiLCAnQXJpbmc7JyA9PiAiXHhDM1x4ODUiLCAnYXJpbmc7JyA9PiAiXHhDM1x4QTUiLCAnYXN5bXA7JyA9PiAiXHhFMlx4ODlceDg4IiwgJ0F0aWxkZScgPT4gIlx4QzNceDgzIiwgJ2F0aWxkZScgPT4gIlx4QzNceEEzIiwgJ0F0aWxkZTsnID0+ICJceEMzXHg4MyIsICdhdGlsZGU7JyA9PiAiXHhDM1x4QTMiLCAnQXVtbCcgPT4gIlx4QzNceDg0IiwgJ2F1bWwnID0+ICJceEMzXHhBNCIsICdBdW1sOycgPT4gIlx4QzNceDg0IiwgJ2F1bWw7JyA9PiAiXHhDM1x4QTQiLCAnYmRxdW87JyA9PiAiXHhFMlx4ODBceDlFIiwgJ0JldGE7JyA9PiAiXHhDRVx4OTIiLCAnYmV0YTsnID0+ICJceENFXHhCMiIsICdicnZiYXInID0+ICJceEMyXHhBNiIsICdicnZiYXI7JyA9PiAiXHhDMlx4QTYiLCAnYnVsbDsnID0+ICJceEUyXHg4MFx4QTIiLCAnY2FwOycgPT4gIlx4RTJceDg4XHhBOSIsICdDY2VkaWwnID0+ICJceEMzXHg4NyIsICdjY2VkaWwnID0+ICJceEMzXHhBNyIsICdDY2VkaWw7JyA9PiAiXHhDM1x4ODciLCAnY2NlZGlsOycgPT4gIlx4QzNceEE3IiwgJ2NlZGlsJyA9PiAiXHhDMlx4QjgiLCAnY2VkaWw7JyA9PiAiXHhDMlx4QjgiLCAnY2VudCcgPT4gIlx4QzJceEEyIiwgJ2NlbnQ7JyA9PiAiXHhDMlx4QTIiLCAnQ2hpOycgPT4gIlx4Q0VceEE3IiwgJ2NoaTsnID0+ICJceENGXHg4NyIsICdjaXJjOycgPT4gIlx4Q0JceDg2IiwgJ2NsdWJzOycgPT4gIlx4RTJceDk5XHhBMyIsICdjb25nOycgPT4gIlx4RTJceDg5XHg4NSIsICdDT1BZJyA9PiAiXHhDMlx4QTkiLCAnY29weScgPT4gIlx4QzJceEE5IiwgJ0NPUFk7JyA9PiAiXHhDMlx4QTkiLCAnY29weTsnID0+ICJceEMyXHhBOSIsICdjcmFycjsnID0+ICJceEUyXHg4Nlx4QjUiLCAnY3VwOycgPT4gIlx4RTJceDg4XHhBQSIsICdjdXJyZW4nID0+ICJceEMyXHhBNCIsICdjdXJyZW47JyA9PiAiXHhDMlx4QTQiLCAnRGFnZ2VyOycgPT4gIlx4RTJceDgwXHhBMSIsICdkYWdnZXI7JyA9PiAiXHhFMlx4ODBceEEwIiwgJ2RBcnI7JyA9PiAiXHhFMlx4ODdceDkzIiwgJ2RhcnI7JyA9PiAiXHhFMlx4ODZceDkzIiwgJ2RlZycgPT4gIlx4QzJceEIwIiwgJ2RlZzsnID0+ICJceEMyXHhCMCIsICdEZWx0YTsnID0+ICJceENFXHg5NCIsICdkZWx0YTsnID0+ICJceENFXHhCNCIsICdkaWFtczsnID0+ICJceEUyXHg5OVx4QTYiLCAnZGl2aWRlJyA9PiAiXHhDM1x4QjciLCAnZGl2aWRlOycgPT4gIlx4QzNceEI3IiwgJ0VhY3V0ZScgPT4gIlx4QzNceDg5IiwgJ2VhY3V0ZScgPT4gIlx4QzNceEE5IiwgJ0VhY3V0ZTsnID0+ICJceEMzXHg4OSIsICdlYWN1dGU7JyA9PiAiXHhDM1x4QTkiLCAnRWNpcmMnID0+ICJceEMzXHg4QSIsICdlY2lyYycgPT4gIlx4QzNceEFBIiwgJ0VjaXJjOycgPT4gIlx4QzNceDhBIiwgJ2VjaXJjOycgPT4gIlx4QzNceEFBIiwgJ0VncmF2ZScgPT4gIlx4QzNceDg4IiwgJ2VncmF2ZScgPT4gIlx4QzNceEE4IiwgJ0VncmF2ZTsnID0+ICJceEMzXHg4OCIsICdlZ3JhdmU7JyA9PiAiXHhDM1x4QTgiLCAnZW1wdHk7JyA9PiAiXHhFMlx4ODhceDg1IiwgJ2Vtc3A7JyA9PiAiXHhFMlx4ODBceDgzIiwgJ2Vuc3A7JyA9PiAiXHhFMlx4ODBceDgyIiwgJ0Vwc2lsb247JyA9PiAiXHhDRVx4OTUiLCAnZXBzaWxvbjsnID0+ICJceENFXHhCNSIsICdlcXVpdjsnID0+ICJceEUyXHg4OVx4QTEiLCAnRXRhOycgPT4gIlx4Q0VceDk3IiwgJ2V0YTsnID0+ICJceENFXHhCNyIsICdFVEgnID0+ICJceEMzXHg5MCIsICdldGgnID0+ICJceEMzXHhCMCIsICdFVEg7JyA9PiAiXHhDM1x4OTAiLCAnZXRoOycgPT4gIlx4QzNceEIwIiwgJ0V1bWwnID0+ICJceEMzXHg4QiIsICdldW1sJyA9PiAiXHhDM1x4QUIiLCAnRXVtbDsnID0+ICJceEMzXHg4QiIsICdldW1sOycgPT4gIlx4QzNceEFCIiwgJ2V1cm87JyA9PiAiXHhFMlx4ODJceEFDIiwgJ2V4aXN0OycgPT4gIlx4RTJceDg4XHg4MyIsICdmbm9mOycgPT4gIlx4QzZceDkyIiwgJ2ZvcmFsbDsnID0+ICJceEUyXHg4OFx4ODAiLCAnZnJhYzEyJyA9PiAiXHhDMlx4QkQiLCAnZnJhYzEyOycgPT4gIlx4QzJceEJEIiwgJ2ZyYWMxNCcgPT4gIlx4QzJceEJDIiwgJ2ZyYWMxNDsnID0+ICJceEMyXHhCQyIsICdmcmFjMzQnID0+ICJceEMyXHhCRSIsICdmcmFjMzQ7JyA9PiAiXHhDMlx4QkUiLCAnZnJhc2w7JyA9PiAiXHhFMlx4ODFceDg0IiwgJ0dhbW1hOycgPT4gIlx4Q0VceDkzIiwgJ2dhbW1hOycgPT4gIlx4Q0VceEIzIiwgJ2dlOycgPT4gIlx4RTJceDg5XHhBNSIsICdHVCcgPT4gIlx4M0UiLCAnZ3QnID0+ICJceDNFIiwgJ0dUOycgPT4gIlx4M0UiLCAnZ3Q7JyA9PiAiXHgzRSIsICdoQXJyOycgPT4gIlx4RTJceDg3XHg5NCIsICdoYXJyOycgPT4gIlx4RTJceDg2XHg5NCIsICdoZWFydHM7JyA9PiAiXHhFMlx4OTlceEE1IiwgJ2hlbGxpcDsnID0+ICJceEUyXHg4MFx4QTYiLCAnSWFjdXRlJyA9PiAiXHhDM1x4OEQiLCAnaWFjdXRlJyA9PiAiXHhDM1x4QUQiLCAnSWFjdXRlOycgPT4gIlx4QzNceDhEIiwgJ2lhY3V0ZTsnID0+ICJceEMzXHhBRCIsICdJY2lyYycgPT4gIlx4QzNceDhFIiwgJ2ljaXJjJyA9PiAiXHhDM1x4QUUiLCAnSWNpcmM7JyA9PiAiXHhDM1x4OEUiLCAnaWNpcmM7JyA9PiAiXHhDM1x4QUUiLCAnaWV4Y2wnID0+ICJceEMyXHhBMSIsICdpZXhjbDsnID0+ICJceEMyXHhBMSIsICdJZ3JhdmUnID0+ICJceEMzXHg4QyIsICdpZ3JhdmUnID0+ICJceEMzXHhBQyIsICdJZ3JhdmU7JyA9PiAiXHhDM1x4OEMiLCAnaWdyYXZlOycgPT4gIlx4QzNceEFDIiwgJ2ltYWdlOycgPT4gIlx4RTJceDg0XHg5MSIsICdpbmZpbjsnID0+ICJceEUyXHg4OFx4OUUiLCAnaW50OycgPT4gIlx4RTJceDg4XHhBQiIsICdJb3RhOycgPT4gIlx4Q0VceDk5IiwgJ2lvdGE7JyA9PiAiXHhDRVx4QjkiLCAnaXF1ZXN0JyA9PiAiXHhDMlx4QkYiLCAnaXF1ZXN0OycgPT4gIlx4QzJceEJGIiwgJ2lzaW47JyA9PiAiXHhFMlx4ODhceDg4IiwgJ0l1bWwnID0+ICJceEMzXHg4RiIsICdpdW1sJyA9PiAiXHhDM1x4QUYiLCAnSXVtbDsnID0+ICJceEMzXHg4RiIsICdpdW1sOycgPT4gIlx4QzNceEFGIiwgJ0thcHBhOycgPT4gIlx4Q0VceDlBIiwgJ2thcHBhOycgPT4gIlx4Q0VceEJBIiwgJ0xhbWJkYTsnID0+ICJceENFXHg5QiIsICdsYW1iZGE7JyA9PiAiXHhDRVx4QkIiLCAnbGFuZzsnID0+ICJceEUzXHg4MFx4ODgiLCAnbGFxdW8nID0+ICJceEMyXHhBQiIsICdsYXF1bzsnID0+ICJceEMyXHhBQiIsICdsQXJyOycgPT4gIlx4RTJceDg3XHg5MCIsICdsYXJyOycgPT4gIlx4RTJceDg2XHg5MCIsICdsY2VpbDsnID0+ICJceEUyXHg4Q1x4ODgiLCAnbGRxdW87JyA9PiAiXHhFMlx4ODBceDlDIiwgJ2xlOycgPT4gIlx4RTJceDg5XHhBNCIsICdsZmxvb3I7JyA9PiAiXHhFMlx4OENceDhBIiwgJ2xvd2FzdDsnID0+ICJceEUyXHg4OFx4OTciLCAnbG96OycgPT4gIlx4RTJceDk3XHg4QSIsICdscm07JyA9PiAiXHhFMlx4ODBceDhFIiwgJ2xzYXF1bzsnID0+ICJceEUyXHg4MFx4QjkiLCAnbHNxdW87JyA9PiAiXHhFMlx4ODBceDk4IiwgJ0xUJyA9PiAiXHgzQyIsICdsdCcgPT4gIlx4M0MiLCAnTFQ7JyA9PiAiXHgzQyIsICdsdDsnID0+ICJceDNDIiwgJ21hY3InID0+ICJceEMyXHhBRiIsICdtYWNyOycgPT4gIlx4QzJceEFGIiwgJ21kYXNoOycgPT4gIlx4RTJceDgwXHg5NCIsICdtaWNybycgPT4gIlx4QzJceEI1IiwgJ21pY3JvOycgPT4gIlx4QzJceEI1IiwgJ21pZGRvdCcgPT4gIlx4QzJceEI3IiwgJ21pZGRvdDsnID0+ICJceEMyXHhCNyIsICdtaW51czsnID0+ICJceEUyXHg4OFx4OTIiLCAnTXU7JyA9PiAiXHhDRVx4OUMiLCAnbXU7JyA9PiAiXHhDRVx4QkMiLCAnbmFibGE7JyA9PiAiXHhFMlx4ODhceDg3IiwgJ25ic3AnID0+ICJceEMyXHhBMCIsICduYnNwOycgPT4gIlx4QzJceEEwIiwgJ25kYXNoOycgPT4gIlx4RTJceDgwXHg5MyIsICduZTsnID0+ICJceEUyXHg4OVx4QTAiLCAnbmk7JyA9PiAiXHhFMlx4ODhceDhCIiwgJ25vdCcgPT4gIlx4QzJceEFDIiwgJ25vdDsnID0+ICJceEMyXHhBQyIsICdub3RpbjsnID0+ICJceEUyXHg4OFx4ODkiLCAnbnN1YjsnID0+ICJceEUyXHg4QVx4ODQiLCAnTnRpbGRlJyA9PiAiXHhDM1x4OTEiLCAnbnRpbGRlJyA9PiAiXHhDM1x4QjEiLCAnTnRpbGRlOycgPT4gIlx4QzNceDkxIiwgJ250aWxkZTsnID0+ICJceEMzXHhCMSIsICdOdTsnID0+ICJceENFXHg5RCIsICdudTsnID0+ICJceENFXHhCRCIsICdPYWN1dGUnID0+ICJceEMzXHg5MyIsICdvYWN1dGUnID0+ICJceEMzXHhCMyIsICdPYWN1dGU7JyA9PiAiXHhDM1x4OTMiLCAnb2FjdXRlOycgPT4gIlx4QzNceEIzIiwgJ09jaXJjJyA9PiAiXHhDM1x4OTQiLCAnb2NpcmMnID0+ICJceEMzXHhCNCIsICdPY2lyYzsnID0+ICJceEMzXHg5NCIsICdvY2lyYzsnID0+ICJceEMzXHhCNCIsICdPRWxpZzsnID0+ICJceEM1XHg5MiIsICdvZWxpZzsnID0+ICJceEM1XHg5MyIsICdPZ3JhdmUnID0+ICJceEMzXHg5MiIsICdvZ3JhdmUnID0+ICJceEMzXHhCMiIsICdPZ3JhdmU7JyA9PiAiXHhDM1x4OTIiLCAnb2dyYXZlOycgPT4gIlx4QzNceEIyIiwgJ29saW5lOycgPT4gIlx4RTJceDgwXHhCRSIsICdPbWVnYTsnID0+ICJceENFXHhBOSIsICdvbWVnYTsnID0+ICJceENGXHg4OSIsICdPbWljcm9uOycgPT4gIlx4Q0VceDlGIiwgJ29taWNyb247JyA9PiAiXHhDRVx4QkYiLCAnb3BsdXM7JyA9PiAiXHhFMlx4OEFceDk1IiwgJ29yOycgPT4gIlx4RTJceDg4XHhBOCIsICdvcmRmJyA9PiAiXHhDMlx4QUEiLCAnb3JkZjsnID0+ICJceEMyXHhBQSIsICdvcmRtJyA9PiAiXHhDMlx4QkEiLCAnb3JkbTsnID0+ICJceEMyXHhCQSIsICdPc2xhc2gnID0+ICJceEMzXHg5OCIsICdvc2xhc2gnID0+ICJceEMzXHhCOCIsICdPc2xhc2g7JyA9PiAiXHhDM1x4OTgiLCAnb3NsYXNoOycgPT4gIlx4QzNceEI4IiwgJ090aWxkZScgPT4gIlx4QzNceDk1IiwgJ290aWxkZScgPT4gIlx4QzNceEI1IiwgJ090aWxkZTsnID0+ICJceEMzXHg5NSIsICdvdGlsZGU7JyA9PiAiXHhDM1x4QjUiLCAnb3RpbWVzOycgPT4gIlx4RTJceDhBXHg5NyIsICdPdW1sJyA9PiAiXHhDM1x4OTYiLCAnb3VtbCcgPT4gIlx4QzNceEI2IiwgJ091bWw7JyA9PiAiXHhDM1x4OTYiLCAnb3VtbDsnID0+ICJceEMzXHhCNiIsICdwYXJhJyA9PiAiXHhDMlx4QjYiLCAncGFyYTsnID0+ICJceEMyXHhCNiIsICdwYXJ0OycgPT4gIlx4RTJceDg4XHg4MiIsICdwZXJtaWw7JyA9PiAiXHhFMlx4ODBceEIwIiwgJ3BlcnA7JyA9PiAiXHhFMlx4OEFceEE1IiwgJ1BoaTsnID0+ICJceENFXHhBNiIsICdwaGk7JyA9PiAiXHhDRlx4ODYiLCAnUGk7JyA9PiAiXHhDRVx4QTAiLCAncGk7JyA9PiAiXHhDRlx4ODAiLCAncGl2OycgPT4gIlx4Q0ZceDk2IiwgJ3BsdXNtbicgPT4gIlx4QzJceEIxIiwgJ3BsdXNtbjsnID0+ICJceEMyXHhCMSIsICdwb3VuZCcgPT4gIlx4QzJceEEzIiwgJ3BvdW5kOycgPT4gIlx4QzJceEEzIiwgJ1ByaW1lOycgPT4gIlx4RTJceDgwXHhCMyIsICdwcmltZTsnID0+ICJceEUyXHg4MFx4QjIiLCAncHJvZDsnID0+ICJceEUyXHg4OFx4OEYiLCAncHJvcDsnID0+ICJceEUyXHg4OFx4OUQiLCAnUHNpOycgPT4gIlx4Q0VceEE4IiwgJ3BzaTsnID0+ICJceENGXHg4OCIsICdRVU9UJyA9PiAiXHgyMiIsICdxdW90JyA9PiAiXHgyMiIsICdRVU9UOycgPT4gIlx4MjIiLCAncXVvdDsnID0+ICJceDIyIiwgJ3JhZGljOycgPT4gIlx4RTJceDg4XHg5QSIsICdyYW5nOycgPT4gIlx4RTNceDgwXHg4OSIsICdyYXF1bycgPT4gIlx4QzJceEJCIiwgJ3JhcXVvOycgPT4gIlx4QzJceEJCIiwgJ3JBcnI7JyA9PiAiXHhFMlx4ODdceDkyIiwgJ3JhcnI7JyA9PiAiXHhFMlx4ODZceDkyIiwgJ3JjZWlsOycgPT4gIlx4RTJceDhDXHg4OSIsICdyZHF1bzsnID0+ICJceEUyXHg4MFx4OUQiLCAncmVhbDsnID0+ICJceEUyXHg4NFx4OUMiLCAnUkVHJyA9PiAiXHhDMlx4QUUiLCAncmVnJyA9PiAiXHhDMlx4QUUiLCAnUkVHOycgPT4gIlx4QzJceEFFIiwgJ3JlZzsnID0+ICJceEMyXHhBRSIsICdyZmxvb3I7JyA9PiAiXHhFMlx4OENceDhCIiwgJ1JobzsnID0+ICJceENFXHhBMSIsICdyaG87JyA9PiAiXHhDRlx4ODEiLCAncmxtOycgPT4gIlx4RTJceDgwXHg4RiIsICdyc2FxdW87JyA9PiAiXHhFMlx4ODBceEJBIiwgJ3JzcXVvOycgPT4gIlx4RTJceDgwXHg5OSIsICdzYnF1bzsnID0+ICJceEUyXHg4MFx4OUEiLCAnU2Nhcm9uOycgPT4gIlx4QzVceEEwIiwgJ3NjYXJvbjsnID0+ICJceEM1XHhBMSIsICdzZG90OycgPT4gIlx4RTJceDhCXHg4NSIsICdzZWN0JyA9PiAiXHhDMlx4QTciLCAnc2VjdDsnID0+ICJceEMyXHhBNyIsICdzaHknID0+ICJceEMyXHhBRCIsICdzaHk7JyA9PiAiXHhDMlx4QUQiLCAnU2lnbWE7JyA9PiAiXHhDRVx4QTMiLCAnc2lnbWE7JyA9PiAiXHhDRlx4ODMiLCAnc2lnbWFmOycgPT4gIlx4Q0ZceDgyIiwgJ3NpbTsnID0+ICJceEUyXHg4OFx4QkMiLCAnc3BhZGVzOycgPT4gIlx4RTJceDk5XHhBMCIsICdzdWI7JyA9PiAiXHhFMlx4OEFceDgyIiwgJ3N1YmU7JyA9PiAiXHhFMlx4OEFceDg2IiwgJ3N1bTsnID0+ICJceEUyXHg4OFx4OTEiLCAnc3VwOycgPT4gIlx4RTJceDhBXHg4MyIsICdzdXAxJyA9PiAiXHhDMlx4QjkiLCAnc3VwMTsnID0+ICJceEMyXHhCOSIsICdzdXAyJyA9PiAiXHhDMlx4QjIiLCAnc3VwMjsnID0+ICJceEMyXHhCMiIsICdzdXAzJyA9PiAiXHhDMlx4QjMiLCAnc3VwMzsnID0+ICJceEMyXHhCMyIsICdzdXBlOycgPT4gIlx4RTJceDhBXHg4NyIsICdzemxpZycgPT4gIlx4QzNceDlGIiwgJ3N6bGlnOycgPT4gIlx4QzNceDlGIiwgJ1RhdTsnID0+ICJceENFXHhBNCIsICd0YXU7JyA9PiAiXHhDRlx4ODQiLCAndGhlcmU0OycgPT4gIlx4RTJceDg4XHhCNCIsICdUaGV0YTsnID0+ICJceENFXHg5OCIsICd0aGV0YTsnID0+ICJceENFXHhCOCIsICd0aGV0YXN5bTsnID0+ICJceENGXHg5MSIsICd0aGluc3A7JyA9PiAiXHhFMlx4ODBceDg5IiwgJ1RIT1JOJyA9PiAiXHhDM1x4OUUiLCAndGhvcm4nID0+ICJceEMzXHhCRSIsICdUSE9STjsnID0+ICJceEMzXHg5RSIsICd0aG9ybjsnID0+ICJceEMzXHhCRSIsICd0aWxkZTsnID0+ICJceENCXHg5QyIsICd0aW1lcycgPT4gIlx4QzNceDk3IiwgJ3RpbWVzOycgPT4gIlx4QzNceDk3IiwgJ1RSQURFOycgPT4gIlx4RTJceDg0XHhBMiIsICd0cmFkZTsnID0+ICJceEUyXHg4NFx4QTIiLCAnVWFjdXRlJyA9PiAiXHhDM1x4OUEiLCAndWFjdXRlJyA9PiAiXHhDM1x4QkEiLCAnVWFjdXRlOycgPT4gIlx4QzNceDlBIiwgJ3VhY3V0ZTsnID0+ICJceEMzXHhCQSIsICd1QXJyOycgPT4gIlx4RTJceDg3XHg5MSIsICd1YXJyOycgPT4gIlx4RTJceDg2XHg5MSIsICdVY2lyYycgPT4gIlx4QzNceDlCIiwgJ3VjaXJjJyA9PiAiXHhDM1x4QkIiLCAnVWNpcmM7JyA9PiAiXHhDM1x4OUIiLCAndWNpcmM7JyA9PiAiXHhDM1x4QkIiLCAnVWdyYXZlJyA9PiAiXHhDM1x4OTkiLCAndWdyYXZlJyA9PiAiXHhDM1x4QjkiLCAnVWdyYXZlOycgPT4gIlx4QzNceDk5IiwgJ3VncmF2ZTsnID0+ICJceEMzXHhCOSIsICd1bWwnID0+ICJceEMyXHhBOCIsICd1bWw7JyA9PiAiXHhDMlx4QTgiLCAndXBzaWg7JyA9PiAiXHhDRlx4OTIiLCAnVXBzaWxvbjsnID0+ICJceENFXHhBNSIsICd1cHNpbG9uOycgPT4gIlx4Q0ZceDg1IiwgJ1V1bWwnID0+ICJceEMzXHg5QyIsICd1dW1sJyA9PiAiXHhDM1x4QkMiLCAnVXVtbDsnID0+ICJceEMzXHg5QyIsICd1dW1sOycgPT4gIlx4QzNceEJDIiwgJ3dlaWVycDsnID0+ICJceEUyXHg4NFx4OTgiLCAnWGk7JyA9PiAiXHhDRVx4OUUiLCAneGk7JyA9PiAiXHhDRVx4QkUiLCAnWWFjdXRlJyA9PiAiXHhDM1x4OUQiLCAneWFjdXRlJyA9PiAiXHhDM1x4QkQiLCAnWWFjdXRlOycgPT4gIlx4QzNceDlEIiwgJ3lhY3V0ZTsnID0+ICJceEMzXHhCRCIsICd5ZW4nID0+ICJceEMyXHhBNSIsICd5ZW47JyA9PiAiXHhDMlx4QTUiLCAneXVtbCcgPT4gIlx4QzNceEJGIiwgJ1l1bWw7JyA9PiAiXHhDNVx4QjgiLCAneXVtbDsnID0+ICJceEMzXHhCRiIsICdaZXRhOycgPT4gIlx4Q0VceDk2IiwgJ3pldGE7JyA9PiAiXHhDRVx4QjYiLCAnendqOycgPT4gIlx4RTJceDgwXHg4RCIsICd6d25qOycgPT4gIlx4RTJceDgwXHg4QyIpOwoKCQkJCWZvciAoJGkgPSAwLCAkbWF0Y2ggPSBudWxsOyAkaSA8IDkgJiYgJHRoaXMtPmNvbnN1bWUoKSAhPT0gZmFsc2U7ICRpKyspCgkJCQl7CgkJCQkJJGNvbnN1bWVkID0gc3Vic3RyKCR0aGlzLT5jb25zdW1lZCwgMSk7CgkJCQkJaWYgKGlzc2V0KCRlbnRpdGllc1skY29uc3VtZWRdKSkKCQkJCQl7CgkJCQkJCSRtYXRjaCA9ICRjb25zdW1lZDsKCQkJCQl9CgkJCQl9CgoJCQkJaWYgKCRtYXRjaCAhPT0gbnVsbCkKCQkJCXsKIAkJCQkJJHRoaXMtPmRhdGEgPSBzdWJzdHJfcmVwbGFjZSgkdGhpcy0+ZGF0YSwgJGVudGl0aWVzWyRtYXRjaF0sICR0aGlzLT5wb3NpdGlvbiAtIHN0cmxlbigkY29uc3VtZWQpIC0gMSwgc3RybGVuKCRtYXRjaCkgKyAxKTsKCQkJCQkkdGhpcy0+cG9zaXRpb24gKz0gc3RybGVuKCRlbnRpdGllc1skbWF0Y2hdKSAtIHN0cmxlbigkY29uc3VtZWQpIC0gMTsKCQkJCX0KCQkJCWJyZWFrOwoJCX0KCX0KfQoKLyoqCiAqIERhdGUgUGFyc2VyCiAqCiAqIEBwYWNrYWdlIFNpbXBsZVBpZQogKi8KY2xhc3MgU2ltcGxlUGllX1BhcnNlX0RhdGUKewoJLyoqCgkgKiBJbnB1dCBkYXRhCgkgKgoJICogQGFjY2VzcyBwcm90ZWN0ZWQKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXZhciAkZGF0ZTsKCgkvKioKCSAqIExpc3Qgb2YgZGF5cywgY2FsZW5kYXIgZGF5IG5hbWUgPT4gb3JkaW5hbCBkYXkgbnVtYmVyIGluIHRoZSB3ZWVrCgkgKgoJICogQGFjY2VzcyBwcm90ZWN0ZWQKCSAqIEB2YXIgYXJyYXkKCSAqLwoJdmFyICRkYXkgPSBhcnJheSgKCQkvLyBFbmdsaXNoCgkJJ21vbicgPT4gMSwKCQknbW9uZGF5JyA9PiAxLAoJCSd0dWUnID0+IDIsCgkJJ3R1ZXNkYXknID0+IDIsCgkJJ3dlZCcgPT4gMywKCQknd2VkbmVzZGF5JyA9PiAzLAoJCSd0aHUnID0+IDQsCgkJJ3RodXJzZGF5JyA9PiA0LAoJCSdmcmknID0+IDUsCgkJJ2ZyaWRheScgPT4gNSwKCQknc2F0JyA9PiA2LAoJCSdzYXR1cmRheScgPT4gNiwKCQknc3VuJyA9PiA3LAoJCSdzdW5kYXknID0+IDcsCgkJLy8gRHV0Y2gKCQknbWFhbmRhZycgPT4gMSwKCQknZGluc2RhZycgPT4gMiwKCQknd29lbnNkYWcnID0+IDMsCgkJJ2RvbmRlcmRhZycgPT4gNCwKCQkndnJpamRhZycgPT4gNSwKCQknemF0ZXJkYWcnID0+IDYsCgkJJ3pvbmRhZycgPT4gNywKCQkvLyBGcmVuY2gKCQknbHVuZGknID0+IDEsCgkJJ21hcmRpJyA9PiAyLAoJCSdtZXJjcmVkaScgPT4gMywKCQknamV1ZGknID0+IDQsCgkJJ3ZlbmRyZWRpJyA9PiA1LAoJCSdzYW1lZGknID0+IDYsCgkJJ2RpbWFuY2hlJyA9PiA3LAoJCS8vIEdlcm1hbgoJCSdtb250YWcnID0+IDEsCgkJJ2RpZW5zdGFnJyA9PiAyLAoJCSdtaXR0d29jaCcgPT4gMywKCQknZG9ubmVyc3RhZycgPT4gNCwKCQknZnJlaXRhZycgPT4gNSwKCQknc2Ftc3RhZycgPT4gNiwKCQknc29ubmFiZW5kJyA9PiA2LAoJCSdzb25udGFnJyA9PiA3LAoJCS8vIEl0YWxpYW4KCQknbHVuZWTDrCcgPT4gMSwKCQknbWFydGVkw6wnID0+IDIsCgkJJ21lcmNvbGVkw6wnID0+IDMsCgkJJ2dpb3ZlZMOsJyA9PiA0LAoJCSd2ZW5lcmTDrCcgPT4gNSwKCQknc2FiYXRvJyA9PiA2LAoJCSdkb21lbmljYScgPT4gNywKCQkvLyBTcGFuaXNoCgkJJ2x1bmVzJyA9PiAxLAoJCSdtYXJ0ZXMnID0+IDIsCgkJJ21pw6lyY29sZXMnID0+IDMsCgkJJ2p1ZXZlcycgPT4gNCwKCQkndmllcm5lcycgPT4gNSwKCQknc8OhYmFkbycgPT4gNiwKCQknZG9taW5nbycgPT4gNywKCQkvLyBGaW5uaXNoCgkJJ21hYW5hbnRhaScgPT4gMSwKCQkndGlpc3RhaScgPT4gMiwKCQkna2Vza2l2aWlra28nID0+IDMsCgkJJ3RvcnN0YWknID0+IDQsCgkJJ3BlcmphbnRhaScgPT4gNSwKCQknbGF1YW50YWknID0+IDYsCgkJJ3N1bm51bnRhaScgPT4gNywKCQkvLyBIdW5nYXJpYW4KCQknaMOpdGbFkScgPT4gMSwKCQkna2VkZCcgPT4gMiwKCQknc3plcmRhJyA9PiAzLAoJCSdjc8O8dMO2cnRvaycgPT4gNCwKCQkncMOpbnRlaycgPT4gNSwKCQknc3pvbWJhdCcgPT4gNiwKCQkndmFzw6FybmFwJyA9PiA3LAoJCS8vIEdyZWVrCgkJJ86UzrXPhScgPT4gMSwKCQknzqTPgc65JyA9PiAyLAoJCSfOpM61z4QnID0+IDMsCgkJJ86gzrXOvCcgPT4gNCwKCQknzqDOsc+BJyA9PiA1LAoJCSfOo86xzrInID0+IDYsCgkJJ86az4XPgScgPT4gNywKCSk7CgoJLyoqCgkgKiBMaXN0IG9mIG1vbnRocywgY2FsZW5kYXIgbW9udGggbmFtZSA9PiBjYWxlbmRhciBtb250aCBudW1iZXIKCSAqCgkgKiBAYWNjZXNzIHByb3RlY3RlZAoJICogQHZhciBhcnJheQoJICovCgl2YXIgJG1vbnRoID0gYXJyYXkoCgkJLy8gRW5nbGlzaAoJCSdqYW4nID0+IDEsCgkJJ2phbnVhcnknID0+IDEsCgkJJ2ZlYicgPT4gMiwKCQknZmVicnVhcnknID0+IDIsCgkJJ21hcicgPT4gMywKCQknbWFyY2gnID0+IDMsCgkJJ2FwcicgPT4gNCwKCQknYXByaWwnID0+IDQsCgkJJ21heScgPT4gNSwKCQkvLyBObyBsb25nIGZvcm0gb2YgTWF5CgkJJ2p1bicgPT4gNiwKCQknanVuZScgPT4gNiwKCQknanVsJyA9PiA3LAoJCSdqdWx5JyA9PiA3LAoJCSdhdWcnID0+IDgsCgkJJ2F1Z3VzdCcgPT4gOCwKCQknc2VwJyA9PiA5LAoJCSdzZXB0ZW1iZXInID0+IDgsCgkJJ29jdCcgPT4gMTAsCgkJJ29jdG9iZXInID0+IDEwLAoJCSdub3YnID0+IDExLAoJCSdub3ZlbWJlcicgPT4gMTEsCgkJJ2RlYycgPT4gMTIsCgkJJ2RlY2VtYmVyJyA9PiAxMiwKCQkvLyBEdXRjaAoJCSdqYW51YXJpJyA9PiAxLAoJCSdmZWJydWFyaScgPT4gMiwKCQknbWFhcnQnID0+IDMsCgkJJ2FwcmlsJyA9PiA0LAoJCSdtZWknID0+IDUsCgkJJ2p1bmknID0+IDYsCgkJJ2p1bGknID0+IDcsCgkJJ2F1Z3VzdHVzJyA9PiA4LAoJCSdzZXB0ZW1iZXInID0+IDksCgkJJ29rdG9iZXInID0+IDEwLAoJCSdub3ZlbWJlcicgPT4gMTEsCgkJJ2RlY2VtYmVyJyA9PiAxMiwKCQkvLyBGcmVuY2gKCQknamFudmllcicgPT4gMSwKCQknZsOpdnJpZXInID0+IDIsCgkJJ21hcnMnID0+IDMsCgkJJ2F2cmlsJyA9PiA0LAoJCSdtYWknID0+IDUsCgkJJ2p1aW4nID0+IDYsCgkJJ2p1aWxsZXQnID0+IDcsCgkJJ2Fvw7t0JyA9PiA4LAoJCSdzZXB0ZW1icmUnID0+IDksCgkJJ29jdG9icmUnID0+IDEwLAoJCSdub3ZlbWJyZScgPT4gMTEsCgkJJ2TDqWNlbWJyZScgPT4gMTIsCgkJLy8gR2VybWFuCgkJJ2phbnVhcicgPT4gMSwKCQknZmVicnVhcicgPT4gMiwKCQknbcOkcnonID0+IDMsCgkJJ2FwcmlsJyA9PiA0LAoJCSdtYWknID0+IDUsCgkJJ2p1bmknID0+IDYsCgkJJ2p1bGknID0+IDcsCgkJJ2F1Z3VzdCcgPT4gOCwKCQknc2VwdGVtYmVyJyA9PiA5LAoJCSdva3RvYmVyJyA9PiAxMCwKCQknbm92ZW1iZXInID0+IDExLAoJCSdkZXplbWJlcicgPT4gMTIsCgkJLy8gSXRhbGlhbgoJCSdnZW5uYWlvJyA9PiAxLAoJCSdmZWJicmFpbycgPT4gMiwKCQknbWFyem8nID0+IDMsCgkJJ2FwcmlsZScgPT4gNCwKCQknbWFnZ2lvJyA9PiA1LAoJCSdnaXVnbm8nID0+IDYsCgkJJ2x1Z2xpbycgPT4gNywKCQknYWdvc3RvJyA9PiA4LAoJCSdzZXR0ZW1icmUnID0+IDksCgkJJ290dG9icmUnID0+IDEwLAoJCSdub3ZlbWJyZScgPT4gMTEsCgkJJ2RpY2VtYnJlJyA9PiAxMiwKCQkvLyBTcGFuaXNoCgkJJ2VuZXJvJyA9PiAxLAoJCSdmZWJyZXJvJyA9PiAyLAoJCSdtYXJ6bycgPT4gMywKCQknYWJyaWwnID0+IDQsCgkJJ21heW8nID0+IDUsCgkJJ2p1bmlvJyA9PiA2LAoJCSdqdWxpbycgPT4gNywKCQknYWdvc3RvJyA9PiA4LAoJCSdzZXB0aWVtYnJlJyA9PiA5LAoJCSdzZXRpZW1icmUnID0+IDksCgkJJ29jdHVicmUnID0+IDEwLAoJCSdub3ZpZW1icmUnID0+IDExLAoJCSdkaWNpZW1icmUnID0+IDEyLAoJCS8vIEZpbm5pc2gKCQkndGFtbWlrdXUnID0+IDEsCgkJJ2hlbG1pa3V1JyA9PiAyLAoJCSdtYWFsaXNrdXUnID0+IDMsCgkJJ2h1aHRpa3V1JyA9PiA0LAoJCSd0b3Vrb2t1dScgPT4gNSwKCQkna2Vzw6RrdXUnID0+IDYsCgkJJ2hlaW7DpGt1dScgPT4gNywKCQknZWxva3V1JyA9PiA4LAoJCSdzdXVza3V1JyA9PiA5LAoJCSdsb2tha3V1JyA9PiAxMCwKCQknbWFycmFzJyA9PiAxMSwKCQknam91bHVrdXUnID0+IDEyLAoJCS8vIEh1bmdhcmlhbgoJCSdqYW51w6FyJyA9PiAxLAoJCSdmZWJydcOhcicgPT4gMiwKCQknbcOhcmNpdXMnID0+IDMsCgkJJ8OhcHJpbGlzJyA9PiA0LAoJCSdtw6FqdXMnID0+IDUsCgkJJ2rDum5pdXMnID0+IDYsCgkJJ2rDumxpdXMnID0+IDcsCgkJJ2F1Z3VzenR1cycgPT4gOCwKCQknc3plcHRlbWJlcicgPT4gOSwKCQknb2t0w7NiZXInID0+IDEwLAoJCSdub3ZlbWJlcicgPT4gMTEsCgkJJ2RlY2VtYmVyJyA9PiAxMiwKCQkvLyBHcmVlawoJCSfOmc6xzr0nID0+IDEsCgkJJ86mzrXOsicgPT4gMiwKCQknzpzOrM+OJyA9PiAzLAoJCSfOnM6xz44nID0+IDMsCgkJJ86Rz4DPgScgPT4gNCwKCQknzpzOrM65JyA9PiA1LAoJCSfOnM6xz4onID0+IDUsCgkJJ86czrHOuScgPT4gNSwKCQknzpnOv8+Nzr0nID0+IDYsCgkJJ86Zzr/OvScgPT4gNiwKCQknzpnOv8+NzrsnID0+IDcsCgkJJ86Zzr/OuycgPT4gNywKCQknzpHPjc6zJyA9PiA4LAoJCSfOkc+FzrMnID0+IDgsCgkJJ86jzrXPgCcgPT4gOSwKCQknzp/Ous+EJyA9PiAxMCwKCQknzp3Ov86tJyA9PiAxMSwKCQknzpTOtc66JyA9PiAxMiwKCSk7CgoJLyoqCgkgKiBMaXN0IG9mIHRpbWV6b25lcywgYWJicmV2aWF0aW9uID0+IG9mZnNldCBmcm9tIFVUQwoJICoKCSAqIEBhY2Nlc3MgcHJvdGVjdGVkCgkgKiBAdmFyIGFycmF5CgkgKi8KCXZhciAkdGltZXpvbmUgPSBhcnJheSgKCQknQUNEVCcgPT4gMzc4MDAsCgkJJ0FDSVQnID0+IDI4ODAwLAoJCSdBQ1NUJyA9PiAzNDIwMCwKCQknQUNUJyA9PiAtMTgwMDAsCgkJJ0FDV0RUJyA9PiAzNTEwMCwKCQknQUNXU1QnID0+IDMxNTAwLAoJCSdBRURUJyA9PiAzOTYwMCwKCQknQUVTVCcgPT4gMzYwMDAsCgkJJ0FGVCcgPT4gMTYyMDAsCgkJJ0FLRFQnID0+IC0yODgwMCwKCQknQUtTVCcgPT4gLTMyNDAwLAoJCSdBTURUJyA9PiAxODAwMCwKCQknQU1UJyA9PiAtMTQ0MDAsCgkJJ0FOQVNUJyA9PiA0NjgwMCwKCQknQU5BVCcgPT4gNDMyMDAsCgkJJ0FSVCcgPT4gLTEwODAwLAoJCSdBWk9TVCcgPT4gLTM2MDAsCgkJJ0FaU1QnID0+IDE4MDAwLAoJCSdBWlQnID0+IDE0NDAwLAoJCSdCSU9UJyA9PiAyMTYwMCwKCQknQklUJyA9PiAtNDMyMDAsCgkJJ0JPVCcgPT4gLTE0NDAwLAoJCSdCUlNUJyA9PiAtNzIwMCwKCQknQlJUJyA9PiAtMTA4MDAsCgkJJ0JTVCcgPT4gMzYwMCwKCQknQlRUJyA9PiAyMTYwMCwKCQknQ0FTVCcgPT4gMTgwMDAsCgkJJ0NBVCcgPT4gNzIwMCwKCQknQ0NUJyA9PiAyMzQwMCwKCQknQ0RUJyA9PiAtMTgwMDAsCgkJJ0NFRFQnID0+IDcyMDAsCgkJJ0NFVCcgPT4gMzYwMCwKCQknQ0dTVCcgPT4gLTcyMDAsCgkJJ0NHVCcgPT4gLTEwODAwLAoJCSdDSEFEVCcgPT4gNDk1MDAsCgkJJ0NIQVNUJyA9PiA0NTkwMCwKCQknQ0lTVCcgPT4gLTI4ODAwLAoJCSdDS1QnID0+IC0zNjAwMCwKCQknQ0xEVCcgPT4gLTEwODAwLAoJCSdDTFNUJyA9PiAtMTQ0MDAsCgkJJ0NPVCcgPT4gLTE4MDAwLAoJCSdDU1QnID0+IC0yMTYwMCwKCQknQ1ZUJyA9PiAtMzYwMCwKCQknQ1hUJyA9PiAyNTIwMCwKCQknREFWVCcgPT4gMjUyMDAsCgkJJ0RUQVQnID0+IDM2MDAwLAoJCSdFQURUJyA9PiAtMTgwMDAsCgkJJ0VBU1QnID0+IC0yMTYwMCwKCQknRUFUJyA9PiAxMDgwMCwKCQknRUNUJyA9PiAtMTgwMDAsCgkJJ0VEVCcgPT4gLTE0NDAwLAoJCSdFRVNUJyA9PiAxMDgwMCwKCQknRUVUJyA9PiA3MjAwLAoJCSdFR1QnID0+IC0zNjAwLAoJCSdFS1NUJyA9PiAyMTYwMCwKCQknRVNUJyA9PiAtMTgwMDAsCgkJJ0ZKVCcgPT4gNDMyMDAsCgkJJ0ZLRFQnID0+IC0xMDgwMCwKCQknRktTVCcgPT4gLTE0NDAwLAoJCSdGTlQnID0+IC03MjAwLAoJCSdHQUxUJyA9PiAtMjE2MDAsCgkJJ0dFRFQnID0+IDE0NDAwLAoJCSdHRVNUJyA9PiAxMDgwMCwKCQknR0ZUJyA9PiAtMTA4MDAsCgkJJ0dJTFQnID0+IDQzMjAwLAoJCSdHSVQnID0+IC0zMjQwMCwKCQknR1NUJyA9PiAxNDQwMCwKCQknR1NUJyA9PiAtNzIwMCwKCQknR1lUJyA9PiAtMTQ0MDAsCgkJJ0hBQScgPT4gLTEwODAwLAoJCSdIQUMnID0+IC0xODAwMCwKCQknSEFEVCcgPT4gLTMyNDAwLAoJCSdIQUUnID0+IC0xNDQwMCwKCQknSEFQJyA9PiAtMjUyMDAsCgkJJ0hBUicgPT4gLTIxNjAwLAoJCSdIQVNUJyA9PiAtMzYwMDAsCgkJJ0hBVCcgPT4gLTkwMDAsCgkJJ0hBWScgPT4gLTI4ODAwLAoJCSdIS1NUJyA9PiAyODgwMCwKCQknSE1UJyA9PiAxODAwMCwKCQknSE5BJyA9PiAtMTQ0MDAsCgkJJ0hOQycgPT4gLTIxNjAwLAoJCSdITkUnID0+IC0xODAwMCwKCQknSE5QJyA9PiAtMjg4MDAsCgkJJ0hOUicgPT4gLTI1MjAwLAoJCSdITlQnID0+IC0xMjYwMCwKCQknSE5ZJyA9PiAtMzI0MDAsCgkJJ0lSRFQnID0+IDE2MjAwLAoJCSdJUktTVCcgPT4gMzI0MDAsCgkJJ0lSS1QnID0+IDI4ODAwLAoJCSdJUlNUJyA9PiAxMjYwMCwKCQknSkZEVCcgPT4gLTEwODAwLAoJCSdKRlNUJyA9PiAtMTQ0MDAsCgkJJ0pTVCcgPT4gMzI0MDAsCgkJJ0tHU1QnID0+IDIxNjAwLAoJCSdLR1QnID0+IDE4MDAwLAoJCSdLT1NUJyA9PiAzOTYwMCwKCQknS09WU1QnID0+IDI4ODAwLAoJCSdLT1ZUJyA9PiAyNTIwMCwKCQknS1JBU1QnID0+IDI4ODAwLAoJCSdLUkFUJyA9PiAyNTIwMCwKCQknS1NUJyA9PiAzMjQwMCwKCQknTEhEVCcgPT4gMzk2MDAsCgkJJ0xIU1QnID0+IDM3ODAwLAoJCSdMSU5UJyA9PiA1MDQwMCwKCQknTEtUJyA9PiAyMTYwMCwKCQknTUFHU1QnID0+IDQzMjAwLAoJCSdNQUdUJyA9PiAzOTYwMCwKCQknTUFXVCcgPT4gMjE2MDAsCgkJJ01EVCcgPT4gLTIxNjAwLAoJCSdNRVNaJyA9PiA3MjAwLAoJCSdNRVonID0+IDM2MDAsCgkJJ01IVCcgPT4gNDMyMDAsCgkJJ01JVCcgPT4gLTM0MjAwLAoJCSdNTlNUJyA9PiAzMjQwMCwKCQknTVNEVCcgPT4gMTQ0MDAsCgkJJ01TU1QnID0+IDEwODAwLAoJCSdNU1QnID0+IC0yNTIwMCwKCQknTVVUJyA9PiAxNDQwMCwKCQknTVZUJyA9PiAxODAwMCwKCQknTVlUJyA9PiAyODgwMCwKCQknTkNUJyA9PiAzOTYwMCwKCQknTkRUJyA9PiAtOTAwMCwKCQknTkZUJyA9PiA0MTQwMCwKCQknTk1JVCcgPT4gMzYwMDAsCgkJJ05PVlNUJyA9PiAyNTIwMCwKCQknTk9WVCcgPT4gMjE2MDAsCgkJJ05QVCcgPT4gMjA3MDAsCgkJJ05SVCcgPT4gNDMyMDAsCgkJJ05TVCcgPT4gLTEyNjAwLAoJCSdOVVQnID0+IC0zOTYwMCwKCQknTlpEVCcgPT4gNDY4MDAsCgkJJ05aU1QnID0+IDQzMjAwLAoJCSdPTVNTVCcgPT4gMjUyMDAsCgkJJ09NU1QnID0+IDIxNjAwLAoJCSdQRFQnID0+IC0yNTIwMCwKCQknUEVUJyA9PiAtMTgwMDAsCgkJJ1BFVFNUJyA9PiA0NjgwMCwKCQknUEVUVCcgPT4gNDMyMDAsCgkJJ1BHVCcgPT4gMzYwMDAsCgkJJ1BIT1QnID0+IDQ2ODAwLAoJCSdQSFQnID0+IDI4ODAwLAoJCSdQS1QnID0+IDE4MDAwLAoJCSdQTURUJyA9PiAtNzIwMCwKCQknUE1TVCcgPT4gLTEwODAwLAoJCSdQT05UJyA9PiAzOTYwMCwKCQknUFNUJyA9PiAtMjg4MDAsCgkJJ1BXVCcgPT4gMzI0MDAsCgkJJ1BZU1QnID0+IC0xMDgwMCwKCQknUFlUJyA9PiAtMTQ0MDAsCgkJJ1JFVCcgPT4gMTQ0MDAsCgkJJ1JPVFQnID0+IC0xMDgwMCwKCQknU0FNU1QnID0+IDE4MDAwLAoJCSdTQU1UJyA9PiAxNDQwMCwKCQknU0FTVCcgPT4gNzIwMCwKCQknU0JUJyA9PiAzOTYwMCwKCQknU0NEVCcgPT4gNDY4MDAsCgkJJ1NDU1QnID0+IDQzMjAwLAoJCSdTQ1QnID0+IDE0NDAwLAoJCSdTRVNUJyA9PiAzNjAwLAoJCSdTR1QnID0+IDI4ODAwLAoJCSdTSVQnID0+IDI4ODAwLAoJCSdTUlQnID0+IC0xMDgwMCwKCQknU1NUJyA9PiAtMzk2MDAsCgkJJ1NZU1QnID0+IDEwODAwLAoJCSdTWVQnID0+IDcyMDAsCgkJJ1RGVCcgPT4gMTgwMDAsCgkJJ1RIQVQnID0+IC0zNjAwMCwKCQknVEpUJyA9PiAxODAwMCwKCQknVEtUJyA9PiAtMzYwMDAsCgkJJ1RNVCcgPT4gMTgwMDAsCgkJJ1RPVCcgPT4gNDY4MDAsCgkJJ1RQVCcgPT4gMzI0MDAsCgkJJ1RSVVQnID0+IDM2MDAwLAoJCSdUVlQnID0+IDQzMjAwLAoJCSdUV1QnID0+IDI4ODAwLAoJCSdVWVNUJyA9PiAtNzIwMCwKCQknVVlUJyA9PiAtMTA4MDAsCgkJJ1VaVCcgPT4gMTgwMDAsCgkJJ1ZFVCcgPT4gLTE0NDAwLAoJCSdWTEFTVCcgPT4gMzk2MDAsCgkJJ1ZMQVQnID0+IDM2MDAwLAoJCSdWT1NUJyA9PiAyMTYwMCwKCQknVlVUJyA9PiAzOTYwMCwKCQknV0FTVCcgPT4gNzIwMCwKCQknV0FUJyA9PiAzNjAwLAoJCSdXRFQnID0+IDMyNDAwLAoJCSdXRVNUJyA9PiAzNjAwLAoJCSdXRlQnID0+IDQzMjAwLAoJCSdXSUInID0+IDI1MjAwLAoJCSdXSVQnID0+IDMyNDAwLAoJCSdXSVRBJyA9PiAyODgwMCwKCQknV0tTVCcgPT4gMTgwMDAsCgkJJ1dTVCcgPT4gMjg4MDAsCgkJJ1lBS1NUJyA9PiAzNjAwMCwKCQknWUFLVCcgPT4gMzI0MDAsCgkJJ1lBUFQnID0+IDM2MDAwLAoJCSdZRUtTVCcgPT4gMjE2MDAsCgkJJ1lFS1QnID0+IDE4MDAwLAoJKTsKCgkvKioKCSAqIENhY2hlZCBQQ1JFIGZvciBTaW1wbGVQaWVfUGFyc2VfRGF0ZTo6JGRheQoJICoKCSAqIEBhY2Nlc3MgcHJvdGVjdGVkCgkgKiBAdmFyIHN0cmluZwoJICovCgl2YXIgJGRheV9wY3JlOwoKCS8qKgoJICogQ2FjaGVkIFBDUkUgZm9yIFNpbXBsZVBpZV9QYXJzZV9EYXRlOjokbW9udGgKCSAqCgkgKiBAYWNjZXNzIHByb3RlY3RlZAoJICogQHZhciBzdHJpbmcKCSAqLwoJdmFyICRtb250aF9wY3JlOwoKCS8qKgoJICogQXJyYXkgb2YgdXNlci1hZGRlZCBjYWxsYmFjayBtZXRob2RzCgkgKgoJICogQGFjY2VzcyBwcml2YXRlCgkgKiBAdmFyIGFycmF5CgkgKi8KCXZhciAkYnVpbHRfaW4gPSBhcnJheSgpOwoKCS8qKgoJICogQXJyYXkgb2YgdXNlci1hZGRlZCBjYWxsYmFjayBtZXRob2RzCgkgKgoJICogQGFjY2VzcyBwcml2YXRlCgkgKiBAdmFyIGFycmF5CgkgKi8KCXZhciAkdXNlciA9IGFycmF5KCk7CgoJLyoqCgkgKiBDcmVhdGUgbmV3IFNpbXBsZVBpZV9QYXJzZV9EYXRlIG9iamVjdCwgYW5kIHNldCBzZWxmOjpkYXlfcGNyZSwKCSAqIHNlbGY6Om1vbnRoX3BjcmUsIGFuZCBzZWxmOjpidWlsdF9pbgoJICoKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCglmdW5jdGlvbiBTaW1wbGVQaWVfUGFyc2VfRGF0ZSgpCgl7CgkJJHRoaXMtPmRheV9wY3JlID0gJygnIC4gaW1wbG9kZShhcnJheV9rZXlzKCR0aGlzLT5kYXkpLCAnfCcpIC4gJyknOwoJCSR0aGlzLT5tb250aF9wY3JlID0gJygnIC4gaW1wbG9kZShhcnJheV9rZXlzKCR0aGlzLT5tb250aCksICd8JykgLiAnKSc7CgoJCXN0YXRpYyAkY2FjaGU7CgkJaWYgKCFpc3NldCgkY2FjaGVbZ2V0X2NsYXNzKCR0aGlzKV0pKQoJCXsKCQkJaWYgKGV4dGVuc2lvbl9sb2FkZWQoJ1JlZmxlY3Rpb24nKSkKCQkJewoJCQkJJGNsYXNzID0gbmV3IFJlZmxlY3Rpb25DbGFzcyhnZXRfY2xhc3MoJHRoaXMpKTsKCQkJCSRtZXRob2RzID0gJGNsYXNzLT5nZXRNZXRob2RzKCk7CgkJCQkkYWxsX21ldGhvZHMgPSBhcnJheSgpOwoJCQkJZm9yZWFjaCAoJG1ldGhvZHMgYXMgJG1ldGhvZCkKCQkJCXsKCQkJCQkkYWxsX21ldGhvZHNbXSA9ICRtZXRob2QtPmdldE5hbWUoKTsKCQkJCX0KCQkJfQoJCQllbHNlCgkJCXsKCQkJCSRhbGxfbWV0aG9kcyA9IGdldF9jbGFzc19tZXRob2RzKCR0aGlzKTsKCQkJfQoKCQkJZm9yZWFjaCAoJGFsbF9tZXRob2RzIGFzICRtZXRob2QpCgkJCXsKCQkJCWlmIChzdHJ0b2xvd2VyKHN1YnN0cigkbWV0aG9kLCAwLCA1KSkgPT09ICdkYXRlXycpCgkJCQl7CgkJCQkJJGNhY2hlW2dldF9jbGFzcygkdGhpcyldW10gPSAkbWV0aG9kOwoJCQkJfQoJCQl9CgkJfQoKCQlmb3JlYWNoICgkY2FjaGVbZ2V0X2NsYXNzKCR0aGlzKV0gYXMgJG1ldGhvZCkKCQl7CgkJCSR0aGlzLT5idWlsdF9pbltdID0gJG1ldGhvZDsKCQl9Cgl9CgoJLyoqCgkgKiBHZXQgdGhlIG9iamVjdAoJICoKCSAqIEBhY2Nlc3MgcHVibGljCgkgKi8KCWZ1bmN0aW9uIGdldCgpCgl7CgkJc3RhdGljICRvYmplY3Q7CgkJaWYgKCEkb2JqZWN0KQoJCXsKCQkJJG9iamVjdCA9IG5ldyBTaW1wbGVQaWVfUGFyc2VfRGF0ZTsKCQl9CgkJcmV0dXJuICRvYmplY3Q7Cgl9CgoJLyoqCgkgKiBQYXJzZSBhIGRhdGUKCSAqCgkgKiBAZmluYWwKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAcGFyYW0gc3RyaW5nICRkYXRlIERhdGUgdG8gcGFyc2UKCSAqIEByZXR1cm4gaW50IFRpbWVzdGFtcCBjb3JyZXNwb25kaW5nIHRvIGRhdGUgc3RyaW5nLCBvciBmYWxzZSBvbiBmYWlsdXJlCgkgKi8KCWZ1bmN0aW9uIHBhcnNlKCRkYXRlKQoJewoJCWZvcmVhY2ggKCR0aGlzLT51c2VyIGFzICRtZXRob2QpCgkJewoJCQlpZiAoKCRyZXR1cm5lZCA9IGNhbGxfdXNlcl9mdW5jKCRtZXRob2QsICRkYXRlKSkgIT09IGZhbHNlKQoJCQl7CgkJCQlyZXR1cm4gJHJldHVybmVkOwoJCQl9CgkJfQoKCQlmb3JlYWNoICgkdGhpcy0+YnVpbHRfaW4gYXMgJG1ldGhvZCkKCQl7CgkJCWlmICgoJHJldHVybmVkID0gY2FsbF91c2VyX2Z1bmMoYXJyYXkoJiR0aGlzLCAkbWV0aG9kKSwgJGRhdGUpKSAhPT0gZmFsc2UpCgkJCXsKCQkJCXJldHVybiAkcmV0dXJuZWQ7CgkJCX0KCQl9CgoJCXJldHVybiBmYWxzZTsKCX0KCgkvKioKCSAqIEFkZCBhIGNhbGxiYWNrIG1ldGhvZCB0byBwYXJzZSBhIGRhdGUKCSAqCgkgKiBAZmluYWwKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAcGFyYW0gY2FsbGJhY2sgJGNhbGxiYWNrCgkgKi8KCWZ1bmN0aW9uIGFkZF9jYWxsYmFjaygkY2FsbGJhY2spCgl7CgkJaWYgKGlzX2NhbGxhYmxlKCRjYWxsYmFjaykpCgkJewoJCQkkdGhpcy0+dXNlcltdID0gJGNhbGxiYWNrOwoJCX0KCQllbHNlCgkJewoJCQl0cmlnZ2VyX2Vycm9yKCdVc2VyLXN1cHBsaWVkIGZ1bmN0aW9uIG11c3QgYmUgYSB2YWxpZCBjYWxsYmFjaycsIEVfVVNFUl9XQVJOSU5HKTsKCQl9Cgl9CgoJLyoqCgkgKiBQYXJzZSBhIHN1cGVyc2V0IG9mIFczQy1EVEYgKGFsbG93cyBoeXBoZW5zIGFuZCBjb2xvbnMgdG8gYmUgb21pdHRlZCwgYXMKCSAqIHdlbGwgYXMgYWxsb3dpbmcgYW55IG9mIHVwcGVyIG9yIGxvd2VyIGNhc2UgIlQiLCBob3Jpem9udGFsIHRhYnMsIG9yCgkgKiBzcGFjZXMgdG8gYmUgdXNlZCBhcyB0aGUgdGltZSBzZXBlcmF0b3IgKGluY2x1ZGluZyBtb3JlIHRoYW4gb25lKSkKCSAqCgkgKiBAYWNjZXNzIHByb3RlY3RlZAoJICogQHJldHVybiBpbnQgVGltZXN0YW1wCgkgKi8KCWZ1bmN0aW9uIGRhdGVfdzNjZHRmKCRkYXRlKQoJewoJCXN0YXRpYyAkcGNyZTsKCQlpZiAoISRwY3JlKQoJCXsKCQkJJHllYXIgPSAnKFswLTldezR9KSc7CgkJCSRtb250aCA9ICRkYXkgPSAkaG91ciA9ICRtaW51dGUgPSAkc2Vjb25kID0gJyhbMC05XXsyfSknOwoJCQkkZGVjaW1hbCA9ICcoWzAtOV0qKSc7CgkJCSR6b25lID0gJyg/OihaKXwoWytcLV0pKFswLTldezEsMn0pOj8oWzAtOV17MSwyfSkpJzsKCQkJJHBjcmUgPSAnL14nIC4gJHllYXIgLiAnKD86LT8nIC4gJG1vbnRoIC4gJyg/Oi0/JyAuICRkYXkgLiAnKD86W1R0XHgwOVx4MjBdKycgLiAkaG91ciAuICcoPzo6PycgLiAkbWludXRlIC4gJyg/Ojo/JyAuICRzZWNvbmQgLiAnKD86LicgLiAkZGVjaW1hbCAuICcpPyk/KT8nIC4gJHpvbmUgLiAnKT8pPyk/JC8nOwoJCX0KCQlpZiAocHJlZ19tYXRjaCgkcGNyZSwgJGRhdGUsICRtYXRjaCkpCgkJewoJCQkvKgoJCQlDYXB0dXJpbmcgc3VicGF0dGVybnM6CgkJCTE6IFllYXIKCQkJMjogTW9udGgKCQkJMzogRGF5CgkJCTQ6IEhvdXIKCQkJNTogTWludXRlCgkJCTY6IFNlY29uZAoJCQk3OiBEZWNpbWFsIGZyYWN0aW9uIG9mIGEgc2Vjb25kCgkJCTg6IFp1bHUKCQkJOTogVGltZXpvbmUgwrEKCQkJMTA6IFRpbWV6b25lIGhvdXJzCgkJCTExOiBUaW1lem9uZSBtaW51dGVzCgkJCSovCgoJCQkvLyBGaWxsIGluIGVtcHR5IG1hdGNoZXMKCQkJZm9yICgkaSA9IGNvdW50KCRtYXRjaCk7ICRpIDw9IDM7ICRpKyspCgkJCXsKCQkJCSRtYXRjaFskaV0gPSAnMSc7CgkJCX0KCgkJCWZvciAoJGkgPSBjb3VudCgkbWF0Y2gpOyAkaSA8PSA3OyAkaSsrKQoJCQl7CgkJCQkkbWF0Y2hbJGldID0gJzAnOwoJCQl9CgoJCQkvLyBOdW1lcmljIHRpbWV6b25lCgkJCWlmIChpc3NldCgkbWF0Y2hbOV0pICYmICRtYXRjaFs5XSAhPT0gJycpCgkJCXsKCQkJCSR0aW1lem9uZSA9ICRtYXRjaFsxMF0gKiAzNjAwOwoJCQkJJHRpbWV6b25lICs9ICRtYXRjaFsxMV0gKiA2MDsKCQkJCWlmICgkbWF0Y2hbOV0gPT09ICctJykKCQkJCXsKCQkJCQkkdGltZXpvbmUgPSAwIC0gJHRpbWV6b25lOwoJCQkJfQoJCQl9CgkJCWVsc2UKCQkJewoJCQkJJHRpbWV6b25lID0gMDsKCQkJfQoKCQkJLy8gQ29udmVydCB0aGUgbnVtYmVyIG9mIHNlY29uZHMgdG8gYW4gaW50ZWdlciwgdGFraW5nIGRlY2ltYWxzIGludG8gYWNjb3VudAoJCQkkc2Vjb25kID0gcm91bmQoJG1hdGNoWzZdICsgJG1hdGNoWzddIC8gcG93KDEwLCBzdHJsZW4oJG1hdGNoWzddKSkpOwoKCQkJcmV0dXJuIGdtbWt0aW1lKCRtYXRjaFs0XSwgJG1hdGNoWzVdLCAkc2Vjb25kLCAkbWF0Y2hbMl0sICRtYXRjaFszXSwgJG1hdGNoWzFdKSAtICR0aW1lem9uZTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCX0KCgkvKioKCSAqIFJlbW92ZSBSRkM4MjIgY29tbWVudHMKCSAqCgkgKiBAYWNjZXNzIHByb3RlY3RlZAoJICogQHBhcmFtIHN0cmluZyAkZGF0YSBEYXRhIHRvIHN0cmlwIGNvbW1lbnRzIGZyb20KCSAqIEByZXR1cm4gc3RyaW5nIENvbW1lbnQgc3RyaXBwZWQgc3RyaW5nCgkgKi8KCWZ1bmN0aW9uIHJlbW92ZV9yZmMyODIyX2NvbW1lbnRzKCRzdHJpbmcpCgl7CgkJJHN0cmluZyA9IChzdHJpbmcpICRzdHJpbmc7CgkJJHBvc2l0aW9uID0gMDsKCQkkbGVuZ3RoID0gc3RybGVuKCRzdHJpbmcpOwoJCSRkZXB0aCA9IDA7CgoJCSRvdXRwdXQgPSAnJzsKCgkJd2hpbGUgKCRwb3NpdGlvbiA8ICRsZW5ndGggJiYgKCRwb3MgPSBzdHJwb3MoJHN0cmluZywgJygnLCAkcG9zaXRpb24pKSAhPT0gZmFsc2UpCgkJewoJCQkkb3V0cHV0IC49IHN1YnN0cigkc3RyaW5nLCAkcG9zaXRpb24sICRwb3MgLSAkcG9zaXRpb24pOwoJCQkkcG9zaXRpb24gPSAkcG9zICsgMTsKCQkJaWYgKCRzdHJpbmdbJHBvcyAtIDFdICE9PSAnXFwnKQoJCQl7CgkJCQkkZGVwdGgrKzsKCQkJCXdoaWxlICgkZGVwdGggJiYgJHBvc2l0aW9uIDwgJGxlbmd0aCkKCQkJCXsKCQkJCQkkcG9zaXRpb24gKz0gc3RyY3Nwbigkc3RyaW5nLCAnKCknLCAkcG9zaXRpb24pOwoJCQkJCWlmICgkc3RyaW5nWyRwb3NpdGlvbiAtIDFdID09PSAnXFwnKQoJCQkJCXsKCQkJCQkJJHBvc2l0aW9uKys7CgkJCQkJCWNvbnRpbnVlOwoJCQkJCX0KCQkJCQllbHNlaWYgKGlzc2V0KCRzdHJpbmdbJHBvc2l0aW9uXSkpCgkJCQkJewoJCQkJCQlzd2l0Y2ggKCRzdHJpbmdbJHBvc2l0aW9uXSkKCQkJCQkJewoJCQkJCQkJY2FzZSAnKCc6CgkJCQkJCQkJJGRlcHRoKys7CgkJCQkJCQkJYnJlYWs7CgoJCQkJCQkJY2FzZSAnKSc6CgkJCQkJCQkJJGRlcHRoLS07CgkJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQkJJHBvc2l0aW9uKys7CgkJCQkJfQoJCQkJCWVsc2UKCQkJCQl7CgkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCX0KCQkJfQoJCQllbHNlCgkJCXsKCQkJCSRvdXRwdXQgLj0gJygnOwoJCQl9CgkJfQoJCSRvdXRwdXQgLj0gc3Vic3RyKCRzdHJpbmcsICRwb3NpdGlvbik7CgoJCXJldHVybiAkb3V0cHV0OwoJfQoKCS8qKgoJICogUGFyc2UgUkZDMjgyMidzIGRhdGUgZm9ybWF0CgkgKgoJICogQGFjY2VzcyBwcm90ZWN0ZWQKCSAqIEByZXR1cm4gaW50IFRpbWVzdGFtcAoJICovCglmdW5jdGlvbiBkYXRlX3JmYzI4MjIoJGRhdGUpCgl7CgkJc3RhdGljICRwY3JlOwoJCWlmICghJHBjcmUpCgkJewoJCQkkd3NwID0gJ1tceDA5XHgyMF0nOwoJCQkkZndzID0gJyg/OicgLiAkd3NwIC4gJyt8JyAuICR3c3AgLiAnKig/Olx4MERceDBBJyAuICR3c3AgLiAnKykrKSc7CgkJCSRvcHRpb25hbF9md3MgPSAkZndzIC4gJz8nOwoJCQkkZGF5X25hbWUgPSAkdGhpcy0+ZGF5X3BjcmU7CgkJCSRtb250aCA9ICR0aGlzLT5tb250aF9wY3JlOwoJCQkkZGF5ID0gJyhbMC05XXsxLDJ9KSc7CgkJCSRob3VyID0gJG1pbnV0ZSA9ICRzZWNvbmQgPSAnKFswLTldezJ9KSc7CgkJCSR5ZWFyID0gJyhbMC05XXsyLDR9KSc7CgkJCSRudW1fem9uZSA9ICcoWytcLV0pKFswLTldezJ9KShbMC05XXsyfSknOwoJCQkkY2hhcmFjdGVyX3pvbmUgPSAnKFtBLVpdezEsNX0pJzsKCQkJJHpvbmUgPSAnKD86JyAuICRudW1fem9uZSAuICd8JyAuICRjaGFyYWN0ZXJfem9uZSAuICcpJzsKCQkJJHBjcmUgPSAnLyg/OicgLiAkb3B0aW9uYWxfZndzIC4gJGRheV9uYW1lIC4gJG9wdGlvbmFsX2Z3cyAuICcsKT8nIC4gJG9wdGlvbmFsX2Z3cyAuICRkYXkgLiAkZndzIC4gJG1vbnRoIC4gJGZ3cyAuICR5ZWFyIC4gJGZ3cyAuICRob3VyIC4gJG9wdGlvbmFsX2Z3cyAuICc6JyAuICRvcHRpb25hbF9md3MgLiAkbWludXRlIC4gJyg/OicgLiAkb3B0aW9uYWxfZndzIC4gJzonIC4gJG9wdGlvbmFsX2Z3cyAuICRzZWNvbmQgLiAnKT8nIC4gJGZ3cyAuICR6b25lIC4gJy9pJzsKCQl9CgkJaWYgKHByZWdfbWF0Y2goJHBjcmUsICR0aGlzLT5yZW1vdmVfcmZjMjgyMl9jb21tZW50cygkZGF0ZSksICRtYXRjaCkpCgkJewoJCQkvKgoJCQlDYXB0dXJpbmcgc3VicGF0dGVybnM6CgkJCTE6IERheSBuYW1lCgkJCTI6IERheQoJCQkzOiBNb250aAoJCQk0OiBZZWFyCgkJCTU6IEhvdXIKCQkJNjogTWludXRlCgkJCTc6IFNlY29uZAoJCQk4OiBUaW1lem9uZSDCsQoJCQk5OiBUaW1lem9uZSBob3VycwoJCQkxMDogVGltZXpvbmUgbWludXRlcwoJCQkxMTogQWxwaGFiZXRpYyB0aW1lem9uZQoJCQkqLwoKCQkJLy8gRmluZCB0aGUgbW9udGggbnVtYmVyCgkJCSRtb250aCA9ICR0aGlzLT5tb250aFtzdHJ0b2xvd2VyKCRtYXRjaFszXSldOwoKCQkJLy8gTnVtZXJpYyB0aW1lem9uZQoJCQlpZiAoJG1hdGNoWzhdICE9PSAnJykKCQkJewoJCQkJJHRpbWV6b25lID0gJG1hdGNoWzldICogMzYwMDsKCQkJCSR0aW1lem9uZSArPSAkbWF0Y2hbMTBdICogNjA7CgkJCQlpZiAoJG1hdGNoWzhdID09PSAnLScpCgkJCQl7CgkJCQkJJHRpbWV6b25lID0gMCAtICR0aW1lem9uZTsKCQkJCX0KCQkJfQoJCQkvLyBDaGFyYWN0ZXIgdGltZXpvbmUKCQkJZWxzZWlmIChpc3NldCgkdGhpcy0+dGltZXpvbmVbc3RydG91cHBlcigkbWF0Y2hbMTFdKV0pKQoJCQl7CgkJCQkkdGltZXpvbmUgPSAkdGhpcy0+dGltZXpvbmVbc3RydG91cHBlcigkbWF0Y2hbMTFdKV07CgkJCX0KCQkJLy8gQXNzdW1lIGV2ZXJ5dGhpbmcgZWxzZSB0byBiZSAtMDAwMAoJCQllbHNlCgkJCXsKCQkJCSR0aW1lem9uZSA9IDA7CgkJCX0KCgkJCS8vIERlYWwgd2l0aCAyLzMgZGlnaXQgeWVhcnMKCQkJaWYgKCRtYXRjaFs0XSA8IDUwKQoJCQl7CgkJCQkkbWF0Y2hbNF0gKz0gMjAwMDsKCQkJfQoJCQllbHNlaWYgKCRtYXRjaFs0XSA8IDEwMDApCgkJCXsKCQkJCSRtYXRjaFs0XSArPSAxOTAwOwoJCQl9CgoJCQkvLyBTZWNvbmQgaXMgb3B0aW9uYWwsIGlmIGl0IGlzIGVtcHR5IHNldCBpdCB0byB6ZXJvCgkJCWlmICgkbWF0Y2hbN10gIT09ICcnKQoJCQl7CgkJCQkkc2Vjb25kID0gJG1hdGNoWzddOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJJHNlY29uZCA9IDA7CgkJCX0KCgkJCXJldHVybiBnbW1rdGltZSgkbWF0Y2hbNV0sICRtYXRjaFs2XSwgJHNlY29uZCwgJG1vbnRoLCAkbWF0Y2hbMl0sICRtYXRjaFs0XSkgLSAkdGltZXpvbmU7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBmYWxzZTsKCQl9Cgl9CgoJLyoqCgkgKiBQYXJzZSBSRkM4NTAncyBkYXRlIGZvcm1hdAoJICoKCSAqIEBhY2Nlc3MgcHJvdGVjdGVkCgkgKiBAcmV0dXJuIGludCBUaW1lc3RhbXAKCSAqLwoJZnVuY3Rpb24gZGF0ZV9yZmM4NTAoJGRhdGUpCgl7CgkJc3RhdGljICRwY3JlOwoJCWlmICghJHBjcmUpCgkJewoJCQkkc3BhY2UgPSAnW1x4MDlceDIwXSsnOwoJCQkkZGF5X25hbWUgPSAkdGhpcy0+ZGF5X3BjcmU7CgkJCSRtb250aCA9ICR0aGlzLT5tb250aF9wY3JlOwoJCQkkZGF5ID0gJyhbMC05XXsxLDJ9KSc7CgkJCSR5ZWFyID0gJGhvdXIgPSAkbWludXRlID0gJHNlY29uZCA9ICcoWzAtOV17Mn0pJzsKCQkJJHpvbmUgPSAnKFtBLVpdezEsNX0pJzsKCQkJJHBjcmUgPSAnL14nIC4gJGRheV9uYW1lIC4gJywnIC4gJHNwYWNlIC4gJGRheSAuICctJyAuICRtb250aCAuICctJyAuICR5ZWFyIC4gJHNwYWNlIC4gJGhvdXIgLiAnOicgLiAkbWludXRlIC4gJzonIC4gJHNlY29uZCAuICRzcGFjZSAuICR6b25lIC4gJyQvaSc7CgkJfQoJCWlmIChwcmVnX21hdGNoKCRwY3JlLCAkZGF0ZSwgJG1hdGNoKSkKCQl7CgkJCS8qCgkJCUNhcHR1cmluZyBzdWJwYXR0ZXJuczoKCQkJMTogRGF5IG5hbWUKCQkJMjogRGF5CgkJCTM6IE1vbnRoCgkJCTQ6IFllYXIKCQkJNTogSG91cgoJCQk2OiBNaW51dGUKCQkJNzogU2Vjb25kCgkJCTg6IFRpbWV6b25lCgkJCSovCgoJCQkvLyBNb250aAoJCQkkbW9udGggPSAkdGhpcy0+bW9udGhbc3RydG9sb3dlcigkbWF0Y2hbM10pXTsKCgkJCS8vIENoYXJhY3RlciB0aW1lem9uZQoJCQlpZiAoaXNzZXQoJHRoaXMtPnRpbWV6b25lW3N0cnRvdXBwZXIoJG1hdGNoWzhdKV0pKQoJCQl7CgkJCQkkdGltZXpvbmUgPSAkdGhpcy0+dGltZXpvbmVbc3RydG91cHBlcigkbWF0Y2hbOF0pXTsKCQkJfQoJCQkvLyBBc3N1bWUgZXZlcnl0aGluZyBlbHNlIHRvIGJlIC0wMDAwCgkJCWVsc2UKCQkJewoJCQkJJHRpbWV6b25lID0gMDsKCQkJfQoKCQkJLy8gRGVhbCB3aXRoIDIgZGlnaXQgeWVhcgoJCQlpZiAoJG1hdGNoWzRdIDwgNTApCgkJCXsKCQkJCSRtYXRjaFs0XSArPSAyMDAwOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJJG1hdGNoWzRdICs9IDE5MDA7CgkJCX0KCgkJCXJldHVybiBnbW1rdGltZSgkbWF0Y2hbNV0sICRtYXRjaFs2XSwgJG1hdGNoWzddLCAkbW9udGgsICRtYXRjaFsyXSwgJG1hdGNoWzRdKSAtICR0aW1lem9uZTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCX0KCgkvKioKCSAqIFBhcnNlIEM5OSdzIGFzY3RpbWUoKSdzIGRhdGUgZm9ybWF0CgkgKgoJICogQGFjY2VzcyBwcm90ZWN0ZWQKCSAqIEByZXR1cm4gaW50IFRpbWVzdGFtcAoJICovCglmdW5jdGlvbiBkYXRlX2FzY3RpbWUoJGRhdGUpCgl7CgkJc3RhdGljICRwY3JlOwoJCWlmICghJHBjcmUpCgkJewoJCQkkc3BhY2UgPSAnW1x4MDlceDIwXSsnOwoJCQkkd2RheV9uYW1lID0gJHRoaXMtPmRheV9wY3JlOwoJCQkkbW9uX25hbWUgPSAkdGhpcy0+bW9udGhfcGNyZTsKCQkJJGRheSA9ICcoWzAtOV17MSwyfSknOwoJCQkkaG91ciA9ICRzZWMgPSAkbWluID0gJyhbMC05XXsyfSknOwoJCQkkeWVhciA9ICcoWzAtOV17NH0pJzsKCQkJJHRlcm1pbmF0b3IgPSAnXHgwQT9ceDAwPyc7CgkJCSRwY3JlID0gJy9eJyAuICR3ZGF5X25hbWUgLiAkc3BhY2UgLiAkbW9uX25hbWUgLiAkc3BhY2UgLiAkZGF5IC4gJHNwYWNlIC4gJGhvdXIgLiAnOicgLiAkbWluIC4gJzonIC4gJHNlYyAuICRzcGFjZSAuICR5ZWFyIC4gJHRlcm1pbmF0b3IgLiAnJC9pJzsKCQl9CgkJaWYgKHByZWdfbWF0Y2goJHBjcmUsICRkYXRlLCAkbWF0Y2gpKQoJCXsKCQkJLyoKCQkJQ2FwdHVyaW5nIHN1YnBhdHRlcm5zOgoJCQkxOiBEYXkgbmFtZQoJCQkyOiBNb250aAoJCQkzOiBEYXkKCQkJNDogSG91cgoJCQk1OiBNaW51dGUKCQkJNjogU2Vjb25kCgkJCTc6IFllYXIKCQkJKi8KCgkJCSRtb250aCA9ICR0aGlzLT5tb250aFtzdHJ0b2xvd2VyKCRtYXRjaFsyXSldOwoJCQlyZXR1cm4gZ21ta3RpbWUoJG1hdGNoWzRdLCAkbWF0Y2hbNV0sICRtYXRjaFs2XSwgJG1vbnRoLCAkbWF0Y2hbM10sICRtYXRjaFs3XSk7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBmYWxzZTsKCQl9Cgl9CgoJLyoqCgkgKiBQYXJzZSBkYXRlcyB1c2luZyBzdHJ0b3RpbWUoKQoJICoKCSAqIEBhY2Nlc3MgcHJvdGVjdGVkCgkgKiBAcmV0dXJuIGludCBUaW1lc3RhbXAKCSAqLwoJZnVuY3Rpb24gZGF0ZV9zdHJ0b3RpbWUoJGRhdGUpCgl7CgkJJHN0cnRvdGltZSA9IHN0cnRvdGltZSgkZGF0ZSk7CgkJaWYgKCRzdHJ0b3RpbWUgPT09IC0xIHx8ICRzdHJ0b3RpbWUgPT09IGZhbHNlKQoJCXsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gJHN0cnRvdGltZTsKCQl9Cgl9Cn0KCi8qKgogKiBDb250ZW50LXR5cGUgc25pZmZpbmcKICoKICogQHBhY2thZ2UgU2ltcGxlUGllCiAqLwpjbGFzcyBTaW1wbGVQaWVfQ29udGVudF9UeXBlX1NuaWZmZXIKewoJLyoqCgkgKiBGaWxlIG9iamVjdAoJICoKCSAqIEB2YXIgU2ltcGxlUGllX0ZpbGUKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCgl2YXIgJGZpbGU7CgoJLyoqCgkgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIHdpdGggdGhlIGlucHV0IGZpbGUKCSAqCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHBhcmFtIFNpbXBsZVBpZV9Db250ZW50X1R5cGVfU25pZmZlciAkZmlsZSBJbnB1dCBmaWxlCgkgKi8KCWZ1bmN0aW9uIFNpbXBsZVBpZV9Db250ZW50X1R5cGVfU25pZmZlcigkZmlsZSkKCXsKCQkkdGhpcy0+ZmlsZSA9ICRmaWxlOwoJfQoKCS8qKgoJICogR2V0IHRoZSBDb250ZW50LVR5cGUgb2YgdGhlIHNwZWNpZmllZCBmaWxlCgkgKgoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEByZXR1cm4gc3RyaW5nIEFjdHVhbCBDb250ZW50LVR5cGUKCSAqLwoJZnVuY3Rpb24gZ2V0X3R5cGUoKQoJewoJCWlmIChpc3NldCgkdGhpcy0+ZmlsZS0+aGVhZGVyc1snY29udGVudC10eXBlJ10pKQoJCXsKCQkJaWYgKCFpc3NldCgkdGhpcy0+ZmlsZS0+aGVhZGVyc1snY29udGVudC1lbmNvZGluZyddKQoJCQkJJiYgKCR0aGlzLT5maWxlLT5oZWFkZXJzWydjb250ZW50LXR5cGUnXSA9PT0gJ3RleHQvcGxhaW4nCgkJCQkJfHwgJHRoaXMtPmZpbGUtPmhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddID09PSAndGV4dC9wbGFpbjsgY2hhcnNldD1JU08tODg1OS0xJwoJCQkJCXx8ICR0aGlzLT5maWxlLT5oZWFkZXJzWydjb250ZW50LXR5cGUnXSA9PT0gJ3RleHQvcGxhaW47IGNoYXJzZXQ9aXNvLTg4NTktMScpKQoJCQl7CgkJCQlyZXR1cm4gJHRoaXMtPnRleHRfb3JfYmluYXJ5KCk7CgkJCX0KCgkJCWlmICgoJHBvcyA9IHN0cnBvcygkdGhpcy0+ZmlsZS0+aGVhZGVyc1snY29udGVudC10eXBlJ10sICc7JykpICE9PSBmYWxzZSkKCQkJewoJCQkJJG9mZmljaWFsID0gc3Vic3RyKCR0aGlzLT5maWxlLT5oZWFkZXJzWydjb250ZW50LXR5cGUnXSwgMCwgJHBvcyk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQkkb2ZmaWNpYWwgPSAkdGhpcy0+ZmlsZS0+aGVhZGVyc1snY29udGVudC10eXBlJ107CgkJCX0KCQkJJG9mZmljaWFsID0gc3RydG9sb3dlcigkb2ZmaWNpYWwpOwoKCQkJaWYgKCRvZmZpY2lhbCA9PT0gJ3Vua25vd24vdW5rbm93bicKCQkJCXx8ICRvZmZpY2lhbCA9PT0gJ2FwcGxpY2F0aW9uL3Vua25vd24nKQoJCQl7CgkJCQlyZXR1cm4gJHRoaXMtPnVua25vd24oKTsKCQkJfQoJCQllbHNlaWYgKHN1YnN0cigkb2ZmaWNpYWwsIC00KSA9PT0gJyt4bWwnCgkJCQl8fCAkb2ZmaWNpYWwgPT09ICd0ZXh0L3htbCcKCQkJCXx8ICRvZmZpY2lhbCA9PT0gJ2FwcGxpY2F0aW9uL3htbCcpCgkJCXsKCQkJCXJldHVybiAkb2ZmaWNpYWw7CgkJCX0KCQkJZWxzZWlmIChzdWJzdHIoJG9mZmljaWFsLCAwLCA2KSA9PT0gJ2ltYWdlLycpCgkJCXsKCQkJCWlmICgkcmV0dXJuID0gJHRoaXMtPmltYWdlKCkpCgkJCQl7CgkJCQkJcmV0dXJuICRyZXR1cm47CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJcmV0dXJuICRvZmZpY2lhbDsKCQkJCX0KCQkJfQoJCQllbHNlaWYgKCRvZmZpY2lhbCA9PT0gJ3RleHQvaHRtbCcpCgkJCXsKCQkJCXJldHVybiAkdGhpcy0+ZmVlZF9vcl9odG1sKCk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlyZXR1cm4gJG9mZmljaWFsOwoJCQl9CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiAkdGhpcy0+dW5rbm93bigpOwoJCX0KCX0KCgkvKioKCSAqIFNuaWZmIHRleHQgb3IgYmluYXJ5CgkgKgoJICogQGFjY2VzcyBwcml2YXRlCgkgKiBAcmV0dXJuIHN0cmluZyBBY3R1YWwgQ29udGVudC1UeXBlCgkgKi8KCWZ1bmN0aW9uIHRleHRfb3JfYmluYXJ5KCkKCXsKCQlpZiAoc3Vic3RyKCR0aGlzLT5maWxlLT5ib2R5LCAwLCAyKSA9PT0gIlx4RkVceEZGIgoJCQl8fCBzdWJzdHIoJHRoaXMtPmZpbGUtPmJvZHksIDAsIDIpID09PSAiXHhGRlx4RkUiCgkJCXx8IHN1YnN0cigkdGhpcy0+ZmlsZS0+Ym9keSwgMCwgNCkgPT09ICJceDAwXHgwMFx4RkVceEZGIgoJCQl8fCBzdWJzdHIoJHRoaXMtPmZpbGUtPmJvZHksIDAsIDMpID09PSAiXHhFRlx4QkJceEJGIikKCQl7CgkJCXJldHVybiAndGV4dC9wbGFpbic7CgkJfQoJCWVsc2VpZiAocHJlZ19tYXRjaCgnL1tceDAwLVx4MDhceDBFLVx4MUFceDFDLVx4MUZdLycsICR0aGlzLT5maWxlLT5ib2R5KSkKCQl7CgkJCXJldHVybiAnYXBwbGljYXRpb24vb2N0ZWN0LXN0cmVhbSc7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiAndGV4dC9wbGFpbic7CgkJfQoJfQoKCS8qKgoJICogU25pZmYgdW5rbm93bgoJICoKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICogQHJldHVybiBzdHJpbmcgQWN0dWFsIENvbnRlbnQtVHlwZQoJICovCglmdW5jdGlvbiB1bmtub3duKCkKCXsKCQkkd3MgPSBzdHJzcG4oJHRoaXMtPmZpbGUtPmJvZHksICJceDA5XHgwQVx4MEJceDBDXHgwRFx4MjAiKTsKCQlpZiAoc3RydG9sb3dlcihzdWJzdHIoJHRoaXMtPmZpbGUtPmJvZHksICR3cywgMTQpKSA9PT0gJzwhZG9jdHlwZSBodG1sJwoJCQl8fCBzdHJ0b2xvd2VyKHN1YnN0cigkdGhpcy0+ZmlsZS0+Ym9keSwgJHdzLCA1KSkgPT09ICc8aHRtbCcKCQkJfHwgc3RydG9sb3dlcihzdWJzdHIoJHRoaXMtPmZpbGUtPmJvZHksICR3cywgNykpID09PSAnPHNjcmlwdCcpCgkJewoJCQlyZXR1cm4gJ3RleHQvaHRtbCc7CgkJfQoJCWVsc2VpZiAoc3Vic3RyKCR0aGlzLT5maWxlLT5ib2R5LCAwLCA1KSA9PT0gJyVQREYtJykKCQl7CgkJCXJldHVybiAnYXBwbGljYXRpb24vcGRmJzsKCQl9CgkJZWxzZWlmIChzdWJzdHIoJHRoaXMtPmZpbGUtPmJvZHksIDAsIDExKSA9PT0gJyUhUFMtQWRvYmUtJykKCQl7CgkJCXJldHVybiAnYXBwbGljYXRpb24vcG9zdHNjcmlwdCc7CgkJfQoJCWVsc2VpZiAoc3Vic3RyKCR0aGlzLT5maWxlLT5ib2R5LCAwLCA2KSA9PT0gJ0dJRjg3YScKCQkJfHwgc3Vic3RyKCR0aGlzLT5maWxlLT5ib2R5LCAwLCA2KSA9PT0gJ0dJRjg5YScpCgkJewoJCQlyZXR1cm4gJ2ltYWdlL2dpZic7CgkJfQoJCWVsc2VpZiAoc3Vic3RyKCR0aGlzLT5maWxlLT5ib2R5LCAwLCA4KSA9PT0gIlx4ODlceDUwXHg0RVx4NDdceDBEXHgwQVx4MUFceDBBIikKCQl7CgkJCXJldHVybiAnaW1hZ2UvcG5nJzsKCQl9CgkJZWxzZWlmIChzdWJzdHIoJHRoaXMtPmZpbGUtPmJvZHksIDAsIDMpID09PSAiXHhGRlx4RDhceEZGIikKCQl7CgkJCXJldHVybiAnaW1hZ2UvanBlZyc7CgkJfQoJCWVsc2VpZiAoc3Vic3RyKCR0aGlzLT5maWxlLT5ib2R5LCAwLCAyKSA9PT0gIlx4NDJceDREIikKCQl7CgkJCXJldHVybiAnaW1hZ2UvYm1wJzsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuICR0aGlzLT50ZXh0X29yX2JpbmFyeSgpOwoJCX0KCX0KCgkvKioKCSAqIFNuaWZmIGltYWdlcwoJICoKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICogQHJldHVybiBzdHJpbmcgQWN0dWFsIENvbnRlbnQtVHlwZQoJICovCglmdW5jdGlvbiBpbWFnZSgpCgl7CgkJaWYgKHN1YnN0cigkdGhpcy0+ZmlsZS0+Ym9keSwgMCwgNikgPT09ICdHSUY4N2EnCgkJCXx8IHN1YnN0cigkdGhpcy0+ZmlsZS0+Ym9keSwgMCwgNikgPT09ICdHSUY4OWEnKQoJCXsKCQkJcmV0dXJuICdpbWFnZS9naWYnOwoJCX0KCQllbHNlaWYgKHN1YnN0cigkdGhpcy0+ZmlsZS0+Ym9keSwgMCwgOCkgPT09ICJceDg5XHg1MFx4NEVceDQ3XHgwRFx4MEFceDFBXHgwQSIpCgkJewoJCQlyZXR1cm4gJ2ltYWdlL3BuZyc7CgkJfQoJCWVsc2VpZiAoc3Vic3RyKCR0aGlzLT5maWxlLT5ib2R5LCAwLCAzKSA9PT0gIlx4RkZceEQ4XHhGRiIpCgkJewoJCQlyZXR1cm4gJ2ltYWdlL2pwZWcnOwoJCX0KCQllbHNlaWYgKHN1YnN0cigkdGhpcy0+ZmlsZS0+Ym9keSwgMCwgMikgPT09ICJceDQyXHg0RCIpCgkJewoJCQlyZXR1cm4gJ2ltYWdlL2JtcCc7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBmYWxzZTsKCQl9Cgl9CgoJLyoqCgkgKiBTbmlmZiBIVE1MCgkgKgoJICogQGFjY2VzcyBwcml2YXRlCgkgKiBAcmV0dXJuIHN0cmluZyBBY3R1YWwgQ29udGVudC1UeXBlCgkgKi8KCWZ1bmN0aW9uIGZlZWRfb3JfaHRtbCgpCgl7CgkJJGxlbiA9IHN0cmxlbigkdGhpcy0+ZmlsZS0+Ym9keSk7CgkJJHBvcyA9IHN0cnNwbigkdGhpcy0+ZmlsZS0+Ym9keSwgIlx4MDlceDBBXHgwRFx4MjAiKTsKCgkJd2hpbGUgKCRwb3MgPCAkbGVuKQoJCXsKCQkJc3dpdGNoICgkdGhpcy0+ZmlsZS0+Ym9keVskcG9zXSkKCQkJewoJCQkJY2FzZSAiXHgwOSI6CgkJCQljYXNlICJceDBBIjoKCQkJCWNhc2UgIlx4MEQiOgoJCQkJY2FzZSAiXHgyMCI6CgkJCQkJJHBvcyArPSBzdHJzcG4oJHRoaXMtPmZpbGUtPmJvZHksICJceDA5XHgwQVx4MERceDIwIiwgJHBvcyk7CgkJCQkJY29udGludWUgMjsKCgkJCQljYXNlICc8JzoKCQkJCQkkcG9zKys7CgkJCQkJYnJlYWs7CgoJCQkJZGVmYXVsdDoKCQkJCQlyZXR1cm4gJ3RleHQvaHRtbCc7CgkJCX0KCgkJCWlmIChzdWJzdHIoJHRoaXMtPmZpbGUtPmJvZHksICRwb3MsIDMpID09PSAnIS0tJykKCQkJewoJCQkJJHBvcyArPSAzOwoJCQkJaWYgKCRwb3MgPCAkbGVuICYmICgkcG9zID0gc3RycG9zKCR0aGlzLT5maWxlLT5ib2R5LCAnLS0+JywgJHBvcykpICE9PSBmYWxzZSkKCQkJCXsKCQkJCQkkcG9zICs9IDM7CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJcmV0dXJuICd0ZXh0L2h0bWwnOwoJCQkJfQoJCQl9CgkJCWVsc2VpZiAoc3Vic3RyKCR0aGlzLT5maWxlLT5ib2R5LCAkcG9zLCAxKSA9PT0gJyEnKQoJCQl7CgkJCQlpZiAoJHBvcyA8ICRsZW4gJiYgKCRwb3MgPSBzdHJwb3MoJHRoaXMtPmZpbGUtPmJvZHksICc+JywgJHBvcykpICE9PSBmYWxzZSkKCQkJCXsKCQkJCQkkcG9zKys7CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJcmV0dXJuICd0ZXh0L2h0bWwnOwoJCQkJfQoJCQl9CgkJCWVsc2VpZiAoc3Vic3RyKCR0aGlzLT5maWxlLT5ib2R5LCAkcG9zLCAxKSA9PT0gJz8nKQoJCQl7CgkJCQlpZiAoJHBvcyA8ICRsZW4gJiYgKCRwb3MgPSBzdHJwb3MoJHRoaXMtPmZpbGUtPmJvZHksICc/PicsICRwb3MpKSAhPT0gZmFsc2UpCgkJCQl7CgkJCQkJJHBvcyArPSAyOwoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCXJldHVybiAndGV4dC9odG1sJzsKCQkJCX0KCQkJfQoJCQllbHNlaWYgKHN1YnN0cigkdGhpcy0+ZmlsZS0+Ym9keSwgJHBvcywgMykgPT09ICdyc3MnCgkJCQl8fCBzdWJzdHIoJHRoaXMtPmZpbGUtPmJvZHksICRwb3MsIDcpID09PSAncmRmOlJERicpCgkJCXsKCQkJCXJldHVybiAnYXBwbGljYXRpb24vcnNzK3htbCc7CgkJCX0KCQkJZWxzZWlmIChzdWJzdHIoJHRoaXMtPmZpbGUtPmJvZHksICRwb3MsIDQpID09PSAnZmVlZCcpCgkJCXsKCQkJCXJldHVybiAnYXBwbGljYXRpb24vYXRvbSt4bWwnOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJcmV0dXJuICd0ZXh0L2h0bWwnOwoJCQl9CgkJfQoKCQlyZXR1cm4gJ3RleHQvaHRtbCc7Cgl9Cn0KCi8qKgogKiBQYXJzZXMgdGhlIFhNTCBEZWNsYXJhdGlvbgogKgogKiBAcGFja2FnZSBTaW1wbGVQaWUKICovCmNsYXNzIFNpbXBsZVBpZV9YTUxfRGVjbGFyYXRpb25fUGFyc2VyCnsKCS8qKgoJICogWE1MIFZlcnNpb24KCSAqCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHZhciBzdHJpbmcKCSAqLwoJdmFyICR2ZXJzaW9uID0gJzEuMCc7CgoJLyoqCgkgKiBFbmNvZGluZwoJICoKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAdmFyIHN0cmluZwoJICovCgl2YXIgJGVuY29kaW5nID0gJ1VURi04JzsKCgkvKioKCSAqIFN0YW5kYWxvbmUKCSAqCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHZhciBib29sCgkgKi8KCXZhciAkc3RhbmRhbG9uZSA9IGZhbHNlOwoKCS8qKgoJICogQ3VycmVudCBzdGF0ZSBvZiB0aGUgc3RhdGUgbWFjaGluZQoJICoKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICogQHZhciBzdHJpbmcKCSAqLwoJdmFyICRzdGF0ZSA9ICdiZWZvcmVfdmVyc2lvbl9uYW1lJzsKCgkvKioKCSAqIElucHV0IGRhdGEKCSAqCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXZhciAkZGF0YSA9ICcnOwoKCS8qKgoJICogSW5wdXQgZGF0YSBsZW5ndGggKHRvIGF2b2lkIGNhbGxpbmcgc3RybGVuKCkgZXZlcnl0aW1lIHRoaXMgaXMgbmVlZGVkKQoJICoKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICogQHZhciBpbnQKCSAqLwoJdmFyICRkYXRhX2xlbmd0aCA9IDA7CgoJLyoqCgkgKiBDdXJyZW50IHBvc2l0aW9uIG9mIHRoZSBwb2ludGVyCgkgKgoJICogQHZhciBpbnQKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCgl2YXIgJHBvc2l0aW9uID0gMDsKCgkvKioKCSAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgY2xhc3Mgd2l0aCB0aGUgaW5wdXQgZGF0YQoJICoKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAcGFyYW0gc3RyaW5nICRkYXRhIElucHV0IGRhdGEKCSAqLwoJZnVuY3Rpb24gU2ltcGxlUGllX1hNTF9EZWNsYXJhdGlvbl9QYXJzZXIoJGRhdGEpCgl7CgkJJHRoaXMtPmRhdGEgPSAkZGF0YTsKCQkkdGhpcy0+ZGF0YV9sZW5ndGggPSBzdHJsZW4oJHRoaXMtPmRhdGEpOwoJfQoKCS8qKgoJICogUGFyc2UgdGhlIGlucHV0IGRhdGEKCSAqCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHJldHVybiBib29sIHRydWUgb24gc3VjY2VzcywgZmFsc2Ugb24gZmFpbHVyZQoJICovCglmdW5jdGlvbiBwYXJzZSgpCgl7CgkJd2hpbGUgKCR0aGlzLT5zdGF0ZSAmJiAkdGhpcy0+c3RhdGUgIT09ICdlbWl0JyAmJiAkdGhpcy0+aGFzX2RhdGEoKSkKCQl7CgkJCSRzdGF0ZSA9ICR0aGlzLT5zdGF0ZTsKCQkJJHRoaXMtPiRzdGF0ZSgpOwoJCX0KCQkkdGhpcy0+ZGF0YSA9ICcnOwoJCWlmICgkdGhpcy0+c3RhdGUgPT09ICdlbWl0JykKCQl7CgkJCXJldHVybiB0cnVlOwoJCX0KCQllbHNlCgkJewoJCQkkdGhpcy0+dmVyc2lvbiA9ICcnOwoJCQkkdGhpcy0+ZW5jb2RpbmcgPSAnJzsKCQkJJHRoaXMtPnN0YW5kYWxvbmUgPSAnJzsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCX0KCgkvKioKCSAqIENoZWNrIHdoZXRoZXIgdGhlcmUgaXMgZGF0YSBiZXlvbmQgdGhlIHBvaW50ZXIKCSAqCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqIEByZXR1cm4gYm9vbCB0cnVlIGlmIHRoZXJlIGlzIGZ1cnRoZXIgZGF0YSwgZmFsc2UgaWYgbm90CgkgKi8KCWZ1bmN0aW9uIGhhc19kYXRhKCkKCXsKCQlyZXR1cm4gKGJvb2wpICgkdGhpcy0+cG9zaXRpb24gPCAkdGhpcy0+ZGF0YV9sZW5ndGgpOwoJfQoKCS8qKgoJICogQWR2YW5jZSBwYXN0IGFueSB3aGl0ZXNwYWNlCgkgKgoJICogQHJldHVybiBpbnQgTnVtYmVyIG9mIHdoaXRlc3BhY2UgY2hhcmFjdGVycyBwYXNzZWQKCSAqLwoJZnVuY3Rpb24gc2tpcF93aGl0ZXNwYWNlKCkKCXsKCQkkd2hpdGVzcGFjZSA9IHN0cnNwbigkdGhpcy0+ZGF0YSwgIlx4MDlceDBBXHgwRFx4MjAiLCAkdGhpcy0+cG9zaXRpb24pOwoJCSR0aGlzLT5wb3NpdGlvbiArPSAkd2hpdGVzcGFjZTsKCQlyZXR1cm4gJHdoaXRlc3BhY2U7Cgl9CgoJLyoqCgkgKiBSZWFkIHZhbHVlCgkgKi8KCWZ1bmN0aW9uIGdldF92YWx1ZSgpCgl7CgkJJHF1b3RlID0gc3Vic3RyKCR0aGlzLT5kYXRhLCAkdGhpcy0+cG9zaXRpb24sIDEpOwoJCWlmICgkcXVvdGUgPT09ICciJyB8fCAkcXVvdGUgPT09ICInIikKCQl7CgkJCSR0aGlzLT5wb3NpdGlvbisrOwoJCQkkbGVuID0gc3RyY3NwbigkdGhpcy0+ZGF0YSwgJHF1b3RlLCAkdGhpcy0+cG9zaXRpb24pOwoJCQlpZiAoJHRoaXMtPmhhc19kYXRhKCkpCgkJCXsKCQkJCSR2YWx1ZSA9IHN1YnN0cigkdGhpcy0+ZGF0YSwgJHRoaXMtPnBvc2l0aW9uLCAkbGVuKTsKCQkJCSR0aGlzLT5wb3NpdGlvbiArPSAkbGVuICsgMTsKCQkJCXJldHVybiAkdmFsdWU7CgkJCX0KCQl9CgkJcmV0dXJuIGZhbHNlOwoJfQoKCWZ1bmN0aW9uIGJlZm9yZV92ZXJzaW9uX25hbWUoKQoJewoJCWlmICgkdGhpcy0+c2tpcF93aGl0ZXNwYWNlKCkpCgkJewoJCQkkdGhpcy0+c3RhdGUgPSAndmVyc2lvbl9uYW1lJzsKCQl9CgkJZWxzZQoJCXsKCQkJJHRoaXMtPnN0YXRlID0gZmFsc2U7CgkJfQoJfQoKCWZ1bmN0aW9uIHZlcnNpb25fbmFtZSgpCgl7CgkJaWYgKHN1YnN0cigkdGhpcy0+ZGF0YSwgJHRoaXMtPnBvc2l0aW9uLCA3KSA9PT0gJ3ZlcnNpb24nKQoJCXsKCQkJJHRoaXMtPnBvc2l0aW9uICs9IDc7CgkJCSR0aGlzLT5za2lwX3doaXRlc3BhY2UoKTsKCQkJJHRoaXMtPnN0YXRlID0gJ3ZlcnNpb25fZXF1YWxzJzsKCQl9CgkJZWxzZQoJCXsKCQkJJHRoaXMtPnN0YXRlID0gZmFsc2U7CgkJfQoJfQoKCWZ1bmN0aW9uIHZlcnNpb25fZXF1YWxzKCkKCXsKCQlpZiAoc3Vic3RyKCR0aGlzLT5kYXRhLCAkdGhpcy0+cG9zaXRpb24sIDEpID09PSAnPScpCgkJewoJCQkkdGhpcy0+cG9zaXRpb24rKzsKCQkJJHRoaXMtPnNraXBfd2hpdGVzcGFjZSgpOwoJCQkkdGhpcy0+c3RhdGUgPSAndmVyc2lvbl92YWx1ZSc7CgkJfQoJCWVsc2UKCQl7CgkJCSR0aGlzLT5zdGF0ZSA9IGZhbHNlOwoJCX0KCX0KCglmdW5jdGlvbiB2ZXJzaW9uX3ZhbHVlKCkKCXsKCQlpZiAoJHRoaXMtPnZlcnNpb24gPSAkdGhpcy0+Z2V0X3ZhbHVlKCkpCgkJewoJCQkkdGhpcy0+c2tpcF93aGl0ZXNwYWNlKCk7CgkJCWlmICgkdGhpcy0+aGFzX2RhdGEoKSkKCQkJewoJCQkJJHRoaXMtPnN0YXRlID0gJ2VuY29kaW5nX25hbWUnOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJJHRoaXMtPnN0YXRlID0gJ2VtaXQnOwoJCQl9CgkJfQoJCWVsc2UKCQl7CgkJCSR0aGlzLT5zdGF0ZSA9ICdzdGFuZGFsb25lX25hbWUnOwoJCX0KCX0KCglmdW5jdGlvbiBlbmNvZGluZ19uYW1lKCkKCXsKCQlpZiAoc3Vic3RyKCR0aGlzLT5kYXRhLCAkdGhpcy0+cG9zaXRpb24sIDgpID09PSAnZW5jb2RpbmcnKQoJCXsKCQkJJHRoaXMtPnBvc2l0aW9uICs9IDg7CgkJCSR0aGlzLT5za2lwX3doaXRlc3BhY2UoKTsKCQkJJHRoaXMtPnN0YXRlID0gJ2VuY29kaW5nX2VxdWFscyc7CgkJfQoJCWVsc2UKCQl7CgkJCSR0aGlzLT5zdGF0ZSA9IGZhbHNlOwoJCX0KCX0KCglmdW5jdGlvbiBlbmNvZGluZ19lcXVhbHMoKQoJewoJCWlmIChzdWJzdHIoJHRoaXMtPmRhdGEsICR0aGlzLT5wb3NpdGlvbiwgMSkgPT09ICc9JykKCQl7CgkJCSR0aGlzLT5wb3NpdGlvbisrOwoJCQkkdGhpcy0+c2tpcF93aGl0ZXNwYWNlKCk7CgkJCSR0aGlzLT5zdGF0ZSA9ICdlbmNvZGluZ192YWx1ZSc7CgkJfQoJCWVsc2UKCQl7CgkJCSR0aGlzLT5zdGF0ZSA9IGZhbHNlOwoJCX0KCX0KCglmdW5jdGlvbiBlbmNvZGluZ192YWx1ZSgpCgl7CgkJaWYgKCR0aGlzLT5lbmNvZGluZyA9ICR0aGlzLT5nZXRfdmFsdWUoKSkKCQl7CgkJCSR0aGlzLT5za2lwX3doaXRlc3BhY2UoKTsKCQkJaWYgKCR0aGlzLT5oYXNfZGF0YSgpKQoJCQl7CgkJCQkkdGhpcy0+c3RhdGUgPSAnc3RhbmRhbG9uZV9uYW1lJzsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCSR0aGlzLT5zdGF0ZSA9ICdlbWl0JzsKCQkJfQoJCX0KCQllbHNlCgkJewoJCQkkdGhpcy0+c3RhdGUgPSBmYWxzZTsKCQl9Cgl9CgoJZnVuY3Rpb24gc3RhbmRhbG9uZV9uYW1lKCkKCXsKCQlpZiAoc3Vic3RyKCR0aGlzLT5kYXRhLCAkdGhpcy0+cG9zaXRpb24sIDEwKSA9PT0gJ3N0YW5kYWxvbmUnKQoJCXsKCQkJJHRoaXMtPnBvc2l0aW9uICs9IDEwOwoJCQkkdGhpcy0+c2tpcF93aGl0ZXNwYWNlKCk7CgkJCSR0aGlzLT5zdGF0ZSA9ICdzdGFuZGFsb25lX2VxdWFscyc7CgkJfQoJCWVsc2UKCQl7CgkJCSR0aGlzLT5zdGF0ZSA9IGZhbHNlOwoJCX0KCX0KCglmdW5jdGlvbiBzdGFuZGFsb25lX2VxdWFscygpCgl7CgkJaWYgKHN1YnN0cigkdGhpcy0+ZGF0YSwgJHRoaXMtPnBvc2l0aW9uLCAxKSA9PT0gJz0nKQoJCXsKCQkJJHRoaXMtPnBvc2l0aW9uKys7CgkJCSR0aGlzLT5za2lwX3doaXRlc3BhY2UoKTsKCQkJJHRoaXMtPnN0YXRlID0gJ3N0YW5kYWxvbmVfdmFsdWUnOwoJCX0KCQllbHNlCgkJewoJCQkkdGhpcy0+c3RhdGUgPSBmYWxzZTsKCQl9Cgl9CgoJZnVuY3Rpb24gc3RhbmRhbG9uZV92YWx1ZSgpCgl7CgkJaWYgKCRzdGFuZGFsb25lID0gJHRoaXMtPmdldF92YWx1ZSgpKQoJCXsKCQkJc3dpdGNoICgkc3RhbmRhbG9uZSkKCQkJewoJCQkJY2FzZSAneWVzJzoKCQkJCQkkdGhpcy0+c3RhbmRhbG9uZSA9IHRydWU7CgkJCQkJYnJlYWs7CgoJCQkJY2FzZSAnbm8nOgoJCQkJCSR0aGlzLT5zdGFuZGFsb25lID0gZmFsc2U7CgkJCQkJYnJlYWs7CgoJCQkJZGVmYXVsdDoKCQkJCQkkdGhpcy0+c3RhdGUgPSBmYWxzZTsKCQkJCQlyZXR1cm47CgkJCX0KCgkJCSR0aGlzLT5za2lwX3doaXRlc3BhY2UoKTsKCQkJaWYgKCR0aGlzLT5oYXNfZGF0YSgpKQoJCQl7CgkJCQkkdGhpcy0+c3RhdGUgPSBmYWxzZTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCSR0aGlzLT5zdGF0ZSA9ICdlbWl0JzsKCQkJfQoJCX0KCQllbHNlCgkJewoJCQkkdGhpcy0+c3RhdGUgPSBmYWxzZTsKCQl9Cgl9Cn0KCmNsYXNzIFNpbXBsZVBpZV9Mb2NhdG9yCnsKCXZhciAkdXNlcmFnZW50OwoJdmFyICR0aW1lb3V0OwoJdmFyICRmaWxlOwoJdmFyICRsb2NhbCA9IGFycmF5KCk7Cgl2YXIgJGVsc2V3aGVyZSA9IGFycmF5KCk7Cgl2YXIgJGZpbGVfY2xhc3MgPSAnU2ltcGxlUGllX0ZpbGUnOwoJdmFyICRjYWNoZWRfZW50aXRpZXMgPSBhcnJheSgpOwoJdmFyICRodHRwX2Jhc2U7Cgl2YXIgJGJhc2U7Cgl2YXIgJGJhc2VfbG9jYXRpb24gPSAwOwoJdmFyICRjaGVja2VkX2ZlZWRzID0gMDsKCXZhciAkbWF4X2NoZWNrZWRfZmVlZHMgPSAxMDsKCXZhciAkY29udGVudF90eXBlX3NuaWZmZXJfY2xhc3MgPSAnU2ltcGxlUGllX0NvbnRlbnRfVHlwZV9TbmlmZmVyJzsKCglmdW5jdGlvbiBTaW1wbGVQaWVfTG9jYXRvcigmJGZpbGUsICR0aW1lb3V0ID0gMTAsICR1c2VyYWdlbnQgPSBudWxsLCAkZmlsZV9jbGFzcyA9ICdTaW1wbGVQaWVfRmlsZScsICRtYXhfY2hlY2tlZF9mZWVkcyA9IDEwLCAkY29udGVudF90eXBlX3NuaWZmZXJfY2xhc3MgPSAnU2ltcGxlUGllX0NvbnRlbnRfVHlwZV9TbmlmZmVyJykKCXsKCQkkdGhpcy0+ZmlsZSA9JiAkZmlsZTsKCQkkdGhpcy0+ZmlsZV9jbGFzcyA9ICRmaWxlX2NsYXNzOwoJCSR0aGlzLT51c2VyYWdlbnQgPSAkdXNlcmFnZW50OwoJCSR0aGlzLT50aW1lb3V0ID0gJHRpbWVvdXQ7CgkJJHRoaXMtPm1heF9jaGVja2VkX2ZlZWRzID0gJG1heF9jaGVja2VkX2ZlZWRzOwoJCSR0aGlzLT5jb250ZW50X3R5cGVfc25pZmZlcl9jbGFzcyA9ICRjb250ZW50X3R5cGVfc25pZmZlcl9jbGFzczsKCX0KCglmdW5jdGlvbiBmaW5kKCR0eXBlID0gU0lNUExFUElFX0xPQ0FUT1JfQUxMKQoJewoJCWlmICgkdGhpcy0+aXNfZmVlZCgkdGhpcy0+ZmlsZSkpCgkJewoJCQlyZXR1cm4gJHRoaXMtPmZpbGU7CgkJfQoKCQlpZiAoJHRoaXMtPmZpbGUtPm1ldGhvZCAmIFNJTVBMRVBJRV9GSUxFX1NPVVJDRV9SRU1PVEUpCgkJewoJCQkkc25pZmZlciA9IG5ldyAkdGhpcy0+Y29udGVudF90eXBlX3NuaWZmZXJfY2xhc3MoJHRoaXMtPmZpbGUpOwoJCQlpZiAoJHNuaWZmZXItPmdldF90eXBlKCkgIT09ICd0ZXh0L2h0bWwnKQoJCQl7CgkJCQlyZXR1cm4gbnVsbDsKCQkJfQoJCX0KCgkJaWYgKCR0eXBlICYgflNJTVBMRVBJRV9MT0NBVE9SX05PTkUpCgkJewoJCQkkdGhpcy0+Z2V0X2Jhc2UoKTsKCQl9CgoJCWlmICgkdHlwZSAmIFNJTVBMRVBJRV9MT0NBVE9SX0FVVE9ESVNDT1ZFUlkgJiYgJHdvcmtpbmcgPSAkdGhpcy0+YXV0b2Rpc2NvdmVyeSgpKQoJCXsKCQkJcmV0dXJuICR3b3JraW5nOwoJCX0KCgkJaWYgKCR0eXBlICYgKFNJTVBMRVBJRV9MT0NBVE9SX0xPQ0FMX0VYVEVOU0lPTiB8IFNJTVBMRVBJRV9MT0NBVE9SX0xPQ0FMX0JPRFkgfCBTSU1QTEVQSUVfTE9DQVRPUl9SRU1PVEVfRVhURU5TSU9OIHwgU0lNUExFUElFX0xPQ0FUT1JfUkVNT1RFX0JPRFkpICYmICR0aGlzLT5nZXRfbGlua3MoKSkKCQl7CgkJCWlmICgkdHlwZSAmIFNJTVBMRVBJRV9MT0NBVE9SX0xPQ0FMX0VYVEVOU0lPTiAmJiAkd29ya2luZyA9ICR0aGlzLT5leHRlbnNpb24oJHRoaXMtPmxvY2FsKSkKCQkJewoJCQkJcmV0dXJuICR3b3JraW5nOwoJCQl9CgoJCQlpZiAoJHR5cGUgJiBTSU1QTEVQSUVfTE9DQVRPUl9MT0NBTF9CT0RZICYmICR3b3JraW5nID0gJHRoaXMtPmJvZHkoJHRoaXMtPmxvY2FsKSkKCQkJewoJCQkJcmV0dXJuICR3b3JraW5nOwoJCQl9CgoJCQlpZiAoJHR5cGUgJiBTSU1QTEVQSUVfTE9DQVRPUl9SRU1PVEVfRVhURU5TSU9OICYmICR3b3JraW5nID0gJHRoaXMtPmV4dGVuc2lvbigkdGhpcy0+ZWxzZXdoZXJlKSkKCQkJewoJCQkJcmV0dXJuICR3b3JraW5nOwoJCQl9CgoJCQlpZiAoJHR5cGUgJiBTSU1QTEVQSUVfTE9DQVRPUl9SRU1PVEVfQk9EWSAmJiAkd29ya2luZyA9ICR0aGlzLT5ib2R5KCR0aGlzLT5lbHNld2hlcmUpKQoJCQl7CgkJCQlyZXR1cm4gJHdvcmtpbmc7CgkJCX0KCQl9CgkJcmV0dXJuIG51bGw7Cgl9CgoJZnVuY3Rpb24gaXNfZmVlZCgmJGZpbGUpCgl7CgkJaWYgKCRmaWxlLT5tZXRob2QgJiBTSU1QTEVQSUVfRklMRV9TT1VSQ0VfUkVNT1RFKQoJCXsKCQkJJHNuaWZmZXIgPSBuZXcgJHRoaXMtPmNvbnRlbnRfdHlwZV9zbmlmZmVyX2NsYXNzKCRmaWxlKTsKCQkJJHNuaWZmZWQgPSAkc25pZmZlci0+Z2V0X3R5cGUoKTsKCQkJaWYgKGluX2FycmF5KCRzbmlmZmVkLCBhcnJheSgnYXBwbGljYXRpb24vcnNzK3htbCcsICdhcHBsaWNhdGlvbi9yZGYreG1sJywgJ3RleHQvcmRmJywgJ2FwcGxpY2F0aW9uL2F0b20reG1sJywgJ3RleHQveG1sJywgJ2FwcGxpY2F0aW9uL3htbCcpKSkKCQkJewoJCQkJcmV0dXJuIHRydWU7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQl9CgkJZWxzZWlmICgkZmlsZS0+bWV0aG9kICYgU0lNUExFUElFX0ZJTEVfU09VUkNFX0xPQ0FMKQoJCXsKCQkJcmV0dXJuIHRydWU7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBmYWxzZTsKCQl9Cgl9CgoJZnVuY3Rpb24gZ2V0X2Jhc2UoKQoJewoJCSR0aGlzLT5odHRwX2Jhc2UgPSAkdGhpcy0+ZmlsZS0+dXJsOwoJCSR0aGlzLT5iYXNlID0gJHRoaXMtPmh0dHBfYmFzZTsKCQkkZWxlbWVudHMgPSBTaW1wbGVQaWVfTWlzYzo6Z2V0X2VsZW1lbnQoJ2Jhc2UnLCAkdGhpcy0+ZmlsZS0+Ym9keSk7CgkJZm9yZWFjaCAoJGVsZW1lbnRzIGFzICRlbGVtZW50KQoJCXsKCQkJaWYgKCRlbGVtZW50WydhdHRyaWJzJ11bJ2hyZWYnXVsnZGF0YSddICE9PSAnJykKCQkJewoJCQkJJHRoaXMtPmJhc2UgPSBTaW1wbGVQaWVfTWlzYzo6YWJzb2x1dGl6ZV91cmwodHJpbSgkZWxlbWVudFsnYXR0cmlicyddWydocmVmJ11bJ2RhdGEnXSksICR0aGlzLT5odHRwX2Jhc2UpOwoJCQkJJHRoaXMtPmJhc2VfbG9jYXRpb24gPSAkZWxlbWVudFsnb2Zmc2V0J107CgkJCQlicmVhazsKCQkJfQoJCX0KCX0KCglmdW5jdGlvbiBhdXRvZGlzY292ZXJ5KCkKCXsKCQkkbGlua3MgPSBhcnJheV9tZXJnZShTaW1wbGVQaWVfTWlzYzo6Z2V0X2VsZW1lbnQoJ2xpbmsnLCAkdGhpcy0+ZmlsZS0+Ym9keSksIFNpbXBsZVBpZV9NaXNjOjpnZXRfZWxlbWVudCgnYScsICR0aGlzLT5maWxlLT5ib2R5KSwgU2ltcGxlUGllX01pc2M6OmdldF9lbGVtZW50KCdhcmVhJywgJHRoaXMtPmZpbGUtPmJvZHkpKTsKCQkkZG9uZSA9IGFycmF5KCk7CgkJZm9yZWFjaCAoJGxpbmtzIGFzICRsaW5rKQoJCXsKCQkJaWYgKCR0aGlzLT5jaGVja2VkX2ZlZWRzID09ICR0aGlzLT5tYXhfY2hlY2tlZF9mZWVkcykKCQkJewoJCQkJYnJlYWs7CgkJCX0KCQkJaWYgKGlzc2V0KCRsaW5rWydhdHRyaWJzJ11bJ2hyZWYnXVsnZGF0YSddKSAmJiBpc3NldCgkbGlua1snYXR0cmlicyddWydyZWwnXVsnZGF0YSddKSkKCQkJewoJCQkJJHJlbCA9IGFycmF5X3VuaXF1ZShTaW1wbGVQaWVfTWlzYzo6c3BhY2Vfc2VwZXJhdGVkX3Rva2VucyhzdHJ0b2xvd2VyKCRsaW5rWydhdHRyaWJzJ11bJ3JlbCddWydkYXRhJ10pKSk7CgoJCQkJaWYgKCR0aGlzLT5iYXNlX2xvY2F0aW9uIDwgJGxpbmtbJ29mZnNldCddKQoJCQkJewoJCQkJCSRocmVmID0gU2ltcGxlUGllX01pc2M6OmFic29sdXRpemVfdXJsKHRyaW0oJGxpbmtbJ2F0dHJpYnMnXVsnaHJlZiddWydkYXRhJ10pLCAkdGhpcy0+YmFzZSk7CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJJGhyZWYgPSBTaW1wbGVQaWVfTWlzYzo6YWJzb2x1dGl6ZV91cmwodHJpbSgkbGlua1snYXR0cmlicyddWydocmVmJ11bJ2RhdGEnXSksICR0aGlzLT5odHRwX2Jhc2UpOwoJCQkJfQoKCQkJCWlmICghaW5fYXJyYXkoJGhyZWYsICRkb25lKSAmJiBpbl9hcnJheSgnZmVlZCcsICRyZWwpIHx8IChpbl9hcnJheSgnYWx0ZXJuYXRlJywgJHJlbCkgJiYgIWVtcHR5KCRsaW5rWydhdHRyaWJzJ11bJ3R5cGUnXVsnZGF0YSddKSAmJiBpbl9hcnJheShzdHJ0b2xvd2VyKFNpbXBsZVBpZV9NaXNjOjpwYXJzZV9taW1lKCRsaW5rWydhdHRyaWJzJ11bJ3R5cGUnXVsnZGF0YSddKSksIGFycmF5KCdhcHBsaWNhdGlvbi9yc3MreG1sJywgJ2FwcGxpY2F0aW9uL2F0b20reG1sJykpKSkKCQkJCXsKCQkJCQkkdGhpcy0+Y2hlY2tlZF9mZWVkcysrOwoJCQkJCSRmZWVkID0mIG5ldyAkdGhpcy0+ZmlsZV9jbGFzcygkaHJlZiwgJHRoaXMtPnRpbWVvdXQsIDUsIG51bGwsICR0aGlzLT51c2VyYWdlbnQpOwoJCQkJCWlmICgkdGhpcy0+aXNfZmVlZCgkZmVlZCkpCgkJCQkJewoJCQkJCQlyZXR1cm4gJGZlZWQ7CgkJCQkJfQoJCQkJfQoJCQkJJGRvbmVbXSA9ICRocmVmOwoJCQl9CgkJfQoJCXJldHVybiBudWxsOwoJfQoKCWZ1bmN0aW9uIGdldF9saW5rcygpCgl7CgkJJGxpbmtzID0gU2ltcGxlUGllX01pc2M6OmdldF9lbGVtZW50KCdhJywgJHRoaXMtPmZpbGUtPmJvZHkpOwoJCWZvcmVhY2ggKCRsaW5rcyBhcyAkbGluaykKCQl7CgkJCWlmIChpc3NldCgkbGlua1snYXR0cmlicyddWydocmVmJ11bJ2RhdGEnXSkpCgkJCXsKCQkJCSRocmVmID0gdHJpbSgkbGlua1snYXR0cmlicyddWydocmVmJ11bJ2RhdGEnXSk7CgkJCQkkcGFyc2VkID0gU2ltcGxlUGllX01pc2M6OnBhcnNlX3VybCgkaHJlZik7CgkJCQlpZiAoJHBhcnNlZFsnc2NoZW1lJ10gPT09ICcnIHx8IHByZWdfbWF0Y2goJy9eKGh0dHAocyl8ZmVlZCk/JC9pJywgJHBhcnNlZFsnc2NoZW1lJ10pKQoJCQkJewoJCQkJCWlmICgkdGhpcy0+YmFzZV9sb2NhdGlvbiA8ICRsaW5rWydvZmZzZXQnXSkKCQkJCQl7CgkJCQkJCSRocmVmID0gU2ltcGxlUGllX01pc2M6OmFic29sdXRpemVfdXJsKHRyaW0oJGxpbmtbJ2F0dHJpYnMnXVsnaHJlZiddWydkYXRhJ10pLCAkdGhpcy0+YmFzZSk7CgkJCQkJfQoJCQkJCWVsc2UKCQkJCQl7CgkJCQkJCSRocmVmID0gU2ltcGxlUGllX01pc2M6OmFic29sdXRpemVfdXJsKHRyaW0oJGxpbmtbJ2F0dHJpYnMnXVsnaHJlZiddWydkYXRhJ10pLCAkdGhpcy0+aHR0cF9iYXNlKTsKCQkJCQl9CgoJCQkJCSRjdXJyZW50ID0gU2ltcGxlUGllX01pc2M6OnBhcnNlX3VybCgkdGhpcy0+ZmlsZS0+dXJsKTsKCgkJCQkJaWYgKCRwYXJzZWRbJ2F1dGhvcml0eSddID09PSAnJyB8fCAkcGFyc2VkWydhdXRob3JpdHknXSA9PSAkY3VycmVudFsnYXV0aG9yaXR5J10pCgkJCQkJewoJCQkJCQkkdGhpcy0+bG9jYWxbXSA9ICRocmVmOwoJCQkJCX0KCQkJCQllbHNlCgkJCQkJewoJCQkJCQkkdGhpcy0+ZWxzZXdoZXJlW10gPSAkaHJlZjsKCQkJCQl9CgkJCQl9CgkJCX0KCQl9CgkJJHRoaXMtPmxvY2FsID0gYXJyYXlfdW5pcXVlKCR0aGlzLT5sb2NhbCk7CgkJJHRoaXMtPmVsc2V3aGVyZSA9IGFycmF5X3VuaXF1ZSgkdGhpcy0+ZWxzZXdoZXJlKTsKCQlpZiAoIWVtcHR5KCR0aGlzLT5sb2NhbCkgfHwgIWVtcHR5KCR0aGlzLT5lbHNld2hlcmUpKQoJCXsKCQkJcmV0dXJuIHRydWU7CgkJfQoJCXJldHVybiBudWxsOwoJfQoKCWZ1bmN0aW9uIGV4dGVuc2lvbigmJGFycmF5KQoJewoJCWZvcmVhY2ggKCRhcnJheSBhcyAka2V5ID0+ICR2YWx1ZSkKCQl7CgkJCWlmICgkdGhpcy0+Y2hlY2tlZF9mZWVkcyA9PSAkdGhpcy0+bWF4X2NoZWNrZWRfZmVlZHMpCgkJCXsKCQkJCWJyZWFrOwoJCQl9CgkJCWlmIChpbl9hcnJheShzdHJ0b2xvd2VyKHN0cnJjaHIoJHZhbHVlLCAnLicpKSwgYXJyYXkoJy5yc3MnLCAnLnJkZicsICcuYXRvbScsICcueG1sJykpKQoJCQl7CgkJCQkkdGhpcy0+Y2hlY2tlZF9mZWVkcysrOwoJCQkJJGZlZWQgPSYgbmV3ICR0aGlzLT5maWxlX2NsYXNzKCR2YWx1ZSwgJHRoaXMtPnRpbWVvdXQsIDUsIG51bGwsICR0aGlzLT51c2VyYWdlbnQpOwoJCQkJaWYgKCR0aGlzLT5pc19mZWVkKCRmZWVkKSkKCQkJCXsKCQkJCQlyZXR1cm4gJGZlZWQ7CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJdW5zZXQoJGFycmF5WyRrZXldKTsKCQkJCX0KCQkJfQoJCX0KCQlyZXR1cm4gbnVsbDsKCX0KCglmdW5jdGlvbiBib2R5KCYkYXJyYXkpCgl7CgkJZm9yZWFjaCAoJGFycmF5IGFzICRrZXkgPT4gJHZhbHVlKQoJCXsKCQkJaWYgKCR0aGlzLT5jaGVja2VkX2ZlZWRzID09ICR0aGlzLT5tYXhfY2hlY2tlZF9mZWVkcykKCQkJewoJCQkJYnJlYWs7CgkJCX0KCQkJaWYgKHByZWdfbWF0Y2goJy8ocnNzfHJkZnxhdG9tfHhtbCkvaScsICR2YWx1ZSkpCgkJCXsKCQkJCSR0aGlzLT5jaGVja2VkX2ZlZWRzKys7CgkJCQkkZmVlZCA9JiBuZXcgJHRoaXMtPmZpbGVfY2xhc3MoJHZhbHVlLCAkdGhpcy0+dGltZW91dCwgNSwgbnVsbCwgJHRoaXMtPnVzZXJhZ2VudCk7CgkJCQlpZiAoJHRoaXMtPmlzX2ZlZWQoJGZlZWQpKQoJCQkJewoJCQkJCXJldHVybiAkZmVlZDsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQl1bnNldCgkYXJyYXlbJGtleV0pOwoJCQkJfQoJCQl9CgkJfQoJCXJldHVybiBudWxsOwoJfQp9CgpjbGFzcyBTaW1wbGVQaWVfUGFyc2VyCnsKCXZhciAkZXJyb3JfY29kZTsKCXZhciAkZXJyb3Jfc3RyaW5nOwoJdmFyICRjdXJyZW50X2xpbmU7Cgl2YXIgJGN1cnJlbnRfY29sdW1uOwoJdmFyICRjdXJyZW50X2J5dGU7Cgl2YXIgJHNlcGFyYXRvciA9ICcgJzsKCXZhciAkZmVlZCA9IGZhbHNlOwoJdmFyICRuYW1lc3BhY2UgPSBhcnJheSgnJyk7Cgl2YXIgJGVsZW1lbnQgPSBhcnJheSgnJyk7Cgl2YXIgJHhtbF9iYXNlID0gYXJyYXkoJycpOwoJdmFyICR4bWxfYmFzZV9leHBsaWNpdCA9IGFycmF5KGZhbHNlKTsKCXZhciAkeG1sX2xhbmcgPSBhcnJheSgnJyk7Cgl2YXIgJGRhdGEgPSBhcnJheSgpOwoJdmFyICRkYXRhcyA9IGFycmF5KGFycmF5KCkpOwoJdmFyICRjdXJyZW50X3hodG1sX2NvbnN0cnVjdCA9IC0xOwoJdmFyICRlbmNvZGluZzsKCglmdW5jdGlvbiBwYXJzZSgmJGRhdGEsICRlbmNvZGluZykKCXsKCQkvLyBVc2UgVVRGLTggaWYgd2UgZ2V0IHBhc3NlZCBVUy1BU0NJSSwgYXMgZXZlcnkgVVMtQVNDSUkgY2hhcmFjdGVyIGlzIGEgVVRGLTggY2hhcmFjdGVyCgkJaWYgKHN0cnRvdXBwZXIoJGVuY29kaW5nKSA9PSAnVVMtQVNDSUknKQoJCXsKCQkJJHRoaXMtPmVuY29kaW5nID0gJ1VURi04JzsKCQl9CgkJZWxzZQoJCXsKCQkJJHRoaXMtPmVuY29kaW5nID0gJGVuY29kaW5nOwoJCX0KCgkJLy8gU3RyaXAgQk9NOgoJCS8vIFVURi0zMiBCaWcgRW5kaWFuIEJPTQoJCWlmIChzdWJzdHIoJGRhdGEsIDAsIDQpID09PSAiXHgwMFx4MDBceEZFXHhGRiIpCgkJewoJCQkkZGF0YSA9IHN1YnN0cigkZGF0YSwgNCk7CgkJfQoJCS8vIFVURi0zMiBMaXR0bGUgRW5kaWFuIEJPTQoJCWVsc2VpZiAoc3Vic3RyKCRkYXRhLCAwLCA0KSA9PT0gIlx4RkZceEZFXHgwMFx4MDAiKQoJCXsKCQkJJGRhdGEgPSBzdWJzdHIoJGRhdGEsIDQpOwoJCX0KCQkvLyBVVEYtMTYgQmlnIEVuZGlhbiBCT00KCQllbHNlaWYgKHN1YnN0cigkZGF0YSwgMCwgMikgPT09ICJceEZFXHhGRiIpCgkJewoJCQkkZGF0YSA9IHN1YnN0cigkZGF0YSwgMik7CgkJfQoJCS8vIFVURi0xNiBMaXR0bGUgRW5kaWFuIEJPTQoJCWVsc2VpZiAoc3Vic3RyKCRkYXRhLCAwLCAyKSA9PT0gIlx4RkZceEZFIikKCQl7CgkJCSRkYXRhID0gc3Vic3RyKCRkYXRhLCAyKTsKCQl9CgkJLy8gVVRGLTggQk9NCgkJZWxzZWlmIChzdWJzdHIoJGRhdGEsIDAsIDMpID09PSAiXHhFRlx4QkJceEJGIikKCQl7CgkJCSRkYXRhID0gc3Vic3RyKCRkYXRhLCAzKTsKCQl9CgoJCWlmIChzdWJzdHIoJGRhdGEsIDAsIDUpID09PSAnPD94bWwnICYmIHN0cnNwbihzdWJzdHIoJGRhdGEsIDUsIDEpLCAiXHgwOVx4MEFceDBEXHgyMCIpICYmICgkcG9zID0gc3RycG9zKCRkYXRhLCAnPz4nKSkgIT09IGZhbHNlKQoJCXsKCQkJJGRlY2xhcmF0aW9uID0gbmV3IFNpbXBsZVBpZV9YTUxfRGVjbGFyYXRpb25fUGFyc2VyKHN1YnN0cigkZGF0YSwgNSwgJHBvcyAtIDUpKTsKCQkJaWYgKCRkZWNsYXJhdGlvbi0+cGFyc2UoKSkKCQkJewoJCQkJJGRhdGEgPSBzdWJzdHIoJGRhdGEsICRwb3MgKyAyKTsKCQkJCSRkYXRhID0gJzw/eG1sIHZlcnNpb249IicgLiAkZGVjbGFyYXRpb24tPnZlcnNpb24gLiAnIiBlbmNvZGluZz0iJyAuICRlbmNvZGluZyAuICciIHN0YW5kYWxvbmU9IicgLiAoKCRkZWNsYXJhdGlvbi0+c3RhbmRhbG9uZSkgPyAneWVzJyA6ICdubycpIC4gJyI/PicgLiAkZGF0YTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCSR0aGlzLT5lcnJvcl9zdHJpbmcgPSAnU2ltcGxlUGllIGJ1ZyEgUGxlYXNlIHJlcG9ydCB0aGlzISc7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQl9CgoJCS8vIFdvcmsgYXJvdW5kIGxpYnhtbCBidWcKCQkkZGF0YSA9IHN0cl9yZXBsYWNlKCcmbHQ7JywgJyYjNjA7JywgJGRhdGEpOwoJCSRkYXRhID0gc3RyX3JlcGxhY2UoJyZndDsnLCAnJiM2MjsnLCAkZGF0YSk7CgkJJGRhdGEgPSBzdHJfcmVwbGFjZSgnJmFtcDsnLCAnJiMzODsnLCAkZGF0YSk7CgkJJGRhdGEgPSBzdHJfcmVwbGFjZSgnJmFwb3M7JywgJyYjMzk7JywgJGRhdGEpOwoJCSRkYXRhID0gc3RyX3JlcGxhY2UoJyZxdW90OycsICcmIzM0OycsICRkYXRhKTsKCgkJJHJldHVybiA9IHRydWU7CgoJCS8vIENyZWF0ZSB0aGUgcGFyc2VyCgkJJHhtbCA9IHhtbF9wYXJzZXJfY3JlYXRlX25zKCR0aGlzLT5lbmNvZGluZywgJHRoaXMtPnNlcGFyYXRvcik7CgkJeG1sX3BhcnNlcl9zZXRfb3B0aW9uKCR4bWwsIFhNTF9PUFRJT05fU0tJUF9XSElURSwgMSk7CgkJeG1sX3BhcnNlcl9zZXRfb3B0aW9uKCR4bWwsIFhNTF9PUFRJT05fQ0FTRV9GT0xESU5HLCAwKTsKCQl4bWxfc2V0X29iamVjdCgkeG1sLCAkdGhpcyk7CgkJeG1sX3NldF9jaGFyYWN0ZXJfZGF0YV9oYW5kbGVyKCR4bWwsICdjZGF0YScpOwoJCXhtbF9zZXRfZWxlbWVudF9oYW5kbGVyKCR4bWwsICd0YWdfb3BlbicsICd0YWdfY2xvc2UnKTsKCgkJLy8gUGFyc2UhCgkJaWYgKCF4bWxfcGFyc2UoJHhtbCwgJGRhdGEsIHRydWUpKQoJCXsKCQkJJHRoaXMtPmVycm9yX2NvZGUgPSB4bWxfZ2V0X2Vycm9yX2NvZGUoJHhtbCk7CgkJCSR0aGlzLT5lcnJvcl9zdHJpbmcgPSB4bWxfZXJyb3Jfc3RyaW5nKCR0aGlzLT5lcnJvcl9jb2RlKTsKCQkJJHJldHVybiA9IGZhbHNlOwoJCX0KCQkkdGhpcy0+Y3VycmVudF9saW5lID0geG1sX2dldF9jdXJyZW50X2xpbmVfbnVtYmVyKCR4bWwpOwoJCSR0aGlzLT5jdXJyZW50X2NvbHVtbiA9IHhtbF9nZXRfY3VycmVudF9jb2x1bW5fbnVtYmVyKCR4bWwpOwoJCSR0aGlzLT5jdXJyZW50X2J5dGUgPSB4bWxfZ2V0X2N1cnJlbnRfYnl0ZV9pbmRleCgkeG1sKTsKCQl4bWxfcGFyc2VyX2ZyZWUoJHhtbCk7CgkJcmV0dXJuICRyZXR1cm47Cgl9CgoJZnVuY3Rpb24gZ2V0X2Vycm9yX2NvZGUoKQoJewoJCXJldHVybiAkdGhpcy0+ZXJyb3JfY29kZTsKCX0KCglmdW5jdGlvbiBnZXRfZXJyb3Jfc3RyaW5nKCkKCXsKCQlyZXR1cm4gJHRoaXMtPmVycm9yX3N0cmluZzsKCX0KCglmdW5jdGlvbiBnZXRfY3VycmVudF9saW5lKCkKCXsKCQlyZXR1cm4gJHRoaXMtPmN1cnJlbnRfbGluZTsKCX0KCglmdW5jdGlvbiBnZXRfY3VycmVudF9jb2x1bW4oKQoJewoJCXJldHVybiAkdGhpcy0+Y3VycmVudF9jb2x1bW47Cgl9CgoJZnVuY3Rpb24gZ2V0X2N1cnJlbnRfYnl0ZSgpCgl7CgkJcmV0dXJuICR0aGlzLT5jdXJyZW50X2J5dGU7Cgl9CgoJZnVuY3Rpb24gZ2V0X2RhdGEoKQoJewoJCXJldHVybiAkdGhpcy0+ZGF0YTsKCX0KCglmdW5jdGlvbiB0YWdfb3BlbigkcGFyc2VyLCAkdGFnLCAkYXR0cmlidXRlcykKCXsKCQlpZiAoJHRoaXMtPmZlZWQgPT09IDApCgkJewoJCQlyZXR1cm47CgkJfQoJCWVsc2VpZiAoJHRoaXMtPmZlZWQgPT0gZmFsc2UpCgkJewoJCQlpZiAoaW5fYXJyYXkoJHRhZywgYXJyYXkoCgkJCQlTSU1QTEVQSUVfTkFNRVNQQUNFX0FUT01fMTAgLiAkdGhpcy0+c2VwYXJhdG9yIC4gJ2ZlZWQnLAoJCQkJU0lNUExFUElFX05BTUVTUEFDRV9BVE9NXzAzIC4gJHRoaXMtPnNlcGFyYXRvciAuICdmZWVkJywKCQkJCSdyc3MnLAoJCQkJU0lNUExFUElFX05BTUVTUEFDRV9SREYgLiAkdGhpcy0+c2VwYXJhdG9yIC4gJ1JERicKCQkJKSkpCgkJCXsKCQkJCQkkdGhpcy0+ZmVlZCA9IDE7CgkJCX0KCQl9CgkJZWxzZQoJCXsKCQkJJHRoaXMtPmZlZWQrKzsKCQl9CgoJCWxpc3QoJHRoaXMtPm5hbWVzcGFjZVtdLCAkdGhpcy0+ZWxlbWVudFtdKSA9ICR0aGlzLT5zcGxpdF9ucygkdGFnKTsKCgkJJGF0dHJpYnMgPSBhcnJheSgpOwoJCWZvcmVhY2ggKCRhdHRyaWJ1dGVzIGFzICRuYW1lID0+ICR2YWx1ZSkKCQl7CgkJCWxpc3QoJGF0dHJpYl9uYW1lc3BhY2UsICRhdHRyaWJ1dGUpID0gJHRoaXMtPnNwbGl0X25zKCRuYW1lKTsKCQkJJGF0dHJpYnNbJGF0dHJpYl9uYW1lc3BhY2VdWyRhdHRyaWJ1dGVdID0gJHZhbHVlOwoJCX0KCgkJaWYgKGlzc2V0KCRhdHRyaWJzW1NJTVBMRVBJRV9OQU1FU1BBQ0VfWE1MXVsnYmFzZSddKSkKCQl7CgkJCSR0aGlzLT54bWxfYmFzZVtdID0gU2ltcGxlUGllX01pc2M6OmFic29sdXRpemVfdXJsKCRhdHRyaWJzW1NJTVBMRVBJRV9OQU1FU1BBQ0VfWE1MXVsnYmFzZSddLCBlbmQoJHRoaXMtPnhtbF9iYXNlKSk7CgkJCSR0aGlzLT54bWxfYmFzZV9leHBsaWNpdFtdID0gdHJ1ZTsKCQl9CgkJZWxzZQoJCXsKCQkJJHRoaXMtPnhtbF9iYXNlW10gPSBlbmQoJHRoaXMtPnhtbF9iYXNlKTsKCQkJJHRoaXMtPnhtbF9iYXNlX2V4cGxpY2l0W10gPSBlbmQoJHRoaXMtPnhtbF9iYXNlX2V4cGxpY2l0KTsKCQl9CgoJCWlmIChpc3NldCgkYXR0cmlic1tTSU1QTEVQSUVfTkFNRVNQQUNFX1hNTF1bJ2xhbmcnXSkpCgkJewoJCQkkdGhpcy0+eG1sX2xhbmdbXSA9ICRhdHRyaWJzW1NJTVBMRVBJRV9OQU1FU1BBQ0VfWE1MXVsnbGFuZyddOwoJCX0KCQllbHNlCgkJewoJCQkkdGhpcy0+eG1sX2xhbmdbXSA9IGVuZCgkdGhpcy0+eG1sX2xhbmcpOwoJCX0KCgkJaWYgKCR0aGlzLT5jdXJyZW50X3hodG1sX2NvbnN0cnVjdCA+PSAwKQoJCXsKCQkJJHRoaXMtPmN1cnJlbnRfeGh0bWxfY29uc3RydWN0Kys7CgkJCWlmIChlbmQoJHRoaXMtPm5hbWVzcGFjZSkgPT0gU0lNUExFUElFX05BTUVTUEFDRV9YSFRNTCkKCQkJewoJCQkJJHRoaXMtPmRhdGFbJ2RhdGEnXSAuPSAnPCcgLiBlbmQoJHRoaXMtPmVsZW1lbnQpOwoJCQkJaWYgKGlzc2V0KCRhdHRyaWJzWycnXSkpCgkJCQl7CgkJCQkJZm9yZWFjaCAoJGF0dHJpYnNbJyddIGFzICRuYW1lID0+ICR2YWx1ZSkKCQkJCQl7CgkJCQkJCSR0aGlzLT5kYXRhWydkYXRhJ10gLj0gJyAnIC4gJG5hbWUgLiAnPSInIC4gaHRtbHNwZWNpYWxjaGFycygkdmFsdWUsIEVOVF9DT01QQVQsICR0aGlzLT5lbmNvZGluZykgLiAnIic7CgkJCQkJfQoJCQkJfQoJCQkJJHRoaXMtPmRhdGFbJ2RhdGEnXSAuPSAnPic7CgkJCX0KCQl9CgkJZWxzZQoJCXsKCQkJJHRoaXMtPmRhdGFzW10gPSYgJHRoaXMtPmRhdGE7CgkJCSR0aGlzLT5kYXRhID0mICR0aGlzLT5kYXRhWydjaGlsZCddW2VuZCgkdGhpcy0+bmFtZXNwYWNlKV1bZW5kKCR0aGlzLT5lbGVtZW50KV1bXTsKCQkJJHRoaXMtPmRhdGEgPSBhcnJheSgnZGF0YScgPT4gJycsICdhdHRyaWJzJyA9PiAkYXR0cmlicywgJ3htbF9iYXNlJyA9PiBlbmQoJHRoaXMtPnhtbF9iYXNlKSwgJ3htbF9iYXNlX2V4cGxpY2l0JyA9PiBlbmQoJHRoaXMtPnhtbF9iYXNlX2V4cGxpY2l0KSwgJ3htbF9sYW5nJyA9PiBlbmQoJHRoaXMtPnhtbF9sYW5nKSk7CgkJCWlmICgoZW5kKCR0aGlzLT5uYW1lc3BhY2UpID09IFNJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8wMyAmJiBpbl9hcnJheShlbmQoJHRoaXMtPmVsZW1lbnQpLCBhcnJheSgndGl0bGUnLCAndGFnbGluZScsICdjb3B5cmlnaHQnLCAnaW5mbycsICdzdW1tYXJ5JywgJ2NvbnRlbnQnKSkgJiYgaXNzZXQoJGF0dHJpYnNbJyddWydtb2RlJ10pICYmICRhdHRyaWJzWycnXVsnbW9kZSddID09ICd4bWwnKQoJCQl8fCAoZW5kKCR0aGlzLT5uYW1lc3BhY2UpID09IFNJTVBMRVBJRV9OQU1FU1BBQ0VfQVRPTV8xMCAmJiBpbl9hcnJheShlbmQoJHRoaXMtPmVsZW1lbnQpLCBhcnJheSgncmlnaHRzJywgJ3N1YnRpdGxlJywgJ3N1bW1hcnknLCAnaW5mbycsICd0aXRsZScsICdjb250ZW50JykpICYmIGlzc2V0KCRhdHRyaWJzWycnXVsndHlwZSddKSAmJiAkYXR0cmlic1snJ11bJ3R5cGUnXSA9PSAneGh0bWwnKSkKCQkJewoJCQkJJHRoaXMtPmN1cnJlbnRfeGh0bWxfY29uc3RydWN0ID0gMDsKCQkJfQoJCX0KCX0KCglmdW5jdGlvbiBjZGF0YSgkcGFyc2VyLCAkY2RhdGEpCgl7CgkJaWYgKCR0aGlzLT5jdXJyZW50X3hodG1sX2NvbnN0cnVjdCA+PSAwKQoJCXsKCQkJJHRoaXMtPmRhdGFbJ2RhdGEnXSAuPSBodG1sc3BlY2lhbGNoYXJzKCRjZGF0YSwgRU5UX1FVT1RFUywgJHRoaXMtPmVuY29kaW5nKTsKCQl9CgkJZWxzZWlmICgkdGhpcy0+ZmVlZCA+IDEpCgkJewoJCQkkdGhpcy0+ZGF0YVsnZGF0YSddIC49ICRjZGF0YTsKCQl9Cgl9CgoJZnVuY3Rpb24gdGFnX2Nsb3NlKCRwYXJzZXIsICR0YWcpCgl7CgkJaWYgKCEkdGhpcy0+ZmVlZCkKCQl7CgkJCXJldHVybjsKCQl9CgoJCWlmICgkdGhpcy0+Y3VycmVudF94aHRtbF9jb25zdHJ1Y3QgPj0gMCkKCQl7CgkJCSR0aGlzLT5jdXJyZW50X3hodG1sX2NvbnN0cnVjdC0tOwoJCQlpZiAoZW5kKCR0aGlzLT5uYW1lc3BhY2UpID09IFNJTVBMRVBJRV9OQU1FU1BBQ0VfWEhUTUwgJiYgIWluX2FycmF5KGVuZCgkdGhpcy0+ZWxlbWVudCksIGFycmF5KCdhcmVhJywgJ2Jhc2UnLCAnYmFzZWZvbnQnLCAnYnInLCAnY29sJywgJ2ZyYW1lJywgJ2hyJywgJ2ltZycsICdpbnB1dCcsICdpc2luZGV4JywgJ2xpbmsnLCAnbWV0YScsICdwYXJhbScpKSkKCQkJewoJCQkJJHRoaXMtPmRhdGFbJ2RhdGEnXSAuPSAnPC8nIC4gZW5kKCR0aGlzLT5lbGVtZW50KSAuICc+JzsKCQkJfQoJCX0KCQlpZiAoJHRoaXMtPmN1cnJlbnRfeGh0bWxfY29uc3RydWN0ID09IC0xKQoJCXsKCQkJJHRoaXMtPmRhdGEgPSYgJHRoaXMtPmRhdGFzWyR0aGlzLT5mZWVkXTsKCQkJYXJyYXlfcG9wKCR0aGlzLT5kYXRhcyk7CgkJfQoKCQlhcnJheV9wb3AoJHRoaXMtPmVsZW1lbnQpOwoJCWFycmF5X3BvcCgkdGhpcy0+bmFtZXNwYWNlKTsKCQlhcnJheV9wb3AoJHRoaXMtPnhtbF9iYXNlKTsKCQlhcnJheV9wb3AoJHRoaXMtPnhtbF9iYXNlX2V4cGxpY2l0KTsKCQlhcnJheV9wb3AoJHRoaXMtPnhtbF9sYW5nKTsKCQkkdGhpcy0+ZmVlZC0tOwoJfQoKCWZ1bmN0aW9uIHNwbGl0X25zKCRzdHJpbmcpCgl7CgkJc3RhdGljICRjYWNoZSA9IGFycmF5KCk7CgkJaWYgKCFpc3NldCgkY2FjaGVbJHN0cmluZ10pKQoJCXsKCQkJaWYgKCRwb3MgPSBzdHJwb3MoJHN0cmluZywgJHRoaXMtPnNlcGFyYXRvcikpCgkJCXsKCQkJCXN0YXRpYyAkc2VwYXJhdG9yX2xlbmd0aDsKCQkJCWlmICghJHNlcGFyYXRvcl9sZW5ndGgpCgkJCQl7CgkJCQkJJHNlcGFyYXRvcl9sZW5ndGggPSBzdHJsZW4oJHRoaXMtPnNlcGFyYXRvcik7CgkJCQl9CgkJCQkkbmFtZXNwYWNlID0gc3Vic3RyKCRzdHJpbmcsIDAsICRwb3MpOwoJCQkJJGxvY2FsX25hbWUgPSBzdWJzdHIoJHN0cmluZywgJHBvcyArICRzZXBhcmF0b3JfbGVuZ3RoKTsKCQkJCWlmIChzdHJ0b2xvd2VyKCRuYW1lc3BhY2UpID09PSBTSU1QTEVQSUVfTkFNRVNQQUNFX0lUVU5FUykKCQkJCXsKCQkJCQkkbmFtZXNwYWNlID0gU0lNUExFUElFX05BTUVTUEFDRV9JVFVORVM7CgkJCQl9CgoJCQkJLy8gTm9ybWFsaXplIHRoZSBNZWRpYSBSU1MgbmFtZXNwYWNlcwoJCQkJaWYgKCRuYW1lc3BhY2UgPT09IFNJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1NfV1JPTkcpCgkJCQl7CgkJCQkJJG5hbWVzcGFjZSA9IFNJTVBMRVBJRV9OQU1FU1BBQ0VfTUVESUFSU1M7CgkJCQl9CgkJCQkkY2FjaGVbJHN0cmluZ10gPSBhcnJheSgkbmFtZXNwYWNlLCAkbG9jYWxfbmFtZSk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQkkY2FjaGVbJHN0cmluZ10gPSBhcnJheSgnJywgJHN0cmluZyk7CgkJCX0KCQl9CgkJcmV0dXJuICRjYWNoZVskc3RyaW5nXTsKCX0KfQoKLyoqCiAqIEB0b2RvIE1vdmUgdG8gdXNpbmcgYW4gYWN0dWFsIEhUTUwgcGFyc2VyICh0aGlzIHdpbGwgYWxsb3cgdGFncyB0byBiZSBwcm9wZXJseSBzdHJpcHBlZCwgYW5kIHRvIHN3aXRjaCBiZXR3ZWVuIEhUTUwgYW5kIFhIVE1MKSwgdGhpcyB3aWxsIGFsc28gbWFrZSBpdCBlYXNpZXIgdG8gc2hvcnRlbiBhIHN0cmluZyB3aGlsZSBwcmVzZXJ2aW5nIEhUTUwgdGFncwogKi8KY2xhc3MgU2ltcGxlUGllX1Nhbml0aXplCnsKCS8vIFByaXZhdGUgdmFycwoJdmFyICRiYXNlOwoKCS8vIE9wdGlvbnMKCXZhciAkcmVtb3ZlX2RpdiA9IHRydWU7Cgl2YXIgJGltYWdlX2hhbmRsZXIgPSAnJzsKCXZhciAkc3RyaXBfaHRtbHRhZ3MgPSBhcnJheSgnYmFzZScsICdibGluaycsICdib2R5JywgJ2RvY3R5cGUnLCAnZW1iZWQnLCAnZm9udCcsICdmb3JtJywgJ2ZyYW1lJywgJ2ZyYW1lc2V0JywgJ2h0bWwnLCAnaWZyYW1lJywgJ2lucHV0JywgJ21hcnF1ZWUnLCAnbWV0YScsICdub3NjcmlwdCcsICdvYmplY3QnLCAncGFyYW0nLCAnc2NyaXB0JywgJ3N0eWxlJyk7Cgl2YXIgJGVuY29kZV9pbnN0ZWFkX29mX3N0cmlwID0gZmFsc2U7Cgl2YXIgJHN0cmlwX2F0dHJpYnV0ZXMgPSBhcnJheSgnYmdzb3VuZCcsICdjbGFzcycsICdleHByJywgJ2lkJywgJ3N0eWxlJywgJ29uY2xpY2snLCAnb25lcnJvcicsICdvbmZpbmlzaCcsICdvbm1vdXNlb3ZlcicsICdvbm1vdXNlb3V0JywgJ29uZm9jdXMnLCAnb25ibHVyJywgJ2xvd3NyYycsICdkeW5zcmMnKTsKCXZhciAkc3RyaXBfY29tbWVudHMgPSBmYWxzZTsKCXZhciAkb3V0cHV0X2VuY29kaW5nID0gJ1VURi04JzsKCXZhciAkZW5hYmxlX2NhY2hlID0gdHJ1ZTsKCXZhciAkY2FjaGVfbG9jYXRpb24gPSAnLi9jYWNoZSc7Cgl2YXIgJGNhY2hlX25hbWVfZnVuY3Rpb24gPSAnbWQ1JzsKCXZhciAkY2FjaGVfY2xhc3MgPSAnU2ltcGxlUGllX0NhY2hlJzsKCXZhciAkZmlsZV9jbGFzcyA9ICdTaW1wbGVQaWVfRmlsZSc7Cgl2YXIgJHRpbWVvdXQgPSAxMDsKCXZhciAkdXNlcmFnZW50ID0gJyc7Cgl2YXIgJGZvcmNlX2Zzb2Nrb3BlbiA9IGZhbHNlOwoKCXZhciAkcmVwbGFjZV91cmxfYXR0cmlidXRlcyA9IGFycmF5KAoJCSdhJyA9PiAnaHJlZicsCgkJJ2FyZWEnID0+ICdocmVmJywKCQknYmxvY2txdW90ZScgPT4gJ2NpdGUnLAoJCSdkZWwnID0+ICdjaXRlJywKCQknZm9ybScgPT4gJ2FjdGlvbicsCgkJJ2ltZycgPT4gYXJyYXkoJ2xvbmdkZXNjJywgJ3NyYycpLAoJCSdpbnB1dCcgPT4gJ3NyYycsCgkJJ2lucycgPT4gJ2NpdGUnLAoJCSdxJyA9PiAnY2l0ZScKCSk7CgoJZnVuY3Rpb24gcmVtb3ZlX2RpdigkZW5hYmxlID0gdHJ1ZSkKCXsKCQkkdGhpcy0+cmVtb3ZlX2RpdiA9IChib29sKSAkZW5hYmxlOwoJfQoKCWZ1bmN0aW9uIHNldF9pbWFnZV9oYW5kbGVyKCRwYWdlID0gZmFsc2UpCgl7CgkJaWYgKCRwYWdlKQoJCXsKCQkJJHRoaXMtPmltYWdlX2hhbmRsZXIgPSAoc3RyaW5nKSAkcGFnZTsKCQl9CgkJZWxzZQoJCXsKCQkJJHRoaXMtPmltYWdlX2hhbmRsZXIgPSBmYWxzZTsKCQl9Cgl9CgoJZnVuY3Rpb24gcGFzc19jYWNoZV9kYXRhKCRlbmFibGVfY2FjaGUgPSB0cnVlLCAkY2FjaGVfbG9jYXRpb24gPSAnLi9jYWNoZScsICRjYWNoZV9uYW1lX2Z1bmN0aW9uID0gJ21kNScsICRjYWNoZV9jbGFzcyA9ICdTaW1wbGVQaWVfQ2FjaGUnKQoJewoJCWlmIChpc3NldCgkZW5hYmxlX2NhY2hlKSkKCQl7CgkJCSR0aGlzLT5lbmFibGVfY2FjaGUgPSAoYm9vbCkgJGVuYWJsZV9jYWNoZTsKCQl9CgoJCWlmICgkY2FjaGVfbG9jYXRpb24pCgkJewoJCQkkdGhpcy0+Y2FjaGVfbG9jYXRpb24gPSAoc3RyaW5nKSAkY2FjaGVfbG9jYXRpb247CgkJfQoKCQlpZiAoJGNhY2hlX25hbWVfZnVuY3Rpb24pCgkJewoJCQkkdGhpcy0+Y2FjaGVfbmFtZV9mdW5jdGlvbiA9IChzdHJpbmcpICRjYWNoZV9uYW1lX2Z1bmN0aW9uOwoJCX0KCgkJaWYgKCRjYWNoZV9jbGFzcykKCQl7CgkJCSR0aGlzLT5jYWNoZV9jbGFzcyA9IChzdHJpbmcpICRjYWNoZV9jbGFzczsKCQl9Cgl9CgoJZnVuY3Rpb24gcGFzc19maWxlX2RhdGEoJGZpbGVfY2xhc3MgPSAnU2ltcGxlUGllX0ZpbGUnLCAkdGltZW91dCA9IDEwLCAkdXNlcmFnZW50ID0gJycsICRmb3JjZV9mc29ja29wZW4gPSBmYWxzZSkKCXsKCQlpZiAoJGZpbGVfY2xhc3MpCgkJewoJCQkkdGhpcy0+ZmlsZV9jbGFzcyA9IChzdHJpbmcpICRmaWxlX2NsYXNzOwoJCX0KCgkJaWYgKCR0aW1lb3V0KQoJCXsKCQkJJHRoaXMtPnRpbWVvdXQgPSAoc3RyaW5nKSAkdGltZW91dDsKCQl9CgoJCWlmICgkdXNlcmFnZW50KQoJCXsKCQkJJHRoaXMtPnVzZXJhZ2VudCA9IChzdHJpbmcpICR1c2VyYWdlbnQ7CgkJfQoKCQlpZiAoJGZvcmNlX2Zzb2Nrb3BlbikKCQl7CgkJCSR0aGlzLT5mb3JjZV9mc29ja29wZW4gPSAoc3RyaW5nKSAkZm9yY2VfZnNvY2tvcGVuOwoJCX0KCX0KCglmdW5jdGlvbiBzdHJpcF9odG1sdGFncygkdGFncyA9IGFycmF5KCdiYXNlJywgJ2JsaW5rJywgJ2JvZHknLCAnZG9jdHlwZScsICdlbWJlZCcsICdmb250JywgJ2Zvcm0nLCAnZnJhbWUnLCAnZnJhbWVzZXQnLCAnaHRtbCcsICdpZnJhbWUnLCAnaW5wdXQnLCAnbWFycXVlZScsICdtZXRhJywgJ25vc2NyaXB0JywgJ29iamVjdCcsICdwYXJhbScsICdzY3JpcHQnLCAnc3R5bGUnKSkKCXsKCQlpZiAoJHRhZ3MpCgkJewoJCQlpZiAoaXNfYXJyYXkoJHRhZ3MpKQoJCQl7CgkJCQkkdGhpcy0+c3RyaXBfaHRtbHRhZ3MgPSAkdGFnczsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCSR0aGlzLT5zdHJpcF9odG1sdGFncyA9IGV4cGxvZGUoJywnLCAkdGFncyk7CgkJCX0KCQl9CgkJZWxzZQoJCXsKCQkJJHRoaXMtPnN0cmlwX2h0bWx0YWdzID0gZmFsc2U7CgkJfQoJfQoKCWZ1bmN0aW9uIGVuY29kZV9pbnN0ZWFkX29mX3N0cmlwKCRlbmNvZGUgPSBmYWxzZSkKCXsKCQkkdGhpcy0+ZW5jb2RlX2luc3RlYWRfb2Zfc3RyaXAgPSAoYm9vbCkgJGVuY29kZTsKCX0KCglmdW5jdGlvbiBzdHJpcF9hdHRyaWJ1dGVzKCRhdHRyaWJzID0gYXJyYXkoJ2Jnc291bmQnLCAnY2xhc3MnLCAnZXhwcicsICdpZCcsICdzdHlsZScsICdvbmNsaWNrJywgJ29uZXJyb3InLCAnb25maW5pc2gnLCAnb25tb3VzZW92ZXInLCAnb25tb3VzZW91dCcsICdvbmZvY3VzJywgJ29uYmx1cicsICdsb3dzcmMnLCAnZHluc3JjJykpCgl7CgkJaWYgKCRhdHRyaWJzKQoJCXsKCQkJaWYgKGlzX2FycmF5KCRhdHRyaWJzKSkKCQkJewoJCQkJJHRoaXMtPnN0cmlwX2F0dHJpYnV0ZXMgPSAkYXR0cmliczsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCSR0aGlzLT5zdHJpcF9hdHRyaWJ1dGVzID0gZXhwbG9kZSgnLCcsICRhdHRyaWJzKTsKCQkJfQoJCX0KCQllbHNlCgkJewoJCQkkdGhpcy0+c3RyaXBfYXR0cmlidXRlcyA9IGZhbHNlOwoJCX0KCX0KCglmdW5jdGlvbiBzdHJpcF9jb21tZW50cygkc3RyaXAgPSBmYWxzZSkKCXsKCQkkdGhpcy0+c3RyaXBfY29tbWVudHMgPSAoYm9vbCkgJHN0cmlwOwoJfQoKCWZ1bmN0aW9uIHNldF9vdXRwdXRfZW5jb2RpbmcoJGVuY29kaW5nID0gJ1VURi04JykKCXsKCQkkdGhpcy0+b3V0cHV0X2VuY29kaW5nID0gKHN0cmluZykgJGVuY29kaW5nOwoJfQoKCS8qKgoJICogU2V0IGVsZW1lbnQvYXR0cmlidXRlIGtleS92YWx1ZSBwYWlycyBvZiBIVE1MIGF0dHJpYnV0ZXMKCSAqIGNvbnRhaW5pbmcgVVJMcyB0aGF0IG5lZWQgdG8gYmUgcmVzb2x2ZWQgcmVsYXRpdmUgdG8gdGhlIGZlZWQKCSAqCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHNpbmNlIDEuMAoJICogQHBhcmFtIGFycmF5ICRlbGVtZW50X2F0dHJpYnV0ZSBFbGVtZW50L2F0dHJpYnV0ZSBrZXkvdmFsdWUgcGFpcnMKCSAqLwoJZnVuY3Rpb24gc2V0X3VybF9yZXBsYWNlbWVudHMoJGVsZW1lbnRfYXR0cmlidXRlID0gYXJyYXkoJ2EnID0+ICdocmVmJywgJ2FyZWEnID0+ICdocmVmJywgJ2Jsb2NrcXVvdGUnID0+ICdjaXRlJywgJ2RlbCcgPT4gJ2NpdGUnLCAnZm9ybScgPT4gJ2FjdGlvbicsICdpbWcnID0+IGFycmF5KCdsb25nZGVzYycsICdzcmMnKSwgJ2lucHV0JyA9PiAnc3JjJywgJ2lucycgPT4gJ2NpdGUnLCAncScgPT4gJ2NpdGUnKSkKCXsKCQkkdGhpcy0+cmVwbGFjZV91cmxfYXR0cmlidXRlcyA9IChhcnJheSkgJGVsZW1lbnRfYXR0cmlidXRlOwoJfQoKCWZ1bmN0aW9uIHNhbml0aXplKCRkYXRhLCAkdHlwZSwgJGJhc2UgPSAnJykKCXsKCQkkZGF0YSA9IHRyaW0oJGRhdGEpOwoJCWlmICgkZGF0YSAhPT0gJycgfHwgJHR5cGUgJiBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSkKCQl7CgkJCWlmICgkdHlwZSAmIFNJTVBMRVBJRV9DT05TVFJVQ1RfTUFZQkVfSFRNTCkKCQkJewoJCQkJaWYgKHByZWdfbWF0Y2goJy8oJigjKHhbMC05YS1mQS1GXSt8WzAtOV0rKXxbYS16QS1aMC05XSspfDxcL1tBLVphLXpdW15ceDA5XHgwQVx4MEJceDBDXHgwRFx4MjBceDJGXHgzRV0qJyAuIFNJTVBMRVBJRV9QQ1JFX0hUTUxfQVRUUklCVVRFIC4gJz4pLycsICRkYXRhKSkKCQkJCXsKCQkJCQkkdHlwZSB8PSBTSU1QTEVQSUVfQ09OU1RSVUNUX0hUTUw7CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJJHR5cGUgfD0gU0lNUExFUElFX0NPTlNUUlVDVF9URVhUOwoJCQkJfQoJCQl9CgoJCQlpZiAoJHR5cGUgJiBTSU1QTEVQSUVfQ09OU1RSVUNUX0JBU0U2NCkKCQkJewoJCQkJJGRhdGEgPSBiYXNlNjRfZGVjb2RlKCRkYXRhKTsKCQkJfQoKCQkJaWYgKCR0eXBlICYgU0lNUExFUElFX0NPTlNUUlVDVF9YSFRNTCkKCQkJewoJCQkJaWYgKCR0aGlzLT5yZW1vdmVfZGl2KQoJCQkJewoJCQkJCSRkYXRhID0gcHJlZ19yZXBsYWNlKCcvXjxkaXYnIC4gU0lNUExFUElFX1BDUkVfWE1MX0FUVFJJQlVURSAuICc+LycsICcnLCAkZGF0YSk7CgkJCQkJJGRhdGEgPSBwcmVnX3JlcGxhY2UoJy88XC9kaXY+JC8nLCAnJywgJGRhdGEpOwoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCSRkYXRhID0gcHJlZ19yZXBsYWNlKCcvXjxkaXYnIC4gU0lNUExFUElFX1BDUkVfWE1MX0FUVFJJQlVURSAuICc+LycsICc8ZGl2PicsICRkYXRhKTsKCQkJCX0KCQkJfQoKCQkJaWYgKCR0eXBlICYgKFNJTVBMRVBJRV9DT05TVFJVQ1RfSFRNTCB8IFNJTVBMRVBJRV9DT05TVFJVQ1RfWEhUTUwpKQoJCQl7CgkJCQkvLyBTdHJpcCBjb21tZW50cwoJCQkJaWYgKCR0aGlzLT5zdHJpcF9jb21tZW50cykKCQkJCXsKCQkJCQkkZGF0YSA9IFNpbXBsZVBpZV9NaXNjOjpzdHJpcF9jb21tZW50cygkZGF0YSk7CgkJCQl9CgoJCQkJLy8gU3RyaXAgb3V0IEhUTUwgdGFncyBhbmQgYXR0cmlidXRlcyB0aGF0IG1pZ2h0IGNhdXNlIHZhcmlvdXMgc2VjdXJpdHkgcHJvYmxlbXMuCgkJCQkvLyBCYXNlZCBvbiByZWNvbW1lbmRhdGlvbnMgYnkgTWFyayBQaWxncmltIGF0OgoJCQkJLy8gaHR0cDovL2RpdmVpbnRvbWFyay5vcmcvYXJjaGl2ZXMvMjAwMy8wNi8xMi9ob3dfdG9fY29uc3VtZV9yc3Nfc2FmZWx5CgkJCQlpZiAoJHRoaXMtPnN0cmlwX2h0bWx0YWdzKQoJCQkJewoJCQkJCWZvcmVhY2ggKCR0aGlzLT5zdHJpcF9odG1sdGFncyBhcyAkdGFnKQoJCQkJCXsKCQkJCQkJJHBjcmUgPSAiLzwoJHRhZykiIC4gU0lNUExFUElFX1BDUkVfSFRNTF9BVFRSSUJVVEUgLiAiKD4oLiopPFwvJHRhZyIgLiBTSU1QTEVQSUVfUENSRV9IVE1MX0FUVFJJQlVURSAuICc+fChcLyk/Pikvc2lVJzsKCQkJCQkJd2hpbGUgKHByZWdfbWF0Y2goJHBjcmUsICRkYXRhKSkKCQkJCQkJewoJCQkJCQkJJGRhdGEgPSBwcmVnX3JlcGxhY2VfY2FsbGJhY2soJHBjcmUsIGFycmF5KCYkdGhpcywgJ2RvX3N0cmlwX2h0bWx0YWdzJyksICRkYXRhKTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCgkJCQlpZiAoJHRoaXMtPnN0cmlwX2F0dHJpYnV0ZXMpCgkJCQl7CgkJCQkJZm9yZWFjaCAoJHRoaXMtPnN0cmlwX2F0dHJpYnV0ZXMgYXMgJGF0dHJpYikKCQkJCQl7CgkJCQkJCSRkYXRhID0gcHJlZ19yZXBsYWNlKCcvKDxbQS1aYS16XVteXHgwOVx4MEFceDBCXHgwQ1x4MERceDIwXHgyRlx4M0VdKiknIC4gU0lNUExFUElFX1BDUkVfSFRNTF9BVFRSSUJVVEUgLiB0cmltKCRhdHRyaWIpIC4gJyg/OlxzKj1ccyooPzoiKD86W14iXSopInxcJyg/OlteXCddKilcJ3woPzpbXlx4MDlceDBBXHgwQlx4MENceDBEXHgyMFx4MjJceDI3XHgzRV1bXlx4MDlceDBBXHgwQlx4MENceDBEXHgyMFx4M0VdKik/KSk/JyAuIFNJTVBMRVBJRV9QQ1JFX0hUTUxfQVRUUklCVVRFIC4gJz4vJywgJ1wxXDJcMz4nLCAkZGF0YSk7CgkJCQkJfQoJCQkJfQoKCQkJCS8vIFJlcGxhY2UgcmVsYXRpdmUgVVJMcwoJCQkJJHRoaXMtPmJhc2UgPSAkYmFzZTsKCQkJCWZvcmVhY2ggKCR0aGlzLT5yZXBsYWNlX3VybF9hdHRyaWJ1dGVzIGFzICRlbGVtZW50ID0+ICRhdHRyaWJ1dGVzKQoJCQkJewoJCQkJCSRkYXRhID0gJHRoaXMtPnJlcGxhY2VfdXJscygkZGF0YSwgJGVsZW1lbnQsICRhdHRyaWJ1dGVzKTsKCQkJCX0KCgkJCQkvLyBJZiBpbWFnZSBoYW5kbGluZyAoY2FjaGluZywgZXRjLikgaXMgZW5hYmxlZCwgY2FjaGUgYW5kIHJld3JpdGUgYWxsIHRoZSBpbWFnZSB0YWdzLgoJCQkJaWYgKGlzc2V0KCR0aGlzLT5pbWFnZV9oYW5kbGVyKSAmJiAoKHN0cmluZykgJHRoaXMtPmltYWdlX2hhbmRsZXIpICE9PSAnJyAmJiAkdGhpcy0+ZW5hYmxlX2NhY2hlKQoJCQkJewoJCQkJCSRpbWFnZXMgPSBTaW1wbGVQaWVfTWlzYzo6Z2V0X2VsZW1lbnQoJ2ltZycsICRkYXRhKTsKCQkJCQlmb3JlYWNoICgkaW1hZ2VzIGFzICRpbWcpCgkJCQkJewoJCQkJCQlpZiAoaXNzZXQoJGltZ1snYXR0cmlicyddWydzcmMnXVsnZGF0YSddKSkKCQkJCQkJewoJCQkJCQkJJGltYWdlX3VybCA9IGNhbGxfdXNlcl9mdW5jKCR0aGlzLT5jYWNoZV9uYW1lX2Z1bmN0aW9uLCAkaW1nWydhdHRyaWJzJ11bJ3NyYyddWydkYXRhJ10pOwoJCQkJCQkJJGNhY2hlID0gY2FsbF91c2VyX2Z1bmMoYXJyYXkoJHRoaXMtPmNhY2hlX2NsYXNzLCAnY3JlYXRlJyksICR0aGlzLT5jYWNoZV9sb2NhdGlvbiwgJGltYWdlX3VybCwgJ3NwaScpOwoKCQkJCQkJCWlmICgkY2FjaGUtPmxvYWQoKSkKCQkJCQkJCXsKCQkJCQkJCQkkaW1nWydhdHRyaWJzJ11bJ3NyYyddWydkYXRhJ10gPSAkdGhpcy0+aW1hZ2VfaGFuZGxlciAuICRpbWFnZV91cmw7CgkJCQkJCQkJJGRhdGEgPSBzdHJfcmVwbGFjZSgkaW1nWydmdWxsJ10sIFNpbXBsZVBpZV9NaXNjOjplbGVtZW50X2ltcGxvZGUoJGltZyksICRkYXRhKTsKCQkJCQkJCX0KCQkJCQkJCWVsc2UKCQkJCQkJCXsKCQkJCQkJCQkkZmlsZSA9JiBuZXcgJHRoaXMtPmZpbGVfY2xhc3MoJGltZ1snYXR0cmlicyddWydzcmMnXVsnZGF0YSddLCAkdGhpcy0+dGltZW91dCwgNSwgYXJyYXkoJ1gtRk9SV0FSREVELUZPUicgPT4gJF9TRVJWRVJbJ1JFTU9URV9BRERSJ10pLCAkdGhpcy0+dXNlcmFnZW50LCAkdGhpcy0+Zm9yY2VfZnNvY2tvcGVuKTsKCQkJCQkJCQkkaGVhZGVycyA9ICRmaWxlLT5oZWFkZXJzOwoKCQkJCQkJCQlpZiAoJGZpbGUtPnN1Y2Nlc3MgJiYgKCRmaWxlLT5zdGF0dXNfY29kZSA9PSAyMDAgfHwgKCRmaWxlLT5zdGF0dXNfY29kZSA+IDIwNiAmJiAkZmlsZS0+c3RhdHVzX2NvZGUgPCAzMDApKSkKCQkJCQkJCQl7CgkJCQkJCQkJCWlmICgkY2FjaGUtPnNhdmUoYXJyYXkoJ2hlYWRlcnMnID0+ICRmaWxlLT5oZWFkZXJzLCAnYm9keScgPT4gJGZpbGUtPmJvZHkpKSkKCQkJCQkJCQkJewoJCQkJCQkJCQkJJGltZ1snYXR0cmlicyddWydzcmMnXVsnZGF0YSddID0gJHRoaXMtPmltYWdlX2hhbmRsZXIgLiAkaW1hZ2VfdXJsOwoJCQkJCQkJCQkJJGRhdGEgPSBzdHJfcmVwbGFjZSgkaW1nWydmdWxsJ10sIFNpbXBsZVBpZV9NaXNjOjplbGVtZW50X2ltcGxvZGUoJGltZyksICRkYXRhKTsKCQkJCQkJCQkJfQoJCQkJCQkJCQllbHNlCgkJCQkJCQkJCXsKCQkJCQkJCQkJCXRyaWdnZXJfZXJyb3IoIiRjYWNoZS0+bmFtZSBpcyBub3Qgd3JpdGVhYmxlIiwgRV9VU0VSX1dBUk5JTkcpOwoJCQkJCQkJCQl9CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoJCQkJfQoKCQkJCS8vIEhhdmluZyAocG9zc2libHkpIHRha2VuIHN0dWZmIG91dCwgdGhlcmUgbWF5IG5vdyBiZSB3aGl0ZXNwYWNlIGF0IHRoZSBiZWdpbm5pbmcvZW5kIG9mIHRoZSBkYXRhCgkJCQkkZGF0YSA9IHRyaW0oJGRhdGEpOwoJCQl9CgoJCQlpZiAoJHR5cGUgJiBTSU1QTEVQSUVfQ09OU1RSVUNUX0lSSSkKCQkJewoJCQkJJGRhdGEgPSBTaW1wbGVQaWVfTWlzYzo6YWJzb2x1dGl6ZV91cmwoJGRhdGEsICRiYXNlKTsKCQkJfQoKCQkJaWYgKCR0eXBlICYgKFNJTVBMRVBJRV9DT05TVFJVQ1RfVEVYVCB8IFNJTVBMRVBJRV9DT05TVFJVQ1RfSVJJKSkKCQkJewoJCQkJJGRhdGEgPSBodG1sc3BlY2lhbGNoYXJzKCRkYXRhLCBFTlRfQ09NUEFULCAnVVRGLTgnKTsKCQkJfQoKCQkJaWYgKCR0aGlzLT5vdXRwdXRfZW5jb2RpbmcgIT0gJ1VURi04JykKCQkJewoJCQkJJGRhdGEgPSBTaW1wbGVQaWVfTWlzYzo6Y2hhbmdlX2VuY29kaW5nKCRkYXRhLCAnVVRGLTgnLCAkdGhpcy0+b3V0cHV0X2VuY29kaW5nKTsKCQkJfQoJCX0KCQlyZXR1cm4gJGRhdGE7Cgl9CgoJZnVuY3Rpb24gcmVwbGFjZV91cmxzKCRkYXRhLCAkdGFnLCAkYXR0cmlidXRlcykKCXsKCQlpZiAoIWlzX2FycmF5KCR0aGlzLT5zdHJpcF9odG1sdGFncykgfHwgIWluX2FycmF5KCR0YWcsICR0aGlzLT5zdHJpcF9odG1sdGFncykpCgkJewoJCQkkZWxlbWVudHMgPSBTaW1wbGVQaWVfTWlzYzo6Z2V0X2VsZW1lbnQoJHRhZywgJGRhdGEpOwoJCQlmb3JlYWNoICgkZWxlbWVudHMgYXMgJGVsZW1lbnQpCgkJCXsKCQkJCWlmIChpc19hcnJheSgkYXR0cmlidXRlcykpCgkJCQl7CgkJCQkJZm9yZWFjaCAoJGF0dHJpYnV0ZXMgYXMgJGF0dHJpYnV0ZSkKCQkJCQl7CgkJCQkJCWlmIChpc3NldCgkZWxlbWVudFsnYXR0cmlicyddWyRhdHRyaWJ1dGVdWydkYXRhJ10pKQoJCQkJCQl7CgkJCQkJCQkkZWxlbWVudFsnYXR0cmlicyddWyRhdHRyaWJ1dGVdWydkYXRhJ10gPSBTaW1wbGVQaWVfTWlzYzo6YWJzb2x1dGl6ZV91cmwoJGVsZW1lbnRbJ2F0dHJpYnMnXVskYXR0cmlidXRlXVsnZGF0YSddLCAkdGhpcy0+YmFzZSk7CgkJCQkJCQkkbmV3X2VsZW1lbnQgPSBTaW1wbGVQaWVfTWlzYzo6ZWxlbWVudF9pbXBsb2RlKCRlbGVtZW50KTsKCQkJCQkJCSRkYXRhID0gc3RyX3JlcGxhY2UoJGVsZW1lbnRbJ2Z1bGwnXSwgJG5ld19lbGVtZW50LCAkZGF0YSk7CgkJCQkJCQkkZWxlbWVudFsnZnVsbCddID0gJG5ld19lbGVtZW50OwoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQkJZWxzZWlmIChpc3NldCgkZWxlbWVudFsnYXR0cmlicyddWyRhdHRyaWJ1dGVzXVsnZGF0YSddKSkKCQkJCXsKCQkJCQkkZWxlbWVudFsnYXR0cmlicyddWyRhdHRyaWJ1dGVzXVsnZGF0YSddID0gU2ltcGxlUGllX01pc2M6OmFic29sdXRpemVfdXJsKCRlbGVtZW50WydhdHRyaWJzJ11bJGF0dHJpYnV0ZXNdWydkYXRhJ10sICR0aGlzLT5iYXNlKTsKCQkJCQkkZGF0YSA9IHN0cl9yZXBsYWNlKCRlbGVtZW50WydmdWxsJ10sIFNpbXBsZVBpZV9NaXNjOjplbGVtZW50X2ltcGxvZGUoJGVsZW1lbnQpLCAkZGF0YSk7CgkJCQl9CgkJCX0KCQl9CgkJcmV0dXJuICRkYXRhOwoJfQoKCWZ1bmN0aW9uIGRvX3N0cmlwX2h0bWx0YWdzKCRtYXRjaCkKCXsKCQlpZiAoJHRoaXMtPmVuY29kZV9pbnN0ZWFkX29mX3N0cmlwKQoJCXsKCQkJaWYgKGlzc2V0KCRtYXRjaFs0XSkgJiYgIWluX2FycmF5KHN0cnRvbG93ZXIoJG1hdGNoWzFdKSwgYXJyYXkoJ3NjcmlwdCcsICdzdHlsZScpKSkKCQkJewoJCQkJJG1hdGNoWzFdID0gaHRtbHNwZWNpYWxjaGFycygkbWF0Y2hbMV0sIEVOVF9DT01QQVQsICdVVEYtOCcpOwoJCQkJJG1hdGNoWzJdID0gaHRtbHNwZWNpYWxjaGFycygkbWF0Y2hbMl0sIEVOVF9DT01QQVQsICdVVEYtOCcpOwoJCQkJcmV0dXJuICImbHQ7JG1hdGNoWzFdJG1hdGNoWzJdJmd0OyRtYXRjaFszXSZsdDsvJG1hdGNoWzFdJmd0OyI7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlyZXR1cm4gaHRtbHNwZWNpYWxjaGFycygkbWF0Y2hbMF0sIEVOVF9DT01QQVQsICdVVEYtOCcpOwoJCQl9CgkJfQoJCWVsc2VpZiAoaXNzZXQoJG1hdGNoWzRdKSAmJiAhaW5fYXJyYXkoc3RydG9sb3dlcigkbWF0Y2hbMV0pLCBhcnJheSgnc2NyaXB0JywgJ3N0eWxlJykpKQoJCXsKCQkJcmV0dXJuICRtYXRjaFs0XTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuICcnOwoJCX0KCX0KfQoKPz4=]]></data>
	</file>
	<file>
	  <filename>/lib/class.twitter.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCg0KcmVxdWlyZV9vbmNlIGRpcm5hbWUoX19GSUxFX18pIC4gJy9PQXV0aC5waHAnOw0KDQoNCi8qKg0KICogVHdpdHRlciBmb3IgUEhQIC0gbGlicmFyeSBmb3Igc2VuZGluZyBtZXNzYWdlcyB0byBUd2l0dGVyIGFuZCByZWNlaXZpbmcgc3RhdHVzIHVwZGF0ZXMuDQogKg0KICogQGF1dGhvciAgICAgRGF2aWQgR3J1ZGwNCiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwOCBEYXZpZCBHcnVkbA0KICogQGxpY2Vuc2UgICAgTmV3IEJTRCBMaWNlbnNlDQogKiBAbGluayAgICAgICBodHRwOi8vcGhwZmFzaGlvbi5jb20vDQogKiBAc2VlICAgICAgICBodHRwOi8vZGV2LnR3aXR0ZXIuY29tL2RvYw0KICogQHZlcnNpb24gICAgMi4wDQogKi8NCmNsYXNzIFR3aXR0ZXINCnsNCgkvKiojQCsgVGltZWxpbmUge0BsaW5rIFR3aXR0ZXI6OmxvYWQoKX0gKi8NCgljb25zdCBNRSA9IDE7DQoJY29uc3QgTUVfQU5EX0ZSSUVORFMgPSAyOw0KCWNvbnN0IFJFUExJRVMgPSAzOw0KCWNvbnN0IEFMTCA9IDQ7DQoJY29uc3QgUkVUV0VFVFMgPSAxMjg7IC8vIGluY2x1ZGUgcmV0d2VldHM/DQoJLyoqI0AtKi8NCg0KCS8qKiNAKyBPdXRwdXQgZm9ybWF0IHtAbGluayBUd2l0dGVyOjpsb2FkKCl9ICovDQoJY29uc3QgWE1MID0gMDsNCgljb25zdCBKU09OID0gMTY7DQoJY29uc3QgUlNTID0gMzI7DQoJY29uc3QgQVRPTSA9IDQ4Ow0KCS8qKiNALSovDQoNCgkvKiogQHZhciBpbnQgKi8NCglwdWJsaWMgc3RhdGljICRjYWNoZUV4cGlyZSA9IDE4MDA7IC8vIDMwIG1pbg0KDQoJLyoqIEB2YXIgc3RyaW5nICovDQoJcHVibGljIHN0YXRpYyAkY2FjaGVEaXI7DQoNCgkvKiogQHZhciBPQXV0aFNpZ25hdHVyZU1ldGhvZCAqLw0KCXByaXZhdGUgJHNpZ25hdHVyZU1ldGhvZDsNCg0KCS8qKiBAdmFyIE9BdXRoQ29uc3VtZXIgKi8NCglwcml2YXRlICRjb25zdW1lcjsNCg0KCS8qKiBAdmFyIE9BdXRoQ29uc3VtZXIgKi8NCglwcml2YXRlICR0b2tlbjsNCg0KDQoNCgkvKioNCgkgKiBDcmVhdGVzIG9iamVjdCB1c2luZyBjb25zdW1lciBhbmQgYWNjZXNzIGtleXMuDQoJICogQHBhcmFtICBzdHJpbmcgIGNvbnN1bWVyIGtleQ0KCSAqIEBwYXJhbSAgc3RyaW5nICBhcHAgc2VjcmV0DQoJICogQHBhcmFtICBzdHJpbmcgIG9wdGlvbmFsIGFjY2VzcyB0b2tlbg0KCSAqIEBwYXJhbSAgc3RyaW5nICBvcHRpbmFsIGFjY2VzcyB0b2tlbiBzZWNyZXQNCgkgKiBAdGhyb3dzIFR3aXR0ZXJFeGNlcHRpb24gd2hlbiBDVVJMIGV4dGVuc2lvbiBpcyBub3QgbG9hZGVkDQoJICogQHRocm93cyBUd2l0dGVyQXV0aEV4Y2VwdGlvbiB0byBzaWduYWxpemUgaW5kaXZpZHVhbCBhdXRob3JpemF0aW9uIHN0ZXBzDQoJICovDQoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRjb25zdW1lcktleSA9IE5VTEwsICRjb25zdW1lclNlY3JldCA9IE5VTEwsICRhY2Nlc3NUb2tlbiA9IE5VTEwsICRhY2Nlc3NUb2tlblNlY3JldCA9IE5VTEwpDQoJew0KCQlpZiAoIWV4dGVuc2lvbl9sb2FkZWQoJ2N1cmwnKSkgew0KCQkJdGhyb3cgbmV3IFR3aXR0ZXJFeGNlcHRpb24oJ1BIUCBleHRlbnNpb24gQ1VSTCBpcyBub3QgbG9hZGVkLicpOw0KCQl9DQoNCgkJJHRoaXMtPnNpZ25hdHVyZU1ldGhvZCA9IG5ldyBPQXV0aFNpZ25hdHVyZU1ldGhvZF9ITUFDX1NIQTEoKTsNCgkJJHRoaXMtPmNvbnN1bWVyID0gbmV3IE9BdXRoQ29uc3VtZXIoJGNvbnN1bWVyS2V5LCAkY29uc3VtZXJTZWNyZXQpOw0KCQkkdGhpcy0+dG9rZW4gPSBuZXcgT0F1dGhDb25zdW1lcigkYWNjZXNzVG9rZW4sICRhY2Nlc3NUb2tlblNlY3JldCk7DQoJfQ0KDQoNCg0KCS8qKg0KCSAqIFRlc3RzIGlmIHVzZXIgY3JlZGVudGlhbHMgYXJlIHZhbGlkLg0KCSAqIEByZXR1cm4gYm9vbGVhbg0KCSAqIEB0aHJvd3MgVHdpdHRlckV4Y2VwdGlvbg0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBhdXRoZW50aWNhdGUoKQ0KCXsNCgkJdHJ5IHsNCgkJCSR4bWwgPSAkdGhpcy0+cmVxdWVzdCgnYWNjb3VudC92ZXJpZnlfY3JlZGVudGlhbHMnLCBOVUxMLCAnR0VUJyk7DQoJCQlyZXR1cm4gIWVtcHR5KCR4bWwtPmlkKTsNCg0KCQl9IGNhdGNoIChUd2l0dGVyRXhjZXB0aW9uICRlKSB7DQoJCQlpZiAoJGUtPmdldENvZGUoKSA9PT0gNDAxKSB7DQoJCQkJcmV0dXJuIEZBTFNFOw0KCQkJfQ0KCQkJdGhyb3cgJGU7DQoJCX0NCgl9DQoNCg0KDQoJLyoqDQoJICogU2VuZHMgbWVzc2FnZSB0byB0aGUgVHdpdHRlci4NCgkgKiBAcGFyYW0gc3RyaW5nICAgbWVzc2FnZSBlbmNvZGVkIGluIFVURi04DQoJICogQHJldHVybiBtaXhlZCAgIElEIG9uIHN1Y2Nlc3Mgb3IgRkFMU0Ugb24gZmFpbHVyZQ0KCSAqIEB0aHJvd3MgVHdpdHRlckV4Y2VwdGlvbg0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBzZW5kKCRtZXNzYWdlKQ0KCXsNCgkJaWYgKGljb252X3N0cmxlbigkbWVzc2FnZSwgJ1VURi04JykgPiAxNDApIHsNCgkJCSRtZXNzYWdlID0gcHJlZ19yZXBsYWNlX2NhbGxiYWNrKCcjaHR0cHM/Oi8vXFMrW146KTssLiE/XHNdIycsIGFycmF5KCR0aGlzLCAnc2hvcnRlblVybCcpLCAkbWVzc2FnZSk7DQoJCX0NCg0KCQkkeG1sID0gJHRoaXMtPnJlcXVlc3QoJ3N0YXR1c2VzL3VwZGF0ZScsIGFycmF5KCdzdGF0dXMnID0+ICRtZXNzYWdlKSk7DQoJCXJldHVybiAkeG1sLT5pZCA/IChzdHJpbmcpICR4bWwtPmlkIDogRkFMU0U7DQoJfQ0KDQoNCg0KCS8qKg0KCSAqIFJldHVybnMgdGhlIG1vc3QgcmVjZW50IHN0YXR1c2VzLg0KCSAqIEBwYXJhbSAgaW50ICAgIHRpbWVsaW5lIChNRSB8IE1FX0FORF9GUklFTkRTIHwgUkVQTElFUyB8IEFMTCkgYW5kIG9wdGlvbmFsIChSRVRXRUVUUykgb3IgZm9ybWF0IChYTUwgfCBKU09OIHwgUlNTIHwgQVRPTSkNCgkgKiBAcGFyYW0gIGludCAgICBudW1iZXIgb2Ygc3RhdHVzZXMgdG8gcmV0cmlldmUNCgkgKiBAcGFyYW0gIGludCAgICBwYWdlIG9mIHJlc3VsdHMgdG8gcmV0cmlldmUNCgkgKiBAcmV0dXJuIG1peGVkDQoJICogQHRocm93cyBUd2l0dGVyRXhjZXB0aW9uDQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGxvYWQoJGZsYWdzID0gc2VsZjo6TUUsICRjb3VudCA9IDIwLCAkcGFnZSA9IDEpDQoJew0KCQlzdGF0aWMgJHRpbWVsaW5lcyA9IGFycmF5KHNlbGY6Ok1FID0+ICd1c2VyX3RpbWVsaW5lJywgc2VsZjo6TUVfQU5EX0ZSSUVORFMgPT4gJ2ZyaWVuZHNfdGltZWxpbmUnLCBzZWxmOjpSRVBMSUVTID0+ICdtZW50aW9ucycsIHNlbGY6OkFMTCA9PiAncHVibGljX3RpbWVsaW5lJyk7DQoNCgkJaWYgKCFpc19pbnQoJGZsYWdzKSkgeyAvLyBiYWNrIGNvbXBhdGliaWxpdHkNCgkJCSRmbGFncyA9ICRmbGFncyA/IHNlbGY6Ok1FX0FORF9GUklFTkRTIDogc2VsZjo6TUU7DQoNCgkJfSBlbHNlaWYgKCFpc3NldCgkdGltZWxpbmVzWyRmbGFncyAmIDB4MEZdKSkgew0KCQkJdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsNCgkJfQ0KDQoJCXJldHVybiAkdGhpcy0+Y2FjaGVkUmVxdWVzdCgnc3RhdHVzZXMvJyAuICR0aW1lbGluZXNbJGZsYWdzICYgMHgwRl0gLiAnLicgLiBzZWxmOjpnZXRGb3JtYXQoJGZsYWdzKSwgYXJyYXkoDQoJCQknY291bnQnID0+ICRjb3VudCwNCgkJCSdwYWdlJyA9PiAkcGFnZSwNCgkJCSdpbmNsdWRlX3J0cycgPT4gJGZsYWdzICYgc2VsZjo6UkVUV0VFVFMgPyAxIDogMCwNCgkJKSk7DQoJfQ0KDQoNCg0KCS8qKg0KCSAqIFJldHVybnMgaW5mb3JtYXRpb24gb2YgYSBnaXZlbiB1c2VyLg0KCSAqIEBwYXJhbSAgc3RyaW5nIG5hbWUNCgkgKiBAcGFyYW0gIGludCAgICBmb3JtYXQgKFhNTCB8IEpTT04pDQoJICogQHJldHVybiBtaXhlZA0KCSAqIEB0aHJvd3MgVHdpdHRlckV4Y2VwdGlvbg0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBsb2FkVXNlckluZm8oJHVzZXIsICRmbGFncyA9IHNlbGY6OlhNTCkNCgl7DQoJCXJldHVybiAkdGhpcy0+Y2FjaGVkUmVxdWVzdCgndXNlcnMvc2hvdy4nIC4gc2VsZjo6Z2V0Rm9ybWF0KCRmbGFncyksIGFycmF5KCdzY3JlZW5fbmFtZScgPT4gJHVzZXIpKTsNCgl9DQoNCg0KDQoJLyoqDQoJICogRGVzdHJveXMgc3RhdHVzLg0KCSAqIEBwYXJhbSAgaW50ICAgIGlkIG9mIHN0YXR1cyB0byBiZSBkZXN0cm95ZWQNCgkgKiBAcmV0dXJuIG1peGVkDQoJICogQHRocm93cyBUd2l0dGVyRXhjZXB0aW9uDQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGRlc3Ryb3koJGlkKQ0KCXsNCgkJJHhtbCA9ICR0aGlzLT5yZXF1ZXN0KCJzdGF0dXNlcy9kZXN0cm95LyRpZCIpOw0KCQlyZXR1cm4gJHhtbC0+aWQgPyAoc3RyaW5nKSAkeG1sLT5pZCA6IEZBTFNFOw0KCX0NCg0KDQoNCgkvKioNCgkgKiBSZXR1cm5zIHR3ZWV0cyB0aGF0IG1hdGNoIGEgc3BlY2lmaWVkIHF1ZXJ5Lg0KCSAqIEBwYXJhbSAgc3RyaW5nICAgcXVlcnkNCgkgKiBAcGFyYW0gIGludCAgICAgIGZvcm1hdCAoSlNPTiB8IEFUT00pDQoJICogQHJldHVybiBtaXhlZA0KCSAqIEB0aHJvd3MgVHdpdHRlckV4Y2VwdGlvbg0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBzZWFyY2goJHF1ZXJ5LCAkZmxhZ3MgPSBzZWxmOjpKU09OKQ0KCXsNCgkJcmV0dXJuICR0aGlzLT5yZXF1ZXN0KCdodHRwOi8vc2VhcmNoLnR3aXR0ZXIuY29tL3NlYXJjaC4nIC4gc2VsZjo6Z2V0Rm9ybWF0KCRmbGFncyksIGFycmF5KCdxJyA9PiAkcXVlcnkpKS0+cmVzdWx0czsNCgl9DQoNCg0KDQoJLyoqDQoJICogUHJvY2VzcyBIVFRQIHJlcXVlc3QuDQoJICogQHBhcmFtICBzdHJpbmcgIFVSTCBvciB0d2l0dGVyIGNvbW1hbmQNCgkgKiBAcGFyYW0gIHN0cmluZyAgSFRUUCBtZXRob2QNCgkgKiBAcGFyYW0gIGFycmF5ICAgZGF0YQ0KCSAqIEByZXR1cm4gbWl4ZWQNCgkgKiBAdGhyb3dzIFR3aXR0ZXJFeGNlcHRpb24NCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gcmVxdWVzdCgkcmVxdWVzdCwgJGRhdGEgPSBOVUxMLCAkbWV0aG9kID0gJ1BPU1QnKQ0KCXsNCgkJaWYgKCFzdHJwb3MoJHJlcXVlc3QsICc6Ly8nKSkgew0KCQkJaWYgKCFzdHJwb3MoJHJlcXVlc3QsICcuJykpIHsNCgkJCQkkcmVxdWVzdCAuPSAnLmpzb24nOw0KCQkJfQ0KCQkJJHJlcXVlc3QgPSAnaHR0cDovL2FwaS50d2l0dGVyLmNvbS8xLycgLiAkcmVxdWVzdDsNCgkJfQ0KDQoJCSRyZXF1ZXN0ID0gT0F1dGhSZXF1ZXN0Ojpmcm9tX2NvbnN1bWVyX2FuZF90b2tlbigkdGhpcy0+Y29uc3VtZXIsICR0aGlzLT50b2tlbiwgJG1ldGhvZCwgJHJlcXVlc3QsICRkYXRhKTsNCgkJJHJlcXVlc3QtPnNpZ25fcmVxdWVzdCgkdGhpcy0+c2lnbmF0dXJlTWV0aG9kLCAkdGhpcy0+Y29uc3VtZXIsICR0aGlzLT50b2tlbik7DQoNCgkJJGN1cmwgPSBjdXJsX2luaXQoKTsNCgkJY3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfSEVBREVSLCBGQUxTRSk7DQoJCWN1cmxfc2V0b3B0KCRjdXJsLCBDVVJMT1BUX1RJTUVPVVQsIDIwKTsNCgkJY3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfU1NMX1ZFUklGWVBFRVIsIDApOw0KCQljdXJsX3NldG9wdCgkY3VybCwgQ1VSTE9QVF9IVFRQSEVBREVSLCBhcnJheSgnRXhwZWN0OicpKTsNCgkJY3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfUkVUVVJOVFJBTlNGRVIsIFRSVUUpOyAvLyBubyBlY2hvLCBqdXN0IHJldHVybiByZXN1bHQNCgkJY3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfVVNFUkFHRU5ULCAnVHdpdHRlciBmb3IgUEhQJyk7DQoJCWlmICgkbWV0aG9kID09PSAnUE9TVCcpIHsNCgkJCWN1cmxfc2V0b3B0KCRjdXJsLCBDVVJMT1BUX1BPU1QsIFRSVUUpOw0KCQkJY3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfUE9TVEZJRUxEUywgJHJlcXVlc3QtPnRvX3Bvc3RkYXRhKCkpOw0KCQkJY3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfVVJMLCAkcmVxdWVzdC0+Z2V0X25vcm1hbGl6ZWRfaHR0cF91cmwoKSk7DQoJCX0gZWxzZSB7DQoJCQljdXJsX3NldG9wdCgkY3VybCwgQ1VSTE9QVF9VUkwsICRyZXF1ZXN0LT50b191cmwoKSk7DQoJCX0NCg0KCQkkcmVzdWx0ID0gY3VybF9leGVjKCRjdXJsKTsNCgkJaWYgKGN1cmxfZXJybm8oJGN1cmwpKSB7DQoJCQl0aHJvdyBuZXcgVHdpdHRlckV4Y2VwdGlvbignU2VydmVyIGVycm9yOiAnIC4gY3VybF9lcnJvcigkY3VybCkpOw0KCQl9DQoNCgkJJHR5cGUgPSBjdXJsX2dldGluZm8oJGN1cmwsIENVUkxJTkZPX0NPTlRFTlRfVFlQRSk7DQoJCWlmIChzdHJwb3MoJHR5cGUsICd4bWwnKSkgew0KCQkJJHBheWxvYWQgPSBAc2ltcGxleG1sX2xvYWRfc3RyaW5nKCRyZXN1bHQpOyAvLyBpbnRlbnRpb25hbGx5IEANCg0KCQl9IGVsc2VpZiAoc3RycG9zKCR0eXBlLCAnanNvbicpKSB7DQoJCQkkcGF5bG9hZCA9IEBqc29uX2RlY29kZSgkcmVzdWx0KTsgLy8gaW50ZW50aW9uYWxseSBADQoJCX0NCg0KCQlpZiAoZW1wdHkoJHBheWxvYWQpKSB7DQoJCQl0aHJvdyBuZXcgVHdpdHRlckV4Y2VwdGlvbignSW52YWxpZCBzZXJ2ZXIgcmVzcG9uc2UnKTsNCgkJfQ0KDQoJCSRjb2RlID0gY3VybF9nZXRpbmZvKCRjdXJsLCBDVVJMSU5GT19IVFRQX0NPREUpOw0KCQlpZiAoJGNvZGUgPj0gNDAwKSB7DQoJCQl0aHJvdyBuZXcgVHdpdHRlckV4Y2VwdGlvbihpc3NldCgkcGF5bG9hZC0+ZXJyb3IpID8gJHBheWxvYWQtPmVycm9yIDogIlNlcnZlciBlcnJvciAjJGNvZGUiLCAkY29kZSk7DQoJCX0NCg0KCQlyZXR1cm4gJHBheWxvYWQ7DQoJfQ0KDQoNCg0KCS8qKg0KCSAqIENhY2hlZCBIVFRQIHJlcXVlc3QuDQoJICogQHBhcmFtICBzdHJpbmcgIFVSTCBvciB0d2l0dGVyIGNvbW1hbmQNCgkgKiBAcmV0dXJuIG1peGVkDQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGNhY2hlZFJlcXVlc3QoJHJlcXVlc3QsICRkYXRhKQ0KCXsNCgkJaWYgKCFzZWxmOjokY2FjaGVEaXIpIHsNCgkJCXJldHVybiAkdGhpcy0+cmVxdWVzdCgkcmVxdWVzdCwgJGRhdGEsICdHRVQnKTsNCgkJfQ0KDQoJCSRjYWNoZUZpbGUgPSBzZWxmOjokY2FjaGVEaXIgLiAnL3R3aXR0ZXIuJyAuIG1kNSgkcmVxdWVzdCk7DQoJCSRjYWNoZSA9IEBmaWxlX2dldF9jb250ZW50cygkY2FjaGVGaWxlKTsgLy8gaW50ZW50aW9uYWxseSBADQoJCSRjYWNoZSA9IHN0cm5jbXAoJGNhY2hlLCAnPCcsIDEpID8gQGpzb25fZGVjb2RlKCRjYWNoZSkgOiBAc2ltcGxleG1sX2xvYWRfc3RyaW5nKCRjYWNoZSk7IC8vIGludGVudGlvbmFsbHkgQA0KCQlpZiAoJGNhY2hlICYmIEBmaWxlbXRpbWUoJGNhY2hlRmlsZSkgKyBzZWxmOjokY2FjaGVFeHBpcmUgPiB0aW1lKCkpIHsgLy8gaW50ZW50aW9uYWxseSBADQoJCQlyZXR1cm4gJGNhY2hlOw0KCQl9DQoNCgkJdHJ5IHsNCgkJCSRwYXlsb2FkID0gJHRoaXMtPnJlcXVlc3QoJHJlcXVlc3QsICRkYXRhLCAnR0VUJyk7DQoJCQlmaWxlX3B1dF9jb250ZW50cygkY2FjaGVGaWxlLCAkcGF5bG9hZCBpbnN0YW5jZW9mIFNpbXBsZVhNTEVsZW1lbnQgPyAkcGF5bG9hZC0+YXNYbWwoKSA6IGpzb25fZW5jb2RlKCRwYXlsb2FkKSk7DQoJCQlyZXR1cm4gJHBheWxvYWQ7DQoNCgkJfSBjYXRjaCAoVHdpdHRlckV4Y2VwdGlvbiAkZSkgew0KCQkJaWYgKCRjYWNoZSkgew0KCQkJCXJldHVybiAkY2FjaGU7DQoJCQl9DQoJCQl0aHJvdyAkZTsNCgkJfQ0KCX0NCg0KDQoNCgkvKioNCgkgKiBTaG9ydGVucyBVUkwgdXNpbmcgaHR0cDovL2lzLmdkIEFQSS4NCgkgKiBAcGFyYW0gIGFycmF5DQoJICogQHJldHVybiBzdHJpbmcNCgkgKi8NCglwcml2YXRlIGZ1bmN0aW9uIHNob3J0ZW5VcmwoJG0pDQoJew0KCQkkY3VybCA9IGN1cmxfaW5pdCgpOw0KCQljdXJsX3NldG9wdCgkY3VybCwgQ1VSTE9QVF9VUkwsICdodHRwOi8vaXMuZ2QvYXBpLnBocD9sb25ndXJsPScgLiB1cmxlbmNvZGUoJG1bMF0pKTsNCgkJY3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfSEVBREVSLCBGQUxTRSk7DQoJCWN1cmxfc2V0b3B0KCRjdXJsLCBDVVJMT1BUX1RJTUVPVVQsIDIwKTsNCgkJY3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfUkVUVVJOVFJBTlNGRVIsIFRSVUUpOw0KCQkkcmVzdWx0ID0gY3VybF9leGVjKCRjdXJsKTsNCgkJJGNvZGUgPSBjdXJsX2dldGluZm8oJGN1cmwsIENVUkxJTkZPX0hUVFBfQ09ERSk7DQoJCXJldHVybiBjdXJsX2Vycm5vKCRjdXJsKSB8fCAkY29kZSA+PSA0MDAgPyAkbVswXSA6ICRyZXN1bHQ7DQoJfQ0KDQoNCg0KCXByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGdldEZvcm1hdCgkZmxhZykNCgl7DQoJCXN0YXRpYyAkZm9ybWF0cyA9IGFycmF5KHNlbGY6OlhNTCA9PiAneG1sJywgc2VsZjo6SlNPTiA9PiAnanNvbicsIHNlbGY6OlJTUyA9PiAncnNzJywgc2VsZjo6QVRPTSA9PiAnYXRvbScpOw0KCQkkZmxhZyA9ICRmbGFnICYgMHgzMDsNCgkJaWYgKGlzc2V0KCRmb3JtYXRzWyRmbGFnXSkpIHsNCgkJCXJldHVybiAkZm9ybWF0c1skZmxhZ107DQoJCX0gZWxzZSB7DQoJCQl0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdJbnZhbGlkIGZvcm1hdCcpOw0KCQl9DQoJfQ0KDQp9DQoNCg0KDQovKioNCiAqIEFuIGV4Y2VwdGlvbiBnZW5lcmF0ZWQgYnkgVHdpdHRlci4NCiAqLw0KY2xhc3MgVHdpdHRlckV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbg0Kew0KfQ==]]></data>
	</file>
	<file>
	  <filename>/lib/lastfmapi/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/lastfmapi/.htaccess</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PEZpbGVzIHBocGxhc3RmbWFwaT4NCglvcmRlciBhbGxvdyxkZW55DQoJZGVueSBmcm9tIGFsbA0KPC9GaWxlcz4=]]></data>
	</file>
	<file>
	  <filename>/lib/lastfmapi/api/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/lastfmapi/api/album.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogRmlsZSB0aGF0IHN0b3JlcyBhcGkgY2FsbHMgZm9yIGFsYnVtIGFwaSBjYWxscw0KICogQHBhY2thZ2UgYXBpY2FsbHMNCiAqLw0KLyoqDQogKiBBbGxvd3MgYWNjZXNzIHRvIHRoZSBhcGkgcmVxdWVzdHMgcmVsYXRpbmcgdG8gYWxidW1zDQogKiBAcGFja2FnZSBhcGljYWxscw0KICovDQpjbGFzcyBsYXN0Zm1BcGlBbGJ1bSBleHRlbmRzIGxhc3RmbUFwaSB7DQoJLyoqDQoJICogU3RvcmVzIHRoZSBjb25maWcgdmFsdWVzIHNldCBpbiB0aGUgY2FsbA0KCSAqIEBhY2Nlc3MgcHVibGljDQoJICogQHZhciBhcnJheQ0KCSAqLw0KCXB1YmxpYyAkY29uZmlnOw0KCS8qKg0KCSAqIFN0b3JlcyB0aGUgYXV0aCB2YXJpYWJsZXMgdXNlZCBpbiBhbGwgYXBpIGNhbGxzDQoJICogQGFjY2VzcyBwcml2YXRlDQoJICogQHZhciBhcnJheQ0KCSAqLw0KCXByaXZhdGUgJGF1dGg7DQoJLyoqDQoJICogU3RhdGVzIGlmIHRoZSB1c2VyIGhhcyBmdWxsIGF1dGhlbnRpY2F0aW9uIHRvIHVzZSBhcGkgcmVxdWVzdHMgdGhhdCBtb2RpZnkgZGF0YQ0KCSAqIEBhY2Nlc3MgcHJpdmF0ZQ0KCSAqIEB2YXIgYm9vbGVhbg0KCSAqLw0KCXByaXZhdGUgJGZ1bGxBdXRoOw0KCQ0KCS8qKg0KCSAqIEBwYXJhbSBhcnJheSAkYXV0aCBQYXNzZXMgdGhlIGF1dGhlbnRpY2F0aW9uIHZhcmlhYmxlcw0KCSAqIEBwYXJhbSBhcnJheSAkZnVsbEF1dGggQSBib29sZWFuIHZhbHVlIHN0YXRpbmcgaWYgdGhlIHVzZXIgaGFzIGZ1bGwgYXV0aGVudGljYXRpb24gb3Igbm90DQoJICogQHBhcmFtIGFycmF5ICRjb25maWcgQW4gYXJyYXkgb2YgY29uZmlnIHZhcmlhYmxlcyByZWxhdGVkIHRvIGNhY2hpbmcgYW5kIG90aGVyIGZlYXR1cmVzDQoJICovDQoJZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGF1dGgsICRmdWxsQXV0aCwgJGNvbmZpZykgew0KCQkkdGhpcy0+YXV0aCA9ICRhdXRoOw0KCQkkdGhpcy0+ZnVsbEF1dGggPSAkZnVsbEF1dGg7DQoJCSR0aGlzLT5jb25maWcgPSAkY29uZmlnOw0KCX0NCgkNCgkvKioNCgkgKiBUYWcgYW4gYWxidW0gdXNpbmcgYSBsaXN0IG9mIHVzZXIgc3VwcGxpZWQgdGFncy4gKFJlcXVpcmVzIGZ1bGwgYXV0aCkNCgkgKiBAcGFyYW0gYXJyYXkgJG1ldGhvZFZhcnMgQW4gYXJyYXkgd2l0aCB0aGUgZm9sbG93aW5nIHJlcXVpcmVkIHZhbHVlczogPGk+YWxidW08L2k+LCA8aT5hcnRpc3Q8L2k+LCA8aT50YWdzPC9pPg0KCSAqIEByZXR1cm4gYm9vbGVhbg0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBhZGRUYWdzKCRtZXRob2RWYXJzKSB7DQoJCS8vIE9ubHkgYWxsb3cgZnVsbCBhdXRoZWQgY2FsbHMNCgkJaWYgKCAkdGhpcy0+ZnVsbEF1dGggPT0gVFJVRSApIHsNCgkJCS8vIENoZWNrIGZvciByZXF1aXJlZCB2YXJpYWJsZXMNCgkJCWlmICggIWVtcHR5KCRtZXRob2RWYXJzWydhbGJ1bSddKSAmJiAhZW1wdHkoJG1ldGhvZFZhcnNbJ2FydGlzdCddKSAmJiAhZW1wdHkoJG1ldGhvZFZhcnNbJ3RhZ3MnXSkgKSB7DQoJCQkJLy8gSWYgdGhlIHRhZ3MgdmFyaWFibGVzIGlzIGFuIGFycmF5IGJ1aWxkIGEgQ1MgbGlzdA0KCQkJCWlmICggaXNfYXJyYXkoJG1ldGhvZFZhcnNbJ3RhZ3MnXSkgKSB7DQoJCQkJCSR0YWdzID0gJyc7DQoJCQkJCWZvcmVhY2ggKCAkbWV0aG9kVmFyc1sndGFncyddIGFzICR0YWcgKSB7DQoJCQkJCQkkdGFncyAuPSAkdGFnLicsJzsNCgkJCQkJfQ0KCQkJCQkkdGFncyA9IHN1YnN0cigkdGFncywgMCwgLTEpOw0KCQkJCX0NCgkJCQllbHNlIHsNCgkJCQkJJHRhZ3MgPSAkbWV0aG9kVmFyc1sndGFncyddOw0KCQkJCX0NCgkJCQkkbWV0aG9kVmFyc1sndGFncyddID0gJHRhZ3M7DQoJCQkJDQoJCQkJLy8gU2V0IHRoZSBjYWxsIHZhcmlhYmxlcw0KCQkJCSR2YXJzID0gYXJyYXkoDQoJCQkJCSdtZXRob2QnID0+ICdhbGJ1bS5hZGR0YWdzJywNCgkJCQkJJ2FwaV9rZXknID0+ICR0aGlzLT5hdXRoLT5hcGlLZXksDQoJCQkJCSdzaycgPT4gJHRoaXMtPmF1dGgtPnNlc3Npb25LZXkNCgkJCQkpOw0KCQkJCSR2YXJzID0gYXJyYXlfbWVyZ2UoJHZhcnMsICRtZXRob2RWYXJzKTsNCgkJCQkNCgkJCQkvLyBHZW5lcmF0ZSBhIGNhbGwgc2lnbml0dXJlDQoJCQkJJHNpZyA9ICR0aGlzLT5hcGlTaWcoJHRoaXMtPmF1dGgtPnNlY3JldCwgJHZhcnMpOw0KCQkJCSR2YXJzWydhcGlfc2lnJ10gPSAkc2lnOw0KCQkJCQ0KCQkJCS8vIERvIHRoZSBjYWxsIGFuZCBjaGVjayBmb3IgZXJyb3JzDQoJCQkJaWYgKCAkY2FsbCA9ICR0aGlzLT5hcGlQb3N0Q2FsbCgkdmFycykgKSB7DQoJCQkJCS8vIElmIG5vbmUgcmV0dXJuIHRydWUNCgkJCQkJcmV0dXJuIFRSVUU7DQoJCQkJfQ0KCQkJCWVsc2Ugew0KCQkJCQkvLyBJZiB0aGVyZSBpcyByZXR1cm4gZmFsc2UNCgkJCQkJcmV0dXJuIEZBTFNFOw0KCQkJCX0NCgkJCX0NCgkJCWVsc2Ugew0KCQkJCS8vIEdpdmUgYSA5MSBlcnJvciBpZiBpbmNvcnJlY3QgdmFyaWFibGVzIGFyZSB1c2VkDQoJCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkxLCAnWW91IG11c3QgaW5jbHVkZSBhbGJ1bSwgYXJ0aXN0IGFuZCB0YWdzIHZhcmlhbGJlcyBpbiB0aGUgY2FsbCBmb3IgdGhpcyBtZXRob2QnKTsNCgkJCQlyZXR1cm4gRkFMU0U7DQoJCQl9DQoJCX0NCgkJZWxzZSB7DQoJCQkvLyBHaXZlIGEgOTIgZXJyb3IgaWYgbm90IGZ1bGx5IGF1dGhlZA0KCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkyLCAnTWV0aG9kIHJlcXVpcmVzIGZ1bGwgYXV0aC4gQ2FsbCBhdXRoLmdldFNlc3Npb24gdXNpbmcgbGFzdGZtQXBpQXV0aCBjbGFzcycpOw0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoJfQ0KCQ0KCS8qKg0KCSAqIEdldCB0aGUgbWV0YWRhdGEgZm9yIGFuIGFsYnVtIG9uIExhc3QuZm0gdXNpbmcgdGhlIGFsYnVtIG5hbWUgb3IgYSBtdXNpY2JyYWlueiBpZA0KCSAqIEBwYXJhbSBhcnJheSAkbWV0aG9kVmFycyBBbiBhcnJheSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVxdWlyZWQgdmFsdWVzOiA8aT5hbGJ1bTwvaT4gYW5kIG9wdGlvbmFsIHZhbHVlczogPGk+YXJ0aXN0PC9pPiwgPGk+bWJpZDwvaT4NCgkgKiBAcmV0dXJuIGFycmF5DQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGdldEluZm8oJG1ldGhvZFZhcnMpIHsNCgkJLy8gU2V0IHRoZSBjYWxsIHZhcmlhYmxlcw0KCQkkdmFycyA9IGFycmF5KA0KCQkJJ21ldGhvZCcgPT4gJ2FsYnVtLmdldGluZm8nLA0KCQkJJ2FwaV9rZXknID0+ICR0aGlzLT5hdXRoLT5hcGlLZXkNCgkJKTsNCgkJJHZhcnMgPSBhcnJheV9tZXJnZSgkdmFycywgJG1ldGhvZFZhcnMpOw0KCQkNCgkJJGluZm8gPSBhcnJheSgpOw0KCQlpZiAoICRjYWxsID0gJHRoaXMtPmFwaUdldENhbGwoJHZhcnMpICkgew0KCQkJJGluZm9bJ25hbWUnXSA9IChzdHJpbmcpICRjYWxsLT5hbGJ1bS0+bmFtZTsNCgkJCSRpbmZvWydhcnRpc3QnXSA9IChzdHJpbmcpICRjYWxsLT5hbGJ1bS0+YXJ0aXN0Ow0KCQkJJGluZm9bJ2xhc3RmbWlkJ10gPSAoc3RyaW5nKSAkY2FsbC0+YWxidW0tPmlkOw0KCQkJJGluZm9bJ21iaWQnXSA9IChzdHJpbmcpICRjYWxsLT5hbGJ1bS0+bWJpZDsNCgkJCSRpbmZvWyd1cmwnXSA9IChzdHJpbmcpICRjYWxsLT5hbGJ1bS0+dXJsOw0KCQkJJGluZm9bJ3JlbGVhc2VkYXRlJ10gPSBzdHJ0b3RpbWUodHJpbSgoc3RyaW5nKSAkY2FsbC0+YWxidW0tPnJlbGVhc2VkYXRlKSk7DQoJCQkkaW5mb1snaW1hZ2UnXVsnc21hbGwnXSA9IChzdHJpbmcpICRjYWxsLT5hbGJ1bS0+aW1hZ2U7DQoJCQkkaW5mb1snaW1hZ2UnXVsnbWVkaXVtJ10gPSAoc3RyaW5nKSAkY2FsbC0+YWxidW0tPmltYWdlWzFdOw0KCQkJJGluZm9bJ2ltYWdlJ11bJ2xhcmdlJ10gPSAoc3RyaW5nKSAkY2FsbC0+YWxidW0tPmltYWdlWzJdOw0KCQkJJGluZm9bJ2xpc3RlbmVycyddID0gKHN0cmluZykgJGNhbGwtPmFsYnVtLT5saXN0ZW5lcnM7DQoJCQkkaW5mb1sncGxheWNvdW50J10gPSAoc3RyaW5nKSAkY2FsbC0+YWxidW0tPnBsYXljb3VudDsNCgkJCSRpID0gMDsNCgkJCWZvcmVhY2ggKCAkY2FsbC0+YWxidW0tPnRvcHRhZ3MtPnRhZyBhcyAkdGFncyApIHsNCgkJCQkkaW5mb1sndG9wdGFncyddWyRpXVsnbmFtZSddID0gKHN0cmluZykgJHRhZ3MtPm5hbWU7DQoJCQkJJGluZm9bJ3RvcHRhZ3MnXVskaV1bJ3VybCddID0gKHN0cmluZykgJHRhZ3MtPnVybDsNCgkJCQkkaSsrOw0KCQkJfQ0KCQkJDQoJCQlyZXR1cm4gJGluZm87DQoJCX0NCgkJZWxzZSB7DQoJCQlyZXR1cm4gRkFMU0U7DQoJCX0NCgl9DQoJDQoJLyoqDQoJICogR2V0IHRoZSB0YWdzIGFwcGxpZWQgYnkgYW4gaW5kaXZpZHVhbCB1c2VyIHRvIGFuIGFsYnVtIG9uIExhc3QuZm0NCgkgKiBAcGFyYW0gYXJyYXkgJG1ldGhvZFZhcnMgQW4gYXJyYXkgd2l0aCB0aGUgZm9sbG93aW5nIHJlcXVpcmVkIHZhbHVlczogPGk+YWxidW08L2k+LCA8aT5hcnRpc3Q8L2k+DQoJICogQHJldHVybiBhcnJheQ0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBnZXRUYWdzKCRtZXRob2RWYXJzKSB7DQoJCS8vIE9ubHkgYWxsb3cgZnVsbCBhdXRoZWQgY2FsbHMNCgkJaWYgKCAkdGhpcy0+ZnVsbEF1dGggPT0gVFJVRSApIHsNCgkJCS8vIENoZWNrIGZvciByZXF1aXJlZCB2YXJpYWJsZXMNCgkJCWlmICggIWVtcHR5KCRtZXRob2RWYXJzWydhbGJ1bSddKSAmJiAhZW1wdHkoJG1ldGhvZFZhcnNbJ2FydGlzdCddKSApIHsNCgkJCQkvLyBTZXQgdGhlIHZhcmlhYmxlcw0KCQkJCSR2YXJzID0gYXJyYXkoDQoJCQkJCSdtZXRob2QnID0+ICdhbGJ1bS5nZXR0YWdzJywNCgkJCQkJJ2FwaV9rZXknID0+ICR0aGlzLT5hdXRoLT5hcGlLZXksDQoJCQkJCSdzaycgPT4gJHRoaXMtPmF1dGgtPnNlc3Npb25LZXkNCgkJCQkpOw0KCQkJCSR2YXJzID0gYXJyYXlfbWVyZ2UoJHZhcnMsICRtZXRob2RWYXJzKTsNCgkJCQkNCgkJCQkvLyBHZW5lcmF0ZSBhIGNhbGwgc2lnbml0dXJlDQoJCQkJJHNpZyA9ICR0aGlzLT5hcGlTaWcoJHRoaXMtPmF1dGgtPnNlY3JldCwgJHZhcnMpOw0KCQkJCSR2YXJzWydhcGlfc2lnJ10gPSAkc2lnOw0KCQkJCQ0KCQkJCSR0YWdzID0gYXJyYXkoKTsNCgkJCQkvLyBNYWtlIHRoZSBjYWxsDQoJCQkJaWYgKCAkY2FsbCA9ICR0aGlzLT5hcGlHZXRDYWxsKCR2YXJzKSApIHsNCgkJCQkJaWYgKCBjb3VudCgkY2FsbC0+dGFncy0+dGFnKSA+IDAgKSB7DQoJCQkJCQkkaSA9IDA7DQoJCQkJCQlmb3JlYWNoICggJGNhbGwtPnRhZ3MtPnRhZyBhcyAkdGFnICkgew0KCQkJCQkJCSR0YWdzWyRpXVsnbmFtZSddID0gKHN0cmluZykgJHRhZy0+bmFtZTsNCgkJCQkJCQkkdGFnc1skaV1bJ3VybCddID0gKHN0cmluZykgJHRhZy0+dXJsOw0KCQkJCQkJCSRpKys7DQoJCQkJCQl9DQoJCQkJCQkNCgkJCQkJCXJldHVybiAkdGFnczsNCgkJCQkJfQ0KCQkJCQllbHNlIHsNCgkJCQkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MCwgJ1VzZXIgaGFzIG5vIHRhZ3MgZm9yIHRoaXMgYXJ0aXN0Jyk7DQoJCQkJCQlyZXR1cm4gRkFMU0U7DQoJCQkJCX0NCgkJCQl9DQoJCQkJZWxzZSB7DQoJCQkJCXJldHVybiBGQUxTRTsNCgkJCQl9DQoJCQl9DQoJCQllbHNlIHsNCgkJCQkvLyBHaXZlIGEgOTEgZXJyb3IgaWYgaW5jb3JyZWN0IHZhcmlhYmxlcyBhcmUgdXNlZA0KCQkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MSwgJ1lvdSBtdXN0IGluY2x1ZGUgYWxidW0gYW5kIGFydGlzdCB2YXJpYWxiZXMgaW4gdGhlIGNhbGwgZm9yIHRoaXMgbWV0aG9kJyk7DQoJCQkJcmV0dXJuIEZBTFNFOw0KCQkJfQ0KCQl9DQoJCWVsc2Ugew0KCQkJLy8gR2l2ZSBhIDkyIGVycm9yIGlmIG5vdCBmdWxseSBhdXRoZWQNCgkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MiwgJ01ldGhvZCByZXF1aXJlcyBmdWxsIGF1dGguIENhbGwgYXV0aC5nZXRTZXNzaW9uIHVzaW5nIGxhc3RmbUFwaUF1dGggY2xhc3MnKTsNCgkJCXJldHVybiBGQUxTRTsNCgkJfQ0KCX0NCgkNCgkvKioNCgkgKiBSZW1vdmUgYSB1c2VyJ3MgdGFnIGZyb20gYW4gYWxidW0uIChSZXF1aXJlcyBmdWxsIGF1dGgpDQoJICogQHBhcmFtIGFycmF5ICRtZXRob2RWYXJzIEFuIGFycmF5IHdpdGggdGhlIGZvbGxvd2luZyByZXF1aXJlZCB2YWx1ZXM6IDxpPmFsYnVtPC9pPiwgPGk+YXJ0aXN0PC9pPiwgPGk+dGFnPC9pPg0KCSAqIEByZXR1cm4gYm9vbGVhbg0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiByZW1vdmVUYWcoJG1ldGhvZFZhcnMpIHsNCgkJLy8gT25seSBhbGxvdyBmdWxsIGF1dGhlZCBjYWxscw0KCQlpZiAoICR0aGlzLT5mdWxsQXV0aCA9PSBUUlVFICkgew0KCQkJLy8gQ2hlY2sgZm9yIHJlcXVpcmVkIHZhcmlhYmxlcw0KCQkJaWYgKCAhZW1wdHkoJG1ldGhvZFZhcnNbJ2FsYnVtJ10pICYmICFlbXB0eSgkbWV0aG9kVmFyc1snYXJ0aXN0J10pICYmICFlbXB0eSgkbWV0aG9kVmFyc1sndGFnJ10pICkgew0KCQkJCS8vIFNldCB0aGUgdmFyaWFibGVzDQoJCQkJJHZhcnMgPSBhcnJheSgNCgkJCQkJJ21ldGhvZCcgPT4gJ2FsYnVtLnJlbW92ZXRhZycsDQoJCQkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXV0aC0+YXBpS2V5LA0KCQkJCQknc2snID0+ICR0aGlzLT5hdXRoLT5zZXNzaW9uS2V5DQoJCQkJKTsNCgkJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkJDQoJCQkJLy8gR2VuZXJhdGUgYSBjYWxsIHNpZ25hdHVyZQ0KCQkJCSRzaWcgPSAkdGhpcy0+YXBpU2lnKCR0aGlzLT5hdXRoLT5zZWNyZXQsICR2YXJzKTsNCgkJCQkkdmFyc1snYXBpX3NpZyddID0gJHNpZzsNCgkJCQkNCgkJCQkvLyBEbyB0aGUgY2FsbA0KCQkJCWlmICggJGNhbGwgPSAkdGhpcy0+YXBpUG9zdENhbGwoJHZhcnMpICkgew0KCQkJCQlyZXR1cm4gVFJVRTsNCgkJCQl9DQoJCQkJZWxzZSB7DQoJCQkJCXJldHVybiBGQUxTRTsNCgkJCQl9DQoJCQl9DQoJCQllbHNlIHsNCgkJCQkvLyBHaXZlIGEgOTEgZXJyb3IgaWYgaW5jb3JyZWN0IHZhcmlhYmxlcyBhcmUgdXNlZA0KCQkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MSwgJ1lvdSBtdXN0IGluY2x1ZGUgYWxidW0sIGFydGlzdCBhbmQgdGFnIHZhcmlhbGJlcyBpbiB0aGUgY2FsbCBmb3IgdGhpcyBtZXRob2QnKTsNCgkJCQlyZXR1cm4gRkFMU0U7DQoJCQl9DQoJCX0NCgkJZWxzZSB7DQoJCQkvLyBHaXZlIGEgOTIgZXJyb3IgaWYgbm90IGZ1bGx5IGF1dGhlZA0KCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkyLCAnTWV0aG9kIHJlcXVpcmVzIGZ1bGwgYXV0aC4gQ2FsbCBhdXRoLmdldFNlc3Npb24gdXNpbmcgbGFzdGZtQXBpQXV0aCBjbGFzcycpOw0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoJfQ0KCQ0KCS8qKg0KCSAqIFNlYXJjaCBmb3IgYW4gYWxidW0gYnkgbmFtZS4gUmV0dXJucyBhbGJ1bSBtYXRjaGVzIHNvcnRlZCBieSByZWxldmFuY2UNCgkgKiBAcGFyYW0gYXJyYXkgJG1ldGhvZFZhcnMgQW4gYXJyYXkgd2l0aCB0aGUgZm9sbG93aW5nIHJlcXVpcmVkIHZhbHVlczogPGk+YWxidW08L2k+DQoJICogQHJldHVybiBhcnJheQ0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBzZWFyY2goJG1ldGhvZFZhcnMpIHsNCgkJLy8gQ2hlY2sgZm9yIHJlcXVpcmVkIHZhcmlhYmxlcw0KCQlpZiAoICFlbXB0eSgkbWV0aG9kVmFyc1snYWxidW0nXSkgKSB7DQoJCQkkdmFycyA9IGFycmF5KA0KCQkJCSdtZXRob2QnID0+ICdhbGJ1bS5zZWFyY2gnLA0KCQkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXV0aC0+YXBpS2V5DQoJCQkpOw0KCQkJJHZhcnMgPSBhcnJheV9tZXJnZSgkdmFycywgJG1ldGhvZFZhcnMpOw0KCQkJDQoJCQkkc2VhcmNocmVzdWx0cyA9IGFycmF5KCk7DQoJCQlpZiAoICRjYWxsID0gJHRoaXMtPmFwaUdldENhbGwoJHZhcnMpICkgew0KCQkJCSRvcGVuc2VhcmNoID0gJGNhbGwtPnJlc3VsdHMtPmNoaWxkcmVuKCdodHRwOi8vYTkuY29tLy0vc3BlYy9vcGVuc2VhcmNoLzEuMS8nKTsNCgkJCQlpZiAoICRvcGVuc2VhcmNoLT50b3RhbFJlc3VsdHMgPiAwICkgew0KCQkJCQkkc2VhcmNocmVzdWx0c1sndG90YWxSZXN1bHRzJ10gPSAoc3RyaW5nKSAkb3BlbnNlYXJjaC0+dG90YWxSZXN1bHRzOw0KCQkJCQkkc2VhcmNocmVzdWx0c1snc3RhcnRJbmRleCddID0gKHN0cmluZykgJG9wZW5zZWFyY2gtPnN0YXJ0SW5kZXg7DQoJCQkJCSRzZWFyY2hyZXN1bHRzWydpdGVtc1BlclBhZ2UnXSA9IChzdHJpbmcpICRvcGVuc2VhcmNoLT5pdGVtc1BlclBhZ2U7DQoJCQkJCSRpID0gMDsNCgkJCQkJZm9yZWFjaCAoICRjYWxsLT5yZXN1bHRzLT5hbGJ1bW1hdGNoZXMtPmFsYnVtIGFzICRhbGJ1bSApIHsNCgkJCQkJCSRzZWFyY2hyZXN1bHRzWydyZXN1bHRzJ11bJGldWyduYW1lJ10gPSAoc3RyaW5nKSAkYWxidW0tPm5hbWU7DQoJCQkJCQkkc2VhcmNocmVzdWx0c1sncmVzdWx0cyddWyRpXVsnYXJ0aXN0J10gPSAoc3RyaW5nKSAkYWxidW0tPmFydGlzdDsNCgkJCQkJCSRzZWFyY2hyZXN1bHRzWydyZXN1bHRzJ11bJGldWydpZCddID0gKHN0cmluZykgJGFsYnVtLT5pZDsNCgkJCQkJCSRzZWFyY2hyZXN1bHRzWydyZXN1bHRzJ11bJGldWyd1cmwnXSA9IChzdHJpbmcpICRhbGJ1bS0+dXJsOw0KCQkJCQkJJHNlYXJjaHJlc3VsdHNbJ3Jlc3VsdHMnXVskaV1bJ3N0cmVhbWFibGUnXSA9IChzdHJpbmcpICRhbGJ1bS0+c3RyZWFtYWJsZTsNCgkJCQkJCSRzZWFyY2hyZXN1bHRzWydyZXN1bHRzJ11bJGldWydpbWFnZSddWydzbWFsbCddID0gKHN0cmluZykgJGFsYnVtLT5pbWFnZVswXTsNCgkJCQkJCSRzZWFyY2hyZXN1bHRzWydyZXN1bHRzJ11bJGldWydpbWFnZSddWydtZWRpdW0nXSA9IChzdHJpbmcpICRhbGJ1bS0+aW1hZ2VbMV07DQoJCQkJCQkkc2VhcmNocmVzdWx0c1sncmVzdWx0cyddWyRpXVsnaW1hZ2UnXVsnbGFyZ2UnXSA9IChzdHJpbmcpICRhbGJ1bS0+aW1hZ2VbMl07DQoJCQkJCQkkaSsrOw0KCQkJCQl9DQoJCQkJCQ0KCQkJCQlyZXR1cm4gJHNlYXJjaHJlc3VsdHM7DQoJCQkJfQ0KCQkJCWVsc2Ugew0KCQkJCQkvLyBObyB0YWdzYXJlIGZvdW5kDQoJCQkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MCwgJ05vIHJlc3VsdHMnKTsNCgkJCQkJcmV0dXJuIEZBTFNFOw0KCQkJCX0NCgkJCX0NCgkJCWVsc2Ugew0KCQkJCXJldHVybiBGQUxTRTsNCgkJCX0NCgkJfQ0KCQllbHNlIHsNCgkJCS8vIEdpdmUgYSA5MSBlcnJvciBpZiBpbmNvcnJlY3QgdmFyaWFibGVzIGFyZSB1c2VkDQoJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTEsICdZb3UgbXVzdCBpbmNsdWRlIGFsYnVtIHZhcmlhbGJlIGluIHRoZSBjYWxsIGZvciB0aGlzIG1ldGhvZCcpOw0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoJfQ0KfQ0KDQo/Pg==]]></data>
	</file>
	<file>
	  <filename>/lib/lastfmapi/api/artist.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogRmlsZSB0aGF0IHN0b3JlcyBhcGkgY2FsbHMgZm9yIGFydGlzdCBhcGkgY2FsbHMNCiAqIEBwYWNrYWdlIGFwaWNhbGxzDQogKi8NCi8qKg0KICogQWxsb3dzIGFjY2VzcyB0byB0aGUgYXBpIHJlcXVlc3RzIHJlbGF0aW5nIHRvIGFydGlzdHMNCiAqIEBwYWNrYWdlIGFwaWNhbGxzDQogKi8NCmNsYXNzIGxhc3RmbUFwaUFydGlzdCBleHRlbmRzIGxhc3RmbUFwaSB7DQoJLyoqDQoJICogU3RvcmVzIHRoZSBjb25maWcgdmFsdWVzIHNldCBpbiB0aGUgY2FsbA0KCSAqIEBhY2Nlc3MgcHVibGljDQoJICogQHZhciBhcnJheQ0KCSAqLw0KCXB1YmxpYyAkY29uZmlnOw0KCS8qKg0KCSAqIFN0b3JlcyB0aGUgYXV0aCB2YXJpYWJsZXMgdXNlZCBpbiBhbGwgYXBpIGNhbGxzDQoJICogQGFjY2VzcyBwcml2YXRlDQoJICogQHZhciBhcnJheQ0KCSAqLw0KCXByaXZhdGUgJGF1dGg7DQoJLyoqDQoJICogU3RhdGVzIGlmIHRoZSB1c2VyIGhhcyBmdWxsIGF1dGhlbnRpY2F0aW9uIHRvIHVzZSBhcGkgcmVxdWVzdHMgdGhhdCBtb2RpZnkgZGF0YQ0KCSAqIEBhY2Nlc3MgcHJpdmF0ZQ0KCSAqIEB2YXIgYm9vbGVhbg0KCSAqLw0KCXByaXZhdGUgJGZ1bGxBdXRoOw0KCQ0KCS8qKg0KCSAqIEBwYXJhbSBhcnJheSAkYXV0aCBQYXNzZXMgdGhlIGF1dGhlbnRpY2F0aW9uIHZhcmlhYmxlcw0KCSAqIEBwYXJhbSBhcnJheSAkZnVsbEF1dGggQSBib29sZWFuIHZhbHVlIHN0YXRpbmcgaWYgdGhlIHVzZXIgaGFzIGZ1bGwgYXV0aGVudGljYXRpb24gb3Igbm90DQoJICogQHBhcmFtIGFycmF5ICRjb25maWcgQW4gYXJyYXkgb2YgY29uZmlnIHZhcmlhYmxlcyByZWxhdGVkIHRvIGNhY2hpbmcgYW5kIG90aGVyIGZlYXR1cmVzDQoJICovDQoJZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGF1dGgsICRmdWxsQXV0aCwgJGNvbmZpZykgew0KCQkkdGhpcy0+YXV0aCA9ICRhdXRoOw0KCQkkdGhpcy0+ZnVsbEF1dGggPSAkZnVsbEF1dGg7DQoJCSR0aGlzLT5jb25maWcgPSAkY29uZmlnOw0KCX0NCgkNCgkvKioNCgkgKiBUYWcgYW4gYXJ0aXN0IHVzaW5nIGEgbGlzdCBvZiB1c2VyIHN1cHBsaWVkIHRhZ3MuIChSZXF1aXJlcyBmdWxsIGF1dGgpDQoJICogQHBhcmFtIGFycmF5ICRtZXRob2RWYXJzIEFuIGFycmF5IHdpdGggdGhlIGZvbGxvd2luZyByZXF1aXJlZCB2YWx1ZXM6IDxpPmFydGlzdDwvaT4sIDxpPnRhZ3M8L2k+DQoJICogQHJldHVybiBib29sZWFuDQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGFkZFRhZ3MoJG1ldGhvZFZhcnMpIHsNCgkJLy8gT25seSBhbGxvdyBmdWxsIGF1dGhlZCBjYWxscw0KCQlpZiAoICR0aGlzLT5mdWxsQXV0aCA9PSBUUlVFICkgew0KCQkJLy8gQ2hlY2sgZm9yIHJlcXVpcmVkIHZhcmlhYmxlcw0KCQkJaWYgKCAhZW1wdHkoJG1ldGhvZFZhcnNbJ2FydGlzdCddKSAmJiAhZW1wdHkoJG1ldGhvZFZhcnNbJ3RhZ3MnXSkgKSB7DQoJCQkJLy8gSWYgdGhlIHRhZ3MgdmFyaWFibGVzIGlzIGFuIGFycmF5IGJ1aWxkIGEgQ1MgbGlzdA0KCQkJCWlmICggaXNfYXJyYXkoJG1ldGhvZFZhcnNbJ3RhZ3MnXSkgKSB7DQoJCQkJCSR0YWdzID0gJyc7DQoJCQkJCWZvcmVhY2ggKCAkbWV0aG9kVmFyc1sndGFncyddIGFzICR0YWcgKSB7DQoJCQkJCQkkdGFncyAuPSAkdGFnLicsJzsNCgkJCQkJfQ0KCQkJCQkkdGFncyA9IHN1YnN0cigkdGFncywgMCwgLTEpOw0KCQkJCX0NCgkJCQllbHNlIHsNCgkJCQkJJHRhZ3MgPSAkbWV0aG9kVmFyc1sndGFncyddOw0KCQkJCX0NCgkJCQkkbWV0aG9kVmFyc1sndGFncyddID0gJHRhZ3M7DQoJCQkJDQoJCQkJLy8gU2V0IHRoZSBjYWxsIHZhcmlhYmxlcw0KCQkJCSR2YXJzID0gYXJyYXkoDQoJCQkJCSdtZXRob2QnID0+ICdhcnRpc3QuYWRkdGFncycsDQoJCQkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXV0aC0+YXBpS2V5LA0KCQkJCQknc2snID0+ICR0aGlzLT5hdXRoLT5zZXNzaW9uS2V5DQoJCQkJKTsNCgkJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkJJHNpZyA9ICR0aGlzLT5hcGlTaWcoJHRoaXMtPmF1dGgtPnNlY3JldCwgJHZhcnMpOw0KCQkJCSR2YXJzWydhcGlfc2lnJ10gPSAkc2lnOw0KCQkJCQ0KCQkJCWlmICggJGNhbGwgPSAkdGhpcy0+YXBpUG9zdENhbGwoJHZhcnMpICkgew0KCQkJCQlyZXR1cm4gVFJVRTsNCgkJCQl9DQoJCQkJZWxzZSB7DQoJCQkJCXJldHVybiBGQUxTRTsNCgkJCQl9DQoJCQl9DQoJCQllbHNlIHsNCgkJCQkvLyBHaXZlIGEgOTEgZXJyb3IgaWYgaW5jb3JyZWN0IHZhcmlhYmxlcyBhcmUgdXNlZA0KCQkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MSwgJ1lvdSBtdXN0IGluY2x1ZGUgYXJ0aXN0IGFuZCB0YWdzIHZhcmlhbGJlcyBpbiB0aGUgY2FsbCBmb3IgdGhpcyBtZXRob2QnKTsNCgkJCQlyZXR1cm4gRkFMU0U7DQoJCQl9DQoJCX0NCgkJZWxzZSB7DQoJCQkvLyBHaXZlIGEgOTIgZXJyb3IgaWYgbm90IGZ1bGx5IGF1dGhlZA0KCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkyLCAnTWV0aG9kIHJlcXVpcmVzIGZ1bGwgYXV0aC4gQ2FsbCBhdXRoLmdldFNlc3Npb24gdXNpbmcgbGFzdGZtQXBpQXV0aCBjbGFzcycpOw0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoJfQ0KCQ0KCS8qKg0KCSAqIEdldCBhIGxpc3Qgb2YgdXBjb21pbmcgZXZlbnRzIGZvciB0aGlzIGFydGlzdC4NCgkgKiBAcGFyYW0gYXJyYXkgJG1ldGhvZFZhcnMgQW4gYXJyYXkgd2l0aCB0aGUgZm9sbG93aW5nIHJlcXVpcmVkIHZhbHVlczogPGk+YXJ0aXN0PC9pPg0KCSAqIEByZXR1cm4gYXJyYXkNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gZ2V0RXZlbnRzKCRtZXRob2RWYXJzKSB7DQoJCS8vIENoZWNrIGZvciByZXF1aXJlZCB2YXJpYWJsZXMNCgkJaWYgKCAhZW1wdHkoJG1ldGhvZFZhcnNbJ2FydGlzdCddKSApIHsNCgkJCSR2YXJzID0gYXJyYXkoDQoJCQkJJ21ldGhvZCcgPT4gJ2FydGlzdC5nZXRldmVudHMnLA0KCQkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXV0aC0+YXBpS2V5DQoJCQkpOw0KCQkJJHZhcnMgPSBhcnJheV9tZXJnZSgkdmFycywgJG1ldGhvZFZhcnMpOw0KCQkJDQoJCQlpZiAoICRjYWxsID0gJHRoaXMtPmFwaUdldENhbGwoJHZhcnMpICkgew0KCQkJCWlmICggJGNhbGwtPmV2ZW50c1sndG90YWwnXSAhPSAwICkgew0KCQkJCQkkaSA9IDA7DQoJCQkJCWZvcmVhY2ggKCAkY2FsbC0+ZXZlbnRzLT5ldmVudCBhcyAkZXZlbnQgKSB7DQoJCQkJCQkkZXZlbnRzWyRpXVsnaWQnXSA9IChzdHJpbmcpICRldmVudC0+aWQ7DQoJCQkJCQkkZXZlbnRzWyRpXVsndGl0bGUnXSA9IChzdHJpbmcpICRldmVudC0+dGl0bGU7DQoJCQkJCQkkaWkgPSAwOw0KCQkJCQkJZm9yZWFjaCAoICRldmVudC0+YXJ0aXN0cy0+YXJ0aXN0IGFzICRhcnRpc3QgKSB7DQoJCQkJCQkJJGV2ZW50c1skaV1bJ2FydGlzdHMnXVskaWldID0gKHN0cmluZykgJGFydGlzdDsNCgkJCQkJCQkkaWkrKzsNCgkJCQkJCX0NCgkJCQkJCSRldmVudHNbJGldWydoZWFkbGluZXInXSA9IChzdHJpbmcpICRldmVudC0+YXJ0aXN0cy0+aGVhZGxpbmVyOw0KCQkJCQkJJGV2ZW50c1skaV1bJ3ZlbnVlJ11bJ25hbWUnXSA9IChzdHJpbmcpICRldmVudC0+dmVudWUtPm5hbWU7DQoJCQkJCQkkZXZlbnRzWyRpXVsndmVudWUnXVsnbG9jYXRpb24nXVsnY2l0eSddID0gKHN0cmluZykgJGV2ZW50LT52ZW51ZS0+bG9jYXRpb24tPmNpdHk7DQoJCQkJCQkkZXZlbnRzWyRpXVsndmVudWUnXVsnbG9jYXRpb24nXVsnY291bnRyeSddID0gKHN0cmluZykgJGV2ZW50LT52ZW51ZS0+bG9jYXRpb24tPmNvdW50cnk7DQoJCQkJCQkkZXZlbnRzWyRpXVsndmVudWUnXVsnbG9jYXRpb24nXVsnc3RyZWV0J10gPSAoc3RyaW5nKSAkZXZlbnQtPnZlbnVlLT5sb2NhdGlvbi0+c3RyZWV0Ow0KCQkJCQkJJGV2ZW50c1skaV1bJ3ZlbnVlJ11bJ2xvY2F0aW9uJ11bJ3Bvc3Rjb2RlJ10gPSAoc3RyaW5nKSAkZXZlbnQtPnZlbnVlLT5sb2NhdGlvbi0+cG9zdGFsY29kZTsNCgkJCQkJCSRnZW9wb2ludCA9ICAkZXZlbnQtPnZlbnVlLT5sb2NhdGlvbi0+Y2hpbGRyZW4oJ2h0dHA6Ly93d3cudzMub3JnLzIwMDMvMDEvZ2VvL3dnczg0X3BvcyMnKTsNCgkJCQkJCSRldmVudHNbJGldWyd2ZW51ZSddWydsb2NhdGlvbiddWydnZW9wb2ludCddWydsYXQnXSA9IChzdHJpbmcpICRnZW9wb2ludC0+cG9pbnQtPmxhdDsNCgkJCQkJCSRldmVudHNbJGldWyd2ZW51ZSddWydsb2NhdGlvbiddWydnZW9wb2ludCddWydsb25nJ10gPSAoc3RyaW5nKSAkZ2VvcG9pbnQtPnBvaW50LT5sb25nOw0KCQkJCQkJJGV2ZW50c1skaV1bJ3ZlbnVlJ11bJ2xvY2F0aW9uJ11bJ3RpbWV6b25lJ10gPSAoc3RyaW5nKSAkZXZlbnQtPnZlbnVlLT5sb2NhdGlvbi0+dGltZXpvbmU7DQoJCQkJCQkkZXZlbnRzWyRpXVsndmVudWUnXVsndXJsJ10gPSAoc3RyaW5nKSAkY2FsbC0+dmVudWUtPnVybDsNCgkJCQkJCSRldmVudHNbJGldWydzdGFydGRhdGUnXSA9IHN0cnRvdGltZSh0cmltKChzdHJpbmcpICRldmVudC0+c3RhcnREYXRlKSk7DQoJCQkJCQkkZXZlbnRzWyRpXVsnZGVzY3JpcHRpb24nXSA9IChzdHJpbmcpICRldmVudC0+ZGVzY3JpcHRpb247DQoJCQkJCQkkZXZlbnRzWyRpXVsnaW1hZ2UnXVsnc21hbGwnXSA9IChzdHJpbmcpICRldmVudC0+aW1hZ2VbMF07DQoJCQkJCQkkZXZlbnRzWyRpXVsnaW1hZ2UnXVsnbWVuZGl1bSddID0gKHN0cmluZykgJGV2ZW50LT5pbWFnZVsxXTsNCgkJCQkJCSRldmVudHNbJGldWydpbWFnZSddWydsYXJnZSddID0gKHN0cmluZykgJGV2ZW50LT5pbWFnZVsyXTsNCgkJCQkJCSRldmVudHNbJGldWydhdHRlbmRhbmNlJ10gPSAoc3RyaW5nKSAkZXZlbnQtPmF0dGVuZGFuY2U7DQoJCQkJCQkkZXZlbnRzWyRpXVsncmV2aWV3cyddID0gKHN0cmluZykgJGV2ZW50LT5yZXZpZXdzOw0KCQkJCQkJJGV2ZW50c1skaV1bJ3RhZyddID0gKHN0cmluZykgJGV2ZW50LT50YWc7DQoJCQkJCQkkZXZlbnRzWyRpXVsndXJsJ10gPSAoc3RyaW5nKSAkZXZlbnQtPnVybDsNCgkJCQkJCQ0KCQkJCQkJJGkrKzsNCgkJCQkJfQ0KCQkJCQkNCgkJCQkJcmV0dXJuICRldmVudHM7DQoJCQkJfQ0KCQkJCWVsc2Ugew0KCQkJCQkvLyBObyBldmVudHMgYXJlIGZvdW5kDQoJCQkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MCwgJ0FydGlzdCBoYXMgbm8gZXZlbnRzJyk7DQoJCQkJCXJldHVybiBGQUxTRTsNCgkJCQl9DQoJCQl9DQoJCQllbHNlIHsNCgkJCQlyZXR1cm4gRkFMU0U7DQoJCQl9DQoJCX0NCgkJZWxzZSB7DQoJCQkvLyBHaXZlIGEgOTEgZXJyb3IgaWYgaW5jb3JyZWN0IHZhcmlhYmxlcyBhcmUgdXNlZA0KCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkxLCAnWW91IG11c3QgaW5jbHVkZSBhcnRpc3QgdmFyaWFibGUgaW4gdGhlIGNhbGwgZm9yIHRoaXMgbWV0aG9kJyk7DQoJCQlyZXR1cm4gRkFMU0U7DQoJCX0NCgl9DQoJDQoJLyoqDQoJICogR2V0IEltYWdlcyBmb3IgdGhpcyBhcnRpc3QgaW4gYSB2YXJpZXR5IG9mIHNpemVzLg0KCSAqIEBwYXJhbSBhcnJheSAkbWV0aG9kVmFycyBBbiBhcnJheSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVxdWlyZWQgdmFsdWVzOiA8aT5hcnRpc3Q8L2k+IGFuZCBvcHRpb25hbCB2YWx1ZXM6IDxpPnBhZ2U8L2k+LCA8aT5saW1pdDwvaT4sIDxpPm9yZGVyPC9pPg0KCSAqIEByZXR1cm4gYXJyYXkNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gZ2V0SW1hZ2VzKCRtZXRob2RWYXJzKSB7DQoJCS8vIENoZWNrIGZvciByZXF1aXJlZCB2YXJpYWJsZXMNCgkJaWYgKCAhZW1wdHkoJG1ldGhvZFZhcnNbJ2FydGlzdCddKSApIHsNCgkJCSR2YXJzID0gYXJyYXkoDQoJCQkJJ21ldGhvZCcgPT4gJ2FydGlzdC5nZXRpbWFnZXMnLA0KCQkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXV0aC0+YXBpS2V5DQoJCQkpOw0KCQkJJHZhcnMgPSBhcnJheV9tZXJnZSgkdmFycywgJG1ldGhvZFZhcnMpOw0KCQkJDQoJCQlpZiAoICRjYWxsID0gJHRoaXMtPmFwaUdldENhbGwoJHZhcnMpICkgew0KCQkJCSRpbWFnZXMgPSBhcnJheSgpOw0KCQkJCSRpID0gMDsNCgkJCQkkaW1hZ2VzWydhcnRpc3QnXSA9IChzdHJpbmcpJGNhbGwtPmltYWdlc1snYXJ0aXN0J107DQoJCQkJJGltYWdlc1sncGFnZSddID0gKHN0cmluZykkY2FsbC0+aW1hZ2VzWydwYWdlJ107DQoJCQkJJGltYWdlc1sndG90YWxwYWdlcyddID0gKHN0cmluZykkY2FsbC0+aW1hZ2VzWyd0b3RhbHBhZ2VzJ107DQoJCQkJJGltYWdlc1sndG90YWwnXSA9IChzdHJpbmcpJGNhbGwtPmltYWdlc1sndG90YWwnXTsNCgkJCQkNCgkJCQlmb3JlYWNoICggJGNhbGwtPmltYWdlcy0+aW1hZ2UgYXMgJGltYWdlICkgew0KCQkJCQkkaW1hZ2VzWydpbWFnZXMnXVskaV1bJ3RpdGxlJ10gPSAoc3RyaW5nKSAkaW1hZ2UtPnRpdGxlOw0KCQkJCQkkaW1hZ2VzWydpbWFnZXMnXVskaV1bJ3VybCddID0gKHN0cmluZykgJGltYWdlLT51cmw7DQoJCQkJCSRpbWFnZXNbJ2ltYWdlcyddWyRpXVsnZGF0ZWFkZGVkJ10gPSAoc3RyaW5nKSAkaW1hZ2UtPmRhdGVhZGRlZDsNCgkJCQkJJGltYWdlc1snaW1hZ2VzJ11bJGldWydmb3JtYXQnXSA9IChzdHJpbmcpICRpbWFnZS0+Zm9ybWF0Ow0KCQkJCQkkaW1hZ2VzWydpbWFnZXMnXVskaV1bJ3NpemVzJ10gPSBhcnJheSgpOw0KCQkJCQkkb2ZmaWNpYWwgPSBpc3NldCgkaW1hZ2VbJ29mZmljaWFsJ10pID8gKHN0cmluZykgJGltYWdlWydvZmZpY2lhbCddIDogZmFsc2U7DQoJCQkJCSRpbWFnZXNbJ2ltYWdlcyddWyRpXVsnb2ZmaWNpYWwnXSA9ICRvZmZpY2lhbCA9PSAneWVzJzsNCgkJCQkJZm9yZWFjaCggJGltYWdlLT5zaXplcy0+c2l6ZSBhcyAkc2l6ZSApIHsNCgkJCQkJCSRpbWFnZXNbJ2ltYWdlcyddWyRpXVsnc2l6ZXMnXVsoc3RyaW5nKSRzaXplWyduYW1lJ11dID0gYXJyYXkoDQoJCQkJCQkJJ3dpZHRoJyA9PiAoc3RyaW5nKSAkc2l6ZVsnd2lkdGgnXSwNCgkJCQkJCQknaGVpZ2h0JyA9PiAoc3RyaW5nKSAkc2l6ZVsnaGVpZ2h0J10sDQoJCQkJCQkJJ3VybCcgPT4gKHN0cmluZykgJHNpemUsDQoJCQkJCQkpOw0KCQkJCQl9DQoJCQkJCSRpbWFnZXNbJ2ltYWdlcyddWyRpXVsndm90ZXMnXSA9IGFycmF5KA0KCQkJCQkJJ3RodW1ic3VwJyA9PiAoc3RyaW5nKSAkaW1hZ2UtPnZvdGVzLT50aHVtYnN1cCwNCgkJCQkJCSd0aHVtYnNkb3duJyA9PiAoc3RyaW5nKSAkaW1hZ2UtPnZvdGVzLT50aHVtYnNkb3duLA0KCQkJCQkpOw0KCQkJCQkkaSsrOw0KCQkJCX0NCgkJCQlyZXR1cm4gJGltYWdlczsNCgkJCX0NCgkJCWVsc2Ugew0KCQkJCXJldHVybiBGQUxTRTsNCgkJCX0NCgkJfQ0KCQllbHNlIHsNCgkJCS8vIEdpdmUgYSA5MSBlcnJvciBpZiBpbmNvcnJlY3QgdmFyaWFibGVzIGFyZSB1c2VkDQoJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTEsICdZb3UgbXVzdCBpbmNsdWRlIGFydGlzdCB2YXJpYWJsZSBpbiB0aGUgY2FsbCBmb3IgdGhpcyBtZXRob2QnKTsNCgkJCXJldHVybiBGQUxTRTsNCgkJfQ0KCX0NCgkNCgkvKioNCgkgKiBHZXQgdGhlIG1ldGFkYXRhIGZvciBhbiBhcnRpc3Qgb24gTGFzdC5mbS4gSW5jbHVkZXMgYmlvZ3JhcGh5Lg0KCSAqIEBwYXJhbSBhcnJheSAkbWV0aG9kVmFycyBBbiBhcnJheSB3aXRoIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiA8aT5hcnRpc3Q8L2k+IG9yIDxpPm1iaWQ8L2k+DQoJICogQHJldHVybiBhcnJheQ0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBnZXRJbmZvKCRtZXRob2RWYXJzKSB7DQoJCSR2YXJzID0gYXJyYXkoDQoJCQknbWV0aG9kJyA9PiAnYXJ0aXN0LmdldGluZm8nLA0KCQkJJ2FwaV9rZXknID0+ICR0aGlzLT5hdXRoLT5hcGlLZXkNCgkJKTsNCgkJJHZhcnMgPSBhcnJheV9tZXJnZSgkdmFycywgJG1ldGhvZFZhcnMpOw0KCQkNCgkJaWYgKCAkY2FsbCA9ICR0aGlzLT5hcGlHZXRDYWxsKCR2YXJzKSApIHsNCgkJCSRpbmZvWyduYW1lJ10gPSAoc3RyaW5nKSAkY2FsbC0+YXJ0aXN0LT5uYW1lOw0KCQkJJGluZm9bJ21iaWQnXSA9IChzdHJpbmcpICRjYWxsLT5hcnRpc3QtPm1iaWQ7DQoJCQkkaW5mb1sndXJsJ10gPSAoc3RyaW5nKSAkY2FsbC0+YXJ0aXN0LT51cmw7DQoJCQkkaW5mb1snaW1hZ2UnXVsnc21hbGwnXSA9IChzdHJpbmcpICRjYWxsLT5hcnRpc3QtPmltYWdlOw0KCQkJJGluZm9bJ2ltYWdlJ11bJ21lZGl1bSddID0gKHN0cmluZykgJGNhbGwtPmFydGlzdC0+aW1hZ2VbMV07DQoJCQkkaW5mb1snaW1hZ2UnXVsnbGFyZ2UnXSA9IChzdHJpbmcpICRjYWxsLT5hcnRpc3QtPmltYWdlWzJdOw0KCQkJJGluZm9bJ3N0cmVhbWFibGUnXSA9IChzdHJpbmcpICRjYWxsLT5hcnRpc3QtPnN0cmVhbWFibGU7DQoJCQkkaW5mb1snc3RhdHMnXVsnbGlzdGVuZXJzJ10gPSAoc3RyaW5nKSAkY2FsbC0+YXJ0aXN0LT5zdGF0cy0+bGlzdGVuZXJzOw0KCQkJJGluZm9bJ3N0YXRzJ11bJ3BsYXljb3VudCddID0gKHN0cmluZykgJGNhbGwtPmFydGlzdC0+c3RhdHMtPnBsYXlzOw0KCQkJJGkgPSAwOw0KCQkJZm9yZWFjaCAoICRjYWxsLT5hcnRpc3QtPnNpbWlsYXItPmFydGlzdCBhcyAkYXJ0aXN0ICkgew0KCQkJCSRpbmZvWydzaW1pbGFyJ11bJGldWyduYW1lJ10gPSAoc3RyaW5nKSAkYXJ0aXN0LT5uYW1lOw0KCQkJCSRpbmZvWydzaW1pbGFyJ11bJGldWyd1cmwnXSA9IChzdHJpbmcpICRhcnRpc3QtPnVybDsNCgkJCQkkaW5mb1snc2ltaWxhciddWyRpXVsnaW1hZ2UnXVsnc21hbGwnXSA9IChzdHJpbmcpICRhcnRpc3QtPmltYWdlOw0KCQkJCSRpbmZvWydzaW1pbGFyJ11bJGldWydpbWFnZSddWydtZWRpdW0nXSA9IChzdHJpbmcpICRhcnRpc3QtPmltYWdlWzFdOw0KCQkJCSRpbmZvWydzaW1pbGFyJ11bJGldWydpbWFnZSddWydsYXJnZSddID0gKHN0cmluZykgJGFydGlzdC0+aW1hZ2VbMl07DQoJCQkJJGkrKzsNCgkJCX0NCgkJCWlmICggY291bnQoJGNhbGwtPmFydGlzdC0+dGFncy0+dGFnKSA+IDAgKSB7DQoJCQkJJGkgPSAwOw0KCQkJCWZvcmVhY2ggKCAkY2FsbC0+YXJ0aXN0LT50YWdzLT50YWcgYXMgJHRhZyApIHsNCgkJCQkJJGluZm9bJ3RhZ3MnXVskaV1bJ25hbWUnXSA9IChzdHJpbmcpICR0YWctPm5hbWU7DQoJCQkJCSRpbmZvWyd0YWdzJ11bJGldWyd1cmwnXSA9IChzdHJpbmcpICR0YWctPnVybDsNCgkJCQkJJGkrKzsNCgkJCQl9DQoJCQl9DQoJCQllbHNlIHsNCgkJCQkkaW5mb1sndGFncyddID0gRkFMU0U7DQoJCQl9DQoJCQkkaW5mb1snYmlvJ11bJ3B1Ymxpc2hlZCddID0gKHN0cmluZykgJGNhbGwtPmFydGlzdC0+YmlvLT5wdWJsaXNoZWQ7DQoJCQkkaW5mb1snYmlvJ11bJ3N1bW1hcnknXSA9IChzdHJpbmcpICRjYWxsLT5hcnRpc3QtPmJpby0+c3VtbWFyeTsNCgkJCSRpbmZvWydiaW8nXVsnY29udGVudCddID0gKHN0cmluZykgJGNhbGwtPmFydGlzdC0+YmlvLT5jb250ZW50Ow0KCQkJDQoJCQlyZXR1cm4gJGluZm87DQoJCX0NCgkJZWxzZSB7DQoJCQlyZXR1cm4gRkFMU0U7DQoJCX0NCgl9DQoJDQoJLyoqDQoJICogR2V0IHNob3V0cyBmb3IgdGhpcyBhcnRpc3QuDQoJICogQHBhcmFtIGFycmF5ICRtZXRob2RWYXJzIEFuIGFycmF5IHdpdGggdGhlIGZvbGxvd2luZyByZXF1aXJlZCB2YWx1ZXM6IDxpPmFydGlzdDwvaT4NCgkgKiBAcmV0dXJuIGFycmF5DQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGdldFNob3V0cygkbWV0aG9kVmFycykgew0KCQlpZiAoICFlbXB0eSgkbWV0aG9kVmFyc1snYXJ0aXN0J10pICkgew0KCQkJJHZhcnMgPSBhcnJheSgNCgkJCQknbWV0aG9kJyA9PiAnYXJ0aXN0LmdldHNob3V0cycsDQoJCQkJJ2FwaV9rZXknID0+ICR0aGlzLT5hdXRoLT5hcGlLZXkNCgkJCSk7DQoJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkNCgkJCWlmICggJGNhbGwgPSAkdGhpcy0+YXBpR2V0Q2FsbCgkdmFycykgKSB7DQoJCQkJJHNob3V0c1snYXJ0aXN0J10gPSAoc3RyaW5nKSRjYWxsLT5zaG91dHNbJ2FydGlzdCddOw0KCQkJCSRzaG91dHNbJ3RvdGFsJ10gPSAoc3RyaW5nKSRjYWxsLT5zaG91dHNbJ3RvdGFsJ107DQoJCQkJJGkgPSAwOw0KCQkJCWZvcmVhY2ggKCAkY2FsbC0+c2hvdXRzLT5zaG91dCBhcyAkc2hvdXQgKSB7DQoJCQkJCSRzaG91dHNbJ3Nob3V0cyddWyRpXVsnYm9keSddID0gKHN0cmluZykkc2hvdXQtPmJvZHk7DQoJCQkJCSRzaG91dHNbJ3Nob3V0cyddWyRpXVsnYXV0aG9yJ10gPSAoc3RyaW5nKSRzaG91dC0+YXV0aG9yOw0KCQkJCQkkc2hvdXRzWydzaG91dHMnXVskaV1bJ2RhdGUnXSA9IHN0cnRvdGltZSgoc3RyaW5nKSRzaG91dC0+ZGF0ZSk7DQoJCQkJCSRpKys7DQoJCQkJfQ0KCQkJCQ0KCQkJCXJldHVybiAkc2hvdXRzOw0KCQkJfQ0KCQkJZWxzZSB7DQoJCQkJcmV0dXJuIEZBTFNFOw0KCQkJfQ0KCQl9DQoJCWVsc2Ugew0KCQkJLy8gR2l2ZSBhIDkxIGVycm9yIGlmIGluY29ycmVjdCB2YXJpYWJsZXMgYXJlIHVzZWQNCgkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MSwgJ1lvdSBtdXN0IGluY2x1ZGUgYXJ0aXN0IHZhcmlhYmxlIGluIHRoZSBjYWxsIGZvciB0aGlzIG1ldGhvZCcpOw0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoJfQ0KCQ0KCS8qKg0KCSAqIEdldCBhbGwgdGhlIGFydGlzdHMgc2ltaWxhciB0byB0aGlzIGFydGlzdA0KCSAqIEBwYXJhbSBhcnJheSAkbWV0aG9kVmFycyBBbiBhcnJheSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVxdWlyZWQgdmFsdWU6IDxpPmFydGlzdDwvaT4gYW5kIG9wdGlvbmFsIHZhbHVlOiA8aT5saW1pdDwvaT4sIDxpPjwvaT4NCgkgKiBAcmV0dXJuIGFycmF5DQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGdldFNpbWlsYXIoJG1ldGhvZFZhcnMpIHsNCgkJLy8gQ2hlY2sgZm9yIHJlcXVpcmVkIHZhcmlhYmxlcw0KCQlpZiAoICFlbXB0eSgkbWV0aG9kVmFyc1snYXJ0aXN0J10pICkgew0KCQkJJHZhcnMgPSBhcnJheSgNCgkJCQknbWV0aG9kJyA9PiAnYXJ0aXN0LmdldHNpbWlsYXInLA0KCQkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXV0aC0+YXBpS2V5DQoJCQkpOw0KCQkJJHZhcnMgPSBhcnJheV9tZXJnZSgkdmFycywgJG1ldGhvZFZhcnMpOw0KCQkJDQoJCQlpZiAoICRjYWxsID0gJHRoaXMtPmFwaUdldENhbGwoJHZhcnMpICkgew0KCQkJCSRzaW1pbGFyID0gJyc7DQoJCQkJJGkgPSAwOw0KCQkJCWZvcmVhY2ggKCAkY2FsbC0+c2ltaWxhcmFydGlzdHMtPmFydGlzdCBhcyAkYXJ0aXN0ICkgew0KCQkJCQkkc2ltaWxhclskaV1bJ25hbWUnXSA9IChzdHJpbmcpICRhcnRpc3QtPm5hbWU7DQoJCQkJCSRzaW1pbGFyWyRpXVsnbWJpZCddID0gKHN0cmluZykgJGFydGlzdC0+bWJpZDsNCgkJCQkJJHNpbWlsYXJbJGldWydtYXRjaCddID0gKHN0cmluZykgJGFydGlzdC0+bWF0Y2g7DQoJCQkJCSRzaW1pbGFyWyRpXVsndXJsJ10gPSAoc3RyaW5nKSAkYXJ0aXN0LT51cmw7DQoJCQkJCSRzaW1pbGFyWyRpXVsnaW1hZ2UnXSA9IChzdHJpbmcpICRhcnRpc3QtPmltYWdlOw0KCQkJCQkkaSsrOw0KCQkJCX0NCgkJCQkNCgkJCQlyZXR1cm4gJHNpbWlsYXI7DQoJCQl9DQoJCQllbHNlIHsNCgkJCQlyZXR1cm4gRkFMU0U7DQoJCQl9DQoJCX0NCgkJZWxzZSB7DQoJCQkvLyBHaXZlIGEgOTEgZXJyb3IgaWYgaW5jb3JyZWN0IHZhcmlhYmxlcyBhcmUgdXNlZA0KCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkxLCAnWW91IG11c3QgaW5jbHVkZSBhcnRpc3QgdmFyaWFibGUgaW4gdGhlIGNhbGwgZm9yIHRoaXMgbWV0aG9kJyk7DQoJCQlyZXR1cm4gRkFMU0U7DQoJCX0NCgl9DQoJDQoJLyoqDQoJICogR2V0IHRoZSB0YWdzIGFwcGxpZWQgYnkgYW4gaW5kaXZpZHVhbCB1c2VyIHRvIGFuIGFydGlzdCBvbiBMYXN0LmZtLiAoUmVxdWlyZXMgZnVsbCBhdXRoKQ0KCSAqIEBwYXJhbSBhcnJheSAkbWV0aG9kVmFycyBBbiBhcnJheSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVxdWlyZWQgdmFsdWVzOiA8aT5hcnRpc3Q8L2k+DQoJICogQHJldHVybiBhcnJheQ0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBnZXRUYWdzKCRtZXRob2RWYXJzKSB7DQoJCS8vIE9ubHkgYWxsb3cgZnVsbCBhdXRoZWQgY2FsbHMNCgkJaWYgKCAkdGhpcy0+ZnVsbEF1dGggPT0gVFJVRSApIHsNCgkJCS8vIENoZWNrIGZvciByZXF1aXJlZCB2YXJpYWJsZXMNCgkJCWlmICggIWVtcHR5KCRtZXRob2RWYXJzWydhcnRpc3QnXSkgKSB7DQoJCQkJJHZhcnMgPSBhcnJheSgNCgkJCQkJJ21ldGhvZCcgPT4gJ2FydGlzdC5nZXR0YWdzJywNCgkJCQkJJ2FwaV9rZXknID0+ICR0aGlzLT5hdXRoLT5hcGlLZXksDQoJCQkJCSdzaycgPT4gJHRoaXMtPmF1dGgtPnNlc3Npb25LZXkNCgkJCQkpOw0KCQkJCSR2YXJzID0gYXJyYXlfbWVyZ2UoJHZhcnMsICRtZXRob2RWYXJzKTsNCgkJCQkkc2lnID0gJHRoaXMtPmFwaVNpZygkdGhpcy0+YXV0aC0+c2VjcmV0LCAkdmFycyk7DQoJCQkJJHZhcnNbJ2FwaV9zaWcnXSA9ICRzaWc7DQoJCQkJDQoJCQkJaWYgKCAkY2FsbCA9ICR0aGlzLT5hcGlHZXRDYWxsKCR2YXJzKSApIHsNCgkJCQkJaWYgKCBjb3VudCgkY2FsbC0+dGFncy0+dGFnKSA+IDAgKSB7DQoJCQkJCQkkaSA9IDA7DQoJCQkJCQlmb3JlYWNoICggJGNhbGwtPnRhZ3NbMF0tPnRhZyBhcyAkdGFnICkgew0KCQkJCQkJCSR0YWdzWyRpXVsnbmFtZSddID0gKHN0cmluZykgJHRhZy0+bmFtZTsNCgkJCQkJCQkkdGFnc1skaV1bJ3VybCddID0gKHN0cmluZykgJHRhZy0+dXJsOw0KCQkJCQkJCSRpKys7DQoJCQkJCQl9DQoJCQkJCQkNCgkJCQkJCXJldHVybiAkdGFnczsNCgkJCQkJfQ0KCQkJCQllbHNlIHsNCgkJCQkJCS8vIE5vIHRhZ3NhcmUgZm91bmQNCgkJCQkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MCwgJ0FydGlzdCBoYXMgbm8gdGFncyBmcm9tIHRoaXMgdXNlcicpOw0KCQkJCQkJcmV0dXJuIEZBTFNFOw0KCQkJCQl9DQoJCQkJfQ0KCQkJCWVsc2Ugew0KCQkJCQlyZXR1cm4gRkFMU0U7DQoJCQkJfQ0KCQkJfQ0KCQkJZWxzZSB7DQoJCQkJLy8gR2l2ZSBhIDkxIGVycm9yIGlmIGluY29ycmVjdCB2YXJpYWJsZXMgYXJlIHVzZWQNCgkJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTEsICdZb3UgbXVzdCBpbmNsdWRlIGFydGlzdCB2YXJpYWxiZSBpbiB0aGUgY2FsbCBmb3IgdGhpcyBtZXRob2QnKTsNCgkJCQlyZXR1cm4gRkFMU0U7DQoJCQl9DQoJCX0NCgkJZWxzZSB7DQoJCQkvLyBHaXZlIGEgOTIgZXJyb3IgaWYgbm90IGZ1bGx5IGF1dGhlZA0KCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkyLCAnTWV0aG9kIHJlcXVpcmVzIGZ1bGwgYXV0aC4gQ2FsbCBhdXRoLmdldFNlc3Npb24gdXNpbmcgbGFzdGZtQXBpQXV0aCBjbGFzcycpOw0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoJfQ0KCQ0KCS8qKg0KCSAqIEdldCB0aGUgdG9wIGFsYnVtcyBmb3IgYW4gYXJ0aXN0IG9uIExhc3QuZm0sIG9yZGVyZWQgYnkgcG9wdWxhcml0eQ0KCSAqIEBwYXJhbSBhcnJheSAkbWV0aG9kVmFycyBBbiBhcnJheSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVxdWlyZWQgdmFsdWVzOiA8aT5hcnRpc3Q8L2k+DQoJICogQHJldHVybiBhcnJheQ0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBnZXRUb3BBbGJ1bXMoJG1ldGhvZFZhcnMpIHsNCgkJLy8gQ2hlY2sgZm9yIHJlcXVpcmVkIHZhcmlhYmxlcw0KCQlpZiAoICFlbXB0eSgkbWV0aG9kVmFyc1snYXJ0aXN0J10pICkgew0KCQkJJHZhcnMgPSBhcnJheSgNCgkJCQknbWV0aG9kJyA9PiAnYXJ0aXN0LmdldHRvcGFsYnVtcycsDQoJCQkJJ2FwaV9rZXknID0+ICR0aGlzLT5hdXRoLT5hcGlLZXkNCgkJCSk7DQoJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkNCgkJCWlmICggJGNhbGwgPSAkdGhpcy0+YXBpR2V0Q2FsbCgkdmFycykgKSB7DQoJCQkJaWYgKCBjb3VudCgkY2FsbC0+dG9wYWxidW1zLT5hbGJ1bSkgPiAwICkgew0KCQkJCQkkaSA9IDA7DQoJCQkJCWZvcmVhY2ggKCAkY2FsbC0+dG9wYWxidW1zLT5hbGJ1bSBhcyAkYWxidW0gKSB7DQoJCQkJCQkkdG9wQWxidW1zWyRpXVsncmFuayddID0gKHN0cmluZykgJGFsYnVtWydyYW5rJ107DQoJCQkJCQkkdG9wQWxidW1zWyRpXVsnbmFtZSddID0gKHN0cmluZykgJGFsYnVtLT5uYW1lOw0KCQkJCQkJJHRvcEFsYnVtc1skaV1bJ21iaWQnXSA9IChzdHJpbmcpICRhbGJ1bS0+bWJpZDsNCgkJCQkJCSR0b3BBbGJ1bXNbJGldWydwbGF5Y291bnQnXSA9IChzdHJpbmcpICRhbGJ1bS0+cGxheWNvdW50Ow0KCQkJCQkJJHRvcEFsYnVtc1skaV1bJ3VybCddID0gKHN0cmluZykgJGFsYnVtLT51cmw7DQoJCQkJCQkkdG9wQWxidW1zWyRpXVsnaW1hZ2UnXVsnc21hbGwnXSA9IChzdHJpbmcpICRhbGJ1bS0+aW1hZ2VbMF07DQoJCQkJCQkkdG9wQWxidW1zWyRpXVsnaW1hZ2UnXVsnbWVkaXVtJ10gPSAoc3RyaW5nKSAkYWxidW0tPmltYWdlWzFdOw0KCQkJCQkJJHRvcEFsYnVtc1skaV1bJ2ltYWdlJ11bJ2xhcmdlJ10gPSAoc3RyaW5nKSAkYWxidW0tPmltYWdlWzJdOw0KCQkJCQkJJGkrKzsNCgkJCQkJfQ0KCQkJCQkNCgkJCQkJcmV0dXJuICR0b3BBbGJ1bXM7DQoJCQkJfQ0KCQkJCWVsc2Ugew0KCQkJCQkvLyBObyB0YWdzYXJlIGZvdW5kDQoJCQkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MCwgJ0FydGlzdCBoYXMgbm8gdG9wIGFsYnVtcycpOw0KCQkJCQlyZXR1cm4gRkFMU0U7DQoJCQkJfQ0KCQkJfQ0KCQkJZWxzZSB7DQoJCQkJcmV0dXJuIEZBTFNFOw0KCQkJfQ0KCQl9DQoJCWVsc2Ugew0KCQkJLy8gR2l2ZSBhIDkxIGVycm9yIGlmIGluY29ycmVjdCB2YXJpYWJsZXMgYXJlIHVzZWQNCgkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MSwgJ1lvdSBtdXN0IGluY2x1ZGUgYXJ0aXN0IHZhcmlhbGJlIGluIHRoZSBjYWxsIGZvciB0aGlzIG1ldGhvZCcpOw0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoJfQ0KCQ0KCS8qKg0KCSAqIEdldCB0aGUgdG9wIGZhbnMgZm9yIGFuIGFydGlzdCBvbiBMYXN0LmZtLCBiYXNlZCBvbiBsaXN0ZW5pbmcgZGF0YQ0KCSAqIEBwYXJhbSBhcnJheSAkbWV0aG9kVmFycyBBbiBhcnJheSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVxdWlyZWQgdmFsdWVzOiA8aT5hcnRpc3Q8L2k+DQoJICogQHJldHVybiBhcnJheQ0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBnZXRUb3BGYW5zKCRtZXRob2RWYXJzKSB7DQoJCS8vIENoZWNrIGZvciByZXF1aXJlZCB2YXJpYWJsZXMNCgkJaWYgKCAhZW1wdHkoJG1ldGhvZFZhcnNbJ2FydGlzdCddKSApIHsNCgkJCSR2YXJzID0gYXJyYXkoDQoJCQkJJ21ldGhvZCcgPT4gJ2FydGlzdC5nZXR0b3BmYW5zJywNCgkJCQknYXBpX2tleScgPT4gJHRoaXMtPmF1dGgtPmFwaUtleQ0KCQkJKTsNCgkJCSR2YXJzID0gYXJyYXlfbWVyZ2UoJHZhcnMsICRtZXRob2RWYXJzKTsNCgkJCQ0KCQkJaWYgKCAkY2FsbCA9ICR0aGlzLT5hcGlHZXRDYWxsKCR2YXJzKSApIHsNCgkJCQlpZiAoIGNvdW50KCRjYWxsLT50b3BmYW5zLT51c2VyKSA+IDAgKSB7DQoJCQkJCSRpID0gMDsNCgkJCQkJZm9yZWFjaCAoICRjYWxsLT50b3BmYW5zLT51c2VyIGFzICR1c2VyICkgew0KCQkJCQkJJHRvcEZhbnNbJGldWyduYW1lJ10gPSAoc3RyaW5nKSAkdXNlci0+bmFtZTsNCgkJCQkJCSR0b3BGYW5zWyRpXVsndXJsJ10gPSAoc3RyaW5nKSAkdXNlci0+dXJsOw0KCQkJCQkJJHRvcEZhbnNbJGldWydpbWFnZSddWydzbWFsbCddID0gKHN0cmluZykgJHVzZXItPmltYWdlWzBdOw0KCQkJCQkJJHRvcEZhbnNbJGldWydpbWFnZSddWydtZWRpdW0nXSA9IChzdHJpbmcpICR1c2VyLT5pbWFnZVsxXTsNCgkJCQkJCSR0b3BGYW5zWyRpXVsnaW1hZ2UnXVsnbGFyZ2UnXSA9IChzdHJpbmcpICR1c2VyLT5pbWFnZVsyXTsNCgkJCQkJCSR0b3BGYW5zWyRpXVsnd2VpZ2h0J10gPSAoc3RyaW5nKSAkdXNlci0+d2VpZ2h0Ow0KCQkJCQkJJGkrKzsNCgkJCQkJfQ0KCQkJCQkNCgkJCQkJcmV0dXJuICR0b3BGYW5zOw0KCQkJCX0NCgkJCQllbHNlIHsNCgkJCQkJLy8gTm8gdGFnc2FyZSBmb3VuZA0KCQkJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTAsICdBcnRpc3QgaGFzIG5vIHRvcCB1c2VycycpOw0KCQkJCQlyZXR1cm4gRkFMU0U7DQoJCQkJfQ0KCQkJfQ0KCQkJZWxzZSB7DQoJCQkJcmV0dXJuIEZBTFNFOw0KCQkJfQ0KCQl9DQoJCWVsc2Ugew0KCQkJLy8gR2l2ZSBhIDkxIGVycm9yIGlmIGluY29ycmVjdCB2YXJpYWJsZXMgYXJlIHVzZWQNCgkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MSwgJ1lvdSBtdXN0IGluY2x1ZGUgYXJ0aXN0IHZhcmlhbGJlIGluIHRoZSBjYWxsIGZvciB0aGlzIG1ldGhvZCcpOw0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoJfQ0KCQ0KCS8qKg0KCSAqIEdldCB0aGUgdG9wIHRhZ3MgZm9yIGFuIGFydGlzdCBvbiBMYXN0LmZtLCBvcmRlcmVkIGJ5IHBvcHVsYXJpdHkNCgkgKiBAcGFyYW0gYXJyYXkgJG1ldGhvZFZhcnMgQW4gYXJyYXkgd2l0aCB0aGUgZm9sbG93aW5nIHJlcXVpcmVkIHZhbHVlczogPGk+YXJ0aXN0PC9pPg0KCSAqIEByZXR1cm4gYXJyYXkNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gZ2V0VG9wVGFncygkbWV0aG9kVmFycykgew0KCQkvLyBDaGVjayBmb3IgcmVxdWlyZWQgdmFyaWFibGVzDQoJCWlmICggIWVtcHR5KCRtZXRob2RWYXJzWydhcnRpc3QnXSkgKSB7DQoJCQkkdmFycyA9IGFycmF5KA0KCQkJCSdtZXRob2QnID0+ICdhcnRpc3QuZ2V0dG9wdGFncycsDQoJCQkJJ2FwaV9rZXknID0+ICR0aGlzLT5hdXRoLT5hcGlLZXkNCgkJCSk7DQoJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkNCgkJCWlmICggJGNhbGwgPSAkdGhpcy0+YXBpR2V0Q2FsbCgkdmFycykgKSB7DQoJCQkJaWYgKCBjb3VudCgkY2FsbC0+dG9wdGFncy0+dGFnKSA+IDAgKSB7DQoJCQkJCSRpID0gMDsNCgkJCQkJZm9yZWFjaCAoICRjYWxsLT50b3B0YWdzLT50YWcgYXMgJHRhZyApIHsNCgkJCQkJCSR0b3BUYWdzWyRpXVsnbmFtZSddID0gKHN0cmluZykgJHRhZy0+bmFtZTsNCgkJCQkJCSR0b3BUYWdzWyRpXVsndXJsJ10gPSAoc3RyaW5nKSAkdGFnLT51cmw7DQoJCQkJCQkkaSsrOw0KCQkJCQl9DQoJCQkJCQ0KCQkJCQlyZXR1cm4gJHRvcFRhZ3M7DQoJCQkJfQ0KCQkJCWVsc2Ugew0KCQkJCQkvLyBObyB0YWdzYXJlIGZvdW5kDQoJCQkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MCwgJ0FydGlzdCBoYXMgbm8gdG9wIHRhZ3MnKTsNCgkJCQkJcmV0dXJuIEZBTFNFOw0KCQkJCX0NCgkJCX0NCgkJCWVsc2Ugew0KCQkJCXJldHVybiBGQUxTRTsNCgkJCX0NCgkJfQ0KCQllbHNlIHsNCgkJCS8vIEdpdmUgYSA5MSBlcnJvciBpZiBpbmNvcnJlY3QgdmFyaWFibGVzIGFyZSB1c2VkDQoJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTEsICdZb3UgbXVzdCBpbmNsdWRlIGFydGlzdCB2YXJpYWxiZSBpbiB0aGUgY2FsbCBmb3IgdGhpcyBtZXRob2QnKTsNCgkJCXJldHVybiBGQUxTRTsNCgkJfQ0KCX0NCgkNCgkvKioNCgkgKiBHZXQgdGhlIHRvcCB0cmFja3MgYnkgYW4gYXJ0aXN0IG9uIExhc3QuZm0sIG9yZGVyZWQgYnkgcG9wdWxhcml0eQ0KCSAqIEBwYXJhbSBhcnJheSAkbWV0aG9kVmFycyBBbiBhcnJheSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVxdWlyZWQgdmFsdWVzOiA8aT5hcnRpc3Q8L2k+DQoJICogQHJldHVybiBhcnJheQ0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBnZXRUb3BUcmFja3MoJG1ldGhvZFZhcnMpIHsNCgkJLy8gQ2hlY2sgZm9yIHJlcXVpcmVkIHZhcmlhYmxlcw0KCQlpZiAoICFlbXB0eSgkbWV0aG9kVmFyc1snYXJ0aXN0J10pICkgew0KCQkJJHZhcnMgPSBhcnJheSgNCgkJCQknbWV0aG9kJyA9PiAnYXJ0aXN0LmdldHRvcHRyYWNrcycsDQoJCQkJJ2FwaV9rZXknID0+ICR0aGlzLT5hdXRoLT5hcGlLZXkNCgkJCSk7DQoJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkNCgkJCWlmICggJGNhbGwgPSAkdGhpcy0+YXBpR2V0Q2FsbCgkdmFycykgKSB7DQoJCQkJaWYgKCBjb3VudCgkY2FsbC0+dG9wdHJhY2tzLT50cmFjaykgPiAwICkgew0KCQkJCQkkaSA9IDA7DQoJCQkJCWZvcmVhY2ggKCAkY2FsbC0+dG9wdHJhY2tzLT50cmFjayBhcyAkdHJhY2tzICkgew0KCQkJCQkJJHRvcFRyYWNrc1skaV1bJ3JhbmsnXSA9IChzdHJpbmcpICR0cmFja3NbJ3JhbmsnXTsNCgkJCQkJCSR0b3BUcmFja3NbJGldWyduYW1lJ10gPSAoc3RyaW5nKSAkdHJhY2tzLT5uYW1lOw0KCQkJCQkJJHRvcFRyYWNrc1skaV1bJ3BsYXljb3VudCddID0gKHN0cmluZykgJHRyYWNrcy0+cGxheWNvdW50Ow0KCQkJCQkJJHRvcFRyYWNrc1skaV1bJ3N0cmVhbWFibGUnXSA9IChzdHJpbmcpICR0cmFja3MtPnN0cmVhbWFibGU7DQoJCQkJCQkkdG9wVHJhY2tzWyRpXVsndXJsJ10gPSAoc3RyaW5nKSAkdHJhY2tzLT51cmw7DQoJCQkJCQkkdG9wVHJhY2tzWyRpXVsnaW1hZ2UnXVsnc21hbGwnXSA9IChzdHJpbmcpICR0cmFja3MtPmltYWdlWzBdOw0KCQkJCQkJJHRvcFRyYWNrc1skaV1bJ2ltYWdlJ11bJ21lZGl1bSddID0gKHN0cmluZykgJHRyYWNrcy0+aW1hZ2VbMV07DQoJCQkJCQkkdG9wVHJhY2tzWyRpXVsnaW1hZ2UnXVsnbGFyZ2UnXSA9IChzdHJpbmcpICR0cmFja3MtPmltYWdlWzJdOw0KCQkJCQkJJGkrKzsNCgkJCQkJfQ0KCQkJCQkNCgkJCQkJcmV0dXJuICR0b3BUcmFja3M7DQoJCQkJfQ0KCQkJCWVsc2Ugew0KCQkJCQkvLyBObyB0YWdzYXJlIGZvdW5kDQoJCQkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MCwgJ0FydGlzdCBoYXMgbm8gdG9wIHRyYWNrcycpOw0KCQkJCQlyZXR1cm4gRkFMU0U7DQoJCQkJfQ0KCQkJfQ0KCQkJZWxzZSB7DQoJCQkJcmV0dXJuIEZBTFNFOw0KCQkJfQ0KCQl9DQoJCWVsc2Ugew0KCQkJLy8gR2l2ZSBhIDkxIGVycm9yIGlmIGluY29ycmVjdCB2YXJpYWJsZXMgYXJlIHVzZWQNCgkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MSwgJ1lvdSBtdXN0IGluY2x1ZGUgYXJ0aXN0IHZhcmlhbGJlIGluIHRoZSBjYWxsIGZvciB0aGlzIG1ldGhvZCcpOw0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoJfQ0KCQ0KCS8qKg0KCSAqIFJlbW92ZSBhIHVzZXIncyB0YWcgZnJvbSBhbiBhcnRpc3QuIChSZXF1aXJlcyBmdWxsIGF1dGgpDQoJICogQHBhcmFtIGFycmF5ICRtZXRob2RWYXJzIEFuIGFycmF5IHdpdGggdGhlIGZvbGxvd2luZyByZXF1aXJlZCB2YWx1ZXM6IDxpPmFydGlzdDwvaT4sIDxpPnRhZzwvaT4NCgkgKiBAcmV0dXJuIGJvb2xlYW4NCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlVGFnKCRtZXRob2RWYXJzKSB7DQoJCS8vIE9ubHkgYWxsb3cgZnVsbCBhdXRoZWQgY2FsbHMNCgkJaWYgKCAkdGhpcy0+ZnVsbEF1dGggPT0gVFJVRSApIHsNCgkJCS8vIENoZWNrIGZvciByZXF1aXJlZCB2YXJpYWJsZXMNCgkJCWlmICggIWVtcHR5KCRtZXRob2RWYXJzWydhcnRpc3QnXSkgJiYgIWVtcHR5KCRtZXRob2RWYXJzWyd0YWcnXSkgKSB7DQoJCQkJJHZhcnMgPSBhcnJheSgNCgkJCQkJJ21ldGhvZCcgPT4gJ2FydGlzdC5yZW1vdmV0YWcnLA0KCQkJCQknYXBpX2tleScgPT4gJHRoaXMtPmF1dGgtPmFwaUtleSwNCgkJCQkJJ3NrJyA9PiAkdGhpcy0+YXV0aC0+c2Vzc2lvbktleQ0KCQkJCSk7DQoJCQkJJHZhcnMgPSBhcnJheV9tZXJnZSgkdmFycywgJG1ldGhvZFZhcnMpOw0KCQkJCSRzaWcgPSAkdGhpcy0+YXBpU2lnKCR0aGlzLT5hdXRoLT5zZWNyZXQsICR2YXJzKTsNCgkJCQkkdmFyc1snYXBpX3NpZyddID0gJHNpZzsNCgkJCQkNCgkJCQlpZiAoICRjYWxsID0gJHRoaXMtPmFwaVBvc3RDYWxsKCR2YXJzKSApIHsNCgkJCQkJcmV0dXJuIFRSVUU7DQoJCQkJfQ0KCQkJCWVsc2Ugew0KCQkJCQlyZXR1cm4gRkFMU0U7DQoJCQkJfQ0KCQkJfQ0KCQkJZWxzZSB7DQoJCQkJLy8gR2l2ZSBhIDkxIGVycm9yIGlmIGluY29ycmVjdCB2YXJpYWJsZXMgYXJlIHVzZWQNCgkJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTEsICdZb3UgbXVzdCBpbmNsdWRlIGFydGlzdCBhbmQgdGFnIHZhcmlhbGJlcyBpbiB0aGUgY2FsbCBmb3IgdGhpcyBtZXRob2QnKTsNCgkJCQlyZXR1cm4gRkFMU0U7DQoJCQl9DQoJCX0NCgkJZWxzZSB7DQoJCQkvLyBHaXZlIGEgOTIgZXJyb3IgaWYgbm90IGZ1bGx5IGF1dGhlZA0KCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkyLCAnTWV0aG9kIHJlcXVpcmVzIGZ1bGwgYXV0aC4gQ2FsbCBhdXRoLmdldFNlc3Npb24gdXNpbmcgbGFzdGZtQXBpQXV0aCBjbGFzcycpOw0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoJfQ0KCQ0KCS8qKg0KCSAqIFNlYXJjaCBmb3IgYW4gYXJ0aXN0IGJ5IG5hbWUuIFJldHVybnMgYXJ0aXN0IG1hdGNoZXMgc29ydGVkIGJ5IHJlbGV2YW5jZQ0KCSAqIEBwYXJhbSBhcnJheSAkbWV0aG9kVmFycyBBbiBhcnJheSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVxdWlyZWQgdmFsdWU6IDxpPmFydGlzdDwvaT4gYW5kIG9wdGlvbmFsIHZhbHVlczogPGk+bGltaXRlPC9pPiwgPGk+cGFnZTwvaT4NCgkgKiBAcmV0dXJuIGFycmF5DQoJICovDQoJcHVibGljIGZ1bmN0aW9uIHNlYXJjaCgkbWV0aG9kVmFycykgew0KCQkvLyBDaGVjayBmb3IgcmVxdWlyZWQgdmFyaWFibGVzDQoJCWlmICggIWVtcHR5KCRtZXRob2RWYXJzWydhcnRpc3QnXSkgKSB7DQoJCQkkdmFycyA9IGFycmF5KA0KCQkJCSdtZXRob2QnID0+ICdhcnRpc3Quc2VhcmNoJywNCgkJCQknYXBpX2tleScgPT4gJHRoaXMtPmF1dGgtPmFwaUtleQ0KCQkJKTsNCgkJCSR2YXJzID0gYXJyYXlfbWVyZ2UoJHZhcnMsICRtZXRob2RWYXJzKTsNCgkJCQ0KCQkJaWYgKCAkY2FsbCA9ICR0aGlzLT5hcGlHZXRDYWxsKCR2YXJzKSApIHsNCgkJCQkkb3BlbnNlYXJjaCA9ICRjYWxsLT5yZXN1bHRzLT5jaGlsZHJlbignaHR0cDovL2E5LmNvbS8tL3NwZWMvb3BlbnNlYXJjaC8xLjEvJyk7DQoJCQkJaWYgKCAkb3BlbnNlYXJjaC0+dG90YWxSZXN1bHRzID4gMCApIHsNCgkJCQkJJHNlYXJjaFJlc3VsdHNbJ3RvdGFsUmVzdWx0cyddID0gKHN0cmluZykgJG9wZW5zZWFyY2gtPnRvdGFsUmVzdWx0czsNCgkJCQkJJHNlYXJjaFJlc3VsdHNbJ3N0YXJ0SW5kZXgnXSA9IChzdHJpbmcpICRvcGVuc2VhcmNoLT5zdGFydEluZGV4Ow0KCQkJCQkkc2VhcmNoUmVzdWx0c1snaXRlbXNQZXJQYWdlJ10gPSAoc3RyaW5nKSAkb3BlbnNlYXJjaC0+aXRlbXNQZXJQYWdlOw0KCQkJCQkkaSA9IDA7DQoJCQkJCWZvcmVhY2ggKCAkY2FsbC0+cmVzdWx0cy0+YXJ0aXN0bWF0Y2hlcy0+YXJ0aXN0IGFzICRhcnRpc3QgKSB7DQoJCQkJCQkkc2VhcmNoUmVzdWx0c1sncmVzdWx0cyddWyRpXVsnbmFtZSddID0gKHN0cmluZykgJGFydGlzdC0+bmFtZTsNCgkJCQkJCSRzZWFyY2hSZXN1bHRzWydyZXN1bHRzJ11bJGldWydtYmlkJ10gPSAoc3RyaW5nKSAkYXJ0aXN0LT5tYmlkOw0KCQkJCQkJJHNlYXJjaFJlc3VsdHNbJ3Jlc3VsdHMnXVskaV1bJ3VybCddID0gKHN0cmluZykgJGFydGlzdC0+dXJsOw0KCQkJCQkJJHNlYXJjaFJlc3VsdHNbJ3Jlc3VsdHMnXVskaV1bJ3N0cmVhbWFibGUnXSA9IChzdHJpbmcpICRhcnRpc3QtPnN0cmVhbWFibGU7DQoJCQkJCQkkc2VhcmNoUmVzdWx0c1sncmVzdWx0cyddWyRpXVsnaW1hZ2UnXVsnc21hbGwnXSA9IChzdHJpbmcpICRhcnRpc3QtPmltYWdlX3NtYWxsOw0KCQkJCQkJJHNlYXJjaFJlc3VsdHNbJ3Jlc3VsdHMnXVskaV1bJ2ltYWdlJ11bJ2xhcmdlJ10gPSAoc3RyaW5nKSAkYXJ0aXN0LT5pbWFnZTsNCgkJCQkJCSRpKys7DQoJCQkJCX0NCgkJCQkJDQoJCQkJCXJldHVybiAkc2VhcmNoUmVzdWx0czsNCgkJCQl9DQoJCQkJZWxzZSB7DQoJCQkJCS8vIE5vIHRhZ3NhcmUgZm91bmQNCgkJCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkwLCAnTm8gcmVzdWx0cycpOw0KCQkJCQlyZXR1cm4gRkFMU0U7DQoJCQkJfQ0KCQkJfQ0KCQkJZWxzZSB7DQoJCQkJcmV0dXJuIEZBTFNFOw0KCQkJfQ0KCQl9DQoJCWVsc2Ugew0KCQkJLy8gR2l2ZSBhIDkxIGVycm9yIGlmIGluY29ycmVjdCB2YXJpYWJsZXMgYXJlIHVzZWQNCgkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MSwgJ1lvdSBtdXN0IGluY2x1ZGUgYXJ0aXN0IHZhcmlhbGJlIGluIHRoZSBjYWxsIGZvciB0aGlzIG1ldGhvZCcpOw0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoJfQ0KCQ0KCS8qKg0KCSAqIFNoYXJlIGFuIGFydGlzdCB3aXRoIExhc3QuZm0gdXNlcnMgb3Igb3RoZXIgZnJpZW5kcy4gKFJlcXVpcmVzIGZ1bGwgYXV0aCkNCgkgKiBAcGFyYW0gYXJyYXkgJG1ldGhvZFZhcnMgQW4gYXJyYXkgd2l0aCB0aGUgZm9sbG93aW5nIHJlcXVpcmVkIHZhbHVlczogPGk+YXJ0aXN0PC9pPiwgPGk+cmVjaXBpZW50PC9pPiBhbmQgb3B0aW9uYWwgdmFsdWVzOiA8aT5tZXNzYWdlPC9pPg0KCSAqIEByZXR1cm4gYm9vbGVhbg0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBzaGFyZSgkbWV0aG9kVmFycykgew0KCQkvLyBPbmx5IGFsbG93IGZ1bGwgYXV0aGVkIGNhbGxzDQoJCWlmICggJHRoaXMtPmZ1bGxBdXRoID09IFRSVUUgKSB7DQoJCQkvLyBDaGVjayBmb3IgcmVxdWlyZWQgdmFyaWFibGVzDQoJCQlpZiAoICFlbXB0eSgkbWV0aG9kVmFyc1snYXJ0aXN0J10pICYmICFlbXB0eSgkbWV0aG9kVmFyc1sncmVjaXBpZW50J10pICkgew0KCQkJCSR2YXJzID0gYXJyYXkoDQoJCQkJCSdtZXRob2QnID0+ICdhcnRpc3Quc2hhcmUnLA0KCQkJCQknYXBpX2tleScgPT4gJHRoaXMtPmF1dGgtPmFwaUtleSwNCgkJCQkJJ3NrJyA9PiAkdGhpcy0+YXV0aC0+c2Vzc2lvbktleQ0KCQkJCSk7DQoJCQkJJHZhcnMgPSBhcnJheV9tZXJnZSgkdmFycywgJG1ldGhvZFZhcnMpOw0KCQkJCSRzaWcgPSAkdGhpcy0+YXBpU2lnKCR0aGlzLT5hdXRoLT5zZWNyZXQsICR2YXJzKTsNCgkJCQkkdmFyc1snYXBpX3NpZyddID0gJHNpZzsNCgkJCQkNCgkJCQlpZiAoICRjYWxsID0gJHRoaXMtPmFwaVBvc3RDYWxsKCR2YXJzKSApIHsNCgkJCQkJcmV0dXJuIFRSVUU7DQoJCQkJfQ0KCQkJCWVsc2Ugew0KCQkJCQlyZXR1cm4gRkFMU0U7DQoJCQkJfQ0KCQkJfQ0KCQkJZWxzZSB7DQoJCQkJLy8gR2l2ZSBhIDkxIGVycm9yIGlmIGluY29ycmVjdCB2YXJpYWJsZXMgYXJlIHVzZWQNCgkJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTEsICdZb3UgbXVzdCBpbmNsdWRlIGFydGlzdCBhbmQgcmVjaXBpZW50IHZhcmlhbGJlcyBpbiB0aGUgY2FsbCBmb3IgdGhpcyBtZXRob2QnKTsNCgkJCQlyZXR1cm4gRkFMU0U7DQoJCQl9DQoJCX0NCgkJZWxzZSB7DQoJCQkvLyBHaXZlIGEgOTIgZXJyb3IgaWYgbm90IGZ1bGx5IGF1dGhlZA0KCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkyLCAnTWV0aG9kIHJlcXVpcmVzIGZ1bGwgYXV0aC4gQ2FsbCBhdXRoLmdldFNlc3Npb24gdXNpbmcgbGFzdGZtQXBpQXV0aCBjbGFzcycpOw0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoJfQ0KCQ0KCS8qKg0KCSAqIFNob3V0IGluIHRoaXMgYXJ0aXN0J3Mgc2hvdXRib3gNCgkgKiBAcGFyYW0gYXJyYXkgJG1ldGhvZFZhcnMgQW4gYXJyYXkgd2l0aCB0aGUgZm9sbG93aW5nIHJlcXVpcmVkIHZhbHVlczogPGk+YXJ0aXN0PC9pPiwgPGk+bWVzc2FnZTwvaT4NCgkgKiBAcmV0dXJuIGJvb2xlYW4NCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gc2hvdXQoJG1ldGhvZFZhcnMpIHsNCgkJLy8gT25seSBhbGxvdyBmdWxsIGF1dGhlZCBjYWxscw0KCQlpZiAoICR0aGlzLT5mdWxsQXV0aCA9PSBUUlVFICkgew0KCQkJLy8gQ2hlY2sgZm9yIHJlcXVpcmVkIHZhcmlhYmxlcw0KCQkJaWYgKCAhZW1wdHkoJG1ldGhvZFZhcnNbJ2FydGlzdCddKSAmJiAhZW1wdHkoJG1ldGhvZFZhcnNbJ21lc3NhZ2UnXSkgKSB7DQoJCQkJJHZhcnMgPSBhcnJheSgNCgkJCQkJJ21ldGhvZCcgPT4gJ2FydGlzdC5zaG91dCcsDQoJCQkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXV0aC0+YXBpS2V5LA0KCQkJCQknc2snID0+ICR0aGlzLT5hdXRoLT5zZXNzaW9uS2V5DQoJCQkJKTsNCgkJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkJJHNpZyA9ICR0aGlzLT5hcGlTaWcoJHRoaXMtPmF1dGgtPnNlY3JldCwgJHZhcnMpOw0KCQkJCSR2YXJzWydhcGlfc2lnJ10gPSAkc2lnOw0KCQkJCQ0KCQkJCWlmICggJGNhbGwgPSAkdGhpcy0+YXBpUG9zdENhbGwoJHZhcnMpICkgew0KCQkJCQlyZXR1cm4gVFJVRTsNCgkJCQl9DQoJCQkJZWxzZSB7DQoJCQkJCXJldHVybiBGQUxTRTsNCgkJCQl9DQoJCQl9DQoJCQllbHNlIHsNCgkJCQkvLyBHaXZlIGEgOTEgZXJyb3IgaWYgaW5jb3JyZWN0IHZhcmlhYmxlcyBhcmUgdXNlZA0KCQkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MSwgJ1lvdSBtdXN0IGluY2x1ZGUgYXJ0aXN0IGFuZCBtZXNzYWdlIHZhcmlhYmxlcyBpbiB0aGUgY2FsbCBmb3IgdGhpcyBtZXRob2QnKTsNCgkJCQlyZXR1cm4gRkFMU0U7DQoJCQl9DQoJCX0NCgkJZWxzZSB7DQoJCQkvLyBHaXZlIGEgOTIgZXJyb3IgaWYgbm90IGZ1bGx5IGF1dGhlZA0KCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkyLCAnTWV0aG9kIHJlcXVpcmVzIGZ1bGwgYXV0aC4gQ2FsbCBhdXRoLmdldFNlc3Npb24gdXNpbmcgbGFzdGZtQXBpQXV0aCBjbGFzcycpOw0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoJfQ0KfQ0KDQo/Pg==]]></data>
	</file>
	<file>
	  <filename>/lib/lastfmapi/api/auth.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogRmlsZSB0aGF0IHN0b3JlcyBhcGkgY2FsbHMgZm9yIGdldHRpbmcgYXV0aGVudGljYXRpb24gdmFsdWVzDQogKiBAcGFja2FnZSBhcGljYWxscw0KICovDQovKioNCiAqIEFsbG93cyBhY2Nlc3MgdG8gdGhlIGFwaSByZXF1ZXN0cyByZWxhdGluZyB0byBhdXRoZW50aWNhdGlvbg0KICogQHBhY2thZ2UgYXBpY2FsbHMNCiAqLw0KY2xhc3MgbGFzdGZtQXBpQXV0aCBleHRlbmRzIGxhc3RmbUFwaSB7DQoJLyoqDQoJICogU3RvcmVzIHRoZSBhcGkga2V5DQoJICogQGFjY2VzcyBwdWJsaWMNCgkgKiBAdmFyIHN0cmluZw0KCSAqLw0KCXB1YmxpYyAkYXBpS2V5Ow0KCS8qKg0KCSAqIFN0b3JlcyB0aGUgc2VjcmV0DQoJICogQGFjY2VzcyBwdWJsaWMNCgkgKiBAdmFyIHN0cmluZw0KCSAqLw0KCXB1YmxpYyAkc2VjcmV0Ow0KCS8qKg0KCSAqIFN0b3JlcyB0aGUgYXV0aGVudGljYXRlZCB1c2VybmFtZQ0KCSAqIEBhY2Nlc3MgcHVibGljDQoJICogQHZhciBzdHJpbmcNCgkgKi8NCglwdWJsaWMgJHVzZXJuYW1lOw0KCS8qKg0KCSAqIFN0b3JlcyB0aGUgc2Vzc2lvbiBrZXkNCgkgKiBAYWNjZXNzIHB1YmxpYw0KCSAqIEB2YXIgc3RyaW5nDQoJICovDQoJcHVibGljICRzZXNzaW9uS2V5Ow0KCS8qKg0KCSAqIFN0b3JlcyB0aGUgdXNlcnMgc3Vic2NyaWJlciBzdGF0dXMNCgkgKiBAYWNjZXNzIHB1YmxpYw0KCSAqIEB2YXIgYm9vbGVhbg0KCSAqLw0KCXB1YmxpYyAkc3Vic2NyaWJlcjsNCgkNCgkvKioNCgkgKiBTdG9yZXMgdGhlIGF1dGhlbnRpY2F0aW9uIHRva2VuDQoJICogQGFjY2VzcyBwcml2YXRlDQoJICogQHZhciBzdHJpbmcNCgkgKi8NCglwcml2YXRlICR0b2tlbjsNCgkNCgkvKioNCgkgKiBSdW4gd2hlbiB0aGUgY2xhc3MgaXMgY3JlYXRlZA0KCSAqIEBwYXJhbSBzdHJpbmcgJG1ldGhvZCA8aT5nZXRzZXNzaW9uPC9pPiB0byBnZXQgYSBuZXcgc2Vzc2lvbiwgPGk+c2V0c2Vzc2lvbjwvaT4gdG8gc2V0IGEgY3VycmVudCBzZXNzaW9uDQoJICogQHBhcmFtIGFycmF5ICR2YXJzIEFuIGFycmF5IG9mIHZhcmlhYmxlcyB0byBwYXNzIHRvIHRoZSBjbGFzcw0KCSAqIEByZXR1cm4gdm9pZA0KCSAqIEBhY2Nlc3MgcHVibGljDQoJICovDQoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRtZXRob2QsICR2YXJzKSB7DQoJCWlmICggJG1ldGhvZCA9PSAnZ2V0c2Vzc2lvbicgKSB7DQoJCQlpZiAoICFlbXB0eSgkdmFyc1snYXBpS2V5J10pICYmICFlbXB0eSgkdmFyc1snc2VjcmV0J10pICYmICFlbXB0eSgkdmFyc1sndG9rZW4nXSkgKSB7DQoJCQkJJHRoaXMtPmFwaUtleSA9ICR2YXJzWydhcGlLZXknXTsNCgkJCQkkdGhpcy0+c2VjcmV0ID0gJHZhcnNbJ3NlY3JldCddOw0KCQkJCSR0aGlzLT50b2tlbiA9ICR2YXJzWyd0b2tlbiddOw0KCQkJCSR0aGlzLT5nZXRTZXNzaW9uKCk7DQoJCQl9DQoJCQllbHNlIHsNCgkJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTEsICdNdXN0IHNlbmQgYW4gYXBpS2V5LCB0b2tlbiBhbmQgYSBzZWNyZXQgaW4gdGhlIGNhbGwgZm9yIGdldHNlc3Npb24nKTsNCgkJCQlyZXR1cm4gRkFMU0U7DQoJCQl9DQoJCX0NCgkJZWxzZWlmICggJG1ldGhvZCA9PSAnc2V0c2Vzc2lvbicgKSB7DQoJCQlpZiAoICFlbXB0eSgkdmFyc1snYXBpS2V5J10pICkgew0KCQkJCSR0aGlzLT5hcGlLZXkgPSAkdmFyc1snYXBpS2V5J107DQoJCQkJaWYgKCAhZW1wdHkoJHZhcnNbJ3NlY3JldCddKSAmJiAhZW1wdHkoJHZhcnNbJ3VzZXJuYW1lJ10pICYmICFlbXB0eSgkdmFyc1snc2Vzc2lvbktleSddKSAmJiBpc3NldCgkdmFyc1snc3Vic2NyaWJlciddKSApIHsNCgkJCQkJJHRoaXMtPnNlY3JldCA9ICR2YXJzWydzZWNyZXQnXTsNCgkJCQkJJHRoaXMtPnVzZXJuYW1lID0gJHZhcnNbJ3VzZXJuYW1lJ107DQoJCQkJCSR0aGlzLT5zZXNzaW9uS2V5ID0gJHZhcnNbJ3Nlc3Npb25LZXknXTsNCgkJCQkJJHRoaXMtPnN1YnNjcmliZXIgPSAkdmFyc1snc3Vic2NyaWJlciddOw0KCQkJCX0NCgkJCX0NCgkJCWVsc2Ugew0KCQkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MSwgJ011c3Qgc2VuZCBhbiBhcGlLZXksIHNlY3JldCwgdXNlcm5hbW5lLCBzdWJjcmliZXIgYW5kIHNlc3Npb25LZXkgaW4gdGhlIGNhbGwgZm9yIHNldHNlc3Npb24nKTsNCgkJCQlyZXR1cm4gRkFMU0U7DQoJCQl9DQoJCX0NCgkJZWxzZSB7DQoJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTEsICdJbmNvcnJlY3QgdXNlIG9mIG1ldGhvZCB2YXJpYWJsZSAoImdldHNlc3Npb24iIG9yICJzZXRzZXNzaW9uIiknKTsNCgkJCXJldHVybiBGQUxTRTsNCgkJfQ0KCX0NCgkNCgkvKioNCgkgKiBJbnRlcm5hbCBtZXRob2QgdXNlcyB0byBnZXQgYSBuZXcgc2Vzc2lvbiB2aWEgYW4gYXBpIGNhbGwNCgkgKiBAcmV0dXJuIHZvaWQNCgkgKiBAYWNjZXNzIHByaXZhdGUNCgkgKi8NCglwcml2YXRlIGZ1bmN0aW9uIGdldFNlc3Npb24oKSB7DQoJCSR2YXJzID0gYXJyYXkoDQoJCQknbWV0aG9kJyA9PiAnYXV0aC5nZXRzZXNzaW9uJywNCgkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXBpS2V5LA0KCQkJJ3Rva2VuJyA9PiAkdGhpcy0+dG9rZW4NCgkJKTsNCgkJJHNpZyA9ICR0aGlzLT5hcGlTaWcoJHRoaXMtPnNlY3JldCwgJHZhcnMpOw0KCQkkdmFyc1snYXBpX3NpZyddID0gJHNpZzsNCgkJDQoJCWlmICggJGNhbGwgPSAkdGhpcy0+YXBpR2V0Q2FsbCgkdmFycykgKSB7DQoJCQkkdGhpcy0+dXNlcm5hbWUgPSAoc3RyaW5nKSAkY2FsbC0+c2Vzc2lvbi0+bmFtZTsNCgkJCSR0aGlzLT5zZXNzaW9uS2V5ID0gKHN0cmluZykgJGNhbGwtPnNlc3Npb24tPmtleTsNCgkJCSR0aGlzLT5zdWJzY3JpYmVyID0gKHN0cmluZykgJGNhbGwtPnNlc3Npb24tPnN1YnNjcmliZXI7DQoJCX0NCgkJZWxzZSB7DQoJCQlyZXR1cm4gRkFMU0U7DQoJCX0NCgl9DQp9DQoNCj8+]]></data>
	</file>
	<file>
	  <filename>/lib/lastfmapi/api/event.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogRmlsZSB0aGF0IHN0b3JlcyBhcGkgY2FsbHMgZm9yIGV2ZW50IGFwaSBjYWxscw0KICogQHBhY2thZ2UgYXBpY2FsbHMNCiAqLw0KLyoqDQogKiBBbGxvd3MgYWNjZXNzIHRvIHRoZSBhcGkgcmVxdWVzdHMgcmVsYXRpbmcgdG8gZXZlbnRzDQogKiBAcGFja2FnZSBhcGljYWxscw0KICovDQpjbGFzcyBsYXN0Zm1BcGlFdmVudCBleHRlbmRzIGxhc3RmbUFwaSB7DQoJLyoqDQoJICogU3RvcmVzIHRoZSBjb25maWcgdmFsdWVzIHNldCBpbiB0aGUgY2FsbA0KCSAqIEBhY2Nlc3MgcHVibGljDQoJICogQHZhciBhcnJheQ0KCSAqLw0KCXB1YmxpYyAkY29uZmlnOw0KCS8qKg0KCSAqIFN0b3JlcyB0aGUgYXV0aCB2YXJpYWJsZXMgdXNlZCBpbiBhbGwgYXBpIGNhbGxzDQoJICogQGFjY2VzcyBwcml2YXRlDQoJICogQHZhciBhcnJheQ0KCSAqLw0KCXByaXZhdGUgJGF1dGg7DQoJLyoqDQoJICogU3RhdGVzIGlmIHRoZSB1c2VyIGhhcyBmdWxsIGF1dGhlbnRpY2F0aW9uIHRvIHVzZSBhcGkgcmVxdWVzdHMgdGhhdCBtb2RpZnkgZGF0YQ0KCSAqIEBhY2Nlc3MgcHJpdmF0ZQ0KCSAqIEB2YXIgYm9vbGVhbg0KCSAqLw0KCXByaXZhdGUgJGZ1bGxBdXRoOw0KCQ0KCS8qKg0KCSAqIEBwYXJhbSBhcnJheSAkYXV0aCBQYXNzZXMgdGhlIGF1dGhlbnRpY2F0aW9uIHZhcmlhYmxlcw0KCSAqIEBwYXJhbSBhcnJheSAkZnVsbEF1dGggQSBib29sZWFuIHZhbHVlIHN0YXRpbmcgaWYgdGhlIHVzZXIgaGFzIGZ1bGwgYXV0aGVudGljYXRpb24gb3Igbm90DQoJICogQHBhcmFtIGFycmF5ICRjb25maWcgQW4gYXJyYXkgb2YgY29uZmlnIHZhcmlhYmxlcyByZWxhdGVkIHRvIGNhY2hpbmcgYW5kIG90aGVyIGZlYXR1cmVzDQoJICovDQoJZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGF1dGgsICRmdWxsQXV0aCwgJGNvbmZpZykgew0KCQkkdGhpcy0+YXV0aCA9ICRhdXRoOw0KCQkkdGhpcy0+ZnVsbEF1dGggPSAkZnVsbEF1dGg7DQoJCSR0aGlzLT5jb25maWcgPSAkY29uZmlnOw0KCX0NCgkNCgkvKioNCgkgKiBTZXQgYSB1c2VyJ3MgYXR0ZW5kYW5jZSBzdGF0dXMgZm9yIGFuIGV2ZW50LiAoUmVxdWlyZXMgZnVsbCBhdXRoKQ0KCSAqIEBwYXJhbSBhcnJheSAkbWV0aG9kVmFycyBBbiBhcnJheSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVxdWlyZWQgdmFsdWVzOiA8aT5ldmVudElkPC9pPiwgPGk+c3RhdHVzICgwPUF0dGVuZGluZywgMT1NYXliZSBhdHRlbmRpbmcsIDI9Tm90IGF0dGVuZGluZyk8L2k+IA0KCSAqIEByZXR1cm4gYm9vbGVhbg0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBhdHRlbmQoJG1ldGhvZFZhcnMpIHsNCgkJLy8gT25seSBhbGxvdyBmdWxsIGF1dGhlZCBjYWxscw0KCQlpZiAoICR0aGlzLT5mdWxsQXV0aCA9PSBUUlVFICkgew0KCQkJLy8gQ2hlY2sgZm9yIHJlcXVpcmVkIHZhcmlhYmxlcw0KCQkJaWYgKCAhZW1wdHkoJG1ldGhvZFZhcnNbJ2V2ZW50J10pICYmICFlbXB0eSgkbWV0aG9kVmFyc1snc3RhdHVzJ10pICkgew0KCQkJCSR2YXJzID0gYXJyYXkoDQoJCQkJCSdtZXRob2QnID0+ICdldmVudC5hdHRlbmQnLA0KCQkJCQknYXBpX2tleScgPT4gJHRoaXMtPmF1dGgtPmFwaUtleSwNCgkJCQkJJ3NrJyA9PiAkdGhpcy0+YXV0aC0+c2Vzc2lvbktleQ0KCQkJCSk7DQoJCQkJJHZhcnMgPSBhcnJheV9tZXJnZSgkdmFycywgJG1ldGhvZFZhcnMpOw0KCQkJCSRzaWcgPSAkdGhpcy0+YXBpU2lnKCR0aGlzLT5hdXRoLT5zZWNyZXQsICR2YXJzKTsNCgkJCQkkdmFyc1snYXBpX3NpZyddID0gJHNpZzsNCgkJCQkNCgkJCQlpZiAoICRjYWxsID0gJHRoaXMtPmFwaVBvc3RDYWxsKCR2YXJzKSApIHsNCgkJCQkJcmV0dXJuIFRSVUU7DQoJCQkJfQ0KCQkJCWVsc2Ugew0KCQkJCQlyZXR1cm4gRkFMU0U7DQoJCQkJfQ0KCQkJfQ0KCQkJZWxzZSB7DQoJCQkJLy8gR2l2ZSBhIDkxIGVycm9yIGlmIGluY29ycmVjdCB2YXJpYWJsZXMgYXJlIHVzZWQNCgkJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTEsICdZb3UgbXVzdCBpbmNsdWRlIGV2ZW50SWQgYW5kIHN0YXR1cyB2YXJpYWxiZXMgaW4gdGhlIGNhbGwgZm9yIHRoaXMgbWV0aG9kJyk7DQoJCQkJcmV0dXJuIEZBTFNFOw0KCQkJfQ0KCQl9DQoJCWVsc2Ugew0KCQkJLy8gR2l2ZSBhIDkyIGVycm9yIGlmIG5vdCBmdWxseSBhdXRoZWQNCgkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MiwgJ01ldGhvZCByZXF1aXJlcyBmdWxsIGF1dGguIENhbGwgYXV0aC5nZXRTZXNzaW9uIHVzaW5nIGxhc3RmbUFwaUF1dGggY2xhc3MnKTsNCgkJCXJldHVybiBGQUxTRTsNCgkJfQ0KCX0NCgkNCgkvKioNCgkgKiBHZXQgYSBsaXN0IG9mIGF0dGVuZGVlcyBmb3IgYW4gZXZlbnQNCgkgKiBAcGFyYW0gYXJyYXkgJG1ldGhvZFZhcnMgQW4gYXJyYXkgd2l0aCB0aGUgZm9sbG93aW5nIHJlcXVpcmVkIHZhbHVlczogPGk+ZXZlbnRJZDwvaT4NCgkgKiBAcmV0dXJuIGFycmF5DQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGdldEF0dGVuZGVlcygkbWV0aG9kVmFycykgew0KCQkvLyBDaGVjayBmb3IgcmVxdWlyZWQgdmFyaWFibGVzDQoJCWlmICggIWVtcHR5KCRtZXRob2RWYXJzWydldmVudCddKSApIHsNCgkJCSR2YXJzID0gYXJyYXkoDQoJCQkJJ21ldGhvZCcgPT4gJ2V2ZW50LmdldGF0dGVuZGVlcycsDQoJCQkJJ2FwaV9rZXknID0+ICR0aGlzLT5hdXRoLT5hcGlLZXkNCgkJCSk7DQoJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkNCgkJCWlmICggJGNhbGwgPSAkdGhpcy0+YXBpR2V0Q2FsbCgkdmFycykgKSB7DQoJCQkJJGF0dGVuZGVlc1snaWQnXSA9IChzdHJpbmcpICRjYWxsLT5hdHRlbmRlZXNbJ2V2ZW50J107DQoJCQkJJGF0dGVuZGVlc1sndG90YWwnXSA9IChzdHJpbmcpICRjYWxsLT5hdHRlbmRlZXNbJ3RvdGFsJ107DQoJCQkJJGkgPSAwOw0KCQkJCWZvcmVhY2ggKCAkY2FsbC0+YXR0ZW5kZWVzLT51c2VyIGFzICR1c2VyICkgew0KCQkJCQkkYXR0ZW5kZWVzWydhdHRlbmRlZXMnXVskaV1bJ25hbWUnXSA9IChzdHJpbmcpICR1c2VyLT5uYW1lOw0KCQkJCQkkYXR0ZW5kZWVzWydhdHRlbmRlZXMnXVskaV1bJ3JlYWxuYW1lJ10gPSAoc3RyaW5nKSAkdXNlci0+cmVhbG5hbWU7DQoJCQkJCSRhdHRlbmRlZXNbJ2F0dGVuZGVlcyddWyRpXVsnaW1hZ2VzJ11bJ3NtYWxsJ10gPSAoc3RyaW5nKSAkdXNlci0+aW1hZ2VbMF07DQoJCQkJCSRhdHRlbmRlZXNbJ2F0dGVuZGVlcyddWyRpXVsnaW1hZ2VzJ11bJ21lZGl1bSddID0gKHN0cmluZykgJHVzZXItPmltYWdlWzFdOw0KCQkJCQkkYXR0ZW5kZWVzWydhdHRlbmRlZXMnXVskaV1bJ2ltYWdlcyddWydsYXJnZSddID0gKHN0cmluZykgJHVzZXItPmltYWdlWzJdOw0KCQkJCQkkYXR0ZW5kZWVzWydhdHRlbmRlZXMnXVskaV1bJ3VybCddID0gKHN0cmluZykgJHVzZXItPnVybDsNCgkJCQkJJGkrKzsNCgkJCQl9DQoJCQkJDQoJCQkJcmV0dXJuICRhdHRlbmRlZXM7DQoJCQl9DQoJCQllbHNlIHsNCgkJCQlyZXR1cm4gRkFMU0U7DQoJCQl9DQoJCX0NCgkJZWxzZSB7DQoJCQkvLyBHaXZlIGEgOTEgZXJyb3IgaWYgaW5jb3JyZWN0IHZhcmlhYmxlcyBhcmUgdXNlZA0KCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkxLCAnWW91IG11c3QgaW5jbHVkZSBldmVudElkIGFuZCBzdGF0dXMgdmFyaWFsYmVzIGluIHRoZSBjYWxsIGZvciB0aGlzIG1ldGhvZCcpOw0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoJfQ0KCQ0KCS8qKg0KCSAqIEdldCB0aGUgbWV0YWRhdGEgZm9yIGFuIGV2ZW50IG9uIExhc3QuZm0uIEluY2x1ZGVzIGF0dGVuZGFuY2UgYW5kIGxpbmV1cCBpbmZvcm1hdGlvbg0KCSAqIEBwYXJhbSBhcnJheSAkbWV0aG9kVmFycyBBbiBhcnJheSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVxdWlyZWQgdmFsdWVzOiA8aT5ldmVudElkPC9pPg0KCSAqIEByZXR1cm4gYXJyYXkNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gZ2V0SW5mbygkbWV0aG9kVmFycykgew0KCQkvLyBDaGVjayBmb3IgcmVxdWlyZWQgdmFyaWFibGVzDQoJCWlmICggIWVtcHR5KCRtZXRob2RWYXJzWydldmVudCddKSApIHsNCgkJCSR2YXJzID0gYXJyYXkoDQoJCQkJJ21ldGhvZCcgPT4gJ2V2ZW50LmdldGluZm8nLA0KCQkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXV0aC0+YXBpS2V5DQoJCQkpOw0KCQkJJHZhcnMgPSBhcnJheV9tZXJnZSgkdmFycywgJG1ldGhvZFZhcnMpOw0KCQkJDQoJCQlpZiAoICRjYWxsID0gJHRoaXMtPmFwaUdldENhbGwoJHZhcnMpICkgew0KCQkJCSRpbmZvWydpZCddID0gKHN0cmluZykgJGNhbGwtPmV2ZW50LT5pZDsNCgkJCQkkaW5mb1sndGl0bGUnXSA9IChzdHJpbmcpICRjYWxsLT5ldmVudC0+dGl0bGU7DQoJCQkJJGlpID0gMDsNCgkJCQlmb3JlYWNoICggJGNhbGwtPmV2ZW50LT5hcnRpc3RzLT5hcnRpc3QgYXMgJGFydGlzdCApIHsNCgkJCQkJJGluZm9bJ2FydGlzdHMnXVskaWldID0gKHN0cmluZykgJGFydGlzdDsNCgkJCQkJJGlpKys7DQoJCQkJfQ0KCQkJCSRpbmZvWydoZWFkbGluZXInXSA9IChzdHJpbmcpICRjYWxsLT5ldmVudC0+YXJ0aXN0cy0+aGVhZGxpbmVyOw0KCQkJCSRpbmZvWyd2ZW51ZSddWyduYW1lJ10gPSAoc3RyaW5nKSAkY2FsbC0+ZXZlbnQtPnZlbnVlLT5uYW1lOw0KCQkJCSRpbmZvWyd2ZW51ZSddWydsb2NhdGlvbiddWydjaXR5J10gPSAoc3RyaW5nKSAkY2FsbC0+ZXZlbnQtPnZlbnVlLT5sb2NhdGlvbi0+Y2l0eTsNCgkJCQkkaW5mb1sndmVudWUnXVsnbG9jYXRpb24nXVsnY291bnRyeSddID0gKHN0cmluZykgJGNhbGwtPmV2ZW50LT52ZW51ZS0+bG9jYXRpb24tPmNvdW50cnk7DQoJCQkJJGluZm9bJ3ZlbnVlJ11bJ2xvY2F0aW9uJ11bJ3N0cmVldCddID0gKHN0cmluZykgJGNhbGwtPmV2ZW50LT52ZW51ZS0+bG9jYXRpb24tPnN0cmVldDsNCgkJCQkkaW5mb1sndmVudWUnXVsnbG9jYXRpb24nXVsncG9zdGNvZGUnXSA9IChzdHJpbmcpICRjYWxsLT5ldmVudC0+dmVudWUtPmxvY2F0aW9uLT5wb3N0YWxjb2RlOw0KCQkJCSRnZW9wb2ludCA9ICAkY2FsbC0+ZXZlbnQtPnZlbnVlLT5sb2NhdGlvbi0+Y2hpbGRyZW4oJ2h0dHA6Ly93d3cudzMub3JnLzIwMDMvMDEvZ2VvL3dnczg0X3BvcyMnKTsNCgkJCQkkaW5mb1sndmVudWUnXVsnbG9jYXRpb24nXVsnZ2VvcG9pbnQnXVsnbGF0J10gPSAoc3RyaW5nKSAkZ2VvcG9pbnQtPnBvaW50LT5sYXQ7DQoJCQkJJGluZm9bJ3ZlbnVlJ11bJ2xvY2F0aW9uJ11bJ2dlb3BvaW50J11bJ2xvbmcnXSA9IChzdHJpbmcpICRnZW9wb2ludC0+cG9pbnQtPmxvbmc7DQoJCQkJJGluZm9bJ3ZlbnVlJ11bJ2xvY2F0aW9uJ11bJ3RpbWV6b25lJ10gPSAoc3RyaW5nKSAkY2FsbC0+ZXZlbnQtPnZlbnVlLT5sb2NhdGlvbi0+dGltZXpvbmU7DQoJCQkJJGluZm9bJ3ZlbnVlJ11bJ3VybCddID0gKHN0cmluZykgJGNhbGwtPnZlbnVlLT51cmw7DQoJCQkJJGluZm9bJ3N0YXJ0ZGF0ZSddID0gc3RydG90aW1lKHRyaW0oKHN0cmluZykgJGNhbGwtPmV2ZW50LT5zdGFydERhdGUpKTsNCgkJCQkkaW5mb1snZGVzY3JpcHRpb24nXSA9IChzdHJpbmcpICRjYWxsLT5ldmVudC0+ZGVzY3JpcHRpb247DQoJCQkJJGluZm9bJ2ltYWdlJ11bJ3NtYWxsJ10gPSAoc3RyaW5nKSAkY2FsbC0+ZXZlbnQtPmltYWdlWzBdOw0KCQkJCSRpbmZvWydpbWFnZSddWydtZWRpdW0nXSA9IChzdHJpbmcpICRjYWxsLT5ldmVudC0+aW1hZ2VbMV07DQoJCQkJJGluZm9bJ2ltYWdlJ11bJ2xhcmdlJ10gPSAoc3RyaW5nKSAkY2FsbC0+ZXZlbnQtPmltYWdlWzJdOw0KCQkJCSRpbmZvWydhdHRlbmRhbmNlJ10gPSAoc3RyaW5nKSAkY2FsbC0+ZXZlbnQtPmF0dGVuZGFuY2U7DQoJCQkJJGluZm9bJ3Jldmlld3MnXSA9IChzdHJpbmcpICRjYWxsLT5ldmVudC0+cmV2aWV3czsNCgkJCQkkaW5mb1sndGFnJ10gPSAoc3RyaW5nKSAkY2FsbC0+ZXZlbnQtPnRhZzsNCgkJCQkkaW5mb1sndXJsJ10gPSAoc3RyaW5nKSAkY2FsbC0+ZXZlbnQtPnVybDsNCgkJCQkNCgkJCQlyZXR1cm4gJGluZm87DQoJCQl9DQoJCQllbHNlIHsNCgkJCQlyZXR1cm4gRkFMU0U7DQoJCQl9DQoJCX0NCgkJZWxzZSB7DQoJCQkvLyBHaXZlIGEgOTEgZXJyb3IgaWYgaW5jb3JyZWN0IHZhcmlhYmxlcyBhcmUgdXNlZA0KCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkxLCAnWW91IG11c3QgaW5jbHVkZSBldmVudElkIGFuZCBzdGF0dXMgdmFyaWFsYmVzIGluIHRoZSBjYWxsIGZvciB0aGlzIG1ldGhvZCcpOw0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoJfQ0KCQ0KCS8qKg0KCSAqIEdldCBzaG91dHMgZm9yIHRoaXMgZXZlbnQNCgkgKiBAcGFyYW0gYXJyYXkgJG1ldGhvZFZhcnMgQW4gYXJyYXkgd2l0aCB0aGUgZm9sbG93aW5nIHJlcXVpcmVkIHZhbHVlczogPGk+ZXZlbnRJZDwvaT4NCgkgKiBAcmV0dXJuIGFycmF5DQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGdldFNob3V0cygkbWV0aG9kVmFycykgew0KCQkvLyBDaGVjayBmb3IgcmVxdWlyZWQgdmFyaWFibGVzDQoJCWlmICggIWVtcHR5KCRtZXRob2RWYXJzWydldmVudCddKSApIHsNCgkJCSR2YXJzID0gYXJyYXkoDQoJCQkJJ21ldGhvZCcgPT4gJ2V2ZW50LmdldHNob3V0cycsDQoJCQkJJ2FwaV9rZXknID0+ICR0aGlzLT5hdXRoLT5hcGlLZXkNCgkJCSk7DQoJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkNCgkJCWlmICggJGNhbGwgPSAkdGhpcy0+YXBpR2V0Q2FsbCgkdmFycykgKSB7DQoJCQkJJHNob3V0c1snaWQnXSA9IChzdHJpbmcpICRjYWxsLT5zaG91dHNbJ2V2ZW50J107DQoJCQkJJHNob3V0c1sndG90YWwnXSA9IChzdHJpbmcpICRjYWxsLT5zaG91dHNbJ3RvdGFsJ107DQoJCQkJJGkgPSAwOw0KCQkJCWZvcmVhY2ggKCAkY2FsbC0+c2hvdXRzLT5zaG91dCBhcyAkc2hvdXQgKSB7DQoJCQkJCSRzaG91dHNbJ3Nob3V0cyddWyRpXVsnYm9keSddID0gKHN0cmluZykgJHNob3V0LT5ib2R5Ow0KCQkJCQkkc2hvdXRzWydzaG91dHMnXVskaV1bJ2F1dGhvciddID0gKHN0cmluZykgJHNob3V0LT5hdXRob3I7DQoJCQkJCSRzaG91dHNbJ3Nob3V0cyddWyRpXVsnZGF0ZSddID0gc3RydG90aW1lKChzdHJpbmcpICRzaG91dC0+ZGF0ZSk7DQoJCQkJCSRpKys7DQoJCQkJfQ0KCQkJCQ0KCQkJCXJldHVybiAkc2hvdXRzOw0KCQkJfQ0KCQkJZWxzZSB7DQoJCQkJcmV0dXJuIEZBTFNFOw0KCQkJfQ0KCQl9DQoJCWVsc2Ugew0KCQkJLy8gR2l2ZSBhIDkxIGVycm9yIGlmIGluY29ycmVjdCB2YXJpYWJsZXMgYXJlIHVzZWQNCgkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MSwgJ1lvdSBtdXN0IGluY2x1ZGUgZXZlbnRJZCBhbmQgc3RhdHVzIHZhcmlhbGJlcyBpbiB0aGUgY2FsbCBmb3IgdGhpcyBtZXRob2QnKTsNCgkJCXJldHVybiBGQUxTRTsNCgkJfQ0KCX0NCgkNCgkvKioNCgkgKiBTaGFyZSBhbiBldmVudCB3aXRoIG9uZSBvciBtb3JlIExhc3QuZm0gdXNlcnMgb3Igb3RoZXIgZnJpZW5kcy4gKFJlcXVpcmVzIGZ1bGwgYXV0aCkNCgkgKiBAcGFyYW0gYXJyYXkgJG1ldGhvZFZhcnMgQW4gYXJyYXkgd2l0aCB0aGUgZm9sbG93aW5nIHJlcXVpcmVkIHZhbHVlczogPGk+ZXZlbnRJZDwvaT4sIDxpPnJlY2lwaWVudDwvaT4gYW5kIG9wdGlvbiB2YWx1ZTogPGk+bWVzc2FnZTwvaT4NCgkgKiBAcmV0dXJuIGJvb2xlYW4NCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gc2hhcmUoJG1ldGhvZFZhcnMpIHsNCgkJLy8gT25seSBhbGxvdyBmdWxsIGF1dGhlZCBjYWxscw0KCQlpZiAoICR0aGlzLT5mdWxsQXV0aCA9PSBUUlVFICkgew0KCQkJLy8gQ2hlY2sgZm9yIHJlcXVpcmVkIHZhcmlhYmxlcw0KCQkJaWYgKCAhZW1wdHkoJG1ldGhvZFZhcnNbJ2V2ZW50J10pICYmICFlbXB0eSgkbWV0aG9kVmFyc1sncmVjaXBpZW50J10pICkgew0KCQkJCSR2YXJzID0gYXJyYXkoDQoJCQkJCSdtZXRob2QnID0+ICdldmVudC5zaGFyZScsDQoJCQkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXV0aC0+YXBpS2V5LA0KCQkJCQknc2snID0+ICR0aGlzLT5hdXRoLT5zZXNzaW9uS2V5DQoJCQkJKTsNCgkJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkJJHNpZyA9ICR0aGlzLT5hcGlTaWcoJHRoaXMtPmF1dGgtPnNlY3JldCwgJHZhcnMpOw0KCQkJCSR2YXJzWydhcGlfc2lnJ10gPSAkc2lnOw0KCQkJCQ0KCQkJCWlmICggJGNhbGwgPSAkdGhpcy0+YXBpUG9zdENhbGwoJHZhcnMpICkgew0KCQkJCQlyZXR1cm4gVFJVRTsNCgkJCQl9DQoJCQkJZWxzZSB7DQoJCQkJCXJldHVybiBGQUxTRTsNCgkJCQl9DQoJCQl9DQoJCQllbHNlIHsNCgkJCQkvLyBHaXZlIGEgOTEgZXJyb3IgaWYgaW5jb3JyZWN0IHZhcmlhYmxlcyBhcmUgdXNlZA0KCQkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MSwgJ1lvdSBtdXN0IGluY2x1ZGUgZXZlbnRJZCBhbmQgcmVjaXBpZW50IHZhcmlhYmxlcyBpbiB0aGUgY2FsbCBmb3IgdGhpcyBtZXRob2QnKTsNCgkJCQlyZXR1cm4gRkFMU0U7DQoJCQl9DQoJCX0NCgkJZWxzZSB7DQoJCQkvLyBHaXZlIGEgOTIgZXJyb3IgaWYgbm90IGZ1bGx5IGF1dGhlZA0KCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkyLCAnTWV0aG9kIHJlcXVpcmVzIGZ1bGwgYXV0aC4gQ2FsbCBhdXRoLmdldFNlc3Npb24gdXNpbmcgbGFzdGZtQXBpQXV0aCBjbGFzcycpOw0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoJfQ0KCQ0KCS8qKg0KCSAqIFNob3V0IGluIHRoaXMgZXZlbnQncyBzaG91dGJveCAoUmVxdWlyZXMgZnVsbCBhdXRoKQ0KCSAqIEBwYXJhbSBhcnJheSAkbWV0aG9kVmFycyBBbiBhcnJheSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVxdWlyZWQgdmFsdWVzOiA8aT5ldmVudElkPC9pPiwgPGk+bWVzc2FnZTwvaT4NCgkgKiBAcmV0dXJuIGJvb2xlYW4NCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gc2hvdXQoJG1ldGhvZFZhcnMpIHsNCgkJLy8gT25seSBhbGxvdyBmdWxsIGF1dGhlZCBjYWxscw0KCQlpZiAoICR0aGlzLT5mdWxsQXV0aCA9PSBUUlVFICkgew0KCQkJLy8gQ2hlY2sgZm9yIHJlcXVpcmVkIHZhcmlhYmxlcw0KCQkJaWYgKCAhZW1wdHkoJG1ldGhvZFZhcnNbJ2V2ZW50J10pICYmICFlbXB0eSgkbWV0aG9kVmFyc1snbWVzc2FnZSddKSApIHsNCgkJCQkkdmFycyA9IGFycmF5KA0KCQkJCQknbWV0aG9kJyA9PiAnZXZlbnQuc2hvdXQnLA0KCQkJCQknYXBpX2tleScgPT4gJHRoaXMtPmF1dGgtPmFwaUtleSwNCgkJCQkJJ3NrJyA9PiAkdGhpcy0+YXV0aC0+c2Vzc2lvbktleQ0KCQkJCSk7DQoJCQkJJHZhcnMgPSBhcnJheV9tZXJnZSgkdmFycywgJG1ldGhvZFZhcnMpOw0KCQkJCSRzaWcgPSAkdGhpcy0+YXBpU2lnKCR0aGlzLT5hdXRoLT5zZWNyZXQsICR2YXJzKTsNCgkJCQkkdmFyc1snYXBpX3NpZyddID0gJHNpZzsNCgkJCQkNCgkJCQlpZiAoICRjYWxsID0gJHRoaXMtPmFwaVBvc3RDYWxsKCR2YXJzKSApIHsNCgkJCQkJcmV0dXJuIFRSVUU7DQoJCQkJfQ0KCQkJCWVsc2Ugew0KCQkJCQlyZXR1cm4gRkFMU0U7DQoJCQkJfQ0KCQkJfQ0KCQkJZWxzZSB7DQoJCQkJLy8gR2l2ZSBhIDkxIGVycm9yIGlmIGluY29ycmVjdCB2YXJpYWJsZXMgYXJlIHVzZWQNCgkJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTEsICdZb3UgbXVzdCBpbmNsdWRlIGV2ZW50SWQgYW5kIG1lc3NhZ2UgdmFyaWFibGVzIGluIHRoZSBjYWxsIGZvciB0aGlzIG1ldGhvZCcpOw0KCQkJCXJldHVybiBGQUxTRTsNCgkJCX0NCgkJfQ0KCQllbHNlIHsNCgkJCS8vIEdpdmUgYSA5MiBlcnJvciBpZiBub3QgZnVsbHkgYXV0aGVkDQoJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTIsICdNZXRob2QgcmVxdWlyZXMgZnVsbCBhdXRoLiBDYWxsIGF1dGguZ2V0U2Vzc2lvbiB1c2luZyBsYXN0Zm1BcGlBdXRoIGNsYXNzJyk7DQoJCQlyZXR1cm4gRkFMU0U7DQoJCX0NCgl9DQp9DQoNCj8+]]></data>
	</file>
	<file>
	  <filename>/lib/lastfmapi/api/geo.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogRmlsZSB0aGF0IHN0b3JlcyBhcGkgY2FsbHMgZm9yIGdlb2dyYXBoaWNhbCBhcGkgY2FsbHMNCiAqIEBwYWNrYWdlIGFwaWNhbGxzDQogKi8NCi8qKg0KICogQWxsb3dzIGFjY2VzcyB0byB0aGUgYXBpIHJlcXVlc3RzIHJlbGF0aW5nIHRvIGdlb2dyYXBoaWNhbCBkYXRlDQogKiBAcGFja2FnZSBhcGljYWxscw0KICovDQpjbGFzcyBsYXN0Zm1BcGlHZW8gZXh0ZW5kcyBsYXN0Zm1BcGkgew0KCS8qKg0KCSAqIFN0b3JlcyB0aGUgY29uZmlnIHZhbHVlcyBzZXQgaW4gdGhlIGNhbGwNCgkgKiBAYWNjZXNzIHB1YmxpYw0KCSAqIEB2YXIgYXJyYXkNCgkgKi8NCglwdWJsaWMgJGNvbmZpZzsNCgkvKioNCgkgKiBTdG9yZXMgdGhlIGF1dGggdmFyaWFibGVzIHVzZWQgaW4gYWxsIGFwaSBjYWxscw0KCSAqIEBhY2Nlc3MgcHJpdmF0ZQ0KCSAqIEB2YXIgYXJyYXkNCgkgKi8NCglwcml2YXRlICRhdXRoOw0KCS8qKg0KCSAqIFN0YXRlcyBpZiB0aGUgdXNlciBoYXMgZnVsbCBhdXRoZW50aWNhdGlvbiB0byB1c2UgYXBpIHJlcXVlc3RzIHRoYXQgbW9kaWZ5IGRhdGENCgkgKiBAYWNjZXNzIHByaXZhdGUNCgkgKiBAdmFyIGJvb2xlYW4NCgkgKi8NCglwcml2YXRlICRmdWxsQXV0aDsNCgkNCgkvKioNCgkgKiBAcGFyYW0gYXJyYXkgJGF1dGggUGFzc2VzIHRoZSBhdXRoZW50aWNhdGlvbiB2YXJpYWJsZXMNCgkgKiBAcGFyYW0gYXJyYXkgJGZ1bGxBdXRoIEEgYm9vbGVhbiB2YWx1ZSBzdGF0aW5nIGlmIHRoZSB1c2VyIGhhcyBmdWxsIGF1dGhlbnRpY2F0aW9uIG9yIG5vdA0KCSAqIEBwYXJhbSBhcnJheSAkY29uZmlnIEFuIGFycmF5IG9mIGNvbmZpZyB2YXJpYWJsZXMgcmVsYXRlZCB0byBjYWNoaW5nIGFuZCBvdGhlciBmZWF0dXJlcw0KCSAqLw0KCWZ1bmN0aW9uIF9fY29uc3RydWN0KCRhdXRoLCAkZnVsbEF1dGgsICRjb25maWcpIHsNCgkJJHRoaXMtPmF1dGggPSAkYXV0aDsNCgkJJHRoaXMtPmZ1bGxBdXRoID0gJGZ1bGxBdXRoOw0KCQkkdGhpcy0+Y29uZmlnID0gJGNvbmZpZzsNCgl9DQoJDQoJLyoqDQoJICogR2V0IGFsbCBldmVudHMgaW4gYSBzcGVjaWZpYyBsb2NhdGlvbiBieSBjb3VudHJ5IG9yIGNpdHkgbmFtZS4NCgkgKiBAcGFyYW0gYXJyYXkgJG1ldGhvZFZhcnMgQW4gYXJyYXkgd2l0aCB0aGUgZm9sbG93aW5nIHJlcXVpcmVkIHZhbHVlczogPGk+bG9jYXRpb248L2k+IGFuZCBvcHRpb25hbCB2YWx1ZXM6IDxpPmRpc3RhbmNlPC9pPiwgPGk+cGFnZTwvaT4NCgkgKiBAcmV0dXJuIGFycmF5DQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGdldEV2ZW50cygkbWV0aG9kVmFycykgew0KCQkvLyBDaGVjayBmb3IgcmVxdWlyZWQgdmFyaWFibGVzDQoJCWlmICggIWVtcHR5KCRtZXRob2RWYXJzWydsb2NhdGlvbiddKSApIHsNCgkJCSR2YXJzID0gYXJyYXkoDQoJCQkJJ21ldGhvZCcgPT4gJ2dlby5nZXRldmVudHMnLA0KCQkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXV0aC0+YXBpS2V5DQoJCQkpOw0KCQkJJHZhcnMgPSBhcnJheV9tZXJnZSgkdmFycywgJG1ldGhvZFZhcnMpOw0KCQkJDQoJCQlpZiAoICRjYWxsID0gJHRoaXMtPmFwaUdldENhbGwoJHZhcnMpICkgew0KCQkJCSRldmVudHNbJ2xvY2F0aW9uJ10gPSAoc3RyaW5nKSAkY2FsbC0+ZXZlbnRzWydsb2NhdGlvbiddOw0KCQkJCSRldmVudHNbJ2N1cnJlbnRQYWdlJ10gPSAoc3RyaW5nKSAkY2FsbC0+ZXZlbnRzWydwYWdlJ107DQoJCQkJJGV2ZW50c1sndG90YWxQYWdlcyddID0gKHN0cmluZykgJGNhbGwtPmV2ZW50c1sndG90YWxwYWdlcyddOw0KCQkJCSRldmVudHNbJ3RvdGFsUmVzdWx0cyddID0gKHN0cmluZykgJGNhbGwtPmV2ZW50c1sndG90YWwnXTsNCgkJCQkkaSA9IDA7DQoJCQkJZm9yZWFjaCAoICRjYWxsLT5ldmVudHMtPmV2ZW50IGFzICRldmVudCApIHsNCgkJCQkJJGV2ZW50c1snZXZlbnRzJ11bJGldWydpZCddID0gKHN0cmluZykgJGV2ZW50LT5pZDsNCgkJCQkJJGV2ZW50c1snZXZlbnRzJ11bJGldWyd0aXRsZSddID0gKHN0cmluZykgJGV2ZW50LT50aXRsZTsNCgkJCQkJJGlpID0gMDsNCgkJCQkJZm9yZWFjaCAoICRldmVudC0+YXJ0aXN0cy0+YXJ0aXN0IGFzICRhcnRpc3QgKSB7DQoJCQkJCQkkZXZlbnRzWydldmVudHMnXVskaV1bJ2FydGlzdHMnXVskaWldID0gKHN0cmluZykgJGFydGlzdDsNCgkJCQkJCSRpaSsrOw0KCQkJCQl9DQoJCQkJCSRldmVudHNbJ2V2ZW50cyddWyRpXVsnaGVhZGxpbmVyJ10gPSAoc3RyaW5nKSAkZXZlbnQtPmFydGlzdHMtPmhlYWRsaW5lcjsNCgkJCQkJJGV2ZW50c1snZXZlbnRzJ11bJGldWyd2ZW51ZSddWyduYW1lJ10gPSAoc3RyaW5nKSAkZXZlbnQtPnZlbnVlLT5uYW1lOw0KCQkJCQkkZXZlbnRzWydldmVudHMnXVskaV1bJ3ZlbnVlJ11bJ2xvY2F0aW9uJ11bJ2NpdHknXSA9IChzdHJpbmcpICRldmVudC0+dmVudWUtPmxvY2F0aW9uLT5jaXR5Ow0KCQkJCQkkZXZlbnRzWydldmVudHMnXVskaV1bJ3ZlbnVlJ11bJ2xvY2F0aW9uJ11bJ2NvdW50cnknXSA9IChzdHJpbmcpICRldmVudC0+dmVudWUtPmxvY2F0aW9uLT5jb3VudHJ5Ow0KCQkJCQkkZXZlbnRzWydldmVudHMnXVskaV1bJ3ZlbnVlJ11bJ2xvY2F0aW9uJ11bJ3N0cmVldCddID0gKHN0cmluZykgJGV2ZW50LT52ZW51ZS0+bG9jYXRpb24tPnN0cmVldDsNCgkJCQkJJGV2ZW50c1snZXZlbnRzJ11bJGldWyd2ZW51ZSddWydsb2NhdGlvbiddWydwb3N0YWxjb2RlJ10gPSAoc3RyaW5nKSAkZXZlbnQtPnZlbnVlLT5sb2NhdGlvbi0+cG9zdGFsY29kZTsNCgkJCQkJJGdlb1RhZ3MgPSAkZXZlbnQtPnZlbnVlLT5sb2NhdGlvbi0+Y2hpbGRyZW4oJ2h0dHA6Ly93d3cudzMub3JnLzIwMDMvMDEvZ2VvL3dnczg0X3BvcyMnKTsNCgkJCQkJJGV2ZW50c1snZXZlbnRzJ11bJGldWyd2ZW51ZSddWydsb2NhdGlvbiddWydwb2ludCddWydsYXQnXSA9IChzdHJpbmcpICRnZW9UYWdzLT5wb2ludC0+bGF0Ow0KCQkJCQkkZXZlbnRzWydldmVudHMnXVskaV1bJ3ZlbnVlJ11bJ2xvY2F0aW9uJ11bJ3BvaW50J11bJ2xvbmcnXSA9IChzdHJpbmcpICRnZW9UYWdzLT5wb2ludC0+bG9uZzsNCgkJCQkJJGV2ZW50c1snZXZlbnRzJ11bJGldWyd2ZW51ZSddWydsb2NhdGlvbiddWyd0aW1lem9uZSddID0gKHN0cmluZykgJGV2ZW50LT52ZW51ZS0+bG9jYXRpb24tPnRpbWV6b25lOw0KCQkJCQkkZXZlbnRzWydldmVudHMnXVskaV1bJ3ZlbnVlJ11bJ3VybCddID0gKHN0cmluZykgJGV2ZW50LT52ZW51ZS0+dXJsOw0KCQkJCQkkZXZlbnRzWydldmVudHMnXVskaV1bJ3N0YXJ0RGF0ZSddID0gc3RydG90aW1lKHRyaW0oKHN0cmluZykgJGV2ZW50LT5zdGFydERhdGUpKTsNCgkJCQkJJGV2ZW50c1snZXZlbnRzJ11bJGldWydzdGFydFRpbWUnXSA9IChzdHJpbmcpICRldmVudC0+c3RhcnRUaW1lOw0KCQkJCQkkZXZlbnRzWydldmVudHMnXVskaV1bJ2Rlc2NyaXB0aW9uJ10gPSAoc3RyaW5nKSAkZXZlbnQtPmRlc2NyaXB0aW9uOw0KCQkJCQkkZXZlbnRzWydldmVudHMnXVskaV1bJ2F0dGVuZGFuY2UnXSA9IChzdHJpbmcpICRldmVudC0+YXR0ZW5kYW5jZTsNCgkJCQkJJGV2ZW50c1snZXZlbnRzJ11bJGldWydyZXZpZXdzJ10gPSAoc3RyaW5nKSAkZXZlbnQtPnJldmlld3M7DQoJCQkJCSRldmVudHNbJ2V2ZW50cyddWyRpXVsndGFnJ10gPSAoc3RyaW5nKSAkZXZlbnQtPnRhZzsNCgkJCQkJJGV2ZW50c1snZXZlbnRzJ11bJGldWyd1cmwnXSA9IChzdHJpbmcpICRldmVudC0+dXJsOw0KCQkJCQkkaSsrOw0KCQkJCX0NCgkJCQlyZXR1cm4gJGV2ZW50czsNCgkJCX0NCgkJCWVsc2Ugew0KCQkJCXJldHVybiBGQUxTRTsNCgkJCX0NCgkJfQ0KCQllbHNlIHsNCgkJCS8vIEdpdmUgYSA5MSBlcnJvciBpZiBpbmNvcnJlY3QgdmFyaWFibGVzIGFyZSB1c2VkDQoJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTEsICdZb3UgbXVzdCBpbmNsdWRlIGEgbG9jYXRpb24gdmFyaWFsYmUgaW4gdGhlIGNhbGwgZm9yIHRoaXMgbWV0aG9kJyk7DQoJCQlyZXR1cm4gRkFMU0U7DQoJCX0NCgl9DQoJDQoJLyoqDQoJICogR2V0IHRoZSBtb3N0IHBvcHVsYXIgYXJ0aXN0cyBvbiBMYXN0LmZtIGJ5IGNvdW50cnkNCgkgKiBAcGFyYW0gYXJyYXkgJG1ldGhvZFZhcnMgQW4gYXJyYXkgd2l0aCB0aGUgZm9sbG93aW5nIHJlcXVpcmVkIHZhbHVlczogPGk+Y291bnRyeTwvaT4NCgkgKiBAcmV0dXJuIGFycmF5DQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGdldFRvcEFydGlzdHMoJG1ldGhvZFZhcnMpIHsNCgkJLy8gQ2hlY2sgZm9yIHJlcXVpcmVkIHZhcmlhYmxlcw0KCQlpZiAoICFlbXB0eSgkbWV0aG9kVmFyc1snY291bnRyeSddKSApIHsNCgkJCSR2YXJzID0gYXJyYXkoDQoJCQkJJ21ldGhvZCcgPT4gJ2dlby5nZXR0b3BhcnRpc3RzJywNCgkJCQknYXBpX2tleScgPT4gJHRoaXMtPmF1dGgtPmFwaUtleQ0KCQkJKTsNCgkJCSR2YXJzID0gYXJyYXlfbWVyZ2UoJHZhcnMsICRtZXRob2RWYXJzKTsNCgkJCQ0KCQkJaWYgKCAkY2FsbCA9ICR0aGlzLT5hcGlHZXRDYWxsKCR2YXJzKSApIHsNCgkJCQkkaSA9IDA7DQoJCQkJZm9yZWFjaCAoICRjYWxsLT50b3BhcnRpc3RzLT5hcnRpc3QgYXMgJGFydGlzdCApIHsNCgkJCQkJJHRvcEFydGlzdHNbJGldWyduYW1lJ10gPSAoc3RyaW5nKSAkYXJ0aXN0LT5uYW1lOw0KCQkJCQkkdG9wQXJ0aXN0c1skaV1bJ3JhbmsnXSA9IChzdHJpbmcpICRhcnRpc3RbJ3JhbmsnXTsNCgkJCQkJJHRvcEFydGlzdHNbJGldWydwbGF5Y291bnQnXSA9IChzdHJpbmcpICRhcnRpc3QtPnBsYXljb3VudDsNCgkJCQkJJHRvcEFydGlzdHNbJGldWydtYmlkJ10gPSAoc3RyaW5nKSAkYXJ0aXN0LT5tYmlkOw0KCQkJCQkkdG9wQXJ0aXN0c1skaV1bJ3VybCddID0gKHN0cmluZykgJGFydGlzdC0+dXJsOw0KCQkJCQkkdG9wQXJ0aXN0c1skaV1bJ3N0cmVhbWFibGUnXSA9IChzdHJpbmcpICRhcnRpc3QtPnN0cmVhbWFibGU7DQoJCQkJCSR0b3BBcnRpc3RzWyRpXVsnaW1hZ2UnXVsnc21hbGwnXSA9IChzdHJpbmcpICRhcnRpc3QtPmltYWdlWzBdOw0KCQkJCQkkdG9wQXJ0aXN0c1skaV1bJ2ltYWdlJ11bJ21lZGl1bSddID0gKHN0cmluZykgJGFydGlzdC0+aW1hZ2VbMV07DQoJCQkJCSR0b3BBcnRpc3RzWyRpXVsnaW1hZ2UnXVsnbGFyZ2UnXSA9IChzdHJpbmcpICRhcnRpc3QtPmltYWdlWzJdOw0KCQkJCQkkaSsrOw0KCQkJCX0NCgkJCQkNCgkJCQlyZXR1cm4gJHRvcEFydGlzdHM7DQoJCQl9DQoJCQllbHNlIHsNCgkJCQlyZXR1cm4gRkFMU0U7DQoJCQl9DQoJCX0NCgkJZWxzZSB7DQoJCQkvLyBHaXZlIGEgOTEgZXJyb3IgaWYgaW5jb3JyZWN0IHZhcmlhYmxlcyBhcmUgdXNlZA0KCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkxLCAnWW91IG11c3QgaW5jbHVkZSBhIGNvdW50cnkgdmFyaWFsYmUgaW4gdGhlIGNhbGwgZm9yIHRoaXMgbWV0aG9kJyk7DQoJCQlyZXR1cm4gRkFMU0U7DQoJCX0NCgl9DQoJDQoJLyoqDQoJICogR2V0IHRoZSBtb3N0IHBvcHVsYXIgdHJhY2tzIG9uIExhc3QuZm0gbGFzdCB3ZWVrIGJ5IGNvdW50cnkNCgkgKiBAcGFyYW0gYXJyYXkgJG1ldGhvZFZhcnMgQW4gYXJyYXkgd2l0aCB0aGUgZm9sbG93aW5nIHJlcXVpcmVkIHZhbHVlczogPGk+Y291bnRyeTwvaT4NCgkgKiBAcmV0dXJuIGFycmF5DQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGdldFRvcFRyYWNrcygkbWV0aG9kVmFycykgew0KCQkvLyBDaGVjayBmb3IgcmVxdWlyZWQgdmFyaWFibGVzDQoJCWlmICggIWVtcHR5KCRtZXRob2RWYXJzWydjb3VudHJ5J10pICkgew0KCQkJJHZhcnMgPSBhcnJheSgNCgkJCQknbWV0aG9kJyA9PiAnZ2VvLmdldHRvcHRyYWNrcycsDQoJCQkJJ2FwaV9rZXknID0+ICR0aGlzLT5hdXRoLT5hcGlLZXkNCgkJCSk7DQoJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkNCgkJCWlmICggJGNhbGwgPSAkdGhpcy0+YXBpR2V0Q2FsbCgkdmFycykgKSB7DQoJCQkJJGkgPSAwOw0KCQkJCWZvcmVhY2ggKCAkY2FsbC0+dG9wdHJhY2tzLT50cmFjayBhcyAkdHJhY2sgKSB7DQoJCQkJCSR0b3BUcmFja3NbJGldWyduYW1lJ10gPSAoc3RyaW5nKSAkdHJhY2stPm5hbWU7DQoJCQkJCSR0b3BUcmFja3NbJGldWydyYW5rJ10gPSAoc3RyaW5nKSAkdHJhY2tbJ3JhbmsnXTsNCgkJCQkJJHRvcFRyYWNrc1skaV1bJ3BsYXljb3VudCddID0gKHN0cmluZykgJHRyYWNrLT5wbGF5Y291bnQ7DQoJCQkJCSR0b3BUcmFja3NbJGldWydtYmlkJ10gPSAoc3RyaW5nKSAkdHJhY2stPm1iaWQ7DQoJCQkJCSR0b3BUcmFja3NbJGldWyd1cmwnXSA9IChzdHJpbmcpICR0cmFjay0+dXJsOw0KCQkJCQkkdG9wVHJhY2tzWyRpXVsnc3RyZWFtYWJsZSddID0gKHN0cmluZykgJHRyYWNrLT5zdHJlYW1hYmxlOw0KCQkJCQkkdG9wVHJhY2tzWyRpXVsnZnVsbHRyYWNrJ10gPSAoc3RyaW5nKSAkdHJhY2stPnN0cmVhbWFibGVbJ2Z1bGx0cmFjayddOw0KCQkJCQkkdG9wVHJhY2tzWyRpXVsnYXJ0aXN0J11bJ25hbWUnXSA9IChzdHJpbmcpICR0cmFjay0+YXJ0aXN0LT5uYW1lOw0KCQkJCQkkdG9wVHJhY2tzWyRpXVsnYXJ0aXN0J11bJ21iaWQnXSA9IChzdHJpbmcpICR0cmFjay0+YXJ0aXN0LT5tYmlkOw0KCQkJCQkkdG9wVHJhY2tzWyRpXVsnYXJ0aXN0J11bJ3VybCddID0gKHN0cmluZykgJHRyYWNrLT5hcnRpc3QtPnVybDsNCgkJCQkJJHRvcFRyYWNrc1skaV1bJ2ltYWdlJ11bJ3NtYWxsJ10gPSAoc3RyaW5nKSAkdHJhY2stPmltYWdlWzBdOw0KCQkJCQkkdG9wVHJhY2tzWyRpXVsnaW1hZ2UnXVsnbWVkaXVtJ10gPSAoc3RyaW5nKSAkdHJhY2stPmltYWdlWzFdOw0KCQkJCQkkdG9wVHJhY2tzWyRpXVsnaW1hZ2UnXVsnbGFyZ2UnXSA9IChzdHJpbmcpICR0cmFjay0+aW1hZ2VbMl07DQoJCQkJCSRpKys7DQoJCQkJfQ0KCQkJCQ0KCQkJCXJldHVybiAkdG9wVHJhY2tzOw0KCQkJfQ0KCQkJZWxzZSB7DQoJCQkJcmV0dXJuIEZBTFNFOw0KCQkJfQ0KCQl9DQoJCWVsc2Ugew0KCQkJLy8gR2l2ZSBhIDkxIGVycm9yIGlmIGluY29ycmVjdCB2YXJpYWJsZXMgYXJlIHVzZWQNCgkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MSwgJ1lvdSBtdXN0IGluY2x1ZGUgYSBjb3VudHJ5IHZhcmlhbGJlIGluIHRoZSBjYWxsIGZvciB0aGlzIG1ldGhvZCcpOw0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoJfQ0KfQ0KDQo/Pg==]]></data>
	</file>
	<file>
	  <filename>/lib/lastfmapi/api/group.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogRmlsZSB0aGF0IHN0b3JlcyBhcGkgY2FsbHMgZm9yIGdyb3VwIGFwaSBjYWxscw0KICogQHBhY2thZ2UgYXBpY2FsbHMNCiAqLw0KLyoqDQogKiBBbGxvd3MgYWNjZXNzIHRvIHRoZSBhcGkgcmVxdWVzdHMgcmVsYXRpbmcgdG8gZ3JvdXBzDQogKiBAcGFja2FnZSBhcGljYWxscw0KICovDQpjbGFzcyBsYXN0Zm1BcGlHcm91cCBleHRlbmRzIGxhc3RmbUFwaSB7DQoJLyoqDQoJICogU3RvcmVzIHRoZSBjb25maWcgdmFsdWVzIHNldCBpbiB0aGUgY2FsbA0KCSAqIEBhY2Nlc3MgcHVibGljDQoJICogQHZhciBhcnJheQ0KCSAqLw0KCXB1YmxpYyAkY29uZmlnOw0KCS8qKg0KCSAqIFN0b3JlcyB0aGUgYXV0aCB2YXJpYWJsZXMgdXNlZCBpbiBhbGwgYXBpIGNhbGxzDQoJICogQGFjY2VzcyBwcml2YXRlDQoJICogQHZhciBhcnJheQ0KCSAqLw0KCXByaXZhdGUgJGF1dGg7DQoJLyoqDQoJICogU3RhdGVzIGlmIHRoZSB1c2VyIGhhcyBmdWxsIGF1dGhlbnRpY2F0aW9uIHRvIHVzZSBhcGkgcmVxdWVzdHMgdGhhdCBtb2RpZnkgZGF0YQ0KCSAqIEBhY2Nlc3MgcHJpdmF0ZQ0KCSAqIEB2YXIgYm9vbGVhbg0KCSAqLw0KCXByaXZhdGUgJGZ1bGxBdXRoOw0KCQ0KCS8qKg0KCSAqIEBwYXJhbSBhcnJheSAkYXV0aCBQYXNzZXMgdGhlIGF1dGhlbnRpY2F0aW9uIHZhcmlhYmxlcw0KCSAqIEBwYXJhbSBhcnJheSAkZnVsbEF1dGggQSBib29sZWFuIHZhbHVlIHN0YXRpbmcgaWYgdGhlIHVzZXIgaGFzIGZ1bGwgYXV0aGVudGljYXRpb24gb3Igbm90DQoJICogQHBhcmFtIGFycmF5ICRjb25maWcgQW4gYXJyYXkgb2YgY29uZmlnIHZhcmlhYmxlcyByZWxhdGVkIHRvIGNhY2hpbmcgYW5kIG90aGVyIGZlYXR1cmVzDQoJICovDQoJZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGF1dGgsICRmdWxsQXV0aCwgJGNvbmZpZykgew0KCQkkdGhpcy0+YXV0aCA9ICRhdXRoOw0KCQkkdGhpcy0+ZnVsbEF1dGggPSAkZnVsbEF1dGg7DQoJCSR0aGlzLT5jb25maWcgPSAkY29uZmlnOw0KCX0NCgkNCgkvKioNCgkgKiBHZXQgYSBsaXN0IG9mIG1lbWJlcnMgZm9yIHRoaXMgZ3JvdXANCgkgKiBAcGFyYW0gYXJyYXkgJG1ldGhvZFZhcnMgQW4gYXJyYXkgd2l0aCB0aGUgZm9sbG93aW5nIHJlcXVpcmVkIHZhbHVlczogPGk+Z3JvdXA8L2k+DQoJICogQHJldHVybiBhcnJheQ0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBnZXRNZW1iZXJzKCRtZXRob2RWYXJzKSB7DQoJCS8vIENoZWNrIGZvciByZXF1aXJlZCB2YXJpYWJsZXMNCgkJaWYgKCAhZW1wdHkoJG1ldGhvZFZhcnNbJ2dyb3VwJ10pICkgew0KCQkJJHZhcnMgPSBhcnJheSgNCgkJCQknbWV0aG9kJyA9PiAnZ3JvdXAuZ2V0bWVtYmVycycsDQoJCQkJJ2FwaV9rZXknID0+ICR0aGlzLT5hdXRoLT5hcGlLZXkNCgkJCSk7DQoJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkNCgkJCWlmICggJGNhbGwgPSAkdGhpcy0+YXBpR2V0Q2FsbCgkdmFycykgKSB7DQoJCQkJJGkgPSAwOw0KCQkJCSRtZW1iZXJzWydmb3InXSA9IChzdHJpbmcpICRjYWxsLT5tZW1iZXJzWydmb3InXTsNCgkJCQkkbWVtYmVyc1sncGFnZSddID0gKHN0cmluZykgJGNhbGwtPm1lbWJlcnNbJ3BhZ2UnXTsNCgkJCQkkbWVtYmVyc1sncGVyUGFnZSddID0gKHN0cmluZykgJGNhbGwtPm1lbWJlcnNbJ3BlclBhZ2UnXTsNCgkJCQkkbWVtYmVyc1sndG90YWxQYWdlcyddID0gKHN0cmluZykgJGNhbGwtPm1lbWJlcnNbJ3RvdGFsUGFnZXMnXTsNCgkJCQlmb3JlYWNoICggJGNhbGwtPm1lbWJlcnMtPnVzZXIgYXMgJHVzZXIgKSB7DQoJCQkJCSRtZW1iZXJzWydtZW1iZXJzJ11bJGldWyduYW1lJ10gPSAoc3RyaW5nKSAkdXNlci0+bmFtZTsNCgkJCQkJJG1lbWJlcnNbJ21lbWJlcnMnXVskaV1bJ3JlYWxuYW1lJ10gPSAoc3RyaW5nKSAkdXNlci0+cmVhbG5hbWU7DQoJCQkJCSRtZW1iZXJzWydtZW1iZXJzJ11bJGldWyd1cmwnXSA9IChzdHJpbmcpICR1c2VyLT51cmw7DQoJCQkJCSRtZW1iZXJzWydtZW1iZXJzJ11bJGldWydpbWFnZSddWydzbWFsbCddID0gKHN0cmluZykgJHVzZXItPmltYWdlWzBdOw0KCQkJCQkkbWVtYmVyc1snbWVtYmVycyddWyRpXVsnaW1hZ2UnXVsnbWVkaXVtJ10gPSAoc3RyaW5nKSAkdXNlci0+aW1hZ2VbMV07DQoJCQkJCSRtZW1iZXJzWydtZW1iZXJzJ11bJGldWydpbWFnZSddWydsYXJnZSddID0gKHN0cmluZykgJHVzZXItPmltYWdlWzJdOw0KCQkJCQkkaSsrOw0KCQkJCX0NCgkJCQlyZXR1cm4gJG1lbWJlcnM7DQoJCQl9DQoJCQllbHNlIHsNCgkJCQlyZXR1cm4gRkFMU0U7DQoJCQl9DQoJCX0NCgkJZWxzZSB7DQoJCQkvLyBHaXZlIGEgOTEgZXJyb3IgaWYgaW5jb3JyZWN0IHZhcmlhYmxlcyBhcmUgdXNlZA0KCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkxLCAnWW91IG11c3QgaW5jbHVkZSBhIGdyb3VwIHZhcmlhYmxlIGluIHRoZSBjYWxsIGZvciB0aGlzIG1ldGhvZCcpOw0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoJfQ0KCQ0KCS8qKg0KCSAqIEdldCBhbiBhbGJ1bSBjaGFydCBmb3IgYSBncm91cCwgZm9yIGEgZ2l2ZW4gZGF0ZSByYW5nZS4gSWYgbm8gZGF0ZSByYW5nZSBpcyBzdXBwbGllZCwgaXQgd2lsbCByZXR1cm4gdGhlIG1vc3QgcmVjZW50IGFsYnVtIGNoYXJ0IGZvciB0aGlzIGdyb3VwDQoJICogQHBhcmFtIGFycmF5ICRtZXRob2RWYXJzIEFuIGFycmF5IHdpdGggdGhlIGZvbGxvd2luZyByZXF1aXJlZCB2YWx1ZXM6IDxpPmdyb3VwPC9pPiBhbmQgb3B0aW9uYWwgdmFsdWVzOiA8aT5mcm9tPC9pPiwgPGk+dG88L2k+DQoJICogQHJldHVybiBhcnJheQ0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBnZXRXZWVrbHlBbGJ1bUNoYXJ0KCRtZXRob2RWYXJzKSB7DQoJCS8vIENoZWNrIGZvciByZXF1aXJlZCB2YXJpYWJsZXMNCgkJaWYgKCAhZW1wdHkoJG1ldGhvZFZhcnNbJ2dyb3VwJ10pICkgew0KCQkJJHZhcnMgPSBhcnJheSgNCgkJCQknbWV0aG9kJyA9PiAnZ3JvdXAuZ2V0d2Vla2x5YWxidW1jaGFydCcsDQoJCQkJJ2FwaV9rZXknID0+ICR0aGlzLT5hdXRoLT5hcGlLZXkNCgkJCSk7DQoJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkNCgkJCWlmICggJGNhbGwgPSAkdGhpcy0+YXBpR2V0Q2FsbCgkdmFycykgKSB7DQoJCQkJJGkgPSAwOw0KCQkJCWZvcmVhY2ggKCAkY2FsbC0+d2Vla2x5YWxidW1jaGFydC0+YWxidW0gYXMgJGFsYnVtICkgew0KCQkJCQkkYWxidW1zWyRpXVsnbmFtZSddID0gKHN0cmluZykgJGFsYnVtLT5uYW1lOw0KCQkJCQkkYWxidW1zWyRpXVsncmFuayddID0gKHN0cmluZykgJGFsYnVtWydyYW5rJ107DQoJCQkJCSRhbGJ1bXNbJGldWydhcnRpc3QnXVsnbmFtZSddID0gKHN0cmluZykgJGFsYnVtLT5hcnRpc3Q7DQoJCQkJCSRhbGJ1bXNbJGldWydhcnRpc3QnXVsnbWJpZCddID0gKHN0cmluZykgJGFsYnVtLT5hcnRpc3RbJ21iaWQnXTsNCgkJCQkJJGFsYnVtc1skaV1bJ3BsYXljb3VudCddID0gKHN0cmluZykgJGFsYnVtLT5wbGF5Y291bnQ7DQoJCQkJCSRhbGJ1bXNbJGldWyd1cmwnXSA9IChzdHJpbmcpICRhbGJ1bS0+dXJsOw0KCQkJCQkkaSsrOw0KCQkJCX0NCgkJCQlyZXR1cm4gJGFsYnVtczsNCgkJCX0NCgkJCWVsc2Ugew0KCQkJCXJldHVybiBGQUxTRTsNCgkJCX0NCgkJfQ0KCQllbHNlIHsNCgkJCS8vIEdpdmUgYSA5MSBlcnJvciBpZiBpbmNvcnJlY3QgdmFyaWFibGVzIGFyZSB1c2VkDQoJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTEsICdZb3UgbXVzdCBpbmNsdWRlIGEgZ3JvdXAgdmFyaWFibGUgaW4gdGhlIGNhbGwgZm9yIHRoaXMgbWV0aG9kJyk7DQoJCQlyZXR1cm4gRkFMU0U7DQoJCX0NCgl9DQoJDQoJLyoqDQoJICogR2V0IGFuIGFydGlzdCBjaGFydCBmb3IgYSBncm91cCwgZm9yIGEgZ2l2ZW4gZGF0ZSByYW5nZS4gSWYgbm8gZGF0ZSByYW5nZSBpcyBzdXBwbGllZCwgaXQgd2lsbCByZXR1cm4gdGhlIG1vc3QgcmVjZW50IGFsYnVtIGNoYXJ0IGZvciB0aGlzIGdyb3VwDQoJICogQHBhcmFtIGFycmF5ICRtZXRob2RWYXJzIEFuIGFycmF5IHdpdGggdGhlIGZvbGxvd2luZyByZXF1aXJlZCB2YWx1ZXM6IDxpPmdyb3VwPC9pPiBhbmQgb3B0aW9uYWwgdmFsdWVzOiA8aT5mcm9tPC9pPiwgPGk+dG88L2k+DQoJICogQHJldHVybiBhcnJheQ0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBnZXRXZWVrbHlBcnRpc3RDaGFydCgkbWV0aG9kVmFycykgew0KCQkvLyBDaGVjayBmb3IgcmVxdWlyZWQgdmFyaWFibGVzDQoJCWlmICggIWVtcHR5KCRtZXRob2RWYXJzWydncm91cCddKSApIHsNCgkJCSR2YXJzID0gYXJyYXkoDQoJCQkJJ21ldGhvZCcgPT4gJ2dyb3VwLmdldHdlZWtseWFydGlzdGNoYXJ0JywNCgkJCQknYXBpX2tleScgPT4gJHRoaXMtPmF1dGgtPmFwaUtleQ0KCQkJKTsNCgkJCSR2YXJzID0gYXJyYXlfbWVyZ2UoJHZhcnMsICRtZXRob2RWYXJzKTsNCgkJCQ0KCQkJaWYgKCAkY2FsbCA9ICR0aGlzLT5hcGlHZXRDYWxsKCR2YXJzKSApIHsNCgkJCQkkaSA9IDA7DQoJCQkJZm9yZWFjaCAoICRjYWxsLT53ZWVrbHlhcnRpc3RjaGFydC0+YXJ0aXN0IGFzICRhcnRpc3QgKSB7DQoJCQkJCSRhcnRpc3RzWyRpXVsnbmFtZSddID0gKHN0cmluZykgJGFydGlzdC0+bmFtZTsNCgkJCQkJJGFydGlzdHNbJGldWydyYW5rJ10gPSAoc3RyaW5nKSAkYXJ0aXN0WydyYW5rJ107DQoJCQkJCSRhcnRpc3RzWyRpXVsnbWJpZCddID0gKHN0cmluZykgJGFydGlzdC0+bWJpZDsNCgkJCQkJJGFydGlzdHNbJGldWydwbGF5Y291bnQnXSA9IChzdHJpbmcpICRhcnRpc3QtPnBsYXljb3VudDsNCgkJCQkJJGFydGlzdHNbJGldWyd1cmwnXSA9IChzdHJpbmcpICRhcnRpc3QtPnVybDsNCgkJCQkJJGkrKzsNCgkJCQl9DQoJCQkJcmV0dXJuICRhcnRpc3RzOw0KCQkJfQ0KCQkJZWxzZSB7DQoJCQkJcmV0dXJuIEZBTFNFOw0KCQkJfQ0KCQl9DQoJCWVsc2Ugew0KCQkJLy8gR2l2ZSBhIDkxIGVycm9yIGlmIGluY29ycmVjdCB2YXJpYWJsZXMgYXJlIHVzZWQNCgkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MSwgJ1lvdSBtdXN0IGluY2x1ZGUgYSBncm91cCB2YXJpYWJsZSBpbiB0aGUgY2FsbCBmb3IgdGhpcyBtZXRob2QnKTsNCgkJCXJldHVybiBGQUxTRTsNCgkJfQ0KCX0NCgkNCgkvKioNCgkgKiBHZXQgYSBsaXN0IG9mIGF2YWlsYWJsZSBjaGFydHMgZm9yIHRoaXMgZ3JvdXAsIGV4cHJlc3NlZCBhcyBkYXRlIHJhbmdlcyB3aGljaCBjYW4gYmUgc2VudCB0byB0aGUgY2hhcnQgc2VydmljZXMNCgkgKiBAcGFyYW0gYXJyYXkgJG1ldGhvZFZhcnMgQW4gYXJyYXkgd2l0aCB0aGUgZm9sbG93aW5nIHJlcXVpcmVkIHZhbHVlczogPGk+Z3JvdXA8L2k+DQoJICogQHJldHVybiBhcnJheQ0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBnZXRXZWVrbHlDaGFydExpc3QoJG1ldGhvZFZhcnMpIHsNCgkJLy8gQ2hlY2sgZm9yIHJlcXVpcmVkIHZhcmlhYmxlcw0KCQlpZiAoICFlbXB0eSgkbWV0aG9kVmFyc1snZ3JvdXAnXSkgKSB7DQoJCQkkdmFycyA9IGFycmF5KA0KCQkJCSdtZXRob2QnID0+ICdncm91cC5nZXR3ZWVrbHljaGFydGxpc3QnLA0KCQkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXV0aC0+YXBpS2V5DQoJCQkpOw0KCQkJJHZhcnMgPSBhcnJheV9tZXJnZSgkdmFycywgJG1ldGhvZFZhcnMpOw0KCQkJDQoJCQlpZiAoICRjYWxsID0gJHRoaXMtPmFwaUdldENhbGwoJHZhcnMpICkgew0KCQkJCSRpID0gMDsNCgkJCQlmb3JlYWNoICggJGNhbGwtPndlZWtseWNoYXJ0bGlzdC0+Y2hhcnQgYXMgJGNoYXJ0ICkgew0KCQkJCQkkY2hhcnRMaXN0WyRpXVsnZnJvbSddID0gKHN0cmluZykgJGNoYXJ0Wydmcm9tJ107DQoJCQkJCSRjaGFydExpc3RbJGldWyd0byddID0gKHN0cmluZykgJGNoYXJ0Wyd0byddOw0KCQkJCQkkaSsrOw0KCQkJCX0NCgkJCQlyZXR1cm4gJGNoYXJ0TGlzdDsNCgkJCX0NCgkJCWVsc2Ugew0KCQkJCXJldHVybiBGQUxTRTsNCgkJCX0NCgkJfQ0KCQllbHNlIHsNCgkJCS8vIEdpdmUgYSA5MSBlcnJvciBpZiBpbmNvcnJlY3QgdmFyaWFibGVzIGFyZSB1c2VkDQoJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTEsICdZb3UgbXVzdCBpbmNsdWRlIGEgZ3JvdXAgdmFyaWFibGUgaW4gdGhlIGNhbGwgZm9yIHRoaXMgbWV0aG9kJyk7DQoJCQlyZXR1cm4gRkFMU0U7DQoJCX0NCgl9DQoJDQoJLyoqDQoJICogR2V0IGEgdHJhY2sgY2hhcnQgZm9yIGEgZ3JvdXAsIGZvciBhIGdpdmVuIGRhdGUgcmFuZ2UuIElmIG5vIGRhdGUgcmFuZ2UgaXMgc3VwcGxpZWQsIGl0IHdpbGwgcmV0dXJuIHRoZSBtb3N0IHJlY2VudCBhbGJ1bSBjaGFydCBmb3IgdGhpcyBncm91cA0KCSAqIEBwYXJhbSBhcnJheSAkbWV0aG9kVmFycyBBbiBhcnJheSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVxdWlyZWQgdmFsdWVzOiA8aT5ncm91cDwvaT4gYW5kIG9wdGlvbmFsIHZhbHVlczogPGk+ZnJvbTwvaT4sIDxpPnRvPC9pPg0KCSAqIEByZXR1cm4gYXJyYXkNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gZ2V0V2Vla2x5VHJhY2tDaGFydCgkbWV0aG9kVmFycykgew0KCQkvLyBDaGVjayBmb3IgcmVxdWlyZWQgdmFyaWFibGVzDQoJCWlmICggIWVtcHR5KCRtZXRob2RWYXJzWydncm91cCddKSApIHsNCgkJCSR2YXJzID0gYXJyYXkoDQoJCQkJJ21ldGhvZCcgPT4gJ2dyb3VwLmdldHdlZWtseXRyYWNrY2hhcnQnLA0KCQkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXV0aC0+YXBpS2V5DQoJCQkpOw0KCQkJJHZhcnMgPSBhcnJheV9tZXJnZSgkdmFycywgJG1ldGhvZFZhcnMpOw0KCQkJDQoJCQlpZiAoICRjYWxsID0gJHRoaXMtPmFwaUdldENhbGwoJHZhcnMpICkgew0KCQkJCSRpID0gMDsNCgkJCQlmb3JlYWNoICggJGNhbGwtPndlZWtseXRyYWNrY2hhcnQtPnRyYWNrIGFzICR0cmFjayApIHsNCgkJCQkJJHRyYWNrc1skaV1bJ25hbWUnXSA9IChzdHJpbmcpICR0cmFjay0+bmFtZTsNCgkJCQkJJHRyYWNrc1skaV1bJ3JhbmsnXSA9IChzdHJpbmcpICR0cmFja1sncmFuayddOw0KCQkJCQkkdHJhY2tzWyRpXVsnYXJ0aXN0J11bJ25hbWUnXSA9IChzdHJpbmcpICR0cmFjay0+YXJ0aXN0Ow0KCQkJCQkkdHJhY2tzWyRpXVsnYXJ0aXN0J11bJ21iaWQnXSA9IChzdHJpbmcpICR0cmFjay0+YXJ0aXN0WydtYmlkJ107DQoJCQkJCSR0cmFja3NbJGldWydwbGF5Y291bnQnXSA9IChzdHJpbmcpICR0cmFjay0+cGxheWNvdW50Ow0KCQkJCQkkdHJhY2tzWyRpXVsndXJsJ10gPSAoc3RyaW5nKSAkdHJhY2stPnVybDsNCgkJCQkJJGkrKzsNCgkJCQl9DQoJCQkJcmV0dXJuICR0cmFja3M7DQoJCQl9DQoJCQllbHNlIHsNCgkJCQlyZXR1cm4gRkFMU0U7DQoJCQl9DQoJCX0NCgkJZWxzZSB7DQoJCQkvLyBHaXZlIGEgOTEgZXJyb3IgaWYgaW5jb3JyZWN0IHZhcmlhYmxlcyBhcmUgdXNlZA0KCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkxLCAnWW91IG11c3QgaW5jbHVkZSBhIGdyb3VwIHZhcmlhYmxlIGluIHRoZSBjYWxsIGZvciB0aGlzIG1ldGhvZCcpOw0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoJfQ0KfQ0KDQo/Pg==]]></data>
	</file>
	<file>
	  <filename>/lib/lastfmapi/api/library.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogRmlsZSB0aGF0IHN0b3JlcyBhcGkgY2FsbHMgZm9yIHVzZXIgbGlicmFyeSBhcGkgY2FsbHMNCiAqIEBwYWNrYWdlIGFwaWNhbGxzDQogKi8NCi8qKg0KICogQWxsb3dzIGFjY2VzcyB0byB0aGUgYXBpIHJlcXVlc3RzIHJlbGF0aW5nIHRvIHVzZXIgbGlicmFyaWVzDQogKiBAcGFja2FnZSBhcGljYWxscw0KICovDQpjbGFzcyBsYXN0Zm1BcGlMaWJyYXJ5IGV4dGVuZHMgbGFzdGZtQXBpIHsNCgkvKioNCgkgKiBTdG9yZXMgdGhlIGNvbmZpZyB2YWx1ZXMgc2V0IGluIHRoZSBjYWxsDQoJICogQGFjY2VzcyBwdWJsaWMNCgkgKiBAdmFyIGFycmF5DQoJICovDQoJcHVibGljICRjb25maWc7DQoJLyoqDQoJICogU3RvcmVzIHRoZSBhdXRoIHZhcmlhYmxlcyB1c2VkIGluIGFsbCBhcGkgY2FsbHMNCgkgKiBAYWNjZXNzIHByaXZhdGUNCgkgKiBAdmFyIGFycmF5DQoJICovDQoJcHJpdmF0ZSAkYXV0aDsNCgkvKioNCgkgKiBTdGF0ZXMgaWYgdGhlIHVzZXIgaGFzIGZ1bGwgYXV0aGVudGljYXRpb24gdG8gdXNlIGFwaSByZXF1ZXN0cyB0aGF0IG1vZGlmeSBkYXRhDQoJICogQGFjY2VzcyBwcml2YXRlDQoJICogQHZhciBib29sZWFuDQoJICovDQoJcHJpdmF0ZSAkZnVsbEF1dGg7DQoJDQoJLyoqDQoJICogQHBhcmFtIGFycmF5ICRhdXRoIFBhc3NlcyB0aGUgYXV0aGVudGljYXRpb24gdmFyaWFibGVzDQoJICogQHBhcmFtIGFycmF5ICRmdWxsQXV0aCBBIGJvb2xlYW4gdmFsdWUgc3RhdGluZyBpZiB0aGUgdXNlciBoYXMgZnVsbCBhdXRoZW50aWNhdGlvbiBvciBub3QNCgkgKiBAcGFyYW0gYXJyYXkgJGNvbmZpZyBBbiBhcnJheSBvZiBjb25maWcgdmFyaWFibGVzIHJlbGF0ZWQgdG8gY2FjaGluZyBhbmQgb3RoZXIgZmVhdHVyZXMNCgkgKi8NCglmdW5jdGlvbiBfX2NvbnN0cnVjdCgkYXV0aCwgJGZ1bGxBdXRoLCAkY29uZmlnKSB7DQoJCSR0aGlzLT5hdXRoID0gJGF1dGg7DQoJCSR0aGlzLT5mdWxsQXV0aCA9ICRmdWxsQXV0aDsNCgkJJHRoaXMtPmNvbmZpZyA9ICRjb25maWc7DQoJfQ0KCQ0KCS8qKg0KCSAqIEFkZCBhbiBhbGJ1bSB0byBhIHVzZXIncyBMYXN0LmZtIGxpYnJhcnkgKFJlcXVpcmVzIGZ1bGwgYXV0aCkNCgkgKiBAcGFyYW0gYXJyYXkgJG1ldGhvZFZhcnMgQW4gYXJyYXkgd2l0aCB0aGUgZm9sbG93aW5nIHJlcXVpcmVkIHZhbHVlczogPGk+YXJ0aXN0PC9pPiwgPGk+YWxidW08L2k+DQoJICogQHJldHVybiBib29sZWFuDQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGFkZEFsYnVtKCRtZXRob2RWYXJzKSB7DQoJCS8vIE9ubHkgYWxsb3cgZnVsbCBhdXRoZWQgY2FsbHMNCgkJaWYgKCAkdGhpcy0+ZnVsbEF1dGggPT0gVFJVRSApIHsNCgkJCS8vIENoZWNrIGZvciByZXF1aXJlZCB2YXJpYWJsZXMNCgkJCWlmICggIWVtcHR5KCRtZXRob2RWYXJzWydhcnRpc3QnXSkgJiYgIWVtcHR5KCRtZXRob2RWYXJzWydhbGJ1bSddKSApIHsNCgkJCQkkdmFycyA9IGFycmF5KA0KCQkJCQknbWV0aG9kJyA9PiAnbGlicmFyeS5hZGRhbGJ1bScsDQoJCQkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXV0aC0+YXBpS2V5LA0KCQkJCQknc2snID0+ICR0aGlzLT5hdXRoLT5zZXNzaW9uS2V5DQoJCQkJKTsNCgkJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkJJHNpZyA9ICR0aGlzLT5hcGlTaWcoJHRoaXMtPmF1dGgtPnNlY3JldCwgJHZhcnMpOw0KCQkJCSR2YXJzWydhcGlfc2lnJ10gPSAkc2lnOw0KCQkJCQ0KCQkJCWlmICggJGNhbGwgPSAkdGhpcy0+YXBpUG9zdENhbGwoJHZhcnMpICkgew0KCQkJCQlyZXR1cm4gVFJVRTsNCgkJCQl9DQoJCQkJZWxzZSB7DQoJCQkJCXJldHVybiBGQUxTRTsNCgkJCQl9DQoJCQl9DQoJCQllbHNlIHsNCgkJCQkvLyBHaXZlIGEgOTEgZXJyb3IgaWYgaW5jb3JyZWN0IHZhcmlhYmxlcyBhcmUgdXNlZA0KCQkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MSwgJ1lvdSBtdXN0IGluY2x1ZGUgYXJ0aXN0IGFuZCBhbGJ1bSB2YXJpYWxiZXMgaW4gdGhlIGNhbGwgZm9yIHRoaXMgbWV0aG9kJyk7DQoJCQkJcmV0dXJuIEZBTFNFOw0KCQkJfQ0KCQl9DQoJCWVsc2Ugew0KCQkJLy8gR2l2ZSBhIDkyIGVycm9yIGlmIG5vdCBmdWxseSBhdXRoZWQNCgkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MiwgJ01ldGhvZCByZXF1aXJlcyBmdWxsIGF1dGguIENhbGwgYXV0aC5nZXRTZXNzaW9uIHVzaW5nIGxhc3RmbUFwaUF1dGggY2xhc3MnKTsNCgkJCXJldHVybiBGQUxTRTsNCgkJfQ0KCX0NCgkNCgkvKioNCgkgKiBBZGQgYW4gYXJ0aXN0IHRvIGEgdXNlcidzIExhc3QuZm0gbGlicmFyeSAoUmVxdWlyZXMgZnVsbCBhdXRoKQ0KCSAqIEBwYXJhbSBhcnJheSAkbWV0aG9kVmFycyBBbiBhcnJheSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVxdWlyZWQgdmFsdWVzOiA8aT5hcnRpc3Q8L2k+DQoJICogQHJldHVybiBib29sZWFuDQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGFkZEFydGlzdCgkbWV0aG9kVmFycykgew0KCQkvLyBPbmx5IGFsbG93IGZ1bGwgYXV0aGVkIGNhbGxzDQoJCWlmICggJHRoaXMtPmZ1bGxBdXRoID09IFRSVUUgKSB7DQoJCQkvLyBDaGVjayBmb3IgcmVxdWlyZWQgdmFyaWFibGVzDQoJCQlpZiAoICFlbXB0eSgkbWV0aG9kVmFyc1snYXJ0aXN0J10pICkgew0KCQkJCSR2YXJzID0gYXJyYXkoDQoJCQkJCSdtZXRob2QnID0+ICdsaWJyYXJ5LmFkZGFydGlzdCcsDQoJCQkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXV0aC0+YXBpS2V5LA0KCQkJCQknc2snID0+ICR0aGlzLT5hdXRoLT5zZXNzaW9uS2V5DQoJCQkJKTsNCgkJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkJJHNpZyA9ICR0aGlzLT5hcGlTaWcoJHRoaXMtPmF1dGgtPnNlY3JldCwgJHZhcnMpOw0KCQkJCSR2YXJzWydhcGlfc2lnJ10gPSAkc2lnOw0KCQkJCQ0KCQkJCWlmICggJGNhbGwgPSAkdGhpcy0+YXBpUG9zdENhbGwoJHZhcnMpICkgew0KCQkJCQlyZXR1cm4gVFJVRTsNCgkJCQl9DQoJCQkJZWxzZSB7DQoJCQkJCXJldHVybiBGQUxTRTsNCgkJCQl9DQoJCQl9DQoJCQllbHNlIHsNCgkJCQkvLyBHaXZlIGEgOTEgZXJyb3IgaWYgaW5jb3JyZWN0IHZhcmlhYmxlcyBhcmUgdXNlZA0KCQkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MSwgJ1lvdSBtdXN0IGluY2x1ZGUgYXJ0aXN0IHZhcmlhbGJlIGluIHRoZSBjYWxsIGZvciB0aGlzIG1ldGhvZCcpOw0KCQkJCXJldHVybiBGQUxTRTsNCgkJCX0NCgkJfQ0KCQllbHNlIHsNCgkJCS8vIEdpdmUgYSA5MiBlcnJvciBpZiBub3QgZnVsbHkgYXV0aGVkDQoJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTIsICdNZXRob2QgcmVxdWlyZXMgZnVsbCBhdXRoLiBDYWxsIGF1dGguZ2V0U2Vzc2lvbiB1c2luZyBsYXN0Zm1BcGlBdXRoIGNsYXNzJyk7DQoJCQlyZXR1cm4gRkFMU0U7DQoJCX0NCgl9DQoJDQoJLyoqDQoJICogQWRkIGEgdHJhY2sgdG8gYSB1c2VyJ3MgTGFzdC5mbSBsaWJyYXJ5IChSZXF1aXJlcyBmdWxsIGF1dGgpDQoJICogQHBhcmFtIGFycmF5ICRtZXRob2RWYXJzIEFuIGFycmF5IHdpdGggdGhlIGZvbGxvd2luZyByZXF1aXJlZCB2YWx1ZXM6IDxpPmFydGlzdDwvaT4sIDxpPnRyYWNrPC9pPg0KCSAqIEByZXR1cm4gYm9vbGVhbg0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBhZGRUcmFjaygkbWV0aG9kVmFycykgew0KCQkvLyBPbmx5IGFsbG93IGZ1bGwgYXV0aGVkIGNhbGxzDQoJCWlmICggJHRoaXMtPmZ1bGxBdXRoID09IFRSVUUgKSB7DQoJCQkvLyBDaGVjayBmb3IgcmVxdWlyZWQgdmFyaWFibGVzDQoJCQlpZiAoICFlbXB0eSgkbWV0aG9kVmFyc1snYXJ0aXN0J10pICYmICFlbXB0eSgkbWV0aG9kVmFyc1sndHJhY2snXSkgKSB7DQoJCQkJJHZhcnMgPSBhcnJheSgNCgkJCQkJJ21ldGhvZCcgPT4gJ2xpYnJhcnkuYWRkdHJhY2snLA0KCQkJCQknYXBpX2tleScgPT4gJHRoaXMtPmF1dGgtPmFwaUtleSwNCgkJCQkJJ3NrJyA9PiAkdGhpcy0+YXV0aC0+c2Vzc2lvbktleQ0KCQkJCSk7DQoJCQkJJHZhcnMgPSBhcnJheV9tZXJnZSgkdmFycywgJG1ldGhvZFZhcnMpOw0KCQkJCSRzaWcgPSAkdGhpcy0+YXBpU2lnKCR0aGlzLT5hdXRoLT5zZWNyZXQsICR2YXJzKTsNCgkJCQkkdmFyc1snYXBpX3NpZyddID0gJHNpZzsNCgkJCQkNCgkJCQlpZiAoICRjYWxsID0gJHRoaXMtPmFwaVBvc3RDYWxsKCR2YXJzKSApIHsNCgkJCQkJcmV0dXJuIFRSVUU7DQoJCQkJfQ0KCQkJCWVsc2Ugew0KCQkJCQlyZXR1cm4gRkFMU0U7DQoJCQkJfQ0KCQkJfQ0KCQkJZWxzZSB7DQoJCQkJLy8gR2l2ZSBhIDkxIGVycm9yIGlmIGluY29ycmVjdCB2YXJpYWJsZXMgYXJlIHVzZWQNCgkJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTEsICdZb3UgbXVzdCBpbmNsdWRlIGFydGlzdCBhbmQgdHJhY2sgdmFyaWFsYmVzIGluIHRoZSBjYWxsIGZvciB0aGlzIG1ldGhvZCcpOw0KCQkJCXJldHVybiBGQUxTRTsNCgkJCX0NCgkJfQ0KCQllbHNlIHsNCgkJCS8vIEdpdmUgYSA5MiBlcnJvciBpZiBub3QgZnVsbHkgYXV0aGVkDQoJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTIsICdNZXRob2QgcmVxdWlyZXMgZnVsbCBhdXRoLiBDYWxsIGF1dGguZ2V0U2Vzc2lvbiB1c2luZyBsYXN0Zm1BcGlBdXRoIGNsYXNzJyk7DQoJCQlyZXR1cm4gRkFMU0U7DQoJCX0NCgl9DQoJDQoJLyoqDQoJICogQSBwYWdpbmF0ZWQgbGlzdCBvZiBhbGwgdGhlIGFsYnVtcyBpbiBhIHVzZXIncyBsaWJyYXJ5LCB3aXRoIHBsYXkgY291bnRzIGFuZCB0YWcgY291bnRzDQoJICogQHBhcmFtIGFycmF5ICRtZXRob2RWYXJzIEFuIGFycmF5IHdpdGggdGhlIGZvbGxvd2luZyByZXF1aXJlZCB2YWx1ZXM6IDxpPnVzZXI8L2k+IGFuZCBvcHRpb25hbCB2YWx1ZXM6IDxpPnBhZ2U8L2k+LCA8aT5saW1pdDwvaT4NCgkgKiBAcmV0dXJuIGFycmF5DQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGdldEFsYnVtcygkbWV0aG9kVmFycykgew0KCQkvLyBDaGVjayBmb3IgcmVxdWlyZWQgdmFyaWFibGVzDQoJCWlmICggIWVtcHR5KCRtZXRob2RWYXJzWyd1c2VyJ10pICkgew0KCQkJJHZhcnMgPSBhcnJheSgNCgkJCQknbWV0aG9kJyA9PiAnbGlicmFyeS5nZXRhbGJ1bXMnLA0KCQkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXV0aC0+YXBpS2V5DQoJCQkpOw0KCQkJJHZhcnMgPSBhcnJheV9tZXJnZSgkdmFycywgJG1ldGhvZFZhcnMpOw0KCQkJDQoJCQlpZiAoICRjYWxsID0gJHRoaXMtPmFwaUdldENhbGwoJHZhcnMpICkgew0KCQkJCSRhbGJ1bXNbJ3BhZ2UnXSA9IChzdHJpbmcpICRjYWxsLT5hbGJ1bXNbJ3BhZ2UnXTsNCgkJCQkkYWxidW1zWydwZXJQYWdlJ10gPSAoc3RyaW5nKSAkY2FsbC0+YWxidW1zWydwZXJQYWdlJ107DQoJCQkJJGFsYnVtc1sndG90YWxQYWdlcyddID0gKHN0cmluZykgJGNhbGwtPmFsYnVtc1sndG90YWxQYWdlcyddOw0KCQkJCSRpID0gMDsNCgkJCQlmb3JlYWNoICggJGNhbGwtPmFsYnVtcy0+YWxidW0gYXMgJGFsYnVtICkgew0KCQkJCQkkYWxidW1zWydyZXN1bHRzJ11bJGldWyduYW1lJ10gPSAoc3RyaW5nKSAkYWxidW0tPm5hbWU7DQoJCQkJCS8vIFRISVMgRE9FU04nVCBXT1JLIEFTIERPQ1VNRU5URUQgIC0tLSAkYWxidW1zWydyZXN1bHRzJ11bJGldWydyYW5rJ10gPSAoc3RyaW5nKSAkYWxidW1bJ3JhbmsnXTsNCgkJCQkJJGFsYnVtc1sncmVzdWx0cyddWyRpXVsncGxheWNvdW50J10gPSAoc3RyaW5nKSAkYWxidW0tPnBsYXljb3VudDsNCgkJCQkJJGFsYnVtc1sncmVzdWx0cyddWyRpXVsndGFnY291bnQnXSA9IChzdHJpbmcpICRhbGJ1bS0+dGFnY291bnQ7DQoJCQkJCSRhbGJ1bXNbJ3Jlc3VsdHMnXVskaV1bJ21iaWQnXSA9IChzdHJpbmcpICRhbGJ1bS0+bWJpZDsNCgkJCQkJJGFsYnVtc1sncmVzdWx0cyddWyRpXVsndXJsJ10gPSAoc3RyaW5nKSAkYWxidW0tPnVybDsNCgkJCQkJJGFsYnVtc1sncmVzdWx0cyddWyRpXVsnYXJ0aXN0J11bJ25hbWUnXSA9IChzdHJpbmcpICRhbGJ1bS0+YXJ0aXN0LT5uYW1lOw0KCQkJCQkkYWxidW1zWydyZXN1bHRzJ11bJGldWydhcnRpc3QnXVsnbWJpZCddID0gKHN0cmluZykgJGFsYnVtLT5hcnRpc3QtPm1iaWQ7DQoJCQkJCSRhbGJ1bXNbJ3Jlc3VsdHMnXVskaV1bJ2FydGlzdCddWyd1cmwnXSA9IChzdHJpbmcpICRhbGJ1bS0+YXJ0aXN0LT51cmw7DQoJCQkJCSRhbGJ1bXNbJ3Jlc3VsdHMnXVskaV1bJ2ltYWdlJ11bJ3NtYWxsJ10gPSAoc3RyaW5nKSAkYWxidW0tPmltYWdlWzBdOw0KCQkJCQkkYWxidW1zWydyZXN1bHRzJ11bJGldWydpbWFnZSddWydtZWRpdW0nXSA9IChzdHJpbmcpICRhbGJ1bS0+aW1hZ2VbMV07DQoJCQkJCSRhbGJ1bXNbJ3Jlc3VsdHMnXVskaV1bJ2ltYWdlJ11bJ2xhcmdlJ10gPSAoc3RyaW5nKSAkYWxidW0tPmltYWdlWzJdOw0KCQkJCQkkaSsrOw0KCQkJCX0NCgkJCQlyZXR1cm4gJGFsYnVtczsNCgkJCX0NCgkJCWVsc2Ugew0KCQkJCXJldHVybiBGQUxTRTsNCgkJCX0NCgkJfQ0KCQllbHNlIHsNCgkJCS8vIEdpdmUgYSA5MSBlcnJvciBpZiBpbmNvcnJlY3QgdmFyaWFibGVzIGFyZSB1c2VkDQoJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTEsICdZb3UgbXVzdCBpbmNsdWRlIGEgdXNlciB2YXJpYWJsZSBpbiB0aGUgY2FsbCBmb3IgdGhpcyBtZXRob2QnKTsNCgkJCXJldHVybiBGQUxTRTsNCgkJfQ0KCX0NCgkNCgkvKioNCgkgKiBBIHBhZ2luYXRlZCBsaXN0IG9mIGFsbCB0aGUgYXJ0aXN0cyBpbiBhIHVzZXIncyBsaWJyYXJ5LCB3aXRoIHBsYXkgY291bnRzIGFuZCB0YWcgY291bnRzDQoJICogQHBhcmFtIGFycmF5ICRtZXRob2RWYXJzIEFuIGFycmF5IHdpdGggdGhlIGZvbGxvd2luZyByZXF1aXJlZCB2YWx1ZXM6IDxpPnVzZXI8L2k+IGFuZCBvcHRpb25hbCB2YWx1ZXM6IDxpPnBhZ2U8L2k+LCA8aT5saW1pdDwvaT4NCgkgKiBAcmV0dXJuIGFycmF5DQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGdldEFydGlzdHMoJG1ldGhvZFZhcnMpIHsNCgkJLy8gQ2hlY2sgZm9yIHJlcXVpcmVkIHZhcmlhYmxlcw0KCQlpZiAoICFlbXB0eSgkbWV0aG9kVmFyc1sndXNlciddKSApIHsNCgkJCSR2YXJzID0gYXJyYXkoDQoJCQkJJ21ldGhvZCcgPT4gJ2xpYnJhcnkuZ2V0YXJ0aXN0cycsDQoJCQkJJ2FwaV9rZXknID0+ICR0aGlzLT5hdXRoLT5hcGlLZXkNCgkJCSk7DQoJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkNCgkJCWlmICggJGNhbGwgPSAkdGhpcy0+YXBpR2V0Q2FsbCgkdmFycykgKSB7DQoJCQkJJGFydGlzdHNbJ3BhZ2UnXSA9IChzdHJpbmcpICRjYWxsLT5hcnRpc3RzWydwYWdlJ107DQoJCQkJJGFydGlzdHNbJ3BlclBhZ2UnXSA9IChzdHJpbmcpICRjYWxsLT5hcnRpc3RzWydwZXJQYWdlJ107DQoJCQkJJGFydGlzdHNbJ3RvdGFsUGFnZXMnXSA9IChzdHJpbmcpICRjYWxsLT5hcnRpc3RzWyd0b3RhbFBhZ2VzJ107DQoJCQkJJGkgPSAwOw0KCQkJCWZvcmVhY2ggKCAkY2FsbC0+YXJ0aXN0cy0+YXJ0aXN0IGFzICRhcnRpc3QgKSB7DQoJCQkJCSRhcnRpc3RzWydyZXN1bHRzJ11bJGldWyduYW1lJ10gPSAoc3RyaW5nKSAkYXJ0aXN0LT5uYW1lOw0KCQkJCQkvLyBUSElTIERPRVNOJ1QgV09SSyBBUyBET0NVTUVOVEVEICAtLS0gJGFydGlzdHNbJ3Jlc3VsdHMnXVskaV1bJ3JhbmsnXSA9IChzdHJpbmcpICRhcnRpc3RbJ3JhbmsnXTsNCgkJCQkJJGFydGlzdHNbJ3Jlc3VsdHMnXVskaV1bJ3BsYXljb3VudCddID0gKHN0cmluZykgJGFydGlzdC0+cGxheWNvdW50Ow0KCQkJCQkkYXJ0aXN0c1sncmVzdWx0cyddWyRpXVsndGFnY291bnQnXSA9IChzdHJpbmcpICRhcnRpc3QtPnRhZ2NvdW50Ow0KCQkJCQkkYXJ0aXN0c1sncmVzdWx0cyddWyRpXVsnbWJpZCddID0gKHN0cmluZykgJGFydGlzdC0+bWJpZDsNCgkJCQkJJGFydGlzdHNbJ3Jlc3VsdHMnXVskaV1bJ3VybCddID0gKHN0cmluZykgJGFydGlzdC0+dXJsOw0KCQkJCQkkYXJ0aXN0c1sncmVzdWx0cyddWyRpXVsnc3RyZWFtYWJsZSddID0gKHN0cmluZykgJGFydGlzdC0+c3RyZWFtYWJsZTsNCgkJCQkJJGFydGlzdHNbJ3Jlc3VsdHMnXVskaV1bJ2ltYWdlJ11bJ3NtYWxsJ10gPSAoc3RyaW5nKSAkYXJ0aXN0LT5pbWFnZVswXTsNCgkJCQkJJGFydGlzdHNbJ3Jlc3VsdHMnXVskaV1bJ2ltYWdlJ11bJ21lZGl1bSddID0gKHN0cmluZykgJGFydGlzdC0+aW1hZ2VbMV07DQoJCQkJCSRhcnRpc3RzWydyZXN1bHRzJ11bJGldWydpbWFnZSddWydsYXJnZSddID0gKHN0cmluZykgJGFydGlzdC0+aW1hZ2VbMl07DQoJCQkJCSRpKys7DQoJCQkJfQ0KCQkJCXJldHVybiAkYXJ0aXN0czsNCgkJCX0NCgkJCWVsc2Ugew0KCQkJCXJldHVybiBGQUxTRTsNCgkJCX0NCgkJfQ0KCQllbHNlIHsNCgkJCS8vIEdpdmUgYSA5MSBlcnJvciBpZiBpbmNvcnJlY3QgdmFyaWFibGVzIGFyZSB1c2VkDQoJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTEsICdZb3UgbXVzdCBpbmNsdWRlIGEgdXNlciB2YXJpYWJsZSBpbiB0aGUgY2FsbCBmb3IgdGhpcyBtZXRob2QnKTsNCgkJCXJldHVybiBGQUxTRTsNCgkJfQ0KCX0NCgkNCgkvKioNCgkgKiBBIHBhZ2luYXRlZCBsaXN0IG9mIGFsbCB0aGUgdHJhY2tzIGluIGEgdXNlcidzIGxpYnJhcnksIHdpdGggcGxheSBjb3VudHMgYW5kIHRhZyBjb3VudHMNCgkgKiBAcGFyYW0gYXJyYXkgJG1ldGhvZFZhcnMgQW4gYXJyYXkgd2l0aCB0aGUgZm9sbG93aW5nIHJlcXVpcmVkIHZhbHVlczogPGk+dXNlcjwvaT4gYW5kIG9wdGlvbmFsIHZhbHVlczogPGk+cGFnZTwvaT4sIDxpPmxpbWl0PC9pPg0KCSAqIEByZXR1cm4gYXJyYXkNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gZ2V0VHJhY2tzKCRtZXRob2RWYXJzKSB7DQoJCS8vIENoZWNrIGZvciByZXF1aXJlZCB2YXJpYWJsZXMNCgkJaWYgKCAhZW1wdHkoJG1ldGhvZFZhcnNbJ3VzZXInXSkgKSB7DQoJCQkkdmFycyA9IGFycmF5KA0KCQkJCSdtZXRob2QnID0+ICdsaWJyYXJ5LmdldHRyYWNrcycsDQoJCQkJJ2FwaV9rZXknID0+ICR0aGlzLT5hdXRoLT5hcGlLZXkNCgkJCSk7DQoJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkNCgkJCWlmICggJGNhbGwgPSAkdGhpcy0+YXBpR2V0Q2FsbCgkdmFycykgKSB7DQoJCQkJJHRyYWNrc1sncGFnZSddID0gKHN0cmluZykgJGNhbGwtPnRyYWNrc1sncGFnZSddOw0KCQkJCSR0cmFja3NbJ3BlclBhZ2UnXSA9IChzdHJpbmcpICRjYWxsLT50cmFja3NbJ3BlclBhZ2UnXTsNCgkJCQkkdHJhY2tzWyd0b3RhbFBhZ2VzJ10gPSAoc3RyaW5nKSAkY2FsbC0+dHJhY2tzWyd0b3RhbFBhZ2VzJ107DQoJCQkJJGkgPSAwOw0KCQkJCWZvcmVhY2ggKCAkY2FsbC0+dHJhY2tzLT50cmFjayBhcyAkdHJhY2sgKSB7DQoJCQkJCSR0cmFja3NbJ3Jlc3VsdHMnXVskaV1bJ25hbWUnXSA9IChzdHJpbmcpICR0cmFjay0+bmFtZTsNCgkJCQkJLy8gVEhJUyBET0VTTidUIFdPUksgQVMgRE9DVU1FTlRFRCAgLS0tICR0cmFja3NbJ3Jlc3VsdHMnXVskaV1bJ3JhbmsnXSA9IChzdHJpbmcpICR0cmFja1sncmFuayddOw0KCQkJCQkkdHJhY2tzWydyZXN1bHRzJ11bJGldWydwbGF5Y291bnQnXSA9IChzdHJpbmcpICR0cmFjay0+cGxheWNvdW50Ow0KCQkJCQkkdHJhY2tzWydyZXN1bHRzJ11bJGldWyd0YWdjb3VudCddID0gKHN0cmluZykgJHRyYWNrLT50YWdjb3VudDsNCgkJCQkJJHRyYWNrc1sncmVzdWx0cyddWyRpXVsndXJsJ10gPSAoc3RyaW5nKSAkdHJhY2stPnVybDsNCgkJCQkJJHRyYWNrc1sncmVzdWx0cyddWyRpXVsnc3RyZWFtYWJsZSddID0gKHN0cmluZykgJHRyYWNrLT5zdHJlYW1hYmxlOw0KCQkJCQkkdHJhY2tzWydyZXN1bHRzJ11bJGldWydmdWxsdHJhY2snXSA9IChzdHJpbmcpICR0cmFjay0+c3RyZWFtYWJsZVsnZnVsbHRyYWNrJ107DQoJCQkJCSR0cmFja3NbJ3Jlc3VsdHMnXVskaV1bJ2FydGlzdCddWyduYW1lJ10gPSAoc3RyaW5nKSAkdHJhY2stPmFydGlzdC0+bmFtZTsNCgkJCQkJJHRyYWNrc1sncmVzdWx0cyddWyRpXVsnYXJ0aXN0J11bJ21iaWQnXSA9IChzdHJpbmcpICR0cmFjay0+YXJ0aXN0LT5tYmlkOw0KCQkJCQkkdHJhY2tzWydyZXN1bHRzJ11bJGldWydhcnRpc3QnXVsndXJsJ10gPSAoc3RyaW5nKSAkdHJhY2stPmFydGlzdC0+dXJsOw0KCQkJCQkkdHJhY2tzWydyZXN1bHRzJ11bJGldWydpbWFnZSddWydzbWFsbCddID0gKHN0cmluZykgJHRyYWNrLT5pbWFnZVswXTsNCgkJCQkJJHRyYWNrc1sncmVzdWx0cyddWyRpXVsnaW1hZ2UnXVsnbWVkaXVtJ10gPSAoc3RyaW5nKSAkdHJhY2stPmltYWdlWzFdOw0KCQkJCQkkdHJhY2tzWydyZXN1bHRzJ11bJGldWydpbWFnZSddWydsYXJnZSddID0gKHN0cmluZykgJHRyYWNrLT5pbWFnZVsyXTsNCgkJCQkJJGkrKzsNCgkJCQl9DQoJCQkJcmV0dXJuICR0cmFja3M7DQoJCQl9DQoJCQllbHNlIHsNCgkJCQlyZXR1cm4gRkFMU0U7DQoJCQl9DQoJCX0NCgkJZWxzZSB7DQoJCQkvLyBHaXZlIGEgOTEgZXJyb3IgaWYgaW5jb3JyZWN0IHZhcmlhYmxlcyBhcmUgdXNlZA0KCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkxLCAnWW91IG11c3QgaW5jbHVkZSBhIHVzZXIgdmFyaWFibGUgaW4gdGhlIGNhbGwgZm9yIHRoaXMgbWV0aG9kJyk7DQoJCQlyZXR1cm4gRkFMU0U7DQoJCX0NCgl9DQp9DQoNCj8+]]></data>
	</file>
	<file>
	  <filename>/lib/lastfmapi/api/playlist.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogRmlsZSB0aGF0IHN0b3JlcyBhcGkgY2FsbHMgZm9yIHVzZXIgcGxheWxpc3RzIGFwaSBjYWxscw0KICogQHBhY2thZ2UgYXBpY2FsbHMNCiAqLw0KLyoqDQogKiBBbGxvd3MgYWNjZXNzIHRvIHRoZSBhcGkgcmVxdWVzdHMgcmVsYXRpbmcgdG8gdXNlciBwbGF5bGlzdHMNCiAqIEBwYWNrYWdlIGFwaWNhbGxzDQogKi8NCmNsYXNzIGxhc3RmbUFwaVBsYXlsaXN0IGV4dGVuZHMgbGFzdGZtQXBpIHsNCgkvKioNCgkgKiBTdG9yZXMgdGhlIGNvbmZpZyB2YWx1ZXMgc2V0IGluIHRoZSBjYWxsDQoJICogQGFjY2VzcyBwdWJsaWMNCgkgKiBAdmFyIGFycmF5DQoJICovDQoJcHVibGljICRjb25maWc7DQoJLyoqDQoJICogU3RvcmVzIHRoZSBhdXRoIHZhcmlhYmxlcyB1c2VkIGluIGFsbCBhcGkgY2FsbHMNCgkgKiBAYWNjZXNzIHByaXZhdGUNCgkgKiBAdmFyIGFycmF5DQoJICovDQoJcHJpdmF0ZSAkYXV0aDsNCgkvKioNCgkgKiBTdGF0ZXMgaWYgdGhlIHVzZXIgaGFzIGZ1bGwgYXV0aGVudGljYXRpb24gdG8gdXNlIGFwaSByZXF1ZXN0cyB0aGF0IG1vZGlmeSBkYXRhDQoJICogQGFjY2VzcyBwcml2YXRlDQoJICogQHZhciBib29sZWFuDQoJICovDQoJcHJpdmF0ZSAkZnVsbEF1dGg7DQoJDQoJLyoqDQoJICogQHBhcmFtIGFycmF5ICRhdXRoIFBhc3NlcyB0aGUgYXV0aGVudGljYXRpb24gdmFyaWFibGVzDQoJICogQHBhcmFtIGFycmF5ICRmdWxsQXV0aCBBIGJvb2xlYW4gdmFsdWUgc3RhdGluZyBpZiB0aGUgdXNlciBoYXMgZnVsbCBhdXRoZW50aWNhdGlvbiBvciBub3QNCgkgKiBAcGFyYW0gYXJyYXkgJGNvbmZpZyBBbiBhcnJheSBvZiBjb25maWcgdmFyaWFibGVzIHJlbGF0ZWQgdG8gY2FjaGluZyBhbmQgb3RoZXIgZmVhdHVyZXMNCgkgKi8NCglmdW5jdGlvbiBfX2NvbnN0cnVjdCgkYXV0aCwgJGZ1bGxBdXRoLCAkY29uZmlnKSB7DQoJCSR0aGlzLT5hdXRoID0gJGF1dGg7DQoJCSR0aGlzLT5mdWxsQXV0aCA9ICRmdWxsQXV0aDsNCgkJJHRoaXMtPmNvbmZpZyA9ICRjb25maWc7DQoJfQ0KCQ0KCS8qKg0KCSAqIEFkZCBhIHRyYWNrIHRvIGEgTGFzdC5mbSB1c2VyJ3MgcGxheWxpc3QgKFJlcXVpcmVzIGZ1bGwgYXV0aCkNCgkgKiBAcGFyYW0gYXJyYXkgJG1ldGhvZFZhcnMgQW4gYXJyYXkgd2l0aCB0aGUgZm9sbG93aW5nIHJlcXVpcmVkIHZhbHVlczogPGk+cGxheWxpc3RJZDwvaT4sIDxpPmFydGlzdDwvaT4sIDxpPnRyYWNrPC9pPg0KCSAqIEByZXR1cm4gYm9vbGVhbg0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBhZGRUcmFjaygkbWV0aG9kVmFycykgew0KCQkvLyBPbmx5IGFsbG93IGZ1bGwgYXV0aGVkIGNhbGxzDQoJCWlmICggJHRoaXMtPmZ1bGxBdXRoID09IFRSVUUgKSB7DQoJCQkvLyBDaGVjayBmb3IgcmVxdWlyZWQgdmFyaWFibGVzDQoJCQlpZiAoICFlbXB0eSgkbWV0aG9kVmFyc1sncGxheWxpc3RJRCddKSAmJiAhZW1wdHkoJG1ldGhvZFZhcnNbJ2FydGlzdCddKSAmJiAhZW1wdHkoJG1ldGhvZFZhcnNbJ3RyYWNrJ10pICkgew0KCQkJCSR2YXJzID0gYXJyYXkoDQoJCQkJCSdtZXRob2QnID0+ICdwbGF5bGlzdC5hZGR0cmFjaycsDQoJCQkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXV0aC0+YXBpS2V5LA0KCQkJCQknc2snID0+ICR0aGlzLT5hdXRoLT5zZXNzaW9uS2V5DQoJCQkJKTsNCgkJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkJJHNpZyA9ICR0aGlzLT5hcGlTaWcoJHRoaXMtPmF1dGgtPnNlY3JldCwgJHZhcnMpOw0KCQkJCSR2YXJzWydhcGlfc2lnJ10gPSAkc2lnOw0KCQkJCQ0KCQkJCWlmICggJGNhbGwgPSAkdGhpcy0+YXBpUG9zdENhbGwoJHZhcnMpICkgew0KCQkJCQlyZXR1cm4gVFJVRTsNCgkJCQl9DQoJCQkJZWxzZSB7DQoJCQkJCXJldHVybiBGQUxTRTsNCgkJCQl9DQoJCQl9DQoJCQllbHNlIHsNCgkJCQkvLyBHaXZlIGEgOTEgZXJyb3IgaWYgaW5jb3JyZWN0IHZhcmlhYmxlcyBhcmUgdXNlZA0KCQkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MSwgJ1lvdSBtdXN0IGluY2x1ZGUgcGxheWxpc3RJZCwgYXJ0aXN0IGFuZCB0cmFjayB2YXJpYWxiZXMgaW4gdGhlIGNhbGwgZm9yIHRoaXMgbWV0aG9kJyk7DQoJCQkJcmV0dXJuIEZBTFNFOw0KCQkJfQ0KCQl9DQoJCWVsc2Ugew0KCQkJLy8gR2l2ZSBhIDkyIGVycm9yIGlmIG5vdCBmdWxseSBhdXRoZWQNCgkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MiwgJ01ldGhvZCByZXF1aXJlcyBmdWxsIGF1dGguIENhbGwgYXV0aC5nZXRTZXNzaW9uIHVzaW5nIGxhc3RmbUFwaUF1dGggY2xhc3MnKTsNCgkJCXJldHVybiBGQUxTRTsNCgkJfQ0KCX0NCgkNCgkvKioNCgkgKiBDcmVhdGUgYSBMYXN0LmZtIHBsYXlsaXN0IG9uIGJlaGFsZiBvZiBhIHVzZXIgKFJlcXVpcmVzIGZ1bGwgYXV0aCkNCgkgKiBAcGFyYW0gYXJyYXkgJG1ldGhvZFZhcnMgQW4gYXJyYXkgd2l0aCB0aGUgZm9sbG93aW5nIG9wdGlvbmFsIHZhbHVlczogPGk+dGl0bGU8L2k+LCA8aT5kZXNjcmlwdGlvbjwvaT4NCgkgKiBAcmV0dXJuIGFycmF5DQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGNyZWF0ZSgkbWV0aG9kVmFycykgew0KCQkvLyBPbmx5IGFsbG93IGZ1bGwgYXV0aGVkIGNhbGxzDQoJCWlmICggJHRoaXMtPmZ1bGxBdXRoID09IFRSVUUgKSB7DQoJCQkkdmFycyA9IGFycmF5KA0KCQkJCSdtZXRob2QnID0+ICdwbGF5bGlzdC5jcmVhdGUnLA0KCQkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXV0aC0+YXBpS2V5LA0KCQkJCSdzaycgPT4gJHRoaXMtPmF1dGgtPnNlc3Npb25LZXkNCgkJCSk7DQoJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkkc2lnID0gJHRoaXMtPmFwaVNpZygkdGhpcy0+YXV0aC0+c2VjcmV0LCAkdmFycyk7DQoJCQkkdmFyc1snYXBpX3NpZyddID0gJHNpZzsNCgkJCQ0KCQkJaWYgKCAkY2FsbCA9ICR0aGlzLT5hcGlQb3N0Q2FsbCgkdmFycywgJ3htbCcpICkgew0KCQkJCSRwbGF5bGlzdFsndXNlciddID0gKHN0cmluZykgJGNhbGwtPnBsYXlsaXN0c1sndXNlciddOw0KCQkJCSRwbGF5bGlzdFsnaWQnXSA9IChzdHJpbmcpICRjYWxsLT5wbGF5bGlzdHMtPnBsYXlsaXN0LT5pZDsNCgkJCQkkcGxheWxpc3RbJ3RpdGxlJ10gPSAoc3RyaW5nKSAkY2FsbC0+cGxheWxpc3RzLT5wbGF5bGlzdC0+dGl0bGU7DQoJCQkJJHBsYXlsaXN0WydkZXNjcmlwdGlvbiddID0gKHN0cmluZykgJGNhbGwtPnBsYXlsaXN0cy0+cGxheWxpc3QtPmRlc2NyaXB0aW9uOw0KCQkJCSRwbGF5bGlzdFsnZGF0ZSddID0gc3RydG90aW1lKHRyaW0oKHN0cmluZykgJGNhbGwtPnBsYXlsaXN0cy0+cGxheWxpc3QtPmRhdGUpKTs7DQoJCQkJJHBsYXlsaXN0WydzaXplJ10gPSAoc3RyaW5nKSAkY2FsbC0+cGxheWxpc3RzLT5wbGF5bGlzdC0+c2l6ZTsNCgkJCQkkcGxheWxpc3RbJ2R1cmF0aW9uJ10gPSAoc3RyaW5nKSAkY2FsbC0+cGxheWxpc3RzLT5wbGF5bGlzdC0+ZHVyYXRpb247DQoJCQkJJHBsYXlsaXN0WydjcmVhdG9yJ10gPSAoc3RyaW5nKSAkY2FsbC0+cGxheWxpc3RzLT5wbGF5bGlzdC0+Y3JlYXRvcjsNCgkJCQkkcGxheWxpc3RbJ3VybCddID0gKHN0cmluZykgJGNhbGwtPnBsYXlsaXN0cy0+cGxheWxpc3QtPnVybDsNCgkJCQkkcGxheWxpc3RbJ2ltYWdlJ11bJ3NtYWxsJ10gPSAoc3RyaW5nKSAkY2FsbC0+cGxheWxpc3RzLT5wbGF5bGlzdC0+aW1hZ2VbMF07DQoJCQkJJHBsYXlsaXN0WydpbWFnZSddWydtZWRpdW0nXSA9IChzdHJpbmcpICRjYWxsLT5wbGF5bGlzdHMtPnBsYXlsaXN0LT5pbWFnZVsxXTsNCgkJCQkkcGxheWxpc3RbJ2ltYWdlJ11bJ2xhcmdlJ10gPSAoc3RyaW5nKSAkY2FsbC0+cGxheWxpc3RzLT5wbGF5bGlzdC0+aW1hZ2VbMl07DQoJCQkJDQoJCQkJcmV0dXJuICRwbGF5bGlzdDsNCgkJCX0NCgkJCWVsc2Ugew0KCQkJCXJldHVybiBGQUxTRTsNCgkJCX0NCgkJfQ0KCQllbHNlIHsNCgkJCS8vIEdpdmUgYSA5MiBlcnJvciBpZiBub3QgZnVsbHkgYXV0aGVkDQoJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTIsICdNZXRob2QgcmVxdWlyZXMgZnVsbCBhdXRoLiBDYWxsIGF1dGguZ2V0U2Vzc2lvbiB1c2luZyBsYXN0Zm1BcGlBdXRoIGNsYXNzJyk7DQoJCQlyZXR1cm4gRkFMU0U7DQoJCX0NCgl9DQoJDQoJLyoqDQoJICogRmV0Y2ggWFNQRiBwbGF5bGlzdHMgdXNpbmcgYSBsYXN0Zm0gcGxheWxpc3QgdXJsDQoJICogQHBhcmFtIGFycmF5ICRtZXRob2RWYXJzIEFuIGFycmF5IHdpdGggdGhlIGZvbGxvd2luZyByZXF1aXJlZCB2YWx1ZXM6IDxpPnBsYXlsaXN0VXJsPC9pPg0KCSAqIEByZXR1cm4gYXJyYXkNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gZmV0Y2goJG1ldGhvZFZhcnMpIHsNCgkJLy8gQ2hlY2sgZm9yIHJlcXVpcmVkIHZhcmlhYmxlcw0KCQlpZiAoICFlbXB0eSgkbWV0aG9kVmFyc1sncGxheWxpc3RVUkwnXSkgKSB7DQoJCQkkdmFycyA9IGFycmF5KA0KCQkJCSdtZXRob2QnID0+ICdwbGF5bGlzdC5mZXRjaCcsDQoJCQkJJ2FwaV9rZXknID0+ICR0aGlzLT5hdXRoLT5hcGlLZXkNCgkJCSk7DQoJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkNCgkJCWlmICggJGNhbGwgPSAkdGhpcy0+YXBpR2V0Q2FsbCgkdmFycykgKSB7DQoJCQkJJHBsYXlsaXN0Wyd0aXRsZSddID0gKHN0cmluZykgJGNhbGwtPnBsYXlsaXN0LT50aXRsZTsNCgkJCQkkcGxheWxpc3RbJ2Fubm90YXRpb24nXSA9IChzdHJpbmcpICRjYWxsLT5wbGF5bGlzdC0+YW5ub3RhdGlvbjsNCgkJCQkkcGxheWxpc3RbJ2NyZWF0b3InXSA9IChzdHJpbmcpICRjYWxsLT5wbGF5bGlzdC0+Y3JlYXRvcjsNCgkJCQkkcGxheWxpc3RbJ2RhdGUnXSA9IHN0cnRvdGltZSh0cmltKChzdHJpbmcpICRjYWxsLT5wbGF5bGlzdC0+ZGF0ZSkpOw0KCQkJCSRwbGF5bGlzdFsndmVyc2lvbiddID0gKHN0cmluZykgJGNhbGwtPnBsYXlsaXN0Wyd2ZXJzaW9uJ107DQoJCQkJJGkgPSAwOw0KCQkJCWZvcmVhY2ggKCAkY2FsbC0+cGxheWxpc3QtPnRyYWNrTGlzdC0+dHJhY2sgYXMgJHRyYWNrICkgew0KCQkJCQkkcGxheWxpc3RbJ3RyYWNrbGlzdGluZyddWyRpXVsndGl0bGUnXSA9IChzdHJpbmcpICR0cmFjay0+dGl0bGU7DQoJCQkJCSRwbGF5bGlzdFsndHJhY2tsaXN0aW5nJ11bJGldWyd1cmwnXSA9IChzdHJpbmcpICR0cmFjay0+ZXh0ZW5zaW9uLT50cmFja3BhZ2U7DQoJCQkJCSRwbGF5bGlzdFsndHJhY2tsaXN0aW5nJ11bJGldWydkdXJhdGlvbiddID0gKHN0cmluZykgJHRyYWNrLT5kdXJhdGlvbjsNCgkJCQkJJHBsYXlsaXN0Wyd0cmFja2xpc3RpbmcnXVskaV1bJ2luZm8nXSA9IChzdHJpbmcpICR0cmFjay0+aW5mbzsNCgkJCQkJJHBsYXlsaXN0Wyd0cmFja2xpc3RpbmcnXVskaV1bJ2ltYWdlJ10gPSAoc3RyaW5nKSAkdHJhY2stPmltYWdlOw0KCQkJCQkkcGxheWxpc3RbJ3RyYWNrbGlzdGluZyddWyRpXVsnYXJ0aXN0J11bJ25hbWUnXSA9IChzdHJpbmcpICR0cmFjay0+Y3JlYXRvcjsNCgkJCQkJJHBsYXlsaXN0Wyd0cmFja2xpc3RpbmcnXVskaV1bJ2FydGlzdCddWyd1cmwnXSA9IChzdHJpbmcpICR0cmFjay0+ZXh0ZW5zaW9uLT5hcnRpc3RwYWdlOw0KCQkJCQkkcGxheWxpc3RbJ3RyYWNrbGlzdGluZyddWyRpXVsnYWxidW0nXVsnbmFtZSddID0gKHN0cmluZykgJHRyYWNrLT5hbGJ1bTsNCgkJCQkJJHBsYXlsaXN0Wyd0cmFja2xpc3RpbmcnXVskaV1bJ2FsYnVtJ11bJ3VybCddID0gKHN0cmluZykgJHRyYWNrLT5leHRlbnNpb24tPmFsYnVtcGFnZTsNCgkJCQkJJGkrKzsNCgkJCQl9DQoJCQkJcmV0dXJuICRwbGF5bGlzdDsNCgkJCX0NCgkJCWVsc2Ugew0KCQkJCXJldHVybiBGQUxTRTsNCgkJCX0NCgkJfQ0KCQllbHNlIHsNCgkJCS8vIEdpdmUgYSA5MSBlcnJvciBpZiBpbmNvcnJlY3QgdmFyaWFibGVzIGFyZSB1c2VkDQoJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTEsICdZb3UgbXVzdCBpbmNsdWRlIHBsYXlsaXN0VXJsIHZhcmlhbGJlIGluIHRoZSBjYWxsIGZvciB0aGlzIG1ldGhvZCcpOw0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoJfQ0KfQ0KDQo/Pg==]]></data>
	</file>
	<file>
	  <filename>/lib/lastfmapi/api/radio.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogRmlsZSB0aGF0IHN0b3JlcyBhcGkgY2FsbHMgZm9yIHJhZGlvIGFwaSBjYWxscw0KICogQHBhY2thZ2UgYXBpY2FsbHMNCiAqLw0KLyoqDQogKiBBbGxvd3MgYWNjZXNzIHRvIHRoZSBhcGkgcmVxdWVzdHMgcmVsYXRpbmcgdG8gdGhlIGxhc3RmbSByYWRpbw0KICogQHBhY2thZ2UgYXBpY2FsbHMNCiAqLw0KY2xhc3MgbGFzdGZtQXBpUmFkaW8gZXh0ZW5kcyBsYXN0Zm1BcGkgew0KCS8qKg0KCSAqIFN0b3JlcyB0aGUgY29uZmlnIHZhbHVlcyBzZXQgaW4gdGhlIGNhbGwNCgkgKiBAYWNjZXNzIHB1YmxpYw0KCSAqIEB2YXIgYXJyYXkNCgkgKi8NCglwdWJsaWMgJGNvbmZpZzsNCgkvKioNCgkgKiBTdG9yZXMgdGhlIGF1dGggdmFyaWFibGVzIHVzZWQgaW4gYWxsIGFwaSBjYWxscw0KCSAqIEBhY2Nlc3MgcHJpdmF0ZQ0KCSAqIEB2YXIgYXJyYXkNCgkgKi8NCglwcml2YXRlICRhdXRoOw0KCS8qKg0KCSAqIFN0YXRlcyBpZiB0aGUgdXNlciBoYXMgZnVsbCBhdXRoZW50aWNhdGlvbiB0byB1c2UgYXBpIHJlcXVlc3RzIHRoYXQgbW9kaWZ5IGRhdGENCgkgKiBAYWNjZXNzIHByaXZhdGUNCgkgKiBAdmFyIGJvb2xlYW4NCgkgKi8NCglwcml2YXRlICRmdWxsQXV0aDsNCgkNCgkvKioNCgkgKiBAcGFyYW0gYXJyYXkgJGF1dGggUGFzc2VzIHRoZSBhdXRoZW50aWNhdGlvbiB2YXJpYWJsZXMNCgkgKiBAcGFyYW0gYXJyYXkgJGZ1bGxBdXRoIEEgYm9vbGVhbiB2YWx1ZSBzdGF0aW5nIGlmIHRoZSB1c2VyIGhhcyBmdWxsIGF1dGhlbnRpY2F0aW9uIG9yIG5vdA0KCSAqIEBwYXJhbSBhcnJheSAkY29uZmlnIEFuIGFycmF5IG9mIGNvbmZpZyB2YXJpYWJsZXMgcmVsYXRlZCB0byBjYWNoaW5nIGFuZCBvdGhlciBmZWF0dXJlcw0KCSAqLw0KCWZ1bmN0aW9uIF9fY29uc3RydWN0KCRhdXRoLCAkZnVsbEF1dGgsICRjb25maWcpIHsNCgkJJHRoaXMtPmF1dGggPSAkYXV0aDsNCgkJJHRoaXMtPmZ1bGxBdXRoID0gJGZ1bGxBdXRoOw0KCQkkdGhpcy0+Y29uZmlnID0gJGNvbmZpZzsNCgl9DQoJDQoJLyoqDQoJICogVHVuZSBpbnRvIGEgcmFkaW8gc3RhdGlvbiB1c2luZyBhIGxhc3RmbSByYWRpbyB1cmwuIChSZXF1aXJlcyBmdWxsIGF1dGgpDQoJICogQHBhcmFtIGFycmF5ICRtZXRob2RWYXJzIEFuIGFycmF5IHdpdGggdGhlIGZvbGxvd2luZyByZXF1aXJlZCB2YWx1ZTogPGk+c3RhdGlvbjwvaT4gYW5kIHRoZSBmb2xsb3dpbmcgb3B0aW9uYWwgdmFsdWU6IDxpPmxhbmc8L2k+IA0KCSAqIEByZXR1cm4gYXJyYXkNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gdHVuZSgkbWV0aG9kVmFycykgew0KCQkvLyBPbmx5IGFsbG93IGZ1bGwgYXV0aGVkIGNhbGxzDQoJCWlmICggJHRoaXMtPmZ1bGxBdXRoID09IFRSVUUgKSB7DQoJCQkvLyBDaGVjayBmb3IgcmVxdWlyZWQgdmFyaWFibGVzDQoJCQlpZiAoICFlbXB0eSgkbWV0aG9kVmFyc1snc3RhdGlvbiddKSApIHsNCgkJCQkkdmFycyA9IGFycmF5KA0KCQkJCQknbWV0aG9kJyA9PiAncmFkaW8udHVuZScsDQoJCQkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXV0aC0+YXBpS2V5LA0KCQkJCQknc2snID0+ICR0aGlzLT5hdXRoLT5zZXNzaW9uS2V5DQoJCQkJKTsNCgkJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkJDQoJCQkJJHNpZyA9ICR0aGlzLT5hcGlTaWcoJHRoaXMtPmF1dGgtPnNlY3JldCwgJHZhcnMpOw0KCQkJCSR2YXJzWydhcGlfc2lnJ10gPSAkc2lnOw0KCQkJCQ0KCQkJCWlmICggJGNhbGwgPSAkdGhpcy0+YXBpUG9zdENhbGwoJHZhcnMpICkgew0KCQkJCQkkdHVuZVsndHlwZSddID0gKHN0cmluZykgJGNhbGwtPnN0YXRpb24tPnR5cGU7DQoJCQkJCSR0dW5lWyduYW1lJ10gPSAoc3RyaW5nKSAkY2FsbC0+c3RhdGlvbi0+bmFtZTsNCgkJCQkJJHR1bmVbJ3VybCddID0gKHN0cmluZykgJGNhbGwtPnN0YXRpb24tPnVybDsNCgkJCQkJJHR1bmVbJ3N1cHBvcnRzZGlzY292ZXJ5J10gPSAoc3RyaW5nKSAkY2FsbC0+c3RhdGlvbi0+c3VwcG9ydHNkaXNjb3Zlcnk7DQoJCQkJCQ0KCQkJCQlyZXR1cm4gJHR1bmU7DQoJCQkJfQ0KCQkJCWVsc2Ugew0KCQkJCQlyZXR1cm4gRkFMU0U7DQoJCQkJfQ0KCQkJfQ0KCQkJZWxzZSB7DQoJCQkJLy8gR2l2ZSBhIDkxIGVycm9yIGlmIGluY29ycmVjdCB2YXJpYWJsZXMgYXJlIHVzZWQNCgkJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTEsICdZb3UgbXVzdCBpbmNsdWRlIGV2ZW50SWQgYW5kIHN0YXR1cyB2YXJpYWxiZXMgaW4gdGhlIGNhbGwgZm9yIHRoaXMgbWV0aG9kJyk7DQoJCQkJcmV0dXJuIEZBTFNFOw0KCQkJfQ0KCQl9DQoJCWVsc2Ugew0KCQkJLy8gR2l2ZSBhIDkyIGVycm9yIGlmIG5vdCBmdWxseSBhdXRoZWQNCgkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MiwgJ01ldGhvZCByZXF1aXJlcyBmdWxsIGF1dGguIENhbGwgYXV0aC5nZXRTZXNzaW9uIHVzaW5nIGxhc3RmbUFwaUF1dGggY2xhc3MnKTsNCgkJCXJldHVybiBGQUxTRTsNCgkJfQ0KCX0NCgkNCgkvKioNCgkgKiBHZXQgYSBwbGF5bGlzdCBvZiBzb25ncyB0byBwbGF5IHVzaW5nIHRoZSByYWRpbyBBUEkuIE11c3QgcnVuIHJhZGlvLnR1bmUgZmlyc3QuIChSZXF1aXJlcyBmdWxsIGF1dGgpDQoJICogQHBhcmFtIGFycmF5ICRtZXRob2RWYXJzIEFuIGFycmF5IHdpdGggdGhlIGZvbGxvd2luZyBvcHRpb25hbCB2YWx1ZXM6IDxpPmRpc2NvdmVyeTwvaT4gYW5kIDxpPnJ0cDwvaT4NCgkgKiBAcmV0dXJuIGFycmF5DQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGdldFBsYXlsaXN0KCRtZXRob2RWYXJzID0gQXJyYXkoKSkgew0KCQkvLyBPbmx5IGFsbG93IGZ1bGwgYXV0aGVkIGNhbGxzDQoJCWlmICggJHRoaXMtPmZ1bGxBdXRoID09IFRSVUUgKSB7DQoJCQkkdmFycyA9IGFycmF5KA0KCQkJCSdtZXRob2QnID0+ICdyYWRpby5nZXRQbGF5bGlzdCcsDQoJCQkJJ2FwaV9rZXknID0+ICR0aGlzLT5hdXRoLT5hcGlLZXksDQoJCQkJJ3NrJyA9PiAkdGhpcy0+YXV0aC0+c2Vzc2lvbktleQ0KCQkJKTsNCgkJCSR2YXJzID0gYXJyYXlfbWVyZ2UoJHZhcnMsICRtZXRob2RWYXJzKTsNCgkJCQ0KCQkJJHNpZyA9ICR0aGlzLT5hcGlTaWcoJHRoaXMtPmF1dGgtPnNlY3JldCwgJHZhcnMpOw0KCQkJJHZhcnNbJ2FwaV9zaWcnXSA9ICRzaWc7DQoJCQkNCgkJCWlmICggJGNhbGwgPSAkdGhpcy0+YXBpUG9zdENhbGwoJHZhcnMpICkgew0KCQkJCSRwbGF5bGlzdFsndmVyc2lvbiddID0gKHN0cmluZykgJGNhbGwtPnBsYXlsaXN0Wyd2ZXJzaW9uJ107DQoJCQkJJHBsYXlsaXN0Wyd0aXRsZSddID0gKHN0cmluZykgJGNhbGwtPnBsYXlsaXN0LT50aXRsZTsNCgkJCQkkcGxheWxpc3RbJ2NyZWF0b3InXSA9IChzdHJpbmcpICRjYWxsLT5wbGF5bGlzdC0+Y3JlYXRvcjsNCgkJCQkkcGxheWxpc3RbJ2RhdGUnXSA9IHN0cnRvdGltZSgoc3RyaW5nKSAkY2FsbC0+cGxheWxpc3QtPmRhdGUpOw0KCQkJCSRwbGF5bGlzdFsnZXhwaXJlJ10gPSAoc3RyaW5nKSAkY2FsbC0+cGxheWxpc3QtPmxpbms7DQoJCQkJaWYgKCBjb3VudCgkY2FsbC0+cGxheWxpc3QtPnRyYWNrTGlzdCkgPiAwICkgew0KCQkJCQkkaSA9IDA7DQoJCQkJCWZvcmVhY2ggKCAkY2FsbC0+cGxheWxpc3QtPnRyYWNrTGlzdC0+dHJhY2sgYXMgJHRyYWNrICkgew0KCQkJCQkJJHBsYXlsaXN0Wyd0cmFja2xpc3QnXVskaV1bJ2xvY2F0aW9uJ10gPSAoc3RyaW5nKSAkdHJhY2stPmxvY2F0aW9uOw0KCQkJCQkJJHBsYXlsaXN0Wyd0cmFja2xpc3QnXVskaV1bJ3RpdGxlJ10gPSAoc3RyaW5nKSAkdHJhY2stPnRpdGxlOw0KCQkJCQkJJHBsYXlsaXN0Wyd0cmFja2xpc3QnXVskaV1bJ2lkZW50aWZpZXInXSA9IChzdHJpbmcpICR0cmFjay0+aWRlbnRpZmllcjsNCgkJCQkJCSRwbGF5bGlzdFsndHJhY2tsaXN0J11bJGldWydhbGJ1bSddID0gKHN0cmluZykgJHRyYWNrLT5hbGJ1bTsNCgkJCQkJCSRwbGF5bGlzdFsndHJhY2tsaXN0J11bJGldWydjcmVhdG9yJ10gPSAoc3RyaW5nKSAkdHJhY2stPmNyZWF0b3I7DQoJCQkJCQkkcGxheWxpc3RbJ3RyYWNrbGlzdCddWyRpXVsnZHVyYXRpb24nXSA9IChzdHJpbmcpICR0cmFjay0+ZHVyYXRpb247DQoJCQkJCQkkcGxheWxpc3RbJ3RyYWNrbGlzdCddWyRpXVsnaW1hZ2UnXSA9IChzdHJpbmcpICR0cmFjay0+aW1hZ2U7DQoJCQkJCQkkcGxheWxpc3RbJ3RyYWNrbGlzdCddWyRpXVsndHJhY2thdXRoJ10gPSAoc3RyaW5nKSAkdHJhY2stPmV4dGVuc2lvbi0+dHJhY2thdXRoOw0KCQkJCQkJJHBsYXlsaXN0Wyd0cmFja2xpc3QnXVskaV1bJ2FsYnVtaWQnXSA9IChzdHJpbmcpICR0cmFjay0+ZXh0ZW5zaW9uLT5hbGJ1bWlkOw0KCQkJCQkJJHBsYXlsaXN0Wyd0cmFja2xpc3QnXVskaV1bJ2FydGlzdGlkJ10gPSAoc3RyaW5nKSAkdHJhY2stPmV4dGVuc2lvbi0+YXJ0aXN0aWQ7DQoJCQkJCQkkcGxheWxpc3RbJ3RyYWNrbGlzdCddWyRpXVsncmVjb3JkaW5nJ10gPSAoc3RyaW5nKSAkdHJhY2stPmV4dGVuc2lvbi0+cmVjb3JkaW5nOw0KCQkJCQkJJHBsYXlsaXN0Wyd0cmFja2xpc3QnXVskaV1bJ2FydGlzdHBhZ2UnXSA9IChzdHJpbmcpICR0cmFjay0+ZXh0ZW5zaW9uLT5hcnRpc3RwYWdlOw0KCQkJCQkJJHBsYXlsaXN0Wyd0cmFja2xpc3QnXVskaV1bJ2FsYnVtcGFnZSddID0gKHN0cmluZykgJHRyYWNrLT5leHRlbnNpb24tPmFsYnVtcGFnZTsNCgkJCQkJCSRwbGF5bGlzdFsndHJhY2tsaXN0J11bJGldWyd0cmFja3BhZ2UnXSA9IChzdHJpbmcpICR0cmFjay0+ZXh0ZW5zaW9uLT50cmFja3BhZ2U7DQoJCQkJCQkkcGxheWxpc3RbJ3RyYWNrbGlzdCddWyRpXVsnYnV5VHJhY2tVUkwnXSA9IChzdHJpbmcpICR0cmFjay0+ZXh0ZW5zaW9uLT5idXlUcmFja1VSTDsNCgkJCQkJCSRwbGF5bGlzdFsndHJhY2tsaXN0J11bJGldWydidXlBbGJ1bVVSTCddID0gKHN0cmluZykgJHRyYWNrLT5leHRlbnNpb24tPmJ1dEFsYnVtVVJMOw0KCQkJCQkJJHBsYXlsaXN0Wyd0cmFja2xpc3QnXVskaV1bJ2ZyZWVUcmFja1VSTCddID0gKHN0cmluZykgJHRyYWNrLT5leHRlbnNpb24tPmZyZWVUcmFja1VSTDsNCgkJCQkJCSRpKys7DQoJCQkJCX0NCgkJCQl9DQoJCQkJDQoJCQkJcmV0dXJuICRwbGF5bGlzdDsNCgkJCX0NCgkJCWVsc2Ugew0KCQkJCXJldHVybiBGQUxTRTsNCgkJCX0NCgkJfQ0KCQllbHNlIHsNCgkJCS8vIEdpdmUgYSA5MiBlcnJvciBpZiBub3QgZnVsbHkgYXV0aGVkDQoJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTIsICdNZXRob2QgcmVxdWlyZXMgZnVsbCBhdXRoLiBDYWxsIGF1dGguZ2V0U2Vzc2lvbiB1c2luZyBsYXN0Zm1BcGlBdXRoIGNsYXNzJyk7DQoJCQlyZXR1cm4gRkFMU0U7DQoJCX0NCgl9DQp9DQoNCj8+]]></data>
	</file>
	<file>
	  <filename>/lib/lastfmapi/api/tag.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogRmlsZSB0aGF0IHN0b3JlcyBhcGkgY2FsbHMgZm9yIHRhZyBhcGkgY2FsbHMNCiAqIEBwYWNrYWdlIGFwaWNhbGxzDQogKi8NCi8qKg0KICogQWxsb3dzIGFjY2VzcyB0byB0aGUgYXBpIHJlcXVlc3RzIHJlbGF0aW5nIHRvIHRhZ3MNCiAqIEBwYWNrYWdlIGFwaWNhbGxzDQogKi8NCmNsYXNzIGxhc3RmbUFwaVRhZyBleHRlbmRzIGxhc3RmbUFwaSB7DQoJLyoqDQoJICogU3RvcmVzIHRoZSBjb25maWcgdmFsdWVzIHNldCBpbiB0aGUgY2FsbA0KCSAqIEBhY2Nlc3MgcHVibGljDQoJICogQHZhciBhcnJheQ0KCSAqLw0KCXB1YmxpYyAkY29uZmlnOw0KCS8qKg0KCSAqIFN0b3JlcyB0aGUgYXV0aCB2YXJpYWJsZXMgdXNlZCBpbiBhbGwgYXBpIGNhbGxzDQoJICogQGFjY2VzcyBwcml2YXRlDQoJICogQHZhciBhcnJheQ0KCSAqLw0KCXByaXZhdGUgJGF1dGg7DQoJLyoqDQoJICogU3RhdGVzIGlmIHRoZSB1c2VyIGhhcyBmdWxsIGF1dGhlbnRpY2F0aW9uIHRvIHVzZSBhcGkgcmVxdWVzdHMgdGhhdCBtb2RpZnkgZGF0YQ0KCSAqIEBhY2Nlc3MgcHJpdmF0ZQ0KCSAqIEB2YXIgYm9vbGVhbg0KCSAqLw0KCXByaXZhdGUgJGZ1bGxBdXRoOw0KCQ0KCS8qKg0KCSAqIEBwYXJhbSBhcnJheSAkYXV0aCBQYXNzZXMgdGhlIGF1dGhlbnRpY2F0aW9uIHZhcmlhYmxlcw0KCSAqIEBwYXJhbSBhcnJheSAkZnVsbEF1dGggQSBib29sZWFuIHZhbHVlIHN0YXRpbmcgaWYgdGhlIHVzZXIgaGFzIGZ1bGwgYXV0aGVudGljYXRpb24gb3Igbm90DQoJICogQHBhcmFtIGFycmF5ICRjb25maWcgQW4gYXJyYXkgb2YgY29uZmlnIHZhcmlhYmxlcyByZWxhdGVkIHRvIGNhY2hpbmcgYW5kIG90aGVyIGZlYXR1cmVzDQoJICovDQoJZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGF1dGgsICRmdWxsQXV0aCwgJGNvbmZpZykgew0KCQkkdGhpcy0+YXV0aCA9ICRhdXRoOw0KCQkkdGhpcy0+ZnVsbEF1dGggPSAkZnVsbEF1dGg7DQoJCSR0aGlzLT5jb25maWcgPSAkY29uZmlnOw0KCX0NCgkNCgkvKioNCgkgKiBTZWFyY2ggZm9yIHRhZ3Mgc2ltaWxhciB0byB0aGlzIG9uZS4gUmV0dXJucyB0YWdzIHJhbmtlZCBieSBzaW1pbGFyaXR5LCBiYXNlZCBvbiBsaXN0ZW5pbmcgZGF0YQ0KCSAqIEBwYXJhbSBhcnJheSAkbWV0aG9kVmFycyBBbiBhcnJheSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVxdWlyZWQgdmFsdWVzOiA8aT50YWc8L2k+DQoJICogQHJldHVybiBhcnJheQ0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBnZXRTaW1pbGFyKCRtZXRob2RWYXJzKSB7DQoJCS8vIENoZWNrIGZvciByZXF1aXJlZCB2YXJpYWJsZXMNCgkJaWYgKCAhZW1wdHkoJG1ldGhvZFZhcnNbJ3RhZyddKSApIHsNCgkJCSR2YXJzID0gYXJyYXkoDQoJCQkJJ21ldGhvZCcgPT4gJ3RhZy5nZXRzaW1pbGFyJywNCgkJCQknYXBpX2tleScgPT4gJHRoaXMtPmF1dGgtPmFwaUtleQ0KCQkJKTsNCgkJCSR2YXJzID0gYXJyYXlfbWVyZ2UoJHZhcnMsICRtZXRob2RWYXJzKTsNCgkJCQ0KCQkJaWYgKCAkY2FsbCA9ICR0aGlzLT5hcGlHZXRDYWxsKCR2YXJzKSApIHsNCgkJCQkkaSA9IDA7DQoJCQkJZm9yZWFjaCAoICRjYWxsLT5zaW1pbGFydGFncy0+dGFnIGFzICR0YWcgKSB7DQoJCQkJCSRzaW1pbGFyWyRpXVsnbmFtZSddID0gKHN0cmluZykgJHRhZy0+bmFtZTsNCgkJCQkJJHNpbWlsYXJbJGldWyd1cmwnXSA9IChzdHJpbmcpICR0YWctPnVybDsNCgkJCQkJJHNpbWlsYXJbJGldWydzdHJlYW1hYmxlJ10gPSAoc3RyaW5nKSAkdGFnLT5zdHJlYW1hYmxlOw0KCQkJCQkkaSsrOw0KCQkJCX0NCgkJCQlyZXR1cm4gJHNpbWlsYXI7DQoJCQl9DQoJCQllbHNlIHsNCgkJCQlyZXR1cm4gRkFMU0U7DQoJCQl9DQoJCX0NCgkJZWxzZSB7DQoJCQkvLyBHaXZlIGEgOTEgZXJyb3IgaWYgaW5jb3JyZWN0IHZhcmlhYmxlcyBhcmUgdXNlZA0KCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkxLCAnWW91IG11c3QgaW5jbHVkZSB0YWcgdmFyaWFibGUgaW4gdGhlIGNhbGwgZm9yIHRoaXMgbWV0aG9kJyk7DQoJCQlyZXR1cm4gRkFMU0U7DQoJCX0NCgl9DQoJDQoJLyoqDQoJICogR2V0IHRoZSB0b3AgYWxidW1zIHRhZ2dlZCBieSB0aGlzIHRhZywgb3JkZXJlZCBieSB0YWcgY291bnQNCgkgKiBAcGFyYW0gYXJyYXkgJG1ldGhvZFZhcnMgQW4gYXJyYXkgd2l0aCB0aGUgZm9sbG93aW5nIHJlcXVpcmVkIHZhbHVlczogPGk+dGFnPC9pPg0KCSAqIEByZXR1cm4gYXJyYXkNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gZ2V0VG9wQWxidW1zKCRtZXRob2RWYXJzKSB7DQoJCS8vIENoZWNrIGZvciByZXF1aXJlZCB2YXJpYWJsZXMNCgkJaWYgKCAhZW1wdHkoJG1ldGhvZFZhcnNbJ3RhZyddKSApIHsNCgkJCSR2YXJzID0gYXJyYXkoDQoJCQkJJ21ldGhvZCcgPT4gJ3RhZy5nZXR0b3BhbGJ1bXMnLA0KCQkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXV0aC0+YXBpS2V5DQoJCQkpOw0KCQkJJHZhcnMgPSBhcnJheV9tZXJnZSgkdmFycywgJG1ldGhvZFZhcnMpOw0KCQkJDQoJCQlpZiAoICRjYWxsID0gJHRoaXMtPmFwaUdldENhbGwoJHZhcnMpICkgew0KCQkJCSRpID0gMDsNCgkJCQlmb3JlYWNoICggJGNhbGwtPnRvcGFsYnVtcy0+YWxidW0gYXMgJGFsYnVtICkgew0KCQkJCQkkdG9wQWxidW1zWyRpXVsnbmFtZSddID0gKHN0cmluZykgJGFsYnVtLT5uYW1lOw0KCQkJCQkkdG9wQWxidW1zWyRpXVsndGFnY291bnQnXSA9IChzdHJpbmcpICRhbGJ1bS0+dGFnY291bnQ7DQoJCQkJCSR0b3BBbGJ1bXNbJGldWyd1cmwnXSA9IChzdHJpbmcpICRhbGJ1bS0+dXJsOw0KCQkJCQkkdG9wQWxidW1zWyRpXVsnYXJ0aXN0J11bJ25hbWUnXSA9IChzdHJpbmcpICRhbGJ1bS0+YXJ0aXN0LT5uYW1lOw0KCQkJCQkkdG9wQWxidW1zWyRpXVsnYXJ0aXN0J11bJ21iaWQnXSA9IChzdHJpbmcpICRhbGJ1bS0+YXJ0aXN0LT5tYmlkOw0KCQkJCQkkdG9wQWxidW1zWyRpXVsnYXJ0aXN0J11bJ3VybCddID0gKHN0cmluZykgJGFsYnVtLT5hcnRpc3QtPnVybDsNCgkJCQkJJHRvcEFsYnVtc1skaV1bJ2ltYWdlJ11bJ3NtYWxsJ10gPSAoc3RyaW5nKSAkYWxidW0tPmltYWdlWzBdOw0KCQkJCQkkdG9wQWxidW1zWyRpXVsnaW1hZ2UnXVsnbWVkaXVtJ10gPSAoc3RyaW5nKSAkYWxidW0tPmltYWdlWzFdOw0KCQkJCQkkdG9wQWxidW1zWyRpXVsnaW1hZ2UnXVsnbGFyZ2UnXSA9IChzdHJpbmcpICRhbGJ1bS0+aW1hZ2VbMl07DQoJCQkJCSRpKys7DQoJCQkJfQ0KCQkJCXJldHVybiAkdG9wQWxidW1zOw0KCQkJfQ0KCQkJZWxzZSB7DQoJCQkJcmV0dXJuIEZBTFNFOw0KCQkJfQ0KCQl9DQoJCWVsc2Ugew0KCQkJLy8gR2l2ZSBhIDkxIGVycm9yIGlmIGluY29ycmVjdCB2YXJpYWJsZXMgYXJlIHVzZWQNCgkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MSwgJ1lvdSBtdXN0IGluY2x1ZGUgdGFnIHZhcmlhYmxlIGluIHRoZSBjYWxsIGZvciB0aGlzIG1ldGhvZCcpOw0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoJfQ0KCQ0KCS8qKg0KCSAqIEdldCB0aGUgdG9wIGFydGlzdHMgdGFnZ2VkIGJ5IHRoaXMgdGFnLCBvcmRlcmVkIGJ5IHRhZyBjb3VudA0KCSAqIEBwYXJhbSBhcnJheSAkbWV0aG9kVmFycyBBbiBhcnJheSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVxdWlyZWQgdmFsdWVzOiA8aT50YWc8L2k+DQoJICogQHJldHVybiBhcnJheQ0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBnZXRUb3BBcnRpc3RzKCRtZXRob2RWYXJzKSB7DQoJCS8vIENoZWNrIGZvciByZXF1aXJlZCB2YXJpYWJsZXMNCgkJaWYgKCAhZW1wdHkoJG1ldGhvZFZhcnNbJ3RhZyddKSApIHsNCgkJCSR2YXJzID0gYXJyYXkoDQoJCQkJJ21ldGhvZCcgPT4gJ3RhZy5nZXR0b3BhcnRpc3RzJywNCgkJCQknYXBpX2tleScgPT4gJHRoaXMtPmF1dGgtPmFwaUtleQ0KCQkJKTsNCgkJCSR2YXJzID0gYXJyYXlfbWVyZ2UoJHZhcnMsICRtZXRob2RWYXJzKTsNCgkJCQ0KCQkJaWYgKCAkY2FsbCA9ICR0aGlzLT5hcGlHZXRDYWxsKCR2YXJzKSApIHsNCgkJCQkkaSA9IDA7DQoJCQkJZm9yZWFjaCAoICRjYWxsLT50b3BhcnRpc3RzLT5hcnRpc3QgYXMgJGFydGlzdCApIHsNCgkJCQkJJHRvcEFydGlzdHNbJGldWyduYW1lJ10gPSAoc3RyaW5nKSAkYXJ0aXN0LT5uYW1lOw0KCQkJCQkkdG9wQXJ0aXN0c1skaV1bJ3RhZ2NvdW50J10gPSAoc3RyaW5nKSAkYXJ0aXN0LT50YWdjb3VudDsNCgkJCQkJJHRvcEFydGlzdHNbJGldWyd1cmwnXSA9IChzdHJpbmcpICRhcnRpc3QtPnVybDsNCgkJCQkJJHRvcEFydGlzdHNbJGldWydtYmlkJ10gPSAoc3RyaW5nKSAkYXJ0aXN0LT5tYmlkOw0KCQkJCQkkdG9wQXJ0aXN0c1skaV1bJ3N0cmVhbWFibGUnXSA9IChzdHJpbmcpICRhcnRpc3QtPnN0cmVhbWFibGU7DQoJCQkJCSR0b3BBcnRpc3RzWyRpXVsnaW1hZ2UnXVsnc21hbGwnXSA9IChzdHJpbmcpICRhcnRpc3QtPmltYWdlWzBdOw0KCQkJCQkkdG9wQXJ0aXN0c1skaV1bJ2ltYWdlJ11bJ21lZGl1bSddID0gKHN0cmluZykgJGFydGlzdC0+aW1hZ2VbMV07DQoJCQkJCSR0b3BBcnRpc3RzWyRpXVsnaW1hZ2UnXVsnbGFyZ2UnXSA9IChzdHJpbmcpICRhcnRpc3QtPmltYWdlWzJdOw0KCQkJCQkkaSsrOw0KCQkJCX0NCgkJCQlyZXR1cm4gJHRvcEFydGlzdHM7DQoJCQl9DQoJCQllbHNlIHsNCgkJCQlyZXR1cm4gRkFMU0U7DQoJCQl9DQoJCX0NCgkJZWxzZSB7DQoJCQkvLyBHaXZlIGEgOTEgZXJyb3IgaWYgaW5jb3JyZWN0IHZhcmlhYmxlcyBhcmUgdXNlZA0KCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkxLCAnWW91IG11c3QgaW5jbHVkZSB0YWcgdmFyaWFibGUgaW4gdGhlIGNhbGwgZm9yIHRoaXMgbWV0aG9kJyk7DQoJCQlyZXR1cm4gRkFMU0U7DQoJCX0NCgl9DQoJDQoJLyoqDQoJICogRmV0Y2hlcyB0aGUgdG9wIGdsb2JhbCB0YWdzIG9uIExhc3QuZm0sIHNvcnRlZCBieSBwb3B1bGFyaXR5IChudW1iZXIgb2YgdGltZXMgdXNlZCkNCgkgKiBAcmV0dXJuIGFycmF5DQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGdldFRvcFRhZ3MoJG1ldGhvZFZhcnMgPSBBcnJheSgpKSB7DQoJCSR2YXJzID0gYXJyYXkoDQoJCQknbWV0aG9kJyA9PiAndGFnLmdldHRvcHRhZ3MnLA0KCQkJJ2FwaV9rZXknID0+ICR0aGlzLT5hdXRoLT5hcGlLZXkNCgkJKTsNCgkJJHZhcnMgPSBhcnJheV9tZXJnZSgkdmFycywgJG1ldGhvZFZhcnMpOw0KCQkNCgkJaWYgKCAkY2FsbCA9ICR0aGlzLT5hcGlHZXRDYWxsKCR2YXJzKSApIHsNCgkJCSRpID0gMDsNCgkJCWZvcmVhY2ggKCAkY2FsbC0+dG9wdGFncy0+dGFnIGFzICR0YWcgKSB7DQoJCQkJJHRvcFRhZ3NbJGldWyduYW1lJ10gPSAoc3RyaW5nKSAkdGFnLT5uYW1lOw0KCQkJCSR0b3BUYWdzWyRpXVsnY291bnQnXSA9IChzdHJpbmcpICR0YWctPmNvdW50Ow0KCQkJCSR0b3BUYWdzWyRpXVsndXJsJ10gPSAoc3RyaW5nKSAkdGFnLT51cmw7DQoJCQkJJGkrKzsNCgkJCX0NCgkJCXJldHVybiAkdG9wVGFnczsNCgkJfQ0KCQllbHNlIHsNCgkJCXJldHVybiBGQUxTRTsNCgkJfQ0KCX0NCgkNCgkvKioNCgkgKiBHZXQgdGhlIHRvcCB0cmFja3MgdGFnZ2VkIGJ5IHRoaXMgdGFnLCBvcmRlcmVkIGJ5IHRhZyBjb3VudA0KCSAqIEBwYXJhbSBhcnJheSAkbWV0aG9kVmFycyBBbiBhcnJheSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVxdWlyZWQgdmFsdWVzOiA8aT50YWc8L2k+DQoJICogQHJldHVybiBhcnJheQ0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBnZXRUb3BUcmFja3MoJG1ldGhvZFZhcnMpIHsNCgkJLy8gQ2hlY2sgZm9yIHJlcXVpcmVkIHZhcmlhYmxlcw0KCQlpZiAoICFlbXB0eSgkbWV0aG9kVmFyc1sndGFnJ10pICkgew0KCQkJJHZhcnMgPSBhcnJheSgNCgkJCQknbWV0aG9kJyA9PiAndGFnLmdldHRvcHRyYWNrcycsDQoJCQkJJ2FwaV9rZXknID0+ICR0aGlzLT5hdXRoLT5hcGlLZXkNCgkJCSk7DQoJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkNCgkJCWlmICggJGNhbGwgPSAkdGhpcy0+YXBpR2V0Q2FsbCgkdmFycykgKSB7DQoJCQkJJGkgPSAwOw0KCQkJCWZvcmVhY2ggKCAkY2FsbC0+dG9wdHJhY2tzLT50cmFjayBhcyAkdHJhY2sgKSB7DQoJCQkJCSR0b3BUcmFja3NbJGldWyduYW1lJ10gPSAoc3RyaW5nKSAkdHJhY2stPm5hbWU7DQoJCQkJCSR0b3BUcmFja3NbJGldWyd0YWdjb3VudCddID0gKHN0cmluZykgJHRyYWNrLT50YWdjb3VudDsNCgkJCQkJJHRvcFRyYWNrc1skaV1bJ3VybCddID0gKHN0cmluZykgJHRyYWNrLT51cmw7DQoJCQkJCSR0b3BUcmFja3NbJGldWydzdHJlYW1hYmxlJ10gPSAoc3RyaW5nKSAkdHJhY2stPnN0cmVhbWFibGU7DQoJCQkJCSR0b3BUcmFja3NbJGldWydmdWxsdHJhY2snXSA9IChzdHJpbmcpICR0cmFjay0+c3RyZWFtYWJsZVsnZnVsbHRyYWNrJ107DQoJCQkJCSR0b3BUcmFja3NbJGldWydhcnRpc3QnXVsnbmFtZSddID0gKHN0cmluZykgJHRyYWNrLT5hcnRpc3QtPm5hbWU7DQoJCQkJCSR0b3BUcmFja3NbJGldWydhcnRpc3QnXVsnbWJpZCddID0gKHN0cmluZykgJHRyYWNrLT5hcnRpc3QtPm1iaWQ7DQoJCQkJCSR0b3BUcmFja3NbJGldWydhcnRpc3QnXVsndXJsJ10gPSAoc3RyaW5nKSAkdHJhY2stPmFydGlzdC0+dXJsOw0KCQkJCQkkdG9wVHJhY2tzWyRpXVsnaW1hZ2UnXVsnc21hbGwnXSA9IChzdHJpbmcpICR0cmFjay0+aW1hZ2VbMF07DQoJCQkJCSR0b3BUcmFja3NbJGldWydpbWFnZSddWydtZWRpdW0nXSA9IChzdHJpbmcpICR0cmFjay0+aW1hZ2VbMV07DQoJCQkJCSR0b3BUcmFja3NbJGldWydpbWFnZSddWydsYXJnZSddID0gKHN0cmluZykgJHRyYWNrLT5pbWFnZVsyXTsNCgkJCQkJJGkrKzsNCgkJCQl9DQoJCQkJcmV0dXJuICR0b3BUcmFja3M7DQoJCQl9DQoJCQllbHNlIHsNCgkJCQlyZXR1cm4gRkFMU0U7DQoJCQl9DQoJCX0NCgkJZWxzZSB7DQoJCQkvLyBHaXZlIGEgOTEgZXJyb3IgaWYgaW5jb3JyZWN0IHZhcmlhYmxlcyBhcmUgdXNlZA0KCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkxLCAnWW91IG11c3QgaW5jbHVkZSB0YWcgdmFyaWFibGUgaW4gdGhlIGNhbGwgZm9yIHRoaXMgbWV0aG9kJyk7DQoJCQlyZXR1cm4gRkFMU0U7DQoJCX0NCgl9DQoJDQoJLyoqDQoJICogR2V0IGFuIGFydGlzdCBjaGFydCBmb3IgYSB0YWcsIGZvciBhIGdpdmVuIGRhdGUgcmFuZ2UuIElmIG5vIGRhdGUgcmFuZ2UgaXMgc3VwcGxpZWQsIGl0IHdpbGwgcmV0dXJuIHRoZSBtb3N0IHJlY2VudCBhcnRpc3QgY2hhcnQgZm9yIHRoaXMgdGFnDQoJICogQHBhcmFtIGFycmF5ICRtZXRob2RWYXJzIEFuIGFycmF5IHdpdGggdGhlIGZvbGxvd2luZyByZXF1aXJlZCB2YWx1ZXM6IDxpPnRhZzwvaT4gYW5kIG9wdGlvbmFsIHZhbHVlczogPGk+dG88L2k+LCA8aT5mcm9tPC9pPg0KCSAqIEByZXR1cm4gYXJyYXkNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gZ2V0V2Vla2x5QXJ0aXN0Q2hhcnQoJG1ldGhvZFZhcnMpIHsNCgkJLy8gQ2hlY2sgZm9yIHJlcXVpcmVkIHZhcmlhYmxlcw0KCQlpZiAoICFlbXB0eSgkbWV0aG9kVmFyc1sndGFnJ10pICkgew0KCQkJJHZhcnMgPSBhcnJheSgNCgkJCQknbWV0aG9kJyA9PiAndGFnLmdldHdlZWtseWFydGlzdGNoYXJ0JywNCgkJCQknYXBpX2tleScgPT4gJHRoaXMtPmF1dGgtPmFwaUtleQ0KCQkJKTsNCgkJCSR2YXJzID0gYXJyYXlfbWVyZ2UoJHZhcnMsICRtZXRob2RWYXJzKTsNCgkJCQ0KCQkJaWYgKCAkY2FsbCA9ICR0aGlzLT5hcGlHZXRDYWxsKCR2YXJzKSApIHsNCgkJCQkkaSA9IDA7DQoJCQkJZm9yZWFjaCAoICRjYWxsLT53ZWVrbHlhcnRpc3RjaGFydC0+YXJ0aXN0IGFzICRhcnRpc3QgKSB7DQoJCQkJCSR3ZWVrbHlBcnRpc3RzWyRpXVsnbmFtZSddID0gKHN0cmluZykgJGFydGlzdC0+bmFtZTsNCgkJCQkJJHdlZWtseUFydGlzdHNbJGldWydyYW5rJ10gPSAoc3RyaW5nKSAkYXJ0aXN0WydyYW5rJ107DQoJCQkJCSR3ZWVrbHlBcnRpc3RzWyRpXVsnbWJpZCddID0gKHN0cmluZykgJGFydGlzdC0+bWJpZDsNCgkJCQkJJHdlZWtseUFydGlzdHNbJGldWyd3ZWlnaHQnXSA9IChzdHJpbmcpICRhcnRpc3QtPndlaWdodDsNCgkJCQkJJHdlZWtseUFydGlzdHNbJGldWyd1cmwnXSA9IChzdHJpbmcpICRhcnRpc3QtPnVybDsNCgkJCQkJJGkrKzsNCgkJCQl9DQoJCQkJDQoJCQkJcmV0dXJuICR3ZWVrbHlBcnRpc3RzOw0KCQkJfQ0KCQkJZWxzZSB7DQoJCQkJcmV0dXJuIEZBTFNFOw0KCQkJfQ0KCQl9DQoJCWVsc2Ugew0KCQkJLy8gR2l2ZSBhIDkxIGVycm9yIGlmIGluY29ycmVjdCB2YXJpYWJsZXMgYXJlIHVzZWQNCgkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MSwgJ1lvdSBtdXN0IGluY2x1ZGUgYXJ0aXN0IHZhcmlhYmxlIGluIHRoZSBjYWxsIGZvciB0aGlzIG1ldGhvZCcpOw0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoJfQ0KCQ0KCS8qKg0KCSAqIEdldCBhIGxpc3Qgb2YgYXZhaWxhYmxlIGNoYXJ0cyBmb3IgdGhpcyB0YWcsIGV4cHJlc3NlZCBhcyBkYXRlIHJhbmdlcyB3aGljaCBjYW4gYmUgc2VudCB0byB0aGUgY2hhcnQgc2VydmljZXMNCgkgKiBAcGFyYW0gYXJyYXkgJG1ldGhvZFZhcnMgQW4gYXJyYXkgd2l0aCB0aGUgZm9sbG93aW5nIHJlcXVpcmVkIHZhbHVlczogPGk+dGFnPC9pPg0KCSAqIEByZXR1cm4gYXJyYXkNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gZ2V0V2Vla2x5Q2hhcnRMaXN0KCRtZXRob2RWYXJzKSB7DQoJCS8vIENoZWNrIGZvciByZXF1aXJlZCB2YXJpYWJsZXMNCgkJaWYgKCAhZW1wdHkoJG1ldGhvZFZhcnNbJ3RhZyddKSApIHsNCgkJCSR2YXJzID0gYXJyYXkoDQoJCQkJJ21ldGhvZCcgPT4gJ3RhZy5nZXR3ZWVrbHljaGFydGxpc3QnLA0KCQkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXV0aC0+YXBpS2V5DQoJCQkpOw0KCQkJJHZhcnMgPSBhcnJheV9tZXJnZSgkdmFycywgJG1ldGhvZFZhcnMpOw0KCQkJDQoJCQlpZiAoICRjYWxsID0gJHRoaXMtPmFwaUdldENhbGwoJHZhcnMpICkgew0KCQkJCSRpID0gMDsNCgkJCQlmb3JlYWNoICggJGNhbGwtPndlZWtseWNoYXJ0bGlzdC0+Y2hhcnQgYXMgJGNoYXJ0ICkgew0KCQkJCQkkd2Vla2x5Q2hhcnRMaXN0WyRpXVsnZnJvbSddID0gKHN0cmluZykgJGNoYXJ0Wydmcm9tJ107DQoJCQkJCSR3ZWVrbHlDaGFydExpc3RbJGldWyd0byddID0gKHN0cmluZykgJGNoYXJ0Wyd0byddOw0KCQkJCQkkaSsrOw0KCQkJCX0NCgkJCQkNCgkJCQlyZXR1cm4gJHdlZWtseUNoYXJ0TGlzdDsNCgkJCX0NCgkJCWVsc2Ugew0KCQkJCXJldHVybiBGQUxTRTsNCgkJCX0NCgkJfQ0KCQllbHNlIHsNCgkJCS8vIEdpdmUgYSA5MSBlcnJvciBpZiBpbmNvcnJlY3QgdmFyaWFibGVzIGFyZSB1c2VkDQoJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTEsICdZb3UgbXVzdCBpbmNsdWRlIGFydGlzdCB2YXJpYWJsZSBpbiB0aGUgY2FsbCBmb3IgdGhpcyBtZXRob2QnKTsNCgkJCXJldHVybiBGQUxTRTsNCgkJfQ0KCX0NCgkNCgkvKioNCgkgKiBTZWFyY2ggZm9yIGEgdGFnIGJ5IG5hbWUuIFJldHVybnMgbWF0Y2hlcyBzb3J0ZWQgYnkgcmVsZXZhbmNlDQoJICogQHBhcmFtIGFycmF5ICRtZXRob2RWYXJzIEFuIGFycmF5IHdpdGggdGhlIGZvbGxvd2luZyByZXF1aXJlZCB2YWx1ZXM6IDxpPnRhZzwvaT4NCgkgKiBAcmV0dXJuIGFycmF5DQoJICovDQoJcHVibGljIGZ1bmN0aW9uIHNlYXJjaCgkbWV0aG9kVmFycykgew0KCQkvLyBDaGVjayBmb3IgcmVxdWlyZWQgdmFyaWFibGVzDQoJCWlmICggIWVtcHR5KCRtZXRob2RWYXJzWyd0YWcnXSkgKSB7DQoJCQkkdmFycyA9IGFycmF5KA0KCQkJCSdtZXRob2QnID0+ICd0YWcuc2VhcmNoJywNCgkJCQknYXBpX2tleScgPT4gJHRoaXMtPmF1dGgtPmFwaUtleQ0KCQkJKTsNCgkJCSR2YXJzID0gYXJyYXlfbWVyZ2UoJHZhcnMsICRtZXRob2RWYXJzKTsNCgkJCQ0KCQkJaWYgKCAkY2FsbCA9ICR0aGlzLT5hcGlHZXRDYWxsKCR2YXJzKSApIHsNCgkJCQkkb3BlbnNlYXJjaCA9ICRjYWxsLT5yZXN1bHRzLT5jaGlsZHJlbignaHR0cDovL2E5LmNvbS8tL3NwZWMvb3BlbnNlYXJjaC8xLjEvJyk7DQoJCQkJaWYgKCAkb3BlbnNlYXJjaC0+dG90YWxSZXN1bHRzID4gMCApIHsNCgkJCQkJJHNlYXJjaFJlc3VsdHNbJ3RvdGFsUmVzdWx0cyddID0gKHN0cmluZykgJG9wZW5zZWFyY2gtPnRvdGFsUmVzdWx0czsNCgkJCQkJJHNlYXJjaFJlc3VsdHNbJ3N0YXJ0SW5kZXgnXSA9IChzdHJpbmcpICRvcGVuc2VhcmNoLT5zdGFydEluZGV4Ow0KCQkJCQkkc2VhcmNoUmVzdWx0c1snaXRlbXNQZXJQYWdlJ10gPSAoc3RyaW5nKSAkb3BlbnNlYXJjaC0+aXRlbXNQZXJQYWdlOw0KCQkJCQkkaSA9IDA7DQoJCQkJCWZvcmVhY2ggKCAkY2FsbC0+cmVzdWx0cy0+dGFnbWF0Y2hlcy0+dGFnIGFzICR0YWcgKSB7DQoJCQkJCQkkc2VhcmNoUmVzdWx0c1sncmVzdWx0cyddWyRpXVsnbmFtZSddID0gKHN0cmluZykgJHRhZy0+bmFtZTsNCgkJCQkJCSRzZWFyY2hSZXN1bHRzWydyZXN1bHRzJ11bJGldWydjb3VudCddID0gKHN0cmluZykgJHRhZy0+Y291bnQ7DQoJCQkJCQkkc2VhcmNoUmVzdWx0c1sncmVzdWx0cyddWyRpXVsndXJsJ10gPSAoc3RyaW5nKSAkdGFnLT51cmw7DQoJCQkJCQkkaSsrOw0KCQkJCQl9DQoJCQkJCXJldHVybiAkc2VhcmNoUmVzdWx0czsNCgkJCQl9DQoJCQkJZWxzZSB7DQoJCQkJCS8vIE5vIHRhZ3NhcmUgZm91bmQNCgkJCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkwLCAnTm8gcmVzdWx0cycpOw0KCQkJCQlyZXR1cm4gRkFMU0U7DQoJCQkJfQ0KCQkJfQ0KCQkJZWxzZSB7DQoJCQkJcmV0dXJuIEZBTFNFOw0KCQkJfQ0KCQl9DQoJCWVsc2Ugew0KCQkJLy8gR2l2ZSBhIDkxIGVycm9yIGlmIGluY29ycmVjdCB2YXJpYWJsZXMgYXJlIHVzZWQNCgkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MSwgJ1lvdSBtdXN0IGluY2x1ZGUgdGFnIHZhcmlhYmxlIGluIHRoZSBjYWxsIGZvciB0aGlzIG1ldGhvZCcpOw0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoJfQ0KfQ0KDQo/Pg==]]></data>
	</file>
	<file>
	  <filename>/lib/lastfmapi/api/tasteometer.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogRmlsZSB0aGF0IHN0b3JlcyBhcGkgY2FsbHMgZm9yIHRhc3Rlb21ldGVyIGFwaSBjYWxscw0KICogQHBhY2thZ2UgYXBpY2FsbHMNCiAqLw0KLyoqDQogKiBBbGxvd3MgYWNjZXNzIHRvIHRoZSBhcGkgcmVxdWVzdHMgcmVsYXRpbmcgdG8gdGhlIHRhc3Rlb21ldGVyDQogKiBAcGFja2FnZSBhcGljYWxscw0KICovDQpjbGFzcyBsYXN0Zm1BcGlUYXN0ZW9tZXRlciBleHRlbmRzIGxhc3RmbUFwaSB7DQoJLyoqDQoJICogU3RvcmVzIHRoZSBjb25maWcgdmFsdWVzIHNldCBpbiB0aGUgY2FsbA0KCSAqIEBhY2Nlc3MgcHVibGljDQoJICogQHZhciBhcnJheQ0KCSAqLw0KCXB1YmxpYyAkY29uZmlnOw0KCS8qKg0KCSAqIFN0b3JlcyB0aGUgYXV0aCB2YXJpYWJsZXMgdXNlZCBpbiBhbGwgYXBpIGNhbGxzDQoJICogQGFjY2VzcyBwcml2YXRlDQoJICogQHZhciBhcnJheQ0KCSAqLw0KCXByaXZhdGUgJGF1dGg7DQoJLyoqDQoJICogU3RhdGVzIGlmIHRoZSB1c2VyIGhhcyBmdWxsIGF1dGhlbnRpY2F0aW9uIHRvIHVzZSBhcGkgcmVxdWVzdHMgdGhhdCBtb2RpZnkgZGF0YQ0KCSAqIEBhY2Nlc3MgcHJpdmF0ZQ0KCSAqIEB2YXIgYm9vbGVhbg0KCSAqLw0KCXByaXZhdGUgJGZ1bGxBdXRoOw0KCQ0KCS8qKg0KCSAqIEBwYXJhbSBhcnJheSAkYXV0aCBQYXNzZXMgdGhlIGF1dGhlbnRpY2F0aW9uIHZhcmlhYmxlcw0KCSAqIEBwYXJhbSBhcnJheSAkZnVsbEF1dGggQSBib29sZWFuIHZhbHVlIHN0YXRpbmcgaWYgdGhlIHVzZXIgaGFzIGZ1bGwgYXV0aGVudGljYXRpb24gb3Igbm90DQoJICogQHBhcmFtIGFycmF5ICRjb25maWcgQW4gYXJyYXkgb2YgY29uZmlnIHZhcmlhYmxlcyByZWxhdGVkIHRvIGNhY2hpbmcgYW5kIG90aGVyIGZlYXR1cmVzDQoJICovDQoJZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGF1dGgsICRmdWxsQXV0aCwgJGNvbmZpZykgew0KCQkkdGhpcy0+YXV0aCA9ICRhdXRoOw0KCQkkdGhpcy0+ZnVsbEF1dGggPSAkZnVsbEF1dGg7DQoJCSR0aGlzLT5jb25maWcgPSAkY29uZmlnOw0KCX0NCgkNCgkvKioNCgkgKiBHZXQgYSBUYXN0ZW9tZXRlciBzY29yZSBmcm9tIHR3byBpbnB1dHMsIGFsb25nIHdpdGggYSBsaXN0IG9mIHNoYXJlZCBhcnRpc3RzLiBJZiB0aGUgaW5wdXQgaXMgYSBVc2VyIG9yIGEgTXlzcGFjZSBVUkwsIHNvbWUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBpcyByZXR1cm5lZA0KCSAqIEBwYXJhbSBhcnJheSAkbWV0aG9kVmFycyBBbiBhcnJheSB3aXRoIHR3byBzdWIgYXJyYXlzIDxpPigxIGFuZCAyKSBib3RoIGNvbnRhaW5pbmcgdGhlIHJlcXVpcmVkIHZhcmlhYmxlczogPGk+dHlwZSAoJ3VzZXInIHwgJ2FydGlzdHMnIHwgJ215c3BhY2UnKTwvaT4gYW5kIDxpPnZhbHVlIChbTGFzdC5mbSB1c2VybmFtZV0gfCBbQ29tbWEtc2VwYXJhdGVkIGFydGlzdCBuYW1lc10gfCBbTXlTcGFjZSBwcm9maWxlIFVSTF0pPC9pPg0KCSAqIEByZXR1cm4gYXJyYXkNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gY29tcGFyZSgkbWV0aG9kVmFycykgew0KCQkvLyBDaGVjayBmb3IgcmVxdWlyZWQgdmFyaWFibGVzDQoJCWlmICggIWVtcHR5KCRtZXRob2RWYXJzWzFdWyd0eXBlJ10pICYmICFlbXB0eSgkbWV0aG9kVmFyc1sxXVsndmFsdWUnXSkgJiYgICFlbXB0eSgkbWV0aG9kVmFyc1syXVsndHlwZSddKSAmJiAhZW1wdHkoJG1ldGhvZFZhcnNbMl1bJ3ZhbHVlJ10pICkgewkNCgkJCWlmICggJG1ldGhvZFZhcnNbMV1bJ3R5cGUnXSA9PSAnYXJ0aXN0cycgJiYgaXNfYXJyYXkoJG1ldGhvZFZhcnNbMV1bJ3ZhbHVlJ10pICkgew0KCQkJCSR2YWx1ZTEgPSAnJzsNCgkJCQlmb3JlYWNoICggJG1ldGhvZFZhcnNbMV1bJ3ZhbHVlJ10gYXMgJGFydGlzdCApIHsNCgkJCQkJJHZhbHVlMSAuPSAkYXJ0aXN0LicsJzsNCgkJCQl9DQoJCQkJJHZhbHVlMSA9IHN1YnN0cigkdmFsdWUxLCAwLCAtMSk7DQoJCQl9DQoJCQllbHNlIHsNCgkJCQkkdmFsdWUxID0gJG1ldGhvZFZhcnNbMV1bJ3ZhbHVlJ107DQoJCQl9DQoJCQkNCgkJCWlmICggJG1ldGhvZFZhcnNbMl1bJ3R5cGUnXSA9PSAnYXJ0aXN0cycgJiYgaXNfYXJyYXkoJG1ldGhvZFZhcnNbMl1bJ3ZhbHVlJ10pICkgew0KCQkJCSR2YWx1ZTIgPSAnJzsNCgkJCQlmb3JlYWNoICggJG1ldGhvZFZhcnNbMl1bJ3ZhbHVlJ10gYXMgJGFydGlzdCApIHsNCgkJCQkJJHZhbHVlMiAuPSAkYXJ0aXN0LicsJzsNCgkJCQl9DQoJCQkJJHZhbHVlMiA9IHN1YnN0cigkdmFsdWUyLCAwLCAtMSk7DQoJCQl9DQoJCQllbHNlIHsNCgkJCQkkdmFsdWUyID0gJG1ldGhvZFZhcnNbMl1bJ3ZhbHVlJ107DQoJCQl9DQoJCQkNCgkJCSR2YXJzID0gYXJyYXkoDQoJCQkJJ21ldGhvZCcgPT4gJ3Rhc3Rlb21ldGVyLmNvbXBhcmUnLA0KCQkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXV0aC0+YXBpS2V5LA0KCQkJCSd0eXBlMScgPT4gJG1ldGhvZFZhcnNbMV1bJ3R5cGUnXSwNCgkJCQkndmFsdWUxJyA9PiAkdmFsdWUxLA0KCQkJCSd0eXBlMicgPT4gJG1ldGhvZFZhcnNbMl1bJ3R5cGUnXSwNCgkJCQkndmFsdWUyJyA9PiAkdmFsdWUyDQoJCQkpOw0KCQkJDQoJCQlpZiAoICRjYWxsID0gJHRoaXMtPmFwaUdldENhbGwoJHZhcnMpICkgew0KCQkJCSRyZXN1bHQgPSAnJzsNCgkJCQkNCgkJCQkkcmVzdWx0WydzY29yZSddID0gKHN0cmluZykgJGNhbGwtPmNvbXBhcmlzb24tPnJlc3VsdC0+c2NvcmU7DQoJCQkJJHJlc3VsdFsnbWF0Y2hlcyddID0gKHN0cmluZykgJGNhbGwtPmNvbXBhcmlzb24tPnJlc3VsdC0+YXJ0aXN0c1snbWF0Y2hlcyddOw0KCQkJCSRpID0gMDsNCgkJCQlmb3JlYWNoICggJGNhbGwtPmNvbXBhcmlzb24tPnJlc3VsdC0+YXJ0aXN0cy0+YXJ0aXN0IGFzICRhcnRpc3QgKSB7DQoJCQkJCSRyZXN1bHRbJ2FydGlzdHMnXVskaV1bJ25hbWUnXSA9IChzdHJpbmcpICRhcnRpc3QtPm5hbWU7DQoJCQkJCSRyZXN1bHRbJ2FydGlzdHMnXVskaV1bJ3VybCddID0gKHN0cmluZykgJGFydGlzdC0+dXJsOw0KCQkJCQkkcmVzdWx0WydhcnRpc3RzJ11bJGldWydpbWFnZSddWydzbWFsbCddID0gKHN0cmluZykgJGFydGlzdC0+aW1hZ2VbMl07DQoJCQkJCSRyZXN1bHRbJ2FydGlzdHMnXVskaV1bJ2ltYWdlJ11bJ21lZGl1bSddID0gKHN0cmluZykgJGFydGlzdC0+aW1hZ2VbMV07DQoJCQkJCSRyZXN1bHRbJ2FydGlzdHMnXVskaV1bJ2ltYWdlJ11bJ2xhcmdlJ10gPSAoc3RyaW5nKSAkYXJ0aXN0LT5pbWFnZVswXTsNCgkJCQkJJGkrKzsNCgkJCQl9DQoJCQkJDQoJCQkJJGNvdW50VXNlciA9IDA7DQoJCQkJJGNvdW50TXlzcGFjZSA9IDA7DQoJCQkJc3dpdGNoICggJG1ldGhvZFZhcnNbMV1bJ3R5cGUnXSApIHsNCgkJCQkJY2FzZSAndXNlcic6DQoJCQkJCQkkcmVzdWx0WydpbnB1dE9uZSddWyd0eXBlJ10gPSAndXNlcic7DQoJCQkJCQkkcmVzdWx0WydpbnB1dE9uZSddWyduYW1lJ10gPSAoc3RyaW5nKSAkY2FsbC0+Y29tcGFyaXNvbi0+aW5wdXQtPnVzZXJbJGNvdW50VXNlcl0tPm5hbWU7DQoJCQkJCQkkcmVzdWx0WydpbnB1dE9uZSddWyd1cmwnXSA9IChzdHJpbmcpICRjYWxsLT5jb21wYXJpc29uLT5pbnB1dC0+dXNlclskY291bnRVc2VyXS0+dXJsOw0KCQkJCQkJJHJlc3VsdFsnaW5wdXRPbmUnXVsnaW1hZ2UnXVsnc21hbGwnXSA9IChzdHJpbmcpICRjYWxsLT5jb21wYXJpc29uLT5pbnB1dC0+dXNlclskY291bnRVc2VyXS0+aW1hZ2VbMl07DQoJCQkJCQkkcmVzdWx0WydpbnB1dE9uZSddWydpbWFnZSddWydtZWRpdW0nXSA9IChzdHJpbmcpICRjYWxsLT5jb21wYXJpc29uLT5pbnB1dC0+dXNlclskY291bnRVc2VyXS0+aW1hZ2VbMV07DQoJCQkJCQkkcmVzdWx0WydpbnB1dE9uZSddWydpbWFnZSddWydsYXJnZSddID0gKHN0cmluZykgJGNhbGwtPmNvbXBhcmlzb24tPmlucHV0LT51c2VyWyRjb3VudFVzZXJdLT5pbWFnZVswXTsNCgkJCQkJCSRjb3VudFVzZXIrKzsNCgkJCQkJYnJlYWs7DQoJCQkJCWNhc2UgJ2FydGlzdHMnOg0KCQkJCQkJJHJlc3VsdFsnaW5wdXRPbmUnXVsndHlwZSddID0gJ2FydGlzdHMnOw0KCQkJCQlicmVhazsNCgkJCQkJY2FzZSAnbXlzcGFjZSc6DQoJCQkJCQkkcmVzdWx0WydpbnB1dE9uZSddWyd0eXBlJ10gPSAnbXlzcGFjZSc7DQoJCQkJCQkkcmVzdWx0WydpbnB1dE9uZSddWyd1cmwnXSA9IChzdHJpbmcpICRjYWxsLT5jb21wYXJpc29uLT5pbnB1dC0+bXlzcGFjZVskY291bnRNeXNwYWNlXS0+dXJsOw0KCQkJCQkJJHJlc3VsdFsnaW5wdXRPbmUnXVsnaW1hZ2UnXSA9IChzdHJpbmcpICRjYWxsLT5jb21wYXJpc29uLT5pbnB1dC0+bXlzcGFjZVskY291bnRNeXNwYWNlXS0+aW1hZ2U7DQoJCQkJCQkkY291bnRNeXNwYWNlKys7DQoJCQkJCWJyZWFrOw0KCQkJCX0NCgkJCQkNCgkJCQlzd2l0Y2ggKCAkbWV0aG9kVmFyc1syXVsndHlwZSddICkgew0KCQkJCQljYXNlICd1c2VyJzoNCgkJCQkJCSRyZXN1bHRbJ2lucHV0VHdvJ11bJ3R5cGUnXSA9ICd1c2VyJzsNCgkJCQkJCSRyZXN1bHRbJ2lucHV0VHdvJ11bJ25hbWUnXSA9IChzdHJpbmcpICRjYWxsLT5jb21wYXJpc29uLT5pbnB1dC0+dXNlclskY291bnRVc2VyXS0+bmFtZTsNCgkJCQkJCSRyZXN1bHRbJ2lucHV0VHdvJ11bJ3VybCddID0gKHN0cmluZykgJGNhbGwtPmNvbXBhcmlzb24tPmlucHV0LT51c2VyWyRjb3VudFVzZXJdLT51cmw7DQoJCQkJCQkkcmVzdWx0WydpbnB1dFR3byddWydpbWFnZSddWydzbWFsbCddID0gKHN0cmluZykgJGNhbGwtPmNvbXBhcmlzb24tPmlucHV0LT51c2VyWyRjb3VudFVzZXJdLT5pbWFnZVsyXTsNCgkJCQkJCSRyZXN1bHRbJ2lucHV0VHdvJ11bJ2ltYWdlJ11bJ21lZGl1bSddID0gKHN0cmluZykgJGNhbGwtPmNvbXBhcmlzb24tPmlucHV0LT51c2VyWyRjb3VudFVzZXJdLT5pbWFnZVsxXTsNCgkJCQkJCSRyZXN1bHRbJ2lucHV0VHdvJ11bJ2ltYWdlJ11bJ2xhcmdlJ10gPSAoc3RyaW5nKSAkY2FsbC0+Y29tcGFyaXNvbi0+aW5wdXQtPnVzZXJbJGNvdW50VXNlcl0tPmltYWdlWzBdOw0KCQkJCQkJJGNvdW50VXNlcisrOw0KCQkJCQlicmVhazsNCgkJCQkJY2FzZSAnYXJ0aXN0cyc6DQoJCQkJCQkkcmVzdWx0WydpbnB1dFR3byddWyd0eXBlJ10gPSAnYXJ0aXN0cyc7DQoJCQkJCWJyZWFrOw0KCQkJCQljYXNlICdteXNwYWNlJzoNCgkJCQkJCSRyZXN1bHRbJ2lucHV0VHdvJ11bJ3R5cGUnXSA9ICdteXNwYWNlJzsNCgkJCQkJCSRyZXN1bHRbJ2lucHV0VHdvJ11bJ3VybCddID0gKHN0cmluZykgJGNhbGwtPmNvbXBhcmlzb24tPmlucHV0LT5teXNwYWNlWyRjb3VudE15c3BhY2VdLT51cmw7DQoJCQkJCQkkcmVzdWx0WydpbnB1dFR3byddWydpbWFnZSddID0gKHN0cmluZykgJGNhbGwtPmNvbXBhcmlzb24tPmlucHV0LT5teXNwYWNlWyRjb3VudE15c3BhY2VdLT5pbWFnZTsNCgkJCQkJCSRjb3VudE15c3BhY2UrKzsNCgkJCQkJYnJlYWs7DQoJCQkJfQ0KCQkJCQ0KCQkJCXJldHVybiAkcmVzdWx0Ow0KCQkJfQ0KCQkJZWxzZSB7DQoJCQkJcmV0dXJuIEZBTFNFOw0KCQkJfQ0KCQl9DQoJCWVsc2Ugew0KCQkJLy8gR2l2ZSBhIDkxIGVycm9yIGlmIGluY29ycmVjdCB2YXJpYWJsZXMgYXJlIHVzZWQNCgkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MSwgJ1lvdSBtdXN0IGluY2x1ZGUgMiBzZXRzIG9mIHR5cGUgYW5kIHZhbHVlIHZhcmlhbGJlcyBpbiB0aGUgY2FsbCBmb3IgdGhpcyBtZXRob2QnKTsNCgkJCXJldHVybiBGQUxTRTsNCgkJfQ0KCX0NCn0NCg0KPz4=]]></data>
	</file>
	<file>
	  <filename>/lib/lastfmapi/api/track.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogRmlsZSB0aGF0IHN0b3JlcyBhcGkgY2FsbHMgZm9yIHRyYWNrIGFwaSBjYWxscw0KICogQHBhY2thZ2UgYXBpY2FsbHMNCiAqLw0KLyoqDQogKiBBbGxvd3MgYWNjZXNzIHRvIHRoZSBhcGkgcmVxdWVzdHMgcmVsYXRpbmcgdG8gdHJhY2tzDQogKiBAcGFja2FnZSBhcGljYWxscw0KICovDQpjbGFzcyBsYXN0Zm1BcGlUcmFjayBleHRlbmRzIGxhc3RmbUFwaSB7DQoJLyoqDQoJICogU3RvcmVzIHRoZSBjb25maWcgdmFsdWVzIHNldCBpbiB0aGUgY2FsbA0KCSAqIEBhY2Nlc3MgcHVibGljDQoJICogQHZhciBhcnJheQ0KCSAqLw0KCXB1YmxpYyAkY29uZmlnOw0KCS8qKg0KCSAqIFN0b3JlcyB0aGUgYXV0aCB2YXJpYWJsZXMgdXNlZCBpbiBhbGwgYXBpIGNhbGxzDQoJICogQGFjY2VzcyBwcml2YXRlDQoJICogQHZhciBhcnJheQ0KCSAqLw0KCXByaXZhdGUgJGF1dGg7DQoJLyoqDQoJICogU3RhdGVzIGlmIHRoZSB1c2VyIGhhcyBmdWxsIGF1dGhlbnRpY2F0aW9uIHRvIHVzZSBhcGkgcmVxdWVzdHMgdGhhdCBtb2RpZnkgZGF0YQ0KCSAqIEBhY2Nlc3MgcHJpdmF0ZQ0KCSAqIEB2YXIgYm9vbGVhbg0KCSAqLw0KCXByaXZhdGUgJGZ1bGxBdXRoOw0KCQ0KCS8qKg0KCSAqIEBwYXJhbSBhcnJheSAkYXV0aCBQYXNzZXMgdGhlIGF1dGhlbnRpY2F0aW9uIHZhcmlhYmxlcw0KCSAqIEBwYXJhbSBhcnJheSAkZnVsbEF1dGggQSBib29sZWFuIHZhbHVlIHN0YXRpbmcgaWYgdGhlIHVzZXIgaGFzIGZ1bGwgYXV0aGVudGljYXRpb24gb3Igbm90DQoJICogQHBhcmFtIGFycmF5ICRjb25maWcgQW4gYXJyYXkgb2YgY29uZmlnIHZhcmlhYmxlcyByZWxhdGVkIHRvIGNhY2hpbmcgYW5kIG90aGVyIGZlYXR1cmVzDQoJICovDQoJZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGF1dGgsICRmdWxsQXV0aCwgJGNvbmZpZykgew0KCQkkdGhpcy0+YXV0aCA9ICRhdXRoOw0KCQkkdGhpcy0+ZnVsbEF1dGggPSAkZnVsbEF1dGg7DQoJCSR0aGlzLT5jb25maWcgPSAkY29uZmlnOw0KCX0NCgkNCgkvKioNCgkgKiBUYWcgYW4gYWxidW0gdXNpbmcgYSBsaXN0IG9mIHVzZXIgc3VwcGxpZWQgdGFncyAoUmVxdWlyZXMgZnVsbCBhdXRoKQ0KCSAqIEBwYXJhbSBhcnJheSAkbWV0aG9kVmFycyBBbiBhcnJheSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVxdWlyZWQgdmFsdWVzOiA8aT5hcnRpc3Q8L2k+LCA8aT50cmFjazwvaT4sIDxpPnRhZ3M8L2k+DQoJICogQHJldHVybiBib29sZWFuDQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGFkZFRhZ3MoJG1ldGhvZFZhcnMpIHsNCgkJLy8gT25seSBhbGxvdyBmdWxsIGF1dGhlZCBjYWxscw0KCQlpZiAoICR0aGlzLT5mdWxsQXV0aCA9PSBUUlVFICkgew0KCQkJLy8gQ2hlY2sgZm9yIHJlcXVpcmVkIHZhcmlhYmxlcw0KCQkJaWYgKCAhZW1wdHkoJG1ldGhvZFZhcnNbJ2FydGlzdCddKSAmJiAhZW1wdHkoJG1ldGhvZFZhcnNbJ3RyYWNrJ10pICYmICFlbXB0eSgkbWV0aG9kVmFyc1sndGFncyddKSApIHsNCgkJCQkvLyBJZiB0aGUgdGFncyB2YXJpYWJsZXMgaXMgYW4gYXJyYXkgYnVpbGQgYSBDUyBsaXN0DQoJCQkJaWYgKCBpc19hcnJheSgkbWV0aG9kVmFyc1sndGFncyddKSApIHsNCgkJCQkJJHRhZ3MgPSAnJzsNCgkJCQkJZm9yZWFjaCAoICRtZXRob2RWYXJzWyd0YWdzJ10gYXMgJHRhZyApIHsNCgkJCQkJCSR0YWdzIC49ICR0YWcuJywnOw0KCQkJCQl9DQoJCQkJCSR0YWdzID0gc3Vic3RyKCR0YWdzLCAwLCAtMSk7DQoJCQkJfQ0KCQkJCWVsc2Ugew0KCQkJCQkkdGFncyA9ICRtZXRob2RWYXJzWyd0YWdzJ107DQoJCQkJfQ0KCQkJCSRtZXRob2RWYXJzWyd0YWdzJ10gPSAkdGFnczsNCgkJCQkNCgkJCQkkdmFycyA9IGFycmF5KA0KCQkJCQknbWV0aG9kJyA9PiAndHJhY2suYWRkdGFncycsDQoJCQkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXV0aC0+YXBpS2V5LA0KCQkJCQknc2snID0+ICR0aGlzLT5hdXRoLT5zZXNzaW9uS2V5DQoJCQkJKTsNCgkJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkJJHNpZyA9ICR0aGlzLT5hcGlTaWcoJHRoaXMtPmF1dGgtPnNlY3JldCwgJHZhcnMpOw0KCQkJCSR2YXJzWydhcGlfc2lnJ10gPSAkc2lnOw0KCQkJCQ0KCQkJCWlmICggJGNhbGwgPSAkdGhpcy0+YXBpUG9zdENhbGwoJHZhcnMpICkgew0KCQkJCQlyZXR1cm4gVFJVRTsNCgkJCQl9DQoJCQkJZWxzZSB7DQoJCQkJCXJldHVybiBGQUxTRTsNCgkJCQl9DQoJCQl9DQoJCQllbHNlIHsNCgkJCQkvLyBHaXZlIGEgOTEgZXJyb3IgaWYgaW5jb3JyZWN0IHZhcmlhYmxlcyBhcmUgdXNlZA0KCQkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MSwgJ1lvdSBtdXN0IGluY2x1ZGUgYXJ0aXN0LCB0cmFjayBhbmQgdGFncyB2YXJpYWxiZXMgaW4gdGhlIGNhbGwgZm9yIHRoaXMgbWV0aG9kJyk7DQoJCQkJcmV0dXJuIEZBTFNFOw0KCQkJfQ0KCQl9DQoJCWVsc2Ugew0KCQkJLy8gR2l2ZSBhIDkyIGVycm9yIGlmIG5vdCBmdWxseSBhdXRoZWQNCgkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MiwgJ01ldGhvZCByZXF1aXJlcyBmdWxsIGF1dGguIENhbGwgYXV0aC5nZXRTZXNzaW9uIHVzaW5nIGxhc3RmbUFwaUF1dGggY2xhc3MnKTsNCgkJCXJldHVybiBGQUxTRTsNCgkJfQ0KCX0NCgkNCgkvKioNCgkgKiBCYW4gYSB0cmFjayBmb3IgYSBnaXZlbiB1c2VyIHByb2ZpbGUuIFRoaXMgbmVlZHMgdG8gYmUgc3VwcGxlbWVudGVkIHdpdGggYSBzY3JvYmJsaW5nIHN1Ym1pc3Npb24gY29udGFpbmluZyB0aGUgJ2JhbicgcmF0aW5nIChzZWUgdGhlIGF1ZGlvc2Nyb2JibGVyIEFQSSkgKFJlcXVpcmVzIGZ1bGwgYXV0aCkNCgkgKiBAcGFyYW0gYXJyYXkgJG1ldGhvZFZhcnMgQW4gYXJyYXkgd2l0aCB0aGUgZm9sbG93aW5nIHJlcXVpcmVkIHZhbHVlczogPGk+YXJ0aXN0PC9pPiwgPGk+dHJhY2s8L2k+DQoJICogQHJldHVybiBib29sZWFuDQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGJhbigkbWV0aG9kVmFycykgew0KCQkvLyBPbmx5IGFsbG93IGZ1bGwgYXV0aGVkIGNhbGxzDQoJCWlmICggJHRoaXMtPmZ1bGxBdXRoID09IFRSVUUgKSB7DQoJCQkvLyBDaGVjayBmb3IgcmVxdWlyZWQgdmFyaWFibGVzDQoJCQlpZiAoICFlbXB0eSgkbWV0aG9kVmFyc1snYXJ0aXN0J10pICYmICFlbXB0eSgkbWV0aG9kVmFyc1sndHJhY2snXSkgKSB7DQoJCQkJJHZhcnMgPSBhcnJheSgNCgkJCQkJJ21ldGhvZCcgPT4gJ3RyYWNrLmJhbicsDQoJCQkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXV0aC0+YXBpS2V5LA0KCQkJCQknc2snID0+ICR0aGlzLT5hdXRoLT5zZXNzaW9uS2V5DQoJCQkJKTsNCgkJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkJJHNpZyA9ICR0aGlzLT5hcGlTaWcoJHRoaXMtPmF1dGgtPnNlY3JldCwgJHZhcnMpOw0KCQkJCSR2YXJzWydhcGlfc2lnJ10gPSAkc2lnOw0KCQkJCQ0KCQkJCWlmICggJGNhbGwgPSAkdGhpcy0+YXBpUG9zdENhbGwoJHZhcnMpICkgew0KCQkJCQlyZXR1cm4gVFJVRTsNCgkJCQl9DQoJCQkJZWxzZSB7DQoJCQkJCXJldHVybiBGQUxTRTsNCgkJCQl9DQoJCQl9DQoJCQllbHNlIHsNCgkJCQkvLyBHaXZlIGEgOTEgZXJyb3IgaWYgaW5jb3JyZWN0IHZhcmlhYmxlcyBhcmUgdXNlZA0KCQkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MSwgJ1lvdSBtdXN0IGluY2x1ZGUgYXJ0aXN0IGFuZCB0cmFjayB2YXJpYWxiZXMgaW4gdGhlIGNhbGwgZm9yIHRoaXMgbWV0aG9kJyk7DQoJCQkJcmV0dXJuIEZBTFNFOw0KCQkJfQ0KCQl9DQoJCWVsc2Ugew0KCQkJLy8gR2l2ZSBhIDkyIGVycm9yIGlmIG5vdCBmdWxseSBhdXRoZWQNCgkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MiwgJ01ldGhvZCByZXF1aXJlcyBmdWxsIGF1dGguIENhbGwgYXV0aC5nZXRTZXNzaW9uIHVzaW5nIGxhc3RmbUFwaUF1dGggY2xhc3MnKTsNCgkJCXJldHVybiBGQUxTRTsNCgkJfQ0KCX0NCgkNCgkvKioNCgkgKiBHZXQgdGhlIG1ldGFkYXRhIGZvciBhIHRyYWNrIG9uIExhc3QuZm0gdXNpbmcgdGhlIGFydGlzdC90cmFjayBuYW1lIG9yIGEgbXVzaWNicmFpbnogaWQNCgkgKiBAcGFyYW0gYXJyYXkgJG1ldGhvZFZhcnMgQW4gYXJyYXkgd2l0aCB0aGUgZm9sbG93aW5nIHJlcXVpcmVkIHZhbHVlczogPGk+YXJ0aXN0IG9yIG1iaWQ8L2k+LCA8aT50cmFjazwvaT4NCgkgKiBAcmV0dXJuIGFycmF5DQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGdldEluZm8oJG1ldGhvZFZhcnMpIHsNCgkJJHZhcnMgPSBhcnJheSgNCgkJCSdtZXRob2QnID0+ICd0cmFjay5nZXRpbmZvJywNCgkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXV0aC0+YXBpS2V5DQoJCSk7DQoJCSR2YXJzID0gYXJyYXlfbWVyZ2UoJHZhcnMsICRtZXRob2RWYXJzKTsNCgkJDQoJCWlmICggJGNhbGwgPSAkdGhpcy0+YXBpR2V0Q2FsbCgkdmFycykgKSB7DQoJCQkkaW5mb1snaWQnXSA9IChzdHJpbmcpICRjYWxsLT50cmFjay0+aWQ7DQoJCQkkaW5mb1snbmFtZSddID0gKHN0cmluZykgJGNhbGwtPnRyYWNrLT5uYW1lOw0KCQkJJGluZm9bJ21iaWQnXSA9IChzdHJpbmcpICRjYWxsLT50cmFjay0+bWJpZDsNCgkJCSRpbmZvWyd1cmwnXSA9IChzdHJpbmcpICRjYWxsLT50cmFjay0+dXJsOw0KCQkJJGluZm9bJ2R1cmF0aW9uJ10gPSAoc3RyaW5nKSAkY2FsbC0+dHJhY2stPmR1cmF0aW9uOw0KCQkJJGluZm9bJ3N0cmVhbWFibGUnXSA9IChzdHJpbmcpICRjYWxsLT50cmFjay0+c3RyZWFtYWJsZTsNCgkJCSRpbmZvWydmdWxsdHJhY2snXSA9IChzdHJpbmcpICRjYWxsLT50cmFjay0+c3RyZWFtYWJsZVsnZnVsbHRyYWNrJ107DQoJCQkkaW5mb1snbGlzdGVuZXJzJ10gPSAoc3RyaW5nKSAkY2FsbC0+dHJhY2stPmxpc3RlbmVyczsNCgkJCSRpbmZvWydwbGF5Y291bnQnXSA9IChzdHJpbmcpICRjYWxsLT50cmFjay0+cGxheWNvdW50Ow0KCQkJJGluZm9bJ2FydGlzdCddWyduYW1lJ10gPSAoc3RyaW5nKSAkY2FsbC0+dHJhY2stPmFydGlzdC0+bmFtZTsNCgkJCSRpbmZvWydhcnRpc3QnXVsnbWJpZCddID0gKHN0cmluZykgJGNhbGwtPnRyYWNrLT5hcnRpc3QtPm1iaWQ7DQoJCQkkaW5mb1snYXJ0aXN0J11bJ3VybCddID0gKHN0cmluZykgJGNhbGwtPnRyYWNrLT5hcnRpc3QtPnVybDsNCgkJCSRpbmZvWydhbGJ1bSddWydwb3NpdGlvbiddID0gKHN0cmluZykgJGNhbGwtPnRyYWNrLT5hbGJ1bVsncG9zaXRpb24nXTsNCgkJCSRpbmZvWydhbGJ1bSddWydhcnRpc3QnXSA9IChzdHJpbmcpICRjYWxsLT50cmFjay0+YWxidW0tPmFydGlzdDsNCgkJCSRpbmZvWydhbGJ1bSddWyd0aXRsZSddID0gKHN0cmluZykgJGNhbGwtPnRyYWNrLT5hbGJ1bS0+dGl0bGU7DQoJCQkkaW5mb1snYWxidW0nXVsnbWJpZCddID0gKHN0cmluZykgJGNhbGwtPnRyYWNrLT5hbGJ1bS0+bWJpZDsNCgkJCSRpbmZvWydhbGJ1bSddWyd1cmwnXSA9IChzdHJpbmcpICRjYWxsLT50cmFjay0+YWxidW0tPnVybDsNCgkJCSRpbmZvWydhbGJ1bSddWydpbWFnZSddWydzbWFsbCddID0gKHN0cmluZykgJGNhbGwtPnRyYWNrLT5hbGJ1bS0+aW1hZ2VbMF07DQoJCQkkaW5mb1snYWxidW0nXVsnaW1hZ2UnXVsnbWVkaXVtJ10gPSAoc3RyaW5nKSAkY2FsbC0+dHJhY2stPmFsYnVtLT5pbWFnZVsxXTsNCgkJCSRpbmZvWydhbGJ1bSddWydpbWFnZSddWydsYXJnZSddID0gKHN0cmluZykgJGNhbGwtPnRyYWNrLT5hbGJ1bS0+aW1hZ2VbMl07DQoJCQkkaSA9IDA7DQoJCQlmb3JlYWNoICggJGNhbGwtPnRyYWNrLT50b3B0YWdzLT50YWcgYXMgJHRhZyApIHsNCgkJCQkkaW5mb1sndG9wdGFncyddWyRpXVsnbmFtZSddID0gKHN0cmluZykgJHRhZy0+bmFtZTsNCgkJCQkkaW5mb1sndG9wdGFncyddWyRpXVsndXJsJ10gPSAoc3RyaW5nKSAkdGFnLT51cmw7DQoJCQkJJGkrKzsNCgkJCX0NCgkJCSRpbmZvWyd3aWtpJ11bJ3B1Ymxpc2hlZCddID0gKHN0cmluZykgJGNhbGwtPnRyYWNrLT53aWtpLT5wdWJsaXNoZWQ7DQoJCQkkaW5mb1snd2lraSddWydzdW1tYXJ5J10gPSAoc3RyaW5nKSAkY2FsbC0+dHJhY2stPndpa2ktPnN1bW1hcnk7DQoJCQkkaW5mb1snd2lraSddWydjb250ZW50J10gPSAoc3RyaW5nKSAkY2FsbC0+dHJhY2stPndpa2ktPmNvbnRlbnQ7DQoJCQkNCgkJCXJldHVybiAkaW5mbzsNCgkJfQ0KCQllbHNlIHsNCgkJCXJldHVybiBGQUxTRTsNCgkJfQ0KCX0NCgkNCgkvKioNCgkgKiBHZXQgdGhlIHNpbWlsYXIgdHJhY2tzIGZvciB0aGlzIHRyYWNrIG9uIExhc3QuZm0sIGJhc2VkIG9uIGxpc3RlbmluZyBkYXRhDQoJICogQHBhcmFtIGFycmF5ICRtZXRob2RWYXJzIEFuIGFycmF5IHdpdGggdGhlIGZvbGxvd2luZyByZXF1aXJlZCB2YWx1ZXM6IDxpPmFydGlzdDwvaT4sIDxpPnRyYWNrPC9pPg0KCSAqIEByZXR1cm4gYXJyYXkNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gZ2V0U2ltaWxhcigkbWV0aG9kVmFycykgew0KCQkvLyBDaGVjayBmb3IgcmVxdWlyZWQgdmFyaWFibGVzDQoJCWlmICggIWVtcHR5KCRtZXRob2RWYXJzWydhcnRpc3QnXSkgJiYgIWVtcHR5KCRtZXRob2RWYXJzWyd0cmFjayddKSApIHsNCgkJCSR2YXJzID0gYXJyYXkoDQoJCQkJJ21ldGhvZCcgPT4gJ3RyYWNrLmdldHNpbWlsYXInLA0KCQkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXV0aC0+YXBpS2V5DQoJCQkpOw0KCQkJJHZhcnMgPSBhcnJheV9tZXJnZSgkdmFycywgJG1ldGhvZFZhcnMpOw0KCQkJDQoJCQlpZiAoICRjYWxsID0gJHRoaXMtPmFwaUdldENhbGwoJHZhcnMpICkgew0KCQkJCWlmICggY291bnQoJGNhbGwtPnNpbWlsYXJ0cmFja3MtPnRyYWNrKSA+IDAgKSB7DQoJCQkJCSRpID0gMDsNCgkJCQkJZm9yZWFjaCAoICRjYWxsLT5zaW1pbGFydHJhY2tzLT50cmFjayBhcyAkdHJhY2sgKSB7DQoJCQkJCQkkc2ltaWxhclskaV1bJ25hbWUnXSA9IChzdHJpbmcpICR0cmFjay0+bmFtZTsNCgkJCQkJCSRzaW1pbGFyWyRpXVsnbWF0Y2gnXSA9IChzdHJpbmcpICR0cmFjay0+bWF0Y2g7DQoJCQkJCQkkc2ltaWxhclskaV1bJ21iaWQnXSA9IChzdHJpbmcpICR0cmFjay0+bWJpZDsNCgkJCQkJCSRzaW1pbGFyWyRpXVsndXJsJ10gPSAoc3RyaW5nKSAkdHJhY2stPnVybDsNCgkJCQkJCSRzaW1pbGFyWyRpXVsnc3RyZWFtYWJsZSddID0gKHN0cmluZykgJHRyYWNrLT5zdHJlYW1hYmxlOw0KCQkJCQkJJHNpbWlsYXJbJGldWydmdWxsdHJhY2snXSA9IChzdHJpbmcpICR0cmFjay0+c3RyZWFtYWJsZVsnZnVsbHRyYWNrJ107DQoJCQkJCQkkc2ltaWxhclskaV1bJ2FydGlzdCddWyduYW1lJ10gPSAoc3RyaW5nKSAkdHJhY2stPmFydGlzdC0+bmFtZTsNCgkJCQkJCSRzaW1pbGFyWyRpXVsnYXJ0aXN0J11bJ21iaWQnXSA9IChzdHJpbmcpICR0cmFjay0+YXJ0aXN0LT5tYmlkOw0KCQkJCQkJJHNpbWlsYXJbJGldWydhcnRpc3QnXVsndXJsJ10gPSAoc3RyaW5nKSAkdHJhY2stPmFydGlzdC0+dXJsOw0KCQkJCQkJJHNpbWlsYXJbJGldWydpbWFnZXMnXVsnc21hbGwnXSA9IChzdHJpbmcpICR0cmFjay0+aW1hZ2VbMF07DQoJCQkJCQkkc2ltaWxhclskaV1bJ2ltYWdlcyddWydtZWRpdW0nXSA9IChzdHJpbmcpICR0cmFjay0+aW1hZ2VbMV07DQoJCQkJCQkkc2ltaWxhclskaV1bJ2ltYWdlcyddWydsYXJnZSddID0gKHN0cmluZykgJHRyYWNrLT5pbWFnZVsyXTsNCgkJCQkJCSRpKys7DQoJCQkJCX0NCgkJCQkJcmV0dXJuICRzaW1pbGFyOw0KCQkJCX0NCgkJCQllbHNlIHsNCgkJCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkwLCAnVGhpcyB0cmFjayBoYXMgbm8gc2ltaWxhciB0cmFja3MnKTsNCgkJCQkJcmV0dXJuIEZBTFNFOw0KCQkJCX0NCgkJCX0NCgkJCWVsc2Ugew0KCQkJCXJldHVybiBGQUxTRTsNCgkJCX0NCgkJfQ0KCQllbHNlIHsNCgkJCS8vIEdpdmUgYSA5MSBlcnJvciBpZiBpbmNvcnJlY3QgdmFyaWFibGVzIGFyZSB1c2VkDQoJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTEsICdZb3UgbXVzdCBpbmNsdWRlIGFydGlzdCBhbmQgdHJhY2sgdmFyaWFsYmVzIGluIHRoZSBjYWxsIGZvciB0aGlzIG1ldGhvZCcpOw0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoJfQ0KCQ0KCS8qKg0KCSAqIEdldCB0aGUgdGFncyBhcHBsaWVkIGJ5IGFuIGluZGl2aWR1YWwgdXNlciB0byBhIHRyYWNrIG9uIExhc3QuZm0gKFJlcXVpcmVzIGZ1bGwgYXV0aCkNCgkgKiBAcGFyYW0gYXJyYXkgJG1ldGhvZFZhcnMgQW4gYXJyYXkgd2l0aCB0aGUgZm9sbG93aW5nIHJlcXVpcmVkIHZhbHVlczogPGk+YXJ0aXN0PC9pPiwgPGk+dHJhY2s8L2k+DQoJICogQHJldHVybiBhcnJheQ0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBnZXRUYWdzKCRtZXRob2RWYXJzKSB7DQoJCS8vIE9ubHkgYWxsb3cgZnVsbCBhdXRoZWQgY2FsbHMNCgkJaWYgKCAkdGhpcy0+ZnVsbEF1dGggPT0gVFJVRSApIHsNCgkJCS8vIENoZWNrIGZvciByZXF1aXJlZCB2YXJpYWJsZXMNCgkJCWlmICggIWVtcHR5KCRtZXRob2RWYXJzWydhcnRpc3QnXSkgJiYgIWVtcHR5KCRtZXRob2RWYXJzWyd0cmFjayddKSApIHsNCgkJCQkkdmFycyA9IGFycmF5KA0KCQkJCQknbWV0aG9kJyA9PiAndHJhY2suZ2V0dGFncycsDQoJCQkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXV0aC0+YXBpS2V5LA0KCQkJCQknc2snID0+ICR0aGlzLT5hdXRoLT5zZXNzaW9uS2V5DQoJCQkJKTsNCgkJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkJJHNpZyA9ICR0aGlzLT5hcGlTaWcoJHRoaXMtPmF1dGgtPnNlY3JldCwgJHZhcnMpOw0KCQkJCSR2YXJzWydhcGlfc2lnJ10gPSAkc2lnOw0KCQkJCQ0KCQkJCWlmICggJGNhbGwgPSAkdGhpcy0+YXBpR2V0Q2FsbCgkdmFycykgKSB7DQoJCQkJCWlmICggY291bnQoJGNhbGwtPnRhZ3MtPnRhZykgPiAwICkgew0KCQkJCQkJJHRhZ3NbJ2FydGlzdCddID0gKHN0cmluZykgJGNhbGwtPnRhZ3NbJ2FydGlzdCddOw0KCQkJCQkJJHRhZ3NbJ3RyYWNrJ10gPSAoc3RyaW5nKSAkY2FsbC0+dGFnc1sndHJhY2snXTsNCgkJCQkJCSRpID0gMDsNCgkJCQkJCWZvcmVhY2ggKCAkY2FsbC0+dGFncy0+dGFnIGFzICR0YWcgKSB7DQoJCQkJCQkJJHRhZ3NbJ3RhZ3MnXVskaV1bJ25hbWUnXSA9IChzdHJpbmcpICR0YWctPm5hbWU7DQoJCQkJCQkJJHRhZ3NbJ3RhZ3MnXVskaV1bJ3VybCddID0gKHN0cmluZykgJHRhZy0+dXJsOw0KCQkJCQkJCSRpKys7DQoJCQkJCQl9DQoJCQkJCQlyZXR1cm4gJHRhZ3M7DQoJCQkJCX0NCgkJCQkJZWxzZSB7DQoJCQkJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTAsICdUaGUgdXNlciBoYXMgbm8gdGFncyBvbiB0aGlzIHRyYWNrJyk7DQoJCQkJCQlyZXR1cm4gRkFMU0U7DQoJCQkJCX0NCgkJCQl9DQoJCQkJZWxzZSB7DQoJCQkJCXJldHVybiBGQUxTRTsNCgkJCQl9DQoJCQl9DQoJCQllbHNlIHsNCgkJCQkvLyBHaXZlIGEgOTEgZXJyb3IgaWYgaW5jb3JyZWN0IHZhcmlhYmxlcyBhcmUgdXNlZA0KCQkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MSwgJ1lvdSBtdXN0IGluY2x1ZGUgYXJ0aXN0IGFuZCB0cmFjayB2YXJpYWxiZXMgaW4gdGhlIGNhbGwgZm9yIHRoaXMgbWV0aG9kJyk7DQoJCQkJcmV0dXJuIEZBTFNFOw0KCQkJfQ0KCQl9DQoJCWVsc2Ugew0KCQkJLy8gR2l2ZSBhIDkyIGVycm9yIGlmIG5vdCBmdWxseSBhdXRoZWQNCgkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MiwgJ01ldGhvZCByZXF1aXJlcyBmdWxsIGF1dGguIENhbGwgYXV0aC5nZXRTZXNzaW9uIHVzaW5nIGxhc3RmbUFwaUF1dGggY2xhc3MnKTsNCgkJCXJldHVybiBGQUxTRTsNCgkJfQ0KCX0NCgkNCgkvKioNCgkgKiBHZXQgdGhlIHRvcCBmYW5zIGZvciB0aGlzIHRyYWNrIG9uIExhc3QuZm0sIGJhc2VkIG9uIGxpc3RlbmluZyBkYXRhDQoJICogQHBhcmFtIGFycmF5ICRtZXRob2RWYXJzIEFuIGFycmF5IHdpdGggdGhlIGZvbGxvd2luZyByZXF1aXJlZCB2YWx1ZXM6IDxpPmFydGlzdDwvaT4sIDxpPnRyYWNrPC9pPg0KCSAqIEByZXR1cm4gYXJyYXkNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gZ2V0VG9wRmFucygkbWV0aG9kVmFycykgew0KCQkvLyBDaGVjayBmb3IgcmVxdWlyZWQgdmFyaWFibGVzDQoJCWlmICggIWVtcHR5KCRtZXRob2RWYXJzWydhcnRpc3QnXSkgJiYgIWVtcHR5KCRtZXRob2RWYXJzWyd0cmFjayddKSApIHsNCgkJCSR2YXJzID0gYXJyYXkoDQoJCQkJJ21ldGhvZCcgPT4gJ3RyYWNrLmdldHRvcGZhbnMnLA0KCQkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXV0aC0+YXBpS2V5DQoJCQkpOw0KCQkJJHZhcnMgPSBhcnJheV9tZXJnZSgkdmFycywgJG1ldGhvZFZhcnMpOw0KCQkJDQoJCQlpZiAoICRjYWxsID0gJHRoaXMtPmFwaUdldENhbGwoJHZhcnMpICkgew0KCQkJCWlmICggY291bnQoJGNhbGwtPnRvcGZhbnMtPnVzZXIpID4gMCApIHsNCgkJCQkJJHRvcEZhbnNbJ2FydGlzdCddID0gKHN0cmluZykgJGNhbGwtPnRvcGZhbnNbJ2FydGlzdCddOw0KCQkJCQkkdG9wRmFuc1sndHJhY2snXSA9IChzdHJpbmcpICRjYWxsLT50b3BmYW5zWyd0cmFjayddOw0KCQkJCQkkaSA9IDA7DQoJCQkJCWZvcmVhY2ggKCAkY2FsbC0+dG9wZmFucy0+dXNlciBhcyAkdXNlciApIHsNCgkJCQkJCSR0b3BGYW5zWyd1c2VycyddWyRpXVsnbmFtZSddID0gKHN0cmluZykgJHVzZXItPm5hbWU7DQoJCQkJCQkkdG9wRmFuc1sndXNlcnMnXVskaV1bJ3VybCddID0gKHN0cmluZykgJHVzZXItPnVybDsNCgkJCQkJCSR0b3BGYW5zWyd1c2VycyddWyRpXVsnaW1hZ2UnXVsnc21hbGwnXSA9IChzdHJpbmcpICR1c2VyLT5pbWFnZVswXTsNCgkJCQkJCSR0b3BGYW5zWyd1c2VycyddWyRpXVsnaW1hZ2UnXVsnbWVkaXVtJ10gPSAoc3RyaW5nKSAkdXNlci0+aW1hZ2VbMV07DQoJCQkJCQkkdG9wRmFuc1sndXNlcnMnXVskaV1bJ2ltYWdlJ11bJ2xhcmdlJ10gPSAoc3RyaW5nKSAkdXNlci0+aW1hZ2VbMl07DQoJCQkJCQkkdG9wRmFuc1sndXNlcnMnXVskaV1bJ3dlaWdodCddID0gKHN0cmluZykgJHVzZXItPndlaWdodDsNCgkJCQkJCSRpKys7DQoJCQkJCX0NCgkJCQkJcmV0dXJuICR0b3BGYW5zOw0KCQkJCX0NCgkJCQllbHNlIHsNCgkJCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkwLCAnVGhpcyB0cmFjayBoYXMgbm8gZmFucycpOw0KCQkJCQlyZXR1cm4gRkFMU0U7DQoJCQkJfQ0KCQkJfQ0KCQkJZWxzZSB7DQoJCQkJcmV0dXJuIEZBTFNFOw0KCQkJfQ0KCQl9DQoJCWVsc2Ugew0KCQkJLy8gR2l2ZSBhIDkxIGVycm9yIGlmIGluY29ycmVjdCB2YXJpYWJsZXMgYXJlIHVzZWQNCgkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MSwgJ1lvdSBtdXN0IGluY2x1ZGUgYXJ0aXN0IGFuZCB0cmFjayB2YXJpYWxiZXMgaW4gdGhlIGNhbGwgZm9yIHRoaXMgbWV0aG9kJyk7DQoJCQlyZXR1cm4gRkFMU0U7DQoJCX0NCg0KCX0NCgkNCgkvKioNCgkgKiBHZXQgdGhlIHRvcCB0YWdzIGZvciB0aGlzIHRyYWNrIG9uIExhc3QuZm0sIG9yZGVyZWQgYnkgdGFnIGNvdW50DQoJICogQHBhcmFtIGFycmF5ICRtZXRob2RWYXJzIEFuIGFycmF5IHdpdGggdGhlIGZvbGxvd2luZyByZXF1aXJlZCB2YWx1ZXM6IDxpPmFydGlzdDwvaT4sIDxpPnRyYWNrPC9pPg0KCSAqIEByZXR1cm4gYXJyYXkNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gZ2V0VG9wVGFncygkbWV0aG9kVmFycykgew0KCQkvLyBDaGVjayBmb3IgcmVxdWlyZWQgdmFyaWFibGVzDQoJCWlmICggIWVtcHR5KCRtZXRob2RWYXJzWydhcnRpc3QnXSkgJiYgIWVtcHR5KCRtZXRob2RWYXJzWyd0cmFjayddKSApIHsNCgkJCSR2YXJzID0gYXJyYXkoDQoJCQkJJ21ldGhvZCcgPT4gJ3RyYWNrLmdldHRvcHRhZ3MnLA0KCQkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXV0aC0+YXBpS2V5DQoJCQkpOw0KCQkJJHZhcnMgPSBhcnJheV9tZXJnZSgkdmFycywgJG1ldGhvZFZhcnMpOw0KCQkJDQoJCQlpZiAoICRjYWxsID0gJHRoaXMtPmFwaUdldENhbGwoJHZhcnMpICkgew0KCQkJCWlmICggY291bnQoJGNhbGwtPnRvcHRhZ3MtPnRhZykgPiAwICkgew0KCQkJCQkkdG9wVGFnc1snYXJ0aXN0J10gPSAoc3RyaW5nKSAkY2FsbC0+dG9wdGFnc1snYXJ0aXN0J107DQoJCQkJCSR0b3BUYWdzWyd0cmFjayddID0gKHN0cmluZykgJGNhbGwtPnRvcHRhZ3NbJ3RyYWNrJ107DQoJCQkJCSRpID0gMDsNCgkJCQkJZm9yZWFjaCAoICRjYWxsLT50b3B0YWdzLT50YWcgYXMgJHRhZyApIHsNCgkJCQkJCSR0b3BUYWdzWyd0YWdzJ11bJGldWyduYW1lJ10gPSAoc3RyaW5nKSAkdGFnLT5uYW1lOw0KCQkJCQkJJHRvcFRhZ3NbJ3RhZ3MnXVskaV1bJ2NvdW50J10gPSAoc3RyaW5nKSAkdGFnLT5jb3VudDsNCgkJCQkJCSR0b3BUYWdzWyd0YWdzJ11bJGldWyd1cmwnXSA9IChzdHJpbmcpICR0YWctPnVybDsNCgkJCQkJCSRpKys7DQoJCQkJCX0NCgkJCQkJcmV0dXJuICR0b3BUYWdzOw0KCQkJCX0NCgkJCQllbHNlIHsNCgkJCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkwLCAnVGhpcyB0cmFjayBoYXMgbm8gdGFncycpOw0KCQkJCQlyZXR1cm4gRkFMU0U7DQoJCQkJfQ0KCQkJfQ0KCQkJZWxzZSB7DQoJCQkJcmV0dXJuIEZBTFNFOw0KCQkJfQ0KCQl9DQoJCWVsc2Ugew0KCQkJLy8gR2l2ZSBhIDkxIGVycm9yIGlmIGluY29ycmVjdCB2YXJpYWJsZXMgYXJlIHVzZWQNCgkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MSwgJ1lvdSBtdXN0IGluY2x1ZGUgYXJ0aXN0IGFuZCB0cmFjayB2YXJpYWxiZXMgaW4gdGhlIGNhbGwgZm9yIHRoaXMgbWV0aG9kJyk7DQoJCQlyZXR1cm4gRkFMU0U7DQoJCX0NCgl9DQoJDQoJLyoqDQoJICogTG92ZSBhIHRyYWNrIGZvciBhIHVzZXIgcHJvZmlsZS4gVGhpcyBuZWVkcyB0byBiZSBzdXBwbGVtZW50ZWQgd2l0aCBhIHNjcm9iYmxpbmcgc3VibWlzc2lvbiBjb250YWluaW5nIHRoZSAnbG92ZScgcmF0aW5nIChzZWUgdGhlIGF1ZGlvc2Nyb2JibGVyIEFQSSkgKFJlcXVpcmVzIGZ1bGwgYXV0aCkNCgkgKiBAcGFyYW0gYXJyYXkgJG1ldGhvZFZhcnMgQW4gYXJyYXkgd2l0aCB0aGUgZm9sbG93aW5nIHJlcXVpcmVkIHZhbHVlczogPGk+YXJ0aXN0PC9pPiwgPGk+dHJhY2s8L2k+DQoJICogQHJldHVybiBib29sZWFuDQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGxvdmUoJG1ldGhvZFZhcnMpIHsNCgkJLy8gT25seSBhbGxvdyBmdWxsIGF1dGhlZCBjYWxscw0KCQlpZiAoICR0aGlzLT5mdWxsQXV0aCA9PSBUUlVFICkgew0KCQkJLy8gQ2hlY2sgZm9yIHJlcXVpcmVkIHZhcmlhYmxlcw0KCQkJaWYgKCAhZW1wdHkoJG1ldGhvZFZhcnNbJ2FydGlzdCddKSAmJiAhZW1wdHkoJG1ldGhvZFZhcnNbJ3RyYWNrJ10pICkgew0KCQkJCSR2YXJzID0gYXJyYXkoDQoJCQkJCSdtZXRob2QnID0+ICd0cmFjay5sb3ZlJywNCgkJCQkJJ2FwaV9rZXknID0+ICR0aGlzLT5hdXRoLT5hcGlLZXksDQoJCQkJCSdzaycgPT4gJHRoaXMtPmF1dGgtPnNlc3Npb25LZXkNCgkJCQkpOw0KCQkJCSR2YXJzID0gYXJyYXlfbWVyZ2UoJHZhcnMsICRtZXRob2RWYXJzKTsNCgkJCQkkc2lnID0gJHRoaXMtPmFwaVNpZygkdGhpcy0+YXV0aC0+c2VjcmV0LCAkdmFycyk7DQoJCQkJJHZhcnNbJ2FwaV9zaWcnXSA9ICRzaWc7DQoJCQkJDQoJCQkJaWYgKCAkY2FsbCA9ICR0aGlzLT5hcGlQb3N0Q2FsbCgkdmFycykgKSB7DQoJCQkJCXJldHVybiBUUlVFOw0KCQkJCX0NCgkJCQllbHNlIHsNCgkJCQkJcmV0dXJuIEZBTFNFOw0KCQkJCX0NCgkJCX0NCgkJCWVsc2Ugew0KCQkJCS8vIEdpdmUgYSA5MSBlcnJvciBpZiBpbmNvcnJlY3QgdmFyaWFibGVzIGFyZSB1c2VkDQoJCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkxLCAnWW91IG11c3QgaW5jbHVkZSBhcnRpc3QgYW5kIHRyYWNrIHZhcmlhbGJlcyBpbiB0aGUgY2FsbCBmb3IgdGhpcyBtZXRob2QnKTsNCgkJCQlyZXR1cm4gRkFMU0U7DQoJCQl9DQoJCX0NCgkJZWxzZSB7DQoJCQkvLyBHaXZlIGEgOTIgZXJyb3IgaWYgbm90IGZ1bGx5IGF1dGhlZA0KCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkyLCAnTWV0aG9kIHJlcXVpcmVzIGZ1bGwgYXV0aC4gQ2FsbCBhdXRoLmdldFNlc3Npb24gdXNpbmcgbGFzdGZtQXBpQXV0aCBjbGFzcycpOw0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoJfQ0KCQ0KCS8qKg0KCSAqIFJlbW92ZSBhIHVzZXIncyB0YWcgZnJvbSBhIHRyYWNrIChSZXF1aXJlcyBmdWxsIGF1dGgpDQoJICogQHBhcmFtIGFycmF5ICRtZXRob2RWYXJzIEFuIGFycmF5IHdpdGggdGhlIGZvbGxvd2luZyByZXF1aXJlZCB2YWx1ZXM6IDxpPmFydGlzdDwvaT4sIDxpPnRyYWNrPC9pPiwgPGk+dGFnPC9pPg0KCSAqIEByZXR1cm4gYm9vbGVhbg0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiByZW1vdmVUYWcoJG1ldGhvZFZhcnMpIHsNCgkJLy8gT25seSBhbGxvdyBmdWxsIGF1dGhlZCBjYWxscw0KCQlpZiAoICR0aGlzLT5mdWxsQXV0aCA9PSBUUlVFICkgew0KCQkJLy8gQ2hlY2sgZm9yIHJlcXVpcmVkIHZhcmlhYmxlcw0KCQkJaWYgKCAhZW1wdHkoJG1ldGhvZFZhcnNbJ2FydGlzdCddKSAmJiAhZW1wdHkoJG1ldGhvZFZhcnNbJ3RyYWNrJ10pICYmICFlbXB0eSgkbWV0aG9kVmFyc1sndGFnJ10pICkgew0KCQkJCSR2YXJzID0gYXJyYXkoDQoJCQkJCSdtZXRob2QnID0+ICd0cmFjay5yZW1vdmV0YWcnLA0KCQkJCQknYXBpX2tleScgPT4gJHRoaXMtPmF1dGgtPmFwaUtleSwNCgkJCQkJJ3NrJyA9PiAkdGhpcy0+YXV0aC0+c2Vzc2lvbktleQ0KCQkJCSk7DQoJCQkJJHZhcnMgPSBhcnJheV9tZXJnZSgkdmFycywgJG1ldGhvZFZhcnMpOw0KCQkJCSRzaWcgPSAkdGhpcy0+YXBpU2lnKCR0aGlzLT5hdXRoLT5zZWNyZXQsICR2YXJzKTsNCgkJCQkkdmFyc1snYXBpX3NpZyddID0gJHNpZzsNCgkJCQkNCgkJCQlpZiAoICRjYWxsID0gJHRoaXMtPmFwaVBvc3RDYWxsKCR2YXJzKSApIHsNCgkJCQkJcmV0dXJuIFRSVUU7DQoJCQkJfQ0KCQkJCWVsc2Ugew0KCQkJCQlyZXR1cm4gRkFMU0U7DQoJCQkJfQ0KCQkJfQ0KCQkJZWxzZSB7DQoJCQkJLy8gR2l2ZSBhIDkxIGVycm9yIGlmIGluY29ycmVjdCB2YXJpYWJsZXMgYXJlIHVzZWQNCgkJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTEsICdZb3UgbXVzdCBpbmNsdWRlIHRhZywgYXJ0aXN0IGFuZCB0cmFjayB2YXJpYWxiZXMgaW4gdGhlIGNhbGwgZm9yIHRoaXMgbWV0aG9kJyk7DQoJCQkJcmV0dXJuIEZBTFNFOw0KCQkJfQ0KCQl9DQoJCWVsc2Ugew0KCQkJLy8gR2l2ZSBhIDkyIGVycm9yIGlmIG5vdCBmdWxseSBhdXRoZWQNCgkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MiwgJ01ldGhvZCByZXF1aXJlcyBmdWxsIGF1dGguIENhbGwgYXV0aC5nZXRTZXNzaW9uIHVzaW5nIGxhc3RmbUFwaUF1dGggY2xhc3MnKTsNCgkJCXJldHVybiBGQUxTRTsNCgkJfQ0KCX0NCgkNCgkvKioNCgkgKiBTZWFyY2ggZm9yIGEgdHJhY2sgYnkgdHJhY2sgbmFtZS4gUmV0dXJucyB0cmFjayBtYXRjaGVzIHNvcnRlZCBieSByZWxldmFuY2UNCgkgKiBAcGFyYW0gYXJyYXkgJG1ldGhvZFZhcnMgQW4gYXJyYXkgd2l0aCB0aGUgZm9sbG93aW5nIHJlcXVpcmVkIHZhbHVlczogPGk+dHJhY2s8L2k+DQoJICogQHJldHVybiBhcnJheQ0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBzZWFyY2goJG1ldGhvZFZhcnMpIHsNCgkJLy8gQ2hlY2sgZm9yIHJlcXVpcmVkIHZhcmlhYmxlcw0KCQlpZiAoICFlbXB0eSgkbWV0aG9kVmFyc1sndHJhY2snXSkgKSB7DQoJCQkkdmFycyA9IGFycmF5KA0KCQkJCSdtZXRob2QnID0+ICd0cmFjay5zZWFyY2gnLA0KCQkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXV0aC0+YXBpS2V5DQoJCQkpOw0KCQkJJHZhcnMgPSBhcnJheV9tZXJnZSgkdmFycywgJG1ldGhvZFZhcnMpOw0KCQkJDQoJCQlpZiAoICRjYWxsID0gJHRoaXMtPmFwaUdldENhbGwoJHZhcnMpICkgew0KCQkJCSRvcGVuc2VhcmNoID0gJGNhbGwtPnJlc3VsdHMtPmNoaWxkcmVuKCdodHRwOi8vYTkuY29tLy0vc3BlYy9vcGVuc2VhcmNoLzEuMS8nKTsNCgkJCQlpZiAoICRvcGVuc2VhcmNoLT50b3RhbFJlc3VsdHMgPiAwICkgew0KCQkJCQkkc2VhcmNoUmVzdWx0c1sndG90YWxSZXN1bHRzJ10gPSAoc3RyaW5nKSAkb3BlbnNlYXJjaC0+dG90YWxSZXN1bHRzOw0KCQkJCQkkc2VhcmNoUmVzdWx0c1snc3RhcnRJbmRleCddID0gKHN0cmluZykgJG9wZW5zZWFyY2gtPnN0YXJ0SW5kZXg7DQoJCQkJCSRzZWFyY2hSZXN1bHRzWydpdGVtc1BlclBhZ2UnXSA9IChzdHJpbmcpICRvcGVuc2VhcmNoLT5pdGVtc1BlclBhZ2U7DQoJCQkJCSRpID0gMDsNCgkJCQkJZm9yZWFjaCAoICRjYWxsLT5yZXN1bHRzLT50cmFja21hdGNoZXMtPnRyYWNrIGFzICR0cmFjayApIHsNCgkJCQkJCSRzZWFyY2hSZXN1bHRzWydyZXN1bHRzJ11bJGldWyduYW1lJ10gPSAoc3RyaW5nKSAkdHJhY2stPm5hbWU7DQoJCQkJCQkkc2VhcmNoUmVzdWx0c1sncmVzdWx0cyddWyRpXVsnYXJ0aXN0J10gPSAoc3RyaW5nKSAkdHJhY2stPmFydGlzdDsNCgkJCQkJCSRzZWFyY2hSZXN1bHRzWydyZXN1bHRzJ11bJGldWyd1cmwnXSA9IChzdHJpbmcpICR0cmFjay0+dXJsOw0KCQkJCQkJJHNlYXJjaFJlc3VsdHNbJ3Jlc3VsdHMnXVskaV1bJ3N0cmVhbWFibGUnXSA9IChzdHJpbmcpICR0cmFjay0+c3RyZWFtYWJsZTsNCgkJCQkJCSRzZWFyY2hSZXN1bHRzWydyZXN1bHRzJ11bJGldWydmdWxsdHJhY2snXSA9IChzdHJpbmcpICR0cmFjay0+c3RyZWFtYWJsZVsnZnVsbHRyYWNrJ107DQoJCQkJCQkkc2VhcmNoUmVzdWx0c1sncmVzdWx0cyddWyRpXVsnbGlzdGVuZXJzJ10gPSAoc3RyaW5nKSAkdHJhY2stPmxpc3RlbmVyczsNCgkJCQkJCSRzZWFyY2hSZXN1bHRzWydyZXN1bHRzJ11bJGldWydpbWFnZSddWydzbWFsbCddID0gKHN0cmluZykgJHRyYWNrLT5pbWFnZVswXTsNCgkJCQkJCSRzZWFyY2hSZXN1bHRzWydyZXN1bHRzJ11bJGldWydpbWFnZSddWydtZWRpdW0nXSA9IChzdHJpbmcpICR0cmFjay0+aW1hZ2VbMV07DQoJCQkJCQkkc2VhcmNoUmVzdWx0c1sncmVzdWx0cyddWyRpXVsnaW1hZ2UnXVsnbGFyZ2UnXSA9IChzdHJpbmcpICR0cmFjay0+aW1hZ2VbMl07DQoJCQkJCQkkaSsrOw0KCQkJCQl9DQoJCQkJCXJldHVybiAkc2VhcmNoUmVzdWx0czsNCgkJCQl9DQoJCQkJZWxzZSB7DQoJCQkJCS8vIE5vIHRhZ3NhcmUgZm91bmQNCgkJCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkwLCAnTm8gcmVzdWx0cycpOw0KCQkJCQlyZXR1cm4gRkFMU0U7DQoJCQkJfQ0KCQkJfQ0KCQkJZWxzZSB7DQoJCQkJcmV0dXJuIEZBTFNFOw0KCQkJfQ0KCQl9DQoJCWVsc2Ugew0KCQkJLy8gR2l2ZSBhIDkxIGVycm9yIGlmIGluY29ycmVjdCB2YXJpYWJsZXMgYXJlIHVzZWQNCgkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MSwgJ1lvdSBtdXN0IGluY2x1ZGUgdHJhY2sgdmFyaWFibGUgaW4gdGhlIGNhbGwgZm9yIHRoaXMgbWV0aG9kJyk7DQoJCQlyZXR1cm4gRkFMU0U7DQoJCX0NCgl9DQoJDQoJLyoqDQoJICogU2hhcmUgYSB0cmFjayB0d2l0aCBvbmUgb3IgbW9yZSBMYXN0LmZtIHVzZXJzIG9yIG90aGVyIGZyaWVuZHMgKFJlcXVpcmVzIGZ1bGwgYXV0aCkNCgkgKiBAcGFyYW0gYXJyYXkgJG1ldGhvZFZhcnMgQW4gYXJyYXkgd2l0aCB0aGUgZm9sbG93aW5nIHJlcXVpcmVkIHZhbHVlczogPGk+YXJ0aXN0PC9pPiwgPGk+dHJhY2s8L2k+LCA8aT5yZWNpcGllbnQ8L2k+IGFuZCBvcHRpb25hbCB2YWx1ZTogPGk+bWVzc2FnZTwvaT4NCgkgKiBAcmV0dXJuIGJvb2xlYW4NCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gc2hhcmUoJG1ldGhvZFZhcnMpIHsNCgkJLy8gT25seSBhbGxvdyBmdWxsIGF1dGhlZCBjYWxscw0KCQlpZiAoICR0aGlzLT5mdWxsQXV0aCA9PSBUUlVFICkgew0KCQkJLy8gQ2hlY2sgZm9yIHJlcXVpcmVkIHZhcmlhYmxlcw0KCQkJaWYgKCAhZW1wdHkoJG1ldGhvZFZhcnNbJ2FydGlzdCddKSAmJiAhZW1wdHkoJG1ldGhvZFZhcnNbJ3RyYWNrJ10pICYmICFlbXB0eSgkbWV0aG9kVmFyc1sncmVjaXBpZW50J10pICkgew0KCQkJCSR2YXJzID0gYXJyYXkoDQoJCQkJCSdtZXRob2QnID0+ICd0cmFjay5zaGFyZScsDQoJCQkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXV0aC0+YXBpS2V5LA0KCQkJCQknc2snID0+ICR0aGlzLT5hdXRoLT5zZXNzaW9uS2V5DQoJCQkJKTsNCgkJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkJJHNpZyA9ICR0aGlzLT5hcGlTaWcoJHRoaXMtPmF1dGgtPnNlY3JldCwgJHZhcnMpOw0KCQkJCSR2YXJzWydhcGlfc2lnJ10gPSAkc2lnOw0KCQkJCQ0KCQkJCWlmICggJGNhbGwgPSAkdGhpcy0+YXBpUG9zdENhbGwoJHZhcnMpICkgew0KCQkJCQlyZXR1cm4gVFJVRTsNCgkJCQl9DQoJCQkJZWxzZSB7DQoJCQkJCXJldHVybiBGQUxTRTsNCgkJCQl9DQoJCQl9DQoJCQllbHNlIHsNCgkJCQkvLyBHaXZlIGEgOTEgZXJyb3IgaWYgaW5jb3JyZWN0IHZhcmlhYmxlcyBhcmUgdXNlZA0KCQkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MSwgJ1lvdSBtdXN0IGluY2x1ZGUgcmVjaXBpZW50LCBhcnRpc3QgYW5kIHRyYWNrIHZhcmlhbGJlcyBpbiB0aGUgY2FsbCBmb3IgdGhpcyBtZXRob2QnKTsNCgkJCQlyZXR1cm4gRkFMU0U7DQoJCQl9DQoJCX0NCgkJZWxzZSB7DQoJCQkvLyBHaXZlIGEgOTIgZXJyb3IgaWYgbm90IGZ1bGx5IGF1dGhlZA0KCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkyLCAnTWV0aG9kIHJlcXVpcmVzIGZ1bGwgYXV0aC4gQ2FsbCBhdXRoLmdldFNlc3Npb24gdXNpbmcgbGFzdGZtQXBpQXV0aCBjbGFzcycpOw0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoJfQ0KfQ0KDQo/Pg==]]></data>
	</file>
	<file>
	  <filename>/lib/lastfmapi/api/user.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogRmlsZSB0aGF0IHN0b3JlcyBhcGkgY2FsbHMgZm9yIHVzZXIgYXBpIGNhbGxzDQogKiBAcGFja2FnZSBhcGljYWxscw0KICovDQovKioNCiAqIEFsbG93cyBhY2Nlc3MgdG8gdGhlIGFwaSByZXF1ZXN0cyByZWxhdGluZyB0byB1c2Vycw0KICogQHBhY2thZ2UgYXBpY2FsbHMNCiAqLw0KY2xhc3MgbGFzdGZtQXBpVXNlciBleHRlbmRzIGxhc3RmbUFwaSB7DQoJLyoqDQoJICogU3RvcmVzIHRoZSBjb25maWcgdmFsdWVzIHNldCBpbiB0aGUgY2FsbA0KCSAqIEBhY2Nlc3MgcHVibGljDQoJICogQHZhciBhcnJheQ0KCSAqLw0KCXB1YmxpYyAkY29uZmlnOw0KCS8qKg0KCSAqIFN0b3JlcyB0aGUgYXV0aCB2YXJpYWJsZXMgdXNlZCBpbiBhbGwgYXBpIGNhbGxzDQoJICogQGFjY2VzcyBwcml2YXRlDQoJICogQHZhciBhcnJheQ0KCSAqLw0KCXByaXZhdGUgJGF1dGg7DQoJLyoqDQoJICogU3RhdGVzIGlmIHRoZSB1c2VyIGhhcyBmdWxsIGF1dGhlbnRpY2F0aW9uIHRvIHVzZSBhcGkgcmVxdWVzdHMgdGhhdCBtb2RpZnkgZGF0YQ0KCSAqIEBhY2Nlc3MgcHJpdmF0ZQ0KCSAqIEB2YXIgYm9vbGVhbg0KCSAqLw0KCXByaXZhdGUgJGZ1bGxBdXRoOw0KCQ0KCS8qKg0KCSAqIEBwYXJhbSBhcnJheSAkYXV0aCBQYXNzZXMgdGhlIGF1dGhlbnRpY2F0aW9uIHZhcmlhYmxlcw0KCSAqIEBwYXJhbSBhcnJheSAkZnVsbEF1dGggQSBib29sZWFuIHZhbHVlIHN0YXRpbmcgaWYgdGhlIHVzZXIgaGFzIGZ1bGwgYXV0aGVudGljYXRpb24gb3Igbm90DQoJICogQHBhcmFtIGFycmF5ICRjb25maWcgQW4gYXJyYXkgb2YgY29uZmlnIHZhcmlhYmxlcyByZWxhdGVkIHRvIGNhY2hpbmcgYW5kIG90aGVyIGZlYXR1cmVzDQoJICovDQoJZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGF1dGgsICRmdWxsQXV0aCwgJGNvbmZpZykgew0KCQkkdGhpcy0+YXV0aCA9ICRhdXRoOw0KCQkkdGhpcy0+ZnVsbEF1dGggPSAkZnVsbEF1dGg7DQoJCSR0aGlzLT5jb25maWcgPSAkY29uZmlnOw0KCX0NCgkNCgkvKioNCgkgKiBHZXQgYSBsaXN0IG9mIHVwY29taW5nIGV2ZW50cyB0aGF0IHRoaXMgdXNlciBpcyBhdHRlbmRpbmcNCgkgKiBAcGFyYW0gYXJyYXkgJG1ldGhvZFZhcnMgQW4gYXJyYXkgd2l0aCB0aGUgZm9sbG93aW5nIHJlcXVpcmVkIHZhbHVlczogPGk+dXNlcjwvaT4NCgkgKiBAcmV0dXJuIGFycmF5DQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGdldEV2ZW50cygkbWV0aG9kVmFycykgew0KCQkvLyBDaGVjayBmb3IgcmVxdWlyZWQgdmFyaWFibGVzDQoJCWlmICggIWVtcHR5KCRtZXRob2RWYXJzWyd1c2VyJ10pICkgew0KCQkJJHZhcnMgPSBhcnJheSgNCgkJCQknbWV0aG9kJyA9PiAndXNlci5nZXRldmVudHMnLA0KCQkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXV0aC0+YXBpS2V5DQoJCQkpOw0KCQkJJHZhcnMgPSBhcnJheV9tZXJnZSgkdmFycywgJG1ldGhvZFZhcnMpOw0KCQkJDQoJCQlpZiAoICRjYWxsID0gJHRoaXMtPmFwaUdldENhbGwoJHZhcnMpICkgew0KCQkJCWlmICggJGNhbGwtPmV2ZW50c1sndG90YWwnXSA+IDAgKSB7DQoJCQkJCSRpID0gMDsNCgkJCQkJZm9yZWFjaCAoICRjYWxsLT5ldmVudHMtPmV2ZW50IGFzICRldmVudCApIHsNCgkJCQkJCSRldmVudHNbJGldWydpZCddID0gKHN0cmluZykgJGV2ZW50LT5pZDsNCgkJCQkJCSRldmVudHNbJGldWyd0aXRsZSddID0gKHN0cmluZykgJGV2ZW50LT50aXRsZTsNCgkJCQkJCSRpaSA9IDA7DQoJCQkJCQlmb3JlYWNoICggJGV2ZW50LT5hcnRpc3RzLT5hcnRpc3QgYXMgJGFydGlzdCApIHsNCgkJCQkJCQkkZXZlbnRzWyRpXVsnYXJ0aXN0cyddWyRpaV0gPSAoc3RyaW5nKSAkYXJ0aXN0Ow0KCQkJCQkJCSRpaSsrOw0KCQkJCQkJfQ0KCQkJCQkJJGV2ZW50c1skaV1bJ2hlYWRsaW5lciddID0gKHN0cmluZykgJGV2ZW50LT5hcnRpc3RzLT5oZWFkbGluZXI7DQoJCQkJCQkkZXZlbnRzWyRpXVsndmVudWUnXVsnbmFtZSddID0gKHN0cmluZykgJGV2ZW50LT52ZW51ZS0+bmFtZTsNCgkJCQkJCSRldmVudHNbJGldWyd2ZW51ZSddWydsb2NhdGlvbiddWydjaXR5J10gPSAoc3RyaW5nKSAkZXZlbnQtPnZlbnVlLT5sb2NhdGlvbi0+Y2l0eTsNCgkJCQkJCSRldmVudHNbJGldWyd2ZW51ZSddWydsb2NhdGlvbiddWydjb3VudHJ5J10gPSAoc3RyaW5nKSAkZXZlbnQtPnZlbnVlLT5sb2NhdGlvbi0+Y291bnRyeTsNCgkJCQkJCSRldmVudHNbJGldWyd2ZW51ZSddWydsb2NhdGlvbiddWydzdHJlZXQnXSA9IChzdHJpbmcpICRldmVudC0+dmVudWUtPmxvY2F0aW9uLT5zdHJlZXQ7DQoJCQkJCQkkZXZlbnRzWyRpXVsndmVudWUnXVsnbG9jYXRpb24nXVsncG9zdGFsY29kZSddID0gKHN0cmluZykgJGV2ZW50LT52ZW51ZS0+bG9jYXRpb24tPnBvc3RhbGNvZGU7DQoJCQkJCQkkZ2VvUG9pbnRzID0gJGV2ZW50LT52ZW51ZS0+bG9jYXRpb24tPmNoaWxkcmVuKCdodHRwOi8vd3d3LnczLm9yZy8yMDAzLzAxL2dlby93Z3M4NF9wb3MjJyk7DQoJCQkJCQkkZXZlbnRzWyRpXVsndmVudWUnXVsnbG9jYXRpb24nXVsnZ2VvcG9pbnQnXVsnbGF0J10gPSAoc3RyaW5nKSAkZ2VvUG9pbnRzLT5wb2ludC0+bGF0Ow0KCQkJCQkJJGV2ZW50c1skaV1bJ3ZlbnVlJ11bJ2xvY2F0aW9uJ11bJ2dlb3BvaW50J11bJ2xvbmcnXSA9IChzdHJpbmcpICRnZW9Qb2ludHMtPnBvaW50LT5sb25nOw0KCQkJCQkJJGV2ZW50c1skaV1bJ3ZlbnVlJ11bJ3RpbWV6b25lJ10gPSAoc3RyaW5nKSAkZXZlbnQtPnZlbnVlLT5sb2NhdGlvbi0+dGltZXpvbmU7DQoJCQkJCQkkZXZlbnRzWyRpXVsnc3RhcnREYXRlJ10gPSBzdHJ0b3RpbWUodHJpbSgoc3RyaW5nKSAkZXZlbnQtPnN0YXJ0RGF0ZSkpOw0KCQkJCQkJJGV2ZW50c1skaV1bJ2Rlc2NyaXB0aW9uJ10gPSAoc3RyaW5nKSAkZXZlbnQtPmRlc2NyaXB0aW9uOw0KCQkJCQkJJGV2ZW50c1skaV1bJ2ltYWdlcyddWydzbWFsbCddID0gKHN0cmluZykgJGV2ZW50LT5pbWFnZVswXTsNCgkJCQkJCSRldmVudHNbJGldWydpbWFnZXMnXVsnbWVkaXVtJ10gPSAoc3RyaW5nKSAkZXZlbnQtPmltYWdlWzFdOw0KCQkJCQkJJGV2ZW50c1skaV1bJ2ltYWdlcyddWydsYXJnZSddID0gKHN0cmluZykgJGV2ZW50LT5pbWFnZVsyXTsNCgkJCQkJCSRldmVudHNbJGldWydhdHRlbmRhbmNlJ10gPSAoc3RyaW5nKSAkZXZlbnQtPmF0dGVuZGFuY2U7DQoJCQkJCQkkZXZlbnRzWyRpXVsncmV2aWV3cyddID0gKHN0cmluZykgJGV2ZW50LT5yZXZpZXdzOw0KCQkJCQkJJGV2ZW50c1skaV1bJ3RhZyddID0gKHN0cmluZykgJGV2ZW50LT50YWc7DQoJCQkJCQkkZXZlbnRzWyRpXVsndXJsJ10gPSAoc3RyaW5nKSAkZXZlbnQtPnVybDsNCgkJCQkJCSRpKys7DQoJCQkJCX0NCgkJCQkJcmV0dXJuICRldmVudHM7DQoJCQkJfQ0KCQkJCWVsc2Ugew0KCQkJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTAsICdUaGlzIHVzZXIgaGFzIG5vIGV2ZW50cycpOw0KCQkJCQlyZXR1cm4gRkFMU0U7DQoJCQkJfQ0KCQkJfQ0KCQkJZWxzZSB7DQoJCQkJcmV0dXJuIEZBTFNFOw0KCQkJfQ0KCQl9DQoJCWVsc2Ugew0KCQkJLy8gR2l2ZSBhIDkxIGVycm9yIGlmIGluY29ycmVjdCB2YXJpYWJsZXMgYXJlIHVzZWQNCgkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MSwgJ1lvdSBtdXN0IGluY2x1ZGUgYXJ0aXN0IHZhcmlhYmxlIGluIHRoZSBjYWxsIGZvciB0aGlzIG1ldGhvZCcpOw0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoJfQ0KCQ0KCS8qKg0KCSAqIEdldCBhIGxpc3Qgb2YgdGhlIHVzZXIncyBmcmllbmRzIG9uIExhc3QuZm0NCgkgKiBAcGFyYW0gYXJyYXkgJG1ldGhvZFZhcnMgQW4gYXJyYXkgd2l0aCB0aGUgZm9sbG93aW5nIHJlcXVpcmVkIHZhbHVlczogPGk+dXNlcjwvaT4NCgkgKiBAcmV0dXJuIGFycmF5DQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGdldEZyaWVuZHMoJG1ldGhvZFZhcnMpIHsNCgkJLy8gQ2hlY2sgZm9yIHJlcXVpcmVkIHZhcmlhYmxlcw0KCQlpZiAoICFlbXB0eSgkbWV0aG9kVmFyc1sndXNlciddKSApIHsNCgkJCSR2YXJzID0gYXJyYXkoDQoJCQkJJ21ldGhvZCcgPT4gJ3VzZXIuZ2V0ZnJpZW5kcycsDQoJCQkJJ2FwaV9rZXknID0+ICR0aGlzLT5hdXRoLT5hcGlLZXkNCgkJCSk7DQoJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkNCgkJCWlmICggJGNhbGwgPSAkdGhpcy0+YXBpR2V0Q2FsbCgkdmFycykgKSB7DQoJCQkJaWYgKCBjb3VudCgkY2FsbC0+ZnJpZW5kcy0+dXNlcikgPiAwICkgew0KCQkJCQkkaSA9IDA7DQoJCQkJCWZvcmVhY2ggKCAkY2FsbC0+ZnJpZW5kcy0+dXNlciBhcyAkdXNlciApIHsNCgkJCQkJCSRmcmllbmRzWyRpXVsnbmFtZSddID0gKHN0cmluZykgJHVzZXItPm5hbWU7DQoJCQkJCQkkZnJpZW5kc1skaV1bJ2ltYWdlcyddWydzbWFsbCddID0gKHN0cmluZykgJHVzZXItPmltYWdlWzBdOw0KCQkJCQkJJGZyaWVuZHNbJGldWydpbWFnZXMnXVsnbWVkaXVtJ10gPSAoc3RyaW5nKSAkdXNlci0+aW1hZ2VbMV07DQoJCQkJCQkkZnJpZW5kc1skaV1bJ2ltYWdlcyddWydsYXJnZSddID0gKHN0cmluZykgJHVzZXItPmltYWdlWzJdOw0KCQkJCQkJJGZyaWVuZHNbJGldWyd1cmwnXSA9IChzdHJpbmcpICR1c2VyLT51cmw7DQoJCQkJCQlpZiAoICFlbXB0eSgkcmVjZW50VHJhY2tzKSApIHsNCgkJCQkJCQkkZnJpZW5kc1skaV1bJ3JlY2VudHRyYWNrJ11bJ2FydGlzdCddWyduYW1lJ10gPSAoc3RyaW5nKSAkdXNlci0+cmVjZW50dHJhY2stPmFydGlzdC0+bmFtZTsNCgkJCQkJCQkkZnJpZW5kc1skaV1bJ3JlY2VudHRyYWNrJ11bJ2FydGlzdCddWydtYmlkJ10gPSAoc3RyaW5nKSAkdXNlci0+cmVjZW50dHJhY2stPmFydGlzdC0+bWJpZDsNCgkJCQkJCQkkZnJpZW5kc1skaV1bJ3JlY2VudHRyYWNrJ11bJ2FydGlzdCddWyd1cmwnXSA9IChzdHJpbmcpICR1c2VyLT5yZWNlbnR0cmFjay0+YXJ0aXN0LT51cmw7DQoJCQkJCQkJJGZyaWVuZHNbJGldWydyZWNlbnR0cmFjayddWyduYW1lJ10gPSAoc3RyaW5nKSAkdXNlci0+cmVjZW50dHJhY2stPm5hbWU7DQoJCQkJCQkJJGZyaWVuZHNbJGldWydyZWNlbnR0cmFjayddWydtYmlkJ10gPSAoc3RyaW5nKSAkdXNlci0+cmVjZW50dHJhY2stPm1iaWQ7DQoJCQkJCQkJJGZyaWVuZHNbJGldWydyZWNlbnR0cmFjayddWyd1cmwnXSA9IChzdHJpbmcpICR1c2VyLT5yZWNlbnR0cmFjay0+dXJsOw0KCQkJCQkJfQ0KCQkJCQkJJGkrKzsNCgkJCQkJfQ0KCQkJCQkNCgkJCQkJcmV0dXJuICRmcmllbmRzOw0KCQkJCX0NCgkJCQllbHNlIHsNCgkJCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkwLCAnVGhpcyB1c2VyIGhhcyBubyBmcmllbmRzJyk7DQoJCQkJCXJldHVybiBGQUxTRTsNCgkJCQl9DQoJCQl9DQoJCQllbHNlIHsNCgkJCQlyZXR1cm4gRkFMU0U7DQoJCQl9DQoJCX0NCgkJZWxzZSB7DQoJCQkvLyBHaXZlIGEgOTEgZXJyb3IgaWYgaW5jb3JyZWN0IHZhcmlhYmxlcyBhcmUgdXNlZA0KCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkxLCAnWW91IG11c3QgaW5jbHVkZSBhcnRpc3QgdmFyaWFibGUgaW4gdGhlIGNhbGwgZm9yIHRoaXMgbWV0aG9kJyk7DQoJCQlyZXR1cm4gRkFMU0U7DQoJCX0NCgl9DQoJDQoJLyoqDQoJICogR2V0IGluZm9ybWF0aW9uIGFib3V0IGEgdXNlciBwcm9maWxlIChSZXF1aXJlcyBmdWxsIGF1dGgpDQoJICogQHBhcmFtIGFycmF5ICRtZXRob2RWYXJzIEFuIGFycmF5IHdpdGggdGhlIGZvbGxvd2luZyByZXF1aXJlZCB2YWx1ZXM6IDxpPnVzZXI8L2k+DQoJICogQHJldHVybiBhcnJheQ0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBnZXRJbmZvKCRtZXRob2RWYXJzID0gQXJyYXkoKSkgew0KCQkvLyBPbmx5IGFsbG93IGZ1bGwgYXV0aGVkIGNhbGxzDQoJCWlmICggJHRoaXMtPmZ1bGxBdXRoID09IFRSVUUgKSB7DQoJCQkkdmFycyA9IGFycmF5KA0KCQkJCSdtZXRob2QnID0+ICd1c2VyLmdldGluZm8nLA0KCQkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXV0aC0+YXBpS2V5LA0KCQkJCSdzaycgPT4gJHRoaXMtPmF1dGgtPnNlc3Npb25LZXkNCgkJCSk7DQoJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkkYXBpU2lnID0gJHRoaXMtPmFwaVNpZygkdGhpcy0+YXV0aC0+c2VjcmV0LCAkdmFycyk7DQoJCQkkdmFyc1snYXBpX3NpZyddID0gJGFwaVNpZzsNCgkJCQ0KCQkJaWYgKCAkY2FsbCA9ICR0aGlzLT5hcGlHZXRDYWxsKCR2YXJzKSApIHsNCgkJCQkkaW5mb1snbmFtZSddID0gKHN0cmluZykgJGNhbGwtPnVzZXItPm5hbWU7DQoJCQkJJGluZm9bJ3VybCddID0gKHN0cmluZykgJGNhbGwtPnVzZXItPnVybDsNCgkJCQkkaW5mb1snaW1hZ2UnXSA9IChzdHJpbmcpICRjYWxsLT51c2VyLT5pbWFnZTsNCgkJCQkkaW5mb1snbGFuZyddID0gKHN0cmluZykgJGNhbGwtPnVzZXItPmxhbmc7DQoJCQkJJGluZm9bJ2NvdW50cnknXSA9IChzdHJpbmcpICRjYWxsLT51c2VyLT5jb3VudHJ5Ow0KCQkJCSRpbmZvWydhZ2UnXSA9IChzdHJpbmcpICRjYWxsLT51c2VyLT5hZ2U7DQoJCQkJJGluZm9bJ2dlbmRlciddID0gKHN0cmluZykgJGNhbGwtPnVzZXItPmdlbmRlcjsNCgkJCQkkaW5mb1snc3Vic2NyaWJlciddID0gKHN0cmluZykgJGNhbGwtPnVzZXItPnN1YnNjcmliZXI7DQoJCQkJJGluZm9bJ3BsYXljb3VudCddID0gKHN0cmluZykgJGNhbGwtPnVzZXItPnBsYXljb3VudDsNCgkJCQkkaW5mb1sncGxheWxpc3RzJ10gPSAoc3RyaW5nKSAkY2FsbC0+dXNlci0+cGxheWxpc3RzOw0KCQkJCQ0KCQkJCXJldHVybiAkaW5mbzsNCgkJCX0NCgkJCWVsc2Ugew0KCQkJCXJldHVybiBGQUxTRTsNCgkJCX0NCgkJfQ0KCQllbHNlIHsNCgkJCS8vIEdpdmUgYSA5MiBlcnJvciBpZiBub3QgZnVsbHkgYXV0aGVkDQoJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTIsICdNZXRob2QgcmVxdWlyZXMgZnVsbCBhdXRoLiBDYWxsIGF1dGguZ2V0U2Vzc2lvbiB1c2luZyBsYXN0Zm1BcGlBdXRoIGNsYXNzJyk7DQoJCQlyZXR1cm4gRkFMU0U7DQoJCX0NCgl9DQoJDQoJLyoqDQoJICogR2V0IHRoZSBsYXN0IDUwIHRyYWNrcyBsb3ZlZCBieSBhIHVzZXINCgkgKiBAcGFyYW0gYXJyYXkgJG1ldGhvZFZhcnMgQW4gYXJyYXkgd2l0aCB0aGUgZm9sbG93aW5nIHJlcXVpcmVkIHZhbHVlczogPGk+dXNlcjwvaT4NCgkgKiBAcmV0dXJuIGFycmF5DQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGdldExvdmVkVHJhY2tzKCRtZXRob2RWYXJzKSB7DQoJCS8vIENoZWNrIGZvciByZXF1aXJlZCB2YXJpYWJsZXMNCgkJaWYgKCAhZW1wdHkoJG1ldGhvZFZhcnNbJ3VzZXInXSkgKSB7DQoJCQkkdmFycyA9IGFycmF5KA0KCQkJCSdtZXRob2QnID0+ICd1c2VyLmdldGxvdmVkdHJhY2tzJywNCgkJCQknYXBpX2tleScgPT4gJHRoaXMtPmF1dGgtPmFwaUtleQ0KCQkJKTsNCgkJCSR2YXJzID0gYXJyYXlfbWVyZ2UoJHZhcnMsICRtZXRob2RWYXJzKTsNCgkJCQ0KCQkJaWYgKCAkY2FsbCA9ICR0aGlzLT5hcGlHZXRDYWxsKCR2YXJzKSApIHsNCgkJCQlpZiAoIGNvdW50KCRjYWxsLT5sb3ZlZHRyYWNrcy0+dHJhY2spID4gMCApIHsNCgkJCQkJJGkgPSAwOw0KCQkJCQlmb3JlYWNoICggJGNhbGwtPmxvdmVkdHJhY2tzLT50cmFjayBhcyAkdHJhY2sgKSB7DQoJCQkJCQkkbG92ZWRUcmFja3NbJGldWyduYW1lJ10gPSAoc3RyaW5nKSAkdHJhY2stPm5hbWU7DQoJCQkJCQkkbG92ZWRUcmFja3NbJGldWydtYmlkJ10gPSAoc3RyaW5nKSAkdHJhY2stPm1iaWQ7DQoJCQkJCQkkbG92ZWRUcmFja3NbJGldWyd1cmwnXSA9IChzdHJpbmcpICR0cmFjay0+dXJsOw0KCQkJCQkJJGxvdmVkVHJhY2tzWyRpXVsnZGF0ZSddID0gKHN0cmluZykgJHRyYWNrLT5kYXRlWyd1dHMnXTsNCgkJCQkJCSRsb3ZlZFRyYWNrc1skaV1bJ2FydGlzdCddWyduYW1lJ10gPSAoc3RyaW5nKSAkdHJhY2stPmFydGlzdC0+bmFtZTsNCgkJCQkJCSRsb3ZlZFRyYWNrc1skaV1bJ2FydGlzdCddWydtYmlkJ10gPSAoc3RyaW5nKSAkdHJhY2stPmFydGlzdC0+bWJpZDsNCgkJCQkJCSRsb3ZlZFRyYWNrc1skaV1bJ2FydGlzdCddWyd1cmwnXSA9IChzdHJpbmcpICR0cmFjay0+YXJ0aXN0LT51cmw7DQoJCQkJCQkkbG92ZWRUcmFja3NbJGldWydpbWFnZXMnXVsnc21hbGwnXSA9IChzdHJpbmcpICR0cmFjay0+aW1hZ2VbMF07DQoJCQkJCQkkbG92ZWRUcmFja3NbJGldWydpbWFnZXMnXVsnbWVkaXVtJ10gPSAoc3RyaW5nKSAkdHJhY2stPmltYWdlWzFdOw0KCQkJCQkJJGxvdmVkVHJhY2tzWyRpXVsnaW1hZ2VzJ11bJ2xhcmdlJ10gPSAoc3RyaW5nKSAkdHJhY2stPmltYWdlWzJdOw0KCQkJCQkJJGkrKzsNCgkJCQkJfQ0KCQkJCQkNCgkJCQkJcmV0dXJuICRsb3ZlZFRyYWNrczsNCgkJCQl9DQoJCQkJZWxzZSB7DQoJCQkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MCwgJ1RoaXMgdXNlciBoYXMgbm8gbG92ZWQgdHJhY2tzJyk7DQoJCQkJCXJldHVybiBGQUxTRTsNCgkJCQl9DQoJCQl9DQoJCQllbHNlIHsNCgkJCQlyZXR1cm4gRkFMU0U7DQoJCQl9DQoJCX0NCgkJZWxzZSB7DQoJCQkvLyBHaXZlIGEgOTEgZXJyb3IgaWYgaW5jb3JyZWN0IHZhcmlhYmxlcyBhcmUgdXNlZA0KCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkxLCAnWW91IG11c3QgaW5jbHVkZSBhcnRpc3QgdmFyaWFibGUgaW4gdGhlIGNhbGwgZm9yIHRoaXMgbWV0aG9kJyk7DQoJCQlyZXR1cm4gRkFMU0U7DQoJCX0NCgl9DQoJDQoJLyoqDQoJICogR2V0IGEgbGlzdCBvZiBhIHVzZXIncyBuZWlnaGJvdXJzIG9uIExhc3QuZm0NCgkgKiBAcGFyYW0gYXJyYXkgJG1ldGhvZFZhcnMgQW4gYXJyYXkgd2l0aCB0aGUgZm9sbG93aW5nIHJlcXVpcmVkIHZhbHVlczogPGk+dXNlcjwvaT4NCgkgKiBAcmV0dXJuIGFycmF5DQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGdldE5laWdoYm91cnMoJG1ldGhvZFZhcnMpIHsNCgkJLy8gQ2hlY2sgZm9yIHJlcXVpcmVkIHZhcmlhYmxlcw0KCQlpZiAoICFlbXB0eSgkbWV0aG9kVmFyc1sndXNlciddKSApIHsNCgkJCSR2YXJzID0gYXJyYXkoDQoJCQkJJ21ldGhvZCcgPT4gJ3VzZXIuZ2V0bmVpZ2hib3VycycsDQoJCQkJJ2FwaV9rZXknID0+ICR0aGlzLT5hdXRoLT5hcGlLZXkNCgkJCSk7DQoJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQlpZiAoICFlbXB0eSgkbWV0aG9kVmFyc1snbGltaXQnXSkgKSB7DQoJCQkJJHZhcnNbJ2xpbWl0J10gPSAkbWV0aG9kVmFyc1snbGltaXQnXTsNCgkJCX0NCgkJCQ0KCQkJaWYgKCAkY2FsbCA9ICR0aGlzLT5hcGlHZXRDYWxsKCR2YXJzKSApIHsNCgkJCQlpZiAoIGNvdW50KCRjYWxsLT5uZWlnaGJvdXJzLT51c2VyKSA+IDAgKSB7DQoJCQkJCSRpID0gMDsNCgkJCQkJZm9yZWFjaCAoICRjYWxsLT5uZWlnaGJvdXJzLT51c2VyIGFzICR1c2VyICkgew0KCQkJCQkJJG5laWdoYm91cnNbJGldWyduYW1lJ10gPSAoc3RyaW5nKSAkdXNlci0+bmFtZTsNCgkJCQkJCSRuZWlnaGJvdXJzWyRpXVsndXJsJ10gPSAoc3RyaW5nKSAkdXNlci0+dXJsOw0KCQkJCQkJJG5laWdoYm91cnNbJGldWydpbWFnZSddID0gKHN0cmluZykgJHVzZXItPmltYWdlOw0KCQkJCQkJJG5laWdoYm91cnNbJGldWydtYXRjaCddID0gKHN0cmluZykgJHVzZXItPm1hdGNoOw0KCQkJCQkJJGkrKzsNCgkJCQkJfQ0KCQkJCQkNCgkJCQkJcmV0dXJuICRuZWlnaGJvdXJzOw0KCQkJCX0NCgkJCQllbHNlIHsNCgkJCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkwLCAnVGhpcyB1c2VyIGhhcyBubyBuZWlnaGJvdXJzJyk7DQoJCQkJCXJldHVybiBGQUxTRTsNCgkJCQl9DQoJCQl9DQoJCQllbHNlIHsNCgkJCQlyZXR1cm4gRkFMU0U7DQoJCQl9DQoJCX0NCgkJZWxzZSB7DQoJCQkvLyBHaXZlIGEgOTEgZXJyb3IgaWYgaW5jb3JyZWN0IHZhcmlhYmxlcyBhcmUgdXNlZA0KCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkxLCAnWW91IG11c3QgaW5jbHVkZSBhcnRpc3QgdmFyaWFibGUgaW4gdGhlIGNhbGwgZm9yIHRoaXMgbWV0aG9kJyk7DQoJCQlyZXR1cm4gRkFMU0U7DQoJCX0NCgl9DQoJDQoJLyoqDQoJICogR2V0IGEgcGFnaW5hdGVkIGxpc3Qgb2YgYWxsIGV2ZW50cyBhIHVzZXIgaGFzIGF0dGVuZGVkIGluIHRoZSBwYXN0DQoJICogQHBhcmFtIGFycmF5ICRtZXRob2RWYXJzIEFuIGFycmF5IHdpdGggdGhlIGZvbGxvd2luZyByZXF1aXJlZCB2YWx1ZXM6IDxpPnVzZXI8L2k+DQoJICogQHJldHVybiBhcnJheQ0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBnZXRQYXN0RXZlbnRzKCRtZXRob2RWYXJzKSB7DQoJCS8vIENoZWNrIGZvciByZXF1aXJlZCB2YXJpYWJsZXMNCgkJaWYgKCAhZW1wdHkoJG1ldGhvZFZhcnNbJ3VzZXInXSkgKSB7DQoJCQkkdmFycyA9IGFycmF5KA0KCQkJCSdtZXRob2QnID0+ICd1c2VyLmdldHBhc3RldmVudHMnLA0KCQkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXV0aC0+YXBpS2V5DQoJCQkpOw0KCQkJJHZhcnMgPSBhcnJheV9tZXJnZSgkdmFycywgJG1ldGhvZFZhcnMpOw0KCQkJDQoJCQlpZiAoICRjYWxsID0gJHRoaXMtPmFwaUdldENhbGwoJHZhcnMpICkgew0KCQkJCWlmICggJGNhbGwtPmV2ZW50c1sndG90YWwnXSA+IDAgKSB7DQoJCQkJCSRpID0gMDsNCgkJCQkJZm9yZWFjaCAoICRjYWxsLT5ldmVudHMtPmV2ZW50IGFzICRldmVudCApIHsNCgkJCQkJCSRwYXN0RXZlbnRzWyRpXVsnaWQnXSA9IChzdHJpbmcpICRldmVudC0+aWQ7DQoJCQkJCQkkcGFzdEV2ZW50c1skaV1bJ3RpdGxlJ10gPSAoc3RyaW5nKSAkZXZlbnQtPnRpdGxlOw0KCQkJCQkJJGlpID0gMDsNCgkJCQkJCWZvcmVhY2ggKCAkZXZlbnQtPmFydGlzdHMtPmFydGlzdCBhcyAkYXJ0aXN0ICkgew0KCQkJCQkJCSRwYXN0RXZlbnRzWyRpXVsnYXJ0aXN0cyddWyRpaV0gPSAoc3RyaW5nKSAkYXJ0aXN0Ow0KCQkJCQkJCSRpaSsrOw0KCQkJCQkJfQ0KCQkJCQkJJHBhc3RFdmVudHNbJGldWydoZWFkbGluZXInXSA9IChzdHJpbmcpICRldmVudC0+YXJ0aXN0cy0+aGVhZGxpbmVyOw0KCQkJCQkJJHBhc3RFdmVudHNbJGldWyd2ZW51ZSddWyduYW1lJ10gPSAoc3RyaW5nKSAkZXZlbnQtPnZlbnVlLT5uYW1lOw0KCQkJCQkJJHBhc3RFdmVudHNbJGldWyd2ZW51ZSddWydsb2NhdGlvbiddWydjaXR5J10gPSAoc3RyaW5nKSAkZXZlbnQtPnZlbnVlLT5sb2NhdGlvbi0+Y2l0eTsNCgkJCQkJCSRwYXN0RXZlbnRzWyRpXVsndmVudWUnXVsnbG9jYXRpb24nXVsnY291bnRyeSddID0gKHN0cmluZykgJGV2ZW50LT52ZW51ZS0+bG9jYXRpb24tPmNvdW50cnk7DQoJCQkJCQkkcGFzdEV2ZW50c1skaV1bJ3ZlbnVlJ11bJ2xvY2F0aW9uJ11bJ3N0cmVldCddID0gKHN0cmluZykgJGV2ZW50LT52ZW51ZS0+bG9jYXRpb24tPnN0cmVldDsNCgkJCQkJCSRwYXN0RXZlbnRzWyRpXVsndmVudWUnXVsnbG9jYXRpb24nXVsncG9zdGFsY29kZSddID0gKHN0cmluZykgJGV2ZW50LT52ZW51ZS0+bG9jYXRpb24tPnBvc3RhbGNvZGU7DQoJCQkJCQkkZ2VvUG9pbnRzID0gJGV2ZW50LT52ZW51ZS0+bG9jYXRpb24tPmNoaWxkcmVuKCdodHRwOi8vd3d3LnczLm9yZy8yMDAzLzAxL2dlby93Z3M4NF9wb3MjJyk7DQoJCQkJCQkkcGFzdEV2ZW50c1skaV1bJ3ZlbnVlJ11bJ2xvY2F0aW9uJ11bJ2dlb3BvaW50J11bJ2xhdCddID0gKHN0cmluZykgJGdlb1BvaW50cy0+cG9pbnQtPmxhdDsNCgkJCQkJCSRwYXN0RXZlbnRzWyRpXVsndmVudWUnXVsnbG9jYXRpb24nXVsnZ2VvcG9pbnQnXVsnbG9uZyddID0gKHN0cmluZykgJGdlb1BvaW50cy0+cG9pbnQtPmxvbmc7DQoJCQkJCQkkcGFzdEV2ZW50c1skaV1bJ3N0YXJ0RGF0ZSddID0gc3RydG90aW1lKHRyaW0oKHN0cmluZykgJGV2ZW50LT5zdGFydERhdGUpKTsNCgkJCQkJCSRwYXN0RXZlbnRzWyRpXVsnZGVzY3JpcHRpb24nXSA9IChzdHJpbmcpICRldmVudC0+ZGVzY3JpcHRpb247DQoJCQkJCQkkcGFzdEV2ZW50c1skaV1bJ2ltYWdlcyddWydzbWFsbCddID0gKHN0cmluZykgJGV2ZW50LT5pbWFnZVswXTsNCgkJCQkJCSRwYXN0RXZlbnRzWyRpXVsnaW1hZ2VzJ11bJ21lZGl1bSddID0gKHN0cmluZykgJGV2ZW50LT5pbWFnZVsxXTsNCgkJCQkJCSRwYXN0RXZlbnRzWyRpXVsnaW1hZ2VzJ11bJ2xhcmdlJ10gPSAoc3RyaW5nKSAkZXZlbnQtPmltYWdlWzJdOw0KCQkJCQkJJHBhc3RFdmVudHNbJGldWydhdHRlbmRhbmNlJ10gPSAoc3RyaW5nKSAkZXZlbnQtPmF0dGVuZGFuY2U7DQoJCQkJCQkkcGFzdEV2ZW50c1skaV1bJ3Jldmlld3MnXSA9IChzdHJpbmcpICRldmVudC0+cmV2aWV3czsNCgkJCQkJCSRwYXN0RXZlbnRzWyRpXVsndGFnJ10gPSAoc3RyaW5nKSAkZXZlbnQtPnRhZzsNCgkJCQkJCSRwYXN0RXZlbnRzWyRpXVsndXJsJ10gPSAoc3RyaW5nKSAkZXZlbnQtPnVybDsNCgkJCQkJCSRpKys7DQoJCQkJCX0NCgkJCQkJDQoJCQkJCXJldHVybiAkcGFzdEV2ZW50czsNCgkJCQl9DQoJCQkJZWxzZSB7DQoJCQkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MCwgJ1RoaXMgdXNlciBoYXMgbm8gcGFzdCBldmVudHMnKTsNCgkJCQkJcmV0dXJuIEZBTFNFOw0KCQkJCX0NCgkJCX0NCgkJCWVsc2Ugew0KCQkJCXJldHVybiBGQUxTRTsNCgkJCX0NCgkJfQ0KCQllbHNlIHsNCgkJCS8vIEdpdmUgYSA5MSBlcnJvciBpZiBpbmNvcnJlY3QgdmFyaWFibGVzIGFyZSB1c2VkDQoJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTEsICdZb3UgbXVzdCBpbmNsdWRlIGFydGlzdCB2YXJpYWJsZSBpbiB0aGUgY2FsbCBmb3IgdGhpcyBtZXRob2QnKTsNCgkJCXJldHVybiBGQUxTRTsNCgkJfQ0KCX0NCgkNCgkvKioNCgkgKiBHZXQgYSBsaXN0IG9mIGEgdXNlcidzIHBsYXlsaXN0cyBvbiBMYXN0LmZtDQoJICogQHBhcmFtIGFycmF5ICRtZXRob2RWYXJzIEFuIGFycmF5IHdpdGggdGhlIGZvbGxvd2luZyByZXF1aXJlZCB2YWx1ZXM6IDxpPnVzZXI8L2k+DQoJICogQHJldHVybiBhcnJheQ0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBnZXRQbGF5bGlzdHMoJG1ldGhvZFZhcnMpIHsNCgkJLy8gQ2hlY2sgZm9yIHJlcXVpcmVkIHZhcmlhYmxlcw0KCQlpZiAoICFlbXB0eSgkbWV0aG9kVmFyc1sndXNlciddKSApIHsNCgkJCSR2YXJzID0gYXJyYXkoDQoJCQkJJ21ldGhvZCcgPT4gJ3VzZXIuZ2V0cGxheWxpc3RzJywNCgkJCQknYXBpX2tleScgPT4gJHRoaXMtPmF1dGgtPmFwaUtleQ0KCQkJKTsNCgkJCSR2YXJzID0gYXJyYXlfbWVyZ2UoJHZhcnMsICRtZXRob2RWYXJzKTsNCgkJCQ0KCQkJaWYgKCAkY2FsbCA9ICR0aGlzLT5hcGlHZXRDYWxsKCR2YXJzKSApIHsNCgkJCQlpZiAoIGNvdW50KCRjYWxsLT5wbGF5bGlzdHMtPnBsYXlsaXN0KSA+IDAgKSB7DQoJCQkJCSRpID0gMDsNCgkJCQkJZm9yZWFjaCAoICRjYWxsLT5wbGF5bGlzdHMtPnBsYXlsaXN0IGFzICRwbGF5bGlzdCApIHsNCgkJCQkJCSRwbGF5bGlzdHNbJGldWydpZCddID0gKHN0cmluZykgJHBsYXlsaXN0LT5pZDsNCgkJCQkJCSRwbGF5bGlzdHNbJGldWyd0aXRsZSddID0gKHN0cmluZykgJHBsYXlsaXN0LT50aXRsZTsNCgkJCQkJCSRwbGF5bGlzdHNbJGldWydkYXRlJ10gPSBzdHJ0b3RpbWUodHJpbSgoc3RyaW5nKSAkcGxheWxpc3QtPmRhdGUpKTsNCgkJCQkJCSRwbGF5bGlzdHNbJGldWydzaXplJ10gPSAoc3RyaW5nKSAkcGxheWxpc3QtPnNpemU7DQoJCQkJCQkkcGxheWxpc3RzWyRpXVsnc3RyZWFtYWxiZSddID0gKHN0cmluZykgJHBsYXlsaXN0LT5zdHJlYW1hYmxlOw0KCQkJCQkJJHBsYXlsaXN0c1skaV1bJ2NyZWF0b3InXSA9IChzdHJpbmcpICRwbGF5bGlzdC0+Y3JlYXRvcjsNCgkJCQkJCSRpKys7DQoJCQkJCX0NCgkJCQkJDQoJCQkJCXJldHVybiAkcGxheWxpc3RzOw0KCQkJCX0NCgkJCQllbHNlIHsNCgkJCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkwLCAnVGhpcyB1c2VyIGhhcyBubyBwYXN0IGV2ZW50cycpOw0KCQkJCQlyZXR1cm4gRkFMU0U7DQoJCQkJfQ0KCQkJfQ0KCQkJZWxzZSB7DQoJCQkJcmV0dXJuIEZBTFNFOw0KCQkJfQ0KCQl9DQoJCWVsc2Ugew0KCQkJLy8gR2l2ZSBhIDkxIGVycm9yIGlmIGluY29ycmVjdCB2YXJpYWJsZXMgYXJlIHVzZWQNCgkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MSwgJ1lvdSBtdXN0IGluY2x1ZGUgYXJ0aXN0IHZhcmlhYmxlIGluIHRoZSBjYWxsIGZvciB0aGlzIG1ldGhvZCcpOw0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoJfQ0KCQ0KCS8qKg0KCSAqIEdldCBhIGxpc3Qgb2YgdGhlIHJlY2VudCB0cmFja3MgbGlzdGVuZWQgdG8gYnkgdGhpcyB1c2VyLiBJbmRpY2F0ZXMgbm93IHBsYXlpbmcgdHJhY2sgaWYgdGhlIHVzZXIgaXMgY3VycmVudGx5IGxpc3RlbmluZw0KCSAqIEBwYXJhbSBhcnJheSAkbWV0aG9kVmFycyBBbiBhcnJheSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVxdWlyZWQgdmFsdWVzOiA8aT51c2VyPC9pPg0KCSAqIEByZXR1cm4gYXJyYXkNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gZ2V0UmVjZW50VHJhY2tzKCRtZXRob2RWYXJzKSB7DQoJCS8vIENoZWNrIGZvciByZXF1aXJlZCB2YXJpYWJsZXMNCgkJaWYgKCAhZW1wdHkoJG1ldGhvZFZhcnNbJ3VzZXInXSkgKSB7DQoJCQkkdmFycyA9IGFycmF5KA0KCQkJCSdtZXRob2QnID0+ICd1c2VyLmdldHJlY2VudHRyYWNrcycsDQoJCQkJJ2FwaV9rZXknID0+ICR0aGlzLT5hdXRoLT5hcGlLZXkNCgkJCSk7DQoJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkNCgkJCWlmICggJGNhbGwgPSAkdGhpcy0+YXBpR2V0Q2FsbCgkdmFycykgKSB7DQoJCQkJaWYgKCBjb3VudCgkY2FsbC0+cmVjZW50dHJhY2tzLT50cmFjaykgPiAwICkgew0KCQkJCQkkaSA9IDA7DQoJCQkJCWZvcmVhY2ggKCAkY2FsbC0+cmVjZW50dHJhY2tzLT50cmFjayBhcyAkdHJhY2sgKSB7DQoJCQkJCQkkcmVjZW50VHJhY2tzWyRpXVsnbmFtZSddID0gKHN0cmluZykgJHRyYWNrLT5uYW1lOw0KCQkJCQkJaWYgKCBpc3NldCgkdHJhY2tbJ25vd3BsYXlpbmcnXSkgKSB7DQoJCQkJCQkJJHJlY2VudFRyYWNrc1skaV1bJ25vd3BsYXlpbmcnXSA9IFRSVUU7DQoJCQkJCQl9DQoJCQkJCQkkcmVjZW50VHJhY2tzWyRpXVsnbWJpZCddID0gKHN0cmluZykgJHRyYWNrLT5tYmlkOw0KCQkJCQkJJHJlY2VudFRyYWNrc1skaV1bJ3VybCddID0gKHN0cmluZykgJHRyYWNrLT51cmw7DQoJCQkJCQkkcmVjZW50VHJhY2tzWyRpXVsnZGF0ZSddID0gKHN0cmluZykgJHRyYWNrLT5kYXRlWyd1dHMnXTsNCgkJCQkJCSRyZWNlbnRUcmFja3NbJGldWydzdHJlYW1hYmxlJ10gPSAoc3RyaW5nKSAkdHJhY2stPnN0cmVhbWFibGU7DQoJCQkJCQkkcmVjZW50VHJhY2tzWyRpXVsnYXJ0aXN0J11bJ25hbWUnXSA9IChzdHJpbmcpICR0cmFjay0+YXJ0aXN0Ow0KCQkJCQkJJHJlY2VudFRyYWNrc1skaV1bJ2FydGlzdCddWydtYmlkJ10gPSAoc3RyaW5nKSAkdHJhY2stPmFydGlzdFsnbWJpZCddOw0KCQkJCQkJJHJlY2VudFRyYWNrc1skaV1bJ2FsYnVtJ11bJ25hbWUnXSA9IChzdHJpbmcpICR0cmFjay0+YWxidW07DQoJCQkJCQkkcmVjZW50VHJhY2tzWyRpXVsnYWxidW0nXVsnbWJpZCddID0gKHN0cmluZykgJHRyYWNrLT5hbGJ1bVsnbWJpZCddOw0KCQkJCQkJJHJlY2VudFRyYWNrc1skaV1bJ2ltYWdlcyddWydzbWFsbCddID0gKHN0cmluZykgJHRyYWNrLT5pbWFnZVswXTsNCgkJCQkJCSRyZWNlbnRUcmFja3NbJGldWydpbWFnZXMnXVsnbWVkaXVtJ10gPSAoc3RyaW5nKSAkdHJhY2stPmltYWdlWzFdOw0KCQkJCQkJJHJlY2VudFRyYWNrc1skaV1bJ2ltYWdlcyddWydsYXJnZSddID0gKHN0cmluZykgJHRyYWNrLT5pbWFnZVsyXTsNCgkJCQkJCSRpKys7DQoJCQkJCX0NCgkJCQkJDQoJCQkJCXJldHVybiAkcmVjZW50VHJhY2tzOw0KCQkJCX0NCgkJCQllbHNlIHsNCgkJCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkwLCAnVGhpcyB1c2VyIGhhcyBubyByZWNlbnQgdHJhY2tzJyk7DQoJCQkJCXJldHVybiBGQUxTRTsNCgkJCQl9DQoJCQl9DQoJCQllbHNlIHsNCgkJCQlyZXR1cm4gRkFMU0U7DQoJCQl9DQoJCX0NCgkJZWxzZSB7DQoJCQkvLyBHaXZlIGEgOTEgZXJyb3IgaWYgaW5jb3JyZWN0IHZhcmlhYmxlcyBhcmUgdXNlZA0KCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkxLCAnWW91IG11c3QgaW5jbHVkZSBhcnRpc3QgdmFyaWFibGUgaW4gdGhlIGNhbGwgZm9yIHRoaXMgbWV0aG9kJyk7DQoJCQlyZXR1cm4gRkFMU0U7DQoJCX0NCgl9DQoJDQoJLyoqDQoJICogR2V0IExhc3QuZm0gYXJ0aXN0IHJlY29tbWVuZGF0aW9ucyBmb3IgYSB1c2VyIChSZXF1aXJlcyBmdWxsIGF1dGgpDQoJICogQHBhcmFtIGFycmF5ICRtZXRob2RWYXJzIEFuIGFycmF5IHdpdGggdGhlIGZvbGxvd2luZyBvcHRpb25hbCB2YWx1ZXM6IDxpPmxpbWl0PC9pPiwgPGk+cGFnZTwvaT4NCgkgKiBAcmV0dXJuIGFycmF5DQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGdldFJlY29tbWVuZGVkQXJ0aXN0cygkbWV0aG9kVmFycyA9IEFycmF5KCkpIHsNCgkJLy8gT25seSBhbGxvdyBmdWxsIGF1dGhlZCBjYWxscw0KCQlpZiAoICR0aGlzLT5mdWxsQXV0aCA9PSBUUlVFICkgew0KCQkJJHZhcnMgPSBhcnJheSgNCgkJCQknbWV0aG9kJyA9PiAndXNlci5nZXRyZWNvbW1lbmRlZGFydGlzdHMnLA0KCQkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXV0aC0+YXBpS2V5LA0KCQkJCSdzaycgPT4gJHRoaXMtPmF1dGgtPnNlc3Npb25LZXkNCgkJCSk7DQoJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkkYXBpU2lnID0gJHRoaXMtPmFwaVNpZygkdGhpcy0+YXV0aC0+c2VjcmV0LCAkdmFycyk7DQoJCQkkdmFyc1snYXBpX3NpZyddID0gJGFwaVNpZzsNCgkJCQ0KCQkJaWYgKCAkY2FsbCA9ICR0aGlzLT5hcGlHZXRDYWxsKCR2YXJzKSApIHsNCgkJCQlpZiAoIGNvdW50KCRjYWxsLT5yZWNvbW1lbmRhdGlvbnMtPmFydGlzdCkgPiAwICkgew0KCQkJCQkkcmVjY29tZW5kZWRBcnRpc3RzWyd1c2VyJ10gPSAoc3RyaW5nKSAkY2FsbC0+cmVjb21tZW5kYXRpb25zWyd1c2VyJ107DQoJCQkJCSRyZWNjb21lbmRlZEFydGlzdHNbJ3BhZ2UnXSA9IChzdHJpbmcpICRjYWxsLT5yZWNvbW1lbmRhdGlvbnNbJ3BhZ2UnXTsNCgkJCQkJJHJlY2NvbWVuZGVkQXJ0aXN0c1sncGVyUGFnZSddID0gKHN0cmluZykgJGNhbGwtPnJlY29tbWVuZGF0aW9uc1sncGVyUGFnZSddOw0KCQkJCQkkcmVjY29tZW5kZWRBcnRpc3RzWyd0b3RhbFBhZ2VzJ10gPSAoc3RyaW5nKSAkY2FsbC0+cmVjb21tZW5kYXRpb25zWyd0b3RhbFBhZ2VzJ107DQoJCQkJCSRyZWNjb21lbmRlZEFydGlzdHNbJ3RvdGFsJ10gPSAoc3RyaW5nKSAkY2FsbC0+cmVjb21tZW5kYXRpb25zWyd0b3RhbCddOw0KCQkJCQkNCgkJCQkJJGkgPSAwOw0KCQkJCQlmb3JlYWNoICggJGNhbGwtPnJlY29tbWVuZGF0aW9ucy0+YXJ0aXN0IGFzICRhcnRpc3QgKSB7DQoJCQkJCQkkcmVjY29tZW5kZWRBcnRpc3RzWydhcnRpc3RzJ11bJGldWyduYW1lJ10gPSAoc3RyaW5nKSAkYXJ0aXN0LT5uYW1lOw0KCQkJCQkJJHJlY2NvbWVuZGVkQXJ0aXN0c1snYXJ0aXN0cyddWyRpXVsnbWJpZCddID0gKHN0cmluZykgJGFydGlzdC0+bWJpZDsNCgkJCQkJCSRyZWNjb21lbmRlZEFydGlzdHNbJ2FydGlzdHMnXVskaV1bJ3VybCddID0gKHN0cmluZykgJGFydGlzdC0+dXJsOw0KCQkJCQkJJHJlY2NvbWVuZGVkQXJ0aXN0c1snYXJ0aXN0cyddWyRpXVsnc3RyZWFtYWJsZSddID0gKHN0cmluZykgJGFydGlzdC0+c3RyZWFtYWJsZTsNCgkJCQkJCSRyZWNjb21lbmRlZEFydGlzdHNbJ2FydGlzdHMnXVskaV1bJ2ltYWdlJ11bJ3NtYWxsJ10gPSAoc3RyaW5nKSAkYXJ0aXN0LT5pbWFnZVswXTsNCgkJCQkJCSRyZWNjb21lbmRlZEFydGlzdHNbJ2FydGlzdHMnXVskaV1bJ2ltYWdlJ11bJ21lZGl1bSddID0gKHN0cmluZykgJGFydGlzdC0+aW1hZ2VbMV07DQoJCQkJCQkkcmVjY29tZW5kZWRBcnRpc3RzWydhcnRpc3RzJ11bJGldWydpbWFnZSddWydsYXJnZSddID0gKHN0cmluZykgJGFydGlzdC0+aW1hZ2VbMl07DQoJCQkJCQkkaSsrOw0KCQkJCQl9DQoJCQkJDQoJCQkJCXJldHVybiAkcmVjY29tZW5kZWRBcnRpc3RzOw0KCQkJCX0NCgkJCQllbHNlIHsNCgkJCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkwLCAnVGhpcyB1c2VyIGhhcyBubyByZWNvbW1lbmRhdGlvbnMnKTsNCgkJCQkJcmV0dXJuIEZBTFNFOw0KCQkJCX0NCgkJCX0NCgkJCWVsc2Ugew0KCQkJCXJldHVybiBGQUxTRTsNCgkJCX0NCgkJfQ0KCQllbHNlIHsNCgkJCS8vIEdpdmUgYSA5MiBlcnJvciBpZiBub3QgZnVsbHkgYXV0aGVkDQoJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTIsICdNZXRob2QgcmVxdWlyZXMgZnVsbCBhdXRoLiBDYWxsIGF1dGguZ2V0U2Vzc2lvbiB1c2luZyBsYXN0Zm1BcGlBdXRoIGNsYXNzJyk7DQoJCQlyZXR1cm4gRkFMU0U7DQoJCX0NCgl9DQoJDQoJLyoqDQoJICogR2V0IGEgcGFnaW5hdGVkIGxpc3Qgb2YgYWxsIGV2ZW50cyByZWNvbW1lbmRlZCB0byBhIHVzZXIgYnkgTGFzdC5mbSwgYmFzZWQgb24gdGhlaXIgbGlzdGVuaW5nIHByb2ZpbGUgKFJlcXVpcmVzIGZ1bGwgYXV0aCkNCgkgKiBAcGFyYW0gYXJyYXkgJG1ldGhvZFZhcnMgQW4gYXJyYXkgd2l0aCB0aGUgZm9sbG93aW5nIG9wdGlvbmFsIHZhbHVlczogPGk+cGFnZTwvaT4sIDxpPmxpbWl0PC9pPg0KCSAqIEByZXR1cm4gYXJyYXkNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gZ2V0UmVjb21tZW5kZWRFdmVudHMoJG1ldGhvZFZhcnMgPSBBcnJheSgpKSB7DQoJCS8vIE9ubHkgYWxsb3cgZnVsbCBhdXRoZWQgY2FsbHMNCgkJaWYgKCAkdGhpcy0+ZnVsbEF1dGggPT0gVFJVRSApIHsNCgkJCSR2YXJzID0gYXJyYXkoDQoJCQkJJ21ldGhvZCcgPT4gJ3VzZXIuZ2V0cmVjb21tZW5kZWRldmVudHMnLA0KCQkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXV0aC0+YXBpS2V5LA0KCQkJCSdzaycgPT4gJHRoaXMtPmF1dGgtPnNlc3Npb25LZXkNCgkJCSk7DQoJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkkYXBpU2lnID0gJHRoaXMtPmFwaVNpZygkdGhpcy0+YXV0aC0+c2VjcmV0LCAkdmFycyk7DQoJCQkkdmFyc1snYXBpX3NpZyddID0gJGFwaVNpZzsNCgkJCQ0KCQkJaWYgKCAkY2FsbCA9ICR0aGlzLT5hcGlHZXRDYWxsKCR2YXJzKSApIHsNCgkJCQlpZiAoIGNvdW50KCRjYWxsLT5ldmVudHMtPmV2ZW50KSA+IDAgKSB7DQoJCQkJCSRyZWNjb21lbmRlZEV2ZW50c1sndXNlciddID0gKHN0cmluZykgJGNhbGwtPmV2ZW50c1sndXNlciddOw0KCQkJCQkkcmVjY29tZW5kZWRFdmVudHNbJ3BhZ2UnXSA9IChzdHJpbmcpICRjYWxsLT5ldmVudHNbJ3BhZ2UnXTsNCgkJCQkJJHJlY2NvbWVuZGVkRXZlbnRzWydwZXJQYWdlJ10gPSAoc3RyaW5nKSAkY2FsbC0+ZXZlbnRzWydwZXJQYWdlJ107DQoJCQkJCSRyZWNjb21lbmRlZEV2ZW50c1sndG90YWxQYWdlcyddID0gKHN0cmluZykgJGNhbGwtPmV2ZW50c1sndG90YWxQYWdlcyddOw0KCQkJCQkkcmVjY29tZW5kZWRFdmVudHNbJ3RvdGFsJ10gPSAoc3RyaW5nKSAkY2FsbC0+ZXZlbnRzWyd0b3RhbCddOw0KCQkJCQkNCgkJCQkJJGkgPSAwOw0KCQkJCQlmb3JlYWNoICggJGNhbGwtPmV2ZW50cy0+ZXZlbnQgYXMgJGV2ZW50ICkgew0KCQkJCQkJJHJlY2NvbWVuZGVkRXZlbnRzWydldmVudHMnXVskaV1bJ2lkJ10gPSAoc3RyaW5nKSAkZXZlbnQtPmlkOw0KCQkJCQkJJHJlY2NvbWVuZGVkRXZlbnRzWydldmVudHMnXVskaV1bJ3RpdGxlJ10gPSAoc3RyaW5nKSAkZXZlbnQtPnRpdGxlOw0KCQkJCQkJJGlpID0gMDsNCgkJCQkJCWZvcmVhY2ggKCAkZXZlbnQtPmFydGlzdHMtPmFydGlzdCBhcyAkYXJ0aXN0ICkgew0KCQkJCQkJCSRyZWNjb21lbmRlZEV2ZW50c1snZXZlbnRzJ11bJGldWydhcnRpc3RzJ11bJGlpXSA9IChzdHJpbmcpICRhcnRpc3Q7DQoJCQkJCQkJJGlpKys7DQoJCQkJCQl9DQoJCQkJCQkkcmVjY29tZW5kZWRFdmVudHNbJ2V2ZW50cyddWyRpXVsnaGVhZGxpbmVyJ10gPSAoc3RyaW5nKSAkZXZlbnQtPmFydGlzdHMtPmhlYWRsaW5lcjsNCgkJCQkJCSRyZWNjb21lbmRlZEV2ZW50c1snZXZlbnRzJ11bJGldWyd2ZW51ZSddWyduYW1lJ10gPSAoc3RyaW5nKSAkZXZlbnQtPnZlbnVlLT5uYW1lOw0KCQkJCQkJJHJlY2NvbWVuZGVkRXZlbnRzWydldmVudHMnXVskaV1bJ3ZlbnVlJ11bJ2xvY2F0aW9uJ11bJ2NpdHknXSA9IChzdHJpbmcpICRldmVudC0+dmVudWUtPmxvY2F0aW9uLT5jaXR5Ow0KCQkJCQkJJHJlY2NvbWVuZGVkRXZlbnRzWydldmVudHMnXVskaV1bJ3ZlbnVlJ11bJ2xvY2F0aW9uJ11bJ2NvdW50cnknXSA9IChzdHJpbmcpICRldmVudC0+dmVudWUtPmxvY2F0aW9uLT5jb3VudHJ5Ow0KCQkJCQkJJHJlY2NvbWVuZGVkRXZlbnRzWydldmVudHMnXVskaV1bJ3ZlbnVlJ11bJ2xvY2F0aW9uJ11bJ3N0cmVldCddID0gKHN0cmluZykgJGV2ZW50LT52ZW51ZS0+bG9jYXRpb24tPnN0cmVldDsNCgkJCQkJCSRyZWNjb21lbmRlZEV2ZW50c1snZXZlbnRzJ11bJGldWyd2ZW51ZSddWydsb2NhdGlvbiddWydwb3N0Y29kZSddID0gKHN0cmluZykgJGV2ZW50LT52ZW51ZS0+bG9jYXRpb24tPnBvc3RhbGNvZGU7DQoJCQkJCQkkZ2VvcG9pbnQgPSAgJGV2ZW50LT52ZW51ZS0+bG9jYXRpb24tPmNoaWxkcmVuKCdodHRwOi8vd3d3LnczLm9yZy8yMDAzLzAxL2dlby93Z3M4NF9wb3MjJyk7DQoJCQkJCQkkcmVjY29tZW5kZWRFdmVudHNbJ2V2ZW50cyddWyRpXVsndmVudWUnXVsnbG9jYXRpb24nXVsnZ2VvcG9pbnQnXVsnbGF0J10gPSAoc3RyaW5nKSAkZ2VvcG9pbnQtPnBvaW50LT5sYXQ7DQoJCQkJCQkkcmVjY29tZW5kZWRFdmVudHNbJ2V2ZW50cyddWyRpXVsndmVudWUnXVsnbG9jYXRpb24nXVsnZ2VvcG9pbnQnXVsnbG9uZyddID0gKHN0cmluZykgJGdlb3BvaW50LT5wb2ludC0+bG9uZzsNCgkJCQkJCSRyZWNjb21lbmRlZEV2ZW50c1snZXZlbnRzJ11bJGldWyd2ZW51ZSddWydsb2NhdGlvbiddWyd0aW1lem9uZSddID0gKHN0cmluZykgJGV2ZW50LT52ZW51ZS0+bG9jYXRpb24tPnRpbWV6b25lOw0KCQkJCQkJJHJlY2NvbWVuZGVkRXZlbnRzWydldmVudHMnXVskaV1bJ3ZlbnVlJ11bJ3VybCddID0gKHN0cmluZykgJGNhbGwtPnZlbnVlLT51cmw7DQoJCQkJCQkkcmVjY29tZW5kZWRFdmVudHNbJ2V2ZW50cyddWyRpXVsnc3RhcnRkYXRlJ10gPSBzdHJ0b3RpbWUodHJpbSgoc3RyaW5nKSAkZXZlbnQtPnN0YXJ0RGF0ZSkpOw0KCQkJCQkJJHJlY2NvbWVuZGVkRXZlbnRzWydldmVudHMnXVskaV1bJ2Rlc2NyaXB0aW9uJ10gPSAoc3RyaW5nKSAkZXZlbnQtPmRlc2NyaXB0aW9uOw0KCQkJCQkJJHJlY2NvbWVuZGVkRXZlbnRzWydldmVudHMnXVskaV1bJ2ltYWdlJ11bJ3NtYWxsJ10gPSAoc3RyaW5nKSAkZXZlbnQtPmltYWdlWzBdOw0KCQkJCQkJJHJlY2NvbWVuZGVkRXZlbnRzWydldmVudHMnXVskaV1bJ2ltYWdlJ11bJ21lZGl1bSddID0gKHN0cmluZykgJGV2ZW50LT5pbWFnZVsxXTsNCgkJCQkJCSRyZWNjb21lbmRlZEV2ZW50c1snZXZlbnRzJ11bJGldWydpbWFnZSddWydsYXJnZSddID0gKHN0cmluZykgJGV2ZW50LT5pbWFnZVsyXTsNCgkJCQkJCSRyZWNjb21lbmRlZEV2ZW50c1snZXZlbnRzJ11bJGldWydhdHRlbmRhbmNlJ10gPSAoc3RyaW5nKSAkZXZlbnQtPmF0dGVuZGFuY2U7DQoJCQkJCQkkcmVjY29tZW5kZWRFdmVudHNbJ2V2ZW50cyddWyRpXVsncmV2aWV3cyddID0gKHN0cmluZykgJGV2ZW50LT5yZXZpZXdzOw0KCQkJCQkJJHJlY2NvbWVuZGVkRXZlbnRzWydldmVudHMnXVskaV1bJ3RhZyddID0gKHN0cmluZykgJGV2ZW50LT50YWc7DQoJCQkJCQkkcmVjY29tZW5kZWRFdmVudHNbJ2V2ZW50cyddWyRpXVsndXJsJ10gPSAoc3RyaW5nKSAkZXZlbnQtPnVybDsNCgkJCQkJCSRpKys7DQoJCQkJCX0NCgkJCQkNCgkJCQkJcmV0dXJuICRyZWNjb21lbmRlZEV2ZW50czsNCgkJCQl9DQoJCQkJZWxzZSB7DQoJCQkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MCwgJ1RoaXMgdXNlciBoYXMgbm8gcmVjb21tZW5kYXRpb25zJyk7DQoJCQkJCXJldHVybiBGQUxTRTsNCgkJCQl9DQoJCQl9DQoJCQllbHNlIHsNCgkJCQlyZXR1cm4gRkFMU0U7DQoJCQl9DQoJCX0NCgkJZWxzZSB7DQoJCQkvLyBHaXZlIGEgOTIgZXJyb3IgaWYgbm90IGZ1bGx5IGF1dGhlZA0KCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkyLCAnTWV0aG9kIHJlcXVpcmVzIGZ1bGwgYXV0aC4gQ2FsbCBhdXRoLmdldFNlc3Npb24gdXNpbmcgbGFzdGZtQXBpQXV0aCBjbGFzcycpOw0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoJfQ0KCQ0KCS8qKg0KCSAqIEdldCBzaG91dHMgZm9yIHRoaXMgdXNlcg0KCSAqIEBwYXJhbSBhcnJheSAkbWV0aG9kVmFycyBBbiBhcnJheSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVxdWlyZWQgdmFsdWVzOiA8aT51c2VyPC9pPg0KCSAqIEByZXR1cm4gYXJyYXkNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gZ2V0U2hvdXRzKCRtZXRob2RWYXJzKSB7DQoJCWlmICggIWVtcHR5KCRtZXRob2RWYXJzWyd1c2VyJ10pICkgew0KCQkJJHZhcnMgPSBhcnJheSgNCgkJCQknbWV0aG9kJyA9PiAndXNlci5nZXRzaG91dHMnLA0KCQkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXV0aC0+YXBpS2V5DQoJCQkpOw0KCQkJJHZhcnMgPSBhcnJheV9tZXJnZSgkdmFycywgJG1ldGhvZFZhcnMpOw0KCQkJDQoJCQlpZiAoICRjYWxsID0gJHRoaXMtPmFwaUdldENhbGwoJHZhcnMpICkgew0KCQkJCSRzaG91dHNbJ3VzZXInXSA9IChzdHJpbmcpJGNhbGwtPnNob3V0c1sndXNlciddOw0KCQkJCSRzaG91dHNbJ3RvdGFsJ10gPSAoc3RyaW5nKSRjYWxsLT5zaG91dHNbJ3RvdGFsJ107DQoJCQkJJGkgPSAwOw0KCQkJCWZvcmVhY2ggKCAkY2FsbC0+c2hvdXRzLT5zaG91dCBhcyAkc2hvdXQgKSB7DQoJCQkJCSRzaG91dHNbJ3Nob3V0cyddWyRpXVsnYm9keSddID0gKHN0cmluZykkc2hvdXQtPmJvZHk7DQoJCQkJCSRzaG91dHNbJ3Nob3V0cyddWyRpXVsnYXV0aG9yJ10gPSAoc3RyaW5nKSRzaG91dC0+YXV0aG9yOw0KCQkJCQkkc2hvdXRzWydzaG91dHMnXVskaV1bJ2RhdGUnXSA9IHN0cnRvdGltZSgoc3RyaW5nKSRzaG91dC0+ZGF0ZSk7DQoJCQkJCSRpKys7DQoJCQkJfQ0KCQkJCQ0KCQkJCXJldHVybiAkc2hvdXRzOw0KCQkJfQ0KCQkJZWxzZSB7DQoJCQkJcmV0dXJuIEZBTFNFOw0KCQkJfQ0KCQl9DQoJCWVsc2Ugew0KCQkJLy8gR2l2ZSBhIDkxIGVycm9yIGlmIGluY29ycmVjdCB2YXJpYWJsZXMgYXJlIHVzZWQNCgkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MSwgJ1lvdSBtdXN0IGluY2x1ZGUgYXJ0aXN0IHZhcmlhYmxlIGluIHRoZSBjYWxsIGZvciB0aGlzIG1ldGhvZCcpOw0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoJfQ0KCQ0KCS8qKg0KCSAqIEdldCB0aGUgdG9wIGFsYnVtcyBsaXN0ZW5lZCB0byBieSBhIHVzZXIuIFlvdSBjYW4gc3RpcHVsYXRlIGEgdGltZSBwZXJpb2QuIFNlbmRzIHRoZSBvdmVyYWxsIGNoYXJ0IGJ5IGRlZmF1bHQNCgkgKiBAcGFyYW0gYXJyYXkgJG1ldGhvZFZhcnMgQW4gYXJyYXkgd2l0aCB0aGUgZm9sbG93aW5nIHJlcXVpcmVkIHZhbHVlczogPGk+dXNlcjwvaT4gYW5kIG9wdGlvbmFsIHZhbHVlOiA8aT5wZXJpb2Q8L2k+DQoJICogQHJldHVybiBhcnJheQ0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBnZXRUb3BBbGJ1bXMoJG1ldGhvZFZhcnMpIHsNCgkJLy8gQ2hlY2sgZm9yIHJlcXVpcmVkIHZhcmlhYmxlcw0KCQlpZiAoICFlbXB0eSgkbWV0aG9kVmFyc1sndXNlciddKSApIHsNCgkJCSR2YXJzID0gYXJyYXkoDQoJCQkJJ21ldGhvZCcgPT4gJ3VzZXIuZ2V0dG9wYWxidW1zJywNCgkJCQknYXBpX2tleScgPT4gJHRoaXMtPmF1dGgtPmFwaUtleQ0KCQkJKTsNCgkJCSR2YXJzID0gYXJyYXlfbWVyZ2UoJHZhcnMsICRtZXRob2RWYXJzKTsNCgkJCQ0KCQkJaWYgKCAkY2FsbCA9ICR0aGlzLT5hcGlHZXRDYWxsKCR2YXJzKSApIHsNCgkJCQlpZiAoIGNvdW50KCRjYWxsLT50b3BhbGJ1bXMtPmFsYnVtKSA+IDAgKSB7DQoJCQkJCSRpID0gMDsNCgkJCQkJZm9yZWFjaCAoICRjYWxsLT50b3BhbGJ1bXMtPmFsYnVtIGFzICRhbGJ1bSApIHsNCgkJCQkJCSR0b3BhbGJ1bXNbJGldWyduYW1lJ10gPSAoc3RyaW5nKSAkYWxidW0tPm5hbWU7DQoJCQkJCQkkdG9wYWxidW1zWyRpXVsncGxheWNvdW50J10gPSAoc3RyaW5nKSAkYWxidW0tPnBsYXljb3VudDsNCgkJCQkJCSR0b3BhbGJ1bXNbJGldWydtYmlkJ10gPSAoc3RyaW5nKSAkYWxidW0tPm1iaWQ7DQoJCQkJCQkkdG9wYWxidW1zWyRpXVsndXJsJ10gPSAoc3RyaW5nKSAkYWxidW0tPnVybDsNCgkJCQkJCSR0b3BhbGJ1bXNbJGldWydhcnRpc3QnXVsnbmFtZSddID0gKHN0cmluZykgJGFsYnVtLT5hcnRpc3QtPm5hbWU7DQoJCQkJCQkkdG9wYWxidW1zWyRpXVsnYXJ0aXN0J11bJ21iaWQnXSA9IChzdHJpbmcpICRhbGJ1bS0+YXJ0aXN0LT5tYmlkOw0KCQkJCQkJJHRvcGFsYnVtc1skaV1bJ2FydGlzdCddWyd1cmwnXSA9IChzdHJpbmcpICRhbGJ1bS0+YXJ0aXN0LT51cmw7DQoJCQkJCQkkdG9wYWxidW1zWyRpXVsnaW1hZ2VzJ11bJ3NtYWxsJ10gPSAoc3RyaW5nKSAkYWxidW0tPmltYWdlWzBdOw0KCQkJCQkJJHRvcGFsYnVtc1skaV1bJ2ltYWdlcyddWydtZWRpdW0nXSA9IChzdHJpbmcpICRhbGJ1bS0+aW1hZ2VbMV07DQoJCQkJCQkkdG9wYWxidW1zWyRpXVsnaW1hZ2VzJ11bJ2xhcmdlJ10gPSAoc3RyaW5nKSAkYWxidW0tPmltYWdlWzJdOw0KCQkJCQkJJGkrKzsNCgkJCQkJfQ0KCQkJCQkNCgkJCQkJcmV0dXJuICR0b3BhbGJ1bXM7DQoJCQkJfQ0KCQkJCWVsc2Ugew0KCQkJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTAsICdUaGlzIHVzZXIgaGFzIG5vIHRvcCBhbGJ1bXMnKTsNCgkJCQkJcmV0dXJuIEZBTFNFOw0KCQkJCX0NCgkJCX0NCgkJCWVsc2Ugew0KCQkJCXJldHVybiBGQUxTRTsNCgkJCX0NCgkJfQ0KCQllbHNlIHsNCgkJCS8vIEdpdmUgYSA5MSBlcnJvciBpZiBpbmNvcnJlY3QgdmFyaWFibGVzIGFyZSB1c2VkDQoJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTEsICdZb3UgbXVzdCBpbmNsdWRlIGFydGlzdCB2YXJpYWJsZSBpbiB0aGUgY2FsbCBmb3IgdGhpcyBtZXRob2QnKTsNCgkJCXJldHVybiBGQUxTRTsNCgkJfQ0KCX0NCgkNCgkvKioNCgkgKiBHZXQgdGhlIHRvcCBhcnRpc3RzIGxpc3RlbmVkIHRvIGJ5IGEgdXNlci4gWW91IGNhbiBzdGlwdWxhdGUgYSB0aW1lIHBlcmlvZC4gU2VuZHMgdGhlIG92ZXJhbGwgY2hhcnQgYnkgZGVmYXVsdA0KCSAqIEBwYXJhbSBhcnJheSAkbWV0aG9kVmFycyBBbiBhcnJheSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVxdWlyZWQgdmFsdWVzOiA8aT51c2VyPC9pPiBhbmQgb3B0aW9uYWwgdmFsdWU6IDxpPnBlcmlvZDwvaT4NCgkgKiBAcmV0dXJuIGFycmF5DQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGdldFRvcEFydGlzdHMoJG1ldGhvZFZhcnMpIHsNCgkJLy8gQ2hlY2sgZm9yIHJlcXVpcmVkIHZhcmlhYmxlcw0KCQlpZiAoICFlbXB0eSgkbWV0aG9kVmFyc1sndXNlciddKSApIHsNCgkJCSR2YXJzID0gYXJyYXkoDQoJCQkJJ21ldGhvZCcgPT4gJ3VzZXIuZ2V0dG9wYXJ0aXN0cycsDQoJCQkJJ2FwaV9rZXknID0+ICR0aGlzLT5hdXRoLT5hcGlLZXkNCgkJCSk7DQoJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkNCgkJCWlmICggJGNhbGwgPSAkdGhpcy0+YXBpR2V0Q2FsbCgkdmFycykgKSB7DQoJCQkJaWYgKCBjb3VudCgkY2FsbC0+dG9wYXJ0aXN0cy0+YXJ0aXN0KSA+IDAgKSB7DQoJCQkJCSRpID0gMDsNCgkJCQkJZm9yZWFjaCAoICRjYWxsLT50b3BhcnRpc3RzLT5hcnRpc3QgYXMgJGFydGlzdCApIHsNCgkJCQkJCSR0b3BhcnRpc3RzWyRpXVsnbmFtZSddID0gKHN0cmluZykgJGFydGlzdC0+bmFtZTsNCgkJCQkJCSR0b3BhcnRpc3RzWyRpXVsncmFuayddID0gKHN0cmluZykgJGFydGlzdFsncmFuayddOw0KCQkJCQkJJHRvcGFydGlzdHNbJGldWydwbGF5Y291bnQnXSA9IChzdHJpbmcpICRhcnRpc3QtPnBsYXljb3VudDsNCgkJCQkJCSR0b3BhcnRpc3RzWyRpXVsnbWJpZCddID0gKHN0cmluZykgJGFydGlzdC0+bWJpZDsNCgkJCQkJCSR0b3BhcnRpc3RzWyRpXVsndXJsJ10gPSAoc3RyaW5nKSAkYXJ0aXN0LT51cmw7DQoJCQkJCQkkdG9wYXJ0aXN0c1skaV1bJ3N0cmVhbWFibGUnXSA9IChzdHJpbmcpICRhcnRpc3QtPnN0cmVhbWFibGU7DQoJCQkJCQkkdG9wYXJ0aXN0c1skaV1bJ2ltYWdlcyddWydzbWFsbCddID0gKHN0cmluZykgJGFydGlzdC0+aW1hZ2VbMF07DQoJCQkJCQkkdG9wYXJ0aXN0c1skaV1bJ2ltYWdlcyddWydtZWRpdW0nXSA9IChzdHJpbmcpICRhcnRpc3QtPmltYWdlWzFdOw0KCQkJCQkJJHRvcGFydGlzdHNbJGldWydpbWFnZXMnXVsnbGFyZ2UnXSA9IChzdHJpbmcpICRhcnRpc3QtPmltYWdlWzJdOw0KCQkJCQkJJGkrKzsNCgkJCQkJfQ0KCQkJCQkNCgkJCQkJcmV0dXJuICR0b3BhcnRpc3RzOw0KCQkJCX0NCgkJCQllbHNlIHsNCgkJCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkwLCAnVGhpcyB1c2VyIGhhcyBubyB0b3AgYXJ0aXN0cycpOw0KCQkJCQlyZXR1cm4gRkFMU0U7DQoJCQkJfQ0KCQkJfQ0KCQkJZWxzZSB7DQoJCQkJcmV0dXJuIEZBTFNFOw0KCQkJfQ0KCQl9DQoJCWVsc2Ugew0KCQkJLy8gR2l2ZSBhIDkxIGVycm9yIGlmIGluY29ycmVjdCB2YXJpYWJsZXMgYXJlIHVzZWQNCgkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MSwgJ1lvdSBtdXN0IGluY2x1ZGUgYXJ0aXN0IHZhcmlhYmxlIGluIHRoZSBjYWxsIGZvciB0aGlzIG1ldGhvZCcpOw0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoJfQ0KCQ0KCS8qKg0KCSAqIEdldCB0aGUgdG9wIHRhZ3MgdXNlZCBieSB0aGlzIHVzZXINCgkgKiBAcGFyYW0gYXJyYXkgJG1ldGhvZFZhcnMgQW4gYXJyYXkgd2l0aCB0aGUgZm9sbG93aW5nIHJlcXVpcmVkIHZhbHVlczogPGk+dXNlcjwvaT4gYW5kIG9wdGlvbmFsIHZhbHVlOiA8aT5saW1pdDwvaT4NCgkgKiBAcmV0dXJuIGFycmF5DQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGdldFRvcFRhZ3MoJG1ldGhvZFZhcnMpIHsNCgkJLy8gQ2hlY2sgZm9yIHJlcXVpcmVkIHZhcmlhYmxlcw0KCQlpZiAoICFlbXB0eSgkbWV0aG9kVmFyc1sndXNlciddKSApIHsNCgkJCSR2YXJzID0gYXJyYXkoDQoJCQkJJ21ldGhvZCcgPT4gJ3VzZXIuZ2V0dG9wdGFncycsDQoJCQkJJ2FwaV9rZXknID0+ICR0aGlzLT5hdXRoLT5hcGlLZXkNCgkJCSk7DQoJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkNCgkJCWlmICggJGNhbGwgPSAkdGhpcy0+YXBpR2V0Q2FsbCgkdmFycykgKSB7DQoJCQkJaWYgKCBjb3VudCgkY2FsbC0+dG9wdGFncy0+dGFnKSA+IDAgKSB7DQoJCQkJCSRpID0gMDsNCgkJCQkJZm9yZWFjaCAoICRjYWxsLT50b3B0YWdzLT50YWcgYXMgJHRhZyApIHsNCgkJCQkJCSR0b3B0YWdzWyRpXVsnbmFtZSddID0gKHN0cmluZykgJHRhZy0+bmFtZTsNCgkJCQkJCSR0b3B0YWdzWyRpXVsnY291bnQnXSA9IChzdHJpbmcpICR0YWctPmNvdW50Ow0KCQkJCQkJJHRvcHRhZ3NbJGldWyd1cmwnXSA9IChzdHJpbmcpICR0YWctPnVybDsNCgkJCQkJCSRpKys7DQoJCQkJCX0NCgkJCQkJDQoJCQkJCXJldHVybiAkdG9wdGFnczsNCgkJCQl9DQoJCQkJZWxzZSB7DQoJCQkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MCwgJ1RoaXMgdXNlciBoYXMgbm8gdG9wIHRhZ3MnKTsNCgkJCQkJcmV0dXJuIEZBTFNFOw0KCQkJCX0NCgkJCX0NCgkJCWVsc2Ugew0KCQkJCXJldHVybiBGQUxTRTsNCgkJCX0NCgkJfQ0KCQllbHNlIHsNCgkJCS8vIEdpdmUgYSA5MSBlcnJvciBpZiBpbmNvcnJlY3QgdmFyaWFibGVzIGFyZSB1c2VkDQoJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTEsICdZb3UgbXVzdCBpbmNsdWRlIGFydGlzdCB2YXJpYWJsZSBpbiB0aGUgY2FsbCBmb3IgdGhpcyBtZXRob2QnKTsNCgkJCXJldHVybiBGQUxTRTsNCgkJfQ0KCX0NCgkNCgkvKioNCgkgKiBHZXQgdGhlIHRvcCB0cmFja3MgbGlzdGVuZWQgdG8gYnkgYSB1c2VyLiBZb3UgY2FuIHN0aXB1bGF0ZSBhIHRpbWUgcGVyaW9kLiBTZW5kcyB0aGUgb3ZlcmFsbCBjaGFydCBieSBkZWZhdWx0DQoJICogQHBhcmFtIGFycmF5ICRtZXRob2RWYXJzIEFuIGFycmF5IHdpdGggdGhlIGZvbGxvd2luZyByZXF1aXJlZCB2YWx1ZXM6IDxpPnVzZXI8L2k+IGFuZCBvcHRpb25hbCB2YWx1ZTogPGk+cGVyaW9kPC9pPg0KCSAqIEByZXR1cm4gYXJyYXkNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gZ2V0VG9wVHJhY2tzKCRtZXRob2RWYXJzKSB7DQoJCS8vIENoZWNrIGZvciByZXF1aXJlZCB2YXJpYWJsZXMNCgkJaWYgKCAhZW1wdHkoJG1ldGhvZFZhcnNbJ3VzZXInXSkgKSB7DQoJCQkkdmFycyA9IGFycmF5KA0KCQkJCSdtZXRob2QnID0+ICd1c2VyLmdldHRvcHRyYWNrcycsDQoJCQkJJ2FwaV9rZXknID0+ICR0aGlzLT5hdXRoLT5hcGlLZXkNCgkJCSk7DQoJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkNCgkJCWlmICggJGNhbGwgPSAkdGhpcy0+YXBpR2V0Q2FsbCgkdmFycykgKSB7DQoJCQkJaWYgKCBjb3VudCgkY2FsbC0+dG9wdHJhY2tzLT50cmFjaykgPiAwICkgew0KCQkJCQkkaSA9IDA7DQoJCQkJCWZvcmVhY2ggKCAkY2FsbC0+dG9wdHJhY2tzLT50cmFjayBhcyAkdHJhY2sgKSB7DQoJCQkJCQkkdG9wdHJhY2tzWyRpXVsnbmFtZSddID0gKHN0cmluZykgJHRyYWNrLT5uYW1lOw0KCQkJCQkJJHRvcHRyYWNrc1skaV1bJ3JhbmsnXSA9IChzdHJpbmcpICR0cmFja1sncmFuayddOw0KCQkJCQkJJHRvcHRyYWNrc1skaV1bJ3BsYXljb3VudCddID0gKHN0cmluZykgJHRyYWNrLT5wbGF5Y291bnQ7DQoJCQkJCQkkdG9wdHJhY2tzWyRpXVsnbWJpZCddID0gKHN0cmluZykgJHRyYWNrLT5tYmlkOw0KCQkJCQkJJHRvcHRyYWNrc1skaV1bJ3VybCddID0gKHN0cmluZykgJHRyYWNrLT51cmw7DQoJCQkJCQkkdG9wdHJhY2tzWyRpXVsnc3RyZWFtYWJsZSddID0gKHN0cmluZykgJHRyYWNrLT5zdHJlYW1hYmxlOw0KCQkJCQkJJHRvcHRyYWNrc1skaV1bJ2Z1bGx0cmFjayddID0gKHN0cmluZykgJHRyYWNrLT5zdHJlYW1hYmxlWydmdWxsdHJhY2snXTsNCgkJCQkJCSR0b3B0cmFja3NbJGldWydhcnRpc3QnXVsnbmFtZSddID0gKHN0cmluZykgJHRyYWNrLT5hcnRpc3QtPm5hbWU7DQoJCQkJCQkkdG9wdHJhY2tzWyRpXVsnYXJ0aXN0J11bJ21iaWQnXSA9IChzdHJpbmcpICR0cmFjay0+YXJ0aXN0LT5tYmlkOw0KCQkJCQkJJHRvcHRyYWNrc1skaV1bJ2FydGlzdCddWyd1cmwnXSA9IChzdHJpbmcpICR0cmFjay0+YXJ0aXN0LT51cmw7DQoJCQkJCQkkdG9wdHJhY2tzWyRpXVsnaW1hZ2VzJ11bJ3NtYWxsJ10gPSAoc3RyaW5nKSAkdHJhY2stPmltYWdlWzBdOw0KCQkJCQkJJHRvcHRyYWNrc1skaV1bJ2ltYWdlcyddWydtZWRpdW0nXSA9IChzdHJpbmcpICR0cmFjay0+aW1hZ2VbMV07DQoJCQkJCQkkdG9wdHJhY2tzWyRpXVsnaW1hZ2VzJ11bJ2xhcmdlJ10gPSAoc3RyaW5nKSAkdHJhY2stPmltYWdlWzJdOw0KCQkJCQkJJGkrKzsNCgkJCQkJfQ0KCQkJCQkNCgkJCQkJcmV0dXJuICR0b3B0cmFja3M7DQoJCQkJfQ0KCQkJCWVsc2Ugew0KCQkJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTAsICdUaGlzIHVzZXIgaGFzIG5vIHRvcCB0cmFja3MnKTsNCgkJCQkJcmV0dXJuIEZBTFNFOw0KCQkJCX0NCgkJCX0NCgkJCWVsc2Ugew0KCQkJCXJldHVybiBGQUxTRTsNCgkJCX0NCgkJfQ0KCQllbHNlIHsNCgkJCS8vIEdpdmUgYSA5MSBlcnJvciBpZiBpbmNvcnJlY3QgdmFyaWFibGVzIGFyZSB1c2VkDQoJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTEsICdZb3UgbXVzdCBpbmNsdWRlIGFydGlzdCB2YXJpYWJsZSBpbiB0aGUgY2FsbCBmb3IgdGhpcyBtZXRob2QnKTsNCgkJCXJldHVybiBGQUxTRTsNCgkJfQ0KCX0NCgkNCgkvKioNCgkgKiBHZXQgYW4gYWxidW0gY2hhcnQgZm9yIGEgdXNlciBwcm9maWxlLCBmb3IgYSBnaXZlbiBkYXRlIHJhbmdlLiBJZiBubyBkYXRlIHJhbmdlIGlzIHN1cHBsaWVkLCBpdCB3aWxsIHJldHVybiB0aGUgbW9zdCByZWNlbnQgYWxidW0gY2hhcnQgZm9yIHRoaXMgdXNlcg0KCSAqIEBwYXJhbSBhcnJheSAkbWV0aG9kVmFycyBBbiBhcnJheSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVxdWlyZWQgdmFsdWVzOiA8aT51c2VyPC9pPiBhbmQgb3B0aW9uYWwgdmFsdWVzOiA8aT50bzwvaT4sIDxpPmZyb208L2k+DQoJICogQHJldHVybiBhcnJheQ0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBnZXRXZWVrbHlBbGJ1bUNoYXJ0KCRtZXRob2RWYXJzKSB7DQoJCS8vIENoZWNrIGZvciByZXF1aXJlZCB2YXJpYWJsZXMNCgkJaWYgKCAhZW1wdHkoJG1ldGhvZFZhcnNbJ3VzZXInXSkgKSB7DQoJCQkkdmFycyA9IGFycmF5KA0KCQkJCSdtZXRob2QnID0+ICd1c2VyLmdldHdlZWtseWFsYnVtY2hhcnQnLA0KCQkJCSdhcGlfa2V5JyA9PiAkdGhpcy0+YXV0aC0+YXBpS2V5DQoJCQkpOw0KCQkJJHZhcnMgPSBhcnJheV9tZXJnZSgkdmFycywgJG1ldGhvZFZhcnMpOw0KCQkJDQoJCQlpZiAoICRjYWxsID0gJHRoaXMtPmFwaUdldENhbGwoJHZhcnMpICkgew0KCQkJCSRpID0gMDsNCgkJCQlmb3JlYWNoICggJGNhbGwtPndlZWtseWFsYnVtY2hhcnQtPmFsYnVtIGFzICRhbGJ1bSApIHsNCgkJCQkJJHdlZWtseWFsYnVtc1skaV1bJ25hbWUnXSA9IChzdHJpbmcpICRhbGJ1bS0+bmFtZTsNCgkJCQkJJHdlZWtseWFsYnVtc1skaV1bJ3JhbmsnXSA9IChzdHJpbmcpICRhbGJ1bVsncmFuayddOw0KCQkJCQkkd2Vla2x5YWxidW1zWyRpXVsnYXJ0aXN0J11bJ25hbWUnXSA9IChzdHJpbmcpICRhbGJ1bS0+YXJ0aXN0Ow0KCQkJCQkkd2Vla2x5YWxidW1zWyRpXVsnYXJ0aXN0J11bJ21iaWQnXSA9IChzdHJpbmcpICRhbGJ1bS0+YXJ0aXN0WydtYmlkJ107DQoJCQkJCSR3ZWVrbHlhbGJ1bXNbJGldWydtYmlkJ10gPSAoc3RyaW5nKSAkYWxidW0tPm1iaWQ7DQoJCQkJCSR3ZWVrbHlhbGJ1bXNbJGldWydwbGF5Y291bnQnXSA9IChzdHJpbmcpICRhbGJ1bS0+cGxheWNvdW50Ow0KCQkJCQkkd2Vla2x5YWxidW1zWyRpXVsndXJsJ10gPSAoc3RyaW5nKSAkYWxidW0tPnVybDsNCgkJCQkJJGkrKzsNCgkJCQl9DQoJCQkJDQoJCQkJcmV0dXJuICR3ZWVrbHlhbGJ1bXM7DQoJCQl9DQoJCQllbHNlIHsNCgkJCQlyZXR1cm4gRkFMU0U7DQoJCQl9DQoJCX0NCgkJZWxzZSB7DQoJCQkvLyBHaXZlIGEgOTEgZXJyb3IgaWYgaW5jb3JyZWN0IHZhcmlhYmxlcyBhcmUgdXNlZA0KCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkxLCAnWW91IG11c3QgaW5jbHVkZSBhcnRpc3QgdmFyaWFibGUgaW4gdGhlIGNhbGwgZm9yIHRoaXMgbWV0aG9kJyk7DQoJCQlyZXR1cm4gRkFMU0U7DQoJCX0NCgl9DQoJDQoJLyoqDQoJICogR2V0IGFuIGFydGlzdCBjaGFydCBmb3IgYSB1c2VyIHByb2ZpbGUsIGZvciBhIGdpdmVuIGRhdGUgcmFuZ2UuIElmIG5vIGRhdGUgcmFuZ2UgaXMgc3VwcGxpZWQsIGl0IHdpbGwgcmV0dXJuIHRoZSBtb3N0IHJlY2VudCBhcnRpc3QgY2hhcnQgZm9yIHRoaXMgdXNlcg0KCSAqIEBwYXJhbSBhcnJheSAkbWV0aG9kVmFycyBBbiBhcnJheSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVxdWlyZWQgdmFsdWVzOiA8aT51c2VyPC9pPiBhbmQgb3B0aW9uYWwgdmFsdWVzOiA8aT50bzwvaT4sIDxpPmZyb208L2k+DQoJICogQHJldHVybiBhcnJheQ0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBnZXRXZWVrbHlBcnRpc3RDaGFydCgkbWV0aG9kVmFycykgew0KCQkvLyBDaGVjayBmb3IgcmVxdWlyZWQgdmFyaWFibGVzDQoJCWlmICggIWVtcHR5KCRtZXRob2RWYXJzWyd1c2VyJ10pICkgew0KCQkJJHZhcnMgPSBhcnJheSgNCgkJCQknbWV0aG9kJyA9PiAndXNlci5nZXR3ZWVrbHlhcnRpc3RjaGFydCcsDQoJCQkJJ2FwaV9rZXknID0+ICR0aGlzLT5hdXRoLT5hcGlLZXkNCgkJCSk7DQoJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkNCgkJCWlmICggJGNhbGwgPSAkdGhpcy0+YXBpR2V0Q2FsbCgkdmFycykgKSB7DQoJCQkJJGkgPSAwOw0KCQkJCWZvcmVhY2ggKCAkY2FsbC0+d2Vla2x5YXJ0aXN0Y2hhcnQtPmFydGlzdCBhcyAkYXJ0aXN0ICkgew0KCQkJCQkkd2Vla2x5YXJ0aXN0c1skaV1bJ25hbWUnXSA9IChzdHJpbmcpICRhcnRpc3QtPm5hbWU7DQoJCQkJCSR3ZWVrbHlhcnRpc3RzWyRpXVsncmFuayddID0gKHN0cmluZykgJGFydGlzdFsncmFuayddOw0KCQkJCQkkd2Vla2x5YXJ0aXN0c1skaV1bJ21iaWQnXSA9IChzdHJpbmcpICRhcnRpc3QtPm1iaWQ7DQoJCQkJCSR3ZWVrbHlhcnRpc3RzWyRpXVsncGxheWNvdW50J10gPSAoc3RyaW5nKSAkYXJ0aXN0LT5wbGF5Y291bnQ7DQoJCQkJCSR3ZWVrbHlhcnRpc3RzWyRpXVsndXJsJ10gPSAoc3RyaW5nKSAkYXJ0aXN0LT51cmw7DQoJCQkJCSRpKys7DQoJCQkJfQ0KCQkJCQ0KCQkJCXJldHVybiAkd2Vla2x5YXJ0aXN0czsNCgkJCX0NCgkJCWVsc2Ugew0KCQkJCXJldHVybiBGQUxTRTsNCgkJCX0NCgkJfQ0KCQllbHNlIHsNCgkJCS8vIEdpdmUgYSA5MSBlcnJvciBpZiBpbmNvcnJlY3QgdmFyaWFibGVzIGFyZSB1c2VkDQoJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTEsICdZb3UgbXVzdCBpbmNsdWRlIGFydGlzdCB2YXJpYWJsZSBpbiB0aGUgY2FsbCBmb3IgdGhpcyBtZXRob2QnKTsNCgkJCXJldHVybiBGQUxTRTsNCgkJfQ0KCX0NCgkNCgkvKioNCgkgKiBHZXQgYSBsaXN0IG9mIGF2YWlsYWJsZSBjaGFydHMgZm9yIHRoaXMgdXNlciwgZXhwcmVzc2VkIGFzIGRhdGUgcmFuZ2VzIHdoaWNoIGNhbiBiZSBzZW50IHRvIHRoZSBjaGFydCBzZXJ2aWNlcw0KCSAqIEBwYXJhbSBhcnJheSAkbWV0aG9kVmFycyBBbiBhcnJheSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVxdWlyZWQgdmFsdWVzOiA8aT51c2VyPC9pPg0KCSAqIEByZXR1cm4gYXJyYXkNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gZ2V0V2Vla2x5Q2hhcnRMaXN0KCRtZXRob2RWYXJzKSB7DQoJCS8vIENoZWNrIGZvciByZXF1aXJlZCB2YXJpYWJsZXMNCgkJaWYgKCAhZW1wdHkoJG1ldGhvZFZhcnNbJ3VzZXInXSkgKSB7DQoJCQkkdmFycyA9IGFycmF5KA0KCQkJCSdtZXRob2QnID0+ICd1c2VyLmdldHdlZWtseWNoYXJ0bGlzdCcsDQoJCQkJJ2FwaV9rZXknID0+ICR0aGlzLT5hdXRoLT5hcGlLZXkNCgkJCSk7DQoJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkNCgkJCWlmICggJGNhbGwgPSAkdGhpcy0+YXBpR2V0Q2FsbCgkdmFycykgKSB7DQoJCQkJJGkgPSAwOw0KCQkJCWZvcmVhY2ggKCAkY2FsbC0+d2Vla2x5Y2hhcnRsaXN0LT5jaGFydCBhcyAkY2hhcnQgKSB7DQoJCQkJCSR3ZWVrbHljaGFydGxpc3RbJGldWydmcm9tJ10gPSAoc3RyaW5nKSAkY2hhcnRbJ2Zyb20nXTsNCgkJCQkJJHdlZWtseWNoYXJ0bGlzdFskaV1bJ3RvJ10gPSAoc3RyaW5nKSAkY2hhcnRbJ3RvJ107DQoJCQkJCSRpKys7DQoJCQkJfQ0KCQkJCQ0KCQkJCXJldHVybiAkd2Vla2x5Y2hhcnRsaXN0Ow0KCQkJfQ0KCQkJZWxzZSB7DQoJCQkJcmV0dXJuIEZBTFNFOw0KCQkJfQ0KCQl9DQoJCWVsc2Ugew0KCQkJLy8gR2l2ZSBhIDkxIGVycm9yIGlmIGluY29ycmVjdCB2YXJpYWJsZXMgYXJlIHVzZWQNCgkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MSwgJ1lvdSBtdXN0IGluY2x1ZGUgYXJ0aXN0IHZhcmlhYmxlIGluIHRoZSBjYWxsIGZvciB0aGlzIG1ldGhvZCcpOw0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoJfQ0KCQ0KCS8qKg0KCSAqIEdldCBhIHRyYWNrIGNoYXJ0IGZvciBhIHVzZXIgcHJvZmlsZSwgZm9yIGEgZ2l2ZW4gZGF0ZSByYW5nZS4gSWYgbm8gZGF0ZSByYW5nZSBpcyBzdXBwbGllZCwgaXQgd2lsbCByZXR1cm4gdGhlIG1vc3QgcmVjZW50IHRyYWNrIGNoYXJ0IGZvciB0aGlzIHVzZXINCgkgKiBAcGFyYW0gYXJyYXkgJG1ldGhvZFZhcnMgQW4gYXJyYXkgd2l0aCB0aGUgZm9sbG93aW5nIHJlcXVpcmVkIHZhbHVlczogPGk+dXNlcjwvaT4gYW5kIG9wdGlvbmFsIHZhbHVlczogPGk+dG88L2k+LCA8aT5mcm9tPC9pPg0KCSAqIEByZXR1cm4gYXJyYXkNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gZ2V0V2Vla2x5VHJhY2tDaGFydCgkbWV0aG9kVmFycykgew0KCQkvLyBDaGVjayBmb3IgcmVxdWlyZWQgdmFyaWFibGVzDQoJCWlmICggIWVtcHR5KCRtZXRob2RWYXJzWyd1c2VyJ10pICkgew0KCQkJJHZhcnMgPSBhcnJheSgNCgkJCQknbWV0aG9kJyA9PiAndXNlci5nZXR3ZWVrbHl0cmFja2NoYXJ0JywNCgkJCQknYXBpX2tleScgPT4gJHRoaXMtPmF1dGgtPmFwaUtleQ0KCQkJKTsNCgkJCSR2YXJzID0gYXJyYXlfbWVyZ2UoJHZhcnMsICRtZXRob2RWYXJzKTsNCgkJCQ0KCQkJaWYgKCAkY2FsbCA9ICR0aGlzLT5hcGlHZXRDYWxsKCR2YXJzKSApIHsNCgkJCQkkaSA9IDA7DQoJCQkJZm9yZWFjaCAoICRjYWxsLT53ZWVrbHl0cmFja2NoYXJ0LT50cmFjayBhcyAkdHJhY2sgKSB7DQoJCQkJCSR3ZWVrbHl0cmFja3NbJGldWyduYW1lJ10gPSAoc3RyaW5nKSAkdHJhY2stPm5hbWU7DQoJCQkJCSR3ZWVrbHl0cmFja3NbJGldWydyYW5rJ10gPSAoc3RyaW5nKSAkdHJhY2tbJ3JhbmsnXTsNCgkJCQkJJHdlZWtseXRyYWNrc1skaV1bJ2FydGlzdCddWyduYW1lJ10gPSAoc3RyaW5nKSAkdHJhY2stPmFydGlzdDsNCgkJCQkJJHdlZWtseXRyYWNrc1skaV1bJ2FydGlzdCddWydtYmlkJ10gPSAoc3RyaW5nKSAkdHJhY2stPmFydGlzdFsnbWJpZCddOw0KCQkJCQkkd2Vla2x5dHJhY2tzWyRpXVsnbWJpZCddID0gKHN0cmluZykgJHRyYWNrLT5tYmlkOw0KCQkJCQkkd2Vla2x5dHJhY2tzWyRpXVsncGxheWNvdW50J10gPSAoc3RyaW5nKSAkdHJhY2stPnBsYXljb3VudDsNCgkJCQkJJHdlZWtseXRyYWNrc1skaV1bJ3VybCddID0gKHN0cmluZykgJHRyYWNrLT51cmw7DQoJCQkJCSRpKys7DQoJCQkJfQ0KCQkJCQ0KCQkJCXJldHVybiAkd2Vla2x5dHJhY2tzOw0KCQkJfQ0KCQkJZWxzZSB7DQoJCQkJcmV0dXJuIEZBTFNFOw0KCQkJfQ0KCQl9DQoJCWVsc2Ugew0KCQkJLy8gR2l2ZSBhIDkxIGVycm9yIGlmIGluY29ycmVjdCB2YXJpYWJsZXMgYXJlIHVzZWQNCgkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MSwgJ1lvdSBtdXN0IGluY2x1ZGUgYXJ0aXN0IHZhcmlhYmxlIGluIHRoZSBjYWxsIGZvciB0aGlzIG1ldGhvZCcpOw0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoJfQ0KCQ0KCS8qKg0KCSAqIFNob3V0IG9uIHRoaXMgdXNlcidzIHNob3V0Ym94IChSZXF1aXJlcyBmdWxsIGF1dGgpDQoJICogQHBhcmFtIGFycmF5ICRtZXRob2RWYXJzIEFuIGFycmF5IHdpdGggdGhlIGZvbGxvd2luZyByZXF1aXJlZCB2YWx1ZXM6IDxpPnVzZXI8L2k+LCA8aT5tZXNzYWdlPC9pPg0KCSAqIEByZXR1cm4gYm9vbGVhbg0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBzaG91dCgkbWV0aG9kVmFycykgew0KCQkvLyBPbmx5IGFsbG93IGZ1bGwgYXV0aGVkIGNhbGxzDQoJCWlmICggJHRoaXMtPmZ1bGxBdXRoID09IFRSVUUgKSB7DQoJCQkvLyBDaGVjayBmb3IgcmVxdWlyZWQgdmFyaWFibGVzDQoJCQlpZiAoICFlbXB0eSgkbWV0aG9kVmFyc1sndXNlciddKSAmJiAhZW1wdHkoJG1ldGhvZFZhcnNbJ21lc3NhZ2UnXSkgKSB7DQoJCQkJJHZhcnMgPSBhcnJheSgNCgkJCQkJJ21ldGhvZCcgPT4gJ3VzZXIuc2hvdXQnLA0KCQkJCQknYXBpX2tleScgPT4gJHRoaXMtPmF1dGgtPmFwaUtleSwNCgkJCQkJJ3NrJyA9PiAkdGhpcy0+YXV0aC0+c2Vzc2lvbktleQ0KCQkJCSk7DQoJCQkJJHZhcnMgPSBhcnJheV9tZXJnZSgkdmFycywgJG1ldGhvZFZhcnMpOw0KCQkJCSRzaWcgPSAkdGhpcy0+YXBpU2lnKCR0aGlzLT5hdXRoLT5zZWNyZXQsICR2YXJzKTsNCgkJCQkkdmFyc1snYXBpX3NpZyddID0gJHNpZzsNCgkJCQkNCgkJCQlpZiAoICRjYWxsID0gJHRoaXMtPmFwaVBvc3RDYWxsKCR2YXJzKSApIHsNCgkJCQkJcmV0dXJuIFRSVUU7DQoJCQkJfQ0KCQkJCWVsc2Ugew0KCQkJCQlyZXR1cm4gRkFMU0U7DQoJCQkJfQ0KCQkJfQ0KCQkJZWxzZSB7DQoJCQkJLy8gR2l2ZSBhIDkxIGVycm9yIGlmIGluY29ycmVjdCB2YXJpYWJsZXMgYXJlIHVzZWQNCgkJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTEsICdZb3UgbXVzdCBpbmNsdWRlIHVzZXIgYW5kIG1lc3NhZ2UgdmFyaWFibGVzIGluIHRoZSBjYWxsIGZvciB0aGlzIG1ldGhvZCcpOw0KCQkJCXJldHVybiBGQUxTRTsNCgkJCX0NCgkJfQ0KCQllbHNlIHsNCgkJCS8vIEdpdmUgYSA5MiBlcnJvciBpZiBub3QgZnVsbHkgYXV0aGVkDQoJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTIsICdNZXRob2QgcmVxdWlyZXMgZnVsbCBhdXRoLiBDYWxsIGF1dGguZ2V0U2Vzc2lvbiB1c2luZyBsYXN0Zm1BcGlBdXRoIGNsYXNzJyk7DQoJCQlyZXR1cm4gRkFMU0U7DQoJCX0NCgl9DQp9DQoNCj8+]]></data>
	</file>
	<file>
	  <filename>/lib/lastfmapi/api/venue.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogRmlsZSB0aGF0IHN0b3JlcyBhcGkgY2FsbHMgZm9yIHZlbnVlIGFwaSBjYWxscw0KICogQHBhY2thZ2UgYXBpY2FsbHMNCiAqLw0KLyoqDQogKiBBbGxvd3MgYWNjZXNzIHRvIHRoZSBhcGkgcmVxdWVzdHMgcmVsYXRpbmcgdG8gdmVudWVzDQogKiBAcGFja2FnZSBhcGljYWxscw0KICovDQpjbGFzcyBsYXN0Zm1BcGlWZW51ZSBleHRlbmRzIGxhc3RmbUFwaSB7DQoJLyoqDQoJICogU3RvcmVzIHRoZSBjb25maWcgdmFsdWVzIHNldCBpbiB0aGUgY2FsbA0KCSAqIEBhY2Nlc3MgcHVibGljDQoJICogQHZhciBhcnJheQ0KCSAqLw0KCXB1YmxpYyAkY29uZmlnOw0KCS8qKg0KCSAqIFN0b3JlcyB0aGUgYXV0aCB2YXJpYWJsZXMgdXNlZCBpbiBhbGwgYXBpIGNhbGxzDQoJICogQGFjY2VzcyBwcml2YXRlDQoJICogQHZhciBhcnJheQ0KCSAqLw0KCXByaXZhdGUgJGF1dGg7DQoJLyoqDQoJICogU3RhdGVzIGlmIHRoZSB1c2VyIGhhcyBmdWxsIGF1dGhlbnRpY2F0aW9uIHRvIHVzZSBhcGkgcmVxdWVzdHMgdGhhdCBtb2RpZnkgZGF0YQ0KCSAqIEBhY2Nlc3MgcHJpdmF0ZQ0KCSAqIEB2YXIgYm9vbGVhbg0KCSAqLw0KCXByaXZhdGUgJGZ1bGxBdXRoOw0KCQ0KCS8qKg0KCSAqIEBwYXJhbSBhcnJheSAkYXV0aCBQYXNzZXMgdGhlIGF1dGhlbnRpY2F0aW9uIHZhcmlhYmxlcw0KCSAqIEBwYXJhbSBhcnJheSAkZnVsbEF1dGggQSBib29sZWFuIHZhbHVlIHN0YXRpbmcgaWYgdGhlIHVzZXIgaGFzIGZ1bGwgYXV0aGVudGljYXRpb24gb3Igbm90DQoJICogQHBhcmFtIGFycmF5ICRjb25maWcgQW4gYXJyYXkgb2YgY29uZmlnIHZhcmlhYmxlcyByZWxhdGVkIHRvIGNhY2hpbmcgYW5kIG90aGVyIGZlYXR1cmVzDQoJICovDQoJZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGF1dGgsICRmdWxsQXV0aCwgJGNvbmZpZykgew0KCQkkdGhpcy0+YXV0aCA9ICRhdXRoOw0KCQkkdGhpcy0+ZnVsbEF1dGggPSAkZnVsbEF1dGg7DQoJCSR0aGlzLT5jb25maWcgPSAkY29uZmlnOw0KCX0NCgkNCgkvKioNCgkgKiBHZXQgYSBsaXN0IG9mIHVwY29taW5nIGV2ZW50cyBhdCB0aGlzIHZlbnVlDQoJICogQHBhcmFtIGFycmF5ICRtZXRob2RWYXJzIEFuIGFycmF5IHdpdGggdGhlIGZvbGxvd2luZyByZXF1aXJlZCB2YWx1ZTogPGk+dmVudWU8L2k+DQoJICogQHJldHVybiBhcnJheQ0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBnZXRFdmVudHMoJG1ldGhvZFZhcnMpIHsNCgkJaWYgKCAhZW1wdHkoJG1ldGhvZFZhcnNbJ3ZlbnVlJ10pICkgew0KCQkJJHZhcnMgPSBhcnJheSgNCgkJCQknbWV0aG9kJyA9PiAndmVudWUuZ2V0RXZlbnRzJywNCgkJCQknYXBpX2tleScgPT4gJHRoaXMtPmF1dGgtPmFwaUtleQ0KCQkJKTsNCgkJCSR2YXJzID0gYXJyYXlfbWVyZ2UoJHZhcnMsICRtZXRob2RWYXJzKTsNCgkJCQ0KCQkJaWYgKCAkY2FsbCA9ICR0aGlzLT5hcGlHZXRDYWxsKCR2YXJzKSApIHsNCgkJCQlpZiAoIGNvdW50KCRjYWxsLT5ldmVudHMtPmV2ZW50KSA+IDAgKSB7DQoJCQkJCSRldmVudHMgPSBhcnJheSgpOw0KCQkJCQkkZXZlbnRzWyd2ZW51ZV9uYW1lJ10gPSAoc3RyaW5nKSAkY2FsbC0+ZXZlbnRzWyd2ZW51ZSddOw0KCQkJCQkkaSA9IDA7DQoJCQkJCWZvcmVhY2ggKCAkY2FsbC0+ZXZlbnRzLT5ldmVudCBhcyAkZXZlbnQgKSB7DQoJCQkJCQkkZXZlbnRzWydldmVudCddWyRpXVsnaWQnXSA9IChzdHJpbmcpICRldmVudC0+aWQ7DQoJCQkJCQkkZXZlbnRzWydldmVudCddWyRpXVsnc3RhdHVzJ10gPSAoc3RyaW5nKSAkZXZlbnRbJ3N0YXR1cyddOw0KCQkJCQkJJGV2ZW50c1snZXZlbnQnXVskaV1bJ3RpdGxlJ10gPSAoc3RyaW5nKSAkZXZlbnQtPnRpdGxlOw0KCQkJCQkJaWYgKCBjb3VudCgkZXZlbnQtPmFydGlzdHMtPmFydGlzdCkgPiAwICkgew0KCQkJCQkJCWZvcmVhY2ggKCAkZXZlbnQtPmFydGlzdHMtPmFydGlzdCBhcyAkYXJ0aXN0ICkgew0KCQkJCQkJCQkkZXZlbnRzWydldmVudCddWyRpXVsnYXJ0aXN0cyddW10gPSAoc3RyaW5nKSAkYXJ0aXN0Ow0KCQkJCQkJCX0NCgkJCQkJCX0NCgkJCQkJCSRldmVudHNbJ2V2ZW50J11bJGldWydoZWFkbGluZXInXSA9IChzdHJpbmcpICRldmVudC0+YXJ0aXN0cy0+aGVhZGxpbmVyOw0KCQkJCQkJJGV2ZW50c1snZXZlbnQnXVskaV1bJ3ZlbnVlJ11bJ2lkJ10gPSAoc3RyaW5nKSAkZXZlbnQtPnZlbnVlLT5pZDsNCgkJCQkJCSRldmVudHNbJ2V2ZW50J11bJGldWyd2ZW51ZSddWyduYW1lJ10gPSAoc3RyaW5nKSAkZXZlbnQtPnZlbnVlLT5uYW1lOw0KCQkJCQkJJGV2ZW50c1snZXZlbnQnXVskaV1bJ3ZlbnVlJ11bJ2xvY2F0aW9uJ11bJ2NpdHknXSA9IChzdHJpbmcpICRldmVudC0+dmVudWUtPmxvY2F0aW9uLT5jaXR5Ow0KCQkJCQkJJGV2ZW50c1snZXZlbnQnXVskaV1bJ3ZlbnVlJ11bJ2xvY2F0aW9uJ11bJ2NvdW50cnknXSA9IChzdHJpbmcpICRldmVudC0+dmVudWUtPmxvY2F0aW9uLT5jb3VudHJ5Ow0KCQkJCQkJJGV2ZW50c1snZXZlbnQnXVskaV1bJ3ZlbnVlJ11bJ2xvY2F0aW9uJ11bJ3N0cmVldCddID0gKHN0cmluZykgJGV2ZW50LT52ZW51ZS0+bG9jYXRpb24tPnN0cmVldDsNCgkJCQkJCSRldmVudHNbJ2V2ZW50J11bJGldWyd2ZW51ZSddWydsb2NhdGlvbiddWydwb3N0YWxjb2RlJ10gPSAoc3RyaW5nKSAkZXZlbnQtPnZlbnVlLT5sb2NhdGlvbi0+cG9zdGFsY29kZTsNCgkJCQkJCSRnZW9Qb2ludHMgPSAkZXZlbnQtPnZlbnVlLT5sb2NhdGlvbi0+Y2hpbGRyZW4oJ2h0dHA6Ly93d3cudzMub3JnLzIwMDMvMDEvZ2VvL3dnczg0X3BvcyMnKTsNCgkJCQkJCSRldmVudHNbJ2V2ZW50J11bJGldWyd2ZW51ZSddWydsb2NhdGlvbiddWydnZW9wb2ludCddWydsYXQnXSA9IChzdHJpbmcpICRnZW9Qb2ludHMtPnBvaW50LT5sYXQ7DQoJCQkJCQkkZXZlbnRzWydldmVudCddWyRpXVsndmVudWUnXVsnbG9jYXRpb24nXVsnZ2VvcG9pbnQnXVsnbG9uZyddID0gKHN0cmluZykgJGdlb1BvaW50cy0+cG9pbnQtPmxvbmc7DQoJCQkJCQkkZXZlbnRzWydldmVudCddWyRpXVsndmVudWUnXVsndXJsJ10gPSAoc3RyaW5nKSAkZXZlbnQtPnZlbnVlLT51cmw7DQoJCQkJCQkkZXZlbnRzWydldmVudCddWyRpXVsnc3RhcnREYXRlJ10gPSAoc3RyaW5nKSBzdHJ0b3RpbWUoJGV2ZW50LT5zdGFydERhdGUpOw0KCQkJCQkJJGV2ZW50c1snZXZlbnQnXVskaV1bJ2Rlc2NyaXB0aW9uJ10gPSAoc3RyaW5nKSAkZXZlbnQtPmRlc2NyaXB0aW9uOw0KCQkJCQkJJGV2ZW50c1snZXZlbnQnXVskaV1bJ2ltYWdlJ11bJ3NtYWxsJ10gPSAoc3RyaW5nKSAkZXZlbnQtPmltYWdlWzBdOw0KCQkJCQkJJGV2ZW50c1snZXZlbnQnXVskaV1bJ2ltYWdlJ11bJ21lZGl1bSddID0gKHN0cmluZykgJGV2ZW50LT5pbWFnZVsxXTsNCgkJCQkJCSRldmVudHNbJ2V2ZW50J11bJGldWydpbWFnZSddWydsYXJnZSddID0gKHN0cmluZykgJGV2ZW50LT5pbWFnZVsyXTsNCgkJCQkJCSRldmVudHNbJ2V2ZW50J11bJGldWydhdHRlbmRhbmNlJ10gPSAoc3RyaW5nKSAkZXZlbnQtPmF0dGVuZGFuY2U7DQoJCQkJCQkkZXZlbnRzWydldmVudCddWyRpXVsncmV2aWV3cyddID0gKHN0cmluZykgJGV2ZW50LT5yZXZpZXdzOw0KCQkJCQkJJGV2ZW50c1snZXZlbnQnXVskaV1bJ3RhZyddID0gKHN0cmluZykgJGV2ZW50LT50YWc7DQoJCQkJCQkkZXZlbnRzWydldmVudCddWyRpXVsndXJsJ10gPSAoc3RyaW5nKSAkZXZlbnQtPnVybDsNCgkJCQkJCSRpKys7DQoJCQkJCX0NCgkJCQkJDQoJCQkJCXJldHVybiAkZXZlbnRzOw0KCQkJCX0NCgkJCQllbHNlIHsNCgkJCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkwLCAnVGhlcmUgaXMgbm8gZXZlbnRzIGZvciB0aGlzIHZlbnVlJyk7DQoJCQkJCXJldHVybiBGQUxTRTsNCgkJCQl9DQoJCQl9DQoJCQllbHNlIHsNCgkJCQlyZXR1cm4gRkFMU0U7DQoJCQl9DQoJCX0NCgkJZWxzZSB7DQoJCQkvLyBHaXZlIGEgOTEgZXJyb3IgaWYgaW5jb3JyZWN0IHZhcmlhYmxlcyBhcmUgdXNlZA0KCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkxLCAnWW91IG11c3QgaW5jbHVkZSB0aGUgdmVudWUgdmFyaWFibGUgaW4gdGhlIGNhbGwgZm9yIHRoaXMgbWV0aG9kJyk7DQoJCQlyZXR1cm4gRkFMU0U7DQoJCX0NCgl9DQoJDQoJLyoqDQoJICogR2V0IGEgcGFnaW5hdGVkIGxpc3Qgb2YgYWxsIHRoZSBldmVudHMgaGVsZCBhdCB0aGlzIHZlbnVlIGluIHRoZSBwYXN0DQoJICogQHBhcmFtIGFycmF5ICRtZXRob2RWYXJzIEFuIGFycmF5IHdpdGggdGhlIGZvbGxvd2luZyByZXF1aXJlZCB2YWx1ZTogPGk+dmVudWU8L2k+IGFuZCBvcHRpb25hbCB2YWx1ZXM6IDxpPnBhZ2U8L2k+LCA8aT5saW1pdDwvaT4NCgkgKiBAcmV0dXJuIGFycmF5DQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGdldFBhc3RFdmVudHMoJG1ldGhvZFZhcnMpIHsNCgkJaWYgKCAhZW1wdHkoJG1ldGhvZFZhcnNbJ3ZlbnVlJ10pICkgew0KCQkJJHZhcnMgPSBhcnJheSgNCgkJCQknbWV0aG9kJyA9PiAndmVudWUuZ2V0UGFzdEV2ZW50cycsDQoJCQkJJ2FwaV9rZXknID0+ICR0aGlzLT5hdXRoLT5hcGlLZXkNCgkJCSk7DQoJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkNCgkJCWlmICggJGNhbGwgPSAkdGhpcy0+YXBpR2V0Q2FsbCgkdmFycykgKSB7DQoJCQkJaWYgKCBjb3VudCgkY2FsbC0+ZXZlbnRzLT5ldmVudCkgPiAwICkgew0KCQkJCQkkZXZlbnRzID0gYXJyYXkoKTsNCgkJCQkJJGV2ZW50c1sndmVudWVfbmFtZSddID0gKHN0cmluZykgJGNhbGwtPmV2ZW50c1sndmVudWUnXTsNCgkJCQkJJGV2ZW50c1sncGFnZSddID0gKHN0cmluZykgJGNhbGwtPmV2ZW50c1sncGFnZSddOw0KCQkJCQkkZXZlbnRzWydwZXJQYWdlJ10gPSAoc3RyaW5nKSAkY2FsbC0+ZXZlbnRzWydwZXJQYWdlJ107DQoJCQkJCSRldmVudHNbJ3RvdGFsJ10gPSAoc3RyaW5nKSAkY2FsbC0+ZXZlbnRzWyd0b3RhbCddOw0KCQkJCQkkZXZlbnRzWyd0b3RhbFBhZ2VzJ10gPSAoc3RyaW5nKSAkY2FsbC0+ZXZlbnRzWyd0b3RhbFBhZ2VzJ107DQoJCQkJCSRpID0gMDsNCgkJCQkJZm9yZWFjaCAoICRjYWxsLT5ldmVudHMtPmV2ZW50IGFzICRldmVudCApIHsNCgkJCQkJCSRldmVudHNbJ2V2ZW50J11bJGldWydpZCddID0gKHN0cmluZykgJGV2ZW50LT5pZDsNCgkJCQkJCSRldmVudHNbJ2V2ZW50J11bJGldWydzdGF0dXMnXSA9IChzdHJpbmcpICRldmVudFsnc3RhdHVzJ107DQoJCQkJCQkkZXZlbnRzWydldmVudCddWyRpXVsndGl0bGUnXSA9IChzdHJpbmcpICRldmVudC0+dGl0bGU7DQoJCQkJCQlpZiAoIGNvdW50KCRldmVudC0+YXJ0aXN0cy0+YXJ0aXN0KSA+IDAgKSB7DQoJCQkJCQkJZm9yZWFjaCAoICRldmVudC0+YXJ0aXN0cy0+YXJ0aXN0IGFzICRhcnRpc3QgKSB7DQoJCQkJCQkJCSRldmVudHNbJ2V2ZW50J11bJGldWydhcnRpc3RzJ11bXSA9IChzdHJpbmcpICRhcnRpc3Q7DQoJCQkJCQkJfQ0KCQkJCQkJfQ0KCQkJCQkJJGV2ZW50c1snZXZlbnQnXVskaV1bJ2hlYWRsaW5lciddID0gKHN0cmluZykgJGV2ZW50LT5hcnRpc3RzLT5oZWFkbGluZXI7DQoJCQkJCQkkZXZlbnRzWydldmVudCddWyRpXVsndmVudWUnXVsnaWQnXSA9IChzdHJpbmcpICRldmVudC0+dmVudWUtPmlkOw0KCQkJCQkJJGV2ZW50c1snZXZlbnQnXVskaV1bJ3ZlbnVlJ11bJ25hbWUnXSA9IChzdHJpbmcpICRldmVudC0+dmVudWUtPm5hbWU7DQoJCQkJCQkkZXZlbnRzWydldmVudCddWyRpXVsndmVudWUnXVsnbG9jYXRpb24nXVsnY2l0eSddID0gKHN0cmluZykgJGV2ZW50LT52ZW51ZS0+bG9jYXRpb24tPmNpdHk7DQoJCQkJCQkkZXZlbnRzWydldmVudCddWyRpXVsndmVudWUnXVsnbG9jYXRpb24nXVsnY291bnRyeSddID0gKHN0cmluZykgJGV2ZW50LT52ZW51ZS0+bG9jYXRpb24tPmNvdW50cnk7DQoJCQkJCQkkZXZlbnRzWydldmVudCddWyRpXVsndmVudWUnXVsnbG9jYXRpb24nXVsnc3RyZWV0J10gPSAoc3RyaW5nKSAkZXZlbnQtPnZlbnVlLT5sb2NhdGlvbi0+c3RyZWV0Ow0KCQkJCQkJJGV2ZW50c1snZXZlbnQnXVskaV1bJ3ZlbnVlJ11bJ2xvY2F0aW9uJ11bJ3Bvc3RhbGNvZGUnXSA9IChzdHJpbmcpICRldmVudC0+dmVudWUtPmxvY2F0aW9uLT5wb3N0YWxjb2RlOw0KCQkJCQkJJGdlb1BvaW50cyA9ICRldmVudC0+dmVudWUtPmxvY2F0aW9uLT5jaGlsZHJlbignaHR0cDovL3d3dy53My5vcmcvMjAwMy8wMS9nZW8vd2dzODRfcG9zIycpOw0KCQkJCQkJJGV2ZW50c1snZXZlbnQnXVskaV1bJ3ZlbnVlJ11bJ2xvY2F0aW9uJ11bJ2dlb3BvaW50J11bJ2xhdCddID0gKHN0cmluZykgJGdlb1BvaW50cy0+cG9pbnQtPmxhdDsNCgkJCQkJCSRldmVudHNbJ2V2ZW50J11bJGldWyd2ZW51ZSddWydsb2NhdGlvbiddWydnZW9wb2ludCddWydsb25nJ10gPSAoc3RyaW5nKSAkZ2VvUG9pbnRzLT5wb2ludC0+bG9uZzsNCgkJCQkJCSRldmVudHNbJ2V2ZW50J11bJGldWyd2ZW51ZSddWyd1cmwnXSA9IChzdHJpbmcpICRldmVudC0+dmVudWUtPnVybDsNCgkJCQkJCSRldmVudHNbJ2V2ZW50J11bJGldWydzdGFydERhdGUnXSA9IChzdHJpbmcpIHN0cnRvdGltZSgkZXZlbnQtPnN0YXJ0RGF0ZSk7DQoJCQkJCQkkZXZlbnRzWydldmVudCddWyRpXVsnZGVzY3JpcHRpb24nXSA9IChzdHJpbmcpICRldmVudC0+ZGVzY3JpcHRpb247DQoJCQkJCQkkZXZlbnRzWydldmVudCddWyRpXVsnaW1hZ2UnXVsnc21hbGwnXSA9IChzdHJpbmcpICRldmVudC0+aW1hZ2VbMF07DQoJCQkJCQkkZXZlbnRzWydldmVudCddWyRpXVsnaW1hZ2UnXVsnbWVkaXVtJ10gPSAoc3RyaW5nKSAkZXZlbnQtPmltYWdlWzFdOw0KCQkJCQkJJGV2ZW50c1snZXZlbnQnXVskaV1bJ2ltYWdlJ11bJ2xhcmdlJ10gPSAoc3RyaW5nKSAkZXZlbnQtPmltYWdlWzJdOw0KCQkJCQkJJGV2ZW50c1snZXZlbnQnXVskaV1bJ2F0dGVuZGFuY2UnXSA9IChzdHJpbmcpICRldmVudC0+YXR0ZW5kYW5jZTsNCgkJCQkJCSRldmVudHNbJ2V2ZW50J11bJGldWydyZXZpZXdzJ10gPSAoc3RyaW5nKSAkZXZlbnQtPnJldmlld3M7DQoJCQkJCQkkZXZlbnRzWydldmVudCddWyRpXVsndGFnJ10gPSAoc3RyaW5nKSAkZXZlbnQtPnRhZzsNCgkJCQkJCSRldmVudHNbJ2V2ZW50J11bJGldWyd1cmwnXSA9IChzdHJpbmcpICRldmVudC0+dXJsOw0KCQkJCQkJJGkrKzsNCgkJCQkJfQ0KCQkJCQkNCgkJCQkJcmV0dXJuICRldmVudHM7DQoJCQkJfQ0KCQkJCWVsc2Ugew0KCQkJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTAsICdUaGVyZSBpcyBubyBwYXN0IGV2ZW50cyBmb3IgdGhpcyB2ZW51ZScpOw0KCQkJCQlyZXR1cm4gRkFMU0U7DQoJCQkJfQ0KCQkJfQ0KCQkJZWxzZSB7DQoJCQkJcmV0dXJuIEZBTFNFOw0KCQkJfQ0KCQl9DQoJCWVsc2Ugew0KCQkJLy8gR2l2ZSBhIDkxIGVycm9yIGlmIGluY29ycmVjdCB2YXJpYWJsZXMgYXJlIHVzZWQNCgkJCSR0aGlzLT5oYW5kbGVFcnJvcig5MSwgJ1lvdSBtdXN0IGluY2x1ZGUgdGhlIHZlbnVlIHZhcmlhYmxlIGluIHRoZSBjYWxsIGZvciB0aGlzIG1ldGhvZCcpOw0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoJfQ0KCQ0KCS8qKg0KCSAqIFNlYXJjaCBmb3IgYSB2ZW51ZSBieSB2ZW51ZSBuYW1lDQoJICogQHBhcmFtIGFycmF5ICRtZXRob2RWYXJzIEFuIGFycmF5IHdpdGggdGhlIGZvbGxvd2luZyByZXF1aXJlZCB2YWx1ZTogPGk+dmVudWU8L2k+IGFuZCBvcHRpb25hbCB2YWx1ZXM6IDxpPmxpbWl0PC9pPiwgPGk+cGFnZTwvaT4sIDxpPmNvdW50eTwvaT4NCgkgKiBAcmV0dXJuIGFycmF5DQoJICovDQoJcHVibGljIGZ1bmN0aW9uIHNlYXJjaCgkbWV0aG9kVmFycykgew0KCQkvLyBDaGVjayBmb3IgcmVxdWlyZWQgdmFyaWFibGVzDQoJCWlmICggIWVtcHR5KCRtZXRob2RWYXJzWyd2ZW51ZSddKSApIHsNCgkJCSR2YXJzID0gYXJyYXkoDQoJCQkJJ21ldGhvZCcgPT4gJ3ZlbnVlLnNlYXJjaCcsDQoJCQkJJ2FwaV9rZXknID0+ICR0aGlzLT5hdXRoLT5hcGlLZXkNCgkJCSk7DQoJCQkkdmFycyA9IGFycmF5X21lcmdlKCR2YXJzLCAkbWV0aG9kVmFycyk7DQoJCQkNCgkJCWlmICggJGNhbGwgPSAkdGhpcy0+YXBpR2V0Q2FsbCgkdmFycykgKSB7DQoJCQkJJG9wZW5zZWFyY2ggPSAkY2FsbC0+cmVzdWx0cy0+Y2hpbGRyZW4oJ2h0dHA6Ly9hOS5jb20vLS9zcGVjL29wZW5zZWFyY2gvMS4xLycpOw0KCQkJCWlmICggJG9wZW5zZWFyY2gtPnRvdGFsUmVzdWx0cyA+IDAgKSB7DQoJCQkJCSRzZWFyY2hSZXN1bHRzWyd0b3RhbFJlc3VsdHMnXSA9IChzdHJpbmcpICRvcGVuc2VhcmNoLT50b3RhbFJlc3VsdHM7DQoJCQkJCSRzZWFyY2hSZXN1bHRzWydzdGFydEluZGV4J10gPSAoc3RyaW5nKSAkb3BlbnNlYXJjaC0+c3RhcnRJbmRleDsNCgkJCQkJJHNlYXJjaFJlc3VsdHNbJ2l0ZW1zUGVyUGFnZSddID0gKHN0cmluZykgJG9wZW5zZWFyY2gtPml0ZW1zUGVyUGFnZTsNCgkJCQkJJGkgPSAwOw0KCQkJCQlmb3JlYWNoICggJGNhbGwtPnJlc3VsdHMtPnZlbnVlbWF0Y2hlcy0+dmVudWUgYXMgJHZlbnVlICkgew0KCQkJCQkJJHNlYXJjaFJlc3VsdHNbJ3Jlc3VsdHMnXVskaV1bJ2lkJ10gPSAoc3RyaW5nKSAkdmVudWUtPmlkOw0KCQkJCQkJJHNlYXJjaFJlc3VsdHNbJ3Jlc3VsdHMnXVskaV1bJ25hbWUnXSA9IChzdHJpbmcpICR2ZW51ZS0+bmFtZTsNCgkJCQkJCSRzZWFyY2hSZXN1bHRzWydyZXN1bHRzJ11bJGldWydsb2NhdGlvbiddWydjaXR5J10gPSAoc3RyaW5nKSAkdmVudWUtPmxvY2F0aW9uLT5jaXR5Ow0KCQkJCQkJJHNlYXJjaFJlc3VsdHNbJ3Jlc3VsdHMnXVskaV1bJ2xvY2F0aW9uJ11bJ2NvdW50cnknXSA9IChzdHJpbmcpICR2ZW51ZS0+bG9jYXRpb24tPmNvdW50cnk7DQoJCQkJCQkkc2VhcmNoUmVzdWx0c1sncmVzdWx0cyddWyRpXVsnbG9jYXRpb24nXVsnc3RyZWV0J10gPSAoc3RyaW5nKSAkdmVudWUtPmxvY2F0aW9uLT5zdHJlZXQ7DQoJCQkJCQkkc2VhcmNoUmVzdWx0c1sncmVzdWx0cyddWyRpXVsnbG9jYXRpb24nXVsncG9zdGFsY29kZSddID0gKHN0cmluZykgJHZlbnVlLT5sb2NhdGlvbi0+cG9zdGFsY29kZTsNCgkJCQkJCSRnZW9Qb2ludHMgPSAkdmVudWUtPmxvY2F0aW9uLT5jaGlsZHJlbignaHR0cDovL3d3dy53My5vcmcvMjAwMy8wMS9nZW8vd2dzODRfcG9zIycpOw0KCQkJCQkJJHNlYXJjaFJlc3VsdHNbJ3Jlc3VsdHMnXVskaV1bJ2xvY2F0aW9uJ11bJ2dlb3BvaW50J11bJ2xhdCddID0gKHN0cmluZykgJGdlb1BvaW50cy0+cG9pbnQtPmxhdDsNCgkJCQkJCSRzZWFyY2hSZXN1bHRzWydyZXN1bHRzJ11bJGldWydsb2NhdGlvbiddWydnZW9wb2ludCddWydsb25nJ10gPSAoc3RyaW5nKSAkZ2VvUG9pbnRzLT5wb2ludC0+bG9uZzsNCgkJCQkJCSRzZWFyY2hSZXN1bHRzWydyZXN1bHRzJ11bJGldWyd1cmwnXSA9IChzdHJpbmcpICR2ZW51ZS0+dXJsOw0KCQkJCQkJJGkrKzsNCgkJCQkJfQ0KCQkJCQkNCgkJCQkJcmV0dXJuICRzZWFyY2hSZXN1bHRzOw0KCQkJCX0NCgkJCQllbHNlIHsNCgkJCQkJLy8gTm8gdGFnc2FyZSBmb3VuZA0KCQkJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTAsICdObyByZXN1bHRzJyk7DQoJCQkJCXJldHVybiBGQUxTRTsNCgkJCQl9DQoJCQl9DQoJCQllbHNlIHsNCgkJCQlyZXR1cm4gRkFMU0U7DQoJCQl9DQoJCX0NCgkJZWxzZSB7DQoJCQkvLyBHaXZlIGEgOTEgZXJyb3IgaWYgaW5jb3JyZWN0IHZhcmlhYmxlcyBhcmUgdXNlZA0KCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkxLCAnWW91IG11c3QgaW5jbHVkZSBhcnRpc3QgdmFyaWFsYmUgaW4gdGhlIGNhbGwgZm9yIHRoaXMgbWV0aG9kJyk7DQoJCQlyZXR1cm4gRkFMU0U7DQoJCX0NCgl9DQp9DQoNCj8+]]></data>
	</file>
	<file>
	  <filename>/lib/lastfmapi/class/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/lastfmapi/class/apibase.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogRmlsZSB0aGF0IGNvbnRhaW5zIGFsbCBiYXNlIG1ldGhvZHMgdXNlZCBieSBhbGwgYXBpIGNhbGxzDQogKiBAcGFja2FnZSBiYXNlDQogKi8NCi8qKg0KICogU3RvcmVzIHRoZSBtZXRob2RzIHVzZWQgYnkgYWxsIGFwaSBjYWxscw0KICogQHBhY2thZ2UgYmFzZQ0KICovDQpjbGFzcyBsYXN0Zm1BcGkgew0KCS8qDQoJICogU3RvcmVzIGVycm9yIGRldGFpbHMNCgkgKiBAYWNjZXNzIHB1YmxpYw0KCSAqIEB2YXIgYXJyYXkgaGFzIHR3byBlbGVtZW50czogPGk+Y29kZTwvaT4gYW5kIDxpPmRlc2M8L2k+IHdoaWNoIHN0b3JlcyB0aGUgZXJyb3IgY29kZSBhbmQgZGVzY3JpcHRpb24gcmVzcGVjdGl2bHkNCgkgKi8NCglwdWJsaWMgJGVycm9yOw0KCS8qDQoJICogU3RvcmVzIHRoZSBjb25uZWN0aW9uIHN0YXR1cw0KCSAqIEBhY2Nlc3MgcHVibGljDQoJICogQHZhciBib29sZWFuDQoJICovDQoJcHVibGljICRjb25uZWN0ZWQ7DQoJDQoJLyoNCgkgKiBTdG9yZXMgdGhlIGhvc3QgbmFtZQ0KCSAqIEBhY2Nlc3MgcHJpdmF0ZQ0KCSAqIEB2YXIgc3RyaW5nDQoJICovDQoJcHJpdmF0ZSAkaG9zdDsNCgkvKg0KCSAqIFN0b3JlcyB0aGUgcG9ydCBudW1iZXINCgkgKiBAYWNjZXNzIHByaXZhdGUNCgkgKiBAdmFyIHN0cmluZw0KCSAqLw0KCXByaXZhdGUgJHBvcnQ7DQoJLyoNCgkgKiBTdG9yZXMgdGhlIHJhdyBhcGkgY2FsbCByZXNwb25zZQ0KCSAqIEBhY2Nlc3MgcHJpdmF0ZQ0KCSAqIEB2YXIgc3RyaW5nDQoJICovDQoJcHJpdmF0ZSAkcmVzcG9uc2U7DQoJLyoNCgkgKiBTdG9yZXMgdGhlIHNvY2tldCBjbGFzcw0KCSAqIEBhY2Nlc3MgcHJpdmF0ZQ0KCSAqIEB2YXIgY2xhc3MNCgkgKi8NCglwcml2YXRlICRzb2NrZXQ7DQoJLyoNCgkgKiBTdG9yZXMgdGhlIGNhY2hlIGNsYXNzDQoJICogQGFjY2VzcyBwcml2YXRlDQoJICogQHZhciBjbGFzcw0KCSAqLw0KCXByaXZhdGUgJGNhY2hlOw0KCQ0KCS8qDQoJICogU2V0dXAgdGhlIHNvY2tldCB0byBnZXQgdGhlIHJhdyBhcGkgY2FsbCByZXR1cm4NCgkgKiBAYWNjZXNzIHByaXZhdGUNCgkgKiBAcmV0dXJuIGJvb2xlYW4NCgkgKi8NCglwcml2YXRlIGZ1bmN0aW9uIHNldHVwKCkgew0KCQkkdGhpcy0+aG9zdCA9ICd3cy5hdWRpb3Njcm9iYmxlci5jb20nOw0KCQkkdGhpcy0+cG9ydCA9IDgwOw0KCQkkdGhpcy0+Y29ubmVjdGVkID0gMDsNCgkJDQoJCWlmICggJHRoaXMtPnNvY2tldCA9IG5ldyBsYXN0Zm1BcGlTb2NrZXQoJHRoaXMtPmhvc3QsICR0aGlzLT5wb3J0KSApIHsNCgkJCSR0aGlzLT5jb25uZWN0ZWQgPSAxOw0KCQkJcmV0dXJuIHRydWU7DQoJCX0NCgkJZWxzZSB7DQoJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTksICR0aGlzLT5zb2NrZXQtPmVycm9yX3N0cmluZyk7DQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCgl9DQoJDQoJLyoNCgkgKiBUdXJucyB0aGUgcmF3IHJlc3BvbnNlIGludG8gYW4geG1sIG9iamVjdA0KCSAqIEBhY2Nlc3MgcHJpdmF0ZQ0KCSAqIEByZXR1cm4gb2JqZWN0DQoJICovDQoJcHJpdmF0ZSBmdW5jdGlvbiBwcm9jZXNzX3Jlc3BvbnNlKCkgew0KCQkkeG1sc3RyID0gJyc7DQoJCSRyZWNvcmQgPSAwOw0KCQlmb3JlYWNoICggJHRoaXMtPnJlc3BvbnNlIGFzICRsaW5lICkgew0KCQkJaWYgKCAkcmVjb3JkID09IDEgKSB7DQoJCQkJJHhtbHN0ciAuPSAkbGluZTsNCgkJCX0NCgkJCWVsc2VpZiggc3Vic3RyKCRsaW5lLCAwLCAxKSA9PSAnPCcgKSB7DQoJCQkJJHJlY29yZCA9IDE7DQoJCQl9DQoJCX0NCgkJDQoJCXRyeSB7DQoJCQlsaWJ4bWxfdXNlX2ludGVybmFsX2Vycm9ycyh0cnVlKTsNCgkJCSR4bWwgPSBuZXcgU2ltcGxlWE1MRWxlbWVudCgkeG1sc3RyKTsNCgkJfSANCgkJY2F0Y2ggKEV4Y2VwdGlvbiAkZSkgew0KCQkJLy8gQ3JhcCEgV2UgZ290IGVycm9ycyEhIQ0KCQkJJGVycm9ycyA9IGxpYnhtbF9nZXRfZXJyb3JzKCk7DQoJCQkkZXJyb3IgPSAkZXJyb3JzWzBdOw0KCQkJJHRoaXMtPmhhbmRsZUVycm9yKDk1LCAnU2ltcGxlWE1MRWxlbWVudCBlcnJvcjogJy4kZS0+Z2V0TWVzc2FnZSgpLic6ICcuJGVycm9yLT5tZXNzYWdlKTsNCgkJfQ0KCQkNCgkJaWYgKCAhaXNzZXQoJGUpICkgew0KCQkJLy8gQWxsIGlzIHdlbGwgOikNCgkJCXJldHVybiAkeG1sOw0KCQkJLyogcmV0dXJuIGZpbHRlcl92YXJfYXJyYXkoDQoJCQkJKGFycmF5KSAkeG1sLA0KCQkJCWFycmF5KA0KCQkJCQknZmlsdGVyJyA9PiBGSUxURVJfU0FOSVRJWkVfU1RSSU5HLA0KCQkJCQknZmxhZ3MnID0+IEZJTFRFUl9GTEFHX1NUUklQX0hJR0gNCgkJCQkpDQoJCQkpOyAqLw0KCQl9DQoJfQ0KCQ0KCS8qDQoJICogVXNlZCBpbiBhcGkgY2FsbHMgdGhhdCBkbyBub3QgcmVxdWlyZSB3cml0ZSBhY2Nlc3MuIFJldHVybnMgYW4geG1sIG9iamVjdA0KCSAqIEBhY2Nlc3MgcHJvdGVjdGVkDQoJICogQHJldHVybiBvYmplY3QNCgkgKi8NCglwcm90ZWN0ZWQgZnVuY3Rpb24gYXBpR2V0Q2FsbCgkdmFycykgew0KCQkkdGhpcy0+c2V0dXAoKTsNCgkJaWYgKCAkdGhpcy0+Y29ubmVjdGVkID09IDEgKSB7DQoJCQkkdGhpcy0+Y2FjaGUgPSBuZXcgbGFzdGZtQXBpQ2FjaGUoJHRoaXMtPmNvbmZpZyk7DQoJCQlpZiAoICFlbXB0eSgkdGhpcy0+Y2FjaGUtPmVycm9yKSApIHsNCgkJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTYsICR0aGlzLT5jYWNoZS0+ZXJyb3IpOw0KCQkJCXJldHVybiBmYWxzZTsNCgkJCX0NCgkJCWVsc2Ugew0KCQkJCWlmICggJGNhY2hlID0gJHRoaXMtPmNhY2hlLT5nZXQoJHZhcnMpICkgew0KCQkJCQkvLyBDYWNoZSBleGlzdHMNCgkJCQkJJHRoaXMtPnJlc3BvbnNlID0gJGNhY2hlOw0KCQkJCX0NCgkJCQllbHNlIHsNCgkJCQkJLy8gQ2FjaGUgZG9lc250IGV4aXN0DQoJCQkJCSR1cmwgPSAnLzIuMC8/JzsNCgkJCQkJZm9yZWFjaCAoICR2YXJzIGFzICRuYW1lID0+ICR2YWx1ZSApIHsNCgkJCQkJCSR1cmwgLj0gdHJpbSh1cmxlbmNvZGUoJG5hbWUpKS4nPScudHJpbSh1cmxlbmNvZGUoJHZhbHVlKSkuJyYnOw0KCQkJCQl9DQoJCQkJCSR1cmwgPSBzdWJzdHIoJHVybCwgMCwgLTEpOw0KCQkJCQkkdXJsID0gc3RyX3JlcGxhY2UoJyAnLCAnJTIwJywgJHVybCk7DQoJCQkJCQ0KCQkJCQkkb3V0ID0gIkdFVCAiLiR1cmwuIiBIVFRQLzEuMFxyXG4iOw0KCQkJCQkkb3V0IC49ICJIb3N0OiAiLiR0aGlzLT5ob3N0LiJcclxuIjsNCgkJCQkJJG91dCAuPSAiXHJcbiI7DQoJCQkJCSR0aGlzLT5yZXNwb25zZSA9ICR0aGlzLT5zb2NrZXQtPnNlbmQoJG91dCwgJ2FycmF5Jyk7DQoJCQkJCSR0aGlzLT5jYWNoZS0+c2V0KCR2YXJzLCAkdGhpcy0+cmVzcG9uc2UpOw0KCQkJCX0NCgkJCQkNCgkJCQlyZXR1cm4gJHRoaXMtPnByb2Nlc3NfcmVzcG9uc2UoKTsNCgkJCX0NCgkJfQ0KCQllbHNlIHsNCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KCX0NCgkNCgkvKg0KCSAqIFVzZWQgaW4gYXBpIGNhbGxzIHRoYXQgcmVxdWlyZSB3cml0ZSBhY2Nlc3MuIFJldHVybnMgYW4geG1sIG9iamVjdA0KCSAqIEBhY2Nlc3MgcHJvdGVjdGVkDQoJICogQHJldHVybiBvYmplY3QNCgkgKi8NCglwcm90ZWN0ZWQgZnVuY3Rpb24gYXBpUG9zdENhbGwoJHZhcnMsICRyZXR1cm4gPSAnYm9vbCcpIHsNCgkJJHRoaXMtPnNldHVwKCk7DQoJCWlmICggJHRoaXMtPmNvbm5lY3RlZCA9PSAxICkgew0KCQkJJHVybCA9ICcvMi4wLyc7DQoJCQkNCgkJCSRkYXRhID0gJyc7DQoJCQlmb3JlYWNoICggJHZhcnMgYXMgJG5hbWUgPT4gJHZhbHVlICkgew0KCQkJCSRkYXRhIC49IHRyaW0oJG5hbWUpLic9Jy50cmltKCR2YWx1ZSkuJyYnOw0KCQkJfQ0KCQkJJGRhdGEgPSBzdWJzdHIoJGRhdGEsIDAsIC0xKTsNCgkJCSRkYXRhID0gc3RyX3JlcGxhY2UoJyAnLCAnJTIwJywgJGRhdGEpOw0KCQkJDQoJCQkkb3V0ID0gIlBPU1QgIi4kdXJsLiIgSFRUUC8xLjFcclxuIjsNCgkJCSRvdXQgLj0gIkhvc3Q6ICIuJHRoaXMtPmhvc3QuIlxyXG4iOw0KCQkJJG91dCAuPSAiQ29udGVudC1MZW5ndGg6ICIuc3RybGVuKCRkYXRhKS4iXHJcbiI7DQoJCQkkb3V0IC49ICJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFxyXG4iOw0KCQkJJG91dCAuPSAiXHJcbiI7DQoJCQkkb3V0IC49ICRkYXRhLiJcclxuIjsNCgkJCSR0aGlzLT5yZXNwb25zZSA9ICR0aGlzLT5zb2NrZXQtPnNlbmQoJG91dCwgJ2FycmF5Jyk7DQoJCQkNCgkJCXJldHVybiAkdGhpcy0+cHJvY2Vzc19yZXNwb25zZSgpOw0KCQl9DQoJCWVsc2Ugew0KCQkJcmV0dXJuIGZhbHNlOw0KCQl9DQoJfQ0KCQ0KCS8qDQoJICogUHJvY2Vzc2VzIGFuZCBlcnJvciBhbmQgd3JpdGVzIHRvIHRoZSBwdWJsaWMgdmFyaWFibGUgJGVycm9yDQoJICogQGFjY2VzcyBwcm90ZWN0ZWQNCgkgKiBAcmV0dXJuIHZvaWQNCgkgKi8NCglwcm90ZWN0ZWQgZnVuY3Rpb24gaGFuZGxlRXJyb3IoJGVycm9yID0gJycsICRjdXN0b21EZXNjID0gJycpIHsNCgkJaWYgKCAhZW1wdHkoJGVycm9yKSAmJiBpc19vYmplY3QoJGVycm9yKSApIHsNCgkJCS8vIEZhaWwgd2l0aCBlcnJvciBjb2RlDQoJCQkkdGhpcy0+ZXJyb3JbJ2NvZGUnXSA9ICRlcnJvclsnY29kZSddOw0KCQkJJHRoaXMtPmVycm9yWydkZXNjJ10gPSAkZXJyb3I7DQoJCX0NCgkJZWxzZWlmKCAhZW1wdHkoJGVycm9yKSAmJiBpc19udW1lcmljKCRlcnJvcikgKSB7DQoJCQkvLyBGYWlsIHdpdGggY3VzdG9tIGVycm9yIGNvZGUNCgkJCSR0aGlzLT5lcnJvclsnY29kZSddID0gJGVycm9yOw0KCQkJJHRoaXMtPmVycm9yWydkZXNjJ10gPSAkY3VzdG9tRGVzYzsNCgkJfQ0KCQllbHNlIHsNCgkJCS8vSGFyZCBmYWlsdXJlDQoJCQkkdGhpcy0+ZXJyb3JbJ2NvZGUnXSA9IDA7DQoJCQkkdGhpcy0+ZXJyb3JbJ2Rlc2MnXSA9ICdVbmtub3duIGVycm9yJzsNCgkJfQ0KCX0NCgkNCgkvKg0KCSAqIEdlbmVyYXRlcyB0aGUgYXBpIHNpZ25hdHVyZSBmb3IgdXNlIGluIGFwaSBjYWxscyB0aGF0IHJlcXVpcmUgd3JpdGUgYWNjZXNzDQoJICogQGFjY2VzcyBwcm90ZWN0ZWQNCgkgKiBAcmV0dXJuIHN0cmluZw0KCSAqLw0KCXByb3RlY3RlZCBmdW5jdGlvbiBhcGlTaWcoJHNlY3JldCwgJHZhcnMpIHsNCgkJa3NvcnQoJHZhcnMpOw0KCQkNCgkJJHNpZyA9ICcnOw0KCQlmb3JlYWNoICggJHZhcnMgYXMgJG5hbWUgPT4gJHZhbHVlICkgew0KCQkJJHNpZyAuPSAkbmFtZS4kdmFsdWU7DQoJCX0NCgkJJHNpZyAuPSAkc2VjcmV0Ow0KCQkkc2lnID0gbWQ1KCRzaWcpOw0KCQkNCgkJcmV0dXJuICRzaWc7DQoJfQ0KCQ0KCS8qDQoJICogVXNlZCB0byByZXR1cm4gdGhlIGNvcnJlY3QgcGFja2FnZSB0byBhbGxvdyBhY2Nlc3MgdG8gdGhlIGFwaSBjYWxscyBmb3IgdGhhdCBwYWNrYWdlDQoJICogQGFjY2VzcyBwdWJsaWMNCgkgKiBAcmV0dXJuIGNsYXNzDQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGdldFBhY2thZ2UoJGF1dGgsICRwYWNrYWdlLCAkY29uZmlnID0gJycpIHsNCgkJaWYgKCAkY29uZmlnID09ICcnICkgew0KCQkJJGNvbmZpZyA9IGFycmF5KA0KCQkJCSdlbmFibGVkJyA9PiBmYWxzZQ0KCQkJKTsNCgkJfQ0KCQkNCgkJaWYgKCBpc19vYmplY3QoJGF1dGgpICkgew0KCQkJaWYgKCAhZW1wdHkoJGF1dGgtPmFwaUtleSkgJiYgIWVtcHR5KCRhdXRoLT5zZWNyZXQpICYmICFlbXB0eSgkYXV0aC0+dXNlcm5hbWUpICYmICFlbXB0eSgkYXV0aC0+c2Vzc2lvbktleSkgJiYgKCRhdXRoLT5zdWJzY3JpYmVyID09IDAgfHwgJGF1dGgtPnN1YnNjcmliZXIgPT0gMSkgKSB7DQoJCQkJJGZ1bGxBdXRoID0gMTsNCgkJCX0NCgkJCWVsc2VpZiAoICFlbXB0eSgkYXV0aC0+YXBpS2V5KSApIHsNCgkJCQkkZnVsbEF1dGggPSAwOw0KCQkJfQ0KCQkJZWxzZSB7DQoJCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkxLCAnSW52YWxpZCBhdXRoIGNsYXNzIHdhcyBwYXNzZWQgdG8gbGFzdGZtQXBpLiBZb3UgbmVlZCB0byBoYXZlIGF0IGxlYXN0IGFuIGFwaUtleSBzZXQnKTsNCgkJCQlyZXR1cm4gRkFMU0U7DQoJCQl9DQoJCX0NCgkJZWxzZSB7DQoJCQkkdGhpcy0+aGFuZGxlRXJyb3IoOTEsICdZb3UgbmVlZCB0byBwYXNzIGEgbGFzdGZtQXBpQXV0aCBjbGFzcyBhcyB0aGUgZmlyc3QgdmFyaWFibGUgdG8gdGhpcyBjbGFzcycpOw0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoJCQ0KCQlpZiAoICRwYWNrYWdlID09ICdhbGJ1bScgfHwgJHBhY2thZ2UgPT0gJ2FydGlzdCcgfHwgJHBhY2thZ2UgPT0gJ2V2ZW50JyB8fCAkcGFja2FnZSA9PSAnZ2VvJyB8fCAkcGFja2FnZSA9PSAnZ3JvdXAnIHx8ICRwYWNrYWdlID09ICdsaWJyYXJ5JyB8fCAkcGFja2FnZSA9PSAncGxheWxpc3QnIHx8ICRwYWNrYWdlID09ICdyYWRpbycgfHwgJHBhY2thZ2UgPT0gJ3RhZycgfHwgJHBhY2thZ2UgPT0gJ3Rhc3Rlb21ldGVyJyB8fCAkcGFja2FnZSA9PSAndHJhY2snIHx8ICRwYWNrYWdlID09ICd1c2VyJyB8fCAkcGFja2FnZSA9PSAndmVudWUnICkgew0KCQkJJGNsYXNzTmFtZSA9ICdsYXN0Zm1BcGknLnVjZmlyc3QoJHBhY2thZ2UpOw0KCQkJcmV0dXJuIG5ldyAkY2xhc3NOYW1lKCRhdXRoLCAkZnVsbEF1dGgsICRjb25maWcpOw0KCQl9DQoJCWVsc2Ugew0KCQkJJHRoaXMtPmhhbmRsZUVycm9yKDkxLCAnVGhlIHBhY2thZ2UgbmFtZSB5b3UgcGFzdCB3YXMgaW52YWxpZCcpOw0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoJfQ0KfQ0KDQo/Pg==]]></data>
	</file>
	<file>
	  <filename>/lib/lastfmapi/class/cache.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogU3RvcmVzIHRoZSBjYWNoaW5nIG1ldGhvZHMNCiAqIEBwYWNrYWdlIGJhc2UNCiAqLw0KLyoqDQogKiBBbGxvd3MgYWNjZXNzIHRvIHRoZSBjYWNoaW5nIG1ldGhvZHMgdG8gY2FjaGUgZGF0YSB3aGVuIGFwaSBjYWxscyBhcmUgbWFkZQ0KICogQHBhY2thZ2UgYmFzZQ0KICovDQpjbGFzcyBsYXN0Zm1BcGlDYWNoZSB7DQoJLyoqDQoJICogU3RvcmVzIHRoZSBiYXRhYmFzZSBjbGFzcw0KCSAqIEB2YXIgY2xhc3MNCgkgKi8NCglwcml2YXRlICRkYjsNCgkvKioNCgkgKiBTdG9yZXMgdGhlIGJhdGFiYXNlIHR5cGUNCgkgKiBAdmFyIHN0cmluZw0KCSAqLw0KCXByaXZhdGUgJHR5cGU7DQoJLyoqDQoJICogU3RvcmVzIHRoZSBlcnJvciBkZXRhaWxzDQoJICogQHZhciBhcnJheQ0KCSAqLw0KCXB1YmxpYyAkZXJyb3I7DQoJLyoqDQoJICogU3RvcmVzIHRoZSBwYXRoIHRvIHRoZSBzcWxpdGUgZGF0YWJhc2UNCgkgKiBAdmFyIHN0cmluZw0KCSAqLw0KCXByaXZhdGUgJHBhdGg7DQoJLyoqDQoJICogU3RvcmVzIHRoZSBhbW91bnQgb2YgdGltZSB0byBjYWhjZSBmb3INCgkgKiBAdmFyIGludGVnZXINCgkgKi8NCglwcml2YXRlICRjYWNoZV9sZW5ndGg7DQoJLyoqDQoJICogU3RvcmVzIHRoZSBjb25maWcgYXJyYXkNCgkgKiBAdmFyIGFycmF5DQoJICovDQoJcHJpdmF0ZSAkY29uZmlnOw0KCS8qKg0KCSAqIFN0YXRlcyBpZiBjYWNoaW5nIGlzIGVuYWJsZWQgb3Igbm90DQoJICogQHZhciBib29sZWFuDQoJICovDQoJcHJpdmF0ZSAkZW5hYmxlZDsNCgkNCgkvKioNCgkgKiBSdW4gd2hlbiB0aGUgY2xhc3MgaXMgY3JlYXRlZA0KCSAqIEBwYXJhbSBhcnJheSAkY29uZmlnIFRoZSBjb25maWcgYXJyYXkNCgkgKiBAdXNlcyBsYXN0Zm1BcGlEYXRhYmFzZQ0KCSAqLw0KCWZ1bmN0aW9uIF9fY29uc3RydWN0KCRjb25maWcpIHsNCgkJJHRoaXMtPmNvbmZpZyA9ICRjb25maWc7DQoJCQ0KCQlpZiAoIGlzc2V0KCR0aGlzLT5jb25maWdbJ2NhY2hlX3R5cGUnXSkgKSB7DQoJCQkkdGhpcy0+dHlwZSA9ICR0aGlzLT5jb25maWdbJ2NhY2hlX3R5cGUnXTsNCgkJfQ0KCQllbHNlIHsNCgkJCSR0aGlzLT50eXBlID0gJ3NxbGl0ZSc7DQoJCX0NCgkJDQoJCSR0aGlzLT5jaGVja19pZl9lbmFibGVkKCk7DQoJCQ0KCQlpZiAoICR0aGlzLT5lbmFibGVkID09IHRydWUgKSB7DQoJCQlpZiAoICR0aGlzLT50eXBlID09ICdzcWxpdGUnICkgew0KCQkJCXJlcXVpcmVfb25jZSAnc3FsaXRlLnBocCc7CQkJCQ0KCQkJCSR0aGlzLT5kYiA9IG5ldyBsYXN0Zm1BcGlEYXRhYmFzZSgkdGhpcy0+Y29uZmlnWydwYXRoJ10uJ3BocGxhc3RmbWFwaScpOw0KCQkJfQ0KCQkJZWxzZSB7DQoJCQkJaWYgKCBpc3NldCgkdGhpcy0+Y29uZmlnWydkYXRhYmFzZSddWydob3N0J10pICYmIGlzc2V0KCR0aGlzLT5jb25maWdbJ2RhdGFiYXNlJ11bJ3VzZXJuYW1lJ10pICYmIGlzc2V0KCR0aGlzLT5jb25maWdbJ2RhdGFiYXNlJ11bJ3Bhc3N3b3JkJ10pICYmIGlzc2V0KCR0aGlzLT5jb25maWdbJ2RhdGFiYXNlJ11bJ25hbWUnXSkgKSB7DQoJCQkJCXJlcXVpcmVfb25jZSAnbXlzcWwucGhwJzsJCQkJDQoJCQkJCSR0aGlzLT5kYiA9IG5ldyBsYXN0Zm1BcGlEYXRhYmFzZSgkdGhpcy0+Y29uZmlnWydkYXRhYmFzZSddWydob3N0J10sICR0aGlzLT5jb25maWdbJ2RhdGFiYXNlJ11bJ3VzZXJuYW1lJ10sICR0aGlzLT5jb25maWdbJ2RhdGFiYXNlJ11bJ3Bhc3N3b3JkJ10sICR0aGlzLT5jb25maWdbJ2RhdGFiYXNlJ11bJ25hbWUnXSk7DQoJCQkJfQ0KCQkJCWVsc2Ugew0KCQkJCQkkdGhpcy0+ZXJyb3IgPSAnTm90IGFsbCBteXNxbCBkYXRhYmFzZSB2YXJpYWJsZXMgd2VyZSBzdXBwbGllZCc7DQoJCQkJCXJldHVybiBmYWxzZTsNCgkJCQl9DQoJCQl9DQoJCQlpZiAoICFlbXB0eSgkdGhpcy0+ZGItPmVycm9yKSApIHsNCgkJCQkkdGhpcy0+ZXJyb3IgPSAkdGhpcy0+ZGItPmVycm9yOw0KCQkJCXJldHVybiBmYWxzZTsNCgkJCX0NCgkJCWVsc2Ugew0KCQkJCSR0aGlzLT5jaGVja190YWJsZV9leGlzdHMoKTsNCgkJCX0NCgkJCS8vJHRoaXMtPnNob3dfYWxsKCk7DQoJCX0NCgl9DQoJDQoJLyoqDQoJICogSW50ZXJuYWwgbWV0aG9kIHRvIGNoYWNrIGlmIGNhY2hpbmcgaXMgZW5hYmxlZA0KCSAqIEBhY2Nlc3MgcHJpdmF0ZQ0KCSAqIEByZXR1cm4gdm9pZA0KCSAqLw0KCXByaXZhdGUgZnVuY3Rpb24gY2hlY2tfaWZfZW5hYmxlZCgpIHsNCgkJaWYgKCAkdGhpcy0+Y29uZmlnWydlbmFibGVkJ10gPT0gdHJ1ZSAmJiBmdW5jdGlvbl9leGlzdHMoJ3NxbGl0ZV9vcGVuJykgKSB7DQoJCQkkdGhpcy0+ZW5hYmxlZCA9IHRydWU7DQoJCX0NCgkJZWxzZSB7DQoJCQkkdGhpcy0+ZW5hYmxlZCA9IGZhbHNlOw0KCQl9DQoJfQ0KCQ0KCS8qKg0KCSAqIEludGVybmFsIG1ldGhvZCB0byBjaGVjayBpZiB0aGUgdGFibGUgZXhpc3RzDQoJICogQGFjY2VzcyBwcml2YXRlDQoJICogQHJldHVybiB2b2lkDQoJICovDQoJcHJpdmF0ZSBmdW5jdGlvbiBjaGVja190YWJsZV9leGlzdHMoKSB7DQoJCWlmICggJHRoaXMtPnR5cGUgPT0gJ3NxbGl0ZScgKSB7DQoJCQkkcXVlcnkgPSAiU0VMRUNUIGNvdW50KCopIEZST00gc3FsaXRlX21hc3RlciBXSEVSRSBuYW1lPSdjYWNoZSciOw0KCQkJJHJlc3VsdCA9ICR0aGlzLT5kYi0+cXVlcnkoJHF1ZXJ5KTsNCgkJCSRudW1iZXJzID0gJHJlc3VsdC0+ZmV0Y2hBbGwoKTsNCgkJCWlmICggJG51bWJlcnNbMF1bJ2NvdW50KCopJ10gPiAwICkgew0KCQkJCS8vIE9rDQoJCQl9DQoJCQllbHNlIHsNCgkJCQkkdGhpcy0+Y3JlYXRlX3RhYmxlKCk7DQoJCQl9DQoJCX0NCgkJZWxzZSB7DQoJCQkkcXVlcnkgPSAic2hvdyB0YWJsZXMgbGlrZSAnY2FjaGUnIjsNCgkJCSRyZXN1bHQgPSAkdGhpcy0+ZGItPnF1ZXJ5KCRxdWVyeSk7DQoJCQlpZiAoICRyZXN1bHQtPnNpemUoKSA+IDAgKSB7DQoJCQkJLy8gT2sNCgkJCX0NCgkJCWVsc2Ugew0KCQkJCSR0aGlzLT5jcmVhdGVfdGFibGUoKTsNCgkJCX0NCgkJfQ0KCX0NCgkNCgkvKioNCgkgKiBJbnRlcm5hbCBtZXRob2QgdG8gY3JlYXRlIHRoZSB0YWJsZSBpZiBpdCBkb2Vzbid0IGV4aXN0DQoJICogQGFjY2VzcyBwcml2YXRlDQoJICogQHJldHVybiB2b2lkDQoJICovDQoJcHJpdmF0ZSBmdW5jdGlvbiBjcmVhdGVfdGFibGUoKSB7DQoJCWlmICggJHRoaXMtPnR5cGUgPT0gJ3NxbGl0ZScgKSB7DQoJCQkkYXV0b19pbmNyZWFzZSA9ICcnOw0KCQl9DQoJCWVsc2Ugew0KCQkJJGF1dG9faW5jcmVhc2UgPSAnIEFVVE9fSU5DUkVNRU5UJzsNCgkJfQ0KCQkkcXVlcnkgPSAiQ1JFQVRFIFRBQkxFIGNhY2hlIChjYWNoZV9pZCBJTlRFR0VSIFBSSU1BUlkgS0VZIi4kYXV0b19pbmNyZWFzZS4iLCB1bmlxdWVfdmFycyBURVhULCBleHBpcmVzIElOVCwgYm9keSBURVhUKSI7DQoJCWlmICggJHRoaXMtPmRiLT5xdWVyeSgkcXVlcnkpICkgew0KCQkJLy8gT2sNCgkJfQ0KCQllbHNlIHsNCgkJCS8vIFRPRE86IEhhbmRsZSBlcnJvcg0KCQkJZWNobyAkdGhpcy0+ZGItPmVycm9yOw0KCQl9DQoJfQ0KCQ0KCS8qKg0KCSAqIFNlYXJjaGVzIHRoZSBkYXRhYmFzZSBmb3IgdGhlIGNhaGNlIGRhdGUuIFJldHVybnMgYW4gYXJyYXkgaWYgaXQgZXhpc3RzIG9yIGZhbHNlIGlmIGl0IGRvZXNuJ3QgDQoJICogQGFjY2VzcyBwdWJsaWMNCgkgKiBAcGFyYW0gYXJyYXkgJHVuaXF1ZV92YXJzIEFycmF5IG9mIHZhcmlhYmxlcyB0aGF0IGFyZSB1bmlxdWUgdG8gdGhpcyBwaWVjZSBvZiBjYWNoZWQgZGF0YQ0KCSAqIEByZXR1cm4gc3RyaW5nDQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGdldCgkdW5pcXVlX3ZhcnMpIHsNCgkJaWYgKCAkdGhpcy0+ZW5hYmxlZCA9PSB0cnVlICkgew0KCQkJJHF1ZXJ5ID0gIlNFTEVDVCBleHBpcmVzLCBib2R5IEZST00gY2FjaGUgV0hFUkUgdW5pcXVlX3ZhcnM9JyIuaHRtbGVudGl0aWVzKHNlcmlhbGl6ZSgkdW5pcXVlX3ZhcnMpKS4iJyBMSU1JVCAxIjsNCgkJCWlmICggJHJlc3VsdCA9ICR0aGlzLT5kYi0+cXVlcnkoJHF1ZXJ5KSApIHsNCgkJCQlpZiAoICRyZXN1bHQtPnNpemUoKSA+IDAgKSB7DQoJCQkJCSRyb3cgPSAkcmVzdWx0LT5mZXRjaCgpOw0KCQkJCQlpZiAoICRyb3dbJ2V4cGlyZXMnXSA8IHRpbWUoKSApIHsNCgkJCQkJCSR0aGlzLT5kZWwoJHVuaXF1ZV92YXJzKTsNCgkJCQkJCXJldHVybiBmYWxzZTsNCgkJCQkJfQ0KCQkJCQllbHNlIHsNCgkJCQkJCS8vcHJpbnRfcih1bnNlcmlhbGl6ZShodG1sX2VudGl0eV9kZWNvZGUoJHJvd1snYm9keSddKSkpOw0KCQkJCQkJcmV0dXJuIHVuc2VyaWFsaXplKGh0bWxfZW50aXR5X2RlY29kZSgkcm93Wydib2R5J10pKTsNCgkJCQkJfQ0KCQkJCX0NCgkJCQllbHNlIHsNCgkJCQkJcmV0dXJuIGZhbHNlOw0KCQkJCX0NCgkJCX0NCgkJCWVsc2Ugew0KCQkJCS8vIFRPRE86IEhhbmRsZSBlcnJvcg0KCQkJCXJldHVybiBmYWxzZTsNCgkJCX0NCgkJfQ0KCQllbHNlIHsNCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KCX0NCgkNCgkvKioNCgkgKiBBZGRzIG5ldyBjYWNoZSBkYXRhIHRvIHRoZSBkYXRhYmFzZQ0KCSAqIEBhY2Nlc3MgcHVibGljDQoJICogQHBhcmFtIGFycmF5ICR1bmlxdWVfdmFycyBBcnJheSBvZiB2YXJpYWJsZXMgdGhhdCBhcmUgdW5pcXVlIHRvIHRoaXMgcGllY2Ugb2YgY2FjaGVkIGRhdGENCgkgKiBAcGFyYW0gc3RyaW5nICRib2R5IFRoZSBjb250ZW50cyBvZiB0aGUgY2FjaGUgdG8gcHV0IGludG8gdGhlIGRhdGFiYXNlDQoJICogQHJldHVybiBib29sZWFuDQoJICovDQoJcHVibGljIGZ1bmN0aW9uIHNldCgkdW5pcXVlX3ZhcnMsICAkYm9keSkgew0KCQlpZiAoICR0aGlzLT5lbmFibGVkID09IHRydWUgKSB7DQoJCQkkZXhwaXJlID0gdGltZSgpICsgJHRoaXMtPmNvbmZpZ1snY2FjaGVfbGVuZ3RoJ107DQoJCQkkcXVlcnkgPSAiSU5TRVJUIElOVE8gY2FjaGUgKHVuaXF1ZV92YXJzLCBleHBpcmVzLCBib2R5KSBWQUxVRVMgKCciLmh0bWxlbnRpdGllcyhzZXJpYWxpemUoJHVuaXF1ZV92YXJzKSkuIicsICciLiRleHBpcmUuIicsIFwiIi5odG1sZW50aXRpZXMoc2VyaWFsaXplKCRib2R5KSkuIlwiKSI7DQoJCQlpZiAoICR0aGlzLT5kYi0+cXVlcnkoJHF1ZXJ5KSApIHsNCgkJCQlyZXR1cm4gdHJ1ZTsNCgkJCX0NCgkJCWVsc2Ugew0KCQkJCS8vIFRPRE86IEhhbmRsZSBlcnJvcg0KCQkJCXJldHVybiBmYWxzZTsNCgkJCX0NCgkJfQ0KCQllbHNlIHsNCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KCX0NCgkNCgkvKioNCgkgKiBJbnRlcm5hbCBtZXRob2QgdG8gZGVsZXRlIHVubmVlZGVkIGNhY2hlIGRhdGENCgkgKiBAYWNjZXNzIHByaXZhdGUNCgkgKiBAcGFyYW0gYXJyYXkgJHVuaXF1ZV92YXJzIEFycmF5IG9mIHZhcmlhYmxlcyB0aGF0IGFyZSB1bmlxdWUgdG8gdGhpcyBwaWVjZSBvZiBjYWNoZWQgZGF0YQ0KCSAqIEByZXR1cm4gYm9vbGVhbg0KCSAqLw0KCXByaXZhdGUgZnVuY3Rpb24gZGVsKCR1bmlxdWVfdmFycykgew0KCQkkcXVlcnkgPSAiREVMRVRFIEZST00gY2FjaGUgV0hFUkUgdW5pcXVlX3ZhcnM9JyIuaHRtbGVudGl0aWVzKHNlcmlhbGl6ZSgkdW5pcXVlX3ZhcnMpKS4iJyI7DQoJCWlmICggJHRoaXMtPmRiLT5xdWVyeSgkcXVlcnkpICkgew0KCQkJcmV0dXJuIHRydWU7DQoJCX0NCgkJZWxzZSB7DQoJCQkvLyBUT0RPOiBIYW5kbGUgZXJyb3INCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KCX0NCgkNCgkvKioNCgkgKiBJbnRlcm5hbCBtZXRob2QgdG8gc2hvdyBhbGwgY2FjaGVkIGRhdGEgKHVzZWQgZm9yIGRlYnVnZ2luZykNCgkgKiBAYWNjZXNzIHByaXZhdGUNCgkgKiBAcmV0dXJuIGJvb2xlYW4NCgkgKi8NCglwcml2YXRlIGZ1bmN0aW9uIHNob3dfYWxsKCkgew0KCQkkcXVlcnkgPSAiU0VMRUNUIGV4cGlyZXMsIGJvZHkgRlJPTSBjYWNoZSI7DQoJCWlmICggJHJlc3VsdCA9ICR0aGlzLT5kYi0+cXVlcnkoJHF1ZXJ5KSApIHsNCgkJCWlmICggJHJlc3VsdC0+c2l6ZSgpID4gMCApIHsNCgkJCQkkcmVzdWx0cyA9ICRyZXN1bHQtPmZldGNoQWxsKCk7DQoJCQkJZWNobyAnPHByZT4nOw0KCQkJCXByaW50X3IoJHJlc3VsdHMpOw0KCQkJCWVjaG8gJzwvcHJlPic7DQoJCQl9DQoJCQllbHNlIHsNCgkJCQlyZXR1cm4gZmFsc2U7DQoJCQl9DQoJCX0NCgkJZWxzZSB7DQoJCQkvLyBUT0RPOiBIYW5kbGUgZXJyb3INCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KCX0NCn0NCg0KPz4=]]></data>
	</file>
	<file>
	  <filename>/lib/lastfmapi/class/mysql.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogU3RvcmVzIHRoZSBteXNxbCBkYXRhYmFzZSBtZXRob2RzDQogKiBAcGFja2FnZSBiYXNlDQogKi8NCi8qKg0KICogQWxsb3dzIGFjY2VzcyB0byB0aGUgbXlzcWwgZGF0YWJhc2UgdXNpbmcgYSBzdGFuZGFyZCBkYXRhYmFzZSBjbGFzcw0KICogQHBhY2thZ2UgYmFzZQ0KICovDQpjbGFzcyBsYXN0Zm1BcGlEYXRhYmFzZSB7DQoJLyoqDQoJICogU3RvcmVzIHRoZSBob3N0IG5hbWUNCgkgKiBAdmFyIHN0cmluZw0KCSAqLw0KCXByaXZhdGUgJGhvc3Q7DQoJLyoqDQoJICogU3RvcmVzIHRoZSB1c2VybmFtZQ0KCSAqIEB2YXIgc3RyaW5nDQoJICovDQoJcHJpdmF0ZSAkZGJVc2VyOw0KCS8qKg0KCSAqIFN0b3JlcyB0aGUgcGFzc3dvcmQNCgkgKiBAdmFyIHN0cmluZw0KCSAqLw0KCXByaXZhdGUgJGRiUGFzczsNCgkvKioNCgkgKiBTdG9yZXMgdGhlIGRhdGFiYXNlIG5hbWUNCgkgKiBAdmFyIHN0cmluZw0KCSAqLw0KCXByaXZhdGUgJGRiTmFtZTsNCgkvKioNCgkgKiBTdG9yZXMgdGhlIGNvbm5lY3Rpb24gc3RhdHVzDQoJICogQHZhciBib29sZWFuDQoJICovDQoJcHVibGljICRkYkNvbm47DQoJLyoqDQoJICogU3RvcmVzIHRoZSBlcnJvciBkZXRhaWxzDQoJICogQHZhciBhcnJheQ0KCSAqLw0KCXB1YmxpYyAkZXJyb3I7DQoJDQoJLyoqDQoJICogUnVuIHdoZW4gdGhlIGNsYXNzIGlzIGNyZWF0ZWQuIFNldHMgdXAgdGhlIHZhcmlhYmxlcw0KCSAqIEBwYXJhbSBzdHJpbmcgJGhvc3QgRGF0YWJhc2UgaG9zdCBhZGRyZXNzDQoJICogQHBhcmFtIHN0cmluZyAkZGJVc2VyIERhdGFiYXNlIHVzZXJuYW1lDQoJICogQHBhcmFtIHN0cmluZyAkZGJQYXNzIERhdGFiYXNlIHBhc3N3b3JkDQoJICogQHBhcmFtIHN0cmluZyAkZGJOYW1lIERhdGFiYXNlIG5hbWUNCgkgKiBAcmV0dXJuIHZvaWQNCgkgKi8NCglmdW5jdGlvbiBfX2NvbnN0cnVjdCgkaG9zdCwkZGJVc2VyLCRkYlBhc3MsJGRiTmFtZSkgew0KCQkkdGhpcy0+aG9zdCA9ICRob3N0Ow0KCQkkdGhpcy0+ZGJVc2VyID0gJGRiVXNlcjsNCgkJJHRoaXMtPmRiUGFzcyA9ICRkYlBhc3M7DQoJCSR0aGlzLT5kYk5hbWUgPSAkZGJOYW1lOw0KCQkNCgkJJHRoaXMtPmNvbm5lY3RUb0RiKCk7DQoJfQ0KCQ0KCS8qKg0KCSAqIEludGVybmFsIGNvbW1hbmQgdG8gY29ubmVjdCB0byB0aGUgZGF0YWJhc2UNCgkgKiBAcmV0dXJuIHZvaWQNCgkgKi8NCglwcml2YXRlIGZ1bmN0aW9uIGNvbm5lY3RUb0RiICgpIHsNCgkJaWYgKCEkdGhpcy0+ZGJDb25uID0gQG15c3FsX2Nvbm5lY3QoJHRoaXMtPmhvc3QsICR0aGlzLT5kYlVzZXIsICR0aGlzLT5kYlBhc3MpKSB7DQoJCQkkdGhpcy0+aGFuZGxlRXJyb3IoKTsNCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KCQllbHNlIGlmICggIUBteXNxbF9zZWxlY3RfZGIoJHRoaXMtPmRiTmFtZSwgJHRoaXMtPmRiQ29ubikgKSB7DQoJCQkkdGhpcy0+aGFuZGxlRXJyb3IoKTsNCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KCX0NCgkNCgkvKioNCgkgKiBJbnRlcm5hbCBjb21tYW5kIHRvIGhhbmRsZSBlcnJvcnMgYW5kIHBvcHVsYXRlIHRoZSBlcnJvciB2YXJpYWJsZQ0KCSAqIEByZXR1cm4gdm9pZA0KCSAqLw0KCXByaXZhdGUgZnVuY3Rpb24gaGFuZGxlRXJyb3IgKCkgew0KCQkkdGhpcy0+ZXJyb3IgPSBteXNxbF9lcnJvcigkdGhpcy0+ZGJDb25uKTsNCgl9DQoJDQoJLyoqDQoJICogQ29tbWFuZCB3aGljaCBydW5zIHF1ZXJpZXMuIFJldHVybnMgYSBjbGFzcyBvbiBzdWNjZXNzIGFuZCBmbGFzZSBvbiBlcnJvcg0KCSAqIEBwYXJhbSBzdHJpbmcgJHNxbCBUaGUgU1FMIHF1ZXJ5IHRvIHJ1bg0KCSAqIEByZXR1cm4gY2xhc3MNCgkgKiBAdXNlcyBsYXN0Zm1BcGlEYXRhYmFzZV9yZXN1bHQNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gcXVlcnkoJHNxbCkgew0KCQlpZiAoICEkcXVlcnlSZXNvdXJjZSA9IG15c3FsX3F1ZXJ5KCRzcWwsICR0aGlzLT5kYkNvbm4pICkgew0KCQkJZWNobyBteXNxbF9lcnJvcigpOw0KCQkJJHRoaXMtPmhhbmRsZUVycm9yKCk7DQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCgkJZWxzZSB7DQoJCQkkcmV0dXJuID0gbmV3IGxhc3RmbUFwaURhdGFiYXNlX3Jlc3VsdCgkdGhpcywgJHF1ZXJ5UmVzb3VyY2UpOw0KCQkJcmV0dXJuICRyZXR1cm47DQoJCX0NCgl9DQp9DQoNCi8qKg0KICogQSBjbGFzcyB3aGljaCBhbGxvd3MgaW50ZXJhY3Rpb24gd2l0aCByZXN1bHRzIHdoZW4gYSBxdWVyeSBpcyBydW4gYnkgbGFzdGZtQXBpRGF0YWJhc2UNCiAqIEBwYWNrYWdlIGJhc2UNCiAqLw0KY2xhc3MgbGFzdGZtQXBpRGF0YWJhc2VfcmVzdWx0IHsNCgkvKioNCgkgKiBTdG9yZXMgdGhlIG15c3FsIGNsYXNzDQoJICogQHZhciBjbGFzcw0KCSAqLw0KCXZhciAkbXlzcWw7DQoJLyoqDQoJICogU3RvcmVzIHRoZSBxdWVyeQ0KCSAqIEB2YXIgY2xhc3MNCgkgKi8NCgl2YXIgJHF1ZXJ5Ow0KCQ0KCS8qKg0KCSAqIFJ1biB3aGVuIHRoZSBjbGFzcyBpcyBjcmVhdGVkLiBTZXRzIHVwIHRoZSB2YXJpYWJsZXMNCgkgKiBAcGFyYW0gY2xhc3MgJG15c3FsIFRoZSBteXNxbCBjbGFzcw0KCSAqIEBwYXJhbSBjbGFzcyAkcXVlcnkgVGhlIHF1ZXJ5DQoJICogQHJldHVybiB2b2lkDQoJICovDQoJZnVuY3Rpb24gbGFzdGZtQXBpRGF0YWJhc2VfcmVzdWx0KCYkbXlzcWwsJHF1ZXJ5KSB7DQoJCSR0aGlzLT5teXNxbCA9ICYkbXlzcWw7DQoJCSR0aGlzLT5xdWVyeSA9ICRxdWVyeTsNCgl9DQoJDQoJLyoqDQoJICogRmV0Y2hlcyB0aGUgbmV4dCByZXN1bHQNCgkgKiBAcmV0dXJuIGFycmF5DQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGZldGNoICgpIHsNCgkJaWYgKCAkcm93ID0gbXlzcWxfZmV0Y2hfYXJyYXkoJHRoaXMtPnF1ZXJ5KSApIHsNCgkJCXJldHVybiAkcm93Ow0KCQl9DQoJCWVsc2UgaWYgKCAkdGhpcy0+c2l6ZSgpID4gMCApIHsNCgkJCW15c3FsX2RhdGFfc2VlaygkdGhpcy0+cXVlcnksMCk7DQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCgkJZWxzZSB7DQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCgl9DQoJDQoJLyoqDQoJICogRmV0Y2hlcyBhbGwgdGhlIHJlc3VsdHMNCgkgKiBAcmV0dXJuIGFycmF5DQoJICovDQoJZnVuY3Rpb24gZmV0Y2hBbGwoKSB7DQoJCSRyZXN1bHQgPSBhcnJheSgpOw0KCQl3aGlsZSAoICRyb3cgPSBteXNxbF9mZXRjaF9hcnJheSgkdGhpcy0+cXVlcnkpICkgew0KCQkJJHJlc3VsdFtdID0kcm93Ow0KCQl9DQoJCXJldHVybiAkcmVzdWx0Ow0KCX0NCgkNCgkvKioNCgkgKiBTaG93cyB0aGUgbnVtYmVyIG9mIHJlc3VsdHMNCgkgKiBAcmV0dXJuIGludGVnZXINCgkgKi8NCglmdW5jdGlvbiBzaXplICgpIHsNCgkJcmV0dXJuIG15c3FsX251bV9yb3dzKCR0aGlzLT5xdWVyeSk7DQoJfQ0KfQ0KPz4=]]></data>
	</file>
	<file>
	  <filename>/lib/lastfmapi/class/socket.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogU3RvcmVzIHRoZSBzb2NrZXQgbWV0aG9kcw0KICogQHBhY2thZ2UgYmFzZQ0KICovDQovKioNCiAqIEFsbG93cyBhY2Nlc3MgdG8gdGhlIHNvY2tldCBtZXRob2RzIHVzaW5nIGEgc3RhbmRhcmQgY2xhc3MNCiAqIEBwYWNrYWdlIGJhc2UNCiAqLw0KY2xhc3MgbGFzdGZtQXBpU29ja2V0IHsNCgkvKioNCgkgKiBTdG9yZXMgdGhlIHNvY2tldCBoYW5kbGVyDQoJICogQHZhciBjbGFzcw0KCSAqLw0KCXByaXZhdGUgJGhhbmRsZTsNCgkvKioNCgkgKiBTdG9yZXMgdGhlIGhvc3QgbmFtZQ0KCSAqIEB2YXIgc3RyaW5nDQoJICovDQoJcHJpdmF0ZSAkaG9zdDsNCgkvKioNCgkgKiBTdG9yZXMgdGhlIHBvcnQgbnVtYmVyDQoJICogQHZhciBpbnRlZ2VyDQoJICovDQoJcHJpdmF0ZSAkcG9ydDsNCgkNCgkvKioNCgkgKiBTdG9yZXMgdGhlIGVycm9yIHN0cmluZw0KCSAqIEB2YXIgc3RyaW5nDQoJICovDQoJcHVibGljICRlcnJvcl9zdHJpbmc7DQoJLyoqDQoJICogU3RvcmVzIHRoZSBlcnJvciBudW1iZXINCgkgKiBAdmFyIGludGVnZXINCgkgKi8NCglwdWJsaWMgJGVycm9yX251bWJlcjsNCgkNCgkvKioNCgkgKiBSdW4gd2hlbiB0aGUgY2xhc3MgaXMgY3JlYXRlZC4gU2V0cyB0aGUgdmFyaWFibGVzDQoJICogQHBhcmFtIHN0cmluZyAkaG9zdCBUaGUgaG9zdCBuYW1lDQoJICogQHBhcmFtIGludGVnZXIgJHBvcnQgVGhlIHBvcnQgbnVtYmVyDQoJICogQHJldHVybiBib29sZWFuDQoJICovDQoJZnVuY3Rpb24gbGFzdGZtQXBpU29ja2V0ICgkaG9zdCwgJHBvcnQpIHsNCgkJLy8gU2V0IGNsYXNzIHZhcmlhYmxlcw0KCQkkdGhpcy0+aG9zdCA9ICRob3N0Ow0KCQkkdGhpcy0+cG9ydCA9ICRwb3J0Ow0KCQkNCgkJLy8gT3BlbiBhIGNvbm5lY3Rpb24gaW4gdGhlIGNsYXNzIHZhcmlhYmxlDQoJCSR0aGlzLT5oYW5kbGUgPSBmc29ja29wZW4oJHRoaXMtPmhvc3QsICR0aGlzLT5wb3J0LCAkdGhpcy0+ZXJyb3JfbnVtYmVyLCAkdGhpcy0+ZXJyb3Jfc3RyaW5nKTsNCgkJaWYgKCAkdGhpcy0+aGFuZGxlICkgew0KCQkJcmV0dXJuIFRSVUU7DQoJCX0NCgkJZWxzZSB7DQoJCQkvLyBJZiBmYWlsZWQgcmV0dXJuIGZhbHNlDQoJCQlyZXR1cm4gRkFMU0U7DQoJCX0NCgl9DQoJDQoJLyoqDQoJICogU2VuZCBkYXRhIHRocm91Z2ggdGhlIHNvY2tldCBhbmQgbGlzdGVuIGZvciBhIHJldHVybg0KCSAqIEBwYXJhbSBzdHJpbmcgJG1zZyBEYXRhIHRvIHNlbmQNCgkgKiBAcGFyYW0gc3RyaW5nICR0eXBlIFRoZSB0eXBlIG9mIGRhdGEgdG8gcmV0dXJuIChhcnJheSBvciBzdHJpbmcpDQoJICogQHJldHVybiBzdHJpbmd8YXJyYXkNCgkgKi8NCglmdW5jdGlvbiBzZW5kICgkbXNnLCAkdHlwZSA9ICcnKSB7DQoJCS8vIFNlbmQgbWVzc2FnZSBvdmVyIGNvbm5lY3Rpb24NCgkJZndyaXRlKCR0aGlzLT5oYW5kbGUsICRtc2cpOw0KCQkNCgkJLy8gQ2hlY2sgd2hhdCB0eXBlIGlzIHJlcXVpcmVkDQoJCWlmICggJHR5cGUgPT0gJ2FycmF5JyApIHsNCgkJCS8vIElmIGFycmF5IGxvb3AgYW5kIGNyZWF0ZSBhcnJheQ0KCQkJJHJlc3BvbnNlID0gYXJyYXkoKTsNCgkJCSRsaW5lX251bSA9IDA7DQoJCQl3aGlsZSAoICFmZW9mKCR0aGlzLT5oYW5kbGUpICkgew0KCSAgICAgICAJCQkkcmVzcG9uc2VbJGxpbmVfbnVtXSA9IGZnZXRzKCR0aGlzLT5oYW5kbGUsIDQwOTYpOw0KCQkJCSRsaW5lX251bSsrOw0KCSAgIAkJfQ0KCQkJLy8gUmV0dXJuIHJlc3BvbnNlIGFzIGFycmF5DQoJCQlyZXR1cm4gJHJlc3BvbnNlOw0KCQl9DQoJCWVsc2VpZiAoICR0eXBlID09ICdzdHJpbmcnICkgew0KCQkJLy8gSWYgc3RyaW5nLCBsb29wIGFuZCBjcmVhdGUgc3RyaW5nDQoJCQkkcmVzcG9uc2UgPSAnJzsNCgkgICAJCXdoaWxlICggIWZlb2YoJHRoaXMtPmhhbmRsZSkgKSB7DQoJICAgICAgIAkJCSRyZXNwb25zZSAuPSBmZ2V0cygkdGhpcy0+aGFuZGxlLCA0MDk2KTsNCgkgICAJCX0NCgkJCS8vIFJldHVybiByZXNwb25zZSBhcyBzdHJpbmcNCgkJCXJldHVybiAkcmVzcG9uc2U7DQoJCX0NCgkJZWxzZSB7DQoJCQkvLyBJZiBhbnl0aGluZyBlbHNlLCByZXR1cm4gbm90aGluZyBidXQgYSBUUlVFDQoJCQlyZXR1cm4gVFJVRTsNCgkJfQ0KCQkNCgl9DQoJDQoJLyoqDQoJICogQ2xvc2VzIHRoZSBjb25uZWN0aW9uDQoJICogQHJldHVybiBib29sZWFuDQoJICovDQoJZnVuY3Rpb24gY2xvc2UgKCkgew0KCQkvLyBDbG9zZSBjb25uZWN0aW9uDQoJCWZjbG9zZSgkdGhpcy0+aGFuZGxlKTsNCgkJcmV0dXJuIFRSVUU7DQoJfQ0KfQ0KDQo/Pg==]]></data>
	</file>
	<file>
	  <filename>/lib/lastfmapi/class/sqlite.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogU3RvcmVzIHRoZSBzcWxpdGUgZGF0YWJhc2UgbWV0aG9kcw0KICogQHBhY2thZ2UgYmFzZQ0KICovDQovKioNCiAqIEFsbG93cyBhY2Nlc3MgdG8gdGhlIHNxbGl0ZSBkYXRhYmFzZSB1c2luZyBhIHN0YW5kYXJkIGRhdGFiYXNlIGNsYXNzDQogKiBAcGFja2FnZSBiYXNlDQogKi8NCmNsYXNzIGxhc3RmbUFwaURhdGFiYXNlIHsNCgkvKioNCgkgKiBTdG9yZXMgdGhlIHBhdGggdG8gdGhlIGRhdGFiYXNlDQoJICogQHZhciBzdHJpbmcNCgkgKi8NCgl2YXIgJHBhdGg7DQoJLyoqDQoJICogU3RvcmVzIHRoZSBjb25uZWN0aW9uIHN0YXR1cw0KCSAqIEB2YXIgYm9vbGVhbg0KCSAqLw0KCXB1YmxpYyAkZGJDb25uOw0KCS8qKg0KCSAqIFN0b3JlcyB0aGUgZXJyb3IgZGV0YWlscw0KCSAqIEB2YXIgYXJyYXkNCgkgKi8NCglwdWJsaWMgJGVycm9yOw0KCQ0KCS8qKg0KCSAqIFJ1biB3aGVuIHRoZSBjbGFzcyBpcyBjcmVhdGVkLiBTZXRzIHVwIHRoZSB2YXJpYWJsZXMNCgkgKiBAcGFyYW0gc3RyaW5nICRwYXRoIFRoZSBwYXRoIHRvIHRoZSBkYXRhYmFzZQ0KCSAqIEByZXR1cm4gdm9pZA0KCSAqLw0KCWZ1bmN0aW9uIF9fY29uc3RydWN0KCRwYXRoKSB7DQoJCSR0aGlzLT5wYXRoID0gJHBhdGg7DQoJCSR0aGlzLT5jb25uZWN0VG9EYigpOw0KCX0NCgkNCgkvKioNCgkgKiBJbnRlcm5hbCBjb21tYW5kIHRvIGNvbm5lY3QgdG8gdGhlIGRhdGFiYXNlDQoJICogQHJldHVybiB2b2lkDQoJICovDQoJZnVuY3Rpb24gY29ubmVjdFRvRGIgKCkgew0KCQlpZiAoISR0aGlzLT5kYkNvbm4gPSBAc3FsaXRlX29wZW4oJHRoaXMtPnBhdGgsIDA2NjYsICR0aGlzLT5lcnJvcikpIHsNCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KCX0NCgkNCgkvKioNCgkgKiBNZXRob2Qgd2hpY2ggcnVucyBxdWVyaWVzLiBSZXR1cm5zIGEgY2xhc3Mgb24gc3VjY2VzcyBhbmQgZmFsc2Ugb24gZXJyb3INCgkgKiBAcGFyYW0gc3RyaW5nICRzcWwgVGhlIFNRTCBxdWVyeSB0byBydW4NCgkgKiBAcmV0dXJuIGNsYXNzDQoJICogQHVzZXMgbGFzdGZtQXBpRGF0YWJhc2VfcmVzdWx0DQoJICovDQoJZnVuY3Rpb24gJiBxdWVyeSgkc3FsKSB7DQoJCWlmICggISRxdWVyeVJlc291cmNlID0gc3FsaXRlX3F1ZXJ5KCR0aGlzLT5kYkNvbm4sICRzcWwsIFNRTElURV9CT1RILCAkdGhpcy0+ZXJyb3IpICkgew0KCQkJcmV0dXJuIGZhbHNlOw0KCQl9DQoJCWVsc2Ugew0KCQkJJHJldHVybiA9IG5ldyBsYXN0Zm1BcGlEYXRhYmFzZV9yZXN1bHQoJHRoaXMsICRxdWVyeVJlc291cmNlKTsNCgkJCXJldHVybiAkcmV0dXJuOw0KCQl9DQoJfQ0KfQ0KDQovKioNCiAqIEEgY2xhc3Mgd2hpY2ggYWxsb3dzIGludGVyYWN0aW9uIHdpdGggcmVzdWx0cyB3aGVuIGEgcXVlcnkgaXMgcnVuIGJ5IGxhc3RmbUFwaURhdGFiYXNlDQogKiBAcGFja2FnZSBiYXNlDQogKi8NCmNsYXNzIGxhc3RmbUFwaURhdGFiYXNlX3Jlc3VsdCB7DQoJLyoqDQoJICogU3RvcmVzIHRoZSBzcWxpdGUgY2xhc3MNCgkgKiBAdmFyIGNsYXNzDQoJICovDQoJdmFyICRzcWxpdGU7DQoJLyoqDQoJICogU3RvcmVzIHRoZSBxdWVyeQ0KCSAqIEB2YXIgY2xhc3MNCgkgKi8NCgl2YXIgJHF1ZXJ5Ow0KCQ0KCS8qKg0KCSAqIFJ1biB3aGVuIHRoZSBjbGFzcyBpcyBjcmVhdGVkLiBTZXRzIHVwIHRoZSB2YXJpYWJsZXMNCgkgKiBAcGFyYW0gY2xhc3MgJHNxbGl0ZSBUaGUgc3FsaXRlIGNsYXNzDQoJICogQHBhcmFtIGNsYXNzICRxdWVyeSBUaGUgcXVlcnkNCgkgKiBAcmV0dXJuIHZvaWQNCgkgKi8NCglmdW5jdGlvbiBsYXN0Zm1BcGlEYXRhYmFzZV9yZXN1bHQoJiRzcWxpdGUsICRxdWVyeSkgew0KCQkkdGhpcy0+c3FsaXRlID0gJiRzcWxpdGU7DQoJCSR0aGlzLT5xdWVyeSA9ICRxdWVyeTsNCgl9DQoJDQoJLyoqDQoJICogRmV0Y2hlcyB0aGUgbmV4dCByZXN1bHQNCgkgKiBAcmV0dXJuIGFycmF5DQoJICovDQoJZnVuY3Rpb24gZmV0Y2ggKCkgew0KCQlpZiAoICRyb3cgPSBzcWxpdGVfZmV0Y2hfYXJyYXkoJHRoaXMtPnF1ZXJ5KSApIHsNCgkJCXJldHVybiAkcm93Ow0KCQl9DQoJCWVsc2UgaWYgKCAkdGhpcy0+c2l6ZSgpID4gMCApIHsNCgkJCXNxbGl0ZV9zZWVrKCR0aGlzLT5xdWVyeSwgMCk7DQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCgkJZWxzZSB7DQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCgl9DQoJDQoJLyoqDQoJICogRmV0Y2hlcyBhbGwgdGhlIHJlc3VsdHMNCgkgKiBAcmV0dXJuIGFycmF5DQoJICovDQoJZnVuY3Rpb24gZmV0Y2hBbGwoKSB7DQoJCSRyZXN1bHQgPSBhcnJheSgpOw0KCQl3aGlsZSAoICRyb3cgPSBzcWxpdGVfZmV0Y2hfYXJyYXkoJHRoaXMtPnF1ZXJ5KSApIHsNCgkJCSRyZXN1bHRbXSA9ICRyb3c7DQoJCX0NCgkJcmV0dXJuICRyZXN1bHQ7DQoJfQ0KCQ0KCS8qKg0KCSAqIFNob3dzIHRoZSBudW1iZXIgb2YgcmVzdWx0cw0KCSAqIEByZXR1cm4gaW50ZWdlcg0KCSAqLw0KCWZ1bmN0aW9uIHNpemUgKCkgew0KCQlyZXR1cm4gc3FsaXRlX251bV9yb3dzKCR0aGlzLT5xdWVyeSk7DQoJfQ0KfQ0KPz4=]]></data>
	</file>
	<file>
	  <filename>/lib/lastfmapi/lastfmapi.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8vIEluY2x1ZGUgaGVscGVyIGNsYXNzZXMNCnJlcXVpcmUgJ2NsYXNzL2FwaWJhc2UucGhwJzsNCnJlcXVpcmUgJ2NsYXNzL3NvY2tldC5waHAnOw0KcmVxdWlyZSAnY2xhc3MvY2FjaGUucGhwJzsNCg0KLy8gSW5jbHVkZSBhbGwgZmlsZXMgb2YgdGhlIEFQSQ0KLy8gVE9ETzogQWxsb3cgc29tZSB0byBiZSBtaXNzaW5nDQpyZXF1aXJlICdhcGkvYWxidW0ucGhwJzsNCnJlcXVpcmUgJ2FwaS9hcnRpc3QucGhwJzsNCnJlcXVpcmUgJ2FwaS9hdXRoLnBocCc7DQpyZXF1aXJlICdhcGkvZXZlbnQucGhwJzsNCnJlcXVpcmUgJ2FwaS9nZW8ucGhwJzsNCnJlcXVpcmUgJ2FwaS9ncm91cC5waHAnOw0KcmVxdWlyZSAnYXBpL2xpYnJhcnkucGhwJzsNCnJlcXVpcmUgJ2FwaS9wbGF5bGlzdC5waHAnOw0KcmVxdWlyZSAnYXBpL3JhZGlvLnBocCc7DQpyZXF1aXJlICdhcGkvdGFnLnBocCc7DQpyZXF1aXJlICdhcGkvdGFzdGVvbWV0ZXIucGhwJzsNCnJlcXVpcmUgJ2FwaS90cmFjay5waHAnOw0KcmVxdWlyZSAnYXBpL3VzZXIucGhwJzsNCnJlcXVpcmUgJ2FwaS92ZW51ZS5waHAnOw0KDQo/Pg==]]></data>
	</file>
	<file>
	  <filename>/lib/loader.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAgLy9uZXR0ZWxvYWRlcj1JQ29tcG9uZW50CgovKioKICogTmV0dGUgRnJhbWV3b3JrCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAxMCBEYXZpZCBHcnVkbCAoaHR0cDovL2RhdmlkZ3J1ZGwuY29tKQogKgogKiBUaGlzIHNvdXJjZSBmaWxlIGlzIHN1YmplY3QgdG8gdGhlICJOZXR0ZSBsaWNlbnNlIiB0aGF0IGlzIGJ1bmRsZWQKICogd2l0aCB0aGlzIHBhY2thZ2UgaW4gdGhlIGZpbGUgbGljZW5zZS50eHQsIGFuZC9vciBHUEwgbGljZW5zZS4KICoKICogRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHNlZSBodHRwOi8vbmV0dGUub3JnCiAqCiAqIEBjb3B5cmlnaHQgIENvcHlyaWdodCAoYykgMjAwNCwgMjAxMCBEYXZpZCBHcnVkbAogKiBAbGljZW5zZSAgICBodHRwOi8vbmV0dGUub3JnL2xpY2Vuc2UgIE5ldHRlIGxpY2Vuc2UKICogQGxpbmsgICAgICAgaHR0cDovL25ldHRlLm9yZwogKiBAY2F0ZWdvcnkgICBOZXR0ZQogKiBAcGFja2FnZSAgICBOZXR0ZQogKi8KCmlmKCFkZWZpbmVkKCdQSFBfVkVSU0lPTl9JRCcpKXskdG1wPWV4cGxvZGUoJy4nLFBIUF9WRVJTSU9OKTtkZWZpbmUoJ1BIUF9WRVJTSU9OX0lEJywoJHRtcFswXSoxMDAwMCskdG1wWzFdKjEwMCskdG1wWzJdKSk7fWlmKFBIUF9WRVJTSU9OX0lEPDUwMjAwKXt0aHJvdwpuZXcKRXhjZXB0aW9uKCdOZXR0ZSBGcmFtZXdvcmsgcmVxdWlyZXMgUEhQIDUuMi4wIG9yIG5ld2VyLicpO31Ac2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKEZBTFNFKTtkZWZpbmUoJ05FVFRFJyxUUlVFKTtkZWZpbmUoJ05FVFRFX1ZFUlNJT05fSUQnLDkwNSk7ZGVmaW5lKCdORVRURV9QQUNLQUdFJywnUEhQIDUuMiBwcmVmaXhlZCcpO2Z1bmN0aW9uCmNhbGxiYWNrKCRjYWxsYmFjaywkbT1OVUxMKXtyZXR1cm4oJG09PT1OVUxMJiYkY2FsbGJhY2sKaW5zdGFuY2VvZgpOQ2FsbGJhY2spPyRjYWxsYmFjazpuZXcKTkNhbGxiYWNrKCRjYWxsYmFjaywkbSk7fWZ1bmN0aW9uCmR1bXAoJHZhcil7Zm9yZWFjaChmdW5jX2dldF9hcmdzKClhcyRhcmcpTkRlYnVnOjpkdW1wKCRhcmcpO3JldHVybiR2YXI7fWludGVyZmFjZQpJQ29tcG9uZW50e2NvbnN0Ck5BTUVfU0VQQVJBVE9SPSctJztmdW5jdGlvbgpnZXROYW1lKCk7ZnVuY3Rpb24KZ2V0UGFyZW50KCk7ZnVuY3Rpb24Kc2V0UGFyZW50KElDb21wb25lbnRDb250YWluZXIkcGFyZW50PU5VTEwsJG5hbWU9TlVMTCk7fWludGVyZmFjZQpJQ29tcG9uZW50Q29udGFpbmVyCmV4dGVuZHMKSUNvbXBvbmVudHtmdW5jdGlvbgphZGRDb21wb25lbnQoSUNvbXBvbmVudCRjb21wb25lbnQsJG5hbWUpO2Z1bmN0aW9uCnJlbW92ZUNvbXBvbmVudChJQ29tcG9uZW50JGNvbXBvbmVudCk7ZnVuY3Rpb24KZ2V0Q29tcG9uZW50KCRuYW1lKTtmdW5jdGlvbgpnZXRDb21wb25lbnRzKCRkZWVwPUZBTFNFLCRmaWx0ZXJUeXBlPU5VTEwpO31pbnRlcmZhY2UKSU5hbWluZ0NvbnRhaW5lcgpleHRlbmRzCklDb21wb25lbnRDb250YWluZXJ7fWludGVyZmFjZQpJU2lnbmFsUmVjZWl2ZXJ7ZnVuY3Rpb24Kc2lnbmFsUmVjZWl2ZWQoJHNpZ25hbCk7fWludGVyZmFjZQpJU3RhdGVQZXJzaXN0ZW50e2Z1bmN0aW9uCmxvYWRTdGF0ZShhcnJheSRwYXJhbXMpO2Z1bmN0aW9uCnNhdmVTdGF0ZShhcnJheSYkcGFyYW1zKTt9aW50ZXJmYWNlCklSZW5kZXJhYmxle2Z1bmN0aW9uCmludmFsaWRhdGVDb250cm9sKCk7ZnVuY3Rpb24KaXNDb250cm9sSW52YWxpZCgpO31pbnRlcmZhY2UKSVBhcnRpYWxseVJlbmRlcmFibGUKZXh0ZW5kcwpJUmVuZGVyYWJsZXt9aW50ZXJmYWNlCklQcmVzZW50ZXJ7ZnVuY3Rpb24KcnVuKE5QcmVzZW50ZXJSZXF1ZXN0JHJlcXVlc3QpO31pbnRlcmZhY2UKSVByZXNlbnRlckxvYWRlcntmdW5jdGlvbgpnZXRQcmVzZW50ZXJDbGFzcygmJG5hbWUpO31pbnRlcmZhY2UKSVByZXNlbnRlclJlc3BvbnNle2Z1bmN0aW9uCnNlbmQoKTt9aW50ZXJmYWNlCklSb3V0ZXJ7Y29uc3QKT05FX1dBWT0xO2NvbnN0ClNFQ1VSRUQ9MjtmdW5jdGlvbgptYXRjaChJSHR0cFJlcXVlc3QkaHR0cFJlcXVlc3QpO2Z1bmN0aW9uCmNvbnN0cnVjdFVybChOUHJlc2VudGVyUmVxdWVzdCRhcHBSZXF1ZXN0LElIdHRwUmVxdWVzdCRodHRwUmVxdWVzdCk7fWludGVyZmFjZQpJQ29sbGVjdGlvbgpleHRlbmRzCkNvdW50YWJsZSxJdGVyYXRvckFnZ3JlZ2F0ZXtmdW5jdGlvbgphcHBlbmQoJGl0ZW0pO2Z1bmN0aW9uCnJlbW92ZSgkaXRlbSk7ZnVuY3Rpb24KY2xlYXIoKTtmdW5jdGlvbgpjb250YWlucygkaXRlbSk7fWludGVyZmFjZQpJTGlzdApleHRlbmRzCklDb2xsZWN0aW9uLEFycmF5QWNjZXNze2Z1bmN0aW9uCmluZGV4T2YoJGl0ZW0pO2Z1bmN0aW9uCmluc2VydEF0KCRpbmRleCwkaXRlbSk7fWludGVyZmFjZQpJQ2FjaGVTdG9yYWdle2Z1bmN0aW9uCnJlYWQoJGtleSk7ZnVuY3Rpb24Kd3JpdGUoJGtleSwkZGF0YSxhcnJheSRkZXBlbmRlbmNpZXMpO2Z1bmN0aW9uCnJlbW92ZSgka2V5KTtmdW5jdGlvbgpjbGVhbihhcnJheSRjb25kcyk7fWludGVyZmFjZQpJTWFwCmV4dGVuZHMKSUNvbGxlY3Rpb24sQXJyYXlBY2Nlc3N7ZnVuY3Rpb24KYWRkKCRrZXksJHZhbHVlKTtmdW5jdGlvbgpzZWFyY2goJGl0ZW0pO2Z1bmN0aW9uCmdldEtleXMoKTt9aW50ZXJmYWNlCklTZXQKZXh0ZW5kcwpJQ29sbGVjdGlvbnt9aW50ZXJmYWNlCklDb25maWdBZGFwdGVye3N0YXRpYwpmdW5jdGlvbgpsb2FkKCRmaWxlLCRzZWN0aW9uPU5VTEwpO3N0YXRpYwpmdW5jdGlvbgpzYXZlKCRjb25maWcsJGZpbGUsJHNlY3Rpb249TlVMTCk7fWludGVyZmFjZQpJRGVidWdnYWJsZXtmdW5jdGlvbgpnZXRQYW5lbHMoKTt9aW50ZXJmYWNlCklTZXJ2aWNlTG9jYXRvcntmdW5jdGlvbgphZGRTZXJ2aWNlKCRuYW1lLCRzZXJ2aWNlLCRzaW5nbGV0b249VFJVRSxhcnJheSRvcHRpb25zPU5VTEwpO2Z1bmN0aW9uCmdldFNlcnZpY2UoJG5hbWUsYXJyYXkkb3B0aW9ucz1OVUxMKTtmdW5jdGlvbgpyZW1vdmVTZXJ2aWNlKCRuYW1lKTtmdW5jdGlvbgpoYXNTZXJ2aWNlKCRuYW1lKTt9aW50ZXJmYWNlCklGb3JtQ29udHJvbHtmdW5jdGlvbgpsb2FkSHR0cERhdGEoKTtmdW5jdGlvbgpzZXRWYWx1ZSgkdmFsdWUpO2Z1bmN0aW9uCmdldFZhbHVlKCk7ZnVuY3Rpb24KZ2V0UnVsZXMoKTtmdW5jdGlvbgpnZXRFcnJvcnMoKTtmdW5jdGlvbgppc0Rpc2FibGVkKCk7ZnVuY3Rpb24KdHJhbnNsYXRlKCRzLCRjb3VudD1OVUxMKTt9aW50ZXJmYWNlCklTdWJtaXR0ZXJDb250cm9sCmV4dGVuZHMKSUZvcm1Db250cm9se2Z1bmN0aW9uCmlzU3VibWl0dGVkQnkoKTtmdW5jdGlvbgpnZXRWYWxpZGF0aW9uU2NvcGUoKTt9aW50ZXJmYWNlCklGb3JtUmVuZGVyZXJ7ZnVuY3Rpb24KcmVuZGVyKE5Gb3JtJGZvcm0pO31pbnRlcmZhY2UKSU1haWxlcntmdW5jdGlvbgpzZW5kKE5NYWlsJG1haWwpO31pbnRlcmZhY2UKSUFubm90YXRpb257ZnVuY3Rpb24KX19jb25zdHJ1Y3QoYXJyYXkkdmFsdWVzKTt9aW50ZXJmYWNlCklBdXRoZW50aWNhdG9ye2NvbnN0ClVTRVJOQU1FPSd1c2VybmFtZSc7Y29uc3QKUEFTU1dPUkQ9J3Bhc3N3b3JkJztjb25zdApJREVOVElUWV9OT1RfRk9VTkQ9MTtjb25zdApJTlZBTElEX0NSRURFTlRJQUw9Mjtjb25zdApGQUlMVVJFPTM7Y29uc3QKTk9UX0FQUFJPVkVEPTQ7ZnVuY3Rpb24KYXV0aGVudGljYXRlKGFycmF5JGNyZWRlbnRpYWxzKTt9aW50ZXJmYWNlCklBdXRob3JpemF0b3J7Y29uc3QKQUxMPU5VTEw7Y29uc3QKQUxMT1c9VFJVRTtjb25zdApERU5ZPUZBTFNFO2Z1bmN0aW9uCmlzQWxsb3dlZCgkcm9sZT1zZWxmOjpBTEwsJHJlc291cmNlPXNlbGY6OkFMTCwkcHJpdmlsZWdlPXNlbGY6OkFMTCk7fWludGVyZmFjZQpJSWRlbnRpdHl7ZnVuY3Rpb24KZ2V0Um9sZXMoKTt9aW50ZXJmYWNlCklQZXJtaXNzaW9uQXNzZXJ0aW9ue2Z1bmN0aW9uCmFzc2VydChOUGVybWlzc2lvbiRhY2wsJHJvbGVJZCwkcmVzb3VyY2VJZCwkcHJpdmlsZWdlKTt9aW50ZXJmYWNlCklSZXNvdXJjZXtmdW5jdGlvbgpnZXRSZXNvdXJjZUlkKCk7fWludGVyZmFjZQpJUm9sZXtmdW5jdGlvbgpnZXRSb2xlSWQoKTt9aW50ZXJmYWNlCklUZW1wbGF0ZXtmdW5jdGlvbgpyZW5kZXIoKTt9aW50ZXJmYWNlCklGaWxlVGVtcGxhdGUKZXh0ZW5kcwpJVGVtcGxhdGV7ZnVuY3Rpb24Kc2V0RmlsZSgkZmlsZSk7ZnVuY3Rpb24KZ2V0RmlsZSgpO31pbnRlcmZhY2UKSVRyYW5zbGF0b3J7ZnVuY3Rpb24KdHJhbnNsYXRlKCRtZXNzYWdlLCRjb3VudD1OVUxMKTt9aW50ZXJmYWNlCklIdHRwUmVxdWVzdHtjb25zdApHRVQ9J0dFVCcsUE9TVD0nUE9TVCcsSEVBRD0nSEVBRCcsUFVUPSdQVVQnLERFTEVURT0nREVMRVRFJztmdW5jdGlvbgpnZXRVcmkoKTtmdW5jdGlvbgpnZXRRdWVyeSgka2V5PU5VTEwsJGRlZmF1bHQ9TlVMTCk7ZnVuY3Rpb24KZ2V0UG9zdCgka2V5PU5VTEwsJGRlZmF1bHQ9TlVMTCk7ZnVuY3Rpb24KZ2V0UG9zdFJhdygpO2Z1bmN0aW9uCmdldEZpbGUoJGtleSk7ZnVuY3Rpb24KZ2V0RmlsZXMoKTtmdW5jdGlvbgpnZXRDb29raWUoJGtleSwkZGVmYXVsdD1OVUxMKTtmdW5jdGlvbgpnZXRDb29raWVzKCk7ZnVuY3Rpb24KZ2V0TWV0aG9kKCk7ZnVuY3Rpb24KaXNNZXRob2QoJG1ldGhvZCk7ZnVuY3Rpb24KZ2V0SGVhZGVyKCRoZWFkZXIsJGRlZmF1bHQ9TlVMTCk7ZnVuY3Rpb24KZ2V0SGVhZGVycygpO2Z1bmN0aW9uCmlzU2VjdXJlZCgpO2Z1bmN0aW9uCmlzQWpheCgpO2Z1bmN0aW9uCmdldFJlbW90ZUFkZHJlc3MoKTtmdW5jdGlvbgpnZXRSZW1vdGVIb3N0KCk7fWludGVyZmFjZQpJSHR0cFJlc3BvbnNle2NvbnN0ClBFUk1BTkVOVD0yMTE2MzMzMzMzO2NvbnN0CkJST1dTRVI9MDtjb25zdApTMjAwX09LPTIwMCxTMjA0X05PX0NPTlRFTlQ9MjA0LFMzMDBfTVVMVElQTEVfQ0hPSUNFUz0zMDAsUzMwMV9NT1ZFRF9QRVJNQU5FTlRMWT0zMDEsUzMwMl9GT1VORD0zMDIsUzMwM19TRUVfT1RIRVI9MzAzLFMzMDNfUE9TVF9HRVQ9MzAzLFMzMDRfTk9UX01PRElGSUVEPTMwNCxTMzA3X1RFTVBPUkFSWV9SRURJUkVDVD0zMDcsUzQwMF9CQURfUkVRVUVTVD00MDAsUzQwMV9VTkFVVEhPUklaRUQ9NDAxLFM0MDNfRk9SQklEREVOPTQwMyxTNDA0X05PVF9GT1VORD00MDQsUzQwNV9NRVRIT0RfTk9UX0FMTE9XRUQ9NDA1LFM0MTBfR09ORT00MTAsUzUwMF9JTlRFUk5BTF9TRVJWRVJfRVJST1I9NTAwLFM1MDFfTk9UX0lNUExFTUVOVEVEPTUwMSxTNTAzX1NFUlZJQ0VfVU5BVkFJTEFCTEU9NTAzO2Z1bmN0aW9uCnNldENvZGUoJGNvZGUpO2Z1bmN0aW9uCmdldENvZGUoKTtmdW5jdGlvbgpzZXRIZWFkZXIoJG5hbWUsJHZhbHVlKTtmdW5jdGlvbgphZGRIZWFkZXIoJG5hbWUsJHZhbHVlKTtmdW5jdGlvbgpzZXRDb250ZW50VHlwZSgkdHlwZSwkY2hhcnNldD1OVUxMKTtmdW5jdGlvbgpyZWRpcmVjdCgkdXJsLCRjb2RlPXNlbGY6OlMzMDJfRk9VTkQpO2Z1bmN0aW9uCnNldEV4cGlyYXRpb24oJHNlY29uZHMpO2Z1bmN0aW9uCmlzU2VudCgpO2Z1bmN0aW9uCmdldEhlYWRlcnMoKTtmdW5jdGlvbgpzZXRDb29raWUoJG5hbWUsJHZhbHVlLCRleHBpcmUsJHBhdGg9TlVMTCwkZG9tYWluPU5VTEwsJHNlY3VyZT1OVUxMKTtmdW5jdGlvbgpkZWxldGVDb29raWUoJG5hbWUsJHBhdGg9TlVMTCwkZG9tYWluPU5VTEwsJHNlY3VyZT1OVUxMKTt9aW50ZXJmYWNlCklVc2Vye2Z1bmN0aW9uCmxvZ2luKCR1c2VybmFtZSwkcGFzc3dvcmQsJGV4dHJhPU5VTEwpO2Z1bmN0aW9uCmxvZ291dCgkY2xlYXJJZGVudGl0eT1GQUxTRSk7ZnVuY3Rpb24KaXNMb2dnZWRJbigpO2Z1bmN0aW9uCmdldElkZW50aXR5KCk7ZnVuY3Rpb24Kc2V0QXV0aGVudGljYXRpb25IYW5kbGVyKElBdXRoZW50aWNhdG9yJGhhbmRsZXIpO2Z1bmN0aW9uCmdldEF1dGhlbnRpY2F0aW9uSGFuZGxlcigpO2Z1bmN0aW9uCnNldE5hbWVzcGFjZSgkbmFtZXNwYWNlKTtmdW5jdGlvbgpnZXROYW1lc3BhY2UoKTtmdW5jdGlvbgpnZXRSb2xlcygpO2Z1bmN0aW9uCmlzSW5Sb2xlKCRyb2xlKTtmdW5jdGlvbgppc0FsbG93ZWQoKTtmdW5jdGlvbgpzZXRBdXRob3JpemF0aW9uSGFuZGxlcihJQXV0aG9yaXphdG9yJGhhbmRsZXIpO2Z1bmN0aW9uCmdldEF1dGhvcml6YXRpb25IYW5kbGVyKCk7fWNsYXNzCkFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbgpleHRlbmRzCkludmFsaWRBcmd1bWVudEV4Y2VwdGlvbnt9Y2xhc3MKSW52YWxpZFN0YXRlRXhjZXB0aW9uCmV4dGVuZHMKUnVudGltZUV4Y2VwdGlvbntmdW5jdGlvbgpfX2NvbnN0cnVjdCgkbWVzc2FnZT0nJywkY29kZT0wLEV4Y2VwdGlvbiRwcmV2aW91cz1OVUxMKXtpZihQSFBfVkVSU0lPTl9JRDw1MDMwMCl7JHRoaXMtPnByZXZpb3VzPSRwcmV2aW91cztwYXJlbnQ6Ol9fY29uc3RydWN0KCRtZXNzYWdlLCRjb2RlKTt9ZWxzZXtwYXJlbnQ6Ol9fY29uc3RydWN0KCRtZXNzYWdlLCRjb2RlLCRwcmV2aW91cyk7fX19Y2xhc3MKTm90SW1wbGVtZW50ZWRFeGNlcHRpb24KZXh0ZW5kcwpMb2dpY0V4Y2VwdGlvbnt9Y2xhc3MKTm90U3VwcG9ydGVkRXhjZXB0aW9uCmV4dGVuZHMKTG9naWNFeGNlcHRpb257fWNsYXNzCkRlcHJlY2F0ZWRFeGNlcHRpb24KZXh0ZW5kcwpOb3RTdXBwb3J0ZWRFeGNlcHRpb257fWNsYXNzCk1lbWJlckFjY2Vzc0V4Y2VwdGlvbgpleHRlbmRzCkxvZ2ljRXhjZXB0aW9ue31jbGFzcwpJT0V4Y2VwdGlvbgpleHRlbmRzClJ1bnRpbWVFeGNlcHRpb257fWNsYXNzCkZpbGVOb3RGb3VuZEV4Y2VwdGlvbgpleHRlbmRzCklPRXhjZXB0aW9ue31jbGFzcwpEaXJlY3RvcnlOb3RGb3VuZEV4Y2VwdGlvbgpleHRlbmRzCklPRXhjZXB0aW9ue31jbGFzcwpGYXRhbEVycm9yRXhjZXB0aW9uCmV4dGVuZHMKRXhjZXB0aW9ue3ByaXZhdGUkc2V2ZXJpdHk7ZnVuY3Rpb24KX19jb25zdHJ1Y3QoJG1lc3NhZ2UsJGNvZGUsJHNldmVyaXR5LCRmaWxlLCRsaW5lLCRjb250ZXh0KXtwYXJlbnQ6Ol9fY29uc3RydWN0KCRtZXNzYWdlLCRjb2RlKTskdGhpcy0+c2V2ZXJpdHk9JHNldmVyaXR5OyR0aGlzLT5maWxlPSRmaWxlOyR0aGlzLT5saW5lPSRsaW5lOyR0aGlzLT5jb250ZXh0PSRjb250ZXh0O31mdW5jdGlvbgpnZXRTZXZlcml0eSgpe3JldHVybiR0aGlzLT5zZXZlcml0eTt9fWZpbmFsCmNsYXNzCk5GcmFtZXdvcmt7Y29uc3QKTkFNRT0nTmV0dGUgRnJhbWV3b3JrJztjb25zdApWRVJTSU9OPScwLjkuNSc7Y29uc3QKUkVWSVNJT049JzVlYjAzZjUgcmVsZWFzZWQgb24gMjAxMC0wNy0wMSc7ZmluYWwKZnVuY3Rpb24KX19jb25zdHJ1Y3QoKXt0aHJvdwpuZXcKTG9naWNFeGNlcHRpb24oIkNhbm5vdCBpbnN0YW50aWF0ZSBzdGF0aWMgY2xhc3MgIi5nZXRfY2xhc3MoJHRoaXMpKTt9c3RhdGljCmZ1bmN0aW9uCmNvbXBhcmVWZXJzaW9uKCR2ZXJzaW9uKXtyZXR1cm4KdmVyc2lvbl9jb21wYXJlKCR2ZXJzaW9uLHNlbGY6OlZFUlNJT04pO31zdGF0aWMKZnVuY3Rpb24KcHJvbW8oJHhodG1sPVRSVUUpe2VjaG8nPGEgaHJlZj0iaHR0cDovL25ldHRlLm9yZy8iIHRpdGxlPSJOZXR0ZSBGcmFtZXdvcmsgLSBUaGUgTW9zdCBJbm5vdmF0aXZlIFBIUCBGcmFtZXdvcmsiPjxpbWcgJywnc3JjPSJodHRwOi8vZmlsZXMubmV0dGUub3JnL2ljb25zL25ldHRlLXBvd2VyZWQuZ2lmIiBhbHQ9IlBvd2VyZWQgYnkgTmV0dGUgRnJhbWV3b3JrIiB3aWR0aD0iODAiIGhlaWdodD0iMTUiJywoJHhodG1sPycgLz4nOic+JyksJzwvYT4nO319YWJzdHJhY3QKY2xhc3MKTk9iamVjdHtmdW5jdGlvbgpnZXRDbGFzcygpe3RyaWdnZXJfZXJyb3IoX19NRVRIT0RfXy4nKCkgaXMgZGVwcmVjYXRlZDsgdXNlIGdldFJlZmxlY3Rpb24oKS0+Z2V0TmFtZSgpIGluc3RlYWQuJyxFX1VTRVJfV0FSTklORyk7cmV0dXJuCmdldF9jbGFzcygkdGhpcyk7fWZ1bmN0aW9uCmdldFJlZmxlY3Rpb24oKXtyZXR1cm4KbmV3Ck5DbGFzc1JlZmxlY3Rpb24oJHRoaXMpO31mdW5jdGlvbgpfX2NhbGwoJG5hbWUsJGFyZ3Mpe3JldHVybgpOT2JqZWN0TWl4aW46OmNhbGwoJHRoaXMsJG5hbWUsJGFyZ3MpO31zdGF0aWMKZnVuY3Rpb24KX19jYWxsU3RhdGljKCRuYW1lLCRhcmdzKXskY2xhc3M9Z2V0X2NhbGxlZF9jbGFzcygpO3Rocm93Cm5ldwpNZW1iZXJBY2Nlc3NFeGNlcHRpb24oIkNhbGwgdG8gdW5kZWZpbmVkIHN0YXRpYyBtZXRob2QgJGNsYXNzOjokbmFtZSgpLiIpO31zdGF0aWMKZnVuY3Rpb24KZXh0ZW5zaW9uTWV0aG9kKCRuYW1lLCRjYWxsYmFjaz1OVUxMKXtpZihzdHJwb3MoJG5hbWUsJzo6Jyk9PT1GQUxTRSl7JGNsYXNzPWdldF9jYWxsZWRfY2xhc3MoKTt9ZWxzZXtsaXN0KCRjbGFzcywkbmFtZSk9ZXhwbG9kZSgnOjonLCRuYW1lKTt9JGNsYXNzPW5ldwpOQ2xhc3NSZWZsZWN0aW9uKCRjbGFzcyk7aWYoJGNhbGxiYWNrPT09TlVMTCl7cmV0dXJuJGNsYXNzLT5nZXRFeHRlbnNpb25NZXRob2QoJG5hbWUpO31lbHNleyRjbGFzcy0+c2V0RXh0ZW5zaW9uTWV0aG9kKCRuYW1lLCRjYWxsYmFjayk7fX1mdW5jdGlvbiZfX2dldCgkbmFtZSl7cmV0dXJuCk5PYmplY3RNaXhpbjo6Z2V0KCR0aGlzLCRuYW1lKTt9ZnVuY3Rpb24KX19zZXQoJG5hbWUsJHZhbHVlKXtyZXR1cm4KTk9iamVjdE1peGluOjpzZXQoJHRoaXMsJG5hbWUsJHZhbHVlKTt9ZnVuY3Rpb24KX19pc3NldCgkbmFtZSl7cmV0dXJuCk5PYmplY3RNaXhpbjo6aGFzKCR0aGlzLCRuYW1lKTt9ZnVuY3Rpb24KX191bnNldCgkbmFtZSl7dGhyb3cKbmV3Ck1lbWJlckFjY2Vzc0V4Y2VwdGlvbigiQ2Fubm90IHVuc2V0IHRoZSBwcm9wZXJ0eSB7JHRoaXMtPnJlZmxlY3Rpb24tPm5hbWV9OjpcJCRuYW1lLiIpO319ZmluYWwKY2xhc3MKTk9iamVjdE1peGlue3ByaXZhdGUKc3RhdGljJG1ldGhvZHM7ZmluYWwKZnVuY3Rpb24KX19jb25zdHJ1Y3QoKXt0aHJvdwpuZXcKTG9naWNFeGNlcHRpb24oIkNhbm5vdCBpbnN0YW50aWF0ZSBzdGF0aWMgY2xhc3MgIi5nZXRfY2xhc3MoJHRoaXMpKTt9c3RhdGljCmZ1bmN0aW9uCmNhbGwoJF90aGlzLCRuYW1lLCRhcmdzKXskY2xhc3M9bmV3Ck5DbGFzc1JlZmxlY3Rpb24oJF90aGlzKTtpZigkbmFtZT09PScnKXt0aHJvdwpuZXcKTWVtYmVyQWNjZXNzRXhjZXB0aW9uKCJDYWxsIHRvIGNsYXNzICckY2xhc3MtPm5hbWUnIG1ldGhvZCB3aXRob3V0IG5hbWUuIik7fWlmKCRjbGFzcy0+aGFzRXZlbnRQcm9wZXJ0eSgkbmFtZSkpe2lmKGlzX2FycmF5KCRsaXN0PSRfdGhpcy0+JG5hbWUpfHwkbGlzdAppbnN0YW5jZW9mClRyYXZlcnNhYmxlKXtmb3JlYWNoKCRsaXN0CmFzJGhhbmRsZXIpe2NhbGxiYWNrKCRoYW5kbGVyKS0+aW52b2tlQXJncygkYXJncyk7fX1yZXR1cm4KTlVMTDt9aWYoJGNiPSRjbGFzcy0+Z2V0RXh0ZW5zaW9uTWV0aG9kKCRuYW1lKSl7YXJyYXlfdW5zaGlmdCgkYXJncywkX3RoaXMpO3JldHVybiRjYi0+aW52b2tlQXJncygkYXJncyk7fXRocm93Cm5ldwpNZW1iZXJBY2Nlc3NFeGNlcHRpb24oIkNhbGwgdG8gdW5kZWZpbmVkIG1ldGhvZCAkY2xhc3MtPm5hbWU6OiRuYW1lKCkuIik7fXN0YXRpYwpmdW5jdGlvbiZnZXQoJF90aGlzLCRuYW1lKXskY2xhc3M9Z2V0X2NsYXNzKCRfdGhpcyk7aWYoJG5hbWU9PT0nJyl7dGhyb3cKbmV3Ck1lbWJlckFjY2Vzc0V4Y2VwdGlvbigiQ2Fubm90IHJlYWQgYSBjbGFzcyAnJGNsYXNzJyBwcm9wZXJ0eSB3aXRob3V0IG5hbWUuIik7fWlmKCFpc3NldChzZWxmOjokbWV0aG9kc1skY2xhc3NdKSl7c2VsZjo6JG1ldGhvZHNbJGNsYXNzXT1hcnJheV9mbGlwKGdldF9jbGFzc19tZXRob2RzKCRjbGFzcykpO30kbmFtZVswXT0kbmFtZVswXSYiXHhERiI7JG09J2dldCcuJG5hbWU7aWYoaXNzZXQoc2VsZjo6JG1ldGhvZHNbJGNsYXNzXVskbV0pKXskdmFsPSRfdGhpcy0+JG0oKTtyZXR1cm4kdmFsO30kbT0naXMnLiRuYW1lO2lmKGlzc2V0KHNlbGY6OiRtZXRob2RzWyRjbGFzc11bJG1dKSl7JHZhbD0kX3RoaXMtPiRtKCk7cmV0dXJuJHZhbDt9JG5hbWU9ZnVuY19nZXRfYXJnKDEpO3Rocm93Cm5ldwpNZW1iZXJBY2Nlc3NFeGNlcHRpb24oIkNhbm5vdCByZWFkIGFuIHVuZGVjbGFyZWQgcHJvcGVydHkgJGNsYXNzOjpcJCRuYW1lLiIpO31zdGF0aWMKZnVuY3Rpb24Kc2V0KCRfdGhpcywkbmFtZSwkdmFsdWUpeyRjbGFzcz1nZXRfY2xhc3MoJF90aGlzKTtpZigkbmFtZT09PScnKXt0aHJvdwpuZXcKTWVtYmVyQWNjZXNzRXhjZXB0aW9uKCJDYW5ub3QgYXNzaWduIHRvIGEgY2xhc3MgJyRjbGFzcycgcHJvcGVydHkgd2l0aG91dCBuYW1lLiIpO31pZighaXNzZXQoc2VsZjo6JG1ldGhvZHNbJGNsYXNzXSkpe3NlbGY6OiRtZXRob2RzWyRjbGFzc109YXJyYXlfZmxpcChnZXRfY2xhc3NfbWV0aG9kcygkY2xhc3MpKTt9JG5hbWVbMF09JG5hbWVbMF0mIlx4REYiO2lmKGlzc2V0KHNlbGY6OiRtZXRob2RzWyRjbGFzc11bJ2dldCcuJG5hbWVdKXx8aXNzZXQoc2VsZjo6JG1ldGhvZHNbJGNsYXNzXVsnaXMnLiRuYW1lXSkpeyRtPSdzZXQnLiRuYW1lO2lmKGlzc2V0KHNlbGY6OiRtZXRob2RzWyRjbGFzc11bJG1dKSl7JF90aGlzLT4kbSgkdmFsdWUpO3JldHVybjt9ZWxzZXskbmFtZT1mdW5jX2dldF9hcmcoMSk7dGhyb3cKbmV3Ck1lbWJlckFjY2Vzc0V4Y2VwdGlvbigiQ2Fubm90IGFzc2lnbiB0byBhIHJlYWQtb25seSBwcm9wZXJ0eSAkY2xhc3M6OlwkJG5hbWUuIik7fX0kbmFtZT1mdW5jX2dldF9hcmcoMSk7dGhyb3cKbmV3Ck1lbWJlckFjY2Vzc0V4Y2VwdGlvbigiQ2Fubm90IGFzc2lnbiB0byBhbiB1bmRlY2xhcmVkIHByb3BlcnR5ICRjbGFzczo6XCQkbmFtZS4iKTt9c3RhdGljCmZ1bmN0aW9uCmhhcygkX3RoaXMsJG5hbWUpe2lmKCRuYW1lPT09Jycpe3JldHVybgpGQUxTRTt9JGNsYXNzPWdldF9jbGFzcygkX3RoaXMpO2lmKCFpc3NldChzZWxmOjokbWV0aG9kc1skY2xhc3NdKSl7c2VsZjo6JG1ldGhvZHNbJGNsYXNzXT1hcnJheV9mbGlwKGdldF9jbGFzc19tZXRob2RzKCRjbGFzcykpO30kbmFtZVswXT0kbmFtZVswXSYiXHhERiI7cmV0dXJuCmlzc2V0KHNlbGY6OiRtZXRob2RzWyRjbGFzc11bJ2dldCcuJG5hbWVdKXx8aXNzZXQoc2VsZjo6JG1ldGhvZHNbJGNsYXNzXVsnaXMnLiRuYW1lXSk7fX1maW5hbApjbGFzcwpOQ2FsbGJhY2sKZXh0ZW5kcwpOT2JqZWN0e3ByaXZhdGUkY2I7ZnVuY3Rpb24KX19jb25zdHJ1Y3QoJHQsJG09TlVMTCl7aWYoJG09PT1OVUxMKXskdGhpcy0+Y2I9JHQ7fWVsc2V7JHRoaXMtPmNiPWFycmF5KCR0LCRtKTt9aWYoaXNfb2JqZWN0KCR0aGlzLT5jYikpeyR0aGlzLT5jYj1hcnJheSgkdGhpcy0+Y2IsJ19faW52b2tlJyk7fWVsc2VpZihQSFBfVkVSU0lPTl9JRDw1MDIwMil7aWYoaXNfc3RyaW5nKCR0aGlzLT5jYikmJnN0cnBvcygkdGhpcy0+Y2IsJzonKSl7JHRoaXMtPmNiPWV4cGxvZGUoJzo6JywkdGhpcy0+Y2IpO31pZihpc19hcnJheSgkdGhpcy0+Y2IpJiZpc19zdHJpbmcoJHRoaXMtPmNiWzBdKSYmJGE9c3RycnBvcygkdGhpcy0+Y2JbMF0sJ1xcJykpeyR0aGlzLT5jYlswXT1zdWJzdHIoJHRoaXMtPmNiWzBdLCRhKzEpO319ZWxzZXtpZihpc19zdHJpbmcoJHRoaXMtPmNiKSYmJGE9c3RycnBvcygkdGhpcy0+Y2IsJ1xcJykpeyR0aGlzLT5jYj1zdWJzdHIoJHRoaXMtPmNiLCRhKzEpO31lbHNlaWYoaXNfYXJyYXkoJHRoaXMtPmNiKSYmaXNfc3RyaW5nKCR0aGlzLT5jYlswXSkmJiRhPXN0cnJwb3MoJHRoaXMtPmNiWzBdLCdcXCcpKXskdGhpcy0+Y2JbMF09c3Vic3RyKCR0aGlzLT5jYlswXSwkYSsxKTt9fWlmKCFpc19jYWxsYWJsZSgkdGhpcy0+Y2IsVFJVRSkpe3Rocm93Cm5ldwpJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgY2FsbGJhY2suIik7fX1mdW5jdGlvbgpfX2ludm9rZSgpe2lmKCFpc19jYWxsYWJsZSgkdGhpcy0+Y2IpKXt0aHJvdwpuZXcKSW52YWxpZFN0YXRlRXhjZXB0aW9uKCJDYWxsYmFjayAnJHRoaXMnIGlzIG5vdCBjYWxsYWJsZS4iKTt9JGFyZ3M9ZnVuY19nZXRfYXJncygpO3JldHVybgpjYWxsX3VzZXJfZnVuY19hcnJheSgkdGhpcy0+Y2IsJGFyZ3MpO31mdW5jdGlvbgppbnZva2UoKXtpZighaXNfY2FsbGFibGUoJHRoaXMtPmNiKSl7dGhyb3cKbmV3CkludmFsaWRTdGF0ZUV4Y2VwdGlvbigiQ2FsbGJhY2sgJyR0aGlzJyBpcyBub3QgY2FsbGFibGUuIik7fSRhcmdzPWZ1bmNfZ2V0X2FyZ3MoKTtyZXR1cm4KY2FsbF91c2VyX2Z1bmNfYXJyYXkoJHRoaXMtPmNiLCRhcmdzKTt9ZnVuY3Rpb24KaW52b2tlQXJncyhhcnJheSRhcmdzKXtpZighaXNfY2FsbGFibGUoJHRoaXMtPmNiKSl7dGhyb3cKbmV3CkludmFsaWRTdGF0ZUV4Y2VwdGlvbigiQ2FsbGJhY2sgJyR0aGlzJyBpcyBub3QgY2FsbGFibGUuIik7fXJldHVybgpjYWxsX3VzZXJfZnVuY19hcnJheSgkdGhpcy0+Y2IsJGFyZ3MpO31mdW5jdGlvbgppc0NhbGxhYmxlKCl7cmV0dXJuCmlzX2NhbGxhYmxlKCR0aGlzLT5jYik7fWZ1bmN0aW9uCmdldE5hdGl2ZSgpe3JldHVybiR0aGlzLT5jYjt9ZnVuY3Rpb24KX190b1N0cmluZygpe2lzX2NhbGxhYmxlKCR0aGlzLT5jYixUUlVFLCR0ZXh0dWFsKTtyZXR1cm4kdGV4dHVhbDt9fWZpbmFsCmNsYXNzCk5MaW1pdGVkU2NvcGV7cHJpdmF0ZQpzdGF0aWMkdmFycztmaW5hbApmdW5jdGlvbgpfX2NvbnN0cnVjdCgpe3Rocm93Cm5ldwpMb2dpY0V4Y2VwdGlvbigiQ2Fubm90IGluc3RhbnRpYXRlIHN0YXRpYyBjbGFzcyAiLmdldF9jbGFzcygkdGhpcykpO31zdGF0aWMKZnVuY3Rpb24KZXZhbHVhdGUoKXtpZihmdW5jX251bV9hcmdzKCk+MSl7c2VsZjo6JHZhcnM9ZnVuY19nZXRfYXJnKDEpO2V4dHJhY3Qoc2VsZjo6JHZhcnMpO31yZXR1cm4KZXZhbCgnPz4nLmZ1bmNfZ2V0X2FyZygwKSk7fXN0YXRpYwpmdW5jdGlvbgpsb2FkKCl7aWYoZnVuY19udW1fYXJncygpPjEpe3NlbGY6OiR2YXJzPWZ1bmNfZ2V0X2FyZygxKTtleHRyYWN0KHNlbGY6OiR2YXJzKTt9cmV0dXJuIGluY2x1ZGUgZnVuY19nZXRfYXJnKDApO319YWJzdHJhY3QKY2xhc3MKTkF1dG9Mb2FkZXIKZXh0ZW5kcwpOT2JqZWN0e3N0YXRpYwpwcml2YXRlJGxvYWRlcnM9YXJyYXkoKTtwdWJsaWMKc3RhdGljJGNvdW50PTA7ZmluYWwKc3RhdGljCmZ1bmN0aW9uCmxvYWQoJHR5cGUpe2ZvcmVhY2goZnVuY19nZXRfYXJncygpYXMkdHlwZSl7aWYoIWNsYXNzX2V4aXN0cygkdHlwZSkpe3Rocm93Cm5ldwpJbnZhbGlkU3RhdGVFeGNlcHRpb24oIlVuYWJsZSB0byBsb2FkIGNsYXNzIG9yIGludGVyZmFjZSAnJHR5cGUnLiIpO319fWZpbmFsCnN0YXRpYwpmdW5jdGlvbgpnZXRMb2FkZXJzKCl7cmV0dXJuCmFycmF5X3ZhbHVlcyhzZWxmOjokbG9hZGVycyk7fWZ1bmN0aW9uCnJlZ2lzdGVyKCl7aWYoIWZ1bmN0aW9uX2V4aXN0cygnc3BsX2F1dG9sb2FkX3JlZ2lzdGVyJykpe3Rocm93Cm5ldwpSdW50aW1lRXhjZXB0aW9uKCdzcGxfYXV0b2xvYWQgZG9lcyBub3QgZXhpc3QgaW4gdGhpcyBQSFAgaW5zdGFsbGF0aW9uLicpO31zcGxfYXV0b2xvYWRfcmVnaXN0ZXIoYXJyYXkoJHRoaXMsJ3RyeUxvYWQnKSk7c2VsZjo6JGxvYWRlcnNbc3BsX29iamVjdF9oYXNoKCR0aGlzKV09JHRoaXM7fWZ1bmN0aW9uCnVucmVnaXN0ZXIoKXt1bnNldChzZWxmOjokbG9hZGVyc1tzcGxfb2JqZWN0X2hhc2goJHRoaXMpXSk7cmV0dXJuCnNwbF9hdXRvbG9hZF91bnJlZ2lzdGVyKGFycmF5KCR0aGlzLCd0cnlMb2FkJykpO31hYnN0cmFjdApmdW5jdGlvbgp0cnlMb2FkKCR0eXBlKTt9YWJzdHJhY3QKY2xhc3MKTkNvbXBvbmVudApleHRlbmRzCk5PYmplY3QKaW1wbGVtZW50cwpJQ29tcG9uZW50e3ByaXZhdGUkcGFyZW50O3ByaXZhdGUkbmFtZTtwcml2YXRlJG1vbml0b3JzPWFycmF5KCk7ZnVuY3Rpb24KX19jb25zdHJ1Y3QoSUNvbXBvbmVudENvbnRhaW5lciRwYXJlbnQ9TlVMTCwkbmFtZT1OVUxMKXtpZigkcGFyZW50IT09TlVMTCl7JHBhcmVudC0+YWRkQ29tcG9uZW50KCR0aGlzLCRuYW1lKTt9ZWxzZWlmKGlzX3N0cmluZygkbmFtZSkpeyR0aGlzLT5uYW1lPSRuYW1lO319ZnVuY3Rpb24KbG9va3VwKCR0eXBlLCRuZWVkPVRSVUUpe2lmKCRhPXN0cnJwb3MoJHR5cGUsJ1xcJykpJHR5cGU9c3Vic3RyKCR0eXBlLCRhKzEpO2lmKCFpc3NldCgkdGhpcy0+bW9uaXRvcnNbJHR5cGVdKSl7JG9iaj0kdGhpcy0+cGFyZW50OyRwYXRoPXNlbGY6Ok5BTUVfU0VQQVJBVE9SLiR0aGlzLT5uYW1lOyRkZXB0aD0xO3doaWxlKCRvYmohPT1OVUxMKXtpZigkb2JqCmluc3RhbmNlb2YkdHlwZSlicmVhazskcGF0aD1zZWxmOjpOQU1FX1NFUEFSQVRPUi4kb2JqLT5nZXROYW1lKCkuJHBhdGg7JGRlcHRoKys7JG9iaj0kb2JqLT5nZXRQYXJlbnQoKTtpZigkb2JqPT09JHRoaXMpJG9iaj1OVUxMO31pZigkb2JqKXskdGhpcy0+bW9uaXRvcnNbJHR5cGVdPWFycmF5KCRvYmosJGRlcHRoLHN1YnN0cigkcGF0aCwxKSxGQUxTRSk7fWVsc2V7JHRoaXMtPm1vbml0b3JzWyR0eXBlXT1hcnJheShOVUxMLE5VTEwsTlVMTCxGQUxTRSk7fX1pZigkbmVlZCYmJHRoaXMtPm1vbml0b3JzWyR0eXBlXVswXT09PU5VTEwpe3Rocm93Cm5ldwpJbnZhbGlkU3RhdGVFeGNlcHRpb24oIkNvbXBvbmVudCAnJHRoaXMtPm5hbWUnIGlzIG5vdCBhdHRhY2hlZCB0byAnJHR5cGUnLiIpO31yZXR1cm4kdGhpcy0+bW9uaXRvcnNbJHR5cGVdWzBdO31mdW5jdGlvbgpsb29rdXBQYXRoKCR0eXBlLCRuZWVkPVRSVUUpe2lmKCRhPXN0cnJwb3MoJHR5cGUsJ1xcJykpJHR5cGU9c3Vic3RyKCR0eXBlLCRhKzEpOyR0aGlzLT5sb29rdXAoJHR5cGUsJG5lZWQpO3JldHVybiR0aGlzLT5tb25pdG9yc1skdHlwZV1bMl07fWZ1bmN0aW9uCm1vbml0b3IoJHR5cGUpe2lmKCRhPXN0cnJwb3MoJHR5cGUsJ1xcJykpJHR5cGU9c3Vic3RyKCR0eXBlLCRhKzEpO2lmKGVtcHR5KCR0aGlzLT5tb25pdG9yc1skdHlwZV1bM10pKXtpZigkb2JqPSR0aGlzLT5sb29rdXAoJHR5cGUsRkFMU0UpKXskdGhpcy0+YXR0YWNoZWQoJG9iaik7fSR0aGlzLT5tb25pdG9yc1skdHlwZV1bM109VFJVRTt9fWZ1bmN0aW9uCnVubW9uaXRvcigkdHlwZSl7aWYoJGE9c3RycnBvcygkdHlwZSwnXFwnKSkkdHlwZT1zdWJzdHIoJHR5cGUsJGErMSk7dW5zZXQoJHRoaXMtPm1vbml0b3JzWyR0eXBlXSk7fXByb3RlY3RlZApmdW5jdGlvbgphdHRhY2hlZCgkb2JqKXt9cHJvdGVjdGVkCmZ1bmN0aW9uCmRldGFjaGVkKCRvYmope31maW5hbApmdW5jdGlvbgpnZXROYW1lKCl7cmV0dXJuJHRoaXMtPm5hbWU7fWZpbmFsCmZ1bmN0aW9uCmdldFBhcmVudCgpe3JldHVybiR0aGlzLT5wYXJlbnQ7fWZ1bmN0aW9uCnNldFBhcmVudChJQ29tcG9uZW50Q29udGFpbmVyJHBhcmVudD1OVUxMLCRuYW1lPU5VTEwpe2lmKCRwYXJlbnQ9PT1OVUxMJiYkdGhpcy0+cGFyZW50PT09TlVMTCYmJG5hbWUhPT1OVUxMKXskdGhpcy0+bmFtZT0kbmFtZTtyZXR1cm4kdGhpczt9ZWxzZWlmKCRwYXJlbnQ9PT0kdGhpcy0+cGFyZW50JiYkbmFtZT09PU5VTEwpe3JldHVybiR0aGlzO31pZigkdGhpcy0+cGFyZW50IT09TlVMTCYmJHBhcmVudCE9PU5VTEwpe3Rocm93Cm5ldwpJbnZhbGlkU3RhdGVFeGNlcHRpb24oIkNvbXBvbmVudCAnJHRoaXMtPm5hbWUnIGFscmVhZHkgaGFzIGEgcGFyZW50LiIpO31pZigkcGFyZW50PT09TlVMTCl7JHRoaXMtPnJlZnJlc2hNb25pdG9ycygwKTskdGhpcy0+cGFyZW50PU5VTEw7fWVsc2V7JHRoaXMtPnZhbGlkYXRlUGFyZW50KCRwYXJlbnQpOyR0aGlzLT5wYXJlbnQ9JHBhcmVudDtpZigkbmFtZSE9PU5VTEwpJHRoaXMtPm5hbWU9JG5hbWU7JHRtcD1hcnJheSgpOyR0aGlzLT5yZWZyZXNoTW9uaXRvcnMoMCwkdG1wKTt9cmV0dXJuJHRoaXM7fXByb3RlY3RlZApmdW5jdGlvbgp2YWxpZGF0ZVBhcmVudChJQ29tcG9uZW50Q29udGFpbmVyJHBhcmVudCl7fXByaXZhdGUKZnVuY3Rpb24KcmVmcmVzaE1vbml0b3JzKCRkZXB0aCwmJG1pc3Npbmc9TlVMTCwmJGxpc3RlbmVycz1hcnJheSgpKXtpZigkdGhpcwppbnN0YW5jZW9mCklDb21wb25lbnRDb250YWluZXIpe2ZvcmVhY2goJHRoaXMtPmdldENvbXBvbmVudHMoKWFzJGNvbXBvbmVudCl7aWYoJGNvbXBvbmVudAppbnN0YW5jZW9mCk5Db21wb25lbnQpeyRjb21wb25lbnQtPnJlZnJlc2hNb25pdG9ycygkZGVwdGgrMSwkbWlzc2luZywkbGlzdGVuZXJzKTt9fX1pZigkbWlzc2luZz09PU5VTEwpe2ZvcmVhY2goJHRoaXMtPm1vbml0b3JzCmFzJHR5cGU9PiRyZWMpe2lmKGlzc2V0KCRyZWNbMV0pJiYkcmVjWzFdPiRkZXB0aCl7aWYoJHJlY1szXSl7JHRoaXMtPm1vbml0b3JzWyR0eXBlXT1hcnJheShOVUxMLE5VTEwsTlVMTCxUUlVFKTskbGlzdGVuZXJzW109YXJyYXkoJHRoaXMsJHJlY1swXSk7fWVsc2V7dW5zZXQoJHRoaXMtPm1vbml0b3JzWyR0eXBlXSk7fX19fWVsc2V7Zm9yZWFjaCgkdGhpcy0+bW9uaXRvcnMKYXMkdHlwZT0+JHJlYyl7aWYoaXNzZXQoJHJlY1swXSkpe2NvbnRpbnVlO31lbHNlaWYoISRyZWNbM10pe3Vuc2V0KCR0aGlzLT5tb25pdG9yc1skdHlwZV0pO31lbHNlaWYoaXNzZXQoJG1pc3NpbmdbJHR5cGVdKSl7JHRoaXMtPm1vbml0b3JzWyR0eXBlXT1hcnJheShOVUxMLE5VTEwsTlVMTCxUUlVFKTt9ZWxzZXskdGhpcy0+bW9uaXRvcnNbJHR5cGVdPU5VTEw7aWYoJG9iaj0kdGhpcy0+bG9va3VwKCR0eXBlLEZBTFNFKSl7JGxpc3RlbmVyc1tdPWFycmF5KCR0aGlzLCRvYmopO31lbHNleyRtaXNzaW5nWyR0eXBlXT1UUlVFO30kdGhpcy0+bW9uaXRvcnNbJHR5cGVdWzNdPVRSVUU7fX19aWYoJGRlcHRoPT09MCl7JG1ldGhvZD0kbWlzc2luZz09PU5VTEw/J2RldGFjaGVkJzonYXR0YWNoZWQnO2ZvcmVhY2goJGxpc3RlbmVycwphcyRpdGVtKXskaXRlbVswXS0+JG1ldGhvZCgkaXRlbVsxXSk7fX19ZnVuY3Rpb24KX19jbG9uZSgpe2lmKCR0aGlzLT5wYXJlbnQ9PT1OVUxMKXtyZXR1cm47fWVsc2VpZigkdGhpcy0+cGFyZW50Cmluc3RhbmNlb2YKTkNvbXBvbmVudENvbnRhaW5lcil7JHRoaXMtPnBhcmVudD0kdGhpcy0+cGFyZW50LT5faXNDbG9uaW5nKCk7aWYoJHRoaXMtPnBhcmVudD09PU5VTEwpeyR0aGlzLT5yZWZyZXNoTW9uaXRvcnMoMCk7fX1lbHNleyR0aGlzLT5wYXJlbnQ9TlVMTDskdGhpcy0+cmVmcmVzaE1vbml0b3JzKDApO319ZmluYWwKZnVuY3Rpb24KX193YWtldXAoKXt0aHJvdwpuZXcKTm90SW1wbGVtZW50ZWRFeGNlcHRpb247fX1jbGFzcwpOQ29tcG9uZW50Q29udGFpbmVyCmV4dGVuZHMKTkNvbXBvbmVudAppbXBsZW1lbnRzCklDb21wb25lbnRDb250YWluZXJ7cHJpdmF0ZSRjb21wb25lbnRzPWFycmF5KCk7cHJpdmF0ZSRjbG9uaW5nO2Z1bmN0aW9uCmFkZENvbXBvbmVudChJQ29tcG9uZW50JGNvbXBvbmVudCwkbmFtZSwkaW5zZXJ0QmVmb3JlPU5VTEwpe2lmKCRuYW1lPT09TlVMTCl7JG5hbWU9JGNvbXBvbmVudC0+Z2V0TmFtZSgpO31pZihpc19pbnQoJG5hbWUpKXskbmFtZT0oc3RyaW5nKSRuYW1lO31lbHNlaWYoIWlzX3N0cmluZygkbmFtZSkpe3Rocm93Cm5ldwpJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIkNvbXBvbmVudCBuYW1lIG11c3QgYmUgaW50ZWdlciBvciBzdHJpbmcsICIuZ2V0dHlwZSgkbmFtZSkuIiBnaXZlbi4iKTt9ZWxzZWlmKCFwcmVnX21hdGNoKCcjXlthLXpBLVowLTlfXSskIycsJG5hbWUpKXt0aHJvdwpuZXcKSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJDb21wb25lbnQgbmFtZSBtdXN0IGJlIG5vbi1lbXB0eSBhbHBoYW51bWVyaWMgc3RyaW5nLCAnJG5hbWUnIGdpdmVuLiIpO31pZihpc3NldCgkdGhpcy0+Y29tcG9uZW50c1skbmFtZV0pKXt0aHJvdwpuZXcKSW52YWxpZFN0YXRlRXhjZXB0aW9uKCJDb21wb25lbnQgd2l0aCBuYW1lICckbmFtZScgYWxyZWFkeSBleGlzdHMuIik7fSRvYmo9JHRoaXM7ZG97aWYoJG9iaj09PSRjb21wb25lbnQpe3Rocm93Cm5ldwpJbnZhbGlkU3RhdGVFeGNlcHRpb24oIkNpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZCB3aGlsZSBhZGRpbmcgY29tcG9uZW50ICckbmFtZScuIik7fSRvYmo9JG9iai0+Z2V0UGFyZW50KCk7fXdoaWxlKCRvYmohPT1OVUxMKTskdGhpcy0+dmFsaWRhdGVDaGlsZENvbXBvbmVudCgkY29tcG9uZW50KTt0cnl7aWYoaXNzZXQoJHRoaXMtPmNvbXBvbmVudHNbJGluc2VydEJlZm9yZV0pKXskdG1wPWFycmF5KCk7Zm9yZWFjaCgkdGhpcy0+Y29tcG9uZW50cwphcyRrPT4kdil7aWYoJGs9PT0kaW5zZXJ0QmVmb3JlKSR0bXBbJG5hbWVdPSRjb21wb25lbnQ7JHRtcFska109JHY7fSR0aGlzLT5jb21wb25lbnRzPSR0bXA7fWVsc2V7JHRoaXMtPmNvbXBvbmVudHNbJG5hbWVdPSRjb21wb25lbnQ7fSRjb21wb25lbnQtPnNldFBhcmVudCgkdGhpcywkbmFtZSk7fWNhdGNoKEV4Y2VwdGlvbiRlKXt1bnNldCgkdGhpcy0+Y29tcG9uZW50c1skbmFtZV0pO3Rocm93JGU7fX1mdW5jdGlvbgpyZW1vdmVDb21wb25lbnQoSUNvbXBvbmVudCRjb21wb25lbnQpeyRuYW1lPSRjb21wb25lbnQtPmdldE5hbWUoKTtpZighaXNzZXQoJHRoaXMtPmNvbXBvbmVudHNbJG5hbWVdKXx8JHRoaXMtPmNvbXBvbmVudHNbJG5hbWVdIT09JGNvbXBvbmVudCl7dGhyb3cKbmV3CkludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiQ29tcG9uZW50IG5hbWVkICckbmFtZScgaXMgbm90IGxvY2F0ZWQgaW4gdGhpcyBjb250YWluZXIuIik7fXVuc2V0KCR0aGlzLT5jb21wb25lbnRzWyRuYW1lXSk7JGNvbXBvbmVudC0+c2V0UGFyZW50KE5VTEwpO31maW5hbApmdW5jdGlvbgpnZXRDb21wb25lbnQoJG5hbWUsJG5lZWQ9VFJVRSl7aWYoaXNfaW50KCRuYW1lKSl7JG5hbWU9KHN0cmluZykkbmFtZTt9ZWxzZWlmKCFpc19zdHJpbmcoJG5hbWUpKXt0aHJvdwpuZXcKSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJDb21wb25lbnQgbmFtZSBtdXN0IGJlIGludGVnZXIgb3Igc3RyaW5nLCAiLmdldHR5cGUoJG5hbWUpLiIgZ2l2ZW4uIik7fWVsc2V7JGE9c3RycG9zKCRuYW1lLHNlbGY6Ok5BTUVfU0VQQVJBVE9SKTtpZigkYSE9PUZBTFNFKXskZXh0PShzdHJpbmcpc3Vic3RyKCRuYW1lLCRhKzEpOyRuYW1lPXN1YnN0cigkbmFtZSwwLCRhKTt9aWYoJG5hbWU9PT0nJyl7dGhyb3cKbmV3CkludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiQ29tcG9uZW50IG9yIHN1YmNvbXBvbmVudCBuYW1lIG11c3Qgbm90IGJlIGVtcHR5IHN0cmluZy4iKTt9fWlmKCFpc3NldCgkdGhpcy0+Y29tcG9uZW50c1skbmFtZV0pKXskY29tcG9uZW50PSR0aGlzLT5jcmVhdGVDb21wb25lbnQoJG5hbWUpO2lmKCRjb21wb25lbnQKaW5zdGFuY2VvZgpJQ29tcG9uZW50JiYkY29tcG9uZW50LT5nZXRQYXJlbnQoKT09PU5VTEwpeyR0aGlzLT5hZGRDb21wb25lbnQoJGNvbXBvbmVudCwkbmFtZSk7fX1pZihpc3NldCgkdGhpcy0+Y29tcG9uZW50c1skbmFtZV0pKXtpZighaXNzZXQoJGV4dCkpe3JldHVybiR0aGlzLT5jb21wb25lbnRzWyRuYW1lXTt9ZWxzZWlmKCR0aGlzLT5jb21wb25lbnRzWyRuYW1lXWluc3RhbmNlb2YKSUNvbXBvbmVudENvbnRhaW5lcil7cmV0dXJuJHRoaXMtPmNvbXBvbmVudHNbJG5hbWVdLT5nZXRDb21wb25lbnQoJGV4dCwkbmVlZCk7fWVsc2VpZigkbmVlZCl7dGhyb3cKbmV3CkludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiQ29tcG9uZW50IHdpdGggbmFtZSAnJG5hbWUnIGlzIG5vdCBjb250YWluZXIgYW5kIGNhbm5vdCBoYXZlICckZXh0JyBjb21wb25lbnQuIik7fX1lbHNlaWYoJG5lZWQpe3Rocm93Cm5ldwpJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIkNvbXBvbmVudCB3aXRoIG5hbWUgJyRuYW1lJyBkb2VzIG5vdCBleGlzdC4iKTt9fXByb3RlY3RlZApmdW5jdGlvbgpjcmVhdGVDb21wb25lbnQoJG5hbWUpeyR1Y25hbWU9dWNmaXJzdCgkbmFtZSk7JG1ldGhvZD0nY3JlYXRlQ29tcG9uZW50Jy4kdWNuYW1lO2lmKCR1Y25hbWUhPT0kbmFtZSYmbWV0aG9kX2V4aXN0cygkdGhpcywkbWV0aG9kKSYmJHRoaXMtPmdldFJlZmxlY3Rpb24oKS0+Z2V0TWV0aG9kKCRtZXRob2QpLT5nZXROYW1lKCk9PT0kbWV0aG9kKXtyZXR1cm4kdGhpcy0+JG1ldGhvZCgkbmFtZSk7fX1maW5hbApmdW5jdGlvbgpnZXRDb21wb25lbnRzKCRkZWVwPUZBTFNFLCRmaWx0ZXJUeXBlPU5VTEwpeyRpdGVyYXRvcj1uZXcKTlJlY3Vyc2l2ZUNvbXBvbmVudEl0ZXJhdG9yKCR0aGlzLT5jb21wb25lbnRzKTtpZigkZGVlcCl7JGRlZXA9JGRlZXA+MD9SZWN1cnNpdmVJdGVyYXRvckl0ZXJhdG9yOjpTRUxGX0ZJUlNUOlJlY3Vyc2l2ZUl0ZXJhdG9ySXRlcmF0b3I6OkNISUxEX0ZJUlNUOyRpdGVyYXRvcj1uZXcKUmVjdXJzaXZlSXRlcmF0b3JJdGVyYXRvcigkaXRlcmF0b3IsJGRlZXApO31pZigkZmlsdGVyVHlwZSl7aWYoJGE9c3RycnBvcygkZmlsdGVyVHlwZSwnXFwnKSkkZmlsdGVyVHlwZT1zdWJzdHIoJGZpbHRlclR5cGUsJGErMSk7JGl0ZXJhdG9yPW5ldwpOSW5zdGFuY2VGaWx0ZXJJdGVyYXRvcigkaXRlcmF0b3IsJGZpbHRlclR5cGUpO31yZXR1cm4kaXRlcmF0b3I7fXByb3RlY3RlZApmdW5jdGlvbgp2YWxpZGF0ZUNoaWxkQ29tcG9uZW50KElDb21wb25lbnQkY2hpbGQpe31mdW5jdGlvbgpfX2Nsb25lKCl7aWYoJHRoaXMtPmNvbXBvbmVudHMpeyRvbGRNeXNlbGY9cmVzZXQoJHRoaXMtPmNvbXBvbmVudHMpLT5nZXRQYXJlbnQoKTskb2xkTXlzZWxmLT5jbG9uaW5nPSR0aGlzO2ZvcmVhY2goJHRoaXMtPmNvbXBvbmVudHMKYXMkbmFtZT0+JGNvbXBvbmVudCl7JHRoaXMtPmNvbXBvbmVudHNbJG5hbWVdPWNsb25lJGNvbXBvbmVudDt9JG9sZE15c2VsZi0+Y2xvbmluZz1OVUxMO31wYXJlbnQ6Ol9fY2xvbmUoKTt9ZnVuY3Rpb24KX2lzQ2xvbmluZygpe3JldHVybiR0aGlzLT5jbG9uaW5nO319Y2xhc3MKTlJlY3Vyc2l2ZUNvbXBvbmVudEl0ZXJhdG9yCmV4dGVuZHMKUmVjdXJzaXZlQXJyYXlJdGVyYXRvcgppbXBsZW1lbnRzCkNvdW50YWJsZXtmdW5jdGlvbgpoYXNDaGlsZHJlbigpe3JldHVybiR0aGlzLT5jdXJyZW50KClpbnN0YW5jZW9mCklDb21wb25lbnRDb250YWluZXI7fWZ1bmN0aW9uCmdldENoaWxkcmVuKCl7cmV0dXJuJHRoaXMtPmN1cnJlbnQoKS0+Z2V0Q29tcG9uZW50cygpO31mdW5jdGlvbgpjb3VudCgpe3JldHVybgppdGVyYXRvcl9jb3VudCgkdGhpcyk7fX1jbGFzcwpORm9ybUNvbnRhaW5lcgpleHRlbmRzCk5Db21wb25lbnRDb250YWluZXIKaW1wbGVtZW50cwpBcnJheUFjY2VzcyxJTmFtaW5nQ29udGFpbmVye3B1YmxpYyRvblZhbGlkYXRlO3Byb3RlY3RlZCRjdXJyZW50R3JvdXA7cHJvdGVjdGVkJHZhbGlkO2Z1bmN0aW9uCnNldERlZmF1bHRzKCR2YWx1ZXMsJGVyYXNlPUZBTFNFKXskZm9ybT0kdGhpcy0+Z2V0Rm9ybShGQUxTRSk7aWYoISRmb3JtfHwhJGZvcm0tPmlzQW5jaG9yZWQoKXx8ISRmb3JtLT5pc1N1Ym1pdHRlZCgpKXskdGhpcy0+c2V0VmFsdWVzKCR2YWx1ZXMsJGVyYXNlKTt9cmV0dXJuJHRoaXM7fWZ1bmN0aW9uCnNldFZhbHVlcygkdmFsdWVzLCRlcmFzZT1GQUxTRSl7aWYoJHZhbHVlcwppbnN0YW5jZW9mClRyYXZlcnNhYmxlKXskdmFsdWVzPWl0ZXJhdG9yX3RvX2FycmF5KCR2YWx1ZXMpO31lbHNlaWYoIWlzX2FycmF5KCR2YWx1ZXMpKXt0aHJvdwpuZXcKSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJWYWx1ZXMgbXVzdCBiZSBhbiBhcnJheSwgIi5nZXR0eXBlKCR2YWx1ZXMpLiIgZ2l2ZW4uIik7fSRjdXJzb3I9JiR2YWx1ZXM7JGl0ZXJhdG9yPSR0aGlzLT5nZXRDb21wb25lbnRzKFRSVUUpO2ZvcmVhY2goJGl0ZXJhdG9yCmFzJG5hbWU9PiRjb250cm9sKXskc3ViPSRpdGVyYXRvci0+Z2V0U3ViSXRlcmF0b3IoKTtpZighaXNzZXQoJHN1Yi0+Y3Vyc29yKSl7JHN1Yi0+Y3Vyc29yPSYkY3Vyc29yO31pZigkY29udHJvbAppbnN0YW5jZW9mCklGb3JtQ29udHJvbCl7aWYoKGlzX2FycmF5KCRzdWItPmN1cnNvcil8fCRzdWItPmN1cnNvcgppbnN0YW5jZW9mCkFycmF5QWNjZXNzKSYmYXJyYXlfa2V5X2V4aXN0cygkbmFtZSwkc3ViLT5jdXJzb3IpKXskY29udHJvbC0+c2V0VmFsdWUoJHN1Yi0+Y3Vyc29yWyRuYW1lXSk7fWVsc2VpZigkZXJhc2UpeyRjb250cm9sLT5zZXRWYWx1ZShOVUxMKTt9fWlmKCRjb250cm9sCmluc3RhbmNlb2YKSU5hbWluZ0NvbnRhaW5lcil7aWYoKGlzX2FycmF5KCRzdWItPmN1cnNvcil8fCRzdWItPmN1cnNvcgppbnN0YW5jZW9mCkFycmF5QWNjZXNzKSYmaXNzZXQoJHN1Yi0+Y3Vyc29yWyRuYW1lXSkpeyRjdXJzb3I9JiRzdWItPmN1cnNvclskbmFtZV07fWVsc2V7dW5zZXQoJGN1cnNvcik7JGN1cnNvcj1OVUxMO319fXJldHVybiR0aGlzO31mdW5jdGlvbgpnZXRWYWx1ZXMoKXskdmFsdWVzPWFycmF5KCk7JGN1cnNvcj0mJHZhbHVlczskaXRlcmF0b3I9JHRoaXMtPmdldENvbXBvbmVudHMoVFJVRSk7Zm9yZWFjaCgkaXRlcmF0b3IKYXMkbmFtZT0+JGNvbnRyb2wpeyRzdWI9JGl0ZXJhdG9yLT5nZXRTdWJJdGVyYXRvcigpO2lmKCFpc3NldCgkc3ViLT5jdXJzb3IpKXskc3ViLT5jdXJzb3I9JiRjdXJzb3I7fWlmKCRjb250cm9sCmluc3RhbmNlb2YKSUZvcm1Db250cm9sJiYhJGNvbnRyb2wtPmlzRGlzYWJsZWQoKSYmISgkY29udHJvbAppbnN0YW5jZW9mCklTdWJtaXR0ZXJDb250cm9sKSl7JHN1Yi0+Y3Vyc29yWyRuYW1lXT0kY29udHJvbC0+Z2V0VmFsdWUoKTt9aWYoJGNvbnRyb2wKaW5zdGFuY2VvZgpJTmFtaW5nQ29udGFpbmVyKXskY3Vyc29yPSYkc3ViLT5jdXJzb3JbJG5hbWVdOyRjdXJzb3I9YXJyYXkoKTt9fXJldHVybiR2YWx1ZXM7fWZ1bmN0aW9uCmlzVmFsaWQoKXtpZigkdGhpcy0+dmFsaWQ9PT1OVUxMKXskdGhpcy0+dmFsaWRhdGUoKTt9cmV0dXJuJHRoaXMtPnZhbGlkO31mdW5jdGlvbgp2YWxpZGF0ZSgpeyR0aGlzLT52YWxpZD1UUlVFOyR0aGlzLT5vblZhbGlkYXRlKCR0aGlzKTtmb3JlYWNoKCR0aGlzLT5nZXRDb250cm9scygpYXMkY29udHJvbCl7aWYoISRjb250cm9sLT5nZXRSdWxlcygpLT52YWxpZGF0ZSgpKXskdGhpcy0+dmFsaWQ9RkFMU0U7fX19ZnVuY3Rpb24Kc2V0Q3VycmVudEdyb3VwKE5Gb3JtR3JvdXAkZ3JvdXA9TlVMTCl7JHRoaXMtPmN1cnJlbnRHcm91cD0kZ3JvdXA7cmV0dXJuJHRoaXM7fWZ1bmN0aW9uCmFkZENvbXBvbmVudChJQ29tcG9uZW50JGNvbXBvbmVudCwkbmFtZSwkaW5zZXJ0QmVmb3JlPU5VTEwpe3BhcmVudDo6YWRkQ29tcG9uZW50KCRjb21wb25lbnQsJG5hbWUsJGluc2VydEJlZm9yZSk7aWYoJHRoaXMtPmN1cnJlbnRHcm91cCE9PU5VTEwmJiRjb21wb25lbnQKaW5zdGFuY2VvZgpJRm9ybUNvbnRyb2wpeyR0aGlzLT5jdXJyZW50R3JvdXAtPmFkZCgkY29tcG9uZW50KTt9fWZ1bmN0aW9uCmdldENvbnRyb2xzKCl7cmV0dXJuJHRoaXMtPmdldENvbXBvbmVudHMoVFJVRSwnSUZvcm1Db250cm9sJyk7fWZ1bmN0aW9uCmdldEZvcm0oJG5lZWQ9VFJVRSl7cmV0dXJuJHRoaXMtPmxvb2t1cCgnTkZvcm0nLCRuZWVkKTt9ZnVuY3Rpb24KYWRkVGV4dCgkbmFtZSwkbGFiZWw9TlVMTCwkY29scz1OVUxMLCRtYXhMZW5ndGg9TlVMTCl7cmV0dXJuJHRoaXNbJG5hbWVdPW5ldwpOVGV4dElucHV0KCRsYWJlbCwkY29scywkbWF4TGVuZ3RoKTt9ZnVuY3Rpb24KYWRkUGFzc3dvcmQoJG5hbWUsJGxhYmVsPU5VTEwsJGNvbHM9TlVMTCwkbWF4TGVuZ3RoPU5VTEwpeyRjb250cm9sPW5ldwpOVGV4dElucHV0KCRsYWJlbCwkY29scywkbWF4TGVuZ3RoKTskY29udHJvbC0+c2V0UGFzc3dvcmRNb2RlKFRSVUUpO3JldHVybiR0aGlzWyRuYW1lXT0kY29udHJvbDt9ZnVuY3Rpb24KYWRkVGV4dEFyZWEoJG5hbWUsJGxhYmVsPU5VTEwsJGNvbHM9NDAsJHJvd3M9MTApe3JldHVybiR0aGlzWyRuYW1lXT1uZXcKTlRleHRBcmVhKCRsYWJlbCwkY29scywkcm93cyk7fWZ1bmN0aW9uCmFkZEZpbGUoJG5hbWUsJGxhYmVsPU5VTEwpe3JldHVybiR0aGlzWyRuYW1lXT1uZXcKTkZpbGVVcGxvYWQoJGxhYmVsKTt9ZnVuY3Rpb24KYWRkSGlkZGVuKCRuYW1lLCRkZWZhdWx0PU5VTEwpeyRjb250cm9sPW5ldwpOSGlkZGVuRmllbGQ7JGNvbnRyb2wtPnNldERlZmF1bHRWYWx1ZSgkZGVmYXVsdCk7cmV0dXJuJHRoaXNbJG5hbWVdPSRjb250cm9sO31mdW5jdGlvbgphZGRDaGVja2JveCgkbmFtZSwkY2FwdGlvbj1OVUxMKXtyZXR1cm4kdGhpc1skbmFtZV09bmV3Ck5DaGVja2JveCgkY2FwdGlvbik7fWZ1bmN0aW9uCmFkZFJhZGlvTGlzdCgkbmFtZSwkbGFiZWw9TlVMTCxhcnJheSRpdGVtcz1OVUxMKXtyZXR1cm4kdGhpc1skbmFtZV09bmV3Ck5SYWRpb0xpc3QoJGxhYmVsLCRpdGVtcyk7fWZ1bmN0aW9uCmFkZFNlbGVjdCgkbmFtZSwkbGFiZWw9TlVMTCxhcnJheSRpdGVtcz1OVUxMLCRzaXplPU5VTEwpe3JldHVybiR0aGlzWyRuYW1lXT1uZXcKTlNlbGVjdEJveCgkbGFiZWwsJGl0ZW1zLCRzaXplKTt9ZnVuY3Rpb24KYWRkTXVsdGlTZWxlY3QoJG5hbWUsJGxhYmVsPU5VTEwsYXJyYXkkaXRlbXM9TlVMTCwkc2l6ZT1OVUxMKXtyZXR1cm4kdGhpc1skbmFtZV09bmV3Ck5NdWx0aVNlbGVjdEJveCgkbGFiZWwsJGl0ZW1zLCRzaXplKTt9ZnVuY3Rpb24KYWRkU3VibWl0KCRuYW1lLCRjYXB0aW9uPU5VTEwpe3JldHVybiR0aGlzWyRuYW1lXT1uZXcKTlN1Ym1pdEJ1dHRvbigkY2FwdGlvbik7fWZ1bmN0aW9uCmFkZEJ1dHRvbigkbmFtZSwkY2FwdGlvbil7cmV0dXJuJHRoaXNbJG5hbWVdPW5ldwpOQnV0dG9uKCRjYXB0aW9uKTt9ZnVuY3Rpb24KYWRkSW1hZ2UoJG5hbWUsJHNyYz1OVUxMLCRhbHQ9TlVMTCl7cmV0dXJuJHRoaXNbJG5hbWVdPW5ldwpOSW1hZ2VCdXR0b24oJHNyYywkYWx0KTt9ZnVuY3Rpb24KYWRkQ29udGFpbmVyKCRuYW1lKXskY29udHJvbD1uZXcKTkZvcm1Db250YWluZXI7JGNvbnRyb2wtPmN1cnJlbnRHcm91cD0kdGhpcy0+Y3VycmVudEdyb3VwO3JldHVybiR0aGlzWyRuYW1lXT0kY29udHJvbDt9ZmluYWwKZnVuY3Rpb24Kb2Zmc2V0U2V0KCRuYW1lLCRjb21wb25lbnQpeyR0aGlzLT5hZGRDb21wb25lbnQoJGNvbXBvbmVudCwkbmFtZSk7fWZpbmFsCmZ1bmN0aW9uCm9mZnNldEdldCgkbmFtZSl7cmV0dXJuJHRoaXMtPmdldENvbXBvbmVudCgkbmFtZSxUUlVFKTt9ZmluYWwKZnVuY3Rpb24Kb2Zmc2V0RXhpc3RzKCRuYW1lKXtyZXR1cm4kdGhpcy0+Z2V0Q29tcG9uZW50KCRuYW1lLEZBTFNFKSE9PU5VTEw7fWZpbmFsCmZ1bmN0aW9uCm9mZnNldFVuc2V0KCRuYW1lKXskY29tcG9uZW50PSR0aGlzLT5nZXRDb21wb25lbnQoJG5hbWUsRkFMU0UpO2lmKCRjb21wb25lbnQhPT1OVUxMKXskdGhpcy0+cmVtb3ZlQ29tcG9uZW50KCRjb21wb25lbnQpO319ZmluYWwKZnVuY3Rpb24KX19jbG9uZSgpe3Rocm93Cm5ldwpOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbignRm9ybSBjbG9uaW5nIGlzIG5vdCBzdXBwb3J0ZWQgeWV0LicpO319Y2xhc3MKTkZvcm0KZXh0ZW5kcwpORm9ybUNvbnRhaW5lcntjb25zdApFUVVBTD0nOmVxdWFsJztjb25zdApJU19JTj0nOmVxdWFsJztjb25zdApGSUxMRUQ9JzpmaWxsZWQnO2NvbnN0ClZBTElEPSc6dmFsaWQnO2NvbnN0ClNVQk1JVFRFRD0nOnN1Ym1pdHRlZCc7Y29uc3QKTUlOX0xFTkdUSD0nOm1pbkxlbmd0aCc7Y29uc3QKTUFYX0xFTkdUSD0nOm1heExlbmd0aCc7Y29uc3QKTEVOR1RIPSc6bGVuZ3RoJztjb25zdApFTUFJTD0nOmVtYWlsJztjb25zdApVUkw9Jzp1cmwnO2NvbnN0ClJFR0VYUD0nOnJlZ2V4cCc7Y29uc3QKSU5URUdFUj0nOmludGVnZXInO2NvbnN0Ck5VTUVSSUM9JzppbnRlZ2VyJztjb25zdApGTE9BVD0nOmZsb2F0Jztjb25zdApSQU5HRT0nOnJhbmdlJztjb25zdApNQVhfRklMRV9TSVpFPSc6ZmlsZVNpemUnO2NvbnN0Ck1JTUVfVFlQRT0nOm1pbWVUeXBlJztjb25zdApTQ1JJUFQ9J05ldHRlXFxGb3Jtc1xcSW5zdGFudENsaWVudFNjcmlwdDo6amF2YXNjcmlwdCc7Y29uc3QKR0VUPSdnZXQnO2NvbnN0ClBPU1Q9J3Bvc3QnO2NvbnN0ClRSQUNLRVJfSUQ9J19mb3JtXyc7Y29uc3QKUFJPVEVDVE9SX0lEPSdfdG9rZW5fJztwdWJsaWMkb25TdWJtaXQ7cHVibGljJG9uSW52YWxpZFN1Ym1pdDtwcml2YXRlJHN1Ym1pdHRlZEJ5O3ByaXZhdGUkaHR0cERhdGE7cHJpdmF0ZSRlbGVtZW50O3ByaXZhdGUkcmVuZGVyZXI7cHJpdmF0ZSR0cmFuc2xhdG9yO3ByaXZhdGUkZ3JvdXBzPWFycmF5KCk7cHJpdmF0ZSRlcnJvcnM9YXJyYXkoKTtwcml2YXRlJGVuY29kaW5nPSdVVEYtOCc7ZnVuY3Rpb24KX19jb25zdHJ1Y3QoJG5hbWU9TlVMTCl7JHRoaXMtPmVsZW1lbnQ9Tkh0bWw6OmVsKCdmb3JtJyk7JHRoaXMtPmVsZW1lbnQtPmFjdGlvbj0nJzskdGhpcy0+ZWxlbWVudC0+bWV0aG9kPXNlbGY6OlBPU1Q7JHRoaXMtPmVsZW1lbnQtPmlkPSdmcm0tJy4kbmFtZTskdGhpcy0+bW9uaXRvcihfX0NMQVNTX18pO2lmKCRuYW1lIT09TlVMTCl7JHRyYWNrZXI9bmV3Ck5IaWRkZW5GaWVsZCgkbmFtZSk7JHRyYWNrZXItPnVubW9uaXRvcihfX0NMQVNTX18pOyR0aGlzW3NlbGY6OlRSQUNLRVJfSURdPSR0cmFja2VyO31wYXJlbnQ6Ol9fY29uc3RydWN0KE5VTEwsJG5hbWUpO31wcm90ZWN0ZWQKZnVuY3Rpb24KYXR0YWNoZWQoJG9iail7aWYoJG9iagppbnN0YW5jZW9mCnNlbGYpe3Rocm93Cm5ldwpJbnZhbGlkU3RhdGVFeGNlcHRpb24oJ05lc3RlZCBmb3JtcyBhcmUgZm9yYmlkZGVuLicpO319ZmluYWwKZnVuY3Rpb24KZ2V0Rm9ybSgkbmVlZD1UUlVFKXtyZXR1cm4kdGhpczt9ZnVuY3Rpb24Kc2V0QWN0aW9uKCR1cmwpeyR0aGlzLT5lbGVtZW50LT5hY3Rpb249JHVybDtyZXR1cm4kdGhpczt9ZnVuY3Rpb24KZ2V0QWN0aW9uKCl7cmV0dXJuJHRoaXMtPmVsZW1lbnQtPmFjdGlvbjt9ZnVuY3Rpb24Kc2V0TWV0aG9kKCRtZXRob2Qpe2lmKCR0aGlzLT5odHRwRGF0YSE9PU5VTEwpe3Rocm93Cm5ldwpJbnZhbGlkU3RhdGVFeGNlcHRpb24oX19NRVRIT0RfXy4nKCkgbXVzdCBiZSBjYWxsZWQgdW50aWwgdGhlIGZvcm0gaXMgZW1wdHkuJyk7fSR0aGlzLT5lbGVtZW50LT5tZXRob2Q9c3RydG9sb3dlcigkbWV0aG9kKTtyZXR1cm4kdGhpczt9ZnVuY3Rpb24KZ2V0TWV0aG9kKCl7cmV0dXJuJHRoaXMtPmVsZW1lbnQtPm1ldGhvZDt9ZnVuY3Rpb24KYWRkVHJhY2tlcigpe3Rocm93Cm5ldwpEZXByZWNhdGVkRXhjZXB0aW9uKF9fTUVUSE9EX18uJygpIGlzIGRlcHJlY2F0ZWQ7IHBhc3MgZm9ybSBuYW1lIHRvIHRoZSBjb25zdHJ1Y3Rvci4nKTt9ZnVuY3Rpb24KYWRkUHJvdGVjdGlvbigkbWVzc2FnZT1OVUxMLCR0aW1lb3V0PU5VTEwpeyRzZXNzaW9uPSR0aGlzLT5nZXRTZXNzaW9uKCktPmdldE5hbWVzcGFjZSgnTmV0dGUuRm9ybXMuRm9ybS9DU1JGJyk7JGtleT0ia2V5JHRpbWVvdXQiO2lmKGlzc2V0KCRzZXNzaW9uLT4ka2V5KSl7JHRva2VuPSRzZXNzaW9uLT4ka2V5O31lbHNleyRzZXNzaW9uLT4ka2V5PSR0b2tlbj1tZDUodW5pcWlkKCcnLFRSVUUpKTt9JHNlc3Npb24tPnNldEV4cGlyYXRpb24oJHRpbWVvdXQsJGtleSk7JHRoaXNbc2VsZjo6UFJPVEVDVE9SX0lEXT1uZXcKTkhpZGRlbkZpZWxkKCR0b2tlbik7JHRoaXNbc2VsZjo6UFJPVEVDVE9SX0lEXS0+YWRkUnVsZSgnOmVxdWFsJyxlbXB0eSgkbWVzc2FnZSk/J1NlY3VyaXR5IHRva2VuIGRpZCBub3QgbWF0Y2guIFBvc3NpYmxlIENTUkYgYXR0YWNrLic6JG1lc3NhZ2UsJHRva2VuKTt9ZnVuY3Rpb24KYWRkR3JvdXAoJGNhcHRpb249TlVMTCwkc2V0QXNDdXJyZW50PVRSVUUpeyRncm91cD1uZXcKTkZvcm1Hcm91cDskZ3JvdXAtPnNldE9wdGlvbignbGFiZWwnLCRjYXB0aW9uKTskZ3JvdXAtPnNldE9wdGlvbigndmlzdWFsJyxUUlVFKTtpZigkc2V0QXNDdXJyZW50KXskdGhpcy0+c2V0Q3VycmVudEdyb3VwKCRncm91cCk7fWlmKGlzc2V0KCR0aGlzLT5ncm91cHNbJGNhcHRpb25dKSl7cmV0dXJuJHRoaXMtPmdyb3Vwc1tdPSRncm91cDt9ZWxzZXtyZXR1cm4kdGhpcy0+Z3JvdXBzWyRjYXB0aW9uXT0kZ3JvdXA7fX1mdW5jdGlvbgpyZW1vdmVHcm91cCgkbmFtZSl7aWYoaXNfc3RyaW5nKCRuYW1lKSYmaXNzZXQoJHRoaXMtPmdyb3Vwc1skbmFtZV0pKXskZ3JvdXA9JHRoaXMtPmdyb3Vwc1skbmFtZV07fWVsc2VpZigkbmFtZQppbnN0YW5jZW9mCk5Gb3JtR3JvdXAmJmluX2FycmF5KCRuYW1lLCR0aGlzLT5ncm91cHMsVFJVRSkpeyRncm91cD0kbmFtZTskbmFtZT1hcnJheV9zZWFyY2goJGdyb3VwLCR0aGlzLT5ncm91cHMsVFJVRSk7fWVsc2V7dGhyb3cKbmV3CkludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiR3JvdXAgbm90IGZvdW5kIGluIGZvcm0gJyR0aGlzLT5uYW1lJyIpO31mb3JlYWNoKCRncm91cC0+Z2V0Q29udHJvbHMoKWFzJGNvbnRyb2wpeyR0aGlzLT5yZW1vdmVDb21wb25lbnQoJGNvbnRyb2wpO311bnNldCgkdGhpcy0+Z3JvdXBzWyRuYW1lXSk7fWZ1bmN0aW9uCmdldEdyb3Vwcygpe3JldHVybiR0aGlzLT5ncm91cHM7fWZ1bmN0aW9uCmdldEdyb3VwKCRuYW1lKXtyZXR1cm4KaXNzZXQoJHRoaXMtPmdyb3Vwc1skbmFtZV0pPyR0aGlzLT5ncm91cHNbJG5hbWVdOk5VTEw7fWZ1bmN0aW9uCnNldEVuY29kaW5nKCR2YWx1ZSl7JHRoaXMtPmVuY29kaW5nPWVtcHR5KCR2YWx1ZSk/J1VURi04JzpzdHJ0b3VwcGVyKCR2YWx1ZSk7aWYoJHRoaXMtPmVuY29kaW5nIT09J1VURi04JyYmIWV4dGVuc2lvbl9sb2FkZWQoJ21ic3RyaW5nJykpe3Rocm93Cm5ldwpFeGNlcHRpb24oIlRoZSBQSFAgZXh0ZW5zaW9uICdtYnN0cmluZycgaXMgcmVxdWlyZWQgZm9yIHRoaXMgZW5jb2RpbmcgYnV0IGlzIG5vdCBsb2FkZWQuIik7fXJldHVybiR0aGlzO31maW5hbApmdW5jdGlvbgpnZXRFbmNvZGluZygpe3JldHVybiR0aGlzLT5lbmNvZGluZzt9ZnVuY3Rpb24Kc2V0VHJhbnNsYXRvcihJVHJhbnNsYXRvciR0cmFuc2xhdG9yPU5VTEwpeyR0aGlzLT50cmFuc2xhdG9yPSR0cmFuc2xhdG9yO3JldHVybiR0aGlzO31maW5hbApmdW5jdGlvbgpnZXRUcmFuc2xhdG9yKCl7cmV0dXJuJHRoaXMtPnRyYW5zbGF0b3I7fWZ1bmN0aW9uCmlzQW5jaG9yZWQoKXtyZXR1cm4KVFJVRTt9ZmluYWwKZnVuY3Rpb24KaXNTdWJtaXR0ZWQoKXtpZigkdGhpcy0+c3VibWl0dGVkQnk9PT1OVUxMKXskdGhpcy0+Z2V0SHR0cERhdGEoKTskdGhpcy0+c3VibWl0dGVkQnk9IWVtcHR5KCR0aGlzLT5odHRwRGF0YSk7fXJldHVybiR0aGlzLT5zdWJtaXR0ZWRCeTt9ZnVuY3Rpb24Kc2V0U3VibWl0dGVkQnkoSVN1Ym1pdHRlckNvbnRyb2wkYnk9TlVMTCl7JHRoaXMtPnN1Ym1pdHRlZEJ5PSRieT09PU5VTEw/RkFMU0U6JGJ5O3JldHVybiR0aGlzO31maW5hbApmdW5jdGlvbgpnZXRIdHRwRGF0YSgpe2lmKCR0aGlzLT5odHRwRGF0YT09PU5VTEwpe2lmKCEkdGhpcy0+aXNBbmNob3JlZCgpKXt0aHJvdwpuZXcKSW52YWxpZFN0YXRlRXhjZXB0aW9uKCdGb3JtIGlzIG5vdCBhbmNob3JlZCBhbmQgdGhlcmVmb3JlIGNhbiBub3QgZGV0ZXJtaW5lIHdoZXRoZXIgaXQgd2FzIHN1Ym1pdHRlZC4nKTt9JHRoaXMtPmh0dHBEYXRhPShhcnJheSkkdGhpcy0+cmVjZWl2ZUh0dHBEYXRhKCk7fXJldHVybiR0aGlzLT5odHRwRGF0YTt9ZnVuY3Rpb24KZmlyZUV2ZW50cygpe2lmKCEkdGhpcy0+aXNTdWJtaXR0ZWQoKSl7cmV0dXJuO31lbHNlaWYoJHRoaXMtPnN1Ym1pdHRlZEJ5Cmluc3RhbmNlb2YKSVN1Ym1pdHRlckNvbnRyb2wpe2lmKCEkdGhpcy0+c3VibWl0dGVkQnktPmdldFZhbGlkYXRpb25TY29wZSgpfHwkdGhpcy0+aXNWYWxpZCgpKXskdGhpcy0+c3VibWl0dGVkQnktPmNsaWNrKCk7JHRoaXMtPm9uU3VibWl0KCR0aGlzKTt9ZWxzZXskdGhpcy0+c3VibWl0dGVkQnktPm9uSW52YWxpZENsaWNrKCR0aGlzLT5zdWJtaXR0ZWRCeSk7JHRoaXMtPm9uSW52YWxpZFN1Ym1pdCgkdGhpcyk7fX1lbHNlaWYoJHRoaXMtPmlzVmFsaWQoKSl7JHRoaXMtPm9uU3VibWl0KCR0aGlzKTt9ZWxzZXskdGhpcy0+b25JbnZhbGlkU3VibWl0KCR0aGlzKTt9fXByb3RlY3RlZApmdW5jdGlvbgpyZWNlaXZlSHR0cERhdGEoKXskaHR0cFJlcXVlc3Q9JHRoaXMtPmdldEh0dHBSZXF1ZXN0KCk7aWYoc3RyY2FzZWNtcCgkdGhpcy0+Z2V0TWV0aG9kKCksJGh0dHBSZXF1ZXN0LT5nZXRNZXRob2QoKSkpe3JldHVybjt9JGh0dHBSZXF1ZXN0LT5zZXRFbmNvZGluZygkdGhpcy0+ZW5jb2RpbmcpO2lmKCRodHRwUmVxdWVzdC0+aXNNZXRob2QoJ3Bvc3QnKSl7JGRhdGE9TkFycmF5VG9vbHM6Om1lcmdlVHJlZSgkaHR0cFJlcXVlc3QtPmdldFBvc3QoKSwkaHR0cFJlcXVlc3QtPmdldEZpbGVzKCkpO31lbHNleyRkYXRhPSRodHRwUmVxdWVzdC0+Z2V0UXVlcnkoKTt9aWYoJHRyYWNrZXI9JHRoaXMtPmdldENvbXBvbmVudChzZWxmOjpUUkFDS0VSX0lELEZBTFNFKSl7aWYoIWlzc2V0KCRkYXRhW3NlbGY6OlRSQUNLRVJfSURdKXx8JGRhdGFbc2VsZjo6VFJBQ0tFUl9JRF0hPT0kdHJhY2tlci0+Z2V0VmFsdWUoKSl7cmV0dXJuO319cmV0dXJuJGRhdGE7fWZ1bmN0aW9uCnByb2Nlc3NIdHRwUmVxdWVzdCgpe3RyaWdnZXJfZXJyb3IoX19NRVRIT0RfXy4nKCkgaXMgZGVwcmVjYXRlZDsgdXNlIGZpcmVFdmVudHMoKSBpbnN0ZWFkLicsRV9VU0VSX1dBUk5JTkcpOyR0aGlzLT5maXJlRXZlbnRzKCk7fWZ1bmN0aW9uCmdldFZhbHVlcygpeyR2YWx1ZXM9cGFyZW50OjpnZXRWYWx1ZXMoKTt1bnNldCgkdmFsdWVzW3NlbGY6OlRSQUNLRVJfSURdLCR2YWx1ZXNbc2VsZjo6UFJPVEVDVE9SX0lEXSk7cmV0dXJuJHZhbHVlczt9ZnVuY3Rpb24KYWRkRXJyb3IoJG1lc3NhZ2UpeyR0aGlzLT52YWxpZD1GQUxTRTtpZigkbWVzc2FnZSE9PU5VTEwmJiFpbl9hcnJheSgkbWVzc2FnZSwkdGhpcy0+ZXJyb3JzLFRSVUUpKXskdGhpcy0+ZXJyb3JzW109JG1lc3NhZ2U7fX1mdW5jdGlvbgpnZXRFcnJvcnMoKXtyZXR1cm4kdGhpcy0+ZXJyb3JzO31mdW5jdGlvbgpoYXNFcnJvcnMoKXtyZXR1cm4oYm9vbCkkdGhpcy0+Z2V0RXJyb3JzKCk7fWZ1bmN0aW9uCmNsZWFuRXJyb3JzKCl7JHRoaXMtPmVycm9ycz1hcnJheSgpOyR0aGlzLT52YWxpZD1OVUxMO31mdW5jdGlvbgpnZXRFbGVtZW50UHJvdG90eXBlKCl7cmV0dXJuJHRoaXMtPmVsZW1lbnQ7fWZ1bmN0aW9uCnNldFJlbmRlcmVyKElGb3JtUmVuZGVyZXIkcmVuZGVyZXIpeyR0aGlzLT5yZW5kZXJlcj0kcmVuZGVyZXI7cmV0dXJuJHRoaXM7fWZpbmFsCmZ1bmN0aW9uCmdldFJlbmRlcmVyKCl7aWYoJHRoaXMtPnJlbmRlcmVyPT09TlVMTCl7JHRoaXMtPnJlbmRlcmVyPW5ldwpOQ29udmVudGlvbmFsUmVuZGVyZXI7fXJldHVybiR0aGlzLT5yZW5kZXJlcjt9ZnVuY3Rpb24KcmVuZGVyKCl7JGFyZ3M9ZnVuY19nZXRfYXJncygpO2FycmF5X3Vuc2hpZnQoJGFyZ3MsJHRoaXMpOyRzPWNhbGxfdXNlcl9mdW5jX2FycmF5KGFycmF5KCR0aGlzLT5nZXRSZW5kZXJlcigpLCdyZW5kZXInKSwkYXJncyk7aWYoc3RyY21wKCR0aGlzLT5lbmNvZGluZywnVVRGLTgnKSl7ZWNobwptYl9jb252ZXJ0X2VuY29kaW5nKCRzLCdIVE1MLUVOVElUSUVTJywnVVRGLTgnKTt9ZWxzZXtlY2hvJHM7fX1mdW5jdGlvbgpfX3RvU3RyaW5nKCl7dHJ5e2lmKHN0cmNtcCgkdGhpcy0+ZW5jb2RpbmcsJ1VURi04Jykpe3JldHVybgptYl9jb252ZXJ0X2VuY29kaW5nKCR0aGlzLT5nZXRSZW5kZXJlcigpLT5yZW5kZXIoJHRoaXMpLCdIVE1MLUVOVElUSUVTJywnVVRGLTgnKTt9ZWxzZXtyZXR1cm4kdGhpcy0+Z2V0UmVuZGVyZXIoKS0+cmVuZGVyKCR0aGlzKTt9fWNhdGNoKEV4Y2VwdGlvbiRlKXtpZihmdW5jX2dldF9hcmdzKCkmJmZ1bmNfZ2V0X2FyZygwKSl7dGhyb3ckZTt9ZWxzZXtORGVidWc6OnRvU3RyaW5nRXhjZXB0aW9uKCRlKTt9fX1wcm90ZWN0ZWQKZnVuY3Rpb24KZ2V0SHR0cFJlcXVlc3QoKXtyZXR1cm4KY2xhc3NfZXhpc3RzKCdORW52aXJvbm1lbnQnKT9ORW52aXJvbm1lbnQ6OmdldEh0dHBSZXF1ZXN0KCk6bmV3Ck5IdHRwUmVxdWVzdDt9cHJvdGVjdGVkCmZ1bmN0aW9uCmdldFNlc3Npb24oKXtyZXR1cm4KTkVudmlyb25tZW50OjpnZXRTZXNzaW9uKCk7fX1jbGFzcwpOQXBwRm9ybQpleHRlbmRzCk5Gb3JtCmltcGxlbWVudHMKSVNpZ25hbFJlY2VpdmVye2Z1bmN0aW9uCl9fY29uc3RydWN0KElDb21wb25lbnRDb250YWluZXIkcGFyZW50PU5VTEwsJG5hbWU9TlVMTCl7cGFyZW50OjpfX2NvbnN0cnVjdCgpOyR0aGlzLT5tb25pdG9yKCdOUHJlc2VudGVyJyk7aWYoJHBhcmVudCE9PU5VTEwpeyRwYXJlbnQtPmFkZENvbXBvbmVudCgkdGhpcywkbmFtZSk7fX1mdW5jdGlvbgpnZXRQcmVzZW50ZXIoJG5lZWQ9VFJVRSl7cmV0dXJuJHRoaXMtPmxvb2t1cCgnTlByZXNlbnRlcicsJG5lZWQpO31wcm90ZWN0ZWQKZnVuY3Rpb24KYXR0YWNoZWQoJHByZXNlbnRlcil7aWYoJHByZXNlbnRlcgppbnN0YW5jZW9mCk5QcmVzZW50ZXIpeyRuYW1lPSR0aGlzLT5sb29rdXBQYXRoKCdOUHJlc2VudGVyJyk7aWYoIWlzc2V0KCR0aGlzLT5nZXRFbGVtZW50UHJvdG90eXBlKCktPmlkKSl7JHRoaXMtPmdldEVsZW1lbnRQcm90b3R5cGUoKS0+aWQ9J2ZybS0nLiRuYW1lO30kdGhpcy0+c2V0QWN0aW9uKG5ldwpOTGluaygkcHJlc2VudGVyLCRuYW1lLnNlbGY6Ok5BTUVfU0VQQVJBVE9SLidzdWJtaXQhJyxhcnJheSgpKSk7aWYoJHRoaXMtPmlzU3VibWl0dGVkKCkpe2ZvcmVhY2goJHRoaXMtPmdldENvbnRyb2xzKClhcyRjb250cm9sKXskY29udHJvbC0+bG9hZEh0dHBEYXRhKCk7fX19cGFyZW50OjphdHRhY2hlZCgkcHJlc2VudGVyKTt9ZnVuY3Rpb24KaXNBbmNob3JlZCgpe3JldHVybihib29sKSR0aGlzLT5nZXRQcmVzZW50ZXIoRkFMU0UpO31wcm90ZWN0ZWQKZnVuY3Rpb24KcmVjZWl2ZUh0dHBEYXRhKCl7JHByZXNlbnRlcj0kdGhpcy0+Z2V0UHJlc2VudGVyKCk7aWYoISRwcmVzZW50ZXItPmlzU2lnbmFsUmVjZWl2ZXIoJHRoaXMsJ3N1Ym1pdCcpKXtyZXR1cm47fSRpc1Bvc3Q9JHRoaXMtPmdldE1ldGhvZCgpPT09c2VsZjo6UE9TVDskcmVxdWVzdD0kcHJlc2VudGVyLT5nZXRSZXF1ZXN0KCk7aWYoJHJlcXVlc3QtPmlzTWV0aG9kKCdmb3J3YXJkJyl8fCRyZXF1ZXN0LT5pc01ldGhvZCgncG9zdCcpIT09JGlzUG9zdCl7cmV0dXJuO31pZigkaXNQb3N0KXtyZXR1cm4KTkFycmF5VG9vbHM6Om1lcmdlVHJlZSgkcmVxdWVzdC0+Z2V0UG9zdCgpLCRyZXF1ZXN0LT5nZXRGaWxlcygpKTt9ZWxzZXtyZXR1cm4kcmVxdWVzdC0+Z2V0UGFyYW1zKCk7fX1mdW5jdGlvbgpzaWduYWxSZWNlaXZlZCgkc2lnbmFsKXtpZigkc2lnbmFsPT09J3N1Ym1pdCcpeyR0aGlzLT5maXJlRXZlbnRzKCk7fWVsc2V7dGhyb3cKbmV3Ck5CYWRTaWduYWxFeGNlcHRpb24oIlRoZXJlIGlzIG5vIGhhbmRsZXIgZm9yIHNpZ25hbCAnJHNpZ25hbCcgaW4geyR0aGlzLT5yZWZsZWN0aW9uLT5uYW1lfS4iKTt9fX1jbGFzcwpOQXBwbGljYXRpb24KZXh0ZW5kcwpOT2JqZWN0e3B1YmxpYwpzdGF0aWMkbWF4TG9vcD0yMDtwdWJsaWMkZGVmYXVsdFNlcnZpY2VzPWFycmF5KCdOZXR0ZVxcQXBwbGljYXRpb25cXElSb3V0ZXInPT4nTk11bHRpUm91dGVyJywnTmV0dGVcXEFwcGxpY2F0aW9uXFxJUHJlc2VudGVyTG9hZGVyJz0+YXJyYXkoX19DTEFTU19fLCdjcmVhdGVQcmVzZW50ZXJMb2FkZXInKSk7cHVibGljJGNhdGNoRXhjZXB0aW9ucztwdWJsaWMkZXJyb3JQcmVzZW50ZXI7cHVibGljJG9uU3RhcnR1cDtwdWJsaWMkb25TaHV0ZG93bjtwdWJsaWMkb25SZXF1ZXN0O3B1YmxpYyRvbkVycm9yO3B1YmxpYyRhbGxvd2VkTWV0aG9kcz1hcnJheSgnR0VUJywnUE9TVCcsJ0hFQUQnLCdQVVQnLCdERUxFVEUnKTtwcml2YXRlJHJlcXVlc3RzPWFycmF5KCk7cHJpdmF0ZSRwcmVzZW50ZXI7cHJpdmF0ZSRzZXJ2aWNlTG9jYXRvcjtmdW5jdGlvbgpydW4oKXskaHR0cFJlcXVlc3Q9JHRoaXMtPmdldEh0dHBSZXF1ZXN0KCk7JGh0dHBSZXNwb25zZT0kdGhpcy0+Z2V0SHR0cFJlc3BvbnNlKCk7JGh0dHBSZXF1ZXN0LT5zZXRFbmNvZGluZygnVVRGLTgnKTskaHR0cFJlc3BvbnNlLT5zZXRIZWFkZXIoJ1gtUG93ZXJlZC1CeScsJ05ldHRlIEZyYW1ld29yaycpO2lmKE5FbnZpcm9ubWVudDo6Z2V0VmFyaWFibGUoJ2Jhc2VVcmknKT09PU5VTEwpe05FbnZpcm9ubWVudDo6c2V0VmFyaWFibGUoJ2Jhc2VVcmknLCRodHRwUmVxdWVzdC0+Z2V0VXJpKCktPmdldEJhc2VQYXRoKCkpO30kc2Vzc2lvbj0kdGhpcy0+Z2V0U2Vzc2lvbigpO2lmKCEkc2Vzc2lvbi0+aXNTdGFydGVkKCkmJiRzZXNzaW9uLT5leGlzdHMoKSl7JHNlc3Npb24tPnN0YXJ0KCk7fWlmKCR0aGlzLT5hbGxvd2VkTWV0aG9kcyl7JG1ldGhvZD0kaHR0cFJlcXVlc3QtPmdldE1ldGhvZCgpO2lmKCFpbl9hcnJheSgkbWV0aG9kLCR0aGlzLT5hbGxvd2VkTWV0aG9kcyxUUlVFKSl7JGh0dHBSZXNwb25zZS0+c2V0Q29kZShJSHR0cFJlc3BvbnNlOjpTNTAxX05PVF9JTVBMRU1FTlRFRCk7JGh0dHBSZXNwb25zZS0+c2V0SGVhZGVyKCdBbGxvdycsaW1wbG9kZSgnLCcsJHRoaXMtPmFsbG93ZWRNZXRob2RzKSk7ZWNobyc8aDE+TWV0aG9kICcuaHRtbFNwZWNpYWxDaGFycygkbWV0aG9kKS4nIGlzIG5vdCBpbXBsZW1lbnRlZDwvaDE+JztyZXR1cm47fX0kcmVxdWVzdD1OVUxMOyRyZXBlYXRlZEVycm9yPUZBTFNFO2Rve3RyeXtpZihjb3VudCgkdGhpcy0+cmVxdWVzdHMpPnNlbGY6OiRtYXhMb29wKXt0aHJvdwpuZXcKTkFwcGxpY2F0aW9uRXhjZXB0aW9uKCdUb28gbWFueSBsb29wcyBkZXRlY3RlZCBpbiBhcHBsaWNhdGlvbiBsaWZlIGN5Y2xlLicpO31pZighJHJlcXVlc3QpeyR0aGlzLT5vblN0YXJ0dXAoJHRoaXMpOyRyb3V0ZXI9JHRoaXMtPmdldFJvdXRlcigpO2lmKCRyb3V0ZXIKaW5zdGFuY2VvZgpOTXVsdGlSb3V0ZXImJiFjb3VudCgkcm91dGVyKSl7JHJvdXRlcltdPW5ldwpOU2ltcGxlUm91dGVyKGFycmF5KCdwcmVzZW50ZXInPT4nRGVmYXVsdCcsJ2FjdGlvbic9PidkZWZhdWx0JykpO30kcmVxdWVzdD0kcm91dGVyLT5tYXRjaCgkaHR0cFJlcXVlc3QpO2lmKCEoJHJlcXVlc3QKaW5zdGFuY2VvZgpOUHJlc2VudGVyUmVxdWVzdCkpeyRyZXF1ZXN0PU5VTEw7dGhyb3cKbmV3Ck5CYWRSZXF1ZXN0RXhjZXB0aW9uKCdObyByb3V0ZSBmb3IgSFRUUCByZXF1ZXN0LicpO31pZihzdHJjYXNlY21wKCRyZXF1ZXN0LT5nZXRQcmVzZW50ZXJOYW1lKCksJHRoaXMtPmVycm9yUHJlc2VudGVyKT09PTApe3Rocm93Cm5ldwpOQmFkUmVxdWVzdEV4Y2VwdGlvbignSW52YWxpZCByZXF1ZXN0LicpO319JHRoaXMtPnJlcXVlc3RzW109JHJlcXVlc3Q7JHRoaXMtPm9uUmVxdWVzdCgkdGhpcywkcmVxdWVzdCk7JHByZXNlbnRlcj0kcmVxdWVzdC0+Z2V0UHJlc2VudGVyTmFtZSgpO3RyeXskY2xhc3M9JHRoaXMtPmdldFByZXNlbnRlckxvYWRlcigpLT5nZXRQcmVzZW50ZXJDbGFzcygkcHJlc2VudGVyKTskcmVxdWVzdC0+c2V0UHJlc2VudGVyTmFtZSgkcHJlc2VudGVyKTt9Y2F0Y2goTkludmFsaWRQcmVzZW50ZXJFeGNlcHRpb24kZSl7dGhyb3cKbmV3Ck5CYWRSZXF1ZXN0RXhjZXB0aW9uKCRlLT5nZXRNZXNzYWdlKCksNDA0LCRlKTt9JHJlcXVlc3QtPmZyZWV6ZSgpOyR0aGlzLT5wcmVzZW50ZXI9bmV3JGNsYXNzOyRyZXNwb25zZT0kdGhpcy0+cHJlc2VudGVyLT5ydW4oJHJlcXVlc3QpO2lmKCRyZXNwb25zZQppbnN0YW5jZW9mCk5Gb3J3YXJkaW5nUmVzcG9uc2UpeyRyZXF1ZXN0PSRyZXNwb25zZS0+Z2V0UmVxdWVzdCgpO2NvbnRpbnVlO31lbHNlaWYoJHJlc3BvbnNlCmluc3RhbmNlb2YKSVByZXNlbnRlclJlc3BvbnNlKXskcmVzcG9uc2UtPnNlbmQoKTt9YnJlYWs7fWNhdGNoKEV4Y2VwdGlvbiRlKXtpZigkdGhpcy0+Y2F0Y2hFeGNlcHRpb25zPT09TlVMTCl7JHRoaXMtPmNhdGNoRXhjZXB0aW9ucz1ORW52aXJvbm1lbnQ6OmlzUHJvZHVjdGlvbigpO30kdGhpcy0+b25FcnJvcigkdGhpcywkZSk7aWYoISR0aGlzLT5jYXRjaEV4Y2VwdGlvbnMpeyR0aGlzLT5vblNodXRkb3duKCR0aGlzLCRlKTt0aHJvdyRlO31pZigkcmVwZWF0ZWRFcnJvcil7JGU9bmV3Ck5BcHBsaWNhdGlvbkV4Y2VwdGlvbignQW4gZXJyb3Igb2NjdXJlZCB3aGlsZSBleGVjdXRpbmcgZXJyb3ItcHJlc2VudGVyJywwLCRlKTt9aWYoISRodHRwUmVzcG9uc2UtPmlzU2VudCgpKXskaHR0cFJlc3BvbnNlLT5zZXRDb2RlKCRlCmluc3RhbmNlb2YKTkJhZFJlcXVlc3RFeGNlcHRpb24/JGUtPmdldENvZGUoKTo1MDApO31pZighJHJlcGVhdGVkRXJyb3ImJiR0aGlzLT5lcnJvclByZXNlbnRlcil7JHJlcGVhdGVkRXJyb3I9VFJVRTskcmVxdWVzdD1uZXcKTlByZXNlbnRlclJlcXVlc3QoJHRoaXMtPmVycm9yUHJlc2VudGVyLE5QcmVzZW50ZXJSZXF1ZXN0OjpGT1JXQVJELGFycmF5KCdleGNlcHRpb24nPT4kZSkpO31lbHNle2VjaG8iPG1ldGEgbmFtZT0ncm9ib3RzJyBjb250ZW50PSdub2luZGV4Jz5cblxuIjtpZigkZQppbnN0YW5jZW9mCk5CYWRSZXF1ZXN0RXhjZXB0aW9uKXtlY2hvIjx0aXRsZT40MDQgTm90IEZvdW5kPC90aXRsZT5cblxuPGgxPk5vdCBGb3VuZDwvaDE+XG5cbjxwPlRoZSByZXF1ZXN0ZWQgVVJMIHdhcyBub3QgZm91bmQgb24gdGhpcyBzZXJ2ZXIuPC9wPiI7fWVsc2V7TkRlYnVnOjpwcm9jZXNzRXhjZXB0aW9uKCRlLEZBTFNFKTtlY2hvIjx0aXRsZT41MDAgSW50ZXJuYWwgU2VydmVyIEVycm9yPC90aXRsZT5cblxuPGgxPlNlcnZlciBFcnJvcjwvaDE+XG5cbiIsIjxwPlRoZSBzZXJ2ZXIgZW5jb3VudGVyZWQgYW4gaW50ZXJuYWwgZXJyb3IgYW5kIHdhcyB1bmFibGUgdG8gY29tcGxldGUgeW91ciByZXF1ZXN0LiBQbGVhc2UgdHJ5IGFnYWluIGxhdGVyLjwvcD4iO31lY2hvIlxuXG48aHI+XG48c21hbGw+PGk+TmV0dGUgRnJhbWV3b3JrPC9pPjwvc21hbGw+IjticmVhazt9fX13aGlsZSgxKTskdGhpcy0+b25TaHV0ZG93bigkdGhpcyxpc3NldCgkZSk/JGU6TlVMTCk7fWZpbmFsCmZ1bmN0aW9uCmdldFJlcXVlc3RzKCl7cmV0dXJuJHRoaXMtPnJlcXVlc3RzO31maW5hbApmdW5jdGlvbgpnZXRQcmVzZW50ZXIoKXtyZXR1cm4kdGhpcy0+cHJlc2VudGVyO31maW5hbApmdW5jdGlvbgpnZXRTZXJ2aWNlTG9jYXRvcigpe2lmKCR0aGlzLT5zZXJ2aWNlTG9jYXRvcj09PU5VTEwpeyR0aGlzLT5zZXJ2aWNlTG9jYXRvcj1uZXcKTlNlcnZpY2VMb2NhdG9yKE5FbnZpcm9ubWVudDo6Z2V0U2VydmljZUxvY2F0b3IoKSk7Zm9yZWFjaCgkdGhpcy0+ZGVmYXVsdFNlcnZpY2VzCmFzJG5hbWU9PiRzZXJ2aWNlKXtpZighJHRoaXMtPnNlcnZpY2VMb2NhdG9yLT5oYXNTZXJ2aWNlKCRuYW1lKSl7JHRoaXMtPnNlcnZpY2VMb2NhdG9yLT5hZGRTZXJ2aWNlKCRuYW1lLCRzZXJ2aWNlKTt9fX1yZXR1cm4kdGhpcy0+c2VydmljZUxvY2F0b3I7fWZpbmFsCmZ1bmN0aW9uCmdldFNlcnZpY2UoJG5hbWUsYXJyYXkkb3B0aW9ucz1OVUxMKXtyZXR1cm4kdGhpcy0+Z2V0U2VydmljZUxvY2F0b3IoKS0+Z2V0U2VydmljZSgkbmFtZSwkb3B0aW9ucyk7fWZ1bmN0aW9uCmdldFJvdXRlcigpe3JldHVybiR0aGlzLT5nZXRTZXJ2aWNlTG9jYXRvcigpLT5nZXRTZXJ2aWNlKCdOZXR0ZVxcQXBwbGljYXRpb25cXElSb3V0ZXInKTt9ZnVuY3Rpb24Kc2V0Um91dGVyKElSb3V0ZXIkcm91dGVyKXskdGhpcy0+Z2V0U2VydmljZUxvY2F0b3IoKS0+YWRkU2VydmljZSgnTmV0dGVcXEFwcGxpY2F0aW9uXFxJUm91dGVyJywkcm91dGVyKTtyZXR1cm4kdGhpczt9ZnVuY3Rpb24KZ2V0UHJlc2VudGVyTG9hZGVyKCl7cmV0dXJuJHRoaXMtPmdldFNlcnZpY2VMb2NhdG9yKCktPmdldFNlcnZpY2UoJ05ldHRlXFxBcHBsaWNhdGlvblxcSVByZXNlbnRlckxvYWRlcicpO31zdGF0aWMKZnVuY3Rpb24KY3JlYXRlUHJlc2VudGVyTG9hZGVyKCl7cmV0dXJuCm5ldwpOUHJlc2VudGVyTG9hZGVyKE5FbnZpcm9ubWVudDo6Z2V0VmFyaWFibGUoJ2FwcERpcicpKTt9ZnVuY3Rpb24Kc3RvcmVSZXF1ZXN0KCRleHBpcmF0aW9uPScrIDEwIG1pbnV0ZXMnKXskc2Vzc2lvbj0kdGhpcy0+Z2V0U2Vzc2lvbignTmV0dGUuQXBwbGljYXRpb24vcmVxdWVzdHMnKTtkb3ska2V5PXN1YnN0cihtZDUobGNnX3ZhbHVlKCkpLDAsNCk7fXdoaWxlKGlzc2V0KCRzZXNzaW9uWyRrZXldKSk7JHNlc3Npb25bJGtleV09ZW5kKCR0aGlzLT5yZXF1ZXN0cyk7JHNlc3Npb24tPnNldEV4cGlyYXRpb24oJGV4cGlyYXRpb24sJGtleSk7cmV0dXJuJGtleTt9ZnVuY3Rpb24KcmVzdG9yZVJlcXVlc3QoJGtleSl7JHNlc3Npb249JHRoaXMtPmdldFNlc3Npb24oJ05ldHRlLkFwcGxpY2F0aW9uL3JlcXVlc3RzJyk7aWYoaXNzZXQoJHNlc3Npb25bJGtleV0pKXskcmVxdWVzdD1jbG9uZSRzZXNzaW9uWyRrZXldO3Vuc2V0KCRzZXNzaW9uWyRrZXldKTskcmVxdWVzdC0+c2V0RmxhZyhOUHJlc2VudGVyUmVxdWVzdDo6UkVTVE9SRUQsVFJVRSk7JHRoaXMtPnByZXNlbnRlci0+dGVybWluYXRlKG5ldwpORm9yd2FyZGluZ1Jlc3BvbnNlKCRyZXF1ZXN0KSk7fX1wcm90ZWN0ZWQKZnVuY3Rpb24KZ2V0SHR0cFJlcXVlc3QoKXtyZXR1cm4KTkVudmlyb25tZW50OjpnZXRIdHRwUmVxdWVzdCgpO31wcm90ZWN0ZWQKZnVuY3Rpb24KZ2V0SHR0cFJlc3BvbnNlKCl7cmV0dXJuCk5FbnZpcm9ubWVudDo6Z2V0SHR0cFJlc3BvbnNlKCk7fXByb3RlY3RlZApmdW5jdGlvbgpnZXRTZXNzaW9uKCRuYW1lc3BhY2U9TlVMTCl7cmV0dXJuCk5FbnZpcm9ubWVudDo6Z2V0U2Vzc2lvbigkbmFtZXNwYWNlKTt9fWFic3RyYWN0CmNsYXNzCk5QcmVzZW50ZXJDb21wb25lbnQKZXh0ZW5kcwpOQ29tcG9uZW50Q29udGFpbmVyCmltcGxlbWVudHMKSVNpZ25hbFJlY2VpdmVyLElTdGF0ZVBlcnNpc3RlbnQsQXJyYXlBY2Nlc3N7cHJvdGVjdGVkJHBhcmFtcz1hcnJheSgpO2Z1bmN0aW9uCl9fY29uc3RydWN0KElDb21wb25lbnRDb250YWluZXIkcGFyZW50PU5VTEwsJG5hbWU9TlVMTCl7JHRoaXMtPm1vbml0b3IoJ05QcmVzZW50ZXInKTtwYXJlbnQ6Ol9fY29uc3RydWN0KCRwYXJlbnQsJG5hbWUpO31mdW5jdGlvbgpnZXRQcmVzZW50ZXIoJG5lZWQ9VFJVRSl7cmV0dXJuJHRoaXMtPmxvb2t1cCgnTlByZXNlbnRlcicsJG5lZWQpO31mdW5jdGlvbgpnZXRVbmlxdWVJZCgpe3JldHVybiR0aGlzLT5sb29rdXBQYXRoKCdOUHJlc2VudGVyJyxUUlVFKTt9cHJvdGVjdGVkCmZ1bmN0aW9uCmF0dGFjaGVkKCRwcmVzZW50ZXIpe2lmKCRwcmVzZW50ZXIKaW5zdGFuY2VvZgpOUHJlc2VudGVyKXskdGhpcy0+bG9hZFN0YXRlKCRwcmVzZW50ZXItPnBvcEdsb2JhbFBhcmFtcygkdGhpcy0+Z2V0VW5pcXVlSWQoKSkpO319cHJvdGVjdGVkCmZ1bmN0aW9uCnRyeUNhbGwoJG1ldGhvZCxhcnJheSRwYXJhbXMpeyRyYz0kdGhpcy0+Z2V0UmVmbGVjdGlvbigpO2lmKCRyYy0+aGFzTWV0aG9kKCRtZXRob2QpKXskcm09JHJjLT5nZXRNZXRob2QoJG1ldGhvZCk7aWYoJHJtLT5pc1B1YmxpYygpJiYhJHJtLT5pc0Fic3RyYWN0KCkmJiEkcm0tPmlzU3RhdGljKCkpeyRybS0+aW52b2tlTmFtZWRBcmdzKCR0aGlzLCRwYXJhbXMpO3JldHVybgpUUlVFO319cmV0dXJuCkZBTFNFO31mdW5jdGlvbgpnZXRSZWZsZWN0aW9uKCl7cmV0dXJuCm5ldwpOUHJlc2VudGVyQ29tcG9uZW50UmVmbGVjdGlvbigkdGhpcyk7fWZ1bmN0aW9uCmxvYWRTdGF0ZShhcnJheSRwYXJhbXMpe2ZvcmVhY2goJHRoaXMtPmdldFJlZmxlY3Rpb24oKS0+Z2V0UGVyc2lzdGVudFBhcmFtcygpYXMkbm09PiRtZXRhKXtpZihpc3NldCgkcGFyYW1zWyRubV0pKXtpZihpc3NldCgkbWV0YVsnZGVmJ10pKXtpZihpc19hcnJheSgkcGFyYW1zWyRubV0pJiYhaXNfYXJyYXkoJG1ldGFbJ2RlZiddKSl7JHBhcmFtc1skbm1dPSRtZXRhWydkZWYnXTt9ZWxzZXtzZXR0eXBlKCRwYXJhbXNbJG5tXSxnZXR0eXBlKCRtZXRhWydkZWYnXSkpO319JHRoaXMtPiRubT0mJHBhcmFtc1skbm1dO319JHRoaXMtPnBhcmFtcz0kcGFyYW1zO31mdW5jdGlvbgpzYXZlU3RhdGUoYXJyYXkmJHBhcmFtcywkcmVmbGVjdGlvbj1OVUxMKXskcmVmbGVjdGlvbj0kcmVmbGVjdGlvbj09PU5VTEw/JHRoaXMtPmdldFJlZmxlY3Rpb24oKTokcmVmbGVjdGlvbjtmb3JlYWNoKCRyZWZsZWN0aW9uLT5nZXRQZXJzaXN0ZW50UGFyYW1zKClhcyRubT0+JG1ldGEpe2lmKGlzc2V0KCRwYXJhbXNbJG5tXSkpeyR2YWw9JHBhcmFtc1skbm1dO31lbHNlaWYoYXJyYXlfa2V5X2V4aXN0cygkbm0sJHBhcmFtcykpe2NvbnRpbnVlO31lbHNlaWYoIWlzc2V0KCRtZXRhWydzaW5jZSddKXx8JHRoaXMKaW5zdGFuY2VvZiRtZXRhWydzaW5jZSddKXskdmFsPSR0aGlzLT4kbm07fWVsc2V7Y29udGludWU7fWlmKGlzX29iamVjdCgkdmFsKSl7dGhyb3cKbmV3CkludmFsaWRTdGF0ZUV4Y2VwdGlvbigiUGVyc2lzdGVudCBwYXJhbWV0ZXIgbXVzdCBiZSBzY2FsYXIgb3IgYXJyYXksIHskdGhpcy0+cmVmbGVjdGlvbi0+bmFtZX06OlwkJG5tIGlzICIuZ2V0dHlwZSgkdmFsKSk7fWVsc2V7aWYoaXNzZXQoJG1ldGFbJ2RlZiddKSl7c2V0dHlwZSgkdmFsLGdldHR5cGUoJG1ldGFbJ2RlZiddKSk7aWYoJHZhbD09PSRtZXRhWydkZWYnXSkkdmFsPU5VTEw7fWVsc2V7aWYoKHN0cmluZykkdmFsPT09JycpJHZhbD1OVUxMO30kcGFyYW1zWyRubV09JHZhbDt9fX1maW5hbApmdW5jdGlvbgpnZXRQYXJhbSgkbmFtZT1OVUxMLCRkZWZhdWx0PU5VTEwpe2lmKGZ1bmNfbnVtX2FyZ3MoKT09PTApe3JldHVybiR0aGlzLT5wYXJhbXM7fWVsc2VpZihpc3NldCgkdGhpcy0+cGFyYW1zWyRuYW1lXSkpe3JldHVybiR0aGlzLT5wYXJhbXNbJG5hbWVdO31lbHNle3JldHVybiRkZWZhdWx0O319ZmluYWwKZnVuY3Rpb24KZ2V0UGFyYW1JZCgkbmFtZSl7JHVpZD0kdGhpcy0+Z2V0VW5pcXVlSWQoKTtyZXR1cm4kdWlkPT09Jyc/JG5hbWU6JHVpZC5zZWxmOjpOQU1FX1NFUEFSQVRPUi4kbmFtZTt9c3RhdGljCmZ1bmN0aW9uCmdldFBlcnNpc3RlbnRQYXJhbXMoKXskcmM9bmV3Ck5DbGFzc1JlZmxlY3Rpb24oZnVuY19nZXRfYXJnKDApKTskcGFyYW1zPWFycmF5KCk7Zm9yZWFjaCgkcmMtPmdldFByb3BlcnRpZXMoUmVmbGVjdGlvblByb3BlcnR5OjpJU19QVUJMSUMpYXMkcnApe2lmKCEkcnAtPmlzU3RhdGljKCkmJiRycC0+aGFzQW5ub3RhdGlvbigncGVyc2lzdGVudCcpKXskcGFyYW1zW109JHJwLT5nZXROYW1lKCk7fX1yZXR1cm4kcGFyYW1zO31mdW5jdGlvbgpzaWduYWxSZWNlaXZlZCgkc2lnbmFsKXtpZighJHRoaXMtPnRyeUNhbGwoJHRoaXMtPmZvcm1hdFNpZ25hbE1ldGhvZCgkc2lnbmFsKSwkdGhpcy0+cGFyYW1zKSl7dGhyb3cKbmV3Ck5CYWRTaWduYWxFeGNlcHRpb24oIlRoZXJlIGlzIG5vIGhhbmRsZXIgZm9yIHNpZ25hbCAnJHNpZ25hbCcgaW4geyR0aGlzLT5yZWZsZWN0aW9uLT5uYW1lfSBjbGFzcy4iKTt9fWZ1bmN0aW9uCmZvcm1hdFNpZ25hbE1ldGhvZCgkc2lnbmFsKXtyZXR1cm4kc2lnbmFsPT1OVUxMP05VTEw6J2hhbmRsZScuJHNpZ25hbDt9ZnVuY3Rpb24KbGluaygkZGVzdGluYXRpb24sJGFyZ3M9YXJyYXkoKSl7aWYoIWlzX2FycmF5KCRhcmdzKSl7JGFyZ3M9ZnVuY19nZXRfYXJncygpO2FycmF5X3NoaWZ0KCRhcmdzKTt9dHJ5e3JldHVybiR0aGlzLT5nZXRQcmVzZW50ZXIoKS0+Y3JlYXRlUmVxdWVzdCgkdGhpcywkZGVzdGluYXRpb24sJGFyZ3MsJ2xpbmsnKTt9Y2F0Y2goTkludmFsaWRMaW5rRXhjZXB0aW9uJGUpe3JldHVybiR0aGlzLT5nZXRQcmVzZW50ZXIoKS0+aGFuZGxlSW52YWxpZExpbmsoJGUpO319ZnVuY3Rpb24KbGF6eUxpbmsoJGRlc3RpbmF0aW9uLCRhcmdzPWFycmF5KCkpe2lmKCFpc19hcnJheSgkYXJncykpeyRhcmdzPWZ1bmNfZ2V0X2FyZ3MoKTthcnJheV9zaGlmdCgkYXJncyk7fXJldHVybgpuZXcKTkxpbmsoJHRoaXMsJGRlc3RpbmF0aW9uLCRhcmdzKTt9ZnVuY3Rpb24KYWpheExpbmsoJGRlc3RpbmF0aW9uLCRhcmdzPWFycmF5KCkpe3Rocm93Cm5ldwpEZXByZWNhdGVkRXhjZXB0aW9uKF9fTUVUSE9EX18uJygpIGlzIGRlcHJlY2F0ZWQuJyk7fWZ1bmN0aW9uCnJlZGlyZWN0KCRjb2RlLCRkZXN0aW5hdGlvbj1OVUxMLCRhcmdzPWFycmF5KCkpe2lmKCFpc19udW1lcmljKCRjb2RlKSl7JGFyZ3M9JGRlc3RpbmF0aW9uOyRkZXN0aW5hdGlvbj0kY29kZTskY29kZT1OVUxMO31pZighaXNfYXJyYXkoJGFyZ3MpKXskYXJncz1mdW5jX2dldF9hcmdzKCk7aWYoaXNfbnVtZXJpYyhhcnJheV9zaGlmdCgkYXJncykpKWFycmF5X3NoaWZ0KCRhcmdzKTt9JHByZXNlbnRlcj0kdGhpcy0+Z2V0UHJlc2VudGVyKCk7JHByZXNlbnRlci0+cmVkaXJlY3RVcmkoJHByZXNlbnRlci0+Y3JlYXRlUmVxdWVzdCgkdGhpcywkZGVzdGluYXRpb24sJGFyZ3MsJ3JlZGlyZWN0JyksJGNvZGUpO31maW5hbApmdW5jdGlvbgpvZmZzZXRTZXQoJG5hbWUsJGNvbXBvbmVudCl7JHRoaXMtPmFkZENvbXBvbmVudCgkY29tcG9uZW50LCRuYW1lKTt9ZmluYWwKZnVuY3Rpb24Kb2Zmc2V0R2V0KCRuYW1lKXtyZXR1cm4kdGhpcy0+Z2V0Q29tcG9uZW50KCRuYW1lLFRSVUUpO31maW5hbApmdW5jdGlvbgpvZmZzZXRFeGlzdHMoJG5hbWUpe3JldHVybiR0aGlzLT5nZXRDb21wb25lbnQoJG5hbWUsRkFMU0UpIT09TlVMTDt9ZmluYWwKZnVuY3Rpb24Kb2Zmc2V0VW5zZXQoJG5hbWUpeyRjb21wb25lbnQ9JHRoaXMtPmdldENvbXBvbmVudCgkbmFtZSxGQUxTRSk7aWYoJGNvbXBvbmVudCE9PU5VTEwpeyR0aGlzLT5yZW1vdmVDb21wb25lbnQoJGNvbXBvbmVudCk7fX19YWJzdHJhY3QKY2xhc3MKTkNvbnRyb2wKZXh0ZW5kcwpOUHJlc2VudGVyQ29tcG9uZW50CmltcGxlbWVudHMKSVBhcnRpYWxseVJlbmRlcmFibGV7cHJpdmF0ZSR0ZW1wbGF0ZTtwcml2YXRlJGludmFsaWRTbmlwcGV0cz1hcnJheSgpO2ZpbmFsCmZ1bmN0aW9uCmdldFRlbXBsYXRlKCl7aWYoJHRoaXMtPnRlbXBsYXRlPT09TlVMTCl7JHZhbHVlPSR0aGlzLT5jcmVhdGVUZW1wbGF0ZSgpO2lmKCEoJHZhbHVlCmluc3RhbmNlb2YKSVRlbXBsYXRlfHwkdmFsdWU9PT1OVUxMKSl7JGNsYXNzPWdldF9jbGFzcygkdmFsdWUpO3Rocm93Cm5ldwpVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24oIk9iamVjdCByZXR1cm5lZCBieSB7JHRoaXMtPnJlZmxlY3Rpb24tPm5hbWV9OjpjcmVhdGVUZW1wbGF0ZSgpIG11c3QgYmUgaW5zdGFuY2Ugb2YgTmV0dGVcXFRlbXBsYXRlc1xcSVRlbXBsYXRlLCAnJGNsYXNzJyBnaXZlbi4iKTt9JHRoaXMtPnRlbXBsYXRlPSR2YWx1ZTt9cmV0dXJuJHRoaXMtPnRlbXBsYXRlO31wcm90ZWN0ZWQKZnVuY3Rpb24KY3JlYXRlVGVtcGxhdGUoKXskdGVtcGxhdGU9bmV3Ck5UZW1wbGF0ZTskcHJlc2VudGVyPSR0aGlzLT5nZXRQcmVzZW50ZXIoRkFMU0UpOyR0ZW1wbGF0ZS0+b25QcmVwYXJlRmlsdGVyc1tdPWFycmF5KCR0aGlzLCd0ZW1wbGF0ZVByZXBhcmVGaWx0ZXJzJyk7JHRlbXBsYXRlLT5jb21wb25lbnQ9JHRoaXM7JHRlbXBsYXRlLT5jb250cm9sPSR0aGlzOyR0ZW1wbGF0ZS0+cHJlc2VudGVyPSRwcmVzZW50ZXI7JHRlbXBsYXRlLT5iYXNlVXJpPU5FbnZpcm9ubWVudDo6Z2V0VmFyaWFibGUoJ2Jhc2VVcmknKTskdGVtcGxhdGUtPmJhc2VQYXRoPXJ0cmltKCR0ZW1wbGF0ZS0+YmFzZVVyaSwnLycpO2lmKCRwcmVzZW50ZXIhPT1OVUxMJiYkcHJlc2VudGVyLT5oYXNGbGFzaFNlc3Npb24oKSl7JGlkPSR0aGlzLT5nZXRQYXJhbUlkKCdmbGFzaCcpOyR0ZW1wbGF0ZS0+Zmxhc2hlcz0kcHJlc2VudGVyLT5nZXRGbGFzaFNlc3Npb24oKS0+JGlkO31pZighaXNzZXQoJHRlbXBsYXRlLT5mbGFzaGVzKXx8IWlzX2FycmF5KCR0ZW1wbGF0ZS0+Zmxhc2hlcykpeyR0ZW1wbGF0ZS0+Zmxhc2hlcz1hcnJheSgpO30kdGVtcGxhdGUtPnJlZ2lzdGVySGVscGVyKCdlc2NhcGUnLCdOVGVtcGxhdGVIZWxwZXJzOjplc2NhcGVIdG1sJyk7JHRlbXBsYXRlLT5yZWdpc3RlckhlbHBlcignZXNjYXBlVXJsJywncmF3dXJsZW5jb2RlJyk7JHRlbXBsYXRlLT5yZWdpc3RlckhlbHBlcignc3RyaXBUYWdzJywnc3RyaXBfdGFncycpOyR0ZW1wbGF0ZS0+cmVnaXN0ZXJIZWxwZXIoJ25sMmJyJywnbmwyYnInKTskdGVtcGxhdGUtPnJlZ2lzdGVySGVscGVyKCdzdWJzdHInLCdpY29udl9zdWJzdHInKTskdGVtcGxhdGUtPnJlZ2lzdGVySGVscGVyKCdyZXBlYXQnLCdzdHJfcmVwZWF0Jyk7JHRlbXBsYXRlLT5yZWdpc3RlckhlbHBlcignaW1wbG9kZScsJ2ltcGxvZGUnKTskdGVtcGxhdGUtPnJlZ2lzdGVySGVscGVyKCdudW1iZXInLCdudW1iZXJfZm9ybWF0Jyk7JHRlbXBsYXRlLT5yZWdpc3RlckhlbHBlckxvYWRlcignTlRlbXBsYXRlSGVscGVyczo6bG9hZGVyJyk7cmV0dXJuJHRlbXBsYXRlO31mdW5jdGlvbgp0ZW1wbGF0ZVByZXBhcmVGaWx0ZXJzKCR0ZW1wbGF0ZSl7JHRlbXBsYXRlLT5yZWdpc3RlckZpbHRlcihuZXcKTkxhdHRlRmlsdGVyKTt9ZnVuY3Rpb24KZ2V0V2lkZ2V0KCRuYW1lKXtyZXR1cm4kdGhpcy0+Z2V0Q29tcG9uZW50KCRuYW1lKTt9ZnVuY3Rpb24KZmxhc2hNZXNzYWdlKCRtZXNzYWdlLCR0eXBlPSdpbmZvJyl7JGlkPSR0aGlzLT5nZXRQYXJhbUlkKCdmbGFzaCcpOyRtZXNzYWdlcz0kdGhpcy0+Z2V0UHJlc2VudGVyKCktPmdldEZsYXNoU2Vzc2lvbigpLT4kaWQ7JG1lc3NhZ2VzW109JGZsYXNoPShvYmplY3QpYXJyYXkoJ21lc3NhZ2UnPT4kbWVzc2FnZSwndHlwZSc9PiR0eXBlKTskdGhpcy0+Z2V0VGVtcGxhdGUoKS0+Zmxhc2hlcz0kbWVzc2FnZXM7JHRoaXMtPmdldFByZXNlbnRlcigpLT5nZXRGbGFzaFNlc3Npb24oKS0+JGlkPSRtZXNzYWdlcztyZXR1cm4kZmxhc2g7fWZ1bmN0aW9uCmludmFsaWRhdGVDb250cm9sKCRzbmlwcGV0PU5VTEwpeyR0aGlzLT5pbnZhbGlkU25pcHBldHNbJHNuaXBwZXRdPVRSVUU7fWZ1bmN0aW9uCnZhbGlkYXRlQ29udHJvbCgkc25pcHBldD1OVUxMKXtpZigkc25pcHBldD09PU5VTEwpeyR0aGlzLT5pbnZhbGlkU25pcHBldHM9YXJyYXkoKTt9ZWxzZXt1bnNldCgkdGhpcy0+aW52YWxpZFNuaXBwZXRzWyRzbmlwcGV0XSk7fX1mdW5jdGlvbgppc0NvbnRyb2xJbnZhbGlkKCRzbmlwcGV0PU5VTEwpe2lmKCRzbmlwcGV0PT09TlVMTCl7aWYoY291bnQoJHRoaXMtPmludmFsaWRTbmlwcGV0cyk+MCl7cmV0dXJuClRSVUU7fWVsc2V7Zm9yZWFjaCgkdGhpcy0+Z2V0Q29tcG9uZW50cygpYXMkY29tcG9uZW50KXtpZigkY29tcG9uZW50Cmluc3RhbmNlb2YKSVJlbmRlcmFibGUmJiRjb21wb25lbnQtPmlzQ29udHJvbEludmFsaWQoKSl7cmV0dXJuClRSVUU7fX1yZXR1cm4KRkFMU0U7fX1lbHNle3JldHVybgppc3NldCgkdGhpcy0+aW52YWxpZFNuaXBwZXRzW05VTExdKXx8aXNzZXQoJHRoaXMtPmludmFsaWRTbmlwcGV0c1skc25pcHBldF0pO319ZnVuY3Rpb24KZ2V0U25pcHBldElkKCRuYW1lPU5VTEwpe3JldHVybidzbmlwcGV0LScuJHRoaXMtPmdldFVuaXF1ZUlkKCkuJy0nLiRuYW1lO319Y2xhc3MKTkFib3J0RXhjZXB0aW9uCmV4dGVuZHMKRXhjZXB0aW9ue31jbGFzcwpOQXBwbGljYXRpb25FeGNlcHRpb24KZXh0ZW5kcwpFeGNlcHRpb257ZnVuY3Rpb24KX19jb25zdHJ1Y3QoJG1lc3NhZ2U9JycsJGNvZGU9MCxFeGNlcHRpb24kcHJldmlvdXM9TlVMTCl7aWYoUEhQX1ZFUlNJT05fSUQ8NTAzMDApeyR0aGlzLT5wcmV2aW91cz0kcHJldmlvdXM7cGFyZW50OjpfX2NvbnN0cnVjdCgkbWVzc2FnZSwkY29kZSk7fWVsc2V7cGFyZW50OjpfX2NvbnN0cnVjdCgkbWVzc2FnZSwkY29kZSwkcHJldmlvdXMpO319fWNsYXNzCk5CYWRSZXF1ZXN0RXhjZXB0aW9uCmV4dGVuZHMKRXhjZXB0aW9ue3Byb3RlY3RlZCRkZWZhdWx0Q29kZT00MDQ7ZnVuY3Rpb24KX19jb25zdHJ1Y3QoJG1lc3NhZ2U9JycsJGNvZGU9MCxFeGNlcHRpb24kcHJldmlvdXM9TlVMTCl7aWYoJGNvZGU8MjAwfHwkY29kZT41MDQpeyRjb2RlPSR0aGlzLT5kZWZhdWx0Q29kZTt9aWYoUEhQX1ZFUlNJT05fSUQ8NTAzMDApeyR0aGlzLT5wcmV2aW91cz0kcHJldmlvdXM7cGFyZW50OjpfX2NvbnN0cnVjdCgkbWVzc2FnZSwkY29kZSk7fWVsc2V7cGFyZW50OjpfX2NvbnN0cnVjdCgkbWVzc2FnZSwkY29kZSwkcHJldmlvdXMpO319fWNsYXNzCk5CYWRTaWduYWxFeGNlcHRpb24KZXh0ZW5kcwpOQmFkUmVxdWVzdEV4Y2VwdGlvbntwcm90ZWN0ZWQkZGVmYXVsdENvZGU9NDAzO31jbGFzcwpORm9yYmlkZGVuUmVxdWVzdEV4Y2VwdGlvbgpleHRlbmRzCk5CYWRSZXF1ZXN0RXhjZXB0aW9ue3Byb3RlY3RlZCRkZWZhdWx0Q29kZT00MDM7fWNsYXNzCk5JbnZhbGlkTGlua0V4Y2VwdGlvbgpleHRlbmRzCkV4Y2VwdGlvbnt9Y2xhc3MKTkludmFsaWRQcmVzZW50ZXJFeGNlcHRpb24KZXh0ZW5kcwpOSW52YWxpZExpbmtFeGNlcHRpb257fWNsYXNzCk5MaW5rCmV4dGVuZHMKTk9iamVjdHtwcml2YXRlJGNvbXBvbmVudDtwcml2YXRlJGRlc3RpbmF0aW9uO3ByaXZhdGUkcGFyYW1zO2Z1bmN0aW9uCl9fY29uc3RydWN0KE5QcmVzZW50ZXJDb21wb25lbnQkY29tcG9uZW50LCRkZXN0aW5hdGlvbixhcnJheSRwYXJhbXMpeyR0aGlzLT5jb21wb25lbnQ9JGNvbXBvbmVudDskdGhpcy0+ZGVzdGluYXRpb249JGRlc3RpbmF0aW9uOyR0aGlzLT5wYXJhbXM9JHBhcmFtczt9ZnVuY3Rpb24KZ2V0RGVzdGluYXRpb24oKXtyZXR1cm4kdGhpcy0+ZGVzdGluYXRpb247fWZ1bmN0aW9uCnNldFBhcmFtKCRrZXksJHZhbHVlKXskdGhpcy0+cGFyYW1zWyRrZXldPSR2YWx1ZTtyZXR1cm4kdGhpczt9ZnVuY3Rpb24KZ2V0UGFyYW0oJGtleSl7cmV0dXJuCmlzc2V0KCR0aGlzLT5wYXJhbXNbJGtleV0pPyR0aGlzLT5wYXJhbXNbJGtleV06TlVMTDt9ZnVuY3Rpb24KZ2V0UGFyYW1zKCl7cmV0dXJuJHRoaXMtPnBhcmFtczt9ZnVuY3Rpb24KX190b1N0cmluZygpe3RyeXtyZXR1cm4kdGhpcy0+Y29tcG9uZW50LT5saW5rKCR0aGlzLT5kZXN0aW5hdGlvbiwkdGhpcy0+cGFyYW1zKTt9Y2F0Y2goRXhjZXB0aW9uJGUpe05EZWJ1Zzo6dG9TdHJpbmdFeGNlcHRpb24oJGUpO319fWFic3RyYWN0CmNsYXNzCk5QcmVzZW50ZXIKZXh0ZW5kcwpOQ29udHJvbAppbXBsZW1lbnRzCklQcmVzZW50ZXJ7Y29uc3QKUEhBU0VfU1RBUlRVUD0xO2NvbnN0ClBIQVNFX1NJR05BTD0zO2NvbnN0ClBIQVNFX1JFTkRFUj00O2NvbnN0ClBIQVNFX1NIVVRET1dOPTU7Y29uc3QKSU5WQUxJRF9MSU5LX1NJTEVOVD0xO2NvbnN0CklOVkFMSURfTElOS19XQVJOSU5HPTI7Y29uc3QKSU5WQUxJRF9MSU5LX0VYQ0VQVElPTj0zO2NvbnN0ClNJR05BTF9LRVk9J2RvJztjb25zdApBQ1RJT05fS0VZPSdhY3Rpb24nO2NvbnN0CkZMQVNIX0tFWT0nX2ZpZCc7cHVibGljCnN0YXRpYyRkZWZhdWx0QWN0aW9uPSdkZWZhdWx0JztwdWJsaWMKc3RhdGljJGludmFsaWRMaW5rTW9kZTtwdWJsaWMkb25TaHV0ZG93bjtwdWJsaWMkb2xkTGF5b3V0TW9kZT1UUlVFO3B1YmxpYyRvbGRNb2R1bGVNb2RlPVRSVUU7cHJpdmF0ZSRyZXF1ZXN0O3ByaXZhdGUkcmVzcG9uc2U7cHJpdmF0ZSRwaGFzZTtwdWJsaWMkYXV0b0Nhbm9uaWNhbGl6ZT1UUlVFO3B1YmxpYyRhYnNvbHV0ZVVybHM9RkFMU0U7cHJpdmF0ZSRnbG9iYWxQYXJhbXM7cHJpdmF0ZSRnbG9iYWxTdGF0ZTtwcml2YXRlJGdsb2JhbFN0YXRlU2luY2VzO3ByaXZhdGUkYWN0aW9uO3ByaXZhdGUkdmlldztwcml2YXRlJGxheW91dDtwcml2YXRlJHBheWxvYWQ7cHJpdmF0ZSRzaWduYWxSZWNlaXZlcjtwcml2YXRlJHNpZ25hbDtwcml2YXRlJGFqYXhNb2RlO3ByaXZhdGUkc3RhcnR1cENoZWNrO3ByaXZhdGUkbGFzdENyZWF0ZWRSZXF1ZXN0O3ByaXZhdGUkbGFzdENyZWF0ZWRSZXF1ZXN0RmxhZztmaW5hbApmdW5jdGlvbgpnZXRSZXF1ZXN0KCl7cmV0dXJuJHRoaXMtPnJlcXVlc3Q7fWZpbmFsCmZ1bmN0aW9uCmdldFByZXNlbnRlcigkbmVlZD1UUlVFKXtyZXR1cm4kdGhpczt9ZmluYWwKZnVuY3Rpb24KZ2V0VW5pcXVlSWQoKXtyZXR1cm4nJzt9ZnVuY3Rpb24KcnVuKE5QcmVzZW50ZXJSZXF1ZXN0JHJlcXVlc3Qpe3RyeXskdGhpcy0+cGhhc2U9c2VsZjo6UEhBU0VfU1RBUlRVUDskdGhpcy0+cmVxdWVzdD0kcmVxdWVzdDskdGhpcy0+cGF5bG9hZD0ob2JqZWN0KU5VTEw7JHRoaXMtPnNldFBhcmVudCgkdGhpcy0+Z2V0UGFyZW50KCksJHJlcXVlc3QtPmdldFByZXNlbnRlck5hbWUoKSk7JHRoaXMtPmluaXRHbG9iYWxQYXJhbXMoKTskdGhpcy0+c3RhcnR1cCgpO2lmKCEkdGhpcy0+c3RhcnR1cENoZWNrKXskY2xhc3M9JHRoaXMtPnJlZmxlY3Rpb24tPmdldE1ldGhvZCgnc3RhcnR1cCcpLT5nZXREZWNsYXJpbmdDbGFzcygpLT5nZXROYW1lKCk7dHJpZ2dlcl9lcnJvcigiTWV0aG9kICRjbGFzczo6c3RhcnR1cCgpIG9yIGl0cyBkZXNjZW5kYW50IGRvZXNuJ3QgY2FsbCBwYXJlbnQ6OnN0YXJ0dXAoKS4iLEVfVVNFUl9XQVJOSU5HKTt9JHRoaXMtPnRyeUNhbGwoJHRoaXMtPmZvcm1hdEFjdGlvbk1ldGhvZCgkdGhpcy0+Z2V0QWN0aW9uKCkpLCR0aGlzLT5wYXJhbXMpO2lmKCR0aGlzLT5hdXRvQ2Fub25pY2FsaXplKXskdGhpcy0+Y2Fub25pY2FsaXplKCk7fWlmKCR0aGlzLT5nZXRIdHRwUmVxdWVzdCgpLT5pc01ldGhvZCgnaGVhZCcpKXskdGhpcy0+dGVybWluYXRlKCk7fWlmKG1ldGhvZF9leGlzdHMoJHRoaXMsJ2JlZm9yZVByZXBhcmUnKSl7JHRoaXMtPmJlZm9yZVByZXBhcmUoKTt0cmlnZ2VyX2Vycm9yKCdiZWZvcmVQcmVwYXJlKCkgaXMgZGVwcmVjYXRlZDsgdXNlIGNyZWF0ZUNvbXBvbmVudHtOYW1lfSgpIGluc3RlYWQuJyxFX1VTRVJfV0FSTklORyk7fWlmKCR0aGlzLT50cnlDYWxsKCdwcmVwYXJlJy4kdGhpcy0+Z2V0VmlldygpLCR0aGlzLT5wYXJhbXMpKXt0cmlnZ2VyX2Vycm9yKCdwcmVwYXJlJy51Y2ZpcnN0KCR0aGlzLT5nZXRWaWV3KCkpLicoKSBpcyBkZXByZWNhdGVkOyB1c2UgY3JlYXRlQ29tcG9uZW50e05hbWV9KCkgaW5zdGVhZC4nLEVfVVNFUl9XQVJOSU5HKTt9JHRoaXMtPnBoYXNlPXNlbGY6OlBIQVNFX1NJR05BTDskdGhpcy0+cHJvY2Vzc1NpZ25hbCgpOyR0aGlzLT5waGFzZT1zZWxmOjpQSEFTRV9SRU5ERVI7JHRoaXMtPmJlZm9yZVJlbmRlcigpOyR0aGlzLT50cnlDYWxsKCR0aGlzLT5mb3JtYXRSZW5kZXJNZXRob2QoJHRoaXMtPmdldFZpZXcoKSksJHRoaXMtPnBhcmFtcyk7JHRoaXMtPmFmdGVyUmVuZGVyKCk7JHRoaXMtPnNhdmVHbG9iYWxTdGF0ZSgpO2lmKCR0aGlzLT5pc0FqYXgoKSl7JHRoaXMtPnBheWxvYWQtPnN0YXRlPSR0aGlzLT5nZXRHbG9iYWxTdGF0ZSgpO30kdGhpcy0+c2VuZFRlbXBsYXRlKCk7fWNhdGNoKE5BYm9ydEV4Y2VwdGlvbiRlKXt9eyR0aGlzLT5waGFzZT1zZWxmOjpQSEFTRV9TSFVURE9XTjtpZigkdGhpcy0+aXNBamF4KCkpdHJ5eyRoYXNQYXlsb2FkPShhcnJheSkkdGhpcy0+cGF5bG9hZDt1bnNldCgkaGFzUGF5bG9hZFsnc3RhdGUnXSk7aWYoJHRoaXMtPnJlc3BvbnNlCmluc3RhbmNlb2YKTlJlbmRlclJlc3BvbnNlJiYoJHRoaXMtPmlzQ29udHJvbEludmFsaWQoKXx8JGhhc1BheWxvYWQpKXtOU25pcHBldEhlbHBlcjo6JG91dHB1dEFsbG93ZWQ9RkFMU0U7JHRoaXMtPnJlc3BvbnNlLT5zZW5kKCk7JHRoaXMtPnNlbmRQYXlsb2FkKCk7fWVsc2VpZighJHRoaXMtPnJlc3BvbnNlJiYkaGFzUGF5bG9hZCl7JHRoaXMtPnNlbmRQYXlsb2FkKCk7fX1jYXRjaChOQWJvcnRFeGNlcHRpb24kZSl7fWlmKCR0aGlzLT5oYXNGbGFzaFNlc3Npb24oKSl7JHRoaXMtPmdldEZsYXNoU2Vzc2lvbigpLT5zZXRFeHBpcmF0aW9uKCR0aGlzLT5yZXNwb25zZQppbnN0YW5jZW9mCk5SZWRpcmVjdGluZ1Jlc3BvbnNlPycrIDMwIHNlY29uZHMnOicrIDMgc2Vjb25kcycpO30kdGhpcy0+b25TaHV0ZG93bigkdGhpcywkdGhpcy0+cmVzcG9uc2UpOyR0aGlzLT5zaHV0ZG93bigkdGhpcy0+cmVzcG9uc2UpO3JldHVybiR0aGlzLT5yZXNwb25zZTt9fWZpbmFsCmZ1bmN0aW9uCmdldFBoYXNlKCl7dGhyb3cKbmV3CkRlcHJlY2F0ZWRFeGNlcHRpb24oX19NRVRIT0RfXy4nKCkgaXMgZGVwcmVjYXRlZC4nKTtyZXR1cm4kdGhpcy0+cGhhc2U7fXByb3RlY3RlZApmdW5jdGlvbgpzdGFydHVwKCl7JHRoaXMtPnN0YXJ0dXBDaGVjaz1UUlVFO31wcm90ZWN0ZWQKZnVuY3Rpb24KYmVmb3JlUmVuZGVyKCl7fXByb3RlY3RlZApmdW5jdGlvbgphZnRlclJlbmRlcigpe31wcm90ZWN0ZWQKZnVuY3Rpb24Kc2h1dGRvd24oJHJlc3BvbnNlKXt9ZnVuY3Rpb24KcHJvY2Vzc1NpZ25hbCgpe2lmKCR0aGlzLT5zaWduYWw9PT1OVUxMKXJldHVybjskY29tcG9uZW50PSR0aGlzLT5zaWduYWxSZWNlaXZlcj09PScnPyR0aGlzOiR0aGlzLT5nZXRDb21wb25lbnQoJHRoaXMtPnNpZ25hbFJlY2VpdmVyLEZBTFNFKTtpZigkY29tcG9uZW50PT09TlVMTCl7dGhyb3cKbmV3Ck5CYWRTaWduYWxFeGNlcHRpb24oIlRoZSBzaWduYWwgcmVjZWl2ZXIgY29tcG9uZW50ICckdGhpcy0+c2lnbmFsUmVjZWl2ZXInIGlzIG5vdCBmb3VuZC4iKTt9ZWxzZWlmKCEkY29tcG9uZW50Cmluc3RhbmNlb2YKSVNpZ25hbFJlY2VpdmVyKXt0aHJvdwpuZXcKTkJhZFNpZ25hbEV4Y2VwdGlvbigiVGhlIHNpZ25hbCByZWNlaXZlciBjb21wb25lbnQgJyR0aGlzLT5zaWduYWxSZWNlaXZlcicgaXMgbm90IElTaWduYWxSZWNlaXZlciBpbXBsZW1lbnRvci4iKTt9aWYoJHRoaXMtPm9sZExheW91dE1vZGUmJiRjb21wb25lbnQKaW5zdGFuY2VvZgpJUmVuZGVyYWJsZSl7JGNvbXBvbmVudC0+aW52YWxpZGF0ZUNvbnRyb2woKTt9JGNvbXBvbmVudC0+c2lnbmFsUmVjZWl2ZWQoJHRoaXMtPnNpZ25hbCk7JHRoaXMtPnNpZ25hbD1OVUxMO31maW5hbApmdW5jdGlvbgpnZXRTaWduYWwoKXtyZXR1cm4kdGhpcy0+c2lnbmFsPT09TlVMTD9OVUxMOmFycmF5KCR0aGlzLT5zaWduYWxSZWNlaXZlciwkdGhpcy0+c2lnbmFsKTt9ZmluYWwKZnVuY3Rpb24KaXNTaWduYWxSZWNlaXZlcigkY29tcG9uZW50LCRzaWduYWw9TlVMTCl7aWYoJGNvbXBvbmVudAppbnN0YW5jZW9mCk5Db21wb25lbnQpeyRjb21wb25lbnQ9JGNvbXBvbmVudD09PSR0aGlzPycnOiRjb21wb25lbnQtPmxvb2t1cFBhdGgoX19DTEFTU19fLFRSVUUpO31pZigkdGhpcy0+c2lnbmFsPT09TlVMTCl7cmV0dXJuCkZBTFNFO31lbHNlaWYoJHNpZ25hbD09PVRSVUUpe3JldHVybiRjb21wb25lbnQ9PT0nJ3x8c3RybmNtcCgkdGhpcy0+c2lnbmFsUmVjZWl2ZXIuJy0nLCRjb21wb25lbnQuJy0nLHN0cmxlbigkY29tcG9uZW50KSsxKT09PTA7fWVsc2VpZigkc2lnbmFsPT09TlVMTCl7cmV0dXJuJHRoaXMtPnNpZ25hbFJlY2VpdmVyPT09JGNvbXBvbmVudDt9ZWxzZXtyZXR1cm4kdGhpcy0+c2lnbmFsUmVjZWl2ZXI9PT0kY29tcG9uZW50JiZzdHJjYXNlY21wKCRzaWduYWwsJHRoaXMtPnNpZ25hbCk9PT0wO319ZmluYWwKZnVuY3Rpb24KZ2V0QWN0aW9uKCRmdWxseVF1YWxpZmllZD1GQUxTRSl7cmV0dXJuJGZ1bGx5UXVhbGlmaWVkPyc6Jy4kdGhpcy0+Z2V0TmFtZSgpLic6Jy4kdGhpcy0+YWN0aW9uOiR0aGlzLT5hY3Rpb247fWZ1bmN0aW9uCmNoYW5nZUFjdGlvbigkYWN0aW9uKXtpZihwcmVnX21hdGNoKCIjXlthLXpBLVowLTldW2EtekEtWjAtOV9ceDdmLVx4ZmZdKiQjIiwkYWN0aW9uKSl7JHRoaXMtPmFjdGlvbj0kYWN0aW9uOyR0aGlzLT52aWV3PSRhY3Rpb247fWVsc2V7dGhyb3cKbmV3Ck5CYWRSZXF1ZXN0RXhjZXB0aW9uKCJBY3Rpb24gbmFtZSAnJGFjdGlvbicgaXMgbm90IGFscGhhbnVtZXJpYyBzdHJpbmcuIik7fX1maW5hbApmdW5jdGlvbgpnZXRWaWV3KCl7cmV0dXJuJHRoaXMtPnZpZXc7fWZ1bmN0aW9uCnNldFZpZXcoJHZpZXcpeyR0aGlzLT52aWV3PShzdHJpbmcpJHZpZXc7cmV0dXJuJHRoaXM7fWZpbmFsCmZ1bmN0aW9uCmdldExheW91dCgpe3JldHVybiR0aGlzLT5sYXlvdXQ7fWZ1bmN0aW9uCnNldExheW91dCgkbGF5b3V0KXskdGhpcy0+bGF5b3V0PSRsYXlvdXQ9PT1GQUxTRT9GQUxTRTooc3RyaW5nKSRsYXlvdXQ7cmV0dXJuJHRoaXM7fWZ1bmN0aW9uCnNlbmRUZW1wbGF0ZSgpeyR0ZW1wbGF0ZT0kdGhpcy0+Z2V0VGVtcGxhdGUoKTtpZighJHRlbXBsYXRlKXJldHVybjtpZigkdGVtcGxhdGUKaW5zdGFuY2VvZgpJRmlsZVRlbXBsYXRlJiYhJHRlbXBsYXRlLT5nZXRGaWxlKCkpeyRmaWxlcz0kdGhpcy0+Zm9ybWF0VGVtcGxhdGVGaWxlcygkdGhpcy0+Z2V0TmFtZSgpLCR0aGlzLT52aWV3KTtmb3JlYWNoKCRmaWxlcwphcyRmaWxlKXtpZihpc19maWxlKCRmaWxlKSl7JHRlbXBsYXRlLT5zZXRGaWxlKCRmaWxlKTticmVhazt9fWlmKCEkdGVtcGxhdGUtPmdldEZpbGUoKSl7JGZpbGU9c3RyX3JlcGxhY2UoTkVudmlyb25tZW50OjpnZXRWYXJpYWJsZSgnYXBwRGlyJyksIlx4RTJceDgwXHhBNiIscmVzZXQoJGZpbGVzKSk7dGhyb3cKbmV3Ck5CYWRSZXF1ZXN0RXhjZXB0aW9uKCJQYWdlIG5vdCBmb3VuZC4gTWlzc2luZyB0ZW1wbGF0ZSAnJGZpbGUnLiIpO31pZigkdGhpcy0+bGF5b3V0IT09RkFMU0UpeyRmaWxlcz0kdGhpcy0+Zm9ybWF0TGF5b3V0VGVtcGxhdGVGaWxlcygkdGhpcy0+Z2V0TmFtZSgpLCR0aGlzLT5sYXlvdXQ/JHRoaXMtPmxheW91dDonbGF5b3V0Jyk7Zm9yZWFjaCgkZmlsZXMKYXMkZmlsZSl7aWYoaXNfZmlsZSgkZmlsZSkpeyR0ZW1wbGF0ZS0+bGF5b3V0PSRmaWxlO2lmKCR0aGlzLT5vbGRMYXlvdXRNb2RlKXskdGVtcGxhdGUtPmNvbnRlbnQ9Y2xvbmUkdGVtcGxhdGU7JHRlbXBsYXRlLT5zZXRGaWxlKCRmaWxlKTt9ZWxzZXskdGVtcGxhdGUtPl9leHRlbmRzPSRmaWxlO31icmVhazt9fWlmKGVtcHR5KCR0ZW1wbGF0ZS0+bGF5b3V0KSYmJHRoaXMtPmxheW91dCE9PU5VTEwpeyRmaWxlPXN0cl9yZXBsYWNlKE5FbnZpcm9ubWVudDo6Z2V0VmFyaWFibGUoJ2FwcERpcicpLCJceEUyXHg4MFx4QTYiLHJlc2V0KCRmaWxlcykpO3Rocm93Cm5ldwpGaWxlTm90Rm91bmRFeGNlcHRpb24oIkxheW91dCBub3QgZm91bmQuIE1pc3NpbmcgdGVtcGxhdGUgJyRmaWxlJy4iKTt9fX0kdGhpcy0+dGVybWluYXRlKG5ldwpOUmVuZGVyUmVzcG9uc2UoJHRlbXBsYXRlKSk7fWZ1bmN0aW9uCmZvcm1hdExheW91dFRlbXBsYXRlRmlsZXMoJHByZXNlbnRlciwkbGF5b3V0KXtpZigkdGhpcy0+b2xkTW9kdWxlTW9kZSl7JHJvb3Q9TkVudmlyb25tZW50OjpnZXRWYXJpYWJsZSgndGVtcGxhdGVzRGlyJyxORW52aXJvbm1lbnQ6OmdldFZhcmlhYmxlKCdhcHBEaXInKS4nL3RlbXBsYXRlcycpOyRwcmVzZW50ZXI9c3RyX3JlcGxhY2UoJzonLCdNb2R1bGUvJywkcHJlc2VudGVyKTskbW9kdWxlPXN1YnN0cigkcHJlc2VudGVyLDAsKGludClzdHJycG9zKCRwcmVzZW50ZXIsJy8nKSk7JGJhc2U9Jyc7aWYoJHJvb3Q9PT1ORW52aXJvbm1lbnQ6OmdldFZhcmlhYmxlKCdhcHBEaXInKS4nL3ByZXNlbnRlcnMnKXskYmFzZT0ndGVtcGxhdGVzLyc7aWYoJG1vZHVsZT09PScnKXskcHJlc2VudGVyPSd0ZW1wbGF0ZXMvJy4kcHJlc2VudGVyO31lbHNleyRwcmVzZW50ZXI9c3Vic3RyX3JlcGxhY2UoJHByZXNlbnRlciwnL3RlbXBsYXRlcycsc3RycnBvcygkcHJlc2VudGVyLCcvJyksMCk7fX1yZXR1cm4KYXJyYXkoIiRyb290LyRwcmVzZW50ZXIvQCRsYXlvdXQucGh0bWwiLCIkcm9vdC8kcHJlc2VudGVyLkAkbGF5b3V0LnBodG1sIiwiJHJvb3QvJG1vZHVsZS8kYmFzZUAkbGF5b3V0LnBodG1sIiwiJHJvb3QvJGJhc2VAJGxheW91dC5waHRtbCIpO30kYXBwRGlyPU5FbnZpcm9ubWVudDo6Z2V0VmFyaWFibGUoJ2FwcERpcicpOyRwYXRoPScvJy5zdHJfcmVwbGFjZSgnOicsJ01vZHVsZS8nLCRwcmVzZW50ZXIpOyRwYXRoUD1zdWJzdHJfcmVwbGFjZSgkcGF0aCwnL3RlbXBsYXRlcycsc3RycnBvcygkcGF0aCwnLycpLDApOyRsaXN0PWFycmF5KCIkYXBwRGlyJHBhdGhQL0AkbGF5b3V0LnBodG1sIiwiJGFwcERpciRwYXRoUC5AJGxheW91dC5waHRtbCIpO3doaWxlKCgkcGF0aD1zdWJzdHIoJHBhdGgsMCxzdHJycG9zKCRwYXRoLCcvJykpKSE9PUZBTFNFKXskbGlzdFtdPSIkYXBwRGlyJHBhdGgvdGVtcGxhdGVzL0AkbGF5b3V0LnBodG1sIjt9cmV0dXJuJGxpc3Q7fWZ1bmN0aW9uCmZvcm1hdFRlbXBsYXRlRmlsZXMoJHByZXNlbnRlciwkdmlldyl7aWYoJHRoaXMtPm9sZE1vZHVsZU1vZGUpeyRyb290PU5FbnZpcm9ubWVudDo6Z2V0VmFyaWFibGUoJ3RlbXBsYXRlc0RpcicsTkVudmlyb25tZW50OjpnZXRWYXJpYWJsZSgnYXBwRGlyJykuJy90ZW1wbGF0ZXMnKTskcHJlc2VudGVyPXN0cl9yZXBsYWNlKCc6JywnTW9kdWxlLycsJHByZXNlbnRlcik7JGRpcj0nJztpZigkcm9vdD09PU5FbnZpcm9ubWVudDo6Z2V0VmFyaWFibGUoJ2FwcERpcicpLicvcHJlc2VudGVycycpeyRwb3M9c3RycnBvcygkcHJlc2VudGVyLCcvJyk7JHByZXNlbnRlcj0kcG9zPT09RkFMU0U/J3RlbXBsYXRlcy8nLiRwcmVzZW50ZXI6c3Vic3RyX3JlcGxhY2UoJHByZXNlbnRlciwnL3RlbXBsYXRlcycsJHBvcywwKTskZGlyPSd0ZW1wbGF0ZXMvJzt9cmV0dXJuCmFycmF5KCIkcm9vdC8kcHJlc2VudGVyLyR2aWV3LnBodG1sIiwiJHJvb3QvJHByZXNlbnRlci4kdmlldy5waHRtbCIsIiRyb290LyRkaXJAZ2xvYmFsLiR2aWV3LnBodG1sIik7fSRhcHBEaXI9TkVudmlyb25tZW50OjpnZXRWYXJpYWJsZSgnYXBwRGlyJyk7JHBhdGg9Jy8nLnN0cl9yZXBsYWNlKCc6JywnTW9kdWxlLycsJHByZXNlbnRlcik7JHBhdGhQPXN1YnN0cl9yZXBsYWNlKCRwYXRoLCcvdGVtcGxhdGVzJyxzdHJycG9zKCRwYXRoLCcvJyksMCk7JHBhdGg9c3Vic3RyX3JlcGxhY2UoJHBhdGgsJy90ZW1wbGF0ZXMnLHN0cnJwb3MoJHBhdGgsJy8nKSk7cmV0dXJuCmFycmF5KCIkYXBwRGlyJHBhdGhQLyR2aWV3LnBodG1sIiwiJGFwcERpciRwYXRoUC4kdmlldy5waHRtbCIsIiRhcHBEaXIkcGF0aC9AZ2xvYmFsLiR2aWV3LnBodG1sIik7fXByb3RlY3RlZApzdGF0aWMKZnVuY3Rpb24KZm9ybWF0QWN0aW9uTWV0aG9kKCRhY3Rpb24pe3JldHVybidhY3Rpb24nLiRhY3Rpb247fXByb3RlY3RlZApzdGF0aWMKZnVuY3Rpb24KZm9ybWF0UmVuZGVyTWV0aG9kKCR2aWV3KXtyZXR1cm4ncmVuZGVyJy4kdmlldzt9cHJvdGVjdGVkCmZ1bmN0aW9uCnJlbmRlclRlbXBsYXRlKCl7dGhyb3cKbmV3CkRlcHJlY2F0ZWRFeGNlcHRpb24oX19NRVRIT0RfXy4nKCkgaXMgZGVwcmVjYXRlZDsgdXNlICRwcmVzZW50ZXItPnNlbmRUZW1wbGF0ZSgpIGluc3RlYWQuJyk7fWZpbmFsCmZ1bmN0aW9uCmdldFBheWxvYWQoKXtyZXR1cm4kdGhpcy0+cGF5bG9hZDt9ZnVuY3Rpb24KaXNBamF4KCl7aWYoJHRoaXMtPmFqYXhNb2RlPT09TlVMTCl7JHRoaXMtPmFqYXhNb2RlPSR0aGlzLT5nZXRIdHRwUmVxdWVzdCgpLT5pc0FqYXgoKTt9cmV0dXJuJHRoaXMtPmFqYXhNb2RlO31mdW5jdGlvbgpzZW5kUGF5bG9hZCgpeyR0aGlzLT50ZXJtaW5hdGUobmV3Ck5Kc29uUmVzcG9uc2UoJHRoaXMtPnBheWxvYWQpKTt9ZnVuY3Rpb24KZ2V0QWpheERyaXZlcigpe3Rocm93Cm5ldwpEZXByZWNhdGVkRXhjZXB0aW9uKF9fTUVUSE9EX18uJygpIGlzIGRlcHJlY2F0ZWQ7IHVzZSAkcHJlc2VudGVyLT5wYXlsb2FkIGluc3RlYWQuJyk7fWZ1bmN0aW9uCmZvcndhcmQoJGRlc3RpbmF0aW9uLCRhcmdzPWFycmF5KCkpe2lmKCRkZXN0aW5hdGlvbgppbnN0YW5jZW9mCk5QcmVzZW50ZXJSZXF1ZXN0KXskdGhpcy0+dGVybWluYXRlKG5ldwpORm9yd2FyZGluZ1Jlc3BvbnNlKCRkZXN0aW5hdGlvbikpO31lbHNlaWYoIWlzX2FycmF5KCRhcmdzKSl7JGFyZ3M9ZnVuY19nZXRfYXJncygpO2FycmF5X3NoaWZ0KCRhcmdzKTt9JHRoaXMtPmNyZWF0ZVJlcXVlc3QoJHRoaXMsJGRlc3RpbmF0aW9uLCRhcmdzLCdmb3J3YXJkJyk7JHRoaXMtPnRlcm1pbmF0ZShuZXcKTkZvcndhcmRpbmdSZXNwb25zZSgkdGhpcy0+bGFzdENyZWF0ZWRSZXF1ZXN0KSk7fWZ1bmN0aW9uCnJlZGlyZWN0VXJpKCR1cmksJGNvZGU9TlVMTCl7aWYoJHRoaXMtPmlzQWpheCgpKXskdGhpcy0+cGF5bG9hZC0+cmVkaXJlY3Q9KHN0cmluZykkdXJpOyR0aGlzLT5zZW5kUGF5bG9hZCgpO31lbHNlaWYoISRjb2RlKXskY29kZT0kdGhpcy0+Z2V0SHR0cFJlcXVlc3QoKS0+aXNNZXRob2QoJ3Bvc3QnKT9JSHR0cFJlc3BvbnNlOjpTMzAzX1BPU1RfR0VUOklIdHRwUmVzcG9uc2U6OlMzMDJfRk9VTkQ7fSR0aGlzLT50ZXJtaW5hdGUobmV3Ck5SZWRpcmVjdGluZ1Jlc3BvbnNlKCR1cmksJGNvZGUpKTt9ZnVuY3Rpb24KYmFja2xpbmsoKXtyZXR1cm4kdGhpcy0+Z2V0QWN0aW9uKFRSVUUpO31mdW5jdGlvbgpnZXRMYXN0Q3JlYXRlZFJlcXVlc3QoKXtyZXR1cm4kdGhpcy0+bGFzdENyZWF0ZWRSZXF1ZXN0O31mdW5jdGlvbgpnZXRMYXN0Q3JlYXRlZFJlcXVlc3RGbGFnKCRmbGFnKXtyZXR1cm4hZW1wdHkoJHRoaXMtPmxhc3RDcmVhdGVkUmVxdWVzdEZsYWdbJGZsYWddKTt9ZnVuY3Rpb24KdGVybWluYXRlKElQcmVzZW50ZXJSZXNwb25zZSRyZXNwb25zZT1OVUxMKXskdGhpcy0+cmVzcG9uc2U9JHJlc3BvbnNlO3Rocm93Cm5ldwpOQWJvcnRFeGNlcHRpb24oKTt9ZnVuY3Rpb24KY2Fub25pY2FsaXplKCl7aWYoISR0aGlzLT5pc0FqYXgoKSYmKCR0aGlzLT5yZXF1ZXN0LT5pc01ldGhvZCgnZ2V0Jyl8fCR0aGlzLT5yZXF1ZXN0LT5pc01ldGhvZCgnaGVhZCcpKSl7JHVyaT0kdGhpcy0+Y3JlYXRlUmVxdWVzdCgkdGhpcywkdGhpcy0+YWN0aW9uLCR0aGlzLT5nZXRHbG9iYWxTdGF0ZSgpKyR0aGlzLT5yZXF1ZXN0LT5wYXJhbXMsJ3JlZGlyZWN0WCcpO2lmKCR1cmkhPT1OVUxMJiYhJHRoaXMtPmdldEh0dHBSZXF1ZXN0KCktPmdldFVyaSgpLT5pc0VxdWFsKCR1cmkpKXskdGhpcy0+dGVybWluYXRlKG5ldwpOUmVkaXJlY3RpbmdSZXNwb25zZSgkdXJpLElIdHRwUmVzcG9uc2U6OlMzMDFfTU9WRURfUEVSTUFORU5UTFkpKTt9fX1mdW5jdGlvbgpsYXN0TW9kaWZpZWQoJGxhc3RNb2RpZmllZCwkZXRhZz1OVUxMLCRleHBpcmU9TlVMTCl7aWYoIU5FbnZpcm9ubWVudDo6aXNQcm9kdWN0aW9uKCkpe3JldHVybjt9aWYoJGV4cGlyZSE9PU5VTEwpeyR0aGlzLT5nZXRIdHRwUmVzcG9uc2UoKS0+c2V0RXhwaXJhdGlvbigkZXhwaXJlKTt9aWYoISR0aGlzLT5nZXRIdHRwQ29udGV4dCgpLT5pc01vZGlmaWVkKCRsYXN0TW9kaWZpZWQsJGV0YWcpKXskdGhpcy0+dGVybWluYXRlKCk7fX1maW5hbApwcm90ZWN0ZWQKZnVuY3Rpb24KY3JlYXRlUmVxdWVzdCgkY29tcG9uZW50LCRkZXN0aW5hdGlvbixhcnJheSRhcmdzLCRtb2RlKXtzdGF0aWMkcHJlc2VudGVyTG9hZGVyLCRyb3V0ZXIsJGh0dHBSZXF1ZXN0O2lmKCRwcmVzZW50ZXJMb2FkZXI9PT1OVUxMKXskcHJlc2VudGVyTG9hZGVyPSR0aGlzLT5nZXRBcHBsaWNhdGlvbigpLT5nZXRQcmVzZW50ZXJMb2FkZXIoKTskcm91dGVyPSR0aGlzLT5nZXRBcHBsaWNhdGlvbigpLT5nZXRSb3V0ZXIoKTskaHR0cFJlcXVlc3Q9JHRoaXMtPmdldEh0dHBSZXF1ZXN0KCk7fSR0aGlzLT5sYXN0Q3JlYXRlZFJlcXVlc3Q9JHRoaXMtPmxhc3RDcmVhdGVkUmVxdWVzdEZsYWc9TlVMTDskYT1zdHJwb3MoJGRlc3RpbmF0aW9uLCcjJyk7aWYoJGE9PT1GQUxTRSl7JGZyYWdtZW50PScnO31lbHNleyRmcmFnbWVudD1zdWJzdHIoJGRlc3RpbmF0aW9uLCRhKTskZGVzdGluYXRpb249c3Vic3RyKCRkZXN0aW5hdGlvbiwwLCRhKTt9JGE9c3RycG9zKCRkZXN0aW5hdGlvbiwnPycpO2lmKCRhIT09RkFMU0Upe3BhcnNlX3N0cihzdWJzdHIoJGRlc3RpbmF0aW9uLCRhKzEpLCRhcmdzKTskZGVzdGluYXRpb249c3Vic3RyKCRkZXN0aW5hdGlvbiwwLCRhKTt9JGE9c3RycG9zKCRkZXN0aW5hdGlvbiwnLy8nKTtpZigkYT09PUZBTFNFKXskc2NoZW1lPUZBTFNFO31lbHNleyRzY2hlbWU9c3Vic3RyKCRkZXN0aW5hdGlvbiwwLCRhKTskZGVzdGluYXRpb249c3Vic3RyKCRkZXN0aW5hdGlvbiwkYSsyKTt9aWYoISgkY29tcG9uZW50Cmluc3RhbmNlb2YKTlByZXNlbnRlcil8fHN1YnN0cigkZGVzdGluYXRpb24sLTEpPT09JyEnKXskc2lnbmFsPXJ0cmltKCRkZXN0aW5hdGlvbiwnIScpOyRhPXN0cnJwb3MoJHNpZ25hbCwnOicpO2lmKCRhIT09RkFMU0UpeyRjb21wb25lbnQ9JGNvbXBvbmVudC0+Z2V0Q29tcG9uZW50KHN0cnRyKHN1YnN0cigkc2lnbmFsLDAsJGEpLCc6JywnLScpKTskc2lnbmFsPShzdHJpbmcpc3Vic3RyKCRzaWduYWwsJGErMSk7fWlmKCRzaWduYWw9PU5VTEwpe3Rocm93Cm5ldwpOSW52YWxpZExpbmtFeGNlcHRpb24oIlNpZ25hbCBtdXN0IGJlIG5vbi1lbXB0eSBzdHJpbmcuIik7fSRkZXN0aW5hdGlvbj0ndGhpcyc7fWlmKCRkZXN0aW5hdGlvbj09TlVMTCl7dGhyb3cKbmV3Ck5JbnZhbGlkTGlua0V4Y2VwdGlvbigiRGVzdGluYXRpb24gbXVzdCBiZSBub24tZW1wdHkgc3RyaW5nLiIpO30kY3VycmVudD1GQUxTRTskYT1zdHJycG9zKCRkZXN0aW5hdGlvbiwnOicpO2lmKCRhPT09RkFMU0UpeyRhY3Rpb249JGRlc3RpbmF0aW9uPT09J3RoaXMnPyR0aGlzLT5hY3Rpb246JGRlc3RpbmF0aW9uOyRwcmVzZW50ZXI9JHRoaXMtPmdldE5hbWUoKTskcHJlc2VudGVyQ2xhc3M9Z2V0X2NsYXNzKCR0aGlzKTt9ZWxzZXskYWN0aW9uPShzdHJpbmcpc3Vic3RyKCRkZXN0aW5hdGlvbiwkYSsxKTtpZigkZGVzdGluYXRpb25bMF09PT0nOicpe2lmKCRhPDIpe3Rocm93Cm5ldwpOSW52YWxpZExpbmtFeGNlcHRpb24oIk1pc3NpbmcgcHJlc2VudGVyIG5hbWUgaW4gJyRkZXN0aW5hdGlvbicuIik7fSRwcmVzZW50ZXI9c3Vic3RyKCRkZXN0aW5hdGlvbiwxLCRhLTEpO31lbHNleyRwcmVzZW50ZXI9JHRoaXMtPmdldE5hbWUoKTskYj1zdHJycG9zKCRwcmVzZW50ZXIsJzonKTtpZigkYj09PUZBTFNFKXskcHJlc2VudGVyPXN1YnN0cigkZGVzdGluYXRpb24sMCwkYSk7fWVsc2V7JHByZXNlbnRlcj1zdWJzdHIoJHByZXNlbnRlciwwLCRiKzEpLnN1YnN0cigkZGVzdGluYXRpb24sMCwkYSk7fX0kcHJlc2VudGVyQ2xhc3M9JHByZXNlbnRlckxvYWRlci0+Z2V0UHJlc2VudGVyQ2xhc3MoJHByZXNlbnRlcik7fWlmKGlzc2V0KCRzaWduYWwpKXskcmVmbGVjdGlvbj1uZXcKTlByZXNlbnRlckNvbXBvbmVudFJlZmxlY3Rpb24oZ2V0X2NsYXNzKCRjb21wb25lbnQpKTtpZigkc2lnbmFsPT09J3RoaXMnKXskc2lnbmFsPScnO2lmKGFycmF5X2tleV9leGlzdHMoMCwkYXJncykpe3Rocm93Cm5ldwpOSW52YWxpZExpbmtFeGNlcHRpb24oIkV4dHJhIHBhcmFtZXRlciBmb3Igc2lnbmFsICd7JHJlZmxlY3Rpb24tPm5hbWV9OiRzaWduYWwhJy4iKTt9fWVsc2VpZihzdHJwb3MoJHNpZ25hbCxzZWxmOjpOQU1FX1NFUEFSQVRPUik9PT1GQUxTRSl7JG1ldGhvZD0kY29tcG9uZW50LT5mb3JtYXRTaWduYWxNZXRob2QoJHNpZ25hbCk7aWYoISRyZWZsZWN0aW9uLT5oYXNDYWxsYWJsZU1ldGhvZCgkbWV0aG9kKSl7dGhyb3cKbmV3Ck5JbnZhbGlkTGlua0V4Y2VwdGlvbigiVW5rbm93biBzaWduYWwgJ3skcmVmbGVjdGlvbi0+bmFtZX06JHNpZ25hbCEnLiIpO31pZigkYXJncyl7c2VsZjo6YXJnc1RvUGFyYW1zKGdldF9jbGFzcygkY29tcG9uZW50KSwkbWV0aG9kLCRhcmdzKTt9fWlmKCRhcmdzJiZhcnJheV9pbnRlcnNlY3Rfa2V5KCRhcmdzLCRyZWZsZWN0aW9uLT5nZXRQZXJzaXN0ZW50UGFyYW1zKCkpKXskY29tcG9uZW50LT5zYXZlU3RhdGUoJGFyZ3MpO31pZigkYXJncyYmJGNvbXBvbmVudCE9PSR0aGlzKXskcHJlZml4PSRjb21wb25lbnQtPmdldFVuaXF1ZUlkKCkuc2VsZjo6TkFNRV9TRVBBUkFUT1I7Zm9yZWFjaCgkYXJncwphcyRrZXk9PiR2YWwpe3Vuc2V0KCRhcmdzWyRrZXldKTskYXJnc1skcHJlZml4LiRrZXldPSR2YWw7fX19aWYoaXNfc3ViY2xhc3Nfb2YoJHByZXNlbnRlckNsYXNzLF9fQ0xBU1NfXykpe2lmKCRhY3Rpb249PT0nJyl7JGFjdGlvbj1zZWxmOjokZGVmYXVsdEFjdGlvbjt9JGN1cnJlbnQ9KCRhY3Rpb249PT0nKid8fCRhY3Rpb249PT0kdGhpcy0+YWN0aW9uKSYmJHByZXNlbnRlckNsYXNzPT09Z2V0X2NsYXNzKCR0aGlzKTskcmVmbGVjdGlvbj1uZXcKTlByZXNlbnRlckNvbXBvbmVudFJlZmxlY3Rpb24oJHByZXNlbnRlckNsYXNzKTtpZigkYXJnc3x8JGRlc3RpbmF0aW9uPT09J3RoaXMnKXskbWV0aG9kPWNhbGxfdXNlcl9mdW5jKGFycmF5KCRwcmVzZW50ZXJDbGFzcywnZm9ybWF0QWN0aW9uTWV0aG9kJyksJGFjdGlvbik7aWYoISRyZWZsZWN0aW9uLT5oYXNDYWxsYWJsZU1ldGhvZCgkbWV0aG9kKSl7JG1ldGhvZD1jYWxsX3VzZXJfZnVuYyhhcnJheSgkcHJlc2VudGVyQ2xhc3MsJ2Zvcm1hdFJlbmRlck1ldGhvZCcpLCRhY3Rpb24pO2lmKCEkcmVmbGVjdGlvbi0+aGFzQ2FsbGFibGVNZXRob2QoJG1ldGhvZCkpeyRtZXRob2Q9TlVMTDt9fWlmKCRtZXRob2Q9PT1OVUxMKXtpZihhcnJheV9rZXlfZXhpc3RzKDAsJGFyZ3MpKXt0aHJvdwpuZXcKTkludmFsaWRMaW5rRXhjZXB0aW9uKCJFeHRyYSBwYXJhbWV0ZXIgZm9yICckcHJlc2VudGVyOiRhY3Rpb24nLiIpO319ZWxzZWlmKCRkZXN0aW5hdGlvbj09PSd0aGlzJyl7c2VsZjo6YXJnc1RvUGFyYW1zKCRwcmVzZW50ZXJDbGFzcywkbWV0aG9kLCRhcmdzLCR0aGlzLT5wYXJhbXMpO31lbHNle3NlbGY6OmFyZ3NUb1BhcmFtcygkcHJlc2VudGVyQ2xhc3MsJG1ldGhvZCwkYXJncyk7fX1pZigkYXJncyYmYXJyYXlfaW50ZXJzZWN0X2tleSgkYXJncywkcmVmbGVjdGlvbi0+Z2V0UGVyc2lzdGVudFBhcmFtcygpKSl7JHRoaXMtPnNhdmVTdGF0ZSgkYXJncywkcmVmbGVjdGlvbik7fSRnbG9iYWxTdGF0ZT0kdGhpcy0+Z2V0R2xvYmFsU3RhdGUoJGRlc3RpbmF0aW9uPT09J3RoaXMnP05VTEw6JHByZXNlbnRlckNsYXNzKTtpZigkY3VycmVudCYmJGFyZ3MpeyR0bXA9JGdsb2JhbFN0YXRlKyR0aGlzLT5wYXJhbXM7Zm9yZWFjaCgkYXJncwphcyRrZXk9PiR2YWwpe2lmKChzdHJpbmcpJHZhbCE9PShpc3NldCgkdG1wWyRrZXldKT8oc3RyaW5nKSR0bXBbJGtleV06JycpKXskY3VycmVudD1GQUxTRTticmVhazt9fX0kYXJncys9JGdsb2JhbFN0YXRlO30kYXJnc1tzZWxmOjpBQ1RJT05fS0VZXT0kYWN0aW9uO2lmKCFlbXB0eSgkc2lnbmFsKSl7JGFyZ3Nbc2VsZjo6U0lHTkFMX0tFWV09JGNvbXBvbmVudC0+Z2V0UGFyYW1JZCgkc2lnbmFsKTskY3VycmVudD0kY3VycmVudCYmJGFyZ3Nbc2VsZjo6U0lHTkFMX0tFWV09PT0kdGhpcy0+Z2V0UGFyYW0oc2VsZjo6U0lHTkFMX0tFWSk7fWlmKCgkbW9kZT09PSdyZWRpcmVjdCd8fCRtb2RlPT09J2ZvcndhcmQnKSYmJHRoaXMtPmhhc0ZsYXNoU2Vzc2lvbigpKXskYXJnc1tzZWxmOjpGTEFTSF9LRVldPSR0aGlzLT5nZXRQYXJhbShzZWxmOjpGTEFTSF9LRVkpO30kdGhpcy0+bGFzdENyZWF0ZWRSZXF1ZXN0PW5ldwpOUHJlc2VudGVyUmVxdWVzdCgkcHJlc2VudGVyLE5QcmVzZW50ZXJSZXF1ZXN0OjpGT1JXQVJELCRhcmdzLGFycmF5KCksYXJyYXkoKSk7JHRoaXMtPmxhc3RDcmVhdGVkUmVxdWVzdEZsYWc9YXJyYXkoJ2N1cnJlbnQnPT4kY3VycmVudCk7aWYoJG1vZGU9PT0nZm9yd2FyZCcpcmV0dXJuOyR1cmk9JHJvdXRlci0+Y29uc3RydWN0VXJsKCR0aGlzLT5sYXN0Q3JlYXRlZFJlcXVlc3QsJGh0dHBSZXF1ZXN0KTtpZigkdXJpPT09TlVMTCl7dW5zZXQoJGFyZ3Nbc2VsZjo6QUNUSU9OX0tFWV0pOyRwYXJhbXM9dXJsZGVjb2RlKGh0dHBfYnVpbGRfcXVlcnkoJGFyZ3MsTlVMTCwnLCAnKSk7dGhyb3cKbmV3Ck5JbnZhbGlkTGlua0V4Y2VwdGlvbigiTm8gcm91dGUgZm9yICRwcmVzZW50ZXI6JGFjdGlvbigkcGFyYW1zKSIpO31pZigkbW9kZT09PSdsaW5rJyYmJHNjaGVtZT09PUZBTFNFJiYhJHRoaXMtPmFic29sdXRlVXJscyl7JGhvc3RVcmk9JGh0dHBSZXF1ZXN0LT5nZXRVcmkoKS0+Z2V0SG9zdFVyaSgpO2lmKHN0cm5jbXAoJHVyaSwkaG9zdFVyaSxzdHJsZW4oJGhvc3RVcmkpKT09PTApeyR1cmk9c3Vic3RyKCR1cmksc3RybGVuKCRob3N0VXJpKSk7fX1yZXR1cm4kdXJpLiRmcmFnbWVudDt9cHJpdmF0ZQpzdGF0aWMKZnVuY3Rpb24KYXJnc1RvUGFyYW1zKCRjbGFzcywkbWV0aG9kLCYkYXJncywkc3VwcGxlbWVudGFsPWFycmF5KCkpe3N0YXRpYyRjYWNoZTskcGFyYW1zPSYkY2FjaGVbc3RydG9sb3dlcigkY2xhc3MuJzonLiRtZXRob2QpXTtpZigkcGFyYW1zPT09TlVMTCl7JHBhcmFtcz1OTWV0aG9kUmVmbGVjdGlvbjo6ZnJvbSgkY2xhc3MsJG1ldGhvZCktPmdldERlZmF1bHRQYXJhbWV0ZXJzKCk7fSRpPTA7Zm9yZWFjaCgkcGFyYW1zCmFzJG5hbWU9PiRkZWYpe2lmKGFycmF5X2tleV9leGlzdHMoJGksJGFyZ3MpKXskYXJnc1skbmFtZV09JGFyZ3NbJGldO3Vuc2V0KCRhcmdzWyRpXSk7JGkrKzt9ZWxzZWlmKGFycmF5X2tleV9leGlzdHMoJG5hbWUsJGFyZ3MpKXt9ZWxzZWlmKGFycmF5X2tleV9leGlzdHMoJG5hbWUsJHN1cHBsZW1lbnRhbCkpeyRhcmdzWyRuYW1lXT0kc3VwcGxlbWVudGFsWyRuYW1lXTt9ZWxzZXtjb250aW51ZTt9aWYoJGRlZj09PU5VTEwpe2lmKChzdHJpbmcpJGFyZ3NbJG5hbWVdPT09JycpJGFyZ3NbJG5hbWVdPU5VTEw7fWVsc2V7c2V0dHlwZSgkYXJnc1skbmFtZV0sZ2V0dHlwZSgkZGVmKSk7aWYoJGFyZ3NbJG5hbWVdPT09JGRlZikkYXJnc1skbmFtZV09TlVMTDt9fWlmKGFycmF5X2tleV9leGlzdHMoJGksJGFyZ3MpKXt0aHJvdwpuZXcKTkludmFsaWRMaW5rRXhjZXB0aW9uKCJFeHRyYSBwYXJhbWV0ZXIgZm9yIHNpZ25hbCAnJGNsYXNzOiRtZXRob2QnLiIpO319cHJvdGVjdGVkCmZ1bmN0aW9uCmhhbmRsZUludmFsaWRMaW5rKCRlKXtpZihzZWxmOjokaW52YWxpZExpbmtNb2RlPT09TlVMTCl7c2VsZjo6JGludmFsaWRMaW5rTW9kZT1ORW52aXJvbm1lbnQ6OmlzUHJvZHVjdGlvbigpP3NlbGY6OklOVkFMSURfTElOS19TSUxFTlQ6c2VsZjo6SU5WQUxJRF9MSU5LX1dBUk5JTkc7fWlmKHNlbGY6OiRpbnZhbGlkTGlua01vZGU9PT1zZWxmOjpJTlZBTElEX0xJTktfU0lMRU5UKXtyZXR1cm4nIyc7fWVsc2VpZihzZWxmOjokaW52YWxpZExpbmtNb2RlPT09c2VsZjo6SU5WQUxJRF9MSU5LX1dBUk5JTkcpe3JldHVybidlcnJvcjogJy4kZS0+Z2V0TWVzc2FnZSgpO31lbHNle3Rocm93JGU7fX1zdGF0aWMKZnVuY3Rpb24KZ2V0UGVyc2lzdGVudENvbXBvbmVudHMoKXtyZXR1cm4oYXJyYXkpTkNsYXNzUmVmbGVjdGlvbjo6ZnJvbShmdW5jX2dldF9hcmcoMCkpLT5nZXRBbm5vdGF0aW9uKCdwZXJzaXN0ZW50Jyk7fXByaXZhdGUKZnVuY3Rpb24KZ2V0R2xvYmFsU3RhdGUoJGZvckNsYXNzPU5VTEwpeyRzaW5jZXM9JiR0aGlzLT5nbG9iYWxTdGF0ZVNpbmNlcztpZigkdGhpcy0+Z2xvYmFsU3RhdGU9PT1OVUxMKXskc3RhdGU9YXJyYXkoKTtmb3JlYWNoKCR0aGlzLT5nbG9iYWxQYXJhbXMKYXMkaWQ9PiRwYXJhbXMpeyRwcmVmaXg9JGlkLnNlbGY6Ok5BTUVfU0VQQVJBVE9SO2ZvcmVhY2goJHBhcmFtcwphcyRrZXk9PiR2YWwpeyRzdGF0ZVskcHJlZml4LiRrZXldPSR2YWw7fX0kdGhpcy0+c2F2ZVN0YXRlKCRzdGF0ZSwkZm9yQ2xhc3M/bmV3Ck5QcmVzZW50ZXJDb21wb25lbnRSZWZsZWN0aW9uKCRmb3JDbGFzcyk6TlVMTCk7aWYoJHNpbmNlcz09PU5VTEwpeyRzaW5jZXM9YXJyYXkoKTtmb3JlYWNoKCR0aGlzLT5nZXRSZWZsZWN0aW9uKCktPmdldFBlcnNpc3RlbnRQYXJhbXMoKWFzJG5tPT4kbWV0YSl7JHNpbmNlc1skbm1dPSRtZXRhWydzaW5jZSddO319JGNvbXBvbmVudHM9JHRoaXMtPmdldFJlZmxlY3Rpb24oKS0+Z2V0UGVyc2lzdGVudENvbXBvbmVudHMoKTskaXRlcmF0b3I9JHRoaXMtPmdldENvbXBvbmVudHMoVFJVRSwnSVN0YXRlUGVyc2lzdGVudCcpO2ZvcmVhY2goJGl0ZXJhdG9yCmFzJG5hbWU9PiRjb21wb25lbnQpe2lmKCRpdGVyYXRvci0+Z2V0RGVwdGgoKT09PTApeyRzaW5jZT1pc3NldCgkY29tcG9uZW50c1skbmFtZV1bJ3NpbmNlJ10pPyRjb21wb25lbnRzWyRuYW1lXVsnc2luY2UnXTpGQUxTRTt9JHByZWZpeD0kY29tcG9uZW50LT5nZXRVbmlxdWVJZCgpLnNlbGY6Ok5BTUVfU0VQQVJBVE9SOyRwYXJhbXM9YXJyYXkoKTskY29tcG9uZW50LT5zYXZlU3RhdGUoJHBhcmFtcyk7Zm9yZWFjaCgkcGFyYW1zCmFzJGtleT0+JHZhbCl7JHN0YXRlWyRwcmVmaXguJGtleV09JHZhbDskc2luY2VzWyRwcmVmaXguJGtleV09JHNpbmNlO319fWVsc2V7JHN0YXRlPSR0aGlzLT5nbG9iYWxTdGF0ZTt9aWYoJGZvckNsYXNzIT09TlVMTCl7JHNpbmNlPU5VTEw7Zm9yZWFjaCgkc3RhdGUKYXMka2V5PT4kZm9vKXtpZighaXNzZXQoJHNpbmNlc1ska2V5XSkpeyR4PXN0cnBvcygka2V5LHNlbGY6Ok5BTUVfU0VQQVJBVE9SKTskeD0keD09PUZBTFNFPyRrZXk6c3Vic3RyKCRrZXksMCwkeCk7JHNpbmNlc1ska2V5XT1pc3NldCgkc2luY2VzWyR4XSk/JHNpbmNlc1skeF06RkFMU0U7fWlmKCRzaW5jZSE9PSRzaW5jZXNbJGtleV0peyRzaW5jZT0kc2luY2VzWyRrZXldOyRvaz0kc2luY2UmJihpc19zdWJjbGFzc19vZigkZm9yQ2xhc3MsJHNpbmNlKXx8JGZvckNsYXNzPT09JHNpbmNlKTt9aWYoISRvayl7dW5zZXQoJHN0YXRlWyRrZXldKTt9fX1yZXR1cm4kc3RhdGU7fXByb3RlY3RlZApmdW5jdGlvbgpzYXZlR2xvYmFsU3RhdGUoKXtmb3JlYWNoKCR0aGlzLT5nbG9iYWxQYXJhbXMKYXMkaWQ9PiRmb28peyR0aGlzLT5nZXRDb21wb25lbnQoJGlkLEZBTFNFKTt9JHRoaXMtPmdsb2JhbFBhcmFtcz1hcnJheSgpOyR0aGlzLT5nbG9iYWxTdGF0ZT0kdGhpcy0+Z2V0R2xvYmFsU3RhdGUoKTt9cHJpdmF0ZQpmdW5jdGlvbgppbml0R2xvYmFsUGFyYW1zKCl7JHRoaXMtPmdsb2JhbFBhcmFtcz1hcnJheSgpOyRzZWxmUGFyYW1zPWFycmF5KCk7JHBhcmFtcz0kdGhpcy0+cmVxdWVzdC0+Z2V0UGFyYW1zKCk7aWYoJHRoaXMtPmlzQWpheCgpKXskcGFyYW1zPSR0aGlzLT5yZXF1ZXN0LT5nZXRQb3N0KCkrJHBhcmFtczt9Zm9yZWFjaCgkcGFyYW1zCmFzJGtleT0+JHZhbHVlKXskYT1zdHJsZW4oJGtleSk+Mj9zdHJycG9zKCRrZXksc2VsZjo6TkFNRV9TRVBBUkFUT1IsLTIpOkZBTFNFO2lmKCRhPT09RkFMU0UpeyRzZWxmUGFyYW1zWyRrZXldPSR2YWx1ZTt9ZWxzZXskdGhpcy0+Z2xvYmFsUGFyYW1zW3N1YnN0cigka2V5LDAsJGEpXVtzdWJzdHIoJGtleSwkYSsxKV09JHZhbHVlO319JHRoaXMtPmNoYW5nZUFjdGlvbihpc3NldCgkc2VsZlBhcmFtc1tzZWxmOjpBQ1RJT05fS0VZXSk/JHNlbGZQYXJhbXNbc2VsZjo6QUNUSU9OX0tFWV06c2VsZjo6JGRlZmF1bHRBY3Rpb24pOyR0aGlzLT5zaWduYWxSZWNlaXZlcj0kdGhpcy0+Z2V0VW5pcXVlSWQoKTtpZighZW1wdHkoJHNlbGZQYXJhbXNbc2VsZjo6U0lHTkFMX0tFWV0pKXskcGFyYW09JHNlbGZQYXJhbXNbc2VsZjo6U0lHTkFMX0tFWV07JHBvcz1zdHJycG9zKCRwYXJhbSwnLScpO2lmKCRwb3MpeyR0aGlzLT5zaWduYWxSZWNlaXZlcj1zdWJzdHIoJHBhcmFtLDAsJHBvcyk7JHRoaXMtPnNpZ25hbD1zdWJzdHIoJHBhcmFtLCRwb3MrMSk7fWVsc2V7JHRoaXMtPnNpZ25hbFJlY2VpdmVyPSR0aGlzLT5nZXRVbmlxdWVJZCgpOyR0aGlzLT5zaWduYWw9JHBhcmFtO31pZigkdGhpcy0+c2lnbmFsPT1OVUxMKXskdGhpcy0+c2lnbmFsPU5VTEw7fX0kdGhpcy0+bG9hZFN0YXRlKCRzZWxmUGFyYW1zKTt9ZmluYWwKZnVuY3Rpb24KcG9wR2xvYmFsUGFyYW1zKCRpZCl7aWYoaXNzZXQoJHRoaXMtPmdsb2JhbFBhcmFtc1skaWRdKSl7JHJlcz0kdGhpcy0+Z2xvYmFsUGFyYW1zWyRpZF07dW5zZXQoJHRoaXMtPmdsb2JhbFBhcmFtc1skaWRdKTtyZXR1cm4kcmVzO31lbHNle3JldHVybgphcnJheSgpO319ZnVuY3Rpb24KaGFzRmxhc2hTZXNzaW9uKCl7cmV0dXJuIWVtcHR5KCR0aGlzLT5wYXJhbXNbc2VsZjo6RkxBU0hfS0VZXSkmJiR0aGlzLT5nZXRTZXNzaW9uKCktPmhhc05hbWVzcGFjZSgnTmV0dGUuQXBwbGljYXRpb24uRmxhc2gvJy4kdGhpcy0+cGFyYW1zW3NlbGY6OkZMQVNIX0tFWV0pO31mdW5jdGlvbgpnZXRGbGFzaFNlc3Npb24oKXtpZihlbXB0eSgkdGhpcy0+cGFyYW1zW3NlbGY6OkZMQVNIX0tFWV0pKXskdGhpcy0+cGFyYW1zW3NlbGY6OkZMQVNIX0tFWV09c3Vic3RyKG1kNShsY2dfdmFsdWUoKSksMCw0KTt9cmV0dXJuJHRoaXMtPmdldFNlc3Npb24oJ05ldHRlLkFwcGxpY2F0aW9uLkZsYXNoLycuJHRoaXMtPnBhcmFtc1tzZWxmOjpGTEFTSF9LRVldKTt9cHJvdGVjdGVkCmZ1bmN0aW9uCmdldEh0dHBSZXF1ZXN0KCl7cmV0dXJuCk5FbnZpcm9ubWVudDo6Z2V0SHR0cFJlcXVlc3QoKTt9cHJvdGVjdGVkCmZ1bmN0aW9uCmdldEh0dHBSZXNwb25zZSgpe3JldHVybgpORW52aXJvbm1lbnQ6OmdldEh0dHBSZXNwb25zZSgpO31wcm90ZWN0ZWQKZnVuY3Rpb24KZ2V0SHR0cENvbnRleHQoKXtyZXR1cm4KTkVudmlyb25tZW50OjpnZXRIdHRwQ29udGV4dCgpO31mdW5jdGlvbgpnZXRBcHBsaWNhdGlvbigpe3JldHVybgpORW52aXJvbm1lbnQ6OmdldEFwcGxpY2F0aW9uKCk7fXByb3RlY3RlZApmdW5jdGlvbgpnZXRTZXNzaW9uKCRuYW1lc3BhY2U9TlVMTCl7cmV0dXJuCk5FbnZpcm9ubWVudDo6Z2V0U2Vzc2lvbigkbmFtZXNwYWNlKTt9cHJvdGVjdGVkCmZ1bmN0aW9uCmdldFVzZXIoKXtyZXR1cm4KTkVudmlyb25tZW50OjpnZXRVc2VyKCk7fX1jbGFzcwpOQ2xhc3NSZWZsZWN0aW9uCmV4dGVuZHMKUmVmbGVjdGlvbkNsYXNze3ByaXZhdGUKc3RhdGljJGV4dE1ldGhvZHM7c3RhdGljCmZ1bmN0aW9uCmZyb20oJGNsYXNzKXtyZXR1cm4KbmV3CnNlbGYoJGNsYXNzKTt9ZnVuY3Rpb24KX190b1N0cmluZygpe3JldHVybidDbGFzcyAnLiR0aGlzLT5nZXROYW1lKCk7fWZ1bmN0aW9uCmhhc0V2ZW50UHJvcGVydHkoJG5hbWUpe2lmKHByZWdfbWF0Y2goJyNeb25bQS1aXSMnLCRuYW1lKSYmJHRoaXMtPmhhc1Byb3BlcnR5KCRuYW1lKSl7JHJwPSR0aGlzLT5nZXRQcm9wZXJ0eSgkbmFtZSk7cmV0dXJuJHJwLT5pc1B1YmxpYygpJiYhJHJwLT5pc1N0YXRpYygpO31yZXR1cm4KRkFMU0U7fWZ1bmN0aW9uCnNldEV4dGVuc2lvbk1ldGhvZCgkbmFtZSwkY2FsbGJhY2speyRsPSZzZWxmOjokZXh0TWV0aG9kc1tzdHJ0b2xvd2VyKCRuYW1lKV07JGxbc3RydG9sb3dlcigkdGhpcy0+Z2V0TmFtZSgpKV09Y2FsbGJhY2soJGNhbGxiYWNrKTskbFsnJ109TlVMTDtyZXR1cm4kdGhpczt9ZnVuY3Rpb24KZ2V0RXh0ZW5zaW9uTWV0aG9kKCRuYW1lKXtpZihzZWxmOjokZXh0TWV0aG9kcz09PU5VTEx8fCRuYW1lPT09TlVMTCl7JGxpc3Q9Z2V0X2RlZmluZWRfZnVuY3Rpb25zKCk7Zm9yZWFjaCgkbGlzdFsndXNlciddYXMkZmNlKXskcGFpcj1leHBsb2RlKCdfcHJvdG90eXBlXycsJGZjZSk7aWYoY291bnQoJHBhaXIpPT09Mil7c2VsZjo6JGV4dE1ldGhvZHNbJHBhaXJbMV1dWyRwYWlyWzBdXT1jYWxsYmFjaygkZmNlKTtzZWxmOjokZXh0TWV0aG9kc1skcGFpclsxXV1bJyddPU5VTEw7fX1pZigkbmFtZT09PU5VTEwpcmV0dXJuCk5VTEw7fSRjbGFzcz1zdHJ0b2xvd2VyKCR0aGlzLT5nZXROYW1lKCkpOyRsPSZzZWxmOjokZXh0TWV0aG9kc1tzdHJ0b2xvd2VyKCRuYW1lKV07aWYoZW1wdHkoJGwpKXtyZXR1cm4KRkFMU0U7fWVsc2VpZihpc3NldCgkbFsnJ11bJGNsYXNzXSkpe3JldHVybiRsWycnXVskY2xhc3NdO30kY2w9JGNsYXNzO2Rve2lmKGlzc2V0KCRsWyRjbF0pKXtyZXR1cm4kbFsnJ11bJGNsYXNzXT0kbFskY2xdO319d2hpbGUoKCRjbD1zdHJ0b2xvd2VyKGdldF9wYXJlbnRfY2xhc3MoJGNsKSkpIT09JycpO2ZvcmVhY2goY2xhc3NfaW1wbGVtZW50cygkY2xhc3MpYXMkY2wpeyRjbD1zdHJ0b2xvd2VyKCRjbCk7aWYoaXNzZXQoJGxbJGNsXSkpe3JldHVybiRsWycnXVskY2xhc3NdPSRsWyRjbF07fX1yZXR1cm4kbFsnJ11bJGNsYXNzXT1GQUxTRTt9c3RhdGljCmZ1bmN0aW9uCmltcG9ydChSZWZsZWN0aW9uQ2xhc3MkcmVmKXtyZXR1cm4KbmV3CnNlbGYoJHJlZi0+Z2V0TmFtZSgpKTt9ZnVuY3Rpb24KZ2V0Q29uc3RydWN0b3IoKXtyZXR1cm4oJHJlZj1wYXJlbnQ6OmdldENvbnN0cnVjdG9yKCkpP05NZXRob2RSZWZsZWN0aW9uOjppbXBvcnQoJHJlZik6TlVMTDt9ZnVuY3Rpb24KZ2V0RXh0ZW5zaW9uKCl7cmV0dXJuKCRyZWY9cGFyZW50OjpnZXRFeHRlbnNpb24oKSk/TkV4dGVuc2lvblJlZmxlY3Rpb246OmltcG9ydCgkcmVmKTpOVUxMO31mdW5jdGlvbgpnZXRJbnRlcmZhY2VzKCl7cmV0dXJuCmFycmF5X21hcChhcnJheSgnTkNsYXNzUmVmbGVjdGlvbicsJ2ltcG9ydCcpLHBhcmVudDo6Z2V0SW50ZXJmYWNlcygpKTt9ZnVuY3Rpb24KZ2V0TWV0aG9kKCRuYW1lKXtyZXR1cm4KTk1ldGhvZFJlZmxlY3Rpb246OmltcG9ydChwYXJlbnQ6OmdldE1ldGhvZCgkbmFtZSkpO31mdW5jdGlvbgpnZXRNZXRob2RzKCRmaWx0ZXI9LTEpe3JldHVybgphcnJheV9tYXAoYXJyYXkoJ05NZXRob2RSZWZsZWN0aW9uJywnaW1wb3J0JykscGFyZW50OjpnZXRNZXRob2RzKCRmaWx0ZXIpKTt9ZnVuY3Rpb24KZ2V0UGFyZW50Q2xhc3MoKXtyZXR1cm4oJHJlZj1wYXJlbnQ6OmdldFBhcmVudENsYXNzKCkpP3NlbGY6OmltcG9ydCgkcmVmKTpOVUxMO31mdW5jdGlvbgpnZXRQcm9wZXJ0aWVzKCRmaWx0ZXI9LTEpe3JldHVybgphcnJheV9tYXAoYXJyYXkoJ05Qcm9wZXJ0eVJlZmxlY3Rpb24nLCdpbXBvcnQnKSxwYXJlbnQ6OmdldFByb3BlcnRpZXMoJGZpbHRlcikpO31mdW5jdGlvbgpnZXRQcm9wZXJ0eSgkbmFtZSl7cmV0dXJuCk5Qcm9wZXJ0eVJlZmxlY3Rpb246OmltcG9ydChwYXJlbnQ6OmdldFByb3BlcnR5KCRuYW1lKSk7fWZ1bmN0aW9uCmhhc0Fubm90YXRpb24oJG5hbWUpeyRyZXM9TkFubm90YXRpb25zUGFyc2VyOjpnZXRBbGwoJHRoaXMpO3JldHVybiFlbXB0eSgkcmVzWyRuYW1lXSk7fWZ1bmN0aW9uCmdldEFubm90YXRpb24oJG5hbWUpeyRyZXM9TkFubm90YXRpb25zUGFyc2VyOjpnZXRBbGwoJHRoaXMpO3JldHVybgppc3NldCgkcmVzWyRuYW1lXSk/ZW5kKCRyZXNbJG5hbWVdKTpOVUxMO31mdW5jdGlvbgpnZXRBbm5vdGF0aW9ucygpe3JldHVybgpOQW5ub3RhdGlvbnNQYXJzZXI6OmdldEFsbCgkdGhpcyk7fWZ1bmN0aW9uCmdldFJlZmxlY3Rpb24oKXtyZXR1cm4KbmV3Ck5DbGFzc1JlZmxlY3Rpb24oJHRoaXMpO31mdW5jdGlvbgpfX2NhbGwoJG5hbWUsJGFyZ3Mpe3JldHVybgpOT2JqZWN0TWl4aW46OmNhbGwoJHRoaXMsJG5hbWUsJGFyZ3MpO31mdW5jdGlvbiZfX2dldCgkbmFtZSl7cmV0dXJuCk5PYmplY3RNaXhpbjo6Z2V0KCR0aGlzLCRuYW1lKTt9ZnVuY3Rpb24KX19zZXQoJG5hbWUsJHZhbHVlKXtyZXR1cm4KTk9iamVjdE1peGluOjpzZXQoJHRoaXMsJG5hbWUsJHZhbHVlKTt9ZnVuY3Rpb24KX19pc3NldCgkbmFtZSl7cmV0dXJuCk5PYmplY3RNaXhpbjo6aGFzKCR0aGlzLCRuYW1lKTt9ZnVuY3Rpb24KX191bnNldCgkbmFtZSl7dGhyb3cKbmV3Ck1lbWJlckFjY2Vzc0V4Y2VwdGlvbigiQ2Fubm90IHVuc2V0IHRoZSBwcm9wZXJ0eSB7JHRoaXMtPnJlZmxlY3Rpb24tPm5hbWV9OjpcJCRuYW1lLiIpO319Y2xhc3MKTlByZXNlbnRlckNvbXBvbmVudFJlZmxlY3Rpb24KZXh0ZW5kcwpOQ2xhc3NSZWZsZWN0aW9ue3ByaXZhdGUKc3RhdGljJHBwQ2FjaGU9YXJyYXkoKTtwcml2YXRlCnN0YXRpYyRwY0NhY2hlPWFycmF5KCk7cHJpdmF0ZQpzdGF0aWMkbWNDYWNoZT1hcnJheSgpO2Z1bmN0aW9uCmdldFBlcnNpc3RlbnRQYXJhbXMoJGNsYXNzPU5VTEwpeyRjbGFzcz0kY2xhc3M9PT1OVUxMPyR0aGlzLT5nZXROYW1lKCk6JGNsYXNzOyRwYXJhbXM9JnNlbGY6OiRwcENhY2hlWyRjbGFzc107aWYoJHBhcmFtcyE9PU5VTEwpcmV0dXJuJHBhcmFtczskcGFyYW1zPWFycmF5KCk7aWYoaXNfc3ViY2xhc3Nfb2YoJGNsYXNzLCdOUHJlc2VudGVyQ29tcG9uZW50JykpeyRkZWZhdWx0cz1nZXRfY2xhc3NfdmFycygkY2xhc3MpO2ZvcmVhY2goY2FsbF91c2VyX2Z1bmMoYXJyYXkoJGNsYXNzLCdnZXRQZXJzaXN0ZW50UGFyYW1zJyksJGNsYXNzKWFzJG5hbWU9PiRtZXRhKXtpZihpc19zdHJpbmcoJG1ldGEpKSRuYW1lPSRtZXRhOyRwYXJhbXNbJG5hbWVdPWFycmF5KCdkZWYnPT4kZGVmYXVsdHNbJG5hbWVdLCdzaW5jZSc9PiRjbGFzcyk7fSRwYXJhbXM9JHRoaXMtPmdldFBlcnNpc3RlbnRQYXJhbXMoZ2V0X3BhcmVudF9jbGFzcygkY2xhc3MpKSskcGFyYW1zO31yZXR1cm4kcGFyYW1zO31mdW5jdGlvbgpnZXRQZXJzaXN0ZW50Q29tcG9uZW50cygpeyRjbGFzcz0kdGhpcy0+Z2V0TmFtZSgpOyRjb21wb25lbnRzPSZzZWxmOjokcGNDYWNoZVskY2xhc3NdO2lmKCRjb21wb25lbnRzIT09TlVMTClyZXR1cm4kY29tcG9uZW50czskY29tcG9uZW50cz1hcnJheSgpO2lmKGlzX3N1YmNsYXNzX29mKCRjbGFzcywnTlByZXNlbnRlcicpKXtmb3JlYWNoKGNhbGxfdXNlcl9mdW5jKGFycmF5KCRjbGFzcywnZ2V0UGVyc2lzdGVudENvbXBvbmVudHMnKSwkY2xhc3MpYXMkbmFtZT0+JG1ldGEpe2lmKGlzX3N0cmluZygkbWV0YSkpJG5hbWU9JG1ldGE7JGNvbXBvbmVudHNbJG5hbWVdPWFycmF5KCdzaW5jZSc9PiRjbGFzcyk7fSRjb21wb25lbnRzPXNlbGY6OmdldFBlcnNpc3RlbnRDb21wb25lbnRzKGdldF9wYXJlbnRfY2xhc3MoJGNsYXNzKSkrJGNvbXBvbmVudHM7fXJldHVybiRjb21wb25lbnRzO31mdW5jdGlvbgpoYXNDYWxsYWJsZU1ldGhvZCgkbWV0aG9kKXskY2xhc3M9JHRoaXMtPmdldE5hbWUoKTskY2FjaGU9JnNlbGY6OiRtY0NhY2hlW3N0cnRvbG93ZXIoJGNsYXNzLic6Jy4kbWV0aG9kKV07aWYoJGNhY2hlPT09TlVMTCl0cnl7JGNhY2hlPUZBTFNFOyRybT1OTWV0aG9kUmVmbGVjdGlvbjo6ZnJvbSgkY2xhc3MsJG1ldGhvZCk7JGNhY2hlPSR0aGlzLT5pc0luc3RhbnRpYWJsZSgpJiYkcm0tPmlzUHVibGljKCkmJiEkcm0tPmlzQWJzdHJhY3QoKSYmISRybS0+aXNTdGF0aWMoKTt9Y2F0Y2goUmVmbGVjdGlvbkV4Y2VwdGlvbiRlKXt9cmV0dXJuJGNhY2hlO319Y2xhc3MKTlByZXNlbnRlckxvYWRlcgppbXBsZW1lbnRzCklQcmVzZW50ZXJMb2FkZXJ7cHVibGljJGNhc2VTZW5zaXRpdmU9RkFMU0U7cHJpdmF0ZSRiYXNlRGlyO3ByaXZhdGUkY2FjaGU9YXJyYXkoKTtmdW5jdGlvbgpfX2NvbnN0cnVjdCgkYmFzZURpcil7JHRoaXMtPmJhc2VEaXI9JGJhc2VEaXI7fWZ1bmN0aW9uCmdldFByZXNlbnRlckNsYXNzKCYkbmFtZSl7aWYoaXNzZXQoJHRoaXMtPmNhY2hlWyRuYW1lXSkpe2xpc3QoJGNsYXNzLCRuYW1lKT0kdGhpcy0+Y2FjaGVbJG5hbWVdO3JldHVybiRjbGFzczt9aWYoIWlzX3N0cmluZygkbmFtZSl8fCFwcmVnX21hdGNoKCIjXlthLXpBLVpceDdmLVx4ZmZdW2EtekEtWjAtOVx4N2YtXHhmZjpdKiQjIiwkbmFtZSkpe3Rocm93Cm5ldwpOSW52YWxpZFByZXNlbnRlckV4Y2VwdGlvbigiUHJlc2VudGVyIG5hbWUgbXVzdCBiZSBhbHBoYW51bWVyaWMgc3RyaW5nLCAnJG5hbWUnIGlzIGludmFsaWQuIik7fSRjbGFzcz0kdGhpcy0+Zm9ybWF0UHJlc2VudGVyQ2xhc3MoJG5hbWUpO2lmKCFjbGFzc19leGlzdHMoJGNsYXNzKSl7JGZpbGU9JHRoaXMtPmZvcm1hdFByZXNlbnRlckZpbGUoJG5hbWUpO2lmKGlzX2ZpbGUoJGZpbGUpJiZpc19yZWFkYWJsZSgkZmlsZSkpe05MaW1pdGVkU2NvcGU6OmxvYWQoJGZpbGUpO31pZighY2xhc3NfZXhpc3RzKCRjbGFzcykpe3Rocm93Cm5ldwpOSW52YWxpZFByZXNlbnRlckV4Y2VwdGlvbigiQ2Fubm90IGxvYWQgcHJlc2VudGVyICckbmFtZScsIGNsYXNzICckY2xhc3MnIHdhcyBub3QgZm91bmQgaW4gJyRmaWxlJy4iKTt9fSRyZWZsZWN0aW9uPW5ldwpOQ2xhc3NSZWZsZWN0aW9uKCRjbGFzcyk7JGNsYXNzPSRyZWZsZWN0aW9uLT5nZXROYW1lKCk7aWYoISRyZWZsZWN0aW9uLT5pbXBsZW1lbnRzSW50ZXJmYWNlKCdJUHJlc2VudGVyJykpe3Rocm93Cm5ldwpOSW52YWxpZFByZXNlbnRlckV4Y2VwdGlvbigiQ2Fubm90IGxvYWQgcHJlc2VudGVyICckbmFtZScsIGNsYXNzICckY2xhc3MnIGlzIG5vdCBOZXR0ZVxcQXBwbGljYXRpb25cXElQcmVzZW50ZXIgaW1wbGVtZW50b3IuIik7fWlmKCRyZWZsZWN0aW9uLT5pc0Fic3RyYWN0KCkpe3Rocm93Cm5ldwpOSW52YWxpZFByZXNlbnRlckV4Y2VwdGlvbigiQ2Fubm90IGxvYWQgcHJlc2VudGVyICckbmFtZScsIGNsYXNzICckY2xhc3MnIGlzIGFic3RyYWN0LiIpO30kcmVhbE5hbWU9JHRoaXMtPnVuZm9ybWF0UHJlc2VudGVyQ2xhc3MoJGNsYXNzKTtpZigkbmFtZSE9PSRyZWFsTmFtZSl7aWYoJHRoaXMtPmNhc2VTZW5zaXRpdmUpe3Rocm93Cm5ldwpOSW52YWxpZFByZXNlbnRlckV4Y2VwdGlvbigiQ2Fubm90IGxvYWQgcHJlc2VudGVyICckbmFtZScsIGNhc2UgbWlzbWF0Y2guIFJlYWwgbmFtZSBpcyAnJHJlYWxOYW1lJy4iKTt9ZWxzZXskdGhpcy0+Y2FjaGVbJG5hbWVdPWFycmF5KCRjbGFzcywkcmVhbE5hbWUpOyRuYW1lPSRyZWFsTmFtZTt9fWVsc2V7JHRoaXMtPmNhY2hlWyRuYW1lXT1hcnJheSgkY2xhc3MsJHJlYWxOYW1lKTt9cmV0dXJuJGNsYXNzO31mdW5jdGlvbgpmb3JtYXRQcmVzZW50ZXJDbGFzcygkcHJlc2VudGVyKXtyZXR1cm4Kc3RydHIoJHByZXNlbnRlciwnOicsJ18nKS4nUHJlc2VudGVyJztyZXR1cm4Kc3RyX3JlcGxhY2UoJzonLCdNb2R1bGVcXCcsJHByZXNlbnRlcikuJ1ByZXNlbnRlcic7fWZ1bmN0aW9uCnVuZm9ybWF0UHJlc2VudGVyQ2xhc3MoJGNsYXNzKXtyZXR1cm4Kc3RydHIoc3Vic3RyKCRjbGFzcywwLC05KSwnXycsJzonKTtyZXR1cm4Kc3RyX3JlcGxhY2UoJ01vZHVsZVxcJywnOicsc3Vic3RyKCRjbGFzcywwLC05KSk7fWZ1bmN0aW9uCmZvcm1hdFByZXNlbnRlckZpbGUoJHByZXNlbnRlcil7JHBhdGg9Jy8nLnN0cl9yZXBsYWNlKCc6JywnTW9kdWxlLycsJHByZXNlbnRlcik7cmV0dXJuJHRoaXMtPmJhc2VEaXIuc3Vic3RyX3JlcGxhY2UoJHBhdGgsJy9wcmVzZW50ZXJzJyxzdHJycG9zKCRwYXRoLCcvJyksMCkuJ1ByZXNlbnRlci5waHAnO319YWJzdHJhY3QKY2xhc3MKTkZyZWV6YWJsZU9iamVjdApleHRlbmRzCk5PYmplY3R7cHJpdmF0ZSRmcm96ZW49RkFMU0U7ZnVuY3Rpb24KZnJlZXplKCl7JHRoaXMtPmZyb3plbj1UUlVFO31maW5hbApmdW5jdGlvbgppc0Zyb3plbigpe3JldHVybiR0aGlzLT5mcm96ZW47fWZ1bmN0aW9uCl9fY2xvbmUoKXskdGhpcy0+ZnJvemVuPUZBTFNFO31wcm90ZWN0ZWQKZnVuY3Rpb24KdXBkYXRpbmcoKXtpZigkdGhpcy0+ZnJvemVuKXt0aHJvdwpuZXcKSW52YWxpZFN0YXRlRXhjZXB0aW9uKCJDYW5ub3QgbW9kaWZ5IGEgZnJvemVuIG9iamVjdCB7JHRoaXMtPnJlZmxlY3Rpb24tPm5hbWV9LiIpO319fWZpbmFsCmNsYXNzCk5QcmVzZW50ZXJSZXF1ZXN0CmV4dGVuZHMKTkZyZWV6YWJsZU9iamVjdHtjb25zdApGT1JXQVJEPSdGT1JXQVJEJztjb25zdApTRUNVUkVEPSdzZWN1cmVkJztjb25zdApSRVNUT1JFRD0ncmVzdG9yZWQnO3ByaXZhdGUkbWV0aG9kO3ByaXZhdGUkZmxhZ3M9YXJyYXkoKTtwcml2YXRlJG5hbWU7cHJpdmF0ZSRwYXJhbXM7cHJpdmF0ZSRwb3N0O3ByaXZhdGUkZmlsZXM7ZnVuY3Rpb24KX19jb25zdHJ1Y3QoJG5hbWUsJG1ldGhvZCxhcnJheSRwYXJhbXMsYXJyYXkkcG9zdD1hcnJheSgpLGFycmF5JGZpbGVzPWFycmF5KCksYXJyYXkkZmxhZ3M9YXJyYXkoKSl7JHRoaXMtPm5hbWU9JG5hbWU7JHRoaXMtPm1ldGhvZD0kbWV0aG9kOyR0aGlzLT5wYXJhbXM9JHBhcmFtczskdGhpcy0+cG9zdD0kcG9zdDskdGhpcy0+ZmlsZXM9JGZpbGVzOyR0aGlzLT5mbGFncz0kZmxhZ3M7fWZ1bmN0aW9uCnNldFByZXNlbnRlck5hbWUoJG5hbWUpeyR0aGlzLT51cGRhdGluZygpOyR0aGlzLT5uYW1lPSRuYW1lO3JldHVybiR0aGlzO31mdW5jdGlvbgpnZXRQcmVzZW50ZXJOYW1lKCl7cmV0dXJuJHRoaXMtPm5hbWU7fWZ1bmN0aW9uCnNldFBhcmFtcyhhcnJheSRwYXJhbXMpeyR0aGlzLT51cGRhdGluZygpOyR0aGlzLT5wYXJhbXM9JHBhcmFtcztyZXR1cm4kdGhpczt9ZnVuY3Rpb24KZ2V0UGFyYW1zKCl7cmV0dXJuJHRoaXMtPnBhcmFtczt9ZnVuY3Rpb24Kc2V0UG9zdChhcnJheSRwYXJhbXMpeyR0aGlzLT51cGRhdGluZygpOyR0aGlzLT5wb3N0PSRwYXJhbXM7cmV0dXJuJHRoaXM7fWZ1bmN0aW9uCmdldFBvc3QoKXtyZXR1cm4kdGhpcy0+cG9zdDt9ZnVuY3Rpb24Kc2V0RmlsZXMoYXJyYXkkZmlsZXMpeyR0aGlzLT51cGRhdGluZygpOyR0aGlzLT5maWxlcz0kZmlsZXM7cmV0dXJuJHRoaXM7fWZ1bmN0aW9uCmdldEZpbGVzKCl7cmV0dXJuJHRoaXMtPmZpbGVzO31mdW5jdGlvbgpzZXRNZXRob2QoJG1ldGhvZCl7JHRoaXMtPm1ldGhvZD0kbWV0aG9kO3JldHVybiR0aGlzO31mdW5jdGlvbgpnZXRNZXRob2QoKXtyZXR1cm4kdGhpcy0+bWV0aG9kO31mdW5jdGlvbgppc01ldGhvZCgkbWV0aG9kKXtyZXR1cm4Kc3RyY2FzZWNtcCgkdGhpcy0+bWV0aG9kLCRtZXRob2QpPT09MDt9ZnVuY3Rpb24KaXNQb3N0KCl7cmV0dXJuCnN0cmNhc2VjbXAoJHRoaXMtPm1ldGhvZCwncG9zdCcpPT09MDt9ZnVuY3Rpb24Kc2V0RmxhZygkZmxhZywkdmFsdWU9VFJVRSl7JHRoaXMtPnVwZGF0aW5nKCk7JHRoaXMtPmZsYWdzWyRmbGFnXT0oYm9vbCkkdmFsdWU7cmV0dXJuJHRoaXM7fWZ1bmN0aW9uCmhhc0ZsYWcoJGZsYWcpe3JldHVybiFlbXB0eSgkdGhpcy0+ZmxhZ3NbJGZsYWddKTt9fWNsYXNzCk5Eb3dubG9hZFJlc3BvbnNlCmV4dGVuZHMKTk9iamVjdAppbXBsZW1lbnRzCklQcmVzZW50ZXJSZXNwb25zZXtwcml2YXRlJGZpbGU7cHJpdmF0ZSRjb250ZW50VHlwZTtwcml2YXRlJG5hbWU7ZnVuY3Rpb24KX19jb25zdHJ1Y3QoJGZpbGUsJG5hbWU9TlVMTCwkY29udGVudFR5cGU9TlVMTCl7aWYoIWlzX2ZpbGUoJGZpbGUpKXt0aHJvdwpuZXcKTkJhZFJlcXVlc3RFeGNlcHRpb24oIkZpbGUgJyRmaWxlJyBkb2Vzbid0IGV4aXN0LiIpO30kdGhpcy0+ZmlsZT0kZmlsZTskdGhpcy0+bmFtZT0kbmFtZT8kbmFtZTpiYXNlbmFtZSgkZmlsZSk7JHRoaXMtPmNvbnRlbnRUeXBlPSRjb250ZW50VHlwZT8kY29udGVudFR5cGU6J2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSc7fWZpbmFsCmZ1bmN0aW9uCmdldEZpbGUoKXtyZXR1cm4kdGhpcy0+ZmlsZTt9ZmluYWwKZnVuY3Rpb24KZ2V0TmFtZSgpe3JldHVybiR0aGlzLT5uYW1lO31maW5hbApmdW5jdGlvbgpnZXRDb250ZW50VHlwZSgpe3JldHVybiR0aGlzLT5jb250ZW50VHlwZTt9ZnVuY3Rpb24Kc2VuZCgpe05FbnZpcm9ubWVudDo6Z2V0SHR0cFJlc3BvbnNlKCktPnNldENvbnRlbnRUeXBlKCR0aGlzLT5jb250ZW50VHlwZSk7TkVudmlyb25tZW50OjpnZXRIdHRwUmVzcG9uc2UoKS0+c2V0SGVhZGVyKCdDb250ZW50LURpc3Bvc2l0aW9uJywnYXR0YWNobWVudDsgZmlsZW5hbWU9IicuJHRoaXMtPm5hbWUuJyInKTtyZWFkZmlsZSgkdGhpcy0+ZmlsZSk7fX1jbGFzcwpORm9yd2FyZGluZ1Jlc3BvbnNlCmV4dGVuZHMKTk9iamVjdAppbXBsZW1lbnRzCklQcmVzZW50ZXJSZXNwb25zZXtwcml2YXRlJHJlcXVlc3Q7ZnVuY3Rpb24KX19jb25zdHJ1Y3QoTlByZXNlbnRlclJlcXVlc3QkcmVxdWVzdCl7JHRoaXMtPnJlcXVlc3Q9JHJlcXVlc3Q7fWZpbmFsCmZ1bmN0aW9uCmdldFJlcXVlc3QoKXtyZXR1cm4kdGhpcy0+cmVxdWVzdDt9ZnVuY3Rpb24Kc2VuZCgpe319Y2xhc3MKTkpzb25SZXNwb25zZQpleHRlbmRzCk5PYmplY3QKaW1wbGVtZW50cwpJUHJlc2VudGVyUmVzcG9uc2V7cHJpdmF0ZSRwYXlsb2FkO3ByaXZhdGUkY29udGVudFR5cGU7ZnVuY3Rpb24KX19jb25zdHJ1Y3QoJHBheWxvYWQsJGNvbnRlbnRUeXBlPU5VTEwpe2lmKCFpc19hcnJheSgkcGF5bG9hZCkmJiEoJHBheWxvYWQKaW5zdGFuY2VvZgpzdGRDbGFzcykpe3Rocm93Cm5ldwpJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIlBheWxvYWQgbXVzdCBiZSBhcnJheSBvciBhbm9ueW1vdXMgY2xhc3MsICIuZ2V0dHlwZSgkcGF5bG9hZCkuIiBnaXZlbi4iKTt9JHRoaXMtPnBheWxvYWQ9JHBheWxvYWQ7JHRoaXMtPmNvbnRlbnRUeXBlPSRjb250ZW50VHlwZT8kY29udGVudFR5cGU6J2FwcGxpY2F0aW9uL2pzb24nO31maW5hbApmdW5jdGlvbgpnZXRQYXlsb2FkKCl7cmV0dXJuJHRoaXMtPnBheWxvYWQ7fWZ1bmN0aW9uCnNlbmQoKXtORW52aXJvbm1lbnQ6OmdldEh0dHBSZXNwb25zZSgpLT5zZXRDb250ZW50VHlwZSgkdGhpcy0+Y29udGVudFR5cGUpO05FbnZpcm9ubWVudDo6Z2V0SHR0cFJlc3BvbnNlKCktPnNldEV4cGlyYXRpb24oRkFMU0UpO2VjaG8KanNvbl9lbmNvZGUoJHRoaXMtPnBheWxvYWQpO319Y2xhc3MKTlJlZGlyZWN0aW5nUmVzcG9uc2UKZXh0ZW5kcwpOT2JqZWN0CmltcGxlbWVudHMKSVByZXNlbnRlclJlc3BvbnNle3ByaXZhdGUkdXJpO3ByaXZhdGUkY29kZTtmdW5jdGlvbgpfX2NvbnN0cnVjdCgkdXJpLCRjb2RlPUlIdHRwUmVzcG9uc2U6OlMzMDJfRk9VTkQpeyR0aGlzLT51cmk9KHN0cmluZykkdXJpOyR0aGlzLT5jb2RlPShpbnQpJGNvZGU7fWZpbmFsCmZ1bmN0aW9uCmdldFVyaSgpe3JldHVybiR0aGlzLT51cmk7fWZpbmFsCmZ1bmN0aW9uCmdldENvZGUoKXtyZXR1cm4kdGhpcy0+Y29kZTt9ZnVuY3Rpb24Kc2VuZCgpe05FbnZpcm9ubWVudDo6Z2V0SHR0cFJlc3BvbnNlKCktPnJlZGlyZWN0KCR0aGlzLT51cmksJHRoaXMtPmNvZGUpO319Y2xhc3MKTlJlbmRlclJlc3BvbnNlCmV4dGVuZHMKTk9iamVjdAppbXBsZW1lbnRzCklQcmVzZW50ZXJSZXNwb25zZXtwcml2YXRlJHNvdXJjZTtmdW5jdGlvbgpfX2NvbnN0cnVjdCgkc291cmNlKXskdGhpcy0+c291cmNlPSRzb3VyY2U7fWZpbmFsCmZ1bmN0aW9uCmdldFNvdXJjZSgpe3JldHVybiR0aGlzLT5zb3VyY2U7fWZ1bmN0aW9uCnNlbmQoKXtpZigkdGhpcy0+c291cmNlCmluc3RhbmNlb2YKSVRlbXBsYXRlKXskdGhpcy0+c291cmNlLT5yZW5kZXIoKTt9ZWxzZXtlY2hvJHRoaXMtPnNvdXJjZTt9fX1jbGFzcwpOQ2xpUm91dGVyCmV4dGVuZHMKTk9iamVjdAppbXBsZW1lbnRzCklSb3V0ZXJ7Y29uc3QKUFJFU0VOVEVSX0tFWT0nYWN0aW9uJztwcml2YXRlJGRlZmF1bHRzO2Z1bmN0aW9uCl9fY29uc3RydWN0KCRkZWZhdWx0cz1hcnJheSgpKXskdGhpcy0+ZGVmYXVsdHM9JGRlZmF1bHRzO31mdW5jdGlvbgptYXRjaChJSHR0cFJlcXVlc3QkaHR0cFJlcXVlc3Qpe2lmKGVtcHR5KCRfU0VSVkVSWydhcmd2J10pfHwhaXNfYXJyYXkoJF9TRVJWRVJbJ2FyZ3YnXSkpe3JldHVybgpOVUxMO30kbmFtZXM9YXJyYXkoc2VsZjo6UFJFU0VOVEVSX0tFWSk7JHBhcmFtcz0kdGhpcy0+ZGVmYXVsdHM7JGFyZ3M9JF9TRVJWRVJbJ2FyZ3YnXTthcnJheV9zaGlmdCgkYXJncyk7JGFyZ3NbXT0nLS0nO2ZvcmVhY2goJGFyZ3MKYXMkYXJnKXskb3B0PXByZWdfcmVwbGFjZSgnIy98LSsjQScsJycsJGFyZyk7aWYoJG9wdD09PSRhcmcpe2lmKGlzc2V0KCRmbGFnKXx8JGZsYWc9YXJyYXlfc2hpZnQoJG5hbWVzKSl7JHBhcmFtc1skZmxhZ109JGFyZzt9ZWxzZXskcGFyYW1zW109JGFyZzt9JGZsYWc9TlVMTDtjb250aW51ZTt9aWYoaXNzZXQoJGZsYWcpKXskcGFyYW1zWyRmbGFnXT1UUlVFOyRmbGFnPU5VTEw7fWlmKCRvcHQhPT0nJyl7JHBhaXI9ZXhwbG9kZSgnPScsJG9wdCwyKTtpZihpc3NldCgkcGFpclsxXSkpeyRwYXJhbXNbJHBhaXJbMF1dPSRwYWlyWzFdO31lbHNleyRmbGFnPSRwYWlyWzBdO319fWlmKCFpc3NldCgkcGFyYW1zW3NlbGY6OlBSRVNFTlRFUl9LRVldKSl7dGhyb3cKbmV3CkludmFsaWRTdGF0ZUV4Y2VwdGlvbignTWlzc2luZyBwcmVzZW50ZXIgJiBhY3Rpb24gaW4gcm91dGUgZGVmaW5pdGlvbi4nKTt9JHByZXNlbnRlcj0kcGFyYW1zW3NlbGY6OlBSRVNFTlRFUl9LRVldO2lmKCRhPXN0cnJwb3MoJHByZXNlbnRlciwnOicpKXskcGFyYW1zW3NlbGY6OlBSRVNFTlRFUl9LRVldPXN1YnN0cigkcHJlc2VudGVyLCRhKzEpOyRwcmVzZW50ZXI9c3Vic3RyKCRwcmVzZW50ZXIsMCwkYSk7fXJldHVybgpuZXcKTlByZXNlbnRlclJlcXVlc3QoJHByZXNlbnRlciwnQ0xJJywkcGFyYW1zKTt9ZnVuY3Rpb24KY29uc3RydWN0VXJsKE5QcmVzZW50ZXJSZXF1ZXN0JGFwcFJlcXVlc3QsSUh0dHBSZXF1ZXN0JGh0dHBSZXF1ZXN0KXtyZXR1cm4KTlVMTDt9ZnVuY3Rpb24KZ2V0RGVmYXVsdHMoKXtyZXR1cm4kdGhpcy0+ZGVmYXVsdHM7fX1hYnN0cmFjdApjbGFzcwpOQ29sbGVjdGlvbgpleHRlbmRzCkFycmF5T2JqZWN0CmltcGxlbWVudHMKSUNvbGxlY3Rpb257cHJpdmF0ZSRpdGVtVHlwZTtwcml2YXRlJGNoZWNrRnVuYztwcml2YXRlJGZyb3plbj1GQUxTRTtmdW5jdGlvbgpfX2NvbnN0cnVjdCgkYXJyPU5VTEwsJHR5cGU9TlVMTCl7aWYoc3Vic3RyKCR0eXBlLDAsMSk9PT0nOicpeyR0aGlzLT5pdGVtVHlwZT1zdWJzdHIoJHR5cGUsMSk7JHRoaXMtPmNoZWNrRnVuYz0naXNfJy4kdGhpcy0+aXRlbVR5cGU7fWVsc2V7JHRoaXMtPml0ZW1UeXBlPSR0eXBlO31pZigkYXJyIT09TlVMTCl7JHRoaXMtPmltcG9ydCgkYXJyKTt9fWZ1bmN0aW9uCmFwcGVuZCgkaXRlbSl7JHRoaXMtPmJlZm9yZUFkZCgkaXRlbSk7cGFyZW50OjphcHBlbmQoJGl0ZW0pO31mdW5jdGlvbgpyZW1vdmUoJGl0ZW0peyR0aGlzLT51cGRhdGluZygpOyRpbmRleD0kdGhpcy0+c2VhcmNoKCRpdGVtKTtpZigkaW5kZXg9PT1GQUxTRSl7cmV0dXJuCkZBTFNFO31lbHNle3BhcmVudDo6b2Zmc2V0VW5zZXQoJGluZGV4KTtyZXR1cm4KVFJVRTt9fXByb3RlY3RlZApmdW5jdGlvbgpzZWFyY2goJGl0ZW0pe3JldHVybgphcnJheV9zZWFyY2goJGl0ZW0sJHRoaXMtPmdldEFycmF5Q29weSgpLFRSVUUpO31mdW5jdGlvbgpjbGVhcigpeyR0aGlzLT51cGRhdGluZygpO3BhcmVudDo6ZXhjaGFuZ2VBcnJheShhcnJheSgpKTt9ZnVuY3Rpb24KY29udGFpbnMoJGl0ZW0pe3JldHVybiR0aGlzLT5zZWFyY2goJGl0ZW0pIT09RkFMU0U7fWZ1bmN0aW9uCmltcG9ydCgkYXJyKXtpZighKGlzX2FycmF5KCRhcnIpfHwkYXJyCmluc3RhbmNlb2YKVHJhdmVyc2FibGUpKXt0aHJvdwpuZXcKSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJBcmd1bWVudCBtdXN0IGJlIHRyYXZlcnNhYmxlLiIpO30kdGhpcy0+Y2xlYXIoKTtmb3JlYWNoKCRhcnIKYXMkaXRlbSl7JHRoaXMtPm9mZnNldFNldChOVUxMLCRpdGVtKTt9fWZ1bmN0aW9uCmdldEl0ZW1UeXBlKCl7cmV0dXJuJHRoaXMtPml0ZW1UeXBlO31mdW5jdGlvbgpzZXRSZWFkT25seSgpe3Rocm93Cm5ldwpEZXByZWNhdGVkRXhjZXB0aW9uKF9fTUVUSE9EX18uJygpIGlzIGRlcHJlY2F0ZWQ7IHVzZSBmcmVlemUoKSBpbnN0ZWFkLicpO31mdW5jdGlvbgppc1JlYWRPbmx5KCl7dGhyb3cKbmV3CkRlcHJlY2F0ZWRFeGNlcHRpb24oX19NRVRIT0RfXy4nKCkgaXMgZGVwcmVjYXRlZDsgdXNlIGlzRnJvemVuKCkgaW5zdGVhZC4nKTt9cHJvdGVjdGVkCmZ1bmN0aW9uCmJlZm9yZUFkZCgkaXRlbSl7JHRoaXMtPnVwZGF0aW5nKCk7aWYoJHRoaXMtPml0ZW1UeXBlIT09TlVMTCl7aWYoJHRoaXMtPmNoZWNrRnVuYz09PU5VTEwpe2lmKCEoJGl0ZW0KaW5zdGFuY2VvZiR0aGlzLT5pdGVtVHlwZSkpe3Rocm93Cm5ldwpJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIkl0ZW0gbXVzdCBiZSAnJHRoaXMtPml0ZW1UeXBlJyBvYmplY3QuIik7fX1lbHNleyRmbmM9JHRoaXMtPmNoZWNrRnVuYztpZighJGZuYygkaXRlbSkpe3Rocm93Cm5ldwpJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIkl0ZW0gbXVzdCBiZSAkdGhpcy0+aXRlbVR5cGUgdHlwZS4iKTt9fX19ZnVuY3Rpb24KZ2V0SXRlcmF0b3IoKXtyZXR1cm4KbmV3CkFycmF5SXRlcmF0b3IoJHRoaXMtPmdldEFycmF5Q29weSgpKTt9ZnVuY3Rpb24KZXhjaGFuZ2VBcnJheSgkYXJyYXkpe3Rocm93Cm5ldwpOb3RTdXBwb3J0ZWRFeGNlcHRpb24oJ1VzZSAnLl9fQ0xBU1NfXy4nOjppbXBvcnQoKScpO31wcm90ZWN0ZWQKZnVuY3Rpb24Kc2V0QXJyYXkoJGFycmF5KXtwYXJlbnQ6OmV4Y2hhbmdlQXJyYXkoJGFycmF5KTtyZXR1cm4kdGhpczt9ZnVuY3Rpb24KZ2V0UmVmbGVjdGlvbigpe3JldHVybgpuZXcKTkNsYXNzUmVmbGVjdGlvbigkdGhpcyk7fWZ1bmN0aW9uCl9fY2FsbCgkbmFtZSwkYXJncyl7cmV0dXJuCk5PYmplY3RNaXhpbjo6Y2FsbCgkdGhpcywkbmFtZSwkYXJncyk7fXN0YXRpYwpmdW5jdGlvbgpfX2NhbGxTdGF0aWMoJG5hbWUsJGFyZ3MpeyRjbGFzcz1nZXRfY2FsbGVkX2NsYXNzKCk7dGhyb3cKbmV3Ck1lbWJlckFjY2Vzc0V4Y2VwdGlvbigiQ2FsbCB0byB1bmRlZmluZWQgc3RhdGljIG1ldGhvZCAkY2xhc3M6OiRuYW1lKCkuIik7fWZ1bmN0aW9uJl9fZ2V0KCRuYW1lKXtyZXR1cm4KTk9iamVjdE1peGluOjpnZXQoJHRoaXMsJG5hbWUpO31mdW5jdGlvbgpfX3NldCgkbmFtZSwkdmFsdWUpe3JldHVybgpOT2JqZWN0TWl4aW46OnNldCgkdGhpcywkbmFtZSwkdmFsdWUpO31mdW5jdGlvbgpfX2lzc2V0KCRuYW1lKXtyZXR1cm4KTk9iamVjdE1peGluOjpoYXMoJHRoaXMsJG5hbWUpO31mdW5jdGlvbgpfX3Vuc2V0KCRuYW1lKXt0aHJvdwpuZXcKTWVtYmVyQWNjZXNzRXhjZXB0aW9uKCJDYW5ub3QgdW5zZXQgdGhlIHByb3BlcnR5IHskdGhpcy0+cmVmbGVjdGlvbi0+bmFtZX06OlwkJG5hbWUuIik7fWZ1bmN0aW9uCmZyZWV6ZSgpeyR0aGlzLT5mcm96ZW49VFJVRTt9ZmluYWwKZnVuY3Rpb24KaXNGcm96ZW4oKXtyZXR1cm4kdGhpcy0+ZnJvemVuO31mdW5jdGlvbgpfX2Nsb25lKCl7JHRoaXMtPmZyb3plbj1GQUxTRTt9cHJvdGVjdGVkCmZ1bmN0aW9uCnVwZGF0aW5nKCl7aWYoJHRoaXMtPmZyb3plbil7JGNsYXNzPWdldF9jbGFzcygkdGhpcyk7dGhyb3cKbmV3CkludmFsaWRTdGF0ZUV4Y2VwdGlvbigiQ2Fubm90IG1vZGlmeSBhIGZyb3plbiBvYmplY3QgJyRjbGFzcycuIik7fX19Y2xhc3MKTkFycmF5TGlzdApleHRlbmRzCk5Db2xsZWN0aW9uCmltcGxlbWVudHMKSUxpc3R7cHJvdGVjdGVkJGJhc2U9MDtmdW5jdGlvbgppbnNlcnRBdCgkaW5kZXgsJGl0ZW0peyRpbmRleC09JHRoaXMtPmJhc2U7aWYoJGluZGV4PDB8fCRpbmRleD5jb3VudCgkdGhpcykpe3Rocm93Cm5ldwpBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb247fSR0aGlzLT5iZWZvcmVBZGQoJGl0ZW0pOyRkYXRhPSR0aGlzLT5nZXRBcnJheUNvcHkoKTthcnJheV9zcGxpY2UoJGRhdGEsKGludCkkaW5kZXgsMCxhcnJheSgkaXRlbSkpOyR0aGlzLT5zZXRBcnJheSgkZGF0YSk7cmV0dXJuClRSVUU7fWZ1bmN0aW9uCnJlbW92ZSgkaXRlbSl7JHRoaXMtPnVwZGF0aW5nKCk7JGluZGV4PSR0aGlzLT5zZWFyY2goJGl0ZW0pO2lmKCRpbmRleD09PUZBTFNFKXtyZXR1cm4KRkFMU0U7fWVsc2V7JGRhdGE9JHRoaXMtPmdldEFycmF5Q29weSgpO2FycmF5X3NwbGljZSgkZGF0YSwkaW5kZXgsMSk7JHRoaXMtPnNldEFycmF5KCRkYXRhKTtyZXR1cm4KVFJVRTt9fWZ1bmN0aW9uCmluZGV4T2YoJGl0ZW0peyRpbmRleD0kdGhpcy0+c2VhcmNoKCRpdGVtKTtyZXR1cm4kaW5kZXg9PT1GQUxTRT9GQUxTRTokdGhpcy0+YmFzZSskaW5kZXg7fWZ1bmN0aW9uCm9mZnNldFNldCgkaW5kZXgsJGl0ZW0peyR0aGlzLT5iZWZvcmVBZGQoJGl0ZW0pO2lmKCRpbmRleD09PU5VTEwpe3BhcmVudDo6b2Zmc2V0U2V0KE5VTEwsJGl0ZW0pO31lbHNleyRpbmRleC09JHRoaXMtPmJhc2U7aWYoJGluZGV4PDB8fCRpbmRleD49Y291bnQoJHRoaXMpKXt0aHJvdwpuZXcKQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uO31wYXJlbnQ6Om9mZnNldFNldCgkaW5kZXgsJGl0ZW0pO319ZnVuY3Rpb24Kb2Zmc2V0R2V0KCRpbmRleCl7JGluZGV4LT0kdGhpcy0+YmFzZTtpZigkaW5kZXg8MHx8JGluZGV4Pj1jb3VudCgkdGhpcykpe3Rocm93Cm5ldwpBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb247fXJldHVybgpwYXJlbnQ6Om9mZnNldEdldCgkaW5kZXgpO31mdW5jdGlvbgpvZmZzZXRFeGlzdHMoJGluZGV4KXskaW5kZXgtPSR0aGlzLT5iYXNlO3JldHVybiRpbmRleD49MCYmJGluZGV4PGNvdW50KCR0aGlzKTt9ZnVuY3Rpb24Kb2Zmc2V0VW5zZXQoJGluZGV4KXskdGhpcy0+dXBkYXRpbmcoKTskaW5kZXgtPSR0aGlzLT5iYXNlO2lmKCRpbmRleDwwfHwkaW5kZXg+PWNvdW50KCR0aGlzKSl7dGhyb3cKbmV3CkFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbjt9JGRhdGE9JHRoaXMtPmdldEFycmF5Q29weSgpO2FycmF5X3NwbGljZSgkZGF0YSwoaW50KSRpbmRleCwxKTskdGhpcy0+c2V0QXJyYXkoJGRhdGEpO319Y2xhc3MKTk11bHRpUm91dGVyCmV4dGVuZHMKTkFycmF5TGlzdAppbXBsZW1lbnRzCklSb3V0ZXJ7cHJpdmF0ZSRjYWNoZWRSb3V0ZXM7ZnVuY3Rpb24KX19jb25zdHJ1Y3QoKXtwYXJlbnQ6Ol9fY29uc3RydWN0KE5VTEwsJ0lSb3V0ZXInKTt9ZnVuY3Rpb24KbWF0Y2goSUh0dHBSZXF1ZXN0JGh0dHBSZXF1ZXN0KXtmb3JlYWNoKCR0aGlzCmFzJHJvdXRlKXskYXBwUmVxdWVzdD0kcm91dGUtPm1hdGNoKCRodHRwUmVxdWVzdCk7aWYoJGFwcFJlcXVlc3QhPT1OVUxMKXtyZXR1cm4kYXBwUmVxdWVzdDt9fXJldHVybgpOVUxMO31mdW5jdGlvbgpjb25zdHJ1Y3RVcmwoTlByZXNlbnRlclJlcXVlc3QkYXBwUmVxdWVzdCxJSHR0cFJlcXVlc3QkaHR0cFJlcXVlc3Qpe2lmKCR0aGlzLT5jYWNoZWRSb3V0ZXM9PT1OVUxMKXskcm91dGVzPWFycmF5KCk7JHJvdXRlc1snKiddPWFycmF5KCk7Zm9yZWFjaCgkdGhpcwphcyRyb3V0ZSl7JHByZXNlbnRlcj0kcm91dGUKaW5zdGFuY2VvZgpOUm91dGU/JHJvdXRlLT5nZXRUYXJnZXRQcmVzZW50ZXIoKTpOVUxMO2lmKCRwcmVzZW50ZXI9PT1GQUxTRSljb250aW51ZTtpZihpc19zdHJpbmcoJHByZXNlbnRlcikpeyRwcmVzZW50ZXI9c3RydG9sb3dlcigkcHJlc2VudGVyKTtpZighaXNzZXQoJHJvdXRlc1skcHJlc2VudGVyXSkpeyRyb3V0ZXNbJHByZXNlbnRlcl09JHJvdXRlc1snKiddO30kcm91dGVzWyRwcmVzZW50ZXJdW109JHJvdXRlO31lbHNle2ZvcmVhY2goJHJvdXRlcwphcyRpZD0+JGZvbyl7JHJvdXRlc1skaWRdW109JHJvdXRlO319fSR0aGlzLT5jYWNoZWRSb3V0ZXM9JHJvdXRlczt9JHByZXNlbnRlcj1zdHJ0b2xvd2VyKCRhcHBSZXF1ZXN0LT5nZXRQcmVzZW50ZXJOYW1lKCkpO2lmKCFpc3NldCgkdGhpcy0+Y2FjaGVkUm91dGVzWyRwcmVzZW50ZXJdKSkkcHJlc2VudGVyPScqJztmb3JlYWNoKCR0aGlzLT5jYWNoZWRSb3V0ZXNbJHByZXNlbnRlcl1hcyRyb3V0ZSl7JHVyaT0kcm91dGUtPmNvbnN0cnVjdFVybCgkYXBwUmVxdWVzdCwkaHR0cFJlcXVlc3QpO2lmKCR1cmkhPT1OVUxMKXtyZXR1cm4kdXJpO319cmV0dXJuCk5VTEw7fX1jbGFzcwpOUm91dGUKZXh0ZW5kcwpOT2JqZWN0CmltcGxlbWVudHMKSVJvdXRlcntjb25zdApQUkVTRU5URVJfS0VZPSdwcmVzZW50ZXInO2NvbnN0Ck1PRFVMRV9LRVk9J21vZHVsZSc7Y29uc3QKQ0FTRV9TRU5TSVRJVkU9MjU2O2NvbnN0CkZVTExfTUVUQT0xMjg7Y29uc3QKSE9TVD0xO2NvbnN0ClBBVEg9Mjtjb25zdApSRUxBVElWRT0zO2NvbnN0ClZBTFVFPSd2YWx1ZSc7Y29uc3QKUEFUVEVSTj0ncGF0dGVybic7Y29uc3QKRklMVEVSX0lOPSdmaWx0ZXJJbic7Y29uc3QKRklMVEVSX09VVD0nZmlsdGVyT3V0Jztjb25zdApGSUxURVJfVEFCTEU9J2ZpbHRlclRhYmxlJztjb25zdApPUFRJT05BTD0wO2NvbnN0ClBBVEhfT1BUSU9OQUw9MTtjb25zdApDT05TVEFOVD0yO3B1YmxpYwpzdGF0aWMkZGVmYXVsdEZsYWdzPTA7cHVibGljCnN0YXRpYyRzdHlsZXM9YXJyYXkoJyMnPT5hcnJheShzZWxmOjpQQVRURVJOPT4nW14vXSsnLHNlbGY6OkZJTFRFUl9JTj0+J3Jhd3VybGRlY29kZScsc2VsZjo6RklMVEVSX09VVD0+J3Jhd3VybGVuY29kZScpLCc/Iyc9PmFycmF5KCksJ21vZHVsZSc9PmFycmF5KHNlbGY6OlBBVFRFUk49PidbYS16XVthLXowLTkuLV0qJyxzZWxmOjpGSUxURVJfSU49PmFycmF5KF9fQ0xBU1NfXywncGF0aDJwcmVzZW50ZXInKSxzZWxmOjpGSUxURVJfT1VUPT5hcnJheShfX0NMQVNTX18sJ3ByZXNlbnRlcjJwYXRoJykpLCdwcmVzZW50ZXInPT5hcnJheShzZWxmOjpQQVRURVJOPT4nW2Etel1bYS16MC05Li1dKicsc2VsZjo6RklMVEVSX0lOPT5hcnJheShfX0NMQVNTX18sJ3BhdGgycHJlc2VudGVyJyksc2VsZjo6RklMVEVSX09VVD0+YXJyYXkoX19DTEFTU19fLCdwcmVzZW50ZXIycGF0aCcpKSwnYWN0aW9uJz0+YXJyYXkoc2VsZjo6UEFUVEVSTj0+J1thLXpdW2EtejAtOS1dKicsc2VsZjo6RklMVEVSX0lOPT5hcnJheShfX0NMQVNTX18sJ3BhdGgyYWN0aW9uJyksc2VsZjo6RklMVEVSX09VVD0+YXJyYXkoX19DTEFTU19fLCdhY3Rpb24ycGF0aCcpKSwnP21vZHVsZSc9PmFycmF5KCksJz9wcmVzZW50ZXInPT5hcnJheSgpLCc/YWN0aW9uJz0+YXJyYXkoKSk7cHJpdmF0ZSRtYXNrO3ByaXZhdGUkc2VxdWVuY2U7cHJpdmF0ZSRyZTtwcml2YXRlJG1ldGFkYXRhPWFycmF5KCk7cHJpdmF0ZSR4bGF0O3ByaXZhdGUkdHlwZTtwcml2YXRlJGZsYWdzO2Z1bmN0aW9uCl9fY29uc3RydWN0KCRtYXNrLGFycmF5JG1ldGFkYXRhPWFycmF5KCksJGZsYWdzPTApeyR0aGlzLT5mbGFncz0kZmxhZ3N8c2VsZjo6JGRlZmF1bHRGbGFncztpZighKCR0aGlzLT5mbGFncyZzZWxmOjpGVUxMX01FVEEpKXtmb3JlYWNoKCRtZXRhZGF0YQphcyRuYW1lPT4kZGVmKXskbWV0YWRhdGFbJG5hbWVdPWlzX2FycmF5KCRkZWYpPyRkZWY6YXJyYXkoc2VsZjo6VkFMVUU9PiRkZWYpO319JHRoaXMtPnNldE1hc2soJG1hc2ssJG1ldGFkYXRhKTt9ZnVuY3Rpb24KbWF0Y2goSUh0dHBSZXF1ZXN0JGh0dHBSZXF1ZXN0KXskdXJpPSRodHRwUmVxdWVzdC0+Z2V0VXJpKCk7aWYoJHRoaXMtPnR5cGU9PT1zZWxmOjpIT1NUKXskcGF0aD0nLy8nLiR1cmktPmdldEhvc3QoKS4kdXJpLT5nZXRQYXRoKCk7fWVsc2VpZigkdGhpcy0+dHlwZT09PXNlbGY6OlJFTEFUSVZFKXskYmFzZVBhdGg9JHVyaS0+Z2V0QmFzZVBhdGgoKTtpZihzdHJuY21wKCR1cmktPmdldFBhdGgoKSwkYmFzZVBhdGgsc3RybGVuKCRiYXNlUGF0aCkpIT09MCl7cmV0dXJuCk5VTEw7fSRwYXRoPShzdHJpbmcpc3Vic3RyKCR1cmktPmdldFBhdGgoKSxzdHJsZW4oJGJhc2VQYXRoKSk7fWVsc2V7JHBhdGg9JHVyaS0+Z2V0UGF0aCgpO31pZigkcGF0aCE9PScnKXskcGF0aD1ydHJpbSgkcGF0aCwnLycpLicvJzt9aWYoIXByZWdfbWF0Y2goJHRoaXMtPnJlLCRwYXRoLCRtYXRjaGVzKSl7cmV0dXJuCk5VTEw7fSRwYXJhbXM9YXJyYXkoKTtmb3JlYWNoKCRtYXRjaGVzCmFzJGs9PiR2KXtpZihpc19zdHJpbmcoJGspJiYkdiE9PScnKXskcGFyYW1zW3N0cl9yZXBsYWNlKCdfX18nLCctJywkayldPSR2O319Zm9yZWFjaCgkdGhpcy0+bWV0YWRhdGEKYXMkbmFtZT0+JG1ldGEpe2lmKGlzc2V0KCRwYXJhbXNbJG5hbWVdKSl7fWVsc2VpZihpc3NldCgkbWV0YVsnZml4aXR5J10pJiYkbWV0YVsnZml4aXR5J10hPT1zZWxmOjpPUFRJT05BTCl7JHBhcmFtc1skbmFtZV09TlVMTDt9fWlmKCR0aGlzLT54bGF0KXskcGFyYW1zKz1zZWxmOjpyZW5hbWVLZXlzKCRodHRwUmVxdWVzdC0+Z2V0UXVlcnkoKSxhcnJheV9mbGlwKCR0aGlzLT54bGF0KSk7fWVsc2V7JHBhcmFtcys9JGh0dHBSZXF1ZXN0LT5nZXRRdWVyeSgpO31mb3JlYWNoKCR0aGlzLT5tZXRhZGF0YQphcyRuYW1lPT4kbWV0YSl7aWYoaXNzZXQoJHBhcmFtc1skbmFtZV0pKXtpZighaXNfc2NhbGFyKCRwYXJhbXNbJG5hbWVdKSl7fWVsc2VpZihpc3NldCgkbWV0YVtzZWxmOjpGSUxURVJfVEFCTEVdWyRwYXJhbXNbJG5hbWVdXSkpeyRwYXJhbXNbJG5hbWVdPSRtZXRhW3NlbGY6OkZJTFRFUl9UQUJMRV1bJHBhcmFtc1skbmFtZV1dO31lbHNlaWYoaXNzZXQoJG1ldGFbc2VsZjo6RklMVEVSX0lOXSkpeyRwYXJhbXNbJG5hbWVdPWNhbGxfdXNlcl9mdW5jKCRtZXRhW3NlbGY6OkZJTFRFUl9JTl0sKHN0cmluZykkcGFyYW1zWyRuYW1lXSk7aWYoJHBhcmFtc1skbmFtZV09PT1OVUxMJiYhaXNzZXQoJG1ldGFbJ2ZpeGl0eSddKSl7cmV0dXJuCk5VTEw7fX19ZWxzZWlmKGlzc2V0KCRtZXRhWydmaXhpdHknXSkpeyRwYXJhbXNbJG5hbWVdPSRtZXRhW3NlbGY6OlZBTFVFXTt9fWlmKCFpc3NldCgkcGFyYW1zW3NlbGY6OlBSRVNFTlRFUl9LRVldKSl7dGhyb3cKbmV3CkludmFsaWRTdGF0ZUV4Y2VwdGlvbignTWlzc2luZyBwcmVzZW50ZXIgaW4gcm91dGUgZGVmaW5pdGlvbi4nKTt9aWYoaXNzZXQoJHRoaXMtPm1ldGFkYXRhW3NlbGY6Ok1PRFVMRV9LRVldKSl7aWYoIWlzc2V0KCRwYXJhbXNbc2VsZjo6TU9EVUxFX0tFWV0pKXt0aHJvdwpuZXcKSW52YWxpZFN0YXRlRXhjZXB0aW9uKCdNaXNzaW5nIG1vZHVsZSBpbiByb3V0ZSBkZWZpbml0aW9uLicpO30kcHJlc2VudGVyPSRwYXJhbXNbc2VsZjo6TU9EVUxFX0tFWV0uJzonLiRwYXJhbXNbc2VsZjo6UFJFU0VOVEVSX0tFWV07dW5zZXQoJHBhcmFtc1tzZWxmOjpNT0RVTEVfS0VZXSwkcGFyYW1zW3NlbGY6OlBSRVNFTlRFUl9LRVldKTt9ZWxzZXskcHJlc2VudGVyPSRwYXJhbXNbc2VsZjo6UFJFU0VOVEVSX0tFWV07dW5zZXQoJHBhcmFtc1tzZWxmOjpQUkVTRU5URVJfS0VZXSk7fXJldHVybgpuZXcKTlByZXNlbnRlclJlcXVlc3QoJHByZXNlbnRlciwkaHR0cFJlcXVlc3QtPmdldE1ldGhvZCgpLCRwYXJhbXMsJGh0dHBSZXF1ZXN0LT5nZXRQb3N0KCksJGh0dHBSZXF1ZXN0LT5nZXRGaWxlcygpLGFycmF5KE5QcmVzZW50ZXJSZXF1ZXN0OjpTRUNVUkVEPT4kaHR0cFJlcXVlc3QtPmlzU2VjdXJlZCgpKSk7fWZ1bmN0aW9uCmNvbnN0cnVjdFVybChOUHJlc2VudGVyUmVxdWVzdCRhcHBSZXF1ZXN0LElIdHRwUmVxdWVzdCRodHRwUmVxdWVzdCl7aWYoJHRoaXMtPmZsYWdzJnNlbGY6Ok9ORV9XQVkpe3JldHVybgpOVUxMO30kcGFyYW1zPSRhcHBSZXF1ZXN0LT5nZXRQYXJhbXMoKTskbWV0YWRhdGE9JHRoaXMtPm1ldGFkYXRhOyRwcmVzZW50ZXI9JGFwcFJlcXVlc3QtPmdldFByZXNlbnRlck5hbWUoKTskcGFyYW1zW3NlbGY6OlBSRVNFTlRFUl9LRVldPSRwcmVzZW50ZXI7aWYoaXNzZXQoJG1ldGFkYXRhW3NlbGY6Ok1PRFVMRV9LRVldKSl7JG1vZHVsZT0kbWV0YWRhdGFbc2VsZjo6TU9EVUxFX0tFWV07aWYoaXNzZXQoJG1vZHVsZVsnZml4aXR5J10pJiZzdHJuY2FzZWNtcCgkcHJlc2VudGVyLCRtb2R1bGVbc2VsZjo6VkFMVUVdLic6JyxzdHJsZW4oJG1vZHVsZVtzZWxmOjpWQUxVRV0pKzEpPT09MCl7JGE9c3RybGVuKCRtb2R1bGVbc2VsZjo6VkFMVUVdKTt9ZWxzZXskYT1zdHJycG9zKCRwcmVzZW50ZXIsJzonKTt9aWYoJGE9PT1GQUxTRSl7JHBhcmFtc1tzZWxmOjpNT0RVTEVfS0VZXT0nJzt9ZWxzZXskcGFyYW1zW3NlbGY6Ok1PRFVMRV9LRVldPXN1YnN0cigkcHJlc2VudGVyLDAsJGEpOyRwYXJhbXNbc2VsZjo6UFJFU0VOVEVSX0tFWV09c3Vic3RyKCRwcmVzZW50ZXIsJGErMSk7fX1mb3JlYWNoKCRtZXRhZGF0YQphcyRuYW1lPT4kbWV0YSl7aWYoIWlzc2V0KCRwYXJhbXNbJG5hbWVdKSljb250aW51ZTtpZihpc3NldCgkbWV0YVsnZml4aXR5J10pKXtpZihpc19zY2FsYXIoJHBhcmFtc1skbmFtZV0pJiZzdHJjYXNlY21wKCRwYXJhbXNbJG5hbWVdLCRtZXRhW3NlbGY6OlZBTFVFXSk9PT0wKXt1bnNldCgkcGFyYW1zWyRuYW1lXSk7Y29udGludWU7fWVsc2VpZigkbWV0YVsnZml4aXR5J109PT1zZWxmOjpDT05TVEFOVCl7cmV0dXJuCk5VTEw7fX1pZighaXNfc2NhbGFyKCRwYXJhbXNbJG5hbWVdKSl7fWVsc2VpZihpc3NldCgkbWV0YVsnZmlsdGVyVGFibGUyJ11bJHBhcmFtc1skbmFtZV1dKSl7JHBhcmFtc1skbmFtZV09JG1ldGFbJ2ZpbHRlclRhYmxlMiddWyRwYXJhbXNbJG5hbWVdXTt9ZWxzZWlmKGlzc2V0KCRtZXRhW3NlbGY6OkZJTFRFUl9PVVRdKSl7JHBhcmFtc1skbmFtZV09Y2FsbF91c2VyX2Z1bmMoJG1ldGFbc2VsZjo6RklMVEVSX09VVF0sJHBhcmFtc1skbmFtZV0pO31pZihpc3NldCgkbWV0YVtzZWxmOjpQQVRURVJOXSkmJiFwcmVnX21hdGNoKCRtZXRhW3NlbGY6OlBBVFRFUk5dLHJhd3VybGRlY29kZSgkcGFyYW1zWyRuYW1lXSkpKXtyZXR1cm4KTlVMTDt9fSRzZXF1ZW5jZT0kdGhpcy0+c2VxdWVuY2U7JGJyYWNrZXRzPWFycmF5KCk7JHJlcXVpcmVkPTA7JHVyaT0nJzskaT1jb3VudCgkc2VxdWVuY2UpLTE7ZG97JHVyaT0kc2VxdWVuY2VbJGldLiR1cmk7aWYoJGk9PT0wKWJyZWFrOyRpLS07JG5hbWU9JHNlcXVlbmNlWyRpXTskaS0tO2lmKCRuYW1lPT09J10nKXskYnJhY2tldHNbXT0kdXJpO31lbHNlaWYoJG5hbWVbMF09PT0nWycpeyR0bXA9YXJyYXlfcG9wKCRicmFja2V0cyk7aWYoJHJlcXVpcmVkPGNvdW50KCRicmFja2V0cykrMSl7aWYoJG5hbWUhPT0nWyEnKXskdXJpPSR0bXA7fX1lbHNleyRyZXF1aXJlZD1jb3VudCgkYnJhY2tldHMpO319ZWxzZWlmKCRuYW1lWzBdPT09Jz8nKXtjb250aW51ZTt9ZWxzZWlmKGlzc2V0KCRwYXJhbXNbJG5hbWVdKSYmJHBhcmFtc1skbmFtZV0hPScnKXskcmVxdWlyZWQ9Y291bnQoJGJyYWNrZXRzKTskdXJpPSRwYXJhbXNbJG5hbWVdLiR1cmk7dW5zZXQoJHBhcmFtc1skbmFtZV0pO31lbHNlaWYoaXNzZXQoJG1ldGFkYXRhWyRuYW1lXVsnZml4aXR5J10pKXskdXJpPSRtZXRhZGF0YVskbmFtZV1bJ2RlZk91dCddLiR1cmk7fWVsc2V7cmV0dXJuCk5VTEw7fX13aGlsZShUUlVFKTtpZigkdGhpcy0+eGxhdCl7JHBhcmFtcz1zZWxmOjpyZW5hbWVLZXlzKCRwYXJhbXMsJHRoaXMtPnhsYXQpO30kc2VwPWluaV9nZXQoJ2FyZ19zZXBhcmF0b3IuaW5wdXQnKTskcXVlcnk9aHR0cF9idWlsZF9xdWVyeSgkcGFyYW1zLCcnLCRzZXA/JHNlcFswXTonJicpO2lmKCRxdWVyeSE9JycpJHVyaS49Jz8nLiRxdWVyeTtpZigkdGhpcy0+dHlwZT09PXNlbGY6OlJFTEFUSVZFKXskdXJpPScvLycuJGh0dHBSZXF1ZXN0LT5nZXRVcmkoKS0+Z2V0QXV0aG9yaXR5KCkuJGh0dHBSZXF1ZXN0LT5nZXRVcmkoKS0+Z2V0QmFzZVBhdGgoKS4kdXJpO31lbHNlaWYoJHRoaXMtPnR5cGU9PT1zZWxmOjpQQVRIKXskdXJpPScvLycuJGh0dHBSZXF1ZXN0LT5nZXRVcmkoKS0+Z2V0QXV0aG9yaXR5KCkuJHVyaTt9aWYoc3RycG9zKCR1cmksJy8vJywyKSE9PUZBTFNFKXtyZXR1cm4KTlVMTDt9JHVyaT0oJHRoaXMtPmZsYWdzJnNlbGY6OlNFQ1VSRUQ/J2h0dHBzOic6J2h0dHA6JykuJHVyaTtyZXR1cm4kdXJpO31wcml2YXRlCmZ1bmN0aW9uCnNldE1hc2soJG1hc2ssYXJyYXkkbWV0YWRhdGEpeyR0aGlzLT5tYXNrPSRtYXNrO2lmKHN1YnN0cigkbWFzaywwLDIpPT09Jy8vJyl7JHRoaXMtPnR5cGU9c2VsZjo6SE9TVDt9ZWxzZWlmKHN1YnN0cigkbWFzaywwLDEpPT09Jy8nKXskdGhpcy0+dHlwZT1zZWxmOjpQQVRIO31lbHNleyR0aGlzLT50eXBlPXNlbGY6OlJFTEFUSVZFO31mb3JlYWNoKCRtZXRhZGF0YQphcyRuYW1lPT4kbWV0YSl7aWYoYXJyYXlfa2V5X2V4aXN0cyhzZWxmOjpWQUxVRSwkbWV0YSkpeyRtZXRhZGF0YVskbmFtZV1bJ2ZpeGl0eSddPXNlbGY6OkNPTlNUQU5UO319JHBhcnRzPXByZWdfc3BsaXQoJy88KFtePiMgXSspICooW14+I10qKSgjP1tePlxbXF1dKik+fChcWyE/fFxdfFxzKlw/LiopLycsJG1hc2ssLTEsUFJFR19TUExJVF9ERUxJTV9DQVBUVVJFKTskdGhpcy0+eGxhdD1hcnJheSgpOyRpPWNvdW50KCRwYXJ0cyktMTtpZihpc3NldCgkcGFydHNbJGktMV0pJiZzdWJzdHIobHRyaW0oJHBhcnRzWyRpLTFdKSwwLDEpPT09Jz8nKXtwcmVnX21hdGNoX2FsbCgnLyg/OihbYS16QS1aMC05Xy4tXSspPSk/PChbXj4jIF0rKSAqKFtePiNdKikoIz9bXj5dKik+LycsJHBhcnRzWyRpLTFdLCRtYXRjaGVzLFBSRUdfU0VUX09SREVSKTtmb3JlYWNoKCRtYXRjaGVzCmFzJG1hdGNoKXtsaXN0KCwkcGFyYW0sJG5hbWUsJHBhdHRlcm4sJGNsYXNzKT0kbWF0Y2g7aWYoJGNsYXNzIT09Jycpe2lmKCFpc3NldChzZWxmOjokc3R5bGVzWyRjbGFzc10pKXt0aHJvdwpuZXcKSW52YWxpZFN0YXRlRXhjZXB0aW9uKCJQYXJhbWV0ZXIgJyRuYW1lJyBoYXMgJyRjbGFzcycgZmxhZywgYnV0IFJvdXRlOjpcJHN0eWxlc1snJGNsYXNzJ10gaXMgbm90IHNldC4iKTt9JG1ldGE9c2VsZjo6JHN0eWxlc1skY2xhc3NdO31lbHNlaWYoaXNzZXQoc2VsZjo6JHN0eWxlc1snPycuJG5hbWVdKSl7JG1ldGE9c2VsZjo6JHN0eWxlc1snPycuJG5hbWVdO31lbHNleyRtZXRhPXNlbGY6OiRzdHlsZXNbJz8jJ107fWlmKGlzc2V0KCRtZXRhZGF0YVskbmFtZV0pKXskbWV0YT0kbWV0YWRhdGFbJG5hbWVdKyRtZXRhO31pZihhcnJheV9rZXlfZXhpc3RzKHNlbGY6OlZBTFVFLCRtZXRhKSl7JG1ldGFbJ2ZpeGl0eSddPXNlbGY6Ok9QVElPTkFMO311bnNldCgkbWV0YVsncGF0dGVybiddKTskbWV0YVsnZmlsdGVyVGFibGUyJ109ZW1wdHkoJG1ldGFbc2VsZjo6RklMVEVSX1RBQkxFXSk/TlVMTDphcnJheV9mbGlwKCRtZXRhW3NlbGY6OkZJTFRFUl9UQUJMRV0pOyRtZXRhZGF0YVskbmFtZV09JG1ldGE7aWYoJHBhcmFtIT09JycpeyR0aGlzLT54bGF0WyRuYW1lXT0kcGFyYW07fX0kaS09NTt9JGJyYWNrZXRzPTA7JHJlPScnOyRzZXF1ZW5jZT1hcnJheSgpOyRhdXRvT3B0aW9uYWw9YXJyYXkoMCwwKTtkb3thcnJheV91bnNoaWZ0KCRzZXF1ZW5jZSwkcGFydHNbJGldKTtpZihzdHJwb3MoJHBhcnRzWyRpXSwneycpIT09RkFMU0Upe3Rocm93Cm5ldwpEZXByZWNhdGVkRXhjZXB0aW9uKCdPcHRpb25hbCBwYXJ0cyBkZWxpbWl0ZWQgdXNpbmcgey4uLn0gYXJlIGRlcHJlY2F0ZWQ7IHVzZSBbLi4uXSBpbnN0ZWFkLicpO30kcmU9cHJlZ19xdW90ZSgkcGFydHNbJGldLCcjJykuJHJlO2lmKCRpPT09MClicmVhazskaS0tOyRwYXJ0PSRwYXJ0c1skaV07aWYoJHBhcnQ9PT0nWyd8fCRwYXJ0PT09J10nfHwkcGFydD09PSdbIScpeyRicmFja2V0cys9JHBhcnRbMF09PT0nWyc/LTE6MTtpZigkYnJhY2tldHM8MCl7dGhyb3cKbmV3CkludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiVW5leHBlY3RlZCAnJHBhcnQnIGluIG1hc2sgJyRtYXNrJy4iKTt9YXJyYXlfdW5zaGlmdCgkc2VxdWVuY2UsJHBhcnQpOyRyZT0oJHBhcnRbMF09PT0nWyc/Jyg/Oic6Jyk/JykuJHJlOyRpLT00O2NvbnRpbnVlO30kY2xhc3M9JHBhcnRzWyRpXTskaS0tOyRwYXR0ZXJuPXRyaW0oJHBhcnRzWyRpXSk7JGktLTskbmFtZT0kcGFydHNbJGldOyRpLS07YXJyYXlfdW5zaGlmdCgkc2VxdWVuY2UsJG5hbWUpO2lmKCRuYW1lWzBdPT09Jz8nKXskcmU9Jyg/OicucHJlZ19xdW90ZShzdWJzdHIoJG5hbWUsMSksJyMnKS4nfCcuJHBhdHRlcm4uJyknLiRyZTskc2VxdWVuY2VbMV09c3Vic3RyKCRuYW1lLDEpLiRzZXF1ZW5jZVsxXTtjb250aW51ZTt9aWYocHJlZ19tYXRjaCgnI1teYS16MC05Xy1dI2knLCRuYW1lKSl7dGhyb3cKbmV3CkludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiUGFyYW1ldGVyIG5hbWUgbXVzdCBiZSBhbHBoYW51bWVyaWMgc3RyaW5nIGR1ZSB0byBsaW1pdGF0aW9ucyBvZiBQQ1JFLCAnJG5hbWUnIGdpdmVuLiIpO31pZigkY2xhc3MhPT0nJyl7aWYoIWlzc2V0KHNlbGY6OiRzdHlsZXNbJGNsYXNzXSkpe3Rocm93Cm5ldwpJbnZhbGlkU3RhdGVFeGNlcHRpb24oIlBhcmFtZXRlciAnJG5hbWUnIGhhcyAnJGNsYXNzJyBmbGFnLCBidXQgUm91dGU6Olwkc3R5bGVzWyckY2xhc3MnXSBpcyBub3Qgc2V0LiIpO30kbWV0YT1zZWxmOjokc3R5bGVzWyRjbGFzc107fWVsc2VpZihpc3NldChzZWxmOjokc3R5bGVzWyRuYW1lXSkpeyRtZXRhPXNlbGY6OiRzdHlsZXNbJG5hbWVdO31lbHNleyRtZXRhPXNlbGY6OiRzdHlsZXNbJyMnXTt9aWYoaXNzZXQoJG1ldGFkYXRhWyRuYW1lXSkpeyRtZXRhPSRtZXRhZGF0YVskbmFtZV0rJG1ldGE7fWlmKCRwYXR0ZXJuPT0nJyYmaXNzZXQoJG1ldGFbc2VsZjo6UEFUVEVSTl0pKXskcGF0dGVybj0kbWV0YVtzZWxmOjpQQVRURVJOXTt9JG1ldGFbJ2ZpbHRlclRhYmxlMiddPWVtcHR5KCRtZXRhW3NlbGY6OkZJTFRFUl9UQUJMRV0pP05VTEw6YXJyYXlfZmxpcCgkbWV0YVtzZWxmOjpGSUxURVJfVEFCTEVdKTtpZihhcnJheV9rZXlfZXhpc3RzKHNlbGY6OlZBTFVFLCRtZXRhKSl7aWYoaXNzZXQoJG1ldGFbJ2ZpbHRlclRhYmxlMiddWyRtZXRhW3NlbGY6OlZBTFVFXV0pKXskbWV0YVsnZGVmT3V0J109JG1ldGFbJ2ZpbHRlclRhYmxlMiddWyRtZXRhW3NlbGY6OlZBTFVFXV07fWVsc2VpZihpc3NldCgkbWV0YVtzZWxmOjpGSUxURVJfT1VUXSkpeyRtZXRhWydkZWZPdXQnXT1jYWxsX3VzZXJfZnVuYygkbWV0YVtzZWxmOjpGSUxURVJfT1VUXSwkbWV0YVtzZWxmOjpWQUxVRV0pO31lbHNleyRtZXRhWydkZWZPdXQnXT0kbWV0YVtzZWxmOjpWQUxVRV07fX0kbWV0YVtzZWxmOjpQQVRURVJOXT0iIyg/OiRwYXR0ZXJuKSQjQSIuKCR0aGlzLT5mbGFncyZzZWxmOjpDQVNFX1NFTlNJVElWRT8nJzonaXUnKTskcmU9Jyg/UDwnLnN0cl9yZXBsYWNlKCctJywnX19fJywkbmFtZSkuJz4nLiRwYXR0ZXJuLicpJy4kcmU7aWYoJGJyYWNrZXRzKXtpZighaXNzZXQoJG1ldGFbc2VsZjo6VkFMVUVdKSl7JG1ldGFbc2VsZjo6VkFMVUVdPSRtZXRhWydkZWZPdXQnXT1OVUxMO30kbWV0YVsnZml4aXR5J109c2VsZjo6UEFUSF9PUFRJT05BTDt9ZWxzZWlmKGlzc2V0KCRtZXRhWydmaXhpdHknXSkpeyRyZT0nKD86Jy5zdWJzdHJfcmVwbGFjZSgkcmUsJyk/JyxzdHJsZW4oJHJlKS0kYXV0b09wdGlvbmFsWzBdLDApO2FycmF5X3NwbGljZSgkc2VxdWVuY2UsY291bnQoJHNlcXVlbmNlKS0kYXV0b09wdGlvbmFsWzFdLDAsYXJyYXkoJ10nLCcnKSk7YXJyYXlfdW5zaGlmdCgkc2VxdWVuY2UsJ1snLCcnKTskbWV0YVsnZml4aXR5J109c2VsZjo6UEFUSF9PUFRJT05BTDt9ZWxzZXskYXV0b09wdGlvbmFsPWFycmF5KHN0cmxlbigkcmUpLGNvdW50KCRzZXF1ZW5jZSkpO30kbWV0YWRhdGFbJG5hbWVdPSRtZXRhO313aGlsZShUUlVFKTtpZigkYnJhY2tldHMpe3Rocm93Cm5ldwpJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIk1pc3NpbmcgY2xvc2luZyAnXScgaW4gbWFzayAnJG1hc2snLiIpO30kdGhpcy0+cmU9JyMnLiRyZS4nLz8kI0EnLigkdGhpcy0+ZmxhZ3Mmc2VsZjo6Q0FTRV9TRU5TSVRJVkU/Jyc6J2l1Jyk7JHRoaXMtPm1ldGFkYXRhPSRtZXRhZGF0YTskdGhpcy0+c2VxdWVuY2U9JHNlcXVlbmNlO31mdW5jdGlvbgpnZXRNYXNrKCl7cmV0dXJuJHRoaXMtPm1hc2s7fWZ1bmN0aW9uCmdldERlZmF1bHRzKCl7JGRlZmF1bHRzPWFycmF5KCk7Zm9yZWFjaCgkdGhpcy0+bWV0YWRhdGEKYXMkbmFtZT0+JG1ldGEpe2lmKGlzc2V0KCRtZXRhWydmaXhpdHknXSkpeyRkZWZhdWx0c1skbmFtZV09JG1ldGFbc2VsZjo6VkFMVUVdO319cmV0dXJuJGRlZmF1bHRzO31mdW5jdGlvbgpnZXRUYXJnZXRQcmVzZW50ZXIoKXtpZigkdGhpcy0+ZmxhZ3Mmc2VsZjo6T05FX1dBWSl7cmV0dXJuCkZBTFNFO30kbT0kdGhpcy0+bWV0YWRhdGE7JG1vZHVsZT0nJztpZihpc3NldCgkbVtzZWxmOjpNT0RVTEVfS0VZXSkpe2lmKGlzc2V0KCRtW3NlbGY6Ok1PRFVMRV9LRVldWydmaXhpdHknXSkmJiRtW3NlbGY6Ok1PRFVMRV9LRVldWydmaXhpdHknXT09PXNlbGY6OkNPTlNUQU5UKXskbW9kdWxlPSRtW3NlbGY6Ok1PRFVMRV9LRVldW3NlbGY6OlZBTFVFXS4nOic7fWVsc2V7cmV0dXJuCk5VTEw7fX1pZihpc3NldCgkbVtzZWxmOjpQUkVTRU5URVJfS0VZXVsnZml4aXR5J10pJiYkbVtzZWxmOjpQUkVTRU5URVJfS0VZXVsnZml4aXR5J109PT1zZWxmOjpDT05TVEFOVCl7cmV0dXJuJG1vZHVsZS4kbVtzZWxmOjpQUkVTRU5URVJfS0VZXVtzZWxmOjpWQUxVRV07fXJldHVybgpOVUxMO31wcml2YXRlCnN0YXRpYwpmdW5jdGlvbgpyZW5hbWVLZXlzKCRhcnIsJHhsYXQpe2lmKGVtcHR5KCR4bGF0KSlyZXR1cm4kYXJyOyRyZXM9YXJyYXkoKTskb2NjdXBpZWQ9YXJyYXlfZmxpcCgkeGxhdCk7Zm9yZWFjaCgkYXJyCmFzJGs9PiR2KXtpZihpc3NldCgkeGxhdFska10pKXskcmVzWyR4bGF0WyRrXV09JHY7fWVsc2VpZighaXNzZXQoJG9jY3VwaWVkWyRrXSkpeyRyZXNbJGtdPSR2O319cmV0dXJuJHJlczt9cHJpdmF0ZQpzdGF0aWMKZnVuY3Rpb24KYWN0aW9uMnBhdGgoJHMpeyRzPXByZWdfcmVwbGFjZSgnIyguKSg/PVtBLVpdKSMnLCckMS0nLCRzKTskcz1zdHJ0b2xvd2VyKCRzKTskcz1yYXd1cmxlbmNvZGUoJHMpO3JldHVybiRzO31wcml2YXRlCnN0YXRpYwpmdW5jdGlvbgpwYXRoMmFjdGlvbigkcyl7JHM9c3RydG9sb3dlcigkcyk7JHM9cHJlZ19yZXBsYWNlKCcjLSg/PVthLXpdKSMnLCcgJywkcyk7JHM9c3Vic3RyKHVjd29yZHMoJ3gnLiRzKSwxKTskcz1zdHJfcmVwbGFjZSgnICcsJycsJHMpO3JldHVybiRzO31wcml2YXRlCnN0YXRpYwpmdW5jdGlvbgpwcmVzZW50ZXIycGF0aCgkcyl7JHM9c3RydHIoJHMsJzonLCcuJyk7JHM9cHJlZ19yZXBsYWNlKCcjKFteLl0pKD89W0EtWl0pIycsJyQxLScsJHMpOyRzPXN0cnRvbG93ZXIoJHMpOyRzPXJhd3VybGVuY29kZSgkcyk7cmV0dXJuJHM7fXByaXZhdGUKc3RhdGljCmZ1bmN0aW9uCnBhdGgycHJlc2VudGVyKCRzKXskcz1zdHJ0b2xvd2VyKCRzKTskcz1wcmVnX3JlcGxhY2UoJyMoWy4tXSkoPz1bYS16XSkjJywnJDEgJywkcyk7JHM9dWN3b3Jkcygkcyk7JHM9c3RyX3JlcGxhY2UoJy4gJywnOicsJHMpOyRzPXN0cl9yZXBsYWNlKCctICcsJycsJHMpO3JldHVybiRzO31zdGF0aWMKZnVuY3Rpb24KYWRkU3R5bGUoJHN0eWxlLCRwYXJlbnQ9JyMnKXtpZihpc3NldChzZWxmOjokc3R5bGVzWyRzdHlsZV0pKXt0aHJvdwpuZXcKSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJTdHlsZSAnJHN0eWxlJyBhbHJlYWR5IGV4aXN0cy4iKTt9aWYoJHBhcmVudCE9PU5VTEwpe2lmKCFpc3NldChzZWxmOjokc3R5bGVzWyRwYXJlbnRdKSl7dGhyb3cKbmV3CkludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiUGFyZW50IHN0eWxlICckcGFyZW50JyBkb2Vzbid0IGV4aXN0LiIpO31zZWxmOjokc3R5bGVzWyRzdHlsZV09c2VsZjo6JHN0eWxlc1skcGFyZW50XTt9ZWxzZXtzZWxmOjokc3R5bGVzWyRzdHlsZV09YXJyYXkoKTt9fXN0YXRpYwpmdW5jdGlvbgpzZXRTdHlsZVByb3BlcnR5KCRzdHlsZSwka2V5LCR2YWx1ZSl7aWYoIWlzc2V0KHNlbGY6OiRzdHlsZXNbJHN0eWxlXSkpe3Rocm93Cm5ldwpJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIlN0eWxlICckc3R5bGUnIGRvZXNuJ3QgZXhpc3QuIik7fXNlbGY6OiRzdHlsZXNbJHN0eWxlXVska2V5XT0kdmFsdWU7fX1jbGFzcwpOU2ltcGxlUm91dGVyCmV4dGVuZHMKTk9iamVjdAppbXBsZW1lbnRzCklSb3V0ZXJ7Y29uc3QKUFJFU0VOVEVSX0tFWT0ncHJlc2VudGVyJztjb25zdApNT0RVTEVfS0VZPSdtb2R1bGUnO3ByaXZhdGUkbW9kdWxlPScnO3ByaXZhdGUkZGVmYXVsdHM7cHJpdmF0ZSRmbGFncztmdW5jdGlvbgpfX2NvbnN0cnVjdCgkZGVmYXVsdHM9YXJyYXkoKSwkZmxhZ3M9MCl7aWYoaXNfc3RyaW5nKCRkZWZhdWx0cykpeyRhPXN0cnJwb3MoJGRlZmF1bHRzLCc6Jyk7JGRlZmF1bHRzPWFycmF5KHNlbGY6OlBSRVNFTlRFUl9LRVk9PnN1YnN0cigkZGVmYXVsdHMsMCwkYSksJ2FjdGlvbic9PnN1YnN0cigkZGVmYXVsdHMsJGErMSkpO31pZihpc3NldCgkZGVmYXVsdHNbc2VsZjo6TU9EVUxFX0tFWV0pKXskdGhpcy0+bW9kdWxlPSRkZWZhdWx0c1tzZWxmOjpNT0RVTEVfS0VZXS4nOic7dW5zZXQoJGRlZmF1bHRzW3NlbGY6Ok1PRFVMRV9LRVldKTt9JHRoaXMtPmRlZmF1bHRzPSRkZWZhdWx0czskdGhpcy0+ZmxhZ3M9JGZsYWdzO31mdW5jdGlvbgptYXRjaChJSHR0cFJlcXVlc3QkaHR0cFJlcXVlc3QpeyRwYXJhbXM9JGh0dHBSZXF1ZXN0LT5nZXRRdWVyeSgpOyRwYXJhbXMrPSR0aGlzLT5kZWZhdWx0cztpZighaXNzZXQoJHBhcmFtc1tzZWxmOjpQUkVTRU5URVJfS0VZXSkpe3Rocm93Cm5ldwpJbnZhbGlkU3RhdGVFeGNlcHRpb24oJ01pc3NpbmcgcHJlc2VudGVyLicpO30kcHJlc2VudGVyPSR0aGlzLT5tb2R1bGUuJHBhcmFtc1tzZWxmOjpQUkVTRU5URVJfS0VZXTt1bnNldCgkcGFyYW1zW3NlbGY6OlBSRVNFTlRFUl9LRVldKTtyZXR1cm4KbmV3Ck5QcmVzZW50ZXJSZXF1ZXN0KCRwcmVzZW50ZXIsJGh0dHBSZXF1ZXN0LT5nZXRNZXRob2QoKSwkcGFyYW1zLCRodHRwUmVxdWVzdC0+Z2V0UG9zdCgpLCRodHRwUmVxdWVzdC0+Z2V0RmlsZXMoKSxhcnJheShOUHJlc2VudGVyUmVxdWVzdDo6U0VDVVJFRD0+JGh0dHBSZXF1ZXN0LT5pc1NlY3VyZWQoKSkpO31mdW5jdGlvbgpjb25zdHJ1Y3RVcmwoTlByZXNlbnRlclJlcXVlc3QkYXBwUmVxdWVzdCxJSHR0cFJlcXVlc3QkaHR0cFJlcXVlc3QpeyRwYXJhbXM9JGFwcFJlcXVlc3QtPmdldFBhcmFtcygpOyRwcmVzZW50ZXI9JGFwcFJlcXVlc3QtPmdldFByZXNlbnRlck5hbWUoKTtpZihzdHJuY2FzZWNtcCgkcHJlc2VudGVyLCR0aGlzLT5tb2R1bGUsc3RybGVuKCR0aGlzLT5tb2R1bGUpKT09PTApeyRwYXJhbXNbc2VsZjo6UFJFU0VOVEVSX0tFWV09c3Vic3RyKCRwcmVzZW50ZXIsc3RybGVuKCR0aGlzLT5tb2R1bGUpKTt9ZWxzZXtyZXR1cm4KTlVMTDt9Zm9yZWFjaCgkdGhpcy0+ZGVmYXVsdHMKYXMka2V5PT4kdmFsdWUpe2lmKGlzc2V0KCRwYXJhbXNbJGtleV0pJiYkcGFyYW1zWyRrZXldPT0kdmFsdWUpe3Vuc2V0KCRwYXJhbXNbJGtleV0pO319JHVyaT0kaHR0cFJlcXVlc3QtPmdldFVyaSgpOyR1cmk9KCR0aGlzLT5mbGFncyZzZWxmOjpTRUNVUkVEPydodHRwczovLyc6J2h0dHA6Ly8nKS4kdXJpLT5nZXRBdXRob3JpdHkoKS4kdXJpLT5nZXRTY3JpcHRQYXRoKCk7JHNlcD1pbmlfZ2V0KCdhcmdfc2VwYXJhdG9yLmlucHV0Jyk7JHF1ZXJ5PWh0dHBfYnVpbGRfcXVlcnkoJHBhcmFtcywnJywkc2VwPyRzZXBbMF06JyYnKTtpZigkcXVlcnkhPScnKXskdXJpLj0nPycuJHF1ZXJ5O31yZXR1cm4kdXJpO31mdW5jdGlvbgpnZXREZWZhdWx0cygpe3JldHVybiR0aGlzLT5kZWZhdWx0czt9fWNsYXNzCk5DYWNoZQpleHRlbmRzCk5PYmplY3QKaW1wbGVtZW50cwpBcnJheUFjY2Vzc3tjb25zdApQUklPUklUWT0ncHJpb3JpdHknO2NvbnN0CkVYUElSRT0nZXhwaXJlJztjb25zdApTTElESU5HPSdzbGlkaW5nJztjb25zdApUQUdTPSd0YWdzJztjb25zdApGSUxFUz0nZmlsZXMnO2NvbnN0CklURU1TPSdpdGVtcyc7Y29uc3QKQ09OU1RTPSdjb25zdHMnO2NvbnN0CkNBTExCQUNLUz0nY2FsbGJhY2tzJztjb25zdApBTEw9J2FsbCc7Y29uc3QKUkVGUkVTSD0nc2xpZGluZyc7Y29uc3QKTkFNRVNQQUNFX1NFUEFSQVRPUj0iXHgwMCI7cHJpdmF0ZSRzdG9yYWdlO3ByaXZhdGUkbmFtZXNwYWNlO3ByaXZhdGUka2V5O3ByaXZhdGUkZGF0YTtmdW5jdGlvbgpfX2NvbnN0cnVjdChJQ2FjaGVTdG9yYWdlJHN0b3JhZ2UsJG5hbWVzcGFjZT1OVUxMKXskdGhpcy0+c3RvcmFnZT0kc3RvcmFnZTskdGhpcy0+bmFtZXNwYWNlPShzdHJpbmcpJG5hbWVzcGFjZTtpZihzdHJwb3MoJHRoaXMtPm5hbWVzcGFjZSxzZWxmOjpOQU1FU1BBQ0VfU0VQQVJBVE9SKSE9PUZBTFNFKXt0aHJvdwpuZXcKSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJOYW1lc3BhY2UgbmFtZSBjb250YWlucyBmb3JiaWRkZW4gY2hhcmFjdGVyLiIpO319ZnVuY3Rpb24KZ2V0U3RvcmFnZSgpe3JldHVybiR0aGlzLT5zdG9yYWdlO31mdW5jdGlvbgpnZXROYW1lc3BhY2UoKXtyZXR1cm4kdGhpcy0+bmFtZXNwYWNlO31mdW5jdGlvbgpyZWxlYXNlKCl7JHRoaXMtPmtleT0kdGhpcy0+ZGF0YT1OVUxMO31mdW5jdGlvbgpzYXZlKCRrZXksJGRhdGEsYXJyYXkkZHA9TlVMTCl7aWYoIWlzX3N0cmluZygka2V5KSYmIWlzX2ludCgka2V5KSl7dGhyb3cKbmV3CkludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiQ2FjaGUga2V5IG5hbWUgbXVzdCBiZSBzdHJpbmcgb3IgaW50ZWdlciwgIi5nZXR0eXBlKCRrZXkpLiIgZ2l2ZW4uIik7fSR0aGlzLT5rZXk9KHN0cmluZykka2V5OyRrZXk9JHRoaXMtPm5hbWVzcGFjZS5zZWxmOjpOQU1FU1BBQ0VfU0VQQVJBVE9SLiRrZXk7aWYoIWVtcHR5KCRkcFtOQ2FjaGU6OkVYUElSRV0pKXskZHBbTkNhY2hlOjpFWFBJUkVdPU5Ub29sczo6Y3JlYXRlRGF0ZVRpbWUoJGRwW05DYWNoZTo6RVhQSVJFXSktPmZvcm1hdCgnVScpLXRpbWUoKTt9aWYoaXNzZXQoJGRwW3NlbGY6OkZJTEVTXSkpe2ZvcmVhY2goKGFycmF5KSRkcFtzZWxmOjpGSUxFU11hcyRpdGVtKXskZHBbc2VsZjo6Q0FMTEJBQ0tTXVtdPWFycmF5KGFycmF5KF9fQ0xBU1NfXywnY2hlY2tGaWxlJyksJGl0ZW0sQGZpbGVtdGltZSgkaXRlbSkpO311bnNldCgkZHBbc2VsZjo6RklMRVNdKTt9aWYoaXNzZXQoJGRwW3NlbGY6OklURU1TXSkpeyRkcFtzZWxmOjpJVEVNU109KGFycmF5KSRkcFtzZWxmOjpJVEVNU107Zm9yZWFjaCgkZHBbc2VsZjo6SVRFTVNdYXMkaz0+JGl0ZW0peyRkcFtzZWxmOjpJVEVNU11bJGtdPSR0aGlzLT5uYW1lc3BhY2Uuc2VsZjo6TkFNRVNQQUNFX1NFUEFSQVRPUi4kaXRlbTt9fWlmKGlzc2V0KCRkcFtzZWxmOjpDT05TVFNdKSl7Zm9yZWFjaCgoYXJyYXkpJGRwW3NlbGY6OkNPTlNUU11hcyRpdGVtKXskZHBbc2VsZjo6Q0FMTEJBQ0tTXVtdPWFycmF5KGFycmF5KF9fQ0xBU1NfXywnY2hlY2tDb25zdCcpLCRpdGVtLGNvbnN0YW50KCRpdGVtKSk7fXVuc2V0KCRkcFtzZWxmOjpDT05TVFNdKTt9aWYoJGRhdGEKaW5zdGFuY2VvZgpOQ2FsbGJhY2t8fCRkYXRhCmluc3RhbmNlb2YKQ2xvc3VyZSl7TkVudmlyb25tZW50OjplbnRlckNyaXRpY2FsU2VjdGlvbignTmV0dGVcQ2FjaGluZy8nLiRrZXkpOyRkYXRhPSRkYXRhLT5fX2ludm9rZSgpO05FbnZpcm9ubWVudDo6bGVhdmVDcml0aWNhbFNlY3Rpb24oJ05ldHRlXENhY2hpbmcvJy4ka2V5KTt9aWYoaXNfb2JqZWN0KCRkYXRhKSl7JGRwW3NlbGY6OkNBTExCQUNLU11bXT1hcnJheShhcnJheShfX0NMQVNTX18sJ2NoZWNrU2VyaWFsaXphdGlvblZlcnNpb24nKSxnZXRfY2xhc3MoJGRhdGEpLE5DbGFzc1JlZmxlY3Rpb246OmZyb20oJGRhdGEpLT5nZXRBbm5vdGF0aW9uKCdzZXJpYWxpemF0aW9uVmVyc2lvbicpKTt9JHRoaXMtPmRhdGE9JGRhdGE7aWYoJGRhdGE9PT1OVUxMKXskdGhpcy0+c3RvcmFnZS0+cmVtb3ZlKCRrZXkpO31lbHNleyR0aGlzLT5zdG9yYWdlLT53cml0ZSgka2V5LCRkYXRhLChhcnJheSkkZHApO31yZXR1cm4kZGF0YTt9ZnVuY3Rpb24KY2xlYW4oYXJyYXkkY29uZHM9TlVMTCl7JHRoaXMtPnJlbGVhc2UoKTskdGhpcy0+c3RvcmFnZS0+Y2xlYW4oKGFycmF5KSRjb25kcyk7fWZ1bmN0aW9uCm9mZnNldFNldCgka2V5LCRkYXRhKXskdGhpcy0+c2F2ZSgka2V5LCRkYXRhKTt9ZnVuY3Rpb24Kb2Zmc2V0R2V0KCRrZXkpe2lmKCFpc19zdHJpbmcoJGtleSkmJiFpc19pbnQoJGtleSkpe3Rocm93Cm5ldwpJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIkNhY2hlIGtleSBuYW1lIG11c3QgYmUgc3RyaW5nIG9yIGludGVnZXIsICIuZ2V0dHlwZSgka2V5KS4iIGdpdmVuLiIpO30ka2V5PShzdHJpbmcpJGtleTtpZigkdGhpcy0+a2V5PT09JGtleSl7cmV0dXJuJHRoaXMtPmRhdGE7fSR0aGlzLT5rZXk9JGtleTskdGhpcy0+ZGF0YT0kdGhpcy0+c3RvcmFnZS0+cmVhZCgkdGhpcy0+bmFtZXNwYWNlLnNlbGY6Ok5BTUVTUEFDRV9TRVBBUkFUT1IuJGtleSk7cmV0dXJuJHRoaXMtPmRhdGE7fWZ1bmN0aW9uCm9mZnNldEV4aXN0cygka2V5KXtyZXR1cm4kdGhpcy0+b2Zmc2V0R2V0KCRrZXkpIT09TlVMTDt9ZnVuY3Rpb24Kb2Zmc2V0VW5zZXQoJGtleSl7JHRoaXMtPnNhdmUoJGtleSxOVUxMKTt9c3RhdGljCmZ1bmN0aW9uCmNoZWNrQ2FsbGJhY2tzKCRjYWxsYmFja3Mpe2ZvcmVhY2goJGNhbGxiYWNrcwphcyRjYWxsYmFjayl7JGZ1bmM9YXJyYXlfc2hpZnQoJGNhbGxiYWNrKTtpZighY2FsbF91c2VyX2Z1bmNfYXJyYXkoJGZ1bmMsJGNhbGxiYWNrKSl7cmV0dXJuCkZBTFNFO319cmV0dXJuClRSVUU7fXByaXZhdGUKc3RhdGljCmZ1bmN0aW9uCmNoZWNrQ29uc3QoJGNvbnN0LCR2YWx1ZSl7cmV0dXJuCmRlZmluZWQoJGNvbnN0KSYmY29uc3RhbnQoJGNvbnN0KT09PSR2YWx1ZTt9cHJpdmF0ZQpzdGF0aWMKZnVuY3Rpb24KY2hlY2tGaWxlKCRmaWxlLCR0aW1lKXtyZXR1cm5AZmlsZW10aW1lKCRmaWxlKT09JHRpbWU7fXByaXZhdGUKc3RhdGljCmZ1bmN0aW9uCmNoZWNrU2VyaWFsaXphdGlvblZlcnNpb24oJGNsYXNzLCR2YWx1ZSl7cmV0dXJuCk5DbGFzc1JlZmxlY3Rpb246OmZyb20oJGNsYXNzKS0+Z2V0QW5ub3RhdGlvbignc2VyaWFsaXphdGlvblZlcnNpb24nKT09PSR2YWx1ZTt9fWNsYXNzCk5EdW1teVN0b3JhZ2UKZXh0ZW5kcwpOT2JqZWN0CmltcGxlbWVudHMKSUNhY2hlU3RvcmFnZXtmdW5jdGlvbgpyZWFkKCRrZXkpe3JldHVybgpOVUxMO31mdW5jdGlvbgp3cml0ZSgka2V5LCRkYXRhLGFycmF5JGRwKXt9ZnVuY3Rpb24KcmVtb3ZlKCRrZXkpe31mdW5jdGlvbgpjbGVhbihhcnJheSRjb25kcyl7fX1jbGFzcwpORmlsZVN0b3JhZ2UKZXh0ZW5kcwpOT2JqZWN0CmltcGxlbWVudHMKSUNhY2hlU3RvcmFnZXtjb25zdApNRVRBX0hFQURFUl9MRU49Mjg7Y29uc3QKTUVUQV9USU1FPSd0aW1lJztjb25zdApNRVRBX1NFUklBTElaRUQ9J3NlcmlhbGl6ZWQnO2NvbnN0Ck1FVEFfRVhQSVJFPSdleHBpcmUnO2NvbnN0Ck1FVEFfREVMVEE9J2RlbHRhJztjb25zdApNRVRBX0lURU1TPSdkaSc7Y29uc3QKTUVUQV9DQUxMQkFDS1M9J2NhbGxiYWNrcyc7Y29uc3QKRklMRT0nZmlsZSc7Y29uc3QKSEFORExFPSdoYW5kbGUnO3B1YmxpYwpzdGF0aWMkZ2NQcm9iYWJpbGl0eT0wLjAwMTtwdWJsaWMKc3RhdGljJHVzZURpcmVjdG9yaWVzO3ByaXZhdGUkZGlyO3ByaXZhdGUkdXNlRGlycztwcml2YXRlJGRiO2Z1bmN0aW9uCl9fY29uc3RydWN0KCRkaXIpe2lmKHNlbGY6OiR1c2VEaXJlY3Rvcmllcz09PU5VTEwpeyR1bmlxPXVuaXFpZCgnXycsVFJVRSk7dW1hc2soMDAwMCk7aWYoIUBta2RpcigiJGRpci8kdW5pcSIsMDc3Nykpe3Rocm93Cm5ldwpJbnZhbGlkU3RhdGVFeGNlcHRpb24oIlVuYWJsZSB0byB3cml0ZSB0byBkaXJlY3RvcnkgJyRkaXInLiBNYWtlIHRoaXMgZGlyZWN0b3J5IHdyaXRhYmxlLiIpO31zZWxmOjokdXNlRGlyZWN0b3JpZXM9IWluaV9nZXQoJ3NhZmVfbW9kZScpO2lmKCFzZWxmOjokdXNlRGlyZWN0b3JpZXMmJkBmaWxlX3B1dF9jb250ZW50cygiJGRpci8kdW5pcS9fIiwnJykhPT1GQUxTRSl7c2VsZjo6JHVzZURpcmVjdG9yaWVzPVRSVUU7dW5saW5rKCIkZGlyLyR1bmlxL18iKTt9cm1kaXIoIiRkaXIvJHVuaXEiKTt9JHRoaXMtPmRpcj0kZGlyOyR0aGlzLT51c2VEaXJzPShib29sKXNlbGY6OiR1c2VEaXJlY3RvcmllcztpZihtdF9yYW5kKCkvbXRfZ2V0cmFuZG1heCgpPHNlbGY6OiRnY1Byb2JhYmlsaXR5KXskdGhpcy0+Y2xlYW4oYXJyYXkoKSk7fX1mdW5jdGlvbgpyZWFkKCRrZXkpeyRtZXRhPSR0aGlzLT5yZWFkTWV0YSgkdGhpcy0+Z2V0Q2FjaGVGaWxlKCRrZXkpLExPQ0tfU0gpO2lmKCRtZXRhJiYkdGhpcy0+dmVyaWZ5KCRtZXRhKSl7cmV0dXJuJHRoaXMtPnJlYWREYXRhKCRtZXRhKTt9ZWxzZXtyZXR1cm4KTlVMTDt9fXByaXZhdGUKZnVuY3Rpb24KdmVyaWZ5KCRtZXRhKXtkb3tpZighZW1wdHkoJG1ldGFbc2VsZjo6TUVUQV9ERUxUQV0pKXtpZihmaWxlbXRpbWUoJG1ldGFbc2VsZjo6RklMRV0pKyRtZXRhW3NlbGY6Ok1FVEFfREVMVEFdPHRpbWUoKSlicmVhazt0b3VjaCgkbWV0YVtzZWxmOjpGSUxFXSk7fWVsc2VpZighZW1wdHkoJG1ldGFbc2VsZjo6TUVUQV9FWFBJUkVdKSYmJG1ldGFbc2VsZjo6TUVUQV9FWFBJUkVdPHRpbWUoKSl7YnJlYWs7fWlmKCFlbXB0eSgkbWV0YVtzZWxmOjpNRVRBX0NBTExCQUNLU10pJiYhTkNhY2hlOjpjaGVja0NhbGxiYWNrcygkbWV0YVtzZWxmOjpNRVRBX0NBTExCQUNLU10pKXticmVhazt9aWYoIWVtcHR5KCRtZXRhW3NlbGY6Ok1FVEFfSVRFTVNdKSl7Zm9yZWFjaCgkbWV0YVtzZWxmOjpNRVRBX0lURU1TXWFzJGRlcEZpbGU9PiR0aW1lKXskbT0kdGhpcy0+cmVhZE1ldGEoJGRlcEZpbGUsTE9DS19TSCk7aWYoJG1bc2VsZjo6TUVUQV9USU1FXSE9PSR0aW1lKWJyZWFrCjI7aWYoJG0mJiEkdGhpcy0+dmVyaWZ5KCRtKSlicmVhawoyO319cmV0dXJuClRSVUU7fXdoaWxlKEZBTFNFKTskdGhpcy0+ZGVsZXRlKCRtZXRhW3NlbGY6OkZJTEVdLCRtZXRhW3NlbGY6OkhBTkRMRV0pO3JldHVybgpGQUxTRTt9ZnVuY3Rpb24Kd3JpdGUoJGtleSwkZGF0YSxhcnJheSRkcCl7JG1ldGE9YXJyYXkoc2VsZjo6TUVUQV9USU1FPT5taWNyb3RpbWUoKSk7aWYoIWVtcHR5KCRkcFtOQ2FjaGU6OkVYUElSRV0pKXtpZihlbXB0eSgkZHBbTkNhY2hlOjpTTElESU5HXSkpeyRtZXRhW3NlbGY6Ok1FVEFfRVhQSVJFXT0kZHBbTkNhY2hlOjpFWFBJUkVdK3RpbWUoKTt9ZWxzZXskbWV0YVtzZWxmOjpNRVRBX0RFTFRBXT0oaW50KSRkcFtOQ2FjaGU6OkVYUElSRV07fX1pZighZW1wdHkoJGRwW05DYWNoZTo6SVRFTVNdKSl7Zm9yZWFjaCgoYXJyYXkpJGRwW05DYWNoZTo6SVRFTVNdYXMkaXRlbSl7JGRlcEZpbGU9JHRoaXMtPmdldENhY2hlRmlsZSgkaXRlbSk7JG09JHRoaXMtPnJlYWRNZXRhKCRkZXBGaWxlLExPQ0tfU0gpOyRtZXRhW3NlbGY6Ok1FVEFfSVRFTVNdWyRkZXBGaWxlXT0kbVtzZWxmOjpNRVRBX1RJTUVdO3Vuc2V0KCRtKTt9fWlmKCFlbXB0eSgkZHBbTkNhY2hlOjpDQUxMQkFDS1NdKSl7JG1ldGFbc2VsZjo6TUVUQV9DQUxMQkFDS1NdPSRkcFtOQ2FjaGU6OkNBTExCQUNLU107fSRjYWNoZUZpbGU9JHRoaXMtPmdldENhY2hlRmlsZSgka2V5KTtpZigkdGhpcy0+dXNlRGlycyYmIWlzX2RpcigkZGlyPWRpcm5hbWUoJGNhY2hlRmlsZSkpKXt1bWFzaygwMDAwKTtpZighbWtkaXIoJGRpciwwNzc3LFRSVUUpKXtyZXR1cm47fX0kaGFuZGxlPUBmb3BlbigkY2FjaGVGaWxlLCdyK2InKTtpZighJGhhbmRsZSl7JGhhbmRsZT1mb3BlbigkY2FjaGVGaWxlLCd3YicpO2lmKCEkaGFuZGxlKXtyZXR1cm47fX1pZighZW1wdHkoJGRwW05DYWNoZTo6VEFHU10pfHxpc3NldCgkZHBbTkNhY2hlOjpQUklPUklUWV0pKXskZGI9JHRoaXMtPmdldERiKCk7JGRiRmlsZT1zcWxpdGVfZXNjYXBlX3N0cmluZygkY2FjaGVGaWxlKTskcXVlcnk9Jyc7aWYoIWVtcHR5KCRkcFtOQ2FjaGU6OlRBR1NdKSl7Zm9yZWFjaCgoYXJyYXkpJGRwW05DYWNoZTo6VEFHU11hcyR0YWcpeyRxdWVyeS49IklOU0VSVCBJTlRPIGNhY2hlIChmaWxlLCB0YWcpIFZBTFVFUyAoJyRkYkZpbGUnLCAnIi5zcWxpdGVfZXNjYXBlX3N0cmluZygkdGFnKS4iJyk7Ijt9fWlmKGlzc2V0KCRkcFtOQ2FjaGU6OlBSSU9SSVRZXSkpeyRxdWVyeS49IklOU0VSVCBJTlRPIGNhY2hlIChmaWxlLCBwcmlvcml0eSkgVkFMVUVTICgnJGRiRmlsZScsICciLihpbnQpJGRwW05DYWNoZTo6UFJJT1JJVFldLiInKTsiO31pZighc3FsaXRlX2V4ZWMoJGRiLCJCRUdJTjsgREVMRVRFIEZST00gY2FjaGUgV0hFUkUgZmlsZSA9ICckZGJGaWxlJzsgJHF1ZXJ5IENPTU1JVDsiKSl7c3FsaXRlX2V4ZWMoJGRiLCJST0xMQkFDSyIpO3JldHVybjt9fWZsb2NrKCRoYW5kbGUsTE9DS19FWCk7ZnRydW5jYXRlKCRoYW5kbGUsMCk7aWYoIWlzX3N0cmluZygkZGF0YSkpeyRkYXRhPXNlcmlhbGl6ZSgkZGF0YSk7JG1ldGFbc2VsZjo6TUVUQV9TRVJJQUxJWkVEXT1UUlVFO30kaGVhZD1zZXJpYWxpemUoJG1ldGEpLic/Pic7JGhlYWQ9Jzw/cGhwIC8vbmV0dGVDYWNoZVswMV0nLnN0cl9wYWQoKHN0cmluZylzdHJsZW4oJGhlYWQpLDYsJzAnLFNUUl9QQURfTEVGVCkuJGhlYWQ7JGhlYWRMZW49c3RybGVuKCRoZWFkKTskZGF0YUxlbj1zdHJsZW4oJGRhdGEpO2Rve2lmKGZ3cml0ZSgkaGFuZGxlLHN0cl9yZXBlYXQoIlx4MDAiLCRoZWFkTGVuKSwkaGVhZExlbikhPT0kaGVhZExlbil7YnJlYWs7fWlmKGZ3cml0ZSgkaGFuZGxlLCRkYXRhLCRkYXRhTGVuKSE9PSRkYXRhTGVuKXticmVhazt9ZnNlZWsoJGhhbmRsZSwwKTtpZihmd3JpdGUoJGhhbmRsZSwkaGVhZCwkaGVhZExlbikhPT0kaGVhZExlbil7YnJlYWs7fWZjbG9zZSgkaGFuZGxlKTtyZXR1cm4KVFJVRTt9d2hpbGUoRkFMU0UpOyR0aGlzLT5kZWxldGUoJGNhY2hlRmlsZSwkaGFuZGxlKTt9ZnVuY3Rpb24KcmVtb3ZlKCRrZXkpeyR0aGlzLT5kZWxldGUoJHRoaXMtPmdldENhY2hlRmlsZSgka2V5KSk7fWZ1bmN0aW9uCmNsZWFuKGFycmF5JGNvbmRzKXskYWxsPSFlbXB0eSgkY29uZHNbTkNhY2hlOjpBTExdKTskY29sbGVjdG9yPWVtcHR5KCRjb25kcyk7aWYoJGFsbHx8JGNvbGxlY3Rvcil7JG5vdz10aW1lKCk7JGJhc2U9JHRoaXMtPmRpci5ESVJFQ1RPUllfU0VQQVJBVE9SLidjJzskaXRlcmF0b3I9bmV3ClJlY3Vyc2l2ZUl0ZXJhdG9ySXRlcmF0b3IobmV3ClJlY3Vyc2l2ZURpcmVjdG9yeUl0ZXJhdG9yKCR0aGlzLT5kaXIpLFJlY3Vyc2l2ZUl0ZXJhdG9ySXRlcmF0b3I6OkNISUxEX0ZJUlNUKTtmb3JlYWNoKCRpdGVyYXRvcgphcyRlbnRyeSl7JHBhdGg9KHN0cmluZykkZW50cnk7aWYoc3RybmNtcCgkcGF0aCwkYmFzZSxzdHJsZW4oJGJhc2UpKSl7Y29udGludWU7fWlmKCRlbnRyeS0+aXNEaXIoKSl7QHJtZGlyKCRwYXRoKTtjb250aW51ZTt9aWYoJGFsbCl7JHRoaXMtPmRlbGV0ZSgkcGF0aCk7fWVsc2V7JG1ldGE9JHRoaXMtPnJlYWRNZXRhKCRwYXRoLExPQ0tfU0gpO2lmKCEkbWV0YSljb250aW51ZTtpZighZW1wdHkoJG1ldGFbc2VsZjo6TUVUQV9FWFBJUkVdKSYmJG1ldGFbc2VsZjo6TUVUQV9FWFBJUkVdPCRub3cpeyR0aGlzLT5kZWxldGUoJHBhdGgsJG1ldGFbc2VsZjo6SEFORExFXSk7Y29udGludWU7fWZjbG9zZSgkbWV0YVtzZWxmOjpIQU5ETEVdKTt9fWlmKCRhbGwmJmV4dGVuc2lvbl9sb2FkZWQoJ3NxbGl0ZScpKXtzcWxpdGVfZXhlYygiREVMRVRFIEZST00gY2FjaGUiLCR0aGlzLT5nZXREYigpKTt9cmV0dXJuO31pZighZW1wdHkoJGNvbmRzW05DYWNoZTo6VEFHU10pKXskZGI9JHRoaXMtPmdldERiKCk7Zm9yZWFjaCgoYXJyYXkpJGNvbmRzW05DYWNoZTo6VEFHU11hcyR0YWcpeyR0bXBbXT0iJyIuc3FsaXRlX2VzY2FwZV9zdHJpbmcoJHRhZykuIiciO30kcXVlcnlbXT0idGFnIElOICgiLmltcGxvZGUoJywnLCR0bXApLiIpIjt9aWYoaXNzZXQoJGNvbmRzW05DYWNoZTo6UFJJT1JJVFldKSl7JHF1ZXJ5W109InByaW9yaXR5IDw9ICIuKGludCkkY29uZHNbTkNhY2hlOjpQUklPUklUWV07fWlmKGlzc2V0KCRxdWVyeSkpeyRkYj0kdGhpcy0+Z2V0RGIoKTskcXVlcnk9aW1wbG9kZSgnIE9SICcsJHF1ZXJ5KTskZmlsZXM9c3FsaXRlX3NpbmdsZV9xdWVyeSgiU0VMRUNUIGZpbGUgRlJPTSBjYWNoZSBXSEVSRSAkcXVlcnkiLCRkYixGQUxTRSk7Zm9yZWFjaCgkZmlsZXMKYXMkZmlsZSl7JHRoaXMtPmRlbGV0ZSgkZmlsZSk7fXNxbGl0ZV9leGVjKCJERUxFVEUgRlJPTSBjYWNoZSBXSEVSRSAkcXVlcnkiLCRkYik7fX1wcm90ZWN0ZWQKZnVuY3Rpb24KcmVhZE1ldGEoJGZpbGUsJGxvY2speyRoYW5kbGU9QGZvcGVuKCRmaWxlLCdyK2InKTtpZighJGhhbmRsZSlyZXR1cm4KTlVMTDtmbG9jaygkaGFuZGxlLCRsb2NrKTskaGVhZD1zdHJlYW1fZ2V0X2NvbnRlbnRzKCRoYW5kbGUsc2VsZjo6TUVUQV9IRUFERVJfTEVOKTtpZigkaGVhZCYmc3RybGVuKCRoZWFkKT09PXNlbGY6Ok1FVEFfSEVBREVSX0xFTil7JHNpemU9KGludClzdWJzdHIoJGhlYWQsLTYpOyRtZXRhPXN0cmVhbV9nZXRfY29udGVudHMoJGhhbmRsZSwkc2l6ZSxzZWxmOjpNRVRBX0hFQURFUl9MRU4pOyRtZXRhPUB1bnNlcmlhbGl6ZSgkbWV0YSk7aWYoaXNfYXJyYXkoJG1ldGEpKXtmc2VlaygkaGFuZGxlLCRzaXplK3NlbGY6Ok1FVEFfSEVBREVSX0xFTik7JG1ldGFbc2VsZjo6RklMRV09JGZpbGU7JG1ldGFbc2VsZjo6SEFORExFXT0kaGFuZGxlO3JldHVybiRtZXRhO319ZmNsb3NlKCRoYW5kbGUpO3JldHVybgpOVUxMO31wcm90ZWN0ZWQKZnVuY3Rpb24KcmVhZERhdGEoJG1ldGEpeyRkYXRhPXN0cmVhbV9nZXRfY29udGVudHMoJG1ldGFbc2VsZjo6SEFORExFXSk7ZmNsb3NlKCRtZXRhW3NlbGY6OkhBTkRMRV0pO2lmKGVtcHR5KCRtZXRhW3NlbGY6Ok1FVEFfU0VSSUFMSVpFRF0pKXtyZXR1cm4kZGF0YTt9ZWxzZXtyZXR1cm5AdW5zZXJpYWxpemUoJGRhdGEpO319cHJvdGVjdGVkCmZ1bmN0aW9uCmdldENhY2hlRmlsZSgka2V5KXtpZigkdGhpcy0+dXNlRGlycyl7JGtleT1leHBsb2RlKE5DYWNoZTo6TkFNRVNQQUNFX1NFUEFSQVRPUiwka2V5LDIpO3JldHVybiR0aGlzLT5kaXIuJy9jJy4oaXNzZXQoJGtleVsxXSk/Jy0nLnVybGVuY29kZSgka2V5WzBdKS4nL18nLnVybGVuY29kZSgka2V5WzFdKTonXycudXJsZW5jb2RlKCRrZXlbMF0pKTt9ZWxzZXtyZXR1cm4kdGhpcy0+ZGlyLicvY18nLnVybGVuY29kZSgka2V5KTt9fXByaXZhdGUKc3RhdGljCmZ1bmN0aW9uCmRlbGV0ZSgkZmlsZSwkaGFuZGxlPU5VTEwpe2lmKEB1bmxpbmsoJGZpbGUpKXtpZigkaGFuZGxlKWZjbG9zZSgkaGFuZGxlKTtyZXR1cm47fWlmKCEkaGFuZGxlKXskaGFuZGxlPUBmb3BlbigkZmlsZSwncisnKTt9aWYoJGhhbmRsZSl7ZmxvY2soJGhhbmRsZSxMT0NLX0VYKTtmdHJ1bmNhdGUoJGhhbmRsZSwwKTtmY2xvc2UoJGhhbmRsZSk7QHVubGluaygkZmlsZSk7fX1wcm90ZWN0ZWQKZnVuY3Rpb24KZ2V0RGIoKXtpZigkdGhpcy0+ZGI9PT1OVUxMKXtpZighZXh0ZW5zaW9uX2xvYWRlZCgnc3FsaXRlJykpe3Rocm93Cm5ldwpJbnZhbGlkU3RhdGVFeGNlcHRpb24oIlNRTGl0ZSBleHRlbnNpb24gaXMgcmVxdWlyZWQgZm9yIHN0b3JpbmcgdGFncyBhbmQgcHJpb3JpdGllcy4iKTt9JHRoaXMtPmRiPXNxbGl0ZV9vcGVuKCR0aGlzLT5kaXIuJy9jYWNoZWpvdXJuYWwuc2RiJyk7QHNxbGl0ZV9leGVjKCR0aGlzLT5kYiwnQ1JFQVRFIFRBQkxFIGNhY2hlIChmaWxlIFZBUkNIQVIgTk9UIE5VTEwsIHByaW9yaXR5LCB0YWcgVkFSQ0hBUik7CgkJCUNSRUFURSBJTkRFWCBJRFhfRklMRSBPTiBjYWNoZSAoZmlsZSk7IENSRUFURSBJTkRFWCBJRFhfUFJJIE9OIGNhY2hlIChwcmlvcml0eSk7IENSRUFURSBJTkRFWCBJRFhfVEFHIE9OIGNhY2hlICh0YWcpOycpO31yZXR1cm4kdGhpcy0+ZGI7fX1jbGFzcwpOTWVtY2FjaGVkU3RvcmFnZQpleHRlbmRzCk5PYmplY3QKaW1wbGVtZW50cwpJQ2FjaGVTdG9yYWdle2NvbnN0Ck1FVEFfQ0FMTEJBQ0tTPSdjYWxsYmFja3MnO2NvbnN0Ck1FVEFfREFUQT0nZGF0YSc7Y29uc3QKTUVUQV9ERUxUQT0nZGVsdGEnO3ByaXZhdGUkbWVtY2FjaGU7cHJpdmF0ZSRwcmVmaXg7c3RhdGljCmZ1bmN0aW9uCmlzQXZhaWxhYmxlKCl7cmV0dXJuCmV4dGVuc2lvbl9sb2FkZWQoJ21lbWNhY2hlJyk7fWZ1bmN0aW9uCl9fY29uc3RydWN0KCRob3N0PSdsb2NhbGhvc3QnLCRwb3J0PTExMjExLCRwcmVmaXg9Jycpe2lmKCFzZWxmOjppc0F2YWlsYWJsZSgpKXt0aHJvdwpuZXcKRXhjZXB0aW9uKCJQSFAgZXh0ZW5zaW9uICdtZW1jYWNoZScgaXMgbm90IGxvYWRlZC4iKTt9JHRoaXMtPnByZWZpeD0kcHJlZml4OyR0aGlzLT5tZW1jYWNoZT1uZXcKTWVtY2FjaGU7JHRoaXMtPm1lbWNhY2hlLT5jb25uZWN0KCRob3N0LCRwb3J0KTt9ZnVuY3Rpb24KcmVhZCgka2V5KXska2V5PSR0aGlzLT5wcmVmaXguJGtleTskbWV0YT0kdGhpcy0+bWVtY2FjaGUtPmdldCgka2V5KTtpZighJG1ldGEpcmV0dXJuCk5VTEw7aWYoIWVtcHR5KCRtZXRhW3NlbGY6Ok1FVEFfQ0FMTEJBQ0tTXSkmJiFOQ2FjaGU6OmNoZWNrQ2FsbGJhY2tzKCRtZXRhW3NlbGY6Ok1FVEFfQ0FMTEJBQ0tTXSkpeyR0aGlzLT5tZW1jYWNoZS0+ZGVsZXRlKCRrZXkpO3JldHVybgpOVUxMO31pZighZW1wdHkoJG1ldGFbc2VsZjo6TUVUQV9ERUxUQV0pKXskdGhpcy0+bWVtY2FjaGUtPnJlcGxhY2UoJGtleSwkbWV0YSwwLCRtZXRhW3NlbGY6Ok1FVEFfREVMVEFdK3RpbWUoKSk7fXJldHVybiRtZXRhW3NlbGY6Ok1FVEFfREFUQV07fWZ1bmN0aW9uCndyaXRlKCRrZXksJGRhdGEsYXJyYXkkZHApe2lmKCFlbXB0eSgkZHBbTkNhY2hlOjpUQUdTXSl8fGlzc2V0KCRkcFtOQ2FjaGU6OlBSSU9SSVRZXSl8fCFlbXB0eSgkZHBbTkNhY2hlOjpJVEVNU10pKXt0aHJvdwpuZXcKTm90U3VwcG9ydGVkRXhjZXB0aW9uKCdUYWdzLCBwcmlvcml0eSBhbmQgZGVwZW5kZW50IGl0ZW1zIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IE1lbWNhY2hlZFN0b3JhZ2UuJyk7fSRtZXRhPWFycmF5KHNlbGY6Ok1FVEFfREFUQT0+JGRhdGEpOyRleHBpcmU9MDtpZighZW1wdHkoJGRwW05DYWNoZTo6RVhQSVJFXSkpeyRleHBpcmU9KGludCkkZHBbTkNhY2hlOjpFWFBJUkVdO2lmKCFlbXB0eSgkZHBbTkNhY2hlOjpTTElESU5HXSkpeyRtZXRhW3NlbGY6Ok1FVEFfREVMVEFdPSRleHBpcmU7fX1pZighZW1wdHkoJGRwW05DYWNoZTo6Q0FMTEJBQ0tTXSkpeyRtZXRhW3NlbGY6Ok1FVEFfQ0FMTEJBQ0tTXT0kZHBbTkNhY2hlOjpDQUxMQkFDS1NdO30kdGhpcy0+bWVtY2FjaGUtPnNldCgkdGhpcy0+cHJlZml4LiRrZXksJG1ldGEsMCwkZXhwaXJlKTt9ZnVuY3Rpb24KcmVtb3ZlKCRrZXkpeyR0aGlzLT5tZW1jYWNoZS0+ZGVsZXRlKCR0aGlzLT5wcmVmaXguJGtleSk7fWZ1bmN0aW9uCmNsZWFuKGFycmF5JGNvbmRzKXtpZighZW1wdHkoJGNvbmRzW05DYWNoZTo6QUxMXSkpeyR0aGlzLT5tZW1jYWNoZS0+Zmx1c2goKTt9ZWxzZWlmKGlzc2V0KCRjb25kc1tOQ2FjaGU6OlRBR1NdKXx8aXNzZXQoJGNvbmRzW05DYWNoZTo6UFJJT1JJVFldKSl7dGhyb3cKbmV3Ck5vdFN1cHBvcnRlZEV4Y2VwdGlvbignVGFncyBhbmQgcHJpb3JpdHkgaXMgbm90IHN1cHBvcnRlZCBieSBNZW1jYWNoZWRTdG9yYWdlLicpO319fWNsYXNzCk5LZXlOb3RGb3VuZEV4Y2VwdGlvbgpleHRlbmRzClJ1bnRpbWVFeGNlcHRpb257fWNsYXNzCk5IYXNodGFibGUKZXh0ZW5kcwpOQ29sbGVjdGlvbgppbXBsZW1lbnRzCklNYXB7cHJpdmF0ZSR0aHJvd0tleU5vdEZvdW5kPUZBTFNFO2Z1bmN0aW9uCmFkZCgka2V5LCRpdGVtKXtpZighaXNfc2NhbGFyKCRrZXkpKXt0aHJvdwpuZXcKSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJLZXkgbXVzdCBiZSBlaXRoZXIgYSBzdHJpbmcgb3IgYW4gaW50ZWdlciwgIi5nZXR0eXBlKCRrZXkpLiIgZ2l2ZW4uIik7fWlmKHBhcmVudDo6b2Zmc2V0RXhpc3RzKCRrZXkpKXt0aHJvdwpuZXcKSW52YWxpZFN0YXRlRXhjZXB0aW9uKCdBbiBlbGVtZW50IHdpdGggdGhlIHNhbWUga2V5IGFscmVhZHkgZXhpc3RzLicpO30kdGhpcy0+YmVmb3JlQWRkKCRpdGVtKTtwYXJlbnQ6Om9mZnNldFNldCgka2V5LCRpdGVtKTtyZXR1cm4KVFJVRTt9ZnVuY3Rpb24KYXBwZW5kKCRpdGVtKXt0aHJvdwpuZXcKTm90U3VwcG9ydGVkRXhjZXB0aW9uO31mdW5jdGlvbgpnZXRLZXlzKCl7cmV0dXJuCmFycmF5X2tleXMoJHRoaXMtPmdldEFycmF5Q29weSgpKTt9ZnVuY3Rpb24Kc2VhcmNoKCRpdGVtKXtyZXR1cm4KYXJyYXlfc2VhcmNoKCRpdGVtLCR0aGlzLT5nZXRBcnJheUNvcHkoKSxUUlVFKTt9ZnVuY3Rpb24KaW1wb3J0KCRhcnIpeyR0aGlzLT51cGRhdGluZygpO2lmKCEoaXNfYXJyYXkoJGFycil8fCRhcnIKaW5zdGFuY2VvZgpUcmF2ZXJzYWJsZSkpe3Rocm93Cm5ldwpJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIkFyZ3VtZW50IG11c3QgYmUgdHJhdmVyc2FibGUuIik7fWlmKCR0aGlzLT5nZXRJdGVtVHlwZSgpPT09TlVMTCl7JHRoaXMtPnNldEFycmF5KChhcnJheSkkYXJyKTt9ZWxzZXskdGhpcy0+Y2xlYXIoKTtmb3JlYWNoKCRhcnIKYXMka2V5PT4kaXRlbSl7JHRoaXMtPm9mZnNldFNldCgka2V5LCRpdGVtKTt9fX1mdW5jdGlvbgpnZXQoJGtleSwkZGVmYXVsdD1OVUxMKXtpZighaXNfc2NhbGFyKCRrZXkpKXt0aHJvdwpuZXcKSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJLZXkgbXVzdCBiZSBlaXRoZXIgYSBzdHJpbmcgb3IgYW4gaW50ZWdlciwgIi5nZXR0eXBlKCRrZXkpLiIgZ2l2ZW4uIik7fWlmKHBhcmVudDo6b2Zmc2V0RXhpc3RzKCRrZXkpKXtyZXR1cm4KcGFyZW50OjpvZmZzZXRHZXQoJGtleSk7fWVsc2V7cmV0dXJuJGRlZmF1bHQ7fX1mdW5jdGlvbgp0aHJvd0tleU5vdEZvdW5kKCR2YWw9VFJVRSl7JHRoaXMtPnRocm93S2V5Tm90Rm91bmQ9KGJvb2wpJHZhbDt9ZnVuY3Rpb24Kb2Zmc2V0U2V0KCRrZXksJGl0ZW0pe2lmKCFpc19zY2FsYXIoJGtleSkpe3Rocm93Cm5ldwpJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIktleSBtdXN0IGJlIGVpdGhlciBhIHN0cmluZyBvciBhbiBpbnRlZ2VyLCAiLmdldHR5cGUoJGtleSkuIiBnaXZlbi4iKTt9JHRoaXMtPmJlZm9yZUFkZCgkaXRlbSk7cGFyZW50OjpvZmZzZXRTZXQoJGtleSwkaXRlbSk7fWZ1bmN0aW9uCm9mZnNldEdldCgka2V5KXtpZighaXNfc2NhbGFyKCRrZXkpKXt0aHJvdwpuZXcKSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJLZXkgbXVzdCBiZSBlaXRoZXIgYSBzdHJpbmcgb3IgYW4gaW50ZWdlciwgIi5nZXR0eXBlKCRrZXkpLiIgZ2l2ZW4uIik7fWlmKHBhcmVudDo6b2Zmc2V0RXhpc3RzKCRrZXkpKXtyZXR1cm4KcGFyZW50OjpvZmZzZXRHZXQoJGtleSk7fWVsc2VpZigkdGhpcy0+dGhyb3dLZXlOb3RGb3VuZCl7dGhyb3cKbmV3Ck5LZXlOb3RGb3VuZEV4Y2VwdGlvbjt9ZWxzZXtyZXR1cm4KTlVMTDt9fWZ1bmN0aW9uCm9mZnNldEV4aXN0cygka2V5KXtpZighaXNfc2NhbGFyKCRrZXkpKXt0aHJvdwpuZXcKSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJLZXkgbXVzdCBiZSBlaXRoZXIgYSBzdHJpbmcgb3IgYW4gaW50ZWdlciwgIi5nZXR0eXBlKCRrZXkpLiIgZ2l2ZW4uIik7fXJldHVybgpwYXJlbnQ6Om9mZnNldEV4aXN0cygka2V5KTt9ZnVuY3Rpb24Kb2Zmc2V0VW5zZXQoJGtleSl7JHRoaXMtPnVwZGF0aW5nKCk7aWYoIWlzX3NjYWxhcigka2V5KSl7dGhyb3cKbmV3CkludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiS2V5IG11c3QgYmUgZWl0aGVyIGEgc3RyaW5nIG9yIGFuIGludGVnZXIsICIuZ2V0dHlwZSgka2V5KS4iIGdpdmVuLiIpO31pZihwYXJlbnQ6Om9mZnNldEV4aXN0cygka2V5KSl7cGFyZW50OjpvZmZzZXRVbnNldCgka2V5KTt9fX1jbGFzcwpOU2V0CmV4dGVuZHMKTkNvbGxlY3Rpb24KaW1wbGVtZW50cwpJU2V0e2Z1bmN0aW9uCmFwcGVuZCgkaXRlbSl7JHRoaXMtPmJlZm9yZUFkZCgkaXRlbSk7aWYoaXNfb2JqZWN0KCRpdGVtKSl7JGtleT1zcGxfb2JqZWN0X2hhc2goJGl0ZW0pO2lmKHBhcmVudDo6b2Zmc2V0RXhpc3RzKCRrZXkpKXtyZXR1cm4KRkFMU0U7fXBhcmVudDo6b2Zmc2V0U2V0KCRrZXksJGl0ZW0pO3JldHVybgpUUlVFO31lbHNleyRrZXk9JHRoaXMtPnNlYXJjaCgkaXRlbSk7aWYoJGtleT09PUZBTFNFKXtwYXJlbnQ6Om9mZnNldFNldChOVUxMLCRpdGVtKTtyZXR1cm4KVFJVRTt9cmV0dXJuCkZBTFNFO319cHJvdGVjdGVkCmZ1bmN0aW9uCnNlYXJjaCgkaXRlbSl7aWYoaXNfb2JqZWN0KCRpdGVtKSl7JGtleT1zcGxfb2JqZWN0X2hhc2goJGl0ZW0pO3JldHVybgpwYXJlbnQ6Om9mZnNldEV4aXN0cygka2V5KT8ka2V5OkZBTFNFO31lbHNle3JldHVybgphcnJheV9zZWFyY2goJGl0ZW0sJHRoaXMtPmdldEFycmF5Q29weSgpLFRSVUUpO319ZnVuY3Rpb24Kb2Zmc2V0U2V0KCRrZXksJGl0ZW0pe2lmKCRrZXk9PT1OVUxMKXskdGhpcy0+YXBwZW5kKCRpdGVtKTt9ZWxzZXt0aHJvdwpuZXcKTm90U3VwcG9ydGVkRXhjZXB0aW9uO319ZnVuY3Rpb24Kb2Zmc2V0R2V0KCRrZXkpe3Rocm93Cm5ldwpOb3RTdXBwb3J0ZWRFeGNlcHRpb247fWZ1bmN0aW9uCm9mZnNldEV4aXN0cygka2V5KXt0aHJvdwpuZXcKTm90U3VwcG9ydGVkRXhjZXB0aW9uO31mdW5jdGlvbgpvZmZzZXRVbnNldCgka2V5KXt0aHJvdwpuZXcKTm90U3VwcG9ydGVkRXhjZXB0aW9uO319Y2xhc3MKTkNvbmZpZwpleHRlbmRzCk5IYXNodGFibGV7Y29uc3QKUkVBRE9OTFk9MTtjb25zdApFWFBBTkQ9Mjtwcml2YXRlCnN0YXRpYyRleHRlbnNpb25zPWFycmF5KCdpbmknPT4nTkNvbmZpZ0FkYXB0ZXJJbmknKTtzdGF0aWMKZnVuY3Rpb24KcmVnaXN0ZXJFeHRlbnNpb24oJGV4dGVuc2lvbiwkY2xhc3Mpe2lmKCFjbGFzc19leGlzdHMoJGNsYXNzKSl7dGhyb3cKbmV3CkludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiQ2xhc3MgJyRjbGFzcycgd2FzIG5vdCBmb3VuZC4iKTt9aWYoIU5DbGFzc1JlZmxlY3Rpb246OmZyb20oJGNsYXNzKS0+aW1wbGVtZW50c0ludGVyZmFjZSgnSUNvbmZpZ0FkYXB0ZXInKSl7dGhyb3cKbmV3CkludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiQ29uZmlndXJhdGlvbiBhZGFwdGVyICckY2xhc3MnIGlzIG5vdCBOZXR0ZVxcQ29uZmlnXFxJQ29uZmlnQWRhcHRlciBpbXBsZW1lbnRvci4iKTt9c2VsZjo6JGV4dGVuc2lvbnNbc3RydG9sb3dlcigkZXh0ZW5zaW9uKV09JGNsYXNzO31zdGF0aWMKZnVuY3Rpb24KZnJvbUZpbGUoJGZpbGUsJHNlY3Rpb249TlVMTCwkZmxhZ3M9c2VsZjo6UkVBRE9OTFkpeyRleHRlbnNpb249c3RydG9sb3dlcihwYXRoaW5mbygkZmlsZSxQQVRISU5GT19FWFRFTlNJT04pKTtpZihpc3NldChzZWxmOjokZXh0ZW5zaW9uc1skZXh0ZW5zaW9uXSkpeyRhcnI9Y2FsbF91c2VyX2Z1bmMoYXJyYXkoc2VsZjo6JGV4dGVuc2lvbnNbJGV4dGVuc2lvbl0sJ2xvYWQnKSwkZmlsZSwkc2VjdGlvbik7cmV0dXJuCm5ldwpzZWxmKCRhcnIsJGZsYWdzKTt9ZWxzZXt0aHJvdwpuZXcKSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIGZpbGUgZXh0ZW5zaW9uICckZmlsZScuIik7fX1mdW5jdGlvbgpfX2NvbnN0cnVjdCgkYXJyPU5VTEwsJGZsYWdzPXNlbGY6OlJFQURPTkxZKXtwYXJlbnQ6Ol9fY29uc3RydWN0KCRhcnIpO2lmKCRhcnIhPT1OVUxMKXtpZigkZmxhZ3Mmc2VsZjo6RVhQQU5EKXskdGhpcy0+ZXhwYW5kKCk7fWlmKCRmbGFncyZzZWxmOjpSRUFET05MWSl7JHRoaXMtPmZyZWV6ZSgpO319fWZ1bmN0aW9uCnNhdmUoJGZpbGUsJHNlY3Rpb249TlVMTCl7JGV4dGVuc2lvbj1zdHJ0b2xvd2VyKHBhdGhpbmZvKCRmaWxlLFBBVEhJTkZPX0VYVEVOU0lPTikpO2lmKGlzc2V0KHNlbGY6OiRleHRlbnNpb25zWyRleHRlbnNpb25dKSl7cmV0dXJuCmNhbGxfdXNlcl9mdW5jKGFycmF5KHNlbGY6OiRleHRlbnNpb25zWyRleHRlbnNpb25dLCdzYXZlJyksJHRoaXMsJGZpbGUsJHNlY3Rpb24pO31lbHNle3Rocm93Cm5ldwpJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIlVua25vd24gZmlsZSBleHRlbnNpb24gJyRmaWxlJy4iKTt9fWZ1bmN0aW9uCmV4cGFuZCgpeyR0aGlzLT51cGRhdGluZygpOyRkYXRhPSR0aGlzLT5nZXRBcnJheUNvcHkoKTtmb3JlYWNoKCRkYXRhCmFzJGtleT0+JHZhbCl7aWYoaXNfc3RyaW5nKCR2YWwpKXskZGF0YVska2V5XT1ORW52aXJvbm1lbnQ6OmV4cGFuZCgkdmFsKTt9ZWxzZWlmKCR2YWwKaW5zdGFuY2VvZgpzZWxmKXskdmFsLT5leHBhbmQoKTt9fSR0aGlzLT5zZXRBcnJheSgkZGF0YSk7fWZ1bmN0aW9uCmltcG9ydCgkYXJyKXskdGhpcy0+dXBkYXRpbmcoKTtmb3JlYWNoKCRhcnIKYXMka2V5PT4kdmFsKXtpZihpc19hcnJheSgkdmFsKSl7JGFyclska2V5XT0kb2JqPWNsb25lJHRoaXM7JG9iai0+aW1wb3J0KCR2YWwpO319JHRoaXMtPnNldEFycmF5KCRhcnIpO31mdW5jdGlvbgp0b0FycmF5KCl7JHJlcz0kdGhpcy0+Z2V0QXJyYXlDb3B5KCk7Zm9yZWFjaCgkcmVzCmFzJGtleT0+JHZhbCl7aWYoJHZhbAppbnN0YW5jZW9mCnNlbGYpeyRyZXNbJGtleV09JHZhbC0+dG9BcnJheSgpO319cmV0dXJuJHJlczt9ZnVuY3Rpb24KZnJlZXplKCl7cGFyZW50OjpmcmVlemUoKTtmb3JlYWNoKCR0aGlzLT5nZXRBcnJheUNvcHkoKWFzJHZhbCl7aWYoJHZhbAppbnN0YW5jZW9mCnNlbGYpeyR2YWwtPmZyZWV6ZSgpO319fWZ1bmN0aW9uCl9fY2xvbmUoKXtwYXJlbnQ6Ol9fY2xvbmUoKTskZGF0YT0kdGhpcy0+Z2V0QXJyYXlDb3B5KCk7Zm9yZWFjaCgkZGF0YQphcyRrZXk9PiR2YWwpe2lmKCR2YWwKaW5zdGFuY2VvZgpzZWxmKXskZGF0YVska2V5XT1jbG9uZSR2YWw7fX0kdGhpcy0+c2V0QXJyYXkoJGRhdGEpO31mdW5jdGlvbiZfX2dldCgka2V5KXskdmFsPSR0aGlzLT5vZmZzZXRHZXQoJGtleSk7cmV0dXJuJHZhbDt9ZnVuY3Rpb24KX19zZXQoJGtleSwkaXRlbSl7JHRoaXMtPm9mZnNldFNldCgka2V5LCRpdGVtKTt9ZnVuY3Rpb24KX19pc3NldCgka2V5KXtyZXR1cm4kdGhpcy0+b2Zmc2V0RXhpc3RzKCRrZXkpO31mdW5jdGlvbgpfX3Vuc2V0KCRrZXkpeyR0aGlzLT5vZmZzZXRVbnNldCgka2V5KTt9fWZpbmFsCmNsYXNzCk5Db25maWdBZGFwdGVySW5pCmltcGxlbWVudHMKSUNvbmZpZ0FkYXB0ZXJ7cHVibGljCnN0YXRpYyRrZXlTZXBhcmF0b3I9Jy4nO3B1YmxpYwpzdGF0aWMkc2VjdGlvblNlcGFyYXRvcj0nIDwgJztwdWJsaWMKc3RhdGljJHJhd1NlY3Rpb249JyEnO2ZpbmFsCmZ1bmN0aW9uCl9fY29uc3RydWN0KCl7dGhyb3cKbmV3CkxvZ2ljRXhjZXB0aW9uKCJDYW5ub3QgaW5zdGFudGlhdGUgc3RhdGljIGNsYXNzICIuZ2V0X2NsYXNzKCR0aGlzKSk7fXN0YXRpYwpmdW5jdGlvbgpsb2FkKCRmaWxlLCRzZWN0aW9uPU5VTEwpe2lmKCFpc19maWxlKCRmaWxlKXx8IWlzX3JlYWRhYmxlKCRmaWxlKSl7dGhyb3cKbmV3CkZpbGVOb3RGb3VuZEV4Y2VwdGlvbigiRmlsZSAnJGZpbGUnIGlzIG1pc3Npbmcgb3IgaXMgbm90IHJlYWRhYmxlLiIpO31OVG9vbHM6OnRyeUVycm9yKCk7JGluaT1wYXJzZV9pbmlfZmlsZSgkZmlsZSxUUlVFKTtpZihOVG9vbHM6OmNhdGNoRXJyb3IoJG1zZykpe3Rocm93Cm5ldwpFeGNlcHRpb24oJG1zZyk7fSRzZXBhcmF0b3I9dHJpbShzZWxmOjokc2VjdGlvblNlcGFyYXRvcik7JGRhdGE9YXJyYXkoKTtmb3JlYWNoKCRpbmkKYXMkc2VjTmFtZT0+JHNlY0RhdGEpe2lmKGlzX2FycmF5KCRzZWNEYXRhKSl7aWYoc3Vic3RyKCRzZWNOYW1lLC0xKT09PXNlbGY6OiRyYXdTZWN0aW9uKXskc2VjTmFtZT1zdWJzdHIoJHNlY05hbWUsMCwtMSk7fWVsc2VpZihzZWxmOjoka2V5U2VwYXJhdG9yKXskdG1wPWFycmF5KCk7Zm9yZWFjaCgkc2VjRGF0YQphcyRrZXk9PiR2YWwpeyRjdXJzb3I9JiR0bXA7Zm9yZWFjaChleHBsb2RlKHNlbGY6OiRrZXlTZXBhcmF0b3IsJGtleSlhcyRwYXJ0KXtpZighaXNzZXQoJGN1cnNvclskcGFydF0pfHxpc19hcnJheSgkY3Vyc29yWyRwYXJ0XSkpeyRjdXJzb3I9JiRjdXJzb3JbJHBhcnRdO31lbHNle3Rocm93Cm5ldwpJbnZhbGlkU3RhdGVFeGNlcHRpb24oIkludmFsaWQga2V5ICcka2V5JyBpbiBzZWN0aW9uIFskc2VjTmFtZV0gaW4gJyRmaWxlJy4iKTt9fSRjdXJzb3I9JHZhbDt9JHNlY0RhdGE9JHRtcDt9JHBhcnRzPSRzZXBhcmF0b3I/ZXhwbG9kZSgkc2VwYXJhdG9yLHN0cnRyKCRzZWNOYW1lLCc6Jywkc2VwYXJhdG9yKSk6YXJyYXkoJHNlY05hbWUpO2lmKGNvdW50KCRwYXJ0cyk+MSl7JHBhcmVudD10cmltKCRwYXJ0c1sxXSk7JGN1cnNvcj0mJGRhdGE7Zm9yZWFjaChzZWxmOjoka2V5U2VwYXJhdG9yP2V4cGxvZGUoc2VsZjo6JGtleVNlcGFyYXRvciwkcGFyZW50KTphcnJheSgkcGFyZW50KWFzJHBhcnQpe2lmKGlzc2V0KCRjdXJzb3JbJHBhcnRdKSYmaXNfYXJyYXkoJGN1cnNvclskcGFydF0pKXskY3Vyc29yPSYkY3Vyc29yWyRwYXJ0XTt9ZWxzZXt0aHJvdwpuZXcKSW52YWxpZFN0YXRlRXhjZXB0aW9uKCJNaXNzaW5nIHBhcmVudCBzZWN0aW9uIFskcGFyZW50XSBpbiAnJGZpbGUnLiIpO319JHNlY0RhdGE9TkFycmF5VG9vbHM6Om1lcmdlVHJlZSgkc2VjRGF0YSwkY3Vyc29yKTt9JHNlY05hbWU9dHJpbSgkcGFydHNbMF0pO2lmKCRzZWNOYW1lPT09Jycpe3Rocm93Cm5ldwpJbnZhbGlkU3RhdGVFeGNlcHRpb24oIkludmFsaWQgZW1wdHkgc2VjdGlvbiBuYW1lIGluICckZmlsZScuIik7fX1pZihzZWxmOjoka2V5U2VwYXJhdG9yKXskY3Vyc29yPSYkZGF0YTtmb3JlYWNoKGV4cGxvZGUoc2VsZjo6JGtleVNlcGFyYXRvciwkc2VjTmFtZSlhcyRwYXJ0KXtpZighaXNzZXQoJGN1cnNvclskcGFydF0pfHxpc19hcnJheSgkY3Vyc29yWyRwYXJ0XSkpeyRjdXJzb3I9JiRjdXJzb3JbJHBhcnRdO31lbHNle3Rocm93Cm5ldwpJbnZhbGlkU3RhdGVFeGNlcHRpb24oIkludmFsaWQgc2VjdGlvbiBbJHNlY05hbWVdIGluICckZmlsZScuIik7fX19ZWxzZXskY3Vyc29yPSYkZGF0YVskc2VjTmFtZV07fWlmKGlzX2FycmF5KCRzZWNEYXRhKSYmaXNfYXJyYXkoJGN1cnNvcikpeyRzZWNEYXRhPU5BcnJheVRvb2xzOjptZXJnZVRyZWUoJHNlY0RhdGEsJGN1cnNvcik7fSRjdXJzb3I9JHNlY0RhdGE7fWlmKCRzZWN0aW9uPT09TlVMTCl7cmV0dXJuJGRhdGE7fWVsc2VpZighaXNzZXQoJGRhdGFbJHNlY3Rpb25dKXx8IWlzX2FycmF5KCRkYXRhWyRzZWN0aW9uXSkpe3Rocm93Cm5ldwpJbnZhbGlkU3RhdGVFeGNlcHRpb24oIlRoZXJlIGlzIG5vdCBzZWN0aW9uIFskc2VjdGlvbl0gaW4gJyRmaWxlJy4iKTt9ZWxzZXtyZXR1cm4kZGF0YVskc2VjdGlvbl07fX1zdGF0aWMKZnVuY3Rpb24Kc2F2ZSgkY29uZmlnLCRmaWxlLCRzZWN0aW9uPU5VTEwpeyRvdXRwdXQ9YXJyYXkoKTskb3V0cHV0W109JzsgZ2VuZXJhdGVkIGJ5IE5ldHRlJzskb3V0cHV0W109Jyc7aWYoJHNlY3Rpb249PT1OVUxMKXtmb3JlYWNoKCRjb25maWcKYXMkc2VjTmFtZT0+JHNlY0RhdGEpe2lmKCEoaXNfYXJyYXkoJHNlY0RhdGEpfHwkc2VjRGF0YQppbnN0YW5jZW9mClRyYXZlcnNhYmxlKSl7dGhyb3cKbmV3CkludmFsaWRTdGF0ZUV4Y2VwdGlvbigiSW52YWxpZCBzZWN0aW9uICckc2VjdGlvbicuIik7fSRvdXRwdXRbXT0iWyRzZWNOYW1lXSI7c2VsZjo6YnVpbGQoJHNlY0RhdGEsJG91dHB1dCwnJyk7JG91dHB1dFtdPScnO319ZWxzZXskb3V0cHV0W109Ilskc2VjdGlvbl0iO3NlbGY6OmJ1aWxkKCRjb25maWcsJG91dHB1dCwnJyk7JG91dHB1dFtdPScnO31pZighZmlsZV9wdXRfY29udGVudHMoJGZpbGUsaW1wbG9kZShQSFBfRU9MLCRvdXRwdXQpKSl7dGhyb3cKbmV3CklPRXhjZXB0aW9uKCJDYW5ub3Qgd3JpdGUgZmlsZSAnJGZpbGUnLiIpO319cHJpdmF0ZQpzdGF0aWMKZnVuY3Rpb24KYnVpbGQoJGlucHV0LCYkb3V0cHV0LCRwcmVmaXgpe2ZvcmVhY2goJGlucHV0CmFzJGtleT0+JHZhbCl7aWYoaXNfYXJyYXkoJHZhbCl8fCR2YWwKaW5zdGFuY2VvZgpUcmF2ZXJzYWJsZSl7c2VsZjo6YnVpbGQoJHZhbCwkb3V0cHV0LCRwcmVmaXguJGtleS5zZWxmOjoka2V5U2VwYXJhdG9yKTt9ZWxzZWlmKGlzX2Jvb2woJHZhbCkpeyRvdXRwdXRbXT0iJHByZWZpeCRrZXkgPSAiLigkdmFsPyd0cnVlJzonZmFsc2UnKTt9ZWxzZWlmKGlzX251bWVyaWMoJHZhbCkpeyRvdXRwdXRbXT0iJHByZWZpeCRrZXkgPSAkdmFsIjt9ZWxzZWlmKGlzX3N0cmluZygkdmFsKSl7JG91dHB1dFtdPSIkcHJlZml4JGtleSA9IFwiJHZhbFwiIjt9ZWxzZXt0aHJvdwpuZXcKSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgJyRwcmVmaXgka2V5JyBpdGVtIG11c3QgYmUgc2NhbGFyIG9yIGFycmF5LCAiLmdldHR5cGUoJHZhbCkuIiBnaXZlbi4iKTt9fX19ZmluYWwKY2xhc3MKTkRlYnVne3B1YmxpYwpzdGF0aWMkcHJvZHVjdGlvbk1vZGU7cHVibGljCnN0YXRpYyRjb25zb2xlTW9kZTtwdWJsaWMKc3RhdGljJHRpbWU7cHJpdmF0ZQpzdGF0aWMkZmlyZWJ1Z0RldGVjdGVkO3ByaXZhdGUKc3RhdGljJGFqYXhEZXRlY3RlZDtwcml2YXRlCnN0YXRpYyRjb25zb2xlRGF0YTtwdWJsaWMKc3RhdGljJG1heERlcHRoPTM7cHVibGljCnN0YXRpYyRtYXhMZW49MTUwO3B1YmxpYwpzdGF0aWMkc2hvd0xvY2F0aW9uPUZBTFNFO2NvbnN0CkRFVkVMT1BNRU5UPUZBTFNFO2NvbnN0ClBST0RVQ1RJT049VFJVRTtjb25zdApERVRFQ1Q9TlVMTDtwdWJsaWMKc3RhdGljJHN0cmljdE1vZGU9RkFMU0U7cHVibGljCnN0YXRpYyRvbkZhdGFsRXJyb3I9YXJyYXkoKTtwdWJsaWMKc3RhdGljJG1haWxlcj1hcnJheShfX0NMQVNTX18sJ2RlZmF1bHRNYWlsZXInKTtwdWJsaWMKc3RhdGljJGVtYWlsU25vb3plPTE3MjgwMDtwcml2YXRlCnN0YXRpYyRlbmFibGVkPUZBTFNFO3ByaXZhdGUKc3RhdGljJGxvZ0ZpbGU7cHJpdmF0ZQpzdGF0aWMkbG9nSGFuZGxlO3ByaXZhdGUKc3RhdGljJHNlbmRFbWFpbHM7cHJpdmF0ZQpzdGF0aWMkZW1haWxIZWFkZXJzPWFycmF5KCdUbyc9PicnLCdGcm9tJz0+J25vcmVwbHlAJWhvc3QlJywnWC1NYWlsZXInPT4nTmV0dGUgRnJhbWV3b3JrJywnU3ViamVjdCc9PidQSFA6IEFuIGVycm9yIG9jY3VycmVkIG9uIHRoZSBzZXJ2ZXIgJWhvc3QlJywnQm9keSc9PidbJWRhdGUlXSAlbWVzc2FnZSUnKTtwcml2YXRlCnN0YXRpYyRjb2xvcGhvbnM9YXJyYXkoYXJyYXkoX19DTEFTU19fLCdnZXREZWZhdWx0Q29sb3Bob25zJykpO3ByaXZhdGUKc3RhdGljJGVuYWJsZWRQcm9maWxlcj1GQUxTRTtwdWJsaWMKc3RhdGljJGNvdW50ZXJzPWFycmF5KCk7Y29uc3QKTE9HPSdMT0cnO2NvbnN0CklORk89J0lORk8nO2NvbnN0CldBUk49J1dBUk4nO2NvbnN0CkVSUk9SPSdFUlJPUic7Y29uc3QKVFJBQ0U9J1RSQUNFJztjb25zdApFWENFUFRJT049J0VYQ0VQVElPTic7Y29uc3QKR1JPVVBfU1RBUlQ9J0dST1VQX1NUQVJUJztjb25zdApHUk9VUF9FTkQ9J0dST1VQX0VORCc7ZmluYWwKZnVuY3Rpb24KX19jb25zdHJ1Y3QoKXt0aHJvdwpuZXcKTG9naWNFeGNlcHRpb24oIkNhbm5vdCBpbnN0YW50aWF0ZSBzdGF0aWMgY2xhc3MgIi5nZXRfY2xhc3MoJHRoaXMpKTt9c3RhdGljCmZ1bmN0aW9uCl9pbml0KCl7c2VsZjo6JHRpbWU9bWljcm90aW1lKFRSVUUpO3NlbGY6OiRjb25zb2xlTW9kZT1QSFBfU0FQST09PSdjbGknO3NlbGY6OiRwcm9kdWN0aW9uTW9kZT1zZWxmOjpERVRFQ1Q7c2VsZjo6JGZpcmVidWdEZXRlY3RlZD1pc3NldCgkX1NFUlZFUlsnSFRUUF9VU0VSX0FHRU5UJ10pJiZzdHJwb3MoJF9TRVJWRVJbJ0hUVFBfVVNFUl9BR0VOVCddLCdGaXJlUEhQLycpO3NlbGY6OiRhamF4RGV0ZWN0ZWQ9aXNzZXQoJF9TRVJWRVJbJ0hUVFBfWF9SRVFVRVNURURfV0lUSCddKSYmJF9TRVJWRVJbJ0hUVFBfWF9SRVFVRVNURURfV0lUSCddPT09J1hNTEh0dHBSZXF1ZXN0JztyZWdpc3Rlcl9zaHV0ZG93bl9mdW5jdGlvbihhcnJheShfX0NMQVNTX18sJ19zaHV0ZG93bkhhbmRsZXInKSk7fXN0YXRpYwpmdW5jdGlvbgpfc2h1dGRvd25IYW5kbGVyKCl7c3RhdGljJHR5cGVzPWFycmF5KEVfRVJST1I9PjEsRV9DT1JFX0VSUk9SPT4xLEVfQ09NUElMRV9FUlJPUj0+MSxFX1BBUlNFPT4xKTskZXJyb3I9ZXJyb3JfZ2V0X2xhc3QoKTtpZihzZWxmOjokZW5hYmxlZCYmaXNzZXQoJHR5cGVzWyRlcnJvclsndHlwZSddXSkpe2lmKCFoZWFkZXJzX3NlbnQoKSl7aGVhZGVyKCdIVFRQLzEuMSA1MDAgSW50ZXJuYWwgU2VydmVyIEVycm9yJyk7fWlmKGluaV9nZXQoJ2h0bWxfZXJyb3JzJykpeyRlcnJvclsnbWVzc2FnZSddPWh0bWxfZW50aXR5X2RlY29kZShzdHJpcF90YWdzKCRlcnJvclsnbWVzc2FnZSddKSxFTlRfUVVPVEVTLCdVVEYtOCcpO31zZWxmOjpwcm9jZXNzRXhjZXB0aW9uKG5ldwpGYXRhbEVycm9yRXhjZXB0aW9uKCRlcnJvclsnbWVzc2FnZSddLDAsJGVycm9yWyd0eXBlJ10sJGVycm9yWydmaWxlJ10sJGVycm9yWydsaW5lJ10sTlVMTCksVFJVRSk7fWlmKHNlbGY6OiRwcm9kdWN0aW9uTW9kZSl7cmV0dXJuO31mb3JlYWNoKGhlYWRlcnNfbGlzdCgpYXMkaGVhZGVyKXtpZihzdHJuY2FzZWNtcCgkaGVhZGVyLCdDb250ZW50LVR5cGU6JywxMyk9PT0wKXtpZihzdWJzdHIoJGhlYWRlciwxNCw5KT09PSd0ZXh0L2h0bWwnKXticmVhazt9cmV0dXJuO319aWYoc2VsZjo6JGVuYWJsZWRQcm9maWxlcil7aWYoc2VsZjo6JGZpcmVidWdEZXRlY3RlZCl7c2VsZjo6ZmlyZUxvZygnTmV0dGUgcHJvZmlsZXInLHNlbGY6OkdST1VQX1NUQVJUKTtmb3JlYWNoKHNlbGY6OiRjb2xvcGhvbnMKYXMkY2FsbGJhY2spe2ZvcmVhY2goKGFycmF5KWNhbGxfdXNlcl9mdW5jKCRjYWxsYmFjaywncHJvZmlsZXInKWFzJGxpbmUpc2VsZjo6ZmlyZUxvZyhzdHJpcF90YWdzKCRsaW5lKSk7fXNlbGY6OmZpcmVMb2coTlVMTCxzZWxmOjpHUk9VUF9FTkQpO31pZighc2VsZjo6JGFqYXhEZXRlY3RlZCl7JGNvbG9waG9ucz1zZWxmOjokY29sb3Bob25zOz8+Cgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPiNuZXR0ZVByb2ZpbGVyQ29udGFpbmVye3Bvc2l0aW9uOmZpeGVkO19wb3NpdGlvbjphYnNvbHV0ZTtyaWdodDo1cHg7Ym90dG9tOjVweDt6LWluZGV4OjIzMTc4fSNuZXR0ZVByb2ZpbGVye2ZvbnQ6bm9ybWFsIG5vcm1hbCAxMXB4LzEuNCBDb25zb2xhcyxBcmlhbDtwb3NpdGlvbjpyZWxhdGl2ZTtwYWRkaW5nOjNweDtjb2xvcjpibGFjaztiYWNrZ3JvdW5kOiNFRUU7Ym9yZGVyOjFweCBkb3R0ZWQgZ3JheTtjdXJzb3I6bW92ZTtvcGFjaXR5Oi43MDs9ZmlsdGVyOmFscGhhKG9wYWNpdHk9NzApfSNuZXR0ZVByb2ZpbGVyICp7Y29sb3I6aW5oZXJpdDtiYWNrZ3JvdW5kOmluaGVyaXQ7dGV4dC1hbGlnbjppbmhlcml0fSNuZXR0ZVByb2ZpbGVySWNvbntwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDowO3RvcDowO2xpbmUtaGVpZ2h0OjE7cGFkZGluZzoycHg7Y29sb3I6YmxhY2s7dGV4dC1kZWNvcmF0aW9uOm5vbmV9I25ldHRlUHJvZmlsZXI6aG92ZXJ7b3BhY2l0eToxOz1maWx0ZXI6bm9uZX0jbmV0dGVQcm9maWxlciB1bHttYXJnaW46MDtwYWRkaW5nOjA7d2lkdGg6MzUwcHh9I25ldHRlUHJvZmlsZXIgbGl7bWFyZ2luOjA7cGFkZGluZzoxcHg7dGV4dC1hbGlnbjpsZWZ0O2xpc3Qtc3R5bGU6bm9uZX0jbmV0dGVQcm9maWxlciBzcGFuW3RpdGxlXXtib3JkZXItYm90dG9tOjFweCBkb3R0ZWQgZ3JheTtjdXJzb3I6aGVscH0jbmV0dGVQcm9maWxlciBzdHJvbmd7Y29sb3I6cmVkfTwvc3R5bGU+CgoKPGRpdiBpZD0ibmV0dGVQcm9maWxlckNvbnRhaW5lciI+CjxkaXYgaWQ9Im5ldHRlUHJvZmlsZXIiPgoJPGEgaWQ9Im5ldHRlUHJvZmlsZXJJY29uIiBocmVmPSIjIj48YWJicj4mI3gyNWJjOzwvYWJicj48L2EKCT48dWw+Cgk8P3BocCBmb3JlYWNoKCRjb2xvcGhvbnMKYXMkY2FsbGJhY2spOj8+Cgk8P3BocCBmb3JlYWNoKChhcnJheSljYWxsX3VzZXJfZnVuYygkY2FsbGJhY2ssJ3Byb2ZpbGVyJylhcyRsaW5lKTo/PjxsaT48P3BocCBlY2hvJGxpbmUsIlxuIj8+PC9saT48P3BocCBlbmRmb3JlYWNoPz4KCTw/cGhwIGVuZGZvcmVhY2g/PgoJPC91bD4KPC9kaXY+CjwvZGl2PgoKCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vKjwhW0NEQVRBWyovZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm5ldHRlUHJvZmlsZXIiKS5vbm1vdXNlZG93bj1mdW5jdGlvbihjKXtjPWN8fGV2ZW50O3RoaXMucG9zWD1wYXJzZUludCh0aGlzLnN0eWxlLmxlZnQrIjAiKTt0aGlzLnBvc1k9cGFyc2VJbnQodGhpcy5zdHlsZS50b3ArIjAiKTt0aGlzLm1vdXNlWD1jLmNsaWVudFg7dGhpcy5tb3VzZVk9Yy5jbGllbnRZO3ZhciBhPXRoaXM7ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm9ubW91c2Vtb3ZlPWZ1bmN0aW9uKGIpe2I9Ynx8ZXZlbnQ7YS5zdHlsZS5sZWZ0PWIuY2xpZW50WC1hLm1vdXNlWCthLnBvc1grInB4IjthLnN0eWxlLnRvcD1iLmNsaWVudFktYS5tb3VzZVkrYS5wb3NZKyJweCI7cmV0dXJuIGZhbHNlfTtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQub25tb3VzZXVwPWZ1bmN0aW9uKCl7ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm9ubW91c2Vtb3ZlPW51bGw7ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm9ubW91c2V1cD1udWxsO2RvY3VtZW50LmNvb2tpZT0KIm5ldHRlUHJvZmlsZXJQb3NpdGlvbj0iK2Euc3R5bGUubGVmdCsiOiIrYS5zdHlsZS50b3ArIjsgcGF0aD0vIjtyZXR1cm4gZmFsc2V9fTsKZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm5ldHRlUHJvZmlsZXJJY29uIikub25jbGljaz1mdW5jdGlvbigpe3ZhciBjPXRoaXMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFiYnIiKVswXSxhPXRoaXMubmV4dFNpYmxpbmcsYj1hLmN1cnJlbnRTdHlsZT9hLmN1cnJlbnRTdHlsZS5kaXNwbGF5PT0ibm9uZSI6Z2V0Q29tcHV0ZWRTdHlsZShhLG51bGwpLmRpc3BsYXk9PSJub25lIjtjLmlubmVySFRNTD1iP1N0cmluZy5mcm9tQ2hhckNvZGUoOTY2MCk6IlByb2ZpbGVyICIrU3RyaW5nLmZyb21DaGFyQ29kZSg5NjU4KTthLnN0eWxlLmRpc3BsYXk9Yj8iYmxvY2siOiJub25lIjtjLnBhcmVudE5vZGUuc3R5bGUucG9zaXRpb249Yj8iYWJzb2x1dGUiOiJzdGF0aWMiO2RvY3VtZW50LmNvb2tpZT0ibmV0dGVQcm9maWxlclZpc2libGU9IitiKjErIjsgcGF0aD0vIjtyZXR1cm4gZmFsc2V9O2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm5ldHRlUHJvZmlsZXJDb250YWluZXIiKSk7CmRvY3VtZW50LmNvb2tpZS5pbmRleE9mKCJuZXR0ZVByb2ZpbGVyVmlzaWJsZT0wIik+LTEmJmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJuZXR0ZVByb2ZpbGVySWNvbiIpLm9uY2xpY2soKTt2YXIgX25ldHRlUG9zPWRvY3VtZW50LmNvb2tpZS5tYXRjaCgvbmV0dGVQcm9maWxlclBvc2l0aW9uPShbMC05LV0rcHgpOihbMC05LV0rcHgpLyk7aWYoX25ldHRlUG9zKXtkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibmV0dGVQcm9maWxlciIpLnN0eWxlLmxlZnQ9X25ldHRlUG9zWzFdO2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJuZXR0ZVByb2ZpbGVyIikuc3R5bGUudG9wPV9uZXR0ZVBvc1syXX07LypdXT4qLzwvc2NyaXB0Pgo8P3BocCB9fWlmKHNlbGY6OiRjb25zb2xlRGF0YSl7JHBheWxvYWQ9c2VsZjo6JGNvbnNvbGVEYXRhO2lmKCFmdW5jdGlvbl9leGlzdHMoJ19uZXR0ZUR1bXBDYjInKSl7ZnVuY3Rpb24KX25ldHRlRHVtcENiMigkbSl7cmV0dXJuIiRtWzFdPGEgaHJlZj0nIycgb25jbGljaz0ncmV0dXJuICFuZXR0ZVRvZ2dsZSh0aGlzKSc+JG1bMl0oJG1bM10pICIuKCRtWzNdPDc/JzxhYmJyPiYjeDI1YmM7PC9hYmJyPiA8L2E+PGNvZGU+JzonPGFiYnI+JiN4MjViYTs8L2FiYnI+IDwvYT48Y29kZSBjbGFzcz0iY29sbGFwc2VkIj4nKTt9fW9iX3N0YXJ0KCk7Pz48IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KPGh0bWwgbGFuZz0iZW4iPgo8aGVhZD4KCTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4KCTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9pbmRleCxub2FyY2hpdmUiPgoJPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJOZXR0ZSBGcmFtZXdvcmsiPgoKCTx0aXRsZT5OZXR0ZSBEZWJ1ZyBDb25zb2xlPC90aXRsZT4KCgk8c3R5bGUgdHlwZT0idGV4dC9jc3MiPmJvZHl7bWFyZ2luOjA7cGFkZGluZzowO2ZvbnQ6OXB0LzEuNSBWZXJkYW5hLHNhbnMtc2VyaWY7YmFja2dyb3VuZDp3aGl0ZTtjb2xvcjojMzMzfWgxe2ZvbnQtc2l6ZToxM3B0O21hcmdpbjowO3BhZGRpbmc6MnB4IDhweDtiYWNrZ3JvdW5kOmJsYWNrO2NvbG9yOndoaXRlO2JvcmRlci1ib3R0b206MXB4IHNvbGlkIGJsYWNrfWgye2ZvbnQ6MTFwdC8xLjUgc2Fucy1zZXJpZjttYXJnaW46MDtwYWRkaW5nOjJweCA4cHg7YmFja2dyb3VuZDojMzQ4NGQyO2NvbG9yOndoaXRlfWF7dGV4dC1kZWNvcmF0aW9uOm5vbmU7Y29sb3I6IzQxOTdFM31hIGFiYnJ7Zm9udC1mYW1pbHk6c2Fucy1zZXJpZjtjb2xvcjojOTk5fXB7bWFyZ2luOi44ZW0gMH1wcmUsY29kZSx0YWJsZXtmb250OjlwdC8xLjUgQ29uc29sYXMsbW9ub3NwYWNlfXByZSx0YWJsZXtiYWNrZ3JvdW5kOiNmZmZiY2M7cGFkZGluZzouNGVtIC43ZW07Ym9yZGVyOjFweCBkb3R0ZWQgc2lsdmVyfXRhYmxlIHByZXtwYWRkaW5nOjA7bWFyZ2luOjA7Ym9yZGVyOm5vbmV9cHJlLmR1bXAgc3Bhbntjb2xvcjojYzE2NTQ5fXByZS5kdW1wIGF7Y29sb3I6IzMzM310YWJsZXtib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7d2lkdGg6MTAwJX10ZCx0aHt2ZXJ0aWNhbC1hbGlnbjp0b3A7dGV4dC1hbGlnbjpsZWZ0O2JvcmRlcjoxcHggc29saWQgI2VlYn10aHt3aWR0aDoxMDtwYWRkaW5nOjJweCAzcHggMnB4IDhweDtmb250LXdlaWdodDpib2xkfXRke3BhZGRpbmc6MnB4IDhweCAycHggM3B4fS5vZGQsLm9kZCBwcmV7YmFja2dyb3VuZDojZmFmNWMzfTwvc3R5bGU+CgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vKjwhW0NEQVRBWyovZG9jdW1lbnQud3JpdGUoIjxzdHlsZT4gLmNvbGxhcHNlZCB7IGRpc3BsYXk6IG5vbmU7IH0gPC9zdHlsZT4iKTtmdW5jdGlvbiBuZXR0ZVRvZ2dsZShhLGIpe3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFiYnIiKVswXTtmb3IoYT1iP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpOmEubmV4dFNpYmxpbmc7YS5ub2RlVHlwZSE9PTE7KWE9YS5uZXh0U2libGluZztiPWEuY3VycmVudFN0eWxlP2EuY3VycmVudFN0eWxlLmRpc3BsYXk9PSJub25lIjpnZXRDb21wdXRlZFN0eWxlKGEsbnVsbCkuZGlzcGxheT09Im5vbmUiO2MuaW5uZXJIVE1MPVN0cmluZy5mcm9tQ2hhckNvZGUoYj85NjYwOjk2NTgpO2Euc3R5bGUuZGlzcGxheT1iP2EudGFnTmFtZS50b0xvd2VyQ2FzZSgpPT09ImNvZGUiPyJpbmxpbmUiOiJibG9jayI6Im5vbmUiO3JldHVybiB0cnVlfTsvKl1dPiovPC9zY3JpcHQ+CjwvaGVhZD4KCgoKPGJvZHk+Cgk8aDE+TmV0dGUgRGVidWcgQ29uc29sZTwvaDE+CjwvYm9keT4KPC9odG1sPgo8P3BocCAkZG9jdW1lbnQ9b2JfZ2V0X2NsZWFuKCk/PgoKPD9waHAgb2Jfc3RhcnQoKT8+Cjw/cGhwIGZvcmVhY2goJHBheWxvYWQKYXMkaXRlbSk6Pz4KCTw/cGhwIGlmKCRpdGVtWyd0aXRsZSddKTo/PgoJPGgyPjw/cGhwIGVjaG8KaHRtbHNwZWNpYWxjaGFycygkaXRlbVsndGl0bGUnXSk/PjwvaDI+Cgk8P3BocCBlbmRpZj8+CgoJPHRhYmxlPgoJPD9waHAgJGk9MD8+Cgk8P3BocCBmb3JlYWNoKCRpdGVtWydkdW1wJ11hcyRrZXk9PiRkdW1wKTo/PgoJPHRyIGNsYXNzPSI8P3BocCBlY2hvJGkrKyUKMj8nb2RkJzonZXZlbic/PiI+CgkJPHRoPjw/cGhwIGVjaG8KaHRtbHNwZWNpYWxjaGFycygka2V5KT8+PC90aD4KCQk8dGQ+PD9waHAgZWNobwpwcmVnX3JlcGxhY2VfY2FsbGJhY2soJyMoPHByZSBjbGFzcz0iZHVtcCI+fFxzKyk/KC4qKVwoKFxkKylcKSA8Y29kZT4jJywnX25ldHRlRHVtcENiMicsJGR1bXApPz48L3RkPgoJPC90cj4KCTw/cGhwIGVuZGZvcmVhY2g/PgoJPC90YWJsZT4KPD9waHAgZW5kZm9yZWFjaD8+Cjw/cGhwICRib2R5PW9iX2dldF9jbGVhbigpPz4KCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLyogPCFbQ0RBVEFbICovCmlmICh0eXBlb2YgX25ldHRlQ29uc29sZSA9PT0gJ3VuZGVmaW5lZCcpIHsKCV9uZXR0ZUNvbnNvbGUgPSB3aW5kb3cub3BlbignJywnX25ldHRlQ29uc29sZScsJ3dpZHRoPTcwMCxoZWlnaHQ9NzAwLHJlc2l6YWJsZSxzY3JvbGxiYXJzPXllcycpOwoJX25ldHRlQ29uc29sZS5kb2N1bWVudC53cml0ZSg8P3BocCBlY2hvCmpzb25fZW5jb2RlKHByZWdfcmVwbGFjZSgnI1sgXHRcclxuXSsjJywnICcsJGRvY3VtZW50KSk/Pik7CglfbmV0dGVDb25zb2xlLmRvY3VtZW50LmNsb3NlKCk7CglfbmV0dGVDb25zb2xlLmRvY3VtZW50Lm9ua2V5dXAgPSBmdW5jdGlvbihlKSB7CgkJZSA9IGUgfHwgX25ldHRlQ29uc29sZS5ldmVudDsKCQlpZiAoZS5rZXlDb2RlID09IDI3KSBfbmV0dGVDb25zb2xlLmNsb3NlKCk7Cgl9CglfbmV0dGVDb25zb2xlLmRvY3VtZW50LmJvZHkuZm9jdXMoKTsKfQpfbmV0dGVDb25zb2xlLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MID0gX25ldHRlQ29uc29sZS5kb2N1bWVudC5ib2R5LmlubmVySFRNTCArIDw/cGhwIGVjaG8KanNvbl9lbmNvZGUoJGJvZHkpPz47Ci8qIF1dPiAqLwo8L3NjcmlwdD4KPD9waHAgfX1zdGF0aWMKZnVuY3Rpb24KZHVtcCgkdmFyLCRyZXR1cm49RkFMU0Upe2lmKCEkcmV0dXJuJiZzZWxmOjokcHJvZHVjdGlvbk1vZGUpe3JldHVybiR2YXI7fSRvdXRwdXQ9IjxwcmUgY2xhc3M9XCJkdW1wXCI+Ii5zZWxmOjpfZHVtcCgkdmFyLDApLiI8L3ByZT5cbiI7aWYoISRyZXR1cm4mJnNlbGY6OiRzaG93TG9jYXRpb24peyR0cmFjZT1kZWJ1Z19iYWNrdHJhY2UoKTskaT1pc3NldCgkdHJhY2VbMV1bJ2NsYXNzJ10pJiYkdHJhY2VbMV1bJ2NsYXNzJ109PT1fX0NMQVNTX18/MTowO2lmKGlzc2V0KCR0cmFjZVskaV1bJ2ZpbGUnXSwkdHJhY2VbJGldWydsaW5lJ10pKXskb3V0cHV0PXN1YnN0cl9yZXBsYWNlKCRvdXRwdXQsJyA8c21hbGw+Jy5odG1sc3BlY2lhbGNoYXJzKCJpbiBmaWxlIHskdHJhY2VbJGldWydmaWxlJ119IG9uIGxpbmUgeyR0cmFjZVskaV1bJ2xpbmUnXX0iLEVOVF9OT1FVT1RFUykuJzwvc21hbGw+JywtOCwwKTt9fWlmKHNlbGY6OiRjb25zb2xlTW9kZSl7JG91dHB1dD1odG1sc3BlY2lhbGNoYXJzX2RlY29kZShzdHJpcF90YWdzKCRvdXRwdXQpLEVOVF9OT1FVT1RFUyk7fWlmKCRyZXR1cm4pe3JldHVybiRvdXRwdXQ7fWVsc2V7ZWNobyRvdXRwdXQ7cmV0dXJuJHZhcjt9fXN0YXRpYwpmdW5jdGlvbgpjb25zb2xlRHVtcCgkdmFyLCR0aXRsZT1OVUxMKXtpZighc2VsZjo6JHByb2R1Y3Rpb25Nb2RlKXskZHVtcD1hcnJheSgpO2ZvcmVhY2goKGlzX2FycmF5KCR2YXIpPyR2YXI6YXJyYXkoJyc9PiR2YXIpKWFzJGtleT0+JHZhbCl7JGR1bXBbJGtleV09c2VsZjo6ZHVtcCgkdmFsLFRSVUUpO31zZWxmOjokY29uc29sZURhdGFbXT1hcnJheSgndGl0bGUnPT4kdGl0bGUsJ2R1bXAnPT4kZHVtcCk7fXJldHVybiR2YXI7fXByaXZhdGUKc3RhdGljCmZ1bmN0aW9uCl9kdW1wKCYkdmFyLCRsZXZlbCl7c3RhdGljJHRhYmxlVXRmLCR0YWJsZUJpbiwkcmU9JyNbXlx4MDlceDBBXHgwRFx4MjAtXHg3RVx4QTAtXHh7MTBGRkZGfV0jdSc7aWYoJHRhYmxlVXRmPT09TlVMTCl7Zm9yZWFjaChyYW5nZSgiXHgwMCIsIlx4RkYiKWFzJGNoKXtpZihvcmQoJGNoKTwzMiYmc3RycG9zKCJcclxuXHQiLCRjaCk9PT1GQUxTRSkkdGFibGVVdGZbJGNoXT0kdGFibGVCaW5bJGNoXT0nXFx4Jy5zdHJfcGFkKGRlY2hleChvcmQoJGNoKSksMiwnMCcsU1RSX1BBRF9MRUZUKTtlbHNlaWYob3JkKCRjaCk8MTI3KSR0YWJsZVV0ZlskY2hdPSR0YWJsZUJpblskY2hdPSRjaDtlbHNleyR0YWJsZVV0ZlskY2hdPSRjaDskdGFibGVCaW5bJGNoXT0nXFx4Jy5kZWNoZXgob3JkKCRjaCkpO319JHRhYmxlVXRmWydcXHgnXT0kdGFibGVCaW5bJ1xceCddPSdcXFxceCc7fWlmKGlzX2Jvb2woJHZhcikpe3JldHVybiI8c3Bhbj5ib29sPC9zcGFuPigiLigkdmFyPydUUlVFJzonRkFMU0UnKS4iKVxuIjt9ZWxzZWlmKCR2YXI9PT1OVUxMKXtyZXR1cm4iPHNwYW4+TlVMTDwvc3Bhbj5cbiI7fWVsc2VpZihpc19pbnQoJHZhcikpe3JldHVybiI8c3Bhbj5pbnQ8L3NwYW4+KCR2YXIpXG4iO31lbHNlaWYoaXNfZmxvYXQoJHZhcikpe3JldHVybiI8c3Bhbj5mbG9hdDwvc3Bhbj4oJHZhcilcbiI7fWVsc2VpZihpc19zdHJpbmcoJHZhcikpe2lmKHNlbGY6OiRtYXhMZW4mJnN0cmxlbigkdmFyKT5zZWxmOjokbWF4TGVuKXskcz1odG1sU3BlY2lhbENoYXJzKHN1YnN0cigkdmFyLDAsc2VsZjo6JG1heExlbiksRU5UX05PUVVPVEVTKS4nIC4uLiAnO31lbHNleyRzPWh0bWxTcGVjaWFsQ2hhcnMoJHZhcixFTlRfTk9RVU9URVMpO30kcz1zdHJ0cigkcyxwcmVnX21hdGNoKCRyZSwkcyl8fHByZWdfbGFzdF9lcnJvcigpPyR0YWJsZUJpbjokdGFibGVVdGYpO3JldHVybiI8c3Bhbj5zdHJpbmc8L3NwYW4+KCIuc3RybGVuKCR2YXIpLiIpIFwiJHNcIlxuIjt9ZWxzZWlmKGlzX2FycmF5KCR2YXIpKXskcz0iPHNwYW4+YXJyYXk8L3NwYW4+KCIuY291bnQoJHZhcikuIikgIjskc3BhY2U9c3RyX3JlcGVhdCgkc3BhY2UxPScgICAnLCRsZXZlbCk7c3RhdGljJG1hcmtlcjtpZigkbWFya2VyPT09TlVMTCkkbWFya2VyPXVuaXFpZCgiXHgwMCIsVFJVRSk7aWYoZW1wdHkoJHZhcikpe31lbHNlaWYoaXNzZXQoJHZhclskbWFya2VyXSkpeyRzLj0ie1xuJHNwYWNlJHNwYWNlMSpSRUNVUlNJT04qXG4kc3BhY2V9Ijt9ZWxzZWlmKCRsZXZlbDxzZWxmOjokbWF4RGVwdGh8fCFzZWxmOjokbWF4RGVwdGgpeyRzLj0iPGNvZGU+e1xuIjskdmFyWyRtYXJrZXJdPTA7Zm9yZWFjaCgkdmFyCmFzJGs9PiYkdil7aWYoJGs9PT0kbWFya2VyKWNvbnRpbnVlOyRrPWlzX2ludCgkayk/JGs6JyInLnN0cnRyKCRrLHByZWdfbWF0Y2goJHJlLCRrKXx8cHJlZ19sYXN0X2Vycm9yKCk/JHRhYmxlQmluOiR0YWJsZVV0ZikuJyInOyRzLj0iJHNwYWNlJHNwYWNlMSRrID0+ICIuc2VsZjo6X2R1bXAoJHYsJGxldmVsKzEpO311bnNldCgkdmFyWyRtYXJrZXJdKTskcy49IiRzcGFjZX08L2NvZGU+Ijt9ZWxzZXskcy49IntcbiRzcGFjZSRzcGFjZTEuLi5cbiRzcGFjZX0iO31yZXR1cm4kcy4iXG4iO31lbHNlaWYoaXNfb2JqZWN0KCR2YXIpKXskYXJyPShhcnJheSkkdmFyOyRzPSI8c3Bhbj5vYmplY3Q8L3NwYW4+KCIuZ2V0X2NsYXNzKCR2YXIpLiIpICgiLmNvdW50KCRhcnIpLiIpICI7JHNwYWNlPXN0cl9yZXBlYXQoJHNwYWNlMT0nICAgJywkbGV2ZWwpO3N0YXRpYyRsaXN0PWFycmF5KCk7aWYoZW1wdHkoJGFycikpeyRzLj0ie30iO31lbHNlaWYoaW5fYXJyYXkoJHZhciwkbGlzdCxUUlVFKSl7JHMuPSJ7XG4kc3BhY2Ukc3BhY2UxKlJFQ1VSU0lPTipcbiRzcGFjZX0iO31lbHNlaWYoJGxldmVsPHNlbGY6OiRtYXhEZXB0aHx8IXNlbGY6OiRtYXhEZXB0aCl7JHMuPSI8Y29kZT57XG4iOyRsaXN0W109JHZhcjtmb3JlYWNoKCRhcnIKYXMkaz0+JiR2KXskbT0nJztpZigka1swXT09PSJceDAwIil7JG09JGtbMV09PT0nKic/JyA8c3Bhbj5wcm90ZWN0ZWQ8L3NwYW4+JzonIDxzcGFuPnByaXZhdGU8L3NwYW4+Jzskaz1zdWJzdHIoJGssc3RycnBvcygkaywiXHgwMCIpKzEpO30kaz1zdHJ0cigkayxwcmVnX21hdGNoKCRyZSwkayl8fHByZWdfbGFzdF9lcnJvcigpPyR0YWJsZUJpbjokdGFibGVVdGYpOyRzLj0iJHNwYWNlJHNwYWNlMVwiJGtcIiRtID0+ICIuc2VsZjo6X2R1bXAoJHYsJGxldmVsKzEpO31hcnJheV9wb3AoJGxpc3QpOyRzLj0iJHNwYWNlfTwvY29kZT4iO31lbHNleyRzLj0ie1xuJHNwYWNlJHNwYWNlMS4uLlxuJHNwYWNlfSI7fXJldHVybiRzLiJcbiI7fWVsc2VpZihpc19yZXNvdXJjZSgkdmFyKSl7cmV0dXJuIjxzcGFuPnJlc291cmNlIG9mIHR5cGU8L3NwYW4+KCIuZ2V0X3Jlc291cmNlX3R5cGUoJHZhcikuIilcbiI7fWVsc2V7cmV0dXJuIjxzcGFuPnVua25vd24gdHlwZTwvc3Bhbj5cbiI7fX1zdGF0aWMKZnVuY3Rpb24KdGltZXIoJG5hbWU9TlVMTCl7c3RhdGljJHRpbWU9YXJyYXkoKTskbm93PW1pY3JvdGltZShUUlVFKTskZGVsdGE9aXNzZXQoJHRpbWVbJG5hbWVdKT8kbm93LSR0aW1lWyRuYW1lXTowOyR0aW1lWyRuYW1lXT0kbm93O3JldHVybiRkZWx0YTt9c3RhdGljCmZ1bmN0aW9uCmVuYWJsZSgkbW9kZT1OVUxMLCRsb2dGaWxlPU5VTEwsJGVtYWlsPU5VTEwpe2Vycm9yX3JlcG9ydGluZyhFX0FMTHxFX1NUUklDVCk7aWYoaXNfYm9vbCgkbW9kZSkpe3NlbGY6OiRwcm9kdWN0aW9uTW9kZT0kbW9kZTt9ZWxzZWlmKGlzX3N0cmluZygkbW9kZSkpeyRtb2RlPXByZWdfc3BsaXQoJyNbLFxzXSsjJywkbW9kZSk7fWlmKGlzX2FycmF5KCRtb2RlKSl7c2VsZjo6JHByb2R1Y3Rpb25Nb2RlPSFpc3NldCgkX1NFUlZFUlsnUkVNT1RFX0FERFInXSl8fCFpbl9hcnJheSgkX1NFUlZFUlsnUkVNT1RFX0FERFInXSwkbW9kZSxUUlVFKTt9aWYoc2VsZjo6JHByb2R1Y3Rpb25Nb2RlPT09c2VsZjo6REVURUNUKXtpZihjbGFzc19leGlzdHMoJ05FbnZpcm9ubWVudCcpKXtzZWxmOjokcHJvZHVjdGlvbk1vZGU9TkVudmlyb25tZW50Ojppc1Byb2R1Y3Rpb24oKTt9ZWxzZWlmKGlzc2V0KCRfU0VSVkVSWydTRVJWRVJfQUREUiddKXx8aXNzZXQoJF9TRVJWRVJbJ0xPQ0FMX0FERFInXSkpeyRhZGRyPWlzc2V0KCRfU0VSVkVSWydTRVJWRVJfQUREUiddKT8kX1NFUlZFUlsnU0VSVkVSX0FERFInXTokX1NFUlZFUlsnTE9DQUxfQUREUiddOyRvY3Q9ZXhwbG9kZSgnLicsJGFkZHIpO3NlbGY6OiRwcm9kdWN0aW9uTW9kZT0kYWRkciE9PSc6OjEnJiYoY291bnQoJG9jdCkhPT00fHwoJG9jdFswXSE9PScxMCcmJiRvY3RbMF0hPT0nMTI3JyYmKCRvY3RbMF0hPT0nMTcyJ3x8JG9jdFsxXTwxNnx8JG9jdFsxXT4zMSkmJigkb2N0WzBdIT09JzE2OSd8fCRvY3RbMV0hPT0nMjU0JykmJigkb2N0WzBdIT09JzE5Mid8fCRvY3RbMV0hPT0nMTY4JykpKTt9ZWxzZXtzZWxmOjokcHJvZHVjdGlvbk1vZGU9IXNlbGY6OiRjb25zb2xlTW9kZTt9fWlmKHNlbGY6OiRwcm9kdWN0aW9uTW9kZSYmJGxvZ0ZpbGUhPT1GQUxTRSl7c2VsZjo6JGxvZ0ZpbGU9J2xvZy9waHBfZXJyb3IubG9nJztpZihjbGFzc19leGlzdHMoJ05FbnZpcm9ubWVudCcpKXtpZihpc19zdHJpbmcoJGxvZ0ZpbGUpKXtzZWxmOjokbG9nRmlsZT1ORW52aXJvbm1lbnQ6OmV4cGFuZCgkbG9nRmlsZSk7fWVsc2UKdHJ5e3NlbGY6OiRsb2dGaWxlPU5FbnZpcm9ubWVudDo6ZXhwYW5kKCclbG9nRGlyJS9waHBfZXJyb3IubG9nJyk7fWNhdGNoKEludmFsaWRTdGF0ZUV4Y2VwdGlvbiRlKXt9fWVsc2VpZihpc19zdHJpbmcoJGxvZ0ZpbGUpKXtzZWxmOjokbG9nRmlsZT0kbG9nRmlsZTt9aW5pX3NldCgnZXJyb3JfbG9nJyxzZWxmOjokbG9nRmlsZSk7fWlmKGZ1bmN0aW9uX2V4aXN0cygnaW5pX3NldCcpKXtpbmlfc2V0KCdkaXNwbGF5X2Vycm9ycycsIXNlbGY6OiRwcm9kdWN0aW9uTW9kZSk7aW5pX3NldCgnaHRtbF9lcnJvcnMnLCFzZWxmOjokbG9nRmlsZSYmIXNlbGY6OiRjb25zb2xlTW9kZSk7aW5pX3NldCgnbG9nX2Vycm9ycycsKGJvb2wpc2VsZjo6JGxvZ0ZpbGUpO31lbHNlaWYoaW5pX2dldCgnbG9nX2Vycm9ycycpIT0oYm9vbClzZWxmOjokbG9nRmlsZXx8KGluaV9nZXQoJ2Rpc3BsYXlfZXJyb3JzJykhPSFzZWxmOjokcHJvZHVjdGlvbk1vZGUmJmluaV9nZXQoJ2Rpc3BsYXlfZXJyb3JzJykhPT0oc2VsZjo6JHByb2R1Y3Rpb25Nb2RlPydzdGRlcnInOidzdGRvdXQnKSkpe3Rocm93Cm5ldwpMb2dpY0V4Y2VwdGlvbignRnVuY3Rpb24gaW5pX3NldCgpIG11c3QgYmUgZW5hYmxlZC4nKTt9c2VsZjo6JHNlbmRFbWFpbHM9c2VsZjo6JGxvZ0ZpbGUmJiRlbWFpbDtpZihzZWxmOjokc2VuZEVtYWlscyl7aWYoaXNfc3RyaW5nKCRlbWFpbCkpe3NlbGY6OiRlbWFpbEhlYWRlcnNbJ1RvJ109JGVtYWlsO31lbHNlaWYoaXNfYXJyYXkoJGVtYWlsKSl7c2VsZjo6JGVtYWlsSGVhZGVycz0kZW1haWwrc2VsZjo6JGVtYWlsSGVhZGVyczt9fWlmKCFkZWZpbmVkKCdFX0RFUFJFQ0FURUQnKSl7ZGVmaW5lKCdFX0RFUFJFQ0FURUQnLDgxOTIpO31pZighZGVmaW5lZCgnRV9VU0VSX0RFUFJFQ0FURUQnKSl7ZGVmaW5lKCdFX1VTRVJfREVQUkVDQVRFRCcsMTYzODQpO31zZXRfZXhjZXB0aW9uX2hhbmRsZXIoYXJyYXkoX19DTEFTU19fLCdfZXhjZXB0aW9uSGFuZGxlcicpKTtzZXRfZXJyb3JfaGFuZGxlcihhcnJheShfX0NMQVNTX18sJ19lcnJvckhhbmRsZXInKSk7c2VsZjo6JGVuYWJsZWQ9VFJVRTt9c3RhdGljCmZ1bmN0aW9uCmlzRW5hYmxlZCgpe3JldHVybgpzZWxmOjokZW5hYmxlZDt9c3RhdGljCmZ1bmN0aW9uCl9leGNlcHRpb25IYW5kbGVyKEV4Y2VwdGlvbiRleGNlcHRpb24pe2lmKCFoZWFkZXJzX3NlbnQoKSl7aGVhZGVyKCdIVFRQLzEuMSA1MDAgSW50ZXJuYWwgU2VydmVyIEVycm9yJyk7fXNlbGY6OnByb2Nlc3NFeGNlcHRpb24oJGV4Y2VwdGlvbixUUlVFKTtleGl0O31zdGF0aWMKZnVuY3Rpb24KX2Vycm9ySGFuZGxlcigkc2V2ZXJpdHksJG1lc3NhZ2UsJGZpbGUsJGxpbmUsJGNvbnRleHQpe2lmKCRzZXZlcml0eT09PUVfUkVDT1ZFUkFCTEVfRVJST1J8fCRzZXZlcml0eT09PUVfVVNFUl9FUlJPUil7dGhyb3cKbmV3CkZhdGFsRXJyb3JFeGNlcHRpb24oJG1lc3NhZ2UsMCwkc2V2ZXJpdHksJGZpbGUsJGxpbmUsJGNvbnRleHQpO31lbHNlaWYoKCRzZXZlcml0eSZlcnJvcl9yZXBvcnRpbmcoKSkhPT0kc2V2ZXJpdHkpe3JldHVybgpOVUxMO31lbHNlaWYoc2VsZjo6JHN0cmljdE1vZGUpe3NlbGY6Ol9leGNlcHRpb25IYW5kbGVyKG5ldwpGYXRhbEVycm9yRXhjZXB0aW9uKCRtZXNzYWdlLDAsJHNldmVyaXR5LCRmaWxlLCRsaW5lLCRjb250ZXh0KSxUUlVFKTt9c3RhdGljJHR5cGVzPWFycmF5KEVfV0FSTklORz0+J1dhcm5pbmcnLEVfVVNFUl9XQVJOSU5HPT4nV2FybmluZycsRV9OT1RJQ0U9PidOb3RpY2UnLEVfVVNFUl9OT1RJQ0U9PidOb3RpY2UnLEVfU1RSSUNUPT4nU3RyaWN0IHN0YW5kYXJkcycsRV9ERVBSRUNBVEVEPT4nRGVwcmVjYXRlZCcsRV9VU0VSX0RFUFJFQ0FURUQ9PidEZXByZWNhdGVkJyk7JHR5cGU9aXNzZXQoJHR5cGVzWyRzZXZlcml0eV0pPyR0eXBlc1skc2V2ZXJpdHldOidVbmtub3duIGVycm9yJztpZihzZWxmOjokbG9nRmlsZSl7aWYoc2VsZjo6JHNlbmRFbWFpbHMpe3NlbGY6OnNlbmRFbWFpbCgiJHR5cGU6ICRtZXNzYWdlIGluICRmaWxlIG9uIGxpbmUgJGxpbmUiKTt9cmV0dXJuCkZBTFNFO31lbHNlaWYoIXNlbGY6OiRwcm9kdWN0aW9uTW9kZSYmc2VsZjo6JGZpcmVidWdEZXRlY3RlZCYmIWhlYWRlcnNfc2VudCgpKXskbWVzc2FnZT1zdHJpcF90YWdzKCRtZXNzYWdlKTtzZWxmOjpmaXJlTG9nKCIkdHlwZTogJG1lc3NhZ2UgaW4gJGZpbGUgb24gbGluZSAkbGluZSIsc2VsZjo6RVJST1IpO3JldHVybgpOVUxMO31yZXR1cm4KRkFMU0U7fXN0YXRpYwpmdW5jdGlvbgpwcm9jZXNzRXhjZXB0aW9uKEV4Y2VwdGlvbiRleGNlcHRpb24sJG91dHB1dEFsbG93ZWQ9RkFMU0Upe2lmKCFzZWxmOjokZW5hYmxlZCl7cmV0dXJuO31lbHNlaWYoc2VsZjo6JGxvZ0ZpbGUpe3RyeXskaGFzaD1tZDUoJGV4Y2VwdGlvbi4obWV0aG9kX2V4aXN0cygkZXhjZXB0aW9uLCdnZXRQcmV2aW91cycpPyRleGNlcHRpb24tPmdldFByZXZpb3VzKCk6KGlzc2V0KCRleGNlcHRpb24tPnByZXZpb3VzKT8kZXhjZXB0aW9uLT5wcmV2aW91czonJykpKTtlcnJvcl9sb2coIlBIUCBGYXRhbCBlcnJvcjogIFVuY2F1Z2h0ICRleGNlcHRpb24iKTtmb3JlYWNoKG5ldwpEaXJlY3RvcnlJdGVyYXRvcihkaXJuYW1lKHNlbGY6OiRsb2dGaWxlKSlhcyRlbnRyeSl7aWYoc3RycG9zKCRlbnRyeSwkaGFzaCkpeyRza2lwPVRSVUU7YnJlYWs7fX0kZmlsZT1kaXJuYW1lKHNlbGY6OiRsb2dGaWxlKS4iL2V4Y2VwdGlvbiAiLkBkYXRlKCdZLW0tZCBILWktcycpLiIgJGhhc2guaHRtbCI7aWYoZW1wdHkoJHNraXApJiZzZWxmOjokbG9nSGFuZGxlPUBmb3BlbigkZmlsZSwneCcpKXtvYl9zdGFydCgpO29iX3N0YXJ0KGFycmF5KF9fQ0xBU1NfXywnX3dyaXRlRmlsZScpLDEpO3NlbGY6Ol9wYWludEJsdWVTY3JlZW4oJGV4Y2VwdGlvbik7b2JfZW5kX2ZsdXNoKCk7b2JfZW5kX2NsZWFuKCk7ZmNsb3NlKHNlbGY6OiRsb2dIYW5kbGUpO31pZihzZWxmOjokc2VuZEVtYWlscyl7c2VsZjo6c2VuZEVtYWlsKChzdHJpbmcpJGV4Y2VwdGlvbik7fX1jYXRjaChFeGNlcHRpb24kZSl7aWYoIWhlYWRlcnNfc2VudCgpKXtoZWFkZXIoJ0hUVFAvMS4xIDUwMCBJbnRlcm5hbCBTZXJ2ZXIgRXJyb3InKTt9ZWNobydORGVidWcgZmF0YWwgZXJyb3I6ICcsZ2V0X2NsYXNzKCRlKSwnOiAnLCgkZS0+Z2V0Q29kZSgpPycjJy4kZS0+Z2V0Q29kZSgpLicgJzonJykuJGUtPmdldE1lc3NhZ2UoKSwiXG4iO2V4aXQ7fX1lbHNlaWYoc2VsZjo6JHByb2R1Y3Rpb25Nb2RlKXt9ZWxzZWlmKHNlbGY6OiRjb25zb2xlTW9kZSl7aWYoJG91dHB1dEFsbG93ZWQpe2VjaG8iJGV4Y2VwdGlvblxuIjtmb3JlYWNoKHNlbGY6OiRjb2xvcGhvbnMKYXMkY2FsbGJhY2spe2ZvcmVhY2goKGFycmF5KWNhbGxfdXNlcl9mdW5jKCRjYWxsYmFjaywnYmx1ZXNjcmVlbicpYXMkbGluZSllY2hvCnN0cmlwX3RhZ3MoJGxpbmUpLiJcbiI7fX19ZWxzZWlmKHNlbGY6OiRmaXJlYnVnRGV0ZWN0ZWQmJnNlbGY6OiRhamF4RGV0ZWN0ZWQmJiFoZWFkZXJzX3NlbnQoKSl7c2VsZjo6ZmlyZUxvZygkZXhjZXB0aW9uLHNlbGY6OkVYQ0VQVElPTik7fWVsc2VpZigkb3V0cHV0QWxsb3dlZCl7aWYoIWhlYWRlcnNfc2VudCgpKXtAb2JfZW5kX2NsZWFuKCk7d2hpbGUob2JfZ2V0X2xldmVsKCkmJkBvYl9lbmRfY2xlYW4oKSk7aWYoaW5fYXJyYXkoJ0NvbnRlbnQtRW5jb2Rpbmc6IGd6aXAnLGhlYWRlcnNfbGlzdCgpKSloZWFkZXIoJ0NvbnRlbnQtRW5jb2Rpbmc6IGlkZW50aXR5JyxUUlVFKTt9c2VsZjo6X3BhaW50Qmx1ZVNjcmVlbigkZXhjZXB0aW9uKTt9ZWxzZWlmKHNlbGY6OiRmaXJlYnVnRGV0ZWN0ZWQmJiFoZWFkZXJzX3NlbnQoKSl7c2VsZjo6ZmlyZUxvZygkZXhjZXB0aW9uLHNlbGY6OkVYQ0VQVElPTik7fWZvcmVhY2goc2VsZjo6JG9uRmF0YWxFcnJvcgphcyRoYW5kbGVyKXtjYWxsX3VzZXJfZnVuYygkaGFuZGxlciwkZXhjZXB0aW9uKTt9fXN0YXRpYwpmdW5jdGlvbgp0b1N0cmluZ0V4Y2VwdGlvbihFeGNlcHRpb24kZXhjZXB0aW9uKXtpZihzZWxmOjokZW5hYmxlZCl7c2VsZjo6X2V4Y2VwdGlvbkhhbmRsZXIoJGV4Y2VwdGlvbik7fWVsc2V7dHJpZ2dlcl9lcnJvcigkZXhjZXB0aW9uLT5nZXRNZXNzYWdlKCksRV9VU0VSX0VSUk9SKTt9fXN0YXRpYwpmdW5jdGlvbgpfcGFpbnRCbHVlU2NyZWVuKEV4Y2VwdGlvbiRleGNlcHRpb24peyRpbnRlcm5hbHM9YXJyYXkoKTtmb3JlYWNoKGFycmF5KCdOT2JqZWN0JywnTk9iamVjdE1peGluJylhcyRjbGFzcyl7aWYoY2xhc3NfZXhpc3RzKCRjbGFzcyxGQUxTRSkpeyRyYz1uZXcKUmVmbGVjdGlvbkNsYXNzKCRjbGFzcyk7JGludGVybmFsc1skcmMtPmdldEZpbGVOYW1lKCldPVRSVUU7fX1pZihjbGFzc19leGlzdHMoJ05FbnZpcm9ubWVudCcsRkFMU0UpKXskYXBwbGljYXRpb249TkVudmlyb25tZW50OjpnZXRTZXJ2aWNlTG9jYXRvcigpLT5oYXNTZXJ2aWNlKCdOZXR0ZVxcQXBwbGljYXRpb25cXEFwcGxpY2F0aW9uJyxUUlVFKT9ORW52aXJvbm1lbnQ6OmdldFNlcnZpY2VMb2NhdG9yKCktPmdldFNlcnZpY2UoJ05ldHRlXFxBcHBsaWNhdGlvblxcQXBwbGljYXRpb24nKTpOVUxMO30kY29sb3Bob25zPXNlbGY6OiRjb2xvcGhvbnM7aWYoIWZ1bmN0aW9uX2V4aXN0cygnX25ldHRlRGVidWdQcmludENvZGUnKSl7ZnVuY3Rpb24KX25ldHRlRGVidWdQcmludENvZGUoJGZpbGUsJGxpbmUsJGNvdW50PTE1KXtpZihmdW5jdGlvbl9leGlzdHMoJ2luaV9zZXQnKSl7aW5pX3NldCgnaGlnaGxpZ2h0LmNvbW1lbnQnLCcjOTk5OyBmb250LXN0eWxlOiBpdGFsaWMnKTtpbmlfc2V0KCdoaWdobGlnaHQuZGVmYXVsdCcsJyMwMDAnKTtpbmlfc2V0KCdoaWdobGlnaHQuaHRtbCcsJyMwNmInKTtpbmlfc2V0KCdoaWdobGlnaHQua2V5d29yZCcsJyNkMjQ7IGZvbnQtd2VpZ2h0OiBib2xkJyk7aW5pX3NldCgnaGlnaGxpZ2h0LnN0cmluZycsJyMwODAnKTt9JHN0YXJ0PW1heCgxLCRsaW5lLWZsb29yKCRjb3VudC8yKSk7JHNvdXJjZT1AZmlsZV9nZXRfY29udGVudHMoJGZpbGUpO2lmKCEkc291cmNlKXJldHVybjskc291cmNlPWV4cGxvZGUoIlxuIixoaWdobGlnaHRfc3RyaW5nKCRzb3VyY2UsVFJVRSkpOyRzcGFucz0xO2VjaG8kc291cmNlWzBdOyRzb3VyY2U9ZXhwbG9kZSgnPGJyIC8+Jywkc291cmNlWzFdKTthcnJheV91bnNoaWZ0KCRzb3VyY2UsTlVMTCk7JGk9JHN0YXJ0O3doaWxlKC0tJGk+PTEpe2lmKHByZWdfbWF0Y2goJyMuKig8Lz9zcGFuW14+XSo+KSMnLCRzb3VyY2VbJGldLCRtKSl7aWYoJG1bMV0hPT0nPC9zcGFuPicpeyRzcGFucysrO2VjaG8kbVsxXTt9YnJlYWs7fX0kc291cmNlPWFycmF5X3NsaWNlKCRzb3VyY2UsJHN0YXJ0LCRjb3VudCxUUlVFKTtlbmQoJHNvdXJjZSk7JG51bVdpZHRoPXN0cmxlbigoc3RyaW5nKWtleSgkc291cmNlKSk7Zm9yZWFjaCgkc291cmNlCmFzJG49PiRzKXskc3BhbnMrPXN1YnN0cl9jb3VudCgkcywnPHNwYW4nKS1zdWJzdHJfY291bnQoJHMsJzwvc3BhbicpOyRzPXN0cl9yZXBsYWNlKGFycmF5KCJcciIsIlxuIiksYXJyYXkoJycsJycpLCRzKTtpZigkbj09PSRsaW5lKXtwcmludGYoIjxzcGFuIGNsYXNzPSdoaWdobGlnaHQnPkxpbmUgJXskbnVtV2lkdGh9czogICAgJXNcbjwvc3Bhbj4lcyIsJG4sc3RyaXBfdGFncygkcykscHJlZ19yZXBsYWNlKCcjW14+XSooPFtePl0rPilbXjxdKiMnLCckMScsJHMpKTt9ZWxzZXtwcmludGYoIjxzcGFuIGNsYXNzPSdsaW5lJz5MaW5lICV7JG51bVdpZHRofXM6PC9zcGFuPiAgICAlc1xuIiwkbiwkcyk7fX1lY2hvCnN0cl9yZXBlYXQoJzwvc3Bhbj4nLCRzcGFucyksJzwvY29kZT4nO31mdW5jdGlvbgpfbmV0dGVEdW1wKCRkdW1wKXtyZXR1cm4nPHByZSBjbGFzcz0iZHVtcCI+Jy5wcmVnX3JlcGxhY2VfY2FsbGJhY2soJyMoXnxccyspPyguKilcKChcZCspXCkgPGNvZGU+IycsJ19uZXR0ZUR1bXBDYicsJGR1bXApLic8L3ByZT4nO31mdW5jdGlvbgpfbmV0dGVEdW1wQ2IoJG0pe3JldHVybiIkbVsxXTxhIGhyZWY9JyMnIG9uY2xpY2s9J3JldHVybiAhbmV0dGVUb2dnbGUodGhpcyknPiRtWzJdKCRtWzNdKSAiLih0cmltKCRtWzFdKXx8JG1bM108Nz8nPGFiYnI+JiN4MjViYzs8L2FiYnI+IDwvYT48Y29kZT4nOic8YWJicj4mI3gyNWJhOzwvYWJicj4gPC9hPjxjb2RlIGNsYXNzPSJjb2xsYXBzZWQiPicpO31mdW5jdGlvbgpfbmV0dGVPcGVuUGFuZWwoJG5hbWUsJGNvbGxhcHNlZCl7c3RhdGljJGlkOyRpZCsrOz8+Cgk8ZGl2IGNsYXNzPSJwYW5lbCI+CgkJPGgyPjxhIGhyZWY9IiMiIG9uY2xpY2s9InJldHVybiAhbmV0dGVUb2dnbGUodGhpcywgJ3BubDw/cGhwIGVjaG8kaWQ/PicpIj48P3BocCBlY2hvCmh0bWxTcGVjaWFsQ2hhcnMoJG5hbWUpPz4gPGFiYnI+PD9waHAgZWNobyRjb2xsYXBzZWQ/JyYjeDI1YmE7JzonJiN4MjViYzsnPz48L2FiYnI+PC9hPjwvaDI+CgoJCTxkaXYgaWQ9InBubDw/cGhwIGVjaG8kaWQ/PiIgY2xhc3M9Ijw/cGhwIGVjaG8kY29sbGFwc2VkPydjb2xsYXBzZWQgJzonJz8+aW5uZXIiPgoJPD9waHAKfWZ1bmN0aW9uCl9uZXR0ZUNsb3NlUGFuZWwoKXs/PgoJCTwvZGl2PgoJPC9kaXY+Cgk8P3BocAp9fXN0YXRpYyRlcnJvclR5cGVzPWFycmF5KEVfRVJST1I9PidGYXRhbCBFcnJvcicsRV9VU0VSX0VSUk9SPT4nVXNlciBFcnJvcicsRV9SRUNPVkVSQUJMRV9FUlJPUj0+J1JlY292ZXJhYmxlIEVycm9yJyxFX0NPUkVfRVJST1I9PidDb3JlIEVycm9yJyxFX0NPTVBJTEVfRVJST1I9PidDb21waWxlIEVycm9yJyxFX1BBUlNFPT4nUGFyc2UgRXJyb3InLEVfV0FSTklORz0+J1dhcm5pbmcnLEVfQ09SRV9XQVJOSU5HPT4nQ29yZSBXYXJuaW5nJyxFX0NPTVBJTEVfV0FSTklORz0+J0NvbXBpbGUgV2FybmluZycsRV9VU0VSX1dBUk5JTkc9PidVc2VyIFdhcm5pbmcnLEVfTk9USUNFPT4nTm90aWNlJyxFX1VTRVJfTk9USUNFPT4nVXNlciBOb3RpY2UnLEVfU1RSSUNUPT4nU3RyaWN0JyxFX0RFUFJFQ0FURUQ9PidEZXByZWNhdGVkJyxFX1VTRVJfREVQUkVDQVRFRD0+J1VzZXIgRGVwcmVjYXRlZCcpOyR0aXRsZT0oJGV4Y2VwdGlvbgppbnN0YW5jZW9mCkZhdGFsRXJyb3JFeGNlcHRpb24mJmlzc2V0KCRlcnJvclR5cGVzWyRleGNlcHRpb24tPmdldFNldmVyaXR5KCldKSk/JGVycm9yVHlwZXNbJGV4Y2VwdGlvbi0+Z2V0U2V2ZXJpdHkoKV06Z2V0X2NsYXNzKCRleGNlcHRpb24pOyRybj0wO2lmKGhlYWRlcnNfc2VudCgpKXtlY2hvJzwvcHJlPjwveG1wPjwvdGFibGU+Jzt9Pz48IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KPGh0bWwgbGFuZz0iZW4iPgo8aGVhZD4KCTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4KCTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9pbmRleCxub2FyY2hpdmUiPgoJPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJOZXR0ZSBGcmFtZXdvcmsiPgoKCTx0aXRsZT48P3BocCBlY2hvCmh0bWxzcGVjaWFsY2hhcnMoJHRpdGxlKT8+PC90aXRsZT48IS0tIDw/cGhwIGVjaG8kZXhjZXB0aW9uLT5nZXRNZXNzYWdlKCksKCRleGNlcHRpb24tPmdldENvZGUoKT8nICMnLiRleGNlcHRpb24tPmdldENvZGUoKTonJyk/PiAtLT4KCgk8c3R5bGUgdHlwZT0idGV4dC9jc3MiPmJvZHl7bWFyZ2luOjAgMCAyZW07cGFkZGluZzowfSNuZXR0ZUJsdWVzY3JlZW57Zm9udDo5cHQvMS41IFZlcmRhbmEsc2Fucy1zZXJpZjtiYWNrZ3JvdW5kOndoaXRlO2NvbG9yOiMzMzM7cG9zaXRpb246YWJzb2x1dGU7bGVmdDowO3RvcDowO3dpZHRoOjEwMCU7ei1pbmRleDoyMzE3ODt0ZXh0LWFsaWduOmxlZnR9I25ldHRlQmx1ZXNjcmVlbiAqe2NvbG9yOmluaGVyaXQ7YmFja2dyb3VuZDppbmhlcml0O3RleHQtYWxpZ246aW5oZXJpdH0jbmV0dGVCbHVlc2NyZWVuSWNvbntwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDouNWVtO3RvcDouNWVtO3otaW5kZXg6MjMxNzk7dGV4dC1kZWNvcmF0aW9uOm5vbmU7YmFja2dyb3VuZDpyZWQ7cGFkZGluZzozcHh9I25ldHRlQmx1ZXNjcmVlbkljb24gYWJicntjb2xvcjpibGFjayFpbXBvcnRhbnR9I25ldHRlQmx1ZXNjcmVlbiBoMXtmb250OjE4cHQvMS41IFZlcmRhbmEsc2Fucy1zZXJpZiFpbXBvcnRhbnQ7bWFyZ2luOi42ZW0gMH0jbmV0dGVCbHVlc2NyZWVuIGgye2ZvbnQ6MTRwdC8xLjUgc2Fucy1zZXJpZiFpbXBvcnRhbnQ7Y29sb3I6Izg4ODttYXJnaW46LjZlbSAwfSNuZXR0ZUJsdWVzY3JlZW4gYXt0ZXh0LWRlY29yYXRpb246bm9uZTtjb2xvcjojNDE5N0UzfSNuZXR0ZUJsdWVzY3JlZW4gYSBhYmJye2ZvbnQtZmFtaWx5OnNhbnMtc2VyaWY7Y29sb3I6Izk5OX0jbmV0dGVCbHVlc2NyZWVuIGgze2ZvbnQ6Ym9sZCAxMHB0LzEuNSBWZXJkYW5hLHNhbnMtc2VyaWYhaW1wb3J0YW50O21hcmdpbjoxZW0gMDtwYWRkaW5nOjB9I25ldHRlQmx1ZXNjcmVlbiBwe21hcmdpbjouOGVtIDB9I25ldHRlQmx1ZXNjcmVlbiBwcmUsI25ldHRlQmx1ZXNjcmVlbiBjb2RlLCNuZXR0ZUJsdWVzY3JlZW4gdGFibGV7Zm9udDo5cHQvMS41IENvbnNvbGFzLG1vbm9zcGFjZSFpbXBvcnRhbnR9I25ldHRlQmx1ZXNjcmVlbiBwcmUsI25ldHRlQmx1ZXNjcmVlbiB0YWJsZXtiYWNrZ3JvdW5kOiNmZmZiY2M7cGFkZGluZzouNGVtIC43ZW07Ym9yZGVyOjFweCBkb3R0ZWQgc2lsdmVyfSNuZXR0ZUJsdWVzY3JlZW4gdGFibGUgcHJle3BhZGRpbmc6MDttYXJnaW46MDtib3JkZXI6bm9uZX0jbmV0dGVCbHVlc2NyZWVuIHByZS5kdW1wIHNwYW57Y29sb3I6I2MxNjU0OX0jbmV0dGVCbHVlc2NyZWVuIHByZS5kdW1wIGF7Y29sb3I6IzMzM30jbmV0dGVCbHVlc2NyZWVuIGRpdi5wYW5lbHtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZWVlO3BhZGRpbmc6MXB4IDJlbX0jbmV0dGVCbHVlc2NyZWVuIGRpdi5pbm5lcntwYWRkaW5nOi4xZW0gMWVtIDFlbTtiYWNrZ3JvdW5kOiNmNWY1ZjV9I25ldHRlQmx1ZXNjcmVlbiB0YWJsZXtib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7d2lkdGg6MTAwJX0jbmV0dGVCbHVlc2NyZWVuIHRkLCNuZXR0ZUJsdWVzY3JlZW4gdGh7dmVydGljYWwtYWxpZ246dG9wO3RleHQtYWxpZ246bGVmdDtwYWRkaW5nOjJweCAzcHg7Ym9yZGVyOjFweCBzb2xpZCAjZWVifSNuZXR0ZUJsdWVzY3JlZW4gdGh7d2lkdGg6MTAlO2ZvbnQtd2VpZ2h0OmJvbGR9I25ldHRlQmx1ZXNjcmVlbiAub2RkLCNuZXR0ZUJsdWVzY3JlZW4gLm9kZCBwcmV7YmFja2dyb3VuZC1jb2xvcjojZmFmNWMzfSNuZXR0ZUJsdWVzY3JlZW4gdWx7Zm9udDo3cHQvMS41IFZlcmRhbmEsc2Fucy1zZXJpZiFpbXBvcnRhbnQ7cGFkZGluZzoxZW0gMmVtIDUwcHh9I25ldHRlQmx1ZXNjcmVlbiAuaGlnaGxpZ2h0LCNuZXR0ZUJsdWVzY3JlZW5FcnJvcntiYWNrZ3JvdW5kOnJlZDtjb2xvcjp3aGl0ZTtmb250LXdlaWdodDpib2xkO2ZvbnQtc3R5bGU6bm9ybWFsO2Rpc3BsYXk6YmxvY2t9I25ldHRlQmx1ZXNjcmVlbiAubGluZXtjb2xvcjojOWU5ZTdlO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0eWxlOm5vcm1hbH08L3N0eWxlPgoKCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Lyo8IVtDREFUQVsqL2RvY3VtZW50LndyaXRlKCI8c3R5bGU+IC5jb2xsYXBzZWQgeyBkaXNwbGF5OiBub25lOyB9IDwvc3R5bGU+Iik7ZnVuY3Rpb24gbmV0dGVUb2dnbGUoYSxiKXt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhYmJyIilbMF07Zm9yKGE9Yj9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKTphLm5leHRTaWJsaW5nO2Eubm9kZVR5cGUhPT0xOylhPWEubmV4dFNpYmxpbmc7Yj1hLmN1cnJlbnRTdHlsZT9hLmN1cnJlbnRTdHlsZS5kaXNwbGF5PT0ibm9uZSI6Z2V0Q29tcHV0ZWRTdHlsZShhLG51bGwpLmRpc3BsYXk9PSJub25lIjt0cnl7Yy5pbm5lckhUTUw9U3RyaW5nLmZyb21DaGFyQ29kZShiPzk2NjA6OTY1OCl9Y2F0Y2goZCl7fWEuc3R5bGUuZGlzcGxheT1iP2EudGFnTmFtZS50b0xvd2VyQ2FzZSgpPT09ImNvZGUiPyJpbmxpbmUiOiJibG9jayI6Im5vbmUiO3JldHVybiB0cnVlfTsvKl1dPiovPC9zY3JpcHQ+CjwvaGVhZD4KCgoKPGJvZHk+CjxkaXYgaWQ9Im5ldHRlQmx1ZXNjcmVlbiI+Cgk8YSBpZD0ibmV0dGVCbHVlc2NyZWVuSWNvbiIgaHJlZj0iIyIgb25jbGljaz0icmV0dXJuICFuZXR0ZVRvZ2dsZSh0aGlzKSI+PGFiYnI+JiN4MjViYzs8L2FiYnI+PC9hCgoJPjxkaXY+CgkJPGRpdiBpZD0ibmV0dGVCbHVlc2NyZWVuRXJyb3IiIGNsYXNzPSJwYW5lbCI+CgkJCTxoMT48P3BocCBlY2hvCmh0bWxzcGVjaWFsY2hhcnMoJHRpdGxlKSwoJGV4Y2VwdGlvbi0+Z2V0Q29kZSgpPycgIycuJGV4Y2VwdGlvbi0+Z2V0Q29kZSgpOicnKT8+PC9oMT4KCgkJCTxwPjw/cGhwIGVjaG8KaHRtbHNwZWNpYWxjaGFycygkZXhjZXB0aW9uLT5nZXRNZXNzYWdlKCkpPz48L3A+CgkJPC9kaXY+CgoKCgkJPD9waHAgJGV4PSRleGNlcHRpb247JGxldmVsPTA7Pz4KCQk8P3BocCBkb3s/PgoKCQkJPD9waHAgaWYoJGxldmVsKyspOj8+CgkJCQk8P3BocCBfbmV0dGVPcGVuUGFuZWwoJ0NhdXNlZCBieScsJGxldmVsPjIpPz4KCQkJCTxkaXYgY2xhc3M9InBhbmVsIj4KCQkJCQk8aDE+PD9waHAgZWNobwpodG1sc3BlY2lhbGNoYXJzKGdldF9jbGFzcygkZXgpKSwoJGV4LT5nZXRDb2RlKCk/JyAjJy4kZXgtPmdldENvZGUoKTonJyk/PjwvaDE+CgoJCQkJCTxwPjw/cGhwIGVjaG8KaHRtbHNwZWNpYWxjaGFycygkZXgtPmdldE1lc3NhZ2UoKSk/PjwvcD4KCQkJCTwvZGl2PgoJCQk8P3BocCBlbmRpZj8+CgoJCQk8P3BocCAkY29sbGFwc2VkPWlzc2V0KCRpbnRlcm5hbHNbJGV4LT5nZXRGaWxlKCldKTs/PgoJCQk8P3BocCBpZihpc19maWxlKCRleC0+Z2V0RmlsZSgpKSk6Pz4KCQkJPD9waHAgX25ldHRlT3BlblBhbmVsKCdTb3VyY2UgZmlsZScsJGNvbGxhcHNlZCk/PgoJCQkJPHA+PHN0cm9uZz5GaWxlOjwvc3Ryb25nPiA8P3BocCBlY2hvCmh0bWxzcGVjaWFsY2hhcnMoJGV4LT5nZXRGaWxlKCkpPz4gJm5ic3A7IDxzdHJvbmc+TGluZTo8L3N0cm9uZz4gPD9waHAgZWNobyRleC0+Z2V0TGluZSgpPz48L3A+CgkJCQk8cHJlPjw/cGhwIF9uZXR0ZURlYnVnUHJpbnRDb2RlKCRleC0+Z2V0RmlsZSgpLCRleC0+Z2V0TGluZSgpKT8+PC9wcmU+CgkJCTw/cGhwIF9uZXR0ZUNsb3NlUGFuZWwoKT8+CgkJCTw/cGhwIGVuZGlmPz4KCgoKCQkJPD9waHAgX25ldHRlT3BlblBhbmVsKCdDYWxsIHN0YWNrJyxGQUxTRSk/PgoJCQkJPG9sPgoJCQkJCTw/cGhwIGZvcmVhY2goJGV4LT5nZXRUcmFjZSgpYXMka2V5PT4kcm93KTo/PgoJCQkJCTxsaT48cD4KCgkJCQkJPD9waHAgaWYoaXNzZXQoJHJvd1snZmlsZSddKSk6Pz4KCQkJCQkJPHNwYW4gdGl0bGU9Ijw/cGhwIGVjaG8KaHRtbFNwZWNpYWxDaGFycygkcm93WydmaWxlJ10pPz4iPjw/cGhwIGVjaG8KaHRtbFNwZWNpYWxDaGFycyhiYXNlbmFtZShkaXJuYW1lKCRyb3dbJ2ZpbGUnXSkpKSwnLzxiPicsaHRtbFNwZWNpYWxDaGFycyhiYXNlbmFtZSgkcm93WydmaWxlJ10pKSwnPC9iPjwvc3Bhbj4gKCcsJHJvd1snbGluZSddLCcpJz8+CgkJCQkJPD9waHAgZWxzZTo/PgoJCQkJCQkmbHQ7UEhQIGlubmVyLWNvZGUmZ3Q7CgkJCQkJPD9waHAgZW5kaWY/PgoKCQkJCQk8P3BocCBpZihpc3NldCgkcm93WydmaWxlJ10pJiZpc19maWxlKCRyb3dbJ2ZpbGUnXSkpOj8+PGEgaHJlZj0iIyIgb25jbGljaz0icmV0dXJuICFuZXR0ZVRvZ2dsZSh0aGlzLCAnc3JjPD9waHAgZWNobyIkbGV2ZWwtJGtleSI/PicpIj5zb3VyY2UgPGFiYnI+JiN4MjViYTs8L2FiYnI+PC9hPiZuYnNwOyA8P3BocCBlbmRpZj8+CgoJCQkJCTw/cGhwIGlmKGlzc2V0KCRyb3dbJ2NsYXNzJ10pKWVjaG8kcm93WydjbGFzcyddLiRyb3dbJ3R5cGUnXT8+CgkJCQkJPD9waHAgZWNobyRyb3dbJ2Z1bmN0aW9uJ10/PgoKCQkJCQkoPD9waHAgaWYoIWVtcHR5KCRyb3dbJ2FyZ3MnXSkpOj8+PGEgaHJlZj0iIyIgb25jbGljaz0icmV0dXJuICFuZXR0ZVRvZ2dsZSh0aGlzLCAnYXJnczw/cGhwIGVjaG8iJGxldmVsLSRrZXkiPz4nKSI+YXJndW1lbnRzIDxhYmJyPiYjeDI1YmE7PC9hYmJyPjwvYT48P3BocCBlbmRpZj8+KQoJCQkJCTwvcD4KCgkJCQkJPD9waHAgaWYoIWVtcHR5KCRyb3dbJ2FyZ3MnXSkpOj8+CgkJCQkJCTxkaXYgY2xhc3M9ImNvbGxhcHNlZCIgaWQ9ImFyZ3M8P3BocCBlY2hvIiRsZXZlbC0ka2V5Ij8+Ij4KCQkJCQkJPHRhYmxlPgoJCQkJCQk8P3BocAoKdHJ5eyRyPWlzc2V0KCRyb3dbJ2NsYXNzJ10pP25ldwpSZWZsZWN0aW9uTWV0aG9kKCRyb3dbJ2NsYXNzJ10sJHJvd1snZnVuY3Rpb24nXSk6bmV3ClJlZmxlY3Rpb25GdW5jdGlvbigkcm93WydmdW5jdGlvbiddKTskcGFyYW1zPSRyLT5nZXRQYXJhbWV0ZXJzKCk7fWNhdGNoKEV4Y2VwdGlvbiRlKXskcGFyYW1zPWFycmF5KCk7fWZvcmVhY2goJHJvd1snYXJncyddYXMkaz0+JHYpe2VjaG8nPHRyPjx0aD4nLChpc3NldCgkcGFyYW1zWyRrXSk/JyQnLiRwYXJhbXNbJGtdLT5uYW1lOiIjJGsiKSwnPC90aD48dGQ+JztlY2hvCl9uZXR0ZUR1bXAoc2VsZjo6X2R1bXAoJHYsMCkpO2VjaG8iPC90ZD48L3RyPlxuIjt9Pz4KCQkJCQkJPC90YWJsZT4KCQkJCQkJPC9kaXY+CgkJCQkJPD9waHAgZW5kaWY/PgoKCgkJCQkJPD9waHAgaWYoaXNzZXQoJHJvd1snZmlsZSddKSYmaXNfZmlsZSgkcm93WydmaWxlJ10pKTo/PgoJCQkJCQk8cHJlIDw/cGhwIGlmKCEkY29sbGFwc2VkfHxpc3NldCgkaW50ZXJuYWxzWyRyb3dbJ2ZpbGUnXV0pKWVjaG8nY2xhc3M9ImNvbGxhcHNlZCInO2Vsc2UkY29sbGFwc2VkPUZBTFNFPz4gaWQ9InNyYzw/cGhwIGVjaG8iJGxldmVsLSRrZXkiPz4iPjw/cGhwIF9uZXR0ZURlYnVnUHJpbnRDb2RlKCRyb3dbJ2ZpbGUnXSwkcm93WydsaW5lJ10pPz48L3ByZT4KCQkJCQk8P3BocCBlbmRpZj8+CgoJCQkJCTwvbGk+CgkJCQkJPD9waHAgZW5kZm9yZWFjaD8+CgoJCQkJCTw/cGhwIGlmKCFpc3NldCgkcm93KSk6Pz4KCQkJCQk8bGk+PGk+ZW1wdHk8L2k+PC9saT4KCQkJCQk8P3BocCBlbmRpZj8+CgkJCQk8L29sPgoJCQk8P3BocCBfbmV0dGVDbG9zZVBhbmVsKCk/PgoKCgoJCQk8P3BocCBpZigkZXgKaW5zdGFuY2VvZgpJRGVidWdnYWJsZSk6Pz4KCQkJPD9waHAgZm9yZWFjaCgkZXgtPmdldFBhbmVscygpYXMkbmFtZT0+JHBhbmVsKTo/PgoJCQk8P3BocCBfbmV0dGVPcGVuUGFuZWwoJG5hbWUsZW1wdHkoJHBhbmVsWydleHBhbmRlZCddKSk/PgoJCQkJPD9waHAgZWNobyRwYW5lbFsnY29udGVudCddPz4KCQkJPD9waHAgX25ldHRlQ2xvc2VQYW5lbCgpPz4KCQkJPD9waHAgZW5kZm9yZWFjaD8+CgkJCTw/cGhwIGVuZGlmPz4KCgoKCQkJPD9waHAgaWYoaXNzZXQoJGV4LT5jb250ZXh0KSYmaXNfYXJyYXkoJGV4LT5jb250ZXh0KSk6Pz4KCQkJPD9waHAgX25ldHRlT3BlblBhbmVsKCdWYXJpYWJsZXMnLFRSVUUpPz4KCQkJPHRhYmxlPgoJCQk8P3BocAoKZm9yZWFjaCgkZXgtPmNvbnRleHQKYXMkaz0+JHYpe2VjaG8nPHRyPjx0aD4kJyxodG1sc3BlY2lhbGNoYXJzKCRrKSwnPC90aD48dGQ+JyxfbmV0dGVEdW1wKHNlbGY6Ol9kdW1wKCR2LDApKSwiPC90ZD48L3RyPlxuIjt9Pz4KCQkJPC90YWJsZT4KCQkJPD9waHAgX25ldHRlQ2xvc2VQYW5lbCgpPz4KCQkJPD9waHAgZW5kaWY/PgoKCQk8P3BocCB9d2hpbGUoKG1ldGhvZF9leGlzdHMoJGV4LCdnZXRQcmV2aW91cycpJiYkZXg9JGV4LT5nZXRQcmV2aW91cygpKXx8KGlzc2V0KCRleC0+cHJldmlvdXMpJiYkZXg9JGV4LT5wcmV2aW91cykpOz8+CgkJPD9waHAgd2hpbGUoLS0kbGV2ZWwpX25ldHRlQ2xvc2VQYW5lbCgpPz4KCgoKCQk8P3BocCBpZighZW1wdHkoJGFwcGxpY2F0aW9uKSk6Pz4KCQk8P3BocCBfbmV0dGVPcGVuUGFuZWwoJ05ldHRlIEFwcGxpY2F0aW9uJyxUUlVFKT8+CgkJCTxoMz5SZXF1ZXN0czwvaDM+CgkJCTw/cGhwICR0bXA9JGFwcGxpY2F0aW9uLT5nZXRSZXF1ZXN0cygpO2VjaG8KX25ldHRlRHVtcChzZWxmOjpfZHVtcCgkdG1wLDApKT8+CgoJCQk8aDM+UHJlc2VudGVyPC9oMz4KCQkJPD9waHAgJHRtcD0kYXBwbGljYXRpb24tPmdldFByZXNlbnRlcigpO2VjaG8KX25ldHRlRHVtcChzZWxmOjpfZHVtcCgkdG1wLDApKT8+CgkJPD9waHAgX25ldHRlQ2xvc2VQYW5lbCgpPz4KCQk8P3BocCBlbmRpZj8+CgoKCgkJPD9waHAgX25ldHRlT3BlblBhbmVsKCdFbnZpcm9ubWVudCcsVFJVRSk/PgoJCQk8P3BocAokbGlzdD1nZXRfZGVmaW5lZF9jb25zdGFudHMoVFJVRSk7aWYoIWVtcHR5KCRsaXN0Wyd1c2VyJ10pKTo/PgoJCQk8aDM+PGEgaHJlZj0iIyIgb25jbGljaz0icmV0dXJuICFuZXR0ZVRvZ2dsZSh0aGlzLCAncG5sLWVudi1jb25zdCcpIj5Db25zdGFudHMgPGFiYnI+JiN4MjViYzs8L2FiYnI+PC9hPjwvaDM+CgkJCTx0YWJsZSBpZD0icG5sLWVudi1jb25zdCI+CgkJCTw/cGhwCgpmb3JlYWNoKCRsaXN0Wyd1c2VyJ11hcyRrPT4kdil7ZWNobyc8dHInLigkcm4rKyUyPycgY2xhc3M9Im9kZCInOicnKS4nPjx0aD4nLGh0bWxzcGVjaWFsY2hhcnMoJGspLCc8L3RoPic7ZWNobyc8dGQ+JyxfbmV0dGVEdW1wKHNlbGY6Ol9kdW1wKCR2LDApKSwiPC90ZD48L3RyPlxuIjt9Pz4KCQkJPC90YWJsZT4KCQkJPD9waHAgZW5kaWY/PgoKCgkJCTxoMz48YSBocmVmPSIjIiBvbmNsaWNrPSJyZXR1cm4gIW5ldHRlVG9nZ2xlKHRoaXMsICdwbmwtZW52LWZpbGVzJykiPkluY2x1ZGVkIGZpbGVzIDxhYmJyPiYjeDI1YmE7PC9hYmJyPjwvYT4oPD9waHAgZWNobwpjb3VudChnZXRfaW5jbHVkZWRfZmlsZXMoKSk/Pik8L2gzPgoJCQk8dGFibGUgaWQ9InBubC1lbnYtZmlsZXMiIGNsYXNzPSJjb2xsYXBzZWQiPgoJCQk8P3BocAoKZm9yZWFjaChnZXRfaW5jbHVkZWRfZmlsZXMoKWFzJHYpe2VjaG8nPHRyJy4oJHJuKyslMj8nIGNsYXNzPSJvZGQiJzonJykuJz48dGQ+JyxodG1sc3BlY2lhbGNoYXJzKCR2KSwiPC90ZD48L3RyPlxuIjt9Pz4KCQkJPC90YWJsZT4KCgoJCQk8aDM+JF9TRVJWRVI8L2gzPgoJCQk8P3BocCBpZihlbXB0eSgkX1NFUlZFUikpOj8+CgkJCTxwPjxpPmVtcHR5PC9pPjwvcD4KCQkJPD9waHAgZWxzZTo/PgoJCQk8dGFibGU+CgkJCTw/cGhwCgpmb3JlYWNoKCRfU0VSVkVSCmFzJGs9PiR2KWVjaG8nPHRyJy4oJHJuKyslMj8nIGNsYXNzPSJvZGQiJzonJykuJz48dGg+JyxodG1sc3BlY2lhbGNoYXJzKCRrKSwnPC90aD48dGQ+JyxfbmV0dGVEdW1wKHNlbGY6Ol9kdW1wKCR2LDApKSwiPC90ZD48L3RyPlxuIjs/PgoJCQk8L3RhYmxlPgoJCQk8P3BocCBlbmRpZj8+CgkJPD9waHAgX25ldHRlQ2xvc2VQYW5lbCgpPz4KCgoKCQk8P3BocCBfbmV0dGVPcGVuUGFuZWwoJ0hUVFAgcmVxdWVzdCcsVFJVRSk/PgoJCQk8P3BocCBpZihmdW5jdGlvbl9leGlzdHMoJ2FwYWNoZV9yZXF1ZXN0X2hlYWRlcnMnKSk6Pz4KCQkJPGgzPkhlYWRlcnM8L2gzPgoJCQk8dGFibGU+CgkJCTw/cGhwCgpmb3JlYWNoKGFwYWNoZV9yZXF1ZXN0X2hlYWRlcnMoKWFzJGs9PiR2KWVjaG8nPHRyJy4oJHJuKyslMj8nIGNsYXNzPSJvZGQiJzonJykuJz48dGg+JyxodG1sc3BlY2lhbGNoYXJzKCRrKSwnPC90aD48dGQ+JyxodG1sc3BlY2lhbGNoYXJzKCR2KSwiPC90ZD48L3RyPlxuIjs/PgoJCQk8L3RhYmxlPgoJCQk8P3BocCBlbmRpZj8+CgoKCQkJPD9waHAgZm9yZWFjaChhcnJheSgnX0dFVCcsJ19QT1NUJywnX0NPT0tJRScpYXMkbmFtZSk6Pz4KCQkJPGgzPiQ8P3BocCBlY2hvJG5hbWU/PjwvaDM+CgkJCTw/cGhwIGlmKGVtcHR5KCRHTE9CQUxTWyRuYW1lXSkpOj8+CgkJCTxwPjxpPmVtcHR5PC9pPjwvcD4KCQkJPD9waHAgZWxzZTo/PgoJCQk8dGFibGU+CgkJCTw/cGhwCgpmb3JlYWNoKCRHTE9CQUxTWyRuYW1lXWFzJGs9PiR2KWVjaG8nPHRyJy4oJHJuKyslMj8nIGNsYXNzPSJvZGQiJzonJykuJz48dGg+JyxodG1sc3BlY2lhbGNoYXJzKCRrKSwnPC90aD48dGQ+JyxfbmV0dGVEdW1wKHNlbGY6Ol9kdW1wKCR2LDApKSwiPC90ZD48L3RyPlxuIjs/PgoJCQk8L3RhYmxlPgoJCQk8P3BocCBlbmRpZj8+CgkJCTw/cGhwIGVuZGZvcmVhY2g/PgoJCTw/cGhwIF9uZXR0ZUNsb3NlUGFuZWwoKT8+CgoKCgkJPD9waHAgX25ldHRlT3BlblBhbmVsKCdIVFRQIHJlc3BvbnNlJyxUUlVFKT8+CgkJCTxoMz5IZWFkZXJzPC9oMz4KCQkJPD9waHAgaWYoaGVhZGVyc19saXN0KCkpOj8+CgkJCTxwcmU+PD9waHAKCmZvcmVhY2goaGVhZGVyc19saXN0KClhcyRzKWVjaG8KaHRtbHNwZWNpYWxjaGFycygkcyksJzxicj4nOz8+PC9wcmU+CgkJCTw/cGhwIGVsc2U6Pz4KCQkJPHA+PGk+bm8gaGVhZGVyczwvaT48L3A+CgkJCTw/cGhwIGVuZGlmPz4KCQk8P3BocCBfbmV0dGVDbG9zZVBhbmVsKCk/PgoKCgkJPHVsPgoJCQk8P3BocCBmb3JlYWNoKCRjb2xvcGhvbnMKYXMkY2FsbGJhY2spOj8+CgkJCTw/cGhwIGZvcmVhY2goKGFycmF5KWNhbGxfdXNlcl9mdW5jKCRjYWxsYmFjaywnYmx1ZXNjcmVlbicpYXMkbGluZSk6Pz48bGk+PD9waHAgZWNobyRsaW5lLCJcbiI/PjwvbGk+PD9waHAgZW5kZm9yZWFjaD8+CgkJCTw/cGhwIGVuZGZvcmVhY2g/PgoJCTwvdWw+Cgk8L2Rpdj4KPC9kaXY+Cgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibmV0dGVCbHVlc2NyZWVuIikpOzwvc2NyaXB0Pgo8L2JvZHk+CjwvaHRtbD48P3BocCB9c3RhdGljCmZ1bmN0aW9uCl93cml0ZUZpbGUoJGJ1ZmZlcil7ZndyaXRlKHNlbGY6OiRsb2dIYW5kbGUsJGJ1ZmZlcik7fXByaXZhdGUKc3RhdGljCmZ1bmN0aW9uCnNlbmRFbWFpbCgkbWVzc2FnZSl7JG1vbml0b3JGaWxlPXNlbGY6OiRsb2dGaWxlLicubW9uaXRvcic7aWYoQGZpbGVtdGltZSgkbW9uaXRvckZpbGUpK3NlbGY6OiRlbWFpbFNub296ZTx0aW1lKCkmJkBmaWxlX3B1dF9jb250ZW50cygkbW9uaXRvckZpbGUsJ3NlbnQnKSl7Y2FsbF91c2VyX2Z1bmMoc2VsZjo6JG1haWxlciwkbWVzc2FnZSk7fX1wcml2YXRlCnN0YXRpYwpmdW5jdGlvbgpkZWZhdWx0TWFpbGVyKCRtZXNzYWdlKXskaG9zdD1pc3NldCgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pPyRfU0VSVkVSWydIVFRQX0hPU1QnXTooaXNzZXQoJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ10pPyRfU0VSVkVSWydTRVJWRVJfTkFNRSddOicnKTskaGVhZGVycz1zdHJfcmVwbGFjZShhcnJheSgnJWhvc3QlJywnJWRhdGUlJywnJW1lc3NhZ2UlJyksYXJyYXkoJGhvc3QsQGRhdGUoJ1ktbS1kIEg6aTpzJyxzZWxmOjokdGltZSksJG1lc3NhZ2UpLHNlbGY6OiRlbWFpbEhlYWRlcnMpOyRzdWJqZWN0PSRoZWFkZXJzWydTdWJqZWN0J107JHRvPSRoZWFkZXJzWydUbyddOyRib2R5PXN0cl9yZXBsYWNlKCJcclxuIixQSFBfRU9MLCRoZWFkZXJzWydCb2R5J10pO3Vuc2V0KCRoZWFkZXJzWydTdWJqZWN0J10sJGhlYWRlcnNbJ1RvJ10sJGhlYWRlcnNbJ0JvZHknXSk7JGhlYWRlcj0nJztmb3JlYWNoKCRoZWFkZXJzCmFzJGtleT0+JHZhbHVlKXskaGVhZGVyLj0iJGtleTogJHZhbHVlIi5QSFBfRU9MO31tYWlsKCR0bywkc3ViamVjdCwkYm9keSwkaGVhZGVyKTt9c3RhdGljCmZ1bmN0aW9uCmVuYWJsZVByb2ZpbGVyKCl7c2VsZjo6JGVuYWJsZWRQcm9maWxlcj1UUlVFO31zdGF0aWMKZnVuY3Rpb24KZGlzYWJsZVByb2ZpbGVyKCl7c2VsZjo6JGVuYWJsZWRQcm9maWxlcj1GQUxTRTt9c3RhdGljCmZ1bmN0aW9uCmFkZENvbG9waG9uKCRjYWxsYmFjayl7aWYoIWlzX2NhbGxhYmxlKCRjYWxsYmFjaykpeyRhYmxlPWlzX2NhbGxhYmxlKCRjYWxsYmFjayxUUlVFLCR0ZXh0dWFsKTt0aHJvdwpuZXcKSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJDb2xvcGhvbiBoYW5kbGVyICckdGV4dHVhbCcgaXMgbm90ICIuKCRhYmxlPydjYWxsYWJsZS4nOid2YWxpZCBQSFAgY2FsbGJhY2suJykpO31pZighaW5fYXJyYXkoJGNhbGxiYWNrLHNlbGY6OiRjb2xvcGhvbnMsVFJVRSkpe3NlbGY6OiRjb2xvcGhvbnNbXT0kY2FsbGJhY2s7fX1wcml2YXRlCnN0YXRpYwpmdW5jdGlvbgpnZXREZWZhdWx0Q29sb3Bob25zKCRzZW5kZXIpe2lmKCRzZW5kZXI9PT0ncHJvZmlsZXInKXskYXJyW109J0VsYXBzZWQgdGltZTogPGI+Jy5udW1iZXJfZm9ybWF0KChtaWNyb3RpbWUoVFJVRSktc2VsZjo6JHRpbWUpKjEwMDAsMSwnLicsJyAnKS4nPC9iPiBtcyB8IEFsbG9jYXRlZCBtZW1vcnk6IDxiPicubnVtYmVyX2Zvcm1hdChtZW1vcnlfZ2V0X3BlYWtfdXNhZ2UoKS8xMDAwLDEsJy4nLCcgJykuJzwvYj4ga0InO2ZvcmVhY2goKGFycmF5KXNlbGY6OiRjb3VudGVycwphcyRuYW1lPT4kdmFsdWUpe2lmKGlzX2FycmF5KCR2YWx1ZSkpJHZhbHVlPWltcGxvZGUoJywgJywkdmFsdWUpOyRhcnJbXT1odG1sU3BlY2lhbENoYXJzKCRuYW1lKS4nID0gPHN0cm9uZz4nLmh0bWxTcGVjaWFsQ2hhcnMoJHZhbHVlKS4nPC9zdHJvbmc+Jzt9JGF1dG9sb2FkZWQ9Y2xhc3NfZXhpc3RzKCdOQXV0b0xvYWRlcicsRkFMU0UpP05BdXRvTG9hZGVyOjokY291bnQ6MDskcz0nPHNwYW4+Jy5jb3VudChnZXRfaW5jbHVkZWRfZmlsZXMoKSkuJy8nLiRhdXRvbG9hZGVkLicgZmlsZXM8L3NwYW4+LCAnOyRleGNsdWRlPWFycmF5KCdzdGRDbGFzcycsJ0V4Y2VwdGlvbicsJ0Vycm9yRXhjZXB0aW9uJywnVHJhdmVyc2FibGUnLCdJdGVyYXRvckFnZ3JlZ2F0ZScsJ0l0ZXJhdG9yJywnQXJyYXlBY2Nlc3MnLCdTZXJpYWxpemFibGUnLCdDbG9zdXJlJyk7Zm9yZWFjaChnZXRfbG9hZGVkX2V4dGVuc2lvbnMoKWFzJGV4dCl7JHJlZj1uZXcKUmVmbGVjdGlvbkV4dGVuc2lvbigkZXh0KTskZXhjbHVkZT1hcnJheV9tZXJnZSgkZXhjbHVkZSwkcmVmLT5nZXRDbGFzc05hbWVzKCkpO30kY2xhc3Nlcz1hcnJheV9kaWZmKGdldF9kZWNsYXJlZF9jbGFzc2VzKCksJGV4Y2x1ZGUpOyRpbnRmPWFycmF5X2RpZmYoZ2V0X2RlY2xhcmVkX2ludGVyZmFjZXMoKSwkZXhjbHVkZSk7JGZ1bmM9Z2V0X2RlZmluZWRfZnVuY3Rpb25zKCk7JGZ1bmM9KGFycmF5KUAkZnVuY1sndXNlciddOyRjb25zdHM9Z2V0X2RlZmluZWRfY29uc3RhbnRzKFRSVUUpOyRjb25zdHM9YXJyYXlfa2V5cygoYXJyYXkpQCRjb25zdHNbJ3VzZXInXSk7Zm9yZWFjaChhcnJheSgnY2xhc3NlcycsJ2ludGYnLCdmdW5jJywnY29uc3RzJylhcyRpdGVtKXskcy49JzxzcGFuICcuKCQkaXRlbT8ndGl0bGU9IicuaW1wbG9kZSgiLCAiLCQkaXRlbSkuJyInOicnKS4nPicuY291bnQoJCRpdGVtKS4nICcuJGl0ZW0uJzwvc3Bhbj4sICc7fSRhcnJbXT0kczt9aWYoJHNlbmRlcj09PSdibHVlc2NyZWVuJyl7JGFycltdPSdSZXBvcnQgZ2VuZXJhdGVkIGF0ICcuQGRhdGUoJ1kvbS9kIEg6aTpzJyxzZWxmOjokdGltZSk7aWYoaXNzZXQoJF9TRVJWRVJbJ0hUVFBfSE9TVCddLCRfU0VSVkVSWydSRVFVRVNUX1VSSSddKSl7JHVybD0oaXNzZXQoJF9TRVJWRVJbJ0hUVFBTJ10pJiZzdHJjYXNlY21wKCRfU0VSVkVSWydIVFRQUyddLCdvZmYnKT8naHR0cHM6Ly8nOidodHRwOi8vJykuaHRtbFNwZWNpYWxDaGFycygkX1NFUlZFUlsnSFRUUF9IT1NUJ10uJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10pOyRhcnJbXT0nPGEgaHJlZj0iJy4kdXJsLiciPicuJHVybC4nPC9hPic7fSRhcnJbXT0nUEhQICcuaHRtbFNwZWNpYWxDaGFycyhQSFBfVkVSU0lPTik7aWYoaXNzZXQoJF9TRVJWRVJbJ1NFUlZFUl9TT0ZUV0FSRSddKSkkYXJyW109aHRtbFNwZWNpYWxDaGFycygkX1NFUlZFUlsnU0VSVkVSX1NPRlRXQVJFJ10pO2lmKGNsYXNzX2V4aXN0cygnTkZyYW1ld29yaycpKSRhcnJbXT1odG1sU3BlY2lhbENoYXJzKCdOZXR0ZSBGcmFtZXdvcmsgJy5ORnJhbWV3b3JrOjpWRVJTSU9OKS4nIDxpPihyZXZpc2lvbiAnLmh0bWxTcGVjaWFsQ2hhcnMoTkZyYW1ld29yazo6UkVWSVNJT04pLicpPC9pPic7fXJldHVybiRhcnI7fXN0YXRpYwpmdW5jdGlvbgpmaXJlRHVtcCgkdmFyLCRrZXkpe3NlbGY6OmZpcmVTZW5kKCdEdW1wLzAuMScsYXJyYXkoKHN0cmluZykka2V5PT4kdmFyKSk7cmV0dXJuJHZhcjt9c3RhdGljCmZ1bmN0aW9uCmZpcmVMb2coJG1lc3NhZ2UsJHByaW9yaXR5PXNlbGY6OkxPRywkbGFiZWw9TlVMTCl7aWYoJG1lc3NhZ2UKaW5zdGFuY2VvZgpFeGNlcHRpb24pe2lmKCRwcmlvcml0eSE9PXNlbGY6OkVYQ0VQVElPTiYmJHByaW9yaXR5IT09c2VsZjo6VFJBQ0UpeyRwcmlvcml0eT1zZWxmOjpUUkFDRTt9JG1lc3NhZ2U9YXJyYXkoJ0NsYXNzJz0+Z2V0X2NsYXNzKCRtZXNzYWdlKSwnTWVzc2FnZSc9PiRtZXNzYWdlLT5nZXRNZXNzYWdlKCksJ0ZpbGUnPT4kbWVzc2FnZS0+Z2V0RmlsZSgpLCdMaW5lJz0+JG1lc3NhZ2UtPmdldExpbmUoKSwnVHJhY2UnPT4kbWVzc2FnZS0+Z2V0VHJhY2UoKSwnVHlwZSc9PicnLCdGdW5jdGlvbic9PicnKTtmb3JlYWNoKCRtZXNzYWdlWydUcmFjZSddYXMmJHJvdyl7aWYoZW1wdHkoJHJvd1snZmlsZSddKSkkcm93WydmaWxlJ109Jz8nO2lmKGVtcHR5KCRyb3dbJ2xpbmUnXSkpJHJvd1snbGluZSddPSc/Jzt9fWVsc2VpZigkcHJpb3JpdHk9PT1zZWxmOjpHUk9VUF9TVEFSVCl7JGxhYmVsPSRtZXNzYWdlOyRtZXNzYWdlPU5VTEw7fXJldHVybgpzZWxmOjpmaXJlU2VuZCgnRmlyZWJ1Z0NvbnNvbGUvMC4xJyxzZWxmOjpyZXBsYWNlT2JqZWN0cyhhcnJheShhcnJheSgnVHlwZSc9PiRwcmlvcml0eSwnTGFiZWwnPT4kbGFiZWwpLCRtZXNzYWdlKSkpO31wcml2YXRlCnN0YXRpYwpmdW5jdGlvbgpmaXJlU2VuZCgkc3RydWN0LCRwYXlsb2FkKXtpZihzZWxmOjokcHJvZHVjdGlvbk1vZGUpcmV0dXJuCk5VTEw7aWYoaGVhZGVyc19zZW50KCkpcmV0dXJuCkZBTFNFO2hlYWRlcignWC1XZi1Qcm90b2NvbC1uZXR0ZTogaHR0cDovL21ldGEud2lsZGZpcmVocS5vcmcvUHJvdG9jb2wvSnNvblN0cmVhbS8wLjInKTtoZWFkZXIoJ1gtV2YtbmV0dGUtUGx1Z2luLTE6IGh0dHA6Ly9tZXRhLmZpcmVwaHAub3JnL1dpbGRmaXJlL1BsdWdpbi9GaXJlUEhQL0xpYnJhcnktRmlyZVBIUENvcmUvMC4yLjAnKTtzdGF0aWMkc3RydWN0dXJlczskaW5kZXg9aXNzZXQoJHN0cnVjdHVyZXNbJHN0cnVjdF0pPyRzdHJ1Y3R1cmVzWyRzdHJ1Y3RdOigkc3RydWN0dXJlc1skc3RydWN0XT1jb3VudCgkc3RydWN0dXJlcykrMSk7aGVhZGVyKCJYLVdmLW5ldHRlLVN0cnVjdHVyZS0kaW5kZXg6IGh0dHA6Ly9tZXRhLmZpcmVwaHAub3JnL1dpbGRmaXJlL1N0cnVjdHVyZS9GaXJlUEhQLyRzdHJ1Y3QiKTskcGF5bG9hZD1qc29uX2VuY29kZSgkcGF5bG9hZCk7c3RhdGljJGNvdW50ZXI7Zm9yZWFjaChzdHJfc3BsaXQoJHBheWxvYWQsNDk5MClhcyRzKXskbnVtPSsrJGNvdW50ZXI7aGVhZGVyKCJYLVdmLW5ldHRlLSRpbmRleC0xLW4kbnVtOiB8JHN8XFwiKTt9aGVhZGVyKCJYLVdmLW5ldHRlLSRpbmRleC0xLW4kbnVtOiB8JHN8Iik7cmV0dXJuClRSVUU7fXN0YXRpYwpwcml2YXRlCmZ1bmN0aW9uCnJlcGxhY2VPYmplY3RzKCR2YWwpe2lmKGlzX29iamVjdCgkdmFsKSl7cmV0dXJuJ29iamVjdCAnLmdldF9jbGFzcygkdmFsKS4nJzt9ZWxzZWlmKGlzX3N0cmluZygkdmFsKSl7cmV0dXJuQGljb252KCdVVEYtMTYnLCdVVEYtOC8vSUdOT1JFJyxpY29udignVVRGLTgnLCdVVEYtMTYvL0lHTk9SRScsJHZhbCkpO31lbHNlaWYoaXNfYXJyYXkoJHZhbCkpe2ZvcmVhY2goJHZhbAphcyRrPT4kdil7dW5zZXQoJHZhbFska10pOyRrPUBpY29udignVVRGLTE2JywnVVRGLTgvL0lHTk9SRScsaWNvbnYoJ1VURi04JywnVVRGLTE2Ly9JR05PUkUnLCRrKSk7JHZhbFska109c2VsZjo6cmVwbGFjZU9iamVjdHMoJHYpO319cmV0dXJuJHZhbDt9fU5EZWJ1Zzo6X2luaXQoKTtjbGFzcwpOQ29uZmlndXJhdG9yCmV4dGVuZHMKTk9iamVjdHtwdWJsaWMkZGVmYXVsdENvbmZpZ0ZpbGU9JyVhcHBEaXIlL2NvbmZpZy5pbmknO3B1YmxpYyRkZWZhdWx0U2VydmljZXM9YXJyYXkoJ05ldHRlXFxBcHBsaWNhdGlvblxcQXBwbGljYXRpb24nPT4nTkFwcGxpY2F0aW9uJywnTmV0dGVcXFdlYlxcSHR0cENvbnRleHQnPT4nTkh0dHBDb250ZXh0JywnTmV0dGVcXFdlYlxcSUh0dHBSZXF1ZXN0Jz0+J05IdHRwUmVxdWVzdCcsJ05ldHRlXFxXZWJcXElIdHRwUmVzcG9uc2UnPT4nTkh0dHBSZXNwb25zZScsJ05ldHRlXFxXZWJcXElVc2VyJz0+J05Vc2VyJywnTmV0dGVcXENhY2hpbmdcXElDYWNoZVN0b3JhZ2UnPT5hcnJheShfX0NMQVNTX18sJ2NyZWF0ZUNhY2hlU3RvcmFnZScpLCdOZXR0ZVxcV2ViXFxTZXNzaW9uJz0+J05TZXNzaW9uJywnTmV0dGVcXExvYWRlcnNcXFJvYm90TG9hZGVyJz0+YXJyYXkoX19DTEFTU19fLCdjcmVhdGVSb2JvdExvYWRlcicpKTtmdW5jdGlvbgpkZXRlY3QoJG5hbWUpe3N3aXRjaCgkbmFtZSl7Y2FzZSdlbnZpcm9ubWVudCc6aWYoJHRoaXMtPmRldGVjdCgnY29uc29sZScpKXtyZXR1cm4KTkVudmlyb25tZW50OjpDT05TT0xFO31lbHNle3JldHVybgpORW52aXJvbm1lbnQ6OmdldE1vZGUoJ3Byb2R1Y3Rpb24nKT9ORW52aXJvbm1lbnQ6OlBST0RVQ1RJT046TkVudmlyb25tZW50OjpERVZFTE9QTUVOVDt9Y2FzZSdwcm9kdWN0aW9uJzppZihQSFBfU0FQST09PSdjbGknKXtyZXR1cm4KRkFMU0U7fWVsc2VpZihpc3NldCgkX1NFUlZFUlsnU0VSVkVSX0FERFInXSl8fGlzc2V0KCRfU0VSVkVSWydMT0NBTF9BRERSJ10pKXskYWRkcj1pc3NldCgkX1NFUlZFUlsnU0VSVkVSX0FERFInXSk/JF9TRVJWRVJbJ1NFUlZFUl9BRERSJ106JF9TRVJWRVJbJ0xPQ0FMX0FERFInXTskb2N0PWV4cGxvZGUoJy4nLCRhZGRyKTtyZXR1cm4kYWRkciE9PSc6OjEnJiYoY291bnQoJG9jdCkhPT00fHwoJG9jdFswXSE9PScxMCcmJiRvY3RbMF0hPT0nMTI3JyYmKCRvY3RbMF0hPT0nMTcyJ3x8JG9jdFsxXTwxNnx8JG9jdFsxXT4zMSkmJigkb2N0WzBdIT09JzE2OSd8fCRvY3RbMV0hPT0nMjU0JykmJigkb2N0WzBdIT09JzE5Mid8fCRvY3RbMV0hPT0nMTY4JykpKTt9ZWxzZXtyZXR1cm4KVFJVRTt9Y2FzZSdjb25zb2xlJzpyZXR1cm4KUEhQX1NBUEk9PT0nY2xpJztkZWZhdWx0OnJldHVybgpOVUxMO319ZnVuY3Rpb24KbG9hZENvbmZpZygkZmlsZSl7JG5hbWU9TkVudmlyb25tZW50OjpnZXROYW1lKCk7aWYoJGZpbGUKaW5zdGFuY2VvZgpOQ29uZmlnKXskY29uZmlnPSRmaWxlOyRmaWxlPU5VTEw7fWVsc2V7aWYoJGZpbGU9PT1OVUxMKXskZmlsZT0kdGhpcy0+ZGVmYXVsdENvbmZpZ0ZpbGU7fSRmaWxlPU5FbnZpcm9ubWVudDo6ZXhwYW5kKCRmaWxlKTskY29uZmlnPU5Db25maWc6OmZyb21GaWxlKCRmaWxlLCRuYW1lLDApO31pZigkY29uZmlnLT52YXJpYWJsZQppbnN0YW5jZW9mCk5Db25maWcpe2ZvcmVhY2goJGNvbmZpZy0+dmFyaWFibGUKYXMka2V5PT4kdmFsdWUpe05FbnZpcm9ubWVudDo6c2V0VmFyaWFibGUoJGtleSwkdmFsdWUpO319JGNvbmZpZy0+ZXhwYW5kKCk7JHJ1blNlcnZpY2VzPWFycmF5KCk7JGxvY2F0b3I9TkVudmlyb25tZW50OjpnZXRTZXJ2aWNlTG9jYXRvcigpO2lmKCRjb25maWctPnNlcnZpY2UKaW5zdGFuY2VvZgpOQ29uZmlnKXtmb3JlYWNoKCRjb25maWctPnNlcnZpY2UKYXMka2V5PT4kdmFsdWUpeyRrZXk9c3RydHIoJGtleSwnLScsJ1xcJyk7aWYoaXNfc3RyaW5nKCR2YWx1ZSkpeyRsb2NhdG9yLT5yZW1vdmVTZXJ2aWNlKCRrZXkpOyRsb2NhdG9yLT5hZGRTZXJ2aWNlKCRrZXksJHZhbHVlKTt9ZWxzZXtpZigkdmFsdWUtPmZhY3RvcnkpeyRsb2NhdG9yLT5yZW1vdmVTZXJ2aWNlKCRrZXkpOyRsb2NhdG9yLT5hZGRTZXJ2aWNlKCRrZXksJHZhbHVlLT5mYWN0b3J5LGlzc2V0KCR2YWx1ZS0+c2luZ2xldG9uKT8kdmFsdWUtPnNpbmdsZXRvbjpUUlVFLChhcnJheSkkdmFsdWUtPm9wdGlvbik7fWlmKCR2YWx1ZS0+cnVuKXskcnVuU2VydmljZXNbXT0ka2V5O319fX1pZighJGNvbmZpZy0+cGhwKXskY29uZmlnLT5waHA9JGNvbmZpZy0+c2V0O3Vuc2V0KCRjb25maWctPnNldCk7fWlmKCRjb25maWctPnBocAppbnN0YW5jZW9mCk5Db25maWcpe2lmKFBBVEhfU0VQQVJBVE9SIT09JzsnJiZpc3NldCgkY29uZmlnLT5waHAtPmluY2x1ZGVfcGF0aCkpeyRjb25maWctPnBocC0+aW5jbHVkZV9wYXRoPXN0cl9yZXBsYWNlKCc7JyxQQVRIX1NFUEFSQVRPUiwkY29uZmlnLT5waHAtPmluY2x1ZGVfcGF0aCk7fWZvcmVhY2goJGNvbmZpZy0+cGhwCmFzJGtleT0+JHZhbHVlKXtpZigkdmFsdWUKaW5zdGFuY2VvZgpOQ29uZmlnKXt1bnNldCgkY29uZmlnLT5waHAtPiRrZXkpO2ZvcmVhY2goJHZhbHVlCmFzJGs9PiR2KXskY29uZmlnLT5waHAtPnsiJGtleS4kayJ9PSR2O319fWZvcmVhY2goJGNvbmZpZy0+cGhwCmFzJGtleT0+JHZhbHVlKXska2V5PXN0cnRyKCRrZXksJy0nLCcuJyk7aWYoIWlzX3NjYWxhcigkdmFsdWUpKXt0aHJvdwpuZXcKSW52YWxpZFN0YXRlRXhjZXB0aW9uKCJDb25maWd1cmF0aW9uIHZhbHVlIGZvciBkaXJlY3RpdmUgJyRrZXknIGlzIG5vdCBzY2FsYXIuIik7fWlmKCRrZXk9PT0nZGF0ZS50aW1lem9uZScpe2RhdGVfZGVmYXVsdF90aW1lem9uZV9zZXQoJHZhbHVlKTt9aWYoZnVuY3Rpb25fZXhpc3RzKCdpbmlfc2V0Jykpe2luaV9zZXQoJGtleSwkdmFsdWUpO31lbHNle3N3aXRjaCgka2V5KXtjYXNlJ2luY2x1ZGVfcGF0aCc6c2V0X2luY2x1ZGVfcGF0aCgkdmFsdWUpO2JyZWFrO2Nhc2UnaWNvbnYuaW50ZXJuYWxfZW5jb2RpbmcnOmljb252X3NldF9lbmNvZGluZygnaW50ZXJuYWxfZW5jb2RpbmcnLCR2YWx1ZSk7YnJlYWs7Y2FzZSdtYnN0cmluZy5pbnRlcm5hbF9lbmNvZGluZyc6bWJfaW50ZXJuYWxfZW5jb2RpbmcoJHZhbHVlKTticmVhaztjYXNlJ2RhdGUudGltZXpvbmUnOmRhdGVfZGVmYXVsdF90aW1lem9uZV9zZXQoJHZhbHVlKTticmVhaztjYXNlJ2Vycm9yX3JlcG9ydGluZyc6ZXJyb3JfcmVwb3J0aW5nKCR2YWx1ZSk7YnJlYWs7Y2FzZSdpZ25vcmVfdXNlcl9hYm9ydCc6aWdub3JlX3VzZXJfYWJvcnQoJHZhbHVlKTticmVhaztjYXNlJ21heF9leGVjdXRpb25fdGltZSc6c2V0X3RpbWVfbGltaXQoJHZhbHVlKTticmVhaztkZWZhdWx0OmlmKGluaV9nZXQoJGtleSkhPSR2YWx1ZSl7dGhyb3cKbmV3Ck5vdFN1cHBvcnRlZEV4Y2VwdGlvbignUmVxdWlyZWQgZnVuY3Rpb24gaW5pX3NldCgpIGlzIGRpc2FibGVkLicpO319fX19aWYoJGNvbmZpZy0+Y29uc3QKaW5zdGFuY2VvZgpOQ29uZmlnKXtmb3JlYWNoKCRjb25maWctPmNvbnN0CmFzJGtleT0+JHZhbHVlKXtkZWZpbmUoJGtleSwkdmFsdWUpO319aWYoaXNzZXQoJGNvbmZpZy0+bW9kZSkpe2ZvcmVhY2goJGNvbmZpZy0+bW9kZQphcyRtb2RlPT4kc3RhdGUpe05FbnZpcm9ubWVudDo6c2V0TW9kZSgkbW9kZSwkc3RhdGUpO319Zm9yZWFjaCgkcnVuU2VydmljZXMKYXMkbmFtZSl7JGxvY2F0b3ItPmdldFNlcnZpY2UoJG5hbWUpO30kY29uZmlnLT5mcmVlemUoKTtyZXR1cm4kY29uZmlnO31mdW5jdGlvbgpjcmVhdGVTZXJ2aWNlTG9jYXRvcigpeyRsb2NhdG9yPW5ldwpOU2VydmljZUxvY2F0b3I7Zm9yZWFjaCgkdGhpcy0+ZGVmYXVsdFNlcnZpY2VzCmFzJG5hbWU9PiRzZXJ2aWNlKXskbG9jYXRvci0+YWRkU2VydmljZSgkbmFtZSwkc2VydmljZSk7fXJldHVybiRsb2NhdG9yO31zdGF0aWMKZnVuY3Rpb24KY3JlYXRlQ2FjaGVTdG9yYWdlKCl7cmV0dXJuCm5ldwpORmlsZVN0b3JhZ2UoTkVudmlyb25tZW50OjpnZXRWYXJpYWJsZSgndGVtcERpcicpKTt9c3RhdGljCmZ1bmN0aW9uCmNyZWF0ZVJvYm90TG9hZGVyKCRvcHRpb25zKXskbG9hZGVyPW5ldwpOUm9ib3RMb2FkZXI7JGxvYWRlci0+YXV0b1JlYnVpbGQ9IU5FbnZpcm9ubWVudDo6aXNQcm9kdWN0aW9uKCk7JGRpcnM9aXNzZXQoJG9wdGlvbnNbJ2RpcmVjdG9yeSddKT8kb3B0aW9uc1snZGlyZWN0b3J5J106YXJyYXkoTkVudmlyb25tZW50OjpnZXRWYXJpYWJsZSgnYXBwRGlyJyksTkVudmlyb25tZW50OjpnZXRWYXJpYWJsZSgnbGlic0RpcicpKTskbG9hZGVyLT5hZGREaXJlY3RvcnkoJGRpcnMpOyRsb2FkZXItPnJlZ2lzdGVyKCk7cmV0dXJuJGxvYWRlcjt9fWZpbmFsCmNsYXNzCk5FbnZpcm9ubWVudHtjb25zdApERVZFTE9QTUVOVD0nZGV2ZWxvcG1lbnQnO2NvbnN0ClBST0RVQ1RJT049J3Byb2R1Y3Rpb24nO2NvbnN0CkNPTlNPTEU9J2NvbnNvbGUnO2NvbnN0CkxBQj0nbGFiJztjb25zdApERUJVRz0nZGVidWcnO2NvbnN0ClBFUkZPUk1BTkNFPSdwZXJmb3JtYW5jZSc7cHJpdmF0ZQpzdGF0aWMkY29uZmlndXJhdG9yO3ByaXZhdGUKc3RhdGljJG1vZGVzPWFycmF5KCk7cHJpdmF0ZQpzdGF0aWMkY29uZmlnO3ByaXZhdGUKc3RhdGljJHNlcnZpY2VMb2NhdG9yO3ByaXZhdGUKc3RhdGljJHZhcnM9YXJyYXkoJ2VuY29kaW5nJz0+YXJyYXkoJ1VURi04JyxGQUxTRSksJ2xhbmcnPT5hcnJheSgnZW4nLEZBTFNFKSwnY2FjaGVCYXNlJz0+YXJyYXkoJyV0ZW1wRGlyJScsVFJVRSksJ3RlbXBEaXInPT5hcnJheSgnJWFwcERpciUvdGVtcCcsVFJVRSksJ2xvZ0Rpcic9PmFycmF5KCclYXBwRGlyJS9sb2cnLFRSVUUpKTtwcml2YXRlCnN0YXRpYyRhbGlhc2VzPWFycmF5KCdnZXRIdHRwQ29udGV4dCc9PidOZXR0ZVxcV2ViXFxIdHRwQ29udGV4dCcsJ2dldEh0dHBSZXF1ZXN0Jz0+J05ldHRlXFxXZWJcXElIdHRwUmVxdWVzdCcsJ2dldEh0dHBSZXNwb25zZSc9PidOZXR0ZVxcV2ViXFxJSHR0cFJlc3BvbnNlJywnZ2V0QXBwbGljYXRpb24nPT4nTmV0dGVcXEFwcGxpY2F0aW9uXFxBcHBsaWNhdGlvbicsJ2dldFVzZXInPT4nTmV0dGVcXFdlYlxcSVVzZXInKTtwcml2YXRlCnN0YXRpYyRjcml0aWNhbFNlY3Rpb25zO2ZpbmFsCmZ1bmN0aW9uCl9fY29uc3RydWN0KCl7dGhyb3cKbmV3CkxvZ2ljRXhjZXB0aW9uKCJDYW5ub3QgaW5zdGFudGlhdGUgc3RhdGljIGNsYXNzICIuZ2V0X2NsYXNzKCR0aGlzKSk7fXN0YXRpYwpmdW5jdGlvbgpzZXRDb25maWd1cmF0b3IoTkNvbmZpZ3VyYXRvciRjb25maWd1cmF0b3Ipe3NlbGY6OiRjb25maWd1cmF0b3I9JGNvbmZpZ3VyYXRvcjt9c3RhdGljCmZ1bmN0aW9uCmdldENvbmZpZ3VyYXRvcigpe2lmKHNlbGY6OiRjb25maWd1cmF0b3I9PT1OVUxMKXtzZWxmOjokY29uZmlndXJhdG9yPW5ldwpOQ29uZmlndXJhdG9yO31yZXR1cm4Kc2VsZjo6JGNvbmZpZ3VyYXRvcjt9c3RhdGljCmZ1bmN0aW9uCnNldE5hbWUoJG5hbWUpe2lmKCFpc3NldChzZWxmOjokdmFyc1snZW52aXJvbm1lbnQnXSkpe3NlbGY6OnNldFZhcmlhYmxlKCdlbnZpcm9ubWVudCcsJG5hbWUsRkFMU0UpO31lbHNle3Rocm93Cm5ldwpJbnZhbGlkU3RhdGVFeGNlcHRpb24oJ0Vudmlyb25tZW50IG5hbWUgaGFzIGJlZW4gYWxyZWFkeSBzZXQuJyk7fX1zdGF0aWMKZnVuY3Rpb24KZ2V0TmFtZSgpeyRuYW1lPXNlbGY6OmdldFZhcmlhYmxlKCdlbnZpcm9ubWVudCcpO2lmKCRuYW1lPT09TlVMTCl7JG5hbWU9c2VsZjo6Z2V0Q29uZmlndXJhdG9yKCktPmRldGVjdCgnZW52aXJvbm1lbnQnKTtzZWxmOjpzZXRWYXJpYWJsZSgnZW52aXJvbm1lbnQnLCRuYW1lLEZBTFNFKTt9cmV0dXJuJG5hbWU7fXN0YXRpYwpmdW5jdGlvbgpzZXRNb2RlKCRtb2RlLCR2YWx1ZT1UUlVFKXtzZWxmOjokbW9kZXNbJG1vZGVdPShib29sKSR2YWx1ZTt9c3RhdGljCmZ1bmN0aW9uCmdldE1vZGUoJG1vZGUpe2lmKGlzc2V0KHNlbGY6OiRtb2Rlc1skbW9kZV0pKXtyZXR1cm4Kc2VsZjo6JG1vZGVzWyRtb2RlXTt9ZWxzZXtyZXR1cm4Kc2VsZjo6JG1vZGVzWyRtb2RlXT1zZWxmOjpnZXRDb25maWd1cmF0b3IoKS0+ZGV0ZWN0KCRtb2RlKTt9fXN0YXRpYwpmdW5jdGlvbgppc0NvbnNvbGUoKXtyZXR1cm4Kc2VsZjo6Z2V0TW9kZSgnY29uc29sZScpO31zdGF0aWMKZnVuY3Rpb24KaXNQcm9kdWN0aW9uKCl7cmV0dXJuCnNlbGY6OmdldE1vZGUoJ3Byb2R1Y3Rpb24nKTt9c3RhdGljCmZ1bmN0aW9uCmlzRGVidWdnaW5nKCl7dGhyb3cKbmV3CkRlcHJlY2F0ZWRFeGNlcHRpb247fXN0YXRpYwpmdW5jdGlvbgpzZXRWYXJpYWJsZSgkbmFtZSwkdmFsdWUsJGV4cGFuZD1UUlVFKXtpZighaXNfc3RyaW5nKCR2YWx1ZSkpeyRleHBhbmQ9RkFMU0U7fXNlbGY6OiR2YXJzWyRuYW1lXT1hcnJheSgkdmFsdWUsKGJvb2wpJGV4cGFuZCk7fXN0YXRpYwpmdW5jdGlvbgpnZXRWYXJpYWJsZSgkbmFtZSwkZGVmYXVsdD1OVUxMKXtpZihpc3NldChzZWxmOjokdmFyc1skbmFtZV0pKXtsaXN0KCR2YXIsJGV4cCk9c2VsZjo6JHZhcnNbJG5hbWVdO2lmKCRleHApeyR2YXI9c2VsZjo6ZXhwYW5kKCR2YXIpO3NlbGY6OiR2YXJzWyRuYW1lXT1hcnJheSgkdmFyLEZBTFNFKTt9cmV0dXJuJHZhcjt9ZWxzZXskY29uc3Q9c3RydG91cHBlcihwcmVnX3JlcGxhY2UoJyMoLikoW0EtWl0rKSMnLCckMV8kMicsJG5hbWUpKTskbGlzdD1nZXRfZGVmaW5lZF9jb25zdGFudHMoVFJVRSk7aWYoaXNzZXQoJGxpc3RbJ3VzZXInXVskY29uc3RdKSl7c2VsZjo6JHZhcnNbJG5hbWVdPWFycmF5KCRsaXN0Wyd1c2VyJ11bJGNvbnN0XSxGQUxTRSk7cmV0dXJuJGxpc3RbJ3VzZXInXVskY29uc3RdO31lbHNle3JldHVybiRkZWZhdWx0O319fXN0YXRpYwpmdW5jdGlvbgpnZXRWYXJpYWJsZXMoKXskcmVzPWFycmF5KCk7Zm9yZWFjaChzZWxmOjokdmFycwphcyRuYW1lPT4kZm9vKXskcmVzWyRuYW1lXT1zZWxmOjpnZXRWYXJpYWJsZSgkbmFtZSk7fXJldHVybiRyZXM7fXN0YXRpYwpmdW5jdGlvbgpleHBhbmQoJHZhcil7aWYoaXNfc3RyaW5nKCR2YXIpJiZzdHJwb3MoJHZhciwnJScpIT09RkFMU0Upe3JldHVybkBwcmVnX3JlcGxhY2VfY2FsbGJhY2soJyMlKFthLXowLTlfLV0qKSUjaScsYXJyYXkoX19DTEFTU19fLCdleHBhbmRDYicpLCR2YXIpO31yZXR1cm4kdmFyO31wcml2YXRlCnN0YXRpYwpmdW5jdGlvbgpleHBhbmRDYigkbSl7bGlzdCgsJHZhcik9JG07aWYoJHZhcj09PScnKXJldHVybiclJztzdGF0aWMkbGl2ZWxvY2s7aWYoaXNzZXQoJGxpdmVsb2NrWyR2YXJdKSl7dGhyb3cKbmV3CkludmFsaWRTdGF0ZUV4Y2VwdGlvbigiQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkIGZvciB2YXJpYWJsZXM6ICIuaW1wbG9kZSgnLCAnLGFycmF5X2tleXMoJGxpdmVsb2NrKSkuIi4iKTt9dHJ5eyRsaXZlbG9ja1skdmFyXT1UUlVFOyR2YWw9c2VsZjo6Z2V0VmFyaWFibGUoJHZhcik7dW5zZXQoJGxpdmVsb2NrWyR2YXJdKTt9Y2F0Y2goRXhjZXB0aW9uJGUpeyRsaXZlbG9jaz1hcnJheSgpO3Rocm93JGU7fWlmKCR2YWw9PT1OVUxMKXt0aHJvdwpuZXcKSW52YWxpZFN0YXRlRXhjZXB0aW9uKCJVbmtub3duIGVudmlyb25tZW50IHZhcmlhYmxlICckdmFyJy4iKTt9ZWxzZWlmKCFpc19zY2FsYXIoJHZhbCkpe3Rocm93Cm5ldwpJbnZhbGlkU3RhdGVFeGNlcHRpb24oIkVudmlyb25tZW50IHZhcmlhYmxlICckdmFyJyBpcyBub3Qgc2NhbGFyLiIpO31yZXR1cm4kdmFsO31zdGF0aWMKZnVuY3Rpb24KZ2V0U2VydmljZUxvY2F0b3IoKXtpZihzZWxmOjokc2VydmljZUxvY2F0b3I9PT1OVUxMKXtzZWxmOjokc2VydmljZUxvY2F0b3I9c2VsZjo6Z2V0Q29uZmlndXJhdG9yKCktPmNyZWF0ZVNlcnZpY2VMb2NhdG9yKCk7fXJldHVybgpzZWxmOjokc2VydmljZUxvY2F0b3I7fXN0YXRpYwpmdW5jdGlvbgpnZXRTZXJ2aWNlKCRuYW1lLGFycmF5JG9wdGlvbnM9TlVMTCl7cmV0dXJuCnNlbGY6OmdldFNlcnZpY2VMb2NhdG9yKCktPmdldFNlcnZpY2UoJG5hbWUsJG9wdGlvbnMpO31zdGF0aWMKZnVuY3Rpb24Kc2V0U2VydmljZUFsaWFzKCRzZXJ2aWNlLCRhbGlhcyl7c2VsZjo6JGFsaWFzZXNbJ2dldCcudWNmaXJzdCgkYWxpYXMpXT0kc2VydmljZTt9c3RhdGljCmZ1bmN0aW9uCl9fY2FsbFN0YXRpYygkbmFtZSwkYXJncyl7aWYoaXNzZXQoc2VsZjo6JGFsaWFzZXNbJG5hbWVdKSl7cmV0dXJuCnNlbGY6OmdldFNlcnZpY2VMb2NhdG9yKCktPmdldFNlcnZpY2Uoc2VsZjo6JGFsaWFzZXNbJG5hbWVdLCRhcmdzKTt9ZWxzZXt0aHJvdwpuZXcKTWVtYmVyQWNjZXNzRXhjZXB0aW9uKCJDYWxsIHRvIHVuZGVmaW5lZCBzdGF0aWMgbWV0aG9kIE5ldHRlXFxFbnZpcm9ubWVudDo6JG5hbWUoKS4iKTt9fXN0YXRpYwpmdW5jdGlvbgpnZXRIdHRwUmVxdWVzdCgpe3JldHVybgpzZWxmOjpnZXRTZXJ2aWNlTG9jYXRvcigpLT5nZXRTZXJ2aWNlKHNlbGY6OiRhbGlhc2VzW19fRlVOQ1RJT05fX10pO31zdGF0aWMKZnVuY3Rpb24KZ2V0SHR0cENvbnRleHQoKXtyZXR1cm4Kc2VsZjo6Z2V0U2VydmljZUxvY2F0b3IoKS0+Z2V0U2VydmljZShzZWxmOjokYWxpYXNlc1tfX0ZVTkNUSU9OX19dKTt9c3RhdGljCmZ1bmN0aW9uCmdldEh0dHBSZXNwb25zZSgpe3JldHVybgpzZWxmOjpnZXRTZXJ2aWNlTG9jYXRvcigpLT5nZXRTZXJ2aWNlKHNlbGY6OiRhbGlhc2VzW19fRlVOQ1RJT05fX10pO31zdGF0aWMKZnVuY3Rpb24KZ2V0QXBwbGljYXRpb24oKXtyZXR1cm4Kc2VsZjo6Z2V0U2VydmljZUxvY2F0b3IoKS0+Z2V0U2VydmljZShzZWxmOjokYWxpYXNlc1tfX0ZVTkNUSU9OX19dKTt9c3RhdGljCmZ1bmN0aW9uCmdldFVzZXIoKXtyZXR1cm4Kc2VsZjo6Z2V0U2VydmljZUxvY2F0b3IoKS0+Z2V0U2VydmljZShzZWxmOjokYWxpYXNlc1tfX0ZVTkNUSU9OX19dKTt9c3RhdGljCmZ1bmN0aW9uCmdldENhY2hlKCRuYW1lc3BhY2U9Jycpe3JldHVybgpuZXcKTkNhY2hlKHNlbGY6OmdldFNlcnZpY2UoJ05ldHRlXFxDYWNoaW5nXFxJQ2FjaGVTdG9yYWdlJyksJG5hbWVzcGFjZSk7fXN0YXRpYwpmdW5jdGlvbgpnZXRTZXNzaW9uKCRuYW1lc3BhY2U9TlVMTCl7JGhhbmRsZXI9c2VsZjo6Z2V0U2VydmljZSgnTmV0dGVcXFdlYlxcU2Vzc2lvbicpO3JldHVybiRuYW1lc3BhY2U9PT1OVUxMPyRoYW5kbGVyOiRoYW5kbGVyLT5nZXROYW1lc3BhY2UoJG5hbWVzcGFjZSk7fXN0YXRpYwpmdW5jdGlvbgpsb2FkQ29uZmlnKCRmaWxlPU5VTEwpe3JldHVybgpzZWxmOjokY29uZmlnPXNlbGY6OmdldENvbmZpZ3VyYXRvcigpLT5sb2FkQ29uZmlnKCRmaWxlKTt9c3RhdGljCmZ1bmN0aW9uCmdldENvbmZpZygka2V5PU5VTEwsJGRlZmF1bHQ9TlVMTCl7aWYoZnVuY19udW1fYXJncygpKXtyZXR1cm4KaXNzZXQoc2VsZjo6JGNvbmZpZ1ska2V5XSk/c2VsZjo6JGNvbmZpZ1ska2V5XTokZGVmYXVsdDt9ZWxzZXtyZXR1cm4Kc2VsZjo6JGNvbmZpZzt9fXN0YXRpYwpmdW5jdGlvbgplbnRlckNyaXRpY2FsU2VjdGlvbigka2V5KXskZmlsZT1zZWxmOjpnZXRWYXJpYWJsZSgndGVtcERpcicpLiIvY3JpdGljYWxTZWN0aW9uLSIubWQ1KCRrZXkpOyRoYW5kbGU9Zm9wZW4oJGZpbGUsJ3cnKTtmbG9jaygkaGFuZGxlLExPQ0tfRVgpO3NlbGY6OiRjcml0aWNhbFNlY3Rpb25zWyRrZXldPWFycmF5KCRmaWxlLCRoYW5kbGUpO31zdGF0aWMKZnVuY3Rpb24KbGVhdmVDcml0aWNhbFNlY3Rpb24oJGtleSl7aWYoIWlzc2V0KHNlbGY6OiRjcml0aWNhbFNlY3Rpb25zWyRrZXldKSl7dGhyb3cKbmV3CkludmFsaWRTdGF0ZUV4Y2VwdGlvbignQ3JpdGljYWwgc2VjdGlvbiBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQuJyk7fWxpc3QoJGZpbGUsJGhhbmRsZSk9c2VsZjo6JGNyaXRpY2FsU2VjdGlvbnNbJGtleV07QHVubGluaygkZmlsZSk7ZmNsb3NlKCRoYW5kbGUpO3Vuc2V0KHNlbGY6OiRjcml0aWNhbFNlY3Rpb25zWyRrZXldKTt9fWNsYXNzCk5TZXJ2aWNlTG9jYXRvcgpleHRlbmRzCk5PYmplY3QKaW1wbGVtZW50cwpJU2VydmljZUxvY2F0b3J7cHJpdmF0ZSRwYXJlbnQ7cHJpdmF0ZSRyZWdpc3RyeT1hcnJheSgpO3ByaXZhdGUkZmFjdG9yaWVzPWFycmF5KCk7ZnVuY3Rpb24KX19jb25zdHJ1Y3QoSVNlcnZpY2VMb2NhdG9yJHBhcmVudD1OVUxMKXskdGhpcy0+cGFyZW50PSRwYXJlbnQ7fWZ1bmN0aW9uCmFkZFNlcnZpY2UoJG5hbWUsJHNlcnZpY2UsJHNpbmdsZXRvbj1UUlVFLGFycmF5JG9wdGlvbnM9TlVMTCl7aWYoIWlzX3N0cmluZygkbmFtZSl8fCRuYW1lPT09Jycpe3Rocm93Cm5ldwpJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIlNlcnZpY2UgbmFtZSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZywgIi5nZXR0eXBlKCRuYW1lKS4iIGdpdmVuLiIpO30kbG93ZXI9c3RydG9sb3dlcigkbmFtZSk7aWYoaXNzZXQoJHRoaXMtPnJlZ2lzdHJ5WyRsb3dlcl0pKXt0aHJvdwpuZXcKTkFtYmlndW91c1NlcnZpY2VFeGNlcHRpb24oIlNlcnZpY2UgbmFtZWQgJyRuYW1lJyBoYXMgYmVlbiBhbHJlYWR5IHJlZ2lzdGVyZWQuIik7fWlmKGlzX29iamVjdCgkc2VydmljZSkpe2lmKCEkc2luZ2xldG9ufHwkb3B0aW9ucyl7dGhyb3cKbmV3CkludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiU2VydmljZSBuYW1lZCAnJG5hbWUnIGlzIGFuIGluc3RhbnRpYXRlZCBvYmplY3QgYW5kIG11c3QgdGhlcmVmb3JlIGJlIHNpbmdsZXRvbiB3aXRob3V0IG9wdGlvbnMuIik7fSR0aGlzLT5yZWdpc3RyeVskbG93ZXJdPSRzZXJ2aWNlO31lbHNle2lmKCEkc2VydmljZSl7dGhyb3cKbmV3CkludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiU2VydmljZSBuYW1lZCAnJG5hbWUnIGlzIGVtcHR5LiIpO30kdGhpcy0+ZmFjdG9yaWVzWyRsb3dlcl09YXJyYXkoJHNlcnZpY2UsJHNpbmdsZXRvbiwkb3B0aW9ucyk7fX1mdW5jdGlvbgpyZW1vdmVTZXJ2aWNlKCRuYW1lKXtpZighaXNfc3RyaW5nKCRuYW1lKXx8JG5hbWU9PT0nJyl7dGhyb3cKbmV3CkludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiU2VydmljZSBuYW1lIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nLCAiLmdldHR5cGUoJG5hbWUpLiIgZ2l2ZW4uIik7fSRsb3dlcj1zdHJ0b2xvd2VyKCRuYW1lKTt1bnNldCgkdGhpcy0+cmVnaXN0cnlbJGxvd2VyXSwkdGhpcy0+ZmFjdG9yaWVzWyRsb3dlcl0pO31mdW5jdGlvbgpnZXRTZXJ2aWNlKCRuYW1lLGFycmF5JG9wdGlvbnM9TlVMTCl7aWYoIWlzX3N0cmluZygkbmFtZSl8fCRuYW1lPT09Jycpe3Rocm93Cm5ldwpJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIlNlcnZpY2UgbmFtZSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZywgIi5nZXR0eXBlKCRuYW1lKS4iIGdpdmVuLiIpO30kbG93ZXI9c3RydG9sb3dlcigkbmFtZSk7aWYoaXNzZXQoJHRoaXMtPnJlZ2lzdHJ5WyRsb3dlcl0pKXtpZigkb3B0aW9ucyl7dGhyb3cKbmV3CkludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiU2VydmljZSBuYW1lZCAnJG5hbWUnIGlzIHNpbmdsZXRvbiBhbmQgdGhlcmVmb3JlIGNhbiBub3QgaGF2ZSBvcHRpb25zLiIpO31yZXR1cm4kdGhpcy0+cmVnaXN0cnlbJGxvd2VyXTt9ZWxzZWlmKGlzc2V0KCR0aGlzLT5mYWN0b3JpZXNbJGxvd2VyXSkpe2xpc3QoJGZhY3RvcnksJHNpbmdsZXRvbiwkZGVmT3B0aW9ucyk9JHRoaXMtPmZhY3Rvcmllc1skbG93ZXJdO2lmKCRzaW5nbGV0b24mJiRvcHRpb25zKXt0aHJvdwpuZXcKSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJTZXJ2aWNlIG5hbWVkICckbmFtZScgaXMgc2luZ2xldG9uIGFuZCB0aGVyZWZvcmUgY2FuIG5vdCBoYXZlIG9wdGlvbnMuIik7fWVsc2VpZigkZGVmT3B0aW9ucyl7JG9wdGlvbnM9JG9wdGlvbnM/JG9wdGlvbnMrJGRlZk9wdGlvbnM6JGRlZk9wdGlvbnM7fWlmKGlzX3N0cmluZygkZmFjdG9yeSkmJnN0cnBvcygkZmFjdG9yeSwnOicpPT09RkFMU0Upe2lmKCRhPXN0cnJwb3MoJGZhY3RvcnksJ1xcJykpJGZhY3Rvcnk9c3Vic3RyKCRmYWN0b3J5LCRhKzEpO2lmKCFjbGFzc19leGlzdHMoJGZhY3RvcnkpKXt0aHJvdwpuZXcKTkFtYmlndW91c1NlcnZpY2VFeGNlcHRpb24oIkNhbm5vdCBpbnN0YW50aWF0ZSBzZXJ2aWNlICckbmFtZScsIGNsYXNzICckZmFjdG9yeScgbm90IGZvdW5kLiIpO30kc2VydmljZT1uZXckZmFjdG9yeTtpZigkb3B0aW9ucyYmbWV0aG9kX2V4aXN0cygkc2VydmljZSwnc2V0T3B0aW9ucycpKXskc2VydmljZS0+c2V0T3B0aW9ucygkb3B0aW9ucyk7fX1lbHNleyRmYWN0b3J5PWNhbGxiYWNrKCRmYWN0b3J5KTtpZighJGZhY3RvcnktPmlzQ2FsbGFibGUoKSl7dGhyb3cKbmV3CkludmFsaWRTdGF0ZUV4Y2VwdGlvbigiQ2Fubm90IGluc3RhbnRpYXRlIHNlcnZpY2UgJyRuYW1lJywgaGFuZGxlciAnJGZhY3RvcnknIGlzIG5vdCBjYWxsYWJsZS4iKTt9JHNlcnZpY2U9JGZhY3RvcnktPmludm9rZSgkb3B0aW9ucyk7aWYoIWlzX29iamVjdCgkc2VydmljZSkpe3Rocm93Cm5ldwpOQW1iaWd1b3VzU2VydmljZUV4Y2VwdGlvbigiQ2Fubm90IGluc3RhbnRpYXRlIHNlcnZpY2UgJyRuYW1lJywgdmFsdWUgcmV0dXJuZWQgYnkgJyRmYWN0b3J5JyBpcyBub3Qgb2JqZWN0LiIpO319aWYoJHNpbmdsZXRvbil7JHRoaXMtPnJlZ2lzdHJ5WyRsb3dlcl09JHNlcnZpY2U7dW5zZXQoJHRoaXMtPmZhY3Rvcmllc1skbG93ZXJdKTt9cmV0dXJuJHNlcnZpY2U7fWlmKCR0aGlzLT5wYXJlbnQhPT1OVUxMKXtyZXR1cm4kdGhpcy0+cGFyZW50LT5nZXRTZXJ2aWNlKCRuYW1lLCRvcHRpb25zKTt9ZWxzZXt0aHJvdwpuZXcKSW52YWxpZFN0YXRlRXhjZXB0aW9uKCJTZXJ2aWNlICckbmFtZScgbm90IGZvdW5kLiIpO319ZnVuY3Rpb24KaGFzU2VydmljZSgkbmFtZSwkY3JlYXRlZD1GQUxTRSl7aWYoIWlzX3N0cmluZygkbmFtZSl8fCRuYW1lPT09Jycpe3Rocm93Cm5ldwpJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIlNlcnZpY2UgbmFtZSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZywgIi5nZXR0eXBlKCRuYW1lKS4iIGdpdmVuLiIpO30kbG93ZXI9c3RydG9sb3dlcigkbmFtZSk7cmV0dXJuCmlzc2V0KCR0aGlzLT5yZWdpc3RyeVskbG93ZXJdKXx8KCEkY3JlYXRlZCYmaXNzZXQoJHRoaXMtPmZhY3Rvcmllc1skbG93ZXJdKSl8fCgkdGhpcy0+cGFyZW50IT09TlVMTCYmJHRoaXMtPnBhcmVudC0+aGFzU2VydmljZSgkbmFtZSwkY3JlYXRlZCkpO31mdW5jdGlvbgpnZXRQYXJlbnQoKXtyZXR1cm4kdGhpcy0+cGFyZW50O319Y2xhc3MKTkFtYmlndW91c1NlcnZpY2VFeGNlcHRpb24KZXh0ZW5kcwpFeGNlcHRpb257fWFic3RyYWN0CmNsYXNzCk5Gb3JtQ29udHJvbApleHRlbmRzCk5Db21wb25lbnQKaW1wbGVtZW50cwpJRm9ybUNvbnRyb2x7cHVibGljCnN0YXRpYyRpZE1hc2s9J2ZybSVzLSVzJztwdWJsaWMkY2FwdGlvbjtwcm90ZWN0ZWQkdmFsdWU7cHJvdGVjdGVkJGNvbnRyb2w7cHJvdGVjdGVkJGxhYmVsO3ByaXZhdGUkZXJyb3JzPWFycmF5KCk7cHJpdmF0ZSRkaXNhYmxlZD1GQUxTRTtwcml2YXRlJGh0bWxJZDtwcml2YXRlJGh0bWxOYW1lO3ByaXZhdGUkcnVsZXM7cHJpdmF0ZSR0cmFuc2xhdG9yPVRSVUU7cHJpdmF0ZSRvcHRpb25zPWFycmF5KCk7ZnVuY3Rpb24KX19jb25zdHJ1Y3QoJGNhcHRpb249TlVMTCl7JHRoaXMtPm1vbml0b3IoJ05Gb3JtJyk7cGFyZW50OjpfX2NvbnN0cnVjdCgpOyR0aGlzLT5jb250cm9sPU5IdG1sOjplbCgnaW5wdXQnKTskdGhpcy0+bGFiZWw9Tkh0bWw6OmVsKCdsYWJlbCcpOyR0aGlzLT5jYXB0aW9uPSRjYXB0aW9uOyR0aGlzLT5ydWxlcz1uZXcKTlJ1bGVzKCR0aGlzKTt9cHJvdGVjdGVkCmZ1bmN0aW9uCmF0dGFjaGVkKCRmb3JtKXtpZighJHRoaXMtPmRpc2FibGVkJiYkZm9ybQppbnN0YW5jZW9mCk5Gb3JtJiYkZm9ybS0+aXNBbmNob3JlZCgpJiYkZm9ybS0+aXNTdWJtaXR0ZWQoKSl7JHRoaXMtPmh0bWxOYW1lPU5VTEw7JHRoaXMtPmxvYWRIdHRwRGF0YSgpO319ZnVuY3Rpb24KZ2V0Rm9ybSgkbmVlZD1UUlVFKXtyZXR1cm4kdGhpcy0+bG9va3VwKCdORm9ybScsJG5lZWQpO31mdW5jdGlvbgpnZXRIdG1sTmFtZSgpe2lmKCR0aGlzLT5odG1sTmFtZT09PU5VTEwpeyRzPScnOyRuYW1lPSR0aGlzLT5nZXROYW1lKCk7JG9iaj0kdGhpcy0+bG9va3VwKCdJTmFtaW5nQ29udGFpbmVyJyxUUlVFKTt3aGlsZSghKCRvYmoKaW5zdGFuY2VvZgpORm9ybSkpeyRzPSJbJG5hbWVdJHMiOyRuYW1lPSRvYmotPmdldE5hbWUoKTskb2JqPSRvYmotPmxvb2t1cCgnSU5hbWluZ0NvbnRhaW5lcicsVFJVRSk7fSRuYW1lLj0kcztpZigkbmFtZT09PSdzdWJtaXQnKXt0aHJvdwpuZXcKSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJGb3JtIGNvbnRyb2wgbmFtZSAnc3VibWl0JyBpcyBub3QgYWxsb3dlZCBkdWUgdG8gSmF2YVNjcmlwdCBsaW1pdGF0aW9ucy4iKTt9JHRoaXMtPmh0bWxOYW1lPSRuYW1lO31yZXR1cm4kdGhpcy0+aHRtbE5hbWU7fWZ1bmN0aW9uCnNldEh0bWxJZCgkaWQpeyR0aGlzLT5odG1sSWQ9JGlkO3JldHVybiR0aGlzO31mdW5jdGlvbgpnZXRIdG1sSWQoKXtpZigkdGhpcy0+aHRtbElkPT09RkFMU0Upe3JldHVybgpOVUxMO31lbHNlaWYoJHRoaXMtPmh0bWxJZD09PU5VTEwpeyR0aGlzLT5odG1sSWQ9c3ByaW50ZihzZWxmOjokaWRNYXNrLCR0aGlzLT5nZXRGb3JtKCktPmdldE5hbWUoKSwkdGhpcy0+Z2V0SHRtbE5hbWUoKSk7JHRoaXMtPmh0bWxJZD1zdHJfcmVwbGFjZShhcnJheSgnW10nLCdbJywnXScpLGFycmF5KCcnLCctJywnJyksJHRoaXMtPmh0bWxJZCk7fXJldHVybiR0aGlzLT5odG1sSWQ7fWZ1bmN0aW9uCnNldE9wdGlvbigka2V5LCR2YWx1ZSl7aWYoJHZhbHVlPT09TlVMTCl7dW5zZXQoJHRoaXMtPm9wdGlvbnNbJGtleV0pO31lbHNleyR0aGlzLT5vcHRpb25zWyRrZXldPSR2YWx1ZTt9cmV0dXJuJHRoaXM7fWZpbmFsCmZ1bmN0aW9uCmdldE9wdGlvbigka2V5LCRkZWZhdWx0PU5VTEwpe3JldHVybgppc3NldCgkdGhpcy0+b3B0aW9uc1ska2V5XSk/JHRoaXMtPm9wdGlvbnNbJGtleV06JGRlZmF1bHQ7fWZpbmFsCmZ1bmN0aW9uCmdldE9wdGlvbnMoKXtyZXR1cm4kdGhpcy0+b3B0aW9uczt9ZnVuY3Rpb24Kc2V0VHJhbnNsYXRvcihJVHJhbnNsYXRvciR0cmFuc2xhdG9yPU5VTEwpeyR0aGlzLT50cmFuc2xhdG9yPSR0cmFuc2xhdG9yO3JldHVybiR0aGlzO31maW5hbApmdW5jdGlvbgpnZXRUcmFuc2xhdG9yKCl7aWYoJHRoaXMtPnRyYW5zbGF0b3I9PT1UUlVFKXtyZXR1cm4kdGhpcy0+Z2V0Rm9ybShGQUxTRSk/JHRoaXMtPmdldEZvcm0oKS0+Z2V0VHJhbnNsYXRvcigpOk5VTEw7fXJldHVybiR0aGlzLT50cmFuc2xhdG9yO31mdW5jdGlvbgp0cmFuc2xhdGUoJHMsJGNvdW50PU5VTEwpeyR0cmFuc2xhdG9yPSR0aGlzLT5nZXRUcmFuc2xhdG9yKCk7cmV0dXJuJHRyYW5zbGF0b3I9PT1OVUxMPyRzOiR0cmFuc2xhdG9yLT50cmFuc2xhdGUoJHMsJGNvdW50KTt9ZnVuY3Rpb24Kc2V0VmFsdWUoJHZhbHVlKXskdGhpcy0+dmFsdWU9JHZhbHVlO3JldHVybiR0aGlzO31mdW5jdGlvbgpnZXRWYWx1ZSgpe3JldHVybiR0aGlzLT52YWx1ZTt9ZnVuY3Rpb24Kc2V0RGVmYXVsdFZhbHVlKCR2YWx1ZSl7JGZvcm09JHRoaXMtPmdldEZvcm0oRkFMU0UpO2lmKCEkZm9ybXx8ISRmb3JtLT5pc0FuY2hvcmVkKCl8fCEkZm9ybS0+aXNTdWJtaXR0ZWQoKSl7JHRoaXMtPnNldFZhbHVlKCR2YWx1ZSk7fXJldHVybiR0aGlzO31mdW5jdGlvbgpsb2FkSHR0cERhdGEoKXskcGF0aD1leHBsb2RlKCdbJyxzdHJ0cihzdHJfcmVwbGFjZShhcnJheSgnW10nLCddJyksJycsJHRoaXMtPmdldEh0bWxOYW1lKCkpLCcuJywnXycpKTskdGhpcy0+c2V0VmFsdWUoTkFycmF5VG9vbHM6OmdldCgkdGhpcy0+Z2V0Rm9ybSgpLT5nZXRIdHRwRGF0YSgpLCRwYXRoKSk7fWZ1bmN0aW9uCnNldERpc2FibGVkKCR2YWx1ZT1UUlVFKXskdGhpcy0+ZGlzYWJsZWQ9KGJvb2wpJHZhbHVlO3JldHVybiR0aGlzO31mdW5jdGlvbgppc0Rpc2FibGVkKCl7cmV0dXJuJHRoaXMtPmRpc2FibGVkO31mdW5jdGlvbgpnZXRDb250cm9sKCl7JHRoaXMtPnNldE9wdGlvbigncmVuZGVyZWQnLFRSVUUpOyRjb250cm9sPWNsb25lJHRoaXMtPmNvbnRyb2w7JGNvbnRyb2wtPm5hbWU9JHRoaXMtPmdldEh0bWxOYW1lKCk7JGNvbnRyb2wtPmRpc2FibGVkPSR0aGlzLT5kaXNhYmxlZDskY29udHJvbC0+aWQ9JHRoaXMtPmdldEh0bWxJZCgpO3JldHVybiRjb250cm9sO31mdW5jdGlvbgpnZXRMYWJlbCgkY2FwdGlvbj1OVUxMKXskbGFiZWw9Y2xvbmUkdGhpcy0+bGFiZWw7JGxhYmVsLT5mb3I9JHRoaXMtPmdldEh0bWxJZCgpO2lmKCRjYXB0aW9uIT09TlVMTCl7JGxhYmVsLT5zZXRUZXh0KCR0aGlzLT50cmFuc2xhdGUoJGNhcHRpb24pKTt9ZWxzZWlmKCR0aGlzLT5jYXB0aW9uCmluc3RhbmNlb2YKTkh0bWwpeyRsYWJlbC0+YWRkKCR0aGlzLT5jYXB0aW9uKTt9ZWxzZXskbGFiZWwtPnNldFRleHQoJHRoaXMtPnRyYW5zbGF0ZSgkdGhpcy0+Y2FwdGlvbikpO31yZXR1cm4kbGFiZWw7fWZpbmFsCmZ1bmN0aW9uCmdldENvbnRyb2xQcm90b3R5cGUoKXtyZXR1cm4kdGhpcy0+Y29udHJvbDt9ZmluYWwKZnVuY3Rpb24KZ2V0TGFiZWxQcm90b3R5cGUoKXtyZXR1cm4kdGhpcy0+bGFiZWw7fWZ1bmN0aW9uCnNldFJlbmRlcmVkKCR2YWx1ZT1UUlVFKXskdGhpcy0+c2V0T3B0aW9uKCdyZW5kZXJlZCcsJHZhbHVlKTtyZXR1cm4kdGhpczt9ZnVuY3Rpb24KaXNSZW5kZXJlZCgpe3JldHVybiFlbXB0eSgkdGhpcy0+b3B0aW9uc1sncmVuZGVyZWQnXSk7fWZ1bmN0aW9uCmFkZFJ1bGUoJG9wZXJhdGlvbiwkbWVzc2FnZT1OVUxMLCRhcmc9TlVMTCl7JHRoaXMtPnJ1bGVzLT5hZGRSdWxlKCRvcGVyYXRpb24sJG1lc3NhZ2UsJGFyZyk7cmV0dXJuJHRoaXM7fWZ1bmN0aW9uCmFkZENvbmRpdGlvbigkb3BlcmF0aW9uLCR2YWx1ZT1OVUxMKXtyZXR1cm4kdGhpcy0+cnVsZXMtPmFkZENvbmRpdGlvbigkb3BlcmF0aW9uLCR2YWx1ZSk7fWZ1bmN0aW9uCmFkZENvbmRpdGlvbk9uKElGb3JtQ29udHJvbCRjb250cm9sLCRvcGVyYXRpb24sJHZhbHVlPU5VTEwpe3JldHVybiR0aGlzLT5ydWxlcy0+YWRkQ29uZGl0aW9uT24oJGNvbnRyb2wsJG9wZXJhdGlvbiwkdmFsdWUpO31maW5hbApmdW5jdGlvbgpnZXRSdWxlcygpe3JldHVybiR0aGlzLT5ydWxlczt9ZmluYWwKZnVuY3Rpb24Kc2V0UmVxdWlyZWQoJG1lc3NhZ2U9TlVMTCl7JHRoaXMtPnJ1bGVzLT5hZGRSdWxlKCc6RmlsbGVkJywkbWVzc2FnZSk7cmV0dXJuJHRoaXM7fWZpbmFsCmZ1bmN0aW9uCmlzUmVxdWlyZWQoKXtyZXR1cm4hZW1wdHkoJHRoaXMtPm9wdGlvbnNbJ3JlcXVpcmVkJ10pO31mdW5jdGlvbgpub3RpZnlSdWxlKE5SdWxlJHJ1bGUpe2lmKGlzX3N0cmluZygkcnVsZS0+b3BlcmF0aW9uKSYmc3RyY2FzZWNtcCgkcnVsZS0+b3BlcmF0aW9uLCc6ZmlsbGVkJyk9PT0wKXskdGhpcy0+c2V0T3B0aW9uKCdyZXF1aXJlZCcsVFJVRSk7fX1zdGF0aWMKZnVuY3Rpb24KdmFsaWRhdGVFcXVhbChJRm9ybUNvbnRyb2wkY29udHJvbCwkYXJnKXskdmFsdWU9JGNvbnRyb2wtPmdldFZhbHVlKCk7Zm9yZWFjaCgoaXNfYXJyYXkoJHZhbHVlKT8kdmFsdWU6YXJyYXkoJHZhbHVlKSlhcyR2YWwpe2ZvcmVhY2goKGlzX2FycmF5KCRhcmcpPyRhcmc6YXJyYXkoJGFyZykpYXMkaXRlbSl7aWYoKHN0cmluZykkdmFsPT09KHN0cmluZykoJGl0ZW0KaW5zdGFuY2VvZgpJRm9ybUNvbnRyb2w/JGl0ZW0tPnZhbHVlOiRpdGVtKSl7cmV0dXJuClRSVUU7fX19cmV0dXJuCkZBTFNFO31zdGF0aWMKZnVuY3Rpb24KdmFsaWRhdGVGaWxsZWQoSUZvcm1Db250cm9sJGNvbnRyb2wpe3JldHVybihzdHJpbmcpJGNvbnRyb2wtPmdldFZhbHVlKCkhPT0nJzt9c3RhdGljCmZ1bmN0aW9uCnZhbGlkYXRlVmFsaWQoSUZvcm1Db250cm9sJGNvbnRyb2wpe3JldHVybiRjb250cm9sLT5ydWxlcy0+dmFsaWRhdGUoVFJVRSk7fWZ1bmN0aW9uCmFkZEVycm9yKCRtZXNzYWdlKXtpZighaW5fYXJyYXkoJG1lc3NhZ2UsJHRoaXMtPmVycm9ycyxUUlVFKSl7JHRoaXMtPmVycm9yc1tdPSRtZXNzYWdlO30kdGhpcy0+Z2V0Rm9ybSgpLT5hZGRFcnJvcigkbWVzc2FnZSk7fWZ1bmN0aW9uCmdldEVycm9ycygpe3JldHVybiR0aGlzLT5lcnJvcnM7fWZ1bmN0aW9uCmhhc0Vycm9ycygpe3JldHVybihib29sKSR0aGlzLT5lcnJvcnM7fWZ1bmN0aW9uCmNsZWFuRXJyb3JzKCl7JHRoaXMtPmVycm9ycz1hcnJheSgpO319Y2xhc3MKTkJ1dHRvbgpleHRlbmRzCk5Gb3JtQ29udHJvbHtmdW5jdGlvbgpfX2NvbnN0cnVjdCgkY2FwdGlvbj1OVUxMKXtwYXJlbnQ6Ol9fY29uc3RydWN0KCRjYXB0aW9uKTskdGhpcy0+Y29udHJvbC0+dHlwZT0nYnV0dG9uJzt9ZnVuY3Rpb24KZ2V0TGFiZWwoJGNhcHRpb249TlVMTCl7cmV0dXJuCk5VTEw7fWZ1bmN0aW9uCmdldENvbnRyb2woJGNhcHRpb249TlVMTCl7JGNvbnRyb2w9cGFyZW50OjpnZXRDb250cm9sKCk7JGNvbnRyb2wtPnZhbHVlPSR0aGlzLT50cmFuc2xhdGUoJGNhcHRpb249PT1OVUxMPyR0aGlzLT5jYXB0aW9uOiRjYXB0aW9uKTtyZXR1cm4kY29udHJvbDt9fWNsYXNzCk5DaGVja2JveApleHRlbmRzCk5Gb3JtQ29udHJvbHtmdW5jdGlvbgpfX2NvbnN0cnVjdCgkbGFiZWw9TlVMTCl7cGFyZW50OjpfX2NvbnN0cnVjdCgkbGFiZWwpOyR0aGlzLT5jb250cm9sLT50eXBlPSdjaGVja2JveCc7JHRoaXMtPnZhbHVlPUZBTFNFO31mdW5jdGlvbgpzZXRWYWx1ZSgkdmFsdWUpeyR0aGlzLT52YWx1ZT1pc19zY2FsYXIoJHZhbHVlKT8oYm9vbCkkdmFsdWU6RkFMU0U7cmV0dXJuJHRoaXM7fWZ1bmN0aW9uCmdldENvbnRyb2woKXtyZXR1cm4KcGFyZW50OjpnZXRDb250cm9sKCktPmNoZWNrZWQoJHRoaXMtPnZhbHVlKTt9fWNsYXNzCk5GaWxlVXBsb2FkCmV4dGVuZHMKTkZvcm1Db250cm9se2Z1bmN0aW9uCl9fY29uc3RydWN0KCRsYWJlbD1OVUxMKXtwYXJlbnQ6Ol9fY29uc3RydWN0KCRsYWJlbCk7JHRoaXMtPmNvbnRyb2wtPnR5cGU9J2ZpbGUnO31wcm90ZWN0ZWQKZnVuY3Rpb24KYXR0YWNoZWQoJGZvcm0pe2lmKCRmb3JtCmluc3RhbmNlb2YKTkZvcm0pe2lmKCRmb3JtLT5nZXRNZXRob2QoKSE9PU5Gb3JtOjpQT1NUKXt0aHJvdwpuZXcKSW52YWxpZFN0YXRlRXhjZXB0aW9uKCdGaWxlIHVwbG9hZCByZXF1aXJlcyBtZXRob2QgUE9TVC4nKTt9JGZvcm0tPmdldEVsZW1lbnRQcm90b3R5cGUoKS0+ZW5jdHlwZT0nbXVsdGlwYXJ0L2Zvcm0tZGF0YSc7fXBhcmVudDo6YXR0YWNoZWQoJGZvcm0pO31mdW5jdGlvbgpzZXRWYWx1ZSgkdmFsdWUpe2lmKGlzX2FycmF5KCR2YWx1ZSkpeyR0aGlzLT52YWx1ZT1uZXcKTkh0dHBVcGxvYWRlZEZpbGUoJHZhbHVlKTt9ZWxzZWlmKCR2YWx1ZQppbnN0YW5jZW9mCk5IdHRwVXBsb2FkZWRGaWxlKXskdGhpcy0+dmFsdWU9JHZhbHVlO31lbHNleyR0aGlzLT52YWx1ZT1uZXcKTkh0dHBVcGxvYWRlZEZpbGUoTlVMTCk7fXJldHVybiR0aGlzO31zdGF0aWMKZnVuY3Rpb24KdmFsaWRhdGVGaWxsZWQoSUZvcm1Db250cm9sJGNvbnRyb2wpeyRmaWxlPSRjb250cm9sLT5nZXRWYWx1ZSgpO3JldHVybiRmaWxlCmluc3RhbmNlb2YKTkh0dHBVcGxvYWRlZEZpbGUmJiRmaWxlLT5pc09LKCk7fXN0YXRpYwpmdW5jdGlvbgp2YWxpZGF0ZUZpbGVTaXplKE5GaWxlVXBsb2FkJGNvbnRyb2wsJGxpbWl0KXskZmlsZT0kY29udHJvbC0+Z2V0VmFsdWUoKTtyZXR1cm4kZmlsZQppbnN0YW5jZW9mCk5IdHRwVXBsb2FkZWRGaWxlJiYkZmlsZS0+Z2V0U2l6ZSgpPD0kbGltaXQ7fXN0YXRpYwpmdW5jdGlvbgp2YWxpZGF0ZU1pbWVUeXBlKE5GaWxlVXBsb2FkJGNvbnRyb2wsJG1pbWVUeXBlKXskZmlsZT0kY29udHJvbC0+Z2V0VmFsdWUoKTtpZigkZmlsZQppbnN0YW5jZW9mCk5IdHRwVXBsb2FkZWRGaWxlKXskdHlwZT1zdHJ0b2xvd2VyKCRmaWxlLT5nZXRDb250ZW50VHlwZSgpKTskbWltZVR5cGVzPWlzX2FycmF5KCRtaW1lVHlwZSk/JG1pbWVUeXBlOmV4cGxvZGUoJywnLCRtaW1lVHlwZSk7aWYoaW5fYXJyYXkoJHR5cGUsJG1pbWVUeXBlcyxUUlVFKSl7cmV0dXJuClRSVUU7fWlmKGluX2FycmF5KHByZWdfcmVwbGFjZSgnIy8uKiMnLCcvKicsJHR5cGUpLCRtaW1lVHlwZXMsVFJVRSkpe3JldHVybgpUUlVFO319cmV0dXJuCkZBTFNFO319Y2xhc3MKTkhpZGRlbkZpZWxkCmV4dGVuZHMKTkZvcm1Db250cm9se3ByaXZhdGUkZm9yY2VkVmFsdWU7ZnVuY3Rpb24KX19jb25zdHJ1Y3QoJGZvcmNlZFZhbHVlPU5VTEwpe3BhcmVudDo6X19jb25zdHJ1Y3QoKTskdGhpcy0+Y29udHJvbC0+dHlwZT0naGlkZGVuJzskdGhpcy0+dmFsdWU9KHN0cmluZykkZm9yY2VkVmFsdWU7JHRoaXMtPmZvcmNlZFZhbHVlPSRmb3JjZWRWYWx1ZTt9ZnVuY3Rpb24KZ2V0TGFiZWwoJGNhcHRpb249TlVMTCl7cmV0dXJuCk5VTEw7fWZ1bmN0aW9uCnNldFZhbHVlKCR2YWx1ZSl7JHRoaXMtPnZhbHVlPWlzX3NjYWxhcigkdmFsdWUpPyhzdHJpbmcpJHZhbHVlOicnO3JldHVybiR0aGlzO31mdW5jdGlvbgpnZXRDb250cm9sKCl7cmV0dXJuCnBhcmVudDo6Z2V0Q29udHJvbCgpLT52YWx1ZSgkdGhpcy0+Zm9yY2VkVmFsdWU9PT1OVUxMPyR0aGlzLT52YWx1ZTokdGhpcy0+Zm9yY2VkVmFsdWUpO319Y2xhc3MKTlN1Ym1pdEJ1dHRvbgpleHRlbmRzCk5CdXR0b24KaW1wbGVtZW50cwpJU3VibWl0dGVyQ29udHJvbHtwdWJsaWMkb25DbGljaztwdWJsaWMkb25JbnZhbGlkQ2xpY2s7cHJpdmF0ZSR2YWxpZGF0aW9uU2NvcGU9VFJVRTtmdW5jdGlvbgpfX2NvbnN0cnVjdCgkY2FwdGlvbj1OVUxMKXtwYXJlbnQ6Ol9fY29uc3RydWN0KCRjYXB0aW9uKTskdGhpcy0+Y29udHJvbC0+dHlwZT0nc3VibWl0Jzt9ZnVuY3Rpb24Kc2V0VmFsdWUoJHZhbHVlKXskdGhpcy0+dmFsdWU9aXNfc2NhbGFyKCR2YWx1ZSkmJihib29sKSR2YWx1ZTskZm9ybT0kdGhpcy0+Z2V0Rm9ybSgpO2lmKCR0aGlzLT52YWx1ZXx8IWlzX29iamVjdCgkZm9ybS0+aXNTdWJtaXR0ZWQoKSkpeyR0aGlzLT52YWx1ZT1UUlVFOyRmb3JtLT5zZXRTdWJtaXR0ZWRCeSgkdGhpcyk7fXJldHVybiR0aGlzO31mdW5jdGlvbgppc1N1Ym1pdHRlZEJ5KCl7cmV0dXJuJHRoaXMtPmdldEZvcm0oKS0+aXNTdWJtaXR0ZWQoKT09PSR0aGlzO31mdW5jdGlvbgpzZXRWYWxpZGF0aW9uU2NvcGUoJHNjb3BlKXskdGhpcy0+dmFsaWRhdGlvblNjb3BlPShib29sKSRzY29wZTtyZXR1cm4kdGhpczt9ZmluYWwKZnVuY3Rpb24KZ2V0VmFsaWRhdGlvblNjb3BlKCl7cmV0dXJuJHRoaXMtPnZhbGlkYXRpb25TY29wZTt9ZnVuY3Rpb24KY2xpY2soKXskdGhpcy0+b25DbGljaygkdGhpcyk7fXN0YXRpYwpmdW5jdGlvbgp2YWxpZGF0ZVN1Ym1pdHRlZChJU3VibWl0dGVyQ29udHJvbCRjb250cm9sKXtyZXR1cm4kY29udHJvbC0+aXNTdWJtaXR0ZWRCeSgpO319Y2xhc3MKTkltYWdlQnV0dG9uCmV4dGVuZHMKTlN1Ym1pdEJ1dHRvbntmdW5jdGlvbgpfX2NvbnN0cnVjdCgkc3JjPU5VTEwsJGFsdD1OVUxMKXtwYXJlbnQ6Ol9fY29uc3RydWN0KCk7JHRoaXMtPmNvbnRyb2wtPnR5cGU9J2ltYWdlJzskdGhpcy0+Y29udHJvbC0+c3JjPSRzcmM7JHRoaXMtPmNvbnRyb2wtPmFsdD0kYWx0O31mdW5jdGlvbgpnZXRIdG1sTmFtZSgpeyRuYW1lPXBhcmVudDo6Z2V0SHRtbE5hbWUoKTtyZXR1cm4Kc3RycG9zKCRuYW1lLCdbJyk9PT1GQUxTRT8kbmFtZTokbmFtZS4nW10nO31mdW5jdGlvbgpsb2FkSHR0cERhdGEoKXskcGF0aD0kdGhpcy0+Z2V0SHRtbE5hbWUoKTskcGF0aD1leHBsb2RlKCdbJyxzdHJ0cihzdHJfcmVwbGFjZSgnXScsJycsc3RycG9zKCRwYXRoLCdbJyk9PT1GQUxTRT8kcGF0aC4nLngnOnN1YnN0cigkcGF0aCwwLC0yKSksJy4nLCdfJykpOyR0aGlzLT5zZXRWYWx1ZShOQXJyYXlUb29sczo6Z2V0KCR0aGlzLT5nZXRGb3JtKCktPmdldEh0dHBEYXRhKCksJHBhdGgpIT09TlVMTCk7fX1jbGFzcwpOU2VsZWN0Qm94CmV4dGVuZHMKTkZvcm1Db250cm9se3ByaXZhdGUkaXRlbXM9YXJyYXkoKTtwcm90ZWN0ZWQkYWxsb3dlZD1hcnJheSgpO3ByaXZhdGUkc2tpcEZpcnN0PUZBTFNFO3ByaXZhdGUkdXNlS2V5cz1UUlVFO2Z1bmN0aW9uCl9fY29uc3RydWN0KCRsYWJlbD1OVUxMLGFycmF5JGl0ZW1zPU5VTEwsJHNpemU9TlVMTCl7cGFyZW50OjpfX2NvbnN0cnVjdCgkbGFiZWwpOyR0aGlzLT5jb250cm9sLT5zZXROYW1lKCdzZWxlY3QnKTskdGhpcy0+Y29udHJvbC0+c2l6ZT0kc2l6ZT4xPyhpbnQpJHNpemU6TlVMTDskdGhpcy0+Y29udHJvbC0+b25mb2N1cz0ndGhpcy5vbm1vdXNld2hlZWw9ZnVuY3Rpb24oKXtyZXR1cm4gZmFsc2V9JzskdGhpcy0+bGFiZWwtPm9uY2xpY2s9J2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuaHRtbEZvcikuZm9jdXMoKTtyZXR1cm4gZmFsc2UnO2lmKCRpdGVtcyE9PU5VTEwpeyR0aGlzLT5zZXRJdGVtcygkaXRlbXMpO319ZnVuY3Rpb24KZ2V0VmFsdWUoKXskYWxsb3dlZD0kdGhpcy0+YWxsb3dlZDtpZigkdGhpcy0+c2tpcEZpcnN0KXskYWxsb3dlZD1hcnJheV9zbGljZSgkYWxsb3dlZCwxLGNvdW50KCRhbGxvd2VkKSxUUlVFKTt9cmV0dXJuCmlzX3NjYWxhcigkdGhpcy0+dmFsdWUpJiZpc3NldCgkYWxsb3dlZFskdGhpcy0+dmFsdWVdKT8kdGhpcy0+dmFsdWU6TlVMTDt9ZnVuY3Rpb24KZ2V0UmF3VmFsdWUoKXtyZXR1cm4KaXNfc2NhbGFyKCR0aGlzLT52YWx1ZSk/JHRoaXMtPnZhbHVlOk5VTEw7fWZ1bmN0aW9uCnNraXBGaXJzdCgkaXRlbT1OVUxMKXtpZihpc19ib29sKCRpdGVtKSl7JHRoaXMtPnNraXBGaXJzdD0kaXRlbTt9ZWxzZXskdGhpcy0+c2tpcEZpcnN0PVRSVUU7aWYoJGl0ZW0hPT1OVUxMKXskdGhpcy0+aXRlbXM9YXJyYXkoJyc9PiRpdGVtKSskdGhpcy0+aXRlbXM7JHRoaXMtPmFsbG93ZWQ9YXJyYXkoJyc9PicnKSskdGhpcy0+YWxsb3dlZDt9fXJldHVybiR0aGlzO31maW5hbApmdW5jdGlvbgppc0ZpcnN0U2tpcHBlZCgpe3JldHVybiR0aGlzLT5za2lwRmlyc3Q7fWZpbmFsCmZ1bmN0aW9uCmFyZUtleXNVc2VkKCl7cmV0dXJuJHRoaXMtPnVzZUtleXM7fWZ1bmN0aW9uCnNldEl0ZW1zKGFycmF5JGl0ZW1zLCR1c2VLZXlzPVRSVUUpeyR0aGlzLT5pdGVtcz0kaXRlbXM7JHRoaXMtPmFsbG93ZWQ9YXJyYXkoKTskdGhpcy0+dXNlS2V5cz0oYm9vbCkkdXNlS2V5cztmb3JlYWNoKCRpdGVtcwphcyRrZXk9PiR2YWx1ZSl7aWYoIWlzX2FycmF5KCR2YWx1ZSkpeyR2YWx1ZT1hcnJheSgka2V5PT4kdmFsdWUpO31mb3JlYWNoKCR2YWx1ZQphcyRrZXkyPT4kdmFsdWUyKXtpZighJHRoaXMtPnVzZUtleXMpe2lmKCFpc19zY2FsYXIoJHZhbHVlMikpe3Rocm93Cm5ldwpJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIkFsbCBpdGVtcyBtdXN0IGJlIHNjYWxhcnMuIik7fSRrZXkyPSR2YWx1ZTI7fWlmKGlzc2V0KCR0aGlzLT5hbGxvd2VkWyRrZXkyXSkpe3Rocm93Cm5ldwpJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIkl0ZW1zIGNvbnRhaW4gZHVwbGljYXRpb24gZm9yIGtleSAnJGtleTInLiIpO30kdGhpcy0+YWxsb3dlZFska2V5Ml09JHZhbHVlMjt9fXJldHVybiR0aGlzO31maW5hbApmdW5jdGlvbgpnZXRJdGVtcygpe3JldHVybiR0aGlzLT5pdGVtczt9ZnVuY3Rpb24KZ2V0U2VsZWN0ZWRJdGVtKCl7aWYoISR0aGlzLT51c2VLZXlzKXtyZXR1cm4kdGhpcy0+Z2V0VmFsdWUoKTt9ZWxzZXskdmFsdWU9JHRoaXMtPmdldFZhbHVlKCk7cmV0dXJuJHZhbHVlPT09TlVMTD9OVUxMOiR0aGlzLT5hbGxvd2VkWyR2YWx1ZV07fX1mdW5jdGlvbgpnZXRDb250cm9sKCl7JGNvbnRyb2w9cGFyZW50OjpnZXRDb250cm9sKCk7JHNlbGVjdGVkPSR0aGlzLT5nZXRWYWx1ZSgpOyRzZWxlY3RlZD1pc19hcnJheSgkc2VsZWN0ZWQpP2FycmF5X2ZsaXAoJHNlbGVjdGVkKTphcnJheSgkc2VsZWN0ZWQ9PlRSVUUpOyRvcHRpb249Tkh0bWw6OmVsKCdvcHRpb24nKTtmb3JlYWNoKCR0aGlzLT5pdGVtcwphcyRrZXk9PiR2YWx1ZSl7aWYoIWlzX2FycmF5KCR2YWx1ZSkpeyR2YWx1ZT1hcnJheSgka2V5PT4kdmFsdWUpOyRkZXN0PSRjb250cm9sO31lbHNleyRkZXN0PSRjb250cm9sLT5jcmVhdGUoJ29wdGdyb3VwJyktPmxhYmVsKCRrZXkpO31mb3JlYWNoKCR2YWx1ZQphcyRrZXkyPT4kdmFsdWUyKXtpZigkdmFsdWUyCmluc3RhbmNlb2YKTkh0bWwpeyRkZXN0LT5hZGQoKHN0cmluZykkdmFsdWUyLT5zZWxlY3RlZChpc3NldCgkc2VsZWN0ZWRbJGtleTJdKSkpO31lbHNlaWYoJHRoaXMtPnVzZUtleXMpeyRkZXN0LT5hZGQoKHN0cmluZykkb3B0aW9uLT52YWx1ZSgka2V5MiktPnNlbGVjdGVkKGlzc2V0KCRzZWxlY3RlZFska2V5Ml0pKS0+c2V0VGV4dCgkdGhpcy0+dHJhbnNsYXRlKCR2YWx1ZTIpKSk7fWVsc2V7JGRlc3QtPmFkZCgoc3RyaW5nKSRvcHRpb24tPnNlbGVjdGVkKGlzc2V0KCRzZWxlY3RlZFskdmFsdWUyXSkpLT5zZXRUZXh0KCR0aGlzLT50cmFuc2xhdGUoJHZhbHVlMikpKTt9fX1yZXR1cm4kY29udHJvbDt9c3RhdGljCmZ1bmN0aW9uCnZhbGlkYXRlRmlsbGVkKElGb3JtQ29udHJvbCRjb250cm9sKXskdmFsdWU9JGNvbnRyb2wtPmdldFZhbHVlKCk7cmV0dXJuCmlzX2FycmF5KCR2YWx1ZSk/Y291bnQoJHZhbHVlKT4wOiR2YWx1ZSE9PU5VTEw7fX1jbGFzcwpOTXVsdGlTZWxlY3RCb3gKZXh0ZW5kcwpOU2VsZWN0Qm94e2Z1bmN0aW9uCmdldFZhbHVlKCl7JGFsbG93ZWQ9YXJyYXlfa2V5cygkdGhpcy0+YWxsb3dlZCk7aWYoJHRoaXMtPmlzRmlyc3RTa2lwcGVkKCkpe3Vuc2V0KCRhbGxvd2VkWzBdKTt9cmV0dXJuCmFycmF5X2ludGVyc2VjdCgkdGhpcy0+Z2V0UmF3VmFsdWUoKSwkYWxsb3dlZCk7fWZ1bmN0aW9uCmdldFJhd1ZhbHVlKCl7aWYoaXNfc2NhbGFyKCR0aGlzLT52YWx1ZSkpeyR2YWx1ZT1hcnJheSgkdGhpcy0+dmFsdWUpO31lbHNlaWYoIWlzX2FycmF5KCR0aGlzLT52YWx1ZSkpeyR2YWx1ZT1hcnJheSgpO31lbHNleyR2YWx1ZT0kdGhpcy0+dmFsdWU7fSRyZXM9YXJyYXkoKTtmb3JlYWNoKCR2YWx1ZQphcyR2YWwpe2lmKGlzX3NjYWxhcigkdmFsKSl7JHJlc1tdPSR2YWw7fX1yZXR1cm4kcmVzO31mdW5jdGlvbgpnZXRTZWxlY3RlZEl0ZW0oKXtpZighJHRoaXMtPmFyZUtleXNVc2VkKCkpe3JldHVybiR0aGlzLT5nZXRWYWx1ZSgpO31lbHNleyRyZXM9YXJyYXkoKTtmb3JlYWNoKCR0aGlzLT5nZXRWYWx1ZSgpYXMkdmFsdWUpeyRyZXNbJHZhbHVlXT0kdGhpcy0+YWxsb3dlZFskdmFsdWVdO31yZXR1cm4kcmVzO319ZnVuY3Rpb24KZ2V0SHRtbE5hbWUoKXtyZXR1cm4KcGFyZW50OjpnZXRIdG1sTmFtZSgpLidbXSc7fWZ1bmN0aW9uCmdldENvbnRyb2woKXskY29udHJvbD1wYXJlbnQ6OmdldENvbnRyb2woKTskY29udHJvbC0+bXVsdGlwbGU9VFJVRTtyZXR1cm4kY29udHJvbDt9fWNsYXNzCk5SYWRpb0xpc3QKZXh0ZW5kcwpORm9ybUNvbnRyb2x7cHJvdGVjdGVkJHNlcGFyYXRvcjtwcm90ZWN0ZWQkY29udGFpbmVyO3Byb3RlY3RlZCRpdGVtcz1hcnJheSgpO2Z1bmN0aW9uCl9fY29uc3RydWN0KCRsYWJlbD1OVUxMLGFycmF5JGl0ZW1zPU5VTEwpe3BhcmVudDo6X19jb25zdHJ1Y3QoJGxhYmVsKTskdGhpcy0+Y29udHJvbC0+dHlwZT0ncmFkaW8nOyR0aGlzLT5jb250YWluZXI9Tkh0bWw6OmVsKCk7JHRoaXMtPnNlcGFyYXRvcj1OSHRtbDo6ZWwoJ2JyJyk7aWYoJGl0ZW1zIT09TlVMTCkkdGhpcy0+c2V0SXRlbXMoJGl0ZW1zKTt9ZnVuY3Rpb24KZ2V0VmFsdWUoJHJhdz1GQUxTRSl7cmV0dXJuCmlzX3NjYWxhcigkdGhpcy0+dmFsdWUpJiYoJHJhd3x8aXNzZXQoJHRoaXMtPml0ZW1zWyR0aGlzLT52YWx1ZV0pKT8kdGhpcy0+dmFsdWU6TlVMTDt9ZnVuY3Rpb24Kc2V0SXRlbXMoYXJyYXkkaXRlbXMpeyR0aGlzLT5pdGVtcz0kaXRlbXM7cmV0dXJuJHRoaXM7fWZpbmFsCmZ1bmN0aW9uCmdldEl0ZW1zKCl7cmV0dXJuJHRoaXMtPml0ZW1zO31maW5hbApmdW5jdGlvbgpnZXRTZXBhcmF0b3JQcm90b3R5cGUoKXtyZXR1cm4kdGhpcy0+c2VwYXJhdG9yO31maW5hbApmdW5jdGlvbgpnZXRDb250YWluZXJQcm90b3R5cGUoKXtyZXR1cm4kdGhpcy0+Y29udGFpbmVyO31mdW5jdGlvbgpnZXRDb250cm9sKCRrZXk9TlVMTCl7aWYoJGtleT09PU5VTEwpeyRjb250YWluZXI9Y2xvbmUkdGhpcy0+Y29udGFpbmVyOyRzZXBhcmF0b3I9KHN0cmluZykkdGhpcy0+c2VwYXJhdG9yO31lbHNlaWYoIWlzc2V0KCR0aGlzLT5pdGVtc1ska2V5XSkpe3JldHVybgpOVUxMO30kY29udHJvbD1wYXJlbnQ6OmdldENvbnRyb2woKTskaWQ9JGNvbnRyb2wtPmlkOyRjb3VudGVyPS0xOyR2YWx1ZT0kdGhpcy0+dmFsdWU9PT1OVUxMP05VTEw6KHN0cmluZykkdGhpcy0+Z2V0VmFsdWUoKTskbGFiZWw9Tkh0bWw6OmVsKCdsYWJlbCcpO2ZvcmVhY2goJHRoaXMtPml0ZW1zCmFzJGs9PiR2YWwpeyRjb3VudGVyKys7aWYoJGtleSE9PU5VTEwmJiRrZXkhPSRrKWNvbnRpbnVlOyRjb250cm9sLT5pZD0kbGFiZWwtPmZvcj0kaWQuJy0nLiRjb3VudGVyOyRjb250cm9sLT5jaGVja2VkPShzdHJpbmcpJGs9PT0kdmFsdWU7JGNvbnRyb2wtPnZhbHVlPSRrO2lmKCR2YWwKaW5zdGFuY2VvZgpOSHRtbCl7JGxhYmVsLT5zZXRIdG1sKCR2YWwpO31lbHNleyRsYWJlbC0+c2V0VGV4dCgkdGhpcy0+dHJhbnNsYXRlKCR2YWwpKTt9aWYoJGtleSE9PU5VTEwpe3JldHVybihzdHJpbmcpJGNvbnRyb2wuKHN0cmluZykkbGFiZWw7fSRjb250YWluZXItPmFkZCgoc3RyaW5nKSRjb250cm9sLihzdHJpbmcpJGxhYmVsLiRzZXBhcmF0b3IpO31yZXR1cm4kY29udGFpbmVyO31mdW5jdGlvbgpnZXRMYWJlbCgkY2FwdGlvbj1OVUxMKXskbGFiZWw9cGFyZW50OjpnZXRMYWJlbCgkY2FwdGlvbik7JGxhYmVsLT5mb3I9TlVMTDtyZXR1cm4kbGFiZWw7fXN0YXRpYwpmdW5jdGlvbgp2YWxpZGF0ZUZpbGxlZChJRm9ybUNvbnRyb2wkY29udHJvbCl7cmV0dXJuJGNvbnRyb2wtPmdldFZhbHVlKCkhPT1OVUxMO319YWJzdHJhY3QKY2xhc3MKTlRleHRCYXNlCmV4dGVuZHMKTkZvcm1Db250cm9se3Byb3RlY3RlZCRlbXB0eVZhbHVlPScnO3Byb3RlY3RlZCRmaWx0ZXJzPWFycmF5KCk7ZnVuY3Rpb24Kc2V0VmFsdWUoJHZhbHVlKXskdGhpcy0+dmFsdWU9aXNfc2NhbGFyKCR2YWx1ZSk/KHN0cmluZykkdmFsdWU6Jyc7cmV0dXJuJHRoaXM7fWZ1bmN0aW9uCmdldFZhbHVlKCl7JHZhbHVlPSR0aGlzLT52YWx1ZTtmb3JlYWNoKCR0aGlzLT5maWx0ZXJzCmFzJGZpbHRlcil7JHZhbHVlPShzdHJpbmcpJGZpbHRlci0+aW52b2tlKCR2YWx1ZSk7fXJldHVybiR2YWx1ZT09PSR0aGlzLT50cmFuc2xhdGUoJHRoaXMtPmVtcHR5VmFsdWUpPycnOiR2YWx1ZTt9ZnVuY3Rpb24Kc2V0RW1wdHlWYWx1ZSgkdmFsdWUpeyR0aGlzLT5lbXB0eVZhbHVlPSR2YWx1ZTtyZXR1cm4kdGhpczt9ZmluYWwKZnVuY3Rpb24KZ2V0RW1wdHlWYWx1ZSgpe3JldHVybiR0aGlzLT5lbXB0eVZhbHVlO31mdW5jdGlvbgphZGRGaWx0ZXIoJGZpbHRlcil7JHRoaXMtPmZpbHRlcnNbXT1jYWxsYmFjaygkZmlsdGVyKTtyZXR1cm4kdGhpczt9ZnVuY3Rpb24Kbm90aWZ5UnVsZShOUnVsZSRydWxlKXtpZihpc19zdHJpbmcoJHJ1bGUtPm9wZXJhdGlvbikmJnN0cmNhc2VjbXAoJHJ1bGUtPm9wZXJhdGlvbiwnOmZsb2F0Jyk9PT0wKXskdGhpcy0+YWRkRmlsdGVyKGFycmF5KF9fQ0xBU1NfXywnZmlsdGVyRmxvYXQnKSk7fXBhcmVudDo6bm90aWZ5UnVsZSgkcnVsZSk7fXN0YXRpYwpmdW5jdGlvbgp2YWxpZGF0ZU1pbkxlbmd0aChOVGV4dEJhc2UkY29udHJvbCwkbGVuZ3RoKXtyZXR1cm4KaWNvbnZfc3RybGVuKCRjb250cm9sLT5nZXRWYWx1ZSgpLCdVVEYtOCcpPj0kbGVuZ3RoO31zdGF0aWMKZnVuY3Rpb24KdmFsaWRhdGVNYXhMZW5ndGgoTlRleHRCYXNlJGNvbnRyb2wsJGxlbmd0aCl7cmV0dXJuCmljb252X3N0cmxlbigkY29udHJvbC0+Z2V0VmFsdWUoKSwnVVRGLTgnKTw9JGxlbmd0aDt9c3RhdGljCmZ1bmN0aW9uCnZhbGlkYXRlTGVuZ3RoKE5UZXh0QmFzZSRjb250cm9sLCRyYW5nZSl7aWYoIWlzX2FycmF5KCRyYW5nZSkpeyRyYW5nZT1hcnJheSgkcmFuZ2UsJHJhbmdlKTt9JGxlbj1pY29udl9zdHJsZW4oJGNvbnRyb2wtPmdldFZhbHVlKCksJ1VURi04Jyk7cmV0dXJuKCRyYW5nZVswXT09PU5VTEx8fCRsZW4+PSRyYW5nZVswXSkmJigkcmFuZ2VbMV09PT1OVUxMfHwkbGVuPD0kcmFuZ2VbMV0pO31zdGF0aWMKZnVuY3Rpb24KdmFsaWRhdGVFbWFpbChOVGV4dEJhc2UkY29udHJvbCl7JGF0b209IlstYS16MC05ISMkJSYnKisvPT9eX2B7fH1+XSI7JGxvY2FsUGFydD0iKFwiKFsgIVxceDIzLVxceDVCXFx4NUQtXFx4N0VdKnxcXFxcWyAtfl0pK1wifCRhdG9tKyhcXC4kYXRvbSspKikiOyRjaGFycz0iYS16MC05XHg4MC1ceEZGIjskZG9tYWluPSJbJGNoYXJzXShbLSRjaGFyc117MCw2MX1bJGNoYXJzXSkiO3JldHVybihib29sKXByZWdfbWF0Y2goIiheJGxvY2FsUGFydEAoJGRvbWFpbj9cXC4pK1stJGNoYXJzXXsyLDE5fVxceilpIiwkY29udHJvbC0+Z2V0VmFsdWUoKSk7fXN0YXRpYwpmdW5jdGlvbgp2YWxpZGF0ZVVybChOVGV4dEJhc2UkY29udHJvbCl7cmV0dXJuKGJvb2wpcHJlZ19tYXRjaCgnL14uK1wuW2Etel17Miw2fShcXC8uKik/JC9pJywkY29udHJvbC0+Z2V0VmFsdWUoKSk7fXN0YXRpYwpmdW5jdGlvbgp2YWxpZGF0ZVJlZ2V4cChOVGV4dEJhc2UkY29udHJvbCwkcmVnZXhwKXtyZXR1cm4oYm9vbClwcmVnX21hdGNoKCRyZWdleHAsJGNvbnRyb2wtPmdldFZhbHVlKCkpO31zdGF0aWMKZnVuY3Rpb24KdmFsaWRhdGVJbnRlZ2VyKE5UZXh0QmFzZSRjb250cm9sKXtyZXR1cm4oYm9vbClwcmVnX21hdGNoKCcvXi0/WzAtOV0rJC8nLCRjb250cm9sLT5nZXRWYWx1ZSgpKTt9c3RhdGljCmZ1bmN0aW9uCnZhbGlkYXRlRmxvYXQoTlRleHRCYXNlJGNvbnRyb2wpe3JldHVybihib29sKXByZWdfbWF0Y2goJy9eLT9bMC05XSpbLixdP1swLTldKyQvJywkY29udHJvbC0+Z2V0VmFsdWUoKSk7fXN0YXRpYwpmdW5jdGlvbgp2YWxpZGF0ZVJhbmdlKE5UZXh0QmFzZSRjb250cm9sLCRyYW5nZSl7cmV0dXJuKCRyYW5nZVswXT09PU5VTEx8fCRjb250cm9sLT5nZXRWYWx1ZSgpPj0kcmFuZ2VbMF0pJiYoJHJhbmdlWzFdPT09TlVMTHx8JGNvbnRyb2wtPmdldFZhbHVlKCk8PSRyYW5nZVsxXSk7fXN0YXRpYwpmdW5jdGlvbgpmaWx0ZXJGbG9hdCgkcyl7cmV0dXJuCnN0cl9yZXBsYWNlKGFycmF5KCcgJywnLCcpLGFycmF5KCcnLCcuJyksJHMpO319Y2xhc3MKTlRleHRBcmVhCmV4dGVuZHMKTlRleHRCYXNle2Z1bmN0aW9uCl9fY29uc3RydWN0KCRsYWJlbD1OVUxMLCRjb2xzPU5VTEwsJHJvd3M9TlVMTCl7cGFyZW50OjpfX2NvbnN0cnVjdCgkbGFiZWwpOyR0aGlzLT5jb250cm9sLT5zZXROYW1lKCd0ZXh0YXJlYScpOyR0aGlzLT5jb250cm9sLT5jb2xzPSRjb2xzOyR0aGlzLT5jb250cm9sLT5yb3dzPSRyb3dzOyR0aGlzLT52YWx1ZT0nJzt9ZnVuY3Rpb24KZ2V0Q29udHJvbCgpeyRjb250cm9sPXBhcmVudDo6Z2V0Q29udHJvbCgpOyRjb250cm9sLT5zZXRUZXh0KCR0aGlzLT5nZXRWYWx1ZSgpPT09Jyc/JHRoaXMtPnRyYW5zbGF0ZSgkdGhpcy0+ZW1wdHlWYWx1ZSk6JHRoaXMtPnZhbHVlKTtyZXR1cm4kY29udHJvbDt9fWNsYXNzCk5UZXh0SW5wdXQKZXh0ZW5kcwpOVGV4dEJhc2V7ZnVuY3Rpb24KX19jb25zdHJ1Y3QoJGxhYmVsPU5VTEwsJGNvbHM9TlVMTCwkbWF4TGVuZ3RoPU5VTEwpe3BhcmVudDo6X19jb25zdHJ1Y3QoJGxhYmVsKTskdGhpcy0+Y29udHJvbC0+dHlwZT0ndGV4dCc7JHRoaXMtPmNvbnRyb2wtPnNpemU9JGNvbHM7JHRoaXMtPmNvbnRyb2wtPm1heGxlbmd0aD0kbWF4TGVuZ3RoOyR0aGlzLT5maWx0ZXJzW109Y2FsbGJhY2soJ05TdHJpbmcnLCd0cmltJyk7JHRoaXMtPmZpbHRlcnNbXT1jYWxsYmFjaygkdGhpcywnY2hlY2tNYXhMZW5ndGgnKTskdGhpcy0+dmFsdWU9Jyc7fWZ1bmN0aW9uCmNoZWNrTWF4TGVuZ3RoKCR2YWx1ZSl7aWYoJHRoaXMtPmNvbnRyb2wtPm1heGxlbmd0aCYmaWNvbnZfc3RybGVuKCR2YWx1ZSwnVVRGLTgnKT4kdGhpcy0+Y29udHJvbC0+bWF4bGVuZ3RoKXskdmFsdWU9aWNvbnZfc3Vic3RyKCR2YWx1ZSwwLCR0aGlzLT5jb250cm9sLT5tYXhsZW5ndGgsJ1VURi04Jyk7fXJldHVybiR2YWx1ZTt9ZnVuY3Rpb24Kc2V0UGFzc3dvcmRNb2RlKCRtb2RlPVRSVUUpeyR0aGlzLT5jb250cm9sLT50eXBlPSRtb2RlPydwYXNzd29yZCc6J3RleHQnO3JldHVybiR0aGlzO31mdW5jdGlvbgpnZXRDb250cm9sKCl7JGNvbnRyb2w9cGFyZW50OjpnZXRDb250cm9sKCk7aWYoJHRoaXMtPmNvbnRyb2wtPnR5cGUhPT0ncGFzc3dvcmQnKXskY29udHJvbC0+dmFsdWU9JHRoaXMtPmdldFZhbHVlKCk9PT0nJz8kdGhpcy0+dHJhbnNsYXRlKCR0aGlzLT5lbXB0eVZhbHVlKTokdGhpcy0+dmFsdWU7fXJldHVybiRjb250cm9sO31mdW5jdGlvbgpub3RpZnlSdWxlKE5SdWxlJHJ1bGUpe2lmKGlzX3N0cmluZygkcnVsZS0+b3BlcmF0aW9uKSYmc3RyY2FzZWNtcCgkcnVsZS0+b3BlcmF0aW9uLCc6bGVuZ3RoJyk9PT0wJiYhJHJ1bGUtPmlzTmVnYXRpdmUpeyR0aGlzLT5jb250cm9sLT5tYXhsZW5ndGg9aXNfYXJyYXkoJHJ1bGUtPmFyZyk/JHJ1bGUtPmFyZ1sxXTokcnVsZS0+YXJnO31lbHNlaWYoaXNfc3RyaW5nKCRydWxlLT5vcGVyYXRpb24pJiZzdHJjYXNlY21wKCRydWxlLT5vcGVyYXRpb24sJzptYXhMZW5ndGgnKT09PTAmJiEkcnVsZS0+aXNOZWdhdGl2ZSl7JHRoaXMtPmNvbnRyb2wtPm1heGxlbmd0aD0kcnVsZS0+YXJnO31wYXJlbnQ6Om5vdGlmeVJ1bGUoJHJ1bGUpO319Y2xhc3MKTkZvcm1Hcm91cApleHRlbmRzCk5PYmplY3R7cHJvdGVjdGVkJGNvbnRyb2xzO3ByaXZhdGUkb3B0aW9ucz1hcnJheSgpO2Z1bmN0aW9uCl9fY29uc3RydWN0KCl7JHRoaXMtPmNvbnRyb2xzPW5ldwpTcGxPYmplY3RTdG9yYWdlO31mdW5jdGlvbgphZGQoKXtmb3JlYWNoKGZ1bmNfZ2V0X2FyZ3MoKWFzJG51bT0+JGl0ZW0pe2lmKCRpdGVtCmluc3RhbmNlb2YKSUZvcm1Db250cm9sKXskdGhpcy0+Y29udHJvbHMtPmF0dGFjaCgkaXRlbSk7fWVsc2VpZigkaXRlbQppbnN0YW5jZW9mClRyYXZlcnNhYmxlfHxpc19hcnJheSgkaXRlbSkpe2ZvcmVhY2goJGl0ZW0KYXMkY29udHJvbCl7JHRoaXMtPmNvbnRyb2xzLT5hdHRhY2goJGNvbnRyb2wpO319ZWxzZXt0aHJvdwpuZXcKSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJPbmx5IElGb3JtQ29udHJvbCBpdGVtcyBhcmUgYWxsb3dlZCwgdGhlICMkbnVtIHBhcmFtZXRlciBpcyBpbnZhbGlkLiIpO319cmV0dXJuJHRoaXM7fWZ1bmN0aW9uCmdldENvbnRyb2xzKCl7cmV0dXJuCml0ZXJhdG9yX3RvX2FycmF5KCR0aGlzLT5jb250cm9scyk7fWZ1bmN0aW9uCnNldE9wdGlvbigka2V5LCR2YWx1ZSl7aWYoJHZhbHVlPT09TlVMTCl7dW5zZXQoJHRoaXMtPm9wdGlvbnNbJGtleV0pO31lbHNleyR0aGlzLT5vcHRpb25zWyRrZXldPSR2YWx1ZTt9cmV0dXJuJHRoaXM7fWZpbmFsCmZ1bmN0aW9uCmdldE9wdGlvbigka2V5LCRkZWZhdWx0PU5VTEwpe3JldHVybgppc3NldCgkdGhpcy0+b3B0aW9uc1ska2V5XSk/JHRoaXMtPm9wdGlvbnNbJGtleV06JGRlZmF1bHQ7fWZpbmFsCmZ1bmN0aW9uCmdldE9wdGlvbnMoKXtyZXR1cm4kdGhpcy0+b3B0aW9uczt9fWNsYXNzCk5Db252ZW50aW9uYWxSZW5kZXJlcgpleHRlbmRzCk5PYmplY3QKaW1wbGVtZW50cwpJRm9ybVJlbmRlcmVye3B1YmxpYyR3cmFwcGVycz1hcnJheSgnZm9ybSc9PmFycmF5KCdjb250YWluZXInPT5OVUxMLCdlcnJvcnMnPT5UUlVFKSwnZXJyb3InPT5hcnJheSgnY29udGFpbmVyJz0+J3VsIGNsYXNzPWVycm9yJywnaXRlbSc9PidsaScpLCdncm91cCc9PmFycmF5KCdjb250YWluZXInPT4nZmllbGRzZXQnLCdsYWJlbCc9PidsZWdlbmQnLCdkZXNjcmlwdGlvbic9PidwJyksJ2NvbnRyb2xzJz0+YXJyYXkoJ2NvbnRhaW5lcic9Pid0YWJsZScpLCdwYWlyJz0+YXJyYXkoJ2NvbnRhaW5lcic9Pid0cicsJy5yZXF1aXJlZCc9PidyZXF1aXJlZCcsJy5vcHRpb25hbCc9Pk5VTEwsJy5vZGQnPT5OVUxMKSwnY29udHJvbCc9PmFycmF5KCdjb250YWluZXInPT4ndGQnLCcub2RkJz0+TlVMTCwnZXJyb3JzJz0+RkFMU0UsJ2Rlc2NyaXB0aW9uJz0+J3NtYWxsJywncmVxdWlyZWRzdWZmaXgnPT4nJywnLnJlcXVpcmVkJz0+J3JlcXVpcmVkJywnLnRleHQnPT4ndGV4dCcsJy5wYXNzd29yZCc9Pid0ZXh0JywnLmZpbGUnPT4ndGV4dCcsJy5zdWJtaXQnPT4nYnV0dG9uJywnLmltYWdlJz0+J2ltYWdlYnV0dG9uJywnLmJ1dHRvbic9PididXR0b24nKSwnbGFiZWwnPT5hcnJheSgnY29udGFpbmVyJz0+J3RoJywnc3VmZml4Jz0+TlVMTCwncmVxdWlyZWRzdWZmaXgnPT4nJyksJ2hpZGRlbic9PmFycmF5KCdjb250YWluZXInPT4nZGl2JykpO3Byb3RlY3RlZCRmb3JtO3Byb3RlY3RlZCRjbGllbnRTY3JpcHQ9VFJVRTtwcm90ZWN0ZWQkY291bnRlcjtmdW5jdGlvbgpyZW5kZXIoTkZvcm0kZm9ybSwkbW9kZT1OVUxMKXtpZigkdGhpcy0+Zm9ybSE9PSRmb3JtKXskdGhpcy0+Zm9ybT0kZm9ybTskdGhpcy0+aW5pdCgpO30kcz0nJztpZighJG1vZGV8fCRtb2RlPT09J2JlZ2luJyl7JHMuPSR0aGlzLT5yZW5kZXJCZWdpbigpO31pZigoISRtb2RlJiYkdGhpcy0+Z2V0VmFsdWUoJ2Zvcm0gZXJyb3JzJykpfHwkbW9kZT09PSdlcnJvcnMnKXskcy49JHRoaXMtPnJlbmRlckVycm9ycygpO31pZighJG1vZGV8fCRtb2RlPT09J2JvZHknKXskcy49JHRoaXMtPnJlbmRlckJvZHkoKTt9aWYoISRtb2RlfHwkbW9kZT09PSdlbmQnKXskcy49JHRoaXMtPnJlbmRlckVuZCgpO31yZXR1cm4kczt9ZnVuY3Rpb24Kc2V0Q2xpZW50U2NyaXB0KCRjbGllbnRTY3JpcHQ9TlVMTCl7JHRoaXMtPmNsaWVudFNjcmlwdD0kY2xpZW50U2NyaXB0O3JldHVybiR0aGlzO31mdW5jdGlvbgpnZXRDbGllbnRTY3JpcHQoKXtpZigkdGhpcy0+Y2xpZW50U2NyaXB0PT09VFJVRSl7JHRoaXMtPmNsaWVudFNjcmlwdD1uZXcKTkluc3RhbnRDbGllbnRTY3JpcHQoJHRoaXMtPmZvcm0pO31yZXR1cm4kdGhpcy0+Y2xpZW50U2NyaXB0O31wcm90ZWN0ZWQKZnVuY3Rpb24KaW5pdCgpeyRjbGllbnRTY3JpcHQ9JHRoaXMtPmdldENsaWVudFNjcmlwdCgpO2lmKCRjbGllbnRTY3JpcHQhPT1OVUxMKXskY2xpZW50U2NyaXB0LT5lbmFibGUoKTt9JHdyYXBwZXI9JiR0aGlzLT53cmFwcGVyc1snY29udHJvbCddO2ZvcmVhY2goJHRoaXMtPmZvcm0tPmdldENvbnRyb2xzKClhcyRjb250cm9sKXtpZigkY29udHJvbC0+Z2V0T3B0aW9uKCdyZXF1aXJlZCcpJiZpc3NldCgkd3JhcHBlclsnLnJlcXVpcmVkJ10pKXskY29udHJvbC0+Z2V0TGFiZWxQcm90b3R5cGUoKS0+Y2xhc3MoJHdyYXBwZXJbJy5yZXF1aXJlZCddLFRSVUUpO30kZWw9JGNvbnRyb2wtPmdldENvbnRyb2xQcm90b3R5cGUoKTtpZigkZWwtPmdldE5hbWUoKT09PSdpbnB1dCcmJmlzc2V0KCR3cmFwcGVyWycuJy4kZWwtPnR5cGVdKSl7JGVsLT5jbGFzcygkd3JhcHBlclsnLicuJGVsLT50eXBlXSxUUlVFKTt9fX1mdW5jdGlvbgpyZW5kZXJCZWdpbigpeyR0aGlzLT5jb3VudGVyPTA7Zm9yZWFjaCgkdGhpcy0+Zm9ybS0+Z2V0Q29udHJvbHMoKWFzJGNvbnRyb2wpeyRjb250cm9sLT5zZXRPcHRpb24oJ3JlbmRlcmVkJyxGQUxTRSk7fWlmKHN0cmNhc2VjbXAoJHRoaXMtPmZvcm0tPmdldE1ldGhvZCgpLCdnZXQnKT09PTApeyRlbD1jbG9uZSR0aGlzLT5mb3JtLT5nZXRFbGVtZW50UHJvdG90eXBlKCk7JHVyaT1leHBsb2RlKCc/Jywoc3RyaW5nKSRlbC0+YWN0aW9uLDIpOyRlbC0+YWN0aW9uPSR1cmlbMF07JHM9Jyc7aWYoaXNzZXQoJHVyaVsxXSkpe2ZvcmVhY2gocHJlZ19zcGxpdCgnI1s7Jl0jJywkdXJpWzFdKWFzJHBhcmFtKXskcGFydHM9ZXhwbG9kZSgnPScsJHBhcmFtLDIpOyRuYW1lPXVybGRlY29kZSgkcGFydHNbMF0pO2lmKCFpc3NldCgkdGhpcy0+Zm9ybVskbmFtZV0pKXskcy49Tkh0bWw6OmVsKCdpbnB1dCcsYXJyYXkoJ3R5cGUnPT4naGlkZGVuJywnbmFtZSc9PiRuYW1lLCd2YWx1ZSc9PnVybGRlY29kZSgkcGFydHNbMV0pKSk7fX0kcz0iXG5cdCIuJHRoaXMtPmdldFdyYXBwZXIoJ2hpZGRlbiBjb250YWluZXInKS0+c2V0SHRtbCgkcyk7fXJldHVybiRlbC0+c3RhcnRUYWcoKS4kczt9ZWxzZXtyZXR1cm4kdGhpcy0+Zm9ybS0+Z2V0RWxlbWVudFByb3RvdHlwZSgpLT5zdGFydFRhZygpO319ZnVuY3Rpb24KcmVuZGVyRW5kKCl7JHM9Jyc7Zm9yZWFjaCgkdGhpcy0+Zm9ybS0+Z2V0Q29udHJvbHMoKWFzJGNvbnRyb2wpe2lmKCRjb250cm9sCmluc3RhbmNlb2YKTkhpZGRlbkZpZWxkJiYhJGNvbnRyb2wtPmdldE9wdGlvbigncmVuZGVyZWQnKSl7JHMuPShzdHJpbmcpJGNvbnRyb2wtPmdldENvbnRyb2woKTt9fWlmKCRzKXskcz0kdGhpcy0+Z2V0V3JhcHBlcignaGlkZGVuIGNvbnRhaW5lcicpLT5zZXRIdG1sKCRzKS4iXG4iO30kcy49JHRoaXMtPmZvcm0tPmdldEVsZW1lbnRQcm90b3R5cGUoKS0+ZW5kVGFnKCkuIlxuIjskY2xpZW50U2NyaXB0PSR0aGlzLT5nZXRDbGllbnRTY3JpcHQoKTtpZigkY2xpZW50U2NyaXB0IT09TlVMTCl7JHMuPSRjbGllbnRTY3JpcHQtPnJlbmRlckNsaWVudFNjcmlwdCgpLiJcbiI7fXJldHVybiRzO31mdW5jdGlvbgpyZW5kZXJFcnJvcnMoSUZvcm1Db250cm9sJGNvbnRyb2w9TlVMTCl7JGVycm9ycz0kY29udHJvbD09PU5VTEw/JHRoaXMtPmZvcm0tPmdldEVycm9ycygpOiRjb250cm9sLT5nZXRFcnJvcnMoKTtpZihjb3VudCgkZXJyb3JzKSl7JHVsPSR0aGlzLT5nZXRXcmFwcGVyKCdlcnJvciBjb250YWluZXInKTskbGk9JHRoaXMtPmdldFdyYXBwZXIoJ2Vycm9yIGl0ZW0nKTtmb3JlYWNoKCRlcnJvcnMKYXMkZXJyb3IpeyRpdGVtPWNsb25lJGxpO2lmKCRlcnJvcgppbnN0YW5jZW9mCk5IdG1sKXskaXRlbS0+YWRkKCRlcnJvcik7fWVsc2V7JGl0ZW0tPnNldFRleHQoJGVycm9yKTt9JHVsLT5hZGQoJGl0ZW0pO31yZXR1cm4iXG4iLiR1bC0+cmVuZGVyKDApO319ZnVuY3Rpb24KcmVuZGVyQm9keSgpeyRzPSRyZW1haW5zPScnOyRkZWZhdWx0Q29udGFpbmVyPSR0aGlzLT5nZXRXcmFwcGVyKCdncm91cCBjb250YWluZXInKTskdHJhbnNsYXRvcj0kdGhpcy0+Zm9ybS0+Z2V0VHJhbnNsYXRvcigpO2ZvcmVhY2goJHRoaXMtPmZvcm0tPmdldEdyb3VwcygpYXMkZ3JvdXApe2lmKCEkZ3JvdXAtPmdldENvbnRyb2xzKCl8fCEkZ3JvdXAtPmdldE9wdGlvbigndmlzdWFsJykpY29udGludWU7JGNvbnRhaW5lcj0kZ3JvdXAtPmdldE9wdGlvbignY29udGFpbmVyJywkZGVmYXVsdENvbnRhaW5lcik7JGNvbnRhaW5lcj0kY29udGFpbmVyCmluc3RhbmNlb2YKTkh0bWw/Y2xvbmUkY29udGFpbmVyOk5IdG1sOjplbCgkY29udGFpbmVyKTskcy49IlxuIi4kY29udGFpbmVyLT5zdGFydFRhZygpOyR0ZXh0PSRncm91cC0+Z2V0T3B0aW9uKCdsYWJlbCcpO2lmKCR0ZXh0Cmluc3RhbmNlb2YKTkh0bWwpeyRzLj0kdGV4dDt9ZWxzZWlmKGlzX3N0cmluZygkdGV4dCkpe2lmKCR0cmFuc2xhdG9yIT09TlVMTCl7JHRleHQ9JHRyYW5zbGF0b3ItPnRyYW5zbGF0ZSgkdGV4dCk7fSRzLj0iXG4iLiR0aGlzLT5nZXRXcmFwcGVyKCdncm91cCBsYWJlbCcpLT5zZXRUZXh0KCR0ZXh0KS4iXG4iO30kdGV4dD0kZ3JvdXAtPmdldE9wdGlvbignZGVzY3JpcHRpb24nKTtpZigkdGV4dAppbnN0YW5jZW9mCk5IdG1sKXskcy49JHRleHQ7fWVsc2VpZihpc19zdHJpbmcoJHRleHQpKXtpZigkdHJhbnNsYXRvciE9PU5VTEwpeyR0ZXh0PSR0cmFuc2xhdG9yLT50cmFuc2xhdGUoJHRleHQpO30kcy49JHRoaXMtPmdldFdyYXBwZXIoJ2dyb3VwIGRlc2NyaXB0aW9uJyktPnNldFRleHQoJHRleHQpLiJcbiI7fSRzLj0kdGhpcy0+cmVuZGVyQ29udHJvbHMoJGdyb3VwKTskcmVtYWlucz0kY29udGFpbmVyLT5lbmRUYWcoKS4iXG4iLiRyZW1haW5zO2lmKCEkZ3JvdXAtPmdldE9wdGlvbignZW1iZWROZXh0JykpeyRzLj0kcmVtYWluczskcmVtYWlucz0nJzt9fSRzLj0kcmVtYWlucy4kdGhpcy0+cmVuZGVyQ29udHJvbHMoJHRoaXMtPmZvcm0pOyRjb250YWluZXI9JHRoaXMtPmdldFdyYXBwZXIoJ2Zvcm0gY29udGFpbmVyJyk7JGNvbnRhaW5lci0+c2V0SHRtbCgkcyk7cmV0dXJuJGNvbnRhaW5lci0+cmVuZGVyKDApO31mdW5jdGlvbgpyZW5kZXJDb250cm9scygkcGFyZW50KXtpZighKCRwYXJlbnQKaW5zdGFuY2VvZgpORm9ybUNvbnRhaW5lcnx8JHBhcmVudAppbnN0YW5jZW9mCk5Gb3JtR3JvdXApKXt0aHJvdwpuZXcKSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJBcmd1bWVudCBtdXN0IGJlIEZvcm1Db250YWluZXIgb3IgRm9ybUdyb3VwIGluc3RhbmNlLiIpO30kY29udGFpbmVyPSR0aGlzLT5nZXRXcmFwcGVyKCdjb250cm9scyBjb250YWluZXInKTskYnV0dG9ucz1OVUxMO2ZvcmVhY2goJHBhcmVudC0+Z2V0Q29udHJvbHMoKWFzJGNvbnRyb2wpe2lmKCRjb250cm9sLT5nZXRPcHRpb24oJ3JlbmRlcmVkJyl8fCRjb250cm9sCmluc3RhbmNlb2YKTkhpZGRlbkZpZWxkfHwkY29udHJvbC0+Z2V0Rm9ybShGQUxTRSkhPT0kdGhpcy0+Zm9ybSl7fWVsc2VpZigkY29udHJvbAppbnN0YW5jZW9mCk5CdXR0b24peyRidXR0b25zW109JGNvbnRyb2w7fWVsc2V7aWYoJGJ1dHRvbnMpeyRjb250YWluZXItPmFkZCgkdGhpcy0+cmVuZGVyUGFpck11bHRpKCRidXR0b25zKSk7JGJ1dHRvbnM9TlVMTDt9JGNvbnRhaW5lci0+YWRkKCR0aGlzLT5yZW5kZXJQYWlyKCRjb250cm9sKSk7fX1pZigkYnV0dG9ucyl7JGNvbnRhaW5lci0+YWRkKCR0aGlzLT5yZW5kZXJQYWlyTXVsdGkoJGJ1dHRvbnMpKTt9JHM9Jyc7aWYoY291bnQoJGNvbnRhaW5lcikpeyRzLj0iXG4iLiRjb250YWluZXIuIlxuIjt9cmV0dXJuJHM7fWZ1bmN0aW9uCnJlbmRlclBhaXIoSUZvcm1Db250cm9sJGNvbnRyb2wpeyRwYWlyPSR0aGlzLT5nZXRXcmFwcGVyKCdwYWlyIGNvbnRhaW5lcicpOyRwYWlyLT5hZGQoJHRoaXMtPnJlbmRlckxhYmVsKCRjb250cm9sKSk7JHBhaXItPmFkZCgkdGhpcy0+cmVuZGVyQ29udHJvbCgkY29udHJvbCkpOyRwYWlyLT5jbGFzcygkdGhpcy0+Z2V0VmFsdWUoJGNvbnRyb2wtPmdldE9wdGlvbigncmVxdWlyZWQnKT8ncGFpciAucmVxdWlyZWQnOidwYWlyIC5vcHRpb25hbCcpLFRSVUUpOyRwYWlyLT5jbGFzcygkY29udHJvbC0+Z2V0T3B0aW9uKCdjbGFzcycpLFRSVUUpO2lmKCsrJHRoaXMtPmNvdW50ZXIKJQoyKSRwYWlyLT5jbGFzcygkdGhpcy0+Z2V0VmFsdWUoJ3BhaXIgLm9kZCcpLFRSVUUpOyRwYWlyLT5pZD0kY29udHJvbC0+Z2V0T3B0aW9uKCdpZCcpO3JldHVybiRwYWlyLT5yZW5kZXIoMCk7fWZ1bmN0aW9uCnJlbmRlclBhaXJNdWx0aShhcnJheSRjb250cm9scyl7JHM9YXJyYXkoKTtmb3JlYWNoKCRjb250cm9scwphcyRjb250cm9sKXtpZighKCRjb250cm9sCmluc3RhbmNlb2YKSUZvcm1Db250cm9sKSl7dGhyb3cKbmV3CkludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiQXJndW1lbnQgbXVzdCBiZSBhcnJheSBvZiBJRm9ybUNvbnRyb2wgaW5zdGFuY2VzLiIpO30kc1tdPShzdHJpbmcpJGNvbnRyb2wtPmdldENvbnRyb2woKTt9JHBhaXI9JHRoaXMtPmdldFdyYXBwZXIoJ3BhaXIgY29udGFpbmVyJyk7JHBhaXItPmFkZCgkdGhpcy0+cmVuZGVyTGFiZWwoJGNvbnRyb2wpKTskcGFpci0+YWRkKCR0aGlzLT5nZXRXcmFwcGVyKCdjb250cm9sIGNvbnRhaW5lcicpLT5zZXRIdG1sKGltcGxvZGUoIiAiLCRzKSkpO3JldHVybiRwYWlyLT5yZW5kZXIoMCk7fWZ1bmN0aW9uCnJlbmRlckxhYmVsKElGb3JtQ29udHJvbCRjb250cm9sKXskaGVhZD0kdGhpcy0+Z2V0V3JhcHBlcignbGFiZWwgY29udGFpbmVyJyk7aWYoJGNvbnRyb2wKaW5zdGFuY2VvZgpOQ2hlY2tib3h8fCRjb250cm9sCmluc3RhbmNlb2YKTkJ1dHRvbil7cmV0dXJuJGhlYWQtPnNldEh0bWwoKCRoZWFkLT5nZXROYW1lKCk9PT0ndGQnfHwkaGVhZC0+Z2V0TmFtZSgpPT09J3RoJyk/JyZuYnNwOyc6JycpO31lbHNleyRsYWJlbD0kY29udHJvbC0+Z2V0TGFiZWwoKTskc3VmZml4PSR0aGlzLT5nZXRWYWx1ZSgnbGFiZWwgc3VmZml4JykuKCRjb250cm9sLT5nZXRPcHRpb24oJ3JlcXVpcmVkJyk/JHRoaXMtPmdldFZhbHVlKCdsYWJlbCByZXF1aXJlZHN1ZmZpeCcpOicnKTtpZigkbGFiZWwKaW5zdGFuY2VvZgpOSHRtbCl7JGxhYmVsLT5zZXRIdG1sKCRsYWJlbC0+Z2V0SHRtbCgpLiRzdWZmaXgpOyRzdWZmaXg9Jyc7fXJldHVybiRoZWFkLT5zZXRIdG1sKChzdHJpbmcpJGxhYmVsLiRzdWZmaXgpO319ZnVuY3Rpb24KcmVuZGVyQ29udHJvbChJRm9ybUNvbnRyb2wkY29udHJvbCl7JGJvZHk9JHRoaXMtPmdldFdyYXBwZXIoJ2NvbnRyb2wgY29udGFpbmVyJyk7aWYoJHRoaXMtPmNvdW50ZXIKJQoyKSRib2R5LT5jbGFzcygkdGhpcy0+Z2V0VmFsdWUoJ2NvbnRyb2wgLm9kZCcpLFRSVUUpOyRkZXNjcmlwdGlvbj0kY29udHJvbC0+Z2V0T3B0aW9uKCdkZXNjcmlwdGlvbicpO2lmKCRkZXNjcmlwdGlvbgppbnN0YW5jZW9mCk5IdG1sKXskZGVzY3JpcHRpb249JyAnLiRjb250cm9sLT5nZXRPcHRpb24oJ2Rlc2NyaXB0aW9uJyk7fWVsc2VpZihpc19zdHJpbmcoJGRlc2NyaXB0aW9uKSl7JGRlc2NyaXB0aW9uPScgJy4kdGhpcy0+Z2V0V3JhcHBlcignY29udHJvbCBkZXNjcmlwdGlvbicpLT5zZXRUZXh0KCRjb250cm9sLT50cmFuc2xhdGUoJGRlc2NyaXB0aW9uKSk7fWVsc2V7JGRlc2NyaXB0aW9uPScnO31pZigkY29udHJvbC0+Z2V0T3B0aW9uKCdyZXF1aXJlZCcpKXskZGVzY3JpcHRpb249JHRoaXMtPmdldFZhbHVlKCdjb250cm9sIHJlcXVpcmVkc3VmZml4JykuJGRlc2NyaXB0aW9uO31pZigkdGhpcy0+Z2V0VmFsdWUoJ2NvbnRyb2wgZXJyb3JzJykpeyRkZXNjcmlwdGlvbi49JHRoaXMtPnJlbmRlckVycm9ycygkY29udHJvbCk7fWlmKCRjb250cm9sCmluc3RhbmNlb2YKTkNoZWNrYm94fHwkY29udHJvbAppbnN0YW5jZW9mCk5CdXR0b24pe3JldHVybiRib2R5LT5zZXRIdG1sKChzdHJpbmcpJGNvbnRyb2wtPmdldENvbnRyb2woKS4oc3RyaW5nKSRjb250cm9sLT5nZXRMYWJlbCgpLiRkZXNjcmlwdGlvbik7fWVsc2V7cmV0dXJuJGJvZHktPnNldEh0bWwoKHN0cmluZykkY29udHJvbC0+Z2V0Q29udHJvbCgpLiRkZXNjcmlwdGlvbik7fX1wcm90ZWN0ZWQKZnVuY3Rpb24KZ2V0V3JhcHBlcigkbmFtZSl7JGRhdGE9JHRoaXMtPmdldFZhbHVlKCRuYW1lKTtyZXR1cm4kZGF0YQppbnN0YW5jZW9mCk5IdG1sP2Nsb25lJGRhdGE6Tkh0bWw6OmVsKCRkYXRhKTt9cHJvdGVjdGVkCmZ1bmN0aW9uCmdldFZhbHVlKCRuYW1lKXskbmFtZT1leHBsb2RlKCcgJywkbmFtZSk7JGRhdGE9JiR0aGlzLT53cmFwcGVyc1skbmFtZVswXV1bJG5hbWVbMV1dO3JldHVybiRkYXRhO319ZmluYWwKY2xhc3MKTkluc3RhbnRDbGllbnRTY3JpcHQKZXh0ZW5kcwpOT2JqZWN0e3ByaXZhdGUkdmFsaWRhdGVTY3JpcHRzO3ByaXZhdGUkdG9nZ2xlU2NyaXB0O3ByaXZhdGUkY2VudHJhbDtwcml2YXRlJGZvcm07ZnVuY3Rpb24KX19jb25zdHJ1Y3QoTkZvcm0kZm9ybSl7JHRoaXMtPmZvcm09JGZvcm07fWZ1bmN0aW9uCmVuYWJsZSgpeyR0aGlzLT52YWxpZGF0ZVNjcmlwdHM9YXJyYXkoKTskdGhpcy0+dG9nZ2xlU2NyaXB0PScnOyR0aGlzLT5jZW50cmFsPVRSVUU7Zm9yZWFjaCgkdGhpcy0+Zm9ybS0+Z2V0Q29udHJvbHMoKWFzJGNvbnRyb2wpeyRzY3JpcHQ9JHRoaXMtPmdldFZhbGlkYXRlU2NyaXB0KCRjb250cm9sLT5nZXRSdWxlcygpKTtpZigkc2NyaXB0KXskdGhpcy0+dmFsaWRhdGVTY3JpcHRzWyRjb250cm9sLT5nZXRIdG1sTmFtZSgpXT0kc2NyaXB0O30kdGhpcy0+dG9nZ2xlU2NyaXB0Lj0kdGhpcy0+Z2V0VG9nZ2xlU2NyaXB0KCRjb250cm9sLT5nZXRSdWxlcygpKTtpZigkY29udHJvbAppbnN0YW5jZW9mCklTdWJtaXR0ZXJDb250cm9sJiYkY29udHJvbC0+Z2V0VmFsaWRhdGlvblNjb3BlKCkhPT1UUlVFKXskdGhpcy0+Y2VudHJhbD1GQUxTRTt9fWlmKCR0aGlzLT52YWxpZGF0ZVNjcmlwdHN8fCR0aGlzLT50b2dnbGVTY3JpcHQpe2lmKCR0aGlzLT5jZW50cmFsKXskdGhpcy0+Zm9ybS0+Z2V0RWxlbWVudFByb3RvdHlwZSgpLT5vbnN1Ym1pdCgicmV0dXJuIG5ldHRlLnZhbGlkYXRlRm9ybSh0aGlzKSIsVFJVRSk7fWVsc2V7Zm9yZWFjaCgkdGhpcy0+Zm9ybS0+Z2V0Q29tcG9uZW50cyhUUlVFLCdJU3VibWl0dGVyQ29udHJvbCcpYXMkY29udHJvbCl7aWYoJGNvbnRyb2wtPmdldFZhbGlkYXRpb25TY29wZSgpKXskY29udHJvbC0+Z2V0Q29udHJvbFByb3RvdHlwZSgpLT5vbmNsaWNrKCJyZXR1cm4gbmV0dGUudmFsaWRhdGVGb3JtKHRoaXMpIixUUlVFKTt9fX19fWZ1bmN0aW9uCnJlbmRlckNsaWVudFNjcmlwdCgpe2lmKCEkdGhpcy0+dmFsaWRhdGVTY3JpcHRzJiYhJHRoaXMtPnRvZ2dsZVNjcmlwdCl7cmV0dXJuO30kZm9ybU5hbWU9anNvbl9lbmNvZGUoKHN0cmluZykkdGhpcy0+Zm9ybS0+Z2V0RWxlbWVudFByb3RvdHlwZSgpLT5pZCk7b2Jfc3RhcnQoKTs/Pgo8IS0tIE5ldHRlIEZvcm0gdmFsaWRhdG9yIC0tPgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8qPCFbQ0RBVEFbKi92YXIgbmV0dGU9bmV0dGV8fHt9O25ldHRlLmdldFZhbHVlPWZ1bmN0aW9uKGEpe2lmKGEpe2lmKCFhLm5vZGVOYW1lKXtmb3IodmFyIGI9MCxkPWEubGVuZ3RoO2I8ZDtiKyspaWYoYVtiXS5jaGVja2VkKXJldHVybiBhW2JdLnZhbHVlO3JldHVybiBudWxsfWlmKGEubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJzZWxlY3QiKXtiPWEuc2VsZWN0ZWRJbmRleDt2YXIgYz1hLm9wdGlvbnM7aWYoYjwwKXJldHVybiBudWxsO2Vsc2UgaWYoYS50eXBlPT09InNlbGVjdC1vbmUiKXJldHVybiBjW2JdLnZhbHVlO2I9MDthPVtdO2ZvcihkPWMubGVuZ3RoO2I8ZDtiKyspY1tiXS5zZWxlY3RlZCYmYS5wdXNoKGNbYl0udmFsdWUpO3JldHVybiBhfWlmKGEudHlwZT09PSJjaGVja2JveCIpcmV0dXJuIGEuY2hlY2tlZDtyZXR1cm4gYS52YWx1ZS5yZXBsYWNlKC9eXHMrfFxzKyQvZywiIil9fTsKbmV0dGUuZ2V0Rm9ybVZhbGlkYXRvcnM9ZnVuY3Rpb24oYSl7YT1hLmdldEF0dHJpYnV0ZU5vZGUoImlkIikubm9kZVZhbHVlO3JldHVybiB0aGlzLmZvcm1zW2FdP3RoaXMuZm9ybXNbYV0udmFsaWRhdG9yczpbXX07bmV0dGUudmFsaWRhdGVDb250cm9sPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0Rm9ybVZhbGlkYXRvcnMoYS5mb3JtKVthLm5hbWVdO3JldHVybiBiP2IoYSk6bnVsbH07bmV0dGUudmFsaWRhdGVGb3JtPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZm9ybXx8YSxkPXRoaXMuZ2V0Rm9ybVZhbGlkYXRvcnMoYik7Zm9yKHZhciBjIGluIGQpe3ZhciBlPWRbY10oYSk7aWYoZSl7YltjXS5mb2N1cyYmYltjXS5mb2N1cygpO2FsZXJ0KGUpO3JldHVybiBmYWxzZX19cmV0dXJuIHRydWV9O25ldHRlLnRvZ2dsZT1mdW5jdGlvbihhLGIpe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSkpYS5zdHlsZS5kaXNwbGF5PWI/IiI6Im5vbmUifTsvKl1dPiovPC9zY3JpcHQ+Cgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci8qIDwhW0NEQVRBWyAqLwoKbmV0dGUuZm9ybXMgPSBuZXR0ZS5mb3JtcyB8fCB7IH07CgpuZXR0ZS5mb3Jtc1s8P3BocCBlY2hvJGZvcm1OYW1lPz5dID0gewoJdmFsaWRhdG9yczogewo8P3BocCAkY291bnQ9Y291bnQoJHRoaXMtPnZhbGlkYXRlU2NyaXB0cyk7Pz4KPD9waHAgZm9yZWFjaCgkdGhpcy0+dmFsaWRhdGVTY3JpcHRzCmFzJG5hbWU9PiR2YWxpZGF0ZVNjcmlwdCk6Pz4KCQk8P3BocCBlY2hvCmpzb25fZW5jb2RlKChzdHJpbmcpJG5hbWUpPz46IGZ1bmN0aW9uKHNlbmRlcikgewoJCQl2YXIgcmVzLCB2YWwsIGZvcm0gPSBzZW5kZXIuZm9ybSB8fCBzZW5kZXI7Cjw/cGhwIGVjaG8KTlN0cmluZzo6aW5kZW50KCR2YWxpZGF0ZVNjcmlwdCwzKT8+CgkJfTw/cGhwIGVjaG8tLSRjb3VudD8nLCc6Jyc/PgoKPD9waHAgZW5kZm9yZWFjaD8+Cgl9LAoKCXRvZ2dsZTogZnVuY3Rpb24oc2VuZGVyKSB7CgkJdmFyIHZpc2libGUsIHJlcywgZm9ybSA9IHNlbmRlci5mb3JtIHx8IHNlbmRlcjsKPD9waHAgZWNobwpOU3RyaW5nOjppbmRlbnQoJHRoaXMtPnRvZ2dsZVNjcmlwdCwyKT8+Cgl9Cn0KCgo8P3BocCBpZigkdGhpcy0+dG9nZ2xlU2NyaXB0KTo/PgpuZXR0ZS5mb3Jtc1s8P3BocCBlY2hvJGZvcm1OYW1lPz5dLnRvZ2dsZShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCg8P3BocCBlY2hvJGZvcm1OYW1lPz4pKTsKPD9waHAgZW5kaWY/PgoKLyogXV0+ICovCjwvc2NyaXB0PgoKPCEtLSAvTmV0dGUgRm9ybSB2YWxpZGF0b3IgLS0+Cjw/cGhwIApyZXR1cm4Kb2JfZ2V0X2NsZWFuKCk7fXByaXZhdGUKZnVuY3Rpb24KZ2V0VmFsaWRhdGVTY3JpcHQoTlJ1bGVzJHJ1bGVzKXskcmVzPScnO2ZvcmVhY2goJHJ1bGVzCmFzJHJ1bGUpe2lmKCFpc19zdHJpbmcoJHJ1bGUtPm9wZXJhdGlvbikpY29udGludWU7aWYoc3RyY2FzZWNtcCgkcnVsZS0+b3BlcmF0aW9uLCdOZXR0ZVxcRm9ybXNcXEluc3RhbnRDbGllbnRTY3JpcHQ6OmphdmFzY3JpcHQnKT09PTApeyRyZXMuPSIkcnVsZS0+YXJnXG4iO2NvbnRpbnVlO30kc2NyaXB0PSR0aGlzLT5nZXRDbGllbnRTY3JpcHQoJHJ1bGUtPmNvbnRyb2wsJHJ1bGUtPm9wZXJhdGlvbiwkcnVsZS0+YXJnKTtpZighJHNjcmlwdCljb250aW51ZTtpZighZW1wdHkoJHJ1bGUtPm1lc3NhZ2UpKXskbWVzc2FnZT1OUnVsZXM6OmZvcm1hdE1lc3NhZ2UoJHJ1bGUsRkFMU0UpOyRyZXMuPSIkc2NyaXB0XG4iLiJpZiAoIi4oJHJ1bGUtPmlzTmVnYXRpdmU/Jyc6JyEnKS4icmVzKSAiLiJyZXR1cm4gIi5qc29uX2VuY29kZSgoc3RyaW5nKSRtZXNzYWdlKS4oc3RycG9zKCRtZXNzYWdlLCcldmFsdWUnKT09PUZBTFNFPycnOiIucmVwbGFjZSgnJXZhbHVlJywgdmFsKTtcbiIpLiI7XG4iO31pZigkcnVsZS0+dHlwZT09PU5SdWxlOjpDT05ESVRJT04peyRpbm5lclNjcmlwdD0kdGhpcy0+Z2V0VmFsaWRhdGVTY3JpcHQoJHJ1bGUtPnN1YlJ1bGVzKTtpZigkaW5uZXJTY3JpcHQpeyRyZXMuPSIkc2NyaXB0XG5pZiAoIi4oJHJ1bGUtPmlzTmVnYXRpdmU/JyEnOicnKS4icmVzKSB7XG4iLk5TdHJpbmc6OmluZGVudCgkaW5uZXJTY3JpcHQpLiJ9XG4iO2lmKCRydWxlLT5jb250cm9sCmluc3RhbmNlb2YKSVN1Ym1pdHRlckNvbnRyb2wpeyR0aGlzLT5jZW50cmFsPUZBTFNFO319fX1yZXR1cm4kcmVzO31wcml2YXRlCmZ1bmN0aW9uCmdldFRvZ2dsZVNjcmlwdChOUnVsZXMkcnVsZXMsJGNvbmQ9TlVMTCl7JHM9Jyc7Zm9yZWFjaCgkcnVsZXMtPmdldFRvZ2dsZXMoKWFzJGlkPT4kdmlzaWJsZSl7JHMuPSJ2aXNpYmxlID0gdHJ1ZTsgeyRjb25kfVxuIi4ibmV0dGUudG9nZ2xlKCIuanNvbl9lbmNvZGUoKHN0cmluZykkaWQpLiIsICIuKCR2aXNpYmxlPycnOichJykuInZpc2libGUpO1xuIjt9JGZvcm1OYW1lPWpzb25fZW5jb2RlKChzdHJpbmcpJHRoaXMtPmZvcm0tPmdldEVsZW1lbnRQcm90b3R5cGUoKS0+aWQpO2ZvcmVhY2goJHJ1bGVzCmFzJHJ1bGUpe2lmKCRydWxlLT50eXBlPT09TlJ1bGU6OkNPTkRJVElPTiYmaXNfc3RyaW5nKCRydWxlLT5vcGVyYXRpb24pKXskc2NyaXB0PSR0aGlzLT5nZXRDbGllbnRTY3JpcHQoJHJ1bGUtPmNvbnRyb2wsJHJ1bGUtPm9wZXJhdGlvbiwkcnVsZS0+YXJnKTtpZigkc2NyaXB0KXskcmVzPSR0aGlzLT5nZXRUb2dnbGVTY3JpcHQoJHJ1bGUtPnN1YlJ1bGVzLCRjb25kLiIkc2NyaXB0IHZpc2libGUgPSB2aXNpYmxlICYmICIuKCRydWxlLT5pc05lZ2F0aXZlPychJzonJykuInJlcztcbiIpO2lmKCRyZXMpeyRlbD0kcnVsZS0+Y29udHJvbC0+Z2V0Q29udHJvbFByb3RvdHlwZSgpO2lmKCRlbC0+Z2V0TmFtZSgpPT09J3NlbGVjdCcpeyRlbC0+b25jaGFuZ2UoIm5ldHRlLmZvcm1zWyRmb3JtTmFtZV0udG9nZ2xlKHRoaXMpIixUUlVFKTt9ZWxzZXskZWwtPm9uY2xpY2soIm5ldHRlLmZvcm1zWyRmb3JtTmFtZV0udG9nZ2xlKHRoaXMpIixUUlVFKTt9JHMuPSRyZXM7fX19fXJldHVybiRzO31wcml2YXRlCmZ1bmN0aW9uCmdldENsaWVudFNjcmlwdChJRm9ybUNvbnRyb2wkY29udHJvbCwkb3BlcmF0aW9uLCRhcmcpeyRvcGVyYXRpb249c3RydG9sb3dlcigkb3BlcmF0aW9uKTskZWxlbT0nZm9ybVsnLmpzb25fZW5jb2RlKCRjb250cm9sLT5nZXRIdG1sTmFtZSgpKS4nXSc7c3dpdGNoKFRSVUUpe2Nhc2UkY29udHJvbAppbnN0YW5jZW9mCk5IaWRkZW5GaWVsZHx8JGNvbnRyb2wtPmlzRGlzYWJsZWQoKTpyZXR1cm4KTlVMTDtjYXNlJG9wZXJhdGlvbj09PSc6ZmlsbGVkJyYmJGNvbnRyb2wKaW5zdGFuY2VvZgpOUmFkaW9MaXN0OnJldHVybiJyZXMgPSAodmFsID0gbmV0dGUuZ2V0VmFsdWUoJGVsZW0pKSAhPT0gbnVsbDsiO2Nhc2Ukb3BlcmF0aW9uPT09JzpzdWJtaXR0ZWQnJiYkY29udHJvbAppbnN0YW5jZW9mCk5TdWJtaXRCdXR0b246cmV0dXJuInJlcyA9IHNlbmRlciAmJiBzZW5kZXIubmFtZT09Ii5qc29uX2VuY29kZSgkY29udHJvbC0+Z2V0SHRtbE5hbWUoKSkuIjsiO2Nhc2Ukb3BlcmF0aW9uPT09JzplcXVhbCcmJiRjb250cm9sCmluc3RhbmNlb2YKTk11bHRpU2VsZWN0Qm94OiR0bXA9YXJyYXkoKTtmb3JlYWNoKChpc19hcnJheSgkYXJnKT8kYXJnOmFycmF5KCRhcmcpKWFzJGl0ZW0peyR0bXBbXT0ib3B0aW9uc1tpXS52YWx1ZT09Ii5qc29uX2VuY29kZSgoc3RyaW5nKSRpdGVtKTt9JGZpcnN0PSRjb250cm9sLT5pc0ZpcnN0U2tpcHBlZCgpPzE6MDtyZXR1cm4idmFyIG9wdGlvbnMgPSAkZWxlbS5vcHRpb25zOyByZXMgPSBmYWxzZTtcbiIuImZvciAodmFyIGk9JGZpcnN0LCBsZW49b3B0aW9ucy5sZW5ndGg7IGk8bGVuOyBpKyspXG5cdCIuImlmIChvcHRpb25zW2ldLnNlbGVjdGVkICYmICgiLmltcGxvZGUoJyB8fCAnLCR0bXApLiIpKSB7IHJlcyA9IHRydWU7IGJyZWFrOyB9IjtjYXNlJG9wZXJhdGlvbj09PSc6ZmlsbGVkJyYmJGNvbnRyb2wKaW5zdGFuY2VvZgpOU2VsZWN0Qm94OnJldHVybiJyZXMgPSAkZWxlbS5zZWxlY3RlZEluZGV4ID49ICIuKCRjb250cm9sLT5pc0ZpcnN0U2tpcHBlZCgpPzE6MCkuIjsiO2Nhc2Ukb3BlcmF0aW9uPT09JzpmaWxsZWQnJiYkY29udHJvbAppbnN0YW5jZW9mCk5UZXh0QmFzZTpyZXR1cm4idmFsID0gbmV0dGUuZ2V0VmFsdWUoJGVsZW0pOyByZXMgPSB2YWwhPScnICYmIHZhbCE9Ii5qc29uX2VuY29kZSgoc3RyaW5nKSRjb250cm9sLT5nZXRFbXB0eVZhbHVlKCkpLiI7IjtjYXNlJG9wZXJhdGlvbj09PSc6bWlubGVuZ3RoJyYmJGNvbnRyb2wKaW5zdGFuY2VvZgpOVGV4dEJhc2U6cmV0dXJuInJlcyA9ICh2YWwgPSBuZXR0ZS5nZXRWYWx1ZSgkZWxlbSkpLmxlbmd0aD49Ii4oaW50KSRhcmcuIjsiO2Nhc2Ukb3BlcmF0aW9uPT09JzptYXhsZW5ndGgnJiYkY29udHJvbAppbnN0YW5jZW9mCk5UZXh0QmFzZTpyZXR1cm4icmVzID0gKHZhbCA9IG5ldHRlLmdldFZhbHVlKCRlbGVtKSkubGVuZ3RoPD0iLihpbnQpJGFyZy4iOyI7Y2FzZSRvcGVyYXRpb249PT0nOmxlbmd0aCcmJiRjb250cm9sCmluc3RhbmNlb2YKTlRleHRCYXNlOmlmKCFpc19hcnJheSgkYXJnKSl7JGFyZz1hcnJheSgkYXJnLCRhcmcpO31yZXR1cm4idmFsID0gbmV0dGUuZ2V0VmFsdWUoJGVsZW0pOyByZXMgPSAiLigkYXJnWzBdPT09TlVMTD8idHJ1ZSI6InZhbC5sZW5ndGg+PSIuKGludCkkYXJnWzBdKS4iICYmICIuKCRhcmdbMV09PT1OVUxMPyJ0cnVlIjoidmFsLmxlbmd0aDw9Ii4oaW50KSRhcmdbMV0pLiI7IjtjYXNlJG9wZXJhdGlvbj09PSc6ZW1haWwnJiYkY29udHJvbAppbnN0YW5jZW9mCk5UZXh0QmFzZTpyZXR1cm4ncmVzID0gL15bXkBcc10rQFteQFxzXStcLlthLXpdezIsMTB9JC9pLnRlc3QodmFsID0gbmV0dGUuZ2V0VmFsdWUoJy4kZWxlbS4nKSk7JztjYXNlJG9wZXJhdGlvbj09PSc6dXJsJyYmJGNvbnRyb2wKaW5zdGFuY2VvZgpOVGV4dEJhc2U6cmV0dXJuJ3JlcyA9IC9eLitcLlthLXpdezIsNn0oXFwvLiopPyQvaS50ZXN0KHZhbCA9IG5ldHRlLmdldFZhbHVlKCcuJGVsZW0uJykpOyc7Y2FzZSRvcGVyYXRpb249PT0nOnJlZ2V4cCcmJiRjb250cm9sCmluc3RhbmNlb2YKTlRleHRCYXNlOmlmKCFwcmVnX21hdGNoKCcjXigvLiovKShbaW11XSopJCMnLCRhcmcsJG1hdGNoZXMpKXtyZXR1cm4KTlVMTDt9JGFyZz0kbWF0Y2hlc1sxXS5zdHJfcmVwbGFjZSgndScsJycsJG1hdGNoZXNbMl0pO3JldHVybiJyZXMgPSAkYXJnLnRlc3QodmFsID0gbmV0dGUuZ2V0VmFsdWUoJGVsZW0pKTsiO2Nhc2Ukb3BlcmF0aW9uPT09JzppbnRlZ2VyJyYmJGNvbnRyb2wKaW5zdGFuY2VvZgpOVGV4dEJhc2U6cmV0dXJuInJlcyA9IC9eLT9bMC05XSskLy50ZXN0KHZhbCA9IG5ldHRlLmdldFZhbHVlKCRlbGVtKSk7IjtjYXNlJG9wZXJhdGlvbj09PSc6ZmxvYXQnJiYkY29udHJvbAppbnN0YW5jZW9mCk5UZXh0QmFzZTpyZXR1cm4icmVzID0gL14tP1swLTldKlsuLF0/WzAtOV0rJC8udGVzdCh2YWwgPSBuZXR0ZS5nZXRWYWx1ZSgkZWxlbSkpOyI7Y2FzZSRvcGVyYXRpb249PT0nOnJhbmdlJyYmJGNvbnRyb2wKaW5zdGFuY2VvZgpOVGV4dEJhc2U6cmV0dXJuInZhbCA9IG5ldHRlLmdldFZhbHVlKCRlbGVtKTsgcmVzID0gIi4oJGFyZ1swXT09PU5VTEw/InRydWUiOiJwYXJzZUZsb2F0KHZhbCk+PSIuanNvbl9lbmNvZGUoKGZsb2F0KSRhcmdbMF0pKS4iICYmICIuKCRhcmdbMV09PT1OVUxMPyJ0cnVlIjoicGFyc2VGbG9hdCh2YWwpPD0iLmpzb25fZW5jb2RlKChmbG9hdCkkYXJnWzFdKSkuIjsiO2Nhc2Ukb3BlcmF0aW9uPT09JzpmaWxsZWQnJiYkY29udHJvbAppbnN0YW5jZW9mCk5Gb3JtQ29udHJvbDpyZXR1cm4icmVzID0gKHZhbCA9IG5ldHRlLmdldFZhbHVlKCRlbGVtKSkgIT0gJyc7IjtjYXNlJG9wZXJhdGlvbj09PSc6dmFsaWQnJiYkY29udHJvbAppbnN0YW5jZW9mCk5Gb3JtQ29udHJvbDpyZXR1cm4icmVzID0gIXRoaXNbIi5qc29uX2VuY29kZSgkY29udHJvbC0+Z2V0SHRtbE5hbWUoKSkuIl0oc2VuZGVyKTsiO2Nhc2Ukb3BlcmF0aW9uPT09JzplcXVhbCcmJiRjb250cm9sCmluc3RhbmNlb2YKTkZvcm1Db250cm9sOmlmKCRjb250cm9sCmluc3RhbmNlb2YKTkNoZWNrYm94KSRhcmc9KGJvb2wpJGFyZzskdG1wPWFycmF5KCk7Zm9yZWFjaCgoaXNfYXJyYXkoJGFyZyk/JGFyZzphcnJheSgkYXJnKSlhcyRpdGVtKXtpZigkaXRlbQppbnN0YW5jZW9mCklGb3JtQ29udHJvbCl7JHRtcFtdPSJ2YWw9PW5ldHRlLmdldFZhbHVlKGZvcm1bIi5qc29uX2VuY29kZSgkaXRlbS0+Z2V0SHRtbE5hbWUoKSkuIl0pIjt9ZWxzZXskdG1wW109InZhbD09Ii5qc29uX2VuY29kZSgkaXRlbSk7fX1yZXR1cm4idmFsID0gbmV0dGUuZ2V0VmFsdWUoJGVsZW0pOyByZXMgPSAoIi5pbXBsb2RlKCcgfHwgJywkdG1wKS4iKTsiO319c3RhdGljCmZ1bmN0aW9uCmphdmFzY3JpcHQoKXtyZXR1cm4KVFJVRTt9fWZpbmFsCmNsYXNzCk5SdWxlCmV4dGVuZHMKTk9iamVjdHtjb25zdApDT05ESVRJT049MTtjb25zdApWQUxJREFUT1I9Mjtjb25zdApGSUxURVI9Mztjb25zdApURVJNSU5BVE9SPTQ7cHVibGljJGNvbnRyb2w7cHVibGljJG9wZXJhdGlvbjtwdWJsaWMkYXJnO3B1YmxpYyR0eXBlO3B1YmxpYyRpc05lZ2F0aXZlPUZBTFNFO3B1YmxpYyRtZXNzYWdlO3B1YmxpYyRicmVha09uRmFpbHVyZT1UUlVFO3B1YmxpYyRzdWJSdWxlczt9ZmluYWwKY2xhc3MKTlJ1bGVzCmV4dGVuZHMKTk9iamVjdAppbXBsZW1lbnRzCkl0ZXJhdG9yQWdncmVnYXRle2NvbnN0ClZBTElEQVRFX1BSRUZJWD0ndmFsaWRhdGUnO3B1YmxpYwpzdGF0aWMkZGVmYXVsdE1lc3NhZ2VzPWFycmF5KCk7cHJpdmF0ZSRydWxlcz1hcnJheSgpO3ByaXZhdGUkcGFyZW50O3ByaXZhdGUkdG9nZ2xlcz1hcnJheSgpO3ByaXZhdGUkY29udHJvbDtmdW5jdGlvbgpfX2NvbnN0cnVjdChJRm9ybUNvbnRyb2wkY29udHJvbCl7JHRoaXMtPmNvbnRyb2w9JGNvbnRyb2w7fWZ1bmN0aW9uCmFkZFJ1bGUoJG9wZXJhdGlvbiwkbWVzc2FnZT1OVUxMLCRhcmc9TlVMTCl7JHJ1bGU9bmV3Ck5SdWxlOyRydWxlLT5jb250cm9sPSR0aGlzLT5jb250cm9sOyRydWxlLT5vcGVyYXRpb249JG9wZXJhdGlvbjskdGhpcy0+YWRqdXN0T3BlcmF0aW9uKCRydWxlKTskcnVsZS0+YXJnPSRhcmc7JHJ1bGUtPnR5cGU9TlJ1bGU6OlZBTElEQVRPUjtpZigkbWVzc2FnZT09PU5VTEwmJmlzc2V0KHNlbGY6OiRkZWZhdWx0TWVzc2FnZXNbJHJ1bGUtPm9wZXJhdGlvbl0pKXskcnVsZS0+bWVzc2FnZT1zZWxmOjokZGVmYXVsdE1lc3NhZ2VzWyRydWxlLT5vcGVyYXRpb25dO31lbHNleyRydWxlLT5tZXNzYWdlPSRtZXNzYWdlO31pZigkdGhpcy0+cGFyZW50PT09TlVMTCl7JHRoaXMtPmNvbnRyb2wtPm5vdGlmeVJ1bGUoJHJ1bGUpO30kdGhpcy0+cnVsZXNbXT0kcnVsZTtyZXR1cm4kdGhpczt9ZnVuY3Rpb24KYWRkQ29uZGl0aW9uKCRvcGVyYXRpb24sJGFyZz1OVUxMKXtyZXR1cm4kdGhpcy0+YWRkQ29uZGl0aW9uT24oJHRoaXMtPmNvbnRyb2wsJG9wZXJhdGlvbiwkYXJnKTt9ZnVuY3Rpb24KYWRkQ29uZGl0aW9uT24oSUZvcm1Db250cm9sJGNvbnRyb2wsJG9wZXJhdGlvbiwkYXJnPU5VTEwpeyRydWxlPW5ldwpOUnVsZTskcnVsZS0+Y29udHJvbD0kY29udHJvbDskcnVsZS0+b3BlcmF0aW9uPSRvcGVyYXRpb247JHRoaXMtPmFkanVzdE9wZXJhdGlvbigkcnVsZSk7JHJ1bGUtPmFyZz0kYXJnOyRydWxlLT50eXBlPU5SdWxlOjpDT05ESVRJT047JHJ1bGUtPnN1YlJ1bGVzPW5ldwpzZWxmKCR0aGlzLT5jb250cm9sKTskcnVsZS0+c3ViUnVsZXMtPnBhcmVudD0kdGhpczskdGhpcy0+cnVsZXNbXT0kcnVsZTtyZXR1cm4kcnVsZS0+c3ViUnVsZXM7fWZ1bmN0aW9uCmVsc2VDb25kaXRpb24oKXskcnVsZT1jbG9uZQplbmQoJHRoaXMtPnBhcmVudC0+cnVsZXMpOyRydWxlLT5pc05lZ2F0aXZlPSEkcnVsZS0+aXNOZWdhdGl2ZTskcnVsZS0+c3ViUnVsZXM9bmV3CnNlbGYoJHRoaXMtPnBhcmVudC0+Y29udHJvbCk7JHJ1bGUtPnN1YlJ1bGVzLT5wYXJlbnQ9JHRoaXMtPnBhcmVudDskdGhpcy0+cGFyZW50LT5ydWxlc1tdPSRydWxlO3JldHVybiRydWxlLT5zdWJSdWxlczt9ZnVuY3Rpb24KZW5kQ29uZGl0aW9uKCl7cmV0dXJuJHRoaXMtPnBhcmVudDt9ZnVuY3Rpb24KdG9nZ2xlKCRpZCwkaGlkZT1UUlVFKXskdGhpcy0+dG9nZ2xlc1skaWRdPSRoaWRlO3JldHVybiR0aGlzO31mdW5jdGlvbgp2YWxpZGF0ZSgkb25seUNoZWNrPUZBTFNFKXskdmFsaWQ9VFJVRTtmb3JlYWNoKCR0aGlzLT5ydWxlcwphcyRydWxlKXtpZigkcnVsZS0+Y29udHJvbC0+aXNEaXNhYmxlZCgpKWNvbnRpbnVlOyRzdWNjZXNzPSgkcnVsZS0+aXNOZWdhdGl2ZQp4b3IkdGhpcy0+Z2V0Q2FsbGJhY2soJHJ1bGUpLT5pbnZva2UoJHJ1bGUtPmNvbnRyb2wsJHJ1bGUtPmFyZykpO2lmKCRydWxlLT50eXBlPT09TlJ1bGU6OkNPTkRJVElPTiYmJHN1Y2Nlc3MpeyRzdWNjZXNzPSRydWxlLT5zdWJSdWxlcy0+dmFsaWRhdGUoJG9ubHlDaGVjayk7JHZhbGlkPSR2YWxpZCYmJHN1Y2Nlc3M7fWVsc2VpZigkcnVsZS0+dHlwZT09PU5SdWxlOjpWQUxJREFUT1ImJiEkc3VjY2Vzcyl7aWYoJG9ubHlDaGVjayl7cmV0dXJuCkZBTFNFO30kcnVsZS0+Y29udHJvbC0+YWRkRXJyb3Ioc2VsZjo6Zm9ybWF0TWVzc2FnZSgkcnVsZSxUUlVFKSk7JHZhbGlkPUZBTFNFO2lmKCRydWxlLT5icmVha09uRmFpbHVyZSl7YnJlYWs7fX19cmV0dXJuJHZhbGlkO31maW5hbApmdW5jdGlvbgpnZXRJdGVyYXRvcigpe3JldHVybgpuZXcKQXJyYXlJdGVyYXRvcigkdGhpcy0+cnVsZXMpO31maW5hbApmdW5jdGlvbgpnZXRUb2dnbGVzKCl7cmV0dXJuJHRoaXMtPnRvZ2dsZXM7fXByaXZhdGUKZnVuY3Rpb24KYWRqdXN0T3BlcmF0aW9uKCRydWxlKXtpZihpc19zdHJpbmcoJHJ1bGUtPm9wZXJhdGlvbikmJm9yZCgkcnVsZS0+b3BlcmF0aW9uWzBdKT4xMjcpeyRydWxlLT5pc05lZ2F0aXZlPVRSVUU7JHJ1bGUtPm9wZXJhdGlvbj1+JHJ1bGUtPm9wZXJhdGlvbjt9aWYoISR0aGlzLT5nZXRDYWxsYmFjaygkcnVsZSktPmlzQ2FsbGFibGUoKSl7JG9wZXJhdGlvbj1pc19zY2FsYXIoJHJ1bGUtPm9wZXJhdGlvbik/IiAnJHJ1bGUtPm9wZXJhdGlvbiciOicnO3Rocm93Cm5ldwpJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIlVua25vd24gb3BlcmF0aW9uJG9wZXJhdGlvbiBmb3IgY29udHJvbCAneyRydWxlLT5jb250cm9sLT5uYW1lfScuIik7fX1wcml2YXRlCmZ1bmN0aW9uCmdldENhbGxiYWNrKCRydWxlKXskb3A9JHJ1bGUtPm9wZXJhdGlvbjtpZihpc19zdHJpbmcoJG9wKSYmc3RybmNtcCgkb3AsJzonLDEpPT09MCl7cmV0dXJuCmNhbGxiYWNrKGdldF9jbGFzcygkcnVsZS0+Y29udHJvbCksc2VsZjo6VkFMSURBVEVfUFJFRklYLmx0cmltKCRvcCwnOicpKTt9ZWxzZXtyZXR1cm4KY2FsbGJhY2soJG9wKTt9fXN0YXRpYwpmdW5jdGlvbgpmb3JtYXRNZXNzYWdlKCRydWxlLCR3aXRoVmFsdWUpeyRtZXNzYWdlPSRydWxlLT5tZXNzYWdlO2lmKCR0cmFuc2xhdG9yPSRydWxlLT5jb250cm9sLT5nZXRGb3JtKCktPmdldFRyYW5zbGF0b3IoKSl7JG1lc3NhZ2U9JHRyYW5zbGF0b3ItPnRyYW5zbGF0ZSgkbWVzc2FnZSxpc19pbnQoJHJ1bGUtPmFyZyk/JHJ1bGUtPmFyZzpOVUxMKTt9JG1lc3NhZ2U9c3RyX3JlcGxhY2UoJyVuYW1lJywkcnVsZS0+Y29udHJvbC0+Z2V0TmFtZSgpLCRtZXNzYWdlKTskbWVzc2FnZT1zdHJfcmVwbGFjZSgnJWxhYmVsJywkcnVsZS0+Y29udHJvbC0+dHJhbnNsYXRlKCRydWxlLT5jb250cm9sLT5jYXB0aW9uKSwkbWVzc2FnZSk7aWYoc3RycG9zKCRtZXNzYWdlLCcldmFsdWUnKSE9PUZBTFNFKXskbWVzc2FnZT1zdHJfcmVwbGFjZSgnJXZhbHVlJywkd2l0aFZhbHVlPyhzdHJpbmcpJHJ1bGUtPmNvbnRyb2wtPmdldFZhbHVlKCk6JyUldmFsdWUnLCRtZXNzYWdlKTt9JG1lc3NhZ2U9dnNwcmludGYoJG1lc3NhZ2UsKGFycmF5KSRydWxlLT5hcmcpO3JldHVybiRtZXNzYWdlO319Y2xhc3MKTlJvYm90TG9hZGVyCmV4dGVuZHMKTkF1dG9Mb2FkZXJ7cHVibGljJHNjYW5EaXJzO3B1YmxpYyRpZ25vcmVEaXJzPScuKiwgKi5vbGQsICouYmFrLCAqLnRtcCwgdGVtcCc7cHVibGljJGFjY2VwdEZpbGVzPScqLnBocCwgKi5waHA1JztwdWJsaWMkYXV0b1JlYnVpbGQ7cHJpdmF0ZSRsaXN0PWFycmF5KCk7cHJpdmF0ZSRmaWxlcztwcml2YXRlJHJlYnVpbGRlZD1GQUxTRTtwcml2YXRlJGFjY2VwdE1hc2s7cHJpdmF0ZSRpZ25vcmVNYXNrO2Z1bmN0aW9uCl9fY29uc3RydWN0KCl7aWYoIWV4dGVuc2lvbl9sb2FkZWQoJ3Rva2VuaXplcicpKXt0aHJvdwpuZXcKRXhjZXB0aW9uKCJQSFAgZXh0ZW5zaW9uIFRva2VuaXplciBpcyBub3QgbG9hZGVkLiIpO319ZnVuY3Rpb24KcmVnaXN0ZXIoKXskY2FjaGU9JHRoaXMtPmdldENhY2hlKCk7JGtleT0kdGhpcy0+Z2V0S2V5KCk7aWYoaXNzZXQoJGNhY2hlWyRrZXldKSl7JHRoaXMtPmxpc3Q9JGNhY2hlWyRrZXldO31lbHNleyR0aGlzLT5yZWJ1aWxkKCk7fWlmKGlzc2V0KCR0aGlzLT5saXN0W3N0cnRvbG93ZXIoX19DTEFTU19fKV0pJiZjbGFzc19leGlzdHMoJ05OZXR0ZUxvYWRlcicsRkFMU0UpKXtOTmV0dGVMb2FkZXI6OmdldEluc3RhbmNlKCktPnVucmVnaXN0ZXIoKTt9cGFyZW50OjpyZWdpc3RlcigpO31mdW5jdGlvbgp0cnlMb2FkKCR0eXBlKXskdHlwZT1sdHJpbShzdHJ0b2xvd2VyKCR0eXBlKSwnXFwnKTtpZihpc3NldCgkdGhpcy0+bGlzdFskdHlwZV0pKXtpZigkdGhpcy0+bGlzdFskdHlwZV0hPT1GQUxTRSl7TkxpbWl0ZWRTY29wZTo6bG9hZCgkdGhpcy0+bGlzdFskdHlwZV1bMF0pO3NlbGY6OiRjb3VudCsrO319ZWxzZXskdGhpcy0+bGlzdFskdHlwZV09RkFMU0U7aWYoJHRoaXMtPmF1dG9SZWJ1aWxkPT09TlVMTCl7JHRoaXMtPmF1dG9SZWJ1aWxkPSEkdGhpcy0+aXNQcm9kdWN0aW9uKCk7fWlmKCR0aGlzLT5hdXRvUmVidWlsZCl7aWYoJHRoaXMtPnJlYnVpbGRlZCl7JHRoaXMtPmdldENhY2hlKCktPnNhdmUoJHRoaXMtPmdldEtleSgpLCR0aGlzLT5saXN0KTt9ZWxzZXskdGhpcy0+cmVidWlsZCgpO319aWYoJHRoaXMtPmxpc3RbJHR5cGVdIT09RkFMU0Upe05MaW1pdGVkU2NvcGU6OmxvYWQoJHRoaXMtPmxpc3RbJHR5cGVdWzBdKTtzZWxmOjokY291bnQrKzt9fX1mdW5jdGlvbgpyZWJ1aWxkKCl7JHRoaXMtPmdldENhY2hlKCktPnNhdmUoJHRoaXMtPmdldEtleSgpLGNhbGxiYWNrKCR0aGlzLCdfcmVidWlsZENhbGxiYWNrJykpOyR0aGlzLT5yZWJ1aWxkZWQ9VFJVRTt9ZnVuY3Rpb24KX3JlYnVpbGRDYWxsYmFjaygpeyR0aGlzLT5hY2NlcHRNYXNrPXNlbGY6OndpbGRjYXJkczJyZSgkdGhpcy0+YWNjZXB0RmlsZXMpOyR0aGlzLT5pZ25vcmVNYXNrPXNlbGY6OndpbGRjYXJkczJyZSgkdGhpcy0+aWdub3JlRGlycyk7Zm9yZWFjaCgkdGhpcy0+bGlzdAphcyRwYWlyKXtpZigkcGFpcikkdGhpcy0+ZmlsZXNbJHBhaXJbMF1dPSRwYWlyWzFdO31mb3JlYWNoKGFycmF5X3VuaXF1ZSgkdGhpcy0+c2NhbkRpcnMpYXMkZGlyKXskdGhpcy0+c2NhbkRpcmVjdG9yeSgkZGlyKTt9JHRoaXMtPmZpbGVzPU5VTEw7cmV0dXJuJHRoaXMtPmxpc3Q7fWZ1bmN0aW9uCmdldEluZGV4ZWRDbGFzc2VzKCl7JHJlcz1hcnJheSgpO2ZvcmVhY2goJHRoaXMtPmxpc3QKYXMkY2xhc3M9PiRwYWlyKXtpZigkcGFpcikkcmVzWyRjbGFzc109JHBhaXJbMF07fXJldHVybiRyZXM7fWZ1bmN0aW9uCmFkZERpcmVjdG9yeSgkcGF0aCl7Zm9yZWFjaCgoYXJyYXkpJHBhdGgKYXMkdmFsKXskcmVhbD1yZWFscGF0aCgkdmFsKTtpZigkcmVhbD09PUZBTFNFKXt0aHJvdwpuZXcKRGlyZWN0b3J5Tm90Rm91bmRFeGNlcHRpb24oIkRpcmVjdG9yeSAnJHZhbCcgbm90IGZvdW5kLiIpO30kdGhpcy0+c2NhbkRpcnNbXT0kcmVhbDt9fXByaXZhdGUKZnVuY3Rpb24KYWRkQ2xhc3MoJGNsYXNzLCRmaWxlLCR0aW1lKXskY2xhc3M9c3RydG9sb3dlcigkY2xhc3MpO2lmKCFlbXB0eSgkdGhpcy0+bGlzdFskY2xhc3NdKSYmJHRoaXMtPmxpc3RbJGNsYXNzXVswXSE9PSRmaWxlKXtzcGxfYXV0b2xvYWRfY2FsbCgkY2xhc3MpO3Rocm93Cm5ldwpJbnZhbGlkU3RhdGVFeGNlcHRpb24oIkFtYmlndW91cyBjbGFzcyAnJGNsYXNzJyByZXNvbHV0aW9uOyBkZWZpbmVkIGluICRmaWxlIGFuZCBpbiAiLiR0aGlzLT5saXN0WyRjbGFzc11bMF0uIi4iKTt9JHRoaXMtPmxpc3RbJGNsYXNzXT1hcnJheSgkZmlsZSwkdGltZSk7fXByaXZhdGUKZnVuY3Rpb24Kc2NhbkRpcmVjdG9yeSgkZGlyKXtpZihpc19maWxlKCRkaXIpKXtpZighaXNzZXQoJHRoaXMtPmZpbGVzWyRkaXJdKXx8JHRoaXMtPmZpbGVzWyRkaXJdIT09ZmlsZW10aW1lKCRkaXIpKXskdGhpcy0+c2NhblNjcmlwdCgkZGlyKTt9cmV0dXJuO30kaXRlcmF0b3I9ZGlyKCRkaXIpO2lmKCEkaXRlcmF0b3IpcmV0dXJuOyRkaXNhbGxvdz1hcnJheSgpO2lmKGlzX2ZpbGUoJGRpci4nL25ldHRlcm9ib3RzLnR4dCcpKXtmb3JlYWNoKGZpbGUoJGRpci4nL25ldHRlcm9ib3RzLnR4dCcpYXMkcyl7aWYocHJlZ19tYXRjaCgnI15kaXNhbGxvd1xccyo6XFxzKihcXFMrKSNpJywkcywkbSkpeyRkaXNhbGxvd1t0cmltKCRtWzFdLCcvJyldPVRSVUU7fX1pZihpc3NldCgkZGlzYWxsb3dbJyddKSlyZXR1cm47fXdoaWxlKEZBTFNFIT09KCRlbnRyeT0kaXRlcmF0b3ItPnJlYWQoKSkpe2lmKCRlbnRyeT09Jy4nfHwkZW50cnk9PScuLid8fGlzc2V0KCRkaXNhbGxvd1skZW50cnldKSljb250aW51ZTskcGF0aD0kZGlyLkRJUkVDVE9SWV9TRVBBUkFUT1IuJGVudHJ5O2lmKGlzX2RpcigkcGF0aCkpe2lmKCFwcmVnX21hdGNoKCR0aGlzLT5pZ25vcmVNYXNrLCRlbnRyeSkpeyR0aGlzLT5zY2FuRGlyZWN0b3J5KCRwYXRoKTt9Y29udGludWU7fWlmKGlzX2ZpbGUoJHBhdGgpJiZwcmVnX21hdGNoKCR0aGlzLT5hY2NlcHRNYXNrLCRlbnRyeSkpe2lmKCFpc3NldCgkdGhpcy0+ZmlsZXNbJHBhdGhdKXx8JHRoaXMtPmZpbGVzWyRwYXRoXSE9PWZpbGVtdGltZSgkcGF0aCkpeyR0aGlzLT5zY2FuU2NyaXB0KCRwYXRoKTt9fX0kaXRlcmF0b3ItPmNsb3NlKCk7fXByaXZhdGUKZnVuY3Rpb24Kc2NhblNjcmlwdCgkZmlsZSl7JFRfTkFNRVNQQUNFPVBIUF9WRVJTSU9OX0lEPDUwMzAwPy0xOlRfTkFNRVNQQUNFOyRUX05TX1NFUEFSQVRPUj1QSFBfVkVSU0lPTl9JRDw1MDMwMD8tMTpUX05TX1NFUEFSQVRPUjskZXhwZWN0ZWQ9RkFMU0U7JG5hbWVzcGFjZT0nJzskbGV2ZWw9MDskdGltZT1maWxlbXRpbWUoJGZpbGUpOyRzPWZpbGVfZ2V0X2NvbnRlbnRzKCRmaWxlKTtpZihwcmVnX21hdGNoKCcjLy9uZXR0ZScuJ2xvYWRlcj0oXFMqKSMnLCRzLCRtYXRjaGVzKSl7Zm9yZWFjaChleHBsb2RlKCcsJywkbWF0Y2hlc1sxXSlhcyRuYW1lKXskdGhpcy0+YWRkQ2xhc3MoJG5hbWUsJGZpbGUsJHRpbWUpO31yZXR1cm47fWZvcmVhY2godG9rZW5fZ2V0X2FsbCgkcylhcyR0b2tlbil7aWYoaXNfYXJyYXkoJHRva2VuKSl7c3dpdGNoKCR0b2tlblswXSl7Y2FzZQpUX0NPTU1FTlQ6Y2FzZQpUX0RPQ19DT01NRU5UOmNhc2UKVF9XSElURVNQQUNFOmNvbnRpbnVlCjI7Y2FzZSRUX05TX1NFUEFSQVRPUjpjYXNlClRfU1RSSU5HOmlmKCRleHBlY3RlZCl7JG5hbWUuPSR0b2tlblsxXTt9Y29udGludWUKMjtjYXNlJFRfTkFNRVNQQUNFOmNhc2UKVF9DTEFTUzpjYXNlClRfSU5URVJGQUNFOiRleHBlY3RlZD0kdG9rZW5bMF07JG5hbWU9Jyc7Y29udGludWUKMjtjYXNlClRfQ1VSTFlfT1BFTjpjYXNlClRfRE9MTEFSX09QRU5fQ1VSTFlfQlJBQ0VTOiRsZXZlbCsrO319aWYoJGV4cGVjdGVkKXtzd2l0Y2goJGV4cGVjdGVkKXtjYXNlClRfQ0xBU1M6Y2FzZQpUX0lOVEVSRkFDRTppZigkbGV2ZWw9PT0wKXskdGhpcy0+YWRkQ2xhc3MoJG5hbWVzcGFjZS4kbmFtZSwkZmlsZSwkdGltZSk7fWJyZWFrO2Nhc2UkVF9OQU1FU1BBQ0U6JG5hbWVzcGFjZT0kbmFtZS4nXFwnO30kZXhwZWN0ZWQ9TlVMTDt9aWYoJHRva2VuPT09J3snKXskbGV2ZWwrKzt9ZWxzZWlmKCR0b2tlbj09PSd9Jyl7JGxldmVsLS07fX19cHJpdmF0ZQpzdGF0aWMKZnVuY3Rpb24Kd2lsZGNhcmRzMnJlKCR3aWxkY2FyZHMpeyRtYXNrPWFycmF5KCk7Zm9yZWFjaChleHBsb2RlKCcsJywkd2lsZGNhcmRzKWFzJHdpbGRjYXJkKXskd2lsZGNhcmQ9dHJpbSgkd2lsZGNhcmQpOyR3aWxkY2FyZD1hZGRjc2xhc2hlcygkd2lsZGNhcmQsJy5cXCtbXl0kKCl7fT0hPjx8OiMnKTskd2lsZGNhcmQ9c3RydHIoJHdpbGRjYXJkLGFycmF5KCcqJz0+Jy4qJywnPyc9PicuJykpOyRtYXNrW109JHdpbGRjYXJkO31yZXR1cm4nI14oJy5pbXBsb2RlKCd8JywkbWFzaykuJykkI2knO31wcm90ZWN0ZWQKZnVuY3Rpb24KZ2V0Q2FjaGUoKXtyZXR1cm4KTkVudmlyb25tZW50OjpnZXRDYWNoZSgnTmV0dGUuUm9ib3RMb2FkZXInKTt9cHJvdGVjdGVkCmZ1bmN0aW9uCmdldEtleSgpe3JldHVybgptZDUoInYyfCR0aGlzLT5pZ25vcmVEaXJzfCR0aGlzLT5hY2NlcHRGaWxlc3wiLmltcGxvZGUoJ3wnLCR0aGlzLT5zY2FuRGlycykpO31wcm90ZWN0ZWQKZnVuY3Rpb24KaXNQcm9kdWN0aW9uKCl7cmV0dXJuCk5FbnZpcm9ubWVudDo6aXNQcm9kdWN0aW9uKCk7fX1jbGFzcwpOTWFpbE1pbWVQYXJ0CmV4dGVuZHMKTk9iamVjdHtjb25zdApFTkNPRElOR19CQVNFNjQ9J2Jhc2U2NCc7Y29uc3QKRU5DT0RJTkdfN0JJVD0nN2JpdCc7Y29uc3QKRU5DT0RJTkdfOEJJVD0nOGJpdCc7Y29uc3QKRU5DT0RJTkdfUVVPVEVEX1BSSU5UQUJMRT0ncXVvdGVkLXByaW50YWJsZSc7Y29uc3QKRU9MPSJcclxuIjtjb25zdApMSU5FX0xFTkdUSD03Njtwcml2YXRlJGhlYWRlcnM9YXJyYXkoKTtwcml2YXRlJHBhcnRzPWFycmF5KCk7cHJpdmF0ZSRib2R5O2Z1bmN0aW9uCnNldEhlYWRlcigkbmFtZSwkdmFsdWUsJGFwcGVuZD1GQUxTRSl7aWYoISRuYW1lfHxwcmVnX21hdGNoKCcjW15hLXowLTktXSNpJywkbmFtZSkpe3Rocm93Cm5ldwpJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIkhlYWRlciBuYW1lIG11c3QgYmUgbm9uLWVtcHR5IGFscGhhbnVtZXJpYyBzdHJpbmcsICckbmFtZScgZ2l2ZW4uIik7fWlmKCR2YWx1ZT09TlVMTCl7aWYoISRhcHBlbmQpe3Vuc2V0KCR0aGlzLT5oZWFkZXJzWyRuYW1lXSk7fX1lbHNlaWYoaXNfYXJyYXkoJHZhbHVlKSl7JHRtcD0mJHRoaXMtPmhlYWRlcnNbJG5hbWVdO2lmKCEkYXBwZW5kfHwhaXNfYXJyYXkoJHRtcCkpeyR0bXA9YXJyYXkoKTt9Zm9yZWFjaCgkdmFsdWUKYXMkZW1haWw9PiRuYW1lKXtpZigkbmFtZSE9PU5VTEwmJiFOU3RyaW5nOjpjaGVja0VuY29kaW5nKCRuYW1lKSl7dGhyb3cKbmV3CkludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiTmFtZSBpcyBub3QgdmFsaWQgVVRGLTggc3RyaW5nLiIpO31pZighcHJlZ19tYXRjaCgnI15bXkAiLFxzXStAW15AIixcc10rXC5bYS16XXsyLDEwfSQjaScsJGVtYWlsKSl7dGhyb3cKbmV3CkludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiRW1haWwgYWRkcmVzcyAnJGVtYWlsJyBpcyBub3QgdmFsaWQuIik7fWlmKHByZWdfbWF0Y2goJyNbXHJcbl0jJywkbmFtZSkpe3Rocm93Cm5ldwpJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIk5hbWUgY2Fubm90IGNvbnRhaW4gdGhlIGxpbmUgc2VwYXJhdG9yLiIpO30kdG1wWyRlbWFpbF09JG5hbWU7fX1lbHNleyR2YWx1ZT0oc3RyaW5nKSR2YWx1ZTtpZighTlN0cmluZzo6Y2hlY2tFbmNvZGluZygkdmFsdWUpKXt0aHJvdwpuZXcKSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJIZWFkZXIgaXMgbm90IHZhbGlkIFVURi04IHN0cmluZy4iKTt9JHRoaXMtPmhlYWRlcnNbJG5hbWVdPXByZWdfcmVwbGFjZSgnI1tcclxuXSsjJywnICcsJHZhbHVlKTt9cmV0dXJuJHRoaXM7fWZ1bmN0aW9uCmdldEhlYWRlcigkbmFtZSl7cmV0dXJuCmlzc2V0KCR0aGlzLT5oZWFkZXJzWyRuYW1lXSk/JHRoaXMtPmhlYWRlcnNbJG5hbWVdOk5VTEw7fWZ1bmN0aW9uCmNsZWFySGVhZGVyKCRuYW1lKXt1bnNldCgkdGhpcy0+aGVhZGVyc1skbmFtZV0pO3JldHVybiR0aGlzO31mdW5jdGlvbgpnZXRFbmNvZGVkSGVhZGVyKCRuYW1lKXskb2Zmc2V0PXN0cmxlbigkbmFtZSkrMjtpZighaXNzZXQoJHRoaXMtPmhlYWRlcnNbJG5hbWVdKSl7cmV0dXJuCk5VTEw7fWVsc2VpZihpc19hcnJheSgkdGhpcy0+aGVhZGVyc1skbmFtZV0pKXskcz0nJztmb3JlYWNoKCR0aGlzLT5oZWFkZXJzWyRuYW1lXWFzJGVtYWlsPT4kbmFtZSl7aWYoJG5hbWUhPU5VTEwpeyRzLj1zZWxmOjplbmNvZGVIZWFkZXIoc3Ryc3BuKCRuYW1lLCcuLDs8QD4oKVtdIj0/Jyk/JyInLmFkZGNzbGFzaGVzKCRuYW1lLCciXFwnKS4nIic6JG5hbWUsJG9mZnNldCk7JGVtYWlsPSIgPCRlbWFpbD4iO30kZW1haWwuPScsJztpZigkcyE9PScnJiYkb2Zmc2V0K3N0cmxlbigkZW1haWwpPnNlbGY6OkxJTkVfTEVOR1RIKXskcy49c2VsZjo6RU9MLiJcdCI7JG9mZnNldD0xO30kcy49JGVtYWlsOyRvZmZzZXQrPXN0cmxlbigkZW1haWwpO31yZXR1cm4Kc3Vic3RyKCRzLDAsLTEpO31lbHNle3JldHVybgpzZWxmOjplbmNvZGVIZWFkZXIoJHRoaXMtPmhlYWRlcnNbJG5hbWVdLCRvZmZzZXQpO319ZnVuY3Rpb24KZ2V0SGVhZGVycygpe3JldHVybiR0aGlzLT5oZWFkZXJzO31mdW5jdGlvbgpzZXRDb250ZW50VHlwZSgkY29udGVudFR5cGUsJGNoYXJzZXQ9TlVMTCl7JHRoaXMtPnNldEhlYWRlcignQ29udGVudC1UeXBlJywkY29udGVudFR5cGUuKCRjaGFyc2V0PyI7IGNoYXJzZXQ9JGNoYXJzZXQiOicnKSk7cmV0dXJuJHRoaXM7fWZ1bmN0aW9uCnNldEVuY29kaW5nKCRlbmNvZGluZyl7JHRoaXMtPnNldEhlYWRlcignQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZycsJGVuY29kaW5nKTtyZXR1cm4kdGhpczt9ZnVuY3Rpb24KZ2V0RW5jb2RpbmcoKXtyZXR1cm4kdGhpcy0+Z2V0SGVhZGVyKCdDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nJyk7fWZ1bmN0aW9uCmFkZFBhcnQoTk1haWxNaW1lUGFydCRwYXJ0PU5VTEwpe3JldHVybiR0aGlzLT5wYXJ0c1tdPSRwYXJ0PT09TlVMTD9uZXcKc2VsZjokcGFydDt9ZnVuY3Rpb24Kc2V0Qm9keSgkYm9keSl7JHRoaXMtPmJvZHk9JGJvZHk7cmV0dXJuJHRoaXM7fWZ1bmN0aW9uCmdldEJvZHkoKXtyZXR1cm4kdGhpcy0+Ym9keTt9ZnVuY3Rpb24KZ2VuZXJhdGVNZXNzYWdlKCl7JG91dHB1dD0nJzskYm91bmRhcnk9Jy0tLS0tLS0tJy5tZDUodW5pcWlkKCcnLFRSVUUpKTtmb3JlYWNoKCR0aGlzLT5oZWFkZXJzCmFzJG5hbWU9PiR2YWx1ZSl7JG91dHB1dC49JG5hbWUuJzogJy4kdGhpcy0+Z2V0RW5jb2RlZEhlYWRlcigkbmFtZSk7aWYoJHRoaXMtPnBhcnRzJiYkbmFtZT09PSdDb250ZW50LVR5cGUnKXskb3V0cHV0Lj0nOycuc2VsZjo6RU9MLiJcdGJvdW5kYXJ5PVwiJGJvdW5kYXJ5XCIiO30kb3V0cHV0Lj1zZWxmOjpFT0w7fSRvdXRwdXQuPXNlbGY6OkVPTDskYm9keT0oc3RyaW5nKSR0aGlzLT5ib2R5O2lmKCRib2R5IT09Jycpe3N3aXRjaCgkdGhpcy0+Z2V0RW5jb2RpbmcoKSl7Y2FzZQpzZWxmOjpFTkNPRElOR19RVU9URURfUFJJTlRBQkxFOiRvdXRwdXQuPWZ1bmN0aW9uX2V4aXN0cygncXVvdGVkX3ByaW50YWJsZV9lbmNvZGUnKT9xdW90ZWRfcHJpbnRhYmxlX2VuY29kZSgkYm9keSk6c2VsZjo6ZW5jb2RlUXVvdGVkUHJpbnRhYmxlKCRib2R5KTticmVhaztjYXNlCnNlbGY6OkVOQ09ESU5HX0JBU0U2NDokb3V0cHV0Lj1ydHJpbShjaHVua19zcGxpdChiYXNlNjRfZW5jb2RlKCRib2R5KSxzZWxmOjpMSU5FX0xFTkdUSCxzZWxmOjpFT0wpKTticmVhaztjYXNlCnNlbGY6OkVOQ09ESU5HXzdCSVQ6JGJvZHk9cHJlZ19yZXBsYWNlKCcjW1x4ODAtXHhGRl0rIycsJycsJGJvZHkpO2Nhc2UKc2VsZjo6RU5DT0RJTkdfOEJJVDokYm9keT1zdHJfcmVwbGFjZShhcnJheSgiXHgwMCIsIlxyIiksJycsJGJvZHkpOyRib2R5PXN0cl9yZXBsYWNlKCJcbiIsc2VsZjo6RU9MLCRib2R5KTskb3V0cHV0Lj0kYm9keTticmVhaztkZWZhdWx0OnRocm93Cm5ldwpJbnZhbGlkU3RhdGVFeGNlcHRpb24oJ1Vua25vd24gZW5jb2RpbmcnKTt9fWlmKCR0aGlzLT5wYXJ0cyl7aWYoc3Vic3RyKCRvdXRwdXQsLXN0cmxlbihzZWxmOjpFT0wpKSE9PXNlbGY6OkVPTCkkb3V0cHV0Lj1zZWxmOjpFT0w7Zm9yZWFjaCgkdGhpcy0+cGFydHMKYXMkcGFydCl7JG91dHB1dC49Jy0tJy4kYm91bmRhcnkuc2VsZjo6RU9MLiRwYXJ0LT5nZW5lcmF0ZU1lc3NhZ2UoKS5zZWxmOjpFT0w7fSRvdXRwdXQuPSctLScuJGJvdW5kYXJ5LictLSc7fXJldHVybiRvdXRwdXQ7fXByaXZhdGUKc3RhdGljCmZ1bmN0aW9uCmVuY29kZUhlYWRlcigkcywmJG9mZnNldD0wKXtpZihzdHJzcG4oJHMsIiFcIiMkJSZcJygpKissLS4vMDEyMzQ1Njc4OTo7PD5AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXFxdXmBhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fT0/IF9cclxuXHQiKT09PXN0cmxlbigkcykmJigkb2Zmc2V0K3N0cmxlbigkcyk8PXNlbGY6OkxJTkVfTEVOR1RIKSl7JG9mZnNldCs9c3RybGVuKCRzKTtyZXR1cm4kczt9JG89c3RyX3JlcGxhY2UoIlxuICIsIlxuXHQiLHN1YnN0cihpY29udl9taW1lX2VuY29kZShzdHJfcmVwZWF0KCcgJywkb2Zmc2V0KSwkcyxhcnJheSgnc2NoZW1lJz0+J0InLCdpbnB1dC1jaGFyc2V0Jz0+J1VURi04Jywnb3V0cHV0LWNoYXJzZXQnPT4nVVRGLTgnKSksJG9mZnNldCsyKSk7JG9mZnNldD1zdHJsZW4oJG8pLXN0cnJwb3MoJG8sIlxuIik7cmV0dXJuJG87fXN0YXRpYwpmdW5jdGlvbgplbmNvZGVRdW90ZWRQcmludGFibGUoJHMpeyRyYW5nZT0nISIjJCUmXCcoKSorLC0uLzAxMjM0NTY3ODk6Ozw+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9JzskcG9zPTA7JGxlbj0wOyRvPScnOyRzaXplPXN0cmxlbigkcyk7d2hpbGUoJHBvczwkc2l6ZSl7aWYoJGw9c3Ryc3BuKCRzLCRyYW5nZSwkcG9zKSl7d2hpbGUoJGxlbiskbD5zZWxmOjpMSU5FX0xFTkdUSC0xKXskbHg9c2VsZjo6TElORV9MRU5HVEgtJGxlbi0xOyRvLj1zdWJzdHIoJHMsJHBvcywkbHgpLic9Jy5zZWxmOjpFT0w7JHBvcys9JGx4OyRsLT0kbHg7JGxlbj0wO30kby49c3Vic3RyKCRzLCRwb3MsJGwpOyRsZW4rPSRsOyRwb3MrPSRsO31lbHNleyRsZW4rPTM7aWYoJGxlbj5zZWxmOjpMSU5FX0xFTkdUSC0xKXskby49Jz0nLnNlbGY6OkVPTDskbGVuPTM7fSRvLj0nPScuc3RydG91cHBlcihiaW4yaGV4KCRzWyRwb3NdKSk7JHBvcysrO319cmV0dXJuCnJ0cmltKCRvLCc9Jy5zZWxmOjpFT0wpO319Y2xhc3MKTk1haWwKZXh0ZW5kcwpOTWFpbE1pbWVQYXJ0e2NvbnN0CkhJR0g9MTtjb25zdApOT1JNQUw9Mztjb25zdApMT1c9NTtwdWJsaWMKc3RhdGljJGRlZmF1bHRNYWlsZXI9J05TZW5kbWFpbE1haWxlcic7cHVibGljCnN0YXRpYyRkZWZhdWx0SGVhZGVycz1hcnJheSgnTUlNRS1WZXJzaW9uJz0+JzEuMCcsJ1gtTWFpbGVyJz0+J05ldHRlIEZyYW1ld29yaycpO3ByaXZhdGUkbWFpbGVyO3ByaXZhdGUkYXR0YWNobWVudHM9YXJyYXkoKTtwcml2YXRlJGlubGluZXM9YXJyYXkoKTtwcml2YXRlJGh0bWw7cHJpdmF0ZSRiYXNlUGF0aDtmdW5jdGlvbgpfX2NvbnN0cnVjdCgpe2ZvcmVhY2goc2VsZjo6JGRlZmF1bHRIZWFkZXJzCmFzJG5hbWU9PiR2YWx1ZSl7JHRoaXMtPnNldEhlYWRlcigkbmFtZSwkdmFsdWUpO30kdGhpcy0+c2V0SGVhZGVyKCdEYXRlJyxkYXRlKCdyJykpO31mdW5jdGlvbgpzZXRGcm9tKCRlbWFpbCwkbmFtZT1OVUxMKXskdGhpcy0+c2V0SGVhZGVyKCdGcm9tJywkdGhpcy0+Zm9ybWF0RW1haWwoJGVtYWlsLCRuYW1lKSk7cmV0dXJuJHRoaXM7fWZ1bmN0aW9uCmdldEZyb20oKXtyZXR1cm4kdGhpcy0+Z2V0SGVhZGVyKCdGcm9tJyk7fWZ1bmN0aW9uCmFkZFJlcGx5VG8oJGVtYWlsLCRuYW1lPU5VTEwpeyR0aGlzLT5zZXRIZWFkZXIoJ1JlcGx5LVRvJywkdGhpcy0+Zm9ybWF0RW1haWwoJGVtYWlsLCRuYW1lKSxUUlVFKTtyZXR1cm4kdGhpczt9ZnVuY3Rpb24Kc2V0U3ViamVjdCgkc3ViamVjdCl7JHRoaXMtPnNldEhlYWRlcignU3ViamVjdCcsJHN1YmplY3QpO3JldHVybiR0aGlzO31mdW5jdGlvbgpnZXRTdWJqZWN0KCl7cmV0dXJuJHRoaXMtPmdldEhlYWRlcignU3ViamVjdCcpO31mdW5jdGlvbgphZGRUbygkZW1haWwsJG5hbWU9TlVMTCl7JHRoaXMtPnNldEhlYWRlcignVG8nLCR0aGlzLT5mb3JtYXRFbWFpbCgkZW1haWwsJG5hbWUpLFRSVUUpO3JldHVybiR0aGlzO31mdW5jdGlvbgphZGRDYygkZW1haWwsJG5hbWU9TlVMTCl7JHRoaXMtPnNldEhlYWRlcignQ2MnLCR0aGlzLT5mb3JtYXRFbWFpbCgkZW1haWwsJG5hbWUpLFRSVUUpO3JldHVybiR0aGlzO31mdW5jdGlvbgphZGRCY2MoJGVtYWlsLCRuYW1lPU5VTEwpeyR0aGlzLT5zZXRIZWFkZXIoJ0JjYycsJHRoaXMtPmZvcm1hdEVtYWlsKCRlbWFpbCwkbmFtZSksVFJVRSk7cmV0dXJuJHRoaXM7fXByaXZhdGUKZnVuY3Rpb24KZm9ybWF0RW1haWwoJGVtYWlsLCRuYW1lKXtpZighJG5hbWUmJnByZWdfbWF0Y2goJyNeKC4rKSArPCguKik+JCMnLCRlbWFpbCwkbWF0Y2hlcykpe3JldHVybgphcnJheSgkbWF0Y2hlc1syXT0+JG1hdGNoZXNbMV0pO31lbHNle3JldHVybgphcnJheSgkZW1haWw9PiRuYW1lKTt9fWZ1bmN0aW9uCnNldFJldHVyblBhdGgoJGVtYWlsKXskdGhpcy0+c2V0SGVhZGVyKCdSZXR1cm4tUGF0aCcsJGVtYWlsKTtyZXR1cm4kdGhpczt9ZnVuY3Rpb24KZ2V0UmV0dXJuUGF0aCgpe3JldHVybiR0aGlzLT5nZXRIZWFkZXIoJ0Zyb20nKTt9ZnVuY3Rpb24Kc2V0UHJpb3JpdHkoJHByaW9yaXR5KXskdGhpcy0+c2V0SGVhZGVyKCdYLVByaW9yaXR5JywoaW50KSRwcmlvcml0eSk7cmV0dXJuJHRoaXM7fWZ1bmN0aW9uCmdldFByaW9yaXR5KCl7cmV0dXJuJHRoaXMtPmdldEhlYWRlcignWC1Qcmlvcml0eScpO31mdW5jdGlvbgpzZXRIdG1sQm9keSgkaHRtbCwkYmFzZVBhdGg9TlVMTCl7JHRoaXMtPmh0bWw9JGh0bWw7JHRoaXMtPmJhc2VQYXRoPSRiYXNlUGF0aDtyZXR1cm4kdGhpczt9ZnVuY3Rpb24KZ2V0SHRtbEJvZHkoKXtyZXR1cm4kdGhpcy0+aHRtbDt9ZnVuY3Rpb24KYWRkRW1iZWRkZWRGaWxlKCRmaWxlLCRjb250ZW50PU5VTEwsJGNvbnRlbnRUeXBlPU5VTEwpeyRwYXJ0PW5ldwpOTWFpbE1pbWVQYXJ0OyRwYXJ0LT5zZXRCb2R5KCRjb250ZW50PT09TlVMTD8kdGhpcy0+cmVhZEZpbGUoJGZpbGUsJGNvbnRlbnRUeXBlKTooc3RyaW5nKSRjb250ZW50KTskcGFydC0+c2V0Q29udGVudFR5cGUoJGNvbnRlbnRUeXBlPyRjb250ZW50VHlwZTonYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJyk7JHBhcnQtPnNldEVuY29kaW5nKHNlbGY6OkVOQ09ESU5HX0JBU0U2NCk7JHBhcnQtPnNldEhlYWRlcignQ29udGVudC1EaXNwb3NpdGlvbicsJ2lubGluZTsgZmlsZW5hbWU9IicuTlN0cmluZzo6Zml4RW5jb2RpbmcoYmFzZW5hbWUoJGZpbGUpKS4nIicpOyRwYXJ0LT5zZXRIZWFkZXIoJ0NvbnRlbnQtSUQnLCc8Jy5tZDUodW5pcWlkKCcnLFRSVUUpKS4nPicpO3JldHVybiR0aGlzLT5pbmxpbmVzWyRmaWxlXT0kcGFydDt9ZnVuY3Rpb24KYWRkQXR0YWNobWVudCgkZmlsZSwkY29udGVudD1OVUxMLCRjb250ZW50VHlwZT1OVUxMKXskcGFydD1uZXcKTk1haWxNaW1lUGFydDskcGFydC0+c2V0Qm9keSgkY29udGVudD09PU5VTEw/JHRoaXMtPnJlYWRGaWxlKCRmaWxlLCRjb250ZW50VHlwZSk6KHN0cmluZykkY29udGVudCk7JHBhcnQtPnNldENvbnRlbnRUeXBlKCRjb250ZW50VHlwZT8kY29udGVudFR5cGU6J2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScpOyRwYXJ0LT5zZXRFbmNvZGluZyhzZWxmOjpFTkNPRElOR19CQVNFNjQpOyRwYXJ0LT5zZXRIZWFkZXIoJ0NvbnRlbnQtRGlzcG9zaXRpb24nLCdhdHRhY2htZW50OyBmaWxlbmFtZT0iJy5OU3RyaW5nOjpmaXhFbmNvZGluZyhiYXNlbmFtZSgkZmlsZSkpLiciJyk7cmV0dXJuJHRoaXMtPmF0dGFjaG1lbnRzW109JHBhcnQ7fXByaXZhdGUKZnVuY3Rpb24KcmVhZEZpbGUoJGZpbGUsJiRjb250ZW50VHlwZSl7aWYoIWlzX2ZpbGUoJGZpbGUpKXt0aHJvdwpuZXcKRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCJGaWxlICckZmlsZScgbm90IGZvdW5kLiIpO31pZighJGNvbnRlbnRUeXBlJiYkaW5mbz1nZXRpbWFnZXNpemUoJGZpbGUpKXskY29udGVudFR5cGU9JGluZm9bJ21pbWUnXTt9cmV0dXJuCmZpbGVfZ2V0X2NvbnRlbnRzKCRmaWxlKTt9ZnVuY3Rpb24Kc2VuZCgpeyR0aGlzLT5nZXRNYWlsZXIoKS0+c2VuZCgkdGhpcy0+YnVpbGQoKSk7fWZ1bmN0aW9uCnNldE1haWxlcihJTWFpbGVyJG1haWxlcil7JHRoaXMtPm1haWxlcj0kbWFpbGVyO3JldHVybiR0aGlzO31mdW5jdGlvbgpnZXRNYWlsZXIoKXtpZigkdGhpcy0+bWFpbGVyPT09TlVMTCl7aWYoJGE9c3RycnBvcyhzZWxmOjokZGVmYXVsdE1haWxlciwnXFwnKSlzZWxmOjokZGVmYXVsdE1haWxlcj1zdWJzdHIoc2VsZjo6JGRlZmF1bHRNYWlsZXIsJGErMSk7JHRoaXMtPm1haWxlcj1pc19vYmplY3Qoc2VsZjo6JGRlZmF1bHRNYWlsZXIpP3NlbGY6OiRkZWZhdWx0TWFpbGVyOm5ldwpzZWxmOjokZGVmYXVsdE1haWxlcjt9cmV0dXJuJHRoaXMtPm1haWxlcjt9cHJvdGVjdGVkCmZ1bmN0aW9uCmJ1aWxkKCl7JG1haWw9Y2xvbmUkdGhpczskaG9zdG5hbWU9aXNzZXQoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKT8kX1NFUlZFUlsnSFRUUF9IT1NUJ106KGlzc2V0KCRfU0VSVkVSWydTRVJWRVJfTkFNRSddKT8kX1NFUlZFUlsnU0VSVkVSX05BTUUnXTonbG9jYWxob3N0Jyk7JG1haWwtPnNldEhlYWRlcignTWVzc2FnZS1JRCcsJzwnLm1kNSh1bmlxaWQoJycsVFJVRSkpLiJAJGhvc3RuYW1lPiIpOyRtYWlsLT5idWlsZEh0bWwoKTskbWFpbC0+YnVpbGRUZXh0KCk7JGN1cnNvcj0kbWFpbDtpZigkbWFpbC0+YXR0YWNobWVudHMpeyR0bXA9JGN1cnNvci0+c2V0Q29udGVudFR5cGUoJ211bHRpcGFydC9taXhlZCcpOyRjdXJzb3I9JGN1cnNvci0+YWRkUGFydCgpO2ZvcmVhY2goJG1haWwtPmF0dGFjaG1lbnRzCmFzJHZhbHVlKXskdG1wLT5hZGRQYXJ0KCR2YWx1ZSk7fX1pZigkbWFpbC0+aHRtbCE9TlVMTCl7JHRtcD0kY3Vyc29yLT5zZXRDb250ZW50VHlwZSgnbXVsdGlwYXJ0L2FsdGVybmF0aXZlJyk7JGN1cnNvcj0kY3Vyc29yLT5hZGRQYXJ0KCk7JGFsdD0kdG1wLT5hZGRQYXJ0KCk7aWYoJG1haWwtPmlubGluZXMpeyR0bXA9JGFsdC0+c2V0Q29udGVudFR5cGUoJ211bHRpcGFydC9yZWxhdGVkJyk7JGFsdD0kYWx0LT5hZGRQYXJ0KCk7Zm9yZWFjaCgkbWFpbC0+aW5saW5lcwphcyRuYW1lPT4kdmFsdWUpeyR0bXAtPmFkZFBhcnQoJHZhbHVlKTt9fSRhbHQtPnNldENvbnRlbnRUeXBlKCd0ZXh0L2h0bWwnLCdVVEYtOCcpLT5zZXRFbmNvZGluZyhwcmVnX21hdGNoKCcjW1x4ODAtXHhGRl0jJywkbWFpbC0+aHRtbCk/c2VsZjo6RU5DT0RJTkdfOEJJVDpzZWxmOjpFTkNPRElOR183QklUKS0+c2V0Qm9keSgkbWFpbC0+aHRtbCk7fSR0ZXh0PSRtYWlsLT5nZXRCb2R5KCk7JG1haWwtPnNldEJvZHkoTlVMTCk7JGN1cnNvci0+c2V0Q29udGVudFR5cGUoJ3RleHQvcGxhaW4nLCdVVEYtOCcpLT5zZXRFbmNvZGluZyhwcmVnX21hdGNoKCcjW1x4ODAtXHhGRl0jJywkdGV4dCk/c2VsZjo6RU5DT0RJTkdfOEJJVDpzZWxmOjpFTkNPRElOR183QklUKS0+c2V0Qm9keSgkdGV4dCk7cmV0dXJuJG1haWw7fXByb3RlY3RlZApmdW5jdGlvbgpidWlsZEh0bWwoKXtpZigkdGhpcy0+aHRtbAppbnN0YW5jZW9mCklUZW1wbGF0ZSl7JHRoaXMtPmh0bWwtPm1haWw9JHRoaXM7aWYoJHRoaXMtPmJhc2VQYXRoPT09TlVMTCYmJHRoaXMtPmh0bWwKaW5zdGFuY2VvZgpJRmlsZVRlbXBsYXRlKXskdGhpcy0+YmFzZVBhdGg9ZGlybmFtZSgkdGhpcy0+aHRtbC0+Z2V0RmlsZSgpKTt9JHRoaXMtPmh0bWw9JHRoaXMtPmh0bWwtPl9fdG9TdHJpbmcoVFJVRSk7fWlmKCR0aGlzLT5iYXNlUGF0aCE9PUZBTFNFKXskY2lkcz1hcnJheSgpO3ByZWdfbWF0Y2hfYWxsKCcjKHNyY1xzKj1ccyp8YmFja2dyb3VuZFxzKj1ccyp8dXJsXCgpKFsiXCddKSg/IVthLXpdKzp8Wy9cXCNdKSguKz8pXFwyI2knLCR0aGlzLT5odG1sLCRtYXRjaGVzLFBSRUdfU0VUX09SREVSfFBSRUdfT0ZGU0VUX0NBUFRVUkUpO2ZvcmVhY2goYXJyYXlfcmV2ZXJzZSgkbWF0Y2hlcylhcyRtKXskZmlsZT1ydHJpbSgkdGhpcy0+YmFzZVBhdGgsJy9cXCcpLicvJy4kbVszXVswXTskY2lkPWlzc2V0KCRjaWRzWyRmaWxlXSk/JGNpZHNbJGZpbGVdOiRjaWRzWyRmaWxlXT1zdWJzdHIoJHRoaXMtPmFkZEVtYmVkZGVkRmlsZSgkZmlsZSktPmdldEhlYWRlcigiQ29udGVudC1JRCIpLDEsLTEpOyR0aGlzLT5odG1sPXN1YnN0cl9yZXBsYWNlKCR0aGlzLT5odG1sLCJ7JG1bMV1bMF19eyRtWzJdWzBdfWNpZDokY2lkeyRtWzJdWzBdfSIsJG1bMF1bMV0sc3RybGVuKCRtWzBdWzBdKSk7fX1pZighJHRoaXMtPmdldFN1YmplY3QoKSYmcHJlZ19tYXRjaCgnIzx0aXRsZT4oLis/KTwvdGl0bGU+I2lzJywkdGhpcy0+aHRtbCwkbWF0Y2hlcykpeyR0aGlzLT5zZXRTdWJqZWN0KGh0bWxfZW50aXR5X2RlY29kZSgkbWF0Y2hlc1sxXSxFTlRfUVVPVEVTLCdVVEYtOCcpKTt9fXByb3RlY3RlZApmdW5jdGlvbgpidWlsZFRleHQoKXskdGV4dD0kdGhpcy0+Z2V0Qm9keSgpO2lmKCR0ZXh0Cmluc3RhbmNlb2YKSVRlbXBsYXRlKXskdGV4dC0+bWFpbD0kdGhpczskdGhpcy0+c2V0Qm9keSgkdGV4dC0+X190b1N0cmluZyhUUlVFKSk7fWVsc2VpZigkdGV4dD09TlVMTCYmJHRoaXMtPmh0bWwhPU5VTEwpeyR0ZXh0PXByZWdfcmVwbGFjZSgnIzwoc3R5bGV8c2NyaXB0fGhlYWQpLio8L1xcMT4jVWlzJywnJywkdGhpcy0+aHRtbCk7JHRleHQ9cHJlZ19yZXBsYWNlKCcjPHRbZGhdWyA+XSNpJywiICQwIiwkdGV4dCk7JHRleHQ9cHJlZ19yZXBsYWNlKCcjWyBcdFxyXG5dKyMnLCcgJywkdGV4dCk7JHRleHQ9cHJlZ19yZXBsYWNlKCcjPCgvP3B8Lz9oXGR8bGl8YnJ8L3RyKVsgPl0jaScsIlxuJDAiLCR0ZXh0KTskdGV4dD1odG1sX2VudGl0eV9kZWNvZGUoc3RyaXBfdGFncygkdGV4dCksRU5UX1FVT1RFUywnVVRGLTgnKTskdGhpcy0+c2V0Qm9keSh0cmltKCR0ZXh0KSk7fX19Y2xhc3MKTlNlbmRtYWlsTWFpbGVyCmV4dGVuZHMKTk9iamVjdAppbXBsZW1lbnRzCklNYWlsZXJ7ZnVuY3Rpb24Kc2VuZChOTWFpbCRtYWlsKXskdG1wPWNsb25lJG1haWw7JHRtcC0+c2V0SGVhZGVyKCdTdWJqZWN0JyxOVUxMKTskdG1wLT5zZXRIZWFkZXIoJ1RvJyxOVUxMKTskcGFydHM9ZXhwbG9kZShOTWFpbDo6RU9MLk5NYWlsOjpFT0wsJHRtcC0+Z2VuZXJhdGVNZXNzYWdlKCksMik7TlRvb2xzOjp0cnlFcnJvcigpOyRyZXM9bWFpbChzdHJfcmVwbGFjZShOTWFpbDo6RU9MLFBIUF9FT0wsJG1haWwtPmdldEVuY29kZWRIZWFkZXIoJ1RvJykpLHN0cl9yZXBsYWNlKE5NYWlsOjpFT0wsUEhQX0VPTCwkbWFpbC0+Z2V0RW5jb2RlZEhlYWRlcignU3ViamVjdCcpKSxzdHJfcmVwbGFjZShOTWFpbDo6RU9MLFBIUF9FT0wsJHBhcnRzWzFdKSxzdHJfcmVwbGFjZShOTWFpbDo6RU9MLFBIUF9FT0wsJHBhcnRzWzBdKSk7aWYoTlRvb2xzOjpjYXRjaEVycm9yKCRtc2cpKXt0aHJvdwpuZXcKSW52YWxpZFN0YXRlRXhjZXB0aW9uKCRtc2cpO31lbHNlaWYoISRyZXMpe3Rocm93Cm5ldwpJbnZhbGlkU3RhdGVFeGNlcHRpb24oJ1VuYWJsZSB0byBzZW5kIGVtYWlsLicpO319fWNsYXNzCk5Bbm5vdGF0aW9uCmV4dGVuZHMKTk9iamVjdAppbXBsZW1lbnRzCklBbm5vdGF0aW9ue2Z1bmN0aW9uCl9fY29uc3RydWN0KGFycmF5JHZhbHVlcyl7Zm9yZWFjaCgkdmFsdWVzCmFzJGs9PiR2KXskdGhpcy0+JGs9JHY7fX1mdW5jdGlvbgpfX3RvU3RyaW5nKCl7cmV0dXJuJHRoaXMtPnZhbHVlO319ZmluYWwKY2xhc3MKTkFubm90YXRpb25ze3B1YmxpYwpzdGF0aWMkdXNlUmVmbGVjdGlvbjtzdGF0aWMKZnVuY3Rpb24KaGFzKFJlZmxlY3RvciRyLCRuYW1lKXt0cmlnZ2VyX2Vycm9yKF9fTUVUSE9EX18uJygpIGlzIGRlcHJlY2F0ZWQ7IHVzZSBnZXRSZWZsZWN0aW9uKCktPmhhc0Fubm90YXRpb24oKSBpbnN0ZWFkLicsRV9VU0VSX1dBUk5JTkcpOyRjYWNoZT1OQW5ub3RhdGlvbnNQYXJzZXI6OmdldEFsbCgkcik7cmV0dXJuIWVtcHR5KCRjYWNoZVskbmFtZV0pO31zdGF0aWMKZnVuY3Rpb24KZ2V0KFJlZmxlY3RvciRyLCRuYW1lKXt0cmlnZ2VyX2Vycm9yKF9fTUVUSE9EX18uJygpIGlzIGRlcHJlY2F0ZWQ7IHVzZSBnZXRSZWZsZWN0aW9uKCktPmdldEFubm90YXRpb24oKSBpbnN0ZWFkLicsRV9VU0VSX1dBUk5JTkcpOyRjYWNoZT1OQW5ub3RhdGlvbnNQYXJzZXI6OmdldEFsbCgkcik7cmV0dXJuCmlzc2V0KCRjYWNoZVskbmFtZV0pP2VuZCgkY2FjaGVbJG5hbWVdKTpOVUxMO31zdGF0aWMKZnVuY3Rpb24KZ2V0QWxsKFJlZmxlY3RvciRyLCRuYW1lPU5VTEwpe3RyaWdnZXJfZXJyb3IoX19NRVRIT0RfXy4nKCkgaXMgZGVwcmVjYXRlZDsgdXNlIGdldFJlZmxlY3Rpb24oKS0+Z2V0QW5ub3RhdGlvbnMoKSBpbnN0ZWFkLicsRV9VU0VSX1dBUk5JTkcpOyRjYWNoZT1OQW5ub3RhdGlvbnNQYXJzZXI6OmdldEFsbCgkcik7aWYoJG5hbWU9PT1OVUxMKXtyZXR1cm4kY2FjaGU7fWVsc2VpZihpc3NldCgkY2FjaGVbJG5hbWVdKSl7cmV0dXJuJGNhY2hlWyRuYW1lXTt9ZWxzZXtyZXR1cm4KYXJyYXkoKTt9fX0vKioKICogTkFubm90YXRpb25zIHN1cHBvcnQgZm9yIFBIUC4KICoKICogQGNvcHlyaWdodCAgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDEwIERhdmlkIEdydWRsCiAqIEBwYWNrYWdlICAgIE5ldHRlXFJlZmxlY3Rpb24KICogQEFubm90YXRpb24KICovZmluYWwKY2xhc3MKTkFubm90YXRpb25zUGFyc2Vye2NvbnN0ClJFX1NUUklORz0nXCcoPzpcXFxcLnxbXlwnXFxcXF0pKlwnfCIoPzpcXFxcLnxbXiJcXFxcXSkqIic7Y29uc3QKUkVfSURFTlRJRklFUj0nW19hLXpBLVpceDdGLVx4RkZdW19hLXpBLVowLTlceDdGLVx4RkZdKic7cHVibGljCnN0YXRpYyR1c2VSZWZsZWN0aW9uO3ByaXZhdGUKc3RhdGljJGNhY2hlO3ByaXZhdGUKc3RhdGljJHRpbWVzdGFtcHM7ZmluYWwKZnVuY3Rpb24KX19jb25zdHJ1Y3QoKXt0aHJvdwpuZXcKTG9naWNFeGNlcHRpb24oIkNhbm5vdCBpbnN0YW50aWF0ZSBzdGF0aWMgY2xhc3MgIi5nZXRfY2xhc3MoJHRoaXMpKTt9c3RhdGljCmZ1bmN0aW9uCmdldEFsbChSZWZsZWN0b3Ikcil7aWYoJHIKaW5zdGFuY2VvZgpSZWZsZWN0aW9uQ2xhc3MpeyR0eXBlPSRyLT5nZXROYW1lKCk7JG1lbWJlcj0nJzt9ZWxzZWlmKCRyCmluc3RhbmNlb2YKUmVmbGVjdGlvbk1ldGhvZCl7JHR5cGU9JHItPmdldERlY2xhcmluZ0NsYXNzKCktPmdldE5hbWUoKTskbWVtYmVyPSRyLT5nZXROYW1lKCk7fWVsc2V7JHR5cGU9JHItPmdldERlY2xhcmluZ0NsYXNzKCktPmdldE5hbWUoKTskbWVtYmVyPSckJy4kci0+Z2V0TmFtZSgpO31pZighc2VsZjo6JHVzZVJlZmxlY3Rpb24peyRmaWxlPSRyCmluc3RhbmNlb2YKUmVmbGVjdGlvbkNsYXNzPyRyLT5nZXRGaWxlTmFtZSgpOiRyLT5nZXREZWNsYXJpbmdDbGFzcygpLT5nZXRGaWxlTmFtZSgpO2lmKCRmaWxlJiZpc3NldChzZWxmOjokdGltZXN0YW1wc1skZmlsZV0pJiZzZWxmOjokdGltZXN0YW1wc1skZmlsZV0hPT1maWxlbXRpbWUoJGZpbGUpKXt1bnNldChzZWxmOjokY2FjaGVbJHR5cGVdKTt9dW5zZXQoc2VsZjo6JHRpbWVzdGFtcHNbJGZpbGVdKTt9aWYoaXNzZXQoc2VsZjo6JGNhY2hlWyR0eXBlXVskbWVtYmVyXSkpe3JldHVybgpzZWxmOjokY2FjaGVbJHR5cGVdWyRtZW1iZXJdO31pZihzZWxmOjokdXNlUmVmbGVjdGlvbj09PU5VTEwpe3NlbGY6OiR1c2VSZWZsZWN0aW9uPShib29sKU5DbGFzc1JlZmxlY3Rpb246OmZyb20oX19DTEFTU19fKS0+Z2V0RG9jQ29tbWVudCgpO31pZihzZWxmOjokdXNlUmVmbGVjdGlvbil7cmV0dXJuCnNlbGY6OiRjYWNoZVskdHlwZV1bJG1lbWJlcl09c2VsZjo6cGFyc2VDb21tZW50KCRyLT5nZXREb2NDb21tZW50KCkpO31lbHNle2lmKHNlbGY6OiRjYWNoZT09PU5VTEwpe3NlbGY6OiRjYWNoZT0oYXJyYXkpc2VsZjo6Z2V0Q2FjaGUoKS0+b2Zmc2V0R2V0KCdsaXN0Jyk7c2VsZjo6JHRpbWVzdGFtcHM9aXNzZXQoc2VsZjo6JGNhY2hlWycqJ10pP3NlbGY6OiRjYWNoZVsnKiddOmFycmF5KCk7fWlmKCFpc3NldChzZWxmOjokY2FjaGVbJHR5cGVdKSYmJGZpbGUpe3NlbGY6OiRjYWNoZVsnKiddWyRmaWxlXT1maWxlbXRpbWUoJGZpbGUpO3NlbGY6OnBhcnNlU2NyaXB0KCRmaWxlKTtzZWxmOjpnZXRDYWNoZSgpLT5zYXZlKCdsaXN0JyxzZWxmOjokY2FjaGUpO31pZihpc3NldChzZWxmOjokY2FjaGVbJHR5cGVdWyRtZW1iZXJdKSl7cmV0dXJuCnNlbGY6OiRjYWNoZVskdHlwZV1bJG1lbWJlcl07fWVsc2V7cmV0dXJuCnNlbGY6OiRjYWNoZVskdHlwZV1bJG1lbWJlcl09YXJyYXkoKTt9fX1wcml2YXRlCnN0YXRpYwpmdW5jdGlvbgpwYXJzZUNvbW1lbnQoJGNvbW1lbnQpe3N0YXRpYyR0b2tlbnM9YXJyYXkoJ3RydWUnPT5UUlVFLCdmYWxzZSc9PkZBTFNFLCdudWxsJz0+TlVMTCwnJz0+VFJVRSk7cHJlZ19tYXRjaF9hbGwoJ34KCQkJQCgnLnNlbGY6OlJFX0lERU5USUZJRVIuJylbIFx0XSogICAgICAgICAgICAgIyMgIGFubm90YXRpb24KCQkJKAoJCQkJXCgoPz4nLnNlbGY6OlJFX1NUUklORy4nfFteXCciKUBdKykrXCl8ICAjIyAgKHZhbHVlKQoJCQkJW14oQFxyXG5dW15AXHJcbl0qfCkgICAgICAgICAgICAgICAgICAgICAjIyAgdmFsdWUKCQl+eGknLHRyaW0oJGNvbW1lbnQsJy8qJyksJG1hdGNoZXMsUFJFR19TRVRfT1JERVIpOyRyZXM9YXJyYXkoKTtmb3JlYWNoKCRtYXRjaGVzCmFzJG1hdGNoKXtsaXN0KCwkbmFtZSwkdmFsdWUpPSRtYXRjaDtpZihzdWJzdHIoJHZhbHVlLDAsMSk9PT0nKCcpeyRpdGVtcz1hcnJheSgpOyRrZXk9Jyc7JHZhbD1UUlVFOyR2YWx1ZVswXT0nLCc7d2hpbGUocHJlZ19tYXRjaCgnI1xzKixccyooPz4oJy5zZWxmOjpSRV9JREVOVElGSUVSLicpXHMqPVxzKik/KCcuc2VsZjo6UkVfU1RSSU5HLid8W15cJyIpLFxzXVteXCciKSxdKikjQScsJHZhbHVlLCRtKSl7JHZhbHVlPXN1YnN0cigkdmFsdWUsc3RybGVuKCRtWzBdKSk7bGlzdCgsJGtleSwkdmFsKT0kbTtpZigkdmFsWzBdPT09IicifHwkdmFsWzBdPT09JyInKXskdmFsPXN1YnN0cigkdmFsLDEsLTEpO31lbHNlaWYoaXNfbnVtZXJpYygkdmFsKSl7JHZhbD0xKiR2YWw7fWVsc2V7JGx2YWw9c3RydG9sb3dlcigkdmFsKTskdmFsPWFycmF5X2tleV9leGlzdHMoJGx2YWwsJHRva2Vucyk/JHRva2Vuc1skbHZhbF06JHZhbDt9aWYoJGtleT09PScnKXskaXRlbXNbXT0kdmFsO31lbHNleyRpdGVtc1ska2V5XT0kdmFsO319JHZhbHVlPWNvdW50KCRpdGVtcyk8MiYmJGtleT09PScnPyR2YWw6JGl0ZW1zO31lbHNleyR2YWx1ZT10cmltKCR2YWx1ZSk7aWYoaXNfbnVtZXJpYygkdmFsdWUpKXskdmFsdWU9MSokdmFsdWU7fWVsc2V7JGx2YWw9c3RydG9sb3dlcigkdmFsdWUpOyR2YWx1ZT1hcnJheV9rZXlfZXhpc3RzKCRsdmFsLCR0b2tlbnMpPyR0b2tlbnNbJGx2YWxdOiR2YWx1ZTt9fSRjbGFzcz0kbmFtZS4nQW5ub3RhdGlvbic7aWYoY2xhc3NfZXhpc3RzKCRjbGFzcykpeyRyZXNbJG5hbWVdW109bmV3JGNsYXNzKGlzX2FycmF5KCR2YWx1ZSk/JHZhbHVlOmFycmF5KCd2YWx1ZSc9PiR2YWx1ZSkpO31lbHNleyRyZXNbJG5hbWVdW109aXNfYXJyYXkoJHZhbHVlKT9uZXcKQXJyYXlPYmplY3QoJHZhbHVlLEFycmF5T2JqZWN0OjpBUlJBWV9BU19QUk9QUyk6JHZhbHVlO319cmV0dXJuJHJlczt9cHJpdmF0ZQpzdGF0aWMKZnVuY3Rpb24KcGFyc2VTY3JpcHQoJGZpbGUpeyRUX05BTUVTUEFDRT1QSFBfVkVSU0lPTl9JRDw1MDMwMD8tMTpUX05BTUVTUEFDRTskVF9OU19TRVBBUkFUT1I9UEhQX1ZFUlNJT05fSUQ8NTAzMDA/LTE6VF9OU19TRVBBUkFUT1I7JHM9ZmlsZV9nZXRfY29udGVudHMoJGZpbGUpO2lmKHByZWdfbWF0Y2goJyMvL25ldHRlJy4nbG9hZGVyPShcUyopIycsJHMpKXtyZXR1cm47fSRleHBlY3RlZD0kbmFtZXNwYWNlPSRjbGFzcz0kZG9jQ29tbWVudD1OVUxMOyRsZXZlbD0kY2xhc3NMZXZlbD0wO2ZvcmVhY2godG9rZW5fZ2V0X2FsbCgkcylhcyR0b2tlbil7aWYoaXNfYXJyYXkoJHRva2VuKSl7c3dpdGNoKCR0b2tlblswXSl7Y2FzZQpUX0RPQ19DT01NRU5UOiRkb2NDb21tZW50PSR0b2tlblsxXTtjYXNlClRfV0hJVEVTUEFDRTpjYXNlClRfQ09NTUVOVDpjb250aW51ZQoyO2Nhc2UKVF9TVFJJTkc6Y2FzZSRUX05TX1NFUEFSQVRPUjpjYXNlClRfVkFSSUFCTEU6aWYoJGV4cGVjdGVkKXskbmFtZS49JHRva2VuWzFdO31jb250aW51ZQoyO2Nhc2UKVF9GVU5DVElPTjpjYXNlClRfVkFSOmNhc2UKVF9QVUJMSUM6Y2FzZQpUX1BST1RFQ1RFRDpjYXNlJFRfTkFNRVNQQUNFOmNhc2UKVF9DTEFTUzpjYXNlClRfSU5URVJGQUNFOiRleHBlY3RlZD0kdG9rZW5bMF07JG5hbWU9TlVMTDtjb250aW51ZQoyO2Nhc2UKVF9TVEFUSUM6Y2FzZQpUX0FCU1RSQUNUOmNhc2UKVF9GSU5BTDpjb250aW51ZQoyO2Nhc2UKVF9DVVJMWV9PUEVOOmNhc2UKVF9ET0xMQVJfT1BFTl9DVVJMWV9CUkFDRVM6JGxldmVsKys7fX1pZigkZXhwZWN0ZWQpe3N3aXRjaCgkZXhwZWN0ZWQpe2Nhc2UKVF9DTEFTUzpjYXNlClRfSU5URVJGQUNFOiRjbGFzcz0kbmFtZXNwYWNlLiRuYW1lOyRjbGFzc0xldmVsPSRsZXZlbDskbmFtZT0nJztjYXNlClRfRlVOQ1RJT046aWYoJHRva2VuPT09JyYnKWNvbnRpbnVlCjI7Y2FzZQpUX1ZBUjpjYXNlClRfUFVCTElDOmNhc2UKVF9QUk9URUNURUQ6aWYoJGNsYXNzJiYkbmFtZSE9PU5VTEwmJiRkb2NDb21tZW50KXtzZWxmOjokY2FjaGVbJGNsYXNzXVskbmFtZV09c2VsZjo6cGFyc2VDb21tZW50KCRkb2NDb21tZW50KTt9YnJlYWs7Y2FzZSRUX05BTUVTUEFDRTokbmFtZXNwYWNlPSRuYW1lLidcXCc7fSRleHBlY3RlZD0kZG9jQ29tbWVudD1OVUxMO31pZigkdG9rZW49PT0nOycpeyRkb2NDb21tZW50PU5VTEw7fWVsc2VpZigkdG9rZW49PT0neycpeyRkb2NDb21tZW50PU5VTEw7JGxldmVsKys7fWVsc2VpZigkdG9rZW49PT0nfScpeyRsZXZlbC0tO2lmKCRsZXZlbD09PSRjbGFzc0xldmVsKXskY2xhc3M9TlVMTDt9fX19cHJvdGVjdGVkCnN0YXRpYwpmdW5jdGlvbgpnZXRDYWNoZSgpe3JldHVybgpORW52aXJvbm1lbnQ6OmdldENhY2hlKCdOZXR0ZS5Bbm5vdGF0aW9ucycpO319Y2xhc3MKTkV4dGVuc2lvblJlZmxlY3Rpb24KZXh0ZW5kcwpSZWZsZWN0aW9uRXh0ZW5zaW9ue2Z1bmN0aW9uCl9fdG9TdHJpbmcoKXtyZXR1cm4nRXh0ZW5zaW9uICcuJHRoaXMtPmdldE5hbWUoKTt9c3RhdGljCmZ1bmN0aW9uCmltcG9ydChSZWZsZWN0aW9uRXh0ZW5zaW9uJHJlZil7cmV0dXJuCm5ldwpzZWxmKCRyZWYtPmdldE5hbWUoKSk7fWZ1bmN0aW9uCmdldENsYXNzZXMoKXtyZXR1cm4KYXJyYXlfbWFwKGFycmF5KCdOQ2xhc3NSZWZsZWN0aW9uJywnaW1wb3J0JykscGFyZW50OjpnZXRDbGFzc2VzKCkpO31mdW5jdGlvbgpnZXRGdW5jdGlvbnMoKXtyZXR1cm4KYXJyYXlfbWFwKGFycmF5KCdORnVuY3Rpb25SZWZsZWN0aW9uJywnaW1wb3J0JykscGFyZW50OjpnZXRGdW5jdGlvbnMoKSk7fWZ1bmN0aW9uCmdldFJlZmxlY3Rpb24oKXtyZXR1cm4KbmV3Ck5DbGFzc1JlZmxlY3Rpb24oJHRoaXMpO31mdW5jdGlvbgpfX2NhbGwoJG5hbWUsJGFyZ3Mpe3JldHVybgpOT2JqZWN0TWl4aW46OmNhbGwoJHRoaXMsJG5hbWUsJGFyZ3MpO31mdW5jdGlvbiZfX2dldCgkbmFtZSl7cmV0dXJuCk5PYmplY3RNaXhpbjo6Z2V0KCR0aGlzLCRuYW1lKTt9ZnVuY3Rpb24KX19zZXQoJG5hbWUsJHZhbHVlKXtyZXR1cm4KTk9iamVjdE1peGluOjpzZXQoJHRoaXMsJG5hbWUsJHZhbHVlKTt9ZnVuY3Rpb24KX19pc3NldCgkbmFtZSl7cmV0dXJuCk5PYmplY3RNaXhpbjo6aGFzKCR0aGlzLCRuYW1lKTt9ZnVuY3Rpb24KX191bnNldCgkbmFtZSl7dGhyb3cKbmV3Ck1lbWJlckFjY2Vzc0V4Y2VwdGlvbigiQ2Fubm90IHVuc2V0IHRoZSBwcm9wZXJ0eSB7JHRoaXMtPnJlZmxlY3Rpb24tPm5hbWV9OjpcJCRuYW1lLiIpO319Y2xhc3MKTkZ1bmN0aW9uUmVmbGVjdGlvbgpleHRlbmRzClJlZmxlY3Rpb25GdW5jdGlvbntmdW5jdGlvbgpfX3RvU3RyaW5nKCl7cmV0dXJuJ0Z1bmN0aW9uICcuJHRoaXMtPmdldE5hbWUoKS4nKCknO31zdGF0aWMKZnVuY3Rpb24KaW1wb3J0KFJlZmxlY3Rpb25GdW5jdGlvbiRyZWYpe3JldHVybgpuZXcKc2VsZigkcmVmLT5nZXROYW1lKCkpO31mdW5jdGlvbgpnZXRFeHRlbnNpb24oKXtyZXR1cm4oJHJlZj1wYXJlbnQ6OmdldEV4dGVuc2lvbigpKT9ORXh0ZW5zaW9uUmVmbGVjdGlvbjo6aW1wb3J0KCRyZWYpOk5VTEw7fWZ1bmN0aW9uCmdldFBhcmFtZXRlcnMoKXtyZXR1cm4KYXJyYXlfbWFwKGFycmF5KCdOTWV0aG9kUGFyYW1ldGVyUmVmbGVjdGlvbicsJ2ltcG9ydCcpLHBhcmVudDo6Z2V0UGFyYW1ldGVycygpKTt9ZnVuY3Rpb24KZ2V0UmVmbGVjdGlvbigpe3JldHVybgpuZXcKTkNsYXNzUmVmbGVjdGlvbigkdGhpcyk7fWZ1bmN0aW9uCl9fY2FsbCgkbmFtZSwkYXJncyl7cmV0dXJuCk5PYmplY3RNaXhpbjo6Y2FsbCgkdGhpcywkbmFtZSwkYXJncyk7fWZ1bmN0aW9uJl9fZ2V0KCRuYW1lKXtyZXR1cm4KTk9iamVjdE1peGluOjpnZXQoJHRoaXMsJG5hbWUpO31mdW5jdGlvbgpfX3NldCgkbmFtZSwkdmFsdWUpe3JldHVybgpOT2JqZWN0TWl4aW46OnNldCgkdGhpcywkbmFtZSwkdmFsdWUpO31mdW5jdGlvbgpfX2lzc2V0KCRuYW1lKXtyZXR1cm4KTk9iamVjdE1peGluOjpoYXMoJHRoaXMsJG5hbWUpO31mdW5jdGlvbgpfX3Vuc2V0KCRuYW1lKXt0aHJvdwpuZXcKTWVtYmVyQWNjZXNzRXhjZXB0aW9uKCJDYW5ub3QgdW5zZXQgdGhlIHByb3BlcnR5IHskdGhpcy0+cmVmbGVjdGlvbi0+bmFtZX06OlwkJG5hbWUuIik7fX1jbGFzcwpOTWV0aG9kUGFyYW1ldGVyUmVmbGVjdGlvbgpleHRlbmRzClJlZmxlY3Rpb25QYXJhbWV0ZXJ7c3RhdGljCmZ1bmN0aW9uCmltcG9ydChSZWZsZWN0aW9uUGFyYW1ldGVyJHJlZil7JG1ldGhvZD0kcmVmLT5nZXREZWNsYXJpbmdGdW5jdGlvbigpO3JldHVybgpuZXcKc2VsZigkbWV0aG9kCmluc3RhbmNlb2YKUmVmbGVjdGlvbk1ldGhvZD9hcnJheSgkcmVmLT5nZXREZWNsYXJpbmdDbGFzcygpLT5nZXROYW1lKCksJG1ldGhvZC0+Z2V0TmFtZSgpKTokbWV0aG9kLT5nZXROYW1lKCksJHJlZi0+Z2V0TmFtZSgpKTt9ZnVuY3Rpb24KZ2V0Q2xhc3MoKXtyZXR1cm4oJHJlZj1wYXJlbnQ6OmdldENsYXNzKCkpP05DbGFzc1JlZmxlY3Rpb246OmltcG9ydCgkcmVmKTpOVUxMO31mdW5jdGlvbgpnZXREZWNsYXJpbmdDbGFzcygpe3JldHVybigkcmVmPXBhcmVudDo6Z2V0RGVjbGFyaW5nQ2xhc3MoKSk/TkNsYXNzUmVmbGVjdGlvbjo6aW1wb3J0KCRyZWYpOk5VTEw7fWZ1bmN0aW9uCmdldERlY2xhcmluZ0Z1bmN0aW9uKCl7cmV0dXJuKCRyZWY9cGFyZW50OjpnZXREZWNsYXJpbmdGdW5jdGlvbigpKWluc3RhbmNlb2YKUmVmbGVjdGlvbk1ldGhvZD9OTWV0aG9kUmVmbGVjdGlvbjo6aW1wb3J0KCRyZWYpOk5GdW5jdGlvblJlZmxlY3Rpb246OmltcG9ydCgkcmVmKTt9ZnVuY3Rpb24KZ2V0UmVmbGVjdGlvbigpe3JldHVybgpuZXcKTkNsYXNzUmVmbGVjdGlvbigkdGhpcyk7fWZ1bmN0aW9uCl9fY2FsbCgkbmFtZSwkYXJncyl7cmV0dXJuCk5PYmplY3RNaXhpbjo6Y2FsbCgkdGhpcywkbmFtZSwkYXJncyk7fWZ1bmN0aW9uJl9fZ2V0KCRuYW1lKXtyZXR1cm4KTk9iamVjdE1peGluOjpnZXQoJHRoaXMsJG5hbWUpO31mdW5jdGlvbgpfX3NldCgkbmFtZSwkdmFsdWUpe3JldHVybgpOT2JqZWN0TWl4aW46OnNldCgkdGhpcywkbmFtZSwkdmFsdWUpO31mdW5jdGlvbgpfX2lzc2V0KCRuYW1lKXtyZXR1cm4KTk9iamVjdE1peGluOjpoYXMoJHRoaXMsJG5hbWUpO31mdW5jdGlvbgpfX3Vuc2V0KCRuYW1lKXt0aHJvdwpuZXcKTWVtYmVyQWNjZXNzRXhjZXB0aW9uKCJDYW5ub3QgdW5zZXQgdGhlIHByb3BlcnR5IHskdGhpcy0+cmVmbGVjdGlvbi0+bmFtZX06OlwkJG5hbWUuIik7fX1jbGFzcwpOTWV0aG9kUmVmbGVjdGlvbgpleHRlbmRzClJlZmxlY3Rpb25NZXRob2R7c3RhdGljCmZ1bmN0aW9uCmZyb20oJGNsYXNzLCRtZXRob2Qpe3JldHVybgpuZXcKc2VsZihpc19vYmplY3QoJGNsYXNzKT9nZXRfY2xhc3MoJGNsYXNzKTokY2xhc3MsJG1ldGhvZCk7fWZ1bmN0aW9uCmdldERlZmF1bHRQYXJhbWV0ZXJzKCl7JHJlcz1hcnJheSgpO2ZvcmVhY2gocGFyZW50OjpnZXRQYXJhbWV0ZXJzKClhcyRwYXJhbSl7JHJlc1skcGFyYW0tPmdldE5hbWUoKV09JHBhcmFtLT5pc0RlZmF1bHRWYWx1ZUF2YWlsYWJsZSgpPyRwYXJhbS0+Z2V0RGVmYXVsdFZhbHVlKCk6TlVMTDtpZigkcGFyYW0tPmlzQXJyYXkoKSl7c2V0dHlwZSgkcmVzWyRwYXJhbS0+Z2V0TmFtZSgpXSwnYXJyYXknKTt9fXJldHVybiRyZXM7fWZ1bmN0aW9uCmludm9rZU5hbWVkQXJncygkb2JqZWN0LCRhcmdzKXskcmVzPWFycmF5KCk7JGk9MDtmb3JlYWNoKCR0aGlzLT5nZXREZWZhdWx0UGFyYW1ldGVycygpYXMkbmFtZT0+JGRlZil7aWYoaXNzZXQoJGFyZ3NbJG5hbWVdKSl7JHZhbD0kYXJnc1skbmFtZV07aWYoJGRlZiE9PU5VTEwpe3NldHR5cGUoJHZhbCxnZXR0eXBlKCRkZWYpKTt9JHJlc1skaSsrXT0kdmFsO31lbHNleyRyZXNbJGkrK109JGRlZjt9fXJldHVybiR0aGlzLT5pbnZva2VBcmdzKCRvYmplY3QsJHJlcyk7fWZ1bmN0aW9uCmdldENhbGxiYWNrKCl7cmV0dXJuCm5ldwpOQ2FsbGJhY2socGFyZW50OjpnZXREZWNsYXJpbmdDbGFzcygpLT5nZXROYW1lKCksJHRoaXMtPmdldE5hbWUoKSk7fWZ1bmN0aW9uCl9fdG9TdHJpbmcoKXtyZXR1cm4nTWV0aG9kICcucGFyZW50OjpnZXREZWNsYXJpbmdDbGFzcygpLT5nZXROYW1lKCkuJzo6Jy4kdGhpcy0+Z2V0TmFtZSgpLicoKSc7fXN0YXRpYwpmdW5jdGlvbgppbXBvcnQoUmVmbGVjdGlvbk1ldGhvZCRyZWYpe3JldHVybgpuZXcKc2VsZigkcmVmLT5nZXREZWNsYXJpbmdDbGFzcygpLT5nZXROYW1lKCksJHJlZi0+Z2V0TmFtZSgpKTt9ZnVuY3Rpb24KZ2V0RGVjbGFyaW5nQ2xhc3MoKXtyZXR1cm4KTkNsYXNzUmVmbGVjdGlvbjo6aW1wb3J0KHBhcmVudDo6Z2V0RGVjbGFyaW5nQ2xhc3MoKSk7fWZ1bmN0aW9uCmdldEV4dGVuc2lvbigpe3JldHVybigkcmVmPXBhcmVudDo6Z2V0RXh0ZW5zaW9uKCkpP05FeHRlbnNpb25SZWZsZWN0aW9uOjppbXBvcnQoJHJlZik6TlVMTDt9ZnVuY3Rpb24KZ2V0UGFyYW1ldGVycygpe3JldHVybgphcnJheV9tYXAoYXJyYXkoJ05NZXRob2RQYXJhbWV0ZXJSZWZsZWN0aW9uJywnaW1wb3J0JykscGFyZW50OjpnZXRQYXJhbWV0ZXJzKCkpO31mdW5jdGlvbgpoYXNBbm5vdGF0aW9uKCRuYW1lKXskcmVzPU5Bbm5vdGF0aW9uc1BhcnNlcjo6Z2V0QWxsKCR0aGlzKTtyZXR1cm4hZW1wdHkoJHJlc1skbmFtZV0pO31mdW5jdGlvbgpnZXRBbm5vdGF0aW9uKCRuYW1lKXskcmVzPU5Bbm5vdGF0aW9uc1BhcnNlcjo6Z2V0QWxsKCR0aGlzKTtyZXR1cm4KaXNzZXQoJHJlc1skbmFtZV0pP2VuZCgkcmVzWyRuYW1lXSk6TlVMTDt9ZnVuY3Rpb24KZ2V0QW5ub3RhdGlvbnMoKXtyZXR1cm4KTkFubm90YXRpb25zUGFyc2VyOjpnZXRBbGwoJHRoaXMpO31mdW5jdGlvbgpnZXRSZWZsZWN0aW9uKCl7cmV0dXJuCm5ldwpOQ2xhc3NSZWZsZWN0aW9uKCR0aGlzKTt9ZnVuY3Rpb24KX19jYWxsKCRuYW1lLCRhcmdzKXtyZXR1cm4KTk9iamVjdE1peGluOjpjYWxsKCR0aGlzLCRuYW1lLCRhcmdzKTt9ZnVuY3Rpb24mX19nZXQoJG5hbWUpe3JldHVybgpOT2JqZWN0TWl4aW46OmdldCgkdGhpcywkbmFtZSk7fWZ1bmN0aW9uCl9fc2V0KCRuYW1lLCR2YWx1ZSl7cmV0dXJuCk5PYmplY3RNaXhpbjo6c2V0KCR0aGlzLCRuYW1lLCR2YWx1ZSk7fWZ1bmN0aW9uCl9faXNzZXQoJG5hbWUpe3JldHVybgpOT2JqZWN0TWl4aW46OmhhcygkdGhpcywkbmFtZSk7fWZ1bmN0aW9uCl9fdW5zZXQoJG5hbWUpe3Rocm93Cm5ldwpNZW1iZXJBY2Nlc3NFeGNlcHRpb24oIkNhbm5vdCB1bnNldCB0aGUgcHJvcGVydHkgeyR0aGlzLT5yZWZsZWN0aW9uLT5uYW1lfTo6XCQkbmFtZS4iKTt9fWNsYXNzCk5Qcm9wZXJ0eVJlZmxlY3Rpb24KZXh0ZW5kcwpSZWZsZWN0aW9uUHJvcGVydHl7ZnVuY3Rpb24KX190b1N0cmluZygpe3JldHVybidQcm9wZXJ0eSAnLnBhcmVudDo6Z2V0RGVjbGFyaW5nQ2xhc3MoKS0+Z2V0TmFtZSgpLic6OiQnLiR0aGlzLT5nZXROYW1lKCk7fXN0YXRpYwpmdW5jdGlvbgppbXBvcnQoUmVmbGVjdGlvblByb3BlcnR5JHJlZil7cmV0dXJuCm5ldwpzZWxmKCRyZWYtPmdldERlY2xhcmluZ0NsYXNzKCktPmdldE5hbWUoKSwkcmVmLT5nZXROYW1lKCkpO31mdW5jdGlvbgpnZXREZWNsYXJpbmdDbGFzcygpe3JldHVybgpOQ2xhc3NSZWZsZWN0aW9uOjppbXBvcnQocGFyZW50OjpnZXREZWNsYXJpbmdDbGFzcygpKTt9ZnVuY3Rpb24KaGFzQW5ub3RhdGlvbigkbmFtZSl7JHJlcz1OQW5ub3RhdGlvbnNQYXJzZXI6OmdldEFsbCgkdGhpcyk7cmV0dXJuIWVtcHR5KCRyZXNbJG5hbWVdKTt9ZnVuY3Rpb24KZ2V0QW5ub3RhdGlvbigkbmFtZSl7JHJlcz1OQW5ub3RhdGlvbnNQYXJzZXI6OmdldEFsbCgkdGhpcyk7cmV0dXJuCmlzc2V0KCRyZXNbJG5hbWVdKT9lbmQoJHJlc1skbmFtZV0pOk5VTEw7fWZ1bmN0aW9uCmdldEFubm90YXRpb25zKCl7cmV0dXJuCk5Bbm5vdGF0aW9uc1BhcnNlcjo6Z2V0QWxsKCR0aGlzKTt9ZnVuY3Rpb24KZ2V0UmVmbGVjdGlvbigpe3JldHVybgpuZXcKTkNsYXNzUmVmbGVjdGlvbigkdGhpcyk7fWZ1bmN0aW9uCl9fY2FsbCgkbmFtZSwkYXJncyl7cmV0dXJuCk5PYmplY3RNaXhpbjo6Y2FsbCgkdGhpcywkbmFtZSwkYXJncyk7fWZ1bmN0aW9uJl9fZ2V0KCRuYW1lKXtyZXR1cm4KTk9iamVjdE1peGluOjpnZXQoJHRoaXMsJG5hbWUpO31mdW5jdGlvbgpfX3NldCgkbmFtZSwkdmFsdWUpe3JldHVybgpOT2JqZWN0TWl4aW46OnNldCgkdGhpcywkbmFtZSwkdmFsdWUpO31mdW5jdGlvbgpfX2lzc2V0KCRuYW1lKXtyZXR1cm4KTk9iamVjdE1peGluOjpoYXMoJHRoaXMsJG5hbWUpO31mdW5jdGlvbgpfX3Vuc2V0KCRuYW1lKXt0aHJvdwpuZXcKTWVtYmVyQWNjZXNzRXhjZXB0aW9uKCJDYW5ub3QgdW5zZXQgdGhlIHByb3BlcnR5IHskdGhpcy0+cmVmbGVjdGlvbi0+bmFtZX06OlwkJG5hbWUuIik7fX1jbGFzcwpOQXV0aGVudGljYXRpb25FeGNlcHRpb24KZXh0ZW5kcwpFeGNlcHRpb257fWNsYXNzCk5JZGVudGl0eQpleHRlbmRzCk5GcmVlemFibGVPYmplY3QKaW1wbGVtZW50cwpJSWRlbnRpdHl7cHJpdmF0ZSRuYW1lO3ByaXZhdGUkcm9sZXM7cHJpdmF0ZSRkYXRhO2Z1bmN0aW9uCl9fY29uc3RydWN0KCRuYW1lLCRyb2xlcz1OVUxMLCRkYXRhPU5VTEwpeyR0aGlzLT5zZXROYW1lKCRuYW1lKTskdGhpcy0+c2V0Um9sZXMoKGFycmF5KSRyb2xlcyk7JHRoaXMtPmRhdGE9KGFycmF5KSRkYXRhO31mdW5jdGlvbgpzZXROYW1lKCRuYW1lKXskdGhpcy0+dXBkYXRpbmcoKTskdGhpcy0+bmFtZT0oc3RyaW5nKSRuYW1lO3JldHVybiR0aGlzO31mdW5jdGlvbgpnZXROYW1lKCl7cmV0dXJuJHRoaXMtPm5hbWU7fWZ1bmN0aW9uCnNldFJvbGVzKGFycmF5JHJvbGVzKXskdGhpcy0+dXBkYXRpbmcoKTskdGhpcy0+cm9sZXM9JHJvbGVzO3JldHVybiR0aGlzO31mdW5jdGlvbgpnZXRSb2xlcygpe3JldHVybiR0aGlzLT5yb2xlczt9ZnVuY3Rpb24KZ2V0RGF0YSgpe3JldHVybiR0aGlzLT5kYXRhO31mdW5jdGlvbgpfX3NldCgka2V5LCR2YWx1ZSl7JHRoaXMtPnVwZGF0aW5nKCk7aWYocGFyZW50OjpfX2lzc2V0KCRrZXkpKXtwYXJlbnQ6Ol9fc2V0KCRrZXksJHZhbHVlKTt9ZWxzZXskdGhpcy0+ZGF0YVska2V5XT0kdmFsdWU7fX1mdW5jdGlvbiZfX2dldCgka2V5KXtpZihwYXJlbnQ6Ol9faXNzZXQoJGtleSkpe3JldHVybgpwYXJlbnQ6Ol9fZ2V0KCRrZXkpO31lbHNle3JldHVybiR0aGlzLT5kYXRhWyRrZXldO319ZnVuY3Rpb24KX19pc3NldCgka2V5KXtyZXR1cm4KaXNzZXQoJHRoaXMtPmRhdGFbJGtleV0pfHxwYXJlbnQ6Ol9faXNzZXQoJGtleSk7fWZ1bmN0aW9uCl9fdW5zZXQoJG5hbWUpe3Rocm93Cm5ldwpNZW1iZXJBY2Nlc3NFeGNlcHRpb24oIkNhbm5vdCB1bnNldCB0aGUgcHJvcGVydHkgeyR0aGlzLT5yZWZsZWN0aW9uLT5uYW1lfTo6XCQkbmFtZS4iKTt9fWNsYXNzCk5QZXJtaXNzaW9uCmV4dGVuZHMKTk9iamVjdAppbXBsZW1lbnRzCklBdXRob3JpemF0b3J7cHJpdmF0ZSRyb2xlcz1hcnJheSgpO3ByaXZhdGUkcmVzb3VyY2VzPWFycmF5KCk7cHJpdmF0ZSRydWxlcz1hcnJheSgnYWxsUmVzb3VyY2VzJz0+YXJyYXkoJ2FsbFJvbGVzJz0+YXJyYXkoJ2FsbFByaXZpbGVnZXMnPT5hcnJheSgndHlwZSc9PnNlbGY6OkRFTlksJ2Fzc2VydCc9Pk5VTEwpLCdieVByaXZpbGVnZSc9PmFycmF5KCkpLCdieVJvbGUnPT5hcnJheSgpKSwnYnlSZXNvdXJjZSc9PmFycmF5KCkpO3ByaXZhdGUkcXVlcmllZFJvbGUsJHF1ZXJpZWRSZXNvdXJjZTtmdW5jdGlvbgphZGRSb2xlKCRyb2xlLCRwYXJlbnRzPU5VTEwpeyR0aGlzLT5jaGVja1JvbGUoJHJvbGUsRkFMU0UpO2lmKGlzc2V0KCR0aGlzLT5yb2xlc1skcm9sZV0pKXt0aHJvdwpuZXcKSW52YWxpZFN0YXRlRXhjZXB0aW9uKCJSb2xlICckcm9sZScgYWxyZWFkeSBleGlzdHMgaW4gdGhlIGxpc3QuIik7fSRyb2xlUGFyZW50cz1hcnJheSgpO2lmKCRwYXJlbnRzIT09TlVMTCl7aWYoIWlzX2FycmF5KCRwYXJlbnRzKSl7JHBhcmVudHM9YXJyYXkoJHBhcmVudHMpO31mb3JlYWNoKCRwYXJlbnRzCmFzJHBhcmVudCl7JHRoaXMtPmNoZWNrUm9sZSgkcGFyZW50KTskcm9sZVBhcmVudHNbJHBhcmVudF09VFJVRTskdGhpcy0+cm9sZXNbJHBhcmVudF1bJ2NoaWxkcmVuJ11bJHJvbGVdPVRSVUU7fX0kdGhpcy0+cm9sZXNbJHJvbGVdPWFycmF5KCdwYXJlbnRzJz0+JHJvbGVQYXJlbnRzLCdjaGlsZHJlbic9PmFycmF5KCkpO3JldHVybiR0aGlzO31mdW5jdGlvbgpoYXNSb2xlKCRyb2xlKXskdGhpcy0+Y2hlY2tSb2xlKCRyb2xlLEZBTFNFKTtyZXR1cm4KaXNzZXQoJHRoaXMtPnJvbGVzWyRyb2xlXSk7fXByaXZhdGUKZnVuY3Rpb24KY2hlY2tSb2xlKCRyb2xlLCRuZWVkPVRSVUUpe2lmKCFpc19zdHJpbmcoJHJvbGUpfHwkcm9sZT09PScnKXt0aHJvdwpuZXcKSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJSb2xlIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nLiIpO31lbHNlaWYoJG5lZWQmJiFpc3NldCgkdGhpcy0+cm9sZXNbJHJvbGVdKSl7dGhyb3cKbmV3CkludmFsaWRTdGF0ZUV4Y2VwdGlvbigiUm9sZSAnJHJvbGUnIGRvZXMgbm90IGV4aXN0LiIpO319ZnVuY3Rpb24KZ2V0Um9sZVBhcmVudHMoJHJvbGUpeyR0aGlzLT5jaGVja1JvbGUoJHJvbGUpO3JldHVybgphcnJheV9rZXlzKCR0aGlzLT5yb2xlc1skcm9sZV1bJ3BhcmVudHMnXSk7fWZ1bmN0aW9uCnJvbGVJbmhlcml0c0Zyb20oJHJvbGUsJGluaGVyaXQsJG9ubHlQYXJlbnRzPUZBTFNFKXskdGhpcy0+Y2hlY2tSb2xlKCRyb2xlKTskdGhpcy0+Y2hlY2tSb2xlKCRpbmhlcml0KTskaW5oZXJpdHM9aXNzZXQoJHRoaXMtPnJvbGVzWyRyb2xlXVsncGFyZW50cyddWyRpbmhlcml0XSk7aWYoJGluaGVyaXRzfHwkb25seVBhcmVudHMpe3JldHVybiRpbmhlcml0czt9Zm9yZWFjaCgkdGhpcy0+cm9sZXNbJHJvbGVdWydwYXJlbnRzJ11hcyRwYXJlbnQ9PiRmb28pe2lmKCR0aGlzLT5yb2xlSW5oZXJpdHNGcm9tKCRwYXJlbnQsJGluaGVyaXQpKXtyZXR1cm4KVFJVRTt9fXJldHVybgpGQUxTRTt9ZnVuY3Rpb24KcmVtb3ZlUm9sZSgkcm9sZSl7JHRoaXMtPmNoZWNrUm9sZSgkcm9sZSk7Zm9yZWFjaCgkdGhpcy0+cm9sZXNbJHJvbGVdWydjaGlsZHJlbiddYXMkY2hpbGQ9PiRmb28pdW5zZXQoJHRoaXMtPnJvbGVzWyRjaGlsZF1bJ3BhcmVudHMnXVskcm9sZV0pO2ZvcmVhY2goJHRoaXMtPnJvbGVzWyRyb2xlXVsncGFyZW50cyddYXMkcGFyZW50PT4kZm9vKXVuc2V0KCR0aGlzLT5yb2xlc1skcGFyZW50XVsnY2hpbGRyZW4nXVskcm9sZV0pO3Vuc2V0KCR0aGlzLT5yb2xlc1skcm9sZV0pO2ZvcmVhY2goJHRoaXMtPnJ1bGVzWydhbGxSZXNvdXJjZXMnXVsnYnlSb2xlJ11hcyRyb2xlQ3VycmVudD0+JHJ1bGVzKXtpZigkcm9sZT09PSRyb2xlQ3VycmVudCl7dW5zZXQoJHRoaXMtPnJ1bGVzWydhbGxSZXNvdXJjZXMnXVsnYnlSb2xlJ11bJHJvbGVDdXJyZW50XSk7fX1mb3JlYWNoKCR0aGlzLT5ydWxlc1snYnlSZXNvdXJjZSddYXMkcmVzb3VyY2VDdXJyZW50PT4kdmlzaXRvcil7aWYoaXNzZXQoJHZpc2l0b3JbJ2J5Um9sZSddKSl7Zm9yZWFjaCgkdmlzaXRvclsnYnlSb2xlJ11hcyRyb2xlQ3VycmVudD0+JHJ1bGVzKXtpZigkcm9sZT09PSRyb2xlQ3VycmVudCl7dW5zZXQoJHRoaXMtPnJ1bGVzWydieVJlc291cmNlJ11bJHJlc291cmNlQ3VycmVudF1bJ2J5Um9sZSddWyRyb2xlQ3VycmVudF0pO319fX1yZXR1cm4kdGhpczt9ZnVuY3Rpb24KcmVtb3ZlQWxsUm9sZXMoKXskdGhpcy0+cm9sZXM9YXJyYXkoKTtmb3JlYWNoKCR0aGlzLT5ydWxlc1snYWxsUmVzb3VyY2VzJ11bJ2J5Um9sZSddYXMkcm9sZUN1cnJlbnQ9PiRydWxlcyl1bnNldCgkdGhpcy0+cnVsZXNbJ2FsbFJlc291cmNlcyddWydieVJvbGUnXVskcm9sZUN1cnJlbnRdKTtmb3JlYWNoKCR0aGlzLT5ydWxlc1snYnlSZXNvdXJjZSddYXMkcmVzb3VyY2VDdXJyZW50PT4kdmlzaXRvcil7Zm9yZWFjaCgkdmlzaXRvclsnYnlSb2xlJ11hcyRyb2xlQ3VycmVudD0+JHJ1bGVzKXt1bnNldCgkdGhpcy0+cnVsZXNbJ2J5UmVzb3VyY2UnXVskcmVzb3VyY2VDdXJyZW50XVsnYnlSb2xlJ11bJHJvbGVDdXJyZW50XSk7fX1yZXR1cm4kdGhpczt9ZnVuY3Rpb24KYWRkUmVzb3VyY2UoJHJlc291cmNlLCRwYXJlbnQ9TlVMTCl7JHRoaXMtPmNoZWNrUmVzb3VyY2UoJHJlc291cmNlLEZBTFNFKTtpZihpc3NldCgkdGhpcy0+cmVzb3VyY2VzWyRyZXNvdXJjZV0pKXt0aHJvdwpuZXcKSW52YWxpZFN0YXRlRXhjZXB0aW9uKCJSZXNvdXJjZSAnJHJlc291cmNlJyBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgbGlzdC4iKTt9aWYoJHBhcmVudCE9PU5VTEwpeyR0aGlzLT5jaGVja1Jlc291cmNlKCRwYXJlbnQpOyR0aGlzLT5yZXNvdXJjZXNbJHBhcmVudF1bJ2NoaWxkcmVuJ11bJHJlc291cmNlXT1UUlVFO30kdGhpcy0+cmVzb3VyY2VzWyRyZXNvdXJjZV09YXJyYXkoJ3BhcmVudCc9PiRwYXJlbnQsJ2NoaWxkcmVuJz0+YXJyYXkoKSk7cmV0dXJuJHRoaXM7fWZ1bmN0aW9uCmhhc1Jlc291cmNlKCRyZXNvdXJjZSl7JHRoaXMtPmNoZWNrUmVzb3VyY2UoJHJlc291cmNlLEZBTFNFKTtyZXR1cm4KaXNzZXQoJHRoaXMtPnJlc291cmNlc1skcmVzb3VyY2VdKTt9cHJpdmF0ZQpmdW5jdGlvbgpjaGVja1Jlc291cmNlKCRyZXNvdXJjZSwkbmVlZD1UUlVFKXtpZighaXNfc3RyaW5nKCRyZXNvdXJjZSl8fCRyZXNvdXJjZT09PScnKXt0aHJvdwpuZXcKSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJSZXNvdXJjZSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZy4iKTt9ZWxzZWlmKCRuZWVkJiYhaXNzZXQoJHRoaXMtPnJlc291cmNlc1skcmVzb3VyY2VdKSl7dGhyb3cKbmV3CkludmFsaWRTdGF0ZUV4Y2VwdGlvbigiUmVzb3VyY2UgJyRyZXNvdXJjZScgZG9lcyBub3QgZXhpc3QuIik7fX1mdW5jdGlvbgpyZXNvdXJjZUluaGVyaXRzRnJvbSgkcmVzb3VyY2UsJGluaGVyaXQsJG9ubHlQYXJlbnQ9RkFMU0UpeyR0aGlzLT5jaGVja1Jlc291cmNlKCRyZXNvdXJjZSk7JHRoaXMtPmNoZWNrUmVzb3VyY2UoJGluaGVyaXQpO2lmKCR0aGlzLT5yZXNvdXJjZXNbJHJlc291cmNlXVsncGFyZW50J109PT1OVUxMKXtyZXR1cm4KRkFMU0U7fSRwYXJlbnQ9JHRoaXMtPnJlc291cmNlc1skcmVzb3VyY2VdWydwYXJlbnQnXTtpZigkaW5oZXJpdD09PSRwYXJlbnQpe3JldHVybgpUUlVFO31lbHNlaWYoJG9ubHlQYXJlbnQpe3JldHVybgpGQUxTRTt9d2hpbGUoJHRoaXMtPnJlc291cmNlc1skcGFyZW50XVsncGFyZW50J10hPT1OVUxMKXskcGFyZW50PSR0aGlzLT5yZXNvdXJjZXNbJHBhcmVudF1bJ3BhcmVudCddO2lmKCRpbmhlcml0PT09JHBhcmVudCl7cmV0dXJuClRSVUU7fX1yZXR1cm4KRkFMU0U7fWZ1bmN0aW9uCnJlbW92ZVJlc291cmNlKCRyZXNvdXJjZSl7JHRoaXMtPmNoZWNrUmVzb3VyY2UoJHJlc291cmNlKTskcGFyZW50PSR0aGlzLT5yZXNvdXJjZXNbJHJlc291cmNlXVsncGFyZW50J107aWYoJHBhcmVudCE9PU5VTEwpe3Vuc2V0KCR0aGlzLT5yZXNvdXJjZXNbJHBhcmVudF1bJ2NoaWxkcmVuJ11bJHJlc291cmNlXSk7fSRyZW1vdmVkPWFycmF5KCRyZXNvdXJjZSk7Zm9yZWFjaCgkdGhpcy0+cmVzb3VyY2VzWyRyZXNvdXJjZV1bJ2NoaWxkcmVuJ11hcyRjaGlsZD0+JGZvbyl7JHRoaXMtPnJlbW92ZVJlc291cmNlKCRjaGlsZCk7JHJlbW92ZWRbXT0kY2hpbGQ7fWZvcmVhY2goJHJlbW92ZWQKYXMkcmVzb3VyY2VSZW1vdmVkKXtmb3JlYWNoKCR0aGlzLT5ydWxlc1snYnlSZXNvdXJjZSddYXMkcmVzb3VyY2VDdXJyZW50PT4kcnVsZXMpe2lmKCRyZXNvdXJjZVJlbW92ZWQ9PT0kcmVzb3VyY2VDdXJyZW50KXt1bnNldCgkdGhpcy0+cnVsZXNbJ2J5UmVzb3VyY2UnXVskcmVzb3VyY2VDdXJyZW50XSk7fX19dW5zZXQoJHRoaXMtPnJlc291cmNlc1skcmVzb3VyY2VdKTtyZXR1cm4kdGhpczt9ZnVuY3Rpb24KcmVtb3ZlQWxsUmVzb3VyY2VzKCl7Zm9yZWFjaCgkdGhpcy0+cmVzb3VyY2VzCmFzJHJlc291cmNlPT4kZm9vKXtmb3JlYWNoKCR0aGlzLT5ydWxlc1snYnlSZXNvdXJjZSddYXMkcmVzb3VyY2VDdXJyZW50PT4kcnVsZXMpe2lmKCRyZXNvdXJjZT09PSRyZXNvdXJjZUN1cnJlbnQpe3Vuc2V0KCR0aGlzLT5ydWxlc1snYnlSZXNvdXJjZSddWyRyZXNvdXJjZUN1cnJlbnRdKTt9fX0kdGhpcy0+cmVzb3VyY2VzPWFycmF5KCk7cmV0dXJuJHRoaXM7fWZ1bmN0aW9uCmFsbG93KCRyb2xlcz1zZWxmOjpBTEwsJHJlc291cmNlcz1zZWxmOjpBTEwsJHByaXZpbGVnZXM9c2VsZjo6QUxMLElQZXJtaXNzaW9uQXNzZXJ0aW9uJGFzc2VydGlvbj1OVUxMKXskdGhpcy0+c2V0UnVsZShUUlVFLHNlbGY6OkFMTE9XLCRyb2xlcywkcmVzb3VyY2VzLCRwcml2aWxlZ2VzLCRhc3NlcnRpb24pO3JldHVybiR0aGlzO31mdW5jdGlvbgpkZW55KCRyb2xlcz1zZWxmOjpBTEwsJHJlc291cmNlcz1zZWxmOjpBTEwsJHByaXZpbGVnZXM9c2VsZjo6QUxMLElQZXJtaXNzaW9uQXNzZXJ0aW9uJGFzc2VydGlvbj1OVUxMKXskdGhpcy0+c2V0UnVsZShUUlVFLHNlbGY6OkRFTlksJHJvbGVzLCRyZXNvdXJjZXMsJHByaXZpbGVnZXMsJGFzc2VydGlvbik7cmV0dXJuJHRoaXM7fWZ1bmN0aW9uCnJlbW92ZUFsbG93KCRyb2xlcz1zZWxmOjpBTEwsJHJlc291cmNlcz1zZWxmOjpBTEwsJHByaXZpbGVnZXM9c2VsZjo6QUxMKXskdGhpcy0+c2V0UnVsZShGQUxTRSxzZWxmOjpBTExPVywkcm9sZXMsJHJlc291cmNlcywkcHJpdmlsZWdlcyk7cmV0dXJuJHRoaXM7fWZ1bmN0aW9uCnJlbW92ZURlbnkoJHJvbGVzPXNlbGY6OkFMTCwkcmVzb3VyY2VzPXNlbGY6OkFMTCwkcHJpdmlsZWdlcz1zZWxmOjpBTEwpeyR0aGlzLT5zZXRSdWxlKEZBTFNFLHNlbGY6OkRFTlksJHJvbGVzLCRyZXNvdXJjZXMsJHByaXZpbGVnZXMpO3JldHVybiR0aGlzO31wcm90ZWN0ZWQKZnVuY3Rpb24Kc2V0UnVsZSgkdG9BZGQsJHR5cGUsJHJvbGVzLCRyZXNvdXJjZXMsJHByaXZpbGVnZXMsSVBlcm1pc3Npb25Bc3NlcnRpb24kYXNzZXJ0aW9uPU5VTEwpe2lmKCRyb2xlcz09PXNlbGY6OkFMTCl7JHJvbGVzPWFycmF5KHNlbGY6OkFMTCk7fWVsc2V7aWYoIWlzX2FycmF5KCRyb2xlcykpeyRyb2xlcz1hcnJheSgkcm9sZXMpO31mb3JlYWNoKCRyb2xlcwphcyRyb2xlKXskdGhpcy0+Y2hlY2tSb2xlKCRyb2xlKTt9fWlmKCRyZXNvdXJjZXM9PT1zZWxmOjpBTEwpeyRyZXNvdXJjZXM9YXJyYXkoc2VsZjo6QUxMKTt9ZWxzZXtpZighaXNfYXJyYXkoJHJlc291cmNlcykpeyRyZXNvdXJjZXM9YXJyYXkoJHJlc291cmNlcyk7fWZvcmVhY2goJHJlc291cmNlcwphcyRyZXNvdXJjZSl7JHRoaXMtPmNoZWNrUmVzb3VyY2UoJHJlc291cmNlKTt9fWlmKCRwcml2aWxlZ2VzPT09c2VsZjo6QUxMKXskcHJpdmlsZWdlcz1hcnJheSgpO31lbHNlaWYoIWlzX2FycmF5KCRwcml2aWxlZ2VzKSl7JHByaXZpbGVnZXM9YXJyYXkoJHByaXZpbGVnZXMpO31pZigkdG9BZGQpe2ZvcmVhY2goJHJlc291cmNlcwphcyRyZXNvdXJjZSl7Zm9yZWFjaCgkcm9sZXMKYXMkcm9sZSl7JHJ1bGVzPSYkdGhpcy0+Z2V0UnVsZXMoJHJlc291cmNlLCRyb2xlLFRSVUUpO2lmKGNvdW50KCRwcml2aWxlZ2VzKT09PTApeyRydWxlc1snYWxsUHJpdmlsZWdlcyddWyd0eXBlJ109JHR5cGU7JHJ1bGVzWydhbGxQcml2aWxlZ2VzJ11bJ2Fzc2VydCddPSRhc3NlcnRpb247aWYoIWlzc2V0KCRydWxlc1snYnlQcml2aWxlZ2UnXSkpeyRydWxlc1snYnlQcml2aWxlZ2UnXT1hcnJheSgpO319ZWxzZXtmb3JlYWNoKCRwcml2aWxlZ2VzCmFzJHByaXZpbGVnZSl7JHJ1bGVzWydieVByaXZpbGVnZSddWyRwcml2aWxlZ2VdWyd0eXBlJ109JHR5cGU7JHJ1bGVzWydieVByaXZpbGVnZSddWyRwcml2aWxlZ2VdWydhc3NlcnQnXT0kYXNzZXJ0aW9uO319fX19ZWxzZXtmb3JlYWNoKCRyZXNvdXJjZXMKYXMkcmVzb3VyY2Upe2ZvcmVhY2goJHJvbGVzCmFzJHJvbGUpeyRydWxlcz0mJHRoaXMtPmdldFJ1bGVzKCRyZXNvdXJjZSwkcm9sZSk7aWYoJHJ1bGVzPT09TlVMTCl7Y29udGludWU7fWlmKGNvdW50KCRwcml2aWxlZ2VzKT09PTApe2lmKCRyZXNvdXJjZT09PXNlbGY6OkFMTCYmJHJvbGU9PT1zZWxmOjpBTEwpe2lmKCR0eXBlPT09JHJ1bGVzWydhbGxQcml2aWxlZ2VzJ11bJ3R5cGUnXSl7JHJ1bGVzPWFycmF5KCdhbGxQcml2aWxlZ2VzJz0+YXJyYXkoJ3R5cGUnPT5zZWxmOjpERU5ZLCdhc3NlcnQnPT5OVUxMKSwnYnlQcml2aWxlZ2UnPT5hcnJheSgpKTt9Y29udGludWU7fWlmKCR0eXBlPT09JHJ1bGVzWydhbGxQcml2aWxlZ2VzJ11bJ3R5cGUnXSl7dW5zZXQoJHJ1bGVzWydhbGxQcml2aWxlZ2VzJ10pO319ZWxzZXtmb3JlYWNoKCRwcml2aWxlZ2VzCmFzJHByaXZpbGVnZSl7aWYoaXNzZXQoJHJ1bGVzWydieVByaXZpbGVnZSddWyRwcml2aWxlZ2VdKSYmJHR5cGU9PT0kcnVsZXNbJ2J5UHJpdmlsZWdlJ11bJHByaXZpbGVnZV1bJ3R5cGUnXSl7dW5zZXQoJHJ1bGVzWydieVByaXZpbGVnZSddWyRwcml2aWxlZ2VdKTt9fX19fX1yZXR1cm4kdGhpczt9ZnVuY3Rpb24KaXNBbGxvd2VkKCRyb2xlPXNlbGY6OkFMTCwkcmVzb3VyY2U9c2VsZjo6QUxMLCRwcml2aWxlZ2U9c2VsZjo6QUxMKXskdGhpcy0+cXVlcmllZFJvbGU9JHJvbGU7aWYoJHJvbGUhPT1zZWxmOjpBTEwpe2lmKCRyb2xlCmluc3RhbmNlb2YKSVJvbGUpeyRyb2xlPSRyb2xlLT5nZXRSb2xlSWQoKTt9JHRoaXMtPmNoZWNrUm9sZSgkcm9sZSk7fSR0aGlzLT5xdWVyaWVkUmVzb3VyY2U9JHJlc291cmNlO2lmKCRyZXNvdXJjZSE9PXNlbGY6OkFMTCl7aWYoJHJlc291cmNlCmluc3RhbmNlb2YKSVJlc291cmNlKXskcmVzb3VyY2U9JHJlc291cmNlLT5nZXRSZXNvdXJjZUlkKCk7fSR0aGlzLT5jaGVja1Jlc291cmNlKCRyZXNvdXJjZSk7fWlmKCRwcml2aWxlZ2U9PT1zZWxmOjpBTEwpe2Rve2lmKCRyb2xlIT09TlVMTCYmTlVMTCE9PSgkcmVzdWx0PSR0aGlzLT5yb2xlREZTQWxsUHJpdmlsZWdlcygkcm9sZSwkcmVzb3VyY2UpKSl7YnJlYWs7fWlmKE5VTEwhPT0oJHJ1bGVzPSR0aGlzLT5nZXRSdWxlcygkcmVzb3VyY2Usc2VsZjo6QUxMKSkpe2ZvcmVhY2goJHJ1bGVzWydieVByaXZpbGVnZSddYXMkcHJpdmlsZWdlPT4kcnVsZSl7aWYoc2VsZjo6REVOWT09PSgkcnVsZVR5cGVPbmVQcml2aWxlZ2U9JHRoaXMtPmdldFJ1bGVUeXBlKCRyZXNvdXJjZSxOVUxMLCRwcml2aWxlZ2UpKSl7JHJlc3VsdD1zZWxmOjpERU5ZO2JyZWFrCjI7fX1pZihOVUxMIT09KCRydWxlVHlwZUFsbFByaXZpbGVnZXM9JHRoaXMtPmdldFJ1bGVUeXBlKCRyZXNvdXJjZSxOVUxMLE5VTEwpKSl7JHJlc3VsdD1zZWxmOjpBTExPVz09PSRydWxlVHlwZUFsbFByaXZpbGVnZXM7YnJlYWs7fX0kcmVzb3VyY2U9JHRoaXMtPnJlc291cmNlc1skcmVzb3VyY2VdWydwYXJlbnQnXTt9d2hpbGUoVFJVRSk7fWVsc2V7ZG97aWYoJHJvbGUhPT1OVUxMJiZOVUxMIT09KCRyZXN1bHQ9JHRoaXMtPnJvbGVERlNPbmVQcml2aWxlZ2UoJHJvbGUsJHJlc291cmNlLCRwcml2aWxlZ2UpKSl7YnJlYWs7fWlmKE5VTEwhPT0oJHJ1bGVUeXBlPSR0aGlzLT5nZXRSdWxlVHlwZSgkcmVzb3VyY2UsTlVMTCwkcHJpdmlsZWdlKSkpeyRyZXN1bHQ9c2VsZjo6QUxMT1c9PT0kcnVsZVR5cGU7YnJlYWs7fWVsc2VpZihOVUxMIT09KCRydWxlVHlwZUFsbFByaXZpbGVnZXM9JHRoaXMtPmdldFJ1bGVUeXBlKCRyZXNvdXJjZSxOVUxMLE5VTEwpKSl7JHJlc3VsdD1zZWxmOjpBTExPVz09PSRydWxlVHlwZUFsbFByaXZpbGVnZXM7YnJlYWs7fSRyZXNvdXJjZT0kdGhpcy0+cmVzb3VyY2VzWyRyZXNvdXJjZV1bJ3BhcmVudCddO313aGlsZShUUlVFKTt9JHRoaXMtPnF1ZXJpZWRSb2xlPSR0aGlzLT5xdWVyaWVkUmVzb3VyY2U9TlVMTDtyZXR1cm4kcmVzdWx0O31mdW5jdGlvbgpnZXRRdWVyaWVkUm9sZSgpe3JldHVybiR0aGlzLT5xdWVyaWVkUm9sZTt9ZnVuY3Rpb24KZ2V0UXVlcmllZFJlc291cmNlKCl7cmV0dXJuJHRoaXMtPnF1ZXJpZWRSZXNvdXJjZTt9cHJpdmF0ZQpmdW5jdGlvbgpyb2xlREZTQWxsUHJpdmlsZWdlcygkcm9sZSwkcmVzb3VyY2UpeyRkZnM9YXJyYXkoJ3Zpc2l0ZWQnPT5hcnJheSgpLCdzdGFjayc9PmFycmF5KCRyb2xlKSk7d2hpbGUoTlVMTCE9PSgkcm9sZT1hcnJheV9wb3AoJGRmc1snc3RhY2snXSkpKXtpZighaXNzZXQoJGRmc1sndmlzaXRlZCddWyRyb2xlXSkpe2lmKE5VTEwhPT0oJHJlc3VsdD0kdGhpcy0+cm9sZURGU1Zpc2l0QWxsUHJpdmlsZWdlcygkcm9sZSwkcmVzb3VyY2UsJGRmcykpKXtyZXR1cm4kcmVzdWx0O319fXJldHVybgpOVUxMO31wcml2YXRlCmZ1bmN0aW9uCnJvbGVERlNWaXNpdEFsbFByaXZpbGVnZXMoJHJvbGUsJHJlc291cmNlLCYkZGZzKXtpZihOVUxMIT09KCRydWxlcz0kdGhpcy0+Z2V0UnVsZXMoJHJlc291cmNlLCRyb2xlKSkpe2ZvcmVhY2goJHJ1bGVzWydieVByaXZpbGVnZSddYXMkcHJpdmlsZWdlPT4kcnVsZSl7aWYoc2VsZjo6REVOWT09PSR0aGlzLT5nZXRSdWxlVHlwZSgkcmVzb3VyY2UsJHJvbGUsJHByaXZpbGVnZSkpe3JldHVybgpzZWxmOjpERU5ZO319aWYoTlVMTCE9PSgkdHlwZT0kdGhpcy0+Z2V0UnVsZVR5cGUoJHJlc291cmNlLCRyb2xlLE5VTEwpKSl7cmV0dXJuCnNlbGY6OkFMTE9XPT09JHR5cGU7fX0kZGZzWyd2aXNpdGVkJ11bJHJvbGVdPVRSVUU7Zm9yZWFjaCgkdGhpcy0+cm9sZXNbJHJvbGVdWydwYXJlbnRzJ11hcyRyb2xlUGFyZW50PT4kZm9vKXskZGZzWydzdGFjayddW109JHJvbGVQYXJlbnQ7fXJldHVybgpOVUxMO31wcml2YXRlCmZ1bmN0aW9uCnJvbGVERlNPbmVQcml2aWxlZ2UoJHJvbGUsJHJlc291cmNlLCRwcml2aWxlZ2UpeyRkZnM9YXJyYXkoJ3Zpc2l0ZWQnPT5hcnJheSgpLCdzdGFjayc9PmFycmF5KCRyb2xlKSk7d2hpbGUoTlVMTCE9PSgkcm9sZT1hcnJheV9wb3AoJGRmc1snc3RhY2snXSkpKXtpZighaXNzZXQoJGRmc1sndmlzaXRlZCddWyRyb2xlXSkpe2lmKE5VTEwhPT0oJHJlc3VsdD0kdGhpcy0+cm9sZURGU1Zpc2l0T25lUHJpdmlsZWdlKCRyb2xlLCRyZXNvdXJjZSwkcHJpdmlsZWdlLCRkZnMpKSl7cmV0dXJuJHJlc3VsdDt9fX1yZXR1cm4KTlVMTDt9cHJpdmF0ZQpmdW5jdGlvbgpyb2xlREZTVmlzaXRPbmVQcml2aWxlZ2UoJHJvbGUsJHJlc291cmNlLCRwcml2aWxlZ2UsJiRkZnMpe2lmKE5VTEwhPT0oJHR5cGU9JHRoaXMtPmdldFJ1bGVUeXBlKCRyZXNvdXJjZSwkcm9sZSwkcHJpdmlsZWdlKSkpe3JldHVybgpzZWxmOjpBTExPVz09PSR0eXBlO31pZihOVUxMIT09KCR0eXBlPSR0aGlzLT5nZXRSdWxlVHlwZSgkcmVzb3VyY2UsJHJvbGUsTlVMTCkpKXtyZXR1cm4Kc2VsZjo6QUxMT1c9PT0kdHlwZTt9JGRmc1sndmlzaXRlZCddWyRyb2xlXT1UUlVFO2ZvcmVhY2goJHRoaXMtPnJvbGVzWyRyb2xlXVsncGFyZW50cyddYXMkcm9sZVBhcmVudD0+JGZvbykkZGZzWydzdGFjayddW109JHJvbGVQYXJlbnQ7cmV0dXJuCk5VTEw7fXByaXZhdGUKZnVuY3Rpb24KZ2V0UnVsZVR5cGUoJHJlc291cmNlLCRyb2xlLCRwcml2aWxlZ2Upe2lmKE5VTEw9PT0oJHJ1bGVzPSR0aGlzLT5nZXRSdWxlcygkcmVzb3VyY2UsJHJvbGUpKSl7cmV0dXJuCk5VTEw7fWlmKCRwcml2aWxlZ2U9PT1zZWxmOjpBTEwpe2lmKGlzc2V0KCRydWxlc1snYWxsUHJpdmlsZWdlcyddKSl7JHJ1bGU9JHJ1bGVzWydhbGxQcml2aWxlZ2VzJ107fWVsc2V7cmV0dXJuCk5VTEw7fX1lbHNlaWYoIWlzc2V0KCRydWxlc1snYnlQcml2aWxlZ2UnXVskcHJpdmlsZWdlXSkpe3JldHVybgpOVUxMO31lbHNleyRydWxlPSRydWxlc1snYnlQcml2aWxlZ2UnXVskcHJpdmlsZWdlXTt9aWYoJHJ1bGVbJ2Fzc2VydCddPT09TlVMTHx8JHJ1bGVbJ2Fzc2VydCddLT5hc3NlcnQoJHRoaXMsJHJvbGUsJHJlc291cmNlLCRwcml2aWxlZ2UpKXtyZXR1cm4kcnVsZVsndHlwZSddO31lbHNlaWYoJHJlc291cmNlIT09c2VsZjo6QUxMfHwkcm9sZSE9PXNlbGY6OkFMTHx8JHByaXZpbGVnZSE9PXNlbGY6OkFMTCl7cmV0dXJuCk5VTEw7fWVsc2VpZihzZWxmOjpBTExPVz09PSRydWxlWyd0eXBlJ10pe3JldHVybgpzZWxmOjpERU5ZO31lbHNle3JldHVybgpzZWxmOjpBTExPVzt9fXByaXZhdGUKZnVuY3Rpb24mZ2V0UnVsZXMoJHJlc291cmNlLCRyb2xlLCRjcmVhdGU9RkFMU0Upe2lmKCRyZXNvdXJjZT09PXNlbGY6OkFMTCl7JHZpc2l0b3I9JiR0aGlzLT5ydWxlc1snYWxsUmVzb3VyY2VzJ107fWVsc2V7aWYoIWlzc2V0KCR0aGlzLT5ydWxlc1snYnlSZXNvdXJjZSddWyRyZXNvdXJjZV0pKXtpZighJGNyZWF0ZSl7JG51bGw9TlVMTDtyZXR1cm4kbnVsbDt9JHRoaXMtPnJ1bGVzWydieVJlc291cmNlJ11bJHJlc291cmNlXT1hcnJheSgpO30kdmlzaXRvcj0mJHRoaXMtPnJ1bGVzWydieVJlc291cmNlJ11bJHJlc291cmNlXTt9aWYoJHJvbGU9PT1zZWxmOjpBTEwpe2lmKCFpc3NldCgkdmlzaXRvclsnYWxsUm9sZXMnXSkpe2lmKCEkY3JlYXRlKXskbnVsbD1OVUxMO3JldHVybiRudWxsO30kdmlzaXRvclsnYWxsUm9sZXMnXVsnYnlQcml2aWxlZ2UnXT1hcnJheSgpO31yZXR1cm4kdmlzaXRvclsnYWxsUm9sZXMnXTt9aWYoIWlzc2V0KCR2aXNpdG9yWydieVJvbGUnXVskcm9sZV0pKXtpZighJGNyZWF0ZSl7JG51bGw9TlVMTDtyZXR1cm4kbnVsbDt9JHZpc2l0b3JbJ2J5Um9sZSddWyRyb2xlXVsnYnlQcml2aWxlZ2UnXT1hcnJheSgpO31yZXR1cm4kdmlzaXRvclsnYnlSb2xlJ11bJHJvbGVdO319Y2xhc3MKTlNpbXBsZUF1dGhlbnRpY2F0b3IKZXh0ZW5kcwpOT2JqZWN0CmltcGxlbWVudHMKSUF1dGhlbnRpY2F0b3J7cHJpdmF0ZSR1c2VybGlzdDtmdW5jdGlvbgpfX2NvbnN0cnVjdChhcnJheSR1c2VybGlzdCl7JHRoaXMtPnVzZXJsaXN0PSR1c2VybGlzdDt9ZnVuY3Rpb24KYXV0aGVudGljYXRlKGFycmF5JGNyZWRlbnRpYWxzKXskdXNlcm5hbWU9JGNyZWRlbnRpYWxzW3NlbGY6OlVTRVJOQU1FXTtmb3JlYWNoKCR0aGlzLT51c2VybGlzdAphcyRuYW1lPT4kcGFzcyl7aWYoc3RyY2FzZWNtcCgkbmFtZSwkY3JlZGVudGlhbHNbc2VsZjo6VVNFUk5BTUVdKT09PTApe2lmKHN0cmNhc2VjbXAoJHBhc3MsJGNyZWRlbnRpYWxzW3NlbGY6OlBBU1NXT1JEXSk9PT0wKXtyZXR1cm4KbmV3Ck5JZGVudGl0eSgkbmFtZSk7fXRocm93Cm5ldwpOQXV0aGVudGljYXRpb25FeGNlcHRpb24oIkludmFsaWQgcGFzc3dvcmQuIixzZWxmOjpJTlZBTElEX0NSRURFTlRJQUwpO319dGhyb3cKbmV3Ck5BdXRoZW50aWNhdGlvbkV4Y2VwdGlvbigiVXNlciAnJHVzZXJuYW1lJyBub3QgZm91bmQuIixzZWxmOjpJREVOVElUWV9OT1RfRk9VTkQpO319YWJzdHJhY3QKY2xhc3MKTkJhc2VUZW1wbGF0ZQpleHRlbmRzCk5PYmplY3QKaW1wbGVtZW50cwpJVGVtcGxhdGV7cHVibGljJHdhcm5PblVuZGVmaW5lZD1UUlVFO3B1YmxpYyRvblByZXBhcmVGaWx0ZXJzPWFycmF5KCk7cHJpdmF0ZSRwYXJhbXM9YXJyYXkoKTtwcml2YXRlJGZpbHRlcnM9YXJyYXkoKTtwcml2YXRlJGhlbHBlcnM9YXJyYXkoKTtwcml2YXRlJGhlbHBlckxvYWRlcnM9YXJyYXkoKTtmdW5jdGlvbgpyZWdpc3RlckZpbHRlcigkY2FsbGJhY2speyRjYWxsYmFjaz1jYWxsYmFjaygkY2FsbGJhY2spO2lmKGluX2FycmF5KCRjYWxsYmFjaywkdGhpcy0+ZmlsdGVycykpe3Rocm93Cm5ldwpJbnZhbGlkU3RhdGVFeGNlcHRpb24oIkZpbHRlciAnJGNhbGxiYWNrJyB3YXMgcmVnaXN0ZXJlZCB0d2ljZS4iKTt9JHRoaXMtPmZpbHRlcnNbXT0kY2FsbGJhY2s7fWZpbmFsCmZ1bmN0aW9uCmdldEZpbHRlcnMoKXtyZXR1cm4kdGhpcy0+ZmlsdGVyczt9ZnVuY3Rpb24KcmVuZGVyKCl7fWZ1bmN0aW9uCl9fdG9TdHJpbmcoKXtvYl9zdGFydCgpO3RyeXskdGhpcy0+cmVuZGVyKCk7cmV0dXJuCm9iX2dldF9jbGVhbigpO31jYXRjaChFeGNlcHRpb24kZSl7b2JfZW5kX2NsZWFuKCk7aWYoZnVuY19udW1fYXJncygpJiZmdW5jX2dldF9hcmcoMCkpe3Rocm93JGU7fWVsc2V7TkRlYnVnOjp0b1N0cmluZ0V4Y2VwdGlvbigkZSk7fX19cHJvdGVjdGVkCmZ1bmN0aW9uCmNvbXBpbGUoJGNvbnRlbnQsJGxhYmVsPU5VTEwpe2lmKCEkdGhpcy0+ZmlsdGVycyl7JHRoaXMtPm9uUHJlcGFyZUZpbHRlcnMoJHRoaXMpO310cnl7Zm9yZWFjaCgkdGhpcy0+ZmlsdGVycwphcyRmaWx0ZXIpeyRjb250ZW50PXNlbGY6OmV4dHJhY3RQaHAoJGNvbnRlbnQsJGJsb2Nrcyk7JGNvbnRlbnQ9JGZpbHRlci0+aW52b2tlKCRjb250ZW50KTskY29udGVudD1zdHJ0cigkY29udGVudCwkYmxvY2tzKTt9fWNhdGNoKEV4Y2VwdGlvbiRlKXt0aHJvdwpuZXcKSW52YWxpZFN0YXRlRXhjZXB0aW9uKCJGaWx0ZXIgJGZpbHRlcjogIi4kZS0+Z2V0TWVzc2FnZSgpLigkbGFiZWw/IiAoaW4gJGxhYmVsKSI6JycpLDAsJGUpO31pZigkbGFiZWwpeyRjb250ZW50PSI8P3BocFxuLy8gJGxhYmVsXG4vL1xuPz4kY29udGVudCI7fXJldHVybgpzZWxmOjpvcHRpbWl6ZVBocCgkY29udGVudCk7fWZ1bmN0aW9uCnJlZ2lzdGVySGVscGVyKCRuYW1lLCRjYWxsYmFjayl7JHRoaXMtPmhlbHBlcnNbc3RydG9sb3dlcigkbmFtZSldPWNhbGxiYWNrKCRjYWxsYmFjayk7fWZ1bmN0aW9uCnJlZ2lzdGVySGVscGVyTG9hZGVyKCRjYWxsYmFjayl7JHRoaXMtPmhlbHBlckxvYWRlcnNbXT1jYWxsYmFjaygkY2FsbGJhY2spO31maW5hbApmdW5jdGlvbgpnZXRIZWxwZXJzKCl7cmV0dXJuJHRoaXMtPmhlbHBlcnM7fWZ1bmN0aW9uCl9fY2FsbCgkbmFtZSwkYXJncyl7JGxuYW1lPXN0cnRvbG93ZXIoJG5hbWUpO2lmKCFpc3NldCgkdGhpcy0+aGVscGVyc1skbG5hbWVdKSl7Zm9yZWFjaCgkdGhpcy0+aGVscGVyTG9hZGVycwphcyRsb2FkZXIpeyRoZWxwZXI9JGxvYWRlci0+aW52b2tlKCRsbmFtZSk7aWYoJGhlbHBlcil7JHRoaXMtPnJlZ2lzdGVySGVscGVyKCRsbmFtZSwkaGVscGVyKTtyZXR1cm4kdGhpcy0+aGVscGVyc1skbG5hbWVdLT5pbnZva2VBcmdzKCRhcmdzKTt9fXJldHVybgpwYXJlbnQ6Ol9fY2FsbCgkbmFtZSwkYXJncyk7fXJldHVybiR0aGlzLT5oZWxwZXJzWyRsbmFtZV0tPmludm9rZUFyZ3MoJGFyZ3MpO31mdW5jdGlvbgpzZXRUcmFuc2xhdG9yKElUcmFuc2xhdG9yJHRyYW5zbGF0b3I9TlVMTCl7JHRoaXMtPnJlZ2lzdGVySGVscGVyKCd0cmFuc2xhdGUnLCR0cmFuc2xhdG9yPT09TlVMTD9OVUxMOmFycmF5KCR0cmFuc2xhdG9yLCd0cmFuc2xhdGUnKSk7cmV0dXJuJHRoaXM7fWZ1bmN0aW9uCmFkZCgkbmFtZSwkdmFsdWUpe2lmKGFycmF5X2tleV9leGlzdHMoJG5hbWUsJHRoaXMtPnBhcmFtcykpe3Rocm93Cm5ldwpJbnZhbGlkU3RhdGVFeGNlcHRpb24oIlRoZSB2YXJpYWJsZSAnJG5hbWUnIGV4aXN0cyB5ZXQuIik7fSR0aGlzLT5wYXJhbXNbJG5hbWVdPSR2YWx1ZTt9ZnVuY3Rpb24Kc2V0UGFyYW1zKGFycmF5JHBhcmFtcyl7JHRoaXMtPnBhcmFtcz0kcGFyYW1zO3JldHVybiR0aGlzO31mdW5jdGlvbgpnZXRQYXJhbXMoKXtyZXR1cm4kdGhpcy0+cGFyYW1zO31mdW5jdGlvbgpfX3NldCgkbmFtZSwkdmFsdWUpeyR0aGlzLT5wYXJhbXNbJG5hbWVdPSR2YWx1ZTt9ZnVuY3Rpb24mX19nZXQoJG5hbWUpe2lmKCR0aGlzLT53YXJuT25VbmRlZmluZWQmJiFhcnJheV9rZXlfZXhpc3RzKCRuYW1lLCR0aGlzLT5wYXJhbXMpKXt0cmlnZ2VyX2Vycm9yKCJUaGUgdmFyaWFibGUgJyRuYW1lJyBkb2VzIG5vdCBleGlzdCBpbiB0ZW1wbGF0ZS4iLEVfVVNFUl9OT1RJQ0UpO31yZXR1cm4kdGhpcy0+cGFyYW1zWyRuYW1lXTt9ZnVuY3Rpb24KX19pc3NldCgkbmFtZSl7cmV0dXJuCmlzc2V0KCR0aGlzLT5wYXJhbXNbJG5hbWVdKTt9ZnVuY3Rpb24KX191bnNldCgkbmFtZSl7dW5zZXQoJHRoaXMtPnBhcmFtc1skbmFtZV0pO31wcml2YXRlCnN0YXRpYwpmdW5jdGlvbgpleHRyYWN0UGhwKCRzb3VyY2UsJiRibG9ja3MpeyRyZXM9Jyc7JGJsb2Nrcz1hcnJheSgpOyR0b2tlbnM9dG9rZW5fZ2V0X2FsbCgkc291cmNlKTtmb3JlYWNoKCR0b2tlbnMKYXMkbj0+JHRva2VuKXtpZihpc19hcnJheSgkdG9rZW4pKXtpZigkdG9rZW5bMF09PT1UX0lOTElORV9IVE1MKXskcmVzLj0kdG9rZW5bMV07Y29udGludWU7fWVsc2VpZigkdG9rZW5bMF09PT1UX09QRU5fVEFHJiYkdG9rZW5bMV09PT0nPD8nJiZpc3NldCgkdG9rZW5zWyRuKzFdWzFdKSYmJHRva2Vuc1skbisxXVsxXT09PSd4bWwnKXskcGhwPSYkcmVzOyR0b2tlblsxXT0nPDw/cGhwID8+Pyc7fWVsc2VpZigkdG9rZW5bMF09PT1UX09QRU5fVEFHfHwkdG9rZW5bMF09PT1UX09QRU5fVEFHX1dJVEhfRUNITyl7JHJlcy49JGlkPSJceDAxQHBocDpwIi5jb3VudCgkYmxvY2tzKS4iQFx4MDIiOyRwaHA9JiRibG9ja3NbJGlkXTt9JHBocC49JHRva2VuWzFdO31lbHNleyRwaHAuPSR0b2tlbjt9fXJldHVybiRyZXM7fXN0YXRpYwpmdW5jdGlvbgpvcHRpbWl6ZVBocCgkc291cmNlKXskcmVzPSRwaHA9Jyc7JGxhc3RDaGFyPSc7JzskdG9rZW5zPW5ldwpBcnJheUl0ZXJhdG9yKHRva2VuX2dldF9hbGwoJHNvdXJjZSkpO2ZvcmVhY2goJHRva2VucwphcyRrZXk9PiR0b2tlbil7aWYoaXNfYXJyYXkoJHRva2VuKSl7aWYoJHRva2VuWzBdPT09VF9JTkxJTkVfSFRNTCl7JGxhc3RDaGFyPScnOyRyZXMuPSR0b2tlblsxXTt9ZWxzZWlmKCR0b2tlblswXT09PVRfQ0xPU0VfVEFHKXskbmV4dD1pc3NldCgkdG9rZW5zWyRrZXkrMV0pPyR0b2tlbnNbJGtleSsxXTpOVUxMO2lmKHN1YnN0cigkcmVzLC0xKSE9PSc8JyYmcHJlZ19tYXRjaCgnI148XD9waHBccyokIycsJHBocCkpeyRwaHA9Jyc7fWVsc2VpZihpc19hcnJheSgkbmV4dCkmJiRuZXh0WzBdPT09VF9PUEVOX1RBRyl7aWYoJGxhc3RDaGFyIT09JzsnJiYkbGFzdENoYXIhPT0neycmJiRsYXN0Q2hhciE9PSd9JyYmJGxhc3RDaGFyIT09JzonJiYkbGFzdENoYXIhPT0nLycpJHBocC49JGxhc3RDaGFyPSc7JztpZihzdWJzdHIoJG5leHRbMV0sLTEpPT09IlxuIikkcGhwLj0iXG4iOyR0b2tlbnMtPm5leHQoKTt9ZWxzZWlmKCRuZXh0KXskcmVzLj1wcmVnX3JlcGxhY2UoJyM7PyhccykqJCMnLCckMScsJHBocCkuJHRva2VuWzFdOyRwaHA9Jyc7fWVsc2V7aWYoJGxhc3RDaGFyIT09J30nJiYkbGFzdENoYXIhPT0nOycpJHBocC49JzsnO319ZWxzZWlmKCR0b2tlblswXT09PVRfRUxTRXx8JHRva2VuWzBdPT09VF9FTFNFSUYpe2lmKCR0b2tlbnNbJGtleSsxXT09PSc6JyYmJGxhc3RDaGFyPT09J30nKSRwaHAuPSc7JzskbGFzdENoYXI9Jyc7JHBocC49JHRva2VuWzFdO31lbHNle2lmKCFpbl9hcnJheSgkdG9rZW5bMF0sYXJyYXkoVF9XSElURVNQQUNFLFRfQ09NTUVOVCxUX0RPQ19DT01NRU5ULFRfT1BFTl9UQUcpKSkkbGFzdENoYXI9Jyc7JHBocC49JHRva2VuWzFdO319ZWxzZXskcGhwLj0kbGFzdENoYXI9JHRva2VuO319cmV0dXJuJHJlcy4kcGhwO319Y2xhc3MKTkNhY2hpbmdIZWxwZXIKZXh0ZW5kcwpOT2JqZWN0e3ByaXZhdGUkZnJhbWU7cHJpdmF0ZSRrZXk7c3RhdGljCmZ1bmN0aW9uCmNyZWF0ZSgka2V5LCRmaWxlLCR0YWdzKXskY2FjaGU9c2VsZjo6Z2V0Q2FjaGUoKTtpZihpc3NldCgkY2FjaGVbJGtleV0pKXtlY2hvJGNhY2hlWyRrZXldO3JldHVybgpGQUxTRTt9ZWxzZXskb2JqPW5ldwpzZWxmOyRvYmotPmtleT0ka2V5OyRvYmotPmZyYW1lPWFycmF5KE5DYWNoZTo6RklMRVM9PmFycmF5KCRmaWxlKSxOQ2FjaGU6OlRBR1M9PiR0YWdzLE5DYWNoZTo6RVhQSVJFPT5yYW5kKDg2NDAwKjQsODY0MDAqNykpO29iX3N0YXJ0KCk7cmV0dXJuJG9iajt9fWZ1bmN0aW9uCnNhdmUoKXskdGhpcy0+Z2V0Q2FjaGUoKS0+c2F2ZSgkdGhpcy0+a2V5LG9iX2dldF9mbHVzaCgpLCR0aGlzLT5mcmFtZSk7JHRoaXMtPmtleT0kdGhpcy0+ZnJhbWU9TlVMTDt9ZnVuY3Rpb24KYWRkRmlsZSgkZmlsZSl7JHRoaXMtPmZyYW1lW05DYWNoZTo6RklMRVNdW109JGZpbGU7fWZ1bmN0aW9uCmFkZEl0ZW0oJGl0ZW0peyR0aGlzLT5mcmFtZVtOQ2FjaGU6OklURU1TXVtdPSRpdGVtO31wcm90ZWN0ZWQKc3RhdGljCmZ1bmN0aW9uCmdldENhY2hlKCl7cmV0dXJuCk5FbnZpcm9ubWVudDo6Z2V0Q2FjaGUoJ05ldHRlLlRlbXBsYXRlLkN1cmx5Jyk7fX1jbGFzcwpOTGF0dGVGaWx0ZXIKZXh0ZW5kcwpOT2JqZWN0e2NvbnN0ClJFX1NUUklORz0nXCcoPzpcXFxcLnxbXlwnXFxcXF0pKlwnfCIoPzpcXFxcLnxbXiJcXFxcXSkqIic7Y29uc3QKUkVfSURFTlRJRklFUj0nW19hLXpBLVpceDdGLVx4RkZdW19hLXpBLVowLTlceDdGLVx4RkZdKic7Y29uc3QKSFRNTF9QUkVGSVg9J246Jztwcml2YXRlJGhhbmRsZXI7cHJpdmF0ZSRtYWNyb1JlO3ByaXZhdGUkaW5wdXQsJG91dHB1dDtwcml2YXRlJG9mZnNldDtwcml2YXRlJHF1b3RlO3ByaXZhdGUkdGFncztwdWJsaWMkY29udGV4dCwkZXNjYXBlO2NvbnN0CkNPTlRFWFRfVEVYVD0ndGV4dCc7Y29uc3QKQ09OVEVYVF9DREFUQT0nY2RhdGEnO2NvbnN0CkNPTlRFWFRfVEFHPSd0YWcnO2NvbnN0CkNPTlRFWFRfQVRUUklCVVRFPSdhdHRyaWJ1dGUnO2NvbnN0CkNPTlRFWFRfTk9ORT0nbm9uZSc7Y29uc3QKQ09OVEVYVF9DT01NRU5UPSdjb21tZW50JztmdW5jdGlvbgpzZXRIYW5kbGVyKCRoYW5kbGVyKXskdGhpcy0+aGFuZGxlcj0kaGFuZGxlcjtyZXR1cm4kdGhpczt9ZnVuY3Rpb24KZ2V0SGFuZGxlcigpe2lmKCR0aGlzLT5oYW5kbGVyPT09TlVMTCl7JHRoaXMtPmhhbmRsZXI9bmV3Ck5MYXR0ZU1hY3Jvczt9cmV0dXJuJHRoaXMtPmhhbmRsZXI7fWZ1bmN0aW9uCl9faW52b2tlKCRzKXtpZighJHRoaXMtPm1hY3JvUmUpeyR0aGlzLT5zZXREZWxpbWl0ZXJzKCdcXHsoPyFbXFxzXCcie31dKScsJ1xcfScpO30kdGhpcy0+Y29udGV4dD1OTGF0dGVGaWx0ZXI6OkNPTlRFWFRfTk9ORTskdGhpcy0+ZXNjYXBlPSckdGVtcGxhdGUtPmVzY2FwZSc7JHRoaXMtPmdldEhhbmRsZXIoKS0+aW5pdGlhbGl6ZSgkdGhpcywkcyk7JHM9JHRoaXMtPnBhcnNlKCJcbiIuJHMpOyR0aGlzLT5nZXRIYW5kbGVyKCktPmZpbmFsaXplKCRzKTtyZXR1cm4kczt9cHJpdmF0ZQpmdW5jdGlvbgpwYXJzZSgkcyl7JHRoaXMtPmlucHV0PSYkczskdGhpcy0+b2Zmc2V0PTA7JHRoaXMtPm91dHB1dD0nJzskdGhpcy0+dGFncz1hcnJheSgpOyRsZW49c3RybGVuKCRzKTt3aGlsZSgkdGhpcy0+b2Zmc2V0PCRsZW4peyRtYXRjaGVzPSR0aGlzLT57ImNvbnRleHQkdGhpcy0+Y29udGV4dCJ9KCk7aWYoISRtYXRjaGVzKXticmVhazt9ZWxzZWlmKCFlbXB0eSgkbWF0Y2hlc1snbWFjcm8nXSkpe3ByZWdfbWF0Y2goJyNeKC8/W2Etel0rKT8oLio/KShcXHxbYS16XSg/Oicuc2VsZjo6UkVfU1RSSU5HLid8W15cJyJdKykqKT8kKCkjaXMnLCRtYXRjaGVzWydtYWNybyddLCRtMik7bGlzdCgsJG1hY3JvLCR2YWx1ZSwkbW9kaWZpZXJzKT0kbTI7JGNvZGU9JHRoaXMtPmhhbmRsZXItPm1hY3JvKCRtYWNybyx0cmltKCR2YWx1ZSksaXNzZXQoJG1vZGlmaWVycyk/JG1vZGlmaWVyczonJyk7aWYoJGNvZGU9PT1OVUxMKXt0aHJvdwpuZXcKSW52YWxpZFN0YXRlRXhjZXB0aW9uKCJVbmtub3duIG1hY3JvIHt7JG1hdGNoZXNbJ21hY3JvJ119fSBvbiBsaW5lICR0aGlzLT5saW5lLiIpO30kbmw9aXNzZXQoJG1hdGNoZXNbJ25ld2xpbmUnXSk/IlxuIjonJztpZigkbmwmJiRtYXRjaGVzWydpbmRlbnQnXSYmc3RybmNtcCgkY29kZSwnPD9waHAgZWNobyAnLDExKSl7JHRoaXMtPm91dHB1dC49IlxuIi4kY29kZTt9ZWxzZXskdGhpcy0+b3V0cHV0Lj0kbWF0Y2hlc1snaW5kZW50J10uJGNvZGUuKHN1YnN0cigkY29kZSwtMik9PT0nPz4nPyRubDonJyk7fX1lbHNleyR0aGlzLT5vdXRwdXQuPSRtYXRjaGVzWzBdO319Zm9yZWFjaCgkdGhpcy0+dGFncwphcyR0YWcpe2lmKCEkdGFnLT5pc01hY3JvJiYhZW1wdHkoJHRhZy0+YXR0cnMpKXt0aHJvdwpuZXcKSW52YWxpZFN0YXRlRXhjZXB0aW9uKCJNaXNzaW5nIGVuZCB0YWcgPC8kdGFnLT5uYW1lPiBmb3IgbWFjcm8tYXR0cmlidXRlICIuc2VsZjo6SFRNTF9QUkVGSVguaW1wbG9kZSgnIGFuZCAnLnNlbGY6OkhUTUxfUFJFRklYLGFycmF5X2tleXMoJHRhZy0+YXR0cnMpKS4iLiIpO319cmV0dXJuJHRoaXMtPm91dHB1dC5zdWJzdHIoJHRoaXMtPmlucHV0LCR0aGlzLT5vZmZzZXQpO31wcml2YXRlCmZ1bmN0aW9uCmNvbnRleHRUZXh0KCl7JG1hdGNoZXM9JHRoaXMtPm1hdGNoKCd+CgkJCSg/OlxuWyBcdF0qKT88KD9QPGNsb3Npbmc+Lz8pKD9QPHRhZz5bYS16MC05Ol0rKXwgICMjICBiZWdpbiBvZiBIVE1MIHRhZyA8dGFnIDwvdGFnIC0gaWdub3JlcyA8IURPQ1RZUEUKCQkJPCg/UDxjb21tZW50PiEtLSl8ICAgICAgICAgICAjIyAgYmVnaW4gb2YgSFRNTCBjb21tZW50IDwhLS0KCQkJJy4kdGhpcy0+bWFjcm9SZS4nICAgICAgICAgICAjIyAgY3VybHkgdGFnCgkJfnhzaScpO2lmKCEkbWF0Y2hlc3x8IWVtcHR5KCRtYXRjaGVzWydtYWNybyddKSl7fWVsc2VpZighZW1wdHkoJG1hdGNoZXNbJ2NvbW1lbnQnXSkpeyR0aGlzLT5jb250ZXh0PXNlbGY6OkNPTlRFWFRfQ09NTUVOVDskdGhpcy0+ZXNjYXBlPSdOVGVtcGxhdGVIZWxwZXJzOjplc2NhcGVIdG1sQ29tbWVudCc7fWVsc2VpZihlbXB0eSgkbWF0Y2hlc1snY2xvc2luZyddKSl7JHRhZz0kdGhpcy0+dGFnc1tdPShvYmplY3QpTlVMTDskdGFnLT5uYW1lPSRtYXRjaGVzWyd0YWcnXTskdGFnLT5jbG9zaW5nPUZBTFNFOyR0YWctPmlzTWFjcm89TlN0cmluZzo6c3RhcnRzV2l0aCgkdGFnLT5uYW1lLHNlbGY6OkhUTUxfUFJFRklYKTskdGFnLT5hdHRycz1hcnJheSgpOyR0YWctPnBvcz1zdHJsZW4oJHRoaXMtPm91dHB1dCk7JHRoaXMtPmNvbnRleHQ9c2VsZjo6Q09OVEVYVF9UQUc7JHRoaXMtPmVzY2FwZT0nTlRlbXBsYXRlSGVscGVyczo6ZXNjYXBlSHRtbCc7fWVsc2V7ZG97JHRhZz1hcnJheV9wb3AoJHRoaXMtPnRhZ3MpO2lmKCEkdGFnKXskdGFnPShvYmplY3QpTlVMTDskdGFnLT5uYW1lPSRtYXRjaGVzWyd0YWcnXTskdGFnLT5pc01hY3JvPU5TdHJpbmc6OnN0YXJ0c1dpdGgoJHRhZy0+bmFtZSxzZWxmOjpIVE1MX1BSRUZJWCk7fX13aGlsZShzdHJjYXNlY21wKCR0YWctPm5hbWUsJG1hdGNoZXNbJ3RhZyddKSk7JHRoaXMtPnRhZ3NbXT0kdGFnOyR0YWctPmNsb3Npbmc9VFJVRTskdGFnLT5wb3M9c3RybGVuKCR0aGlzLT5vdXRwdXQpOyR0aGlzLT5jb250ZXh0PXNlbGY6OkNPTlRFWFRfVEFHOyR0aGlzLT5lc2NhcGU9J05UZW1wbGF0ZUhlbHBlcnM6OmVzY2FwZUh0bWwnO31yZXR1cm4kbWF0Y2hlczt9cHJpdmF0ZQpmdW5jdGlvbgpjb250ZXh0Q0RhdGEoKXskdGFnPWVuZCgkdGhpcy0+dGFncyk7JG1hdGNoZXM9JHRoaXMtPm1hdGNoKCd+CgkJCTwvJy4kdGFnLT5uYW1lLicoPyFbYS16MC05Ol0pfCAjIyAgZW5kIEhUTUwgdGFnIDwvdGFnCgkJCScuJHRoaXMtPm1hY3JvUmUuJyAgICAgICAgICAgIyMgIGN1cmx5IHRhZwoJCX54c2knKTtpZigkbWF0Y2hlcyYmZW1wdHkoJG1hdGNoZXNbJ21hY3JvJ10pKXskdGFnLT5jbG9zaW5nPVRSVUU7JHRhZy0+cG9zPXN0cmxlbigkdGhpcy0+b3V0cHV0KTskdGhpcy0+Y29udGV4dD1zZWxmOjpDT05URVhUX1RBRzskdGhpcy0+ZXNjYXBlPSdOVGVtcGxhdGVIZWxwZXJzOjplc2NhcGVIdG1sJzt9cmV0dXJuJG1hdGNoZXM7fXByaXZhdGUKZnVuY3Rpb24KY29udGV4dFRhZygpeyRtYXRjaGVzPSR0aGlzLT5tYXRjaCgnfgoJCQkoP1A8ZW5kPi8/PikoP1A8dGFnbmV3bGluZT5bXCBcdF0qKD89XHJ8XG4pKT98ICAjIyAgZW5kIG9mIEhUTUwgdGFnCgkJCScuJHRoaXMtPm1hY3JvUmUuJ3wgICAgICAgICAgIyMgIGN1cmx5IHRhZwoJCQlccyooP1A8YXR0cj5bXlxzLz49e10rKSg/OlxzKj1ccyooP1A8dmFsdWU+WyJcJ118W15ccy8+e10rKSk/ICMjIGJlZ2luIG9mIEhUTUwgYXR0cmlidXRlCgkJfnhzaScpO2lmKCEkbWF0Y2hlc3x8IWVtcHR5KCRtYXRjaGVzWydtYWNybyddKSl7fWVsc2VpZighZW1wdHkoJG1hdGNoZXNbJ2VuZCddKSl7JHRhZz1lbmQoJHRoaXMtPnRhZ3MpOyRpc0VtcHR5PSEkdGFnLT5jbG9zaW5nJiYoJG1hdGNoZXNbJ2VuZCddWzBdPT09Jy8nfHxpc3NldChOSHRtbDo6JGVtcHR5RWxlbWVudHNbc3RydG9sb3dlcigkdGFnLT5uYW1lKV0pKTtpZigkdGFnLT5pc01hY3JvfHwhZW1wdHkoJHRhZy0+YXR0cnMpKXtpZigkdGFnLT5pc01hY3JvKXskY29kZT0kdGhpcy0+aGFuZGxlci0+dGFnTWFjcm8oc3Vic3RyKCR0YWctPm5hbWUsc3RybGVuKHNlbGY6OkhUTUxfUFJFRklYKSksJHRhZy0+YXR0cnMsJHRhZy0+Y2xvc2luZyk7aWYoJGNvZGU9PT1OVUxMKXt0aHJvdwpuZXcKSW52YWxpZFN0YXRlRXhjZXB0aW9uKCJVbmtub3duIHRhZy1tYWNybyA8JHRhZy0+bmFtZT4gb24gbGluZSAkdGhpcy0+bGluZS4iKTt9aWYoJGlzRW1wdHkpeyRjb2RlLj0kdGhpcy0+aGFuZGxlci0+dGFnTWFjcm8oc3Vic3RyKCR0YWctPm5hbWUsc3RybGVuKHNlbGY6OkhUTUxfUFJFRklYKSksJHRhZy0+YXR0cnMsVFJVRSk7fX1lbHNleyRjb2RlPXN1YnN0cigkdGhpcy0+b3V0cHV0LCR0YWctPnBvcykuJG1hdGNoZXNbMF0uKGlzc2V0KCRtYXRjaGVzWyd0YWduZXdsaW5lJ10pPyJcbiI6JycpOyRjb2RlPSR0aGlzLT5oYW5kbGVyLT5hdHRyc01hY3JvKCRjb2RlLCR0YWctPmF0dHJzLCR0YWctPmNsb3NpbmcpO2lmKCRjb2RlPT09TlVMTCl7dGhyb3cKbmV3CkludmFsaWRTdGF0ZUV4Y2VwdGlvbigiVW5rbm93biBtYWNyby1hdHRyaWJ1dGUgIi5zZWxmOjpIVE1MX1BSRUZJWC5pbXBsb2RlKCcgb3IgJy5zZWxmOjpIVE1MX1BSRUZJWCxhcnJheV9rZXlzKCR0YWctPmF0dHJzKSkuIiBvbiBsaW5lICR0aGlzLT5saW5lLiIpO31pZigkaXNFbXB0eSl7JGNvZGU9JHRoaXMtPmhhbmRsZXItPmF0dHJzTWFjcm8oJGNvZGUsJHRhZy0+YXR0cnMsVFJVRSk7fX0kdGhpcy0+b3V0cHV0PXN1YnN0cl9yZXBsYWNlKCR0aGlzLT5vdXRwdXQsJGNvZGUsJHRhZy0+cG9zKTskbWF0Y2hlc1swXT0nJzt9aWYoJGlzRW1wdHkpeyR0YWctPmNsb3Npbmc9VFJVRTt9aWYoISR0YWctPmNsb3NpbmcmJihzdHJjYXNlY21wKCR0YWctPm5hbWUsJ3NjcmlwdCcpPT09MHx8c3RyY2FzZWNtcCgkdGFnLT5uYW1lLCdzdHlsZScpPT09MCkpeyR0aGlzLT5jb250ZXh0PXNlbGY6OkNPTlRFWFRfQ0RBVEE7JHRoaXMtPmVzY2FwZT1zdHJjYXNlY21wKCR0YWctPm5hbWUsJ3N0eWxlJyk/J05UZW1wbGF0ZUhlbHBlcnM6OmVzY2FwZUpzJzonTlRlbXBsYXRlSGVscGVyczo6ZXNjYXBlQ3NzJzt9ZWxzZXskdGhpcy0+Y29udGV4dD1zZWxmOjpDT05URVhUX1RFWFQ7JHRoaXMtPmVzY2FwZT0nTlRlbXBsYXRlSGVscGVyczo6ZXNjYXBlSHRtbCc7aWYoJHRhZy0+Y2xvc2luZylhcnJheV9wb3AoJHRoaXMtPnRhZ3MpO319ZWxzZXskbmFtZT0kbWF0Y2hlc1snYXR0ciddOyR2YWx1ZT1lbXB0eSgkbWF0Y2hlc1sndmFsdWUnXSk/VFJVRTokbWF0Y2hlc1sndmFsdWUnXTtpZigkaXNTcGVjaWFsPU5TdHJpbmc6OnN0YXJ0c1dpdGgoJG5hbWUsc2VsZjo6SFRNTF9QUkVGSVgpKXskbmFtZT1zdWJzdHIoJG5hbWUsc3RybGVuKHNlbGY6OkhUTUxfUFJFRklYKSk7fSR0YWc9ZW5kKCR0aGlzLT50YWdzKTtpZigkaXNTcGVjaWFsfHwkdGFnLT5pc01hY3JvKXtpZigkdmFsdWU9PT0nIid8fCR2YWx1ZT09PSInIil7aWYoJG1hdGNoZXM9JHRoaXMtPm1hdGNoKCd+KC4qPyknLiR2YWx1ZS4nfnhzaScpKXskdmFsdWU9JG1hdGNoZXNbMV07fX0kdGFnLT5hdHRyc1skbmFtZV09JHZhbHVlOyRtYXRjaGVzWzBdPScnO31lbHNlaWYoJHZhbHVlPT09JyInfHwkdmFsdWU9PT0iJyIpeyR0aGlzLT5jb250ZXh0PXNlbGY6OkNPTlRFWFRfQVRUUklCVVRFOyR0aGlzLT5xdW90ZT0kdmFsdWU7JHRoaXMtPmVzY2FwZT1zdHJuY2FzZWNtcCgkbmFtZSwnb24nLDIpPyhzdHJjYXNlY21wKCRuYW1lLCdzdHlsZScpPydOVGVtcGxhdGVIZWxwZXJzOjplc2NhcGVIdG1sJzonTlRlbXBsYXRlSGVscGVyczo6ZXNjYXBlSHRtbENzcycpOidOVGVtcGxhdGVIZWxwZXJzOjplc2NhcGVIdG1sSnMnO319cmV0dXJuJG1hdGNoZXM7fXByaXZhdGUKZnVuY3Rpb24KY29udGV4dEF0dHJpYnV0ZSgpeyRtYXRjaGVzPSR0aGlzLT5tYXRjaCgnfgoJCQkoJy4kdGhpcy0+cXVvdGUuJyl8ICAgICAgIyMgIDEpIGVuZCBvZiBIVE1MIGF0dHJpYnV0ZQoJCQknLiR0aGlzLT5tYWNyb1JlLicgICAgICAgICAgICMjICBjdXJseSB0YWcKCQl+eHNpJyk7aWYoJG1hdGNoZXMmJmVtcHR5KCRtYXRjaGVzWydtYWNybyddKSl7JHRoaXMtPmNvbnRleHQ9c2VsZjo6Q09OVEVYVF9UQUc7JHRoaXMtPmVzY2FwZT0nTlRlbXBsYXRlSGVscGVyczo6ZXNjYXBlSHRtbCc7fXJldHVybiRtYXRjaGVzO31wcml2YXRlCmZ1bmN0aW9uCmNvbnRleHRDb21tZW50KCl7JG1hdGNoZXM9JHRoaXMtPm1hdGNoKCd+CgkJCSgtLVxzKj4pfCAgICAgICAgICAgICAgICAgICAgIyMgIDEpIGVuZCBvZiBIVE1MIGNvbW1lbnQKCQkJJy4kdGhpcy0+bWFjcm9SZS4nICAgICAgICAgICAjIyAgY3VybHkgdGFnCgkJfnhzaScpO2lmKCRtYXRjaGVzJiZlbXB0eSgkbWF0Y2hlc1snbWFjcm8nXSkpeyR0aGlzLT5jb250ZXh0PXNlbGY6OkNPTlRFWFRfVEVYVDskdGhpcy0+ZXNjYXBlPSdOVGVtcGxhdGVIZWxwZXJzOjplc2NhcGVIdG1sJzt9cmV0dXJuJG1hdGNoZXM7fXByaXZhdGUKZnVuY3Rpb24KY29udGV4dE5vbmUoKXskbWF0Y2hlcz0kdGhpcy0+bWF0Y2goJ34KCQkJJy4kdGhpcy0+bWFjcm9SZS4nICAgICAgICAgICAjIyAgY3VybHkgdGFnCgkJfnhzaScpO3JldHVybiRtYXRjaGVzO31wcml2YXRlCmZ1bmN0aW9uCm1hdGNoKCRyZSl7aWYocHJlZ19tYXRjaCgkcmUsJHRoaXMtPmlucHV0LCRtYXRjaGVzLFBSRUdfT0ZGU0VUX0NBUFRVUkUsJHRoaXMtPm9mZnNldCkpeyR0aGlzLT5vdXRwdXQuPXN1YnN0cigkdGhpcy0+aW5wdXQsJHRoaXMtPm9mZnNldCwkbWF0Y2hlc1swXVsxXS0kdGhpcy0+b2Zmc2V0KTskdGhpcy0+b2Zmc2V0PSRtYXRjaGVzWzBdWzFdK3N0cmxlbigkbWF0Y2hlc1swXVswXSk7Zm9yZWFjaCgkbWF0Y2hlcwphcyRrPT4kdikkbWF0Y2hlc1ska109JHZbMF07fXJldHVybiRtYXRjaGVzO31mdW5jdGlvbgpnZXRMaW5lKCl7cmV0dXJuCnN1YnN0cl9jb3VudCgkdGhpcy0+aW5wdXQsIlxuIiwwLCR0aGlzLT5vZmZzZXQpO31mdW5jdGlvbgpzZXREZWxpbWl0ZXJzKCRsZWZ0LCRyaWdodCl7JHRoaXMtPm1hY3JvUmU9JwoJCQkoP1A8aW5kZW50PlxuW1wgXHRdKik/CgkJCScuJGxlZnQuJwoJCQkJKD9QPG1hY3JvPig/Oicuc2VsZjo6UkVfU1RSSU5HLid8W15cJyJdKz8pKj8pCgkJCScuJHJpZ2h0LicKCQkJKD9QPG5ld2xpbmU+W1wgXHRdKig/PVxyfFxuKSk/CgkJJztyZXR1cm4kdGhpczt9c3RhdGljCmZ1bmN0aW9uCmZvcm1hdE1vZGlmaWVycygkdmFyLCRtb2RpZmllcnMpe2lmKCEkbW9kaWZpZXJzKXJldHVybiR2YXI7cHJlZ19tYXRjaF9hbGwoJ34KCQkJCScuc2VsZjo6UkVfU1RSSU5HLid8ICAjIyBzaW5nbGUgb3IgZG91YmxlIHF1b3RlZCBzdHJpbmcKCQkJCVteXCcifDosXHNdK3wgICAgICAgICAjIyBzeW1ib2wKCQkJCVt8OixdICAgICAgICAgICAgICAgICAjIyBzZXBhcmF0b3IKCQkJfnhzJywkbW9kaWZpZXJzLid8JywkdG9rZW5zKTskaW5zaWRlPUZBTFNFOyRwcmV2PScnO2ZvcmVhY2goJHRva2Vuc1swXWFzJHRva2VuKXtpZigkdG9rZW49PT0nfCd8fCR0b2tlbj09PSc6J3x8JHRva2VuPT09JywnKXtpZigkcHJldj09PScnKXt9ZWxzZWlmKCEkaW5zaWRlKXtpZighcHJlZ19tYXRjaCgnI14nLnNlbGY6OlJFX0lERU5USUZJRVIuJyQjJywkcHJldikpe3Rocm93Cm5ldwpJbnZhbGlkU3RhdGVFeGNlcHRpb24oIk1vZGlmaWVyIG5hbWUgbXVzdCBiZSBhbHBoYW51bWVyaWMgc3RyaW5nLCAnJHByZXYnIGdpdmVuLiIpO30kdmFyPSJcJHRlbXBsYXRlLT4kcHJldigkdmFyIjskcHJldj0nJzskaW5zaWRlPVRSVUU7fWVsc2V7JHZhci49JywgJy5zZWxmOjpmb3JtYXRTdHJpbmcoJHByZXYpOyRwcmV2PScnO31pZigkdG9rZW49PT0nfCcmJiRpbnNpZGUpeyR2YXIuPScpJzskaW5zaWRlPUZBTFNFO319ZWxzZXskcHJldi49JHRva2VuO319cmV0dXJuJHZhcjt9c3RhdGljCmZ1bmN0aW9uCmZldGNoVG9rZW4oJiRzKXtpZihwcmVnX21hdGNoKCcjXigoPz4nLnNlbGY6OlJFX1NUUklORy4nfFteXCciXHMsXSspKylccyosP1xzKiguKikkIycsJHMsJG1hdGNoZXMpKXskcz0kbWF0Y2hlc1syXTtyZXR1cm4kbWF0Y2hlc1sxXTt9cmV0dXJuCk5VTEw7fXN0YXRpYwpmdW5jdGlvbgpmb3JtYXRBcnJheSgkcywkcHJlZml4PScnKXskcz1wcmVnX3JlcGxhY2VfY2FsbGJhY2soJ34KCQkJCScuc2VsZjo6UkVfU1RSSU5HLid8ICAgICAgICAgICAgICAgICAgICAgICAgICAjIyBzaW5nbGUgb3IgZG91YmxlIHF1b3RlZCBzdHJpbmcKCQkJCSg/PD1bLD0oXXw9PnxeKVxzKihbYS16XGRfXSspKD89XHMqWyw9KV18JCkgICAjIyAxKSBzeW1ib2wKCQkJfnhpJyxhcnJheShfX0NMQVNTX18sJ2NiQXJncycpLHRyaW0oJHMpKTskcz1wcmVnX3JlcGxhY2UoJyNcJCgnLnNlbGY6OlJFX0lERU5USUZJRVIuJylccyo9PiMnLCciJDEiID0+Jywkcyk7cmV0dXJuJHM9PT0nJz8nJzokcHJlZml4LiJhcnJheSgkcykiO31wcml2YXRlCnN0YXRpYwpmdW5jdGlvbgpjYkFyZ3MoJG1hdGNoZXMpe2lmKCFlbXB0eSgkbWF0Y2hlc1sxXSkpe2xpc3QoLCRzeW1ib2wpPSRtYXRjaGVzO3N0YXRpYyRrZXl3b3Jkcz1hcnJheSgndHJ1ZSc9PjEsJ2ZhbHNlJz0+MSwnbnVsbCc9PjEsJ2FuZCc9PjEsJ29yJz0+MSwneG9yJz0+MSwnY2xvbmUnPT4xLCduZXcnPT4xKTtyZXR1cm4KaXNfbnVtZXJpYygkc3ltYm9sKXx8aXNzZXQoJGtleXdvcmRzW3N0cnRvbG93ZXIoJHN5bWJvbCldKT8kbWF0Y2hlc1swXToiJyRzeW1ib2wnIjt9ZWxzZXtyZXR1cm4kbWF0Y2hlc1swXTt9fXN0YXRpYwpmdW5jdGlvbgpmb3JtYXRTdHJpbmcoJHMpe3N0YXRpYyRrZXl3b3Jkcz1hcnJheSgndHJ1ZSc9PjEsJ2ZhbHNlJz0+MSwnbnVsbCc9PjEpO3JldHVybihpc19udW1lcmljKCRzKXx8c3Ryc3BuKCRzLCdcJyIkJyl8fGlzc2V0KCRrZXl3b3Jkc1tzdHJ0b2xvd2VyKCRzKV0pKT8kczonIicuJHMuJyInO31zdGF0aWMKZnVuY3Rpb24KaW52b2tlKCRzKXt0cmlnZ2VyX2Vycm9yKF9fTUVUSE9EX18uJygpIGlzIGRlcHJlY2F0ZWQ7IHVzZSBub24tc3RhdGljIF9faW52b2tlKCkgaW5zdGVhZC4nLEVfVVNFUl9XQVJOSU5HKTskZmlsdGVyPW5ldwpzZWxmO3JldHVybiRmaWx0ZXItPl9faW52b2tlKCRzKTt9fWNsYXNzCk5DdXJseUJyYWNrZXRzRmlsdGVyCmV4dGVuZHMKTkxhdHRlRmlsdGVye31jbGFzcwpOQ3VybHlCcmFja2V0c01hY3JvcwpleHRlbmRzCk5MYXR0ZU1hY3Jvc3t9Y2xhc3MKTkxhdHRlTWFjcm9zCmV4dGVuZHMKTk9iamVjdHtwdWJsaWMKc3RhdGljJGRlZmF1bHRNYWNyb3M9YXJyYXkoJ3N5bnRheCc9PiclOm1hY3JvU3ludGF4JScsJy9zeW50YXgnPT4nJTptYWNyb1N5bnRheCUnLCdibG9jayc9Pic8P3BocCAlOm1hY3JvQmxvY2slID8+JywnL2Jsb2NrJz0+Jzw/cGhwICU6bWFjcm9CbG9ja0VuZCUgPz4nLCdjYXB0dXJlJz0+Jzw/cGhwICU6bWFjcm9DYXB0dXJlJSA/PicsJy9jYXB0dXJlJz0+Jzw/cGhwICU6bWFjcm9DYXB0dXJlRW5kJSA/PicsJ3NuaXBwZXQnPT4nPD9waHAgJTptYWNyb1NuaXBwZXQlID8+JywnL3NuaXBwZXQnPT4nPD9waHAgJTptYWNyb1NuaXBwZXRFbmQlID8+JywnY2FjaGUnPT4nPD9waHAgaWYgKCRfY2ItPmZvbyA9IE5DYWNoaW5nSGVscGVyOjpjcmVhdGUoJF9jYi0+a2V5ID0gbWQ1KF9fRklMRV9fKSAuIF9fTElORV9fLCAkdGVtcGxhdGUtPmdldEZpbGUoKSwgYXJyYXkoJSUpKSkgeyAkX2NiLT5jYWNoZXNbXSA9ICRfY2ItPmZvbyA/PicsJy9jYWNoZSc9Pic8P3BocCBhcnJheV9wb3AoJF9jYi0+Y2FjaGVzKS0+c2F2ZSgpOyB9IGlmICghZW1wdHkoJF9jYi0+Y2FjaGVzKSkgZW5kKCRfY2ItPmNhY2hlcyktPmFkZEl0ZW0oJF9jYi0+a2V5KSA/PicsJ2lmJz0+Jzw/cGhwIGlmICglJSk6ID8+JywnZWxzZWlmJz0+Jzw/cGhwIGVsc2VpZiAoJSUpOiA/PicsJ2Vsc2UnPT4nPD9waHAgZWxzZTogPz4nLCcvaWYnPT4nPD9waHAgZW5kaWYgPz4nLCdpZnNldCc9Pic8P3BocCBpZiAoaXNzZXQoJSUpKTogPz4nLCcvaWZzZXQnPT4nPD9waHAgZW5kaWYgPz4nLCdlbHNlaWZzZXQnPT4nPD9waHAgZWxzZWlmIChpc3NldCglJSkpOiA/PicsJ2ZvcmVhY2gnPT4nPD9waHAgZm9yZWFjaCAoJTptYWNyb0ZvcmVhY2glKTogPz4nLCcvZm9yZWFjaCc9Pic8P3BocCBlbmRmb3JlYWNoOyBhcnJheV9wb3AoJF9jYi0+aXRzKTsgJGl0ZXJhdG9yID0gZW5kKCRfY2ItPml0cykgPz4nLCdmb3InPT4nPD9waHAgZm9yICglJSk6ID8+JywnL2Zvcic9Pic8P3BocCBlbmRmb3IgPz4nLCd3aGlsZSc9Pic8P3BocCB3aGlsZSAoJSUpOiA/PicsJy93aGlsZSc9Pic8P3BocCBlbmR3aGlsZSA/PicsJ2NvbnRpbnVlSWYnPT4nPD9waHAgaWYgKCUlKSBjb250aW51ZSA/PicsJ2JyZWFrSWYnPT4nPD9waHAgaWYgKCUlKSBicmVhayA/PicsJ2luY2x1ZGUnPT4nPD9waHAgJTptYWNyb0luY2x1ZGUlID8+JywnZXh0ZW5kcyc9Pic8P3BocCAlOm1hY3JvRXh0ZW5kcyUgPz4nLCdsYXlvdXQnPT4nPD9waHAgJTptYWNyb0V4dGVuZHMlID8+JywncGxpbmsnPT4nPD9waHAgZWNobyAlOm1hY3JvRXNjYXBlJSglOm1hY3JvUGxpbmslKSA/PicsJ2xpbmsnPT4nPD9waHAgZWNobyAlOm1hY3JvRXNjYXBlJSglOm1hY3JvTGluayUpID8+JywnaWZDdXJyZW50Jz0+Jzw/cGhwICU6bWFjcm9JZkN1cnJlbnQlOyBpZiAoJHByZXNlbnRlci0+Z2V0TGFzdENyZWF0ZWRSZXF1ZXN0RmxhZygiY3VycmVudCIpKTogPz4nLCd3aWRnZXQnPT4nPD9waHAgJTptYWNyb1dpZGdldCUgPz4nLCdjb250cm9sJz0+Jzw/cGhwICU6bWFjcm9XaWRnZXQlID8+JywnYXR0cic9Pic8P3BocCBlY2hvIE5IdG1sOjplbChOVUxMKS0+JTptYWNyb0F0dHIlYXR0cmlidXRlcygpID8+JywnY29udGVudFR5cGUnPT4nPD9waHAgJTptYWNyb0NvbnRlbnRUeXBlJSA/PicsJ3N0YXR1cyc9Pic8P3BocCBORW52aXJvbm1lbnQ6OmdldEh0dHBSZXNwb25zZSgpLT5zZXRDb2RlKCUlKSA/PicsJ3Zhcic9Pic8P3BocCAlOm1hY3JvQXNzaWduJSA/PicsJ2Fzc2lnbic9Pic8P3BocCAlOm1hY3JvQXNzaWduJSA/PicsJ2RlZmF1bHQnPT4nPD9waHAgJTptYWNyb0RlZmF1bHQlID8+JywnZHVtcCc9Pic8P3BocCBORGVidWc6OmNvbnNvbGVEdW1wKCU6bWFjcm9EdW1wJSwgIlRlbXBsYXRlICIgLiBzdHJfcmVwbGFjZShORW52aXJvbm1lbnQ6OmdldFZhcmlhYmxlKCJhcHBEaXIiKSwgIlx4RTJceDgwXHhBNiIsICR0ZW1wbGF0ZS0+Z2V0RmlsZSgpKSkgPz4nLCdkZWJ1Z2JyZWFrJz0+Jzw/cGhwIGlmIChmdW5jdGlvbl9leGlzdHMoImRlYnVnYnJlYWsiKSkgZGVidWdicmVhaygpOyBlbHNlaWYgKGZ1bmN0aW9uX2V4aXN0cygieGRlYnVnX2JyZWFrIikpIHhkZWJ1Z19icmVhaygpID8+JywnIV8nPT4nPD9waHAgZWNobyAlOm1hY3JvVHJhbnNsYXRlJSA/PicsJyE9Jz0+Jzw/cGhwIGVjaG8gJTptYWNyb01vZGlmaWVycyUgPz4nLCdfJz0+Jzw/cGhwIGVjaG8gJTptYWNyb0VzY2FwZSUoJTptYWNyb1RyYW5zbGF0ZSUpID8+JywnPSc9Pic8P3BocCBlY2hvICU6bWFjcm9Fc2NhcGUlKCU6bWFjcm9Nb2RpZmllcnMlKSA/PicsJyEkJz0+Jzw/cGhwIGVjaG8gJTptYWNyb1ZhciUgPz4nLCchJz0+Jzw/cGhwIGVjaG8gJTptYWNyb1ZhciUgPz4nLCckJz0+Jzw/cGhwIGVjaG8gJTptYWNyb0VzY2FwZSUoJTptYWNyb1ZhciUpID8+JywnPyc9Pic8P3BocCAlOm1hY3JvTW9kaWZpZXJzJSA/PicpO3B1YmxpYyRtYWNyb3M7cHJpdmF0ZSRmaWx0ZXI7cHJpdmF0ZSRjdXJyZW50O3ByaXZhdGUkYmxvY2tzPWFycmF5KCk7cHJpdmF0ZSRuYW1lZEJsb2Nrcz1hcnJheSgpO3ByaXZhdGUkZXh0ZW5kcztwcml2YXRlJHVuaXE7Y29uc3QKQkxPQ0tfTkFNRUQ9MTtjb25zdApCTE9DS19DQVBUVVJFPTI7Y29uc3QKQkxPQ0tfQU5PTllNT1VTPTM7ZnVuY3Rpb24KX19jb25zdHJ1Y3QoKXskdGhpcy0+bWFjcm9zPXNlbGY6OiRkZWZhdWx0TWFjcm9zO31mdW5jdGlvbgppbml0aWFsaXplKCRmaWx0ZXIsJiRzKXskdGhpcy0+ZmlsdGVyPSRmaWx0ZXI7JHRoaXMtPmJsb2Nrcz1hcnJheSgpOyR0aGlzLT5uYW1lZEJsb2Nrcz1hcnJheSgpOyR0aGlzLT5leHRlbmRzPU5VTEw7JHRoaXMtPnVuaXE9c3Vic3RyKG1kNSh1bmlxaWQoJycsVFJVRSkpLDAsMTApOyRmaWx0ZXItPmNvbnRleHQ9TkxhdHRlRmlsdGVyOjpDT05URVhUX1RFWFQ7JGZpbHRlci0+ZXNjYXBlPSdOVGVtcGxhdGVIZWxwZXJzOjplc2NhcGVIdG1sJzskcz1wcmVnX3JlcGxhY2UoJyNcXHtcXCouKj9cXCpcXH1bXHJcbl0qI3MnLCcnLCRzKTskcz1wcmVnX3JlcGxhY2UoJyNAKFxce1tefV0rP1xcfSkjcycsJzw/cGhwIH0gPz4kMTw/cGhwIGlmIChOU25pcHBldEhlbHBlcjo6JG91dHB1dEFsbG93ZWQpIHsgPz4nLCRzKTt9ZnVuY3Rpb24KZmluYWxpemUoJiRzKXtpZihjb3VudCgkdGhpcy0+YmxvY2tzKT09PTEpeyRzLj0kdGhpcy0+bWFjcm8oJy9ibG9jaycsJycsJycpO31lbHNlaWYoJHRoaXMtPmJsb2Nrcyl7dGhyb3cKbmV3CkludmFsaWRTdGF0ZUV4Y2VwdGlvbigiVGhlcmUgYXJlIHNvbWUgdW5jbG9zZWQgYmxvY2tzLiIpO30kcz0iPD9waHBcbmlmICgiLidOU25pcHBldEhlbHBlcjo6JG91dHB1dEFsbG93ZWQnLiIpIHtcbj8+JHM8P3BocFxufVxuPz4iO2lmKCR0aGlzLT5uYW1lZEJsb2Nrc3x8JHRoaXMtPmV4dGVuZHMpeyRzPSI8P3BocFxuIi4naWYgKCRfY2ItPmV4dGVuZHMpIHsgb2Jfc3RhcnQoKTsgfScuIlxuIi4nPz4nLiRzLiI8P3BocFxuIi4naWYgKCRfY2ItPmV4dGVuZHMpIHsgb2JfZW5kX2NsZWFuKCk7IE5MYXR0ZU1hY3Jvczo6aW5jbHVkZVRlbXBsYXRlKCRfY2ItPmV4dGVuZHMsIGdldF9kZWZpbmVkX3ZhcnMoKSwgJHRlbXBsYXRlKS0+cmVuZGVyKCk7IH0nLiJcbiI7fWlmKCR0aGlzLT5uYW1lZEJsb2Nrcyl7Zm9yZWFjaChhcnJheV9yZXZlcnNlKCR0aGlzLT5uYW1lZEJsb2NrcyxUUlVFKWFzJG5hbWU9PiRmb28peyRuYW1lPXByZWdfcXVvdGUoJG5hbWUsJyMnKTskcz1wcmVnX3JlcGxhY2VfY2FsbGJhY2soIiN7YmxvY2sgKCRuYW1lKX0gXD8+KC4qKTxcP3BocCB7L2Jsb2NrICRuYW1lfSNzVSIsYXJyYXkoJHRoaXMsJ2NiTmFtZWRCbG9ja3MnKSwkcyk7fSRzPSI8P3BocFxuXG4iLmltcGxvZGUoIlxuXG5cbiIsJHRoaXMtPm5hbWVkQmxvY2tzKS4iXG5cbi8vXG4vLyBlbmQgb2YgYmxvY2tzXG4vL1xuPz4iLiRzO30kcz0iPD9waHBcbiIuJyRfY2IgPSBOTGF0dGVNYWNyb3M6OmluaXRSdW50aW1lKCR0ZW1wbGF0ZSwgJy52YXJfZXhwb3J0KCR0aGlzLT5leHRlbmRzLFRSVUUpLicsICcudmFyX2V4cG9ydCgkdGhpcy0+dW5pcSxUUlVFKS4iKTsgdW5zZXQoXCRfZXh0ZW5kcyk7XG4iLic/PicuJHM7fWZ1bmN0aW9uCm1hY3JvKCRtYWNybywkY29udGVudCwkbW9kaWZpZXJzKXtpZigkbWFjcm89PT0nJyl7JG1hY3JvPXN1YnN0cigkY29udGVudCwwLDIpO2lmKCFpc3NldCgkdGhpcy0+bWFjcm9zWyRtYWNyb10pKXskbWFjcm89c3Vic3RyKCRjb250ZW50LDAsMSk7aWYoIWlzc2V0KCR0aGlzLT5tYWNyb3NbJG1hY3JvXSkpe3JldHVybgpOVUxMO319JGNvbnRlbnQ9c3Vic3RyKCRjb250ZW50LHN0cmxlbigkbWFjcm8pKTt9ZWxzZWlmKCFpc3NldCgkdGhpcy0+bWFjcm9zWyRtYWNyb10pKXtyZXR1cm4KTlVMTDt9JHRoaXMtPmN1cnJlbnQ9YXJyYXkoJGNvbnRlbnQsJG1vZGlmaWVycyk7cmV0dXJuCnByZWdfcmVwbGFjZV9jYWxsYmFjaygnIyUoLio/KSUjJyxhcnJheSgkdGhpcywnY2JNYWNybycpLCR0aGlzLT5tYWNyb3NbJG1hY3JvXSk7fXByaXZhdGUKZnVuY3Rpb24KY2JNYWNybygkbSl7bGlzdCgkY29udGVudCwkbW9kaWZpZXJzKT0kdGhpcy0+Y3VycmVudDtpZigkbVsxXSl7cmV0dXJuCmNhbGxiYWNrKCRtWzFdWzBdPT09JzonP2FycmF5KCR0aGlzLHN1YnN0cigkbVsxXSwxKSk6JG1bMV0pLT5pbnZva2UoJGNvbnRlbnQsJG1vZGlmaWVycyk7fWVsc2V7cmV0dXJuJGNvbnRlbnQ7fX1mdW5jdGlvbgp0YWdNYWNybygkbmFtZSwkYXR0cnMsJGNsb3NpbmcpeyRrbm93blRhZ3M9YXJyYXkoJ2luY2x1ZGUnPT4nYmxvY2snLCdmb3InPT4nZWFjaCcsJ2Jsb2NrJz0+J25hbWUnLCdpZic9Pidjb25kJywnZWxzZWlmJz0+J2NvbmQnKTtyZXR1cm4kdGhpcy0+bWFjcm8oJGNsb3Npbmc/Ii8kbmFtZSI6JG5hbWUsaXNzZXQoJGtub3duVGFnc1skbmFtZV0sJGF0dHJzWyRrbm93blRhZ3NbJG5hbWVdXSk/JGF0dHJzWyRrbm93blRhZ3NbJG5hbWVdXTpzdWJzdHIodmFyX2V4cG9ydCgkYXR0cnMsVFJVRSksOCwtMSksaXNzZXQoJGF0dHJzWydtb2RpZmllcnMnXSk/JGF0dHJzWydtb2RpZmllcnMnXTonJyk7fWZ1bmN0aW9uCmF0dHJzTWFjcm8oJGNvZGUsJGF0dHJzLCRjbG9zaW5nKXskbGVmdD0kcmlnaHQ9Jyc7Zm9yZWFjaCgkdGhpcy0+bWFjcm9zCmFzJG5hbWU9PiRmb28pe2lmKCFpc3NldCgkdGhpcy0+bWFjcm9zWyIvJG5hbWUiXSkpe2NvbnRpbnVlO30kbWFjcm89JGNsb3Npbmc/Ii8kbmFtZSI6JG5hbWU7aWYoaXNzZXQoJGF0dHJzWyRuYW1lXSkpe2lmKCRjbG9zaW5nKXskcmlnaHQuPSR0aGlzLT5tYWNybygkbWFjcm8sJycsJycpO31lbHNleyRsZWZ0PSR0aGlzLT5tYWNybygkbWFjcm8sJGF0dHJzWyRuYW1lXSwnJykuJGxlZnQ7fX0kaW5uZXJOYW1lPSJpbm5lci0kbmFtZSI7aWYoaXNzZXQoJGF0dHJzWyRpbm5lck5hbWVdKSl7aWYoJGNsb3NpbmcpeyRsZWZ0Lj0kdGhpcy0+bWFjcm8oJG1hY3JvLCcnLCcnKTt9ZWxzZXskcmlnaHQ9JHRoaXMtPm1hY3JvKCRtYWNybywkYXR0cnNbJGlubmVyTmFtZV0sJycpLiRyaWdodDt9fSR0YWdOYW1lPSJ0YWctJG5hbWUiO2lmKGlzc2V0KCRhdHRyc1skdGFnTmFtZV0pKXskbGVmdD0kdGhpcy0+bWFjcm8oJG5hbWUsJGF0dHJzWyR0YWdOYW1lXSwnJykuJGxlZnQ7JHJpZ2h0Lj0kdGhpcy0+bWFjcm8oIi8kbmFtZSIsJycsJycpO311bnNldCgkYXR0cnNbJG5hbWVdLCRhdHRyc1skaW5uZXJOYW1lXSwkYXR0cnNbJHRhZ05hbWVdKTt9cmV0dXJuJGF0dHJzP05VTEw6JGxlZnQuJGNvZGUuJHJpZ2h0O31mdW5jdGlvbgptYWNyb1ZhcigkdmFyLCRtb2RpZmllcnMpe3JldHVybgpOTGF0dGVGaWx0ZXI6OmZvcm1hdE1vZGlmaWVycygnJCcuJHZhciwkbW9kaWZpZXJzKTt9ZnVuY3Rpb24KbWFjcm9UcmFuc2xhdGUoJHZhciwkbW9kaWZpZXJzKXtyZXR1cm4KTkxhdHRlRmlsdGVyOjpmb3JtYXRNb2RpZmllcnMoJHZhciwndHJhbnNsYXRlfCcuJG1vZGlmaWVycyk7fWZ1bmN0aW9uCm1hY3JvU3ludGF4KCR2YXIpe3N3aXRjaCgkdmFyKXtjYXNlJyc6Y2FzZSdsYXR0ZSc6JHRoaXMtPmZpbHRlci0+c2V0RGVsaW1pdGVycygnXFx7KD8hW1xcc1wnInt9XSknLCdcXH0nKTticmVhaztjYXNlJ2RvdWJsZSc6JHRoaXMtPmZpbHRlci0+c2V0RGVsaW1pdGVycygnXFx7XFx7KD8hW1xcc1wnInt9XSknLCdcXH1cXH0nKTticmVhaztjYXNlJ2FzcCc6JHRoaXMtPmZpbHRlci0+c2V0RGVsaW1pdGVycygnPCVccyonLCdccyolPicpO2JyZWFrO2Nhc2UncHl0aG9uJzokdGhpcy0+ZmlsdGVyLT5zZXREZWxpbWl0ZXJzKCdcXHtbeyVdXHMqJywnXHMqWyV9XVxcfScpO2JyZWFrO2Nhc2Unb2ZmJzokdGhpcy0+ZmlsdGVyLT5zZXREZWxpbWl0ZXJzKCdbXlx4MDAtXHhGRl0nLCcnKTticmVhaztkZWZhdWx0OnRocm93Cm5ldwpJbnZhbGlkU3RhdGVFeGNlcHRpb24oIlVua25vd24gbWFjcm8gc3ludGF4ICckdmFyJyBvbiBsaW5lIHskdGhpcy0+ZmlsdGVyLT5saW5lfS4iKTt9fWZ1bmN0aW9uCm1hY3JvSW5jbHVkZSgkY29udGVudCwkbW9kaWZpZXJzKXskZGVzdGluYXRpb249TkxhdHRlRmlsdGVyOjpmZXRjaFRva2VuKCRjb250ZW50KTskcGFyYW1zPU5MYXR0ZUZpbHRlcjo6Zm9ybWF0QXJyYXkoJGNvbnRlbnQpLigkY29udGVudD8nICsgJzonJyk7aWYoJGRlc3RpbmF0aW9uPT09TlVMTCl7dGhyb3cKbmV3CkludmFsaWRTdGF0ZUV4Y2VwdGlvbigiTWlzc2luZyBkZXN0aW5hdGlvbiBpbiB7aW5jbHVkZX0gb24gbGluZSB7JHRoaXMtPmZpbHRlci0+bGluZX0uIik7fWVsc2VpZigkZGVzdGluYXRpb25bMF09PT0nIycpeyRkZXN0aW5hdGlvbj1sdHJpbSgkZGVzdGluYXRpb24sJyMnKTtpZighcHJlZ19tYXRjaCgnI14nLk5MYXR0ZUZpbHRlcjo6UkVfSURFTlRJRklFUi4nJCMnLCRkZXN0aW5hdGlvbikpe3Rocm93Cm5ldwpJbnZhbGlkU3RhdGVFeGNlcHRpb24oIkluY2x1ZGVkIGJsb2NrIG5hbWUgbXVzdCBiZSBhbHBoYW51bWVyaWMgc3RyaW5nLCAnJGRlc3RpbmF0aW9uJyBnaXZlbiBvbiBsaW5lIHskdGhpcy0+ZmlsdGVyLT5saW5lfS4iKTt9JHBhcmVudD0kZGVzdGluYXRpb249PT0ncGFyZW50JztpZigkZGVzdGluYXRpb249PT0ncGFyZW50J3x8JGRlc3RpbmF0aW9uPT09J3RoaXMnKXskaXRlbT1lbmQoJHRoaXMtPmJsb2Nrcyk7d2hpbGUoJGl0ZW0mJiRpdGVtWzBdIT09c2VsZjo6QkxPQ0tfTkFNRUQpJGl0ZW09cHJldigkdGhpcy0+YmxvY2tzKTtpZighJGl0ZW0pe3Rocm93Cm5ldwpJbnZhbGlkU3RhdGVFeGNlcHRpb24oIkNhbm5vdCBpbmNsdWRlICRkZXN0aW5hdGlvbiBibG9jayBvdXRzaWRlIG9mIGFueSBibG9jayBvbiBsaW5lIHskdGhpcy0+ZmlsdGVyLT5saW5lfS4iKTt9JGRlc3RpbmF0aW9uPSRpdGVtWzFdO30kbmFtZT12YXJfZXhwb3J0KCRkZXN0aW5hdGlvbixUUlVFKTskcGFyYW1zLj0nZ2V0X2RlZmluZWRfdmFycygpJzskY21kPWlzc2V0KCR0aGlzLT5uYW1lZEJsb2Nrc1skZGVzdGluYXRpb25dKSYmISRwYXJlbnQ/ImNhbGxfdXNlcl9mdW5jKHJlc2V0KFwkX2NiLT5ibG9ja3NbJG5hbWVdKSwgJHBhcmFtcykiOidOTGF0dGVNYWNyb3M6OmNhbGxCbG9jaycuKCRwYXJlbnQ/J1BhcmVudCc6JycpLiIoXCRfY2ItPmJsb2NrcywgJG5hbWUsICRwYXJhbXMpIjtyZXR1cm4kbW9kaWZpZXJzPyJvYl9zdGFydCgpOyAkY21kOyBlY2hvICIuTkxhdHRlRmlsdGVyOjpmb3JtYXRNb2RpZmllcnMoJ29iX2dldF9jbGVhbigpJywkbW9kaWZpZXJzKTokY21kO31lbHNleyRkZXN0aW5hdGlvbj1OTGF0dGVGaWx0ZXI6OmZvcm1hdFN0cmluZygkZGVzdGluYXRpb24pOyRwYXJhbXMuPSckdGVtcGxhdGUtPmdldFBhcmFtcygpJztyZXR1cm4kbW9kaWZpZXJzPydlY2hvICcuTkxhdHRlRmlsdGVyOjpmb3JtYXRNb2RpZmllcnMoJ05MYXR0ZU1hY3Jvczo6aW5jbHVkZVRlbXBsYXRlJy4iKCRkZXN0aW5hdGlvbiwgJHBhcmFtcywgXCRfY2ItPnRlbXBsYXRlc1siLnZhcl9leHBvcnQoJHRoaXMtPnVuaXEsVFJVRSkuJ10pLT5fX3RvU3RyaW5nKFRSVUUpJywkbW9kaWZpZXJzKTonTkxhdHRlTWFjcm9zOjppbmNsdWRlVGVtcGxhdGUnLiIoJGRlc3RpbmF0aW9uLCAkcGFyYW1zLCBcJF9jYi0+dGVtcGxhdGVzWyIudmFyX2V4cG9ydCgkdGhpcy0+dW5pcSxUUlVFKS4nXSktPnJlbmRlcigpJzt9fWZ1bmN0aW9uCm1hY3JvRXh0ZW5kcygkY29udGVudCl7JGRlc3RpbmF0aW9uPU5MYXR0ZUZpbHRlcjo6ZmV0Y2hUb2tlbigkY29udGVudCk7aWYoJGRlc3RpbmF0aW9uPT09TlVMTCl7dGhyb3cKbmV3CkludmFsaWRTdGF0ZUV4Y2VwdGlvbigiTWlzc2luZyBkZXN0aW5hdGlvbiBpbiB7ZXh0ZW5kc30gb24gbGluZSB7JHRoaXMtPmZpbHRlci0+bGluZX0uIik7fWlmKCFlbXB0eSgkdGhpcy0+YmxvY2tzKSl7dGhyb3cKbmV3CkludmFsaWRTdGF0ZUV4Y2VwdGlvbigie2V4dGVuZHN9IG11c3QgYmUgcGxhY2VkIG91dHNpZGUgYW55IGJsb2NrOyBvbiBsaW5lIHskdGhpcy0+ZmlsdGVyLT5saW5lfS4iKTt9aWYoJHRoaXMtPmV4dGVuZHMhPT1OVUxMKXt0aHJvdwpuZXcKSW52YWxpZFN0YXRlRXhjZXB0aW9uKCJNdWx0aXBsZSB7ZXh0ZW5kc30gZGVjbGFyYXRpb25zIGFyZSBub3QgYWxsb3dlZDsgb24gbGluZSB7JHRoaXMtPmZpbHRlci0+bGluZX0uIik7fSR0aGlzLT5leHRlbmRzPSRkZXN0aW5hdGlvbiE9PSdub25lJztyZXR1cm4kdGhpcy0+ZXh0ZW5kcz8nJF9jYi0+ZXh0ZW5kcyA9ICcuTkxhdHRlRmlsdGVyOjpmb3JtYXRTdHJpbmcoJGRlc3RpbmF0aW9uKTonJzt9ZnVuY3Rpb24KbWFjcm9CbG9jaygkY29udGVudCwkbW9kaWZpZXJzKXtpZihzdWJzdHIoJGNvbnRlbnQsMCwxKT09PSckJyl7dHJpZ2dlcl9lcnJvcigiQ2FwdHVyaW5nIHtibG9jayAkY29udGVudH0gaXMgZGVwcmVjYXRlZDsgdXNlIHtjYXB0dXJlICRjb250ZW50fSBpbnN0ZWFkIG9uIGxpbmUgeyR0aGlzLT5maWx0ZXItPmxpbmV9LiIsRV9VU0VSX1dBUk5JTkcpO3JldHVybiR0aGlzLT5tYWNyb0NhcHR1cmUoJGNvbnRlbnQsJG1vZGlmaWVycyk7fSRuYW1lPU5MYXR0ZUZpbHRlcjo6ZmV0Y2hUb2tlbigkY29udGVudCk7aWYoJG5hbWU9PT1OVUxMKXskdGhpcy0+YmxvY2tzW109YXJyYXkoc2VsZjo6QkxPQ0tfQU5PTllNT1VTLE5VTEwsJG1vZGlmaWVycyk7cmV0dXJuJG1vZGlmaWVycz09PScnPycnOidvYl9zdGFydCgpJzt9ZWxzZXskbmFtZT1sdHJpbSgkbmFtZSwnIycpO2lmKCFwcmVnX21hdGNoKCcjXicuTkxhdHRlRmlsdGVyOjpSRV9JREVOVElGSUVSLickIycsJG5hbWUpKXt0aHJvdwpuZXcKSW52YWxpZFN0YXRlRXhjZXB0aW9uKCJCbG9jayBuYW1lIG11c3QgYmUgYWxwaGFudW1lcmljIHN0cmluZywgJyRuYW1lJyBnaXZlbiBvbiBsaW5lIHskdGhpcy0+ZmlsdGVyLT5saW5lfS4iKTt9ZWxzZWlmKGlzc2V0KCR0aGlzLT5uYW1lZEJsb2Nrc1skbmFtZV0pKXt0aHJvdwpuZXcKSW52YWxpZFN0YXRlRXhjZXB0aW9uKCJDYW5ub3QgcmVkZWNsYXJlIGJsb2NrICckbmFtZSc7IG9uIGxpbmUgeyR0aGlzLT5maWx0ZXItPmxpbmV9LiIpO30kdG9wPWVtcHR5KCR0aGlzLT5ibG9ja3MpOyR0aGlzLT5uYW1lZEJsb2Nrc1skbmFtZV09JG5hbWU7JHRoaXMtPmJsb2Nrc1tdPWFycmF5KHNlbGY6OkJMT0NLX05BTUVELCRuYW1lLCcnKTtpZighJHRvcCl7cmV0dXJuJHRoaXMtPm1hY3JvSW5jbHVkZSgnIycuJG5hbWUsJG1vZGlmaWVycykuIntibG9jayAkbmFtZX0iO31lbHNlaWYoJHRoaXMtPmV4dGVuZHMpe3JldHVybiJ7YmxvY2sgJG5hbWV9Ijt9ZWxzZXtyZXR1cm4naWYgKCEkX2NiLT5leHRlbmRzKSB7ICcuJHRoaXMtPm1hY3JvSW5jbHVkZSgnIycuJG5hbWUsJG1vZGlmaWVycykuIjsgfSB7YmxvY2sgJG5hbWV9Ijt9fX1mdW5jdGlvbgptYWNyb0Jsb2NrRW5kKCRjb250ZW50KXtsaXN0KCR0eXBlLCRuYW1lLCRtb2RpZmllcnMpPWFycmF5X3BvcCgkdGhpcy0+YmxvY2tzKTtpZigkdHlwZT09PXNlbGY6OkJMT0NLX0NBUFRVUkUpeyR0aGlzLT5ibG9ja3NbXT1hcnJheSgkdHlwZSwkbmFtZSwkbW9kaWZpZXJzKTtyZXR1cm4kdGhpcy0+bWFjcm9DYXB0dXJlRW5kKCRjb250ZW50KTt9aWYoKCR0eXBlIT09c2VsZjo6QkxPQ0tfTkFNRUQmJiR0eXBlIT09c2VsZjo6QkxPQ0tfQU5PTllNT1VTKXx8KCRjb250ZW50JiYkY29udGVudCE9PSRuYW1lKSl7dGhyb3cKbmV3CkludmFsaWRTdGF0ZUV4Y2VwdGlvbigiVGFnIHsvYmxvY2sgJGNvbnRlbnR9IHdhcyBub3QgZXhwZWN0ZWQgaGVyZSBvbiBsaW5lIHskdGhpcy0+ZmlsdGVyLT5saW5lfS4iKTt9ZWxzZWlmKCR0eXBlPT09c2VsZjo6QkxPQ0tfTkFNRUQpe3JldHVybiJ7L2Jsb2NrICRuYW1lfSI7fWVsc2V7cmV0dXJuJG1vZGlmaWVycz09PScnPycnOidlY2hvICcuTkxhdHRlRmlsdGVyOjpmb3JtYXRNb2RpZmllcnMoJ29iX2dldF9jbGVhbigpJywkbW9kaWZpZXJzKTt9fWZ1bmN0aW9uCm1hY3JvU25pcHBldCgkY29udGVudCl7JGFyZ3M9YXJyYXkoJycpO2lmKCRzbmlwcGV0PU5MYXR0ZUZpbHRlcjo6ZmV0Y2hUb2tlbigkY29udGVudCkpeyRhcmdzW109TkxhdHRlRmlsdGVyOjpmb3JtYXRTdHJpbmcoJHNuaXBwZXQpO31pZigkY29udGVudCl7JGFyZ3NbXT1OTGF0dGVGaWx0ZXI6OmZvcm1hdFN0cmluZygkY29udGVudCk7fXJldHVybid9IGlmICgkX2NiLT5mb28gPSBOU25pcHBldEhlbHBlcjo6Y3JlYXRlKCRjb250cm9sJy5pbXBsb2RlKCcsICcsJGFyZ3MpLicpKSB7ICRfY2ItPnNuaXBwZXRzW10gPSAkX2NiLT5mb28nO31mdW5jdGlvbgptYWNyb1NuaXBwZXRFbmQoJGNvbnRlbnQpe3JldHVybidhcnJheV9wb3AoJF9jYi0+c25pcHBldHMpLT5maW5pc2goKTsgfSBpZiAoTlNuaXBwZXRIZWxwZXI6OiRvdXRwdXRBbGxvd2VkKSB7Jzt9ZnVuY3Rpb24KbWFjcm9DYXB0dXJlKCRjb250ZW50LCRtb2RpZmllcnMpeyRuYW1lPU5MYXR0ZUZpbHRlcjo6ZmV0Y2hUb2tlbigkY29udGVudCk7aWYoc3Vic3RyKCRuYW1lLDAsMSkhPT0nJCcpe3Rocm93Cm5ldwpJbnZhbGlkU3RhdGVFeGNlcHRpb24oIkludmFsaWQgY2FwdHVyZSBibG9jayBwYXJhbWV0ZXIgJyRuYW1lJyBvbiBsaW5lIHskdGhpcy0+ZmlsdGVyLT5saW5lfS4iKTt9JHRoaXMtPmJsb2Nrc1tdPWFycmF5KHNlbGY6OkJMT0NLX0NBUFRVUkUsJG5hbWUsJG1vZGlmaWVycyk7cmV0dXJuJ29iX3N0YXJ0KCknO31mdW5jdGlvbgptYWNyb0NhcHR1cmVFbmQoJGNvbnRlbnQpe2xpc3QoJHR5cGUsJG5hbWUsJG1vZGlmaWVycyk9YXJyYXlfcG9wKCR0aGlzLT5ibG9ja3MpO2lmKCR0eXBlIT09c2VsZjo6QkxPQ0tfQ0FQVFVSRXx8KCRjb250ZW50JiYkY29udGVudCE9PSRuYW1lKSl7dGhyb3cKbmV3CkludmFsaWRTdGF0ZUV4Y2VwdGlvbigiVGFnIHsvY2FwdHVyZSAkY29udGVudH0gd2FzIG5vdCBleHBlY3RlZCBoZXJlIG9uIGxpbmUgeyR0aGlzLT5maWx0ZXItPmxpbmV9LiIpO31yZXR1cm4kbmFtZS4nPScuTkxhdHRlRmlsdGVyOjpmb3JtYXRNb2RpZmllcnMoJ29iX2dldF9jbGVhbigpJywkbW9kaWZpZXJzKTt9cHJpdmF0ZQpmdW5jdGlvbgpjYk5hbWVkQmxvY2tzKCRtYXRjaGVzKXtsaXN0KCwkbmFtZSwkY29udGVudCk9JG1hdGNoZXM7JGZ1bmM9J19jYmInLnN1YnN0cihtZDUoJHRoaXMtPnVuaXEuJG5hbWUpLDAsMTApLidfJy5wcmVnX3JlcGxhY2UoJyNbXmEtejAtOV9dI2knLCdfJywkbmFtZSk7JHRoaXMtPm5hbWVkQmxvY2tzWyRuYW1lXT0iLy9cbi8vIGJsb2NrICRuYW1lXG4vL1xuIi4iaWYgKCFmdW5jdGlvbl9leGlzdHMoXCRfY2ItPmJsb2Nrc1siLnZhcl9leHBvcnQoJG5hbWUsVFJVRSkuIl1bXSA9ICckZnVuYycpKSB7IGZ1bmN0aW9uICRmdW5jKFwkX2FyZ3MpIHsgZXh0cmFjdChcJF9hcmdzKVxuPz4kY29udGVudDw/cGhwXG59fSI7cmV0dXJuJyc7fWZ1bmN0aW9uCm1hY3JvRm9yZWFjaCgkY29udGVudCl7cmV0dXJuJyRpdGVyYXRvciA9ICRfY2ItPml0c1tdID0gbmV3IE5TbWFydENhY2hpbmdJdGVyYXRvcignLnByZWdfcmVwbGFjZSgnIyArYXMgKyNpJywnKSBhcyAnLCRjb250ZW50LDEpO31mdW5jdGlvbgptYWNyb0F0dHIoJGNvbnRlbnQpe3JldHVybgpwcmVnX3JlcGxhY2UoJyNcKVxzKyMnLCcpLT4nLCRjb250ZW50LicgJyk7fWZ1bmN0aW9uCm1hY3JvQ29udGVudFR5cGUoJGNvbnRlbnQpe2lmKHN0cnBvcygkY29udGVudCwnaHRtbCcpIT09RkFMU0UpeyR0aGlzLT5maWx0ZXItPmVzY2FwZT0nTlRlbXBsYXRlSGVscGVyczo6ZXNjYXBlSHRtbCc7JHRoaXMtPmZpbHRlci0+Y29udGV4dD1OTGF0dGVGaWx0ZXI6OkNPTlRFWFRfVEVYVDt9ZWxzZWlmKHN0cnBvcygkY29udGVudCwneG1sJykhPT1GQUxTRSl7JHRoaXMtPmZpbHRlci0+ZXNjYXBlPSdOVGVtcGxhdGVIZWxwZXJzOjplc2NhcGVYbWwnOyR0aGlzLT5maWx0ZXItPmNvbnRleHQ9TkxhdHRlRmlsdGVyOjpDT05URVhUX05PTkU7fWVsc2VpZihzdHJwb3MoJGNvbnRlbnQsJ2phdmFzY3JpcHQnKSE9PUZBTFNFKXskdGhpcy0+ZmlsdGVyLT5lc2NhcGU9J05UZW1wbGF0ZUhlbHBlcnM6OmVzY2FwZUpzJzskdGhpcy0+ZmlsdGVyLT5jb250ZXh0PU5MYXR0ZUZpbHRlcjo6Q09OVEVYVF9OT05FO31lbHNlaWYoc3RycG9zKCRjb250ZW50LCdjc3MnKSE9PUZBTFNFKXskdGhpcy0+ZmlsdGVyLT5lc2NhcGU9J05UZW1wbGF0ZUhlbHBlcnM6OmVzY2FwZUNzcyc7JHRoaXMtPmZpbHRlci0+Y29udGV4dD1OTGF0dGVGaWx0ZXI6OkNPTlRFWFRfTk9ORTt9ZWxzZWlmKHN0cnBvcygkY29udGVudCwncGxhaW4nKSE9PUZBTFNFKXskdGhpcy0+ZmlsdGVyLT5lc2NhcGU9Jyc7JHRoaXMtPmZpbHRlci0+Y29udGV4dD1OTGF0dGVGaWx0ZXI6OkNPTlRFWFRfTk9ORTt9ZWxzZXskdGhpcy0+ZmlsdGVyLT5lc2NhcGU9JyR0ZW1wbGF0ZS0+ZXNjYXBlJzskdGhpcy0+ZmlsdGVyLT5jb250ZXh0PU5MYXR0ZUZpbHRlcjo6Q09OVEVYVF9OT05FO31yZXR1cm4Kc3RycG9zKCRjb250ZW50LCcvJyk/J05FbnZpcm9ubWVudDo6Z2V0SHR0cFJlc3BvbnNlKCktPnNldEhlYWRlcigiQ29udGVudC1UeXBlIiwgIicuJGNvbnRlbnQuJyIpJzonJzt9ZnVuY3Rpb24KbWFjcm9EdW1wKCRjb250ZW50KXtyZXR1cm4kY29udGVudD8iYXJyYXkoIi52YXJfZXhwb3J0KCRjb250ZW50LFRSVUUpLiIgPT4gJGNvbnRlbnQpIjonZ2V0X2RlZmluZWRfdmFycygpJzt9ZnVuY3Rpb24KbWFjcm9XaWRnZXQoJGNvbnRlbnQpeyRwYWlyPU5MYXR0ZUZpbHRlcjo6ZmV0Y2hUb2tlbigkY29udGVudCk7aWYoJHBhaXI9PT1OVUxMKXt0aHJvdwpuZXcKSW52YWxpZFN0YXRlRXhjZXB0aW9uKCJNaXNzaW5nIHdpZGdldCBuYW1lIGluIHt3aWRnZXR9IG9uIGxpbmUgeyR0aGlzLT5maWx0ZXItPmxpbmV9LiIpO30kcGFpcj1leHBsb2RlKCc6JywkcGFpciwyKTskd2lkZ2V0PU5MYXR0ZUZpbHRlcjo6Zm9ybWF0U3RyaW5nKCRwYWlyWzBdKTskbWV0aG9kPWlzc2V0KCRwYWlyWzFdKT91Y2ZpcnN0KCRwYWlyWzFdKTonJzskbWV0aG9kPXByZWdfbWF0Y2goJyNeKCcuTkxhdHRlRmlsdGVyOjpSRV9JREVOVElGSUVSLid8KSQjJywkbWV0aG9kKT8icmVuZGVyJG1ldGhvZCI6IntcInJlbmRlciRtZXRob2RcIn0iOyRwYXJhbT1OTGF0dGVGaWx0ZXI6OmZvcm1hdEFycmF5KCRjb250ZW50KTtpZihzdHJwb3MoJGNvbnRlbnQsJz0+Jyk9PT1GQUxTRSkkcGFyYW09c3Vic3RyKCRwYXJhbSw2LC0xKTtyZXR1cm4oJHdpZGdldFswXT09PSckJz8iaWYgKGlzX29iamVjdCgkd2lkZ2V0KSkgeyR3aWRnZXR9LT4kbWV0aG9kKCRwYXJhbSk7IGVsc2UgIjonJykuIlwkY29udHJvbC0+Z2V0V2lkZ2V0KCR3aWRnZXQpLT4kbWV0aG9kKCRwYXJhbSkiO31mdW5jdGlvbgptYWNyb0xpbmsoJGNvbnRlbnQsJG1vZGlmaWVycyl7cmV0dXJuCk5MYXR0ZUZpbHRlcjo6Zm9ybWF0TW9kaWZpZXJzKCckY29udHJvbC0+bGluaygnLiR0aGlzLT5mb3JtYXRMaW5rKCRjb250ZW50KS4nKScsJG1vZGlmaWVycyk7fWZ1bmN0aW9uCm1hY3JvUGxpbmsoJGNvbnRlbnQsJG1vZGlmaWVycyl7cmV0dXJuCk5MYXR0ZUZpbHRlcjo6Zm9ybWF0TW9kaWZpZXJzKCckcHJlc2VudGVyLT5saW5rKCcuJHRoaXMtPmZvcm1hdExpbmsoJGNvbnRlbnQpLicpJywkbW9kaWZpZXJzKTt9ZnVuY3Rpb24KbWFjcm9JZkN1cnJlbnQoJGNvbnRlbnQpe3JldHVybiRjb250ZW50Pyd0cnkgeyAkcHJlc2VudGVyLT5saW5rKCcuJHRoaXMtPmZvcm1hdExpbmsoJGNvbnRlbnQpLicpOyB9IGNhdGNoIChOSW52YWxpZExpbmtFeGNlcHRpb24gJGUpIHt9JzonJzt9cHJpdmF0ZQpmdW5jdGlvbgpmb3JtYXRMaW5rKCRjb250ZW50KXtyZXR1cm4KTkxhdHRlRmlsdGVyOjpmb3JtYXRTdHJpbmcoTkxhdHRlRmlsdGVyOjpmZXRjaFRva2VuKCRjb250ZW50KSkuTkxhdHRlRmlsdGVyOjpmb3JtYXRBcnJheSgkY29udGVudCwnLCAnKTt9ZnVuY3Rpb24KbWFjcm9Bc3NpZ24oJGNvbnRlbnQsJG1vZGlmaWVycyl7aWYoISRjb250ZW50KXt0aHJvdwpuZXcKSW52YWxpZFN0YXRlRXhjZXB0aW9uKCJNaXNzaW5nIGFyZ3VtZW50cyBpbiB7dmFyfSBvciB7YXNzaWdufSBvbiBsaW5lIHskdGhpcy0+ZmlsdGVyLT5saW5lfS4iKTt9aWYoc3RycG9zKCRjb250ZW50LCc9PicpPT09RkFMU0Upe3JldHVybickJy5sdHJpbShOTGF0dGVGaWx0ZXI6OmZldGNoVG9rZW4oJGNvbnRlbnQpLCckJykuJyA9ICcuTkxhdHRlRmlsdGVyOjpmb3JtYXRNb2RpZmllcnMoJGNvbnRlbnQ9PT0nJz8nTlVMTCc6JGNvbnRlbnQsJG1vZGlmaWVycyk7fXJldHVybidleHRyYWN0KCcuTkxhdHRlRmlsdGVyOjpmb3JtYXRBcnJheSgkY29udGVudCkuJyknO31mdW5jdGlvbgptYWNyb0RlZmF1bHQoJGNvbnRlbnQpe2lmKCEkY29udGVudCl7dGhyb3cKbmV3CkludmFsaWRTdGF0ZUV4Y2VwdGlvbigiTWlzc2luZyBhcmd1bWVudHMgaW4ge2RlZmF1bHR9IG9uIGxpbmUgeyR0aGlzLT5maWx0ZXItPmxpbmV9LiIpO31yZXR1cm4nZXh0cmFjdCgnLk5MYXR0ZUZpbHRlcjo6Zm9ybWF0QXJyYXkoJGNvbnRlbnQpLicsIEVYVFJfU0tJUCknO31mdW5jdGlvbgptYWNyb0VzY2FwZSgkY29udGVudCl7cmV0dXJuJHRoaXMtPmZpbHRlci0+ZXNjYXBlO31mdW5jdGlvbgptYWNyb01vZGlmaWVycygkY29udGVudCwkbW9kaWZpZXJzKXtyZXR1cm4KTkxhdHRlRmlsdGVyOjpmb3JtYXRNb2RpZmllcnMoJGNvbnRlbnQsJG1vZGlmaWVycyk7fXN0YXRpYwpmdW5jdGlvbgpjYWxsQmxvY2soJiRibG9ja3MsJG5hbWUsJHBhcmFtcyl7aWYoZW1wdHkoJGJsb2Nrc1skbmFtZV0pKXt0aHJvdwpuZXcKSW52YWxpZFN0YXRlRXhjZXB0aW9uKCJDYWxsIHRvIHVuZGVmaW5lZCBibG9jayAnJG5hbWUnLiIpO30kYmxvY2s9cmVzZXQoJGJsb2Nrc1skbmFtZV0pOyRibG9jaygkcGFyYW1zKTt9c3RhdGljCmZ1bmN0aW9uCmNhbGxCbG9ja1BhcmVudCgmJGJsb2NrcywkbmFtZSwkcGFyYW1zKXtpZihlbXB0eSgkYmxvY2tzWyRuYW1lXSl8fCgkYmxvY2s9bmV4dCgkYmxvY2tzWyRuYW1lXSkpPT09RkFMU0Upe3Rocm93Cm5ldwpJbnZhbGlkU3RhdGVFeGNlcHRpb24oIkNhbGwgdG8gdW5kZWZpbmVkIHBhcmVudCBibG9jayAnJG5hbWUnLiIpO30kYmxvY2soJHBhcmFtcyk7fXN0YXRpYwpmdW5jdGlvbgppbmNsdWRlVGVtcGxhdGUoJGRlc3RpbmF0aW9uLCRwYXJhbXMsJHRlbXBsYXRlKXtpZigkZGVzdGluYXRpb24KaW5zdGFuY2VvZgpJVGVtcGxhdGUpeyR0cGw9JGRlc3RpbmF0aW9uO31lbHNlaWYoJGRlc3RpbmF0aW9uPT1OVUxMKXt0aHJvdwpuZXcKSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJUZW1wbGF0ZSBmaWxlIG5hbWUgd2FzIG5vdCBzcGVjaWZpZWQuIik7fWVsc2V7JHRwbD1jbG9uZSR0ZW1wbGF0ZTtpZigkdGVtcGxhdGUKaW5zdGFuY2VvZgpJRmlsZVRlbXBsYXRlKXtpZihzdWJzdHIoJGRlc3RpbmF0aW9uLDAsMSkhPT0nLycmJnN1YnN0cigkZGVzdGluYXRpb24sMSwxKSE9PSc6Jyl7JGRlc3RpbmF0aW9uPWRpcm5hbWUoJHRlbXBsYXRlLT5nZXRGaWxlKCkpLicvJy4kZGVzdGluYXRpb247fSR0cGwtPnNldEZpbGUoJGRlc3RpbmF0aW9uKTt9fSR0cGwtPnNldFBhcmFtcygkcGFyYW1zKTtyZXR1cm4kdHBsO31zdGF0aWMKZnVuY3Rpb24KaW5pdFJ1bnRpbWUoJHRlbXBsYXRlLCRleHRlbmRzLCRyZWFsRmlsZSl7JGNiPShvYmplY3QpTlVMTDtpZihpc3NldCgkdGVtcGxhdGUtPl9jYikpeyRjYi0+YmxvY2tzPSYkdGVtcGxhdGUtPl9jYi0+YmxvY2tzOyRjYi0+dGVtcGxhdGVzPSYkdGVtcGxhdGUtPl9jYi0+dGVtcGxhdGVzO30kY2ItPnRlbXBsYXRlc1skcmVhbEZpbGVdPSR0ZW1wbGF0ZTskY2ItPmV4dGVuZHM9aXNfYm9vbCgkZXh0ZW5kcyk/JGV4dGVuZHM6KGVtcHR5KCR0ZW1wbGF0ZS0+X2V4dGVuZHMpP0ZBTFNFOiR0ZW1wbGF0ZS0+X2V4dGVuZHMpO3Vuc2V0KCR0ZW1wbGF0ZS0+X2NiLCR0ZW1wbGF0ZS0+X2V4dGVuZHMpO2lmKCFlbXB0eSgkY2ItPmNhY2hlcykpe2VuZCgkY2ItPmNhY2hlcyktPmFkZEZpbGUoJHRlbXBsYXRlLT5nZXRGaWxlKCkpO31yZXR1cm4kY2I7fX1jbGFzcwpOU25pcHBldEhlbHBlcgpleHRlbmRzCk5PYmplY3R7cHVibGljCnN0YXRpYyRvdXRwdXRBbGxvd2VkPVRSVUU7cHJpdmF0ZSRpZDtwcml2YXRlJHRhZztwcml2YXRlJHBheWxvYWQ7cHJpdmF0ZSRsZXZlbDtzdGF0aWMKZnVuY3Rpb24KY3JlYXRlKE5Db250cm9sJGNvbnRyb2wsJG5hbWU9TlVMTCwkdGFnPSdkaXYnKXtpZihzZWxmOjokb3V0cHV0QWxsb3dlZCl7JG9iaj1uZXcKc2VsZjskb2JqLT50YWc9dHJpbSgkdGFnLCc8PicpO2lmKCRvYmotPnRhZyllY2hvJzwnLCRvYmotPnRhZywnIGlkPSInLCRjb250cm9sLT5nZXRTbmlwcGV0SWQoJG5hbWUpLCciPic7cmV0dXJuJG9iajt9ZWxzZWlmKCRjb250cm9sLT5pc0NvbnRyb2xJbnZhbGlkKCRuYW1lKSl7JG9iaj1uZXcKc2VsZjskb2JqLT5pZD0kY29udHJvbC0+Z2V0U25pcHBldElkKCRuYW1lKTskb2JqLT5wYXlsb2FkPSRjb250cm9sLT5nZXRQcmVzZW50ZXIoKS0+Z2V0UGF5bG9hZCgpO29iX3N0YXJ0KCk7JG9iai0+bGV2ZWw9b2JfZ2V0X2xldmVsKCk7c2VsZjo6JG91dHB1dEFsbG93ZWQ9VFJVRTtyZXR1cm4kb2JqO31lbHNle3JldHVybgpGQUxTRTt9fWZ1bmN0aW9uCmZpbmlzaCgpe2lmKCR0aGlzLT50YWchPT1OVUxMKXtpZigkdGhpcy0+dGFnKWVjaG8iPC8kdGhpcy0+dGFnPiI7fWVsc2V7aWYoJHRoaXMtPmxldmVsIT09b2JfZ2V0X2xldmVsKCkpe3Rocm93Cm5ldwpJbnZhbGlkU3RhdGVFeGNlcHRpb24oIlNuaXBwZXQgJyR0aGlzLT5pZCcgY2Fubm90IGJlIGVuZGVkIGhlcmUuIik7fSR0aGlzLT5wYXlsb2FkLT5zbmlwcGV0c1skdGhpcy0+aWRdPW9iX2dldF9jbGVhbigpO3NlbGY6OiRvdXRwdXRBbGxvd2VkPUZBTFNFO319fWZpbmFsCmNsYXNzCk5UZW1wbGF0ZUZpbHRlcnN7ZmluYWwKZnVuY3Rpb24KX19jb25zdHJ1Y3QoKXt0aHJvdwpuZXcKTG9naWNFeGNlcHRpb24oIkNhbm5vdCBpbnN0YW50aWF0ZSBzdGF0aWMgY2xhc3MgIi5nZXRfY2xhc3MoJHRoaXMpKTt9c3RhdGljCmZ1bmN0aW9uCnJlbW92ZVBocCgkcyl7cmV0dXJuCnByZWdfcmVwbGFjZSgnI1x4MDFAcGhwOnBcZCtAXHgwMiMnLCc8P3BocCA/PicsJHMpO31zdGF0aWMKZnVuY3Rpb24KcmVsYXRpdmVMaW5rcygkcyl7cmV0dXJuCnByZWdfcmVwbGFjZSgnIyhzcmN8aHJlZnxhY3Rpb24pXHMqPVxzKihbIlwnXSkoPyFbYS16XSs6fFtceDAxL1xcI10pIycsJyQxPSQyPD9waHAgZWNobyBcXCRiYXNlVXJpID8+Jywkcyk7fXN0YXRpYwpmdW5jdGlvbgpuZXR0ZUxpbmtzKCRzKXtyZXR1cm4KcHJlZ19yZXBsYWNlX2NhbGxiYWNrKCcjKHNyY3xocmVmfGFjdGlvbilccyo9XHMqKFsiXCddKShuZXR0ZTouKj8pKFtcIyJcJ10pIycsYXJyYXkoX19DTEFTU19fLCduZXR0ZUxpbmtzQ2InKSwkcyk7fXByaXZhdGUKc3RhdGljCmZ1bmN0aW9uCm5ldHRlTGlua3NDYigkbSl7bGlzdCgsJGF0dHIsJHF1b3RlLCR1cmksJGZyYWdtZW50KT0kbTskcGFydHM9cGFyc2VfdXJsKCR1cmkpO2lmKGlzc2V0KCRwYXJ0c1snc2NoZW1lJ10pJiYkcGFydHNbJ3NjaGVtZSddPT09J25ldHRlJyl7cmV0dXJuJGF0dHIuJz0nLiRxdW90ZS4nPD9waHAgZWNobyAkdGVtcGxhdGUtPmVzY2FwZSgkY29udHJvbC0+Jy4ibGluaygnIi4oaXNzZXQoJHBhcnRzWydwYXRoJ10pPyRwYXJ0c1sncGF0aCddOid0aGlzIScpLihpc3NldCgkcGFydHNbJ3F1ZXJ5J10pPyc/Jy4kcGFydHNbJ3F1ZXJ5J106JycpLidcJykpPz4nLiRmcmFnbWVudDt9ZWxzZXtyZXR1cm4kbVswXTt9fXB1YmxpYwpzdGF0aWMkdGV4eTtzdGF0aWMKZnVuY3Rpb24KdGV4eUVsZW1lbnRzKCRzKXtyZXR1cm4KcHJlZ19yZXBsYWNlX2NhbGxiYWNrKCcjPHRleHkoW14+XSopPiguKj8pPC90ZXh5PiNzJyxhcnJheShfX0NMQVNTX18sJ3RleHlDYicpLCRzKTt9cHJpdmF0ZQpzdGF0aWMKZnVuY3Rpb24KdGV4eUNiKCRtKXtsaXN0KCwkbUF0dHJzLCRtQ29udGVudCk9JG07JGF0dHJzPWFycmF5KCk7aWYoJG1BdHRycyl7cHJlZ19tYXRjaF9hbGwoJyMoW2EtejAtOTotXSspXHMqKD86PVxzKihcJ1teXCddKlwnfCJbXiJdKiJ8W15cJyJcc10rKSk/KCkjaXN1JywkbUF0dHJzLCRhcnIsUFJFR19TRVRfT1JERVIpO2ZvcmVhY2goJGFycgphcyRtKXska2V5PXN0cnRvbG93ZXIoJG1bMV0pOyR2YWw9JG1bMl07aWYoJHZhbD09TlVMTCkkYXR0cnNbJGtleV09VFJVRTtlbHNlaWYoJHZhbHswfT09PSdcJyd8fCR2YWx7MH09PT0nIicpJGF0dHJzWyRrZXldPWh0bWxfZW50aXR5X2RlY29kZShzdWJzdHIoJHZhbCwxLC0xKSxFTlRfUVVPVEVTLCdVVEYtOCcpO2Vsc2UkYXR0cnNbJGtleV09aHRtbF9lbnRpdHlfZGVjb2RlKCR2YWwsRU5UX1FVT1RFUywnVVRGLTgnKTt9fXJldHVybgpzZWxmOjokdGV4eS0+cHJvY2VzcygkbVsyXSk7fX1maW5hbApjbGFzcwpOVGVtcGxhdGVIZWxwZXJze2ZpbmFsCmZ1bmN0aW9uCl9fY29uc3RydWN0KCl7dGhyb3cKbmV3CkxvZ2ljRXhjZXB0aW9uKCJDYW5ub3QgaW5zdGFudGlhdGUgc3RhdGljIGNsYXNzICIuZ2V0X2NsYXNzKCR0aGlzKSk7fXN0YXRpYwpmdW5jdGlvbgpsb2FkZXIoJGhlbHBlcil7JGNhbGxiYWNrPWNhbGxiYWNrKCdOVGVtcGxhdGVIZWxwZXJzJywkaGVscGVyKTtpZigkY2FsbGJhY2stPmlzQ2FsbGFibGUoKSl7cmV0dXJuJGNhbGxiYWNrO30kY2FsbGJhY2s9Y2FsbGJhY2soJ05TdHJpbmcnLCRoZWxwZXIpO2lmKCRjYWxsYmFjay0+aXNDYWxsYWJsZSgpKXtyZXR1cm4kY2FsbGJhY2s7fX1zdGF0aWMKZnVuY3Rpb24KZXNjYXBlSHRtbCgkcyl7aWYoaXNfb2JqZWN0KCRzKSYmKCRzCmluc3RhbmNlb2YKSVRlbXBsYXRlfHwkcwppbnN0YW5jZW9mCk5IdG1sfHwkcwppbnN0YW5jZW9mCk5Gb3JtKSl7cmV0dXJuJHMtPl9fdG9TdHJpbmcoVFJVRSk7fXJldHVybgpodG1sU3BlY2lhbENoYXJzKCRzLEVOVF9RVU9URVMpO31zdGF0aWMKZnVuY3Rpb24KZXNjYXBlSHRtbENvbW1lbnQoJHMpe3JldHVybgpzdHJfcmVwbGFjZSgnLS0nLCctLT48IS0tJywkcyk7fXN0YXRpYwpmdW5jdGlvbgplc2NhcGVYTUwoJHMpe3JldHVybgpodG1sU3BlY2lhbENoYXJzKHByZWdfcmVwbGFjZSgnI1tceDAwLVx4MDhceDBCXHgwQ1x4MEUtXHgxRl0rIycsJycsJHMpLEVOVF9RVU9URVMpO31zdGF0aWMKZnVuY3Rpb24KZXNjYXBlQ3NzKCRzKXtyZXR1cm4KYWRkY3NsYXNoZXMoJHMsIlx4MDAuLlx4MkMuLzo7PD0+P0BbXFxdXmB7fH1+Iik7fXN0YXRpYwpmdW5jdGlvbgplc2NhcGVIdG1sQ3NzKCRzKXtyZXR1cm4KaHRtbFNwZWNpYWxDaGFycyhzZWxmOjplc2NhcGVDc3MoJHMpLEVOVF9RVU9URVMpO31zdGF0aWMKZnVuY3Rpb24KZXNjYXBlSnMoJHMpe2lmKGlzX29iamVjdCgkcykmJigkcwppbnN0YW5jZW9mCklUZW1wbGF0ZXx8JHMKaW5zdGFuY2VvZgpOSHRtbHx8JHMKaW5zdGFuY2VvZgpORm9ybSkpeyRzPSRzLT5fX3RvU3RyaW5nKFRSVUUpO31yZXR1cm4Kc3RyX3JlcGxhY2UoJ11dPicsJ11dXHgzRScsanNvbl9lbmNvZGUoJHMpKTt9c3RhdGljCmZ1bmN0aW9uCmVzY2FwZUh0bWxKcygkcyl7cmV0dXJuCmh0bWxTcGVjaWFsQ2hhcnMoc2VsZjo6ZXNjYXBlSnMoJHMpLEVOVF9RVU9URVMpO31zdGF0aWMKZnVuY3Rpb24Kc3RyaXAoJHMpe3JldHVybgpwcmVnX3JlcGxhY2VfY2FsbGJhY2soJyMoPC90ZXh0YXJlYXw8L3ByZXw8L3NjcmlwdHxeKS4qPyg/PTx0ZXh0YXJlYXw8cHJlfDxzY3JpcHR8JCkjc2knLGNyZWF0ZV9mdW5jdGlvbignJG0nLCdyZXR1cm4gdHJpbShwcmVnX3JlcGxhY2UoIiNbIFx0XHJcbl0rIyIsICIgIiwgJG1bMF0pKTsnKSwkcyk7fXN0YXRpYwpmdW5jdGlvbgppbmRlbnQoJHMsJGxldmVsPTEsJGNoYXJzPSJcdCIpe2lmKCRsZXZlbD49MSl7JHM9cHJlZ19yZXBsYWNlX2NhbGxiYWNrKCcjPCh0ZXh0YXJlYXxwcmUpLio/PC9cXDEjc2knLGNyZWF0ZV9mdW5jdGlvbignJG0nLCdyZXR1cm4gc3RydHIoJG1bMF0sICIgXHRcclxuIiwgIlx4MUZceDFFXHgxRFx4MUEiKTsnKSwkcyk7JHM9TlN0cmluZzo6aW5kZW50KCRzLCRsZXZlbCwkY2hhcnMpOyRzPXN0cnRyKCRzLCJceDFGXHgxRVx4MURceDFBIiwiIFx0XHJcbiIpO31yZXR1cm4kczt9c3RhdGljCmZ1bmN0aW9uCmRhdGUoJHRpbWUsJGZvcm1hdD0iJXgiKXtpZigkdGltZT09TlVMTCl7cmV0dXJuCk5VTEw7fSR0aW1lPU5Ub29sczo6Y3JlYXRlRGF0ZVRpbWUoJHRpbWUpO3JldHVybgpzdHJwb3MoJGZvcm1hdCwnJScpPT09RkFMU0U/JHRpbWUtPmZvcm1hdCgkZm9ybWF0KTpzdHJmdGltZSgkZm9ybWF0LCR0aW1lLT5mb3JtYXQoJ1UnKSk7fXN0YXRpYwpmdW5jdGlvbgpieXRlcygkYnl0ZXMsJHByZWNpc2lvbj0yKXskYnl0ZXM9cm91bmQoJGJ5dGVzKTskdW5pdHM9YXJyYXkoJ0InLCdrQicsJ01CJywnR0InLCdUQicsJ1BCJyk7Zm9yZWFjaCgkdW5pdHMKYXMkdW5pdCl7aWYoYWJzKCRieXRlcyk8MTAyNHx8JHVuaXQ9PT1lbmQoJHVuaXRzKSlicmVhazskYnl0ZXM9JGJ5dGVzLzEwMjQ7fXJldHVybgpyb3VuZCgkYnl0ZXMsJHByZWNpc2lvbikuJyAnLiR1bml0O31zdGF0aWMKZnVuY3Rpb24KbGVuZ3RoKCR2YXIpe3JldHVybgppc19zdHJpbmcoJHZhcik/aWNvbnZfc3RybGVuKCR2YXIsJ1VURi04Jyk6Y291bnQoJHZhcik7fXN0YXRpYwpmdW5jdGlvbgpyZXBsYWNlKCRzdWJqZWN0LCRzZWFyY2gsJHJlcGxhY2VtZW50PScnKXtyZXR1cm4Kc3RyX3JlcGxhY2UoJHNlYXJjaCwkcmVwbGFjZW1lbnQsJHN1YmplY3QpO31zdGF0aWMKZnVuY3Rpb24KcmVwbGFjZVJlKCRzdWJqZWN0LCRwYXR0ZXJuLCRyZXBsYWNlbWVudD0nJyl7cmV0dXJuCnByZWdfcmVwbGFjZSgkcGF0dGVybiwkcmVwbGFjZW1lbnQsJHN1YmplY3QpO31zdGF0aWMKZnVuY3Rpb24KbnVsbCgkdmFsdWUpe3JldHVybicnO319Y2xhc3MKTlRlbXBsYXRlCmV4dGVuZHMKTkJhc2VUZW1wbGF0ZQppbXBsZW1lbnRzCklGaWxlVGVtcGxhdGV7cHVibGljCnN0YXRpYyRjYWNoZUV4cGlyZT1GQUxTRTtwcml2YXRlCnN0YXRpYyRjYWNoZVN0b3JhZ2U7cHJpdmF0ZSRmaWxlO2Z1bmN0aW9uCl9fY29uc3RydWN0KCRmaWxlPU5VTEwpe2lmKCRmaWxlIT09TlVMTCl7JHRoaXMtPnNldEZpbGUoJGZpbGUpO319ZnVuY3Rpb24Kc2V0RmlsZSgkZmlsZSl7aWYoIWlzX2ZpbGUoJGZpbGUpKXt0aHJvdwpuZXcKRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCJNaXNzaW5nIHRlbXBsYXRlIGZpbGUgJyRmaWxlJy4iKTt9JHRoaXMtPmZpbGU9JGZpbGU7cmV0dXJuJHRoaXM7fWZ1bmN0aW9uCmdldEZpbGUoKXtyZXR1cm4kdGhpcy0+ZmlsZTt9ZnVuY3Rpb24KcmVuZGVyKCl7aWYoJHRoaXMtPmZpbGU9PU5VTEwpe3Rocm93Cm5ldwpJbnZhbGlkU3RhdGVFeGNlcHRpb24oIlRlbXBsYXRlIGZpbGUgbmFtZSB3YXMgbm90IHNwZWNpZmllZC4iKTt9JHRoaXMtPl9fc2V0KCd0ZW1wbGF0ZScsJHRoaXMpOyRjYWNoZT1uZXcKTkNhY2hlKCR0aGlzLT5nZXRDYWNoZVN0b3JhZ2UoKSwnTmV0dGUuVGVtcGxhdGUnKTska2V5PW1kNSgkdGhpcy0+ZmlsZSkuJy4nLmJhc2VuYW1lKCR0aGlzLT5maWxlKTskY2FjaGVkPSRjb250ZW50PSRjYWNoZVska2V5XTtpZigkY29udGVudD09PU5VTEwpe2lmKCEkdGhpcy0+Z2V0RmlsdGVycygpKXskdGhpcy0+b25QcmVwYXJlRmlsdGVycygkdGhpcyk7fWlmKCEkdGhpcy0+Z2V0RmlsdGVycygpKXtOTGltaXRlZFNjb3BlOjpsb2FkKCR0aGlzLT5maWxlLCR0aGlzLT5nZXRQYXJhbXMoKSk7cmV0dXJuO310cnl7JHNob3J0TmFtZT0kdGhpcy0+ZmlsZTskc2hvcnROYW1lPXN0cl9yZXBsYWNlKE5FbnZpcm9ubWVudDo6Z2V0VmFyaWFibGUoJ2FwcERpcicpLCJceEUyXHg4MFx4QTYiLCRzaG9ydE5hbWUpO31jYXRjaChFeGNlcHRpb24kZm9vKXt9JGNvbnRlbnQ9JHRoaXMtPmNvbXBpbGUoZmlsZV9nZXRfY29udGVudHMoJHRoaXMtPmZpbGUpLCJmaWxlICRzaG9ydE5hbWUiKTskY2FjaGUtPnNhdmUoJGtleSwkY29udGVudCxhcnJheShOQ2FjaGU6OkZJTEVTPT4kdGhpcy0+ZmlsZSxOQ2FjaGU6OkVYUElSRT0+c2VsZjo6JGNhY2hlRXhwaXJlKSk7JGNhY2hlLT5yZWxlYXNlKCk7JGNhY2hlZD0kY2FjaGVbJGtleV07fWlmKCRjYWNoZWQhPT1OVUxMJiZzZWxmOjokY2FjaGVTdG9yYWdlCmluc3RhbmNlb2YKTlRlbXBsYXRlQ2FjaGVTdG9yYWdlKXtOTGltaXRlZFNjb3BlOjpsb2FkKCRjYWNoZWRbJ2ZpbGUnXSwkdGhpcy0+Z2V0UGFyYW1zKCkpO2ZjbG9zZSgkY2FjaGVkWydoYW5kbGUnXSk7fWVsc2V7TkxpbWl0ZWRTY29wZTo6ZXZhbHVhdGUoJGNvbnRlbnQsJHRoaXMtPmdldFBhcmFtcygpKTt9fXN0YXRpYwpmdW5jdGlvbgpzZXRDYWNoZVN0b3JhZ2UoSUNhY2hlU3RvcmFnZSRzdG9yYWdlKXtzZWxmOjokY2FjaGVTdG9yYWdlPSRzdG9yYWdlO31zdGF0aWMKZnVuY3Rpb24KZ2V0Q2FjaGVTdG9yYWdlKCl7aWYoc2VsZjo6JGNhY2hlU3RvcmFnZT09PU5VTEwpe3NlbGY6OiRjYWNoZVN0b3JhZ2U9bmV3Ck5UZW1wbGF0ZUNhY2hlU3RvcmFnZShORW52aXJvbm1lbnQ6OmdldFZhcmlhYmxlKCd0ZW1wRGlyJykpO31yZXR1cm4Kc2VsZjo6JGNhY2hlU3RvcmFnZTt9fWNsYXNzCk5UZW1wbGF0ZUNhY2hlU3RvcmFnZQpleHRlbmRzCk5GaWxlU3RvcmFnZXtwcm90ZWN0ZWQKZnVuY3Rpb24KcmVhZERhdGEoJG1ldGEpe3JldHVybgphcnJheSgnZmlsZSc9PiRtZXRhW3NlbGY6OkZJTEVdLCdoYW5kbGUnPT4kbWV0YVtzZWxmOjpIQU5ETEVdKTt9cHJvdGVjdGVkCmZ1bmN0aW9uCmdldENhY2hlRmlsZSgka2V5KXtyZXR1cm4KcGFyZW50OjpnZXRDYWNoZUZpbGUoJGtleSkuJy5waHAnO319ZmluYWwKY2xhc3MKTkFycmF5VG9vbHN7ZmluYWwKZnVuY3Rpb24KX19jb25zdHJ1Y3QoKXt0aHJvdwpuZXcKTG9naWNFeGNlcHRpb24oIkNhbm5vdCBpbnN0YW50aWF0ZSBzdGF0aWMgY2xhc3MgIi5nZXRfY2xhc3MoJHRoaXMpKTt9c3RhdGljCmZ1bmN0aW9uCmdldChhcnJheSRhcnIsJGtleSwkZGVmYXVsdD1OVUxMKXtmb3JlYWNoKGlzX2FycmF5KCRrZXkpPyRrZXk6YXJyYXkoJGtleSlhcyRrKXtpZihpc19hcnJheSgkYXJyKSYmYXJyYXlfa2V5X2V4aXN0cygkaywkYXJyKSl7JGFycj0kYXJyWyRrXTt9ZWxzZXtyZXR1cm4kZGVmYXVsdDt9fXJldHVybiRhcnI7fXN0YXRpYwpmdW5jdGlvbiZnZXRSZWYoJiRhcnIsJGtleSl7Zm9yZWFjaChpc19hcnJheSgka2V5KT8ka2V5OmFycmF5KCRrZXkpYXMkayl7aWYoaXNfYXJyYXkoJGFycil8fCRhcnI9PT1OVUxMKXskYXJyPSYkYXJyWyRrXTt9ZWxzZXt0aHJvdwpuZXcKSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdUcmF2ZXJzZWQgaXRlbSBpcyBub3QgYW4gYXJyYXkuJyk7fX1yZXR1cm4kYXJyO31zdGF0aWMKZnVuY3Rpb24KbWVyZ2VUcmVlKCRhcnIxLCRhcnIyKXskcmVzPSRhcnIxKyRhcnIyO2ZvcmVhY2goYXJyYXlfaW50ZXJzZWN0X2tleSgkYXJyMSwkYXJyMilhcyRrPT4kdil7aWYoaXNfYXJyYXkoJHYpJiZpc19hcnJheSgkYXJyMlska10pKXskcmVzWyRrXT1zZWxmOjptZXJnZVRyZWUoJHYsJGFycjJbJGtdKTt9fXJldHVybiRyZXM7fXN0YXRpYwpmdW5jdGlvbgpzZWFyY2hLZXkoJGFyciwka2V5KXskZm9vPWFycmF5KCRrZXk9Pk5VTEwpO3JldHVybgphcnJheV9zZWFyY2goa2V5KCRmb28pLGFycmF5X2tleXMoJGFyciksVFJVRSk7fXN0YXRpYwpmdW5jdGlvbgppbnNlcnRCZWZvcmUoYXJyYXkmJGFyciwka2V5LGFycmF5JGluc2VydGVkKXskb2Zmc2V0PXNlbGY6OnNlYXJjaEtleSgkYXJyLCRrZXkpOyRhcnI9YXJyYXlfc2xpY2UoJGFyciwwLCRvZmZzZXQsVFJVRSkrJGluc2VydGVkK2FycmF5X3NsaWNlKCRhcnIsJG9mZnNldCxjb3VudCgkYXJyKSxUUlVFKTt9c3RhdGljCmZ1bmN0aW9uCmluc2VydEFmdGVyKGFycmF5JiRhcnIsJGtleSxhcnJheSRpbnNlcnRlZCl7JG9mZnNldD1zZWxmOjpzZWFyY2hLZXkoJGFyciwka2V5KTskb2Zmc2V0PSRvZmZzZXQ9PT1GQUxTRT9jb3VudCgkYXJyKTokb2Zmc2V0KzE7JGFycj1hcnJheV9zbGljZSgkYXJyLDAsJG9mZnNldCxUUlVFKSskaW5zZXJ0ZWQrYXJyYXlfc2xpY2UoJGFyciwkb2Zmc2V0LGNvdW50KCRhcnIpLFRSVUUpO31zdGF0aWMKZnVuY3Rpb24KcmVuYW1lS2V5KGFycmF5JiRhcnIsJG9sZEtleSwkbmV3S2V5KXskb2Zmc2V0PXNlbGY6OnNlYXJjaEtleSgkYXJyLCRvbGRLZXkpO2lmKCRvZmZzZXQhPT1GQUxTRSl7JGtleXM9YXJyYXlfa2V5cygkYXJyKTska2V5c1skb2Zmc2V0XT0kbmV3S2V5OyRhcnI9YXJyYXlfY29tYmluZSgka2V5cywkYXJyKTt9fX1jbGFzcwpEYXRlVGltZTUzCmV4dGVuZHMKRGF0ZVRpbWV7ZnVuY3Rpb24KX19zbGVlcCgpeyR0aGlzLT5maXg9YXJyYXkoJHRoaXMtPmZvcm1hdCgnWS1tLWQgSDppOnMnKSwkdGhpcy0+Z2V0VGltZXpvbmUoKS0+Z2V0TmFtZSgpKTtyZXR1cm4KYXJyYXkoJ2ZpeCcpO31mdW5jdGlvbgpfX3dha2V1cCgpeyR0aGlzLT5fX2NvbnN0cnVjdCgkdGhpcy0+Zml4WzBdLG5ldwpEYXRlVGltZVpvbmUoJHRoaXMtPmZpeFsxXSkpO3Vuc2V0KCR0aGlzLT5maXgpO31mdW5jdGlvbgpnZXRUaW1lc3RhbXAoKXtyZXR1cm4oaW50KSR0aGlzLT5mb3JtYXQoJ1UnKTt9ZnVuY3Rpb24Kc2V0VGltZXN0YW1wKCR0aW1lc3RhbXApe3JldHVybiR0aGlzLT5fX2NvbnN0cnVjdChnbWRhdGUoJ1ktbS1kIEg6aTpzJywkdGltZXN0YW1wKSxuZXcKRGF0ZVRpbWVab25lKCR0aGlzLT5nZXRUaW1lem9uZSgpLT5nZXROYW1lKCkpKTt9fWNsYXNzCk5JbWFnZQpleHRlbmRzCk5PYmplY3R7Y29uc3QKRU5MQVJHRT0xO2NvbnN0ClNUUkVUQ0g9Mjtjb25zdApGSVQ9MDtjb25zdApGSUxMPTQ7Y29uc3QKSlBFRz1JTUFHRVRZUEVfSlBFRztjb25zdApQTkc9SU1BR0VUWVBFX1BORztjb25zdApHSUY9SU1BR0VUWVBFX0dJRjtjb25zdApFTVBUWV9HSUY9IkdJRjg5YVx4MDFceDAwXHgwMVx4MDBceDgwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAhXHhmOVx4MDRceDAxXHgwMFx4MDBceDAwXHgwMCxceDAwXHgwMFx4MDBceDAwXHgwMVx4MDBceDAxXHgwMFx4MDBceDAyXHgwMkRceDAxXHgwMDsiO3B1YmxpYwpzdGF0aWMkdXNlSW1hZ2VNYWdpY2s9RkFMU0U7cHJpdmF0ZSRpbWFnZTtzdGF0aWMKZnVuY3Rpb24KcmdiKCRyZWQsJGdyZWVuLCRibHVlLCR0cmFuc3BhcmVuY3k9MCl7cmV0dXJuCmFycmF5KCdyZWQnPT5tYXgoMCxtaW4oMjU1LChpbnQpJHJlZCkpLCdncmVlbic9Pm1heCgwLG1pbigyNTUsKGludCkkZ3JlZW4pKSwnYmx1ZSc9Pm1heCgwLG1pbigyNTUsKGludCkkYmx1ZSkpLCdhbHBoYSc9Pm1heCgwLG1pbigxMjcsKGludCkkdHJhbnNwYXJlbmN5KSkpO31zdGF0aWMKZnVuY3Rpb24KZnJvbUZpbGUoJGZpbGUsJiRmb3JtYXQ9TlVMTCl7aWYoIWV4dGVuc2lvbl9sb2FkZWQoJ2dkJykpe3Rocm93Cm5ldwpFeGNlcHRpb24oIlBIUCBleHRlbnNpb24gR0QgaXMgbm90IGxvYWRlZC4iKTt9JGluZm89QGdldGltYWdlc2l6ZSgkZmlsZSk7aWYoc2VsZjo6JHVzZUltYWdlTWFnaWNrJiYoZW1wdHkoJGluZm8pfHwkaW5mb1swXSokaW5mb1sxXT45ZTUpKXtyZXR1cm4KbmV3Ck5JbWFnZU1hZ2ljaygkZmlsZSwkZm9ybWF0KTt9c3dpdGNoKCRmb3JtYXQ9JGluZm9bMl0pe2Nhc2UKc2VsZjo6SlBFRzpyZXR1cm4KbmV3CnNlbGYoaW1hZ2VjcmVhdGVmcm9tanBlZygkZmlsZSkpO2Nhc2UKc2VsZjo6UE5HOnJldHVybgpuZXcKc2VsZihpbWFnZWNyZWF0ZWZyb21wbmcoJGZpbGUpKTtjYXNlCnNlbGY6OkdJRjpyZXR1cm4KbmV3CnNlbGYoaW1hZ2VjcmVhdGVmcm9tZ2lmKCRmaWxlKSk7ZGVmYXVsdDppZihzZWxmOjokdXNlSW1hZ2VNYWdpY2spe3JldHVybgpuZXcKTkltYWdlTWFnaWNrKCRmaWxlLCRmb3JtYXQpO310aHJvdwpuZXcKRXhjZXB0aW9uKCJVbmtub3duIGltYWdlIHR5cGUgb3IgZmlsZSAnJGZpbGUnIG5vdCBmb3VuZC4iKTt9fXN0YXRpYwpmdW5jdGlvbgpmcm9tU3RyaW5nKCRzLCYkZm9ybWF0PU5VTEwpe2lmKCFleHRlbnNpb25fbG9hZGVkKCdnZCcpKXt0aHJvdwpuZXcKRXhjZXB0aW9uKCJQSFAgZXh0ZW5zaW9uIEdEIGlzIG5vdCBsb2FkZWQuIik7fWlmKHN0cm5jbXAoJHMsIlx4ZmZceGQ4IiwyKT09PTApeyRmb3JtYXQ9c2VsZjo6SlBFRzt9ZWxzZWlmKHN0cm5jbXAoJHMsIlx4ODlQTkciLDQpPT09MCl7JGZvcm1hdD1zZWxmOjpQTkc7fWVsc2VpZihzdHJuY21wKCRzLCJHSUYiLDMpPT09MCl7JGZvcm1hdD1zZWxmOjpHSUY7fWVsc2V7JGZvcm1hdD1OVUxMO31yZXR1cm4KbmV3CnNlbGYoaW1hZ2VjcmVhdGVmcm9tc3RyaW5nKCRzKSk7fXN0YXRpYwpmdW5jdGlvbgpmcm9tQmxhbmsoJHdpZHRoLCRoZWlnaHQsJGNvbG9yPU5VTEwpe2lmKCFleHRlbnNpb25fbG9hZGVkKCdnZCcpKXt0aHJvdwpuZXcKRXhjZXB0aW9uKCJQSFAgZXh0ZW5zaW9uIEdEIGlzIG5vdCBsb2FkZWQuIik7fSR3aWR0aD0oaW50KSR3aWR0aDskaGVpZ2h0PShpbnQpJGhlaWdodDtpZigkd2lkdGg8MXx8JGhlaWdodDwxKXt0aHJvdwpuZXcKSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdJbWFnZSB3aWR0aCBhbmQgaGVpZ2h0IG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8uJyk7fSRpbWFnZT1pbWFnZWNyZWF0ZXRydWVjb2xvcigkd2lkdGgsJGhlaWdodCk7aWYoaXNfYXJyYXkoJGNvbG9yKSl7JGNvbG9yKz1hcnJheSgnYWxwaGEnPT4wKTskY29sb3I9aW1hZ2Vjb2xvcmFsbG9jYXRlYWxwaGEoJGltYWdlLCRjb2xvclsncmVkJ10sJGNvbG9yWydncmVlbiddLCRjb2xvclsnYmx1ZSddLCRjb2xvclsnYWxwaGEnXSk7aW1hZ2VhbHBoYWJsZW5kaW5nKCRpbWFnZSxGQUxTRSk7aW1hZ2VmaWxsZWRyZWN0YW5nbGUoJGltYWdlLDAsMCwkd2lkdGgtMSwkaGVpZ2h0LTEsJGNvbG9yKTtpbWFnZWFscGhhYmxlbmRpbmcoJGltYWdlLFRSVUUpO31yZXR1cm4KbmV3CnNlbGYoJGltYWdlKTt9ZnVuY3Rpb24KX19jb25zdHJ1Y3QoJGltYWdlKXskdGhpcy0+c2V0SW1hZ2VSZXNvdXJjZSgkaW1hZ2UpO31mdW5jdGlvbgpnZXRXaWR0aCgpe3JldHVybgppbWFnZXN4KCR0aGlzLT5pbWFnZSk7fWZ1bmN0aW9uCmdldEhlaWdodCgpe3JldHVybgppbWFnZXN5KCR0aGlzLT5pbWFnZSk7fXByb3RlY3RlZApmdW5jdGlvbgpzZXRJbWFnZVJlc291cmNlKCRpbWFnZSl7aWYoIWlzX3Jlc291cmNlKCRpbWFnZSl8fGdldF9yZXNvdXJjZV90eXBlKCRpbWFnZSkhPT0nZ2QnKXt0aHJvdwpuZXcKSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdJbWFnZSBpcyBub3QgdmFsaWQuJyk7fSR0aGlzLT5pbWFnZT0kaW1hZ2U7cmV0dXJuJHRoaXM7fWZ1bmN0aW9uCmdldEltYWdlUmVzb3VyY2UoKXtyZXR1cm4kdGhpcy0+aW1hZ2U7fWZ1bmN0aW9uCnJlc2l6ZSgkd2lkdGgsJGhlaWdodCwkZmxhZ3M9c2VsZjo6RklUKXtsaXN0KCRuZXdXaWR0aCwkbmV3SGVpZ2h0KT1zZWxmOjpjYWxjdWxhdGVTaXplKCR0aGlzLT5nZXRXaWR0aCgpLCR0aGlzLT5nZXRIZWlnaHQoKSwkd2lkdGgsJGhlaWdodCwkZmxhZ3MpO2lmKCRuZXdXaWR0aCE9PSR0aGlzLT5nZXRXaWR0aCgpfHwkbmV3SGVpZ2h0IT09JHRoaXMtPmdldEhlaWdodCgpKXskbmV3SW1hZ2U9c2VsZjo6ZnJvbUJsYW5rKCRuZXdXaWR0aCwkbmV3SGVpZ2h0LHNlbGY6OlJHQigwLDAsMCwxMjcpKS0+Z2V0SW1hZ2VSZXNvdXJjZSgpO2ltYWdlY29weXJlc2FtcGxlZCgkbmV3SW1hZ2UsJHRoaXMtPmdldEltYWdlUmVzb3VyY2UoKSwwLDAsMCwwLCRuZXdXaWR0aCwkbmV3SGVpZ2h0LCR0aGlzLT5nZXRXaWR0aCgpLCR0aGlzLT5nZXRIZWlnaHQoKSk7JHRoaXMtPmltYWdlPSRuZXdJbWFnZTt9aWYoJHdpZHRoPDB8fCRoZWlnaHQ8MCl7JG5ld0ltYWdlPXNlbGY6OmZyb21CbGFuaygkbmV3V2lkdGgsJG5ld0hlaWdodCxzZWxmOjpSR0IoMCwwLDAsMTI3KSktPmdldEltYWdlUmVzb3VyY2UoKTtpbWFnZWNvcHlyZXNhbXBsZWQoJG5ld0ltYWdlLCR0aGlzLT5nZXRJbWFnZVJlc291cmNlKCksMCwwLCR3aWR0aDwwPyRuZXdXaWR0aC0xOjAsJGhlaWdodDwwPyRuZXdIZWlnaHQtMTowLCRuZXdXaWR0aCwkbmV3SGVpZ2h0LCR3aWR0aDwwPy0kbmV3V2lkdGg6JG5ld1dpZHRoLCRoZWlnaHQ8MD8tJG5ld0hlaWdodDokbmV3SGVpZ2h0KTskdGhpcy0+aW1hZ2U9JG5ld0ltYWdlO31yZXR1cm4kdGhpczt9c3RhdGljCmZ1bmN0aW9uCmNhbGN1bGF0ZVNpemUoJHNyY1dpZHRoLCRzcmNIZWlnaHQsJG5ld1dpZHRoLCRuZXdIZWlnaHQsJGZsYWdzPXNlbGY6OkZJVCl7aWYoc3Vic3RyKCRuZXdXaWR0aCwtMSk9PT0nJScpeyRuZXdXaWR0aD1yb3VuZCgkc3JjV2lkdGgvMTAwKmFicygkbmV3V2lkdGgpKTskZmxhZ3N8PXNlbGY6OkVOTEFSR0U7JHBlcmNlbnRzPVRSVUU7fWVsc2V7JG5ld1dpZHRoPShpbnQpYWJzKCRuZXdXaWR0aCk7fWlmKHN1YnN0cigkbmV3SGVpZ2h0LC0xKT09PSclJyl7JG5ld0hlaWdodD1yb3VuZCgkc3JjSGVpZ2h0LzEwMCphYnMoJG5ld0hlaWdodCkpOyRmbGFnc3w9ZW1wdHkoJHBlcmNlbnRzKT9zZWxmOjpFTkxBUkdFOnNlbGY6OlNUUkVUQ0g7fWVsc2V7JG5ld0hlaWdodD0oaW50KWFicygkbmV3SGVpZ2h0KTt9aWYoJGZsYWdzJnNlbGY6OlNUUkVUQ0gpe2lmKGVtcHR5KCRuZXdXaWR0aCl8fGVtcHR5KCRuZXdIZWlnaHQpKXt0aHJvdwpuZXcKSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdGb3Igc3RyZXRjaGluZyBtdXN0IGJlIGJvdGggd2lkdGggYW5kIGhlaWdodCBzcGVjaWZpZWQuJyk7fWlmKCgkZmxhZ3Mmc2VsZjo6RU5MQVJHRSk9PT0wKXskbmV3V2lkdGg9cm91bmQoJHNyY1dpZHRoKm1pbigxLCRuZXdXaWR0aC8kc3JjV2lkdGgpKTskbmV3SGVpZ2h0PXJvdW5kKCRzcmNIZWlnaHQqbWluKDEsJG5ld0hlaWdodC8kc3JjSGVpZ2h0KSk7fX1lbHNle2lmKGVtcHR5KCRuZXdXaWR0aCkmJmVtcHR5KCRuZXdIZWlnaHQpKXt0aHJvdwpuZXcKSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdBdCBsZWFzdCB3aWR0aCBvciBoZWlnaHQgbXVzdCBiZSBzcGVjaWZpZWQuJyk7fSRzY2FsZT1hcnJheSgpO2lmKCRuZXdXaWR0aD4wKXskc2NhbGVbXT0kbmV3V2lkdGgvJHNyY1dpZHRoO31pZigkbmV3SGVpZ2h0PjApeyRzY2FsZVtdPSRuZXdIZWlnaHQvJHNyY0hlaWdodDt9aWYoJGZsYWdzJnNlbGY6OkZJTEwpeyRzY2FsZT1hcnJheShtYXgoJHNjYWxlKSk7fWlmKCgkZmxhZ3Mmc2VsZjo6RU5MQVJHRSk9PT0wKXskc2NhbGVbXT0xO30kc2NhbGU9bWluKCRzY2FsZSk7JG5ld1dpZHRoPXJvdW5kKCRzcmNXaWR0aCokc2NhbGUpOyRuZXdIZWlnaHQ9cm91bmQoJHNyY0hlaWdodCokc2NhbGUpO31yZXR1cm4KYXJyYXkoKGludCkkbmV3V2lkdGgsKGludCkkbmV3SGVpZ2h0KTt9ZnVuY3Rpb24KY3JvcCgkbGVmdCwkdG9wLCR3aWR0aCwkaGVpZ2h0KXtpZihzdWJzdHIoJGxlZnQsLTEpPT09JyUnKXskbGVmdD1yb3VuZCgoJHRoaXMtPmdldFdpZHRoKCktJHdpZHRoKS8xMDAqJGxlZnQpO31pZihzdWJzdHIoJHRvcCwtMSk9PT0nJScpeyR0b3A9cm91bmQoKCR0aGlzLT5nZXRIZWlnaHQoKS0kaGVpZ2h0KS8xMDAqJHRvcCk7fSRsZWZ0PW1heCgwLChpbnQpJGxlZnQpOyR0b3A9bWF4KDAsKGludCkkdG9wKTskd2lkdGg9bWluKChpbnQpJHdpZHRoLCR0aGlzLT5nZXRXaWR0aCgpLSRsZWZ0KTskaGVpZ2h0PW1pbigoaW50KSRoZWlnaHQsJHRoaXMtPmdldEhlaWdodCgpLSR0b3ApOyRuZXdJbWFnZT1zZWxmOjpmcm9tQmxhbmsoJHdpZHRoLCRoZWlnaHQsc2VsZjo6UkdCKDAsMCwwLDEyNykpLT5nZXRJbWFnZVJlc291cmNlKCk7aW1hZ2Vjb3B5KCRuZXdJbWFnZSwkdGhpcy0+Z2V0SW1hZ2VSZXNvdXJjZSgpLDAsMCwkbGVmdCwkdG9wLCR3aWR0aCwkaGVpZ2h0KTskdGhpcy0+aW1hZ2U9JG5ld0ltYWdlO3JldHVybiR0aGlzO31mdW5jdGlvbgpzaGFycGVuKCl7aW1hZ2Vjb252b2x1dGlvbigkdGhpcy0+Z2V0SW1hZ2VSZXNvdXJjZSgpLGFycmF5KGFycmF5KC0xLC0xLC0xKSxhcnJheSgtMSwyNCwtMSksYXJyYXkoLTEsLTEsLTEpKSwxNiwwKTtyZXR1cm4kdGhpczt9ZnVuY3Rpb24KcGxhY2UoTkltYWdlJGltYWdlLCRsZWZ0PTAsJHRvcD0wLCRvcGFjaXR5PTEwMCl7JG9wYWNpdHk9bWF4KDAsbWluKDEwMCwoaW50KSRvcGFjaXR5KSk7aWYoc3Vic3RyKCRsZWZ0LC0xKT09PSclJyl7JGxlZnQ9cm91bmQoKCR0aGlzLT5nZXRXaWR0aCgpLSRpbWFnZS0+Z2V0V2lkdGgoKSkvMTAwKiRsZWZ0KTt9aWYoc3Vic3RyKCR0b3AsLTEpPT09JyUnKXskdG9wPXJvdW5kKCgkdGhpcy0+Z2V0SGVpZ2h0KCktJGltYWdlLT5nZXRIZWlnaHQoKSkvMTAwKiR0b3ApO31pZigkb3BhY2l0eT09PTEwMCl7aW1hZ2Vjb3B5KCR0aGlzLT5nZXRJbWFnZVJlc291cmNlKCksJGltYWdlLT5nZXRJbWFnZVJlc291cmNlKCksJGxlZnQsJHRvcCwwLDAsJGltYWdlLT5nZXRXaWR0aCgpLCRpbWFnZS0+Z2V0SGVpZ2h0KCkpO31lbHNlaWYoJG9wYWNpdHk8PjApe2ltYWdlY29weW1lcmdlKCR0aGlzLT5nZXRJbWFnZVJlc291cmNlKCksJGltYWdlLT5nZXRJbWFnZVJlc291cmNlKCksJGxlZnQsJHRvcCwwLDAsJGltYWdlLT5nZXRXaWR0aCgpLCRpbWFnZS0+Z2V0SGVpZ2h0KCksJG9wYWNpdHkpO31yZXR1cm4kdGhpczt9ZnVuY3Rpb24Kc2F2ZSgkZmlsZT1OVUxMLCRxdWFsaXR5PU5VTEwsJHR5cGU9TlVMTCl7aWYoJHR5cGU9PT1OVUxMKXtzd2l0Y2goc3RydG9sb3dlcihwYXRoaW5mbygkZmlsZSxQQVRISU5GT19FWFRFTlNJT04pKSl7Y2FzZSdqcGcnOmNhc2UnanBlZyc6JHR5cGU9c2VsZjo6SlBFRzticmVhaztjYXNlJ3BuZyc6JHR5cGU9c2VsZjo6UE5HO2JyZWFrO2Nhc2UnZ2lmJzokdHlwZT1zZWxmOjpHSUY7fX1zd2l0Y2goJHR5cGUpe2Nhc2UKc2VsZjo6SlBFRzokcXVhbGl0eT0kcXVhbGl0eT09PU5VTEw/ODU6bWF4KDAsbWluKDEwMCwoaW50KSRxdWFsaXR5KSk7cmV0dXJuCmltYWdlanBlZygkdGhpcy0+Z2V0SW1hZ2VSZXNvdXJjZSgpLCRmaWxlLCRxdWFsaXR5KTtjYXNlCnNlbGY6OlBORzokcXVhbGl0eT0kcXVhbGl0eT09PU5VTEw/OTptYXgoMCxtaW4oOSwoaW50KSRxdWFsaXR5KSk7cmV0dXJuCmltYWdlcG5nKCR0aGlzLT5nZXRJbWFnZVJlc291cmNlKCksJGZpbGUsJHF1YWxpdHkpO2Nhc2UKc2VsZjo6R0lGOnJldHVybiRmaWxlPT09TlVMTD9pbWFnZWdpZigkdGhpcy0+Z2V0SW1hZ2VSZXNvdXJjZSgpKTppbWFnZWdpZigkdGhpcy0+Z2V0SW1hZ2VSZXNvdXJjZSgpLCRmaWxlKTtkZWZhdWx0OnRocm93Cm5ldwpFeGNlcHRpb24oIlVuc3VwcG9ydGVkIGltYWdlIHR5cGUuIik7fX1mdW5jdGlvbgp0b1N0cmluZygkdHlwZT1zZWxmOjpKUEVHLCRxdWFsaXR5PU5VTEwpe29iX3N0YXJ0KCk7JHRoaXMtPnNhdmUoTlVMTCwkcXVhbGl0eSwkdHlwZSk7cmV0dXJuCm9iX2dldF9jbGVhbigpO31mdW5jdGlvbgpfX3RvU3RyaW5nKCl7dHJ5e3JldHVybiR0aGlzLT50b1N0cmluZygpO31jYXRjaChFeGNlcHRpb24kZSl7TkRlYnVnOjp0b1N0cmluZ0V4Y2VwdGlvbigkZSk7fX1mdW5jdGlvbgpzZW5kKCR0eXBlPXNlbGY6OkpQRUcsJHF1YWxpdHk9TlVMTCl7aWYoJHR5cGUhPT1zZWxmOjpHSUYmJiR0eXBlIT09c2VsZjo6UE5HJiYkdHlwZSE9PXNlbGY6OkpQRUcpe3Rocm93Cm5ldwpFeGNlcHRpb24oIlVuc3VwcG9ydGVkIGltYWdlIHR5cGUuIik7fWhlYWRlcignQ29udGVudC1UeXBlOiAnLmltYWdlX3R5cGVfdG9fbWltZV90eXBlKCR0eXBlKSk7cmV0dXJuJHRoaXMtPnNhdmUoTlVMTCwkcXVhbGl0eSwkdHlwZSk7fWZ1bmN0aW9uCl9fY2FsbCgkbmFtZSwkYXJncyl7JGZ1bmN0aW9uPSdpbWFnZScuJG5hbWU7aWYoZnVuY3Rpb25fZXhpc3RzKCRmdW5jdGlvbikpe2ZvcmVhY2goJGFyZ3MKYXMka2V5PT4kdmFsdWUpe2lmKCR2YWx1ZQppbnN0YW5jZW9mCnNlbGYpeyRhcmdzWyRrZXldPSR2YWx1ZS0+Z2V0SW1hZ2VSZXNvdXJjZSgpO31lbHNlaWYoaXNfYXJyYXkoJHZhbHVlKSYmaXNzZXQoJHZhbHVlWydyZWQnXSkpeyRhcmdzWyRrZXldPWltYWdlY29sb3JhbGxvY2F0ZWFscGhhKCR0aGlzLT5nZXRJbWFnZVJlc291cmNlKCksJHZhbHVlWydyZWQnXSwkdmFsdWVbJ2dyZWVuJ10sJHZhbHVlWydibHVlJ10sJHZhbHVlWydhbHBoYSddKTt9fWFycmF5X3Vuc2hpZnQoJGFyZ3MsJHRoaXMtPmdldEltYWdlUmVzb3VyY2UoKSk7JHJlcz1jYWxsX3VzZXJfZnVuY19hcnJheSgkZnVuY3Rpb24sJGFyZ3MpO3JldHVybgppc19yZXNvdXJjZSgkcmVzKT9uZXcKc2VsZigkcmVzKTokcmVzO31yZXR1cm4KcGFyZW50OjpfX2NhbGwoJG5hbWUsJGFyZ3MpO319Y2xhc3MKTkltYWdlTWFnaWNrCmV4dGVuZHMKTkltYWdle3B1YmxpYwpzdGF0aWMkcGF0aD0nJztwdWJsaWMKc3RhdGljJHRlbXBEaXI7cHJpdmF0ZSRmaWxlO3ByaXZhdGUkaXNUZW1wb3Jhcnk9RkFMU0U7cHJpdmF0ZSR3aWR0aDtwcml2YXRlJGhlaWdodDtmdW5jdGlvbgpfX2NvbnN0cnVjdCgkZmlsZSwmJGZvcm1hdD1OVUxMKXtpZighaXNfZmlsZSgkZmlsZSkpe3Rocm93Cm5ldwpJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIkZpbGUgJyRmaWxlJyBub3QgZm91bmQuIik7fSRmb3JtYXQ9JHRoaXMtPnNldEZpbGUocmVhbHBhdGgoJGZpbGUpKTtpZigkZm9ybWF0PT09J0pQRUcnKSRmb3JtYXQ9c2VsZjo6SlBFRztlbHNlaWYoJGZvcm1hdD09PSdQTkcnKSRmb3JtYXQ9c2VsZjo6UE5HO2Vsc2VpZigkZm9ybWF0PT09J0dJRicpJGZvcm1hdD1zZWxmOjpHSUY7fWZ1bmN0aW9uCmdldFdpZHRoKCl7cmV0dXJuJHRoaXMtPmZpbGU9PT1OVUxMP3BhcmVudDo6Z2V0V2lkdGgoKTokdGhpcy0+d2lkdGg7fWZ1bmN0aW9uCmdldEhlaWdodCgpe3JldHVybiR0aGlzLT5maWxlPT09TlVMTD9wYXJlbnQ6OmdldEhlaWdodCgpOiR0aGlzLT5oZWlnaHQ7fWZ1bmN0aW9uCmdldEltYWdlUmVzb3VyY2UoKXtpZigkdGhpcy0+ZmlsZSE9PU5VTEwpe2lmKCEkdGhpcy0+aXNUZW1wb3JhcnkpeyR0aGlzLT5leGVjdXRlKCJjb252ZXJ0IC1zdHJpcCAlaW5wdXQgJW91dHB1dCIsc2VsZjo6UE5HKTt9JHRoaXMtPnNldEltYWdlUmVzb3VyY2UoaW1hZ2VjcmVhdGVmcm9tcG5nKCR0aGlzLT5maWxlKSk7aWYoJHRoaXMtPmlzVGVtcG9yYXJ5KXt1bmxpbmsoJHRoaXMtPmZpbGUpO30kdGhpcy0+ZmlsZT1OVUxMO31yZXR1cm4KcGFyZW50OjpnZXRJbWFnZVJlc291cmNlKCk7fWZ1bmN0aW9uCnJlc2l6ZSgkd2lkdGgsJGhlaWdodCwkZmxhZ3M9c2VsZjo6RklUKXtpZigkdGhpcy0+ZmlsZT09PU5VTEwpe3JldHVybgpwYXJlbnQ6OnJlc2l6ZSgkd2lkdGgsJGhlaWdodCwkZmxhZ3MpO30kbWlycm9yPScnO2lmKCR3aWR0aDwwKSRtaXJyb3IuPScgLWZsb3AnO2lmKCRoZWlnaHQ8MCkkbWlycm9yLj0nIC1mbGlwJztsaXN0KCRuZXdXaWR0aCwkbmV3SGVpZ2h0KT1zZWxmOjpjYWxjdWxhdGVTaXplKCR0aGlzLT5nZXRXaWR0aCgpLCR0aGlzLT5nZXRIZWlnaHQoKSwkd2lkdGgsJGhlaWdodCwkZmxhZ3MpOyR0aGlzLT5leGVjdXRlKCJjb252ZXJ0IC1yZXNpemUgeyRuZXdXaWR0aH14eyRuZXdIZWlnaHR9ISB7JG1pcnJvcn0gLXN0cmlwICVpbnB1dCAlb3V0cHV0IixzZWxmOjpQTkcpO3JldHVybiR0aGlzO31mdW5jdGlvbgpjcm9wKCRsZWZ0LCR0b3AsJHdpZHRoLCRoZWlnaHQpe2lmKCR0aGlzLT5maWxlPT09TlVMTCl7cmV0dXJuCnBhcmVudDo6Y3JvcCgkbGVmdCwkdG9wLCR3aWR0aCwkaGVpZ2h0KTt9JGxlZnQ9bWF4KDAsKGludCkkbGVmdCk7JHRvcD1tYXgoMCwoaW50KSR0b3ApOyR3aWR0aD1taW4oKGludCkkd2lkdGgsJHRoaXMtPmdldFdpZHRoKCktJGxlZnQpOyRoZWlnaHQ9bWluKChpbnQpJGhlaWdodCwkdGhpcy0+Z2V0SGVpZ2h0KCktJHRvcCk7JHRoaXMtPmV4ZWN1dGUoImNvbnZlcnQgLWNyb3AgeyR3aWR0aH14eyRoZWlnaHR9K3skbGVmdH0reyR0b3B9IC1zdHJpcCAlaW5wdXQgJW91dHB1dCIsc2VsZjo6UE5HKTtyZXR1cm4kdGhpczt9ZnVuY3Rpb24Kc2F2ZSgkZmlsZT1OVUxMLCRxdWFsaXR5PU5VTEwsJHR5cGU9TlVMTCl7aWYoJHRoaXMtPmZpbGU9PT1OVUxMKXtyZXR1cm4KcGFyZW50OjpzYXZlKCRmaWxlLCRxdWFsaXR5LCR0eXBlKTt9JHF1YWxpdHk9JHF1YWxpdHk9PT1OVUxMPycnOictcXVhbGl0eSAnLm1heCgwLG1pbigxMDAsKGludCkkcXVhbGl0eSkpO2lmKCRmaWxlPT09TlVMTCl7JHRoaXMtPmV4ZWN1dGUoImNvbnZlcnQgJHF1YWxpdHkgLXN0cmlwICVpbnB1dCAlb3V0cHV0IiwkdHlwZT09PU5VTEw/c2VsZjo6UE5HOiR0eXBlKTtyZWFkZmlsZSgkdGhpcy0+ZmlsZSk7fWVsc2V7JHRoaXMtPmV4ZWN1dGUoImNvbnZlcnQgJHF1YWxpdHkgLXN0cmlwICVpbnB1dCAlb3V0cHV0Iiwoc3RyaW5nKSRmaWxlKTt9cmV0dXJuClRSVUU7fXByaXZhdGUKZnVuY3Rpb24Kc2V0RmlsZSgkZmlsZSl7JHRoaXMtPmZpbGU9JGZpbGU7JHJlcz0kdGhpcy0+ZXhlY3V0ZSgnaWRlbnRpZnkgLWZvcm1hdCAiJXcsJWgsJW0iICcuZXNjYXBlc2hlbGxhcmcoJHRoaXMtPmZpbGUpKTtpZighJHJlcyl7dGhyb3cKbmV3CkV4Y2VwdGlvbigiVW5rbm93biBpbWFnZSB0eXBlIGluIGZpbGUgJyRmaWxlJyBvciBJbWFnZU1hZ2ljayBub3QgYXZhaWxhYmxlLiIpO31saXN0KCR0aGlzLT53aWR0aCwkdGhpcy0+aGVpZ2h0LCRmb3JtYXQpPWV4cGxvZGUoJywnLCRyZXMsMyk7cmV0dXJuJGZvcm1hdDt9cHJpdmF0ZQpmdW5jdGlvbgpleGVjdXRlKCRjb21tYW5kLCRvdXRwdXQ9TlVMTCl7JGNvbW1hbmQ9c3RyX3JlcGxhY2UoJyVpbnB1dCcsZXNjYXBlc2hlbGxhcmcoJHRoaXMtPmZpbGUpLCRjb21tYW5kKTtpZigkb3V0cHV0KXskbmV3RmlsZT1pc19zdHJpbmcoJG91dHB1dCk/JG91dHB1dDooc2VsZjo6JHRlbXBEaXI/c2VsZjo6JHRlbXBEaXI6ZGlybmFtZSgkdGhpcy0+ZmlsZSkpLicvJy51bmlxaWQoJ190ZW1waW1hZ2UnLFRSVUUpLmltYWdlX3R5cGVfdG9fZXh0ZW5zaW9uKCRvdXRwdXQpOyRjb21tYW5kPXN0cl9yZXBsYWNlKCclb3V0cHV0Jyxlc2NhcGVzaGVsbGFyZygkbmV3RmlsZSksJGNvbW1hbmQpO30kbGluZXM9YXJyYXkoKTtleGVjKHNlbGY6OiRwYXRoLiRjb21tYW5kLCRsaW5lcywkc3RhdHVzKTtpZigkb3V0cHV0KXtpZigkc3RhdHVzIT0wKXt0aHJvdwpuZXcKRXhjZXB0aW9uKCJVbmtub3duIGVycm9yIHdoaWxlIGNhbGxpbmcgSW1hZ2VNYWdpY2suIik7fWlmKCR0aGlzLT5pc1RlbXBvcmFyeSl7dW5saW5rKCR0aGlzLT5maWxlKTt9JHRoaXMtPnNldEZpbGUoJG5ld0ZpbGUpOyR0aGlzLT5pc1RlbXBvcmFyeT0haXNfc3RyaW5nKCRvdXRwdXQpO31yZXR1cm4kbGluZXM/JGxpbmVzWzBdOkZBTFNFO31mdW5jdGlvbgpfX2Rlc3RydWN0KCl7aWYoJHRoaXMtPmZpbGUhPT1OVUxMJiYkdGhpcy0+aXNUZW1wb3Jhcnkpe3VubGluaygkdGhpcy0+ZmlsZSk7fX19Y2xhc3MKTkdlbmVyaWNSZWN1cnNpdmVJdGVyYXRvcgpleHRlbmRzCkl0ZXJhdG9ySXRlcmF0b3IKaW1wbGVtZW50cwpSZWN1cnNpdmVJdGVyYXRvcixDb3VudGFibGV7ZnVuY3Rpb24KaGFzQ2hpbGRyZW4oKXskb2JqPSR0aGlzLT5jdXJyZW50KCk7cmV0dXJuKCRvYmoKaW5zdGFuY2VvZgpJdGVyYXRvckFnZ3JlZ2F0ZSYmJG9iai0+Z2V0SXRlcmF0b3IoKWluc3RhbmNlb2YKUmVjdXJzaXZlSXRlcmF0b3IpfHwkb2JqCmluc3RhbmNlb2YKUmVjdXJzaXZlSXRlcmF0b3I7fWZ1bmN0aW9uCmdldENoaWxkcmVuKCl7JG9iaj0kdGhpcy0+Y3VycmVudCgpO3JldHVybiRvYmoKaW5zdGFuY2VvZgpJdGVyYXRvckFnZ3JlZ2F0ZT8kb2JqLT5nZXRJdGVyYXRvcigpOiRvYmo7fWZ1bmN0aW9uCmNvdW50KCl7cmV0dXJuCml0ZXJhdG9yX2NvdW50KCR0aGlzKTt9fWNsYXNzCk5JbnN0YW5jZUZpbHRlckl0ZXJhdG9yCmV4dGVuZHMKRmlsdGVySXRlcmF0b3IKaW1wbGVtZW50cwpDb3VudGFibGV7cHJpdmF0ZSR0eXBlO2Z1bmN0aW9uCl9fY29uc3RydWN0KEl0ZXJhdG9yJGl0ZXJhdG9yLCR0eXBlKXskdGhpcy0+dHlwZT0kdHlwZTtwYXJlbnQ6Ol9fY29uc3RydWN0KCRpdGVyYXRvcik7fWZ1bmN0aW9uCmFjY2VwdCgpe3JldHVybiR0aGlzLT5jdXJyZW50KClpbnN0YW5jZW9mJHRoaXMtPnR5cGU7fWZ1bmN0aW9uCmNvdW50KCl7cmV0dXJuCml0ZXJhdG9yX2NvdW50KCR0aGlzKTt9fWNsYXNzCk5TbWFydENhY2hpbmdJdGVyYXRvcgpleHRlbmRzCkNhY2hpbmdJdGVyYXRvcgppbXBsZW1lbnRzCkNvdW50YWJsZXtwcml2YXRlJGNvdW50ZXI9MDtmdW5jdGlvbgpfX2NvbnN0cnVjdCgkaXRlcmF0b3Ipe2lmKGlzX2FycmF5KCRpdGVyYXRvcil8fCRpdGVyYXRvcgppbnN0YW5jZW9mCnN0ZENsYXNzKXskaXRlcmF0b3I9bmV3CkFycmF5SXRlcmF0b3IoJGl0ZXJhdG9yKTt9ZWxzZWlmKCRpdGVyYXRvcgppbnN0YW5jZW9mClRyYXZlcnNhYmxlKXtpZigkaXRlcmF0b3IKaW5zdGFuY2VvZgpJdGVyYXRvckFnZ3JlZ2F0ZSl7JGl0ZXJhdG9yPSRpdGVyYXRvci0+Z2V0SXRlcmF0b3IoKTt9ZWxzZWlmKCEoJGl0ZXJhdG9yCmluc3RhbmNlb2YKSXRlcmF0b3IpKXskaXRlcmF0b3I9bmV3Ckl0ZXJhdG9ySXRlcmF0b3IoJGl0ZXJhdG9yKTt9fWVsc2V7dGhyb3cKbmV3CkludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBhcmd1bWVudCBwYXNzZWQgdG8gZm9yZWFjaCByZXNwLiAiLl9fQ0xBU1NfXy4iOyBhcnJheSBvciBUcmF2ZXJzYWJsZSBleHBlY3RlZCwgIi4oaXNfb2JqZWN0KCRpdGVyYXRvcik/Z2V0X2NsYXNzKCRpdGVyYXRvcik6Z2V0dHlwZSgkaXRlcmF0b3IpKS4iIGdpdmVuLiIpO31wYXJlbnQ6Ol9fY29uc3RydWN0KCRpdGVyYXRvciwwKTt9ZnVuY3Rpb24KaXNGaXJzdCgkd2lkdGg9TlVMTCl7cmV0dXJuJHdpZHRoPT09TlVMTD8kdGhpcy0+Y291bnRlcj09PTE6KCR0aGlzLT5jb3VudGVyCiUkd2lkdGgpPT09MTt9ZnVuY3Rpb24KaXNMYXN0KCR3aWR0aD1OVUxMKXtyZXR1cm4hJHRoaXMtPmhhc05leHQoKXx8KCR3aWR0aCE9PU5VTEwmJigkdGhpcy0+Y291bnRlcgolJHdpZHRoKT09PTApO31mdW5jdGlvbgppc0VtcHR5KCl7cmV0dXJuJHRoaXMtPmNvdW50ZXI9PT0wO31mdW5jdGlvbgppc09kZCgpe3JldHVybiR0aGlzLT5jb3VudGVyCiUKMj09PTE7fWZ1bmN0aW9uCmlzRXZlbigpe3JldHVybiR0aGlzLT5jb3VudGVyCiUKMj09PTA7fWZ1bmN0aW9uCmdldENvdW50ZXIoKXtyZXR1cm4kdGhpcy0+Y291bnRlcjt9ZnVuY3Rpb24KY291bnQoKXskaW5uZXI9JHRoaXMtPmdldElubmVySXRlcmF0b3IoKTtpZigkaW5uZXIKaW5zdGFuY2VvZgpDb3VudGFibGUpe3JldHVybiRpbm5lci0+Y291bnQoKTt9ZWxzZXt0aHJvdwpuZXcKTm90U3VwcG9ydGVkRXhjZXB0aW9uKCdJdGVyYXRvciBpcyBub3QgY291bnRhYmxlLicpO319ZnVuY3Rpb24KbmV4dCgpe3BhcmVudDo6bmV4dCgpO2lmKHBhcmVudDo6dmFsaWQoKSl7JHRoaXMtPmNvdW50ZXIrKzt9fWZ1bmN0aW9uCnJld2luZCgpe3BhcmVudDo6cmV3aW5kKCk7JHRoaXMtPmNvdW50ZXI9cGFyZW50Ojp2YWxpZCgpPzE6MDt9ZnVuY3Rpb24KZ2V0TmV4dEtleSgpe3JldHVybiR0aGlzLT5nZXRJbm5lckl0ZXJhdG9yKCktPmtleSgpO31mdW5jdGlvbgpnZXROZXh0VmFsdWUoKXtyZXR1cm4kdGhpcy0+Z2V0SW5uZXJJdGVyYXRvcigpLT5jdXJyZW50KCk7fWZ1bmN0aW9uCl9fY2FsbCgkbmFtZSwkYXJncyl7cmV0dXJuCk5PYmplY3RNaXhpbjo6Y2FsbCgkdGhpcywkbmFtZSwkYXJncyk7fWZ1bmN0aW9uJl9fZ2V0KCRuYW1lKXtyZXR1cm4KTk9iamVjdE1peGluOjpnZXQoJHRoaXMsJG5hbWUpO31mdW5jdGlvbgpfX3NldCgkbmFtZSwkdmFsdWUpe3JldHVybgpOT2JqZWN0TWl4aW46OnNldCgkdGhpcywkbmFtZSwkdmFsdWUpO31mdW5jdGlvbgpfX2lzc2V0KCRuYW1lKXtyZXR1cm4KTk9iamVjdE1peGluOjpoYXMoJHRoaXMsJG5hbWUpO31mdW5jdGlvbgpfX3Vuc2V0KCRuYW1lKXskY2xhc3M9Z2V0X2NsYXNzKCR0aGlzKTt0aHJvdwpuZXcKTWVtYmVyQWNjZXNzRXhjZXB0aW9uKCJDYW5ub3QgdW5zZXQgdGhlIHByb3BlcnR5ICRjbGFzczo6XCQkbmFtZS4iKTt9fWNsYXNzCk5QYWdpbmF0b3IKZXh0ZW5kcwpOT2JqZWN0e3ByaXZhdGUkYmFzZT0xO3ByaXZhdGUkaXRlbXNQZXJQYWdlPTE7cHJpdmF0ZSRwYWdlO3ByaXZhdGUkaXRlbUNvdW50PTA7ZnVuY3Rpb24Kc2V0UGFnZSgkcGFnZSl7JHRoaXMtPnBhZ2U9KGludCkkcGFnZTtyZXR1cm4kdGhpczt9ZnVuY3Rpb24KZ2V0UGFnZSgpe3JldHVybiR0aGlzLT5iYXNlKyR0aGlzLT5nZXRQYWdlSW5kZXgoKTt9ZnVuY3Rpb24KZ2V0Rmlyc3RQYWdlKCl7cmV0dXJuJHRoaXMtPmJhc2U7fWZ1bmN0aW9uCmdldExhc3RQYWdlKCl7cmV0dXJuJHRoaXMtPmJhc2UrbWF4KDAsJHRoaXMtPmdldFBhZ2VDb3VudCgpLTEpO31mdW5jdGlvbgpzZXRCYXNlKCRiYXNlKXskdGhpcy0+YmFzZT0oaW50KSRiYXNlO3JldHVybiR0aGlzO31mdW5jdGlvbgpnZXRCYXNlKCl7cmV0dXJuJHRoaXMtPmJhc2U7fXByb3RlY3RlZApmdW5jdGlvbgpnZXRQYWdlSW5kZXgoKXtyZXR1cm4KbWluKG1heCgwLCR0aGlzLT5wYWdlLSR0aGlzLT5iYXNlKSxtYXgoMCwkdGhpcy0+Z2V0UGFnZUNvdW50KCktMSkpO31mdW5jdGlvbgppc0ZpcnN0KCl7cmV0dXJuJHRoaXMtPmdldFBhZ2VJbmRleCgpPT09MDt9ZnVuY3Rpb24KaXNMYXN0KCl7cmV0dXJuJHRoaXMtPmdldFBhZ2VJbmRleCgpPj0kdGhpcy0+Z2V0UGFnZUNvdW50KCktMTt9ZnVuY3Rpb24KZ2V0UGFnZUNvdW50KCl7cmV0dXJuKGludCljZWlsKCR0aGlzLT5pdGVtQ291bnQvJHRoaXMtPml0ZW1zUGVyUGFnZSk7fWZ1bmN0aW9uCnNldEl0ZW1zUGVyUGFnZSgkaXRlbXNQZXJQYWdlKXskdGhpcy0+aXRlbXNQZXJQYWdlPW1heCgxLChpbnQpJGl0ZW1zUGVyUGFnZSk7cmV0dXJuJHRoaXM7fWZ1bmN0aW9uCmdldEl0ZW1zUGVyUGFnZSgpe3JldHVybiR0aGlzLT5pdGVtc1BlclBhZ2U7fWZ1bmN0aW9uCnNldEl0ZW1Db3VudCgkaXRlbUNvdW50KXskdGhpcy0+aXRlbUNvdW50PSRpdGVtQ291bnQ9PT1GQUxTRT9QSFBfSU5UX01BWDptYXgoMCwoaW50KSRpdGVtQ291bnQpO3JldHVybiR0aGlzO31mdW5jdGlvbgpnZXRJdGVtQ291bnQoKXtyZXR1cm4kdGhpcy0+aXRlbUNvdW50O31mdW5jdGlvbgpnZXRPZmZzZXQoKXtyZXR1cm4kdGhpcy0+Z2V0UGFnZUluZGV4KCkqJHRoaXMtPml0ZW1zUGVyUGFnZTt9ZnVuY3Rpb24KZ2V0Q291bnRkb3duT2Zmc2V0KCl7cmV0dXJuCm1heCgwLCR0aGlzLT5pdGVtQ291bnQtKCR0aGlzLT5nZXRQYWdlSW5kZXgoKSsxKSokdGhpcy0+aXRlbXNQZXJQYWdlKTt9ZnVuY3Rpb24KZ2V0TGVuZ3RoKCl7cmV0dXJuCm1pbigkdGhpcy0+aXRlbXNQZXJQYWdlLCR0aGlzLT5pdGVtQ291bnQtJHRoaXMtPmdldFBhZ2VJbmRleCgpKiR0aGlzLT5pdGVtc1BlclBhZ2UpO319ZmluYWwKY2xhc3MKTlNhZmVTdHJlYW17Y29uc3QKUFJPVE9DT0w9J3NhZmUnO3ByaXZhdGUkaGFuZGxlO3ByaXZhdGUkZmlsZVBhdGg7cHJpdmF0ZSR0ZW1wRmlsZTtwcml2YXRlJHN0YXJ0UG9zPTA7cHJpdmF0ZSR3cml0ZUVycm9yPUZBTFNFO3N0YXRpYwpmdW5jdGlvbgpyZWdpc3Rlcigpe3JldHVybgpzdHJlYW1fd3JhcHBlcl9yZWdpc3RlcihzZWxmOjpQUk9UT0NPTCxfX0NMQVNTX18pO31mdW5jdGlvbgpzdHJlYW1fb3BlbigkcGF0aCwkbW9kZSwkb3B0aW9ucywmJG9wZW5lZF9wYXRoKXskcGF0aD1zdWJzdHIoJHBhdGgsc3RybGVuKHNlbGY6OlBST1RPQ09MKSszKTskZmxhZz10cmltKCRtb2RlLCdyd2F4KycpOyRtb2RlPXRyaW0oJG1vZGUsJ3RiJyk7JHVzZV9wYXRoPShib29sKShTVFJFQU1fVVNFX1BBVEgmJG9wdGlvbnMpOyRhcHBlbmQ9RkFMU0U7c3dpdGNoKCRtb2RlKXtjYXNlJ3InOmNhc2UncisnOiRoYW5kbGU9QGZvcGVuKCRwYXRoLCRtb2RlLiRmbGFnLCR1c2VfcGF0aCk7aWYoISRoYW5kbGUpcmV0dXJuCkZBTFNFO2lmKGZsb2NrKCRoYW5kbGUsJG1vZGU9PSdyJz9MT0NLX1NIOkxPQ0tfRVgpKXskdGhpcy0+aGFuZGxlPSRoYW5kbGU7cmV0dXJuClRSVUU7fWZjbG9zZSgkaGFuZGxlKTtyZXR1cm4KRkFMU0U7Y2FzZSdhJzpjYXNlJ2ErJzokYXBwZW5kPVRSVUU7Y2FzZSd3JzpjYXNlJ3crJzokaGFuZGxlPUBmb3BlbigkcGF0aCwncisnLiRmbGFnLCR1c2VfcGF0aCk7aWYoJGhhbmRsZSl7aWYoZmxvY2soJGhhbmRsZSxMT0NLX0VYKSl7aWYoJGFwcGVuZCl7ZnNlZWsoJGhhbmRsZSwwLFNFRUtfRU5EKTskdGhpcy0+c3RhcnRQb3M9ZnRlbGwoJGhhbmRsZSk7fWVsc2V7ZnRydW5jYXRlKCRoYW5kbGUsMCk7fSR0aGlzLT5oYW5kbGU9JGhhbmRsZTtyZXR1cm4KVFJVRTt9ZmNsb3NlKCRoYW5kbGUpO30kbW9kZXswfT0neCc7Y2FzZSd4JzpjYXNlJ3grJzppZihmaWxlX2V4aXN0cygkcGF0aCkpcmV0dXJuCkZBTFNFOyR0bXA9J35+Jy50aW1lKCkuJy50bXAnOyRoYW5kbGU9QGZvcGVuKCRwYXRoLiR0bXAsJG1vZGUuJGZsYWcsJHVzZV9wYXRoKTtpZigkaGFuZGxlKXtpZihmbG9jaygkaGFuZGxlLExPQ0tfRVgpKXskdGhpcy0+aGFuZGxlPSRoYW5kbGU7aWYoIUByZW5hbWUoJHBhdGguJHRtcCwkcGF0aCkpeyR0aGlzLT50ZW1wRmlsZT1yZWFscGF0aCgkcGF0aC4kdG1wKTskdGhpcy0+ZmlsZVBhdGg9c3Vic3RyKCR0aGlzLT50ZW1wRmlsZSwwLC1zdHJsZW4oJHRtcCkpO31yZXR1cm4KVFJVRTt9ZmNsb3NlKCRoYW5kbGUpO3VubGluaygkcGF0aC4kdG1wKTt9cmV0dXJuCkZBTFNFO2RlZmF1bHQ6dHJpZ2dlcl9lcnJvcigiVW5zdXBwb3J0ZWQgbW9kZSAkbW9kZSIsRV9VU0VSX1dBUk5JTkcpO3JldHVybgpGQUxTRTt9fWZ1bmN0aW9uCnN0cmVhbV9jbG9zZSgpe2lmKCR0aGlzLT53cml0ZUVycm9yKXtmdHJ1bmNhdGUoJHRoaXMtPmhhbmRsZSwkdGhpcy0+c3RhcnRQb3MpO31mY2xvc2UoJHRoaXMtPmhhbmRsZSk7aWYoJHRoaXMtPnRlbXBGaWxlKXtpZighQHJlbmFtZSgkdGhpcy0+dGVtcEZpbGUsJHRoaXMtPmZpbGVQYXRoKSl7dW5saW5rKCR0aGlzLT50ZW1wRmlsZSk7fX19ZnVuY3Rpb24Kc3RyZWFtX3JlYWQoJGxlbmd0aCl7cmV0dXJuCmZyZWFkKCR0aGlzLT5oYW5kbGUsJGxlbmd0aCk7fWZ1bmN0aW9uCnN0cmVhbV93cml0ZSgkZGF0YSl7JGxlbj1zdHJsZW4oJGRhdGEpOyRyZXM9ZndyaXRlKCR0aGlzLT5oYW5kbGUsJGRhdGEsJGxlbik7aWYoJHJlcyE9PSRsZW4peyR0aGlzLT53cml0ZUVycm9yPVRSVUU7fXJldHVybiRyZXM7fWZ1bmN0aW9uCnN0cmVhbV90ZWxsKCl7cmV0dXJuCmZ0ZWxsKCR0aGlzLT5oYW5kbGUpO31mdW5jdGlvbgpzdHJlYW1fZW9mKCl7cmV0dXJuCmZlb2YoJHRoaXMtPmhhbmRsZSk7fWZ1bmN0aW9uCnN0cmVhbV9zZWVrKCRvZmZzZXQsJHdoZW5jZSl7cmV0dXJuCmZzZWVrKCR0aGlzLT5oYW5kbGUsJG9mZnNldCwkd2hlbmNlKT09PTA7fWZ1bmN0aW9uCnN0cmVhbV9zdGF0KCl7cmV0dXJuCmZzdGF0KCR0aGlzLT5oYW5kbGUpO31mdW5jdGlvbgp1cmxfc3RhdCgkcGF0aCwkZmxhZ3MpeyRwYXRoPXN1YnN0cigkcGF0aCxzdHJsZW4oc2VsZjo6UFJPVE9DT0wpKzMpO3JldHVybigkZmxhZ3MmU1RSRUFNX1VSTF9TVEFUX0xJTkspP0Bsc3RhdCgkcGF0aCk6QHN0YXQoJHBhdGgpO31mdW5jdGlvbgp1bmxpbmsoJHBhdGgpeyRwYXRoPXN1YnN0cigkcGF0aCxzdHJsZW4oc2VsZjo6UFJPVE9DT0wpKzMpO3JldHVybgp1bmxpbmsoJHBhdGgpO319ZmluYWwKY2xhc3MKTlN0cmluZ3tmaW5hbApmdW5jdGlvbgpfX2NvbnN0cnVjdCgpe3Rocm93Cm5ldwpMb2dpY0V4Y2VwdGlvbigiQ2Fubm90IGluc3RhbnRpYXRlIHN0YXRpYyBjbGFzcyAiLmdldF9jbGFzcygkdGhpcykpO31zdGF0aWMKZnVuY3Rpb24KY2hlY2tFbmNvZGluZygkcywkZW5jb2Rpbmc9J1VURi04Jyl7cmV0dXJuJHM9PT1zZWxmOjpmaXhFbmNvZGluZygkcywkZW5jb2RpbmcpO31zdGF0aWMKZnVuY3Rpb24KZml4RW5jb2RpbmcoJHMsJGVuY29kaW5nPSdVVEYtOCcpe3JldHVybkBpY29udignVVRGLTE2JywkZW5jb2RpbmcuJy8vSUdOT1JFJyxpY29udigkZW5jb2RpbmcsJ1VURi0xNi8vSUdOT1JFJywkcykpO31zdGF0aWMKZnVuY3Rpb24KY2hyKCRjb2RlLCRlbmNvZGluZz0nVVRGLTgnKXtyZXR1cm4KaWNvbnYoJ1VURi0zMkJFJywkZW5jb2RpbmcuJy8vSUdOT1JFJyxwYWNrKCdOJywkY29kZSkpO31zdGF0aWMKZnVuY3Rpb24Kc3RhcnRzV2l0aCgkaGF5c3RhY2ssJG5lZWRsZSl7cmV0dXJuCnN0cm5jbXAoJGhheXN0YWNrLCRuZWVkbGUsc3RybGVuKCRuZWVkbGUpKT09PTA7fXN0YXRpYwpmdW5jdGlvbgplbmRzV2l0aCgkaGF5c3RhY2ssJG5lZWRsZSl7cmV0dXJuCnN0cmxlbigkbmVlZGxlKT09PTB8fHN1YnN0cigkaGF5c3RhY2ssLXN0cmxlbigkbmVlZGxlKSk9PT0kbmVlZGxlO31zdGF0aWMKZnVuY3Rpb24Kbm9ybWFsaXplKCRzKXskcz1zdHJfcmVwbGFjZSgiXHJcbiIsIlxuIiwkcyk7JHM9c3RydHIoJHMsIlxyIiwiXG4iKTskcz1wcmVnX3JlcGxhY2UoJyNbXHgwMC1ceDA4XHgwQi1ceDFGXSsjJywnJywkcyk7JHM9cHJlZ19yZXBsYWNlKCIjW1x0IF0rJCNtIiwnJywkcyk7JHM9dHJpbSgkcywiXG4iKTtyZXR1cm4kczt9c3RhdGljCmZ1bmN0aW9uCndlYmFsaXplKCRzLCRjaGFybGlzdD1OVUxMLCRsb3dlcj1UUlVFKXskcz1zdHJ0cigkcywnYFwnIl5+JywnLS0tLS0nKTtpZihJQ09OVl9JTVBMPT09J2dsaWJjJyl7c2V0bG9jYWxlKExDX0NUWVBFLCdlbl9VUy5VVEYtOCcpO30kcz1AaWNvbnYoJ1VURi04JywnQVNDSUkvL1RSQU5TTElUJywkcyk7JHM9c3RyX3JlcGxhY2UoYXJyYXkoJ2AnLCInIiwnIicsJ14nLCd+JyksJycsJHMpO2lmKCRsb3dlcikkcz1zdHJ0b2xvd2VyKCRzKTskcz1wcmVnX3JlcGxhY2UoJyNbXmEtejAtOScucHJlZ19xdW90ZSgkY2hhcmxpc3QsJyMnKS4nXSsjaScsJy0nLCRzKTskcz10cmltKCRzLCctJyk7cmV0dXJuJHM7fXN0YXRpYwpmdW5jdGlvbgp0cnVuY2F0ZSgkcywkbWF4TGVuLCRhcHBlbmQ9Ilx4RTJceDgwXHhBNiIpe2lmKGljb252X3N0cmxlbigkcywnVVRGLTgnKT4kbWF4TGVuKXskbWF4TGVuPSRtYXhMZW4taWNvbnZfc3RybGVuKCRhcHBlbmQsJ1VURi04Jyk7aWYoJG1heExlbjwxKXtyZXR1cm4kYXBwZW5kO31lbHNlaWYocHJlZ19tYXRjaCgnI14uezEsJy4kbWF4TGVuLid9KD89W1xzXHgwMC1AXFstYHstfl0pI3VzJywkcywkbWF0Y2hlcykpe3JldHVybiRtYXRjaGVzWzBdLiRhcHBlbmQ7fWVsc2V7cmV0dXJuCmljb252X3N1YnN0cigkcywwLCRtYXhMZW4sJ1VURi04JykuJGFwcGVuZDt9fXJldHVybiRzO31zdGF0aWMKZnVuY3Rpb24KaW5kZW50KCRzLCRsZXZlbD0xLCRjaGFycz0iXHQiKXtyZXR1cm4kbGV2ZWw8MT8kczpwcmVnX3JlcGxhY2UoJyMoPzpefFtcclxuXSspKD89W15cclxuXSkjJywnJDAnLnN0cl9yZXBlYXQoJGNoYXJzLCRsZXZlbCksJHMpO31zdGF0aWMKZnVuY3Rpb24KbG93ZXIoJHMpe3JldHVybgptYl9zdHJ0b2xvd2VyKCRzLCdVVEYtOCcpO31zdGF0aWMKZnVuY3Rpb24KdXBwZXIoJHMpe3JldHVybgptYl9zdHJ0b3VwcGVyKCRzLCdVVEYtOCcpO31zdGF0aWMKZnVuY3Rpb24KY2FwaXRhbGl6ZSgkcyl7cmV0dXJuCm1iX2NvbnZlcnRfY2FzZSgkcyxNQl9DQVNFX1RJVExFLCdVVEYtOCcpO31zdGF0aWMKZnVuY3Rpb24KdHJpbSgkcywkY2hhcmxpc3Q9IiBcdFxuXHJcMFx4MEJceEMyXHhBMCIpeyRjaGFybGlzdD1wcmVnX3F1b3RlKCRjaGFybGlzdCwnIycpO3JldHVybgpwcmVnX3JlcGxhY2UoJyNeWycuJGNoYXJsaXN0LiddK3xbJy4kY2hhcmxpc3QuJ10rJCN1JywnJywkcyk7fXN0YXRpYwpmdW5jdGlvbgpwYWRMZWZ0KCRzLCRsZW5ndGgsJHBhZD0nICcpeyRsZW5ndGg9bWF4KDAsJGxlbmd0aC1pY29udl9zdHJsZW4oJHMsJ1VURi04JykpOyRwYWRMZW49aWNvbnZfc3RybGVuKCRwYWQsJ1VURi04Jyk7cmV0dXJuCnN0cl9yZXBlYXQoJHBhZCwkbGVuZ3RoLyRwYWRMZW4pLmljb252X3N1YnN0cigkcGFkLDAsJGxlbmd0aAolJHBhZExlbiwnVVRGLTgnKS4kczt9c3RhdGljCmZ1bmN0aW9uCnBhZFJpZ2h0KCRzLCRsZW5ndGgsJHBhZD0nICcpeyRsZW5ndGg9bWF4KDAsJGxlbmd0aC1pY29udl9zdHJsZW4oJHMsJ1VURi04JykpOyRwYWRMZW49aWNvbnZfc3RybGVuKCRwYWQsJ1VURi04Jyk7cmV0dXJuJHMuc3RyX3JlcGVhdCgkcGFkLCRsZW5ndGgvJHBhZExlbikuaWNvbnZfc3Vic3RyKCRwYWQsMCwkbGVuZ3RoCiUkcGFkTGVuLCdVVEYtOCcpO319ZmluYWwKY2xhc3MKTlRvb2xze2NvbnN0Ck1JTlVURT02MDtjb25zdApIT1VSPTM2MDA7Y29uc3QKREFZPTg2NDAwO2NvbnN0CldFRUs9NjA0ODAwO2NvbnN0Ck1PTlRIPTI2Mjk4MDA7Y29uc3QKWUVBUj0zMTU1NzYwMDtmaW5hbApmdW5jdGlvbgpfX2NvbnN0cnVjdCgpe3Rocm93Cm5ldwpMb2dpY0V4Y2VwdGlvbigiQ2Fubm90IGluc3RhbnRpYXRlIHN0YXRpYyBjbGFzcyAiLmdldF9jbGFzcygkdGhpcykpO31zdGF0aWMKZnVuY3Rpb24KY3JlYXRlRGF0ZVRpbWUoJHRpbWUpe2lmKCR0aW1lCmluc3RhbmNlb2YKRGF0ZVRpbWUpe3JldHVybgpjbG9uZSR0aW1lO31lbHNlaWYoaXNfbnVtZXJpYygkdGltZSkpe2lmKCR0aW1lPD1zZWxmOjpZRUFSKXskdGltZSs9dGltZSgpO31yZXR1cm4KbmV3CkRhdGVUaW1lNTMoZGF0ZSgnWS1tLWQgSDppOnMnLCR0aW1lKSk7fWVsc2V7cmV0dXJuCm5ldwpEYXRlVGltZTUzKCR0aW1lKTt9fXN0YXRpYwpmdW5jdGlvbgppbmlGbGFnKCR2YXIpeyRzdGF0dXM9c3RydG9sb3dlcihpbmlfZ2V0KCR2YXIpKTtyZXR1cm4kc3RhdHVzPT09J29uJ3x8JHN0YXR1cz09PSd0cnVlJ3x8JHN0YXR1cz09PSd5ZXMnfHwkc3RhdHVzCiUKMjU2O31zdGF0aWMKZnVuY3Rpb24KZGVmYXVsdGl6ZSgmJHZhciwkZGVmYXVsdCl7aWYoJHZhcj09PU5VTEwpJHZhcj0kZGVmYXVsdDt9c3RhdGljCmZ1bmN0aW9uCmdsb2IoJHBhdHRlcm4sJGZsYWdzPTApeyRmaWxlcz1nbG9iKCRwYXR0ZXJuLCRmbGFncyk7aWYoIWlzX2FycmF5KCRmaWxlcykpeyRmaWxlcz1hcnJheSgpO30kZGlycz1nbG9iKGRpcm5hbWUoJHBhdHRlcm4pLicvKicsJGZsYWdzfEdMT0JfT05MWURJUik7aWYoaXNfYXJyYXkoJGRpcnMpKXskbWFzaz1iYXNlbmFtZSgkcGF0dGVybik7Zm9yZWFjaCgkZGlycwphcyRkaXIpeyRmaWxlcz1hcnJheV9tZXJnZSgkZmlsZXMsc2VsZjo6Z2xvYigkZGlyLicvJy4kbWFzaywkZmxhZ3MpKTt9fXJldHVybiRmaWxlczt9cHJpdmF0ZQpzdGF0aWMkZXJyb3JNc2c7c3RhdGljCmZ1bmN0aW9uCnRyeUVycm9yKCRsZXZlbD1FX0FMTCl7c2V0X2Vycm9yX2hhbmRsZXIoYXJyYXkoX19DTEFTU19fLCdfZXJyb3JIYW5kbGVyJyksJGxldmVsKTtzZWxmOjokZXJyb3JNc2c9TlVMTDt9c3RhdGljCmZ1bmN0aW9uCmNhdGNoRXJyb3IoJiRtZXNzYWdlKXtyZXN0b3JlX2Vycm9yX2hhbmRsZXIoKTskbWVzc2FnZT1zZWxmOjokZXJyb3JNc2c7c2VsZjo6JGVycm9yTXNnPU5VTEw7cmV0dXJuJG1lc3NhZ2UhPT1OVUxMO31zdGF0aWMKZnVuY3Rpb24KX2Vycm9ySGFuZGxlcigkc2V2ZXJpdHksJG1lc3NhZ2Upe2lmKCgkc2V2ZXJpdHkmZXJyb3JfcmVwb3J0aW5nKCkpIT09JHNldmVyaXR5KXtyZXR1cm4KTlVMTDt9aWYoaW5pX2dldCgnaHRtbF9lcnJvcnMnKSl7JG1lc3NhZ2U9aHRtbF9lbnRpdHlfZGVjb2RlKHN0cmlwX3RhZ3MoJG1lc3NhZ2UpLEVOVF9RVU9URVMsJ1VURi04Jyk7fWlmKCgkYT1zdHJwb3MoJG1lc3NhZ2UsJzogJykpIT09RkFMU0UpeyRtZXNzYWdlPXN1YnN0cigkbWVzc2FnZSwkYSsyKTt9c2VsZjo6JGVycm9yTXNnPSRtZXNzYWdlO319Y2xhc3MKTkZ0cApleHRlbmRzCk5PYmplY3R7Y29uc3QKQVNDSUk9RlRQX0FTQ0lJO2NvbnN0ClRFWFQ9RlRQX1RFWFQ7Y29uc3QKQklOQVJZPUZUUF9CSU5BUlk7Y29uc3QKSU1BR0U9RlRQX0lNQUdFO2NvbnN0ClRJTUVPVVRfU0VDPUZUUF9USU1FT1VUX1NFQztjb25zdApBVVRPU0VFSz1GVFBfQVVUT1NFRUs7Y29uc3QKQVVUT1JFU1VNRT1GVFBfQVVUT1JFU1VNRTtjb25zdApGQUlMRUQ9RlRQX0ZBSUxFRDtjb25zdApGSU5JU0hFRD1GVFBfRklOSVNIRUQ7Y29uc3QKTU9SRURBVEE9RlRQX01PUkVEQVRBO3ByaXZhdGUkcmVzb3VyY2U7cHJpdmF0ZSRzdGF0ZTtmdW5jdGlvbgpfX2NvbnN0cnVjdCgpe2lmKCFleHRlbnNpb25fbG9hZGVkKCdmdHAnKSl7dGhyb3cKbmV3CkV4Y2VwdGlvbigiUEhQIGV4dGVuc2lvbiBGVFAgaXMgbm90IGxvYWRlZC4iKTt9fWZ1bmN0aW9uCl9fY2FsbCgkbmFtZSwkYXJncyl7JG5hbWU9c3RydG9sb3dlcigkbmFtZSk7JHNpbGVudD1zdHJuY21wKCRuYW1lLCd0cnknLDMpPT09MDskZnVuYz0kc2lsZW50P3N1YnN0cigkbmFtZSwzKTokbmFtZTtzdGF0aWMkYWxpYXNlcz1hcnJheSgnc3NsY29ubmVjdCc9Pidzc2xfY29ubmVjdCcsJ2dldG9wdGlvbic9PidnZXRfb3B0aW9uJywnc2V0b3B0aW9uJz0+J3NldF9vcHRpb24nLCduYmNvbnRpbnVlJz0+J25iX2NvbnRpbnVlJywnbmJmZ2V0Jz0+J25iX2ZnZXQnLCduYmZwdXQnPT4nbmJfZnB1dCcsJ25iZ2V0Jz0+J25iX2dldCcsJ25icHV0Jz0+J25iX3B1dCcpOyRmdW5jPSdmdHBfJy4oaXNzZXQoJGFsaWFzZXNbJGZ1bmNdKT8kYWxpYXNlc1skZnVuY106JGZ1bmMpO2lmKCFmdW5jdGlvbl9leGlzdHMoJGZ1bmMpKXtyZXR1cm4KcGFyZW50OjpfX2NhbGwoJG5hbWUsJGFyZ3MpO31OVG9vbHM6OnRyeUVycm9yKCk7aWYoJGZ1bmM9PT0nZnRwX2Nvbm5lY3QnfHwkZnVuYz09PSdmdHBfc3NsX2Nvbm5lY3QnKXskdGhpcy0+c3RhdGU9YXJyYXkoJG5hbWU9PiRhcmdzKTskdGhpcy0+cmVzb3VyY2U9Y2FsbF91c2VyX2Z1bmNfYXJyYXkoJGZ1bmMsJGFyZ3MpOyRyZXM9TlVMTDt9ZWxzZWlmKCFpc19yZXNvdXJjZSgkdGhpcy0+cmVzb3VyY2UpKXtOVG9vbHM6OmNhdGNoRXJyb3IoJG1zZyk7dGhyb3cKbmV3Ck5GdHBFeGNlcHRpb24oIk5vdCBjb25uZWN0ZWQgdG8gRlRQIHNlcnZlci4gQ2FsbCBjb25uZWN0KCkgb3Igc3NsX2Nvbm5lY3QoKSBmaXJzdC4iKTt9ZWxzZXtpZigkZnVuYz09PSdmdHBfbG9naW4nfHwkZnVuYz09PSdmdHBfcGFzdicpeyR0aGlzLT5zdGF0ZVskbmFtZV09JGFyZ3M7fWFycmF5X3Vuc2hpZnQoJGFyZ3MsJHRoaXMtPnJlc291cmNlKTskcmVzPWNhbGxfdXNlcl9mdW5jX2FycmF5KCRmdW5jLCRhcmdzKTtpZigkZnVuYz09PSdmdHBfY2hkaXInfHwkZnVuYz09PSdmdHBfY2R1cCcpeyR0aGlzLT5zdGF0ZVsnY2hkaXInXT1hcnJheShmdHBfcHdkKCR0aGlzLT5yZXNvdXJjZSkpO319aWYoTlRvb2xzOjpjYXRjaEVycm9yKCRtc2cpJiYhJHNpbGVudCl7dGhyb3cKbmV3Ck5GdHBFeGNlcHRpb24oJG1zZyk7fXJldHVybiRyZXM7fWZ1bmN0aW9uCnJlY29ubmVjdCgpe0BmdHBfY2xvc2UoJHRoaXMtPnJlc291cmNlKTtmb3JlYWNoKCR0aGlzLT5zdGF0ZQphcyRuYW1lPT4kYXJncyl7Y2FsbF91c2VyX2Z1bmNfYXJyYXkoYXJyYXkoJHRoaXMsJG5hbWUpLCRhcmdzKTt9fWZ1bmN0aW9uCmZpbGVFeGlzdHMoJGZpbGUpe3JldHVybgppc19hcnJheSgkdGhpcy0+bmxpc3QoJGZpbGUpKTt9ZnVuY3Rpb24KaXNEaXIoJGRpcil7JGN1cnJlbnQ9JHRoaXMtPnB3ZCgpO3RyeXskdGhpcy0+Y2hkaXIoJGRpcik7fWNhdGNoKE5GdHBFeGNlcHRpb24kZSl7fSR0aGlzLT5jaGRpcigkY3VycmVudCk7cmV0dXJuCmVtcHR5KCRlKTt9ZnVuY3Rpb24KbWtEaXJSZWN1cnNpdmUoJGRpcil7JHBhcnRzPWV4cGxvZGUoJy8nLCRkaXIpOyRwYXRoPScnO3doaWxlKCFlbXB0eSgkcGFydHMpKXskcGF0aC49YXJyYXlfc2hpZnQoJHBhcnRzKTt0cnl7aWYoJHBhdGghPT0nJykkdGhpcy0+bWtkaXIoJHBhdGgpO31jYXRjaChORnRwRXhjZXB0aW9uJGUpe2lmKCEkdGhpcy0+aXNEaXIoJHBhdGgpKXt0aHJvdwpuZXcKTkZ0cEV4Y2VwdGlvbigiQ2Fubm90IGNyZWF0ZSBkaXJlY3RvcnkgJyRwYXRoJy4iKTt9fSRwYXRoLj0nLyc7fX19Y2xhc3MKTkZ0cEV4Y2VwdGlvbgpleHRlbmRzCkV4Y2VwdGlvbnt9Y2xhc3MKTkh0bWwKZXh0ZW5kcwpOT2JqZWN0CmltcGxlbWVudHMKQXJyYXlBY2Nlc3MsQ291bnRhYmxlLEl0ZXJhdG9yQWdncmVnYXRle3ByaXZhdGUkbmFtZTtwcml2YXRlJGlzRW1wdHk7cHVibGljJGF0dHJzPWFycmF5KCk7cHJvdGVjdGVkJGNoaWxkcmVuPWFycmF5KCk7cHVibGljCnN0YXRpYyR4aHRtbD1UUlVFO3B1YmxpYwpzdGF0aWMkZW1wdHlFbGVtZW50cz1hcnJheSgnaW1nJz0+MSwnaHInPT4xLCdicic9PjEsJ2lucHV0Jz0+MSwnbWV0YSc9PjEsJ2FyZWEnPT4xLCdjb21tYW5kJz0+MSwna2V5Z2VuJz0+MSwnc291cmNlJz0+MSwnYmFzZSc9PjEsJ2NvbCc9PjEsJ2xpbmsnPT4xLCdwYXJhbSc9PjEsJ2Jhc2Vmb250Jz0+MSwnZnJhbWUnPT4xLCdpc2luZGV4Jz0+MSwnd2JyJz0+MSwnZW1iZWQnPT4xKTtzdGF0aWMKZnVuY3Rpb24KZWwoJG5hbWU9TlVMTCwkYXR0cnM9TlVMTCl7JGVsPW5ldwpzZWxmOyRwYXJ0cz1leHBsb2RlKCcgJywkbmFtZSwyKTskZWwtPnNldE5hbWUoJHBhcnRzWzBdKTtpZihpc19hcnJheSgkYXR0cnMpKXskZWwtPmF0dHJzPSRhdHRyczt9ZWxzZWlmKCRhdHRycyE9PU5VTEwpeyRlbC0+c2V0VGV4dCgkYXR0cnMpO31pZihpc3NldCgkcGFydHNbMV0pKXtwcmVnX21hdGNoX2FsbCgnIyhbYS16MC05Oi1dKykoPzo9KFsiXCddKT8oLio/KSg/KDIpXFwyfFxzKSk/I2knLCRwYXJ0c1sxXS4nICcsJHBhcnRzLFBSRUdfU0VUX09SREVSKTtmb3JlYWNoKCRwYXJ0cwphcyRtKXskZWwtPmF0dHJzWyRtWzFdXT1pc3NldCgkbVszXSk/JG1bM106VFJVRTt9fXJldHVybiRlbDt9ZmluYWwKZnVuY3Rpb24Kc2V0TmFtZSgkbmFtZSwkaXNFbXB0eT1OVUxMKXtpZigkbmFtZSE9PU5VTEwmJiFpc19zdHJpbmcoJG5hbWUpKXt0aHJvdwpuZXcKSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJOYW1lIG11c3QgYmUgc3RyaW5nIG9yIE5VTEwsICIuZ2V0dHlwZSgkbmFtZSkuIiBnaXZlbi4iKTt9JHRoaXMtPm5hbWU9JG5hbWU7JHRoaXMtPmlzRW1wdHk9JGlzRW1wdHk9PT1OVUxMP2lzc2V0KHNlbGY6OiRlbXB0eUVsZW1lbnRzWyRuYW1lXSk6KGJvb2wpJGlzRW1wdHk7cmV0dXJuJHRoaXM7fWZpbmFsCmZ1bmN0aW9uCmdldE5hbWUoKXtyZXR1cm4kdGhpcy0+bmFtZTt9ZmluYWwKZnVuY3Rpb24KaXNFbXB0eSgpe3JldHVybiR0aGlzLT5pc0VtcHR5O31maW5hbApmdW5jdGlvbgpfX3NldCgkbmFtZSwkdmFsdWUpeyR0aGlzLT5hdHRyc1skbmFtZV09JHZhbHVlO31maW5hbApmdW5jdGlvbiZfX2dldCgkbmFtZSl7cmV0dXJuJHRoaXMtPmF0dHJzWyRuYW1lXTt9ZmluYWwKZnVuY3Rpb24KX191bnNldCgkbmFtZSl7dW5zZXQoJHRoaXMtPmF0dHJzWyRuYW1lXSk7fWZpbmFsCmZ1bmN0aW9uCl9fY2FsbCgkbSwkYXJncyl7JHA9c3Vic3RyKCRtLDAsMyk7aWYoJHA9PT0nZ2V0J3x8JHA9PT0nc2V0J3x8JHA9PT0nYWRkJyl7JG09c3Vic3RyKCRtLDMpOyRtWzBdPSRtWzBdfCJceDIwIjtpZigkcD09PSdnZXQnKXtyZXR1cm4KaXNzZXQoJHRoaXMtPmF0dHJzWyRtXSk/JHRoaXMtPmF0dHJzWyRtXTpOVUxMO31lbHNlaWYoJHA9PT0nYWRkJyl7JGFyZ3NbXT1UUlVFO319aWYoY291bnQoJGFyZ3MpPT09MSl7JHRoaXMtPmF0dHJzWyRtXT0kYXJnc1swXTt9ZWxzZWlmKCRhcmdzWzBdPT1OVUxMKXskdG1wPSYkdGhpcy0+YXR0cnNbJG1dO31lbHNlaWYoIWlzc2V0KCR0aGlzLT5hdHRyc1skbV0pfHxpc19hcnJheSgkdGhpcy0+YXR0cnNbJG1dKSl7JHRoaXMtPmF0dHJzWyRtXVskYXJnc1swXV09JGFyZ3NbMV07fWVsc2V7JHRoaXMtPmF0dHJzWyRtXT1hcnJheSgkdGhpcy0+YXR0cnNbJG1dLCRhcmdzWzBdPT4kYXJnc1sxXSk7fXJldHVybiR0aGlzO31maW5hbApmdW5jdGlvbgpocmVmKCRwYXRoLCRxdWVyeT1OVUxMKXtpZigkcXVlcnkpeyRxdWVyeT1odHRwX2J1aWxkX3F1ZXJ5KCRxdWVyeSxOVUxMLCcmJyk7aWYoJHF1ZXJ5IT09JycpJHBhdGguPSc/Jy4kcXVlcnk7fSR0aGlzLT5hdHRyc1snaHJlZiddPSRwYXRoO3JldHVybiR0aGlzO31maW5hbApmdW5jdGlvbgpzZXRIdG1sKCRodG1sKXtpZigkaHRtbD09PU5VTEwpeyRodG1sPScnO31lbHNlaWYoaXNfYXJyYXkoJGh0bWwpKXt0aHJvdwpuZXcKSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJUZXh0dWFsIGNvbnRlbnQgbXVzdCBiZSBhIHNjYWxhciwgIi5nZXR0eXBlKCRodG1sKS4iIGdpdmVuLiIpO31lbHNleyRodG1sPShzdHJpbmcpJGh0bWw7fSR0aGlzLT5yZW1vdmVDaGlsZHJlbigpOyR0aGlzLT5jaGlsZHJlbltdPSRodG1sO3JldHVybiR0aGlzO31maW5hbApmdW5jdGlvbgpnZXRIdG1sKCl7JHM9Jyc7Zm9yZWFjaCgkdGhpcy0+Y2hpbGRyZW4KYXMkY2hpbGQpe2lmKGlzX29iamVjdCgkY2hpbGQpKXskcy49JGNoaWxkLT5yZW5kZXIoKTt9ZWxzZXskcy49JGNoaWxkO319cmV0dXJuJHM7fWZpbmFsCmZ1bmN0aW9uCnNldFRleHQoJHRleHQpe2lmKCFpc19hcnJheSgkdGV4dCkpeyR0ZXh0PXN0cl9yZXBsYWNlKGFycmF5KCcmJywnPCcsJz4nKSxhcnJheSgnJmFtcDsnLCcmbHQ7JywnJmd0OycpLChzdHJpbmcpJHRleHQpO31yZXR1cm4kdGhpcy0+c2V0SHRtbCgkdGV4dCk7fWZpbmFsCmZ1bmN0aW9uCmdldFRleHQoKXtyZXR1cm4KaHRtbF9lbnRpdHlfZGVjb2RlKHN0cmlwX3RhZ3MoJHRoaXMtPmdldEh0bWwoKSksRU5UX1FVT1RFUywnVVRGLTgnKTt9ZmluYWwKZnVuY3Rpb24KYWRkKCRjaGlsZCl7cmV0dXJuJHRoaXMtPmluc2VydChOVUxMLCRjaGlsZCk7fWZpbmFsCmZ1bmN0aW9uCmNyZWF0ZSgkbmFtZSwkYXR0cnM9TlVMTCl7JHRoaXMtPmluc2VydChOVUxMLCRjaGlsZD1zZWxmOjplbCgkbmFtZSwkYXR0cnMpKTtyZXR1cm4kY2hpbGQ7fWZ1bmN0aW9uCmluc2VydCgkaW5kZXgsJGNoaWxkLCRyZXBsYWNlPUZBTFNFKXtpZigkY2hpbGQKaW5zdGFuY2VvZgpOSHRtbHx8aXNfc2NhbGFyKCRjaGlsZCkpe2lmKCRpbmRleD09PU5VTEwpeyR0aGlzLT5jaGlsZHJlbltdPSRjaGlsZDt9ZWxzZXthcnJheV9zcGxpY2UoJHRoaXMtPmNoaWxkcmVuLChpbnQpJGluZGV4LCRyZXBsYWNlPzE6MCxhcnJheSgkY2hpbGQpKTt9fWVsc2V7dGhyb3cKbmV3CkludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiQ2hpbGQgbm9kZSBtdXN0IGJlIHNjYWxhciBvciBIdG1sIG9iamVjdCwgIi4oaXNfb2JqZWN0KCRjaGlsZCk/Z2V0X2NsYXNzKCRjaGlsZCk6Z2V0dHlwZSgkY2hpbGQpKS4iIGdpdmVuLiIpO31yZXR1cm4kdGhpczt9ZmluYWwKZnVuY3Rpb24Kb2Zmc2V0U2V0KCRpbmRleCwkY2hpbGQpeyR0aGlzLT5pbnNlcnQoJGluZGV4LCRjaGlsZCxUUlVFKTt9ZmluYWwKZnVuY3Rpb24Kb2Zmc2V0R2V0KCRpbmRleCl7cmV0dXJuJHRoaXMtPmNoaWxkcmVuWyRpbmRleF07fWZpbmFsCmZ1bmN0aW9uCm9mZnNldEV4aXN0cygkaW5kZXgpe3JldHVybgppc3NldCgkdGhpcy0+Y2hpbGRyZW5bJGluZGV4XSk7fWZ1bmN0aW9uCm9mZnNldFVuc2V0KCRpbmRleCl7aWYoaXNzZXQoJHRoaXMtPmNoaWxkcmVuWyRpbmRleF0pKXthcnJheV9zcGxpY2UoJHRoaXMtPmNoaWxkcmVuLChpbnQpJGluZGV4LDEpO319ZmluYWwKZnVuY3Rpb24KY291bnQoKXtyZXR1cm4KY291bnQoJHRoaXMtPmNoaWxkcmVuKTt9ZnVuY3Rpb24KcmVtb3ZlQ2hpbGRyZW4oKXskdGhpcy0+Y2hpbGRyZW49YXJyYXkoKTt9ZmluYWwKZnVuY3Rpb24KZ2V0SXRlcmF0b3IoJGRlZXA9RkFMU0Upe2lmKCRkZWVwKXskZGVlcD0kZGVlcD4wP1JlY3Vyc2l2ZUl0ZXJhdG9ySXRlcmF0b3I6OlNFTEZfRklSU1Q6UmVjdXJzaXZlSXRlcmF0b3JJdGVyYXRvcjo6Q0hJTERfRklSU1Q7cmV0dXJuCm5ldwpSZWN1cnNpdmVJdGVyYXRvckl0ZXJhdG9yKG5ldwpOR2VuZXJpY1JlY3Vyc2l2ZUl0ZXJhdG9yKG5ldwpBcnJheUl0ZXJhdG9yKCR0aGlzLT5jaGlsZHJlbikpLCRkZWVwKTt9ZWxzZXtyZXR1cm4KbmV3Ck5HZW5lcmljUmVjdXJzaXZlSXRlcmF0b3IobmV3CkFycmF5SXRlcmF0b3IoJHRoaXMtPmNoaWxkcmVuKSk7fX1maW5hbApmdW5jdGlvbgpnZXRDaGlsZHJlbigpe3JldHVybiR0aGlzLT5jaGlsZHJlbjt9ZmluYWwKZnVuY3Rpb24KcmVuZGVyKCRpbmRlbnQ9TlVMTCl7JHM9JHRoaXMtPnN0YXJ0VGFnKCk7aWYoISR0aGlzLT5pc0VtcHR5KXtpZigkaW5kZW50IT09TlVMTCl7JGluZGVudCsrO31mb3JlYWNoKCR0aGlzLT5jaGlsZHJlbgphcyRjaGlsZCl7aWYoaXNfb2JqZWN0KCRjaGlsZCkpeyRzLj0kY2hpbGQtPnJlbmRlcigkaW5kZW50KTt9ZWxzZXskcy49JGNoaWxkO319JHMuPSR0aGlzLT5lbmRUYWcoKTt9aWYoJGluZGVudCE9PU5VTEwpe3JldHVybiJcbiIuc3RyX3JlcGVhdCgiXHQiLCRpbmRlbnQtMSkuJHMuIlxuIi5zdHJfcmVwZWF0KCJcdCIsbWF4KDAsJGluZGVudC0yKSk7fXJldHVybiRzO31maW5hbApmdW5jdGlvbgpfX3RvU3RyaW5nKCl7cmV0dXJuJHRoaXMtPnJlbmRlcigpO31maW5hbApmdW5jdGlvbgpzdGFydFRhZygpe2lmKCR0aGlzLT5uYW1lKXtyZXR1cm4nPCcuJHRoaXMtPm5hbWUuJHRoaXMtPmF0dHJpYnV0ZXMoKS4oc2VsZjo6JHhodG1sJiYkdGhpcy0+aXNFbXB0eT8nIC8+JzonPicpO31lbHNle3JldHVybicnO319ZmluYWwKZnVuY3Rpb24KZW5kVGFnKCl7cmV0dXJuJHRoaXMtPm5hbWUmJiEkdGhpcy0+aXNFbXB0eT8nPC8nLiR0aGlzLT5uYW1lLic+JzonJzt9ZmluYWwKZnVuY3Rpb24KYXR0cmlidXRlcygpe2lmKCFpc19hcnJheSgkdGhpcy0+YXR0cnMpKXtyZXR1cm4nJzt9JHM9Jyc7Zm9yZWFjaCgkdGhpcy0+YXR0cnMKYXMka2V5PT4kdmFsdWUpe2lmKCR2YWx1ZT09PU5VTEx8fCR2YWx1ZT09PUZBTFNFKWNvbnRpbnVlO2lmKCR2YWx1ZT09PVRSVUUpe2lmKHNlbGY6OiR4aHRtbCkkcy49JyAnLiRrZXkuJz0iJy4ka2V5LiciJztlbHNlJHMuPScgJy4ka2V5O2NvbnRpbnVlO31lbHNlaWYoaXNfYXJyYXkoJHZhbHVlKSl7JHRtcD1OVUxMO2ZvcmVhY2goJHZhbHVlCmFzJGs9PiR2KXtpZigkdj09TlVMTCljb250aW51ZTskdG1wW109aXNfc3RyaW5nKCRrKT8oJHY9PT1UUlVFPyRrOiRrLic6Jy4kdik6JHY7fWlmKCR0bXA9PT1OVUxMKWNvbnRpbnVlOyR2YWx1ZT1pbXBsb2RlKCRrZXk9PT0nc3R5bGUnfHwhc3RybmNtcCgka2V5LCdvbicsMik/JzsnOicgJywkdG1wKTt9ZWxzZXskdmFsdWU9KHN0cmluZykkdmFsdWU7fSRzLj0nICcuJGtleS4nPSInLnN0cl9yZXBsYWNlKGFycmF5KCcmJywnIicsJzwnLCc+JywnQCcpLGFycmF5KCcmYW1wOycsJyZxdW90OycsJyZsdDsnLCcmZ3Q7JywnJiM2NDsnKSwkdmFsdWUpLiciJzt9cmV0dXJuJHM7fWZ1bmN0aW9uCl9fY2xvbmUoKXtmb3JlYWNoKCR0aGlzLT5jaGlsZHJlbgphcyRrZXk9PiR2YWx1ZSl7aWYoaXNfb2JqZWN0KCR2YWx1ZSkpeyR0aGlzLT5jaGlsZHJlblska2V5XT1jbG9uZSR2YWx1ZTt9fX19Y2xhc3MKTkh0dHBDb250ZXh0CmV4dGVuZHMKTk9iamVjdHtmdW5jdGlvbgppc01vZGlmaWVkKCRsYXN0TW9kaWZpZWQ9TlVMTCwkZXRhZz1OVUxMKXskcmVzcG9uc2U9JHRoaXMtPmdldFJlc3BvbnNlKCk7JHJlcXVlc3Q9JHRoaXMtPmdldFJlcXVlc3QoKTtpZigkbGFzdE1vZGlmaWVkKXskcmVzcG9uc2UtPnNldEhlYWRlcignTGFzdC1Nb2RpZmllZCcsJHJlc3BvbnNlLT5kYXRlKCRsYXN0TW9kaWZpZWQpKTt9aWYoJGV0YWcpeyRyZXNwb25zZS0+c2V0SGVhZGVyKCdFVGFnJywnIicuYWRkc2xhc2hlcygkZXRhZykuJyInKTt9JGlmTm9uZU1hdGNoPSRyZXF1ZXN0LT5nZXRIZWFkZXIoJ0lmLU5vbmUtTWF0Y2gnKTtpZigkaWZOb25lTWF0Y2g9PT0nKicpeyRtYXRjaD1UUlVFO31lbHNlaWYoJGlmTm9uZU1hdGNoIT09TlVMTCl7JGV0YWc9JHJlc3BvbnNlLT5nZXRIZWFkZXIoJ0VUYWcnKTtpZigkZXRhZz09TlVMTHx8c3RycG9zKCcgJy5zdHJ0cigkaWZOb25lTWF0Y2gsIixcdCIsJyAgJyksJyAnLiRldGFnKT09PUZBTFNFKXtyZXR1cm4KVFJVRTt9ZWxzZXskbWF0Y2g9VFJVRTt9fSRpZk1vZGlmaWVkU2luY2U9JHJlcXVlc3QtPmdldEhlYWRlcignSWYtTW9kaWZpZWQtU2luY2UnKTtpZigkaWZNb2RpZmllZFNpbmNlIT09TlVMTCl7JGxhc3RNb2RpZmllZD0kcmVzcG9uc2UtPmdldEhlYWRlcignTGFzdC1Nb2RpZmllZCcpO2lmKCRsYXN0TW9kaWZpZWQhPU5VTEwmJnN0cnRvdGltZSgkbGFzdE1vZGlmaWVkKTw9c3RydG90aW1lKCRpZk1vZGlmaWVkU2luY2UpKXskbWF0Y2g9VFJVRTt9ZWxzZXtyZXR1cm4KVFJVRTt9fWlmKGVtcHR5KCRtYXRjaCkpe3JldHVybgpUUlVFO30kcmVzcG9uc2UtPnNldENvZGUoSUh0dHBSZXNwb25zZTo6UzMwNF9OT1RfTU9ESUZJRUQpO3JldHVybgpGQUxTRTt9ZnVuY3Rpb24KZ2V0UmVxdWVzdCgpe3JldHVybgpORW52aXJvbm1lbnQ6OmdldEh0dHBSZXF1ZXN0KCk7fWZ1bmN0aW9uCmdldFJlc3BvbnNlKCl7cmV0dXJuCk5FbnZpcm9ubWVudDo6Z2V0SHR0cFJlc3BvbnNlKCk7fX1jbGFzcwpOSHR0cFJlcXVlc3QKZXh0ZW5kcwpOT2JqZWN0CmltcGxlbWVudHMKSUh0dHBSZXF1ZXN0e3Byb3RlY3RlZCRxdWVyeTtwcm90ZWN0ZWQkcG9zdDtwcm90ZWN0ZWQkZmlsZXM7cHJvdGVjdGVkJGNvb2tpZXM7cHJvdGVjdGVkJHVyaTtwcm90ZWN0ZWQkb3JpZ2luYWxVcmk7cHJvdGVjdGVkJGhlYWRlcnM7cHJvdGVjdGVkJHVyaUZpbHRlcj1hcnJheShQSFBfVVJMX1BBVEg9PmFycmF5KCcjL3syLH0jJz0+Jy8nKSwwPT5hcnJheSgpKTtwcm90ZWN0ZWQkZW5jb2Rpbmc7ZmluYWwKZnVuY3Rpb24KZ2V0VXJpKCl7aWYoJHRoaXMtPnVyaT09PU5VTEwpeyR0aGlzLT5kZXRlY3RVcmkoKTt9cmV0dXJuJHRoaXMtPnVyaTt9ZnVuY3Rpb24Kc2V0VXJpKE5VcmlTY3JpcHQkdXJpKXskdGhpcy0+dXJpPWNsb25lJHVyaTskdGhpcy0+cXVlcnk9TlVMTDskdGhpcy0+dXJpLT5jYW5vbmljYWxpemUoKTskdGhpcy0+dXJpLT5mcmVlemUoKTtyZXR1cm4kdGhpczt9ZmluYWwKZnVuY3Rpb24KZ2V0T3JpZ2luYWxVcmkoKXtpZigkdGhpcy0+b3JpZ2luYWxVcmk9PT1OVUxMKXskdGhpcy0+ZGV0ZWN0VXJpKCk7fXJldHVybiR0aGlzLT5vcmlnaW5hbFVyaTt9ZnVuY3Rpb24KYWRkVXJpRmlsdGVyKCRwYXR0ZXJuLCRyZXBsYWNlbWVudD0nJywkY29tcG9uZW50PU5VTEwpeyRwYXR0ZXJuPScjJy4kcGF0dGVybi4nIyc7JGNvbXBvbmVudD0kY29tcG9uZW50PT09UEhQX1VSTF9QQVRIP1BIUF9VUkxfUEFUSDowO2lmKCRyZXBsYWNlbWVudD09PU5VTEwpe3Vuc2V0KCR0aGlzLT51cmlGaWx0ZXJbJGNvbXBvbmVudF1bJHBhdHRlcm5dKTt9ZWxzZXskdGhpcy0+dXJpRmlsdGVyWyRjb21wb25lbnRdWyRwYXR0ZXJuXT0kcmVwbGFjZW1lbnQ7fSR0aGlzLT51cmk9TlVMTDt9ZmluYWwKZnVuY3Rpb24KZ2V0VXJpRmlsdGVycygpe3JldHVybiR0aGlzLT51cmlGaWx0ZXI7fXByb3RlY3RlZApmdW5jdGlvbgpkZXRlY3RVcmkoKXskdXJpPSR0aGlzLT51cmk9bmV3Ck5VcmlTY3JpcHQ7JHVyaS0+c2NoZW1lPSR0aGlzLT5pc1NlY3VyZWQoKT8naHR0cHMnOidodHRwJzskdXJpLT51c2VyPWlzc2V0KCRfU0VSVkVSWydQSFBfQVVUSF9VU0VSJ10pPyRfU0VSVkVSWydQSFBfQVVUSF9VU0VSJ106Jyc7JHVyaS0+cGFzc3dvcmQ9aXNzZXQoJF9TRVJWRVJbJ1BIUF9BVVRIX1BXJ10pPyRfU0VSVkVSWydQSFBfQVVUSF9QVyddOicnO2lmKGlzc2V0KCRfU0VSVkVSWydIVFRQX0hPU1QnXSkpeyRwYWlyPWV4cGxvZGUoJzonLCRfU0VSVkVSWydIVFRQX0hPU1QnXSk7fWVsc2VpZihpc3NldCgkX1NFUlZFUlsnU0VSVkVSX05BTUUnXSkpeyRwYWlyPWV4cGxvZGUoJzonLCRfU0VSVkVSWydTRVJWRVJfTkFNRSddKTt9ZWxzZXskcGFpcj1hcnJheSgnJyk7fSR1cmktPmhvc3Q9JHBhaXJbMF07aWYoaXNzZXQoJHBhaXJbMV0pKXskdXJpLT5wb3J0PShpbnQpJHBhaXJbMV07fWVsc2VpZihpc3NldCgkX1NFUlZFUlsnU0VSVkVSX1BPUlQnXSkpeyR1cmktPnBvcnQ9KGludCkkX1NFUlZFUlsnU0VSVkVSX1BPUlQnXTt9aWYoaXNzZXQoJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10pKXskcmVxdWVzdFVyaT0kX1NFUlZFUlsnUkVRVUVTVF9VUkknXTt9ZWxzZWlmKGlzc2V0KCRfU0VSVkVSWydPUklHX1BBVEhfSU5GTyddKSl7JHJlcXVlc3RVcmk9JF9TRVJWRVJbJ09SSUdfUEFUSF9JTkZPJ107aWYoaXNzZXQoJF9TRVJWRVJbJ1FVRVJZX1NUUklORyddKSYmJF9TRVJWRVJbJ1FVRVJZX1NUUklORyddIT0nJyl7JHJlcXVlc3RVcmkuPSc/Jy4kX1NFUlZFUlsnUVVFUllfU1RSSU5HJ107fX1lbHNleyRyZXF1ZXN0VXJpPScnO30kdG1wPWV4cGxvZGUoJz8nLCRyZXF1ZXN0VXJpLDIpOyR0aGlzLT5vcmlnaW5hbFVyaT1uZXcKTlVyaSgkdXJpKTskdGhpcy0+b3JpZ2luYWxVcmktPnBhdGg9JHRtcFswXTskdGhpcy0+b3JpZ2luYWxVcmktPnF1ZXJ5PWlzc2V0KCR0bXBbMV0pPyR0bXBbMV06Jyc7JHRoaXMtPm9yaWdpbmFsVXJpLT5mcmVlemUoKTskcmVxdWVzdFVyaT1wcmVnX3JlcGxhY2UoYXJyYXlfa2V5cygkdGhpcy0+dXJpRmlsdGVyWzBdKSxhcnJheV92YWx1ZXMoJHRoaXMtPnVyaUZpbHRlclswXSksJHJlcXVlc3RVcmkpOyR0bXA9ZXhwbG9kZSgnPycsJHJlcXVlc3RVcmksMik7JHVyaS0+cGF0aD1wcmVnX3JlcGxhY2UoYXJyYXlfa2V5cygkdGhpcy0+dXJpRmlsdGVyW1BIUF9VUkxfUEFUSF0pLGFycmF5X3ZhbHVlcygkdGhpcy0+dXJpRmlsdGVyW1BIUF9VUkxfUEFUSF0pLCR0bXBbMF0pOyR1cmktPnBhdGg9TlN0cmluZzo6Zml4RW5jb2RpbmcoJHVyaS0+cGF0aCk7JHVyaS0+cXVlcnk9aXNzZXQoJHRtcFsxXSk/JHRtcFsxXTonJzskdXJpLT5jYW5vbmljYWxpemUoKTskZmlsZW5hbWU9aXNzZXQoJF9TRVJWRVJbJ1NDUklQVF9GSUxFTkFNRSddKT9iYXNlbmFtZSgkX1NFUlZFUlsnU0NSSVBUX0ZJTEVOQU1FJ10pOk5VTEw7JHNjcmlwdFBhdGg9Jyc7aWYoaXNzZXQoJF9TRVJWRVJbJ1NDUklQVF9OQU1FJ10pJiZiYXNlbmFtZSgkX1NFUlZFUlsnU0NSSVBUX05BTUUnXSk9PT0kZmlsZW5hbWUpeyRzY3JpcHRQYXRoPXJ0cmltKCRfU0VSVkVSWydTQ1JJUFRfTkFNRSddLCcvJyk7fWVsc2VpZihpc3NldCgkX1NFUlZFUlsnUEhQX1NFTEYnXSkmJmJhc2VuYW1lKCRfU0VSVkVSWydQSFBfU0VMRiddKT09PSRmaWxlbmFtZSl7JHNjcmlwdFBhdGg9JF9TRVJWRVJbJ1BIUF9TRUxGJ107fWVsc2VpZihpc3NldCgkX1NFUlZFUlsnT1JJR19TQ1JJUFRfTkFNRSddKSYmYmFzZW5hbWUoJF9TRVJWRVJbJ09SSUdfU0NSSVBUX05BTUUnXSk9PT0kZmlsZW5hbWUpeyRzY3JpcHRQYXRoPSRfU0VSVkVSWydPUklHX1NDUklQVF9OQU1FJ107fWVsc2VpZihpc3NldCgkX1NFUlZFUlsnUEhQX1NFTEYnXSwkX1NFUlZFUlsnU0NSSVBUX0ZJTEVOQU1FJ10pKXskcGF0aD0kX1NFUlZFUlsnUEhQX1NFTEYnXTskc2Vncz1leHBsb2RlKCcvJyx0cmltKCRfU0VSVkVSWydTQ1JJUFRfRklMRU5BTUUnXSwnLycpKTskc2Vncz1hcnJheV9yZXZlcnNlKCRzZWdzKTskaW5kZXg9MDskbGFzdD1jb3VudCgkc2Vncyk7ZG97JHNlZz0kc2Vnc1skaW5kZXhdOyRzY3JpcHRQYXRoPScvJy4kc2VnLiRzY3JpcHRQYXRoOyRpbmRleCsrO313aGlsZSgoJGxhc3Q+JGluZGV4KSYmKEZBTFNFIT09KCRwb3M9c3RycG9zKCRwYXRoLCRzY3JpcHRQYXRoKSkpJiYoMCE9JHBvcykpO31pZihzdHJuY21wKCR1cmktPnBhdGgsJHNjcmlwdFBhdGgsc3RybGVuKCRzY3JpcHRQYXRoKSk9PT0wKXskdXJpLT5zY3JpcHRQYXRoPSRzY3JpcHRQYXRoO31lbHNlaWYoc3RybmNtcCgkdXJpLT5wYXRoLCRzY3JpcHRQYXRoLHN0cnJwb3MoJHNjcmlwdFBhdGgsJy8nKSsxKT09PTApeyR1cmktPnNjcmlwdFBhdGg9c3Vic3RyKCRzY3JpcHRQYXRoLDAsc3RycnBvcygkc2NyaXB0UGF0aCwnLycpKzEpO31lbHNlaWYoc3RycG9zKCR1cmktPnBhdGgsYmFzZW5hbWUoJHNjcmlwdFBhdGgpKT09PUZBTFNFKXskdXJpLT5zY3JpcHRQYXRoPScvJzt9ZWxzZWlmKChzdHJsZW4oJHVyaS0+cGF0aCk+PXN0cmxlbigkc2NyaXB0UGF0aCkpJiYoKEZBTFNFIT09KCRwb3M9c3RycG9zKCR1cmktPnBhdGgsJHNjcmlwdFBhdGgpKSkmJigkcG9zIT09MCkpKXskdXJpLT5zY3JpcHRQYXRoPXN1YnN0cigkdXJpLT5wYXRoLDAsJHBvcytzdHJsZW4oJHNjcmlwdFBhdGgpKTt9ZWxzZXskdXJpLT5zY3JpcHRQYXRoPSRzY3JpcHRQYXRoO30kdXJpLT5mcmVlemUoKTt9ZmluYWwKZnVuY3Rpb24KZ2V0UXVlcnkoJGtleT1OVUxMLCRkZWZhdWx0PU5VTEwpe2lmKCR0aGlzLT5xdWVyeT09PU5VTEwpeyR0aGlzLT5pbml0aWFsaXplKCk7fWlmKGZ1bmNfbnVtX2FyZ3MoKT09PTApe3JldHVybiR0aGlzLT5xdWVyeTt9ZWxzZWlmKGlzc2V0KCR0aGlzLT5xdWVyeVska2V5XSkpe3JldHVybiR0aGlzLT5xdWVyeVska2V5XTt9ZWxzZXtyZXR1cm4kZGVmYXVsdDt9fWZpbmFsCmZ1bmN0aW9uCmdldFBvc3QoJGtleT1OVUxMLCRkZWZhdWx0PU5VTEwpe2lmKCR0aGlzLT5wb3N0PT09TlVMTCl7JHRoaXMtPmluaXRpYWxpemUoKTt9aWYoZnVuY19udW1fYXJncygpPT09MCl7cmV0dXJuJHRoaXMtPnBvc3Q7fWVsc2VpZihpc3NldCgkdGhpcy0+cG9zdFska2V5XSkpe3JldHVybiR0aGlzLT5wb3N0WyRrZXldO31lbHNle3JldHVybiRkZWZhdWx0O319ZnVuY3Rpb24KZ2V0UG9zdFJhdygpe3JldHVybgpmaWxlX2dldF9jb250ZW50cygncGhwOi8vaW5wdXQnKTt9ZmluYWwKZnVuY3Rpb24KZ2V0RmlsZSgka2V5KXtpZigkdGhpcy0+ZmlsZXM9PT1OVUxMKXskdGhpcy0+aW5pdGlhbGl6ZSgpO30kYXJncz1mdW5jX2dldF9hcmdzKCk7cmV0dXJuCk5BcnJheVRvb2xzOjpnZXQoJHRoaXMtPmZpbGVzLCRhcmdzKTt9ZmluYWwKZnVuY3Rpb24KZ2V0RmlsZXMoKXtpZigkdGhpcy0+ZmlsZXM9PT1OVUxMKXskdGhpcy0+aW5pdGlhbGl6ZSgpO31yZXR1cm4kdGhpcy0+ZmlsZXM7fWZpbmFsCmZ1bmN0aW9uCmdldENvb2tpZSgka2V5LCRkZWZhdWx0PU5VTEwpe2lmKCR0aGlzLT5jb29raWVzPT09TlVMTCl7JHRoaXMtPmluaXRpYWxpemUoKTt9aWYoZnVuY19udW1fYXJncygpPT09MCl7cmV0dXJuJHRoaXMtPmNvb2tpZXM7fWVsc2VpZihpc3NldCgkdGhpcy0+Y29va2llc1ska2V5XSkpe3JldHVybiR0aGlzLT5jb29raWVzWyRrZXldO31lbHNle3JldHVybiRkZWZhdWx0O319ZmluYWwKZnVuY3Rpb24KZ2V0Q29va2llcygpe2lmKCR0aGlzLT5jb29raWVzPT09TlVMTCl7JHRoaXMtPmluaXRpYWxpemUoKTt9cmV0dXJuJHRoaXMtPmNvb2tpZXM7fWZ1bmN0aW9uCnNldEVuY29kaW5nKCRlbmNvZGluZyl7aWYoc3RyY2FzZWNtcCgkZW5jb2RpbmcsJHRoaXMtPmVuY29kaW5nKSl7JHRoaXMtPmVuY29kaW5nPSRlbmNvZGluZzskdGhpcy0+cXVlcnk9JHRoaXMtPnBvc3Q9JHRoaXMtPmNvb2tpZXM9JHRoaXMtPmZpbGVzPU5VTEw7fXJldHVybiR0aGlzO31mdW5jdGlvbgppbml0aWFsaXplKCl7JGZpbHRlcj0oIWluX2FycmF5KGluaV9nZXQoImZpbHRlci5kZWZhdWx0IiksYXJyYXkoIiIsInVuc2FmZV9yYXciKSl8fGluaV9nZXQoImZpbHRlci5kZWZhdWx0X2ZsYWdzIikpO3BhcnNlX3N0cigkdGhpcy0+Z2V0VXJpKCktPnF1ZXJ5LCR0aGlzLT5xdWVyeSk7aWYoISR0aGlzLT5xdWVyeSl7JHRoaXMtPnF1ZXJ5PSRmaWx0ZXI/ZmlsdGVyX2lucHV0X2FycmF5KElOUFVUX0dFVCxGSUxURVJfVU5TQUZFX1JBVyk6KGVtcHR5KCRfR0VUKT9hcnJheSgpOiRfR0VUKTt9JHRoaXMtPnBvc3Q9JGZpbHRlcj9maWx0ZXJfaW5wdXRfYXJyYXkoSU5QVVRfUE9TVCxGSUxURVJfVU5TQUZFX1JBVyk6KGVtcHR5KCRfUE9TVCk/YXJyYXkoKTokX1BPU1QpOyR0aGlzLT5jb29raWVzPSRmaWx0ZXI/ZmlsdGVyX2lucHV0X2FycmF5KElOUFVUX0NPT0tJRSxGSUxURVJfVU5TQUZFX1JBVyk6KGVtcHR5KCRfQ09PS0lFKT9hcnJheSgpOiRfQ09PS0lFKTskZ3BjPShib29sKWdldF9tYWdpY19xdW90ZXNfZ3BjKCk7JGVuYz0oYm9vbCkkdGhpcy0+ZW5jb2Rpbmc7JG9sZD1lcnJvcl9yZXBvcnRpbmcoZXJyb3JfcmVwb3J0aW5nKCleRV9OT1RJQ0UpOyRub25DaGFycz0nI1teXHgwOVx4MEFceDBEXHgyMC1ceDdFXHhBMC1ceHsxMEZGRkZ9XSN1JztpZigkZ3BjfHwkZW5jKXskdXRmPXN0cmNhc2VjbXAoJHRoaXMtPmVuY29kaW5nLCdVVEYtOCcpPT09MDskbGlzdD1hcnJheSgmJHRoaXMtPnF1ZXJ5LCYkdGhpcy0+cG9zdCwmJHRoaXMtPmNvb2tpZXMpO3doaWxlKGxpc3QoJGtleSwkdmFsKT1lYWNoKCRsaXN0KSl7Zm9yZWFjaCgkdmFsCmFzJGs9PiR2KXt1bnNldCgkbGlzdFska2V5XVska10pO2lmKCRncGMpeyRrPXN0cmlwc2xhc2hlcygkayk7fWlmKCRlbmMmJmlzX3N0cmluZygkaykmJihwcmVnX21hdGNoKCRub25DaGFycywkayl8fHByZWdfbGFzdF9lcnJvcigpKSl7fWVsc2VpZihpc19hcnJheSgkdikpeyRsaXN0WyRrZXldWyRrXT0kdjskbGlzdFtdPSYkbGlzdFska2V5XVska107fWVsc2V7aWYoJGdwYyYmISRmaWx0ZXIpeyR2PXN0cmlwU2xhc2hlcygkdik7fWlmKCRlbmMpe2lmKCR1dGYpeyR2PU5TdHJpbmc6OmZpeEVuY29kaW5nKCR2KTt9ZWxzZXtpZighTlN0cmluZzo6Y2hlY2tFbmNvZGluZygkdikpeyR2PWljb252KCR0aGlzLT5lbmNvZGluZywnVVRGLTgvL0lHTk9SRScsJHYpO30kdj1odG1sX2VudGl0eV9kZWNvZGUoJHYsRU5UX1FVT1RFUywnVVRGLTgnKTt9JHY9cHJlZ19yZXBsYWNlKCRub25DaGFycywnJywkdik7fSRsaXN0WyRrZXldWyRrXT0kdjt9fX11bnNldCgkbGlzdCwka2V5LCR2YWwsJGssJHYpO30kdGhpcy0+ZmlsZXM9YXJyYXkoKTskbGlzdD1hcnJheSgpO2lmKCFlbXB0eSgkX0ZJTEVTKSl7Zm9yZWFjaCgkX0ZJTEVTCmFzJGs9PiR2KXtpZigkZW5jJiZpc19zdHJpbmcoJGspJiYocHJlZ19tYXRjaCgkbm9uQ2hhcnMsJGspfHxwcmVnX2xhc3RfZXJyb3IoKSkpY29udGludWU7JHZbJ0AnXT0mJHRoaXMtPmZpbGVzWyRrXTskbGlzdFtdPSR2O319d2hpbGUobGlzdCgsJHYpPWVhY2goJGxpc3QpKXtpZighaXNzZXQoJHZbJ25hbWUnXSkpe2NvbnRpbnVlO31lbHNlaWYoIWlzX2FycmF5KCR2WyduYW1lJ10pKXtpZigkZ3BjKXskdlsnbmFtZSddPXN0cmlwU2xhc2hlcygkdlsnbmFtZSddKTt9aWYoJGVuYyl7JHZbJ25hbWUnXT1wcmVnX3JlcGxhY2UoJG5vbkNoYXJzLCcnLE5TdHJpbmc6OmZpeEVuY29kaW5nKCR2WyduYW1lJ10pKTt9JHZbJ0AnXT1uZXcKTkh0dHBVcGxvYWRlZEZpbGUoJHYpO2NvbnRpbnVlO31mb3JlYWNoKCR2WyduYW1lJ11hcyRrPT4kZm9vKXtpZigkZW5jJiZpc19zdHJpbmcoJGspJiYocHJlZ19tYXRjaCgkbm9uQ2hhcnMsJGspfHxwcmVnX2xhc3RfZXJyb3IoKSkpY29udGludWU7JGxpc3RbXT1hcnJheSgnbmFtZSc9PiR2WyduYW1lJ11bJGtdLCd0eXBlJz0+JHZbJ3R5cGUnXVska10sJ3NpemUnPT4kdlsnc2l6ZSddWyRrXSwndG1wX25hbWUnPT4kdlsndG1wX25hbWUnXVska10sJ2Vycm9yJz0+JHZbJ2Vycm9yJ11bJGtdLCdAJz0+JiR2WydAJ11bJGtdKTt9fWVycm9yX3JlcG9ydGluZygkb2xkKTt9ZnVuY3Rpb24KZ2V0TWV0aG9kKCl7cmV0dXJuCmlzc2V0KCRfU0VSVkVSWydSRVFVRVNUX01FVEhPRCddKT8kX1NFUlZFUlsnUkVRVUVTVF9NRVRIT0QnXTpOVUxMO31mdW5jdGlvbgppc01ldGhvZCgkbWV0aG9kKXtyZXR1cm4KaXNzZXQoJF9TRVJWRVJbJ1JFUVVFU1RfTUVUSE9EJ10pP3N0cmNhc2VjbXAoJF9TRVJWRVJbJ1JFUVVFU1RfTUVUSE9EJ10sJG1ldGhvZCk9PT0wOkZBTFNFO31mdW5jdGlvbgppc1Bvc3QoKXtyZXR1cm4kdGhpcy0+aXNNZXRob2QoJ1BPU1QnKTt9ZmluYWwKZnVuY3Rpb24KZ2V0SGVhZGVyKCRoZWFkZXIsJGRlZmF1bHQ9TlVMTCl7JGhlYWRlcj1zdHJ0b2xvd2VyKCRoZWFkZXIpOyRoZWFkZXJzPSR0aGlzLT5nZXRIZWFkZXJzKCk7aWYoaXNzZXQoJGhlYWRlcnNbJGhlYWRlcl0pKXtyZXR1cm4kaGVhZGVyc1skaGVhZGVyXTt9ZWxzZXtyZXR1cm4kZGVmYXVsdDt9fWZ1bmN0aW9uCmdldEhlYWRlcnMoKXtpZigkdGhpcy0+aGVhZGVycz09PU5VTEwpe2lmKGZ1bmN0aW9uX2V4aXN0cygnYXBhY2hlX3JlcXVlc3RfaGVhZGVycycpKXskdGhpcy0+aGVhZGVycz1hcnJheV9jaGFuZ2Vfa2V5X2Nhc2UoYXBhY2hlX3JlcXVlc3RfaGVhZGVycygpLENBU0VfTE9XRVIpO31lbHNleyR0aGlzLT5oZWFkZXJzPWFycmF5KCk7Zm9yZWFjaCgkX1NFUlZFUgphcyRrPT4kdil7aWYoc3RybmNtcCgkaywnSFRUUF8nLDUpPT0wKXskaz1zdWJzdHIoJGssNSk7fWVsc2VpZihzdHJuY21wKCRrLCdDT05URU5UXycsOCkpe2NvbnRpbnVlO30kdGhpcy0+aGVhZGVyc1tzdHJ0cihzdHJ0b2xvd2VyKCRrKSwnXycsJy0nKV09JHY7fX19cmV0dXJuJHRoaXMtPmhlYWRlcnM7fWZpbmFsCmZ1bmN0aW9uCmdldFJlZmVyZXIoKXskdXJpPXNlbGY6OmdldEhlYWRlcigncmVmZXJlcicpO3JldHVybiR1cmk/bmV3Ck5VcmkoJHVyaSk6TlVMTDt9ZnVuY3Rpb24KaXNTZWN1cmVkKCl7cmV0dXJuCmlzc2V0KCRfU0VSVkVSWydIVFRQUyddKSYmc3RyY2FzZWNtcCgkX1NFUlZFUlsnSFRUUFMnXSwnb2ZmJyk7fWZ1bmN0aW9uCmlzQWpheCgpe3JldHVybiR0aGlzLT5nZXRIZWFkZXIoJ1gtUmVxdWVzdGVkLVdpdGgnKT09PSdYTUxIdHRwUmVxdWVzdCc7fWZ1bmN0aW9uCmdldFJlbW90ZUFkZHJlc3MoKXtyZXR1cm4KaXNzZXQoJF9TRVJWRVJbJ1JFTU9URV9BRERSJ10pPyRfU0VSVkVSWydSRU1PVEVfQUREUiddOk5VTEw7fWZ1bmN0aW9uCmdldFJlbW90ZUhvc3QoKXtpZighaXNzZXQoJF9TRVJWRVJbJ1JFTU9URV9IT1NUJ10pKXtpZighaXNzZXQoJF9TRVJWRVJbJ1JFTU9URV9BRERSJ10pKXtyZXR1cm4KTlVMTDt9JF9TRVJWRVJbJ1JFTU9URV9IT1NUJ109Z2V0SG9zdEJ5QWRkcigkX1NFUlZFUlsnUkVNT1RFX0FERFInXSk7fXJldHVybiRfU0VSVkVSWydSRU1PVEVfSE9TVCddO31mdW5jdGlvbgpkZXRlY3RMYW5ndWFnZShhcnJheSRsYW5ncyl7JGhlYWRlcj0kdGhpcy0+Z2V0SGVhZGVyKCdhY2NlcHQtbGFuZ3VhZ2UnKTtpZighJGhlYWRlcilyZXR1cm4KTlVMTDskcz1zdHJ0b2xvd2VyKCRoZWFkZXIpOyRzPXN0cnRyKCRzLCdfJywnLScpO3Jzb3J0KCRsYW5ncyk7cHJlZ19tYXRjaF9hbGwoJyMoJy5pbXBsb2RlKCd8JywkbGFuZ3MpLicpKD86LVteXHMsOz1dKyk/XHMqKD86O1xzKnE9KFswLTkuXSspKT8jJywkcywkbWF0Y2hlcyk7aWYoISRtYXRjaGVzWzBdKXtyZXR1cm4KTlVMTDt9JG1heD0wOyRsYW5nPU5VTEw7Zm9yZWFjaCgkbWF0Y2hlc1sxXWFzJGtleT0+JHZhbHVlKXskcT0kbWF0Y2hlc1syXVska2V5XT09PScnPzEuMDooZmxvYXQpJG1hdGNoZXNbMl1bJGtleV07aWYoJHE+JG1heCl7JG1heD0kcTskbGFuZz0kdmFsdWU7fX1yZXR1cm4kbGFuZzt9fWZpbmFsCmNsYXNzCk5IdHRwUmVzcG9uc2UKZXh0ZW5kcwpOT2JqZWN0CmltcGxlbWVudHMKSUh0dHBSZXNwb25zZXtwcml2YXRlCnN0YXRpYyRmaXhJRT1UUlVFO3B1YmxpYyRjb29raWVEb21haW49Jyc7cHVibGljJGNvb2tpZVBhdGg9Jy8nO3B1YmxpYyRjb29raWVTZWN1cmU9RkFMU0U7cHJpdmF0ZSRjb2RlPXNlbGY6OlMyMDBfT0s7ZnVuY3Rpb24Kc2V0Q29kZSgkY29kZSl7JGNvZGU9KGludCkkY29kZTtzdGF0aWMkYWxsb3dlZD1hcnJheSgyMDA9PjEsMjAxPT4xLDIwMj0+MSwyMDM9PjEsMjA0PT4xLDIwNT0+MSwyMDY9PjEsMzAwPT4xLDMwMT0+MSwzMDI9PjEsMzAzPT4xLDMwND0+MSwzMDc9PjEsNDAwPT4xLDQwMT0+MSw0MDM9PjEsNDA0PT4xLDQwNj0+MSw0MDg9PjEsNDEwPT4xLDQxMj0+MSw0MTU9PjEsNDE2PT4xLDUwMD0+MSw1MDE9PjEsNTAzPT4xLDUwNT0+MSk7aWYoIWlzc2V0KCRhbGxvd2VkWyRjb2RlXSkpe3Rocm93Cm5ldwpJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIkJhZCBIVFRQIHJlc3BvbnNlICckY29kZScuIik7fWVsc2VpZihoZWFkZXJzX3NlbnQoJGZpbGUsJGxpbmUpKXt0aHJvdwpuZXcKSW52YWxpZFN0YXRlRXhjZXB0aW9uKCJDYW5ub3Qgc2V0IEhUVFAgY29kZSBhZnRlciBIVFRQIGhlYWRlcnMgaGF2ZSBiZWVuIHNlbnQiLigkZmlsZT8iIChvdXRwdXQgc3RhcnRlZCBhdCAkZmlsZTokbGluZSkuIjoiLiIpKTt9ZWxzZXskdGhpcy0+Y29kZT0kY29kZTskcHJvdG9jb2w9aXNzZXQoJF9TRVJWRVJbJ1NFUlZFUl9QUk9UT0NPTCddKT8kX1NFUlZFUlsnU0VSVkVSX1BST1RPQ09MJ106J0hUVFAvMS4xJztoZWFkZXIoJHByb3RvY29sLicgJy4kY29kZSxUUlVFLCRjb2RlKTt9cmV0dXJuJHRoaXM7fWZ1bmN0aW9uCmdldENvZGUoKXtyZXR1cm4kdGhpcy0+Y29kZTt9ZnVuY3Rpb24Kc2V0SGVhZGVyKCRuYW1lLCR2YWx1ZSl7aWYoaGVhZGVyc19zZW50KCRmaWxlLCRsaW5lKSl7dGhyb3cKbmV3CkludmFsaWRTdGF0ZUV4Y2VwdGlvbigiQ2Fubm90IHNlbmQgaGVhZGVyIGFmdGVyIEhUVFAgaGVhZGVycyBoYXZlIGJlZW4gc2VudCIuKCRmaWxlPyIgKG91dHB1dCBzdGFydGVkIGF0ICRmaWxlOiRsaW5lKS4iOiIuIikpO31pZigkdmFsdWU9PT1OVUxMJiZmdW5jdGlvbl9leGlzdHMoJ2hlYWRlcl9yZW1vdmUnKSl7aGVhZGVyX3JlbW92ZSgkbmFtZSk7fWVsc2V7aGVhZGVyKCRuYW1lLic6ICcuJHZhbHVlLFRSVUUsJHRoaXMtPmNvZGUpO31yZXR1cm4kdGhpczt9ZnVuY3Rpb24KYWRkSGVhZGVyKCRuYW1lLCR2YWx1ZSl7aWYoaGVhZGVyc19zZW50KCRmaWxlLCRsaW5lKSl7dGhyb3cKbmV3CkludmFsaWRTdGF0ZUV4Y2VwdGlvbigiQ2Fubm90IHNlbmQgaGVhZGVyIGFmdGVyIEhUVFAgaGVhZGVycyBoYXZlIGJlZW4gc2VudCIuKCRmaWxlPyIgKG91dHB1dCBzdGFydGVkIGF0ICRmaWxlOiRsaW5lKS4iOiIuIikpO31oZWFkZXIoJG5hbWUuJzogJy4kdmFsdWUsRkFMU0UsJHRoaXMtPmNvZGUpO31mdW5jdGlvbgpzZXRDb250ZW50VHlwZSgkdHlwZSwkY2hhcnNldD1OVUxMKXskdGhpcy0+c2V0SGVhZGVyKCdDb250ZW50LVR5cGUnLCR0eXBlLigkY2hhcnNldD8nOyBjaGFyc2V0PScuJGNoYXJzZXQ6JycpKTtyZXR1cm4kdGhpczt9ZnVuY3Rpb24KcmVkaXJlY3QoJHVybCwkY29kZT1zZWxmOjpTMzAyX0ZPVU5EKXtpZihpc3NldCgkX1NFUlZFUlsnU0VSVkVSX1NPRlRXQVJFJ10pJiZwcmVnX21hdGNoKCcjXk1pY3Jvc29mdC1JSVMvWzEtNV0jJywkX1NFUlZFUlsnU0VSVkVSX1NPRlRXQVJFJ10pJiYkdGhpcy0+Z2V0SGVhZGVyKCdTZXQtQ29va2llJykhPT1OVUxMKXskdGhpcy0+c2V0SGVhZGVyKCdSZWZyZXNoJywiMDt1cmw9JHVybCIpO3JldHVybjt9JHRoaXMtPnNldENvZGUoJGNvZGUpOyR0aGlzLT5zZXRIZWFkZXIoJ0xvY2F0aW9uJywkdXJsKTtlY2hvIjxoMT5SZWRpcmVjdDwvaDE+XG5cbjxwPjxhIGhyZWY9XCIiLmh0bWxTcGVjaWFsQ2hhcnMoJHVybCkuIlwiPlBsZWFzZSBjbGljayBoZXJlIHRvIGNvbnRpbnVlPC9hPi48L3A+Ijt9ZnVuY3Rpb24Kc2V0RXhwaXJhdGlvbigkdGltZSl7aWYoISR0aW1lKXskdGhpcy0+c2V0SGVhZGVyKCdDYWNoZS1Db250cm9sJywncy1tYXhhZ2U9MCwgbWF4LWFnZT0wLCBtdXN0LXJldmFsaWRhdGUnKTskdGhpcy0+c2V0SGVhZGVyKCdFeHBpcmVzJywnTW9uLCAyMyBKYW4gMTk3OCAxMDowMDowMCBHTVQnKTtyZXR1cm4kdGhpczt9JHRpbWU9TlRvb2xzOjpjcmVhdGVEYXRlVGltZSgkdGltZSk7JHRoaXMtPnNldEhlYWRlcignQ2FjaGUtQ29udHJvbCcsJ21heC1hZ2U9Jy4oJHRpbWUtPmZvcm1hdCgnVScpLXRpbWUoKSkpOyR0aGlzLT5zZXRIZWFkZXIoJ0V4cGlyZXMnLHNlbGY6OmRhdGUoJHRpbWUpKTtyZXR1cm4kdGhpczt9ZnVuY3Rpb24KZXhwaXJlKCRzZWNvbmRzKXt0cmlnZ2VyX2Vycm9yKF9fTUVUSE9EX18uJygpIGlzIGRlcHJlY2F0ZWQ7IHVzZSBzZXRFeHBpcmF0aW9uKCkgaW5zdGVhZC4nLEVfVVNFUl9XQVJOSU5HKTskdGhpcy0+c2V0RXhwaXJhdGlvbigkc2Vjb25kcyk7fWZ1bmN0aW9uCmlzU2VudCgpe3JldHVybgpoZWFkZXJzX3NlbnQoKTt9ZnVuY3Rpb24KZ2V0SGVhZGVyKCRoZWFkZXIsJGRlZmF1bHQ9TlVMTCl7JGhlYWRlci49JzonOyRsZW49c3RybGVuKCRoZWFkZXIpO2ZvcmVhY2goaGVhZGVyc19saXN0KClhcyRpdGVtKXtpZihzdHJuY2FzZWNtcCgkaXRlbSwkaGVhZGVyLCRsZW4pPT09MCl7cmV0dXJuCmx0cmltKHN1YnN0cigkaXRlbSwkbGVuKSk7fX1yZXR1cm4kZGVmYXVsdDt9ZnVuY3Rpb24KZ2V0SGVhZGVycygpeyRoZWFkZXJzPWFycmF5KCk7Zm9yZWFjaChoZWFkZXJzX2xpc3QoKWFzJGhlYWRlcil7JGE9c3RycG9zKCRoZWFkZXIsJzonKTskaGVhZGVyc1tzdWJzdHIoJGhlYWRlciwwLCRhKV09KHN0cmluZylzdWJzdHIoJGhlYWRlciwkYSsyKTt9cmV0dXJuJGhlYWRlcnM7fXN0YXRpYwpmdW5jdGlvbgpkYXRlKCR0aW1lPU5VTEwpeyR0aW1lPU5Ub29sczo6Y3JlYXRlRGF0ZVRpbWUoJHRpbWUpOyR0aW1lLT5zZXRUaW1lem9uZShuZXcKRGF0ZVRpbWVab25lKCdHTVQnKSk7cmV0dXJuJHRpbWUtPmZvcm1hdCgnRCwgZCBNIFkgSDppOnMgXEdcTVxUJyk7fWZ1bmN0aW9uCmVuYWJsZUNvbXByZXNzaW9uKCl7aWYoaGVhZGVyc19zZW50KCkpe3JldHVybgpGQUxTRTt9aWYoJHRoaXMtPmdldEhlYWRlcignQ29udGVudC1FbmNvZGluZycpIT09TlVMTCl7cmV0dXJuCkZBTFNFO30kb2s9b2JfZ3poYW5kbGVyKCcnLFBIUF9PVVRQVVRfSEFORExFUl9TVEFSVCk7aWYoJG9rPT09RkFMU0Upe3JldHVybgpGQUxTRTt9aWYoZnVuY3Rpb25fZXhpc3RzKCdpbmlfc2V0Jykpe2luaV9zZXQoJ3psaWIub3V0cHV0X2NvbXByZXNzaW9uJywnT2ZmJyk7aW5pX3NldCgnemxpYi5vdXRwdXRfY29tcHJlc3Npb25fbGV2ZWwnLCc2Jyk7fW9iX3N0YXJ0KCdvYl9nemhhbmRsZXInLDEpO3JldHVybgpUUlVFO31mdW5jdGlvbgpfX2Rlc3RydWN0KCl7aWYoc2VsZjo6JGZpeElFKXtpZighaXNzZXQoJF9TRVJWRVJbJ0hUVFBfVVNFUl9BR0VOVCddKXx8c3RycG9zKCRfU0VSVkVSWydIVFRQX1VTRVJfQUdFTlQnXSwnTVNJRSAnKT09PUZBTFNFKXJldHVybjtpZighaW5fYXJyYXkoJHRoaXMtPmNvZGUsYXJyYXkoNDAwLDQwMyw0MDQsNDA1LDQwNiw0MDgsNDA5LDQxMCw1MDAsNTAxLDUwNSksVFJVRSkpcmV0dXJuO2lmKCR0aGlzLT5nZXRIZWFkZXIoJ0NvbnRlbnQtVHlwZScsJ3RleHQvaHRtbCcpIT09J3RleHQvaHRtbCcpcmV0dXJuOyRzPSIgXHRcclxuIjtmb3IoJGk9MmUzOyRpOyRpLS0pZWNobyRze3JhbmQoMCwzKX07c2VsZjo6JGZpeElFPUZBTFNFO319ZnVuY3Rpb24Kc2V0Q29va2llKCRuYW1lLCR2YWx1ZSwkdGltZSwkcGF0aD1OVUxMLCRkb21haW49TlVMTCwkc2VjdXJlPU5VTEwpe2lmKGhlYWRlcnNfc2VudCgkZmlsZSwkbGluZSkpe3Rocm93Cm5ldwpJbnZhbGlkU3RhdGVFeGNlcHRpb24oIkNhbm5vdCBzZXQgY29va2llIGFmdGVyIEhUVFAgaGVhZGVycyBoYXZlIGJlZW4gc2VudCIuKCRmaWxlPyIgKG91dHB1dCBzdGFydGVkIGF0ICRmaWxlOiRsaW5lKS4iOiIuIikpO31zZXRjb29raWUoJG5hbWUsJHZhbHVlLCR0aW1lP05Ub29sczo6Y3JlYXRlRGF0ZVRpbWUoJHRpbWUpLT5mb3JtYXQoJ1UnKTowLCRwYXRoPT09TlVMTD8kdGhpcy0+Y29va2llUGF0aDooc3RyaW5nKSRwYXRoLCRkb21haW49PT1OVUxMPyR0aGlzLT5jb29raWVEb21haW46KHN0cmluZykkZG9tYWluLCRzZWN1cmU9PT1OVUxMPyR0aGlzLT5jb29raWVTZWN1cmU6KGJvb2wpJHNlY3VyZSxUUlVFKTtyZXR1cm4kdGhpczt9ZnVuY3Rpb24KZGVsZXRlQ29va2llKCRuYW1lLCRwYXRoPU5VTEwsJGRvbWFpbj1OVUxMLCRzZWN1cmU9TlVMTCl7aWYoaGVhZGVyc19zZW50KCRmaWxlLCRsaW5lKSl7dGhyb3cKbmV3CkludmFsaWRTdGF0ZUV4Y2VwdGlvbigiQ2Fubm90IGRlbGV0ZSBjb29raWUgYWZ0ZXIgSFRUUCBoZWFkZXJzIGhhdmUgYmVlbiBzZW50Ii4oJGZpbGU/IiAob3V0cHV0IHN0YXJ0ZWQgYXQgJGZpbGU6JGxpbmUpLiI6Ii4iKSk7fXNldGNvb2tpZSgkbmFtZSxGQUxTRSwyNTQ0MDAwMDAsJHBhdGg9PT1OVUxMPyR0aGlzLT5jb29raWVQYXRoOihzdHJpbmcpJHBhdGgsJGRvbWFpbj09PU5VTEw/JHRoaXMtPmNvb2tpZURvbWFpbjooc3RyaW5nKSRkb21haW4sJHNlY3VyZT09PU5VTEw/JHRoaXMtPmNvb2tpZVNlY3VyZTooYm9vbCkkc2VjdXJlLFRSVUUpO319Y2xhc3MKTkh0dHBVcGxvYWRlZEZpbGUKZXh0ZW5kcwpOT2JqZWN0e3ByaXZhdGUkbmFtZTtwcml2YXRlJHR5cGU7cHJpdmF0ZSRzaXplO3ByaXZhdGUkdG1wTmFtZTtwcml2YXRlJGVycm9yO2Z1bmN0aW9uCl9fY29uc3RydWN0KCR2YWx1ZSl7Zm9yZWFjaChhcnJheSgnbmFtZScsJ3R5cGUnLCdzaXplJywndG1wX25hbWUnLCdlcnJvcicpYXMka2V5KXtpZighaXNzZXQoJHZhbHVlWyRrZXldKXx8IWlzX3NjYWxhcigkdmFsdWVbJGtleV0pKXskdGhpcy0+ZXJyb3I9VVBMT0FEX0VSUl9OT19GSUxFO3JldHVybjt9fSR0aGlzLT5uYW1lPSR2YWx1ZVsnbmFtZSddOyR0aGlzLT5zaXplPSR2YWx1ZVsnc2l6ZSddOyR0aGlzLT50bXBOYW1lPSR2YWx1ZVsndG1wX25hbWUnXTskdGhpcy0+ZXJyb3I9JHZhbHVlWydlcnJvciddO31mdW5jdGlvbgpnZXROYW1lKCl7cmV0dXJuJHRoaXMtPm5hbWU7fWZ1bmN0aW9uCmdldENvbnRlbnRUeXBlKCl7aWYoJHRoaXMtPmlzT2soKSYmJHRoaXMtPnR5cGU9PT1OVUxMKXskaW5mbz1nZXRpbWFnZXNpemUoJHRoaXMtPnRtcE5hbWUpO2lmKGlzc2V0KCRpbmZvWydtaW1lJ10pKXskdGhpcy0+dHlwZT0kaW5mb1snbWltZSddO31lbHNlaWYoZXh0ZW5zaW9uX2xvYWRlZCgnZmlsZWluZm8nKSl7JHRoaXMtPnR5cGU9ZmluZm9fZmlsZShmaW5mb19vcGVuKEZJTEVJTkZPX01JTUUpLCR0aGlzLT50bXBOYW1lKTt9ZWxzZWlmKGZ1bmN0aW9uX2V4aXN0cygnbWltZV9jb250ZW50X3R5cGUnKSl7JHRoaXMtPnR5cGU9bWltZV9jb250ZW50X3R5cGUoJHRoaXMtPnRtcE5hbWUpO31pZighJHRoaXMtPnR5cGUpeyR0aGlzLT50eXBlPSdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nO31lbHNleyR0aGlzLT50eXBlPXByZWdfcmVwbGFjZSgnI1tccztdLiokIycsJycsJHRoaXMtPnR5cGUpO319cmV0dXJuJHRoaXMtPnR5cGU7fWZ1bmN0aW9uCmdldFNpemUoKXtyZXR1cm4kdGhpcy0+c2l6ZTt9ZnVuY3Rpb24KZ2V0VGVtcG9yYXJ5RmlsZSgpe3JldHVybiR0aGlzLT50bXBOYW1lO31mdW5jdGlvbgpfX3RvU3RyaW5nKCl7cmV0dXJuJHRoaXMtPnRtcE5hbWU7fWZ1bmN0aW9uCmdldEVycm9yKCl7cmV0dXJuJHRoaXMtPmVycm9yO31mdW5jdGlvbgppc09rKCl7cmV0dXJuJHRoaXMtPmVycm9yPT09VVBMT0FEX0VSUl9PSzt9ZnVuY3Rpb24KbW92ZSgkZGVzdCl7JGRpcj1kaXJuYW1lKCRkZXN0KTtpZihAbWtkaXIoJGRpciwwNzU1LFRSVUUpKXtjaG1vZCgkZGlyLDA3NTUpO30kZnVuYz1pc191cGxvYWRlZF9maWxlKCR0aGlzLT50bXBOYW1lKT8nbW92ZV91cGxvYWRlZF9maWxlJzoncmVuYW1lJztpZighJGZ1bmMoJHRoaXMtPnRtcE5hbWUsJGRlc3QpKXt0aHJvdwpuZXcKSW52YWxpZFN0YXRlRXhjZXB0aW9uKCJVbmFibGUgdG8gbW92ZSB1cGxvYWRlZCBmaWxlICckdGhpcy0+dG1wTmFtZScgdG8gJyRkZXN0Jy4iKTt9Y2htb2QoJGRlc3QsMDY0NCk7JHRoaXMtPnRtcE5hbWU9JGRlc3Q7cmV0dXJuJHRoaXM7fWZ1bmN0aW9uCmlzSW1hZ2UoKXtyZXR1cm4KaW5fYXJyYXkoJHRoaXMtPmdldENvbnRlbnRUeXBlKCksYXJyYXkoJ2ltYWdlL2dpZicsJ2ltYWdlL3BuZycsJ2ltYWdlL2pwZWcnKSxUUlVFKTt9ZnVuY3Rpb24KZ2V0SW1hZ2UoKXtyZXR1cm4KTkltYWdlOjpmcm9tRmlsZSgkdGhpcy0+dG1wTmFtZSk7fWZ1bmN0aW9uCmdldEltYWdlU2l6ZSgpe3JldHVybiR0aGlzLT5pc09rKCk/Z2V0aW1hZ2VzaXplKCR0aGlzLT50bXBOYW1lKTpOVUxMO319Y2xhc3MKTlNlc3Npb24KZXh0ZW5kcwpOT2JqZWN0e2NvbnN0CkRFRkFVTFRfRklMRV9MSUZFVElNRT0xMDgwMDtwdWJsaWMkdmVyaWZpY2F0aW9uS2V5R2VuZXJhdG9yO3ByaXZhdGUkcmVnZW5lcmF0aW9uTmVlZGVkO3ByaXZhdGUKc3RhdGljJHN0YXJ0ZWQ7cHJpdmF0ZSRvcHRpb25zPWFycmF5KCdyZWZlcmVyX2NoZWNrJz0+JycsJ3VzZV9jb29raWVzJz0+MSwndXNlX29ubHlfY29va2llcyc9PjEsJ3VzZV90cmFuc19zaWQnPT4wLCdjb29raWVfbGlmZXRpbWUnPT4wLCdjb29raWVfcGF0aCc9PicvJywnY29va2llX2RvbWFpbic9PicnLCdjb29raWVfc2VjdXJlJz0+RkFMU0UsJ2Nvb2tpZV9odHRwb25seSc9PlRSVUUsJ2djX21heGxpZmV0aW1lJz0+c2VsZjo6REVGQVVMVF9GSUxFX0xJRkVUSU1FLCdjYWNoZV9saW1pdGVyJz0+TlVMTCwnY2FjaGVfZXhwaXJlJz0+TlVMTCwnaGFzaF9mdW5jdGlvbic9Pk5VTEwsJ2hhc2hfYml0c19wZXJfY2hhcmFjdGVyJz0+TlVMTCk7ZnVuY3Rpb24Kc3RhcnQoKXtpZihzZWxmOjokc3RhcnRlZCl7dGhyb3cKbmV3CkludmFsaWRTdGF0ZUV4Y2VwdGlvbignU2Vzc2lvbiBoYXMgYWxyZWFkeSBiZWVuIHN0YXJ0ZWQuJyk7fWVsc2VpZihzZWxmOjokc3RhcnRlZD09PU5VTEwmJmRlZmluZWQoJ1NJRCcpKXt0aHJvdwpuZXcKSW52YWxpZFN0YXRlRXhjZXB0aW9uKCdBIHNlc3Npb24gaGFkIGFscmVhZHkgYmVlbiBzdGFydGVkIGJ5IHNlc3Npb24uYXV0by1zdGFydCBvciBzZXNzaW9uX3N0YXJ0KCkuJyk7fXRyeXskdGhpcy0+Y29uZmlndXJlKCR0aGlzLT5vcHRpb25zKTt9Y2F0Y2goTm90U3VwcG9ydGVkRXhjZXB0aW9uJGUpe31OVG9vbHM6OnRyeUVycm9yKCk7c2Vzc2lvbl9zdGFydCgpO2lmKE5Ub29sczo6Y2F0Y2hFcnJvcigkbXNnKSl7QHNlc3Npb25fd3JpdGVfY2xvc2UoKTt0aHJvdwpuZXcKSW52YWxpZFN0YXRlRXhjZXB0aW9uKCRtc2cpO31zZWxmOjokc3RhcnRlZD1UUlVFO2lmKCR0aGlzLT5yZWdlbmVyYXRpb25OZWVkZWQpe3Nlc3Npb25fcmVnZW5lcmF0ZV9pZChUUlVFKTskdGhpcy0+cmVnZW5lcmF0aW9uTmVlZGVkPUZBTFNFO311bnNldCgkX1NFU1NJT05bJ19fTlQnXSwkX1NFU1NJT05bJ19fTlMnXSwkX1NFU1NJT05bJ19fTk0nXSk7JG5mPSYkX1NFU1NJT05bJ19fTkYnXTtpZihlbXB0eSgkbmYpKXskbmY9YXJyYXkoJ0MnPT4wKTt9ZWxzZXskbmZbJ0MnXSsrO30kYnJvd3NlcktleT0kdGhpcy0+Z2V0SHR0cFJlcXVlc3QoKS0+Z2V0Q29va2llKCduZXR0ZS1icm93c2VyJyk7aWYoISRicm93c2VyS2V5KXskYnJvd3NlcktleT0oc3RyaW5nKWxjZ192YWx1ZSgpO30kYnJvd3NlckNsb3NlZD0haXNzZXQoJG5mWydCJ10pfHwkbmZbJ0InXSE9PSRicm93c2VyS2V5OyRuZlsnQiddPSRicm93c2VyS2V5OyR0aGlzLT5zZW5kQ29va2llKCk7aWYoaXNzZXQoJG5mWydNRVRBJ10pKXskbm93PXRpbWUoKTtmb3JlYWNoKCRuZlsnTUVUQSddYXMkbmFtZXNwYWNlPT4kbWV0YWRhdGEpe2lmKGlzX2FycmF5KCRtZXRhZGF0YSkpe2ZvcmVhY2goJG1ldGFkYXRhCmFzJHZhcmlhYmxlPT4kdmFsdWUpe2lmKCghZW1wdHkoJHZhbHVlWydCJ10pJiYkYnJvd3NlckNsb3NlZCl8fCghZW1wdHkoJHZhbHVlWydUJ10pJiYkbm93PiR2YWx1ZVsnVCddKXx8KCR2YXJpYWJsZSE9PScnJiZpc19vYmplY3QoJG5mWydEQVRBJ11bJG5hbWVzcGFjZV1bJHZhcmlhYmxlXSkmJihpc3NldCgkdmFsdWVbJ1YnXSk/JHZhbHVlWydWJ106TlVMTCkhPT1OQ2xhc3NSZWZsZWN0aW9uOjpmcm9tKCRuZlsnREFUQSddWyRuYW1lc3BhY2VdWyR2YXJpYWJsZV0pLT5nZXRBbm5vdGF0aW9uKCdzZXJpYWxpemF0aW9uVmVyc2lvbicpKSl7aWYoJHZhcmlhYmxlPT09Jycpe3Vuc2V0KCRuZlsnTUVUQSddWyRuYW1lc3BhY2VdLCRuZlsnREFUQSddWyRuYW1lc3BhY2VdKTtjb250aW51ZQoyO311bnNldCgkbmZbJ01FVEEnXVskbmFtZXNwYWNlXVskdmFyaWFibGVdLCRuZlsnREFUQSddWyRuYW1lc3BhY2VdWyR2YXJpYWJsZV0pO319fX19cmVnaXN0ZXJfc2h1dGRvd25fZnVuY3Rpb24oYXJyYXkoJHRoaXMsJ2NsZWFuJykpO31mdW5jdGlvbgppc1N0YXJ0ZWQoKXtyZXR1cm4oYm9vbClzZWxmOjokc3RhcnRlZDt9ZnVuY3Rpb24KY2xvc2UoKXtpZihzZWxmOjokc3RhcnRlZCl7JHRoaXMtPmNsZWFuKCk7c2Vzc2lvbl93cml0ZV9jbG9zZSgpO3NlbGY6OiRzdGFydGVkPUZBTFNFO319ZnVuY3Rpb24KZGVzdHJveSgpe2lmKCFzZWxmOjokc3RhcnRlZCl7dGhyb3cKbmV3CkludmFsaWRTdGF0ZUV4Y2VwdGlvbignU2Vzc2lvbiBpcyBub3Qgc3RhcnRlZC4nKTt9c2Vzc2lvbl9kZXN0cm95KCk7JF9TRVNTSU9OPU5VTEw7c2VsZjo6JHN0YXJ0ZWQ9RkFMU0U7aWYoISR0aGlzLT5nZXRIdHRwUmVzcG9uc2UoKS0+aXNTZW50KCkpeyRwYXJhbXM9c2Vzc2lvbl9nZXRfY29va2llX3BhcmFtcygpOyR0aGlzLT5nZXRIdHRwUmVzcG9uc2UoKS0+ZGVsZXRlQ29va2llKHNlc3Npb25fbmFtZSgpLCRwYXJhbXNbJ3BhdGgnXSwkcGFyYW1zWydkb21haW4nXSwkcGFyYW1zWydzZWN1cmUnXSk7fX1mdW5jdGlvbgpleGlzdHMoKXtyZXR1cm4Kc2VsZjo6JHN0YXJ0ZWR8fCR0aGlzLT5nZXRIdHRwUmVxdWVzdCgpLT5nZXRDb29raWUoc2Vzc2lvbl9uYW1lKCkpIT09TlVMTDt9ZnVuY3Rpb24KcmVnZW5lcmF0ZUlkKCl7aWYoc2VsZjo6JHN0YXJ0ZWQpe2lmKGhlYWRlcnNfc2VudCgkZmlsZSwkbGluZSkpe3Rocm93Cm5ldwpJbnZhbGlkU3RhdGVFeGNlcHRpb24oIkNhbm5vdCByZWdlbmVyYXRlIHNlc3Npb24gSUQgYWZ0ZXIgSFRUUCBoZWFkZXJzIGhhdmUgYmVlbiBzZW50Ii4oJGZpbGU/IiAob3V0cHV0IHN0YXJ0ZWQgYXQgJGZpbGU6JGxpbmUpLiI6Ii4iKSk7fXNlc3Npb25fcmVnZW5lcmF0ZV9pZChUUlVFKTt9ZWxzZXskdGhpcy0+cmVnZW5lcmF0aW9uTmVlZGVkPVRSVUU7fX1mdW5jdGlvbgpnZXRJZCgpe3JldHVybgpzZXNzaW9uX2lkKCk7fWZ1bmN0aW9uCnNldE5hbWUoJG5hbWUpe2lmKCFpc19zdHJpbmcoJG5hbWUpfHwhcHJlZ19tYXRjaCgnI1teMC05Ll1bXi5dKiQjQScsJG5hbWUpKXt0aHJvdwpuZXcKSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdTZXNzaW9uIG5hbWUgbXVzdCBiZSBhIHN0cmluZyBhbmQgY2Fubm90IGNvbnRhaW4gZG90LicpO31zZXNzaW9uX25hbWUoJG5hbWUpO3JldHVybiR0aGlzLT5zZXRPcHRpb25zKGFycmF5KCduYW1lJz0+JG5hbWUpKTt9ZnVuY3Rpb24KZ2V0TmFtZSgpe3JldHVybgpzZXNzaW9uX25hbWUoKTt9ZnVuY3Rpb24KZ2V0TmFtZXNwYWNlKCRuYW1lc3BhY2UsJGNsYXNzPSdOU2Vzc2lvbk5hbWVzcGFjZScpe2lmKCFpc19zdHJpbmcoJG5hbWVzcGFjZSl8fCRuYW1lc3BhY2U9PT0nJyl7dGhyb3cKbmV3CkludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignU2Vzc2lvbiBuYW1lc3BhY2UgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcuJyk7fWlmKCFzZWxmOjokc3RhcnRlZCl7JHRoaXMtPnN0YXJ0KCk7fXJldHVybgpuZXckY2xhc3MoJF9TRVNTSU9OWydfX05GJ11bJ0RBVEEnXVskbmFtZXNwYWNlXSwkX1NFU1NJT05bJ19fTkYnXVsnTUVUQSddWyRuYW1lc3BhY2VdKTt9ZnVuY3Rpb24KaGFzTmFtZXNwYWNlKCRuYW1lc3BhY2Upe2lmKCR0aGlzLT5leGlzdHMoKSYmIXNlbGY6OiRzdGFydGVkKXskdGhpcy0+c3RhcnQoKTt9cmV0dXJuIWVtcHR5KCRfU0VTU0lPTlsnX19ORiddWydEQVRBJ11bJG5hbWVzcGFjZV0pO31mdW5jdGlvbgpnZXRJdGVyYXRvcigpe2lmKCR0aGlzLT5leGlzdHMoKSYmIXNlbGY6OiRzdGFydGVkKXskdGhpcy0+c3RhcnQoKTt9aWYoaXNzZXQoJF9TRVNTSU9OWydfX05GJ11bJ0RBVEEnXSkpe3JldHVybgpuZXcKQXJyYXlJdGVyYXRvcihhcnJheV9rZXlzKCRfU0VTU0lPTlsnX19ORiddWydEQVRBJ10pKTt9ZWxzZXtyZXR1cm4KbmV3CkFycmF5SXRlcmF0b3I7fX1mdW5jdGlvbgpjbGVhbigpe2lmKCFzZWxmOjokc3RhcnRlZHx8ZW1wdHkoJF9TRVNTSU9OKSl7cmV0dXJuO30kbmY9JiRfU0VTU0lPTlsnX19ORiddO2lmKGlzc2V0KCRuZlsnTUVUQSddKSYmaXNfYXJyYXkoJG5mWydNRVRBJ10pKXtmb3JlYWNoKCRuZlsnTUVUQSddYXMkbmFtZT0+JGZvbyl7aWYoZW1wdHkoJG5mWydNRVRBJ11bJG5hbWVdKSl7dW5zZXQoJG5mWydNRVRBJ11bJG5hbWVdKTt9fX1pZihlbXB0eSgkbmZbJ01FVEEnXSkpe3Vuc2V0KCRuZlsnTUVUQSddKTt9aWYoZW1wdHkoJG5mWydEQVRBJ10pKXt1bnNldCgkbmZbJ0RBVEEnXSk7fWlmKGVtcHR5KCRfU0VTU0lPTikpe319ZnVuY3Rpb24Kc2V0T3B0aW9ucyhhcnJheSRvcHRpb25zKXtpZihzZWxmOjokc3RhcnRlZCl7JHRoaXMtPmNvbmZpZ3VyZSgkb3B0aW9ucyk7fSR0aGlzLT5vcHRpb25zPSRvcHRpb25zKyR0aGlzLT5vcHRpb25zO3JldHVybiR0aGlzO31mdW5jdGlvbgpnZXRPcHRpb25zKCl7cmV0dXJuJHRoaXMtPm9wdGlvbnM7fXByaXZhdGUKZnVuY3Rpb24KY29uZmlndXJlKGFycmF5JGNvbmZpZyl7JHNwZWNpYWw9YXJyYXkoJ2NhY2hlX2V4cGlyZSc9PjEsJ2NhY2hlX2xpbWl0ZXInPT4xLCdzYXZlX3BhdGgnPT4xLCduYW1lJz0+MSk7Zm9yZWFjaCgkY29uZmlnCmFzJGtleT0+JHZhbHVlKXtpZighc3RybmNtcCgka2V5LCdzZXNzaW9uLicsOCkpeyRrZXk9c3Vic3RyKCRrZXksOCk7fWlmKCR2YWx1ZT09PU5VTEwpe2NvbnRpbnVlO31lbHNlaWYoaXNzZXQoJHNwZWNpYWxbJGtleV0pKXtpZihzZWxmOjokc3RhcnRlZCl7dGhyb3cKbmV3CkludmFsaWRTdGF0ZUV4Y2VwdGlvbigiVW5hYmxlIHRvIHNldCAnJGtleScgd2hlbiBzZXNzaW9uIGhhcyBiZWVuIHN0YXJ0ZWQuIik7fSRrZXk9InNlc3Npb25fJGtleSI7JGtleSgkdmFsdWUpO31lbHNlaWYoc3RybmNtcCgka2V5LCdjb29raWVfJyw3KT09PTApe2lmKCFpc3NldCgkY29va2llKSl7JGNvb2tpZT1zZXNzaW9uX2dldF9jb29raWVfcGFyYW1zKCk7fSRjb29raWVbc3Vic3RyKCRrZXksNyldPSR2YWx1ZTt9ZWxzZWlmKCFmdW5jdGlvbl9leGlzdHMoJ2luaV9zZXQnKSl7aWYoaW5pX2dldCgka2V5KSE9JHZhbHVlKXt0aHJvdwpuZXcKTm90U3VwcG9ydGVkRXhjZXB0aW9uKCdSZXF1aXJlZCBmdW5jdGlvbiBpbmlfc2V0KCkgaXMgZGlzYWJsZWQuJyk7fX1lbHNle2lmKHNlbGY6OiRzdGFydGVkKXt0aHJvdwpuZXcKSW52YWxpZFN0YXRlRXhjZXB0aW9uKCJVbmFibGUgdG8gc2V0ICcka2V5JyB3aGVuIHNlc3Npb24gaGFzIGJlZW4gc3RhcnRlZC4iKTt9aW5pX3NldCgic2Vzc2lvbi4ka2V5IiwkdmFsdWUpO319aWYoaXNzZXQoJGNvb2tpZSkpe3Nlc3Npb25fc2V0X2Nvb2tpZV9wYXJhbXMoJGNvb2tpZVsnbGlmZXRpbWUnXSwkY29va2llWydwYXRoJ10sJGNvb2tpZVsnZG9tYWluJ10sJGNvb2tpZVsnc2VjdXJlJ10sJGNvb2tpZVsnaHR0cG9ubHknXSk7aWYoc2VsZjo6JHN0YXJ0ZWQpeyR0aGlzLT5zZW5kQ29va2llKCk7fX19ZnVuY3Rpb24Kc2V0RXhwaXJhdGlvbigkdGltZSl7aWYoZW1wdHkoJHRpbWUpKXtyZXR1cm4kdGhpcy0+c2V0T3B0aW9ucyhhcnJheSgnZ2NfbWF4bGlmZXRpbWUnPT5zZWxmOjpERUZBVUxUX0ZJTEVfTElGRVRJTUUsJ2Nvb2tpZV9saWZldGltZSc9PjApKTt9ZWxzZXskdGltZT1OVG9vbHM6OmNyZWF0ZURhdGVUaW1lKCR0aW1lKS0+Zm9ybWF0KCdVJyk7cmV0dXJuJHRoaXMtPnNldE9wdGlvbnMoYXJyYXkoJ2djX21heGxpZmV0aW1lJz0+JHRpbWUsJ2Nvb2tpZV9saWZldGltZSc9PiR0aW1lKSk7fX1mdW5jdGlvbgpzZXRDb29raWVQYXJhbXMoJHBhdGgsJGRvbWFpbj1OVUxMLCRzZWN1cmU9TlVMTCl7cmV0dXJuJHRoaXMtPnNldE9wdGlvbnMoYXJyYXkoJ2Nvb2tpZV9wYXRoJz0+JHBhdGgsJ2Nvb2tpZV9kb21haW4nPT4kZG9tYWluLCdjb29raWVfc2VjdXJlJz0+JHNlY3VyZSkpO31mdW5jdGlvbgpnZXRDb29raWVQYXJhbXMoKXtyZXR1cm4Kc2Vzc2lvbl9nZXRfY29va2llX3BhcmFtcygpO31mdW5jdGlvbgpzZXRTYXZlUGF0aCgkcGF0aCl7cmV0dXJuJHRoaXMtPnNldE9wdGlvbnMoYXJyYXkoJ3NhdmVfcGF0aCc9PiRwYXRoKSk7fXByaXZhdGUKZnVuY3Rpb24Kc2VuZENvb2tpZSgpeyRjb29raWU9JHRoaXMtPmdldENvb2tpZVBhcmFtcygpOyR0aGlzLT5nZXRIdHRwUmVzcG9uc2UoKS0+c2V0Q29va2llKHNlc3Npb25fbmFtZSgpLHNlc3Npb25faWQoKSwkY29va2llWydsaWZldGltZSddLCRjb29raWVbJ3BhdGgnXSwkY29va2llWydkb21haW4nXSwkY29va2llWydzZWN1cmUnXSwkY29va2llWydodHRwb25seSddKTskdGhpcy0+Z2V0SHR0cFJlc3BvbnNlKCktPnNldENvb2tpZSgnbmV0dGUtYnJvd3NlcicsJF9TRVNTSU9OWydfX05GJ11bJ0InXSxOSHR0cFJlc3BvbnNlOjpCUk9XU0VSLCRjb29raWVbJ3BhdGgnXSwkY29va2llWydkb21haW4nXSwkY29va2llWydzZWN1cmUnXSwkY29va2llWydodHRwb25seSddKTt9cHJvdGVjdGVkCmZ1bmN0aW9uCmdldEh0dHBSZXF1ZXN0KCl7cmV0dXJuCk5FbnZpcm9ubWVudDo6Z2V0SHR0cFJlcXVlc3QoKTt9cHJvdGVjdGVkCmZ1bmN0aW9uCmdldEh0dHBSZXNwb25zZSgpe3JldHVybgpORW52aXJvbm1lbnQ6OmdldEh0dHBSZXNwb25zZSgpO319ZmluYWwKY2xhc3MKTlNlc3Npb25OYW1lc3BhY2UKZXh0ZW5kcwpOT2JqZWN0CmltcGxlbWVudHMKSXRlcmF0b3JBZ2dyZWdhdGUsQXJyYXlBY2Nlc3N7cHJpdmF0ZSRkYXRhO3ByaXZhdGUkbWV0YTtwdWJsaWMkd2Fybk9uVW5kZWZpbmVkPUZBTFNFO2Z1bmN0aW9uCl9fY29uc3RydWN0KCYkZGF0YSwmJG1ldGEpeyR0aGlzLT5kYXRhPSYkZGF0YTskdGhpcy0+bWV0YT0mJG1ldGE7fWZ1bmN0aW9uCmdldEl0ZXJhdG9yKCl7aWYoaXNzZXQoJHRoaXMtPmRhdGEpKXtyZXR1cm4KbmV3CkFycmF5SXRlcmF0b3IoJHRoaXMtPmRhdGEpO31lbHNle3JldHVybgpuZXcKQXJyYXlJdGVyYXRvcjt9fWZ1bmN0aW9uCl9fc2V0KCRuYW1lLCR2YWx1ZSl7JHRoaXMtPmRhdGFbJG5hbWVdPSR2YWx1ZTtpZihpc19vYmplY3QoJHZhbHVlKSl7JHRoaXMtPm1ldGFbJG5hbWVdWydWJ109TkNsYXNzUmVmbGVjdGlvbjo6ZnJvbSgkdmFsdWUpLT5nZXRBbm5vdGF0aW9uKCdzZXJpYWxpemF0aW9uVmVyc2lvbicpO319ZnVuY3Rpb24mX19nZXQoJG5hbWUpe2lmKCR0aGlzLT53YXJuT25VbmRlZmluZWQmJiFhcnJheV9rZXlfZXhpc3RzKCRuYW1lLCR0aGlzLT5kYXRhKSl7dHJpZ2dlcl9lcnJvcigiVGhlIHZhcmlhYmxlICckbmFtZScgZG9lcyBub3QgZXhpc3QgaW4gc2Vzc2lvbiBuYW1lc3BhY2UiLEVfVVNFUl9OT1RJQ0UpO31yZXR1cm4kdGhpcy0+ZGF0YVskbmFtZV07fWZ1bmN0aW9uCl9faXNzZXQoJG5hbWUpe3JldHVybgppc3NldCgkdGhpcy0+ZGF0YVskbmFtZV0pO31mdW5jdGlvbgpfX3Vuc2V0KCRuYW1lKXt1bnNldCgkdGhpcy0+ZGF0YVskbmFtZV0sJHRoaXMtPm1ldGFbJG5hbWVdKTt9ZnVuY3Rpb24Kb2Zmc2V0U2V0KCRuYW1lLCR2YWx1ZSl7JHRoaXMtPl9fc2V0KCRuYW1lLCR2YWx1ZSk7fWZ1bmN0aW9uCm9mZnNldEdldCgkbmFtZSl7cmV0dXJuJHRoaXMtPl9fZ2V0KCRuYW1lKTt9ZnVuY3Rpb24Kb2Zmc2V0RXhpc3RzKCRuYW1lKXtyZXR1cm4kdGhpcy0+X19pc3NldCgkbmFtZSk7fWZ1bmN0aW9uCm9mZnNldFVuc2V0KCRuYW1lKXskdGhpcy0+X191bnNldCgkbmFtZSk7fWZ1bmN0aW9uCnNldEV4cGlyYXRpb24oJHRpbWUsJHZhcmlhYmxlcz1OVUxMKXtpZihlbXB0eSgkdGltZSkpeyR0aW1lPU5VTEw7JHdoZW5Ccm93c2VySXNDbG9zZWQ9VFJVRTt9ZWxzZXskdGltZT1OVG9vbHM6OmNyZWF0ZURhdGVUaW1lKCR0aW1lKS0+Zm9ybWF0KCdVJyk7JHdoZW5Ccm93c2VySXNDbG9zZWQ9RkFMU0U7fWlmKCR2YXJpYWJsZXM9PT1OVUxMKXskdGhpcy0+bWV0YVsnJ11bJ1QnXT0kdGltZTskdGhpcy0+bWV0YVsnJ11bJ0InXT0kd2hlbkJyb3dzZXJJc0Nsb3NlZDt9ZWxzZWlmKGlzX2FycmF5KCR2YXJpYWJsZXMpKXtmb3JlYWNoKCR2YXJpYWJsZXMKYXMkdmFyaWFibGUpeyR0aGlzLT5tZXRhWyR2YXJpYWJsZV1bJ1QnXT0kdGltZTskdGhpcy0+bWV0YVskdmFyaWFibGVdWydCJ109JHdoZW5Ccm93c2VySXNDbG9zZWQ7fX1lbHNleyR0aGlzLT5tZXRhWyR2YXJpYWJsZXNdWydUJ109JHRpbWU7JHRoaXMtPm1ldGFbJHZhcmlhYmxlc11bJ0InXT0kd2hlbkJyb3dzZXJJc0Nsb3NlZDt9cmV0dXJuJHRoaXM7fWZ1bmN0aW9uCnJlbW92ZUV4cGlyYXRpb24oJHZhcmlhYmxlcz1OVUxMKXtpZigkdmFyaWFibGVzPT09TlVMTCl7dW5zZXQoJHRoaXMtPm1ldGFbJyddWydUJ10sJHRoaXMtPm1ldGFbJyddWydCJ10pO31lbHNlaWYoaXNfYXJyYXkoJHZhcmlhYmxlcykpe2ZvcmVhY2goJHZhcmlhYmxlcwphcyR2YXJpYWJsZSl7dW5zZXQoJHRoaXMtPm1ldGFbJHZhcmlhYmxlXVsnVCddLCR0aGlzLT5tZXRhWyR2YXJpYWJsZV1bJ0InXSk7fX1lbHNle3Vuc2V0KCR0aGlzLT5tZXRhWyR2YXJpYWJsZXNdWydUJ10sJHRoaXMtPm1ldGFbJHZhcmlhYmxlXVsnQiddKTt9fWZ1bmN0aW9uCnJlbW92ZSgpeyR0aGlzLT5kYXRhPU5VTEw7JHRoaXMtPm1ldGE9TlVMTDt9fWNsYXNzCk5VcmkKZXh0ZW5kcwpORnJlZXphYmxlT2JqZWN0e3B1YmxpYwpzdGF0aWMkZGVmYXVsdFBvcnRzPWFycmF5KCdodHRwJz0+ODAsJ2h0dHBzJz0+NDQzLCdmdHAnPT4yMSwnbmV3cyc9PjExOSwnbm50cCc9PjExOSk7cHJpdmF0ZSRzY2hlbWU9Jyc7cHJpdmF0ZSR1c2VyPScnO3ByaXZhdGUkcGFzcz0nJztwcml2YXRlJGhvc3Q9Jyc7cHJpdmF0ZSRwb3J0PU5VTEw7cHJpdmF0ZSRwYXRoPScnO3ByaXZhdGUkcXVlcnk9Jyc7cHJpdmF0ZSRmcmFnbWVudD0nJztmdW5jdGlvbgpfX2NvbnN0cnVjdCgkdXJpPU5VTEwpe2lmKGlzX3N0cmluZygkdXJpKSl7JHBhcnRzPUBwYXJzZV91cmwoJHVyaSk7aWYoJHBhcnRzPT09RkFMU0Upe3Rocm93Cm5ldwpJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIk1hbGZvcm1lZCBvciB1bnN1cHBvcnRlZCBVUkkgJyR1cmknLiIpO31mb3JlYWNoKCRwYXJ0cwphcyRrZXk9PiR2YWwpeyR0aGlzLT4ka2V5PSR2YWw7fWlmKCEkdGhpcy0+cG9ydCYmaXNzZXQoc2VsZjo6JGRlZmF1bHRQb3J0c1skdGhpcy0+c2NoZW1lXSkpeyR0aGlzLT5wb3J0PXNlbGY6OiRkZWZhdWx0UG9ydHNbJHRoaXMtPnNjaGVtZV07fX1lbHNlaWYoJHVyaQppbnN0YW5jZW9mCnNlbGYpe2ZvcmVhY2goJHRoaXMKYXMka2V5PT4kdmFsKXskdGhpcy0+JGtleT0kdXJpLT4ka2V5O319fWZ1bmN0aW9uCnNldFNjaGVtZSgkdmFsdWUpeyR0aGlzLT51cGRhdGluZygpOyR0aGlzLT5zY2hlbWU9KHN0cmluZykkdmFsdWU7cmV0dXJuJHRoaXM7fWZ1bmN0aW9uCmdldFNjaGVtZSgpe3JldHVybiR0aGlzLT5zY2hlbWU7fWZ1bmN0aW9uCnNldFVzZXIoJHZhbHVlKXskdGhpcy0+dXBkYXRpbmcoKTskdGhpcy0+dXNlcj0oc3RyaW5nKSR2YWx1ZTtyZXR1cm4kdGhpczt9ZnVuY3Rpb24KZ2V0VXNlcigpe3JldHVybiR0aGlzLT51c2VyO31mdW5jdGlvbgpzZXRQYXNzd29yZCgkdmFsdWUpeyR0aGlzLT51cGRhdGluZygpOyR0aGlzLT5wYXNzPShzdHJpbmcpJHZhbHVlO3JldHVybiR0aGlzO31mdW5jdGlvbgpnZXRQYXNzd29yZCgpe3JldHVybiR0aGlzLT5wYXNzO31mdW5jdGlvbgpzZXRQYXNzKCR2YWx1ZSl7dHJpZ2dlcl9lcnJvcihfX01FVEhPRF9fLicoKSBpcyBkZXByZWNhdGVkOyB1c2Ugc2V0UGFzc3dvcmQoKSBpbnN0ZWFkLicsRV9VU0VSX1dBUk5JTkcpOyR0aGlzLT5zZXRQYXNzd29yZCgkdmFsdWUpO31mdW5jdGlvbgpnZXRQYXNzKCl7dHJpZ2dlcl9lcnJvcihfX01FVEhPRF9fLicoKSBpcyBkZXByZWNhdGVkOyB1c2UgZ2V0UGFzc3dvcmQoKSBpbnN0ZWFkLicsRV9VU0VSX1dBUk5JTkcpO3JldHVybiR0aGlzLT5wYXNzO31mdW5jdGlvbgpzZXRIb3N0KCR2YWx1ZSl7JHRoaXMtPnVwZGF0aW5nKCk7JHRoaXMtPmhvc3Q9KHN0cmluZykkdmFsdWU7cmV0dXJuJHRoaXM7fWZ1bmN0aW9uCmdldEhvc3QoKXtyZXR1cm4kdGhpcy0+aG9zdDt9ZnVuY3Rpb24Kc2V0UG9ydCgkdmFsdWUpeyR0aGlzLT51cGRhdGluZygpOyR0aGlzLT5wb3J0PShpbnQpJHZhbHVlO3JldHVybiR0aGlzO31mdW5jdGlvbgpnZXRQb3J0KCl7cmV0dXJuJHRoaXMtPnBvcnQ7fWZ1bmN0aW9uCnNldFBhdGgoJHZhbHVlKXskdGhpcy0+dXBkYXRpbmcoKTskdGhpcy0+cGF0aD0oc3RyaW5nKSR2YWx1ZTtyZXR1cm4kdGhpczt9ZnVuY3Rpb24KZ2V0UGF0aCgpe3JldHVybiR0aGlzLT5wYXRoO31mdW5jdGlvbgpzZXRRdWVyeSgkdmFsdWUpeyR0aGlzLT51cGRhdGluZygpOyR0aGlzLT5xdWVyeT0oc3RyaW5nKShpc19hcnJheSgkdmFsdWUpP2h0dHBfYnVpbGRfcXVlcnkoJHZhbHVlLCcnLCcmJyk6JHZhbHVlKTtyZXR1cm4kdGhpczt9ZnVuY3Rpb24KYXBwZW5kUXVlcnkoJHZhbHVlKXskdGhpcy0+dXBkYXRpbmcoKTskdmFsdWU9KHN0cmluZykoaXNfYXJyYXkoJHZhbHVlKT9odHRwX2J1aWxkX3F1ZXJ5KCR2YWx1ZSwnJywnJicpOiR2YWx1ZSk7JHRoaXMtPnF1ZXJ5Lj0oJHRoaXMtPnF1ZXJ5PT09Jyd8fCR2YWx1ZT09PScnKT8kdmFsdWU6JyYnLiR2YWx1ZTt9ZnVuY3Rpb24KZ2V0UXVlcnkoKXtyZXR1cm4kdGhpcy0+cXVlcnk7fWZ1bmN0aW9uCnNldEZyYWdtZW50KCR2YWx1ZSl7JHRoaXMtPnVwZGF0aW5nKCk7JHRoaXMtPmZyYWdtZW50PShzdHJpbmcpJHZhbHVlO3JldHVybiR0aGlzO31mdW5jdGlvbgpnZXRGcmFnbWVudCgpe3JldHVybiR0aGlzLT5mcmFnbWVudDt9ZnVuY3Rpb24KZ2V0QWJzb2x1dGVVcmkoKXtyZXR1cm4kdGhpcy0+c2NoZW1lLic6Ly8nLiR0aGlzLT5nZXRBdXRob3JpdHkoKS4kdGhpcy0+cGF0aC4oJHRoaXMtPnF1ZXJ5PT09Jyc/Jyc6Jz8nLiR0aGlzLT5xdWVyeSkuKCR0aGlzLT5mcmFnbWVudD09PScnPycnOicjJy4kdGhpcy0+ZnJhZ21lbnQpO31mdW5jdGlvbgpnZXRBdXRob3JpdHkoKXskYXV0aG9yaXR5PSR0aGlzLT5ob3N0O2lmKCR0aGlzLT5wb3J0JiZpc3NldChzZWxmOjokZGVmYXVsdFBvcnRzWyR0aGlzLT5zY2hlbWVdKSYmJHRoaXMtPnBvcnQhPT1zZWxmOjokZGVmYXVsdFBvcnRzWyR0aGlzLT5zY2hlbWVdKXskYXV0aG9yaXR5Lj0nOicuJHRoaXMtPnBvcnQ7fWlmKCR0aGlzLT51c2VyIT09JycmJiR0aGlzLT5zY2hlbWUhPT0naHR0cCcmJiR0aGlzLT5zY2hlbWUhPT0naHR0cHMnKXskYXV0aG9yaXR5PSR0aGlzLT51c2VyLigkdGhpcy0+cGFzcz09PScnPycnOic6Jy4kdGhpcy0+cGFzcykuJ0AnLiRhdXRob3JpdHk7fXJldHVybiRhdXRob3JpdHk7fWZ1bmN0aW9uCmdldEhvc3RVcmkoKXtyZXR1cm4kdGhpcy0+c2NoZW1lLic6Ly8nLiR0aGlzLT5nZXRBdXRob3JpdHkoKTt9ZnVuY3Rpb24KaXNFcXVhbCgkdXJpKXskcGFydD1zZWxmOjp1bmVzY2FwZShzdHJ0b2soJHVyaSwnPyMnKSwnJS8nKTtpZihzdHJuY21wKCRwYXJ0LCcvLycsMik9PT0wKXtpZigkcGFydCE9PScvLycuJHRoaXMtPmdldEF1dGhvcml0eSgpLiR0aGlzLT5wYXRoKXJldHVybgpGQUxTRTt9ZWxzZWlmKHN0cm5jbXAoJHBhcnQsJy8nLDEpPT09MCl7aWYoJHBhcnQhPT0kdGhpcy0+cGF0aClyZXR1cm4KRkFMU0U7fWVsc2V7aWYoJHBhcnQhPT0kdGhpcy0+c2NoZW1lLic6Ly8nLiR0aGlzLT5nZXRBdXRob3JpdHkoKS4kdGhpcy0+cGF0aClyZXR1cm4KRkFMU0U7fSRwYXJ0PXNlbGY6OnVuZXNjYXBlKHN0cnRyKChzdHJpbmcpc3RydG9rKCc/IycpLCcrJywnICcpLCclJjs9KycpO3JldHVybiRwYXJ0PT09JHRoaXMtPnF1ZXJ5O31mdW5jdGlvbgpjYW5vbmljYWxpemUoKXskdGhpcy0+dXBkYXRpbmcoKTskdGhpcy0+cGF0aD0kdGhpcy0+cGF0aD09PScnPycvJzpzZWxmOjp1bmVzY2FwZSgkdGhpcy0+cGF0aCwnJS8nKTskdGhpcy0+aG9zdD1zdHJ0b2xvd2VyKHJhd3VybGRlY29kZSgkdGhpcy0+aG9zdCkpOyR0aGlzLT5xdWVyeT1zZWxmOjp1bmVzY2FwZShzdHJ0cigkdGhpcy0+cXVlcnksJysnLCcgJyksJyUmOz0rJyk7fWZ1bmN0aW9uCl9fdG9TdHJpbmcoKXtyZXR1cm4kdGhpcy0+Z2V0QWJzb2x1dGVVcmkoKTt9c3RhdGljCmZ1bmN0aW9uCnVuZXNjYXBlKCRzLCRyZXNlcnZlZD0nJTsvPzpAJj0rJCwnKXtwcmVnX21hdGNoX2FsbCgnIyg/PD0lKVthLWYwLTldW2EtZjAtOV0jaScsJHMsJG1hdGNoZXMsUFJFR19PRkZTRVRfQ0FQVFVSRXxQUkVHX1NFVF9PUkRFUik7Zm9yZWFjaChhcnJheV9yZXZlcnNlKCRtYXRjaGVzKWFzJG1hdGNoKXskY2g9Y2hyKGhleGRlYygkbWF0Y2hbMF1bMF0pKTtpZihzdHJwb3MoJHJlc2VydmVkLCRjaCk9PT1GQUxTRSl7JHM9c3Vic3RyX3JlcGxhY2UoJHMsJGNoLCRtYXRjaFswXVsxXS0xLDMpO319cmV0dXJuJHM7fX1jbGFzcwpOVXJpU2NyaXB0CmV4dGVuZHMKTlVyaXtwcml2YXRlJHNjcmlwdFBhdGg9Jyc7ZnVuY3Rpb24Kc2V0U2NyaXB0UGF0aCgkdmFsdWUpeyR0aGlzLT51cGRhdGluZygpOyR0aGlzLT5zY3JpcHRQYXRoPShzdHJpbmcpJHZhbHVlO3JldHVybiR0aGlzO31mdW5jdGlvbgpnZXRTY3JpcHRQYXRoKCl7cmV0dXJuJHRoaXMtPnNjcmlwdFBhdGg7fWZ1bmN0aW9uCmdldEJhc2VQYXRoKCl7cmV0dXJuKHN0cmluZylzdWJzdHIoJHRoaXMtPnNjcmlwdFBhdGgsMCxzdHJycG9zKCR0aGlzLT5zY3JpcHRQYXRoLCcvJykrMSk7fWZ1bmN0aW9uCmdldEJhc2VVcmkoKXtyZXR1cm4kdGhpcy0+c2NoZW1lLic6Ly8nLiR0aGlzLT5nZXRBdXRob3JpdHkoKS4kdGhpcy0+Z2V0QmFzZVBhdGgoKTt9ZnVuY3Rpb24KZ2V0UmVsYXRpdmVVcmkoKXtyZXR1cm4oc3RyaW5nKXN1YnN0cigkdGhpcy0+cGF0aCxzdHJycG9zKCR0aGlzLT5zY3JpcHRQYXRoLCcvJykrMSk7fWZ1bmN0aW9uCmdldFBhdGhJbmZvKCl7cmV0dXJuKHN0cmluZylzdWJzdHIoJHRoaXMtPnBhdGgsc3RybGVuKCR0aGlzLT5zY3JpcHRQYXRoKSk7fX1jbGFzcwpOVXNlcgpleHRlbmRzCk5PYmplY3QKaW1wbGVtZW50cwpJVXNlcntjb25zdApNQU5VQUw9MTtjb25zdApJTkFDVElWSVRZPTI7Y29uc3QKQlJPV1NFUl9DTE9TRUQ9MztwdWJsaWMkZ3Vlc3RSb2xlPSdndWVzdCc7cHVibGljJGF1dGhlbnRpY2F0ZWRSb2xlPSdhdXRoZW50aWNhdGVkJztwdWJsaWMkb25Mb2dnZWRJbjtwdWJsaWMkb25Mb2dnZWRPdXQ7cHVibGljJG9uQXV0aGVudGljYXRlZDtwdWJsaWMkb25TaWduZWRPdXQ7cHJpdmF0ZSRhdXRoZW50aWNhdGlvbkhhbmRsZXI7cHJpdmF0ZSRhdXRob3JpemF0aW9uSGFuZGxlcjtwcml2YXRlJG5hbWVzcGFjZT0nJztwcml2YXRlJHNlc3Npb247ZnVuY3Rpb24KX19jb25zdHJ1Y3QoKXskdGhpcy0+b25Mb2dnZWRJbj0mJHRoaXMtPm9uQXV0aGVudGljYXRlZDskdGhpcy0+b25Mb2dnZWRPdXQ9JiR0aGlzLT5vblNpZ25lZE91dDt9ZnVuY3Rpb24KbG9naW4oJHVzZXJuYW1lLCRwYXNzd29yZCwkZXh0cmE9TlVMTCl7JGhhbmRsZXI9JHRoaXMtPmdldEF1dGhlbnRpY2F0aW9uSGFuZGxlcigpO2lmKCRoYW5kbGVyPT09TlVMTCl7dGhyb3cKbmV3CkludmFsaWRTdGF0ZUV4Y2VwdGlvbignQXV0aGVudGljYXRpb24gaGFuZGxlciBoYXMgbm90IGJlZW4gc2V0LicpO30kdGhpcy0+bG9nb3V0KFRSVUUpOyRjcmVkZW50aWFscz1hcnJheShJQXV0aGVudGljYXRvcjo6VVNFUk5BTUU9PiR1c2VybmFtZSxJQXV0aGVudGljYXRvcjo6UEFTU1dPUkQ9PiRwYXNzd29yZCwnZXh0cmEnPT4kZXh0cmEpOyR0aGlzLT5zZXRJZGVudGl0eSgkaGFuZGxlci0+YXV0aGVudGljYXRlKCRjcmVkZW50aWFscykpOyR0aGlzLT5zZXRBdXRoZW50aWNhdGVkKFRSVUUpOyR0aGlzLT5vbkxvZ2dlZEluKCR0aGlzKTt9ZmluYWwKZnVuY3Rpb24KbG9nb3V0KCRjbGVhcklkZW50aXR5PUZBTFNFKXtpZigkdGhpcy0+aXNMb2dnZWRJbigpKXskdGhpcy0+c2V0QXV0aGVudGljYXRlZChGQUxTRSk7JHRoaXMtPm9uTG9nZ2VkT3V0KCR0aGlzKTt9aWYoJGNsZWFySWRlbnRpdHkpeyR0aGlzLT5zZXRJZGVudGl0eShOVUxMKTt9fWZpbmFsCmZ1bmN0aW9uCmlzTG9nZ2VkSW4oKXskc2Vzc2lvbj0kdGhpcy0+Z2V0U2Vzc2lvbk5hbWVzcGFjZShGQUxTRSk7cmV0dXJuJHNlc3Npb24mJiRzZXNzaW9uLT5hdXRoZW50aWNhdGVkO31maW5hbApmdW5jdGlvbgpnZXRJZGVudGl0eSgpeyRzZXNzaW9uPSR0aGlzLT5nZXRTZXNzaW9uTmFtZXNwYWNlKEZBTFNFKTtyZXR1cm4kc2Vzc2lvbj8kc2Vzc2lvbi0+aWRlbnRpdHk6TlVMTDt9ZnVuY3Rpb24Kc2V0QXV0aGVudGljYXRpb25IYW5kbGVyKElBdXRoZW50aWNhdG9yJGhhbmRsZXIpeyR0aGlzLT5hdXRoZW50aWNhdGlvbkhhbmRsZXI9JGhhbmRsZXI7cmV0dXJuJHRoaXM7fWZpbmFsCmZ1bmN0aW9uCmdldEF1dGhlbnRpY2F0aW9uSGFuZGxlcigpe2lmKCR0aGlzLT5hdXRoZW50aWNhdGlvbkhhbmRsZXI9PT1OVUxMKXskdGhpcy0+YXV0aGVudGljYXRpb25IYW5kbGVyPU5FbnZpcm9ubWVudDo6Z2V0U2VydmljZSgnTmV0dGVcXFNlY3VyaXR5XFxJQXV0aGVudGljYXRvcicpO31yZXR1cm4kdGhpcy0+YXV0aGVudGljYXRpb25IYW5kbGVyO31mdW5jdGlvbgpzZXROYW1lc3BhY2UoJG5hbWVzcGFjZSl7aWYoJHRoaXMtPm5hbWVzcGFjZSE9PSRuYW1lc3BhY2UpeyR0aGlzLT5uYW1lc3BhY2U9KHN0cmluZykkbmFtZXNwYWNlOyR0aGlzLT5zZXNzaW9uPU5VTEw7fXJldHVybiR0aGlzO31maW5hbApmdW5jdGlvbgpnZXROYW1lc3BhY2UoKXtyZXR1cm4kdGhpcy0+bmFtZXNwYWNlO31mdW5jdGlvbgpzZXRFeHBpcmF0aW9uKCR0aW1lLCR3aGVuQnJvd3NlcklzQ2xvc2VkPVRSVUUsJGNsZWFySWRlbnRpdHk9RkFMU0UpeyRzZXNzaW9uPSR0aGlzLT5nZXRTZXNzaW9uTmFtZXNwYWNlKFRSVUUpO2lmKCR0aW1lKXskdGltZT1OVG9vbHM6OmNyZWF0ZURhdGVUaW1lKCR0aW1lKS0+Zm9ybWF0KCdVJyk7JHNlc3Npb24tPmV4cGlyZVRpbWU9JHRpbWU7JHNlc3Npb24tPmV4cGlyZURlbHRhPSR0aW1lLXRpbWUoKTt9ZWxzZXt1bnNldCgkc2Vzc2lvbi0+ZXhwaXJlVGltZSwkc2Vzc2lvbi0+ZXhwaXJlRGVsdGEpO30kc2Vzc2lvbi0+ZXhwaXJlSWRlbnRpdHk9KGJvb2wpJGNsZWFySWRlbnRpdHk7JHNlc3Npb24tPmV4cGlyZUJyb3dzZXI9KGJvb2wpJHdoZW5Ccm93c2VySXNDbG9zZWQ7JHNlc3Npb24tPmJyb3dzZXJDaGVjaz1UUlVFOyRzZXNzaW9uLT5zZXRFeHBpcmF0aW9uKDAsJ2Jyb3dzZXJDaGVjaycpO3JldHVybiR0aGlzO31maW5hbApmdW5jdGlvbgpnZXRMb2dvdXRSZWFzb24oKXskc2Vzc2lvbj0kdGhpcy0+Z2V0U2Vzc2lvbk5hbWVzcGFjZShGQUxTRSk7cmV0dXJuJHNlc3Npb24/JHNlc3Npb24tPnJlYXNvbjpOVUxMO31wcm90ZWN0ZWQKZnVuY3Rpb24KZ2V0U2Vzc2lvbk5hbWVzcGFjZSgkbmVlZCl7aWYoJHRoaXMtPnNlc3Npb24hPT1OVUxMKXtyZXR1cm4kdGhpcy0+c2Vzc2lvbjt9JHNlc3Npb25IYW5kbGVyPSR0aGlzLT5nZXRTZXNzaW9uKCk7aWYoISRuZWVkJiYhJHNlc3Npb25IYW5kbGVyLT5leGlzdHMoKSl7cmV0dXJuCk5VTEw7fSR0aGlzLT5zZXNzaW9uPSRzZXNzaW9uPSRzZXNzaW9uSGFuZGxlci0+Z2V0TmFtZXNwYWNlKCdOZXR0ZS5XZWIuVXNlci8nLiR0aGlzLT5uYW1lc3BhY2UpO2lmKCEoJHNlc3Npb24tPmlkZW50aXR5Cmluc3RhbmNlb2YKSUlkZW50aXR5KXx8IWlzX2Jvb2woJHNlc3Npb24tPmF1dGhlbnRpY2F0ZWQpKXskc2Vzc2lvbi0+cmVtb3ZlKCk7fWlmKCRzZXNzaW9uLT5hdXRoZW50aWNhdGVkJiYkc2Vzc2lvbi0+ZXhwaXJlQnJvd3NlciYmISRzZXNzaW9uLT5icm93c2VyQ2hlY2speyRzZXNzaW9uLT5yZWFzb249c2VsZjo6QlJPV1NFUl9DTE9TRUQ7JHNlc3Npb24tPmF1dGhlbnRpY2F0ZWQ9RkFMU0U7JHRoaXMtPm9uTG9nZ2VkT3V0KCR0aGlzKTtpZigkc2Vzc2lvbi0+ZXhwaXJlSWRlbnRpdHkpe3Vuc2V0KCRzZXNzaW9uLT5pZGVudGl0eSk7fX1pZigkc2Vzc2lvbi0+YXV0aGVudGljYXRlZCYmJHNlc3Npb24tPmV4cGlyZURlbHRhPjApe2lmKCRzZXNzaW9uLT5leHBpcmVUaW1lPHRpbWUoKSl7JHNlc3Npb24tPnJlYXNvbj1zZWxmOjpJTkFDVElWSVRZOyRzZXNzaW9uLT5hdXRoZW50aWNhdGVkPUZBTFNFOyR0aGlzLT5vbkxvZ2dlZE91dCgkdGhpcyk7aWYoJHNlc3Npb24tPmV4cGlyZUlkZW50aXR5KXt1bnNldCgkc2Vzc2lvbi0+aWRlbnRpdHkpO319JHNlc3Npb24tPmV4cGlyZVRpbWU9dGltZSgpKyRzZXNzaW9uLT5leHBpcmVEZWx0YTt9aWYoISRzZXNzaW9uLT5hdXRoZW50aWNhdGVkKXt1bnNldCgkc2Vzc2lvbi0+ZXhwaXJlVGltZSwkc2Vzc2lvbi0+ZXhwaXJlRGVsdGEsJHNlc3Npb24tPmV4cGlyZUlkZW50aXR5LCRzZXNzaW9uLT5leHBpcmVCcm93c2VyLCRzZXNzaW9uLT5icm93c2VyQ2hlY2ssJHNlc3Npb24tPmF1dGhUaW1lKTt9cmV0dXJuJHRoaXMtPnNlc3Npb247fXByb3RlY3RlZApmdW5jdGlvbgpzZXRBdXRoZW50aWNhdGVkKCRzdGF0ZSl7JHNlc3Npb249JHRoaXMtPmdldFNlc3Npb25OYW1lc3BhY2UoVFJVRSk7JHNlc3Npb24tPmF1dGhlbnRpY2F0ZWQ9KGJvb2wpJHN0YXRlOyR0aGlzLT5nZXRTZXNzaW9uKCktPnJlZ2VuZXJhdGVJZCgpO2lmKCRzdGF0ZSl7JHNlc3Npb24tPnJlYXNvbj1OVUxMOyRzZXNzaW9uLT5hdXRoVGltZT10aW1lKCk7fWVsc2V7JHNlc3Npb24tPnJlYXNvbj1zZWxmOjpNQU5VQUw7JHNlc3Npb24tPmF1dGhUaW1lPU5VTEw7fXJldHVybiR0aGlzO31wcm90ZWN0ZWQKZnVuY3Rpb24Kc2V0SWRlbnRpdHkoSUlkZW50aXR5JGlkZW50aXR5PU5VTEwpeyR0aGlzLT5nZXRTZXNzaW9uTmFtZXNwYWNlKFRSVUUpLT5pZGVudGl0eT0kaWRlbnRpdHk7cmV0dXJuJHRoaXM7fWZ1bmN0aW9uCmdldFJvbGVzKCl7aWYoISR0aGlzLT5pc0xvZ2dlZEluKCkpe3JldHVybgphcnJheSgkdGhpcy0+Z3Vlc3RSb2xlKTt9JGlkZW50aXR5PSR0aGlzLT5nZXRJZGVudGl0eSgpO3JldHVybiRpZGVudGl0eT8kaWRlbnRpdHktPmdldFJvbGVzKCk6YXJyYXkoJHRoaXMtPmF1dGhlbnRpY2F0ZWRSb2xlKTt9ZmluYWwKZnVuY3Rpb24KaXNJblJvbGUoJHJvbGUpe3JldHVybgppbl9hcnJheSgkcm9sZSwkdGhpcy0+Z2V0Um9sZXMoKSxUUlVFKTt9ZnVuY3Rpb24KaXNBbGxvd2VkKCRyZXNvdXJjZT1OVUxMLCRwcml2aWxlZ2U9TlVMTCl7JGhhbmRsZXI9JHRoaXMtPmdldEF1dGhvcml6YXRpb25IYW5kbGVyKCk7aWYoISRoYW5kbGVyKXt0aHJvdwpuZXcKSW52YWxpZFN0YXRlRXhjZXB0aW9uKCJBdXRob3JpemF0aW9uIGhhbmRsZXIgaGFzIG5vdCBiZWVuIHNldC4iKTt9Zm9yZWFjaCgkdGhpcy0+Z2V0Um9sZXMoKWFzJHJvbGUpe2lmKCRoYW5kbGVyLT5pc0FsbG93ZWQoJHJvbGUsJHJlc291cmNlLCRwcml2aWxlZ2UpKXJldHVybgpUUlVFO31yZXR1cm4KRkFMU0U7fWZ1bmN0aW9uCnNldEF1dGhvcml6YXRpb25IYW5kbGVyKElBdXRob3JpemF0b3IkaGFuZGxlcil7JHRoaXMtPmF1dGhvcml6YXRpb25IYW5kbGVyPSRoYW5kbGVyO3JldHVybiR0aGlzO31maW5hbApmdW5jdGlvbgpnZXRBdXRob3JpemF0aW9uSGFuZGxlcigpe2lmKCR0aGlzLT5hdXRob3JpemF0aW9uSGFuZGxlcj09PU5VTEwpeyR0aGlzLT5hdXRob3JpemF0aW9uSGFuZGxlcj1ORW52aXJvbm1lbnQ6OmdldFNlcnZpY2UoJ05ldHRlXFxTZWN1cml0eVxcSUF1dGhvcml6YXRvcicpO31yZXR1cm4kdGhpcy0+YXV0aG9yaXphdGlvbkhhbmRsZXI7fXByb3RlY3RlZApmdW5jdGlvbgpnZXRTZXNzaW9uKCl7cmV0dXJuCk5FbnZpcm9ubWVudDo6Z2V0U2Vzc2lvbigpO31mdW5jdGlvbgphdXRoZW50aWNhdGUoJHVzZXJuYW1lLCRwYXNzd29yZCwkZXh0cmE9TlVMTCl7dHJpZ2dlcl9lcnJvcihfX01FVEhPRF9fLicoKSBpcyBkZXByZWNhdGVkOyB1c2UgbG9naW4oKSBpbnN0ZWFkLicsRV9VU0VSX1dBUk5JTkcpO3JldHVybiR0aGlzLT5sb2dpbigkdXNlcm5hbWUsJHBhc3N3b3JkLCRleHRyYSk7fWZ1bmN0aW9uCnNpZ25PdXQoJGNsZWFySWRlbnRpdHk9RkFMU0Upe3RyaWdnZXJfZXJyb3IoX19NRVRIT0RfXy4nKCkgaXMgZGVwcmVjYXRlZDsgdXNlIGxvZ291dCgpIGluc3RlYWQuJyxFX1VTRVJfV0FSTklORyk7cmV0dXJuJHRoaXMtPmxvZ291dCgkY2xlYXJJZGVudGl0eSk7fWZ1bmN0aW9uCmlzQXV0aGVudGljYXRlZCgpe3RyaWdnZXJfZXJyb3IoX19NRVRIT0RfXy4nKCkgaXMgZGVwcmVjYXRlZDsgdXNlIGlzTG9nZ2VkSW4oKSBpbnN0ZWFkLicsRV9VU0VSX1dBUk5JTkcpO3JldHVybiR0aGlzLT5pc0xvZ2dlZEluKCk7fWZ1bmN0aW9uCmdldFNpZ25PdXRSZWFzb24oKXt0cmlnZ2VyX2Vycm9yKF9fTUVUSE9EX18uJygpIGlzIGRlcHJlY2F0ZWQ7IHVzZSBnZXRMb2dvdXRSZWFzb24oKSBpbnN0ZWFkLicsRV9VU0VSX1dBUk5JTkcpO3JldHVybiR0aGlzLT5nZXRMb2dvdXRSZWFzb24oKTt9fQ==]]></data>
	</file>
	<file>
	  <filename>/lib/OAuth.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCg0KLyoNClRoZSBNSVQgTGljZW5zZQ0KDQpDb3B5cmlnaHQgKGMpIDIwMDcgQW5keSBTbWl0aA0KDQpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5DQpvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbA0KaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cw0KdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbA0KY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzDQpmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KDQpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbg0KYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuDQoNClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SDQpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwNCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQ0KQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUg0KTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwNCk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4NClRIRSBTT0ZUV0FSRS4NCiovDQoNCi8qIEdlbmVyaWMgZXhjZXB0aW9uIGNsYXNzDQogKi8NCmNsYXNzIE9BdXRoRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uDQp7DQoJLy8gcGFzcw0KfQ0KDQpjbGFzcyBPQXV0aENvbnN1bWVyDQp7DQoJcHVibGljICRrZXk7DQoJcHVibGljICRzZWNyZXQ7DQoNCglmdW5jdGlvbiBfX2NvbnN0cnVjdCgka2V5LCAkc2VjcmV0LCAkY2FsbGJhY2tfdXJsPU5VTEwpIHsNCgkJJHRoaXMtPmtleSA9ICRrZXk7DQoJCSR0aGlzLT5zZWNyZXQgPSAkc2VjcmV0Ow0KCQkkdGhpcy0+Y2FsbGJhY2tfdXJsID0gJGNhbGxiYWNrX3VybDsNCgl9DQoNCglmdW5jdGlvbiBfX3RvU3RyaW5nKCkgew0KCQlyZXR1cm4gIk9BdXRoQ29uc3VtZXJba2V5PSR0aGlzLT5rZXksc2VjcmV0PSR0aGlzLT5zZWNyZXRdIjsNCgl9DQp9DQoNCmNsYXNzIE9BdXRoVG9rZW4NCnsNCgkvLyBhY2Nlc3MgdG9rZW5zIGFuZCByZXF1ZXN0IHRva2Vucw0KCXB1YmxpYyAka2V5Ow0KCXB1YmxpYyAkc2VjcmV0Ow0KDQoJLyoqDQoJICoga2V5ID0gdGhlIHRva2VuDQoJICogc2VjcmV0ID0gdGhlIHRva2VuIHNlY3JldA0KCSAqLw0KCWZ1bmN0aW9uIF9fY29uc3RydWN0KCRrZXksICRzZWNyZXQpIHsNCgkJJHRoaXMtPmtleSA9ICRrZXk7DQoJCSR0aGlzLT5zZWNyZXQgPSAkc2VjcmV0Ow0KCX0NCg0KCS8qKg0KCSAqIGdlbmVyYXRlcyB0aGUgYmFzaWMgc3RyaW5nIHNlcmlhbGl6YXRpb24gb2YgYSB0b2tlbiB0aGF0IGEgc2VydmVyDQoJICogd291bGQgcmVzcG9uZCB0byByZXF1ZXN0X3Rva2VuIGFuZCBhY2Nlc3NfdG9rZW4gY2FsbHMgd2l0aA0KCSAqLw0KCWZ1bmN0aW9uIHRvX3N0cmluZygpIHsNCgkJcmV0dXJuICJvYXV0aF90b2tlbj0iIC4NCgkJCQkJT0F1dGhVdGlsOjp1cmxlbmNvZGVfcmZjMzk4NigkdGhpcy0+a2V5KSAuDQoJCQkJCSImb2F1dGhfdG9rZW5fc2VjcmV0PSIgLg0KCQkJCQlPQXV0aFV0aWw6OnVybGVuY29kZV9yZmMzOTg2KCR0aGlzLT5zZWNyZXQpOw0KCX0NCg0KCWZ1bmN0aW9uIF9fdG9TdHJpbmcoKSB7DQoJCXJldHVybiAkdGhpcy0+dG9fc3RyaW5nKCk7DQoJfQ0KfQ0KDQovKioNCiAqIEEgY2xhc3MgZm9yIGltcGxlbWVudGluZyBhIFNpZ25hdHVyZSBNZXRob2QNCiAqIFNlZSBzZWN0aW9uIDkgKCJTaWduaW5nIFJlcXVlc3RzIikgaW4gdGhlIHNwZWMNCiAqLw0KYWJzdHJhY3QgY2xhc3MgT0F1dGhTaWduYXR1cmVNZXRob2QNCnsNCgkvKioNCgkgKiBOZWVkcyB0byByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIFNpZ25hdHVyZSBNZXRob2QgKGllIEhNQUMtU0hBMSkNCgkgKiBAcmV0dXJuIHN0cmluZw0KCSAqLw0KCWFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBnZXRfbmFtZSgpOw0KDQoJLyoqDQoJICogQnVpbGQgdXAgdGhlIHNpZ25hdHVyZQ0KCSAqIE5PVEU6IFRoZSBvdXRwdXQgb2YgdGhpcyBmdW5jdGlvbiBNVVNUIE5PVCBiZSB1cmxlbmNvZGVkLg0KCSAqIHRoZSBlbmNvZGluZyBpcyBoYW5kbGVkIGluIE9BdXRoUmVxdWVzdCB3aGVuIHRoZSBmaW5hbA0KCSAqIHJlcXVlc3QgaXMgc2VyaWFsaXplZA0KCSAqIEBwYXJhbSBPQXV0aFJlcXVlc3QgJHJlcXVlc3QNCgkgKiBAcGFyYW0gT0F1dGhDb25zdW1lciAkY29uc3VtZXINCgkgKiBAcGFyYW0gT0F1dGhUb2tlbiAkdG9rZW4NCgkgKiBAcmV0dXJuIHN0cmluZw0KCSAqLw0KCWFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBidWlsZF9zaWduYXR1cmUoJHJlcXVlc3QsICRjb25zdW1lciwgJHRva2VuKTsNCg0KCS8qKg0KCSAqIFZlcmlmaWVzIHRoYXQgYSBnaXZlbiBzaWduYXR1cmUgaXMgY29ycmVjdA0KCSAqIEBwYXJhbSBPQXV0aFJlcXVlc3QgJHJlcXVlc3QNCgkgKiBAcGFyYW0gT0F1dGhDb25zdW1lciAkY29uc3VtZXINCgkgKiBAcGFyYW0gT0F1dGhUb2tlbiAkdG9rZW4NCgkgKiBAcGFyYW0gc3RyaW5nICRzaWduYXR1cmUNCgkgKiBAcmV0dXJuIGJvb2wNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gY2hlY2tfc2lnbmF0dXJlKCRyZXF1ZXN0LCAkY29uc3VtZXIsICR0b2tlbiwgJHNpZ25hdHVyZSkgew0KCQkkYnVpbHQgPSAkdGhpcy0+YnVpbGRfc2lnbmF0dXJlKCRyZXF1ZXN0LCAkY29uc3VtZXIsICR0b2tlbik7DQoJCXJldHVybiAkYnVpbHQgPT0gJHNpZ25hdHVyZTsNCgl9DQp9DQoNCi8qKg0KICogVGhlIEhNQUMtU0hBMSBzaWduYXR1cmUgbWV0aG9kIHVzZXMgdGhlIEhNQUMtU0hBMSBzaWduYXR1cmUgYWxnb3JpdGhtIGFzIGRlZmluZWQgaW4gW1JGQzIxMDRdDQogKiB3aGVyZSB0aGUgU2lnbmF0dXJlIEJhc2UgU3RyaW5nIGlzIHRoZSB0ZXh0IGFuZCB0aGUga2V5IGlzIHRoZSBjb25jYXRlbmF0ZWQgdmFsdWVzIChlYWNoIGZpcnN0DQogKiBlbmNvZGVkIHBlciBQYXJhbWV0ZXIgRW5jb2RpbmcpIG9mIHRoZSBDb25zdW1lciBTZWNyZXQgYW5kIFRva2VuIFNlY3JldCwgc2VwYXJhdGVkIGJ5IGFuICcmJw0KICogY2hhcmFjdGVyIChBU0NJSSBjb2RlIDM4KSBldmVuIGlmIGVtcHR5Lg0KICogICAtIENoYXB0ZXIgOS4yICgiSE1BQy1TSEExIikNCiAqLw0KY2xhc3MgT0F1dGhTaWduYXR1cmVNZXRob2RfSE1BQ19TSEExIGV4dGVuZHMgT0F1dGhTaWduYXR1cmVNZXRob2QNCnsNCglmdW5jdGlvbiBnZXRfbmFtZSgpIHsNCgkJcmV0dXJuICJITUFDLVNIQTEiOw0KCX0NCg0KCXB1YmxpYyBmdW5jdGlvbiBidWlsZF9zaWduYXR1cmUoJHJlcXVlc3QsICRjb25zdW1lciwgJHRva2VuKSB7DQoJCSRiYXNlX3N0cmluZyA9ICRyZXF1ZXN0LT5nZXRfc2lnbmF0dXJlX2Jhc2Vfc3RyaW5nKCk7DQoJCSRyZXF1ZXN0LT5iYXNlX3N0cmluZyA9ICRiYXNlX3N0cmluZzsNCg0KCQkka2V5X3BhcnRzID0gYXJyYXkoDQoJCQkkY29uc3VtZXItPnNlY3JldCwNCgkJCSgkdG9rZW4pID8gJHRva2VuLT5zZWNyZXQgOiAiIg0KCQkpOw0KDQoJCSRrZXlfcGFydHMgPSBPQXV0aFV0aWw6OnVybGVuY29kZV9yZmMzOTg2KCRrZXlfcGFydHMpOw0KCQkka2V5ID0gaW1wbG9kZSgnJicsICRrZXlfcGFydHMpOw0KDQoJCXJldHVybiBiYXNlNjRfZW5jb2RlKGhhc2hfaG1hYygnc2hhMScsICRiYXNlX3N0cmluZywgJGtleSwgdHJ1ZSkpOw0KCX0NCn0NCg0KLyoqDQogKiBUaGUgUExBSU5URVhUIG1ldGhvZCBkb2VzIG5vdCBwcm92aWRlIGFueSBzZWN1cml0eSBwcm90ZWN0aW9uIGFuZCBTSE9VTEQgb25seSBiZSB1c2VkDQogKiBvdmVyIGEgc2VjdXJlIGNoYW5uZWwgc3VjaCBhcyBIVFRQUy4gSXQgZG9lcyBub3QgdXNlIHRoZSBTaWduYXR1cmUgQmFzZSBTdHJpbmcuDQogKiAgIC0gQ2hhcHRlciA5LjQgKCJQTEFJTlRFWFQiKQ0KICovDQpjbGFzcyBPQXV0aFNpZ25hdHVyZU1ldGhvZF9QTEFJTlRFWFQgZXh0ZW5kcyBPQXV0aFNpZ25hdHVyZU1ldGhvZA0Kew0KCXB1YmxpYyBmdW5jdGlvbiBnZXRfbmFtZSgpIHsNCgkJcmV0dXJuICJQTEFJTlRFWFQiOw0KCX0NCg0KCS8qKg0KCSAqIG9hdXRoX3NpZ25hdHVyZSBpcyBzZXQgdG8gdGhlIGNvbmNhdGVuYXRlZCBlbmNvZGVkIHZhbHVlcyBvZiB0aGUgQ29uc3VtZXIgU2VjcmV0IGFuZA0KCSAqIFRva2VuIFNlY3JldCwgc2VwYXJhdGVkIGJ5IGEgJyYnIGNoYXJhY3RlciAoQVNDSUkgY29kZSAzOCksIGV2ZW4gaWYgZWl0aGVyIHNlY3JldCBpcw0KCSAqIGVtcHR5LiBUaGUgcmVzdWx0IE1VU1QgYmUgZW5jb2RlZCBhZ2Fpbi4NCgkgKiAgIC0gQ2hhcHRlciA5LjQuMSAoIkdlbmVyYXRpbmcgU2lnbmF0dXJlcyIpDQoJICoNCgkgKiBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBzZWNvbmQgZW5jb2RpbmcgTVVTVCBOT1QgaGFwcGVuIGluIHRoZSBTaWduYXR1cmVNZXRob2QsIGFzDQoJICogT0F1dGhSZXF1ZXN0IGhhbmRsZXMgdGhpcyENCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gYnVpbGRfc2lnbmF0dXJlKCRyZXF1ZXN0LCAkY29uc3VtZXIsICR0b2tlbikgew0KCQkka2V5X3BhcnRzID0gYXJyYXkoDQoJCQkkY29uc3VtZXItPnNlY3JldCwNCgkJCSgkdG9rZW4pID8gJHRva2VuLT5zZWNyZXQgOiAiIg0KCQkpOw0KDQoJCSRrZXlfcGFydHMgPSBPQXV0aFV0aWw6OnVybGVuY29kZV9yZmMzOTg2KCRrZXlfcGFydHMpOw0KCQkka2V5ID0gaW1wbG9kZSgnJicsICRrZXlfcGFydHMpOw0KCQkkcmVxdWVzdC0+YmFzZV9zdHJpbmcgPSAka2V5Ow0KDQoJCXJldHVybiAka2V5Ow0KCX0NCn0NCg0KLyoqDQogKiBUaGUgUlNBLVNIQTEgc2lnbmF0dXJlIG1ldGhvZCB1c2VzIHRoZSBSU0FTU0EtUEtDUzEtdjFfNSBzaWduYXR1cmUgYWxnb3JpdGhtIGFzIGRlZmluZWQgaW4NCiAqIFtSRkMzNDQ3XSBzZWN0aW9uIDguMiAobW9yZSBzaW1wbHkga25vd24gYXMgUEtDUyMxKSwgdXNpbmcgU0hBLTEgYXMgdGhlIGhhc2ggZnVuY3Rpb24gZm9yDQogKiBFTVNBLVBLQ1MxLXYxXzUuIEl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgQ29uc3VtZXIgaGFzIHByb3ZpZGVkIGl0cyBSU0EgcHVibGljIGtleSBpbiBhDQogKiB2ZXJpZmllZCB3YXkgdG8gdGhlIFNlcnZpY2UgUHJvdmlkZXIsIGluIGEgbWFubmVyIHdoaWNoIGlzIGJleW9uZCB0aGUgc2NvcGUgb2YgdGhpcw0KICogc3BlY2lmaWNhdGlvbi4NCiAqICAgLSBDaGFwdGVyIDkuMyAoIlJTQS1TSEExIikNCiAqLw0KYWJzdHJhY3QgY2xhc3MgT0F1dGhTaWduYXR1cmVNZXRob2RfUlNBX1NIQTEgZXh0ZW5kcyBPQXV0aFNpZ25hdHVyZU1ldGhvZA0Kew0KCXB1YmxpYyBmdW5jdGlvbiBnZXRfbmFtZSgpIHsNCgkJcmV0dXJuICJSU0EtU0hBMSI7DQoJfQ0KDQoJLy8gVXAgdG8gdGhlIFNQIHRvIGltcGxlbWVudCB0aGlzIGxvb2t1cCBvZiBrZXlzLiBQb3NzaWJsZSBpZGVhcyBhcmU6DQoJLy8gKDEpIGRvIGEgbG9va3VwIGluIGEgdGFibGUgb2YgdHJ1c3RlZCBjZXJ0cyBrZXllZCBvZmYgb2YgY29uc3VtZXINCgkvLyAoMikgZmV0Y2ggdmlhIGh0dHAgdXNpbmcgYSB1cmwgcHJvdmlkZWQgYnkgdGhlIHJlcXVlc3Rlcg0KCS8vICgzKSBzb21lIHNvcnQgb2Ygc3BlY2lmaWMgZGlzY292ZXJ5IGNvZGUgYmFzZWQgb24gcmVxdWVzdA0KCS8vDQoJLy8gRWl0aGVyIHdheSBzaG91bGQgcmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjZXJ0aWZpY2F0ZQ0KCXByb3RlY3RlZCBhYnN0cmFjdCBmdW5jdGlvbiBmZXRjaF9wdWJsaWNfY2VydCgmJHJlcXVlc3QpOw0KDQoJLy8gVXAgdG8gdGhlIFNQIHRvIGltcGxlbWVudCB0aGlzIGxvb2t1cCBvZiBrZXlzLiBQb3NzaWJsZSBpZGVhcyBhcmU6DQoJLy8gKDEpIGRvIGEgbG9va3VwIGluIGEgdGFibGUgb2YgdHJ1c3RlZCBjZXJ0cyBrZXllZCBvZmYgb2YgY29uc3VtZXINCgkvLw0KCS8vIEVpdGhlciB3YXkgc2hvdWxkIHJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgY2VydGlmaWNhdGUNCglwcm90ZWN0ZWQgYWJzdHJhY3QgZnVuY3Rpb24gZmV0Y2hfcHJpdmF0ZV9jZXJ0KCYkcmVxdWVzdCk7DQoNCglwdWJsaWMgZnVuY3Rpb24gYnVpbGRfc2lnbmF0dXJlKCRyZXF1ZXN0LCAkY29uc3VtZXIsICR0b2tlbikgew0KCQkkYmFzZV9zdHJpbmcgPSAkcmVxdWVzdC0+Z2V0X3NpZ25hdHVyZV9iYXNlX3N0cmluZygpOw0KCQkkcmVxdWVzdC0+YmFzZV9zdHJpbmcgPSAkYmFzZV9zdHJpbmc7DQoNCgkJLy8gRmV0Y2ggdGhlIHByaXZhdGUga2V5IGNlcnQgYmFzZWQgb24gdGhlIHJlcXVlc3QNCgkJJGNlcnQgPSAkdGhpcy0+ZmV0Y2hfcHJpdmF0ZV9jZXJ0KCRyZXF1ZXN0KTsNCg0KCQkvLyBQdWxsIHRoZSBwcml2YXRlIGtleSBJRCBmcm9tIHRoZSBjZXJ0aWZpY2F0ZQ0KCQkkcHJpdmF0ZWtleWlkID0gb3BlbnNzbF9nZXRfcHJpdmF0ZWtleSgkY2VydCk7DQoNCgkJLy8gU2lnbiB1c2luZyB0aGUga2V5DQoJCSRvayA9IG9wZW5zc2xfc2lnbigkYmFzZV9zdHJpbmcsICRzaWduYXR1cmUsICRwcml2YXRla2V5aWQpOw0KDQoJCS8vIFJlbGVhc2UgdGhlIGtleSByZXNvdXJjZQ0KCQlvcGVuc3NsX2ZyZWVfa2V5KCRwcml2YXRla2V5aWQpOw0KDQoJCXJldHVybiBiYXNlNjRfZW5jb2RlKCRzaWduYXR1cmUpOw0KCX0NCg0KCXB1YmxpYyBmdW5jdGlvbiBjaGVja19zaWduYXR1cmUoJHJlcXVlc3QsICRjb25zdW1lciwgJHRva2VuLCAkc2lnbmF0dXJlKSB7DQoJCSRkZWNvZGVkX3NpZyA9IGJhc2U2NF9kZWNvZGUoJHNpZ25hdHVyZSk7DQoNCgkJJGJhc2Vfc3RyaW5nID0gJHJlcXVlc3QtPmdldF9zaWduYXR1cmVfYmFzZV9zdHJpbmcoKTsNCg0KCQkvLyBGZXRjaCB0aGUgcHVibGljIGtleSBjZXJ0IGJhc2VkIG9uIHRoZSByZXF1ZXN0DQoJCSRjZXJ0ID0gJHRoaXMtPmZldGNoX3B1YmxpY19jZXJ0KCRyZXF1ZXN0KTsNCg0KCQkvLyBQdWxsIHRoZSBwdWJsaWMga2V5IElEIGZyb20gdGhlIGNlcnRpZmljYXRlDQoJCSRwdWJsaWNrZXlpZCA9IG9wZW5zc2xfZ2V0X3B1YmxpY2tleSgkY2VydCk7DQoNCgkJLy8gQ2hlY2sgdGhlIGNvbXB1dGVkIHNpZ25hdHVyZSBhZ2FpbnN0IHRoZSBvbmUgcGFzc2VkIGluIHRoZSBxdWVyeQ0KCQkkb2sgPSBvcGVuc3NsX3ZlcmlmeSgkYmFzZV9zdHJpbmcsICRkZWNvZGVkX3NpZywgJHB1YmxpY2tleWlkKTsNCg0KCQkvLyBSZWxlYXNlIHRoZSBrZXkgcmVzb3VyY2UNCgkJb3BlbnNzbF9mcmVlX2tleSgkcHVibGlja2V5aWQpOw0KDQoJCXJldHVybiAkb2sgPT0gMTsNCgl9DQp9DQoNCmNsYXNzIE9BdXRoUmVxdWVzdA0Kew0KCXByb3RlY3RlZCAkcGFyYW1ldGVyczsNCglwcm90ZWN0ZWQgJGh0dHBfbWV0aG9kOw0KCXByb3RlY3RlZCAkaHR0cF91cmw7DQoJLy8gZm9yIGRlYnVnIHB1cnBvc2VzDQoJcHVibGljICRiYXNlX3N0cmluZzsNCglwdWJsaWMgc3RhdGljICR2ZXJzaW9uID0gJzEuMCc7DQoJcHVibGljIHN0YXRpYyAkUE9TVF9JTlBVVCA9ICdwaHA6Ly9pbnB1dCc7DQoNCglmdW5jdGlvbiBfX2NvbnN0cnVjdCgkaHR0cF9tZXRob2QsICRodHRwX3VybCwgJHBhcmFtZXRlcnM9TlVMTCkgew0KCQkkcGFyYW1ldGVycyA9ICgkcGFyYW1ldGVycykgPyAkcGFyYW1ldGVycyA6IGFycmF5KCk7DQoJCSRwYXJhbWV0ZXJzID0gYXJyYXlfbWVyZ2UoIE9BdXRoVXRpbDo6cGFyc2VfcGFyYW1ldGVycyhwYXJzZV91cmwoJGh0dHBfdXJsLCBQSFBfVVJMX1FVRVJZKSksICRwYXJhbWV0ZXJzKTsNCgkJJHRoaXMtPnBhcmFtZXRlcnMgPSAkcGFyYW1ldGVyczsNCgkJJHRoaXMtPmh0dHBfbWV0aG9kID0gJGh0dHBfbWV0aG9kOw0KCQkkdGhpcy0+aHR0cF91cmwgPSAkaHR0cF91cmw7DQoJfQ0KDQoNCgkvKioNCgkgKiBhdHRlbXB0IHRvIGJ1aWxkIHVwIGEgcmVxdWVzdCBmcm9tIHdoYXQgd2FzIHBhc3NlZCB0byB0aGUgc2VydmVyDQoJICovDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmcm9tX3JlcXVlc3QoJGh0dHBfbWV0aG9kPU5VTEwsICRodHRwX3VybD1OVUxMLCAkcGFyYW1ldGVycz1OVUxMKSB7DQoJCSRzY2hlbWUgPSAoIWlzc2V0KCRfU0VSVkVSWydIVFRQUyddKSB8fCAkX1NFUlZFUlsnSFRUUFMnXSAhPSAib24iKQ0KCQkJCQkJCT8gJ2h0dHAnDQoJCQkJCQkJOiAnaHR0cHMnOw0KCQkkaHR0cF91cmwgPSAoJGh0dHBfdXJsKSA/ICRodHRwX3VybCA6ICRzY2hlbWUgLg0KCQkJCQkJCQkJCQkJCQkJJzovLycgLiAkX1NFUlZFUlsnSFRUUF9IT1NUJ10gLg0KCQkJCQkJCQkJCQkJCQkJJzonIC4NCgkJCQkJCQkJCQkJCQkJCSRfU0VSVkVSWydTRVJWRVJfUE9SVCddIC4NCgkJCQkJCQkJCQkJCQkJCSRfU0VSVkVSWydSRVFVRVNUX1VSSSddOw0KCQkkaHR0cF9tZXRob2QgPSAoJGh0dHBfbWV0aG9kKSA/ICRodHRwX21ldGhvZCA6ICRfU0VSVkVSWydSRVFVRVNUX01FVEhPRCddOw0KDQoJCS8vIFdlIHdlcmVuJ3QgaGFuZGVkIGFueSBwYXJhbWV0ZXJzLCBzbyBsZXQncyBmaW5kIHRoZSBvbmVzIHJlbGV2YW50IHRvDQoJCS8vIHRoaXMgcmVxdWVzdC4NCgkJLy8gSWYgeW91IHJ1biBYTUwtUlBDIG9yIHNpbWlsYXIgeW91IHNob3VsZCB1c2UgdGhpcyB0byBwcm92aWRlIHlvdXIgb3duDQoJCS8vIHBhcnNlZCBwYXJhbWV0ZXItbGlzdA0KCQlpZiAoISRwYXJhbWV0ZXJzKSB7DQoJCQkvLyBGaW5kIHJlcXVlc3QgaGVhZGVycw0KCQkJJHJlcXVlc3RfaGVhZGVycyA9IE9BdXRoVXRpbDo6Z2V0X2hlYWRlcnMoKTsNCg0KCQkJLy8gUGFyc2UgdGhlIHF1ZXJ5LXN0cmluZyB0byBmaW5kIEdFVCBwYXJhbWV0ZXJzDQoJCQkkcGFyYW1ldGVycyA9IE9BdXRoVXRpbDo6cGFyc2VfcGFyYW1ldGVycygkX1NFUlZFUlsnUVVFUllfU1RSSU5HJ10pOw0KDQoJCQkvLyBJdCdzIGEgUE9TVCByZXF1ZXN0IG9mIHRoZSBwcm9wZXIgY29udGVudC10eXBlLCBzbyBwYXJzZSBQT1NUDQoJCQkvLyBwYXJhbWV0ZXJzIGFuZCBhZGQgdGhvc2Ugb3ZlcnJpZGluZyBhbnkgZHVwbGljYXRlcyBmcm9tIEdFVA0KCQkJaWYgKCRodHRwX21ldGhvZCA9PSAiUE9TVCINCgkJCQkJJiYgIGlzc2V0KCRyZXF1ZXN0X2hlYWRlcnNbJ0NvbnRlbnQtVHlwZSddKQ0KCQkJCQkmJiBzdHJzdHIoJHJlcXVlc3RfaGVhZGVyc1snQ29udGVudC1UeXBlJ10sDQoJCQkJCQkJCQkJJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcpDQoJCQkJCSkgew0KCQkJCSRwb3N0X2RhdGEgPSBPQXV0aFV0aWw6OnBhcnNlX3BhcmFtZXRlcnMoDQoJCQkJCWZpbGVfZ2V0X2NvbnRlbnRzKHNlbGY6OiRQT1NUX0lOUFVUKQ0KCQkJCSk7DQoJCQkJJHBhcmFtZXRlcnMgPSBhcnJheV9tZXJnZSgkcGFyYW1ldGVycywgJHBvc3RfZGF0YSk7DQoJCQl9DQoNCgkJCS8vIFdlIGhhdmUgYSBBdXRob3JpemF0aW9uLWhlYWRlciB3aXRoIE9BdXRoIGRhdGEuIFBhcnNlIHRoZSBoZWFkZXINCgkJCS8vIGFuZCBhZGQgdGhvc2Ugb3ZlcnJpZGluZyBhbnkgZHVwbGljYXRlcyBmcm9tIEdFVCBvciBQT1NUDQoJCQlpZiAoaXNzZXQoJHJlcXVlc3RfaGVhZGVyc1snQXV0aG9yaXphdGlvbiddKSAmJiBzdWJzdHIoJHJlcXVlc3RfaGVhZGVyc1snQXV0aG9yaXphdGlvbiddLCAwLCA2KSA9PSAnT0F1dGggJykgew0KCQkJCSRoZWFkZXJfcGFyYW1ldGVycyA9IE9BdXRoVXRpbDo6c3BsaXRfaGVhZGVyKA0KCQkJCQkkcmVxdWVzdF9oZWFkZXJzWydBdXRob3JpemF0aW9uJ10NCgkJCQkpOw0KCQkJCSRwYXJhbWV0ZXJzID0gYXJyYXlfbWVyZ2UoJHBhcmFtZXRlcnMsICRoZWFkZXJfcGFyYW1ldGVycyk7DQoJCQl9DQoNCgkJfQ0KDQoJCXJldHVybiBuZXcgT0F1dGhSZXF1ZXN0KCRodHRwX21ldGhvZCwgJGh0dHBfdXJsLCAkcGFyYW1ldGVycyk7DQoJfQ0KDQoJLyoqDQoJICogcHJldHR5IG11Y2ggYSBoZWxwZXIgZnVuY3Rpb24gdG8gc2V0IHVwIHRoZSByZXF1ZXN0DQoJICovDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmcm9tX2NvbnN1bWVyX2FuZF90b2tlbigkY29uc3VtZXIsICR0b2tlbiwgJGh0dHBfbWV0aG9kLCAkaHR0cF91cmwsICRwYXJhbWV0ZXJzPU5VTEwpIHsNCgkJJHBhcmFtZXRlcnMgPSAoJHBhcmFtZXRlcnMpID8gICRwYXJhbWV0ZXJzIDogYXJyYXkoKTsNCgkJJGRlZmF1bHRzID0gYXJyYXkoIm9hdXRoX3ZlcnNpb24iID0+IE9BdXRoUmVxdWVzdDo6JHZlcnNpb24sDQoJCQkJCQkJCQkJCSJvYXV0aF9ub25jZSIgPT4gT0F1dGhSZXF1ZXN0OjpnZW5lcmF0ZV9ub25jZSgpLA0KCQkJCQkJCQkJCQkib2F1dGhfdGltZXN0YW1wIiA9PiBPQXV0aFJlcXVlc3Q6OmdlbmVyYXRlX3RpbWVzdGFtcCgpLA0KCQkJCQkJCQkJCQkib2F1dGhfY29uc3VtZXJfa2V5IiA9PiAkY29uc3VtZXItPmtleSk7DQoJCWlmICgkdG9rZW4pDQoJCQkkZGVmYXVsdHNbJ29hdXRoX3Rva2VuJ10gPSAkdG9rZW4tPmtleTsNCg0KCQkkcGFyYW1ldGVycyA9IGFycmF5X21lcmdlKCRkZWZhdWx0cywgJHBhcmFtZXRlcnMpOw0KDQoJCXJldHVybiBuZXcgT0F1dGhSZXF1ZXN0KCRodHRwX21ldGhvZCwgJGh0dHBfdXJsLCAkcGFyYW1ldGVycyk7DQoJfQ0KDQoJcHVibGljIGZ1bmN0aW9uIHNldF9wYXJhbWV0ZXIoJG5hbWUsICR2YWx1ZSwgJGFsbG93X2R1cGxpY2F0ZXMgPSB0cnVlKSB7DQoJCWlmICgkYWxsb3dfZHVwbGljYXRlcyAmJiBpc3NldCgkdGhpcy0+cGFyYW1ldGVyc1skbmFtZV0pKSB7DQoJCQkvLyBXZSBoYXZlIGFscmVhZHkgYWRkZWQgcGFyYW1ldGVyKHMpIHdpdGggdGhpcyBuYW1lLCBzbyBhZGQgdG8gdGhlIGxpc3QNCgkJCWlmIChpc19zY2FsYXIoJHRoaXMtPnBhcmFtZXRlcnNbJG5hbWVdKSkgew0KCQkJCS8vIFRoaXMgaXMgdGhlIGZpcnN0IGR1cGxpY2F0ZSwgc28gdHJhbnNmb3JtIHNjYWxhciAoc3RyaW5nKQ0KCQkJCS8vIGludG8gYW4gYXJyYXkgc28gd2UgY2FuIGFkZCB0aGUgZHVwbGljYXRlcw0KCQkJCSR0aGlzLT5wYXJhbWV0ZXJzWyRuYW1lXSA9IGFycmF5KCR0aGlzLT5wYXJhbWV0ZXJzWyRuYW1lXSk7DQoJCQl9DQoNCgkJCSR0aGlzLT5wYXJhbWV0ZXJzWyRuYW1lXVtdID0gJHZhbHVlOw0KCQl9IGVsc2Ugew0KCQkJJHRoaXMtPnBhcmFtZXRlcnNbJG5hbWVdID0gJHZhbHVlOw0KCQl9DQoJfQ0KDQoJcHVibGljIGZ1bmN0aW9uIGdldF9wYXJhbWV0ZXIoJG5hbWUpIHsNCgkJcmV0dXJuIGlzc2V0KCR0aGlzLT5wYXJhbWV0ZXJzWyRuYW1lXSkgPyAkdGhpcy0+cGFyYW1ldGVyc1skbmFtZV0gOiBudWxsOw0KCX0NCg0KCXB1YmxpYyBmdW5jdGlvbiBnZXRfcGFyYW1ldGVycygpIHsNCgkJcmV0dXJuICR0aGlzLT5wYXJhbWV0ZXJzOw0KCX0NCg0KCXB1YmxpYyBmdW5jdGlvbiB1bnNldF9wYXJhbWV0ZXIoJG5hbWUpIHsNCgkJdW5zZXQoJHRoaXMtPnBhcmFtZXRlcnNbJG5hbWVdKTsNCgl9DQoNCgkvKioNCgkgKiBUaGUgcmVxdWVzdCBwYXJhbWV0ZXJzLCBzb3J0ZWQgYW5kIGNvbmNhdGVuYXRlZCBpbnRvIGEgbm9ybWFsaXplZCBzdHJpbmcuDQoJICogQHJldHVybiBzdHJpbmcNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gZ2V0X3NpZ25hYmxlX3BhcmFtZXRlcnMoKSB7DQoJCS8vIEdyYWIgYWxsIHBhcmFtZXRlcnMNCgkJJHBhcmFtcyA9ICR0aGlzLT5wYXJhbWV0ZXJzOw0KDQoJCS8vIFJlbW92ZSBvYXV0aF9zaWduYXR1cmUgaWYgcHJlc2VudA0KCQkvLyBSZWY6IFNwZWM6IDkuMS4xICgiVGhlIG9hdXRoX3NpZ25hdHVyZSBwYXJhbWV0ZXIgTVVTVCBiZSBleGNsdWRlZC4iKQ0KCQlpZiAoaXNzZXQoJHBhcmFtc1snb2F1dGhfc2lnbmF0dXJlJ10pKSB7DQoJCQl1bnNldCgkcGFyYW1zWydvYXV0aF9zaWduYXR1cmUnXSk7DQoJCX0NCg0KCQlyZXR1cm4gT0F1dGhVdGlsOjpidWlsZF9odHRwX3F1ZXJ5KCRwYXJhbXMpOw0KCX0NCg0KCS8qKg0KCSAqIFJldHVybnMgdGhlIGJhc2Ugc3RyaW5nIG9mIHRoaXMgcmVxdWVzdA0KCSAqDQoJICogVGhlIGJhc2Ugc3RyaW5nIGRlZmluZWQgYXMgdGhlIG1ldGhvZCwgdGhlIHVybA0KCSAqIGFuZCB0aGUgcGFyYW1ldGVycyAobm9ybWFsaXplZCksIGVhY2ggdXJsZW5jb2RlZA0KCSAqIGFuZCB0aGUgY29uY2F0ZWQgd2l0aCAmLg0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBnZXRfc2lnbmF0dXJlX2Jhc2Vfc3RyaW5nKCkgew0KCQkkcGFydHMgPSBhcnJheSgNCgkJCSR0aGlzLT5nZXRfbm9ybWFsaXplZF9odHRwX21ldGhvZCgpLA0KCQkJJHRoaXMtPmdldF9ub3JtYWxpemVkX2h0dHBfdXJsKCksDQoJCQkkdGhpcy0+Z2V0X3NpZ25hYmxlX3BhcmFtZXRlcnMoKQ0KCQkpOw0KDQoJCSRwYXJ0cyA9IE9BdXRoVXRpbDo6dXJsZW5jb2RlX3JmYzM5ODYoJHBhcnRzKTsNCg0KCQlyZXR1cm4gaW1wbG9kZSgnJicsICRwYXJ0cyk7DQoJfQ0KDQoJLyoqDQoJICoganVzdCB1cHBlcmNhc2VzIHRoZSBodHRwIG1ldGhvZA0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBnZXRfbm9ybWFsaXplZF9odHRwX21ldGhvZCgpIHsNCgkJcmV0dXJuIHN0cnRvdXBwZXIoJHRoaXMtPmh0dHBfbWV0aG9kKTsNCgl9DQoNCgkvKioNCgkgKiBwYXJzZXMgdGhlIHVybCBhbmQgcmVidWlsZHMgaXQgdG8gYmUNCgkgKiBzY2hlbWU6Ly9ob3N0L3BhdGgNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gZ2V0X25vcm1hbGl6ZWRfaHR0cF91cmwoKSB7DQoJCSRwYXJ0cyA9IHBhcnNlX3VybCgkdGhpcy0+aHR0cF91cmwpOw0KDQoJCSRzY2hlbWUgPSAoaXNzZXQoJHBhcnRzWydzY2hlbWUnXSkpID8gJHBhcnRzWydzY2hlbWUnXSA6ICdodHRwJzsNCgkJJHBvcnQgPSAoaXNzZXQoJHBhcnRzWydwb3J0J10pKSA/ICRwYXJ0c1sncG9ydCddIDogKCgkc2NoZW1lID09ICdodHRwcycpID8gJzQ0MycgOiAnODAnKTsNCgkJJGhvc3QgPSAoaXNzZXQoJHBhcnRzWydob3N0J10pKSA/ICRwYXJ0c1snaG9zdCddIDogJyc7DQoJCSRwYXRoID0gKGlzc2V0KCRwYXJ0c1sncGF0aCddKSkgPyAkcGFydHNbJ3BhdGgnXSA6ICcnOw0KDQoJCWlmICgoJHNjaGVtZSA9PSAnaHR0cHMnICYmICRwb3J0ICE9ICc0NDMnKQ0KCQkJCXx8ICgkc2NoZW1lID09ICdodHRwJyAmJiAkcG9ydCAhPSAnODAnKSkgew0KCQkJJGhvc3QgPSAiJGhvc3Q6JHBvcnQiOw0KCQl9DQoJCXJldHVybiAiJHNjaGVtZTovLyRob3N0JHBhdGgiOw0KCX0NCg0KCS8qKg0KCSAqIGJ1aWxkcyBhIHVybCB1c2FibGUgZm9yIGEgR0VUIHJlcXVlc3QNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gdG9fdXJsKCkgew0KCQkkcG9zdF9kYXRhID0gJHRoaXMtPnRvX3Bvc3RkYXRhKCk7DQoJCSRvdXQgPSAkdGhpcy0+Z2V0X25vcm1hbGl6ZWRfaHR0cF91cmwoKTsNCgkJaWYgKCRwb3N0X2RhdGEpIHsNCgkJCSRvdXQgLj0gJz8nLiRwb3N0X2RhdGE7DQoJCX0NCgkJcmV0dXJuICRvdXQ7DQoJfQ0KDQoJLyoqDQoJICogYnVpbGRzIHRoZSBkYXRhIG9uZSB3b3VsZCBzZW5kIGluIGEgUE9TVCByZXF1ZXN0DQoJICovDQoJcHVibGljIGZ1bmN0aW9uIHRvX3Bvc3RkYXRhKCkgew0KCQlyZXR1cm4gT0F1dGhVdGlsOjpidWlsZF9odHRwX3F1ZXJ5KCR0aGlzLT5wYXJhbWV0ZXJzKTsNCgl9DQoNCgkvKioNCgkgKiBidWlsZHMgdGhlIEF1dGhvcml6YXRpb246IGhlYWRlcg0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiB0b19oZWFkZXIoJHJlYWxtPW51bGwpIHsNCgkJJGZpcnN0ID0gdHJ1ZTsNCglpZigkcmVhbG0pIHsNCgkJCSRvdXQgPSAnQXV0aG9yaXphdGlvbjogT0F1dGggcmVhbG09IicgLiBPQXV0aFV0aWw6OnVybGVuY29kZV9yZmMzOTg2KCRyZWFsbSkgLiAnIic7DQoJCQkkZmlyc3QgPSBmYWxzZTsNCgkJfSBlbHNlDQoJCQkkb3V0ID0gJ0F1dGhvcml6YXRpb246IE9BdXRoJzsNCg0KCQkkdG90YWwgPSBhcnJheSgpOw0KCQlmb3JlYWNoICgkdGhpcy0+cGFyYW1ldGVycyBhcyAkayA9PiAkdikgew0KCQkJaWYgKHN1YnN0cigkaywgMCwgNSkgIT0gIm9hdXRoIikgY29udGludWU7DQoJCQlpZiAoaXNfYXJyYXkoJHYpKSB7DQoJCQkJdGhyb3cgbmV3IE9BdXRoRXhjZXB0aW9uKCdBcnJheXMgbm90IHN1cHBvcnRlZCBpbiBoZWFkZXJzJyk7DQoJCQl9DQoJCQkkb3V0IC49ICgkZmlyc3QpID8gJyAnIDogJywnOw0KCQkJJG91dCAuPSBPQXV0aFV0aWw6OnVybGVuY29kZV9yZmMzOTg2KCRrKSAuDQoJCQkJCQkJJz0iJyAuDQoJCQkJCQkJT0F1dGhVdGlsOjp1cmxlbmNvZGVfcmZjMzk4NigkdikgLg0KCQkJCQkJCSciJzsNCgkJCSRmaXJzdCA9IGZhbHNlOw0KCQl9DQoJCXJldHVybiAkb3V0Ow0KCX0NCg0KCXB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCkgew0KCQlyZXR1cm4gJHRoaXMtPnRvX3VybCgpOw0KCX0NCg0KDQoJcHVibGljIGZ1bmN0aW9uIHNpZ25fcmVxdWVzdCgkc2lnbmF0dXJlX21ldGhvZCwgJGNvbnN1bWVyLCAkdG9rZW4pIHsNCgkJJHRoaXMtPnNldF9wYXJhbWV0ZXIoDQoJCQkib2F1dGhfc2lnbmF0dXJlX21ldGhvZCIsDQoJCQkkc2lnbmF0dXJlX21ldGhvZC0+Z2V0X25hbWUoKSwNCgkJCWZhbHNlDQoJCSk7DQoJCSRzaWduYXR1cmUgPSAkdGhpcy0+YnVpbGRfc2lnbmF0dXJlKCRzaWduYXR1cmVfbWV0aG9kLCAkY29uc3VtZXIsICR0b2tlbik7DQoJCSR0aGlzLT5zZXRfcGFyYW1ldGVyKCJvYXV0aF9zaWduYXR1cmUiLCAkc2lnbmF0dXJlLCBmYWxzZSk7DQoJfQ0KDQoJcHVibGljIGZ1bmN0aW9uIGJ1aWxkX3NpZ25hdHVyZSgkc2lnbmF0dXJlX21ldGhvZCwgJGNvbnN1bWVyLCAkdG9rZW4pIHsNCgkJJHNpZ25hdHVyZSA9ICRzaWduYXR1cmVfbWV0aG9kLT5idWlsZF9zaWduYXR1cmUoJHRoaXMsICRjb25zdW1lciwgJHRva2VuKTsNCgkJcmV0dXJuICRzaWduYXR1cmU7DQoJfQ0KDQoJLyoqDQoJICogdXRpbCBmdW5jdGlvbjogY3VycmVudCB0aW1lc3RhbXANCgkgKi8NCglwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBnZW5lcmF0ZV90aW1lc3RhbXAoKSB7DQoJCXJldHVybiB0aW1lKCk7DQoJfQ0KDQoJLyoqDQoJICogdXRpbCBmdW5jdGlvbjogY3VycmVudCBub25jZQ0KCSAqLw0KCXByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGdlbmVyYXRlX25vbmNlKCkgew0KCQkkbXQgPSBtaWNyb3RpbWUoKTsNCgkJJHJhbmQgPSBtdF9yYW5kKCk7DQoNCgkJcmV0dXJuIG1kNSgkbXQgLiAkcmFuZCk7IC8vIG1kNXMgbG9vayBuaWNlciB0aGFuIG51bWJlcnMNCgl9DQp9DQoNCmNsYXNzIE9BdXRoU2VydmVyDQp7DQoJcHJvdGVjdGVkICR0aW1lc3RhbXBfdGhyZXNob2xkID0gMzAwOyAvLyBpbiBzZWNvbmRzLCBmaXZlIG1pbnV0ZXMNCglwcm90ZWN0ZWQgJHZlcnNpb24gPSAnMS4wJzsgICAgICAgICAgICAgLy8gaGkgYmxhaW5lDQoJcHJvdGVjdGVkICRzaWduYXR1cmVfbWV0aG9kcyA9IGFycmF5KCk7DQoNCglwcm90ZWN0ZWQgJGRhdGFfc3RvcmU7DQoNCglmdW5jdGlvbiBfX2NvbnN0cnVjdCgkZGF0YV9zdG9yZSkgew0KCQkkdGhpcy0+ZGF0YV9zdG9yZSA9ICRkYXRhX3N0b3JlOw0KCX0NCg0KCXB1YmxpYyBmdW5jdGlvbiBhZGRfc2lnbmF0dXJlX21ldGhvZCgkc2lnbmF0dXJlX21ldGhvZCkgew0KCQkkdGhpcy0+c2lnbmF0dXJlX21ldGhvZHNbJHNpZ25hdHVyZV9tZXRob2QtPmdldF9uYW1lKCldID0NCgkJCSRzaWduYXR1cmVfbWV0aG9kOw0KCX0NCg0KCS8vIGhpZ2ggbGV2ZWwgZnVuY3Rpb25zDQoNCgkvKioNCgkgKiBwcm9jZXNzIGEgcmVxdWVzdF90b2tlbiByZXF1ZXN0DQoJICogcmV0dXJucyB0aGUgcmVxdWVzdCB0b2tlbiBvbiBzdWNjZXNzDQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGZldGNoX3JlcXVlc3RfdG9rZW4oJiRyZXF1ZXN0KSB7DQoJCSR0aGlzLT5nZXRfdmVyc2lvbigkcmVxdWVzdCk7DQoNCgkJJGNvbnN1bWVyID0gJHRoaXMtPmdldF9jb25zdW1lcigkcmVxdWVzdCk7DQoNCgkJLy8gbm8gdG9rZW4gcmVxdWlyZWQgZm9yIHRoZSBpbml0aWFsIHRva2VuIHJlcXVlc3QNCgkJJHRva2VuID0gTlVMTDsNCg0KCQkkdGhpcy0+Y2hlY2tfc2lnbmF0dXJlKCRyZXF1ZXN0LCAkY29uc3VtZXIsICR0b2tlbik7DQoNCgkJLy8gUmV2IEEgY2hhbmdlDQoJCSRjYWxsYmFjayA9ICRyZXF1ZXN0LT5nZXRfcGFyYW1ldGVyKCdvYXV0aF9jYWxsYmFjaycpOw0KCQkkbmV3X3Rva2VuID0gJHRoaXMtPmRhdGFfc3RvcmUtPm5ld19yZXF1ZXN0X3Rva2VuKCRjb25zdW1lciwgJGNhbGxiYWNrKTsNCg0KCQlyZXR1cm4gJG5ld190b2tlbjsNCgl9DQoNCgkvKioNCgkgKiBwcm9jZXNzIGFuIGFjY2Vzc190b2tlbiByZXF1ZXN0DQoJICogcmV0dXJucyB0aGUgYWNjZXNzIHRva2VuIG9uIHN1Y2Nlc3MNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gZmV0Y2hfYWNjZXNzX3Rva2VuKCYkcmVxdWVzdCkgew0KCQkkdGhpcy0+Z2V0X3ZlcnNpb24oJHJlcXVlc3QpOw0KDQoJCSRjb25zdW1lciA9ICR0aGlzLT5nZXRfY29uc3VtZXIoJHJlcXVlc3QpOw0KDQoJCS8vIHJlcXVpcmVzIGF1dGhvcml6ZWQgcmVxdWVzdCB0b2tlbg0KCQkkdG9rZW4gPSAkdGhpcy0+Z2V0X3Rva2VuKCRyZXF1ZXN0LCAkY29uc3VtZXIsICJyZXF1ZXN0Iik7DQoNCgkJJHRoaXMtPmNoZWNrX3NpZ25hdHVyZSgkcmVxdWVzdCwgJGNvbnN1bWVyLCAkdG9rZW4pOw0KDQoJCS8vIFJldiBBIGNoYW5nZQ0KCQkkdmVyaWZpZXIgPSAkcmVxdWVzdC0+Z2V0X3BhcmFtZXRlcignb2F1dGhfdmVyaWZpZXInKTsNCgkJJG5ld190b2tlbiA9ICR0aGlzLT5kYXRhX3N0b3JlLT5uZXdfYWNjZXNzX3Rva2VuKCR0b2tlbiwgJGNvbnN1bWVyLCAkdmVyaWZpZXIpOw0KDQoJCXJldHVybiAkbmV3X3Rva2VuOw0KCX0NCg0KCS8qKg0KCSAqIHZlcmlmeSBhbiBhcGkgY2FsbCwgY2hlY2tzIGFsbCB0aGUgcGFyYW1ldGVycw0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiB2ZXJpZnlfcmVxdWVzdCgmJHJlcXVlc3QpIHsNCgkJJHRoaXMtPmdldF92ZXJzaW9uKCRyZXF1ZXN0KTsNCgkJJGNvbnN1bWVyID0gJHRoaXMtPmdldF9jb25zdW1lcigkcmVxdWVzdCk7DQoJCSR0b2tlbiA9ICR0aGlzLT5nZXRfdG9rZW4oJHJlcXVlc3QsICRjb25zdW1lciwgImFjY2VzcyIpOw0KCQkkdGhpcy0+Y2hlY2tfc2lnbmF0dXJlKCRyZXF1ZXN0LCAkY29uc3VtZXIsICR0b2tlbik7DQoJCXJldHVybiBhcnJheSgkY29uc3VtZXIsICR0b2tlbik7DQoJfQ0KDQoJLy8gSW50ZXJuYWxzIGZyb20gaGVyZQ0KCS8qKg0KCSAqIHZlcnNpb24gMQ0KCSAqLw0KCXByaXZhdGUgZnVuY3Rpb24gZ2V0X3ZlcnNpb24oJiRyZXF1ZXN0KSB7DQoJCSR2ZXJzaW9uID0gJHJlcXVlc3QtPmdldF9wYXJhbWV0ZXIoIm9hdXRoX3ZlcnNpb24iKTsNCgkJaWYgKCEkdmVyc2lvbikgew0KCQkJLy8gU2VydmljZSBQcm92aWRlcnMgTVVTVCBhc3N1bWUgdGhlIHByb3RvY29sIHZlcnNpb24gdG8gYmUgMS4wIGlmIHRoaXMgcGFyYW1ldGVyIGlzIG5vdCBwcmVzZW50Lg0KCQkJLy8gQ2hhcHRlciA3LjAgKCJBY2Nlc3NpbmcgUHJvdGVjdGVkIFJlc3NvdXJjZXMiKQ0KCQkJJHZlcnNpb24gPSAnMS4wJzsNCgkJfQ0KCQlpZiAoJHZlcnNpb24gIT09ICR0aGlzLT52ZXJzaW9uKSB7DQoJCQl0aHJvdyBuZXcgT0F1dGhFeGNlcHRpb24oIk9BdXRoIHZlcnNpb24gJyR2ZXJzaW9uJyBub3Qgc3VwcG9ydGVkIik7DQoJCX0NCgkJcmV0dXJuICR2ZXJzaW9uOw0KCX0NCg0KCS8qKg0KCSAqIGZpZ3VyZSBvdXQgdGhlIHNpZ25hdHVyZSB3aXRoIHNvbWUgZGVmYXVsdHMNCgkgKi8NCglwcml2YXRlIGZ1bmN0aW9uIGdldF9zaWduYXR1cmVfbWV0aG9kKCRyZXF1ZXN0KSB7DQoJCSRzaWduYXR1cmVfbWV0aG9kID0gJHJlcXVlc3QgaW5zdGFuY2VvZiBPQXV0aFJlcXVlc3QNCgkJCQk/ICRyZXF1ZXN0LT5nZXRfcGFyYW1ldGVyKCJvYXV0aF9zaWduYXR1cmVfbWV0aG9kIikNCgkJCQk6IE5VTEw7DQoNCgkJaWYgKCEkc2lnbmF0dXJlX21ldGhvZCkgew0KCQkJLy8gQWNjb3JkaW5nIHRvIGNoYXB0ZXIgNyAoIkFjY2Vzc2luZyBQcm90ZWN0ZWQgUmVzc291cmNlcyIpIHRoZSBzaWduYXR1cmUtbWV0aG9kDQoJCQkvLyBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQsIGFuZCB3ZSBjYW4ndCBqdXN0IGZhbGxiYWNrIHRvIFBMQUlOVEVYVA0KCQkJdGhyb3cgbmV3IE9BdXRoRXhjZXB0aW9uKCdObyBzaWduYXR1cmUgbWV0aG9kIHBhcmFtZXRlci4gVGhpcyBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQnKTsNCgkJfQ0KDQoJCWlmICghaW5fYXJyYXkoJHNpZ25hdHVyZV9tZXRob2QsDQoJCQkJCQkJCQlhcnJheV9rZXlzKCR0aGlzLT5zaWduYXR1cmVfbWV0aG9kcykpKSB7DQoJCQl0aHJvdyBuZXcgT0F1dGhFeGNlcHRpb24oDQoJCQkJIlNpZ25hdHVyZSBtZXRob2QgJyRzaWduYXR1cmVfbWV0aG9kJyBub3Qgc3VwcG9ydGVkICIgLg0KCQkJCSJ0cnkgb25lIG9mIHRoZSBmb2xsb3dpbmc6ICIgLg0KCQkJCWltcGxvZGUoIiwgIiwgYXJyYXlfa2V5cygkdGhpcy0+c2lnbmF0dXJlX21ldGhvZHMpKQ0KCQkJKTsNCgkJfQ0KCQlyZXR1cm4gJHRoaXMtPnNpZ25hdHVyZV9tZXRob2RzWyRzaWduYXR1cmVfbWV0aG9kXTsNCgl9DQoNCgkvKioNCgkgKiB0cnkgdG8gZmluZCB0aGUgY29uc3VtZXIgZm9yIHRoZSBwcm92aWRlZCByZXF1ZXN0J3MgY29uc3VtZXIga2V5DQoJICovDQoJcHJpdmF0ZSBmdW5jdGlvbiBnZXRfY29uc3VtZXIoJHJlcXVlc3QpIHsNCgkJJGNvbnN1bWVyX2tleSA9ICRyZXF1ZXN0IGluc3RhbmNlb2YgT0F1dGhSZXF1ZXN0DQoJCQkJPyAkcmVxdWVzdC0+Z2V0X3BhcmFtZXRlcigib2F1dGhfY29uc3VtZXJfa2V5IikNCgkJCQk6IE5VTEw7DQoNCgkJaWYgKCEkY29uc3VtZXJfa2V5KSB7DQoJCQl0aHJvdyBuZXcgT0F1dGhFeGNlcHRpb24oIkludmFsaWQgY29uc3VtZXIga2V5Iik7DQoJCX0NCg0KCQkkY29uc3VtZXIgPSAkdGhpcy0+ZGF0YV9zdG9yZS0+bG9va3VwX2NvbnN1bWVyKCRjb25zdW1lcl9rZXkpOw0KCQlpZiAoISRjb25zdW1lcikgew0KCQkJdGhyb3cgbmV3IE9BdXRoRXhjZXB0aW9uKCJJbnZhbGlkIGNvbnN1bWVyIik7DQoJCX0NCg0KCQlyZXR1cm4gJGNvbnN1bWVyOw0KCX0NCg0KCS8qKg0KCSAqIHRyeSB0byBmaW5kIHRoZSB0b2tlbiBmb3IgdGhlIHByb3ZpZGVkIHJlcXVlc3QncyB0b2tlbiBrZXkNCgkgKi8NCglwcml2YXRlIGZ1bmN0aW9uIGdldF90b2tlbigkcmVxdWVzdCwgJGNvbnN1bWVyLCAkdG9rZW5fdHlwZT0iYWNjZXNzIikgew0KCQkkdG9rZW5fZmllbGQgPSAkcmVxdWVzdCBpbnN0YW5jZW9mIE9BdXRoUmVxdWVzdA0KCQkJCT8gJHJlcXVlc3QtPmdldF9wYXJhbWV0ZXIoJ29hdXRoX3Rva2VuJykNCgkJCQk6IE5VTEw7DQoNCgkJJHRva2VuID0gJHRoaXMtPmRhdGFfc3RvcmUtPmxvb2t1cF90b2tlbigNCgkJCSRjb25zdW1lciwgJHRva2VuX3R5cGUsICR0b2tlbl9maWVsZA0KCQkpOw0KCQlpZiAoISR0b2tlbikgew0KCQkJdGhyb3cgbmV3IE9BdXRoRXhjZXB0aW9uKCJJbnZhbGlkICR0b2tlbl90eXBlIHRva2VuOiAkdG9rZW5fZmllbGQiKTsNCgkJfQ0KCQlyZXR1cm4gJHRva2VuOw0KCX0NCg0KCS8qKg0KCSAqIGFsbC1pbi1vbmUgZnVuY3Rpb24gdG8gY2hlY2sgdGhlIHNpZ25hdHVyZSBvbiBhIHJlcXVlc3QNCgkgKiBzaG91bGQgZ3Vlc3MgdGhlIHNpZ25hdHVyZSBtZXRob2QgYXBwcm9wcmlhdGVseQ0KCSAqLw0KCXByaXZhdGUgZnVuY3Rpb24gY2hlY2tfc2lnbmF0dXJlKCRyZXF1ZXN0LCAkY29uc3VtZXIsICR0b2tlbikgew0KCQkvLyB0aGlzIHNob3VsZCBwcm9iYWJseSBiZSBpbiBhIGRpZmZlcmVudCBtZXRob2QNCgkJJHRpbWVzdGFtcCA9ICRyZXF1ZXN0IGluc3RhbmNlb2YgT0F1dGhSZXF1ZXN0DQoJCQkJPyAkcmVxdWVzdC0+Z2V0X3BhcmFtZXRlcignb2F1dGhfdGltZXN0YW1wJykNCgkJCQk6IE5VTEw7DQoJCSRub25jZSA9ICRyZXF1ZXN0IGluc3RhbmNlb2YgT0F1dGhSZXF1ZXN0DQoJCQkJPyAkcmVxdWVzdC0+Z2V0X3BhcmFtZXRlcignb2F1dGhfbm9uY2UnKQ0KCQkJCTogTlVMTDsNCg0KCQkkdGhpcy0+Y2hlY2tfdGltZXN0YW1wKCR0aW1lc3RhbXApOw0KCQkkdGhpcy0+Y2hlY2tfbm9uY2UoJGNvbnN1bWVyLCAkdG9rZW4sICRub25jZSwgJHRpbWVzdGFtcCk7DQoNCgkJJHNpZ25hdHVyZV9tZXRob2QgPSAkdGhpcy0+Z2V0X3NpZ25hdHVyZV9tZXRob2QoJHJlcXVlc3QpOw0KDQoJCSRzaWduYXR1cmUgPSAkcmVxdWVzdC0+Z2V0X3BhcmFtZXRlcignb2F1dGhfc2lnbmF0dXJlJyk7DQoJCSR2YWxpZF9zaWcgPSAkc2lnbmF0dXJlX21ldGhvZC0+Y2hlY2tfc2lnbmF0dXJlKA0KCQkJJHJlcXVlc3QsDQoJCQkkY29uc3VtZXIsDQoJCQkkdG9rZW4sDQoJCQkkc2lnbmF0dXJlDQoJCSk7DQoNCgkJaWYgKCEkdmFsaWRfc2lnKSB7DQoJCQl0aHJvdyBuZXcgT0F1dGhFeGNlcHRpb24oIkludmFsaWQgc2lnbmF0dXJlIik7DQoJCX0NCgl9DQoNCgkvKioNCgkgKiBjaGVjayB0aGF0IHRoZSB0aW1lc3RhbXAgaXMgbmV3IGVub3VnaA0KCSAqLw0KCXByaXZhdGUgZnVuY3Rpb24gY2hlY2tfdGltZXN0YW1wKCR0aW1lc3RhbXApIHsNCgkJaWYoICEgJHRpbWVzdGFtcCApDQoJCQl0aHJvdyBuZXcgT0F1dGhFeGNlcHRpb24oDQoJCQkJJ01pc3NpbmcgdGltZXN0YW1wIHBhcmFtZXRlci4gVGhlIHBhcmFtZXRlciBpcyByZXF1aXJlZCcNCgkJCSk7DQoNCgkJLy8gdmVyaWZ5IHRoYXQgdGltZXN0YW1wIGlzIHJlY2VudGlzaA0KCQkkbm93ID0gdGltZSgpOw0KCQlpZiAoYWJzKCRub3cgLSAkdGltZXN0YW1wKSA+ICR0aGlzLT50aW1lc3RhbXBfdGhyZXNob2xkKSB7DQoJCQl0aHJvdyBuZXcgT0F1dGhFeGNlcHRpb24oDQoJCQkJIkV4cGlyZWQgdGltZXN0YW1wLCB5b3VycyAkdGltZXN0YW1wLCBvdXJzICRub3ciDQoJCQkpOw0KCQl9DQoJfQ0KDQoJLyoqDQoJICogY2hlY2sgdGhhdCB0aGUgbm9uY2UgaXMgbm90IHJlcGVhdGVkDQoJICovDQoJcHJpdmF0ZSBmdW5jdGlvbiBjaGVja19ub25jZSgkY29uc3VtZXIsICR0b2tlbiwgJG5vbmNlLCAkdGltZXN0YW1wKSB7DQoJCWlmKCAhICRub25jZSApDQoJCQl0aHJvdyBuZXcgT0F1dGhFeGNlcHRpb24oDQoJCQkJJ01pc3Npbmcgbm9uY2UgcGFyYW1ldGVyLiBUaGUgcGFyYW1ldGVyIGlzIHJlcXVpcmVkJw0KCQkJKTsNCg0KCQkvLyB2ZXJpZnkgdGhhdCB0aGUgbm9uY2UgaXMgdW5pcXVlaXNoDQoJCSRmb3VuZCA9ICR0aGlzLT5kYXRhX3N0b3JlLT5sb29rdXBfbm9uY2UoDQoJCQkkY29uc3VtZXIsDQoJCQkkdG9rZW4sDQoJCQkkbm9uY2UsDQoJCQkkdGltZXN0YW1wDQoJCSk7DQoJCWlmICgkZm91bmQpIHsNCgkJCXRocm93IG5ldyBPQXV0aEV4Y2VwdGlvbigiTm9uY2UgYWxyZWFkeSB1c2VkOiAkbm9uY2UiKTsNCgkJfQ0KCX0NCg0KfQ0KDQpjbGFzcyBPQXV0aERhdGFTdG9yZQ0Kew0KCWZ1bmN0aW9uIGxvb2t1cF9jb25zdW1lcigkY29uc3VtZXJfa2V5KSB7DQoJCS8vIGltcGxlbWVudCBtZQ0KCX0NCg0KCWZ1bmN0aW9uIGxvb2t1cF90b2tlbigkY29uc3VtZXIsICR0b2tlbl90eXBlLCAkdG9rZW4pIHsNCgkJLy8gaW1wbGVtZW50IG1lDQoJfQ0KDQoJZnVuY3Rpb24gbG9va3VwX25vbmNlKCRjb25zdW1lciwgJHRva2VuLCAkbm9uY2UsICR0aW1lc3RhbXApIHsNCgkJLy8gaW1wbGVtZW50IG1lDQoJfQ0KDQoJZnVuY3Rpb24gbmV3X3JlcXVlc3RfdG9rZW4oJGNvbnN1bWVyLCAkY2FsbGJhY2sgPSBudWxsKSB7DQoJCS8vIHJldHVybiBhIG5ldyB0b2tlbiBhdHRhY2hlZCB0byB0aGlzIGNvbnN1bWVyDQoJfQ0KDQoJZnVuY3Rpb24gbmV3X2FjY2Vzc190b2tlbigkdG9rZW4sICRjb25zdW1lciwgJHZlcmlmaWVyID0gbnVsbCkgew0KCQkvLyByZXR1cm4gYSBuZXcgYWNjZXNzIHRva2VuIGF0dGFjaGVkIHRvIHRoaXMgY29uc3VtZXINCgkJLy8gZm9yIHRoZSB1c2VyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRva2VuIGlmIHRoZSByZXF1ZXN0IHRva2VuDQoJCS8vIGlzIGF1dGhvcml6ZWQNCgkJLy8gc2hvdWxkIGFsc28gaW52YWxpZGF0ZSB0aGUgcmVxdWVzdCB0b2tlbg0KCX0NCg0KfQ0KDQpjbGFzcyBPQXV0aFV0aWwNCnsNCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHVybGVuY29kZV9yZmMzOTg2KCRpbnB1dCkgew0KCQlpZiAoaXNfYXJyYXkoJGlucHV0KSkgew0KCQkJcmV0dXJuIGFycmF5X21hcChhcnJheSgnT0F1dGhVdGlsJywgJ3VybGVuY29kZV9yZmMzOTg2JyksICRpbnB1dCk7DQoJCX0gZWxzZSBpZiAoaXNfc2NhbGFyKCRpbnB1dCkpIHsNCgkJCXJldHVybiBzdHJfcmVwbGFjZSgNCgkJCQknKycsDQoJCQkJJyAnLA0KCQkJCXN0cl9yZXBsYWNlKCclN0UnLCAnficsIHJhd3VybGVuY29kZSgkaW5wdXQpKQ0KCQkJKTsNCgkJfSBlbHNlIHsNCgkJCXJldHVybiAnJzsNCgkJfQ0KCX0NCg0KDQoJLy8gVGhpcyBkZWNvZGUgZnVuY3Rpb24gaXNuJ3QgdGFraW5nIGludG8gY29uc2lkZXJhdGlvbiB0aGUgYWJvdmUNCgkvLyBtb2RpZmljYXRpb25zIHRvIHRoZSBlbmNvZGluZyBwcm9jZXNzLiBIb3dldmVyLCB0aGlzIG1ldGhvZCBkb2Vzbid0DQoJLy8gc2VlbSB0byBiZSB1c2VkIGFueXdoZXJlIHNvIGxlYXZpbmcgaXQgYXMgaXMuDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiB1cmxkZWNvZGVfcmZjMzk4Nigkc3RyaW5nKSB7DQoJCXJldHVybiB1cmxkZWNvZGUoJHN0cmluZyk7DQoJfQ0KDQoJLy8gVXRpbGl0eSBmdW5jdGlvbiBmb3IgdHVybmluZyB0aGUgQXV0aG9yaXphdGlvbjogaGVhZGVyIGludG8NCgkvLyBwYXJhbWV0ZXJzLCBoYXMgdG8gZG8gc29tZSB1bmVzY2FwaW5nDQoJLy8gQ2FuIGZpbHRlciBvdXQgYW55IG5vbi1vYXV0aCBwYXJhbWV0ZXJzIGlmIG5lZWRlZCAoZGVmYXVsdCBiZWhhdmlvdXIpDQoJLy8gTWF5IDI4dGgsIDIwMTAgLSBtZXRob2QgdXBkYXRlZCB0byB0amVyay5tZWVzdGVycyBmb3IgYSBzcGVlZCBpbXByb3ZlbWVudC4NCgkvLyAgICAgICAgICAgICAgICAgIHNlZSBodHRwOi8vY29kZS5nb29nbGUuY29tL3Avb2F1dGgvaXNzdWVzL2RldGFpbD9pZD0xNjMNCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNwbGl0X2hlYWRlcigkaGVhZGVyLCAkb25seV9hbGxvd19vYXV0aF9wYXJhbWV0ZXJzID0gdHJ1ZSkgew0KCQkkcGFyYW1zID0gYXJyYXkoKTsNCgkJaWYgKHByZWdfbWF0Y2hfYWxsKCcvKCcuKCRvbmx5X2FsbG93X29hdXRoX3BhcmFtZXRlcnMgPyAnb2F1dGhfJyA6ICcnKS4nW2Etel8tXSopPSg6PyIoW14iXSopInwoW14sXSopKS8nLCAkaGVhZGVyLCAkbWF0Y2hlcykpIHsNCgkJCWZvcmVhY2ggKCRtYXRjaGVzWzFdIGFzICRpID0+ICRoKSB7DQoJCQkJJHBhcmFtc1skaF0gPSBPQXV0aFV0aWw6OnVybGRlY29kZV9yZmMzOTg2KGVtcHR5KCRtYXRjaGVzWzNdWyRpXSkgPyAkbWF0Y2hlc1s0XVskaV0gOiAkbWF0Y2hlc1szXVskaV0pOw0KCQkJfQ0KCQkJaWYgKGlzc2V0KCRwYXJhbXNbJ3JlYWxtJ10pKSB7DQoJCQkJdW5zZXQoJHBhcmFtc1sncmVhbG0nXSk7DQoJCQl9DQoJCX0NCgkJcmV0dXJuICRwYXJhbXM7DQoJfQ0KDQoJLy8gaGVscGVyIHRvIHRyeSB0byBzb3J0IG91dCBoZWFkZXJzIGZvciBwZW9wbGUgd2hvIGFyZW4ndCBydW5uaW5nIGFwYWNoZQ0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0X2hlYWRlcnMoKSB7DQoJCWlmIChmdW5jdGlvbl9leGlzdHMoJ2FwYWNoZV9yZXF1ZXN0X2hlYWRlcnMnKSkgew0KCQkJLy8gd2UgbmVlZCB0aGlzIHRvIGdldCB0aGUgYWN0dWFsIEF1dGhvcml6YXRpb246IGhlYWRlcg0KCQkJLy8gYmVjYXVzZSBhcGFjaGUgdGVuZHMgdG8gdGVsbCB1cyBpdCBkb2Vzbid0IGV4aXN0DQoJCQkkaGVhZGVycyA9IGFwYWNoZV9yZXF1ZXN0X2hlYWRlcnMoKTsNCg0KCQkJLy8gc2FuaXRpemUgdGhlIG91dHB1dCBvZiBhcGFjaGVfcmVxdWVzdF9oZWFkZXJzIGJlY2F1c2UNCgkJCS8vIHdlIGFsd2F5cyB3YW50IHRoZSBrZXlzIHRvIGJlIENhc2VkLUxpa2UtVGhpcyBhbmQgYXJoKCkNCgkJCS8vIHJldHVybnMgdGhlIGhlYWRlcnMgaW4gdGhlIHNhbWUgY2FzZSBhcyB0aGV5IGFyZSBpbiB0aGUNCgkJCS8vIHJlcXVlc3QNCgkJCSRvdXQgPSBhcnJheSgpOw0KCQkJZm9yZWFjaCAoJGhlYWRlcnMgQVMgJGtleSA9PiAkdmFsdWUpIHsNCgkJCQkka2V5ID0gc3RyX3JlcGxhY2UoDQoJCQkJCQkiICIsDQoJCQkJCQkiLSIsDQoJCQkJCQl1Y3dvcmRzKHN0cnRvbG93ZXIoc3RyX3JlcGxhY2UoIi0iLCAiICIsICRrZXkpKSkNCgkJCQkJKTsNCgkJCQkkb3V0WyRrZXldID0gJHZhbHVlOw0KCQkJfQ0KCQl9IGVsc2Ugew0KCQkJLy8gb3RoZXJ3aXNlIHdlIGRvbid0IGhhdmUgYXBhY2hlIGFuZCBhcmUganVzdCBnb2luZyB0byBoYXZlIHRvIGhvcGUNCgkJCS8vIHRoYXQgJF9TRVJWRVIgYWN0dWFsbHkgY29udGFpbnMgd2hhdCB3ZSBuZWVkDQoJCQkkb3V0ID0gYXJyYXkoKTsNCgkJCWlmKCBpc3NldCgkX1NFUlZFUlsnQ09OVEVOVF9UWVBFJ10pICkNCgkJCQkkb3V0WydDb250ZW50LVR5cGUnXSA9ICRfU0VSVkVSWydDT05URU5UX1RZUEUnXTsNCgkJCWlmKCBpc3NldCgkX0VOVlsnQ09OVEVOVF9UWVBFJ10pICkNCgkJCQkkb3V0WydDb250ZW50LVR5cGUnXSA9ICRfRU5WWydDT05URU5UX1RZUEUnXTsNCg0KCQkJZm9yZWFjaCAoJF9TRVJWRVIgYXMgJGtleSA9PiAkdmFsdWUpIHsNCgkJCQlpZiAoc3Vic3RyKCRrZXksIDAsIDUpID09ICJIVFRQXyIpIHsNCgkJCQkJLy8gdGhpcyBpcyBjaGFvcywgYmFzaWNhbGx5IGl0IGlzIGp1c3QgdGhlcmUgdG8gY2FwaXRhbGl6ZSB0aGUgZmlyc3QNCgkJCQkJLy8gbGV0dGVyIG9mIGV2ZXJ5IHdvcmQgdGhhdCBpcyBub3QgYW4gaW5pdGlhbCBIVFRQIGFuZCBzdHJpcCBIVFRQDQoJCQkJCS8vIGNvZGUgZnJvbSBwcnplbWVrDQoJCQkJCSRrZXkgPSBzdHJfcmVwbGFjZSgNCgkJCQkJCSIgIiwNCgkJCQkJCSItIiwNCgkJCQkJCXVjd29yZHMoc3RydG9sb3dlcihzdHJfcmVwbGFjZSgiXyIsICIgIiwgc3Vic3RyKCRrZXksIDUpKSkpDQoJCQkJCSk7DQoJCQkJCSRvdXRbJGtleV0gPSAkdmFsdWU7DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJCXJldHVybiAkb3V0Ow0KCX0NCg0KCS8vIFRoaXMgZnVuY3Rpb24gdGFrZXMgYSBpbnB1dCBsaWtlIGE9YiZhPWMmZD1lIGFuZCByZXR1cm5zIHRoZSBwYXJzZWQNCgkvLyBwYXJhbWV0ZXJzIGxpa2UgdGhpcw0KCS8vIGFycmF5KCdhJyA9PiBhcnJheSgnYicsJ2MnKSwgJ2QnID0+ICdlJykNCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHBhcnNlX3BhcmFtZXRlcnMoICRpbnB1dCApIHsNCgkJaWYgKCFpc3NldCgkaW5wdXQpIHx8ICEkaW5wdXQpIHJldHVybiBhcnJheSgpOw0KDQoJCSRwYWlycyA9IGV4cGxvZGUoJyYnLCAkaW5wdXQpOw0KDQoJCSRwYXJzZWRfcGFyYW1ldGVycyA9IGFycmF5KCk7DQoJCWZvcmVhY2ggKCRwYWlycyBhcyAkcGFpcikgew0KCQkJJHNwbGl0ID0gZXhwbG9kZSgnPScsICRwYWlyLCAyKTsNCgkJCSRwYXJhbWV0ZXIgPSBPQXV0aFV0aWw6OnVybGRlY29kZV9yZmMzOTg2KCRzcGxpdFswXSk7DQoJCQkkdmFsdWUgPSBpc3NldCgkc3BsaXRbMV0pID8gT0F1dGhVdGlsOjp1cmxkZWNvZGVfcmZjMzk4Nigkc3BsaXRbMV0pIDogJyc7DQoNCgkJCWlmIChpc3NldCgkcGFyc2VkX3BhcmFtZXRlcnNbJHBhcmFtZXRlcl0pKSB7DQoJCQkJLy8gV2UgaGF2ZSBhbHJlYWR5IHJlY2lldmVkIHBhcmFtZXRlcihzKSB3aXRoIHRoaXMgbmFtZSwgc28gYWRkIHRvIHRoZSBsaXN0DQoJCQkJLy8gb2YgcGFyYW1ldGVycyB3aXRoIHRoaXMgbmFtZQ0KDQoJCQkJaWYgKGlzX3NjYWxhcigkcGFyc2VkX3BhcmFtZXRlcnNbJHBhcmFtZXRlcl0pKSB7DQoJCQkJCS8vIFRoaXMgaXMgdGhlIGZpcnN0IGR1cGxpY2F0ZSwgc28gdHJhbnNmb3JtIHNjYWxhciAoc3RyaW5nKSBpbnRvIGFuIGFycmF5DQoJCQkJCS8vIHNvIHdlIGNhbiBhZGQgdGhlIGR1cGxpY2F0ZXMNCgkJCQkJJHBhcnNlZF9wYXJhbWV0ZXJzWyRwYXJhbWV0ZXJdID0gYXJyYXkoJHBhcnNlZF9wYXJhbWV0ZXJzWyRwYXJhbWV0ZXJdKTsNCgkJCQl9DQoNCgkJCQkkcGFyc2VkX3BhcmFtZXRlcnNbJHBhcmFtZXRlcl1bXSA9ICR2YWx1ZTsNCgkJCX0gZWxzZSB7DQoJCQkJJHBhcnNlZF9wYXJhbWV0ZXJzWyRwYXJhbWV0ZXJdID0gJHZhbHVlOw0KCQkJfQ0KCQl9DQoJCXJldHVybiAkcGFyc2VkX3BhcmFtZXRlcnM7DQoJfQ0KDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBidWlsZF9odHRwX3F1ZXJ5KCRwYXJhbXMpIHsNCgkJaWYgKCEkcGFyYW1zKSByZXR1cm4gJyc7DQoNCgkJLy8gVXJsZW5jb2RlIGJvdGgga2V5cyBhbmQgdmFsdWVzDQoJCSRrZXlzID0gT0F1dGhVdGlsOjp1cmxlbmNvZGVfcmZjMzk4NihhcnJheV9rZXlzKCRwYXJhbXMpKTsNCgkJJHZhbHVlcyA9IE9BdXRoVXRpbDo6dXJsZW5jb2RlX3JmYzM5ODYoYXJyYXlfdmFsdWVzKCRwYXJhbXMpKTsNCgkJJHBhcmFtcyA9IGFycmF5X2NvbWJpbmUoJGtleXMsICR2YWx1ZXMpOw0KDQoJCS8vIFBhcmFtZXRlcnMgYXJlIHNvcnRlZCBieSBuYW1lLCB1c2luZyBsZXhpY29ncmFwaGljYWwgYnl0ZSB2YWx1ZSBvcmRlcmluZy4NCgkJLy8gUmVmOiBTcGVjOiA5LjEuMSAoMSkNCgkJdWtzb3J0KCRwYXJhbXMsICdzdHJjbXAnKTsNCg0KCQkkcGFpcnMgPSBhcnJheSgpOw0KCQlmb3JlYWNoICgkcGFyYW1zIGFzICRwYXJhbWV0ZXIgPT4gJHZhbHVlKSB7DQoJCQlpZiAoaXNfYXJyYXkoJHZhbHVlKSkgew0KCQkJCS8vIElmIHR3byBvciBtb3JlIHBhcmFtZXRlcnMgc2hhcmUgdGhlIHNhbWUgbmFtZSwgdGhleSBhcmUgc29ydGVkIGJ5IHRoZWlyIHZhbHVlDQoJCQkJLy8gUmVmOiBTcGVjOiA5LjEuMSAoMSkNCgkJCQkvLyBKdW5lIDEydGgsIDIwMTAgLSBjaGFuZ2VkIHRvIHNvcnQgYmVjYXVzZSBvZiBpc3N1ZSAxNjQgYnkgaGlkZXRha2ENCgkJCQlzb3J0KCR2YWx1ZSwgU09SVF9TVFJJTkcpOw0KCQkJCWZvcmVhY2ggKCR2YWx1ZSBhcyAkZHVwbGljYXRlX3ZhbHVlKSB7DQoJCQkJCSRwYWlyc1tdID0gJHBhcmFtZXRlciAuICc9JyAuICRkdXBsaWNhdGVfdmFsdWU7DQoJCQkJfQ0KCQkJfSBlbHNlIHsNCgkJCQkkcGFpcnNbXSA9ICRwYXJhbWV0ZXIgLiAnPScgLiAkdmFsdWU7DQoJCQl9DQoJCX0NCgkJLy8gRm9yIGVhY2ggcGFyYW1ldGVyLCB0aGUgbmFtZSBpcyBzZXBhcmF0ZWQgZnJvbSB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBieSBhbiAnPScgY2hhcmFjdGVyIChBU0NJSSBjb2RlIDYxKQ0KCQkvLyBFYWNoIG5hbWUtdmFsdWUgcGFpciBpcyBzZXBhcmF0ZWQgYnkgYW4gJyYnIGNoYXJhY3RlciAoQVNDSUkgY29kZSAzOCkNCgkJcmV0dXJuIGltcGxvZGUoJyYnLCAkcGFpcnMpOw0KCX0NCn0NCg==]]></data>
	</file>
	<file>
	  <filename>/MediaCenter.module.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgTW9kdWxlOiBNZWRpYUNlbnRlcgojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykKIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZwojIFRoZSBtb2R1bGUncyBob21lcGFnZSBpczogaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy9wcm9qZWN0cy9tZWRpYWNlbnRlci8KIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmlmICghaXNzZXQoJGdDbXMpKQogICAgZXhpdDsKCiRjZ2V4dGVuc2lvbnMgPSBjbXNfam9pbl9wYXRoKCRnQ21zLT5jb25maWdbJ3Jvb3RfcGF0aCddLCAnbW9kdWxlcycsCiAgICAgICAgICAgICAgICAnQ0dFeHRlbnNpb25zJywgJ0NHRXh0ZW5zaW9ucy5tb2R1bGUucGhwJyk7CmlmICghaXNfcmVhZGFibGUoJGNnZXh0ZW5zaW9ucykpIHsKICAgIGVjaG8gJzxoMT48Zm9udCBjb2xvcj0icmVkIj5FUlJPUjogVGhlIENHRXh0ZW5zaW9ucyBtb2R1bGUgY291bGQgbm90IGJlIGZvdW5kLjwvZm9udD48L2gxPic7CiAgICByZXR1cm47Cn0KcmVxdWlyZV9vbmNlKCRjZ2V4dGVuc2lvbnMpOwoKJG5ldHRlbG9hZGVyID0gY21zX2pvaW5fcGF0aChkaXJuYW1lKF9fRklMRV9fKSAuICIvbGliL2xvYWRlci5waHAiKTsKcmVxdWlyZV9vbmNlKCRuZXR0ZWxvYWRlcik7CgpkZWZpbmUoJ01FRElBQ0VOVEVSX1BSRUZfTkVXTUVESUFDRU5URVJfVEVNUExBVEUnLCAnbWVkaWFjZW50ZXJfcHJlZl9uZXdtZWRpYWNlbnRlcl90ZW1wbGF0ZScpOwpkZWZpbmUoJ01FRElBQ0VOVEVSX1BSRUZfTkVXTUVESUFDRU5URVJfVEVNUExBVEUnLCAnbWVkaWFjZW50ZXJfcHJlZl9kZmx0bWVkaWFjZW50ZXJfdGVtcGxhdGUnKTsKCmNsYXNzIE1lZGlhQ2VudGVyIGV4dGVuZHMgQ0dFeHRlbnNpb25zIHsKCiAgICB2YXIgJHR5cGU7CiAgICB2YXIgJGxpbWl0OwogICAgdmFyICRfaW5pdF9jYWNoZSA9IGZhbHNlOwoKICAgIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkgewogICAgICAvLyAgc3BsX2F1dG9sb2FkX3JlZ2lzdGVyKGFycmF5KCR0aGlzLCAnYXV0b2xvYWQnKSk7CiAgICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgpOwogICAgfQoKICAvKiAgcHVibGljIGZ1bmN0aW9uIGF1dG9sb2FkKCRjbGFzc25hbWUpIHsKICAgICAgICBpZiAoIWlzX29iamVjdCgkdGhpcykpCiAgICAgICAgICAgIHJldHVybiBGQUxTRTsKCiAgICAgICAgLy8gY2hlY2sgZm9yIGNsYXNzZXMuCiAgICAgICAgJGZuID0gJHRoaXMtPkdldE1vZHVsZVBhdGgoKSAuICIvbGliL3skY2xhc3NuYW1lfS5jbGFzcy5waHAiOwogICAgICAgIGlmIChmaWxlX2V4aXN0cygkZm4pKSB7CiAgICAgICAgICAgIHJlcXVpcmVfb25jZSgkZm4pOwogICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgfSovCgogICAgZnVuY3Rpb24gR2V0TmFtZSgpIHsKICAgICAgICByZXR1cm4gJ01lZGlhQ2VudGVyJzsKICAgIH0KCiAgICBmdW5jdGlvbiBHZXRGcmllbmRseU5hbWUoKSB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5MYW5nKCdmcmllbmRseW5hbWUnKTsKICAgIH0KCiAgICBmdW5jdGlvbiBHZXRWZXJzaW9uKCkgewogICAgICAgIHJldHVybiAnMC4zJzsKICAgIH0KCiAgICBmdW5jdGlvbiBHZXRIZWxwKCkgewogICAgICAgIHJldHVybiAkdGhpcy0+TGFuZygnaGVscCcpOwogICAgfQoKICAgIGZ1bmN0aW9uIEdldEF1dGhvcigpIHsKICAgICAgICByZXR1cm4gJ0t1em1hbnknOwogICAgfQoKICAgIGZ1bmN0aW9uIEdldEF1dGhvckVtYWlsKCkgewogICAgICAgIHJldHVybiAnemRlbm9Aa3V6bWFueS5iaXonOwogICAgfQoKICAgIGZ1bmN0aW9uIEdldENoYW5nZUxvZygpIHsKICAgICAgICByZXR1cm4gJHRoaXMtPkxhbmcoJ2NoYW5nZWxvZycpOwogICAgfQoKICAgIGZ1bmN0aW9uIElzUGx1Z2luTW9kdWxlKCkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIGZ1bmN0aW9uIEhhc0FkbWluKCkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIGZ1bmN0aW9uIEdldEFkbWluU2VjdGlvbigpIHsKICAgICAgICByZXR1cm4gJ2V4dGVuc2lvbnMnOwogICAgfQoKICAgIGZ1bmN0aW9uIEdldEFkbWluRGVzY3JpcHRpb24oKSB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5MYW5nKCdtb2RkZXNjcmlwdGlvbicpOwogICAgfQoKICAgIGZ1bmN0aW9uIFZpc2libGVUb0FkbWluVXNlcigpIHsKICAgICAgICByZXR1cm4gJHRoaXMtPkNoZWNrUGVybWlzc2lvbignVXNlIE1lZGlhIENlbnRlcicpOwogICAgfQoKICAgIGZ1bmN0aW9uIEdldERlcGVuZGVuY2llcygpIHsKICAgICAgICByZXR1cm4gYXJyYXkoJ0NHRXh0ZW5zaW9ucycgPT4gJzEuMTgnKTsKICAgIH0KCiAgICBmdW5jdGlvbiBNaW5pbXVtQ01TVmVyc2lvbigpIHsKICAgICAgICByZXR1cm4gIjEuOCI7CiAgICB9CgogICAgZnVuY3Rpb24gU2V0UGFyYW1ldGVycygpIHsKCiAgICAgICAgJHRoaXMtPlJlc3RyaWN0VW5rbm93blBhcmFtcygpOwoKICAgICAgICAkdGhpcy0+Q3JlYXRlUGFyYW1ldGVyKCdsaW1pdCcsIDIwLCAkdGhpcy0+TGFuZygnaGVscF9saW1pdCcpKTsKICAgICAgICAkdGhpcy0+U2V0UGFyYW1ldGVyVHlwZSgnbGltaXQnLCBDTEVBTl9JTlQpOwoKICAgICAgICAkdGhpcy0+Q3JlYXRlUGFyYW1ldGVyKCdrZXl3b3JkJywgJycsICR0aGlzLT5MYW5nKCdoZWxwX2tleXdvcmQnKSk7CiAgICAgICAgJHRoaXMtPlNldFBhcmFtZXRlclR5cGUoJ2tleXdvcmQnLCBDTEVBTl9TVFJJTkcpOwoKICAgICAgICAkdGhpcy0+Q3JlYXRlUGFyYW1ldGVyKCdzb3VyY2UnLCAnJywgJHRoaXMtPkxhbmcoJ2hlbHBfc291cmNlJykpOwogICAgICAgICR0aGlzLT5TZXRQYXJhbWV0ZXJUeXBlKCdzb3VyY2UnLCBDTEVBTl9TVFJJTkcpOwoKICAgICAgICAkdGhpcy0+Q3JlYXRlUGFyYW1ldGVyKCd0eXBlJywgJycsICR0aGlzLT5MYW5nKCdoZWxwX3R5cGUnKSk7CiAgICAgICAgJHRoaXMtPlNldFBhcmFtZXRlclR5cGUoJ3R5cGUnLCBDTEVBTl9TVFJJTkcpOwoKICAgICAgICAkdGhpcy0+U2V0UGFyYW1ldGVyVHlwZSgnYXJ0aXN0JywgQ0xFQU5fU1RSSU5HKTsKCiAgICAgICAgJHRoaXMtPlNldFBhcmFtZXRlclR5cGUoJ3NvbmcnLCBDTEVBTl9TVFJJTkcpOwoKICAgICAgICAkdGhpcy0+U2V0UGFyYW1ldGVyVHlwZSgndGltZW91dCcsIENMRUFOX0lOVCk7CgogICAgICAgICR0aGlzLT5DcmVhdGVQYXJhbWV0ZXIoJ2Rpc3BsYXl0ZW1wbGF0ZScsICcnLCAkdGhpcy0+TGFuZygnaGVscF9kaXNwbGF5dGVtcGxhdGUnKSk7CiAgICAgICAgJHRoaXMtPlNldFBhcmFtZXRlclR5cGUoJ2Rpc3BsYXl0ZW1wbGF0ZScsIENMRUFOX1NUUklORyk7CiAgICB9CgogICAgZnVuY3Rpb24gR2V0RXZlbnREZXNjcmlwdGlvbigkZXZlbnRuYW1lKSB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5MYW5nKCdldmVudF9pbmZvXycgLiAkZXZlbnRuYW1lKTsKICAgIH0KCiAgICBmdW5jdGlvbiBHZXRFdmVudEhlbHAoJGV2ZW50bmFtZSkgewogICAgICAgIHJldHVybiAkdGhpcy0+TGFuZygnZXZlbnRfaGVscF8nIC4gJGV2ZW50bmFtZSk7CiAgICB9CgogICAgZnVuY3Rpb24gSW5zdGFsbFBvc3RNZXNzYWdlKCkgewogICAgICAgIHJldHVybiAkdGhpcy0+TGFuZygncG9zdGluc3RhbGwnKTsKICAgIH0KCiAgICBmdW5jdGlvbiBVbmluc3RhbGxQb3N0TWVzc2FnZSgpIHsKICAgICAgICByZXR1cm4gJHRoaXMtPkxhbmcoJ3Bvc3R1bmluc3RhbGwnKTsKICAgIH0KCiAgICBmdW5jdGlvbiBVbmluc3RhbGxQcmVNZXNzYWdlKCkgewogICAgICAgIHJldHVybiAkdGhpcy0+TGFuZygncmVhbGx5X3VuaW5zdGFsbCcpOwogICAgfQoKICAgIGZ1bmN0aW9uIG5ldHRlQ2FjaGUoKSB7CiAgICAgICAgZ2xvYmFsICRnQ21zOwogICAgICAgIGlmICgkdGhpcy0+X2luaXRfY2FjaGUpCiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+X2luaXRfY2FjaGU7CiAgICAgICAgJHN0b3JhZ2UgPSBuZXcgTkZpbGVTdG9yYWdlKGNtc19qb2luX3BhdGgoJGdDbXMtPmNvbmZpZ1sncHJldmlld3NfcGF0aCddKSk7CiAgICAgICAgJGNhY2hlID0gbmV3IE5DYWNoZSgkc3RvcmFnZSk7CiAgICAgICAgJHRoaXMtPl9pbml0X2NhY2hlID0gJGNhY2hlOwogICAgICAgIHJldHVybiAkdGhpcy0+X2luaXRfY2FjaGU7CiAgICB9CgogICAgZnVuY3Rpb24gbG9hZEJpbmcoJGtleXdvcmQpIHsKICAgICAgICAvLyBpbmNsdWRlIHNpbXBsZSBwaWUKICAgICAgICBpZiAoJHRoaXMtPmxpbWl0KSB7CiAgICAgICAgICAgICRsaW1pdCA9ICR0aGlzLT5saW1pdDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkbGltaXQgPSAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnYmluZ19tYXgnLCAyMCk7CiAgICAgICAgfQoKICAgICAgICAkYmluZ19hcGlfa2V5ID0gJHRoaXMtPkdldFByZWZlcmVuY2UoJ2JpbmdfYXBpX2tleScpOwogICAgICAgICRvID0gbmV3IE1zZnRfQmluZ19TZWFyY2goJGJpbmdfYXBpX2tleSk7CiAgICAgICAgJG8tPnNldFF1ZXJ5KCRrZXl3b3JkKQogICAgICAgICAgICAgICAgLT5zZXRXZWJDb3VudCgxMCkKICAgICAgICAgICAgICAgIC0+c2V0U291cmNlKCcnIC4gJHRoaXMtPnR5cGUgLiAnJyk7CiAgICAgICAgJHJhdyA9ICRvLT5zZWFyY2goKTsKICAgICAgICAkcmVzdWx0ID0ganNvbl9kZWNvZGUoJHJhdyk7ICAgICAgICAKICAgICAgICAkdHlwZSA9ICR0aGlzLT50eXBlOwogICAgICAgIHJldHVybiAkcmVzdWx0LT5TZWFyY2hSZXNwb25zZS0+JHR5cGUtPlJlc3VsdHM7CiAgICB9CgogICAgZnVuY3Rpb24gbG9hZFR3aXR0ZXIoJGtleXdvcmQpIHsKICAgICAgICAkdHdpdHRlciA9IG5ldyBUd2l0dGVyOwogICAgICAgIHJldHVybiAkdHdpdHRlci0+c2VhcmNoKCRrZXl3b3JkKTsKICAgIH0KCiAgICBmdW5jdGlvbiBsb2FkWW91dHViZSgka2V5d29yZCkgewogICAgICAgIC8vIGZlZWQgdXJsCiAgICAgICAgJGZlZWR1cmwgPSAnaHR0cDovL2dkYXRhLnlvdXR1YmUuY29tL2ZlZWRzL3ZpZGVvcz92cT0nIC4gdXJsZW5jb2RlKCRrZXl3b3JkKSAuICcmbWF4LXJlc3VsdHM9JyAuICR0aGlzLT5saW1pdCAuICcmc3RhcnQtaW5kZXg9MSc7CiAgICAgICAgJHJlc3BvbnNlID0gZmlsZV9nZXRfY29udGVudHMoJGZlZWR1cmwpOwoKICAgICAgICAvLyBmZWVkCiAgICAgICAgJGZlZWQgPSBuZXcgU2ltcGxlUGllKCk7CiAgICAgICAgJGZlZWQtPnNldF9yYXdfZGF0YSgkcmVzcG9uc2UpOwogICAgICAgICRmZWVkLT5lbmFibGVfY2FjaGUoZmFsc2UpOwogICAgICAgICRmZWVkLT5lbmFibGVfb3JkZXJfYnlfZGF0ZShmYWxzZSk7CiAgICAgICAgJGZlZWQtPmZvcmNlX2ZlZWQodHJ1ZSk7CiAgICAgICAgJGZlZWQtPnNldF9pdGVtX2xpbWl0KCRsaW1pdCk7CiAgICAgICAgJGZlZWQtPmluaXQoKTsKICAgICAgICAkZmVlZC0+aGFuZGxlX2NvbnRlbnRfdHlwZSgndGV4dC9wbGFpbicpOwogICAgICAgIHJldHVybiAkZmVlZC0+Z2V0X2l0ZW1zKCk7CiAgICB9Cgp9CgovL2VuZCBjbGFzcwo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/method.install.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IE1lZGlhQ2VudGVyCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMDUgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQojIFRoaXMgcHJvamVjdCdzIGhvbWVwYWdlIGlzOiBodHRwOi8vd3d3LmNtc21hZGVzaW1wbGUub3JnCiMgVGhlIG1vZHVsZSdzIGhvbWVwYWdlIGlzOiBodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnL3Byb2plY3RzL21lZGlhY2VudGVyLwojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMKIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKIyBPciByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaWYgKCFpc3NldCgkZ0NtcykpIGV4aXQ7CgoKJGRiID0mICRnQ21zLT5HZXREYigpOwoKLy8gY3JlYXRlIGEgcGVybWlzc2lvbgokdGhpcy0+Q3JlYXRlUGVybWlzc2lvbignTW9kaWZ5IE1lZGlhIENlbnRlcicsICdNb2RpZnkgTWVkaWEgQ2VudGVyJyk7CgovLyBjcmVhdGUgYSBwcmVmZXJlbmNlCiR0aGlzLT5TZXRQcmVmZXJlbmNlKCJjYWNoZV90aW1lb3V0IiwgMzYwMCoyNCk7CiR0aGlzLT5TZXRQcmVmZXJlbmNlKCJ5b3V0dWJlX21heCIsIDIwKTsKJHRoaXMtPlNldFByZWZlcmVuY2UoImJpbmdfbWF4IiwgMjApOwoKIyBTZXR1cCB0ZW1wbGF0ZXMKJGZuID0gY21zX2pvaW5fcGF0aChkaXJuYW1lKF9fRklMRV9fKSwndGVtcGxhdGVzJywnb3JpZ19uZXdfc2FtcGxlLnRwbCcpOwppZiggZmlsZV9leGlzdHMoICRmbiApICkKewoJJHRlbXBsYXRlID0gZmlsZV9nZXRfY29udGVudHMoICRmbiApOwoJJHRoaXMtPlNldFByZWZlcmVuY2UoTUVESUFDRU5URVJfUFJFRl9ORVdNRURJQUNFTlRFUl9URU1QTEFURSwkdGVtcGxhdGUpOwp9CgokZm4gPSBjbXNfam9pbl9wYXRoKGRpcm5hbWUoX19GSUxFX18pLCd0ZW1wbGF0ZXMnLCdvcmlnX3lvdXR1YmVfc2FtcGxlLnRwbCcpOwppZiggZmlsZV9leGlzdHMoICRmbiApICkKewoJJHRlbXBsYXRlID0gZmlsZV9nZXRfY29udGVudHMoICRmbiApOwoJJHRoaXMtPlNldFRlbXBsYXRlKCdkaXNwbGF5X1lvdXR1YmUnLCR0ZW1wbGF0ZSk7Cn0KCiRmbiA9IGNtc19qb2luX3BhdGgoZGlybmFtZShfX0ZJTEVfXyksJ3RlbXBsYXRlcycsJ29yaWdfYmluZ193ZWIudHBsJyk7CmlmKCBmaWxlX2V4aXN0cyggJGZuICkgKQp7CgkkdGVtcGxhdGUgPSBmaWxlX2dldF9jb250ZW50cyggJGZuICk7CgkkdGhpcy0+U2V0VGVtcGxhdGUoJ2Rpc3BsYXlfQmluZ1dlYicsJHRlbXBsYXRlKTsKfQoKJGZuID0gY21zX2pvaW5fcGF0aChkaXJuYW1lKF9fRklMRV9fKSwndGVtcGxhdGVzJywnb3JpZ19iaW5nX2ltYWdlLnRwbCcpOwppZiggZmlsZV9leGlzdHMoICRmbiApICkKewoJJHRlbXBsYXRlID0gZmlsZV9nZXRfY29udGVudHMoICRmbiApOwoJJHRoaXMtPlNldFRlbXBsYXRlKCdkaXNwbGF5X0JpbmdJbWFnZScsJHRlbXBsYXRlKTsKfQoKJGZuID0gY21zX2pvaW5fcGF0aChkaXJuYW1lKF9fRklMRV9fKSwndGVtcGxhdGVzJywnb3JpZ19iaW5nX3ZpZGVvLnRwbCcpOwppZiggZmlsZV9leGlzdHMoICRmbiApICkKewoJJHRlbXBsYXRlID0gZmlsZV9nZXRfY29udGVudHMoICRmbiApOwoJJHRoaXMtPlNldFRlbXBsYXRlKCdkaXNwbGF5X0JpbmdWaWRlbycsJHRlbXBsYXRlKTsKfQokZm4gPSBjbXNfam9pbl9wYXRoKGRpcm5hbWUoX19GSUxFX18pLCd0ZW1wbGF0ZXMnLCdvcmlnX3R3aXR0ZXJfc2VhcmNoLnRwbCcpOwppZiggZmlsZV9leGlzdHMoICRmbiApICkKewoJJHRlbXBsYXRlID0gZmlsZV9nZXRfY29udGVudHMoICRmbiApOwoJJHRoaXMtPlNldFRlbXBsYXRlKCdkaXNwbGF5X1R3aXR0ZXInLCR0ZW1wbGF0ZSk7Cn0KCgovLyBwdXQgbWVudGlvbiBpbnRvIHRoZSBhZG1pbiBsb2cKJHRoaXMtPkF1ZGl0KCAwLAokdGhpcy0+TGFuZygnZnJpZW5kbHluYW1lJyksCiR0aGlzLT5MYW5nKCdpbnN0YWxsZWQnLCAkdGhpcy0+R2V0VmVyc2lvbigpKSApOwoKPz4=]]></data>
	</file>
	<file>
	  <filename>/method.uninstall.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IE1lZGlhQ2VudGVyCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMDUgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQojIFRoaXMgcHJvamVjdCdzIGhvbWVwYWdlIGlzOiBodHRwOi8vd3d3LmNtc21hZGVzaW1wbGUub3JnCiMgVGhlIG1vZHVsZSdzIGhvbWVwYWdlIGlzOiBodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnL3Byb2plY3RzL21lZGlhY2VudGVyLwojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMKIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKIyBPciByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmlmICghaXNzZXQoJGdDbXMpKSBleGl0OwoKJGRiID0mICRnQ21zLT5HZXREYigpOwoKLy8gcmVtb3ZlIHRoZSBwZXJtaXNzaW9ucwokdGhpcy0+UmVtb3ZlUGVybWlzc2lvbignVXNlIE1lZGlhIENlbnRlcicpOwoKLy8gcmVtb3ZlIHRoZSBwcmVmZXJlbmNlDQoNCiR0aGlzLT5EZWxldGVUZW1wbGF0ZSgpOw0KJHRoaXMtPlJlbW92ZVByZWZlcmVuY2UoKTsNCgoKLy8gcHV0IG1lbnRpb24gaW50byB0aGUgYWRtaW4gbG9nCiR0aGlzLT5BdWRpdCggMCwgJHRoaXMtPkxhbmcoJ2ZyaWVuZGx5bmFtZScpLCAkdGhpcy0+TGFuZygndW5pbnN0YWxsZWQnKSk7Cgo/Pg==]]></data>
	</file>
	<file>
	  <filename>/method.upgrade.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCmlmICghaXNzZXQoJGdDbXMpKQogICAgZXhpdDsKCiRjdXJyZW50X3ZlcnNpb24gPSAkb2xkdmVyc2lvbjsKJGRiID0gJiAkdGhpcy0+Y21zLT5HZXREYigpOwpzd2l0Y2ggKCRjdXJyZW50X3ZlcnNpb24pIHsKICAgIGNhc2UgIjAuMSI6CiAgICBjYXNlICIwLjIiOgogICAgICAgICR0aGlzLT5SZW1vdmVQcmVmZXJlbmNlKCJjYWNoZV9kaXIiKTsKICAgICAgICAkZm4gPSBjbXNfam9pbl9wYXRoKGRpcm5hbWUoX19GSUxFX18pLCAndGVtcGxhdGVzJywgJ29yaWdfdHdpdHRlcl9zZWFyY2gudHBsJyk7CiAgICAgICAgaWYgKGZpbGVfZXhpc3RzKCRmbikpIHsKICAgICAgICAgICAgJHRlbXBsYXRlID0gZmlsZV9nZXRfY29udGVudHMoJGZuKTsKICAgICAgICAgICAgJHRoaXMtPlNldFRlbXBsYXRlKCdkaXNwbGF5X1R3aXR0ZXInLCAkdGVtcGxhdGUpOwogICAgICAgIH0KfQo/Pg==]]></data>
	</file>
	<file>
	  <filename>/templates/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/templates/add_edit.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[eyRzdGFydF9mb3JtfQo8ZGl2IGNsYXNzPSJmb3JtX3JvdyI+CiAgIDxzcGFuIGNsYXNzPSJmaWVsZF90aXRsZSI+eyR0aXRsZV9kZXNjcmlwdGlvbn08L3NwYW4+CiAgIDxzcGFuIGNsYXNzPSJmaWVsZF9pbnB1dCI+eyRpbnB1dF9kZXNjcmlwdGlvbn08L3NwYW4+CjwvZGl2Pgo8ZGl2IGNsYXNzPSJmb3JtX3JvdyI+CiAgIDxzcGFuIGNsYXNzPSJmaWVsZF90aXRsZSI+PC9zcGFuPgogICA8c3BhbiBjbGFzcz0iZmllbGRfaW5wdXQiPnskc3VibWl0fTwvc3Bhbj4KPC9kaXY+CnskZW5kX2Zvcm19]]></data>
	</file>
	<file>
	  <filename>/templates/orig_bing_image.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGRpdiBjbGFzcz0iYmluZ2ltYWdlIj4NCiAgICA8aDM+QmluZyBJbWFnZXM6IHska2V5d29yZH0gKHskcmVzdWx0c314KTwvaDM+DQp7Zm9yZWFjaCBmcm9tPSRpdGVtcyBpdGVtPSdtZWRpYSd9DQogICAgPGg0PjxhIGhyZWY9InskbWVkaWEtPk1lZGlhVXJsfSI+eyRtZWRpYS0+VGl0bGV9PC9hPiAoPGEgaHJlZj0ieyRtZWRpYS0+VXJsfSI+eyRtZWRpYS0+RGlzcGxheVVybH08L2E+KTwvaDQ+DQogICAgPHA+DQogICAgICAgIDxhIGhyZWY9InskbWVkaWEtPk1lZGlhVXJsfSI+PGltZyBzcmM9InskbWVkaWEtPlRodW1ibmFpbC0+VXJsfSIgc3R5bGU9IndpZHRoOnskbWVkaWEtPlRodW1ibmFpbC0+V2lkdGh9cHg7aGVpZ2h0OnskbWVkaWEtPlRodW1ibmFpbC0+SGVpZ2h0fXB4OyIgYWx0PSJ7JG1lZGlhLT5UaXRsZX0iIC8+PC9hPg0KICAgICAgICA8YnIgLz4NCnskbWVkaWEtPlRodW1ibmFpbC0+RmlsZVNpemV9Jm5ic3A7a0INCiAgICA8L3A+DQp7L2ZvcmVhY2h9DQo8L2Rpdj4NCg0KeyoNCnBhcmFtcw0KDQpbVGl0bGVdDQpbTWVkaWFVcmxdDQpbVXJsXQ0KW0Rpc3BsYXlVcmxdDQpbV2lkdGhdDQpbSGVpZ2h0XQ0KW0ZpbGVTaXplXQ0KW0NvbnRlbnRUeXBlXQ0KW1RodW1ibmFpbF0gPT4gc3RkQ2xhc3MgT2JqZWN0DQogICAgICAgICAgICAgICAgKA0KICAgICAgICAgICAgICAgICAgICBbVXJsXQ0KICAgICAgICAgICAgICAgICAgICBbQ29udGVudFR5cGVdDQogICAgICAgICAgICAgICAgICAgIFtXaWR0aF0NCiAgICAgICAgICAgICAgICAgICAgW0hlaWdodF0NCiAgICAgICAgICAgICAgICAgICAgW0ZpbGVTaXplXQ0KICAgICAgICAgICAgICAgICkNCg0KDQoqfQ==]]></data>
	</file>
	<file>
	  <filename>/templates/orig_bing_video.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGRpdiBjbGFzcz0iYmluZ3ZpZGVvIj4NCiAgICA8aDM+QmluZyBWaWRlbzogeyRrZXl3b3JkfSAoeyRyZXN1bHRzfXgpPC9oMz4NCntmb3JlYWNoIGZyb209JGl0ZW1zIGl0ZW09J21lZGlhJ30NCiAgICA8aDQ+PGEgaHJlZj0ieyRtZWRpYS0+Q2xpY2tUaHJvdWdoUGFnZVVybH0iPnskbWVkaWEtPlRpdGxlfTwvYT4gKDxhIGhyZWY9InskbWVkaWEtPlBsYXlVcmx9Ij57JG1lZGlhLT5Tb3VyY2VUaXRsZX08L2E+KTwvaDQ+DQogICAgPHA+DQogICAgICAgIDxhIGhyZWY9InskbWVkaWEtPkNsaWNrVGhyb3VnaFBhZ2VVcmx9Ij48aW1nIHNyYz0ieyRtZWRpYS0+U3RhdGljVGh1bWJuYWlsLT5Vcmx9IiBzdHlsZT0id2lkdGg6eyRtZWRpYS0+U3RhdGljVGh1bWJuYWlsLT5XaWR0aH1weDtoZWlnaHQ6eyRtZWRpYS0+U3RhdGljVGh1bWJuYWlsLT5oZWlnaHR9cHg7IiBhbHQ9InskbWVkaWEtPlRpdGxlfSIgLz48L2E+DQogICAgICAgIDxiciAvPg0KeyRtZWRpYS0+UnVuVGltZX0mbmJzcDtzDQogICAgPC9wPg0Key9mb3JlYWNofQ0KPC9kaXY+DQp7Kg0KcGFyYW1zDQoNClRpdGxlDQpQbGF5VXJsDQpTb3VyY2VUaXRsZQ0KUnVuVGltZQ0KQ2xpY2tUaHJvdWdoUGFnZVVybA0KU3RhdGljVGh1bWJuYWlsDQooDQpVcmwNCkNvbnRlbnRUeXBlDQpXaWR0aA0KSGVpZ2h0DQpGaWxlU2l6ZQ0KKQ0KKn0=]]></data>
	</file>
	<file>
	  <filename>/templates/orig_bing_web.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGRpdiBjbGFzcz0iYmluZ3dlYiI+DQo8aDM+QmluZyBXZWI6IHska2V5d29yZH0gKHskcmVzdWx0c314KTwvaDM+DQp7Zm9yZWFjaCBmcm9tPSRpdGVtcyBpdGVtPSdtZWRpYSd9DQo8aDQ+PGEgaHJlZj0ieyRtZWRpYS0+VXJsfSI+eyRtZWRpYS0+VGl0bGV9PC9hPiAoPGEgaHJlZj0ieyRtZWRpYS0+VXJsfSI+eyRtZWRpYS0+RGlzcGxheVVybH08L2E+KTwvaDQ+DQo8cD4NCgl7JG1lZGlhLT5EZXNjcmlwdGlvbn0NCjwvcD4NCnsvZm9yZWFjaH0NCjwvZGl2Pg0KDQp7Kg0KcGFyYW1zDQpUaXRsZQ0KRGVzY3JpcHRpb24NClVybA0KQ2FjaGVVcmwNCkRpc3BsYXlVcmwNCkRhdGVUaW1lDQoqfQ==]]></data>
	</file>
	<file>
	  <filename>/templates/orig_new_sample.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[eyoNCnska2V5d29yZH0NCnskcmVzdWx0c30NCg0Ke2ZvcmVhY2ggZnJvbT0kaXRlbXMgaXRlbT0nbWVkaWEnfQ0KDQp7JG1lZGlhLT50aXRsZX0NCnskbWVkaWEtPnVybH0NCg0Key9mb3JlYWNofQ0KDQpldGMuDQoNCnskaXRlbXN8cHJpbnRfcn0gdG8gc2VlIHRoZSBhdmFpbGFibGUgcGFyYW1ldGVycw0KDQoqfQ0KDQo=]]></data>
	</file>
	<file>
	  <filename>/templates/orig_twitter_search.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGRpdiBjbGFzcz0idHdpdHRlciI+DQo8aDM+VHdpdHRlcjogeyRrZXl3b3JkfSAoeyRyZXN1bHRzfXgpPC9oMz4NCntmb3JlYWNoIGZyb209JGl0ZW1zIGl0ZW09J21lZGlhJ30NCjxwPnskbWVkaWEtPnRleHR9PC9wPg0KPGEgaHJlZj0iaHR0cDovL3R3aXR0ZXIuY29tL3skbWVkaWEtPmZyb21fdXNlcn0vc3RhdHVzL3skbWVkaWEtPmlkfSI+eyRtZWRpYS0+Y3JlYXRlZF9hdHxjbXNfZGF0ZV9mb3JtYXR9PC9hPiB7JG1lZGlhLT5zb3VyY2V8aHRtbHNwZWNpYWxjaGFyc308L2g0Pg0Key9mb3JlYWNofQ0KPC9kaXY+DQoNCnsqDQpwcm9maWxlX2ltYWdlX3VybA0KY3JlYXRlZF9hdA0KZnJvbV91c2VyXQ0KbWV0YWRhdGEgPT4gc3RkQ2xhc3MgT2JqZWN0IFtyZXN1bHRfdHlwZV0NCnRvX3VzZXJfaWQNCnRleHQNCmlkDQpmcm9tX3VzZXJfaWQNCmdlbw0KaXNvX2xhbmd1YWdlX2NvZGUNCnNvdXJjZQ0KKn0=]]></data>
	</file>
	<file>
	  <filename>/templates/orig_youtube_sample.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGgzPllvdXR1YmU6IHska2V5d29yZH0gKHskcmVzdWx0c314KTwvaDM+DQp7Zm9yZWFjaCBmcm9tPSRpdGVtcyBpdGVtPSdtZWRpYSd9DQo8ZGl2IGNsYXNzPSJ5b3V0dWJlIj4NCntpZiAkbWVkaWEtPnRodW1ibmFpbH0NCjxwPjxhIGhyZWY9InskbWVkaWEtPmxpbmt9Ij48aW1nIHNyYz0ieyRtZWRpYS0+dGh1bWJuYWlsfSINCglhbHQ9InskbWVkaWEtPnRpdGxlfSIgLz48L2E+IDxiciAvPg0KeyRtZWRpYS0+bGVuZ2h0fGRhdGVfZm9ybWF0OiclbTpzJ308L3A+DQp7L2lmfQ0KPGg0PjxhIGhyZWY9InskbWVkaWEtPmxpbmt9IiByZWw9Im5vZm9sbG93Ij57JG1lZGlhLT50aXRsZX08L2E+PC9oND4NCjxvYmplY3QgaGVpZ2h0PSIzNDQiIHdpZHRoPSI0MjUiIHR5cGU9ImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIg0KCWlkPSJteXl0cGxheWVyIg0KCWRhdGE9Imh0dHA6Ly93d3cueW91dHViZS5jb20vdi97JG1lZGlhLT52aWRlb19pZH0iPg0KCTxwYXJhbSBuYW1lPSJhbGxvd1NjcmlwdEFjY2VzcyIgdmFsdWU9ImFsd2F5cyIgLz4NCgk8cGFyYW0gdmFsdWU9Imh0dHA6Ly93d3cueW91dHViZS5jb20vdi97JG1lZGlhLT52aWRlb19pZH0iDQoJCW5hbWU9Im1vdmllIiAvPg0KPC9vYmplY3Q+DQp7L2ZvcmVhY2h9DQo8L2Rpdj4=]]></data>
	</file>
	<file>
	  <filename>/templates/prefs.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[eyRzdGFydGZvcm19DQo8ZmllbGRzZXQ+DQo8bGVnZW5kPnskY2FjaGV9PC9sZWdlbmQ+DQo8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPg0KICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHByb21wdF9jYWNoZV90aW1lb3V0fTwvcD4NCiAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaW5wdXRfY2FjaGVfdGltZW91dH08L3A+DQo8L2Rpdj4NCjwvZmllbGRzZXQ+DQo8ZmllbGRzZXQ+DQo8bGVnZW5kPnskdGl0bGVfeW91dHViZX08L2xlZ2VuZD4NCjxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+DQogICA8cCBjbGFzcz0icGFnZXRleHQiPnskcHJvbXB0X3lvdXR1YmVfbWF4fTwvcD4NCiAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaW5wdXRfeW91dHViZV9tYXh9PC9wPg0KPC9kaXY+DQo8L2ZpZWxkc2V0Pg0KPGZpZWxkc2V0Pg0KPGxlZ2VuZD57JHRpdGxlX2Jpbmd9PC9sZWdlbmQ+DQo8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPg0KICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHByb21wdF9iaW5nX2FwaV9rZXl9PC9wPg0KICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dF9iaW5nX2FwaV9rZXl9PC9wPg0KPC9kaXY+DQo8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPg0KICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHByb21wdF9iaW5nX21heH08L3A+DQogICA8cCBjbGFzcz0icGFnZWlucHV0Ij57JGlucHV0X2JpbmdfbWF4fTwvcD4NCjwvZGl2Pg0KPC9maWVsZHNldD4NCjxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+DQogICA8cCBjbGFzcz0icGFnZXRleHQiPjwvcD4NCiAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskc3VibWl0fTwvcD4NCjwvZGl2Pg0KeyRlbmRmb3JtfQ==]]></data>
	</file>
</module>
