<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE module [
  <!ELEMENT module (name,version,description*,help*,about*,requires*,file+)>
  <!ELEMENT name (#PCDATA)>
  <!ELEMENT version (#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>
  <name>ThemeManager</name>
  <version>1.0.4</version>
  <help>PGgzPldoYXQgRG9lcyBUaGlzIERvPzwvaDM+CjxwPlRoaXMgbW9kdWxlIGFsbG93cyB5b3UgdG8gaW1wb3J0IGFuZCBleHBvcnQgdGVtcGxhdGVzIGFuZCB0aGVpciBhdHRhY2hlZCBzdHlsZXNoZWV0cyBhcyAidGhlbWVzIi4gIFRoaXMgYWxsb3dzIHlvdSB0byBzaGFyZSB5b3VyIGxvb2sgYW5kIGZlZWwgd2l0aCBvdGhlciBjbXMgdXNlcnMuPC9wCjxoMz5Ib3cgRG8gSSBVc2UgSXQ8L2gzPgo8cD5UaGlzIG1vZHVsZSBoYXMgbm8gZnJvbnQgZW5kIGludGVyZmFjZSwgb25seSBhbiBhZG1pbiBpbnRlcmZhY2UuICBJdCBhbGxvd3MgeW91IHRvIHNlbGVjdCBhbiBleGlzdGluZyAoYWN0aXZlKSB0ZW1wbGF0ZSwgYW5kIGNsaWNrICJFeHBvcnQiLiAgQW4gWE1MIGZpbGUgY29udGFpbmluZyB0aGUgdGVtcGxhdGUgYW5kIGl0cyBhdHRhY2hlZCBzdHlsZXNoZWV0cyB3aWxsIGJlIGNyZWF0ZWQgYW5kIHNlbnQgeW91IHlvdSB2aWEgZG93bmxvYWQuPC9wPgo8aDM+UGVybWlzc2lvbnM8L2gzPgo8cD5UaGUgcGVybWlzc2lvbnMgbW9kZWwgaXMgc3RyaWN0IGZvciB0aGUgVGhlbWUgTWFuYWdlciB0byBlbnN1cmUgZGF0YWJhc2UgaW50ZWdyaXR5LiAgVGhlIHBlcm1pc3Npb24gIk1hbmFnZSBUaGVtZXMiIGlzIHJlcXVpcmVkIHRvIGV4cG9ydCBwZXJtaXNzaW9ucywgYW5kIHRoZXNlIHRocmVlIHBlcm1pc3Npb25zICgiQWRkIFN0eWxlc2hlZXRzIiwgIkFkZCBTdHlsZVNoZWV0IEFzc29jYXRpb25zIiwgYW5kICJBZGQgVGVtcGxhdGVzIikgYXJlIHJlcXVpcmVkIHRvIGJlIGFibGUgdG8gaW1wb3J0IGEgdGhlbWUuPC9wPgo8cD5BcyB3ZWxsLCB0aGUgb3Bwb3NpdGUgZnVuY3Rpb25hbGl0eSBleGlzdHMsIHlvdSBtYXkgdXBsb2FkIGEgdGhlbWUgZmlsZSAoeG1sIGZvcm1hdCkgYW5kIGhhdmUgdGhlIGVuY2xvc2VkIHRlbXBsYXRlcyBhbmQgc3R5bGVzaGVldHMgYXV0b21hdGljYWxseSBpbXBvcnRlZCBpbnRvIHlvdXIgY21zbXMgaW5zdGFsbGF0aW9uLjwvcD4KPGgzPlN1cHBvcnQ8L2gzPgo8cD5UaGlzIG1vZHVsZSBkb2VzIG5vdCBpbmNsdWRlIGNvbW1lcmNpYWwgc3VwcG9ydC4gSG93ZXZlciwgdGhlcmUgYXJlIGEgbnVtYmVyIG9mIHJlc291cmNlcyBhdmFpbGFibGUgdG8gaGVscCB5b3Ugd2l0aCBpdDo8L3A+Cjx1bD4KPGxpPkZvciB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhpcyBtb2R1bGUsIEZBUXMsIG9yIHRvIGZpbGUgYSBCdWcgUmVwb3J0IG9yIGJ1eSBjb21tZXJjaWFsIHN1cHBvcnQsIHBsZWFzZSB2aXNpdCB0aGUgbW9kdWxlIGhvbWVwYWdlIGF0IDxhIGhyZWY9Imh0dHA6Ly9kZXYuY21zbWFkZXNpbXBsZS5vcmciPmRldi5jbXNtYWRlc2ltcGxlLm9yZzwvYT4uPC9saT4KPGxpPkFkZGl0aW9uYWwgZGlzY3Vzc2lvbiBvZiB0aGlzIG1vZHVsZSBtYXkgYWxzbyBiZSBmb3VuZCBpbiB0aGUgPGEgaHJlZj0iaHR0cDovL2ZvcnVtLmNtc21hZGVzaW1wbGUub3JnIj5DTVMgTWFkZSBTaW1wbGUgRm9ydW1zPC9hPi48L2xpPgo8bGk+VGhlIGF1dGhvciwgY2FsZ3V5MTAwMCwgY2FuIG9mdGVuIGJlIGZvdW5kIGluIHRoZSA8YSBocmVmPSJpcmM6Ly9pcmMuZnJlZW5vZGUubmV0LyNjbXMiPkNNUyBJUkMgQ2hhbm5lbDwvYT4uPC9saT4KPGxpPkxhc3RseSwgeW91IG1heSBoYXZlIHNvbWUgc3VjY2VzcyBlbWFpbGluZyB0aGUgYXV0aG9yIGRpcmVjdGx5LjwvbGk+ICAKPC91bD4KPHA+QXMgcGVyIHRoZSBHUEwsIHRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYXMtaXMuIFBsZWFzZSByZWFkIHRoZSB0ZXh0Cm9mIHRoZSBsaWNlbnNlIGZvciB0aGUgZnVsbCBkaXNjbGFpbWVyLjwvcD4KCjxoMz5Db3B5cmlnaHQgYW5kIExpY2Vuc2U8L2gzPgo8cD5Db3B5cmlnaHQgJmNvcHk7IDIwMDUsIFJvYmVydCBDYW1wYmVsbCA8YSBocmVmPSJtYWlsdG86Y2FsZ3V5MTAwMEBob3RtYWlsLmNvbSI+Jmx0O2NhbGd1eTEwMDBAaG90bWFpbC5jb20mZ3Q7PC9hPi4gQWxsIFJpZ2h0cyBBcmUgUmVzZXJ2ZWQuPC9wPgo8cD5UaGlzIG1vZHVsZSBoYXMgYmVlbiByZWxlYXNlZCB1bmRlciB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMIj5HTlUgUHVibGljIExpY2Vuc2U8L2E+LiBZb3UgbXVzdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UgYmVmb3JlIHVzaW5nIHRoZSBtb2R1bGUuPC9wPgo8aDM+UGFyYW1ldGVyczwvaDM+PHVsPjxsaT48ZW0+KG9wdGlvbmFsKTwvZW0+IGxhbmc9ImVuX1VTIiAtIFBhcmFtZXRlciBpcyB1c2VkIHRvIHNwZWNpZnkgd2hhdCBsYW5ndWFnZSB0byB1c2UgZm9yIGRpc3BsYXkgb24gdGhlIGZyb250ZW5kLiBOb3QgYWxsIG1vZHVsZXMgc3VwcG9ydCBvciBuZWVkIHRoaXMuPC9saT48L3VsPg==</help>
  <about>PGJyIC8+QXV0aG9yOiBjYWxndXkxMDAwICZsdDtjYWxndXkxMDAwQGhvdG1haWwuY29tJmd0OzxiciAvPjxiciAvPlZlcnNpb246IDEuMC40PGJyIC8+PGJyIC8+Q2hhbmdlIEhpc3Rvcnk6PGJyIC8+PHVsPgo8bGk+PHA+VmVyc2lvbiAxLjAuNC4gSmFudWFyeSwgMjAwNjwvcD4KPHA+RW5zdXJlIHdlIG9ubHkgb3V0cHV0IHRoZSBzYW1lIHRlbXBsYXRlLCBzdHlsc2hlZXQsIGFuZCBmaWxlIG9uY2UgKG9yIG1ha2UgYSByZWFzb25hYmxlIGVmZm9ydCBhdCBpdCksIGFuZCBhZGRlZCBhIGR0ZHZlcnNpb24gdGFnIHRvIHRoZSBvdXRwdXQuICBBbHNvIGEgbXVjaCBzdHJpY3RlciBwZXJtaXNzb25zIG1vZGVsLiAgUmVtb3ZlZCB0aGUgZXh0cmEgZGVidWcgbWVzc2FnZXMgdG9vLjwvcD4KPHA+PGI+Tm90ZTo8L2I+IFhNTCBmaWxlcyBjcmVhdGVkIHdpdGggb2xkZXIgdmVyc2lvbnMgb2YgdGhlbWUgbWFuYWdlciB3aWxsIG5vdCBpbXBvcnQuICBUaGlzIGlzIGJlY2F1c2Ugb2YgdGhlIGR0ZCB2ZXJzaW9uaW5nIHNjaGVtZSBpbmNsdWRlZCwgYW5kIHRoaXMgaXMgYSBzZWN1cml0eSBmZWF0dXJlLiAgU29ycnkgZm9sa3MuPC9wPgo8L2xpPgo8bGk+PHA+VmVyc2lvbiAxLjAuMy4gSmFudWFyeSwgMjAwNjwvcD4KPHA+Tm93IHN1cHBvcnRzIG11bHRpcGxlIHRlbXBsYXRlcyBpbiBvbmUgdGhlbWUsIHJlY3Vyc2l2ZSBkaXJlY3RvcnkgY3JlYXRpb24sIGFuZCBiYXNlNjRfZW5jb2RlcyBvZiBhbGwgc3R5bGVzaGVldHMgYW5kIHRlbXBsYXRlczwvcD4KPC9saT4KPGxpPjxwPlZlcnNpb24gMS4wLjIuIERlY2VtYmVyLCAyMDA1PC9wPgo8cD5Ob3cgaGFuZGxlcyBpbmNsdWRlZCBpbWFnZXMgYW5kIGphdmFzY3JpcHQgaW4gYm90aCB0aGUgc3R5bGVzaGVldHMgYW5kIHRoZSB0ZW1wbGF0ZXMuICBXaGVuIHJlc3RvcmluZyBmaWxlcyBhcmUgcmVzdG9yZWQgdG8gYSBkaXJlY3RvcnkgY3JlYXRlZCB1bmRlciB1cGxvYWRzL3RoZW1lbmFtZS48L3A+PC9saT4KPGxpPlZlcnNpb24gMS4wLjEuIERlY2VtYmVyLCAyMDA1IC0gRml4ZWQgZGVwZW5kZW5jaWVzLCBoZWxwLCBhbmQgZ2VuZXJhbCBjbGVhbnVwLjwvbGk+CjxsaT5WZXJzaW9uIDEuMC4wLiAzMSBOb3ZlbWJlciwgMjAwNSAtIEluaXRpYWwgUmVsZWFzZS48L2xpPgo8L3VsPjxiciAvPg==</about>
  <description>A module to allow importing and exporting of content themes (templates and stylesheets)</description>
  <file>
    <filename>/</filename>
    <isdir>1</isdir>
  </file>
  <file>
    <filename>/index.html</filename>
    <isdir>0</isdir>
    <data><![CDATA[]]></data>
  </file>
  <file>
    <filename>/lang/</filename>
    <isdir>1</isdir>
  </file>
  <file>
    <filename>/lang/en_US.php</filename>
    <isdir>0</isdir>
    <data><![CDATA[PD9waHAKJGxhbmdbJ2FjdGl2ZSddID0gJ0FjdGl2ZSc7CiRsYW5nWydkZWZhdWx0J10gPSAnRGVmYXVsdCc7CiRsYW5nWydwcm9tcHRfdGhlbWVuYW1lJ10gPSAnVGhlbWUgTmFtZTonOwokbGFuZ1snZXJyb3Jfbm9maWxlc3VwbG9hZGVkJ10gPSAnTm8gZmlsZXMgd2VyZSB1cGxvYWRlZC4gTWFrZSBzdXJlIHlvdXIgZm9ybSB0YWdcJ3MgZW5jdHlwZSB3YXMgc2V0IHRvIG11bHRpcGFydC9mb3JtLWRhdGEgYW5kIHRoYXQgdGhlIHJpZ2h0IGZpZWxkIGlzIGJlaW5nIGNoZWNrZWQgZm9yIHRoZSB1cGxvYWRlZCBmaWxlLic7CiRsYW5nWydlcnJvcl90ZW1wbGF0ZWV4aXN0cyddID0gJ0EgdGVtcGxhdGUgd2l0aCB0aGUgbmFtZSAiJXMiIGFscmVhZHkgZXhpc3RzJzsKJGxhbmdbJ2Vycm9yX3N0eWxlc2hlZXRleGlzdHMnXSA9ICdBIHN0eWxlc2hlZXQgd2l0aCB0aGUgbmFtZSAiJXMiIGFscmVhZHkgZXhpc3RzJzsKJGxhbmdbJ2Vycm9yX25vc3R5bGVzaGVldHMnXSA9ICdObyBzdHlsZXNoZWV0cyB3ZXJlIGRldGVjdGVkIGluIHRoaXMgdGhlbWUnOwokbGFuZ1snZXJyb3JfY291bGRub3RjcmVhdGV0ZW1wbGF0ZSddID0gJ0NvdWxkIG5vdCBjcmVhdGUgdGhlIHRlbXBsYXRlIGRlZmluaXRpb24nOwokbGFuZ1snZXJyb3JfY291bGRub3Rhc3NvY2NzcyddID0gJ1Byb2JsZW0gYXNzb2NpYXRpbmcgc3R5bGVzaGVldHMgd2l0aCB0aGUgdGVtcGxhdGUnOwokbGFuZ1snZXJyb3Jfbm9vdXRwdXQnXSA9ICdOb3RoaW5nIHRvIG91dHB1dCc7CiRsYW5nWydlcnJvcl9ub3RlbXBsYXRlJ10gPSAnQ291bGQgbm90IGZpbmQgdGVtcGxhdGUnOwokbGFuZ1snZXJyb3JfZHRkbWlzbWF0Y2gnXSA9ICdEVEQgVmVyc2lvbiBtaXNtYXRjaCwgY2Fubm90IGltcG9ydCc7CiRsYW5nWydpbXBvcnQnXSA9ICdJbXBvcnQnOwokbGFuZ1sndXBsb2FkJ10gPSAnVXBsb2FkIFRoZW1lJzsKJGxhbmdbJ2lkJ10gPSAnSWQnOwokbGFuZ1snbmFtZSddID0gJ05hbWUnOwokbGFuZ1snYWN0aXZlJ10gPSAnQWN0aXZlJzsKJGxhbmdbJ2RlZmF1bHQnXSA9ICdEZWZhdWx0JzsKJGxhbmdbJ2V4cG9ydCddID0gJ0V4cG9ydCc7CiRsYW5nWydzdWJtaXQnXSA9ICdTdWJtaXQnOwokbGFuZ1snZnJpZW5kbHluYW1lJ10gPSAnVGhlbWUgTWFuYWdlcic7CiRsYW5nWydwb3N0aW5zdGFsbCddID0gJ0JlIHN1cmUgdG8gc2V0ICJNYW5hZ2UgVGhlbWVzIiBwZXJtaXNzaW9ucyB0byB1c2UgdGhpcyBtb2R1bGUhJzsKJGxhbmdbJ3Bvc3R1bmluc3RhbGwnXSA9ICciQ3Vyc2VzISBGb2lsZWQgQWdhaW4hIic7CiRsYW5nWyd1bmluc3RhbGxlZCddID0gJ01vZHVsZSBVbmluc3RhbGxlZC4nOwokbGFuZ1snaW5zdGFsbGVkJ10gPSAnTW9kdWxlIHZlcnNpb24gJXMgaW5zdGFsbGVkLic7CiRsYW5nWydwcmVmc3VwZGF0ZWQnXSA9ICdNb2R1bGUgcHJlZmVyZW5jZXMgdXBkYXRlZC4nOwokbGFuZ1snYWNjZXNzZGVuaWVkJ10gPSAnQWNjZXNzIERlbmllZC4gUGxlYXNlIGNoZWNrIHlvdXIgcGVybWlzc2lvbnMuJzsKJGxhbmdbJ2Vycm9yJ10gPSAnRXJyb3IhJzsKJGxhbmdbJ3VwZ3JhZGVkJ10gPSAnTW9kdWxlIHVwZ3JhZGVkIHRvIHZlcnNpb24gJXMuJzsKJGxhbmdbJ21vZGRlc2NyaXB0aW9uJ10gPSAnQSBtb2R1bGUgdG8gYWxsb3cgaW1wb3J0aW5nIGFuZCBleHBvcnRpbmcgb2YgY29udGVudCB0aGVtZXMgKHRlbXBsYXRlcyBhbmQgc3R5bGVzaGVldHMpJzsKJGxhbmdbJ2NoYW5nZWxvZyddID0gJzx1bD4KPGxpPjxwPlZlcnNpb24gMS4wLjQuIEphbnVhcnksIDIwMDY8L3A+CjxwPkVuc3VyZSB3ZSBvbmx5IG91dHB1dCB0aGUgc2FtZSB0ZW1wbGF0ZSwgc3R5bHNoZWV0LCBhbmQgZmlsZSBvbmNlIChvciBtYWtlIGEgcmVhc29uYWJsZSBlZmZvcnQgYXQgaXQpLCBhbmQgYWRkZWQgYSBkdGR2ZXJzaW9uIHRhZyB0byB0aGUgb3V0cHV0LiAgQWxzbyBhIG11Y2ggc3RyaWN0ZXIgcGVybWlzc29ucyBtb2RlbC4gIFJlbW92ZWQgdGhlIGV4dHJhIGRlYnVnIG1lc3NhZ2VzIHRvby48L3A+CjxwPjxiPk5vdGU6PC9iPiBYTUwgZmlsZXMgY3JlYXRlZCB3aXRoIG9sZGVyIHZlcnNpb25zIG9mIHRoZW1lIG1hbmFnZXIgd2lsbCBub3QgaW1wb3J0LiAgVGhpcyBpcyBiZWNhdXNlIG9mIHRoZSBkdGQgdmVyc2lvbmluZyBzY2hlbWUgaW5jbHVkZWQsIGFuZCB0aGlzIGlzIGEgc2VjdXJpdHkgZmVhdHVyZS4gIFNvcnJ5IGZvbGtzLjwvcD4KPC9saT4KPGxpPjxwPlZlcnNpb24gMS4wLjMuIEphbnVhcnksIDIwMDY8L3A+CjxwPk5vdyBzdXBwb3J0cyBtdWx0aXBsZSB0ZW1wbGF0ZXMgaW4gb25lIHRoZW1lLCByZWN1cnNpdmUgZGlyZWN0b3J5IGNyZWF0aW9uLCBhbmQgYmFzZTY0X2VuY29kZXMgb2YgYWxsIHN0eWxlc2hlZXRzIGFuZCB0ZW1wbGF0ZXM8L3A+CjwvbGk+CjxsaT48cD5WZXJzaW9uIDEuMC4yLiBEZWNlbWJlciwgMjAwNTwvcD4KPHA+Tm93IGhhbmRsZXMgaW5jbHVkZWQgaW1hZ2VzIGFuZCBqYXZhc2NyaXB0IGluIGJvdGggdGhlIHN0eWxlc2hlZXRzIGFuZCB0aGUgdGVtcGxhdGVzLiAgV2hlbiByZXN0b3JpbmcgZmlsZXMgYXJlIHJlc3RvcmVkIHRvIGEgZGlyZWN0b3J5IGNyZWF0ZWQgdW5kZXIgdXBsb2Fkcy90aGVtZW5hbWUuPC9wPjwvbGk+CjxsaT5WZXJzaW9uIDEuMC4xLiBEZWNlbWJlciwgMjAwNSAtIEZpeGVkIGRlcGVuZGVuY2llcywgaGVscCwgYW5kIGdlbmVyYWwgY2xlYW51cC48L2xpPgo8bGk+VmVyc2lvbiAxLjAuMC4gMzEgTm92ZW1iZXIsIDIwMDUgLSBJbml0aWFsIFJlbGVhc2UuPC9saT4KPC91bD4nOwokbGFuZ1snaGVscCddID0gJzxoMz5XaGF0IERvZXMgVGhpcyBEbz88L2gzPgo8cD5UaGlzIG1vZHVsZSBhbGxvd3MgeW91IHRvIGltcG9ydCBhbmQgZXhwb3J0IHRlbXBsYXRlcyBhbmQgdGhlaXIgYXR0YWNoZWQgc3R5bGVzaGVldHMgYXMgInRoZW1lcyIuICBUaGlzIGFsbG93cyB5b3UgdG8gc2hhcmUgeW91ciBsb29rIGFuZCBmZWVsIHdpdGggb3RoZXIgY21zIHVzZXJzLjwvcAo8aDM+SG93IERvIEkgVXNlIEl0PC9oMz4KPHA+VGhpcyBtb2R1bGUgaGFzIG5vIGZyb250IGVuZCBpbnRlcmZhY2UsIG9ubHkgYW4gYWRtaW4gaW50ZXJmYWNlLiAgSXQgYWxsb3dzIHlvdSB0byBzZWxlY3QgYW4gZXhpc3RpbmcgKGFjdGl2ZSkgdGVtcGxhdGUsIGFuZCBjbGljayAiRXhwb3J0Ii4gIEFuIFhNTCBmaWxlIGNvbnRhaW5pbmcgdGhlIHRlbXBsYXRlIGFuZCBpdHMgYXR0YWNoZWQgc3R5bGVzaGVldHMgd2lsbCBiZSBjcmVhdGVkIGFuZCBzZW50IHlvdSB5b3UgdmlhIGRvd25sb2FkLjwvcD4KPGgzPlBlcm1pc3Npb25zPC9oMz4KPHA+VGhlIHBlcm1pc3Npb25zIG1vZGVsIGlzIHN0cmljdCBmb3IgdGhlIFRoZW1lIE1hbmFnZXIgdG8gZW5zdXJlIGRhdGFiYXNlIGludGVncml0eS4gIFRoZSBwZXJtaXNzaW9uICJNYW5hZ2UgVGhlbWVzIiBpcyByZXF1aXJlZCB0byBleHBvcnQgcGVybWlzc2lvbnMsIGFuZCB0aGVzZSB0aHJlZSBwZXJtaXNzaW9ucyAoIkFkZCBTdHlsZXNoZWV0cyIsICJBZGQgU3R5bGVTaGVldCBBc3NvY2F0aW9ucyIsIGFuZCAiQWRkIFRlbXBsYXRlcyIpIGFyZSByZXF1aXJlZCB0byBiZSBhYmxlIHRvIGltcG9ydCBhIHRoZW1lLjwvcD4KPHA+QXMgd2VsbCwgdGhlIG9wcG9zaXRlIGZ1bmN0aW9uYWxpdHkgZXhpc3RzLCB5b3UgbWF5IHVwbG9hZCBhIHRoZW1lIGZpbGUgKHhtbCBmb3JtYXQpIGFuZCBoYXZlIHRoZSBlbmNsb3NlZCB0ZW1wbGF0ZXMgYW5kIHN0eWxlc2hlZXRzIGF1dG9tYXRpY2FsbHkgaW1wb3J0ZWQgaW50byB5b3VyIGNtc21zIGluc3RhbGxhdGlvbi48L3A+CjxoMz5TdXBwb3J0PC9oMz4KPHA+VGhpcyBtb2R1bGUgZG9lcyBub3QgaW5jbHVkZSBjb21tZXJjaWFsIHN1cHBvcnQuIEhvd2V2ZXIsIHRoZXJlIGFyZSBhIG51bWJlciBvZiByZXNvdXJjZXMgYXZhaWxhYmxlIHRvIGhlbHAgeW91IHdpdGggaXQ6PC9wPgo8dWw+CjxsaT5Gb3IgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoaXMgbW9kdWxlLCBGQVFzLCBvciB0byBmaWxlIGEgQnVnIFJlcG9ydCBvciBidXkgY29tbWVyY2lhbCBzdXBwb3J0LCBwbGVhc2UgdmlzaXQgdGhlIG1vZHVsZSBob21lcGFnZSBhdCA8YSBocmVmPSJodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnIj5kZXYuY21zbWFkZXNpbXBsZS5vcmc8L2E+LjwvbGk+CjxsaT5BZGRpdGlvbmFsIGRpc2N1c3Npb24gb2YgdGhpcyBtb2R1bGUgbWF5IGFsc28gYmUgZm91bmQgaW4gdGhlIDxhIGhyZWY9Imh0dHA6Ly9mb3J1bS5jbXNtYWRlc2ltcGxlLm9yZyI+Q01TIE1hZGUgU2ltcGxlIEZvcnVtczwvYT4uPC9saT4KPGxpPlRoZSBhdXRob3IsIGNhbGd1eTEwMDAsIGNhbiBvZnRlbiBiZSBmb3VuZCBpbiB0aGUgPGEgaHJlZj0iaXJjOi8vaXJjLmZyZWVub2RlLm5ldC8jY21zIj5DTVMgSVJDIENoYW5uZWw8L2E+LjwvbGk+CjxsaT5MYXN0bHksIHlvdSBtYXkgaGF2ZSBzb21lIHN1Y2Nlc3MgZW1haWxpbmcgdGhlIGF1dGhvciBkaXJlY3RseS48L2xpPiAgCjwvdWw+CjxwPkFzIHBlciB0aGUgR1BMLCB0aGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGFzLWlzLiBQbGVhc2UgcmVhZCB0aGUgdGV4dApvZiB0aGUgbGljZW5zZSBmb3IgdGhlIGZ1bGwgZGlzY2xhaW1lci48L3A+Cgo8aDM+Q29weXJpZ2h0IGFuZCBMaWNlbnNlPC9oMz4KPHA+Q29weXJpZ2h0ICZjb3B5OyAyMDA1LCBSb2JlcnQgQ2FtcGJlbGwgPGEgaHJlZj0ibWFpbHRvOmNhbGd1eTEwMDBAaG90bWFpbC5jb20iPiZsdDtjYWxndXkxMDAwQGhvdG1haWwuY29tJmd0OzwvYT4uIEFsbCBSaWdodHMgQXJlIFJlc2VydmVkLjwvcD4KPHA+VGhpcyBtb2R1bGUgaGFzIGJlZW4gcmVsZWFzZWQgdW5kZXIgdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTCI+R05VIFB1YmxpYyBMaWNlbnNlPC9hPi4gWW91IG11c3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlIGJlZm9yZSB1c2luZyB0aGUgbW9kdWxlLjwvcD4KJzsKPz4K]]></data>
  </file>
  <file>
    <filename>/templates/</filename>
    <isdir>1</isdir>
  </file>
  <file>
    <filename>/templates/error.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[PGgzPnskdGl0bGVfZXJyb3J9PC9oMz4KPHA+eyRhZG1pbl9uYXZ9PC9wPgp7aWYgJG1lc3NhZ2UhPScnfTxwPnskbWVzc2FnZX08L3A+ey9pZn0=]]></data>
  </file>
  <file>
    <filename>/templates/export.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[eyRzdGFydGZvcm19CntpZiAkaXRlbWNvdW50ID4gMH0KPHRhYmxlIGNlbGxzcGFjaW5nPSIwIiBjbGFzcz0icGFnZXRhYmxlIj4KCTx0aGVhZD4KCQk8dHI+CgkJCTx0aD57JGlkdGV4dH08L3RoPgoJCQk8dGg+eyRuYW1ldGV4dH08L3RoPgoJCQk8dGg+eyRhY3RpdmV0ZXh0fTwvdGg+CgkJCTx0aD57JGRlZmF1bHR0ZXh0fTwvdGg+CgkJCTx0aD57JGV4cG9ydHRleHR9PC90aD4KCQk8L3RyPgoJPC90aGVhZD4KCTx0Ym9keT4KCXtmb3JlYWNoIGZyb209JGl0ZW1zIGl0ZW09ZW50cnl9CgkJPHRyIGNsYXNzPSJ7JGVudHJ5LT5yb3djbGFzc30iPgoJCQk8dGQ+eyRlbnRyeS0+aWR9PC90ZD4KCQkJPHRkPnskZW50cnktPm5hbWV9PC90ZD4KCQkJPHRkPnskZW50cnktPmFjdGl2ZX08L3RkPgoJCQk8dGQ+eyRlbnRyeS0+ZGVmYXVsdH08L3RkPgoJCQk8dGQ+eyRlbnRyeS0+c2VsZWN0fTwvdGQ+CgkJPC90cj4KCXsvZm9yZWFjaH0KCTwvdGJvZHk+CjwvdGFibGU+CjxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHByb21wdF90aGVtZW5hbWV9PC9wPgogIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaW5wdXRfdGhlbWVuYW1lfTwvcD4KPC9kaXY+CjxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij4mbmJzcDs8L3A+CiAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRoaWRkZW59eyRzdWJtaXR9eyRjYW5jZWx9PC9wPgo8L2Rpdj4Key9pZn0KeyRlbmRmb3JtfQo=]]></data>
  </file>
  <file>
    <filename>/templates/import.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[eyRzdGFydGZvcm19CjxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHByb21wdF9icm93c2V9PC9wPgogIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaW5wdXRfYnJvd3NlfTwvcD4KPC9kaXY+CjxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij4mbmJzcDs8L3A+CiAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRoaWRkZW59eyRzdWJtaXR9eyRjYW5jZWx9PC9wPgo8L2Rpdj4KeyRlbmRmb3JtfQo=]]></data>
  </file>
  <file>
    <filename>/ThemeManager.module.php</filename>
    <isdir>0</isdir>
    <data><![CDATA[PD9waHAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IFRoZW1lTWFuYWdlciAtIGEgbW9kdWxlIGZvciBpbXBvcnRpbmcgYW5kIGV4cG9ydGluZyB0ZW1wbGF0ZQojICAgYW5kIHN0eWxlc2hlZXQgcGFja2FnZXMuCiMgVmVyc2lvbjogMS4wLjQsIENhbGd1eTEwMDAKIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIENNUyAtIENNUyBNYWRlIFNpbXBsZSBpcyAoYykgMjAwNSBieSBUZWQgS3VscCAod2lzaHlAY21zbWFkZXNpbXBsZS5vcmcpCiMgVGhpcyBwcm9qZWN0J3MgaG9tZXBhZ2UgaXM6IGh0dHA6Ly93d3cuY21zbWFkZXNpbXBsZS5vcmcKIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoKZGVmaW5lKCAiRFREX1ZFUlNJT04iLCAiMS4xIiApOwoKZnVuY3Rpb24gZ2V0X3VybHMoJHN0cmluZywgJHN0cmljdD10cnVlKSB7CiAgJHR5cGVzID0gYXJyYXkoImhyZWYiLCAic3JjIiwgInVybCIpOwogIHdoaWxlKGxpc3QoLCR0eXBlKSA9IGVhY2goJHR5cGVzKSkgewogICAgJGlubmVyVCA9ICRzdHJpY3Q/J1thLXowLTk6Pz0mQC8uXy1dKz8nOicuKz8nOwogICAgcHJlZ19tYXRjaF9hbGwgKCJ8JHR5cGVcPShbXCInYF0pKCIuJGlubmVyVC4iKVxcMXxpIiwgJHN0cmluZywgJG1hdGNoZXMpOwogICAgJHJldFskdHlwZV0gPSAkbWF0Y2hlc1syXTsKICB9CiAgCiAgcmV0dXJuICRyZXQ7Cn07CgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpjbGFzcyBUaGVtZU1hbmFnZXIgZXh0ZW5kcyBDTVNNb2R1bGUKewogIHZhciAkZHRkID0gJwo8IURPQ1RZUEUgdGhlbWUgWwogIDwhRUxFTUVOVCB0aGVtZSAobmFtZSxkdGR2ZXJzaW9uLHRlbXBsYXRlKyxzdHlsZXNoZWV0KyxyZWZlcmVuY2UqKT4KICA8IUVMRU1FTlQgbmFtZSAoI1BDREFUQSk+CiAgPCFFTEVNRU5UIGR0ZHZlcnNpb24gKCNQQ0RBVEEpPgogIDwhRUxFTUVOVCB0ZW1wbGF0ZSAodG5hbWUsdGVuY29kaW5nLHRkYXRhKT4KICA8IUVMRU1FTlQgdG5hbWUgKCNQQ0RBVEEpPgogIDwhRUxFTUVOVCB0ZW5jb2RpbmcgKCNQQ0RBVEEpPgogIDwhRUxFTUVOVCB0ZGF0YSAoI1BDREFUQSk+CiAgPCFFTEVNRU5UIHN0eWxlc2hlZXQgKGNzc25hbWUsY3NzbWVkaWF0eXBlLGNzc2VuY29kaW5nLGNzc2RhdGEpPgogIDwhRUxFTUVOVCBjc3NuYW1lICgjUENEQVRBKT4KICA8IUVMRU1FTlQgY3NzbWVkaWF0eXBlICgjUENEQVRBKT4KICA8IUVMRU1FTlQgY3NzZGF0YSAoI1BDREFUQSk+CiAgPCFFTEVNRU5UIHJlZmVyZW5jZSAocmVmbmFtZSxyZWZlbmNvZGVkLHJlZmxvY2F0aW9uLHJlZmRhdGEpPgogIDwhRUxFTUVOVCByZWZuYW1lICgjUENEQVRBKT4KICA8IUVMRU1FTlQgcmVmZW5jb2RlZCAoI1BDREFUQSk+CiAgPCFFTEVNRU5UIHJlZmxvY2F0aW9uICgjUENEQVRBKT4KICA8IUVMRU1FTlQgcmVmZGF0YSAoI1BDREFUQSk+Cl0+JzsKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgR2V0TmFtZSgpCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gR2V0TmFtZSgpCiAgewogICAgcmV0dXJuICdUaGVtZU1hbmFnZXInOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIEdldEZyaWVuZGx5TmFtZSgpCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gR2V0RnJpZW5kbHlOYW1lKCkKICB7CiAgICByZXR1cm4gJHRoaXMtPkxhbmcoJ2ZyaWVuZGx5bmFtZScpOwogIH0KCgkKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBHZXRWZXJzaW9uKCkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBHZXRWZXJzaW9uKCkKICB7CiAgICByZXR1cm4gJzEuMC40JzsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBNaW5pbXVtQ1ZTVmVyc2lvbigpCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gTWluaW11bUNNU1ZlcnNpb24oKQogIHsKICAgIHJldHVybiAiMC4xMSI7CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgR2V0SGVscCgpCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gR2V0SGVscCgpCiAgewogICAgcmV0dXJuICR0aGlzLT5MYW5nKCdoZWxwJyk7CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgR2V0QXV0aG9yKCkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBHZXRBdXRob3IoKQogIHsKICAgIHJldHVybiAnY2FsZ3V5MTAwMCc7CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgR2V0QXV0aG9yRW1haWwoKQogICBUaGlzIHJldHVybnMgYSBzdHJpbmcgdGhhdCBpcyBwcmVzZW50ZWQgaW4gdGhlIE1vZHVsZQogICBBZG1pbiBpZiB5b3UgY2xpY2sgb24gdGhlICJBYm91dCIgbGluay4gSXQgaGVscHMgdXNlcnMKICAgb2YgeW91ciBtb2R1bGUgZ2V0IGluIHRvdWNoIHdpdGggeW91IHRvIHNlbmQgYnVnIHJlcG9ydHMsCiAgIHF1ZXN0aW9ucywgY2FzZXMgb2YgYmVlciwgYW5kL29yIGxhcmdlIHN1bXMgb2YgbW9uZXkuCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gR2V0QXV0aG9yRW1haWwoKQogIHsKICAgIHJldHVybiAnY2FsZ3V5MTAwMEBob3RtYWlsLmNvbSc7CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgR2V0Q2hhbmdlTG9nKCkKICAgVGhpcyByZXR1cm5zIGEgc3RyaW5nIHRoYXQgaXMgcHJlc2VudGVkIGluIHRoZSBtb2R1bGUKICAgQWRtaW4gaWYgeW91IGNsaWNrIG9uIHRoZSBBYm91dCBsaW5rLiBJdCBoZWxwcyB1c2VycwogICBmaWd1cmUgb3V0IHdoYXQncyBjaGFuZ2VkIGJldHdlZW4gcmVsZWFzZXMuCiAgIFNlZSB0aGUgbm90ZSBvbiBsb2NhbGl6YXRpb24gYXQgdGhlIHRvcCBvZiB0aGlzIGZpbGUuCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gR2V0Q2hhbmdlTG9nKCkKICB7CiAgICByZXR1cm4gJHRoaXMtPkxhbmcoJ2NoYW5nZWxvZycpOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIElzUGx1Z2luTW9kdWxlKCkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBJc1BsdWdpbk1vZHVsZSgpCiAgewogICAgcmV0dXJuIGZhbHNlOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIEhhc0FkbWluKCkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBIYXNBZG1pbigpCiAgewogICAgcmV0dXJuIHRydWU7CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgR2V0QWRtaW5TZWN0aW9uKCkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBHZXRBZG1pblNlY3Rpb24oKQogIHsKICAgIHJldHVybiAnbGF5b3V0JzsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBHZXRBZG1pbkRlc2NyaXB0aW9uKCkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBHZXRBZG1pbkRlc2NyaXB0aW9uKCkKICB7CiAgICByZXR1cm4gJHRoaXMtPkxhbmcoJ21vZGRlc2NyaXB0aW9uJyk7CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgVmlzaWJsZVRvQWRtaW5Vc2VyKCkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBWaXNpYmxlVG9BZG1pblVzZXIoKQogIHsKICAgIHJldHVybiAkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdNYW5hZ2UgVGhlbWVzJykgfHwKICAgICAgKCR0aGlzLT5DaGVja1Blcm1pc3Npb24oJ0FkZCBTdHlsZXNoZWV0cycpICYmCiAgICAgICR0aGlzLT5DaGVja1Blcm1pc3Npb24oJ0FkZCBUZW1wbGF0ZXMnKSAmJgogICAgICAkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdBZGQgU3R5bGVzaGVldCBBc3NvYycpKTsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIEdldERlcGVuZGVuY2llcygpCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gR2V0RGVwZW5kZW5jaWVzKCkKICB7CiAgICByZXR1cm4gYXJyYXkoKTsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBJbnN0YWxsKCkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBJbnN0YWxsKCkKICB7CiAgICAvLyB0aGlzIG1vZHVsZSBkb2VzIG5vdCBoYXZlIGFueSB0YWJsZXMgb2YgaXRzIG93bgoKICAgIC8vIGNyZWF0ZSBhIHBlcm1pc3Npb24KICAgICR0aGlzLT5DcmVhdGVQZXJtaXNzaW9uKCdNYW5hZ2UgVGhlbWVzJywgJ01hbmFnZSBUaGVtZXMnKTsKICAgICAgICAKICAgIC8vIHB1dCBtZW50aW9uIGludG8gdGhlIGFkbWluIGxvZwogICAgJHRoaXMtPkF1ZGl0KCAwLCAkdGhpcy0+TGFuZygnZnJpZW5kbHluYW1lJyksICR0aGlzLT5MYW5nKCdpbnN0YWxsZWQnLCR0aGlzLT5HZXRWZXJzaW9uKCkpKTsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBJbnN0YWxsUG9zdE1lc3NhZ2UoKQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIEluc3RhbGxQb3N0TWVzc2FnZSgpCiAgewogICAgcmV0dXJuICR0aGlzLT5MYW5nKCdwb3N0aW5zdGFsbCcpOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIFVuaW5zdGFsbFBvc3RNZXNzYWdlKCkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBVbmluc3RhbGxQb3N0TWVzc2FnZSgpCiAgewogICAgcmV0dXJuICR0aGlzLT5MYW5nKCdwb3N0dW5pbnN0YWxsJyk7CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgVXBncmFkZSgpCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gVXBncmFkZSgkb2xkdmVyc2lvbiwgJG5ld3ZlcnNpb24pCiAgewogICAgLy8gbm90aGluZyB0byBkbyBoZXJlLCB5ZXQKCQkKICAgIC8vIHB1dCBtZW50aW9uIGludG8gdGhlIGFkbWluIGxvZwogICAgJHRoaXMtPkF1ZGl0KCAwLCAkdGhpcy0+TGFuZygnZnJpZW5kbHluYW1lJyksICR0aGlzLT5MYW5nKCd1cGdyYWRlZCcsJHRoaXMtPkdldFZlcnNpb24oKSkpOwogIH0KCQoJCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgVW5pbnN0YWxsKCkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBVbmluc3RhbGwoKQogIHsKICAgIC8vIHJlbW92ZSB0aGUgcGVybWlzc2lvbnMKICAgICR0aGlzLT5SZW1vdmVQZXJtaXNzaW9uKCdNYW5hZ2UgVGhlbWVzJyk7CgogICAgLy8gcHV0IG1lbnRpb24gaW50byB0aGUgYWRtaW4gbG9nCiAgICAkdGhpcy0+QXVkaXQoIDAsICR0aGlzLT5MYW5nKCdmcmllbmRseW5hbWUnKSwgJHRoaXMtPkxhbmcoJ3VuaW5zdGFsbGVkJykpOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIERvQWN0aW9uKCRhY3Rpb24sICRpZCwgJHBhcmFtcywgJHJldHVybl9pZCkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBEb0FjdGlvbigkYWN0aW9uLCAkaWQsICRwYXJhbXMsICRyZXR1cm5faWQ9LTEpCiAgewogICAgc3dpdGNoICgkYWN0aW9uKQogICAgICB7CiAgICAgIGNhc2UgJ2RlZmF1bHQnOgoJewoJICAvLyBtb2R1bGUgaGFzIG5vIHVzZXIgb3V0cHV0CgkgIGJyZWFrOwoJfQogICAgICBjYXNlICdkZWZhdWx0YWRtaW4nOgoJewoJICAvLyBvbmx5IGxldCBwZW9wbGUgYWNjZXNzIG1vZHVsZSBwcmVmZXJlbmNlcyBpZiB0aGV5IGhhdmUgcGVybWlzc2lvbgoJICAkdGhpcy0+RGlzcGxheUFkbWluUGFuZWwoJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkKTsKCSAgYnJlYWs7Cgl9CiAgICAgIGNhc2UgJ2V4cG9ydHRoZW1lJzoKCXsKCSAgaWYgKCR0aGlzLT5DaGVja1Blcm1pc3Npb24oJ01hbmFnZSBUaGVtZXMnKSkKCSAgICB7CgkgICAgICAkdGhpcy0+RG9FeHBvcnRUaGVtZSgkaWQsICRwYXJhbXMsICRyZXR1cm5faWQpOwoJICAgIH0KCSAgZWxzZQoJICAgIHsKCSAgICAgICR0aGlzLT5EaXNwbGF5RXJyb3JQYWdlKCRpZCwgJHBhcmFtcywgJHJldHVybl9pZCwKCQkJCSAgICAgICR0aGlzLT5MYW5nKCdhY2Nlc3NkZW5pZWQnKSk7CgkgICAgfQoJICBicmVhazsKCX0KICAgICAgY2FzZSAnaW1wb3J0dGhlbWUnOgoJewoJICBpZiAoJHRoaXMtPkNoZWNrUGVybWlzc2lvbignQWRkIFN0eWxlc2hlZXRzJykgJiYKCSAgICAgICR0aGlzLT5DaGVja1Blcm1pc3Npb24oJ0FkZCBUZW1wbGF0ZXMnKSAmJgoJICAgICAgJHRoaXMtPkNoZWNrUGVybWlzc2lvbignQWRkIFN0eWxlc2hlZXQgQXNzb2MnKSkKCSAgICB7CgkgICAgICAkdGhpcy0+RG9JbXBvcnRUaGVtZSgkaWQsICRwYXJhbXMsICRyZXR1cm5faWQpOwoJICAgIH0KCSAgZWxzZQoJICAgIHsKCSAgICAgICR0aGlzLT5EaXNwbGF5RXJyb3JQYWdlKCRpZCwgJHBhcmFtcywgJHJldHVybl9pZCwKCQkJCSAgICAgICR0aGlzLT5MYW5nKCdhY2Nlc3NkZW5pZWQnKSk7CgkgICAgfQoJICBicmVhazsKCX0KICAgICAgfQoKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBfY2xlYW51cFJlZmVyZW5jZXMKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBfY2xlYW51cFJlZmVyZW5jZXMoICRwcmVmaXgsICRyZWZlcmVuY2VzLCAmJGlucHV0ICkKICB7CiAgICAkZGF0YSA9ICRpbnB1dDsKICAgIGZvcmVhY2goICRyZWZlcmVuY2VzIGFzICRyZWYgKQogICAgICB7CgkkZGF0YSA9IHByZWdfcmVwbGFjZSggJ3wnLiRyZWZbJ2xvY2F0aW9uJ10uJ3wnLCAkcHJlZml4LiIvIi4kcmVmWydsb2NhdGlvbiddLAoJCQkgICAgICAkZGF0YSApOwoJaWYoICRkYXRhID09ICcnICkKCSAgewoJICAgIHJldHVybiBmYWxzZTsKCSAgfQogICAgICB9CiAgICAkaW5wdXQgPSAkZGF0YTsKICAgIHJldHVybiB0cnVlOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIF9leHRyYWN0SFRNTEltYWdlcwogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIF9leHRyYWN0VGVtcGxhdGVJbWFnZXMoJHRlbXBsYXRlKQogIHsKICAgICRyZXN1bHQgPSBhcnJheSgpOwogICAgJHVybHMgPSBnZXRfdXJscygkdGVtcGxhdGUtPmNvbnRlbnQpOwogICAgLy8gd2UncmUgb25seSBjb25jZXJuZWQgYWJvdXQgdGhlIHNyYyB1cmxzCiAgICBmb3JlYWNoKCAkdXJsc1snc3JjJ10gYXMgJHNyYyApCiAgICAgIHsKCS8vIGlmIGl0J3MgYW4gZXh0ZXJuYWwgbGluayB3ZSBpZ25vcmUgaXQKCS8vIGlmIGl0J3MgYW4gaW50ZXJuYWwgbGluaywgd2UgYWRkIGl0CglpZiggIXByZWdfbWF0Y2goJy9eaHR0cFw6LycsJHNyYykgKSAKCSAgewoJICAgICRyZXN1bHRbXSA9ICRzcmM7CgkgIH0KICAgICAgfQoKICAgIHJldHVybiAkcmVzdWx0OwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIF9leHRyYWN0U3R5bGVzaGVldEltYWdlcwogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIF9leHRyYWN0U3R5bGVzaGVldEltYWdlcygkc3R5bGVzaGVldCkKICB7CiAgICAkcmVnZXg9Jy8uKnVybFxzKlwoXCIoLiopXCJcKS9pJzsKICAgIHByZWdfbWF0Y2hfYWxsKCAkcmVnZXgsICRzdHlsZXNoZWV0LT52YWx1ZSwgJG1hdGNoZXMgKTsKICAgIC8vICRtYXRjaGVzWzFdIGlzIGFsbCBpbW1wb3J0YW50CiAgICAvLyBub3cgc3RyaXAgb3V0IGFueSB0aGF0IGhhdmUgXmh0dHAgaW4gdGhlbQogICAgJHJlc3VsdCA9IGFycmF5KCk7CiAgICBmb3JlYWNoKCAkbWF0Y2hlc1sxXSBhcyAkbWF0Y2ggKQogICAgICB7CglpZiggIXByZWdfbWF0Y2goICcvXmh0dHBcOi8nLCAkbWF0Y2ggKSApCgkgIHsKCSAgICAkcmVzdWx0W10gPSAkbWF0Y2g7CgkgIH0KICAgICAgfQoKICAgIHJldHVybiAkcmVzdWx0OwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIF9zYXZlRW5jb2RlZEZpbGUKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBfc2F2ZUVuY29kZWRGaWxlKCAkcHJlZml4LCAkbmFtZSwgJiRsb2NhdGlvbiwgJGVuY29kZWQsICRkYXRhICkKICB7CiAgICAvLyBjbGVhbiB1cCB0aGUgbG9jYXRpb24KICAgIGlmKCBzdWJzdHIoJGxvY2F0aW9uLDAsMSkgPT0gJy8nICkKICAgICAgewoJJGxvY2F0aW9uID0gc3Vic3RyKCRsb2NhdGlvbiwxKTsKICAgICAgfQogICAgCiAgICBpZiggJGVuY29kZWQgKQogICAgICB7CgkkZGF0YSA9IGJhc2U2NF9kZWNvZGUoICRkYXRhICk7CiAgICAgIH0KCiAgICAvLyB0cmFuc2xhdGUgc2xhc2hlcyBpZiB3ZSBoYXZlIHRvCiAgICAkbmV3bG9jID0gcHJlZ19yZXBsYWNlKCAnfFwvfCcsIERJUkVDVE9SWV9TRVBBUkFUT1IsICRsb2NhdGlvbiApOwoKICAgICRkaXIgPSAkcHJlZml4LkRJUkVDVE9SWV9TRVBBUkFUT1IuZGlybmFtZSggJGxvY2F0aW9uICk7CiAgICBpZiggIWZpbGVfZXhpc3RzKCAkZGlyICkgKQogICAgICB7CgkkdGhpcy0+X21rZGlyciggJGRpciApOwoJaWYoICFmaWxlX2V4aXN0cyggJGRpciApICkKCSAgewoJICAgIHJldHVybiAwOwoJICB9CiAgICAgIH0KCiAgICAvLyBhbmQgcHV0IGl0IG91dCB0aGVyZQogICAgZ2xvYmFsICRnQ21zOwogICAgJGZuID0gJHByZWZpeC5ESVJFQ1RPUllfU0VQQVJBVE9SLiRuZXdsb2M7CiAgICAkZnAgPSBmb3BlbiggJGZuLCAidyIgKTsKICAgIGlmKCAhJGZwICkKICAgICAgewoJcmV0dXJuIDA7CiAgICAgIH0KICAgIGZ3cml0ZSggJGZwLCAkZGF0YSApOwogICAgZmNsb3NlKCAkZnAgKTsKICAgIHJldHVybiAxOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIERpc3BsYXlFcnJvclBhZ2UoJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkLCAkbWVzc2FnZSkKICAgTk9UIFBBUlQgT0YgVEhFIE1PRFVMRSBBUEkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBEaXNwbGF5RXJyb3JQYWdlKCRpZCwgJiRwYXJhbXMsICRyZXR1cm5pZCwgJG1lc3NhZ2U9JycpCiAgewogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCd0aXRsZV9lcnJvcicsICR0aGlzLT5MYW5nKCdlcnJvcicpKTsKICAgIGlmICgkbWVzc2FnZSAhPSAnJykKICAgICAgewoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdtZXNzYWdlJywgJG1lc3NhZ2UpOwogICAgICB9CgogICAgLy8gRGlzcGxheSB0aGUgcG9wdWxhdGVkIHRlbXBsYXRlCiAgICBlY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUoJ2Vycm9yLnRwbCcpOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIERpc3BsYXlBZG1pblBhbmVsKCRpZCwgJHBhcmFtcywgJHJldHVybl9pZCwgJG1lc3NhZ2UpCiAgIE5PVCBQQVJUIE9GIFRIRSBNT0RVTEUgQVBJCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gRGlzcGxheUFkbWluUGFuZWwoJGlkLCAmJHBhcmFtcywgJHJldHVybmlkLCAkbWVzc2FnZT0nJykKICB7CiAgICBlY2hvICR0aGlzLT5TdGFydFRhYkhlYWRlcnMoKTsKICAgIGlmICgkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdNYW5hZ2UgVGhlbWVzJykpCiAgICAgIHsKCWVjaG8gJHRoaXMtPlNldFRhYkhlYWRlcignZXhwb3J0JywgJHRoaXMtPkxhbmcoJ2V4cG9ydCcpKTsKICAgICAgfQogICAgaWYgKCR0aGlzLT5DaGVja1Blcm1pc3Npb24oJ0FkZCBTdHlsZXNoZWV0cycpICYmCgkkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdBZGQgVGVtcGxhdGVzJykgJiYKCSR0aGlzLT5DaGVja1Blcm1pc3Npb24oJ0FkZCBTdHlsZXNoZWV0IEFzc29jJykpCiAgICAgIHsKCWVjaG8gJHRoaXMtPlNldFRhYkhlYWRlcignaW1wb3J0JywgJHRoaXMtPkxhbmcoJ2ltcG9ydCcpKTsKICAgICAgfQogICAgZWNobyAkdGhpcy0+RW5kVGFiSGVhZGVycygpOwoKICAgIGVjaG8gJHRoaXMtPlN0YXJ0VGFiQ29udGVudCgpOwoKICAgIC8vIHRoZSBleHBvcnQgdGFiCiAgICBpZiAoJHRoaXMtPkNoZWNrUGVybWlzc2lvbignTWFuYWdlIFRoZW1lcycpKQogICAgICB7CgllY2hvICR0aGlzLT5TdGFydFRhYignZXhwb3J0Jyk7CgkkYWxsdGVtcGxhdGVzID0gVGVtcGxhdGVPcGVyYXRpb25zOjpMb2FkVGVtcGxhdGVzKCk7CgkKCSR0aGlzLT5zbWFydHktPmFzc2lnbignc3RhcnRmb3JtJywKCQkJICAgICAgJHRoaXMtPkNyZWF0ZUZvcm1TdGFydCgkaWQsJ2V4cG9ydHRoZW1lJywkcmV0dXJuaWQpKTsKCQoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpZHRleHQnLCAkdGhpcy0+TGFuZygnaWQnKSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ25hbWV0ZXh0JywgJHRoaXMtPkxhbmcoJ25hbWUnKSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2FjdGl2ZXRleHQnLCAkdGhpcy0+TGFuZygnYWN0aXZlJykpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdkZWZhdWx0dGV4dCcsICR0aGlzLT5MYW5nKCdkZWZhdWx0JykpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdleHBvcnR0ZXh0JywgJHRoaXMtPkxhbmcoJ2V4cG9ydCcpKTsKCQoJLy8gaXRlcmF0ZSB0aHJvdWdoIGFsbCBvZiB0aGUgdGVtcGxhdGVzCglnbG9iYWwgJGdDbXM7Cgkkcm93Y2xhc3MgPSAncm93MSc7Cgkkcm93YXJyYXkgPSBhcnJheSgpOwoJZm9yZWFjaCggJGFsbHRlbXBsYXRlcyBhcyAkdGVtcGwgKQoJICB7CgkgICAgJG9uZXJvdyA9IG5ldyBzdGRDbGFzcygpOwoJICAgICRvbmVyb3ctPmlkID0gJHRlbXBsLT5pZDsKCSAgICAkb25lcm93LT5uYW1lID0gJHRlbXBsLT5uYW1lOwoJICAgIGlmKCAkdGVtcGwtPmFjdGl2ZSApCgkgICAgICB7CgkJJG9uZXJvdy0+YWN0aXZlID0gJGdDbXMtPnZhcmlhYmxlc1snYWRtaW50aGVtZSddLT5EaXNwbGF5SW1hZ2UoJ2ljb25zL3N5c3RlbS90cnVlLmdpZicpOwoJICAgICAgfQoJICAgIGlmKCAkdGVtcGwtPmRlZmF1bHQgKQoJICAgICAgewoJCSRvbmVyb3ctPmRlZmF1bHQgPSAkZ0Ntcy0+dmFyaWFibGVzWydhZG1pbnRoZW1lJ10tPkRpc3BsYXlJbWFnZSgnaWNvbnMvc3lzdGVtL3RydWUuZ2lmJyk7CgkgICAgICB9CgkgICAgJG9uZXJvdy0+cm93Y2xhc3MgPSAkcm93Y2xhc3M7CgkgICAgaWYoICR0ZW1wbC0+YWN0aXZlICkKCSAgICAgIHsKCQkkb25lcm93LT5zZWxlY3QgPSAKCQkgICR0aGlzLT5DcmVhdGVJbnB1dENoZWNrYm94KCAkaWQsICdleHBvcnQnLiRvbmVyb3ctPmlkLCAkb25lcm93LT5pZCApOwoJICAgICAgfQoJICAgIGFycmF5X3B1c2goICRyb3dhcnJheSwgJG9uZXJvdyApOwoJICAgICgkcm93Y2xhc3MgPT0gInJvdzEiID8gJHJvd2NsYXNzID0gInJvdzIiIDogJHJvd2NsYXNzID0gInJvdzEiKTsKCSAgfQoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnaXRlbXMnLCAkcm93YXJyYXkpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnaXRlbWNvdW50JywgY291bnQoJHJvd2FycmF5KSk7CgkKCSR0aGlzLT5zbWFydHktPmFzc2lnbigncHJvbXB0X3RoZW1lbmFtZScsCgkJCSAgICAgICR0aGlzLT5MYW5nKCdwcm9tcHRfdGhlbWVuYW1lJykpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpbnB1dF90aGVtZW5hbWUnLAoJCQkgICAgICAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCRpZCwnaW5wdXRfdGhlbWVuYW1lJywnJywyMCwyMCkpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdzdWJtaXQnLAoJCQkgICAgICAkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQoJGlkLCdzdWJtaXQnLCR0aGlzLT5MYW5nKCdleHBvcnQnKSkpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdlbmRmb3JtJywKCQkJICAgICAgJHRoaXMtPkNyZWF0ZUZvcm1FbmQoKSk7CgllY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUoJ2V4cG9ydC50cGwnKTsKCWVjaG8gJHRoaXMtPkVuZFRhYigpOwogICAgICB9CgogICAgLy8gdGhlIGltcG9ydCB0YWIKICAgIGlmICgkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdBZGQgU3R5bGVzaGVldHMnKSAmJgoJJHRoaXMtPkNoZWNrUGVybWlzc2lvbignQWRkIFRlbXBsYXRlcycpICYmCgkkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdBZGQgU3R5bGVzaGVldCBBc3NvYycpKQogICAgICB7CgllY2hvICR0aGlzLT5TdGFydFRhYignaW1wb3J0Jyk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3N0YXJ0Zm9ybScsCgkJCSAgICAgICR0aGlzLT5DcmVhdGVGb3JtU3RhcnQoJGlkLCdpbXBvcnR0aGVtZScsJHJldHVybmlkLCdwb3N0JywgJ211bHRpcGFydC9mb3JtLWRhdGEnKSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3Byb21wdF9icm93c2UnLCAkdGhpcy0+TGFuZygndXBsb2FkJykpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpbnB1dF9icm93c2UnLAoJCQkgICAgICAkdGhpcy0+Q3JlYXRlRmlsZVVwbG9hZElucHV0KCRpZCwnaW5wdXRfYnJvd3NlJykpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdzdWJtaXQnLCAKCQkJICAgICAgJHRoaXMtPkNyZWF0ZUlucHV0U3VibWl0KCRpZCwnc3VibWl0JywKCQkJCQkJICAgICAgICR0aGlzLT5MYW5nKCdpbXBvcnQnKSkpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdlbmRmb3JtJywKCQkJICAgICAgJHRoaXMtPkNyZWF0ZUZvcm1FbmQoKSk7CgllY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUoJ2ltcG9ydC50cGwnKTsKCWVjaG8gJHRoaXMtPkVuZFRhYigpOwogICAgICB9CiAgfQoKCiAgZnVuY3Rpb24gRG9FeHBvcnRUaGVtZSgkaWQsICYkcGFyYW1zLCAkcmV0dXJuaWQpCiAgewogICAgZ2xvYmFsICRnQ21zOwoKCiAgICAkdGhlbWVuYW1lID0gdHJpbSgkcGFyYW1zWydpbnB1dF90aGVtZW5hbWUnXSApOwogICAgaWYoICR0aGVtZW5hbWUgPT0gJycgKQogICAgICB7CgkkdGhlbWVuYW1lID0gJ3RoZW1lJzsKICAgICAgfQogICAgJHRoZW1lbmFtZSA9IHN0cl9yZXBsYWNlKCcgJywnXycsJHRoZW1lbmFtZSk7CgogICAgJHRlbXBsYXRlX2lkcyA9IGFycmF5KCk7CiAgICAkc3R5bGVzaGVldF9pZHMgPSBhcnJheSgpOwogICAgJHVybHMgPSBhcnJheSgpOwogICAgZm9yZWFjaCggJHBhcmFtcyBhcyAka2V5ID0+ICR2YWx1ZSApCiAgICAgIHsKCWlmKCAhcHJlZ19tYXRjaCggJy9eZXhwb3J0LycsICRrZXkgKSApCgkgIHsKCSAgICBjb250aW51ZTsKCSAgfQoKCSRpZCA9IHN1YnN0ciggJGtleSwgc3RybGVuKCdleHBvcnQnKSApOwoJJHRlbXBsYXRlX2lkc1tdID0gJGlkOwoKCS8vIHdlIGFyZSBleHBvcnRpbmcgYSB0ZW1wbGF0ZQoJLy8gZ2V0IHRoZSB0ZW1wbGF0ZQoJJHRlbXBsYXRlID0gVGVtcGxhdGVPcGVyYXRpb25zOjpMb2FkVGVtcGxhdGVCeUlEKCAkaWQgKTsKCWlmKCAhJHRlbXBsYXRlICkKCSAgewoJICAgICR0aGlzLT5EaXNwbGF5RXJyb3JQYWdlKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCwgCgkJCQkgICAgICR0aGlzLT5MYW5nKCdlcnJvcl90ZW1wbGF0ZW5vdGZvdW5kJykpOwoJICAgIHJldHVybjsKCSAgfQoKCS8vIGdldCB0aGUgaW1hZ2VzLCBldGMgYXR0YWNoZWQgdG8gdGhlIHRlbXBsYXRlCgkkdF91cmxzID0gJHRoaXMtPl9leHRyYWN0VGVtcGxhdGVJbWFnZXMoJHRlbXBsYXRlKTsKCSR1cmxzID0gYXJyYXlfbWVyZ2UoICR1cmxzLCAkdF91cmxzICk7CgoJLy8gZ2V0IHRoZSBzdHlsZXNoZWV0cyBhdHRhY2hlZCB0byB0aGF0IHRlbXBsYXRlCgkkc3R5bGVzaGVldHMgPSBTdHlsZXNoZWV0T3BlcmF0aW9uczo6R2V0VGVtcGxhdGVBc3NvY2lhdGVkU3R5bGVzaGVldHMoICRpZCApOwoJZm9yZWFjaCggJHN0eWxlc2hlZXRzIGFzICRjc3NpZCApCgkgIHsKCSAgICAkc3R5bGVzaGVldF9pZHNbXSA9ICRjc3NpZDsKCSAgICAkY3NzID0gU3R5bGVzaGVldE9wZXJhdGlvbnM6OkxvYWRTdHlsZXNoZWV0QnlJRCggJGNzc2lkICk7CgkgICAgJGNzc3VybHMgPSAkdGhpcy0+X2V4dHJhY3RTdHlsZXNoZWV0SW1hZ2VzKCRjc3MpOwoJICAgICR1cmxzID0gYXJyYXlfbWVyZ2UoICR1cmxzLCAkY3NzdXJscyApOwoJICB9CiAgICAgIH0KCiAgICAvLyBtYWtlIHN1cmUgd2UncmUgbm90IG91dHB1dHRpbmcgdGhlIHNhbWUgdGhpbmcgdHdpY2UKICAgICR0ZW1wbGF0ZV9pZHMgPSBhcnJheV91bmlxdWUoICR0ZW1wbGF0ZV9pZHMgKTsKICAgICRzdHlsZXNoZWV0X2lkcyA9IGFycmF5X3VuaXF1ZSggJHN0eWxlc2hlZXRfaWRzICk7CiAgICAkdXJscyA9IGFycmF5X3VuaXF1ZSggJHVybHMgKTsKCiAgICAvLyBjaGVja3MgdG8gc2VlIGlmIHRoZXJlIGlzIGFjdHVhbGx5IGFueXRoaW5nIHRvIG91dHB1dAogICAgaWYoIGNvdW50KCAkdGVtcGxhdGVfaWRzICkgPT0gMCB8fCBjb3VudCggJHN0eWxlc2hlZXRfaWRzICkgPT0gMCApCiAgICAgIHsKCS8vIG5vdGhpbmcgdG8gb3V0cHV0CgkkdGhpcy0+RGlzcGxheUVycm9yUGFnZSggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQsIAoJCQkJICR0aGlzLT5MYW5nKCdlcnJvcl9ub291dHB1dCcpKTsKCXJldHVybjsKICAgICAgfQoKICAgIC8vIG91dHB1dCB0aGUgeG1sIGhlYWRlcgogICAgJG91dHB1dCA9ICc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+JzsKICAgICRvdXRwdXQgLj0gJHRoaXMtPmR0ZDsKICAgICRvdXRwdXQgLj0gIjx0aGVtZT5cbiI7CiAgICAkb3V0cHV0IC49ICIgIDxuYW1lPiIuJHRoZW1lbmFtZS4iPC9uYW1lPlxuIjsKICAgICRvdXRwdXQgLj0gIiAgPGR0ZHZlcnNpb24+Ii5EVERfVkVSU0lPTi4iPC9kdGR2ZXJzaW9uPlxuIjsKCiAgICAvLyBvdXRwdXQgdGhlIHRlbXBsYXRlcwogICAgZm9yZWFjaCggJHRlbXBsYXRlX2lkcyBhcyAkaWQgKQogICAgICB7CgkkdGVtcGxhdGUgPSBUZW1wbGF0ZU9wZXJhdGlvbnM6OkxvYWRUZW1wbGF0ZUJ5SUQoICRpZCApOwoJLy8gcGFyc2UgdGhyb3VnaCB0aGUgaHRtbCBhbmQgZXh0cmFjdCB0aGUgaW1hZ2UgdGFncwoJLy8gYW5kIGltYWdlcywgZXRjLgoKCSRvdXRwdXQgLj0gIiAgPHRlbXBsYXRlPlxuIjsKCSRvdXRwdXQgLj0gIiAgICA8dG5hbWU+Ii4kdGVtcGxhdGUtPm5hbWUuIjwvdG5hbWU+XG4iOwoJJG91dHB1dCAuPSAiICAgIDx0ZW5jb2Rpbmc+Ii4kdGVtcGxhdGUtPmVuY29kaW5nLiI8L3RlbmNvZGluZz5cbiI7Cgkkb3V0cHV0IC49ICIgICAgPHRkYXRhPjwhW0NEQVRBWyIuYmFzZTY0X2VuY29kZSgkdGVtcGxhdGUtPmNvbnRlbnQpLiJdXT48L3RkYXRhPlxuIjsKCSRvdXRwdXQgLj0gIiAgPC90ZW1wbGF0ZT5cbiI7CglpZiggJHRlbXBsYXRlLT5zdHlsZXNoZWV0ICE9ICcnICkgCgkgIHsKCSAgICAkb3V0cHV0IC49ICIgIDxzdHlsZXNoZWV0PlxuIjsKCSAgICAkb3V0cHV0IC49ICIgICAgPGNzc25hbWU+Ii4kdGVtcGxhdGUtPm5hbWUuIiAtQXR0YWNoZWQtPC9jc3NuYW1lPlxuIjsKCSAgICAkb3V0cHV0IC49ICIgICAgPGNzc21lZGlhdHlwZT48L2Nzc21lZGlhdHlwZT5cbiI7CgkgICAgJG91dHB1dCAuPSAiICAgIDxjc3NkYXRhPjwhW0NEQVRBWyIuYmFzZTY0X2VuY29kZSgkdGVtcGxhdGUtPnN0eWxlc2hlZXQpLiJdXT48L2Nzc2RhdGE+XG4iOwoJICAgICRvdXRwdXQgLj0gIiAgPC9zdHlsZXNoZWV0PlxuIjsKCSAgfQogICAgICB9CgkKICAgIC8vIHRoZSBzdHlsZXNoZWV0cwogICAgZm9yZWFjaCggJHN0eWxlc2hlZXRfaWRzIGFzICRpZCApCiAgICAgIHsKCSRzdHlsZXNoZWV0ID0gU3R5bGVzaGVldE9wZXJhdGlvbnM6OkxvYWRTdHlsZXNoZWV0QnlJRCggJGlkICk7Cgkkb3V0cHV0IC49ICIgIDxzdHlsZXNoZWV0PlxuIjsKCSRvdXRwdXQgLj0gIiAgICA8Y3NzbmFtZT4iLiRzdHlsZXNoZWV0LT5uYW1lLiI8L2Nzc25hbWU+XG4iOwoJJG91dHB1dCAuPSAiICAgIDxjc3NtZWRpYXR5cGU+Ii4kc3R5bGVzaGVldC0+bWVkaWFfdHlwZS4iPC9jc3NtZWRpYXR5cGU+XG4iOwoJJG91dHB1dCAuPSAiICAgIDxjc3NkYXRhPjwhW0NEQVRBWyIuYmFzZTY0X2VuY29kZSgkc3R5bGVzaGVldC0+dmFsdWUpLiJdXT48L2Nzc2RhdGE+XG4iOwoJJG91dHB1dCAuPSAiICA8L3N0eWxlc2hlZXQ+XG4iOwkKICAgICAgfQoJCiAgICAvLyB0aGUgZmlsZXMKICAgIGZvcmVhY2goICR1cmxzIGFzICRvbmV1cmwgKQogICAgICB7CgkkY29udGVudHMgPSBmaWxlX2dldF9jb250ZW50cyggJGdDbXMtPmNvbmZpZ1sncm9vdF9wYXRoJ10uRElSRUNUT1JZX1NFUEFSQVRPUi4kb25ldXJsICk7CglpZiggISRjb250ZW50cyApIAoJICB7CgkgICAgY29udGludWU7CgkgIH0KCSRlbmNvZGVkID0gYmFzZTY0X2VuY29kZSggJGNvbnRlbnRzICk7Cgkkb3V0cHV0IC49ICIgIDxyZWZlcmVuY2U+XG4iOwoJJG91dHB1dCAuPSAiICAgIDxyZWZuYW1lPiIuYmFzZW5hbWUoJG9uZXVybCkuIjwvcmVmbmFtZT5cbiI7Cgkkb3V0cHV0IC49ICIgICAgPHJlZmVuY29kZWQ+MTwvcmVmZW5jb2RlZD5cbiI7Cgkkb3V0cHV0IC49ICIgICAgPHJlZmxvY2F0aW9uPiRvbmV1cmw8L3JlZmxvY2F0aW9uPlxuIjsKCSRvdXRwdXQgLj0gIiAgICA8cmVmZGF0YT48IVtDREFUQVsiLiRlbmNvZGVkLiJdXT48L3JlZmRhdGE+XG4iOwoJJG91dHB1dCAuPSAiICA8L3JlZmVyZW5jZT5cbiI7CiAgICAgIH0KCiAgICAvLyBhbmQgdGhlIHRoZW1lIHRhaWwKICAgICRvdXRwdXQgLj0gIjwvdGhlbWU+XG4iOwoKICAgIC8vIGFuZCBzcGl0IGl0IG91dAogICAgaGVhZGVyKCdDb250ZW50LURlc2NyaXB0aW9uOiBGaWxlIFRyYW5zZmVyJyk7CiAgICBoZWFkZXIoJ0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vZm9yY2UtZG93bmxvYWQnKTsKICAgIGhlYWRlcignQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9Jy4kdGhlbWVuYW1lLicueG1sJyk7Ci8vICAgICAgICAgaGVhZGVyKCdDb250ZW50LVR5cGU6IHRleHQveG1sJyk7Ci8vICAgICAgICAgaGVhZGVyKCdDb250ZW50LUxlbmd0aDogJy5zdHJsZW4oJG91dHB1dCkpOwoKICAgIC8vIHRvZG8sIGJ1dCBnb29kIGVub3VnaCBmb3Igbm93LgogICAgd2hpbGUoQG9iX2VuZF9jbGVhbigpKTsKICAgIGVjaG8gJG91dHB1dDsKICAgIGV4aXQoKTsKICB9CgoKICBmdW5jdGlvbiBEb0ltcG9ydFRoZW1lKCRpZCwgJiRwYXJhbXMsICRyZXR1cm5pZCkKICB7CiAgICBnbG9iYWwgJGdDbXM7CiAgICAkZmllbGROYW1lPSRpZC4naW5wdXRfYnJvd3NlJzsKICAgIGlmICghaXNzZXQgKCRfRklMRVNbJGZpZWxkTmFtZV0pIHx8ICFpc3NldCAoJF9GSUxFUykKCXx8ICFpc19hcnJheSAoJF9GSUxFU1skZmllbGROYW1lXSkgfHwgISRfRklMRVNbJGZpZWxkTmFtZV1bJ25hbWUnXSkKICAgICAgewoJJHRoaXMtPkRpc3BsYXlFcnJvclBhZ2UoICRpZCwgJHBhcmFtcywgJHJldHVybmlkLCAKCQkJCSAkdGhpcy0+TGFuZygnZXJyb3Jfbm9maWxlc3VwbG9hZGVkJykpOwoJcmV0dXJuOwogICAgICB9CgogICAgLy8gbWFrZSBzdXJlIHdlIGhhdmUgdGhlIGR0ZHZlcnNpb24KICAgICRoYXZlZHRkdmVyc2lvbiA9IGZhbHNlOwoKICAgIC8vIG5vcm1hbGl6ZSB0aGUgZmlsZSB2YXJpYWJsZQogICAgJGZpbGUgPSAkX0ZJTEVTWyRmaWVsZE5hbWVdOwogICAgCiAgICAvLyAkZmlsZVsndG1wX25hbWUnXSBpcyB0aGUgZmlsZSB3ZSBoYXZlIHRvIHBhcnNlCiAgICAkeG1sID0gZmlsZV9nZXRfY29udGVudHMoICRmaWxlWyd0bXBfbmFtZSddICk7CgogICAgLy8gbG9hZCBhbGwgdGhlIHN0eWxlc2hlZXRzCiAgICAkYWxsc3R5bGVzaGVldHMgPSBTdHlsZXNoZWV0T3BlcmF0aW9uczo6TG9hZFN0eWxlc2hlZXRzKCk7CgogICAgLy8gYW5kIHRoZSB0ZW1wbGF0ZXMKICAgICRhbGx0ZW1wbGF0ZXMgPSBUZW1wbGF0ZU9wZXJhdGlvbnM6OkxvYWRUZW1wbGF0ZXMoKTsKCiAgICAvLyBwYXJzZSB0aGUgeG1sIHN0dWZmCiAgICAkcGFyc2VyID0geG1sX3BhcnNlcl9jcmVhdGUoKTsKICAgIHhtbF9wYXJzZV9pbnRvX3N0cnVjdCggJHBhcnNlciwgJHhtbCwgJHZhbCwgJGlkeCApOwogICAgeG1sX3BhcnNlcl9mcmVlKCAkcGFyc2VyICk7CgogICAgJHRoZW1lID0gJyc7CiAgICAkY3VyZWxlbWVudCA9IGFycmF5KCk7CiAgICAkdGVtcGxhdGUgPSBuZXcgVGVtcGxhdGUoKTsKICAgICRzdHlsZXNoZWV0cyA9IGFycmF5KCk7CiAgICAkb25lc2hlZXQgPSAnJzsKICAgICRvbmVyZWZlcmVuY2UgPSBhcnJheSgpOwogICAgJGFsbHJlZmVyZW5jZXMgPSBhcnJheSgpOwogICAgZm9yZWFjaCggJHZhbCBhcyAkZWxlbSApCiAgICAgIHsKCSR2YWx1ZSA9ICcnOwoJaWYoIGlzc2V0KCAkZWxlbVsndmFsdWUnXSApICkgJHZhbHVlID0gJGVsZW1bJ3ZhbHVlJ107CgkkdHlwZSA9ICRlbGVtWyd0eXBlJ107Cglzd2l0Y2goICRlbGVtWyd0YWcnXSApCgkgIHsKCSAgY2FzZSAnTkFNRSc6CgkgICAgewoJICAgICAgaWYoICR0eXBlICE9ICdjb21wbGV0ZScgJiYgJHR5cGUgIT0gJ2Nsb3NlJyApCgkJewoJCSAgY29udGludWU7CgkJfQoJICAgICAgJHRoZW1lID0gJHZhbHVlOwoJICAgICAgYnJlYWs7CgkgICAgfQoJICBjYXNlICdEVERWRVJTSU9OJzoKCSAgICB7CgkgICAgICBpZiggJHR5cGUgIT0gJ2NvbXBsZXRlJyAmJiAkdHlwZSAhPSAnY2xvc2UnICkKCQl7CgkJICBjb250aW51ZTsKCQl9CgkgICAgICBpZiggJHZhbHVlICE9IERURF9WRVJTSU9OICkKCQl7CgkJICAkdGhpcy0+RGlzcGxheUVycm9yUGFnZSggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQsIAoJCQkJCSAgICR0aGlzLT5MYW5nKCdlcnJvcl9kdGRtaXNtYXRjaCcpKTsKCQkgIHJldHVybjsKCQl9CgkgICAgICAkaGF2ZWR0ZHZlcnNpb24gPSB0cnVlOwoJICAgICAgYnJlYWs7CgkgICAgfQoJICBjYXNlICdUTkFNRSc6CgkgICAgaWYoICR0eXBlICE9ICdjb21wbGV0ZScgJiYgJHR5cGUgIT0gJ2Nsb3NlJyApCgkgICAgICB7CgkJY29udGludWU7CgkgICAgICB9CgkgICAgJHRlbXBsYXRlLT5uYW1lID0gJHRoZW1lLiIgOiAiLiR2YWx1ZTsKCSAgICBmb3JlYWNoKCAkYWxsdGVtcGxhdGVzIGFzICR0bXBsICkKCSAgICAgIHsKCQlpZiggJHRtcGwtPm5hbWUgPT0gJHRlbXBsYXRlLT5uYW1lICkKCQkgIHsKCQkgICAgLy8gdGVtcGxhdGUgbmFtZSBleGlzdHMKCQkgICAgJHRoaXMtPkRpc3BsYXlFcnJvclBhZ2UoICRpZCwgJHBhcmFtcywgJHJldHVybmlkLCAKCQkJCQkgICAgICR0aGlzLT5MYW5nKCdlcnJvcl90ZW1wbGF0ZWV4aXN0cycsJHRlbXBsYXRlLT5uYW1lKSk7CgkJICAgIHJldHVybjsKCQkgIH0KCSAgICAgIH0KCSAgICBicmVhazsKCgkgIGNhc2UgJ1RFTkNPRElORyc6CgkgICAgaWYoICR0eXBlICE9ICdjb21wbGV0ZScgJiYgJHR5cGUgIT0gJ2Nsb3NlJyApCgkgICAgICB7CgkJY29udGludWU7CgkgICAgICB9CgkgICAgJHRlbXBsYXRlLT5lbmNvZGluZyA9ICR2YWx1ZTsKCSAgICBicmVhazsKCSAgICAKCSAgY2FzZSAnVERBVEEnOgoJICAgIGlmKCAkdHlwZSAhPSAnY29tcGxldGUnICYmICR0eXBlICE9ICdjbG9zZScgKQoJICAgICAgewoJCWNvbnRpbnVlOwoJICAgICAgfQoJICAgICR0ZW1wbGF0ZS0+Y29udGVudCA9IGJhc2U2NF9kZWNvZGUoJHZhbHVlKTsKCSAgICBicmVhazsKCSAgICAKCSAgY2FzZSAnVEVNUExBVEUnOgoJICAgIGlmKCAkdHlwZSAhPSAnY2xvc2UnICkKCSAgICAgIHsKCQljb250aW51ZTsKCSAgICAgIH0KCSAgICAvLyB3ZSdyZSBjbG9zaW5nIHRoZSB0ZW1wbGF0ZSwgd2UgY2FuIGlnbm9yZSB0aGlzCgkgICAgLy8gbG9va3MgbGlrZSB3ZSBjYW4gaWdub3JlIGl0IGFueXdheXMKCSAgICBicmVhazsKCSAgICAKCSAgY2FzZSAnQ1NTTkFNRSc6CgkgICAgJG9uZXNoZWV0LT5uYW1lID0gJHRoZW1lLiIgOiAiLiR2YWx1ZTsKCSAgICBmb3JlYWNoKCAkYWxsc3R5bGVzaGVldHMgYXMgJGNzc29iaiApCgkgICAgICB7CgkJaWYoICRjc3NvYmotPm5hbWUgPT0gJG9uZXNoZWV0LT5uYW1lICkKCQkgIHsKCQkgICAgLy8gc3R5bGVzaGVldCBuYW1lIGV4aXN0cwoJCSAgICAkdGhpcy0+RGlzcGxheUVycm9yUGFnZSggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQsIAoJCQkJCSAgICAgJHRoaXMtPkxhbmcoJ2Vycm9yX3N0eWxlc2hlZXRleGlzdHMnLCRvbmVzaGVldC0+bmFtZSkpOwoJCSAgICByZXR1cm47CgkJICB9CgkgICAgICB9CgkgICAgYnJlYWs7CgoJICBjYXNlICdDU1NNRURJQVRZUEUnOgoJICAgICRvbmVzaGVldC0+bWVkaWFfdHlwZSA9ICR2YWx1ZTsKCSAgICBicmVhazsKCgkgIGNhc2UgJ0NTU0RBVEEnOgoJICAgICRvbmVzaGVldC0+dmFsdWUgPSBiYXNlNjRfZGVjb2RlKCR2YWx1ZSk7CgkgICAgYnJlYWs7CgoJICBjYXNlICdTVFlMRVNIRUVUJzoKCSAgICBpZiggJHR5cGUgPT0gJ29wZW4nICkKCSAgICAgIHsKCQkkb25lc2hlZXQgPSBuZXcgU3R5bGVzaGVldCgpOwoJICAgICAgfQoJICAgIGVsc2UgaWYoICR0eXBlID09ICdjbG9zZScgKQoJICAgICAgewoJCWFycmF5X3B1c2goICRzdHlsZXNoZWV0cywgJG9uZXNoZWV0ICk7CgkgICAgICB9CgoJICBjYXNlICdSRUZOQU1FJzoKCSAgICAkcmVmZXJlbmNlWyduYW1lJ10gPSAkdmFsdWU7CgkgICAgYnJlYWs7CgoJICBjYXNlICdSRUZFTkNPREVEJzoKCSAgICAkcmVmZXJlbmNlWydlbmNvZGVkJ10gPSAkdmFsdWU7CgkgICAgYnJlYWs7CgoJICBjYXNlICdSRUZMT0NBVElPTic6CgkgICAgJHJlZmVyZW5jZVsnbG9jYXRpb24nXSA9ICR2YWx1ZTsKCSAgICBicmVhazsKCgkgIGNhc2UgJ1JFRkRBVEEnOgoJICAgICRyZWZlcmVuY2VbJ2RhdGEnXSA9ICR2YWx1ZTsKCSAgICBicmVhazsKCgkgIGNhc2UgJ1JFRkVSRU5DRSc6CgkgICAgaWYoICR0eXBlICE9ICdjbG9zZScgKQoJICAgICAgewoJCWNvbnRpbnVlOwoJICAgICAgfQoJICAgIGlmKCBjb3VudCggJHJlZmVyZW5jZSApICE9IDQgKQoJICAgICAgewoJCS8vIHN0eWxlc2hlZXQgbmFtZSBleGlzdHMKCQkkdGhpcy0+RGlzcGxheUVycm9yUGFnZSggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQsIAoJCQkJCSAkdGhpcy0+TGFuZygnZXJyb3JfYmFkZW1iZWQnLCRvbmVzaGVldC0+bmFtZSkpOwoJICAgICAgfQoJICAgIGFycmF5X3B1c2goICRhbGxyZWZlcmVuY2VzLCAkcmVmZXJlbmNlICk7CgkgICAgJHJlZmVyZW5jZSA9IGFycmF5KCk7CgkgICAgYnJlYWs7CgkgIH0KICAgICAgfQoKICAgIC8vIGNoZWNrIHRoZSBkdGQgdmVyc2lvbiBvbmUgbGFzdCB0aW1lLgogICAgaWYoICRoYXZlZHRkdmVyc2lvbiA9PSBmYWxzZSApCiAgICAgIHsKCSR0aGlzLT5EaXNwbGF5RXJyb3JQYWdlKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCwgCgkJCQkgJHRoaXMtPkxhbmcoJ2Vycm9yX2R0ZG1pc21hdGNoJykpOwoJcmV0dXJuOwogICAgICB9CgogICAgLy8gbWFrZSBzdXJlIHdlIGhhdmUgYXQgbGVhc3Qgb25lIHN0eWxlc2hlZXQKICAgIGlmKCBjb3VudCggJHN0eWxlc2hlZXRzICkgPT0gMCApCiAgICAgIHsKCSR0aGlzLT5EaXNwbGF5RXJyb3JQYWdlKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCwgCgkJCQkgJHRoaXMtPkxhbmcoJ2Vycm9yX25vc3R5bGVzaGVldHMnKSk7CglyZXR1cm47CiAgICAgIH0KCiAgICAvLyBjbGVhbiB1cCB0aGUgdGVtcGxhdGUgYW5kIHN0eWxlc2hlZXRzIGFuZCBhZGp1c3QgZXZlcnl0aGluZyB0byB0aGVpciBuZXcgbG9jYXRpb25zCiAgICAkcHJlZml4ID0gYmFzZW5hbWUoJGdDbXMtPmNvbmZpZ1sndXBsb2Fkc191cmwnXSkuIi8iLiR0aGVtZTsKICAgIGZvciggJGkgPSAwOyAkaSA8IGNvdW50KCRzdHlsZXNoZWV0cyk7ICRpKysgKQogICAgICB7CgkkcmVzdWx0ID0gJHRoaXMtPl9jbGVhbnVwUmVmZXJlbmNlcyggJHByZWZpeCwgJGFsbHJlZmVyZW5jZXMsICRzdHlsZXNoZWV0c1skaV0tPnZhbHVlICk7CglpZiggISRyZXN1bHQgKQoJICB7CgkgICAgJHRoaXMtPkRpc3BsYXlFcnJvclBhZ2UoICRpZCwgJHBhcmFtcywgJHJldHVybmlkLCAKCQkJCSAgICAgJHRoaXMtPkxhbmcoJ2Vycm9yX2VkaXRpbmdwcm9ibGVtJykpOwoJICAgIHJldHVybjsKCSAgfQogICAgICB9CiAgICAkcmVzdWx0ID0gJHRoaXMtPl9jbGVhbnVwUmVmZXJlbmNlcyggJHByZWZpeCwgJGFsbHJlZmVyZW5jZXMsICR0ZW1wbGF0ZS0+Y29udGVudCApOwogICAgaWYoICEkcmVzdWx0ICkKICAgICAgewoJJHRoaXMtPkRpc3BsYXlFcnJvclBhZ2UoICRpZCwgJHBhcmFtcywgJHJldHVybmlkLCAKCQkJCSAkdGhpcy0+TGFuZygnZXJyb3JfZWRpdGluZ3Byb2JsZW0nKSk7CglyZXR1cm47CiAgICAgIH0KCgogICAgLy8gc2F2ZSBvdXIgcmVmZXJlbmNlcyBhcyBmaWxlcwogICAgLy8gZmlyc3Qgd2UgY3JlYXRlIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgaWYgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0CiAgICAkZGVzdCA9ICRnQ21zLT5jb25maWdbJ3VwbG9hZHNfcGF0aCddLkRJUkVDVE9SWV9TRVBBUkFUT1IuJHRoZW1lOwogICAgJHRoaXMtPl9ta2RpcnIoICRkZXN0ICk7CgogICAgZm9yZWFjaCggJGFsbHJlZmVyZW5jZXMgYXMgJHJlZiApCiAgICAgIHsKCSRyZXMgPSAkdGhpcy0+X3NhdmVFbmNvZGVkRmlsZSggJGRlc3QsICRyZWZbJ25hbWUnXSwgJHJlZlsnbG9jYXRpb24nXSwKCQkJCQkkcmVmWydlbmNvZGVkJ10sICRyZWZbJ2RhdGEnXSApOwoJaWYoICRyZXMgIT0gMSApIAoJICB7CgkgICAgLy8gdGhpcyBjb3VsZCBiZSBhIHByb2JsZW0gd2UgY291bGQgaGF2ZSBhIGJ1bmNoIG8gZmlsZXMgbHlpbmcgYXJvdW5kCgkgICAgJHRoaXMtPkRpc3BsYXlFcnJvclBhZ2UoICRpZCwgJHBhcmFtcywgJHJldHVybmlkLCAKCQkJCSAgICAgJHRoaXMtPkxhbmcoJ2Vycm9yX3Byb2JsZW1zYXZpbmdpbmNsdWRlcycpKTsKCSAgICByZXR1cm47CgkgIH0KICAgICAgfQogICAgCiAgICAKICAgIC8vIG5vdyB3ZSBoYXZlIGEgdGVtcGxhdGUgYW5kIG9uZSBvciBtb3JlIHN0eWxlc2hlZXRzLCBkbyBvdXIgbWFnaWMKICAgICRjc3NpZHMgPSBhcnJheSgpOwogICAgZm9yZWFjaCggJHN0eWxlc2hlZXRzIGFzICRjc3MgKQogICAgICB7CgkkbmV3aWQgPSBTdHlsZVNoZWV0T3BlcmF0aW9uczo6SW5zZXJ0U3R5bGVzaGVldCggJGNzcyApOwoJaWYoICRuZXdpZCA9PSAtMSApCgkgIHsKCSAgICAvLyBjb3VsZG4ndCBpbnNlcnQgdGhlIHN0eWxlc2hlZXQKCSAgICBjb250aW51ZTsKCSAgfQoJYXJyYXlfcHVzaCggJGNzc2lkcywgJG5ld2lkICk7CiAgICAgIH0KCiAgICAkbmV3dG1wbGlkID0gVGVtcGxhdGVPcGVyYXRpb25zOjpJbnNlcnRUZW1wbGF0ZSggJHRlbXBsYXRlICk7CiAgICBpZiggJG5ld3RtcGxpZCA9PSAtMSApCiAgICAgIHsKCSR0aGlzLT5EaXNwbGF5RXJyb3JQYWdlKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCwgCgkJCQkgJHRoaXMtPkxhbmcoJ2Vycm9yX2NvdWxkbm90Y3JlYXRldGVtcGxhdGUnKSk7CglyZXR1cm47CiAgICAgIH0KICAgIGVsc2UKICAgICAgewoJLy8gbm93IGFzc29jaWF0ZSB0aGUgc3R5bGVzaGVldHMgd2l0aCB0aGlzIHRlbXBsYXRlCglmb3JlYWNoKCAkY3NzaWRzIGFzICRpZCApCgkgIHsKCSAgICBpZiggIVN0eWxlc2hlZXRPcGVyYXRpb25zOjpBc3NvY2lhdGVTdHlsZXNoZWV0VG9UZW1wbGF0ZSggJGlkLCAkbmV3dG1wbGlkICkgKQoJICAgICAgewoJCS8vIHJlYWxseSByZWFsbHkgYmFkIGlmIHRoaXMgZGlkbid0IHdvcmsuCgkJLy8gY3V6IHRoZW9yZXRpY2FsbHkgd2Ugd291bGQgaGF2ZSB0byBjbGVhbiB1cC4KCQkkdGhpcy0+RGlzcGxheUVycm9yUGFnZSggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQsIAoJCQkJCSAkdGhpcy0+TGFuZygnZXJyb3JfY291bGRub3Rhc3NvY2NzcycpKTsKCQlyZXR1cm47CgkgICAgICB9CgkgIH0KICAgICAgfQoKICAgIC8vIGlmIHdlIGdvdCBoZXJlLCBldmVyeXRoaW5nIHNob3VsZCBiZSBhLW9rYXkKICAgIHJldHVybjsgLy8gZGVidWcKICAgICR0aGlzLT5SZWRpcmVjdCggJGlkLCAnZGVmYXVsdGFkbWluJywgJHJldHVybmlkICk7CiAgfSAvLyBmdW5jdGlvbgoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIF9ta2RpcnIoICRwYXRobmFtZSwgJG1vZGUgKQogICAgTk9UIFBBUlQgT0YgVEhFIE1PRFVMRSBBUEkKCiAgICBNYWtlIGEgZGlyZWN0b3J5IHJlY3Vyc2l2ZWx5CiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIF9ta2RpcnIgKCRwYXRobmFtZSwgJG1vZGUgPSAwNzc3KQogIHsKICAgIC8vIENoZWNrIGlmIGRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0cwogICAgaWYgKGlzX2RpciAoJHBhdGhuYW1lKSB8fCBlbXB0eSAoJHBhdGhuYW1lKSkKICAgIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgLy8gRW5zdXJlIGEgZmlsZSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0IHdpdGggdGhlIHNhbWUgbmFtZQogICAgaWYgKGlzX2ZpbGUgKCRwYXRobmFtZSkpCiAgICB7CiAgICAgIC8vIFJDOiBNb2RpZmljYXRpb24gc3VjaCB0aGF0IHRoaXMgaXNuJ3QgYW4gZXJyb3IKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgLy8gQ3Jhd2wgdXAgdGhlIGRpcmVjdG9yeSB0cmVlCiAgICAkbmV4dF9wYXRobmFtZSA9CiAgICAgIHN1YnN0ciAoJHBhdGhuYW1lLCAwLCBzdHJycG9zICgkcGF0aG5hbWUsIERJUkVDVE9SWV9TRVBBUkFUT1IpKTsKICAgIGlmICgkdGhpcy0+X21rZGlyciAoJG5leHRfcGF0aG5hbWUsICRtb2RlKSkKICAgIHsKICAgICAgaWYgKCFmaWxlX2V4aXN0cyAoJHBhdGhuYW1lKSkKICAgICAgewoJIHJldHVybiBAbWtkaXIgKCRwYXRobmFtZSwgJG1vZGUpOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIGZhbHNlOwogIH0KCn0KCj8+Cg==]]></data>
  </file>
</module>
