<?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>FEU_Auth_LDAP</name>
	<version>1.0</version>
  <mincmsversion>1.6.7</mincmsversion>
	<help><![CDATA[PGgzPldoYXQgRG9lcyBUaGlzIERvPzwvaDM+CjxwPlRoaXMgbW9kdWxlIHByb3ZpZGVzIHRoZSBhYmlsaXR5IGZvciB2aXNpdG9ycyB0byB5b3VyIHdlYnNpdGUgdG8gYXV0aGVudGljYXRlIGFnYWluc3QgYW4gTERBUCBzZXJ2ZXIgKGluY2x1ZGluZyBPcGVuTERBUCBhbmQgQWN0aXZlIERpcmVjdG9yeSkuICBQcm92aWRpbmcgYSBzaW5nbGUgcG9pbnQgb2YgbWFpbnRlbmFuY2UgZm9yIHVzZXJuYW1lcyBhbmQgcGFzc3dvcmRzIGluIGFuIGludHJhbmV0IGVudmlyb25tZW50LiAgVGhpcyBtb2R1bGUgYWxzbyBzdXBwb3J0cyBOVExNIHNpbmdsZSBzaWduIG9uIGluIGEgc3VpdGFibHkgY29uZmlndXJlZCBlbnZpcm9ubWVudDwvcD4KPHA+VGhpcyBtb2R1bGUgZG9lcyBOT1QgcHJvdmlkZSB0d28gd2F5IHNpbmNpbmcgb2YgdXNlciBpbmZvcm1hdGlvbiwgb25seSBvbmUgd2F5IGF1dGhlbnRpY2F0aW9uLiAgVXNlciBhdHRyaWJ1dGVzIHN1Y2ggYXMgdGVsZXBob25lIG51bWJlciwgYW5kIGRlcGFydG1lbnQgYXJlIE5PVCBSZXRyaWV2ZWQgZnJvbSB0aGUgTERBUCBzZXJ2ZXIgYW5kIHBvcHVsYXRlZCBpbnRvIHRoZSBGRVUgZGF0YWJhc2UuICBTaW1pbGFybHksIGNoYW5nZXMgdG8gdXNlciBzZXR0aW5ncyBpbiB0aGUgRkVVIGRhdGFiYXNlIGFyZSBOT1Qgc3luY2VkIGJhY2sgdG8gdGhlIExEQVAgc2VydmVyLjwvcD4KPGgzPkZlYXR1cmVzPC9oMz4KPHVsPgogIDxsaT5TdXBwb3J0cyBPcGVuTERBUCBhbmQgQWN0aXZlIERpcmVjdG9yeTwvbGk+CiAgPGxpPlN1cHBvcnRzIGFub255bW91cyBxdWVyaWVzIHRvIHRoZSBMREFQIHNlcnZlcjwvbGk+CiAgPGxpPlN1cHBvcnRzIG11bHRpcGxlIExEQVAgc2VydmVycy48L2xpPgogIDxsaT5TdXBwb3J0cyBOVExNIFNpZ25sZSBTaWdub24gPGVtPlRoZSB1c2VyIG11c3QgaGF2ZSBjb25maWd1cmVkIHRoaXMgYXBwcm9wcmlhdGVseSBpbiBhcGFjaGUgYW5kIGluIGhpcyBuZXR3b3JrIGFuZCBicm93c2VyIHNldHRpbmdzLjwvbGk+CiAgPGxpPlN1cHBvcnRzIGF1dGhlbnRpY2F0aW9uIHZpYSBiaW5kIG9yIHZpYSBwYXNzd29yZCBhdXRoZW50aWNhdGlvbi48L2xpPgogIDxsaT5TdXBwb3J0cyBkaWZmZXJlbnQgU0hBIGFuZCBNRDUgcGFzc3dvcmQgZW5jcnlwdGlvbiBtZWNoYW5pc21zLjwvbGk+CiAgPGxpPlN1cHBvcnRzIGEgdmFyaWV0eSBvZiBncm91cCBhdXRoZW50aWNhdGlvbiBzY2hlbWFzLjwvbGk+CiAgPGxpPm1vcmUuLi48L2xpPgo8L3VsPgo8aDM+SG93IGRvIEkgdXNlIGl0PC9oMz4KPHA+PHN0cm9uZyBzdHlsZT0iY29sb3I6IHJlZDsiPkltcG9ydGFudDo8L3N0cm9uZz4gVGhpcyBtb2R1bGUgaXMgZm9yIHVzZSBvbiBpbnRyYW50ZXRzIGFuZCBvdGhlciBwcml2YXRlIG5ldHdvcmtzLiAgVGhlIGV4YWN0IGNvbmZpZ3VyYXRpb24gcmVxdWlyZWQgdG8gaW50ZXJmYWNlIHdpdGggYW4gTERBUCBzZXJ2ZXIgbWF5IHZhcnkgZm9yIGVhY2ggaW5zdGFsbGF0aW9uLiAgWW91IG11c3QgaGF2ZSBzaWduaWZpY2FudCBrbm93bGVkZ2UsIGFuZCBhY2Nlc3Mgb3ZlciB5b3VyIGVudmlyb25tZW50IHRvIGJlIGFibGUgdG8gdXRpbGl6ZSB0aGlzIG1vZHVsZS48L3A+CjxwPlRvIGVuYWJsZSB0aGlzIG1vZHVsZSB5b3UgbXVzdCBwcm9wZXJseSBjb25maWd1cmUgdGhlIHNldHRpbmdzLCBpbiB0aGUgRkVVX0F1dGhfTERBUCBhZG1pbmlzdHJhdGlvbiBwYW5lbCwgYW5kIHRoZW4gc2VsZWN0IHRoaXMgbW9kdWxlIGFzIHlvdXIgJnF1b3Q7QXV0aGVudGljYXRpb24gTW9kdWxlL01ldGhvZCZxdW90OyBJbiB0aGUgRkVVIGFkbWluaXN0cmF0aW9uIHBhbmVsLiAgQWZ0ZXIgdGhhdCB0aW1lIHVzZXJzIHNob3VsZCBhdXRoZW50aWNhdGUgYWdhaW5zdCB5b3VyIExEQVAgc2VydmVyLjwvcD4KPGgzPlJlcXVpcmVtZW50czwvaDM+CjxwPlRoaXMgbW9kdWxlIHJlcXVpcmVzIHRoYXQgdGhlIGxkYXAgZnVuY3Rpb25hbGl0eSBiZSBlbmFibGVkIGluIHlvdXIgcGhwIGVudmlyb25tZW50LjwvcD4KPGgzPlN1cHBvcnQ8L2gzPgo8cD48c3Ryb25nIHN0eWxlPSJjb2xvcjogcmVkOyI+Tm90ZTo8L3N0cm9uZz5UaGUgYXV0aG9yIHdpbGwgTk9UIHJlc3BvbmQgdG8gc3VwcG9ydCBxdWVzdGlvbnMgYXMgdG8gaG93IHRvIGNvbmZpZ3VyZSB5b3VyIGxvY2FsIG5ldHdvcmssIHdlYiBzZXJ2ZXIsIG9yIGJyb3dzZXIgaW4gb3JkZXIgdG8gdXRpbGl6ZSB0aGlzIG1vZHVsZS4gIE9ubHkgdG8gc3BlY2lmaWMgaXNvbGF0ZWQsIHJlcHJvZHVjYWJsZSBpc3N1ZXMgcmVsYXRpbmcgZXhwbGljaXRseSB0byB0aGUgbW9kdWxlLjwvcD4KPHA+VGhpcyBtb2R1bGUgZG9lcyBub3QgaW5jbHVkZSBjb21tZXJjaWFsIHN1cHBvcnQuIEhvd2V2ZXIsIHRoZXJlIGFyZSBhIG51bWJlciBvZiByZXNvdXJjZXMgYXZhaWxhYmxlIHRvIGhlbHAgeW91IHdpdGggaXQ6PC9wPgo8dWw+CjxsaT5Gb3IgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoaXMgbW9kdWxlLCBGQVFzLCBvciB0byBmaWxlIGEgQnVnIFJlcG9ydCBvciBidXkgY29tbWVyY2lhbCBzdXBwb3J0LCBwbGVhc2UgdmlzaXQgY2FsZ3V5XCdzCm1vZHVsZSBob21lcGFnZSBhdCA8YSBocmVmPSJodHRwOi8vY2FsZ3V5MTAwMC5jb20iPmNhbGd1eTEwMDAuY29tPC9hPi48L2xpPgo8bGk+QWRkaXRpb25hbCBkaXNjdXNzaW9uIG9mIHRoaXMgbW9kdWxlIG1heSBhbHNvIGJlIGZvdW5kIGluIHRoZSA8YSBocmVmPSJodHRwOi8vZm9ydW0uY21zbWFkZXNpbXBsZS5vcmciPkNNUyBNYWRlIFNpbXBsZSBGb3J1bXM8L2E+LjwvbGk+CjxsaT5UaGUgYXV0aG9yLCBjYWxndXkxMDAwLCBjYW4gb2Z0ZW4gYmUgZm91bmQgaW4gdGhlIDxhIGhyZWY9ImlyYzovL2lyYy5mcmVlbm9kZS5uZXQvI2NtcyI+Q01TIElSQyBDaGFubmVsPC9hPi48L2xpPgo8bGk+TGFzdGx5LCB5b3UgbWF5IGhhdmUgc29tZSBzdWNjZXNzIGVtYWlsaW5nIHRoZSBhdXRob3IgZGlyZWN0bHkuPC9saT4gIAo8L3VsPgo8aDM+Q29weXJpZ2h0IGFuZCBMaWNlbnNlPC9oMz4KPHA+Q29weXJpZ2h0ICZjb3B5OyAyMDA4LCBSb2JlcnQgQ2FtcGJlbCA8YSBocmVmPSJtYWlsdG86Y2FsZ3V5MTAwMEBjbXNtYWRlc2ltcGxlLm9yZyI+Jmx0O2NhbGd1eTEwMDBAY21zbWFkZXNpbXBsZS5vcmcmZ3Q7PC9hPi4gQWxsIFJpZ2h0cyBBcmUgUmVzZXJ2ZWQuPC9wPgo8cD5UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQppdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQp0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgooYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLjwvcD4KPHA+SG93ZXZlciwgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR1BMLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkCmFzIGFuIGFkZG9uIG1vZHVsZSB0byBDTVMgTWFkZSBTaW1wbGUuICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBzb2Z0d2FyZQppbiBhbnkgTm9uIEdQTCB2ZXJzaW9uIG9mIENNUyBNYWRlIHNpbXBsZSwgb3IgaW4gYW55IHZlcnNpb24gb2YgQ01TCk1hZGUgc2ltcGxlIHRoYXQgZG9lcyBub3QgaW5kaWNhdGUgY2xlYXJseSBhbmQgb2J2aW91c2x5IGluIGl0cyBhZG1pbiAKc2VjdGlvbiB0aGF0IHRoZSBzaXRlIHdhcyBidWlsdCB3aXRoIENNUyBNYWRlIHNpbXBsZS48L3A+CjxwPlRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLApidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgpNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCkdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCllvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCmFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCkZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCk9yIHJlYWQgaXQgPGEgaHJlZj0iaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMIj5vbmxpbmU8L2E+PC9wPjxoMz5EZXBlbmRlbmNpZXM8L2gzPjx1bD48bGk+Q0dFeHRlbnNpb25zID0mZ3Q7IDEuMTk8L2xpPjxsaT5Gcm9udEVuZFVzZXJzID0mZ3Q7IDEuMTA8L2xpPjwvdWw+PGgzPlBhcmFtZXRlcnM8L2gzPjx1bD48bGk+PGVtPihvcHRpb25hbCk8L2VtPiBsYW5nPSJlbl9VUyIgLSBQYXJhbWV0ZXIgaXMgdXNlZCB0byBzcGVjaWZ5IHdoYXQgbGFuZ3VhZ2UgdG8gdXNlIGZvciBkaXNwbGF5IG9uIHRoZSBmcm9udGVuZC4gTm90IGFsbCBtb2R1bGVzIHN1cHBvcnQgb3IgbmVlZCB0aGlzLjwvbGk+PC91bD4=]]></help>
	<about><![CDATA[PGJyIC8+QXV0aG9yOiBjYWxndXkxMDAwICZsdDtjYWxndXkxMDAwQGNtc21hZGVzaW1wbGUub3JnJmd0OzxiciAvPjxiciAvPlZlcnNpb246IDEuMDxiciAvPg==]]></about>
	<description><![CDATA[An addon module for FEU to authenticate against an LDAP or ActiveDirectory server]]></description>
	<requires>
	  <requiredname>CGExtensions</requiredname>
	  <requiredversion>1.19</requiredversion>
	</requires>
	<requires>
	  <requiredname>FrontEndUsers</requiredname>
	  <requiredversion>1.10</requiredversion>
	</requires>
	<file>
	  <filename>/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/action.admin_set_adv_settings.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKI0JFR0lOX0xJQ0VOU0UKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IEZFVV9BdXRoX0xEQVAgKGMpIDIwMTAgYnkgUm9iZXJ0IENhbXBiZWxsIAojICAgICAgICAgKGNhbGd1eTEwMDBAY21zbWFkZXNpbXBsZS5vcmcpCiMgIEFuIGFkZG9uIG1vZHVsZSBmb3IgQ01TIE1hZGUgU2ltcGxlIHRvIGFsbG93IGEgc2Vjb25kYXJ5IHR5cGUgb2YgCiMgIGF1dGhlbnRpY2F0aW9uIHRvIHRoZSBGRVUgbW9kdWxlLiAgVGhpcyBhZGRvbiBhbGxvd3MgdXNpbmcgdGhlIGFwYWNoZQojICBCQVNJQyBhdXRoZW50aWNhdGlvbi4KIyAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMDUgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQojIFRoaXMgcHJvamVjdCdzIGhvbWVwYWdlIGlzOiBodHRwOi8vd3d3LmNtc21hZGVzaW1wbGUub3JnCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIwojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgojIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBIb3dldmVyLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHUEwsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQKIyBhcyBhbiBhZGRvbiBtb2R1bGUgdG8gQ01TIE1hZGUgU2ltcGxlLiAgWW91IG1heSBub3QgdXNlIHRoaXMgc29mdHdhcmUKIyBpbiBhbnkgTm9uIEdQTCB2ZXJzaW9uIG9mIENNUyBNYWRlIHNpbXBsZSwgb3IgaW4gYW55IHZlcnNpb24gb2YgQ01TCiMgTWFkZSBzaW1wbGUgdGhhdCBkb2VzIG5vdCBpbmRpY2F0ZSBjbGVhcmx5IGFuZCBvYnZpb3VzbHkgaW4gaXRzIGFkbWluIAojIHNlY3Rpb24gdGhhdCB0aGUgc2l0ZSB3YXMgYnVpbHQgd2l0aCBDTVMgTWFkZSBzaW1wbGUuCiMKIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQojIE9yIHJlYWQgaXQgb25saW5lOiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwKIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojRU5EX0xJQ0VOU0UKaWYoICFpc3NldCgkZ0NtcykgKSBleGl0OwokdGhpcy0+U2V0Q3VycmVudFRhYignYWR2X3NldHRpbmdzJyk7CgppZiggaXNzZXQoJHBhcmFtc1snc3VibWl0J10pICkKICB7CiAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgnbGRhcF9hY2NvdW50X3N1ZmZpeCcsdHJpbSgkcGFyYW1zWydsZGFwX2FjY291bnRfc3VmZml4J10pKTsKICAgICR0aGlzLT5TZXRQcmVmZXJlbmNlKCdsZGFwX3VzZV9jbicsKGludCkkcGFyYW1zWydsZGFwX3VzZV9jbiddKTsKICAgICR0aGlzLT5TZXRQcmVmZXJlbmNlKCdsZGFwX3JlY3Vyc2l2ZV9ncm91cHMnLCR0aGlzLT5HZXRQcmVmZXJlbmNlKCdsZGFwX3JlY3Vyc2l2ZV9ncm91cHMnKSk7CiAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgnbGRhcF9ncm91cGFycmFuZ2VtZW50Jyx0cmltKCRwYXJhbXNbJ2xkYXBfZ3JvdXBhcnJhbmdlbWVudCddKSk7CiAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgnbGRhcF9hdHRyaWJuYW1lJyx0cmltKCRwYXJhbXNbJ2xkYXBfYXR0cmlibmFtZSddKSk7CiAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgnbGRhcF91bl9wcmVmaXgnLHRyaW0oJHBhcmFtc1snbGRhcF91bl9wcmVmaXgnXSkpOwogICAgJHRoaXMtPlNldFByZWZlcmVuY2UoJ2xkYXBfYXV0aF9iaW5kJywoaW50KSRwYXJhbXNbJ2xkYXBfYXV0aF9iaW5kJ10pOwogIH0KCiR0aGlzLT5SZWRpcmVjdFRvVGFiKCRpZCk7CgojCiMgRU9GCiMKPz4=]]></data>
	</file>
	<file>
	  <filename>/action.admin_set_ad_settings.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKI0JFR0lOX0xJQ0VOU0UKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IEZFVV9BdXRoX0xEQVAgKGMpIDIwMTAgYnkgUm9iZXJ0IENhbXBiZWxsIAojICAgICAgICAgKGNhbGd1eTEwMDBAY21zbWFkZXNpbXBsZS5vcmcpCiMgIEFuIGFkZG9uIG1vZHVsZSBmb3IgQ01TIE1hZGUgU2ltcGxlIHRvIGFsbG93IGEgc2Vjb25kYXJ5IHR5cGUgb2YgCiMgIGF1dGhlbnRpY2F0aW9uIHRvIHRoZSBGRVUgbW9kdWxlLiAgVGhpcyBhZGRvbiBhbGxvd3MgdXNpbmcgdGhlIGFwYWNoZQojICBCQVNJQyBhdXRoZW50aWNhdGlvbi4KIyAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMDUgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQojIFRoaXMgcHJvamVjdCdzIGhvbWVwYWdlIGlzOiBodHRwOi8vd3d3LmNtc21hZGVzaW1wbGUub3JnCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIwojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgojIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBIb3dldmVyLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHUEwsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQKIyBhcyBhbiBhZGRvbiBtb2R1bGUgdG8gQ01TIE1hZGUgU2ltcGxlLiAgWW91IG1heSBub3QgdXNlIHRoaXMgc29mdHdhcmUKIyBpbiBhbnkgTm9uIEdQTCB2ZXJzaW9uIG9mIENNUyBNYWRlIHNpbXBsZSwgb3IgaW4gYW55IHZlcnNpb24gb2YgQ01TCiMgTWFkZSBzaW1wbGUgdGhhdCBkb2VzIG5vdCBpbmRpY2F0ZSBjbGVhcmx5IGFuZCBvYnZpb3VzbHkgaW4gaXRzIGFkbWluIAojIHNlY3Rpb24gdGhhdCB0aGUgc2l0ZSB3YXMgYnVpbHQgd2l0aCBDTVMgTWFkZSBzaW1wbGUuCiMKIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQojIE9yIHJlYWQgaXQgb25saW5lOiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwKIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojRU5EX0xJQ0VOU0UKaWYoICFpc3NldCgkZ0NtcykgKSBleGl0OwokdGhpcy0+U2V0Q3VycmVudFRhYignYWRfc2V0dGluZ3MnKTsKCmlmKCBpc3NldCgkcGFyYW1zWydzdWJtaXQnXSkgKQogIHsKICAgICR0aGlzLT5TZXRQcmVmZXJlbmNlKCdsZGFwX3VzZV9udGxtJyx0cmltKCRwYXJhbXNbJ2xkYXBfdXNlX250bG0nXSkpOwogICAgJHRoaXMtPlNldFByZWZlcmVuY2UoJ2xkYXBfbnRsbV9rZXknLHRyaW0oJHBhcmFtc1snbGRhcF9udGxtX2tleSddKSk7CiAgfQoKJHRoaXMtPlJlZGlyZWN0VG9UYWIoKTsKCiMKIyBFT0YKIwo/Pg==]]></data>
	</file>
	<file>
	  <filename>/action.admin_set_settings.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKI0JFR0lOX0xJQ0VOU0UKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IEZFVV9BdXRoX0xEQVAgKGMpIDIwMTAgYnkgUm9iZXJ0IENhbXBiZWxsIAojICAgICAgICAgKGNhbGd1eTEwMDBAY21zbWFkZXNpbXBsZS5vcmcpCiMgIEFuIGFkZG9uIG1vZHVsZSBmb3IgQ01TIE1hZGUgU2ltcGxlIHRvIGFsbG93IGEgc2Vjb25kYXJ5IHR5cGUgb2YgCiMgIGF1dGhlbnRpY2F0aW9uIHRvIHRoZSBGRVUgbW9kdWxlLiAgVGhpcyBhZGRvbiBhbGxvd3MgdXNpbmcgdGhlIGFwYWNoZQojICBCQVNJQyBhdXRoZW50aWNhdGlvbi4KIyAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMDUgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQojIFRoaXMgcHJvamVjdCdzIGhvbWVwYWdlIGlzOiBodHRwOi8vd3d3LmNtc21hZGVzaW1wbGUub3JnCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIwojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgojIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBIb3dldmVyLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHUEwsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQKIyBhcyBhbiBhZGRvbiBtb2R1bGUgdG8gQ01TIE1hZGUgU2ltcGxlLiAgWW91IG1heSBub3QgdXNlIHRoaXMgc29mdHdhcmUKIyBpbiBhbnkgTm9uIEdQTCB2ZXJzaW9uIG9mIENNUyBNYWRlIHNpbXBsZSwgb3IgaW4gYW55IHZlcnNpb24gb2YgQ01TCiMgTWFkZSBzaW1wbGUgdGhhdCBkb2VzIG5vdCBpbmRpY2F0ZSBjbGVhcmx5IGFuZCBvYnZpb3VzbHkgaW4gaXRzIGFkbWluIAojIHNlY3Rpb24gdGhhdCB0aGUgc2l0ZSB3YXMgYnVpbHQgd2l0aCBDTVMgTWFkZSBzaW1wbGUuCiMKIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQojIE9yIHJlYWQgaXQgb25saW5lOiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwKIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojRU5EX0xJQ0VOU0UKaWYoICFpc3NldCgkZ0NtcykgKSBleGl0OwokdGhpcy0+U2V0Q3VycmVudFRhYignc2V0dGluZ3MnKTsKCmlmKCBpc3NldCgkcGFyYW1zWydzdWJtaXQnXSkgKQogIHsKICAgICR0aGlzLT5TZXRQcmVmZXJlbmNlKCdsZGFwX2hvc3RzJyx0cmltKCRwYXJhbXNbJ2xkYXBfaG9zdHMnXSkpOwogICAgJHRoaXMtPlNldFByZWZlcmVuY2UoJ2xkYXBfYmFzZWRuJyx0cmltKCRwYXJhbXNbJ2xkYXBfYmFzZWRuJ10pKTsKICAgICR0aGlzLT5TZXRQcmVmZXJlbmNlKCdsZGFwX2F1dGhfdW4nLHRyaW0oJHBhcmFtc1snbGRhcF9hdXRoX3VuJ10pKTsKICAgICR0aGlzLT5TZXRQcmVmZXJlbmNlKCdsZGFwX2F1dGhfcHcnLHRyaW0oJHBhcmFtc1snbGRhcF9hdXRoX3B3J10pKTsKICAgICR0aGlzLT5TZXRQcmVmZXJlbmNlKCdsZGFwX3VzZV9hZCcsKGludCkkcGFyYW1zWydsZGFwX3VzZV9hZCddKTsKICAgICR0aGlzLT5TZXRQcmVmZXJlbmNlKCdsZGFwX3JlcXVpcmVfZ3JvdXAnLHRyaW0oJHBhcmFtc1snbGRhcF9yZXF1aXJlX2dyb3VwJ10pKTsKLy8gICAgJHRoaXMtPlNldFByZWZlcmVuY2UoJ2xkYXBfYWNjb3VudF9zdWZmaXgnLHRyaW0oJHBhcmFtc1snbGRhcF9hY2NvdW50X3N1ZmZpeCddKSk7Ci8vICAgICR0aGlzLT5TZXRQcmVmZXJlbmNlKCdsZGFwX3VzZV9udGxtJywoaW50KSRwYXJhbXNbJ2xkYXBfdXNlX250bG0nXSk7Ci8vICAgICR0aGlzLT5TZXRQcmVmZXJlbmNlKCdsZGFwX250bG1fa2V5Jyx0cmltKCRwYXJhbXNbJ2xkYXBfbnRsbV9rZXknXSkpOwovLyAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgnbGRhcF91c2VfY24nLHRyaW0oJHBhcmFtc1snbGRhcF91c2VfY24nXSkpOwogIH0KZWxzZSBpZiggaXNzZXQoJHBhcmFtc1sndGVzdCddKSApCiAgewogICAgJG1zZyA9ICcnLAogICAgJGxkYXAgPSAkdGhpcy0+Z2V0X2xkYXBfY29ubmVjdG9yKHRydWUsJG1zZyk7CiAgICBpZiggJGxkYXAgKQogICAgICB7CgkkdGhpcy0+U2V0TWVzc2FnZSgkdGhpcy0+TGFuZygnbXNnX2Nvbm5lY3RlZCcpKTsKICAgICAgfQogICAgZWxzZQogICAgICB7CgkkdGhpcy0+U2V0RXJyb3IoJHRoaXMtPkxhbmcoJ2Vycm9yX2xkYXBfY29ubmVjdCcpLic6ICcuJG1zZyk7CiAgICAgIH0KICB9CiR0aGlzLT5SZWRpcmVjdFRvVGFiKCRpZCk7CgojCiMgRU9GCiMKPz4=]]></data>
	</file>
	<file>
	  <filename>/action.defaultadmin.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKI0JFR0lOX0xJQ0VOU0UKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IEZFVV9BdXRoX0xEQVAgKGMpIDIwMTAgYnkgUm9iZXJ0IENhbXBiZWxsIAojICAgICAgICAgKGNhbGd1eTEwMDBAY21zbWFkZXNpbXBsZS5vcmcpCiMgIEFuIGFkZG9uIG1vZHVsZSBmb3IgQ01TIE1hZGUgU2ltcGxlIHRvIGFsbG93IGEgc2Vjb25kYXJ5IHR5cGUgb2YgCiMgIGF1dGhlbnRpY2F0aW9uIHRvIHRoZSBGRVUgbW9kdWxlLiAgVGhpcyBhZGRvbiBhbGxvd3MgdXNpbmcgdGhlIGFwYWNoZQojICBCQVNJQyBhdXRoZW50aWNhdGlvbi4KIyAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMDUgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQojIFRoaXMgcHJvamVjdCdzIGhvbWVwYWdlIGlzOiBodHRwOi8vd3d3LmNtc21hZGVzaW1wbGUub3JnCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIwojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgojIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBIb3dldmVyLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHUEwsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQKIyBhcyBhbiBhZGRvbiBtb2R1bGUgdG8gQ01TIE1hZGUgU2ltcGxlLiAgWW91IG1heSBub3QgdXNlIHRoaXMgc29mdHdhcmUKIyBpbiBhbnkgTm9uIEdQTCB2ZXJzaW9uIG9mIENNUyBNYWRlIHNpbXBsZSwgb3IgaW4gYW55IHZlcnNpb24gb2YgQ01TCiMgTWFkZSBzaW1wbGUgdGhhdCBkb2VzIG5vdCBpbmRpY2F0ZSBjbGVhcmx5IGFuZCBvYnZpb3VzbHkgaW4gaXRzIGFkbWluIAojIHNlY3Rpb24gdGhhdCB0aGUgc2l0ZSB3YXMgYnVpbHQgd2l0aCBDTVMgTWFkZSBzaW1wbGUuCiMKIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQojIE9yIHJlYWQgaXQgb25saW5lOiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwKIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojRU5EX0xJQ0VOU0UKaWYoICFpc3NldCgkZ0NtcykgKSBleGl0OwoKZWNobyAkdGhpcy0+U3RhcnRUYWJIZWFkZXJzKCk7CmlmKCAkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdNb2RpZnkgU2l0ZSBQcmVmZXJlbmNlcycpICkKICB7CiAgICBlY2hvICR0aGlzLT5TZXRUYWJIZWFkZXIoJ3NldHRpbmdzJywkdGhpcy0+TGFuZygnZ2VuZXJhbF9zZXR0aW5ncycpKTsKICAgIGVjaG8gJHRoaXMtPlNldFRhYkhlYWRlcignYWRfc2V0dGluZ3MnLCR0aGlzLT5MYW5nKCdhZF9zZXR0aW5ncycpKTsKICAgIGVjaG8gJHRoaXMtPlNldFRhYkhlYWRlcignYWR2X3NldHRpbmdzJywkdGhpcy0+TGFuZygnYWR2YW5jZWRfc2V0dGluZ3MnKSk7CiAgfQppZiggJHRoaXMtPkNoZWNrUGVybWlzc2lvbignTW9kaWZ5IFRlbXBsYXRlcycpICkKICB7CiAgICBlY2hvICR0aGlzLT5TZXRUYWJIZWFkZXIoJ2xvZ2luX3RlbXBsYXRlJywkdGhpcy0+TGFuZygnbG9naW5fdGVtcGxhdGUnKSk7CiAgICBlY2hvICR0aGlzLT5TZXRUYWJIZWFkZXIoJ2xvZ291dF90ZW1wbGF0ZScsJHRoaXMtPkxhbmcoJ2xvZ291dF90ZW1wbGF0ZScpKTsKICB9CmVjaG8gJHRoaXMtPkVuZFRhYkhlYWRlcnMoKTsKCmVjaG8gJHRoaXMtPlN0YXJ0VGFiQ29udGVudCgpOwppZiggJHRoaXMtPkNoZWNrUGVybWlzc2lvbignTW9kaWZ5IFNpdGUgUHJlZmVyZW5jZXMnKSApCiAgewogICAgZWNobyAkdGhpcy0+U3RhcnRUYWIoJ3NldHRpbmdzJywkcGFyYW1zKTsKICAgIGluY2x1ZGUgKGRpcm5hbWUoX19GSUxFX18pLicvZnVuY3Rpb24uYWRtaW5fc2V0dGluZ3NfdGFiLnBocCcpOwogICAgZWNobyAkdGhpcy0+RW5kVGFiKCk7CgogICAgZWNobyAkdGhpcy0+U3RhcnRUYWIoJ2FkX3NldHRpbmdzJywkcGFyYW1zKTsKICAgIGluY2x1ZGUgKGRpcm5hbWUoX19GSUxFX18pLicvZnVuY3Rpb24uYWRtaW5fYWRfc2V0dGluZ3NfdGFiLnBocCcpOwogICAgZWNobyAkdGhpcy0+RW5kVGFiKCk7CgogICAgZWNobyAkdGhpcy0+U3RhcnRUYWIoJ2Fkdl9zZXR0aW5ncycsJHBhcmFtcyk7CiAgICBpbmNsdWRlIChkaXJuYW1lKF9fRklMRV9fKS4nL2Z1bmN0aW9uLmFkbWluX2Fkdl9zZXR0aW5nc190YWIucGhwJyk7CiAgICBlY2hvICR0aGlzLT5FbmRUYWIoKTsKICB9CmlmKCAkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdNb2RpZnkgVGVtcGxhdGVzJykgKQogIHsKICAgIGVjaG8gJHRoaXMtPlN0YXJ0VGFiKCdsb2dpbl90ZW1wbGF0ZScsJHBhcmFtcyk7CiAgICBpbmNsdWRlIChkaXJuYW1lKF9fRklMRV9fKS4nL2Z1bmN0aW9uLmFkbWluX2xvZ2luX3RlbXBsYXRlX3RhYi5waHAnKTsKICAgIGVjaG8gJHRoaXMtPkVuZFRhYigpOwoKICAgIGVjaG8gJHRoaXMtPlN0YXJ0VGFiKCdsb2dvdXRfdGVtcGxhdGUnLCRwYXJhbXMpOwogICAgaW5jbHVkZSAoZGlybmFtZShfX0ZJTEVfXykuJy9mdW5jdGlvbi5hZG1pbl9sb2dvdXRfdGVtcGxhdGVfdGFiLnBocCcpOwogICAgZWNobyAkdGhpcy0+RW5kVGFiKCk7CiAgfQplY2hvICR0aGlzLT5FbmRUYWJDb250ZW50KCk7CgojCiMgRU9GCiMKPz4=]]></data>
	</file>
	<file>
	  <filename>/action.user_login.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKI0JFR0lOX0xJQ0VOU0UKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IEZFVV9BdXRoX0xEQVAgKGMpIDIwMTAgYnkgUm9iZXJ0IENhbXBiZWxsIAojICAgICAgICAgKGNhbGd1eTEwMDBAY21zbWFkZXNpbXBsZS5vcmcpCiMgIEFuIGFkZG9uIG1vZHVsZSBmb3IgQ01TIE1hZGUgU2ltcGxlIHRvIGFsbG93IGEgc2Vjb25kYXJ5IHR5cGUgb2YgCiMgIGF1dGhlbnRpY2F0aW9uIHRvIHRoZSBGRVUgbW9kdWxlLiAgVGhpcyBhZGRvbiBhbGxvd3MgdXNpbmcgdGhlIGFwYWNoZQojICBCQVNJQyBhdXRoZW50aWNhdGlvbi4KIyAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMDUgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQojIFRoaXMgcHJvamVjdCdzIGhvbWVwYWdlIGlzOiBodHRwOi8vd3d3LmNtc21hZGVzaW1wbGUub3JnCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIwojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgojIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBIb3dldmVyLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHUEwsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQKIyBhcyBhbiBhZGRvbiBtb2R1bGUgdG8gQ01TIE1hZGUgU2ltcGxlLiAgWW91IG1heSBub3QgdXNlIHRoaXMgc29mdHdhcmUKIyBpbiBhbnkgTm9uIEdQTCB2ZXJzaW9uIG9mIENNUyBNYWRlIHNpbXBsZSwgb3IgaW4gYW55IHZlcnNpb24gb2YgQ01TCiMgTWFkZSBzaW1wbGUgdGhhdCBkb2VzIG5vdCBpbmRpY2F0ZSBjbGVhcmx5IGFuZCBvYnZpb3VzbHkgaW4gaXRzIGFkbWluIAojIHNlY3Rpb24gdGhhdCB0aGUgc2l0ZSB3YXMgYnVpbHQgd2l0aCBDTVMgTWFkZSBzaW1wbGUuCiMKIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQojIE9yIHJlYWQgaXQgb25saW5lOiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwKIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojRU5EX0xJQ0VOU0UKaWYoICFpc3NldCgkZ0NtcykgKSBleGl0OwoKJGVycm9yID0gJyc7CiR1c2VybmFtZSA9ICcnOwokcGFzc3dvcmQgPSAnJzsKCmlmKCBpc3NldCgkcGFyYW1zWydmZXVsZGFwX3N1Ym1pdCddKSApCiAgewogICAgJHVzZXJuYW1lID0gdHJpbSgkcGFyYW1zWydmZXVsZGFwX3VzZXJuYW1lJ10pOwogICAgJHBhc3N3b3JkID0gdHJpbSgkcGFyYW1zWydmZXVsZGFwX3Bhc3N3b3JkJ10pOwoKICAgICRsZGFwID0gJHRoaXMtPmdldF9sZGFwX2Nvbm5lY3RvcigpOwogICAgaWYoICEkbGRhcCApCiAgICAgIHsKCSRlcnJvciA9ICR0aGlzLT5MYW5nKCdlcnJvcl9sZGFwX2Nvbm5lY3QnKTsKICAgICAgfQogICAgZWxzZQogICAgICB7CgkkcmVzID0gJGxkYXAtPmF1dGhlbnRpY2F0ZSgkdXNlcm5hbWUsJHBhc3N3b3JkKTsKCWlmKCAhJHJlcyApCgkgIHsKCSAgICAkZXJyb3IgPSAkdGhpcy0+TGFuZygnZXJyb3JfbGRhcF9hdXRoZW50aWNhdGUnKS4nOiAnLiRsZGFwLT5nZXRfbGFzdF9lcnJvcigpOwoJICB9CgllbHNlCgkgIHsKCSAgICAkZ3JwID0gJHRoaXMtPkdldFByZWZlcmVuY2UoJ2xkYXBfcmVxdWlyZV9ncm91cCcpOwoJICAgIGlmKCAkZ3JwICYmICEkbGRhcC0+dXNlcl9pbl9ncm91cCgkdXNlcm5hbWUsJGdycCkgKQoJICAgICAgewoJCSRlcnJvciA9ICR0aGlzLT5MYW5nKCdlcnJvcl9sZGFwX2F1dGhlbnRpY2F0ZScpLicgJy4kbGRhcC0+Z2V0X2xhc3RfZXJyb3IoKTsKCSAgICAgIH0KCSAgICBlbHNlCgkgICAgICB7CgkJLy8gd2UndmUgYXV0aGVudGljYXRlZAoJCSRrZXkgPSAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnbGRhcF9udGxtX2tleScsJ1JFTU9URV9VU0VSJyk7CgkJJF9TRVNTSU9OWyRrZXldID0gJHVzZXJuYW1lOwoKCQkkdGhpcy0+UmVkaXJlY3RDb250ZW50KCRyZXR1cm5pZCk7CgkgICAgICB9CgkgIH0KICAgICAgfQogIH0KCiR1c2VfbnRsbSA9ICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdsZGFwX3VzZV9udGxtJyk7CmlmKCAkdXNlX250bG0gKQogIHsKICAgIC8vIGlmIHdlIGFyZW4ndCBhdXRoZW50aWNhdGVkIGFscmVhZHksIHRoZW4gdGhpcyBpcyBhbiBlcnJvcgogICAgJGVycm9yID0gJHRoaXMtPkxhbmcoJ2Vycm9yX250bG1fbm90X2F1dGhlbnRpY2F0ZWQnKTsKICB9CmVsc2UKICB7CiAgICAkc21hcnR5LT5hc3NpZ24oJ2Zvcm1zdGFydCcsJHRoaXMtPkNHQ3JlYXRlRm9ybVN0YXJ0KCRpZCwndXNlcl9sb2dpbicsJHJldHVybmlkKSk7CiAgICAkc21hcnR5LT5hc3NpZ24oJ2Zvcm1lbmQnLCR0aGlzLT5DcmVhdGVGb3JtRW5kKCkpOwogICAgJHNtYXJ0eS0+YXNzaWduKCd1c2VybmFtZScsJHVzZXJuYW1lKTsKICAgICRzbWFydHktPmFzc2lnbigncGFzc3dvcmQnLCRwYXNzd29yZCk7CiAgfQoKaWYoICRlcnJvciApICRzbWFydHktPmFzc2lnbignZXJyb3InLCRlcnJvcik7CmVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZUZyb21EYXRhYmFzZSgnbG9naW5fdGVtcGxhdGUnKTsKCiMKIyBFT0YKIwo/Pg==]]></data>
	</file>
	<file>
	  <filename>/action.user_logout.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKI0JFR0lOX0xJQ0VOU0UKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IEZFVV9BdXRoX0xEQVAgKGMpIDIwMTAgYnkgUm9iZXJ0IENhbXBiZWxsIAojICAgICAgICAgKGNhbGd1eTEwMDBAY21zbWFkZXNpbXBsZS5vcmcpCiMgIEFuIGFkZG9uIG1vZHVsZSBmb3IgQ01TIE1hZGUgU2ltcGxlIHRvIGFsbG93IGEgc2Vjb25kYXJ5IHR5cGUgb2YgCiMgIGF1dGhlbnRpY2F0aW9uIHRvIHRoZSBGRVUgbW9kdWxlLiAgVGhpcyBhZGRvbiBhbGxvd3MgdXNpbmcgdGhlIGFwYWNoZQojICBCQVNJQyBhdXRoZW50aWNhdGlvbi4KIyAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMDUgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQojIFRoaXMgcHJvamVjdCdzIGhvbWVwYWdlIGlzOiBodHRwOi8vd3d3LmNtc21hZGVzaW1wbGUub3JnCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIwojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgojIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBIb3dldmVyLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHUEwsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQKIyBhcyBhbiBhZGRvbiBtb2R1bGUgdG8gQ01TIE1hZGUgU2ltcGxlLiAgWW91IG1heSBub3QgdXNlIHRoaXMgc29mdHdhcmUKIyBpbiBhbnkgTm9uIEdQTCB2ZXJzaW9uIG9mIENNUyBNYWRlIHNpbXBsZSwgb3IgaW4gYW55IHZlcnNpb24gb2YgQ01TCiMgTWFkZSBzaW1wbGUgdGhhdCBkb2VzIG5vdCBpbmRpY2F0ZSBjbGVhcmx5IGFuZCBvYnZpb3VzbHkgaW4gaXRzIGFkbWluIAojIHNlY3Rpb24gdGhhdCB0aGUgc2l0ZSB3YXMgYnVpbHQgd2l0aCBDTVMgTWFkZSBzaW1wbGUuCiMKIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQojIE9yIHJlYWQgaXQgb25saW5lOiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwKIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojRU5EX0xJQ0VOU0UKaWYoICFpc3NldCgkZ0NtcykgKSBleGl0OwoKJGNvbmZpZyA9ICRnQ21zLT5HZXRDb25maWcoKTsKCiR1c2VfbnRsbSA9ICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdsZGFwX3VzZV9udGxtJyk7CmlmKCAkdXNlX250bG0gKSByZXR1cm47CgppZiggaXNzZXQoJHBhcmFtc1snZmV1bGRhcF9sb2dvdXQnXSkgKQogIHsKICAgIC8vIGRvIHRoZSBsb2dvdXQgYWN0aW9uLgogICAgJGtleSA9ICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdsZGFwX250bG1fa2V5Jyk7CiAgICB1bnNldCgkX1NFU1NJT05bJGtleV0pOwogICAgdW5zZXQoJF9TRVNTSU9OWyRrZXldKTsKCiAgICAkdGhpcy0+UmVkaXJlY3RDb250ZW50KCRyZXR1cm5pZCk7CiAgfQoKJHVybCA9ICR0aGlzLT5DcmVhdGVVUkwoJGlkLCd1c2VyX2xvZ291dCcsJHJldHVybmlkLAoJCQlhcnJheSgnZmV1bGRhcF9sb2dvdXQnPT4xKSk7CiRzbWFydHktPmFzc2lnbignbG9nb3V0X3VybCcsJHVybCk7CmVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZUZyb21EYXRhYmFzZSgnbG9nb3V0X3RlbXBsYXRlJyk7CQkKCiMKIyBFT0YKIwo/Pg==]]></data>
	</file>
	<file>
	  <filename>/doc/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/doc/COPYING</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ICAgICAgICAgICAgICAgICAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQogICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMywgMjkgSnVuZSAyMDA3CgogQ29weXJpZ2h0IChDKSAyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiA8aHR0cDovL2ZzZi5vcmcvPgogRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzCiBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVhbWJsZQoKICBUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgYSBmcmVlLCBjb3B5bGVmdCBsaWNlbnNlIGZvcgpzb2Z0d2FyZSBhbmQgb3RoZXIga2luZHMgb2Ygd29ya3MuCgogIFRoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhbmQgb3RoZXIgcHJhY3RpY2FsIHdvcmtzIGFyZSBkZXNpZ25lZAp0byB0YWtlIGF3YXkgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgdGhlIHdvcmtzLiAgQnkgY29udHJhc3QsCnRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvCnNoYXJlIGFuZCBjaGFuZ2UgYWxsIHZlcnNpb25zIG9mIGEgcHJvZ3JhbS0tdG8gbWFrZSBzdXJlIGl0IHJlbWFpbnMgZnJlZQpzb2Z0d2FyZSBmb3IgYWxsIGl0cyB1c2Vycy4gIFdlLCB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB1c2UgdGhlCkdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3N0IG9mIG91ciBzb2Z0d2FyZTsgaXQgYXBwbGllcyBhbHNvIHRvCmFueSBvdGhlciB3b3JrIHJlbGVhc2VkIHRoaXMgd2F5IGJ5IGl0cyBhdXRob3JzLiAgWW91IGNhbiBhcHBseSBpdCB0bwp5b3VyIHByb2dyYW1zLCB0b28uCgogIFdoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tLCBub3QKcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdQpoYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yCnRoZW0gaWYgeW91IHdpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQgaWYgeW91CndhbnQgaXQsIHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIG9yIHVzZSBwaWVjZXMgb2YgaXQgaW4gbmV3CmZyZWUgcHJvZ3JhbXMsIGFuZCB0aGF0IHlvdSBrbm93IHlvdSBjYW4gZG8gdGhlc2UgdGhpbmdzLgoKICBUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIHByZXZlbnQgb3RoZXJzIGZyb20gZGVueWluZyB5b3UKdGhlc2UgcmlnaHRzIG9yIGFza2luZyB5b3UgdG8gc3VycmVuZGVyIHRoZSByaWdodHMuICBUaGVyZWZvcmUsIHlvdSBoYXZlCmNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlLCBvciBpZgp5b3UgbW9kaWZ5IGl0OiByZXNwb25zaWJpbGl0aWVzIHRvIHJlc3BlY3QgdGhlIGZyZWVkb20gb2Ygb3RoZXJzLgoKICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHN1Y2ggYSBwcm9ncmFtLCB3aGV0aGVyCmdyYXRpcyBvciBmb3IgYSBmZWUsIHlvdSBtdXN0IHBhc3Mgb24gdG8gdGhlIHJlY2lwaWVudHMgdGhlIHNhbWUKZnJlZWRvbXMgdGhhdCB5b3UgcmVjZWl2ZWQuICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUKb3IgY2FuIGdldCB0aGUgc291cmNlIGNvZGUuICBBbmQgeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkKa25vdyB0aGVpciByaWdodHMuCgogIERldmVsb3BlcnMgdGhhdCB1c2UgdGhlIEdOVSBHUEwgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczoKKDEpIGFzc2VydCBjb3B5cmlnaHQgb24gdGhlIHNvZnR3YXJlLCBhbmQgKDIpIG9mZmVyIHlvdSB0aGlzIExpY2Vuc2UKZ2l2aW5nIHlvdSBsZWdhbCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSBpdC4KCiAgRm9yIHRoZSBkZXZlbG9wZXJzJyBhbmQgYXV0aG9ycycgcHJvdGVjdGlvbiwgdGhlIEdQTCBjbGVhcmx5IGV4cGxhaW5zCnRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoaXMgZnJlZSBzb2Z0d2FyZS4gIEZvciBib3RoIHVzZXJzJyBhbmQKYXV0aG9ycycgc2FrZSwgdGhlIEdQTCByZXF1aXJlcyB0aGF0IG1vZGlmaWVkIHZlcnNpb25zIGJlIG1hcmtlZCBhcwpjaGFuZ2VkLCBzbyB0aGF0IHRoZWlyIHByb2JsZW1zIHdpbGwgbm90IGJlIGF0dHJpYnV0ZWQgZXJyb25lb3VzbHkgdG8KYXV0aG9ycyBvZiBwcmV2aW91cyB2ZXJzaW9ucy4KCiAgU29tZSBkZXZpY2VzIGFyZSBkZXNpZ25lZCB0byBkZW55IHVzZXJzIGFjY2VzcyB0byBpbnN0YWxsIG9yIHJ1bgptb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgc29mdHdhcmUgaW5zaWRlIHRoZW0sIGFsdGhvdWdoIHRoZSBtYW51ZmFjdHVyZXIKY2FuIGRvIHNvLiAgVGhpcyBpcyBmdW5kYW1lbnRhbGx5IGluY29tcGF0aWJsZSB3aXRoIHRoZSBhaW0gb2YKcHJvdGVjdGluZyB1c2VycycgZnJlZWRvbSB0byBjaGFuZ2UgdGhlIHNvZnR3YXJlLiAgVGhlIHN5c3RlbWF0aWMKcGF0dGVybiBvZiBzdWNoIGFidXNlIG9jY3VycyBpbiB0aGUgYXJlYSBvZiBwcm9kdWN0cyBmb3IgaW5kaXZpZHVhbHMgdG8KdXNlLCB3aGljaCBpcyBwcmVjaXNlbHkgd2hlcmUgaXQgaXMgbW9zdCB1bmFjY2VwdGFibGUuICBUaGVyZWZvcmUsIHdlCmhhdmUgZGVzaWduZWQgdGhpcyB2ZXJzaW9uIG9mIHRoZSBHUEwgdG8gcHJvaGliaXQgdGhlIHByYWN0aWNlIGZvciB0aG9zZQpwcm9kdWN0cy4gIElmIHN1Y2ggcHJvYmxlbXMgYXJpc2Ugc3Vic3RhbnRpYWxseSBpbiBvdGhlciBkb21haW5zLCB3ZQpzdGFuZCByZWFkeSB0byBleHRlbmQgdGhpcyBwcm92aXNpb24gdG8gdGhvc2UgZG9tYWlucyBpbiBmdXR1cmUgdmVyc2lvbnMKb2YgdGhlIEdQTCwgYXMgbmVlZGVkIHRvIHByb3RlY3QgdGhlIGZyZWVkb20gb2YgdXNlcnMuCgogIEZpbmFsbHksIGV2ZXJ5IHByb2dyYW0gaXMgdGhyZWF0ZW5lZCBjb25zdGFudGx5IGJ5IHNvZnR3YXJlIHBhdGVudHMuClN0YXRlcyBzaG91bGQgbm90IGFsbG93IHBhdGVudHMgdG8gcmVzdHJpY3QgZGV2ZWxvcG1lbnQgYW5kIHVzZSBvZgpzb2Z0d2FyZSBvbiBnZW5lcmFsLXB1cnBvc2UgY29tcHV0ZXJzLCBidXQgaW4gdGhvc2UgdGhhdCBkbywgd2Ugd2lzaCB0bwphdm9pZCB0aGUgc3BlY2lhbCBkYW5nZXIgdGhhdCBwYXRlbnRzIGFwcGxpZWQgdG8gYSBmcmVlIHByb2dyYW0gY291bGQKbWFrZSBpdCBlZmZlY3RpdmVseSBwcm9wcmlldGFyeS4gIFRvIHByZXZlbnQgdGhpcywgdGhlIEdQTCBhc3N1cmVzIHRoYXQKcGF0ZW50cyBjYW5ub3QgYmUgdXNlZCB0byByZW5kZXIgdGhlIHByb2dyYW0gbm9uLWZyZWUuCgogIFRoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kCm1vZGlmaWNhdGlvbiBmb2xsb3cuCgogICAgICAgICAgICAgICAgICAgICAgIFRFUk1TIEFORCBDT05ESVRJT05TCgogIDAuIERlZmluaXRpb25zLgoKICAiVGhpcyBMaWNlbnNlIiByZWZlcnMgdG8gdmVyc2lvbiAzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KCiAgIkNvcHlyaWdodCIgYWxzbyBtZWFucyBjb3B5cmlnaHQtbGlrZSBsYXdzIHRoYXQgYXBwbHkgdG8gb3RoZXIga2luZHMgb2YKd29ya3MsIHN1Y2ggYXMgc2VtaWNvbmR1Y3RvciBtYXNrcy4KCiAgIlRoZSBQcm9ncmFtIiByZWZlcnMgdG8gYW55IGNvcHlyaWdodGFibGUgd29yayBsaWNlbnNlZCB1bmRlciB0aGlzCkxpY2Vuc2UuICBFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4gICJMaWNlbnNlZXMiIGFuZAoicmVjaXBpZW50cyIgbWF5IGJlIGluZGl2aWR1YWxzIG9yIG9yZ2FuaXphdGlvbnMuCgogIFRvICJtb2RpZnkiIGEgd29yayBtZWFucyB0byBjb3B5IGZyb20gb3IgYWRhcHQgYWxsIG9yIHBhcnQgb2YgdGhlIHdvcmsKaW4gYSBmYXNoaW9uIHJlcXVpcmluZyBjb3B5cmlnaHQgcGVybWlzc2lvbiwgb3RoZXIgdGhhbiB0aGUgbWFraW5nIG9mIGFuCmV4YWN0IGNvcHkuICBUaGUgcmVzdWx0aW5nIHdvcmsgaXMgY2FsbGVkIGEgIm1vZGlmaWVkIHZlcnNpb24iIG9mIHRoZQplYXJsaWVyIHdvcmsgb3IgYSB3b3JrICJiYXNlZCBvbiIgdGhlIGVhcmxpZXIgd29yay4KCiAgQSAiY292ZXJlZCB3b3JrIiBtZWFucyBlaXRoZXIgdGhlIHVubW9kaWZpZWQgUHJvZ3JhbSBvciBhIHdvcmsgYmFzZWQKb24gdGhlIFByb2dyYW0uCgogIFRvICJwcm9wYWdhdGUiIGEgd29yayBtZWFucyB0byBkbyBhbnl0aGluZyB3aXRoIGl0IHRoYXQsIHdpdGhvdXQKcGVybWlzc2lvbiwgd291bGQgbWFrZSB5b3UgZGlyZWN0bHkgb3Igc2Vjb25kYXJpbHkgbGlhYmxlIGZvcgppbmZyaW5nZW1lbnQgdW5kZXIgYXBwbGljYWJsZSBjb3B5cmlnaHQgbGF3LCBleGNlcHQgZXhlY3V0aW5nIGl0IG9uIGEKY29tcHV0ZXIgb3IgbW9kaWZ5aW5nIGEgcHJpdmF0ZSBjb3B5LiAgUHJvcGFnYXRpb24gaW5jbHVkZXMgY29weWluZywKZGlzdHJpYnV0aW9uICh3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uKSwgbWFraW5nIGF2YWlsYWJsZSB0byB0aGUKcHVibGljLCBhbmQgaW4gc29tZSBjb3VudHJpZXMgb3RoZXIgYWN0aXZpdGllcyBhcyB3ZWxsLgoKICBUbyAiY29udmV5IiBhIHdvcmsgbWVhbnMgYW55IGtpbmQgb2YgcHJvcGFnYXRpb24gdGhhdCBlbmFibGVzIG90aGVyCnBhcnRpZXMgdG8gbWFrZSBvciByZWNlaXZlIGNvcGllcy4gIE1lcmUgaW50ZXJhY3Rpb24gd2l0aCBhIHVzZXIgdGhyb3VnaAphIGNvbXB1dGVyIG5ldHdvcmssIHdpdGggbm8gdHJhbnNmZXIgb2YgYSBjb3B5LCBpcyBub3QgY29udmV5aW5nLgoKICBBbiBpbnRlcmFjdGl2ZSB1c2VyIGludGVyZmFjZSBkaXNwbGF5cyAiQXBwcm9wcmlhdGUgTGVnYWwgTm90aWNlcyIKdG8gdGhlIGV4dGVudCB0aGF0IGl0IGluY2x1ZGVzIGEgY29udmVuaWVudCBhbmQgcHJvbWluZW50bHkgdmlzaWJsZQpmZWF0dXJlIHRoYXQgKDEpIGRpc3BsYXlzIGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UsIGFuZCAoMikKdGVsbHMgdGhlIHVzZXIgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhlIHdvcmsgKGV4Y2VwdCB0byB0aGUKZXh0ZW50IHRoYXQgd2FycmFudGllcyBhcmUgcHJvdmlkZWQpLCB0aGF0IGxpY2Vuc2VlcyBtYXkgY29udmV5IHRoZQp3b3JrIHVuZGVyIHRoaXMgTGljZW5zZSwgYW5kIGhvdyB0byB2aWV3IGEgY29weSBvZiB0aGlzIExpY2Vuc2UuICBJZgp0aGUgaW50ZXJmYWNlIHByZXNlbnRzIGEgbGlzdCBvZiB1c2VyIGNvbW1hbmRzIG9yIG9wdGlvbnMsIHN1Y2ggYXMgYQptZW51LCBhIHByb21pbmVudCBpdGVtIGluIHRoZSBsaXN0IG1lZXRzIHRoaXMgY3JpdGVyaW9uLgoKICAxLiBTb3VyY2UgQ29kZS4KCiAgVGhlICJzb3VyY2UgY29kZSIgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsKZm9yIG1ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LiAgIk9iamVjdCBjb2RlIiBtZWFucyBhbnkgbm9uLXNvdXJjZQpmb3JtIG9mIGEgd29yay4KCiAgQSAiU3RhbmRhcmQgSW50ZXJmYWNlIiBtZWFucyBhbiBpbnRlcmZhY2UgdGhhdCBlaXRoZXIgaXMgYW4gb2ZmaWNpYWwKc3RhbmRhcmQgZGVmaW5lZCBieSBhIHJlY29nbml6ZWQgc3RhbmRhcmRzIGJvZHksIG9yLCBpbiB0aGUgY2FzZSBvZgppbnRlcmZhY2VzIHNwZWNpZmllZCBmb3IgYSBwYXJ0aWN1bGFyIHByb2dyYW1taW5nIGxhbmd1YWdlLCBvbmUgdGhhdAppcyB3aWRlbHkgdXNlZCBhbW9uZyBkZXZlbG9wZXJzIHdvcmtpbmcgaW4gdGhhdCBsYW5ndWFnZS4KCiAgVGhlICJTeXN0ZW0gTGlicmFyaWVzIiBvZiBhbiBleGVjdXRhYmxlIHdvcmsgaW5jbHVkZSBhbnl0aGluZywgb3RoZXIKdGhhbiB0aGUgd29yayBhcyBhIHdob2xlLCB0aGF0IChhKSBpcyBpbmNsdWRlZCBpbiB0aGUgbm9ybWFsIGZvcm0gb2YKcGFja2FnaW5nIGEgTWFqb3IgQ29tcG9uZW50LCBidXQgd2hpY2ggaXMgbm90IHBhcnQgb2YgdGhhdCBNYWpvcgpDb21wb25lbnQsIGFuZCAoYikgc2VydmVzIG9ubHkgdG8gZW5hYmxlIHVzZSBvZiB0aGUgd29yayB3aXRoIHRoYXQKTWFqb3IgQ29tcG9uZW50LCBvciB0byBpbXBsZW1lbnQgYSBTdGFuZGFyZCBJbnRlcmZhY2UgZm9yIHdoaWNoIGFuCmltcGxlbWVudGF0aW9uIGlzIGF2YWlsYWJsZSB0byB0aGUgcHVibGljIGluIHNvdXJjZSBjb2RlIGZvcm0uICBBCiJNYWpvciBDb21wb25lbnQiLCBpbiB0aGlzIGNvbnRleHQsIG1lYW5zIGEgbWFqb3IgZXNzZW50aWFsIGNvbXBvbmVudAooa2VybmVsLCB3aW5kb3cgc3lzdGVtLCBhbmQgc28gb24pIG9mIHRoZSBzcGVjaWZpYyBvcGVyYXRpbmcgc3lzdGVtCihpZiBhbnkpIG9uIHdoaWNoIHRoZSBleGVjdXRhYmxlIHdvcmsgcnVucywgb3IgYSBjb21waWxlciB1c2VkIHRvCnByb2R1Y2UgdGhlIHdvcmssIG9yIGFuIG9iamVjdCBjb2RlIGludGVycHJldGVyIHVzZWQgdG8gcnVuIGl0LgoKICBUaGUgIkNvcnJlc3BvbmRpbmcgU291cmNlIiBmb3IgYSB3b3JrIGluIG9iamVjdCBjb2RlIGZvcm0gbWVhbnMgYWxsCnRoZSBzb3VyY2UgY29kZSBuZWVkZWQgdG8gZ2VuZXJhdGUsIGluc3RhbGwsIGFuZCAoZm9yIGFuIGV4ZWN1dGFibGUKd29yaykgcnVuIHRoZSBvYmplY3QgY29kZSBhbmQgdG8gbW9kaWZ5IHRoZSB3b3JrLCBpbmNsdWRpbmcgc2NyaXB0cyB0bwpjb250cm9sIHRob3NlIGFjdGl2aXRpZXMuICBIb3dldmVyLCBpdCBkb2VzIG5vdCBpbmNsdWRlIHRoZSB3b3JrJ3MKU3lzdGVtIExpYnJhcmllcywgb3IgZ2VuZXJhbC1wdXJwb3NlIHRvb2xzIG9yIGdlbmVyYWxseSBhdmFpbGFibGUgZnJlZQpwcm9ncmFtcyB3aGljaCBhcmUgdXNlZCB1bm1vZGlmaWVkIGluIHBlcmZvcm1pbmcgdGhvc2UgYWN0aXZpdGllcyBidXQKd2hpY2ggYXJlIG5vdCBwYXJ0IG9mIHRoZSB3b3JrLiAgRm9yIGV4YW1wbGUsIENvcnJlc3BvbmRpbmcgU291cmNlCmluY2x1ZGVzIGludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzIGFzc29jaWF0ZWQgd2l0aCBzb3VyY2UgZmlsZXMgZm9yCnRoZSB3b3JrLCBhbmQgdGhlIHNvdXJjZSBjb2RlIGZvciBzaGFyZWQgbGlicmFyaWVzIGFuZCBkeW5hbWljYWxseQpsaW5rZWQgc3VicHJvZ3JhbXMgdGhhdCB0aGUgd29yayBpcyBzcGVjaWZpY2FsbHkgZGVzaWduZWQgdG8gcmVxdWlyZSwKc3VjaCBhcyBieSBpbnRpbWF0ZSBkYXRhIGNvbW11bmljYXRpb24gb3IgY29udHJvbCBmbG93IGJldHdlZW4gdGhvc2UKc3VicHJvZ3JhbXMgYW5kIG90aGVyIHBhcnRzIG9mIHRoZSB3b3JrLgoKICBUaGUgQ29ycmVzcG9uZGluZyBTb3VyY2UgbmVlZCBub3QgaW5jbHVkZSBhbnl0aGluZyB0aGF0IHVzZXJzCmNhbiByZWdlbmVyYXRlIGF1dG9tYXRpY2FsbHkgZnJvbSBvdGhlciBwYXJ0cyBvZiB0aGUgQ29ycmVzcG9uZGluZwpTb3VyY2UuCgogIFRoZSBDb3JyZXNwb25kaW5nIFNvdXJjZSBmb3IgYSB3b3JrIGluIHNvdXJjZSBjb2RlIGZvcm0gaXMgdGhhdApzYW1lIHdvcmsuCgogIDIuIEJhc2ljIFBlcm1pc3Npb25zLgoKICBBbGwgcmlnaHRzIGdyYW50ZWQgdW5kZXIgdGhpcyBMaWNlbnNlIGFyZSBncmFudGVkIGZvciB0aGUgdGVybSBvZgpjb3B5cmlnaHQgb24gdGhlIFByb2dyYW0sIGFuZCBhcmUgaXJyZXZvY2FibGUgcHJvdmlkZWQgdGhlIHN0YXRlZApjb25kaXRpb25zIGFyZSBtZXQuICBUaGlzIExpY2Vuc2UgZXhwbGljaXRseSBhZmZpcm1zIHlvdXIgdW5saW1pdGVkCnBlcm1pc3Npb24gdG8gcnVuIHRoZSB1bm1vZGlmaWVkIFByb2dyYW0uICBUaGUgb3V0cHV0IGZyb20gcnVubmluZyBhCmNvdmVyZWQgd29yayBpcyBjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZSBvbmx5IGlmIHRoZSBvdXRwdXQsIGdpdmVuIGl0cwpjb250ZW50LCBjb25zdGl0dXRlcyBhIGNvdmVyZWQgd29yay4gIFRoaXMgTGljZW5zZSBhY2tub3dsZWRnZXMgeW91cgpyaWdodHMgb2YgZmFpciB1c2Ugb3Igb3RoZXIgZXF1aXZhbGVudCwgYXMgcHJvdmlkZWQgYnkgY29weXJpZ2h0IGxhdy4KCiAgWW91IG1heSBtYWtlLCBydW4gYW5kIHByb3BhZ2F0ZSBjb3ZlcmVkIHdvcmtzIHRoYXQgeW91IGRvIG5vdApjb252ZXksIHdpdGhvdXQgY29uZGl0aW9ucyBzbyBsb25nIGFzIHlvdXIgbGljZW5zZSBvdGhlcndpc2UgcmVtYWlucwppbiBmb3JjZS4gIFlvdSBtYXkgY29udmV5IGNvdmVyZWQgd29ya3MgdG8gb3RoZXJzIGZvciB0aGUgc29sZSBwdXJwb3NlCm9mIGhhdmluZyB0aGVtIG1ha2UgbW9kaWZpY2F0aW9ucyBleGNsdXNpdmVseSBmb3IgeW91LCBvciBwcm92aWRlIHlvdQp3aXRoIGZhY2lsaXRpZXMgZm9yIHJ1bm5pbmcgdGhvc2Ugd29ya3MsIHByb3ZpZGVkIHRoYXQgeW91IGNvbXBseSB3aXRoCnRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UgaW4gY29udmV5aW5nIGFsbCBtYXRlcmlhbCBmb3Igd2hpY2ggeW91IGRvCm5vdCBjb250cm9sIGNvcHlyaWdodC4gIFRob3NlIHRodXMgbWFraW5nIG9yIHJ1bm5pbmcgdGhlIGNvdmVyZWQgd29ya3MKZm9yIHlvdSBtdXN0IGRvIHNvIGV4Y2x1c2l2ZWx5IG9uIHlvdXIgYmVoYWxmLCB1bmRlciB5b3VyIGRpcmVjdGlvbgphbmQgY29udHJvbCwgb24gdGVybXMgdGhhdCBwcm9oaWJpdCB0aGVtIGZyb20gbWFraW5nIGFueSBjb3BpZXMgb2YKeW91ciBjb3B5cmlnaHRlZCBtYXRlcmlhbCBvdXRzaWRlIHRoZWlyIHJlbGF0aW9uc2hpcCB3aXRoIHlvdS4KCiAgQ29udmV5aW5nIHVuZGVyIGFueSBvdGhlciBjaXJjdW1zdGFuY2VzIGlzIHBlcm1pdHRlZCBzb2xlbHkgdW5kZXIKdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGJlbG93LiAgU3VibGljZW5zaW5nIGlzIG5vdCBhbGxvd2VkOyBzZWN0aW9uIDEwCm1ha2VzIGl0IHVubmVjZXNzYXJ5LgoKICAzLiBQcm90ZWN0aW5nIFVzZXJzJyBMZWdhbCBSaWdodHMgRnJvbSBBbnRpLUNpcmN1bXZlbnRpb24gTGF3LgoKICBObyBjb3ZlcmVkIHdvcmsgc2hhbGwgYmUgZGVlbWVkIHBhcnQgb2YgYW4gZWZmZWN0aXZlIHRlY2hub2xvZ2ljYWwKbWVhc3VyZSB1bmRlciBhbnkgYXBwbGljYWJsZSBsYXcgZnVsZmlsbGluZyBvYmxpZ2F0aW9ucyB1bmRlciBhcnRpY2xlCjExIG9mIHRoZSBXSVBPIGNvcHlyaWdodCB0cmVhdHkgYWRvcHRlZCBvbiAyMCBEZWNlbWJlciAxOTk2LCBvcgpzaW1pbGFyIGxhd3MgcHJvaGliaXRpbmcgb3IgcmVzdHJpY3RpbmcgY2lyY3VtdmVudGlvbiBvZiBzdWNoCm1lYXN1cmVzLgoKICBXaGVuIHlvdSBjb252ZXkgYSBjb3ZlcmVkIHdvcmssIHlvdSB3YWl2ZSBhbnkgbGVnYWwgcG93ZXIgdG8gZm9yYmlkCmNpcmN1bXZlbnRpb24gb2YgdGVjaG5vbG9naWNhbCBtZWFzdXJlcyB0byB0aGUgZXh0ZW50IHN1Y2ggY2lyY3VtdmVudGlvbgppcyBlZmZlY3RlZCBieSBleGVyY2lzaW5nIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2Ugd2l0aCByZXNwZWN0IHRvCnRoZSBjb3ZlcmVkIHdvcmssIGFuZCB5b3UgZGlzY2xhaW0gYW55IGludGVudGlvbiB0byBsaW1pdCBvcGVyYXRpb24gb3IKbW9kaWZpY2F0aW9uIG9mIHRoZSB3b3JrIGFzIGEgbWVhbnMgb2YgZW5mb3JjaW5nLCBhZ2FpbnN0IHRoZSB3b3JrJ3MKdXNlcnMsIHlvdXIgb3IgdGhpcmQgcGFydGllcycgbGVnYWwgcmlnaHRzIHRvIGZvcmJpZCBjaXJjdW12ZW50aW9uIG9mCnRlY2hub2xvZ2ljYWwgbWVhc3VyZXMuCgogIDQuIENvbnZleWluZyBWZXJiYXRpbSBDb3BpZXMuCgogIFlvdSBtYXkgY29udmV5IHZlcmJhdGltIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSdzIHNvdXJjZSBjb2RlIGFzIHlvdQpyZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0IHlvdSBjb25zcGljdW91c2x5IGFuZAphcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2U7CmtlZXAgaW50YWN0IGFsbCBub3RpY2VzIHN0YXRpbmcgdGhhdCB0aGlzIExpY2Vuc2UgYW5kIGFueQpub24tcGVybWlzc2l2ZSB0ZXJtcyBhZGRlZCBpbiBhY2NvcmQgd2l0aCBzZWN0aW9uIDcgYXBwbHkgdG8gdGhlIGNvZGU7CmtlZXAgaW50YWN0IGFsbCBub3RpY2VzIG9mIHRoZSBhYnNlbmNlIG9mIGFueSB3YXJyYW50eTsgYW5kIGdpdmUgYWxsCnJlY2lwaWVudHMgYSBjb3B5IG9mIHRoaXMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBQcm9ncmFtLgoKICBZb3UgbWF5IGNoYXJnZSBhbnkgcHJpY2Ugb3Igbm8gcHJpY2UgZm9yIGVhY2ggY29weSB0aGF0IHlvdSBjb252ZXksCmFuZCB5b3UgbWF5IG9mZmVyIHN1cHBvcnQgb3Igd2FycmFudHkgcHJvdGVjdGlvbiBmb3IgYSBmZWUuCgogIDUuIENvbnZleWluZyBNb2RpZmllZCBTb3VyY2UgVmVyc2lvbnMuCgogIFlvdSBtYXkgY29udmV5IGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSwgb3IgdGhlIG1vZGlmaWNhdGlvbnMgdG8KcHJvZHVjZSBpdCBmcm9tIHRoZSBQcm9ncmFtLCBpbiB0aGUgZm9ybSBvZiBzb3VyY2UgY29kZSB1bmRlciB0aGUKdGVybXMgb2Ygc2VjdGlvbiA0LCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6CgogICAgYSkgVGhlIHdvcmsgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IG1vZGlmaWVkCiAgICBpdCwgYW5kIGdpdmluZyBhIHJlbGV2YW50IGRhdGUuCgogICAgYikgVGhlIHdvcmsgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgaXQgaXMKICAgIHJlbGVhc2VkIHVuZGVyIHRoaXMgTGljZW5zZSBhbmQgYW55IGNvbmRpdGlvbnMgYWRkZWQgdW5kZXIgc2VjdGlvbgogICAgNy4gIFRoaXMgcmVxdWlyZW1lbnQgbW9kaWZpZXMgdGhlIHJlcXVpcmVtZW50IGluIHNlY3Rpb24gNCB0bwogICAgImtlZXAgaW50YWN0IGFsbCBub3RpY2VzIi4KCiAgICBjKSBZb3UgbXVzdCBsaWNlbnNlIHRoZSBlbnRpcmUgd29yaywgYXMgYSB3aG9sZSwgdW5kZXIgdGhpcwogICAgTGljZW5zZSB0byBhbnlvbmUgd2hvIGNvbWVzIGludG8gcG9zc2Vzc2lvbiBvZiBhIGNvcHkuICBUaGlzCiAgICBMaWNlbnNlIHdpbGwgdGhlcmVmb3JlIGFwcGx5LCBhbG9uZyB3aXRoIGFueSBhcHBsaWNhYmxlIHNlY3Rpb24gNwogICAgYWRkaXRpb25hbCB0ZXJtcywgdG8gdGhlIHdob2xlIG9mIHRoZSB3b3JrLCBhbmQgYWxsIGl0cyBwYXJ0cywKICAgIHJlZ2FyZGxlc3Mgb2YgaG93IHRoZXkgYXJlIHBhY2thZ2VkLiAgVGhpcyBMaWNlbnNlIGdpdmVzIG5vCiAgICBwZXJtaXNzaW9uIHRvIGxpY2Vuc2UgdGhlIHdvcmsgaW4gYW55IG90aGVyIHdheSwgYnV0IGl0IGRvZXMgbm90CiAgICBpbnZhbGlkYXRlIHN1Y2ggcGVybWlzc2lvbiBpZiB5b3UgaGF2ZSBzZXBhcmF0ZWx5IHJlY2VpdmVkIGl0LgoKICAgIGQpIElmIHRoZSB3b3JrIGhhcyBpbnRlcmFjdGl2ZSB1c2VyIGludGVyZmFjZXMsIGVhY2ggbXVzdCBkaXNwbGF5CiAgICBBcHByb3ByaWF0ZSBMZWdhbCBOb3RpY2VzOyBob3dldmVyLCBpZiB0aGUgUHJvZ3JhbSBoYXMgaW50ZXJhY3RpdmUKICAgIGludGVyZmFjZXMgdGhhdCBkbyBub3QgZGlzcGxheSBBcHByb3ByaWF0ZSBMZWdhbCBOb3RpY2VzLCB5b3VyCiAgICB3b3JrIG5lZWQgbm90IG1ha2UgdGhlbSBkbyBzby4KCiAgQSBjb21waWxhdGlvbiBvZiBhIGNvdmVyZWQgd29yayB3aXRoIG90aGVyIHNlcGFyYXRlIGFuZCBpbmRlcGVuZGVudAp3b3Jrcywgd2hpY2ggYXJlIG5vdCBieSB0aGVpciBuYXR1cmUgZXh0ZW5zaW9ucyBvZiB0aGUgY292ZXJlZCB3b3JrLAphbmQgd2hpY2ggYXJlIG5vdCBjb21iaW5lZCB3aXRoIGl0IHN1Y2ggYXMgdG8gZm9ybSBhIGxhcmdlciBwcm9ncmFtLAppbiBvciBvbiBhIHZvbHVtZSBvZiBhIHN0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSwgaXMgY2FsbGVkIGFuCiJhZ2dyZWdhdGUiIGlmIHRoZSBjb21waWxhdGlvbiBhbmQgaXRzIHJlc3VsdGluZyBjb3B5cmlnaHQgYXJlIG5vdAp1c2VkIHRvIGxpbWl0IHRoZSBhY2Nlc3Mgb3IgbGVnYWwgcmlnaHRzIG9mIHRoZSBjb21waWxhdGlvbidzIHVzZXJzCmJleW9uZCB3aGF0IHRoZSBpbmRpdmlkdWFsIHdvcmtzIHBlcm1pdC4gIEluY2x1c2lvbiBvZiBhIGNvdmVyZWQgd29yawppbiBhbiBhZ2dyZWdhdGUgZG9lcyBub3QgY2F1c2UgdGhpcyBMaWNlbnNlIHRvIGFwcGx5IHRvIHRoZSBvdGhlcgpwYXJ0cyBvZiB0aGUgYWdncmVnYXRlLgoKICA2LiBDb252ZXlpbmcgTm9uLVNvdXJjZSBGb3Jtcy4KCiAgWW91IG1heSBjb252ZXkgYSBjb3ZlcmVkIHdvcmsgaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciB0aGUgdGVybXMKb2Ygc2VjdGlvbnMgNCBhbmQgNSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBjb252ZXkgdGhlCm1hY2hpbmUtcmVhZGFibGUgQ29ycmVzcG9uZGluZyBTb3VyY2UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSwKaW4gb25lIG9mIHRoZXNlIHdheXM6CgogICAgYSkgQ29udmV5IHRoZSBvYmplY3QgY29kZSBpbiwgb3IgZW1ib2RpZWQgaW4sIGEgcGh5c2ljYWwgcHJvZHVjdAogICAgKGluY2x1ZGluZyBhIHBoeXNpY2FsIGRpc3RyaWJ1dGlvbiBtZWRpdW0pLCBhY2NvbXBhbmllZCBieSB0aGUKICAgIENvcnJlc3BvbmRpbmcgU291cmNlIGZpeGVkIG9uIGEgZHVyYWJsZSBwaHlzaWNhbCBtZWRpdW0KICAgIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlLgoKICAgIGIpIENvbnZleSB0aGUgb2JqZWN0IGNvZGUgaW4sIG9yIGVtYm9kaWVkIGluLCBhIHBoeXNpY2FsIHByb2R1Y3QKICAgIChpbmNsdWRpbmcgYSBwaHlzaWNhbCBkaXN0cmlidXRpb24gbWVkaXVtKSwgYWNjb21wYW5pZWQgYnkgYQogICAgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0IGxlYXN0IHRocmVlIHllYXJzIGFuZCB2YWxpZCBmb3IgYXMKICAgIGxvbmcgYXMgeW91IG9mZmVyIHNwYXJlIHBhcnRzIG9yIGN1c3RvbWVyIHN1cHBvcnQgZm9yIHRoYXQgcHJvZHVjdAogICAgbW9kZWwsIHRvIGdpdmUgYW55b25lIHdobyBwb3NzZXNzZXMgdGhlIG9iamVjdCBjb2RlIGVpdGhlciAoMSkgYQogICAgY29weSBvZiB0aGUgQ29ycmVzcG9uZGluZyBTb3VyY2UgZm9yIGFsbCB0aGUgc29mdHdhcmUgaW4gdGhlCiAgICBwcm9kdWN0IHRoYXQgaXMgY292ZXJlZCBieSB0aGlzIExpY2Vuc2UsIG9uIGEgZHVyYWJsZSBwaHlzaWNhbAogICAgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlLCBmb3IgYSBwcmljZSBubwogICAgbW9yZSB0aGFuIHlvdXIgcmVhc29uYWJsZSBjb3N0IG9mIHBoeXNpY2FsbHkgcGVyZm9ybWluZyB0aGlzCiAgICBjb252ZXlpbmcgb2Ygc291cmNlLCBvciAoMikgYWNjZXNzIHRvIGNvcHkgdGhlCiAgICBDb3JyZXNwb25kaW5nIFNvdXJjZSBmcm9tIGEgbmV0d29yayBzZXJ2ZXIgYXQgbm8gY2hhcmdlLgoKICAgIGMpIENvbnZleSBpbmRpdmlkdWFsIGNvcGllcyBvZiB0aGUgb2JqZWN0IGNvZGUgd2l0aCBhIGNvcHkgb2YgdGhlCiAgICB3cml0dGVuIG9mZmVyIHRvIHByb3ZpZGUgdGhlIENvcnJlc3BvbmRpbmcgU291cmNlLiAgVGhpcwogICAgYWx0ZXJuYXRpdmUgaXMgYWxsb3dlZCBvbmx5IG9jY2FzaW9uYWxseSBhbmQgbm9uY29tbWVyY2lhbGx5LCBhbmQKICAgIG9ubHkgaWYgeW91IHJlY2VpdmVkIHRoZSBvYmplY3QgY29kZSB3aXRoIHN1Y2ggYW4gb2ZmZXIsIGluIGFjY29yZAogICAgd2l0aCBzdWJzZWN0aW9uIDZiLgoKICAgIGQpIENvbnZleSB0aGUgb2JqZWN0IGNvZGUgYnkgb2ZmZXJpbmcgYWNjZXNzIGZyb20gYSBkZXNpZ25hdGVkCiAgICBwbGFjZSAoZ3JhdGlzIG9yIGZvciBhIGNoYXJnZSksIGFuZCBvZmZlciBlcXVpdmFsZW50IGFjY2VzcyB0byB0aGUKICAgIENvcnJlc3BvbmRpbmcgU291cmNlIGluIHRoZSBzYW1lIHdheSB0aHJvdWdoIHRoZSBzYW1lIHBsYWNlIGF0IG5vCiAgICBmdXJ0aGVyIGNoYXJnZS4gIFlvdSBuZWVkIG5vdCByZXF1aXJlIHJlY2lwaWVudHMgdG8gY29weSB0aGUKICAgIENvcnJlc3BvbmRpbmcgU291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLiAgSWYgdGhlIHBsYWNlIHRvCiAgICBjb3B5IHRoZSBvYmplY3QgY29kZSBpcyBhIG5ldHdvcmsgc2VydmVyLCB0aGUgQ29ycmVzcG9uZGluZyBTb3VyY2UKICAgIG1heSBiZSBvbiBhIGRpZmZlcmVudCBzZXJ2ZXIgKG9wZXJhdGVkIGJ5IHlvdSBvciBhIHRoaXJkIHBhcnR5KQogICAgdGhhdCBzdXBwb3J0cyBlcXVpdmFsZW50IGNvcHlpbmcgZmFjaWxpdGllcywgcHJvdmlkZWQgeW91IG1haW50YWluCiAgICBjbGVhciBkaXJlY3Rpb25zIG5leHQgdG8gdGhlIG9iamVjdCBjb2RlIHNheWluZyB3aGVyZSB0byBmaW5kIHRoZQogICAgQ29ycmVzcG9uZGluZyBTb3VyY2UuICBSZWdhcmRsZXNzIG9mIHdoYXQgc2VydmVyIGhvc3RzIHRoZQogICAgQ29ycmVzcG9uZGluZyBTb3VyY2UsIHlvdSByZW1haW4gb2JsaWdhdGVkIHRvIGVuc3VyZSB0aGF0IGl0IGlzCiAgICBhdmFpbGFibGUgZm9yIGFzIGxvbmcgYXMgbmVlZGVkIHRvIHNhdGlzZnkgdGhlc2UgcmVxdWlyZW1lbnRzLgoKICAgIGUpIENvbnZleSB0aGUgb2JqZWN0IGNvZGUgdXNpbmcgcGVlci10by1wZWVyIHRyYW5zbWlzc2lvbiwgcHJvdmlkZWQKICAgIHlvdSBpbmZvcm0gb3RoZXIgcGVlcnMgd2hlcmUgdGhlIG9iamVjdCBjb2RlIGFuZCBDb3JyZXNwb25kaW5nCiAgICBTb3VyY2Ugb2YgdGhlIHdvcmsgYXJlIGJlaW5nIG9mZmVyZWQgdG8gdGhlIGdlbmVyYWwgcHVibGljIGF0IG5vCiAgICBjaGFyZ2UgdW5kZXIgc3Vic2VjdGlvbiA2ZC4KCiAgQSBzZXBhcmFibGUgcG9ydGlvbiBvZiB0aGUgb2JqZWN0IGNvZGUsIHdob3NlIHNvdXJjZSBjb2RlIGlzIGV4Y2x1ZGVkCmZyb20gdGhlIENvcnJlc3BvbmRpbmcgU291cmNlIGFzIGEgU3lzdGVtIExpYnJhcnksIG5lZWQgbm90IGJlCmluY2x1ZGVkIGluIGNvbnZleWluZyB0aGUgb2JqZWN0IGNvZGUgd29yay4KCiAgQSAiVXNlciBQcm9kdWN0IiBpcyBlaXRoZXIgKDEpIGEgImNvbnN1bWVyIHByb2R1Y3QiLCB3aGljaCBtZWFucyBhbnkKdGFuZ2libGUgcGVyc29uYWwgcHJvcGVydHkgd2hpY2ggaXMgbm9ybWFsbHkgdXNlZCBmb3IgcGVyc29uYWwsIGZhbWlseSwKb3IgaG91c2Vob2xkIHB1cnBvc2VzLCBvciAoMikgYW55dGhpbmcgZGVzaWduZWQgb3Igc29sZCBmb3IgaW5jb3Jwb3JhdGlvbgppbnRvIGEgZHdlbGxpbmcuICBJbiBkZXRlcm1pbmluZyB3aGV0aGVyIGEgcHJvZHVjdCBpcyBhIGNvbnN1bWVyIHByb2R1Y3QsCmRvdWJ0ZnVsIGNhc2VzIHNoYWxsIGJlIHJlc29sdmVkIGluIGZhdm9yIG9mIGNvdmVyYWdlLiAgRm9yIGEgcGFydGljdWxhcgpwcm9kdWN0IHJlY2VpdmVkIGJ5IGEgcGFydGljdWxhciB1c2VyLCAibm9ybWFsbHkgdXNlZCIgcmVmZXJzIHRvIGEKdHlwaWNhbCBvciBjb21tb24gdXNlIG9mIHRoYXQgY2xhc3Mgb2YgcHJvZHVjdCwgcmVnYXJkbGVzcyBvZiB0aGUgc3RhdHVzCm9mIHRoZSBwYXJ0aWN1bGFyIHVzZXIgb3Igb2YgdGhlIHdheSBpbiB3aGljaCB0aGUgcGFydGljdWxhciB1c2VyCmFjdHVhbGx5IHVzZXMsIG9yIGV4cGVjdHMgb3IgaXMgZXhwZWN0ZWQgdG8gdXNlLCB0aGUgcHJvZHVjdC4gIEEgcHJvZHVjdAppcyBhIGNvbnN1bWVyIHByb2R1Y3QgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBwcm9kdWN0IGhhcyBzdWJzdGFudGlhbApjb21tZXJjaWFsLCBpbmR1c3RyaWFsIG9yIG5vbi1jb25zdW1lciB1c2VzLCB1bmxlc3Mgc3VjaCB1c2VzIHJlcHJlc2VudAp0aGUgb25seSBzaWduaWZpY2FudCBtb2RlIG9mIHVzZSBvZiB0aGUgcHJvZHVjdC4KCiAgIkluc3RhbGxhdGlvbiBJbmZvcm1hdGlvbiIgZm9yIGEgVXNlciBQcm9kdWN0IG1lYW5zIGFueSBtZXRob2RzLApwcm9jZWR1cmVzLCBhdXRob3JpemF0aW9uIGtleXMsIG9yIG90aGVyIGluZm9ybWF0aW9uIHJlcXVpcmVkIHRvIGluc3RhbGwKYW5kIGV4ZWN1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgYSBjb3ZlcmVkIHdvcmsgaW4gdGhhdCBVc2VyIFByb2R1Y3QgZnJvbQphIG1vZGlmaWVkIHZlcnNpb24gb2YgaXRzIENvcnJlc3BvbmRpbmcgU291cmNlLiAgVGhlIGluZm9ybWF0aW9uIG11c3QKc3VmZmljZSB0byBlbnN1cmUgdGhhdCB0aGUgY29udGludWVkIGZ1bmN0aW9uaW5nIG9mIHRoZSBtb2RpZmllZCBvYmplY3QKY29kZSBpcyBpbiBubyBjYXNlIHByZXZlbnRlZCBvciBpbnRlcmZlcmVkIHdpdGggc29sZWx5IGJlY2F1c2UKbW9kaWZpY2F0aW9uIGhhcyBiZWVuIG1hZGUuCgogIElmIHlvdSBjb252ZXkgYW4gb2JqZWN0IGNvZGUgd29yayB1bmRlciB0aGlzIHNlY3Rpb24gaW4sIG9yIHdpdGgsIG9yCnNwZWNpZmljYWxseSBmb3IgdXNlIGluLCBhIFVzZXIgUHJvZHVjdCwgYW5kIHRoZSBjb252ZXlpbmcgb2NjdXJzIGFzCnBhcnQgb2YgYSB0cmFuc2FjdGlvbiBpbiB3aGljaCB0aGUgcmlnaHQgb2YgcG9zc2Vzc2lvbiBhbmQgdXNlIG9mIHRoZQpVc2VyIFByb2R1Y3QgaXMgdHJhbnNmZXJyZWQgdG8gdGhlIHJlY2lwaWVudCBpbiBwZXJwZXR1aXR5IG9yIGZvciBhCmZpeGVkIHRlcm0gKHJlZ2FyZGxlc3Mgb2YgaG93IHRoZSB0cmFuc2FjdGlvbiBpcyBjaGFyYWN0ZXJpemVkKSwgdGhlCkNvcnJlc3BvbmRpbmcgU291cmNlIGNvbnZleWVkIHVuZGVyIHRoaXMgc2VjdGlvbiBtdXN0IGJlIGFjY29tcGFuaWVkCmJ5IHRoZSBJbnN0YWxsYXRpb24gSW5mb3JtYXRpb24uICBCdXQgdGhpcyByZXF1aXJlbWVudCBkb2VzIG5vdCBhcHBseQppZiBuZWl0aGVyIHlvdSBub3IgYW55IHRoaXJkIHBhcnR5IHJldGFpbnMgdGhlIGFiaWxpdHkgdG8gaW5zdGFsbAptb2RpZmllZCBvYmplY3QgY29kZSBvbiB0aGUgVXNlciBQcm9kdWN0IChmb3IgZXhhbXBsZSwgdGhlIHdvcmsgaGFzCmJlZW4gaW5zdGFsbGVkIGluIFJPTSkuCgogIFRoZSByZXF1aXJlbWVudCB0byBwcm92aWRlIEluc3RhbGxhdGlvbiBJbmZvcm1hdGlvbiBkb2VzIG5vdCBpbmNsdWRlIGEKcmVxdWlyZW1lbnQgdG8gY29udGludWUgdG8gcHJvdmlkZSBzdXBwb3J0IHNlcnZpY2UsIHdhcnJhbnR5LCBvciB1cGRhdGVzCmZvciBhIHdvcmsgdGhhdCBoYXMgYmVlbiBtb2RpZmllZCBvciBpbnN0YWxsZWQgYnkgdGhlIHJlY2lwaWVudCwgb3IgZm9yCnRoZSBVc2VyIFByb2R1Y3QgaW4gd2hpY2ggaXQgaGFzIGJlZW4gbW9kaWZpZWQgb3IgaW5zdGFsbGVkLiAgQWNjZXNzIHRvIGEKbmV0d29yayBtYXkgYmUgZGVuaWVkIHdoZW4gdGhlIG1vZGlmaWNhdGlvbiBpdHNlbGYgbWF0ZXJpYWxseSBhbmQKYWR2ZXJzZWx5IGFmZmVjdHMgdGhlIG9wZXJhdGlvbiBvZiB0aGUgbmV0d29yayBvciB2aW9sYXRlcyB0aGUgcnVsZXMgYW5kCnByb3RvY29scyBmb3IgY29tbXVuaWNhdGlvbiBhY3Jvc3MgdGhlIG5ldHdvcmsuCgogIENvcnJlc3BvbmRpbmcgU291cmNlIGNvbnZleWVkLCBhbmQgSW5zdGFsbGF0aW9uIEluZm9ybWF0aW9uIHByb3ZpZGVkLAppbiBhY2NvcmQgd2l0aCB0aGlzIHNlY3Rpb24gbXVzdCBiZSBpbiBhIGZvcm1hdCB0aGF0IGlzIHB1YmxpY2x5CmRvY3VtZW50ZWQgKGFuZCB3aXRoIGFuIGltcGxlbWVudGF0aW9uIGF2YWlsYWJsZSB0byB0aGUgcHVibGljIGluCnNvdXJjZSBjb2RlIGZvcm0pLCBhbmQgbXVzdCByZXF1aXJlIG5vIHNwZWNpYWwgcGFzc3dvcmQgb3Iga2V5IGZvcgp1bnBhY2tpbmcsIHJlYWRpbmcgb3IgY29weWluZy4KCiAgNy4gQWRkaXRpb25hbCBUZXJtcy4KCiAgIkFkZGl0aW9uYWwgcGVybWlzc2lvbnMiIGFyZSB0ZXJtcyB0aGF0IHN1cHBsZW1lbnQgdGhlIHRlcm1zIG9mIHRoaXMKTGljZW5zZSBieSBtYWtpbmcgZXhjZXB0aW9ucyBmcm9tIG9uZSBvciBtb3JlIG9mIGl0cyBjb25kaXRpb25zLgpBZGRpdGlvbmFsIHBlcm1pc3Npb25zIHRoYXQgYXJlIGFwcGxpY2FibGUgdG8gdGhlIGVudGlyZSBQcm9ncmFtIHNoYWxsCmJlIHRyZWF0ZWQgYXMgdGhvdWdoIHRoZXkgd2VyZSBpbmNsdWRlZCBpbiB0aGlzIExpY2Vuc2UsIHRvIHRoZSBleHRlbnQKdGhhdCB0aGV5IGFyZSB2YWxpZCB1bmRlciBhcHBsaWNhYmxlIGxhdy4gIElmIGFkZGl0aW9uYWwgcGVybWlzc2lvbnMKYXBwbHkgb25seSB0byBwYXJ0IG9mIHRoZSBQcm9ncmFtLCB0aGF0IHBhcnQgbWF5IGJlIHVzZWQgc2VwYXJhdGVseQp1bmRlciB0aG9zZSBwZXJtaXNzaW9ucywgYnV0IHRoZSBlbnRpcmUgUHJvZ3JhbSByZW1haW5zIGdvdmVybmVkIGJ5CnRoaXMgTGljZW5zZSB3aXRob3V0IHJlZ2FyZCB0byB0aGUgYWRkaXRpb25hbCBwZXJtaXNzaW9ucy4KCiAgV2hlbiB5b3UgY29udmV5IGEgY29weSBvZiBhIGNvdmVyZWQgd29yaywgeW91IG1heSBhdCB5b3VyIG9wdGlvbgpyZW1vdmUgYW55IGFkZGl0aW9uYWwgcGVybWlzc2lvbnMgZnJvbSB0aGF0IGNvcHksIG9yIGZyb20gYW55IHBhcnQgb2YKaXQuICAoQWRkaXRpb25hbCBwZXJtaXNzaW9ucyBtYXkgYmUgd3JpdHRlbiB0byByZXF1aXJlIHRoZWlyIG93bgpyZW1vdmFsIGluIGNlcnRhaW4gY2FzZXMgd2hlbiB5b3UgbW9kaWZ5IHRoZSB3b3JrLikgIFlvdSBtYXkgcGxhY2UKYWRkaXRpb25hbCBwZXJtaXNzaW9ucyBvbiBtYXRlcmlhbCwgYWRkZWQgYnkgeW91IHRvIGEgY292ZXJlZCB3b3JrLApmb3Igd2hpY2ggeW91IGhhdmUgb3IgY2FuIGdpdmUgYXBwcm9wcmlhdGUgY29weXJpZ2h0IHBlcm1pc3Npb24uCgogIE5vdHdpdGhzdGFuZGluZyBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSwgZm9yIG1hdGVyaWFsIHlvdQphZGQgdG8gYSBjb3ZlcmVkIHdvcmssIHlvdSBtYXkgKGlmIGF1dGhvcml6ZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mCnRoYXQgbWF0ZXJpYWwpIHN1cHBsZW1lbnQgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSB3aXRoIHRlcm1zOgoKICAgIGEpIERpc2NsYWltaW5nIHdhcnJhbnR5IG9yIGxpbWl0aW5nIGxpYWJpbGl0eSBkaWZmZXJlbnRseSBmcm9tIHRoZQogICAgdGVybXMgb2Ygc2VjdGlvbnMgMTUgYW5kIDE2IG9mIHRoaXMgTGljZW5zZTsgb3IKCiAgICBiKSBSZXF1aXJpbmcgcHJlc2VydmF0aW9uIG9mIHNwZWNpZmllZCByZWFzb25hYmxlIGxlZ2FsIG5vdGljZXMgb3IKICAgIGF1dGhvciBhdHRyaWJ1dGlvbnMgaW4gdGhhdCBtYXRlcmlhbCBvciBpbiB0aGUgQXBwcm9wcmlhdGUgTGVnYWwKICAgIE5vdGljZXMgZGlzcGxheWVkIGJ5IHdvcmtzIGNvbnRhaW5pbmcgaXQ7IG9yCgogICAgYykgUHJvaGliaXRpbmcgbWlzcmVwcmVzZW50YXRpb24gb2YgdGhlIG9yaWdpbiBvZiB0aGF0IG1hdGVyaWFsLCBvcgogICAgcmVxdWlyaW5nIHRoYXQgbW9kaWZpZWQgdmVyc2lvbnMgb2Ygc3VjaCBtYXRlcmlhbCBiZSBtYXJrZWQgaW4KICAgIHJlYXNvbmFibGUgd2F5cyBhcyBkaWZmZXJlbnQgZnJvbSB0aGUgb3JpZ2luYWwgdmVyc2lvbjsgb3IKCiAgICBkKSBMaW1pdGluZyB0aGUgdXNlIGZvciBwdWJsaWNpdHkgcHVycG9zZXMgb2YgbmFtZXMgb2YgbGljZW5zb3JzIG9yCiAgICBhdXRob3JzIG9mIHRoZSBtYXRlcmlhbDsgb3IKCiAgICBlKSBEZWNsaW5pbmcgdG8gZ3JhbnQgcmlnaHRzIHVuZGVyIHRyYWRlbWFyayBsYXcgZm9yIHVzZSBvZiBzb21lCiAgICB0cmFkZSBuYW1lcywgdHJhZGVtYXJrcywgb3Igc2VydmljZSBtYXJrczsgb3IKCiAgICBmKSBSZXF1aXJpbmcgaW5kZW1uaWZpY2F0aW9uIG9mIGxpY2Vuc29ycyBhbmQgYXV0aG9ycyBvZiB0aGF0CiAgICBtYXRlcmlhbCBieSBhbnlvbmUgd2hvIGNvbnZleXMgdGhlIG1hdGVyaWFsIChvciBtb2RpZmllZCB2ZXJzaW9ucyBvZgogICAgaXQpIHdpdGggY29udHJhY3R1YWwgYXNzdW1wdGlvbnMgb2YgbGlhYmlsaXR5IHRvIHRoZSByZWNpcGllbnQsIGZvcgogICAgYW55IGxpYWJpbGl0eSB0aGF0IHRoZXNlIGNvbnRyYWN0dWFsIGFzc3VtcHRpb25zIGRpcmVjdGx5IGltcG9zZSBvbgogICAgdGhvc2UgbGljZW5zb3JzIGFuZCBhdXRob3JzLgoKICBBbGwgb3RoZXIgbm9uLXBlcm1pc3NpdmUgYWRkaXRpb25hbCB0ZXJtcyBhcmUgY29uc2lkZXJlZCAiZnVydGhlcgpyZXN0cmljdGlvbnMiIHdpdGhpbiB0aGUgbWVhbmluZyBvZiBzZWN0aW9uIDEwLiAgSWYgdGhlIFByb2dyYW0gYXMgeW91CnJlY2VpdmVkIGl0LCBvciBhbnkgcGFydCBvZiBpdCwgY29udGFpbnMgYSBub3RpY2Ugc3RhdGluZyB0aGF0IGl0IGlzCmdvdmVybmVkIGJ5IHRoaXMgTGljZW5zZSBhbG9uZyB3aXRoIGEgdGVybSB0aGF0IGlzIGEgZnVydGhlcgpyZXN0cmljdGlvbiwgeW91IG1heSByZW1vdmUgdGhhdCB0ZXJtLiAgSWYgYSBsaWNlbnNlIGRvY3VtZW50IGNvbnRhaW5zCmEgZnVydGhlciByZXN0cmljdGlvbiBidXQgcGVybWl0cyByZWxpY2Vuc2luZyBvciBjb252ZXlpbmcgdW5kZXIgdGhpcwpMaWNlbnNlLCB5b3UgbWF5IGFkZCB0byBhIGNvdmVyZWQgd29yayBtYXRlcmlhbCBnb3Zlcm5lZCBieSB0aGUgdGVybXMKb2YgdGhhdCBsaWNlbnNlIGRvY3VtZW50LCBwcm92aWRlZCB0aGF0IHRoZSBmdXJ0aGVyIHJlc3RyaWN0aW9uIGRvZXMKbm90IHN1cnZpdmUgc3VjaCByZWxpY2Vuc2luZyBvciBjb252ZXlpbmcuCgogIElmIHlvdSBhZGQgdGVybXMgdG8gYSBjb3ZlcmVkIHdvcmsgaW4gYWNjb3JkIHdpdGggdGhpcyBzZWN0aW9uLCB5b3UKbXVzdCBwbGFjZSwgaW4gdGhlIHJlbGV2YW50IHNvdXJjZSBmaWxlcywgYSBzdGF0ZW1lbnQgb2YgdGhlCmFkZGl0aW9uYWwgdGVybXMgdGhhdCBhcHBseSB0byB0aG9zZSBmaWxlcywgb3IgYSBub3RpY2UgaW5kaWNhdGluZwp3aGVyZSB0byBmaW5kIHRoZSBhcHBsaWNhYmxlIHRlcm1zLgoKICBBZGRpdGlvbmFsIHRlcm1zLCBwZXJtaXNzaXZlIG9yIG5vbi1wZXJtaXNzaXZlLCBtYXkgYmUgc3RhdGVkIGluIHRoZQpmb3JtIG9mIGEgc2VwYXJhdGVseSB3cml0dGVuIGxpY2Vuc2UsIG9yIHN0YXRlZCBhcyBleGNlcHRpb25zOwp0aGUgYWJvdmUgcmVxdWlyZW1lbnRzIGFwcGx5IGVpdGhlciB3YXkuCgogIDguIFRlcm1pbmF0aW9uLgoKICBZb3UgbWF5IG5vdCBwcm9wYWdhdGUgb3IgbW9kaWZ5IGEgY292ZXJlZCB3b3JrIGV4Y2VwdCBhcyBleHByZXNzbHkKcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55IGF0dGVtcHQgb3RoZXJ3aXNlIHRvIHByb3BhZ2F0ZSBvcgptb2RpZnkgaXQgaXMgdm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91ciByaWdodHMgdW5kZXIKdGhpcyBMaWNlbnNlIChpbmNsdWRpbmcgYW55IHBhdGVudCBsaWNlbnNlcyBncmFudGVkIHVuZGVyIHRoZSB0aGlyZApwYXJhZ3JhcGggb2Ygc2VjdGlvbiAxMSkuCgogIEhvd2V2ZXIsIGlmIHlvdSBjZWFzZSBhbGwgdmlvbGF0aW9uIG9mIHRoaXMgTGljZW5zZSwgdGhlbiB5b3VyCmxpY2Vuc2UgZnJvbSBhIHBhcnRpY3VsYXIgY29weXJpZ2h0IGhvbGRlciBpcyByZWluc3RhdGVkIChhKQpwcm92aXNpb25hbGx5LCB1bmxlc3MgYW5kIHVudGlsIHRoZSBjb3B5cmlnaHQgaG9sZGVyIGV4cGxpY2l0bHkgYW5kCmZpbmFsbHkgdGVybWluYXRlcyB5b3VyIGxpY2Vuc2UsIGFuZCAoYikgcGVybWFuZW50bHksIGlmIHRoZSBjb3B5cmlnaHQKaG9sZGVyIGZhaWxzIHRvIG5vdGlmeSB5b3Ugb2YgdGhlIHZpb2xhdGlvbiBieSBzb21lIHJlYXNvbmFibGUgbWVhbnMKcHJpb3IgdG8gNjAgZGF5cyBhZnRlciB0aGUgY2Vzc2F0aW9uLgoKICBNb3Jlb3ZlciwgeW91ciBsaWNlbnNlIGZyb20gYSBwYXJ0aWN1bGFyIGNvcHlyaWdodCBob2xkZXIgaXMKcmVpbnN0YXRlZCBwZXJtYW5lbnRseSBpZiB0aGUgY29weXJpZ2h0IGhvbGRlciBub3RpZmllcyB5b3Ugb2YgdGhlCnZpb2xhdGlvbiBieSBzb21lIHJlYXNvbmFibGUgbWVhbnMsIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgeW91IGhhdmUKcmVjZWl2ZWQgbm90aWNlIG9mIHZpb2xhdGlvbiBvZiB0aGlzIExpY2Vuc2UgKGZvciBhbnkgd29yaykgZnJvbSB0aGF0CmNvcHlyaWdodCBob2xkZXIsIGFuZCB5b3UgY3VyZSB0aGUgdmlvbGF0aW9uIHByaW9yIHRvIDMwIGRheXMgYWZ0ZXIKeW91ciByZWNlaXB0IG9mIHRoZSBub3RpY2UuCgogIFRlcm1pbmF0aW9uIG9mIHlvdXIgcmlnaHRzIHVuZGVyIHRoaXMgc2VjdGlvbiBkb2VzIG5vdCB0ZXJtaW5hdGUgdGhlCmxpY2Vuc2VzIG9mIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9yIHJpZ2h0cyBmcm9tIHlvdSB1bmRlcgp0aGlzIExpY2Vuc2UuICBJZiB5b3VyIHJpZ2h0cyBoYXZlIGJlZW4gdGVybWluYXRlZCBhbmQgbm90IHBlcm1hbmVudGx5CnJlaW5zdGF0ZWQsIHlvdSBkbyBub3QgcXVhbGlmeSB0byByZWNlaXZlIG5ldyBsaWNlbnNlcyBmb3IgdGhlIHNhbWUKbWF0ZXJpYWwgdW5kZXIgc2VjdGlvbiAxMC4KCiAgOS4gQWNjZXB0YW5jZSBOb3QgUmVxdWlyZWQgZm9yIEhhdmluZyBDb3BpZXMuCgogIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UgaW4gb3JkZXIgdG8gcmVjZWl2ZSBvcgpydW4gYSBjb3B5IG9mIHRoZSBQcm9ncmFtLiAgQW5jaWxsYXJ5IHByb3BhZ2F0aW9uIG9mIGEgY292ZXJlZCB3b3JrCm9jY3VycmluZyBzb2xlbHkgYXMgYSBjb25zZXF1ZW5jZSBvZiB1c2luZyBwZWVyLXRvLXBlZXIgdHJhbnNtaXNzaW9uCnRvIHJlY2VpdmUgYSBjb3B5IGxpa2V3aXNlIGRvZXMgbm90IHJlcXVpcmUgYWNjZXB0YW5jZS4gIEhvd2V2ZXIsCm5vdGhpbmcgb3RoZXIgdGhhbiB0aGlzIExpY2Vuc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIHByb3BhZ2F0ZSBvcgptb2RpZnkgYW55IGNvdmVyZWQgd29yay4gIFRoZXNlIGFjdGlvbnMgaW5mcmluZ2UgY29weXJpZ2h0IGlmIHlvdSBkbwpub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkgbW9kaWZ5aW5nIG9yIHByb3BhZ2F0aW5nIGEKY292ZXJlZCB3b3JrLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzby4KCiAgMTAuIEF1dG9tYXRpYyBMaWNlbnNpbmcgb2YgRG93bnN0cmVhbSBSZWNpcGllbnRzLgoKICBFYWNoIHRpbWUgeW91IGNvbnZleSBhIGNvdmVyZWQgd29yaywgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5CnJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZSBvcmlnaW5hbCBsaWNlbnNvcnMsIHRvIHJ1biwgbW9kaWZ5IGFuZApwcm9wYWdhdGUgdGhhdCB3b3JrLCBzdWJqZWN0IHRvIHRoaXMgTGljZW5zZS4gIFlvdSBhcmUgbm90IHJlc3BvbnNpYmxlCmZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHdpdGggdGhpcyBMaWNlbnNlLgoKICBBbiAiZW50aXR5IHRyYW5zYWN0aW9uIiBpcyBhIHRyYW5zYWN0aW9uIHRyYW5zZmVycmluZyBjb250cm9sIG9mIGFuCm9yZ2FuaXphdGlvbiwgb3Igc3Vic3RhbnRpYWxseSBhbGwgYXNzZXRzIG9mIG9uZSwgb3Igc3ViZGl2aWRpbmcgYW4Kb3JnYW5pemF0aW9uLCBvciBtZXJnaW5nIG9yZ2FuaXphdGlvbnMuICBJZiBwcm9wYWdhdGlvbiBvZiBhIGNvdmVyZWQKd29yayByZXN1bHRzIGZyb20gYW4gZW50aXR5IHRyYW5zYWN0aW9uLCBlYWNoIHBhcnR5IHRvIHRoYXQKdHJhbnNhY3Rpb24gd2hvIHJlY2VpdmVzIGEgY29weSBvZiB0aGUgd29yayBhbHNvIHJlY2VpdmVzIHdoYXRldmVyCmxpY2Vuc2VzIHRvIHRoZSB3b3JrIHRoZSBwYXJ0eSdzIHByZWRlY2Vzc29yIGluIGludGVyZXN0IGhhZCBvciBjb3VsZApnaXZlIHVuZGVyIHRoZSBwcmV2aW91cyBwYXJhZ3JhcGgsIHBsdXMgYSByaWdodCB0byBwb3NzZXNzaW9uIG9mIHRoZQpDb3JyZXNwb25kaW5nIFNvdXJjZSBvZiB0aGUgd29yayBmcm9tIHRoZSBwcmVkZWNlc3NvciBpbiBpbnRlcmVzdCwgaWYKdGhlIHByZWRlY2Vzc29yIGhhcyBpdCBvciBjYW4gZ2V0IGl0IHdpdGggcmVhc29uYWJsZSBlZmZvcnRzLgoKICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIgcmVzdHJpY3Rpb25zIG9uIHRoZSBleGVyY2lzZSBvZiB0aGUKcmlnaHRzIGdyYW50ZWQgb3IgYWZmaXJtZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgRm9yIGV4YW1wbGUsIHlvdSBtYXkKbm90IGltcG9zZSBhIGxpY2Vuc2UgZmVlLCByb3lhbHR5LCBvciBvdGhlciBjaGFyZ2UgZm9yIGV4ZXJjaXNlIG9mCnJpZ2h0cyBncmFudGVkIHVuZGVyIHRoaXMgTGljZW5zZSwgYW5kIHlvdSBtYXkgbm90IGluaXRpYXRlIGxpdGlnYXRpb24KKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQKYW55IHBhdGVudCBjbGFpbSBpcyBpbmZyaW5nZWQgYnkgbWFraW5nLCB1c2luZywgc2VsbGluZywgb2ZmZXJpbmcgZm9yCnNhbGUsIG9yIGltcG9ydGluZyB0aGUgUHJvZ3JhbSBvciBhbnkgcG9ydGlvbiBvZiBpdC4KCiAgMTEuIFBhdGVudHMuCgogIEEgImNvbnRyaWJ1dG9yIiBpcyBhIGNvcHlyaWdodCBob2xkZXIgd2hvIGF1dGhvcml6ZXMgdXNlIHVuZGVyIHRoaXMKTGljZW5zZSBvZiB0aGUgUHJvZ3JhbSBvciBhIHdvcmsgb24gd2hpY2ggdGhlIFByb2dyYW0gaXMgYmFzZWQuICBUaGUKd29yayB0aHVzIGxpY2Vuc2VkIGlzIGNhbGxlZCB0aGUgY29udHJpYnV0b3IncyAiY29udHJpYnV0b3IgdmVyc2lvbiIuCgogIEEgY29udHJpYnV0b3IncyAiZXNzZW50aWFsIHBhdGVudCBjbGFpbXMiIGFyZSBhbGwgcGF0ZW50IGNsYWltcwpvd25lZCBvciBjb250cm9sbGVkIGJ5IHRoZSBjb250cmlidXRvciwgd2hldGhlciBhbHJlYWR5IGFjcXVpcmVkIG9yCmhlcmVhZnRlciBhY3F1aXJlZCwgdGhhdCB3b3VsZCBiZSBpbmZyaW5nZWQgYnkgc29tZSBtYW5uZXIsIHBlcm1pdHRlZApieSB0aGlzIExpY2Vuc2UsIG9mIG1ha2luZywgdXNpbmcsIG9yIHNlbGxpbmcgaXRzIGNvbnRyaWJ1dG9yIHZlcnNpb24sCmJ1dCBkbyBub3QgaW5jbHVkZSBjbGFpbXMgdGhhdCB3b3VsZCBiZSBpbmZyaW5nZWQgb25seSBhcyBhCmNvbnNlcXVlbmNlIG9mIGZ1cnRoZXIgbW9kaWZpY2F0aW9uIG9mIHRoZSBjb250cmlidXRvciB2ZXJzaW9uLiAgRm9yCnB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgImNvbnRyb2wiIGluY2x1ZGVzIHRoZSByaWdodCB0byBncmFudApwYXRlbnQgc3VibGljZW5zZXMgaW4gYSBtYW5uZXIgY29uc2lzdGVudCB3aXRoIHRoZSByZXF1aXJlbWVudHMgb2YKdGhpcyBMaWNlbnNlLgoKICBFYWNoIGNvbnRyaWJ1dG9yIGdyYW50cyB5b3UgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZQpwYXRlbnQgbGljZW5zZSB1bmRlciB0aGUgY29udHJpYnV0b3IncyBlc3NlbnRpYWwgcGF0ZW50IGNsYWltcywgdG8KbWFrZSwgdXNlLCBzZWxsLCBvZmZlciBmb3Igc2FsZSwgaW1wb3J0IGFuZCBvdGhlcndpc2UgcnVuLCBtb2RpZnkgYW5kCnByb3BhZ2F0ZSB0aGUgY29udGVudHMgb2YgaXRzIGNvbnRyaWJ1dG9yIHZlcnNpb24uCgogIEluIHRoZSBmb2xsb3dpbmcgdGhyZWUgcGFyYWdyYXBocywgYSAicGF0ZW50IGxpY2Vuc2UiIGlzIGFueSBleHByZXNzCmFncmVlbWVudCBvciBjb21taXRtZW50LCBob3dldmVyIGRlbm9taW5hdGVkLCBub3QgdG8gZW5mb3JjZSBhIHBhdGVudAooc3VjaCBhcyBhbiBleHByZXNzIHBlcm1pc3Npb24gdG8gcHJhY3RpY2UgYSBwYXRlbnQgb3IgY292ZW5hbnQgbm90IHRvCnN1ZSBmb3IgcGF0ZW50IGluZnJpbmdlbWVudCkuICBUbyAiZ3JhbnQiIHN1Y2ggYSBwYXRlbnQgbGljZW5zZSB0byBhCnBhcnR5IG1lYW5zIHRvIG1ha2Ugc3VjaCBhbiBhZ3JlZW1lbnQgb3IgY29tbWl0bWVudCBub3QgdG8gZW5mb3JjZSBhCnBhdGVudCBhZ2FpbnN0IHRoZSBwYXJ0eS4KCiAgSWYgeW91IGNvbnZleSBhIGNvdmVyZWQgd29yaywga25vd2luZ2x5IHJlbHlpbmcgb24gYSBwYXRlbnQgbGljZW5zZSwKYW5kIHRoZSBDb3JyZXNwb25kaW5nIFNvdXJjZSBvZiB0aGUgd29yayBpcyBub3QgYXZhaWxhYmxlIGZvciBhbnlvbmUKdG8gY29weSwgZnJlZSBvZiBjaGFyZ2UgYW5kIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UsIHRocm91Z2ggYQpwdWJsaWNseSBhdmFpbGFibGUgbmV0d29yayBzZXJ2ZXIgb3Igb3RoZXIgcmVhZGlseSBhY2Nlc3NpYmxlIG1lYW5zLAp0aGVuIHlvdSBtdXN0IGVpdGhlciAoMSkgY2F1c2UgdGhlIENvcnJlc3BvbmRpbmcgU291cmNlIHRvIGJlIHNvCmF2YWlsYWJsZSwgb3IgKDIpIGFycmFuZ2UgdG8gZGVwcml2ZSB5b3Vyc2VsZiBvZiB0aGUgYmVuZWZpdCBvZiB0aGUKcGF0ZW50IGxpY2Vuc2UgZm9yIHRoaXMgcGFydGljdWxhciB3b3JrLCBvciAoMykgYXJyYW5nZSwgaW4gYSBtYW5uZXIKY29uc2lzdGVudCB3aXRoIHRoZSByZXF1aXJlbWVudHMgb2YgdGhpcyBMaWNlbnNlLCB0byBleHRlbmQgdGhlIHBhdGVudApsaWNlbnNlIHRvIGRvd25zdHJlYW0gcmVjaXBpZW50cy4gICJLbm93aW5nbHkgcmVseWluZyIgbWVhbnMgeW91IGhhdmUKYWN0dWFsIGtub3dsZWRnZSB0aGF0LCBidXQgZm9yIHRoZSBwYXRlbnQgbGljZW5zZSwgeW91ciBjb252ZXlpbmcgdGhlCmNvdmVyZWQgd29yayBpbiBhIGNvdW50cnksIG9yIHlvdXIgcmVjaXBpZW50J3MgdXNlIG9mIHRoZSBjb3ZlcmVkIHdvcmsKaW4gYSBjb3VudHJ5LCB3b3VsZCBpbmZyaW5nZSBvbmUgb3IgbW9yZSBpZGVudGlmaWFibGUgcGF0ZW50cyBpbiB0aGF0CmNvdW50cnkgdGhhdCB5b3UgaGF2ZSByZWFzb24gdG8gYmVsaWV2ZSBhcmUgdmFsaWQuCgogIElmLCBwdXJzdWFudCB0byBvciBpbiBjb25uZWN0aW9uIHdpdGggYSBzaW5nbGUgdHJhbnNhY3Rpb24gb3IKYXJyYW5nZW1lbnQsIHlvdSBjb252ZXksIG9yIHByb3BhZ2F0ZSBieSBwcm9jdXJpbmcgY29udmV5YW5jZSBvZiwgYQpjb3ZlcmVkIHdvcmssIGFuZCBncmFudCBhIHBhdGVudCBsaWNlbnNlIHRvIHNvbWUgb2YgdGhlIHBhcnRpZXMKcmVjZWl2aW5nIHRoZSBjb3ZlcmVkIHdvcmsgYXV0aG9yaXppbmcgdGhlbSB0byB1c2UsIHByb3BhZ2F0ZSwgbW9kaWZ5Cm9yIGNvbnZleSBhIHNwZWNpZmljIGNvcHkgb2YgdGhlIGNvdmVyZWQgd29yaywgdGhlbiB0aGUgcGF0ZW50IGxpY2Vuc2UKeW91IGdyYW50IGlzIGF1dG9tYXRpY2FsbHkgZXh0ZW5kZWQgdG8gYWxsIHJlY2lwaWVudHMgb2YgdGhlIGNvdmVyZWQKd29yayBhbmQgd29ya3MgYmFzZWQgb24gaXQuCgogIEEgcGF0ZW50IGxpY2Vuc2UgaXMgImRpc2NyaW1pbmF0b3J5IiBpZiBpdCBkb2VzIG5vdCBpbmNsdWRlIHdpdGhpbgp0aGUgc2NvcGUgb2YgaXRzIGNvdmVyYWdlLCBwcm9oaWJpdHMgdGhlIGV4ZXJjaXNlIG9mLCBvciBpcwpjb25kaXRpb25lZCBvbiB0aGUgbm9uLWV4ZXJjaXNlIG9mIG9uZSBvciBtb3JlIG9mIHRoZSByaWdodHMgdGhhdCBhcmUKc3BlY2lmaWNhbGx5IGdyYW50ZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgWW91IG1heSBub3QgY29udmV5IGEgY292ZXJlZAp3b3JrIGlmIHlvdSBhcmUgYSBwYXJ0eSB0byBhbiBhcnJhbmdlbWVudCB3aXRoIGEgdGhpcmQgcGFydHkgdGhhdCBpcwppbiB0aGUgYnVzaW5lc3Mgb2YgZGlzdHJpYnV0aW5nIHNvZnR3YXJlLCB1bmRlciB3aGljaCB5b3UgbWFrZSBwYXltZW50CnRvIHRoZSB0aGlyZCBwYXJ0eSBiYXNlZCBvbiB0aGUgZXh0ZW50IG9mIHlvdXIgYWN0aXZpdHkgb2YgY29udmV5aW5nCnRoZSB3b3JrLCBhbmQgdW5kZXIgd2hpY2ggdGhlIHRoaXJkIHBhcnR5IGdyYW50cywgdG8gYW55IG9mIHRoZQpwYXJ0aWVzIHdobyB3b3VsZCByZWNlaXZlIHRoZSBjb3ZlcmVkIHdvcmsgZnJvbSB5b3UsIGEgZGlzY3JpbWluYXRvcnkKcGF0ZW50IGxpY2Vuc2UgKGEpIGluIGNvbm5lY3Rpb24gd2l0aCBjb3BpZXMgb2YgdGhlIGNvdmVyZWQgd29yawpjb252ZXllZCBieSB5b3UgKG9yIGNvcGllcyBtYWRlIGZyb20gdGhvc2UgY29waWVzKSwgb3IgKGIpIHByaW1hcmlseQpmb3IgYW5kIGluIGNvbm5lY3Rpb24gd2l0aCBzcGVjaWZpYyBwcm9kdWN0cyBvciBjb21waWxhdGlvbnMgdGhhdApjb250YWluIHRoZSBjb3ZlcmVkIHdvcmssIHVubGVzcyB5b3UgZW50ZXJlZCBpbnRvIHRoYXQgYXJyYW5nZW1lbnQsCm9yIHRoYXQgcGF0ZW50IGxpY2Vuc2Ugd2FzIGdyYW50ZWQsIHByaW9yIHRvIDI4IE1hcmNoIDIwMDcuCgogIE5vdGhpbmcgaW4gdGhpcyBMaWNlbnNlIHNoYWxsIGJlIGNvbnN0cnVlZCBhcyBleGNsdWRpbmcgb3IgbGltaXRpbmcKYW55IGltcGxpZWQgbGljZW5zZSBvciBvdGhlciBkZWZlbnNlcyB0byBpbmZyaW5nZW1lbnQgdGhhdCBtYXkKb3RoZXJ3aXNlIGJlIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYXBwbGljYWJsZSBwYXRlbnQgbGF3LgoKICAxMi4gTm8gU3VycmVuZGVyIG9mIE90aGVycycgRnJlZWRvbS4KCiAgSWYgY29uZGl0aW9ucyBhcmUgaW1wb3NlZCBvbiB5b3UgKHdoZXRoZXIgYnkgY291cnQgb3JkZXIsIGFncmVlbWVudCBvcgpvdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90CmV4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90IGNvbnZleSBhCmNvdmVyZWQgd29yayBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcwpMaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91IG1heQpub3QgY29udmV5IGl0IGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiB5b3UgYWdyZWUgdG8gdGVybXMgdGhhdCBvYmxpZ2F0ZSB5b3UKdG8gY29sbGVjdCBhIHJveWFsdHkgZm9yIGZ1cnRoZXIgY29udmV5aW5nIGZyb20gdGhvc2UgdG8gd2hvbSB5b3UgY29udmV5CnRoZSBQcm9ncmFtLCB0aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCB0aG9zZSB0ZXJtcyBhbmQgdGhpcwpMaWNlbnNlIHdvdWxkIGJlIHRvIHJlZnJhaW4gZW50aXJlbHkgZnJvbSBjb252ZXlpbmcgdGhlIFByb2dyYW0uCgogIDEzLiBVc2Ugd2l0aCB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgoKICBOb3R3aXRoc3RhbmRpbmcgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UsIHlvdSBoYXZlCnBlcm1pc3Npb24gdG8gbGluayBvciBjb21iaW5lIGFueSBjb3ZlcmVkIHdvcmsgd2l0aCBhIHdvcmsgbGljZW5zZWQKdW5kZXIgdmVyc2lvbiAzIG9mIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaW50byBhIHNpbmdsZQpjb21iaW5lZCB3b3JrLCBhbmQgdG8gY29udmV5IHRoZSByZXN1bHRpbmcgd29yay4gIFRoZSB0ZXJtcyBvZiB0aGlzCkxpY2Vuc2Ugd2lsbCBjb250aW51ZSB0byBhcHBseSB0byB0aGUgcGFydCB3aGljaCBpcyB0aGUgY292ZXJlZCB3b3JrLApidXQgdGhlIHNwZWNpYWwgcmVxdWlyZW1lbnRzIG9mIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCnNlY3Rpb24gMTMsIGNvbmNlcm5pbmcgaW50ZXJhY3Rpb24gdGhyb3VnaCBhIG5ldHdvcmsgd2lsbCBhcHBseSB0byB0aGUKY29tYmluYXRpb24gYXMgc3VjaC4KCiAgMTQuIFJldmlzZWQgVmVyc2lvbnMgb2YgdGhpcyBMaWNlbnNlLgoKICBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldyB2ZXJzaW9ucyBvZgp0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuICBTdWNoIG5ldyB2ZXJzaW9ucyB3aWxsCmJlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sIGJ1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0bwphZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KCiAgRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUKUHJvZ3JhbSBzcGVjaWZpZXMgdGhhdCBhIGNlcnRhaW4gbnVtYmVyZWQgdmVyc2lvbiBvZiB0aGUgR05VIEdlbmVyYWwKUHVibGljIExpY2Vuc2UgIm9yIGFueSBsYXRlciB2ZXJzaW9uIiBhcHBsaWVzIHRvIGl0LCB5b3UgaGF2ZSB0aGUKb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZWl0aGVyIG9mIHRoYXQgbnVtYmVyZWQKdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKRm91bmRhdGlvbi4gIElmIHRoZSBQcm9ncmFtIGRvZXMgbm90IHNwZWNpZnkgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGUKR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkCmJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCgogIElmIHRoZSBQcm9ncmFtIHNwZWNpZmllcyB0aGF0IGEgcHJveHkgY2FuIGRlY2lkZSB3aGljaCBmdXR1cmUKdmVyc2lvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB1c2VkLCB0aGF0IHByb3h5J3MKcHVibGljIHN0YXRlbWVudCBvZiBhY2NlcHRhbmNlIG9mIGEgdmVyc2lvbiBwZXJtYW5lbnRseSBhdXRob3JpemVzIHlvdQp0byBjaG9vc2UgdGhhdCB2ZXJzaW9uIGZvciB0aGUgUHJvZ3JhbS4KCiAgTGF0ZXIgbGljZW5zZSB2ZXJzaW9ucyBtYXkgZ2l2ZSB5b3UgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQKcGVybWlzc2lvbnMuICBIb3dldmVyLCBubyBhZGRpdGlvbmFsIG9ibGlnYXRpb25zIGFyZSBpbXBvc2VkIG9uIGFueQphdXRob3Igb3IgY29weXJpZ2h0IGhvbGRlciBhcyBhIHJlc3VsdCBvZiB5b3VyIGNob29zaW5nIHRvIGZvbGxvdyBhCmxhdGVyIHZlcnNpb24uCgogIDE1LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LgoKICBUSEVSRSBJUyBOTyBXQVJSQU5UWSBGT1IgVEhFIFBST0dSQU0sIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZCkFQUExJQ0FCTEUgTEFXLiAgRVhDRVBUIFdIRU4gT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQKSE9MREVSUyBBTkQvT1IgT1RIRVIgUEFSVElFUyBQUk9WSURFIFRIRSBQUk9HUkFNICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWQpPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgpQVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgUFJPR1JBTQpJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUgUFJPR1JBTSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUgVEhFIENPU1QgT0YKQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLgoKICAxNi4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuCgogIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4gV1JJVElORwpXSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1PRElGSUVTIEFORC9PUiBDT05WRVlTClRIRSBQUk9HUkFNIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVSBGT1IgREFNQUdFUywgSU5DTFVESU5HIEFOWQpHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HIE9VVCBPRiBUSEUKVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFBST0dSQU0gKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gTE9TUyBPRgpEQVRBIE9SIERBVEEgQkVJTkcgUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZIFlPVSBPUiBUSElSRApQQVJUSUVTIE9SIEEgRkFJTFVSRSBPRiBUSEUgUFJPR1JBTSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSIFBST0dSQU1TKSwKRVZFTiBJRiBTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgpTVUNIIERBTUFHRVMuCgogIDE3LiBJbnRlcnByZXRhdGlvbiBvZiBTZWN0aW9ucyAxNSBhbmQgMTYuCgogIElmIHRoZSBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5IGFuZCBsaW1pdGF0aW9uIG9mIGxpYWJpbGl0eSBwcm92aWRlZAphYm92ZSBjYW5ub3QgYmUgZ2l2ZW4gbG9jYWwgbGVnYWwgZWZmZWN0IGFjY29yZGluZyB0byB0aGVpciB0ZXJtcywKcmV2aWV3aW5nIGNvdXJ0cyBzaGFsbCBhcHBseSBsb2NhbCBsYXcgdGhhdCBtb3N0IGNsb3NlbHkgYXBwcm94aW1hdGVzCmFuIGFic29sdXRlIHdhaXZlciBvZiBhbGwgY2l2aWwgbGlhYmlsaXR5IGluIGNvbm5lY3Rpb24gd2l0aCB0aGUKUHJvZ3JhbSwgdW5sZXNzIGEgd2FycmFudHkgb3IgYXNzdW1wdGlvbiBvZiBsaWFiaWxpdHkgYWNjb21wYW5pZXMgYQpjb3B5IG9mIHRoZSBQcm9ncmFtIGluIHJldHVybiBmb3IgYSBmZWUuCgogICAgICAgICAgICAgICAgICAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKCiAgICAgICAgICAgIEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBQcm9ncmFtcwoKICBJZiB5b3UgZGV2ZWxvcCBhIG5ldyBwcm9ncmFtLCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0CnBvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB0aGUgYmVzdCB3YXkgdG8gYWNoaWV2ZSB0aGlzIGlzIHRvIG1ha2UgaXQKZnJlZSBzb2Z0d2FyZSB3aGljaCBldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UgdW5kZXIgdGhlc2UgdGVybXMuCgogIFRvIGRvIHNvLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBwcm9ncmFtLiAgSXQgaXMgc2FmZXN0CnRvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKc3RhdGUgdGhlIGV4Y2x1c2lvbiBvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQgaGF2ZSBhdCBsZWFzdAp0aGUgImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KCiAgICA8b25lIGxpbmUgdG8gZ2l2ZSB0aGUgcHJvZ3JhbSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0IGRvZXMuPgogICAgQ29weXJpZ2h0IChDKSA8eWVhcj4gIDxuYW1lIG9mIGF1dGhvcj4KCiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCiAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCgogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgoKQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCgogIElmIHRoZSBwcm9ncmFtIGRvZXMgdGVybWluYWwgaW50ZXJhY3Rpb24sIG1ha2UgaXQgb3V0cHV0IGEgc2hvcnQKbm90aWNlIGxpa2UgdGhpcyB3aGVuIGl0IHN0YXJ0cyBpbiBhbiBpbnRlcmFjdGl2ZSBtb2RlOgoKICAgIDxwcm9ncmFtPiAgQ29weXJpZ2h0IChDKSA8eWVhcj4gIDxuYW1lIG9mIGF1dGhvcj4KICAgIFRoaXMgcHJvZ3JhbSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFk7IGZvciBkZXRhaWxzIHR5cGUgYHNob3cgdycuCiAgICBUaGlzIGlzIGZyZWUgc29mdHdhcmUsIGFuZCB5b3UgYXJlIHdlbGNvbWUgdG8gcmVkaXN0cmlidXRlIGl0CiAgICB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnM7IHR5cGUgYHNob3cgYycgZm9yIGRldGFpbHMuCgpUaGUgaHlwb3RoZXRpY2FsIGNvbW1hbmRzIGBzaG93IHcnIGFuZCBgc2hvdyBjJyBzaG91bGQgc2hvdyB0aGUgYXBwcm9wcmlhdGUKcGFydHMgb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBPZiBjb3Vyc2UsIHlvdXIgcHJvZ3JhbSdzIGNvbW1hbmRzCm1pZ2h0IGJlIGRpZmZlcmVudDsgZm9yIGEgR1VJIGludGVyZmFjZSwgeW91IHdvdWxkIHVzZSBhbiAiYWJvdXQgYm94Ii4KCiAgWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHNjaG9vbCwKaWYgYW55LCB0byBzaWduIGEgImNvcHlyaWdodCBkaXNjbGFpbWVyIiBmb3IgdGhlIHByb2dyYW0sIGlmIG5lY2Vzc2FyeS4KRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhpcywgYW5kIGhvdyB0byBhcHBseSBhbmQgZm9sbG93IHRoZSBHTlUgR1BMLCBzZWUKPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgoKICBUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZG9lcyBub3QgcGVybWl0IGluY29ycG9yYXRpbmcgeW91ciBwcm9ncmFtCmludG8gcHJvcHJpZXRhcnkgcHJvZ3JhbXMuICBJZiB5b3VyIHByb2dyYW0gaXMgYSBzdWJyb3V0aW5lIGxpYnJhcnksIHlvdQptYXkgY29uc2lkZXIgaXQgbW9yZSB1c2VmdWwgdG8gcGVybWl0IGxpbmtpbmcgcHJvcHJpZXRhcnkgYXBwbGljYXRpb25zIHdpdGgKdGhlIGxpYnJhcnkuICBJZiB0aGlzIGlzIHdoYXQgeW91IHdhbnQgdG8gZG8sIHVzZSB0aGUgR05VIExlc3NlciBHZW5lcmFsClB1YmxpYyBMaWNlbnNlIGluc3RlYWQgb2YgdGhpcyBMaWNlbnNlLiAgQnV0IGZpcnN0LCBwbGVhc2UgcmVhZAo8aHR0cDovL3d3dy5nbnUub3JnL3BoaWxvc29waHkvd2h5LW5vdC1sZ3BsLmh0bWw+Lgo=]]></data>
	</file>
	<file>
	  <filename>/FEU_Auth_LDAP.module.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKI0JFR0lOX0xJQ0VOU0UKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IEZFVV9BdXRoX0xEQVAgKGMpIDIwMDggYnkgUm9iZXJ0IENhbXBiZWxsIAojICAgICAgICAgKGNhbGd1eTEwMDBAY21zbWFkZXNpbXBsZS5vcmcpCiMgIEFuIGFkZG9uIG1vZHVsZSBmb3IgQ01TIE1hZGUgU2ltcGxlIHRvIGFsbG93IGEgc2Vjb25kYXJ5IHR5cGUgb2YgCiMgIGF1dGhlbnRpY2F0aW9uIHRvIHRoZSBGRVUgbW9kdWxlLiAgVGhpcyBhZGRvbiBhbGxvd3MgdXNpbmcgdGhlIGFwYWNoZQojICBCQVNJQyBhdXRoZW50aWNhdGlvbi4KIyAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMDUgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQojIFRoaXMgcHJvamVjdCdzIGhvbWVwYWdlIGlzOiBodHRwOi8vd3d3LmNtc21hZGVzaW1wbGUub3JnCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIwojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgojIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBIb3dldmVyLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHUEwsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQKIyBhcyBhbiBhZGRvbiBtb2R1bGUgdG8gQ01TIE1hZGUgU2ltcGxlLiAgWW91IG1heSBub3QgdXNlIHRoaXMgc29mdHdhcmUKIyBpbiBhbnkgTm9uIEdQTCB2ZXJzaW9uIG9mIENNUyBNYWRlIHNpbXBsZSwgb3IgaW4gYW55IHZlcnNpb24gb2YgQ01TCiMgTWFkZSBzaW1wbGUgdGhhdCBkb2VzIG5vdCBpbmRpY2F0ZSBjbGVhcmx5IGFuZCBvYnZpb3VzbHkgaW4gaXRzIGFkbWluIAojIHNlY3Rpb24gdGhhdCB0aGUgc2l0ZSB3YXMgYnVpbHQgd2l0aCBDTVMgTWFkZSBzaW1wbGUuCiMKIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQojIE9yIHJlYWQgaXQgb25saW5lOiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwKIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojRU5EX0xJQ0VOU0UKCi8vICRjZ2V4dGVuc2lvbnMgPSBjbXNfam9pbl9wYXRoKCRnQ21zLT5jb25maWdbJ3Jvb3RfcGF0aCddLCdtb2R1bGVzJywKLy8gCQkJICAgICAgJ0NHRXh0ZW5zaW9ucycsJ0NHRXh0ZW5zaW9ucy5tb2R1bGUucGhwJyk7Ci8vIGlmKCAhaXNfcmVhZGFibGUoICRjZ2V4dGVuc2lvbnMgKSApCi8vIHsKLy8gICBlY2hvICc8aDE+PGZvbnQgY29sb3I9InJlZCI+RVJST1I6IFRoZSBDR0V4dGVuc2lvbnMgbW9kdWxlIGNvdWxkIG5vdCBiZSBmb3VuZC48L2ZvbnQ+PC9oMT4nOwovLyAgIHJldHVybjsKLy8gfQovLyByZXF1aXJlX29uY2UoJGNnZXh0ZW5zaW9ucyk7CgpjbGFzcyBGRVVfQXV0aF9MREFQIGV4dGVuZHMgQ0dFeHRlbnNpb25zCnsKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBHZXROYW1lKCkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBHZXROYW1lKCkKICB7CiAgICByZXR1cm4gJ0ZFVV9BdXRoX0xEQVAnOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgR2V0RnJpZW5kbHlOYW1lKCkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBHZXRGcmllbmRseU5hbWUoKQogIHsKICAgIHJldHVybiAkdGhpcy0+TGFuZygnZnJpZW5kbHluYW1lJyk7CiAgfQoKCQogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIEdldFZlcnNpb24oKQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIEdldFZlcnNpb24oKQogIHsKICAgIHJldHVybiAnMS4wJzsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBHZXRIZWxwKCkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBHZXRIZWxwKCkKICB7CiAgICByZXR1cm4gJHRoaXMtPkxhbmcoJ2hlbHAnKTsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBHZXRBdXRob3IoKQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIEdldEF1dGhvcigpCiAgewogICAgcmV0dXJuICdjYWxndXkxMDAwJzsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBHZXRBdXRob3JFbWFpbCgpCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gR2V0QXV0aG9yRW1haWwoKQogIHsKICAgIHJldHVybiAnY2FsZ3V5MTAwMEBjbXNtYWRlc2ltcGxlLm9yZyc7CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgR2V0Q2hhbmdlTG9nKCkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBHZXRDaGFuZ2VMb2coKQogIHsKICAgIGluY2x1ZGUgZGlybmFtZShfX0ZJTEVfXykuJy9jaGFuZ2Vsb2cuaW5jJzsKICB9CiAgCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgSXNQbHVnaW5Nb2R1bGUoKQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIElzUGx1Z2luTW9kdWxlKCkKICB7CiAgICByZXR1cm4gdHJ1ZTsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBIYXNBZG1pbigpCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gSGFzQWRtaW4oKQogIHsKICAgIHJldHVybiB0cnVlOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIEdldEFkbWluU2VjdGlvbigpCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gR2V0QWRtaW5TZWN0aW9uKCkKICB7CiAgICByZXR1cm4gJ2V4dGVuc2lvbnMnOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIEdldEFkbWluRGVzY3JpcHRpb24oKQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIEdldEFkbWluRGVzY3JpcHRpb24oKQogIHsKICAgIHJldHVybiAkdGhpcy0+TGFuZygnbW9kZGVzY3JpcHRpb24nKTsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBWaXNpYmxlVG9BZG1pblVzZXIoKQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIFZpc2libGVUb0FkbWluVXNlcigpCiAgewogICAgcmV0dXJuICR0aGlzLT5DaGVja1Blcm1pc3Npb24oJ01vZGlmeSBTaXRlIFByZWZlcmVuY2VzJykgfHwKICAgICAgJHRoaXMtPkNoZWNrUGVybWlzc2lvbignTW9kaWZ5IFRlbXBsYXRlcycpOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIEdldERlcGVuZGVuY2llcygpCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gR2V0RGVwZW5kZW5jaWVzKCkKICB7CiAgICByZXR1cm4gYXJyYXkoJ0NHRXh0ZW5zaW9ucyc9PicxLjE5JywKCQkgJ0Zyb250RW5kVXNlcnMnPT4nMS4xMCcpOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIE1pbmltdW1DTVNWZXJzaW9uKCkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBNaW5pbXVtQ01TVmVyc2lvbigpCiAgewogICAgcmV0dXJuICIxLjYuNyI7CiAgfQoJCgkKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBTZXRQYXJhbWV0ZXJzKCkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBTZXRQYXJhbWV0ZXJzKCkKICB7CiAgICAkdGhpcy0+UmVzdHJpY3RVbmtub3duUGFyYW1zKCk7CiAgICAkdGhpcy0+U2V0UGFyYW1ldGVyVHlwZShDTEVBTl9SRUdFWFAuJy9mZXVsZGFwXy4qLycsQ0xFQU5fU1RSSU5HKTsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBJbnN0YWxsUG9zdE1lc3NhZ2UoKQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIEluc3RhbGxQb3N0TWVzc2FnZSgpCiAgewogICAgcmV0dXJuICR0aGlzLT5MYW5nKCdwb3N0aW5zdGFsbCcpOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIFVuaW5zdGFsbFBvc3RNZXNzYWdlKCkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBVbmluc3RhbGxQb3N0TWVzc2FnZSgpCiAgewogICAgcmV0dXJuICR0aGlzLT5MYW5nKCdwb3N0dW5pbnN0YWxsJyk7CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgVW5pbnN0YWxsUHJlTWVzc2FnZSgpCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gVW5pbnN0YWxsUHJlTWVzc2FnZSgpCiAgewogICAgcmV0dXJuICR0aGlzLT5MYW5nKCdyZWFsbHlfdW5pbnN0YWxsJyk7CiAgfQkKCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIEdldENvbnN1bWVyCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcHVibGljIGZ1bmN0aW9uIEdldEZldUF1dGhDb25zdW1lcigpCiAgewogICAgJGNvbnN1bWVyID0gbmV3IGZldV9sZGFwX2NvbnN1bWVyOwogICAgcmV0dXJuICRjb25zdW1lcjsKICB9CQoKCiAgcHVibGljIGZ1bmN0aW9uIGdldF9sZGFwX2Nvbm5lY3RvcigkdXNlX2F1dGhvcml0aXZlID0gZmFsc2UsJiRtc2cgPSBudWxsKQogIHsKICAgICRvcHRpb25zID0gYXJyYXkoKTsKICAgICR0bXAgPSAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnbGRhcF9ob3N0cycpOwogICAgaWYoICR0bXAgKQogICAgICB7CgkkdG1wID0gZXhwbG9kZSgnLCcsJHRtcCk7Cgkkb3B0aW9uc1snZG9tYWluX2NvbnRyb2xsZXJzJ10gPSAkdG1wOwogICAgICB9CiAgICAkdG1wID0gJHRoaXMtPkdldFByZWZlcmVuY2UoJ2xkYXBfYmFzZWRuJyk7CiAgICBpZiggJHRtcCApCiAgICAgIHsKCSRvcHRpb25zWydiYXNlX2RuJ10gPSAkdG1wOwogICAgICB9CgogICAgJG9wdGlvbnNbJ2Fzc3VtZV9hZCddID0gJHRoaXMtPkdldFByZWZlcmVuY2UoJ2xkYXBfdXNlX2FkJyk7CiAgICAkdG1wID0gJHRoaXMtPkdldFByZWZlcmVuY2UoJ2xkYXBfYXV0aF91bicpOwogICAgaWYoICR0bXAgKQogICAgICB7CgkkdG1wMiA9ICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdsZGFwX2F1dGhfcHcnKTsKCWlmKCAkdG1wMiApCgkgIHsKCSAgICAkb3B0aW9uc1snYWRfdXNlcm5hbWUnXSA9ICR0bXA7CgkgICAgJG9wdGlvbnNbJ2FkX3Bhc3N3b3JkJ10gPSAkdG1wMjsKCSAgfQogICAgICB9CgogICAgJHRtcCA9ICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdsZGFwX2FjY291bnRfc3VmZml4Jyk7CiAgICAkb3B0aW9uc1snYWNjb3VudF9zdWZmaXgnXSA9ICR0bXA7CiAgICAKICAgICRvcHRpb25zWyd1c2VyX3ByZWZpeCddID0gJHRoaXMtPkdldFByZWZlcmVuY2UoJ2xkYXBfdW5fcHJlZml4JywnY24nKTsKICAgICRvcHRpb25zWyd1c2VfY24nXSA9ICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdsZGFwX3VzZV9jbicpOwogICAgJG9wdGlvbnNbJ3JlY3Vyc2l2ZV9ncm91cHMnXSA9ICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdsZGFwX3JlY3Vyc2l2ZV9ncm91cHMnKTsKCiAgICAkdG1wID0gJHRoaXMtPkdldFByZWZlcmVuY2UoJ2xkYXBfYXV0aF9iaW5kJyk7CiAgICBpZiggJHRtcCApCiAgICAgIHsKCSRvcHRpb25zWydhdXRoX3ZpYV9iaW5kJ10gPSAxOwogICAgICB9CgogICAgdHJ5CiAgICAgIHsKCSRsZGFwID0gbmV3IGZldV9sZGFwX2Nvbm5lY3Rvcigkb3B0aW9ucyk7CglyZXR1cm4gJGxkYXA7CiAgICAgIH0KICAgIGNhdGNoKGV4Y2VwdGlvbiAkZSkKICAgICAgewoJaWYoICFpc19udWxsKCRtc2cpICkKCSAgewoJICAgICRtc2cgPSAkZS0+Z2V0TWVzc2FnZSgpOwoJICB9CglyZXR1cm4gRkFMU0U7CiAgICAgIH0KICB9Cgp9IC8vIGNsYXNzCgo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/function.admin_adv_settings_tab.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKI0JFR0lOX0xJQ0VOU0UKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IEZFVV9BdXRoX0xEQVAgKGMpIDIwMTAgYnkgUm9iZXJ0IENhbXBiZWxsIAojICAgICAgICAgKGNhbGd1eTEwMDBAY21zbWFkZXNpbXBsZS5vcmcpCiMgIEFuIGFkZG9uIG1vZHVsZSBmb3IgQ01TIE1hZGUgU2ltcGxlIHRvIGFsbG93IGEgc2Vjb25kYXJ5IHR5cGUgb2YgCiMgIGF1dGhlbnRpY2F0aW9uIHRvIHRoZSBGRVUgbW9kdWxlLiAgVGhpcyBhZGRvbiBhbGxvd3MgdXNpbmcgdGhlIGFwYWNoZQojICBCQVNJQyBhdXRoZW50aWNhdGlvbi4KIyAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMDUgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQojIFRoaXMgcHJvamVjdCdzIGhvbWVwYWdlIGlzOiBodHRwOi8vd3d3LmNtc21hZGVzaW1wbGUub3JnCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIwojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgojIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBIb3dldmVyLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHUEwsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQKIyBhcyBhbiBhZGRvbiBtb2R1bGUgdG8gQ01TIE1hZGUgU2ltcGxlLiAgWW91IG1heSBub3QgdXNlIHRoaXMgc29mdHdhcmUKIyBpbiBhbnkgTm9uIEdQTCB2ZXJzaW9uIG9mIENNUyBNYWRlIHNpbXBsZSwgb3IgaW4gYW55IHZlcnNpb24gb2YgQ01TCiMgTWFkZSBzaW1wbGUgdGhhdCBkb2VzIG5vdCBpbmRpY2F0ZSBjbGVhcmx5IGFuZCBvYnZpb3VzbHkgaW4gaXRzIGFkbWluIAojIHNlY3Rpb24gdGhhdCB0aGUgc2l0ZSB3YXMgYnVpbHQgd2l0aCBDTVMgTWFkZSBzaW1wbGUuCiMKIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQojIE9yIHJlYWQgaXQgb25saW5lOiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwKIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojRU5EX0xJQ0VOU0UKaWYoICFpc3NldCgkZ0NtcykgKSBleGl0OwoKJHNtYXJ0eS0+YXNzaWduKCdmb3Jtc3RhcnQnLCR0aGlzLT5DR0NyZWF0ZUZvcm1TdGFydCgkaWQsJ2FkbWluX3NldF9hZHZfc2V0dGluZ3MnKSk7CiRzbWFydHktPmFzc2lnbignZm9ybWVuZCcsJHRoaXMtPkNyZWF0ZUZvcm1FbmQoKSk7Cgokb3B0cyA9IGFycmF5KCk7CiRvcHRzWyd1c2VyYXR0cmliJ10gPSAkdGhpcy0+TGFuZygnZ3JvdXBfdXNlcmF0dHJpYicpOwokb3B0c1snZ3JvdXBhdHRyaWInXSA9ICR0aGlzLT5MYW5nKCdncm91cF9ncm91cGF0dHJpYicpOwokb3B0c1snZ3JvdXBoaWVyJ10gPSAkdGhpcy0+TGFuZygnZ3JvdXBfZ3JvdXBoaWVyJyk7CiRzbWFydHktPmFzc2lnbignZ3JvdXBhcnJfb3B0cycsJG9wdHMpOwoKJHNtYXJ0eS0+YXNzaWduKCdsZGFwX2dyb3VwYXJyYW5nZW1lbnQnLCR0aGlzLT5HZXRQcmVmZXJlbmNlKCdsZGFwX2dyb3VwYWRqdXN0bWVudCcpKTsKJHNtYXJ0eS0+YXNzaWduKCdsZGFwX2FjY291bnRfc3VmZml4JywkdGhpcy0+R2V0UHJlZmVyZW5jZSgnbGRhcF9hY2NvdW50X3N1ZmZpeCcpKTsKJHNtYXJ0eS0+YXNzaWduKCdsZGFwX3VzZV9jbicsJHRoaXMtPkdldFByZWZlcmVuY2UoJ2xkYXBfdXNlX2NuJykpOwokc21hcnR5LT5hc3NpZ24oJ2xkYXBfZ3JvdXBhcnJhbmdlbWVudCcsJHRoaXMtPkdldFByZWZlcmVuY2UoJ2xkYXBfZ3JvdXBhcnJhbmdlbWVudCcpKTsKJHNtYXJ0eS0+YXNzaWduKCdsZGFwX2F0dHJpYm5hbWUnLCR0aGlzLT5HZXRQcmVmZXJlbmNlKCdsZGFwX2F0dHJpYm5hbWUnKSk7CiRzbWFydHktPmFzc2lnbignbGRhcF91bl9wcmVmaXgnLCR0aGlzLT5HZXRQcmVmZXJlbmNlKCdsZGFwX3VuX3ByZWZpeCcpKTsKJHNtYXJ0eS0+YXNzaWduKCdsZGFwX2F1dGhfYmluZCcsJHRoaXMtPkdldFByZWZlcmVuY2UoJ2xkYXBfYXV0aF9iaW5kJykpOwoKZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCdhZG1pbl9hZHZfc2V0dGluZ3NfdGFiLnRwbCcpOwoKIwojIEVPRgojCj8+]]></data>
	</file>
	<file>
	  <filename>/function.admin_ad_settings_tab.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKI0JFR0lOX0xJQ0VOU0UKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IEZFVV9BdXRoX0xEQVAgKGMpIDIwMTAgYnkgUm9iZXJ0IENhbXBiZWxsIAojICAgICAgICAgKGNhbGd1eTEwMDBAY21zbWFkZXNpbXBsZS5vcmcpCiMgIEFuIGFkZG9uIG1vZHVsZSBmb3IgQ01TIE1hZGUgU2ltcGxlIHRvIGFsbG93IGEgc2Vjb25kYXJ5IHR5cGUgb2YgCiMgIGF1dGhlbnRpY2F0aW9uIHRvIHRoZSBGRVUgbW9kdWxlLiAgVGhpcyBhZGRvbiBhbGxvd3MgdXNpbmcgdGhlIGFwYWNoZQojICBCQVNJQyBhdXRoZW50aWNhdGlvbi4KIyAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMDUgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQojIFRoaXMgcHJvamVjdCdzIGhvbWVwYWdlIGlzOiBodHRwOi8vd3d3LmNtc21hZGVzaW1wbGUub3JnCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIwojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgojIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBIb3dldmVyLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHUEwsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQKIyBhcyBhbiBhZGRvbiBtb2R1bGUgdG8gQ01TIE1hZGUgU2ltcGxlLiAgWW91IG1heSBub3QgdXNlIHRoaXMgc29mdHdhcmUKIyBpbiBhbnkgTm9uIEdQTCB2ZXJzaW9uIG9mIENNUyBNYWRlIHNpbXBsZSwgb3IgaW4gYW55IHZlcnNpb24gb2YgQ01TCiMgTWFkZSBzaW1wbGUgdGhhdCBkb2VzIG5vdCBpbmRpY2F0ZSBjbGVhcmx5IGFuZCBvYnZpb3VzbHkgaW4gaXRzIGFkbWluIAojIHNlY3Rpb24gdGhhdCB0aGUgc2l0ZSB3YXMgYnVpbHQgd2l0aCBDTVMgTWFkZSBzaW1wbGUuCiMKIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQojIE9yIHJlYWQgaXQgb25saW5lOiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwKIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojRU5EX0xJQ0VOU0UKaWYoICFpc3NldCgkZ0NtcykgKSBleGl0OwoKJHNtYXJ0eS0+YXNzaWduKCdmb3Jtc3RhcnQnLCR0aGlzLT5DR0NyZWF0ZUZvcm1TdGFydCgkaWQsJ2FkbWluX3NldF9hZF9zZXR0aW5ncycpKTsKJHNtYXJ0eS0+YXNzaWduKCdmb3JtZW5kJywkdGhpcy0+Q3JlYXRlRm9ybUVuZCgpKTsKCiRzbWFydHktPmFzc2lnbignbGRhcF91c2VfbnRsbScsJHRoaXMtPkdldFByZWZlcmVuY2UoJ2xkYXBfdXNlX250bG0nKSk7CiRzbWFydHktPmFzc2lnbignbGRhcF9udGxtX2tleScsJHRoaXMtPkdldFByZWZlcmVuY2UoJ2xkYXBfbnRsbV9rZXknKSk7CgplY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUoJ2FkbWluX2FkX3NldHRpbmdzX3RhYi50cGwnKTsKCiMKIyBFT0YKIwo/Pg==]]></data>
	</file>
	<file>
	  <filename>/function.admin_login_template_tab.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKI0JFR0lOX0xJQ0VOU0UKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IEZFVV9BdXRoX0xEQVAgKGMpIDIwMTAgYnkgUm9iZXJ0IENhbXBiZWxsIAojICAgICAgICAgKGNhbGd1eTEwMDBAY21zbWFkZXNpbXBsZS5vcmcpCiMgIEFuIGFkZG9uIG1vZHVsZSBmb3IgQ01TIE1hZGUgU2ltcGxlIHRvIGFsbG93IGEgc2Vjb25kYXJ5IHR5cGUgb2YgCiMgIGF1dGhlbnRpY2F0aW9uIHRvIHRoZSBGRVUgbW9kdWxlLiAgVGhpcyBhZGRvbiBhbGxvd3MgdXNpbmcgdGhlIGFwYWNoZQojICBCQVNJQyBhdXRoZW50aWNhdGlvbi4KIyAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMDUgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQojIFRoaXMgcHJvamVjdCdzIGhvbWVwYWdlIGlzOiBodHRwOi8vd3d3LmNtc21hZGVzaW1wbGUub3JnCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIwojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgojIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBIb3dldmVyLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHUEwsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQKIyBhcyBhbiBhZGRvbiBtb2R1bGUgdG8gQ01TIE1hZGUgU2ltcGxlLiAgWW91IG1heSBub3QgdXNlIHRoaXMgc29mdHdhcmUKIyBpbiBhbnkgTm9uIEdQTCB2ZXJzaW9uIG9mIENNUyBNYWRlIHNpbXBsZSwgb3IgaW4gYW55IHZlcnNpb24gb2YgQ01TCiMgTWFkZSBzaW1wbGUgdGhhdCBkb2VzIG5vdCBpbmRpY2F0ZSBjbGVhcmx5IGFuZCBvYnZpb3VzbHkgaW4gaXRzIGFkbWluIAojIHNlY3Rpb24gdGhhdCB0aGUgc2l0ZSB3YXMgYnVpbHQgd2l0aCBDTVMgTWFkZSBzaW1wbGUuCiMKIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQojIE9yIHJlYWQgaXQgb25saW5lOiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwKIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojRU5EX0xJQ0VOU0UKaWYoICFpc3NldCgkZ0NtcykgKSBleGl0OwoKZWNobyAkdGhpcy0+R2V0U2luZ2xlVGVtcGxhdGVGb3JtKCR0aGlzLCRpZCwkcmV0dXJuaWQsJ2xvZ2luX3RlbXBsYXRlJywKCQkJCSAgJ2xvZ2luX3RlbXBsYXRlJywKCQkJCSAgJHRoaXMtPkxhbmcoJ3RpdGxlX2xvZ2luX3RlbXBsYXRlJyksCgkJCQkgICdvcmlnX2xvZ2luX3RlbXBsYXRlLnRwbCcsCgkJCQkgICR0aGlzLT5MYW5nKCdpbmZvX2xvZ2luX3RlbXBsYXRlJykpOwoKIwojIEVPRgojCj8+]]></data>
	</file>
	<file>
	  <filename>/function.admin_logout_template_tab.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKI0JFR0lOX0xJQ0VOU0UKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IEZFVV9BdXRoX0xEQVAgKGMpIDIwMTAgYnkgUm9iZXJ0IENhbXBiZWxsIAojICAgICAgICAgKGNhbGd1eTEwMDBAY21zbWFkZXNpbXBsZS5vcmcpCiMgIEFuIGFkZG9uIG1vZHVsZSBmb3IgQ01TIE1hZGUgU2ltcGxlIHRvIGFsbG93IGEgc2Vjb25kYXJ5IHR5cGUgb2YgCiMgIGF1dGhlbnRpY2F0aW9uIHRvIHRoZSBGRVUgbW9kdWxlLiAgVGhpcyBhZGRvbiBhbGxvd3MgdXNpbmcgdGhlIGFwYWNoZQojICBCQVNJQyBhdXRoZW50aWNhdGlvbi4KIyAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMDUgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQojIFRoaXMgcHJvamVjdCdzIGhvbWVwYWdlIGlzOiBodHRwOi8vd3d3LmNtc21hZGVzaW1wbGUub3JnCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIwojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgojIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBIb3dldmVyLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHUEwsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQKIyBhcyBhbiBhZGRvbiBtb2R1bGUgdG8gQ01TIE1hZGUgU2ltcGxlLiAgWW91IG1heSBub3QgdXNlIHRoaXMgc29mdHdhcmUKIyBpbiBhbnkgTm9uIEdQTCB2ZXJzaW9uIG9mIENNUyBNYWRlIHNpbXBsZSwgb3IgaW4gYW55IHZlcnNpb24gb2YgQ01TCiMgTWFkZSBzaW1wbGUgdGhhdCBkb2VzIG5vdCBpbmRpY2F0ZSBjbGVhcmx5IGFuZCBvYnZpb3VzbHkgaW4gaXRzIGFkbWluIAojIHNlY3Rpb24gdGhhdCB0aGUgc2l0ZSB3YXMgYnVpbHQgd2l0aCBDTVMgTWFkZSBzaW1wbGUuCiMKIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQojIE9yIHJlYWQgaXQgb25saW5lOiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwKIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojRU5EX0xJQ0VOU0UKaWYoICFpc3NldCgkZ0NtcykgKSBleGl0OwoKZWNobyAkdGhpcy0+R2V0U2luZ2xlVGVtcGxhdGVGb3JtKCR0aGlzLCRpZCwkcmV0dXJuaWQsJ2xvZ291dF90ZW1wbGF0ZScsCgkJCQkgICdsb2dvdXRfdGVtcGxhdGUnLAoJCQkJICAkdGhpcy0+TGFuZygndGl0bGVfbG9nb3V0X3RlbXBsYXRlJyksCgkJCQkgICdvcmlnX2xvZ291dF90ZW1wbGF0ZS50cGwnLAoJCQkJICAkdGhpcy0+TGFuZygnaW5mb19sb2dvdXRfdGVtcGxhdGUnKSk7CgojCiMgRU9GCiMKPz4=]]></data>
	</file>
	<file>
	  <filename>/function.admin_settings_tab.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKI0JFR0lOX0xJQ0VOU0UKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IEZFVV9BdXRoX0xEQVAgKGMpIDIwMTAgYnkgUm9iZXJ0IENhbXBiZWxsIAojICAgICAgICAgKGNhbGd1eTEwMDBAY21zbWFkZXNpbXBsZS5vcmcpCiMgIEFuIGFkZG9uIG1vZHVsZSBmb3IgQ01TIE1hZGUgU2ltcGxlIHRvIGFsbG93IGEgc2Vjb25kYXJ5IHR5cGUgb2YgCiMgIGF1dGhlbnRpY2F0aW9uIHRvIHRoZSBGRVUgbW9kdWxlLiAgVGhpcyBhZGRvbiBhbGxvd3MgdXNpbmcgdGhlIGFwYWNoZQojICBCQVNJQyBhdXRoZW50aWNhdGlvbi4KIyAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMDUgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQojIFRoaXMgcHJvamVjdCdzIGhvbWVwYWdlIGlzOiBodHRwOi8vd3d3LmNtc21hZGVzaW1wbGUub3JnCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIwojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgojIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBIb3dldmVyLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHUEwsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQKIyBhcyBhbiBhZGRvbiBtb2R1bGUgdG8gQ01TIE1hZGUgU2ltcGxlLiAgWW91IG1heSBub3QgdXNlIHRoaXMgc29mdHdhcmUKIyBpbiBhbnkgTm9uIEdQTCB2ZXJzaW9uIG9mIENNUyBNYWRlIHNpbXBsZSwgb3IgaW4gYW55IHZlcnNpb24gb2YgQ01TCiMgTWFkZSBzaW1wbGUgdGhhdCBkb2VzIG5vdCBpbmRpY2F0ZSBjbGVhcmx5IGFuZCBvYnZpb3VzbHkgaW4gaXRzIGFkbWluIAojIHNlY3Rpb24gdGhhdCB0aGUgc2l0ZSB3YXMgYnVpbHQgd2l0aCBDTVMgTWFkZSBzaW1wbGUuCiMKIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQojIE9yIHJlYWQgaXQgb25saW5lOiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwKIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojRU5EX0xJQ0VOU0UKaWYoICFpc3NldCgkZ0NtcykgKSBleGl0OwoKJHNtYXJ0eS0+YXNzaWduKCdmb3Jtc3RhcnQnLCR0aGlzLT5DR0NyZWF0ZUZvcm1TdGFydCgkaWQsJ2FkbWluX3NldF9zZXR0aW5ncycpKTsKJHNtYXJ0eS0+YXNzaWduKCdmb3JtZW5kJywkdGhpcy0+Q3JlYXRlRm9ybUVuZCgpKTsKCiRzbWFydHktPmFzc2lnbignbGRhcF9ob3N0cycsJHRoaXMtPkdldFByZWZlcmVuY2UoJ2xkYXBfaG9zdHMnKSk7CiRzbWFydHktPmFzc2lnbignbGRhcF9iYXNlZG4nLCR0aGlzLT5HZXRQcmVmZXJlbmNlKCdsZGFwX2Jhc2VkbicpKTsKJHNtYXJ0eS0+YXNzaWduKCdsZGFwX2F1dGhfdW4nLCR0aGlzLT5HZXRQcmVmZXJlbmNlKCdsZGFwX2F1dGhfdW4nKSk7CiRzbWFydHktPmFzc2lnbignbGRhcF9hdXRoX3B3JywkdGhpcy0+R2V0UHJlZmVyZW5jZSgnbGRhcF9hdXRoX3B3JykpOwokc21hcnR5LT5hc3NpZ24oJ2xkYXBfdXNlX2FkJywkdGhpcy0+R2V0UHJlZmVyZW5jZSgnbGRhcF91c2VfYWQnKSk7CiRzbWFydHktPmFzc2lnbignbGRhcF9yZXF1aXJlX2dyb3VwJywkdGhpcy0+R2V0UHJlZmVyZW5jZSgnbGRhcF9yZXF1aXJlX2dyb3VwJykpOwoKZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCdhZG1pbl9zZXR0aW5nc190YWIudHBsJyk7CgojCiMgRU9GCiMKPz4=]]></data>
	</file>
	<file>
	  <filename>/lang/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lang/en_US.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKI0EKJGxhbmdbJ2FkX3NldHRpbmdzJ10gPSAnQWN0aXZlIERpcmVjdG9yeSBTZXR0aW5ncyc7CiRsYW5nWydhZHZhbmNlZF9zZXR0aW5ncyddID0gJ0FkdmFuY2VkIFNldHRpbmdzJzsKCiNCCgojQwokbGFuZ1snY29uZmlybV9zdWJtaXR0ZWQnXSA9ICdIYXZlIHlvdSBhbHJlYWR5IHN1Ym1pdHRlZCB5b3VyIHNldHRpbmdzPyc7CgojRAoKI0UKJGxhbmdbJ2Vycm9yX2NvbnN0cnVjdF9vYmplY3QnXSA9ICdFcnJvciBjb25zdHJ1Y3RpbmcgTERBUCBvYmplY3QgKG1vZHVsZSBpbnN0YWxsYXRpb24gcHJvYmxlbT8pJzsKJGxhbmdbJ2Vycm9yX2xkYXBfYXV0aGVudGljYXRlJ10gPSAnUHJvYmxlbSBBdXRoZW50aWNhdGluZyB0byBMREFQIHNlcnZlcic7CiRsYW5nWydlcnJvcl9sZGFwX2Nvbm5lY3QnXSA9ICdQcm9ibGVtYyBvbm5lY3RpbmcgdG8gTERBUCBzZXJ2ZXInOwokbGFuZ1snZXJyb3JfbnRsbV9ub3RfYXV0aGVudGljYXRlZCddID0gJ1lvdSBhcmUgbm90IGF1dGhlbnRpY2F0ZWQgdG8gYW4gTlRMTSBzZXJ2ZXInOwoKI0YKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0ZFVSBMREFQL0FjdGl2ZURpcmVjdG9yeSBBdXRoZW50aWNhdGlvbic7CgojRwokbGFuZ1snZ2VuZXJhbF9zZXR0aW5ncyddID0gJ0dlbmVyYWwgU2V0dGluZ3MnOwokbGFuZ1snZ3JvdXBfdXNlcmF0dHJpYiddID0gJ0dyb3VwIG1lbWJlcnNoaXAgaXMgc3BlY2lmaWVkIGJ5IGEgdXNlciBvYmplY3QgYXR0cmlidXRlJzsKJGxhbmdbJ2dyb3VwX2dyb3VwYXR0cmliJ10gPSAnR3JvdXAgbWVtYmVyc2hpcCBpcyBzcGVpZmllZCBieSBhIGdyb3VwIG9iamVjdCBhdHRyaWJ1dGUnOwokbGFuZ1snZ3JvdXBfZ3JvdXBoaWVyJ10gPSAnR3JvdXAgbWVtYmVyc2hpcCBpcyBzcGVjaWZpZWQgYnkgb2JqZWN0IGhpZXJhcmNoeSc7CgoKI0gKJGxhbmdbJ2hlbHAnXSA9IDw8PEVPVAo8aDM+V2hhdCBEb2VzIFRoaXMgRG8/PC9oMz4KPHA+VGhpcyBtb2R1bGUgcHJvdmlkZXMgdGhlIGFiaWxpdHkgZm9yIHZpc2l0b3JzIHRvIHlvdXIgd2Vic2l0ZSB0byBhdXRoZW50aWNhdGUgYWdhaW5zdCBhbiBMREFQIHNlcnZlciAoaW5jbHVkaW5nIE9wZW5MREFQIGFuZCBBY3RpdmUgRGlyZWN0b3J5KS4gIFByb3ZpZGluZyBhIHNpbmdsZSBwb2ludCBvZiBtYWludGVuYW5jZSBmb3IgdXNlcm5hbWVzIGFuZCBwYXNzd29yZHMgaW4gYW4gaW50cmFuZXQgZW52aXJvbm1lbnQuICBUaGlzIG1vZHVsZSBhbHNvIHN1cHBvcnRzIE5UTE0gc2luZ2xlIHNpZ24gb24gaW4gYSBzdWl0YWJseSBjb25maWd1cmVkIGVudmlyb25tZW50PC9wPgo8cD5UaGlzIG1vZHVsZSBkb2VzIE5PVCBwcm92aWRlIHR3byB3YXkgc2luY2luZyBvZiB1c2VyIGluZm9ybWF0aW9uLCBvbmx5IG9uZSB3YXkgYXV0aGVudGljYXRpb24uICBVc2VyIGF0dHJpYnV0ZXMgc3VjaCBhcyB0ZWxlcGhvbmUgbnVtYmVyLCBhbmQgZGVwYXJ0bWVudCBhcmUgTk9UIFJldHJpZXZlZCBmcm9tIHRoZSBMREFQIHNlcnZlciBhbmQgcG9wdWxhdGVkIGludG8gdGhlIEZFVSBkYXRhYmFzZS4gIFNpbWlsYXJseSwgY2hhbmdlcyB0byB1c2VyIHNldHRpbmdzIGluIHRoZSBGRVUgZGF0YWJhc2UgYXJlIE5PVCBzeW5jZWQgYmFjayB0byB0aGUgTERBUCBzZXJ2ZXIuPC9wPgo8aDM+RmVhdHVyZXM8L2gzPgo8dWw+CiAgPGxpPlN1cHBvcnRzIE9wZW5MREFQIGFuZCBBY3RpdmUgRGlyZWN0b3J5PC9saT4KICA8bGk+U3VwcG9ydHMgYW5vbnltb3VzIHF1ZXJpZXMgdG8gdGhlIExEQVAgc2VydmVyPC9saT4KICA8bGk+U3VwcG9ydHMgbXVsdGlwbGUgTERBUCBzZXJ2ZXJzLjwvbGk+CiAgPGxpPlN1cHBvcnRzIE5UTE0gU2lnbmxlIFNpZ25vbiA8ZW0+VGhlIHVzZXIgbXVzdCBoYXZlIGNvbmZpZ3VyZWQgdGhpcyBhcHByb3ByaWF0ZWx5IGluIGFwYWNoZSBhbmQgaW4gaGlzIG5ldHdvcmsgYW5kIGJyb3dzZXIgc2V0dGluZ3MuPC9saT4KICA8bGk+U3VwcG9ydHMgYXV0aGVudGljYXRpb24gdmlhIGJpbmQgb3IgdmlhIHBhc3N3b3JkIGF1dGhlbnRpY2F0aW9uLjwvbGk+CiAgPGxpPlN1cHBvcnRzIGRpZmZlcmVudCBTSEEgYW5kIE1ENSBwYXNzd29yZCBlbmNyeXB0aW9uIG1lY2hhbmlzbXMuPC9saT4KICA8bGk+U3VwcG9ydHMgYSB2YXJpZXR5IG9mIGdyb3VwIGF1dGhlbnRpY2F0aW9uIHNjaGVtYXMuPC9saT4KICA8bGk+bW9yZS4uLjwvbGk+CjwvdWw+CjxoMz5Ib3cgZG8gSSB1c2UgaXQ8L2gzPgo8cD48c3Ryb25nIHN0eWxlPSJjb2xvcjogcmVkOyI+SW1wb3J0YW50Ojwvc3Ryb25nPiBUaGlzIG1vZHVsZSBpcyBmb3IgdXNlIG9uIGludHJhbnRldHMgYW5kIG90aGVyIHByaXZhdGUgbmV0d29ya3MuICBUaGUgZXhhY3QgY29uZmlndXJhdGlvbiByZXF1aXJlZCB0byBpbnRlcmZhY2Ugd2l0aCBhbiBMREFQIHNlcnZlciBtYXkgdmFyeSBmb3IgZWFjaCBpbnN0YWxsYXRpb24uICBZb3UgbXVzdCBoYXZlIHNpZ25pZmljYW50IGtub3dsZWRnZSwgYW5kIGFjY2VzcyBvdmVyIHlvdXIgZW52aXJvbm1lbnQgdG8gYmUgYWJsZSB0byB1dGlsaXplIHRoaXMgbW9kdWxlLjwvcD4KPHA+VG8gZW5hYmxlIHRoaXMgbW9kdWxlIHlvdSBtdXN0IHByb3Blcmx5IGNvbmZpZ3VyZSB0aGUgc2V0dGluZ3MsIGluIHRoZSBGRVVfQXV0aF9MREFQIGFkbWluaXN0cmF0aW9uIHBhbmVsLCBhbmQgdGhlbiBzZWxlY3QgdGhpcyBtb2R1bGUgYXMgeW91ciAmcXVvdDtBdXRoZW50aWNhdGlvbiBNb2R1bGUvTWV0aG9kJnF1b3Q7IEluIHRoZSBGRVUgYWRtaW5pc3RyYXRpb24gcGFuZWwuICBBZnRlciB0aGF0IHRpbWUgdXNlcnMgc2hvdWxkIGF1dGhlbnRpY2F0ZSBhZ2FpbnN0IHlvdXIgTERBUCBzZXJ2ZXIuPC9wPgo8aDM+UmVxdWlyZW1lbnRzPC9oMz4KPHA+VGhpcyBtb2R1bGUgcmVxdWlyZXMgdGhhdCB0aGUgbGRhcCBmdW5jdGlvbmFsaXR5IGJlIGVuYWJsZWQgaW4geW91ciBwaHAgZW52aXJvbm1lbnQuPC9wPgo8aDM+U3VwcG9ydDwvaDM+CjxwPjxzdHJvbmcgc3R5bGU9ImNvbG9yOiByZWQ7Ij5Ob3RlOjwvc3Ryb25nPlRoZSBhdXRob3Igd2lsbCBOT1QgcmVzcG9uZCB0byBzdXBwb3J0IHF1ZXN0aW9ucyBhcyB0byBob3cgdG8gY29uZmlndXJlIHlvdXIgbG9jYWwgbmV0d29yaywgd2ViIHNlcnZlciwgb3IgYnJvd3NlciBpbiBvcmRlciB0byB1dGlsaXplIHRoaXMgbW9kdWxlLiAgT25seSB0byBzcGVjaWZpYyBpc29sYXRlZCwgcmVwcm9kdWNhYmxlIGlzc3VlcyByZWxhdGluZyBleHBsaWNpdGx5IHRvIHRoZSBtb2R1bGUuPC9wPgo8cD5UaGlzIG1vZHVsZSBkb2VzIG5vdCBpbmNsdWRlIGNvbW1lcmNpYWwgc3VwcG9ydC4gSG93ZXZlciwgdGhlcmUgYXJlIGEgbnVtYmVyIG9mIHJlc291cmNlcyBhdmFpbGFibGUgdG8gaGVscCB5b3Ugd2l0aCBpdDo8L3A+Cjx1bD4KPGxpPkZvciB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhpcyBtb2R1bGUsIEZBUXMsIG9yIHRvIGZpbGUgYSBCdWcgUmVwb3J0IG9yIGJ1eSBjb21tZXJjaWFsIHN1cHBvcnQsIHBsZWFzZSB2aXNpdCBjYWxndXlcJ3MKbW9kdWxlIGhvbWVwYWdlIGF0IDxhIGhyZWY9Imh0dHA6Ly9jYWxndXkxMDAwLmNvbSI+Y2FsZ3V5MTAwMC5jb208L2E+LjwvbGk+CjxsaT5BZGRpdGlvbmFsIGRpc2N1c3Npb24gb2YgdGhpcyBtb2R1bGUgbWF5IGFsc28gYmUgZm91bmQgaW4gdGhlIDxhIGhyZWY9Imh0dHA6Ly9mb3J1bS5jbXNtYWRlc2ltcGxlLm9yZyI+Q01TIE1hZGUgU2ltcGxlIEZvcnVtczwvYT4uPC9saT4KPGxpPlRoZSBhdXRob3IsIGNhbGd1eTEwMDAsIGNhbiBvZnRlbiBiZSBmb3VuZCBpbiB0aGUgPGEgaHJlZj0iaXJjOi8vaXJjLmZyZWVub2RlLm5ldC8jY21zIj5DTVMgSVJDIENoYW5uZWw8L2E+LjwvbGk+CjxsaT5MYXN0bHksIHlvdSBtYXkgaGF2ZSBzb21lIHN1Y2Nlc3MgZW1haWxpbmcgdGhlIGF1dGhvciBkaXJlY3RseS48L2xpPiAgCjwvdWw+CjxoMz5Db3B5cmlnaHQgYW5kIExpY2Vuc2U8L2gzPgo8cD5Db3B5cmlnaHQgJmNvcHk7IDIwMDgsIFJvYmVydCBDYW1wYmVsIDxhIGhyZWY9Im1haWx0bzpjYWxndXkxMDAwQGNtc21hZGVzaW1wbGUub3JnIj4mbHQ7Y2FsZ3V5MTAwMEBjbXNtYWRlc2ltcGxlLm9yZyZndDs8L2E+LiBBbGwgUmlnaHRzIEFyZSBSZXNlcnZlZC48L3A+CjxwPlRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Cml0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CnRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCihhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uPC9wPgo8cD5Ib3dldmVyLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHUEwsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQKYXMgYW4gYWRkb24gbW9kdWxlIHRvIENNUyBNYWRlIFNpbXBsZS4gIFlvdSBtYXkgbm90IHVzZSB0aGlzIHNvZnR3YXJlCmluIGFueSBOb24gR1BMIHZlcnNpb24gb2YgQ01TIE1hZGUgc2ltcGxlLCBvciBpbiBhbnkgdmVyc2lvbiBvZiBDTVMKTWFkZSBzaW1wbGUgdGhhdCBkb2VzIG5vdCBpbmRpY2F0ZSBjbGVhcmx5IGFuZCBvYnZpb3VzbHkgaW4gaXRzIGFkbWluIApzZWN0aW9uIHRoYXQgdGhlIHNpdGUgd2FzIGJ1aWx0IHdpdGggQ01TIE1hZGUgc2ltcGxlLjwvcD4KPHA+VGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCmJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCk1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKT3IgcmVhZCBpdCA8YSBocmVmPSJodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwiPm9ubGluZTwvYT48L3A+CkVPVDsKCiNJCiRsYW5nWydpbmZvX2xkYXBfYWNjb3VudF9zdWZmaXgnXSA9ICdBZGQgdGhlIGZvbGxvd2luZyBzdHJpbmcgdG8gYWxsIHVzZXJuYW1lcyB3aGVuIGNvbm5lY3RpbmcnOwokbGFuZ1snaW5mb19sZGFwX2F0dHJpYm5hbWUnXSA9ICdMREFQIEF0dHJpYnV0ZSBuYW1lIHVzZWQgdG8gaWRlbnRpZnkgZ3JvdXAgbWVtYmVyc2hpcCc7CiRsYW5nWydpbmZvX2xkYXBfYXV0aF9iaW5kJ10gPSAnQXV0aGVudGljYXRlIHVzZXJzIHZpYSBiaW5kaW5nIHRvIHRoZSBsZGFwIHNlcnZlciBhcyB0aGUgc3BlY2lmaWVkIHVzZXIuICBJZiBvZmYgYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIHZhbGlkYXRlIHRoZSB1c2VycyB1c2VybmFtZSBhbmQgcGFzc3dvcmQgdmlhIHNlYXJjaCc7CiRsYW5nWydpbmZvX2xkYXBfYXV0aF9wdyddID0gJ1NwZWNpZnkgYSB1c2VybmFtZSBhbmQgcGFzc3dvcmQgdGhhdCBjYW4gYmUgdXNlZCB3aGVuIGJpbmRpbmcgdG8gdGhlIExEQVAgc2VydmVyLiAgSWYgdGhlc2UgYXJlIG5vdCBzcGVjaWZpZWQsIGFuIGFub255bW91cyBjb25uZWN0aW9uIHdpbGwgYmUgYXR0ZW1wdGVkLiAgU29tZSBMREFQIHNlcnZlcnMgZG8gbm90IHBlcm1pdCBhbm9ueW1vdXMgY29ubmVjdGlvbnMnOwokbGFuZ1snaW5mb19sZGFwX2F1dGhfdW4nXSA9ICdTcGVjaWZ5IGEgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIHRoYXQgY2FuIGJlIHVzZWQgd2hlbiBiaW5kaW5nIHRvIHRoZSBMREFQIHNlcnZlci4gIElmIHRoZXNlIGFyZSBub3Qgc3BlY2lmaWVkLCBhbiBhbm9ueW1vdXMgY29ubmVjdGlvbiB3aWxsIGJlIGF0dGVtcHRlZC4gIFNvbWUgTERBUCBzZXJ2ZXJzIGRvIG5vdCBwZXJtaXQgYW5vbnltb3VzIGNvbm5lY3Rpb25zJzsKJGxhbmdbJ2luZm9fbGRhcF9zZXJ2ZXInXSA9ICdTcGVjaWZ5IGEgY29tbWEgZGVsaW1pdGVkIGxpc3Qgb2YgTERBUCBob3N0bmFtZXMnOwokbGFuZ1snaW5mb19sZGFwX3VzZV9jbiddID0gJ1doZW4gcGVyZm9ybWluZyBhIGJpbmQgdG8gdGhlIGxkYXAgc2VydmVyLCBzaG91bGQgY29tbW9uIG5hbWUgYmUgdXNlZCc7CiRsYW5nWydpbmZvX2xvZ2luX3RlbXBsYXRlJ10gPSAnVGhlIHRlbXBsYXRlIHRoYXQgaXMgZGlzcGxheWVkIGlmIHRoZSB1c2VyIGhhcyBub3QgYmVlbiBhdXRoZW50aWNhdGVkJzsKJGxhbmdbJ2luZm9fbG9nb3V0X3RlbXBsYXRlJ10gPSAnVGhlIHRlbXBsYXRlIHRoYXQgaXMgZGlzcGxheWVkIGlmIHRoZSB1c2VyIGhhcyBiZWVuIGF1dGhlbnRpY2F0ZWQuICBUaGlzIHRlbXBsYXRlIG1heSBwcm92aWRlIGxvZ291dCBjYXBhYmlsaXRpZXMsIG9yIGNoYW5nZSBzZXR0aW5ncyBjYXBhYmlsaXRpZXMsIGV0Yy4nOwokbGFuZ1snaW5mb19udGxtX2tleSddID0gJ1NwZWNpZnkgdGhlICRfU0VSVkVSIHZhcmlhYmxlIGtleSB0aGF0IGlzIGNyZWF0ZWQgYnkgdGhlIGF1dGhlbnRpY2F0aW9uIG1vZHVsZSAoZm9yIG1vZF9hdXRoX3NzcGkgdGhpcyBpcyBSRU1PVEVfVVNFUiknOwoKI0oKCiNLCgojTAokbGFuZ1snbGRhcF9hY2NvdW50X3N1ZmZpeCddID0gJ0FjY291bnQgU3VmZml4JzsKJGxhbmdbJ2xkYXBfYXR0cmlibmFtZSddID0gJ0F0dHJpYnV0ZSBOYW1lJzsKJGxhbmdbJ2xkYXBfYXV0aF9iaW5kJ10gPSAnQXV0aGVudGljYXRlIHZpYSBiaW5kJzsKJGxhbmdbJ2xkYXBfYXV0aF91biddID0gJ0Nvbm5lY3Rpb24gVXNlcm5hbWUnOwokbGFuZ1snbGRhcF9hdXRoX3B3J10gPSAnQ29ubmVjdGlvbiBQYXNzd29yZCc7CiRsYW5nWydsZGFwX2Jhc2VkbiddID0gJ0Jhc2UgRE4nOwokbGFuZ1snbGRhcF9ncm91cGFycmFuZ2VtZW50J10gPSAnTERBUCBTY2hlbWEgQ29uZmlndXJhdGlvbiBmb3IgR3JvdXBzOic7CiRsYW5nWydsZGFwX250bG1fa2V5J10gPSAnTlRMTSBTZXJ2ZXIgS2V5JzsKJGxhbmdbJ2xkYXBfcmVjdXJzaXZlX2dyb3VwcyddID0gJ0dyb3VwcyBhcmUgYXJyYW5nZWQgaGllcmFyY2hpY2FseSc7CiRsYW5nWydsZGFwX3JlcXVpcmVfZ3JvdXAnXSA9ICdSZXF1aXJlIE1lbWJlcnNoaXAgaW4gVGhpcyBHcm91cCc7CiRsYW5nWydsZGFwX3NlcnZlciddID0gJ0xEQVAgSG9zdChzKSc7CiRsYW5nWydsZGFwX3VuX3ByZWZpeCddID0gJ1NlYXJjaCBmb3IgdXNlcm5hbWUgbWF0Y2hlcyB1c2luZyB0aGlzIGF0dHJpYnV0ZSc7CiRsYW5nWydsZGFwX3VzZV9hZCddID0gJ0Fzc3VtZSBBY3RpdmVEaXJlY3RvcnkgU2VydmVyJzsKJGxhbmdbJ2xkYXBfdXNlX2NuJ10gPSAnVXNlIENvbW1vbiBuYW1lIHdoZW4gYXV0aGVudGljYXRpbmcnOwokbGFuZ1snbGRhcF91c2VfbnRsbSddID0gJ1VzZSBOVE1MIEF1dGhlbnRpY2F0aW9uJzsKJGxhbmdbJ2xvZ2luX3RlbXBsYXRlJ10gPSAnTG9naW4gVGVtcGxhdGUnOwokbGFuZ1snbG9nb3V0J10gPSAnTG9nb3V0JzsKJGxhbmdbJ2xvZ291dF90ZW1wbGF0ZSddID0gJ0xvZ291dCBUZW1wbGF0ZSc7CgojTQokbGFuZ1snbXNnX2Nvbm5lY3RlZCddID0gJ1N1Y2Nlc3NmdWxseSBjb25uZWN0ZWQgdG8gdGhlIExEQVAgU2VydmVyJzsKJGxhbmdbJ21vZGRlc2NyaXB0aW9uJ10gPSAnQW4gYWRkb24gbW9kdWxlIGZvciBGRVUgdG8gYXV0aGVudGljYXRlIGFnYWluc3QgYW4gTERBUCBvciBBY3RpdmVEaXJlY3Rvcnkgc2VydmVyJzsKCiNOCgojTwoKI1AKJGxhbmdbJ3Bhc3N3b3JkJ10gPSAnUGFzc3dvcmQnOwokbGFuZ1sncG9zdGluc3RhbGwnXSA9ICdNb2R1bGUgSW5zdGFsbGVkLiAgUGxlYXNlIGNvbmZpZ3VyZSB0aGUgc2V0dGluZ3MgYXBwcm9wcmlhdGVseSc7CiRsYW5nWydwb3N0dW5pbnN0YWxsJ10gPSAnTERBUCBBdXRoZW50aWNhdGlvbiBtb2R1bGUgdW5pbnN0YWxsZWQsIGFsbCBzZXR0aW5ncyByZW1vdmVkJzsKCiNRCgojUgokbGFuZ1sncmVhbGx5X3VuaW5zdGFsbCddID0gJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byB1bmluc3RhbGwgdGhpcyBtb2R1bGU/JzsKCiNTCiRsYW5nWydzZXR0aW5ncyddID0gJ1NldHRpbmdzJzsKJGxhbmdbJ3N1Ym1pdCddID0gJ1N1Ym1pdCc7CgojVAokbGFuZ1sndGVzdF9jb25uZWN0J10gPSAnVGVzdCBDb25uZWN0aW9uJzsKJGxhbmdbJ3RpdGxlX2xvZ2luX3RlbXBsYXRlJ10gPSAnTG9naW4gVGVtcGxhdGUnOwokbGFuZ1sndGl0bGVfbG9nb3V0X3RlbXBsYXRlJ10gPSAnTG9nb3V0IFRlbXBsYXRlJzsKCiNVCiRsYW5nWyd1c2VybmFtZSddID0gJ1VzZXJuYW1lJzsKCiNWCgojVwoKI1gKCiNZCgojWgoKPz4=]]></data>
	</file>
	<file>
	  <filename>/lib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/adLDAP.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogUEhQIExEQVAgQ0xBU1MgRk9SIE1BTklQVUxBVElORyBBQ1RJVkUgRElSRUNUT1JZIA0KICogVmVyc2lvbiAzLjMuMQ0KICogDQogKiBQSFAgVmVyc2lvbiA1IHdpdGggU1NMIGFuZCBMREFQIHN1cHBvcnQNCiAqIA0KICogV3JpdHRlbiBieSBTY290dCBCYXJuZXR0LCBSaWNoYXJkIEh5bGFuZA0KICogICBlbWFpbDogc2NvdHRAd2lnZ3Vtd29ybGQuY29tLCBhZGxkYXBAcmljaGFyZGh5bGFuZC5jb20NCiAqICAgaHR0cDovL2FkbGRhcC5zb3VyY2Vmb3JnZS5uZXQvDQogKiANCiAqIENvcHlyaWdodCAoYykgMjAwNi0yMDA5IFNjb3R0IEJhcm5ldHQsIFJpY2hhcmQgSHlsYW5kDQogKiANCiAqIFdlJ2QgYXBwcmVjaWF0ZSBhbnkgaW1wcm92ZW1lbnRzIG9yIGFkZGl0aW9ucyB0byBiZSBzdWJtaXR0ZWQgYmFjaw0KICogdG8gYmVuZWZpdCB0aGUgZW50aXJlIGNvbW11bml0eSA6KQ0KICogDQogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yDQogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljDQogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXINCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLg0KICogDQogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwNCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQ0KICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCiAqIA0KICogQGNhdGVnb3J5IFRvb2xzQW5kVXRpbGl0aWVzDQogKiBAcGFja2FnZSBhZExEQVANCiAqIEBhdXRob3IgU2NvdHQgQmFybmV0dCwgUmljaGFyZCBIeWxhbmQNCiAqIEBjb3B5cmlnaHQgKGMpIDIwMDYtMjAwOSBTY290dCBCYXJuZXR0LCBSaWNoYXJkIEh5bGFuZA0KICogQGxpY2Vuc2UgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9sZ3BsLTIuMS5odG1sIExHUEx2Mi4xDQogKiBAcmV2aXNpb24gJFJldmlzaW9uOiA2NyAkDQogKiBAdmVyc2lvbiAzLjMuMQ0KICogQGxpbmsgaHR0cDovL2FkbGRhcC5zb3VyY2Vmb3JnZS5uZXQvDQogKi8NCg0KLyoqDQogKiBEZWZpbmUgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBhY2NvdW50IGluIEFEDQogKi8NCmRlZmluZSAoJ0FETERBUF9OT1JNQUxfQUNDT1VOVCcsIDgwNTMwNjM2OCk7DQpkZWZpbmUgKCdBRExEQVBfV09SS1NUQVRJT05fVFJVU1QnLCA4MDUzMDYzNjkpOw0KZGVmaW5lICgnQURMREFQX0lOVEVSRE9NQUlOX1RSVVNUJywgODA1MzA2MzcwKTsNCmRlZmluZSAoJ0FETERBUF9TRUNVUklUWV9HTE9CQUxfR1JPVVAnLCAyNjg0MzU0NTYpOw0KZGVmaW5lICgnQURMREFQX0RJU1RSSUJVVElPTl9HUk9VUCcsIDI2ODQzNTQ1Nyk7DQpkZWZpbmUgKCdBRExEQVBfU0VDVVJJVFlfTE9DQUxfR1JPVVAnLCA1MzY4NzA5MTIpOw0KZGVmaW5lICgnQURMREFQX0RJU1RSSUJVVElPTl9MT0NBTF9HUk9VUCcsIDUzNjg3MDkxMyk7DQpkZWZpbmUgKCdBRExEQVBfRk9MREVSJywgJ09VJyk7DQpkZWZpbmUgKCdBRExEQVBfQ09OVEFJTkVSJywgJ0NOJyk7DQoNCi8qKg0KKiBNYWluIGFkTERBUCBjbGFzcw0KKiANCiogQ2FuIGJlIGluaXRpYWxpc2VkIHVzaW5nICRhZGxkYXAgPSBuZXcgYWRMREFQKCk7DQoqIA0KKiBTb21ldGhpbmcgdG8ga2VlcCBpbiBtaW5kIGlzIHRoYXQgQWN0aXZlIERpcmVjdG9yeSBpcyBhIHBlcm1pc3Npb25zDQoqIGJhc2VkIGRpcmVjdG9yeS4gSWYgeW91IGJpbmQgYXMgYSBkb21haW4gdXNlciwgeW91IGNhbid0IGZldGNoIGFzDQoqIG11Y2ggaW5mb3JtYXRpb24gb24gb3RoZXIgdXNlcnMgYXMgeW91IGNvdWxkIGFzIGEgZG9tYWluIGFkbWluLg0KKiANCiogQmVmb3JlIGFza2luZyBxdWVzdGlvbnMsIHBsZWFzZSByZWFkIHRoZSBEb2N1bWVudGF0aW9uIGF0DQoqIGh0dHA6Ly9hZGxkYXAuc291cmNlZm9yZ2UubmV0L3dpa2kvZG9rdS5waHA/aWQ9YXBpDQoqLw0KY2xhc3MgYWRMREFQIHsNCiAgICAvKioNCiAgICAqIFRoZSBhY2NvdW50IHN1ZmZpeCBmb3IgeW91ciBkb21haW4sIGNhbiBiZSBzZXQgd2hlbiB0aGUgY2xhc3MgaXMgaW52b2tlZA0KICAgICogDQogICAgKiBAdmFyIHN0cmluZw0KICAgICovICAgDQoJcHJvdGVjdGVkICRfYWNjb3VudF9zdWZmaXggPSAiQG15ZG9tYWluLmxvY2FsIjsNCiAgICANCiAgICAvKioNCiAgICAqIFRoZSBiYXNlIGRuIGZvciB5b3VyIGRvbWFpbg0KICAgICogDQogICAgKiBAdmFyIHN0cmluZw0KICAgICovDQoJcHJvdGVjdGVkICRfYmFzZV9kbiA9ICJEQz1teWRvbWFpbixEQz1sb2NhbCI7IA0KCQ0KICAgIC8qKg0KICAgICogQXJyYXkgb2YgZG9tYWluIGNvbnRyb2xsZXJzLiBTcGVjaWZpeSBtdWx0aXBsZSBjb250cm9sbGVycyBpZiB5b3UNCiAgICAqIHdvdWxkIGxpa2UgdGhlIGNsYXNzIHRvIGJhbGFuY2UgdGhlIExEQVAgcXVlcmllcyBhbW9uZ3N0IG11bHRpcGxlIHNlcnZlcnMNCiAgICAqIA0KICAgICogQHZhciBhcnJheQ0KICAgICovDQogICAgcHJvdGVjdGVkICRfZG9tYWluX2NvbnRyb2xsZXJzID0gYXJyYXkgKCJkYzAxLm15ZG9tYWluLmxvY2FsIik7DQoJDQogICAgLyoqDQogICAgKiBPcHRpb25hbCBhY2NvdW50IHdpdGggaGlnaGVyIHByaXZpbGVnZXMgZm9yIHNlYXJjaGluZw0KICAgICogVGhpcyBzaG91bGQgYmUgc2V0IHRvIGEgZG9tYWluIGFkbWluIGFjY291bnQNCiAgICAqIA0KICAgICogQHZhciBzdHJpbmcNCiAgICAqIEB2YXIgc3RyaW5nDQogICAgKi8NCglwcm90ZWN0ZWQgJF9hZF91c2VybmFtZT1OVUxMOw0KICAgIHByb3RlY3RlZCAkX2FkX3Bhc3N3b3JkPU5VTEw7DQogICAgDQogICAgLyoqDQogICAgKiBBRCBkb2VzIG5vdCByZXR1cm4gdGhlIHByaW1hcnkgZ3JvdXAuIGh0dHA6Ly9zdXBwb3J0Lm1pY3Jvc29mdC5jb20vP2tiaWQ9MzIxMzYwDQogICAgKiBUaGlzIHR3ZWFrIHdpbGwgcmVzb2x2ZSB0aGUgcmVhbCBwcmltYXJ5IGdyb3VwLiANCiAgICAqIFNldHRpbmcgdG8gZmFsc2Ugd2lsbCBmdWRnZSAiRG9tYWluIFVzZXJzIiBhbmQgaXMgbXVjaCBmYXN0ZXIuIEtlZXAgaW4gbWluZCB0aG91Z2ggdGhhdCBpZg0KICAgICogc29tZW9uZSdzIHByaW1hcnkgZ3JvdXAgaXMgTk9UIGRvbWFpbiB1c2VycywgdGhpcyBpcyBvYnZpb3VzbHkgZ29pbmcgdG8gbWVzcyB1cCB0aGUgcmVzdWx0cw0KICAgICogDQogICAgKiBAdmFyIGJvb2wNCiAgICAqLw0KCXByb3RlY3RlZCAkX3JlYWxfcHJpbWFyeWdyb3VwPXRydWU7DQoJDQogICAgLyoqDQogICAgKiBVc2UgU1NMIChMREFQUyksIHlvdXIgc2VydmVyIG5lZWRzIHRvIGJlIHNldHVwLCBwbGVhc2Ugc2VlDQogICAgKiBodHRwOi8vYWRsZGFwLnNvdXJjZWZvcmdlLm5ldC93aWtpL2Rva3UucGhwP2lkPWxkYXBfb3Zlcl9zc2wNCiAgICAqIA0KICAgICogQHZhciBib29sDQogICAgKi8NCglwcm90ZWN0ZWQgJF91c2Vfc3NsPWZhbHNlOw0KICAgIA0KICAgIC8qKg0KICAgICogVXNlIFRMUw0KICAgICogSWYgeW91IHdpc2ggdG8gdXNlIFRMUyB5b3Ugc2hvdWxkIGVuc3VyZSB0aGF0ICRfdXNlX3NzbCBpcyBzZXQgdG8gZmFsc2UgYW5kIHZpY2UtdmVyc2ENCiAgICAqIA0KICAgICogQHZhciBib29sDQogICAgKi8NCiAgICBwcm90ZWN0ZWQgJF91c2VfdGxzPWZhbHNlOw0KICAgIA0KICAgIC8qKg0KICAgICogV2hlbiBxdWVyeWluZyBncm91cCBtZW1iZXJzaGlwcywgZG8gaXQgcmVjdXJzaXZlbHkgDQogICAgKiBlZy4gVXNlciBGcmVkIGlzIGEgbWVtYmVyIG9mIEdyb3VwIEEsIHdoaWNoIGlzIGEgbWVtYmVyIG9mIEdyb3VwIEIsIHdoaWNoIGlzIGEgbWVtYmVyIG9mIEdyb3VwIEMNCiAgICAqIHVzZXJfaW5ncm91cCgiRnJlZCIsIkMiKSB3aWxsIHJldHVybnMgdHJ1ZSB3aXRoIHRoaXMgb3B0aW9uIHR1cm5lZCBvbiwgZmFsc2UgaWYgdHVybmVkIG9mZiAgICAgDQogICAgKiANCiAgICAqIEB2YXIgYm9vbA0KICAgICovDQoJcHJvdGVjdGVkICRfcmVjdXJzaXZlX2dyb3Vwcz10cnVlOw0KCQ0KCS8vIFlvdSBzaG91bGQgbm90IG5lZWQgdG8gZWRpdCBhbnl0aGluZyBiZWxvdyB0aGlzIGxpbmUNCgkvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KCQ0KCS8qKg0KICAgICogQ29ubmVjdGlvbiBhbmQgYmluZCBkZWZhdWx0IHZhcmlhYmxlcw0KICAgICogDQogICAgKiBAdmFyIG1peGVkDQogICAgKiBAdmFyIG1peGVkDQogICAgKi8NCglwcm90ZWN0ZWQgJF9jb25uOw0KCXByb3RlY3RlZCAkX2JpbmQ7DQogICAgDQogICAgLyoqDQogICAgKiBHZXR0ZXJzIGFuZCBTZXR0ZXJzDQogICAgKi8NCiAgICANCiAgICAvKioNCiAgICAqIFNldCB0aGUgYWNjb3VudCBzdWZmaXgNCiAgICAqIA0KICAgICogQHBhcmFtIHN0cmluZyAkX2FjY291bnRfc3VmZml4DQogICAgKiBAcmV0dXJuIHZvaWQNCiAgICAqLw0KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRfYWNjb3VudF9zdWZmaXgoJF9hY2NvdW50X3N1ZmZpeCkNCiAgICB7DQogICAgICAgICAgJHRoaXMtPl9hY2NvdW50X3N1ZmZpeCA9ICRfYWNjb3VudF9zdWZmaXg7DQogICAgfQ0KDQogICAgLyoqDQogICAgKiBHZXQgdGhlIGFjY291bnQgc3VmZml4DQogICAgKiANCiAgICAqIEByZXR1cm4gc3RyaW5nDQogICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0X2FjY291bnRfc3VmZml4KCkNCiAgICB7DQogICAgICAgICAgcmV0dXJuICR0aGlzLT5fYWNjb3VudF9zdWZmaXg7DQogICAgfQ0KICAgIA0KICAgIC8qKg0KICAgICogU2V0IHRoZSBkb21haW4gY29udHJvbGxlcnMgYXJyYXkNCiAgICAqIA0KICAgICogQHBhcmFtIGFycmF5ICRfZG9tYWluX2NvbnRyb2xsZXJzDQogICAgKiBAcmV0dXJuIHZvaWQNCiAgICAqLw0KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRfZG9tYWluX2NvbnRyb2xsZXJzKGFycmF5ICRfZG9tYWluX2NvbnRyb2xsZXJzKQ0KICAgIHsNCiAgICAgICAgICAkdGhpcy0+X2RvbWFpbl9jb250cm9sbGVycyA9ICRfZG9tYWluX2NvbnRyb2xsZXJzOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICogR2V0IHRoZSBsaXN0IG9mIGRvbWFpbiBjb250cm9sbGVycw0KICAgICogDQogICAgKiBAcmV0dXJuIHZvaWQNCiAgICAqLw0KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRfZG9tYWluX2NvbnRyb2xsZXJzKCkNCiAgICB7DQogICAgICAgICAgcmV0dXJuICR0aGlzLT5fZG9tYWluX2NvbnRyb2xsZXJzOw0KICAgIH0NCiAgICANCiAgICAvKioNCiAgICAqIFNldCB0aGUgdXNlcm5hbWUgb2YgYW4gYWNjb3VudCB3aXRoIGhpZ2hlciBwcml2aWxlZGdlcw0KICAgICogDQogICAgKiBAcGFyYW0gc3RyaW5nICRfYWRfdXNlcm5hbWUNCiAgICAqIEByZXR1cm4gdm9pZA0KICAgICovDQogICAgcHVibGljIGZ1bmN0aW9uIHNldF9hZF91c2VybmFtZSgkX2FkX3VzZXJuYW1lKQ0KICAgIHsNCiAgICAgICAgICAkdGhpcy0+X2FkX3VzZXJuYW1lID0gJF9hZF91c2VybmFtZTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAqIEdldCB0aGUgdXNlcm5hbWUgb2YgdGhlIGFjY291bnQgd2l0aCBoaWdoZXIgcHJpdmlsZWRnZXMNCiAgICAqIA0KICAgICogVGhpcyB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiBmb3Igc2VjdXJpdHkgcmVhc29ucw0KICAgICovDQogICAgcHVibGljIGZ1bmN0aW9uIGdldF9hZF91c2VybmFtZSgpDQogICAgew0KICAgICAgICAgIHRocm93IG5ldyBhZExEQVBFeGNlcHRpb24oJ0ZvciBzZWN1cml0eSByZWFzb25zIHlvdSBjYW5ub3QgYWNjZXNzIHRoZSBkb21haW4gYWRtaW5pc3RyYXRvciBhY2NvdW50IGRldGFpbHMnKTsNCiAgICB9DQogICAgDQogICAgLyoqDQogICAgKiBTZXQgdGhlIHBhc3N3b3JkIG9mIGFuIGFjY291bnQgd2l0aCBoaWdoZXIgcHJpdmlsZWRnZXMNCiAgICAqIA0KICAgICogQHBhcmFtIHN0cmluZyAkX2FkX3Bhc3N3b3JkDQogICAgKiBAcmV0dXJuIHZvaWQNCiAgICAqLw0KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRfYWRfcGFzc3dvcmQoJF9hZF9wYXNzd29yZCkNCiAgICB7DQogICAgICAgICAgJHRoaXMtPl9hZF9wYXNzd29yZCA9ICRfYWRfcGFzc3dvcmQ7DQogICAgfQ0KDQogICAgLyoqDQogICAgKiBHZXQgdGhlIHBhc3N3b3JkIG9mIHRoZSBhY2NvdW50IHdpdGggaGlnaGVyIHByaXZpbGVkZ2VzDQogICAgKiANCiAgICAqIFRoaXMgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24gZm9yIHNlY3VyaXR5IHJlYXNvbnMNCiAgICAqLw0KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRfYWRfcGFzc3dvcmQoKQ0KICAgIHsNCiAgICAgICAgICB0aHJvdyBuZXcgYWRMREFQRXhjZXB0aW9uKCdGb3Igc2VjdXJpdHkgcmVhc29ucyB5b3UgY2Fubm90IGFjY2VzcyB0aGUgZG9tYWluIGFkbWluaXN0cmF0b3IgYWNjb3VudCBkZXRhaWxzJyk7DQogICAgfQ0KICAgIA0KICAgIC8qKg0KICAgICogU2V0IHdoZXRoZXIgdG8gZGV0ZWN0IHRoZSB0cnVlIHByaW1hcnkgZ3JvdXANCiAgICAqIA0KICAgICogQHBhcmFtIGJvb2wgJF9yZWFsX3ByaW1hcnlfZ3JvdXANCiAgICAqIEByZXR1cm4gdm9pZA0KICAgICovDQogICAgcHVibGljIGZ1bmN0aW9uIHNldF9yZWFsX3ByaW1hcnlncm91cCgkX3JlYWxfcHJpbWFyeWdyb3VwKQ0KICAgIHsNCiAgICAgICAgICAkdGhpcy0+X3JlYWxfcHJpbWFyeWdyb3VwID0gJF9yZWFsX3ByaW1hcnlncm91cDsNCiAgICB9DQoNCiAgICAvKioNCiAgICAqIEdldCB0aGUgcmVhbCBwcmltYXJ5IGdyb3VwIHNldHRpbmcNCiAgICAqIA0KICAgICogQHJldHVybiBib29sDQogICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0X3JlYWxfcHJpbWFyeWdyb3VwKCkNCiAgICB7DQogICAgICAgICAgcmV0dXJuICR0aGlzLT5fcmVhbF9wcmltYXJ5Z3JvdXA7DQogICAgfQ0KICAgIA0KICAgIC8qKg0KICAgICogU2V0IHdoZXRoZXIgdG8gdXNlIFNTTA0KICAgICogDQogICAgKiBAcGFyYW0gYm9vbCAkX3VzZV9zc2wNCiAgICAqIEByZXR1cm4gdm9pZA0KICAgICovDQogICAgcHVibGljIGZ1bmN0aW9uIHNldF91c2Vfc3NsKCRfdXNlX3NzbCkNCiAgICB7DQogICAgICAgICAgJHRoaXMtPl91c2Vfc3NsID0gJF91c2Vfc3NsOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICogR2V0IHRoZSBTU0wgc2V0dGluZw0KICAgICogDQogICAgKiBAcmV0dXJuIGJvb2wNCiAgICAqLw0KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRfdXNlX3NzbCgpDQogICAgew0KICAgICAgICAgIHJldHVybiAkdGhpcy0+X3VzZV9zc2w7DQogICAgfQ0KICAgIA0KICAgIC8qKg0KICAgICogU2V0IHdoZXRoZXIgdG8gdXNlIFRMUw0KICAgICogDQogICAgKiBAcGFyYW0gYm9vbCAkX3VzZV90bHMNCiAgICAqIEByZXR1cm4gdm9pZA0KICAgICovDQogICAgcHVibGljIGZ1bmN0aW9uIHNldF91c2VfdGxzKCRfdXNlX3RscykNCiAgICB7DQogICAgICAgICAgJHRoaXMtPl91c2VfdGxzID0gJF91c2VfdGxzOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICogR2V0IHRoZSBUTFMgc2V0dGluZw0KICAgICogDQogICAgKiBAcmV0dXJuIGJvb2wNCiAgICAqLw0KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRfdXNlX3RscygpDQogICAgew0KICAgICAgICAgIHJldHVybiAkdGhpcy0+X3VzZV90bHM7DQogICAgfQ0KICAgIA0KICAgIC8qKg0KICAgICogU2V0IHdoZXRoZXIgdG8gbG9va3VwIHJlY3Vyc2l2ZSBncm91cHMNCiAgICAqIA0KICAgICogQHBhcmFtIGJvb2wgJF9yZWN1cnNpdmVfZ3JvdXBzDQogICAgKiBAcmV0dXJuIHZvaWQNCiAgICAqLw0KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRfcmVjdXJzaXZlX2dyb3VwcygkX3JlY3Vyc2l2ZV9ncm91cHMpDQogICAgew0KICAgICAgICAgICR0aGlzLT5fcmVjdXJzaXZlX2dyb3VwcyA9ICRfcmVjdXJzaXZlX2dyb3VwczsNCiAgICB9DQoNCiAgICAvKioNCiAgICAqIEdldCB0aGUgcmVjdXJzaXZlIGdyb3VwcyBzZXR0aW5nDQogICAgKiANCiAgICAqIEByZXR1cm4gYm9vbA0KICAgICovDQogICAgcHVibGljIGZ1bmN0aW9uIGdldF9yZWN1cnNpdmVfZ3JvdXBzKCkNCiAgICB7DQogICAgICAgICAgcmV0dXJuICR0aGlzLT5fcmVjdXJzaXZlX2dyb3VwczsNCiAgICB9DQoNCiAgICAvKioNCiAgICAqIERlZmF1bHQgQ29uc3RydWN0b3INCiAgICAqIA0KICAgICogVHJpZXMgdG8gYmluZCB0byB0aGUgQUQgZG9tYWluIG92ZXIgTERBUCBvciBMREFQcw0KICAgICogDQogICAgKiBAcGFyYW0gYXJyYXkgJG9wdGlvbnMgQXJyYXkgb2Ygb3B0aW9ucyB0byBwYXNzIHRvIHRoZSBjb25zdHJ1Y3Rvcg0KICAgICogQHRocm93cyBFeGNlcHRpb24gLSBpZiB1bmFibGUgdG8gYmluZCB0byBEb21haW4gQ29udHJvbGxlcg0KICAgICogQHJldHVybiBib29sDQogICAgKi8NCiAgICBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkb3B0aW9ucz1hcnJheSgpKXsNCiAgICAgICAgLy8gWW91IGNhbiBzcGVjaWZpY2FsbHkgb3ZlcmlkZSBhbnkgb2YgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBvcHRpb25zIHNldHVwIGFib3ZlDQogICAgICAgIGlmIChjb3VudCgkb3B0aW9ucyk+MCl7DQogICAgICAgICAgICBpZiAoYXJyYXlfa2V5X2V4aXN0cygiYWNjb3VudF9zdWZmaXgiLCRvcHRpb25zKSl7ICR0aGlzLT5fYWNjb3VudF9zdWZmaXg9JG9wdGlvbnNbImFjY291bnRfc3VmZml4Il07IH0NCiAgICAgICAgICAgIGlmIChhcnJheV9rZXlfZXhpc3RzKCJiYXNlX2RuIiwkb3B0aW9ucykpeyAkdGhpcy0+X2Jhc2VfZG49JG9wdGlvbnNbImJhc2VfZG4iXTsgfQ0KICAgICAgICAgICAgaWYgKGFycmF5X2tleV9leGlzdHMoImRvbWFpbl9jb250cm9sbGVycyIsJG9wdGlvbnMpKXsgJHRoaXMtPl9kb21haW5fY29udHJvbGxlcnM9JG9wdGlvbnNbImRvbWFpbl9jb250cm9sbGVycyJdOyB9DQogICAgICAgICAgICBpZiAoYXJyYXlfa2V5X2V4aXN0cygiYWRfdXNlcm5hbWUiLCRvcHRpb25zKSl7ICR0aGlzLT5fYWRfdXNlcm5hbWU9JG9wdGlvbnNbImFkX3VzZXJuYW1lIl07IH0NCiAgICAgICAgICAgIGlmIChhcnJheV9rZXlfZXhpc3RzKCJhZF9wYXNzd29yZCIsJG9wdGlvbnMpKXsgJHRoaXMtPl9hZF9wYXNzd29yZD0kb3B0aW9uc1siYWRfcGFzc3dvcmQiXTsgfQ0KICAgICAgICAgICAgaWYgKGFycmF5X2tleV9leGlzdHMoInJlYWxfcHJpbWFyeWdyb3VwIiwkb3B0aW9ucykpeyAkdGhpcy0+X3JlYWxfcHJpbWFyeWdyb3VwPSRvcHRpb25zWyJyZWFsX3ByaW1hcnlncm91cCJdOyB9DQogICAgICAgICAgICBpZiAoYXJyYXlfa2V5X2V4aXN0cygidXNlX3NzbCIsJG9wdGlvbnMpKXsgJHRoaXMtPl91c2Vfc3NsPSRvcHRpb25zWyJ1c2Vfc3NsIl07IH0NCiAgICAgICAgICAgIGlmIChhcnJheV9rZXlfZXhpc3RzKCJ1c2VfdGxzIiwkb3B0aW9ucykpeyAkdGhpcy0+X3VzZV90bHM9JG9wdGlvbnNbInVzZV90bHMiXTsgfQ0KICAgICAgICAgICAgaWYgKGFycmF5X2tleV9leGlzdHMoInJlY3Vyc2l2ZV9ncm91cHMiLCRvcHRpb25zKSl7ICR0aGlzLT5fcmVjdXJzaXZlX2dyb3Vwcz0kb3B0aW9uc1sicmVjdXJzaXZlX2dyb3VwcyJdOyB9DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoJHRoaXMtPmxkYXBfc3VwcG9ydGVkKCkgPT09IGZhbHNlKSB7DQogICAgICAgICAgICB0aHJvdyBuZXcgYWRMREFQRXhjZXB0aW9uKCdObyBMREFQIHN1cHBvcnQgZm9yIFBIUC4gIFNlZTogaHR0cDovL3d3dy5waHAubmV0L2xkYXAnKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiAkdGhpcy0+Y29ubmVjdCgpOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICogRGVmYXVsdCBEZXN0cnVjdG9yDQogICAgKiANCiAgICAqIENsb3NlcyB0aGUgTERBUCBjb25uZWN0aW9uDQogICAgKiANCiAgICAqIEByZXR1cm4gdm9pZA0KICAgICovDQogICAgZnVuY3Rpb24gX19kZXN0cnVjdCgpeyAkdGhpcy0+Y2xvc2UoKTsgfQ0KDQogICAgLyoqDQogICAgKiBDb25uZWN0cyBhbmQgQmluZHMgdG8gdGhlIERvbWFpbiBDb250cm9sbGVyDQogICAgKiANCiAgICAqIEByZXR1cm4gYm9vbA0KICAgICovDQogICAgcHVibGljIGZ1bmN0aW9uIGNvbm5lY3QoKSB7DQogICAgICAgIC8vIENvbm5lY3QgdG8gdGhlIEFEL0xEQVAgc2VydmVyIGFzIHRoZSB1c2VybmFtZS9wYXNzd29yZA0KICAgICAgICAkZGM9JHRoaXMtPnJhbmRvbV9jb250cm9sbGVyKCk7DQogICAgICAgIGlmICgkdGhpcy0+X3VzZV9zc2wpew0KICAgICAgICAgICAgJHRoaXMtPl9jb25uID0gbGRhcF9jb25uZWN0KCJsZGFwczovLyIuJGRjLCA2MzYpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgJHRoaXMtPl9jb25uID0gbGRhcF9jb25uZWN0KCRkYyk7DQogICAgICAgIH0NCg0KICAgICAgICAvLyBTZXQgc29tZSBsZGFwIG9wdGlvbnMgZm9yIHRhbGtpbmcgdG8gQUQNCiAgICAgICAgbGRhcF9zZXRfb3B0aW9uKCR0aGlzLT5fY29ubiwgTERBUF9PUFRfUFJPVE9DT0xfVkVSU0lPTiwgMyk7DQogICAgICAgIGxkYXBfc2V0X29wdGlvbigkdGhpcy0+X2Nvbm4sIExEQVBfT1BUX1JFRkVSUkFMUywgMCk7DQogICAgICAgIA0KICAgICAgICBpZiAoJHRoaXMtPl91c2VfdGxzKSB7DQogICAgICAgICAgICBsZGFwX3N0YXJ0X3RscygkdGhpcy0+X2Nvbm4pOw0KICAgICAgICB9DQogICAgICAgICAgICAgICANCiAgICAgICAgLy8gQmluZCBhcyBhIGRvbWFpbiBhZG1pbiBpZiB0aGV5J3ZlIHNldCBpdCB1cA0KICAgICAgICBpZiAoJHRoaXMtPl9hZF91c2VybmFtZSE9TlVMTCAmJiAkdGhpcy0+X2FkX3Bhc3N3b3JkIT1OVUxMKXsNCgkgICR0aGlzLT5fYmluZCA9ICR0aGlzLT5fYXV0aCgkdGhpcy0+X2FkX3VzZXJuYW1lLCR0aGlzLT5fYWRfcGFzc3dvcmQpOw0KICAgICAgICAgICAgaWYgKCEkdGhpcy0+X2JpbmQpew0KICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+X3VzZV9zc2wgJiYgISR0aGlzLT5fdXNlX3Rscyl7DQogICAgICAgICAgICAgICAgICAgIC8vIElmIHlvdSBoYXZlIHByb2JsZW1zIHRyb3VibGVzaG9vdGluZywgcmVtb3ZlIHRoZSBAIGNoYXJhY3RlciBmcm9tIHRoZSBsZGFwX2JpbmQgY29tbWFuZCBhYm92ZSB0byBnZXQgdGhlIGFjdHVhbCBlcnJvciBtZXNzYWdlDQogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBhZExEQVBFeGNlcHRpb24oJ0JpbmQgdG8gQWN0aXZlIERpcmVjdG9yeSBmYWlsZWQuIEVpdGhlciB0aGUgTERBUHMgY29ubmVjdGlvbiBmYWlsZWQgb3IgdGhlIGxvZ2luIGNyZWRlbnRpYWxzIGFyZSBpbmNvcnJlY3QuIEFEIHNhaWQ6ICcgLiAkdGhpcy0+Z2V0X2xhc3RfZXJyb3IoKSk7DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGFkTERBUEV4Y2VwdGlvbignQmluZCB0byBBY3RpdmUgRGlyZWN0b3J5IGZhaWxlZC4gQ2hlY2sgdGhlIGxvZ2luIGNyZWRlbnRpYWxzIGFuZC9vciBzZXJ2ZXIgZGV0YWlscy4gQUQgc2FpZDogJyAuICR0aGlzLT5nZXRfbGFzdF9lcnJvcigpKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIGlmICgkdGhpcy0+X2Jhc2VfZG4gPT0gTlVMTCkgew0KICAgICAgICAgICAgJHRoaXMtPl9iYXNlX2RuID0gJHRoaXMtPmZpbmRfYmFzZV9kbigpOyAgIA0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICByZXR1cm4gKHRydWUpOw0KICAgIH0NCiAgICANCiAgICAvKioNCiAgICAqIENsb3NlcyB0aGUgTERBUCBjb25uZWN0aW9uDQogICAgKiANCiAgICAqIEByZXR1cm4gdm9pZA0KICAgICovDQogICAgcHVibGljIGZ1bmN0aW9uIGNsb3NlKCkgew0KICAgICAgICBsZGFwX2Nsb3NlICgkdGhpcy0+X2Nvbm4pOw0KICAgIH0NCg0KICAgIA0KICAgIC8qKg0KICAgICAqIEFkZGVkDQogICAgICogQSBwcm90ZWN0ZWQgZnVuY3Rpb24gZm9yIGJpbmRpbmcNCiAgICAgKg0KICAgICAqIEBwYXJhbSBzdHJpbmcgJHVzZXJuYW1lIGEgdXNlcnMgdXNlcm5hbWUNCiAgICAgKiBAcGFyYW0gc3RyaW5nICRwYXNzd29yZCBhIHVzZXJzIHBhc3N3b3JkDQogICAgICogQHJldHVybiBjb25uZWN0aW9uIGhhbmRsZQ0KICAgICAqLw0KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBfYXV0aCgkdXNlcm5hbWUsJHBhc3N3b3JkKQ0KICAgIHsNCiAgICAgICRyZXMgPSBAbGRhcF9iaW5kKCR0aGlzLT5fY29ubiwkdXNlcm5hbWUuJHRoaXMtPl9hY2NvdW50X3N1ZmZpeCwkcGFzc3dvcmQpOw0KICAgICAgcmV0dXJuICRyZXM7DQogICAgfQ0KDQogICAgLyoqDQogICAgKiBWYWxpZGF0ZSBhIHVzZXIncyBsb2dpbiBjcmVkZW50aWFscw0KICAgICogDQogICAgKiBAcGFyYW0gc3RyaW5nICR1c2VybmFtZSBBIHVzZXIncyBBRCB1c2VybmFtZQ0KICAgICogQHBhcmFtIHN0cmluZyAkcGFzc3dvcmQgQSB1c2VyJ3MgQUQgcGFzc3dvcmQNCiAgICAqIEBwYXJhbSBib29sIG9wdGlvbmFsICRwcmV2ZW50X3JlYmluZA0KICAgICogQHJldHVybiBib29sDQogICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gYXV0aGVudGljYXRlKCR1c2VybmFtZSwkcGFzc3dvcmQsJHByZXZlbnRfcmViaW5kPWZhbHNlKXsNCiAgICAgICAgLy8gUHJldmVudCBudWxsIGJpbmRpbmcNCiAgICAgICAgaWYgKCR1c2VybmFtZT09PU5VTEwgfHwgJHBhc3N3b3JkPT09TlVMTCl7IHJldHVybiAoZmFsc2UpOyB9IA0KICAgICAgICBpZiAoZW1wdHkoJHVzZXJuYW1lKSB8fCBlbXB0eSgkcGFzc3dvcmQpKXsgcmV0dXJuIChmYWxzZSk7IH0NCiAgICAgICAgDQogICAgICAgIC8vIEJpbmQgYXMgdGhlIHVzZXIgICAgICAgIA0KICAgICAgICAkdGhpcy0+X2JpbmQgPSAkdGhpcy0+X2F1dGgoJHVzZXJuYW1lLCRwYXNzd29yZCk7DQogICAgICAgIGlmICghJHRoaXMtPl9iaW5kKXsgcmV0dXJuIChmYWxzZSk7IH0NCiAgICAgICAgDQogICAgICAgIC8vIENuY2Ugd2UndmUgY2hlY2tlZCB0aGVpciBkZXRhaWxzLCBraWNrIGJhY2sgaW50byBhZG1pbiBtb2RlIGlmIHdlIGhhdmUgaXQNCiAgICAgICAgaWYgKCR0aGlzLT5fYWRfdXNlcm5hbWUhPU5VTEwgJiYgISRwcmV2ZW50X3JlYmluZCl7DQoJICAkdGhpcy0+X2JpbmQgPSAkdGhpcy0+X2F1dGgoJHRoaXMtPl9hZF91c2VybmFtZSwkdGhpcy0+X2FkX3Bhc3N3b3JkKTsNCiAgICAgICAgICAgIGlmICghJHRoaXMtPl9iaW5kKXsNCiAgICAgICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4gaW4gdGhlb3J5DQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IGFkTERBUEV4Y2VwdGlvbignUmViaW5kIHRvIEFjdGl2ZSBEaXJlY3RvcnkgZmFpbGVkLiBBRCBzYWlkOiAnIC4gJHRoaXMtPmdldF9sYXN0X2Vycm9yKCkpOw0KICAgICAgICAgICAgfSANCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgcmV0dXJuICh0cnVlKTsNCiAgICB9DQoNCiAgICAvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogICAgLy8gR1JPVVAgRlVOQ1RJT05TDQoNCiAgICAvKioNCiAgICAqIEFkZCBhIGdyb3VwIHRvIGEgZ3JvdXANCiAgICAqIA0KICAgICogQHBhcmFtIHN0cmluZyAkcGFyZW50IFRoZSBwYXJlbnQgZ3JvdXAgbmFtZQ0KICAgICogQHBhcmFtIHN0cmluZyAkY2hpbGQgVGhlIGNoaWxkIGdyb3VwIG5hbWUNCiAgICAqIEByZXR1cm4gYm9vbA0KICAgICovDQogICAgcHVibGljIGZ1bmN0aW9uIGdyb3VwX2FkZF9ncm91cCgkcGFyZW50LCRjaGlsZCl7DQoNCiAgICAgICAgLy8gRmluZCB0aGUgcGFyZW50IGdyb3VwJ3MgZG4NCiAgICAgICAgJHBhcmVudF9ncm91cD0kdGhpcy0+Z3JvdXBfaW5mbygkcGFyZW50LGFycmF5KCJjbiIpKTsNCiAgICAgICAgaWYgKCRwYXJlbnRfZ3JvdXBbMF1bImRuIl09PT1OVUxMKXsgcmV0dXJuIChmYWxzZSk7IH0NCiAgICAgICAgJHBhcmVudF9kbj0kcGFyZW50X2dyb3VwWzBdWyJkbiJdOw0KICAgICAgICANCiAgICAgICAgLy8gRmluZCB0aGUgY2hpbGQgZ3JvdXAncyBkbg0KICAgICAgICAkY2hpbGRfZ3JvdXA9JHRoaXMtPmdyb3VwX2luZm8oJGNoaWxkLGFycmF5KCJjbiIpKTsNCiAgICAgICAgaWYgKCRjaGlsZF9ncm91cFswXVsiZG4iXT09PU5VTEwpeyByZXR1cm4gKGZhbHNlKTsgfQ0KICAgICAgICAkY2hpbGRfZG49JGNoaWxkX2dyb3VwWzBdWyJkbiJdOw0KICAgICAgICAgICAgICAgIA0KICAgICAgICAkYWRkPWFycmF5KCk7DQogICAgICAgICRhZGRbIm1lbWJlciJdID0gJGNoaWxkX2RuOw0KICAgICAgICANCiAgICAgICAgJHJlc3VsdD1AbGRhcF9tb2RfYWRkKCR0aGlzLT5fY29ubiwkcGFyZW50X2RuLCRhZGQpOw0KICAgICAgICBpZiAoJHJlc3VsdD09ZmFsc2UpeyByZXR1cm4gKGZhbHNlKTsgfQ0KICAgICAgICByZXR1cm4gKHRydWUpOw0KICAgIH0NCiAgICANCiAgICAvKioNCiAgICAqIEFkZCBhIHVzZXIgdG8gYSBncm91cA0KICAgICogDQogICAgKiBAcGFyYW0gc3RyaW5nICRncm91cCBUaGUgZ3JvdXAgdG8gYWRkIHRoZSB1c2VyIHRvDQogICAgKiBAcGFyYW0gc3RyaW5nICR1c2VyIFRoZSB1c2VyIHRvIGFkZCB0byB0aGUgZ3JvdXANCiAgICAqIEBwYXJhbSBib29sICRpc0dVSUQgSXMgdGhlIHVzZXJuYW1lIHBhc3NlZCBhIEdVSUQgb3IgYSBzYW1BY2NvdW50TmFtZQ0KICAgICogQHJldHVybiBib29sDQogICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gZ3JvdXBfYWRkX3VzZXIoJGdyb3VwLCR1c2VyLCRpc0dVSUQ9ZmFsc2Upew0KICAgICAgICAvLyBBZGRpbmcgYSB1c2VyIGlzIGEgYml0IGZpZGRseSwgd2UgbmVlZCB0byBnZXQgdGhlIGZ1bGwgRE4gb2YgdGhlIHVzZXINCiAgICAgICAgLy8gYW5kIGFkZCBpdCB1c2luZyB0aGUgZnVsbCBETiBvZiB0aGUgZ3JvdXANCiAgICAgICAgDQogICAgICAgIC8vIEZpbmQgdGhlIHVzZXIncyBkbg0KICAgICAgICAkdXNlcl9kbj0kdGhpcy0+dXNlcl9kbigkdXNlciwkaXNHVUlEKTsNCiAgICAgICAgaWYgKCR1c2VyX2RuPT09ZmFsc2UpeyByZXR1cm4gKGZhbHNlKTsgfQ0KICAgICAgICANCiAgICAgICAgLy8gRmluZCB0aGUgZ3JvdXAncyBkbg0KICAgICAgICAkZ3JvdXBfaW5mbz0kdGhpcy0+Z3JvdXBfaW5mbygkZ3JvdXAsYXJyYXkoImNuIikpOw0KICAgICAgICBpZiAoJGdyb3VwX2luZm9bMF1bImRuIl09PT1OVUxMKXsgcmV0dXJuIChmYWxzZSk7IH0NCiAgICAgICAgJGdyb3VwX2RuPSRncm91cF9pbmZvWzBdWyJkbiJdOw0KICAgICAgICANCiAgICAgICAgJGFkZD1hcnJheSgpOw0KICAgICAgICAkYWRkWyJtZW1iZXIiXSA9ICR1c2VyX2RuOw0KICAgICAgICANCiAgICAgICAgJHJlc3VsdD1AbGRhcF9tb2RfYWRkKCR0aGlzLT5fY29ubiwkZ3JvdXBfZG4sJGFkZCk7DQogICAgICAgIGlmICgkcmVzdWx0PT1mYWxzZSl7IHJldHVybiAoZmFsc2UpOyB9DQogICAgICAgIHJldHVybiAodHJ1ZSk7DQogICAgfQ0KICAgIA0KICAgIC8qKg0KICAgICogQWRkIGEgY29udGFjdCB0byBhIGdyb3VwDQogICAgKiANCiAgICAqIEBwYXJhbSBzdHJpbmcgJGdyb3VwIFRoZSBncm91cCB0byBhZGQgdGhlIGNvbnRhY3QgdG8NCiAgICAqIEBwYXJhbSBzdHJpbmcgJGNvbnRhY3RfZG4gVGhlIEROIG9mIHRoZSBjb250YWN0IHRvIGFkZA0KICAgICogQHJldHVybiBib29sDQogICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gZ3JvdXBfYWRkX2NvbnRhY3QoJGdyb3VwLCRjb250YWN0X2RuKXsNCiAgICAgICAgLy8gVG8gYWRkIGEgY29udGFjdCB3ZSB0YWtlIHRoZSBjb250YWN0J3MgRE4NCiAgICAgICAgLy8gYW5kIGFkZCBpdCB1c2luZyB0aGUgZnVsbCBETiBvZiB0aGUgZ3JvdXANCiAgICAgICAgDQogICAgICAgIC8vIEZpbmQgdGhlIGdyb3VwJ3MgZG4NCiAgICAgICAgJGdyb3VwX2luZm89JHRoaXMtPmdyb3VwX2luZm8oJGdyb3VwLGFycmF5KCJjbiIpKTsNCiAgICAgICAgaWYgKCRncm91cF9pbmZvWzBdWyJkbiJdPT09TlVMTCl7IHJldHVybiAoZmFsc2UpOyB9DQogICAgICAgICRncm91cF9kbj0kZ3JvdXBfaW5mb1swXVsiZG4iXTsNCiAgICAgICAgDQogICAgICAgICRhZGQ9YXJyYXkoKTsNCiAgICAgICAgJGFkZFsibWVtYmVyIl0gPSAkY29udGFjdF9kbjsNCiAgICAgICAgDQogICAgICAgICRyZXN1bHQ9QGxkYXBfbW9kX2FkZCgkdGhpcy0+X2Nvbm4sJGdyb3VwX2RuLCRhZGQpOw0KICAgICAgICBpZiAoJHJlc3VsdD09ZmFsc2UpeyByZXR1cm4gKGZhbHNlKTsgfQ0KICAgICAgICByZXR1cm4gKHRydWUpOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICogQ3JlYXRlIGEgZ3JvdXANCiAgICAqIA0KICAgICogQHBhcmFtIGFycmF5ICRhdHRyaWJ1dGVzIERlZmF1bHQgYXR0cmlidXRlcyBvZiB0aGUgZ3JvdXANCiAgICAqIEByZXR1cm4gYm9vbA0KICAgICovDQogICAgcHVibGljIGZ1bmN0aW9uIGdyb3VwX2NyZWF0ZSgkYXR0cmlidXRlcyl7DQogICAgICAgIGlmICghaXNfYXJyYXkoJGF0dHJpYnV0ZXMpKXsgcmV0dXJuICgiQXR0cmlidXRlcyBtdXN0IGJlIGFuIGFycmF5Iik7IH0NCiAgICAgICAgaWYgKCFhcnJheV9rZXlfZXhpc3RzKCJncm91cF9uYW1lIiwkYXR0cmlidXRlcykpeyByZXR1cm4gKCJNaXNzaW5nIGNvbXB1bHNvcnkgZmllbGQgW2dyb3VwX25hbWVdIik7IH0NCiAgICAgICAgaWYgKCFhcnJheV9rZXlfZXhpc3RzKCJjb250YWluZXIiLCRhdHRyaWJ1dGVzKSl7IHJldHVybiAoIk1pc3NpbmcgY29tcHVsc29yeSBmaWVsZCBbY29udGFpbmVyXSIpOyB9DQogICAgICAgIGlmICghYXJyYXlfa2V5X2V4aXN0cygiZGVzY3JpcHRpb24iLCRhdHRyaWJ1dGVzKSl7IHJldHVybiAoIk1pc3NpbmcgY29tcHVsc29yeSBmaWVsZCBbZGVzY3JpcHRpb25dIik7IH0NCiAgICAgICAgaWYgKCFpc19hcnJheSgkYXR0cmlidXRlc1siY29udGFpbmVyIl0pKXsgcmV0dXJuICgiQ29udGFpbmVyIGF0dHJpYnV0ZSBtdXN0IGJlIGFuIGFycmF5LiIpOyB9DQogICAgICAgICRhdHRyaWJ1dGVzWyJjb250YWluZXIiXT1hcnJheV9yZXZlcnNlKCRhdHRyaWJ1dGVzWyJjb250YWluZXIiXSk7DQoNCiAgICAgICAgLy8kbWVtYmVyX2FycmF5ID0gYXJyYXkoKTsNCiAgICAgICAgLy8kbWVtYmVyX2FycmF5WzBdID0gImNuPXVzZXIxLGNuPVVzZXJzLGRjPXlvdXJkb21haW4sZGM9Y29tIjsNCiAgICAgICAgLy8kbWVtYmVyX2FycmF5WzFdID0gImNuPWFkbWluaXN0cmF0b3IsY249VXNlcnMsZGM9eW91cmRvbWFpbixkYz1jb20iOw0KICAgICAgICANCiAgICAgICAgJGFkZD1hcnJheSgpOw0KICAgICAgICAkYWRkWyJjbiJdID0gJGF0dHJpYnV0ZXNbImdyb3VwX25hbWUiXTsNCiAgICAgICAgJGFkZFsic2FtYWNjb3VudG5hbWUiXSA9ICRhdHRyaWJ1dGVzWyJncm91cF9uYW1lIl07DQogICAgICAgICRhZGRbIm9iamVjdENsYXNzIl0gPSAiR3JvdXAiOw0KICAgICAgICAkYWRkWyJkZXNjcmlwdGlvbiJdID0gJGF0dHJpYnV0ZXNbImRlc2NyaXB0aW9uIl07DQogICAgICAgIC8vJGFkZFsibWVtYmVyIl0gPSAkbWVtYmVyX2FycmF5OyBVTlRFU1RFRA0KDQogICAgICAgICRjb250YWluZXI9Ik9VPSIuaW1wbG9kZSgiLE9VPSIsJGF0dHJpYnV0ZXNbImNvbnRhaW5lciJdKTsNCiAgICAgICAgJHJlc3VsdD1sZGFwX2FkZCgkdGhpcy0+X2Nvbm4sIkNOPSIuJGFkZFsiY24iXS4iLCAiLiRjb250YWluZXIuIiwiLiR0aGlzLT5fYmFzZV9kbiwkYWRkKTsNCiAgICAgICAgaWYgKCRyZXN1bHQhPXRydWUpeyByZXR1cm4gKGZhbHNlKTsgfQ0KICAgICAgICANCiAgICAgICAgcmV0dXJuICh0cnVlKTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAqIFJlbW92ZSBhIGdyb3VwIGZyb20gYSBncm91cA0KICAgICogDQogICAgKiBAcGFyYW0gc3RyaW5nICRwYXJlbnQgVGhlIHBhcmVudCBncm91cCBuYW1lDQogICAgKiBAcGFyYW0gc3RyaW5nICRjaGlsZCBUaGUgY2hpbGQgZ3JvdXAgbmFtZQ0KICAgICogQHJldHVybiBib29sDQogICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gZ3JvdXBfZGVsX2dyb3VwKCRwYXJlbnQsJGNoaWxkKXsNCiAgICANCiAgICAgICAgLy8gRmluZCB0aGUgcGFyZW50IGRuDQogICAgICAgICRwYXJlbnRfZ3JvdXA9JHRoaXMtPmdyb3VwX2luZm8oJHBhcmVudCxhcnJheSgiY24iKSk7DQogICAgICAgIGlmICgkcGFyZW50X2dyb3VwWzBdWyJkbiJdPT09TlVMTCl7IHJldHVybiAoZmFsc2UpOyB9DQogICAgICAgICRwYXJlbnRfZG49JHBhcmVudF9ncm91cFswXVsiZG4iXTsNCiAgICAgICAgDQogICAgICAgIC8vIEZpbmQgdGhlIGNoaWxkIGRuDQogICAgICAgICRjaGlsZF9ncm91cD0kdGhpcy0+Z3JvdXBfaW5mbygkY2hpbGQsYXJyYXkoImNuIikpOw0KICAgICAgICBpZiAoJGNoaWxkX2dyb3VwWzBdWyJkbiJdPT09TlVMTCl7IHJldHVybiAoZmFsc2UpOyB9DQogICAgICAgICRjaGlsZF9kbj0kY2hpbGRfZ3JvdXBbMF1bImRuIl07DQogICAgICAgIA0KICAgICAgICAkZGVsPWFycmF5KCk7DQogICAgICAgICRkZWxbIm1lbWJlciJdID0gJGNoaWxkX2RuOw0KICAgICAgICANCiAgICAgICAgJHJlc3VsdD1AbGRhcF9tb2RfZGVsKCR0aGlzLT5fY29ubiwkcGFyZW50X2RuLCRkZWwpOw0KICAgICAgICBpZiAoJHJlc3VsdD09ZmFsc2UpeyByZXR1cm4gKGZhbHNlKTsgfQ0KICAgICAgICByZXR1cm4gKHRydWUpOw0KICAgIH0NCiAgICANCiAgICAvKioNCiAgICAqIFJlbW92ZSBhIHVzZXIgZnJvbSBhIGdyb3VwDQogICAgKiANCiAgICAqIEBwYXJhbSBzdHJpbmcgJGdyb3VwIFRoZSBncm91cCB0byByZW1vdmUgYSB1c2VyIGZyb20NCiAgICAqIEBwYXJhbSBzdHJpbmcgJHVzZXIgVGhlIEFEIHVzZXIgdG8gcmVtb3ZlIGZyb20gdGhlIGdyb3VwDQogICAgKiBAcGFyYW0gYm9vbCAkaXNHVUlEIElzIHRoZSB1c2VybmFtZSBwYXNzZWQgYSBHVUlEIG9yIGEgc2FtQWNjb3VudE5hbWUNCiAgICAqIEByZXR1cm4gYm9vbA0KICAgICovDQogICAgcHVibGljIGZ1bmN0aW9uIGdyb3VwX2RlbF91c2VyKCRncm91cCwkdXNlciwkaXNHVUlEPWZhbHNlKXsNCiAgICANCiAgICAgICAgLy8gRmluZCB0aGUgcGFyZW50IGRuDQogICAgICAgICRncm91cF9pbmZvPSR0aGlzLT5ncm91cF9pbmZvKCRncm91cCxhcnJheSgiY24iKSk7DQogICAgICAgIGlmICgkZ3JvdXBfaW5mb1swXVsiZG4iXT09PU5VTEwpeyByZXR1cm4gKGZhbHNlKTsgfQ0KICAgICAgICAkZ3JvdXBfZG49JGdyb3VwX2luZm9bMF1bImRuIl07DQogICAgICAgIA0KICAgICAgICAvLyBGaW5kIHRoZSB1c2VycyBkbg0KICAgICAgICAkdXNlcl9kbj0kdGhpcy0+dXNlcl9kbigkdXNlciwkaXNHVUlEKTsNCiAgICAgICAgaWYgKCR1c2VyX2RuPT09ZmFsc2UpeyByZXR1cm4gKGZhbHNlKTsgfQ0KDQogICAgICAgICRkZWw9YXJyYXkoKTsNCiAgICAgICAgJGRlbFsibWVtYmVyIl0gPSAkdXNlcl9kbjsNCiAgICAgICAgDQogICAgICAgICRyZXN1bHQ9QGxkYXBfbW9kX2RlbCgkdGhpcy0+X2Nvbm4sJGdyb3VwX2RuLCRkZWwpOw0KICAgICAgICBpZiAoJHJlc3VsdD09ZmFsc2UpeyByZXR1cm4gKGZhbHNlKTsgfQ0KICAgICAgICByZXR1cm4gKHRydWUpOw0KICAgIH0NCiAgICANCiAgICAvKioNCiAgICAqIFJlbW92ZSBhIGNvbnRhY3QgZnJvbSBhIGdyb3VwDQogICAgKiANCiAgICAqIEBwYXJhbSBzdHJpbmcgJGdyb3VwIFRoZSBncm91cCB0byByZW1vdmUgYSB1c2VyIGZyb20NCiAgICAqIEBwYXJhbSBzdHJpbmcgJGNvbnRhY3RfZG4gVGhlIEROIG9mIGEgY29udGFjdCB0byByZW1vdmUgZnJvbSB0aGUgZ3JvdXANCiAgICAqIEByZXR1cm4gYm9vbA0KICAgICovDQogICAgcHVibGljIGZ1bmN0aW9uIGdyb3VwX2RlbF9jb250YWN0KCRncm91cCwkY29udGFjdF9kbil7DQogICAgDQogICAgICAgIC8vIEZpbmQgdGhlIHBhcmVudCBkbg0KICAgICAgICAkZ3JvdXBfaW5mbz0kdGhpcy0+Z3JvdXBfaW5mbygkZ3JvdXAsYXJyYXkoImNuIikpOw0KICAgICAgICBpZiAoJGdyb3VwX2luZm9bMF1bImRuIl09PT1OVUxMKXsgcmV0dXJuIChmYWxzZSk7IH0NCiAgICAgICAgJGdyb3VwX2RuPSRncm91cF9pbmZvWzBdWyJkbiJdOw0KICAgIA0KICAgICAgICAkZGVsPWFycmF5KCk7DQogICAgICAgICRkZWxbIm1lbWJlciJdID0gJGNvbnRhY3RfZG47DQogICAgICAgIA0KICAgICAgICAkcmVzdWx0PUBsZGFwX21vZF9kZWwoJHRoaXMtPl9jb25uLCRncm91cF9kbiwkZGVsKTsNCiAgICAgICAgaWYgKCRyZXN1bHQ9PWZhbHNlKXsgcmV0dXJuIChmYWxzZSk7IH0NCiAgICAgICAgcmV0dXJuICh0cnVlKTsNCiAgICB9DQogICAgDQogICAgLyoqDQogICAgKiBSZXR1cm4gYSBsaXN0IG9mIGdyb3VwcyBpbiBhIGdyb3VwDQogICAgKiANCiAgICAqIEBwYXJhbSBzdHJpbmcgJGdyb3VwIFRoZSBncm91cCB0byBxdWVyeQ0KICAgICogQHBhcmFtIGJvb2wgJHJlY3Vyc2l2ZSBSZWN1cnNpdmVseSBnZXQgZ3JvdXBzDQogICAgKiBAcmV0dXJuIGFycmF5DQogICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gZ3JvdXBzX2luX2dyb3VwKCRncm91cCwgJHJlY3Vyc2l2ZSA9IE5VTEwpew0KICAgICAgICBpZiAoISR0aGlzLT5fYmluZCl7IHJldHVybiAoZmFsc2UpOyB9DQogICAgICAgIGlmICgkcmVjdXJzaXZlPT09TlVMTCl7ICRyZWN1cnNpdmU9JHRoaXMtPl9yZWN1cnNpdmVfZ3JvdXBzOyB9IC8vIFVzZSB0aGUgZGVmYXVsdCBvcHRpb24gaWYgdGhleSBoYXZlbid0IHNldCBpdCANCiAgICAgICAgDQogICAgICAgIC8vIFNlYXJjaCB0aGUgZGlyZWN0b3J5IGZvciB0aGUgbWVtYmVycyBvZiBhIGdyb3VwDQogICAgICAgICRpbmZvPSR0aGlzLT5ncm91cF9pbmZvKCRncm91cCxhcnJheSgibWVtYmVyIiwiY24iKSk7DQogICAgICAgICRncm91cHM9JGluZm9bMF1bIm1lbWJlciJdOw0KICAgICAgICBpZiAoIWlzX2FycmF5KCRncm91cHMpKSB7DQogICAgICAgICAgICByZXR1cm4gKGZhbHNlKTsgICANCiAgICAgICAgfQ0KIA0KICAgICAgICAkZ3JvdXBfYXJyYXk9YXJyYXkoKTsNCg0KICAgICAgICBmb3IgKCRpPTA7ICRpPCRncm91cHNbImNvdW50Il07ICRpKyspeyANCiAgICAgICAgICAgICAkZmlsdGVyPSIoJihvYmplY3RDYXRlZ29yeT1ncm91cCkoZGlzdGluZ3Vpc2hlZE5hbWU9Ii4kdGhpcy0+bGRhcF9zbGFzaGVzKCRncm91cHNbJGldKS4iKSkiOw0KICAgICAgICAgICAgICRmaWVsZHMgPSBhcnJheSgic2FtYWNjb3VudG5hbWUiLCAiZGlzdGluZ3Vpc2hlZG5hbWUiLCAib2JqZWN0Q2xhc3MiKTsNCiAgICAgICAgICAgICAkc3I9bGRhcF9zZWFyY2goJHRoaXMtPl9jb25uLCR0aGlzLT5fYmFzZV9kbiwkZmlsdGVyLCRmaWVsZHMpOw0KICAgICAgICAgICAgICRlbnRyaWVzID0gbGRhcF9nZXRfZW50cmllcygkdGhpcy0+X2Nvbm4sICRzcik7DQoNCiAgICAgICAgICAgICAvLyBub3QgYSBwZXJzb24sIGxvb2sgZm9yIGEgZ3JvdXAgIA0KICAgICAgICAgICAgIGlmICgkZW50cmllc1snY291bnQnXSA9PSAwICYmICRyZWN1cnNpdmUgPT0gdHJ1ZSkgeyAgDQogICAgICAgICAgICAgICAgJGZpbHRlcj0iKCYob2JqZWN0Q2F0ZWdvcnk9Z3JvdXApKGRpc3Rpbmd1aXNoZWROYW1lPSIuJHRoaXMtPmxkYXBfc2xhc2hlcygkZ3JvdXBzWyRpXSkuIikpIjsgIA0KICAgICAgICAgICAgICAgICRmaWVsZHMgPSBhcnJheSgiZGlzdGluZ3Vpc2hlZG5hbWUiKTsgIA0KICAgICAgICAgICAgICAgICRzcj1sZGFwX3NlYXJjaCgkdGhpcy0+X2Nvbm4sJHRoaXMtPl9iYXNlX2RuLCRmaWx0ZXIsJGZpZWxkcyk7ICANCiAgICAgICAgICAgICAgICAkZW50cmllcyA9IGxkYXBfZ2V0X2VudHJpZXMoJHRoaXMtPl9jb25uLCAkc3IpOyAgDQogICAgICAgICAgICAgICAgaWYgKCFpc3NldCgkZW50cmllc1swXVsnZGlzdGluZ3Vpc2hlZG5hbWUnXVswXSkpIHsNCiAgICAgICAgICAgICAgICAgICAgY29udGludWU7ICANCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgJHN1Yl9ncm91cHMgPSAkdGhpcy0+Z3JvdXBzX2luX2dyb3VwKCRlbnRyaWVzWzBdWydkaXN0aW5ndWlzaGVkbmFtZSddWzBdLCAkcmVjdXJzaXZlKTsgIA0KICAgICAgICAgICAgICAgIGlmIChpc19hcnJheSgkc3ViX2dyb3VwcykpIHsNCiAgICAgICAgICAgICAgICAgICAgJGdyb3VwX2FycmF5ID0gYXJyYXlfbWVyZ2UoJGdyb3VwX2FycmF5LCAkc3ViX2dyb3Vwcyk7IA0KICAgICAgICAgICAgICAgICAgICAkZ3JvdXBfYXJyYXkgPSBhcnJheV91bmlxdWUoJGdyb3VwX2FycmF5KTsgIA0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBjb250aW51ZTsgIA0KICAgICAgICAgICAgIH0gDQoNCiAgICAgICAgICAgICAkZ3JvdXBfYXJyYXlbXSA9ICRlbnRyaWVzWzBdWydkaXN0aW5ndWlzaGVkbmFtZSddWzBdOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiAoJGdyb3VwX2FycmF5KTsNCiAgICB9DQogICAgDQogICAgLyoqDQogICAgKiBSZXR1cm4gYSBsaXN0IG9mIG1lbWJlcnMgaW4gYSBncm91cA0KICAgICogDQogICAgKiBAcGFyYW0gc3RyaW5nICRncm91cCBUaGUgZ3JvdXAgdG8gcXVlcnkNCiAgICAqIEBwYXJhbSBib29sICRyZWN1cnNpdmUgUmVjdXJzaXZlbHkgZ2V0IGdyb3VwIG1lbWJlcnMNCiAgICAqIEByZXR1cm4gYXJyYXkNCiAgICAqLw0KICAgIHB1YmxpYyBmdW5jdGlvbiBncm91cF9tZW1iZXJzKCRncm91cCwgJHJlY3Vyc2l2ZSA9IE5VTEwpew0KICAgICAgICBpZiAoISR0aGlzLT5fYmluZCl7IHJldHVybiAoZmFsc2UpOyB9DQogICAgICAgIGlmICgkcmVjdXJzaXZlPT09TlVMTCl7ICRyZWN1cnNpdmU9JHRoaXMtPl9yZWN1cnNpdmVfZ3JvdXBzOyB9IC8vIFVzZSB0aGUgZGVmYXVsdCBvcHRpb24gaWYgdGhleSBoYXZlbid0IHNldCBpdCANCiAgICAgICAgLy8gU2VhcmNoIHRoZSBkaXJlY3RvcnkgZm9yIHRoZSBtZW1iZXJzIG9mIGEgZ3JvdXANCiAgICAgICAgJGluZm89JHRoaXMtPmdyb3VwX2luZm8oJGdyb3VwLGFycmF5KCJtZW1iZXIiLCJjbiIpKTsNCiAgICAgICAgJHVzZXJzPSRpbmZvWzBdWyJtZW1iZXIiXTsNCiAgICAgICAgaWYgKCFpc19hcnJheSgkdXNlcnMpKSB7DQogICAgICAgICAgICByZXR1cm4gKGZhbHNlKTsgICANCiAgICAgICAgfQ0KIA0KICAgICAgICAkdXNlcl9hcnJheT1hcnJheSgpOw0KDQogICAgICAgIGZvciAoJGk9MDsgJGk8JHVzZXJzWyJjb3VudCJdOyAkaSsrKXsgDQogICAgICAgICAgICAgJGZpbHRlcj0iKCYob2JqZWN0Q2F0ZWdvcnk9cGVyc29uKShkaXN0aW5ndWlzaGVkTmFtZT0iLiR0aGlzLT5sZGFwX3NsYXNoZXMoJHVzZXJzWyRpXSkuIikpIjsNCiAgICAgICAgICAgICAkZmllbGRzID0gYXJyYXkoInNhbWFjY291bnRuYW1lIiwgImRpc3Rpbmd1aXNoZWRuYW1lIiwgIm9iamVjdENsYXNzIik7DQogICAgICAgICAgICAgJHNyPWxkYXBfc2VhcmNoKCR0aGlzLT5fY29ubiwkdGhpcy0+X2Jhc2VfZG4sJGZpbHRlciwkZmllbGRzKTsNCiAgICAgICAgICAgICAkZW50cmllcyA9IGxkYXBfZ2V0X2VudHJpZXMoJHRoaXMtPl9jb25uLCAkc3IpOw0KDQogICAgICAgICAgICAgLy8gbm90IGEgcGVyc29uLCBsb29rIGZvciBhIGdyb3VwICANCiAgICAgICAgICAgICBpZiAoJGVudHJpZXNbJ2NvdW50J10gPT0gMCAmJiAkcmVjdXJzaXZlID09IHRydWUpIHsgIA0KICAgICAgICAgICAgICAgICRmaWx0ZXI9IigmKG9iamVjdENhdGVnb3J5PWdyb3VwKShkaXN0aW5ndWlzaGVkTmFtZT0iLiR0aGlzLT5sZGFwX3NsYXNoZXMoJHVzZXJzWyRpXSkuIikpIjsgIA0KICAgICAgICAgICAgICAgICRmaWVsZHMgPSBhcnJheSgic2FtYWNjb3VudG5hbWUiKTsgIA0KICAgICAgICAgICAgICAgICRzcj1sZGFwX3NlYXJjaCgkdGhpcy0+X2Nvbm4sJHRoaXMtPl9iYXNlX2RuLCRmaWx0ZXIsJGZpZWxkcyk7ICANCiAgICAgICAgICAgICAgICAkZW50cmllcyA9IGxkYXBfZ2V0X2VudHJpZXMoJHRoaXMtPl9jb25uLCAkc3IpOyAgDQogICAgICAgICAgICAgICAgaWYgKCFpc3NldCgkZW50cmllc1swXVsnc2FtYWNjb3VudG5hbWUnXVswXSkpIHsNCiAgICAgICAgICAgICAgICAgICAgY29udGludWU7ICANCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgJHN1Yl91c2VycyA9ICR0aGlzLT5ncm91cF9tZW1iZXJzKCRlbnRyaWVzWzBdWydzYW1hY2NvdW50bmFtZSddWzBdLCAkcmVjdXJzaXZlKTsgIA0KICAgICAgICAgICAgICAgIGlmIChpc19hcnJheSgkc3ViX3VzZXJzKSkgew0KICAgICAgICAgICAgICAgICAgICAkdXNlcl9hcnJheSA9IGFycmF5X21lcmdlKCR1c2VyX2FycmF5LCAkc3ViX3VzZXJzKTsgDQogICAgICAgICAgICAgICAgICAgICR1c2VyX2FycmF5ID0gYXJyYXlfdW5pcXVlKCR1c2VyX2FycmF5KTsgIA0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBjb250aW51ZTsgIA0KICAgICAgICAgICAgIH0gDQoNCiAgICAgICAgICAgICBpZiAoJGVudHJpZXNbMF1bJ3NhbWFjY291bnRuYW1lJ11bMF0gPT09IE5VTEwgJiYgJGVudHJpZXNbMF1bJ2Rpc3Rpbmd1aXNoZWRuYW1lJ11bMF0gIT09IE5VTEwpIHsNCiAgICAgICAgICAgICAgICAgJHVzZXJfYXJyYXlbXSA9ICRlbnRyaWVzWzBdWydkaXN0aW5ndWlzaGVkbmFtZSddWzBdOw0KICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICBlbHNlaWYgKCRlbnRyaWVzWzBdWydzYW1hY2NvdW50bmFtZSddWzBdICE9PSBOVUxMKSB7DQogICAgICAgICAgICAgICAgJHVzZXJfYXJyYXlbXSA9ICRlbnRyaWVzWzBdWydzYW1hY2NvdW50bmFtZSddWzBdOw0KICAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gKCR1c2VyX2FycmF5KTsNCiAgICB9DQogICAgDQogICAgLyoqDQogICAgKiBHcm91cCBJbmZvcm1hdGlvbi4gIFJldHVybnMgYW4gYXJyYXkgb2YgaW5mb3JtYXRpb24gYWJvdXQgYSBncm91cC4NCiAgICAqIFRoZSBncm91cCBuYW1lIGlzIGNhc2Ugc2Vuc2l0aXZlDQogICAgKiANCiAgICAqIEBwYXJhbSBzdHJpbmcgJGdyb3VwX25hbWUgVGhlIGdyb3VwIG5hbWUgdG8gcmV0cmlldmUgaW5mbyBhYm91dA0KICAgICogQHBhcmFtIGFycmF5ICRmaWVsZHMgRmllbGRzIHRvIHJldHJpZXZlDQogICAgKiBAcmV0dXJuIGFycmF5DQogICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gZ3JvdXBfaW5mbygkZ3JvdXBfbmFtZSwkZmllbGRzPU5VTEwpew0KICAgICAgICBpZiAoJGdyb3VwX25hbWU9PT1OVUxMKXsgcmV0dXJuIChmYWxzZSk7IH0NCiAgICAgICAgaWYgKCEkdGhpcy0+X2JpbmQpeyByZXR1cm4gKGZhbHNlKTsgfQ0KICAgICAgICANCiAgICAgICAgaWYgKHN0cmlzdHIoJGdyb3VwX25hbWUsICcrJykpIHsNCiAgICAgICAgICAgICRncm91cF9uYW1lPXN0cmlwc2xhc2hlcygkZ3JvdXBfbmFtZSk7ICAgDQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgICRmaWx0ZXI9IigmKG9iamVjdENhdGVnb3J5PWdyb3VwKShuYW1lPSIuJHRoaXMtPmxkYXBfc2xhc2hlcygkZ3JvdXBfbmFtZSkuIikpIjsNCiAgICAgICAgLy9lY2hvICgkZmlsdGVyLiIhISE8YnI+Iik7DQogICAgICAgIGlmICgkZmllbGRzPT09TlVMTCl7ICRmaWVsZHM9YXJyYXkoIm1lbWJlciIsIm1lbWJlcm9mIiwiY24iLCJkZXNjcmlwdGlvbiIsImRpc3Rpbmd1aXNoZWRuYW1lIiwib2JqZWN0Y2F0ZWdvcnkiLCJzYW1hY2NvdW50bmFtZSIpOyB9DQogICAgICAgICRzcj1sZGFwX3NlYXJjaCgkdGhpcy0+X2Nvbm4sJHRoaXMtPl9iYXNlX2RuLCRmaWx0ZXIsJGZpZWxkcyk7DQogICAgICAgICRlbnRyaWVzID0gbGRhcF9nZXRfZW50cmllcygkdGhpcy0+X2Nvbm4sICRzcik7DQogICAgICAgIC8vcHJpbnRfcigkZW50cmllcyk7DQogICAgICAgIHJldHVybiAoJGVudHJpZXMpOw0KICAgIH0NCiAgICANCiAgICAvKioNCiAgICAqIFJldHVybiBhIGNvbXBsZXRlIGxpc3Qgb2YgImdyb3VwcyBpbiBncm91cHMiDQogICAgKiANCiAgICAqIEBwYXJhbSBzdHJpbmcgJGdyb3VwIFRoZSBncm91cCB0byBnZXQgdGhlIGxpc3QgZnJvbQ0KICAgICogQHJldHVybiBhcnJheQ0KICAgICovDQogICAgcHVibGljIGZ1bmN0aW9uIHJlY3Vyc2l2ZV9ncm91cHMoJGdyb3VwKXsNCiAgICAgICAgaWYgKCRncm91cD09PU5VTEwpeyByZXR1cm4gKGZhbHNlKTsgfQ0KDQogICAgICAgICRyZXRfZ3JvdXBzPWFycmF5KCk7DQogICAgICAgIA0KICAgICAgICAkZ3JvdXBzPSR0aGlzLT5ncm91cF9pbmZvKCRncm91cCxhcnJheSgibWVtYmVyb2YiKSk7DQogICAgICAgIGlmIChpc19hcnJheSgkZ3JvdXBzWzBdWyJtZW1iZXJvZiJdKSkgew0KICAgICAgICAgICAgJGdyb3Vwcz0kZ3JvdXBzWzBdWyJtZW1iZXJvZiJdOw0KDQogICAgICAgICAgICBpZiAoJGdyb3Vwcyl7DQogICAgICAgICAgICAgICAgJGdyb3VwX25hbWVzPSR0aGlzLT5uaWNlX25hbWVzKCRncm91cHMpOw0KICAgICAgICAgICAgICAgICRyZXRfZ3JvdXBzPWFycmF5X21lcmdlKCRyZXRfZ3JvdXBzLCRncm91cF9uYW1lcyk7IC8vZmluYWwgZ3JvdXBzIHRvIHJldHVybg0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRncm91cF9uYW1lcyBhcyAkaWQgPT4gJGdyb3VwX25hbWUpew0KICAgICAgICAgICAgICAgICAgICAkY2hpbGRfZ3JvdXBzPSR0aGlzLT5yZWN1cnNpdmVfZ3JvdXBzKCRncm91cF9uYW1lKTsNCiAgICAgICAgICAgICAgICAgICAgJHJldF9ncm91cHM9YXJyYXlfbWVyZ2UoJHJldF9ncm91cHMsJGNoaWxkX2dyb3Vwcyk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuICgkcmV0X2dyb3Vwcyk7DQogICAgfQ0KICAgIA0KICAgIC8qKg0KICAgICogUmV0dXJucyBhIGNvbXBsZXRlIGxpc3Qgb2YgdGhlIGdyb3VwcyBpbiBBRCBiYXNlZCBvbiBhIFNBTSBBY2NvdW50IFR5cGUgIA0KICAgICogDQogICAgKiBAcGFyYW0gc3RyaW5nICRzYW1hY2NvdW50dHlwZSBUaGUgYWNjb3VudCB0eXBlIHRvIHJldHVybg0KICAgICogQHBhcmFtIGJvb2wgJGluY2x1ZGVfZGVzYyBXaGV0aGVyIHRvIHJldHVybiBhIGRlc2NyaXB0aW9uDQogICAgKiBAcGFyYW0gc3RyaW5nICRzZWFyY2ggU2VhcmNoIHBhcmFtZXRlcnMNCiAgICAqIEBwYXJhbSBib29sICRzb3J0ZWQgV2hldGhlciB0byBzb3J0IHRoZSByZXN1bHRzDQogICAgKiBAcmV0dXJuIGFycmF5DQogICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gc2VhcmNoX2dyb3Vwcygkc2FtYWNjb3VudHR5cGUgPSBBRExEQVBfU0VDVVJJVFlfR0xPQkFMX0dST1VQLCAkaW5jbHVkZV9kZXNjID0gZmFsc2UsICRzZWFyY2ggPSAiKiIsICRzb3J0ZWQgPSB0cnVlKSB7DQogICAgICAgIGlmICghJHRoaXMtPl9iaW5kKXsgcmV0dXJuIChmYWxzZSk7IH0NCiAgICAgICAgDQogICAgICAgICRmaWx0ZXIgPSAnKCYob2JqZWN0Q2F0ZWdvcnk9Z3JvdXApJzsNCiAgICAgICAgaWYgKCRzYW1hY2NvdW50dHlwZSAhPT0gbnVsbCkgew0KICAgICAgICAgICAgJGZpbHRlciAuPSAnKHNhbWFjY291bnR0eXBlPScuICRzYW1hY2NvdW50dHlwZSAuJyknOw0KICAgICAgICB9DQogICAgICAgICRmaWx0ZXIgLj0gJyhjbj0nLiRzZWFyY2guJykpJzsNCiAgICAgICAgLy8gUGVyZm9ybSB0aGUgc2VhcmNoIGFuZCBncmFiIGFsbCB0aGVpciBkZXRhaWxzDQogICAgICAgICRmaWVsZHM9YXJyYXkoInNhbWFjY291bnRuYW1lIiwiZGVzY3JpcHRpb24iKTsNCiAgICAgICAgJHNyPWxkYXBfc2VhcmNoKCR0aGlzLT5fY29ubiwkdGhpcy0+X2Jhc2VfZG4sJGZpbHRlciwkZmllbGRzKTsNCiAgICAgICAgJGVudHJpZXMgPSBsZGFwX2dldF9lbnRyaWVzKCR0aGlzLT5fY29ubiwgJHNyKTsNCg0KICAgICAgICAkZ3JvdXBzX2FycmF5ID0gYXJyYXkoKTsgICAgICAgIA0KICAgICAgICBmb3IgKCRpPTA7ICRpPCRlbnRyaWVzWyJjb3VudCJdOyAkaSsrKXsNCiAgICAgICAgICAgIGlmICgkaW5jbHVkZV9kZXNjICYmIHN0cmxlbigkZW50cmllc1skaV1bImRlc2NyaXB0aW9uIl1bMF0pID4gMCApew0KICAgICAgICAgICAgICAgICRncm91cHNfYXJyYXlbICRlbnRyaWVzWyRpXVsic2FtYWNjb3VudG5hbWUiXVswXSBdID0gJGVudHJpZXNbJGldWyJkZXNjcmlwdGlvbiJdWzBdOw0KICAgICAgICAgICAgfSBlbHNlaWYgKCRpbmNsdWRlX2Rlc2Mpew0KICAgICAgICAgICAgICAgICRncm91cHNfYXJyYXlbICRlbnRyaWVzWyRpXVsic2FtYWNjb3VudG5hbWUiXVswXSBdID0gJGVudHJpZXNbJGldWyJzYW1hY2NvdW50bmFtZSJdWzBdOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBhcnJheV9wdXNoKCRncm91cHNfYXJyYXksICRlbnRyaWVzWyRpXVsic2FtYWNjb3VudG5hbWUiXVswXSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgaWYoICRzb3J0ZWQgKXsgYXNvcnQoJGdyb3Vwc19hcnJheSk7IH0NCiAgICAgICAgcmV0dXJuICgkZ3JvdXBzX2FycmF5KTsNCiAgICB9DQogICAgDQogICAgLyoqDQogICAgKiBSZXR1cm5zIGEgY29tcGxldGUgbGlzdCBvZiBhbGwgZ3JvdXBzIGluIEFEDQogICAgKiANCiAgICAqIEBwYXJhbSBib29sICRpbmNsdWRlX2Rlc2MgV2hldGhlciB0byByZXR1cm4gYSBkZXNjcmlwdGlvbg0KICAgICogQHBhcmFtIHN0cmluZyAkc2VhcmNoIFNlYXJjaCBwYXJhbWV0ZXJzDQogICAgKiBAcGFyYW0gYm9vbCAkc29ydGVkIFdoZXRoZXIgdG8gc29ydCB0aGUgcmVzdWx0cw0KICAgICogQHJldHVybiBhcnJheQ0KICAgICovDQogICAgcHVibGljIGZ1bmN0aW9uIGFsbF9ncm91cHMoJGluY2x1ZGVfZGVzYyA9IGZhbHNlLCAkc2VhcmNoID0gIioiLCAkc29ydGVkID0gdHJ1ZSl7DQogICAgICAgICRncm91cHNfYXJyYXkgPSAkdGhpcy0+c2VhcmNoX2dyb3VwcyhudWxsLCAkaW5jbHVkZV9kZXNjLCAkc2VhcmNoLCAkc29ydGVkKTsNCiAgICAgICAgcmV0dXJuICgkZ3JvdXBzX2FycmF5KTsNCiAgICB9DQogICAgDQogICAgLyoqDQogICAgKiBSZXR1cm5zIGEgY29tcGxldGUgbGlzdCBvZiBzZWN1cml0eSBncm91cHMgaW4gQUQNCiAgICAqIA0KICAgICogQHBhcmFtIGJvb2wgJGluY2x1ZGVfZGVzYyBXaGV0aGVyIHRvIHJldHVybiBhIGRlc2NyaXB0aW9uDQogICAgKiBAcGFyYW0gc3RyaW5nICRzZWFyY2ggU2VhcmNoIHBhcmFtZXRlcnMNCiAgICAqIEBwYXJhbSBib29sICRzb3J0ZWQgV2hldGhlciB0byBzb3J0IHRoZSByZXN1bHRzDQogICAgKiBAcmV0dXJuIGFycmF5DQogICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gYWxsX3NlY3VyaXR5X2dyb3VwcygkaW5jbHVkZV9kZXNjID0gZmFsc2UsICRzZWFyY2ggPSAiKiIsICRzb3J0ZWQgPSB0cnVlKXsNCiAgICAgICAgJGdyb3Vwc19hcnJheSA9ICR0aGlzLT5zZWFyY2hfZ3JvdXBzKEFETERBUF9TRUNVUklUWV9HTE9CQUxfR1JPVVAsICRpbmNsdWRlX2Rlc2MsICRzZWFyY2gsICRzb3J0ZWQpOw0KICAgICAgICByZXR1cm4gKCRncm91cHNfYXJyYXkpOw0KICAgIH0NCiAgICANCiAgICAvKioNCiAgICAqIFJldHVybnMgYSBjb21wbGV0ZSBsaXN0IG9mIGRpc3RyaWJ1dGlvbiBsaXN0cyBpbiBBRA0KICAgICogDQogICAgKiBAcGFyYW0gYm9vbCAkaW5jbHVkZV9kZXNjIFdoZXRoZXIgdG8gcmV0dXJuIGEgZGVzY3JpcHRpb24NCiAgICAqIEBwYXJhbSBzdHJpbmcgJHNlYXJjaCBTZWFyY2ggcGFyYW1ldGVycw0KICAgICogQHBhcmFtIGJvb2wgJHNvcnRlZCBXaGV0aGVyIHRvIHNvcnQgdGhlIHJlc3VsdHMNCiAgICAqIEByZXR1cm4gYXJyYXkNCiAgICAqLw0KICAgIHB1YmxpYyBmdW5jdGlvbiBhbGxfZGlzdHJpYnV0aW9uX2dyb3VwcygkaW5jbHVkZV9kZXNjID0gZmFsc2UsICRzZWFyY2ggPSAiKiIsICRzb3J0ZWQgPSB0cnVlKXsNCiAgICAgICAgJGdyb3Vwc19hcnJheSA9ICR0aGlzLT5zZWFyY2hfZ3JvdXBzKEFETERBUF9ESVNUUklCVVRJT05fR1JPVVAsICRpbmNsdWRlX2Rlc2MsICRzZWFyY2gsICRzb3J0ZWQpOw0KICAgICAgICByZXR1cm4gKCRncm91cHNfYXJyYXkpOw0KICAgIH0NCiAgICANCiAgICAvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogICAgLy8gVVNFUiBGVU5DVElPTlMNCg0KICAgIC8qKg0KICAgICogQ3JlYXRlIGEgdXNlcg0KICAgICogDQogICAgKiBJZiB5b3Ugc3BlY2lmeSBhIHBhc3N3b3JkIGhlcmUsIHRoaXMgY2FuIG9ubHkgYmUgcGVyZm9ybWVkIG92ZXIgU1NMDQogICAgKiANCiAgICAqIEBwYXJhbSBhcnJheSAkYXR0cmlidXRlcyBUaGUgYXR0cmlidXRlcyB0byBzZXQgdG8gdGhlIHVzZXIgYWNjb3VudA0KICAgICogQHJldHVybiBib29sDQogICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gdXNlcl9jcmVhdGUoJGF0dHJpYnV0ZXMpew0KICAgICAgICAvLyBDaGVjayBmb3IgY29tcHVsc29yeSBmaWVsZHMNCiAgICAgICAgaWYgKCFhcnJheV9rZXlfZXhpc3RzKCJ1c2VybmFtZSIsJGF0dHJpYnV0ZXMpKXsgcmV0dXJuICgiTWlzc2luZyBjb21wdWxzb3J5IGZpZWxkIFt1c2VybmFtZV0iKTsgfQ0KICAgICAgICBpZiAoIWFycmF5X2tleV9leGlzdHMoImZpcnN0bmFtZSIsJGF0dHJpYnV0ZXMpKXsgcmV0dXJuICgiTWlzc2luZyBjb21wdWxzb3J5IGZpZWxkIFtmaXJzdG5hbWVdIik7IH0NCiAgICAgICAgaWYgKCFhcnJheV9rZXlfZXhpc3RzKCJzdXJuYW1lIiwkYXR0cmlidXRlcykpeyByZXR1cm4gKCJNaXNzaW5nIGNvbXB1bHNvcnkgZmllbGQgW3N1cm5hbWVdIik7IH0NCiAgICAgICAgaWYgKCFhcnJheV9rZXlfZXhpc3RzKCJlbWFpbCIsJGF0dHJpYnV0ZXMpKXsgcmV0dXJuICgiTWlzc2luZyBjb21wdWxzb3J5IGZpZWxkIFtlbWFpbF0iKTsgfQ0KICAgICAgICBpZiAoIWFycmF5X2tleV9leGlzdHMoImNvbnRhaW5lciIsJGF0dHJpYnV0ZXMpKXsgcmV0dXJuICgiTWlzc2luZyBjb21wdWxzb3J5IGZpZWxkIFtjb250YWluZXJdIik7IH0NCiAgICAgICAgaWYgKCFpc19hcnJheSgkYXR0cmlidXRlc1siY29udGFpbmVyIl0pKXsgcmV0dXJuICgiQ29udGFpbmVyIGF0dHJpYnV0ZSBtdXN0IGJlIGFuIGFycmF5LiIpOyB9DQoNCiAgICAgICAgaWYgKGFycmF5X2tleV9leGlzdHMoInBhc3N3b3JkIiwkYXR0cmlidXRlcykgJiYgKCEkdGhpcy0+X3VzZV9zc2wgJiYgISR0aGlzLT5fdXNlX3RscykpeyANCiAgICAgICAgICAgIHRocm93IG5ldyBhZExEQVBFeGNlcHRpb24oJ1NTTCBtdXN0IGJlIGNvbmZpZ3VyZWQgb24geW91ciB3ZWJzZXJ2ZXIgYW5kIGVuYWJsZWQgaW4gdGhlIGNsYXNzIHRvIHNldCBwYXNzd29yZHMuJyk7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoIWFycmF5X2tleV9leGlzdHMoImRpc3BsYXlfbmFtZSIsJGF0dHJpYnV0ZXMpKXsgJGF0dHJpYnV0ZXNbImRpc3BsYXlfbmFtZSJdPSRhdHRyaWJ1dGVzWyJmaXJzdG5hbWUiXS4iICIuJGF0dHJpYnV0ZXNbInN1cm5hbWUiXTsgfQ0KDQogICAgICAgIC8vIFRyYW5zbGF0ZSB0aGUgc2NoZW1hDQogICAgICAgICRhZGQ9JHRoaXMtPmFkbGRhcF9zY2hlbWEoJGF0dHJpYnV0ZXMpOw0KICAgICAgICANCiAgICAgICAgLy8gQWRkaXRpb25hbCBzdHVmZiBvbmx5IHVzZWQgZm9yIGFkZGluZyBhY2NvdW50cw0KICAgICAgICAkYWRkWyJjbiJdWzBdPSRhdHRyaWJ1dGVzWyJkaXNwbGF5X25hbWUiXTsNCiAgICAgICAgJGFkZFsic2FtYWNjb3VudG5hbWUiXVswXT0kYXR0cmlidXRlc1sidXNlcm5hbWUiXTsNCiAgICAgICAgJGFkZFsib2JqZWN0Y2xhc3MiXVswXT0idG9wIjsNCiAgICAgICAgJGFkZFsib2JqZWN0Y2xhc3MiXVsxXT0icGVyc29uIjsNCiAgICAgICAgJGFkZFsib2JqZWN0Y2xhc3MiXVsyXT0ib3JnYW5pemF0aW9uYWxQZXJzb24iOw0KICAgICAgICAkYWRkWyJvYmplY3RjbGFzcyJdWzNdPSJ1c2VyIjsgLy9wZXJzb24/DQogICAgICAgIC8vJGFkZFsibmFtZSJdWzBdPSRhdHRyaWJ1dGVzWyJmaXJzdG5hbWUiXS4iICIuJGF0dHJpYnV0ZXNbInN1cm5hbWUiXTsNCg0KICAgICAgICAvLyBTZXQgdGhlIGFjY291bnQgY29udHJvbCBhdHRyaWJ1dGUNCiAgICAgICAgJGNvbnRyb2xfb3B0aW9ucz1hcnJheSgiTk9STUFMX0FDQ09VTlQiKTsNCiAgICAgICAgaWYgKCEkYXR0cmlidXRlc1siZW5hYmxlZCJdKXsgJGNvbnRyb2xfb3B0aW9uc1tdPSJBQ0NPVU5URElTQUJMRSI7IH0NCiAgICAgICAgJGFkZFsidXNlckFjY291bnRDb250cm9sIl1bMF09JHRoaXMtPmFjY291bnRfY29udHJvbCgkY29udHJvbF9vcHRpb25zKTsNCiAgICAgICAgLy9lY2hvICgiPHByZT4iKTsgcHJpbnRfcigkYWRkKTsNCg0KICAgICAgICAvLyBEZXRlcm1pbmUgdGhlIGNvbnRhaW5lcg0KICAgICAgICAkYXR0cmlidXRlc1siY29udGFpbmVyIl09YXJyYXlfcmV2ZXJzZSgkYXR0cmlidXRlc1siY29udGFpbmVyIl0pOw0KICAgICAgICAkY29udGFpbmVyPSJPVT0iLmltcGxvZGUoIixPVT0iLCRhdHRyaWJ1dGVzWyJjb250YWluZXIiXSk7DQoNCiAgICAgICAgLy8gQWRkIHRoZSBlbnRyeQ0KICAgICAgICAkcmVzdWx0PUBsZGFwX2FkZCgkdGhpcy0+X2Nvbm4sICJDTj0iLiRhZGRbImNuIl1bMF0uIiwgIi4kY29udGFpbmVyLiIsIi4kdGhpcy0+X2Jhc2VfZG4sICRhZGQpOw0KICAgICAgICBpZiAoJHJlc3VsdCE9dHJ1ZSl7IHJldHVybiAoZmFsc2UpOyB9DQogICAgICAgIA0KICAgICAgICByZXR1cm4gKHRydWUpOw0KICAgIH0NCiAgICANCiAgICAvKioNCiAgICAqIERlbGV0ZSBhIHVzZXIgYWNjb3VudA0KICAgICogDQogICAgKiBAcGFyYW0gc3RyaW5nICR1c2VybmFtZSBUaGUgdXNlcm5hbWUgdG8gZGVsZXRlIChwbGVhc2UgYmUgY2FyZWZ1bCBoZXJlISkNCiAgICAqIEBwYXJhbSBib29sICRpc0dVSUQgSXMgdGhlIHVzZXJuYW1lIGEgR1VJRCBvciBhIHNhbUFjY291bnROYW1lDQogICAgKiBAcmV0dXJuIGFycmF5DQogICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gdXNlcl9kZWxldGUoJHVzZXJuYW1lLCRpc0dVSUQ9ZmFsc2UpIHsgICAgICANCiAgICAgICAgJHVzZXJpbmZvID0gJHRoaXMtPnVzZXJfaW5mbygkdXNlcm5hbWUsIGFycmF5KCIqIiksJGlzR1VJRCk7DQogICAgICAgICRkbiA9ICR1c2VyaW5mb1swXVsnZGlzdGluZ3Vpc2hlZG5hbWUnXVswXTsNCiAgICAgICAgJHJlc3VsdD0kdGhpcy0+ZG5fZGVsZXRlKCRkbik7DQogICAgICAgIGlmICgkcmVzdWx0IT10cnVlKXsgcmV0dXJuIChmYWxzZSk7IH0gICAgICAgIA0KICAgICAgICByZXR1cm4gKHRydWUpOw0KICAgIH0NCiAgICANCiAgICAvKioNCiAgICAqIEdyb3VwcyB0aGUgdXNlciBpcyBhIG1lbWJlciBvZg0KICAgICogDQogICAgKiBAcGFyYW0gc3RyaW5nICR1c2VybmFtZSBUaGUgdXNlcm5hbWUgdG8gcXVlcnkNCiAgICAqIEBwYXJhbSBib29sICRyZWN1cnNpdmUgUmVjdXJzaXZlIGxpc3Qgb2YgZ3JvdXBzDQogICAgKiBAcGFyYW0gYm9vbCAkaXNHVUlEIElzIHRoZSB1c2VybmFtZSBwYXNzZWQgYSBHVUlEIG9yIGEgc2FtQWNjb3VudE5hbWUNCiAgICAqIEByZXR1cm4gYXJyYXkNCiAgICAqLw0KICAgIHB1YmxpYyBmdW5jdGlvbiB1c2VyX2dyb3VwcygkdXNlcm5hbWUsJHJlY3Vyc2l2ZT1OVUxMLCRpc0dVSUQ9ZmFsc2Upew0KICAgICAgICBpZiAoJHVzZXJuYW1lPT09TlVMTCl7IHJldHVybiAoZmFsc2UpOyB9DQogICAgICAgIGlmICgkcmVjdXJzaXZlPT09TlVMTCl7ICRyZWN1cnNpdmU9JHRoaXMtPl9yZWN1cnNpdmVfZ3JvdXBzOyB9IC8vIFVzZSB0aGUgZGVmYXVsdCBvcHRpb24gaWYgdGhleSBoYXZlbid0IHNldCBpdA0KICAgICAgICBpZiAoISR0aGlzLT5fYmluZCl7IHJldHVybiAoZmFsc2UpOyB9DQoNCiAgICAgICAgLy8gU2VhcmNoIHRoZSBkaXJlY3RvcnkgZm9yIHRoZWlyIGluZm9ybWF0aW9uDQogICAgICAgICRpbmZvPUAkdGhpcy0+dXNlcl9pbmZvKCR1c2VybmFtZSxhcnJheSgibWVtYmVyb2YiLCJwcmltYXJ5Z3JvdXBpZCIpLCRpc0dVSUQpOw0KICAgICAgICAkZ3JvdXBzPSR0aGlzLT5uaWNlX25hbWVzKCRpbmZvWzBdWyJtZW1iZXJvZiJdKTsgLy8gUHJlc3VtaW5nIHRoZSBlbnRyeSByZXR1cm5lZCBpcyBvdXIgZ3V5ICh1bmlxdWUgdXNlcm5hbWVzKQ0KDQogICAgICAgIGlmICgkcmVjdXJzaXZlID09PSB0cnVlKXsNCiAgICAgICAgICAgIGZvcmVhY2ggKCRncm91cHMgYXMgJGlkID0+ICRncm91cF9uYW1lKXsNCiAgICAgICAgICAgICAgICAkZXh0cmFfZ3JvdXBzPSR0aGlzLT5yZWN1cnNpdmVfZ3JvdXBzKCRncm91cF9uYW1lKTsNCiAgICAgICAgICAgICAgICAkZ3JvdXBzPWFycmF5X21lcmdlKCRncm91cHMsJGV4dHJhX2dyb3Vwcyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIHJldHVybiAoJGdyb3Vwcyk7DQogICAgfQ0KICAgIA0KICAgIC8qKg0KICAgICogRmluZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdXNlcnMNCiAgICAqIA0KICAgICogQHBhcmFtIHN0cmluZyAkdXNlcm5hbWUgVGhlIHVzZXJuYW1lIHRvIHF1ZXJ5DQogICAgKiBAcGFyYW0gYXJyYXkgJGZpZWxkcyBBcnJheSBvZiBwYXJhbWV0ZXJzIHRvIHF1ZXJ5DQogICAgKiBAcGFyYW0gYm9vbCAkaXNHVUlEIElzIHRoZSB1c2VybmFtZSBwYXNzZWQgYSBHVUlEIG9yIGEgc2FtQWNjb3VudE5hbWUNCiAgICAqIEByZXR1cm4gYXJyYXkNCiAgICAqLw0KICAgIHB1YmxpYyBmdW5jdGlvbiB1c2VyX2luZm8oJHVzZXJuYW1lLCRmaWVsZHM9TlVMTCwkaXNHVUlEPWZhbHNlKXsNCiAgICAgICAgaWYgKCR1c2VybmFtZT09PU5VTEwpeyByZXR1cm4gKGZhbHNlKTsgfQ0KICAgICAgICBpZiAoISR0aGlzLT5fYmluZCl7IHJldHVybiAoZmFsc2UpOyB9DQoNCiAgICAgICAgaWYgKCRpc0dVSUQgPT09IHRydWUpIHsNCiAgICAgICAgICAgICR1c2VybmFtZSA9ICR0aGlzLT5zdHJndWlkMmhleCgkdXNlcm5hbWUpOw0KICAgICAgICAgICAgJGZpbHRlcj0ib2JqZWN0Z3VpZD0iLiR1c2VybmFtZTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICRmaWx0ZXI9InNhbWFjY291bnRuYW1lPSIuJHVzZXJuYW1lOw0KICAgICAgICB9DQogICAgICAgIGlmICgkZmllbGRzPT09TlVMTCl7ICRmaWVsZHM9YXJyYXkoInNhbWFjY291bnRuYW1lIiwibWFpbCIsIm1lbWJlcm9mIiwiZGVwYXJ0bWVudCIsImRpc3BsYXluYW1lIiwidGVsZXBob25lbnVtYmVyIiwicHJpbWFyeWdyb3VwaWQiLCJvYmplY3RzaWQiKTsgfQ0KDQoJcmV0dXJuICR0aGlzLT5fdXNlcl9pbmZvKCRmaWx0ZXIsJGZpZWxkcyk7DQogICAgfQ0KDQoNCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gX3VzZXJfaW5mbygkZmlsdGVyLCRmaWVsZHMpDQogICAgew0KICAgICAgICAkc3I9bGRhcF9zZWFyY2goJHRoaXMtPl9jb25uLCR0aGlzLT5fYmFzZV9kbiwkZmlsdGVyLCRmaWVsZHMpOw0KICAgICAgICAkZW50cmllcyA9IGxkYXBfZ2V0X2VudHJpZXMoJHRoaXMtPl9jb25uLCAkc3IpOw0KDQogICAgICAgIGlmICgkZW50cmllc1swXVsnY291bnQnXSA+PSAxKSB7DQogICAgICAgICAgICAvLyBBRCBkb2VzIG5vdCByZXR1cm4gdGhlIHByaW1hcnkgZ3JvdXAgaW4gdGhlIGxkYXAgcXVlcnksIHdlIG1heSBuZWVkIHRvIGZ1ZGdlIGl0DQogICAgICAgICAgICBpZiAoJHRoaXMtPl9yZWFsX3ByaW1hcnlncm91cCAmJiBpc3NldCgkZW50cmllc1swXVsicHJpbWFyeWdyb3VwaWQiXVswXSkgJiYgaXNzZXQoJGVudHJpZXNbMF1bIm9iamVjdHNpZCJdWzBdKSl7DQogICAgICAgICAgICAgICAgLy8kZW50cmllc1swXVsibWVtYmVyb2YiXVtdPSR0aGlzLT5ncm91cF9jbigkZW50cmllc1swXVsicHJpbWFyeWdyb3VwaWQiXVswXSk7DQogICAgICAgICAgICAgICAgJGVudHJpZXNbMF1bIm1lbWJlcm9mIl1bXT0kdGhpcy0+Z2V0X3ByaW1hcnlfZ3JvdXAoJGVudHJpZXNbMF1bInByaW1hcnlncm91cGlkIl1bMF0sICRlbnRyaWVzWzBdWyJvYmplY3RzaWQiXVswXSk7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICRlbnRyaWVzWzBdWyJtZW1iZXJvZiJdW109IkNOPURvbWFpbiBVc2VycyxDTj1Vc2VycywiLiR0aGlzLT5fYmFzZV9kbjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgJGVudHJpZXNbMF1bIm1lbWJlcm9mIl1bImNvdW50Il0rKzsNCiAgICAgICAgcmV0dXJuICgkZW50cmllcyk7DQogICAgfQ0KICAgIA0KICAgIC8qKg0KICAgICogRGV0ZXJtaW5lIGlmIGEgdXNlciBpcyBpbiBhIHNwZWNpZmljIGdyb3VwDQogICAgKiANCiAgICAqIEBwYXJhbSBzdHJpbmcgJHVzZXJuYW1lIFRoZSB1c2VybmFtZSB0byBxdWVyeQ0KICAgICogQHBhcmFtIHN0cmluZyAkZ3JvdXAgVGhlIG5hbWUgb2YgdGhlIGdyb3VwIHRvIGNoZWNrIGFnYWluc3QNCiAgICAqIEBwYXJhbSBib29sICRyZWN1cnNpdmUgQ2hlY2sgZ3JvdXBzIHJlY3Vyc2l2ZWx5DQogICAgKiBAcGFyYW0gYm9vbCAkaXNHVUlEIElzIHRoZSB1c2VybmFtZSBwYXNzZWQgYSBHVUlEIG9yIGEgc2FtQWNjb3VudE5hbWUNCiAgICAqIEByZXR1cm4gYm9vbA0KICAgICovDQogICAgcHVibGljIGZ1bmN0aW9uIHVzZXJfaW5ncm91cCgkdXNlcm5hbWUsJGdyb3VwLCRyZWN1cnNpdmU9TlVMTCwkaXNHVUlEPWZhbHNlKXsNCiAgICAgICAgaWYgKCR1c2VybmFtZT09PU5VTEwpeyByZXR1cm4gKGZhbHNlKTsgfQ0KICAgICAgICBpZiAoJGdyb3VwPT09TlVMTCl7IHJldHVybiAoZmFsc2UpOyB9DQogICAgICAgIGlmICghJHRoaXMtPl9iaW5kKXsgcmV0dXJuIChmYWxzZSk7IH0NCiAgICAgICAgaWYgKCRyZWN1cnNpdmU9PT1OVUxMKXsgJHJlY3Vyc2l2ZT0kdGhpcy0+X3JlY3Vyc2l2ZV9ncm91cHM7IH0gLy8gVXNlIHRoZSBkZWZhdWx0IG9wdGlvbiBpZiB0aGV5IGhhdmVuJ3Qgc2V0IGl0DQogICAgICAgIA0KICAgICAgICAvLyBHZXQgYSBsaXN0IG9mIHRoZSBncm91cHMNCiAgICAgICAgJGdyb3Vwcz0kdGhpcy0+dXNlcl9ncm91cHMoJHVzZXJuYW1lLCRyZWN1cnNpdmUsJGlzR1VJRCk7DQogICAgICAgIA0KICAgICAgICAvLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGdyb3VwIGlzIGluIHRoZSBncm91cCBsaXN0DQogICAgICAgIGlmIChpbl9hcnJheSgkZ3JvdXAsJGdyb3VwcykpeyByZXR1cm4gKHRydWUpOyB9DQoNCiAgICAgICAgcmV0dXJuIChmYWxzZSk7DQogICAgfQ0KICAgIA0KICAgIC8qKg0KICAgICogRGV0ZXJtaW5lIGEgdXNlcidzIHBhc3N3b3JkIGV4cGlyeSBkYXRlDQogICAgKiANCiAgICAqIEBwYXJhbSBzdHJpbmcgJHVzZXJuYW1lIFRoZSB1c2VybmFtZSB0byBxdWVyeQ0KICAgICogQHBhcmFtIGJvb2sgJGlzR1VJRCBJcyB0aGUgdXNlcm5hbWUgcGFzc2VkIGEgR1VJRCBvciBhIHNhbUFjY291bnROYW1lDQogICAgKiBAcmVxdWlyZXMgYmNtYXRoIGh0dHA6Ly93d3cucGhwLm5ldC9tYW51YWwvZW4vYm9vay5iYy5waHANCiAgICAqIEByZXR1cm4gYXJyYXkNCiAgICAqLw0KICAgIHB1YmxpYyBmdW5jdGlvbiB1c2VyX3Bhc3N3b3JkX2V4cGlyeSgkdXNlcm5hbWUsJGlzR1VJRD1mYWxzZSkgew0KICAgICAgICBpZiAoJHVzZXJuYW1lPT09TlVMTCl7IHJldHVybiAoIk1pc3NpbmcgY29tcHVsc29yeSBmaWVsZCBbdXNlcm5hbWVdIik7IH0NCiAgICAgICAgaWYgKCEkdGhpcy0+X2JpbmQpeyByZXR1cm4gKGZhbHNlKTsgfQ0KICAgICAgICBpZiAoIWZ1bmN0aW9uX2V4aXN0cygnYmNtb2QnKSkgeyByZXR1cm4gKCJNaXNzaW5nIGZ1bmN0aW9uIHN1cHBvcnQgW2JjbW9kXSBodHRwOi8vd3d3LnBocC5uZXQvbWFudWFsL2VuL2Jvb2suYmMucGhwIik7IH07DQogICAgICAgIA0KICAgICAgICAkdXNlcmluZm8gPSAkdGhpcy0+dXNlcl9pbmZvKCR1c2VybmFtZSwgYXJyYXkoInB3ZGxhc3RzZXQiLCAidXNlcmFjY291bnRjb250cm9sIiksICRpc0dVSUQpOw0KICAgICAgICAkcHdkbGFzdHNldCA9ICR1c2VyaW5mb1swXVsncHdkbGFzdHNldCddWzBdOw0KICAgICAgICAkc3RhdHVzID0gYXJyYXkoKTsNCiAgICAgICAgDQogICAgICAgIGlmICgkdXNlcmluZm9bMF1bJ3VzZXJhY2NvdW50Y29udHJvbCddWzBdID09ICc2NjA0OCcpIHsNCiAgICAgICAgICAgIC8vIFBhc3N3b3JkIGRvZXMgbm90IGV4cGlyZQ0KICAgICAgICAgICAgcmV0dXJuICJEb2VzIG5vdCBleHBpcmUiOw0KICAgICAgICB9DQogICAgICAgIGlmICgkcHdkbGFzdHNldCA9PT0gJzAnKSB7DQogICAgICAgICAgICAvLyBQYXNzd29yZCBoYXMgYWxyZWFkeSBleHBpcmVkDQogICAgICAgICAgICByZXR1cm4gIlBhc3N3b3JkIGhhcyBleHBpcmVkIjsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgIC8vIFBhc3N3b3JkIGV4cGlyeSBpbiBBRCBjYW4gYmUgY2FsY3VsYXRlZCBmcm9tIFRXTyB2YWx1ZXM6DQogICAgICAgICAvLyAgIC0gVXNlcidzIG93biBwd2RMYXN0U2V0IGF0dHJpYnV0ZTogc3RvcmVzIHRoZSBsYXN0IHRpbWUgdGhlIHBhc3N3b3JkIHdhcyBjaGFuZ2VkDQogICAgICAgICAvLyAgIC0gRG9tYWluJ3MgbWF4UHdkQWdlIGF0dHJpYnV0ZTogaG93IGxvbmcgcGFzc3dvcmRzIGxhc3QgaW4gdGhlIGRvbWFpbg0KICAgICAgICAgLy8NCiAgICAgICAgIC8vIEFsdGhvdWdoIE1pY3Jvc29mdCBjaG9zZSB0byB1c2UgYSBkaWZmZXJlbnQgYmFzZSBhbmQgdW5pdCBmb3IgdGltZSBtZWFzdXJlbWVudHMuDQogICAgICAgICAvLyBUaGlzIGZ1bmN0aW9uIHdpbGwgY29udmVydCB0aGVtIHRvIFVuaXggdGltZXN0YW1wcw0KICAgICAgICAgJHNyID0gbGRhcF9yZWFkKCR0aGlzLT5fY29ubiwgJHRoaXMtPl9iYXNlX2RuLCAnb2JqZWN0Y2xhc3M9KicsIGFycmF5KCdtYXhQd2RBZ2UnKSk7DQogICAgICAgICBpZiAoISRzcikgew0KICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgIH0NCiAgICAgICAgICRpbmZvID0gbGRhcF9nZXRfZW50cmllcygkdGhpcy0+X2Nvbm4sICRzcik7DQogICAgICAgICAkbWF4cHdkYWdlID0gJGluZm9bMF1bJ21heHB3ZGFnZSddWzBdOw0KICAgICAgICAgDQoNCiAgICAgICAgIC8vIFNlZSBNU0ROOiBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXM5NzQ1OTguYXNweA0KICAgICAgICAgLy8NCiAgICAgICAgIC8vIHB3ZExhc3RTZXQgY29udGFpbnMgdGhlIG51bWJlciBvZiAxMDAgbmFub3NlY29uZCBpbnRlcnZhbHMgc2luY2UgSmFudWFyeSAxLCAxNjAxIChVVEMpLCANCiAgICAgICAgIC8vIHN0b3JlZCBpbiBhIDY0IGJpdCBpbnRlZ2VyLiANCiAgICAgICAgIC8vDQogICAgICAgICAvLyBUaGUgbnVtYmVyIG9mIHNlY29uZHMgYmV0d2VlbiB0aGlzIGRhdGUgYW5kIFVuaXggZXBvY2ggaXMgMTE2NDQ0NzM2MDAuDQogICAgICAgICAvLw0KICAgICAgICAgLy8gbWF4UHdkQWdlIGlzIHN0b3JlZCBhcyBhIGxhcmdlIGludGVnZXIgdGhhdCByZXByZXNlbnRzIHRoZSBudW1iZXIgb2YgMTAwIG5hbm9zZWNvbmQNCiAgICAgICAgIC8vIGludGVydmFscyBmcm9tIHRoZSB0aW1lIHRoZSBwYXNzd29yZCB3YXMgc2V0IGJlZm9yZSB0aGUgcGFzc3dvcmQgZXhwaXJlcy4NCiAgICAgICAgIC8vDQogICAgICAgICAvLyBXZSBhbHNvIG5lZWQgdG8gc2NhbGUgdGhpcyB0byBzZWNvbmRzIGJ1dCBhbHNvIHRoaXMgdmFsdWUgaXMgYSBfbmVnYXRpdmVfIHF1YW50aXR5IQ0KICAgICAgICAgLy8NCiAgICAgICAgIC8vIElmIHRoZSBsb3cgMzIgYml0cyBvZiBtYXhQd2RBZ2UgYXJlIGVxdWFsIHRvIDAgcGFzc3dvcmRzIGRvIG5vdCBleHBpcmUNCiAgICAgICAgIC8vDQogICAgICAgICAvLyBVbmZvcnR1bmF0ZWx5IHRoZSBtYXRocyBpbnZvbHZlZCBhcmUgdG9vIGJpZyBmb3IgUEhQIGludGVnZXJzLCBzbyBJJ3ZlIGhhZCB0byByZXF1aXJlDQogICAgICAgICAvLyBCQ01hdGggZnVuY3Rpb25zIHRvIHdvcmsgd2l0aCBhcmJpdHJhcnkgcHJlY2lzaW9uIG51bWJlcnMuDQogICAgICAgICBpZiAoYmNtb2QoJG1heHB3ZGFnZSwgNDI5NDk2NzI5NikgPT09ICcwJykgew0KICAgICAgICAgICAgcmV0dXJuICJEb21haW4gZG9lcyBub3QgZXhwaXJlIHBhc3N3b3JkcyI7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIC8vIEFkZCBtYXhwd2RhZ2UgYW5kIHB3ZGxhc3RzZXQgYW5kIHdlIGdldCBwYXNzd29yZCBleHBpcmF0aW9uIHRpbWUgaW4gTWljcm9zb2Z0J3MNCiAgICAgICAgLy8gdGltZSB1bml0cy4gIEJlY2F1c2UgbWF4cHdkIGFnZSBpcyBuZWdhdGl2ZSB3ZSBuZWVkIHRvIHN1YnRyYWN0IGl0Lg0KICAgICAgICAkcHdkZXhwaXJlID0gYmNzdWIoJHB3ZGxhc3RzZXQsICRtYXhwd2RhZ2UpOw0KICAgIA0KICAgICAgICAvLyBDb252ZXJ0IE1TJ3MgdGltZSB0byBVbml4IHRpbWUNCiAgICAgICAgJHN0YXR1c1snZXhwaXJ5dHMnXSA9IGJjc3ViKGJjZGl2KCRwd2RleHBpcmUsICcxMDAwMDAwMCcpLCAnMTE2NDQ0NzM2MDAnKTsNCiAgICAgICAgJHN0YXR1c1snZXhwaXJ5Zm9ybWF0J10gPSBkYXRlKCdZLW0tZCBIOmk6cycsIGJjc3ViKGJjZGl2KCRwd2RleHBpcmUsICcxMDAwMDAwMCcpLCAnMTE2NDQ0NzM2MDAnKSk7DQogICAgICAgIA0KICAgICAgICByZXR1cm4gJHN0YXR1czsNCiAgICB9DQogICAgDQogICAgLyoqDQogICAgKiBNb2RpZnkgYSB1c2VyDQogICAgKiANCiAgICAqIEBwYXJhbSBzdHJpbmcgJHVzZXJuYW1lIFRoZSB1c2VybmFtZSB0byBxdWVyeQ0KICAgICogQHBhcmFtIGFycmF5ICRhdHRyaWJ1dGVzIFRoZSBhdHRyaWJ1dGVzIHRvIG1vZGlmeS4gIE5vdGUgaWYgeW91IHNldCB0aGUgZW5hYmxlZCBhdHRyaWJ1dGUgeW91IG11c3Qgbm90IHNwZWNpZnkgYW55IG90aGVyIGF0dHJpYnV0ZXMNCiAgICAqIEBwYXJhbSBib29sICRpc0dVSUQgSXMgdGhlIHVzZXJuYW1lIHBhc3NlZCBhIEdVSUQgb3IgYSBzYW1BY2NvdW50TmFtZQ0KICAgICogQHJldHVybiBib29sDQogICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gdXNlcl9tb2RpZnkoJHVzZXJuYW1lLCRhdHRyaWJ1dGVzLCRpc0dVSUQ9ZmFsc2Upew0KICAgICAgICBpZiAoJHVzZXJuYW1lPT09TlVMTCl7IHJldHVybiAoIk1pc3NpbmcgY29tcHVsc29yeSBmaWVsZCBbdXNlcm5hbWVdIik7IH0NCiAgICAgICAgaWYgKGFycmF5X2tleV9leGlzdHMoInBhc3N3b3JkIiwkYXR0cmlidXRlcykgJiYgISR0aGlzLT5fdXNlX3NzbCl7IA0KICAgICAgICAgICAgdGhyb3cgbmV3IGFkTERBUEV4Y2VwdGlvbignU1NMIG11c3QgYmUgY29uZmlndXJlZCBvbiB5b3VyIHdlYnNlcnZlciBhbmQgZW5hYmxlZCBpbiB0aGUgY2xhc3MgdG8gc2V0IHBhc3N3b3Jkcy4nKTsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIEZpbmQgdGhlIGRuIG9mIHRoZSB1c2VyDQogICAgICAgICR1c2VyX2RuPSR0aGlzLT51c2VyX2RuKCR1c2VybmFtZSwkaXNHVUlEKTsNCiAgICAgICAgaWYgKCR1c2VyX2RuPT09ZmFsc2UpeyByZXR1cm4gKGZhbHNlKTsgfQ0KICAgICAgICANCiAgICAgICAgLy8gVHJhbnNsYXRlIHRoZSB1cGRhdGUgdG8gdGhlIExEQVAgc2NoZW1hICAgICAgICAgICAgICAgIA0KICAgICAgICAkbW9kPSR0aGlzLT5hZGxkYXBfc2NoZW1hKCRhdHRyaWJ1dGVzKTsNCiAgICAgICAgDQogICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGlzIGlzIGFuIGVuYWJsZWQgc3RhdHVzIHVwZGF0ZQ0KICAgICAgICBpZiAoISRtb2QgJiYgIWFycmF5X2tleV9leGlzdHMoImVuYWJsZWQiLCAkYXR0cmlidXRlcykpeyByZXR1cm4gKGZhbHNlKTsgfQ0KICAgICAgICANCiAgICAgICAgLy8gU2V0IHRoZSBhY2NvdW50IGNvbnRyb2wgYXR0cmlidXRlIChvbmx5IGlmIHNwZWNpZmllZCkNCiAgICAgICAgaWYgKGFycmF5X2tleV9leGlzdHMoImVuYWJsZWQiLCRhdHRyaWJ1dGVzKSl7DQogICAgICAgICAgICBpZiAoJGF0dHJpYnV0ZXNbImVuYWJsZWQiXSl7ICRjb250cm9sX29wdGlvbnM9YXJyYXkoIk5PUk1BTF9BQ0NPVU5UIik7IH0NCiAgICAgICAgICAgIGVsc2UgeyAkY29udHJvbF9vcHRpb25zPWFycmF5KCJOT1JNQUxfQUNDT1VOVCIsIkFDQ09VTlRESVNBQkxFIik7IH0NCiAgICAgICAgICAgICRtb2RbInVzZXJBY2NvdW50Q29udHJvbCJdWzBdPSR0aGlzLT5hY2NvdW50X2NvbnRyb2woJGNvbnRyb2xfb3B0aW9ucyk7DQogICAgICAgIH0NCg0KICAgICAgICAvLyBEbyB0aGUgdXBkYXRlDQogICAgICAgICRyZXN1bHQ9QGxkYXBfbW9kaWZ5KCR0aGlzLT5fY29ubiwkdXNlcl9kbiwkbW9kKTsNCiAgICAgICAgaWYgKCRyZXN1bHQ9PWZhbHNlKXsgcmV0dXJuIChmYWxzZSk7IH0NCiAgICAgICAgDQogICAgICAgIHJldHVybiAodHJ1ZSk7DQogICAgfQ0KICAgIA0KICAgIC8qKg0KICAgICogRGlzYWJsZSBhIHVzZXIgYWNjb3VudA0KICAgICogDQogICAgKiBAcGFyYW0gc3RyaW5nICR1c2VybmFtZSBUaGUgdXNlcm5hbWUgdG8gZGlzYWJsZQ0KICAgICogQHBhcmFtIGJvb2wgJGlzR1VJRCBJcyB0aGUgdXNlcm5hbWUgcGFzc2VkIGEgR1VJRCBvciBhIHNhbUFjY291bnROYW1lDQogICAgKiBAcmV0dXJuIGJvb2wNCiAgICAqLw0KICAgIHB1YmxpYyBmdW5jdGlvbiB1c2VyX2Rpc2FibGUoJHVzZXJuYW1lLCRpc0dVSUQ9ZmFsc2Upew0KICAgICAgICBpZiAoJHVzZXJuYW1lPT09TlVMTCl7IHJldHVybiAoIk1pc3NpbmcgY29tcHVsc29yeSBmaWVsZCBbdXNlcm5hbWVdIik7IH0NCiAgICAgICAgJGF0dHJpYnV0ZXM9YXJyYXkoImVuYWJsZWQiPT4wKTsNCiAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT51c2VyX21vZGlmeSgkdXNlcm5hbWUsICRhdHRyaWJ1dGVzLCAkaXNHVUlEKTsNCiAgICAgICAgaWYgKCRyZXN1bHQ9PWZhbHNlKXsgcmV0dXJuIChmYWxzZSk7IH0NCiAgICAgICAgDQogICAgICAgIHJldHVybiAodHJ1ZSk7DQogICAgfQ0KICAgIA0KICAgIC8qKg0KICAgICogRW5hYmxlIGEgdXNlciBhY2NvdW50DQogICAgKiANCiAgICAqIEBwYXJhbSBzdHJpbmcgJHVzZXJuYW1lIFRoZSB1c2VybmFtZSB0byBlbmFibGUNCiAgICAqIEBwYXJhbSBib29sICRpc0dVSUQgSXMgdGhlIHVzZXJuYW1lIHBhc3NlZCBhIEdVSUQgb3IgYSBzYW1BY2NvdW50TmFtZQ0KICAgICogQHJldHVybiBib29sDQogICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gdXNlcl9lbmFibGUoJHVzZXJuYW1lLCRpc0dVSUQ9ZmFsc2Upew0KICAgICAgICBpZiAoJHVzZXJuYW1lPT09TlVMTCl7IHJldHVybiAoIk1pc3NpbmcgY29tcHVsc29yeSBmaWVsZCBbdXNlcm5hbWVdIik7IH0NCiAgICAgICAgJGF0dHJpYnV0ZXM9YXJyYXkoImVuYWJsZWQiPT4xKTsNCiAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT51c2VyX21vZGlmeSgkdXNlcm5hbWUsICRhdHRyaWJ1dGVzLCAkaXNHVUlEKTsNCiAgICAgICAgaWYgKCRyZXN1bHQ9PWZhbHNlKXsgcmV0dXJuIChmYWxzZSk7IH0NCiAgICAgICAgDQogICAgICAgIHJldHVybiAodHJ1ZSk7DQogICAgfQ0KICAgIA0KICAgIC8qKg0KICAgICogU2V0IHRoZSBwYXNzd29yZCBvZiBhIHVzZXIgLSBUaGlzIG11c3QgYmUgcGVyZm9ybWVkIG92ZXIgU1NMDQogICAgKiANCiAgICAqIEBwYXJhbSBzdHJpbmcgJHVzZXJuYW1lIFRoZSB1c2VybmFtZSB0byBtb2RpZnkNCiAgICAqIEBwYXJhbSBzdHJpbmcgJHBhc3N3b3JkIFRoZSBuZXcgcGFzc3dvcmQNCiAgICAqIEBwYXJhbSBib29sICRpc0dVSUQgSXMgdGhlIHVzZXJuYW1lIHBhc3NlZCBhIEdVSUQgb3IgYSBzYW1BY2NvdW50TmFtZQ0KICAgICogQHJldHVybiBib29sDQogICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gdXNlcl9wYXNzd29yZCgkdXNlcm5hbWUsJHBhc3N3b3JkLCRpc0dVSUQ9ZmFsc2Upew0KICAgICAgICBpZiAoJHVzZXJuYW1lPT09TlVMTCl7IHJldHVybiAoZmFsc2UpOyB9DQogICAgICAgIGlmICgkcGFzc3dvcmQ9PT1OVUxMKXsgcmV0dXJuIChmYWxzZSk7IH0NCiAgICAgICAgaWYgKCEkdGhpcy0+X2JpbmQpeyByZXR1cm4gKGZhbHNlKTsgfQ0KICAgICAgICBpZiAoISR0aGlzLT5fdXNlX3NzbCAmJiAhJHRoaXMtPl91c2VfdGxzKXsgDQogICAgICAgICAgICB0aHJvdyBuZXcgYWRMREFQRXhjZXB0aW9uKCdTU0wgbXVzdCBiZSBjb25maWd1cmVkIG9uIHlvdXIgd2Vic2VydmVyIGFuZCBlbmFibGVkIGluIHRoZSBjbGFzcyB0byBzZXQgcGFzc3dvcmRzLicpOw0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICAkdXNlcl9kbj0kdGhpcy0+dXNlcl9kbigkdXNlcm5hbWUsJGlzR1VJRCk7DQogICAgICAgIGlmICgkdXNlcl9kbj09PWZhbHNlKXsgcmV0dXJuIChmYWxzZSk7IH0NCiAgICAgICAgICAgICAgICANCiAgICAgICAgJGFkZD1hcnJheSgpOw0KICAgICAgICAkYWRkWyJ1bmljb2RlUHdkIl1bMF09JHRoaXMtPmVuY29kZV9wYXNzd29yZCgkcGFzc3dvcmQpOw0KICAgICAgICANCiAgICAgICAgJHJlc3VsdD1sZGFwX21vZF9yZXBsYWNlKCR0aGlzLT5fY29ubiwkdXNlcl9kbiwkYWRkKTsNCiAgICAgICAgaWYgKCRyZXN1bHQ9PWZhbHNlKXsgcmV0dXJuIChmYWxzZSk7IH0NCiAgICAgICAgDQogICAgICAgIHJldHVybiAodHJ1ZSk7DQogICAgfQ0KICAgIA0KICAgIC8qKg0KICAgICogUmV0dXJuIGEgbGlzdCBvZiBhbGwgdXNlcnMgaW4gQUQNCiAgICAqIA0KICAgICogQHBhcmFtIGJvb2wgJGluY2x1ZGVfZGVzYyBSZXR1cm4gYSBkZXNjcmlwdGlvbiBvZiB0aGUgdXNlcg0KICAgICogQHBhcmFtIHN0cmluZyAkc2VhcmNoIFNlYXJjaCBwYXJhbWV0ZXINCiAgICAqIEBwYXJhbSBib29sICRzb3J0ZWQgU29ydCB0aGUgdXNlciBhY2NvdW50cw0KICAgICogQHJldHVybiBhcnJheQ0KICAgICovDQogICAgcHVibGljIGZ1bmN0aW9uIGFsbF91c2VycygkaW5jbHVkZV9kZXNjID0gZmFsc2UsICRzZWFyY2ggPSAiKiIsICRzb3J0ZWQgPSB0cnVlKXsNCiAgICAgICAgaWYgKCEkdGhpcy0+X2JpbmQpeyByZXR1cm4gKGZhbHNlKTsgfQ0KICAgICAgICANCiAgICAgICAgLy8gUGVyZm9ybSB0aGUgc2VhcmNoIGFuZCBncmFiIGFsbCB0aGVpciBkZXRhaWxzDQogICAgICAgICRmaWx0ZXIgPSAiKCYob2JqZWN0Q2xhc3M9dXNlcikoc2FtYWNjb3VudHR5cGU9Ii4gQURMREFQX05PUk1BTF9BQ0NPVU5UIC4iKShvYmplY3RDYXRlZ29yeT1wZXJzb24pKGNuPSIuJHNlYXJjaC4iKSkiOw0KICAgICAgICAkZmllbGRzPWFycmF5KCJzYW1hY2NvdW50bmFtZSIsImRpc3BsYXluYW1lIik7DQogICAgICAgICRzcj1sZGFwX3NlYXJjaCgkdGhpcy0+X2Nvbm4sJHRoaXMtPl9iYXNlX2RuLCRmaWx0ZXIsJGZpZWxkcyk7DQogICAgICAgICRlbnRyaWVzID0gbGRhcF9nZXRfZW50cmllcygkdGhpcy0+X2Nvbm4sICRzcik7DQoNCiAgICAgICAgJHVzZXJzX2FycmF5ID0gYXJyYXkoKTsNCiAgICAgICAgZm9yICgkaT0wOyAkaTwkZW50cmllc1siY291bnQiXTsgJGkrKyl7DQogICAgICAgICAgICBpZiAoJGluY2x1ZGVfZGVzYyAmJiBzdHJsZW4oJGVudHJpZXNbJGldWyJkaXNwbGF5bmFtZSJdWzBdKT4wKXsNCiAgICAgICAgICAgICAgICAkdXNlcnNfYXJyYXlbICRlbnRyaWVzWyRpXVsic2FtYWNjb3VudG5hbWUiXVswXSBdID0gJGVudHJpZXNbJGldWyJkaXNwbGF5bmFtZSJdWzBdOw0KICAgICAgICAgICAgfSBlbHNlaWYgKCRpbmNsdWRlX2Rlc2Mpew0KICAgICAgICAgICAgICAgICR1c2Vyc19hcnJheVsgJGVudHJpZXNbJGldWyJzYW1hY2NvdW50bmFtZSJdWzBdIF0gPSAkZW50cmllc1skaV1bInNhbWFjY291bnRuYW1lIl1bMF07DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIGFycmF5X3B1c2goJHVzZXJzX2FycmF5LCAkZW50cmllc1skaV1bInNhbWFjY291bnRuYW1lIl1bMF0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGlmICgkc29ydGVkKXsgYXNvcnQoJHVzZXJzX2FycmF5KTsgfQ0KICAgICAgICByZXR1cm4gKCR1c2Vyc19hcnJheSk7DQogICAgfQ0KICAgIA0KICAgIC8qKg0KICAgICogQ29udmVydHMgYSB1c2VybmFtZSAoc2FtQWNjb3VudE5hbWUpIHRvIGEgR1VJRA0KICAgICogDQogICAgKiBAcGFyYW0gc3RyaW5nICR1c2VybmFtZSBUaGUgdXNlcm5hbWUgdG8gcXVlcnkNCiAgICAqIEByZXR1cm4gc3RyaW5nDQogICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gdXNlcm5hbWUyZ3VpZCgkdXNlcm5hbWUpIHsNCiAgICAgICAgaWYgKCEkdGhpcy0+X2JpbmQpeyByZXR1cm4gKGZhbHNlKTsgfQ0KICAgICAgICBpZiAoJHVzZXJuYW1lID09PSBudWxsKXsgcmV0dXJuICgiTWlzc2luZyBjb21wdWxzb3J5IGZpZWxkIFt1c2VybmFtZV0iKTsgfQ0KICAgICAgICANCiAgICAgICAgJGZpbHRlciA9ICJzYW1hY2NvdW50bmFtZT0iIC4gJHVzZXJuYW1lOyANCiAgICAgICAgJGZpZWxkcyA9IGFycmF5KCJvYmplY3RHVUlEIik7IA0KICAgICAgICAkc3IgPSBAbGRhcF9zZWFyY2goJHRoaXMtPl9jb25uLCAkdGhpcy0+X2Jhc2VfZG4sICRmaWx0ZXIsICRmaWVsZHMpOyANCiAgICAgICAgaWYgKGxkYXBfY291bnRfZW50cmllcygkdGhpcy0+X2Nvbm4sICRzcikgPiAwKSB7IA0KICAgICAgICAgICAgJGVudHJ5ID0gQGxkYXBfZmlyc3RfZW50cnkoJHRoaXMtPl9jb25uLCAkc3IpOyANCiAgICAgICAgICAgICRndWlkID0gQGxkYXBfZ2V0X3ZhbHVlc19sZW4oJHRoaXMtPl9jb25uLCAkZW50cnksICdvYmplY3RHVUlEJyk7IA0KICAgICAgICAgICAgJHN0ckdVSUQgPSAkdGhpcy0+YmluYXJ5MnRleHQoJGd1aWRbMF0pOyAgICAgICAgICANCiAgICAgICAgICAgIHJldHVybiAoJHN0ckdVSUQpOyANCiAgICAgICAgfQ0KICAgICAgICBlbHNlIHsgDQogICAgICAgICAgICByZXR1cm4gKGZhbHNlKTsgDQogICAgICAgIH0gDQogICAgfQ0KICAgIA0KICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAgICAvLyBDT05UQUNUIEZVTkNUSU9OUw0KICAgIC8vICogU3RpbGwgd29yayB0byBkbyBpbiB0aGlzIGFyZWEsIGFuZCBuZXcgZnVuY3Rpb25zIHRvIHdyaXRlDQogICAgDQogICAgLyoqDQogICAgKiBDcmVhdGUgYSBjb250YWN0DQogICAgKiANCiAgICAqIEBwYXJhbSBhcnJheSAkYXR0cmlidXRlcyBUaGUgYXR0cmlidXRlcyB0byBzZXQgdG8gdGhlIGNvbnRhY3QNCiAgICAqIEByZXR1cm4gYm9vbA0KICAgICovDQogICAgcHVibGljIGZ1bmN0aW9uIGNvbnRhY3RfY3JlYXRlKCRhdHRyaWJ1dGVzKXsNCiAgICAgICAgLy8gQ2hlY2sgZm9yIGNvbXB1bHNvcnkgZmllbGRzDQogICAgICAgIGlmICghYXJyYXlfa2V5X2V4aXN0cygiZGlzcGxheV9uYW1lIiwkYXR0cmlidXRlcykpeyByZXR1cm4gKCJNaXNzaW5nIGNvbXB1bHNvcnkgZmllbGQgW2Rpc3BsYXlfbmFtZV0iKTsgfQ0KICAgICAgICBpZiAoIWFycmF5X2tleV9leGlzdHMoImVtYWlsIiwkYXR0cmlidXRlcykpeyByZXR1cm4gKCJNaXNzaW5nIGNvbXB1bHNvcnkgZmllbGQgW2VtYWlsXSIpOyB9DQogICAgICAgIGlmICghYXJyYXlfa2V5X2V4aXN0cygiY29udGFpbmVyIiwkYXR0cmlidXRlcykpeyByZXR1cm4gKCJNaXNzaW5nIGNvbXB1bHNvcnkgZmllbGQgW2NvbnRhaW5lcl0iKTsgfQ0KICAgICAgICBpZiAoIWlzX2FycmF5KCRhdHRyaWJ1dGVzWyJjb250YWluZXIiXSkpeyByZXR1cm4gKCJDb250YWluZXIgYXR0cmlidXRlIG11c3QgYmUgYW4gYXJyYXkuIik7IH0NCg0KICAgICAgICAvLyBUcmFuc2xhdGUgdGhlIHNjaGVtYQ0KICAgICAgICAkYWRkPSR0aGlzLT5hZGxkYXBfc2NoZW1hKCRhdHRyaWJ1dGVzKTsNCiAgICAgICAgDQogICAgICAgIC8vIEFkZGl0aW9uYWwgc3R1ZmYgb25seSB1c2VkIGZvciBhZGRpbmcgY29udGFjdHMNCiAgICAgICAgJGFkZFsiY24iXVswXT0kYXR0cmlidXRlc1siZGlzcGxheV9uYW1lIl07DQogICAgICAgICRhZGRbIm9iamVjdGNsYXNzIl1bMF09InRvcCI7DQogICAgICAgICRhZGRbIm9iamVjdGNsYXNzIl1bMV09InBlcnNvbiI7DQogICAgICAgICRhZGRbIm9iamVjdGNsYXNzIl1bMl09Im9yZ2FuaXphdGlvbmFsUGVyc29uIjsNCiAgICAgICAgJGFkZFsib2JqZWN0Y2xhc3MiXVszXT0iY29udGFjdCI7IA0KICAgICAgICBpZiAoIWlzc2V0KCRhdHRyaWJ1dGVzWydleGNoYW5nZV9oaWRlZnJvbWxpc3RzJ10pKSB7DQogICAgICAgICAgICAkYWRkWyJtc0V4Y2hIaWRlRnJvbUFkZHJlc3NMaXN0cyJdWzBdPSJUUlVFIjsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIERldGVybWluZSB0aGUgY29udGFpbmVyDQogICAgICAgICRhdHRyaWJ1dGVzWyJjb250YWluZXIiXT1hcnJheV9yZXZlcnNlKCRhdHRyaWJ1dGVzWyJjb250YWluZXIiXSk7DQogICAgICAgICRjb250YWluZXI9Ik9VPSIuaW1wbG9kZSgiLE9VPSIsJGF0dHJpYnV0ZXNbImNvbnRhaW5lciJdKTsNCg0KICAgICAgICAvLyBBZGQgdGhlIGVudHJ5DQogICAgICAgICRyZXN1bHQ9QGxkYXBfYWRkKCR0aGlzLT5fY29ubiwgIkNOPSIuJGFkZFsiY24iXVswXS4iLCAiLiRjb250YWluZXIuIiwiLiR0aGlzLT5fYmFzZV9kbiwgJGFkZCk7DQogICAgICAgIGlmICgkcmVzdWx0IT10cnVlKXsgcmV0dXJuIChmYWxzZSk7IH0NCiAgICAgICAgDQogICAgICAgIHJldHVybiAodHJ1ZSk7DQogICAgfSAgDQogICAgDQogICAgLyoqDQogICAgKiBEZXRlcm1pbmUgdGhlIGxpc3Qgb2YgZ3JvdXBzIGEgY29udGFjdCBpcyBhIG1lbWJlciBvZg0KICAgICogDQogICAgKiBAcGFyYW0gc3RyaW5nICRkaXN0aW5ndWlzZWRuYW1lIFRoZSBmdWxsIEROIG9mIGEgY29udGFjdA0KICAgICogQHBhcmFtIGJvb2wgJHJlY3Vyc2l2ZSBSZWN1cnNpdmVseSBjaGVjayBncm91cHMNCiAgICAqIEByZXR1cm4gYXJyYXkNCiAgICAqLw0KICAgIHB1YmxpYyBmdW5jdGlvbiBjb250YWN0X2dyb3VwcygkZGlzdGluZ3Vpc2hlZG5hbWUsJHJlY3Vyc2l2ZT1OVUxMKXsNCiAgICAgICAgaWYgKCRkaXN0aW5ndWlzaGVkbmFtZT09PU5VTEwpeyByZXR1cm4gKGZhbHNlKTsgfQ0KICAgICAgICBpZiAoJHJlY3Vyc2l2ZT09PU5VTEwpeyAkcmVjdXJzaXZlPSR0aGlzLT5fcmVjdXJzaXZlX2dyb3VwczsgfSAvL3VzZSB0aGUgZGVmYXVsdCBvcHRpb24gaWYgdGhleSBoYXZlbid0IHNldCBpdA0KICAgICAgICBpZiAoISR0aGlzLT5fYmluZCl7IHJldHVybiAoZmFsc2UpOyB9DQogICAgICAgIA0KICAgICAgICAvLyBTZWFyY2ggdGhlIGRpcmVjdG9yeSBmb3IgdGhlaXIgaW5mb3JtYXRpb24NCiAgICAgICAgJGluZm89QCR0aGlzLT5jb250YWN0X2luZm8oJGRpc3Rpbmd1aXNoZWRuYW1lLGFycmF5KCJtZW1iZXJvZiIsInByaW1hcnlncm91cGlkIikpOw0KICAgICAgICAkZ3JvdXBzPSR0aGlzLT5uaWNlX25hbWVzKCRpbmZvWzBdWyJtZW1iZXJvZiJdKTsgLy9wcmVzdW1pbmcgdGhlIGVudHJ5IHJldHVybmVkIGlzIG91ciBjb250YWN0DQoNCiAgICAgICAgaWYgKCRyZWN1cnNpdmUgPT09IHRydWUpew0KICAgICAgICAgICAgZm9yZWFjaCAoJGdyb3VwcyBhcyAkaWQgPT4gJGdyb3VwX25hbWUpew0KICAgICAgICAgICAgICAgICRleHRyYV9ncm91cHM9JHRoaXMtPnJlY3Vyc2l2ZV9ncm91cHMoJGdyb3VwX25hbWUpOw0KICAgICAgICAgICAgICAgICRncm91cHM9YXJyYXlfbWVyZ2UoJGdyb3VwcywkZXh0cmFfZ3JvdXBzKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgcmV0dXJuICgkZ3JvdXBzKTsNCiAgICB9DQogICAgDQogICAgLyoqDQogICAgKiBHZXQgY29udGFjdCBpbmZvcm1hdGlvbg0KICAgICogDQogICAgKiBAcGFyYW0gc3RyaW5nICRkaXN0aW5ndWlzZWRuYW1lIFRoZSBmdWxsIEROIG9mIGEgY29udGFjdA0KICAgICogQHBhcmFtIGFycmF5ICRmaWVsZHMgQXR0cmlidXRlcyB0byBiZSByZXR1cm5lZA0KICAgICogQHJldHVybiBhcnJheQ0KICAgICovDQogICAgcHVibGljIGZ1bmN0aW9uIGNvbnRhY3RfaW5mbygkZGlzdGluZ3Vpc2hlZG5hbWUsJGZpZWxkcz1OVUxMKXsNCiAgICAgICAgaWYgKCRkaXN0aW5ndWlzaGVkbmFtZT09PU5VTEwpeyByZXR1cm4gKGZhbHNlKTsgfQ0KICAgICAgICBpZiAoISR0aGlzLT5fYmluZCl7IHJldHVybiAoZmFsc2UpOyB9DQoNCiAgICAgICAgJGZpbHRlcj0iZGlzdGluZ3Vpc2hlZE5hbWU9Ii4kZGlzdGluZ3Vpc2hlZG5hbWU7DQogICAgICAgIGlmICgkZmllbGRzPT09TlVMTCl7ICRmaWVsZHM9YXJyYXkoImRpc3Rpbmd1aXNoZWRuYW1lIiwibWFpbCIsIm1lbWJlcm9mIiwiZGVwYXJ0bWVudCIsImRpc3BsYXluYW1lIiwidGVsZXBob25lbnVtYmVyIiwicHJpbWFyeWdyb3VwaWQiLCJvYmplY3RzaWQiKTsgfQ0KICAgICAgICAkc3I9bGRhcF9zZWFyY2goJHRoaXMtPl9jb25uLCR0aGlzLT5fYmFzZV9kbiwkZmlsdGVyLCRmaWVsZHMpOw0KICAgICAgICAkZW50cmllcyA9IGxkYXBfZ2V0X2VudHJpZXMoJHRoaXMtPl9jb25uLCAkc3IpOw0KICAgICAgICANCiAgICAgICAgaWYgKCRlbnRyaWVzWzBdWydjb3VudCddID49IDEpIHsNCiAgICAgICAgICAgIC8vIEFEIGRvZXMgbm90IHJldHVybiB0aGUgcHJpbWFyeSBncm91cCBpbiB0aGUgbGRhcCBxdWVyeSwgd2UgbWF5IG5lZWQgdG8gZnVkZ2UgaXQNCiAgICAgICAgICAgIGlmICgkdGhpcy0+X3JlYWxfcHJpbWFyeWdyb3VwICYmIGlzc2V0KCRlbnRyaWVzWzBdWyJwcmltYXJ5Z3JvdXBpZCJdWzBdKSAmJiBpc3NldCgkZW50cmllc1swXVsicHJpbWFyeWdyb3VwaWQiXVswXSkpew0KICAgICAgICAgICAgICAgIC8vJGVudHJpZXNbMF1bIm1lbWJlcm9mIl1bXT0kdGhpcy0+Z3JvdXBfY24oJGVudHJpZXNbMF1bInByaW1hcnlncm91cGlkIl1bMF0pOw0KICAgICAgICAgICAgICAgICRlbnRyaWVzWzBdWyJtZW1iZXJvZiJdW109JHRoaXMtPmdldF9wcmltYXJ5X2dyb3VwKCRlbnRyaWVzWzBdWyJwcmltYXJ5Z3JvdXBpZCJdWzBdLCAkZW50cmllc1swXVsib2JqZWN0c2lkIl1bMF0pOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAkZW50cmllc1swXVsibWVtYmVyb2YiXVtdPSJDTj1Eb21haW4gVXNlcnMsQ049VXNlcnMsIi4kdGhpcy0+X2Jhc2VfZG47DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgICRlbnRyaWVzWzBdWyJtZW1iZXJvZiJdWyJjb3VudCJdKys7DQogICAgICAgIHJldHVybiAoJGVudHJpZXMpOw0KICAgIH0NCiAgICANCiAgICAvKioNCiAgICAqIERldGVybWluZSBpZiBhIGNvbnRhY3QgaXMgYSBtZW1iZXIgb2YgYSBncm91cA0KICAgICogDQogICAgKiBAcGFyYW0gc3RyaW5nICRkaXN0aW5ndWlzZWRuYW1lIFRoZSBmdWxsIEROIG9mIGEgY29udGFjdA0KICAgICogQHBhcmFtIHN0cmluZyAkZ3JvdXAgVGhlIGdyb3VwIG5hbWUgdG8gcXVlcnkNCiAgICAqIEBwYXJhbSBib29sICRyZWN1cnNpdmUgUmVjdXJzaXZlbHkgY2hlY2sgZ3JvdXBzDQogICAgKiBAcmV0dXJuIGJvb2wNCiAgICAqLw0KICAgIHB1YmxpYyBmdW5jdGlvbiBjb250YWN0X2luZ3JvdXAoJGRpc3Rpbmd1aXNlZG5hbWUsJGdyb3VwLCRyZWN1cnNpdmU9TlVMTCl7DQogICAgICAgIGlmICgkZGlzdGluZ3Vpc2VkbmFtZT09PU5VTEwpeyByZXR1cm4gKGZhbHNlKTsgfQ0KICAgICAgICBpZiAoJGdyb3VwPT09TlVMTCl7IHJldHVybiAoZmFsc2UpOyB9DQogICAgICAgIGlmICghJHRoaXMtPl9iaW5kKXsgcmV0dXJuIChmYWxzZSk7IH0NCiAgICAgICAgaWYgKCRyZWN1cnNpdmU9PT1OVUxMKXsgJHJlY3Vyc2l2ZT0kdGhpcy0+X3JlY3Vyc2l2ZV9ncm91cHM7IH0gLy91c2UgdGhlIGRlZmF1bHQgb3B0aW9uIGlmIHRoZXkgaGF2ZW4ndCBzZXQgaXQNCiAgICAgICAgDQogICAgICAgIC8vIEdldCBhIGxpc3Qgb2YgdGhlIGdyb3Vwcw0KICAgICAgICAkZ3JvdXBzPSR0aGlzLT5jb250YWN0X2dyb3VwcygkZGlzdGluZ3Vpc2VkbmFtZSxhcnJheSgibWVtYmVyb2YiKSwkcmVjdXJzaXZlKTsNCiAgICAgICAgDQogICAgICAgIC8vIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgZ3JvdXAgaXMgaW4gdGhlIGdyb3VwIGxpc3QNCiAgICAgICAgaWYgKGluX2FycmF5KCRncm91cCwkZ3JvdXBzKSl7IHJldHVybiAodHJ1ZSk7IH0NCg0KICAgICAgICByZXR1cm4gKGZhbHNlKTsNCiAgICB9ICAgICAgICAgIA0KICAgIA0KICAgIC8qKg0KICAgICogTW9kaWZ5IGEgY29udGFjdA0KICAgICogDQogICAgKiBAcGFyYW0gc3RyaW5nICRkaXN0aW5ndWlzaGVkbmFtZSBUaGUgY29udGFjdCB0byBxdWVyeQ0KICAgICogQHBhcmFtIGFycmF5ICRhdHRyaWJ1dGVzIFRoZSBhdHRyaWJ1dGVzIHRvIG1vZGlmeS4gIE5vdGUgaWYgeW91IHNldCB0aGUgZW5hYmxlZCBhdHRyaWJ1dGUgeW91IG11c3Qgbm90IHNwZWNpZnkgYW55IG90aGVyIGF0dHJpYnV0ZXMNCiAgICAqIEByZXR1cm4gYm9vbA0KICAgICovDQogICAgcHVibGljIGZ1bmN0aW9uIGNvbnRhY3RfbW9kaWZ5KCRkaXN0aW5ndWlzaGVkbmFtZSwkYXR0cmlidXRlcyl7DQogICAgICAgIGlmICgkZGlzdGluZ3Vpc2hlZG5hbWU9PT1OVUxMKXsgcmV0dXJuICgiTWlzc2luZyBjb21wdWxzb3J5IGZpZWxkIFtkaXN0aW5ndWlzaGVkbmFtZV0iKTsgfQ0KICAgICAgICANCiAgICAgICAgLy8gVHJhbnNsYXRlIHRoZSB1cGRhdGUgdG8gdGhlIExEQVAgc2NoZW1hICAgICAgICAgICAgICAgIA0KICAgICAgICAkbW9kPSR0aGlzLT5hZGxkYXBfc2NoZW1hKCRhdHRyaWJ1dGVzKTsNCiAgICAgICAgDQogICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGlzIGlzIGFuIGVuYWJsZWQgc3RhdHVzIHVwZGF0ZQ0KICAgICAgICBpZiAoISRtb2QpeyByZXR1cm4gKGZhbHNlKTsgfQ0KICAgICAgICANCiAgICAgICAgLy8gRG8gdGhlIHVwZGF0ZQ0KICAgICAgICAkcmVzdWx0PWxkYXBfbW9kaWZ5KCR0aGlzLT5fY29ubiwkZGlzdGluZ3Vpc2hlZG5hbWUsJG1vZCk7DQogICAgICAgIGlmICgkcmVzdWx0PT1mYWxzZSl7IHJldHVybiAoZmFsc2UpOyB9DQogICAgICAgIA0KICAgICAgICByZXR1cm4gKHRydWUpOw0KICAgIH0NCiAgICANCiAgICAvKioNCiAgICAqIERlbGV0ZSBhIGNvbnRhY3QNCiAgICAqIA0KICAgICogQHBhcmFtIHN0cmluZyAkZGlzdGluZ3Vpc2hlZG5hbWUgVGhlIGNvbnRhY3QgZG4gdG8gZGVsZXRlIChwbGVhc2UgYmUgY2FyZWZ1bCBoZXJlISkNCiAgICAqIEByZXR1cm4gYXJyYXkNCiAgICAqLw0KICAgIHB1YmxpYyBmdW5jdGlvbiBjb250YWN0X2RlbGV0ZSgkZGlzdGluZ3Vpc2hlZG5hbWUpIHsNCiAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5kbl9kZWxldGUoJGRpc3Rpbmd1aXNoZWRuYW1lKTsNCiAgICAgICAgaWYgKCRyZXN1bHQhPXRydWUpeyByZXR1cm4gKGZhbHNlKTsgfSAgICAgICANCiAgICAgICAgcmV0dXJuICh0cnVlKTsNCiAgICB9DQogICAgDQogICAgLyoqDQogICAgKiBSZXR1cm4gYSBsaXN0IG9mIGFsbCBjb250YWN0cw0KICAgICogDQogICAgKiBAcGFyYW0gYm9vbCAkaW5jbHVkZV9kZXNjIEluY2x1ZGUgYSBkZXNjcmlwdGlvbiBvZiBhIGNvbnRhY3QNCiAgICAqIEBwYXJhbSBzdHJpbmcgJHNlYXJjaCBUaGUgc2VhcmNoIHBhcmFtZXRlcnMNCiAgICAqIEBwYXJhbSBib29sICRzb3J0ZWQgV2hldGhlciB0byBzb3J0IHRoZSByZXN1bHRzDQogICAgKiBAcmV0dXJuIGFycmF5DQogICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gYWxsX2NvbnRhY3RzKCRpbmNsdWRlX2Rlc2MgPSBmYWxzZSwgJHNlYXJjaCA9ICIqIiwgJHNvcnRlZCA9IHRydWUpew0KICAgICAgICBpZiAoISR0aGlzLT5fYmluZCl7IHJldHVybiAoZmFsc2UpOyB9DQogICAgICAgIA0KICAgICAgICAvLyBQZXJmb3JtIHRoZSBzZWFyY2ggYW5kIGdyYWIgYWxsIHRoZWlyIGRldGFpbHMNCiAgICAgICAgJGZpbHRlciA9ICIoJihvYmplY3RDbGFzcz1jb250YWN0KShjbj0iLiRzZWFyY2guIikpIjsNCiAgICAgICAgJGZpZWxkcz1hcnJheSgiZGlzcGxheW5hbWUiLCJkaXN0aW5ndWlzaGVkbmFtZSIpOyAgICAgICAgICAgDQogICAgICAgICRzcj1sZGFwX3NlYXJjaCgkdGhpcy0+X2Nvbm4sJHRoaXMtPl9iYXNlX2RuLCRmaWx0ZXIsJGZpZWxkcyk7DQogICAgICAgICRlbnRyaWVzID0gbGRhcF9nZXRfZW50cmllcygkdGhpcy0+X2Nvbm4sICRzcik7DQoNCiAgICAgICAgJHVzZXJzX2FycmF5ID0gYXJyYXkoKTsNCiAgICAgICAgZm9yICgkaT0wOyAkaTwkZW50cmllc1siY291bnQiXTsgJGkrKyl7DQogICAgICAgICAgICBpZiAoJGluY2x1ZGVfZGVzYyAmJiBzdHJsZW4oJGVudHJpZXNbJGldWyJkaXNwbGF5bmFtZSJdWzBdKT4wKXsNCiAgICAgICAgICAgICAgICAkdXNlcnNfYXJyYXlbICRlbnRyaWVzWyRpXVsiZGlzdGluZ3Vpc2hlZG5hbWUiXVswXSBdID0gJGVudHJpZXNbJGldWyJkaXNwbGF5bmFtZSJdWzBdOw0KICAgICAgICAgICAgfSBlbHNlaWYgKCRpbmNsdWRlX2Rlc2Mpew0KICAgICAgICAgICAgICAgICR1c2Vyc19hcnJheVsgJGVudHJpZXNbJGldWyJkaXN0aW5ndWlzaGVkbmFtZSJdWzBdIF0gPSAkZW50cmllc1skaV1bImRpc3Rpbmd1aXNoZWRuYW1lIl1bMF07DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIGFycmF5X3B1c2goJHVzZXJzX2FycmF5LCAkZW50cmllc1skaV1bImRpc3Rpbmd1aXNoZWRuYW1lIl1bMF0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGlmICgkc29ydGVkKXsgYXNvcnQoJHVzZXJzX2FycmF5KTsgfQ0KICAgICAgICByZXR1cm4gKCR1c2Vyc19hcnJheSk7DQogICAgfQ0KICAgIA0KICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAgICAvLyBGT0xERVIgRlVOQ1RJT05TDQogICAgDQogICAgLyoqDQogICAgKiBSZXR1cm5zIGEgZm9sZGVyIGxpc3RpbmcgZm9yIGEgc3BlY2lmaWMgT1UNCiAgICAqIFNlZSBodHRwOi8vYWRsZGFwLnNvdXJjZWZvcmdlLm5ldC93aWtpL2Rva3UucGhwP2lkPWFwaV9mb2xkZXJfZnVuY3Rpb25zDQogICAgKiANCiAgICAqIEBwYXJhbSBhcnJheSAkZm9sZGVyX25hbWUgQW4gYXJyYXkgdG8gdGhlIE9VIHlvdSB3aXNoIHRvIGxpc3QuIA0KICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBzZXQgdG8gTlVMTCB3aWxsIGxpc3QgdGhlIHJvb3QsIHN0cm9uZ2x5IHJlY29tbWVuZGVkIHRvIHNldCANCiAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJlY3Vyc2l2ZSB0byBmYWxzZSBpbiB0aGF0IGluc3RhbmNlIQ0KICAgICogQHBhcmFtIHN0cmluZyAkZG5fdHlwZSBUaGUgdHlwZSBvZiByZWNvcmQgdG8gbGlzdC4gIFRoaXMgY2FuIGJlIEFETERBUF9GT0xERVIgb3IgQURMREFQX0NPTlRBSU5FUi4NCiAgICAqIEBwYXJhbSBib29sICRyZWN1cnNpdmUgUmVjdXJzaXZlbHkgc2VhcmNoIHN1YiBmb2xkZXJzDQogICAgKiBAcGFyYW0gYm9vbCAkdHlwZSBTcGVjaWZ5IGEgdHlwZSBvZiBvYmplY3QgdG8gc2VhcmNoIGZvcg0KICAgICogQHJldHVybiBhcnJheQ0KICAgICovDQogICAgcHVibGljIGZ1bmN0aW9uIGZvbGRlcl9saXN0KCRmb2xkZXJfbmFtZSA9IE5VTEwsICRkbl90eXBlID0gQURMREFQX0ZPTERFUiwgJHJlY3Vyc2l2ZSA9IE5VTEwsICR0eXBlID0gTlVMTCkgew0KICAgICAgICBpZiAoJHJlY3Vyc2l2ZT09PU5VTEwpeyAkcmVjdXJzaXZlPSR0aGlzLT5fcmVjdXJzaXZlX2dyb3VwczsgfSAvL3VzZSB0aGUgZGVmYXVsdCBvcHRpb24gaWYgdGhleSBoYXZlbid0IHNldCBpdA0KICAgICAgICBpZiAoISR0aGlzLT5fYmluZCl7IHJldHVybiAoZmFsc2UpOyB9DQoNCiAgICAgICAgJGZpbHRlciA9ICcoJic7DQogICAgICAgIGlmICgkdHlwZSAhPT0gTlVMTCkgew0KICAgICAgICAgICAgc3dpdGNoICgkdHlwZSkgew0KICAgICAgICAgICAgICAgIGNhc2UgJ2NvbnRhY3QnOg0KICAgICAgICAgICAgICAgICAgICAkZmlsdGVyIC49ICcob2JqZWN0Q2xhc3M9Y29udGFjdCknOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICBjYXNlICdjb21wdXRlcic6DQogICAgICAgICAgICAgICAgICAgICRmaWx0ZXIgLj0gJyhvYmplY3RDbGFzcz1jb21wdXRlciknOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICBjYXNlICdncm91cCc6DQogICAgICAgICAgICAgICAgICAgICRmaWx0ZXIgLj0gJyhvYmplY3RDbGFzcz1ncm91cCknOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICBjYXNlICdmb2xkZXInOg0KICAgICAgICAgICAgICAgICAgICAkZmlsdGVyIC49ICcob2JqZWN0Q2xhc3M9b3JnYW5pemF0aW9uYWxVbml0KSc7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIGNhc2UgJ2NvbnRhaW5lcic6DQogICAgICAgICAgICAgICAgICAgICRmaWx0ZXIgLj0gJyhvYmplY3RDbGFzcz1jb250YWluZXIpJzsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgY2FzZSAnZG9tYWluJzoNCiAgICAgICAgICAgICAgICAgICAgJGZpbHRlciAuPSAnKG9iamVjdENsYXNzPWJ1aWx0aW5Eb21haW4pJzsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICAgICAgICAgJGZpbHRlciAuPSAnKG9iamVjdENsYXNzPXVzZXIpJzsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgDQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAkZmlsdGVyIC49ICcob2JqZWN0Q2xhc3M9KiknOyAgIA0KICAgICAgICB9DQogICAgICAgIC8vIElmIHRoZSBmb2xkZXIgbmFtZSBpcyBudWxsIHRoZW4gd2Ugd2lsbCBzZWFyY2ggdGhlIHJvb3QgbGV2ZWwgb2YgQUQNCiAgICAgICAgLy8gVGhpcyByZXF1aXJlcyB1cyB0byBub3QgaGF2ZSBhbiBPVT0gcGFydCwganVzdCB0aGUgYmFzZV9kbg0KICAgICAgICAkc2VhcmNob3UgPSAkdGhpcy0+X2Jhc2VfZG47DQogICAgICAgIGlmIChpc19hcnJheSgkZm9sZGVyX25hbWUpKSB7DQogICAgICAgICAgICAkb3UgPSAkZG5fdHlwZSAuICI9Ii5pbXBsb2RlKCIsIiAuICRkbl90eXBlIC4gIj0iLCRmb2xkZXJfbmFtZSk7DQogICAgICAgICAgICAkZmlsdGVyIC49ICcoIShkaXN0aW5ndWlzaGVkbmFtZT0nIC4gJG91IC4gJywnIC4gJHRoaXMtPl9iYXNlX2RuIC4gJykpKSc7DQogICAgICAgICAgICAkc2VhcmNob3UgPSAkb3UgLiAnLCcgLiAkdGhpcy0+X2Jhc2VfZG47DQogICAgICAgIH0NCiAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAkZmlsdGVyIC49ICcoIShkaXN0aW5ndWlzaGVkbmFtZT0nIC4gJHRoaXMtPl9iYXNlX2RuIC4gJykpKSc7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoJHJlY3Vyc2l2ZSA9PT0gdHJ1ZSkgew0KICAgICAgICAgICAgJHNyPWxkYXBfc2VhcmNoKCR0aGlzLT5fY29ubiwgJHNlYXJjaG91LCAkZmlsdGVyLCBhcnJheSgnb2JqZWN0Y2xhc3MnLCAnZGlzdGluZ3Vpc2hlZG5hbWUnLCAnc2FtYWNjb3VudG5hbWUnKSk7DQogICAgICAgICAgICAkZW50cmllcyA9IEBsZGFwX2dldF9lbnRyaWVzKCR0aGlzLT5fY29ubiwgJHNyKTsNCiAgICAgICAgICAgIGlmIChpc19hcnJheSgkZW50cmllcykpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gJGVudHJpZXM7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAkc3I9bGRhcF9saXN0KCR0aGlzLT5fY29ubiwgJHNlYXJjaG91LCAkZmlsdGVyLCBhcnJheSgnb2JqZWN0Y2xhc3MnLCAnZGlzdGluZ3Vpc2hlZG5hbWUnLCAnc2FtYWNjb3VudG5hbWUnKSk7DQogICAgICAgICAgICAkZW50cmllcyA9IEBsZGFwX2dldF9lbnRyaWVzKCR0aGlzLT5fY29ubiwgJHNyKTsNCiAgICAgICAgICAgIGlmIChpc19hcnJheSgkZW50cmllcykpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gJGVudHJpZXM7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIHJldHVybiBmYWxzZTsNCiAgICB9DQogICAgDQogICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAgIC8vIENPTVBVVEVSIEZVTkNUSU9OUw0KICAgIA0KICAgIC8qKg0KICAgICogR2V0IGluZm9ybWF0aW9uIGFib3V0IGEgc3BlY2lmaWMgY29tcHV0ZXINCiAgICAqIA0KICAgICogQHBhcmFtIHN0cmluZyAkY29tcHV0ZXJfbmFtZSBUaGUgbmFtZSBvZiB0aGUgY29tcHV0ZXINCiAgICAqIEBwYXJhbSBhcnJheSAkZmllbGRzIEF0dHJpYnV0ZXMgdG8gcmV0dXJuDQogICAgKiBAcmV0dXJuIGFycmF5DQogICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gY29tcHV0ZXJfaW5mbygkY29tcHV0ZXJfbmFtZSwkZmllbGRzPU5VTEwpew0KICAgICAgICBpZiAoJGNvbXB1dGVyX25hbWU9PT1OVUxMKXsgcmV0dXJuIChmYWxzZSk7IH0NCiAgICAgICAgaWYgKCEkdGhpcy0+X2JpbmQpeyByZXR1cm4gKGZhbHNlKTsgfQ0KDQogICAgICAgICRmaWx0ZXI9IigmKG9iamVjdENsYXNzPWNvbXB1dGVyKShjbj0iLiRjb21wdXRlcl9uYW1lLiIpKSI7DQogICAgICAgIGlmICgkZmllbGRzPT09TlVMTCl7ICRmaWVsZHM9YXJyYXkoIm1lbWJlcm9mIiwiY24iLCJkaXNwbGF5bmFtZSIsImRuc2hvc3RuYW1lIiwiZGlzdGluZ3Vpc2hlZG5hbWUiLCJvYmplY3RjYXRlZ29yeSIsIm9wZXJhdGluZ3N5c3RlbSIsIm9wZXJhdGluZ3N5c3RlbXNlcnZpY2VwYWNrIiwib3BlcmF0aW5nc3lzdGVtdmVyc2lvbiIpOyB9DQogICAgICAgICRzcj1sZGFwX3NlYXJjaCgkdGhpcy0+X2Nvbm4sJHRoaXMtPl9iYXNlX2RuLCRmaWx0ZXIsJGZpZWxkcyk7DQogICAgICAgICRlbnRyaWVzID0gbGRhcF9nZXRfZW50cmllcygkdGhpcy0+X2Nvbm4sICRzcik7DQogICAgICAgIA0KICAgICAgICByZXR1cm4gKCRlbnRyaWVzKTsNCiAgICB9DQogICAgDQogICAgLyoqDQogICAgKiBDaGVjayBpZiBhIGNvbXB1dGVyIGlzIGluIGEgZ3JvdXANCiAgICAqIA0KICAgICogQHBhcmFtIHN0cmluZyAkY29tcHV0ZXJfbmFtZSBUaGUgbmFtZSBvZiB0aGUgY29tcHV0ZXINCiAgICAqIEBwYXJhbSBzdHJpbmcgJGdyb3VwIFRoZSBncm91cCB0byBjaGVjaw0KICAgICogQHBhcmFtIGJvb2wgJHJlY3Vyc2l2ZSBXaGV0aGVyIHRvIGNoZWNrIHJlY3Vyc2l2ZWx5DQogICAgKiBAcmV0dXJuIGFycmF5DQogICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gY29tcHV0ZXJfaW5ncm91cCgkY29tcHV0ZXJfbmFtZSwkZ3JvdXAsJHJlY3Vyc2l2ZT1OVUxMKXsNCiAgICAgICAgaWYgKCRjb21wdXRlcl9uYW1lPT09TlVMTCl7IHJldHVybiAoZmFsc2UpOyB9DQogICAgICAgIGlmICgkZ3JvdXA9PT1OVUxMKXsgcmV0dXJuIChmYWxzZSk7IH0NCiAgICAgICAgaWYgKCEkdGhpcy0+X2JpbmQpeyByZXR1cm4gKGZhbHNlKTsgfQ0KICAgICAgICBpZiAoJHJlY3Vyc2l2ZT09PU5VTEwpeyAkcmVjdXJzaXZlPSR0aGlzLT5fcmVjdXJzaXZlX2dyb3VwczsgfSAvLyB1c2UgdGhlIGRlZmF1bHQgb3B0aW9uIGlmIHRoZXkgaGF2ZW4ndCBzZXQgaXQNCg0KICAgICAgICAvL2dldCBhIGxpc3Qgb2YgdGhlIGdyb3Vwcw0KICAgICAgICAkZ3JvdXBzPSR0aGlzLT5jb21wdXRlcl9ncm91cHMoJGNvbXB1dGVyX25hbWUsYXJyYXkoIm1lbWJlcm9mIiksJHJlY3Vyc2l2ZSk7DQoNCiAgICAgICAgLy9yZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGdyb3VwIGlzIGluIHRoZSBncm91cCBsaXN0DQogICAgICAgIGlmIChpbl9hcnJheSgkZ3JvdXAsJGdyb3VwcykpeyByZXR1cm4gKHRydWUpOyB9DQoNCiAgICAgICAgcmV0dXJuIChmYWxzZSk7DQogICAgfQ0KICAgIA0KICAgIC8qKg0KICAgICogR2V0IHRoZSBncm91cHMgYSBjb21wdXRlciBpcyBpbg0KICAgICogDQogICAgKiBAcGFyYW0gc3RyaW5nICRjb21wdXRlcl9uYW1lIFRoZSBuYW1lIG9mIHRoZSBjb21wdXRlcg0KICAgICogQHBhcmFtIGJvb2wgJHJlY3Vyc2l2ZSBXaGV0aGVyIHRvIGNoZWNrIHJlY3Vyc2l2ZWx5DQogICAgKiBAcmV0dXJuIGFycmF5DQogICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gY29tcHV0ZXJfZ3JvdXBzKCRjb21wdXRlcl9uYW1lLCRyZWN1cnNpdmU9TlVMTCl7DQogICAgICAgIGlmICgkY29tcHV0ZXJfbmFtZT09PU5VTEwpeyByZXR1cm4gKGZhbHNlKTsgfQ0KICAgICAgICBpZiAoJHJlY3Vyc2l2ZT09PU5VTEwpeyAkcmVjdXJzaXZlPSR0aGlzLT5fcmVjdXJzaXZlX2dyb3VwczsgfSAvL3VzZSB0aGUgZGVmYXVsdCBvcHRpb24gaWYgdGhleSBoYXZlbid0IHNldCBpdA0KICAgICAgICBpZiAoISR0aGlzLT5fYmluZCl7IHJldHVybiAoZmFsc2UpOyB9DQoNCiAgICAgICAgLy9zZWFyY2ggdGhlIGRpcmVjdG9yeSBmb3IgdGhlaXIgaW5mb3JtYXRpb24NCiAgICAgICAgJGluZm89QCR0aGlzLT5jb21wdXRlcl9pbmZvKCRjb21wdXRlcl9uYW1lLGFycmF5KCJtZW1iZXJvZiIsInByaW1hcnlncm91cGlkIikpOw0KICAgICAgICAkZ3JvdXBzPSR0aGlzLT5uaWNlX25hbWVzKCRpbmZvWzBdWyJtZW1iZXJvZiJdKTsgLy9wcmVzdW1pbmcgdGhlIGVudHJ5IHJldHVybmVkIGlzIG91ciBndXkgKHVuaXF1ZSB1c2VybmFtZXMpDQoNCiAgICAgICAgaWYgKCRyZWN1cnNpdmUgPT09IHRydWUpew0KICAgICAgICAgICAgZm9yZWFjaCAoJGdyb3VwcyBhcyAkaWQgPT4gJGdyb3VwX25hbWUpew0KICAgICAgICAgICAgICAkZXh0cmFfZ3JvdXBzPSR0aGlzLT5yZWN1cnNpdmVfZ3JvdXBzKCRncm91cF9uYW1lKTsNCiAgICAgICAgICAgICAgJGdyb3Vwcz1hcnJheV9tZXJnZSgkZ3JvdXBzLCRleHRyYV9ncm91cHMpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuICgkZ3JvdXBzKTsNCiAgICB9DQogICAgDQogICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAgICAvLyBFWENIQU5HRSBGVU5DVElPTlMNCiAgICANCiAgICAvKioNCiAgICAqIENyZWF0ZSBhbiBFeGNoYW5nZSBhY2NvdW50DQogICAgKiANCiAgICAqIEBwYXJhbSBzdHJpbmcgJHVzZXJuYW1lIFRoZSB1c2VybmFtZSBvZiB0aGUgdXNlciB0byBhZGQgdGhlIEV4Y2hhbmdlIGFjY291bnQgdG8NCiAgICAqIEBwYXJhbSBhcnJheSAkc3RvcmFnZWdyb3VwIFRoZSBtYWlsYm94LCBFeGNoYW5nZSBTdG9yYWdlIEdyb3VwLCBmb3IgdGhlIHVzZXIgYWNjb3VudCwgdGhpcyBtdXN0IGJlIGEgZnVsbCBDTg0KICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgdGhlIHN0b3JhZ2UgZ3JvdXAgaGFzIGEgZGlmZmVyZW50IGJhc2VfZG4gdG8gdGhlIGFkTERBUCBjb25maWd1cmF0aW9uLCBzZXQgaXQgdXNpbmcgJGJhc2VfZG4NCiAgICAqIEBwYXJhbSBzdHJpbmcgJGVtYWlsYWRkcmVzcyBUaGUgcHJpbWFyeSBlbWFpbCBhZGRyZXNzIHRvIGFkZCB0byB0aGlzIHVzZXINCiAgICAqIEBwYXJhbSBzdHJpbmcgJG1haWxuaWNrbmFtZSBUaGUgbWFpbCBuaWNrIG5hbWUuICBJZiBtYWlsIG5pY2tuYW1lIGlzIGJsYW5rLCB0aGUgdXNlcm5hbWUgd2lsbCBiZSB1c2VkDQogICAgKiBAcGFyYW0gYm9vbCAkdXNlZGVmYXVsdHMgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHN0b3JlIHNob3VsZCB1c2UgdGhlIGRlZmF1bHQgcXVvdGEsIHJhdGhlciB0aGFuIHRoZSBwZXItbWFpbGJveCBxdW90YS4NCiAgICAqIEBwYXJhbSBzdHJpbmcgJGJhc2VfZG4gU3BlY2lmeSBhbiBhbHRlcm5hdGl2ZSBiYXNlX2RuIGZvciB0aGUgRXhjaGFuZ2Ugc3RvcmFnZSBncm91cA0KICAgICogQHBhcmFtIGJvb2wgJGlzR1VJRCBJcyB0aGUgdXNlcm5hbWUgcGFzc2VkIGEgR1VJRCBvciBhIHNhbUFjY291bnROYW1lDQogICAgKiBAcmV0dXJuIGJvb2wNCiAgICAqLw0KICAgIHB1YmxpYyBmdW5jdGlvbiBleGNoYW5nZV9jcmVhdGVfbWFpbGJveCgkdXNlcm5hbWUsICRzdG9yYWdlZ3JvdXAsICRlbWFpbGFkZHJlc3MsICRtYWlsbmlja25hbWU9TlVMTCwgJHVzZWRlZmF1bHRzPVRSVUUsICRiYXNlX2RuPU5VTEwsICRpc0dVSUQ9ZmFsc2Upew0KICAgICAgICBpZiAoJHVzZXJuYW1lPT09TlVMTCl7IHJldHVybiAoIk1pc3NpbmcgY29tcHVsc29yeSBmaWVsZCBbdXNlcm5hbWVdIik7IH0gICAgIA0KICAgICAgICBpZiAoJHN0b3JhZ2Vncm91cD09PU5VTEwpeyByZXR1cm4gKCJNaXNzaW5nIGNvbXB1bHNvcnkgYXJyYXkgW3N0b3JhZ2Vncm91cF0iKTsgfQ0KICAgICAgICBpZiAoIWlzX2FycmF5KCRzdG9yYWdlZ3JvdXApKXsgcmV0dXJuICgiW3N0b3JhZ2Vncm91cF0gbXVzdCBiZSBhbiBhcnJheSIpOyB9DQogICAgICAgIGlmICgkZW1haWxhZGRyZXNzPT09TlVMTCl7IHJldHVybiAoIk1pc3NpbmcgY29tcHVsc29yeSBmaWVsZCBbZW1haWxhZGRyZXNzXSIpOyB9DQogICAgICAgIA0KICAgICAgICBpZiAoJGJhc2VfZG49PT1OVUxMKSB7DQogICAgICAgICAgICAkYmFzZV9kbiA9ICR0aGlzLT5fYmFzZV9kbjsgICANCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgJGNvbnRhaW5lcj0iQ049Ii5pbXBsb2RlKCIsQ049Iiwkc3RvcmFnZWdyb3VwKTsNCiAgICAgICAgDQogICAgICAgIGlmICgkbWFpbG5pY2tuYW1lPT09TlVMTCkgeyAkbWFpbG5pY2tuYW1lPSR1c2VybmFtZTsgfQ0KICAgICAgICAkbWRiVXNlRGVmYXVsdHMgPSAkdGhpcy0+Ym9vbDJzdHIoJHVzZWRlZmF1bHRzKTsNCiAgICAgICAgDQogICAgICAgICRhdHRyaWJ1dGVzID0gYXJyYXkoDQogICAgICAgICAgICAnZXhjaGFuZ2VfaG9tZW1kYic9PiRjb250YWluZXIuIiwiLiRiYXNlX2RuLA0KICAgICAgICAgICAgJ2V4Y2hhbmdlX3Byb3h5YWRkcmVzcyc9PidTTVRQOicgLiAkZW1haWxhZGRyZXNzLA0KICAgICAgICAgICAgJ2V4Y2hhbmdlX21haWxuaWNrbmFtZSc9PiRtYWlsbmlja25hbWUsDQogICAgICAgICAgICAnZXhjaGFuZ2VfdXNlZGVmYXVsdHMnPT4kbWRiVXNlRGVmYXVsdHMNCiAgICAgICAgKTsNCiAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT51c2VyX21vZGlmeSgkdXNlcm5hbWUsJGF0dHJpYnV0ZXMsJGlzR1VJRCk7DQogICAgICAgIGlmICgkcmVzdWx0PT1mYWxzZSl7IHJldHVybiAoZmFsc2UpOyB9DQogICAgICAgIHJldHVybiAodHJ1ZSk7DQogICAgfQ0KICAgIA0KICAgIC8qKg0KICAgICogQWRkIGFuIFg0MDAgYWRkcmVzcyB0byBFeGNoYW5nZQ0KICAgICogU2VlIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzE2ODUgZm9yIG1vcmUgaW5mb3JtYXRpb24uDQogICAgKiBBbiBYNDAwIEFkZHJlc3MgbG9va3Mgc2ltaWxhciB0byB0aGlzIFg0MDA6Yz1VUzthPSA7cD1Eb21haW47bz1Pcmdhbml6YXRpb247cz1Eb2U7Zz1Kb2huOw0KICAgICogDQogICAgKiBAcGFyYW0gc3RyaW5nICR1c2VybmFtZSBUaGUgdXNlcm5hbWUgb2YgdGhlIHVzZXIgdG8gYWRkIHRoZSBYNDAwIHRvIHRvDQogICAgKiBAcGFyYW0gc3RyaW5nICRjb3VudHJ5IENvdW50cnkNCiAgICAqIEBwYXJhbSBzdHJpbmcgJGFkbWQgQWRtaW5pc3RyYXRpb24gTWFuYWdlbWVudCBEb21haW4NCiAgICAqIEBwYXJhbSBzdHJpbmcgJHBkbWQgUHJpdmF0ZSBNYW5hZ2VtZW50IERvbWFpbiAob2Z0ZW4geW91ciBBRCBkb21haW4pDQogICAgKiBAcGFyYW0gc3RyaW5nICRvcmcgT3JnYW5pemF0aW9uDQogICAgKiBAcGFyYW0gc3RyaW5nICRzdXJuYW1lIFN1cm5hbWUNCiAgICAqIEBwYXJhbSBzdHJpbmcgJGdpdmVuTmFtZSBHaXZlbiBuYW1lDQogICAgKiBAcGFyYW0gYm9vbCAkaXNHVUlEIElzIHRoZSB1c2VybmFtZSBwYXNzZWQgYSBHVUlEIG9yIGEgc2FtQWNjb3VudE5hbWUNCiAgICAqIEByZXR1cm4gYm9vbA0KICAgICovDQogICAgcHVibGljIGZ1bmN0aW9uIGV4Y2hhbmdlX2FkZF9YNDAwKCR1c2VybmFtZSwgJGNvdW50cnksICRhZG1kLCAkcGRtZCwgJG9yZywgJHN1cm5hbWUsICRnaXZlbm5hbWUsICRpc0dVSUQ9ZmFsc2UpIHsNCiAgICAgICAgaWYgKCR1c2VybmFtZT09PU5VTEwpeyByZXR1cm4gKCJNaXNzaW5nIGNvbXB1bHNvcnkgZmllbGQgW3VzZXJuYW1lXSIpOyB9ICAgICANCiAgICAgICAgDQogICAgICAgICRwcm94eXZhbHVlID0gJ1g0MDA6JzsNCiAgICAgICAgICAgIA0KICAgICAgICAvLyBGaW5kIHRoZSBkbiBvZiB0aGUgdXNlcg0KICAgICAgICAkdXNlcj0kdGhpcy0+dXNlcl9pbmZvKCR1c2VybmFtZSxhcnJheSgiY24iLCJwcm94eWFkZHJlc3NlcyIpLCAkaXNHVUlEKTsNCiAgICAgICAgaWYgKCR1c2VyWzBdWyJkbiJdPT09TlVMTCl7IHJldHVybiAoZmFsc2UpOyB9DQogICAgICAgICR1c2VyX2RuPSR1c2VyWzBdWyJkbiJdOw0KICAgICAgICANCiAgICAgICAgLy8gV2UgZG8gbm90IGhhdmUgdG8gZGVtb3RlIGFuIGVtYWlsIGFkZHJlc3MgZnJvbSB0aGUgZGVmYXVsdCBzbyB3ZSBjYW4ganVzdCBhZGQgdGhlIG5ldyBwcm94eSBhZGRyZXNzDQogICAgICAgICRhdHRyaWJ1dGVzWydleGNoYW5nZV9wcm94eWFkZHJlc3MnXSA9ICRwcm94eXZhbHVlIC4gJ2M9JyAuICRjb3VudHJ5IC4gJzthPScgLiAkYWRtZCAuICc7cD0nIC4gJHBkbWQgLiAnO289JyAuICRvcmcgLiAnO3M9JyAuICRzdXJuYW1lIC4gJztnPScgLiAkZ2l2ZW5uYW1lIC4gJzsnOw0KICAgICAgIA0KICAgICAgICAvLyBUcmFuc2xhdGUgdGhlIHVwZGF0ZSB0byB0aGUgTERBUCBzY2hlbWEgICAgICAgICAgICAgICAgDQogICAgICAgICRhZGQ9JHRoaXMtPmFkbGRhcF9zY2hlbWEoJGF0dHJpYnV0ZXMpOw0KICAgICAgICANCiAgICAgICAgaWYgKCEkYWRkKXsgcmV0dXJuIChmYWxzZSk7IH0NCiAgICAgICAgDQogICAgICAgIC8vIERvIHRoZSB1cGRhdGUNCiAgICAgICAgLy8gVGFrZSBvdXQgdGhlIEAgdG8gc2VlIGFueSBlcnJvcnMsIHVzdWFsbHkgdGhpcyBlcnJvciBtaWdodCBvY2N1ciBiZWNhdXNlIHRoZSBhZGRyZXNzIGFscmVhZHkNCiAgICAgICAgLy8gZXhpc3RzIGluIHRoZSBsaXN0IG9mIHByb3h5QWRkcmVzc2VzDQogICAgICAgICRyZXN1bHQ9QGxkYXBfbW9kX2FkZCgkdGhpcy0+X2Nvbm4sJHVzZXJfZG4sJGFkZCk7DQogICAgICAgIGlmICgkcmVzdWx0PT1mYWxzZSl7IHJldHVybiAoZmFsc2UpOyB9DQogICAgICAgIA0KICAgICAgICByZXR1cm4gKHRydWUpOw0KICAgIH0NCiAgICANCiAgICAvKioNCiAgICAqIEFkZCBhbiBhZGRyZXNzIHRvIEV4Y2hhbmdlDQogICAgKiANCiAgICAqIEBwYXJhbSBzdHJpbmcgJHVzZXJuYW1lIFRoZSB1c2VybmFtZSBvZiB0aGUgdXNlciB0byBhZGQgdGhlIEV4Y2hhbmdlIGFjY291bnQgdG8NCiAgICAqIEBwYXJhbSBzdHJpbmcgJGVtYWlsYWRkcmVzcyBUaGUgZW1haWwgYWRkcmVzcyB0byBhZGQgdG8gdGhpcyB1c2VyDQogICAgKiBAcGFyYW0gYm9vbCAkZGVmYXVsdCBNYWtlIHRoaXMgZW1haWwgYWRkcmVzcyB0aGUgZGVmYXVsdCBhZGRyZXNzLCB0aGlzIGlzIGEgYml0IG1vcmUgaW50ZW5zaXZlIGFzIHdlIGhhdmUgdG8gZGVtb3RlIGFueSBleGlzdGluZyBkZWZhdWx0IGFkZHJlc3Nlcw0KICAgICogQHBhcmFtIGJvb2wgJGlzR1VJRCBJcyB0aGUgdXNlcm5hbWUgcGFzc2VkIGEgR1VJRCBvciBhIHNhbUFjY291bnROYW1lDQogICAgKiBAcmV0dXJuIGJvb2wNCiAgICAqLw0KICAgIHB1YmxpYyBmdW5jdGlvbiBleGNoYW5nZV9hZGRfYWRkcmVzcygkdXNlcm5hbWUsICRlbWFpbGFkZHJlc3MsICRkZWZhdWx0PUZBTFNFLCAkaXNHVUlEPWZhbHNlKSB7DQogICAgICAgIGlmICgkdXNlcm5hbWU9PT1OVUxMKXsgcmV0dXJuICgiTWlzc2luZyBjb21wdWxzb3J5IGZpZWxkIFt1c2VybmFtZV0iKTsgfSAgICAgDQogICAgICAgIGlmICgkZW1haWxhZGRyZXNzPT09TlVMTCkgeyByZXR1cm4gKCJNaXNzaW5nIGNvbXB1bHNvcnkgZmllbGRzIFtlbWFpbGFkZHJlc3NdIik7IH0NCiAgICAgICAgDQogICAgICAgICRwcm94eXZhbHVlID0gJ3NtdHA6JzsNCiAgICAgICAgaWYgKCRkZWZhdWx0ID09PSB0cnVlKSB7DQogICAgICAgICAgICAkcHJveHl2YWx1ZSA9ICdTTVRQOic7DQogICAgICAgIH0NCiAgICAgICAgICAgICAgDQogICAgICAgIC8vIEZpbmQgdGhlIGRuIG9mIHRoZSB1c2VyDQogICAgICAgICR1c2VyPSR0aGlzLT51c2VyX2luZm8oJHVzZXJuYW1lLGFycmF5KCJjbiIsInByb3h5YWRkcmVzc2VzIiksJGlzR1VJRCk7DQogICAgICAgIGlmICgkdXNlclswXVsiZG4iXT09PU5VTEwpeyByZXR1cm4gKGZhbHNlKTsgfQ0KICAgICAgICAkdXNlcl9kbj0kdXNlclswXVsiZG4iXTsNCiAgICAgICAgDQogICAgICAgIC8vIFdlIG5lZWQgdG8gc2NhbiBleGlzdGluZyBwcm94eSBhZGRyZXNzZXMgYW5kIGRlbW90ZSB0aGUgZGVmYXVsdCBvbmUNCiAgICAgICAgaWYgKGlzX2FycmF5KCR1c2VyWzBdWyJwcm94eWFkZHJlc3NlcyJdKSAmJiAkZGVmYXVsdD09PXRydWUpIHsNCiAgICAgICAgICAgICRtb2RhZGRyZXNzZXMgPSBhcnJheSgpOw0KICAgICAgICAgICAgZm9yICgkaT0wOyRpPHNpemVvZigkdXNlclswXVsncHJveHlhZGRyZXNzZXMnXSk7JGkrKykgew0KICAgICAgICAgICAgICAgIGlmIChzdHJzdHIoJHVzZXJbMF1bJ3Byb3h5YWRkcmVzc2VzJ11bJGldLCAnU01UUDonKSAhPT0gZmFsc2UpIHsNCiAgICAgICAgICAgICAgICAgICAgJHVzZXJbMF1bJ3Byb3h5YWRkcmVzc2VzJ11bJGldID0gc3RyX3JlcGxhY2UoJ1NNVFA6JywgJ3NtdHA6JywgJHVzZXJbMF1bJ3Byb3h5YWRkcmVzc2VzJ11bJGldKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgaWYgKCR1c2VyWzBdWydwcm94eWFkZHJlc3NlcyddWyRpXSAhPSAnJykgew0KICAgICAgICAgICAgICAgICAgICAkbW9kYWRkcmVzc2VzWydwcm94eUFkZHJlc3NlcyddWyRpXSA9ICR1c2VyWzBdWydwcm94eWFkZHJlc3NlcyddWyRpXTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICAkbW9kYWRkcmVzc2VzWydwcm94eUFkZHJlc3NlcyddWyhzaXplb2YoJHVzZXJbMF1bJ3Byb3h5YWRkcmVzc2VzJ10pLTEpXSA9ICdTTVRQOicgLiAkZW1haWxhZGRyZXNzOw0KICAgICAgICAgICAgDQogICAgICAgICAgICAkcmVzdWx0PUBsZGFwX21vZF9yZXBsYWNlKCR0aGlzLT5fY29ubiwkdXNlcl9kbiwkbW9kYWRkcmVzc2VzKTsNCiAgICAgICAgICAgIGlmICgkcmVzdWx0PT1mYWxzZSl7IHJldHVybiAoZmFsc2UpOyB9DQogICAgICAgICAgICANCiAgICAgICAgICAgIHJldHVybiAodHJ1ZSk7DQogICAgICAgIH0NCiAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAvLyBXZSBkbyBub3QgaGF2ZSB0byBkZW1vdGUgYW4gZW1haWwgYWRkcmVzcyBmcm9tIHRoZSBkZWZhdWx0IHNvIHdlIGNhbiBqdXN0IGFkZCB0aGUgbmV3IHByb3h5IGFkZHJlc3MNCiAgICAgICAgICAgICRhdHRyaWJ1dGVzWydleGNoYW5nZV9wcm94eWFkZHJlc3MnXSA9ICRwcm94eXZhbHVlIC4gJGVtYWlsYWRkcmVzczsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgLy8gVHJhbnNsYXRlIHRoZSB1cGRhdGUgdG8gdGhlIExEQVAgc2NoZW1hICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgJGFkZD0kdGhpcy0+YWRsZGFwX3NjaGVtYSgkYXR0cmlidXRlcyk7DQogICAgICAgICAgICANCiAgICAgICAgICAgIGlmICghJGFkZCl7IHJldHVybiAoZmFsc2UpOyB9DQogICAgICAgICAgICANCiAgICAgICAgICAgIC8vIERvIHRoZSB1cGRhdGUNCiAgICAgICAgICAgIC8vIFRha2Ugb3V0IHRoZSBAIHRvIHNlZSBhbnkgZXJyb3JzLCB1c3VhbGx5IHRoaXMgZXJyb3IgbWlnaHQgb2NjdXIgYmVjYXVzZSB0aGUgYWRkcmVzcyBhbHJlYWR5DQogICAgICAgICAgICAvLyBleGlzdHMgaW4gdGhlIGxpc3Qgb2YgcHJveHlBZGRyZXNzZXMNCiAgICAgICAgICAgICRyZXN1bHQ9QGxkYXBfbW9kX2FkZCgkdGhpcy0+X2Nvbm4sJHVzZXJfZG4sJGFkZCk7DQogICAgICAgICAgICBpZiAoJHJlc3VsdD09ZmFsc2UpeyByZXR1cm4gKGZhbHNlKTsgfQ0KICAgICAgICAgICAgDQogICAgICAgICAgICByZXR1cm4gKHRydWUpOw0KICAgICAgICB9DQogICAgfQ0KICAgIA0KICAgIC8qKg0KICAgICogUmVtb3ZlIGFuIGFkZHJlc3MgdG8gRXhjaGFuZ2UNCiAgICAqIElmIHlvdSByZW1vdmUgYSBkZWZhdWx0IGFkZHJlc3MgdGhlIGFjY291bnQgd2lsbCBubyBsb25nZXIgaGF2ZSBhIGRlZmF1bHQsIA0KICAgICogd2UgcmVjb21tZW5kIGNoYW5naW5nIHRoZSBkZWZhdWx0IGFkZHJlc3MgZmlyc3QNCiAgICAqIA0KICAgICogQHBhcmFtIHN0cmluZyAkdXNlcm5hbWUgVGhlIHVzZXJuYW1lIG9mIHRoZSB1c2VyIHRvIGFkZCB0aGUgRXhjaGFuZ2UgYWNjb3VudCB0bw0KICAgICogQHBhcmFtIHN0cmluZyAkZW1haWxhZGRyZXNzIFRoZSBlbWFpbCBhZGRyZXNzIHRvIGFkZCB0byB0aGlzIHVzZXINCiAgICAqIEBwYXJhbSBib29sICRpc0dVSUQgSXMgdGhlIHVzZXJuYW1lIHBhc3NlZCBhIEdVSUQgb3IgYSBzYW1BY2NvdW50TmFtZQ0KICAgICogQHJldHVybiBib29sDQogICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gZXhjaGFuZ2VfZGVsX2FkZHJlc3MoJHVzZXJuYW1lLCAkZW1haWxhZGRyZXNzLCAkaXNHVUlEPWZhbHNlKSB7DQogICAgICAgIGlmICgkdXNlcm5hbWU9PT1OVUxMKXsgcmV0dXJuICgiTWlzc2luZyBjb21wdWxzb3J5IGZpZWxkIFt1c2VybmFtZV0iKTsgfSAgICAgDQogICAgICAgIGlmICgkZW1haWxhZGRyZXNzPT09TlVMTCkgeyByZXR1cm4gKCJNaXNzaW5nIGNvbXB1bHNvcnkgZmllbGRzIFtlbWFpbGFkZHJlc3NdIik7IH0NCiAgICAgICAgDQogICAgICAgIC8vIEZpbmQgdGhlIGRuIG9mIHRoZSB1c2VyDQogICAgICAgICR1c2VyPSR0aGlzLT51c2VyX2luZm8oJHVzZXJuYW1lLGFycmF5KCJjbiIsInByb3h5YWRkcmVzc2VzIiksJGlzR1VJRCk7DQogICAgICAgIGlmICgkdXNlclswXVsiZG4iXT09PU5VTEwpeyByZXR1cm4gKGZhbHNlKTsgfQ0KICAgICAgICAkdXNlcl9kbj0kdXNlclswXVsiZG4iXTsNCiAgICAgICAgDQogICAgICAgIGlmIChpc19hcnJheSgkdXNlclswXVsicHJveHlhZGRyZXNzZXMiXSkpIHsNCiAgICAgICAgICAgICRtb2QgPSBhcnJheSgpOw0KICAgICAgICAgICAgZm9yICgkaT0wOyRpPHNpemVvZigkdXNlclswXVsncHJveHlhZGRyZXNzZXMnXSk7JGkrKykgew0KICAgICAgICAgICAgICAgIGlmIChzdHJzdHIoJHVzZXJbMF1bJ3Byb3h5YWRkcmVzc2VzJ11bJGldLCAnU01UUDonKSAhPT0gZmFsc2UgJiYgJHVzZXJbMF1bJ3Byb3h5YWRkcmVzc2VzJ11bJGldID09ICdTTVRQOicgLiAkZW1haWxhZGRyZXNzKSB7DQogICAgICAgICAgICAgICAgICAgICRtb2RbJ3Byb3h5QWRkcmVzc2VzJ11bMF0gPSAnU01UUDonIC4gJGVtYWlsYWRkcmVzczsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZWlmIChzdHJzdHIoJHVzZXJbMF1bJ3Byb3h5YWRkcmVzc2VzJ11bJGldLCAnc210cDonKSAhPT0gZmFsc2UgJiYgJHVzZXJbMF1bJ3Byb3h5YWRkcmVzc2VzJ11bJGldID09ICdzbXRwOicgLiAkZW1haWxhZGRyZXNzKSB7DQogICAgICAgICAgICAgICAgICAgICRtb2RbJ3Byb3h5QWRkcmVzc2VzJ11bMF0gPSAnc210cDonIC4gJGVtYWlsYWRkcmVzczsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICANCiAgICAgICAgICAgICRyZXN1bHQ9QGxkYXBfbW9kX2RlbCgkdGhpcy0+X2Nvbm4sJHVzZXJfZG4sJG1vZCk7DQogICAgICAgICAgICBpZiAoJHJlc3VsdD09ZmFsc2UpeyByZXR1cm4gKGZhbHNlKTsgfQ0KICAgICAgICAgICAgDQogICAgICAgICAgICByZXR1cm4gKHRydWUpOw0KICAgICAgICB9DQogICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7DQogICAgICAgIH0NCiAgICB9DQogICAgLyoqDQogICAgKiBDaGFuZ2UgdGhlIGRlZmF1bHQgYWRkcmVzcw0KICAgICogDQogICAgKiBAcGFyYW0gc3RyaW5nICR1c2VybmFtZSBUaGUgdXNlcm5hbWUgb2YgdGhlIHVzZXIgdG8gYWRkIHRoZSBFeGNoYW5nZSBhY2NvdW50IHRvDQogICAgKiBAcGFyYW0gc3RyaW5nICRlbWFpbGFkZHJlc3MgVGhlIGVtYWlsIGFkZHJlc3MgdG8gbWFrZSBkZWZhdWx0DQogICAgKiBAcGFyYW0gYm9vbCAkaXNHVUlEIElzIHRoZSB1c2VybmFtZSBwYXNzZWQgYSBHVUlEIG9yIGEgc2FtQWNjb3VudE5hbWUNCiAgICAqIEByZXR1cm4gYm9vbA0KICAgICovDQogICAgcHVibGljIGZ1bmN0aW9uIGV4Y2hhbmdlX3ByaW1hcnlfYWRkcmVzcygkdXNlcm5hbWUsICRlbWFpbGFkZHJlc3MsICRpc0dVSUQ9ZmFsc2UpIHsNCiAgICAgICAgaWYgKCR1c2VybmFtZT09PU5VTEwpeyByZXR1cm4gKCJNaXNzaW5nIGNvbXB1bHNvcnkgZmllbGQgW3VzZXJuYW1lXSIpOyB9ICAgICANCiAgICAgICAgaWYgKCRlbWFpbGFkZHJlc3M9PT1OVUxMKSB7IHJldHVybiAoIk1pc3NpbmcgY29tcHVsc29yeSBmaWVsZHMgW2VtYWlsYWRkcmVzc10iKTsgfQ0KICAgICAgICANCiAgICAgICAgLy8gRmluZCB0aGUgZG4gb2YgdGhlIHVzZXINCiAgICAgICAgJHVzZXI9JHRoaXMtPnVzZXJfaW5mbygkdXNlcm5hbWUsYXJyYXkoImNuIiwicHJveHlhZGRyZXNzZXMiKSwgJGlzR1VJRCk7DQogICAgICAgIGlmICgkdXNlclswXVsiZG4iXT09PU5VTEwpeyByZXR1cm4gKGZhbHNlKTsgfQ0KICAgICAgICAkdXNlcl9kbj0kdXNlclswXVsiZG4iXTsNCiAgICAgICAgDQogICAgICAgIGlmIChpc19hcnJheSgkdXNlclswXVsicHJveHlhZGRyZXNzZXMiXSkpIHsNCiAgICAgICAgICAgICRtb2RhZGRyZXNzZXMgPSBhcnJheSgpOw0KICAgICAgICAgICAgZm9yICgkaT0wOyRpPHNpemVvZigkdXNlclswXVsncHJveHlhZGRyZXNzZXMnXSk7JGkrKykgew0KICAgICAgICAgICAgICAgIGlmIChzdHJzdHIoJHVzZXJbMF1bJ3Byb3h5YWRkcmVzc2VzJ11bJGldLCAnU01UUDonKSAhPT0gZmFsc2UpIHsNCiAgICAgICAgICAgICAgICAgICAgJHVzZXJbMF1bJ3Byb3h5YWRkcmVzc2VzJ11bJGldID0gc3RyX3JlcGxhY2UoJ1NNVFA6JywgJ3NtdHA6JywgJHVzZXJbMF1bJ3Byb3h5YWRkcmVzc2VzJ11bJGldKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgaWYgKCR1c2VyWzBdWydwcm94eWFkZHJlc3NlcyddWyRpXSA9PSAnc210cDonIC4gJGVtYWlsYWRkcmVzcykgew0KICAgICAgICAgICAgICAgICAgICAkdXNlclswXVsncHJveHlhZGRyZXNzZXMnXVskaV0gPSBzdHJfcmVwbGFjZSgnc210cDonLCAnU01UUDonLCAkdXNlclswXVsncHJveHlhZGRyZXNzZXMnXVskaV0pOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAoJHVzZXJbMF1bJ3Byb3h5YWRkcmVzc2VzJ11bJGldICE9ICcnKSB7DQogICAgICAgICAgICAgICAgICAgICRtb2RhZGRyZXNzZXNbJ3Byb3h5QWRkcmVzc2VzJ11bJGldID0gJHVzZXJbMF1bJ3Byb3h5YWRkcmVzc2VzJ11bJGldOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgJHJlc3VsdD1AbGRhcF9tb2RfcmVwbGFjZSgkdGhpcy0+X2Nvbm4sJHVzZXJfZG4sJG1vZGFkZHJlc3Nlcyk7DQogICAgICAgICAgICBpZiAoJHJlc3VsdD09ZmFsc2UpeyByZXR1cm4gKGZhbHNlKTsgfQ0KICAgICAgICAgICAgDQogICAgICAgICAgICByZXR1cm4gKHRydWUpOw0KICAgICAgICB9DQogICAgICAgIA0KICAgIH0NCiAgICANCiAgICAvKioNCiAgICAqIE1haWwgZW5hYmxlIGEgY29udGFjdA0KICAgICogQWxsb3dzIGVtYWlsIHRvIGJlIHNlbnQgdG8gdGhlbSB0aHJvdWdoIEV4Y2hhbmdlDQogICAgKiANCiAgICAqIEBwYXJhbSBzdHJpbmcgJGRpc3Rpbmd1aXNoZWRuYW1lIFRoZSBjb250YWN0IHRvIG1haWwgZW5hYmxlDQogICAgKiBAcGFyYW0gc3RyaW5nICRlbWFpbGFkZHJlc3MgVGhlIGVtYWlsIGFkZHJlc3MgdG8gYWxsb3cgZW1haWxzIHRvIGJlIHNlbnQgdGhyb3VnaA0KICAgICogQHBhcmFtIHN0cmluZyAkbWFpbG5pY2tuYW1lIFRoZSBtYWlsbmlja25hbWUgZm9yIHRoZSBjb250YWN0IGluIEV4Y2hhbmdlLiAgSWYgTlVMTCB0aGlzIHdpbGwgYmUgc2V0IHRvIHRoZSBkaXNwbGF5IG5hbWUNCiAgICAqIEByZXR1cm4gYm9vbA0KICAgICovDQogICAgcHVibGljIGZ1bmN0aW9uIGV4Y2hhbmdlX2NvbnRhY3RfbWFpbGVuYWJsZSgkZGlzdGluZ3Vpc2hlZG5hbWUsICRlbWFpbGFkZHJlc3MsICRtYWlsbmlja25hbWU9TlVMTCl7DQogICAgICAgIGlmICgkZGlzdGluZ3Vpc2hlZG5hbWU9PT1OVUxMKXsgcmV0dXJuICgiTWlzc2luZyBjb21wdWxzb3J5IGZpZWxkIFtkaXN0aW5ndWlzaGVkbmFtZV0iKTsgfSAgIA0KICAgICAgICBpZiAoJGVtYWlsYWRkcmVzcz09PU5VTEwpeyByZXR1cm4gKCJNaXNzaW5nIGNvbXB1bHNvcnkgZmllbGQgW2VtYWlsYWRkcmVzc10iKTsgfSAgDQogICAgICAgIA0KICAgICAgICBpZiAoJG1haWxuaWNrbmFtZSAhPT0gTlVMTCkgew0KICAgICAgICAgICAgLy8gRmluZCB0aGUgZG4gb2YgdGhlIHVzZXINCiAgICAgICAgICAgICR1c2VyPSR0aGlzLT5jb250YWN0X2luZm8oJGRpc3Rpbmd1aXNoZWRuYW1lLGFycmF5KCJjbiIsImRpc3BsYXluYW1lIikpOw0KICAgICAgICAgICAgaWYgKCR1c2VyWzBdWyJkaXNwbGF5bmFtZSJdPT09TlVMTCl7IHJldHVybiAoZmFsc2UpOyB9DQogICAgICAgICAgICAkbWFpbG5pY2tuYW1lID0gJHVzZXJbMF1bJ2Rpc3BsYXluYW1lJ11bMF07DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgICRhdHRyaWJ1dGVzID0gYXJyYXkoImVtYWlsIj0+JGVtYWlsYWRkcmVzcywiY29udGFjdF9lbWFpbCI9PiJTTVRQOiIgLiAkZW1haWxhZGRyZXNzLCJleGNoYW5nZV9wcm94eWFkZHJlc3MiPT4iU01UUDoiIC4gJGVtYWlsYWRkcmVzcywiZXhjaGFuZ2VfbWFpbG5pY2tuYW1lIj0+JG1haWxuaWNrbmFtZSk7DQogICAgICAgICANCiAgICAgICAgLy8gVHJhbnNsYXRlIHRoZSB1cGRhdGUgdG8gdGhlIExEQVAgc2NoZW1hICAgICAgICAgICAgICAgIA0KICAgICAgICAkbW9kPSR0aGlzLT5hZGxkYXBfc2NoZW1hKCRhdHRyaWJ1dGVzKTsNCiAgICAgICAgDQogICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGlzIGlzIGFuIGVuYWJsZWQgc3RhdHVzIHVwZGF0ZQ0KICAgICAgICBpZiAoISRtb2QpeyByZXR1cm4gKGZhbHNlKTsgfQ0KICAgICAgICANCiAgICAgICAgLy8gRG8gdGhlIHVwZGF0ZQ0KICAgICAgICAkcmVzdWx0PWxkYXBfbW9kaWZ5KCR0aGlzLT5fY29ubiwkZGlzdGluZ3Vpc2hlZG5hbWUsJG1vZCk7DQogICAgICAgIGlmICgkcmVzdWx0PT1mYWxzZSl7IHJldHVybiAoZmFsc2UpOyB9DQogICAgICAgIA0KICAgICAgICByZXR1cm4gKHRydWUpOw0KICAgIH0NCiAgICANCiAgICAvKioNCiAgICAqIFJldHVybnMgYSBsaXN0IG9mIEV4Y2hhbmdlIFNlcnZlcnMgaW4gdGhlIENvbmZpZ3VyYXRpb25OYW1pbmdDb250ZXh0IG9mIHRoZSBkb21haW4NCiAgICAqIA0KICAgICogQHBhcmFtIGFycmF5ICRhdHRyaWJ1dGVzIEFuIGFycmF5IG9mIHRoZSBBRCBhdHRyaWJ1dGVzIHlvdSB3aXNoIHRvIHJldHVybg0KICAgICogQHJldHVybiBhcnJheQ0KICAgICovDQogICAgcHVibGljIGZ1bmN0aW9uIGV4Y2hhbmdlX3NlcnZlcnMoJGF0dHJpYnV0ZXMgPSBhcnJheSgnY24nLCdkaXN0aW5ndWlzaGVkbmFtZScsJ3NlcmlhbG51bWJlcicpKSB7DQogICAgICAgIGlmICghJHRoaXMtPl9iaW5kKXsgcmV0dXJuIChmYWxzZSk7IH0NCiAgICAgICAgDQogICAgICAgICRjb25maWd1cmF0aW9uTmFtaW5nQ29udGV4dCA9ICR0aGlzLT5nZXRfcm9vdF9kc2UoYXJyYXkoJ2NvbmZpZ3VyYXRpb25uYW1pbmdjb250ZXh0JykpOw0KICAgICAgICAkc3IgPSBAbGRhcF9zZWFyY2goJHRoaXMtPl9jb25uLCRjb25maWd1cmF0aW9uTmFtaW5nQ29udGV4dFswXVsnY29uZmlndXJhdGlvbm5hbWluZ2NvbnRleHQnXVswXSwnKCYob2JqZWN0Q2F0ZWdvcnk9bXNFeGNoRXhjaGFuZ2VTZXJ2ZXIpKScsJGF0dHJpYnV0ZXMpOw0KICAgICAgICAkZW50cmllcyA9IEBsZGFwX2dldF9lbnRyaWVzKCR0aGlzLT5fY29ubiwgJHNyKTsNCiAgICAgICAgcmV0dXJuICRlbnRyaWVzOw0KICAgIH0NCiAgICANCiAgICAvKioNCiAgICAqIFJldHVybnMgYSBsaXN0IG9mIFN0b3JhZ2UgR3JvdXBzIGluIEV4Y2hhbmdlIGZvciBhIGdpdmVuIG1haWwgc2VydmVyDQogICAgKiANCiAgICAqIEBwYXJhbSBzdHJpbmcgJGV4Y2hhbmdlU2VydmVyIFRoZSBmdWxsIEROIG9mIGFuIEV4Y2hhbmdlIHNlcnZlci4gIFlvdSBjYW4gdXNlIGV4Y2hhbmdlX3NlcnZlcnMoKSB0byBmaW5kIHRoZSBETiBmb3IgeW91ciBzZXJ2ZXINCiAgICAqIEBwYXJhbSBhcnJheSAkYXR0cmlidXRlcyBBbiBhcnJheSBvZiB0aGUgQUQgYXR0cmlidXRlcyB5b3Ugd2lzaCB0byByZXR1cm4NCiAgICAqIEBwYXJhbSBib29sICRyZWN1cnNpdmUgSWYgZW5hYmxlZCB0aGlzIHdpbGwgYXV0b21hdGljYWxseSBxdWVyeSB0aGUgZGF0YWJhc2VzIHdpdGhpbiBhIHN0b3JhZ2UgZ3JvdXANCiAgICAqIEByZXR1cm4gYXJyYXkNCiAgICAqLw0KICAgIHB1YmxpYyBmdW5jdGlvbiBleGNoYW5nZV9zdG9yYWdlX2dyb3VwcygkZXhjaGFuZ2VTZXJ2ZXIsICRhdHRyaWJ1dGVzID0gYXJyYXkoJ2NuJywnZGlzdGluZ3Vpc2hlZG5hbWUnKSwgJHJlY3Vyc2l2ZSA9IE5VTEwpIHsNCiAgICAgICAgaWYgKCEkdGhpcy0+X2JpbmQpeyByZXR1cm4gKGZhbHNlKTsgfQ0KICAgICAgICBpZiAoJGV4Y2hhbmdlU2VydmVyPT09TlVMTCl7IHJldHVybiAoIk1pc3NpbmcgY29tcHVsc29yeSBmaWVsZCBbZXhjaGFuZ2VTZXJ2ZXJdIik7IH0NCiAgICAgICAgaWYgKCRyZWN1cnNpdmU9PT1OVUxMKXsgJHJlY3Vyc2l2ZT0kdGhpcy0+X3JlY3Vyc2l2ZV9ncm91cHM7IH0NCg0KICAgICAgICAkZmlsdGVyID0gJygmKG9iamVjdENhdGVnb3J5PW1zRXhjaFN0b3JhZ2VHcm91cCkpJzsNCiAgICAgICAgJHNyPUBsZGFwX3NlYXJjaCgkdGhpcy0+X2Nvbm4sICRleGNoYW5nZVNlcnZlciwgJGZpbHRlciwgJGF0dHJpYnV0ZXMpOw0KICAgICAgICAkZW50cmllcyA9IEBsZGFwX2dldF9lbnRyaWVzKCR0aGlzLT5fY29ubiwgJHNyKTsNCg0KICAgICAgICBpZiAoJHJlY3Vyc2l2ZSA9PT0gdHJ1ZSkgew0KICAgICAgICAgICAgZm9yICgkaT0wOyAkaTwkZW50cmllc1snY291bnQnXTsgJGkrKykgew0KICAgICAgICAgICAgICAgICRlbnRyaWVzWyRpXVsnbXNleGNocHJpdmF0ZW1kYiddID0gJHRoaXMtPmV4Y2hhbmdlX3N0b3JhZ2VfZGF0YWJhc2VzKCRlbnRyaWVzWyRpXVsnZGlzdGluZ3Vpc2hlZG5hbWUnXVswXSk7ICAgICAgIA0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICByZXR1cm4gJGVudHJpZXM7DQogICAgfQ0KICAgIA0KICAgIC8qKg0KICAgICogUmV0dXJucyBhIGxpc3Qgb2YgRGF0YWJhc2VzIHdpdGhpbiBhbnkgZ2l2ZW4gc3RvcmFnZSBncm91cCBpbiBFeGNoYW5nZSBmb3IgYSBnaXZlbiBtYWlsIHNlcnZlcg0KICAgICogDQogICAgKiBAcGFyYW0gc3RyaW5nICRzdG9yYWdlR3JvdXAgVGhlIGZ1bGwgRE4gb2YgYW4gU3RvcmFnZSBHcm91cC4gIFlvdSBjYW4gdXNlIGV4Y2hhbmdlX3N0b3JhZ2VfZ3JvdXBzKCkgdG8gZmluZCB0aGUgRE4gDQogICAgKiBAcGFyYW0gYXJyYXkgJGF0dHJpYnV0ZXMgQW4gYXJyYXkgb2YgdGhlIEFEIGF0dHJpYnV0ZXMgeW91IHdpc2ggdG8gcmV0dXJuDQogICAgKiBAcmV0dXJuIGFycmF5DQogICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gZXhjaGFuZ2Vfc3RvcmFnZV9kYXRhYmFzZXMoJHN0b3JhZ2VHcm91cCwgJGF0dHJpYnV0ZXMgPSBhcnJheSgnY24nLCdkaXN0aW5ndWlzaGVkbmFtZScsJ2Rpc3BsYXluYW1lJykpIHsNCiAgICAgICAgaWYgKCEkdGhpcy0+X2JpbmQpeyByZXR1cm4gKGZhbHNlKTsgfQ0KICAgICAgICBpZiAoJHN0b3JhZ2VHcm91cD09PU5VTEwpeyByZXR1cm4gKCJNaXNzaW5nIGNvbXB1bHNvcnkgZmllbGQgW3N0b3JhZ2VHcm91cF0iKTsgfQ0KICAgICAgICANCiAgICAgICAgJGZpbHRlciA9ICcoJihvYmplY3RDYXRlZ29yeT1tc0V4Y2hQcml2YXRlTURCKSknOw0KICAgICAgICAkc3I9QGxkYXBfc2VhcmNoKCR0aGlzLT5fY29ubiwgJHN0b3JhZ2VHcm91cCwgJGZpbHRlciwgJGF0dHJpYnV0ZXMpOw0KICAgICAgICAkZW50cmllcyA9IEBsZGFwX2dldF9lbnRyaWVzKCR0aGlzLT5fY29ubiwgJHNyKTsNCiAgICAgICAgcmV0dXJuICRlbnRyaWVzOw0KICAgIH0NCiAgICANCiAgICAvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAgIC8vIFNFUlZFUiBGVU5DVElPTlMNCiAgICANCiAgICAvKioNCiAgICAqIEZpbmQgdGhlIEJhc2UgRE4gb2YgeW91ciBkb21haW4gY29udHJvbGxlcg0KICAgICogDQogICAgKiBAcmV0dXJuIHN0cmluZw0KICAgICovDQogICAgcHVibGljIGZ1bmN0aW9uIGZpbmRfYmFzZV9kbigpIHsNCiAgICAgICAgJG5hbWluZ0NvbnRleHQgPSAkdGhpcy0+Z2V0X3Jvb3RfZHNlKGFycmF5KCdkZWZhdWx0bmFtaW5nY29udGV4dCcpKTsgICANCiAgICAgICAgcmV0dXJuICRuYW1pbmdDb250ZXh0WzBdWydkZWZhdWx0bmFtaW5nY29udGV4dCddWzBdOw0KICAgIH0NCiAgICANCiAgICAvKioNCiAgICAqIEdldCB0aGUgUm9vdERTRSBwcm9wZXJ0aWVzIGZyb20gYSBkb21haW4gY29udHJvbGxlcg0KICAgICogDQogICAgKiBAcGFyYW0gYXJyYXkgJGF0dHJpYnV0ZXMgVGhlIGF0dHJpYnV0ZXMgeW91IHdpc2ggdG8gcXVlcnkgZS5nLiBkZWZhdWx0bmFtaW5nY29udGV4dA0KICAgICogQHJldHVybiBhcnJheQ0KICAgICovDQogICAgcHVibGljIGZ1bmN0aW9uIGdldF9yb290X2RzZSgkYXR0cmlidXRlcyA9IGFycmF5KCIqIiwgIisiKSkgew0KICAgICAgICBpZiAoISR0aGlzLT5fYmluZCl7IHJldHVybiAoZmFsc2UpOyB9DQogICAgICAgIA0KICAgICAgICAkc3IgPSBAbGRhcF9yZWFkKCR0aGlzLT5fY29ubiwgTlVMTCwgJ29iamVjdENsYXNzPSonLCAkYXR0cmlidXRlcyk7DQogICAgICAgICRlbnRyaWVzID0gQGxkYXBfZ2V0X2VudHJpZXMoJHRoaXMtPl9jb25uLCAkc3IpOw0KICAgICAgICByZXR1cm4gJGVudHJpZXM7DQogICAgfQ0KDQogICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAgICAvLyBVVElMSVRZIEZVTkNUSU9OUyAoTWFueSBvZiB0aGVzZSBmdW5jdGlvbnMgYXJlIHByb3RlY3RlZCBhbmQgY2FuIG9ubHkgYmUgY2FsbGVkIGZyb20gd2l0aGluIHRoZSBjbGFzcykNCg0KICAgIC8qKg0KICAgICogR2V0IGxhc3QgZXJyb3IgZnJvbSBBY3RpdmUgRGlyZWN0b3J5DQogICAgKiANCiAgICAqIFRoaXMgZnVuY3Rpb24gZ2V0cyB0aGUgbGFzdCBtZXNzYWdlIGZyb20gQWN0aXZlIERpcmVjdG9yeQ0KICAgICogVGhpcyBtYXkgaW5kZWVkIGJlIGEgJ1N1Y2Nlc3MnIG1lc3NhZ2UgYnV0IGlmIHlvdSBnZXQgYW4gdW5rbm93biBlcnJvcg0KICAgICogaXQgbWlnaHQgYmUgd29ydGggY2FsbGluZyB0aGlzIGZ1bmN0aW9uIHRvIHNlZSB3aGF0IGVycm9ycyB3ZXJlIHJhaXNlZA0KICAgICogDQogICAgKiByZXR1cm4gc3RyaW5nDQogICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0X2xhc3RfZXJyb3IoKSB7DQogICAgICAgIHJldHVybiBAbGRhcF9lcnJvcigkdGhpcy0+X2Nvbm4pOw0KICAgIH0NCiAgICANCiAgICAvKioNCiAgICAqIERldGVjdCBMREFQIHN1cHBvcnQgaW4gcGhwDQogICAgKiANCiAgICAqIEByZXR1cm4gYm9vbA0KICAgICovICAgIA0KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBsZGFwX3N1cHBvcnRlZCgpIHsNCiAgICAgICAgaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2xkYXBfY29ubmVjdCcpKSB7DQogICAgICAgICAgICByZXR1cm4gKGZhbHNlKTsgICANCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gKHRydWUpOw0KICAgIH0NCiAgICANCiAgICAvKioNCiAgICAqIFNjaGVtYQ0KICAgICogDQogICAgKiBAcGFyYW0gYXJyYXkgJGF0dHJpYnV0ZXMgQXR0cmlidXRlcyB0byBiZSBxdWVyaWVkDQogICAgKiBAcmV0dXJuIGFycmF5DQogICAgKi8gICAgDQogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGFkbGRhcF9zY2hlbWEoJGF0dHJpYnV0ZXMpew0KICAgIA0KICAgICAgICAvLyBMREFQIGRvZXNuJ3QgbGlrZSBOVUxMIGF0dHJpYnV0ZXMsIG9ubHkgc2V0IHRoZW0gaWYgdGhleSBoYXZlIHZhbHVlcw0KICAgICAgICAvLyBJZiB5b3Ugd2lzaCB0byByZW1vdmUgYW4gYXR0cmlidXRlIHlvdSBzaG91bGQgc2V0IGl0IHRvIGEgc3BhY2UNCiAgICAgICAgLy8gVE8gRE86IEFkYXB0IHVzZXJfbW9kaWZ5IHRvIHVzZSBsZGFwX21vZF9kZWxldGUgdG8gcmVtb3ZlIGEgTlVMTCBhdHRyaWJ1dGUNCiAgICAgICAgJG1vZD1hcnJheSgpOw0KICAgICAgICANCiAgICAgICAgLy8gQ2hlY2sgZXZlcnkgYXR0cmlidXRlIHRvIHNlZSBpZiBpdCBjb250YWlucyA4Yml0IGNoYXJhY3RlcnMgYW5kIHRoZW4gVVRGOCBlbmNvZGUgdGhlbQ0KICAgICAgICBhcnJheV93YWxrKCRhdHRyaWJ1dGVzLCBhcnJheSgkdGhpcywgJ2VuY29kZThiaXQnKSk7DQoNCiAgICAgICAgaWYgKCRhdHRyaWJ1dGVzWyJhZGRyZXNzX2NpdHkiXSl7ICRtb2RbImwiXVswXT0kYXR0cmlidXRlc1siYWRkcmVzc19jaXR5Il07IH0NCiAgICAgICAgaWYgKCRhdHRyaWJ1dGVzWyJhZGRyZXNzX2NvZGUiXSl7ICRtb2RbInBvc3RhbENvZGUiXVswXT0kYXR0cmlidXRlc1siYWRkcmVzc19jb2RlIl07IH0NCiAgICAgICAgLy9pZiAoJGF0dHJpYnV0ZXNbImFkZHJlc3NfY291bnRyeSJdKXsgJG1vZFsiY291bnRyeUNvZGUiXVswXT0kYXR0cmlidXRlc1siYWRkcmVzc19jb3VudHJ5Il07IH0gLy8gdXNlIGNvdW50cnkgY29kZXM/DQogICAgICAgIGlmICgkYXR0cmlidXRlc1siYWRkcmVzc19jb3VudHJ5Il0peyAkbW9kWyJjIl1bMF09JGF0dHJpYnV0ZXNbImFkZHJlc3NfY291bnRyeSJdOyB9DQogICAgICAgIGlmICgkYXR0cmlidXRlc1siYWRkcmVzc19wb2JveCJdKXsgJG1vZFsicG9zdE9mZmljZUJveCJdWzBdPSRhdHRyaWJ1dGVzWyJhZGRyZXNzX3BvYm94Il07IH0NCiAgICAgICAgaWYgKCRhdHRyaWJ1dGVzWyJhZGRyZXNzX3N0YXRlIl0peyAkbW9kWyJzdCJdWzBdPSRhdHRyaWJ1dGVzWyJhZGRyZXNzX3N0YXRlIl07IH0NCiAgICAgICAgaWYgKCRhdHRyaWJ1dGVzWyJhZGRyZXNzX3N0cmVldCJdKXsgJG1vZFsic3RyZWV0QWRkcmVzcyJdWzBdPSRhdHRyaWJ1dGVzWyJhZGRyZXNzX3N0cmVldCJdOyB9DQogICAgICAgIGlmICgkYXR0cmlidXRlc1siY29tcGFueSJdKXsgJG1vZFsiY29tcGFueSJdWzBdPSRhdHRyaWJ1dGVzWyJjb21wYW55Il07IH0NCiAgICAgICAgaWYgKCRhdHRyaWJ1dGVzWyJjaGFuZ2VfcGFzc3dvcmQiXSl7ICRtb2RbInB3ZExhc3RTZXQiXVswXT0wOyB9DQogICAgICAgIGlmICgkYXR0cmlidXRlc1siZGVwYXJ0bWVudCJdKXsgJG1vZFsiZGVwYXJ0bWVudCJdWzBdPSRhdHRyaWJ1dGVzWyJkZXBhcnRtZW50Il07IH0NCiAgICAgICAgaWYgKCRhdHRyaWJ1dGVzWyJkZXNjcmlwdGlvbiJdKXsgJG1vZFsiZGVzY3JpcHRpb24iXVswXT0kYXR0cmlidXRlc1siZGVzY3JpcHRpb24iXTsgfQ0KICAgICAgICBpZiAoJGF0dHJpYnV0ZXNbImRpc3BsYXlfbmFtZSJdKXsgJG1vZFsiZGlzcGxheU5hbWUiXVswXT0kYXR0cmlidXRlc1siZGlzcGxheV9uYW1lIl07IH0NCiAgICAgICAgaWYgKCRhdHRyaWJ1dGVzWyJlbWFpbCJdKXsgJG1vZFsibWFpbCJdWzBdPSRhdHRyaWJ1dGVzWyJlbWFpbCJdOyB9DQogICAgICAgIGlmICgkYXR0cmlidXRlc1siZXhwaXJlcyJdKXsgJG1vZFsiYWNjb3VudEV4cGlyZXMiXVswXT0kYXR0cmlidXRlc1siZXhwaXJlcyJdOyB9IC8vdW5peCBlcG9jaCBmb3JtYXQ/DQogICAgICAgIGlmICgkYXR0cmlidXRlc1siZmlyc3RuYW1lIl0peyAkbW9kWyJnaXZlbk5hbWUiXVswXT0kYXR0cmlidXRlc1siZmlyc3RuYW1lIl07IH0NCiAgICAgICAgaWYgKCRhdHRyaWJ1dGVzWyJob21lX2RpcmVjdG9yeSJdKXsgJG1vZFsiaG9tZURpcmVjdG9yeSJdWzBdPSRhdHRyaWJ1dGVzWyJob21lX2RpcmVjdG9yeSJdOyB9DQogICAgICAgIGlmICgkYXR0cmlidXRlc1siaG9tZV9kcml2ZSJdKXsgJG1vZFsiaG9tZURyaXZlIl1bMF09JGF0dHJpYnV0ZXNbImhvbWVfZHJpdmUiXTsgfQ0KICAgICAgICBpZiAoJGF0dHJpYnV0ZXNbImluaXRpYWxzIl0peyAkbW9kWyJpbml0aWFscyJdWzBdPSRhdHRyaWJ1dGVzWyJpbml0aWFscyJdOyB9DQogICAgICAgIGlmICgkYXR0cmlidXRlc1sibG9nb25fbmFtZSJdKXsgJG1vZFsidXNlclByaW5jaXBhbE5hbWUiXVswXT0kYXR0cmlidXRlc1sibG9nb25fbmFtZSJdOyB9DQogICAgICAgIGlmICgkYXR0cmlidXRlc1sibWFuYWdlciJdKXsgJG1vZFsibWFuYWdlciJdWzBdPSRhdHRyaWJ1dGVzWyJtYW5hZ2VyIl07IH0gIC8vVU5URVNURUQgKioqVXNlIERpc3Rpbmd1aXNoZWROYW1lKioqDQogICAgICAgIGlmICgkYXR0cmlidXRlc1sib2ZmaWNlIl0peyAkbW9kWyJwaHlzaWNhbERlbGl2ZXJ5T2ZmaWNlTmFtZSJdWzBdPSRhdHRyaWJ1dGVzWyJvZmZpY2UiXTsgfQ0KICAgICAgICBpZiAoJGF0dHJpYnV0ZXNbInBhc3N3b3JkIl0peyAkbW9kWyJ1bmljb2RlUHdkIl1bMF09JHRoaXMtPmVuY29kZV9wYXNzd29yZCgkYXR0cmlidXRlc1sicGFzc3dvcmQiXSk7IH0NCiAgICAgICAgaWYgKCRhdHRyaWJ1dGVzWyJwcm9maWxlX3BhdGgiXSl7ICRtb2RbInByb2ZpbGVwYXRoIl1bMF09JGF0dHJpYnV0ZXNbInByb2ZpbGVfcGF0aCJdOyB9DQogICAgICAgIGlmICgkYXR0cmlidXRlc1sic2NyaXB0X3BhdGgiXSl7ICRtb2RbInNjcmlwdFBhdGgiXVswXT0kYXR0cmlidXRlc1sic2NyaXB0X3BhdGgiXTsgfQ0KICAgICAgICBpZiAoJGF0dHJpYnV0ZXNbInN1cm5hbWUiXSl7ICRtb2RbInNuIl1bMF09JGF0dHJpYnV0ZXNbInN1cm5hbWUiXTsgfQ0KICAgICAgICBpZiAoJGF0dHJpYnV0ZXNbInRpdGxlIl0peyAkbW9kWyJ0aXRsZSJdWzBdPSRhdHRyaWJ1dGVzWyJ0aXRsZSJdOyB9DQogICAgICAgIGlmICgkYXR0cmlidXRlc1sidGVsZXBob25lIl0peyAkbW9kWyJ0ZWxlcGhvbmVOdW1iZXIiXVswXT0kYXR0cmlidXRlc1sidGVsZXBob25lIl07IH0NCiAgICAgICAgaWYgKCRhdHRyaWJ1dGVzWyJtb2JpbGUiXSl7ICRtb2RbIm1vYmlsZSJdWzBdPSRhdHRyaWJ1dGVzWyJtb2JpbGUiXTsgfQ0KICAgICAgICBpZiAoJGF0dHJpYnV0ZXNbInBhZ2VyIl0peyAkbW9kWyJwYWdlciJdWzBdPSRhdHRyaWJ1dGVzWyJwYWdlciJdOyB9DQogICAgICAgIGlmICgkYXR0cmlidXRlc1siaXBwaG9uZSJdKXsgJG1vZFsiaXBwaG9uZSJdWzBdPSRhdHRyaWJ1dGVzWyJpcHBob25lIl07IH0NCiAgICAgICAgaWYgKCRhdHRyaWJ1dGVzWyJ3ZWJfcGFnZSJdKXsgJG1vZFsid1dXSG9tZVBhZ2UiXVswXT0kYXR0cmlidXRlc1sid2ViX3BhZ2UiXTsgfQ0KICAgICAgICBpZiAoJGF0dHJpYnV0ZXNbImZheCJdKXsgJG1vZFsiZmFjc2ltaWxlVGVsZXBob25lTnVtYmVyIl1bMF09JGF0dHJpYnV0ZXNbImZheCJdOyB9DQogICAgICAgIGlmICgkYXR0cmlidXRlc1siZW5hYmxlZCJdKXsgJG1vZFsidXNlckFjY291bnRDb250cm9sIl1bMF09JGF0dHJpYnV0ZXNbImVuYWJsZWQiXTsgfQ0KICAgICAgICANCiAgICAgICAgLy8gRGlzdHJpYnV0aW9uIExpc3Qgc3BlY2lmaWMgc2NoZW1hDQogICAgICAgIGlmICgkYXR0cmlidXRlc1siZ3JvdXBfc2VuZHBlcm1pc3Npb24iXSl7ICRtb2RbImRsTWVtU3VibWl0UGVybXMiXVswXT0kYXR0cmlidXRlc1siZ3JvdXBfc2VuZHBlcm1pc3Npb24iXTsgfQ0KICAgICAgICBpZiAoJGF0dHJpYnV0ZXNbImdyb3VwX3JlamVjdHBlcm1pc3Npb24iXSl7ICRtb2RbImRsTWVtUmVqZWN0UGVybXMiXVswXT0kYXR0cmlidXRlc1siZ3JvdXBfcmVqZWN0cGVybWlzc2lvbiJdOyB9DQogICAgICAgIA0KICAgICAgICAvLyBFeGNoYW5nZSBTY2hlbWENCiAgICAgICAgaWYgKCRhdHRyaWJ1dGVzWyJleGNoYW5nZV9ob21lbWRiIl0peyAkbW9kWyJob21lTURCIl1bMF09JGF0dHJpYnV0ZXNbImV4Y2hhbmdlX2hvbWVtZGIiXTsgfQ0KICAgICAgICBpZiAoJGF0dHJpYnV0ZXNbImV4Y2hhbmdlX21haWxuaWNrbmFtZSJdKXsgJG1vZFsibWFpbE5pY2tuYW1lIl1bMF09JGF0dHJpYnV0ZXNbImV4Y2hhbmdlX21haWxuaWNrbmFtZSJdOyB9DQogICAgICAgIGlmICgkYXR0cmlidXRlc1siZXhjaGFuZ2VfcHJveHlhZGRyZXNzIl0peyAkbW9kWyJwcm94eUFkZHJlc3NlcyJdWzBdPSRhdHRyaWJ1dGVzWyJleGNoYW5nZV9wcm94eWFkZHJlc3MiXTsgfQ0KICAgICAgICBpZiAoJGF0dHJpYnV0ZXNbImV4Y2hhbmdlX3VzZWRlZmF1bHRzIl0peyAkbW9kWyJtREJVc2VEZWZhdWx0cyJdWzBdPSRhdHRyaWJ1dGVzWyJleGNoYW5nZV91c2VkZWZhdWx0cyJdOyB9DQogICAgICAgIGlmICgkYXR0cmlidXRlc1siZXhjaGFuZ2VfcG9saWN5ZXhjbHVkZSJdKXsgJG1vZFsibXNFeGNoUG9saWNpZXNFeGNsdWRlZCJdWzBdPSRhdHRyaWJ1dGVzWyJleGNoYW5nZV9wb2xpY3lleGNsdWRlIl07IH0NCiAgICAgICAgaWYgKCRhdHRyaWJ1dGVzWyJleGNoYW5nZV9wb2xpY3lpbmNsdWRlIl0peyAkbW9kWyJtc0V4Y2hQb2xpY2llc0luY2x1ZGVkIl1bMF09JGF0dHJpYnV0ZXNbImV4Y2hhbmdlX3BvbGljeWluY2x1ZGUiXTsgfQ0KICAgICAgICANCiAgICAgICAgLy8gVGhpcyBzY2hlbWEgaXMgZGVzaWduZWQgZm9yIGNvbnRhY3RzDQogICAgICAgIGlmICgkYXR0cmlidXRlc1siZXhjaGFuZ2VfaGlkZWZyb21saXN0cyJdKXsgJG1vZFsibXNFeGNoSGlkZUZyb21BZGRyZXNzTGlzdHMiXVswXT0kYXR0cmlidXRlc1siZXhjaGFuZ2VfaGlkZWZyb21saXN0cyJdOyB9DQogICAgICAgIGlmICgkYXR0cmlidXRlc1siY29udGFjdF9lbWFpbCJdKXsgJG1vZFsidGFyZ2V0QWRkcmVzcyJdWzBdPSRhdHRyaWJ1dGVzWyJjb250YWN0X2VtYWlsIl07IH0NCiAgICAgICAgDQogICAgICAgIC8vZWNobyAoIjxwcmU+Iik7IHByaW50X3IoJG1vZCk7DQogICAgICAgIC8qDQogICAgICAgIC8vIG1vZGlmeWluZyBhIG5hbWUgaXMgYSBiaXQgZmlkZGx5DQogICAgICAgIGlmICgkYXR0cmlidXRlc1siZmlyc3RuYW1lIl0gJiYgJGF0dHJpYnV0ZXNbInN1cm5hbWUiXSl7DQogICAgICAgICAgICAkbW9kWyJjbiJdWzBdPSRhdHRyaWJ1dGVzWyJmaXJzdG5hbWUiXS4iICIuJGF0dHJpYnV0ZXNbInN1cm5hbWUiXTsNCiAgICAgICAgICAgICRtb2RbImRpc3BsYXluYW1lIl1bMF09JGF0dHJpYnV0ZXNbImZpcnN0bmFtZSJdLiIgIi4kYXR0cmlidXRlc1sic3VybmFtZSJdOw0KICAgICAgICAgICAgJG1vZFsibmFtZSJdWzBdPSRhdHRyaWJ1dGVzWyJmaXJzdG5hbWUiXS4iICIuJGF0dHJpYnV0ZXNbInN1cm5hbWUiXTsNCiAgICAgICAgfQ0KICAgICAgICAqLw0KDQogICAgICAgIGlmIChjb3VudCgkbW9kKT09MCl7IHJldHVybiAoZmFsc2UpOyB9DQogICAgICAgIHJldHVybiAoJG1vZCk7DQogICAgfQ0KDQogICAgLyoqDQogICAgKiBDb3Bpbmcgd2l0aCBBRCBub3QgcmV0dXJuaW5nIHRoZSBwcmltYXJ5IGdyb3VwDQogICAgKiBodHRwOi8vc3VwcG9ydC5taWNyb3NvZnQuY29tLz9rYmlkPTMyMTM2MCANCiAgICAqIA0KICAgICogRm9yIHNvbWUgcmVhc29uIGl0J3Mgbm90IHBvc3NpYmxlIHRvIHNlYXJjaCBvbiBwcmltYXJ5Z3JvdXB0b2tlbj1YWFgNCiAgICAqIElmIHNvbWVvbmUgY2FuIHNob3cgb3RoZXJ3aXNlLCBJJ2QgbGlrZSB0byBrbm93IGFib3V0IGl0IDopDQogICAgKiB0aGlzIHdheSBpcyByZXNvdXJjZSBpbnRlbnNpdmUgYW5kIGdlbmVyYWxseSBhIHBhaW4gaW4gdGhlIEAjJV4NCiAgICAqIA0KICAgICogQGRlcHJlY2F0ZWQgZGVwcmVjYXRlZCBzaW5jZSB2ZXJzaW9uIDMuMSwgc2VlIGdldCBnZXRfcHJpbWFyeV9ncm91cA0KICAgICogQHBhcmFtIHN0cmluZyAkZ2lkIEdyb3VwIElEDQogICAgKiBAcmV0dXJuIHN0cmluZw0KICAgICovDQogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGdyb3VwX2NuKCRnaWQpeyAgICANCiAgICAgICAgaWYgKCRnaWQ9PT1OVUxMKXsgcmV0dXJuIChmYWxzZSk7IH0NCiAgICAgICAgJHI9ZmFsc2U7DQogICAgICAgIA0KICAgICAgICAkZmlsdGVyPSIoJihvYmplY3RDYXRlZ29yeT1ncm91cCkoc2FtYWNjb3VudHR5cGU9Ii4gQURMREFQX1NFQ1VSSVRZX0dMT0JBTF9HUk9VUCAuIikpIjsNCiAgICAgICAgJGZpZWxkcz1hcnJheSgicHJpbWFyeWdyb3VwdG9rZW4iLCJzYW1hY2NvdW50bmFtZSIsImRpc3Rpbmd1aXNoZWRuYW1lIik7DQogICAgICAgICRzcj1sZGFwX3NlYXJjaCgkdGhpcy0+X2Nvbm4sJHRoaXMtPl9iYXNlX2RuLCRmaWx0ZXIsJGZpZWxkcyk7DQogICAgICAgICRlbnRyaWVzID0gbGRhcF9nZXRfZW50cmllcygkdGhpcy0+X2Nvbm4sICRzcik7DQogICAgICAgIA0KICAgICAgICBmb3IgKCRpPTA7ICRpPCRlbnRyaWVzWyJjb3VudCJdOyAkaSsrKXsNCiAgICAgICAgICAgIGlmICgkZW50cmllc1skaV1bInByaW1hcnlncm91cHRva2VuIl1bMF09PSRnaWQpew0KICAgICAgICAgICAgICAgICRyPSRlbnRyaWVzWyRpXVsiZGlzdGluZ3Vpc2hlZG5hbWUiXVswXTsNCiAgICAgICAgICAgICAgICAkaT0kZW50cmllc1siY291bnQiXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiAoJHIpOw0KICAgIH0NCiAgICANCiAgICAvKioNCiAgICAqIENvcGluZyB3aXRoIEFEIG5vdCByZXR1cm5pbmcgdGhlIHByaW1hcnkgZ3JvdXANCiAgICAqIGh0dHA6Ly9zdXBwb3J0Lm1pY3Jvc29mdC5jb20vP2tiaWQ9MzIxMzYwIA0KICAgICogDQogICAgKiBUaGlzIGlzIGEgcmUtd3JpdGUgYmFzZWQgb24gY29kZSBzdWJtaXR0ZWQgYnkgQnJ1Y2Ugd2hpY2ggcHJldmVudHMgdGhlIA0KICAgICogbmVlZCB0byBzZWFyY2ggZWFjaCBzZWN1cml0eSBncm91cCB0byBmaW5kIHRoZSB0cnVlIHByaW1hcnkgZ3JvdXANCiAgICAqIA0KICAgICogQHBhcmFtIHN0cmluZyAkZ2lkIEdyb3VwIElEDQogICAgKiBAcGFyYW0gc3RyaW5nICR1c2Vyc2lkIFVzZXIncyBPYmplY3QgU0lEDQogICAgKiBAcmV0dXJuIHN0cmluZw0KICAgICovDQogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGdldF9wcmltYXJ5X2dyb3VwKCRnaWQsICR1c2Vyc2lkKXsNCiAgICAgICAgaWYgKCRnaWQ9PT1OVUxMIHx8ICR1c2Vyc2lkPT09TlVMTCl7IHJldHVybiAoZmFsc2UpOyB9DQogICAgICAgICRyPWZhbHNlOw0KDQogICAgICAgICRnc2lkID0gc3Vic3RyX3JlcGxhY2UoJHVzZXJzaWQscGFjaygnVicsJGdpZCksc3RybGVuKCR1c2Vyc2lkKS00LDQpOw0KICAgICAgICAkZmlsdGVyPScob2JqZWN0c2lkPScuJHRoaXMtPmdldFRleHRTSUQoJGdzaWQpLicpJzsNCiAgICAgICAgJGZpZWxkcz1hcnJheSgic2FtYWNjb3VudG5hbWUiLCJkaXN0aW5ndWlzaGVkbmFtZSIpOw0KICAgICAgICAkc3I9bGRhcF9zZWFyY2goJHRoaXMtPl9jb25uLCR0aGlzLT5fYmFzZV9kbiwkZmlsdGVyLCRmaWVsZHMpOw0KICAgICAgICAkZW50cmllcyA9IGxkYXBfZ2V0X2VudHJpZXMoJHRoaXMtPl9jb25uLCAkc3IpOw0KDQogICAgICAgIHJldHVybiAkZW50cmllc1swXVsnZGlzdGluZ3Vpc2hlZG5hbWUnXVswXTsNCiAgICAgfQ0KICAgICANCiAgICAvKioNCiAgICAqIENvbnZlcnQgYSBiaW5hcnkgU0lEIHRvIGEgdGV4dCBTSUQNCiAgICAqIA0KICAgICogQHBhcmFtIHN0cmluZyAkYmluc2lkIEEgQmluYXJ5IFNJRA0KICAgICogQHJldHVybiBzdHJpbmcNCiAgICAqLw0KICAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0VGV4dFNJRCgkYmluc2lkKSB7DQogICAgICAgICRoZXhfc2lkID0gYmluMmhleCgkYmluc2lkKTsNCiAgICAgICAgJHJldiA9IGhleGRlYyhzdWJzdHIoJGhleF9zaWQsIDAsIDIpKTsNCiAgICAgICAgJHN1YmNvdW50ID0gaGV4ZGVjKHN1YnN0cigkaGV4X3NpZCwgMiwgMikpOw0KICAgICAgICAkYXV0aCA9IGhleGRlYyhzdWJzdHIoJGhleF9zaWQsIDQsIDEyKSk7DQogICAgICAgICRyZXN1bHQgPSAiJHJldi0kYXV0aCI7DQoNCiAgICAgICAgZm9yICgkeD0wOyR4IDwgJHN1YmNvdW50OyAkeCsrKSB7DQogICAgICAgICAgICAkc3ViYXV0aFskeF0gPQ0KICAgICAgICAgICAgICAgIGhleGRlYygkdGhpcy0+bGl0dGxlX2VuZGlhbihzdWJzdHIoJGhleF9zaWQsIDE2ICsgKCR4ICogOCksIDgpKSk7DQogICAgICAgICAgICAgICAgJHJlc3VsdCAuPSAiLSIgLiAkc3ViYXV0aFskeF07DQogICAgICAgIH0NCg0KICAgICAgICAvLyBDaGVhdCBieSB0YWNraW5nIG9uIHRoZSBTLQ0KICAgICAgICByZXR1cm4gJ1MtJyAuICRyZXN1bHQ7DQogICAgIH0NCiAgICAgDQogICAgLyoqDQogICAgKiBDb252ZXJ0cyBhIGxpdHRsZS1lbmRpYW4gaGV4IG51bWJlciB0byBvbmUgdGhhdCBoZXhkZWMoKSBjYW4gY29udmVydA0KICAgICogDQogICAgKiBAcGFyYW0gc3RyaW5nICRoZXggQSBoZXggY29kZQ0KICAgICogQHJldHVybiBzdHJpbmcNCiAgICAqLw0KICAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gbGl0dGxlX2VuZGlhbigkaGV4KSB7DQogICAgICAgICRyZXN1bHQgPSAnJzsNCiAgICAgICAgZm9yICgkeCA9IHN0cmxlbigkaGV4KSAtIDI7ICR4ID49IDA7ICR4ID0gJHggLSAyKSB7DQogICAgICAgICAgICAkcmVzdWx0IC49IHN1YnN0cigkaGV4LCAkeCwgMik7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuICRyZXN1bHQ7DQogICAgIH0NCiAgICAgDQogICAgLyoqDQogICAgKiBDb252ZXJ0cyBhIGJpbmFyeSBhdHRyaWJ1dGUgdG8gYSBzdHJpbmcNCiAgICAqIA0KICAgICogQHBhcmFtIHN0cmluZyAkYmluIEEgYmluYXJ5IExEQVAgYXR0cmlidXRlDQogICAgKiBAcmV0dXJuIHN0cmluZw0KICAgICovDQogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGJpbmFyeTJ0ZXh0KCRiaW4pIHsNCiAgICAgICAgJGhleF9ndWlkID0gYmluMmhleCgkYmluKTsgDQogICAgICAgICRoZXhfZ3VpZF90b19ndWlkX3N0ciA9ICcnOyANCiAgICAgICAgZm9yKCRrID0gMTsgJGsgPD0gNDsgKyskaykgeyANCiAgICAgICAgICAgICRoZXhfZ3VpZF90b19ndWlkX3N0ciAuPSBzdWJzdHIoJGhleF9ndWlkLCA4IC0gMiAqICRrLCAyKTsgDQogICAgICAgIH0gDQogICAgICAgICRoZXhfZ3VpZF90b19ndWlkX3N0ciAuPSAnLSc7IA0KICAgICAgICBmb3IoJGsgPSAxOyAkayA8PSAyOyArKyRrKSB7IA0KICAgICAgICAgICAgJGhleF9ndWlkX3RvX2d1aWRfc3RyIC49IHN1YnN0cigkaGV4X2d1aWQsIDEyIC0gMiAqICRrLCAyKTsgDQogICAgICAgIH0gDQogICAgICAgICRoZXhfZ3VpZF90b19ndWlkX3N0ciAuPSAnLSc7IA0KICAgICAgICBmb3IoJGsgPSAxOyAkayA8PSAyOyArKyRrKSB7IA0KICAgICAgICAgICAgJGhleF9ndWlkX3RvX2d1aWRfc3RyIC49IHN1YnN0cigkaGV4X2d1aWQsIDE2IC0gMiAqICRrLCAyKTsgDQogICAgICAgIH0gDQogICAgICAgICRoZXhfZ3VpZF90b19ndWlkX3N0ciAuPSAnLScgLiBzdWJzdHIoJGhleF9ndWlkLCAxNiwgNCk7IA0KICAgICAgICAkaGV4X2d1aWRfdG9fZ3VpZF9zdHIgLj0gJy0nIC4gc3Vic3RyKCRoZXhfZ3VpZCwgMjApOyANCiAgICAgICAgcmV0dXJuIHN0cnRvdXBwZXIoJGhleF9ndWlkX3RvX2d1aWRfc3RyKTsgICANCiAgICB9DQogICAgDQogICAgLyoqDQogICAgKiBDb252ZXJ0cyBhIGJpbmFyeSBHVUlEIHRvIGEgc3RyaW5nIEdVSUQNCiAgICAqIA0KICAgICogQHBhcmFtIHN0cmluZyAkYmluYXJ5R3VpZCBUaGUgYmluYXJ5IEdVSUQgYXR0cmlidXRlIHRvIGNvbnZlcnQNCiAgICAqIEByZXR1cm4gc3RyaW5nDQogICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gZGVjb2RlR3VpZCgkYmluYXJ5R3VpZCkgew0KICAgICAgICBpZiAoJGJpbmFyeUd1aWQgPT09IG51bGwpeyByZXR1cm4gKCJNaXNzaW5nIGNvbXB1bHNvcnkgZmllbGQgW2JpbmFyeUd1aWRdIik7IH0NCiAgICAgICAgDQogICAgICAgICRzdHJHVUlEID0gJHRoaXMtPmJpbmFyeTJ0ZXh0KCRiaW5hcnlHdWlkKTsgICAgICAgICAgDQogICAgICAgIHJldHVybiAoJHN0ckdVSUQpOyANCiAgICB9DQogICAgIA0KICAgIC8qKg0KICAgICogQ29udmVydHMgYSBzdHJpbmcgR1VJRCB0byBhIGhleGRlY2ltYWwgdmFsdWUgc28gaXQgY2FuIGJlIHF1ZXJpZWQNCiAgICAqIA0KICAgICogQHBhcmFtIHN0cmluZyAkc3RyR1VJRCBBIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIEdVSUQNCiAgICAqIEByZXR1cm4gc3RyaW5nDQogICAgKi8NCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gc3RyZ3VpZDJoZXgoJHN0ckdVSUQpIHsNCiAgICAgICAgJHN0ckdVSUQgPSBzdHJfcmVwbGFjZSgnLScsICcnLCAkc3RyR1VJRCk7DQoNCiAgICAgICAgJG9jdGV0X3N0ciA9ICdcXCcgLiBzdWJzdHIoJHN0ckdVSUQsIDYsIDIpOw0KICAgICAgICAkb2N0ZXRfc3RyIC49ICdcXCcgLiBzdWJzdHIoJHN0ckdVSUQsIDQsIDIpOw0KICAgICAgICAkb2N0ZXRfc3RyIC49ICdcXCcgLiBzdWJzdHIoJHN0ckdVSUQsIDIsIDIpOw0KICAgICAgICAkb2N0ZXRfc3RyIC49ICdcXCcgLiBzdWJzdHIoJHN0ckdVSUQsIDAsIDIpOw0KICAgICAgICAkb2N0ZXRfc3RyIC49ICdcXCcgLiBzdWJzdHIoJHN0ckdVSUQsIDEwLCAyKTsNCiAgICAgICAgJG9jdGV0X3N0ciAuPSAnXFwnIC4gc3Vic3RyKCRzdHJHVUlELCA4LCAyKTsNCiAgICAgICAgJG9jdGV0X3N0ciAuPSAnXFwnIC4gc3Vic3RyKCRzdHJHVUlELCAxNCwgMik7DQogICAgICAgICRvY3RldF9zdHIgLj0gJ1xcJyAuIHN1YnN0cigkc3RyR1VJRCwgMTIsIDIpOw0KICAgICAgICAvLyRvY3RldF9zdHIgLj0gJ1xcJyAuIHN1YnN0cigkc3RyR1VJRCwgMTYsIHN0cmxlbigkc3RyR1VJRCkpOw0KICAgICAgICBmb3IgKCRpPTE2OyAkaTw9KHN0cmxlbigkc3RyR1VJRCktMik7ICRpKyspIHsNCiAgICAgICAgICAgIGlmICgoJGkgJSAyKSA9PSAwKSB7DQogICAgICAgICAgICAgICAgJG9jdGV0X3N0ciAuPSAnXFwnIC4gc3Vic3RyKCRzdHJHVUlELCAkaSwgMik7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIHJldHVybiAkb2N0ZXRfc3RyOw0KICAgIH0NCiAgICANCiAgICAvKioNCiAgICAqIE9idGFpbiB0aGUgdXNlcidzIGRpc3Rpbmd1aXNoZWQgbmFtZSBiYXNlZCBvbiB0aGVpciB1c2VyaWQgDQogICAgKiANCiAgICAqIA0KICAgICogQHBhcmFtIHN0cmluZyAkdXNlcm5hbWUgVGhlIHVzZXJuYW1lDQogICAgKiBAcGFyYW0gYm9vbCAkaXNHVUlEIElzIHRoZSB1c2VybmFtZSBwYXNzZWQgYSBHVUlEIG9yIGEgc2FtQWNjb3VudE5hbWUNCiAgICAqIEByZXR1cm4gc3RyaW5nDQogICAgKi8NCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gdXNlcl9kbigkdXNlcm5hbWUsJGlzR1VJRD1mYWxzZSl7DQogICAgICAgICR1c2VyPSR0aGlzLT51c2VyX2luZm8oJHVzZXJuYW1lLGFycmF5KCJjbiIpLCRpc0dVSUQpOw0KICAgICAgICBpZiAoJHVzZXJbMF1bImRuIl09PT1OVUxMKXsgcmV0dXJuIChmYWxzZSk7IH0NCiAgICAgICAgJHVzZXJfZG49JHVzZXJbMF1bImRuIl07DQogICAgICAgIHJldHVybiAoJHVzZXJfZG4pOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICogRW5jb2RlIGEgcGFzc3dvcmQgZm9yIHRyYW5zbWlzc2lvbiBvdmVyIExEQVANCiAgICAqDQogICAgKiBAcGFyYW0gc3RyaW5nICRwYXNzd29yZCBUaGUgcGFzc3dvcmQgdG8gZW5jb2RlDQogICAgKiBAcmV0dXJuIHN0cmluZw0KICAgICovDQogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGVuY29kZV9wYXNzd29yZCgkcGFzc3dvcmQpew0KICAgICAgICAkcGFzc3dvcmQ9IlwiIi4kcGFzc3dvcmQuIlwiIjsNCiAgICAgICAgJGVuY29kZWQ9IiI7DQogICAgICAgIGZvciAoJGk9MDsgJGkgPHN0cmxlbigkcGFzc3dvcmQpOyAkaSsrKXsgJGVuY29kZWQuPSJ7JHBhc3N3b3JkeyRpfX1cMDAwIjsgfQ0KICAgICAgICByZXR1cm4gKCRlbmNvZGVkKTsNCiAgICB9DQogICAgDQogICAgLyoqDQogICAgKiBFc2NhcGUgc3RyaW5ncyBmb3IgdGhlIHVzZSBpbiBMREFQIGZpbHRlcnMNCiAgICAqIA0KICAgICogREVWRUxPUEVSUyBTSE9VTEQgQkUgRE9JTkcgUFJPUEVSIEZJTFRFUklORyBJRiBUSEVZJ1JFIEFDQ0VQVElORyBVU0VSIElOUFVUDQogICAgKiBQb3J0ZWQgZnJvbSBQZXJsJ3MgTmV0OjpMREFQOjpVdGlsIGVzY2FwZV9maWx0ZXJfdmFsdWUNCiAgICAqDQogICAgKiBAcGFyYW0gc3RyaW5nICRzdHIgVGhlIHN0cmluZyB0aGUgcGFyc2UNCiAgICAqIEBhdXRob3IgUG9ydCBieSBBbmRyZWFzIEdvaHIgPGFuZGlAc3BsaXRicmFpbi5vcmc+DQogICAgKiBAcmV0dXJuIHN0cmluZw0KICAgICovDQogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGxkYXBfc2xhc2hlcygkc3RyKXsNCiAgICAgICAgcmV0dXJuIHByZWdfcmVwbGFjZSgnLyhbXHgwMC1ceDFGXCpcKFwpXFxcXF0pL2UnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICciXFxcXFwiLmpvaW4oIiIsdW5wYWNrKCJIMiIsIiQxIikpJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc3RyKTsNCiAgICB9DQogICAgDQogICAgLyoqDQogICAgKiBTZWxlY3QgYSByYW5kb20gZG9tYWluIGNvbnRyb2xsZXIgZnJvbSB5b3VyIGRvbWFpbiBjb250cm9sbGVyIGFycmF5DQogICAgKiANCiAgICAqIEByZXR1cm4gc3RyaW5nDQogICAgKi8NCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gcmFuZG9tX2NvbnRyb2xsZXIoKXsNCiAgICAgICAgbXRfc3JhbmQoZG91YmxldmFsKG1pY3JvdGltZSgpKSAqIDEwMDAwMDAwMCk7IC8vIEZvciBvbGRlciBQSFAgdmVyc2lvbnMNCiAgICAgICAgcmV0dXJuICgkdGhpcy0+X2RvbWFpbl9jb250cm9sbGVyc1thcnJheV9yYW5kKCR0aGlzLT5fZG9tYWluX2NvbnRyb2xsZXJzKV0pOw0KICAgIH0NCiAgICANCiAgICAvKioNCiAgICAqIEFjY291bnQgY29udHJvbCBvcHRpb25zDQogICAgKg0KICAgICogQHBhcmFtIGFycmF5ICRvcHRpb25zIFRoZSBvcHRpb25zIHRvIGNvbnZlcnQgdG8gaW50IA0KICAgICogQHJldHVybiBpbnQNCiAgICAqLw0KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBhY2NvdW50X2NvbnRyb2woJG9wdGlvbnMpew0KICAgICAgICAkdmFsPTA7DQoNCiAgICAgICAgaWYgKGlzX2FycmF5KCRvcHRpb25zKSl7DQogICAgICAgICAgICBpZiAoaW5fYXJyYXkoIlNDUklQVCIsJG9wdGlvbnMpKXsgJHZhbD0kdmFsKzE7IH0NCiAgICAgICAgICAgIGlmIChpbl9hcnJheSgiQUNDT1VOVERJU0FCTEUiLCRvcHRpb25zKSl7ICR2YWw9JHZhbCsyOyB9DQogICAgICAgICAgICBpZiAoaW5fYXJyYXkoIkhPTUVESVJfUkVRVUlSRUQiLCRvcHRpb25zKSl7ICR2YWw9JHZhbCs4OyB9DQogICAgICAgICAgICBpZiAoaW5fYXJyYXkoIkxPQ0tPVVQiLCRvcHRpb25zKSl7ICR2YWw9JHZhbCsxNjsgfQ0KICAgICAgICAgICAgaWYgKGluX2FycmF5KCJQQVNTV0RfTk9UUkVRRCIsJG9wdGlvbnMpKXsgJHZhbD0kdmFsKzMyOyB9DQogICAgICAgICAgICAvL1BBU1NXRF9DQU5UX0NIQU5HRSBOb3RlIFlvdSBjYW5ub3QgYXNzaWduIHRoaXMgcGVybWlzc2lvbiBieSBkaXJlY3RseSBtb2RpZnlpbmcgdGhlIFVzZXJBY2NvdW50Q29udHJvbCBhdHRyaWJ1dGUuDQogICAgICAgICAgICAvL0ZvciBpbmZvcm1hdGlvbiBhYm91dCBob3cgdG8gc2V0IHRoZSBwZXJtaXNzaW9uIHByb2dyYW1tYXRpY2FsbHksIHNlZSB0aGUgIlByb3BlcnR5IGZsYWcgZGVzY3JpcHRpb25zIiBzZWN0aW9uLg0KICAgICAgICAgICAgaWYgKGluX2FycmF5KCJFTkNSWVBURURfVEVYVF9QV0RfQUxMT1dFRCIsJG9wdGlvbnMpKXsgJHZhbD0kdmFsKzEyODsgfQ0KICAgICAgICAgICAgaWYgKGluX2FycmF5KCJURU1QX0RVUExJQ0FURV9BQ0NPVU5UIiwkb3B0aW9ucykpeyAkdmFsPSR2YWwrMjU2OyB9DQogICAgICAgICAgICBpZiAoaW5fYXJyYXkoIk5PUk1BTF9BQ0NPVU5UIiwkb3B0aW9ucykpeyAkdmFsPSR2YWwrNTEyOyB9DQogICAgICAgICAgICBpZiAoaW5fYXJyYXkoIklOVEVSRE9NQUlOX1RSVVNUX0FDQ09VTlQiLCRvcHRpb25zKSl7ICR2YWw9JHZhbCsyMDQ4OyB9DQogICAgICAgICAgICBpZiAoaW5fYXJyYXkoIldPUktTVEFUSU9OX1RSVVNUX0FDQ09VTlQiLCRvcHRpb25zKSl7ICR2YWw9JHZhbCs0MDk2OyB9DQogICAgICAgICAgICBpZiAoaW5fYXJyYXkoIlNFUlZFUl9UUlVTVF9BQ0NPVU5UIiwkb3B0aW9ucykpeyAkdmFsPSR2YWwrODE5MjsgfQ0KICAgICAgICAgICAgaWYgKGluX2FycmF5KCJET05UX0VYUElSRV9QQVNTV09SRCIsJG9wdGlvbnMpKXsgJHZhbD0kdmFsKzY1NTM2OyB9DQogICAgICAgICAgICBpZiAoaW5fYXJyYXkoIk1OU19MT0dPTl9BQ0NPVU5UIiwkb3B0aW9ucykpeyAkdmFsPSR2YWwrMTMxMDcyOyB9DQogICAgICAgICAgICBpZiAoaW5fYXJyYXkoIlNNQVJUQ0FSRF9SRVFVSVJFRCIsJG9wdGlvbnMpKXsgJHZhbD0kdmFsKzI2MjE0NDsgfQ0KICAgICAgICAgICAgaWYgKGluX2FycmF5KCJUUlVTVEVEX0ZPUl9ERUxFR0FUSU9OIiwkb3B0aW9ucykpeyAkdmFsPSR2YWwrNTI0Mjg4OyB9DQogICAgICAgICAgICBpZiAoaW5fYXJyYXkoIk5PVF9ERUxFR0FURUQiLCRvcHRpb25zKSl7ICR2YWw9JHZhbCsxMDQ4NTc2OyB9DQogICAgICAgICAgICBpZiAoaW5fYXJyYXkoIlVTRV9ERVNfS0VZX09OTFkiLCRvcHRpb25zKSl7ICR2YWw9JHZhbCsyMDk3MTUyOyB9DQogICAgICAgICAgICBpZiAoaW5fYXJyYXkoIkRPTlRfUkVRX1BSRUFVVEgiLCRvcHRpb25zKSl7ICR2YWw9JHZhbCs0MTk0MzA0OyB9IA0KICAgICAgICAgICAgaWYgKGluX2FycmF5KCJQQVNTV09SRF9FWFBJUkVEIiwkb3B0aW9ucykpeyAkdmFsPSR2YWwrODM4ODYwODsgfQ0KICAgICAgICAgICAgaWYgKGluX2FycmF5KCJUUlVTVEVEX1RPX0FVVEhfRk9SX0RFTEVHQVRJT04iLCRvcHRpb25zKSl7ICR2YWw9JHZhbCsxNjc3NzIxNjsgfQ0KICAgICAgICB9DQogICAgICAgIHJldHVybiAoJHZhbCk7DQogICAgfQ0KICAgIA0KICAgIC8qKg0KICAgICogVGFrZSBhbiBMREFQIHF1ZXJ5IGFuZCByZXR1cm4gdGhlIG5pY2UgbmFtZXMsIHdpdGhvdXQgYWxsIHRoZSBMREFQIHByZWZpeGVzIChlZy4gQ04sIEROKQ0KICAgICoNCiAgICAqIEBwYXJhbSBhcnJheSAkZ3JvdXBzDQogICAgKiBAcmV0dXJuIGFycmF5DQogICAgKi8NCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gbmljZV9uYW1lcygkZ3JvdXBzKXsNCg0KICAgICAgICAkZ3JvdXBfYXJyYXk9YXJyYXkoKTsNCiAgICAgICAgZm9yICgkaT0wOyAkaTwkZ3JvdXBzWyJjb3VudCJdOyAkaSsrKXsgLy8gRm9yIGVhY2ggZ3JvdXANCiAgICAgICAgICAgICRsaW5lPSRncm91cHNbJGldOw0KICAgICAgICAgICAgDQogICAgICAgICAgICBpZiAoc3RybGVuKCRsaW5lKT4wKXsgDQogICAgICAgICAgICAgICAgLy8gTW9yZSBwcmVzdW1wdGlvbnMsIHRoZXkncmUgYWxsIHByZWZpeGVkIHdpdGggQ049DQogICAgICAgICAgICAgICAgLy8gc28gd2UgZGl0Y2ggdGhlIGZpcnN0IHRocmVlIGNoYXJhY3RlcnMgYW5kIHRoZSBncm91cA0KICAgICAgICAgICAgICAgIC8vIG5hbWUgZ29lcyB1cCB0byB0aGUgZmlyc3QgY29tbWENCiAgICAgICAgICAgICAgICAkYml0cz1leHBsb2RlKCIsIiwkbGluZSk7DQogICAgICAgICAgICAgICAgJGdyb3VwX2FycmF5W109c3Vic3RyKCRiaXRzWzBdLDMsKHN0cmxlbigkYml0c1swXSktMykpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHJldHVybiAoJGdyb3VwX2FycmF5KTsgICAgDQogICAgfQ0KICAgIA0KICAgIC8qKg0KICAgICogRGVsZXRlIGEgZGlzdGluZ3Vpc2hlZCBuYW1lIGZyb20gQWN0aXZlIERpcmVjdG9yeQ0KICAgICogWW91IHNob3VsZCBuZXZlciBuZWVkIHRvIGNhbGwgdGhpcyB5b3Vyc2VsZiwganVzdCB1c2UgdGhlIHdyYXBwZXIgZnVuY3Rpb25zIHVzZXJfZGVsZXRlIGFuZCBjb250YWN0X2RlbGV0ZQ0KICAgICoNCiAgICAqIEBwYXJhbSBzdHJpbmcgJGRuIFRoZSBkaXN0aW5ndWlzaGVkIG5hbWUgdG8gZGVsZXRlDQogICAgKiBAcmV0dXJuIGJvb2wNCiAgICAqLw0KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBkbl9kZWxldGUoJGRuKXsgDQogICAgICAgICRyZXN1bHQ9bGRhcF9kZWxldGUoJHRoaXMtPl9jb25uLCAkZG4pOw0KICAgICAgICBpZiAoJHJlc3VsdCE9dHJ1ZSl7IHJldHVybiAoZmFsc2UpOyB9DQogICAgICAgIHJldHVybiAodHJ1ZSk7DQogICAgfQ0KICAgIA0KICAgIC8qKg0KICAgICogQ29udmVydCBhIGJvb2xlYW4gdmFsdWUgdG8gYSBzdHJpbmcNCiAgICAqIFlvdSBzaG91bGQgbmV2ZXIgbmVlZCB0byBjYWxsIHRoaXMgeW91cnNlbGYNCiAgICAqDQogICAgKiBAcGFyYW0gYm9vbCAkYm9vbCBCb29sZWFuIHZhbHVlDQogICAgKiBAcmV0dXJuIHN0cmluZw0KICAgICovDQogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGJvb2wyc3RyKCRib29sKSB7DQogICAgICAgIHJldHVybiAoJGJvb2wpID8gJ1RSVUUnIDogJ0ZBTFNFJzsNCiAgICB9DQogICAgDQogICAgLyoqDQogICAgKiBDb252ZXJ0IDhiaXQgY2hhcmFjdGVycyBlLmcuIGFjY2VudGVkIGNoYXJhY3RlcnMgdG8gVVRGOCBlbmNvZGVkIGNoYXJhY3RlcnMNCiAgICAqLw0KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBlbmNvZGU4Yml0KCYkaXRlbSwgJGtleSkgew0KICAgICAgICAkZW5jb2RlID0gZmFsc2U7DQogICAgICAgIGlmIChpc19zdHJpbmcoJGl0ZW0pKSB7DQogICAgICAgICAgICBmb3IgKCRpPTA7ICRpPHN0cmxlbigkaXRlbSk7ICRpKyspIHsNCiAgICAgICAgICAgICAgICBpZiAob3JkKCRpdGVtWyRpXSkgPj4gNykgew0KICAgICAgICAgICAgICAgICAgICAkZW5jb2RlID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgaWYgKCRlbmNvZGUgPT09IHRydWUgJiYgJGtleSAhPSAncGFzc3dvcmQnKSB7DQogICAgICAgICAgICAkaXRlbSA9IHV0ZjhfZW5jb2RlKCRpdGVtKTsgICANCiAgICAgICAgfQ0KICAgIH0gICAgDQoNCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0X2Nvbm5lY3Rpb24oKQ0KICAgIHsNCiAgICAgIHJldHVybiAkdGhpcy0+X2Nvbm47DQogICAgfQ0KDQogICAgcHVibGljIGZ1bmN0aW9uIGdldF9iYXNlZG4oKQ0KICAgIHsNCiAgICAgIHJldHVybiAkdGhpcy0+X2Jhc2VfZG47DQogICAgfQ0KfQ0KDQovKioNCiogYWRMREFQIEV4Y2VwdGlvbiBIYW5kbGVyDQoqIA0KKiBFeGNlcHRpb25zIG9mIHRoaXMgdHlwZSBhcmUgdGhyb3duIG9uIGJpbmQgZmFpbHVyZSBvciB3aGVuIFNTTCBpcyByZXF1aXJlZCBidXQgbm90IGNvbmZpZ3VyZWQNCiogRXhhbXBsZToNCiogdHJ5IHsNCiogICAkYWRsZGFwID0gbmV3IGFkTERBUCgpOw0KKiB9DQoqIGNhdGNoIChhZExEQVBFeGNlcHRpb24gJGUpIHsNCiogICBlY2hvICRlOw0KKiAgIGV4aXQoKTsNCiogfQ0KKi8NCmNsYXNzIGFkTERBUEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7fQ0KDQo/Pg==]]></data>
	</file>
	<file>
	  <filename>/lib/class.feu_ldap_connector.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCmNsYXNzIGZldV9sZGFwX2Nvbm5lY3Rvcgp7CiAgcHJpdmF0ZSAkX2FkbGRhcDsKICBwcml2YXRlICRfb3B0aW9uczsKICBwcml2YXRlICRfY2FjaGVkX2dyb3VwczsKICBwcml2YXRlICRfY2FjaGVkX3VzZXJzOwoKICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJG9wdGlvbnMpCiAgewogICAgJHRoaXMtPl9vcHRpb25zID0gJG9wdGlvbnM7CiAgICBpZiggaXNzZXQoJG9wdGlvbnNbJ2Fzc3VtZV9hZCddKSApCiAgICAgIHsKCWluY2x1ZGVfb25jZSBkaXJuYW1lKF9fRklMRV9fKS4nL2FkTERBUC5waHAnOwoJJHRoaXMtPl9hZGxkYXAgPSBuZXcgYWRMREFQKCRvcHRpb25zKTsKICAgICAgfQogICAgZWxzZQogICAgICB7CglpbmNsdWRlX29uY2UgZGlybmFtZShfX0ZJTEVfXykuJy9vcGVuTERBUC5waHAnOwoJJHRoaXMtPl9hZGxkYXAgPSBuZXcgb3BlbkxEQVAoJG9wdGlvbnMpOwogICAgICB9CiAgfQoKICAKICBwdWJsaWMgZnVuY3Rpb24gYXV0aGVudGljYXRlKCR1c2VybmFtZSwkcGFzc3dvcmQpCiAgewogICAgJGNvbm4gPSAkdGhpcy0+X2FkbGRhcC0+Z2V0X2Nvbm5lY3Rpb24oKTsKICAgICRiYXNlZG4gPSAkdGhpcy0+X2FkbGRhcC0+Z2V0X2Jhc2VkbigpOwogICAgCiAgICBpZiggaXNzZXQoJHRoaXMtPl9vcHRpb25zWydhdXRoX3ZpYV9iaW5kJ10pICkKICAgICAgewogICAgICAgIGlmKCBpc3NldCgkdGhpcy0+X29wdGlvbnNbJ2Fzc3VtZV9hZCddKSApCiAgICAgICAgICB7CgkgICAgIHJldHVybiAkdGhpcy0+X2FkbGRhcC0+YXV0aGVudGljYXRlKCR1c2VybmFtZSwkcGFzc3dvcmQpOwogICAgICAgICAgfQogICAgICAgICRfc3VmZml4ID0gJyc7CiAgICAgICAgaWYoIGlzc2V0KCR0aGlzLT5fb3B0aW9uc1snYWNjb3VudF9zdWZmaXgnXSkgKQogICAgICAgIHsKICAgICAgICAgICRfc3VmZml4ID0gJHRoaXMtPl9vcHRpb25zWydhY2NvdW50X3N1ZmZpeCddOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbGRhcF9iaW5kKCRjb25uLCR1c2VybmFtZS4kc3VmZml4LCRwYXNzd29yZCk7CiAgICAgIH0KCiAgICAvLyBzZWFyY2ggZm9yIGEgdXNlciB3aXRoIHRoZSBzcGVjaWZpZWQgdXNlcm5hbWUgYW5kIHBhc3N3b3JkCiAgICAkcGFzc3dvcmQgPSAie01ENX0iLmJhc2U2NF9lbmNvZGUoIHBhY2soICdIKicgLCBtZDUoJHBhc3N3b3JkKSApICk7CiAgICAkcmVzID0gJHRoaXMtPl9zZWFyY2goJHRoaXMtPl9nZXRfcHJlZml4KCkuJHVzZXJuYW1lLCcnLFRSVUUpOwogICAgaWYoICEkcmVzICkgcmV0dXJuIEZBTFNFOwogICAgCiAgICAkY3IgPSBsZGFwX2NvbXBhcmUoJGNvbm4sJHJlc1snZG4nXSwndXNlclBhc3N3b3JkJywkcGFzc3dvcmQpOwogICAgaWYoICRjciAmJiAkY3IgIT09IC0xICkgcmV0dXJuIFRSVUU7CiAgICByZXR1cm4gRkFMU0U7CiAgfQoKCiAgcHVibGljIGZ1bmN0aW9uIGdldF9sYXN0X2Vycm9yKCkKICB7CiAgICByZXR1cm4gJHRoaXMtPl9hZGxkYXAtPmdldF9sYXN0X2Vycm9yKCk7CiAgfQoKCiAgcHVibGljIGZ1bmN0aW9uIGFsbF9ncm91cHMoKQogIHsKICAgIGlmKCBpc3NldCgkb3B0aW9uc1snYXNzdW1lX2FkJ10pICkKICAgICAgewoJcmV0dXJuICR0aGlzLT5fYWRsZGFwLT5hbGxfZ3JvdXBzKCk7CiAgICAgIH0KCiAgICBpZiggIWlzX2FycmF5KCR0aGlzLT5fY2FjaGVkX2dyb3VwcykgKQogICAgICB7CgkkY29ubiA9ICR0aGlzLT5fYWRsZGFwLT5nZXRfY29ubmVjdGlvbigpOwoJJGJhc2VkbiA9ICR0aGlzLT5fYWRsZGFwLT5nZXRfYmFzZWRuKCk7CgkkZmlsdGVyID0gJ29iamVjdENsYXNzPXBvc2l4R3JvdXAnOwoJJHNyID0gbGRhcF9zZWFyY2goJGNvbm4sJGJhc2VkbiwkZmlsdGVyKTsKCWlmKCAhJHNyICkgcmV0dXJuIEZBTFNFOwoJCgkkdG1wID0gbGRhcF9nZXRfZW50cmllcygkY29ubiwkc3IpOwoJaWYoICFpc19hcnJheSgkdG1wKSB8fCAhaXNzZXQoJHRtcFsnY291bnQnXSkgKSByZXR1cm4gRkFMU0U7CgkKCSR0aGlzLT5fY2FjaGVkX2dyb3VwcyA9IGFycmF5KCk7Cglmb3IoICRpID0gMDsgJGkgPCAkdG1wWydjb3VudCddOyAkaSsrICkKCSAgewoJICAgICRyZWMgPSYgJHRtcFskaV07CgkgICAgJHQyID0gZXhwbG9kZSgnLCcsJHJlY1snZG4nXSk7CgkgICAgbGlzdCgka2V5LCR2YWx1ZSkgPSBleHBsb2RlKCc9JywkdDJbMF0sMik7CgkgICAgaWYoIHN0cnRvbG93ZXIoJGtleSkgIT0gJ2NuJyApIGNvbnRpbnVlOwoJICAgIGlmKCAhaXNzZXQoJHRoaXMtPl9jYWNoZWRfZ3JvdXBzWyR2YWx1ZV0pICkKCSAgICAgIHsKCQkkdGhpcy0+X2NhY2hlZF9ncm91cHNbJHZhbHVlXSA9ICRyZWM7CgkgICAgICB9CgkgIH0KICAgICAgfQogICAgaWYoICFpc19hcnJheSgkdGhpcy0+X2NhY2hlZF9ncm91cHMpICkKICAgICAgewoJcmV0dXJuIGFycmF5X2tleXMoJHRoaXMtPl9jYWNoZWRfZ3JvdXBzKTsKICAgICAgfQogICAgcmV0dXJuIEZBTFNFOwogIH0KCgogIHB1YmxpYyBmdW5jdGlvbiBncm91cF9pbmZvKCRncm91cG5hbWUpCiAgewogICAgJHJlcyA9ICR0aGlzLT5hbGxfZ3JvdXBzKCk7CiAgICBpZiggISRyZXMgKSByZXR1cm4gRkFMU0U7CiAgICBpZiggIWluX2FycmF5KCRncm91cG5hbWUsJHJlcykgKSByZXR1cm4gRkFMU0U7CgogICAgcmV0dXJuICR0aGlzLT5fY2FjaGVkX2dyb3Vwc1skZ3JvdXBuYW1lXTsKICB9CgoKICBwdWJsaWMgZnVuY3Rpb24gZ2V0X3VzZXJfaW5mbygkdXNlcm5hbWUpCiAgewogICAgaWYoIGlzc2V0KCRvcHRpb25zWydhc3N1bWVfYWQnXSkgKQogICAgICB7CglyZXR1cm4gJHRoaXMtPl9hZGxkYXAtPnVzZXJfaW5mbygpOwogICAgICB9CgogICAgaWYoICFpc19hcnJheSgkdGhpcy0+X2NhY2hlZF91c2VycykgKQogICAgICB7CgkkdGhpcy0+X2NhY2hlZF91c2VycyA9IGFycmF5KCk7CiAgICAgIH0KICAgIGlmKCAhaXNzZXQoJHRoaXMtPl9jYWNoZWRfdXNlcnNbJHVzZXJuYW1lXSkgKQogICAgICB7CgkkdG1wID0gJHRoaXMtPl9zZWFyY2goJHRoaXMtPl9nZXRfcHJlZml4KCkuJHVzZXJuYW1lKTsKCWlmKCAhJHRtcCApIHJldHVybiBGQUxTRTsKICAgICAgfQogICAgaWYoIGlzc2V0KCR0aGlzLT5fY2FjaGVkX3VzZXJzWyR1c2VybmFtZV0pICkKICAgICAgewoJcmV0dXJuICR0aGlzLT5fY2FjaGVkX3VzZXJzWyR1c2VybmFtZV07CiAgICAgIH0KICAgIHJldHVybiBGQUxTRTsKICB9CgoKICBwdWJsaWMgZnVuY3Rpb24gdXNlcl9pbl9ncm91cCgkdXNlcm5hbWUsJGdyb3VwbmFtZSkKICB7CiAgICBpZiggaXNzZXQoJG9wdGlvbnNbJ2Fzc3VtZV9hZCddKSApCiAgICAgIHsKCXJldHVybiAkdGhpcy0+X2FkbGRhcC0+dXNlcl9pbmdyb3VwKCR1c2VybmFtZSwkZ3JvdXBuYW1lKTsKICAgICAgfQoKICAgIC8vIGdldCB0aGUgdXNlciBpbmZvCiAgICAkdXNlcl9pbmZvID0gJHRoaXMtPmdldF91c2VyX2luZm8oJHVzZXJuYW1lKTsKICAgIAoKICAgICRtb2QgPSBjZ2VfdXRpbHM6OmdldF9tb2R1bGUoJ0ZFVV9BdXRoX0xEQVAnKTsKICAgICRzZXR0aW5nID0gJG1vZC0+R2V0UHJlZmVyZW5jZSgnbGRhcF9ncm91cGFycmFuZ2VtZW50Jyk7CiAgICAkYXR0ciA9ICRtb2QtPkdldFByZWZlcmVuY2UoJ2xkYXBfYXR0cmlibmFtZScpOwogICAgJHJlcyA9ICcnOwogICAgc3dpdGNoKCAkc2V0dGluZyApCiAgICAgIHsKICAgICAgY2FzZSAndXNlcmF0dHJpYic6CglpZiggJGF0dHIgKQoJICB7CgkgICAgaWYoIGlzc2V0KCR1c2VyX2luZm9bJGF0dHJdKSApCgkgICAgICB7CgkJaWYoIGluX2FycmF5KCRncm91cG5hbWUsJHVzZXJpbmZvWyRhdHRyXSkgKQoJCSAgcmV0dXJuIFRSVUU7CgkgICAgICB9CgkgIH0KCXJldHVybiBGQUxTRTsKCWJyZWFrOwoKICAgICAgY2FzZSAnZ3JvdXBhdHRyaWInOgoJaWYoICRhdHRyICkKCSAgewoJICAgICRncm91cF9pbmZvID0gJHRoaXMtPmdyb3VwX2luZm8oJGdyb3VwbmFtZSk7CgkgICAgaWYoICRncm91cF9pbmZvICYmIGlzc2V0KCRncm91cF9pbmZvWyRhdHRyXSkgKQoJICAgICAgewoJCWlmKCBpbl9hcnJheSgkZ3JvdXBuYW1lLCRncm91cGluZm9bJGF0dHJdKSApCgkJICB7CgkJICAgIHJldHVybiBUUlVFOwoJCSAgfQoJICAgICAgfQoJICB9CglyZXR1cm4gRkFMU0U7CglicmVhazsKCiAgICAgIGNhc2UgJ2dyb3VwaGllcic6CgkvLyBmaXJzdCBkbyBhIHRyaXZpYWwgbG9va3VwCgkvLyBmb3IgdGhlIGdpZCBudW1iZXIuCgkkdG1wID0gJHRoaXMtPmFsbF9ncm91cHMoKTsKCWlmKCAkdG1wICkgcmV0dXJuIEZBTFNFOyAvLyBubyBncm91cHM/CglpZiggaXNzZXQoJHVzZXJfaW5mb1snZ2lkbnVtYmVyJ10pICkKCSAgewoJICAgIGZvcmVhY2goICR0aGlzLT5fY2FjaGVkX2dyb3VwcyBhcyAka2V5ID0+ICRyZWMgKQoJICAgICAgewoJCWlmKCBpc3NldCgkcmVjWydnaWRudW1iZXInXSkgJiYgJHJlY1snZ2lkbnVtYmVyJ10gPT0gJHVzZXJfaW5mb1snZ2lkbnVtYmVyJ10gKQoJCSAgcmV0dXJuIFRSVUU7CgkgICAgICB9CgkgIH0KCQoJLy8gbm93IGRvIGEgc2VhcmNoIGZvciB0aGUgdXNlciBncm91cHMgdGhhdCBoYXZlIHRoaXMgZW50cnkgYXMgYSBjaGlsZAoJLy8gdGhpcyBzaG91bGQgaGFuZGxlIGhpZXJhcmNpY2FsIGdyb3VwIG1lbWJlcnNoaXAgdG9vLgoJJHRtcCA9ICR0aGlzLT5fc2VhcmNoKCR0aGlzLT5fZ2V0X3ByZWZpeCgpLiR1c2VybmFtZSwnJyx0cnVlLCR0aGlzLT5fY2FjaGVkX2dyb3Vwc1skZ3JvdXBuYW1lXVsnZG4nXSk7CglpZiggJHRtcCApIHJldHVybiBUUlVFOwoJcmV0dXJuIEZBTFNFOwoJYnJlYWs7CiAgICAgIH0KICB9CgoKICBwcml2YXRlIGZ1bmN0aW9uIF9nZXRfcHJlZml4KCkKICB7CiAgICAkcHJlZml4ID0gJ2NuJzsKICAgIGlmKCBpc3NldCgkdGhpcy0+X29wdGlvbnNbJ3VzZXJfcHJlZml4J10pICkKICAgICAgewoJJHByZWZpeCA9ICR0aGlzLT5fb3B0aW9uc1sndXNlcl9wcmVmaXgnXTsKICAgICAgfQogICAgcmV0dXJuICRwcmVmaXguJz0nOwogIH0KCiAgcHJpdmF0ZSBmdW5jdGlvbiBfc2VhcmNoKCRzZWFyY2gsJGZpZWxkcyA9ICcnLCRsaW1pdF90b19vbmUgPSBGQUxTRSwkYmFzZWRuID0gJycpCiAgewogICAgJGNvbm4gPSAkdGhpcy0+X2FkbGRhcC0+Z2V0X2Nvbm5lY3Rpb24oKTsKICAgIGlmKCAhJGJhc2VkbiApCiAgICAgIHsKCSRiYXNlZG4gPSAkdGhpcy0+X2FkbGRhcC0+Z2V0X2Jhc2VkbigpOwogICAgICB9CiAgICAkZmxkcyA9IGFycmF5KCk7CiAgICBpZiggJGZpZWxkcyApICRmbGRzID0gZXhwbG9kZSgnLCcsJGZpZWxkcyk7CiAgICAkc3IgPSBAbGRhcF9zZWFyY2goJGNvbm4sJGJhc2Vkbiwkc2VhcmNoLCRmbGRzKTsKICAgIGlmKCAhJHNyICkgcmV0dXJuIEZBTFNFOwogICAgCiAgICAkdG1wID0gbGRhcF9nZXRfZW50cmllcygkY29ubiwkc3IpOwogICAgaWYoICRsaW1pdF90b19vbmUgKQogICAgICB7CgkvLyR0bXAgPSBsZGFwX2ZpcnN0X2VudHJ5KCRjb25uLCRzcik7CglyZXR1cm4gJHRtcFswXTsKICAgICAgfQogICAgZWxzZQogICAgICB7CgkkdG1wID0gbGRhcF9nZXRfZW50cmllcygkY29ubiwkc3IpOwogICAgICB9CiAgICByZXR1cm4gJHRtcDsKICB9Cgp9IC8vIGVuZCBvZiBjbGFzcy4KCj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/class.feu_ldap_consumer.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKI0JFR0lOX0xJQ0VOU0UKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IEZFVV9BdXRoX0xEQVAgKGMpIDIwMTAgYnkgUm9iZXJ0IENhbXBiZWxsIAojICAgICAgICAgKGNhbGd1eTEwMDBAY21zbWFkZXNpbXBsZS5vcmcpCiMgIEFuIGFkZG9uIG1vZHVsZSBmb3IgQ01TIE1hZGUgU2ltcGxlIHRvIGFsbG93IGEgc2Vjb25kYXJ5IHR5cGUgb2YgCiMgIGF1dGhlbnRpY2F0aW9uIHRvIHRoZSBGRVUgbW9kdWxlLiAgVGhpcyBhZGRvbiBhbGxvd3MgdXNpbmcgdGhlIGFwYWNoZQojICBCQVNJQyBhdXRoZW50aWNhdGlvbi4KIyAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMDUgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQojIFRoaXMgcHJvamVjdCdzIGhvbWVwYWdlIGlzOiBodHRwOi8vd3d3LmNtc21hZGVzaW1wbGUub3JnCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIwojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgojIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBIb3dldmVyLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHUEwsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQKIyBhcyBhbiBhZGRvbiBtb2R1bGUgdG8gQ01TIE1hZGUgU2ltcGxlLiAgWW91IG1heSBub3QgdXNlIHRoaXMgc29mdHdhcmUKIyBpbiBhbnkgTm9uIEdQTCB2ZXJzaW9uIG9mIENNUyBNYWRlIHNpbXBsZSwgb3IgaW4gYW55IHZlcnNpb24gb2YgQ01TCiMgTWFkZSBzaW1wbGUgdGhhdCBkb2VzIG5vdCBpbmRpY2F0ZSBjbGVhcmx5IGFuZCBvYnZpb3VzbHkgaW4gaXRzIGFkbWluIAojIHNlY3Rpb24gdGhhdCB0aGUgc2l0ZSB3YXMgYnVpbHQgd2l0aCBDTVMgTWFkZSBzaW1wbGUuCiMKIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQojIE9yIHJlYWQgaXQgb25saW5lOiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwKIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojRU5EX0xJQ0VOU0UKCmNsYXNzIGZldV9sZGFwX2NvbnN1bWVyIGltcGxlbWVudHMgZmV1X2F1dGhfY29uc3VtZXIKewogIHB1YmxpYyBmdW5jdGlvbiBpc19hdXRoZW50aWNhdGVkKCkKICB7CiAgICAkbW9kID0gY2dlX3V0aWxzOjpnZXRfbW9kdWxlKCdGRVVfQXV0aF9MREFQJyk7CiAgICAka2V5ID0gJG1vZC0+R2V0UHJlZmVyZW5jZSgnbGRhcF9udGxtX2tleScsJ1JFTU9URV9VU0VSJyk7CiAgICAKICAgIGlmKCBpc3NldCgkX1NFUlZFUlska2V5XSkgfHwgaXNzZXQoJF9TRVNTSU9OWyRrZXldKSApCiAgICAgIHsKCSR1c2VybmFtZSA9ICRfU0VSVkVSWyRrZXldOwoJaWYoICEkdXNlcm5hbWUgKQoJICB7CgkgICAgJHVzZXJuYW1lID0gJF9TRVNTSU9OWyRrZXldOwoJICB9CglpZiggISR1c2VybmFtZSApCgkgIHsKCSAgICByZXR1cm4gRkFMU0U7CgkgIH0KCgkvLyB3ZSd2ZSBhbHJlYWR5IGJlZW4gYXV0aGVudGljYXRlZCBieSB0aGUgc3lzdGVtICh3aW5sb2dpbikKCSRyZXF1aXJlX2dyb3VwID0gJG1vZC0+R2V0UHJlZmVyZW5jZSgnbGRhcF9yZXF1aXJlX2dyb3VwJyk7CglpZiggJHJlcXVpcmVfZ3JvdXAgKQoJICB7CgkgICAgLy8gd2UgZ290dGEgdG91Y2ggdGhlIGxkYXAgc2VydmVyLgoJICAgICRsZGFwID0gJG1vZC0+Z2V0X2xkYXBfY29ubmVjdG9yKCk7CgkgICAgaWYoICEkbGRhcC0+dXNlcl9pbl9ncm91cCgkdXNlcm5hbWUsJHJlcXVpcmVfZ3JvdXApICkKCSAgICAgIHsKCQlkaWUoJ3VzZXIgZ3JvdXAgZmFpbGVkJyk7CgkJcmV0dXJuIEZBTFNFOwoJICAgICAgfQoJICB9CgoJcmV0dXJuIFRSVUU7CiAgICAgIH0KCiAgICAvLyBpZiB3ZSdyZSB1c2luZyBOVExNIGF1dGhlbnRpY2F0aW9uCiAgICAvLyB3ZSBub3cgc2VlIGlmIHdlIGNhbiBjb25uZWN0IAogICAgcmV0dXJuIEZBTFNFOwogIH0KCiAgcHVibGljIGZ1bmN0aW9uIGdldF9jYXBhYmlsaXRpZXMoKQogIHsKICAgICRyZXMgPSBhcnJheSgpOwogICAgJHJlc1tdID0gZmV1X2F1dGhfY29uc3VtZXI6OkNBUEFCSUxJVFlfTE9HSU47CiAgICAkcmVzW10gPSBmZXVfYXV0aF9jb25zdW1lcjo6Q0FQQUJJTElUWV9MT0dPVVQ7CiAgICAkcmVzW10gPSBmZXVfYXV0aF9jb25zdW1lcjo6Q0FQQUJJTElUWV9VU0VTVERDSEFOR0VTRVRUSU5HUzsKICAgIHJldHVybiAkcmVzOwogIH0KCiAgcHVibGljIGZ1bmN0aW9uIGhhc19jYXBhYmlsaXR5KCRmbGFnKQogIHsKICAgIGlmKCBpbl9hcnJheSgkZmxhZywkdGhpcy0+Z2V0X2NhcGFiaWxpdGllcygpKSApCiAgICAgIHJldHVybiBUUlVFOwogICAgcmV0dXJuIEZBTFNFOwogIH0KCiAgcHVibGljIGZ1bmN0aW9uIGdldF9jb25uZWN0aW5nX3Byb3BlcnR5X25hbWUoKQogIHsKICAgIHJldHVybiBzZWxmOjpQUk9QRVJUWV9VU0VSTkFNRTsKICB9CgogIHB1YmxpYyBmdW5jdGlvbiBnZXRfbG9naW5fZGlzcGxheSgkaWQsJHJldHVybmlkLCRwYXJhbXMpCiAgewogICAgJG1vZCA9IGNnZV91dGlsczo6Z2V0X21vZHVsZSgnRkVVX0F1dGhfTERBUCcpOwogICAgJHR4dCA9ICRtb2QtPkRvQWN0aW9uKCd1c2VyX2xvZ2luJywkaWQsJHBhcmFtcywkcmV0dXJuaWQpOwogICAgcmV0dXJuICR0eHQ7CiAgfQoKICBwdWJsaWMgZnVuY3Rpb24gZ2V0X2xvZ291dF9kaXNwbGF5KCRpZCwkcmV0dXJuaWQsJHBhcmFtcykKICB7CiAgICAkbW9kID0gY2dlX3V0aWxzOjpnZXRfbW9kdWxlKCdGRVVfQXV0aF9MREFQJyk7CiAgICByZXR1cm4gJG1vZC0+RG9BY3Rpb24oJ3VzZXJfbG9nb3V0JywkaWQsJHBhcmFtcywkcmV0dXJuaWQpOwogIH0KCiAgcHVibGljIGZ1bmN0aW9uIGdldF9jaGFuZ2VzZXR0aW5nc19kaXNwbGF5KCRpZCwkcmV0dXJuaWQsJHBhcmFtcykKICB7CiAgICAvLyB3ZSdyZSBnb25uYSBjaGVhdCBhbmQgdXNlIHRoZSBGRVUgc3RhbmRhcmQgY2hhbmdlc2V0dGluZ3MgZm9ybS4KICAgICRmZXUgPSBjZ2VfdXRpbHM6OmdldF9tb2R1bGUoJ0Zyb250RW5kVXNlcnMnKTsKICAgICRmZXUtPkRvQWN0aW9uKCdjaGFuZ2VzZXR0aW5ncycsJGlkLCRwYXJhbXMsJHJldHVybmlkKTsKICB9CgogIHB1YmxpYyBmdW5jdGlvbiBnZXRfdXNlcl9pbmZvKCkKICB7CiAgICBkaWUoJ2dldF9zZXJ2ZXJfaW5mbyBub3QgaW1wbGVtZW50ZWQnKTsKICB9CgogIHB1YmxpYyBmdW5jdGlvbiBnZXRfdW5pcXVlX2lkZW50aWZpZXIoKQogIHsKICAgICRtb2QgPSBjZ2VfdXRpbHM6OmdldF9tb2R1bGUoJ0ZFVV9BdXRoX0xEQVAnKTsKICAgICRrZXkgPSAkbW9kLT5HZXRQcmVmZXJlbmNlKCdsZGFwX250bG1fa2V5JywnUkVNT1RFX1VTRVInKTsKICAgIGlmKCBpc3NldCgkX1NFUlZFUlska2V5XSkgKSByZXR1cm4gJF9TRVJWRVJbJGtleV07CiAgICBpZiggaXNzZXQoJF9TRVNTSU9OWyRrZXldKSApIHJldHVybiAkX1NFU1NJT05bJGtleV07CiAgICByZXR1cm4gRkFMU0U7CiAgfQp9CgojCiMgRU9GCiMKPz4=]]></data>
	</file>
	<file>
	  <filename>/lib/openLDAP.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCnJlcXVpcmVfb25jZSgnYWRMREFQLnBocCcpOwoKY2xhc3Mgb3BlbkxEQVAgZXh0ZW5kcyBhZExEQVAKewogIHByaXZhdGUgJF91c2VfY24gPSB0cnVlOwoKICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJG9wdGlvbnM9YXJyYXkoKSkKICB7CiAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCRvcHRpb25zKTsKICAgIGlmKCBpc3NldCgkb3B0aW9uc1sndXNlX2NuJ10pICkKICAgICAgewoJJHRoaXMtPl91c2VfY24gPSAkb3B0aW9uc1sndXNlX2NuJ107CiAgICAgIH0KICB9CgoKICBwdWJsaWMgZnVuY3Rpb24gc2V0X3VzZV9jbigkZmxhZyA9IHRydWUpCiAgewogICAgJHRoaXMtPl91c2VfY24gPSAkZmxhZzsKICB9CgoKICBwcm90ZWN0ZWQgZnVuY3Rpb24gX2F1dGgoJHVzZXJuYW1lLCRwYXNzd29yZCkKICB7CiAgICBpZiggJHRoaXMtPl91c2VfY24gKQogICAgICB7CgkkdXNlcm5hbWUgPSAnY249Jy4kdXNlcm5hbWUuJywnLiR0aGlzLT5fYmFzZV9kbjsKICAgICAgfQogICAgJHRtcCA9IHBhcmVudDo6X2F1dGgoJHVzZXJuYW1lLCRwYXNzd29yZCk7CiAgICBpZiggISR0bXAgKQogICAgICB7CglyZXR1cm4gRkFMU0U7CiAgICAgIH0KICAgIHJldHVybiBUUlVFOwogIH0KCiAgCiAgcHVibGljIGZ1bmN0aW9uIHVzZXJfaW5mbygkdXNlcm5hbWUsJGZpZWxkcyA9IE5VTEwsJGlzR1VJRCA9IGZhbHNlKQogIHsKICAgIGlmICgkdXNlcm5hbWU9PT1OVUxMKXsgcmV0dXJuIChmYWxzZSk7IH0KICAgIGlmICghJHRoaXMtPl9iaW5kKXsgcmV0dXJuIChmYWxzZSk7IH0KCiAgICBpZiggJHRoaXMtPl91c2VfY24gKQogICAgICB7CglpZiAoJGlzR1VJRCA9PT0gdHJ1ZSkgewoJICAkdXNlcm5hbWUgPSAkdGhpcy0+c3RyZ3VpZDJoZXgoJHVzZXJuYW1lKTsKCSAgJGZpbHRlcj0ib2JqZWN0Z3VpZD0iLiR1c2VybmFtZTsKCX0KCWVsc2UgewoJICAkZmlsdGVyPSJjbj0iLiR1c2VybmFtZTsKCX0KCWlmICgkZmllbGRzPT09TlVMTCl7ICRmaWVsZHM9YXJyYXkoInNhbWFjY291bnRuYW1lIiwibWFpbCIsIm1lbWJlcm9mIiwiZGVwYXJ0bWVudCIsImRpc3BsYXluYW1lIiwidGVsZXBob25lbnVtYmVyIiwicHJpbWFyeWdyb3VwaWQiLCJvYmplY3RzaWQiKTsgfQoKCXJldHVybiAkdGhpcy0+X3VzZXJfaW5mbygkZmlsdGVyLCRmaWVsZHMpOwogICAgICB9CiAgICBlbHNlCiAgICAgIHsKCXJldHVybiBwYXJlbnQ6OnVzZXJfaW5mbygkdXNlcm5hbWUsJGZpZWxkcywkaXNHVUlEKTsKICAgICAgfQogIH0KfQoKPz4=]]></data>
	</file>
	<file>
	  <filename>/method.install.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKI0JFR0lOX0xJQ0VOU0UKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IEZFVV9BdXRoX0xEQVAgKGMpIDIwMTAgYnkgUm9iZXJ0IENhbXBiZWxsIAojICAgICAgICAgKGNhbGd1eTEwMDBAY21zbWFkZXNpbXBsZS5vcmcpCiMgIEFuIGFkZG9uIG1vZHVsZSBmb3IgQ01TIE1hZGUgU2ltcGxlIHRvIGFsbG93IGEgc2Vjb25kYXJ5IHR5cGUgb2YgCiMgIGF1dGhlbnRpY2F0aW9uIHRvIHRoZSBGRVUgbW9kdWxlLiAgVGhpcyBhZGRvbiBhbGxvd3MgdXNpbmcgdGhlIGFwYWNoZQojICBCQVNJQyBhdXRoZW50aWNhdGlvbi4KIyAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMDUgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQojIFRoaXMgcHJvamVjdCdzIGhvbWVwYWdlIGlzOiBodHRwOi8vd3d3LmNtc21hZGVzaW1wbGUub3JnCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIwojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgojIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBIb3dldmVyLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHUEwsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQKIyBhcyBhbiBhZGRvbiBtb2R1bGUgdG8gQ01TIE1hZGUgU2ltcGxlLiAgWW91IG1heSBub3QgdXNlIHRoaXMgc29mdHdhcmUKIyBpbiBhbnkgTm9uIEdQTCB2ZXJzaW9uIG9mIENNUyBNYWRlIHNpbXBsZSwgb3IgaW4gYW55IHZlcnNpb24gb2YgQ01TCiMgTWFkZSBzaW1wbGUgdGhhdCBkb2VzIG5vdCBpbmRpY2F0ZSBjbGVhcmx5IGFuZCBvYnZpb3VzbHkgaW4gaXRzIGFkbWluIAojIHNlY3Rpb24gdGhhdCB0aGUgc2l0ZSB3YXMgYnVpbHQgd2l0aCBDTVMgTWFkZSBzaW1wbGUuCiMKIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQojIE9yIHJlYWQgaXQgb25saW5lOiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwKIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojRU5EX0xJQ0VOU0UKaWYoICFpc3NldCgkZ0NtcykgKSBleGl0OwoKJGZuID0gZGlybmFtZShfX0ZJTEVfXykuJy90ZW1wbGF0ZXMvb3JpZ19sb2dpbl90ZW1wbGF0ZS50cGwnOwokdHBsID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRmbik7CmlmKCAkdHBsICkKICB7CiAgICAkdGhpcy0+U2V0VGVtcGxhdGUoJ2xvZ2luX3RlbXBsYXRlJywkdHBsKTsKICB9CgokZm4gPSBkaXJuYW1lKF9fRklMRV9fKS4nL3RlbXBsYXRlcy9vcmlnX2xvZ291dF90ZW1wbGF0ZS50cGwnOwokdHBsID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRmbik7CmlmKCAkdHBsICkKICB7CiAgICAkdGhpcy0+U2V0VGVtcGxhdGUoJ2xvZ291dF90ZW1wbGF0ZScsJHRwbCk7CiAgfQoKJHRoaXMtPlNldFByZWZlcmVuY2UoJ2xkYXBfbnRsbV9rZXknLCdSRU1PVEVfVVNFUicpOyAvLyBtb2RfYXV0aF9zc3BpCiR0aGlzLT5TZXRQcmVmZXJlbmNlKCdsZGFwX3VzZV9hZCcsMSk7IC8vIGRlZmF1bHQgdG8gKHB1a2UpIGFjdGl2ZSBkaXJlY3RvcnkuCiR0aGlzLT5TZXRQcmVmZXJlbmNlKCdsZGFwX3VzZV9jbicsMCk7CiR0aGlzLT5TZXRQcmVmZXJlbmNlKCdsZGFwX2FjY291bnRfc3VmZml4JywnJyk7CiR0aGlzLT5TZXRQcmVmZXJlbmNlKCdsZGFwX3VzZV9udGxtJywwKTsKJHRoaXMtPlNldFByZWZlcmVuY2UoJ2xkYXBfZ3JvdXBhcnJhbmdlbWVudCcsJ3VzZXJhdHRyaWInKTsgLy8gZm9yIEFECiR0aGlzLT5TZXRQcmVmZXJlbmNlKCdsZGFwX2F0dHJpYm5hbWUnLCdtZW1iZXJvZicpOyAvLyBmb3IgQUQKJHRoaXMtPlNldFByZWZlcmVuY2UoJ2xkYXBfdW5fcHJlZml4Jywnc2FtYWNjb3VudG5hbWUnKTsKJHRoaXMtPlNldFByZWZlcmVuY2UoJ2xkYXBfYXV0aF9iaW5kJywwKTsKCgojCiMgRU9GCiMKPz4=]]></data>
	</file>
	<file>
	  <filename>/method.uninstall.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKI0JFR0lOX0xJQ0VOU0UKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IEZyb250RW5kVXNlcnMgKGMpIDIwMDggYnkgUm9iZXJ0IENhbXBiZWxsIAojICAgICAgICAgKGNhbGd1eTEwMDBAY21zbWFkZXNpbXBsZS5vcmcpCiMgIEFuIGFkZG9uIG1vZHVsZSBmb3IgQ01TIE1hZGUgU2ltcGxlIHRvIGFsbG93IGEgc2Vjb25kYXJ5IHR5cGUgb2YgCiMgIGF1dGhlbnRpY2F0aW9uIHRvIHRoZSBGRVUgbW9kdWxlLiAgVGhpcyBhZGRvbiBhbGxvd3MgdXNpbmcgdGhlIGFwYWNoZQojICBCQVNJQyBhdXRoZW50aWNhdGlvbi4KIyAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMDUgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQojIFRoaXMgcHJvamVjdCdzIGhvbWVwYWdlIGlzOiBodHRwOi8vd3d3LmNtc21hZGVzaW1wbGUub3JnCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIwojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgojIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBIb3dldmVyLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHUEwsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQKIyBhcyBhbiBhZGRvbiBtb2R1bGUgdG8gQ01TIE1hZGUgU2ltcGxlLiAgWW91IG1heSBub3QgdXNlIHRoaXMgc29mdHdhcmUKIyBpbiBhbnkgTm9uIEdQTCB2ZXJzaW9uIG9mIENNUyBNYWRlIHNpbXBsZSwgb3IgaW4gYW55IHZlcnNpb24gb2YgQ01TCiMgTWFkZSBzaW1wbGUgdGhhdCBkb2VzIG5vdCBpbmRpY2F0ZSBjbGVhcmx5IGFuZCBvYnZpb3VzbHkgaW4gaXRzIGFkbWluIAojIHNlY3Rpb24gdGhhdCB0aGUgc2l0ZSB3YXMgYnVpbHQgd2l0aCBDTVMgTWFkZSBzaW1wbGUuCiMKIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQojIE9yIHJlYWQgaXQgb25saW5lOiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwKIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojRU5EX0xJQ0VOU0UKaWYoICFpc3NldCgkZ0NtcykgKSBleGl0OwoKCiR0aGlzLT5SZW1vdmVQcmVmZXJlbmNlKCk7CiR0aGlzLT5EZWxldGVUZW1wbGF0ZSgpOwoKIwojIEVPRgojCj8+]]></data>
	</file>
	<file>
	  <filename>/skeleton.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKI0JFR0lOX0xJQ0VOU0UKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IEZFVV9BdXRoX0xEQVAgKGMpIDIwMTAgYnkgUm9iZXJ0IENhbXBiZWxsIAojICAgICAgICAgKGNhbGd1eTEwMDBAY21zbWFkZXNpbXBsZS5vcmcpCiMgIEFuIGFkZG9uIG1vZHVsZSBmb3IgQ01TIE1hZGUgU2ltcGxlIHRvIGFsbG93IGEgc2Vjb25kYXJ5IHR5cGUgb2YgCiMgIGF1dGhlbnRpY2F0aW9uIHRvIHRoZSBGRVUgbW9kdWxlLiAgVGhpcyBhZGRvbiBhbGxvd3MgdXNpbmcgdGhlIGFwYWNoZQojICBCQVNJQyBhdXRoZW50aWNhdGlvbi4KIyAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMDUgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQojIFRoaXMgcHJvamVjdCdzIGhvbWVwYWdlIGlzOiBodHRwOi8vd3d3LmNtc21hZGVzaW1wbGUub3JnCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIwojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgojIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBIb3dldmVyLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHUEwsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQKIyBhcyBhbiBhZGRvbiBtb2R1bGUgdG8gQ01TIE1hZGUgU2ltcGxlLiAgWW91IG1heSBub3QgdXNlIHRoaXMgc29mdHdhcmUKIyBpbiBhbnkgTm9uIEdQTCB2ZXJzaW9uIG9mIENNUyBNYWRlIHNpbXBsZSwgb3IgaW4gYW55IHZlcnNpb24gb2YgQ01TCiMgTWFkZSBzaW1wbGUgdGhhdCBkb2VzIG5vdCBpbmRpY2F0ZSBjbGVhcmx5IGFuZCBvYnZpb3VzbHkgaW4gaXRzIGFkbWluIAojIHNlY3Rpb24gdGhhdCB0aGUgc2l0ZSB3YXMgYnVpbHQgd2l0aCBDTVMgTWFkZSBzaW1wbGUuCiMKIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQojIE9yIHJlYWQgaXQgb25saW5lOiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwKIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojRU5EX0xJQ0VOU0UKaWYoICFpc3NldCgkZ0NtcykgKSBleGl0OwoKCiMKIyBFT0YKIwo/Pg==]]></data>
	</file>
	<file>
	  <filename>/templates/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/templates/admin_adv_settings_tab.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[eyRmb3Jtc3RhcnR9CjxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JG1vZC0+TGFuZygnbGRhcF91c2VfY24nKX06PC9wPgogIDxwIGNsYXNzPSJwYWdlaW5wdXQiPgogICAge2NnZV95ZXNub19vcHRpb25zIHByZWZpeD0kYWN0aW9uaWQgbmFtZT1sZGFwX3VzZV9jbiBzZWxlY3RlZD0kbGRhcF91c2VfY259CiAgICA8YnIvPgogICAgeyRtb2QtPkxhbmcoJ2luZm9fbGRhcF91c2VfY24nKX0KICA8L3A+CjwvZGl2PgoKPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICA8cCBjbGFzcz0icGFnZXRleHQiPnskbW9kLT5MYW5nKCdsZGFwX2FjY291bnRfc3VmZml4Jyl9OjwvcD4KICA8cCBjbGFzcz0icGFnZWlucHV0Ij4KICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJ7JGFjdGlvbmlkfWxkYXBfYWNjb3VudF9zdWZmaXgiIHNpemU9IjgwIiBtYXhsZW5ndGg9IjI1NSIgdmFsdWU9InskbGRhcF9hY2NvdW50X3N1ZmZpeH0iLz4KICAgIDxici8+CiAgICB7JG1vZC0+TGFuZygnaW5mb19sZGFwX2FjY291bnRfc3VmZml4Jyl9CiAgPC9wPgo8L2Rpdj4KCjxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JG1vZC0+TGFuZygnbGRhcF9ncm91cGFycmFuZ2VtZW50Jyl9OjwvcD4KICA8cCBjbGFzcz0icGFnZWlucHV0Ij4KICAgIDxzZWxlY3QgbmFtZT0ieyRhY3Rpb25pZH1sZGFwX2dyb3VwYXJyYW5nZW1lbnQiPgogICAge2h0bWxfb3B0aW9ucyBvcHRpb25zPSRncm91cGFycl9vcHRzIHNlbGVjdGVkPSRsZGFwX2dyb3VwYXJyYW5nZW1lbnR9CiAgICA8L3NlbGVjdD4KICA8L3A+CjwvZGl2PgoKPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICA8cCBjbGFzcz0icGFnZXRleHQiPnskbW9kLT5MYW5nKCdsZGFwX2F0dHJpYm5hbWUnKX06PC9wPgogIDxwIGNsYXNzPSJwYWdlaW5wdXQiPgogICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9InskYWN0aW9uaWR9bGRhcF9hdHRyaWJuYW1lIiBzaXplPSIyMCIgbWF4bGVuZ3RoPSI0MCIgdmFsdWU9InskbGRhcF9hdHRyaWJuYW1lfSIvPgogICAgPGJyLz4KICAgIHskbW9kLT5MYW5nKCdpbmZvX2xkYXBfYXR0cmlibmFtZScpfQogIDwvcD4KPC9kaXY+Cgo8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogIDxwIGNsYXNzPSJwYWdldGV4dCI+eyRtb2QtPkxhbmcoJ2xkYXBfdW5fcHJlZml4Jyl9OjwvcD4KICA8cCBjbGFzcz0icGFnZWlucHV0Ij4KICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJ7JGFjdGlvbmlkfWxkYXBfdW5fcHJlZml4IiBzaXplPSIxMCIgbWF4bGVuZ3RoPSIyMCIgdmFsdWU9InskbGRhcF91bl9wcmVmaXh9Ii8+CiAgPC9wPgo8L2Rpdj4KCjxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JG1vZC0+TGFuZygnbGRhcF9hdXRoX2JpbmQnKX06PC9wPgogIDxwIGNsYXNzPSJwYWdlaW5wdXQiPgogICAge2NnZV95ZXNub19vcHRpb25zIHByZWZpeD0kYWN0aW9uaWQgbmFtZT1sZGFwX2F1dGhfYmluZCBzZWxlY3RlZD0kbGRhcF9hdXRoX2JpbmR9CiAgICA8YnIvPgogICAgeyRtb2QtPkxhbmcoJ2luZm9fbGRhcF9hdXRoX2JpbmQnKX0KICA8L3A+CjwvZGl2PgoKPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICA8cCBjbGFzcz0icGFnZXRleHQiPjwvcD4KICA8cCBjbGFzcz0icGFnZWlucHV0Ij4KICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9InskYWN0aW9uaWR9c3VibWl0IiB2YWx1ZT0ieyRtb2QtPkxhbmcoJ3N1Ym1pdCcpfSIvPgogIDwvcD4KPC9kaXY+CnskZm9ybWVuZH0=]]></data>
	</file>
	<file>
	  <filename>/templates/admin_ad_settings_tab.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[eyRmb3Jtc3RhcnR9CjxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JG1vZC0+TGFuZygnbGRhcF91c2VfbnRsbScpfTo8L3A+CiAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+CiAgICB7Y2dlX3llc25vX29wdGlvbnMgcHJlZml4PSRhY3Rpb25pZCBuYW1lPWxkYXBfdXNlX250bG0gc2VsZWN0ZWQ9JGxkYXBfdXNlX250bG19CiAgPC9wPgo8L2Rpdj4KCgo8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogIDxwIGNsYXNzPSJwYWdldGV4dCI+eyRtb2QtPkxhbmcoJ2xkYXBfbnRsbV9rZXknKX06PC9wPgogIDxwIGNsYXNzPSJwYWdlaW5wdXQiPgogICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9InskYWN0aW9uaWR9bGRhcF9udGxtX2tleSIgdmFsdWU9InskbGRhcF9udGxtX2tleX0iIHNpemU9IjQwIiBtYXhsZW5ndGg9IjI1NSIvPgogICAgPGJyLz4KICAgIHskbW9kLT5MYW5nKCdpbmZvX250bG1fa2V5Jyl9CiAgPC9wPgo8L2Rpdj4KCjxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij48L3A+CiAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+CiAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJ7JGFjdGlvbmlkfXN1Ym1pdCIgdmFsdWU9InskbW9kLT5MYW5nKCdzdWJtaXQnKX0iLz4KICA8L3A+CjwvZGl2PgoKeyRmb3JtZW5kfQ==]]></data>
	</file>
	<file>
	  <filename>/templates/admin_settings_tab.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[eyRmb3Jtc3RhcnR9CjxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JG1vZC0+TGFuZygnbGRhcF9zZXJ2ZXInKX06PC9wPgogIDxwIGNsYXNzPSJwYWdlaW5wdXQiPgogICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9InskYWN0aW9uaWR9bGRhcF9ob3N0cyIgc2l6ZT0iODAiIG1heGxlbmd0aD0iMjU1IiB2YWx1ZT0ieyRsZGFwX2hvc3RzfSIvPgogICAgPGJyLz4KICAgIHskbW9kLT5MYW5nKCdpbmZvX2xkYXBfc2VydmVyJyl9CiAgPC9wPgo8L2Rpdj4KCjxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JG1vZC0+TGFuZygnbGRhcF9iYXNlZG4nKX06PC9wPgogIDxwIGNsYXNzPSJwYWdlaW5wdXQiPgogICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9InskYWN0aW9uaWR9bGRhcF9iYXNlZG4iIHNpemU9IjgwIiBtYXhsZW5ndGg9IjI1NSIgdmFsdWU9InskbGRhcF9iYXNlZG59Ii8+CiAgPC9wPgo8L2Rpdj4KCjxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JG1vZC0+TGFuZygnbGRhcF9hdXRoX3VuJyl9OjwvcD4KICA8cCBjbGFzcz0icGFnZWlucHV0Ij4KICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJ7JGFjdGlvbmlkfWxkYXBfYXV0aF91biIgc2l6ZT0iODAiIG1heGxlbmd0aD0iMjU1IiB2YWx1ZT0ieyRsZGFwX2F1dGhfdW59Ii8+CiAgICA8YnIvPgogICAgeyRtb2QtPkxhbmcoJ2luZm9fbGRhcF9hdXRoX3VuJyl9CiAgPC9wPgo8L2Rpdj4KCjxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JG1vZC0+TGFuZygnbGRhcF9hdXRoX3B3Jyl9OjwvcD4KICA8cCBjbGFzcz0icGFnZWlucHV0Ij4KICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJ7JGFjdGlvbmlkfWxkYXBfYXV0aF9wdyIgc2l6ZT0iODAiIG1heGxlbmd0aD0iMjU1IiB2YWx1ZT0ieyRsZGFwX2F1dGhfcHd9Ii8+CiAgICA8YnIvPgogICAgeyRtb2QtPkxhbmcoJ2luZm9fbGRhcF9hdXRoX3B3Jyl9CiAgPC9wPgo8L2Rpdj4KCjxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JG1vZC0+TGFuZygnbGRhcF91c2VfYWQnKX06PC9wPgogIDxwIGNsYXNzPSJwYWdlaW5wdXQiPgogICAge2NnZV95ZXNub19vcHRpb25zIHByZWZpeD0kYWN0aW9uaWQgbmFtZT1sZGFwX3VzZV9hZCBzZWxlY3RlZD0kbGRhcF91c2VfYWR9CiAgPC9wPgo8L2Rpdj4KCjxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JG1vZC0+TGFuZygnbGRhcF9yZXF1aXJlX2dyb3VwJyl9OjwvcD4KICA8cCBjbGFzcz0icGFnZWlucHV0Ij4KICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJ7JGFjdGlvbmlkfWxkYXBfcmVxdWlyZV9ncm91cCIgdmFsdWU9InskbGRhcF9yZXF1aXJlX2dyb3VwfSIgc2l6ZT0iNDAiIG1heGxlbmd0aD0iMjU1Ii8+CiAgPC9wPgo8L2Rpdj4KCjxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij48L3A+CiAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+CiAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJ7JGFjdGlvbmlkfXN1Ym1pdCIgdmFsdWU9InskbW9kLT5MYW5nKCdzdWJtaXQnKX0iLz4KICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9InskYWN0aW9uaWR9dGVzdCIgdmFsdWU9InskbW9kLT5MYW5nKCd0ZXN0X2Nvbm5lY3QnKX0iIG9uY2xpY2s9InJldHVybiBjb25maXJtKCd7JG1vZC0+TGFuZygnY29uZmlybV9zdWJtaXR0ZWQnKX0nKSIvPgogIDwvcD4KPC9kaXY+Cgp7JGZvcm1lbmR9]]></data>
	</file>
	<file>
	  <filename>/templates/login_template.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[]]></data>
	</file>
	<file>
	  <filename>/templates/orig_login_template.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[eyogbG9naW4gdGVtcGxhdGUgKn0Ke2lmIGlzc2V0KCRlcnJvcil9CntjZ2Vycm9yfXskZXJyb3J9ey9jZ2Vycm9yfQp7L2lmfQoKe2lmIGlzc2V0KCRmb3Jtc3RhcnQpfQp7JGZvcm1zdGFydH0KPHA+CnskbW9kLT5MYW5nKCd1c2VybmFtZScpfToKPGlucHV0IHR5cGU9InRleHQiIG5hbWU9InskYWN0aW9uaWR9ZmV1bGRhcF91c2VybmFtZSIgdmFsdWU9InskdXNlcm5hbWV9IiBzaXplPSI0MCIgbWF4bGVuZ3RoPSI0MCIvPjxici8+CnskbW9kLT5MYW5nKCdwYXNzd29yZCcpfToKPGlucHV0IHR5cGU9InBhc3N3b3JkIiBuYW1lPSJ7JGFjdGlvbmlkfWZldWxkYXBfcGFzc3dvcmQiIHZhbHVlPSJ7JHBhc3N3b3JkfSIgc2l6ZT0iMTIiIG1heGxlbmd0aD0iMTIiLz48YnIvPgo8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJ7JGFjdGlvbmlkfWZldWxkYXBfc3VibWl0IiB2YWx1ZT0ieyRtb2QtPkxhbmcoJ3N1Ym1pdCcpfSIvPgo8L3A+CnskZm9ybWVuZH0Key9pZn0K]]></data>
	</file>
	<file>
	  <filename>/templates/orig_logout_template.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[eyogbG9nb3V0IHRlbXBsYXRlICp9CjxwPjxhIGhyZWY9InskbG9nb3V0X3VybH0iPnskRkVVX0F1dGhfTERBUC0+TGFuZygnbG9nb3V0Jyl9PC9hPjwvcD4K]]></data>
	</file>
</module>
