<?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>GiftBaskets</name>
	<version>1.3</version>
  <mincmsversion>1.6.6</mincmsversion>
	<help><![CDATA[PGgzPldoYXQgZG9lcyBpdCBkbz88L2gzPgo8cD5UaGlzIG1vZHVsZSBhbGxvd3MgYW4gYXV0aG9yaXplZCBhbmQgbG9nZ2VkIGluIGZyb250ZW5kIHVzZXIgdG8gbWFuYWdlIG11bHRpcGxlIGJhc2tldHMsIHdpdGggZGlmZmVyZW50IHNoaXBwaW5nIGxvY2F0aW9ucywgYW5kIHRvIGFkZCBwcm9kdWN0cyBmcm9tIHRoZSBQcm9kdWN0cyBtb2R1bGUgaW50byBhbnkgb25lIG9mIHRoaWVyIGJhc2tldHMuPC9wPgo8cD5WaWV3cyBhbmQgZm9ybXMgYXJlIGFsc28gcHJvdmlkZWQgdG8gYWxsb3cgdGhlIGF1dGhvcml6ZWQgZnJvbnRlbmQgdXNlciB0byBtYW5hZ2UgaGlzIGJhc2tldHMsIGFuZCB0aGUgY29udGVudHMgb2YgdGhlbS48L3A+CjxoMz5Ib3cgRG8gSSB1c2UgSXQ8L2gzPgogIDxwPlRoaXMgbW9kdWxlIHByb3ZpZGVzIG1hbnkgZm9ybXMgYW5kIHJlcG9ydHMsIGFuZCBoYXMgY29uc2lkZXJhYmxlIGZ1bmN0aW9uYWxpdHkuICBCdXQgaW4gdGhlIHNpbXBsZXN0IHNlbnNlLCBqdXN0IHNlbGVjdCB0aGlzIG1vZHVsZSBhcyB5b3VyIENhcnQgbW9kdWxlIGluIHRoZSBwcmVmZXJlbmNlcyB0YWIgb2YgdGhlICZxdW90O1Byb2R1Y3QgTWFuYWdlciZxdW90OyBhZG1pbiBwYW5lbC4gIFRoaXMgd2lsbCBkaXNwbGF5IGEgZm9ybSBvbiBhbGwgcHJvZHVjdCBkZXRhaWwgcGFnZXMgdG8gYWxsb3cgdGhlIGN1cnJlbnQgcHJvZHVjdCB0byBiZSBhZGRlZCB0byBhIHVzZXIgc2VsZWN0ZWQgY2FydCwgYW5kIHdpbGwgKGdpdmVuIHRoZSBkZWZhdWx0IHRlbXBsYXRlcykgYWxsb3cgY3JlYXRpbmcgb2YgbnVtZXJvdXMgY2FydHMuPC9wPgo8cD5UbyBjcmVhdGUgYSBzdW1tYXJ5IG9mIGFsbCBjYXJ0cywgeW91IGNhbiB1c2UgYSB0YWcgbGlrZSB7R2lmdEJhc2tldHMgYWN0aW9uPSdteWNhcnQnfTwvcD4KPHA+VG8gY3JlYXRlIGEgcmVwb3J0IG9mIGFsbCBjYXJ0cywgYW5kIHRvIGFsbG93IG1hbmFnaW5nIHRoZWlyIGNvbnRlbnRzLCB5b3UgY2FuIHVzZSBhIHRhZyBsaWtlIHtHaWZ0QmFza2V0cyBhY3Rpb249J215Y2FydHNsaXN0J308L3A+PGgzPkRlcGVuZGVuY2llczwvaDM+PHVsPjxsaT5DR0V4dGVuc2lvbnMgPSZndDsgMS4xNy45PC9saT48bGk+UHJvZHVjdHMgPSZndDsgMi41LjE8L2xpPjxsaT5Gcm9udEVuZFVzZXJzID0mZ3Q7IDEuNy4xPC9saT48bGk+Q0dTaW1wbGVTbWFydHkgPSZndDsgMS40LjI8L2xpPjwvdWw+PGgzPlBhcmFtZXRlcnM8L2gzPjx1bD48bGk+PGVtPihvcHRpb25hbCk8L2VtPiBsYW5nPSJlbl9VUyIgLSBQYXJhbWV0ZXIgaXMgdXNlZCB0byBzcGVjaWZ5IHdoYXQgbGFuZ3VhZ2UgdG8gdXNlIGZvciBkaXNwbGF5IG9uIHRoZSBmcm9udGVuZC4gTm90IGFsbCBtb2R1bGVzIHN1cHBvcnQgb3IgbmVlZCB0aGlzLjwvbGk+PGxpPjxlbT4ob3B0aW9uYWwpPC9lbT4gYWRkdG9jYXJ0dGVtcGxhdGU9IiIgLSBTcGVjaWZpZXMgYSBub24gZGVmYXVsdCB0ZW1wbGF0ZSB0byB1c2UgZm9yIHRoZSAnYWRkdG9jYXJ0JyBtb2RlLjwvbGk+PGxpPjxlbT4ob3B0aW9uYWwpPC9lbT4gbXljYXJ0dGVtcGxhdGU9IiIgLSBTcGVjaWZpZXMgYSBub24gZGVmYXVsdCB0ZW1wbGF0ZSB0byB1c2UgZm9yIHRoZSAgJ215Y2FydCcgbW9kZS48L2xpPjxsaT48ZW0+KG9wdGlvbmFsKTwvZW0+IG15Y2FydHN0ZW1wbGF0ZT0iIiAtIC0tQWRkIE1lIC0gbW9kdWxlOkdpZnRCYXNrZXRzIHN0cmluZzpoZWxwX215Y2FydHN0dGVtcGxhdGUtLTwvbGk+PGxpPjxlbT4ob3B0aW9uYWwpPC9lbT4gZWRpdHNoaXBwaW5ndGVtcGxhdGU9IiIgLSBTcGVjaWZpZXMgYSBub24gZGVmYXVsdCB0ZW1wbGF0ZSB0byB1c2UgZm9yIHRoZSAnZWRpdHNoaXBwaW5nJyBhY3Rpb248L2xpPjxsaT48ZW0+KG9wdGlvbmFsKTwvZW0+IHByb2R1Y3Q9IiIgLSBBcHBsaWNhYmxlIG9ubHkgZm9yIHRoZSBkZWZhdWx0IGFjdGlvbiwgdGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHdoY2ggcHJvZHVjdCAoYnkgaWQpIHNob3VsZCBiZSBhZGRlZCB0byB0aGUgY2FydC4gIFR5cGljYWxseSwgaW4gdGhlIHByb2R1Y3QgZGV0YWlsIHRlbXBsYXRlIG9mIHRoZSBwcm9kdWN0cyBtb2R1bGUsIHlvdSB3b3VsZCBhZGQge0NhcnQgcHJvZHVjdD0kZW50cnktPmlkfSB0byBhbGxvdyBhZGRpbmcgaXRlbXMgdG8gdGhlIGNhcnQgZnJvbSBwcm9kdWN0IGRldGFpbCBwYWdlcy48L2xpPjxsaT48ZW0+KG9wdGlvbmFsKTwvZW0+IHZpZXdjYXJ0dGVtcGxhdGU9IiIgLSBTcGVjaWZpZXMgYSBub24gZGVmYXVsdCB0ZW1wbGF0ZSB0byB1c2UgZm9yIHRoZSAndmlld2NhcnQnIG1vZGUuPC9saT48bGk+PGVtPihvcHRpb25hbCk8L2VtPiB2aWV3Y2FydHBhZ2U9IiIgLSBTcGVjaWZ5IGEgZGVzdGluYXRpb24gcGFnZSBmb3IgdGhlICd2aWV3Y2FydCcgbW9kZS48L2xpPjxsaT48ZW0+KG9wdGlvbmFsKTwvZW0+IGhpZGVmb3JtPSIwIiAtIEFwcGxpY2FibGUgb25seSB0byB0aGUgJ3ZpZXdjYXJ0JyBhY3Rpb24sIHRoaXMgZmxhZyBpbmRpY2F0ZXMgd2V0aGVyIHRoZSB2aWV3Y2FydCBmb3JtIHNob3VsZCBiZSBkaXNwbGF5ZWQ8L2xpPjxsaT48ZW0+KG9wdGlvbmFsKTwvZW0+IGFjdGlvbj0iZGVmYXVsdCIgLSBTcGVjaWZpZXMgdGhlIGJlaGF2aW91ciBvZiB0aGUgbW9kdWxlLiAgUG9zc2libGUgdmFsdWVzIGFyZSAnZGVmYXVsdCcsJ215Y2FydCcsIGFuZCAndmlld2NhcnQnLjxici8+PHVsPjxsaT5kZWZhdWx0OiBkaXNwbGF5cyBhIGZvcm0gd2l0aCBhbiAnYWRkIHRvIGNhcnQnIGJ1dHRvbiB0byBhbGxvdyBhZGRpbmcgYSBzcGVjaWZpYyBwcm9kdWN0IHRvIHRoZSBjYXJ0LiAgVGhpcyBtb2RlIHJlcXVpcmVzIHRoZSAncHJvZHVjdCcgcGFyYW1ldGVyIGJlIHN1cHBsaWVkLjwvbGk+PGxpPm15Y2FydDogRGlzcGxheXMgYSBmb3JtIHRoYXQgZGlzcGxheXMgdGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgY2FydCwgYW5kIGEgJ2NoZWNrb3V0JyBidXR0b24uPC9saT48bGk+dmlld2NhcnQ6IERpc3BsYXlzIGEgZGV0YWlsZWQgZm9ybSBvZiB0aGUgY29udGVudHMgb2YgdGhlIGNhcnQsIGluY2x1ZGluZyBhIGN1cnJlbnQgdG90YWwsIGFuZCBhbGxvd3MgZGVsZXRpbmcgaXRlbXMgZnJvbSB0aGUgY2FydC48L2xpPjwvdWw+PC9saT48bGk+PGVtPihvcHRpb25hbCk8L2VtPiBzb3J0Ynk9ImNyZWF0ZV9kYXRlIiAtIEFwcGxpY2FibGUgb25seSB0byB0aGUgbXljYXJ0c2xpc3QgYWN0aW9uLCB0aGlzIHBhcmFtZXRlciBhbGxvd3Mgc3BlY2lmeWluZyBhIGRpZmZlcmVudCBzb3J0aW5nIGZpZWxkLiAgUG9zc2libGUgdmFsdWVzIGFyZTogY2FydF9uYW1lLGNyZWF0ZV9kYXRlLG1vZGlmaWVkX2RhdGUsZmlyc3RfbmFtZSxsYXN0X25hbWUsYWRkcmVzczEsYWRkcmVzczIsY2l0eSxzdGF0ZSxjb3VudHJ5PC9saT48bGk+PGVtPihvcHRpb25hbCk8L2VtPiBzb3J0b3JkZXI9ImFzYyIgLSBBcHBsaWNhYmxlIG9ubHkgdG8gdGhlIG15Y2FydHNsaXN0IGFjdGlvbiwgdGhpcyBwYXJhbWV0ZXIgYWxsb3dzIHNwZWNpZnlpbmcgYSBkaWZmZXJlbnQgc29ydGluZyBvcmRlci4gIFBvc3NpYmxlIHZhbHVlcyBhc2MsZGVzYzwvbGk+PGxpPjxlbT4ob3B0aW9uYWwpPC9lbT4gaGlkZWZvcm09IiIgLSAtLUFkZCBNZSAtIG1vZHVsZTpHaWZ0QmFza2V0cyBzdHJpbmc6aGVscF9jYXJ0X2lkLS08L2xpPjwvdWw+]]></help>
	<about><![CDATA[PGJyIC8+QXV0aG9yOiBjYWxndXkxMDAwICZsdDtjYWxndXkxMDAwQGNtc21hZGVzaW1wbGUub3JnJmd0OzxiciAvPjxiciAvPlZlcnNpb246IDEuMzxiciAvPjxiciAvPkNoYW5nZSBIaXN0b3J5OjxiciAvPjx1bD4KICA8bGk+VmVyc2lvbiAxLjAgLSBEZWNlbWJlciAyMDA4PGJyLz4KICAgICAgSW5pdGlhbCBSZWxlYXNlCiAgPC9saT4KICA8bGk+VmVyc2lvbiAxLjIgLSBEZWNlbWJlciAyMDEwPGJyLz4KICAgICAgQWRkcyBTS1Ugc3VwcG9ydC4KICA8L2xpPgo8L3VsPjxiciAvPg==]]></about>
	<description><![CDATA[An advanced cart module that supports multiple gift baskets, and mutliple shipping addresses.]]></description>
	<requires>
	  <requiredname>CGExtensions</requiredname>
	  <requiredversion>1.17.9</requiredversion>
	</requires>
	<requires>
	  <requiredname>Products</requiredname>
	  <requiredversion>2.5.1</requiredversion>
	</requires>
	<requires>
	  <requiredname>FrontEndUsers</requiredname>
	  <requiredversion>1.7.1</requiredversion>
	</requires>
	<requires>
	  <requiredname>CGSimpleSmarty</requiredname>
	  <requiredversion>1.4.2</requiredversion>
	</requires>
	<file>
	  <filename>/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/action.admin_save_prefs.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IENhcnQgLSBBIHNpbXBsZSBleGFtcGxlIGZyb250ZW5kIGZvcm0gbW9kdWxlCiMgVmVyc2lvbjogMS4wLCBjYWxndXkxMDAwIDxjYWxndXkxMDAwQGNtc21hZGVzaW1wbGUub3JnPgojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykKIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZwojIFRoZSBtb2R1bGUncyBob21lcGFnZSBpczogaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy9wcm9qZWN0cy9za2VsZXRvbi8KIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmlmKCAhaXNzZXQoJGdDbXMpICkgZXhpdDsKCiR0aGlzLT5TZXRDdXJyZW50VGFiKCdwcmVmZXJlbmNlcycpOwokdGhpcy0+U2V0UHJlZmVyZW5jZSgnYWRkdG9jYXJ0X2Rlc3RwYWdlJywkcGFyYW1zWydhZGR0b2NhcnRfZGVzdHBhZ2UnXSk7CgkJICAgICAKJHRoaXMtPlJlZGlyZWN0VG9UYWIoJGlkKTsKLy8gRU9GCj8+]]></data>
	</file>
	<file>
	  <filename>/action.default.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IENhcnQgLSBBIHNpbXBsZSBleGFtcGxlIGZyb250ZW5kIGZvcm0gbW9kdWxlCiMgVmVyc2lvbjogMS4wLCBjYWxndXkxMDAwIDxjYWxndXkxMDAwQGNtc21hZGVzaW1wbGUub3JnPgojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykKIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZwojIFRoZSBtb2R1bGUncyBob21lcGFnZSBpczogaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy9wcm9qZWN0cy9za2VsZXRvbi8KIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmlmKCAhaXNzZXQoJGdDbXMpICkgZXhpdDsKCmlmKCAhaXNzZXQoJHBhcmFtc1sncHJvZHVjdCddKSApCiAgewogICAgZWNobyAkdGhpcy0+RGlzcGxheUVycm9ycygkdGhpcy0+TGFuZygnZXJyb3JfbWlzc2luZ3BhcmFtJywncHJvZHVjdCcpKTsKICAgIHJldHVybjsKICB9CgovLwovLyBJbml0aWFsaXphdGlvbgovLwokc3RhdHVzID0gJyc7CiRtZXNzYWdlID0gJyc7CiRzZWxfY2FydCA9IC0xOwokbXljYXJ0cyA9IGFycmF5KCk7CgoKLy8KLy8gU2V0dXAKLy8KCiRwcm9kdWN0X2lkID0gKGludCkkcGFyYW1zWydwcm9kdWN0J107CmlmKCAkcHJvZHVjdF9pZCA8PSAwICkKICB7CiAgICBlY2hvICR0aGlzLT5EaXNwbGF5RXJyb3JNZXNzYWdlKCR0aGlzLT5MYW5nKCdlcnJvcl9pbnZhbGlkcGFyYW0nLCdwcm9kdWN0JykpOwogICAgcmV0dXJuOwogIH0KCi8vIE5vdyBzZWUgaWYgd2UgY2FuIGZpbmQgdGhlIHByb2R1Y3QKJHN1cHBsaWVyX21vZCA9ICdQcm9kdWN0cyc7CmlmKCBpc3NldCgkcGFyYW1zWydzdXBwbGllciddKSApCiAgewogICAgJHN1cHBsaWVyX21vZCA9IHRyaW0oJHBhcmFtc1snc3VwcGxpZXInXSk7CiAgfQokcHJvZHVjdCA9IGNnX2Vjb21tOjpnZXRfcHJvZHVjdF9pbmZvKCRzdXBwbGllcl9tb2QsJHByb2R1Y3RfaWQpOwppZiggISRwcm9kdWN0ICkKICB7CiAgICBlY2hvICR0aGlzLT5EaXNwbGF5RXJyb3JNZXNzYWdlKCR0aGlzLT5MYW5nKCdlcnJvcl9ub3N1Y2hwcm9kdWN0JywkcHJvZHVjdF9pZCkpOwogICAgcmV0dXJuOwogIH0KJGF0dHJpYnNldF9saXN0ID0gJyc7CmlmKCBpc3NldCgkcHJvZHVjdFsnYXR0cmlidXRlcyddKSApCiAgewogICAgJGF0dHJpYnNldF9saXN0ID0gJHByb2R1Y3RbJ2F0dHJpYnV0ZXMnXTsKICB9CgoKCmlmKCBpc3NldCgkX1NFU1NJT05bJ2NhcnRfc3RhdHVzJ10pICkKICB7CiAgICAkc3RhdHVzID0gJF9TRVNTSU9OWydjYXJ0X3N0YXR1cyddOwogICAgdW5zZXQoJF9TRVNTSU9OWydjYXJ0X3N0YXR1cyddKTsKICB9CmlmKCBpc3NldCgkX1NFU1NJT05bJ2NhcnRfbWVzc2FnZSddKSApCiAgewogICAgJG1lc3NhZ2UgPSAkX1NFU1NJT05bJ2NhcnRfbWVzc2FnZSddOwogICAgdW5zZXQoJF9TRVNTSU9OWydjYXJ0X21lc3NhZ2UnXSk7CiAgfQppZiggaXNzZXQoJF9TRVNTSU9OWydjYXJ0X3NlbGNhcnQnXSkgKQogIHsKICAgICRzZWxfY2FydCA9ICRfU0VTU0lPTlsnY2FydF9zZWxjYXJ0J107CiAgICB1bnNldCgkX1NFU1NJT05bJ2NhcnRfc2VsY2FydCddKTsKICB9CgoKLy8KLy8gSGFuZGxlIGZvcm0gc3VibWlzc2lvbgovLwppZiggaXNzZXQoJHBhcmFtc1snY2FydF9tYWtlbmV3Y2FydCddKSB8fCAKICAgIChpc3NldCgkcGFyYW1zWydjYXJ0X25ld2NhcnRuYW1lJ10pICYmIAogICAgICFlbXB0eSgkcGFyYW1zWydjYXJ0X25ld2NhcnRuYW1lJ10pKSkKICB7CiAgICAvLyBhZGQgbmV3IGJhc2tldAogICAgJGJhc2tldF9uYW1lcyA9ICR0aGlzLT5HZXRCYXNrZXROYW1lcygpOwogICAgJG5hbWUgPSB0cmltKCRwYXJhbXNbJ2NhcnRfbmV3Y2FydG5hbWUnXSk7CiAgICAkYWxpYXMgPSBtdW5nZV9zdHJpbmdfdG9fdXJsKCRuYW1lKTsKICAgICRyZXMgPSAkdGhpcy0+X2NyZWF0ZV9iYXNrZXQoJGFsaWFzLCRuYW1lKTsKICAgIGlmKCAkcmVzID09PSBGQUxTRSApCiAgICAgIHsKCSRzdGF0dXMgPSAnZXJyb3JfcGFyYW0nOwoJJG1lc3NhZ2UgPSAkdGhpcy0+TGFuZygnZXJyb3JfY2FydGV4aXN0cycpOwogICAgICB9CiAgICBlbHNlCiAgICAgIHsKCXJlZGlyZWN0KCRfU0VSVkVSWydIVFRQX1JFRkVSRVInXSk7CiAgICAgIH0KICB9CmVsc2UgaWYoIGlzc2V0KCRwYXJhbXNbJ2NhcnRfc3VibWl0J10pIAoJIHx8IChpc3NldCgkcGFyYW1zWydjYXJ0X2Zvcm1zdWJtaXQnXSkgJiYgCgkgICAgICRwYXJhbXNbJ2NhcnRfZm9ybXN1Ym1pdCddID09ICdhZGRfdG9fY2FydCcpKQogIHsKICAgIGlmKCAhaXNzZXQoJHBhcmFtc1snY2FydF9pZCddKSApCiAgICAgIHsKCSRzdGF0dXMgPSAnZXJyb3JfcGFyYW0nOwoJJG1lc3NhZ2UgPSAkdGhpcy0+TGFuZygnZXJyb3JfbWlzc2luZ3BhcmFtJywnY2FydF9pZCcpOwogICAgICB9CiAgICAkY2FydF9pZCA9IHRyaW0oJHBhcmFtc1snY2FydF9pZCddKTsKCiAgICAkcXVhbnRpdHkgPSAxOwogICAgaWYoIGlzc2V0KCRwYXJhbXNbJ2NhcnRfcXVhbnRpdHknXSkgKQogICAgICB7CgkkcXVhbnRpdHkgPSAoaW50KSRwYXJhbXNbJ2NhcnRfcXVhbnRpdHknXTsKICAgICAgfQogICAgaWYoICRxdWFudGl0eSA+IDAgKQogICAgICB7CgkvLyBFeHBhbmQgdGhlIGNhcnQgZnJvbSB0aGUgc2Vzc2lvbgoJJHRoaXMtPl9leHBhbmRfY2FydCgpOwoKCSRhdHRyaWJzID0gYXJyYXkoKTsKCWZvcmVhY2goICRwYXJhbXMgYXMgJG9uZWtleSA9PiAkb25ldmFsdWUgKQoJICB7CgkgICAgaWYoIHByZWdfbWF0Y2goJy9eY2FydF9hdHRyaWJfLycsJG9uZWtleSkgKQoJICAgICAgewoJCS8vIGZvdW5kIGFuIGF0dHJpYnV0ZS4KCQkkYXR0cmlic2V0X2lkID0gKGludClzdWJzdHIoJG9uZWtleSxzdHJsZW4oJ2NhcnRfYXR0cmliXycpKTsKCQkkcmVjID0gJGF0dHJpYnNldF9saXN0WyRhdHRyaWJzZXRfaWRdWyd2YWx1ZXMnXVskb25ldmFsdWVdOwoJCSRvYmogPSBuZXcgU3RkQ2xhc3M7CgkJJG9iai0+YXR0cmlic2V0ID0gKGludClzdWJzdHIoJG9uZWtleSwxMik7CgkJJG9iai0+YXR0cm5hbWUgPSAkYXR0cmlic2V0X2xpc3RbJG9iai0+YXR0cmlic2V0XVsnbmFtZSddOwoJCSRvYmotPm5hbWUgPSAkcmVjWydhdHRyaWJfdGV4dCddOwoJCSRvYmotPmFkanVzdG1lbnQgPSAkcmVjWydhdHRyaWJfYWRqdXN0bWVudCddOwoJCSRvYmotPnNrdSA9ICRyZWNbJ3NrdSddOwoKCQkkYXR0cmlic1tdID0gJG9iajsKCSAgICAgIH0KCSAgfQoKCS8vIGdldCB0aGUgc2t1Cgkkc2t1ID0gJHByb2R1Y3RbJ3NrdSddOwoJaWYoIGNvdW50KCRhdHRyaWJzKSA9PSAxICkKCSAgewoJICAgICRza3UgPSAkYXR0cmlic1swXS0+c2t1OwoJICB9CgoJLy8gQWRkIHRoZSBpdGVtCgkkdGhpcy0+X2FkZF9jYXJ0X2l0ZW0oJGNhcnRfaWQsJHN1cHBsaWVyX21vZCwkcHJvZHVjdF9pZCwkc2t1LCRxdWFudGl0eSwkYXR0cmlicyk7CgkKCS8vIEFuZCBwdXQgaXQgYmFjayBpbnRvIHRoZSBjYXJ0CgkkdGhpcy0+X2NvbGxhcHNlX2NhcnQoKTsKICAgICAgfQoKICAgICRkZXN0aWQgPSAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnYWRkdG9jYXJ0X2Rlc3RwYWdlJywtMSk7CiAgICBpZiggJGRlc3RpZCA9PSAtMSApCiAgICAgIHsKCSRkZXN0aWQgPSAkcmV0dXJuaWQ7CiAgICAgIH0KICAgICR0aGlzLT5SZWRpcmVjdENvbnRlbnQoJGRlc3RpZCk7CiAgfQplbHNlIGlmKCBpc3NldCgkcGFyYW1zWydjYXJ0X3N1Ym1pdF90b19hbGwnXSkgfHwKCSAoaXNzZXQoJHBhcmFtc1snY2FydF9mb3Jtc3VibWl0J10pICYmIAoJICAkcGFyYW1zWydjYXJ0X2Zvcm1zdWJtaXQnXSA9PSAnYWRkX3RvX2FsbF9jYXJ0cycpKQogIHsKICAgIC8vIGFkZCBpdGVtIHRvIGFsbCBjYXJ0cwogICAgJHF1YW50aXR5ID0gMTsKICAgIGlmKCBpc3NldCgkcGFyYW1zWydjYXJ0X3F1YW50aXR5J10pICkKICAgICAgewoJJHF1YW50aXR5ID0gKGludCkkcGFyYW1zWydjYXJ0X3F1YW50aXR5J107CiAgICAgIH0KICAgIGlmKCAkcXVhbnRpdHkgPiAwICkKICAgICAgewoJJHRoaXMtPl9leHBhbmRfY2FydCgpOwoKCSRhdHRyaWJzID0gYXJyYXkoKTsKCWZvcmVhY2goICRwYXJhbXMgYXMgJG9uZWtleSA9PiAkb25ldmFsdWUgKQoJICB7CgkgICAgaWYoIHByZWdfbWF0Y2goJy9eY2FydF9hdHRyaWJfLycsJG9uZWtleSkgKQoJICAgICAgewoJCS8vIGZvdW5kIGFuIGF0dHJpYnV0ZS4KCQkkYXR0cmlic2V0X2lkID0gKGludClzdWJzdHIoJG9uZWtleSxzdHJsZW4oJ2NhcnRfYXR0cmliXycpKTsKCQkkcmVjID0gJGF0dHJpYnNldF9saXN0WyRhdHRyaWJzZXRfaWRdWyd2YWx1ZXMnXVskb25ldmFsdWVdOwoJCSRvYmogPSBuZXcgU3RkQ2xhc3M7CgkJJG9iai0+YXR0cmlic2V0ID0gKGludClzdWJzdHIoJG9uZWtleSwxMik7CgkJJG9iai0+YXR0cm5hbWUgPSAkYXR0cmlic2V0X2xpc3RbJG9iai0+YXR0cmlic2V0XVsnbmFtZSddOwoJCSRvYmotPm5hbWUgPSAkcmVjWydhdHRyaWJfdGV4dCddOwoJCSRvYmotPmFkanVzdG1lbnQgPSAkcmVjWydhdHRyaWJfYWRqdXN0bWVudCddOwoJCSRyZWMtPnNrdSA9ICRyZWNbJ3NrdSddOwoKCQkkYXR0cmlic1tdID0gJG9iajsKCSAgICAgIH0KCSAgfQoKCS8vIGdldCB0aGUgc2t1Cgkkc2t1ID0gJHByb2R1Y3RbJ3NrdSddOwoJaWYoIGNvdW50KCRhdHRyaWJzKSA9PSAxICYmICRhdHRyaWJzWzBdLT5za3UgIT0gJycgKQoJICB7CgkgICAgJHNrdSA9ICRhdHRyaWJzWzBdLT5za3U7CgkgIH0KCgkvLyBnZXQgYWxsIHRoZSBjYXJ0IGlkcwoJJGJhc2tldF9uYW1lcyA9ICR0aGlzLT5HZXRCYXNrZXROYW1lcygpOwoJZm9yZWFjaCggJGJhc2tldF9uYW1lcyBhcyAkb25lYmFza2V0ICkKCSAgewoJICAgIC8vIGFkZCB0aGUgaXRlbQoJICAgICR0aGlzLT5fYWRkX2NhcnRfaXRlbSgkb25lYmFza2V0LCRzdXBwbGllcl9tb2QsJHByb2R1Y3RfaWQsJHNrdSwkcXVhbnRpdHksJGF0dHJpYnMpOwoJICB9CgoJLy8gYW5kIHB1dCBpdCBiYWNrIGludG8gdGhlIGNhcnQuCgkkdGhpcy0+X2NvbGxhcHNlX2NhcnQoKTsKCiAgICAgIH0KCiAgICAvLyBhbmQgcmVkaXJlY3QKICAgICRkZXN0aWQgPSAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnYWRkdG9jYXJ0X2Rlc3RwYWdlJywtMSk7CiAgICBpZiggJGRlc3RpZCA9PSAtMSApCiAgICAgIHsKCSRkZXN0aWQgPSAkcmV0dXJuaWQ7CiAgICAgIH0KICAgICR0aGlzLT5SZWRpcmVjdENvbnRlbnQoJGRlc3RpZCk7CiAgfQoKCgoKLy8KLy8gR2l2ZSBzdHVmZiB0byBzbWFydHkKLy8KCi8vIGV4cGFuZCB0aGUgY2FydC4KJHRoaXMtPl9leHBhbmRfY2FydCgpOwoKLy8gY3JlYXRlIGEgZGVmYXVsdCAnbXlzZWxmJyBiYXNrZXQgaWYgbmVjZXNzYXJ5LgppZiggIWluX2FycmF5KEdJRlRCQVNLRVRTX05BTUVfTVlTRUxGLCR0aGlzLT5HZXRCYXNrZXROYW1lcygpKSApCiAgewogICAgJHRoaXMtPl9jcmVhdGVfYmFza2V0KEdJRlRCQVNLRVRTX05BTUVfTVlTRUxGLCR0aGlzLT5MYW5nKCdteXNlbGYnKSk7CiAgfQoKLy8gYnVpbGQgYSBsaXN0IG9mIHRoZSBiYXNrZXRzCmlmKCBpc19hcnJheSgkdGhpcy0+X2NhcnRzKSApCiAgewogICAgZm9yZWFjaCggJHRoaXMtPl9jYXJ0cyBhcyAkbmFtZSA9PiAkb25lY2FydCApCiAgICAgIHsKCSRteWNhcnRzWyRuYW1lXSA9ICRvbmVjYXJ0LT5jYXJ0X25hbWU7CiAgICAgIH0KICB9CiRteWNhcnRzWy0yXSA9ICR0aGlzLT5MYW5nKCdhZGRfbmV3X2Jhc2tldCcpOwokc21hcnR5LT5hc3NpZ24oJ215Y2FydHMnLCRteWNhcnRzKTsKCmlmKCAhZW1wdHkoJHN0YXR1cykgKQogIHsKICAgICRzbWFydHktPmFzc2lnbignc3RhdHVzJywkc3RhdHVzKTsKICAgICRzbWFydHktPmFzc2lnbignbWVzc2FnZScsJG1lc3NhZ2UpOwogIH0KaWYoICFlbXB0eSgkc2VsX2NhcnQpICkKICB7CiAgICAkc21hcnR5LT5hc3NpZ24oJ3NlbF9jYXJ0Jywkc2VsX2NhcnQpOwogIH0KJHNtYXJ0eS0+YXNzaWduKCdmb3Jtc3RhcnQnLCR0aGlzLT5DR0NyZWF0ZUZvcm1TdGFydCgkaWQsJ2RlZmF1bHQnLCRyZXR1cm5pZCwKCQkJCQkJICAgICBhcnJheSgncHJvZHVjdCc9PiRwcm9kdWN0X2lkLAoJCQkJCQkJICAgJ2NhcnRfaWQnPT4ndW5rbm93bicpKSk7CiRzbWFydHktPmFzc2lnbignZm9ybWVuZCcsJHRoaXMtPkNyZWF0ZUZvcm1FbmQoKSk7CiRzbWFydHktPmFzc2lnbigncXVhbnRpdHluYW1lJywkaWQuJ2NhcnRfcXVhbnRpdHknKTsKJHNtYXJ0eS0+YXNzaWduKCdzdWJtaXRuYW1lJywkaWQuJ2NhcnRfc3VibWl0Jyk7CiRzbWFydHktPmFzc2lnbignYWRkdG9jYXJ0dGV4dCcsJHRoaXMtPkxhbmcoJ2FkZF90b19jYXJ0JykpOwoKLy8gR2V0IHRoZSBsaXN0IG9mIGF0dHJpYnV0ZXMgZm9yIHRoaXMgY2FydAppZiggaXNfYXJyYXkoJGF0dHJpYnNldF9saXN0KSApCiAgewogICAgLy8gdGhlcmUgYXJlIGF0dHJpYnV0ZXMKICAgIC8vIHNvIGNyZWF0ZSBhbiBhcnJheSBvZiBwdWxsZG93bnMsIGV0YyBmb3IgdGhlbQogICAgLy8gdGhhdCBjYW4gYmUgZGlzcGxheWVkIGluIHRoZSB0ZW1wbGF0ZQogICAgCiAgICAkYXR0cmliX2FycmF5ID0gYXJyYXkoKTsKICAgIGZvcmVhY2goICRhdHRyaWJzZXRfbGlzdCBhcyAkb25lX2F0dHJpYnNldGlkID0+ICRvbmVfYXR0cmlic2V0bmFtZSApCiAgICAgIHsKCSRvYmogPSBuZXcgU3RkQ2xhc3M7Cgkkb2JqLT5uYW1lID0gJG9uZV9hdHRyaWJzZXRuYW1lOwoJJG9iai0+aWQgPSAkb25lX2F0dHJpYnNldGlkOwoJJHRtcCA9IGNnX2Vjb21tOjpnZXRfYXR0cmlidXRlX2Ryb3Bkb3duX3ZhbHVlcygkcHJvZHVjdCwkb25lX2F0dHJpYnNldGlkKTsKCSR0bXAgPSBhcnJheV9mbGlwKCR0bXApOwoJJG9iai0+Y29udHJvbCA9ICR0aGlzLT5DcmVhdGVJbnB1dERyb3Bkb3duKCRpZCwnY2FydF9hdHRyaWJfJy4kb25lX2F0dHJpYnNldGlkLCR0bXApOwoJJGF0dHJpYl9hcnJheVtdID0gJG9iajsKICAgICAgfQoKICAgICRzbWFydHktPmFzc2lnbignYXR0cmlidXRlcycsJGF0dHJpYl9hcnJheSk7CiAgICAkc21hcnR5LT5hc3NpZ24oJ2F0dHJpYnV0ZV9jb3VudCcsY291bnQoJGF0dHJpYl9hcnJheSkpOwogIH0KCiR0aGV0ZW1wbGF0ZSA9ICdhZGR0b2NhcnRfJy4kdGhpcy0+R2V0UHJlZmVyZW5jZSgnYWRkdG9jYXJ0X2RmbHQnKTsKaWYoIGlzc2V0KCRwYXJhbXNbJ2FkZHRvY2FydHRlbXBsYXRlJ10gKSApCiAgewogICAgJHRoZXRlbXBsYXRlID0gJ2FkZHRvY2FydF8nLiRwYXJhbXNbJ2FkZHRvY2FydHRlbXBsYXRlJ107CiAgfQplY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGVGcm9tRGF0YWJhc2UoJHRoZXRlbXBsYXRlKTsKCiRzbWFydHktPmFzc2lnbignYXR0cmlidXRlX2NvdW50JywwKTsKLy8gRU9GCj8+]]></data>
	</file>
	<file>
	  <filename>/action.defaultadmin.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IENhcnQgLSBBIHNpbXBsZSBleGFtcGxlIGZyb250ZW5kIGZvcm0gbW9kdWxlCiMgVmVyc2lvbjogMS4wLCBjYWxndXkxMDAwIDxjYWxndXkxMDAwQGNtc21hZGVzaW1wbGUub3JnPgojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykKIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZwojIFRoZSBtb2R1bGUncyBob21lcGFnZSBpczogaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy9wcm9qZWN0cy9za2VsZXRvbi8KIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmlmKCAhaXNzZXQoJGdDbXMpICkgZXhpdDsKCmVjaG8gJHRoaXMtPlN0YXJ0VGFiSGVhZGVycygpOwppZiggJHRoaXMtPkNoZWNrUGVybWlzc2lvbignTW9kaWZ5IFRlbXBsYXRlcycpICkKICB7CiAgICBlY2hvICR0aGlzLT5TZXRUYWJIZWFkZXIoJ2FkZHRvY2FydCcsJHRoaXMtPkxhbmcoJ2FkZHRvY2FydF90ZW1wbGF0ZXMnKSk7CiAgICBlY2hvICR0aGlzLT5TZXRUYWJIZWFkZXIoJ215Y2FydGZvcm0nLCR0aGlzLT5MYW5nKCdteWNhcnRmb3JtX3RlbXBsYXRlcycpKTsKICAgIGVjaG8gJHRoaXMtPlNldFRhYkhlYWRlcignbXljYXJ0c2xpc3QnLCR0aGlzLT5MYW5nKCdteWNhcnRzbGlzdF90ZW1wbGF0ZXMnKSk7CiAgICBlY2hvICR0aGlzLT5TZXRUYWJIZWFkZXIoJ2VkaXRzaGlwcGluZycsJHRoaXMtPkxhbmcoJ2VkaXRzaGlwcGluZ190ZW1wbGF0ZXMnKSk7CiAgICBlY2hvICR0aGlzLT5TZXRUYWJIZWFkZXIoJ3ZpZXdjYXJ0Zm9ybScsJHRoaXMtPkxhbmcoJ3ZpZXdjYXJ0Zm9ybV90ZW1wbGF0ZXMnKSk7CiAgICBlY2hvICR0aGlzLT5TZXRUYWJIZWFkZXIoJ2RlZmF1bHR0ZW1wbGF0ZXMnLCR0aGlzLT5MYW5nKCdkZWZhdWx0X3RlbXBsYXRlcycpKTsKICAgIGVjaG8gJHRoaXMtPlNldFRhYkhlYWRlcigncHJvZHVjdHN1bW1hcnl0ZW1wbGF0ZScsJHRoaXMtPkxhbmcoJ3Byb2R1Y3RzdW1tYXJ5X3RlbXBsYXRlJykpOwogIH0KaWYoICR0aGlzLT5DaGVja1Blcm1pc3Npb24oJ01vZGlmeSBTaXRlIFByZWZlcmVuY2VzJykgKQogIHsKICAgIGVjaG8gJHRoaXMtPlNldFRhYkhlYWRlcigncHJlZmVyZW5jZXMnLCR0aGlzLT5MYW5nKCdwcmVmZXJlbmNlcycpKTsKICB9CmVjaG8gJHRoaXMtPkVuZFRhYkhlYWRlcnMoKTsKCmVjaG8gJHRoaXMtPlN0YXJ0VGFiQ29udGVudCgpOwppZiggJHRoaXMtPkNoZWNrUGVybWlzc2lvbignTW9kaWZ5IFRlbW1wbGF0ZXMnKSApCiAgewogICAgZWNobyAkdGhpcy0+U3RhcnRUYWIoJ2FkZHRvY2FydCcpOwogICAgaW5jbHVkZShkaXJuYW1lKF9fRklMRV9fKS4nL2Z1bmN0aW9uLmFkbWluX2FkZHRvY2FydF90YWIucGhwJyk7CiAgICBlY2hvICR0aGlzLT5FbmRUYWIoKTsKCiAgICBlY2hvICR0aGlzLT5TdGFydFRhYignbXljYXJ0Zm9ybScpOwogICAgaW5jbHVkZShkaXJuYW1lKF9fRklMRV9fKS4nL2Z1bmN0aW9uLmFkbWluX215Y2FydGZvcm1fdGFiLnBocCcpOwogICAgZWNobyAkdGhpcy0+RW5kVGFiKCk7CgogICAgZWNobyAkdGhpcy0+U3RhcnRUYWIoJ215Y2FydHNsaXN0Jyk7CiAgICBpbmNsdWRlKGRpcm5hbWUoX19GSUxFX18pLicvZnVuY3Rpb24uYWRtaW5fbXljYXJ0c2xpc3RfdGFiLnBocCcpOwogICAgZWNobyAkdGhpcy0+RW5kVGFiKCk7CgogICAgZWNobyAkdGhpcy0+U3RhcnRUYWIoJ2VkaXRzaGlwcGluZycpOwogICAgaW5jbHVkZShkaXJuYW1lKF9fRklMRV9fKS4nL2Z1bmN0aW9uLmFkbWluX2VkaXRzaGlwcGluZ190YWIucGhwJyk7CiAgICBlY2hvICR0aGlzLT5FbmRUYWIoKTsKCiAgICBlY2hvICR0aGlzLT5TdGFydFRhYigndmlld2NhcnRmb3JtJyk7CiAgICBpbmNsdWRlKGRpcm5hbWUoX19GSUxFX18pLicvZnVuY3Rpb24uYWRtaW5fdmlld2NhcnRmb3JtX3RhYi5waHAnKTsKICAgIGVjaG8gJHRoaXMtPkVuZFRhYigpOwoKICAgIGVjaG8gJHRoaXMtPlN0YXJ0VGFiKCdkZWZhdWx0dGVtcGxhdGVzJyk7CiAgICBpbmNsdWRlKGRpcm5hbWUoX19GSUxFX18pLicvZnVuY3Rpb24uYWRtaW5fZGVmYXVsdHRlbXBsYXRlc190YWIucGhwJyk7CiAgICBlY2hvICR0aGlzLT5FbmRUYWIoKTsKCiAgICBlY2hvICR0aGlzLT5TdGFydFRhYigncHJvZHVjdHN1bW1hcnl0ZW1wbGF0ZScpOwogICAgaW5jbHVkZShkaXJuYW1lKF9fRklMRV9fKS4nL2Z1bmN0aW9uLmFkbWluX3Byb2R1Y3RzdW1tYXJ5dGVtcGxhdGVfdGFiLnBocCcpOwogICAgZWNobyAkdGhpcy0+RW5kVGFiKCk7CiAgfQppZiggJHRoaXMtPkNoZWNrUGVybWlzc2lvbignTW9kaWZ5IFNpdGUgUHJlZmVyZW5jZXMnKSApCiAgewogICAgZWNobyAkdGhpcy0+U3RhcnRUYWIoJ3ByZWZlcmVuY2VzJyk7CiAgICBpbmNsdWRlKGRpcm5hbWUoX19GSUxFX18pLicvZnVuY3Rpb24uYWRtaW5fcHJlZmVyZW5jZXNfdGFiLnBocCcpOwogICAgZWNobyAkdGhpcy0+RW5kVGFiKCk7CiAgfQplY2hvICR0aGlzLT5FbmRUYWJDb250ZW50KCk7Ci8vIEVPRgo/Pg==]]></data>
	</file>
	<file>
	  <filename>/action.deletecart.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IENhcnQgLSBBIHNpbXBsZSBleGFtcGxlIGZyb250ZW5kIGZvcm0gbW9kdWxlCiMgVmVyc2lvbjogMS4wLCBjYWxndXkxMDAwIDxjYWxndXkxMDAwQGNtc21hZGVzaW1wbGUub3JnPgojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykKIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZwojIFRoZSBtb2R1bGUncyBob21lcGFnZSBpczogaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy9wcm9qZWN0cy9za2VsZXRvbi8KIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmlmKCAhaXNzZXQoJGdDbXMpICkgZXhpdDsKCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8gRGVsZXRlIHRoZSBzcGVjaWZpZWQgY2FydCAgICAgICAgICAvLwovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgovLwovLyBJbml0aWFsaXphdGlvbgovLwokZGVzdHBhZ2UgPSAkcmV0dXJuaWQ7CgoKaWYoIGlzc2V0KCRwYXJhbXNbJ2NhcnRfcmV0dXJucGFnZSddKSApCiAgewogICAgJGRlc3RwYWdlID0gKGludCkkcGFyYW1zWydjYXJ0X3JldHVybnBhZ2UnXTsKICB9CmlmKCBpc3NldCgkcGFyYW1zWydjYXJ0X2lkJ10pICkKICB7CiAgICAkdGhpcy0+X2RlbGV0ZV9iYXNrZXQoJHBhcmFtc1snY2FydF9pZCddKTsKICB9CgokdGhpcy0+UmVkaXJlY3RDb250ZW50KCRkZXN0cGFnZSk7Ci8vIEVPRgo/Pg==]]></data>
	</file>
	<file>
	  <filename>/action.editshipping.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IENhcnQgLSBBIHNpbXBsZSBleGFtcGxlIGZyb250ZW5kIGZvcm0gbW9kdWxlCiMgVmVyc2lvbjogMS4wLCBjYWxndXkxMDAwIDxjYWxndXkxMDAwQGNtc21hZGVzaW1wbGUub3JnPgojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykKIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZwojIFRoZSBtb2R1bGUncyBob21lcGFnZSBpczogaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy9wcm9qZWN0cy9za2VsZXRvbi8KIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmlmKCAhaXNzZXQoJGdDbXMpICkgZXhpdDsKCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vIERpc3BsYXkgYSBmb3JtIHRvIGFsbG93IGFuIGF1dGhvcml6ZWQgRkVVIHRvIAovLyBFZGl0IHRoZSBzaGlwcGluZyBpbmZvcm1hdGlvbiBmb3Igb25lIGNhcnQgCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgovLwovLyBJbml0aWFsaXphdGlvbgovLwokdGhldGVtcGxhdGUgPSAnZWRpdHNoaXBwaW5nXycuJHRoaXMtPkdldFByZWZlcmVuY2UoJ2VkaXRzaGlwcGluZ19kZmx0Jyk7CiRzdGF0dXMgPSAnJzsKJG1lc3NhZ2UgPSAnJzsKJGNhcnRfaWQgPSAnJzsKJGRhdGEgPSAnJzsKJGRlc3RwYWdlID0gJHJldHVybmlkOwoKLy8KLy8gU2V0dXAKLy8KaWYoIGlzc2V0KCRwYXJhbXNbJ2VkaXRzaGlwcGluZ3RlbXBsYXRlJ10pICkKICB7CiAgICAkdGhldGVtcGxhdGUgPSAnZWRpdHNoaXBwaW5nXycudHJpbSgkcGFyYW1zWydlZGl0c2hpcHBpbmd0ZW1wbGF0ZSddKTsKICB9CmlmKCBpc3NldCgkcGFyYW1zWydjYXJ0X3JldHVybnBhZ2UnXSkgKQogIHsKICAgICRkZXN0cGFnZSA9IChpbnQpJHBhcmFtc1snY2FydF9yZXR1cm5wYWdlJ107CiAgICBpZiggIWlzc2V0KCRwYXJhbXNbJ2NhcnRfcmV0dXJudG91cmwnXSkgKQogICAgICB7CgkkcGFyYW1zWydjYXJ0X3JldHVybnRvdXJsJ10gPSAkX1NFUlZFUlsnSFRUUF9SRUZFUkVSJ107CiAgICAgIH0KICB9CgoKLy8KLy8gR2V0IERhdGEKLy8KaWYoIGVtcHR5KCRzdGF0dXMpICkKICB7CiAgICBpZiggIWlzc2V0KCRwYXJhbXNbJ2NhcnRfaWQnXSkgKQogICAgICB7Cgkkc3RhdHVzID0gJ2Vycm9yX3BhcmFtJzsKCSRtZXNzYWdlID0gJHRoaXMtPkxhbmcoJ2Vycm9yX21pc3NpbmdwYXJhbScpOwogICAgICB9CiAgICAkY2FydF9pZCA9IHRyaW0oJHBhcmFtc1snY2FydF9pZCddKTsKICB9CmlmKCBlbXB0eSgkc3RhdHVzKSApCiAgewogICAgJGRhdGEgPSAkdGhpcy0+R2V0QmFza2V0RGV0YWlscygkY2FydF9pZCk7CiAgICBpZiggJGRhdGEgPT0gRkFMU0UgKQogICAgICB7Cgkkc3RhdHVzID0gJ2Vycm9yX2RiZXJyb3InOwoJJG1lc3NhZ2UgPSAkdGhpcy0+TGFuZygnZXJyb3Jfbm9zdWNoY2FydCcpOwogICAgICB9CiAgfQoKCi8vCi8vIFByb2Nlc3MgRm9ybSBEYXRhCi8vCmlmKCBpc3NldCgkcGFyYW1zWydjYXJ0X2NhbmNlbCddKSApCiAgewogICAgaWYoICRkZXN0cGFnZSA9PSAtMSApCiAgICAgIHsKCWlmKCBpc3NldCgkcGFyYW1zWydjYXJ0X3JldHVybnRvdXJsJ10pICkKCSAgewoJICAgIHJlZGlyZWN0KCRwYXJhbXNbJ2NhcnRfcmV0dXJudG91cmwnXSk7CgkgIH0KICAgICAgfQogICAgZWxzZQogICAgICB7CgkkdGhpcy0+UmVkaXJlY3RDb250ZW50KCRkZXN0cGFnZSk7CiAgICAgIH0KICB9CmVsc2UgaWYoIGlzc2V0KCRwYXJhbXNbJ2NhcnRfc3VibWl0J10pICkKICB7CiAgICAvLwogICAgLy8gR2F0aGVyIGRhdGEgZnJvbSBwYXJhbXMKICAgIC8vCiAgICBpZiggaXNzZXQoJHBhcmFtc1snY2FydF9uYW1lJ10pICkKICAgICAgewoJJGRhdGFbJ2NhcnRfbmFtZSddID0gdHJpbSgkcGFyYW1zWydjYXJ0X25hbWUnXSk7CiAgICAgIH0KICAgIGlmKCBpc3NldCgkcGFyYW1zWydjYXJ0X2NvbXBhbnknXSkgKQogICAgICB7CgkkZGF0YVsnZGVzdF9jb21wYW55J10gPSB0cmltKCRwYXJhbXNbJ2NhcnRfY29tcGFueSddKTsKICAgICAgfQogICAgaWYoIGlzc2V0KCRwYXJhbXNbJ2NhcnRfZmlyc3RfbmFtZSddKSApCiAgICAgIHsKCSRkYXRhWydkZXN0X2ZpcnN0X25hbWUnXSA9IHRyaW0oJHBhcmFtc1snY2FydF9maXJzdF9uYW1lJ10pOwogICAgICB9CiAgICBpZiggaXNzZXQoJHBhcmFtc1snY2FydF9sYXN0X25hbWUnXSkgKQogICAgICB7CgkkZGF0YVsnZGVzdF9sYXN0X25hbWUnXSA9IHRyaW0oJHBhcmFtc1snY2FydF9sYXN0X25hbWUnXSk7CiAgICAgIH0KICAgIGlmKCBpc3NldCgkcGFyYW1zWydjYXJ0X2FkZHJlc3MxJ10pICkKICAgICAgewoJJGRhdGFbJ2Rlc3RfYWRkcmVzczEnXSA9IHRyaW0oJHBhcmFtc1snY2FydF9hZGRyZXNzMSddKTsKICAgICAgfQogICAgaWYoIGlzc2V0KCRwYXJhbXNbJ2NhcnRfYWRkcmVzczInXSkgKQogICAgICB7CgkkZGF0YVsnZGVzdF9hZGRyZXNzMiddID0gdHJpbSgkcGFyYW1zWydjYXJ0X2FkZHJlc3MyJ10pOwogICAgICB9CiAgICBpZiggaXNzZXQoJHBhcmFtc1snY2FydF9jaXR5J10pICkKICAgICAgewoJJGRhdGFbJ2Rlc3RfY2l0eSddID0gdHJpbSgkcGFyYW1zWydjYXJ0X2NpdHknXSk7CiAgICAgIH0KICAgIGlmKCBpc3NldCgkcGFyYW1zWydjYXJ0X3N0YXRlJ10pICkKICAgICAgewoJJGRhdGFbJ2Rlc3Rfc3RhdGUnXSA9IHRyaW0oJHBhcmFtc1snY2FydF9zdGF0ZSddKTsKICAgICAgfQogICAgaWYoIGlzc2V0KCRwYXJhbXNbJ2NhcnRfcG9zdGFsJ10pICkKICAgICAgewoJJGRhdGFbJ2Rlc3RfcG9zdGFsJ10gPSB0cmltKCRwYXJhbXNbJ2NhcnRfcG9zdGFsJ10pOwogICAgICB9CiAgICBpZiggaXNzZXQoJHBhcmFtc1snY2FydF9jb3VudHJ5J10pICkKICAgICAgewoJJGRhdGFbJ2Rlc3RfY291bnRyeSddID0gdHJpbSgkcGFyYW1zWydjYXJ0X2NvdW50cnknXSk7CiAgICAgIH0KICAgIGlmKCBpc3NldCgkcGFyYW1zWydjYXJ0X3Bob25lJ10pICkKICAgICAgewoJJGRhdGFbJ2Rlc3RfcGhvbmUnXSA9IHRyaW0oJHBhcmFtc1snY2FydF9waG9uZSddKTsKICAgICAgfQogICAgaWYoIGlzc2V0KCRwYXJhbXNbJ2NhcnRfZmF4J10pICkKICAgICAgewoJJGRhdGFbJ2Rlc3RfZmF4J10gPSB0cmltKCRwYXJhbXNbJ2NhcnRfZmF4J10pOwogICAgICB9CiAgICBpZiggaXNzZXQoJHBhcmFtc1snY2FydF9lbWFpbCddKSApCiAgICAgIHsKCSRkYXRhWydkZXN0X2VtYWlsJ10gPSB0cmltKCRwYXJhbXNbJ2NhcnRfZW1haWwnXSk7CiAgICAgIH0KICAgIGlmKCBpc3NldCgkcGFyYW1zWydjYXJ0X21lc3NhZ2UnXSkgKQogICAgICB7CgkkZGF0YVsnZGVzdF9tZXNzYWdlJ10gPSB0cmltKCRwYXJhbXNbJ2NhcnRfbWVzc2FnZSddKTsKICAgICAgfQoKICAgIC8vCiAgICAvLyBEYXRhIHZhbGlkYXRpb24KICAgIC8vCiAgICBpZiggZW1wdHkoJHN0YXR1cykgJiYgZW1wdHkoJGRhdGFbJ2NhcnRfbmFtZSddKSApCiAgICAgIHsKCSRzdGF0dXMgPSAnZXJyb3JfZGF0YSc7CgkkbWVzc2FnZSA9ICR0aGlzLT5MYW5nKCdlcnJvcl9taXNzaW5ncGFyYW0nLCR0aGlzLT5MYW5nKCdjYXJ0X25hbWUnKSk7CiAgICAgIH0KCiAgICBpZiggZW1wdHkoJHN0YXR1cykgJiYgZW1wdHkoJGRhdGFbJ2Rlc3RfZmlyc3RfbmFtZSddKSApCiAgICAgIHsKCSRzdGF0dXMgPSAnZXJyb3JfZGF0YSc7CgkkbWVzc2FnZSA9ICR0aGlzLT5MYW5nKCdlcnJvcl9taXNzaW5ncGFyYW0nLCR0aGlzLT5MYW5nKCdmaXJzdF9uYW1lJykpOwogICAgICB9CgogICAgaWYoIGVtcHR5KCRzdGF0dXMpICYmIGVtcHR5KCRkYXRhWydkZXN0X2xhc3RfbmFtZSddKSApCiAgICAgIHsKCSRzdGF0dXMgPSAnZXJyb3JfZGF0YSc7CgkkbWVzc2FnZSA9ICR0aGlzLT5MYW5nKCdlcnJvcl9taXNzaW5ncGFyYW0nLCR0aGlzLT5MYW5nKCdsYXN0X25hbWUnKSk7CiAgICAgIH0KCiAgICBpZiggZW1wdHkoJHN0YXR1cykgJiYgZW1wdHkoJGRhdGFbJ2Rlc3RfYWRkcmVzczEnXSkgKQogICAgICB7Cgkkc3RhdHVzID0gJ2Vycm9yX2RhdGEnOwoJJG1lc3NhZ2UgPSAkdGhpcy0+TGFuZygnZXJyb3JfbWlzc2luZ3BhcmFtJywkdGhpcy0+TGFuZygnYWRkcmVzczEnKSk7CiAgICAgIH0KCiAgICBpZiggZW1wdHkoJHN0YXR1cykgJiYgZW1wdHkoJGRhdGFbJ2Rlc3RfY2l0eSddKSApCiAgICAgIHsKCSRzdGF0dXMgPSAnZXJyb3JfZGF0YSc7CgkkbWVzc2FnZSA9ICR0aGlzLT5MYW5nKCdlcnJvcl9taXNzaW5ncGFyYW0nLCR0aGlzLT5MYW5nKCdjaXR5JykpOwogICAgICB9CgogICAgaWYoIGVtcHR5KCRzdGF0dXMpICYmIGVtcHR5KCRkYXRhWydkZXN0X3N0YXRlJ10pICkKICAgICAgewoJJHN0YXR1cyA9ICdlcnJvcl9kYXRhJzsKCSRtZXNzYWdlID0gJHRoaXMtPkxhbmcoJ2Vycm9yX21pc3NpbmdwYXJhbScsJHRoaXMtPkxhbmcoJ3N0YXRlJykpOwogICAgICB9CgogICAgaWYoIGVtcHR5KCRzdGF0dXMpICYmIGVtcHR5KCRkYXRhWydkZXN0X2NvdW50cnknXSkgKQogICAgICB7Cgkkc3RhdHVzID0gJ2Vycm9yX2RhdGEnOwoJJG1lc3NhZ2UgPSAkdGhpcy0+TGFuZygnZXJyb3JfbWlzc2luZ3BhcmFtJywkdGhpcy0+TGFuZygnY291bnRyeScpKTsKICAgICAgfQoKICAgIGlmKCBlbXB0eSgkc3RhdHVzKSAmJiBlbXB0eSgkZGF0YVsnZGVzdF9lbWFpbCddKSApCiAgICAgIHsKCSRzdGF0dXMgPSAnZXJyb3JfZGF0YSc7CgkkbWVzc2FnZSA9ICR0aGlzLT5MYW5nKCdlcnJvcl9taXNzaW5ncGFyYW0nLCR0aGlzLT5MYW5nKCdlbWFpbCcpKTsKICAgICAgfQoKICAgIGlmKCBlbXB0eSgkc3RhdHVzKSApCiAgICAgIHsKCSRyZXMgPSAkdGhpcy0+X3NldF9iYXNrZXRfZGF0YSgkY2FydF9pZCwkZGF0YSk7CglpZiggJHJlcyA9PSBGQUxTRSApCgkgIHsKCSAgICAkc3RhdHVzID0gJ2Vycm9yX2RhdGEnOwoJICAgICRtZXNzYWdlID0gJHRoaXMtPkxhbmcoJ2Vycm9yX3NldGJhc2tldGRhdGEnKTsKCSAgfQogICAgICB9CgogICAgaWYoIGVtcHR5KCRzdGF0dXMpICkKICAgICAgewoJaWYoICRkZXN0cGFnZSA9PSAtMSApCgkgIHsKCSAgICBpZiggaXNzZXQoJHBhcmFtc1snY2FydF9yZXR1cm50b3VybCddKSApCgkgICAgICB7CgkJcmVkaXJlY3QoJHBhcmFtc1snY2FydF9yZXR1cm50b3VybCddKTsKCSAgICAgIH0KCSAgfQoJZWxzZQoJICB7CgkgICAgJHRoaXMtPlJlZGlyZWN0Q29udGVudCgkZGVzdHBhZ2UpOwoJICB9CiAgICAgIH0KICB9CgovLwovLyBHaXZlIGl0IHRvIHNtYXJ0eQovLwppZiggIWVtcHR5KCRzdGF0dXMpICkKICB7CiAgICAkc21hcnR5LT5hc3NpZ24oJ3N0YXR1cycsJHN0YXR1cyk7CiAgICAkc21hcnR5LT5hc3NpZ24oJ21lc3NhZ2UnLCRtZXNzYWdlKTsKICB9CgppZiggaXNfYXJyYXkoJGRhdGEpICkKICB7CiAgICAkc21hcnR5LT5hc3NpZ24oJ2NhcnRfbmFtZScsJGNhcnRfaWQpOwogICAgaWYoICRjYXJ0X2lkID09IEdJRlRCQVNLRVRTX05BTUVfTVlTRUxGICkKICAgICAgewoJJHNtYXJ0eS0+YXNzaWduKCdjYXJ0X25hbWUnLCR0aGlzLT5MYW5nKCdteXNlbGYnKSk7CiAgICAgIH0KICAgICRzbWFydHktPmFzc2lnbigncmVjb3JkJywkZGF0YSk7CiAgfQokc21hcnR5LT5hc3NpZ24oJ2Zvcm1zdGFydCcsCgkJJHRoaXMtPkNHQ3JlYXRlRm9ybVN0YXJ0KCRpZCwnZWRpdHNoaXBwaW5nJywkcmV0dXJuaWQsJHBhcmFtcykpOwokc21hcnR5LT5hc3NpZ24oJ2Zvcm1lbmQnLCR0aGlzLT5DcmVhdGVGb3JtRW5kKCkpOwoKLy8gCi8vIERpc3BsYXkgdGhlIHRlbXBsYXRlCi8vCmVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZUZyb21EYXRhYmFzZSgkdGhldGVtcGxhdGUpOwoKLy8gRU9GCj8+]]></data>
	</file>
	<file>
	  <filename>/action.loadinfo.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IENhcnQgLSBBIHNpbXBsZSBleGFtcGxlIGZyb250ZW5kIGZvcm0gbW9kdWxlCiMgVmVyc2lvbjogMS4wLCBjYWxndXkxMDAwIDxjYWxndXkxMDAwQGNtc21hZGVzaW1wbGUub3JnPgojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykKIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZwojIFRoZSBtb2R1bGUncyBob21lcGFnZSBpczogaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy9wcm9qZWN0cy9za2VsZXRvbi8KIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmlmKCAhaXNzZXQoJGdDbXMpICkgZXhpdDsKJGNvbmZpZyA9JiAkZ0Ntcy0+R2V0Q29uZmlnKCk7CgpmdW5jdGlvbiBkb19yZWRpcmVjdCgmJG1vZHVsZSwkdXJsLCRwYWdlaWQpCnsKICBpZiggIWVtcHR5KCR1cmwpICkKICAgIHsKICAgICAgcmVkaXJlY3QoJHVybCk7CiAgICB9CiAgJG1vZHVsZS0+UmVkaXJlY3RDb250ZW50KCRwYWdlaWQpOwp9CgokZGVzdHVybCA9ICcnOwppZiggaXNzZXQoJF9TRVJWRVJbJ0hUVFBfUkVGRVJFUiddKSAmJiAhZW1wdHkoJF9TRVJWRVJbJ0hUVFBfUkVGRVJFUiddKSApCiAgewogICAgJGRlc3R1cmwgPSAkX1NFUlZFUlsnSFRUUF9SRUZFUkVSJ107CiAgfQoKJGZldSA9JiAkdGhpcy0+R2V0TW9kdWxlSW5zdGFuY2UoJ0Zyb250RW5kVXNlcnMnKTsKaWYoICEkZmV1ICkKICB7CiAgICAvLyBubyBmZXUgbW9kdWxlCiAgICBkb19yZWRpcmVjdCgkdGhpcywkZGVzdHVybCwkcmV0dXJuaWQpOwogIH0KJHVpZCA9ICRmZXUtPkxvZ2dlZEluSWQoKTsKaWYoICEkdWlkIHx8ICR1aWQgPD0gMCApCiAgewogICAgLy8gbm90IGxvZ2dlZCBpbgogICAgZG9fcmVkaXJlY3QoJHRoaXMsJGRlc3R1cmwsJHJldHVybmlkKTsKICB9CgovLyBtYWtlIHN1cmUgdGhlIGNhcnQgaXMgY29sbGFwc2VkCiR0aGlzLT5fY29sbGFwc2VfY2FydCgpOwoKJGRuID0gY21zX2pvaW5fcGF0aCgkY29uZmlnWyd1cGxvYWRzX3BhdGgnXSwkdGhpcy0+R2V0TmFtZSgpKTsKJGZuID0gY21zX2pvaW5fcGF0aCgkZG4sJ2RhdGFfJy4kdWlkLicuZGF0Jyk7CiRkYXRhID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRmbik7CmlmKCAhZW1wdHkoJGRhdGEpICkKICB7CiAgICAkX1NFU1NJT05bJ2dpZnRiYXNrZXRzJ10gPSBiYXNlNjRfZGVjb2RlKCRkYXRhKTsKICB9CgovLyBkb25lCmRvX3JlZGlyZWN0KCR0aGlzLCRkZXN0dXJsLCRyZXR1cm5pZCk7CgovLyBFT0YKPz4=]]></data>
	</file>
	<file>
	  <filename>/action.mycart.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IENhcnQgLSBBIHNpbXBsZSBleGFtcGxlIGZyb250ZW5kIGZvcm0gbW9kdWxlCiMgVmVyc2lvbjogMS4wLCBjYWxndXkxMDAwIDxjYWxndXkxMDAwQGNtc21hZGVzaW1wbGUub3JnPgojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykKIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZwojIFRoZSBtb2R1bGUncyBob21lcGFnZSBpczogaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy9wcm9qZWN0cy9za2VsZXRvbi8KIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmlmKCAhaXNzZXQoJGdDbXMpICkgZXhpdDsKCgovLwovLyBJbml0aWFsaXphdGlvbgovLwokdmlld2NhcnRwYWdlID0gJHJldHVybmlkOwokdGhldGVtcGxhdGUgPSAnbXljYXJ0Zm9ybV8nLiR0aGlzLT5HZXRQcmVmZXJlbmNlKCdteWNhcnRmb3JtX2RmbHQnKTsKCgovLwovLyBTZXR1cAovLwppZiggaXNzZXQoJHBhcmFtc1snbXljYXJ0Zm9ybXRlbXBsYXRlJ10gKSApCiAgewogICAgJHRoZXRlbXBsYXRlID0gJ215Y2FydGZvcm1fJy4kcGFyYW1zWydteWNhcnR0ZW1wbGF0ZSddOwogIH0KaWYgKGlzc2V0KCRwYXJhbXNbJ3ZpZXdjYXJ0cGFnZSddKSkKICB7CiAgICAkbWFuYWdlciA9JiAkZ0Ntcy0+R2V0SGllcmFyY2h5TWFuYWdlcigpOwogICAgJG5vZGUgPSYgJG1hbmFnZXItPnN1cmVHZXROb2RlQnlBbGlhcygkcGFyYW1zWyd2aWV3Y2FydHBhZ2UnXSk7CiAgICBpZiAoaXNzZXQoJG5vZGUpKQogICAgICB7CgkkY29udGVudCA9JiAkbm9kZS0+R2V0Q29udGVudCgpOwkKCWlmIChpc3NldCgkY29udGVudCkpCgkgIHsKCSAgICAkdmlld2NhcnRwYWdlID0gJGNvbnRlbnQtPklkKCk7CgkgIH0KICAgICAgfQogICAgZWxzZQogICAgICB7Cgkkbm9kZSA9JiAkbWFuYWdlci0+c3VyZUdldE5vZGVCeUlkKCRwYXJhbXNbJ3ZpZXdjYXJ0cGFnZSddKTsKCWlmIChpc3NldCgkbm9kZSkpCgkgIHsKCSAgICAkdmlld2NhcnRwYWdlID0gJHBhcmFtc1sndmlld2NhcnRwYWdlJ107CgkgIH0KICAgICAgfQogIH0KCgovLwovLyBHZXQgRGF0YQovLwokdGhpcy0+X2NhbGN1bGF0ZV9jYXJ0X21ldGFkYXRhKDEpOwoKLy8KLy8gR2l2ZSBpdCB0byBzbWFydHkKLy8KJHNtYXJ0eS0+YXNzaWduKCdjdXJyZW5jeXN5bWJvbCcsY2dfZWNvbW06OmdldF9jdXJyZW5jeV9zeW1ib2woKSk7CiRzbWFydHktPmFzc2lnbignd2VpZ2h0dW5pdHMnLGNnX2Vjb21tOjpnZXRfd2VpZ2h0X3VuaXRzKCkpOwokc21hcnR5LT5hc3NpZ24oJ2NhcnRfbnVtaXRlbXMnLCR0aGlzLT5fbnVtaXRlbXMpOwokc21hcnR5LT5hc3NpZ24oJ2NhcnRfc3VidG90YWwnLCR0aGlzLT5fc3VidG90YWwpOwokc21hcnR5LT5hc3NpZ24oJ2NhcnRfd2VpZ2h0JywkdGhpcy0+X3dlaWdodCk7CgovLwovLyBEaXNwbGF5IHRoZSB0ZW1wbGF0ZQovLwplY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGVGcm9tRGF0YWJhc2UoJHRoZXRlbXBsYXRlKTsKCgovLyBFT0YKPz4K]]></data>
	</file>
	<file>
	  <filename>/action.mycartslist.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IENhcnQgLSBBIHNpbXBsZSBleGFtcGxlIGZyb250ZW5kIGZvcm0gbW9kdWxlCiMgVmVyc2lvbjogMS4wLCBjYWxndXkxMDAwIDxjYWxndXkxMDAwQGNtc21hZGVzaW1wbGUub3JnPgojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykKIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZwojIFRoZSBtb2R1bGUncyBob21lcGFnZSBpczogaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy9wcm9qZWN0cy9za2VsZXRvbi8KIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmlmKCAhaXNzZXQoJGdDbXMpICkgZXhpdDsKCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8gRGlzcGxheSBhIGxpc3Qgb2YgbXkgY3VycmVudCBjYXJ0cyAvLwovLyBBbmQgYWxsb3cgbWUgdG8gbWFuYWdlIHRoZW0gICAgICAgIC8vCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCi8vCi8vIEluaXRpYWxpemF0aW9uCi8vCiR0aGV0ZW1wbGF0ZSA9ICdteWNhcnRzbGlzdF8nLiR0aGlzLT5HZXRQcmVmZXJlbmNlKCdteWNhcnRzbGlzdF9kZmx0Jyk7CiRzb3J0YnkgPSAnY3JlYXRlX2RhdGUnOwokc29ydG9yZGVyID0gJ0FTQyc7CiRkZXN0cGFnZSA9ICRyZXR1cm5pZDsKJHJlc3VsdHMgPSAnJzsKCi8vCi8vIFNldHVwCi8vCmlmIChpc3NldCgkcGFyYW1zWydkZXRhaWxwYWdlJ10pKQogIHsKICAgICRtYW5hZ2VyID0mICRnQ21zLT5HZXRIaWVyYXJjaHlNYW5hZ2VyKCk7CiAgICAkbm9kZSA9JiAkbWFuYWdlci0+c3VyZUdldE5vZGVCeUFsaWFzKCRwYXJhbXNbJ2RldGFpbHBhZ2UnXSk7CiAgICBpZiAoaXNzZXQoJG5vZGUpKQogICAgICB7CgkkY29udGVudCA9JiAkbm9kZS0+R2V0Q29udGVudCgpOwkKCWlmIChpc3NldCgkY29udGVudCkpCgkgIHsKCSAgICAkZGV0YWlscGFnZSA9ICRjb250ZW50LT5JZCgpOwoJICB9CiAgICAgIH0KICAgIGVsc2UKICAgICAgewoJJG5vZGUgPSYgJG1hbmFnZXItPnN1cmVHZXROb2RlQnlJZCgkcGFyYW1zWydkZXRhaWxwYWdlJ10pOwoJaWYgKGlzc2V0KCRub2RlKSkKCSAgewoJICAgICRkZXRhaWxwYWdlID0gJHBhcmFtc1snZGV0YWlscGFnZSddOwoJICB9CiAgICAgIH0KICB9CmlmKCBpc3NldCgkcGFyYW1zWydteWNhcnRzdGVtcGxhdGUnXSkgKQogIHsKICAgICR0aGV0ZW1wbGF0ZSA9ICdteWNhcnRzbGlzdF8nLnRyaW0oJHBhcmFtc1snbXljYXJ0c3RlbXBsYXRlJ10pOwogIH0KCmlmKCBpc3NldCgkcGFyYW1zWydzb3J0YnknXSkgKQogIHsKICAgIHN3aXRjaCgkcGFyYW1zWydzb3J0YnknXSkKICAgICAgewogICAgICBjYXNlICdjYXJ0X25hbWUnOgogICAgICBjYXNlICdjcmVhdGVfZGF0ZSc6CiAgICAgIGNhc2UgJ21vZGlmaWVkX2RhdGUnOgoJJHNvcnRieSA9IHRyaW0oJHBhcmFtc1snc29ydGJ5J10pOwoJYnJlYWs7CiAgICAgIGNhc2UgJ2NvbXBhbnknOgogICAgICBjYXNlICdmaXJzdF9uYW1lJzoKICAgICAgY2FzZSAnbGFzdF9uYW1lJzoKICAgICAgY2FzZSAnYWRkcmVzczEnOgogICAgICBjYXNlICdhZGRyZXNzMic6CiAgICAgIGNhc2UgJ2NpdHknOgogICAgICBjYXNlICdzdGF0ZSc6CiAgICAgIGNhc2UgJ2NvdW50cnknOgoJJHNvcnRieSA9ICdkZXN0XycudHJpbSgkcGFyYW1zWydzb3J0YnknXSk7CiAgICAgIGRlZmF1bHQ6CgkvLyBlcnJvciAtIGlnbm9yZQoJYnJlYWs7CiAgICAgIH0KICB9CmlmKCBpc3NldCgkcGFyYW1zWydzb3J0b3JkZXInXSkgKQogIHsKICAgICR0bXAgPSBzdHJ0b3VwcGVyKCRwYXJhbXNbJ3NvcnRvcmRlciddKTsKICAgIHN3aXRjaCgkdG1wKQogICAgICB7CiAgICAgIGNhc2UgJ0FTQyc6CiAgICAgIGNhc2UgJ0RFU0MnOgoJJHNvcnRvcmRlciA9ICR0bXA7CglicmVhazsKICAgICAgZGVmYXVsdDoKCS8vIGVycm9yIC0gaWdub3JlCglicmVhazsKICAgICAgfQogIH0KCgovLwovLyBHZXQgRGF0YQovLwoKLy8gZ2V0IHRoZSBsaXN0IG9mIG15IGNhcnRzLCBhbmQgYWxsIHRoZSBkYXRhIGFib3V0IHRoZW0uCiR0aGlzLT5fY2FsY3VsYXRlX2NhcnRfbWV0YWRhdGEoKTsKCiRyZXN1bHRzID0gYXJyYXkoKTsKZm9yZWFjaCggJHRoaXMtPl9jYXJ0cyBhcyAkbmFtZSA9PiAkY2FydCApCnsKICAkZGF0YSA9IGFycmF5KCk7CiAgJHRtcCA9IGdldF9vYmplY3RfdmFycygkY2FydCk7CiAgZm9yZWFjaCggJHRtcCBhcyAka2V5ID0+ICR2YWx1ZSApCiAgICB7CiAgICAgICRkYXRhWyRrZXldID0gJHZhbHVlOwogICAgfQogICRkYXRhWydudW1faXRlbXMnXSA9ICRjYXJ0LT5udW1pdGVtczsKCiAgJHBhcmFtc1snY2FydF9pZCddID0gJG5hbWU7CiAgJHBhcmFtc1snY2FydF9yZXR1cm5wYWdlJ10gPSAkcmV0dXJuaWQ7CiAgJGRhdGFbJ2VkaXRzaGlwcGluZ191cmwnXSA9IAogICAgJHRoaXMtPkNyZWF0ZVVSTCgkaWQsJ2VkaXRzaGlwcGluZycsJGRlc3RwYWdlLCAkcGFyYW1zKTsKICAkZGF0YVsnZWRpdGNhcnRfdXJsJ10gPSAKICAgICR0aGlzLT5DcmVhdGVVUkwoJGlkLCd2aWV3Y2FydCcsJGRlc3RwYWdlLCAkcGFyYW1zKTsKICAkZGF0YVsnZGVsZXRlY2FydF91cmwnXSA9IAogICAgJHRoaXMtPkNyZWF0ZVVSTCgkaWQsJ2RlbGV0ZWNhcnQnLCRkZXN0cGFnZSwgJHBhcmFtcyk7CiAgJGRhdGFbJ2NhcnQnXSA9ICRjYXJ0OwogICRyZXN1bHRzW10gPSAkZGF0YTsKfQoKCi8vCi8vIEdpdmUgaXQgdG8gc21hcnR5Ci8vCiRzbWFydHktPmFzc2lnbignY3VycmVuY3lfc3ltYm9sJyxjZ19lY29tbTo6Z2V0X2N1cnJlbmN5X3N5bWJvbCgpKTsKJHNtYXJ0eS0+YXNzaWduKCd3ZWlnaHRfdW5pdHMnLGNnX2Vjb21tOjpnZXRfd2VpZ2h0X3VuaXRzKCkpOwppZiggaXNfYXJyYXkoJHJlc3VsdHMpICYmIGNvdW50KCRyZXN1bHRzKSApCiAgewogICAgJHNtYXJ0eS0+YXNzaWduKCdlbnRyaWVzJywkcmVzdWx0cyk7CiAgfQoKLy8gCi8vIFByb2Nlc3MgVGVtcGxhdGUKLy8KZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlRnJvbURhdGFiYXNlKCR0aGV0ZW1wbGF0ZSk7Ci8vIEVPRgo/Pg==]]></data>
	</file>
	<file>
	  <filename>/action.saveinfo.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IENhcnQgLSBBIHNpbXBsZSBleGFtcGxlIGZyb250ZW5kIGZvcm0gbW9kdWxlCiMgVmVyc2lvbjogMS4wLCBjYWxndXkxMDAwIDxjYWxndXkxMDAwQGNtc21hZGVzaW1wbGUub3JnPgojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykKIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZwojIFRoZSBtb2R1bGUncyBob21lcGFnZSBpczogaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy9wcm9qZWN0cy9za2VsZXRvbi8KIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmlmKCAhaXNzZXQoJGdDbXMpICkgZXhpdDsKJGNvbmZpZyA9JiAkZ0Ntcy0+R2V0Q29uZmlnKCk7CgpmdW5jdGlvbiBkb19yZWRpcmVjdCgmJG1vZHVsZSwkdXJsLCRwYWdlaWQpCnsKICBpZiggIWVtcHR5KCR1cmwpICkKICAgIHsKICAgICAgcmVkaXJlY3QoJHVybCk7CiAgICB9CiAgJG1vZHVsZS0+UmVkaXJlY3RDb250ZW50KCRwYWdlaWQpOwp9CgokZGVzdHVybCA9ICcnOwppZiggaXNzZXQoJF9TRVJWRVJbJ0hUVFBfUkVGRVJFUiddKSAmJiAhZW1wdHkoJF9TRVJWRVJbJ0hUVFBfUkVGRVJFUiddKSApCiAgewogICAgJGRlc3R1cmwgPSAkX1NFUlZFUlsnSFRUUF9SRUZFUkVSJ107CiAgfQoKJGZldSA9JiAkdGhpcy0+R2V0TW9kdWxlSW5zdGFuY2UoJ0Zyb250RW5kVXNlcnMnKTsKaWYoICEkZmV1ICkKICB7CiAgICAvLyBubyBmZXUgbW9kdWxlCiAgICBkb19yZWRpcmVjdCgkdGhpcywkZGVzdHVybCwkcmV0dXJuaWQpOwogIH0KJHVpZCA9ICRmZXUtPkxvZ2dlZEluSWQoKTsKaWYoICEkdWlkIHx8ICR1aWQgPD0gMCApCiAgewogICAgLy8gbm90IGxvZ2dlZCBpbgogICAgZG9fcmVkaXJlY3QoJHRoaXMsJGRlc3R1cmwsJHJldHVybmlkKTsKICB9CgovLyBtYWtlIHN1cmUgdGhlIGNhcnQgaXMgY29sbGFwc2VkCiR0aGlzLT5fY2FsY3VsYXRlX2NhcnRfbWV0YWRhdGEoKTsKJHRoaXMtPl9jb2xsYXBzZV9jYXJ0KCk7CgokZG4gPSBjbXNfam9pbl9wYXRoKCRjb25maWdbJ3VwbG9hZHNfcGF0aCddLCR0aGlzLT5HZXROYW1lKCkpOwpAbWtkaXIoJGRuKTsKJGZuID0gY21zX2pvaW5fcGF0aCgkZG4sJ2RhdGFfJy4kdWlkLicuZGF0Jyk7CiRkYXRhID0gYmFzZTY0X2VuY29kZSgkX1NFU1NJT05bJ2dpZnRiYXNrZXRzJ10pOwpAZmlsZV9wdXRfY29udGVudHMoJGZuLCRkYXRhKTsKCi8vIGRvbmUKZG9fcmVkaXJlY3QoJHRoaXMsJGRlc3R1cmwsJHJldHVybmlkKTsKCi8vIEVPRgo/Pg==]]></data>
	</file>
	<file>
	  <filename>/action.viewcart.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IENhcnQgLSBBIHNpbXBsZSBleGFtcGxlIGZyb250ZW5kIGZvcm0gbW9kdWxlCiMgVmVyc2lvbjogMS4wLCBjYWxndXkxMDAwIDxjYWxndXkxMDAwQGNtc21hZGVzaW1wbGUub3JnPgojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykKIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZwojIFRoZSBtb2R1bGUncyBob21lcGFnZSBpczogaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy9wcm9qZWN0cy9za2VsZXRvbi8KIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmlmKCAhaXNzZXQoJGdDbXMpICkgZXhpdDsKCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vIEFsbG93IGVkaXRpbmcgY29udGVudHMgb2YgYSBzcGVjaWZpYyBjYXJ0IC8vCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgovLwovLyBJbml0aWFsaXphdGlvbgovLwokZGVzdHBhZ2UgPSAkcmV0dXJuaWQ7CiR0aGV0ZW1wbGF0ZSA9ICd2aWV3Y2FydGZvcm1fJy4kdGhpcy0+R2V0UHJlZmVyZW5jZSgndmlld2NhcnRmb3JtX2RmbHQnKTsKJHN0YXR1cyA9ICcnOwokbWVzc2FnZSA9ICcnOwokY2FydF9pZCA9ICcnOwoKLy8KLy8gU2V0dXAKLy8KaWYoIGlzc2V0KCRwYXJhbXNbJ3ZpZXdjYXJ0dGVtcGxhdGUnXSkgKQogIHsKICAgICR0aGV0ZW1wbGF0ZSA9ICd2aWV3Y2FydGZvcm1fJy50cmltKCRwYXJhbXNbJ3ZpZXdjYXJ0dGVtcGxhdGUnXSk7CiAgfQppZiggIWlzc2V0KCRwYXJhbXNbJ2NhcnRfaWQnXSkgKQogIHsKICAgICRzdGF0dXMgPSAnZXJyb3JfcGFyYW0nOwogICAgJG1lc3NhZ2UgPSAkdGhpcy0+TGFuZygnZXJyb3JfbWlzc2luZ3BhcmFtJyk7CiAgfQokY2FydF9pZCA9IHRyaW0oJHBhcmFtc1snY2FydF9pZCddKTsKCi8vCi8vIFByb2Nlc3MgZm9ybSBkYXRhCi8vCmlmKCBlbXB0eSgkc3RhdHVzKSApCiAgewogICAgJGRlbGV0ZWQgPSAwOwogICAgZm9yZWFjaCggJHBhcmFtcyBhcyAka2V5ID0+ICR2YWx1ZSApCiAgICAgIHsKCS8vIGNoZWNrIGZvciBkZWxldGVkIGl0ZW1zCglpZiggcHJlZ19tYXRjaCggJy9jYXJ0X2RlbGV0ZV8vJywgJGtleSApICkKCSAgewoJICAgICR0aGlzLT5fZXhwYW5kX2NhcnQoKTsKCSAgICAkdGhlY2FydCA9JiAkdGhpcy0+X2NhcnRzWyRjYXJ0X2lkXTsKCSAgICAKCSAgICAkdG1wID0gYXJyYXkoKTsKCSAgICAkaWR4ID0gKGludClzdWJzdHIoJGtleSwxMik7CgkgICAgZm9yKCAkaSA9IDA7ICRpIDwgY291bnQoJHRoZWNhcnQtPml0ZW1zKTsgJGkrKyApCgkgICAgICB7CgkJaWYoICRpID09ICRpZHggKSBjb250aW51ZTsKCQkkdG1wW10gPSAkdGhlY2FydC0+aXRlbXNbJGldOwoJICAgICAgfQoJICAgICR0aGVjYXJ0LT5pdGVtcyA9ICR0bXA7CgkgICAgJHRoaXMtPl9jb2xsYXBzZV9jYXJ0KCk7CgkgICAgJGRlbGV0ZWQgPSAxOwoJICB9CgkKICAgICAgfQoKICAgIGlmKCAkZGVsZXRlZCApCiAgICAgIHsKCSR0aGlzLT5SZWRpcmVjdENvbnRlbnQoJHJldHVybmlkKTsKICAgICAgfQogIH0KCmlmKCBlbXB0eSgkc3RhdHVzKSAmJiBpc3NldCgkcGFyYW1zWydjYXJ0X2FkanVzdCddKSApCiAgewogICAgLy8gUHJvY2VzcyBzdWJtaXQKICAgIC8vIGV4cGFuZCB0aGUgY2FydCBmcm9tIHRoZSBzZXNzaW9uCiAgICAkdGhpcy0+X2V4cGFuZF9jYXJ0KCk7CiAgICAkdGhlY2FydCA9JiAkdGhpcy0+X2NhcnRzWyRjYXJ0X2lkXTsKCiAgICAvLyBhZGp1c3QgdGhlIHF1YW50aXR5CiAgICAkaWR4ID0gMDsKICAgIGZvcmVhY2goICRwYXJhbXMgYXMgJGtleSA9PiAkdmFsdWUgKQogICAgICB7CglpZiggcHJlZ19tYXRjaCggJy9jYXJ0X3F1YW50aXR5Xy8nLCAka2V5ICkgKQoJICB7CgkgICAgJGlkeCA9IChpbnQpc3Vic3RyKCRrZXksMTQpOwoJICAgICR0aGVjYXJ0LT5pdGVtc1skaWR4XS0+c2V0X3F1YW50aXR5KCR2YWx1ZSk7CgkgIH0KICAgICAgfQogICAgCiAgICAkdG1wID0gYXJyYXkoKTsKICAgIGZvciggJGkgPSAwOyAkaSA8IGNvdW50KCR0aGVjYXJ0LT5pdGVtcyk7ICRpKysgKQogICAgICB7CglpZiggJHRoZWNhcnQtPml0ZW1zWyRpXS0+Z2V0X3F1YW50aXR5KCkgPD0gMCApIGNvbnRpbnVlOwoJJHRtcFtdID0gJHRoZWNhcnQtPml0ZW1zWyRpXTsKICAgICAgfQogICAgJHRoZWNhcnQtPml0ZW1zID0gJHRtcDsKCiAgICAvLyBjb2xsYXBzZSB0aGUgY2FydCBiYWNrIHRvIHRoZSBzZXNzaW9uCiAgICAkdGhpcy0+X2NvbGxhcHNlX2NhcnQoKTsKICAKICAgICR0aGlzLT5SZWRpcmVjdENvbnRlbnQoJHJldHVybmlkKTsKICB9CgoKLy8KLy8gR2l2ZSBEYXRhIHRvIFNtYXJ0eQovLwokY29uZmlnID0mICRnQ21zLT5HZXRDb25maWcoKTsKJHRoaXMtPl9jYWxjdWxhdGVfY2FydF9tZXRhZGF0YSgxKTsKJHRoZWNhcnQgPSYgJHRoaXMtPl9jYXJ0c1skY2FydF9pZF07CmZvciggJGkgPSAwOyAkaSA8IGNvdW50KCR0aGVjYXJ0LT5pdGVtcyk7ICRpKysgKQp7CiAgJG9iaiA9JiAkdGhlY2FydC0+aXRlbXNbJGldOwogICRvYmotPnByb2R1Y3QgPSBjZ19lY29tbTo6Z2V0X3Byb2R1Y3RfaW5mbygkb2JqLT5nZXRfc291cmNlKCksJG9iai0+Z2V0X3Byb2R1Y3RfaWQoKSk7CiAgJG9iai0+cXVhbnRpdHlfZmxkbmFtZSA9ICRpZC4nY2FydF9xdWFudGl0eV8nLiRpOwogICRvYmotPmRlbGV0ZV9mbGRuYW1lID0gJGlkLidjYXJ0X2RlbGV0ZV8nLiRpOwp9Cgokc21hcnR5LT5hc3NpZ24oJ2NhcnQnLCR0aGVjYXJ0KTsKJHNtYXJ0eS0+YXNzaWduKCdjdXJyZW5jeXN5bWJvbCcsY2dfZWNvbW06OmdldF9jdXJyZW5jeV9zeW1ib2woKSk7CiRzbWFydHktPmFzc2lnbignd2VpZ2h0dW5pdHMnLGNnX2Vjb21tOjpnZXRfd2VpZ2h0X3VuaXRzKCkpOwppZiggIWlzc2V0KCRwYXJhbXNbJ2hpZGVmb3JtJ10pICkKICB7CiAgICAkc21hcnR5LT5hc3NpZ24oJ2Zvcm1zdGFydCcsJHRoaXMtPkNHQ3JlYXRlRm9ybVN0YXJ0KCRpZCwndmlld2NhcnQnLCRkZXN0cGFnZSwkcGFyYW1zKSk7CiAgICAkc21hcnR5LT5hc3NpZ24oJ2Zvcm1lbmQnLCR0aGlzLT5DcmVhdGVGb3JtRW5kKCkpOwogICAgJHNtYXJ0eS0+YXNzaWduKCdzdWJtaXRfbmFtZScsJGlkLidjYXJ0X2FkanVzdCcpOwogIH0KCgovLwovLyBQcm9jZXNzIFRlbXBsYXRlCi8vCmVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZUZyb21EYXRhYmFzZSgkdGhldGVtcGxhdGUpOwoKLy8gRU9GCj8+]]></data>
	</file>
	<file>
	  <filename>/facebook-platform/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/facebook-platform/footprints/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/facebook-platform/footprints/config.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8vIEdldCB0aGVzZSBmcm9tIGh0dHA6Ly9kZXZlbG9wZXJzLmZhY2Vib29rLmNvbQokYXBpX2tleSA9ICdZT1VSX0FQSV9LRVknOwokc2VjcmV0ICA9ICdZT1VSX1NFQ1JFVCc7Ci8qIFdoaWxlIHlvdSdyZSB0aGVyZSwgeW91J2xsIGFsc28gd2FudCB0byBzZXQgdXAgeW91ciBjYWxsYmFjayB1cmwgdG8gdGhlIHVybAogKiBvZiB0aGUgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgRm9vdHByaW50cycgaW5kZXgucGhwLCBhbmQgeW91IGNhbiBzZXQgdGhlCiAqIGZyYW1lZCBwYWdlIFVSTCB0byB3aGF0ZXZlciB5b3Ugd2FudC4gIFlvdSBzaG91bGQgYWxzbyBzd2FwIHRoZSByZWZlcmVuY2VzCiAqIGluIHRoZSBjb2RlIGZyb20gaHR0cDovL2FwcHMuZmFjZWJvb2suY29tL2Zvb3RwcmludHMvIHRvIHlvdXIgZnJhbWVkIHBhZ2UgVVJMLiAqLwoKLy8gVGhlIElQIGFkZHJlc3Mgb2YgeW91ciBkYXRhYmFzZQokZGJfaXAgPSAnMTAuMC4wLjAnOyAgICAgICAgICAgCgokZGJfdXNlciA9ICdyb290JzsKJGRiX3Bhc3MgPSAnWU9VUl9EQl9QQVNTV09SRCc7CgovLyB0aGUgbmFtZSBvZiB0aGUgZGF0YWJhc2UgdGhhdCB5b3UgY3JlYXRlIGZvciBmb290cHJpbnRzLgokZGJfbmFtZSA9ICdmb290cHJpbnRzJzsKCi8qIGNyZWF0ZSB0aGlzIHRhYmxlIG9uIHRoZSBkYXRhYmFzZToKQ1JFQVRFIFRBQkxFIGBmb290cHJpbnRzYCAoCiAgYGZyb21gIGludCgxMSkgTk9UIE5VTEwgZGVmYXVsdCAnMCcsCiAgYHRvYCBpbnQoMTEpIE5PVCBOVUxMIGRlZmF1bHQgJzAnLAogIGB0aW1lYCBpbnQoMTEpIE5PVCBOVUxMIGRlZmF1bHQgJzAnLAogIEtFWSBgZnJvbWAgKGBmcm9tYCksCiAgS0VZIGB0b2AgKGB0b2ApCikKKi8K]]></data>
	</file>
	<file>
	  <filename>/facebook-platform/footprints/index.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8vIHRoZSBmYWNlYm9vayBjbGllbnQgbGlicmFyeQppbmNsdWRlX29uY2UgJy4uL3BocC9mYWNlYm9vay5waHAnOwoKLy8gc29tZSBiYXNpYyBsaWJyYXJ5IGZ1bmN0aW9ucwppbmNsdWRlX29uY2UgJ2xpYi5waHAnOwoKLy8gdGhpcyBkZWZpbmVzIHNvbWUgb2YgeW91ciBiYXNpYyBzZXR1cAppbmNsdWRlX29uY2UgJ2NvbmZpZy5waHAnOwoKJGZhY2Vib29rID0gbmV3IEZhY2Vib29rKCRhcGlfa2V5LCAkc2VjcmV0KTsKJGZhY2Vib29rLT5yZXF1aXJlX2ZyYW1lKCk7CiR1c2VyID0gJGZhY2Vib29rLT5yZXF1aXJlX2xvZ2luKCk7CgppZiAoaXNzZXQoJF9QT1NUWyd0byddKSkgewogICRwcmludHNfaWQgPSAoaW50KSRfUE9TVFsndG8nXTsKICAkcHJpbnRzID0gZG9fc3RlcCgkdXNlciwgJHByaW50c19pZCk7Cn0gZWxzZSB7CiAgaWYgKGlzc2V0KCRfR0VUWyd0byddKSkgewogICAgJHByaW50c19pZCA9IChpbnQpJF9HRVRbJ3RvJ107CiAgfSBlbHNlIHsKICAgICRwcmludHNfaWQgPSAkdXNlcjsKICB9CiAgJHByaW50cyA9IGdldF9wcmludHMoJHByaW50c19pZCk7Cn0KCj8+CjxkaXYgc3R5bGU9InBhZGRpbmc6IDEwcHg7Ij4KICA8aDI+SGkgPGZiOm5hbWUgZmlyc3RuYW1lb25seT0idHJ1ZSIgdWlkPSI8Pz0kdXNlcj8+IiB1c2V5b3U9ImZhbHNlIi8+ITwvaDI+PGJyLz4KICA8YSBocmVmPSI8Pz0gJGZhY2Vib29rLT5nZXRfYWRkX3VybCgpID8+Ij5QdXQgRm9vdHByaW50cyBpbiB5b3VyIHByb2ZpbGU8L2E+LCBpZiB5b3UgaGF2ZW4ndCBhbHJlYWR5IQogICAgPGZvcm0gbWV0aG9kPSJwb3N0IiA+Cjw/cGhwCiAgICAgIGlmICgkcHJpbnRzX2lkICE9ICR1c2VyKSB7CiAgICAgICAgZWNobyAnRG8geW91IHdhbnQgdG8gc3RlcCBvbiA8ZmI6bmFtZSB1aWQ9IicgLiAkcHJpbnRzX2lkIC4gJyIvPj8nOwogICAgICAgIGVjaG8gJzxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InRvIiB2YWx1ZT0iJyAuICRwcmludHNfaWQgLiAnIi8+JzsKICAgICAgfSBlbHNlIHsKICAgICAgICBlY2hvICc8YnIvPlN0ZXAgb24gYSBmcmllbmQ6JzsKICAgICAgICBlY2hvICc8ZmI6ZnJpZW5kLXNlbGVjdG9yIGlkbmFtZT0idG8iLz4nOwogICAgICB9Cj8+CiAgICAgIDxpbnB1dCB2YWx1ZT0ic3RlcCIgdHlwZT0ic3VibWl0Ii8+CiAgICA8L2Zvcm0+CiAgPGhyLz4KICBUaGVzZSBhcmUgPGZiOm5hbWUgdWlkPSI8Pz0gJHByaW50c19pZCA/PiIgcG9zc2Vzc2l2ZT0idHJ1ZSIvPiBGb290cHJpbnRzOjxici8+CiAgPD9waHAgZWNobyByZW5kZXJfcHJpbnRzKCRwcmludHMsIDEwKTsgPz4KICA8ZGl2IHN0eWxlPSJjbGVhcjogYm90aDsiLz4KPC9kaXY+Cg==]]></data>
	</file>
	<file>
	  <filename>/facebook-platform/footprints/lib.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCmZ1bmN0aW9uIGdldF9kYl9jb25uKCkgewogICRjb25uID0gbXlzcWxfY29ubmVjdCgkR0xPQkFMU1snZGJfaXAnXSwgJEdMT0JBTFNbJ2RiX3VzZXInXSwgJEdMT0JBTFNbJ2RiX3Bhc3MnXSk7CiAgbXlzcWxfc2VsZWN0X2RiKCRHTE9CQUxTWydkYl9uYW1lJ10sICRjb25uKTsKICByZXR1cm4gJGNvbm47Cn0KCmZ1bmN0aW9uIGdldF9wcmludHMoJHVzZXIpIHsKICAkY29ubiA9IGdldF9kYl9jb25uKCk7CiAgJHJlcyA9IG15c3FsX3F1ZXJ5KCdTRUxFQ1QgYGZyb21gLCBgdG9gLCBgdGltZWAgRlJPTSBmb290cHJpbnRzIFdIRVJFIGB0b2A9JyAuICR1c2VyIC4gJyBPUkRFUiBCWSBgdGltZWAgREVTQycsICRjb25uKTsKICAkcHJpbnRzID0gYXJyYXkoKTsKICB3aGlsZSAoJHJvdyA9IG15c3FsX2ZldGNoX2Fzc29jKCRyZXMpKSB7CiAgICAkcHJpbnRzW10gPSAkcm93OwogIH0KICByZXR1cm4gJHByaW50czsKfQoKZnVuY3Rpb24gcmVuZGVyX3Byb2ZpbGVfYWN0aW9uKCRpZCwgJG51bSkgewogIHJldHVybiAnPGZiOnByb2ZpbGUtYWN0aW9uIHVybD0iaHR0cDovL2FwcHMuZmFjZWJvb2suY29tL2Zvb3RwcmludHMvP3RvPScgLiAkaWQgLiAnIj4nCiAgICAgICAuICAgJzxmYjpuYW1lIHVpZD0iJyAuICRpZCAuICciIGZpcnN0bmFtZW9ubHk9InRydWUiIGNhcGl0YWxpemU9InRydWUiLz4gJwogICAgICAgLiAgICdoYXMgYmVlbiBzdGVwcGVkIG9uICcgLiAkbnVtIC4gJyB0aW1lcy4nCiAgICAgICAuICc8L2ZiOnByb2ZpbGUtYWN0aW9uPic7Cn0KCmZ1bmN0aW9uIHJlbmRlcl9wcm9maWxlX2JveCgkaWQsICRwcmludHMpIHsKICAvLyBSZW5kZXIgdGhlIG1vc3QgcmVjZW50IDUgbm8gbWF0dGVyIHdoYXQsIGFuZCB0aGUgc2Vjb25kIG1vc3QgcmVjZW50IDUKICAvLyBvbmx5IGlmIHRoZSBib3ggaXMgb24gdGhlIHJpZ2h0ICh3aWRlKSBzaWRlIG9mIHRoZSBwcm9maWxlLgogIHJldHVybiByZW5kZXJfcHJpbnRzKCRwcmludHMsIDUpIC4gJzxmYjp3aWRlPicgLiByZW5kZXJfcHJpbnRzKGFycmF5X3NsaWNlKCRwcmludHMsIDUpLCA1KSAuICc8L2ZiOndpZGU+JwogICAgICAgLiAnPGRpdiBzdHlsZT0iY2xlYXI6IGJvdGg7Ij4nIC4gcmVuZGVyX3N0ZXBfbGluaygkdG8pIC4gJzwvZGl2Pic7Cn0KCmZ1bmN0aW9uIGRvX3N0ZXAoJGZyb20sICR0bykgewogIGdsb2JhbCAkZmFjZWJvb2s7CgogICRjb25uID0gZ2V0X2RiX2Nvbm4oKTsKICBteXNxbF9xdWVyeSgnSU5TRVJUIElOVE8gZm9vdHByaW50cyBTRVQgYGZyb21gPScuJGZyb20uJywgYHRpbWVgPScudGltZSgpLicsIGB0b2A9Jy4kdG8sICRjb25uKTsKICAkcHJpbnRzID0gZ2V0X3ByaW50cygkdG8pOwogIHRyeSB7CiAgICAKICAgIC8vIFNldCBQcm9maWxlIEZCTUwKICAgICRmYm1sID0gcmVuZGVyX3Byb2ZpbGVfYWN0aW9uKCR0bywgY291bnQoJHByaW50cykpIC4gcmVuZGVyX3Byb2ZpbGVfYm94KCR0bywgJHByaW50cyk7CgogICAgLy8gc3RhcnQgYmF0Y2ggb3BlcmF0aW9uIAogICAgJGZhY2Vib29rLT5hcGlfY2xpZW50LT5iZWdpbl9iYXRjaCgpOwoKICAgICRmYWNlYm9vay0+YXBpX2NsaWVudC0+cHJvZmlsZV9zZXRGQk1MKCRmYm1sLCAkdG8pOwoKICAgIC8vIFNlbmQgbm90aWZpY2F0aW9uCiAgICAvLyBOb3RpY2UgdGhlIHVzZSBvZiByZWZlcmVuY2UgJyYnCiAgICAkcmVzdWx0ID0gJiAkZmFjZWJvb2stPmFwaV9jbGllbnQtPm5vdGlmaWNhdGlvbnNfc2VuZCgkdG8sICcgc3RlcHBlZCBvbiB5b3UuICAnIC4KICAgICAgJzxhIGhyZWY9Imh0dHA6Ly9hcHBzLmZhY2Vib29rLmNvbS9mb290cHJpbnRzLyI+U2VlIGFsbCB5b3VyIEZvb3RwcmludHM8L2E+LicpOwoKICAgIC8vIFB1Ymxpc2ggZmVlZCBzdG9yeQogICAgJGZlZWRfdGl0bGUgPSAnPGZiOnVzZXJsaW5rIHVpZD0iJy4kZnJvbS4nIiBzaG93bmV0d29yaz0iZmFsc2UiLz4gc3RlcHBlZCBvbiA8ZmI6bmFtZSB1aWQ9IicuJHRvLiciLz4uJzsKICAgICRmZWVkX2JvZHkgPSAnQ2hlY2sgb3V0IDxhIGhyZWY9Imh0dHA6Ly9hcHBzLmZhY2Vib29rLmNvbS9mb290cHJpbnRzLz90bz0nLiR0by4nIj4nIC4KICAgICAgICAgICAgICAgICAnPGZiOm5hbWUgdWlkPSInLiR0by4nIiBmaXJzdG5hbWVvbmx5PSJ0cnVlIiBwb3NzZXNzaXZlPSJ0cnVlIi8+IEZvb3RwcmludHM8L2E+Lic7CiAgICAkZmFjZWJvb2stPmFwaV9jbGllbnQtPmZlZWRfcHVibGlzaEFjdGlvbk9mVXNlcigkZmVlZF90aXRsZSwgJGZlZWRfYm9keSk7CgogICAgLy8gRW5kIGJhdGNoIG9wZXJhdGlvbi4gVGhpcyB3aWxsIGFjdHVhbGx5IHNlbmQgcXVldWVkIEFQSSBjYWxsIHRvIEZhY2Vib29rIGluCiAgICAvLyBhIHNpbmdsZSBIVFRQIHJlcXVlc3QKICAgICRmYWNlYm9vay0+YXBpX2NsaWVudC0+ZW5kX2JhdGNoKCk7CgogIH0gY2F0Y2ggKEV4Y2VwdGlvbiAkZSkgewogICAgZXJyb3JfbG9nKCRlLT5nZXRNZXNzYWdlKCkpOwogIH0KICByZXR1cm4gJHByaW50czsKfQoKZnVuY3Rpb24gcmVuZGVyX3N0ZXBfbGluaygkaWQpIHsKICByZXR1cm4gJzxhIGhyZWY9Imh0dHA6Ly9hcHBzLmZhY2Vib29rLmNvbS9mb290cHJpbnRzLz90bz0nIC4gJGlkIC4gJyI+JwogICAgICAgLiAgICdTdGVwIG9uIDxmYjpuYW1lIHVpZD0iJyAuICRpZCAuICciIGZpcnN0bmFtZW9ubHk9InRydWUiLz4nCiAgICAgICAuICc8L2E+JzsKfQoKZnVuY3Rpb24gcmVuZGVyX3ByaW50cygkcHJpbnRzLCAkbWF4KSB7CiAgJGZibWwgPSAnJzsKICAkaSA9IDA7CiAgZm9yZWFjaCAoJHByaW50cyBhcyAkcG9zdCkgewogICAgJGZibWwgLj0gJzxmYjppZi1jYW4tc2VlIHVpZD0iJyAuICRwb3N0Wydmcm9tJ10gLiAnIj48ZGl2IHN0eWxlPSJjbGVhcjogYm90aDsgcGFkZGluZzogM3B4OyI+JwogICAgICAgICAgIC4gICAnPGZiOnByb2ZpbGUtcGljIHN0eWxlPSJmbG9hdDogbGVmdDsiIHVpZD0iJyAuICRwb3N0Wydmcm9tJ10gLiAnIiBzaXplPSJzcXVhcmUiLz4nCiAgICAgICAgICAgLiAgICc8ZmI6bmFtZSB1aWQ9IicgLiAkcG9zdFsnZnJvbSddIC4gJyIgY2FwaXRhbGl6ZT0idHJ1ZSIvPiBzdGVwcGVkIG9uIDxmYjpuYW1lIHVpZD0iJyAuICRwb3N0Wyd0byddIC4gJyIvPicKICAgICAgICAgICAuICAgJyBhdCA8ZmI6dGltZSB0PSInIC4gJHBvc3RbJ3RpbWUnXSAuICciLz4uICcKICAgICAgICAgICAuICAgJzxici8+JyAuIHJlbmRlcl9zdGVwX2xpbmsoJHBvc3RbJ2Zyb20nXSkgLiAnPGJyLz4nCiAgICAgICAgICAgLiAnPC9kaXY+PC9mYjppZi1jYW4tc2VlPic7CiAgICBpZiAoKyskaSA9PSAkbWF4KSBicmVhazsKICB9CiAgcmV0dXJuICRmYm1sOwp9Cg==]]></data>
	</file>
	<file>
	  <filename>/facebook-platform/footprints/README</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[V2VsY29tZSB0byB0aGUgRmFjZWJvb2sgUGxhdGZvcm0hCgpZb3UgY2FuIGp1c3QgZ3JhYiB0aGUgbGlicmFyaWVzIG91dCBvZiB0aGUgY2xpZW50LyBkaXJlY3RvcnkgYW5kIHN0YXJ0IGJ1aWxkaW5nCnlvdXIgb3duIGFwcGxpY2F0aW9uLiAgSXQgd2lsbCBwcm9iYWJseSBiZSBpbnN0cnVjdGl2ZSwgdGhvdWdoLCB0byBmaXJzdCBnZXQKb3VyIHNhbXBsZSBhcHBsaWNhdGlvbiB1cCBhbmQgcnVubmluZyBzbyB5b3UgY2FuIHNlZSBleGFjdGx5IGhvdyB0aGUgbGlicmFyeSBpcwptZWFudCB0byBiZSB1c2VkLgoKV2UndmUgY3JlYXRlZCBhbiBhcHBsaWNhdGlvbiBjYWxsZWQgRm9vdHByaW50cyB0aGF0IHV0aWxpemVzIGEgbG90IG9mIFBsYXRmb3JtCmZ1bmN0aW9uYWxpdHkgd2hpbGUgcmVtYWluaW5nIGZhaXJseSBzaW1wbGUuICBJZiB5b3UgZG9uJ3Qgd2FudCB0byBzZXQgaXQgYWxsCnVwIHlvdSBjYW4gc3RpbGwgY2hlY2sgb3V0IHRoZSBjb2RlIGFuZCBzZWUgaXQgaW4gYWN0aW9uIGJ5IGdvaW5nIHRvCmh0dHA6Ly9hcHBzLmZhY2Vib29rLmNvbS9mb290cHJpbnRzLy4KClRvIGdldCBGb290cHJpbnRzIHJ1bm5pbmcgb24geW91ciBvd24gc2VydmVyLCB5b3UnbGwgd2FudCB0byBmaXJzdCBvcGVuIHVwIHRoZQoiZm9vdHByaW50cy9jb25maWcucGhwIiBmaWxlIGFuZCBtb2RpZnkgaXQgd2l0aCB5b3VyIG15c3FsIGRhdGFiYXNlCmNvbmZpZ3VyYXRpb24uICBBbHNvLCBjcmVhdGUgdGhlIG5lY2Vzc2FyeSB0YWJsZSBpbiB5b3VyIGRhdGFiYXNlIGFzIGRlc2NyaWJlZAppbiB0aGUgc2FtZSBmaWxlLgoKTmV4dCwgZ28gdG8gaHR0cDovL3d3dy5mYWNlYm9vay5jb20vZGV2ZWxvcGVycy9hcHBzLnBocCwgd2hlcmUgeW91J2xsCnJlZ2lzdGVyIGZvciBhbiBhcHBsaWNhdGlvbi4gIEluIHRoZSBhY2NvdW50IGNyZWF0aW9uIHBhZ2UsIHNldCB1cCB5b3VyCmNhbGxiYWNrIFVSTCBzdWNoIHRoYXQgaXQgaXMgdGhlIGRpcmVjdG9yeSBvbiB5b3VyIHdlYiBzZXJ2ZXIgdGhhdCBjb3JyZXNwb25kcwp0byB0aGUgZm9vdHByaW50cy8gZGlyZWN0b3J5IG9mIHRoaXMgcGFja2FnZSAoaWYgeW91IGxvYWRlZCB0aGUgY2FsbGJhY2sgVVJMCmRpcmVjdGx5LCBpdCB3b3VsZCBkaXNwbGF5IHRoaXMgcGFja2FnZSdzIGluZGV4LnBocCkuICBJbiB0aGUgc2FtZSBwYWdlLCB5b3UKbWF5IGFsc28gd2FudCB0byByZWdpc3RlciBmb3IgYSBmcmFtZWQgcGFnZSBVUkwuICBZb3UgY2FuIGFsc28gc2V0IHVwIHNvbWUKZGVmYXVsdCBGQk1MIC0gb3VycyBpcyBzZXQgYXMgZm9sbG93czoKICA8ZmI6aWYtaXMtb3duLXByb2ZpbGU+PGJyIC8+SGkgPGZiOm5hbWUgdWlkPSJwcm9maWxlb3duZXIiCiAgZmlyc3RuYW1lb25seT0idHJ1ZSIgdXNleW91PSJmYWxzZSIvPiEgIFRoaXMgaXMgdGhlIGRlZmF1bHQgRkJNTCBhcyBzcGVjaWZpZWQKICBpbiBGb290cHJpbnRzJyBhY2NvdW50IGNvbmZpZ3VyYXRpb24gcGFnZS4gIFRoaXMgd2lsbCBnZXQgcmVwbGFjZWQgdGhlIGZpcnN0CiAgdGltZSB5b3UgZ2V0IHN0ZXBwZWQgb24uPC9mYjppZi1pcy1vd24tcHJvZmlsZT4KCkZpbmFsbHksIGNvcHkgdGhlIEFQSSBrZXkgYW5kIHNlY3JldCBrZXkgZnJvbSB0aGUgZGV2ZWxvcGVycyBhY2NvdW50IHBhZ2UgaW50bwp5b3VyIGNvbmZpZy5waHAgZmlsZS4gIE5vdyBnbyB0byBodHRwOi8vYXBwcy5mYWNlYm9vay5jb20vPHlvdXItZnJhbWUtdXJsPi8KYW5kIHlvdSBzaG91bGQgaGF2ZSBGb290cHJpbnRzIHVwIGFuZCBydW5uaW5nIG9uIHlvdXIgc2VydmVyIQoKTk9URTogSWYgeW91IG9ubHkgaGF2ZSBQSFA0LCB3ZSd2ZSBidWlsdCBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIGNsaWVudApsaWJyYXJ5IHRvIHdvcmsgd2l0aCB0aGF0LiAgVXNlIHRoZSBmaWxlcyBpbnNpZGUgdGhlIHBocDRjbGllbnQgZGlyZWN0b3J5Cmluc3RlYWQgb2YgY2xpZW50LiAgWW91J2xsIG5lZWQgdG8gZG93bmxvYWQgc2ltcGxleG1sNDQgYW5kIGV4dHJhY3QgaXQgaW50byB0aGUKcGhwNGNsaWVudC8gZGlyZWN0b3J5IHRvIGdldCBpdCB0byB3b3JrIC0geW91IGNhbiBnZXQgaXQgYXQ6Cmh0dHA6Ly9kb3dubG9hZHMuc291cmNlZm9yZ2UubmV0L2lzdGVyNGZyYW1ld29yay9zaW1wbGV4bWw0NC0wXzRfNC50YXIuZ3oK]]></data>
	</file>
	<file>
	  <filename>/facebook-platform/php/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/facebook-platform/php/facebook.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLy8gQ29weXJpZ2h0IDIwMDQtMjAwOSBGYWNlYm9vay4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLy8KLy8gKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLy8gfCBGYWNlYm9vayBQbGF0Zm9ybSBQSFA1IGNsaWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLy8gKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLy8gfCBDb3B5cmlnaHQgKGMpIDIwMDcgRmFjZWJvb2ssIEluYy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLy8gfCBBbGwgcmlnaHRzIHJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLy8gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLy8gfCBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgICAgICAgIHwKLy8gfCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgICAgICAgIHwKLy8gfCBhcmUgbWV0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLy8gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLy8gfCAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCAgICAgICAgIHwKLy8gfCAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuICAgICAgICAgIHwKLy8gfCAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCAgICAgIHwKLy8gfCAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlICAgIHwKLy8gfCAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAgIHwKLy8gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLy8gfCBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiAgICAgIHwKLy8gfCBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIHwKLy8gfCBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgIHwKLy8gfCBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsICAgICAgICAgIHwKLy8gfCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgIHwKLy8gfCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIHwKLy8gfCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgICAgIHwKLy8gfCBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUICAgICAgIHwKLy8gfCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgIHwKLy8gfCBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAgICAgICAgIHwKLy8gKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLy8gfCBGb3IgaGVscCB3aXRoIHRoaXMgbGlicmFyeSwgY29udGFjdCBkZXZlbG9wZXJzLWhlbHBAZmFjZWJvb2suY29tICAgICAgICAgIHwKLy8gKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKCmluY2x1ZGVfb25jZSAnZmFjZWJvb2thcGlfcGhwNV9yZXN0bGliLnBocCc7CgpkZWZpbmUoJ0ZBQ0VCT09LX0FQSV9WQUxJREFUSU9OX0VSUk9SJywgMSk7CmNsYXNzIEZhY2Vib29rIHsKICBwdWJsaWMgJGFwaV9jbGllbnQ7CiAgcHVibGljICRhcGlfa2V5OwogIHB1YmxpYyAkc2VjcmV0OwogIHB1YmxpYyAkZ2VuZXJhdGVfc2Vzc2lvbl9zZWNyZXQ7CiAgcHVibGljICRzZXNzaW9uX2V4cGlyZXM7CgogIHB1YmxpYyAkZmJfcGFyYW1zOwogIHB1YmxpYyAkdXNlcjsKICBwdWJsaWMgJHByb2ZpbGVfdXNlcjsKICBwdWJsaWMgJGNhbnZhc191c2VyOwogIHByb3RlY3RlZCAkYmFzZV9kb21haW47CiAgLyoKICAgKiBDcmVhdGUgYSBGYWNlYm9vayBjbGllbnQgbGlrZSB0aGlzOgogICAqCiAgICogJGZiID0gbmV3IEZhY2Vib29rKEFQSV9LRVksIFNFQ1JFVCk7CiAgICoKICAgKiBUaGlzIHdpbGwgYXV0b21hdGljYWxseSBwdWxsIGluIGFueSBwYXJhbWV0ZXJzLCB2YWxpZGF0ZSB0aGVtIGFnYWluc3QgdGhlCiAgICogc2Vzc2lvbiBzaWduYXR1cmUsIGFuZCBjaHVjayB0aGVtIGluIHRoZSBwdWJsaWMgJGZiX3BhcmFtcyBtZW1iZXIgdmFyaWFibGUuCiAgICoKICAgKiBAcGFyYW0gYXBpX2tleSAgICAgICAgICAgICAgICAgIHlvdXIgRGV2ZWxvcGVyIEFQSSBrZXkKICAgKiBAcGFyYW0gc2VjcmV0ICAgICAgICAgICAgICAgICAgIHlvdXIgRGV2ZWxvcGVyIEFQSSBzZWNyZXQKICAgKiBAcGFyYW0gZ2VuZXJhdGVfc2Vzc2lvbl9zZWNyZXQgIHdoZXRoZXIgdG8gYXV0b21hdGljYWxseSBnZW5lcmF0ZSBhIHNlc3Npb24KICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRoZSB1c2VyIGRvZXNuJ3QgaGF2ZSBvbmUsIGJ1dAogICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlcmUgaXMgYW4gYXV0aCB0b2tlbiBwcmVzZW50IGluIHRoZSB1cmwsCiAgICovCiAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRhcGlfa2V5LCAkc2VjcmV0LCAkZ2VuZXJhdGVfc2Vzc2lvbl9zZWNyZXQ9ZmFsc2UpIHsKICAgICR0aGlzLT5hcGlfa2V5ICAgICAgICAgICAgICAgICA9ICRhcGlfa2V5OwogICAgJHRoaXMtPnNlY3JldCAgICAgICAgICAgICAgICAgID0gJHNlY3JldDsKICAgICR0aGlzLT5nZW5lcmF0ZV9zZXNzaW9uX3NlY3JldCA9ICRnZW5lcmF0ZV9zZXNzaW9uX3NlY3JldDsKICAgICR0aGlzLT5hcGlfY2xpZW50ID0gbmV3IEZhY2Vib29rUmVzdENsaWVudCgkYXBpX2tleSwgJHNlY3JldCwgbnVsbCk7CiAgICAkdGhpcy0+dmFsaWRhdGVfZmJfcGFyYW1zKCk7CgogICAgLy8gU2V0IHRoZSBkZWZhdWx0IHVzZXIgaWQgZm9yIG1ldGhvZHMgdGhhdCBhbGxvdyB0aGUgY2FsbGVyIHRvCiAgICAvLyBwYXNzIGFuIGV4cGxpY2l0IHVpZCBpbnN0ZWFkIG9mIHVzaW5nIGEgc2Vzc2lvbiBrZXkuCiAgICAkZGVmYXVsdFVzZXIgPSBudWxsOwogICAgaWYgKCR0aGlzLT51c2VyKSB7CiAgICAgICRkZWZhdWx0VXNlciA9ICR0aGlzLT51c2VyOwogICAgfSBlbHNlIGlmICgkdGhpcy0+cHJvZmlsZV91c2VyKSB7CiAgICAgICRkZWZhdWx0VXNlciA9ICR0aGlzLT5wcm9maWxlX3VzZXI7CiAgICB9IGVsc2UgaWYgKCR0aGlzLT5jYW52YXNfdXNlcikgewogICAgICAkZGVmYXVsdFVzZXIgPSAkdGhpcy0+Y2FudmFzX3VzZXI7CiAgICB9CgogICAgJHRoaXMtPmFwaV9jbGllbnQtPnNldF91c2VyKCRkZWZhdWx0VXNlcik7CgoKICAgIGlmIChpc3NldCgkdGhpcy0+ZmJfcGFyYW1zWydmcmllbmRzJ10pKSB7CiAgICAgICR0aGlzLT5hcGlfY2xpZW50LT5mcmllbmRzX2xpc3QgPSBleHBsb2RlKCcsJywgJHRoaXMtPmZiX3BhcmFtc1snZnJpZW5kcyddKTsKICAgIH0KICAgIGlmIChpc3NldCgkdGhpcy0+ZmJfcGFyYW1zWydhZGRlZCddKSkgewogICAgICAkdGhpcy0+YXBpX2NsaWVudC0+YWRkZWQgPSAkdGhpcy0+ZmJfcGFyYW1zWydhZGRlZCddOwogICAgfQogICAgaWYgKGlzc2V0KCR0aGlzLT5mYl9wYXJhbXNbJ2NhbnZhc191c2VyJ10pKSB7CiAgICAgICR0aGlzLT5hcGlfY2xpZW50LT5jYW52YXNfdXNlciA9ICR0aGlzLT5mYl9wYXJhbXNbJ2NhbnZhc191c2VyJ107CiAgICB9CiAgfQoKICAvKgogICAqIFZhbGlkYXRlcyB0aGF0IHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCBpbiB3ZXJlIHNlbnQgZnJvbSBGYWNlYm9vay4gSXQgZG9lcyBzbwogICAqIGJ5IHZhbGlkYXRpbmcgdGhhdCB0aGUgc2lnbmF0dXJlIG1hdGNoZXMgb25lIHRoYXQgY291bGQgb25seSBiZSBnZW5lcmF0ZWQKICAgKiBieSB1c2luZyB5b3VyIGFwcGxpY2F0aW9uJ3Mgc2VjcmV0IGtleS4KICAgKgogICAqIEZhY2Vib29rLXByb3ZpZGVkIHBhcmFtZXRlcnMgd2lsbCBjb21lIGZyb20gJF9QT1NULCAkX0dFVCwgb3IgJF9DT09LSUUsCiAgICogaW4gdGhhdCBvcmRlci4gJF9QT1NUIGFuZCAkX0dFVCBhcmUgYWx3YXlzIG1vcmUgdXAtdG8tZGF0ZSB0aGFuIGNvb2tpZXMsCiAgICogc28gd2UgcHJlZmVyIHRob3NlIGlmIHRoZXkgYXJlIGF2YWlsYWJsZS4KICAgKgogICAqIEZvciBuaXR0eS1ncml0dHkgZGV0YWlscyBvZiB3aGVuIGVhY2ggb2YgdGhlc2UgaXMgdXNlZCwgY2hlY2sgb3V0CiAgICogaHR0cDovL3dpa2kuZGV2ZWxvcGVycy5mYWNlYm9vay5jb20vaW5kZXgucGhwL1ZlcmlmeWluZ19UaGVfU2lnbmF0dXJlCiAgICoKICAgKiBAcGFyYW0gYm9vbCAgcmVzb2x2ZV9hdXRoX3Rva2VuICBjb252ZXJ0IGFuIGF1dGggdG9rZW4gaW50byBhIHNlc3Npb24KICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gdmFsaWRhdGVfZmJfcGFyYW1zKCRyZXNvbHZlX2F1dGhfdG9rZW49dHJ1ZSkgewogICAgJHRoaXMtPmZiX3BhcmFtcyA9ICR0aGlzLT5nZXRfdmFsaWRfZmJfcGFyYW1zKCRfUE9TVCwgNDggKiAzNjAwLCAnZmJfc2lnJyk7CgogICAgLy8gbm90ZSB0aGF0IHdpdGggcHJlbG9hZCBGUUwsIGl0J3MgcG9zc2libGUgdG8gcmVjZWl2ZSBQT1NUIHBhcmFtcyBpbgogICAgLy8gYWRkaXRpb24gdG8gR0VULCBzbyB1c2UgYSBkaWZmZXJlbnQgcHJlZml4IHRvIGRpZmZlcmVudGlhdGUgdGhlbQogICAgaWYgKCEkdGhpcy0+ZmJfcGFyYW1zKSB7CiAgICAgICRmYl9wYXJhbXMgPSAkdGhpcy0+Z2V0X3ZhbGlkX2ZiX3BhcmFtcygkX0dFVCwgNDggKiAzNjAwLCAnZmJfc2lnJyk7CiAgICAgICRmYl9wb3N0X3BhcmFtcyA9ICR0aGlzLT5nZXRfdmFsaWRfZmJfcGFyYW1zKCRfUE9TVCwgNDggKiAzNjAwLCAnZmJfcG9zdF9zaWcnKTsKICAgICAgJHRoaXMtPmZiX3BhcmFtcyA9IGFycmF5X21lcmdlKCRmYl9wYXJhbXMsICRmYl9wb3N0X3BhcmFtcyk7CiAgICB9CgogICAgLy8gT2theSwgc29tZXRoaW5nIGNhbWUgaW4gdmlhIFBPU1Qgb3IgR0VUCiAgICBpZiAoJHRoaXMtPmZiX3BhcmFtcykgewogICAgICAkdXNlciAgICAgICAgICAgICAgID0gaXNzZXQoJHRoaXMtPmZiX3BhcmFtc1sndXNlciddKSA/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+ZmJfcGFyYW1zWyd1c2VyJ10gOiBudWxsOwogICAgICAkdGhpcy0+cHJvZmlsZV91c2VyID0gaXNzZXQoJHRoaXMtPmZiX3BhcmFtc1sncHJvZmlsZV91c2VyJ10pID8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5mYl9wYXJhbXNbJ3Byb2ZpbGVfdXNlciddIDogbnVsbDsKICAgICAgJHRoaXMtPmNhbnZhc191c2VyICA9IGlzc2V0KCR0aGlzLT5mYl9wYXJhbXNbJ2NhbnZhc191c2VyJ10pID8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5mYl9wYXJhbXNbJ2NhbnZhc191c2VyJ10gOiBudWxsOwogICAgICAkdGhpcy0+YmFzZV9kb21haW4gID0gaXNzZXQoJHRoaXMtPmZiX3BhcmFtc1snYmFzZV9kb21haW4nXSkgPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmZiX3BhcmFtc1snYmFzZV9kb21haW4nXSA6IG51bGw7CgogICAgICBpZiAoaXNzZXQoJHRoaXMtPmZiX3BhcmFtc1snc2Vzc2lvbl9rZXknXSkpIHsKICAgICAgICAkc2Vzc2lvbl9rZXkgPSAgJHRoaXMtPmZiX3BhcmFtc1snc2Vzc2lvbl9rZXknXTsKICAgICAgfSBlbHNlIGlmIChpc3NldCgkdGhpcy0+ZmJfcGFyYW1zWydwcm9maWxlX3Nlc3Npb25fa2V5J10pKSB7CiAgICAgICAgJHNlc3Npb25fa2V5ID0gICR0aGlzLT5mYl9wYXJhbXNbJ3Byb2ZpbGVfc2Vzc2lvbl9rZXknXTsKICAgICAgfSBlbHNlIHsKICAgICAgICAkc2Vzc2lvbl9rZXkgPSBudWxsOwogICAgICB9CiAgICAgICRleHBpcmVzICAgICA9IGlzc2V0KCR0aGlzLT5mYl9wYXJhbXNbJ2V4cGlyZXMnXSkgPwogICAgICAgICAgICAgICAgICAgICAkdGhpcy0+ZmJfcGFyYW1zWydleHBpcmVzJ10gOiBudWxsOwogICAgICAkdGhpcy0+c2V0X3VzZXIoJHVzZXIsCiAgICAgICAgICAgICAgICAgICAgICAkc2Vzc2lvbl9rZXksCiAgICAgICAgICAgICAgICAgICAgICAkZXhwaXJlcyk7CiAgICB9CiAgICAvLyBpZiBubyBGYWNlYm9vayBwYXJhbWV0ZXJzIHdlcmUgZm91bmQgaW4gdGhlIEdFVCBvciBQT1NUIHZhcmlhYmxlcywKICAgIC8vIHRoZW4gZmFsbCBiYWNrIHRvIGNvb2tpZXMsIHdoaWNoIG1heSBoYXZlIGNhY2hlZCB1c2VyIGluZm9ybWF0aW9uCiAgICAvLyBDb29raWVzIGFyZSBhbHNvIHVzZWQgdG8gcmVjZWl2ZSBzZXNzaW9uIGRhdGEgdmlhIHRoZSBKYXZhc2NyaXB0IEFQSQogICAgZWxzZSBpZiAoJGNvb2tpZXMgPQogICAgICAgICAgICAgJHRoaXMtPmdldF92YWxpZF9mYl9wYXJhbXMoJF9DT09LSUUsIG51bGwsICR0aGlzLT5hcGlfa2V5KSkgewoKICAgICAgJGJhc2VfZG9tYWluX2Nvb2tpZSA9ICdiYXNlX2RvbWFpbl8nIC4gJHRoaXMtPmFwaV9rZXk7CiAgICAgIGlmIChpc3NldCgkX0NPT0tJRVskYmFzZV9kb21haW5fY29va2llXSkpIHsKICAgICAgICAkdGhpcy0+YmFzZV9kb21haW4gPSAkX0NPT0tJRVskYmFzZV9kb21haW5fY29va2llXTsKICAgICAgfQoKICAgICAgLy8gdXNlICRhcGlfa2V5IC4gJ18nIGFzIGEgcHJlZml4IGZvciB0aGUgY29va2llcyBpbiBjYXNlIHRoZXJlIGFyZQogICAgICAvLyBtdWx0aXBsZSBmYWNlYm9vayBjbGllbnRzIG9uIHRoZSBzYW1lIGRvbWFpbi4KICAgICAgJGV4cGlyZXMgPSBpc3NldCgkY29va2llc1snZXhwaXJlcyddKSA/ICRjb29raWVzWydleHBpcmVzJ10gOiBudWxsOwogICAgICAkdGhpcy0+c2V0X3VzZXIoJGNvb2tpZXNbJ3VzZXInXSwKICAgICAgICAgICAgICAgICAgICAgICRjb29raWVzWydzZXNzaW9uX2tleSddLAogICAgICAgICAgICAgICAgICAgICAgJGV4cGlyZXMpOwogICAgfQogICAgLy8gZmluYWxseSwgaWYgd2UgcmVjZWl2ZWQgbm8gcGFyYW1ldGVycywgYnV0IHRoZSAnYXV0aF90b2tlbicgR0VUIHZhcgogICAgLy8gaXMgcHJlc2VudCwgdGhlbiB3ZSBhcmUgaW4gdGhlIG1pZGRsZSBvZiBhdXRoIGhhbmRzaGFrZSwKICAgIC8vIHNvIGdvIGFoZWFkIGFuZCBjcmVhdGUgdGhlIHNlc3Npb24KICAgIGVsc2UgaWYgKCRyZXNvbHZlX2F1dGhfdG9rZW4gJiYgaXNzZXQoJF9HRVRbJ2F1dGhfdG9rZW4nXSkgJiYKICAgICAgICAgICAgICRzZXNzaW9uID0gJHRoaXMtPmRvX2dldF9zZXNzaW9uKCRfR0VUWydhdXRoX3Rva2VuJ10pKSB7CiAgICAgIGlmICgkdGhpcy0+Z2VuZXJhdGVfc2Vzc2lvbl9zZWNyZXQgJiYKICAgICAgICAgICFlbXB0eSgkc2Vzc2lvblsnc2VjcmV0J10pKSB7CiAgICAgICAgJHNlc3Npb25fc2VjcmV0ID0gJHNlc3Npb25bJ3NlY3JldCddOwogICAgICB9CgogICAgICBpZiAoaXNzZXQoJHNlc3Npb25bJ2Jhc2VfZG9tYWluJ10pKSB7CiAgICAgICAgJHRoaXMtPmJhc2VfZG9tYWluID0gJHNlc3Npb25bJ2Jhc2VfZG9tYWluJ107CiAgICAgIH0KCiAgICAgICR0aGlzLT5zZXRfdXNlcigkc2Vzc2lvblsndWlkJ10sCiAgICAgICAgICAgICAgICAgICAgICAkc2Vzc2lvblsnc2Vzc2lvbl9rZXknXSwKICAgICAgICAgICAgICAgICAgICAgICRzZXNzaW9uWydleHBpcmVzJ10sCiAgICAgICAgICAgICAgICAgICAgICBpc3NldCgkc2Vzc2lvbl9zZWNyZXQpID8gJHNlc3Npb25fc2VjcmV0IDogbnVsbCk7CiAgICB9CgogICAgcmV0dXJuICFlbXB0eSgkdGhpcy0+ZmJfcGFyYW1zKTsKICB9CgogIC8vIFN0b3JlIGEgdGVtcG9yYXJ5IHNlc3Npb24gc2VjcmV0IGZvciB0aGUgY3VycmVudCBzZXNzaW9uCiAgLy8gZm9yIHVzZSB3aXRoIHRoZSBKUyBjbGllbnQgbGlicmFyeQogIHB1YmxpYyBmdW5jdGlvbiBwcm9tb3RlX3Nlc3Npb24oKSB7CiAgICB0cnkgewogICAgICAkc2Vzc2lvbl9zZWNyZXQgPSAkdGhpcy0+YXBpX2NsaWVudC0+YXV0aF9wcm9tb3RlU2Vzc2lvbigpOwogICAgICBpZiAoISR0aGlzLT5pbl9mYl9jYW52YXMoKSkgewogICAgICAgICR0aGlzLT5zZXRfY29va2llcygkdGhpcy0+dXNlciwgJHRoaXMtPmFwaV9jbGllbnQtPnNlc3Npb25fa2V5LCAkdGhpcy0+c2Vzc2lvbl9leHBpcmVzLCAkc2Vzc2lvbl9zZWNyZXQpOwogICAgICB9CiAgICAgIHJldHVybiAkc2Vzc2lvbl9zZWNyZXQ7CiAgICB9IGNhdGNoIChGYWNlYm9va1Jlc3RDbGllbnRFeGNlcHRpb24gJGUpIHsKICAgICAgLy8gQVBJX0VDX1BBUkFNIG1lYW5zIHdlIGRvbid0IGhhdmUgYSBsb2dnZWQgaW4gdXNlciwgb3RoZXJ3aXNlIHdobwogICAgICAvLyBrbm93cyB3aGF0IGl0IG1lYW5zLCBzbyBqdXN0IHRocm93IGl0LgogICAgICBpZiAoJGUtPmdldENvZGUoKSAhPSBGYWNlYm9va0FQSUVycm9yQ29kZXM6OkFQSV9FQ19QQVJBTSkgewogICAgICAgIHRocm93ICRlOwogICAgICB9CiAgICB9CiAgfQoKICBwdWJsaWMgZnVuY3Rpb24gZG9fZ2V0X3Nlc3Npb24oJGF1dGhfdG9rZW4pIHsKICAgIHRyeSB7CiAgICAgIHJldHVybiAkdGhpcy0+YXBpX2NsaWVudC0+YXV0aF9nZXRTZXNzaW9uKCRhdXRoX3Rva2VuLCAkdGhpcy0+Z2VuZXJhdGVfc2Vzc2lvbl9zZWNyZXQpOwogICAgfSBjYXRjaCAoRmFjZWJvb2tSZXN0Q2xpZW50RXhjZXB0aW9uICRlKSB7CiAgICAgIC8vIEFQSV9FQ19QQVJBTSBtZWFucyB3ZSBkb24ndCBoYXZlIGEgbG9nZ2VkIGluIHVzZXIsIG90aGVyd2lzZSB3aG8KICAgICAgLy8ga25vd3Mgd2hhdCBpdCBtZWFucywgc28ganVzdCB0aHJvdyBpdC4KICAgICAgaWYgKCRlLT5nZXRDb2RlKCkgIT0gRmFjZWJvb2tBUElFcnJvckNvZGVzOjpBUElfRUNfUEFSQU0pIHsKICAgICAgICB0aHJvdyAkZTsKICAgICAgfQogICAgfQogIH0KCiAgLy8gSW52YWxpZGF0ZSB0aGUgc2Vzc2lvbiBjdXJyZW50bHkgYmVpbmcgdXNlZCwgYW5kIGNsZWFyIGFueSBzdGF0ZSBhc3NvY2lhdGVkCiAgLy8gd2l0aCBpdC4gTm90ZSB0aGF0IHRoZSB1c2VyIHdpbGwgc3RpbGwgcmVtYWluIGxvZ2dlZCBpbnRvIEZhY2Vib29rLgogIHB1YmxpYyBmdW5jdGlvbiBleHBpcmVfc2Vzc2lvbigpIHsKICAgIHRyeSB7CiAgICAgIGlmICgkdGhpcy0+YXBpX2NsaWVudC0+YXV0aF9leHBpcmVTZXNzaW9uKCkpIHsKICAgICAgICAkdGhpcy0+Y2xlYXJfY29va2llX3N0YXRlKCk7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9IGNhdGNoIChFeGNlcHRpb24gJGUpIHsKICAgICAgJHRoaXMtPmNsZWFyX2Nvb2tpZV9zdGF0ZSgpOwogICAgfQogIH0KCiAgLyoqIExvZ3MgdGhlIHVzZXIgb3V0IG9mIGFsbCB0ZW1wb3JhcnkgYXBwbGljYXRpb24gc2Vzc2lvbnMgYXMgd2VsbCBhcyB0aGVpcgogICAqIEZhY2Vib29rIHNlc3Npb24uICBOb3RlIHRoaXMgd2lsbCBvbmx5IHdvcmsgaWYgdGhlIHVzZXIgaGFzIGEgdmFsaWQgY3VycmVudAogICAqIHNlc3Npb24gd2l0aCB0aGUgYXBwbGljYXRpb24uCiAgICoKICAgKiBAcGFyYW0gc3RyaW5nICAkbmV4dCAgVVJMIHRvIHJlZGlyZWN0IHRvIHVwb24gbG9nZ2luZyBvdXQKICAgKgogICAqLwogICBwdWJsaWMgZnVuY3Rpb24gbG9nb3V0KCRuZXh0KSB7CiAgICAkbG9nb3V0X3VybCA9ICR0aGlzLT5nZXRfbG9nb3V0X3VybCgkbmV4dCk7CgogICAgLy8gQ2xlYXIgYW55IHN0b3JlZCBzdGF0ZQogICAgJHRoaXMtPmNsZWFyX2Nvb2tpZV9zdGF0ZSgpOwoKICAgICR0aGlzLT5yZWRpcmVjdCgkbG9nb3V0X3VybCk7CiAgfQoKICAvKioKICAgKiAgQ2xlYXJzIGFueSBwZXJzaXN0ZW50IHN0YXRlIHN0b3JlZCBhYm91dCB0aGUgdXNlciwgaW5jbHVkaW5nCiAgICogIGNvb2tpZXMgYW5kIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gdGhlIGN1cnJlbnQgc2Vzc2lvbiBpbiB0aGUKICAgKiAgY2xpZW50LgogICAqCiAgICovCiAgcHVibGljIGZ1bmN0aW9uIGNsZWFyX2Nvb2tpZV9zdGF0ZSgpIHsKICAgIGlmICghJHRoaXMtPmluX2ZiX2NhbnZhcygpICYmIGlzc2V0KCRfQ09PS0lFWyR0aGlzLT5hcGlfa2V5IC4gJ191c2VyJ10pKSB7CiAgICAgICAkY29va2llcyA9IGFycmF5KCd1c2VyJywgJ3Nlc3Npb25fa2V5JywgJ2V4cGlyZXMnLCAnc3MnKTsKICAgICAgIGZvcmVhY2ggKCRjb29raWVzIGFzICRuYW1lKSB7CiAgICAgICAgIHNldGNvb2tpZSgkdGhpcy0+YXBpX2tleSAuICdfJyAuICRuYW1lLCBmYWxzZSwgdGltZSgpIC0gMzYwMCk7CiAgICAgICAgIHVuc2V0KCRfQ09PS0lFWyR0aGlzLT5hcGlfa2V5IC4gJ18nIC4gJG5hbWVdKTsKICAgICAgIH0KICAgICAgIHNldGNvb2tpZSgkdGhpcy0+YXBpX2tleSwgZmFsc2UsIHRpbWUoKSAtIDM2MDApOwogICAgICAgdW5zZXQoJF9DT09LSUVbJHRoaXMtPmFwaV9rZXldKTsKICAgICB9CgogICAgIC8vIG5vdywgY2xlYXIgdGhlIHJlc3Qgb2YgdGhlIHN0b3JlZCBzdGF0ZQogICAgICR0aGlzLT51c2VyID0gMDsKICAgICAkdGhpcy0+YXBpX2NsaWVudC0+c2Vzc2lvbl9rZXkgPSAwOwogIH0KCiAgcHVibGljIGZ1bmN0aW9uIHJlZGlyZWN0KCR1cmwpIHsKICAgIGlmICgkdGhpcy0+aW5fZmJfY2FudmFzKCkpIHsKICAgICAgZWNobyAnPGZiOnJlZGlyZWN0IHVybD0iJyAuICR1cmwgLiAnIi8+JzsKICAgIH0gZWxzZSBpZiAocHJlZ19tYXRjaCgnL15odHRwcz86XC9cLyhbXlwvXSpcLik/ZmFjZWJvb2tcLmNvbSg6XGQrKT8vaScsICR1cmwpKSB7CiAgICAgIC8vIG1ha2Ugc3VyZSBmYWNlYm9vay5jb20gdXJsJ3MgbG9hZCBpbiB0aGUgZnVsbCBmcmFtZSBzbyB0aGF0IHdlIGRvbid0CiAgICAgIC8vIGdldCBhIGZyYW1lIHdpdGhpbiBhIGZyYW1lLgogICAgICBlY2hvICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L2phdmFzY3JpcHRcIj5cbnRvcC5sb2NhdGlvbi5ocmVmID0gXCIkdXJsXCI7XG48L3NjcmlwdD4iOwogICAgfSBlbHNlIHsKICAgICAgaGVhZGVyKCdMb2NhdGlvbjogJyAuICR1cmwpOwogICAgfQogICAgZXhpdDsKICB9CgogIHB1YmxpYyBmdW5jdGlvbiBpbl9mcmFtZSgpIHsKICAgIHJldHVybiBpc3NldCgkdGhpcy0+ZmJfcGFyYW1zWydpbl9jYW52YXMnXSkKICAgICAgICB8fCBpc3NldCgkdGhpcy0+ZmJfcGFyYW1zWydpbl9pZnJhbWUnXSk7CiAgfQogIHB1YmxpYyBmdW5jdGlvbiBpbl9mYl9jYW52YXMoKSB7CiAgICByZXR1cm4gaXNzZXQoJHRoaXMtPmZiX3BhcmFtc1snaW5fY2FudmFzJ10pOwogIH0KCiAgcHVibGljIGZ1bmN0aW9uIGdldF9sb2dnZWRpbl91c2VyKCkgewogICAgcmV0dXJuICR0aGlzLT51c2VyOwogIH0KCiAgcHVibGljIGZ1bmN0aW9uIGdldF9jYW52YXNfdXNlcigpIHsKICAgIHJldHVybiAkdGhpcy0+Y2FudmFzX3VzZXI7CiAgfQoKICBwdWJsaWMgZnVuY3Rpb24gZ2V0X3Byb2ZpbGVfdXNlcigpIHsKICAgIHJldHVybiAkdGhpcy0+cHJvZmlsZV91c2VyOwogIH0KCiAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjdXJyZW50X3VybCgpIHsKICAgIHJldHVybiAnaHR0cDovLycgLiAkX1NFUlZFUlsnSFRUUF9IT1NUJ10gLiAkX1NFUlZFUlsnUkVRVUVTVF9VUkknXTsKICB9CgogIC8vIHJlcXVpcmVfYWRkIGFuZCByZXF1aXJlX2luc3RhbGwgaGF2ZSBiZWVuIHJlbW92ZWQuCiAgLy8gc2VlIGh0dHA6Ly9kZXZlbG9wZXIuZmFjZWJvb2suY29tL25ld3MucGhwP2Jsb2c9MSZzdG9yeT0xMTYgZm9yIG1vcmUgZGV0YWlscwogIHB1YmxpYyBmdW5jdGlvbiByZXF1aXJlX2xvZ2luKCkgewogICAgaWYgKCR1c2VyID0gJHRoaXMtPmdldF9sb2dnZWRpbl91c2VyKCkpIHsKICAgICAgcmV0dXJuICR1c2VyOwogICAgfQogICAgJHRoaXMtPnJlZGlyZWN0KCR0aGlzLT5nZXRfbG9naW5fdXJsKHNlbGY6OmN1cnJlbnRfdXJsKCksICR0aGlzLT5pbl9mcmFtZSgpKSk7CiAgfQoKICBwdWJsaWMgZnVuY3Rpb24gcmVxdWlyZV9mcmFtZSgpIHsKICAgIGlmICghJHRoaXMtPmluX2ZyYW1lKCkpIHsKICAgICAgJHRoaXMtPnJlZGlyZWN0KCR0aGlzLT5nZXRfbG9naW5fdXJsKHNlbGY6OmN1cnJlbnRfdXJsKCksIHRydWUpKTsKICAgIH0KICB9CgogIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0X2ZhY2Vib29rX3VybCgkc3ViZG9tYWluPSd3d3cnKSB7CiAgICByZXR1cm4gJ2h0dHA6Ly8nIC4gJHN1YmRvbWFpbiAuICcuZmFjZWJvb2suY29tJzsKICB9CgogIHB1YmxpYyBmdW5jdGlvbiBnZXRfaW5zdGFsbF91cmwoJG5leHQ9bnVsbCkgewogICAgLy8gdGhpcyB3YXMgcmVuYW1lZCwga2VlcGluZyBmb3IgY29tcGF0aWJpbGl0eSdzIHNha2UKICAgIHJldHVybiAkdGhpcy0+Z2V0X2FkZF91cmwoJG5leHQpOwogIH0KCiAgcHVibGljIGZ1bmN0aW9uIGdldF9hZGRfdXJsKCRuZXh0PW51bGwpIHsKICAgICRwYWdlID0gc2VsZjo6Z2V0X2ZhY2Vib29rX3VybCgpLicvYWRkLnBocCc7CiAgICAkcGFyYW1zID0gYXJyYXkoJ2FwaV9rZXknID0+ICR0aGlzLT5hcGlfa2V5KTsKCiAgICBpZiAoJG5leHQpIHsKICAgICAgJHBhcmFtc1snbmV4dCddID0gJG5leHQ7CiAgICB9CgogICAgcmV0dXJuICRwYWdlIC4gJz8nIC4gaHR0cF9idWlsZF9xdWVyeSgkcGFyYW1zKTsKICB9CgogIHB1YmxpYyBmdW5jdGlvbiBnZXRfbG9naW5fdXJsKCRuZXh0LCAkY2FudmFzKSB7CiAgICAkcGFnZSA9IHNlbGY6OmdldF9mYWNlYm9va191cmwoKS4nL2xvZ2luLnBocCc7CiAgICAkcGFyYW1zID0gYXJyYXkoJ2FwaV9rZXknID0+ICR0aGlzLT5hcGlfa2V5LAogICAgICAgICAgICAgICAgICAgICd2JyAgICAgICA9PiAnMS4wJyk7CgogICAgaWYgKCRuZXh0KSB7CiAgICAgICRwYXJhbXNbJ25leHQnXSA9ICRuZXh0OwogICAgfQogICAgaWYgKCRjYW52YXMpIHsKICAgICAgJHBhcmFtc1snY2FudmFzJ10gPSAnMSc7CiAgICB9CgogICAgcmV0dXJuICRwYWdlIC4gJz8nIC4gaHR0cF9idWlsZF9xdWVyeSgkcGFyYW1zKTsKICB9CgogIHB1YmxpYyBmdW5jdGlvbiBnZXRfbG9nb3V0X3VybCgkbmV4dCkgewogICAgJHBhZ2UgPSBzZWxmOjpnZXRfZmFjZWJvb2tfdXJsKCkuJy9sb2dvdXQucGhwJzsKICAgICRwYXJhbXMgPSBhcnJheSgnYXBwX2tleScgICAgID0+ICR0aGlzLT5hcGlfa2V5LAogICAgICAgICAgICAgICAgICAgICdzZXNzaW9uX2tleScgPT4gJHRoaXMtPmFwaV9jbGllbnQtPnNlc3Npb25fa2V5KTsKCiAgICBpZiAoJG5leHQpIHsKICAgICAgJHBhcmFtc1snY29ubmVjdF9uZXh0J10gPSAxOwogICAgICAkcGFyYW1zWyduZXh0J10gPSAkbmV4dDsKICAgIH0KCiAgICByZXR1cm4gJHBhZ2UgLiAnPycgLiBodHRwX2J1aWxkX3F1ZXJ5KCRwYXJhbXMpOwogIH0KCiAgcHVibGljIGZ1bmN0aW9uIHNldF91c2VyKCR1c2VyLCAkc2Vzc2lvbl9rZXksICRleHBpcmVzPW51bGwsICRzZXNzaW9uX3NlY3JldD1udWxsKSB7CiAgICBpZiAoISR0aGlzLT5pbl9mYl9jYW52YXMoKSAmJiAoIWlzc2V0KCRfQ09PS0lFWyR0aGlzLT5hcGlfa2V5IC4gJ191c2VyJ10pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgJF9DT09LSUVbJHRoaXMtPmFwaV9rZXkgLiAnX3VzZXInXSAhPSAkdXNlcikpIHsKICAgICAgJHRoaXMtPnNldF9jb29raWVzKCR1c2VyLCAkc2Vzc2lvbl9rZXksICRleHBpcmVzLCAkc2Vzc2lvbl9zZWNyZXQpOwogICAgfQogICAgJHRoaXMtPnVzZXIgPSAkdXNlcjsKICAgICR0aGlzLT5hcGlfY2xpZW50LT5zZXNzaW9uX2tleSA9ICRzZXNzaW9uX2tleTsKICAgICR0aGlzLT5zZXNzaW9uX2V4cGlyZXMgPSAkZXhwaXJlczsKICB9CgogIHB1YmxpYyBmdW5jdGlvbiBzZXRfY29va2llcygkdXNlciwgJHNlc3Npb25fa2V5LCAkZXhwaXJlcz1udWxsLCAkc2Vzc2lvbl9zZWNyZXQ9bnVsbCkgewogICAgJGNvb2tpZXMgPSBhcnJheSgpOwogICAgJGNvb2tpZXNbJ3VzZXInXSA9ICR1c2VyOwogICAgJGNvb2tpZXNbJ3Nlc3Npb25fa2V5J10gPSAkc2Vzc2lvbl9rZXk7CiAgICBpZiAoJGV4cGlyZXMgIT0gbnVsbCkgewogICAgICAkY29va2llc1snZXhwaXJlcyddID0gJGV4cGlyZXM7CiAgICB9CiAgICBpZiAoJHNlc3Npb25fc2VjcmV0ICE9IG51bGwpIHsKICAgICAgJGNvb2tpZXNbJ3NzJ10gPSAkc2Vzc2lvbl9zZWNyZXQ7CiAgICB9CgogICAgZm9yZWFjaCAoJGNvb2tpZXMgYXMgJG5hbWUgPT4gJHZhbCkgewogICAgICBzZXRjb29raWUoJHRoaXMtPmFwaV9rZXkgLiAnXycgLiAkbmFtZSwgJHZhbCwgKGludCkkZXhwaXJlcywgJycsICR0aGlzLT5iYXNlX2RvbWFpbik7CiAgICAgICRfQ09PS0lFWyR0aGlzLT5hcGlfa2V5IC4gJ18nIC4gJG5hbWVdID0gJHZhbDsKICAgIH0KICAgICRzaWcgPSBzZWxmOjpnZW5lcmF0ZV9zaWcoJGNvb2tpZXMsICR0aGlzLT5zZWNyZXQpOwogICAgc2V0Y29va2llKCR0aGlzLT5hcGlfa2V5LCAkc2lnLCAoaW50KSRleHBpcmVzLCAnJywgJHRoaXMtPmJhc2VfZG9tYWluKTsKICAgICRfQ09PS0lFWyR0aGlzLT5hcGlfa2V5XSA9ICRzaWc7CgogICAgaWYgKCR0aGlzLT5iYXNlX2RvbWFpbiAhPSBudWxsKSB7CiAgICAgICRiYXNlX2RvbWFpbl9jb29raWUgPSAnYmFzZV9kb21haW5fJyAuICR0aGlzLT5hcGlfa2V5OwogICAgICBzZXRjb29raWUoJGJhc2VfZG9tYWluX2Nvb2tpZSwgJHRoaXMtPmJhc2VfZG9tYWluLCAoaW50KSRleHBpcmVzLCAnJywgJHRoaXMtPmJhc2VfZG9tYWluKTsKICAgICAgJF9DT09LSUVbJGJhc2VfZG9tYWluX2Nvb2tpZV0gPSAkdGhpcy0+YmFzZV9kb21haW47CiAgICB9CiAgfQoKICAvKioKICAgKiBUcmllcyB0byB1bmRvIHRoZSBiYWRuZXNzIG9mIG1hZ2ljIHF1b3RlcyBhcyBiZXN0IHdlIGNhbgogICAqIEBwYXJhbSAgICAgc3RyaW5nICAgJHZhbCAgIFNob3VsZCBjb21lIGRpcmVjdGx5IGZyb20gJF9HRVQsICRfUE9TVCwgZXRjLgogICAqIEByZXR1cm4gICAgc3RyaW5nICAgdmFsIHdpdGhvdXQgYWRkZWQgc2xhc2hlcwogICAqLwogIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbm9fbWFnaWNfcXVvdGVzKCR2YWwpIHsKICAgIGlmIChnZXRfbWFnaWNfcXVvdGVzX2dwYygpKSB7CiAgICAgIHJldHVybiBzdHJpcHNsYXNoZXMoJHZhbCk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHZhbDsKICAgIH0KICB9CgogIC8qCiAgICogR2V0IHRoZSBzaWduZWQgcGFyYW1ldGVycyB0aGF0IHdlcmUgc2VudCBmcm9tIEZhY2Vib29rLiBWYWxpZGF0ZXMgdGhlIHNldAogICAqIG9mIHBhcmFtZXRlcnMgYWdhaW5zdCB0aGUgaW5jbHVkZWQgc2lnbmF0dXJlLgogICAqCiAgICogU2luY2UgRmFjZWJvb2sgc2VuZHMgZGF0YSB0byB5b3VyIGNhbGxiYWNrIFVSTCB2aWEgdW5zZWN1cmVkIG1lYW5zLCB0aGUKICAgKiBzaWduYXR1cmUgaXMgdGhlIG9ubHkgd2F5IHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBkYXRhIGFjdHVhbGx5IGNhbWUgZnJvbQogICAqIEZhY2Vib29rLiBTbyBpZiBhbiBhcHAgcmVjZWl2ZXMgYSByZXF1ZXN0IGF0IHRoZSBjYWxsYmFjayBVUkwsIGl0IHNob3VsZAogICAqIGFsd2F5cyB2ZXJpZnkgdGhlIHNpZ25hdHVyZSB0aGF0IGNvbWVzIHdpdGggYWdhaW5zdCB5b3VyIG93biBzZWNyZXQga2V5LgogICAqIE90aGVyd2lzZSwgaXQncyBwb3NzaWJsZSBmb3Igc29tZW9uZSB0byBzcG9vZiBhIHJlcXVlc3QgYnkKICAgKiBwcmV0ZW5kaW5nIHRvIGJlIHNvbWVvbmUgZWxzZSwgaS5lLjoKICAgKiAgICAgIHd3dy55b3VyLWNhbGxiYWNrLXVybC5jb20vP2ZiX3VzZXI9MTAxMDEKICAgKgogICAqIFRoaXMgaXMgZG9uZSBhdXRvbWF0aWNhbGx5IGJ5IHZlcmlmeV9mYl9wYXJhbXMuCiAgICoKICAgKiBAcGFyYW0gIGFzc29jICAkcGFyYW1zICAgICBhIGZ1bGwgYXJyYXkgb2YgZXh0ZXJuYWwgcGFyYW1ldGVycy4KICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVzdW1lZCAkX0dFVCwgJF9QT1NULCBvciAkX0NPT0tJRQogICAqIEBwYXJhbSAgaW50ICAgICR0aW1lb3V0ICAgIG51bWJlciBvZiBzZWNvbmRzIHRoYXQgdGhlIGFyZ3MgYXJlIGdvb2QgZm9yLgogICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNwZWNpZmljYWxseSBnb29kIGZvciBmb3JjaW5nIGNvb2tpZXMgdG8gZXhwaXJlLgogICAqIEBwYXJhbSAgc3RyaW5nICRuYW1lc3BhY2UgIHByZWZpeCBzdHJpbmcgZm9yIHRoZSBzZXQgb2YgcGFyYW1ldGVycyB3ZSB3YW50CiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gdmVyaWZ5LiBpLmUuLCBmYl9zaWcgb3IgZmJfcG9zdF9zaWcKICAgKgogICAqIEByZXR1cm4gIGFzc29jIHRoZSBzdWJzZXQgb2YgcGFyYW1ldGVycyBjb250YWluaW5nIHRoZSBnaXZlbiBwcmVmaXgsCiAgICogICAgICAgICAgICAgICAgYW5kIGFsc28gbWF0Y2hpbmcgdGhlIHNpZ25hdHVyZSBhc3NvY2lhdGVkIHdpdGggdGhlbS4KICAgKiAgICAgICAgICBPUiAgICBhbiBlbXB0eSBhcnJheSBpZiB0aGUgcGFyYW1zIGRvIG5vdCB2YWxpZGF0ZQogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBnZXRfdmFsaWRfZmJfcGFyYW1zKCRwYXJhbXMsICR0aW1lb3V0PW51bGwsICRuYW1lc3BhY2U9J2ZiX3NpZycpIHsKICAgICRwcmVmaXggPSAkbmFtZXNwYWNlIC4gJ18nOwogICAgJHByZWZpeF9sZW4gPSBzdHJsZW4oJHByZWZpeCk7CiAgICAkZmJfcGFyYW1zID0gYXJyYXkoKTsKICAgIGlmIChlbXB0eSgkcGFyYW1zKSkgewogICAgICByZXR1cm4gYXJyYXkoKTsKICAgIH0KCiAgICBmb3JlYWNoICgkcGFyYW1zIGFzICRuYW1lID0+ICR2YWwpIHsKICAgICAgLy8gcHVsbCBvdXQgb25seSB0aG9zZSBwYXJhbWV0ZXJzIHRoYXQgbWF0Y2ggdGhlIHByZWZpeAogICAgICAvLyBub3RlIHRoYXQgdGhlIHNpZ25hdHVyZSBpdHNlbGYgKCRwYXJhbXNbJG5hbWVzcGFjZV0pIGlzIG5vdCBpbiB0aGUgbGlzdAogICAgICBpZiAoc3RycG9zKCRuYW1lLCAkcHJlZml4KSA9PT0gMCkgewogICAgICAgICRmYl9wYXJhbXNbc3Vic3RyKCRuYW1lLCAkcHJlZml4X2xlbildID0gc2VsZjo6bm9fbWFnaWNfcXVvdGVzKCR2YWwpOwogICAgICB9CiAgICB9CgogICAgLy8gdmFsaWRhdGUgdGhhdCB0aGUgcmVxdWVzdCBoYXNuJ3QgZXhwaXJlZC4gdGhpcyBpcyBtb3N0IGxpa2VseQogICAgLy8gZm9yIHBhcmFtcyB0aGF0IGNvbWUgZnJvbSAkX0NPT0tJRQogICAgaWYgKCR0aW1lb3V0ICYmICghaXNzZXQoJGZiX3BhcmFtc1sndGltZSddKSB8fCB0aW1lKCkgLSAkZmJfcGFyYW1zWyd0aW1lJ10gPiAkdGltZW91dCkpIHsKICAgICAgcmV0dXJuIGFycmF5KCk7CiAgICB9CgogICAgLy8gdmFsaWRhdGUgdGhhdCB0aGUgcGFyYW1zIG1hdGNoIHRoZSBzaWduYXR1cmUKICAgICRzaWduYXR1cmUgPSBpc3NldCgkcGFyYW1zWyRuYW1lc3BhY2VdKSA/ICRwYXJhbXNbJG5hbWVzcGFjZV0gOiBudWxsOwogICAgaWYgKCEkc2lnbmF0dXJlIHx8ICghJHRoaXMtPnZlcmlmeV9zaWduYXR1cmUoJGZiX3BhcmFtcywgJHNpZ25hdHVyZSkpKSB7CiAgICAgIHJldHVybiBhcnJheSgpOwogICAgfQogICAgcmV0dXJuICRmYl9wYXJhbXM7CiAgfQoKICAvKioKICAgKiAgVmFsaWRhdGVzIHRoZSBhY2NvdW50IHRoYXQgYSB1c2VyIHdhcyB0cnlpbmcgdG8gc2V0IHVwIGFuCiAgICogIGluZGVwZW5kZW50IGFjY291bnQgdGhyb3VnaCBGYWNlYm9vayBDb25uZWN0LgogICAqCiAgICogIEBwYXJhbSAgdXNlciBUaGUgdXNlciBhdHRlbXB0aW5nIHRvIHNldCB1cCBhbiBpbmRlcGVuZGVudCBhY2NvdW50LgogICAqICBAcGFyYW0gIGhhc2ggVGhlIGhhc2ggcGFzc2VkIHRvIHRoZSByZWNsYW1hdGlvbiBVUkwgdXNlZC4KICAgKiAgQHJldHVybiBib29sIFRydWUgaWYgdGhlIHVzZXIgaXMgdGhlIG9uZSB0aGF0IHNlbGVjdGVkIHRoZQogICAqICAgICAgICAgICAgICAgcmVjbGFtYXRpb24gbGluay4KICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gdmVyaWZ5X2FjY291bnRfcmVjbGFtYXRpb24oJHVzZXIsICRoYXNoKSB7CiAgICByZXR1cm4gJGhhc2ggPT0gbWQ1KCR1c2VyIC4gJHRoaXMtPnNlY3JldCk7CiAgfQoKICAvKioKICAgKiBWYWxpZGF0ZXMgdGhhdCBhIGdpdmVuIHNldCBvZiBwYXJhbWV0ZXJzIG1hdGNoIHRoZWlyIHNpZ25hdHVyZS4KICAgKiBQYXJhbWV0ZXJzIGFsbCBtYXRjaCBhIGdpdmVuIGlucHV0IHByZWZpeCwgc3VjaCBhcyAiZmJfc2lnIi4KICAgKgogICAqIEBwYXJhbSAkZmJfcGFyYW1zICAgICBhbiBhcnJheSBvZiBhbGwgRmFjZWJvb2stc2VudCBwYXJhbWV0ZXJzLAogICAqICAgICAgICAgICAgICAgICAgICAgICBub3QgaW5jbHVkaW5nIHRoZSBzaWduYXR1cmUgaXRzZWxmCiAgICogQHBhcmFtICRleHBlY3RlZF9zaWcgIHRoZSBleHBlY3RlZCByZXN1bHQgdG8gY2hlY2sgYWdhaW5zdAogICAqLwogIHB1YmxpYyBmdW5jdGlvbiB2ZXJpZnlfc2lnbmF0dXJlKCRmYl9wYXJhbXMsICRleHBlY3RlZF9zaWcpIHsKICAgIHJldHVybiBzZWxmOjpnZW5lcmF0ZV9zaWcoJGZiX3BhcmFtcywgJHRoaXMtPnNlY3JldCkgPT0gJGV4cGVjdGVkX3NpZzsKICB9CgogIC8qKgogICAqIFZhbGlkYXRlIHRoZSBnaXZlbiBzaWduZWQgcHVibGljIHNlc3Npb24gZGF0YSBzdHJ1Y3R1cmUgd2l0aAogICAqIHB1YmxpYyBrZXkgb2YgdGhlIGFwcCB0aGF0CiAgICogdGhlIHNlc3Npb24gcHJvb2YgYmVsb25ncyB0by4KICAgKgogICAqIEBwYXJhbSAkc2lnbmVkX2RhdGEgdGhlIHNlc3Npb24gaW5mbyB0aGF0IGlzIHBhc3NlZCBieSBhbm90aGVyIGFwcAogICAqIEBwYXJhbSBzdHJpbmcgJHB1YmxpY19rZXkgT3B0aW9uYWwgcHVibGljIGtleSBvZiB0aGUgYXBwLiBJZiB0aGlzCiAgICogICAgICAgICAgICAgICBpcyBub3QgcGFzc2VkLCBmdW5jdGlvbiB3aWxsIG1ha2UgYW4gQVBJIGNhbGwgdG8gZ2V0IGl0LgogICAqIHJldHVybiB0cnVlIGlmIHRoZSBzZXNzaW9uIHByb29mIHBhc3NlZCB2ZXJpZmljYXRpb24uCiAgICovCiAgcHVibGljIGZ1bmN0aW9uIHZlcmlmeV9zaWduZWRfcHVibGljX3Nlc3Npb25fZGF0YSgkc2lnbmVkX2RhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcHVibGljX2tleSA9IG51bGwpIHsKCiAgICAvLyBJZiBwdWJsaWMga2V5IGlzIG5vdCBhbHJlYWR5IHByb3ZpZGVkLCB3ZSBuZWVkIHRvIGdldCBpdCB0aHJvdWdoIEFQSQogICAgaWYgKCEkcHVibGljX2tleSkgewogICAgICAkcHVibGljX2tleSA9ICR0aGlzLT5hcGlfY2xpZW50LT5hdXRoX2dldEFwcFB1YmxpY0tleSgKICAgICAgICAkc2lnbmVkX2RhdGFbJ2FwaV9rZXknXSk7CiAgICB9CgogICAgLy8gQ3JlYXRlIGRhdGEgdG8gdmVyaWZ5CiAgICAkZGF0YV90b19zZXJpYWxpemUgPSAkc2lnbmVkX2RhdGE7CiAgICB1bnNldCgkZGF0YV90b19zZXJpYWxpemVbJ3NpZyddKTsKICAgICRzZXJpYWxpemVkX2RhdGEgPSBpbXBsb2RlKCdfJywgJGRhdGFfdG9fc2VyaWFsaXplKTsKCiAgICAvLyBEZWNvZGUgc2lnbmF0dXJlCiAgICAkc2lnbmF0dXJlID0gYmFzZTY0X2RlY29kZSgkc2lnbmVkX2RhdGFbJ3NpZyddKTsKICAgICRyZXN1bHQgPSBvcGVuc3NsX3ZlcmlmeSgkc2VyaWFsaXplZF9kYXRhLCAkc2lnbmF0dXJlLCAkcHVibGljX2tleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEVOU1NMX0FMR09fU0hBMSk7CiAgICByZXR1cm4gJHJlc3VsdCA9PSAxOwogIH0KCiAgLyoKICAgKiBHZW5lcmF0ZSBhIHNpZ25hdHVyZSB1c2luZyB0aGUgYXBwbGljYXRpb24gc2VjcmV0IGtleS4KICAgKgogICAqIFRoZSBvbmx5IHR3byBlbnRpdGllcyB0aGF0IGtub3cgeW91ciBzZWNyZXQga2V5IGFyZSB5b3UgYW5kIEZhY2Vib29rLAogICAqIGFjY29yZGluZyB0byB0aGUgVGVybXMgb2YgU2VydmljZS4gU2luY2Ugbm9ib2R5IGVsc2UgY2FuIGdlbmVyYXRlCiAgICogdGhlIHNpZ25hdHVyZSwgeW91IGNhbiByZWx5IG9uIGl0IHRvIHZlcmlmeSB0aGF0IHRoZSBpbmZvcm1hdGlvbgogICAqIGNhbWUgZnJvbSBGYWNlYm9vay4KICAgKgogICAqIEBwYXJhbSAkcGFyYW1zX2FycmF5ICAgYW4gYXJyYXkgb2YgYWxsIEZhY2Vib29rLXNlbnQgcGFyYW1ldGVycywKICAgKiAgICAgICAgICAgICAgICAgICAgICAgIE5PVCBJTkNMVURJTkcgdGhlIHNpZ25hdHVyZSBpdHNlbGYKICAgKiBAcGFyYW0gJHNlY3JldCAgICAgICAgIHlvdXIgYXBwJ3Mgc2VjcmV0IGtleQogICAqCiAgICogQHJldHVybiBhIGhhc2ggdG8gYmUgY2hlY2tlZCBhZ2FpbnN0IHRoZSBzaWduYXR1cmUgcHJvdmlkZWQgYnkgRmFjZWJvb2sKICAgKi8KICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdlbmVyYXRlX3NpZygkcGFyYW1zX2FycmF5LCAkc2VjcmV0KSB7CiAgICAkc3RyID0gJyc7CgogICAga3NvcnQoJHBhcmFtc19hcnJheSk7CiAgICAvLyBOb3RlOiBtYWtlIHN1cmUgdGhhdCB0aGUgc2lnbmF0dXJlIHBhcmFtZXRlciBpcyBub3QgYWxyZWFkeSBpbmNsdWRlZCBpbgogICAgLy8gICAgICAgJHBhcmFtc19hcnJheS4KICAgIGZvcmVhY2ggKCRwYXJhbXNfYXJyYXkgYXMgJGs9PiR2KSB7CiAgICAgICRzdHIgLj0gIiRrPSR2IjsKICAgIH0KICAgICRzdHIgLj0gJHNlY3JldDsKCiAgICByZXR1cm4gbWQ1KCRzdHIpOwogIH0KCiAgcHVibGljIGZ1bmN0aW9uIGVuY29kZV92YWxpZGF0aW9uRXJyb3IoJHN1bW1hcnksICRtZXNzYWdlKSB7CiAgICByZXR1cm4ganNvbl9lbmNvZGUoCiAgICAgICAgICAgICAgIGFycmF5KCdlcnJvckNvZGUnICAgID0+IEZBQ0VCT09LX0FQSV9WQUxJREFUSU9OX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICAnZXJyb3JUaXRsZScgICA9PiAkc3VtbWFyeSwKICAgICAgICAgICAgICAgICAgICAgJ2Vycm9yTWVzc2FnZScgPT4gJG1lc3NhZ2UpKTsKICB9CgogIHB1YmxpYyBmdW5jdGlvbiBlbmNvZGVfbXVsdGlGZWVkU3RvcnkoJGZlZWQsICRuZXh0KSB7CiAgICByZXR1cm4ganNvbl9lbmNvZGUoCiAgICAgICAgICAgICAgIGFycmF5KCdtZXRob2QnICAgPT4gJ211bHRpRmVlZFN0b3J5JywKICAgICAgICAgICAgICAgICAgICAgJ2NvbnRlbnQnICA9PgogICAgICAgICAgICAgICAgICAgICBhcnJheSgnbmV4dCcgPT4gJG5leHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICdmZWVkJyA9PiAkZmVlZCkpKTsKICB9CgogIHB1YmxpYyBmdW5jdGlvbiBlbmNvZGVfZmVlZFN0b3J5KCRmZWVkLCAkbmV4dCkgewogICAgcmV0dXJuIGpzb25fZW5jb2RlKAogICAgICAgICAgICAgICBhcnJheSgnbWV0aG9kJyAgID0+ICdmZWVkU3RvcnknLAogICAgICAgICAgICAgICAgICAgICAnY29udGVudCcgID0+CiAgICAgICAgICAgICAgICAgICAgIGFycmF5KCduZXh0JyA9PiAkbmV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZlZWQnID0+ICRmZWVkKSkpOwogIH0KCiAgcHVibGljIGZ1bmN0aW9uIGNyZWF0ZV90ZW1wbGF0aXplZEZlZWRTdG9yeSgkdGl0bGVfdGVtcGxhdGUsICR0aXRsZV9kYXRhPWFycmF5KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRib2R5X3RlbXBsYXRlPScnLCAkYm9keV9kYXRhID0gYXJyYXkoKSwgJGJvZHlfZ2VuZXJhbD1udWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaW1hZ2VfMT1udWxsLCAkaW1hZ2VfMV9saW5rPW51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpbWFnZV8yPW51bGwsICRpbWFnZV8yX2xpbms9bnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGltYWdlXzM9bnVsbCwgJGltYWdlXzNfbGluaz1udWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaW1hZ2VfND1udWxsLCAkaW1hZ2VfNF9saW5rPW51bGwpIHsKICAgIHJldHVybiBhcnJheSgndGl0bGVfdGVtcGxhdGUnPT4gJHRpdGxlX3RlbXBsYXRlLAogICAgICAgICAgICAgICAgICd0aXRsZV9kYXRhJyAgID0+ICR0aXRsZV9kYXRhLAogICAgICAgICAgICAgICAgICdib2R5X3RlbXBsYXRlJz0+ICRib2R5X3RlbXBsYXRlLAogICAgICAgICAgICAgICAgICdib2R5X2RhdGEnICAgID0+ICRib2R5X2RhdGEsCiAgICAgICAgICAgICAgICAgJ2JvZHlfZ2VuZXJhbCcgPT4gJGJvZHlfZ2VuZXJhbCwKICAgICAgICAgICAgICAgICAnaW1hZ2VfMScgICAgICA9PiAkaW1hZ2VfMSwKICAgICAgICAgICAgICAgICAnaW1hZ2VfMV9saW5rJyA9PiAkaW1hZ2VfMV9saW5rLAogICAgICAgICAgICAgICAgICdpbWFnZV8yJyAgICAgID0+ICRpbWFnZV8yLAogICAgICAgICAgICAgICAgICdpbWFnZV8yX2xpbmsnID0+ICRpbWFnZV8yX2xpbmssCiAgICAgICAgICAgICAgICAgJ2ltYWdlXzMnICAgICAgPT4gJGltYWdlXzMsCiAgICAgICAgICAgICAgICAgJ2ltYWdlXzNfbGluaycgPT4gJGltYWdlXzNfbGluaywKICAgICAgICAgICAgICAgICAnaW1hZ2VfNCcgICAgICA9PiAkaW1hZ2VfNCwKICAgICAgICAgICAgICAgICAnaW1hZ2VfNF9saW5rJyA9PiAkaW1hZ2VfNF9saW5rKTsKICB9CgoKfQoK]]></data>
	</file>
	<file>
	  <filename>/facebook-platform/php/facebookapi_php5_restlib.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLy8gQ29weXJpZ2h0IDIwMDQtMjAwOSBGYWNlYm9vay4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLy8KLy8gKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLy8gfCBGYWNlYm9vayBQbGF0Zm9ybSBQSFA1IGNsaWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLy8gKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLy8gfCBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOSBGYWNlYm9vaywgSW5jLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLy8gfCBBbGwgcmlnaHRzIHJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLy8gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLy8gfCBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgICAgICAgIHwKLy8gfCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgICAgICAgIHwKLy8gfCBhcmUgbWV0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLy8gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLy8gfCAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCAgICAgICAgIHwKLy8gfCAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuICAgICAgICAgIHwKLy8gfCAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCAgICAgIHwKLy8gfCAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlICAgIHwKLy8gfCAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAgIHwKLy8gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLy8gfCBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiAgICAgIHwKLy8gfCBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIHwKLy8gfCBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgIHwKLy8gfCBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsICAgICAgICAgIHwKLy8gfCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgIHwKLy8gfCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIHwKLy8gfCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgICAgIHwKLy8gfCBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUICAgICAgIHwKLy8gfCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgIHwKLy8gfCBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAgICAgICAgIHwKLy8gKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLy8gfCBGb3IgaGVscCB3aXRoIHRoaXMgbGlicmFyeSwgY29udGFjdCBkZXZlbG9wZXJzLWhlbHBAZmFjZWJvb2suY29tICAgICAgICAgIHwKLy8gKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLy8KCmluY2x1ZGVfb25jZSAnanNvbndyYXBwZXIvanNvbndyYXBwZXIucGhwJzsKCmNsYXNzIEZhY2Vib29rUmVzdENsaWVudCB7CiAgcHVibGljICRzZWNyZXQ7CiAgcHVibGljICRzZXNzaW9uX2tleTsKICBwdWJsaWMgJGFwaV9rZXk7CiAgLy8gdG8gc2F2ZSBtYWtpbmcgdGhlIGZyaWVuZHMuZ2V0IGFwaSBjYWxsLCB0aGlzIHdpbGwgZ2V0IHByZXBvcHVsYXRlZCBvbgogIC8vIGNhbnZhcyBwYWdlcwogIHB1YmxpYyAkZnJpZW5kc19saXN0OwogIHB1YmxpYyAkdXNlcjsKICAvLyB0byBzYXZlIG1ha2luZyB0aGUgcGFnZXMuaXNBcHBBZGRlZCBhcGkgY2FsbCwgdGhpcyB3aWxsIGdldCBwcmVwb3B1bGF0ZWQKICAvLyBvbiBjYW52YXMgcGFnZXMKICBwdWJsaWMgJGFkZGVkOwogIHB1YmxpYyAkaXNfdXNlcjsKICAvLyB3ZSBkb24ndCBwYXNzIGZyaWVuZHMgbGlzdCB0byBpZnJhbWVzLCBidXQgd2Ugd2FudCB0byBtYWtlCiAgLy8gZnJpZW5kc19nZXQgcmVhbGx5IHNpbXBsZSBpbiB0aGUgY2FudmFzX3VzZXIgKG5vbi1sb2dnZWQgaW4pIGNhc2UuCiAgLy8gU28gd2UgdXNlIHRoZSBjYW52YXNfdXNlciBhcyBkZWZhdWx0IGFyZyB0byBmcmllbmRzX2dldAogIHB1YmxpYyAkY2FudmFzX3VzZXI7CiAgcHVibGljICRiYXRjaF9tb2RlOwogIHByaXZhdGUgJGJhdGNoX3F1ZXVlOwogIHByaXZhdGUgJHBlbmRpbmdfYmF0Y2g7CiAgcHJpdmF0ZSAkY2FsbF9hc19hcGlrZXk7CiAgcHJpdmF0ZSAkdXNlX2N1cmxfaWZfYXZhaWxhYmxlOwogIHByaXZhdGUgJGZvcm1hdCA9IG51bGw7CiAgcHJpdmF0ZSAkdXNpbmdfc2Vzc2lvbl9zZWNyZXQgPSBmYWxzZTsKCiAgY29uc3QgQkFUQ0hfTU9ERV9ERUZBVUxUID0gMDsKICBjb25zdCBCQVRDSF9NT0RFX1NFUlZFUl9QQVJBTExFTCA9IDA7CiAgY29uc3QgQkFUQ0hfTU9ERV9TRVJJQUxfT05MWSA9IDI7CgogIC8qKgogICAqIENyZWF0ZSB0aGUgY2xpZW50LgogICAqIEBwYXJhbSBzdHJpbmcgJHNlc3Npb25fa2V5IGlmIHlvdSBoYXZlbid0IGdvdHRlbiBhIHNlc3Npb24ga2V5IHlldCwgbGVhdmUKICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGFzIG51bGwgYW5kIHRoZW4gc2V0IGl0IGxhdGVyIGJ5IGp1c3QKICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RseSBhY2Nlc3NpbmcgdGhlICRzZXNzaW9uX2tleSBtZW1iZXIKICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS4KICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGFwaV9rZXksICRzZWNyZXQsICRzZXNzaW9uX2tleT1udWxsKSB7CiAgICAkdGhpcy0+c2VjcmV0ICAgICAgID0gJHNlY3JldDsKICAgICR0aGlzLT5zZXNzaW9uX2tleSAgPSAkc2Vzc2lvbl9rZXk7CiAgICAkdGhpcy0+YXBpX2tleSAgICAgID0gJGFwaV9rZXk7CiAgICAkdGhpcy0+YmF0Y2hfbW9kZSA9IEZhY2Vib29rUmVzdENsaWVudDo6QkFUQ0hfTU9ERV9ERUZBVUxUOwogICAgJHRoaXMtPmxhc3RfY2FsbF9pZCA9IDA7CiAgICAkdGhpcy0+Y2FsbF9hc19hcGlrZXkgPSAnJzsKICAgICR0aGlzLT51c2VfY3VybF9pZl9hdmFpbGFibGUgPSB0cnVlOwogICAgJHRoaXMtPnNlcnZlcl9hZGRyID0KICAgICAgRmFjZWJvb2s6OmdldF9mYWNlYm9va191cmwoJ2FwaScpIC4gJy9yZXN0c2VydmVyLnBocCc7CiAgICAkdGhpcy0+cGhvdG9fc2VydmVyX2FkZHIgPQogICAgICBGYWNlYm9vazo6Z2V0X2ZhY2Vib29rX3VybCgnYXBpLXBob3RvJykgLiAnL3Jlc3RzZXJ2ZXIucGhwJzsKCiAgICBpZiAoIWVtcHR5KCRHTE9CQUxTWydmYWNlYm9va19jb25maWcnXVsnZGVidWcnXSkpIHsKICAgICAgJHRoaXMtPmN1cl9pZCA9IDA7CiAgICAgID8+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KdmFyIHR5cGVzID0gWydwYXJhbXMnLCAneG1sJywgJ3BocCcsICdzeG1sJ107CmZ1bmN0aW9uIGdldFN0eWxlKGVsZW0sIHN0eWxlKSB7CiAgaWYgKGVsZW0uZ2V0U3R5bGUpIHsKICAgIHJldHVybiBlbGVtLmdldFN0eWxlKHN0eWxlKTsKICB9IGVsc2UgewogICAgcmV0dXJuIGVsZW0uc3R5bGVbc3R5bGVdOwogIH0KfQpmdW5jdGlvbiBzZXRTdHlsZShlbGVtLCBzdHlsZSwgdmFsdWUpIHsKICBpZiAoZWxlbS5zZXRTdHlsZSkgewogICAgZWxlbS5zZXRTdHlsZShzdHlsZSwgdmFsdWUpOwogIH0gZWxzZSB7CiAgICBlbGVtLnN0eWxlW3N0eWxlXSA9IHZhbHVlOwogIH0KfQpmdW5jdGlvbiB0b2dnbGVEaXNwbGF5KGlkLCB0eXBlKSB7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykgewogICAgdmFyIHQgPSB0eXBlc1tpXTsKICAgIHZhciBwcmUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0ICsgaWQpOwogICAgaWYgKHByZSkgewogICAgICBpZiAodCAhPSB0eXBlIHx8IGdldFN0eWxlKHByZSwgJ2Rpc3BsYXknKSA9PSAnYmxvY2snKSB7CiAgICAgICAgc2V0U3R5bGUocHJlLCAnZGlzcGxheScsICdub25lJyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc2V0U3R5bGUocHJlLCAnZGlzcGxheScsICdibG9jaycpOwogICAgICB9CiAgICB9CiAgfQogIHJldHVybiBmYWxzZTsKfQo8L3NjcmlwdD4KPD9waHAKICAgIH0KICB9CgogIC8qKgogICAqIFNldCB0aGUgZGVmYXVsdCB1c2VyIGlkIGZvciBtZXRob2RzIHRoYXQgYWxsb3cgdGhlIGNhbGxlcgogICAqIHRvIHBhc3MgYW4gdWlkIHBhcmFtZXRlciB0byBpZGVudGlmeSB0aGUgdGFyZ2V0IHVzZXIKICAgKiBpbnN0ZWFkIG9mIGEgc2Vzc2lvbiBrZXkuIFRoaXMgY3VycmVudGx5IGFwcGxpZXMgdG8KICAgKiB0aGUgdXNlciBwcmVmZXJlbmNlcyBtZXRob2RzLgogICAqCiAgICogQHBhcmFtICR1aWQgaW50IHRoZSB1c2VyIGlkCiAgICovCiAgcHVibGljIGZ1bmN0aW9uIHNldF91c2VyKCR1aWQpIHsKICAgICR0aGlzLT51c2VyID0gJHVpZDsKICB9CgoKICAvKioKICAgKiBTd2l0Y2ggdG8gdXNlIHRoZSBzZXNzaW9uIHNlY3JldCBpbnN0ZWFkIG9mIHRoZSBhcHAgc2VjcmV0LAogICAqIGZvciBkZXNrdG9wIGFuZCB1bnNlY3VyZWQgZW52aXJvbm1lbnQKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gdXNlX3Nlc3Npb25fc2VjcmV0KCRzZXNzaW9uX3NlY3JldCkgewogICAgJHRoaXMtPnNlY3JldCA9ICRzZXNzaW9uX3NlY3JldDsKICAgICR0aGlzLT51c2luZ19zZXNzaW9uX3NlY3JldCA9IHRydWU7CiAgfQoKICAvKioKICAgKiBOb3JtYWxseSwgaWYgdGhlIGNVUkwgbGlicmFyeS9QSFAgZXh0ZW5zaW9uIGlzIGF2YWlsYWJsZSwgaXQgaXMgdXNlZCBmb3IKICAgKiBIVFRQIHRyYW5zYWN0aW9ucy4gIFRoaXMgYWxsb3dzIHRoYXQgYmVoYXZpb3IgdG8gYmUgb3ZlcnJpZGRlbiwgZmFsbGluZwogICAqIGJhY2sgdG8gYSB2YW5pbGxhLVBIUCBpbXBsZW1lbnRhdGlvbiBldmVuIGlmIGNVUkwgaXMgaW5zdGFsbGVkLgogICAqCiAgICogQHBhcmFtICR1c2VfY3VybF9pZl9hdmFpbGFibGUgYm9vbCB3aGV0aGVyIG9yIG5vdCB0byB1c2UgY1VSTCBpZiBhdmFpbGFibGUKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gc2V0X3VzZV9jdXJsX2lmX2F2YWlsYWJsZSgkdXNlX2N1cmxfaWZfYXZhaWxhYmxlKSB7CiAgICAkdGhpcy0+dXNlX2N1cmxfaWZfYXZhaWxhYmxlID0gJHVzZV9jdXJsX2lmX2F2YWlsYWJsZTsKICB9CgogIC8qKgogICAqIFN0YXJ0IGEgYmF0Y2ggb3BlcmF0aW9uLgogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBiZWdpbl9iYXRjaCgpIHsKICAgIGlmICgkdGhpcy0+cGVuZGluZ19iYXRjaCgpKSB7CiAgICAgICRjb2RlID0gRmFjZWJvb2tBUElFcnJvckNvZGVzOjpBUElfRUNfQkFUQ0hfQUxSRUFEWV9TVEFSVEVEOwogICAgICAkZGVzY3JpcHRpb24gPSBGYWNlYm9va0FQSUVycm9yQ29kZXM6OiRhcGlfZXJyb3JfZGVzY3JpcHRpb25zWyRjb2RlXTsKICAgICAgdGhyb3cgbmV3IEZhY2Vib29rUmVzdENsaWVudEV4Y2VwdGlvbigkZGVzY3JpcHRpb24sICRjb2RlKTsKICAgIH0KCiAgICAkdGhpcy0+YmF0Y2hfcXVldWUgPSBhcnJheSgpOwogICAgJHRoaXMtPnBlbmRpbmdfYmF0Y2ggPSB0cnVlOwogIH0KCiAgLyoKICAgKiBFbmQgY3VycmVudCBiYXRjaCBvcGVyYXRpb24KICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gZW5kX2JhdGNoKCkgewogICAgaWYgKCEkdGhpcy0+cGVuZGluZ19iYXRjaCgpKSB7CiAgICAgICRjb2RlID0gRmFjZWJvb2tBUElFcnJvckNvZGVzOjpBUElfRUNfQkFUQ0hfTk9UX1NUQVJURUQ7CiAgICAgICRkZXNjcmlwdGlvbiA9IEZhY2Vib29rQVBJRXJyb3JDb2Rlczo6JGFwaV9lcnJvcl9kZXNjcmlwdGlvbnNbJGNvZGVdOwogICAgICB0aHJvdyBuZXcgRmFjZWJvb2tSZXN0Q2xpZW50RXhjZXB0aW9uKCRkZXNjcmlwdGlvbiwgJGNvZGUpOwogICAgfQoKICAgICR0aGlzLT5wZW5kaW5nX2JhdGNoID0gZmFsc2U7CgogICAgJHRoaXMtPmV4ZWN1dGVfc2VydmVyX3NpZGVfYmF0Y2goKTsKICAgICR0aGlzLT5iYXRjaF9xdWV1ZSA9IG51bGw7CiAgfQoKICAvKioKICAgKiBhcmUgd2UgY3VycmVudGx5IHF1ZXVlaW5nIHVwIGNhbGxzIGZvciBhIGJhdGNoPwogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBwZW5kaW5nX2JhdGNoKCkgewogICAgcmV0dXJuICR0aGlzLT5wZW5kaW5nX2JhdGNoOwogIH0KCiAgcHJpdmF0ZSBmdW5jdGlvbiBleGVjdXRlX3NlcnZlcl9zaWRlX2JhdGNoKCkgewogICAgJGl0ZW1fY291bnQgPSBjb3VudCgkdGhpcy0+YmF0Y2hfcXVldWUpOwogICAgJG1ldGhvZF9mZWVkID0gYXJyYXkoKTsKICAgIGZvcmVhY2ggKCR0aGlzLT5iYXRjaF9xdWV1ZSBhcyAkYmF0Y2hfaXRlbSkgewogICAgICAkbWV0aG9kID0gJGJhdGNoX2l0ZW1bJ20nXTsKICAgICAgJHBhcmFtcyA9ICRiYXRjaF9pdGVtWydwJ107CiAgICAgIGxpc3QoJGdldCwgJHBvc3QpID0gJHRoaXMtPmZpbmFsaXplX3BhcmFtcygkbWV0aG9kLCAkcGFyYW1zKTsKICAgICAgJG1ldGhvZF9mZWVkW10gPSAkdGhpcy0+Y3JlYXRlX3VybF9zdHJpbmcoYXJyYXlfbWVyZ2UoJHBvc3QsICRnZXQpKTsKICAgIH0KCiAgICAkc2VyaWFsX29ubHkgPQogICAgICAoJHRoaXMtPmJhdGNoX21vZGUgPT0gRmFjZWJvb2tSZXN0Q2xpZW50OjpCQVRDSF9NT0RFX1NFUklBTF9PTkxZKTsKCiAgICAkcGFyYW1zID0gYXJyYXkoJ21ldGhvZF9mZWVkJyA9PiBqc29uX2VuY29kZSgkbWV0aG9kX2ZlZWQpLAogICAgICAgICAgICAgICAgICAgICdzZXJpYWxfb25seScgPT4gJHNlcmlhbF9vbmx5LAogICAgICAgICAgICAgICAgICAgICdmb3JtYXQnID0+ICR0aGlzLT5mb3JtYXQpOwogICAgJHJlc3VsdCA9ICR0aGlzLT5jYWxsX21ldGhvZCgnZmFjZWJvb2suYmF0Y2gucnVuJywgJHBhcmFtcyk7CgogICAgaWYgKGlzX2FycmF5KCRyZXN1bHQpICYmIGlzc2V0KCRyZXN1bHRbJ2Vycm9yX2NvZGUnXSkpIHsKICAgICAgdGhyb3cgbmV3IEZhY2Vib29rUmVzdENsaWVudEV4Y2VwdGlvbigkcmVzdWx0WydlcnJvcl9tc2cnXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmVzdWx0WydlcnJvcl9jb2RlJ10pOwogICAgfQoKICAgIGZvciAoJGkgPSAwOyAkaSA8ICRpdGVtX2NvdW50OyAkaSsrKSB7CiAgICAgICRiYXRjaF9pdGVtID0gJHRoaXMtPmJhdGNoX3F1ZXVlWyRpXTsKICAgICAgJGJhdGNoX2l0ZW1bJ3AnXVsnZm9ybWF0J10gPSAkdGhpcy0+Zm9ybWF0OwogICAgICAkYmF0Y2hfaXRlbV9yZXN1bHQgPSAkdGhpcy0+Y29udmVydF9yZXN1bHQoJHJlc3VsdFskaV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYmF0Y2hfaXRlbVsnbSddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGJhdGNoX2l0ZW1bJ3AnXSk7CgogICAgICBpZiAoaXNfYXJyYXkoJGJhdGNoX2l0ZW1fcmVzdWx0KSAmJgogICAgICAgICAgaXNzZXQoJGJhdGNoX2l0ZW1fcmVzdWx0WydlcnJvcl9jb2RlJ10pKSB7CiAgICAgICAgdGhyb3cgbmV3IEZhY2Vib29rUmVzdENsaWVudEV4Y2VwdGlvbigkYmF0Y2hfaXRlbV9yZXN1bHRbJ2Vycm9yX21zZyddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGJhdGNoX2l0ZW1fcmVzdWx0WydlcnJvcl9jb2RlJ10pOwogICAgICB9CiAgICAgICRiYXRjaF9pdGVtWydyJ10gPSAkYmF0Y2hfaXRlbV9yZXN1bHQ7CiAgICB9CiAgfQoKICBwdWJsaWMgZnVuY3Rpb24gYmVnaW5fcGVybWlzc2lvbnNfbW9kZSgkcGVybWlzc2lvbnNfYXBpa2V5KSB7CiAgICAkdGhpcy0+Y2FsbF9hc19hcGlrZXkgPSAkcGVybWlzc2lvbnNfYXBpa2V5OwogIH0KCiAgcHVibGljIGZ1bmN0aW9uIGVuZF9wZXJtaXNzaW9uc19tb2RlKCkgewogICAgJHRoaXMtPmNhbGxfYXNfYXBpa2V5ID0gJyc7CiAgfQoKCiAgLyoKICAgKiBJZiBhIHBhZ2UgaXMgbG9hZGVkIHZpYSBIVFRQUywgdGhlbiBhbGwgaW1hZ2VzIGFuZCBzdGF0aWMKICAgKiByZXNvdXJjZXMgbmVlZCB0byBiZSBwcmludGVkIHdpdGggSFRUUFMgdXJscyB0byBhdm9pZAogICAqIG1peGVkIGNvbnRlbnQgd2FybmluZ3MuIElmIHlvdXIgcGFnZSBsb2FkcyB3aXRoIGFuIEhUVFBTCiAgICogdXJsLCB0aGVuIGNhbGwgc2V0X3VzZV9zc2xfcmVzb3VyY2VzIHRvIHJldHJpZXZlIHRoZSBjb3JyZWN0CiAgICogdXJscy4KICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gc2V0X3VzZV9zc2xfcmVzb3VyY2VzKCRpc19zc2wgPSB0cnVlKSB7CiAgICAkdGhpcy0+dXNlX3NzbF9yZXNvdXJjZXMgPSAkaXNfc3NsOwogIH0KCiAgLyoqCiAgICogUmV0dXJucyBwdWJsaWMgaW5mb3JtYXRpb24gZm9yIGFuIGFwcGxpY2F0aW9uIChhcyBzaG93biBpbiB0aGUgYXBwbGljYXRpb24KICAgKiBkaXJlY3RvcnkpIGJ5IGVpdGhlciBhcHBsaWNhdGlvbiBJRCwgQVBJIGtleSwgb3IgY2FudmFzIHBhZ2UgbmFtZS4KICAgKgogICAqIEBwYXJhbSBpbnQgJGFwcGxpY2F0aW9uX2lkICAgICAgICAgICAgICAoT3B0aW9uYWwpIGFwcCBpZAogICAqIEBwYXJhbSBzdHJpbmcgJGFwcGxpY2F0aW9uX2FwaV9rZXkgICAgICAoT3B0aW9uYWwpIGFwaSBrZXkKICAgKiBAcGFyYW0gc3RyaW5nICRhcHBsaWNhdGlvbl9jYW52YXNfbmFtZSAgKE9wdGlvbmFsKSBjYW52YXMgbmFtZQogICAqCiAgICogRXhhY3RseSBvbmUgYXJndW1lbnQgbXVzdCBiZSBzcGVjaWZpZWQsIG90aGVyd2lzZSBpdCBpcyBhbiBlcnJvci4KICAgKgogICAqIEByZXR1cm4gYXJyYXkgIEFuIGFycmF5IG9mIHB1YmxpYyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYXBwbGljYXRpb24uCiAgICovCiAgcHVibGljIGZ1bmN0aW9uIGFwcGxpY2F0aW9uX2dldFB1YmxpY0luZm8oJGFwcGxpY2F0aW9uX2lkPW51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGFwcGxpY2F0aW9uX2FwaV9rZXk9bnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYXBwbGljYXRpb25fY2FudmFzX25hbWU9bnVsbCkgewogICAgcmV0dXJuICR0aGlzLT5jYWxsX21ldGhvZCgnZmFjZWJvb2suYXBwbGljYXRpb24uZ2V0UHVibGljSW5mbycsCiAgICAgICAgYXJyYXkoJ2FwcGxpY2F0aW9uX2lkJyA9PiAkYXBwbGljYXRpb25faWQsCiAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uX2FwaV9rZXknID0+ICRhcHBsaWNhdGlvbl9hcGlfa2V5LAogICAgICAgICAgICAgICdhcHBsaWNhdGlvbl9jYW52YXNfbmFtZScgPT4gJGFwcGxpY2F0aW9uX2NhbnZhc19uYW1lKSk7CiAgfQoKICAvKioKICAgKiBDcmVhdGVzIGFuIGF1dGhlbnRpY2F0aW9uIHRva2VuIHRvIGJlIHVzZWQgYXMgcGFydCBvZiB0aGUgZGVza3RvcCBsb2dpbgogICAqIGZsb3cuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHNlZQogICAqIGh0dHA6Ly93aWtpLmRldmVsb3BlcnMuZmFjZWJvb2suY29tL2luZGV4LnBocC9BdXRoLmNyZWF0ZVRva2VuLgogICAqCiAgICogQHJldHVybiBzdHJpbmcgIEFuIGF1dGhlbnRpY2F0aW9uIHRva2VuLgogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBhdXRoX2NyZWF0ZVRva2VuKCkgewogICAgcmV0dXJuICR0aGlzLT5jYWxsX21ldGhvZCgnZmFjZWJvb2suYXV0aC5jcmVhdGVUb2tlbicpOwogIH0KCiAgLyoqCiAgICogUmV0dXJucyB0aGUgc2Vzc2lvbiBpbmZvcm1hdGlvbiBhdmFpbGFibGUgYWZ0ZXIgY3VycmVudCB1c2VyIGxvZ3MgaW4uCiAgICoKICAgKiBAcGFyYW0gc3RyaW5nICRhdXRoX3Rva2VuICAgICAgICAgICAgIHRoZSB0b2tlbiByZXR1cm5lZCBieQogICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aF9jcmVhdGVUb2tlbiBvciBwYXNzZWQgYmFjayB0bwogICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeW91ciBjYWxsYmFja191cmwuCiAgICogQHBhcmFtIGJvb2wgJGdlbmVyYXRlX3Nlc3Npb25fc2VjcmV0ICB3aGV0aGVyIHRoZSBzZXNzaW9uIHJldHVybmVkIHNob3VsZAogICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZSBhIHNlc3Npb24gc2VjcmV0CiAgICoKICAgKiBAcmV0dXJuIGFycmF5ICBBbiBhc3NvYyBhcnJheSBjb250YWluaW5nIHNlc3Npb25fa2V5LCB1aWQKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gYXV0aF9nZXRTZXNzaW9uKCRhdXRoX3Rva2VuLCAkZ2VuZXJhdGVfc2Vzc2lvbl9zZWNyZXQ9ZmFsc2UpIHsKICAgIGlmICghJHRoaXMtPnBlbmRpbmdfYmF0Y2goKSkgewogICAgICAkcmVzdWx0ID0gJHRoaXMtPmNhbGxfbWV0aG9kKCdmYWNlYm9vay5hdXRoLmdldFNlc3Npb24nLAogICAgICAgICAgYXJyYXkoJ2F1dGhfdG9rZW4nID0+ICRhdXRoX3Rva2VuLAogICAgICAgICAgICAgICAgJ2dlbmVyYXRlX3Nlc3Npb25fc2VjcmV0JyA9PiAkZ2VuZXJhdGVfc2Vzc2lvbl9zZWNyZXQpKTsKICAgICAgJHRoaXMtPnNlc3Npb25fa2V5ID0gJHJlc3VsdFsnc2Vzc2lvbl9rZXknXTsKCiAgICBpZiAoIWVtcHR5KCRyZXN1bHRbJ3NlY3JldCddKSAmJiAhJGdlbmVyYXRlX3Nlc3Npb25fc2VjcmV0KSB7CiAgICAgIC8vIGRlc2t0b3AgYXBwcyBoYXZlIGEgc3BlY2lhbCBzZWNyZXQKICAgICAgJHRoaXMtPnNlY3JldCA9ICRyZXN1bHRbJ3NlY3JldCddOwogICAgfQogICAgICByZXR1cm4gJHJlc3VsdDsKICAgIH0KICB9CgogIC8qKgogICAqIEdlbmVyYXRlcyBhIHNlc3Npb24tc3BlY2lmaWMgc2VjcmV0LiBUaGlzIGlzIGZvciBpbnRlZ3JhdGlvbiB3aXRoCiAgICogY2xpZW50LXNpZGUgQVBJIGNhbGxzLCBzdWNoIGFzIHRoZSBKUyBsaWJyYXJ5LgogICAqCiAgICogQHJldHVybiBhcnJheSAgQSBzZXNzaW9uIHNlY3JldCBmb3IgdGhlIGN1cnJlbnQgcHJvbW90ZWQgc2Vzc2lvbgogICAqCiAgICogQGVycm9yIEFQSV9FQ19QQVJBTV9TRVNTSU9OX0tFWQogICAqICAgICAgICBBUElfRUNfUEFSQU1fVU5LTk9XTgogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBhdXRoX3Byb21vdGVTZXNzaW9uKCkgewogICAgICByZXR1cm4gJHRoaXMtPmNhbGxfbWV0aG9kKCdmYWNlYm9vay5hdXRoLnByb21vdGVTZXNzaW9uJyk7CiAgfQoKICAvKioKICAgKiBFeHBpcmVzIHRoZSBzZXNzaW9uIHRoYXQgaXMgY3VycmVudGx5IGJlaW5nIHVzZWQuICBJZiB0aGlzIGNhbGwgaXMKICAgKiBzdWNjZXNzZnVsLCBubyBmdXJ0aGVyIGNhbGxzIHRvIHRoZSBBUEkgKHdoaWNoIHJlcXVpcmUgYSBzZXNzaW9uKSBjYW4gYmUKICAgKiBtYWRlIHVudGlsIGEgdmFsaWQgc2Vzc2lvbiBpcyBjcmVhdGVkLgogICAqCiAgICogQHJldHVybiBib29sICB0cnVlIGlmIHNlc3Npb24gZXhwaXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgZmFsc2Ugb3RoZXJ3aXNlCiAgICovCiAgcHVibGljIGZ1bmN0aW9uIGF1dGhfZXhwaXJlU2Vzc2lvbigpIHsKICAgICAgcmV0dXJuICR0aGlzLT5jYWxsX21ldGhvZCgnZmFjZWJvb2suYXV0aC5leHBpcmVTZXNzaW9uJyk7CiAgfQoKICAvKioKICAgKiAgUmV2b2tlcyB0aGUgZ2l2ZW4gZXh0ZW5kZWQgcGVybWlzc2lvbiB0aGF0IHRoZSB1c2VyIGdyYW50ZWQgYXQgc29tZQogICAqICBwcmlvciB0aW1lIChmb3IgaW5zdGFuY2UsIG9mZmxpbmVfYWNjZXNzIG9yIGVtYWlsKS4gIElmIG5vIHVzZXIgaXMKICAgKiAgcHJvdmlkZWQsIGl0IHdpbGwgYmUgcmV2b2tlZCBmb3IgdGhlIHVzZXIgb2YgdGhlIGN1cnJlbnQgc2Vzc2lvbi4KICAgKgogICAqICBAcGFyYW0gIHN0cmluZyAgJHBlcm0gIFRoZSBwZXJtaXNzaW9uIHRvIHJldm9rZQogICAqICBAcGFyYW0gIGludCAgICAgJHVpZCAgIFRoZSB1c2VyIGZvciB3aG9tIHRvIHJldm9rZSB0aGUgcGVybWlzc2lvbi4KICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gYXV0aF9yZXZva2VFeHRlbmRlZFBlcm1pc3Npb24oJHBlcm0sICR1aWQ9bnVsbCkgewogICAgcmV0dXJuICR0aGlzLT5jYWxsX21ldGhvZCgnZmFjZWJvb2suYXV0aC5yZXZva2VFeHRlbmRlZFBlcm1pc3Npb24nLAogICAgICAgIGFycmF5KCdwZXJtJyA9PiAkcGVybSwgJ3VpZCcgPT4gJHVpZCkpOwogIH0KCiAgLyoqCiAgICogUmV2b2tlcyB0aGUgdXNlcidzIGFncmVlbWVudCB0byB0aGUgRmFjZWJvb2sgVGVybXMgb2YgU2VydmljZSBmb3IgeW91cgogICAqIGFwcGxpY2F0aW9uLiAgSWYgeW91IGNhbGwgdGhpcyBtZXRob2QgZm9yIG9uZSBvZiB5b3VyIHVzZXJzLCB5b3Ugd2lsbCBubwogICAqIGxvbmdlciBiZSBhYmxlIHRvIG1ha2UgQVBJIHJlcXVlc3RzIG9uIHRoZWlyIGJlaGFsZiB1bnRpbCB0aGV5IGFnYWluCiAgICogYXV0aG9yaXplIHlvdXIgYXBwbGljYXRpb24uICBVc2Ugd2l0aCBjYXJlLiAgTm90ZSB0aGF0IGlmIHRoaXMgbWV0aG9kIGlzCiAgICogY2FsbGVkIHdpdGhvdXQgYSB1c2VyIHBhcmFtZXRlciwgdGhlbiBpdCB3aWxsIHJldm9rZSBhY2Nlc3MgZm9yIHRoZQogICAqIGN1cnJlbnQgc2Vzc2lvbidzIHVzZXIuCiAgICoKICAgKiBAcGFyYW0gaW50ICR1aWQgIChPcHRpb25hbCkgVXNlciB0byByZXZva2UKICAgKgogICAqIEByZXR1cm4gYm9vbCAgdHJ1ZSBpZiByZXZvY2F0aW9uIHN1Y2NlZWRzLCBmYWxzZSBvdGhlcndpc2UKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gYXV0aF9yZXZva2VBdXRob3JpemF0aW9uKCR1aWQ9bnVsbCkgewogICAgICByZXR1cm4gJHRoaXMtPmNhbGxfbWV0aG9kKCdmYWNlYm9vay5hdXRoLnJldm9rZUF1dGhvcml6YXRpb24nLAogICAgICAgICAgYXJyYXkoJ3VpZCcgPT4gJHVpZCkpOwogIH0KCiAgLyoqCiAgICogR2V0IHB1YmxpYyBrZXkgdGhhdCBpcyBuZWVkZWQgdG8gdmVyaWZ5IGRpZ2l0YWwgc2lnbmF0dXJlCiAgICogYW4gYXBwIG1heSBwYXNzIHRvIG90aGVyIGFwcHMuIFRoZSBwdWJsaWMga2V5IGlzIG9ubHkgdXNlZCBieQogICAqIG90aGVyIGFwcHMgZm9yIHZlcmlmaWNhdGlvbiBwdXJwb3Nlcy4KICAgKiBAcGFyYW0gIHN0cmluZyAgQVBJIGtleSBvZiBhbiBhcHAKICAgKiBAcmV0dXJuIHN0cmluZyAgVGhlIHB1YmxpYyBrZXkgZm9yIHRoZSBhcHAuCiAgICovCiAgcHVibGljIGZ1bmN0aW9uIGF1dGhfZ2V0QXBwUHVibGljS2V5KCR0YXJnZXRfYXBwX2tleSkgewogICAgcmV0dXJuICR0aGlzLT5jYWxsX21ldGhvZCgnZmFjZWJvb2suYXV0aC5nZXRBcHBQdWJsaWNLZXknLAogICAgICAgICAgYXJyYXkoJ3RhcmdldF9hcHBfa2V5JyA9PiAkdGFyZ2V0X2FwcF9rZXkpKTsKICB9CgogIC8qKgogICAqIEdldCBhIHN0cnVjdHVyZSB0aGF0IGNhbiBiZSBwYXNzZWQgdG8gYW5vdGhlciBhcHAKICAgKiBhcyBwcm9vZiBvZiBzZXNzaW9uLiBUaGUgb3RoZXIgYXBwIGNhbiB2ZXJpZnkgaXQgdXNpbmcgcHVibGljCiAgICoga2V5IG9mIHRoaXMgYXBwLgogICAqCiAgICogQHJldHVybiBzaWduZWQgcHVibGljIHNlc3Npb24gZGF0YSBzdHJ1Y3R1cmUuCiAgICovCiAgcHVibGljIGZ1bmN0aW9uIGF1dGhfZ2V0U2lnbmVkUHVibGljU2Vzc2lvbkRhdGEoKSB7CiAgICByZXR1cm4gJHRoaXMtPmNhbGxfbWV0aG9kKCdmYWNlYm9vay5hdXRoLmdldFNpZ25lZFB1YmxpY1Nlc3Npb25EYXRhJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkoKSk7CiAgfQoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdW5jb25uZWN0ZWQgZnJpZW5kcyB0aGF0IGV4aXN0IGluIHRoaXMgYXBwbGljYXRpb24uCiAgICogVGhpcyBudW1iZXIgaXMgZGV0ZXJtaW5lZCBiYXNlZCBvbiB0aGUgYWNjb3VudHMgcmVnaXN0ZXJlZCB0aHJvdWdoCiAgICogY29ubmVjdC5yZWdpc3RlclVzZXJzKCkgKHNlZSBiZWxvdykuCiAgICovCiAgcHVibGljIGZ1bmN0aW9uIGNvbm5lY3RfZ2V0VW5jb25uZWN0ZWRGcmllbmRzQ291bnQoKSB7CiAgICByZXR1cm4gJHRoaXMtPmNhbGxfbWV0aG9kKCdmYWNlYm9vay5jb25uZWN0LmdldFVuY29ubmVjdGVkRnJpZW5kc0NvdW50JywKICAgICAgICBhcnJheSgpKTsKICB9CgogLyoqCiAgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGNyZWF0ZSBhbiBhc3NvY2lhdGlvbiBiZXR3ZWVuIGFuIGV4dGVybmFsIHVzZXIKICAqIGFjY291bnQgYW5kIGEgRmFjZWJvb2sgdXNlciBhY2NvdW50LCBhcyBwZXIgRmFjZWJvb2sgQ29ubmVjdC4KICAqCiAgKiBUaGlzIG1ldGhvZCB0YWtlcyBhbiBhcnJheSBvZiBhY2NvdW50IGRhdGEsIGluY2x1ZGluZyBhIHJlcXVpcmVkIGVtYWlsX2hhc2gKICAqIGFuZCBvcHRpb25hbCBhY2NvdW50IGRhdGEuIEZvciBlYWNoIGNvbm5lY3RlZCBhY2NvdW50LCBpZiB0aGUgdXNlciBleGlzdHMsCiAgKiB0aGUgaW5mb3JtYXRpb24gaXMgYWRkZWQgdG8gdGhlIHNldCBvZiB0aGUgdXNlcidzIGNvbm5lY3RlZCBhY2NvdW50cy4KICAqIElmIHRoZSB1c2VyIGhhcyBhbHJlYWR5IGF1dGhvcml6ZWQgdGhlIHNpdGUsIHRoZSBjb25uZWN0ZWQgYWNjb3VudCBpcyBhZGRlZAogICogaW4gdGhlIGNvbmZpcm1lZCBzdGF0ZS4gSWYgdGhlIHVzZXIgaGFzIG5vdCB5ZXQgYXV0aG9yaXplZCB0aGUgc2l0ZSwgdGhlCiAgKiBjb25uZWN0ZWQgYWNjb3VudCBpcyBhZGRlZCBpbiB0aGUgcGVuZGluZyBzdGF0ZS4KICAqCiAgKiBUaGlzIGlzIGRlc2lnbmVkIHRvIGhlbHAgRmFjZWJvb2sgQ29ubmVjdCByZWNvZ25pemUgd2hlbiB0d28gRmFjZWJvb2sKICAqIGZyaWVuZHMgYXJlIGJvdGggbWVtYmVycyBvZiBhIGV4dGVybmFsIHNpdGUsIGJ1dCBwZXJoYXBzIGFyZSBub3QgYXdhcmUgb2YKICAqIGl0LiAgVGhlIENvbm5lY3QgZGlhbG9nIChzZWUgZmI6Y29ubmVjdC1mb3JtKSBpcyB1c2VkIHdoZW4gZnJpZW5kcyBjYW4gYmUKICAqIGlkZW50aWZpZWQgdGhyb3VnaCB0aGVzZSBlbWFpbCBoYXNoZXMuIFNlZSB0aGUgZm9sbG93aW5nIHVybCBmb3IgZGV0YWlsczoKICAqCiAgKiAgIGh0dHA6Ly93aWtpLmRldmVsb3BlcnMuZmFjZWJvb2suY29tL2luZGV4LnBocC9Db25uZWN0LnJlZ2lzdGVyVXNlcnMKICAqCiAgKiBAcGFyYW0gbWl4ZWQgJGFjY291bnRzIEEgKEpTT04tZW5jb2RlZCkgYXJyYXkgb2YgYXJyYXlzLCB3aGVyZSBlYWNoIGFycmF5CiAgKiAgICAgICAgICAgICAgICAgICAgICAgIGhhcyB0aHJlZSBwcm9wZXJ0aWVzOgogICogICAgICAgICAgICAgICAgICAgICAgICAnZW1haWxfaGFzaCcgIChyZXEpIC0gcHVibGljIGVtYWlsIGhhc2ggb2YgYWNjb3VudAogICogICAgICAgICAgICAgICAgICAgICAgICAnYWNjb3VudF9pZCcgIChvcHQpIC0gcmVtb3RlIGFjY291bnQgaWQ7CiAgKiAgICAgICAgICAgICAgICAgICAgICAgICdhY2NvdW50X3VybCcgKG9wdCkgLSB1cmwgdG8gcmVtb3RlIGFjY291bnQ7CiAgKgogICogQHJldHVybiBhcnJheSAgVGhlIGxpc3Qgb2YgZW1haWwgaGFzaGVzIGZvciB0aGUgc3VjY2Vzc2Z1bGx5IHJlZ2lzdGVyZWQKICAqICAgICAgICAgICAgICAgIGFjY291bnRzLgogICovCiAgcHVibGljIGZ1bmN0aW9uIGNvbm5lY3RfcmVnaXN0ZXJVc2VycygkYWNjb3VudHMpIHsKICAgIHJldHVybiAkdGhpcy0+Y2FsbF9tZXRob2QoJ2ZhY2Vib29rLmNvbm5lY3QucmVnaXN0ZXJVc2VycycsCiAgICAgICAgYXJyYXkoJ2FjY291bnRzJyA9PiAkYWNjb3VudHMpKTsKICB9CgogLyoqCiAgKiBVbnJlZ2lzdGVycyBhIHNldCBvZiBhY2NvdW50cyByZWdpc3RlcmVkIHVzaW5nIGNvbm5lY3QucmVnaXN0ZXJVc2Vycy4KICAqCiAgKiBAcGFyYW0gYXJyYXkgJGVtYWlsX2hhc2hlcyAgVGhlIChKU09OLWVuY29kZWQpIGxpc3Qgb2YgZW1haWwgaGFzaGVzIHRvIGJlCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5yZWdpc3RlcmVkLgogICoKICAqIEByZXR1cm4gYXJyYXkgIFRoZSBsaXN0IG9mIGVtYWlsIGhhc2hlcyB3aGljaCBoYXZlIGJlZW4gc3VjY2Vzc2Z1bGx5CiAgKiAgICAgICAgICAgICAgICB1bnJlZ2lzdGVyZWQuCiAgKi8KICBwdWJsaWMgZnVuY3Rpb24gY29ubmVjdF91bnJlZ2lzdGVyVXNlcnMoJGVtYWlsX2hhc2hlcykgewogICAgcmV0dXJuICR0aGlzLT5jYWxsX21ldGhvZCgnZmFjZWJvb2suY29ubmVjdC51bnJlZ2lzdGVyVXNlcnMnLAogICAgICAgIGFycmF5KCdlbWFpbF9oYXNoZXMnID0+ICRlbWFpbF9oYXNoZXMpKTsKICB9CgogIC8qKgogICAqIFJldHVybnMgZXZlbnRzIGFjY29yZGluZyB0byB0aGUgZmlsdGVycyBzcGVjaWZpZWQuCiAgICoKICAgKiBAcGFyYW0gaW50ICR1aWQgICAgICAgICAgICAoT3B0aW9uYWwpIFVzZXIgYXNzb2NpYXRlZCB3aXRoIGV2ZW50cy4gQSBudWxsCiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyIHdpbGwgZGVmYXVsdCB0byB0aGUgc2Vzc2lvbiB1c2VyLgogICAqIEBwYXJhbSBhcnJheS9zdHJpbmcgJGVpZHMgIChPcHRpb25hbCkgRmlsdGVyIGJ5IHRoZXNlIGV2ZW50CiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRzLiBBIG51bGwgcGFyYW1ldGVyIHdpbGwgZ2V0IGFsbCBldmVudHMgZm9yCiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHVzZXIuIChBIGNzdiBsaXN0IHdpbGwgd29yayBidXQgaXMgZGVwcmVjYXRlZCkKICAgKiBAcGFyYW0gaW50ICRzdGFydF90aW1lICAgICAoT3B0aW9uYWwpIEZpbHRlciB3aXRoIHRoaXMgdW5peCB0aW1lIGFzIGxvd2VyCiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm91bmQuICBBIG51bGwgb3IgemVybyBwYXJhbWV0ZXIgaW5kaWNhdGVzIG5vCiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93ZXIgYm91bmQuCiAgICogQHBhcmFtIGludCAkZW5kX3RpbWUgICAgICAgKE9wdGlvbmFsKSBGaWx0ZXIgd2l0aCB0aGlzIFVUQyBhcyB1cHBlciBib3VuZC4KICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBIG51bGwgb3IgemVybyBwYXJhbWV0ZXIgaW5kaWNhdGVzIG5vIHVwcGVyCiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm91bmQuCiAgICogQHBhcmFtIHN0cmluZyAkcnN2cF9zdGF0dXMgKE9wdGlvbmFsKSBPbmx5IHNob3cgZXZlbnRzIHdoZXJlIHRoZSBnaXZlbiB1aWQKICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXMgdGhpcyByc3ZwIHN0YXR1cy4gIFRoaXMgb25seSB3b3JrcyBpZiB5b3UKICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXZlIHNwZWNpZmllZCBhIHZhbHVlIGZvciAkdWlkLiAgVmFsdWVzIGFyZSBhcwogICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIGV2ZW50cy5nZXRNZW1iZXJzLiAgTnVsbCBpbmRpY2F0ZXMgdG8gaWdub3JlCiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgcnN2cCBzdGF0dXMgd2hlbiBmaWx0ZXJpbmcuCiAgICoKICAgKiBAcmV0dXJuIGFycmF5ICBUaGUgZXZlbnRzIG1hdGNoaW5nIHRoZSBxdWVyeS4KICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gJmV2ZW50c19nZXQoJHVpZD1udWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZWlkcz1udWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc3RhcnRfdGltZT1udWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZW5kX3RpbWU9bnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJzdnBfc3RhdHVzPW51bGwpIHsKICAgIHJldHVybiAkdGhpcy0+Y2FsbF9tZXRob2QoJ2ZhY2Vib29rLmV2ZW50cy5nZXQnLAogICAgICAgIGFycmF5KCd1aWQnID0+ICR1aWQsCiAgICAgICAgICAgICAgJ2VpZHMnID0+ICRlaWRzLAogICAgICAgICAgICAgICdzdGFydF90aW1lJyA9PiAkc3RhcnRfdGltZSwKICAgICAgICAgICAgICAnZW5kX3RpbWUnID0+ICRlbmRfdGltZSwKICAgICAgICAgICAgICAncnN2cF9zdGF0dXMnID0+ICRyc3ZwX3N0YXR1cykpOwogIH0KCiAgLyoqCiAgICogUmV0dXJucyBtZW1iZXJzaGlwIGxpc3QgZGF0YSBhc3NvY2lhdGVkIHdpdGggYW4gZXZlbnQuCiAgICoKICAgKiBAcGFyYW0gaW50ICRlaWQgIGV2ZW50IGlkCiAgICoKICAgKiBAcmV0dXJuIGFycmF5ICBBbiBhc3NvYyBhcnJheSBvZiBmb3VyIG1lbWJlcnNoaXAgbGlzdHMsIHdpdGgga2V5cwogICAqICAgICAgICAgICAgICAgICdhdHRlbmRpbmcnLCAndW5zdXJlJywgJ2RlY2xpbmVkJywgYW5kICdub3RfcmVwbGllZCcKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gJmV2ZW50c19nZXRNZW1iZXJzKCRlaWQpIHsKICAgIHJldHVybiAkdGhpcy0+Y2FsbF9tZXRob2QoJ2ZhY2Vib29rLmV2ZW50cy5nZXRNZW1iZXJzJywKICAgICAgYXJyYXkoJ2VpZCcgPT4gJGVpZCkpOwogIH0KCiAgLyoqCiAgICogUlNWUHMgdGhlIGN1cnJlbnQgdXNlciB0byB0aGlzIGV2ZW50LgogICAqCiAgICogQHBhcmFtIGludCAkZWlkICAgICAgICAgICAgIGV2ZW50IGlkCiAgICogQHBhcmFtIHN0cmluZyAkcnN2cF9zdGF0dXMgICdhdHRlbmRpbmcnLCAndW5zdXJlJywgb3IgJ2RlY2xpbmVkJwogICAqCiAgICogQHJldHVybiBib29sICB0cnVlIGlmIHN1Y2Nlc3NmdWwKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gJmV2ZW50c19yc3ZwKCRlaWQsICRyc3ZwX3N0YXR1cykgewogICAgcmV0dXJuICR0aGlzLT5jYWxsX21ldGhvZCgnZmFjZWJvb2suZXZlbnRzLnJzdnAnLAogICAgICAgIGFycmF5KAogICAgICAgICdlaWQnID0+ICRlaWQsCiAgICAgICAgJ3JzdnBfc3RhdHVzJyA9PiAkcnN2cF9zdGF0dXMpKTsKICB9CgogIC8qKgogICAqIENhbmNlbHMgYW4gZXZlbnQuIE9ubHkgd29ya3MgZm9yIGV2ZW50cyB3aGVyZSBhcHBsaWNhdGlvbiBpcyB0aGUgYWRtaW4uCiAgICoKICAgKiBAcGFyYW0gaW50ICRlaWQgICAgICAgICAgICAgICAgZXZlbnQgaWQKICAgKiBAcGFyYW0gc3RyaW5nICRjYW5jZWxfbWVzc2FnZSAgKE9wdGlvbmFsKSBtZXNzYWdlIHRvIHNlbmQgdG8gbWVtYmVycyBvZgogICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZXZlbnQgYWJvdXQgd2h5IGl0IGlzIGNhbmNlbGxlZAogICAqCiAgICogQHJldHVybiBib29sICB0cnVlIGlmIHN1Y2Nlc3NmdWwKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gJmV2ZW50c19jYW5jZWwoJGVpZCwgJGNhbmNlbF9tZXNzYWdlPScnKSB7CiAgICByZXR1cm4gJHRoaXMtPmNhbGxfbWV0aG9kKCdmYWNlYm9vay5ldmVudHMuY2FuY2VsJywKICAgICAgICBhcnJheSgnZWlkJyA9PiAkZWlkLAogICAgICAgICAgICAgICdjYW5jZWxfbWVzc2FnZScgPT4gJGNhbmNlbF9tZXNzYWdlKSk7CiAgfQoKICAvKioKICAgKiBDcmVhdGVzIGFuIGV2ZW50IG9uIGJlaGFsZiBvZiB0aGUgdXNlciBpcyB0aGVyZSBpcyBhIHNlc3Npb24sIG90aGVyd2lzZSBvbgogICAqIGJlaGFsZiBvZiBhcHAuICBTdWNjZXNzZnVsIGNyZWF0aW9uIGd1YXJhbnRlZXMgYXBwIHdpbGwgYmUgYWRtaW4uCiAgICoKICAgKiBAcGFyYW0gYXNzb2MgYXJyYXkgJGV2ZW50X2luZm8gIGpzb24gZW5jb2RlZCBldmVudCBpbmZvcm1hdGlvbgogICAqIEBwYXJhbSBzdHJpbmcgJGZpbGUgICAgICAgICAgICAgKE9wdGlvbmFsKSBmaWxlbmFtZSBvZiBwaWN0dXJlIHRvIHNldAogICAqCiAgICogQHJldHVybiBpbnQgIGV2ZW50IGlkCiAgICovCiAgcHVibGljIGZ1bmN0aW9uIGV2ZW50c19jcmVhdGUoJGV2ZW50X2luZm8sICRmaWxlID0gbnVsbCkgewogICAgaWYgKCRmaWxlKSB7CiAgICAgIHJldHVybiAkdGhpcy0+Y2FsbF91cGxvYWRfbWV0aG9kKCdmYWNlYm9vay5ldmVudHMuY3JlYXRlJywKICAgICAgICBhcnJheSgnZXZlbnRfaW5mbycgPT4gJGV2ZW50X2luZm8pLAogICAgICAgICRmaWxlLAogICAgICAgICR0aGlzLT5waG90b19zZXJ2ZXJfYWRkcik7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPmNhbGxfbWV0aG9kKCdmYWNlYm9vay5ldmVudHMuY3JlYXRlJywKICAgICAgICBhcnJheSgnZXZlbnRfaW5mbycgPT4gJGV2ZW50X2luZm8pKTsKICAgIH0KICB9CgogIC8qKgogICAqIEVkaXRzIGFuIGV4aXN0aW5nIGV2ZW50LiBPbmx5IHdvcmtzIGZvciBldmVudHMgd2hlcmUgYXBwbGljYXRpb24gaXMgYWRtaW4uCiAgICoKICAgKiBAcGFyYW0gaW50ICRlaWQgICAgICAgICAgICAgICAgIGV2ZW50IGlkCiAgICogQHBhcmFtIGFzc29jIGFycmF5ICRldmVudF9pbmZvICBqc29uIGVuY29kZWQgZXZlbnQgaW5mb3JtYXRpb24KICAgKiBAcGFyYW0gc3RyaW5nICRmaWxlICAgICAgICAgICAgIChPcHRpb25hbCkgZmlsZW5hbWUgb2YgbmV3IHBpY3R1cmUgdG8gc2V0CiAgICoKICAgKiBAcmV0dXJuIGJvb2wgIHRydWUgaWYgc3VjY2Vzc2Z1bAogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBldmVudHNfZWRpdCgkZWlkLCAkZXZlbnRfaW5mbywgJGZpbGUgPSBudWxsKSB7CiAgICBpZiAoJGZpbGUpIHsKICAgICAgcmV0dXJuICR0aGlzLT5jYWxsX3VwbG9hZF9tZXRob2QoJ2ZhY2Vib29rLmV2ZW50cy5lZGl0JywKICAgICAgICBhcnJheSgnZWlkJyA9PiAkZWlkLCAnZXZlbnRfaW5mbycgPT4gJGV2ZW50X2luZm8pLAogICAgICAgICRmaWxlLAogICAgICAgICR0aGlzLT5waG90b19zZXJ2ZXJfYWRkcik7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPmNhbGxfbWV0aG9kKCdmYWNlYm9vay5ldmVudHMuZWRpdCcsCiAgICAgICAgYXJyYXkoJ2VpZCcgPT4gJGVpZCwKICAgICAgICAnZXZlbnRfaW5mbycgPT4gJGV2ZW50X2luZm8pKTsKICAgIH0KICB9CgogIC8qKgogICAqIEZldGNoZXMgYW5kIHJlLWNhY2hlcyB0aGUgaW1hZ2Ugc3RvcmVkIGF0IHRoZSBnaXZlbiBVUkwsIGZvciB1c2UgaW4gaW1hZ2VzCiAgICogcHVibGlzaGVkIHRvIG5vbi1jYW52YXMgcGFnZXMgdmlhIHRoZSBBUEkgKGZvciBleGFtcGxlLCB0byB1c2VyIHByb2ZpbGVzCiAgICogdmlhIHByb2ZpbGUuc2V0RkJNTCwgb3IgdG8gTmV3cyBGZWVkIHZpYSBmZWVkLnB1Ymxpc2hVc2VyQWN0aW9uKS4KICAgKgogICAqIEBwYXJhbSBzdHJpbmcgJHVybCAgVGhlIGFic29sdXRlIFVSTCBmcm9tIHdoaWNoIHRvIHJlZnJlc2ggdGhlIGltYWdlLgogICAqCiAgICogQHJldHVybiBib29sICB0cnVlIG9uIHN1Y2Nlc3MKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gJmZibWxfcmVmcmVzaEltZ1NyYygkdXJsKSB7CiAgICByZXR1cm4gJHRoaXMtPmNhbGxfbWV0aG9kKCdmYWNlYm9vay5mYm1sLnJlZnJlc2hJbWdTcmMnLAogICAgICAgIGFycmF5KCd1cmwnID0+ICR1cmwpKTsKICB9CgogIC8qKgogICAqIEZldGNoZXMgYW5kIHJlLWNhY2hlcyB0aGUgY29udGVudCBzdG9yZWQgYXQgdGhlIGdpdmVuIFVSTCwgZm9yIHVzZSBpbiBhbgogICAqIGZiOnJlZiBGQk1MIHRhZy4KICAgKgogICAqIEBwYXJhbSBzdHJpbmcgJHVybCAgVGhlIGFic29sdXRlIFVSTCBmcm9tIHdoaWNoIHRvIGZldGNoIGNvbnRlbnQuIFRoaXMgVVJMCiAgICogICAgICAgICAgICAgICAgICAgICBzaG91bGQgYmUgdXNlZCBpbiBhIGZiOnJlZiBGQk1MIHRhZy4KICAgKgogICAqIEByZXR1cm4gYm9vbCAgdHJ1ZSBvbiBzdWNjZXNzCiAgICovCiAgcHVibGljIGZ1bmN0aW9uICZmYm1sX3JlZnJlc2hSZWZVcmwoJHVybCkgewogICAgcmV0dXJuICR0aGlzLT5jYWxsX21ldGhvZCgnZmFjZWJvb2suZmJtbC5yZWZyZXNoUmVmVXJsJywKICAgICAgICBhcnJheSgndXJsJyA9PiAkdXJsKSk7CiAgfQoKICAvKioKICAgKiBMZXRzIHlvdSBpbnNlcnQgdGV4dCBzdHJpbmdzIGluIHRoZWlyIG5hdGl2ZSBsYW5ndWFnZSBpbnRvIHRoZSBGYWNlYm9vawogICAqIFRyYW5zbGF0aW9ucyBkYXRhYmFzZSBzbyB0aGV5IGNhbiBiZSB0cmFuc2xhdGVkLgogICAqCiAgICogQHBhcmFtIGFycmF5ICRuYXRpdmVfc3RyaW5ncyAgQW4gYXJyYXkgb2YgbWFwcywgd2hlcmUgZWFjaCBtYXAgaGFzIGEgJ3RleHQnCiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQgYW5kIGEgJ2Rlc2NyaXB0aW9uJyBmaWVsZC4KICAgKgogICAqIEByZXR1cm4gaW50ICBOdW1iZXIgb2Ygc3RyaW5ncyB1cGxvYWRlZC4KICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gJmZibWxfdXBsb2FkTmF0aXZlU3RyaW5ncygkbmF0aXZlX3N0cmluZ3MpIHsKICAgIHJldHVybiAkdGhpcy0+Y2FsbF9tZXRob2QoJ2ZhY2Vib29rLmZibWwudXBsb2FkTmF0aXZlU3RyaW5ncycsCiAgICAgICAgYXJyYXkoJ25hdGl2ZV9zdHJpbmdzJyA9PiBqc29uX2VuY29kZSgkbmF0aXZlX3N0cmluZ3MpKSk7CiAgfQoKICAvKioKICAgKiBBc3NvY2lhdGVzIGEgZ2l2ZW4gImhhbmRsZSIgd2l0aCBGQk1MIG1hcmt1cCBzbyB0aGF0IHRoZSBoYW5kbGUgY2FuIGJlCiAgICogdXNlZCB3aXRoaW4gdGhlIGZiOnJlZiBGQk1MIHRhZy4gQSBoYW5kbGUgaXMgdW5pcXVlIHdpdGhpbiBhbiBhcHBsaWNhdGlvbgogICAqIGFuZCBhbGxvd3MgYW4gYXBwbGljYXRpb24gdG8gcHVibGlzaCBpZGVudGljYWwgRkJNTCB0byBtYW55IHVzZXIgcHJvZmlsZXMKICAgKiBhbmQgZG8gc3Vic2VxdWVudCB1cGRhdGVzIHdpdGhvdXQgaGF2aW5nIHRvIHJlcHVibGlzaCBGQk1MIG9uIGJlaGFsZiBvZgogICAqIGVhY2ggdXNlci4KICAgKgogICAqIEBwYXJhbSBzdHJpbmcgJGhhbmRsZSAgVGhlIGhhbmRsZSB0byBhc3NvY2lhdGUgd2l0aCB0aGUgZ2l2ZW4gRkJNTC4KICAgKiBAcGFyYW0gc3RyaW5nICRmYm1sICAgIFRoZSBGQk1MIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBnaXZlbiBoYW5kbGUuCiAgICoKICAgKiBAcmV0dXJuIGJvb2wgIHRydWUgb24gc3VjY2VzcwogICAqLwogIHB1YmxpYyBmdW5jdGlvbiAmZmJtbF9zZXRSZWZIYW5kbGUoJGhhbmRsZSwgJGZibWwpIHsKICAgIHJldHVybiAkdGhpcy0+Y2FsbF9tZXRob2QoJ2ZhY2Vib29rLmZibWwuc2V0UmVmSGFuZGxlJywKICAgICAgICBhcnJheSgnaGFuZGxlJyA9PiAkaGFuZGxlLCAnZmJtbCcgPT4gJGZibWwpKTsKICB9CgogIC8qKgogICAqIFJlZ2lzdGVyIGN1c3RvbSB0YWdzIGZvciB0aGUgYXBwbGljYXRpb24uIEN1c3RvbSB0YWdzIGNhbiBiZSB1c2VkCiAgICogdG8gZXh0ZW5kIHRoZSBzZXQgb2YgdGFncyBhdmFpbGFibGUgdG8gYXBwbGljYXRpb25zIGluIEZCTUwKICAgKiBtYXJrdXAuCiAgICoKICAgKiBCZWZvcmUgeW91IGNhbGwgdGhpcyBmdW5jdGlvbiwKICAgKiBtYWtlIHN1cmUgeW91IHJlYWQgdGhlIGZ1bGwgZG9jdW1lbnRhdGlvbiBhdAogICAqCiAgICogaHR0cDovL3dpa2kuZGV2ZWxvcGVycy5mYWNlYm9vay5jb20vaW5kZXgucGhwL0ZibWwuUmVnaXN0ZXJDdXN0b21UYWdzCiAgICoKICAgKiBJTVBPUlRBTlQ6IFRoaXMgZnVuY3Rpb24gb3ZlcndyaXRlcyB0aGUgdmFsdWVzIG9mCiAgICogZXhpc3RpbmcgdGFncyBpZiB0aGUgbmFtZXMgbWF0Y2guIFVzZSB0aGlzIGZ1bmN0aW9uIHdpdGggY2FyZSBiZWNhdXNlCiAgICogaXQgbWF5IGJyZWFrIHRoZSBGQk1MIG9mIGFueSBhcHBsaWNhdGlvbiB0aGF0IGlzIHVzaW5nIHRoZQogICAqIGV4aXN0aW5nIHZlcnNpb24gb2YgdGhlIHRhZ3MuCiAgICoKICAgKiBAcGFyYW0gbWl4ZWQgJHRhZ3MgYW4gYXJyYXkgb2YgdGFnIG9iamVjdHMgKHRoZSBmdWxsIGRlc2NyaXB0aW9uIGlzIG9uIHRoZQogICAqICAgd2lraSBwYWdlKQogICAqCiAgICogQHJldHVybiBpbnQgIHRoZSBudW1iZXIgb2YgdGFncyB0aGF0IHdlcmUgcmVnaXN0ZXJlZAogICAqLwogIHB1YmxpYyBmdW5jdGlvbiAmZmJtbF9yZWdpc3RlckN1c3RvbVRhZ3MoJHRhZ3MpIHsKICAgICR0YWdzID0ganNvbl9lbmNvZGUoJHRhZ3MpOwogICAgcmV0dXJuICR0aGlzLT5jYWxsX21ldGhvZCgnZmFjZWJvb2suZmJtbC5yZWdpc3RlckN1c3RvbVRhZ3MnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheSgndGFncycgPT4gJHRhZ3MpKTsKICB9CgogIC8qKgogICAqIEdldCB0aGUgY3VzdG9tIHRhZ3MgZm9yIGFuIGFwcGxpY2F0aW9uLiBJZiAkYXBwX2lkCiAgICogaXMgbm90IHNwZWNpZmllZCwgdGhlIGNhbGxpbmcgYXBwJ3MgdGFncyBhcmUgcmV0dXJuZWQuCiAgICogSWYgJGFwcF9pZCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgaWQgb2YgdGhlIGNhbGxpbmcgYXBwLAogICAqIG9ubHkgdGhlIGFwcCdzIHB1YmxpYyB0YWdzIGFyZSByZXR1cm5lZC4KICAgKiBUaGUgcmV0dXJuIHZhbHVlIGlzIGFuIGFycmF5IG9mIHRoZSBzYW1lIHR5cGUgYXMKICAgKiB0aGUgJHRhZ3MgcGFyYW1ldGVyIG9mIGZibWxfcmVnaXN0ZXJDdXN0b21UYWdzKCkuCiAgICoKICAgKiBAcGFyYW0gaW50ICRhcHBfaWQgdGhlIGFwcGxpY2F0aW9uJ3MgaWQgKG9wdGlvbmFsKQogICAqCiAgICogQHJldHVybiBtaXhlZCAgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgY3VzdG9tIHRhZyAgb2JqZWN0cwogICAqLwogIHB1YmxpYyBmdW5jdGlvbiAmZmJtbF9nZXRDdXN0b21UYWdzKCRhcHBfaWQgPSBudWxsKSB7CiAgICByZXR1cm4gJHRoaXMtPmNhbGxfbWV0aG9kKCdmYWNlYm9vay5mYm1sLmdldEN1c3RvbVRhZ3MnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheSgnYXBwX2lkJyA9PiAkYXBwX2lkKSk7CiAgfQoKCiAgLyoqCiAgICogRGVsZXRlIGN1c3RvbSB0YWdzIHRoZSBhcHBsaWNhdGlvbiBoYXMgcmVnaXN0ZXJlZC4gSWYKICAgKiAkdGFnX25hbWVzIGlzIG51bGwsIGFsbCB0aGUgYXBwbGljYXRpb24ncyBjdXN0b20gdGFncyB3aWxsIGJlCiAgICogZGVsZXRlZC4KICAgKgogICAqIElNUE9SVEFOVDogSWYgeW91ciBhcHBsaWNhdGlvbiBoYXMgcmVnaXN0ZXJlZCBwdWJsaWMgdGFncwogICAqIHRoYXQgb3RoZXIgYXBwbGljYXRpb25zIG1heSBiZSB1c2luZywgZG9uJ3QgZGVsZXRlIHRob3NlIHRhZ3MhCiAgICogRG9pbmcgc28gY2FuIGJyZWFrIHRoZSBGQk1MIG9mYXBwbGljYXRpb25zIHRoYXQgYXJlIHVzaW5nIHRoZW0uCiAgICoKICAgKiBAcGFyYW0gYXJyYXkgJHRhZ19uYW1lcyB0aGUgbmFtZXMgb2YgdGhlIHRhZ3MgdG8gZGVsZXRlIChvcHRpbmFsKQogICAqIEByZXR1cm4gYm9vbCB0cnVlIG9uIHN1Y2Nlc3MKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gJmZibWxfZGVsZXRlQ3VzdG9tVGFncygkdGFnX25hbWVzID0gbnVsbCkgewogICAgcmV0dXJuICR0aGlzLT5jYWxsX21ldGhvZCgnZmFjZWJvb2suZmJtbC5kZWxldGVDdXN0b21UYWdzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkoJ3RhZ19uYW1lcycgPT4ganNvbl9lbmNvZGUoJHRhZ19uYW1lcykpKTsKICB9CgogIC8qKgogICAqIEdldHMgdGhlIGJlc3QgdHJhbnNsYXRpb25zIGZvciBuYXRpdmUgc3RyaW5ncyBzdWJtaXR0ZWQgYnkgYW4gYXBwbGljYXRpb24KICAgKiBmb3IgdHJhbnNsYXRpb24uIElmICRsb2NhbGUgaXMgbm90IHNwZWNpZmllZCwgb25seSBuYXRpdmUgc3RyaW5ncyBhbmQgdGhlaXIKICAgKiBkZXNjcmlwdGlvbnMgYXJlIHJldHVybmVkLiBJZiAkYWxsIGlzIHRydWUsIHRoZW4gdW5hcHByb3ZlZCB0cmFuc2xhdGlvbnMKICAgKiBhcmUgcmV0dXJuZWQgYXMgd2VsbCwgb3RoZXJ3aXNlIG9ubHkgYXBwcm92ZWQgdHJhbnNsYXRpb25zIGFyZSByZXR1cm5lZC4KICAgKgogICAqIEEgbWFwcGluZyBvZiBsb2NhbGUgY29kZXMgLT4gbGFuZ3VhZ2UgbmFtZXMgaXMgYXZhaWxhYmxlIGF0CiAgICogaHR0cDovL3dpa2kuZGV2ZWxvcGVycy5mYWNlYm9vay5jb20vaW5kZXgucGhwL0ZhY2Vib29rX0xvY2FsZXMKICAgKgogICAqIEBwYXJhbSBzdHJpbmcgJGxvY2FsZSB0aGUgbG9jYWxlIHRvIGdldCB0cmFuc2xhdGlvbnMgZm9yLCBvciAnYWxsJyBmb3IgYWxsCiAgICogICAgICAgICAgICAgICAgICAgICAgIGxvY2FsZXMsIG9yICdlbl9VUycgZm9yIG5hdGl2ZSBzdHJpbmdzCiAgICogQHBhcmFtIGJvb2wgICAkYWxsICAgIHdoZXRoZXIgdG8gcmV0dXJuIGFsbCBvciBvbmx5IGFwcHJvdmVkIHRyYW5zbGF0aW9ucwogICAqCiAgICogQHJldHVybiBhcnJheSAobG9jYWxlLCBhcnJheShuYXRpdmVfc3RyaW5ncywgYXJyYXkoJ2Jlc3QgdHJhbnNsYXRpb24KICAgKiAgICAgICAgICAgICAgICBhdmFpbGFibGUgZ2l2ZW4gZW5vdWdoIHZvdGVzIG9yIG1hbnVhbCBhcHByb3ZhbCcsIGFwcHJvdmFsCiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMpKSkKICAgKiBAZXJyb3IgQVBJX0VDX1BBUkFNCiAgICogQGVycm9yIEFQSV9FQ19QQVJBTV9CQURfTE9DQUxFCiAgICovCiAgcHVibGljIGZ1bmN0aW9uICZpbnRsX2dldFRyYW5zbGF0aW9ucygkbG9jYWxlID0gJ2VuX1VTJywgJGFsbCA9IGZhbHNlKSB7CiAgICByZXR1cm4gJHRoaXMtPmNhbGxfbWV0aG9kKCdmYWNlYm9vay5pbnRsLmdldFRyYW5zbGF0aW9ucycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5KCdsb2NhbGUnID0+ICRsb2NhbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhbGwnICAgID0+ICRhbGwpKTsKICB9CgoKICAvKioKICAgKiBUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkIGZvciBjYWxscyBtYWRlIG9uIGJlaGFsZiBvZiB1c2Vycy4gVGhpcyBtZXRob2QKICAgKiB3b3JrcyBvbmx5IGZvciBwdWJsaXNoaW5nIHN0b3JpZXMgb24gYSBGYWNlYm9vayBQYWdlIHRoYXQgaGFzIGluc3RhbGxlZAogICAqIHlvdXIgYXBwbGljYXRpb24uIFRvIHB1Ymxpc2ggc3RvcmllcyB0byBhIHVzZXIncyBwcm9maWxlLCB1c2UKICAgKiBmZWVkLnB1Ymxpc2hVc2VyQWN0aW9uIGluc3RlYWQuCiAgICoKICAgKiBGb3IgbW9yZSBkZXRhaWxzIG9uIHRoaXMgY2FsbCwgcGxlYXNlIHZpc2l0IHRoZSB3aWtpIHBhZ2U6CiAgICoKICAgKiBodHRwOi8vd2lraS5kZXZlbG9wZXJzLmZhY2Vib29rLmNvbS9pbmRleC5waHAvRmVlZC5wdWJsaXNoVGVtcGxhdGl6ZWRBY3Rpb24KICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gJmZlZWRfcHVibGlzaFRlbXBsYXRpemVkQWN0aW9uKCR0aXRsZV90ZW1wbGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aXRsZV9kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGJvZHlfdGVtcGxhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYm9keV9kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGJvZHlfZ2VuZXJhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpbWFnZV8xPW51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaW1hZ2VfMV9saW5rPW51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaW1hZ2VfMj1udWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGltYWdlXzJfbGluaz1udWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGltYWdlXzM9bnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpbWFnZV8zX2xpbms9bnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpbWFnZV80PW51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaW1hZ2VfNF9saW5rPW51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0X2lkcz0nJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwYWdlX2FjdG9yX2lkPW51bGwpIHsKICAgIHJldHVybiAkdGhpcy0+Y2FsbF9tZXRob2QoJ2ZhY2Vib29rLmZlZWQucHVibGlzaFRlbXBsYXRpemVkQWN0aW9uJywKICAgICAgYXJyYXkoJ3RpdGxlX3RlbXBsYXRlJyA9PiAkdGl0bGVfdGVtcGxhdGUsCiAgICAgICAgICAgICd0aXRsZV9kYXRhJyA9PiAkdGl0bGVfZGF0YSwKICAgICAgICAgICAgJ2JvZHlfdGVtcGxhdGUnID0+ICRib2R5X3RlbXBsYXRlLAogICAgICAgICAgICAnYm9keV9kYXRhJyA9PiAkYm9keV9kYXRhLAogICAgICAgICAgICAnYm9keV9nZW5lcmFsJyA9PiAkYm9keV9nZW5lcmFsLAogICAgICAgICAgICAnaW1hZ2VfMScgPT4gJGltYWdlXzEsCiAgICAgICAgICAgICdpbWFnZV8xX2xpbmsnID0+ICRpbWFnZV8xX2xpbmssCiAgICAgICAgICAgICdpbWFnZV8yJyA9PiAkaW1hZ2VfMiwKICAgICAgICAgICAgJ2ltYWdlXzJfbGluaycgPT4gJGltYWdlXzJfbGluaywKICAgICAgICAgICAgJ2ltYWdlXzMnID0+ICRpbWFnZV8zLAogICAgICAgICAgICAnaW1hZ2VfM19saW5rJyA9PiAkaW1hZ2VfM19saW5rLAogICAgICAgICAgICAnaW1hZ2VfNCcgPT4gJGltYWdlXzQsCiAgICAgICAgICAgICdpbWFnZV80X2xpbmsnID0+ICRpbWFnZV80X2xpbmssCiAgICAgICAgICAgICd0YXJnZXRfaWRzJyA9PiAkdGFyZ2V0X2lkcywKICAgICAgICAgICAgJ3BhZ2VfYWN0b3JfaWQnID0+ICRwYWdlX2FjdG9yX2lkKSk7CiAgfQoKICAvKioKICAgKiBSZWdpc3RlcnMgYSB0ZW1wbGF0ZSBidW5kbGUuICBUZW1wbGF0ZSBidW5kbGVzIGFyZSBzb21ld2hhdCBpbnZvbHZlZCwgc28KICAgKiBpdCdzIHJlY29tbWVuZGVkIHlvdSBjaGVjayBvdXQgdGhlIHdpa2kgZm9yIG1vcmUgZGV0YWlsczoKICAgKgogICAqICBodHRwOi8vd2lraS5kZXZlbG9wZXJzLmZhY2Vib29rLmNvbS9pbmRleC5waHAvRmVlZC5yZWdpc3RlclRlbXBsYXRlQnVuZGxlCiAgICoKICAgKiBAcmV0dXJuIHN0cmluZyAgQSB0ZW1wbGF0ZSBidW5kbGUgaWQKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gJmZlZWRfcmVnaXN0ZXJUZW1wbGF0ZUJ1bmRsZSgkb25lX2xpbmVfc3RvcnlfdGVtcGxhdGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzaG9ydF9zdG9yeV90ZW1wbGF0ZXMgPSBhcnJheSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmdWxsX3N0b3J5X3RlbXBsYXRlID0gbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYWN0aW9uX2xpbmtzID0gYXJyYXkoKSkgewoKICAgICRvbmVfbGluZV9zdG9yeV90ZW1wbGF0ZXMgPSBqc29uX2VuY29kZSgkb25lX2xpbmVfc3RvcnlfdGVtcGxhdGVzKTsKCiAgICBpZiAoIWVtcHR5KCRzaG9ydF9zdG9yeV90ZW1wbGF0ZXMpKSB7CiAgICAgICRzaG9ydF9zdG9yeV90ZW1wbGF0ZXMgPSBqc29uX2VuY29kZSgkc2hvcnRfc3RvcnlfdGVtcGxhdGVzKTsKICAgIH0KCiAgICBpZiAoaXNzZXQoJGZ1bGxfc3RvcnlfdGVtcGxhdGUpKSB7CiAgICAgICRmdWxsX3N0b3J5X3RlbXBsYXRlID0ganNvbl9lbmNvZGUoJGZ1bGxfc3RvcnlfdGVtcGxhdGUpOwogICAgfQoKICAgIGlmIChpc3NldCgkYWN0aW9uX2xpbmtzKSkgewogICAgICAkYWN0aW9uX2xpbmtzID0ganNvbl9lbmNvZGUoJGFjdGlvbl9saW5rcyk7CiAgICB9CgogICAgcmV0dXJuICR0aGlzLT5jYWxsX21ldGhvZCgnZmFjZWJvb2suZmVlZC5yZWdpc3RlclRlbXBsYXRlQnVuZGxlJywKICAgICAgICBhcnJheSgnb25lX2xpbmVfc3RvcnlfdGVtcGxhdGVzJyA9PiAkb25lX2xpbmVfc3RvcnlfdGVtcGxhdGVzLAogICAgICAgICAgICAgICdzaG9ydF9zdG9yeV90ZW1wbGF0ZXMnID0+ICRzaG9ydF9zdG9yeV90ZW1wbGF0ZXMsCiAgICAgICAgICAgICAgJ2Z1bGxfc3RvcnlfdGVtcGxhdGUnID0+ICRmdWxsX3N0b3J5X3RlbXBsYXRlLAogICAgICAgICAgICAgICdhY3Rpb25fbGlua3MnID0+ICRhY3Rpb25fbGlua3MpKTsKICB9CgogIC8qKgogICAqIFJldHJpZXZlcyB0aGUgZnVsbCBsaXN0IG9mIGFjdGl2ZSB0ZW1wbGF0ZSBidW5kbGVzIHJlZ2lzdGVyZWQgYnkgdGhlCiAgICogcmVxdWVzdGluZyBhcHBsaWNhdGlvbi4KICAgKgogICAqIEByZXR1cm4gYXJyYXkgIEFuIGFycmF5IG9mIHRlbXBsYXRlIGJ1bmRsZXMKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gJmZlZWRfZ2V0UmVnaXN0ZXJlZFRlbXBsYXRlQnVuZGxlcygpIHsKICAgIHJldHVybiAkdGhpcy0+Y2FsbF9tZXRob2QoJ2ZhY2Vib29rLmZlZWQuZ2V0UmVnaXN0ZXJlZFRlbXBsYXRlQnVuZGxlcycsCiAgICAgICAgYXJyYXkoKSk7CiAgfQoKICAvKioKICAgKiBSZXRyaWV2ZXMgaW5mb3JtYXRpb24gYWJvdXQgYSBzcGVjaWZpZWQgdGVtcGxhdGUgYnVuZGxlIHByZXZpb3VzbHkKICAgKiByZWdpc3RlcmVkIGJ5IHRoZSByZXF1ZXN0aW5nIGFwcGxpY2F0aW9uLgogICAqCiAgICogQHBhcmFtIHN0cmluZyAkdGVtcGxhdGVfYnVuZGxlX2lkICBUaGUgdGVtcGxhdGUgYnVuZGxlIGlkCiAgICoKICAgKiBAcmV0dXJuIGFycmF5ICBUZW1wbGF0ZSBidW5kbGUKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gJmZlZWRfZ2V0UmVnaXN0ZXJlZFRlbXBsYXRlQnVuZGxlQnlJRCgkdGVtcGxhdGVfYnVuZGxlX2lkKSB7CiAgICByZXR1cm4gJHRoaXMtPmNhbGxfbWV0aG9kKCdmYWNlYm9vay5mZWVkLmdldFJlZ2lzdGVyZWRUZW1wbGF0ZUJ1bmRsZUJ5SUQnLAogICAgICAgIGFycmF5KCd0ZW1wbGF0ZV9idW5kbGVfaWQnID0+ICR0ZW1wbGF0ZV9idW5kbGVfaWQpKTsKICB9CgogIC8qKgogICAqIERlYWN0aXZhdGVzIGEgcHJldmlvdXNseSByZWdpc3RlcmVkIHRlbXBsYXRlIGJ1bmRsZS4KICAgKgogICAqIEBwYXJhbSBzdHJpbmcgJHRlbXBsYXRlX2J1bmRsZV9pZCAgVGhlIHRlbXBsYXRlIGJ1bmRsZSBpZAogICAqCiAgICogQHJldHVybiBib29sICB0cnVlIG9uIHN1Y2Nlc3MKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gJmZlZWRfZGVhY3RpdmF0ZVRlbXBsYXRlQnVuZGxlQnlJRCgkdGVtcGxhdGVfYnVuZGxlX2lkKSB7CiAgICByZXR1cm4gJHRoaXMtPmNhbGxfbWV0aG9kKCdmYWNlYm9vay5mZWVkLmRlYWN0aXZhdGVUZW1wbGF0ZUJ1bmRsZUJ5SUQnLAogICAgICAgIGFycmF5KCd0ZW1wbGF0ZV9idW5kbGVfaWQnID0+ICR0ZW1wbGF0ZV9idW5kbGVfaWQpKTsKICB9CgogIGNvbnN0IFNUT1JZX1NJWkVfT05FX0xJTkUgPSAxOwogIGNvbnN0IFNUT1JZX1NJWkVfU0hPUlQgPSAyOwogIGNvbnN0IFNUT1JZX1NJWkVfRlVMTCA9IDQ7CgogIC8qKgogICAqIFB1Ymxpc2hlcyBhIHN0b3J5IG9uIGJlaGFsZiBvZiB0aGUgdXNlciBvd25pbmcgdGhlIHNlc3Npb24sIHVzaW5nIHRoZQogICAqIHNwZWNpZmllZCB0ZW1wbGF0ZSBidW5kbGUuIFRoaXMgbWV0aG9kIHJlcXVpcmVzIGFuIGFjdGl2ZSBzZXNzaW9uIGtleSBpbgogICAqIG9yZGVyIHRvIGJlIGNhbGxlZC4KICAgKgogICAqIFRoZSBwYXJhbWV0ZXJzIHRvIHRoaXMgbWV0aG9kICgkdGVtcGxhdGFfZGF0YSBpbiBwYXJ0aWN1bGFyKSBhcmUgc29tZXdoYXQKICAgKiBpbnZvbHZlZC4gIEl0J3MgcmVjb21tZW5kZWQgeW91IHZpc2l0IHRoZSB3aWtpIGZvciBkZXRhaWxzOgogICAqCiAgICogIGh0dHA6Ly93aWtpLmRldmVsb3BlcnMuZmFjZWJvb2suY29tL2luZGV4LnBocC9GZWVkLnB1Ymxpc2hVc2VyQWN0aW9uCiAgICoKICAgKiBAcGFyYW0gaW50ICR0ZW1wbGF0ZV9idW5kbGVfaWQgIEEgdGVtcGxhdGUgYnVuZGxlIGlkIHByZXZpb3VzbHkgcmVnaXN0ZXJlZAogICAqIEBwYXJhbSBhcnJheSAkdGVtcGxhdGVfZGF0YSAgICAgU2VlIHdpa2kgYXJ0aWNsZSBmb3Igc3ludGF4CiAgICogQHBhcmFtIGFycmF5ICR0YXJnZXRfaWRzICAgICAgICAoT3B0aW9uYWwpIEFuIGFycmF5IG9mIGZyaWVuZCB1aWRzIG9mIHRoZQogICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlciB3aG8gc2hhcmVkIGluIHRoaXMgYWN0aW9uLgogICAqIEBwYXJhbSBzdHJpbmcgJGJvZHlfZ2VuZXJhbCAgICAgKE9wdGlvbmFsKSBBZGRpdGlvbmFsIG1hcmt1cCB0aGF0IGV4dGVuZHMKICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBib2R5IG9mIGEgc2hvcnQgc3RvcnkuCiAgICogQHBhcmFtIGludCAkc3Rvcnlfc2l6ZSAgICAgICAgICAoT3B0aW9uYWwpIEEgc3Rvcnkgc2l6ZSAoc2VlIGFib3ZlKQogICAqIEBwYXJhbSBzdHJpbmcgJHVzZXJfbWVzc2FnZSAgICAgKE9wdGlvbmFsKSBBIHVzZXIgbWVzc2FnZSBmb3IgYSBzaG9ydAogICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcnkuCiAgICoKICAgKiBAcmV0dXJuIGJvb2wgIHRydWUgb24gc3VjY2VzcwogICAqLwogIHB1YmxpYyBmdW5jdGlvbiAmZmVlZF9wdWJsaXNoVXNlckFjdGlvbigKICAgICAgJHRlbXBsYXRlX2J1bmRsZV9pZCwgJHRlbXBsYXRlX2RhdGEsICR0YXJnZXRfaWRzPScnLCAkYm9keV9nZW5lcmFsPScnLAogICAgICAkc3Rvcnlfc2l6ZT1GYWNlYm9va1Jlc3RDbGllbnQ6OlNUT1JZX1NJWkVfT05FX0xJTkUsCiAgICAgICR1c2VyX21lc3NhZ2U9JycpIHsKCiAgICBpZiAoaXNfYXJyYXkoJHRlbXBsYXRlX2RhdGEpKSB7CiAgICAgICR0ZW1wbGF0ZV9kYXRhID0ganNvbl9lbmNvZGUoJHRlbXBsYXRlX2RhdGEpOwogICAgfSAvLyBhbGxvdyBjbGllbnQgdG8gZWl0aGVyIHBhc3MgaW4gSlNPTiBvciBhbiBhc3NvYyB0aGF0IHdlIEpTT04gZm9yIHRoZW0KCiAgICBpZiAoaXNfYXJyYXkoJHRhcmdldF9pZHMpKSB7CiAgICAgICR0YXJnZXRfaWRzID0ganNvbl9lbmNvZGUoJHRhcmdldF9pZHMpOwogICAgICAkdGFyZ2V0X2lkcyA9IHRyaW0oJHRhcmdldF9pZHMsICJbXSIpOyAvLyB3ZSBkb24ndCB3YW50IHNxdWFyZSBicmFja2V0cwogICAgfQoKICAgIHJldHVybiAkdGhpcy0+Y2FsbF9tZXRob2QoJ2ZhY2Vib29rLmZlZWQucHVibGlzaFVzZXJBY3Rpb24nLAogICAgICAgIGFycmF5KCd0ZW1wbGF0ZV9idW5kbGVfaWQnID0+ICR0ZW1wbGF0ZV9idW5kbGVfaWQsCiAgICAgICAgICAgICAgJ3RlbXBsYXRlX2RhdGEnID0+ICR0ZW1wbGF0ZV9kYXRhLAogICAgICAgICAgICAgICd0YXJnZXRfaWRzJyA9PiAkdGFyZ2V0X2lkcywKICAgICAgICAgICAgICAnYm9keV9nZW5lcmFsJyA9PiAkYm9keV9nZW5lcmFsLAogICAgICAgICAgICAgICdzdG9yeV9zaXplJyA9PiAkc3Rvcnlfc2l6ZSwKICAgICAgICAgICAgICAndXNlcl9tZXNzYWdlJyA9PiAkdXNlcl9tZXNzYWdlKSk7CiAgfQoKCiAgLyoqCiAgICogUHVibGlzaCBhIHBvc3QgdG8gdGhlIHVzZXIncyBzdHJlYW0uCiAgICoKICAgKiBAcGFyYW0gJG1lc3NhZ2UgICAgICAgIHRoZSB1c2VyJ3MgbWVzc2FnZQogICAqIEBwYXJhbSAkYXR0YWNobWVudCAgICAgdGhlIHBvc3QncyBhdHRhY2htZW50IChvcHRpb25hbCkKICAgKiBAcGFyYW0gJGFjdGlvbiBsaW5rcyAgIHRoZSBwb3N0J3MgYWN0aW9uIGxpbmtzIChvcHRpb25hbCkKICAgKiBAcGFyYW0gJHRhcmdldF9pZCAgICAgIHRoZSB1c2VyIG9uIHdob3NlIHdhbGwgdGhlIHBvc3Qgd2lsbCBiZSBwb3N0ZWQKICAgKiAgICAgICAgICAgICAgICAgICAgICAgIChvcHRpb25hbCkKICAgKiBAcGFyYW0gJHVpZCAgICAgICAgICAgIHRoZSBhY3RvciAoZGVmYXVsdHMgdG8gc2Vzc2lvbiB1c2VyKQogICAqIEByZXR1cm4gc3RyaW5nIHRoZSBwb3N0IGlkCiAgICovCiAgcHVibGljIGZ1bmN0aW9uIHN0cmVhbV9wdWJsaXNoKAogICAgJG1lc3NhZ2UsICRhdHRhY2htZW50ID0gbnVsbCwgJGFjdGlvbl9saW5rcyA9IG51bGwsICR0YXJnZXRfaWQgPSBudWxsLAogICAgJHVpZCA9IG51bGwpIHsKCiAgICByZXR1cm4gJHRoaXMtPmNhbGxfbWV0aG9kKAogICAgICAnZmFjZWJvb2suc3RyZWFtLnB1Ymxpc2gnLAogICAgICBhcnJheSgnbWVzc2FnZScgPT4gJG1lc3NhZ2UsCiAgICAgICAgICAgICdhdHRhY2htZW50JyA9PiAkYXR0YWNobWVudCwKICAgICAgICAgICAgJ2FjdGlvbl9saW5rcycgPT4gJGFjdGlvbl9saW5rcywKICAgICAgICAgICAgJ3RhcmdldF9pZCcgPT4gJHRhcmdldF9pZCwKICAgICAgICAgICAgJ3VpZCcgPT4gJHRoaXMtPmdldF91aWQoJHVpZCkpKTsKICB9CgogIC8qKgogICAqIFJlbW92ZSBhIHBvc3QgZnJvbSB0aGUgdXNlcidzIHN0cmVhbS4KICAgKiBDdXJyZW50bHksIHlvdSBtYXkgb25seSByZW1vdmUgc3RvcmllcyB5b3UgYXBwbGljYXRpb24gY3JlYXRlZC4KICAgKgogICAqIEBwYXJhbSAkcG9zdF9pZCAgdGhlIHBvc3QgaWQKICAgKiBAcGFyYW0gJHVpZCAgICAgIHRoZSBhY3RvciAoZGVmYXVsdHMgdG8gc2Vzc2lvbiB1c2VyKQogICAqIEByZXR1cm4gYm9vbAogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBzdHJlYW1fcmVtb3ZlKCRwb3N0X2lkLCAkdWlkID0gbnVsbCkgewogICAgcmV0dXJuICR0aGlzLT5jYWxsX21ldGhvZCgKICAgICAgJ2ZhY2Vib29rLnN0cmVhbS5yZW1vdmUnLAogICAgICBhcnJheSgncG9zdF9pZCcgPT4gJHBvc3RfaWQsCiAgICAgICAgICAgICd1aWQnID0+ICR0aGlzLT5nZXRfdWlkKCR1aWQpKSk7CiAgfQoKICAvKioKICAgKiBBZGQgYSBjb21tZW50IHRvIGEgc3RyZWFtIHBvc3QKICAgKgogICAqIEBwYXJhbSAkcG9zdF9pZCAgdGhlIHBvc3QgaWQKICAgKiBAcGFyYW0gJGNvbW1lbnQgIHRoZSBjb21tZW50IHRleHQKICAgKiBAcGFyYW0gJHVpZCAgICAgIHRoZSBhY3RvciAoZGVmYXVsdHMgdG8gc2Vzc2lvbiB1c2VyKQogICAqIEByZXR1cm4gc3RyaW5nIHRoZSBpZCBvZiB0aGUgY3JlYXRlZCBjb21tZW50CiAgICovCiAgcHVibGljIGZ1bmN0aW9uIHN0cmVhbV9hZGRDb21tZW50KCRwb3N0X2lkLCAkY29tbWVudCwgJHVpZCA9IG51bGwpIHsKICAgIHJldHVybiAkdGhpcy0+Y2FsbF9tZXRob2QoCiAgICAgICdmYWNlYm9vay5zdHJlYW0uYWRkQ29tbWVudCcsCiAgICAgIGFycmF5KCdwb3N0X2lkJyA9PiAkcG9zdF9pZCwKICAgICAgICAgICAgJ2NvbW1lbnQnID0+ICRjb21tZW50LAogICAgICAgICAgICAndWlkJyA9PiAkdGhpcy0+Z2V0X3VpZCgkdWlkKSkpOwogIH0KCgogIC8qKgogICAqIFJlbW92ZSBhIGNvbW1lbnQgZnJvbSBhIHN0cmVhbSBwb3N0CiAgICoKICAgKiBAcGFyYW0gJGNvbW1lbnRfaWQgIHRoZSBjb21tZW50IGlkCiAgICogQHBhcmFtICR1aWQgICAgICB0aGUgYWN0b3IgKGRlZmF1bHRzIHRvIHNlc3Npb24gdXNlcikKICAgKiBAcmV0dXJuIGJvb2wKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gc3RyZWFtX3JlbW92ZUNvbW1lbnQoJGNvbW1lbnRfaWQsICR1aWQgPSBudWxsKSB7CiAgICByZXR1cm4gJHRoaXMtPmNhbGxfbWV0aG9kKAogICAgICAnZmFjZWJvb2suc3RyZWFtLnJlbW92ZUNvbW1lbnQnLAogICAgICBhcnJheSgnY29tbWVudF9pZCcgPT4gJGNvbW1lbnRfaWQsCiAgICAgICAgICAgICd1aWQnID0+ICR0aGlzLT5nZXRfdWlkKCR1aWQpKSk7CiAgfQoKICAvKioKICAgKiBBZGQgYSBsaWtlIHRvIGEgc3RyZWFtIHBvc3QKICAgKgogICAqIEBwYXJhbSAkcG9zdF9pZCAgdGhlIHBvc3QgaWQKICAgKiBAcGFyYW0gJHVpZCAgICAgIHRoZSBhY3RvciAoZGVmYXVsdHMgdG8gc2Vzc2lvbiB1c2VyKQogICAqIEByZXR1cm4gYm9vbAogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBzdHJlYW1fYWRkTGlrZSgkcG9zdF9pZCwgJHVpZCA9IG51bGwpIHsKICAgIHJldHVybiAkdGhpcy0+Y2FsbF9tZXRob2QoCiAgICAgICdmYWNlYm9vay5zdHJlYW0uYWRkTGlrZScsCiAgICAgIGFycmF5KCdwb3N0X2lkJyA9PiAkcG9zdF9pZCwKICAgICAgICAgICAgJ3VpZCcgPT4gJHRoaXMtPmdldF91aWQoJHVpZCkpKTsKICB9CgogIC8qKgogICAqIFJlbW92ZSBhIGxpa2UgZnJvbSBhIHN0cmVhbSBwb3N0CiAgICoKICAgKiBAcGFyYW0gJHBvc3RfaWQgIHRoZSBwb3N0IGlkCiAgICogQHBhcmFtICR1aWQgICAgICB0aGUgYWN0b3IgKGRlZmF1bHRzIHRvIHNlc3Npb24gdXNlcikKICAgKiBAcmV0dXJuIGJvb2wKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gc3RyZWFtX3JlbW92ZUxpa2UoJHBvc3RfaWQsICR1aWQgPSBudWxsKSB7CiAgICByZXR1cm4gJHRoaXMtPmNhbGxfbWV0aG9kKAogICAgICAnZmFjZWJvb2suc3RyZWFtLnJlbW92ZUxpa2UnLAogICAgICBhcnJheSgncG9zdF9pZCcgPT4gJHBvc3RfaWQsCiAgICAgICAgICAgICd1aWQnID0+ICR0aGlzLT5nZXRfdWlkKCR1aWQpKSk7CiAgfQoKICAvKioKICAgKiBGb3IgdGhlIGN1cnJlbnQgdXNlciwgcmV0cmlldmVzIHN0b3JpZXMgZ2VuZXJhdGVkIGJ5IHRoZSB1c2VyJ3MgZnJpZW5kcwogICAqIHdoaWxlIHVzaW5nIHRoaXMgYXBwbGljYXRpb24uICBUaGlzIGNhbiBiZSB1c2VkIHRvIGVhc2lseSBjcmVhdGUgYQogICAqICJOZXdzIEZlZWQiIGxpa2UgZXhwZXJpZW5jZS4KICAgKgogICAqIEByZXR1cm4gYXJyYXkgIEFuIGFycmF5IG9mIGZlZWQgc3Rvcnkgb2JqZWN0cy4KICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gJmZlZWRfZ2V0QXBwRnJpZW5kU3RvcmllcygpIHsKICAgIHJldHVybiAkdGhpcy0+Y2FsbF9tZXRob2QoJ2ZhY2Vib29rLmZlZWQuZ2V0QXBwRnJpZW5kU3RvcmllcycpOwogIH0KCiAgLyoqCiAgICogTWFrZXMgYW4gRlFMIHF1ZXJ5LiAgVGhpcyBpcyBhIGdlbmVyYWxpemVkIHdheSBvZiBhY2Nlc3NpbmcgYWxsIHRoZSBkYXRhCiAgICogaW4gdGhlIEFQSSwgYXMgYW4gYWx0ZXJuYXRpdmUgdG8gbW9zdCBvZiB0aGUgb3RoZXIgbWV0aG9kIGNhbGxzLiAgTW9yZQogICAqIGluZm8gYXQgaHR0cDovL3dpa2kuZGV2ZWxvcGVycy5mYWNlYm9vay5jb20vaW5kZXgucGhwL0ZRTAogICAqCiAgICogQHBhcmFtIHN0cmluZyAkcXVlcnkgIHRoZSBxdWVyeSB0byBldmFsdWF0ZQogICAqCiAgICogQHJldHVybiBhcnJheSAgZ2VuZXJhbGl6ZWQgYXJyYXkgcmVwcmVzZW50aW5nIHRoZSByZXN1bHRzCiAgICovCiAgcHVibGljIGZ1bmN0aW9uICZmcWxfcXVlcnkoJHF1ZXJ5KSB7CiAgICByZXR1cm4gJHRoaXMtPmNhbGxfbWV0aG9kKCdmYWNlYm9vay5mcWwucXVlcnknLAogICAgICBhcnJheSgncXVlcnknID0+ICRxdWVyeSkpOwogIH0KCiAgLyoqCiAgICogTWFrZXMgYSBzZXQgb2YgRlFMIHF1ZXJpZXMgaW4gcGFyYWxsZWwuICBUaGlzIG1ldGhvZCB0YWtlcyBhIGRpY3Rpb25hcnkKICAgKiBvZiBGUUwgcXVlcmllcyB3aGVyZSB0aGUga2V5cyBhcmUgbmFtZXMgZm9yIHRoZSBxdWVyaWVzLiAgUmVzdWx0cyBmcm9tCiAgICogb25lIHF1ZXJ5IGNhbiBiZSB1c2VkIHdpdGhpbiBhbm90aGVyIHF1ZXJ5IHRvIGZldGNoIGFkZGl0aW9uYWwgZGF0YS4gIE1vcmUKICAgKiBpbmZvIGFib3V0IEZRTCBxdWVyaWVzIGF0IGh0dHA6Ly93aWtpLmRldmVsb3BlcnMuZmFjZWJvb2suY29tL2luZGV4LnBocC9GUUwKICAgKgogICAqIEBwYXJhbSBzdHJpbmcgJHF1ZXJpZXMgIEpTT04tZW5jb2RlZCBkaWN0aW9uYXJ5IG9mIHF1ZXJpZXMgdG8gZXZhbHVhdGUKICAgKgogICAqIEByZXR1cm4gYXJyYXkgIGdlbmVyYWxpemVkIGFycmF5IHJlcHJlc2VudGluZyB0aGUgcmVzdWx0cwogICAqLwogIHB1YmxpYyBmdW5jdGlvbiAmZnFsX211bHRpcXVlcnkoJHF1ZXJpZXMpIHsKICAgIHJldHVybiAkdGhpcy0+Y2FsbF9tZXRob2QoJ2ZhY2Vib29rLmZxbC5tdWx0aXF1ZXJ5JywKICAgICAgYXJyYXkoJ3F1ZXJpZXMnID0+ICRxdWVyaWVzKSk7CiAgfQoKICAvKioKICAgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHBhaXJzIG9mIHVzZXJzIGFyZSBmcmllbmRzLgogICAqIE5vdGUgdGhhdCB0aGUgRmFjZWJvb2sgZnJpZW5kIHJlbGF0aW9uc2hpcCBpcyBzeW1tZXRyaWMuCiAgICoKICAgKiBAcGFyYW0gYXJyYXkvc3RyaW5nICR1aWRzMSAgbGlzdCBvZiBpZHMgKGlkXzEsIGlkXzIsLi4uKQogICAqICAgICAgICAgICAgICAgICAgICAgICBvZiBzb21lIGxlbmd0aCBYIChjc3YgaXMgZGVwcmVjYXRlZCkKICAgKiBAcGFyYW0gYXJyYXkvc3RyaW5nICR1aWRzMiAgbGlzdCBvZiBpZHMgKGlkX0EsIGlkX0IsLi4uKQogICAqICAgICAgICAgICAgICAgICAgICAgICBvZiBTQU1FIGxlbmd0aCBYIChjc3YgaXMgZGVwcmVjYXRlZCkKICAgKgogICAqIEByZXR1cm4gYXJyYXkgIEFuIGFycmF5IHdpdGggdWlkMSwgdWlkMiwgYW5kIGJvb2wgaWYgZnJpZW5kcywgZS5nLjoKICAgKiAgIGFycmF5KDAgPT4gYXJyYXkoJ3VpZDEnID0+IGlkXzEsICd1aWQyJyA9PiBpZF9BLCAnYXJlX2ZyaWVuZHMnID0+IDEpLAogICAqICAgICAgICAgMSA9PiBhcnJheSgndWlkMScgPT4gaWRfMiwgJ3VpZDInID0+IGlkX0IsICdhcmVfZnJpZW5kcycgPT4gMCkKICAgKiAgICAgICAgIC4uLikKICAgKiBAZXJyb3IKICAgKiAgICBBUElfRUNfUEFSQU1fVVNFUl9JRF9MSVNUCiAgICovCiAgcHVibGljIGZ1bmN0aW9uICZmcmllbmRzX2FyZUZyaWVuZHMoJHVpZHMxLCAkdWlkczIpIHsKICAgIHJldHVybiAkdGhpcy0+Y2FsbF9tZXRob2QoJ2ZhY2Vib29rLmZyaWVuZHMuYXJlRnJpZW5kcycsCiAgICAgICAgICAgICAgICAgYXJyYXkoJ3VpZHMxJyA9PiAkdWlkczEsCiAgICAgICAgICAgICAgICAgICAgICAgJ3VpZHMyJyA9PiAkdWlkczIpKTsKICB9CgogIC8qKgogICAqIFJldHVybnMgdGhlIGZyaWVuZHMgb2YgdGhlIGN1cnJlbnQgc2Vzc2lvbiB1c2VyLgogICAqCiAgICogQHBhcmFtIGludCAkZmxpZCAgKE9wdGlvbmFsKSBPbmx5IHJldHVybiBmcmllbmRzIG9uIHRoaXMgZnJpZW5kIGxpc3QuCiAgICogQHBhcmFtIGludCAkdWlkICAgKE9wdGlvbmFsKSBSZXR1cm4gZnJpZW5kcyBmb3IgdGhpcyB1c2VyLgogICAqCiAgICogQHJldHVybiBhcnJheSAgQW4gYXJyYXkgb2YgZnJpZW5kcwogICAqLwogIHB1YmxpYyBmdW5jdGlvbiAmZnJpZW5kc19nZXQoJGZsaWQ9bnVsbCwgJHVpZCA9IG51bGwpIHsKICAgIGlmIChpc3NldCgkdGhpcy0+ZnJpZW5kc19saXN0KSkgewogICAgICByZXR1cm4gJHRoaXMtPmZyaWVuZHNfbGlzdDsKICAgIH0KICAgICRwYXJhbXMgPSBhcnJheSgpOwogICAgaWYgKCEkdWlkICYmIGlzc2V0KCR0aGlzLT5jYW52YXNfdXNlcikpIHsKICAgICAgJHVpZCA9ICR0aGlzLT5jYW52YXNfdXNlcjsKICAgIH0KICAgIGlmICgkdWlkKSB7CiAgICAgICRwYXJhbXNbJ3VpZCddID0gJHVpZDsKICAgIH0KICAgIGlmICgkZmxpZCkgewogICAgICAkcGFyYW1zWydmbGlkJ10gPSAkZmxpZDsKICAgIH0KICAgIHJldHVybiAkdGhpcy0+Y2FsbF9tZXRob2QoJ2ZhY2Vib29rLmZyaWVuZHMuZ2V0JywgJHBhcmFtcyk7CgogIH0KCiAgLyoqCiAgICogUmV0dXJucyB0aGUgbXV0dWFsIGZyaWVuZHMgYmV0d2VlbiB0aGUgdGFyZ2V0IHVpZCBhbmQgYSBzb3VyY2UgdWlkIG9yCiAgICogdGhlIGN1cnJlbnQgc2Vzc2lvbiB1c2VyLgogICAqCiAgICogQHBhcmFtIGludCAkdGFyZ2V0X3VpZCBUYXJnZXQgdWlkIGZvciB3aGljaCBtdXR1YWwgZnJpZW5kcyB3aWxsIGJlIGZvdW5kLgogICAqIEBwYXJhbSBpbnQgJHNvdXJjZV91aWQgKG9wdGlvbmFsKSBTb3VyY2UgdWlkIGZvciB3aGljaCBtdXR1YWwgZnJpZW5kcyB3aWxsCiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGZvdW5kLiBJZiBubyBzb3VyY2VfdWlkIGlzIHNwZWNpZmllZCwKICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlX2lkIHdpbGwgZGVmYXVsdCB0byB0aGUgc2Vzc2lvbgogICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLgogICAqIEByZXR1cm4gYXJyYXkgIEFuIGFycmF5IG9mIGZyaWVuZCB1aWRzCiAgICovCiAgcHVibGljIGZ1bmN0aW9uICZmcmllbmRzX2dldE11dHVhbEZyaWVuZHMoJHRhcmdldF91aWQsICRzb3VyY2VfdWlkID0gbnVsbCkgewogICAgcmV0dXJuICR0aGlzLT5jYWxsX21ldGhvZCgnZmFjZWJvb2suZnJpZW5kcy5nZXRNdXR1YWxGcmllbmRzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkoInRhcmdldF91aWQiID0+ICR0YXJnZXRfdWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlX3VpZCIgPT4gJHNvdXJjZV91aWQpKTsKICB9CgogIC8qKgogICAqIFJldHVybnMgdGhlIHNldCBvZiBmcmllbmQgbGlzdHMgZm9yIHRoZSBjdXJyZW50IHNlc3Npb24gdXNlci4KICAgKgogICAqIEByZXR1cm4gYXJyYXkgIEFuIGFycmF5IG9mIGZyaWVuZCBsaXN0IG9iamVjdHMKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gJmZyaWVuZHNfZ2V0TGlzdHMoKSB7CiAgICByZXR1cm4gJHRoaXMtPmNhbGxfbWV0aG9kKCdmYWNlYm9vay5mcmllbmRzLmdldExpc3RzJyk7CiAgfQoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBmcmllbmRzIG9mIHRoZSBzZXNzaW9uIHVzZXIsIHdobyBhcmUgYWxzbyB1c2VycwogICAqIG9mIHRoZSBjYWxsaW5nIGFwcGxpY2F0aW9uLgogICAqCiAgICogQHJldHVybiBhcnJheSAgQW4gYXJyYXkgb2YgZnJpZW5kcyBhbHNvIHVzaW5nIHRoZSBhcHAKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gJmZyaWVuZHNfZ2V0QXBwVXNlcnMoKSB7CiAgICByZXR1cm4gJHRoaXMtPmNhbGxfbWV0aG9kKCdmYWNlYm9vay5mcmllbmRzLmdldEFwcFVzZXJzJyk7CiAgfQoKICAvKioKICAgKiBSZXR1cm5zIGdyb3VwcyBhY2NvcmRpbmcgdG8gdGhlIGZpbHRlcnMgc3BlY2lmaWVkLgogICAqCiAgICogQHBhcmFtIGludCAkdWlkICAgICAoT3B0aW9uYWwpIFVzZXIgYXNzb2NpYXRlZCB3aXRoIGdyb3Vwcy4gIEEgbnVsbAogICAqICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyIHdpbGwgZGVmYXVsdCB0byB0aGUgc2Vzc2lvbiB1c2VyLgogICAqIEBwYXJhbSBhcnJheS9zdHJpbmcgJGdpZHMgKE9wdGlvbmFsKSBBcnJheSBvZiBncm91cCBpZHMgdG8gcXVlcnkuIEEgbnVsbAogICAqICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyIHdpbGwgZ2V0IGFsbCBncm91cHMgZm9yIHRoZSB1c2VyLgogICAqICAgICAgICAgICAgICAgICAgICAgKGNzdiBpcyBkZXByZWNhdGVkKQogICAqCiAgICogQHJldHVybiBhcnJheSAgQW4gYXJyYXkgb2YgZ3JvdXAgb2JqZWN0cwogICAqLwogIHB1YmxpYyBmdW5jdGlvbiAmZ3JvdXBzX2dldCgkdWlkLCAkZ2lkcykgewogICAgcmV0dXJuICR0aGlzLT5jYWxsX21ldGhvZCgnZmFjZWJvb2suZ3JvdXBzLmdldCcsCiAgICAgICAgYXJyYXkoJ3VpZCcgPT4gJHVpZCwKICAgICAgICAgICAgICAnZ2lkcycgPT4gJGdpZHMpKTsKICB9CgogIC8qKgogICAqIFJldHVybnMgdGhlIG1lbWJlcnNoaXAgbGlzdCBvZiBhIGdyb3VwLgogICAqCiAgICogQHBhcmFtIGludCAkZ2lkICBHcm91cCBpZAogICAqCiAgICogQHJldHVybiBhcnJheSAgQW4gYXJyYXkgd2l0aCBmb3VyIG1lbWJlcnNoaXAgbGlzdHMsIHdpdGgga2V5cyAnbWVtYmVycycsCiAgICogICAgICAgICAgICAgICAgJ2FkbWlucycsICdvZmZpY2VycycsIGFuZCAnbm90X3JlcGxpZWQnCiAgICovCiAgcHVibGljIGZ1bmN0aW9uICZncm91cHNfZ2V0TWVtYmVycygkZ2lkKSB7CiAgICByZXR1cm4gJHRoaXMtPmNhbGxfbWV0aG9kKCdmYWNlYm9vay5ncm91cHMuZ2V0TWVtYmVycycsCiAgICAgIGFycmF5KCdnaWQnID0+ICRnaWQpKTsKICB9CgogIC8qKgogICAqIFJldHVybnMgY29va2llcyBhY2NvcmRpbmcgdG8gdGhlIGZpbHRlcnMgc3BlY2lmaWVkLgogICAqCiAgICogQHBhcmFtIGludCAkdWlkICAgICBVc2VyIGZvciB3aGljaCB0aGUgY29va2llcyBhcmUgbmVlZGVkLgogICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgKE9wdGlvbmFsKSBBIG51bGwgcGFyYW1ldGVyIHdpbGwgZ2V0IGFsbCBjb29raWVzCiAgICogICAgICAgICAgICAgICAgICAgICBmb3IgdGhlIHVzZXIuCiAgICoKICAgKiBAcmV0dXJuIGFycmF5ICBDb29raWVzISAgTm9tIG5vbSBub20gbm9tIG5vbS4KICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gZGF0YV9nZXRDb29raWVzKCR1aWQsICRuYW1lKSB7CiAgICByZXR1cm4gJHRoaXMtPmNhbGxfbWV0aG9kKCdmYWNlYm9vay5kYXRhLmdldENvb2tpZXMnLAogICAgICAgIGFycmF5KCd1aWQnID0+ICR1aWQsCiAgICAgICAgICAgICAgJ25hbWUnID0+ICRuYW1lKSk7CiAgfQoKICAvKioKICAgKiBTZXRzIGNvb2tpZXMgYWNjb3JkaW5nIHRvIHRoZSBwYXJhbXMgc3BlY2lmaWVkLgogICAqCiAgICogQHBhcmFtIGludCAkdWlkICAgICAgIFVzZXIgZm9yIHdoaWNoIHRoZSBjb29raWVzIGFyZSBuZWVkZWQuCiAgICogQHBhcmFtIHN0cmluZyAkbmFtZSAgIE5hbWUgb2YgdGhlIGNvb2tpZQogICAqIEBwYXJhbSBzdHJpbmcgJHZhbHVlICAoT3B0aW9uYWwpIGlmIGV4cGlyZXMgc3BlY2lmaWVkIGFuZCBpcyBpbiB0aGUgcGFzdAogICAqIEBwYXJhbSBpbnQgJGV4cGlyZXMgICAoT3B0aW9uYWwpIEV4cGlyeSB0aW1lCiAgICogQHBhcmFtIHN0cmluZyAkcGF0aCAgIChPcHRpb25hbCkgVXJsIHBhdGggdG8gYXNzb2NpYXRlIHdpdGggKGRlZmF1bHQgaXMgLykKICAgKgogICAqIEByZXR1cm4gYm9vbCAgdHJ1ZSBvbiBzdWNjZXNzCiAgICovCiAgcHVibGljIGZ1bmN0aW9uIGRhdGFfc2V0Q29va2llKCR1aWQsICRuYW1lLCAkdmFsdWUsICRleHBpcmVzLCAkcGF0aCkgewogICAgcmV0dXJuICR0aGlzLT5jYWxsX21ldGhvZCgnZmFjZWJvb2suZGF0YS5zZXRDb29raWUnLAogICAgICAgIGFycmF5KCd1aWQnID0+ICR1aWQsCiAgICAgICAgICAgICAgJ25hbWUnID0+ICRuYW1lLAogICAgICAgICAgICAgICd2YWx1ZScgPT4gJHZhbHVlLAogICAgICAgICAgICAgICdleHBpcmVzJyA9PiAkZXhwaXJlcywKICAgICAgICAgICAgICAncGF0aCcgPT4gJHBhdGgpKTsKICB9CgogIC8qKgogICAqIFJldHJpZXZlcyBsaW5rcyBwb3N0ZWQgYnkgdGhlIGdpdmVuIHVzZXIuCiAgICoKICAgKiBAcGFyYW0gaW50ICAgICR1aWQgICAgICBUaGUgdXNlciB3aG9zZSBsaW5rcyB5b3Ugd2lzaCB0byByZXRyaWV2ZQogICAqIEBwYXJhbSBpbnQgICAgJGxpbWl0ICAgIFRoZSBtYXhpbWltdW0gbnVtYmVyIG9mIGxpbmtzIHRvIHJldHJpZXZlCiAgICogQHBhcmFtIGFycmF5ICRsaW5rX2lkcyAoT3B0aW9uYWwpIEFycmF5IG9mIHNwZWNpZmljIGxpbmsKICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgSURzIHRvIHJldHJpZXZlIGJ5IHRoaXMgdXNlcgogICAqCiAgICogQHJldHVybiBhcnJheSAgQW4gYXJyYXkgb2YgbGlua3MuCiAgICovCiAgcHVibGljIGZ1bmN0aW9uICZsaW5rc19nZXQoJHVpZCwgJGxpbWl0LCAkbGlua19pZHMgPSBudWxsKSB7CiAgICByZXR1cm4gJHRoaXMtPmNhbGxfbWV0aG9kKCdsaW5rcy5nZXQnLAogICAgICAgIGFycmF5KCd1aWQnID0+ICR1aWQsCiAgICAgICAgICAgICAgJ2xpbWl0JyA9PiAkbGltaXQsCiAgICAgICAgICAgICAgJ2xpbmtfaWRzJyA9PiAkbGlua19pZHMpKTsKICB9CgogIC8qKgogICAqIFBvc3RzIGEgbGluayBvbiBGYWNlYm9vay4KICAgKgogICAqIEBwYXJhbSBzdHJpbmcgJHVybCAgICAgVVJML2xpbmsgeW91IHdpc2ggdG8gcG9zdAogICAqIEBwYXJhbSBzdHJpbmcgJGNvbW1lbnQgKE9wdGlvbmFsKSBBIGNvbW1lbnQgYWJvdXQgdGhpcyBsaW5rCiAgICogQHBhcmFtIGludCAgICAkdWlkICAgICAoT3B0aW9uYWwpIFVzZXIgSUQgdGhhdCBpcyBwb3N0aW5nIHRoaXMgbGluazsKICAgKiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRzIHRvIGN1cnJlbnQgc2Vzc2lvbiB1c2VyCiAgICoKICAgKiBAcmV0dXJuIGJvb2wKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gJmxpbmtzX3Bvc3QoJHVybCwgJGNvbW1lbnQ9JycsICR1aWQgPSBudWxsKSB7CiAgICByZXR1cm4gJHRoaXMtPmNhbGxfbWV0aG9kKCdsaW5rcy5wb3N0JywKICAgICAgICBhcnJheSgndWlkJyA9PiAkdWlkLAogICAgICAgICAgICAgICd1cmwnID0+ICR1cmwsCiAgICAgICAgICAgICAgJ2NvbW1lbnQnID0+ICRjb21tZW50KSk7CiAgfQoKICAvKioKICAgKiBQZXJtaXNzaW9ucyBBUEkKICAgKi8KCiAgLyoqCiAgICogQ2hlY2tzIEFQSS1hY2Nlc3MgZ3JhbnRlZCBieSBzZWxmIHRvIHRoZSBzcGVjaWZpZWQgYXBwbGljYXRpb24uCiAgICoKICAgKiBAcGFyYW0gc3RyaW5nICRwZXJtaXNzaW9uc19hcGlrZXkgIE90aGVyIGFwcGxpY2F0aW9uIGtleQogICAqCiAgICogQHJldHVybiBhcnJheSAgQVBJIG1ldGhvZHMvbmFtZXNwYWNlcyB3aGljaCBhcmUgYWxsb3dlZCBhY2Nlc3MKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gcGVybWlzc2lvbnNfY2hlY2tHcmFudGVkQXBpQWNjZXNzKCRwZXJtaXNzaW9uc19hcGlrZXkpIHsKICAgIHJldHVybiAkdGhpcy0+Y2FsbF9tZXRob2QoJ2ZhY2Vib29rLnBlcm1pc3Npb25zLmNoZWNrR3JhbnRlZEFwaUFjY2VzcycsCiAgICAgICAgYXJyYXkoJ3Blcm1pc3Npb25zX2FwaWtleScgPT4gJHBlcm1pc3Npb25zX2FwaWtleSkpOwogIH0KCiAgLyoqCiAgICogQ2hlY2tzIEFQSS1hY2Nlc3MgZ3JhbnRlZCB0byBzZWxmIGJ5IHRoZSBzcGVjaWZpZWQgYXBwbGljYXRpb24uCiAgICoKICAgKiBAcGFyYW0gc3RyaW5nICRwZXJtaXNzaW9uc19hcGlrZXkgIE90aGVyIGFwcGxpY2F0aW9uIGtleQogICAqCiAgICogQHJldHVybiBhcnJheSAgQVBJIG1ldGhvZHMvbmFtZXNwYWNlcyB3aGljaCBhcmUgYWxsb3dlZCBhY2Nlc3MKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gcGVybWlzc2lvbnNfY2hlY2tBdmFpbGFibGVBcGlBY2Nlc3MoJHBlcm1pc3Npb25zX2FwaWtleSkgewogICAgcmV0dXJuICR0aGlzLT5jYWxsX21ldGhvZCgnZmFjZWJvb2sucGVybWlzc2lvbnMuY2hlY2tBdmFpbGFibGVBcGlBY2Nlc3MnLAogICAgICAgIGFycmF5KCdwZXJtaXNzaW9uc19hcGlrZXknID0+ICRwZXJtaXNzaW9uc19hcGlrZXkpKTsKICB9CgogIC8qKgogICAqIEdyYW50IEFQSS1hY2Nlc3MgdG8gdGhlIHNwZWNpZmllZCBtZXRob2RzL25hbWVzcGFjZXMgdG8gdGhlIHNwZWNpZmllZAogICAqIGFwcGxpY2F0aW9uLgogICAqCiAgICogQHBhcmFtIHN0cmluZyAkcGVybWlzc2lvbnNfYXBpa2V5ICBPdGhlciBhcHBsaWNhdGlvbiBrZXkKICAgKiBAcGFyYW0gYXJyYXkoc3RyaW5nKSAkbWV0aG9kX2FyciAgIChPcHRpb25hbCkgQVBJIG1ldGhvZHMvbmFtZXNwYWNlcwogICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZAogICAqCiAgICogQHJldHVybiBhcnJheSAgQVBJIG1ldGhvZHMvbmFtZXNwYWNlcyB3aGljaCBhcmUgYWxsb3dlZCBhY2Nlc3MKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gcGVybWlzc2lvbnNfZ3JhbnRBcGlBY2Nlc3MoJHBlcm1pc3Npb25zX2FwaWtleSwgJG1ldGhvZF9hcnIpIHsKICAgIHJldHVybiAkdGhpcy0+Y2FsbF9tZXRob2QoJ2ZhY2Vib29rLnBlcm1pc3Npb25zLmdyYW50QXBpQWNjZXNzJywKICAgICAgICBhcnJheSgncGVybWlzc2lvbnNfYXBpa2V5JyA9PiAkcGVybWlzc2lvbnNfYXBpa2V5LAogICAgICAgICAgICAgICdtZXRob2RfYXJyJyA9PiAkbWV0aG9kX2FycikpOwogIH0KCiAgLyoqCiAgICogUmV2b2tlIEFQSS1hY2Nlc3MgZ3JhbnRlZCB0byB0aGUgc3BlY2lmaWVkIGFwcGxpY2F0aW9uLgogICAqCiAgICogQHBhcmFtIHN0cmluZyAkcGVybWlzc2lvbnNfYXBpa2V5ICBPdGhlciBhcHBsaWNhdGlvbiBrZXkKICAgKgogICAqIEByZXR1cm4gYm9vbCAgdHJ1ZSBvbiBzdWNjZXNzCiAgICovCiAgcHVibGljIGZ1bmN0aW9uIHBlcm1pc3Npb25zX3Jldm9rZUFwaUFjY2VzcygkcGVybWlzc2lvbnNfYXBpa2V5KSB7CiAgICByZXR1cm4gJHRoaXMtPmNhbGxfbWV0aG9kKCdmYWNlYm9vay5wZXJtaXNzaW9ucy5yZXZva2VBcGlBY2Nlc3MnLAogICAgICAgIGFycmF5KCdwZXJtaXNzaW9uc19hcGlrZXknID0+ICRwZXJtaXNzaW9uc19hcGlrZXkpKTsKICB9CgogIC8qKgogICAqIFBheW1lbnRzIE9yZGVyIEFQSQogICAqLwoKICAvKioKICAgKiBTZXQgUGF5bWVudHMgcHJvcGVydGllcyBmb3IgYW4gYXBwLgogICAqCiAgICogQHBhcmFtICBwcm9wZXJ0aWVzICBhIG1hcCBmcm9tIHByb3BlcnR5IG5hbWVzIHRvICB2YWx1ZXMKICAgKiBAcmV0dXJuICAgICAgICAgICAgIHRydWUgb24gc3VjY2VzcwogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBwYXltZW50c19zZXRQcm9wZXJ0aWVzKCRwcm9wZXJ0aWVzKSB7CiAgICByZXR1cm4gJHRoaXMtPmNhbGxfbWV0aG9kICgnZmFjZWJvb2sucGF5bWVudHMuc2V0UHJvcGVydGllcycsCiAgICAgICAgYXJyYXkoJ3Byb3BlcnRpZXMnID0+IGpzb25fZW5jb2RlKCRwcm9wZXJ0aWVzKSkpOwogIH0KCiAgcHVibGljIGZ1bmN0aW9uIHBheW1lbnRzX2dldE9yZGVyRGV0YWlscygkb3JkZXJfaWQpIHsKICAgIHJldHVybiBqc29uX2RlY29kZSgkdGhpcy0+Y2FsbF9tZXRob2QoCiAgICAgICAgJ2ZhY2Vib29rLnBheW1lbnRzLmdldE9yZGVyRGV0YWlscycsCiAgICAgICAgYXJyYXkoJ29yZGVyX2lkJyA9PiAkb3JkZXJfaWQpKSwgdHJ1ZSk7CiAgfQoKICBwdWJsaWMgZnVuY3Rpb24gcGF5bWVudHNfdXBkYXRlT3JkZXIoJG9yZGVyX2lkLCAkc3RhdHVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwYXJhbXMpIHsKICAgIHJldHVybiAkdGhpcy0+Y2FsbF9tZXRob2QoJ2ZhY2Vib29rLnBheW1lbnRzLnVwZGF0ZU9yZGVyJywKICAgICAgICBhcnJheSgnb3JkZXJfaWQnID0+ICRvcmRlcl9pZCwKICAgICAgICAgICAgICAnc3RhdHVzJyA9PiAkc3RhdHVzLAogICAgICAgICAgICAgICdwYXJhbXMnID0+IGpzb25fZW5jb2RlKCRwYXJhbXMpKSk7CiAgfQoKICBwdWJsaWMgZnVuY3Rpb24gcGF5bWVudHNfZ2V0T3JkZXJzKCRzdGF0dXMsICRzdGFydF90aW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZW5kX3RpbWUsICR0ZXN0X21vZGU9ZmFsc2UpIHsKICAgIHJldHVybiBqc29uX2RlY29kZSgkdGhpcy0+Y2FsbF9tZXRob2QoJ2ZhY2Vib29rLnBheW1lbnRzLmdldE9yZGVycycsCiAgICAgICAgYXJyYXkoJ3N0YXR1cycgPT4gJHN0YXR1cywKICAgICAgICAgICAgICAnc3RhcnRfdGltZScgPT4gJHN0YXJ0X3RpbWUsCiAgICAgICAgICAgICAgJ2VuZF90aW1lJyA9PiAkZW5kX3RpbWUsCiAgICAgICAgICAgICAgJ3Rlc3RfbW9kZScgPT4gJHRlc3RfbW9kZSkpLCB0cnVlKTsKICB9CgogIC8qKgogICAqIEdpZnRzIEFQSQogICAqLwoKICAvKioKICAgKiBHZXQgR2lmdHMgYXNzb2NpYXRlZCB3aXRoIGFuIGFwcAogICAqCiAgICogQHJldHVybiAgICAgICAgICAgICBhcnJheSBvZiBnaWZ0cwogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBnaWZ0c19nZXQoKSB7CiAgICByZXR1cm4ganNvbl9kZWNvZGUoCiAgICAgICAgJHRoaXMtPmNhbGxfbWV0aG9kKCdmYWNlYm9vay5naWZ0cy5nZXQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheSgpKSwKICAgICAgICB0cnVlCiAgICAgICAgKTsKICB9CgogIC8qCiAgICogVXBkYXRlIGdpZnRzIHN0b3JlZCBieSBhbiBhcHAKICAgKgogICAqIEBwYXJhbSBhcnJheSBjb250YWluaW5nIGdpZnRfaWQgPT4gZ2lmdF9kYXRhIHRvIGJlIHVwZGF0ZWQKICAgKiBAcmV0dXJuIGFycmF5IGNvbnRhaW5pbmcgZ2lmdF9pZCA9PiB0cnVlL2ZhbHNlIGluZGljYXRpbmcgc3VjY2VzcwogICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHVwZGF0aW5nIHRoYXQgZ2lmdAogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBnaWZ0c191cGRhdGUoJHVwZGF0ZV9hcnJheSkgewogICAgcmV0dXJuIGpzb25fZGVjb2RlKAogICAgICAkdGhpcy0+Y2FsbF9tZXRob2QoJ2ZhY2Vib29rLmdpZnRzLnVwZGF0ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheSgndXBkYXRlX3N0cicgPT4ganNvbl9lbmNvZGUoJHVwZGF0ZV9hcnJheSkpCiAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgIHRydWUKICAgICk7CiAgfQoKICAvKioKICAgKiBDcmVhdGVzIGEgbm90ZSB3aXRoIHRoZSBzcGVjaWZpZWQgdGl0bGUgYW5kIGNvbnRlbnQuCiAgICoKICAgKiBAcGFyYW0gc3RyaW5nICR0aXRsZSAgIFRpdGxlIG9mIHRoZSBub3RlLgogICAqIEBwYXJhbSBzdHJpbmcgJGNvbnRlbnQgQ29udGVudCBvZiB0aGUgbm90ZS4KICAgKiBAcGFyYW0gaW50ICAgICR1aWQgICAgIChPcHRpb25hbCkgVGhlIHVzZXIgZm9yIHdob20geW91IGFyZSBjcmVhdGluZyBhCiAgICogICAgICAgICAgICAgICAgICAgICAgICBub3RlOyBkZWZhdWx0cyB0byBjdXJyZW50IHNlc3Npb24gdXNlcgogICAqCiAgICogQHJldHVybiBpbnQgICBUaGUgSUQgb2YgdGhlIG5vdGUgdGhhdCB3YXMganVzdCBjcmVhdGVkLgogICAqLwogIHB1YmxpYyBmdW5jdGlvbiAmbm90ZXNfY3JlYXRlKCR0aXRsZSwgJGNvbnRlbnQsICR1aWQgPSBudWxsKSB7CiAgICByZXR1cm4gJHRoaXMtPmNhbGxfbWV0aG9kKCdub3Rlcy5jcmVhdGUnLAogICAgICAgIGFycmF5KCd1aWQnID0+ICR1aWQsCiAgICAgICAgICAgICAgJ3RpdGxlJyA9PiAkdGl0bGUsCiAgICAgICAgICAgICAgJ2NvbnRlbnQnID0+ICRjb250ZW50KSk7CiAgfQoKICAvKioKICAgKiBEZWxldGVzIHRoZSBzcGVjaWZpZWQgbm90ZS4KICAgKgogICAqIEBwYXJhbSBpbnQgJG5vdGVfaWQgIElEIG9mIHRoZSBub3RlIHlvdSB3aXNoIHRvIGRlbGV0ZQogICAqIEBwYXJhbSBpbnQgJHVpZCAgICAgIChPcHRpb25hbCkgT3duZXIgb2YgdGhlIG5vdGUgeW91IHdpc2ggdG8gZGVsZXRlOwogICAqICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRzIHRvIGN1cnJlbnQgc2Vzc2lvbiB1c2VyCiAgICoKICAgKiBAcmV0dXJuIGJvb2wKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gJm5vdGVzX2RlbGV0ZSgkbm90ZV9pZCwgJHVpZCA9IG51bGwpIHsKICAgIHJldHVybiAkdGhpcy0+Y2FsbF9tZXRob2QoJ25vdGVzLmRlbGV0ZScsCiAgICAgICAgYXJyYXkoJ3VpZCcgPT4gJHVpZCwKICAgICAgICAgICAgICAnbm90ZV9pZCcgPT4gJG5vdGVfaWQpKTsKICB9CgogIC8qKgogICAqIEVkaXRzIGEgbm90ZSwgcmVwbGFjaW5nIGl0cyB0aXRsZSBhbmQgY29udGVudHMgd2l0aCB0aGUgdGl0bGUKICAgKiBhbmQgY29udGVudHMgc3BlY2lmaWVkLgogICAqCiAgICogQHBhcmFtIGludCAgICAkbm90ZV9pZCAgSUQgb2YgdGhlIG5vdGUgeW91IHdpc2ggdG8gZWRpdAogICAqIEBwYXJhbSBzdHJpbmcgJHRpdGxlICAgIFJlcGxhY2VtZW50IHRpdGxlIGZvciB0aGUgbm90ZQogICAqIEBwYXJhbSBzdHJpbmcgJGNvbnRlbnQgIFJlcGxhY2VtZW50IGNvbnRlbnQgZm9yIHRoZSBub3RlCiAgICogQHBhcmFtIGludCAgICAkdWlkICAgICAgKE9wdGlvbmFsKSBPd25lciBvZiB0aGUgbm90ZSB5b3Ugd2lzaCB0byBlZGl0OwogICAqICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRzIHRvIGN1cnJlbnQgc2Vzc2lvbiB1c2VyCiAgICoKICAgKiBAcmV0dXJuIGJvb2wKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gJm5vdGVzX2VkaXQoJG5vdGVfaWQsICR0aXRsZSwgJGNvbnRlbnQsICR1aWQgPSBudWxsKSB7CiAgICByZXR1cm4gJHRoaXMtPmNhbGxfbWV0aG9kKCdub3Rlcy5lZGl0JywKICAgICAgICBhcnJheSgndWlkJyA9PiAkdWlkLAogICAgICAgICAgICAgICdub3RlX2lkJyA9PiAkbm90ZV9pZCwKICAgICAgICAgICAgICAndGl0bGUnID0+ICR0aXRsZSwKICAgICAgICAgICAgICAnY29udGVudCcgPT4gJGNvbnRlbnQpKTsKICB9CgogIC8qKgogICAqIFJldHJpZXZlcyBhbGwgbm90ZXMgYnkgYSB1c2VyLiBJZiBub3RlX2lkcyBhcmUgc3BlY2lmaWVkLAogICAqIHJldHJpZXZlcyBvbmx5IHRob3NlIHNwZWNpZmljIG5vdGVzIGJ5IHRoYXQgdXNlci4KICAgKgogICAqIEBwYXJhbSBpbnQgICAgJHVpZCAgICAgIFVzZXIgd2hvc2Ugbm90ZXMgeW91IHdpc2ggdG8gcmV0cmlldmUKICAgKiBAcGFyYW0gYXJyYXkgICRub3RlX2lkcyAoT3B0aW9uYWwpIExpc3Qgb2Ygc3BlY2lmaWMgbm90ZQogICAqICAgICAgICAgICAgICAgICAgICAgICAgIElEcyBieSB0aGlzIHVzZXIgdG8gcmV0cmlldmUKICAgKgogICAqIEByZXR1cm4gYXJyYXkgQSBsaXN0IG9mIGFsbCBvZiB0aGUgZ2l2ZW4gdXNlcidzIG5vdGVzLCBvciBhbiBlbXB0eSBsaXN0CiAgICogICAgICAgICAgICAgICBpZiB0aGUgdmlld2VyIGxhY2tzIHBlcm1pc3Npb25zIG9yIGlmIHRoZXJlIGFyZSBubyB2aXNpYmxlCiAgICogICAgICAgICAgICAgICBub3Rlcy4KICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gJm5vdGVzX2dldCgkdWlkLCAkbm90ZV9pZHMgPSBudWxsKSB7CiAgICByZXR1cm4gJHRoaXMtPmNhbGxfbWV0aG9kKCdub3Rlcy5nZXQnLAogICAgICAgIGFycmF5KCd1aWQnID0+ICR1aWQsCiAgICAgICAgICAgICAgJ25vdGVfaWRzJyA9PiAkbm90ZV9pZHMpKTsKICB9CgoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBvdXRzdGFuZGluZyBub3RpZmljYXRpb25zIGZvciB0aGUgc2Vzc2lvbiB1c2VyLgogICAqCiAgICogQHJldHVybiBhcnJheSBBbiBhc3NvYyBhcnJheSBvZiBub3RpZmljYXRpb24gY291bnQgb2JqZWN0cyBmb3IKICAgKiAgICAgICAgICAgICAgICdtZXNzYWdlcycsICdwb2tlcycgYW5kICdzaGFyZXMnLCBhIHVpZCBsaXN0IG9mCiAgICogICAgICAgICAgICAgICAnZnJpZW5kX3JlcXVlc3RzJywgYSBnaWQgbGlzdCBvZiAnZ3JvdXBfaW52aXRlcycsCiAgICogICAgICAgICAgICAgICBhbmQgYW4gZWlkIGxpc3Qgb2YgJ2V2ZW50X2ludml0ZXMnCiAgICovCiAgcHVibGljIGZ1bmN0aW9uICZub3RpZmljYXRpb25zX2dldCgpIHsKICAgIHJldHVybiAkdGhpcy0+Y2FsbF9tZXRob2QoJ2ZhY2Vib29rLm5vdGlmaWNhdGlvbnMuZ2V0Jyk7CiAgfQoKICAvKioKICAgKiBTZW5kcyBhIG5vdGlmaWNhdGlvbiB0byB0aGUgc3BlY2lmaWVkIHVzZXJzLgogICAqCiAgICogQHJldHVybiBBIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIHN1Y2Nlc3NmdWwgcmVjaXBpZW50cwogICAqIEBlcnJvcgogICAqICAgIEFQSV9FQ19QQVJBTV9VU0VSX0lEX0xJU1QKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gJm5vdGlmaWNhdGlvbnNfc2VuZCgkdG9faWRzLCAkbm90aWZpY2F0aW9uLCAkdHlwZSkgewogICAgcmV0dXJuICR0aGlzLT5jYWxsX21ldGhvZCgnZmFjZWJvb2subm90aWZpY2F0aW9ucy5zZW5kJywKICAgICAgICBhcnJheSgndG9faWRzJyA9PiAkdG9faWRzLAogICAgICAgICAgICAgICdub3RpZmljYXRpb24nID0+ICRub3RpZmljYXRpb24sCiAgICAgICAgICAgICAgJ3R5cGUnID0+ICR0eXBlKSk7CiAgfQoKICAvKioKICAgKiBTZW5kcyBhbiBlbWFpbCB0byB0aGUgc3BlY2lmaWVkIHVzZXIgb2YgdGhlIGFwcGxpY2F0aW9uLgogICAqCiAgICogQHBhcmFtIGFycmF5L3N0cmluZyAkcmVjaXBpZW50cyBhcnJheSBvZiBpZHMgb2YgdGhlIHJlY2lwaWVudHMgKGNzdiBpcyBkZXByZWNhdGVkKQogICAqIEBwYXJhbSBzdHJpbmcgJHN1YmplY3QgICAgc3ViamVjdCBvZiB0aGUgZW1haWwKICAgKiBAcGFyYW0gc3RyaW5nICR0ZXh0ICAgICAgIChwbGFpbiB0ZXh0KSBib2R5IG9mIHRoZSBlbWFpbAogICAqIEBwYXJhbSBzdHJpbmcgJGZibWwgICAgICAgZmJtbCBtYXJrdXAgZm9yIGFuIGh0bWwgdmVyc2lvbiBvZiB0aGUgZW1haWwKICAgKgogICAqIEByZXR1cm4gc3RyaW5nICBBIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIHN1Y2Nlc3NmdWwgcmVjaXBpZW50cwogICAqIEBlcnJvcgogICAqICAgIEFQSV9FQ19QQVJBTV9VU0VSX0lEX0xJU1QKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gJm5vdGlmaWNhdGlvbnNfc2VuZEVtYWlsKCRyZWNpcGllbnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHN1YmplY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmYm1sKSB7CiAgICByZXR1cm4gJHRoaXMtPmNhbGxfbWV0aG9kKCdmYWNlYm9vay5ub3RpZmljYXRpb25zLnNlbmRFbWFpbCcsCiAgICAgICAgYXJyYXkoJ3JlY2lwaWVudHMnID0+ICRyZWNpcGllbnRzLAogICAgICAgICAgICAgICdzdWJqZWN0JyA9PiAkc3ViamVjdCwKICAgICAgICAgICAgICAndGV4dCcgPT4gJHRleHQsCiAgICAgICAgICAgICAgJ2ZibWwnID0+ICRmYm1sKSk7CiAgfQoKICAvKioKICAgKiBSZXR1cm5zIHRoZSByZXF1ZXN0ZWQgaW5mbyBmaWVsZHMgZm9yIHRoZSByZXF1ZXN0ZWQgc2V0IG9mIHBhZ2VzLgogICAqCiAgICogQHBhcmFtIGFycmF5L3N0cmluZyAkcGFnZV9pZHMgIGFuIGFycmF5IG9mIHBhZ2UgaWRzIChjc3YgaXMgZGVwcmVjYXRlZCkKICAgKiBAcGFyYW0gYXJyYXkvc3RyaW5nICAkZmllbGRzICAgIGFuIGFycmF5IG9mIHN0cmluZ3MgZGVzY3JpYmluZyB0aGUKICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gZmllbGRzIGRlc2lyZWQgKGNzdiBpcyBkZXByZWNhdGVkKQogICAqIEBwYXJhbSBpbnQgICAgJHVpZCAgICAgICAoT3B0aW9uYWwpIGxpbWl0IHJlc3VsdHMgdG8gcGFnZXMgb2Ygd2hpY2ggdGhpcwogICAqICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyIGlzIGEgZmFuLgogICAqIEBwYXJhbSBzdHJpbmcgdHlwZSAgICAgICBsaW1pdHMgcmVzdWx0cyB0byBhIHBhcnRpY3VsYXIgdHlwZSBvZiBwYWdlLgogICAqCiAgICogQHJldHVybiBhcnJheSAgQW4gYXJyYXkgb2YgcGFnZXMKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gJnBhZ2VzX2dldEluZm8oJHBhZ2VfaWRzLCAkZmllbGRzLCAkdWlkLCAkdHlwZSkgewogICAgcmV0dXJuICR0aGlzLT5jYWxsX21ldGhvZCgnZmFjZWJvb2sucGFnZXMuZ2V0SW5mbycsCiAgICAgICAgYXJyYXkoJ3BhZ2VfaWRzJyA9PiAkcGFnZV9pZHMsCiAgICAgICAgICAgICAgJ2ZpZWxkcycgPT4gJGZpZWxkcywKICAgICAgICAgICAgICAndWlkJyA9PiAkdWlkLAogICAgICAgICAgICAgICd0eXBlJyA9PiAkdHlwZSkpOwogIH0KCiAgLyoqCiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiB1c2VyIGlzIGFuIGFkbWluIGZvciB0aGUgcGFzc2VkIHBhZ2UuCiAgICoKICAgKiBAcGFyYW0gaW50ICRwYWdlX2lkICB0YXJnZXQgcGFnZSBpZAogICAqIEBwYXJhbSBpbnQgJHVpZCAgICAgIChPcHRpb25hbCkgdXNlciBpZCAoZGVmYXVsdHMgdG8gdGhlIGxvZ2dlZC1pbiB1c2VyKQogICAqCiAgICogQHJldHVybiBib29sICB0cnVlIG9uIHN1Y2Nlc3MKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gJnBhZ2VzX2lzQWRtaW4oJHBhZ2VfaWQsICR1aWQgPSBudWxsKSB7CiAgICByZXR1cm4gJHRoaXMtPmNhbGxfbWV0aG9kKCdmYWNlYm9vay5wYWdlcy5pc0FkbWluJywKICAgICAgICBhcnJheSgncGFnZV9pZCcgPT4gJHBhZ2VfaWQsCiAgICAgICAgICAgICAgJ3VpZCcgPT4gJHVpZCkpOwogIH0KCiAgLyoqCiAgICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgZ2l2ZW4gcGFnZSBoYXMgYWRkZWQgdGhlIGFwcGxpY2F0aW9uLgogICAqCiAgICogQHBhcmFtIGludCAkcGFnZV9pZCAgdGFyZ2V0IHBhZ2UgaWQKICAgKgogICAqIEByZXR1cm4gYm9vbCAgdHJ1ZSBvbiBzdWNjZXNzCiAgICovCiAgcHVibGljIGZ1bmN0aW9uICZwYWdlc19pc0FwcEFkZGVkKCRwYWdlX2lkKSB7CiAgICByZXR1cm4gJHRoaXMtPmNhbGxfbWV0aG9kKCdmYWNlYm9vay5wYWdlcy5pc0FwcEFkZGVkJywKICAgICAgICBhcnJheSgncGFnZV9pZCcgPT4gJHBhZ2VfaWQpKTsKICB9CgogIC8qKgogICAqIFJldHVybnMgdHJ1ZSBpZiBsb2dnZWQgaW4gdXNlciBpcyBhIGZhbiBmb3IgdGhlIHBhc3NlZCBwYWdlLgogICAqCiAgICogQHBhcmFtIGludCAkcGFnZV9pZCB0YXJnZXQgcGFnZSBpZAogICAqIEBwYXJhbSBpbnQgJHVpZCB1c2VyIHRvIGNvbXBhcmUuICBJZiBlbXB0eSwgdGhlIGxvZ2dlZCBpbiB1c2VyLgogICAqCiAgICogQHJldHVybiBib29sICB0cnVlIG9uIHN1Y2Nlc3MKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gJnBhZ2VzX2lzRmFuKCRwYWdlX2lkLCAkdWlkID0gbnVsbCkgewogICAgcmV0dXJuICR0aGlzLT5jYWxsX21ldGhvZCgnZmFjZWJvb2sucGFnZXMuaXNGYW4nLAogICAgICAgIGFycmF5KCdwYWdlX2lkJyA9PiAkcGFnZV9pZCwKICAgICAgICAgICAgICAndWlkJyA9PiAkdWlkKSk7CiAgfQoKICAvKioKICAgKiBBZGRzIGEgdGFnIHdpdGggdGhlIGdpdmVuIGluZm9ybWF0aW9uIHRvIGEgcGhvdG8uIFNlZSB0aGUgd2lraSBmb3IgZGV0YWlsczoKICAgKgogICAqICBodHRwOi8vd2lraS5kZXZlbG9wZXJzLmZhY2Vib29rLmNvbS9pbmRleC5waHAvUGhvdG9zLmFkZFRhZwogICAqCiAgICogQHBhcmFtIGludCAkcGlkICAgICAgICAgIFRoZSBJRCBvZiB0aGUgcGhvdG8gdG8gYmUgdGFnZ2VkCiAgICogQHBhcmFtIGludCAkdGFnX3VpZCAgICAgIFRoZSBJRCBvZiB0aGUgdXNlciBiZWluZyB0YWdnZWQuIFlvdSBtdXN0IHNwZWNpZnkKICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgZWl0aGVyIHRoZSAkdGFnX3VpZCBvciB0aGUgJHRhZ190ZXh0IHBhcmFtZXRlcgogICAqICAgICAgICAgICAgICAgICAgICAgICAgICAodW5sZXNzICR0YWdzIGlzIHNwZWNpZmllZCkuCiAgICogQHBhcmFtIHN0cmluZyAkdGFnX3RleHQgIFNvbWUgdGV4dCBpZGVudGlmeWluZyB0aGUgcGVyc29uIGJlaW5nIHRhZ2dlZC4KICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgWW91IG11c3Qgc3BlY2lmeSBlaXRoZXIgdGhlICR0YWdfdWlkIG9yICR0YWdfdGV4dAogICAqICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgKHVubGVzcyAkdGFncyBpcyBzcGVjaWZpZWQpLgogICAqIEBwYXJhbSBmbG9hdCAkeCAgICAgICAgICBUaGUgaG9yaXpvbnRhbCBwb3NpdGlvbiBvZiB0aGUgdGFnLCBhcyBhCiAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmNlbnRhZ2UgZnJvbSAwIHRvIDEwMCwgZnJvbSB0aGUgbGVmdCBvZiB0aGUKICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgcGhvdG8uCiAgICogQHBhcmFtIGZsb2F0ICR5ICAgICAgICAgIFRoZSB2ZXJ0aWNhbCBwb3NpdGlvbiBvZiB0aGUgdGFnLCBhcyBhIHBlcmNlbnRhZ2UKICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSAwIHRvIDEwMCwgZnJvbSB0aGUgdG9wIG9mIHRoZSBwaG90by4KICAgKiBAcGFyYW0gYXJyYXkgJHRhZ3MgICAgICAgKE9wdGlvbmFsKSBBbiBhcnJheSBvZiBtYXBzLCB3aGVyZSBlYWNoIG1hcAogICAqICAgICAgICAgICAgICAgICAgICAgICAgICBjYW4gY29udGFpbiB0aGUgdGFnX3VpZCwgdGFnX3RleHQsIHgsIGFuZCB5CiAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgZGVmaW5lZCBhYm92ZS4gIElmIHNwZWNpZmllZCwgdGhlCiAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGluZGl2aWR1YWwgYXJndW1lbnRzIGFyZSBpZ25vcmVkLgogICAqIEBwYXJhbSBpbnQgJG93bmVyX3VpZCAgICAoT3B0aW9uYWwpICBUaGUgdXNlciBJRCBvZiB0aGUgdXNlciB3aG9zZSBwaG90bwogICAqICAgICAgICAgICAgICAgICAgICAgICAgICB5b3UgYXJlIHRhZ2dpbmcuIElmIHRoaXMgcGFyYW1ldGVyIGlzIG5vdAogICAqICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQsIHRoZW4gaXQgZGVmYXVsdHMgdG8gdGhlIHNlc3Npb24gdXNlci4KICAgKgogICAqIEByZXR1cm4gYm9vbCAgdHJ1ZSBvbiBzdWNjZXNzCiAgICovCiAgcHVibGljIGZ1bmN0aW9uICZwaG90b3NfYWRkVGFnKCRwaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0YWdfdWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGFnX3RleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRvd25lcl91aWQ9MCkgewogICAgcmV0dXJuICR0aGlzLT5jYWxsX21ldGhvZCgnZmFjZWJvb2sucGhvdG9zLmFkZFRhZycsCiAgICAgICAgYXJyYXkoJ3BpZCcgPT4gJHBpZCwKICAgICAgICAgICAgICAndGFnX3VpZCcgPT4gJHRhZ191aWQsCiAgICAgICAgICAgICAgJ3RhZ190ZXh0JyA9PiAkdGFnX3RleHQsCiAgICAgICAgICAgICAgJ3gnID0+ICR4LAogICAgICAgICAgICAgICd5JyA9PiAkeSwKICAgICAgICAgICAgICAndGFncycgPT4gKGlzX2FycmF5KCR0YWdzKSkgPyBqc29uX2VuY29kZSgkdGFncykgOiBudWxsLAogICAgICAgICAgICAgICdvd25lcl91aWQnID0+ICR0aGlzLT5nZXRfdWlkKCRvd25lcl91aWQpKSk7CiAgfQoKICAvKioKICAgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IGFsYnVtIG93bmVkIGJ5IHRoZSBzcGVjaWZpZWQgdXNlciBvciB0aGUgY3VycmVudAogICAqIHNlc3Npb24gdXNlci4KICAgKgogICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgYWxidW0uCiAgICogQHBhcmFtIHN0cmluZyAkZGVzY3JpcHRpb24gIChPcHRpb25hbCkgQSBkZXNjcmlwdGlvbiBvZiB0aGUgYWxidW0uCiAgICogQHBhcmFtIHN0cmluZyAkbG9jYXRpb24gICAgIChPcHRpb25hbCkgQSBkZXNjcmlwdGlvbiBvZiB0aGUgbG9jYXRpb24uCiAgICogQHBhcmFtIHN0cmluZyAkdmlzaWJsZSAgICAgIChPcHRpb25hbCkgQSBwcml2YWN5IHNldHRpbmcgZm9yIHRoZSBhbGJ1bS4KICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT25lIG9mICdmcmllbmRzJywgJ2ZyaWVuZHMtb2YtZnJpZW5kcycsCiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICduZXR3b3JrcycsIG9yICdldmVyeW9uZScuICBEZWZhdWx0ICdldmVyeW9uZScuCiAgICogQHBhcmFtIGludCAkdWlkICAgICAgICAgICAgIChPcHRpb25hbCkgVXNlciBpZCBmb3IgY3JlYXRpbmcgdGhlIGFsYnVtOyBpZgogICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3Qgc3BlY2lmaWVkLCB0aGUgc2Vzc2lvbiB1c2VyIGlzIHVzZWQuCiAgICoKICAgKiBAcmV0dXJuIGFycmF5ICBBbiBhbGJ1bSBvYmplY3QKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gJnBob3Rvc19jcmVhdGVBbGJ1bSgkbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZGVzY3JpcHRpb249JycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGxvY2F0aW9uPScnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR2aXNpYmxlPScnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR1aWQ9MCkgewogICAgcmV0dXJuICR0aGlzLT5jYWxsX21ldGhvZCgnZmFjZWJvb2sucGhvdG9zLmNyZWF0ZUFsYnVtJywKICAgICAgICBhcnJheSgnbmFtZScgPT4gJG5hbWUsCiAgICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJyA9PiAkZGVzY3JpcHRpb24sCiAgICAgICAgICAgICAgJ2xvY2F0aW9uJyA9PiAkbG9jYXRpb24sCiAgICAgICAgICAgICAgJ3Zpc2libGUnID0+ICR2aXNpYmxlLAogICAgICAgICAgICAgICd1aWQnID0+ICR0aGlzLT5nZXRfdWlkKCR1aWQpKSk7CiAgfQoKICAvKioKICAgKiBSZXR1cm5zIHBob3RvcyBhY2NvcmRpbmcgdG8gdGhlIGZpbHRlcnMgc3BlY2lmaWVkLgogICAqCiAgICogQHBhcmFtIGludCAkc3Vial9pZCAgKE9wdGlvbmFsKSBGaWx0ZXIgYnkgdWlkIG9mIHVzZXIgdGFnZ2VkIGluIHRoZSBwaG90b3MuCiAgICogQHBhcmFtIGludCAkYWlkICAgICAgKE9wdGlvbmFsKSBGaWx0ZXIgYnkgYW4gYWxidW0sIGFzIHJldHVybmVkIGJ5CiAgICogICAgICAgICAgICAgICAgICAgICAgcGhvdG9zX2dldEFsYnVtcy4KICAgKiBAcGFyYW0gYXJyYXkvc3RyaW5nICRwaWRzICAgKE9wdGlvbmFsKSBSZXN0cmljdCB0byBhbiBhcnJheSBvZiBwaWRzCiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjc3YgaXMgZGVwcmVjYXRlZCkKICAgKgogICAqIE5vdGUgdGhhdCBhdCBsZWFzdCBvbmUgb2YgdGhlc2UgcGFyYW1ldGVycyBuZWVkcyB0byBiZSBzcGVjaWZpZWQsIG9yIGFuCiAgICogZXJyb3IgaXMgcmV0dXJuZWQuCiAgICoKICAgKiBAcmV0dXJuIGFycmF5ICBBbiBhcnJheSBvZiBwaG90byBvYmplY3RzLgogICAqLwogIHB1YmxpYyBmdW5jdGlvbiAmcGhvdG9zX2dldCgkc3Vial9pZCwgJGFpZCwgJHBpZHMpIHsKICAgIHJldHVybiAkdGhpcy0+Y2FsbF9tZXRob2QoJ2ZhY2Vib29rLnBob3Rvcy5nZXQnLAogICAgICBhcnJheSgnc3Vial9pZCcgPT4gJHN1YmpfaWQsICdhaWQnID0+ICRhaWQsICdwaWRzJyA9PiAkcGlkcykpOwogIH0KCiAgLyoqCiAgICogUmV0dXJucyB0aGUgYWxidW1zIGNyZWF0ZWQgYnkgdGhlIGdpdmVuIHVzZXIuCiAgICoKICAgKiBAcGFyYW0gaW50ICR1aWQgICAgICAoT3B0aW9uYWwpIFRoZSB1aWQgb2YgdGhlIHVzZXIgd2hvc2UgYWxidW1zIHlvdSB3YW50LgogICAqICAgICAgICAgICAgICAgICAgICAgICBBIG51bGwgd2lsbCByZXR1cm4gdGhlIGFsYnVtcyBvZiB0aGUgc2Vzc2lvbiB1c2VyLgogICAqIEBwYXJhbSBzdHJpbmcgJGFpZHMgIChPcHRpb25hbCkgQW4gYXJyYXkgb2YgYWlkcyB0byByZXN0cmljdAogICAqICAgICAgICAgICAgICAgICAgICAgICB0aGUgcXVlcnkuIChjc3YgaXMgZGVwcmVjYXRlZCkKICAgKgogICAqIE5vdGUgdGhhdCBhdCBsZWFzdCBvbmUgb2YgdGhlICh1aWQsIGFpZHMpIHBhcmFtZXRlcnMgbXVzdCBiZSBzcGVjaWZpZWQuCiAgICoKICAgKiBAcmV0dXJucyBhbiBhcnJheSBvZiBhbGJ1bSBvYmplY3RzLgogICAqLwogIHB1YmxpYyBmdW5jdGlvbiAmcGhvdG9zX2dldEFsYnVtcygkdWlkLCAkYWlkcykgewogICAgcmV0dXJuICR0aGlzLT5jYWxsX21ldGhvZCgnZmFjZWJvb2sucGhvdG9zLmdldEFsYnVtcycsCiAgICAgIGFycmF5KCd1aWQnID0+ICR1aWQsCiAgICAgICAgICAgICdhaWRzJyA9PiAkYWlkcykpOwogIH0KCiAgLyoqCiAgICogUmV0dXJucyB0aGUgdGFncyBvbiBhbGwgcGhvdG9zIHNwZWNpZmllZC4KICAgKgogICAqIEBwYXJhbSBzdHJpbmcgJHBpZHMgIEEgbGlzdCBvZiBwaWRzIHRvIHF1ZXJ5CiAgICoKICAgKiBAcmV0dXJuIGFycmF5ICBBbiBhcnJheSBvZiBwaG90byB0YWcgb2JqZWN0cywgd2hpY2ggaW5jbHVkZSBwaWQsCiAgICogICAgICAgICAgICAgICAgc3ViamVjdCB1aWQsIGFuZCB0d28gZmxvYXRpbmctcG9pbnQgbnVtYmVycyAoeGNvb3JkLCB5Y29vcmQpCiAgICogICAgICAgICAgICAgICAgZm9yIHRhZyBwaXhlbCBsb2NhdGlvbi4KICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gJnBob3Rvc19nZXRUYWdzKCRwaWRzKSB7CiAgICByZXR1cm4gJHRoaXMtPmNhbGxfbWV0aG9kKCdmYWNlYm9vay5waG90b3MuZ2V0VGFncycsCiAgICAgIGFycmF5KCdwaWRzJyA9PiAkcGlkcykpOwogIH0KCiAgLyoqCiAgICogVXBsb2FkcyBhIHBob3RvLgogICAqCiAgICogQHBhcmFtIHN0cmluZyAkZmlsZSAgICAgVGhlIGxvY2F0aW9uIG9mIHRoZSBwaG90byBvbiB0aGUgbG9jYWwgZmlsZXN5c3RlbS4KICAgKiBAcGFyYW0gaW50ICRhaWQgICAgICAgICAoT3B0aW9uYWwpIFRoZSBhbGJ1bSBpbnRvIHdoaWNoIHRvIHVwbG9hZCB0aGUKICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBwaG90by4KICAgKiBAcGFyYW0gc3RyaW5nICRjYXB0aW9uICAoT3B0aW9uYWwpIEEgY2FwdGlvbiBmb3IgdGhlIHBob3RvLgogICAqIEBwYXJhbSBpbnQgdWlkICAgICAgICAgIChPcHRpb25hbCkgVGhlIHVzZXIgSUQgb2YgdGhlIHVzZXIgd2hvc2UgcGhvdG8geW91CiAgICogICAgICAgICAgICAgICAgICAgICAgICAgYXJlIHVwbG9hZGluZwogICAqCiAgICogQHJldHVybiBhcnJheSAgQW4gYXJyYXkgb2YgdXNlciBvYmplY3RzCiAgICovCiAgcHVibGljIGZ1bmN0aW9uIHBob3Rvc191cGxvYWQoJGZpbGUsICRhaWQ9bnVsbCwgJGNhcHRpb249bnVsbCwgJHVpZD1udWxsKSB7CiAgICByZXR1cm4gJHRoaXMtPmNhbGxfdXBsb2FkX21ldGhvZCgnZmFjZWJvb2sucGhvdG9zLnVwbG9hZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheSgnYWlkJyA9PiAkYWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NhcHRpb24nID0+ICRjYXB0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VpZCcgPT4gJHVpZCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZmlsZSk7CiAgfQoKCiAgLyoqCiAgICogVXBsb2FkcyBhIHZpZGVvLgogICAqCiAgICogQHBhcmFtICBzdHJpbmcgJGZpbGUgICAgICAgIFRoZSBsb2NhdGlvbiBvZiB0aGUgdmlkZW8gb24gdGhlIGxvY2FsIGZpbGVzeXN0ZW0uCiAgICogQHBhcmFtICBzdHJpbmcgJHRpdGxlICAgICAgIChPcHRpb25hbCkgQSB0aXRsZSBmb3IgdGhlIHZpZGVvLiBUaXRsZXMgb3ZlciA2NSBjaGFyYWN0ZXJzIGluIGxlbmd0aCB3aWxsIGJlIHRydW5jYXRlZC4KICAgKiBAcGFyYW0gIHN0cmluZyAkZGVzY3JpcHRpb24gKE9wdGlvbmFsKSBBIGRlc2NyaXB0aW9uIGZvciB0aGUgdmlkZW8uCiAgICoKICAgKiBAcmV0dXJuIGFycmF5ICBBbiBhcnJheSB3aXRoIHRoZSB2aWRlbydzIElELCB0aXRsZSwgZGVzY3JpcHRpb24sIGFuZCBhIGxpbmsgdG8gdmlldyBpdCBvbiBGYWNlYm9vay4KICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gdmlkZW9fdXBsb2FkKCRmaWxlLCAkdGl0bGU9bnVsbCwgJGRlc2NyaXB0aW9uPW51bGwpIHsKICAgIHJldHVybiAkdGhpcy0+Y2FsbF91cGxvYWRfbWV0aG9kKCdmYWNlYm9vay52aWRlby51cGxvYWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkoJ3RpdGxlJyA9PiAkdGl0bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGVzY3JpcHRpb24nID0+ICRkZXNjcmlwdGlvbiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhY2Vib29rOjpnZXRfZmFjZWJvb2tfdXJsKCdhcGktdmlkZW8nKSAuICcvcmVzdHNlcnZlci5waHAnKTsKICB9CgogIC8qKgogICAqIFJldHVybnMgYW4gYXJyYXkgd2l0aCB0aGUgdmlkZW8gbGltaXRhdGlvbnMgaW1wb3NlZCBvbiB0aGUgY3VycmVudCBzZXNzaW9uJ3MKICAgKiBhc3NvY2lhdGVkIHVzZXIuIE1heGltdW0gbGVuZ3RoIGlzIG1lYXN1cmVkIGluIHNlY29uZHM7IG1heGltdW0gc2l6ZSBpcwogICAqIG1lYXN1cmVkIGluIGJ5dGVzLgogICAqCiAgICogQHJldHVybiBhcnJheSAgQXJyYXkgd2l0aCAibGVuZ3RoIiBhbmQgInNpemUiIGtleXMKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gJnZpZGVvX2dldFVwbG9hZExpbWl0cygpIHsKICAgIHJldHVybiAkdGhpcy0+Y2FsbF9tZXRob2QoJ2ZhY2Vib29rLnZpZGVvLmdldFVwbG9hZExpbWl0cycpOwogIH0KCiAgLyoqCiAgICogUmV0dXJucyB0aGUgcmVxdWVzdGVkIGluZm8gZmllbGRzIGZvciB0aGUgcmVxdWVzdGVkIHNldCBvZiB1c2Vycy4KICAgKgogICAqIEBwYXJhbSBhcnJheS9zdHJpbmcgJHVpZHMgICAgQW4gYXJyYXkgb2YgdXNlciBpZHMgKGNzdiBpcyBkZXByZWNhdGVkKQogICAqIEBwYXJhbSBhcnJheS9zdHJpbmcgJGZpZWxkcyAgQW4gYXJyYXkgb2YgaW5mbyBmaWVsZCBuYW1lcyBkZXNpcmVkIChjc3YgaXMgZGVwcmVjYXRlZCkKICAgKgogICAqIEByZXR1cm4gYXJyYXkgIEFuIGFycmF5IG9mIHVzZXIgb2JqZWN0cwogICAqLwogIHB1YmxpYyBmdW5jdGlvbiAmdXNlcnNfZ2V0SW5mbygkdWlkcywgJGZpZWxkcykgewogICAgcmV0dXJuICR0aGlzLT5jYWxsX21ldGhvZCgnZmFjZWJvb2sudXNlcnMuZ2V0SW5mbycsCiAgICAgICAgICAgICAgICAgIGFycmF5KCd1aWRzJyA9PiAkdWlkcywKICAgICAgICAgICAgICAgICAgICAgICAgJ2ZpZWxkcycgPT4gJGZpZWxkcykpOwogIH0KCiAgLyoqCiAgICogUmV0dXJucyB0aGUgcmVxdWVzdGVkIGluZm8gZmllbGRzIGZvciB0aGUgcmVxdWVzdGVkIHNldCBvZiB1c2Vycy4gQQogICAqIHNlc3Npb24ga2V5IG11c3Qgbm90IGJlIHNwZWNpZmllZC4gT25seSBkYXRhIGFib3V0IHVzZXJzIHRoYXQgaGF2ZQogICAqIGF1dGhvcml6ZWQgeW91ciBhcHBsaWNhdGlvbiB3aWxsIGJlIHJldHVybmVkLgogICAqCiAgICogQ2hlY2sgdGhlIHdpa2kgZm9yIGZpZWxkcyB0aGF0IGNhbiBiZSBxdWVyaWVkIHRocm91Z2ggdGhpcyBBUEkgY2FsbC4KICAgKiBEYXRhIHJldHVybmVkIGZyb20gaGVyZSBzaG91bGQgbm90IGJlIHVzZWQgZm9yIHJlbmRlcmluZyB0byBhcHBsaWNhdGlvbgogICAqIHVzZXJzLCB1c2UgdXNlcnMuZ2V0SW5mbyBpbnN0ZWFkLCBzbyB0aGF0IHByb3BlciBwcml2YWN5IHJ1bGVzIHdpbGwgYmUKICAgKiBhcHBsaWVkLgogICAqCiAgICogQHBhcmFtIGFycmF5L3N0cmluZyAkdWlkcyAgICBBbiBhcnJheSBvZiB1c2VyIGlkcyAoY3N2IGlzIGRlcHJlY2F0ZWQpCiAgICogQHBhcmFtIGFycmF5L3N0cmluZyAkZmllbGRzICBBbiBhcnJheSBvZiBpbmZvIGZpZWxkIG5hbWVzIGRlc2lyZWQgKGNzdiBpcyBkZXByZWNhdGVkKQogICAqCiAgICogQHJldHVybiBhcnJheSAgQW4gYXJyYXkgb2YgdXNlciBvYmplY3RzCiAgICovCiAgcHVibGljIGZ1bmN0aW9uICZ1c2Vyc19nZXRTdGFuZGFyZEluZm8oJHVpZHMsICRmaWVsZHMpIHsKICAgIHJldHVybiAkdGhpcy0+Y2FsbF9tZXRob2QoJ2ZhY2Vib29rLnVzZXJzLmdldFN0YW5kYXJkSW5mbycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5KCd1aWRzJyA9PiAkdWlkcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZpZWxkcycgPT4gJGZpZWxkcykpOwogIH0KCiAgLyoqCiAgICogUmV0dXJucyB0aGUgdXNlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBjdXJyZW50IHNlc3Npb24gb2JqZWN0LgogICAqCiAgICogQHJldHVybiBpbnRlZ2VyICBVc2VyIGlkCiAgICovCiAgcHVibGljIGZ1bmN0aW9uICZ1c2Vyc19nZXRMb2dnZWRJblVzZXIoKSB7CiAgICByZXR1cm4gJHRoaXMtPmNhbGxfbWV0aG9kKCdmYWNlYm9vay51c2Vycy5nZXRMb2dnZWRJblVzZXInKTsKICB9CgogIC8qKgogICAqIFJldHVybnMgMSBpZiB0aGUgdXNlciBoYXMgdGhlIHNwZWNpZmllZCBwZXJtaXNzaW9uLCAwIG90aGVyd2lzZS4KICAgKiBodHRwOi8vd2lraS5kZXZlbG9wZXJzLmZhY2Vib29rLmNvbS9pbmRleC5waHAvVXNlcnMuaGFzQXBwUGVybWlzc2lvbgogICAqCiAgICogQHJldHVybiBpbnRlZ2VyICAxIG9yIDAKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gJnVzZXJzX2hhc0FwcFBlcm1pc3Npb24oJGV4dF9wZXJtLCAkdWlkPW51bGwpIHsKICAgIHJldHVybiAkdGhpcy0+Y2FsbF9tZXRob2QoJ2ZhY2Vib29rLnVzZXJzLmhhc0FwcFBlcm1pc3Npb24nLAogICAgICAgIGFycmF5KCdleHRfcGVybScgPT4gJGV4dF9wZXJtLCAndWlkJyA9PiAkdWlkKSk7CiAgfQoKICAvKioKICAgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSB1c2VyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGN1cnJlbnQKICAgKiBzZXNzaW9uIG9iamVjdCBoYXMgdGhlIGdpdmUgdGhlIGFwcCBiYXNpYyBhdXRob3JpemF0aW9uLgogICAqCiAgICogQHJldHVybiBib29sZWFuICB0cnVlIGlmIHRoZSB1c2VyIGhhcyBhdXRob3JpemVkIHRoZSBhcHAKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gJnVzZXJzX2lzQXBwVXNlcigkdWlkPW51bGwpIHsKICAgIGlmICgkdWlkID09PSBudWxsICYmIGlzc2V0KCR0aGlzLT5pc191c2VyKSkgewogICAgICByZXR1cm4gJHRoaXMtPmlzX3VzZXI7CiAgICB9CgogICAgcmV0dXJuICR0aGlzLT5jYWxsX21ldGhvZCgnZmFjZWJvb2sudXNlcnMuaXNBcHBVc2VyJywgYXJyYXkoJ3VpZCcgPT4gJHVpZCkpOwogIH0KCiAgLyoqCiAgICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgdXNlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBjdXJyZW50CiAgICogc2Vzc2lvbiBvYmplY3QgaXMgdmVyaWZpZWQgYnkgRmFjZWJvb2suIFNlZSB0aGUgZG9jdW1lbnRhdGlvbgogICAqIGZvciBVc2Vycy5pc1ZlcmlmaWVkIGZvciBkZXRhaWxzLgogICAqCiAgICogQHJldHVybiBib29sZWFuICB0cnVlIGlmIHRoZSB1c2VyIGlzIHZlcmlmaWVkCiAgICovCiAgcHVibGljIGZ1bmN0aW9uICZ1c2Vyc19pc1ZlcmlmaWVkKCkgewogICAgcmV0dXJuICR0aGlzLT5jYWxsX21ldGhvZCgnZmFjZWJvb2sudXNlcnMuaXNWZXJpZmllZCcpOwogIH0KCiAgLyoqCiAgICogU2V0cyB0aGUgdXNlcnMnIGN1cnJlbnQgc3RhdHVzIG1lc3NhZ2UuIE1lc3NhZ2UgZG9lcyBOT1QgY29udGFpbiB0aGUKICAgKiB3b3JkICJpcyIgLCBzbyBtYWtlIHN1cmUgdG8gaW5jbHVkZSBhIHZlcmIuCiAgICoKICAgKiBFeGFtcGxlOiBzZXRTdGF0dXMoImlzIGxvdmluZyB0aGUgQVBJISIpCiAgICogd2lsbCBwcm9kdWNlIHRoZSBzdGF0dXMgIkx1a2UgaXMgbG92aW5nIHRoZSBBUEkhIgogICAqCiAgICogQHBhcmFtIHN0cmluZyAkc3RhdHVzICAgICAgICAgICAgICAgIHRleHQtb25seSBtZXNzYWdlIHRvIHNldAogICAqIEBwYXJhbSBpbnQgICAgJHVpZCAgICAgICAgICAgICAgICAgICB1c2VyIHRvIHNldCBmb3IgKGRlZmF1bHRzIHRvIHRoZQogICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZWQtaW4gdXNlcikKICAgKiBAcGFyYW0gYm9vbCAgICRjbGVhciAgICAgICAgICAgICAgICAgd2hldGhlciBvciBub3QgdG8gY2xlYXIgdGhlIHN0YXR1cywKICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGVhZCBvZiBzZXR0aW5nIGl0CiAgICogQHBhcmFtIGJvb2wgICAkc3RhdHVzX2luY2x1ZGVzX3ZlcmIgIGlmIHRydWUsIHRoZSB3b3JkICJpcyIgd2lsbCAqbm90KiBiZQogICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVwZW5kZWQgdG8gdGhlIHN0YXR1cyBtZXNzYWdlCiAgICoKICAgKiBAcmV0dXJuIGJvb2xlYW4KICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gJnVzZXJzX3NldFN0YXR1cygkc3RhdHVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR1aWQgPSBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjbGVhciA9IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzdGF0dXNfaW5jbHVkZXNfdmVyYiA9IHRydWUpIHsKICAgICRhcmdzID0gYXJyYXkoCiAgICAgICdzdGF0dXMnID0+ICRzdGF0dXMsCiAgICAgICd1aWQnID0+ICR1aWQsCiAgICAgICdjbGVhcicgPT4gJGNsZWFyLAogICAgICAnc3RhdHVzX2luY2x1ZGVzX3ZlcmInID0+ICRzdGF0dXNfaW5jbHVkZXNfdmVyYiwKICAgICk7CiAgICByZXR1cm4gJHRoaXMtPmNhbGxfbWV0aG9kKCdmYWNlYm9vay51c2Vycy5zZXRTdGF0dXMnLCAkYXJncyk7CiAgfQoKICAvKioKICAgKiBHZXRzIHRoZSBjb21tZW50cyBmb3IgYSBwYXJ0aWN1bGFyIHhpZC4gVGhpcyBpcyBlc3NlbnRpYWxseSBhIHdyYXBwZXIKICAgKiBhcm91bmQgdGhlIGNvbW1lbnQgRlFMIHRhYmxlLgogICAqCiAgICogQHBhcmFtIHN0cmluZyAkeGlkIGV4dGVybmFsIGlkIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29tbWVudHMKICAgKgogICAqIEByZXR1cm4gYXJyYXkgb2YgY29tbWVudCBvYmplY3RzCiAgICovCiAgcHVibGljIGZ1bmN0aW9uICZjb21tZW50c19nZXQoJHhpZCkgewogICAgJGFyZ3MgPSBhcnJheSgneGlkJyA9PiAkeGlkKTsKICAgIHJldHVybiAkdGhpcy0+Y2FsbF9tZXRob2QoJ2ZhY2Vib29rLmNvbW1lbnRzLmdldCcsICRhcmdzKTsKICB9CgogIC8qKgogICAqIEFkZCBhIGNvbW1lbnQgdG8gYSBwYXJ0aWN1bGFyIHhpZCBvbiBiZWhhbGYgb2YgYSB1c2VyLiBJZiBjYWxsZWQKICAgKiB3aXRob3V0IGFuIGFwcF9zZWNyZXQgKHdpdGggc2Vzc2lvbiBzZWNyZXQpLCB0aGlzIHdpbGwgb25seSB3b3JrCiAgICogZm9yIHRoZSBzZXNzaW9uIHVzZXIuCiAgICoKICAgKiBAcGFyYW0gc3RyaW5nICR4aWQgICBleHRlcm5hbCBpZCBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbW1lbnRzCiAgICogQHBhcmFtIHN0cmluZyAkdGV4dCAgdGV4dCBvZiB0aGUgY29tbWVudAogICAqIEBwYXJhbSBpbnQgICAgJHVpZCAgIHVzZXIgYWRkaW5nIHRoZSBjb21tZW50IChkZWY6IHNlc3Npb24gdXNlcikKICAgKiBAcGFyYW0gc3RyaW5nICR0aXRsZSBvcHRpb25hbCB0aXRsZSBmb3IgdGhlIHN0cmVhbSBzdG9yeQogICAqIEBwYXJhbSBzdHJpbmcgJHVybCAgIG9wdGlvbmFsIHVybCBmb3IgdGhlIHN0cmVhbSBzdG9yeQogICAqIEBwYXJhbSBib29sICAgJHB1Ymxpc2hfdG9fc3RyZWFtIHB1Ymxpc2ggYSBmZWVkIHN0b3J5IGFib3V0IHRoaXMgY29tbWVudD8KICAgKiAgICAgICAgICAgICAgICAgICAgICBhIGxpbmsgd2lsbCBiZSBnZW5lcmF0ZWQgdG8gdGl0bGUvdXJsIGluIHRoZSBzdG9yeQogICAqCiAgICogQHJldHVybiBzdHJpbmcgY29tbWVudF9pZCBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbW1lbnQKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gJmNvbW1lbnRzX2FkZCgkeGlkLCAkdGV4dCwgJHVpZD0wLCAkdGl0bGU9JycsICR1cmw9JycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHB1Ymxpc2hfdG9fc3RyZWFtPWZhbHNlKSB7CiAgICAkYXJncyA9IGFycmF5KAogICAgICAneGlkJyAgICAgICAgICAgICAgID0+ICR4aWQsCiAgICAgICd1aWQnICAgICAgICAgICAgICAgPT4gJHRoaXMtPmdldF91aWQoJHVpZCksCiAgICAgICd0ZXh0JyAgICAgICAgICAgICAgPT4gJHRleHQsCiAgICAgICd0aXRsZScgICAgICAgICAgICAgPT4gJHRpdGxlLAogICAgICAndXJsJyAgICAgICAgICAgICAgID0+ICR1cmwsCiAgICAgICdwdWJsaXNoX3RvX3N0cmVhbScgPT4gJHB1Ymxpc2hfdG9fc3RyZWFtKTsKCiAgICByZXR1cm4gJHRoaXMtPmNhbGxfbWV0aG9kKCdmYWNlYm9vay5jb21tZW50cy5hZGQnLCAkYXJncyk7CiAgfQoKICAvKioKICAgKiBSZW1vdmUgYSBwYXJ0aWN1bGFyIGNvbW1lbnQuCiAgICoKICAgKiBAcGFyYW0gc3RyaW5nICR4aWQgICAgICAgIHRoZSBleHRlcm5hbCBpZCBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbW1lbnRzCiAgICogQHBhcmFtIHN0cmluZyAkY29tbWVudF9pZCBpZCBvZiB0aGUgY29tbWVudCB0byByZW1vdmUgKHJldHVybmVkIGJ5CiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50cy5hZGQgYW5kIGNvbW1lbnRzLmdldCkKICAgKgogICAqIEByZXR1cm4gYm9vbGVhbgogICAqLwogIHB1YmxpYyBmdW5jdGlvbiAmY29tbWVudHNfcmVtb3ZlKCR4aWQsICRjb21tZW50X2lkKSB7CiAgICAkYXJncyA9IGFycmF5KAogICAgICAneGlkJyAgICAgICAgPT4gJHhpZCwKICAgICAgJ2NvbW1lbnRfaWQnID0+ICRjb21tZW50X2lkKTsKICAgIHJldHVybiAkdGhpcy0+Y2FsbF9tZXRob2QoJ2ZhY2Vib29rLmNvbW1lbnRzLnJlbW92ZScsICRhcmdzKTsKICB9CgogIC8qKgogICAqIEdldHMgdGhlIHN0cmVhbSBvbiBiZWhhbGYgb2YgYSB1c2VyIHVzaW5nIGEgc2V0IG9mIHVzZXJzLiBUaGlzCiAgICogY2FsbCB3aWxsIHJldHVybiB0aGUgbGF0ZXN0ICRsaW1pdCBxdWVyaWVzIGJldHdlZW4gJHN0YXJ0X3RpbWUKICAgKiBhbmQgJGVuZF90aW1lLgogICAqCiAgICogQHBhcmFtIGludCAgICAkdmlld2VyX2lkICB1c2VyIG1ha2luZyB0aGUgY2FsbCAoZGVmOiBzZXNzaW9uKQogICAqIEBwYXJhbSBhcnJheSAgJHNvdXJjZV9pZHMgdXNlcnMvcGFnZXMgdG8gbG9vayBhdCAoZGVmOiBhbGwgY29ubmVjdGlvbnMpCiAgICogQHBhcmFtIGludCAgICAkc3RhcnRfdGltZSBzdGFydCB0aW1lIHRvIGxvb2sgZm9yIHN0b3JpZXMgKGRlZjogMSBkYXkgYWdvKQogICAqIEBwYXJhbSBpbnQgICAgJGVuZF90aW1lICAgZW5kIHRpbWUgdG8gbG9vayBmb3Igc3RvcmllcyAoZGVmOiBub3cpCiAgICogQHBhcmFtIGludCAgICAkbGltaXQgICAgICBudW1iZXIgb2Ygc3RvcmllcyB0byBhdHRlbXB0IHRvIGZldGNoIChkZWY6IDMwKQogICAqIEBwYXJhbSBzdHJpbmcgJGZpbHRlcl9rZXkga2V5IHJldHVybmVkIGJ5IHN0cmVhbS5nZXRGaWx0ZXJzIHRvIGZldGNoCiAgICogQHBhcmFtIGFycmF5ICAkbWV0YWRhdGEgICBtZXRhZGF0YSB0byBpbmNsdWRlIHdpdGggdGhlIHJldHVybiwgYWxsb3dzCiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWQgbWV0YWRhdGEgdG8gYmUgcmV0dXJuZWQsIHN1Y2ggYXMKICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVzLCBhbGJ1bXMsIHBob3RvX3RhZ3MKICAgKgogICAqIEByZXR1cm4gYXJyYXkoCiAgICogICAgICAgICAgICdwb3N0cycgICAgICA9PiBhcnJheSBvZiBwb3N0cywKICAgKiAgICAgICAgICAgLy8gaWYgcmVxdWVzdGVkLCB0aGUgZm9sbG93aW5nIGRhdGEgbWF5IGJlIHJldHVybmVkCiAgICogICAgICAgICAgICdwcm9maWxlcycgICA9PiBhcnJheSBvZiBwcm9maWxlIG1ldGFkYXRhIG9mIHVzZXJzL3BhZ2VzIGluIHBvc3RzCiAgICogICAgICAgICAgICdhbGJ1bXMnICAgICA9PiBhcnJheSBvZiBhbGJ1bSBtZXRhZGF0YSBpbiBwb3N0cwogICAqICAgICAgICAgICAncGhvdG9fdGFncycgPT4gYXJyYXkgb2YgcGhvdG9fdGFncyBmb3IgcGhvdG9zIGluIHBvc3RzCiAgICogICAgICAgICApCiAgICovCiAgcHVibGljIGZ1bmN0aW9uICZzdHJlYW1fZ2V0KCR2aWV3ZXJfaWQgPSBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc291cmNlX2lkcyA9IG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzdGFydF90aW1lID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGVuZF90aW1lID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGxpbWl0ID0gMzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmaWx0ZXJfa2V5ID0gJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRleHBvcnRhYmxlX29ubHkgPSBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG1ldGFkYXRhID0gbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHBvc3RfaWRzID0gbnVsbCkgewogICAgJGFyZ3MgPSBhcnJheSgKICAgICAgJ3ZpZXdlcl9pZCcgID0+ICR2aWV3ZXJfaWQsCiAgICAgICdzb3VyY2VfaWRzJyA9PiAkc291cmNlX2lkcywKICAgICAgJ3N0YXJ0X3RpbWUnID0+ICRzdGFydF90aW1lLAogICAgICAnZW5kX3RpbWUnICAgPT4gJGVuZF90aW1lLAogICAgICAnbGltaXQnICAgICAgPT4gJGxpbWl0LAogICAgICAnZmlsdGVyX2tleScgPT4gJGZpbHRlcl9rZXksCiAgICAgICdleHBvcnRhYmxlX29ubHknID0+ICRleHBvcnRhYmxlX29ubHksCiAgICAgICdtZXRhZGF0YScgPT4gJG1ldGFkYXRhLAogICAgICAncG9zdF9pZHMnID0+ICRwb3N0X2lkcyk7CiAgICByZXR1cm4gJHRoaXMtPmNhbGxfbWV0aG9kKCdmYWNlYm9vay5zdHJlYW0uZ2V0JywgJGFyZ3MpOwogIH0KCiAgLyoqCiAgICogR2V0cyB0aGUgZmlsdGVycyAod2l0aCByZWxldmFudCBmaWx0ZXIga2V5cyBmb3Igc3RyZWFtLmdldCkgZm9yIGEKICAgKiBwYXJ0aWN1bGFyIHVzZXIuIFRoZXNlIGZpbHRlcnMgYXJlIHR5cGljYWwgdGhpbmdzIGxpa2UgbmV3cyBmZWVkLAogICAqIGZyaWVuZCBsaXN0cywgbmV0d29ya3MuIFRoZXkgY2FuIGJlIHVzZWQgdG8gZmlsdGVyIHRoZSBzdHJlYW0KICAgKiB3aXRob3V0IGNvbXBsZXggcXVlcmllcyB0byBkZXRlcm1pbmUgd2hpY2ggaWRzIGJlbG9uZyBpbiB3aGljaCBncm91cHMuCiAgICoKICAgKiBAcGFyYW0gaW50ICR1aWQgdXNlciB0byBnZXQgZmlsdGVycyBmb3IKICAgKgogICAqIEByZXR1cm4gYXJyYXkgb2Ygc3RyZWFtIGZpbHRlciBvYmplY3RzCiAgICovCiAgcHVibGljIGZ1bmN0aW9uICZzdHJlYW1fZ2V0RmlsdGVycygkdWlkID0gbnVsbCkgewogICAgJGFyZ3MgPSBhcnJheSgndWlkJyA9PiAkdWlkKTsKICAgIHJldHVybiAkdGhpcy0+Y2FsbF9tZXRob2QoJ2ZhY2Vib29rLnN0cmVhbS5nZXRGaWx0ZXJzJywgJGFyZ3MpOwogIH0KCiAgLyoqCiAgICogR2V0cyB0aGUgZnVsbCBjb21tZW50cyBnaXZlbiBhIHBvc3RfaWQgZnJvbSBzdHJlYW0uZ2V0IG9yIHRoZQogICAqIHN0cmVhbSBGUUwgdGFibGUuIEluaXRpYWxseSwgb25seSBhIHNldCBvZiBwcmV2aWV3IGNvbW1lbnRzIGFyZQogICAqIHJldHVybmVkIGJlY2F1c2Ugc29tZSBwb3N0cyBjYW4gaGF2ZSBtYW55IGNvbW1lbnRzLgogICAqCiAgICogQHBhcmFtIHN0cmluZyAkcG9zdF9pZCBpZCBvZiB0aGUgcG9zdCB0byBnZXQgY29tbWVudHMgZm9yCiAgICoKICAgKiBAcmV0dXJuIGFycmF5IG9mIGNvbW1lbnQgb2JqZWN0cwogICAqLwogIHB1YmxpYyBmdW5jdGlvbiAmc3RyZWFtX2dldENvbW1lbnRzKCRwb3N0X2lkKSB7CiAgICAkYXJncyA9IGFycmF5KCdwb3N0X2lkJyA9PiAkcG9zdF9pZCk7CiAgICByZXR1cm4gJHRoaXMtPmNhbGxfbWV0aG9kKCdmYWNlYm9vay5zdHJlYW0uZ2V0Q29tbWVudHMnLCAkYXJncyk7CiAgfQoKICAvKioKICAgKiBTZXRzIHRoZSBGQk1MIGZvciB0aGUgcHJvZmlsZSBvZiB0aGUgdXNlciBhdHRhY2hlZCB0byB0aGlzIHNlc3Npb24uCiAgICoKICAgKiBAcGFyYW0gICBzdHJpbmcgICAkbWFya3VwICAgICAgICAgICBUaGUgRkJNTCB0aGF0IGRlc2NyaWJlcyB0aGUgcHJvZmlsZQogICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNlbmNlIG9mIHRoaXMgYXBwIGZvciB0aGUgdXNlcgogICAqIEBwYXJhbSAgIGludCAgICAgICR1aWQgICAgICAgICAgICAgIFRoZSB1c2VyCiAgICogQHBhcmFtICAgc3RyaW5nICAgJHByb2ZpbGUgICAgICAgICAgUHJvZmlsZSBGQk1MCiAgICogQHBhcmFtICAgc3RyaW5nICAgJHByb2ZpbGVfYWN0aW9uICAgUHJvZmlsZSBhY3Rpb24gRkJNTCAoZGVwcmVjYXRlZCkKICAgKiBAcGFyYW0gICBzdHJpbmcgICAkbW9iaWxlX3Byb2ZpbGUgICBNb2JpbGUgcHJvZmlsZSBGQk1MCiAgICogQHBhcmFtICAgc3RyaW5nICAgJHByb2ZpbGVfbWFpbiAgICAgTWFpbiBUYWIgcHJvZmlsZSBGQk1MCiAgICoKICAgKiBAcmV0dXJuICBhcnJheSAgQSBsaXN0IG9mIHN0cmluZ3MgZGVzY3JpYmluZyBhbnkgY29tcGlsZSBlcnJvcnMgZm9yIHRoZQogICAqICAgICAgICAgICAgICAgICBzdWJtaXR0ZWQgRkJNTAogICAqLwogIGZ1bmN0aW9uIHByb2ZpbGVfc2V0RkJNTCgkbWFya3VwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAkdWlkPW51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICRwcm9maWxlPScnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAkcHJvZmlsZV9hY3Rpb249JycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICRtb2JpbGVfcHJvZmlsZT0nJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgJHByb2ZpbGVfbWFpbj0nJykgewogICAgcmV0dXJuICR0aGlzLT5jYWxsX21ldGhvZCgnZmFjZWJvb2sucHJvZmlsZS5zZXRGQk1MJywKICAgICAgICBhcnJheSgnbWFya3VwJyA9PiAkbWFya3VwLAogICAgICAgICAgICAgICd1aWQnID0+ICR1aWQsCiAgICAgICAgICAgICAgJ3Byb2ZpbGUnID0+ICRwcm9maWxlLAogICAgICAgICAgICAgICdwcm9maWxlX2FjdGlvbicgPT4gJHByb2ZpbGVfYWN0aW9uLAogICAgICAgICAgICAgICdtb2JpbGVfcHJvZmlsZScgPT4gJG1vYmlsZV9wcm9maWxlLAogICAgICAgICAgICAgICdwcm9maWxlX21haW4nID0+ICRwcm9maWxlX21haW4pKTsKICB9CgogIC8qKgogICAqIEdldHMgdGhlIEZCTUwgZm9yIHRoZSBwcm9maWxlIGJveCB0aGF0IGlzIGN1cnJlbnRseSBzZXQgZm9yIGEgdXNlcidzCiAgICogcHJvZmlsZSAoeW91ciBhcHBsaWNhdGlvbiBzZXQgdGhlIEZCTUwgcHJldmlvdXNseSBieSBjYWxsaW5nIHRoZQogICAqIHByb2ZpbGUuc2V0RkJNTCBtZXRob2QpLgogICAqCiAgICogQHBhcmFtIGludCAkdWlkICAgKE9wdGlvbmFsKSBVc2VyIGlkIHRvIGxvb2t1cDsgZGVmYXVsdHMgdG8gc2Vzc2lvbi4KICAgKiBAcGFyYW0gaW50ICR0eXBlICAoT3B0aW9uYWwpIDEgZm9yIG9yaWdpbmFsIHN0eWxlLCAyIGZvciBwcm9maWxlX21haW4gYm94ZXMKICAgKgogICAqIEByZXR1cm4gc3RyaW5nICBUaGUgRkJNTAogICAqLwogIHB1YmxpYyBmdW5jdGlvbiAmcHJvZmlsZV9nZXRGQk1MKCR1aWQ9bnVsbCwgJHR5cGU9bnVsbCkgewogICAgcmV0dXJuICR0aGlzLT5jYWxsX21ldGhvZCgnZmFjZWJvb2sucHJvZmlsZS5nZXRGQk1MJywKICAgICAgICBhcnJheSgndWlkJyA9PiAkdWlkLAogICAgICAgICAgICAgICd0eXBlJyA9PiAkdHlwZSkpOwogIH0KCiAgLyoqCiAgICogUmV0dXJucyB0aGUgc3BlY2lmaWVkIHVzZXIncyBhcHBsaWNhdGlvbiBpbmZvIHNlY3Rpb24gZm9yIHRoZSBjYWxsaW5nCiAgICogYXBwbGljYXRpb24uIFRoZXNlIGluZm8gc2VjdGlvbnMgaGF2ZSBlaXRoZXIgYmVlbiBzZXQgdmlhIGEgcHJldmlvdXMKICAgKiBwcm9maWxlLnNldEluZm8gY2FsbCBvciBieSB0aGUgdXNlciBlZGl0aW5nIHRoZW0gZGlyZWN0bHkuCiAgICoKICAgKiBAcGFyYW0gaW50ICR1aWQgIChPcHRpb25hbCkgVXNlciBpZCB0byBsb29rdXA7IGRlZmF1bHRzIHRvIHNlc3Npb24uCiAgICoKICAgKiBAcmV0dXJuIGFycmF5ICBJbmZvIGZpZWxkcyBmb3IgdGhlIGN1cnJlbnQgdXNlci4gIFNlZSB3aWtpIGZvciBzdHJ1Y3R1cmU6CiAgICoKICAgKiAgaHR0cDovL3dpa2kuZGV2ZWxvcGVycy5mYWNlYm9vay5jb20vaW5kZXgucGhwL1Byb2ZpbGUuZ2V0SW5mbwogICAqCiAgICovCiAgcHVibGljIGZ1bmN0aW9uICZwcm9maWxlX2dldEluZm8oJHVpZD1udWxsKSB7CiAgICByZXR1cm4gJHRoaXMtPmNhbGxfbWV0aG9kKCdmYWNlYm9vay5wcm9maWxlLmdldEluZm8nLAogICAgICAgIGFycmF5KCd1aWQnID0+ICR1aWQpKTsKICB9CgogIC8qKgogICAqIFJldHVybnMgdGhlIG9wdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgaW5mbyBmaWVsZCBmb3IgYW4KICAgKiBhcHBsaWNhdGlvbiBpbmZvIHNlY3Rpb24uCiAgICoKICAgKiBAcGFyYW0gc3RyaW5nICRmaWVsZCAgVGhlIHRpdGxlIG9mIHRoZSBmaWVsZAogICAqCiAgICogQHJldHVybiBhcnJheSAgQW4gYXJyYXkgb2YgaW5mbyBvcHRpb25zLgogICAqLwogIHB1YmxpYyBmdW5jdGlvbiAmcHJvZmlsZV9nZXRJbmZvT3B0aW9ucygkZmllbGQpIHsKICAgIHJldHVybiAkdGhpcy0+Y2FsbF9tZXRob2QoJ2ZhY2Vib29rLnByb2ZpbGUuZ2V0SW5mb09wdGlvbnMnLAogICAgICAgIGFycmF5KCdmaWVsZCcgPT4gJGZpZWxkKSk7CiAgfQoKICAvKioKICAgKiBDb25maWd1cmVzIGFuIGFwcGxpY2F0aW9uIGluZm8gc2VjdGlvbiB0aGF0IHRoZSBzcGVjaWZpZWQgdXNlciBjYW4gaW5zdGFsbAogICAqIG9uIHRoZSBJbmZvIHRhYiBvZiBoZXIgcHJvZmlsZS4gIEZvciBkZXRhaWxzIG9uIHRoZSBzdHJ1Y3R1cmUgb2YgYW4gaW5mbwogICAqIGZpZWxkLCBwbGVhc2Ugc2VlOgogICAqCiAgICogIGh0dHA6Ly93aWtpLmRldmVsb3BlcnMuZmFjZWJvb2suY29tL2luZGV4LnBocC9Qcm9maWxlLnNldEluZm8KICAgKgogICAqIEBwYXJhbSBzdHJpbmcgJHRpdGxlICAgICAgIFRpdGxlIC8gaGVhZGVyIG9mIHRoZSBpbmZvIHNlY3Rpb24KICAgKiBAcGFyYW0gaW50ICR0eXBlICAgICAgICAgICAxIGZvciB0ZXh0LW9ubHksIDUgZm9yIHRodW1ibmFpbCB2aWV3cwogICAqIEBwYXJhbSBhcnJheSAkaW5mb19maWVsZHMgIEFuIGFycmF5IG9mIGluZm8gZmllbGRzLiBTZWUgd2lraSBmb3IgZGV0YWlscy4KICAgKiBAcGFyYW0gaW50ICR1aWQgICAgICAgICAgICAoT3B0aW9uYWwpCiAgICoKICAgKiBAcmV0dXJuIGJvb2wgIHRydWUgb24gc3VjY2VzcwogICAqLwogIHB1YmxpYyBmdW5jdGlvbiAmcHJvZmlsZV9zZXRJbmZvKCR0aXRsZSwgJHR5cGUsICRpbmZvX2ZpZWxkcywgJHVpZD1udWxsKSB7CiAgICByZXR1cm4gJHRoaXMtPmNhbGxfbWV0aG9kKCdmYWNlYm9vay5wcm9maWxlLnNldEluZm8nLAogICAgICAgIGFycmF5KCd1aWQnID0+ICR1aWQsCiAgICAgICAgICAgICAgJ3R5cGUnID0+ICR0eXBlLAogICAgICAgICAgICAgICd0aXRsZScgICA9PiAkdGl0bGUsCiAgICAgICAgICAgICAgJ2luZm9fZmllbGRzJyA9PiBqc29uX2VuY29kZSgkaW5mb19maWVsZHMpKSk7CiAgfQoKICAvKioKICAgKiBTcGVjaWZpZXMgdGhlIG9iamVjdHMgZm9yIGEgZmllbGQgZm9yIGFuIGFwcGxpY2F0aW9uIGluZm8gc2VjdGlvbi4gVGhlc2UKICAgKiBvcHRpb25zIHBvcHVsYXRlIHRoZSB0eXBlYWhlYWQgZm9yIGEgdGh1bWJuYWlsLgogICAqCiAgICogQHBhcmFtIHN0cmluZyAkZmllbGQgICBUaGUgdGl0bGUgb2YgdGhlIGZpZWxkCiAgICogQHBhcmFtIGFycmF5ICRvcHRpb25zICBBbiBhcnJheSBvZiBpdGVtcyBmb3IgYSB0aHVtYm5haWwsIGluY2x1ZGluZwogICAqICAgICAgICAgICAgICAgICAgICAgICAgJ2xhYmVsJywgJ2xpbmsnLCBhbmQgb3B0aW9uYWxseSAnaW1hZ2UnLAogICAqICAgICAgICAgICAgICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJyBhbmQgJ3N1YmxhYmVsJwogICAqCiAgICogQHJldHVybiBib29sICB0cnVlIG9uIHN1Y2Nlc3MKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gcHJvZmlsZV9zZXRJbmZvT3B0aW9ucygkZmllbGQsICRvcHRpb25zKSB7CiAgICByZXR1cm4gJHRoaXMtPmNhbGxfbWV0aG9kKCdmYWNlYm9vay5wcm9maWxlLnNldEluZm9PcHRpb25zJywKICAgICAgICBhcnJheSgnZmllbGQnICAgPT4gJGZpZWxkLAogICAgICAgICAgICAgICdvcHRpb25zJyA9PiBqc29uX2VuY29kZSgkb3B0aW9ucykpKTsKICB9CgogIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgLy8gRGF0YSBTdG9yZSBBUEkKCiAgLyoqCiAgICogU2V0IGEgdXNlciBwcmVmZXJlbmNlLgogICAqCiAgICogQHBhcmFtICBwcmVmX2lkICAgIHByZWZlcmVuY2UgaWRlbnRpZmllciAoMC0yMDApCiAgICogQHBhcmFtICB2YWx1ZSAgICAgIHByZWZlcmVjZSdzIHZhbHVlCiAgICogQHBhcmFtICB1aWQgICAgICAgIHRoZSB1c2VyIGlkIChkZWZhdWx0cyB0byBjdXJyZW50IHNlc3Npb24gdXNlcikKICAgKiBAZXJyb3IKICAgKiAgICBBUElfRUNfREFUQV9EQVRBQkFTRV9FUlJPUgogICAqICAgIEFQSV9FQ19QQVJBTQogICAqICAgIEFQSV9FQ19EQVRBX1FVT1RBX0VYQ0VFREVECiAgICogICAgQVBJX0VDX0RBVEFfVU5LTk9XTl9FUlJPUgogICAqICAgIEFQSV9FQ19QRVJNSVNTSU9OX09USEVSX1VTRVIKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gJmRhdGFfc2V0VXNlclByZWZlcmVuY2UoJHByZWZfaWQsICR2YWx1ZSwgJHVpZCA9IG51bGwpIHsKICAgIHJldHVybiAkdGhpcy0+Y2FsbF9tZXRob2QoJ2ZhY2Vib29rLmRhdGEuc2V0VXNlclByZWZlcmVuY2UnLAogICAgICAgYXJyYXkoJ3ByZWZfaWQnID0+ICRwcmVmX2lkLAogICAgICAgICAgICAgJ3ZhbHVlJyA9PiAkdmFsdWUsCiAgICAgICAgICAgICAndWlkJyA9PiAkdGhpcy0+Z2V0X3VpZCgkdWlkKSkpOwogIH0KCiAgLyoqCiAgICogU2V0IGEgdXNlcidzIGFsbCBwcmVmZXJlbmNlcyBmb3IgdGhpcyBhcHBsaWNhdGlvbi4KICAgKgogICAqIEBwYXJhbSAgdmFsdWVzICAgICBwcmVmZXJlY2UgdmFsdWVzIGluIGFuIGFzc29jaWF0aXZlIGFycmF5cwogICAqIEBwYXJhbSAgcmVwbGFjZSAgICB3aGV0aGVyIHRvIHJlcGxhY2UgYWxsIGV4aXN0aW5nIHByZWZlcmVuY2VzIG9yCiAgICogICAgICAgICAgICAgICAgICAgIG1lcmdlIGludG8gdGhlbS4KICAgKiBAcGFyYW0gIHVpZCAgICAgICAgdGhlIHVzZXIgaWQgKGRlZmF1bHRzIHRvIGN1cnJlbnQgc2Vzc2lvbiB1c2VyKQogICAqIEBlcnJvcgogICAqICAgIEFQSV9FQ19EQVRBX0RBVEFCQVNFX0VSUk9SCiAgICogICAgQVBJX0VDX1BBUkFNCiAgICogICAgQVBJX0VDX0RBVEFfUVVPVEFfRVhDRUVERUQKICAgKiAgICBBUElfRUNfREFUQV9VTktOT1dOX0VSUk9SCiAgICogICAgQVBJX0VDX1BFUk1JU1NJT05fT1RIRVJfVVNFUgogICAqLwogIHB1YmxpYyBmdW5jdGlvbiAmZGF0YV9zZXRVc2VyUHJlZmVyZW5jZXMoJHZhbHVlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyZXBsYWNlID0gZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdWlkID0gbnVsbCkgewogICAgcmV0dXJuICR0aGlzLT5jYWxsX21ldGhvZCgnZmFjZWJvb2suZGF0YS5zZXRVc2VyUHJlZmVyZW5jZXMnLAogICAgICAgYXJyYXkoJ3ZhbHVlcycgPT4ganNvbl9lbmNvZGUoJHZhbHVlcyksCiAgICAgICAgICAgICAncmVwbGFjZScgPT4gJHJlcGxhY2UsCiAgICAgICAgICAgICAndWlkJyA9PiAkdGhpcy0+Z2V0X3VpZCgkdWlkKSkpOwogIH0KCiAgLyoqCiAgICogR2V0IGEgdXNlciBwcmVmZXJlbmNlLgogICAqCiAgICogQHBhcmFtICBwcmVmX2lkICAgIHByZWZlcmVuY2UgaWRlbnRpZmllciAoMC0yMDApCiAgICogQHBhcmFtICB1aWQgICAgICAgIHRoZSB1c2VyIGlkIChkZWZhdWx0cyB0byBjdXJyZW50IHNlc3Npb24gdXNlcikKICAgKiBAcmV0dXJuICAgICAgICAgICAgcHJlZmVyZW5jZSdzIHZhbHVlCiAgICogQGVycm9yCiAgICogICAgQVBJX0VDX0RBVEFfREFUQUJBU0VfRVJST1IKICAgKiAgICBBUElfRUNfUEFSQU0KICAgKiAgICBBUElfRUNfREFUQV9RVU9UQV9FWENFRURFRAogICAqICAgIEFQSV9FQ19EQVRBX1VOS05PV05fRVJST1IKICAgKiAgICBBUElfRUNfUEVSTUlTU0lPTl9PVEhFUl9VU0VSCiAgICovCiAgcHVibGljIGZ1bmN0aW9uICZkYXRhX2dldFVzZXJQcmVmZXJlbmNlKCRwcmVmX2lkLCAkdWlkID0gbnVsbCkgewogICAgcmV0dXJuICR0aGlzLT5jYWxsX21ldGhvZCgnZmFjZWJvb2suZGF0YS5nZXRVc2VyUHJlZmVyZW5jZScsCiAgICAgICBhcnJheSgncHJlZl9pZCcgPT4gJHByZWZfaWQsCiAgICAgICAgICAgICAndWlkJyA9PiAkdGhpcy0+Z2V0X3VpZCgkdWlkKSkpOwogIH0KCiAgLyoqCiAgICogR2V0IGEgdXNlciBwcmVmZXJlbmNlLgogICAqCiAgICogQHBhcmFtICB1aWQgICAgICAgIHRoZSB1c2VyIGlkIChkZWZhdWx0cyB0byBjdXJyZW50IHNlc3Npb24gdXNlcikKICAgKiBAcmV0dXJuICAgICAgICAgICAgcHJlZmVyZW5jZSB2YWx1ZXMKICAgKiBAZXJyb3IKICAgKiAgICBBUElfRUNfREFUQV9EQVRBQkFTRV9FUlJPUgogICAqICAgIEFQSV9FQ19EQVRBX1FVT1RBX0VYQ0VFREVECiAgICogICAgQVBJX0VDX0RBVEFfVU5LTk9XTl9FUlJPUgogICAqICAgIEFQSV9FQ19QRVJNSVNTSU9OX09USEVSX1VTRVIKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gJmRhdGFfZ2V0VXNlclByZWZlcmVuY2VzKCR1aWQgPSBudWxsKSB7CiAgICByZXR1cm4gJHRoaXMtPmNhbGxfbWV0aG9kKCdmYWNlYm9vay5kYXRhLmdldFVzZXJQcmVmZXJlbmNlcycsCiAgICAgICBhcnJheSgndWlkJyA9PiAkdGhpcy0+Z2V0X3VpZCgkdWlkKSkpOwogIH0KCiAgLyoqCiAgICogQ3JlYXRlIGEgbmV3IG9iamVjdCB0eXBlLgogICAqCiAgICogQHBhcmFtICBuYW1lICAgICAgIG9iamVjdCB0eXBlJ3MgbmFtZQogICAqIEBlcnJvcgogICAqICAgIEFQSV9FQ19EQVRBX0RBVEFCQVNFX0VSUk9SCiAgICogICAgQVBJX0VDX0RBVEFfT0JKRUNUX0FMUkVBRFlfRVhJU1RTCiAgICogICAgQVBJX0VDX1BBUkFNCiAgICogICAgQVBJX0VDX1BFUk1JU1NJT04KICAgKiAgICBBUElfRUNfREFUQV9JTlZBTElEX09QRVJBVElPTgogICAqICAgIEFQSV9FQ19EQVRBX1FVT1RBX0VYQ0VFREVECiAgICogICAgQVBJX0VDX0RBVEFfVU5LTk9XTl9FUlJPUgogICAqLwogIHB1YmxpYyBmdW5jdGlvbiAmZGF0YV9jcmVhdGVPYmplY3RUeXBlKCRuYW1lKSB7CiAgICByZXR1cm4gJHRoaXMtPmNhbGxfbWV0aG9kKCdmYWNlYm9vay5kYXRhLmNyZWF0ZU9iamVjdFR5cGUnLAogICAgICAgYXJyYXkoJ25hbWUnID0+ICRuYW1lKSk7CiAgfQoKICAvKioKICAgKiBEZWxldGUgYW4gb2JqZWN0IHR5cGUuCiAgICoKICAgKiBAcGFyYW0gIG9ial90eXBlICAgICAgIG9iamVjdCB0eXBlJ3MgbmFtZQogICAqIEBlcnJvcgogICAqICAgIEFQSV9FQ19EQVRBX0RBVEFCQVNFX0VSUk9SCiAgICogICAgQVBJX0VDX0RBVEFfT0JKRUNUX05PVF9GT1VORAogICAqICAgIEFQSV9FQ19QQVJBTQogICAqICAgIEFQSV9FQ19QRVJNSVNTSU9OCiAgICogICAgQVBJX0VDX0RBVEFfSU5WQUxJRF9PUEVSQVRJT04KICAgKiAgICBBUElfRUNfREFUQV9RVU9UQV9FWENFRURFRAogICAqICAgIEFQSV9FQ19EQVRBX1VOS05PV05fRVJST1IKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gJmRhdGFfZHJvcE9iamVjdFR5cGUoJG9ial90eXBlKSB7CiAgICByZXR1cm4gJHRoaXMtPmNhbGxfbWV0aG9kKCdmYWNlYm9vay5kYXRhLmRyb3BPYmplY3RUeXBlJywKICAgICAgIGFycmF5KCdvYmpfdHlwZScgPT4gJG9ial90eXBlKSk7CiAgfQoKICAvKioKICAgKiBSZW5hbWUgYW4gb2JqZWN0IHR5cGUuCiAgICoKICAgKiBAcGFyYW0gIG9ial90eXBlICAgICAgIG9iamVjdCB0eXBlJ3MgbmFtZQogICAqIEBwYXJhbSAgbmV3X25hbWUgICAgICAgbmV3IG9iamVjdCB0eXBlJ3MgbmFtZQogICAqIEBlcnJvcgogICAqICAgIEFQSV9FQ19EQVRBX0RBVEFCQVNFX0VSUk9SCiAgICogICAgQVBJX0VDX0RBVEFfT0JKRUNUX05PVF9GT1VORAogICAqICAgIEFQSV9FQ19EQVRBX09CSkVDVF9BTFJFQURZX0VYSVNUUwogICAqICAgIEFQSV9FQ19QQVJBTQogICAqICAgIEFQSV9FQ19QRVJNSVNTSU9OCiAgICogICAgQVBJX0VDX0RBVEFfSU5WQUxJRF9PUEVSQVRJT04KICAgKiAgICBBUElfRUNfREFUQV9RVU9UQV9FWENFRURFRAogICAqICAgIEFQSV9FQ19EQVRBX1VOS05PV05fRVJST1IKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gJmRhdGFfcmVuYW1lT2JqZWN0VHlwZSgkb2JqX3R5cGUsICRuZXdfbmFtZSkgewogICAgcmV0dXJuICR0aGlzLT5jYWxsX21ldGhvZCgnZmFjZWJvb2suZGF0YS5yZW5hbWVPYmplY3RUeXBlJywKICAgICAgIGFycmF5KCdvYmpfdHlwZScgPT4gJG9ial90eXBlLAogICAgICAgICAgICAgJ25ld19uYW1lJyA9PiAkbmV3X25hbWUpKTsKICB9CgogIC8qKgogICAqIEFkZCBhIG5ldyBwcm9wZXJ0eSB0byBhbiBvYmplY3QgdHlwZS4KICAgKgogICAqIEBwYXJhbSAgb2JqX3R5cGUgICAgICAgb2JqZWN0IHR5cGUncyBuYW1lCiAgICogQHBhcmFtICBwcm9wX25hbWUgICAgICBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBhZGQKICAgKiBAcGFyYW0gIHByb3BfdHlwZSAgICAgIDE6IGludGVnZXI7IDI6IHN0cmluZzsgMzogdGV4dCBibG9iCiAgICogQGVycm9yCiAgICogICAgQVBJX0VDX0RBVEFfREFUQUJBU0VfRVJST1IKICAgKiAgICBBUElfRUNfREFUQV9PQkpFQ1RfQUxSRUFEWV9FWElTVFMKICAgKiAgICBBUElfRUNfUEFSQU0KICAgKiAgICBBUElfRUNfUEVSTUlTU0lPTgogICAqICAgIEFQSV9FQ19EQVRBX0lOVkFMSURfT1BFUkFUSU9OCiAgICogICAgQVBJX0VDX0RBVEFfUVVPVEFfRVhDRUVERUQKICAgKiAgICBBUElfRUNfREFUQV9VTktOT1dOX0VSUk9SCiAgICovCiAgcHVibGljIGZ1bmN0aW9uICZkYXRhX2RlZmluZU9iamVjdFByb3BlcnR5KCRvYmpfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHByb3BfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHByb3BfdHlwZSkgewogICAgcmV0dXJuICR0aGlzLT5jYWxsX21ldGhvZCgnZmFjZWJvb2suZGF0YS5kZWZpbmVPYmplY3RQcm9wZXJ0eScsCiAgICAgICBhcnJheSgnb2JqX3R5cGUnID0+ICRvYmpfdHlwZSwKICAgICAgICAgICAgICdwcm9wX25hbWUnID0+ICRwcm9wX25hbWUsCiAgICAgICAgICAgICAncHJvcF90eXBlJyA9PiAkcHJvcF90eXBlKSk7CiAgfQoKICAvKioKICAgKiBSZW1vdmUgYSBwcmV2aW91c2x5IGRlZmluZWQgcHJvcGVydHkgZnJvbSBhbiBvYmplY3QgdHlwZS4KICAgKgogICAqIEBwYXJhbSAgb2JqX3R5cGUgICAgICBvYmplY3QgdHlwZSdzIG5hbWUKICAgKiBAcGFyYW0gIHByb3BfbmFtZSAgICAgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gcmVtb3ZlCiAgICogQGVycm9yCiAgICogICAgQVBJX0VDX0RBVEFfREFUQUJBU0VfRVJST1IKICAgKiAgICBBUElfRUNfREFUQV9PQkpFQ1RfTk9UX0ZPVU5ECiAgICogICAgQVBJX0VDX1BBUkFNCiAgICogICAgQVBJX0VDX1BFUk1JU1NJT04KICAgKiAgICBBUElfRUNfREFUQV9JTlZBTElEX09QRVJBVElPTgogICAqICAgIEFQSV9FQ19EQVRBX1FVT1RBX0VYQ0VFREVECiAgICogICAgQVBJX0VDX0RBVEFfVU5LTk9XTl9FUlJPUgogICAqLwogIHB1YmxpYyBmdW5jdGlvbiAmZGF0YV91bmRlZmluZU9iamVjdFByb3BlcnR5KCRvYmpfdHlwZSwgJHByb3BfbmFtZSkgewogICAgcmV0dXJuICR0aGlzLT5jYWxsX21ldGhvZCgnZmFjZWJvb2suZGF0YS51bmRlZmluZU9iamVjdFByb3BlcnR5JywKICAgICAgIGFycmF5KCdvYmpfdHlwZScgPT4gJG9ial90eXBlLAogICAgICAgICAgICAgJ3Byb3BfbmFtZScgPT4gJHByb3BfbmFtZSkpOwogIH0KCiAgLyoqCiAgICogUmVuYW1lIGEgcHJldmlvdXNseSBkZWZpbmVkIHByb3BlcnR5IG9mIGFuIG9iamVjdCB0eXBlLgogICAqCiAgICogQHBhcmFtICBvYmpfdHlwZSAgICAgIG9iamVjdCB0eXBlJ3MgbmFtZQogICAqIEBwYXJhbSAgcHJvcF9uYW1lICAgICBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byByZW5hbWUKICAgKiBAcGFyYW0gIG5ld19uYW1lICAgICAgbmV3IG5hbWUgdG8gdXNlCiAgICogQGVycm9yCiAgICogICAgQVBJX0VDX0RBVEFfREFUQUJBU0VfRVJST1IKICAgKiAgICBBUElfRUNfREFUQV9PQkpFQ1RfTk9UX0ZPVU5ECiAgICogICAgQVBJX0VDX0RBVEFfT0JKRUNUX0FMUkVBRFlfRVhJU1RTCiAgICogICAgQVBJX0VDX1BBUkFNCiAgICogICAgQVBJX0VDX1BFUk1JU1NJT04KICAgKiAgICBBUElfRUNfREFUQV9JTlZBTElEX09QRVJBVElPTgogICAqICAgIEFQSV9FQ19EQVRBX1FVT1RBX0VYQ0VFREVECiAgICogICAgQVBJX0VDX0RBVEFfVU5LTk9XTl9FUlJPUgogICAqLwogIHB1YmxpYyBmdW5jdGlvbiAmZGF0YV9yZW5hbWVPYmplY3RQcm9wZXJ0eSgkb2JqX3R5cGUsICRwcm9wX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG5ld19uYW1lKSB7CiAgICByZXR1cm4gJHRoaXMtPmNhbGxfbWV0aG9kKCdmYWNlYm9vay5kYXRhLnJlbmFtZU9iamVjdFByb3BlcnR5JywKICAgICAgIGFycmF5KCdvYmpfdHlwZScgPT4gJG9ial90eXBlLAogICAgICAgICAgICAgJ3Byb3BfbmFtZScgPT4gJHByb3BfbmFtZSwKICAgICAgICAgICAgICduZXdfbmFtZScgPT4gJG5ld19uYW1lKSk7CiAgfQoKICAvKioKICAgKiBSZXRyaWV2ZSBhIGxpc3Qgb2YgYWxsIG9iamVjdCB0eXBlcyB0aGF0IGhhdmUgZGVmaW5lZCBmb3IgdGhlIGFwcGxpY2F0aW9uLgogICAqCiAgICogQHJldHVybiAgICAgICAgICAgICAgIGEgbGlzdCBvZiBvYmplY3QgdHlwZSBuYW1lcwogICAqIEBlcnJvcgogICAqICAgIEFQSV9FQ19EQVRBX0RBVEFCQVNFX0VSUk9SCiAgICogICAgQVBJX0VDX1BFUk1JU1NJT04KICAgKiAgICBBUElfRUNfREFUQV9RVU9UQV9FWENFRURFRAogICAqICAgIEFQSV9FQ19EQVRBX1VOS05PV05fRVJST1IKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gJmRhdGFfZ2V0T2JqZWN0VHlwZXMoKSB7CiAgICByZXR1cm4gJHRoaXMtPmNhbGxfbWV0aG9kKCdmYWNlYm9vay5kYXRhLmdldE9iamVjdFR5cGVzJyk7CiAgfQoKICAvKioKICAgKiBHZXQgZGVmaW5pdGlvbnMgb2YgYWxsIHByb3BlcnRpZXMgb2YgYW4gb2JqZWN0IHR5cGUuCiAgICoKICAgKiBAcGFyYW0gb2JqX3R5cGUgICAgICAgb2JqZWN0IHR5cGUncyBuYW1lCiAgICogQHJldHVybiAgICAgICAgICAgICAgIHBhaXJzIG9mIHByb3BlcnR5IG5hbWUgYW5kIHByb3BlcnR5IHR5cGVzCiAgICogQGVycm9yCiAgICogICAgQVBJX0VDX0RBVEFfREFUQUJBU0VfRVJST1IKICAgKiAgICBBUElfRUNfUEFSQU0KICAgKiAgICBBUElfRUNfUEVSTUlTU0lPTgogICAqICAgIEFQSV9FQ19EQVRBX09CSkVDVF9OT1RfRk9VTkQKICAgKiAgICBBUElfRUNfREFUQV9RVU9UQV9FWENFRURFRAogICAqICAgIEFQSV9FQ19EQVRBX1VOS05PV05fRVJST1IKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gJmRhdGFfZ2V0T2JqZWN0VHlwZSgkb2JqX3R5cGUpIHsKICAgIHJldHVybiAkdGhpcy0+Y2FsbF9tZXRob2QoJ2ZhY2Vib29rLmRhdGEuZ2V0T2JqZWN0VHlwZScsCiAgICAgICBhcnJheSgnb2JqX3R5cGUnID0+ICRvYmpfdHlwZSkpOwogIH0KCiAgLyoqCiAgICogQ3JlYXRlIGEgbmV3IG9iamVjdC4KICAgKgogICAqIEBwYXJhbSAgb2JqX3R5cGUgICAgICBvYmplY3QgdHlwZSdzIG5hbWUKICAgKiBAcGFyYW0gIHByb3BlcnRpZXMgICAgKG9wdGlvbmFsKSBwcm9wZXJ0aWVzIHRvIHNldCBpbml0aWFsbHkKICAgKiBAcmV0dXJuICAgICAgICAgICAgICAgbmV3bHkgY3JlYXRlZCBvYmplY3QncyBpZAogICAqIEBlcnJvcgogICAqICAgIEFQSV9FQ19EQVRBX0RBVEFCQVNFX0VSUk9SCiAgICogICAgQVBJX0VDX1BBUkFNCiAgICogICAgQVBJX0VDX1BFUk1JU1NJT04KICAgKiAgICBBUElfRUNfREFUQV9JTlZBTElEX09QRVJBVElPTgogICAqICAgIEFQSV9FQ19EQVRBX1FVT1RBX0VYQ0VFREVECiAgICogICAgQVBJX0VDX0RBVEFfVU5LTk9XTl9FUlJPUgogICAqLwogIHB1YmxpYyBmdW5jdGlvbiAmZGF0YV9jcmVhdGVPYmplY3QoJG9ial90eXBlLCAkcHJvcGVydGllcyA9IG51bGwpIHsKICAgIHJldHVybiAkdGhpcy0+Y2FsbF9tZXRob2QoJ2ZhY2Vib29rLmRhdGEuY3JlYXRlT2JqZWN0JywKICAgICAgIGFycmF5KCdvYmpfdHlwZScgPT4gJG9ial90eXBlLAogICAgICAgICAgICAgJ3Byb3BlcnRpZXMnID0+IGpzb25fZW5jb2RlKCRwcm9wZXJ0aWVzKSkpOwogIH0KCiAgLyoqCiAgICogVXBkYXRlIGFuIGV4aXN0aW5nIG9iamVjdC4KICAgKgogICAqIEBwYXJhbSAgb2JqX2lkICAgICAgICBvYmplY3QncyBpZAogICAqIEBwYXJhbSAgcHJvcGVydGllcyAgICBuZXcgcHJvcGVydGllcwogICAqIEBwYXJhbSAgcmVwbGFjZSAgICAgICB0cnVlIGZvciByZXBsYWNpbmcgZXhpc3RpbmcgcHJvcGVydGllczsKICAgKiAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgZm9yIG1lcmdpbmcKICAgKiBAZXJyb3IKICAgKiAgICBBUElfRUNfREFUQV9EQVRBQkFTRV9FUlJPUgogICAqICAgIEFQSV9FQ19EQVRBX09CSkVDVF9OT1RfRk9VTkQKICAgKiAgICBBUElfRUNfUEFSQU0KICAgKiAgICBBUElfRUNfUEVSTUlTU0lPTgogICAqICAgIEFQSV9FQ19EQVRBX0lOVkFMSURfT1BFUkFUSU9OCiAgICogICAgQVBJX0VDX0RBVEFfUVVPVEFfRVhDRUVERUQKICAgKiAgICBBUElfRUNfREFUQV9VTktOT1dOX0VSUk9SCiAgICovCiAgcHVibGljIGZ1bmN0aW9uICZkYXRhX3VwZGF0ZU9iamVjdCgkb2JqX2lkLCAkcHJvcGVydGllcywgJHJlcGxhY2UgPSBmYWxzZSkgewogICAgcmV0dXJuICR0aGlzLT5jYWxsX21ldGhvZCgnZmFjZWJvb2suZGF0YS51cGRhdGVPYmplY3QnLAogICAgICAgYXJyYXkoJ29ial9pZCcgPT4gJG9ial9pZCwKICAgICAgICAgICAgICdwcm9wZXJ0aWVzJyA9PiBqc29uX2VuY29kZSgkcHJvcGVydGllcyksCiAgICAgICAgICAgICAncmVwbGFjZScgPT4gJHJlcGxhY2UpKTsKICB9CgogIC8qKgogICAqIERlbGV0ZSBhbiBleGlzdGluZyBvYmplY3QuCiAgICoKICAgKiBAcGFyYW0gIG9ial9pZCAgICAgICAgb2JqZWN0J3MgaWQKICAgKiBAZXJyb3IKICAgKiAgICBBUElfRUNfREFUQV9EQVRBQkFTRV9FUlJPUgogICAqICAgIEFQSV9FQ19EQVRBX09CSkVDVF9OT1RfRk9VTkQKICAgKiAgICBBUElfRUNfUEFSQU0KICAgKiAgICBBUElfRUNfUEVSTUlTU0lPTgogICAqICAgIEFQSV9FQ19EQVRBX0lOVkFMSURfT1BFUkFUSU9OCiAgICogICAgQVBJX0VDX0RBVEFfUVVPVEFfRVhDRUVERUQKICAgKiAgICBBUElfRUNfREFUQV9VTktOT1dOX0VSUk9SCiAgICovCiAgcHVibGljIGZ1bmN0aW9uICZkYXRhX2RlbGV0ZU9iamVjdCgkb2JqX2lkKSB7CiAgICByZXR1cm4gJHRoaXMtPmNhbGxfbWV0aG9kKCdmYWNlYm9vay5kYXRhLmRlbGV0ZU9iamVjdCcsCiAgICAgICBhcnJheSgnb2JqX2lkJyA9PiAkb2JqX2lkKSk7CiAgfQoKICAvKioKICAgKiBEZWxldGUgYSBsaXN0IG9mIG9iamVjdHMuCiAgICoKICAgKiBAcGFyYW0gIG9ial9pZHMgICAgICAgb2JqZWN0cyB0byBkZWxldGUKICAgKiBAZXJyb3IKICAgKiAgICBBUElfRUNfREFUQV9EQVRBQkFTRV9FUlJPUgogICAqICAgIEFQSV9FQ19QQVJBTQogICAqICAgIEFQSV9FQ19QRVJNSVNTSU9OCiAgICogICAgQVBJX0VDX0RBVEFfSU5WQUxJRF9PUEVSQVRJT04KICAgKiAgICBBUElfRUNfREFUQV9RVU9UQV9FWENFRURFRAogICAqICAgIEFQSV9FQ19EQVRBX1VOS05PV05fRVJST1IKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gJmRhdGFfZGVsZXRlT2JqZWN0cygkb2JqX2lkcykgewogICAgcmV0dXJuICR0aGlzLT5jYWxsX21ldGhvZCgnZmFjZWJvb2suZGF0YS5kZWxldGVPYmplY3RzJywKICAgICAgIGFycmF5KCdvYmpfaWRzJyA9PiBqc29uX2VuY29kZSgkb2JqX2lkcykpKTsKICB9CgogIC8qKgogICAqIEdldCBhIHNpbmdsZSBwcm9wZXJ0eSB2YWx1ZSBvZiBhbiBvYmplY3QuCiAgICoKICAgKiBAcGFyYW0gIG9ial9pZCAgICAgICAgb2JqZWN0J3MgaWQKICAgKiBAcGFyYW0gIHByb3BfbmFtZSAgICAgaW5kaXZpZHVhbCBwcm9wZXJ0eSdzIG5hbWUKICAgKiBAcmV0dXJuICAgICAgICAgICAgICAgaW5kaXZpZHVhbCBwcm9wZXJ0eSdzIHZhbHVlCiAgICogQGVycm9yCiAgICogICAgQVBJX0VDX0RBVEFfREFUQUJBU0VfRVJST1IKICAgKiAgICBBUElfRUNfREFUQV9PQkpFQ1RfTk9UX0ZPVU5ECiAgICogICAgQVBJX0VDX1BBUkFNCiAgICogICAgQVBJX0VDX1BFUk1JU1NJT04KICAgKiAgICBBUElfRUNfREFUQV9JTlZBTElEX09QRVJBVElPTgogICAqICAgIEFQSV9FQ19EQVRBX1FVT1RBX0VYQ0VFREVECiAgICogICAgQVBJX0VDX0RBVEFfVU5LTk9XTl9FUlJPUgogICAqLwogIHB1YmxpYyBmdW5jdGlvbiAmZGF0YV9nZXRPYmplY3RQcm9wZXJ0eSgkb2JqX2lkLCAkcHJvcF9uYW1lKSB7CiAgICByZXR1cm4gJHRoaXMtPmNhbGxfbWV0aG9kKCdmYWNlYm9vay5kYXRhLmdldE9iamVjdFByb3BlcnR5JywKICAgICAgIGFycmF5KCdvYmpfaWQnID0+ICRvYmpfaWQsCiAgICAgICAgICAgICAncHJvcF9uYW1lJyA9PiAkcHJvcF9uYW1lKSk7CiAgfQoKICAvKioKICAgKiBHZXQgcHJvcGVydGllcyBvZiBhbiBvYmplY3QuCiAgICoKICAgKiBAcGFyYW0gIG9ial9pZCAgICAgIG9iamVjdCdzIGlkCiAgICogQHBhcmFtICBwcm9wX25hbWVzICAob3B0aW9uYWwpIHByb3BlcnRpZXMgdG8gcmV0dXJuOyBudWxsIGZvciBhbGwuCiAgICogQHJldHVybiAgICAgICAgICAgICBzcGVjaWZpZWQgcHJvcGVydGllcyBvZiBhbiBvYmplY3QKICAgKiBAZXJyb3IKICAgKiAgICBBUElfRUNfREFUQV9EQVRBQkFTRV9FUlJPUgogICAqICAgIEFQSV9FQ19EQVRBX09CSkVDVF9OT1RfRk9VTkQKICAgKiAgICBBUElfRUNfUEFSQU0KICAgKiAgICBBUElfRUNfUEVSTUlTU0lPTgogICAqICAgIEFQSV9FQ19EQVRBX0lOVkFMSURfT1BFUkFUSU9OCiAgICogICAgQVBJX0VDX0RBVEFfUVVPVEFfRVhDRUVERUQKICAgKiAgICBBUElfRUNfREFUQV9VTktOT1dOX0VSUk9SCiAgICovCiAgcHVibGljIGZ1bmN0aW9uICZkYXRhX2dldE9iamVjdCgkb2JqX2lkLCAkcHJvcF9uYW1lcyA9IG51bGwpIHsKICAgIHJldHVybiAkdGhpcy0+Y2FsbF9tZXRob2QoJ2ZhY2Vib29rLmRhdGEuZ2V0T2JqZWN0JywKICAgICAgIGFycmF5KCdvYmpfaWQnID0+ICRvYmpfaWQsCiAgICAgICAgICAgICAncHJvcF9uYW1lcycgPT4ganNvbl9lbmNvZGUoJHByb3BfbmFtZXMpKSk7CiAgfQoKICAvKioKICAgKiBHZXQgcHJvcGVydGllcyBvZiBhIGxpc3Qgb2Ygb2JqZWN0cy4KICAgKgogICAqIEBwYXJhbSAgb2JqX2lkcyAgICAgb2JqZWN0IGlkcwogICAqIEBwYXJhbSAgcHJvcF9uYW1lcyAgKG9wdGlvbmFsKSBwcm9wZXJ0aWVzIHRvIHJldHVybjsgbnVsbCBmb3IgYWxsLgogICAqIEByZXR1cm4gICAgICAgICAgICAgc3BlY2lmaWVkIHByb3BlcnRpZXMgb2YgYW4gb2JqZWN0CiAgICogQGVycm9yCiAgICogICAgQVBJX0VDX0RBVEFfREFUQUJBU0VfRVJST1IKICAgKiAgICBBUElfRUNfREFUQV9PQkpFQ1RfTk9UX0ZPVU5ECiAgICogICAgQVBJX0VDX1BBUkFNCiAgICogICAgQVBJX0VDX1BFUk1JU1NJT04KICAgKiAgICBBUElfRUNfREFUQV9JTlZBTElEX09QRVJBVElPTgogICAqICAgIEFQSV9FQ19EQVRBX1FVT1RBX0VYQ0VFREVECiAgICogICAgQVBJX0VDX0RBVEFfVU5LTk9XTl9FUlJPUgogICAqLwogIHB1YmxpYyBmdW5jdGlvbiAmZGF0YV9nZXRPYmplY3RzKCRvYmpfaWRzLCAkcHJvcF9uYW1lcyA9IG51bGwpIHsKICAgIHJldHVybiAkdGhpcy0+Y2FsbF9tZXRob2QoJ2ZhY2Vib29rLmRhdGEuZ2V0T2JqZWN0cycsCiAgICAgICBhcnJheSgnb2JqX2lkcycgPT4ganNvbl9lbmNvZGUoJG9ial9pZHMpLAogICAgICAgICAgICAgJ3Byb3BfbmFtZXMnID0+IGpzb25fZW5jb2RlKCRwcm9wX25hbWVzKSkpOwogIH0KCiAgLyoqCiAgICogU2V0IGEgc2luZ2xlIHByb3BlcnR5IHZhbHVlIG9mIGFuIG9iamVjdC4KICAgKgogICAqIEBwYXJhbSAgb2JqX2lkICAgICAgICBvYmplY3QncyBpZAogICAqIEBwYXJhbSAgcHJvcF9uYW1lICAgICBpbmRpdmlkdWFsIHByb3BlcnR5J3MgbmFtZQogICAqIEBwYXJhbSAgcHJvcF92YWx1ZSAgICBuZXcgdmFsdWUgdG8gc2V0CiAgICogQGVycm9yCiAgICogICAgQVBJX0VDX0RBVEFfREFUQUJBU0VfRVJST1IKICAgKiAgICBBUElfRUNfREFUQV9PQkpFQ1RfTk9UX0ZPVU5ECiAgICogICAgQVBJX0VDX1BBUkFNCiAgICogICAgQVBJX0VDX1BFUk1JU1NJT04KICAgKiAgICBBUElfRUNfREFUQV9JTlZBTElEX09QRVJBVElPTgogICAqICAgIEFQSV9FQ19EQVRBX1FVT1RBX0VYQ0VFREVECiAgICogICAgQVBJX0VDX0RBVEFfVU5LTk9XTl9FUlJPUgogICAqLwogIHB1YmxpYyBmdW5jdGlvbiAmZGF0YV9zZXRPYmplY3RQcm9wZXJ0eSgkb2JqX2lkLCAkcHJvcF9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwcm9wX3ZhbHVlKSB7CiAgICByZXR1cm4gJHRoaXMtPmNhbGxfbWV0aG9kKCdmYWNlYm9vay5kYXRhLnNldE9iamVjdFByb3BlcnR5JywKICAgICAgIGFycmF5KCdvYmpfaWQnID0+ICRvYmpfaWQsCiAgICAgICAgICAgICAncHJvcF9uYW1lJyA9PiAkcHJvcF9uYW1lLAogICAgICAgICAgICAgJ3Byb3BfdmFsdWUnID0+ICRwcm9wX3ZhbHVlKSk7CiAgfQoKICAvKioKICAgKiBSZWFkIGhhc2ggdmFsdWUgYnkga2V5LgogICAqCiAgICogQHBhcmFtICBvYmpfdHlwZSAgICAgIG9iamVjdCB0eXBlJ3MgbmFtZQogICAqIEBwYXJhbSAga2V5ICAgICAgICAgICBoYXNoIGtleQogICAqIEBwYXJhbSAgcHJvcF9uYW1lICAgICAob3B0aW9uYWwpIGluZGl2aWR1YWwgcHJvcGVydHkncyBuYW1lCiAgICogQHJldHVybiAgICAgICAgICAgICAgIGhhc2ggdmFsdWUKICAgKiBAZXJyb3IKICAgKiAgICBBUElfRUNfREFUQV9EQVRBQkFTRV9FUlJPUgogICAqICAgIEFQSV9FQ19QQVJBTQogICAqICAgIEFQSV9FQ19QRVJNSVNTSU9OCiAgICogICAgQVBJX0VDX0RBVEFfSU5WQUxJRF9PUEVSQVRJT04KICAgKiAgICBBUElfRUNfREFUQV9RVU9UQV9FWENFRURFRAogICAqICAgIEFQSV9FQ19EQVRBX1VOS05PV05fRVJST1IKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gJmRhdGFfZ2V0SGFzaFZhbHVlKCRvYmpfdHlwZSwgJGtleSwgJHByb3BfbmFtZSA9IG51bGwpIHsKICAgIHJldHVybiAkdGhpcy0+Y2FsbF9tZXRob2QoJ2ZhY2Vib29rLmRhdGEuZ2V0SGFzaFZhbHVlJywKICAgICAgIGFycmF5KCdvYmpfdHlwZScgPT4gJG9ial90eXBlLAogICAgICAgICAgICAgJ2tleScgPT4gJGtleSwKICAgICAgICAgICAgICdwcm9wX25hbWUnID0+ICRwcm9wX25hbWUpKTsKICB9CgogIC8qKgogICAqIFdyaXRlIGhhc2ggdmFsdWUgYnkga2V5LgogICAqCiAgICogQHBhcmFtICBvYmpfdHlwZSAgICAgIG9iamVjdCB0eXBlJ3MgbmFtZQogICAqIEBwYXJhbSAga2V5ICAgICAgICAgICBoYXNoIGtleQogICAqIEBwYXJhbSAgdmFsdWUgICAgICAgICBoYXNoIHZhbHVlCiAgICogQHBhcmFtICBwcm9wX25hbWUgICAgIChvcHRpb25hbCkgaW5kaXZpZHVhbCBwcm9wZXJ0eSdzIG5hbWUKICAgKiBAZXJyb3IKICAgKiAgICBBUElfRUNfREFUQV9EQVRBQkFTRV9FUlJPUgogICAqICAgIEFQSV9FQ19QQVJBTQogICAqICAgIEFQSV9FQ19QRVJNSVNTSU9OCiAgICogICAgQVBJX0VDX0RBVEFfSU5WQUxJRF9PUEVSQVRJT04KICAgKiAgICBBUElfRUNfREFUQV9RVU9UQV9FWENFRURFRAogICAqICAgIEFQSV9FQ19EQVRBX1VOS05PV05fRVJST1IKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gJmRhdGFfc2V0SGFzaFZhbHVlKCRvYmpfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRrZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcHJvcF9uYW1lID0gbnVsbCkgewogICAgcmV0dXJuICR0aGlzLT5jYWxsX21ldGhvZCgnZmFjZWJvb2suZGF0YS5zZXRIYXNoVmFsdWUnLAogICAgICAgYXJyYXkoJ29ial90eXBlJyA9PiAkb2JqX3R5cGUsCiAgICAgICAgICAgICAna2V5JyA9PiAka2V5LAogICAgICAgICAgICAgJ3ZhbHVlJyA9PiAkdmFsdWUsCiAgICAgICAgICAgICAncHJvcF9uYW1lJyA9PiAkcHJvcF9uYW1lKSk7CiAgfQoKICAvKioKICAgKiBJbmNyZWFzZSBhIGhhc2ggdmFsdWUgYnkgc3BlY2lmaWVkIGluY3JlbWVudCBhdG9taWNhbGx5LgogICAqCiAgICogQHBhcmFtICBvYmpfdHlwZSAgICAgIG9iamVjdCB0eXBlJ3MgbmFtZQogICAqIEBwYXJhbSAga2V5ICAgICAgICAgICBoYXNoIGtleQogICAqIEBwYXJhbSAgcHJvcF9uYW1lICAgICBpbmRpdmlkdWFsIHByb3BlcnR5J3MgbmFtZQogICAqIEBwYXJhbSAgaW5jcmVtZW50ICAgICAob3B0aW9uYWwpIGRlZmF1bHQgaXMgMQogICAqIEByZXR1cm4gICAgICAgICAgICAgICBpbmNyZW1lbnRlZCBoYXNoIHZhbHVlCiAgICogQGVycm9yCiAgICogICAgQVBJX0VDX0RBVEFfREFUQUJBU0VfRVJST1IKICAgKiAgICBBUElfRUNfUEFSQU0KICAgKiAgICBBUElfRUNfUEVSTUlTU0lPTgogICAqICAgIEFQSV9FQ19EQVRBX0lOVkFMSURfT1BFUkFUSU9OCiAgICogICAgQVBJX0VDX0RBVEFfUVVPVEFfRVhDRUVERUQKICAgKiAgICBBUElfRUNfREFUQV9VTktOT1dOX0VSUk9SCiAgICovCiAgcHVibGljIGZ1bmN0aW9uICZkYXRhX2luY0hhc2hWYWx1ZSgkb2JqX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAka2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHByb3BfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpbmNyZW1lbnQgPSAxKSB7CiAgICByZXR1cm4gJHRoaXMtPmNhbGxfbWV0aG9kKCdmYWNlYm9vay5kYXRhLmluY0hhc2hWYWx1ZScsCiAgICAgICBhcnJheSgnb2JqX3R5cGUnID0+ICRvYmpfdHlwZSwKICAgICAgICAgICAgICdrZXknID0+ICRrZXksCiAgICAgICAgICAgICAncHJvcF9uYW1lJyA9PiAkcHJvcF9uYW1lLAogICAgICAgICAgICAgJ2luY3JlbWVudCcgPT4gJGluY3JlbWVudCkpOwogIH0KCiAgLyoqCiAgICogUmVtb3ZlIGEgaGFzaCBrZXkgYW5kIGl0cyB2YWx1ZXMuCiAgICoKICAgKiBAcGFyYW0gIG9ial90eXBlICAgIG9iamVjdCB0eXBlJ3MgbmFtZQogICAqIEBwYXJhbSAga2V5ICAgICAgICAgaGFzaCBrZXkKICAgKiBAZXJyb3IKICAgKiAgICBBUElfRUNfREFUQV9EQVRBQkFTRV9FUlJPUgogICAqICAgIEFQSV9FQ19QQVJBTQogICAqICAgIEFQSV9FQ19QRVJNSVNTSU9OCiAgICogICAgQVBJX0VDX0RBVEFfSU5WQUxJRF9PUEVSQVRJT04KICAgKiAgICBBUElfRUNfREFUQV9RVU9UQV9FWENFRURFRAogICAqICAgIEFQSV9FQ19EQVRBX1VOS05PV05fRVJST1IKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gJmRhdGFfcmVtb3ZlSGFzaEtleSgkb2JqX3R5cGUsICRrZXkpIHsKICAgIHJldHVybiAkdGhpcy0+Y2FsbF9tZXRob2QoJ2ZhY2Vib29rLmRhdGEucmVtb3ZlSGFzaEtleScsCiAgICAgICBhcnJheSgnb2JqX3R5cGUnID0+ICRvYmpfdHlwZSwKICAgICAgICAgICAgICdrZXknID0+ICRrZXkpKTsKICB9CgogIC8qKgogICAqIFJlbW92ZSBoYXNoIGtleXMgYW5kIHRoZWlyIHZhbHVlcy4KICAgKgogICAqIEBwYXJhbSAgb2JqX3R5cGUgICAgb2JqZWN0IHR5cGUncyBuYW1lCiAgICogQHBhcmFtICBrZXlzICAgICAgICBoYXNoIGtleXMKICAgKiBAZXJyb3IKICAgKiAgICBBUElfRUNfREFUQV9EQVRBQkFTRV9FUlJPUgogICAqICAgIEFQSV9FQ19QQVJBTQogICAqICAgIEFQSV9FQ19QRVJNSVNTSU9OCiAgICogICAgQVBJX0VDX0RBVEFfSU5WQUxJRF9PUEVSQVRJT04KICAgKiAgICBBUElfRUNfREFUQV9RVU9UQV9FWENFRURFRAogICAqICAgIEFQSV9FQ19EQVRBX1VOS05PV05fRVJST1IKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gJmRhdGFfcmVtb3ZlSGFzaEtleXMoJG9ial90eXBlLCAka2V5cykgewogICAgcmV0dXJuICR0aGlzLT5jYWxsX21ldGhvZCgnZmFjZWJvb2suZGF0YS5yZW1vdmVIYXNoS2V5cycsCiAgICAgICBhcnJheSgnb2JqX3R5cGUnID0+ICRvYmpfdHlwZSwKICAgICAgICAgICAgICdrZXlzJyA9PiBqc29uX2VuY29kZSgka2V5cykpKTsKICB9CgogIC8qKgogICAqIERlZmluZSBhbiBvYmplY3QgYXNzb2NpYXRpb24uCiAgICoKICAgKiBAcGFyYW0gIG5hbWUgICAgICAgIG5hbWUgb2YgdGhpcyBhc3NvY2lhdGlvbgogICAqIEBwYXJhbSAgYXNzb2NfdHlwZSAgMTogb25lLXdheSAyOiB0d28td2F5IHN5bW1ldHJpYyAzOiB0d28td2F5IGFzeW1tZXRyaWMKICAgKiBAcGFyYW0gIGFzc29jX2luZm8xIG5lZWRlZCBpbmZvIGFib3V0IGZpcnN0IG9iamVjdCB0eXBlCiAgICogQHBhcmFtICBhc3NvY19pbmZvMiBuZWVkZWQgaW5mbyBhYm91dCBzZWNvbmQgb2JqZWN0IHR5cGUKICAgKiBAcGFyYW0gIGludmVyc2UgICAgIChvcHRpb25hbCkgbmFtZSBvZiByZXZlcnNlIGFzc29jaWF0aW9uCiAgICogQGVycm9yCiAgICogICAgQVBJX0VDX0RBVEFfREFUQUJBU0VfRVJST1IKICAgKiAgICBBUElfRUNfREFUQV9PQkpFQ1RfQUxSRUFEWV9FWElTVFMKICAgKiAgICBBUElfRUNfUEFSQU0KICAgKiAgICBBUElfRUNfUEVSTUlTU0lPTgogICAqICAgIEFQSV9FQ19EQVRBX0lOVkFMSURfT1BFUkFUSU9OCiAgICogICAgQVBJX0VDX0RBVEFfUVVPVEFfRVhDRUVERUQKICAgKiAgICBBUElfRUNfREFUQV9VTktOT1dOX0VSUk9SCiAgICovCiAgcHVibGljIGZ1bmN0aW9uICZkYXRhX2RlZmluZUFzc29jaWF0aW9uKCRuYW1lLCAkYXNzb2NfdHlwZSwgJGFzc29jX2luZm8xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRhc3NvY19pbmZvMiwgJGludmVyc2UgPSBudWxsKSB7CiAgICByZXR1cm4gJHRoaXMtPmNhbGxfbWV0aG9kKCdmYWNlYm9vay5kYXRhLmRlZmluZUFzc29jaWF0aW9uJywKICAgICAgIGFycmF5KCduYW1lJyA9PiAkbmFtZSwKICAgICAgICAgICAgICdhc3NvY190eXBlJyA9PiAkYXNzb2NfdHlwZSwKICAgICAgICAgICAgICdhc3NvY19pbmZvMScgPT4ganNvbl9lbmNvZGUoJGFzc29jX2luZm8xKSwKICAgICAgICAgICAgICdhc3NvY19pbmZvMicgPT4ganNvbl9lbmNvZGUoJGFzc29jX2luZm8yKSwKICAgICAgICAgICAgICdpbnZlcnNlJyA9PiAkaW52ZXJzZSkpOwogIH0KCiAgLyoqCiAgICogVW5kZWZpbmUgYW4gb2JqZWN0IGFzc29jaWF0aW9uLgogICAqCiAgICogQHBhcmFtICBuYW1lICAgICAgICBuYW1lIG9mIHRoaXMgYXNzb2NpYXRpb24KICAgKiBAZXJyb3IKICAgKiAgICBBUElfRUNfREFUQV9EQVRBQkFTRV9FUlJPUgogICAqICAgIEFQSV9FQ19EQVRBX09CSkVDVF9OT1RfRk9VTkQKICAgKiAgICBBUElfRUNfUEFSQU0KICAgKiAgICBBUElfRUNfUEVSTUlTU0lPTgogICAqICAgIEFQSV9FQ19EQVRBX0lOVkFMSURfT1BFUkFUSU9OCiAgICogICAgQVBJX0VDX0RBVEFfUVVPVEFfRVhDRUVERUQKICAgKiAgICBBUElfRUNfREFUQV9VTktOT1dOX0VSUk9SCiAgICovCiAgcHVibGljIGZ1bmN0aW9uICZkYXRhX3VuZGVmaW5lQXNzb2NpYXRpb24oJG5hbWUpIHsKICAgIHJldHVybiAkdGhpcy0+Y2FsbF9tZXRob2QoJ2ZhY2Vib29rLmRhdGEudW5kZWZpbmVBc3NvY2lhdGlvbicsCiAgICAgICBhcnJheSgnbmFtZScgPT4gJG5hbWUpKTsKICB9CgogIC8qKgogICAqIFJlbmFtZSBhbiBvYmplY3QgYXNzb2NpYXRpb24gb3IgYWxpYXNlcy4KICAgKgogICAqIEBwYXJhbSAgbmFtZSAgICAgICAgbmFtZSBvZiB0aGlzIGFzc29jaWF0aW9uCiAgICogQHBhcmFtICBuZXdfbmFtZSAgICAob3B0aW9uYWwpIG5ldyBuYW1lIG9mIHRoaXMgYXNzb2NpYXRpb24KICAgKiBAcGFyYW0gIG5ld19hbGlhczEgIChvcHRpb25hbCkgbmV3IGFsaWFzIGZvciBvYmplY3QgdHlwZSAxCiAgICogQHBhcmFtICBuZXdfYWxpYXMyICAob3B0aW9uYWwpIG5ldyBhbGlhcyBmb3Igb2JqZWN0IHR5cGUgMgogICAqIEBlcnJvcgogICAqICAgIEFQSV9FQ19EQVRBX0RBVEFCQVNFX0VSUk9SCiAgICogICAgQVBJX0VDX0RBVEFfT0JKRUNUX0FMUkVBRFlfRVhJU1RTCiAgICogICAgQVBJX0VDX0RBVEFfT0JKRUNUX05PVF9GT1VORAogICAqICAgIEFQSV9FQ19QQVJBTQogICAqICAgIEFQSV9FQ19QRVJNSVNTSU9OCiAgICogICAgQVBJX0VDX0RBVEFfSU5WQUxJRF9PUEVSQVRJT04KICAgKiAgICBBUElfRUNfREFUQV9RVU9UQV9FWENFRURFRAogICAqICAgIEFQSV9FQ19EQVRBX1VOS05PV05fRVJST1IKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gJmRhdGFfcmVuYW1lQXNzb2NpYXRpb24oJG5hbWUsICRuZXdfbmFtZSwgJG5ld19hbGlhczEgPSBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRuZXdfYWxpYXMyID0gbnVsbCkgewogICAgcmV0dXJuICR0aGlzLT5jYWxsX21ldGhvZCgnZmFjZWJvb2suZGF0YS5yZW5hbWVBc3NvY2lhdGlvbicsCiAgICAgICBhcnJheSgnbmFtZScgPT4gJG5hbWUsCiAgICAgICAgICAgICAnbmV3X25hbWUnID0+ICRuZXdfbmFtZSwKICAgICAgICAgICAgICduZXdfYWxpYXMxJyA9PiAkbmV3X2FsaWFzMSwKICAgICAgICAgICAgICduZXdfYWxpYXMyJyA9PiAkbmV3X2FsaWFzMikpOwogIH0KCiAgLyoqCiAgICogR2V0IGRlZmluaXRpb24gb2YgYW4gb2JqZWN0IGFzc29jaWF0aW9uLgogICAqCiAgICogQHBhcmFtICBuYW1lICAgICAgICBuYW1lIG9mIHRoaXMgYXNzb2NpYXRpb24KICAgKiBAcmV0dXJuICAgICAgICAgICAgIHNwZWNpZmllZCBhc3NvY2lhdGlvbgogICAqIEBlcnJvcgogICAqICAgIEFQSV9FQ19EQVRBX0RBVEFCQVNFX0VSUk9SCiAgICogICAgQVBJX0VDX0RBVEFfT0JKRUNUX05PVF9GT1VORAogICAqICAgIEFQSV9FQ19QQVJBTQogICAqICAgIEFQSV9FQ19QRVJNSVNTSU9OCiAgICogICAgQVBJX0VDX0RBVEFfUVVPVEFfRVhDRUVERUQKICAgKiAgICBBUElfRUNfREFUQV9VTktOT1dOX0VSUk9SCiAgICovCiAgcHVibGljIGZ1bmN0aW9uICZkYXRhX2dldEFzc29jaWF0aW9uRGVmaW5pdGlvbigkbmFtZSkgewogICAgcmV0dXJuICR0aGlzLT5jYWxsX21ldGhvZCgnZmFjZWJvb2suZGF0YS5nZXRBc3NvY2lhdGlvbkRlZmluaXRpb24nLAogICAgICAgYXJyYXkoJ25hbWUnID0+ICRuYW1lKSk7CiAgfQoKICAvKioKICAgKiBHZXQgZGVmaW5pdGlvbiBvZiBhbGwgYXNzb2NpYXRpb25zLgogICAqCiAgICogQHJldHVybiAgICAgICAgICAgICBhbGwgZGVmaW5lZCBhc3NvY2lhdGlvbnMKICAgKiBAZXJyb3IKICAgKiAgICBBUElfRUNfREFUQV9EQVRBQkFTRV9FUlJPUgogICAqICAgIEFQSV9FQ19QRVJNSVNTSU9OCiAgICogICAgQVBJX0VDX0RBVEFfUVVPVEFfRVhDRUVERUQKICAgKiAgICBBUElfRUNfREFUQV9VTktOT1dOX0VSUk9SCiAgICovCiAgcHVibGljIGZ1bmN0aW9uICZkYXRhX2dldEFzc29jaWF0aW9uRGVmaW5pdGlvbnMoKSB7CiAgICByZXR1cm4gJHRoaXMtPmNhbGxfbWV0aG9kKCdmYWNlYm9vay5kYXRhLmdldEFzc29jaWF0aW9uRGVmaW5pdGlvbnMnLAogICAgICAgYXJyYXkoKSk7CiAgfQoKICAvKioKICAgKiBDcmVhdGUgb3IgbW9kaWZ5IGFuIGFzc29jaWF0aW9uIGJldHdlZW4gdHdvIG9iamVjdHMuCiAgICoKICAgKiBAcGFyYW0gIG5hbWUgICAgICAgIG5hbWUgb2YgYXNzb2NpYXRpb24KICAgKiBAcGFyYW0gIG9ial9pZDEgICAgIGlkIG9mIGZpcnN0IG9iamVjdAogICAqIEBwYXJhbSAgb2JqX2lkMiAgICAgaWQgb2Ygc2Vjb25kIG9iamVjdAogICAqIEBwYXJhbSAgZGF0YSAgICAgICAgKG9wdGlvbmFsKSBleHRyYSBzdHJpbmcgZGF0YSB0byBzdG9yZQogICAqIEBwYXJhbSAgYXNzb2NfdGltZSAgKG9wdGlvbmFsKSBleHRyYSB0aW1lIGRhdGE7IGRlZmF1bHQgdG8gY3JlYXRpb24gdGltZQogICAqIEBlcnJvcgogICAqICAgIEFQSV9FQ19EQVRBX0RBVEFCQVNFX0VSUk9SCiAgICogICAgQVBJX0VDX1BBUkFNCiAgICogICAgQVBJX0VDX1BFUk1JU1NJT04KICAgKiAgICBBUElfRUNfREFUQV9JTlZBTElEX09QRVJBVElPTgogICAqICAgIEFQSV9FQ19EQVRBX1FVT1RBX0VYQ0VFREVECiAgICogICAgQVBJX0VDX0RBVEFfVU5LTk9XTl9FUlJPUgogICAqLwogIHB1YmxpYyBmdW5jdGlvbiAmZGF0YV9zZXRBc3NvY2lhdGlvbigkbmFtZSwgJG9ial9pZDEsICRvYmpfaWQyLCAkZGF0YSA9IG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGFzc29jX3RpbWUgPSBudWxsKSB7CiAgICByZXR1cm4gJHRoaXMtPmNhbGxfbWV0aG9kKCdmYWNlYm9vay5kYXRhLnNldEFzc29jaWF0aW9uJywKICAgICAgIGFycmF5KCduYW1lJyA9PiAkbmFtZSwKICAgICAgICAgICAgICdvYmpfaWQxJyA9PiAkb2JqX2lkMSwKICAgICAgICAgICAgICdvYmpfaWQyJyA9PiAkb2JqX2lkMiwKICAgICAgICAgICAgICdkYXRhJyA9PiAkZGF0YSwKICAgICAgICAgICAgICdhc3NvY190aW1lJyA9PiAkYXNzb2NfdGltZSkpOwogIH0KCiAgLyoqCiAgICogQ3JlYXRlIG9yIG1vZGlmeSBhc3NvY2lhdGlvbnMgYmV0d2VlbiBvYmplY3RzLgogICAqCiAgICogQHBhcmFtICBhc3NvY3MgICAgICBhc3NvY2lhdGlvbnMgdG8gc2V0CiAgICogQHBhcmFtICBuYW1lICAgICAgICAob3B0aW9uYWwpIG5hbWUgb2YgYXNzb2NpYXRpb24KICAgKiBAZXJyb3IKICAgKiAgICBBUElfRUNfREFUQV9EQVRBQkFTRV9FUlJPUgogICAqICAgIEFQSV9FQ19QQVJBTQogICAqICAgIEFQSV9FQ19QRVJNSVNTSU9OCiAgICogICAgQVBJX0VDX0RBVEFfSU5WQUxJRF9PUEVSQVRJT04KICAgKiAgICBBUElfRUNfREFUQV9RVU9UQV9FWENFRURFRAogICAqICAgIEFQSV9FQ19EQVRBX1VOS05PV05fRVJST1IKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gJmRhdGFfc2V0QXNzb2NpYXRpb25zKCRhc3NvY3MsICRuYW1lID0gbnVsbCkgewogICAgcmV0dXJuICR0aGlzLT5jYWxsX21ldGhvZCgnZmFjZWJvb2suZGF0YS5zZXRBc3NvY2lhdGlvbnMnLAogICAgICAgYXJyYXkoJ2Fzc29jcycgPT4ganNvbl9lbmNvZGUoJGFzc29jcyksCiAgICAgICAgICAgICAnbmFtZScgPT4gJG5hbWUpKTsKICB9CgogIC8qKgogICAqIFJlbW92ZSBhbiBhc3NvY2lhdGlvbiBiZXR3ZWVuIHR3byBvYmplY3RzLgogICAqCiAgICogQHBhcmFtICBuYW1lICAgICAgICBuYW1lIG9mIGFzc29jaWF0aW9uCiAgICogQHBhcmFtICBvYmpfaWQxICAgICBpZCBvZiBmaXJzdCBvYmplY3QKICAgKiBAcGFyYW0gIG9ial9pZDIgICAgIGlkIG9mIHNlY29uZCBvYmplY3QKICAgKiBAZXJyb3IKICAgKiAgICBBUElfRUNfREFUQV9EQVRBQkFTRV9FUlJPUgogICAqICAgIEFQSV9FQ19EQVRBX09CSkVDVF9OT1RfRk9VTkQKICAgKiAgICBBUElfRUNfUEFSQU0KICAgKiAgICBBUElfRUNfUEVSTUlTU0lPTgogICAqICAgIEFQSV9FQ19EQVRBX1FVT1RBX0VYQ0VFREVECiAgICogICAgQVBJX0VDX0RBVEFfVU5LTk9XTl9FUlJPUgogICAqLwogIHB1YmxpYyBmdW5jdGlvbiAmZGF0YV9yZW1vdmVBc3NvY2lhdGlvbigkbmFtZSwgJG9ial9pZDEsICRvYmpfaWQyKSB7CiAgICByZXR1cm4gJHRoaXMtPmNhbGxfbWV0aG9kKCdmYWNlYm9vay5kYXRhLnJlbW92ZUFzc29jaWF0aW9uJywKICAgICAgIGFycmF5KCduYW1lJyA9PiAkbmFtZSwKICAgICAgICAgICAgICdvYmpfaWQxJyA9PiAkb2JqX2lkMSwKICAgICAgICAgICAgICdvYmpfaWQyJyA9PiAkb2JqX2lkMikpOwogIH0KCiAgLyoqCiAgICogUmVtb3ZlIGFzc29jaWF0aW9ucyBiZXR3ZWVuIG9iamVjdHMgYnkgc3BlY2lmeWluZyBwYWlycyBvZiBvYmplY3QgaWRzLgogICAqCiAgICogQHBhcmFtICBhc3NvY3MgICAgICBhc3NvY2lhdGlvbnMgdG8gcmVtb3ZlCiAgICogQHBhcmFtICBuYW1lICAgICAgICAob3B0aW9uYWwpIG5hbWUgb2YgYXNzb2NpYXRpb24KICAgKiBAZXJyb3IKICAgKiAgICBBUElfRUNfREFUQV9EQVRBQkFTRV9FUlJPUgogICAqICAgIEFQSV9FQ19EQVRBX09CSkVDVF9OT1RfRk9VTkQKICAgKiAgICBBUElfRUNfUEFSQU0KICAgKiAgICBBUElfRUNfUEVSTUlTU0lPTgogICAqICAgIEFQSV9FQ19EQVRBX1FVT1RBX0VYQ0VFREVECiAgICogICAgQVBJX0VDX0RBVEFfVU5LTk9XTl9FUlJPUgogICAqLwogIHB1YmxpYyBmdW5jdGlvbiAmZGF0YV9yZW1vdmVBc3NvY2lhdGlvbnMoJGFzc29jcywgJG5hbWUgPSBudWxsKSB7CiAgICByZXR1cm4gJHRoaXMtPmNhbGxfbWV0aG9kKCdmYWNlYm9vay5kYXRhLnJlbW92ZUFzc29jaWF0aW9ucycsCiAgICAgICBhcnJheSgnYXNzb2NzJyA9PiBqc29uX2VuY29kZSgkYXNzb2NzKSwKICAgICAgICAgICAgICduYW1lJyA9PiAkbmFtZSkpOwogIH0KCiAgLyoqCiAgICogUmVtb3ZlIGFzc29jaWF0aW9ucyBiZXR3ZWVuIG9iamVjdHMgYnkgc3BlY2lmeWluZyBvbmUgb2JqZWN0IGlkLgogICAqCiAgICogQHBhcmFtICBuYW1lICAgICAgICBuYW1lIG9mIGFzc29jaWF0aW9uCiAgICogQHBhcmFtICBvYmpfaWQgICAgICB3aG8ncyBhc3NvY2lhdGlvbiB0byByZW1vdmUKICAgKiBAZXJyb3IKICAgKiAgICBBUElfRUNfREFUQV9EQVRBQkFTRV9FUlJPUgogICAqICAgIEFQSV9FQ19EQVRBX09CSkVDVF9OT1RfRk9VTkQKICAgKiAgICBBUElfRUNfUEFSQU0KICAgKiAgICBBUElfRUNfUEVSTUlTU0lPTgogICAqICAgIEFQSV9FQ19EQVRBX0lOVkFMSURfT1BFUkFUSU9OCiAgICogICAgQVBJX0VDX0RBVEFfUVVPVEFfRVhDRUVERUQKICAgKiAgICBBUElfRUNfREFUQV9VTktOT1dOX0VSUk9SCiAgICovCiAgcHVibGljIGZ1bmN0aW9uICZkYXRhX3JlbW92ZUFzc29jaWF0ZWRPYmplY3RzKCRuYW1lLCAkb2JqX2lkKSB7CiAgICByZXR1cm4gJHRoaXMtPmNhbGxfbWV0aG9kKCdmYWNlYm9vay5kYXRhLnJlbW92ZUFzc29jaWF0ZWRPYmplY3RzJywKICAgICAgIGFycmF5KCduYW1lJyA9PiAkbmFtZSwKICAgICAgICAgICAgICdvYmpfaWQnID0+ICRvYmpfaWQpKTsKICB9CgogIC8qKgogICAqIFJldHJpZXZlIGEgbGlzdCBvZiBhc3NvY2lhdGVkIG9iamVjdHMuCiAgICoKICAgKiBAcGFyYW0gIG5hbWUgICAgICAgIG5hbWUgb2YgYXNzb2NpYXRpb24KICAgKiBAcGFyYW0gIG9ial9pZCAgICAgIHdobydzIGFzc29jaWF0aW9uIHRvIHJldHJpZXZlCiAgICogQHBhcmFtICBub19kYXRhICAgICBvbmx5IHJldHVybiBvYmplY3QgaWRzCiAgICogQHJldHVybiAgICAgICAgICAgICBhc3NvY2lhdGVkIG9iamVjdHMKICAgKiBAZXJyb3IKICAgKiAgICBBUElfRUNfREFUQV9EQVRBQkFTRV9FUlJPUgogICAqICAgIEFQSV9FQ19EQVRBX09CSkVDVF9OT1RfRk9VTkQKICAgKiAgICBBUElfRUNfUEFSQU0KICAgKiAgICBBUElfRUNfUEVSTUlTU0lPTgogICAqICAgIEFQSV9FQ19EQVRBX0lOVkFMSURfT1BFUkFUSU9OCiAgICogICAgQVBJX0VDX0RBVEFfUVVPVEFfRVhDRUVERUQKICAgKiAgICBBUElfRUNfREFUQV9VTktOT1dOX0VSUk9SCiAgICovCiAgcHVibGljIGZ1bmN0aW9uICZkYXRhX2dldEFzc29jaWF0ZWRPYmplY3RzKCRuYW1lLCAkb2JqX2lkLCAkbm9fZGF0YSA9IHRydWUpIHsKICAgIHJldHVybiAkdGhpcy0+Y2FsbF9tZXRob2QoJ2ZhY2Vib29rLmRhdGEuZ2V0QXNzb2NpYXRlZE9iamVjdHMnLAogICAgICAgYXJyYXkoJ25hbWUnID0+ICRuYW1lLAogICAgICAgICAgICAgJ29ial9pZCcgPT4gJG9ial9pZCwKICAgICAgICAgICAgICdub19kYXRhJyA9PiAkbm9fZGF0YSkpOwogIH0KCiAgLyoqCiAgICogQ291bnQgYXNzb2NpYXRlZCBvYmplY3RzLgogICAqCiAgICogQHBhcmFtICBuYW1lICAgICAgICBuYW1lIG9mIGFzc29jaWF0aW9uCiAgICogQHBhcmFtICBvYmpfaWQgICAgICB3aG8ncyBhc3NvY2lhdGlvbiB0byByZXRyaWV2ZQogICAqIEByZXR1cm4gICAgICAgICAgICAgYXNzb2NpYXRlZCBvYmplY3QncyBjb3VudAogICAqIEBlcnJvcgogICAqICAgIEFQSV9FQ19EQVRBX0RBVEFCQVNFX0VSUk9SCiAgICogICAgQVBJX0VDX0RBVEFfT0JKRUNUX05PVF9GT1VORAogICAqICAgIEFQSV9FQ19QQVJBTQogICAqICAgIEFQSV9FQ19QRVJNSVNTSU9OCiAgICogICAgQVBJX0VDX0RBVEFfSU5WQUxJRF9PUEVSQVRJT04KICAgKiAgICBBUElfRUNfREFUQV9RVU9UQV9FWENFRURFRAogICAqICAgIEFQSV9FQ19EQVRBX1VOS05PV05fRVJST1IKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gJmRhdGFfZ2V0QXNzb2NpYXRlZE9iamVjdENvdW50KCRuYW1lLCAkb2JqX2lkKSB7CiAgICByZXR1cm4gJHRoaXMtPmNhbGxfbWV0aG9kKCdmYWNlYm9vay5kYXRhLmdldEFzc29jaWF0ZWRPYmplY3RDb3VudCcsCiAgICAgICBhcnJheSgnbmFtZScgPT4gJG5hbWUsCiAgICAgICAgICAgICAnb2JqX2lkJyA9PiAkb2JqX2lkKSk7CiAgfQoKICAvKioKICAgKiBHZXQgYSBsaXN0IG9mIGFzc29jaWF0ZWQgb2JqZWN0IGNvdW50cy4KICAgKgogICAqIEBwYXJhbSAgbmFtZSAgICAgICAgbmFtZSBvZiBhc3NvY2lhdGlvbgogICAqIEBwYXJhbSAgb2JqX2lkcyAgICAgd2hvc2UgYXNzb2NpYXRpb24gdG8gcmV0cmlldmUKICAgKiBAcmV0dXJuICAgICAgICAgICAgIGFzc29jaWF0ZWQgb2JqZWN0IGNvdW50cwogICAqIEBlcnJvcgogICAqICAgIEFQSV9FQ19EQVRBX0RBVEFCQVNFX0VSUk9SCiAgICogICAgQVBJX0VDX0RBVEFfT0JKRUNUX05PVF9GT1VORAogICAqICAgIEFQSV9FQ19QQVJBTQogICAqICAgIEFQSV9FQ19QRVJNSVNTSU9OCiAgICogICAgQVBJX0VDX0RBVEFfSU5WQUxJRF9PUEVSQVRJT04KICAgKiAgICBBUElfRUNfREFUQV9RVU9UQV9FWENFRURFRAogICAqICAgIEFQSV9FQ19EQVRBX1VOS05PV05fRVJST1IKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gJmRhdGFfZ2V0QXNzb2NpYXRlZE9iamVjdENvdW50cygkbmFtZSwgJG9ial9pZHMpIHsKICAgIHJldHVybiAkdGhpcy0+Y2FsbF9tZXRob2QoJ2ZhY2Vib29rLmRhdGEuZ2V0QXNzb2NpYXRlZE9iamVjdENvdW50cycsCiAgICAgICBhcnJheSgnbmFtZScgPT4gJG5hbWUsCiAgICAgICAgICAgICAnb2JqX2lkcycgPT4ganNvbl9lbmNvZGUoJG9ial9pZHMpKSk7CiAgfQoKICAvKioKICAgKiBGaW5kIGFsbCBhc3NvY2lhdGlvbnMgYmV0d2VlbiB0d28gb2JqZWN0cy4KICAgKgogICAqIEBwYXJhbSAgb2JqX2lkMSAgICAgaWQgb2YgZmlyc3Qgb2JqZWN0CiAgICogQHBhcmFtICBvYmpfaWQyICAgICBpZCBvZiBzZWNvbmQgb2JqZWN0CiAgICogQHBhcmFtICBub19kYXRhICAgICBvbmx5IHJldHVybiBhc3NvY2lhdGlvbiBuYW1lcyB3aXRob3V0IGRhdGEKICAgKiBAcmV0dXJuICAgICAgICAgICAgIGFsbCBhc3NvY2lhdGlvbnMgYmV0d2VlbiBvYmplY3RzCiAgICogQGVycm9yCiAgICogICAgQVBJX0VDX0RBVEFfREFUQUJBU0VfRVJST1IKICAgKiAgICBBUElfRUNfUEFSQU0KICAgKiAgICBBUElfRUNfUEVSTUlTU0lPTgogICAqICAgIEFQSV9FQ19EQVRBX1FVT1RBX0VYQ0VFREVECiAgICogICAgQVBJX0VDX0RBVEFfVU5LTk9XTl9FUlJPUgogICAqLwogIHB1YmxpYyBmdW5jdGlvbiAmZGF0YV9nZXRBc3NvY2lhdGlvbnMoJG9ial9pZDEsICRvYmpfaWQyLCAkbm9fZGF0YSA9IHRydWUpIHsKICAgIHJldHVybiAkdGhpcy0+Y2FsbF9tZXRob2QoJ2ZhY2Vib29rLmRhdGEuZ2V0QXNzb2NpYXRpb25zJywKICAgICAgIGFycmF5KCdvYmpfaWQxJyA9PiAkb2JqX2lkMSwKICAgICAgICAgICAgICdvYmpfaWQyJyA9PiAkb2JqX2lkMiwKICAgICAgICAgICAgICdub19kYXRhJyA9PiAkbm9fZGF0YSkpOwogIH0KCiAgLyoqCiAgICogR2V0IHRoZSBwcm9wZXJ0aWVzIHRoYXQgeW91IGhhdmUgc2V0IGZvciBhbiBhcHAuCiAgICoKICAgKiBAcGFyYW0gcHJvcGVydGllcyAgTGlzdCBvZiBwcm9wZXJ0aWVzIG5hbWVzIHRvIGZldGNoCiAgICoKICAgKiBAcmV0dXJuIGFycmF5ICBBIG1hcCBmcm9tIHByb3BlcnR5IG5hbWUgdG8gdmFsdWUKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gYWRtaW5fZ2V0QXBwUHJvcGVydGllcygkcHJvcGVydGllcykgewogICAgcmV0dXJuIGpzb25fZGVjb2RlKAogICAgICAgICR0aGlzLT5jYWxsX21ldGhvZCgnZmFjZWJvb2suYWRtaW4uZ2V0QXBwUHJvcGVydGllcycsCiAgICAgICAgICAgIGFycmF5KCdwcm9wZXJ0aWVzJyA9PiBqc29uX2VuY29kZSgkcHJvcGVydGllcykpKSwgdHJ1ZSk7CiAgfQoKICAvKioKICAgKiBTZXQgcHJvcGVydGllcyBmb3IgYW4gYXBwLgogICAqCiAgICogQHBhcmFtIHByb3BlcnRpZXMgIEEgbWFwIGZyb20gcHJvcGVydHkgbmFtZXMgdG8gdmFsdWVzCiAgICoKICAgKiBAcmV0dXJuIGJvb2wgIHRydWUgb24gc3VjY2VzcwogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBhZG1pbl9zZXRBcHBQcm9wZXJ0aWVzKCRwcm9wZXJ0aWVzKSB7CiAgICByZXR1cm4gJHRoaXMtPmNhbGxfbWV0aG9kKCdmYWNlYm9vay5hZG1pbi5zZXRBcHBQcm9wZXJ0aWVzJywKICAgICAgIGFycmF5KCdwcm9wZXJ0aWVzJyA9PiBqc29uX2VuY29kZSgkcHJvcGVydGllcykpKTsKICB9CgogIC8qKgogICAqIFJldHVybnMgdGhlIGFsbG9jYXRpb24gbGltaXQgdmFsdWUgZm9yIGEgc3BlY2lmaWVkIGludGVncmF0aW9uIHBvaW50IG5hbWUKICAgKiBJbnRlZ3JhdGlvbiBwb2ludCBuYW1lcyBhcmUgZGVmaW5lZCBpbiBsaWIvYXBpL2thcm1hL2NvbnN0YW50cy5waHAgaW4gdGhlCiAgICogbGltaXRfbWFwLgogICAqCiAgICogQHBhcmFtIHN0cmluZyAkaW50ZWdyYXRpb25fcG9pbnRfbmFtZSAgTmFtZSBvZiBhbiBpbnRlZ3JhdGlvbiBwb2ludAogICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWUgZGV2ZWxvcGVyIHdpa2kgZm9yIGxpc3QpLgogICAqIEBwYXJhbSBpbnQgICAgJHVpZCAgICAgICAgICAgICAgICAgICAgIFNwZWNpZmljIHVzZXIgdG8gY2hlY2sgdGhlIGxpbWl0LgogICAqCiAgICogQHJldHVybiBpbnQgIEludGVncmF0aW9uIHBvaW50IGFsbG9jYXRpb24gdmFsdWUKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gJmFkbWluX2dldEFsbG9jYXRpb24oJGludGVncmF0aW9uX3BvaW50X25hbWUsICR1aWQ9bnVsbCkgewogICAgcmV0dXJuICR0aGlzLT5jYWxsX21ldGhvZCgnZmFjZWJvb2suYWRtaW4uZ2V0QWxsb2NhdGlvbicsCiAgICAgICAgYXJyYXkoJ2ludGVncmF0aW9uX3BvaW50X25hbWUnID0+ICRpbnRlZ3JhdGlvbl9wb2ludF9uYW1lLAogICAgICAgICAgICAgICd1aWQnID0+ICR1aWQpKTsKICB9CgogIC8qKgogICAqIFJldHVybnMgdmFsdWVzIGZvciB0aGUgc3BlY2lmaWVkIG1ldHJpY3MgZm9yIHRoZSBjdXJyZW50IGFwcGxpY2F0aW9uLCBpbgogICAqIHRoZSBnaXZlbiB0aW1lIHJhbmdlLiAgVGhlIG1ldHJpY3MgYXJlIGNvbGxlY3RlZCBmb3IgZml4ZWQtbGVuZ3RoIHBlcmlvZHMsCiAgICogYW5kIHRoZSB0aW1lcyByZXByZXNlbnQgbWlkbmlnaHQgYXQgdGhlIGVuZCBvZiBlYWNoIHBlcmlvZC4KICAgKgogICAqIEBwYXJhbSBzdGFydF90aW1lICB1bml4IHRpbWUgZm9yIHRoZSBzdGFydCBvZiB0aGUgcmFuZ2UKICAgKiBAcGFyYW0gZW5kX3RpbWUgICAgdW5peCB0aW1lIGZvciB0aGUgZW5kIG9mIHRoZSByYW5nZQogICAqIEBwYXJhbSBwZXJpb2QgICAgICBudW1iZXIgb2Ygc2Vjb25kcyBpbiB0aGUgZGVzaXJlZCBwZXJpb2QKICAgKiBAcGFyYW0gbWV0cmljcyAgICAgbGlzdCBvZiBtZXRyaWNzIHRvIGxvb2sgdXAKICAgKgogICAqIEByZXR1cm4gYXJyYXkgIEEgbWFwIG9mIHRoZSBuYW1lcyBhbmQgdmFsdWVzIGZvciB0aG9zZSBtZXRyaWNzCiAgICovCiAgcHVibGljIGZ1bmN0aW9uICZhZG1pbl9nZXRNZXRyaWNzKCRzdGFydF90aW1lLCAkZW5kX3RpbWUsICRwZXJpb2QsICRtZXRyaWNzKSB7CiAgICByZXR1cm4gJHRoaXMtPmNhbGxfbWV0aG9kKCdhZG1pbi5nZXRNZXRyaWNzJywKICAgICAgICBhcnJheSgnc3RhcnRfdGltZScgPT4gJHN0YXJ0X3RpbWUsCiAgICAgICAgICAgICAgJ2VuZF90aW1lJyA9PiAkZW5kX3RpbWUsCiAgICAgICAgICAgICAgJ3BlcmlvZCcgPT4gJHBlcmlvZCwKICAgICAgICAgICAgICAnbWV0cmljcycgPT4ganNvbl9lbmNvZGUoJG1ldHJpY3MpKSk7CiAgfQoKICAvKioKICAgKiBTZXRzIGFwcGxpY2F0aW9uIHJlc3RyaWN0aW9uIGluZm8uCiAgICoKICAgKiBBcHBsaWNhdGlvbnMgY2FuIHJlc3RyaWN0IHRoZW1zZWx2ZXMgdG8gb25seSBhIGxpbWl0ZWQgdXNlciBkZW1vZ3JhcGhpYwogICAqIGJhc2VkIG9uIHVzZXJzJyBhZ2UgYW5kL29yIGxvY2F0aW9uIG9yIGJhc2VkIG9uIHN0YXRpYyBwcmVkZWZpbmVkIHR5cGVzCiAgICogc3BlY2lmaWVkIGJ5IGZhY2Vib29rIGZvciBzcGVjaWZ5aW5nIGRpZmYgYWdlIHJlc3RyaWN0aW9uIGZvciBkaWZmCiAgICogbG9jYXRpb25zLgogICAqCiAgICogQHBhcmFtIGFycmF5ICRyZXN0cmljdGlvbl9pbmZvICBUaGUgYWdlIHJlc3RyaWN0aW9uIHNldHRpbmdzIHRvIHNldC4KICAgKgogICAqIEByZXR1cm4gYm9vbCAgdHJ1ZSBvbiBzdWNjZXNzCiAgICovCiAgcHVibGljIGZ1bmN0aW9uIGFkbWluX3NldFJlc3RyaWN0aW9uSW5mbygkcmVzdHJpY3Rpb25faW5mbyA9IG51bGwpIHsKICAgICRyZXN0cmljdGlvbl9zdHIgPSBudWxsOwogICAgaWYgKCFlbXB0eSgkcmVzdHJpY3Rpb25faW5mbykpIHsKICAgICAgJHJlc3RyaWN0aW9uX3N0ciA9IGpzb25fZW5jb2RlKCRyZXN0cmljdGlvbl9pbmZvKTsKICAgIH0KICAgIHJldHVybiAkdGhpcy0+Y2FsbF9tZXRob2QoJ2FkbWluLnNldFJlc3RyaWN0aW9uSW5mbycsCiAgICAgICAgYXJyYXkoJ3Jlc3RyaWN0aW9uX3N0cicgPT4gJHJlc3RyaWN0aW9uX3N0cikpOwogIH0KCiAgLyoqCiAgICogR2V0cyBhcHBsaWNhdGlvbiByZXN0cmljdGlvbiBpbmZvLgogICAqCiAgICogQXBwbGljYXRpb25zIGNhbiByZXN0cmljdCB0aGVtc2VsdmVzIHRvIG9ubHkgYSBsaW1pdGVkIHVzZXIgZGVtb2dyYXBoaWMKICAgKiBiYXNlZCBvbiB1c2VycycgYWdlIGFuZC9vciBsb2NhdGlvbiBvciBiYXNlZCBvbiBzdGF0aWMgcHJlZGVmaW5lZCB0eXBlcwogICAqIHNwZWNpZmllZCBieSBmYWNlYm9vayBmb3Igc3BlY2lmeWluZyBkaWZmIGFnZSByZXN0cmljdGlvbiBmb3IgZGlmZgogICAqIGxvY2F0aW9ucy4KICAgKgogICAqIEByZXR1cm4gYXJyYXkgIFRoZSBhZ2UgcmVzdHJpY3Rpb24gc2V0dGluZ3MgZm9yIHRoaXMgYXBwbGljYXRpb24uCiAgICovCiAgcHVibGljIGZ1bmN0aW9uIGFkbWluX2dldFJlc3RyaWN0aW9uSW5mbygpIHsKICAgIHJldHVybiBqc29uX2RlY29kZSgKICAgICAgICAkdGhpcy0+Y2FsbF9tZXRob2QoJ2FkbWluLmdldFJlc3RyaWN0aW9uSW5mbycpLAogICAgICAgIHRydWUpOwogIH0KCgogIC8qKgogICAqIEJhbnMgYSBsaXN0IG9mIHVzZXJzIGZyb20gdGhlIGFwcC4gQmFubmVkIHVzZXJzIGNhbid0CiAgICogYWNjZXNzIHRoZSBhcHAncyBjYW52YXMgcGFnZSBhbmQgZm9ydW1zLgogICAqCiAgICogQHBhcmFtIGFycmF5ICR1aWRzIGFuIGFycmF5IG9mIHVzZXIgaWRzCiAgICogQHJldHVybiBib29sIHRydWUgb24gc3VjY2VzcwogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBhZG1pbl9iYW5Vc2VycygkdWlkcykgewogICAgcmV0dXJuICR0aGlzLT5jYWxsX21ldGhvZCgKICAgICAgJ2FkbWluLmJhblVzZXJzJywgYXJyYXkoJ3VpZHMnID0+IGpzb25fZW5jb2RlKCR1aWRzKSkpOwogIH0KCiAgLyoqCiAgICogVW5iYW4gdXNlcnMgdGhhdCBoYXZlIGJlZW4gcHJldmlvdXNseSBiYW5uZWQgd2l0aAogICAqIGFkbWluX2JhblVzZXJzKCkuCiAgICoKICAgKiBAcGFyYW0gYXJyYXkgJHVpZHMgYW4gYXJyYXkgb2YgdXNlciBpZHMKICAgKiBAcmV0dXJuIGJvb2wgdHJ1ZSBvbiBzdWNjZXNzCiAgICovCiAgcHVibGljIGZ1bmN0aW9uIGFkbWluX3VuYmFuVXNlcnMoJHVpZHMpIHsKICAgIHJldHVybiAkdGhpcy0+Y2FsbF9tZXRob2QoCiAgICAgICdhZG1pbi51bmJhblVzZXJzJywgYXJyYXkoJ3VpZHMnID0+IGpzb25fZW5jb2RlKCR1aWRzKSkpOwogIH0KCiAgLyoqCiAgICogR2V0cyB0aGUgbGlzdCBvZiB1c2VycyB0aGF0IGhhdmUgYmVlbiBiYW5uZWQgZnJvbSB0aGUgYXBwbGljYXRpb24uCiAgICogJHVpZHMgaXMgYW4gb3B0aW9uYWwgcGFyYW1ldGVyIHRoYXQgZmlsdGVycyB0aGUgcmVzdWx0IHdpdGggdGhlIGxpc3QKICAgKiBvZiBwcm92aWRlZCB1c2VyIGlkcy4gSWYgJHVpZHMgaXMgcHJvdmlkZWQsCiAgICogb25seSBiYW5uZWQgdXNlciBpZHMgdGhhdCBhcmUgY29udGFpbmVkIGluICR1aWRzIGFyZSByZXR1cm5lZC4KICAgKgogICAqIEBwYXJhbSBhcnJheSAkdWlkcyBhbiBhcnJheSBvZiB1c2VyIGlkcyB0byBmaWx0ZXIgYnkKICAgKiBAcmV0dXJuIGJvb2wgdHJ1ZSBvbiBzdWNjZXNzCiAgICovCgogIHB1YmxpYyBmdW5jdGlvbiBhZG1pbl9nZXRCYW5uZWRVc2VycygkdWlkcyA9IG51bGwpIHsKICAgIHJldHVybiAkdGhpcy0+Y2FsbF9tZXRob2QoCiAgICAgICdhZG1pbi5nZXRCYW5uZWRVc2VycycsCiAgICAgIGFycmF5KCd1aWRzJyA9PiAkdWlkcyA/IGpzb25fZW5jb2RlKCR1aWRzKSA6IG51bGwpKTsKICB9CgoKICAvKiBVVElMSVRZIEZVTkNUSU9OUyAqLwoKICAvKioKICAgKiBDYWxscyB0aGUgc3BlY2lmaWVkIG5vcm1hbCBQT1NUIG1ldGhvZCB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycy4KICAgKgogICAqIEBwYXJhbSBzdHJpbmcgJG1ldGhvZCAgTmFtZSBvZiB0aGUgRmFjZWJvb2sgbWV0aG9kIHRvIGludm9rZQogICAqIEBwYXJhbSBhcnJheSAkcGFyYW1zICAgQSBtYXAgb2YgcGFyYW0gbmFtZXMgPT4gcGFyYW0gdmFsdWVzCiAgICoKICAgKiBAcmV0dXJuIG1peGVkICBSZXN1bHQgb2YgbWV0aG9kIGNhbGw7IHRoaXMgcmV0dXJucyBhIHJlZmVyZW5jZSB0byBzdXBwb3J0CiAgICogICAgICAgICAgICAgICAgJ2RlbGF5ZWQgcmV0dXJucycgd2hlbiBpbiBhIGJhdGNoIGNvbnRleHQuCiAgICogICAgIFNlZTogaHR0cDovL3dpa2kuZGV2ZWxvcGVycy5mYWNlYm9vay5jb20vaW5kZXgucGhwL1VzaW5nX2JhdGNoaW5nX0FQSQogICAqLwogIHB1YmxpYyBmdW5jdGlvbiAmY2FsbF9tZXRob2QoJG1ldGhvZCwgJHBhcmFtcyA9IGFycmF5KCkpIHsKICAgIGlmICgkdGhpcy0+Zm9ybWF0KSB7CiAgICAgICRwYXJhbXNbJ2Zvcm1hdCddID0gJHRoaXMtPmZvcm1hdDsKICAgIH0KICAgIGlmICghJHRoaXMtPnBlbmRpbmdfYmF0Y2goKSkgewogICAgICBpZiAoJHRoaXMtPmNhbGxfYXNfYXBpa2V5KSB7CiAgICAgICAgJHBhcmFtc1snY2FsbF9hc19hcGlrZXknXSA9ICR0aGlzLT5jYWxsX2FzX2FwaWtleTsKICAgICAgfQogICAgICAkZGF0YSA9ICR0aGlzLT5wb3N0X3JlcXVlc3QoJG1ldGhvZCwgJHBhcmFtcyk7CiAgICAgICRyZXN1bHQgPSAkdGhpcy0+Y29udmVydF9yZXN1bHQoJGRhdGEsICRtZXRob2QsICRwYXJhbXMpOwogICAgICBpZiAoaXNfYXJyYXkoJHJlc3VsdCkgJiYgaXNzZXQoJHJlc3VsdFsnZXJyb3JfY29kZSddKSkgewogICAgICAgIHRocm93IG5ldyBGYWNlYm9va1Jlc3RDbGllbnRFeGNlcHRpb24oJHJlc3VsdFsnZXJyb3JfbXNnJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmVzdWx0WydlcnJvcl9jb2RlJ10pOwogICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgJHJlc3VsdCA9IG51bGw7CiAgICAgICRiYXRjaF9pdGVtID0gYXJyYXkoJ20nID0+ICRtZXRob2QsICdwJyA9PiAkcGFyYW1zLCAncicgPT4gJiAkcmVzdWx0KTsKICAgICAgJHRoaXMtPmJhdGNoX3F1ZXVlW10gPSAkYmF0Y2hfaXRlbTsKICAgIH0KCiAgICByZXR1cm4gJHJlc3VsdDsKICB9CgogIHByb3RlY3RlZCBmdW5jdGlvbiBjb252ZXJ0X3Jlc3VsdCgkZGF0YSwgJG1ldGhvZCwgJHBhcmFtcykgewogICAgJGlzX3htbCA9IChlbXB0eSgkcGFyYW1zWydmb3JtYXQnXSkgfHwKICAgICAgICAgICAgICAgc3RydG9sb3dlcigkcGFyYW1zWydmb3JtYXQnXSkgIT0gJ2pzb24nKTsKICAgIHJldHVybiAoJGlzX3htbCkgPyAkdGhpcy0+Y29udmVydF94bWxfdG9fcmVzdWx0KCRkYXRhLCAkbWV0aG9kLCAkcGFyYW1zKQogICAgICAgICAgICAgICAgICAgICA6IGpzb25fZGVjb2RlKCRkYXRhLCB0cnVlKTsKICB9CgogIC8qKgogICAqIENoYW5nZSB0aGUgcmVzcG9uc2UgZm9ybWF0CiAgICoKICAgKiBAcGFyYW0gc3RyaW5nICRmb3JtYXQgVGhlIHJlc3BvbnNlIGZvcm1hdCAoanNvbiwgeG1sKQogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBzZXRGb3JtYXQoJGZvcm1hdCkgewogICAgJHRoaXMtPmZvcm1hdCA9ICRmb3JtYXQ7CiAgICByZXR1cm4gJHRoaXM7CiAgfQoKICAvKioKICAgKiBnZXQgdGhlIGN1cnJlbnQgcmVzcG9uc2Ugc2VyaWFsaXphdGlvbiBmb3JtYXQKICAgKgogICAqIEByZXR1cm4gc3RyaW5nICd4bWwnLCAnanNvbicsIG9yIG51bGwgKHdoaWNoIG1lYW5zICd4bWwnKQogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBnZXRGb3JtYXQoKSB7CiAgICByZXR1cm4gJHRoaXMtPmZvcm1hdDsKICB9CgogIC8qKgogICAqIENhbGxzIHRoZSBzcGVjaWZpZWQgZmlsZS11cGxvYWQgUE9TVCBtZXRob2Qgd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMKICAgKgogICAqIEBwYXJhbSBzdHJpbmcgJG1ldGhvZCBOYW1lIG9mIHRoZSBGYWNlYm9vayBtZXRob2QgdG8gaW52b2tlCiAgICogQHBhcmFtIGFycmF5ICAkcGFyYW1zIEEgbWFwIG9mIHBhcmFtIG5hbWVzID0+IHBhcmFtIHZhbHVlcwogICAqIEBwYXJhbSBzdHJpbmcgJGZpbGUgICBBIHBhdGggdG8gdGhlIGZpbGUgdG8gdXBsb2FkIChyZXF1aXJlZCkKICAgKgogICAqIEByZXR1cm4gYXJyYXkgQSBkaWN0aW9uYXJ5IHJlcHJlc2VudGluZyB0aGUgcmVzcG9uc2UuCiAgICovCiAgcHVibGljIGZ1bmN0aW9uIGNhbGxfdXBsb2FkX21ldGhvZCgkbWV0aG9kLCAkcGFyYW1zLCAkZmlsZSwgJHNlcnZlcl9hZGRyID0gbnVsbCkgewogICAgaWYgKCEkdGhpcy0+cGVuZGluZ19iYXRjaCgpKSB7CiAgICAgIGlmICghZmlsZV9leGlzdHMoJGZpbGUpKSB7CiAgICAgICAgJGNvZGUgPQogICAgICAgICAgRmFjZWJvb2tBUElFcnJvckNvZGVzOjpBUElfRUNfUEFSQU07CiAgICAgICAgJGRlc2NyaXB0aW9uID0gRmFjZWJvb2tBUElFcnJvckNvZGVzOjokYXBpX2Vycm9yX2Rlc2NyaXB0aW9uc1skY29kZV07CiAgICAgICAgdGhyb3cgbmV3IEZhY2Vib29rUmVzdENsaWVudEV4Y2VwdGlvbigkZGVzY3JpcHRpb24sICRjb2RlKTsKICAgICAgfQoKICAgICAgaWYgKCR0aGlzLT5mb3JtYXQpIHsKICAgICAgICAkcGFyYW1zWydmb3JtYXQnXSA9ICR0aGlzLT5mb3JtYXQ7CiAgICAgIH0KICAgICAgJGRhdGEgPSAkdGhpcy0+cG9zdF91cGxvYWRfcmVxdWVzdCgkbWV0aG9kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNlcnZlcl9hZGRyKTsKICAgICAgJHJlc3VsdCA9ICR0aGlzLT5jb252ZXJ0X3Jlc3VsdCgkZGF0YSwgJG1ldGhvZCwgJHBhcmFtcyk7CgogICAgICBpZiAoaXNfYXJyYXkoJHJlc3VsdCkgJiYgaXNzZXQoJHJlc3VsdFsnZXJyb3JfY29kZSddKSkgewogICAgICAgIHRocm93IG5ldyBGYWNlYm9va1Jlc3RDbGllbnRFeGNlcHRpb24oJHJlc3VsdFsnZXJyb3JfbXNnJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmVzdWx0WydlcnJvcl9jb2RlJ10pOwogICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgJGNvZGUgPQogICAgICAgIEZhY2Vib29rQVBJRXJyb3JDb2Rlczo6QVBJX0VDX0JBVENIX01FVEhPRF9OT1RfQUxMT1dFRF9JTl9CQVRDSF9NT0RFOwogICAgICAkZGVzY3JpcHRpb24gPSBGYWNlYm9va0FQSUVycm9yQ29kZXM6OiRhcGlfZXJyb3JfZGVzY3JpcHRpb25zWyRjb2RlXTsKICAgICAgdGhyb3cgbmV3IEZhY2Vib29rUmVzdENsaWVudEV4Y2VwdGlvbigkZGVzY3JpcHRpb24sICRjb2RlKTsKICAgIH0KCiAgICByZXR1cm4gJHJlc3VsdDsKICB9CgogIHByb3RlY3RlZCBmdW5jdGlvbiBjb252ZXJ0X3htbF90b19yZXN1bHQoJHhtbCwgJG1ldGhvZCwgJHBhcmFtcykgewogICAgJHN4bWwgPSBzaW1wbGV4bWxfbG9hZF9zdHJpbmcoJHhtbCk7CiAgICAkcmVzdWx0ID0gc2VsZjo6Y29udmVydF9zaW1wbGV4bWxfdG9fYXJyYXkoJHN4bWwpOwoKICAgIGlmICghZW1wdHkoJEdMT0JBTFNbJ2ZhY2Vib29rX2NvbmZpZyddWydkZWJ1ZyddKSkgewogICAgICAvLyBvdXRwdXQgdGhlIHJhdyB4bWwgYW5kIGl0cyBjb3JyZXNwb25kaW5nIHBocCBvYmplY3QsIGZvciBkZWJ1Z2dpbmc6CiAgICAgIHByaW50ICc8ZGl2IHN0eWxlPSJtYXJnaW46IDEwcHggMzBweDsgcGFkZGluZzogNXB4OyBib3JkZXI6IDJweCBzb2xpZCBibGFjazsgYmFja2dyb3VuZDogZ3JheTsgY29sb3I6IHdoaXRlOyBmb250LXNpemU6IDEycHg7IGZvbnQtd2VpZ2h0OiBib2xkOyI+JzsKICAgICAgJHRoaXMtPmN1cl9pZCsrOwogICAgICBwcmludCAkdGhpcy0+Y3VyX2lkIC4gJzogQ2FsbGVkICcgLiAkbWV0aG9kIC4gJywgc2hvdyAnIC4KICAgICAgICAgICAgJzxhIGhyZWY9IyBvbmNsaWNrPSJyZXR1cm4gdG9nZ2xlRGlzcGxheSgnIC4gJHRoaXMtPmN1cl9pZCAuICcsIFwncGFyYW1zXCcpOyI+UGFyYW1zPC9hPiB8ICcuCiAgICAgICAgICAgICc8YSBocmVmPSMgb25jbGljaz0icmV0dXJuIHRvZ2dsZURpc3BsYXkoJyAuICR0aGlzLT5jdXJfaWQgLiAnLCBcJ3htbFwnKTsiPlhNTDwvYT4gfCAnLgogICAgICAgICAgICAnPGEgaHJlZj0jIG9uY2xpY2s9InJldHVybiB0b2dnbGVEaXNwbGF5KCcgLiAkdGhpcy0+Y3VyX2lkIC4gJywgXCdzeG1sXCcpOyI+U1hNTDwvYT4gfCAnLgogICAgICAgICAgICAnPGEgaHJlZj0jIG9uY2xpY2s9InJldHVybiB0b2dnbGVEaXNwbGF5KCcgLiAkdGhpcy0+Y3VyX2lkIC4gJywgXCdwaHBcJyk7Ij5QSFA8L2E+JzsKICAgICAgcHJpbnQgJzxwcmUgaWQ9InBhcmFtcycuJHRoaXMtPmN1cl9pZC4nIiBzdHlsZT0iZGlzcGxheTogbm9uZTsgb3ZlcmZsb3c6IGF1dG87Ij4nLnByaW50X3IoJHBhcmFtcywgdHJ1ZSkuJzwvcHJlPic7CiAgICAgIHByaW50ICc8cHJlIGlkPSJ4bWwnLiR0aGlzLT5jdXJfaWQuJyIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7IG92ZXJmbG93OiBhdXRvOyI+Jy5odG1sc3BlY2lhbGNoYXJzKCR4bWwpLic8L3ByZT4nOwogICAgICBwcmludCAnPHByZSBpZD0icGhwJy4kdGhpcy0+Y3VyX2lkLiciIHN0eWxlPSJkaXNwbGF5OiBub25lOyBvdmVyZmxvdzogYXV0bzsiPicucHJpbnRfcigkcmVzdWx0LCB0cnVlKS4nPC9wcmU+JzsKICAgICAgcHJpbnQgJzxwcmUgaWQ9InN4bWwnLiR0aGlzLT5jdXJfaWQuJyIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7IG92ZXJmbG93OiBhdXRvOyI+Jy5wcmludF9yKCRzeG1sLCB0cnVlKS4nPC9wcmU+JzsKICAgICAgcHJpbnQgJzwvZGl2Pic7CiAgICB9CiAgICByZXR1cm4gJHJlc3VsdDsKICB9CgogIHByb3RlY3RlZCBmdW5jdGlvbiBmaW5hbGl6ZV9wYXJhbXMoJG1ldGhvZCwgJHBhcmFtcykgewogICAgbGlzdCgkZ2V0LCAkcG9zdCkgPSAkdGhpcy0+YWRkX3N0YW5kYXJkX3BhcmFtcygkbWV0aG9kLCAkcGFyYW1zKTsKICAgIC8vIHdlIG5lZWQgdG8gZG8gdGhpcyBiZWZvcmUgc2lnbmluZyB0aGUgcGFyYW1zCiAgICAkdGhpcy0+Y29udmVydF9hcnJheV92YWx1ZXNfdG9fanNvbigkcG9zdCk7CiAgICAkcG9zdFsnc2lnJ10gPSBGYWNlYm9vazo6Z2VuZXJhdGVfc2lnKGFycmF5X21lcmdlKCRnZXQsICRwb3N0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnNlY3JldCk7CiAgICByZXR1cm4gYXJyYXkoJGdldCwgJHBvc3QpOwogIH0KCiAgcHJpdmF0ZSBmdW5jdGlvbiBjb252ZXJ0X2FycmF5X3ZhbHVlc190b19qc29uKCYkcGFyYW1zKSB7CiAgICBmb3JlYWNoICgkcGFyYW1zIGFzICRrZXkgPT4gJiR2YWwpIHsKICAgICAgaWYgKGlzX2FycmF5KCR2YWwpKSB7CiAgICAgICAgJHZhbCA9IGpzb25fZW5jb2RlKCR2YWwpOwogICAgICB9CiAgICB9CiAgfQoKICAvKioKICAgKiBBZGQgdGhlIGdlbmVyYWxseSByZXF1aXJlZCBwYXJhbXMgdG8gb3VyIHJlcXVlc3QuCiAgICogUGFyYW1zIG1ldGhvZCwgYXBpX2tleSwgYW5kIHYgc2hvdWxkIGJlIHNlbnQgb3ZlciBhcyBnZXQuCiAgICovCiAgcHJpdmF0ZSBmdW5jdGlvbiBhZGRfc3RhbmRhcmRfcGFyYW1zKCRtZXRob2QsICRwYXJhbXMpIHsKICAgICRwb3N0ID0gJHBhcmFtczsKICAgICRnZXQgPSBhcnJheSgpOwogICAgaWYgKCR0aGlzLT5jYWxsX2FzX2FwaWtleSkgewogICAgICAkZ2V0WydjYWxsX2FzX2FwaWtleSddID0gJHRoaXMtPmNhbGxfYXNfYXBpa2V5OwogICAgfQogICAgaWYgKCR0aGlzLT51c2luZ19zZXNzaW9uX3NlY3JldCkgewogICAgICAkZ2V0WydzcyddID0gJzEnOwogICAgfQoKICAgICRnZXRbJ21ldGhvZCddID0gJG1ldGhvZDsKICAgICRnZXRbJ3Nlc3Npb25fa2V5J10gPSAkdGhpcy0+c2Vzc2lvbl9rZXk7CiAgICAkZ2V0WydhcGlfa2V5J10gPSAkdGhpcy0+YXBpX2tleTsKICAgICRwb3N0WydjYWxsX2lkJ10gPSBtaWNyb3RpbWUodHJ1ZSk7CiAgICBpZiAoJHBvc3RbJ2NhbGxfaWQnXSA8PSAkdGhpcy0+bGFzdF9jYWxsX2lkKSB7CiAgICAgICRwb3N0WydjYWxsX2lkJ10gPSAkdGhpcy0+bGFzdF9jYWxsX2lkICsgMC4wMDE7CiAgICB9CiAgICAkdGhpcy0+bGFzdF9jYWxsX2lkID0gJHBvc3RbJ2NhbGxfaWQnXTsKICAgIGlmIChpc3NldCgkcG9zdFsndiddKSkgewogICAgICAkZ2V0Wyd2J10gPSAkcG9zdFsndiddOwogICAgICB1bnNldCgkcG9zdFsndiddKTsKICAgIH0gZWxzZSB7CiAgICAgICRnZXRbJ3YnXSA9ICcxLjAnOwogICAgfQogICAgaWYgKGlzc2V0KCR0aGlzLT51c2Vfc3NsX3Jlc291cmNlcykgJiYKICAgICAgICAkdGhpcy0+dXNlX3NzbF9yZXNvdXJjZXMpIHsKICAgICAgJHBvc3RbJ3JldHVybl9zc2xfcmVzb3VyY2VzJ10gPSB0cnVlOwogICAgfQogICAgcmV0dXJuIGFycmF5KCRnZXQsICRwb3N0KTsKICB9CgogIHByaXZhdGUgZnVuY3Rpb24gY3JlYXRlX3VybF9zdHJpbmcoJHBhcmFtcykgewogICAgJHBvc3RfcGFyYW1zID0gYXJyYXkoKTsKICAgIGZvcmVhY2ggKCRwYXJhbXMgYXMgJGtleSA9PiAmJHZhbCkgewogICAgICAkcG9zdF9wYXJhbXNbXSA9ICRrZXkuJz0nLnVybGVuY29kZSgkdmFsKTsKICAgIH0KICAgIHJldHVybiBpbXBsb2RlKCcmJywgJHBvc3RfcGFyYW1zKTsKICB9CgogIHByaXZhdGUgZnVuY3Rpb24gcnVuX211bHRpcGFydF9odHRwX3RyYW5zYWN0aW9uKCRtZXRob2QsICRwYXJhbXMsICRmaWxlLCAkc2VydmVyX2FkZHIpIHsKCiAgICAvLyB0aGUgZm9ybWF0IG9mIHRoaXMgbWVzc2FnZSBpcyBzcGVjaWZpZWQgaW4gUkZDMTg2Ny9SRkMxMzQxLgogICAgLy8gd2UgYWRkIHR3ZW50eSBwc2V1ZG8tcmFuZG9tIGRpZ2l0cyB0byB0aGUgZW5kIG9mIHRoZSBib3VuZGFyeSBzdHJpbmcuCiAgICAkYm91bmRhcnkgPSAnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1GYk11THRJcEFyVCcgLgogICAgICAgICAgICAgICAgc3ByaW50ZigiJTAxMGQiLCBtdF9yYW5kKCkpIC4KICAgICAgICAgICAgICAgIHNwcmludGYoIiUwMTBkIiwgbXRfcmFuZCgpKTsKICAgICRjb250ZW50X3R5cGUgPSAnbXVsdGlwYXJ0L2Zvcm0tZGF0YTsgYm91bmRhcnk9JyAuICRib3VuZGFyeTsKICAgIC8vIHdpdGhpbiB0aGUgbWVzc2FnZSwgd2UgcHJlcGVuZCB0d28gZXh0cmEgaHlwaGVucy4KICAgICRkZWxpbWl0ZXIgPSAnLS0nIC4gJGJvdW5kYXJ5OwogICAgJGNsb3NlX2RlbGltaXRlciA9ICRkZWxpbWl0ZXIgLiAnLS0nOwogICAgJGNvbnRlbnRfbGluZXMgPSBhcnJheSgpOwogICAgZm9yZWFjaCAoJHBhcmFtcyBhcyAka2V5ID0+ICYkdmFsKSB7CiAgICAgICRjb250ZW50X2xpbmVzW10gPSAkZGVsaW1pdGVyOwogICAgICAkY29udGVudF9saW5lc1tdID0gJ0NvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsgbmFtZT0iJyAuICRrZXkgLiAnIic7CiAgICAgICRjb250ZW50X2xpbmVzW10gPSAnJzsKICAgICAgJGNvbnRlbnRfbGluZXNbXSA9ICR2YWw7CiAgICB9CiAgICAvLyBub3cgYWRkIHRoZSBmaWxlIGRhdGEKICAgICRjb250ZW50X2xpbmVzW10gPSAkZGVsaW1pdGVyOwogICAgJGNvbnRlbnRfbGluZXNbXSA9CiAgICAgICdDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IGZpbGVuYW1lPSInIC4gJGZpbGUgLiAnIic7CiAgICAkY29udGVudF9saW5lc1tdID0gJ0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJzsKICAgICRjb250ZW50X2xpbmVzW10gPSAnJzsKICAgICRjb250ZW50X2xpbmVzW10gPSBmaWxlX2dldF9jb250ZW50cygkZmlsZSk7CiAgICAkY29udGVudF9saW5lc1tdID0gJGNsb3NlX2RlbGltaXRlcjsKICAgICRjb250ZW50X2xpbmVzW10gPSAnJzsKICAgICRjb250ZW50ID0gaW1wbG9kZSgiXHJcbiIsICRjb250ZW50X2xpbmVzKTsKICAgIHJldHVybiAkdGhpcy0+cnVuX2h0dHBfcG9zdF90cmFuc2FjdGlvbigkY29udGVudF90eXBlLCAkY29udGVudCwgJHNlcnZlcl9hZGRyKTsKICB9CgogIHB1YmxpYyBmdW5jdGlvbiBwb3N0X3JlcXVlc3QoJG1ldGhvZCwgJHBhcmFtcykgewogICAgbGlzdCgkZ2V0LCAkcG9zdCkgPSAkdGhpcy0+ZmluYWxpemVfcGFyYW1zKCRtZXRob2QsICRwYXJhbXMpOwogICAgJHBvc3Rfc3RyaW5nID0gJHRoaXMtPmNyZWF0ZV91cmxfc3RyaW5nKCRwb3N0KTsKICAgICRnZXRfc3RyaW5nID0gJHRoaXMtPmNyZWF0ZV91cmxfc3RyaW5nKCRnZXQpOwogICAgJHVybF93aXRoX2dldCA9ICR0aGlzLT5zZXJ2ZXJfYWRkciAuICc/JyAuICRnZXRfc3RyaW5nOwogICAgaWYgKCR0aGlzLT51c2VfY3VybF9pZl9hdmFpbGFibGUgJiYgZnVuY3Rpb25fZXhpc3RzKCdjdXJsX2luaXQnKSkgewogICAgICAkdXNlcmFnZW50ID0gJ0ZhY2Vib29rIEFQSSBQSFA1IENsaWVudCAxLjEgKGN1cmwpICcgLiBwaHB2ZXJzaW9uKCk7CiAgICAgICRjaCA9IGN1cmxfaW5pdCgpOwogICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfVVJMLCAkdXJsX3dpdGhfZ2V0KTsKICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1BPU1RGSUVMRFMsICRwb3N0X3N0cmluZyk7CiAgICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwgdHJ1ZSk7CiAgICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9VU0VSQUdFTlQsICR1c2VyYWdlbnQpOwogICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfQ09OTkVDVFRJTUVPVVQsIDEwKTsKICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1RJTUVPVVQsIDMwKTsKICAgICAgJHJlc3VsdCA9ICR0aGlzLT5jdXJsX2V4ZWMoJGNoKTsKICAgICAgY3VybF9jbG9zZSgkY2gpOwogICAgfSBlbHNlIHsKICAgICAgJGNvbnRlbnRfdHlwZSA9ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnOwogICAgICAkY29udGVudCA9ICRwb3N0X3N0cmluZzsKICAgICAgJHJlc3VsdCA9ICR0aGlzLT5ydW5faHR0cF9wb3N0X3RyYW5zYWN0aW9uKCRjb250ZW50X3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY29udGVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR1cmxfd2l0aF9nZXQpOwogICAgfQogICAgcmV0dXJuICRyZXN1bHQ7CiAgfQoKICAvKioKICAgKiBleGVjdXRlIGEgY3VybCB0cmFuc2FjdGlvbiAtLSB0aGlzIGV4aXN0cyBtb3N0bHkgc28gc3ViY2xhc3NlcyBjYW4gYWRkCiAgICogZXh0cmEgb3B0aW9ucyBhbmQvb3IgcHJvY2VzcyB0aGUgcmVzcG9uc2UsIGlmIHRoZXkgd2lzaC4KICAgKgogICAqIEBwYXJhbSByZXNvdXJjZSAkY2ggYSBjdXJsIGhhbmRsZQogICAqLwogIHByb3RlY3RlZCBmdW5jdGlvbiBjdXJsX2V4ZWMoJGNoKSB7CiAgICAgICRyZXN1bHQgPSBjdXJsX2V4ZWMoJGNoKTsKICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgfQoKICBwcm90ZWN0ZWQgZnVuY3Rpb24gcG9zdF91cGxvYWRfcmVxdWVzdCgkbWV0aG9kLCAkcGFyYW1zLCAkZmlsZSwgJHNlcnZlcl9hZGRyID0gbnVsbCkgewogICAgJHNlcnZlcl9hZGRyID0gJHNlcnZlcl9hZGRyID8gJHNlcnZlcl9hZGRyIDogJHRoaXMtPnNlcnZlcl9hZGRyOwogICAgbGlzdCgkZ2V0LCAkcG9zdCkgPSAkdGhpcy0+ZmluYWxpemVfcGFyYW1zKCRtZXRob2QsICRwYXJhbXMpOwogICAgJGdldF9zdHJpbmcgPSAkdGhpcy0+Y3JlYXRlX3VybF9zdHJpbmcoJGdldCk7CiAgICAkdXJsX3dpdGhfZ2V0ID0gJHNlcnZlcl9hZGRyIC4gJz8nIC4gJGdldF9zdHJpbmc7CiAgICBpZiAoJHRoaXMtPnVzZV9jdXJsX2lmX2F2YWlsYWJsZSAmJiBmdW5jdGlvbl9leGlzdHMoJ2N1cmxfaW5pdCcpKSB7CiAgICAgIC8vIHByZXBlbmRpbmcgJ0AnIGNhdXNlcyBjVVJMIHRvIHVwbG9hZCB0aGUgZmlsZTsgdGhlIGtleSBpcyBpZ25vcmVkLgogICAgICAkcG9zdFsnX2ZpbGUnXSA9ICdAJyAuICRmaWxlOwogICAgICAkdXNlcmFnZW50ID0gJ0ZhY2Vib29rIEFQSSBQSFA1IENsaWVudCAxLjEgKGN1cmwpICcgLiBwaHB2ZXJzaW9uKCk7CiAgICAgICRjaCA9IGN1cmxfaW5pdCgpOwogICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfVVJMLCAkdXJsX3dpdGhfZ2V0KTsKICAgICAgLy8gdGhpcyBoYXMgdG8gY29tZSBiZWZvcmUgdGhlIFBPU1RGSUVMRFMgc2V0IQogICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfUE9TVCwgMSk7CiAgICAgIC8vIHBhc3NpbmcgYW4gYXJyYXkgZ2V0cyBjdXJsIHRvIHVzZSB0aGUgbXVsdGlwYXJ0L2Zvcm0tZGF0YSBjb250ZW50IHR5cGUKICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1BPU1RGSUVMRFMsICRwb3N0KTsKICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLCB0cnVlKTsKICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1VTRVJBR0VOVCwgJHVzZXJhZ2VudCk7CiAgICAgICRyZXN1bHQgPSAkdGhpcy0+Y3VybF9leGVjKCRjaCk7CiAgICAgIGN1cmxfY2xvc2UoJGNoKTsKICAgIH0gZWxzZSB7CiAgICAgICRyZXN1bHQgPSAkdGhpcy0+cnVuX211bHRpcGFydF9odHRwX3RyYW5zYWN0aW9uKCRtZXRob2QsICRwb3N0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZmlsZSwgJHVybF93aXRoX2dldCk7CiAgICB9CiAgICByZXR1cm4gJHJlc3VsdDsKICB9CgogIHByaXZhdGUgZnVuY3Rpb24gcnVuX2h0dHBfcG9zdF90cmFuc2FjdGlvbigkY29udGVudF90eXBlLCAkY29udGVudCwgJHNlcnZlcl9hZGRyKSB7CgogICAgJHVzZXJfYWdlbnQgPSAnRmFjZWJvb2sgQVBJIFBIUDUgQ2xpZW50IDEuMSAobm9uLWN1cmwpICcgLiBwaHB2ZXJzaW9uKCk7CiAgICAkY29udGVudF9sZW5ndGggPSBzdHJsZW4oJGNvbnRlbnQpOwogICAgJGNvbnRleHQgPQogICAgICBhcnJheSgnaHR0cCcgPT4KICAgICAgICAgICAgICBhcnJheSgnbWV0aG9kJyA9PiAnUE9TVCcsCiAgICAgICAgICAgICAgICAgICAgJ3VzZXJfYWdlbnQnID0+ICR1c2VyX2FnZW50LAogICAgICAgICAgICAgICAgICAgICdoZWFkZXInID0+ICdDb250ZW50LVR5cGU6ICcgLiAkY29udGVudF90eXBlIC4gIlxyXG4iIC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ29udGVudC1MZW5ndGg6ICcgLiAkY29udGVudF9sZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgJ2NvbnRlbnQnID0+ICRjb250ZW50KSk7CiAgICAkY29udGV4dF9pZCA9IHN0cmVhbV9jb250ZXh0X2NyZWF0ZSgkY29udGV4dCk7CiAgICAkc29jayA9IGZvcGVuKCRzZXJ2ZXJfYWRkciwgJ3InLCBmYWxzZSwgJGNvbnRleHRfaWQpOwoKICAgICRyZXN1bHQgPSAnJzsKICAgIGlmICgkc29jaykgewogICAgICB3aGlsZSAoIWZlb2YoJHNvY2spKSB7CiAgICAgICAgJHJlc3VsdCAuPSBmZ2V0cygkc29jaywgNDA5Nik7CiAgICAgIH0KICAgICAgZmNsb3NlKCRzb2NrKTsKICAgIH0KICAgIHJldHVybiAkcmVzdWx0OwogIH0KCiAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjb252ZXJ0X3NpbXBsZXhtbF90b19hcnJheSgkc3htbCkgewogICAgJGFyciA9IGFycmF5KCk7CiAgICBpZiAoJHN4bWwpIHsKICAgICAgZm9yZWFjaCAoJHN4bWwgYXMgJGsgPT4gJHYpIHsKICAgICAgICBpZiAoJHN4bWxbJ2xpc3QnXSkgewogICAgICAgICAgJGFycltdID0gc2VsZjo6Y29udmVydF9zaW1wbGV4bWxfdG9fYXJyYXkoJHYpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAkYXJyWyRrXSA9IHNlbGY6OmNvbnZlcnRfc2ltcGxleG1sX3RvX2FycmF5KCR2KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmIChzaXplb2YoJGFycikgPiAwKSB7CiAgICAgIHJldHVybiAkYXJyOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIChzdHJpbmcpJHN4bWw7CiAgICB9CiAgfQoKICBwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0X3VpZCgkdWlkKSB7CiAgICByZXR1cm4gJHVpZCA/ICR1aWQgOiAkdGhpcy0+dXNlcjsKICB9Cn0KCgpjbGFzcyBGYWNlYm9va1Jlc3RDbGllbnRFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewp9CgovLyBTdXBwb3J0aW5nIG1ldGhvZHMgYW5kIHZhbHVlcy0tLS0tLQoKLyoqCiAqIEVycm9yIGNvZGVzIGFuZCBkZXNjcmlwdGlvbnMgZm9yIHRoZSBGYWNlYm9vayBBUEkuCiAqLwoKY2xhc3MgRmFjZWJvb2tBUElFcnJvckNvZGVzIHsKCiAgY29uc3QgQVBJX0VDX1NVQ0NFU1MgPSAwOwoKICAvKgogICAqIEdFTkVSQUwgRVJST1JTCiAgICovCiAgY29uc3QgQVBJX0VDX1VOS05PV04gPSAxOwogIGNvbnN0IEFQSV9FQ19TRVJWSUNFID0gMjsKICBjb25zdCBBUElfRUNfTUVUSE9EID0gMzsKICBjb25zdCBBUElfRUNfVE9PX01BTllfQ0FMTFMgPSA0OwogIGNvbnN0IEFQSV9FQ19CQURfSVAgPSA1OwogIGNvbnN0IEFQSV9FQ19IT1NUX0FQSSA9IDY7CiAgY29uc3QgQVBJX0VDX0hPU1RfVVAgPSA3OwogIGNvbnN0IEFQSV9FQ19TRUNVUkUgPSA4OwogIGNvbnN0IEFQSV9FQ19SQVRFID0gOTsKICBjb25zdCBBUElfRUNfUEVSTUlTU0lPTl9ERU5JRUQgPSAxMDsKICBjb25zdCBBUElfRUNfREVQUkVDQVRFRCA9IDExOwogIGNvbnN0IEFQSV9FQ19WRVJTSU9OID0gMTI7CiAgY29uc3QgQVBJX0VDX0lOVEVSTkFMX0ZRTF9FUlJPUiA9IDEzOwogIGNvbnN0IEFQSV9FQ19IT1NUX1BVUCA9IDE0OwogIGNvbnN0IEFQSV9FQ19TRVNTSU9OX1NFQ1JFVF9OT1RfQUxMT1dFRCA9IDE1OwoKICAvKgogICAqIFBBUkFNRVRFUiBFUlJPUlMKICAgKi8KICBjb25zdCBBUElfRUNfUEFSQU0gPSAxMDA7CiAgY29uc3QgQVBJX0VDX1BBUkFNX0FQSV9LRVkgPSAxMDE7CiAgY29uc3QgQVBJX0VDX1BBUkFNX1NFU1NJT05fS0VZID0gMTAyOwogIGNvbnN0IEFQSV9FQ19QQVJBTV9DQUxMX0lEID0gMTAzOwogIGNvbnN0IEFQSV9FQ19QQVJBTV9TSUdOQVRVUkUgPSAxMDQ7CiAgY29uc3QgQVBJX0VDX1BBUkFNX1RPT19NQU5ZID0gMTA1OwogIGNvbnN0IEFQSV9FQ19QQVJBTV9VU0VSX0lEID0gMTEwOwogIGNvbnN0IEFQSV9FQ19QQVJBTV9VU0VSX0ZJRUxEID0gMTExOwogIGNvbnN0IEFQSV9FQ19QQVJBTV9TT0NJQUxfRklFTEQgPSAxMTI7CiAgY29uc3QgQVBJX0VDX1BBUkFNX0VNQUlMID0gMTEzOwogIGNvbnN0IEFQSV9FQ19QQVJBTV9VU0VSX0lEX0xJU1QgPSAxMTQ7CiAgY29uc3QgQVBJX0VDX1BBUkFNX0ZJRUxEX0xJU1QgPSAxMTU7CiAgY29uc3QgQVBJX0VDX1BBUkFNX0FMQlVNX0lEID0gMTIwOwogIGNvbnN0IEFQSV9FQ19QQVJBTV9QSE9UT19JRCA9IDEyMTsKICBjb25zdCBBUElfRUNfUEFSQU1fRkVFRF9QUklPUklUWSA9IDEzMDsKICBjb25zdCBBUElfRUNfUEFSQU1fQ0FURUdPUlkgPSAxNDA7CiAgY29uc3QgQVBJX0VDX1BBUkFNX1NVQkNBVEVHT1JZID0gMTQxOwogIGNvbnN0IEFQSV9FQ19QQVJBTV9USVRMRSA9IDE0MjsKICBjb25zdCBBUElfRUNfUEFSQU1fREVTQ1JJUFRJT04gPSAxNDM7CiAgY29uc3QgQVBJX0VDX1BBUkFNX0JBRF9KU09OID0gMTQ0OwogIGNvbnN0IEFQSV9FQ19QQVJBTV9CQURfRUlEID0gMTUwOwogIGNvbnN0IEFQSV9FQ19QQVJBTV9VTktOT1dOX0NJVFkgPSAxNTE7CiAgY29uc3QgQVBJX0VDX1BBUkFNX0JBRF9QQUdFX1RZUEUgPSAxNTI7CiAgY29uc3QgQVBJX0VDX1BBUkFNX0JBRF9MT0NBTEUgPSAxNzA7CgogIC8qCiAgICogVVNFUiBQRVJNSVNTSU9OUyBFUlJPUlMKICAgKi8KICBjb25zdCBBUElfRUNfUEVSTUlTU0lPTiA9IDIwMDsKICBjb25zdCBBUElfRUNfUEVSTUlTU0lPTl9VU0VSID0gMjEwOwogIGNvbnN0IEFQSV9FQ19QRVJNSVNTSU9OX05PX0RFVkVMT1BFUlMgPSAyMTE7CiAgY29uc3QgQVBJX0VDX1BFUk1JU1NJT05fT0ZGTElORV9BQ0NFU1MgPSAyMTI7CiAgY29uc3QgQVBJX0VDX1BFUk1JU1NJT05fQUxCVU0gPSAyMjA7CiAgY29uc3QgQVBJX0VDX1BFUk1JU1NJT05fUEhPVE8gPSAyMjE7CiAgY29uc3QgQVBJX0VDX1BFUk1JU1NJT05fTUVTU0FHRSA9IDIzMDsKICBjb25zdCBBUElfRUNfUEVSTUlTU0lPTl9PVEhFUl9VU0VSID0gMjQwOwogIGNvbnN0IEFQSV9FQ19QRVJNSVNTSU9OX1NUQVRVU19VUERBVEUgPSAyNTA7CiAgY29uc3QgQVBJX0VDX1BFUk1JU1NJT05fUEhPVE9fVVBMT0FEID0gMjYwOwogIGNvbnN0IEFQSV9FQ19QRVJNSVNTSU9OX1ZJREVPX1VQTE9BRCA9IDI2MTsKICBjb25zdCBBUElfRUNfUEVSTUlTU0lPTl9TTVMgPSAyNzA7CiAgY29uc3QgQVBJX0VDX1BFUk1JU1NJT05fQ1JFQVRFX0xJU1RJTkcgPSAyODA7CiAgY29uc3QgQVBJX0VDX1BFUk1JU1NJT05fQ1JFQVRFX05PVEUgPSAyODE7CiAgY29uc3QgQVBJX0VDX1BFUk1JU1NJT05fU0hBUkVfSVRFTSA9IDI4MjsKICBjb25zdCBBUElfRUNfUEVSTUlTU0lPTl9FVkVOVCA9IDI5MDsKICBjb25zdCBBUElfRUNfUEVSTUlTU0lPTl9MQVJHRV9GQk1MX1RFTVBMQVRFID0gMjkxOwogIGNvbnN0IEFQSV9FQ19QRVJNSVNTSU9OX0xJVkVNRVNTQUdFID0gMjkyOwogIGNvbnN0IEFQSV9FQ19QRVJNSVNTSU9OX1JTVlBfRVZFTlQgPSAyOTk7CgogIC8qCiAgICogREFUQSBFRElUIEVSUk9SUwogICAqLwogIGNvbnN0IEFQSV9FQ19FRElUID0gMzAwOwogIGNvbnN0IEFQSV9FQ19FRElUX1VTRVJfREFUQSA9IDMxMDsKICBjb25zdCBBUElfRUNfRURJVF9QSE9UTyA9IDMyMDsKICBjb25zdCBBUElfRUNfRURJVF9BTEJVTV9TSVpFID0gMzIxOwogIGNvbnN0IEFQSV9FQ19FRElUX1BIT1RPX1RBR19TVUJKRUNUID0gMzIyOwogIGNvbnN0IEFQSV9FQ19FRElUX1BIT1RPX1RBR19QSE9UTyA9IDMyMzsKICBjb25zdCBBUElfRUNfRURJVF9QSE9UT19GSUxFID0gMzI0OwogIGNvbnN0IEFQSV9FQ19FRElUX1BIT1RPX1BFTkRJTkdfTElNSVQgPSAzMjU7CiAgY29uc3QgQVBJX0VDX0VESVRfUEhPVE9fVEFHX0xJTUlUID0gMzI2OwogIGNvbnN0IEFQSV9FQ19FRElUX0FMQlVNX1JFT1JERVJfUEhPVE9fTk9UX0lOX0FMQlVNID0gMzI3OwogIGNvbnN0IEFQSV9FQ19FRElUX0FMQlVNX1JFT1JERVJfVE9PX0ZFV19QSE9UT1MgPSAzMjg7CgogIGNvbnN0IEFQSV9FQ19NQUxGT1JNRURfTUFSS1VQID0gMzI5OwogIGNvbnN0IEFQSV9FQ19FRElUX01BUktVUCA9IDMzMDsKCiAgY29uc3QgQVBJX0VDX0VESVRfRkVFRF9UT09fTUFOWV9VU0VSX0NBTExTID0gMzQwOwogIGNvbnN0IEFQSV9FQ19FRElUX0ZFRURfVE9PX01BTllfVVNFUl9BQ1RJT05fQ0FMTFMgPSAzNDE7CiAgY29uc3QgQVBJX0VDX0VESVRfRkVFRF9USVRMRV9MSU5LID0gMzQyOwogIGNvbnN0IEFQSV9FQ19FRElUX0ZFRURfVElUTEVfTEVOR1RIID0gMzQzOwogIGNvbnN0IEFQSV9FQ19FRElUX0ZFRURfVElUTEVfTkFNRSA9IDM0NDsKICBjb25zdCBBUElfRUNfRURJVF9GRUVEX1RJVExFX0JMQU5LID0gMzQ1OwogIGNvbnN0IEFQSV9FQ19FRElUX0ZFRURfQk9EWV9MRU5HVEggPSAzNDY7CiAgY29uc3QgQVBJX0VDX0VESVRfRkVFRF9QSE9UT19TUkMgPSAzNDc7CiAgY29uc3QgQVBJX0VDX0VESVRfRkVFRF9QSE9UT19MSU5LID0gMzQ4OwoKICBjb25zdCBBUElfRUNfRURJVF9WSURFT19TSVpFID0gMzUwOwogIGNvbnN0IEFQSV9FQ19FRElUX1ZJREVPX0lOVkFMSURfRklMRSA9IDM1MTsKICBjb25zdCBBUElfRUNfRURJVF9WSURFT19JTlZBTElEX1RZUEUgPSAzNTI7CiAgY29uc3QgQVBJX0VDX0VESVRfVklERU9fRklMRSA9IDM1MzsKCiAgY29uc3QgQVBJX0VDX0VESVRfRkVFRF9USVRMRV9BUlJBWSA9IDM2MDsKICBjb25zdCBBUElfRUNfRURJVF9GRUVEX1RJVExFX1BBUkFNUyA9IDM2MTsKICBjb25zdCBBUElfRUNfRURJVF9GRUVEX0JPRFlfQVJSQVkgPSAzNjI7CiAgY29uc3QgQVBJX0VDX0VESVRfRkVFRF9CT0RZX1BBUkFNUyA9IDM2MzsKICBjb25zdCBBUElfRUNfRURJVF9GRUVEX1BIT1RPID0gMzY0OwogIGNvbnN0IEFQSV9FQ19FRElUX0ZFRURfVEVNUExBVEUgPSAzNjU7CiAgY29uc3QgQVBJX0VDX0VESVRfRkVFRF9UQVJHRVQgPSAzNjY7CiAgY29uc3QgQVBJX0VDX0VESVRfRkVFRF9NQVJLVVAgPSAzNjc7CgogIC8qKgogICAqIFNFU1NJT04gRVJST1JTCiAgICovCiAgY29uc3QgQVBJX0VDX1NFU1NJT05fVElNRURfT1VUID0gNDUwOwogIGNvbnN0IEFQSV9FQ19TRVNTSU9OX01FVEhPRCA9IDQ1MTsKICBjb25zdCBBUElfRUNfU0VTU0lPTl9JTlZBTElEID0gNDUyOwogIGNvbnN0IEFQSV9FQ19TRVNTSU9OX1JFUVVJUkVEID0gNDUzOwogIGNvbnN0IEFQSV9FQ19TRVNTSU9OX1JFUVVJUkVEX0ZPUl9TRUNSRVQgPSA0NTQ7CiAgY29uc3QgQVBJX0VDX1NFU1NJT05fQ0FOTk9UX1VTRV9TRVNTSU9OX1NFQ1JFVCA9IDQ1NTsKCgogIC8qKgogICAqIEZRTCBFUlJPUlMKICAgKi8KICBjb25zdCBGUUxfRUNfVU5LTk9XTl9FUlJPUiA9IDYwMDsKICBjb25zdCBGUUxfRUNfUEFSU0VSID0gNjAxOyAvLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQogIGNvbnN0IEZRTF9FQ19QQVJTRVJfRVJST1IgPSA2MDE7CiAgY29uc3QgRlFMX0VDX1VOS05PV05fRklFTEQgPSA2MDI7CiAgY29uc3QgRlFMX0VDX1VOS05PV05fVEFCTEUgPSA2MDM7CiAgY29uc3QgRlFMX0VDX05PVF9JTkRFWEFCTEUgPSA2MDQ7IC8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CiAgY29uc3QgRlFMX0VDX05PX0lOREVYID0gNjA0OwogIGNvbnN0IEZRTF9FQ19VTktOT1dOX0ZVTkNUSU9OID0gNjA1OwogIGNvbnN0IEZRTF9FQ19JTlZBTElEX1BBUkFNID0gNjA2OwogIGNvbnN0IEZRTF9FQ19JTlZBTElEX0ZJRUxEID0gNjA3OwogIGNvbnN0IEZRTF9FQ19JTlZBTElEX1NFU1NJT04gPSA2MDg7CiAgY29uc3QgRlFMX0VDX1VOU1VQUE9SVEVEX0FQUF9UWVBFID0gNjA5OwogIGNvbnN0IEZRTF9FQ19TRVNTSU9OX1NFQ1JFVF9OT1RfQUxMT1dFRCA9IDYxMDsKICBjb25zdCBGUUxfRUNfREVQUkVDQVRFRF9UQUJMRSA9IDYxMTsKICBjb25zdCBGUUxfRUNfRVhURU5ERURfUEVSTUlTU0lPTiA9IDYxMjsKICBjb25zdCBGUUxfRUNfUkFURV9MSU1JVF9FWENFRURFRCA9IDYxMzsKICBjb25zdCBGUUxfRUNfVU5SRVNPTFZFRF9ERVBFTkRFTkNZID0gNjE0OwogIGNvbnN0IEZRTF9FQ19JTlZBTElEX1NFQVJDSCA9IDYxNTsKICBjb25zdCBGUUxfRUNfQ09OVEFJTlNfRVJST1IgPSA2MTY7CgogIGNvbnN0IEFQSV9FQ19SRUZfU0VUX0ZBSUxFRCA9IDcwMDsKCiAgLyoqCiAgICogREFUQSBTVE9SRSBBUEkgRVJST1JTCiAgICovCiAgY29uc3QgQVBJX0VDX0RBVEFfVU5LTk9XTl9FUlJPUiA9IDgwMDsKICBjb25zdCBBUElfRUNfREFUQV9JTlZBTElEX09QRVJBVElPTiA9IDgwMTsKICBjb25zdCBBUElfRUNfREFUQV9RVU9UQV9FWENFRURFRCA9IDgwMjsKICBjb25zdCBBUElfRUNfREFUQV9PQkpFQ1RfTk9UX0ZPVU5EID0gODAzOwogIGNvbnN0IEFQSV9FQ19EQVRBX09CSkVDVF9BTFJFQURZX0VYSVNUUyA9IDgwNDsKICBjb25zdCBBUElfRUNfREFUQV9EQVRBQkFTRV9FUlJPUiA9IDgwNTsKICBjb25zdCBBUElfRUNfREFUQV9DUkVBVEVfVEVNUExBVEVfRVJST1IgPSA4MDY7CiAgY29uc3QgQVBJX0VDX0RBVEFfVEVNUExBVEVfRVhJU1RTX0VSUk9SID0gODA3OwogIGNvbnN0IEFQSV9FQ19EQVRBX1RFTVBMQVRFX0hBTkRMRV9UT09fTE9ORyA9IDgwODsKICBjb25zdCBBUElfRUNfREFUQV9URU1QTEFURV9IQU5ETEVfQUxSRUFEWV9JTl9VU0UgPSA4MDk7CiAgY29uc3QgQVBJX0VDX0RBVEFfVE9PX01BTllfVEVNUExBVEVfQlVORExFUyA9IDgxMDsKICBjb25zdCBBUElfRUNfREFUQV9NQUxGT1JNRURfQUNUSU9OX0xJTksgPSA4MTE7CiAgY29uc3QgQVBJX0VDX0RBVEFfVEVNUExBVEVfVVNFU19SRVNFUlZFRF9UT0tFTiA9IDgxMjsKCiAgLyoKICAgKiBBUFBMSUNBVElPTiBJTkZPIEVSUk9SUwogICAqLwogIGNvbnN0IEFQSV9FQ19OT19TVUNIX0FQUCA9IDkwMDsKCiAgLyoKICAgKiBCQVRDSCBFUlJPUlMKICAgKi8KICBjb25zdCBBUElfRUNfQkFUQ0hfVE9PX01BTllfSVRFTVMgPSA5NTA7CiAgY29uc3QgQVBJX0VDX0JBVENIX0FMUkVBRFlfU1RBUlRFRCA9IDk1MTsKICBjb25zdCBBUElfRUNfQkFUQ0hfTk9UX1NUQVJURUQgPSA5NTI7CiAgY29uc3QgQVBJX0VDX0JBVENIX01FVEhPRF9OT1RfQUxMT1dFRF9JTl9CQVRDSF9NT0RFID0gOTUzOwoKICAvKgogICAqIEVWRU5UIEFQSSBFUlJPUlMKICAgKi8KICBjb25zdCBBUElfRUNfRVZFTlRfSU5WQUxJRF9USU1FID0gMTAwMDsKCiAgLyoKICAgKiBJTkZPIEJPWCBFUlJPUlMKICAgKi8KICBjb25zdCBBUElfRUNfSU5GT19OT19JTkZPUk1BVElPTiA9IDEwNTA7CiAgY29uc3QgQVBJX0VDX0lORk9fU0VUX0ZBSUxFRCA9IDEwNTE7CgogIC8qCiAgICogTElWRU1FU1NBR0UgQVBJIEVSUk9SUwogICAqLwogIGNvbnN0IEFQSV9FQ19MSVZFTUVTU0FHRV9TRU5EX0ZBSUxFRCA9IDExMDA7CiAgY29uc3QgQVBJX0VDX0xJVkVNRVNTQUdFX0VWRU5UX05BTUVfVE9PX0xPTkcgPSAxMTAxOwogIGNvbnN0IEFQSV9FQ19MSVZFTUVTU0FHRV9NRVNTQUdFX1RPT19MT05HID0gMTEwMjsKCiAgLyoKICAgKiBQQVlNRU5UUyBBUEkgRVJST1JTCiAgICovCiAgY29uc3QgQVBJX0VDX1BBWU1FTlRTX1VOS05PV04gPSAxMTUwOwogIGNvbnN0IEFQSV9FQ19QQVlNRU5UU19BUFBfSU5WQUxJRCA9IDExNTE7CiAgY29uc3QgQVBJX0VDX1BBWU1FTlRTX0RBVEFCQVNFID0gMTE1MjsKICBjb25zdCBBUElfRUNfUEFZTUVOVFNfUEVSTUlTU0lPTl9ERU5JRUQgPSAxMTUzOwogIGNvbnN0IEFQSV9FQ19QQVlNRU5UU19BUFBfTk9fUkVTUE9OU0UgPSAxMTU0OwogIGNvbnN0IEFQSV9FQ19QQVlNRU5UU19BUFBfRVJST1JfUkVTUE9OU0UgPSAxMTU1OwogIGNvbnN0IEFQSV9FQ19QQVlNRU5UU19JTlZBTElEX09SREVSID0gMTE1NjsKICBjb25zdCBBUElfRUNfUEFZTUVOVFNfSU5WQUxJRF9QQVJBTSA9IDExNTc7CiAgY29uc3QgQVBJX0VDX1BBWU1FTlRTX0lOVkFMSURfT1BFUkFUSU9OID0gMTE1ODsKICBjb25zdCBBUElfRUNfUEFZTUVOVFNfUEFZTUVOVF9GQUlMRUQgPSAxMTU5OwogIGNvbnN0IEFQSV9FQ19QQVlNRU5UU19ESVNBQkxFRCA9IDExNjA7CgogIC8qCiAgICogQ09OTkVDVCBTRVNTSU9OIEVSUk9SUwogICAqLwogIGNvbnN0IEFQSV9FQ19DT05ORUNUX0ZFRURfRElTQUJMRUQgPSAxMzAwOwoKICAvKgogICAqIFBsYXRmb3JtIHRhZyBidW5kbGVzIGVycm9ycwogICAqLwogIGNvbnN0IEFQSV9FQ19UQUdfQlVORExFX1FVT1RBID0gMTQwMDsKCiAgLyoKICAgKiBTSEFSRQogICAqLwogIGNvbnN0IEFQSV9FQ19TSEFSRV9CQURfVVJMID0gMTUwMDsKCiAgLyoKICAgKiBOT1RFUwogICAqLwogIGNvbnN0IEFQSV9FQ19OT1RFX0NBTk5PVF9NT0RJRlkgPSAxNjAwOwoKICAvKgogICAqIENPTU1FTlRTCiAgICovCiAgY29uc3QgQVBJX0VDX0NPTU1FTlRTX1VOS05PV04gPSAxNzAwOwogIGNvbnN0IEFQSV9FQ19DT01NRU5UU19QT1NUX1RPT19MT05HID0gMTcwMTsKICBjb25zdCBBUElfRUNfQ09NTUVOVFNfREJfRE9XTiA9IDE3MDI7CiAgY29uc3QgQVBJX0VDX0NPTU1FTlRTX0lOVkFMSURfWElEID0gMTcwMzsKICBjb25zdCBBUElfRUNfQ09NTUVOVFNfSU5WQUxJRF9VSUQgPSAxNzA0OwogIGNvbnN0IEFQSV9FQ19DT01NRU5UU19JTlZBTElEX1BPU1QgPSAxNzA1OwogIGNvbnN0IEFQSV9FQ19DT01NRU5UU19JTlZBTElEX1JFTU9WRSA9IDE3MDY7CgogIC8qCiAgICogR0lGVFMKICAgKi8KICBjb25zdCBBUElfRUNfR0lGVFNfVU5LTk9XTiA9IDE5MDA7CgogIC8qCiAgICogQVBQTElDQVRJT04gTU9SQVRPUklVTSBFUlJPUlMKICAgKi8KICBjb25zdCBBUElfRUNfRElTQUJMRURfQUxMID0gMjAwMDsKICBjb25zdCBBUElfRUNfRElTQUJMRURfU1RBVFVTID0gMjAwMTsKICBjb25zdCBBUElfRUNfRElTQUJMRURfRkVFRF9TVE9SSUVTID0gMjAwMjsKICBjb25zdCBBUElfRUNfRElTQUJMRURfTk9USUZJQ0FUSU9OUyA9IDIwMDM7CiAgY29uc3QgQVBJX0VDX0RJU0FCTEVEX1JFUVVFU1RTID0gMjAwNDsKICBjb25zdCBBUElfRUNfRElTQUJMRURfRU1BSUwgPSAyMDA1OwoKICAvKioKICAgKiBUaGlzIGFycmF5IGlzIG5vIGxvbmdlciBtYWludGFpbmVkOyB0byB2aWV3IHRoZSBkZXNjcmlwdGlvbiBvZiBhbiBlcnJvcgogICAqIGNvZGUsIHBsZWFzZSBsb29rIGF0IHRoZSBtZXNzYWdlIGVsZW1lbnQgb2YgdGhlIEFQSSByZXNwb25zZSBvciB2aXNpdAogICAqIHRoZSBkZXZlbG9wZXIgd2lraSBhdCBodHRwOi8vd2lraS5kZXZlbG9wZXJzLmZhY2Vib29rLmNvbS8uCiAgICovCiAgcHVibGljIHN0YXRpYyAkYXBpX2Vycm9yX2Rlc2NyaXB0aW9ucyA9IGFycmF5KAogICAgICBzZWxmOjpBUElfRUNfU1VDQ0VTUyAgICAgICAgICAgPT4gJ1N1Y2Nlc3MnLAogICAgICBzZWxmOjpBUElfRUNfVU5LTk9XTiAgICAgICAgICAgPT4gJ0FuIHVua25vd24gZXJyb3Igb2NjdXJyZWQnLAogICAgICBzZWxmOjpBUElfRUNfU0VSVklDRSAgICAgICAgICAgPT4gJ1NlcnZpY2UgdGVtcG9yYXJpbHkgdW5hdmFpbGFibGUnLAogICAgICBzZWxmOjpBUElfRUNfTUVUSE9EICAgICAgICAgICAgPT4gJ1Vua25vd24gbWV0aG9kJywKICAgICAgc2VsZjo6QVBJX0VDX1RPT19NQU5ZX0NBTExTICAgID0+ICdBcHBsaWNhdGlvbiByZXF1ZXN0IGxpbWl0IHJlYWNoZWQnLAogICAgICBzZWxmOjpBUElfRUNfQkFEX0lQICAgICAgICAgICAgPT4gJ1VuYXV0aG9yaXplZCBzb3VyY2UgSVAgYWRkcmVzcycsCiAgICAgIHNlbGY6OkFQSV9FQ19QQVJBTSAgICAgICAgICAgICA9PiAnSW52YWxpZCBwYXJhbWV0ZXInLAogICAgICBzZWxmOjpBUElfRUNfUEFSQU1fQVBJX0tFWSAgICAgPT4gJ0ludmFsaWQgQVBJIGtleScsCiAgICAgIHNlbGY6OkFQSV9FQ19QQVJBTV9TRVNTSU9OX0tFWSA9PiAnU2Vzc2lvbiBrZXkgaW52YWxpZCBvciBubyBsb25nZXIgdmFsaWQnLAogICAgICBzZWxmOjpBUElfRUNfUEFSQU1fQ0FMTF9JRCAgICAgPT4gJ0NhbGxfaWQgbXVzdCBiZSBncmVhdGVyIHRoYW4gcHJldmlvdXMnLAogICAgICBzZWxmOjpBUElfRUNfUEFSQU1fU0lHTkFUVVJFICAgPT4gJ0luY29ycmVjdCBzaWduYXR1cmUnLAogICAgICBzZWxmOjpBUElfRUNfUEFSQU1fVVNFUl9JRCAgICAgPT4gJ0ludmFsaWQgdXNlciBpZCcsCiAgICAgIHNlbGY6OkFQSV9FQ19QQVJBTV9VU0VSX0ZJRUxEICA9PiAnSW52YWxpZCB1c2VyIGluZm8gZmllbGQnLAogICAgICBzZWxmOjpBUElfRUNfUEFSQU1fU09DSUFMX0ZJRUxEID0+ICdJbnZhbGlkIHVzZXIgZmllbGQnLAogICAgICBzZWxmOjpBUElfRUNfUEFSQU1fVVNFUl9JRF9MSVNUID0+ICdJbnZhbGlkIHVzZXIgaWQgbGlzdCcsCiAgICAgIHNlbGY6OkFQSV9FQ19QQVJBTV9GSUVMRF9MSVNUID0+ICdJbnZhbGlkIGZpZWxkIGxpc3QnLAogICAgICBzZWxmOjpBUElfRUNfUEFSQU1fQUxCVU1fSUQgICAgPT4gJ0ludmFsaWQgYWxidW0gaWQnLAogICAgICBzZWxmOjpBUElfRUNfUEFSQU1fQkFEX0VJRCAgICAgPT4gJ0ludmFsaWQgZWlkJywKICAgICAgc2VsZjo6QVBJX0VDX1BBUkFNX1VOS05PV05fQ0lUWSA9PiAnVW5rbm93biBjaXR5JywKICAgICAgc2VsZjo6QVBJX0VDX1BFUk1JU1NJT04gICAgICAgID0+ICdQZXJtaXNzaW9ucyBlcnJvcicsCiAgICAgIHNlbGY6OkFQSV9FQ19QRVJNSVNTSU9OX1VTRVIgICA9PiAnVXNlciBub3QgdmlzaWJsZScsCiAgICAgIHNlbGY6OkFQSV9FQ19QRVJNSVNTSU9OX05PX0RFVkVMT1BFUlMgID0+ICdBcHBsaWNhdGlvbiBoYXMgbm8gZGV2ZWxvcGVycycsCiAgICAgIHNlbGY6OkFQSV9FQ19QRVJNSVNTSU9OX0FMQlVNICA9PiAnQWxidW0gbm90IHZpc2libGUnLAogICAgICBzZWxmOjpBUElfRUNfUEVSTUlTU0lPTl9QSE9UTyAgPT4gJ1Bob3RvIG5vdCB2aXNpYmxlJywKICAgICAgc2VsZjo6QVBJX0VDX1BFUk1JU1NJT05fRVZFTlQgID0+ICdDcmVhdGluZyBhbmQgbW9kaWZ5aW5nIGV2ZW50cyByZXF1aXJlZCB0aGUgZXh0ZW5kZWQgcGVybWlzc2lvbiBjcmVhdGVfZXZlbnQnLAogICAgICBzZWxmOjpBUElfRUNfUEVSTUlTU0lPTl9SU1ZQX0VWRU5UID0+ICdSU1ZQaW5nIHRvIGV2ZW50cyByZXF1aXJlZCB0aGUgZXh0ZW5kZWQgcGVybWlzc2lvbiByc3ZwX2V2ZW50JywKICAgICAgc2VsZjo6QVBJX0VDX0VESVRfQUxCVU1fU0laRSAgID0+ICdBbGJ1bSBpcyBmdWxsJywKICAgICAgc2VsZjo6RlFMX0VDX1BBUlNFUiAgICAgICAgICAgID0+ICdGUUw6IFBhcnNlciBFcnJvcicsCiAgICAgIHNlbGY6OkZRTF9FQ19VTktOT1dOX0ZJRUxEICAgICA9PiAnRlFMOiBVbmtub3duIEZpZWxkJywKICAgICAgc2VsZjo6RlFMX0VDX1VOS05PV05fVEFCTEUgICAgID0+ICdGUUw6IFVua25vd24gVGFibGUnLAogICAgICBzZWxmOjpGUUxfRUNfTk9UX0lOREVYQUJMRSAgICAgPT4gJ0ZRTDogU3RhdGVtZW50IG5vdCBpbmRleGFibGUnLAogICAgICBzZWxmOjpGUUxfRUNfVU5LTk9XTl9GVU5DVElPTiAgPT4gJ0ZRTDogQXR0ZW1wdGVkIHRvIGNhbGwgdW5rbm93biBmdW5jdGlvbicsCiAgICAgIHNlbGY6OkZRTF9FQ19JTlZBTElEX1BBUkFNICAgICA9PiAnRlFMOiBJbnZhbGlkIHBhcmFtZXRlciBwYXNzZWQgaW4nLAogICAgICBzZWxmOjpBUElfRUNfREFUQV9VTktOT1dOX0VSUk9SID0+ICdVbmtub3duIGRhdGEgc3RvcmUgQVBJIGVycm9yJywKICAgICAgc2VsZjo6QVBJX0VDX0RBVEFfSU5WQUxJRF9PUEVSQVRJT04gPT4gJ0ludmFsaWQgb3BlcmF0aW9uJywKICAgICAgc2VsZjo6QVBJX0VDX0RBVEFfUVVPVEFfRVhDRUVERUQgPT4gJ0RhdGEgc3RvcmUgYWxsb3dhYmxlIHF1b3RhIHdhcyBleGNlZWRlZCcsCiAgICAgIHNlbGY6OkFQSV9FQ19EQVRBX09CSkVDVF9OT1RfRk9VTkQgPT4gJ1NwZWNpZmllZCBvYmplY3QgY2Fubm90IGJlIGZvdW5kJywKICAgICAgc2VsZjo6QVBJX0VDX0RBVEFfT0JKRUNUX0FMUkVBRFlfRVhJU1RTID0+ICdTcGVjaWZpZWQgb2JqZWN0IGFscmVhZHkgZXhpc3RzJywKICAgICAgc2VsZjo6QVBJX0VDX0RBVEFfREFUQUJBU0VfRVJST1IgPT4gJ0EgZGF0YWJhc2UgZXJyb3Igb2NjdXJyZWQuIFBsZWFzZSB0cnkgYWdhaW4nLAogICAgICBzZWxmOjpBUElfRUNfQkFUQ0hfQUxSRUFEWV9TVEFSVEVEID0+ICdiZWdpbl9iYXRjaCBhbHJlYWR5IGNhbGxlZCwgcGxlYXNlIG1ha2Ugc3VyZSB0byBjYWxsIGVuZF9iYXRjaCBmaXJzdCcsCiAgICAgIHNlbGY6OkFQSV9FQ19CQVRDSF9OT1RfU1RBUlRFRCA9PiAnZW5kX2JhdGNoIGNhbGxlZCBiZWZvcmUgYmVnaW5fYmF0Y2gnLAogICAgICBzZWxmOjpBUElfRUNfQkFUQ0hfTUVUSE9EX05PVF9BTExPV0VEX0lOX0JBVENIX01PREUgPT4gJ1RoaXMgbWV0aG9kIGlzIG5vdCBhbGxvd2VkIGluIGJhdGNoIG1vZGUnCiAgKTsKfQo=]]></data>
	</file>
	<file>
	  <filename>/facebook-platform/php/facebook_desktop.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLy8gQ29weXJpZ2h0IDIwMDQtMjAwOSBGYWNlYm9vay4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLy8KLy8gKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLy8gfCBGYWNlYm9vayBQbGF0Zm9ybSBQSFA1IGNsaWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLy8gKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLy8gfCBDb3B5cmlnaHQgKGMpIDIwMDcgRmFjZWJvb2ssIEluYy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLy8gfCBBbGwgcmlnaHRzIHJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLy8gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLy8gfCBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgICAgICAgIHwKLy8gfCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgICAgICAgIHwKLy8gfCBhcmUgbWV0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLy8gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLy8gfCAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCAgICAgICAgIHwKLy8gfCAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuICAgICAgICAgIHwKLy8gfCAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCAgICAgIHwKLy8gfCAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlICAgIHwKLy8gfCAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAgIHwKLy8gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLy8gfCBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiAgICAgIHwKLy8gfCBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIHwKLy8gfCBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgIHwKLy8gfCBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsICAgICAgICAgIHwKLy8gfCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgIHwKLy8gfCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIHwKLy8gfCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgICAgIHwKLy8gfCBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUICAgICAgIHwKLy8gfCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgIHwKLy8gfCBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAgICAgICAgIHwKLy8gKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLy8gfCBGb3IgaGVscCB3aXRoIHRoaXMgbGlicmFyeSwgY29udGFjdCBkZXZlbG9wZXJzLWhlbHBAZmFjZWJvb2suY29tICAgICAgICAgIHwKLy8gKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLy8KCi8qKgogKiAgVGhpcyBjbGFzcyBleHRlbmRzIGFuZCBtb2RpZmllcyB0aGUgIkZhY2Vib29rIiBjbGFzcyB0byBiZXR0ZXIKICogIHN1aXQgZGVza3RvcCBhcHBzLgogKi8KY2xhc3MgRmFjZWJvb2tEZXNrdG9wIGV4dGVuZHMgRmFjZWJvb2sgewogIC8vIHRoZSBhcHBsaWNhdGlvbiBzZWNyZXQsIHdoaWNoIGRpZmZlcnMgZnJvbSB0aGUgc2Vzc2lvbiBzZWNyZXQKICBwdWJsaWMgJGFwcF9zZWNyZXQ7CiAgcHVibGljICR2ZXJpZnlfc2lnOwoKICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGFwaV9rZXksICRzZWNyZXQpIHsKICAgICR0aGlzLT5hcHBfc2VjcmV0ID0gJHNlY3JldDsKICAgICR0aGlzLT52ZXJpZnlfc2lnID0gZmFsc2U7CiAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCRhcGlfa2V5LCAkc2VjcmV0KTsKICB9CgogIHB1YmxpYyBmdW5jdGlvbiBkb19nZXRfc2Vzc2lvbigkYXV0aF90b2tlbikgewogICAgJHRoaXMtPmFwaV9jbGllbnQtPnNlY3JldCA9ICR0aGlzLT5hcHBfc2VjcmV0OwogICAgJHRoaXMtPmFwaV9jbGllbnQtPnNlc3Npb25fa2V5ID0gbnVsbDsKICAgICRzZXNzaW9uX2luZm8gPSBwYXJlbnQ6OmRvX2dldF9zZXNzaW9uKCRhdXRoX3Rva2VuKTsKICAgIGlmICghZW1wdHkoJHNlc3Npb25faW5mb1snc2VjcmV0J10pKSB7CiAgICAgIC8vIHN0b3JlIHRoZSBzZXNzaW9uIHNlY3JldAogICAgICAkdGhpcy0+c2V0X3Nlc3Npb25fc2VjcmV0KCRzZXNzaW9uX2luZm9bJ3NlY3JldCddKTsKICAgIH0KICAgIHJldHVybiAkc2Vzc2lvbl9pbmZvOwogIH0KCiAgcHVibGljIGZ1bmN0aW9uIHNldF9zZXNzaW9uX3NlY3JldCgkc2Vzc2lvbl9zZWNyZXQpIHsKICAgICR0aGlzLT5zZWNyZXQgPSAkc2Vzc2lvbl9zZWNyZXQ7CiAgICAkdGhpcy0+YXBpX2NsaWVudC0+dXNlX3Nlc3Npb25fc2VjcmV0KCRzZXNzaW9uX3NlY3JldCk7CiAgfQoKICBwdWJsaWMgZnVuY3Rpb24gcmVxdWlyZV9sb2dpbigpIHsKICAgIGlmICgkdGhpcy0+Z2V0X2xvZ2dlZGluX3VzZXIoKSkgewogICAgICB0cnkgewogICAgICAgIC8vIHRyeSBhIHNlc3Npb24tYmFzZWQgQVBJIGNhbGwgdG8gZW5zdXJlIHRoYXQgd2UgaGF2ZSB0aGUgY29ycmVjdAogICAgICAgIC8vIHNlc3Npb24gc2VjcmV0CiAgICAgICAgJHVzZXIgPSAkdGhpcy0+YXBpX2NsaWVudC0+dXNlcnNfZ2V0TG9nZ2VkSW5Vc2VyKCk7CgogICAgICAgIC8vIG5vdyB0aGF0IHdlIGhhdmUgYSB2YWxpZCBzZXNzaW9uIHNlY3JldCwgdmVyaWZ5IHRoZSBzaWduYXR1cmUKICAgICAgICAkdGhpcy0+dmVyaWZ5X3NpZyA9IHRydWU7CiAgICAgICAgaWYgKCR0aGlzLT52YWxpZGF0ZV9mYl9wYXJhbXMoZmFsc2UpKSB7CiAgICAgICAgICByZXR1cm4gJHVzZXI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIHZhbGlkYXRpb24gZmFpbGVkCiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgIH0gY2F0Y2ggKEZhY2Vib29rUmVzdENsaWVudEV4Y2VwdGlvbiAkZXgpIHsKICAgICAgICBpZiAoaXNzZXQoJF9HRVRbJ2F1dGhfdG9rZW4nXSkpIHsKICAgICAgICAgIC8vIGlmIHdlIGhhdmUgYW4gYXV0aF90b2tlbiwgdXNlIGl0IHRvIGVzdGFibGlzaCBhIHNlc3Npb24KICAgICAgICAgICRzZXNzaW9uX2luZm8gPSAkdGhpcy0+ZG9fZ2V0X3Nlc3Npb24oJF9HRVRbJ2F1dGhfdG9rZW4nXSk7CiAgICAgICAgICBpZiAoJHNlc3Npb25faW5mbykgewogICAgICAgICAgICByZXR1cm4gJHNlc3Npb25faW5mb1sndWlkJ107CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICAvLyBpZiB3ZSBnZXQgaGVyZSwgd2UgbmVlZCB0byByZWRpcmVjdCB0aGUgdXNlciB0byBsb2cgaW4KICAgICR0aGlzLT5yZWRpcmVjdCgkdGhpcy0+Z2V0X2xvZ2luX3VybChzZWxmOjpjdXJyZW50X3VybCgpLCAkdGhpcy0+aW5fZmJfY2FudmFzKCkpKTsKICB9CgogIHB1YmxpYyBmdW5jdGlvbiB2ZXJpZnlfc2lnbmF0dXJlKCRmYl9wYXJhbXMsICRleHBlY3RlZF9zaWcpIHsKICAgIC8vIHdlIGRvbid0IHdhbnQgdG8gdmVyaWZ5IHRoZSBzaWduYXR1cmUgdW50aWwgd2UgaGF2ZSBhIHZhbGlkCiAgICAvLyBzZXNzaW9uIHNlY3JldAogICAgaWYgKCR0aGlzLT52ZXJpZnlfc2lnKSB7CiAgICAgIHJldHVybiBwYXJlbnQ6OnZlcmlmeV9zaWduYXR1cmUoJGZiX3BhcmFtcywgJGV4cGVjdGVkX3NpZyk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/facebook-platform/php/facebook_mobile.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLy8gQ29weXJpZ2h0IDIwMDQtMjAwOSBGYWNlYm9vay4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLy8KLy8gKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLy8gfCBGYWNlYm9vayBQbGF0Zm9ybSBQSFA1IGNsaWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLy8gKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLy8gfCBDb3B5cmlnaHQgKGMpIDIwMDcgRmFjZWJvb2ssIEluYy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLy8gfCBBbGwgcmlnaHRzIHJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLy8gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLy8gfCBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgICAgICAgIHwKLy8gfCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgICAgICAgIHwKLy8gfCBhcmUgbWV0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLy8gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLy8gfCAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCAgICAgICAgIHwKLy8gfCAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuICAgICAgICAgIHwKLy8gfCAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCAgICAgIHwKLy8gfCAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlICAgIHwKLy8gfCAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAgIHwKLy8gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLy8gfCBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiAgICAgIHwKLy8gfCBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIHwKLy8gfCBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgIHwKLy8gfCBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsICAgICAgICAgIHwKLy8gfCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgIHwKLy8gfCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIHwKLy8gfCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgICAgIHwKLy8gfCBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUICAgICAgIHwKLy8gfCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgIHwKLy8gfCBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAgICAgICAgIHwKLy8gKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLy8gfCBGb3IgaGVscCB3aXRoIHRoaXMgbGlicmFyeSwgY29udGFjdCBkZXZlbG9wZXJzLWhlbHBAZmFjZWJvb2suY29tICAgICAgICAgIHwKLy8gKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLy8KLyoqCiAqICBUaGlzIGNsYXNzIGV4dGVuZHMgYW5kIG1vZGlmaWVzIHRoZSAiRmFjZWJvb2siIGNsYXNzIHRvIGJldHRlciBzdWl0IHdhcAogKiAgYXBwcy4gU2luY2UgdGhlcmUgaXMgbm8gamF2YXNjcmlwdCBzdXBwb3J0LCB3ZSBuZWVkIHRvIHVzZSBzZXJ2ZXIgcmVkaXJlY3QKICogIHRvIGltcGxlbWVudCBGYWNlYm9vayBjb25uZWN0IGZ1bmN0aW9uYWxpdGllcyBzdWNoIGFzIGF1dGhlbnRpY2F0ZSwKICogIGF1dGhvcml6ZSwgZmVlZCBmb3JtIGV0Yy4uIFRoaXMgbGlicmFyeSBwcm92aWRlIG1hbnkgaGVscGVyIGZ1bmN0aW9ucyBmb3IKICogIHdhcCBkZXZlbG9wZXIgdG8gbG9jYXRlIHRoZSByaWdodCB3YXAgdXJsLiBUaGUgdXJsIGhlcmUgaXMgdGFyZ2VkIGF0CiAqICBmYWNlYm9vayB3YXAgc2l0ZSBvciB3YXAtZnJpZW5kbHkgdXJsLgogKi8KY2xhc3MgRmFjZWJvb2tNb2JpbGUgZXh0ZW5kcyBGYWNlYm9vayB7CiAgLy8gdGhlIGFwcGxpY2F0aW9uIHNlY3JldCwgd2hpY2ggZGlmZmVycyBmcm9tIHRoZSBzZXNzaW9uIHNlY3JldAoKICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGFwaV9rZXksICRzZWNyZXQsICRnZW5lcmF0ZV9zZXNzaW9uX3NlY3JldD1mYWxzZSkgewogICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkYXBpX2tleSwgJHNlY3JldCwgJGdlbmVyYXRlX3Nlc3Npb25fc2VjcmV0KTsKICB9CgogIHB1YmxpYyBmdW5jdGlvbiByZWRpcmVjdCgkdXJsKSB7CiAgICBoZWFkZXIoJ0xvY2F0aW9uOiAnLiAkdXJsKTsKICB9CgogIHB1YmxpYyBmdW5jdGlvbiBnZXRfbV91cmwoJGFjdGlvbiwgJHBhcmFtcykgewogICAgJHBhZ2UgPSBwYXJlbnQ6OmdldF9mYWNlYm9va191cmwoJ20nKS4gJy8nIC4kYWN0aW9uOwogICAgZm9yZWFjaCgkcGFyYW1zIGFzICRrZXkgPT4gJHZhbCkgewogICAgICBpZiAoISR2YWwpIHsKICAgICAgICB1bnNldCgkcGFyYW1zWyRrZXldKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuICRwYWdlIC4gJz8nIC4gaHR0cF9idWlsZF9xdWVyeSgkcGFyYW1zKTsKICB9CgogIHB1YmxpYyBmdW5jdGlvbiBnZXRfd3d3X3VybCgkYWN0aW9uLCAkcGFyYW1zKSB7CiAgICAkcGFnZSA9IHBhcmVudDo6Z2V0X2ZhY2Vib29rX3VybCgnd3d3JykuICcvJyAuJGFjdGlvbjsKICAgIGZvcmVhY2goJHBhcmFtcyBhcyAka2V5ID0+ICR2YWwpIHsKICAgICAgaWYgKCEkdmFsKSB7CiAgICAgICAgdW5zZXQoJHBhcmFtc1ska2V5XSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiAkcGFnZSAuICc/JyAuIGh0dHBfYnVpbGRfcXVlcnkoJHBhcmFtcyk7CiAgfQoKICBwdWJsaWMgZnVuY3Rpb24gZ2V0X2FkZF91cmwoJG5leHQ9bnVsbCkgewoKICAgIHJldHVybiAkdGhpcy0+Z2V0X21fdXJsKCdhZGQucGhwJywgYXJyYXkoJ2FwaV9rZXknID0+ICR0aGlzLT5hcGlfa2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmV4dCcgICAgPT4gJG5leHQpKTsKICB9CgogIHB1YmxpYyBmdW5jdGlvbiBnZXRfdG9zX3VybCgkbmV4dD1udWxsLCAkY2FuY2VsID0gbnVsbCwgJGNhbnZhcz1udWxsKSB7CiAgICByZXR1cm4gJHRoaXMtPmdldF9tX3VybCgndG9zLnBocCcsIGFycmF5KCdhcGlfa2V5JyA9PiAkdGhpcy0+YXBpX2tleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3YnICAgICAgID0+ICcxLjAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmV4dCcgICAgPT4gJG5leHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjYW52YXMnICA9PiAkY2FudmFzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY2FuY2VsJyAgID0+ICRjYW5jZWwpKTsKICB9CgogIHB1YmxpYyBmdW5jdGlvbiBnZXRfbG9nb3V0X3VybCgkbmV4dD1udWxsKSB7CiAgICAkcGFyYW1zID0gYXJyYXkoJ2FwaV9rZXknICAgICA9PiAkdGhpcy0+YXBpX2tleSwKICAgICAgICAgICAgICAgICAgICAnc2Vzc2lvbl9rZXknID0+ICR0aGlzLT5hcGlfY2xpZW50LT5zZXNzaW9uX2tleSwKICAgICAgICAgICAgICAgICAgICk7CgogICAgaWYgKCRuZXh0KSB7CiAgICAgICRwYXJhbXNbJ2Nvbm5lY3RfbmV4dCddID0gMTsKICAgICAgJHBhcmFtc1snbmV4dCddID0gJG5leHQ7CiAgICB9CgogICAgcmV0dXJuICR0aGlzLT5nZXRfbV91cmwoJ2xvZ291dC5waHAnLCAkcGFyYW1zKTsKICB9CiAgcHVibGljIGZ1bmN0aW9uIGdldF9yZWdpc3Rlcl91cmwoJG5leHQ9bnVsbCwgJGNhbmNlbF91cmw9bnVsbCkgewogICAgcmV0dXJuICR0aGlzLT5nZXRfbV91cmwoJ3IucGhwJywKICAgICAgYXJyYXkoJ2ZiY29ubmVjdCcgPT4gMSwKICAgICAgICAgICAgJ2FwaV9rZXknID0+ICR0aGlzLT5hcGlfa2V5LAogICAgICAgICAgICAnbmV4dCcgPT4gJG5leHQgPyAkbmV4dCA6IHBhcmVudDo6Y3VycmVudF91cmwoKSwKICAgICAgICAgICAgJ2NhbmNlbF91cmwnID0+ICRjYW5jZWxfdXJsID8gJGNhbmNlbF91cmwgOiBwYXJlbnQ6OmN1cnJlbnRfdXJsKCkpKTsKICB9CiAgLyoqCiAgICogVGhlc2Ugc2V0IG9mIGZiY29ubmVjdCBzdHlsZSB1cmwgcmVkaXJlY3QgYmFjayB0byB0aGUgYXBwbGljYXRpb24gY3VycmVudAogICAqIHBhZ2Ugd2hlbiB0aGUgYWN0aW9uIGlzIGRvbmUuIERldmVsb3BlciBjYW4gYWxzbyB1c2UgdGhlIG5vbiBmYmNvbm5lY3QKICAgKiBzdHlsZSB1cmwgYW5kIHByb3ZpZGUgdGhlaXIgb3duIHJlZGlyZWN0IGxpbmsgYnkgZ2l2aW5nIHRoZSByaWdodCBwYXJhbWV0ZXIKICAgKiB0byAkbmV4dCBhbmQvb3IgJGNhbmNlbF91cmwKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gZ2V0X2ZiY29ubmVjdF9yZWdpc3Rlcl91cmwoKSB7CiAgICByZXR1cm4gJHRoaXMtPmdldF9yZWdpc3Rlcl91cmwocGFyZW50OjpjdXJyZW50X3VybCgpLCBwYXJlbnQ6OmN1cnJlbnRfdXJsKCkpOwogIH0KICBwdWJsaWMgZnVuY3Rpb24gZ2V0X2ZiY29ubmVjdF90b3NfdXJsKCkgewogICAgcmV0dXJuICR0aGlzLT5nZXRfdG9zX3VybChwYXJlbnQ6OmN1cnJlbnRfdXJsKCksIHBhcmVudDo6Y3VycmVudF91cmwoKSwgJHRoaXMtPmluX2ZyYW1lKCkpOwogIH0KCiAgcHVibGljIGZ1bmN0aW9uIGdldF9mYmNvbm5lY3RfbG9nb3V0X3VybCgpIHsKICAgIHJldHVybiAkdGhpcy0+Z2V0X2xvZ291dF91cmwocGFyZW50OjpjdXJyZW50X3VybCgpKTsKICB9CgogIHB1YmxpYyBmdW5jdGlvbiBsb2dvdXRfdXNlcigpIHsKICAgICR0aGlzLT51c2VyID0gbnVsbDsKICB9CgogIHB1YmxpYyBmdW5jdGlvbiBnZXRfcHJvbXB0X3Blcm1pc3Npb25zX3VybCgkZXh0X3Blcm0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRuZXh0PW51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjYW5jZWxfdXJsPW51bGwpIHsKCiAgICByZXR1cm4gJHRoaXMtPmdldF93d3dfdXJsKCdjb25uZWN0L3Byb21wdF9wZXJtaXNzaW9ucy5waHAnLAogICAgICBhcnJheSgnYXBpX2tleScgPT4gJHRoaXMtPmFwaV9rZXksCiAgICAgICAgICAgICdleHRfcGVybScgPT4gJGV4dF9wZXJtLAogICAgICAgICAgICAnbmV4dCcgPT4gJG5leHQgPyAkbmV4dCA6IHBhcmVudDo6Y3VycmVudF91cmwoKSwKICAgICAgICAgICAgJ2NhbmNlbCcgPT4gJGNhbmNlbF91cmwgPyAkY2FuY2VsX3VybCA6IHBhcmVudDo6Y3VycmVudF91cmwoKSwKICAgICAgICAgICAgJ2Rpc3BsYXknID0+ICd3YXAnKSk7CgogIH0KCiAgLyoqCiAgICogc3VwcG9ydCBib3RoIHByb21wdF9wZXJtaXNzaW9ucy5waHAgYW5kIGF1dGhvcml6ZS5waHAgZm9yIG5vdy4KICAgKiBhdXRob3JpemVkLnBocCBpcyB0byBiZSBkZXByZWNhdGUgdGhvdWdoLgogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBnZXRfZXh0ZW5kZWRfcGVybWlzc2lvbl91cmwoJGV4dF9wZXJtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG5leHQ9bnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjYW5jZWxfdXJsPW51bGwpIHsKICAgICRuZXh0ID0gJG5leHQgPyAkbmV4dCA6IHBhcmVudDo6Y3VycmVudF91cmwoKTsKICAgICRjYW5jZWxfdXJsID0gJGNhbmNlbF91cmwgPyAkY2FuY2VsX3VybCA6IHBhcmVudDo6Y3VycmVudF91cmwoKTsKCiAgICByZXR1cm4gJHRoaXMtPmdldF9tX3VybCgnYXV0aG9yaXplLnBocCcsCiAgICAgICAgICAgICAgICAgICAgICBhcnJheSgnYXBpX2tleScgPT4gJHRoaXMtPmFwaV9rZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXh0X3Blcm0nID0+ICRleHRfcGVybSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICduZXh0JyA9PiAkbmV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjYW5jZWxfdXJsJyA9PiAkY2FuY2VsX3VybCkpOwoKICB9CgogIHB1YmxpYyBmdW5jdGlvbiByZW5kZXJfcHJvbXB0X2ZlZWRfdXJsKCRhY3Rpb25fbGlua3M9TlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0X2lkPU5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG1lc3NhZ2U9JycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHVzZXJfbWVzc2FnZV9wcm9tcHQ9JycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNhcHRpb249TlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY2FsbGJhY2sgPScnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjYW5jZWw9JycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGF0dGFjaG1lbnQ9TlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcHJldmlldz10cnVlKSB7CgogICAgJHBhcmFtcyA9IGFycmF5KCdhcGlfa2V5JyAgICAgPT4gJHRoaXMtPmFwaV9rZXksCiAgICAgICAgICAgICAgICAgICAgJ3Nlc3Npb25fa2V5JyA9PiAkdGhpcy0+YXBpX2NsaWVudC0+c2Vzc2lvbl9rZXksCiAgICAgICAgICAgICAgICAgICApOwogICAgaWYgKCFlbXB0eSgkYXR0YWNobWVudCkpIHsKICAgICAgJHBhcmFtc1snYXR0YWNobWVudCddID0gdXJsZW5jb2RlKGpzb25fZW5jb2RlKCRhdHRhY2htZW50KSk7CiAgICB9IGVsc2UgewogICAgICAkYXR0YWNobWVudCA9IG5ldyBzdGRDbGFzcygpOwogICAgICAkYXBwX2Rpc3BsYXlfaW5mbyA9ICR0aGlzLT5hcGlfY2xpZW50LT5hZG1pbl9nZXRBcHBQcm9wZXJ0aWVzKGFycmF5KCdhcHBsaWNhdGlvbl9uYW1lJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY2FsbGJhY2tfdXJsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGVzY3JpcHRpb24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsb2dvX3VybCcpKTsKICAgICAgJGFwcF9kaXNwbGF5X2luZm8gPSAkYXBwX2Rpc3BsYXlfaW5mbzsKICAgICAgJGF0dGFjaG1lbnQtPm5hbWUgPSAkYXBwX2Rpc3BsYXlfaW5mb1snYXBwbGljYXRpb25fbmFtZSddOwogICAgICAkYXR0YWNobWVudC0+Y2FwdGlvbiA9ICFlbXB0eSgkY2FwdGlvbikgPyAkY2FwdGlvbiA6ICdKdXN0IHNlZSB3aGF0XCdzIG5ldyEnOwogICAgICAkYXR0YWNobWVudC0+ZGVzY3JpcHRpb24gPSAkYXBwX2Rpc3BsYXlfaW5mb1snZGVzY3JpcHRpb24nXTsKICAgICAgJGF0dGFjaG1lbnQtPmhyZWYgPSAkYXBwX2Rpc3BsYXlfaW5mb1snY2FsbGJhY2tfdXJsJ107CiAgICAgIGlmICghZW1wdHkoJGFwcF9kaXNwbGF5X2luZm9bJ2xvZ29fdXJsJ10pKSB7CiAgICAgICAgJGxvZ28gPSBuZXcgc3RkQ2xhc3MoKTsKICAgICAgICAkbG9nby0+dHlwZSA9ICdpbWFnZSc7CiAgICAgICAgJGxvZ28tPnNyYyA9ICRhcHBfZGlzcGxheV9pbmZvWydsb2dvX3VybCddOwogICAgICAgICRsb2dvLT5ocmVmID0gJGFwcF9kaXNwbGF5X2luZm9bJ2NhbGxiYWNrX3VybCddOwogICAgICAgICRhdHRhY2htZW50LT5tZWRpYSA9IGFycmF5KCRsb2dvKTsKICAgICAgfQogICAgICAkcGFyYW1zWydhdHRhY2htZW50J10gPSB1cmxlbmNvZGUoanNvbl9lbmNvZGUoJGF0dGFjaG1lbnQpKTsKICAgIH0KICAgICRwYXJhbXNbJ3ByZXZpZXcnXSA9ICRwcmV2aWV3OwogICAgJHBhcmFtc1snbWVzc2FnZSddID0gJG1lc3NhZ2U7CiAgICAkcGFyYW1zWyd1c2VyX21lc3NhZ2VfcHJvbXB0J10gPSAkdXNlcl9tZXNzYWdlX3Byb21wdDsKICAgIGlmICghZW1wdHkoJGNhbGxiYWNrKSkgewogICAgICAkcGFyYW1zWydjYWxsYmFjayddID0gJGNhbGxiYWNrOwogICAgfSBlbHNlIHsKICAgICAgJHBhcmFtc1snY2FsbGJhY2snXSA9ICR0aGlzLT5jdXJyZW50X3VybCgpOwogICAgfQogICAgaWYgKCFlbXB0eSgkY2FuY2VsKSkgewogICAgICAkcGFyYW1zWydjYW5jZWwnXSA9ICRjYW5jZWw7CiAgICB9IGVsc2UgewogICAgICAkcGFyYW1zWydjYW5jZWwnXSA9ICR0aGlzLT5jdXJyZW50X3VybCgpOwogICAgfQoKICAgIGlmICghZW1wdHkoJHRhcmdldF9pZCkpIHsKICAgICAgJHBhcmFtc1sndGFyZ2V0X2lkJ10gPSAkdGFyZ2V0X2lkOwogICAgfQogICAgaWYgKCFlbXB0eSgkYWN0aW9uX2xpbmtzKSkgewogICAgICAkcGFyYW1zWydhY3Rpb25fbGlua3MnXSA9IHVybGVuY29kZShqc29uX2VuY29kZSgkYWN0aW9uX2xpbmtzKSk7CiAgICB9CgogICAgJHBhcmFtc1snZGlzcGxheSddID0gJ3dhcCc7CiAgICBoZWFkZXIoJ0xvY2F0aW9uOiAnLiAkdGhpcy0+Z2V0X3d3d191cmwoJ2Nvbm5lY3QvcHJvbXB0X2ZlZWQucGhwJywgJHBhcmFtcykpOwogIH0KCi8vdXNlIHRlbXBsYXRlX2lkCiAgcHVibGljIGZ1bmN0aW9uIHJlbmRlcl9mZWVkX2Zvcm1fdXJsKCR0ZW1wbGF0ZV9pZD1OVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGVtcGxhdGVfZGF0YT1OVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdXNlcl9tZXNzYWdlPU5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRib2R5X2dlbmVyYWw9TlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHVzZXJfbWVzc2FnZV9wcm9tcHQ9TlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRhcmdldF9pZD1OVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY2FsbGJhY2s9TlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNhbmNlbD1OVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcHJldmlldz10cnVlKSB7CgogICAgJHBhcmFtcyA9IGFycmF5KCdhcGlfa2V5JyA9PiAkdGhpcy0+YXBpX2tleSk7CiAgICAkcGFyYW1zWydwcmV2aWV3J10gPSAkcHJldmlldzsKICAgIGlmIChpc3NldCgkdGVtcGxhdGVfaWQpICYmICR0ZW1wbGF0ZV9pZCkgewogICAgICAkcGFyYW1zWyd0ZW1wbGF0ZV9pZCddID0gJHRlbXBsYXRlX2lkOwogICAgfQogICAgJHBhcmFtc1snbWVzc2FnZSddID0gJHVzZXJfbWVzc2FnZSA/ICR1c2VyX21lc3NhZ2VbJ3ZhbHVlJ10gOiAnJzsKICAgIGlmIChpc3NldCgkYm9keV9nZW5lcmFsKSAmJiAkYm9keV9nZW5lcmFsKSB7CiAgICAgICRwYXJhbXNbJ2JvZHlfZ2VuZXJhbCddID0gJGJvZHlfZ2VuZXJhbDsKICAgIH0KICAgIGlmIChpc3NldCgkdXNlcl9tZXNzYWdlX3Byb21wdCkgJiYgJHVzZXJfbWVzc2FnZV9wcm9tcHQpIHsKICAgICAgJHBhcmFtc1sndXNlcl9tZXNzYWdlX3Byb21wdCddID0gJHVzZXJfbWVzc2FnZV9wcm9tcHQ7CiAgICB9CiAgICBpZiAoaXNzZXQoJGNhbGxiYWNrKSAmJiAkY2FsbGJhY2spIHsKICAgICAgJHBhcmFtc1snY2FsbGJhY2snXSA9ICRjYWxsYmFjazsKICAgIH0gZWxzZSB7CiAgICAgICRwYXJhbXNbJ2NhbGxiYWNrJ10gPSAkdGhpcy0+Y3VycmVudF91cmwoKTsKICAgIH0KICAgIGlmIChpc3NldCgkY2FuY2VsKSAmJiAkY2FuY2VsKSB7CiAgICAgICRwYXJhbXNbJ2NhbmNlbCddID0gJGNhbmNlbDsKICAgIH0gZWxzZSB7CiAgICAgICRwYXJhbXNbJ2NhbmNlbCddID0gJHRoaXMtPmN1cnJlbnRfdXJsKCk7CiAgICB9CiAgICBpZiAoaXNzZXQoJHRlbXBsYXRlX2RhdGEpICYmICR0ZW1wbGF0ZV9kYXRhKSB7CiAgICAgICRwYXJhbXNbJ3RlbXBsYXRlX2RhdGEnXSA9ICR0ZW1wbGF0ZV9kYXRhOwogICAgfQogICAgaWYgKGlzc2V0KCR0YXJnZXRfaWQpICYmICR0YXJnZXRfaWQpIHsKICAgICAgJHBhcmFtc1sndG9faWRzJ10gPSAkdGFyZ2V0X2lkOwogICAgfQogICAgJHBhcmFtc1snZGlzcGxheSddID0gJ3dhcCc7CiAgICBoZWFkZXIoJ0xvY2F0aW9uOiAnLiAkdGhpcy0+Z2V0X3d3d191cmwoJ2Nvbm5lY3QvcHJvbXB0X2ZlZWQucGhwJywgJHBhcmFtcykpOwogIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/facebook-platform/php/jsonwrapper/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/facebook-platform/php/jsonwrapper/JSON/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/facebook-platform/php/jsonwrapper/JSON/JSON.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyogdmltOiBzZXQgZXhwYW5kdGFiIHRhYnN0b3A9NCBzaGlmdHdpZHRoPTQgc29mdHRhYnN0b3A9NDogKi8KCi8qKgogKiBDb252ZXJ0cyB0byBhbmQgZnJvbSBKU09OIGZvcm1hdC4KICoKICogSlNPTiAoSmF2YVNjcmlwdCBPYmplY3QgTm90YXRpb24pIGlzIGEgbGlnaHR3ZWlnaHQgZGF0YS1pbnRlcmNoYW5nZQogKiBmb3JtYXQuIEl0IGlzIGVhc3kgZm9yIGh1bWFucyB0byByZWFkIGFuZCB3cml0ZS4gSXQgaXMgZWFzeSBmb3IgbWFjaGluZXMKICogdG8gcGFyc2UgYW5kIGdlbmVyYXRlLiBJdCBpcyBiYXNlZCBvbiBhIHN1YnNldCBvZiB0aGUgSmF2YVNjcmlwdAogKiBQcm9ncmFtbWluZyBMYW5ndWFnZSwgU3RhbmRhcmQgRUNNQS0yNjIgM3JkIEVkaXRpb24gLSBEZWNlbWJlciAxOTk5LgogKiBUaGlzIGZlYXR1cmUgY2FuIGFsc28gYmUgZm91bmQgaW4gIFB5dGhvbi4gSlNPTiBpcyBhIHRleHQgZm9ybWF0IHRoYXQgaXMKICogY29tcGxldGVseSBsYW5ndWFnZSBpbmRlcGVuZGVudCBidXQgdXNlcyBjb252ZW50aW9ucyB0aGF0IGFyZSBmYW1pbGlhcgogKiB0byBwcm9ncmFtbWVycyBvZiB0aGUgQy1mYW1pbHkgb2YgbGFuZ3VhZ2VzLCBpbmNsdWRpbmcgQywgQysrLCBDIywgSmF2YSwKICogSmF2YVNjcmlwdCwgUGVybCwgVENMLCBhbmQgbWFueSBvdGhlcnMuIFRoZXNlIHByb3BlcnRpZXMgbWFrZSBKU09OIGFuCiAqIGlkZWFsIGRhdGEtaW50ZXJjaGFuZ2UgbGFuZ3VhZ2UuCiAqCiAqIFRoaXMgcGFja2FnZSBwcm92aWRlcyBhIHNpbXBsZSBlbmNvZGVyIGFuZCBkZWNvZGVyIGZvciBKU09OIG5vdGF0aW9uLiBJdAogKiBpcyBpbnRlbmRlZCBmb3IgdXNlIHdpdGggY2xpZW50LXNpZGUgSmF2YXNjcmlwdCBhcHBsaWNhdGlvbnMgdGhhdCBtYWtlCiAqIHVzZSBvZiBIVFRQUmVxdWVzdCB0byBwZXJmb3JtIHNlcnZlciBjb21tdW5pY2F0aW9uIGZ1bmN0aW9ucyAtIGRhdGEgY2FuCiAqIGJlIGVuY29kZWQgaW50byBKU09OIG5vdGF0aW9uIGZvciB1c2UgaW4gYSBjbGllbnQtc2lkZSBqYXZhc2NyaXB0LCBvcgogKiBkZWNvZGVkIGZyb20gaW5jb21pbmcgSmF2YXNjcmlwdCByZXF1ZXN0cy4gSlNPTiBmb3JtYXQgaXMgbmF0aXZlIHRvCiAqIEphdmFzY3JpcHQsIGFuZCBjYW4gYmUgZGlyZWN0bHkgZXZhbCgpJ2VkIHdpdGggbm8gZnVydGhlciBwYXJzaW5nCiAqIG92ZXJoZWFkCiAqCiAqIEFsbCBzdHJpbmdzIHNob3VsZCBiZSBpbiBBU0NJSSBvciBVVEYtOCBmb3JtYXQhCiAqCiAqIExJQ0VOU0U6IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKICogd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCiAqIGNvbmRpdGlvbnMgYXJlIG1ldDogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZQogKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZwogKiBkaXNjbGFpbWVyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCiAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQogKiBkaXN0cmlidXRpb24uCiAqCiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECiAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCiAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOCiAqIE5PIEVWRU5UIFNIQUxMIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAogKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAogKiBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MKICogT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAogKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IKICogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRQogKiBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICiAqIERBTUFHRS4KICoKICogQGNhdGVnb3J5CiAqIEBwYWNrYWdlICAgICBTZXJ2aWNlc19KU09OCiAqIEBhdXRob3IgICAgICBNaWNoYWwgTWlndXJza2kgPG1pa2UtanNvbkB0ZWN6bm8uY29tPgogKiBAYXV0aG9yICAgICAgTWF0dCBLbmFwcCA8bWRrbmFwcFthdF1nbWFpbFtkb3RdY29tPgogKiBAYXV0aG9yICAgICAgQnJldHQgU3RpbW1lcm1hbiA8YnJldHRzdGltbWVybWFuW2F0XWdtYWlsW2RvdF1jb20+CiAqIEBjb3B5cmlnaHQgICAyMDA1IE1pY2hhbCBNaWd1cnNraQogKiBAdmVyc2lvbiAgICAgQ1ZTOiAkSWQ6IEpTT04ucGhwLHYgMS4zMSAyMDA2LzA2LzI4IDA1OjU0OjE3IG1pZ3Vyc2tpIEV4cCAkCiAqIEBsaWNlbnNlICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2JzZC1saWNlbnNlLnBocAogKiBAbGluayAgICAgICAgaHR0cDovL3BlYXIucGhwLm5ldC9wZXByL3BlcHItcHJvcG9zYWwtc2hvdy5waHA/aWQ9MTk4CiAqLwoKLyoqCiAqIE1hcmtlciBjb25zdGFudCBmb3IgU2VydmljZXNfSlNPTjo6ZGVjb2RlKCksIHVzZWQgdG8gZmxhZyBzdGFjayBzdGF0ZQogKi8KZGVmaW5lKCdTRVJWSUNFU19KU09OX1NMSUNFJywgICAxKTsKCi8qKgogKiBNYXJrZXIgY29uc3RhbnQgZm9yIFNlcnZpY2VzX0pTT046OmRlY29kZSgpLCB1c2VkIHRvIGZsYWcgc3RhY2sgc3RhdGUKICovCmRlZmluZSgnU0VSVklDRVNfSlNPTl9JTl9TVFInLCAgMik7CgovKioKICogTWFya2VyIGNvbnN0YW50IGZvciBTZXJ2aWNlc19KU09OOjpkZWNvZGUoKSwgdXNlZCB0byBmbGFnIHN0YWNrIHN0YXRlCiAqLwpkZWZpbmUoJ1NFUlZJQ0VTX0pTT05fSU5fQVJSJywgIDMpOwoKLyoqCiAqIE1hcmtlciBjb25zdGFudCBmb3IgU2VydmljZXNfSlNPTjo6ZGVjb2RlKCksIHVzZWQgdG8gZmxhZyBzdGFjayBzdGF0ZQogKi8KZGVmaW5lKCdTRVJWSUNFU19KU09OX0lOX09CSicsICA0KTsKCi8qKgogKiBNYXJrZXIgY29uc3RhbnQgZm9yIFNlcnZpY2VzX0pTT046OmRlY29kZSgpLCB1c2VkIHRvIGZsYWcgc3RhY2sgc3RhdGUKICovCmRlZmluZSgnU0VSVklDRVNfSlNPTl9JTl9DTVQnLCA1KTsKCi8qKgogKiBCZWhhdmlvciBzd2l0Y2ggZm9yIFNlcnZpY2VzX0pTT046OmRlY29kZSgpCiAqLwpkZWZpbmUoJ1NFUlZJQ0VTX0pTT05fTE9PU0VfVFlQRScsIDE2KTsKCi8qKgogKiBCZWhhdmlvciBzd2l0Y2ggZm9yIFNlcnZpY2VzX0pTT046OmRlY29kZSgpCiAqLwpkZWZpbmUoJ1NFUlZJQ0VTX0pTT05fU1VQUFJFU1NfRVJST1JTJywgMzIpOwoKLyoqCiAqIENvbnZlcnRzIHRvIGFuZCBmcm9tIEpTT04gZm9ybWF0LgogKgogKiBCcmllZiBleGFtcGxlIG9mIHVzZToKICoKICogPGNvZGU+CiAqIC8vIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBTZXJ2aWNlc19KU09OCiAqICRqc29uID0gbmV3IFNlcnZpY2VzX0pTT04oKTsKICoKICogLy8gY29udmVydCBhIGNvbXBsZXhlIHZhbHVlIHRvIEpTT04gbm90YXRpb24sIGFuZCBzZW5kIGl0IHRvIHRoZSBicm93c2VyCiAqICR2YWx1ZSA9IGFycmF5KCdmb28nLCAnYmFyJywgYXJyYXkoMSwgMiwgJ2JheicpLCBhcnJheSgzLCBhcnJheSg0KSkpOwogKiAkb3V0cHV0ID0gJGpzb24tPmVuY29kZSgkdmFsdWUpOwogKgogKiBwcmludCgkb3V0cHV0KTsKICogLy8gcHJpbnRzOiBbImZvbyIsImJhciIsWzEsMiwiYmF6Il0sWzMsWzRdXV0KICoKICogLy8gYWNjZXB0IGluY29taW5nIFBPU1QgZGF0YSwgYXNzdW1lZCB0byBiZSBpbiBKU09OIG5vdGF0aW9uCiAqICRpbnB1dCA9IGZpbGVfZ2V0X2NvbnRlbnRzKCdwaHA6Ly9pbnB1dCcsIDEwMDAwMDApOwogKiAkdmFsdWUgPSAkanNvbi0+ZGVjb2RlKCRpbnB1dCk7CiAqIDwvY29kZT4KICovCmNsYXNzIFNlcnZpY2VzX0pTT04KewogICAvKioKICAgICogY29uc3RydWN0cyBhIG5ldyBKU09OIGluc3RhbmNlCiAgICAqCiAgICAqIEBwYXJhbSAgICBpbnQgICAgICR1c2UgICAgb2JqZWN0IGJlaGF2aW9yIGZsYWdzOyBjb21iaW5lIHdpdGggYm9vbGVhbi1PUgogICAgKgogICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3NpYmxlIHZhbHVlczoKICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAtIFNFUlZJQ0VTX0pTT05fTE9PU0VfVFlQRTogIGxvb3NlIHR5cGluZy4KICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ7Li4ufSIgc3ludGF4IGNyZWF0ZXMgYXNzb2NpYXRpdmUgYXJyYXlzCiAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0ZWFkIG9mIG9iamVjdHMgaW4gZGVjb2RlKCkuCiAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBTRVJWSUNFU19KU09OX1NVUFBSRVNTX0VSUk9SUzogIGVycm9yIHN1cHByZXNzaW9uLgogICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIHdoaWNoIGNhbid0IGJlIGVuY29kZWQgKGUuZy4gcmVzb3VyY2VzKQogICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZWFyIGFzIE5VTEwgaW5zdGVhZCBvZiB0aHJvd2luZyBlcnJvcnMuCiAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeSBkZWZhdWx0LCBhIGRlZXBseS1uZXN0ZWQgcmVzb3VyY2Ugd2lsbAogICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnViYmxlIHVwIHdpdGggYW4gZXJyb3IsIHNvIGFsbCByZXR1cm4gdmFsdWVzCiAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGVuY29kZSgpIHNob3VsZCBiZSBjaGVja2VkIHdpdGggaXNFcnJvcigpCiAgICAqLwogICAgZnVuY3Rpb24gU2VydmljZXNfSlNPTigkdXNlID0gMCkKICAgIHsKICAgICAgICAkdGhpcy0+dXNlID0gJHVzZTsKICAgIH0KCiAgIC8qKgogICAgKiBjb252ZXJ0IGEgc3RyaW5nIGZyb20gb25lIFVURi0xNiBjaGFyIHRvIG9uZSBVVEYtOCBjaGFyCiAgICAqCiAgICAqIE5vcm1hbGx5IHNob3VsZCBiZSBoYW5kbGVkIGJ5IG1iX2NvbnZlcnRfZW5jb2RpbmcsIGJ1dAogICAgKiBwcm92aWRlcyBhIHNsb3dlciBQSFAtb25seSBtZXRob2QgZm9yIGluc3RhbGxhdGlvbnMKICAgICogdGhhdCBsYWNrIHRoZSBtdWx0aWJ5ZSBzdHJpbmcgZXh0ZW5zaW9uLgogICAgKgogICAgKiBAcGFyYW0gICAgc3RyaW5nICAkdXRmMTYgIFVURi0xNiBjaGFyYWN0ZXIKICAgICogQHJldHVybiAgIHN0cmluZyAgVVRGLTggY2hhcmFjdGVyCiAgICAqIEBhY2Nlc3MgICBwcml2YXRlCiAgICAqLwogICAgZnVuY3Rpb24gdXRmMTYydXRmOCgkdXRmMTYpCiAgICB7CiAgICAgICAgLy8gb2ggcGxlYXNlIG9oIHBsZWFzZSBvaCBwbGVhc2Ugb2ggcGxlYXNlIG9oIHBsZWFzZQogICAgICAgIGlmKGZ1bmN0aW9uX2V4aXN0cygnbWJfY29udmVydF9lbmNvZGluZycpKSB7CiAgICAgICAgICAgIHJldHVybiBtYl9jb252ZXJ0X2VuY29kaW5nKCR1dGYxNiwgJ1VURi04JywgJ1VURi0xNicpOwogICAgICAgIH0KCiAgICAgICAgJGJ5dGVzID0gKG9yZCgkdXRmMTZ7MH0pIDw8IDgpIHwgb3JkKCR1dGYxNnsxfSk7CgogICAgICAgIHN3aXRjaCh0cnVlKSB7CiAgICAgICAgICAgIGNhc2UgKCgweDdGICYgJGJ5dGVzKSA9PSAkYnl0ZXMpOgogICAgICAgICAgICAgICAgLy8gdGhpcyBjYXNlIHNob3VsZCBuZXZlciBiZSByZWFjaGVkLCBiZWNhdXNlIHdlIGFyZSBpbiBBU0NJSSByYW5nZQogICAgICAgICAgICAgICAgLy8gc2VlOiBodHRwOi8vd3d3LmNsLmNhbS5hYy51ay9+bWdrMjUvdW5pY29kZS5odG1sI3V0Zi04CiAgICAgICAgICAgICAgICByZXR1cm4gY2hyKDB4N0YgJiAkYnl0ZXMpOwoKICAgICAgICAgICAgY2FzZSAoMHgwN0ZGICYgJGJ5dGVzKSA9PSAkYnl0ZXM6CiAgICAgICAgICAgICAgICAvLyByZXR1cm4gYSAyLWJ5dGUgVVRGLTggY2hhcmFjdGVyCiAgICAgICAgICAgICAgICAvLyBzZWU6IGh0dHA6Ly93d3cuY2wuY2FtLmFjLnVrL35tZ2syNS91bmljb2RlLmh0bWwjdXRmLTgKICAgICAgICAgICAgICAgIHJldHVybiBjaHIoMHhDMCB8ICgoJGJ5dGVzID4+IDYpICYgMHgxRikpCiAgICAgICAgICAgICAgICAgICAgIC4gY2hyKDB4ODAgfCAoJGJ5dGVzICYgMHgzRikpOwoKICAgICAgICAgICAgY2FzZSAoMHhGRkZGICYgJGJ5dGVzKSA9PSAkYnl0ZXM6CiAgICAgICAgICAgICAgICAvLyByZXR1cm4gYSAzLWJ5dGUgVVRGLTggY2hhcmFjdGVyCiAgICAgICAgICAgICAgICAvLyBzZWU6IGh0dHA6Ly93d3cuY2wuY2FtLmFjLnVrL35tZ2syNS91bmljb2RlLmh0bWwjdXRmLTgKICAgICAgICAgICAgICAgIHJldHVybiBjaHIoMHhFMCB8ICgoJGJ5dGVzID4+IDEyKSAmIDB4MEYpKQogICAgICAgICAgICAgICAgICAgICAuIGNocigweDgwIHwgKCgkYnl0ZXMgPj4gNikgJiAweDNGKSkKICAgICAgICAgICAgICAgICAgICAgLiBjaHIoMHg4MCB8ICgkYnl0ZXMgJiAweDNGKSk7CiAgICAgICAgfQoKICAgICAgICAvLyBpZ25vcmluZyBVVEYtMzIgZm9yIG5vdywgc29ycnkKICAgICAgICByZXR1cm4gJyc7CiAgICB9CgogICAvKioKICAgICogY29udmVydCBhIHN0cmluZyBmcm9tIG9uZSBVVEYtOCBjaGFyIHRvIG9uZSBVVEYtMTYgY2hhcgogICAgKgogICAgKiBOb3JtYWxseSBzaG91bGQgYmUgaGFuZGxlZCBieSBtYl9jb252ZXJ0X2VuY29kaW5nLCBidXQKICAgICogcHJvdmlkZXMgYSBzbG93ZXIgUEhQLW9ubHkgbWV0aG9kIGZvciBpbnN0YWxsYXRpb25zCiAgICAqIHRoYXQgbGFjayB0aGUgbXVsdGlieWUgc3RyaW5nIGV4dGVuc2lvbi4KICAgICoKICAgICogQHBhcmFtICAgIHN0cmluZyAgJHV0ZjggICBVVEYtOCBjaGFyYWN0ZXIKICAgICogQHJldHVybiAgIHN0cmluZyAgVVRGLTE2IGNoYXJhY3RlcgogICAgKiBAYWNjZXNzICAgcHJpdmF0ZQogICAgKi8KICAgIGZ1bmN0aW9uIHV0ZjgydXRmMTYoJHV0ZjgpCiAgICB7CiAgICAgICAgLy8gb2ggcGxlYXNlIG9oIHBsZWFzZSBvaCBwbGVhc2Ugb2ggcGxlYXNlIG9oIHBsZWFzZQogICAgICAgIGlmKGZ1bmN0aW9uX2V4aXN0cygnbWJfY29udmVydF9lbmNvZGluZycpKSB7CiAgICAgICAgICAgIHJldHVybiBtYl9jb252ZXJ0X2VuY29kaW5nKCR1dGY4LCAnVVRGLTE2JywgJ1VURi04Jyk7CiAgICAgICAgfQoKICAgICAgICBzd2l0Y2goc3RybGVuKCR1dGY4KSkgewogICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAvLyB0aGlzIGNhc2Ugc2hvdWxkIG5ldmVyIGJlIHJlYWNoZWQsIGJlY2F1c2Ugd2UgYXJlIGluIEFTQ0lJIHJhbmdlCiAgICAgICAgICAgICAgICAvLyBzZWU6IGh0dHA6Ly93d3cuY2wuY2FtLmFjLnVrL35tZ2syNS91bmljb2RlLmh0bWwjdXRmLTgKICAgICAgICAgICAgICAgIHJldHVybiAkdXRmODsKCiAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgIC8vIHJldHVybiBhIFVURi0xNiBjaGFyYWN0ZXIgZnJvbSBhIDItYnl0ZSBVVEYtOCBjaGFyCiAgICAgICAgICAgICAgICAvLyBzZWU6IGh0dHA6Ly93d3cuY2wuY2FtLmFjLnVrL35tZ2syNS91bmljb2RlLmh0bWwjdXRmLTgKICAgICAgICAgICAgICAgIHJldHVybiBjaHIoMHgwNyAmIChvcmQoJHV0Zjh7MH0pID4+IDIpKQogICAgICAgICAgICAgICAgICAgICAuIGNocigoMHhDMCAmIChvcmQoJHV0Zjh7MH0pIDw8IDYpKQogICAgICAgICAgICAgICAgICAgICAgICAgfCAoMHgzRiAmIG9yZCgkdXRmOHsxfSkpKTsKCiAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgIC8vIHJldHVybiBhIFVURi0xNiBjaGFyYWN0ZXIgZnJvbSBhIDMtYnl0ZSBVVEYtOCBjaGFyCiAgICAgICAgICAgICAgICAvLyBzZWU6IGh0dHA6Ly93d3cuY2wuY2FtLmFjLnVrL35tZ2syNS91bmljb2RlLmh0bWwjdXRmLTgKICAgICAgICAgICAgICAgIHJldHVybiBjaHIoKDB4RjAgJiAob3JkKCR1dGY4ezB9KSA8PCA0KSkKICAgICAgICAgICAgICAgICAgICAgICAgIHwgKDB4MEYgJiAob3JkKCR1dGY4ezF9KSA+PiAyKSkpCiAgICAgICAgICAgICAgICAgICAgIC4gY2hyKCgweEMwICYgKG9yZCgkdXRmOHsxfSkgPDwgNikpCiAgICAgICAgICAgICAgICAgICAgICAgICB8ICgweDdGICYgb3JkKCR1dGY4ezJ9KSkpOwogICAgICAgIH0KCiAgICAgICAgLy8gaWdub3JpbmcgVVRGLTMyIGZvciBub3csIHNvcnJ5CiAgICAgICAgcmV0dXJuICcnOwogICAgfQoKICAgLyoqCiAgICAqIGVuY29kZXMgYW4gYXJiaXRyYXJ5IHZhcmlhYmxlIGludG8gSlNPTiBmb3JtYXQKICAgICoKICAgICogQHBhcmFtICAgIG1peGVkICAgJHZhciAgICBhbnkgbnVtYmVyLCBib29sZWFuLCBzdHJpbmcsIGFycmF5LCBvciBvYmplY3QgdG8gYmUgZW5jb2RlZC4KICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBzZWUgYXJndW1lbnQgMSB0byBTZXJ2aWNlc19KU09OKCkgYWJvdmUgZm9yIGFycmF5LXBhcnNpbmcgYmVoYXZpb3IuCiAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgdmFyIGlzIGEgc3RybmcsIG5vdGUgdGhhdCBlbmNvZGUoKSBhbHdheXMgZXhwZWN0cyBpdAogICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIGluIEFTQ0lJIG9yIFVURi04IGZvcm1hdCEKICAgICoKICAgICogQHJldHVybiAgIG1peGVkICAgSlNPTiBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgaW5wdXQgdmFyIG9yIGFuIGVycm9yIGlmIGEgcHJvYmxlbSBvY2N1cnMKICAgICogQGFjY2VzcyAgIHB1YmxpYwogICAgKi8KICAgIGZ1bmN0aW9uIGVuY29kZSgkdmFyKQogICAgewogICAgICAgIHN3aXRjaCAoZ2V0dHlwZSgkdmFyKSkgewogICAgICAgICAgICBjYXNlICdib29sZWFuJzoKICAgICAgICAgICAgICAgIHJldHVybiAkdmFyID8gJ3RydWUnIDogJ2ZhbHNlJzsKCiAgICAgICAgICAgIGNhc2UgJ05VTEwnOgogICAgICAgICAgICAgICAgcmV0dXJuICdudWxsJzsKCiAgICAgICAgICAgIGNhc2UgJ2ludGVnZXInOgogICAgICAgICAgICAgICAgcmV0dXJuIChpbnQpICR2YXI7CgogICAgICAgICAgICBjYXNlICdkb3VibGUnOgogICAgICAgICAgICBjYXNlICdmbG9hdCc6CiAgICAgICAgICAgICAgICByZXR1cm4gKGZsb2F0KSAkdmFyOwoKICAgICAgICAgICAgY2FzZSAnc3RyaW5nJzoKICAgICAgICAgICAgICAgIC8vIFNUUklOR1MgQVJFIEVYUEVDVEVEIFRPIEJFIElOIEFTQ0lJIE9SIFVURi04IEZPUk1BVAogICAgICAgICAgICAgICAgJGFzY2lpID0gJyc7CiAgICAgICAgICAgICAgICAkc3RybGVuX3ZhciA9IHN0cmxlbigkdmFyKTsKCiAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAqIEl0ZXJhdGUgb3ZlciBldmVyeSBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZywKICAgICAgICAgICAgICAgICogZXNjYXBpbmcgd2l0aCBhIHNsYXNoIG9yIGVuY29kaW5nIHRvIFVURi04IHdoZXJlIG5lY2Vzc2FyeQogICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGZvciAoJGMgPSAwOyAkYyA8ICRzdHJsZW5fdmFyOyArKyRjKSB7CgogICAgICAgICAgICAgICAgICAgICRvcmRfdmFyX2MgPSBvcmQoJHZhcnskY30pOwoKICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHRydWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAkb3JkX3Zhcl9jID09IDB4MDg6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYXNjaWkgLj0gJ1xiJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICRvcmRfdmFyX2MgPT0gMHgwOToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRhc2NpaSAuPSAnXHQnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJG9yZF92YXJfYyA9PSAweDBBOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGFzY2lpIC49ICdcbic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAkb3JkX3Zhcl9jID09IDB4MEM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYXNjaWkgLj0gJ1xmJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICRvcmRfdmFyX2MgPT0gMHgwRDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRhc2NpaSAuPSAnXHInOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICRvcmRfdmFyX2MgPT0gMHgyMjoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAkb3JkX3Zhcl9jID09IDB4MkY6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJG9yZF92YXJfYyA9PSAweDVDOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG91YmxlIHF1b3RlLCBzbGFzaCwgc2xvc2gKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRhc2NpaSAuPSAnXFwnLiR2YXJ7JGN9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICgoJG9yZF92YXJfYyA+PSAweDIwKSAmJiAoJG9yZF92YXJfYyA8PSAweDdGKSk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGFyYWN0ZXJzIFUtMDAwMDAwMDAgLSBVLTAwMDAwMDdGIChzYW1lIGFzIEFTQ0lJKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGFzY2lpIC49ICR2YXJ7JGN9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICgoJG9yZF92YXJfYyAmIDB4RTApID09IDB4QzApOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hhcmFjdGVycyBVLTAwMDAwMDgwIC0gVS0wMDAwMDdGRiwgbWFzayAxMTBYWFhYWAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VlIGh0dHA6Ly93d3cuY2wuY2FtLmFjLnVrL35tZ2syNS91bmljb2RlLmh0bWwjdXRmLTgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjaGFyID0gcGFjaygnQyonLCAkb3JkX3Zhcl9jLCBvcmQoJHZhcnskYyArIDF9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYyArPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHV0ZjE2ID0gJHRoaXMtPnV0ZjgydXRmMTYoJGNoYXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGFzY2lpIC49IHNwcmludGYoJ1x1JTA0cycsIGJpbjJoZXgoJHV0ZjE2KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgKCgkb3JkX3Zhcl9jICYgMHhGMCkgPT0gMHhFMCk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGFyYWN0ZXJzIFUtMDAwMDA4MDAgLSBVLTAwMDBGRkZGLCBtYXNrIDExMTBYWFhYCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZWUgaHR0cDovL3d3dy5jbC5jYW0uYWMudWsvfm1nazI1L3VuaWNvZGUuaHRtbCN1dGYtOAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNoYXIgPSBwYWNrKCdDKicsICRvcmRfdmFyX2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkKCR2YXJ7JGMgKyAxfSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkKCR2YXJ7JGMgKyAyfSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGMgKz0gMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR1dGYxNiA9ICR0aGlzLT51dGY4MnV0ZjE2KCRjaGFyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRhc2NpaSAuPSBzcHJpbnRmKCdcdSUwNHMnLCBiaW4yaGV4KCR1dGYxNikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICgoJG9yZF92YXJfYyAmIDB4RjgpID09IDB4RjApOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hhcmFjdGVycyBVLTAwMDEwMDAwIC0gVS0wMDFGRkZGRiwgbWFzayAxMTExMFhYWAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VlIGh0dHA6Ly93d3cuY2wuY2FtLmFjLnVrL35tZ2syNS91bmljb2RlLmh0bWwjdXRmLTgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjaGFyID0gcGFjaygnQyonLCAkb3JkX3Zhcl9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZCgkdmFyeyRjICsgMX0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZCgkdmFyeyRjICsgMn0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZCgkdmFyeyRjICsgM30pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjICs9IDM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdXRmMTYgPSAkdGhpcy0+dXRmODJ1dGYxNigkY2hhcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYXNjaWkgLj0gc3ByaW50ZignXHUlMDRzJywgYmluMmhleCgkdXRmMTYpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAoKCRvcmRfdmFyX2MgJiAweEZDKSA9PSAweEY4KToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoYXJhY3RlcnMgVS0wMDIwMDAwMCAtIFUtMDNGRkZGRkYsIG1hc2sgMTExMTEwWFgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlZSBodHRwOi8vd3d3LmNsLmNhbS5hYy51ay9+bWdrMjUvdW5pY29kZS5odG1sI3V0Zi04CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY2hhciA9IHBhY2soJ0MqJywgJG9yZF92YXJfYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmQoJHZhcnskYyArIDF9KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmQoJHZhcnskYyArIDJ9KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmQoJHZhcnskYyArIDN9KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmQoJHZhcnskYyArIDR9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYyArPSA0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHV0ZjE2ID0gJHRoaXMtPnV0ZjgydXRmMTYoJGNoYXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGFzY2lpIC49IHNwcmludGYoJ1x1JTA0cycsIGJpbjJoZXgoJHV0ZjE2KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgKCgkb3JkX3Zhcl9jICYgMHhGRSkgPT0gMHhGQyk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGFyYWN0ZXJzIFUtMDQwMDAwMDAgLSBVLTdGRkZGRkZGLCBtYXNrIDExMTExMTBYCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZWUgaHR0cDovL3d3dy5jbC5jYW0uYWMudWsvfm1nazI1L3VuaWNvZGUuaHRtbCN1dGYtOAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNoYXIgPSBwYWNrKCdDKicsICRvcmRfdmFyX2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkKCR2YXJ7JGMgKyAxfSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkKCR2YXJ7JGMgKyAyfSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkKCR2YXJ7JGMgKyAzfSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkKCR2YXJ7JGMgKyA0fSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkKCR2YXJ7JGMgKyA1fSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGMgKz0gNTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR1dGYxNiA9ICR0aGlzLT51dGY4MnV0ZjE2KCRjaGFyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRhc2NpaSAuPSBzcHJpbnRmKCdcdSUwNHMnLCBiaW4yaGV4KCR1dGYxNikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiAnIicuJGFzY2lpLiciJzsKCiAgICAgICAgICAgIGNhc2UgJ2FycmF5JzoKICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICogQXMgcGVyIEpTT04gc3BlYyBpZiBhbnkgYXJyYXkga2V5IGlzIG5vdCBhbiBpbnRlZ2VyCiAgICAgICAgICAgICAgICAqIHdlIG11c3QgdHJlYXQgdGhlIHRoZSB3aG9sZSBhcnJheSBhcyBhbiBvYmplY3QuIFdlCiAgICAgICAgICAgICAgICAqIGFsc28gdHJ5IHRvIGNhdGNoIGEgc3BhcnNlbHkgcG9wdWxhdGVkIGFzc29jaWF0aXZlCiAgICAgICAgICAgICAgICAqIGFycmF5IHdpdGggbnVtZXJpYyBrZXlzIGhlcmUgYmVjYXVzZSBzb21lIEpTIGVuZ2luZXMKICAgICAgICAgICAgICAgICogd2lsbCBjcmVhdGUgYW4gYXJyYXkgd2l0aCBlbXB0eSBpbmRleGVzIHVwIHRvCiAgICAgICAgICAgICAgICAqIG1heF9pbmRleCB3aGljaCBjYW4gY2F1c2UgbWVtb3J5IGlzc3VlcyBhbmQgYmVjYXVzZQogICAgICAgICAgICAgICAgKiB0aGUga2V5cywgd2hpY2ggbWF5IGJlIHJlbGV2YW50LCB3aWxsIGJlIHJlbWFwcGVkCiAgICAgICAgICAgICAgICAqIG90aGVyd2lzZS4KICAgICAgICAgICAgICAgICoKICAgICAgICAgICAgICAgICogQXMgcGVyIHRoZSBFQ01BIGFuZCBKU09OIHNwZWNpZmljYXRpb24gYW4gb2JqZWN0IG1heQogICAgICAgICAgICAgICAgKiBoYXZlIGFueSBzdHJpbmcgYXMgYSBwcm9wZXJ0eS4gVW5mb3J0dW5hdGVseSBkdWUgdG8KICAgICAgICAgICAgICAgICogYSBob2xlIGluIHRoZSBFQ01BIHNwZWNpZmljYXRpb24gaWYgdGhlIGtleSBpcyBhCiAgICAgICAgICAgICAgICAqIEVDTUEgcmVzZXJ2ZWQgd29yZCBvciBzdGFydHMgd2l0aCBhIGRpZ2l0IHRoZQogICAgICAgICAgICAgICAgKiBwYXJhbWV0ZXIgaXMgb25seSBhY2Nlc3NpYmxlIHVzaW5nIEVDTUFTY3JpcHQncwogICAgICAgICAgICAgICAgKiBicmFja2V0IG5vdGF0aW9uLgogICAgICAgICAgICAgICAgKi8KCiAgICAgICAgICAgICAgICAvLyB0cmVhdCBhcyBhIEpTT04gb2JqZWN0CiAgICAgICAgICAgICAgICBpZiAoaXNfYXJyYXkoJHZhcikgJiYgY291bnQoJHZhcikgJiYgKGFycmF5X2tleXMoJHZhcikgIT09IHJhbmdlKDAsIHNpemVvZigkdmFyKSAtIDEpKSkgewogICAgICAgICAgICAgICAgICAgICRwcm9wZXJ0aWVzID0gYXJyYXlfbWFwKGFycmF5KCR0aGlzLCAnbmFtZV92YWx1ZScpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5X2tleXMoJHZhciksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlfdmFsdWVzKCR2YXIpKTsKCiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCgkcHJvcGVydGllcyBhcyAkcHJvcGVydHkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoU2VydmljZXNfSlNPTjo6aXNFcnJvcigkcHJvcGVydHkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHByb3BlcnR5OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3snIC4gam9pbignLCcsICRwcm9wZXJ0aWVzKSAuICd9JzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyB0cmVhdCBpdCBsaWtlIGEgcmVndWxhciBhcnJheQogICAgICAgICAgICAgICAgJGVsZW1lbnRzID0gYXJyYXlfbWFwKGFycmF5KCR0aGlzLCAnZW5jb2RlJyksICR2YXIpOwoKICAgICAgICAgICAgICAgIGZvcmVhY2goJGVsZW1lbnRzIGFzICRlbGVtZW50KSB7CiAgICAgICAgICAgICAgICAgICAgaWYoU2VydmljZXNfSlNPTjo6aXNFcnJvcigkZWxlbWVudCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRlbGVtZW50OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gJ1snIC4gam9pbignLCcsICRlbGVtZW50cykgLiAnXSc7CgogICAgICAgICAgICBjYXNlICdvYmplY3QnOgogICAgICAgICAgICAgICAgJHZhcnMgPSBnZXRfb2JqZWN0X3ZhcnMoJHZhcik7CgogICAgICAgICAgICAgICAgJHByb3BlcnRpZXMgPSBhcnJheV9tYXAoYXJyYXkoJHRoaXMsICduYW1lX3ZhbHVlJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheV9rZXlzKCR2YXJzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5X3ZhbHVlcygkdmFycykpOwoKICAgICAgICAgICAgICAgIGZvcmVhY2goJHByb3BlcnRpZXMgYXMgJHByb3BlcnR5KSB7CiAgICAgICAgICAgICAgICAgICAgaWYoU2VydmljZXNfSlNPTjo6aXNFcnJvcigkcHJvcGVydHkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkcHJvcGVydHk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiAneycgLiBqb2luKCcsJywgJHByb3BlcnRpZXMpIC4gJ30nOwoKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHJldHVybiAoJHRoaXMtPnVzZSAmIFNFUlZJQ0VTX0pTT05fU1VQUFJFU1NfRVJST1JTKQogICAgICAgICAgICAgICAgICAgID8gJ251bGwnCiAgICAgICAgICAgICAgICAgICAgOiBuZXcgU2VydmljZXNfSlNPTl9FcnJvcihnZXR0eXBlKCR2YXIpLiIgY2FuIG5vdCBiZSBlbmNvZGVkIGFzIEpTT04gc3RyaW5nIik7CiAgICAgICAgfQogICAgfQoKICAgLyoqCiAgICAqIGFycmF5LXdhbGtpbmcgZnVuY3Rpb24gZm9yIHVzZSBpbiBnZW5lcmF0aW5nIEpTT04tZm9ybWF0dGVkIG5hbWUtdmFsdWUgcGFpcnMKICAgICoKICAgICogQHBhcmFtICAgIHN0cmluZyAgJG5hbWUgICBuYW1lIG9mIGtleSB0byB1c2UKICAgICogQHBhcmFtICAgIG1peGVkICAgJHZhbHVlICByZWZlcmVuY2UgdG8gYW4gYXJyYXkgZWxlbWVudCB0byBiZSBlbmNvZGVkCiAgICAqCiAgICAqIEByZXR1cm4gICBzdHJpbmcgIEpTT04tZm9ybWF0dGVkIG5hbWUtdmFsdWUgcGFpciwgbGlrZSAnIm5hbWUiOnZhbHVlJwogICAgKiBAYWNjZXNzICAgcHJpdmF0ZQogICAgKi8KICAgIGZ1bmN0aW9uIG5hbWVfdmFsdWUoJG5hbWUsICR2YWx1ZSkKICAgIHsKICAgICAgICAkZW5jb2RlZF92YWx1ZSA9ICR0aGlzLT5lbmNvZGUoJHZhbHVlKTsKCiAgICAgICAgaWYoU2VydmljZXNfSlNPTjo6aXNFcnJvcigkZW5jb2RlZF92YWx1ZSkpIHsKICAgICAgICAgICAgcmV0dXJuICRlbmNvZGVkX3ZhbHVlOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICR0aGlzLT5lbmNvZGUoc3RydmFsKCRuYW1lKSkgLiAnOicgLiAkZW5jb2RlZF92YWx1ZTsKICAgIH0KCiAgIC8qKgogICAgKiByZWR1Y2UgYSBzdHJpbmcgYnkgcmVtb3ZpbmcgbGVhZGluZyBhbmQgdHJhaWxpbmcgY29tbWVudHMgYW5kIHdoaXRlc3BhY2UKICAgICoKICAgICogQHBhcmFtICAgICRzdHIgICAgc3RyaW5nICAgICAgc3RyaW5nIHZhbHVlIHRvIHN0cmlwIG9mIGNvbW1lbnRzIGFuZCB3aGl0ZXNwYWNlCiAgICAqCiAgICAqIEByZXR1cm4gICBzdHJpbmcgIHN0cmluZyB2YWx1ZSBzdHJpcHBlZCBvZiBjb21tZW50cyBhbmQgd2hpdGVzcGFjZQogICAgKiBAYWNjZXNzICAgcHJpdmF0ZQogICAgKi8KICAgIGZ1bmN0aW9uIHJlZHVjZV9zdHJpbmcoJHN0cikKICAgIHsKICAgICAgICAkc3RyID0gcHJlZ19yZXBsYWNlKGFycmF5KAoKICAgICAgICAgICAgICAgIC8vIGVsaW1pbmF0ZSBzaW5nbGUgbGluZSBjb21tZW50cyBpbiAnLy8gLi4uJyBmb3JtCiAgICAgICAgICAgICAgICAnI15ccyovLyguKykkI20nLAoKICAgICAgICAgICAgICAgIC8vIGVsaW1pbmF0ZSBtdWx0aS1saW5lIGNvbW1lbnRzIGluICcvKiAuLi4gKi8nIGZvcm0sIGF0IHN0YXJ0IG9mIHN0cmluZwogICAgICAgICAgICAgICAgJyNeXHMqL1wqKC4rKVwqLyNVcycsCgogICAgICAgICAgICAgICAgLy8gZWxpbWluYXRlIG11bHRpLWxpbmUgY29tbWVudHMgaW4gJy8qIC4uLiAqLycgZm9ybSwgYXQgZW5kIG9mIHN0cmluZwogICAgICAgICAgICAgICAgJyMvXCooLispXCovXHMqJCNVcycKCiAgICAgICAgICAgICksICcnLCAkc3RyKTsKCiAgICAgICAgLy8gZWxpbWluYXRlIGV4dHJhbmVvdXMgc3BhY2UKICAgICAgICByZXR1cm4gdHJpbSgkc3RyKTsKICAgIH0KCiAgIC8qKgogICAgKiBkZWNvZGVzIGEgSlNPTiBzdHJpbmcgaW50byBhcHByb3ByaWF0ZSB2YXJpYWJsZQogICAgKgogICAgKiBAcGFyYW0gICAgc3RyaW5nICAkc3RyICAgIEpTT04tZm9ybWF0dGVkIHN0cmluZwogICAgKgogICAgKiBAcmV0dXJuICAgbWl4ZWQgICBudW1iZXIsIGJvb2xlYW4sIHN0cmluZywgYXJyYXksIG9yIG9iamVjdAogICAgKiAgICAgICAgICAgICAgICAgICBjb3JyZXNwb25kaW5nIHRvIGdpdmVuIEpTT04gaW5wdXQgc3RyaW5nLgogICAgKiAgICAgICAgICAgICAgICAgICBTZWUgYXJndW1lbnQgMSB0byBTZXJ2aWNlc19KU09OKCkgYWJvdmUgZm9yIG9iamVjdC1vdXRwdXQgYmVoYXZpb3IuCiAgICAqICAgICAgICAgICAgICAgICAgIE5vdGUgdGhhdCBkZWNvZGUoKSBhbHdheXMgcmV0dXJucyBzdHJpbmdzCiAgICAqICAgICAgICAgICAgICAgICAgIGluIEFTQ0lJIG9yIFVURi04IGZvcm1hdCEKICAgICogQGFjY2VzcyAgIHB1YmxpYwogICAgKi8KICAgIGZ1bmN0aW9uIGRlY29kZSgkc3RyKQogICAgewogICAgICAgICRzdHIgPSAkdGhpcy0+cmVkdWNlX3N0cmluZygkc3RyKTsKCiAgICAgICAgc3dpdGNoIChzdHJ0b2xvd2VyKCRzdHIpKSB7CiAgICAgICAgICAgIGNhc2UgJ3RydWUnOgogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CgogICAgICAgICAgICBjYXNlICdmYWxzZSc6CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CgogICAgICAgICAgICBjYXNlICdudWxsJzoKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwoKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICRtID0gYXJyYXkoKTsKCiAgICAgICAgICAgICAgICBpZiAoaXNfbnVtZXJpYygkc3RyKSkgewogICAgICAgICAgICAgICAgICAgIC8vIExvb2tpZS1sb28sIGl0J3MgYSBudW1iZXIKCiAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyB3b3VsZCB3b3JrIG9uIGl0cyBvd24sIGJ1dCBJJ20gdHJ5aW5nIHRvIGJlCiAgICAgICAgICAgICAgICAgICAgLy8gZ29vZCBhYm91dCByZXR1cm5pbmcgaW50ZWdlcnMgd2hlcmUgYXBwcm9wcmlhdGU6CiAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIChmbG9hdCkkc3RyOwoKICAgICAgICAgICAgICAgICAgICAvLyBSZXR1cm4gZmxvYXQgb3IgaW50LCBhcyBhcHByb3ByaWF0ZQogICAgICAgICAgICAgICAgICAgIHJldHVybiAoKGZsb2F0KSRzdHIgPT0gKGludGVnZXIpJHN0cikKICAgICAgICAgICAgICAgICAgICAgICAgPyAoaW50ZWdlcikkc3RyCiAgICAgICAgICAgICAgICAgICAgICAgIDogKGZsb2F0KSRzdHI7CgogICAgICAgICAgICAgICAgfSBlbHNlaWYgKHByZWdfbWF0Y2goJy9eKCJ8XCcpLiooXDEpJC9zJywgJHN0ciwgJG0pICYmICRtWzFdID09ICRtWzJdKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gU1RSSU5HUyBSRVRVUk5FRCBJTiBVVEYtOCBGT1JNQVQKICAgICAgICAgICAgICAgICAgICAkZGVsaW0gPSBzdWJzdHIoJHN0ciwgMCwgMSk7CiAgICAgICAgICAgICAgICAgICAgJGNocnMgPSBzdWJzdHIoJHN0ciwgMSwgLTEpOwogICAgICAgICAgICAgICAgICAgICR1dGY4ID0gJyc7CiAgICAgICAgICAgICAgICAgICAgJHN0cmxlbl9jaHJzID0gc3RybGVuKCRjaHJzKTsKCiAgICAgICAgICAgICAgICAgICAgZm9yICgkYyA9IDA7ICRjIDwgJHN0cmxlbl9jaHJzOyArKyRjKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAkc3Vic3RyX2NocnNfY18yID0gc3Vic3RyKCRjaHJzLCAkYywgMik7CiAgICAgICAgICAgICAgICAgICAgICAgICRvcmRfY2hyc19jID0gb3JkKCRjaHJzeyRjfSk7CgogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHRydWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJHN1YnN0cl9jaHJzX2NfMiA9PSAnXGInOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR1dGY4IC49IGNocigweDA4KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArKyRjOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAkc3Vic3RyX2NocnNfY18yID09ICdcdCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHV0ZjggLj0gY2hyKDB4MDkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrJGM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICRzdWJzdHJfY2hyc19jXzIgPT0gJ1xuJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdXRmOCAuPSBjaHIoMHgwQSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyskYzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJHN1YnN0cl9jaHJzX2NfMiA9PSAnXGYnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR1dGY4IC49IGNocigweDBDKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArKyRjOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAkc3Vic3RyX2NocnNfY18yID09ICdccic6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHV0ZjggLj0gY2hyKDB4MEQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrJGM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAkc3Vic3RyX2NocnNfY18yID09ICdcXCInOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAkc3Vic3RyX2NocnNfY18yID09ICdcXFwnJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJHN1YnN0cl9jaHJzX2NfMiA9PSAnXFxcXCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICRzdWJzdHJfY2hyc19jXzIgPT0gJ1xcLyc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgkZGVsaW0gPT0gJyInICYmICRzdWJzdHJfY2hyc19jXzIgIT0gJ1xcXCcnKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgkZGVsaW0gPT0gIiciICYmICRzdWJzdHJfY2hyc19jXzIgIT0gJ1xcIicpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR1dGY4IC49ICRjaHJzeysrJGN9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHByZWdfbWF0Y2goJy9cXFx1WzAtOUEtRl17NH0vaScsIHN1YnN0cigkY2hycywgJGMsIDYpKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaW5nbGUsIGVzY2FwZWQgdW5pY29kZSBjaGFyYWN0ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdXRmMTYgPSBjaHIoaGV4ZGVjKHN1YnN0cigkY2hycywgKCRjICsgMiksIDIpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiBjaHIoaGV4ZGVjKHN1YnN0cigkY2hycywgKCRjICsgNCksIDIpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHV0ZjggLj0gJHRoaXMtPnV0ZjE2MnV0ZjgoJHV0ZjE2KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYyArPSA1OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgKCRvcmRfY2hyc19jID49IDB4MjApICYmICgkb3JkX2NocnNfYyA8PSAweDdGKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdXRmOCAuPSAkY2hyc3skY307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAoJG9yZF9jaHJzX2MgJiAweEUwKSA9PSAweEMwOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoYXJhY3RlcnMgVS0wMDAwMDA4MCAtIFUtMDAwMDA3RkYsIG1hc2sgMTEwWFhYWFgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3NlZSBodHRwOi8vd3d3LmNsLmNhbS5hYy51ay9+bWdrMjUvdW5pY29kZS5odG1sI3V0Zi04CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHV0ZjggLj0gc3Vic3RyKCRjaHJzLCAkYywgMik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyskYzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICgkb3JkX2NocnNfYyAmIDB4RjApID09IDB4RTA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hhcmFjdGVycyBVLTAwMDAwODAwIC0gVS0wMDAwRkZGRiwgbWFzayAxMTEwWFhYWAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlZSBodHRwOi8vd3d3LmNsLmNhbS5hYy51ay9+bWdrMjUvdW5pY29kZS5odG1sI3V0Zi04CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHV0ZjggLj0gc3Vic3RyKCRjaHJzLCAkYywgMyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGMgKz0gMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICgkb3JkX2NocnNfYyAmIDB4RjgpID09IDB4RjA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hhcmFjdGVycyBVLTAwMDEwMDAwIC0gVS0wMDFGRkZGRiwgbWFzayAxMTExMFhYWAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlZSBodHRwOi8vd3d3LmNsLmNhbS5hYy51ay9+bWdrMjUvdW5pY29kZS5odG1sI3V0Zi04CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHV0ZjggLj0gc3Vic3RyKCRjaHJzLCAkYywgNCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGMgKz0gMzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICgkb3JkX2NocnNfYyAmIDB4RkMpID09IDB4Rjg6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hhcmFjdGVycyBVLTAwMjAwMDAwIC0gVS0wM0ZGRkZGRiwgbWFzayAxMTExMTBYWAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlZSBodHRwOi8vd3d3LmNsLmNhbS5hYy51ay9+bWdrMjUvdW5pY29kZS5odG1sI3V0Zi04CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHV0ZjggLj0gc3Vic3RyKCRjaHJzLCAkYywgNSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGMgKz0gNDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICgkb3JkX2NocnNfYyAmIDB4RkUpID09IDB4RkM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hhcmFjdGVycyBVLTA0MDAwMDAwIC0gVS03RkZGRkZGRiwgbWFzayAxMTExMTEwWAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlZSBodHRwOi8vd3d3LmNsLmNhbS5hYy51ay9+bWdrMjUvdW5pY29kZS5odG1sI3V0Zi04CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHV0ZjggLj0gc3Vic3RyKCRjaHJzLCAkYywgNik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGMgKz0gNTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHV0Zjg7CgogICAgICAgICAgICAgICAgfSBlbHNlaWYgKHByZWdfbWF0Y2goJy9eXFsuKlxdJC9zJywgJHN0cikgfHwgcHJlZ19tYXRjaCgnL15cey4qXH0kL3MnLCAkc3RyKSkgewogICAgICAgICAgICAgICAgICAgIC8vIGFycmF5LCBvciBvYmplY3Qgbm90YXRpb24KCiAgICAgICAgICAgICAgICAgICAgaWYgKCRzdHJ7MH0gPT0gJ1snKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRzdGsgPSBhcnJheShTRVJWSUNFU19KU09OX0lOX0FSUik7CiAgICAgICAgICAgICAgICAgICAgICAgICRhcnIgPSBhcnJheSgpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+dXNlICYgU0VSVklDRVNfSlNPTl9MT09TRV9UWVBFKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc3RrID0gYXJyYXkoU0VSVklDRVNfSlNPTl9JTl9PQkopOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJG9iaiA9IGFycmF5KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc3RrID0gYXJyYXkoU0VSVklDRVNfSlNPTl9JTl9PQkopOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJG9iaiA9IG5ldyBzdGRDbGFzcygpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBhcnJheV9wdXNoKCRzdGssIGFycmF5KCd3aGF0JyAgPT4gU0VSVklDRVNfSlNPTl9TTElDRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3aGVyZScgPT4gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkZWxpbScgPT4gZmFsc2UpKTsKCiAgICAgICAgICAgICAgICAgICAgJGNocnMgPSBzdWJzdHIoJHN0ciwgMSwgLTEpOwogICAgICAgICAgICAgICAgICAgICRjaHJzID0gJHRoaXMtPnJlZHVjZV9zdHJpbmcoJGNocnMpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoJGNocnMgPT0gJycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc2V0KCRzdGspID09IFNFUlZJQ0VTX0pTT05fSU5fQVJSKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJGFycjsKCiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJG9iajsKCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vcHJpbnQoIlxucGFyc2luZyB7JGNocnN9XG4iKTsKCiAgICAgICAgICAgICAgICAgICAgJHN0cmxlbl9jaHJzID0gc3RybGVuKCRjaHJzKTsKCiAgICAgICAgICAgICAgICAgICAgZm9yICgkYyA9IDA7ICRjIDw9ICRzdHJsZW5fY2hyczsgKyskYykgewoKICAgICAgICAgICAgICAgICAgICAgICAgJHRvcCA9IGVuZCgkc3RrKTsKICAgICAgICAgICAgICAgICAgICAgICAgJHN1YnN0cl9jaHJzX2NfMiA9IHN1YnN0cigkY2hycywgJGMsIDIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgkYyA9PSAkc3RybGVuX2NocnMpIHx8ICgoJGNocnN7JGN9ID09ICcsJykgJiYgKCR0b3BbJ3doYXQnXSA9PSBTRVJWSUNFU19KU09OX1NMSUNFKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvdW5kIGEgY29tbWEgdGhhdCBpcyBub3QgaW5zaWRlIGEgc3RyaW5nLCBhcnJheSwgZXRjLiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9SIHdlJ3ZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgY2hhcmFjdGVyIGxpc3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzbGljZSA9IHN1YnN0cigkY2hycywgJHRvcFsnd2hlcmUnXSwgKCRjIC0gJHRvcFsnd2hlcmUnXSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlfcHVzaCgkc3RrLCBhcnJheSgnd2hhdCcgPT4gU0VSVklDRVNfSlNPTl9TTElDRSwgJ3doZXJlJyA9PiAoJGMgKyAxKSwgJ2RlbGltJyA9PiBmYWxzZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9wcmludCgiRm91bmQgc3BsaXQgYXQgeyRjfTogIi5zdWJzdHIoJGNocnMsICR0b3BbJ3doZXJlJ10sICgxICsgJGMgLSAkdG9wWyd3aGVyZSddKSkuIlxuIik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc2V0KCRzdGspID09IFNFUlZJQ0VTX0pTT05fSU5fQVJSKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgYXJlIGluIGFuIGFycmF5LCBzbyBqdXN0IHB1c2ggYW4gZWxlbWVudCBvbnRvIHRoZSBzdGFjawogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5X3B1c2goJGFyciwgJHRoaXMtPmRlY29kZSgkc2xpY2UpKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2VpZiAocmVzZXQoJHN0aykgPT0gU0VSVklDRVNfSlNPTl9JTl9PQkopIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBhcmUgaW4gYW4gb2JqZWN0LCBzbyBmaWd1cmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdXQgdGhlIHByb3BlcnR5IG5hbWUgYW5kIHNldCBhbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVsZW1lbnQgaW4gYW4gYXNzb2NpYXRpdmUgYXJyYXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIG5vdwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwYXJ0cyA9IGFycmF5KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWdfbWF0Y2goJy9eXHMqKFsiXCddLipbXlxcXF1bIlwnXSlccyo6XHMqKFxTLiopLD8kL1VpcycsICRzbGljZSwgJHBhcnRzKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAibmFtZSI6dmFsdWUgcGFpcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAka2V5ID0gJHRoaXMtPmRlY29kZSgkcGFydHNbMV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdmFsID0gJHRoaXMtPmRlY29kZSgkcGFydHNbMl0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT51c2UgJiBTRVJWSUNFU19KU09OX0xPT1NFX1RZUEUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRvYmpbJGtleV0gPSAkdmFsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG9iai0+JGtleSA9ICR2YWw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2VpZiAocHJlZ19tYXRjaCgnL15ccyooXHcrKVxzKjpccyooXFMuKiksPyQvVWlzJywgJHNsaWNlLCAkcGFydHMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5hbWU6dmFsdWUgcGFpciwgd2hlcmUgbmFtZSBpcyB1bnF1b3RlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAka2V5ID0gJHBhcnRzWzFdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdmFsID0gJHRoaXMtPmRlY29kZSgkcGFydHNbMl0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT51c2UgJiBTRVJWSUNFU19KU09OX0xPT1NFX1RZUEUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRvYmpbJGtleV0gPSAkdmFsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG9iai0+JGtleSA9ICR2YWw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlaWYgKCgoJGNocnN7JGN9ID09ICciJykgfHwgKCRjaHJzeyRjfSA9PSAiJyIpKSAmJiAoJHRvcFsnd2hhdCddICE9IFNFUlZJQ0VTX0pTT05fSU5fU1RSKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm91bmQgYSBxdW90ZSwgYW5kIHdlIGFyZSBub3QgaW5zaWRlIGEgc3RyaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheV9wdXNoKCRzdGssIGFycmF5KCd3aGF0JyA9PiBTRVJWSUNFU19KU09OX0lOX1NUUiwgJ3doZXJlJyA9PiAkYywgJ2RlbGltJyA9PiAkY2hyc3skY30pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcHJpbnQoIkZvdW5kIHN0YXJ0IG9mIHN0cmluZyBhdCB7JGN9XG4iKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZWlmICgoJGNocnN7JGN9ID09ICR0b3BbJ2RlbGltJ10pICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgkdG9wWyd3aGF0J10gPT0gU0VSVklDRVNfSlNPTl9JTl9TVFIpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoc3RybGVuKHN1YnN0cigkY2hycywgMCwgJGMpKSAtIHN0cmxlbihydHJpbShzdWJzdHIoJGNocnMsIDAsICRjKSwgJ1xcJykpKSAlIDIgIT0gMSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvdW5kIGEgcXVvdGUsIHdlJ3JlIGluIGEgc3RyaW5nLCBhbmQgaXQncyBub3QgZXNjYXBlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2Uga25vdyB0aGF0IGl0J3Mgbm90IGVzY2FwZWQgYmVjYXNlIHRoZXJlIGlzIF9ub3RfIGFuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZGQgbnVtYmVyIG9mIGJhY2tzbGFzaGVzIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmluZyBzbyBmYXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5X3BvcCgkc3RrKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcHJpbnQoIkZvdW5kIGVuZCBvZiBzdHJpbmcgYXQgeyRjfTogIi5zdWJzdHIoJGNocnMsICR0b3BbJ3doZXJlJ10sICgxICsgMSArICRjIC0gJHRvcFsnd2hlcmUnXSkpLiJcbiIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlaWYgKCgkY2hyc3skY30gPT0gJ1snKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbl9hcnJheSgkdG9wWyd3aGF0J10sIGFycmF5KFNFUlZJQ0VTX0pTT05fU0xJQ0UsIFNFUlZJQ0VTX0pTT05fSU5fQVJSLCBTRVJWSUNFU19KU09OX0lOX09CSikpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3VuZCBhIGxlZnQtYnJhY2tldCwgYW5kIHdlIGFyZSBpbiBhbiBhcnJheSwgb2JqZWN0LCBvciBzbGljZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlfcHVzaCgkc3RrLCBhcnJheSgnd2hhdCcgPT4gU0VSVklDRVNfSlNPTl9JTl9BUlIsICd3aGVyZScgPT4gJGMsICdkZWxpbScgPT4gZmFsc2UpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcHJpbnQoIkZvdW5kIHN0YXJ0IG9mIGFycmF5IGF0IHskY31cbiIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlaWYgKCgkY2hyc3skY30gPT0gJ10nKSAmJiAoJHRvcFsnd2hhdCddID09IFNFUlZJQ0VTX0pTT05fSU5fQVJSKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm91bmQgYSByaWdodC1icmFja2V0LCBhbmQgd2UncmUgaW4gYW4gYXJyYXkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5X3BvcCgkc3RrKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcHJpbnQoIkZvdW5kIGVuZCBvZiBhcnJheSBhdCB7JGN9OiAiLnN1YnN0cigkY2hycywgJHRvcFsnd2hlcmUnXSwgKDEgKyAkYyAtICR0b3BbJ3doZXJlJ10pKS4iXG4iKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZWlmICgoJGNocnN7JGN9ID09ICd7JykgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5fYXJyYXkoJHRvcFsnd2hhdCddLCBhcnJheShTRVJWSUNFU19KU09OX1NMSUNFLCBTRVJWSUNFU19KU09OX0lOX0FSUiwgU0VSVklDRVNfSlNPTl9JTl9PQkopKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm91bmQgYSBsZWZ0LWJyYWNlLCBhbmQgd2UgYXJlIGluIGFuIGFycmF5LCBvYmplY3QsIG9yIHNsaWNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheV9wdXNoKCRzdGssIGFycmF5KCd3aGF0JyA9PiBTRVJWSUNFU19KU09OX0lOX09CSiwgJ3doZXJlJyA9PiAkYywgJ2RlbGltJyA9PiBmYWxzZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9wcmludCgiRm91bmQgc3RhcnQgb2Ygb2JqZWN0IGF0IHskY31cbiIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlaWYgKCgkY2hyc3skY30gPT0gJ30nKSAmJiAoJHRvcFsnd2hhdCddID09IFNFUlZJQ0VTX0pTT05fSU5fT0JKKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm91bmQgYSByaWdodC1icmFjZSwgYW5kIHdlJ3JlIGluIGFuIG9iamVjdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlfcG9wKCRzdGspOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9wcmludCgiRm91bmQgZW5kIG9mIG9iamVjdCBhdCB7JGN9OiAiLnN1YnN0cigkY2hycywgJHRvcFsnd2hlcmUnXSwgKDEgKyAkYyAtICR0b3BbJ3doZXJlJ10pKS4iXG4iKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZWlmICgoJHN1YnN0cl9jaHJzX2NfMiA9PSAnLyonKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbl9hcnJheSgkdG9wWyd3aGF0J10sIGFycmF5KFNFUlZJQ0VTX0pTT05fU0xJQ0UsIFNFUlZJQ0VTX0pTT05fSU5fQVJSLCBTRVJWSUNFU19KU09OX0lOX09CSikpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3VuZCBhIGNvbW1lbnQgc3RhcnQsIGFuZCB3ZSBhcmUgaW4gYW4gYXJyYXksIG9iamVjdCwgb3Igc2xpY2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5X3B1c2goJHN0aywgYXJyYXkoJ3doYXQnID0+IFNFUlZJQ0VTX0pTT05fSU5fQ01ULCAnd2hlcmUnID0+ICRjLCAnZGVsaW0nID0+IGZhbHNlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYysrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9wcmludCgiRm91bmQgc3RhcnQgb2YgY29tbWVudCBhdCB7JGN9XG4iKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZWlmICgoJHN1YnN0cl9jaHJzX2NfMiA9PSAnKi8nKSAmJiAoJHRvcFsnd2hhdCddID09IFNFUlZJQ0VTX0pTT05fSU5fQ01UKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm91bmQgYSBjb21tZW50IGVuZCwgYW5kIHdlJ3JlIGluIG9uZSBub3cKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5X3BvcCgkc3RrKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjKys7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICgkaSA9ICR0b3BbJ3doZXJlJ107ICRpIDw9ICRjOyArKyRpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjaHJzID0gc3Vic3RyX3JlcGxhY2UoJGNocnMsICcgJywgJGksIDEpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcHJpbnQoIkZvdW5kIGVuZCBvZiBjb21tZW50IGF0IHskY306ICIuc3Vic3RyKCRjaHJzLCAkdG9wWyd3aGVyZSddLCAoMSArICRjIC0gJHRvcFsnd2hlcmUnXSkpLiJcbiIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmIChyZXNldCgkc3RrKSA9PSBTRVJWSUNFU19KU09OX0lOX0FSUikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJGFycjsKCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlaWYgKHJlc2V0KCRzdGspID09IFNFUlZJQ0VTX0pTT05fSU5fT0JKKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkb2JqOwoKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEB0b2RvIFVsdGltYXRlbHksIHRoaXMgc2hvdWxkIGp1c3QgY2FsbCBQRUFSOjppc0Vycm9yKCkKICAgICAqLwogICAgZnVuY3Rpb24gaXNFcnJvcigkZGF0YSwgJGNvZGUgPSBudWxsKQogICAgewogICAgICAgIGlmIChjbGFzc19leGlzdHMoJ3BlYXInKSkgewogICAgICAgICAgICByZXR1cm4gUEVBUjo6aXNFcnJvcigkZGF0YSwgJGNvZGUpOwogICAgICAgIH0gZWxzZWlmIChpc19vYmplY3QoJGRhdGEpICYmIChnZXRfY2xhc3MoJGRhdGEpID09ICdzZXJ2aWNlc19qc29uX2Vycm9yJyB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19zdWJjbGFzc19vZigkZGF0YSwgJ3NlcnZpY2VzX2pzb25fZXJyb3InKSkpIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9Cn0KCmlmIChjbGFzc19leGlzdHMoJ1BFQVJfRXJyb3InKSkgewoKICAgIGNsYXNzIFNlcnZpY2VzX0pTT05fRXJyb3IgZXh0ZW5kcyBQRUFSX0Vycm9yCiAgICB7CiAgICAgICAgZnVuY3Rpb24gU2VydmljZXNfSlNPTl9FcnJvcigkbWVzc2FnZSA9ICd1bmtub3duIGVycm9yJywgJGNvZGUgPSBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG1vZGUgPSBudWxsLCAkb3B0aW9ucyA9IG51bGwsICR1c2VyaW5mbyA9IG51bGwpCiAgICAgICAgewogICAgICAgICAgICBwYXJlbnQ6OlBFQVJfRXJyb3IoJG1lc3NhZ2UsICRjb2RlLCAkbW9kZSwgJG9wdGlvbnMsICR1c2VyaW5mbyk7CiAgICAgICAgfQogICAgfQoKfSBlbHNlIHsKCiAgICAvKioKICAgICAqIEB0b2RvIFVsdGltYXRlbHksIHRoaXMgY2xhc3Mgc2hhbGwgYmUgZGVzY2VuZGVkIGZyb20gUEVBUl9FcnJvcgogICAgICovCiAgICBjbGFzcyBTZXJ2aWNlc19KU09OX0Vycm9yCiAgICB7CiAgICAgICAgZnVuY3Rpb24gU2VydmljZXNfSlNPTl9FcnJvcigkbWVzc2FnZSA9ICd1bmtub3duIGVycm9yJywgJGNvZGUgPSBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG1vZGUgPSBudWxsLCAkb3B0aW9ucyA9IG51bGwsICR1c2VyaW5mbyA9IG51bGwpCiAgICAgICAgewoKICAgICAgICB9CiAgICB9Cgp9CiAgICAKPz4K]]></data>
	</file>
	<file>
	  <filename>/facebook-platform/php/jsonwrapper/JSON/LICENSE</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cm1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKbWV0OgoKUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAp0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgoKUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQpkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgoKVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4KTk8gRVZFTlQgU0hBTEwgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCklOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVApOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgpVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCkFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCihJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgpUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgo=]]></data>
	</file>
	<file>
	  <filename>/facebook-platform/php/jsonwrapper/jsonwrapper.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIyBJbiBQSFAgNS4yIG9yIGhpZ2hlciB3ZSBkb24ndCBuZWVkIHRvIGJyaW5nIHRoaXMgaW4KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2pzb25fZW5jb2RlJykpIHsKCXJlcXVpcmVfb25jZSAnanNvbndyYXBwZXJfaW5uZXIucGhwJzsKfSAKPz4K]]></data>
	</file>
	<file>
	  <filename>/facebook-platform/php/jsonwrapper/jsonwrapper_inner.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCnJlcXVpcmVfb25jZSAnSlNPTi9KU09OLnBocCc7CgpmdW5jdGlvbiBqc29uX2VuY29kZSgkYXJnKQp7CglnbG9iYWwgJHNlcnZpY2VzX2pzb247CglpZiAoIWlzc2V0KCRzZXJ2aWNlc19qc29uKSkgewoJCSRzZXJ2aWNlc19qc29uID0gbmV3IFNlcnZpY2VzX0pTT04oKTsKCX0KCXJldHVybiAkc2VydmljZXNfanNvbi0+ZW5jb2RlKCRhcmcpOwp9CgpmdW5jdGlvbiBqc29uX2RlY29kZSgkYXJnKQp7CglnbG9iYWwgJHNlcnZpY2VzX2pzb247CglpZiAoIWlzc2V0KCRzZXJ2aWNlc19qc29uKSkgewoJCSRzZXJ2aWNlc19qc29uID0gbmV3IFNlcnZpY2VzX0pTT04oKTsKCX0KCXJldHVybiAkc2VydmljZXNfanNvbi0+ZGVjb2RlKCRhcmcpOwp9Cgo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/function.admin_addtocart_tab.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IENhcnQgLSBBIHNpbXBsZSBleGFtcGxlIGZyb250ZW5kIGZvcm0gbW9kdWxlCiMgVmVyc2lvbjogMS4wLCBjYWxndXkxMDAwIDxjYWxndXkxMDAwQGNtc21hZGVzaW1wbGUub3JnPgojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykKIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZwojIFRoZSBtb2R1bGUncyBob21lcGFnZSBpczogaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy9wcm9qZWN0cy9za2VsZXRvbi8KIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmlmKCAhaXNzZXQoJGdDbXMpICkgZXhpdDsKCiRzbWFydHktPmFzc2lnbignaW5mbycsJHRoaXMtPkxhbmcoJ2luZm9fYWRkdG9jYXJ0X3RlbXBsYXRlcycpKTsKJHNtYXJ0eS0+YXNzaWduKCdmb3JtJywkdGhpcy0+U2hvd1RlbXBsYXRlTGlzdCgkaWQsJHJldHVybmlkLCdhZGR0b2NhcnRfJywKCQkJCQkgICAgICAgJ2FkZHRvY2FydF9zeXNkZWZhdWx0X3RlbXBsYXRlJywnYWRkdG9jYXJ0JywKCQkJCQkgICAgICAgJ2FkZHRvY2FydF9kZmx0JywKCQkJCQkgICAgICAgJHRoaXMtPkxhbmcoJ2FkZGVkaXRfYWRkdG9jYXJ0X3RlbXBsYXRlJykpKTsKCmVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZSgndGVtcGxhdGVzX3RhYi50cGwnKTsKLy8gRU9GCj8+]]></data>
	</file>
	<file>
	  <filename>/function.admin_defaulttemplates_tab.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IENhcnQgLSBBIHNpbXBsZSBleGFtcGxlIGZyb250ZW5kIGZvcm0gbW9kdWxlCiMgVmVyc2lvbjogMS4wLCBjYWxndXkxMDAwIDxjYWxndXkxMDAwQGNtc21hZGVzaW1wbGUub3JnPgojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykKIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZwojIFRoZSBtb2R1bGUncyBob21lcGFnZSBpczogaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy9wcm9qZWN0cy9za2VsZXRvbi8KIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmlmKCAhaXNzZXQoJGdDbXMpICkgZXhpdDsKCiR0aGlzLT5FZGl0RGVmYXVsdFRlbXBsYXRlRm9ybSgkdGhpcywkaWQsJHJldHVybmlkLAoJCQkgICAgICAgJ2FkZHRvY2FydF9zeXNkZWZhdWx0X3RlbXBsYXRlJywKCQkJICAgICAgICdkZWZhdWx0dGVtcGxhdGVzJywKCQkJICAgICAgICR0aGlzLT5MYW5nKCdkZWZhdWx0X2FkZHRvY2FydF90ZW1wbGF0ZScpLAoJCQkgICAgICAgJ29yaWdfYWRkdG9jYXJ0X3RlbXBsYXRlLnRwbCcsCgkJCSAgICAgICAkdGhpcy0+TGFuZygnd2Fybl9kZWZhdWx0X3RlbXBsYXRlcycpKTsKCiR0aGlzLT5FZGl0RGVmYXVsdFRlbXBsYXRlRm9ybSgkdGhpcywkaWQsJHJldHVybmlkLAoJCQkgICAgICAgJ215Y2FydGZvcm1fc3lzZGVmYXVsdF90ZW1wbGF0ZScsCgkJCSAgICAgICAnZGVmYXVsdHRlbXBsYXRlcycsCgkJCSAgICAgICAkdGhpcy0+TGFuZygnZGVmYXVsdF9teWNhcnRmb3JtX3RlbXBsYXRlJyksCgkJCSAgICAgICAnb3JpZ19teWNhcnRmb3JtX3RlbXBsYXRlLnRwbCcsCgkJCSAgICAgICAkdGhpcy0+TGFuZygnd2Fybl9kZWZhdWx0X3RlbXBsYXRlcycpKTsKCiR0aGlzLT5FZGl0RGVmYXVsdFRlbXBsYXRlRm9ybSgkdGhpcywkaWQsJHJldHVybmlkLAoJCQkgICAgICAgJ215Y2FydHNsaXN0X3N5c2RlZmF1bHRfdGVtcGxhdGUnLAoJCQkgICAgICAgJ2RlZmF1bHR0ZW1wbGF0ZXMnLAoJCQkgICAgICAgJHRoaXMtPkxhbmcoJ2RlZmF1bHRfbXljYXJ0c2xpc3RfdGVtcGxhdGUnKSwKCQkJICAgICAgICdvcmlnX215Y2FydHNsaXN0X3RlbXBsYXRlLnRwbCcsCgkJCSAgICAgICAkdGhpcy0+TGFuZygnd2Fybl9kZWZhdWx0X3RlbXBsYXRlcycpKTsKCiR0aGlzLT5FZGl0RGVmYXVsdFRlbXBsYXRlRm9ybSgkdGhpcywkaWQsJHJldHVybmlkLAoJCQkgICAgICAgJ2VkaXRzaGlwcGluZ19zeXNkZWZhdWx0X3RlbXBsYXRlJywKCQkJICAgICAgICdkZWZhdWx0dGVtcGxhdGVzJywKCQkJICAgICAgICR0aGlzLT5MYW5nKCdkZWZhdWx0X2VkaXRzaGlwcGluZ190ZW1wbGF0ZScpLAoJCQkgICAgICAgJ29yaWdfZWRpdHNoaXBwaW5nX3RlbXBsYXRlLnRwbCcsCgkJCSAgICAgICAkdGhpcy0+TGFuZygnd2Fybl9kZWZhdWx0X3RlbXBsYXRlcycpKTsKCiR0aGlzLT5FZGl0RGVmYXVsdFRlbXBsYXRlRm9ybSgkdGhpcywkaWQsJHJldHVybmlkLAoJCQkgICAgICAgJ3ZpZXdjYXJ0Zm9ybV9zeXNkZWZhdWx0X3RlbXBsYXRlJywKCQkJICAgICAgICdkZWZhdWx0dGVtcGxhdGVzJywKCQkJICAgICAgICR0aGlzLT5MYW5nKCdkZWZhdWx0X3ZpZXdjYXJ0Zm9ybV90ZW1wbGF0ZScpLAoJCQkgICAgICAgJ29yaWdfdmlld2NhcnRmb3JtX3RlbXBsYXRlLnRwbCcsCgkJCSAgICAgICAkdGhpcy0+TGFuZygnd2Fybl9kZWZhdWx0X3RlbXBsYXRlcycpKTsKCi8vIEVPRgo/Pg==]]></data>
	</file>
	<file>
	  <filename>/function.admin_editshipping_tab.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IENhcnQgLSBBIHNpbXBsZSBleGFtcGxlIGZyb250ZW5kIGZvcm0gbW9kdWxlCiMgVmVyc2lvbjogMS4wLCBjYWxndXkxMDAwIDxjYWxndXkxMDAwQGNtc21hZGVzaW1wbGUub3JnPgojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykKIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZwojIFRoZSBtb2R1bGUncyBob21lcGFnZSBpczogaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy9wcm9qZWN0cy9za2VsZXRvbi8KIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmlmKCAhaXNzZXQoJGdDbXMpICkgZXhpdDsKCiRzbWFydHktPmFzc2lnbignaW5mbycsJHRoaXMtPkxhbmcoJ2luZm9fZWRpdHNoaXBwaW5nX3RlbXBsYXRlcycpKTsKCiRzbWFydHktPmFzc2lnbignZm9ybScsICR0aGlzLT5TaG93VGVtcGxhdGVMaXN0KCRpZCwkcmV0dXJuaWQsJ2VkaXRzaGlwcGluZ18nLAoJCQkJCQknZWRpdHNoaXBwaW5nX3N5c2RlZmF1bHRfdGVtcGxhdGUnLCdlZGl0c2hpcHBpbmcnLAoJCQkJCQknZWRpdHNoaXBwaW5nX2RmbHQnLAoJCQkJCQkkdGhpcy0+TGFuZygnYWRkZWRpdF9lZGl0c2hpcHBpbmdfdGVtcGxhdGUnKSkpOwoKZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCd0ZW1wbGF0ZXNfdGFiLnRwbCcpOwoKLy8gRU9GCj8+]]></data>
	</file>
	<file>
	  <filename>/function.admin_mycartform_tab.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IENhcnQgLSBBIHNpbXBsZSBleGFtcGxlIGZyb250ZW5kIGZvcm0gbW9kdWxlCiMgVmVyc2lvbjogMS4wLCBjYWxndXkxMDAwIDxjYWxndXkxMDAwQGNtc21hZGVzaW1wbGUub3JnPgojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykKIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZwojIFRoZSBtb2R1bGUncyBob21lcGFnZSBpczogaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy9wcm9qZWN0cy9za2VsZXRvbi8KIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmlmKCAhaXNzZXQoJGdDbXMpICkgZXhpdDsKCiRzbWFydHktPmFzc2lnbignaW5mbycsJHRoaXMtPkxhbmcoJ2luZm9fbXljYXJ0Zm9ybV90ZW1wbGF0ZXMnKSk7CiRzbWFydHktPmFzc2lnbignZm9ybScsCgkJJHRoaXMtPlNob3dUZW1wbGF0ZUxpc3QoJGlkLCRyZXR1cm5pZCwnbXljYXJ0Zm9ybV8nLAoJCQkJCSdteWNhcnRmb3JtX3N5c2RlZmF1bHRfdGVtcGxhdGUnLCdteWNhcnRmb3JtJywKCQkJCQknbXljYXJ0Zm9ybV9kZmx0JywKCQkJCQkkdGhpcy0+TGFuZygnYWRkZWRpdF9teWNhcnRmb3JtX3RlbXBsYXRlJykpKTsKCmVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZSgndGVtcGxhdGVzX3RhYi50cGwnKTsKCi8vIEVPRgo/Pg==]]></data>
	</file>
	<file>
	  <filename>/function.admin_mycartslist_tab.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IENhcnQgLSBBIHNpbXBsZSBleGFtcGxlIGZyb250ZW5kIGZvcm0gbW9kdWxlCiMgVmVyc2lvbjogMS4wLCBjYWxndXkxMDAwIDxjYWxndXkxMDAwQGNtc21hZGVzaW1wbGUub3JnPgojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykKIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZwojIFRoZSBtb2R1bGUncyBob21lcGFnZSBpczogaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy9wcm9qZWN0cy9za2VsZXRvbi8KIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmlmKCAhaXNzZXQoJGdDbXMpICkgZXhpdDsKCiRzbWFydHktPmFzc2lnbignaW5mbycsJHRoaXMtPkxhbmcoJ2luZm9fbXljYXJ0c2xpc3RfdGVtcGxhdGVzJykpOwoKJHNtYXJ0eS0+YXNzaWduKCdmb3JtJywgJHRoaXMtPlNob3dUZW1wbGF0ZUxpc3QoJGlkLCRyZXR1cm5pZCwnbXljYXJ0c2xpc3RfJywKCQkJCQkJJ215Y2FydHNsaXN0X3N5c2RlZmF1bHRfdGVtcGxhdGUnLCdteWNhcnRzbGlzdCcsCgkJCQkJCSdteWNhcnRzbGlzdF9kZmx0JywKCQkJCQkJJHRoaXMtPkxhbmcoJ2FkZGVkaXRfbXljYXJ0c2xpc3RfdGVtcGxhdGUnKSkpOwoKZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCd0ZW1wbGF0ZXNfdGFiLnRwbCcpOwoKLy8gRU9GCj8+]]></data>
	</file>
	<file>
	  <filename>/function.admin_preferences_tab.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IENhcnQgLSBBIHNpbXBsZSBleGFtcGxlIGZyb250ZW5kIGZvcm0gbW9kdWxlCiMgVmVyc2lvbjogMS4wLCBjYWxndXkxMDAwIDxjYWxndXkxMDAwQGNtc21hZGVzaW1wbGUub3JnPgojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykKIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZwojIFRoZSBtb2R1bGUncyBob21lcGFnZSBpczogaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy9wcm9qZWN0cy9za2VsZXRvbi8KIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmlmKCAhaXNzZXQoJGdDbXMpICkgZXhpdDsKCiRzbWFydHktPmFzc2lnbignZm9ybXN0YXJ0JywkdGhpcy0+Q0dDcmVhdGVGb3JtU3RhcnQoJGlkLCdhZG1pbl9zYXZlX3ByZWZzJykpOwokc21hcnR5LT5hc3NpZ24oJ2Zvcm1lbmQnLCR0aGlzLT5DcmVhdGVGb3JtRW5kKCkpOwokc21hcnR5LT5hc3NpZ24oJ3N1Ym1pdCcsJHRoaXMtPkNyZWF0ZUlucHV0U3VibWl0KCRpZCwnc3VibWl0JywKCQkJCQkJICAkdGhpcy0+TGFuZygnc3VibWl0JykpKTsKCiRjb250ZW50b3BzID0mICRnQ21zLT5HZXRDb250ZW50T3BlcmF0aW9ucygpOwokc21hcnR5LT5hc3NpZ24oJ3Byb21wdF9hZGR0b2NhcnRfZGVzdHBhZ2UnLCR0aGlzLT5MYW5nKCdhZGR0b2NhcnRfZGVzdHBhZ2UnKSk7CiRzbWFydHktPmFzc2lnbignaW5wdXRfYWRkdG9jYXJ0X2Rlc3RwYWdlJywKCQkkY29udGVudG9wcy0+Q3JlYXRlSGllcmFyY2h5RHJvcGRvd24oJycsJHRoaXMtPkdldFByZWZlcmVuY2UoJ2FkZHRvY2FydF9kZXN0cGFnZScpLAoJCQkJCQkgICAgICRpZC4nYWRkdG9jYXJ0X2Rlc3RwYWdlJykpOwoKZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCdhZG1pbl9wcmVmZXJlbmNlc190YWIudHBsJyk7Ci8vIEVPRgo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/function.admin_productsummarytemplate_tab.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IENhcnQgLSBBIHNpbXBsZSBleGFtcGxlIGZyb250ZW5kIGZvcm0gbW9kdWxlCiMgVmVyc2lvbjogMS4wLCBjYWxndXkxMDAwIDxjYWxndXkxMDAwQGNtc21hZGVzaW1wbGUub3JnPgojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykKIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZwojIFRoZSBtb2R1bGUncyBob21lcGFnZSBpczogaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy9wcm9qZWN0cy9za2VsZXRvbi8KIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmlmKCAhaXNzZXQoJGdDbXMpICkgZXhpdDsKCmVjaG8gJHRoaXMtPkdldFNpbmdsZVRlbXBsYXRlRm9ybSgkdGhpcywkaWQsJHJldHVybmlkLCdwcm9kdWN0c3VtbWFyeScsCgkJCQkgICdwcm9kdWN0c3VtbWFyeXRlbXBsYXRlJywKCQkJCSAgJHRoaXMtPkxhbmcoJ3Byb2R1Y3RzdW1tYXJ5X3RlbXBsYXRlJyksCgkJCQkgICdvcmlnX3Byb2R1Y3Rfc3VtbWFyeV90ZW1wbGF0ZS50cGwnLAoJCQkJICAkdGhpcy0+TGFuZygnaW5mb19wcm9kdWN0c3VtbWFyeXRlbXBsYXRlJykpOwovLyBFT0YKPz4=]]></data>
	</file>
	<file>
	  <filename>/function.admin_viewcartform_tab.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IENhcnQgLSBBIHNpbXBsZSBleGFtcGxlIGZyb250ZW5kIGZvcm0gbW9kdWxlCiMgVmVyc2lvbjogMS4wLCBjYWxndXkxMDAwIDxjYWxndXkxMDAwQGNtc21hZGVzaW1wbGUub3JnPgojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykKIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZwojIFRoZSBtb2R1bGUncyBob21lcGFnZSBpczogaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy9wcm9qZWN0cy9za2VsZXRvbi8KIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmlmKCAhaXNzZXQoJGdDbXMpICkgZXhpdDsKCiRzbWFydHktPmFzc2lnbignaW5mbycsJHRoaXMtPkxhbmcoJ2luZm9fdmlld2NhcnRmb3JtX3RlbXBsYXRlJykpOwokc21hcnR5LT5hc3NpZ24oJ2Zvcm0nLCR0aGlzLT5TaG93VGVtcGxhdGVMaXN0KCRpZCwkcmV0dXJuaWQsJ3ZpZXdjYXJ0Zm9ybV8nLAoJCQkJCSAgICAgICAndmlld2NhcnRmb3JtX3N5c2RlZmF1bHRfdGVtcGxhdGUnLCd2aWV3Y2FydGZvcm0nLAoJCQkJCSAgICAgICAndmlld2NhcnRmb3JtX2RmbHQnLAoJCQkJCSAgICAgICAkdGhpcy0+TGFuZygnYWRkZWRpdF92aWV3Y2FydGZvcm1fdGVtcGxhdGUnKSkpOwoKZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCd0ZW1wbGF0ZXNfdGFiLnRwbCcpOwoKLy8gRU9GCj8+]]></data>
	</file>
	<file>
	  <filename>/GiftBaskets.module.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IEdpZnRCYXNrZXRzIC0gQSBzaW1wbGUgZXhhbXBsZSBmcm9udGVuZCBmb3JtIG1vZHVsZQojIFZlcnNpb246IDEuMCwgY2FsZ3V5MTAwMCA8Y2FsZ3V5MTAwMEBjbXNtYWRlc2ltcGxlLm9yZz4KIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIENNUyAtIENNUyBNYWRlIFNpbXBsZSBpcyAoYykgMjAwNSBieSBUZWQgS3VscCAod2lzaHlAY21zbWFkZXNpbXBsZS5vcmcpCiMgVGhpcyBwcm9qZWN0J3MgaG9tZXBhZ2UgaXM6IGh0dHA6Ly93d3cuY21zbWFkZXNpbXBsZS5vcmcKIyBUaGUgbW9kdWxlJ3MgaG9tZXBhZ2UgaXM6IGh0dHA6Ly9kZXYuY21zbWFkZXNpbXBsZS5vcmcvcHJvamVjdHMvc2tlbGV0b24vCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIwojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgojIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQojIE9yIHJlYWQgaXQgb25saW5lOiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwKIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCiRjZ2V4dGVuc2lvbnMgPSBjbXNfam9pbl9wYXRoKCRnQ21zLT5jb25maWdbJ3Jvb3RfcGF0aCddLCdtb2R1bGVzJywKCQkJICAgICAgJ0NHRXh0ZW5zaW9ucycsJ0NHRXh0ZW5zaW9ucy5tb2R1bGUucGhwJyk7CmlmKCAhaXNfcmVhZGFibGUoICRjZ2V4dGVuc2lvbnMgKSApCnsKICBlY2hvICc8aDE+PGZvbnQgY29sb3I9InJlZCI+RVJST1I6IFRoZSBDR0V4dGVuc2lvbnMgbW9kdWxlIGNvdWxkIG5vdCBiZSBmb3VuZC48L2ZvbnQ+PC9oMT4nOwogIHJldHVybjsKfQpyZXF1aXJlX29uY2UoJGNnZXh0ZW5zaW9ucyk7CgpkZWZpbmUoJ0dJRlRCQVNLRVRTX05BTUVfTVlTRUxGJywnX19teXNlbGZfXycpOwoKY2xhc3MgR2lmdEJhc2tldHMgZXh0ZW5kcyBDR0V4dGVuc2lvbnMKewogIHZhciAkX2NhcnRzOwogIHZhciAkX251bWl0ZW1zOwogIHZhciAkX2NhbGN1bGF0ZWQ7CiAgdmFyICRfc3VidG90YWw7CiAgdmFyICRfd2VpZ2h0OwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBHaWZ0QmFza2V0cygpCiAgIGNvbnRzdHVjdG9yCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gR2lmdEJhc2tldHMoKQogIHsKICAgIHBhcmVudDo6Q01TTW9kdWxlKCk7CgogICAgJHRoaXMtPl9jYXJ0cyA9IGFycmF5KCk7CiAgICAkdGhpcy0+X2NhbGN1bGF0ZWQgPSAwOwogICAgJHRoaXMtPl9udW1pdGVtcyA9IDA7CiAgICAkdGhpcy0+X3N1YnRvdGFsID0gMDsKICAgICR0aGlzLT5fd2VpZ2h0ID0gMDsKICB9CiAgCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIEdldE5hbWUoKQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIEdldE5hbWUoKQogIHsKICAgIHJldHVybiAnR2lmdEJhc2tldHMnOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgR2V0RnJpZW5kbHlOYW1lKCkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBHZXRGcmllbmRseU5hbWUoKQogIHsKICAgIHJldHVybiAkdGhpcy0+TGFuZygnZnJpZW5kbHluYW1lJyk7CiAgfQoKCQogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIEdldFZlcnNpb24oKQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIEdldFZlcnNpb24oKQogIHsKICAgIHJldHVybiAnMS4zJzsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBHZXRIZWxwKCkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBHZXRIZWxwKCkKICB7CiAgICByZXR1cm4gJHRoaXMtPkxhbmcoJ2hlbHAnKTsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBHZXRBdXRob3IoKQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIEdldEF1dGhvcigpCiAgewogICAgcmV0dXJuICdjYWxndXkxMDAwJzsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBHZXRBdXRob3JFbWFpbCgpCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gR2V0QXV0aG9yRW1haWwoKQogIHsKICAgIHJldHVybiAnY2FsZ3V5MTAwMEBjbXNtYWRlc2ltcGxlLm9yZyc7CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgR2V0Q2hhbmdlTG9nKCkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBHZXRDaGFuZ2VMb2coKQogIHsKICAgIHJldHVybiAkdGhpcy0+TGFuZygnY2hhbmdlbG9nJyk7CiAgfQogIAogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIElzUGx1Z2luTW9kdWxlKCkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBJc1BsdWdpbk1vZHVsZSgpCiAgewogICAgcmV0dXJuIHRydWU7CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgSGFzQWRtaW4oKQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIEhhc0FkbWluKCkKICB7CiAgICByZXR1cm4gdHJ1ZTsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBHZXRBZG1pblNlY3Rpb24oKQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIEdldEFkbWluU2VjdGlvbigpCiAgewogICAgcmV0dXJuICdleHRlbnNpb25zJzsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBHZXRBZG1pbkRlc2NyaXB0aW9uKCkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBHZXRBZG1pbkRlc2NyaXB0aW9uKCkKICB7CiAgICByZXR1cm4gJHRoaXMtPkxhbmcoJ21vZGRlc2NyaXB0aW9uJyk7CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgVmlzaWJsZVRvQWRtaW5Vc2VyKCkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBWaXNpYmxlVG9BZG1pblVzZXIoKQogIHsKICAgIHJldHVybiAkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdNb2RpZnkgVGVtcGxhdGVzJykgfHwKICAgICAgJHRoaXMtPkNoZWNrUGVybWlzc2lvbignTW9kaWZ5IFNpdGUgUHJlZmVyZW5jZXMnKTsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBHZXREZXBlbmRlbmNpZXMoKQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIEdldERlcGVuZGVuY2llcygpCiAgewogICAgcmV0dXJuIGFycmF5KCdDR0V4dGVuc2lvbnMnPT4nMS4xNy45JywKCQkgJ1Byb2R1Y3RzJz0+JzIuNS4xJywKCQkgJ0Zyb250RW5kVXNlcnMnPT4nMS43LjEnLAoJCSAnQ0dTaW1wbGVTbWFydHknPT4nMS40LjInKTsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBBbGxvd0F1dG9JbnN0YWxsKCkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBBbGxvd0F1dG9JbnN0YWxsKCkKICB7CglyZXR1cm4gRkFMU0U7CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgQWxsb3dBdXRvVXBncmFkZSgpCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gQWxsb3dBdXRvVXBncmFkZSgpCiAgewoJcmV0dXJuIEZBTFNFOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIE1pbmltdW1DTVNWZXJzaW9uKCkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBNaW5pbXVtQ01TVmVyc2lvbigpCiAgewogICAgcmV0dXJuICIxLjYuNiI7CiAgfQoJCgkKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBTZXRQYXJhbWV0ZXJzKCkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBTZXRQYXJhbWV0ZXJzKCkKICB7CiAgICAkdGhpcy0+UmVnaXN0ZXJNb2R1bGVQbHVnaW4oKTsKICAgICR0aGlzLT5SZXN0cmljdFVua25vd25QYXJhbXMoKTsKCiAgICAkdGhpcy0+Q3JlYXRlUGFyYW1ldGVyKCdhZGR0b2NhcnR0ZW1wbGF0ZScsJycsJHRoaXMtPkxhbmcoJ2hlbHBfYWRkdG9jYXJ0dGVtcGxhdGUnKSk7CiAgICAkdGhpcy0+U2V0UGFyYW1ldGVyVHlwZSgnYWRkdG9jYXJ0dGVtcGxhdGUnLENMRUFOX1NUUklORyk7CgogICAgJHRoaXMtPkNyZWF0ZVBhcmFtZXRlcignbXljYXJ0dGVtcGxhdGUnLCcnLCR0aGlzLT5MYW5nKCdoZWxwX215Y2FydHRlbXBsYXRlJykpOwogICAgJHRoaXMtPlNldFBhcmFtZXRlclR5cGUoJ215Y2FydHRlbXBsYXRlJyxDTEVBTl9TVFJJTkcpOwoKICAgICR0aGlzLT5DcmVhdGVQYXJhbWV0ZXIoJ215Y2FydHN0ZW1wbGF0ZScsJycsJHRoaXMtPkxhbmcoJ2hlbHBfbXljYXJ0c3R0ZW1wbGF0ZScpKTsKICAgICR0aGlzLT5TZXRQYXJhbWV0ZXJUeXBlKCdteWNhcnRzdGVtcGxhdGUnLENMRUFOX1NUUklORyk7CgogICAgJHRoaXMtPkNyZWF0ZVBhcmFtZXRlcignZWRpdHNoaXBwaW5ndGVtcGxhdGUnLCcnLCR0aGlzLT5MYW5nKCdoZWxwX2VkaXRzaGlwcGluZ3RlbXBsYXRlJykpOwogICAgJHRoaXMtPlNldFBhcmFtZXRlclR5cGUoJ2VkaXRzaGlwcGluZ3RlbXBsYXRlJyxDTEVBTl9TVFJJTkcpOwoKICAgICR0aGlzLT5DcmVhdGVQYXJhbWV0ZXIoJ3Byb2R1Y3QnLCcnLCR0aGlzLT5MYW5nKCdoZWxwX3Byb2R1Y3QnKSk7CiAgICAkdGhpcy0+U2V0UGFyYW1ldGVyVHlwZSgncHJvZHVjdCcsQ0xFQU5fSU5UKTsKCiAgICAkdGhpcy0+Q3JlYXRlUGFyYW1ldGVyKCd2aWV3Y2FydHRlbXBsYXRlJywnJywkdGhpcy0+TGFuZygnaGVscF92aWV3Y2FydHRlbXBsYXRlJykpOwogICAgJHRoaXMtPlNldFBhcmFtZXRlclR5cGUoJ3ZpZXdjYXJ0dGVtcGxhdGUnLENMRUFOX1NUUklORyk7CgogICAgJHRoaXMtPkNyZWF0ZVBhcmFtZXRlcigndmlld2NhcnRwYWdlJywnJywkdGhpcy0+TGFuZygnaGVscF92aWV3Y2FydHBhZ2UnKSk7CiAgICAkdGhpcy0+U2V0UGFyYW1ldGVyVHlwZSgndmlld2NhcnRwYWdlJyxDTEVBTl9TVFJJTkcpOwoKICAgICR0aGlzLT5DcmVhdGVQYXJhbWV0ZXIoJ2hpZGVmb3JtJywnMCcsJHRoaXMtPkxhbmcoJ2hlbHBfaGlkZWZvcm0nKSk7CiAgICAkdGhpcy0+U2V0UGFyYW1ldGVyVHlwZSgnaGlkZWZvcm0nLENMRUFOX0lOVCk7CgogICAgJHRoaXMtPkNyZWF0ZVBhcmFtZXRlcignYWN0aW9uJywnZGVmYXVsdCcsJHRoaXMtPkxhbmcoJ2hlbHBfYWN0aW9uJykpOwoKICAgICR0aGlzLT5DcmVhdGVQYXJhbWV0ZXIoJ3NvcnRieScsJ2NyZWF0ZV9kYXRlJywkdGhpcy0+TGFuZygnaGVscF9zb3J0YnknKSk7CiAgICAkdGhpcy0+U2V0UGFyYW1ldGVyVHlwZSgnc29ydGJ5JyxDTEVBTl9TVFJJTkcpOwogICAgJHRoaXMtPkNyZWF0ZVBhcmFtZXRlcignc29ydG9yZGVyJywnYXNjJywkdGhpcy0+TGFuZygnaGVscF9zb3J0b3JkZXInKSk7CiAgICAkdGhpcy0+U2V0UGFyYW1ldGVyVHlwZSgnc29ydG9yZGVyJyxDTEVBTl9TVFJJTkcpOwoKICAgICR0aGlzLT5DcmVhdGVQYXJhbWV0ZXIoJ2hpZGVmb3JtJywnJywkdGhpcy0+TGFuZygnaGVscF9jYXJ0X2lkJykpOwogICAgLy8kdGhpcy0+U2V0UGFyYW1ldGVyVHlwZSgnY2FydF9pZCcsQ0xFQU5fSU5UKTsKICAgICR0aGlzLT5TZXRQYXJhbWV0ZXJUeXBlKENMRUFOX1JFR0VYUC4nL2NhcnRfLiovJyxDTEVBTl9TVFJJTkcpOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIEluc3RhbGxQb3N0TWVzc2FnZSgpCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gSW5zdGFsbFBvc3RNZXNzYWdlKCkKICB7CiAgICByZXR1cm4gJHRoaXMtPkxhbmcoJ3Bvc3RpbnN0YWxsJyk7CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgVW5pbnN0YWxsUG9zdE1lc3NhZ2UoKQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIFVuaW5zdGFsbFBvc3RNZXNzYWdlKCkKICB7CiAgICByZXR1cm4gJHRoaXMtPkxhbmcoJ3Bvc3R1bmluc3RhbGwnKTsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBVbmluc3RhbGxQcmVNZXNzYWdlKCkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBVbmluc3RhbGxQcmVNZXNzYWdlKCkKICB7CiAgICByZXR1cm4gJHRoaXMtPkxhbmcoJ3JlYWxseV91bmluc3RhbGwnKTsKICB9CQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgRXJhc2VDYXJ0KCkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBFcmFzZUNhcnQoKQogIHsKICAgIGlmKCBpc3NldCgkX1NFU1NJT05bJ2dpZnRiYXNrZXRzJ10pICkKICAgICAgewoJdW5zZXQoJF9TRVNTSU9OWydnaWZ0YmFza2V0cyddKTsKICAgICAgfQogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIF9jYWxjdWxhdGVfY2FydF9tZXRhZGF0YSgpCiAgIENhbGN1bGF0ZSBhbmQgc3RvcmUgKHRlbXBvcmFyaWx5KSBhbnkgY2FydCBtZXRhZGF0YQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIF9jYWxjdWxhdGVfY2FydF9tZXRhZGF0YSgkZm9yY2UgPSAwKQogIHsKICAgIGdsb2JhbCAkZ0NtczsKICAgICRzbWFydHkgPSYgJGdDbXMtPkdldFNtYXJ0eSgpOwoKICAgIGlmKCAkdGhpcy0+X2NhbGN1bGF0ZWQgPT0gMSApIAogICAgICB7CglyZXR1cm47CiAgICAgIH0KICAgIGlmKCBjb3VudCgkdGhpcy0+X2NhcnRzKSA9PSAwIHx8ICRmb3JjZSA9PSAxKQogICAgICB7CgkkdGhpcy0+X2V4cGFuZF9jYXJ0KCk7CiAgICAgIH0KICAgIAogICAgJHNtYXJ0eS0+YXNzaWduKCdjdXJyZW5jeXN5bWJvbCcsY2dfZWNvbW06OmdldF9jdXJyZW5jeV9zeW1ib2woKSk7CiAgICAkc21hcnR5LT5hc3NpZ24oJ3dlaWdodHVuaXRzJyxjZ19lY29tbTo6Z2V0X3dlaWdodF91bml0cygpKTsKCiAgICAkdGhpcy0+X251bWl0ZW1zID0gMDsKICAgICR0aGlzLT5fd2VpZ2h0ID0gMDsKICAgICR0aGlzLT5fc3VidG90YWwgPSAwOwogICAgZm9yZWFjaCggJHRoaXMtPl9jYXJ0cyBhcyAkY2FydF9pZCA9PiAkdG1wICkKICAgICAgewoJJHRoZWNhcnQgPSYgJHRoaXMtPl9jYXJ0c1skY2FydF9pZF07CgoJJHRoZWNhcnQtPm51bWl0ZW1zID0gMDsKCSR0aGVjYXJ0LT5zdWJ0b3RhbCA9IDA7CgkkdGhlY2FydC0+d2VpZ2h0ID0gMDsKCWZvciggJGkgPSAwOyAkaSA8IGNvdW50KCR0aGVjYXJ0LT5pdGVtcyk7ICRpKysgKQoJICB7CgkgICAgJGl0ZW0gPSYgJHRoZWNhcnQtPml0ZW1zWyRpXTsKCgkgICAgJGl0ZW1wcmljZSA9ICRpdGVtLT5nZXRfYmFzZV9wcmljZSgpOwoJICAgIGZvcmVhY2goICRpdGVtLT5nZXRfYXR0cmlidXRlcygpIGFzICRvbmVhdHRyaWJvYmogKQoJICAgICAgewoJCSRpdGVtcHJpY2UgKz0gJG9uZWF0dHJpYm9iai0+YWRqdXN0bWVudDsKCSAgICAgIH0KCSAgICAkaXRlbS0+c2V0X3VuaXRfcHJpY2UoJGl0ZW1wcmljZSk7CgoJICAgICR0aGVjYXJ0LT5zdWJ0b3RhbCArPSAkaXRlbS0+Z2V0X3VuaXRfcHJpY2UoKSAqICRpdGVtLT5nZXRfcXVhbnRpdHkoKTsKCSAgICAkdGhlY2FydC0+d2VpZ2h0ICs9ICRpdGVtLT5nZXRfdW5pdF93ZWlnaHQoKSAqICRpdGVtLT5nZXRfcXVhbnRpdHkoKTsKCSAgICAkdGhlY2FydC0+bnVtaXRlbXMgKz0gJGl0ZW0tPmdldF9xdWFudGl0eSgpOwoJICB9CgoJJHRoaXMtPl9udW1pdGVtcyArPSAkdGhlY2FydC0+bnVtaXRlbXM7CgkkdGhpcy0+X3N1YnRvdGFsICs9ICR0aGVjYXJ0LT5zdWJ0b3RhbDsKCSR0aGlzLT5fd2VpZ2h0ICs9ICR0aGVjYXJ0LT53ZWlnaHQ7CiAgICAgIH0KCiAgICAkdGhpcy0+X2NhbGN1bGF0ZWQgPSAxOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIFNldEFkZGl0aW9uYWxUYXhJbmZvKCkKICAgU2V0IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gaW50byB0aGUgdGF4IG1vZHVsZQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIFNldEFkZGl0aW9uYWxUYXhJbmZvKCRwYXJhbXMpCiAgewogICAgZGllKCdmaXggbWUnKTsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBHZXRCYXNrZXRJdGVtcygpCiAgIFJldHVybiB0aGUgY29udGVudHMgb2YgdGhlIG5hbWVkIGJhc2tldC4KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBHZXRCYXNrZXRJdGVtcygkYWxpYXMsJGZldV91aWQgPSAtMSkKICB7CiAgICBnbG9iYWwgJGdDbXM7CiAgICAkZGIgPSYgJGdDbXMtPkdldERiKCk7CgogICAgJHRoaXMtPl9jYWxjdWxhdGVfY2FydF9tZXRhZGF0YSgpOwogICAgJHRoZV9jYXJ0ID0mICR0aGlzLT5fY2FydHNbJGFsaWFzXTsgCiAgICBpZiggIWlzc2V0KCR0aGVfY2FydC0+aXRlbXMpIHx8ICFpc19hcnJheSgkdGhlX2NhcnQtPml0ZW1zKSB8fCBjb3VudCgkdGhlX2NhcnQtPml0ZW1zKSA9PSAwICkKICAgICAgewoJcmV0dXJuIEZBTFNFOwogICAgICB9CgogICAgcmV0dXJuICR0aGVfY2FydC0+aXRlbXM7CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgR2V0QmFza2V0RGV0YWlscygpCiAgIFJldHVybiB0aGUgc2hpcHBpbmcgaW5mb3JtYXRpb24gZm9yIGEgcGFydGljdWxhciBiYXNrZXQuCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gR2V0QmFza2V0RGV0YWlscygkbmFtZSwkZmV1X3VpZCA9IC0xKQogIHsKICAgIGdsb2JhbCAkZ0NtczsKICAgICRkYiA9JiAkZ0Ntcy0+R2V0RGIoKTsKCiAgICAkbmFtZSA9IHRyaW0oJG5hbWUpOwogICAgJHRoaXMtPl9jYWxjdWxhdGVfY2FydF9tZXRhZGF0YSgpOwogICAgaWYoICFpc3NldCgkdGhpcy0+X2NhcnRzWyRuYW1lXSkgKSByZXR1cm4gRkFMU0U7CgogICAgJHRoZWNhcnQgPSYgJHRoaXMtPl9jYXJ0c1skbmFtZV07CiAgICBpZiggIWlzX29iamVjdCgkdGhlY2FydCkgKQogICAgICB7CgkvLyBzaG91bGQgc2V0IGFuIGVycm9yIGhlcmUuCglyZXR1cm4gRkFMU0U7CiAgICAgIH0KICAgICRyb3cgPSBhcnJheSgpOwogICAgZm9yZWFjaCggJHRoZWNhcnQgYXMgJHByb3AgPT4gJHZhbHVlICkKICAgICAgewoJJHJvd1skcHJvcF0gPSAkdmFsdWU7CiAgICAgIH0KICAgICRyb3dbJ3dlaWdodCddID0gJHRoZWNhcnQtPndlaWdodDsKICAgICRyb3dbJ3N1YnRvdGFsJ10gPSAkdGhlY2FydC0+c3VidG90YWw7CiAgICByZXR1cm4gJHJvdzsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBHZXRCYXNrZXROYW1lcygpCiAgIFJldHVybiBhbiBhcnJheSBvZiBiYXNrZXQgbmFtZXMKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBHZXRCYXNrZXROYW1lcygkZmV1X3VpZD0nJykKICB7CiAgICAkdGhpcy0+X2NhbGN1bGF0ZV9jYXJ0X21ldGFkYXRhKCk7CiAgICByZXR1cm4gYXJyYXlfa2V5cygkdGhpcy0+X2NhcnRzKTsKCiAgICAvKiB0b2RvICovCiAgICAvKgogICAgZ2xvYmFsICRnQ21zOwogICAgJGRiID0mICRnQ21zLT5HZXREYigpOwogICAgJHF1ZXJ5ID0gJ1NFTEVDVCBjYXJ0X25hbWUgRlJPTSAnLkdJRlRCQVNLRVRTX1RBQkxFX0JBU0tFVFMuJyBXSEVSRSBmZXVfdWlkID0gPyc7CiAgICAkdG1wID0gJGRiLT5HZXRBcnJheSgkcXVlcnksYXJyYXkoJGZldV91aWQpKTsKICAgIHJldHVybiAkdGhpcy0+YXJyYXlfZXh0cmFjdF9maWVsZCgkdG1wLCdjYXJ0X25hbWUnKTsKICAgICovCiAgfQoKICAKICBmdW5jdGlvbiBfY3JlYXRlX2Jhc2tldCgkYWxpYXMsJG5hbWUpCiAgewogICAgaWYoIGVtcHR5KCRuYW1lKSApCiAgICAgIHsKCXJldHVybiBGQUxTRTsKICAgICAgfQogICAgJG5hbWUgPSB0cmltKCRuYW1lKTsKICAgICRhbGlhcyA9IHRyaW0oJGFsaWFzKTsKICAgIGlmKCAhaW5fYXJyYXkoJGFsaWFzLCR0aGlzLT5HZXRCYXNrZXROYW1lcygpKSApCiAgICAgIHsKCSR0aGlzLT5fZXhwYW5kX2NhcnQoKTsKCSRvYmogPSBuZXcgU3RkQ2xhc3MoKTsKCSRvYmotPmNhcnRfbmFtZSA9ICRuYW1lOwoJJHRoaXMtPl9jYXJ0c1skYWxpYXNdID0gJG9iajsKCSR0aGlzLT5fY29sbGFwc2VfY2FydCgpOwogICAgICB9CiAgfQoKCiAgZnVuY3Rpb24gX3NldF9iYXNrZXRfZGF0YSgkYWxpYXMsJGRhdGEpCiAgewogICAgJGFsaWFzID0gdHJpbSgkYWxpYXMpOwogICAgJHRoaXMtPl9leHBhbmRfY2FydCgpOwogICAgaWYoIGVtcHR5KCRhbGlhcykgfHwgIWlzc2V0KCR0aGlzLT5fY2FydHNbJGFsaWFzXSkgfHwgIWlzX29iamVjdCgkdGhpcy0+X2NhcnRzWyRhbGlhc10pICkKICAgICAgewoJcmV0dXJuIEZBTFNFOwogICAgICB9CiAgICBpZiggIWlzX2FycmF5KCRkYXRhKSApIAogICAgICB7CglyZXR1cm4gRkFMU0U7CiAgICAgIH0KICAgIGlmKCAhaXNzZXQoJGRhdGFbJ2NhcnRfbmFtZSddKSB8fCBlbXB0eSgkZGF0YVsnY2FydF9uYW1lJ10pIHx8CiAgICAgICAgIWlzc2V0KCRkYXRhWydkZXN0X2ZpcnN0X25hbWUnXSkgfHwgZW1wdHkoJGRhdGFbJ2Rlc3RfZmlyc3RfbmFtZSddKSB8fAoJIWlzc2V0KCRkYXRhWydkZXN0X2xhc3RfbmFtZSddKSB8fCBlbXB0eSgkZGF0YVsnZGVzdF9sYXN0X25hbWUnXSkgfHwKCSFpc3NldCgkZGF0YVsnZGVzdF9hZGRyZXNzMSddKSB8fCBlbXB0eSgkZGF0YVsnZGVzdF9hZGRyZXNzMSddKSB8fAoJIWlzc2V0KCRkYXRhWydkZXN0X2NpdHknXSkgfHwgZW1wdHkoJGRhdGFbJ2Rlc3RfY2l0eSddKSB8fAoJIWlzc2V0KCRkYXRhWydkZXN0X3N0YXRlJ10pIHx8IGVtcHR5KCRkYXRhWydkZXN0X3N0YXRlJ10pIHx8CgkhaXNzZXQoJGRhdGFbJ2Rlc3RfcG9zdGFsJ10pIHx8IGVtcHR5KCRkYXRhWydkZXN0X3Bvc3RhbCddKSB8fAoJIWlzc2V0KCRkYXRhWydkZXN0X2NvdW50cnknXSkgfHwgZW1wdHkoJGRhdGFbJ2Rlc3RfY291bnRyeSddKSApCiAgICAgIHsKCXJldHVybiBGQUxTRTsKICAgICAgfQoKICAgICR0aGVjYXJ0ID0mICR0aGlzLT5fY2FydHNbJGFsaWFzXTsKICAgICR0aGVjYXJ0LT5jYXJ0X25hbWUgPSAkZGF0YVsnY2FydF9uYW1lJ107CiAgICAkdGhlY2FydC0+ZGVzdF9jb21wYW55ID0gJGRhdGFbJ2Rlc3RfY29tcGFueSddOwogICAgJHRoZWNhcnQtPmRlc3RfZmlyc3RfbmFtZSA9ICRkYXRhWydkZXN0X2ZpcnN0X25hbWUnXTsKICAgICR0aGVjYXJ0LT5kZXN0X2xhc3RfbmFtZSA9ICRkYXRhWydkZXN0X2xhc3RfbmFtZSddOwogICAgJHRoZWNhcnQtPmRlc3RfYWRkcmVzczEgPSAkZGF0YVsnZGVzdF9hZGRyZXNzMSddOwogICAgaWYoIGlzc2V0KCRkYXRhWydkZXN0X2FkZHJlc3MyJ10pICkKICAgICAgewoJJHRoZWNhcnQtPmRlc3RfYWRkcmVzczIgPSB0cmltKCRkYXRhWydkZXN0X2FkZHJlc3MyJ10pOwogICAgICB9CiAgICAkdGhlY2FydC0+ZGVzdF9jaXR5ID0gJGRhdGFbJ2Rlc3RfY2l0eSddOwogICAgJHRoZWNhcnQtPmRlc3Rfc3RhdGUgPSAkZGF0YVsnZGVzdF9zdGF0ZSddOwogICAgJHRoZWNhcnQtPmRlc3RfcG9zdGFsID0gJGRhdGFbJ2Rlc3RfcG9zdGFsJ107CiAgICAkdGhlY2FydC0+ZGVzdF9jb3VudHJ5ID0gJGRhdGFbJ2Rlc3RfY291bnRyeSddOwogICAgaWYoIGlzc2V0KCRkYXRhWydkZXN0X3Bob25lJ10pICkKICAgICAgewoJJHRoZWNhcnQtPmRlc3RfcGhvbmUgPSB0cmltKCRkYXRhWydkZXN0X3Bob25lJ10pOwogICAgICB9CiAgICBpZiggaXNzZXQoJGRhdGFbJ2Rlc3RfZmF4J10pICkKICAgICAgewoJJHRoZWNhcnQtPmRlc3RfZmF4ID0gdHJpbSgkZGF0YVsnZGVzdF9mYXgnXSk7CiAgICAgIH0KICAgIGlmKCBpc3NldCgkZGF0YVsnZGVzdF9lbWFpbCddKSApCiAgICAgIHsKCSR0aGVjYXJ0LT5kZXN0X2VtYWlsID0gdHJpbSgkZGF0YVsnZGVzdF9lbWFpbCddKTsKICAgICAgfQogICAgaWYoIGlzc2V0KCRkYXRhWydkZXN0X21lc3NhZ2UnXSkgKQogICAgICB7CgkkdGhlY2FydC0+ZGVzdF9tZXNzYWdlID0gdHJpbSgkZGF0YVsnZGVzdF9tZXNzYWdlJ10pOwogICAgICB9CiAgICAkdGhpcy0+X2NvbGxhcHNlX2NhcnQoKTsKICAgIHJldHVybiBUUlVFOwogIH0KCiAgZnVuY3Rpb24gX2RlbGV0ZV9iYXNrZXQoJG5hbWUpCiAgewogICAgJG5hbWUgPSB0cmltKCRuYW1lKTsKICAgICR0aGlzLT5fZXhwYW5kX2NhcnQoKTsKICAgIGlmKCBpc3NldCgkdGhpcy0+X2NhcnRzWyRuYW1lXSkgKQogICAgICB7Cgl1bnNldCgkdGhpcy0+X2NhcnRzWyRuYW1lXSk7CiAgICAgIH0KICAgICR0aGlzLT5fY29sbGFwc2VfY2FydCgpOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIEdldE51bUJhc2tldHMoKQogICBSZXR1cm4gdGhlIG51bWJlciBvZiBiYXNrZXRzIGN1cnJlbnRseSBjcmVhdGVkCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gR2V0TnVtQmFza2V0cygpCiAgewogICAgJHRoaXMtPl9jYWxjdWxhdGVfY2FydF9tZXRhZGF0YSgpOwogICAgcmV0dXJuIGNvdW50KCR0aGlzLT5fY2FydHMpOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIEdldE51bUl0ZW1zKCkKICAgUmV0dXJuIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgY2FydCAobm90IGluY2x1ZGluZyBxdWFudGl0aWVzKQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIEdldE51bUl0ZW1zKCkKICB7CiAgICAkdGhpcy0+X2NhbGN1bGF0ZV9jYXJ0X21ldGFkYXRhKCk7CiAgICByZXR1cm4gJHRoaXMtPl9udW1pdGVtczsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBHZXRTdWJUb3RhbCgpCiAgIEdldCB0aGUgc3VidG90YWwgb2YgdGhlIGNvc3Qgb2YgYWxsIG9mIHRoZSBpdGVtcyBpbiB0aGUgY2FydAogICB0YWtpbmcgaW50byBhY2NvdW50IHF1YW50aXRpZXMsIGFuZCBhbnkgcHJpY2UgYWRqdXN0bWVudHMKICAgYnV0IG5vdCBpbmNsdWRpbmcgYW55IHRheGVzIG9yIHNoaXBwaW5nIGNvc3RzLgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIEdldFN1YlRvdGFsKCkKICB7CiAgICAkdGhpcy0+X2NhbGN1bGF0ZV9jYXJ0X21ldGFkYXRhKCk7CiAgICByZXR1cm4gJHRoaXMtPl9zdWJ0b3RhbDsKICB9CiAgCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIEdldFRvdGFsV2VpZ2h0KCkKICAgZ2V0IHRoZSB0b3RhbCB3ZWlnaHQgb2YgdGhlIG9yZGVyCiAgIHVuaXQgb2Ygd2VpZ2h0IGlzIGRldGVybWluZWQgYnkgdGhlIHByb2R1Y3RzIG1vZHVsZQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIEdldFRvdGFsV2VpZ2h0KCkKICB7CiAgICAkdGhpcy0+X2NhbGN1bGF0ZV9jYXJ0X21ldGFkYXRhKCk7CiAgICByZXR1cm4gJHRoaXMtPl93ZWlnaHQ7CiAgfQoKCiAgZnVuY3Rpb24gX2V4cGFuZF9jYXJ0KCkKICB7CiAgICAkdGhpcy0+X2NhcnRzID0gYXJyYXkoKTsKICAgIGlmIChpc3NldCgkX1NFU1NJT05bJ2dpZnRiYXNrZXRzJ10pKQogICAgICB7CgkkdGhpcy0+X2NhcnRzID0gdW5zZXJpYWxpemUoJF9TRVNTSU9OWydnaWZ0YmFza2V0cyddKTsKICAgICAgfQogIH0KCgogIGZ1bmN0aW9uIF9jb2xsYXBzZV9jYXJ0KCkKICB7CiAgICAkX1NFU1NJT05bJ2dpZnRiYXNrZXRzJ10gPSBzZXJpYWxpemUoJHRoaXMtPl9jYXJ0cyk7CiAgfSAgCgoKICBmdW5jdGlvbiBfYWRkX2NhcnQoJGNhcnRfaWQpCiAgewogICAgaWYoICFpc19hcnJheSgkdGhpcy0+X2NhcnRzKSApIHJldHVybiBGQUxTRTsKICAgIGlmKCBpc19vYmplY3QoJHRoaXMtPl9jYXJ0c1skY2FydF9pZF0pICkgcmV0dXJuIEZBTFNFOwogICAgCiAgICAkb2JqID0gbmV3IFN0ZENsYXNzKCk7CiAgICAkb2JqLT5pdGVtcyA9IGFycmF5KCk7CiAgICAkdGhpcy0+X2NhcnRzWyRjYXJ0X2lkXSA9ICRvYmo7CiAgICByZXR1cm4gVFJVRTsKICB9CgogIGZ1bmN0aW9uIF9hZGRfY2FydF9pdGVtKCRjYXJ0X2lkLCRzb3VyY2UsJHByb2R1Y3RfaWQsJHNrdSwkcXVhbnRpdHksJGF0dHJpYnV0ZXMgPSBhcnJheSgpKQogIHsKICAgIGlmKCAhaXNfYXJyYXkoJGF0dHJpYnV0ZXMpICkgcmV0dXJuIEZBTFNFOwogICAgaWYoIGNvdW50KCRhdHRyaWJ1dGVzKSApIAogICAgICB7Cglmb3IoICRpID0gMDsgJGkgPCBjb3VudCgkYXR0cmlidXRlcyk7ICRpKysgKQoJICB7CgkgICAgaWYoICFpc19vYmplY3QoJGF0dHJpYnV0ZXNbJGldKSApIHJldHVybiBGQUxTRTsKCSAgfQogICAgICB9CgogICAgaWYoICFpc3NldCgkdGhpcy0+X2NhcnRzWyRjYXJ0X2lkXSkgKQogICAgICB7CgkkdGhpcy0+X2FkZF9jYXJ0KCRjYXJ0X2lkKTsKICAgICAgfQogICAgJHRoZWNhcnQgPSYgJHRoaXMtPl9jYXJ0c1skY2FydF9pZF07CgogICAgLy8gYnVpbGQgdGhlIG5ldyBvYmplY3QuCiAgICAkb2JqID0gbmV3IGNnX2Vjb21tX2NhcnRpdGVtKCRza3UsJHByb2R1Y3RfaWQsJHF1YW50aXR5KTsKICAgICRvYmotPnNldF9hdHRyaWJ1dGVzKCRhdHRyaWJ1dGVzKTsKICAgIGlmKCBpc19udW1lcmljKCRwcm9kdWN0X2lkKSApCiAgICAgIHsKCSRwcm9kdWN0ID0gY2dfZWNvbW06OmdldF9wcm9kdWN0X2luZm8oJHNvdXJjZSwkcHJvZHVjdF9pZCk7Cgkkb2JqLT5zZXRfdHlwZShjZ19lY29tbV9jYXJ0aXRlbTo6VFlQRV9QUk9EVUNUKTsKCSRvYmotPnNldF9zb3VyY2UoJHNvdXJjZSk7Cgkkb2JqLT5zZXRfcHJvZHVjdF9pZCgkcHJvZHVjdF9pZCk7Cgkkb2JqLT5zZXRfdW5pdF93ZWlnaHQoJHByb2R1Y3RbJ3dlaWdodCddKTsKCSRvYmotPnNldF9iYXNlX3ByaWNlKCRwcm9kdWN0WydwcmljZSddKTsKCSRvYmotPnNldF9zdW1tYXJ5KGNnX2Vjb21tOjpjYWxjdWxhdGVfY2FydGl0ZW1fc3VtbWFyeSgkcHJvZHVjdCwkYXR0cmlidXRlcykpOwogICAgICB9CgogICAgLy8gQW5kIEFkZCBpdAogICAgJHRoaXMtPkFkZENhcnRJdGVtKCRvYmosJGNhcnRfaWQpOwogIH0KCiAgCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgSXNDYXJ0TW9kdWxlKCkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBJc0NhcnRNb2R1bGUoKQogIHsKICAgIHJldHVybiB0cnVlOwogIH0KCgogIHB1YmxpYyBmdW5jdGlvbiBBZGRDYXJ0SXRlbSgmJG9iaiwkYmFza2V0X25hbWUgPSAnJykKICB7CiAgICBpZiggISRvYmogaW5zdGFuY2VvZiBjZ19lY29tbV9jYXJ0aXRlbSApIHJldHVybiBGQUxTRTsKICAgIGlmKCBlbXB0eSgkYmFza2V0X25hbWUpICkgcmV0dXJuIEZBTFNFOwogICAgCiAgICAkdGhpcy0+X2V4cGFuZF9jYXJ0KCk7CgogICAgJGFkZGVkID0gZmFsc2U7CiAgICAkdGhlY2FydCA9JiAkdGhpcy0+X2NhcnRzWyRiYXNrZXRfbmFtZV07CiAgICBmb3IoICRpID0gMDsgJGkgPCBjb3VudCgkdGhlY2FydC0+aXRlbXMpOyAkaSsrICkKICAgICAgewoJJG9uZSA9JiAkdGhlY2FydC0+aXRlbXNbJGldOwoJaWYoICgkb25lLT5nZXRfcHJvZHVjdF9pZCgpICE9ICRvYmotPmdldF9wcm9kdWN0X2lkKCkpIHx8IAoJICAgICgkb2JqLT5nZXRfc291cmNlKCkgIT0gJG9iai0+Z2V0X3NvdXJjZSgpKSApIGNvbnRpbnVlOwoJaWYoIGNvdW50KCRvbmUtPmdldF9hdHRyaWJ1dGVzKCkpID09IDAgJiYgY291bnQoJG9iai0+Z2V0X2F0dHJpYnV0ZXMoKSkgPT0gMCApCgkgIHsKCSAgICAvLyBpbmNyZWFzZSB0aGUgcXVhbnRpdHkKCSAgICAkYWRkZWQgPSB0cnVlOwoJICAgICRvbmUtPnNldF9xdWFudGl0eSgkb25lLT5nZXRfcXVhbnRpdHkoKSskb2JqLT5nZXRfcXVhbnRpdHkoKSk7CgkgICAgYnJlYWs7CgkgIH0KICAgICAgfQogICAgaWYoICEkYWRkZWQgKQogICAgICB7CgkkdGhlY2FydC0+aXRlbXNbXSA9ICRvYmo7CiAgICAgIH0KCiAgICAkdGhpcy0+X2NhbGN1bGF0ZWQgPSAwOwogICAgJHRoaXMtPl9jb2xsYXBzZV9jYXJ0KCk7CiAgICAKICAgIC8vIG5vdGUgdGhpcyBjb3VsZCBiZSBkb25lIGJ5IGhhdmluZyBhIGNhcnQgYmFzZSBjbGFzcwogICAgLy8gb3IgYnkgbGV0dGluZyB0aGUgY2dfZWNvbW0gc3R1ZmYgaGFuZGxlIGFsbCB0aGUgY2FydCBzdHVmZgogICAgY2dfZWNvbW1fY2FydDo6b25fY2FydF9pdGVtX2FkZGVkKCRvYmopOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIFN1cHBvcnNTaGlwcGluZ0luZm8oKQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIFN1cHBvcnRzU2hpcHBpbmdJbmZvKCkKICB7CiAgICByZXR1cm4gVFJVRTsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBnZXRfYWRkdG9jYXJ0X2Zvcm0oJHBhcmFtcyk7CiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcHVibGljIGZ1bmN0aW9uIGdldF9hZGR0b2NhcnRfZm9ybSgkcGFyYW1zKQogIHsKICAgIEBvYl9zdGFydCgpOwogICAgJHRoaXMtPkRvQWN0aW9uQmFzZSgnZGVmYXVsdCcsJ3Rlc3QnLCRwYXJhbXMpOwogICAgJHRtcCA9IEBvYl9nZXRfY29udGVudHMoKTsKICAgIEBvYl9lbmRfY2xlYW4oKTsKICAgIHJldHVybiAkdG1wOwogIH0KfSAvLyBjbGFzcwo=]]></data>
	</file>
	<file>
	  <filename>/lang/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lang/en_US.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCiMgQQokbGFuZ1snYWRkJ10gPSAnQWRkJzsKJGxhbmdbJ2FkZGVkaXRfYWRkdG9jYXJ0X3RlbXBsYXRlJ10gPSAnQWRkL0VkaXQgQWRkVG9DYXJ0IFRlbXBsYXRlJzsKJGxhbmdbJ2FkZGVkaXRfZWRpdHNoaXBwaW5nX3RlbXBsYXRlJ10gPSAnQWRkL0VkaXQgRWRpdCBTaGlwcGluZyBUZW1wbGF0ZSc7CiRsYW5nWydhZGRlZGl0X215Y2FydGZvcm1fdGVtcGxhdGUnXSA9ICdBZGQvRWRpdCBNeUNhcnQgRm9ybSBUZW1wbGF0ZSc7CiRsYW5nWydhZGRlZGl0X215Y2FydHNsaXN0X3RlbXBsYXRlJ10gPSAnQWRkL0VkaXQgTXlDYXJ0cyBMaXN0IFRlbXBsYXRlJzsKJGxhbmdbJ2FkZGVkaXRfdmlld2NhcnRmb3JtX3RlbXBsYXRlJ10gPSAnQWRkL0VkaXQgVmlld2NhcnQgRm9ybSBUZW1wbGF0ZSc7CiRsYW5nWydhZGRyZXNzMSddID0gJ0FkZHJlc3MgMSc7CiRsYW5nWydhZGRyZXNzMiddID0gJ0FkZHJlc3MgMic7CiRsYW5nWydhZGR0b2NhcnRfZGVzdHBhZ2UnXSA9ICdQYWdlIFRvIFJlZGlyZWN0IHRvIGFmdGVyICZxdW90O2FkZCB0byBjYXJ0JnF1b3Q7JzsKJGxhbmdbJ2FkZHRvY2FydF90ZW1wbGF0ZXMnXSA9ICdBZGRUb0NhcnQgVGVtcGxhdGVzJzsKJGxhbmdbJ2FkZF9uZXdfYmFza2V0J10gPSAnQWRkIE5ldyBCYXNrZXQnOwokbGFuZ1snYWRkX3RvX2FsbF9jYXJ0cyddID0gJ0FkZCB0byBBbGwgQmFza2V0cyc7CiRsYW5nWydhZGRfdG9fY2FydCddID0gJ0FkZCBUbyBUaGlzIEJhc2tldCc7CiRsYW5nWydhbW91bnQnXSA9ICdBbW91bnQnOwoKIyBDCiRsYW5nWydjYW5jZWwnXSA9ICdDYW5jZWwnOwokbGFuZ1snY2FydF9lbXB0eSddID0gJ1RoaXMgYmFza2V0IGlzIGVtcHR5JzsKJGxhbmdbJ2NhcnRfbmFtZSddID0gJ0NhcnQgbmFtZSc7CiRsYW5nWydjaGFuZ2Vsb2cnXSA9IDw8PEVPVAo8dWw+CiAgPGxpPlZlcnNpb24gMS4wIC0gRGVjZW1iZXIgMjAwODxici8+CiAgICAgIEluaXRpYWwgUmVsZWFzZQogIDwvbGk+CiAgPGxpPlZlcnNpb24gMS4yIC0gRGVjZW1iZXIgMjAxMDxici8+CiAgICAgIEFkZHMgU0tVIHN1cHBvcnQuCiAgPC9saT4KPC91bD4KRU9UOwokbGFuZ1snY2l0eSddID0gJ0NpdHknOwokbGFuZ1snY29uZmlybV9kZWxldGUnXSA9ICdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoaXMgYmFza2V0JzsKJGxhbmdbJ2NvbXBhbnknXSA9ICdDb21wYW55JzsKJGxhbmdbJ2NvdW50cnknXSA9ICdDb3VudHJ5JzsKCiMgRAokbGFuZ1snZGVmYXVsdF9hZGR0b2NhcnRfdGVtcGxhdGUnXSA9ICdEZWZhdWx0IEFkZFRvQ2FydCB0ZW1wbGF0ZSc7CiRsYW5nWydkZWZhdWx0X215Y2FydGZvcm1fdGVtcGxhdGUnXSA9ICdEZWZhdWx0IE15Q2FydCBmb3JtIHRlbXBsYXRlJzsKJGxhbmdbJ2RlZmF1bHRfbXljYXJ0c2xpc3RfdGVtcGxhdGUnXSA9ICdEZWZhdWx0IE15IENhcnRzIGxpc3QgdGVtcGxhdGUnOwokbGFuZ1snZGVmYXVsdF9lZGl0c2hpcHBpbmdfdGVtcGxhdGUnXSA9ICdEZWZhdWx0IEVkaXQgU2hpcHBpbmcgRm9ybSB0ZW1wbGF0ZSc7CiRsYW5nWydkZWZhdWx0X3ZpZXdjYXJ0Zm9ybV90ZW1wbGF0ZSddID0gJ0RlZmF1bHQgVmlld2NhcnQgZm9ybSB0ZW1wbGF0ZSc7CiRsYW5nWydkZWZhdWx0X3RlbXBsYXRlcyddID0gJ0RlZmF1bHQgVGVtcGxhdGVzJzsKJGxhbmdbJ2RlbGV0ZSddID0gJ0RlbGV0ZSc7CiRsYW5nWydkZXNjcmlwdGlvbiddID0gJ0Rlc2NyaXB0aW9uJzsKCiMgRQokbGFuZ1snZWRpdCddID0gJ0VkaXQnOwokbGFuZ1snZWRpdHNoaXBwaW5nX3RlbXBsYXRlcyddID0gJ0VkaXQgU2hpcHBpbmcgRm9ybSBUZW1wbGF0ZXMnOwokbGFuZ1snZWRpdF9zaGlwcGluZyddID0gJ0VkaXQgU2hpcHBpbmcgSW5mb3JtYXRpb24nOwokbGFuZ1snZWRpdF9zaGlwcGluZ19mb3JfY2FydCddID0gJ0VkaXQgU2hpcHBpbmcgSW5mb3JtYXRpb24gZm9yIGNhcnQgJnF1b3Q7JXMmcXVvdDsnOwokbGFuZ1snZW1haWwnXSA9ICdFbWFpbCc7CiRsYW5nWydlcnJvcl9jYXJ0ZXhpc3RzJ10gPSAnQSBiYXNrZXQgYnkgdGhhdCBuYW1lIGFscmVhZHkgZXhpc3RzJzsKJGxhbmdbJ2Vycm9yX2ludmFsaWRwYXJhbSddID0gJ0Egc3VwcGxpZWQgcGFyYW1ldGVyIGhhcyBhbiBpbmNvcnJlY3QgdmFsdWU6ICVzJzsKJGxhbmdbJ2Vycm9yX21pc3NpbmdwYXJhbSddID0gJ0EgcmVxdWlyZWQgcGFyYW1ldGVyIGlzIG1pc3Npbmc6ICVzJzsKJGxhbmdbJ2Vycm9yX25vY2FydHNkZWZpbmVkJ10gPSAnWW91IHNlZW0gdG8gaGF2ZSBkZWZpbmVkIG5vIGNhcnRzJzsKJGxhbmdbJ2Vycm9yX25vdGxvZ2dlZGluJ10gPSAnWW91IG11c3QgYmUgYSByZWdpc3RlcmVkLCBsb2dnZWRpbiB1c2VyIHRvIHVzZSB0aGlzIGZlYXR1cmUnOwokbGFuZ1snZXJyb3Jfbm9zdWNocHJvZHVjdCddID0gJ0NvdWxkIG5vdCBmaW5kIGluZm9ybWF0aW9uIG9uIHRoZSBwcm9kdWN0OiAlcyc7CiRsYW5nWydlcnJvcl9ub3N1Y2hjYXJ0J10gPSAnVGhlIGJhc2tldCBzcGVjaWZpZWQgY291bGQgbm90IGJlIGZvdW5kJzsKJGxhbmdbJ2Vycm9yX3NldGJhc2tldGRhdGEnXSA9ICdQcm9ibGVtIHNldHRpbmcgYmFza2V0IGRhdGEnOwoKIyBGCiRsYW5nWydmYXgnXSA9ICdGYXgnOwokbGFuZ1snZmlyc3RfbmFtZSddID0gJ0ZpcnN0IE5hbWUnOwokbGFuZ1snZnJpZW5kbHluYW1lJ10gPSAnR2lmdEJhc2tldHMgQ2FydCBVdGlsaXR5JzsKCiMgRwokbGFuZ1snZ3JhbmRfdG90YWwnXSA9ICdHcmFuZCBUb3RhbCc7CgojIEgKJGxhbmdbJ2hlbHAnXSA9IDw8PEVPVAo8aDM+V2hhdCBkb2VzIGl0IGRvPzwvaDM+CjxwPlRoaXMgbW9kdWxlIGFsbG93cyBhbiBhdXRob3JpemVkIGFuZCBsb2dnZWQgaW4gZnJvbnRlbmQgdXNlciB0byBtYW5hZ2UgbXVsdGlwbGUgYmFza2V0cywgd2l0aCBkaWZmZXJlbnQgc2hpcHBpbmcgbG9jYXRpb25zLCBhbmQgdG8gYWRkIHByb2R1Y3RzIGZyb20gdGhlIFByb2R1Y3RzIG1vZHVsZSBpbnRvIGFueSBvbmUgb2YgdGhpZXIgYmFza2V0cy48L3A+CjxwPlZpZXdzIGFuZCBmb3JtcyBhcmUgYWxzbyBwcm92aWRlZCB0byBhbGxvdyB0aGUgYXV0aG9yaXplZCBmcm9udGVuZCB1c2VyIHRvIG1hbmFnZSBoaXMgYmFza2V0cywgYW5kIHRoZSBjb250ZW50cyBvZiB0aGVtLjwvcD4KPGgzPkhvdyBEbyBJIHVzZSBJdDwvaDM+CiAgPHA+VGhpcyBtb2R1bGUgcHJvdmlkZXMgbWFueSBmb3JtcyBhbmQgcmVwb3J0cywgYW5kIGhhcyBjb25zaWRlcmFibGUgZnVuY3Rpb25hbGl0eS4gIEJ1dCBpbiB0aGUgc2ltcGxlc3Qgc2Vuc2UsIGp1c3Qgc2VsZWN0IHRoaXMgbW9kdWxlIGFzIHlvdXIgQ2FydCBtb2R1bGUgaW4gdGhlIHByZWZlcmVuY2VzIHRhYiBvZiB0aGUgJnF1b3Q7UHJvZHVjdCBNYW5hZ2VyJnF1b3Q7IGFkbWluIHBhbmVsLiAgVGhpcyB3aWxsIGRpc3BsYXkgYSBmb3JtIG9uIGFsbCBwcm9kdWN0IGRldGFpbCBwYWdlcyB0byBhbGxvdyB0aGUgY3VycmVudCBwcm9kdWN0IHRvIGJlIGFkZGVkIHRvIGEgdXNlciBzZWxlY3RlZCBjYXJ0LCBhbmQgd2lsbCAoZ2l2ZW4gdGhlIGRlZmF1bHQgdGVtcGxhdGVzKSBhbGxvdyBjcmVhdGluZyBvZiBudW1lcm91cyBjYXJ0cy48L3A+CjxwPlRvIGNyZWF0ZSBhIHN1bW1hcnkgb2YgYWxsIGNhcnRzLCB5b3UgY2FuIHVzZSBhIHRhZyBsaWtlIHtHaWZ0QmFza2V0cyBhY3Rpb249J215Y2FydCd9PC9wPgo8cD5UbyBjcmVhdGUgYSByZXBvcnQgb2YgYWxsIGNhcnRzLCBhbmQgdG8gYWxsb3cgbWFuYWdpbmcgdGhlaXIgY29udGVudHMsIHlvdSBjYW4gdXNlIGEgdGFnIGxpa2Uge0dpZnRCYXNrZXRzIGFjdGlvbj0nbXljYXJ0c2xpc3QnfTwvcD4KRU9UOwoKJGxhbmdbJ2hlbHBfYWN0aW9uJ10gPSAnU3BlY2lmaWVzIHRoZSBiZWhhdmlvdXIgb2YgdGhlIG1vZHVsZS4gIFBvc3NpYmxlIHZhbHVlcyBhcmUgXCdkZWZhdWx0XCcsXCdteWNhcnRcJywgYW5kIFwndmlld2NhcnRcJy48YnIvPjx1bD48bGk+ZGVmYXVsdDogZGlzcGxheXMgYSBmb3JtIHdpdGggYW4gXCdhZGQgdG8gY2FydFwnIGJ1dHRvbiB0byBhbGxvdyBhZGRpbmcgYSBzcGVjaWZpYyBwcm9kdWN0IHRvIHRoZSBjYXJ0LiAgVGhpcyBtb2RlIHJlcXVpcmVzIHRoZSBcJ3Byb2R1Y3RcJyBwYXJhbWV0ZXIgYmUgc3VwcGxpZWQuPC9saT48bGk+bXljYXJ0OiBEaXNwbGF5cyBhIGZvcm0gdGhhdCBkaXNwbGF5cyB0aGUgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBjYXJ0LCBhbmQgYSBcJ2NoZWNrb3V0XCcgYnV0dG9uLjwvbGk+PGxpPnZpZXdjYXJ0OiBEaXNwbGF5cyBhIGRldGFpbGVkIGZvcm0gb2YgdGhlIGNvbnRlbnRzIG9mIHRoZSBjYXJ0LCBpbmNsdWRpbmcgYSBjdXJyZW50IHRvdGFsLCBhbmQgYWxsb3dzIGRlbGV0aW5nIGl0ZW1zIGZyb20gdGhlIGNhcnQuPC9saT48L3VsPic7CiRsYW5nWydoZWxwX2FkZHRvY2FydHRlbXBsYXRlJ10gPSAnU3BlY2lmaWVzIGEgbm9uIGRlZmF1bHQgdGVtcGxhdGUgdG8gdXNlIGZvciB0aGUgXCdhZGR0b2NhcnRcJyBtb2RlLic7CiRsYW5nWydoZWxwX2VkaXRzaGlwcGluZ3RlbXBsYXRlJ10gPSAnU3BlY2lmaWVzIGEgbm9uIGRlZmF1bHQgdGVtcGxhdGUgdG8gdXNlIGZvciB0aGUgXCdlZGl0c2hpcHBpbmdcJyBhY3Rpb24nOwokbGFuZ1snaGVscF9oaWRlZm9ybSddID0gJ0FwcGxpY2FibGUgb25seSB0byB0aGUgXCd2aWV3Y2FydFwnIGFjdGlvbiwgdGhpcyBmbGFnIGluZGljYXRlcyB3ZXRoZXIgdGhlIHZpZXdjYXJ0IGZvcm0gc2hvdWxkIGJlIGRpc3BsYXllZCc7CiRsYW5nWydoZWxwX215Y2FydHNsaXN0dGVtcGxhdGUnXSA9ICdTcGVjaWZpZXMgYSBub24gZGVmYXVsdCB0ZW1wbGF0ZSB0byB1c2UgZm9yIHRoZSBcJ215Y2FydHNsaXN0XCcgbW9kZS4nOwokbGFuZ1snaGVscF9teWNhcnR0ZW1wbGF0ZSddID0gJ1NwZWNpZmllcyBhIG5vbiBkZWZhdWx0IHRlbXBsYXRlIHRvIHVzZSBmb3IgdGhlICBcJ215Y2FydFwnIG1vZGUuJzsKJGxhbmdbJ2hlbHBfcHJvZHVjdCddID0gJ0FwcGxpY2FibGUgb25seSBmb3IgdGhlIGRlZmF1bHQgYWN0aW9uLCB0aGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgd2hjaCBwcm9kdWN0IChieSBpZCkgc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSBjYXJ0LiAgVHlwaWNhbGx5LCBpbiB0aGUgcHJvZHVjdCBkZXRhaWwgdGVtcGxhdGUgb2YgdGhlIHByb2R1Y3RzIG1vZHVsZSwgeW91IHdvdWxkIGFkZCB7Q2FydCBwcm9kdWN0PSRlbnRyeS0+aWR9IHRvIGFsbG93IGFkZGluZyBpdGVtcyB0byB0aGUgY2FydCBmcm9tIHByb2R1Y3QgZGV0YWlsIHBhZ2VzLic7CiRsYW5nWydoZWxwX3NvcnRieSddID0gJ0FwcGxpY2FibGUgb25seSB0byB0aGUgbXljYXJ0c2xpc3QgYWN0aW9uLCB0aGlzIHBhcmFtZXRlciBhbGxvd3Mgc3BlY2lmeWluZyBhIGRpZmZlcmVudCBzb3J0aW5nIGZpZWxkLiAgUG9zc2libGUgdmFsdWVzIGFyZTogY2FydF9uYW1lLGNyZWF0ZV9kYXRlLG1vZGlmaWVkX2RhdGUsZmlyc3RfbmFtZSxsYXN0X25hbWUsYWRkcmVzczEsYWRkcmVzczIsY2l0eSxzdGF0ZSxjb3VudHJ5JzsKJGxhbmdbJ2hlbHBfc29ydG9yZGVyJ10gPSAnQXBwbGljYWJsZSBvbmx5IHRvIHRoZSBteWNhcnRzbGlzdCBhY3Rpb24sIHRoaXMgcGFyYW1ldGVyIGFsbG93cyBzcGVjaWZ5aW5nIGEgZGlmZmVyZW50IHNvcnRpbmcgb3JkZXIuICBQb3NzaWJsZSB2YWx1ZXMgYXNjLGRlc2MnOwokbGFuZ1snaGVscF92aWV3Y2FydHBhZ2UnXSA9ICdTcGVjaWZ5IGEgZGVzdGluYXRpb24gcGFnZSBmb3IgdGhlIFwndmlld2NhcnRcJyBtb2RlLic7CiRsYW5nWydoZWxwX3ZpZXdjYXJ0dGVtcGxhdGUnXSA9ICdTcGVjaWZpZXMgYSBub24gZGVmYXVsdCB0ZW1wbGF0ZSB0byB1c2UgZm9yIHRoZSBcJ3ZpZXdjYXJ0XCcgbW9kZS4nOwoKIyBJCiRsYW5nWydpbmZvX2FkZHRvY2FydF90ZW1wbGF0ZXMnXSA9ICdUaGVzZSB0ZW1wbGF0ZXMgYXJlIHVzZWQgZm9yIHRoZSBkZWZhdWx0IGFjdGlvbiBvZiB0aGlzIG1vZHVsZSB3aGljaCBhbGxvd3MgY3JlYXRpbmcgbmV3IGNhcnRzLCBhbmQgYWRkaW5nIGEgcHJvZHVjdCBmcm9tIHRoZSBjYXJ0IG1vZHVsZSB0byBhIHNlbGVjdGVkIGNhcnQnOwokbGFuZ1snaW5mb19lZGl0c2hpcHBpbmdfdGVtcGxhdGVzJ10gPSAnVGhlc2UgdGVtcGxhdGVzIGFyZSB1c2VkIHRvIHByb3ZpZGUgYSBmb3JtIGZvciBlZGl0aW5nIHRoZSBzaGlwcGluZyBpbmZvcm1hdGlvbiBmb3Igb25lIG9mIHlvdXIgY2FydHMnOwokbGFuZ1snaW5mb19teWNhcnRmb3JtX3RlbXBsYXRlcyddID0gJ1RoZXNlIHRlbXBsYXRlcyBhcmUgdXNlZCB0byB2aWV3IGEgcXVpY2sgc3VtbWFyeSBvZiB0aGUgdG90YWwgb2YgeW91ciBjYXJ0LCBhbmQgdGhlIG51bWJlciBvZiBpdGVtcywgYWxvbmcgd2l0aCBhIGJ1dHRvbiB0byBhbGxvdyB5b3UgdG8gcmVkaXJlY3QgdG8gdGhlIHZpZXcgY2FydCBmb3JtIGFuZCB0byBjaGVja291dC4nOwokbGFuZ1snaW5mb19teWNhcnRzbGlzdF90ZW1wbGF0ZXMnXSA9ICdUaGVzZSB0ZW1wbGF0ZXMgYXJlIHVzZWQgdG8gdmlldyBhIGxpc3Qgb2YgeW91ciBjYXJ0cyB3aXRoIGEgcXVpY2sgc3VtbWFyeSBvZiB0aGUgaW5mb3JtYXRpb24gaW4gdGhlbSwgYW5kIGEgbGluayB0aGF0IHdpbGwgYWxsb3cgZWRpdGluZyB0aGUgaW5mb3JtYXRpb24gaW4gYSBzcGVjaWZpYyBjYXJ0LCBhbmQvb3IgdGhlIHNoaXBwaW5nIGluZm9ybWF0aW9uIGZvciBlYWNoIGNhcnQuJzsKJGxhbmdbJ2luZm9fcHJvZHVjdHN1bW1hcnl0ZW1wbGF0ZSddID0gJ1RoaXMgdGVtcGxhdGUgaXMgdXNlZCB0byBmb3JtYXQgdGhlIG91dHB1dCB1c2VkIGZvciBlYWNoIHByb2R1Y3Qgc3VtbWFyeSBpbiB0aGUgdmlldyBjYXJ0IGZvcm0uICBJdCBhbGxvd3MgY3VzdG9taXppbmcgdGhlIHByb2R1Y3QgbGFiZWwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMsIHByb2R1Y3QgbmFtZSwgYW5kIHByaWNlLic7CiRsYW5nWydpbmZvX3ZpZXdjYXJ0Zm9ybV90ZW1wbGF0ZSddID0gJ1RoZXNlIHRlbXBsYXRlcyBhcmUgdXNlZCB0byBkaXNwbGF5IGEgZm9ybSBhYm91dCBvbmUgc3BlY2lmaWMgY2FydCBzbyB0aGF0IGF1dGhvcml6ZWQgcGVvcGxlIGNhbiBlZGl0IHRoZSBjb250ZW50cyBvZiBvbmUgb2YgdGhlaXIgY2FydHMuJzsKCiMgTAokbGFuZ1snbGFzdF9uYW1lJ10gPSAnTGFzdCBOYW1lJzsKCiMgTQokbGFuZ1snbWVzc2FnZSddID0gJ01lc3NhZ2UnOwokbGFuZ1snbW9kZGVzY3JpcHRpb24nXSA9ICdBbiBhZHZhbmNlZCBjYXJ0IG1vZHVsZSB0aGF0IHN1cHBvcnRzIG11bHRpcGxlIGdpZnQgYmFza2V0cywgYW5kIG11dGxpcGxlIHNoaXBwaW5nIGFkZHJlc3Nlcy4nOwokbGFuZ1snbXljYXJ0Zm9ybV90ZW1wbGF0ZXMnXSA9ICdNeUNhcnQgRm9ybSBUZW1wbGF0ZXMnOwokbGFuZ1snbXljYXJ0c2xpc3RfdGVtcGxhdGVzJ10gPSAnTXkgQ2FydHMgTGlzdCBUZW1wbGF0ZXMnOwokbGFuZ1snbXlzZWxmJ10gPSAnTXlzZWxmJzsKJGxhbmdbJ215X2NhcnQnXSA9ICdNeSBDYXJ0JzsKCiMgTgokbGFuZ1snbm9uZSddID0gJ05vbmUnOwokbGFuZ1snbm90X2VudGVyZWQnXSA9ICdOb3QgRW50ZXJlZCc7CiRsYW5nWydudW1iZXInXSA9ICdOdW1iZXInOwokbGFuZ1snbnVtYmVyX29mX2l0ZW1zJ10gPSAnTnVtYmVyIG9mIGl0ZW1zJzsKCiMgUAokbGFuZ1sncGhvbmUnXSA9ICdQaG9uZSc7CiRsYW5nWydwb3N0YWwnXSA9ICdQb3N0YWwvWmlwIENvZGUnOwokbGFuZ1sncG9zdGluc3RhbGwnXSA9ICdUaGUgR2lmdEJhc2tldHMgbW9kdWxlIGhhcyBzdWNjZXNzZnVsbHkgYmVlbiBpbnN0YWxsZWQnOwokbGFuZ1sncG9zdHVuaW5zdGFsbCddID0gJ1RoZSBHaWZ0QmFza2V0cyBtb2R1bGUgaGFzIGJlZW4gcmVtb3ZlZC4gIEFsbCBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG1vZHVsZSBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIGRhdGFiYXNlLic7CiRsYW5nWydwcmVmZXJlbmNlcyddID0gJ1ByZWZlcmVuY2VzJzsKJGxhbmdbJ3ByaWNlJ10gPSAnUHJpY2UnOwokbGFuZ1sncHJvZHVjdF9pZCddID0gJ1Byb2R1Y3QgSUQnOwokbGFuZ1sncHJvZHVjdHN1bW1hcnlfdGVtcGxhdGUnXSA9ICdQcm9kdWN0IFN1bW1hcnkgVGVtcGxhdGUnOwoKIyBRCiRsYW5nWydxdWFudGl0eSddID0gJ1F1YW50aXR5JzsKCiMgUgokbGFuZ1sncmVhbGx5X3VuaW5zdGFsbCddID0gJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byByZW1vdmUgdGhpcyBtb2R1bGU/IENvbnRpbnVpbmcgd2l0aCB0aGlzIG9wZXJhdGlvbiB3aWxsIHBlcm1hbmVudGx5IHJlbW92ZSBhbGwgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhpcyBtb2R1bGUuJzsKJGxhbmdbJ3JlbW92ZSddID0gJ1JlbW92ZSc7CgojIFMKJGxhbmdbJ3NlbGVjdF9vbmUnXSA9ICdTZWxlY3QgT25lJzsKJGxhbmdbJ3NlbGVjdF9yZWNpcGllbnQnXSA9ICdTZWxlY3QgYSBSZWNpcGllbnQnOwokbGFuZ1snc2hpcHBpbmdfaW5mbyddID0gJ1NoaXBwaW5nIEluZm8nOwokbGFuZ1snc3VibWl0J10gPSAnU3VibWl0JzsKJGxhbmdbJ3N1YnRvdGFsJ10gPSAnU3VidG90YWwnOwokbGFuZ1snc2hpcHBpbmcnXSA9ICdTaGlwcGluZyc7CiRsYW5nWydzaGlwcGluZ19tb2R1bGUnXSA9ICdTaGlwcGluZyBNb2R1bGUnOwokbGFuZ1snc3RhdGUnXSA9ICdTdGF0ZS9Qcm92aW5jZSc7CiRsYW5nWydzdW1tYXJ5J10gPSAnU3VtbWFyeSc7CgojIFQKJGxhbmdbJ3RheGVzJ10gPSAnVGF4ZXMnOwokbGFuZ1sndG90YWwnXSA9ICdUb3RhbCc7CiRsYW5nWyd0b3RhbF93ZWlnaHQnXSA9ICdUb3RhbCBXZWlnaHQnOwoKIyBVCiRsYW5nWyd1bml0X3ByaWNlJ10gPSAnVW5pdCBQcmljZSc7CgojIFYKJGxhbmdbJ3ZpZXdjYXJ0Zm9ybV90ZW1wbGF0ZXMnXSA9ICdWaWV3Y2FydCBGb3JtIFRlbXBsYXRlcyc7CgojIFcKJGxhbmdbJ3dhcm5fZGVmYXVsdF90ZW1wbGF0ZXMnXSA9ICdUaGlzIGZvcm0gY29udHJvbHMgd2hhdCBpcyBkaXNwbGF5ZWQgaW5pdGlhbGx5IHdoZW4geW91IGNsaWNrIFwnQWRkIE5ldyBUZW1wbGF0ZVwnIGluIHRoZSBhcHByb3ByaWF0ZSB0YWIuICBBZGp1c3RpbmcgdGhlIGNvbnRlbnRzIGluIHRoaXMgZWRpdCBhcmVhIHdpbGwgaGF2ZSBubyBpbW1lZGljYXRlIGVmZmVjdCBvbiB5b3VyIHdlYnNpdGUuJzsKJGxhbmdbJ3dlaWdodCddID0gJ1dlaWdodCc7Cj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/lang/ext/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lang/ext/nb_NO.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2FkZCddID0gJ0xhZ2cgdGlsJzsKJGxhbmdbJ2FkZGVkaXRfYWRkdG9jYXJ0X3RlbXBsYXRlJ10gPSAnTGVnZyB0aWwvcmVkaWdlciBMZWdnSUhhbmRsZWt1cnYgbWFsJzsKJGxhbmdbJ2FkZGVkaXRfZWRpdHNoaXBwaW5nX3RlbXBsYXRlJ10gPSAnTGVnZyB0aWwvcmVkaWdlciBmb3JzZW5kZWxzZSBtYWwnOwokbGFuZ1snYWRkZWRpdF9teWNhcnRmb3JtX3RlbXBsYXRlJ10gPSAnTGVnZyB0aWwvcmVkaWdlciBNaW5IYW5kbGVrdXJ2IHNramVtYW1hbCc7CiRsYW5nWydhZGRlZGl0X215Y2FydHNsaXN0X3RlbXBsYXRlJ10gPSAnTGVnZyB0aWwvcmVkaWdlciBNaW5IYW5kbGVrdXJ2IGxpc3RlbWFsJzsKJGxhbmdbJ2FkZGVkaXRfdmlld2NhcnRmb3JtX3RlbXBsYXRlJ10gPSAnTGVnZyB0aWwvcmVkaWdlciBWaXMtaGFuZGxla3VydiBza2plbWFtYWwnOwokbGFuZ1snYWRkcmVzczEnXSA9ICdBZHJlc3NlbGluamUgMSc7CiRsYW5nWydhZGRyZXNzMiddID0gJ0FkcmVzc2VsaW5qZSAyJzsKJGxhbmdbJ2FkZHRvY2FydF9kZXN0cGFnZSddID0gJ1NpZGUgJmFyaW5nOyB2aWRlcmVzZW5kZSB0aWwgZXR0ZXIgYXQgZW4gaGFyIGxhZ3QgdGlsIG5vZSBpIGhhbmRsZWt1cnZlbic7CiRsYW5nWydhZGR0b2NhcnRfdGVtcGxhdGVzJ10gPSAnTGVnZ0lIYW5kbGVrdXJ2IG1hbGVyJzsKJGxhbmdbJ2FkZF9uZXdfYmFza2V0J10gPSAnTGVnZyB0aWwgbnkgaGFuZGxla3Vydic7CiRsYW5nWydhZGRfdG9fYWxsX2NhcnRzJ10gPSAnTGVnZyB0aWwgQWxsZSBoYW5kbGVrdXJ2ZXInOwokbGFuZ1snYWRkX3RvX2NhcnQnXSA9ICdMZWdnIGkgZGVubmUgaGFuZGxla3VydmVuJzsKJGxhbmdbJ2Ftb3VudCddID0gJ01lbmdkZSc7CiRsYW5nWydjYW5jZWwnXSA9ICdBdmJyeXQnOwokbGFuZ1snY2FydF9lbXB0eSddID0gJ0Rlbm5lIGhhbmRsZWt1cnZlbiBlciB0b20nOwokbGFuZ1snY2FydF9uYW1lJ10gPSAnSGFuZGxla3VydiBuYXZuJzsKJGxhbmdbJ2NoYW5nZWxvZyddID0gJzx1bD4NCiAgPGxpPlZlcnNpb24gMS4wIC0gRGVjZW1iZXIgMjAwODxici8+DQogICAgICBJbml0aWFsIFJlbGVhc2UNCiAgPC9saT4NCjwvdWw+JzsKJGxhbmdbJ2NpdHknXSA9ICdCeSc7CiRsYW5nWydjb25maXJtX2RlbGV0ZSddID0gJ0VyIGR1IHNpa2tlciBwJmFyaW5nOyBkdSB2aWwgc2xldHRlIGRlbm5lIGhhbmRsZWt1cnZlbic7CiRsYW5nWydjb3VudHJ5J10gPSAnTGFuZCc7CiRsYW5nWydkZWZhdWx0X2FkZHRvY2FydF90ZW1wbGF0ZSddID0gJ1N0YW5kYXJkIExlZ2dJSGFuZGxla3VydiBtYWwnOwokbGFuZ1snZGVmYXVsdF9teWNhcnRmb3JtX3RlbXBsYXRlJ10gPSAnU3RhbmRhcmQgTWluSGFuZGxla3VydiBza2plbWFtYWwnOwokbGFuZ1snZGVmYXVsdF9teWNhcnRzbGlzdF90ZW1wbGF0ZSddID0gJ1N0YW5kYXJkIE1pbmUgaGFuZGxla3VydmVyIGxpc3RlbWFsZSc7CiRsYW5nWydkZWZhdWx0X2VkaXRzaGlwcGluZ190ZW1wbGF0ZSddID0gJ1N0YW5kYXJkIHJlZGlnZXIgZm9yc2VuZGVsc2Ugc2tqZW1hbWFsJzsKJGxhbmdbJ2RlZmF1bHRfdmlld2NhcnRmb3JtX3RlbXBsYXRlJ10gPSAnU3RhbmRhcmQgVmlzSGFuZGxla3VydiBza2plbWFtYWwnOwokbGFuZ1snZGVmYXVsdF90ZW1wbGF0ZXMnXSA9ICdTdGFuZGFyZCBtYWxlcic7CiRsYW5nWydkZWxldGUnXSA9ICdTbGV0dCc7CiRsYW5nWydkZXNjcmlwdGlvbiddID0gJ0Jlc2tyaXZlbHNlJzsKJGxhbmdbJ2VkaXQnXSA9ICdSZWRpZ2VyJzsKJGxhbmdbJ2VkaXRzaGlwcGluZ190ZW1wbGF0ZXMnXSA9ICdSZWRpZ2VyIEZvcnNlbmRlbHNlIHNramVtYW1hbGVyJzsKJGxhbmdbJ2VkaXRfc2hpcHBpbmcnXSA9ICdSZWRpZ2VyIGZvcnNlbmRlbHNlaW5mb3JtYXNqb24nOwokbGFuZ1snZWRpdF9zaGlwcGluZ19mb3JfY2FydCddID0gJ1JlZGlnZXIgZm9yc2VuZGVsc2VpbmZvcm1hc2pvbiBmb3IgaGFuZGxla3VydiAmYW1wO3F1b3Q7JXMmYW1wO3F1b3Q7JzsKJGxhbmdbJ2VtYWlsJ10gPSAnRXBvc3QnOwokbGFuZ1snZXJyb3JfY2FydGV4aXN0cyddID0gJ0VuIGhhbmRsZWt1cnYgbWVkIGRlbiBuYXZuIGVrc2lzdGVyZXIgYWxsZXJlZGUnOwokbGFuZ1snZXJyb3JfaW52YWxpZHBhcmFtJ10gPSAnRW4gb3BwZ2l0dCBwYXJhbWV0ZXIgaGFyIGVuIHVneWxkaWcgdmVyZGk6ICVzJzsKJGxhbmdbJ2Vycm9yX21pc3NpbmdwYXJhbSddID0gJ0VuIG4mb3NsYXNoO2R2ZW5kaWcgcGFyYW1ldGVyIG1hbmdsZXI6ICVzJzsKJGxhbmdbJ2Vycm9yX25vY2FydHNkZWZpbmVkJ10gPSAnRGV0IHNlciBpa2tlIHV0IHNvbSBkdSBoYXIgZGVmaW5lcnQgbm9lbiBoYW5kbGVrdXJ2ZXInOwokbGFuZ1snZXJyb3Jfbm90bG9nZ2VkaW4nXSA9ICdEdSBtJmFyaW5nOyB2JmFlbGlnO3JlIGVuIHJlZ2lzdHJlcnQgLCBpbm5sb2dnZXQgYnJ1a2VyIGZvciAmYXJpbmc7IGJlbnl0dGUgZGVubmUgZWdlbnNrYXBlbic7CiRsYW5nWydlcnJvcl9ub3N1Y2hwcm9kdWN0J10gPSAnS3VubmUgaWtrZSBmaW5uZSBpbmZvcm1hc2pvbiBmb3IgcHJvZHVrdGV0OiAlcyc7CiRsYW5nWydlcnJvcl9ub3N1Y2hjYXJ0J10gPSAnRGVuIG9wcGdpdHRlIGhhbmRsZWt1cnZlbiBibGUgaWtrZSBmdW5uZXQnOwokbGFuZ1snZXJyb3Jfc2V0YmFza2V0ZGF0YSddID0gJ1Byb2JsZW0gbWVkICZhcmluZzsgc2V0dGUgaGFuZGxla3VydmRhdGEnOwokbGFuZ1snZmF4J10gPSAnRmFrcyc7CiRsYW5nWydmaXJzdF9uYW1lJ10gPSAnRm9ybmF2bic7CiRsYW5nWydmcmllbmRseW5hbWUnXSA9ICdHaWZ0QmFza2V0cyBDYXJ0IHZlcmt0Jm9zbGFzaDt5JzsKJGxhbmdbJ2dyYW5kX3RvdGFsJ10gPSAnVG90YWxzdW0nOwokbGFuZ1snaGVscCddID0gJzxoMz5XaGF0IGRvZXMgaXQgZG8/PC9oMz4NCjxwPlRoaXMgbW9kdWxlIGFsbG93cyBhbiBhdXRob3JpemVkIGFuZCBsb2dnZWQgaW4gZnJvbnRlbmQgdXNlciB0byBtYW5hZ2UgbXVsdGlwbGUgYmFza2V0cywgd2l0aCBkaWZmZXJlbnQgc2hpcHBpbmcgbG9jYXRpb25zLCBhbmQgdG8gYWRkIHByb2R1Y3RzIGZyb20gdGhlIFByb2R1Y3RzIG1vZHVsZSBpbnRvIGFueSBvbmUgb2YgdGhpZXIgYmFza2V0cy48L3A+DQo8cD5WaWV3cyBhbmQgZm9ybXMgYXJlIGFsc28gcHJvdmlkZWQgdG8gYWxsb3cgdGhlIGF1dGhvcml6ZWQgZnJvbnRlbmQgdXNlciB0byBtYW5hZ2UgaGlzIGJhc2tldHMsIGFuZCB0aGUgY29udGVudHMgb2YgdGhlbS48L3A+DQo8aDM+SG93IERvIEkgdXNlIEl0PC9oMz4NCiAgPHA+VGhpcyBtb2R1bGUgcHJvdmlkZXMgbWFueSBmb3JtcyBhbmQgcmVwb3J0cywgYW5kIGhhcyBjb25zaWRlcmFibGUgZnVuY3Rpb25hbGl0eS4gIEJ1dCBpbiB0aGUgc2ltcGxlc3Qgc2Vuc2UsIGp1c3Qgc2VsZWN0IHRoaXMgbW9kdWxlIGFzIHlvdXIgQ2FydCBtb2R1bGUgaW4gdGhlIHByZWZlcmVuY2VzIHRhYiBvZiB0aGUgJnF1b3Q7UHJvZHVjdCBNYW5hZ2VyJnF1b3Q7IGFkbWluIHBhbmVsLiAgVGhpcyB3aWxsIGRpc3BsYXkgYSBmb3JtIG9uIGFsbCBwcm9kdWN0IGRldGFpbCBwYWdlcyB0byBhbGxvdyB0aGUgY3VycmVudCBwcm9kdWN0IHRvIGJlIGFkZGVkIHRvIGEgdXNlciBzZWxlY3RlZCBjYXJ0LCBhbmQgd2lsbCAoZ2l2ZW4gdGhlIGRlZmF1bHQgdGVtcGxhdGVzKSBhbGxvdyBjcmVhdGluZyBvZiBudW1lcm91cyBjYXJ0cy48L3A+DQo8cD5UbyBjcmVhdGUgYSBzdW1tYXJ5IG9mIGFsbCBjYXJ0cywgeW91IGNhbiB1c2UgYSB0YWcgbGlrZSB7R2lmdEJhc2tldHMgYWN0aW9uPSYjMDM5O215Y2FydCYjMDM5O308L3A+DQo8cD5UbyBjcmVhdGUgYSByZXBvcnQgb2YgYWxsIGNhcnRzLCBhbmQgdG8gYWxsb3cgbWFuYWdpbmcgdGhlaXIgY29udGVudHMsIHlvdSBjYW4gdXNlIGEgdGFnIGxpa2Uge0dpZnRCYXNrZXRzIGFjdGlvbj0mIzAzOTtteWNhcnRzbGlzdCYjMDM5O308L3A+JzsKJGxhbmdbJ2hlbHBfYWN0aW9uJ10gPSAnU3BlY2lmaWVzIHRoZSBiZWhhdmlvdXIgb2YgdGhlIG1vZHVsZS4gIFBvc3NpYmxlIHZhbHVlcyBhcmUgJiMwMzk7ZGVmYXVsdCYjMDM5OywmIzAzOTtteWNhcnQmIzAzOTssIGFuZCAmIzAzOTt2aWV3Y2FydCYjMDM5Oy48YnIvPjx1bD48bGk+ZGVmYXVsdDogZGlzcGxheXMgYSBmb3JtIHdpdGggYW4gJiMwMzk7YWRkIHRvIGNhcnQmIzAzOTsgYnV0dG9uIHRvIGFsbG93IGFkZGluZyBhIHNwZWNpZmljIHByb2R1Y3QgdG8gdGhlIGNhcnQuICBUaGlzIG1vZGUgcmVxdWlyZXMgdGhlICYjMDM5O3Byb2R1Y3QmIzAzOTsgcGFyYW1ldGVyIGJlIHN1cHBsaWVkLjwvbGk+PGxpPm15Y2FydDogRGlzcGxheXMgYSBmb3JtIHRoYXQgZGlzcGxheXMgdGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgY2FydCwgYW5kIGEgJiMwMzk7Y2hlY2tvdXQmIzAzOTsgYnV0dG9uLjwvbGk+PGxpPnZpZXdjYXJ0OiBEaXNwbGF5cyBhIGRldGFpbGVkIGZvcm0gb2YgdGhlIGNvbnRlbnRzIG9mIHRoZSBjYXJ0LCBpbmNsdWRpbmcgYSBjdXJyZW50IHRvdGFsLCBhbmQgYWxsb3dzIGRlbGV0aW5nIGl0ZW1zIGZyb20gdGhlIGNhcnQuPC9saT48L3VsPic7CiRsYW5nWydoZWxwX2FkZHRvY2FydHRlbXBsYXRlJ10gPSAnU3Blc2lmaXNlcmVyIGVuIGlra2Ugc3RhbmRhcmQgbWFsICZhcmluZzsgYmxpIGJlbnl0dGV0IGkgJiMwMzk7YWRkdG9jYXJ0JiMwMzk7IG1vZHVzLic7CiRsYW5nWydoZWxwX2VkaXRzaGlwcGluZ3RlbXBsYXRlJ10gPSAnU3Blc2lmaXNlcmVyIGVuIGlra2Ugc3RhbmRhcmQgbWFsICZhcmluZzsgYmxpIGJlbnl0dGV0IGkgJiMwMzk7ZWRpdHNoaXBwaW5nJiMwMzk7IGhhbmRsaW5nZW4uJzsKJGxhbmdbJ2hlbHBfaGlkZWZvcm0nXSA9ICdLdW4gZ3lsZGlnIGZvciAmIzAzOTt2aWV3Y2FydCYjMDM5OyBoYW5kbGluZ2VuLiBEZXR0ZSBmbGFnZyBpbmRpa2VyZXIgb20gdmlzaGFuZGxla3VydiBza2plbWFldCBza2FsIHZpc2VzJzsKJGxhbmdbJ2hlbHBfbXljYXJ0c2xpc3R0ZW1wbGF0ZSddID0gJ1NwZXNpZmlzZXJlciBlbiBpa2tlIHN0YW5kYXJkIG1hbCAmYXJpbmc7IGJsaSBiZW55dHRldCBpICYjMDM5O215Y2FydGxpc3QmIzAzOTsgbW9kdXMuJzsKJGxhbmdbJ2hlbHBfbXljYXJ0dGVtcGxhdGUnXSA9ICdTcGVzaWZpc2VyZXIgZW4gbWFsIChzb20gaWtrZSBlciBzdGFuZGFyZCkgJmFyaW5nOyBiZW55dHRlIGZvciAmIzAzOTtteWNhcnQmIzAzOTsgbW9kdXMuJzsKJGxhbmdbJ2hlbHBfcHJvZHVjdCddID0gJ0t1biBneWxkaWcgZm9yIHN0YW5kYXJkIGhhbmRsaW5nZW4uIERlbm5lIHBhcmFtZXRlciBzcGVzaWZpc2VyZXIgaHZpbGtldCBwcm9kdWt0IChldHRlciBJRCkgc29tIHNrYWwgbGVnZ2VyIGkgaGFuZGxla3VydmVuLiBUeXBpc2ssIGkgcHJvZHVrdGRldGFsam1hbGVuIGZvciBwcm9kdWN0cyBtb2R1bGVuLCBrYW4gZHUgbGVnZ2UgaW5uIHtDYXJ0IHByb2R1Y3Q9JGVudHJ5LT5pZH0gZm9yICZhcmluZzsgdGlsbGF0ZSAmYXJpbmc7IGxlZ2dlIGVuaGV0ZXIgdGlsIGhhbmRsZWt1cnZlbiBmcmEgcHJvZHVrdGRldGFsanNpZGVyLic7CiRsYW5nWydoZWxwX3NvcnRieSddID0gJ0t1biBneWxkaWcgZm9yIG15Y2FydHNsaXN0IGhhbmRsaW5nZW4uIGRlbm5lIHBhcmFtZXd0ZXIgdGlsbGF0ZXIgJmFyaW5nOyBzcGVzaWZpc2VyZSBldCBhbm5ldCBzb3J0ZXJpbmdzZmVsdC4gTXVsaWdlIHZlcmRpZXIgZXI6IGNhcnRfbmFtZSxjcmVhdGVfZGF0ZSxtb2RpZmllZF9kYXRlLGZpcnN0X25hbWUsbGFzdF9uYW1lLGFkZHJlc3MxLGFkZHJlc3MyLGNpdHksc3RhdGUsY291bnRyeSc7CiRsYW5nWydoZWxwX3NvcnRvcmRlciddID0gJ0t1biBneWxkaWcgZm9yIG15Y2FydHNsaXN0IGhhbmRsaW5nZW4uIGRlbm5lIHBhcmFtZXRlciB0aWxsYXRlciAmYXJpbmc7IGVuZHJlIHJldG5pbmdlbiBwJmFyaW5nOyBzb3J0ZXJpbmdlbi4gTXVsaWdlIHZlcmRpZXIgZXI6IGFzYyxkZXNjJzsKJGxhbmdbJ2hlbHBfdmlld2NhcnRwYWdlJ10gPSAnU3Blc2lmaXNlciBlbiBtJmFyaW5nO2xzaWRlIGZvciAmIzAzOTt2aWV3Y2FydCYjMDM5OyBtb2R1c2VuLic7CiRsYW5nWydoZWxwX3ZpZXdjYXJ0dGVtcGxhdGUnXSA9ICdTcGVzaWZpc2VyIGVuIGlra2Ugc3RhbmRhcmQgbWFsICZhcmluZzsgYmVueXR0ZSBpICYjMDM5O3ZpZXdjYXJ0JiMwMzk7IG1vZHVzLic7CiRsYW5nWydpbmZvX2FkZHRvY2FydF90ZW1wbGF0ZXMnXSA9ICdEaXNzZSBtYWxlbmUgYmVueXR0ZXMgZm9yIHN0YW5kYXJkIGhhbmRsaW5nZW4gZm9yIGRlbm5lIG1vZHVsZW4gc29tIHRpbGxhdGVyICZhcmluZzsgb3BwcmV0dGUgbnllIGhhbmRsZWt1cnZlciBvZyAmYXJpbmc7IGxlZ2dlIGV0IHByb2R1a3QgZnJhIGNhcnQgbW9kdWxlbiB0aWwgZGVuIHZhbGd0ZSBoYW5kbGVrdXJ2ZW4nOwokbGFuZ1snaW5mb19lZGl0c2hpcHBpbmdfdGVtcGxhdGVzJ10gPSAnRGlzc2UgbWFsZW5lIGJlbnl0dGVzIGZvciAmYXJpbmc7IHRpbGJ5IGV0IHNramVtYSBmb3IgJmFyaW5nOyByZWRpZ2VyZSBmb3JzZW5kZWxzZXNpbmZvcm1hc2pvbmVuIGZvciBlbiBhdiBkaW5lIGhhbmRsZWt1cnZlcic7CiRsYW5nWydpbmZvX215Y2FydGZvcm1fdGVtcGxhdGVzJ10gPSAnRGlzc2UgbWFsZW5lIGJlbnl0dGVzIGZvciAmYXJpbmc7IHZpc2UgZXQgcmFza3Qgc2FtbWVuZHJhZyBhdiB0b3RhbGVuIGkgZGluIGhhbmRsZWt1cnYsIGFudGFsbCBhcnRpa2xlciwgc2FtbWVuIG1lZCBlbiBrbmFwcCBzb20gdGlsbGF0ZXIgZGVnICZhcmluZzsgdmlkZXJlc2VuZGUgdGlsIFZpc0hhbmRsZWt1cnYgc2tqZW1hZXQgb2cgZyZhcmluZzsgdGlsIGthc3Nlbi4nOwokbGFuZ1snaW5mb19teWNhcnRzbGlzdF90ZW1wbGF0ZXMnXSA9ICdEaXNzZSBtYWxlbmUgYmVueXR0ZXMgZm9yICZhcmluZzsgdmlzZSBlbiBsaXN0ZSBtZWQgZGluZSBoYW5kbGVrdXJ2ZXIgbWVkIGV0IHJhc2t0IHNhbW1lbmRyYWcgYXYgaW5mb3JtYXNqb25lbiBpIGRlbSwgb2cgZW4gbGVua2Ugc29tIHZpbCB0aWxsYXRlIHJlZGlnZXJpbmcgYXYgaW5mb3JtYXNqb25lbiBpIGVuIGVua2VsdCBoYW5kbGVrdXJ2IC0gb2cvZWxsZXIgZm9yc2VuZGVsc2VpbmZvcm1hc2pvbmVuIGZvciBodmVyIGhhbmRsZWt1cnYuJzsKJGxhbmdbJ2luZm9fcHJvZHVjdHN1bW1hcnl0ZW1wbGF0ZSddID0gJ0Rlbm5lIG1hbGVuIGJlbnl0dGVzIGZvciAmYXJpbmc7IGZvcm1hdGVyZSB2aXNuaW5nZW4gc29tIGJlbnl0dGVzIGZvciBodmVydCBwcm9kdWt0c2FtbWVuZHJhZyBpIHZpcy1oYW5kbGVrdXJ2IHNramVtYWV0LiBEZW4gdGlsbGF0ZXIgJmFyaW5nOyB0aWxwYXNzZSBwcm9kdWt0ZXRpa2V0dGVuIGJhc2VydCBwJmFyaW5nOyBhdHRyaWJ1dHRlbmUuIHByb2R1a3RuYXZuZXQgb2cgcHJpc2VuLic7CiRsYW5nWydpbmZvX3ZpZXdjYXJ0Zm9ybV90ZW1wbGF0ZSddID0gJ0Rpc3NlIG1hbGVuZSBlciBiZW55dHRldCB0aWwgJmFyaW5nOyB2aXNlIGV0IHNramVtYSBtZWQgZW4gc3Blc2lmaXNlcnQgaGFuZGxla3VydiBzJmFyaW5nOyBhdXRvcmlzZXJ0ZSBwZXJzb25lciBrYW4gcmVkaWdlcmUgaW5uaG9sZGV0IGkgZW4gYXYgc2luZSBoYW5kbGVrdXJ2ZXIuJzsKJGxhbmdbJ2xhc3RfbmFtZSddID0gJ0V0dGVybmF2bic7CiRsYW5nWydtZXNzYWdlJ10gPSAnTWVsZGluZyc7CiRsYW5nWydtb2RkZXNjcmlwdGlvbiddID0gJ0VuIGF2YW5zZXJ0IGhhbmRsZWt1cnYgbW9kdWwgc29tIHN0Jm9zbGFzaDt0dGVyIGZsZXJlIGdhdmUtaGFuZGxla3VydmVyLCBvZyBmbGVyZSBmb3JzZW5kZWxzZXNhZHJlc3Nlci4nOwokbGFuZ1snbXljYXJ0Zm9ybV90ZW1wbGF0ZXMnXSA9ICdNaW5IYW5kbGVrdXJ2IHNramVtYW1hbGVyJzsKJGxhbmdbJ215Y2FydHNsaXN0X3RlbXBsYXRlcyddID0gJ01pbkhhbmRsZWt1cnYgbGlzdGVtYWxlcic7CiRsYW5nWydteXNlbGYnXSA9ICdNZWcgc2Vsdic7CiRsYW5nWydteV9jYXJ0J10gPSAnTWluIEhhbmRsZWt1cnYnOwokbGFuZ1snbm9uZSddID0gJ0luZ2VuJzsKJGxhbmdbJ25vdF9lbnRlcmVkJ10gPSAnSWtrZSBvcHBnaXR0JzsKJGxhbmdbJ251bWJlciddID0gJ0FudGFsbCc7CiRsYW5nWydudW1iZXJfb2ZfaXRlbXMnXSA9ICdBbnRhbGwgcHJvZHVrdGVyJzsKJGxhbmdbJ3Bob25lJ10gPSAnVGVsZWZvbic7CiRsYW5nWydwb3N0YWwnXSA9ICdQb3N0bnVtbWVyJzsKJGxhbmdbJ3Bvc3RpbnN0YWxsJ10gPSAnR2lmdEJhc2tldCBtb2RsZW4gYmxlIGluc3RhbGxlcnQnOwokbGFuZ1sncG9zdHVuaW5zdGFsbCddID0gJ0dpZnRCYXNrZXRzIG1vZHVsZW4gaGFyIGJsaXR0IGZqZXJuZXQuIEFsbCBkYXRhIGFzc29zaWVydCBtZWQgZGVubmUgbW9kdWxlbiBoYXIgYmxpdHQgZmplcm5ldCBmcmEgZGF0YWJhc2VuLic7CiRsYW5nWydwcmVmZXJlbmNlcyddID0gJ0lubnN0aWxsaW5nZXInOwokbGFuZ1sncHJpY2UnXSA9ICdQcmlzJzsKJGxhbmdbJ3Byb2R1Y3RfaWQnXSA9ICdQcm9kdWt0SUQnOwokbGFuZ1sncHJvZHVjdHN1bW1hcnlfdGVtcGxhdGUnXSA9ICdQcm9kdWt0c2FtbWVuZHJhZ3NtYWwnOwokbGFuZ1sncXVhbnRpdHknXSA9ICdNZW5nZGUnOwokbGFuZ1sncmVhbGx5X3VuaW5zdGFsbCddID0gJ0VyIGR1IHNpa2tlciBwJmFyaW5nOyBhdCBkdSB2aWwgZmplcm5lIGRlbm5lIG1vZHVsZW4/ICZBcmluZzsgZm9ydHNldHRlIGRlbm5lIGhhbmRsaW5nZW4gdmlsIHBlcm1hbmVudCBmamVybmUgYWxsIGRhdGEgYXNzb3NpZXJ0IG1lZCBkZW5uZSBtb2R1bGVuLic7CiRsYW5nWydyZW1vdmUnXSA9ICdGamVybic7CiRsYW5nWydzZWxlY3Rfb25lJ10gPSAnVmVsZyBlbic7CiRsYW5nWydzZWxlY3RfcmVjaXBpZW50J10gPSAnVmVsZyBlbiBtb3R0YWtlcic7CiRsYW5nWydzaGlwcGluZ19pbmZvJ10gPSAnRm9yc2VuZGVsc2VzaW5mbyc7CiRsYW5nWydzdWJtaXQnXSA9ICdVdGYmb3NsYXNoO3InOwokbGFuZ1snc3VidG90YWwnXSA9ICdTdWJ0b3RhbCAnOwokbGFuZ1snc2hpcHBpbmcnXSA9ICdGb3JzZW5kZWxzZSc7CiRsYW5nWydzaGlwcGluZ19tb2R1bGUnXSA9ICdTaGlwcGluZyBtb2R1bCc7CiRsYW5nWydzdGF0ZSddID0gJ1N0YXQvUHJvdmlucyc7CiRsYW5nWydzdW1tYXJ5J10gPSAnU2FtbWVuZHJhZyc7CiRsYW5nWyd0YXhlcyddID0gJ1NrYXR0ZXInOwokbGFuZ1sndG90YWwnXSA9ICdUb3RhbCAnOwokbGFuZ1sndG90YWxfd2VpZ2h0J10gPSAnVG90YWwgdmVrdCc7CiRsYW5nWyd1bml0X3ByaWNlJ10gPSAnRW5oZXRzcHJpcyc7CiRsYW5nWyd2aWV3Y2FydGZvcm1fdGVtcGxhdGVzJ10gPSAnVmlzSGFuZGxla3VydiBza2plbWFtYWxlcic7CiRsYW5nWyd3YXJuX2RlZmF1bHRfdGVtcGxhdGVzJ10gPSAnRGV0dGUgc2tqZW1hIGtvbnRyb2xsZXJlciBodmEgc29tIGlubmxlZG5pbmdzdmlzIHZpc2VzIG4mYXJpbmc7ciBkdSBrbGlra2VyIA0KJiMwMzk7TGVnZyB0aWwgbnkgbWFsJiMwMzk7IGkgZGVuIGFrdHVlbGxlIGZhbmVuLiAmQXJpbmc7IGVuZHJlIGlubmhvbGRldCBpIGRldHRlIHJlZGlnZXJpbmdzb21yJmFyaW5nO2RldCB2aWwgaWtrZSBoYSBub2VuIHVtaWRkZWxiYXIgZWZmZWt0IHAmYXJpbmc7IGRpdHQgbmV0dHN0ZWQuJzsKJGxhbmdbJ3dlaWdodCddID0gJ1Zla3QnOwokbGFuZ1sndXRteiddID0gJzE1Njg2MTM1My4xMjM0Mjk2Mzc4LjkwNy4yNi51dG1jc3I9Zm9ydW0uY21zbWFkZXNpbXBsZS5vcmd8dXRtY2NuPShyZWZlcnJhbCl8dXRtY21kPXJlZmVycmFsfHV0bWNjdD0vaW5kZXgucGhwL2JvYXJkLDcuMC5odG1sJzsKJGxhbmdbJ3V0bWEnXSA9ICcxNTY4NjEzNTMuMTc5MDUyNjIzMDg0MTEwMTAwLjEyMTA0MjM1NzcuMTIzNDkwNDEzOC4xMjM0OTc3Mjk2Ljk0Myc7CiRsYW5nWyd1dG1jJ10gPSAnMTU2ODYxMzUzJzsKJGxhbmdbJ3V0bWInXSA9ICcxNTY4NjEzNTMuMy4xMC4xMjM0OTc3Mjk2JzsKPz4=]]></data>
	</file>
	<file>
	  <filename>/lang/ext/nl_NL.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2FkZCddID0gJ1RvZXZvZWdlbic7CiRsYW5nWydhZGRlZGl0X2FkZHRvY2FydF90ZW1wbGF0ZSddID0gJ1RvZXZvZWdlbi93aWp6aWdlbiBBZGRUb0NhcnQgU2phYmxvb24nOwokbGFuZ1snYWRkZWRpdF9lZGl0c2hpcHBpbmdfdGVtcGxhdGUnXSA9ICdUb2V2b2VnZW4vd2lqemlnZW4gV2lqemlnIFRyYW5zcG9ydCBTamFibG9vbic7CiRsYW5nWydhZGRlZGl0X215Y2FydGZvcm1fdGVtcGxhdGUnXSA9ICdUb2V2b2VnZW4vd2lqemlnZW4gTXlDYXJ0IEZvcm11bGllciBTamFibG9vbic7CiRsYW5nWydhZGRlZGl0X215Y2FydHNsaXN0X3RlbXBsYXRlJ10gPSAnVG9ldm9lZ2VuL3dpanppZ2VuIE15Q2FydHMgTGlqc3QgU2phYmxvb24nOwokbGFuZ1snYWRkZWRpdF92aWV3Y2FydGZvcm1fdGVtcGxhdGUnXSA9ICdUb2V2b2VnZW4vd2lqemlnZW4gVmlld2NhcnQgRm9ybXVsaWVyIFNqYWJsb29uJzsKJGxhbmdbJ2FkZHJlc3MxJ10gPSAnQWRyZXNyZWdlbCAxJzsKJGxhbmdbJ2FkZHJlc3MyJ10gPSAnQWRyZXNyZWdlbCAyJzsKJGxhbmdbJ2FkZHRvY2FydF9kZXN0cGFnZSddID0gJ1BhZ2luYSB0ZSBsYXRlbiB6aWVuIG5hICZxdW90O2FkZCB0byBjYXJ0JnF1b3Q7JzsKJGxhbmdbJ2FkZHRvY2FydF90ZW1wbGF0ZXMnXSA9ICdBZGRUb0NhcnQgU2phYmxvb24nOwokbGFuZ1snYWRkX25ld19iYXNrZXQnXSA9ICdOaWV1d2Ugd2lua2VsbWFuZGplIHRvZXZvZWdlbic7CiRsYW5nWydhZGRfdG9fYWxsX2NhcnRzJ10gPSAnVG9ldm9lZ2VuIGFhbiBhbGxlIG1hbmRqZXMnOwokbGFuZ1snYWRkX3RvX2NhcnQnXSA9ICdUb2V2b2VnZW4gYWFuIGRpdCBtYW5kamUnOwokbGFuZ1snYW1vdW50J10gPSAnQmVkcmFnJzsKJGxhbmdbJ2NhbmNlbCddID0gJ0FubnVsZWVyJzsKJGxhbmdbJ2NhcnRfZW1wdHknXSA9ICdEaXQgd2lua2VsbWFuZGplIGlzIGxlZWcnOwokbGFuZ1snY2FydF9uYW1lJ10gPSAnTmFhbSB3aW5rZWx3YWdlbic7CiRsYW5nWydjaGFuZ2Vsb2cnXSA9ICc8dWw+DQogIDxsaT5WZXJzaW9uIDEuMCAtIERlY2VtYmVyIDIwMDggPGJyLz4NCiAgICAgIEluaXRpYWwgUmVsZWFzZQ0KICA8L2xpPg0KPC91bD4nOwokbGFuZ1snY2l0eSddID0gJ1dvb25wbGFhdHMnOwokbGFuZ1snY29uZmlybV9kZWxldGUnXSA9ICdXZWV0IHUgemVrZXIgZGF0IHUgZGl0IHdpbmtlbG1hbmRqZSB3aWx0IHZlcndpamRlcmVuJzsKJGxhbmdbJ2NvdW50cnknXSA9ICdMYW5kJzsKJGxhbmdbJ2RlZmF1bHRfYWRkdG9jYXJ0X3RlbXBsYXRlJ10gPSAnU3RhbmRhYXJkIEFkZFRvQ2FydCBTamFibG9vbic7CiRsYW5nWydkZWZhdWx0X215Y2FydGZvcm1fdGVtcGxhdGUnXSA9ICdTdGFuZGFhcmQgTXlDYXJ0IGZvcm11bGllciBTamFibG9vbic7CiRsYW5nWydkZWZhdWx0X215Y2FydHNsaXN0X3RlbXBsYXRlJ10gPSAnU3RhbmRhYXJkIE15IENhcnRzIGxpanN0IHNqYWJsb29uJzsKJGxhbmdbJ2RlZmF1bHRfZWRpdHNoaXBwaW5nX3RlbXBsYXRlJ10gPSAnU3RhbmRhYXIgV2lqemlnIFRyYW5zcG9ydCBGb3JtdWxpZXIgU2phYmxvb24nOwokbGFuZ1snZGVmYXVsdF92aWV3Y2FydGZvcm1fdGVtcGxhdGUnXSA9ICdTdGFuZGFhcmQgVmlld2NhcnQgZm9ybXVsaWVyIFNqYWJsb29uJzsKJGxhbmdbJ2RlZmF1bHRfdGVtcGxhdGVzJ10gPSAnU3RhbmRhYXJkc2phYmxvbmVuJzsKJGxhbmdbJ2RlbGV0ZSddID0gJ1ZlcndpamRlcic7CiRsYW5nWydkZXNjcmlwdGlvbiddID0gJ09tc2NocmlqdmluZyc7CiRsYW5nWydlZGl0J10gPSAnV2lqemlnJzsKJGxhbmdbJ2VkaXRzaGlwcGluZ190ZW1wbGF0ZXMnXSA9ICdXaWp6aWcgVHJhbnNwb3J0Zm9ybXVsaWVyIFNqYWJsb25lbic7CiRsYW5nWydlZGl0X3NoaXBwaW5nJ10gPSAnV2lqemlnIHRyYW5zcG9ydGluZm9ybWF0aWUnOwokbGFuZ1snZWRpdF9zaGlwcGluZ19mb3JfY2FydCddID0gJ1dpanppZyBUcmFuc3BvcnQgSW5mb3JtYXRpZSB2b29yIHdpbmtlbHdhZ2VudGplICZxdW90OyVzJnF1b3Q7JzsKJGxhbmdbJ2VtYWlsJ10gPSAnRS1tYWlsJzsKJGxhbmdbJ2Vycm9yX2NhcnRleGlzdHMnXSA9ICdFciBiZXN0YWF0IGFsIGVlbiBtYW5kamUgbWV0IGRlemUgbmFhbSc7CiRsYW5nWydlcnJvcl9pbnZhbGlkcGFyYW0nXSA9ICdFZW4gaW5nZXZvZXJkZSBwYXJhbWV0ZXIgaGVlZnQgZWVuIHZlcmtlZXJkZSB3YWFyZGU6ICVzJzsKJGxhbmdbJ2Vycm9yX21pc3NpbmdwYXJhbSddID0gJ0VlbiB2ZXJwbGljaHRlIHBhcmFtZXRlciBtaXN0OiAlcyc7CiRsYW5nWydlcnJvcl9ub2NhcnRzZGVmaW5lZCddID0gJ1UgaGVlZnQgZ2VlbiB3aW5rZWx3YWdlbnRqZSBnZWRlZmluaWVlcmQnOwokbGFuZ1snZXJyb3Jfbm90bG9nZ2VkaW4nXSA9ICdVIG1vZXQgZWVuIGdlcmVnaXN0cmVlcmRlLCBhYW5nZW1lbGRlIGdlYnJ1aWtlciB6aWpuIG9tIGRpdCB0ZSBnZWJydWlrZW4nOwokbGFuZ1snZXJyb3Jfbm9zdWNocHJvZHVjdCddID0gJ0thbiBnZWVuIGluZm9ybWF0aWUgdmluZGVuIG92ZXIgZGl0IHByb2R1Y3Q6ICVzJzsKJGxhbmdbJ2Vycm9yX25vc3VjaGNhcnQnXSA9ICdIZXQgZ2V6b2NodGUgd2lua2VsbWFuZGplIGtvbiBuaWV0IHdvcmRlbiBnZXZvbmRlbic7CiRsYW5nWydlcnJvcl9zZXRiYXNrZXRkYXRhJ10gPSAnUHJvYmxlZW0gbWV0IGhldCBpbnN0ZWxsZW4gdmFuIGRlIHdpbmtlbG1hbmRqZSBkYXRhJzsKJGxhbmdbJ2ZheCddID0gJ0ZheCAnOwokbGFuZ1snZmlyc3RfbmFtZSddID0gJ1Zvb3JuYWFtJzsKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0dpZnRCYXNrZXRzIENhcnQgVXRpbGl0eSAnOwokbGFuZ1snZ3JhbmRfdG90YWwnXSA9ICdUb3RhYWwnOwokbGFuZ1snaGVscCddID0gJzxoMz5XaGF0IGRvZXMgaXQgZG8/IDwvaDM+DQo8cD5UaGlzIG1vZHVsZSBhbGxvd3MgYW4gYXV0aG9yaXplZCBhbmQgbG9nZ2VkIGluIGZyb250ZW5kIHVzZXIgdG8gbWFuYWdlIG11bHRpcGxlIGJhc2tldHMsIHdpdGggZGlmZmVyZW50IHNoaXBwaW5nIGxvY2F0aW9ucywgYW5kIHRvIGFkZCBwcm9kdWN0cyBmcm9tIHRoZSBQcm9kdWN0cyBtb2R1bGUgaW50byBhbnkgb25lIG9mIHRoaWVyIGJhc2tldHMuPC9wPg0KPHA+Vmlld3MgYW5kIGZvcm1zIGFyZSBhbHNvIHByb3ZpZGVkIHRvIGFsbG93IHRoZSBhdXRob3JpemVkIGZyb250ZW5kIHVzZXIgdG8gbWFuYWdlIGhpcyBiYXNrZXRzLCBhbmQgdGhlIGNvbnRlbnRzIG9mIHRoZW0uPC9wPg0KPGgzPkhvdyBEbyBJIHVzZSBJdDwvaDM+DQogIDxwPlRoaXMgbW9kdWxlIHByb3ZpZGVzIG1hbnkgZm9ybXMgYW5kIHJlcG9ydHMsIGFuZCBoYXMgY29uc2lkZXJhYmxlIGZ1bmN0aW9uYWxpdHkuICBCdXQgaW4gdGhlIHNpbXBsZXN0IHNlbnNlLCBqdXN0IHNlbGVjdCB0aGlzIG1vZHVsZSBhcyB5b3VyIENhcnQgbW9kdWxlIGluIHRoZSBwcmVmZXJlbmNlcyB0YWIgb2YgdGhlICZxdW90O1Byb2R1Y3QgTWFuYWdlciZxdW90OyBhZG1pbiBwYW5lbC4gIFRoaXMgd2lsbCBkaXNwbGF5IGEgZm9ybSBvbiBhbGwgcHJvZHVjdCBkZXRhaWwgcGFnZXMgdG8gYWxsb3cgdGhlIGN1cnJlbnQgcHJvZHVjdCB0byBiZSBhZGRlZCB0byBhIHVzZXIgc2VsZWN0ZWQgY2FydCwgYW5kIHdpbGwgKGdpdmVuIHRoZSBkZWZhdWx0IHRlbXBsYXRlcykgYWxsb3cgY3JlYXRpbmcgb2YgbnVtZXJvdXMgY2FydHMuPC9wPg0KPHA+VG8gY3JlYXRlIGEgc3VtbWFyeSBvZiBhbGwgY2FydHMsIHlvdSBjYW4gdXNlIGEgdGFnIGxpa2Uge0dpZnRCYXNrZXRzIGFjdGlvbj0mIzAzOTtteWNhcnQmIzAzOTt9PC9wPg0KPHA+VG8gY3JlYXRlIGEgcmVwb3J0IG9mIGFsbCBjYXJ0cywgYW5kIHRvIGFsbG93IG1hbmFnaW5nIHRoZWlyIGNvbnRlbnRzLCB5b3UgY2FuIHVzZSBhIHRhZyBsaWtlIHtHaWZ0QmFza2V0cyBhY3Rpb249JiMwMzk7bXljYXJ0c2xpc3QmIzAzOTt9PC9wPic7CiRsYW5nWydoZWxwX2FjdGlvbiddID0gJ1NwZWNpZmllcyB0aGUgYmVoYXZpb3VyIG9mIHRoZSBtb2R1bGUuICBQb3NzaWJsZSB2YWx1ZXMgYXJlICYjMDM5O2RlZmF1bHQmIzAzOTssJiMwMzk7bXljYXJ0JiMwMzk7LCBhbmQgJiMwMzk7dmlld2NhcnQmIzAzOTsuPGJyLz48dWw+PGxpPmRlZmF1bHQ6IGRpc3BsYXlzIGEgZm9ybSB3aXRoIGFuICYjMDM5O2FkZCB0byBjYXJ0JiMwMzk7IGJ1dHRvbiB0byBhbGxvdyBhZGRpbmcgYSBzcGVjaWZpYyBwcm9kdWN0IHRvIHRoZSBjYXJ0LiAgVGhpcyBtb2RlIHJlcXVpcmVzIHRoZSAmIzAzOTtwcm9kdWN0JiMwMzk7IHBhcmFtZXRlciBiZSBzdXBwbGllZC48L2xpPjxsaT5teWNhcnQ6IERpc3BsYXlzIGEgZm9ybSB0aGF0IGRpc3BsYXlzIHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIGNhcnQsIGFuZCBhICYjMDM5O2NoZWNrb3V0JiMwMzk7IGJ1dHRvbi48L2xpPjxsaT52aWV3Y2FydDogRGlzcGxheXMgYSBkZXRhaWxlZCBmb3JtIG9mIHRoZSBjb250ZW50cyBvZiB0aGUgY2FydCwgaW5jbHVkaW5nIGEgY3VycmVudCB0b3RhbCwgYW5kIGFsbG93cyBkZWxldGluZyBpdGVtcyBmcm9tIHRoZSBjYXJ0LjwvbGk+PC91bD4nOwokbGFuZ1snaGVscF9hZGR0b2NhcnR0ZW1wbGF0ZSddID0gJ1NwZWNpZmllcyBhIG5vbiBkZWZhdWx0IHRlbXBsYXRlIHRvIHVzZSBmb3IgdGhlICYjMDM5O2FkZHRvY2FydCYjMDM5OyBtb2RlLic7CiRsYW5nWydoZWxwX2VkaXRzaGlwcGluZ3RlbXBsYXRlJ10gPSAnU3BlY2lmaWVzIGEgbm9uIGRlZmF1bHQgdGVtcGxhdGUgdG8gdXNlIGZvciB0aGUgJiMwMzk7ZWRpdHNoaXBwaW5nJiMwMzk7IGFjdGlvbic7CiRsYW5nWydoZWxwX2hpZGVmb3JtJ10gPSAnQXBwbGljYWJsZSBvbmx5IHRvIHRoZSAmIzAzOTt2aWV3Y2FydCYjMDM5OyBhY3Rpb24sIHRoaXMgZmxhZyBpbmRpY2F0ZXMgd2V0aGVyIHRoZSB2aWV3Y2FydCBmb3JtIHNob3VsZCBiZSBkaXNwbGF5ZWQnOwokbGFuZ1snaGVscF9teWNhcnRzbGlzdHRlbXBsYXRlJ10gPSAnU3BlY2lmaWVzIGEgbm9uIGRlZmF1bHQgdGVtcGxhdGUgdG8gdXNlIGZvciB0aGUgJiMwMzk7bXljYXJ0c2xpc3QmIzAzOTsgbW9kZS4nOwokbGFuZ1snaGVscF9teWNhcnR0ZW1wbGF0ZSddID0gJ1NwZWNpZmllcyBhIG5vbiBkZWZhdWx0IHRlbXBsYXRlIHRvIHVzZSBmb3IgdGhlICAmIzAzOTtteWNhcnQmIzAzOTsgbW9kZS4nOwokbGFuZ1snaGVscF9wcm9kdWN0J10gPSAnQXBwbGljYWJsZSBvbmx5IGZvciB0aGUgZGVmYXVsdCBhY3Rpb24sIHRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB3aGNoIHByb2R1Y3QgKGJ5IGlkKSBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIGNhcnQuICBUeXBpY2FsbHksIGluIHRoZSBwcm9kdWN0IGRldGFpbCB0ZW1wbGF0ZSBvZiB0aGUgcHJvZHVjdHMgbW9kdWxlLCB5b3Ugd291bGQgYWRkIHtDYXJ0IHByb2R1Y3Q9JGVudHJ5LT5pZH0gdG8gYWxsb3cgYWRkaW5nIGl0ZW1zIHRvIHRoZSBjYXJ0IGZyb20gcHJvZHVjdCBkZXRhaWwgcGFnZXMuJzsKJGxhbmdbJ2hlbHBfc29ydGJ5J10gPSAnQXBwbGljYWJsZSBvbmx5IHRvIHRoZSBteWNhcnRzbGlzdCBhY3Rpb24sIHRoaXMgcGFyYW1ldGVyIGFsbG93cyBzcGVjaWZ5aW5nIGEgZGlmZmVyZW50IHNvcnRpbmcgZmllbGQuICBQb3NzaWJsZSB2YWx1ZXMgYXJlOiBjYXJ0X25hbWUsY3JlYXRlX2RhdGUsbW9kaWZpZWRfZGF0ZSxmaXJzdF9uYW1lLGxhc3RfbmFtZSxhZGRyZXNzMSxhZGRyZXNzMixjaXR5LHN0YXRlLGNvdW50cnknOwokbGFuZ1snaGVscF9zb3J0b3JkZXInXSA9ICdBcHBsaWNhYmxlIG9ubHkgdG8gdGhlIG15Y2FydHNsaXN0IGFjdGlvbiwgdGhpcyBwYXJhbWV0ZXIgYWxsb3dzIHNwZWNpZnlpbmcgYSBkaWZmZXJlbnQgc29ydGluZyBvcmRlci4gIFBvc3NpYmxlIHZhbHVlcyBhc2MsZGVzYyc7CiRsYW5nWydoZWxwX3ZpZXdjYXJ0cGFnZSddID0gJ0Jlbm9lbSBlZW4gZG9lbCBwYWdpbmEgdm9vciBkZSAmIzAzOTt2aWV3Y2FydCYjMDM5OyBtb2RlLic7CiRsYW5nWydoZWxwX3ZpZXdjYXJ0dGVtcGxhdGUnXSA9ICdCZW5vZW0gZWVuIG5pZXQgc3RhbmRhYXJkIHNqYWJsb29uIHZvb3IgZGUgJiMwMzk7dmlld2NhcnQmIzAzOTsgbW9kZS4nOwokbGFuZ1snaW5mb19hZGR0b2NhcnRfdGVtcGxhdGVzJ10gPSAnVGhlc2UgdGVtcGxhdGVzIGFyZSB1c2VkIGZvciB0aGUgZGVmYXVsdCBhY3Rpb24gb2YgdGhpcyBtb2R1bGUgd2hpY2ggYWxsb3dzIGNyZWF0aW5nIG5ldyBjYXJ0cywgYW5kIGFkZGluZyBhIHByb2R1Y3QgZnJvbSB0aGUgY2FydCBtb2R1bGUgdG8gYSBzZWxlY3RlZCBjYXJ0JzsKJGxhbmdbJ2luZm9fZWRpdHNoaXBwaW5nX3RlbXBsYXRlcyddID0gJ1RoZXNlIHRlbXBsYXRlcyBhcmUgdXNlZCB0byBwcm92aWRlIGEgZm9ybSBmb3IgZWRpdGluZyB0aGUgc2hpcHBpbmcgaW5mb3JtYXRpb24gZm9yIG9uZSBvZiB5b3VyIGNhcnRzJzsKJGxhbmdbJ2luZm9fbXljYXJ0Zm9ybV90ZW1wbGF0ZXMnXSA9ICdUaGVzZSB0ZW1wbGF0ZXMgYXJlIHVzZWQgdG8gdmlldyBhIHF1aWNrIHN1bW1hcnkgb2YgdGhlIHRvdGFsIG9mIHlvdXIgY2FydCwgYW5kIHRoZSBudW1iZXIgb2YgaXRlbXMsIGFsb25nIHdpdGggYSBidXR0b24gdG8gYWxsb3cgeW91IHRvIHJlZGlyZWN0IHRvIHRoZSB2aWV3IGNhcnQgZm9ybSBhbmQgdG8gY2hlY2tvdXQuJzsKJGxhbmdbJ2luZm9fbXljYXJ0c2xpc3RfdGVtcGxhdGVzJ10gPSAnVGhlc2UgdGVtcGxhdGVzIGFyZSB1c2VkIHRvIHZpZXcgYSBsaXN0IG9mIHlvdXIgY2FydHMgd2l0aCBhIHF1aWNrIHN1bW1hcnkgb2YgdGhlIGluZm9ybWF0aW9uIGluIHRoZW0sIGFuZCBhIGxpbmsgdGhhdCB3aWxsIGFsbG93IGVkaXRpbmcgdGhlIGluZm9ybWF0aW9uIGluIGEgc3BlY2lmaWMgY2FydCwgYW5kL29yIHRoZSBzaGlwcGluZyBpbmZvcm1hdGlvbiBmb3IgZWFjaCBjYXJ0Lic7CiRsYW5nWydpbmZvX3Byb2R1Y3RzdW1tYXJ5dGVtcGxhdGUnXSA9ICdUaGlzIHRlbXBsYXRlIGlzIHVzZWQgdG8gZm9ybWF0IHRoZSBvdXRwdXQgdXNlZCBmb3IgZWFjaCBwcm9kdWN0IHN1bW1hcnkgaW4gdGhlIHZpZXcgY2FydCBmb3JtLiAgSXQgYWxsb3dzIGN1c3RvbWl6aW5nIHRoZSBwcm9kdWN0IGxhYmVsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzLCBwcm9kdWN0IG5hbWUsIGFuZCBwcmljZS4nOwokbGFuZ1snaW5mb192aWV3Y2FydGZvcm1fdGVtcGxhdGUnXSA9ICdUaGVzZSB0ZW1wbGF0ZXMgYXJlIHVzZWQgdG8gZGlzcGxheSBhIGZvcm0gYWJvdXQgb25lIHNwZWNpZmljIGNhcnQgc28gdGhhdCBhdXRob3JpemVkIHBlb3BsZSBjYW4gZWRpdCB0aGUgY29udGVudHMgb2Ygb25lIG9mIHRoZWlyIGNhcnRzLic7CiRsYW5nWydsYXN0X25hbWUnXSA9ICdBY2h0ZXJuYWFtJzsKJGxhbmdbJ21lc3NhZ2UnXSA9ICdCb29kc2NoYXAnOwokbGFuZ1snbW9kZGVzY3JpcHRpb24nXSA9ICdFZW4gZ2VhdmFuY2VlcmRlIG1vZHVsZSB3YWFybWVlIG1lZXJkZXJlIHdpbmtlbG1hbmRqZXMga3VubmVuIHdvcmRlbiBnZXZ1bGQgdm9vciB2ZXJzY2hpbGxlbmRlIGJlc3RlbW1pbmdlbi4nOwokbGFuZ1snbXljYXJ0Zm9ybV90ZW1wbGF0ZXMnXSA9ICdNeUNhcnQgRm9ybXVsaWVyc2phYmxvbmVuJzsKJGxhbmdbJ215Y2FydHNsaXN0X3RlbXBsYXRlcyddID0gJ015IENhcnRzIExpanN0IFNqYWJsb25lbic7CiRsYW5nWydteXNlbGYnXSA9ICdNaWp6ZWxmJzsKJGxhbmdbJ215X2NhcnQnXSA9ICdNaWpuIHdpbmtlbHdhZ2VuICc7CiRsYW5nWydub25lJ10gPSAnR2Vlbic7CiRsYW5nWydub3RfZW50ZXJlZCddID0gJ05pZXQgaW5nZXZvZXJkJzsKJGxhbmdbJ251bWJlciddID0gJ051bW1lcic7CiRsYW5nWydudW1iZXJfb2ZfaXRlbXMnXSA9ICdBYW50YWwgaXRlbXMnOwokbGFuZ1sncGhvbmUnXSA9ICdUZWxlZm9vbic7CiRsYW5nWydwb3N0YWwnXSA9ICdQb3N0Y29kZSc7CiRsYW5nWydwb3N0aW5zdGFsbCddID0gJ0RlIEdpZnRCYXNrZXRzIG1vZHVsZSBpcyBnZSZpdW1sO25zdGFsbGVlcmQnOwokbGFuZ1sncG9zdHVuaW5zdGFsbCddID0gJ0RlIEdpZnRCYXNrZXRzIG1vZHVsZSBpcyB2ZXJ3aWpkZXJkLiAgQWxsZSBkYXRhIGdlYXNzb2NpZWVyZCBtZXQgZGV6ZSBtb2R1bGUgaXMgdWl0IGRlIGRhdGFiYXNlIHZlcndpamRlcmQuJzsKJGxhbmdbJ3ByZWZlcmVuY2VzJ10gPSAnVm9vcmtldXJlbic7CiRsYW5nWydwcmljZSddID0gJ1ByaWpzJzsKJGxhbmdbJ3Byb2R1Y3RfaWQnXSA9ICdQcm9kdWN0IElkJzsKJGxhbmdbJ3Byb2R1Y3RzdW1tYXJ5X3RlbXBsYXRlJ10gPSAnUHJvZHVjdCBzYW1lbnZhdHRpbmcgc2phYmxvb24nOwokbGFuZ1sncXVhbnRpdHknXSA9ICdIb2V2ZWVsaGVpZCc7CiRsYW5nWydyZWFsbHlfdW5pbnN0YWxsJ10gPSAnV2VldCB1IHpla2VyIGRhdCB1IGRlemUgbW9kdWxlIHdpbHQgdmVyd2lqZGVyZW4/IERvb3JnYWFuIHphbCBhbGxlIGRhdGEgdmFuIGRlemUgbW9kdWxlIHZlcndpamRlcmVuLic7CiRsYW5nWydyZW1vdmUnXSA9ICdWZXJ3aWpkZXJlbic7CiRsYW5nWydzZWxlY3Rfb25lJ10gPSAnS2llcyAmZWFjdXRlOyZlYWN1dGU7bic7CiRsYW5nWydzZWxlY3RfcmVjaXBpZW50J10gPSAnU2VsZWN0ZWVyIGVlbiBvbnR2YW5nZXInOwokbGFuZ1snc2hpcHBpbmdfaW5mbyddID0gJ1RyYW5zcG9ydCBJbmZvcm1hdGllJzsKJGxhbmdbJ3N1Ym1pdCddID0gJ1RvZXZvZWdlbic7CiRsYW5nWydzdWJ0b3RhbCddID0gJ1N1YnRvdGFhbCc7CiRsYW5nWydzaGlwcGluZyddID0gJ1RyYW5zcG9ydCc7CiRsYW5nWydzaGlwcGluZ19tb2R1bGUnXSA9ICdTaGlwcGluZyBNb2R1bGUgJzsKJGxhbmdbJ3N0YXRlJ10gPSAnUHJvdmluY2llJzsKJGxhbmdbJ3N1bW1hcnknXSA9ICdTYW1lbnZhdHRpbmcnOwokbGFuZ1sndGF4ZXMnXSA9ICdCVFcnOwokbGFuZ1sndG90YWwnXSA9ICdUb3RhYWwnOwokbGFuZ1sndG90YWxfd2VpZ2h0J10gPSAnVG90YWFsIEdld2ljaHQnOwokbGFuZ1sndW5pdF9wcmljZSddID0gJ1N0dWtzcHJpanMnOwokbGFuZ1sndmlld2NhcnRmb3JtX3RlbXBsYXRlcyddID0gJ1ZpZXdjYXJ0IEZvcm11bGllciBTamFibG9uZW4nOwokbGFuZ1snd2Fybl9kZWZhdWx0X3RlbXBsYXRlcyddID0gJ1RoaXMgZm9ybSBjb250cm9scyB3aGF0IGlzIGRpc3BsYXllZCBpbml0aWFsbHkgd2hlbiB5b3UgY2xpY2sgJiMwMzk7QWRkIE5ldyBUZW1wbGF0ZSYjMDM5OyBpbiB0aGUgYXBwcm9wcmlhdGUgdGFiLiAgQWRqdXN0aW5nIHRoZSBjb250ZW50cyBpbiB0aGlzIGVkaXQgYXJlYSB3aWxsIGhhdmUgbm8gaW1tZWRpY2F0ZSBlZmZlY3Qgb24geW91ciB3ZWJzaXRlLic7CiRsYW5nWyd3ZWlnaHQnXSA9ICdHZXdpY2h0JzsKJGxhbmdbJ3V0bWEnXSA9ICcxNTY4NjEzNTMuMTc2NDA5MDI2OTA1OTg2NzEwMC4xMjM5ODg2MDYyLjEyNTAwMDQzMDcuMTI1MDEwMjE3Ny40OSc7CiRsYW5nWyd1dG16J10gPSAnMTU2ODYxMzUzLjEyNTAwMDQzMDcuNDguMTAudXRtY3NyPW9ic3plaWplbi5ubHx1dG1jY249KHJlZmVycmFsKXx1dG1jbWQ9cmVmZXJyYWx8dXRtY2N0PS9vdmVyLWRlLXdlYnNpdGUuaHRtbCc7CiRsYW5nWydxY2EnXSA9ICc0ODI0YWMxNC1hZjc5OS1hNDI1Ny1mNGNkZSc7CiRsYW5nWyd1dG1iJ10gPSAnMTU2ODYxMzUzLjQuMTAuMTI1MDEwMjE3Nyc7CiRsYW5nWyd1dG1jJ10gPSAnMTU2ODYxMzUzJzsKJGxhbmdbJ3FjYiddID0gJzIzMzc2NTg4OSc7Cj8+]]></data>
	</file>
	<file>
	  <filename>/method.install.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IENhcnQgLSBBIHNpbXBsZSBleGFtcGxlIGZyb250ZW5kIGZvcm0gbW9kdWxlCiMgVmVyc2lvbjogMS4wLCBjYWxndXkxMDAwIDxjYWxndXkxMDAwQGNtc21hZGVzaW1wbGUub3JnPgojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykKIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZwojIFRoZSBtb2R1bGUncyBob21lcGFnZSBpczogaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy9wcm9qZWN0cy9za2VsZXRvbi8KIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmlmKCAhaXNzZXQoJGdDbXMpICkgZXhpdDsKCiMKIyBUYWJsZXMKIwokZGIgPSYgJHRoaXMtPkdldERiKCk7CiRkaWN0ID0gTmV3RGF0YURpY3Rpb25hcnkoJGRiKTsKJHRhYm9wdGFycmF5ID0gYXJyYXkoJ215c3FsJyA9PiAnVFlQRT1NeUlTQU0nKTsKCiMKIyBUZW1wbGF0ZXMKIwoKIyBTZXR1cCBkZWZhdWx0IGFkZCB0byBjYXJ0IHRlbXBsYXRlCiRmbiA9IGNtc19qb2luX3BhdGgoZGlybmFtZShfX0ZJTEVfXyksJ3RlbXBsYXRlcycsJ29yaWdfYWRkdG9jYXJ0X3RlbXBsYXRlLnRwbCcpOwppZiggZmlsZV9leGlzdHMoJGZuKSApCiAgewogICAgJHRlbXBsYXRlID0gZmlsZV9nZXRfY29udGVudHMoICRmbiApOwogICAgJHRoaXMtPlNldFByZWZlcmVuY2UoJ2FkZHRvY2FydF9zeXNkZWZhdWx0X3RlbXBsYXRlJywkdGVtcGxhdGUpOwogICAgJHRoaXMtPlNldFRlbXBsYXRlKCdhZGR0b2NhcnRfU2FtcGxlJywkdGVtcGxhdGUpOwogICAgJHRoaXMtPlNldFByZWZlcmVuY2UoJ2FkZHRvY2FydF9kZmx0JywnU2FtcGxlJyk7CiAgfQoKIyBTZXR1cCBkZWZhdWx0IG15IGNhcnQgZm9ybSB0ZW1wbGF0ZQokZm4gPSBjbXNfam9pbl9wYXRoKGRpcm5hbWUoX19GSUxFX18pLCd0ZW1wbGF0ZXMnLCdvcmlnX215Y2FydGZvcm1fdGVtcGxhdGUudHBsJyk7CmlmKCBmaWxlX2V4aXN0cygkZm4pICkKICB7CiAgICAkdGVtcGxhdGUgPSBmaWxlX2dldF9jb250ZW50cyggJGZuICk7CiAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgnbXljYXJ0Zm9ybV9zeXNkZWZhdWx0X3RlbXBsYXRlJywkdGVtcGxhdGUpOwogICAgJHRoaXMtPlNldFRlbXBsYXRlKCdteWNhcnRmb3JtX1NhbXBsZScsJHRlbXBsYXRlKTsKICAgICR0aGlzLT5TZXRQcmVmZXJlbmNlKCdteWNhcnRmb3JtX2RmbHQnLCdTYW1wbGUnKTsKICB9CgojIFNldHVwIGRlZmF1bHQgbXkgY2FydHMgbGlzdCB0ZW1wbGF0ZQokZm4gPSBjbXNfam9pbl9wYXRoKGRpcm5hbWUoX19GSUxFX18pLCd0ZW1wbGF0ZXMnLCdvcmlnX215Y2FydHNsaXN0X3RlbXBsYXRlLnRwbCcpOwppZiggZmlsZV9leGlzdHMoJGZuKSApCiAgewogICAgJHRlbXBsYXRlID0gZmlsZV9nZXRfY29udGVudHMoICRmbiApOwogICAgJHRoaXMtPlNldFByZWZlcmVuY2UoJ215Y2FydHNsaXN0X3N5c2RlZmF1bHRfdGVtcGxhdGUnLCR0ZW1wbGF0ZSk7CiAgICAkdGhpcy0+U2V0VGVtcGxhdGUoJ215Y2FydHNsaXN0X1NhbXBsZScsJHRlbXBsYXRlKTsKICAgICR0aGlzLT5TZXRQcmVmZXJlbmNlKCdteWNhcnRzbGlzdF9kZmx0JywnU2FtcGxlJyk7CiAgfQoKIyBTZXR1cCBkZWZhdWx0IGVkaXQgc2hpcHBpbmcgdGVtcGxhdGUKJGZuID0gY21zX2pvaW5fcGF0aChkaXJuYW1lKF9fRklMRV9fKSwndGVtcGxhdGVzJywnb3JpZ19lZGl0c2hpcHBpbmdfdGVtcGxhdGUudHBsJyk7CmlmKCBmaWxlX2V4aXN0cygkZm4pICkKICB7CiAgICAkdGVtcGxhdGUgPSBmaWxlX2dldF9jb250ZW50cyggJGZuICk7CiAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgnZWRpdHNoaXBwaW5nX3N5c2RlZmF1bHRfdGVtcGxhdGUnLCR0ZW1wbGF0ZSk7CiAgICAkdGhpcy0+U2V0VGVtcGxhdGUoJ2VkaXRzaGlwcGluZ19TYW1wbGUnLCR0ZW1wbGF0ZSk7CiAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgnZWRpdHNoaXBwaW5nX2RmbHQnLCdTYW1wbGUnKTsKICB9CgojU2V0dXAgZGVmYXVsdCB2aWV3Y2FydGZvcm0gdGVtcGxhdGUKJGZuID0gY21zX2pvaW5fcGF0aChkaXJuYW1lKF9fRklMRV9fKSwndGVtcGxhdGVzJywnb3JpZ192aWV3Y2FydGZvcm1fdGVtcGxhdGUudHBsJyk7CmlmKCBmaWxlX2V4aXN0cygkZm4pICkKICB7CiAgICAkdGVtcGxhdGUgPSBmaWxlX2dldF9jb250ZW50cyggJGZuICk7CiAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgndmlld2NhcnRmb3JtX3N5c2RlZmF1bHRfdGVtcGxhdGUnLCR0ZW1wbGF0ZSk7CiAgICAkdGhpcy0+U2V0VGVtcGxhdGUoJ3ZpZXdjYXJ0Zm9ybV9TYW1wbGUnLCR0ZW1wbGF0ZSk7CiAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgndmlld2NhcnRmb3JtX2RmbHQnLCdTYW1wbGUnKTsKICB9CiRmbiA9IGNtc19qb2luX3BhdGgoZGlybmFtZShfX0ZJTEVfXyksJ3RlbXBsYXRlcycsJ3RhYmxlX3ZpZXdjYXJ0Zm9ybV90ZW1wbGF0ZS50cGwnKTsKaWYoIGZpbGVfZXhpc3RzKCRmbikgKQogIHsKICAgICR0ZW1wbGF0ZSA9IGZpbGVfZ2V0X2NvbnRlbnRzKCAkZm4gKTsKICAgICR0aGlzLT5TZXRUZW1wbGF0ZSgndmlld2NhcnRmb3JtX2ludm9pY2VfdGFibGUnLCR0ZW1wbGF0ZSk7CiAgfQoKI1NldHVwIHByb2R1Y3Qgc3VtbWFyeSB0ZW1wbGF0ZQokZm4gPSBjbXNfam9pbl9wYXRoKGRpcm5hbWUoX19GSUxFX18pLCd0ZW1wbGF0ZXMnLCdvcmlnX3Byb2R1Y3Rfc3VtbWFyeV90ZW1wbGF0ZS50cGwnKTsKaWYoIGZpbGVfZXhpc3RzKCRmbikgKQogIHsKICAgICR0ZW1wbGF0ZSA9IGZpbGVfZ2V0X2NvbnRlbnRzKCRmbik7CiAgICAkdGhpcy0+U2V0VGVtcGxhdGUoJ3Byb2R1Y3RzdW1tYXJ5JywkdGVtcGxhdGUpOwogIH0KCiMKIyBQZXJtaXNzaW9ucwojCgojCiMgUHJlZmVyZW5jZXMKIwovLyBFT0YKPz4=]]></data>
	</file>
	<file>
	  <filename>/method.uninstall.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IENhcnQgLSBBIHNpbXBsZSBleGFtcGxlIGZyb250ZW5kIGZvcm0gbW9kdWxlCiMgVmVyc2lvbjogMS4wLCBjYWxndXkxMDAwIDxjYWxndXkxMDAwQGNtc21hZGVzaW1wbGUub3JnPgojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykKIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZwojIFRoZSBtb2R1bGUncyBob21lcGFnZSBpczogaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy9wcm9qZWN0cy9za2VsZXRvbi8KIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmlmKCAhaXNzZXQoJGdDbXMpICkgZXhpdDsKCiRkYiA9JiAkdGhpcy0+R2V0RGIoKTsKJGRpY3QgPSBOZXdEYXRhRGljdGlvbmFyeSggJGRiICk7CgokdGhpcy0+RGVsZXRlVGVtcGxhdGUoKTsKJHRoaXMtPlJlbW92ZVByZWZlcmVuY2UoKTsKCi8vIEVPRgo/Pg==]]></data>
	</file>
	<file>
	  <filename>/skeleton.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IENhcnQgLSBBIHNpbXBsZSBleGFtcGxlIGZyb250ZW5kIGZvcm0gbW9kdWxlCiMgVmVyc2lvbjogMS4wLCBjYWxndXkxMDAwIDxjYWxndXkxMDAwQGNtc21hZGVzaW1wbGUub3JnPgojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykKIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZwojIFRoZSBtb2R1bGUncyBob21lcGFnZSBpczogaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy9wcm9qZWN0cy9za2VsZXRvbi8KIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmlmKCAhaXNzZXQoJGdDbXMpICkgZXhpdDsKCi8vIEVPRgo/Pg==]]></data>
	</file>
	<file>
	  <filename>/templates/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/templates/admin_preferences_tab.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[eyRmb3Jtc3RhcnR9CjxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHByb21wdF9hZGR0b2NhcnRfZGVzdHBhZ2V9PC9wPgogIDxwIGNsYXNzPSJwYWdldGV4dCI+eyRpbnB1dF9hZGR0b2NhcnRfZGVzdHBhZ2V9PC9wPgo8L2Rpdj4KPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICA8cCBjbGFzcz0icGFnZXRleHQiPiZuYnNwOzwvcD4KICA8cCBjbGFzcz0icGFnZXRleHQiPnskc3VibWl0fTwvcD4KPC9kaXY+CnskZm9ybWVuZH0=]]></data>
	</file>
	<file>
	  <filename>/templates/orig_addtocart_template.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[eyogYWRkIHRvIGNhcnQgdGVtcGxhdGUgKn0KeyogdGhpcyB0ZW1wbGF0ZSBpcyBkZXNpZ25lZCB0byBiZSB1c2VkIGZyb20gdGhlIHByb2R1Y3RzIG1vZHVsZSBkZXRhaWwgdmlldyAKICAgaWYgaW50ZW5kaW5nIHRvIHVzZSB0aGlzIHRlbXBsYXRlIGluIGEgc3VtbWFyeSB2aWV3LCB5b3Ugc2hvdWxkIAogICBhKSBtb3ZlIHRoZSBqYXZhc2NyaXB0IHN0dWZmIGludG8gYSBnbG9iYWwgY29udGVudCBibG9jawogICBiKSBjYWxsIHRoZSBnbG9iYWwgY29udGVudCBibG9jayBmcm9tIHRoZSB0b3Agb2YgdGhlIHByb2R1Y3RzIG1vZHVsZSBzdW1tYXJ5IHRlbXBsYXRlCip9Cgp7KiBqYXZhc2NyaXB0IGFyZWEgKn0KeyogdGhlIGphdmFzY3JpcHQgaW4gdGhpcyB0ZW1wbGF0ZSBpcyBub3QgcmVxdWlyZWQuICBJdCBpcyBjb21wbGV0ZWx5IG9wdGlvbmFsLCBhbmQgaXMgaW50ZW5kZWQgcHVyZWx5IGFzIGFuIGV4YW1wbGUgYXMgdG8gc29tZSBvZiB0aGUgZnVuY3Rpb25hbGl0eSB0aGF0IGNhbiBiZSBhY2hpZXZlZCAqfQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci8qPCFbQ0RBVEFbKi8KZnVuY3Rpb24gZ2V0Zm9ybWJ5aWRwcmVmaXgocHJlZml4KQp7bGRlbGltfQogICB2YXIgZm9ybXMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnZm9ybScpOwogICBmb3IoIHZhciBpID0gMDsgaSA8IGZvcm1zLmxlbmd0aDsgaSsrICkKICAgICAge2xkZWxpbX0KICAgICAgICAgdmFyIHRtcCA9IGZvcm1zW2ldLmlkLnN1YnN0cigwLHByZWZpeC5sZW5ndGgpOwogICAgICAgICBpZiggdG1wID09IHByZWZpeCApCiAgICAgICAgICAge2xkZWxpbX0KICAgICAgICAgICByZXR1cm4gZm9ybXNbaV07CiAgICAgICAgICAge3JkZWxpbX0KICAgICAge3JkZWxpbX0Ke3JkZWxpbX0KCmZ1bmN0aW9uIGVkaXRzaGlwcGluZ19jdXIoYWN0aW9uaWQpCntsZGVsaW19CiAgdGhlZm9ybSA9IGdldGZvcm1ieWlkcHJlZml4KGFjdGlvbmlkKTsKICB2YXIgc2VsaXRlbSA9IHRoZWZvcm1bYWN0aW9uaWQgKyAnY2FydF9teWNhcnRzJ107CiAgdmFyIGlkeCA9IHNlbGl0ZW0uc2VsZWN0ZWRJbmRleDsKICB2YXIgdmFsID0gc2VsaXRlbVtpZHhdLnZhbHVlOwogIHsqIHlvdSBjYW4gYWRkIGEgcGFnZT0gcGFyYW1ldGVyIHRvIHRoZSBtb2R1bGVfYWN0aW9uX2xpbmsgY2FsbCBoZXJlIHRvIHJlZGlyZWN0IHRvIGEgZGlmZmVyZW50IHBhZ2UgKn0KICB2YXIgYmFzZV91cmwgPSAne21vZHVsZV9hY3Rpb25fbGluayBtb2R1bGU9J0dpZnRCYXNrZXRzJyBhY3Rpb249J2VkaXRzaGlwcGluZycgdXJsb25seT10cnVlIGNhcnRfcmV0dXJucGFnZT0tMX0nOwogIHZhciB0aGVfdXJsID0gYmFzZV91cmwucmVwbGFjZSgnYW1wOycsJycpICsgJyZjbnRudDAxY2FydF9pZD0nICsgdmFsOwogIHdpbmRvdy5sb2NhdGlvbiA9IHRoZV91cmw7CntyZGVsaW19CgpmdW5jdGlvbiBhZGR0b2NhcnQoYWN0aW9uaWQsdmFsdWUpCntsZGVsaW19CiAgdGhlZm9ybSA9IGdldGZvcm1ieWlkcHJlZml4KGFjdGlvbmlkKTsKICB2YXIgc2VsaXRlbSA9IHRoZWZvcm1bYWN0aW9uaWQgKyAnY2FydF9teWNhcnRzJ107CiAgdmFyIGlkeCA9IHNlbGl0ZW0uc2VsZWN0ZWRJbmRleDsKICB2YXIgdmFsID0gc2VsaXRlbVtpZHhdLnZhbHVlOwogIHsqIGNhcnRfaWQgaXMgYSBoaWRkZW4gZmllbGQgKn0KICB2YXIgY2FydGlkX2ZsZCA9IHRoZWZvcm1bYWN0aW9uaWQgKyAnY2FydF9pZCddOwogIGNhcnRpZF9mbGQudmFsdWUgPSB2YWw7CiAgeyogZm9ybXN1Ym1pdF9mbGQgaXMgYSBoaWRkZW4gZmllbGQgKn0KICB2YXIgZm9ybXN1Ym1pdF9mbGQgPSB0aGVmb3JtW2FjdGlvbmlkICsgJ2NhcnRfZm9ybXN1Ym1pdCddOwogIGZvcm1zdWJtaXRfZmxkLnZhbHVlID0gdmFsdWU7CiAgdGhlZm9ybS5zdWJtaXQoKTsKe3JkZWxpbX0KCmZ1bmN0aW9uIG9uc2VsX2NoYW5nZSh0aGVmb3JtLGFjdGlvbmlkKQp7bGRlbGltfQogIHZhciBpbnB1dGRpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFjdGlvbmlkICsgJ2FkZG5ld2ZpZWxkJyk7CiAgdmFyIG90aGVyZGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYWN0aW9uaWQgKyAnZWRpdHNoaXBwaW5nJyk7CiAgdmFyIGVsZW0gPSB0aGVmb3JtW2FjdGlvbmlkICsgJ2NhcnRfbXljYXJ0cyddOwogIHZhciBpZHggPSBlbGVtLnNlbGVjdGVkSW5kZXg7CiAgdmFyIHZhbCA9IGVsZW1baWR4XS52YWx1ZTsKICBpZiggdmFsID09IC0yICkgeyogYWRkIG5ldyAqfQogIHtsZGVsaW19CiAgICBpbnB1dGRpdi5zdHlsZS5kaXNwbGF5ID0gJ2lubGluZSc7CiAgICBvdGhlcmRpdi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogIHtyZGVsaW19CiAgZWxzZQogIHtsZGVsaW19CiAgICBpbnB1dGRpdi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgb3RoZXJkaXYuc3R5bGUuZGlzcGxheSA9ICdpbmxpbmUnOwogIHtyZGVsaW19CntyZGVsaW19Ci8qXV0+ICovCjwvc2NyaXB0PgoKe2lmIGlzc2V0KCRzdGF0dXMpIH0KICA8ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kOiAjMzAwOyBjb2xvcjogI2YwMDsiPnskbWVzc2FnZX08L2Rpdj4Key9pZn0KCjxkaXYgY2xhc3M9ImFkZHRvY2FydCI+CnskZm9ybXN0YXJ0fQogIDxkaXYgY2xhc3M9InJvdyI+CiAge2lmIGlzc2V0KCRteWNhcnRzKX0KICAgIDxkaXY+CiAgICB7JG1vZC0+TGFuZygnc2VsZWN0X3JlY2lwaWVudCcpfTogCiAgICA8c2VsZWN0IG5hbWU9InskYWN0aW9uaWR9Y2FydF9teWNhcnRzIiBvbmNoYW5nZT0ib25zZWxfY2hhbmdlKHRoaXMuZm9ybSwneyRhY3Rpb25pZH0nKTsiPgogICAgICB7aHRtbF9vcHRpb25zIG9wdGlvbnM9JG15Y2FydHMgc2VsZWN0ZWQ9JHNlbF9jYXJ0fQogICAgPC9zZWxlY3Q+CiAgICA8c3BhbiBpZD0ieyRhY3Rpb25pZH1hZGRuZXdmaWVsZCIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7Ij4KICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9InskYWN0aW9uaWR9Y2FydF9uZXdjYXJ0bmFtZSIgc2l6ZT0iMzAiIG1heGxlbmd0aD0iNTAiIG9uY2hhbmdlPSJ0aGlzLmZvcm0uc3VibWl0KCk7Ii8+CiAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9InskYWN0aW9uaWR9Y2FydF9tYWtlbmV3Y2FydCIgdmFsdWU9InskbW9kLT5MYW5nKCdhZGQnKX0iIC8+CiAgICA8L3NwYW4+CiAgICA8c3BhbiBpZD0ieyRhY3Rpb25pZH1lZGl0c2hpcHBpbmciPgogICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OmVkaXRzaGlwcGluZ19jdXIoJ3skYWN0aW9uaWR9Jyk7Ij57JG1vZC0+TGFuZygnZWRpdF9zaGlwcGluZycpfTwvYT4KICAgIDwvc3Bhbj4KICAgIDwvZGl2PgogIHsvaWZ9CiAgeyogcm93ICp9PC9kaXY+Cgp7KiBoZXJlIHdlJ2xsIGhpZGUgdGhlIHF1YW50aXR5IGZpZWxkLCBhbmQgbWFrZSBpdCBhIGhpZGRlbiB2YXJpYWJsZSAqfQp7KiAKPGlucHV0IHR5cGU9InRleHQiIG5hbWU9InskcXVhbnRpdHluYW1lfSIgdmFsdWU9IjEiIHNpemU9IjIiIG1heGxlbmd0aD0iMiIvPgoqfQo8ZGl2PgogIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InskcXVhbnRpdHluYW1lfSIgdmFsdWU9IjEiLz4KICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJ7JGFjdGlvbmlkfWNhcnRfZm9ybXN1Ym1pdCIgdmFsdWU9IjAiLz4KPC9kaXY+Cgp7aWYgaXNzZXQoJGF0dHJpYnV0ZV9jb3VudCkgJiYgJGF0dHJpYnV0ZV9jb3VudCBndCAwfSZuYnNwOwogIHtmb3JlYWNoIGZyb209JGF0dHJpYnV0ZXMgaXRlbT0nYXR0cmliJ30KICAgIHskYXR0cmliLT5uYW1lfTogeyRhdHRyaWItPmNvbnRyb2x9CiAgey9mb3JlYWNofQp7L2lmfQo8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJ7JHN1Ym1pdG5hbWV9IiB2YWx1ZT0ieyRtb2QtPkxhbmcoJ2FkZF90b19jYXJ0Jyl9IiBvbmNsaWNrPSJhZGR0b2NhcnQoJ3skYWN0aW9uaWR9JywnYWRkX3RvX2NhcnQnKTsiLz4KPGlucHV0IHR5cGU9InN1Ym1pdCIgbmFtZT0ieyRhY3Rpb25pZH1jYXJ0X3N1Ym1pdF90b19hbGwiIHZhbHVlPSJ7JG1vZC0+TGFuZygnYWRkX3RvX2FsbF9jYXJ0cycpfSIgb25jbGljaz0iYWRkdG9jYXJ0KCd7JGFjdGlvbmlkfScsJ2FkZF90b19hbGxfY2FydHMnKTsiLz4KeyRmb3JtZW5kfQo8L2Rpdj4K]]></data>
	</file>
	<file>
	  <filename>/templates/orig_editshipping_template.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[eyogZWRpdCBzaGlwcGluZyB0ZW1wbGF0ZSAqfQo8aDU+eyRtb2QtPkxhbmcoJ2VkaXRfc2hpcHBpbmdfZm9yX2NhcnQnLCRjYXJ0X25hbWUpfTwvaDU+CntpZiBpc3NldCgkc3RhdHVzKX0KICB7Y2dlcnJvcn17JG1lc3NhZ2V9ey9jZ2Vycm9yfQp7L2lmfQoKICB7aWYgIWlzc2V0KCRyZWNvcmQpfQogICAgeyRtb2QtPkxhbmcoJ2Vycm9yX25vY2FydHNkZWZpbmVkJyl9CiAge2Vsc2V9CiAgPGRpdiBjbGFzcz0iZm9ybSI+CiAgeyRmb3Jtc3RhcnR9CiAgICA8ZGl2IGNsYXNzPSJyb3ciPgogICAgICA8ZGl2IHN0eWxlPSJ3aWR0aDogMzAlOyBmbG9hdDogbGVmdDsiPgogICAgICAgICp7JG1vZC0+TGFuZygnY2FydF9uYW1lJyl9OgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBzdHlsZT0id2lkdGg6IDY5JTsiPgogICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJ7JGFjdGlvbmlkfWNhcnRfbmFtZSIgdmFsdWU9InskcmVjb3JkLmNhcnRfbmFtZX0iIHNpemU9IjUwIiBtYXhsZW5ndGg9IjUwIi8+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CgogICAgPGRpdiBjbGFzcz0icm93Ij4KICAgICAgPGRpdiBzdHlsZT0id2lkdGg6IDMwJTsgZmxvYXQ6IGxlZnQ7Ij4KICAgICAgICB7JG1vZC0+TGFuZygnY29tcGFueScpfToKICAgICAgPC9kaXY+CiAgICAgIDxkaXYgc3R5bGU9IndpZHRoOiA2OSU7Ij4KICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0ieyRhY3Rpb25pZH1jYXJ0X2NvbXBhbnkiIHZhbHVlPSJ7JHJlY29yZC5kZXN0X2NvbXBhbnl9IiBzaXplPSI1MCIgbWF4bGVuZ3RoPSI1MCIvPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgoKICAgIDxkaXYgY2xhc3M9InJvdyI+CiAgICAgIDxkaXYgc3R5bGU9IndpZHRoOiAzMCU7IGZsb2F0OiBsZWZ0OyI+CiAgICAgICAgKnskbW9kLT5MYW5nKCdmaXJzdF9uYW1lJyl9OgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBzdHlsZT0id2lkdGg6IDY5JTsiPgogICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJ7JGFjdGlvbmlkfWNhcnRfZmlyc3RfbmFtZSIgdmFsdWU9InskcmVjb3JkLmRlc3RfZmlyc3RfbmFtZX0iIHNpemU9IjUwIiBtYXhsZW5ndGg9IjUwIi8+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CgogICAgPGRpdiBjbGFzcz0icm93Ij4KICAgICAgPGRpdiBzdHlsZT0id2lkdGg6IDMwJTsgZmxvYXQ6IGxlZnQ7Ij4KICAgICAgICAqeyRtb2QtPkxhbmcoJ2xhc3RfbmFtZScpfToKICAgICAgPC9kaXY+CiAgICAgIDxkaXYgc3R5bGU9IndpZHRoOiA2OSU7Ij4KICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0ieyRhY3Rpb25pZH1jYXJ0X2xhc3RfbmFtZSIgdmFsdWU9InskcmVjb3JkLmRlc3RfbGFzdF9uYW1lfSIgc2l6ZT0iNTAiIG1heGxlbmd0aD0iNTAiLz4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJyb3ciPgogICAgICA8ZGl2IHN0eWxlPSJ3aWR0aDogMzAlOyBmbG9hdDogbGVmdDsiPgogICAgICAgICp7JG1vZC0+TGFuZygnYWRkcmVzczEnKX06CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IHN0eWxlPSJ3aWR0aDogNjklOyI+CiAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9InskYWN0aW9uaWR9Y2FydF9hZGRyZXNzMSIgdmFsdWU9InskcmVjb3JkLmRlc3RfYWRkcmVzczF9IiBzaXplPSI1MCIgbWF4bGVuZ3RoPSIxMDAiLz4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJyb3ciPgogICAgICA8ZGl2IHN0eWxlPSJ3aWR0aDogMzAlOyBmbG9hdDogbGVmdDsiPgogICAgICAgIHskbW9kLT5MYW5nKCdhZGRyZXNzMicpfToKICAgICAgPC9kaXY+CiAgICAgIDxkaXYgc3R5bGU9IndpZHRoOiA2OSU7Ij4KICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0ieyRhY3Rpb25pZH1jYXJ0X2FkZHJlc3MyIiB2YWx1ZT0ieyRyZWNvcmQuZGVzdF9hZGRyZXNzMn0iIHNpemU9IjUwIiBtYXhsZW5ndGg9IjEwMCIvPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgoKICAgIDxkaXYgY2xhc3M9InJvdyI+CiAgICAgIDxkaXYgc3R5bGU9IndpZHRoOiAzMCU7IGZsb2F0OiBsZWZ0OyI+CiAgICAgICAgKnskbW9kLT5MYW5nKCdjaXR5Jyl9OgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBzdHlsZT0id2lkdGg6IDY5JTsiPgogICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJ7JGFjdGlvbmlkfWNhcnRfY2l0eSIgdmFsdWU9InskcmVjb3JkLmRlc3RfY2l0eX0iIHNpemU9IjUwIiBtYXhsZW5ndGg9IjUwIi8+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CgogICAgPGRpdiBjbGFzcz0icm93Ij4KICAgICAgPGRpdiBzdHlsZT0id2lkdGg6IDMwJTsgZmxvYXQ6IGxlZnQ7Ij4KICAgICAgICAqeyRtb2QtPkxhbmcoJ3N0YXRlJyl9OgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBzdHlsZT0id2lkdGg6IDY5JTsiPgogICAgICAgIHsqPGlucHV0IHR5cGU9InRleHQiIG5hbWU9InskYWN0aW9uaWR9Y2FydF9zdGF0ZSIgdmFsdWU9InskcmVjb3JkLmRlc3Rfc3RhdGV9IiBzaXplPSIyNSIgbWF4bGVuZ3RoPSIyNSIvPip9CiAgICAgICAgPHNlbGVjdCBuYW1lPSJ7JGFjdGlvbmlkfWNhcnRfc3RhdGUiPgogICAgICAgICAge2NnZV9zdGF0ZV9vcHRpb25zIHNlbGVjdG9uZT0kbW9kLT5MYW5nKCdzZWxlY3Rfb25lJykgc2VsZWN0ZWQ9JHJlY29yZC5kZXN0X3N0YXRlfQogICAgICAgIDwvc2VsZWN0PgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgoKICAgIDxkaXYgY2xhc3M9InJvdyI+CiAgICAgIDxkaXYgc3R5bGU9IndpZHRoOiAzMCU7IGZsb2F0OiBsZWZ0OyI+CiAgICAgICAgeyRtb2QtPkxhbmcoJ3Bvc3RhbCcpfToKICAgICAgPC9kaXY+CiAgICAgIDxkaXYgc3R5bGU9IndpZHRoOiA2OSU7Ij4KICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0ieyRhY3Rpb25pZH1jYXJ0X3Bvc3RhbCIgdmFsdWU9InskcmVjb3JkLmRlc3RfcG9zdGFsfSIgc2l6ZT0iMjUiIG1heGxlbmd0aD0iMjUiLz4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJyb3ciPgogICAgICA8ZGl2IHN0eWxlPSJ3aWR0aDogMzAlOyBmbG9hdDogbGVmdDsiPgogICAgICAgICp7JG1vZC0+TGFuZygnY291bnRyeScpfToKICAgICAgPC9kaXY+CiAgICAgIDxkaXYgc3R5bGU9IndpZHRoOiA2OSU7Ij4KICAgICAgICB7KjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJ7JGFjdGlvbmlkfWNhcnRfY291bnRyeSIgdmFsdWU9InskcmVjb3JkLmRlc3RfY291bnRyeX0iIHNpemU9IjI1IiBtYXhsZW5ndGg9IjUwIi8+Kn0KICAgICAgICA8c2VsZWN0IG5hbWU9InskYWN0aW9uaWR9Y2FydF9jb3VudHJ5Ij4KICAgICAgICAgIHtjZ2VfY291bnRyeV9vcHRpb25zIHNlbGVjdG9uZT0kbW9kLT5MYW5nKCdzZWxlY3Rfb25lJykgc2VsZWN0ZWQ9JHJlY29yZC5kZXN0X2NvdW50cnl9CiAgICAgICAgPC9zZWxlY3Q+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CgogICAgPGRpdiBjbGFzcz0icm93Ij4KICAgICAgPGRpdiBzdHlsZT0id2lkdGg6IDMwJTsgZmxvYXQ6IGxlZnQ7Ij4KICAgICAgICB7JG1vZC0+TGFuZygncGhvbmUnKX06CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IHN0eWxlPSJ3aWR0aDogNjklOyI+CiAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9InskYWN0aW9uaWR9Y2FydF9waG9uZSIgdmFsdWU9InskcmVjb3JkLmRlc3RfcGhvbmV9IiBzaXplPSIyNSIgbWF4bGVuZ3RoPSIyNSIvPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgoKICAgIDxkaXYgY2xhc3M9InJvdyI+CiAgICAgIDxkaXYgc3R5bGU9IndpZHRoOiAzMCU7IGZsb2F0OiBsZWZ0OyI+CiAgICAgICAgeyRtb2QtPkxhbmcoJ2ZheCcpfToKICAgICAgPC9kaXY+CiAgICAgIDxkaXYgc3R5bGU9IndpZHRoOiA2OSU7Ij4KICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0ieyRhY3Rpb25pZH1jYXJ0X2ZheCIgdmFsdWU9InskcmVjb3JkLmRlc3RfZmF4fSIgc2l6ZT0iMjUiIG1heGxlbmd0aD0iMjUiLz4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJyb3ciPgogICAgICA8ZGl2IHN0eWxlPSJ3aWR0aDogMzAlOyBmbG9hdDogbGVmdDsiPgogICAgICAgICp7JG1vZC0+TGFuZygnZW1haWwnKX06CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IHN0eWxlPSJ3aWR0aDogNjklOyI+CiAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9InskYWN0aW9uaWR9Y2FydF9lbWFpbCIgdmFsdWU9InskcmVjb3JkLmRlc3RfZW1haWx9IiBzaXplPSI1MCIgbWF4bGVuZ3RoPSIyNTUiLz4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJyb3ciPgogICAgICA8ZGl2IHN0eWxlPSJ3aWR0aDogMzAlOyBmbG9hdDogbGVmdDsiPgogICAgICAgIHskbW9kLT5MYW5nKCdtZXNzYWdlJyl9OgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBzdHlsZT0id2lkdGg6IDY5JTsiPgogICAgICAgIDx0ZXh0YXJlYSBuYW1lPSJ7JGFjdGlvbmlkfWNhcnRfbWVzc2FnZSIgY29scz0iNTAiIHJvd3M9IjgiPnskcmVjb3JkLmRlc3RfbWVzc2FnZX08L3RleHRhcmVhPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgoKICAgIDxkaXYgY2xhc3M9InJvdyI+CiAgICAgIDxkaXYgc3R5bGU9IndpZHRoOiAzMCU7IGZsb2F0OiBsZWZ0OyI+Jm5ic3A7PC9kaXY+CiAgICAgIDxkaXYgc3R5bGU9IndpZHRoOiA2OSU7Ij4KICAgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJ7JGFjdGlvbmlkfWNhcnRfc3VibWl0IiB2YWx1ZT0ieyRtb2QtPkxhbmcoJ3N1Ym1pdCcpfSIvPgogICAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9InskYWN0aW9uaWR9Y2FydF9jYW5jZWwiIHZhbHVlPSJ7JG1vZC0+TGFuZygnY2FuY2VsJyl9Ii8+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CgogIHskZm9ybWVuZH0KICB7KiBmb3JtICp9PC9kaXY+CiAgey9pZn0K]]></data>
	</file>
	<file>
	  <filename>/templates/orig_mycartform_template.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[eyogbXljYXJ0IHZpZXcgdGVtcGxhdGUgKn0KPGRpdiBjbGFzcz0ibXljYXJ0IiBzdHlsZT0iYm9yZGVyOiAxcHggc29saWQgYmxhY2s7Ij4KICA8ZGl2IGNsYXNzPSJyb3ciPgogICAgPGRpdiBzdHlsZT0id2lkdGg6IDMwJTsgZmxvYXQ6IGxlZnQ7Ij4KICAgICAgeyRtb2QtPkxhbmcoJ251bWJlcl9vZl9pdGVtcycpfQogICAgPC9kaXY+CiAgICA8ZGl2IHN0eWxlPSJ3aWR0aDogNjklOyI+CiAgICAgIHskY2FydF9udW1pdGVtc30KICAgIDwvZGl2PgogIDwvZGl2PgoKICA8ZGl2IGNsYXNzPSJyb3ciPgogICAgPGRpdiBzdHlsZT0id2lkdGg6IDMwJTsgZmxvYXQ6IGxlZnQ7Ij4KICAgICAgeyRtb2QtPkxhbmcoJ3dlaWdodCcpfQogICAgPC9kaXY+CiAgICA8ZGl2IHN0eWxlPSJ3aWR0aDogNjklOyI+CiAgICAgIHskY2FydF93ZWlnaHR9eyR3ZWlnaHR1bml0c30KICAgIDwvZGl2PgogIDwvZGl2PgoKICA8ZGl2IGNsYXNzPSJyb3ciPgogICAgPGRpdiBzdHlsZT0id2lkdGg6IDMwJTsgZmxvYXQ6IGxlZnQ7Ij4KICAgICAgeyRtb2QtPkxhbmcoJ3N1YnRvdGFsJyl9CiAgICA8L2Rpdj4KICAgIDxkaXYgc3R5bGU9IndpZHRoOiA2OSU7Ij4KICAgICAgeyRjdXJyZW5jeXN5bWJvbH17JGNhcnRfc3VidG90YWx8bnVtYmVyX2Zvcm1hdDoyfQogICAgPC9kaXY+CiAgPC9kaXY+Cgo8L2Rpdj4KCnsqIHVzZXJzIGNhbiBjdXN0b21pemUgdGhpcyB0ZW1wbGF0ZSwgYW5kIHVzZSB0aGUgY21zX3NlbGZsaW5rIHRhZyB0byBhZGQgaW1hZ2UgYnV0dG9ucyBvciBsaW5rcyB0byBwYWdlcyB0aGF0IGNvbnRhaW4KICAgdmlldyBjYXJ0IGFiaWxpdGllcy4uLiBvciB0byBhIGNoZWNrb3V0IHBhZ2UgKn0K]]></data>
	</file>
	<file>
	  <filename>/templates/orig_mycartslist_template.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[eyogbXkgY2FydHMgbGlzdCB0ZW1wbGF0ZSAqfQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CjwhLS0KZnVuY3Rpb24gdG9nZ2xlX2V4cGFuZCh0aGVfaWR4LG5hbWUpCntsZGVsaW19CiAgdmFyIGFsbGVscyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKG5hbWUpOwogIHZhciBvbmVlbCAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChuYW1lK3RoZV9pZHgpOwogIHsqIGNvbGxhcHNlIGV2ZXJ5dGhpbmcgKn0KICBmb3IoIHZhciBpID0gMDsgaSA8IGFsbGVscy5sZW5ndGg7IGkrKyApCiAge2xkZWxpbX0KICAgIGFsbGVsc1tpXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogIHtyZGVsaW19CgogIHsqIGV4cGFuZCBqdXN0IHRoZSBvbmUgd2Ugd2FudCAqfQogIG9uZWVsLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOwp7cmRlbGltfQovLy0tPgo8L3NjcmlwdD4KCiAgeyogZGlzcGxheSBhIGJ1dHRvbiB0byBsb2FkIGRhdGEsIGFuZCByZXN0b3JlIGRhdGEgKn0KICA8ZGl2IHN0eWxlPSJtYXJnaW4tYm90dG9tOiAxLjVlbTsgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7Ij4KICB7aWYgJGNjdXNlci0+bG9nZ2VkaW4oKX0KICAgIHttb2R1bGVfYWN0aW9uX2xpbmsgbW9kdWxlPSdHaWZ0QmFza2V0cycgYWN0aW9uPSdsb2FkaW5mbycgdGV4dD0nTG9hZCBteSBjYXJ0J308YnIvPgogICAge21vZHVsZV9hY3Rpb25fbGluayBtb2R1bGU9J0dpZnRCYXNrZXRzJyBhY3Rpb249J3NhdmVpbmZvJyB0ZXh0PSdTYXZlIG15IGNhcnQnfTxici8+CiAge2Vsc2V9CiAgICA8cD5Zb3UgYXJlIG5vdCBsb2dnZWQgaW4uLi4uLiBpZiB5b3Ugd2VyZSBhIHJlZ2lzdGVyZWQsIGxvZ2dlZCBpbiB1c2VyLCB0aGVuIHlvdSBjb3VsZAogICAgc2F2ZSB5b3VyIGNhcnQgYW5kIHNoaXBwaW5nIGluZm9ybWF0aW9uIGZvciBmdXR1cmUgdXNlLjwvcD4KICAgIDxwPkdvIHtjbXNfc2VsZmxpbmsgcGFnZT0ncmVnaXN0ZXInIHRleHQ9J0hlcmUnfSB0byByZWdpc3Rlci4gIE9yIGlmIHlvdSBoYXZlIGFscmVhZHkgcmVnaXN0ZXJlZCwgY2xpY2sge2Ntc19zZWxmbGluayBwYWdlPSdsb2dpbicgdGV4dD0naGVyZSd9IHRvIGxvZ2luPC9wPgogIHsvaWZ9CiAgPC9kaXY+CgoKICB7aWYgIWlzc2V0KCRlbnRyaWVzKX0KICAgIHskbW9kLT5MYW5nKCdlcnJvcl9ub2NhcnRzZGVmaW5lZCcpfQogIHtlbHNlfQogICAgeyogZGlzcGxheSB0aGUgZW50cmllcyAqfQogICAge2ZvcmVhY2ggZnJvbT0kZW50cmllcyBpdGVtPSdvbmUnIG5hbWU9J2VudHJ5J30KICAgIDxkaXYgc3R5bGU9Im1hcmdpbi1ib3R0b206IDEuNWVtOyI+CiAgICAgIDxoNSBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMC4yNWVtOyI+eyRvbmUuY2FydF9uYW1lfTo8L2g1PgogICAgICA8YSBocmVmPSJ7JG9uZS5kZWxldGVjYXJ0X3VybH0iIG9uY2xpY2s9InJldHVybiBjb25maXJtKCd7JG1vZC0+TGFuZygnY29uZmlybV9kZWxldGUnKX0nKTsiPnskbW9kLT5MYW5nKCdkZWxldGUnKX08L2E+PGJyLz4KICAgICAgPHN0cm9uZz48YSBocmVmPSJqYXZhc2NyaXB0OnRvZ2dsZV9leHBhbmQoeyRzbWFydHkuZm9yZWFjaC5lbnRyeS5pbmRleH0sJ2NhcnRzdW1tYXJ5Jyk7Ij57JG1vZC0+TGFuZygnc3VtbWFyeScpfTwvYT46PC9zdHJvbmc+PGJyLz4KICAgICAgPGRpdiBuYW1lPSJjYXJ0c3VtbWFyeSIgaWQ9ImNhcnRzdW1tYXJ5eyRzbWFydHkuZm9yZWFjaC5lbnRyeS5pbmRleH0iIHN0eWxlPSJkaXNwbGF5OiBub25lOyI+CiAgICAgICAgPGVtPnskbW9kLT5MYW5nKCdudW1iZXJfb2ZfaXRlbXMnKX06PC9lbT4mbmJzcDt7JG9uZS5udW1faXRlbXN9PGJyLz4KICAgICAgICA8ZW0+eyRtb2QtPkxhbmcoJ3N1YnRvdGFsJyl9OjxlbT4mbmJzcDt7JGN1cnJlbmN5X3N5bWJvbH17JG9uZS5jYXJ0LT5zdWJ0b3RhbHxudW1iZXJfZm9ybWF0OjJ9PGJyLz4KICAgICAgICA8ZW0+eyRtb2QtPkxhbmcoJ3dlaWdodCcpfTo8ZW0+Jm5ic3A7eyRvbmUuY2FydC0+d2VpZ2h0fG51bWJlcl9mb3JtYXQ6Mn17JHdlaWdodF91bml0c308YnIvPgogICAgICAgIHtpZiAkb25lLm51bV9pdGVtcyA+IDB9CiAgICAgICAgICA8YSBocmVmPSJ7JG9uZS5lZGl0Y2FydF91cmx9Ij57JG1vZC0+TGFuZygnZWRpdCcpfTwvYT48YnIvPgogICAgICAgIHsvaWZ9CiAgICAgIDwvZGl2PgoKICAgICAgPHN0cm9uZz48YSBocmVmPSJqYXZhc2NyaXB0OnRvZ2dsZV9leHBhbmQoeyRzbWFydHkuZm9yZWFjaC5lbnRyeS5pbmRleH0sJ2NhcnRzaGlwcGluZycpOyI+eyRtb2QtPkxhbmcoJ3NoaXBwaW5nX2luZm8nKX08L2E+Ojwvc3Ryb25nPjxici8+CgogICAgICA8ZGl2IG5hbWU9ImNhcnRzaGlwcGluZyIgaWQ9ImNhcnRzaGlwcGluZ3skc21hcnR5LmZvcmVhY2guZW50cnkuaW5kZXh9IiBzdHlsZT0iZGlzcGxheTogbm9uZTsiPgogICAgICB7aWYgZW1wdHkoJG9uZS5kZXN0X2ZpcnN0X25hbWUpfQogICAgICAgIDxlbT57JG1vZC0+bGFuZygnbm90X2VudGVyZWQnKX08L2VtPjxici8+CiAgICAgICAgPGEgaHJlZj0ieyRvbmUuZWRpdHNoaXBwaW5nX3VybH0iPnskbW9kLT5MYW5nKCdlZGl0Jyl9PC9hPgogICAgICB7ZWxzZX0KICAgICAgICA8ZW0+eyRtb2QtPkxhbmcoJ2NvbXBhbnknKX06PC9lbT4mbmJzcDt7JG9uZS5jb21wYW55fTxici8+CiAgICAgICAgPGVtPnskbW9kLT5MYW5nKCdmaXJzdF9uYW1lJyl9OjwvZW0+Jm5ic3A7eyRvbmUuZGVzdF9maXJzdF9uYW1lfTxici8+CiAgICAgICAgPGVtPnskbW9kLT5MYW5nKCdsYXN0X25hbWUnKX06PC9lbT4mbmJzcDt7JG9uZS5kZXN0X2xhc3RfbmFtZX08YnIvPgogICAgICAgIDxlbT57JG1vZC0+TGFuZygnYWRkcmVzczEnKX06PC9lbT4mbmJzcDt7JG9uZS5kZXN0X2FkZHJlc3MxfTxici8+CiAgICAgICAgPGVtPnskbW9kLT5MYW5nKCdhZGRyZXNzMicpfTo8L2VtPiZuYnNwO3skb25lLmRlc3RfYWRkcmVzczJ9PGJyLz4KICAgICAgICA8ZW0+eyRtb2QtPkxhbmcoJ2NpdHknKX06PC9lbT4mbmJzcDt7JG9uZS5kZXN0X2NpdHl9PGJyLz4KICAgICAgICA8ZW0+eyRtb2QtPkxhbmcoJ3N0YXRlJyl9OjwvZW0+Jm5ic3A7eyRvbmUuZGVzdF9zdGF0ZX08YnIvPgogICAgICAgIDxlbT57JG1vZC0+TGFuZygncG9zdGFsJyl9OjwvZW0+Jm5ic3A7eyRvbmUuZGVzdF9wb3N0YWx9PGJyLz4KICAgICAgICA8ZW0+eyRtb2QtPkxhbmcoJ2NvdW50cnknKX06PC9lbT4mbmJzcDt7JG9uZS5kZXN0X2NvdW50cnl9PGJyLz4KICAgICAgICA8ZW0+eyRtb2QtPkxhbmcoJ3Bob25lJyl9OjwvZW0+Jm5ic3A7eyRvbmUuZGVzdF9waG9uZX08YnIvPgogICAgICAgIDxlbT57JG1vZC0+TGFuZygnZmF4Jyl9OjwvZW0+Jm5ic3A7eyRvbmUuZGVzdF9mYXh9PGJyLz4KICAgICAgICA8ZW0+eyRtb2QtPkxhbmcoJ2VtYWlsJyl9OjwvZW0+Jm5ic3A7eyRvbmUuZGVzdF9lbWFpbH08YnIvPgogICAgICAgIDxhIGhyZWY9Inskb25lLmVkaXRzaGlwcGluZ191cmx9Ij57JG1vZC0+TGFuZygnZWRpdCcpfTwvYT4KICAgICAgey9pZn0KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4gIAogICAgey9mb3JlYWNofQogIHsvaWZ9Cg==]]></data>
	</file>
	<file>
	  <filename>/templates/orig_product_summary_template.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[eyogcHJvZHVjdCBzdW1tYXJ5IHRlbXBsYXRlICp9CnsqIHVzZWQgZm9yIHN1bW1hcml6aW5nIHByb2R1Y3RzIGluIHZpZXcgY2FydCBmb3JtIHBhZ2UgKn0KPHN0cmlwPgp7JG9uZXByb2R1Y3QucHJvZHVjdF9uYW1lfSZuYnNwOwp7Zm9yZWFjaCBmcm9tPSRtZXRhLT5hdHRyaWJ1dGVzIGl0ZW09J2F0dHJpYid9CiAgeyRhdHRyaWItPm5hbWV9Jm5ic3A7e2lmICRhdHRyaWItPmFkanVzdG1lbnQgIT0gMH17JGN1cnJlbmN5c3ltYm9sfSh7JGF0dHJpYi0+YWRqdXN0bWVudHxudW1iZXJfZm9ybWF0OjJ9KXsvaWZ9Jm5ic3A7CnsvZm9yZWFjaH0KPC9zdHJpcD4=]]></data>
	</file>
	<file>
	  <filename>/templates/orig_viewcartform_template.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[eyogdmlld2NhcnRmb3JtIHRlbXBsYXRlICp9CjxkaXYgY2xhc3M9InZpZXdjYXJ0Zm9ybSI+CnsqIGlmIHRoZSBzbWFydHkgdmFyaWFibGUgb3JkZXJzX3NpbXBsZXZpZXdjYXJ0IGlzIG5vdCBzZXQsIAogICB0aGVuIGRvbid0IHByb3ZpZGUgYSBmb3JtIGZvciBhZGp1c3RpbmcgcXVhbnRpdGllcyAKKn0Ke2lmICFpc3NldCgkY2FydCkgfHwgY291bnQoJGNhcnQtPml0ZW1zKSA9PSAwIH0KICB7JG1vZC0+TGFuZygnY2FydF9lbXB0eScpfQp7ZWxzZX0Ke2lmIGlzc2V0KCRmb3Jtc3RhcnQpICYmICFpc3NldCgkb3JkZXJzX3NpbXBsZXZpZXdjYXJ0KX17JGZvcm1zdGFydH17L2lmfQoKe2ZvcmVhY2ggZnJvbT0kY2FydC0+aXRlbXMgaXRlbT0nb25laXRlbScgbmFtZT0nb25laXRlbSd9CjxkaXYgY2xhc3M9ImNhcnRpdGVtIj4KICA8ZGl2IGNsYXNzPSJpdGVtZGVzYyI+CiAgICAgeyRvbmVpdGVtLT5nZXRfc3VtbWFyeSgpfQogICAgIHsqIFByb2R1Y3RzIGFjdGlvbj0nZGV0YWlscycgcHJvZHVjdGlkPSRvbmVpdGVtLT5nZXRfcHJvZHVjdF9pZCgpICp9CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0iaXRlbXF1YW50aXR5Ij4KICAgICB7JG1vZC0+TGFuZygncXVhbnRpdHknKX06Jm5ic3A7eyRvbmVpdGVtLT5nZXRfcXVhbnRpdHkoKX0KICA8L2Rpdj4KICA8ZGl2IGNsYXNzPSJpdGVtcHJpY2UiPgogICAgIHskbW9kLT5MYW5nKCdwcmljZScpfTombmJzcDsKICAgICB7aWYgaXNzZXQoJG9yZGVyc19zaW1wbGV2aWV3Y2FydCl9CiAgICAgICB7JG9uZWl0ZW0tPmdldF9xdWFudGl0eSgpfQogICAgIHtlbHNlfQogICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9Inskb25laXRlbS0+cXVhbnRpdHlfZmxkbmFtZX0iIHZhbHVlPSJ7JG9uZWl0ZW0tPmdldF9xdWFudGl0eSgpfSIgc2l6ZT0iMyIgbWF4bGVuZ3RoPSIzIj4KICAgICB7L2lmfQogICAgICZuYnNwO0AmbmJzcDt7JGN1cnJlbmN5c3ltYm9sfXskb25laXRlbS0+Z2V0X3VuaXRfcHJpY2UoKXxudW1iZXJfZm9ybWF0OjJ9CiAgPC9kaXY+CiAgPGRpdj4KICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJ7JGFjdGlvbmlkfWNhcnRfZGVsZXRlX3skc21hcnR5LmZvcmVhY2gub25laXRlbS5pbmRleH0iIHZhbHVlPSJ7JG1vZC0+TGFuZygncmVtb3ZlJyl9IiAvPgogIDwvZGl2Pgo8L2Rpdj4Key9mb3JlYWNofQoKPGRpdiBjbGFzcz0iY2FydF90b3RhbHMiPgogIHskbW9kLT5MYW5nKCd0b3RhbF93ZWlnaHQnKX06IHskY2FydC0+d2VpZ2h0fG51bWJlcl9mb3JtYXQ6Mn17JHdlaWdodHVuaXRzfTxici8+CiAgeyRtb2QtPkxhbmcoJ3N1YnRvdGFsJyl9OiB7JGN1cnJlbmN5c3ltYm9sfXskY2FydC0+c3VidG90YWx8bnVtYmVyX2Zvcm1hdDoyfTxici8+CiAge2lmIGlzc2V0KCRmb3Jtc3RhcnQpICYmICFpc3NldCgkb3JkZXJzX3NpbXBsZXZpZXdjYXJ0KX0KICA8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJ7JHN1Ym1pdF9uYW1lfSIgdmFsdWU9InskbW9kLT5MYW5nKCdzdWJtaXQnKX0iLz4KICB7L2lmfQo8L2Rpdj4Ke2lmIGlzc2V0KCRmb3Jtc3RhcnQpICYmICFpc3NldCgkb3JkZXJzX3NpbXBsZXZpZXdjYXJ0KX17JGZvcm1lbmR9ey9pZn0Key9pZn0KPCEtLSB2aWV3Y2FydGZvcm0gLS0+PC9kaXY+Cg==]]></data>
	</file>
	<file>
	  <filename>/templates/table_viewcartform_template.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[cnRmb3JtIHRlbXBsYXRlICp9Cjx0YWJsZSBjbGFzcz0icGFnZXRhYmxlIiBjZWxsc3BhY2luZz0iMCI+CiAgPHRoZWFkPgogICAgIDx0cj4KICAgICAgICA8dGg+eyRtb2QtPkxhbmcoJ251bWJlcicpfTwvdGg+CiAgICAgICAgPHRoPnskbW9kLT5MYW5nKCdwcm9kdWN0X2lkJyl9PC90aD4KICAgICAgICA8dGg+eyRtb2QtPkxhbmcoJ2Rlc2NyaXB0aW9uJyl9PC90aD4KICAgICAgICA8dGg+eyRtb2QtPkxhbmcoJ3F1YW50aXR5Jyl9PC90aD4KICAgICAgICA8dGg+eyRtb2QtPkxhbmcoJ3VuaXRfcHJpY2UnKX08L3RoPiAKICAgICAgICA8dGg+eyRtb2QtPkxhbmcoJ3dlaWdodCcpfTwvdGg+CiAgICAgICAgPHRoPnskbW9kLT5MYW5nKCdhbW91bnQnKX08L3RoPgogICAgIDwvdHI+CiAgPC90aGVhZD4KICA8dGJvZHk+CiAge2ZvcmVhY2ggZnJvbT0kY2FydGl0ZW1zIGl0ZW09J29uZWl0ZW0nIG5hbWU9J2xvb3AnfQogICAge2N5Y2xlIHZhbHVlcz0icm93MSxyb3cyIiBhc3NpZ249J3Jvd2NsYXNzJ30KICAgIDx0ciBjbGFzcz0ieyRyb3djbGFzc30iIG9ubW91c2VvdmVyPSJ0aGlzLmNsYXNzTmFtZT0neyRyb3djbGFzc31ob3Zlcic7IiBvbm1vdXNlb3V0PSJ0aGlzLmNsYXNzTmFtZT0neyRyb3djbGFzc30nOyI+CiAgICAgICAgPHRkPnskc21hcnR5LmZvcmVhY2gubG9vcC5pbmRleH08L3RkPgogICAgICAgIDx0ZD57JG9uZWl0ZW0tPnByb2R1Y3RfaWR9PC90ZD4KICAgICAgICA8dGQ+eyRvbmVpdGVtLT5zdW1tYXJ5fTwvdGQ+CiAgICAgICAgPHRkPnskb25laXRlbS0+cXVhbnRpdHl9PC90ZD4KICAgICAgICA8dGQ+eyRvbmVpdGVtLT51bml0X3ByaWNlfG51bWJlcl9mb3JtYXQ6Mn08L3RkPgogICAgICAgIDx0ZD57JG9uZWl0ZW0tPndlaWdodH08L3RkPgogICAgICAgPHRkPnskY3VycmVuY3lzeW1ib2x9eyRvbmVpdGVtLT5xdWFudGl0eSokb25laXRlbS0+dW5pdF9wcmljZXxudW1iZXJfZm9ybWF0OjJ9PC90ZD4KICAgIDwvdHI+CiAgey9mb3JlYWNofQogIDx0cj4KICAgICA8dGQgY29sc3Bhbj0iNSI+PHNwYW4gc3R5bGU9InRleHQtYWxpZ246IHJpZ2h0OyI+eyRtb2QtPkxhbmcoJ3N1YnRvdGFsJyl9PC90ZD4KICAgICA8dGQ+eyRjYXJ0d2VpZ2h0fG51bWJlcl9mb3JtYXQ6Mn17JHdlaWdodHVuaXRzfTwvdGQ+CiAgICAgPHRkPnskY3VycmVuY3lzeW1ib2x9eyRjYXJ0c3VidG90YWx8bnVtYmVyX2Zvcm1hdDoyfTwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICAgPHRkIGNvbHNwYW49IjUiPjxzcGFuIHN0eWxlPSJ0ZXh0LWFsaWduOiByaWdodDsiPnskbW9kLT5MYW5nKCdzaGlwcGluZycpfTwvdGQ+CiAgICAgPHRkPiA8L3RkPgogICAgIDx0ZD57JGN1cnJlbmN5c3ltYm9sfXskc2hpcHBpbmdfcHJpY2VsfG51bWJlcl9mb3JtYXQ6Mn08L3RkPgogIDwvdHI+CiAge2ZvcmVhY2ggZnJvbT0kY2FydHRheGVzIGtleT0nbmFtZScgaXRlbT0nYW10J30KICAgIHtpZiAhZW1wdHkoJG5hbWUpfQogICAgICA8dHI+CiAgICAgICAgPHRkIGNvbHNwYW49IjUiPjxzcGFuIHN0eWxlPSJ0ZXh0LWFsaWduOiByaWdodDsiPnskbmFtZX08L3RkPgogICAgICAgIDx0ZD4gPC90ZD4KICAgICAgICA8dGQ+eyRjdXJyZW5jeXN5bWJvbH17JGFtdHxudW1iZXJfZm9ybWF0OjJ9PC90ZD4KICAgICA8L3RyPgogICAgey9pZn0KICB7L2ZvcmVhY2h9CiAgPHRyPgogICAgPHRkIGNvbHNwYW49IjUiPjxzcGFuIHN0eWxlPSJ0ZXh0LWFsaWduOiByaWdodDsiPnskbW9kLT5MYW5nKCd0b3RhbCcpfTwvdGQ+CiAgICA8dGQ+IDwvdGQ+CiAgICA8dGQ+eyRjdXJyZW5jeXN5bWJvbH17JGNhcnR0b3RhbHxudW1iZXJfZm9ybWF0OjJ9PC90ZD4KICA8L3RyPgogICA8L3Rib2R5Pgo8L3RhYmxlPgoK]]></data>
	</file>
	<file>
	  <filename>/templates/templates_tab.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PHA+eyRpbmZvfTwvcD4KPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICB7JGZvcm19CjwvZGl2Pg==]]></data>
	</file>
</module>
