<?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 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.2</dtdversion>
  <name>FrontEndUsers</name>
  <version>1.0.0</version>
  <help>PGgzPldoYXQgRG9lcyBUaGlzIERvPzwvaDM+CjxwPlRoaXMgbW9kdWxlIGFsbG93cyBtYW5hZ2VtZW50IGFuZCBhZG1pbmlzdHJhdGlvbiBvZiBmcm9udCBlbmQgdXNlcnMgPGk+KHVzZXJzIHdobyBoYXZlIG5vIGFkbWluIGFjY2Vzc3MpPC9pPi4gIEl0IGFsbG93cyBjcmVhdGlvbiBvZiB1c2VyIGdyb3VwcywgYW5kIHVzZXIgYWNjb3VudHMgYW5kIGFsbG93cyB1c2VycyB0byBsb2dpbiBhbmQgbG9nb3V0LiAgaXQgY2FuIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgQ3VzdG9tQ29udGVudCBtb2R1bGUgdG8gZGlzcGxheSBkaWZmZXJlbnQgY29udGVudCB0byBkaWZmZXJlbnQgdXNlcnMgb25jZSB0aGV5IGhhdmUgbG9nZ2VkIGluPC9wPgo8aDM+RmVhdHVyZXM8L2gzPgo8dWw+CjxsaT48cD5Vc2VyIGFjY291bnQgZXhwaXJhdGlvbi4gIFlvdSBjYW4gY3JlYXRlIHRlbXBvcmFyeSB1c2VyczwvcD48L2xpPgo8bGk+PHA+R3JvdXAgUHJvcGVydGllcy4gIFlvdSBjYW4gYXNrIGZvciBkaWZmZXJlbnQgaW5mb3JtYXRpb24gZnJvbSBtZW1iZXJzIG9mIGRpZmZlcmVudCBncm91cHM8L3A+PC9saT4KPGxpPjxwPkNhcGFibGUgb2YgaGFuZGxpbmcgaHVuZHJlZHMgb2YgdXNlcnM8L3A+PC9saT4KPGxpPjxwPkhhcyBhbiBleHRlbnNpdmUgQVBJIGZvciBhZGRpbmcgZnVuY3Rpb25hbGl0eTwvcD48L2xpPgo8L3VsPgo8aDM+SG93IGRvIEkgdXNlIGl0PC9oMz4KPHVsPgo8bGk+PHA+QWZ0ZXIgaW5zdGFsbGF0aW9uIHlvdSBjYW4gYWNjZXNzIGFkbWluIHBhbmVsIHRvIHRoZSBGcm9udEVuZFVzZXJzIG1vZHVsZSB1bmRlciB0aGUgJnF1b3Q7VXNlcnMgJiBnR3JvdXBzJnF1b3Q7IG1lbnUuPC9wPjwvbGk+CjxsaT4KPHA+U2Vjb25kbHksIHlvdSBzaG91bGQgZGVmaW5lIHByb3BlcnRpZXMuICBQcm9wZXJ0aWVzIGFyZSBlc3NlbnRpYWxseSBmaWVsZCBkZWZpbml0aW9ucywgaGVyZSB5b3Ugc3BlY2lmeSB0aGUgdHlwZSBvZiBpbmZvcm1hdGlvbiB5b3Ugd2FudCB0byBnYXRoZXIsIGFuZCBsaW1pdHMuIGkuZTogIE5hbWUsIEFnZSwgQ2l0eSwgU3RhdGUsIENvdW50cnksIEVtYWlsIGFkZHJlc3MsIGV0Yy48L3A+CjxwPjxiPk5vdGU6PC9iPiBZb3UgZG8gbm90IG5lZWQgdG8gZGVmaW5lIHByb3BlcnRpZXMgZm9yIHVzZXJuYW1lIGFuZCBwYXNzd29yZCwgdGhlc2Ugd2lsbCBiZSBwcm92aWRlZCBmb3IgeW91PC9iPgo8L2xpPgo8bGk+PHA+TmV4dCB5b3Ugc2hvdWxkIGNyZWF0ZSBvbmUgb3IgbW9yZSB1c2VyIGdyb3Vwcy4gIFdoZW4geW91IGNyZWF0ZSBhIGdyb3VwLCB5b3UgYXJlIGFza2VkIGZvciBhIGdyb3VwIG5hbWUsIGEgZGVzY3JpcHRpb24gYW5kIHRvIGFzc29jaWF0ZSBwcm9wZXJ0aWVzIHdpdGggdGhhdCBncm91cCwgc3BlY2lmeSB0aGUgcHJvcGVydGllcyBzb3J0IG9yZGVyLCBhbmQgd2V0aGVyIGl0IGlzIGFuIG9wdGlvbmFsLCByZXF1aXJlZCwgb3IgaGlkZGVuIGZpZWxkIDxpPihvZmYgaXMgYWxzbyB2YWxpZCk8L2k+PC9wPjwvbGk+CjxsaT48cD48Yj5Ob3RlOjwvYj4gQmVmb3JlIHByb2NlZWRpbmcsIHlvdSBzaG91bGQgZW5zdXJlIHRoYXQgdGhlIHByZWZlcmVuY2VzIGFyZSBzZXQgY29ycmVjdGx5LjwvcD48L2xpPgo8bGk+PHA+VGhpcmRseSB5b3Ugc2hvdWxkIGNyZWF0ZSBzb21lIHVzZXJzLiAgQWRkaW5nIHVzZXJzIGlzIGEgdHdvIHN0ZXAgcHJvY2Vzcy4gIFdoZW4gY3JlYXRpbmcgYSB1c2VyIHlvdSBhcmUgYXNrZWQgZm9yIHRoZSB1c2VybmFtZSBhbmQgcGFzc3dvcmQsIGFuZCBhbiBleHBpcnkgZGF0ZSBmb3IgdGhhdCB1c2VyLiAgWW91IHRoZW4gbXVzdCBzZWxlY3QgdGhlIGdyb3VwcyB0aGF0IHRoYXQgdXNlciBpcyBhIG1lbWJlciBvZiwgYW5kIGNsaWNrIFwnTmV4dFwnPC9wPgo8cD48ZW0+Tm90ZTogPC9lbT5UaGlzIGlzIGEgbGFib3VyIGludGVuc2l2ZSBhbmQgYm9yaW5nIHByb2Nlc3MsIGl0IGlzIGVhc2llciB0byBsZXQgdXNlcnMgcmVnaXN0ZXIgdGhlbXNlbHZlcywgYW5kIHRoZW4geW91IGNhbiBlZGl0IHRoZWlyIGdyb3VwIGluZm9ybWF0aW9uLiAgYnV0IGZvciB0ZXN0aW5nIHB1cnBvc2VzLCBwbGVhc2UgY3JlYXRlIGF0IGxlc3Qgb25lIHVzZXI8L3A+PC9saT4KPGxpPjxwPkxhc3RseSwgYWZ0ZXIgdGhlIHN5c3RlbSBoYXMgZGV0ZXJtaW5lZCBhbGwgb2YgdGhlIGluZm9ybWF0aW9uIGZpZWxkcyB0byBiZSBwcmVzZW50ZWQgZm9yIHRoYXQgdXNlciwgeW91IGFyZSBwcmVzZW50ZWQgd2l0aCBhIGZvcm0gYXNraW5nIGZvciBhbGwgb2YgdGhlIHJlcXVpcmVkIHVzZXIgaW5mb3JtYXRpb24uICBDb21wbGV0ZSB0aGlzIGZvcm0gdG8gY29tcGxldGUgdGhlIHVzZXIgYWRkaXRpb248L3A+PC9saT4KPGxpPjxwPllvdSBhcmUgbm93IHJlYWR5IHRvIGFkZCB0aGUgZnJvbnQgZW5kIGZ1bmN0aW9uYWxpdHkgdG8geW91ciBzaXRlLiAgVGhpcyBpcyBhcyBzaW1wbGUgYXMgYWRkaW5nIHRoZSB7Y21zX21vZHVsZSBtb2R1bGU9RnJvbnRFbmRVc2Vyc30gdGFnIHRvIHlvdXIgcGFnZSBvciB0ZW1wbGF0ZTwvcD48L2xpPgo8L3VsPgo8aDM+U3VwcG9ydDwvaDM+CjxwPlRoaXMgbW9kdWxlIGRvZXMgbm90IGluY2x1ZGUgY29tbWVyY2lhbCBzdXBwb3J0LiBIb3dldmVyLCB0aGVyZSBhcmUgYSBudW1iZXIgb2YgcmVzb3VyY2VzIGF2YWlsYWJsZSB0byBoZWxwIHlvdSB3aXRoIGl0OjwvcD4KPHVsPgo8bGk+Rm9yIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGlzIG1vZHVsZSwgRkFRcywgb3IgdG8gZmlsZSBhIEJ1ZyBSZXBvcnQgb3IgYnV5IGNvbW1lcmNpYWwgc3VwcG9ydCwgcGxlYXNlIHZpc2l0IGNhbGd1eVwncwptb2R1bGUgaG9tZXBhZ2UgYXQgPGEgaHJlZj0iaHR0cDovL3RlY2hjb20uZHluZG5zLm9yZyI+dGVjaGNvbS5keW5kbnMub3JnPC9hPi48L2xpPgo8bGk+QWRkaXRpb25hbCBkaXNjdXNzaW9uIG9mIHRoaXMgbW9kdWxlIG1heSBhbHNvIGJlIGZvdW5kIGluIHRoZSA8YSBocmVmPSJodHRwOi8vZm9ydW0uY21zbWFkZXNpbXBsZS5vcmciPkNNUyBNYWRlIFNpbXBsZSBGb3J1bXM8L2E+LjwvbGk+CjxsaT5UaGUgYXV0aG9yLCBjYWxndXkxMDAwLCBjYW4gb2Z0ZW4gYmUgZm91bmQgaW4gdGhlIDxhIGhyZWY9ImlyYzovL2lyYy5mcmVlbm9kZS5uZXQvI2NtcyI+Q01TIElSQyBDaGFubmVsPC9hPi48L2xpPgo8bGk+TGFzdGx5LCB5b3UgbWF5IGhhdmUgc29tZSBzdWNjZXNzIGVtYWlsaW5nIHRoZSBhdXRob3IgZGlyZWN0bHkuPC9saT4gIAo8L3VsPgo8aDM+UGFyYW1ldGVyczwvaDM+Cjx1bD4KPGxpPjxlbT4ob3B0aW9uYWwpPC9lbT4gZm9ybT0ibmFtZSI8L2xpPgo8cD5Gb3JtczoKPHVsPgogPGxpPjxlbT5sb2dpbjwvZW0+IC0gRGlzcGxheSB0aGUgbG9naW4gZm9ybTwvbGk+CiA8bGk+PGVtPmxvZ291dDwvZW0+IC0gRGlzcGxheSB0aGUgbG9nb3V0IGZvcm08L2xpPgogPGxpPjxlbT5jaGFuZ2VzZXR0aW5nczwvZW0+IC0gRGlzcGxheSB0aGUgY2hhbmdlIHNldHRpbmdzIGZvcm08L2xpPgogPGxpPjxlbT5mb3Jnb3RwdzwvZW0+IC0gRGlzcGxheSB0aGUgZm9yZ290IHBhc3N3b3JkIGZvcm08L2xpPgo8L3VsPgo8L3A+CjxsaT48ZW0+KG9wdGlvbmFsKTwvZW0+IHJldHVybnRvPSJwYWdlIjwvbGk+CjxwPlVzZWQgd2l0aCB0aGUgbG9naW4sIGxvZ291dCwgYW5kIGNoYW5nZXNldHRpbmdzIGZvcm1zLCB0aGlzIHBhcmFtZXRlciBjb250YWlucyB0aGUgcGFnZSBpZCBvciBhbGlhcyBvZiBhIHBhZ2UgdG8gcmVkaXJlY3QgdG8sIHdoZW4gdGhlIGZvcm0gaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZDwvcD4KPC91bD4KPHA+QXMgcGVyIHRoZSBHUEwsIHRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYXMtaXMuIFBsZWFzZSByZWFkIHRoZSB0ZXh0Cm9mIHRoZSBsaWNlbnNlIGZvciB0aGUgZnVsbCBkaXNjbGFpbWVyLjwvcD4KPGgzPlJlcXVpcmVtZW50czwvaDM+CjxwPkluIG9yZGVyIHRvIGltcGxlbWVudCB0aGUgZm9yZ290dGVuIHBhc3N3b3JkIGZ1bmN0aW9uYWxpdHksIHRoaXMgbW9kdWxlIHJlcXVpcmVzIHRoZSBDTVNNYWlsZXIgbW9kdWxlIHRvIGJlIHByZXZpb3VzbHkgaW5zdGFsbGVkPC9wPgo8aDM+Q29weXJpZ2h0IGFuZCBMaWNlbnNlPC9oMz4KPHA+Q29weXJpZ2h0ICZjb3B5OyAyMDA1LCBSb2JlcnQgQ2FtcGJlbCA8YSBocmVmPSJtYWlsdG86Y2FsZ3V5MTAwMEBob3RtYWlsLmNvbSI+Jmx0O2NhbGd1eTEwMDBAaG90bWFpbC5jb20mZ3Q7PC9hPi4gQWxsIFJpZ2h0cyBBcmUgUmVzZXJ2ZWQuPC9wPgo8cD5UaGlzIG1vZHVsZSBoYXMgYmVlbiByZWxlYXNlZCB1bmRlciB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMIj5HTlUgUHVibGljIExpY2Vuc2U8L2E+LiBZb3UgbXVzdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UgYmVmb3JlIHVzaW5nIHRoZSBtb2R1bGUuPC9wPjxoMz5EZXBlbmRlbmNpZXM8L2gzPjx1bD48bGk+Q01TTWFpbGVyID0mZ3Q7IDEuNzMuMzwvbGk+PC91bD48aDM+UGFyYW1ldGVyczwvaDM+PHVsPjxsaT48ZW0+KG9wdGlvbmFsKTwvZW0+IGxhbmc9ImVuX1VTIiAtIFBhcmFtZXRlciBpcyB1c2VkIHRvIHNwZWNpZnkgd2hhdCBsYW5ndWFnZSB0byB1c2UgZm9yIGRpc3BsYXkgb24gdGhlIGZyb250ZW5kLiBOb3QgYWxsIG1vZHVsZXMgc3VwcG9ydCBvciBuZWVkIHRoaXMuPC9saT48L3VsPg==</help>
  <about>PGJyIC8+QXV0aG9yOiBjYWxndXkxMDAwICZsdDtjYWxndXkxMDAwQGhvdG1haWwuY29tJmd0OzxiciAvPjxiciAvPlZlcnNpb246IDEuMC4wPGJyIC8+PGJyIC8+Q2hhbmdlIEhpc3Rvcnk6PGJyIC8+PHVsPgo8bGk+MC4wLjEgLSBPY3RvYmVyLCAyMDA1IC0gSW5pdGlhbCBOUlBUIChOb3QgUmVhZHkgZm9yIFByaW1lIFRpbWUpIHJlbGVhc2U8L2xpPgo8bGk+MC4xLjAgLSBPY3RvYmVyLCAyMDA1IC0gSW5pdGlhbCByZWxlYXNlPC9saT4KPGxpPjAuMS4xIC0gT2N0b2JlciwgMjAwNSAtIEZpeGVkIGlzc3VlcyB3aXRoIHByb3BlcnRpZXM8L2xpPgo8bGk+MC4xLjIgLSBPY3RvYmVyLCAyMDA1IC0gQWRkZWQgZm9yZ290dGVuIHBhc3N3b3JkIGZ1bmN0aW9uYWxpdHk8L2xpPgo8bGk+PHA+MC4xLjMgLSBOb3ZlbWJlciwgMjAwNTwvcD4KICAgIDxwPkFkZGVkIHRoZSBhYmlsaXR5IHRvIHNwZWNpZnkgYSByZWRpcmVjdCBwYWdlIG9uIGxvZ2luLCBsb2dvdXQsIGZvcmdvdCBwYXNzd29yZCwgYW5kIGNoYW5nZSBzZXR0aW5ncywgYW5kIGFkZGVkIHRoZSByZXR1cm50byBhbmQgZm9ybSBwYXJhbWV0ZXJzIHRvIHRoZSB1c2VyIHNpZGUgb2YgdGhpbmdzLCBhbHNvIGRpZCBhIGNvdXBsZSBsZiBsaXR0bGUgY2xlYW51cHMuICBUaGlzIHZlcnNpb24gcmVxdWlyZXMgdjAuMTEgYW5kIGFib3ZlIGZvciBjZXJ0YWluLjwvcD48L2xpPgo8bGk+MC4xLjQgLSBOb3ZlbWJlciwgMjAwNSAtIFZlcnkgbWlub3IgY2hhbmdlIHdpdGggcmVzcGVjdCB0byBhIGZvcmdvdHRlbiBhbmQgbm8gbG9uZ2VyIG5lZWRlZCBmdW5jdGlvbiBjYWxsPC9saT4KPGxpPjxwPjAuMS41IC0gTm92ZW1iZXIsIDIwMDU8L3A+CiAgICA8cD5Bbm90aGVyIHZlcnkgbWlub3IgY2hhbmdlLCBhZGRlZCBzb21lIHRleHQgdG8gdGhlIFBvc3RJbnN0YWxsIG1lc3NhZ2UuPC9wPjwvbGk+CjxsaT48cD4wLjEuNiAtIEphbnVhcnksIDIwMDY8cD4KICAgIDxwPkNoYW5nZXMgdG8gdGhlIHBlcm1pc3Npb24gbW9kZWwsIGFuZCBtaW5vciBidWcgZml4ZXMgdG8gdGhlIHByZWZlcmVuY2VzLiAgQWxzbyBzb21lIHBocDUgZml4ZXMgYnV0IEkgYW0gc3VyZSB0aGF0IHRoZXJlIGFyZSBtb3JlIG91dCB0aGVyZS48L3A+PC9saT4KPGxpPjxwPjAuMS43IC0gSmFudWFyeSwgMjAwNjxwPgogICAgPHA+TWFueSB0aGFua3MgdG8gPGI+a2F0b248L2I+IGZvciBhZGRpbmcgdGhlIHRleHRhcmVhIGFuZCBkcm9wZG93biBwcm9wZXJ0eSB0eXBlcy48L3A+CiAgICA8cD5GaXhlcyB0byB0aGUgcHJvcGVydHkgYWRkaW5nIHRvIGZpeCBwcm9ibGVtcyB3aXRoIHNwYWNlcyBpbiBwcm9wZXJ0eSBuYW1lcyAod2Ugbm8gbG9uZ2VyIGxldCB0aGF0IGhhcHBlbikuPC9wPgo8L2xpPgo8bGk+PHA+MS4wLjAgLSBGZWJydWFyeSwgMjAwNjxwPgogICAgPHA+QWRkZWQgZmlsdGVyaW5nIGFuZCByb3cgbGltaXRpbmcgdG8gdGhlIGFkbWluIHBhbmVsLiBUaGlzIHdpbGwgaGF2ZSBiaWcgYmVuZWZpdHMgdG8gdGhvc2UgdGhhdCBhcmUgdXNpbmcgdGhpcyBtb2R1bGUgZm9yIGhpZ2ggdHJhZmljLCBhbmQgaGlnaCB1c2VyIHNpdGVzLjwvcD4KICAgIDxwPkFkZGVkIHNvcnRpbmcgdG8gdGhlIGFkbWluIHBhbmVsPC9wPgogICAgPHA+QWRkZWQgbWF4IGxlbmd0aCBhYmlsaXR5IHRvIHRleHQgYW5kIGVtYWlsIGZpZWxkczwvcD4KICAgIDxwPkZpeGVkIGEgc21hbGwgcHJvYmxlbSB3aXRoIHRoZSBkZWZhdWx0IGdyb3VwIG5vdCBiZWluZyBjaGVja2VkIHdoZW4gYWRkaW5nIGEgdXNlcjwvcD4KICAgIDxwPlNhdmUgZmlsdGVyIHNldHRpbmdzIGluIHByZWZlcmVuY2VzLCBhbmQgdGhlIGFjdGl2ZSB0YWIgdG9vLjwvcD4KICAgIDxwPkRlbGV0ZSB1c2VyIHByb3BlcnRpZXMgd2hlbiBhIHByb3BlcnR5IGlzIGRlbGV0ZWQgPGVtPk5vdGU8L2VtPiwgbm90IHdoZW4gaXQgaXMgZGlzYWJsZWQgaW4gdGhlIGVkaXQgZ3JvdXAgZGlhbG9nPC9wPgogICAgPHA+QWRkIGNvbmZpcm1hdGlvbiBtZXNzYWdlIGluIGVkaXQgZ3JvdXBzLjwvcD4KICAgIDxwPkFkZGVkIGEgY291cGxlIG1vcmUgY29uZmlybWF0aW9uIG1lc3NhZ2VzLjwvcD4KICAgIDxwPkFkZGVkIENTViBFeHBvcnQgb3B0aW9uPC9wPgogICAgPHA+VG9kbyAtIEFkZCBwcmVmZXJlbmNlcyBmb3IgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIGZpZWxkbGVuZ3RoPC9wPgo8L2xpPgo8L3VsPjxiciAvPg==</about>
  <description>Manage Frontend Users</description>
  <requires>
    <requiredname>CMSMailer</requiredname>
    <requiredversion>1.73.3</requiredversion>
  </requires>
  <file>
    <filename>/</filename>
    <isdir>1</isdir>
  </file>
  <file>
    <filename>/FrontEndUsers.api.php</filename>
    <isdir>0</isdir>
    <data><![CDATA[PD9waHAKcmVxdWlyZV9vbmNlKCAiVXNlck1hbmlwdWxhdG9yLmNsYXNzLnBocCIgKTsKCmNsYXNzIEZyb250RW5kVXNlcnNNYW5pcHVsYXRvciBleHRlbmRzIFVzZXJNYW5pcHVsYXRvcgp7CiAgZnVuY3Rpb24gQ291bnRUZW1wQ29kZVJlY29yZHMoKQogIHsKICAgICRkYiA9ICR0aGlzLT5HZXREQigpOwogICAgJHEgPSAiU0VMRUNUIENPVU5UKCopIEFTIGNvdW50IEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX3RlbXBjb2RlIjsKICAgICRkYnJlc3VsdCA9ICRkYi0+RXhlY3V0ZSggJHEgKTsKICAgIGlmKCAhJGRicmVzdWx0ICkKICAgICAgewoJcmV0dXJuIDA7CiAgICAgIH0KICAgICRyb3cgPSAkZGJyZXN1bHQtPkZldGNoUm93KCk7CiAgICByZXR1cm4gJHJvd1snY291bnQnXTsKICB9CgogIGZ1bmN0aW9uIEV4cGlyZVRlbXBDb2RlcygkZXhwaXJ5Y29kZSkKICB7CiAgICAkZGIgPSAkdGhpcy0+R2V0RGIoKTsKICAgICRleHBpcmVzID0gc3RydG90aW1lKCAkZXhwaXJ5Y29kZSApOwogICAgJHEgPSAiREVMRVRFIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX3RlbXBjb2RlCiAgICAgICAgICBXSEVSRSBjcmVhdGVkID4gPyI7CiAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoICRxLCBhcnJheSggJGV4cGlyZXMgKSApOwogICAgaWYoICEkZGJyZXN1bHQgKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gdHJ1ZTsgICAgCiAgfQoKICBmdW5jdGlvbiBSZW1vdmVVc2VyVGVtcENvZGUoICR1aWQgKQogIHsKICAgICRkYiA9ICR0aGlzLT5HZXREYigpOwogICAgJHEgPSAiREVMRVRFIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX3RlbXBjb2RlCiAgICAgICAgICBXSEVSRSB1c2VyaWQgPSA/IjsKICAgICRkYnJlc3VsdCA9ICRkYi0+RXhlY3V0ZSggJHEsIGFycmF5KCAkdWlkICkgKTsKICAgIGlmKCAhJGRicmVzdWx0ICkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIHRydWU7CiAgfQoKCiAgZnVuY3Rpb24gR2V0VXNlclRlbXBDb2RlKCAkdWlkICkKICB7CiAgICAkZGIgPSAkdGhpcy0+R2V0RGIoKTsKICAgICRxID0gIlNFTEVDVCAqIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX3RlbXBjb2RlCiAgICAgICAgICBXSEVSRSB1c2VyaWQgPSA/IjsKICAgICRkYnJlc3VsdCA9ICRkYi0+RXhlY3V0ZSggJHEsIGFycmF5KCAkdWlkICkpOwogICAgaWYoICRkYnJlc3VsdCA9PSBGQUxTRSB8fCAkZGJyZXN1bHQtPlJvd0NvdW50KCkgPT0gMCApCiAgICAgIHsKCXJldHVybiBhcnJheShGQUxTRSwkZGItPkVycm9yTXNnKCkpOwogICAgICB9CiAgICAkcm93ID0gJGRicmVzdWx0LT5GZXRjaFJvdygpOwogICAgcmV0dXJuIGFycmF5KFRSVUUsJHJvdyk7CiAgfQoKCiAgZnVuY3Rpb24gU2V0VXNlclRlbXBDb2RlKCAkdWlkLCAkY29kZSApCiAgewogICAgJGRiID0gJHRoaXMtPkdldERiKCk7CiAgICAkcSA9ICJJTlNFUlQgSU5UTyAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfdGVtcGNvZGUKICAgICAgICAgIFZBTFVFUyg/LD8sPykiOwogICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcSwgYXJyYXkoICR1aWQsICRjb2RlLAoJCQkJCSAkZGItPkRCVGltZVN0YW1wKHRpbWUoKSkpICk7CiAgICBpZiggJGRicmVzdWx0ID09IGZhbHNlICkKICAgICAgewoJcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgoKICBmdW5jdGlvbiBTZXRQcm9wZXJ0eURlZm4oICRuYW1lLCAkbmV3bmFtZSwgJHByb21wdCwgJGxlbmd0aCwgJHR5cGUsICRtYXhsZW5ndGggPSAwICkKICB7CiAgICAkZGIgPSAkdGhpcy0+Z2V0RGIoKTsKICAgIAogICAgaWYoICRtYXhsZW5ndGggPT0gMCApCiAgICAgIHsKCSRtYXhsZW5ndGggPSAkbGVuZ3RoOwogICAgICB9CiAgICAkcSA9ICJVUERBVEUgIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX3Byb3BkZWZuCiAgICAgICAgICBTRVQgbmFtZSA9ID8sIHByb21wdCA9ID8sIHR5cGUgPSA/LCBsZW5ndGggPSA/LCBtYXhsZW5ndGggPSA/IAogICAgICAgICAgV0hFUkUgbmFtZSA9ID8iOwogICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcSwgYXJyYXkoICRuZXduYW1lLCAkcHJvbXB0LCAkdHlwZSwgJGxlbmd0aCwgJG1heGxlbmd0aCwgJG5hbWUgKSk7CiAgICBpZiggISRkYnJlc3VsdCApCiAgICAgIHsKCXJldHVybiBmYWxzZTsKICAgICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKCiAgZnVuY3Rpb24gRGVsZXRlUHJvcGVydHlEZWZuKCAkbmFtZSApCiAgewogICAgJGRiID0gJHRoaXMtPkdldERiKCk7CgogICAgJHEgPSAiREVMRVRFIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX3Byb3BkZWZuCiAgICAgICAgICBXSEVSRSBuYW1lPT8iOwogICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcSwgYXJyYXkoICRuYW1lICkgKTsKICAgIGlmKCAhJGRicmVzdWx0ICkKICAgICAgewoJcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgoKICBmdW5jdGlvbiBHZXRQcm9wZXJ0eUdyb3VwUmVsYXRpb25zKCAkdGl0bGUgKQogIHsKICAgICRkYiA9ICR0aGlzLT5HZXREYigpOwoKICAgICRxID0gIlNFTEVDVCAqIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX2dyb3VwcHJvcG1hcAogICAgICAgICAgV0hFUkUgbmFtZSA9ID8gT1JERVIgQlkgc29ydF9rZXkgREVTQyI7CiAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoICRxLCBhcnJheSggJHRpdGxlICkgKTsKICAgIGlmKCAhJGRicmVzdWx0ICkKICAgICAgewoJcmV0dXJuIGFycmF5KEZBTFNFLCRkYi0+RXJyb3JNc2coKSk7CiAgICAgIH0KICAgICRyZXN1bHQgPSBhcnJheSgpOwogICAgd2hpbGUoICRyb3cgPSAkZGJyZXN1bHQtPkZldGNoUm93KCkgKQogICAgICB7CglhcnJheV9wdXNoKCAkcmVzdWx0LCAkcm93ICk7CiAgICAgIH0KICAgIHJldHVybiAkcmVzdWx0OwogIH0KCgogIGZ1bmN0aW9uIElzQWNjb3VudEV4cGlyZWQoICR1aWQgKQogIHsKICAgICRkYiA9ICR0aGlzLT5HZXREYigpOwogICAgCiAgICAkcSA9ICJTRUxFQ1QgKiBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc191c2VycwogICAgICAgICAgV0hFUkUgaWQgPSA/IEFORCBleHBpcmVzID4gPyI7CiAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoICRxLCBhcnJheSggJHVpZCwgCgkJCQkJICRkYi0+RGJUaW1lU3RhbXAodGltZSgpKSApICk7CiAgICBpZiggJGRicmVzdWx0ICYmICRkYnJlc3VsdC0+Um93Q291bnQoKSA9PSAxICkKICAgICAgewoJcmV0dXJuIGZhbHNlOwogICAgICB9CgogICAgcmV0dXJuIHRydWU7CiAgfQoKCiAgZnVuY3Rpb24gR2V0R3JvdXBQcm9wZXJ0eVJlbGF0aW9ucyggJGdycGlkICkKICB7CiAgICAkZGIgPSAkdGhpcy0+R2V0RGIoKTsKCiAgICAkcSA9ICJTRUxFQ1QgKiBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19ncm91cHByb3BtYXAKICAgICAgICAgIFdIRVJFIGdyb3VwX2lkID0gPyBPUkRFUiBCWSBzb3J0X2tleSBERVNDIjsKICAgICRkYnJlc3VsdCA9ICRkYi0+RXhlY3V0ZSggJHEsIGFycmF5KCAkZ3JwaWQgKSk7CiAgICBpZiggISRkYnJlc3VsdCApCiAgICAgIHsKCXJldHVybiBhcnJheShGQUxTRSwkZGItPkVycm9yTXNnKCkpOwogICAgICB9CiAgICAkcmVzdWx0ID0gYXJyYXkoKTsKICAgIHdoaWxlKCAkcm93ID0gJGRicmVzdWx0LT5GZXRjaFJvdygpICkKICAgICAgewoJJHJlc3VsdFtdID0gJHJvdzsKICAgICAgfQogICAgcmV0dXJuICRyZXN1bHQ7CiAgfQoKCiAgZnVuY3Rpb24gQWRkR3JvdXBQcm9wZXJ0eVJlbGF0aW9uKCAkZ3JwaWQsICRwcm9wbmFtZSwgJHNvcnRrZXksICR2YWwgKQogIHsKICAgICRkYiA9ICR0aGlzLT5HZXREYigpOwoKICAgICRxID0gIklOU0VSVCBJTlRPICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19ncm91cHByb3BtYXAKICAgICAgICAgIFZBTFVFUyg/LD8sPyw/KSI7IAogICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcSwgYXJyYXkoICRwcm9wbmFtZSwgJGdycGlkLCAkc29ydGtleSwgJHZhbCApKTsKICAgIGlmKCAhJGRicmVzdWx0ICkKICAgICAgewoJcmV0dXJuIGFycmF5KEZBTFNFLCRkYi0+RXJyb3JNc2coKSk7CiAgICAgIH0KICAgIHJldHVybiBhcnJheShUUlVFKTsKICB9CgoKICBmdW5jdGlvbiBEZWxldGVBbGxHcm91cFByb3BlcnR5UmVsYXRpb25zKCAkZ3JwaWQgKQogIHsKICAgICRkYiA9ICR0aGlzLT5HZXREYigpOwogICAgCiAgICAkcSA9ICJERUxFVEUgRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfZ3JvdXBwcm9wbWFwCiAgICAgICAgICBXSEVSRSBncm91cF9pZCA9ID8iOwogICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcSwgYXJyYXkoICRncnBpZCApKTsKICAgIGlmKCAhJGRicmVzdWx0ICkKICAgICAgewoJcmV0dXJuIGFycmF5KEZBTFNFLCRkYi0+RXJyb3JNc2coKSk7CiAgICAgIH0KICAgIHJldHVybiBhcnJheShUUlVFKTsKICB9CgoKICBmdW5jdGlvbiBEZWxldGVHcm91cFByb3BlcnR5UmVsYXRpb24oICRncnBpZCwgJHByb3BuYW1lICkKICB7CiAgICAkZGIgPSAkdGhpcy0+R2V0RGIoKTsKCiAgICAkcSA9ICJERUxFVEUgRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfZ3JvdXBwcm9wbWFwCiAgICAgICAgICBXSEVSRSBuYW1lID0gPyBBTkQgZ3JvdXBfaWQgPSA/IjsKICAgICRkYnJlc3VsdCA9ICRkYi0+RXhlY3V0ZSggJHEsIGFycmF5KCAkcHJvcG5hbWUsICRncnBpZCApKTsKICAgIGlmKCAhJGRicmVzdWx0ICkKICAgICAgewoJcmV0dXJuIGFycmF5KEZBTFNFLCRkYi0+RXJyb3JNc2coKSk7CiAgICAgIH0KICAgIHJldHVybiBhcnJheShUUlVFKTsKICB9CgoKICBmdW5jdGlvbiBBZGRQcm9wZXJ0eURlZm4oICRuYW1lLCAkcHJvbXB0LCAkdHlwZSwgJGxlbmd0aCwgJG1heGxlbmd0aCA9IDAgKQogIHsKICAgICRkYiA9ICR0aGlzLT5HZXREYigpOwoKICAgIGlmKCAkbWF4bGVuZ3RoID09IDAgKQogICAgICB7CgkkbWF4bGVuZ3RoID09ICRsZW5ndGg7CiAgICAgIH0KCiAgICAkcCA9IGFycmF5KCAkbmFtZSwgJHByb21wdCwgJHR5cGUsICRsZW5ndGgsICRtYXhsZW5ndGggKTsKICAgICRxID0gIklOU0VSVCBJTlRPICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19wcm9wZGVmbgogICAgICAgICAgVkFMVUVTICg/LD8sPyw/LD8pIjsKICAgICRkYnJlc3VsdCA9ICRkYi0+RXhlY3V0ZSggJHEsICRwICk7CiAgICBpZiggJGRicmVzdWx0ID09IGZhbHNlICkKICAgICAgewoJZWNobyAiREVCVUcgcXVlcnkgPSAkcTxici8+IjsgZWNobyAiICAgICAgIjsgcHJpbnRfciggJHAgKTsgZWNobyAiPGJyLz4iOwoJcmV0dXJuIGFycmF5KEZBTFNFLCAkZGItPkVycm9yTXNnKCkpOwogICAgICB9CiAgICByZXR1cm4gYXJyYXkoVFJVRSk7CiAgfQoKCiAgZnVuY3Rpb24gQWRkU2VsZWN0T3B0aW9ucyggJG5hbWUsICRvcHRpb25zICkKICB7CiAgICAkZGIgPSAkdGhpcy0+R2V0RGIoKTsKCSRpbnNlcnRfdmFscyA9ICcnOwoJJG9yZGVyX2lkID0gMDsKCWZvcmVhY2ggKCRvcHRpb25zIGFzICRvcHR0ZXh0KXsKCQkvLyBpZiBubyBhY3R1YWwgdGV4dCBpbiB0aGUgbGluZSwgbWFrZSBzdXJlIGl0IGVxdWFscyAnJywKCQkvLyBpbiBvcmRlciBub3QgdG8gYWRkIGl0IHRvIHRoZSBkYgoJCSRvcHR0ZXh0ID0gdHJpbSgkb3B0dGV4dCk7CgkJaWYodHJpbSgkb3B0dGV4dCkgPT0gJycgfHwgdHJpbSgkb3B0dGV4dCkgPT0gJ19fJyApewoJCQljb250aW51ZTsKCQl9CgkJJG9wdG5hbWUgPSBzdHJfcmVwbGFjZSgnICcsICdfJywgJG9wdHRleHQpOwoJCSRvcmRlcl9pZCsrOwoJCSRpbnNlcnRfdmFscyAuPSAiKCciCgkJCQkuICRvcmRlcl9pZCAuICInLCAnIgoJCQkJLiAkb3B0bmFtZSAuICInLCAnIgoJCQkJLiAkb3B0dGV4dCAuICInLCAnIgoJCQkJLiAkbmFtZS4gIicpLCAiOwoJfQoKCSRpbnNlcnRfdmFscyA9IHN1YnN0cigkaW5zZXJ0X3ZhbHMsIDAsIC0yKTsKCgkkZGIgPSAkdGhpcy0+Z2V0RGIoKTsKCSRxdWVyeSA9ICJJTlNFUlQgSU5UTyAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfZHJvcGRvd25zCgkJCShvcmRlcl9pZCwgb3B0aW9uX25hbWUsIG9wdGlvbl90ZXh0LCBjb250cm9sX25hbWUpIAoJCQlWQUxVRVMgIiAuICRpbnNlcnRfdmFsczsKCWVjaG8gIlF1ZXJ5OiAiIC4gJHF1ZXJ5IC4gIjxicj4iOwoJJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCRxdWVyeSk7CglpZiggJGRicmVzdWx0ID09IGZhbHNlICkgewoJICByZXR1cm4gYXJyYXkoRkFMU0UsICRkYi0+RXJyb3JNc2coKSk7Cgl9CglyZXR1cm4gYXJyYXkoVFJVRSk7CiAgfQoJCQoKICAKICAKICBmdW5jdGlvbiBEZWxldGVQcm9wZXJ0eURlZm5zKCkKICB7CiAgICAkZGIgPSAkdGhpcy0+R2V0RGIoKTsKICAgICRxID0gIkRFTEVURSBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19wcm9wZGVmbiI7CiAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoICRxICk7CiAgICBpZiggJGRicmVzdWx0ID09IGZhbHNlICkKICAgICAgewoJcmV0dXJuIGFycmF5KEZBTFNFLCRkYi0+RXJyb3JNc2coKSk7CiAgICAgIH0KICAgIHJldHVybiBhcnJheShUUlVFKTsKICB9CgoKICBmdW5jdGlvbiBEZWxldGVTZWxlY3RPcHRpb25zKCAkbmFtZSApCiAgewogICAgJGRiID0gJHRoaXMtPkdldERiKCk7CiAgICAkcSA9ICJERUxFVEUgRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfZHJvcGRvd25zCiAgICAgICAgICBXSEVSRSBjb250cm9sX25hbWUgPSA/IjsKICAgICRkYnJlc3VsdCA9ICRkYi0+RXhlY3V0ZSggJHEsIGFycmF5KCAkbmFtZSApICk7CiAgICBpZiggJGRicmVzdWx0ID09IGZhbHNlICkKICAgICAgewoJcmV0dXJuIGFycmF5KEZBTFNFLCRkYi0+RXJyb3JNc2coKSk7CiAgICAgIH0KICAgIHJldHVybiBhcnJheShUUlVFKTsKICB9CgoKICBmdW5jdGlvbiBHZXRQcm9wZXJ0eURlZm4oICRuYW1lICkKICB7CiAgICAkZGIgPSAkdGhpcy0+R2V0RGIoKTsKICAgIAogICAgJHEgPSAiU0VMRUNUICogRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfcHJvcGRlZm4KICAgICAgICAgIFdIRVJFIG5hbWUgPSA/IjsKICAgICRkYnJlc3VsdCA9ICRkYi0+RXhlY3V0ZSggJHEsIGFycmF5KCAkbmFtZSApICk7CiAgICBpZiggJGRicmVzdWx0ID09IGZhbHNlICkKICAgICAgewoJcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAkcm93ID0gJGRicmVzdWx0LT5GZXRjaFJvdygpOwogICAgaWYoICRyb3cgKQogICAgICB7CglyZXR1cm4gJHJvdzsKICAgICAgfQogICAgZWxzZQogICAgICByZXR1cm4gRkFMU0U7CiAgfQoKICBmdW5jdGlvbiBHZXRQcm9wZXJ0eURlZm5zKCkKICB7CiAgICAkZGIgPSAkdGhpcy0+R2V0RGIoKTsKICAgIAogICAgJHEgPSAiU0VMRUNUICogRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfcHJvcGRlZm4iOwogICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcSApOwogICAgaWYoICRkYnJlc3VsdCA9PSBmYWxzZSApCiAgICAgIHsKCXJldHVybiBmYWxzZTsKICAgICAgfQogICAgJHJldCA9IGFycmF5KCk7CiAgICB3aGlsZSggJHJvdyA9ICRkYnJlc3VsdC0+RmV0Y2hSb3coKSApCiAgICAgIHsKCWFycmF5X3B1c2goICRyZXQsICRyb3cgKTsKICAgICAgfQogICAgcmV0dXJuICRyZXQ7CiAgfQoKICAvKioKICAgKiBSZXR1cm5zIHNlbGVjdCBvcHRpb25zIGFzIGEgc2ltcGxlIG9yIGEgMiBkaW1lbnNpb25hbCBhcnJheQogICAqCiAgICogQHBhcmFtIFN0cmluZyAkY29udHJvbG5hbWUgLSBuYW1lIG9mIHRoZSBkcm9wZG93biBhcyBpbiB0aGUgcHJvcGRlZm4gdGFibGUKICAgKiBAcGFyYW0gaW50ICRkaW0gLSBkaW1lbnNpb24gb2YgdGhlIGFycmF5CiAgICogCWlmICRkaW0gPT0gMSwgcmV0dXJucyBhIDEgZGltZW5zaW9uYWwgYXJyYXkgbmFtZT0+dGV4dAogICAqICAgIGlmICRkaW0gPT0gMiwgcmV0dXJucyBhIDIgZGltZW5zaW9uYWwgYXJyYXksIGVhY2ggaXRlbSBiZWluZyBhbgogICAqIAkJYXJyYXkgd2l0aCBwcm9wZXJ0aWVzICdvcHRpb25fbmFtZScsICdvcHRpb25fdGV4dCcsICdjb250cm9sX25hbWUnLgogICAqLwogIGZ1bmN0aW9uIEdldFNlbGVjdE9wdGlvbnMoICRjb250cm9sbmFtZSwgJGRpbT0xICkKICB7CgkkZGIgPSAkdGhpcy0+R2V0RGIoKTsKCQoJJHEgPSAiU0VMRUNUICogRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfZHJvcGRvd25zCgkJV0hFUkUgY29udHJvbF9uYW1lID0gPyBPUkRFUiBCWSBvcmRlcl9pZCI7CgkkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoICRxLCBhcnJheSgkY29udHJvbG5hbWUpICk7CglpZiggJGRicmVzdWx0ID09IGZhbHNlICkgewoJCXJldHVybiBmYWxzZTsKCX0KCSRyZXQgPSBhcnJheSgpOwoJd2hpbGUoICRyb3cgPSAkZGJyZXN1bHQtPkZldGNoUm93KCkgKSB7CgkJaWYgKCRkaW09PTIpewoJCQkJYXJyYXlfcHVzaCggJHJldCwgJHJvdyApOwoJCX0gZWxzZSB7CgkJCQkkcmV0WyRyb3dbJ29wdGlvbl9uYW1lJ11dID0gJHJvd1snb3B0aW9uX3RleHQnXTsKCQl9Cgl9CglyZXR1cm4gJHJldDsKICB9CgogIAogIGZ1bmN0aW9uIExvZ2luKCAkdXNlcm5hbWUsICRwYXNzd29yZCApCiAgewogICAgaWYoICEkdGhpcy0+Q2hlY2tQYXNzd29yZCggJHVzZXJuYW1lLCAkcGFzc3dvcmQgKSApCiAgICAgIHsKCSRtb2QgPSAkdGhpcy0+R2V0TW9kdWxlKCk7CglyZXR1cm4gYXJyYXkoRkFMU0UsJG1vZC0+TGFuZygnZXJyb3JfbG9naW5mYWlsZWQnKSk7CiAgICAgIH0KCiAgICAkdWlkID0gJHRoaXMtPkdldFVzZXJJRCggJHVzZXJuYW1lICk7CgogICAgaWYoICR0aGlzLT5Jc0FjY291bnRFeHBpcmVkKCAkdWlkICkgKQogICAgICB7CgkkbW9kID0gJHRoaXMtPkdldE1vZHVsZSgpOwoJcmV0dXJuIGFycmF5KEZBTFNFLCRtb2QtPkxhbmcoJ2Vycm9yX2FjY291bnRleHBpcmVkJykpOwogICAgICB9CgogICAgJGRiID0gJHRoaXMtPkdldERiKCk7CiAgICAkcSA9ICJJTlNFUlQgSU5UTyAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfbG9nZ2VkaW4gVkFMVUVTICg/LD8sPykiOwoKICAgIC8qIHdlIG1heSBuZWVkIHRvIHN0YXJ0IGEgc2Vzc2lvbiBub3cgKi8KICAgIGlmKCBzZXNzaW9uX2lkKCkgPT0gIiIgKQogICAgICB7CiAgICAgICAgc2Vzc2lvbl9zdGFydCgpOwogICAgICB9CgogICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcSwgYXJyYXkoIHNlc3Npb25faWQoKSwgdGltZSgpLCAkdWlkICkpOwogICAgaWYoICEkZGJyZXN1bHQgKSAKICAgICAgewoJcmV0dXJuIGFycmF5KEZBTFNFLCAkZGItPkVycm9yTXNnKCkpOwogICAgICB9CiAgICByZXR1cm4gYXJyYXkoVFJVRSk7CiAgfQoKCiAgZnVuY3Rpb24gRmV1c2Vyc01hbmlwdWxhdG9yKCAkdGhlX21vZHVsZSApCiAgewogICAgcGFyZW50OjpVc2VyTWFuaXB1bGF0b3IoICR0aGVfbW9kdWxlICk7CiAgfQoKICAvLyB1c2VyaWQgYXBpIGZ1bmN0aW9uCiAgLy8gcmV0dXJucyB0cnVlL2ZhdXNlCiAgZnVuY3Rpb24gQ2hlY2tHcm91cFBlcm1pc3Npb24oICRnaWQsICRwZXJtICkKICB7CiAgICAvLyB3ZSBhbHdheXMgaGF2ZSB0byByZXR1cm4gZmFsc2UgdXNpbmcgdGhpcyBtZWNoYW5pc20gCiAgICAvLyBiZWNhdXNlIHdlIGFyZSB1c2luZyBkaWZmZXJlbnQgdGFibGVzIHRoYW4gd2lzaHkgaXMgdXNpbmcgZm9yIAogICAgLy8gdXNlcnMgYW5kIGdyb3VwcwogICAgcmV0dXJuIGZhbHNlOwovLyAgICAgJGRiID0gJHRoaXMtPkdldERiKCk7CiAgICAKLy8gICAgICRxID0gIlNFTEVDVCAqIEZST00gIi5jbXNfZGJfcHJlZml4KCkuInBlcm1pc3Npb25zIFdIRVJFIHBlcm1pc3Npb25fbmFtZSA9ID8iOwovLyAgICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcSwgYXJyYXkoICRwZXJtICkgKTsKLy8gICAgIGlmKCAhJGRicmVzdWx0IHx8ICRkYnJlc3VsdC0+Um93Q291bnQoKSA9PSAwICkgcmV0dXJuIGZhbHNlOwoKLy8gICAgICRwcm93ID0gJGRicmVzdWx0LT5GZXRjaFJvdygpOwovLyAgICAgJHEgPSAiU0VMRUNUICogRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4iZ3JvdXBfcGVybXMgV0hFUkUgcGVybWlzc2lvbl9pZCA9ID8KLy8gICAgICAgICAgIEFORCBncm91cF9pZCA9ID8iOwovLyAgICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcSwgYXJyYXkoICRwcm93WydwZXJtaXNzaW9uX2lkJ10sICRnaWQgKSApOwovLyAgICAgaWYoICEkZGJyZXN1bHQgfHwgJGRicmVzdWx0LT5Sb3dDb3VudCgpID09IDAgKSByZXR1cm4gZmFsc2U7CgovLyAgICAgcmV0dXJuIHRydWU7CiAgfQoKCiAgLy8gdXNlcmlkIGFwaSBmdW5jdGlvbgogIC8vIHJldHVybnMgdHJ1ZS9mYWxzZQogIGZ1bmN0aW9uIENoZWNrVXNlclBlcm1pc3Npb24oICRwZXJtICkKICB7CiAgICAkdWlkID0gJHRoaXMtPkxvZ2dlZEluSWQoKTsKICAgIGlmKCAkaWQgPT0gZmFsc2UgKSByZXR1cm4gZmFsc2U7CgogICAgcmV0dXJuIENoZWNrVXNlclBlcm1pc3Npb25CeVVpZCggJHVpZCwgJHBlcm0gKTsKICB9CgoKICBmdW5jdGlvbiBDaGVja1VzZXJQZXJtaXNzaW9uQnlVaWQoICR1aWQsICRwZXJtICkKICB7CiAgICAvLyB3ZSBhbHdheXMgaGF2ZSB0byByZXR1cm4gZmFsc2UgdXNpbmcgdGhpcyBtZWNoYW5pc20gCiAgICAvLyBiZWNhdXNlIHdlIGFyZSB1c2luZyBkaWZmZXJlbnQgdGFibGVzIHRoYW4gd2lzaHkgaXMgdXNpbmcgZm9yIAogICAgLy8gdXNlcnMgYW5kIGdyb3VwcwogICAgcmV0dXJuIGZhbHNlOwovLyAgICAgLy8gaWYgdGhlIHVzZXIgYmVsb25ncyB0byBhIGdyb3VwIHRoYXQgaGFzIHRoZSBwZXJtaXNzaW9uLCB3ZSdyZSBsYXVnaGluZwovLyAgICAgJGdyb3VwcyA9ICR0aGlzLT5HZXRNZW1iZXJHcm91cHNBcnJheSggJHVpZCApOwovLyAgICAgaWYoICRncm91cHMgPT0gZmFsc2UgKSByZXR1cm4gZmFsc2U7CiAgICAKLy8gICAgICRkYiA9ICR0aGlzLT5HZXREYigpOwovLyAgICAgJHEgPSAiU0VMRUNUICogRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4icGVybWlzc2lvbnMgV0hFUkUgcGVybWlzc2lvbl9uYW1lID0gPyI7Ci8vICAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoICRxLCBhcnJheSggJHBlcm0gKSApOwovLyAgICAgaWYoICEkZGJyZXN1bHQgfHwgJGRicmVzdWx0LT5Sb3dDb3VudCgpID09IDAgKSByZXR1cm4gZmFsc2U7Ci8vICAgICAkcHJvdyA9ICRkYnJlc3VsdC0+RmV0Y2hSb3coKTsKCi8vICAgICBmb3JlYWNoKCAkZ3JvdXBzIGFzICRncm91cCApCi8vICAgICB7Ci8vICAgICAgICRxID0gIlNFTEVDVCAqIEZST00gIi5jbXNfZGJfcHJlZml4KCkuImdyb3VwX3Blcm1zIFdIRVJFIHBlcm1pc3Npb25faWQgPSA/Ci8vICAgICAgICAgICBBTkQgZ3JvdXBfaWQgPSA/IjsKLy8gICAgICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcSwgYXJyYXkoICRwcm93WydwZXJtaXNzaW9uX2lkJ10sICRnaWQgKSApOwovLyAgICAgICBpZiggJGRicmVzdWx0ICYmICRkYnJlc3VsdC0+Um93Q291bnQoKSA+IDAgKSByZXR1cm4gdHJ1ZTsgICAgICAKLy8gICAgIH0KCi8vICAgICByZXR1cm4gZmFsc2U7CiAgfQoKCiAgLy8gdXNlcmlkIGFwaSBmdW5jdGlvbgogIC8vIHJldHVybnMgdHJ1ZS9mYWxzZQogIGZ1bmN0aW9uIEFzc2lnblVzZXJUb0dyb3VwKCAkdWlkLCAkZ2lkICkKICB7CiAgICAvLyB2YWxpZGF0ZSB0aGUgdXNlciBpZAogICAgaWYoICEkdGhpcy0+VXNlckV4aXN0c0J5SUQoICR1aWQgKSApCiAgICAgIHsKCXJldHVybiBmYWxzZTsKICAgICAgfQogICAgCiAgICAvLyB2YWxpZGF0ZSB0aGUgZ3JvdXAgaWQKICAgIGlmKCAhJHRoaXMtPkdyb3VwRXhpc3RzQnlJRCggJGdpZCApICkKICAgICAgewoJcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAKICAgIC8vIGFkZCB0aGUgcmVjb3JkIHRvIHRoZSB0YWJsZSB0byBtYWtlIHRoaXMgCiAgICAvLyB1c2VyIGEgbWVtYmVyIG9mIHRoaXMgZ3JvdXAKICAgICRkYiA9ICR0aGlzLT5HZXREYigpOwogICAgJHEgPSAiSU5TRVJUIElOVE8gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX2JlbG9uZ3MgCiAgICAgICAgICAgICAgICBWQUxVRVMgKD8sPykiOwogICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcSwgYXJyYXkoICR1aWQsICRnaWQgKSApOwogICAgcmV0dXJuKCAkZGJyZXN1bHQgIT0gZmFsc2UgKTsKICB9CgogIAogIC8vIHVzZXJpZCBhcGkgZnVuY3Rpb24KICAvLyByZXR1cm5zIHRydWUvZmFsc2UKICBmdW5jdGlvbiBJc1ZhbGlkUGFzc3dvcmQoICRwYXNzd29yZCApCiAgewogICAgLy8gYSBwYXNzd29yZCBpcyB2YWxpZCwgaWYgaXQncyBsZW5ndGggaXMKICAgIC8vIHdpdGhpbiBjZXJ0YWluIHJhbmdlcwogICAgJG1vZHVsZSA9ICR0aGlzLT5HZXRNb2R1bGUoKTsKICAgICRtaW5sZW4gPSAkbW9kdWxlLT5HZXRQcmVmZXJlbmNlKCdtaW5fcGFzc3dvcmRsZW5ndGgnLCA2ICk7CiAgICAkbWF4bGVuID0gJG1vZHVsZS0+R2V0UHJlZmVyZW5jZSgnbWF4X3Bhc3N3b3JkbGVuZ3RoJywgMjAgKTsKICAgICRsZW4gPSBzdHJsZW4oJHBhc3N3b3JkKTsKICAgIGlmKCAkbGVuIDwgJG1pbmxlbiApCiAgICAgIHsKCXJldHVybiBmYWxzZTsKICAgICAgfQogICAgZWxzZSBpZiggJGxlbiA+ICRtYXhsZW4gKQogICAgICB7CglyZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIAogICAgcmV0dXJuIHRydWU7CiAgfQoKCiAgLy8gdXNlcmlkIGFwaSBmdW5jdGlvbgogIC8vIHJldHVybnMgYW4gYXJyYXkKICBmdW5jdGlvbiBEZWxldGVVc2VyRnVsbCggJGlkICkKICB7CiAgICAvLyBsb2cgdGhlIHVzZXIgb3V0CiAgICAkdGhpcy0+TG9nb3V0VXNlciggJGlkICk7CgogICAgLy8gZGVsZXRlIHVzZXIgcHJvcGVydGllcwogICAgJHRoaXMtPkRlbGV0ZUFsbFVzZXJQcm9wZXJ0aWVzRnVsbCggJGlkICk7CgogICAgLy8gZGVsZXRlIHVzZXIgZnJvbSBncm91cHMKICAgICRyZXQgPSAkdGhpcy0+UmVtb3ZlVXNlckZyb21Hcm91cCggJGlkLCAnJyApOwogICAgaWYoICRyZXRbMF0gPT0gZmFsc2UgKQogICAgICB7CglyZXR1cm4gJHJldDsKICAgICAgfQoKICAgIC8vIGRlbGV0ZSB1c2VyIHJlY29yZAogICAgJGRiID0gJHRoaXMtPkdldERiKCk7CiAgICAkcSA9ICJERUxFVEUgRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfdXNlcnMKICAgICAgICAgIFdIRVJFIGlkID0gPyI7CiAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoICRxLCBhcnJheSggJGlkICkgKTsKICAgIGlmKCAhJGRicmVzdWx0ICkKICAgICAgewoJcmV0dXJuIGFycmF5KCBGQUxTRTwgJGRiLT5FcnJvck1zZygpICk7CiAgICAgIH0KCiAgICAvLyBhbmQgZGVsZXRlIGFueXRoaW5nIGZyb20gdGhlIHRlbXBjb2RlcyB0YWJsZSB0b28KICAgICRxID0gIkRFTEVURSBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc190ZW1wY29kZQogICAgICAgICAgV0hFUkUgdXNlcmlkID0gPyI7CiAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoICRxLCBhcnJheSggJGlkICkgKTsKICAgIGlmKCAhJGRicmVzdWx0ICkKICAgICAgewoJcmV0dXJuIGFycmF5KCBGQUxTRTwgJGRiLT5FcnJvck1zZygpICk7CiAgICAgIH0KICAgIAogICAgcmV0dXJuIGFycmF5KCBUUlVFLCAiIiApOwogIH0KCgogIC8vIHVzZXJpZCBhcGkgZnVuY3Rpb24KICAvLyByZXR1cm5zIGFuIGFycmF5CiAgZnVuY3Rpb24gR2V0R3JvdXBJbmZvKCAkZ2lkICkKICB7CiAgICAkZGIgPSAkdGhpcy0+R2V0RGIoKTsKICAgICRxID0gIlNFTEVDVCAqIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX2dyb3VwcyBXSEVSRSBpZCA9ID8iOwogICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcSwgYXJyYXkoICRnaWQgKSApOwogICAgaWYoICEkZGJyZXN1bHQgKQogICAgICB7CglyZXR1cm4gYXJyYXkoRkFMU0UsJGRiLT5FcnJvck1zZygpKTsKICAgICAgfQogICAgJHJvdyA9ICRkYnJlc3VsdC0+RmV0Y2hSb3coKTsKICAgIHJldHVybiAkcm93OwogIH0KICAKICAKICAvLyB1c2VyaWQgYXBpIGZ1bmN0aW9uCiAgLy8gcmV0dXJucyBhbiBhcnJheQogIC8vIHNlY29uZCBlbGVtZW50IG9mIGFycmF5IG1heSBiZSBhbiBhcnJheQogIGZ1bmN0aW9uIEdldFVzZXJJbmZvKCAkdWlkICkKICB7CiAgICAkZGIgPSAkdGhpcy0+R2V0RGIoKTsKICAgICRxID0gIlNFTEVDVCAqIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX3VzZXJzCiAgICAgICAgICAgICAgICBXSEVSRSBpZCA9ID8iOwogICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcSwgYXJyYXkoICR1aWQgKSApOwogICAgaWYoICEkZGJyZXN1bHQgKQogICAgICB7CglyZXR1cm4gYXJyYXkoRkFMU0UsJGRiLT5FcnJvck1zZygpKTsKICAgICAgfQogICAgJHJvdyA9ICRkYnJlc3VsdC0+RmV0Y2hSb3coKTsKICAgIHJldHVybiBhcnJheSggVFJVRSwgJHJvdyApOwogIH0KICAKCiAgLy8gdXNlcmlkIGFwaSBmdW5jdGlvbgogIC8vIHJldHVybnMgYW4gYXJyYXkgb3IgZmFsc2UKICBmdW5jdGlvbiBDb3VudFVzZXJzSW5Hcm91cCggJGdyb3VwaWQgKQogIHsKICAgICRkYiA9ICR0aGlzLT5HZXREYigpOwogICAgCiAgICAkcSA9ICcnOwogICAgJHBhcm1zID0gYXJyYXkoKTsKICAgIGlmKCAkZ3JvdXBpZCA9PSAnJyB8fCAkZ3JvdXBpZCA8IDAgKQogICAgICB7CgkkcSA9ICJTRUxFQ1QgY291bnQoaWQpIGFzIG51bSBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc191c2VycyI7IAogICAgICB9CiAgICBlbHNlCiAgICAgIHsKCSRxID0gIlNFTEVDVCBjb3VudChpZCkgYXMgbnVtIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX3VzZXJzLCIuCgkgIGNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfYmVsb25ncyBXSEVSRSBpZD11c2VyaWQgQU5EIGdyb3VwaWQgPSA/IjsKCSRwYXJhbXNbXSA9ICRncm91cGlkOwogICAgICB9CgogICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcSwgJHBhcm1zICk7CiAgICBpZiggISRkYnJlc3VsdCApCiAgICAgIHsKCXJldHVybiBmYWxzZTsKICAgICAgfQoKICAgICRyb3cgPSAkZGJyZXN1bHQtPkZldGNoUm93KCk7CiAgICByZXR1cm4gJHJvd1snbnVtJ107CiAgfQoKICBmdW5jdGlvbiBHZXRVc2Vyc0luR3JvdXAoICRncm91cGlkID0gJycsICRyZWdleCA9ICcnLCAkbGltaXQgPSAnJywgJHNvcnQgPSAnJyApCiAgewogICAgJGRiID0gJHRoaXMtPkdldERiKCk7CgogICAgJHEgPSAnJzsKICAgICRwYXJtcyA9IGFycmF5KCk7CiAgICBpZiggJGdyb3VwaWQgPT0gJycgfHwgJGdyb3VwaWQgPCAwICkKICAgICAgewoJJHEgPSAiU0VMRUNUICogRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfdXNlcnMiOyAKCWlmKCAkcmVnZXggIT0gJycgKQoJICB7CgkgICAgJHEgLj0gIiBXSEVSRSB1c2VybmFtZSBSRUdFWFAgPyI7CgkgICAgJHBhcm1zW10gPSAkcmVnZXg7CgkgIH0KICAgICAgfQogICAgZWxzZSAKICAgICAgewoJJHEgPSAiU0VMRUNUICogRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfdXNlcnMsIi4KCSAgY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19iZWxvbmdzIFdIRVJFIGlkPXVzZXJpZCBBTkQgZ3JvdXBpZCA9ID8iOwoJJHBhcm1zW10gPSAkZ3JvdXBpZDsKCWlmKCAkcmVnZXggIT0gJycgKQoJICB7CgkgICAgJHEgLj0gIiBBTkQgdXNlcm5hbWUgUkVHRVhQID8iOwoJICAgICRwYXJtc1tdID0gJHJlZ2V4OwoJICB9CiAgICAgIH0KICAgIGlmKCAkc29ydCAhPSAnJyApCiAgICAgIHsKCSRxIC49ICIgT1JERVIgQlkgJHNvcnQiOwogICAgICB9CiAgICBpZiggJGxpbWl0ICE9ICcnICkKICAgICAgewoJJHEgLj0gIiBMSU1JVCAkbGltaXQiOwogICAgICB9CgogICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcSwgJHBhcm1zICk7CiAgICBpZiggISRkYnJlc3VsdCApCiAgICAgIHsKCXJldHVybiBmYWxzZTsKICAgICAgfQoKICAgICRyZXN1bHQgPSBhcnJheSgpOwogICAgd2hpbGUoICRyb3cgPSAkZGJyZXN1bHQtPkZldGNoUm93KCkgKQogICAgICB7CglhcnJheV9wdXNoKCAkcmVzdWx0LCAkcm93ICk7CiAgICAgIH0KICAgIHJldHVybiAkcmVzdWx0OwogIH0KCiAgLy8gdXNlcmlkIGFwaSBmdW5jdGlvbgogIC8vIHJldHVybnMgdHJ1ZS9mYWxzZQogIGZ1bmN0aW9uIEdyb3VwRXhpc3RzQnlJRCggJGdpZCApCiAgewogICAgJGRhdGEgPSAkdGhpcy0+R2V0R3JvdXBJbmZvKCAkZ2lkICk7CiAgICByZXR1cm4oICRkYXRhICE9IGZhbHNlICk7CiAgfQoKCiAgLy8gdXNlcmlkIGFwaSBmdW5jdGlvbgogIC8vIHJldHVybnMgdHJ1ZS9mYWxzZQogIGZ1bmN0aW9uIEdyb3VwRXhpc3RzQnlOYW1lKCAkbmFtZSApCiAgewogICAgJGdpZCA9ICR0aGlzLT5HZXRHcm91cElEKCAkbmFtZSApOwogICAgcmV0dXJuKCAkZ2lkICE9IGZhbHNlICk7CiAgfQogIAogIAogIC8vIHVzZXJpZCBhcGkgZnVuY3Rpb24KICAvLyByZXR1cm5zIGFycmF5CiAgZnVuY3Rpb24gSXNWYWxpZEVtYWlsQWRkcmVzcyggJGVtYWlsLCAkc210cHZhbGlkYXRlID0gZmFsc2UgKQogIHsKICAgICRtb2R1bGUgPSAkdGhpcy0+R2V0TW9kdWxlKCk7CiAgICAkcmVzdWx0ID0gYXJyYXkoKTsKICAgIGlmKCAhZXJlZ2koIl5bX2EtejAtOS1dKyhcLltfYS16MC05LV0rKSpAW2EtejAtOS1dKyhcLlthLXowLTktXSspKihcLlthLXpdezIsM30pJCIsICRlbWFpbCApICkKICAgICAgewoJJHJlc3VsdFswXSA9IGZhbHNlOwoJJHJlc3VsdFsxXSA9ICRtb2R1bGUtPkxhbmcoJ2Vycm9yX2ltcHJvcGVyZW1haWxmb3JtYXQnKTsKCXJldHVybiAkcmVzdWx0OwogICAgICB9CiAgICAKICAgIGlmKCAkc210cHZhbGlkYXRlID09IGZhbHNlICkKICAgICAgewoJJHJlc3VsdFswXSA9IHRydWU7CglyZXR1cm4gJHJlc3VsdDsKICAgICAgfQogICAgCiAgICAvLyBnbyBhaGVhZCBhbmQgdmFsaWRhdGUgdGhlIGVtYWlsIGFkZHJlc3MgZnVydGhlcgogICAgbGlzdCAoICR1bmFtZSwgJGRvbWFpbiApID0gc3BsaXQoICJAIiwgJGVtYWlsICk7CiAgICBpZiggZ2V0bXhycigkZG9tYWluLCAkbXhob3N0ICkgKQogICAgICB7CgkkY29ubmVjdGFkZHJlc3MgPSAkbXhob3N0WzBdOwogICAgICB9CiAgICBlbHNlIAogICAgICB7CgkkY29ubmVjdGFkZHJlc3MgPSAkZG9tYWluOwogICAgICB9CiAgICAkY29ubmVjdCA9IGZzb2Nrb3BlbiggJGNvbm5lY3RhZGRyZXNzLCAyNSApOwogICAgaWYoICRjb25uZWN0ICkKICAgICAgewoJaWYoIGVyZWcoJ14yMjAnLCAkb3V0ID0gZmdldHMoICRjb25uZWN0LCAxMDI0ICkgKSApCgkgIHsKCSAgICBmcHV0cyggJGNvbm5lY3QsICJIRUxPICRIVFRQX0hPU1RcclxuIik7CgkgICAgJG91dCA9IGZnZXRzKCAkY29ubmVjdCwgMTAyNCApOwoJICAgIGZwdXRzKCAkY29ubmVjdCwgIk1BSUwgRlJPTSA8eyRlbWFpbH0+XHJcbiIpOwoJICAgICRmcm9tID0gZmdldHMoICRjb25uZWN0LCAxMDI0ICk7CgkgICAgZnB1dHMoICRjb25uZWN0LCAiUkNQVCBUTzogPHskZW1haWx9PlxyXG4iKTsKCSAgICAkdG8gPSBmZ2V0cyggJGNvbm5lY3QuIDEwMjQgKTsKCSAgICBmcHV0cyggJGNvbm5lY3QsICJRVUlUXHJcbiIpOwoJICAgIGZjbG9zZSggJGNvbm5lY3QgKTsKCSAgICBpZiggIWVyZWcoICJeMjUwIiwgJGZyb20gKSB8fCAhZXJlZygiXjI1MCIsICR0bykpCgkgICAgICB7CgkJJHJlc3VsdFswXSA9IGZhbHNlOwoJCSRyZXN1bHRbMV0gPSAkdGhpcy0+TGFuZygnZXJyb3Jfc2VydmVycmVqZWN0ZWRlbWFpbCcpOwoJCXJldHVybiAkcmVzdWx0OwoJICAgICAgfQoJICAgIGVsc2UKCSAgICAgIHsKCQkkcmVzdWx0WzBdID0gZmFsc2U7CgkJJHJlc3VsdFsxXSA9ICR0aGlzLT5MYW5nKCdlcnJvcl9ub3Jlc3BvbnNlZnJvbXNlcnZlcicpOwoJCXJldHVybiAkcmVzdWx0OwoJICAgICAgfQoJICB9CgllbHNlIAoJICB7CgkgICAgJHJlc3VsdFswXSA9IGZhbHNlOwoJICAgICRyZXN1bHRbMV0gPSAkdGhpcy0+TGFuZygnZXJyb3Jfbm9yZXNwb25zZWZyb21zZXJ2ZXInKTsKCSAgICByZXR1cm4gJHJlc3VsdDsKCSAgfQogICAgICB9CiAgfQoKICAvLyB1c2VyaWQgYXBpIGZ1bmN0aW9uCiAgLy8gcmV0dXJucyB0cnVlL2ZhbHNlCiAgZnVuY3Rpb24gSXNWYWxpZFVzZXJuYW1lKCAkdXNlcm5hbWUgKQogIHsKICAgIC8vIGEgdXNlcm5hbWUgaXMgdmFsaWQsIGlmIGl0J3MgbGVuZ3RoIGlzCiAgICAvLyB3aXRoaW4gY2VydGFpbiByYW5nZXMsIGFuZCBpdCBjb250YWlucwogICAgLy8gb25seSBhbHBoYW51bWVyaWNzCiAgICAkbW9kdWxlID0gJHRoaXMtPkdldE1vZHVsZSgpOwogICAgJG1pbmxlbiA9ICRtb2R1bGUtPkdldFByZWZlcmVuY2UoJ21pbl91c2VybmFtZWxlbmd0aCcsIDQgKTsKICAgICRtYXhsZW4gPSAkbW9kdWxlLT5HZXRQcmVmZXJlbmNlKCdtYXhfdXNlcm5hbWVsZW5ndGgnLCAyMCApOwogICAgaWYoIHN0cmxlbiggJHVzZXJuYW1lICkgPCAkbWlubGVuIHx8IHN0cmxlbiggJHVzZXJuYW1lICkgPiAkbWF4bGVuICkKICAgICAgewoJcmV0dXJuIGZhbHNlOwogICAgICB9CgogICAgaWYoICFwcmVnX21hdGNoKCAnL15bYS16QS1aMC05Xy1dKiQvJywgJHVzZXJuYW1lICkgKQogICAgICB7CglyZXR1cm4gZmFsc2U7CiAgICAgIH0KCiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIAogIC8vIHVzZXJpZCBhcGkgZnVuY3Rpb24KICAvLyByZXR1cm5zIGFuIGFycmF5CiAgZnVuY3Rpb24gUmVtb3ZlVXNlckZyb21Hcm91cCggJHVpZCwgJGdpZCApCiAgewogICAgJGRiID0gJHRoaXMtPkdldERiKCk7CiAgICAkcGFybXMgPSBhcnJheSggJHVpZCApOwogICAgJHEgPSAiREVMRVRFIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX2JlbG9uZ3MKICAgICAgICAgIFdIRVJFIHVzZXJpZCA9ID8iOwogICAgaWYoICRnaWQgIT0gJycgKQogICAgICB7CgkkcSAuPSAiIEFORCBncm91cGlkID0gPyI7CglhcnJheV9wdXNoKCAkcGFybXMsICRnaWQgKTsKICAgICAgfQogICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcSwgJHBhcm1zICk7CiAgICBpZiggJGRicmVzdWx0ID09IGZhbHNlICkKICAgICAgewoJcmV0dXJuIGFycmF5KCBGQUxTRSwgJGRiLT5FcnJvck1zZygpICk7CiAgICAgIH0KICAgIGVsc2UKICAgICAgewoJcmV0dXJuIGFycmF5KCBUUlVFICk7CiAgICAgIH0KICB9CgoKICAvLyB1c2VyaWQgYXBpIGZ1bmN0aW9uCiAgLy8gcmV0dXJucyBhcnJheQogIGZ1bmN0aW9uIFNldEdyb3VwKCAkaWQsICRuYW1lLCAkZGVzYyApCiAgewogICAgaWYoICFpc3NldCggJG5hbWUgKSB8fCAkbmFtZSA9PSAnJyApCiAgICAgIHsKCSR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSAoJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkLAoJCQkJICAkdGhpcy0+TGFuZyAoJ2Vycm9yX2luc3VmZmljaWVudHBhcmFtcycpKTsKCXJldHVybjsKICAgICAgfQogICAgCiAgICAkZGIgPSAkdGhpcy0+R2V0RGIoKTsKCiAgICAkZWlkID0gJHRoaXMtPkdldEdyb3VwSUQoICRuYW1lICk7CiAgICBpZiggJGVpZCAhPSBmYWxzZSAmJiAkZWlkICE9ICRpZCApCiAgICAgIHsKCSRtb2QgPSAkdGhpcy0+R2V0TW9kdWxlKCk7CglyZXR1cm4gYXJyYXkoRkFMU0UsJG1vZC0+TGFuZygnZXJyb3JfZ3JvdXBuYW1lX2V4aXN0cycpKTsKICAgICAgfQogICAgCiAgICAkcSA9ICJVUERBVEUgIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX2dyb3VwcyBTRVQKICAgICAgICAgICAgICAgIGdyb3VwbmFtZSA9ID8sIGdyb3VwZGVzYyA9ID8gV0hFUkUgaWQgPSA/IjsKICAgICRkYnJlc3VsdCA9ICRkYi0+RXhlY3V0ZSggJHEsIGFycmF5KCAkbmFtZSwgJGRlc2MsICRpZCApICk7CiAgICBpZiggISRkYnJlc3VsdCApCiAgICAgIHsKCXJldHVybiBhcnJheShGQUxTRSwkZGItPkVycm9yTXNnKCkpOwogICAgICB9CiAgICByZXR1cm4gYXJyYXkoIFRSVUUsICcnKTsKICB9CgoKICBmdW5jdGlvbiBTZXRVc2VyUGFzc3dvcmQoICR1aWQsICRwYXNzd29yZCApCiAgewogICAgJGRiID0gJHRoaXMtPkdldERiKCk7CiAgICAkcSA9ICJVUERBVEUgIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX3VzZXJzCiAgICAgICAgICBTRVQgcGFzc3dvcmQgPSA/IFdIRVJFIGlkID0gPyI7CiAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoICRxLCBhcnJheSggbWQ1KCRwYXNzd29yZCksICR1aWQgKSk7CiAgICBpZiggISRkYnJlc3VsdCApCiAgICAgIHsKCXJldHVybiBhcnJheShGQUxTRSwkZGItPkVycm9yTXNnKCkpOwogICAgICB9CiAgICByZXR1cm4gYXJyYXkoVFJVRSwiIik7CiAgfQoKCiAgLy8gdXNlcmlkIGFwaSBmdW5jdGlvbgogIC8vIHJldHVybnMgYXJyYXkKICBmdW5jdGlvbiBTZXRVc2VyKCAkdWlkLCAkdXNlcm5hbWUsICRwYXNzd29yZCwgJGV4cGlyZXMpCiAgewogICAgJGRiID0gJHRoaXMtPkdldERiKCk7CiAgICAKICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHRoaXMgdXNlciBleGlzdHMKICAgICRyZXQgPSAkdGhpcy0+R2V0VXNlckluZm8oICR1aWQgKTsKICAgIGlmKCAkcmV0WzBdID09IEZBTFNFICkKICAgICAgewoJcmV0dXJuIGFycmF5KEZBTFNFLCAkdGhpcy0+TGFuZygnZXJyb3JfdXNlcm5vdGZvdW5kJykpOwogICAgICB9CgogICAgLy8gbWFrZSBzdXJlIHRoYXQgdGhpcyB1c2VybmFtZSBpcyBub3QgdGFrZW4gYnkgc29tZSBvdGhlciBpZAogICAgJG51aWQgPSAkdGhpcy0+R2V0VXNlcklEKCR1c2VybmFtZSk7CiAgICBpZiggJG51aWQgIT0gZmFsc2UgJiYgJG51aWQgIT0gJHVpZCApCiAgICAgIHsKCSRtb2R1bGUgPSAkdGhpcy0+R2V0TW9kdWxlKCk7CglyZXR1cm4gYXJyYXkoRkFMU0UsICRtb2R1bGUtPkxhbmcoJ2Vycm9yX3VzZXJuYW1ldGFrZW4nLCR1aWQpKTsKICAgICAgfQoKICAgICRkYnJlc3VsdCA9ICcnOwogICAgaWYoIHRyaW0oICRwYXNzd29yZCApID09ICcnICkKICAgICAgewoJLy8gdXBkYXRlIHRoZSByZWNvcmQKCSRxID0gIlVQREFURSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfdXNlcnMgU0VUCiAgICAgICAgIHVzZXJuYW1lID0gPywgZXhwaXJlcyA9ID8KICAgICAgICAgV0hFUkUgaWQgPSA/IjsKCQoJJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcSwgYXJyYXkoICR1c2VybmFtZSwgCgkJCQkJICAgICAkZGItPkRCVGltZVN0YW1wKCRleHBpcmVzKSwgJHVpZCApKTsKICAgICAgfQogICAgZWxzZSAKICAgICAgewoJLy8gdXBkYXRlIHRoZSByZWNvcmQKCSRxID0gIlVQREFURSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfdXNlcnMgU0VUCiAgICAgICAgIHVzZXJuYW1lID0gPywgcGFzc3dvcmQgPSA/LCBleHBpcmVzID0gPwogICAgICAgICBXSEVSRSBpZCA9ID8iOwoKCSRkYnJlc3VsdCA9ICRkYi0+RXhlY3V0ZSggJHEsIGFycmF5KCAkdXNlcm5hbWUsIG1kNSgkcGFzc3dvcmQpLAoJCQkJCSAgICAgJGRiLT5EQlRpbWVTdGFtcCgkZXhwaXJlcyksICR1aWQgKSk7CiAgICAgIH0KCiAgICBpZiggJGRicmVzdWx0ID09IGZhbHNlICkKICAgICAgewoJcmV0dXJuIGFycmF5KCBGQUxTRSwgJGRiLT5FcnJvck1zZygpICk7CiAgICAgIH0KICAgIHJldHVybiBhcnJheSggVFJVRSwgIiIgKTsKICB9CgogIAogIC8vIHVzZXJpZCBhcGkgZnVuY3Rpb24KICAvLyByZXR1cm5zIHRydWUvZmFsc2UKICBmdW5jdGlvbiBTZXRVc2VyR3JvdXBzKCAkdWlkLCAkZ3JwaWRzICkKICB7CiAgICAkZGIgPSAkdGhpcy0+R2V0RGIoKTsKCiAgICAvLyBmaXJzdCBtYWtlIHN1cmUgdGhpcyB1c2VyIGV4aXN0cwogICAgJHJldCA9ICR0aGlzLT5HZXRVc2VySW5mbyggJHVpZCApOwogICAgaWYoICRyZXRbMF0gPT0gRkFMU0UgKQogICAgICB7CglyZXR1cm4gYXJyYXkoRkFMU0UsICJVc2VyIGRvZXMgbm90IGV4aXN0Iik7CiAgICAgIH0KCiAgICAvLyB0aGVuIHJlbW92ZSBhbGwgaGlzIGN1cnJlbnQgYXNzaWdubWVudHMKICAgICRxID0gIkRFTEVURSBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19iZWxvbmdzIAogICAgICAgICAgV0hFUkUgdXNlcmlkID0gPyI7CiAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoICRxLCBhcnJheSggJHVpZCApKTsKICAgIGlmKCAhJGRicmVzdWx0ICkKICAgICAgewoJcmV0dXJuIGFycmF5KCBGQUxTRSwgJGRiLT5FcnJvck1zZygpICApOwogICAgICB9CgogICAgLy8gYW5kIGFkZCBhbGwgb2YgdGhlbSBpbgogICAgJHEgPSAiSU5TRVJUIElOVE8gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX2JlbG9uZ3MKICAgICAgICAgIFZBTFVFUyAoPyw/KSI7CiAgICBmb3JlYWNoKCAkZ3JwaWRzIGFzICRncnBpZCApCiAgICB7CiAgICAgICRkYnJlc3VsdCA9ICRkYi0+RXhlY3V0ZSggJHEsIGFycmF5KCAkdWlkLCAkZ3JwaWQgKSApOwogICAgICBpZiggISRkYnJlc3VsdCApCgl7CgkgIHJldHVybiBhcnJheSggRkFMU0UsICRkYi0+RXJyb3JNc2coKSAgKTsKCX0KICAgIH0KICAgIHJldHVybiBhcnJheSggVFJVRSwgIiIgKTsKICB9CgoKICAvLyB1c2VyaWQgYXBpIGZ1bmN0aW9uCiAgLy8gcmV0dXJucyB0cnVlL2ZhbHNlCiAgZnVuY3Rpb24gU2V0VXNlclByb3BlcnRpZXMoICR1aWQsICRwcm9wcyApCiAgewogICAgLy8gRGVsZXRlIGFsbCB0aGUgdXNlciBwcm9wZXJ0aWVzCiAgICAvLyBhbmQgc2V0IG5ldyBvbmVzCiAgICAkdGhpcy0+RGVsZXRlVXNlclByb3BlcnR5RnVsbCggIiIsICR1aWQsIHRydWUgKTsKCiAgICBmb3JlYWNoKCAkcHJvcHMgYXMgJHByb3AgKQogICAgewogICAgICBsaXN0KCAka2V5LCAkdmFsICkgPSBzcGxpdCgiPSIsJHByb3ApOwogICAgICAkdGhpcy0+U2V0VXNlclByb3BlcnR5KCAka2V5LCAkdmFsLCAkdWlkICk7CiAgICB9CgogICAgcmV0dXJuIHRydWU7CiAgfQoKCiAgLy8gdXNlcmlkIGFwaSBmdW5jdGlvbgogIC8vIHJldHVybnMgdHJ1ZS9mYWxzZQogIGZ1bmN0aW9uIFVzZXJFeGlzdHNCeUlEKCAkdWlkICkKICB7CiAgICAkZGF0YSA9ICR0aGlzLT5HZXRVc2VySW5mbyggJHVpZCApOwogICAgcmV0dXJuKCAkZGF0YVswXSAhPSBmYWxzZSApOwogIH0KCiAgLy8gdXNlcmlkIGFwaSBmdW5jdGlvbgogIC8vIHJldHVybnMgYW4gYXJyYXkgb3IgZmFsc2UKICBmdW5jdGlvbiBHZXRVc2VyUHJvcGVydGllcygkdWlkKQogIHsKICAgICRkYiA9ICR0aGlzLT5HZXREYigpOwogICAgJHE9IlNFTEVDVCAqIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX3Byb3BlcnRpZXMgV0hFUkUgdXNlcmlkPT8iOwogICAgJHA9YXJyYXkoJHVpZCk7CiAgICAkYXJyID0gYXJyYXkoKTsKICAgICRkYnJlc3VsdD0kZGItPkV4ZWN1dGUoJHEsJHApOwogICAgaWYoICRkYnJlc3VsdCA9PSBmYWxzZSApCiAgICAgIHsKCXJldHVybiBmYWxzZTsKICAgICAgfQogICAgd2hpbGUoICRyb3cgPSAkZGJyZXN1bHQtPkZldGNoUm93KCkgKQogICAgICB7CglhcnJheV9wdXNoKCAkYXJyLCAkcm93ICk7CiAgICAgIH0KICAgIHJldHVybiAkYXJyOwogIH0KCiAgLy8gdXNlcmlkIGFwaSBmdW5jdGlvbgogIC8vIHJldHVybnMgYW4gYXJyYXkgb2YgcmVjb3JkcyBvciBmYWxzZQogIGZ1bmN0aW9uIEdldE1lbWJlckdyb3Vwc0FycmF5KCR1c2VyaWQpIHsKICAgICRkYj0kdGhpcy0+R2V0RGIoKTsKICAgICRxPSJTRUxFQ1QgKiBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19iZWxvbmdzIFdIRVJFIHVzZXJpZD0/IjsKICAgICRkYnJlc3VsdD0kZGItPkV4ZWN1dGUoJHEsYXJyYXkoJHVzZXJpZCkpOwogICAgaWYgKCRkYnJlc3VsdCAmJiAkZGJyZXN1bHQtPlJvd0NvdW50KCkpIHsKICAgICAgJHJlc3VsdD1hcnJheSgpOzsKICAgICAgd2hpbGUgKCRyb3c9JGRicmVzdWx0LT5GZXRjaFJvdygpKSB7CglhcnJheV9wdXNoKCAkcmVzdWx0LCAkcm93ICk7CiAgICAgIH0KICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQoKICAvLwogIC8vIGVuZCBvZiByYyBmdW5jdGlvbnMKICAvLwoKICAvLyB1c2VyaWQgYXBpIGZ1bmN0aW9uCiAgZnVuY3Rpb24gR2V0VXNlclByb3BlcnR5KCR0aXRsZSwkZGVmYXVsdHZhbHVlPWZhbHNlKSAKICB7CiAgICAkdXNlcmlkPSR0aGlzLT5Mb2dnZWRJbklkKCk7CiAgICBpZiAoJHVzZXJpZD09PWZhbHNlKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gJHRoaXMtPkdldFVzZXJQcm9wZXJ0eUZ1bGwoJHRpdGxlLCR1c2VyaWQsJGRlZmF1bHR2YWx1ZSk7CiAgfQogIAogIC8vIHVzZXJpZCBhcGkgZnVuY3Rpb24KICBmdW5jdGlvbiBHZXRVc2VyUHJvcGVydHlGdWxsKCR0aXRsZSwkdXNlcmlkLCAkZGVmYXVsdHZhbHVlPWZhbHNlKSAKICB7CiAgICAkZGI9JHRoaXMtPkdldERCKCk7CiAgICAkcT0iU0VMRUNUICogRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfcHJvcGVydGllcyBXSEVSRSB0aXRsZT0/IEFORCB1c2VyaWQ9PyI7CiAgICAkcD1hcnJheSgkdGl0bGUsJHVzZXJpZCk7CiAgICAkcmVzdWx0PSRkYi0+RXhlY3V0ZSgkcSwkcCk7CiAgICBpZiAoJHJlc3VsdCAmJiAkcmVzdWx0LT5Sb3dDb3VudCgpKSB7CiAgICAgICRyb3c9JHJlc3VsdC0+RmV0Y2hSb3coKTsKICAgICAgcmV0dXJuICRyb3dbImRhdGEiXTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkZGVmYXVsdHZhbHVlOwogICAgfQogIH0KCiAgLy8gdXNlcmlkIGFwaSBmdW5jdGlvbgogIGZ1bmN0aW9uIFNldFVzZXJQcm9wZXJ0eSgkdGl0bGUsJGRhdGEpIAogIHsKICAgICR1c2VyaWQ9JHRoaXMtPkxvZ2dlZEluSWQoKTsKICAgIGlmICgkdXNlcmlkPT09ZmFsc2UpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiAkdGhpcy0+U2V0VXNlclByb3BlcnR5RnVsbCgkdGl0bGUsJGRhdGEsJHVzZXJpZCk7CiAgfQoKICAvLyB1c2VyaWQgYXBpIGZ1bmN0aW9uCiAgZnVuY3Rpb24gU2V0VXNlclByb3BlcnR5RnVsbCgkdGl0bGUsJGRhdGEsJHVzZXJpZCkgCiAgewogICAgJGRiPSR0aGlzLT5HZXREQigpOwogICAgJHE9IlNFTEVDVCAqIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX3Byb3BlcnRpZXMgV0hFUkUgdGl0bGU9PyBBTkQgdXNlcmlkPT8iOwogICAgJHA9YXJyYXkoJHRpdGxlLCR1c2VyaWQpOwogICAgJHI9JGRiLT5FeGVjdXRlKCRxLCRwKTsKICAgIGlmICghJHIgfHwgKCRyLT5OdW1Sb3dzKCk9PTApKSB7CiAgICAgICRuZXdpZD0kZGItPkdlbklEKGNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfcHJvcGVydGllc19zZXEiKTsKICAgICAgJHE9IklOU0VSVCBJTlRPICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19wcm9wZXJ0aWVzIChpZCx1c2VyaWQsdGl0bGUsZGF0YSkgVkFMVUVTICg/LD8sPyw/KSI7CiAgICAgICRwPWFycmF5KCRuZXdpZCwkdXNlcmlkLCR0aXRsZSwkZGF0YSk7CiAgICAgICRyPSRkYi0+RXhlY3V0ZSgkcSwkcCk7CiAgICB9IGVsc2UgewogICAgICAkcm93PSRyLT5GZXRjaFJvdygpOwogICAgICAkcT0iVVBEQVRFICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19wcm9wZXJ0aWVzIFNFVCBkYXRhPT8gV0hFUkUgaWQ9PyI7CiAgICAgICRwPWFycmF5KCRkYXRhLCRyb3dbImlkIl0pOwogICAgICAkcj0kZGItPkV4ZWN1dGUoJHEsJHApOwogICAgfQogICAgcmV0dXJuICgkciE9ZmFsc2UpOwogIH0KCiAgLy8gZGVsZXRlIGFsbCBvY2N1cmFuY2VzIG9mIHRoZSB1c2VycHJvcGVydHkgYnkgbmFtZQogIGZ1bmN0aW9uIERlbGV0ZVVzZXJQcm9wZXJ0eUJ5TmFtZSggJHRpdGxlICkKICB7CiAgICAkZGIgPSAkdGhpcy0+R2V0REIoKTsKICAgICRxID0gIkRFTEVURSBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19wcm9wZXJ0aWVzIFdIRVJFIHRpdGxlPT8iOwogICAgJHAgPSBhcnJheSggJHRpdGxlICk7CiAgICAkcmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcSwgJHAgKTsKICAgIHJldHVybiAoJHJlc3VsdCE9ZmFsc2UpOwogIH0KCiAgLy8gdXNlcmlkIGFwaSBmdW5jdGlvbgogIGZ1bmN0aW9uIERlbGV0ZVVzZXJQcm9wZXJ0eSgkdGl0bGUsJGFsbD1mYWxzZSkgCiAgewogICAgJHVzZXJpZD0kdGhpcy0+TG9nZ2VkSW5JZCgpOwogICAgaWYgKCR1c2VyaWQ9PT1mYWxzZSkgcmV0dXJuIGZhbHNlOwogICAgJGRiPSR0aGlzLT5HZXREQigpOwogICAgJHE9IkRFTEVURSBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19wcm9wZXJ0aWVzIFdIRVJFIHVzZXJpZD0/IjsKICAgIGlmICghJGFsbCkgJHEuPSIgQU5EIHRpdGxlPT8iOwogICAgJHA9YXJyYXkoKTsKICAgIGlmICgkYWxsKSAkcD1hcnJheSgkdXNlcmlkKTsgZWxzZSAkcD1hcnJheSgkdXNlcmlkLCR0aXRsZSk7CiAgICAkcmVzdWx0PSRkYi0+RXhlY3V0ZSgkcSwkcCk7CiAgICByZXR1cm4gKCRyZXN1bHQhPWZhbHNlKTsKICB9CiAgCiAgLy8gdXNlcmlkIGFwaSBmdW5jdGlvbgogIGZ1bmN0aW9uIERlbGV0ZVVzZXJQcm9wZXJ0eUZ1bGwoJHRpdGxlLCR1c2VyaWQsJGFsbD1mYWxzZSkgCiAgewogICAgJGRiPSR0aGlzLT5HZXREQigpOwogICAgJHE9IkRFTEVURSBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19wcm9wZXJ0aWVzIFdIRVJFIHVzZXJpZD0/IjsKICAgIGlmICghJGFsbCkgJHEuPSIgQU5EIHRpdGxlPT8iOwogICAgJHA9YXJyYXkoKTsKICAgIGlmICgkYWxsKSAkcD1hcnJheSgkdXNlcmlkKTsgZWxzZSAkcD1hcnJheSgkdXNlcmlkLCR0aXRsZSk7CiAgICAkcmVzdWx0PSRkYi0+RXhlY3V0ZSgkcSwkcCk7CiAgICByZXR1cm4gKCRyZXN1bHQhPWZhbHNlKTsKICB9CgogIC8vIHVzZXJpZCBhcGkgZnVuY3Rpb24KICBmdW5jdGlvbiBEZWxldGVBbGxVc2VyUHJvcGVydGllcygpIAogIHsKICAgIHJldHVybiAkdGhpcy0+RGVsZXRlVXNlclByb3BlcnR5KCIiLHRydWUpOwogIH0KCiAgLy8gdXNlcmlkIGFwaSBmdW5jdGlvbgogIGZ1bmN0aW9uIERlbGV0ZUFsbFVzZXJQcm9wZXJ0aWVzRnVsbCgkdXNlcmlkKSAKICB7CiAgICByZXR1cm4gJHRoaXMtPkRlbGV0ZVVzZXJQcm9wZXJ0eUZ1bGwoIiIsJHVzZXJpZCx0cnVlKTsKICB9CgogIC8vIHVzZXJpZCBhcGkgZnVuY3Rpb24KICBmdW5jdGlvbiBDaGVja1Bhc3N3b3JkKCR1c2VybmFtZSwkcGFzc3dvcmQpIAogIHsKICAgICRkYj0kdGhpcy0+R2V0RGIoKTsKICAgICRxPSJTRUxFQ1QgKiBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc191c2VycyBXSEVSRSB1c2VybmFtZT0/IEFORCBwYXNzd29yZD0/IjsKICAgICRwPWFycmF5KCR1c2VybmFtZSxtZDUoJHBhc3N3b3JkKSk7CiAgICAkcmVzdWx0PSRkYi0+RXhlY3V0ZSgkcSwkcCk7CiAgICBpZiAoJHJlc3VsdCAmJiAkcmVzdWx0LT5Sb3dDb3VudCgpKSByZXR1cm4gdHJ1ZTsKICAgIHJldHVybiBmYWxzZTsKICB9CiAgCiAgLy8gdXNlcmlkIGFwaSBmdW5jdGlvbgogIGZ1bmN0aW9uIExvZ2dlZEluTmFtZSgpIAogIHsKICAgICR1c2VyaWQ9JHRoaXMtPkxvZ2dlZEluSWQoKTsKICAgIGlmICgkdXNlcmlkIT0iIikgcmV0dXJuICR0aGlzLT5HZXRVc2VyTmFtZSgkdXNlcmlkKTsgZWxzZSByZXR1cm4gIiI7CiAgfQoKCiAgLy8gdXNlcmlkIGFwaSBmdW5jdGlvbgogIGZ1bmN0aW9uIExvZ2dlZEluRW1haWwoKSAKICB7CiAgICAkdXNlcmlkPSR0aGlzLT5Mb2dnZWRJbklkKCk7CiAgICBpZiAoJHVzZXJpZCE9IiIpIHJldHVybiAkdGhpcy0+R2V0RW1haWwoJHVzZXJpZCk7IGVsc2UgcmV0dXJuICIiOwogIH0KCgogIC8vIHVzZXJpZCBhcGkgZnVuY3Rpb24KICBmdW5jdGlvbiBMb2dvdXQoKSAKICB7CiAgICAkZGI9JHRoaXMtPkdldERiKCk7CiAgICAkcT0iREVMRVRFIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX2xvZ2dlZGluIFdIRVJFIHNlc3Npb25pZD0/IjsKICAgICRwPWFycmF5KHNlc3Npb25faWQoKSk7CiAgICAkcmVzdWx0PSRkYi0+RXhlY3V0ZSgkcSwkcCk7CiAgfQoKICAvLyB1c2VyaWQgYXBpIGZ1bmN0aW9uCiAgZnVuY3Rpb24gTG9nb3V0VXNlcigkdWlkKSAKICB7CiAgICAkZGI9JHRoaXMtPkdldERiKCk7CiAgICAkcT0iREVMRVRFIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX2xvZ2dlZGluIFdIRVJFIHVzZXJpZD0/IjsKICAgICRwPWFycmF5KCR1aWQpOwogICAgJHJlc3VsdD0kZGItPkV4ZWN1dGUoJHEsJHApOwogIH0KCiAgLy8gdXNlcmlkIGFwaSBmdW5jdGlvbgogIGZ1bmN0aW9uIEV4cGlyZVVzZXJzKCkgCiAgewogICAgJG1vZHVsZSA9ICR0aGlzLT5HZXRNb2R1bGUoKTsKICAgICRleHBpcnl0aW1lID0gJG1vZHVsZS0+R2V0UHJlZmVyZW5jZSgndXNlcl9zZXNzaW9uX2V4cGlyZXMnKTsKICAgICRkYj0kdGhpcy0+R2V0RGIoKTsKICAgICRxPSJERUxFVEUgRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfbG9nZ2VkaW4gV0hFUkUgbGFzdHVzZWQ8PyI7CiAgICAkbW9kdWxlID0gJHRoaXMtPkdldE1vZHVsZSgpOwogICAgJHA9YXJyYXkodGltZSgpLSRleHBpcnl0aW1lKTsKICAgICRyZXN1bHQ9JGRiLT5FeGVjdXRlKCRxLCRwKTsKICB9CgogIC8vIHVzZXJpZCBhcGkgZnVuY3Rpb24KICBmdW5jdGlvbiBMb2dnZWRJbklkKCkgCiAgewogICAgaWYoIHNlc3Npb25faWQoKSA9PSAiIiApCiAgICAgIHsKCS8vIGlmIHdlIGRvbid0IGhhdmUgYSBzZXNzaW9uIGlkLCB0aGVuIHdlIGFyZW4ndCBsb2dnZWQgaW4uCglyZXR1cm4gZmFsc2U7CiAgICAgIH0KCiAgICAkZGI9JHRoaXMtPkdldERiKCk7CiAgICAkdGhpcy0+RXhwaXJlVXNlcnMoKTsKICAgICRxPSJTRUxFQ1QgKiBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19sb2dnZWRpbiBXSEVSRSBzZXNzaW9uaWQ9PyI7CiAgICAkcD1hcnJheShzZXNzaW9uX2lkKCkpOwogICAgJHJlc3VsdD0kZGItPkV4ZWN1dGUoJHEsJHApOwogICAgaWYgKCRyZXN1bHQgJiYgJHJlc3VsdC0+Um93Q291bnQoKSkgewogICAgICAkcm93PSRyZXN1bHQtPkZldGNoUm93KCk7CiAgICAgICRyZXR2YWwgPSAkcm93WyJ1c2VyaWQiXTsKCiAgICAgIC8vIG5vdyB0b3VjaCB0aGUgbGFzdHVzZWQKICAgICAgLy8gdGhpcyB3aWxsIGVuc3VyZSB0aGF0IGV2ZXJ5IHRpbWUgd2UgY2hlY2sgdGhhdCBhIHVzZXIgaXMKICAgICAgLy8gbG9nZ2VkIGluLCBpdCB0b3VjaGVzIGhpcyBsb2dnZWQgaW4gZW50cnkKICAgICAgJHEgPSAiVVBEQVRFICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19sb2dnZWRpbiBTRVQgbGFzdHVzZWQgPSA/IHdoZXJlIHNlc3Npb25pZCA9ID8iOwogICAgICAkcmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcSwgYXJyYXkoIHRpbWUoKSwgc2Vzc2lvbl9pZCgpICkgKTsKICAgICAgcmV0dXJuICRyZXR2YWw7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQoKICAvLyB1c2VyaWQgYXBpIGZ1bmN0aW9uCiAgZnVuY3Rpb24gTG9nZ2VkSW4oKSAKICB7CiAgICBpZiggISR0aGlzLT5Mb2dnZWRJbklkKCkgKSAKICAgICAgewoJcmV0dXJuIGZhbHNlOyAKICAgICAgfQogICAgZWxzZQogICAgICB7CglyZXR1cm4gdHJ1ZTsKICAgICAgfQogIH0KCiAgLy8gdXNlcmlkIGFwaSBmdW5jdGlvbgogIGZ1bmN0aW9uIE1lbWJlck9mR3JvdXAoJHVzZXJpZCwkZ3JvdXBpZCkgCiAgewogICAgJGRiPSR0aGlzLT5HZXREYigpOwogICAgJHE9IiI7CiAgICAkcT0iU0VMRUNUICogRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfYmVsb25ncyBXSEVSRSB1c2VyaWQ9PyBBTkQgZ3JvdXBpZD0/IjsKICAgIAogICAgJHBhcmFtcz1hcnJheSgkdXNlcmlkLCRncm91cGlkKTsKICAgICRyZXN1bHQ9JGRiLT5FeGVjdXRlKCRxLCRwYXJhbXMpOwogICAgaWYgKCRyZXN1bHQgJiYgJHJlc3VsdC0+Um93Q291bnQoKSkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CiAgCiAgLy8gdXNlcmlkIGFwaSBmdW5jdGlvbgogIGZ1bmN0aW9uIEdldFVzZXJOYW1lKCR1c2VyaWQpIAogIHsKICAgICRkYj0kdGhpcy0+R2V0RGIoKTsKICAgICRxPSJTRUxFQ1QgKiBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc191c2VycyBXSEVSRSBpZD0nIi4kdXNlcmlkLiInIjsKICAgIAogICAgJGRicmVzdWx0PSRkYi0+RXhlY3V0ZSgkcSk7CiAgICBpZiAoJGRicmVzdWx0ICYmICRkYnJlc3VsdC0+Um93Q291bnQoKSkgewogICAgICAkcm93PSRkYnJlc3VsdC0+RmV0Y2hSb3coKTsKICAgICAgcmV0dXJuICRyb3dbInVzZXJuYW1lIl07CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQogIAogIC8vIHVzZXJpZCBhcGkgZnVuY3Rpb24KICBmdW5jdGlvbiBHZXRFbWFpbCgkdXNlcmlkKSAKICB7CiAgICAkZGI9JHRoaXMtPkdldERiKCk7CiAgICAkcT0iIjsKICAgICRxPSJTRUxFQ1QgKiBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc191c2VycyBXSEVSRSBpZD0nIi4kdXNlcmlkLiInIjsKICAgIAogICAgJGRicmVzdWx0PSRkYi0+RXhlY3V0ZSgkcSk7CiAgICBpZiAoJGRicmVzdWx0ICYmICRkYnJlc3VsdC0+Um93Q291bnQoKSkgewogICAgICAkcm93PSRkYnJlc3VsdC0+RmV0Y2hSb3coKTsKICAgICAgcmV0dXJuICRyb3dbImVtYWlsIl07CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQogIAogIC8vIHVzZXJpZCBhcGkgZnVuY3Rpb24KICBmdW5jdGlvbiBHZXRVc2VySUQoJHVzZXJuYW1lKSAKICB7CiAgICAkZGI9JHRoaXMtPkdldERiKCk7CiAgICAkcT0iU0VMRUNUICogRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfdXNlcnMgV0hFUkUgdXNlcm5hbWU9JyIuJHVzZXJuYW1lLiInIjsKICAgICRkYnJlc3VsdD0kZGItPkV4ZWN1dGUoJHEpOwogICAgaWYgKCRkYnJlc3VsdCAmJiAkZGJyZXN1bHQtPlJvd0NvdW50KCkpIHsKICAgICAgJHJvdz0kZGJyZXN1bHQtPkZldGNoUm93KCk7CiAgICAgIHJldHVybiAkcm93WyJpZCJdOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KICAKICAvLyB1c2VyaWQgYXBpIGZ1bmN0aW9uCiAgLy8gcmV0dXJucyBhcnJheQogIGZ1bmN0aW9uIEFkZEdyb3VwKCAkbmFtZSwgJGRlc2NyaXB0aW9uICkKICB7CiAgICAkZGIgPSAkdGhpcy0+R2V0RGIoKTsKICAgIAogICAgLy8gc2VlIGlmIGl0IGV4aXN0cyBhbHJlYWR5IG9yIG5vdCAoYnkgbmFtZSkKICAgICRxID0gIlNFTEVDVCAqIEZST00gIi5jbXNfZGJfcHJlZml4KCkuCiAgICAgICJtb2R1bGVfZmV1c2Vyc19ncm91cHMgV0hFUkUgZ3JvdXBuYW1lID0gPyI7CiAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoICRxLCBhcnJheSggJG5hbWUgKSApOwogICAgaWYoICEkZGJyZXN1bHQgKQogICAgICB7CglyZXR1cm4gYXJyYXkoRkFMU0UsJGRiLT5FcnJvck1zZygpKTsKICAgICAgfQogICAgJHJvdyA9ICRkYnJlc3VsdC0+RmV0Y2hSb3coKTsKICAgIGlmKCAkcm93ICkKICAgICAgewoJcmV0dXJuIGFycmF5KEZBTFNFLCR0aGlzLT5MYW5nKCdlcnJvcl9ncm91cG5hbWVfZXhpc3RzJykpOwogICAgICB9CiAgICAKICAgICRncnBpZCA9IAogICAgICAkZGItPkdlbklEKCBjbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX2dyb3Vwc19zZXEiICk7CiAgICAkcSA9ICJJTlNFUlQgSU5UTyAiLmNtc19kYl9wcmVmaXgoKS4KICAgICAgIm1vZHVsZV9mZXVzZXJzX2dyb3VwcyBWQUxVRVMgKD8sPyw/KSI7CiAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoICRxLCBhcnJheSggJGdycGlkLCAkbmFtZSwgJGRlc2NyaXB0aW9uICkgKTsKICAgIGlmKCAhJGRicmVzdWx0ICkKICAgICAgewoJcmV0dXJuIGFycmF5KEZBTFNFLCRkYi0+RXJyb3JNc2coKSk7CiAgICAgIH0KICAgIHJldHVybiBhcnJheShUUlVFLCRncnBpZCk7CiAgfQoKCiAgLy8gdXNlcmlkIGFwaSBmdW5jdGlvbgogIC8vIHJldHVybnMgYXJyYXkKICBmdW5jdGlvbiBBZGRVc2VyKCAkbmFtZSwgJHBhc3N3b3JkLCAkZXhwaXJlcyApCiAgewogICAgJGRiID0gJHRoaXMtPkdldERiKCk7CiAgICAKICAgIC8vIHNlZSBpZiBpdCBleGlzdHMgYWxyZWFkeSBvciBub3QgKGJ5IG5hbWUpCiAgICAkcSA9ICJTRUxFQ1QgKiBGUk9NICIuY21zX2RiX3ByZWZpeCgpLgogICAgICAibW9kdWxlX2ZldXNlcnNfdXNlcnMgV0hFUkUgdXNlcm5hbWUgPSA/IjsKICAgICRkYnJlc3VsdCA9ICRkYi0+RXhlY3V0ZSggJHEsIGFycmF5KCAkbmFtZSApICk7CiAgICBpZiggISRkYnJlc3VsdCApCiAgICAgIHsKCXJldHVybiBhcnJheShGQUxTRSwkZGItPkVycm9yTXNnKCkpOwogICAgICB9CiAgICAkcm93ID0gJGRicmVzdWx0LT5GZXRjaFJvdygpOwogICAgaWYoICRyb3cgKQogICAgICB7CgkkbW9kdWxlID0gJHRoaXMtPkdldE1vZHVsZSgpOwoJcmV0dXJuIGFycmF5KEZBTFNFLCRtb2R1bGUtPkxhbmcoJ2Vycm9yX3VzZXJuYW1lX2V4aXN0cycpKTsKICAgICAgfQogICAgCiAgICAvLyBnZW5lcmF0ZSB0aGUgc2VxdWVuY2UKICAgICR1aWQgPSAKICAgICAgJGRiLT5HZW5JRCggY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc191c2Vyc19zZXEiICk7CgogICAgLy8gaW5zZXJ0IHRoZSByZWNvcmQKICAgICRxID0gIklOU0VSVCBJTlRPICIuY21zX2RiX3ByZWZpeCgpLgogICAgICAibW9kdWxlX2ZldXNlcnNfdXNlcnMgVkFMVUVTICg/LD8sPyw/LD8pIjsKICAgICRkYnJlc3VsdCA9ICRkYi0+RXhlY3V0ZSggJHEsIGFycmF5KCAkdWlkLCAkbmFtZSwgbWQ1KCRwYXNzd29yZCksIAoJCQkJCSAkZGItPkRiVGltZVN0YW1wKHRpbWUoKSksCgkJCQkJICRkYi0+RGJUaW1lU3RhbXAoJGV4cGlyZXMpICkgKTsKICAgIGlmKCAhJGRicmVzdWx0ICkKICAgICAgewoJcmV0dXJuIGFycmF5KEZBTFNFLCRkYi0+RXJyb3JNc2coKSk7CiAgICAgIH0KICAgIHJldHVybiBhcnJheShUUlVFLCR1aWQpOwogIH0KICAKICAKICAvLyB1c2VyaWQgYXBpIGZ1bmN0aW9uCiAgZnVuY3Rpb24gR2V0R3JvdXBOYW1lKCRncm91cGlkKSAKICB7CiAgICAkZGI9JHRoaXMtPkdldERiKCk7CiAgICAkcT0iU0VMRUNUICogRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfZ3JvdXBzIFdIRVJFIGlkPSciLiRncm91cGlkLiInIjsKICAgICRkYnJlc3VsdD0kZGItPkV4ZWN1dGUoJHEpOwogICAgaWYgKCRkYnJlc3VsdCAmJiAkZGJyZXN1bHQtPlJvd0NvdW50KCkpIHsKICAgICAgJHJvdz0kZGJyZXN1bHQtPkZldGNoUm93KCk7CiAgICAgIHJldHVybiAkcm93WyJncm91cG5hbWUiXTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CiAgCiAgCiAgLy8gdXNlcmlkIGFwaSBmdW5jdGlvbgogIGZ1bmN0aW9uIEdldEdyb3VwRGVzYygkZ3JvdXBpZCkgewogICAgJGRiPSR0aGlzLT5HZXREYigpOwogICAgJHE9IlNFTEVDVCAqIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX2dyb3VwcyBXSEVSRSBpZD0nIi4kZ3JvdXBpZC4iJyI7CiAgICAkZGJyZXN1bHQ9JGRiLT5FeGVjdXRlKCRxKTsKICAgIGlmICgkZGJyZXN1bHQgJiYgJGRicmVzdWx0LT5Sb3dDb3VudCgpKSB7CiAgICAgICRyb3c9JGRicmVzdWx0LT5GZXRjaFJvdygpOwogICAgICByZXR1cm4gJHJvd1siZ3JvdXBkZXNjIl07CiAgICB9IAllbHNlIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KICAKCiAgLy8gdXNlcmlkIGFwaSBmdW5jdGlvbgogIC8vIHJldHVybnMgYW4gYXJyYXkKICBmdW5jdGlvbiBEZWxldGVHcm91cEZ1bGwoICRpZCApCiAgewogICAgJGRiID0gJHRoaXMtPkdldERCKCk7CiAgICAkcmVzdWx0ID0gYXJyYXkoKTsKCiAgICAvLyBkZWxldGUgYWxsIHByb3BlcnR5IHJlbGF0aW9ucyBmcm9tIHRoaXMgZ3JvdXAKICAgICRxID0gIkRFTEVURSBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19ncm91cHByb3BtYXAgV0hFUkUgZ3JvdXBfaWQgPSA/IjsKICAgICRkYnJlc3VsdCA9ICRkYi0+RXhlY3V0ZSggJHEsIGFycmF5KCAkaWQgKSApOwogICAgaWYoICEkZGJyZXN1bHQgKQogICAgICB7CglyZXR1cm4gYXJyYXkoIEZBTFNFLCAkZGItPkVycm9yTXNnKCkgKTsKICAgICAgfQoKICAgIC8vIGRlbGV0ZSBhbGwgaW5kaWNhdGlvbiB0aGF0IGFueWJvZHkgaXMgYSBtZW1iZXIKICAgIC8vIG9mIHRoaXMgZ3JvdXAKICAgICRxID0gIkRFTEVURSBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19iZWxvbmdzIFdIRVJFIGdyb3VwaWQgPSA/IjsKICAgICRkYnJlc3VsdCA9ICRkYi0+RXhlY3V0ZSggJHEsIGFycmF5KCAkaWQgKSApOwogICAgaWYoICEkZGJyZXN1bHQgKQogICAgICB7CglyZXR1cm4gYXJyYXkoIEZBTFNFLCAkZGItPkVycm9yTXNnKCkgKTsKICAgICAgfQogICAgCiAgICAvLyBhbmQgdGhlbiBkZWxldGUgdGhlIGdyb3VwCiAgICAkcSA9ICJERUxFVEUgRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfZ3JvdXBzIFdIRVJFIGlkID0gPyI7CiAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoICRxLCBhcnJheSggJGlkICkgKTsKICAgIGlmKCAhJGRicmVzdWx0ICkKICAgICAgewoJcmV0dXJuIGFycmF5KCBGQUxTRSwgJGRiLT5FcnJvck1zZygpICk7CiAgICAgIH0KICAgIAogICAgcmV0dXJuIGFycmF5KCBUUlVFLCAnJyApOwogIH0KICAKICAKICAvLyB1c2VyaWQgYXBpIGZ1bmN0aW9uCiAgZnVuY3Rpb24gR2V0R3JvdXBMaXN0KCkKICB7CiAgICAkZGIgPSAkdGhpcy0+R2V0RGIoKTsKICAgIAogICAgJHJlc3VsdCA9IGFycmF5KCk7CiAgICAkcSA9ICJTRUxFQ1QgKiBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19ncm91cHMiOwogICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcSApOwogICAgaWYoICRkYnJlc3VsdCApIHsKICAgIHdoaWxlKCAkcm93ID0gJGRicmVzdWx0LT5GZXRjaFJvdygpICkKICAgICAgewoJJHJlc3VsdFskcm93Wydncm91cG5hbWUnXV0gPSAkcm93WydpZCddOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gJHJlc3VsdDsKICB9CiAgCgogIC8vIHVzZXJpZCBhcGkgZnVuY3Rpb24KICBmdW5jdGlvbiBHZXRHcm91cExpc3RGdWxsKCkKICB7CiAgICAkZGIgPSAkdGhpcy0+R2V0RGIoKTsKCSAgCiAgICAkcmVzdWx0ID0gYXJyYXkoKTsKICAgICRxdWVyeSA9ICJTRUxFQ1QgKiBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19ncm91cHMiOwogICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcXVlcnkgKTsKICAgIGlmKCAkZGJyZXN1bHQgKSB7CiAgICAgIHdoaWxlKCAkcm93ID0gJGRicmVzdWx0LT5GZXRjaFJvdygpICkKICAgICAgICB7CgkgIGFycmF5X3B1c2goJHJlc3VsdCwkcm93KTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gJHJlc3VsdDsKICB9CgoKICAvLyBvbGQgdXNlcmlkIGFwaSBmdW5jdGlvbgogIGZ1bmN0aW9uIEdldEdyb3VwSUQoJGdyb3VwbmFtZSkgCiAgewogICAgJGRiPSR0aGlzLT5HZXREYigpOwoKICAgICRxPSJTRUxFQ1QgKiBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19ncm91cHMgV0hFUkUgZ3JvdXBuYW1lPSciLiRncm91cG5hbWUuIiciOwogICAgJGRicmVzdWx0PSRkYi0+RXhlY3V0ZSgkcSk7CiAgICBpZiAoJGRicmVzdWx0ICYmICRkYnJlc3VsdC0+Um93Q291bnQoKSkgCiAgICAgIHsKCSRyb3c9JGRicmVzdWx0LT5GZXRjaFJvdygpOwoJcmV0dXJuICRyb3dbImlkIl07CiAgICAgIH0gCiAgICBlbHNlIAogICAgICB7CglyZXR1cm4gZmFsc2U7CiAgICAgIH0KICB9CgoKICAvLyBvbGQgdXNlcmlkIGFwaSBmdW5jdGlvbgogIGZ1bmN0aW9uIEdldE1lbWJlckdyb3VwcygkdXNlcmlkKSB7CiAgICAkZGI9JHRoaXMtPkdldERiKCk7CiAgICAkcT0iU0VMRUNUICogRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfYmVsb25ncyBXSEVSRSB1c2VyaWQ9JyIuJHVzZXJpZC4iJyI7CiAgICAkZGJyZXN1bHQ9JGRiLT5FeGVjdXRlKCRxKTsKICAgIGlmICgkZGJyZXN1bHQgJiYgJGRicmVzdWx0LT5Sb3dDb3VudCgpKSB7CiAgICAgICRyZXN1bHQ9IiI7CiAgICAgIHdoaWxlICgkcm93PSRkYnJlc3VsdC0+RmV0Y2hSb3coKSkgewoJaWYgKCRyZXN1bHQhPSIiKSB7CgkgICRyZXN1bHQuPSIsIi4kdGhpcy0+R2V0R3JvdXBOYW1lKCRyb3dbImdyb3VwaWQiXSk7Cgl9IGVsc2UgewoJICAkcmVzdWx0PSR0aGlzLT5HZXRHcm91cE5hbWUoJHJvd1siZ3JvdXBpZCJdKTsKCX0KICAgICAgfQogICAgICByZXR1cm4gJHJlc3VsdDsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAibm9uZSI7CiAgICB9CiAgfQoKCiAgLy8gb2xkIHVzZXJpZCBhcGkgZnVuY3Rpb24KICBmdW5jdGlvbiBDaGFuZ2VVc2VyKCRpZCkgCiAgewogICAgJGRiPSR0aGlzLT5HZXREYigpOwogICAgaWYgKGlzc2V0KCRfUE9TVFskaWQuInVzZXJpZCJdKSkgJHVzZXJpZD10cmltKCRfUE9TVFskaWQuInVzZXJpZCJdKTsgZWxzZSByZXR1cm4gIlVucmVjb3ZlcmFibGUgZXJyb3IiOwogICAgJHVzZXJuYW1lPXRyaW0oJF9QT1NUWyRpZC4idXNlcm5hbWUiXSk7CiAgICAkcXVlcnk9IlNFTEVDVCAqIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX3VzZXJzIFdIRVJFIHVzZXJuYW1lPSciLiR1c2VybmFtZS4iJyI7CiAgICAkcmVzdWx0PSRkYi0+RXhlY3V0ZSgkcXVlcnkpOwogICAgaWYgKCRyZXN1bHQgJiYgJHJlc3VsdC0+Um93Q291bnQoKSkgewogICAgICAkcm93PSRyZXN1bHQtPkZldGNoUm93KCk7CiAgICAgIGlmICgkcm93WyJpZCJdIT0kdXNlcmlkKSByZXR1cm4gIlVzZXJuYW1lIGFscmVhZHkgZXhpc3RzISI7CiAgICB9CiAgICAKICAgIGlmIChpc3NldCgkX1BPU1RbJGlkLiJlbWFpbCJdKSkgJGVtYWlsPXRyaW0oJF9QT1NUWyRpZC4iZW1haWwiXSk7IGVsc2UgcmV0dXJuICJFbWFpbCBhZGRyZXNzIG11c3QgYmUgcHJvdmlkZWQiOwogICAgCiAgICBpZiAoaXNzZXQoJF9QT1NUWyRpZC4icGFzc3dvcmQiXSkpICRwYXNzd29yZD10cmltKCRfUE9TVFskaWQuInBhc3N3b3JkIl0pOyBlbHNlICRwYXNzd29yZD0iIjsKICAgIGlmICgkcGFzc3dvcmQhPSIiKSB7CiAgICAgICRwYXNzd29yZDI9dHJpbSgkX1BPU1RbJGlkLiJwYXNzd29yZDIiXSk7CiAgICAgIGlmICgkcGFzc3dvcmQhPSRwYXNzd29yZDIpIHJldHVybiAiUGFzc3dvcmRzIGRvIG5vdCBtYXRjaCEiOwogICAgICAkcXVlcnk9IlVQREFURSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfdXNlcnMgU0VUIHVzZXJuYW1lPT8sU0VUIHBhc3N3b3JkPT8sZW1haWw9PyBXSEVSRSBpZD0/IjsKICAgICAgJHBhcmFtcz1hcnJheSgkdXNlcm5hbWUsbWQ1KCRwYXNzd29yZCksJGVtYWlsLCR1c2VyaWQpOwogICAgICAkZGJyZXN1bHQ9JGRiLT5FeGVjdXRlKCRxdWVyeSwkcGFyYW1zKTsKICAgIH0gZWxzZSB7CiAgICAgICRxdWVyeT0iVVBEQVRFICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc191c2VycyBTRVQgdXNlcm5hbWU9PyxlbWFpbD0/IFdIRVJFIGlkPT8iOwogICAgICAkcGFyYW1zPWFycmF5KCR1c2VybmFtZSwkZW1haWwsJHVzZXJpZCk7CiAgICAgICRkYnJlc3VsdD0kZGItPkV4ZWN1dGUoJHF1ZXJ5LCRwYXJhbXMpOwogICAgfQogICAgCiAgICAkcT0iU0VMRUNUICogRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfZ3JvdXBzIjsKICAgICRkYnJlc3VsdD0kZGItPkV4ZWN1dGUoJHEpOwogICAgaWYgKCRkYnJlc3VsdCAmJiAkZGJyZXN1bHQtPlJvd0NvdW50KCkpIHsKICAgICAgd2hpbGUgKCRyb3c9JGRicmVzdWx0LT5GZXRjaFJvdygpKSB7CgkvL0ZpcnN0IHJlc2V0IHRoZSBhc3NvY2lvYXRpb25zCgkkcT0iREVMRVRFIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX2JlbG9uZ3MgV0hFUkUgdXNlcmlkPT8gQU5EIGdyb3VwaWQ9PyI7CgkkcGFyYW1zMT1hcnJheSgkdXNlcmlkLCRyb3dbImlkIl0pOwoJJGRicmVzdWx0Mj0kZGItPkV4ZWN1dGUoJHEsJHBhcmFtczEpOwoJZWNobyAkZGItPkVycm9yTXNnKCk7CgkvL1RoZW4gY3JlYXRlIGEgbmV3IG9uZSBpZiBpdCB3YXMgc2VsZWN0ZWQKCWlmICgkX1BPU1RbJGlkLiJncm91cCIuJHJvd1siaWQiXV09PSJ5ZXMiKSB7CgkgIC8vQ3JlYXRlIGFuIGFzc29jaWF0aW9uCgkgICRxPSJJTlNFUlQgSU5UTyAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfYmVsb25ncyAodXNlcmlkLGdyb3VwaWQpIFZBTFVFUyAoPyw/KSI7CgkgICRwYXJhbXMyPWFycmF5KCR1c2VyaWQsJHJvd1siaWQiXSk7CgkgICRkYnJlc3VsdDI9JGRiLT5FeGVjdXRlKCRxLCRwYXJhbXMyKTsKCX0KICAgICAgfQogICAgfQogIH0KCQoKICAvLyBvbGQgdXNlcmlkIGFwaSBmdW5jdGlvbgogIGZ1bmN0aW9uIERlbGV0ZVVzZXIoJGlkKSAKICB7CiAgICAkZGI9JHRoaXMtPkdldERiKCk7CiAgICBpZiAoaXNzZXQoJF9HRVRbJGlkLiJ1c2VyaWQiXSkpICR1c2VyaWQ9JF9HRVRbJGlkLiJ1c2VyaWQiXTsgZWxzZSByZXR1cm47CiAgICAkcT0iREVMRVRFIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX3VzZXJzIFdIRVJFIGlkPSckdXNlcmlkJyI7CiAgICAkZGJyZXN1bHQ9JGRiLT5FeGVjdXRlKCRxKTsKICAgICRxPSJERUxFVEUgRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfYmVsb25ncyBXSEVSRSB1c2VyaWQ9JyR1c2VyaWQnIjsKICAgICRkYnJlc3VsdD0kZGItPkV4ZWN1dGUoJHEpOwogIH0KCn0gLy8gY2xhc3MKCj8+Cg==]]></data>
  </file>
  <file>
    <filename>/FrontEndUsers.module.php</filename>
    <isdir>0</isdir>
    <data><![CDATA[PD9waHAKLyoKIEZyb250RW5kVXNlcnMuIEEgcGx1Z2luIGZvciBDTVMgLSBDTVMgTWFkZSBTaW1wbGUKIENvcHlyaWdodCAoYykgMjAwNC0wNSBieSBNb3J0ZW4gUG91bHNlbiA8bW9ydGVuQHBvdWxzZW4ub3JnPgoKIFRyYW5zbGF0aW9uczoKIEZyZW5jaDogUGF0cmljaWEgQnJ1biwgaHR0cDovL3d3dy5icnVtYWxzb2xzdGljZS5jb20KIE5vcndlZ2lhbiAoYm9rbT9sKTogUm9nZXIgIlN0aWdtYSIgS251dHNlbiA8c3RpZ21hc3RlckBnbWFpbC5jb20+CgogQ01TLSBDTVMgTWFkZSBTaW1wbGUgaXMgQ29weXJpZ2h0IChjKSBUZWQgS3VscCAod2lzaHlAdXNlcnMuc2YubmV0KQogVGhpcyBwcm9qZWN0J3MgaG9tZXBhZ2UgaXM6IGh0dHA6Ly9jbXNtYWRlc2ltcGxlLnNmLm5ldAoKIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQoqLwoKLy8gYSB2ZXJ5IGltcG9ydGFudCBsaW5lIHRoYXQgaW5jbHVkZXMgYWxsIG9mIG91ciBhcGkgZnVuY3Rpb25zCnJlcXVpcmVfb25jZSggIkZyb250RW5kVXNlcnMuYXBpLnBocCIgKTsKcmVxdWlyZV9vbmNlKCAiUmFuZG9tLnBocCIgKTsKCgpmdW5jdGlvbiBpbXBsb2RlX3dpdGhfa2V5KCRhc3NvYywgJGluZ2x1ZSA9ICc9JywgJG91dGdsdWUgPSAnJicpCnsKICAgJHJldHVybiA9IG51bGw7CiAgIGZvcmVhY2ggKCRhc3NvYyBhcyAkdGsgPT4gJHR2KSAkcmV0dXJuIC49ICRvdXRnbHVlLiR0ay4kaW5nbHVlLiR0djsKICAgcmV0dXJuIHN1YnN0cigkcmV0dXJuLHN0cmxlbigkb3V0Z2x1ZSkpOwp9CgpmdW5jdGlvbiBleHBsb2RlX3dpdGhfa2V5KCRzdHIsICRpbmdsdWU9Jz0nLCAkb3V0Z2x1ZT0nJicpCnsKICAkcmV0ID0gYXJyYXkoKTsKICAkYTEgPSBzcGxpdCgkb3V0Z2x1ZSwkc3RyKTsKICBmb3JlYWNoKCAkYTEgYXMgJGEyICkKICB7CiAgICBsaXN0KCAkaywgJHYgKSA9IHNwbGl0KCAkaW5nbHVlLCAkYTIgKTsKICAgICRyZXRbICRrIF0gPSAkdjsKICB9CiAgcmV0dXJuICRyZXQ7Cn0KCmZ1bmN0aW9uIGFycmF5X2tleV9leGlzdHNfc3Vic3RyKCAkYXJyLCAkZXhwciApCnsKICAka2V5cyA9IGFycmF5X2tleXMoICRhcnIgKTsKICBmb3JlYWNoKCAka2V5cyBhcyAkayApCiAgewogICAgaWYoIHN0cnN0ciggJGssICRleHByICkgKSByZXR1cm4gdHJ1ZTsKICB9CiAgcmV0dXJuIGZhbHNlOwp9CgpmdW5jdGlvbiBhcnJheV9maW5kX2tleV9yZWdleHAoICRhcnIsICRleHByICkKewogICRrZXlzID0gYXJyYXlfa2V5cyggJGFyciApOwogIGZvcmVhY2goICRrZXlzIGFzICRrICkKICB7CiAgICBpZiggcHJlZ19tYXRjaCggJGV4cHIsICRrICkgKSByZXR1cm4gJGs7CiAgfQogIHJldHVybiBmYWxzZTsKfQoKZnVuY3Rpb24gYXJyYXlfbWVyZ2VfYnlfbmFtZV9yZXF1aXJlZCggJGFycjEsICRhcnIyICkKewogICR4eHJlc3VsdCA9IGFycmF5KCk7CiAgLy8gYWRkIGl0ZW1zIGNvbW1vbiB0byBhcnIxIGFuZCBhcnIyIAogIC8vIGJ1dCBmYXZvciByZXF1aXJlZCBpdGVtcwogIGlmKCAhaXNfYXJyYXkoICRhcnIxICkgfHwgIWlzX2FycmF5KCAkYXJyMiApICkKICAgIHsKICAgICAgcmV0dXJuOwogICAgfQogIGZvcmVhY2goICRhcnIxIGFzICRhMSApCiAgewogICAgZm9yZWFjaCggJGFycjIgYXMgJGEyICkKICAgIHsKICAgICAgaWYoICRhMVsnbmFtZSddID09ICRhMlsnbmFtZSddICkgCgl7CgkgIGlmKCAkYTFbJ3JlcXVpcmVkJ10gPT0gMiApIAoJICAgIHsKCSAgICAgIGFycmF5X3B1c2goICR4eHJlc3VsdCwgJGExICk7CgkgICAgICBicmVhazsKCSAgICB9CgkgIGVsc2UgCgkgICAgewoJICAgICAgYXJyYXlfcHVzaCggJHh4cmVzdWx0LCAkYTIgKTsKCSAgICAgIGJyZWFrOwoJICAgIH0KCX0gICAgCiAgICB9CiAgfQogIAogIC8vIGFkZCBpdGVtcyBpbiBhcnIxIG5vdCBpbiByZXN1bHQKICBmb3JlYWNoKCAkYXJyMSBhcyAkYTEgKQogIHsKICAgICRmb3VuZCA9IGZhbHNlOwogICAgZm9yZWFjaCggJHh4cmVzdWx0IGFzICRyZXMgKQogICAgewogICAgICBpZiggJGExWyduYW1lJ10gPT0gJHJlc1snbmFtZSddICkKCXsKCSAgJGZvdW5kID0gdHJ1ZTsKCSAgYnJlYWs7Cgl9CiAgICB9CiAgICBpZiggISRmb3VuZCApCiAgICAgIHsKCWFycmF5X3B1c2goICR4eHJlc3VsdCwgJGExICk7CiAgICAgIH0KICB9CiAgCiAgLy8gYWRkIGl0ZW1zIGluIGFycjIgbm90IGluIHJlc3VsdAogIGZvcmVhY2goICRhcnIyIGFzICRhMiApCiAgewogICAgJGZvdW5kID0gZmFsc2U7CiAgICBmb3JlYWNoKCAkeHhyZXN1bHQgYXMgJHJlcyApCiAgICB7CiAgICAgIGlmKCAkYTJbJ25hbWUnXSA9PSAkcmVzWyduYW1lJ10gKQoJewoJICAkZm91bmQgPSB0cnVlOwoJICBicmVhazsKCX0KICAgIH0KICAgIGlmKCAhJGZvdW5kICkKICAgICAgewoJYXJyYXlfcHVzaCggJHh4cmVzdWx0LCAkYTIgKTsKICAgICAgfQogIH0KICByZXR1cm4gJHh4cmVzdWx0Owp9CgoKZnVuY3Rpb24gY29tcGFyZV9lbGVtZW50c19ieV9zb3J0b3JkZXJfa2V5KCAkZTEsICRlMiApCnsKICBpZiggJGUxWydzb3J0X2tleSddIDwgJGUyWydzb3J0X2tleSddICkKICAgIHsKICAgICAgcmV0dXJuIC0xOwogICAgfQogIGVsc2UgaWYoICRlMVsnc29ydF9rZXknXSA+ICRlMlsnc29ydF9rZXknXSApCiAgICB7CiAgICAgIHJldHVybiAxOwogICAgfQogIHJldHVybiAwOwp9CgoKZnVuY3Rpb24gbXlDcmVhdGVJbnB1dENoZWNrYm94KCRpZCwgJG5hbWUsICR2YWx1ZT0nJywgJHNlbGVjdGVkdmFsdWU9JycsIAoJCQkgICAgICAgJGFkZHR0ZXh0PScnKQp7CiAgJHRleHQgPSAnPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSInLiRpZC4kbmFtZS4nIiB2YWx1ZT0iJy4kdmFsdWUuJyInOwogICRhcnIgPSBzcGxpdCgiLCIsJHNlbGVjdGVkdmFsdWUpOwogIGZvcmVhY2goICRhcnIgYXMgJGEgKQogIHsKICAgIGlmICgkYSA9PSAkdmFsdWUpCiAgICAgIHsKCSR0ZXh0IC49ICcgJyAuICdjaGVja2VkPSJjaGVja2VkIic7CiAgICAgIH0KICB9CiAgaWYgKCRhZGR0dGV4dCAhPSAnJykKICAgIHsKICAgICAgJHRleHQgLj0gJyAnLiRhZGR0dGV4dDsKICAgIH0KICAkdGV4dCAuPSAiIC8+XG4iOwogIHJldHVybiAkdGV4dDsKfQoKZnVuY3Rpb24gbXlDcmVhdGVJbnB1dFN1Ym1pdCgkaWQsICRuYW1lLCAkdmFsdWU9JycsICRpbWFnZT0nJywgJGFkZHR0ZXh0PScnKQp7CiAgZ2xvYmFsICRnQ21zOwogICR0ZXh0ID0gJzxpbnB1dCBuYW1lPSInLiRpZC4kbmFtZS4nIiB2YWx1ZT0iJy4kdmFsdWUuJyIgdHlwZT0nOwogIGlmICgkaW1hZ2UgIT0gJycpCiAgICB7CiAgICAgICR0ZXh0IC49ICciaW1hZ2UiJzsKICAgICAgJGltZyA9ICRnQ21zLT5jb25maWdbJ3Jvb3RfdXJsJ10uRElSRUNUT1JZX1NFUEFSQVRPUi4kaW1hZ2U7CiAgICAgICR0ZXh0IC49ICcgc3JjPSInLiRpbWcuJyInOwogICAgfQogIGVsc2UgCiAgICB7CiAgICAgICR0ZXh0IC49ICcic3VibWl0Iic7CiAgICB9CiAgaWYgKCRhZGR0dGV4dCAhPSAnJykKICAgIHsKICAgICAgJHRleHQgLj0gJyAnLiRhZGR0dGV4dDsKICAgIH0KICAkdGV4dCAuPSAnIC8+JzsKICByZXR1cm4gJHRleHQgLiAiXG4iOwp9CgoKZnVuY3Rpb24gbXlDcmVhdGVJbnB1dEhpZGRlbiggJGlkLCAkbmFtZSwgJHZhbHVlPScnLCAkYWRkdGV4dD0nJywgJGRlbGltPScsJykKewogIGlmKCBpc19hcnJheSggJHZhbHVlICkgKQogICAgewogICAgICAkdmFsID0gaW1wbG9kZV93aXRoX2tleSggJHZhbHVlICk7CiAgICB9CiAgZWxzZQogICAgewogICAgICAkdmFsID0gJHZhbHVlOwogICAgfQogICR2YWwgPSBzdHJfcmVwbGFjZSgnIicsICcmcXVvdDsnLCAkdmFsKTsKICAkdGV4dCA9ICc8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSInLiRpZC4kbmFtZS4nIiB2YWx1ZT0iJy4kdmFsLiciJzsKICBpZiAoJGFkZHRleHQgIT0gJycpCiAgICB7CiAgICAgICR0ZXh0IC49ICcgJy4kYWRkdGV4dDsKICAgIH0KICAkdGV4dCAuPSAiIC8+XG4iOwogIHJldHVybiAkdGV4dDsKfQoKCmZ1bmN0aW9uIGZpbmRfaW5kZXhfb2ZfdmFsdWUoICRkYXRhLCAkdmFsdWUsICRkZmx0ICkKewogICRpID0gMDsKICBmb3JlYWNoKCAkZGF0YSBhcyAkaz0+JHYgKQogIHsKICAgIGlmKCAkdiA9PSAkdmFsdWUgKQogICAgICB7CglyZXR1cm4gJGk7CiAgICAgIH0KICAgICRpKys7CiAgfQogIHJldHVybiAkZGZsdDsKfQoKCmNsYXNzIEZyb250RW5kVXNlcnMgZXh0ZW5kcyBDTVNNb2R1bGUgewoJdmFyICRkZXZkZWJ1ZyA9IDA7CiAgLyoqCiAgICogVGhlIGRlZmF1bHQgdGVtcGxhdGUgdXNlZCBmb3IgdGhlIGxvZ2luIGZvcm0KICAgKi8KICB2YXIgJGRmbHRfZm9yZ290cGFzc3dvcmR0ZW1wbGF0ZTEgPSAnCjwhLS0gZm9yZ290IHBhc3N3b3JkIHRlbXBsYXRlIC0tPgp7JHN0YXJ0Zm9ybX0KeyR0aXRsZX0Ke2lmICRtZXNzYWdlICE9IFwnXCd9CiAge2lmICRlcnJvciAhPSBcJ1wnfQogICAgPHA+PGZvbnQgY29sb3I9InJlZCI+eyRtZXNzYWdlfTwvZm9udD48L3A+CiAge2Vsc2V9CiAgICA8cD57JG1lc3NhZ2V9PC9wPgogIHsvaWZ9CnsvaWZ9CjxwPnskbG9zdHB3X21lc3NhZ2V9PC9wPgo8cD57JHByb21wdF91c2VybmFtZX0mbmJzcDt7JGlucHV0X3VzZXJuYW1lfTwvcD4KPHA+eyRoaWRkZW59eyRzdWJtaXR9Jm5ic3B7JGNhbmNlbH08L3A+CnskZW5kZm9ybX0KPCEtLSBmb3Jnb3QgcGFzc3dvcmQgdGVtcGxhdGUgLS0+IAogICc7CgogIHZhciAkZGZsdF9mb3Jnb3RwYXNzd29yZHRlbXBsYXRlMiA9ICcKPCEtLSBmb3Jnb3QgcGFzc3dvcmQgZW1haWwgdGVtcGxhdGUgLS0+CjxwPnskbWVzc2FnZV9mb3Jnb3Rwd2VtYWlsfTwvcD4KPHA+eyRwcm9tcHRfY29kZX0mbmJzcDt7JGRhdGFfY29kZX08L3A+CjxwPnskcHJvbXB0X2xpbmt9Jm5ic3A7eyRkYXRhX2xpbmt9PHA+CjwhLS0gZm9yZ290IHBhc3N3b3JkIGVtYWlsIHRlbXBsYXRlIC0tPgogICc7CgoKICB2YXIgJGRmbHRfZm9yZ290cGFzc3dvcmR0ZW1wbGF0ZTMgPSAnCjwhLS0gZm9yZ290IHBhc3N3b3JkIHZlcmlmaWNhdGlvbiB0ZW1wbGF0ZSAtLT4KeyRzdGFydGZvcm19CnskdGl0bGV9CntpZiAkbWVzc2FnZSAhPSBcJ1wnfQogIHtpZiAkZXJyb3IgIT0gXCdcJ30KICAgIDxwPjxmb250IGNvbG9yPSJyZWQiPnskbWVzc2FnZX08L2ZvbnQ+PC9wPgogIHtlbHNlfQogICAgPHA+eyRtZXNzYWdlfTwvcD4KICB7L2lmfQp7L2lmfQo8cD57JHByb21wdF91c2VybmFtZX0mbmJzcDt7JGlucHV0X3VzZXJuYW1lfTwvcD4KPHA+eyRwcm9tcHRfY29kZX0mbmJzcDt7JGlucHV0X2NvZGV9PC9wPgo8cD57JHByb21wdF9wYXNzd29yZH0mbmJzcDt7JGlucHV0X3Bhc3N3b3JkfTwvcD4KPHA+eyRwcm9tcHRfcmVwZWF0cGFzc3dvcmR9Jm5ic3A7eyRpbnB1dF9yZXBlYXRwYXNzd29yZH08L3A+CjxwPnskaGlkZGVufXskc3VibWl0fTwvcD4KeyRlbmRmb3JtfQo8IS0tIGZvcmdvdCBwYXNzd29yZCB2ZXJpZmljYXRpb24gdGVtcGxhdGUgLS0+Cic7CgogIHZhciAkZGZsdF9sb2dpbmZvcm10ZW1wbGF0ZSA9ICcKPCEtLSBMb2dpbiBmb3JtIHRlbXBsYXRlIC0tPgogPGZvbnQgc2l6ZT0iLTIiPgogeyRzdGFydGZvcm19CiB7aWYgJGVycm9yfQogIHskZXJyb3J9PGJyPgogey9pZn0KICA8cD57JHByb21wdF91c2VybmFtZX0mbmJzcDt7JGlucHV0X3VzZXJuYW1lfSZuYnNwO3skcHJvbXB0X3Bhc3N3b3JkfSZuYnNwOwogIHskaW5wdXRfcGFzc3dvcmR9Jm5ic3A7eyRpbnB1dF9zdWJtaXR9PGJyLz4KICB7JGxpbmtfZm9yZ290fQogeyRlbmRmb3JtfQogIDwvZm9udD4KPCEtLSBMb2dpbiBmb3JtIHRlbXBsYXRlIC0tPgogJzsKCiAgdmFyICRkZmx0X2xvZ291dGZvcm10ZW1wbGF0ZSA9ICcKPCEtLSBMb2dvdXQgZm9ybSB0ZW1wbGF0ZSAtLT4KIHskc3RhcnRmb3JtfQogIDxwPnskcHJvbXB0X2xvZ2dlZGlufSZuYnNwO3skdXNlcm5hbWV9PC9wPiAKICA8cD57JGxpbmtfbG9nb3V0fTwvcD4KICA8cD57JGxpbmtfY2hhbmdlc2V0dGluZ3N9PC9wPgogeyRlbmRmb3JtfQo8IS0tIExvZ291dCBmb3JtIHRlbXBsYXRlIC0tPgogJzsKCiAgdmFyICRkZmx0X2NoYW5nZXNldHRpbmdzdGVtcGxhdGUgPSAnCjwhLS0gY2hhbmdlIHNldHRpbmdzIHRlbXBsYXRlIC0tPgp7JHRpdGxlfQp7aWYgJG1lc3NhZ2UgIT0gXCdcJ30KICB7aWYgJGVycm9yICE9IFwnXCd9CiAgICA8cD48Zm9udCBjb2xvcj0icmVkIj57JG1lc3NhZ2V9PC9mb250PjwvcD4KICB7ZWxzZX0KICAgIDxwPnskbWVzc2FnZX08L3A+CiAgey9pZn0Key9pZn0KeyRzdGFydGZvcm19CiB7aWYgJGNvbnRyb2xjb3VudCA+IDB9CiAgPGNlbnRlcj4KICA8dGFibGUgd2lkdGg9Ijc1JSI+CiAgICAge2ZvcmVhY2ggZnJvbT0kY29udHJvbHMgaXRlbT1jb250cm9sfQogIDx0cj4KICAgICA8dGQ+eyRjb250cm9sLT5oaWRkZW59PGZvbnQgY29sb3I9InskY29udHJvbC0+Y29sb3J9Ij57JGNvbnRyb2wtPnByb21wdH17JGNvbnRyb2wtPm1hcmtlcn08L2ZvbnQ+PC90ZD4KICAgICA8dGQ+eyRjb250cm9sLT5jb250cm9sfXskY29udHJvbC0+YWRkdGV4dH08L3RkPgogey9mb3JlYWNofQogIDwvdGFibGU+CiAgPC9jZW50ZXI+CiB7L2lmfQogeyRoaWRkZW59eyRoaWRkZW4yfXskc3VibWl0fXskY2FuY2VsfQp7JGVuZGZvcm19CjwhLS0gY2hhbmdlIHNldHRpbmdzIHRlbXBsYXRlIC0tPgogJzsKICAvL0hvdyBtYW55IHNlY29uZHMgb2YgaW5hY3Rpdml0eSBiZWZvcmUgYSB1c2VyIGlzIGF1dG9tYXRpY2FsbHkgbG9nZ2VkIG91dC4KICB2YXIgJGV4cGlyeXRpbWU7CgogIC8vU2V0IHRoaXMgdG8gdHJ1ZSBpZiB1c2VyIHNob3VsZCBiZSByZWRpcmVjdGVkIHRvIGRlZmF1bHQgcGFnZSBhZnRlciAKICAvLyBsb2dnaW5nIGluL291dC4KICB2YXIgJGxvZ2ludGFyZ2V0OwogIHZhciAkb3RoZXJpbnRhcmdldDsKICB2YXIgJGxvZ291dHRhcmdldDsKICB2YXIgJG90aGVyb3V0dGFyZ2V0OyAgCiAgdmFyICRhbGxvd3VzZXJhZG1pbjsKICB2YXIgJGVuYWJsZWVtYWlscHc7CiAgdmFyICRsYW5nPSIiOwogIHZhciAkdXNlcm1hbmlwID0gZmFsc2U7CiAgdmFyICR0eXBlcyA9IGZhbHNlOwoKICAvLyBjb25zdHJ1Y3RvcgogIGZ1bmN0aW9uIEZyb250RW5kVXNlcnMoKQogIHsKICAgIHBhcmVudDo6Q01TTW9kdWxlKCk7CiAgICAkdGhpcy0+dXNlcm1hbmlwID0gbmV3IEZyb250RW5kVXNlcnNNYW5pcHVsYXRvciggJHRoaXMgKTsKICAgICR0aGlzLT50eXBlcyA9IGFycmF5KCAndGV4dCcgPT4gMCwKCQkJICAnY2hlY2tib3gnID0+IDEsCgkJCSAgJ2VtYWlsJyA9PiAyLAoJCQkgICd0ZXh0YXJlYScgPT4gMywKCQkJICAnZHJvcGRvd24nID0+IDQgKTsKICB9CgogIGZ1bmN0aW9uIEdlbmVyYXRlUmFuZG9tUHJpbnRhYmxlU3RyaW5nKCAkbGVuID0gMTAgKQogIHsKICAgICRvMSA9IG5ldyBSYW5kb20oIjIzNDU2Nzg5QUJDREVGR0hKS01OUFFSU1RVVldYWVoiKTsKICAgIHJldHVybiAkbzEtPmdldCgkbGVuKTsKICB9CgogIGZ1bmN0aW9uIEdldE5hbWUoKSAJewogICAgcmV0dXJuICdGcm9udEVuZFVzZXJzJzsKICB9CiAgCiAgZnVuY3Rpb24gSXNQbHVnaW5Nb2R1bGUoKSB7CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIGZ1bmN0aW9uIE1pbmltdW1DTVNWZXJzaW9uKCkKICB7CiAgICByZXR1cm4gIjAuMTEuMiI7CiAgfQogIAogIGZ1bmN0aW9uIEdldFZlcnNpb24oKQl7CiAgICByZXR1cm4gJzEuMC4wJzsKICB9CgogIGZ1bmN0aW9uIGxhbmdpZnlLZXlzKCAkYXJyICkKICB7CiAgICAkb3V0ID0gYXJyYXkoKTsKICAgIGZvcmVhY2goICRhcnIgYXMgJGs9PiR2ICkKICAgIHsKICAgICAgJGsgPSAkdGhpcy0+TGFuZygkayk7CiAgICAgICRvdXRbICRrIF0gPSAkdjsKICAgIH0KICAgIHJldHVybiAkb3V0OwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIEdldEZyaWVuZGx5TmFtZSgpCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gQ29udGVudFByZVJlbmRlcigmJGNvbnRlbnQpCiAgewogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdmZXVzZXJzX2xvZ2dlZGluJywoJHRoaXMtPkxvZ2dlZEluSWQoKSA+IDApKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignZmV1c2Vyc19sb2dnaW5uYW1lJywkdGhpcy0+TG9nZ2VkSW5OYW1lKCkpOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIEdldEZyaWVuZGx5TmFtZSgpCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gR2V0RnJpZW5kbHlOYW1lICgpCiAgewogICAgcmV0dXJuICR0aGlzLT5MYW5nKCdmcmllbmRseW5hbWUnKTsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBIYXNBZG1pbigpCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gSGFzQWRtaW4gKCkKICB7CiAgICByZXR1cm4gdHJ1ZTsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBIYXNBZG1pbigpCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gVmlzaWJsZVRvQWRtaW5Vc2VyKCkKICB7CiAgICAgcmV0dXJuICR0aGlzLT5DaGVja1Blcm1pc3Npb24oJ01vZGlmeSBTaXRlIFByZWZlcmVuY2VzJykgfHwKICAgICAgICAgICAgJHRoaXMtPkNoZWNrUGVybWlzc2lvbignTW9kaWZ5IFRlbXBsYXRlcycpIHx8CiAgICAgICAgICAgICR0aGlzLT5DaGVja1Blcm1pc3Npb24oJ0FkZCBHcm91cHMnKSB8fAogICAgICAgICAgICAkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdNb2RpZnkgR3JvdXBzJykgfHwKICAgICAgICAgICAgJHRoaXMtPkNoZWNrUGVybWlzc2lvbignUmVtb3ZlIEdyb3VwcycpIHx8CiAgICAgICAgICAgICR0aGlzLT5DaGVja1Blcm1pc3Npb24oJ0FkZCBVc2VycycpIHx8CiAgICAgICAgICAgICR0aGlzLT5DaGVja1Blcm1pc3Npb24oJ01vZGlmeSBVc2VycycpIHx8CiAgICAgICAgICAgICR0aGlzLT5DaGVja1Blcm1pc3Npb24oJ1JlbW92ZSBVc2VycycpIHx8CiAgICAgICAgICAgICR0aGlzLT5DaGVja1Blcm1pc3Npb24oJ01vZGlmeSBGcm9udEVuZFVzZXJQcm9wcycpOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgR2V0QWRtaW5TZWN0aW9uKCkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBHZXRBZG1pblNlY3Rpb24gKCkKICB7CiAgICByZXR1cm4gJ3VzZXJzZ3JvdXBzJzsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBHZXREZXBlbmRlbmNpZXMoKQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIEdldERlcGVuZGVuY2llcygpCiAgewogICAgcmV0dXJuIGFycmF5KCAnQ01TTWFpbGVyJyA9PiAnMS43My4zJyApOwogIH0KICAKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBHZXRBZG1pbkRlc2NyaXB0aW9uKCkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBHZXRBZG1pbkRlc2NyaXB0aW9uICgpCiAgewogICAgcmV0dXJuICR0aGlzLT5MYW5nICgnbW9kZGVzY3JpcHRpb24nKTsKICB9CgoKICBmdW5jdGlvbiBJbnN0YWxsKCkgewogICAgJGRiID0gJHRoaXMtPkdldERiKCk7CiAgICAkZGljdCA9IE5ld0RhdGFEaWN0aW9uYXJ5KCRkYik7CiAgICAKICAgICR0YWJvcHRhcnJheSA9IGFycmF5KCdteXNxbCcgPT4gJ1RZUEU9TXlJU0FNJyk7CiAgICAKICAgIC8vVXNlciBsaXN0CiAgICAkZmxkcyA9ICIKICAgICAgICAgICAgIGlkIEkgS0VZLAoJICAgICB1c2VybmFtZSBDKDgwKSBOT1QgTlVMTCwKICAgICAgICAgICAgIHBhc3N3b3JkIEMoMzIpIE5PVCBOVUxMLAogICAgICAgICAgICAgY3JlYXRlZGF0ZSBULAogICAgICAgICAgICAgZXhwaXJlcyBUCiAgICAgICAgICAgICI7CiAgICAkc3FsYXJyYXkgPSAkZGljdC0+Q3JlYXRlVGFibGVTUUwoY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc191c2VycyIsIAoJCQkJICAgICAgJGZsZHMsICR0YWJvcHRhcnJheSApOwogICAgJGRpY3QtPkV4ZWN1dGVTUUxBcnJheSggJHNxbGFycmF5ICk7CiAgICAkZGItPkNyZWF0ZVNlcXVlbmNlKCBjbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX3VzZXJzX3NlcSIgKTsKICAgIAogICAgLy9Hcm91cCBsaXN0CiAgICAkZmxkcyA9ICIKCSAgICAgaWQgSSBLRVksCgkgICAgIGdyb3VwbmFtZSBDKDMyKSwKCSAgICAgZ3JvdXBkZXNjIEMoMTI4KQoJICAgICI7CiAgICAkc3FsYXJyYXkgPSAkZGljdC0+Q3JlYXRlVGFibGVTUUwoY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19ncm91cHMiLAoJCQkJICAgICAgJGZsZHMsICR0YWJvcHRhcnJheSApOwogICAgJGRpY3QtPkV4ZWN1dGVTUUxBcnJheSggJHNxbGFycmF5ICk7CiAgICAkZGItPkNyZWF0ZVNlcXVlbmNlKCBjbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX2dyb3Vwc19zZXEiICk7CgogICAgLy8gbG9nZ2VkaW4KICAgICRmbGRzID0gIgoJICAgICBzZXNzaW9uaWQgQygzMiksCgkgICAgIGxhc3R1c2VkIEksCgkgICAgIHVzZXJpZCBJCgkgICAgIjsKICAgICRzcWxhcnJheSA9ICRkaWN0LT5DcmVhdGVUYWJsZVNRTChjbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX2xvZ2dlZGluIiwKCQkJCSAgICAgICRmbGRzLCAkdGFib3B0YXJyYXkgKTsKICAgICRkaWN0LT5FeGVjdXRlU1FMQXJyYXkoICRzcWxhcnJheSApOwogICAgCiAgICAvL0Nvbm5lY3Rpb25zIGJldHdlZW4gdXNlcnMgYW5kIGdyb3VwcwogICAgJGZsZHMgPSAiCgkgICAgIHVzZXJpZCBJLAoJICAgICBncm91cGlkIEkKCSAgICAiOwogICAgJHNxbGFycmF5ID0gJGRpY3QtPkNyZWF0ZVRhYmxlU1FMKGNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfYmVsb25ncyIsCgkJCQkgICAgICAkZmxkcywgJHRhYm9wdGFycmF5ICk7CiAgICAkZGljdC0+RXhlY3V0ZVNRTEFycmF5KCAkc3FsYXJyYXkgKTsKCiAgICAvL3Byb3BlcnR5IGRlZmluaXRpb24KICAgICRmbGRzID0gIgogICAgICAgICAgICAgbmFtZSAgICAgIEMoNDApIEtFWSwKICAgICAgICAgICAgIHByb21wdCAgICBDKDgwKSBOT1QgTlVMTCwKICAgICAgICAgICAgIHR5cGUgICAgICBDKDIwKSBOT1QgTlVMTCwKICAgICAgICAgICAgIGxlbmd0aCAgICBJLAogICAgICAgICAgICAgbWF4bGVuZ3RoIEkKICAgICAgICAgICAgIjsKICAgICRzcWxhcnJheSA9ICRkaWN0LT5DcmVhdGVUYWJsZVNxbChjbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX3Byb3BkZWZuIiwKCQkJCSAgICAgICRmbGRzLCAkdGFib3B0YXJyYXkgKTsKICAgICRkaWN0LT5FeGVjdXRlU1FMQXJyYXkoICRzcWxhcnJheSApOwoKICAgIC8vZHJvcGRvd24gc2VsZWN0IG9wdGlvbnMKICAgICRmbGRzID0gIgogICAgICAgICAgICAgb3JkZXJfaWQJCUksCiAgICAgICAgICAgICBvcHRpb25fbmFtZQlDKDQwKSBOT1QgTlVMTCwKICAgICAgICAgICAgIG9wdGlvbl90ZXh0CUMoODApIE5PVCBOVUxMLAogICAgICAgICAgICAgY29udHJvbF9uYW1lCUMoNDApIE5PVCBOVUxMOwogICAgICAgICAgICAiOwogICAgJHNxbGFycmF5ID0gJGRpY3QtPkNyZWF0ZVRhYmxlU3FsKGNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfZHJvcGRvd25zIiwKCQkJCSAgICAgICRmbGRzLCAkdGFib3B0YXJyYXkgKTsKICAgICRkaWN0LT5FeGVjdXRlU1FMQXJyYXkoICRzcWxhcnJheSApOwoKICAgIC8vIGdyb3VwIHByb3BlcnR5IG1hcAogICAgJGZsZHMgPSAiCiAgICAgICAgICAgICAgbmFtZSAgICBDKDQwKSBLRVksCiAgICAgICAgICAgICAgZ3JvdXBfaWQgSSBLRVksCiAgICAgICAgICAgICAgc29ydF9rZXkgSSwgCiAgICAgICAgICAgICAgcmVxdWlyZWQgSSBOT1QgTlVMTAogICAgICAgICAgICAiOwogICAgJHNxbGFycmF5ID0gJGRpY3QtPkNyZWF0ZVRhYmxlU3FsKGNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfZ3JvdXBwcm9wbWFwIiwKCQkJCSAgICAgICRmbGRzLCAkdGFib3B0YXJyYXkgKTsKICAgICRkaWN0LT5FeGVjdXRlU1FMQXJyYXkoICRzcWxhcnJheSApOwoKICAgIC8vdXNlciBwcm9wZXJ0aWVzCiAgICAkZmxkcyA9ICIKCSAgICAgaWQgSSBLRVksCgkgICAgIHVzZXJpZCBJLAoJICAgICB0aXRsZSBDKDEwMCksCgkgICAgIGRhdGEgQygyNTUpCgkgICAgIjsKICAgICRzcWxhcnJheSA9ICRkaWN0LT5DcmVhdGVUYWJsZVNRTChjbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX3Byb3BlcnRpZXMiLAoJCQkJICAgICAgJGZsZHMsICR0YWJvcHRhcnJheSApOwogICAgJGRpY3QtPkV4ZWN1dGVTUUxBcnJheSggJHNxbGFycmF5ICk7CiAgICAkZGItPkNyZWF0ZVNlcXVlbmNlKCBjbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX3Byb3BlcnRpZXNfc2VxIiApOwoKICAgIC8vIGZvcmdvdHRlbiBwYXNzd29yZCBzdHVmZgogICAgJGZsZHMgPSAiCgkgICAgIHVzZXJpZCBJIEtFWSwKICAgICAgICAgICAgIGNvZGUgQygyNSksCiAgICAgICAgICAgICBjcmVhdGVkIFQKCSAgICAiOwogICAgJHNxbGFycmF5ID0gJGRpY3QtPkNyZWF0ZVRhYmxlU1FMKGNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfdGVtcGNvZGUiLAoJCQkJICAgICAgJGZsZHMsICR0YWJvcHRhcnJheSApOwogICAgJGRpY3QtPkV4ZWN1dGVTUUxBcnJheSggJHNxbGFycmF5ICk7CgogICAgLy8gdGVtcGxhdGVzCiAgICAkdGhpcy0+U2V0VGVtcGxhdGUoJ2ZldXNlcnNfbG9naW5mb3JtJywgJHRoaXMtPmRmbHRfbG9naW5mb3JtdGVtcGxhdGUpOwogICAgJHRoaXMtPlNldFRlbXBsYXRlKCdmZXVzZXJzX2xvZ291dGZvcm0nLCAkdGhpcy0+ZGZsdF9sb2dvdXRmb3JtdGVtcGxhdGUpOwogICAgJHRoaXMtPlNldFRlbXBsYXRlKCdmZXVzZXJzX2NoYW5nZXNldHRpbmdzZm9ybScsICR0aGlzLT5kZmx0X2NoYW5nZXNldHRpbmdzdGVtcGxhdGUpOyAKICAgICR0aGlzLT5TZXRUZW1wbGF0ZSgnZmV1c2Vyc19mb3Jnb3RwYXNzd29yZGZvcm0nLCAkdGhpcy0+ZGZsdF9mb3Jnb3RwYXNzd29yZHRlbXBsYXRlMSk7CiAgICAkdGhpcy0+U2V0VGVtcGxhdGUoJ2ZldXNlcnNfZm9yZ290cGFzc3dvcmRlbWFpbGZvcm0nLCAkdGhpcy0+ZGZsdF9mb3Jnb3RwYXNzd29yZHRlbXBsYXRlMik7CiAgICAkdGhpcy0+U2V0VGVtcGxhdGUoJ2ZldXNlcnNfZm9yZ290cGFzc3dvcmR2ZXJpZnlmb3JtJywgJHRoaXMtPmRmbHRfZm9yZ290cGFzc3dvcmR0ZW1wbGF0ZTMpOwoKICAgIC8vIHByZWZlcmVuY2VzCiAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgnbWluX3Bhc3N3b3JkbGVuZ3RoJywgNik7CiAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgnbWF4X3Bhc3N3b3JkbGVuZ3RoJywgMjApOwogICAgJHRoaXMtPlNldFByZWZlcmVuY2UoJ21pbl91c2VybmFtZWxlbmd0aCcsIDQpOwogICAgJHRoaXMtPlNldFByZWZlcmVuY2UoJ21heF91c2VybmFtZWxlbmd0aCcsIDIwKTsKICAgICR0aGlzLT5TZXRQcmVmZXJlbmNlKCd1c2VyX3Nlc3Npb25fZXhwaXJlcycsIDE4MDApOwogICAgJHRoaXMtPlNldFByZWZlcmVuY2UoJ2RlZmF1bHRfZ3JvdXAnLCAtMSk7CiAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgnZG9fc210cF92YWxpZGF0ZV9lbWFpbCcsIDApOwogICAgJHRoaXMtPlNldFByZWZlcmVuY2UoJ3JlcXVpcmVkX2ZpZWxkX21hcmtlcicsICcqJyk7CiAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgncmVxdWlyZWRfZmllbGRfY29sb3InLCAnYmx1ZScpOwogICAgJHRoaXMtPlNldFByZWZlcmVuY2UoJ3JlcXVpcmVfb25lZ3JvdXAnLCAxKTsKICAgICR0aGlzLT5TZXRQcmVmZXJlbmNlKCdoaWRkZW5fZmllbGRfbWFya2VyJywgJyEnKTsKICAgICR0aGlzLT5TZXRQcmVmZXJlbmNlKCdoaWRkZW5fZmllbGRfY29sb3InLCAnZ3JlZW4nKTsKICAgICR0aGlzLT5TZXRQcmVmZXJlbmNlKCdwYWdlaWRfZm9yZ290cGFzc3dkJywgJycpOwogICAgJHRoaXMtPlNldFByZWZlcmVuY2UoJ3BhZ2VpZF9jaGFuZ2VzZXR0aW5ncycsICcnKTsKICAgICR0aGlzLT5TZXRQcmVmZXJlbmNlKCdwYWdlaWRfbG9naW4nLCcnKTsKICAgICR0aGlzLT5TZXRQcmVmZXJlbmNlKCdwYWdlaWRfbG9nb3V0JywnJyk7CgogICAgLy8gcGVybWlzc2lvbnMKICAgICR0aGlzLT5DcmVhdGVQZXJtaXNzaW9uKCdNb2RpZnkgRnJvbnRFbmRVc2VyUHJvcHMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ01vZGlmeSBGcm9udEVuZFVzZXIgUHJvcGVydGllcycpOwogIH0KCiAgCiAgZnVuY3Rpb24gSW5zdGFsbFBvc3RNZXNzYWdlKCkJewogICAgcmV0dXJuICR0aGlzLT5MYW5nKCdwb3N0aW5zdGFsbG1lc3NhZ2UnKTsKICB9CgoKICBmdW5jdGlvbiBVcGdyYWRlKCRvbGR2ZXJzaW9uLCAkbmV3dmVyc2lvbikgCiAgewogICAgc3dpdGNoKCAkb2xkdmVyc2lvbiApCiAgICAgIHsKICAgICAgICBjYXNlICcwLjEuMCc6CiAgICAgICAgY2FzZSAnMC4xLjEnOgogICAgICAgICAgewogICAgICAgICAgICAvLyBwZXJtaXNzaW9ucwogICAgICAgICAgICAkdGhpcy0+Q3JlYXRlUGVybWlzc2lvbignTW9kaWZ5IEZyb250RW5kVXNlclByb3BzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTW9kaWZ5IEZyb250RW5kVXNlciBQcm9wZXJ0aWVzJyk7CiAgICAgICAgICAgICR0aGlzLT5TZXRUZW1wbGF0ZSgnZmV1c2Vyc19mb3Jnb3RwYXNzd29yZGZvcm0nLCAkdGhpcy0+ZGZsdF9mb3Jnb3RwYXNzd29yZHRlbXBsYXRlMSk7CiAgICAgICAgICAgICR0aGlzLT5TZXRUZW1wbGF0ZSgnZmV1c2Vyc19mb3Jnb3RwYXNzd29yZGVtYWlsZm9ybScsICR0aGlzLT5kZmx0X2ZvcmdvdHBhc3N3b3JkdGVtcGxhdGUyKTsKICAgICAgICAgICAgJHRoaXMtPlNldFRlbXBsYXRlKCdmZXVzZXJzX2ZvcmdvdHBhc3N3b3JkdmVyaWZ5Zm9ybScsICR0aGlzLT5kZmx0X2ZvcmdvdHBhc3N3b3JkdGVtcGxhdGUzKTsKCiAgICAgICAgICAgIC8vIGZvcmdvdHRlbiBwYXNzd29yZCBzdHVmZgogICAgICAgICAgICAkZmxkcyA9ICIKCSAgICAgICAgICAgICB1c2VyaWQgSSBLRVksCiAgICAgICAgICAgICAgICAgICAgIGNvZGUgQygyNSksCiAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZWQgVAoJICAgICAgICAgICAgIjsKICAgICAgICAgICAgJGRiID0gJHRoaXMtPkdldERiKCk7CiAgICAgICAgICAgICRkaWN0ID0gTmV3RGF0YURpY3Rpb25hcnkoJGRiKTsKICAgICAgICAgICAgJHNxbGFycmF5ID0gJGRpY3QtPkNyZWF0ZVRhYmxlU1FMKGNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfdGVtcGNvZGUiLAoJCQkJICAgICAgICAgICAgICAkZmxkcywgJHRhYm9wdGFycmF5ICk7CiAgICAgICAgICAgICRkaWN0LT5FeGVjdXRlU1FMQXJyYXkoICRzcWxhcnJheSApOwogICAgICAgICAgICAvLyBub3RpY2Ugbm8gYnJlYWsKICAgICAgICAgIH0KCiAgICAgICAgY2FzZSAnMC4xLjInOgogICAgICAgICAgewogICAgICAgICAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgncGFnZWlkX2ZvcmdvdHBhc3N3ZCcsICcnKTsKICAgICAgICAgICAgJHRoaXMtPlNldFByZWZlcmVuY2UoJ3BhZ2VpZF9jaGFuZ2VzZXR0aW5ncycsICcnKTsKICAgICAgICAgICAgJHRoaXMtPlNldFByZWZlcmVuY2UoJ3BhZ2VpZF9sb2dpbicsJycpOwogICAgICAgICAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgncGFnZWlkX2xvZ291dCcsJycpOwogICAgICAgICAgICAvLyBub3RpY2Ugbm8gYnJlYWsKICAgICAgICAgIH0KCWNhc2UgJzAuMS4zJzoKCWNhc2UgJzAuMS40JzoKCWNhc2UgJzAuMS41JzoKCWNhc2UgJzAuMS42JzoKCSAgewoJCS8vZHJvcGRvd24gc2VsZWN0IG9wdGlvbnMKCQkkZGIgPSAkdGhpcy0+R2V0RGIoKTsKCQkkZGljdCA9IE5ld0RhdGFEaWN0aW9uYXJ5KCRkYik7CgkJJHRhYm9wdGFycmF5ID0gYXJyYXkoJ215c3FsJyA9PiAnVFlQRT1NeUlTQU0nKTsKCQkkZmxkcyA9ICIKCQkJCSBvcmRlcl9pZAkJSSwKCQkJCSBvcHRpb25fbmFtZQlDKDQwKSBOT1QgTlVMTCwKCQkJCSBvcHRpb25fdGV4dAlDKDgwKSBOT1QgTlVMTCwKCQkJCSBjb250cm9sX25hbWUJQyg0MCkgTk9UIE5VTEw7CgkJCQkiOwoJCSRzcWxhcnJheSA9ICRkaWN0LT5DcmVhdGVUYWJsZVNxbChjbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX2Ryb3Bkb3ducyIsCgkJCQkJCSAgJGZsZHMsICR0YWJvcHRhcnJheSApOwoJCSRkaWN0LT5FeGVjdXRlU1FMQXJyYXkoICRzcWxhcnJheSApOwoKICAgICAgICAgICAgICAgIC8vIGFuZCBjbGVhbnVwIHByb3BlcnR5IG5hbWVzCiAgICAgICAgICAgICAgICAkcSA9ICd1cGRhdGUgJy5jbXNfZGJfcHJlZml4KCkuJ21vZHVsZV9mZXVzZXJzX3Byb3BkZWZuIHNldCBuYW1lID0gbGNhc2UocmVwbGFjZShuYW1lLCIgIiwiXyIpKSc7CiAgICAgICAgICAgICAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoICRxICk7CgkgIH0gLy9jYXNlCgljYXNlICcwLjEuNyc6CiAgICAgICAgICB7CgkJJGRiID0gJHRoaXMtPkdldERiKCk7CgkJJGRpY3QgPSBOZXdEYXRhRGljdGlvbmFyeSgkZGIpOwogICAgICAgICAgICAgICAgJHNxbGFycmF5ID0gJGRpY3QtPkFkZGNvbHVtblNRTChjbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX3Byb3BkZWZuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1heGxlbmd0aCBJIik7CgkJJGRpY3QtPkV4ZWN1dGVTUUxBcnJheSggJHNxbGFycmF5ICk7CiAgICAgICAgICB9IC8vIGNhc2UKICAgICAgIH0gLy8gc3dpdGNoCgogIH0gLy8gdXBncmFkZQoKICAKICBmdW5jdGlvbiBVbmluc3RhbGwoKSAKICB7CiAgICAkZGIgPSAkdGhpcy0+R2V0RGIoKTsKICAgICRkaWN0ID0gTmV3RGF0YURpY3Rpb25hcnkoICRkYiApOwogICAgJHNxbGFycmF5ID0gJGRpY3QtPkRyb3BUYWJsZVNRTCggY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc191c2VycyIgKTsKICAgICRkaWN0LT5FeGVjdXRlU1FMQXJyYXkoJHNxbGFycmF5KTsKICAgICRzcWxhcnJheSA9ICRkaWN0LT5Ecm9wVGFibGVTUUwoIGNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfZ3JvdXBzIiApOwogICAgJGRpY3QtPkV4ZWN1dGVTUUxBcnJheSgkc3FsYXJyYXkpOwogICAgJHNxbGFycmF5ID0gJGRpY3QtPkRyb3BUYWJsZVNRTCggY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19sb2dnZWRpbiIgKTsKICAgICRkaWN0LT5FeGVjdXRlU1FMQXJyYXkoJHNxbGFycmF5KTsKICAgICRzcWxhcnJheSA9ICRkaWN0LT5Ecm9wVGFibGVTUUwoIGNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfYmVsb25ncyIgKTsKICAgICRkaWN0LT5FeGVjdXRlU1FMQXJyYXkoJHNxbGFycmF5KTsKICAgICRzcWxhcnJheSA9ICRkaWN0LT5Ecm9wVGFibGVTUUwoIGNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfcHJvcGVydGllcyIgKTsKICAgICRkaWN0LT5FeGVjdXRlU1FMQXJyYXkoJHNxbGFycmF5KTsKICAgICRzcWxhcnJheSA9ICRkaWN0LT5Ecm9wVGFibGVTUUwoIGNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfcHJvcGRlZm4iICk7CiAgICAkZGljdC0+RXhlY3V0ZVNRTEFycmF5KCRzcWxhcnJheSk7CiAgICAkc3FsYXJyYXkgPSAkZGljdC0+RHJvcFRhYmxlU1FMKCBjbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX2Ryb3Bkb3ducyIgKTsKICAgICRkaWN0LT5FeGVjdXRlU1FMQXJyYXkoJHNxbGFycmF5KTsKICAgICRzcWxhcnJheSA9ICRkaWN0LT5Ecm9wVGFibGVTUUwoIGNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfZ3JvdXBwcm9wbWFwIiApOwogICAgJGRpY3QtPkV4ZWN1dGVTUUxBcnJheSgkc3FsYXJyYXkpOwogICAgJHNxbGFycmF5ID0gJGRpY3QtPkRyb3BUYWJsZVNRTCggY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc190ZW1wY29kZSIgKTsKICAgICRkaWN0LT5FeGVjdXRlU1FMQXJyYXkoJHNxbGFycmF5KTsKICAgIAogICAgJGRiLT5Ecm9wU2VxdWVuY2UoIGNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfdXNlcnNfc2VxIiApOwogICAgJGRiLT5Ecm9wU2VxdWVuY2UoIGNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfZ3JvdXBzX3NlcSIgKTsKICAgICRkYi0+RHJvcFNlcXVlbmNlKCBjbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX3Byb3BlcnRpZXNfc2VxIiApOwoKICAgIC8vIHRlbXBsYXRlcwogICAgJHRoaXMtPkRlbGV0ZVRlbXBsYXRlKCdmZXVzZXJzX2xvZ2luZm9ybScpOyAKICAgICR0aGlzLT5EZWxldGVUZW1wbGF0ZSgnZmV1c2Vyc19sb2dvdXRmb3JtJyk7IAogICAgJHRoaXMtPkRlbGV0ZVRlbXBsYXRlKCdmZXVzZXJzX2NoYW5nZXNldHRpbmdzZm9ybScpOyAKICAgICR0aGlzLT5EZWxldGVUZW1wbGF0ZSgnZmV1c2Vyc19mb3Jnb3RwYXNzd29yZGZvcm0nKTsKICAgICR0aGlzLT5EZWxldGVUZW1wbGF0ZSgnZmV1c2Vyc19mb3Jnb3RwYXNzd29yZGVtYWlsZm9ybScpOwogICAgJHRoaXMtPkRlbGV0ZVRlbXBsYXRlKCdmZXVzZXJzX2ZvcmdvdHBhc3N3b3JkdmVyaWZ5Zm9ybScpOwoKICAgIC8vIHByZWZlcmVuY2VzCiAgICAkdGhpcy0+UmVtb3ZlUHJlZmVyZW5jZSgnbWluX3Bhc3N3b3JkbGVuZ3RoJyk7CiAgICAkdGhpcy0+UmVtb3ZlUHJlZmVyZW5jZSgnbWF4X3Bhc3N3b3JkbGVuZ3RoJyk7CiAgICAkdGhpcy0+UmVtb3ZlUHJlZmVyZW5jZSgnbWluX3VzZXJuYW1lbGVuZ3RoJyk7CiAgICAkdGhpcy0+UmVtb3ZlUHJlZmVyZW5jZSgnbWF4X3VzZXJuYW1lbGVuZ3RoJyk7CiAgICAkdGhpcy0+UmVtb3ZlUHJlZmVyZW5jZSgndXNlcl9zZXNzaW9uX2V4cGlyZXMnKTsKICAgICR0aGlzLT5SZW1vdmVQcmVmZXJlbmNlKCdkZWZhdWx0X2dyb3VwJyk7CiAgICAkdGhpcy0+UmVtb3ZlUHJlZmVyZW5jZSgnZG9fc210cF92YWxpZGF0ZV9lbWFpbCcpOwogICAgJHRoaXMtPlJlbW92ZVByZWZlcmVuY2UoJ3JlcXVpcmVkX2ZpZWxkX21hcmtlcicpOwogICAgJHRoaXMtPlJlbW92ZVByZWZlcmVuY2UoJ3JlcXVpcmVkX2ZpZWxkX2NvbG9yJyk7CiAgICAkdGhpcy0+UmVtb3ZlUHJlZmVyZW5jZSgncmVxdWlyZV9vbmVncm91cCcpOwogICAgJHRoaXMtPlJlbW92ZVByZWZlcmVuY2UoJ2hpZGRlbl9maWVsZF9tYXJrZXInKTsKICAgICR0aGlzLT5SZW1vdmVQcmVmZXJlbmNlKCdoaWRkZW5fZmllbGRfY29sb3InKTsKICAgICR0aGlzLT5SZW1vdmVQcmVmZXJlbmNlKCdwYWdlaWRfZm9yZ290cGFzc3dkJyk7CiAgICAkdGhpcy0+UmVtb3ZlUHJlZmVyZW5jZSgncGFnZWlkX2NoYW5nZXNldHRpbmdzJyk7CiAgICAkdGhpcy0+UmVtb3ZlUHJlZmVyZW5jZSgncGFnZWlkX2xvZ2luJyk7CiAgICAkdGhpcy0+UmVtb3ZlUHJlZmVyZW5jZSgncGFnZWlkX2xvZ291dCcpOwogICAgJHRoaXMtPlJlbW92ZVByZWZlcmVuY2UoJ2N1cnJlbnRfZ3JvdXAnKTsKICAgICR0aGlzLT5SZW1vdmVQcmVmZXJlbmNlKCdjdXJyZW50X3JlZ2V4Jyk7CiAgICAkdGhpcy0+UmVtb3ZlUHJlZmVyZW5jZSgnY3VycmVudF9saW1pdCcpOwogICAgJHRoaXMtPlJlbW92ZVByZWZlcmVuY2UoJ2N1cnJlbnRfc29ydCcpOwogICAgJHRoaXMtPlJlbW92ZVByZWZlcmVuY2UoJ2FjdGl2ZV90YWInKTsKCiAgICAvLyBwZXJtaXNzaW9ucwogICAgJHRoaXMtPlJlbW92ZVBlcm1pc3Npb24oJ01vZGlmeSBGcm9udEVuZFVzZXJQcm9wcycpOwogIH0KCiAgCiAgZnVuY3Rpb24gX0dldFVzZXJzSW5DU1ZGb3JtYXQoKQogIHsKICAgICAvLyB0aGlzIGNvdWxkIGJlIGFuIGV4cGVuc2l2ZSBmdW5jdGlvbiB0byBjYWxsCiAgICAgJGFsbHVzZXJzID0gJHRoaXMtPkdldFVzZXJzSW5Hcm91cCgpOwogICAgIGlmKCAhJGFsbHVzZXJzICkKICAgICB7CiAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQoKICAgICAkb3V0cHV0ID0gJyc7CgogICAgIC8vIGdldCBhIGxpc3Qgb2YgYWxsIG9mIHRoZSBwcm9wZXJ0eSBkZWZpbml0aW9ucwogICAgICRkZWZucyA9ICR0aGlzLT5HZXRQcm9wZXJ0eURlZm5zKCk7CgogICAgIC8vIG5vdyBpdGVyYXRlIHRocm91Z2ggYWxsIHRoZSB1c2VycwogICAgIGZvcmVhY2goICRhbGx1c2VycyBhcyAkb25ldXNlciApCiAgICAgewogICAgICAgICRvdXRwdXQgLj0gJG9uZXVzZXJbJ2lkJ10uIiwiLiRvbmV1c2VyWyd1c2VybmFtZSddLiIsIi4kb25ldXNlclsnY3JlYXRlZGF0ZSddLgogICAgICAgICAgICAgICAgICAgJG9uZXVzZXJbJ2V4cGlyZXMnXS4iLCI7CgogICAgICAgIC8vIGdldCB0aGUgdXNlciBwcm9wZXJ0aWVzCiAgICAgICAgJHVzZXJwcm9wcyA9ICR0aGlzLT5HZXRVc2VyUHJvcGVydGllcyggJG9uZXVzZXJbJ2lkJ10gKTsKCiAgICAgICAgLy8gYXMgd2Ugd2FudCBlYWNoIHJlY29yZCBpbiB0aGUgY3N2IGZpbGUgdG8gYmUgZXhhY3RseSB0aGUgc2FtZQogICAgICAgIC8vIHdlIGl0ZXJhdGUgdGhyb3VnaCB0aGUgcHJvcGVydHkgZGVmaW5pdGlvbnMsIGFuZCBzZWUgaWYgd2UgaGF2ZQogICAgICAgIC8vIHRoYXQgcHJvcGVydHkgZm9yIHRoaXMgdXNlciwgaWYgbm90LCB3ZSBlY2hvIGFuIGVtcHR5IGZpZWxkLgogICAgICAgIGZvcmVhY2goICRkZWZucyBhcyAkZGVmbiApCiAgICAgICAgewogICAgICAgICAgIC8vIHNlZSBpZiB0aGUgdXNlciBoYXMgdGhpcyBwcm9wZXJ0eQogICAgICAgICAgICRmbGQgPSAnJzsKICAgICAgICAgICBmb3JlYWNoKCAkdXNlcnByb3BzIGFzICRwcm9wICkKICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiggJHByb3BbJ3RpdGxlJ10gPT0gJGRlZm5bJ25hbWUnXSApCiAgICAgICAgICAgICAgIHsgIAogICAgICAgICAgICAgICAgIC8vIGdvdCBhIG1hdGNoCiAgICAgICAgICAgICAgICAgJGZsZCA9ICRwcm9wWydkYXRhJ107CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICB9CiAgICAgICAgICAgJG91dHB1dCAuPSAkZmxkLiIsIjsKICAgICAgICB9CgogICAgICAgIC8vIGVuZCBvZiBvbmUgcmVjb3JkCiAgICAgICAgJG91dHB1dCAuPSAiZW5kXG4iOwogICAgIH0KCiAgICAgcmV0dXJuICRvdXRwdXQ7CiAgfQoKICBmdW5jdGlvbiBfR2V0VXNlckxvZ2luRm9ybSgkaWQsJiRwYXJhbXMsJHJldHVybmlkKSAKICB7CiAgICAkdXNlcm5hbWUgPSAoaXNzZXQoJHBhcmFtc1snaW5wdXRfdXNlcm5hbWUnXSk/JHBhcmFtc1snaW5wdXRfdXNlcm5hbWUnXTonJyk7CiAgICAkcGFzc3dvcmQgPSAoaXNzZXQoJHBhcmFtc1snaW5wdXRfcGFzc3dvcmQnXSk/JHBhcmFtc1snaW5wdXRfcGFzc3dvcmQnXTonJyk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2Vycm9yJywgJHBhcmFtc1snZXJyb3InXSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3N0YXJ0Zm9ybScsIAoJCQkgICR0aGlzLT5DcmVhdGVGb3JtU3RhcnQoICRpZCwgJ2RvX2xvZ2luJywgJHJldHVybmlkICkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdwcm9tcHRfdXNlcm5hbWUnLCAkdGhpcy0+TGFuZygncHJvbXB0X3VzZXJuYW1lJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpbnB1dF91c2VybmFtZScsIAoJCQkgICR0aGlzLT5DcmVhdGVJbnB1dFRleHQoICRpZCwgJ2lucHV0X3VzZXJuYW1lJywgCgkJCQkJCSAgJGlucHV0X3VzZXJuYW1lLCAxMCwgMjApKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigncHJvbXB0X3Bhc3N3b3JkJywgJHRoaXMtPkxhbmcoJ3Byb21wdF9wYXNzd29yZCcpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignaW5wdXRfcGFzc3dvcmQnLAoJCQkgICR0aGlzLT5DcmVhdGVJbnB1dFBhc3N3b3JkKCRpZCwgJ2lucHV0X3Bhc3N3b3JkJywgCgkJCQkJCSAgICAgJGlucHV0X3Bhc3N3b3JkLCAxMCwgMjApKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignaW5wdXRfc3VibWl0JywKCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQoJGlkLCAnYnRuX2xvZ2luJywgCgkJCQkJCSAgICR0aGlzLT5MYW5nKCdsb2dpbicpKSk7CiAgICAkcGFnZSA9ICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdwYWdlaWRmb3Jnb3RwYXNzd2QnKTsKICAgIGlmKCAkcGFnZSApCiAgICB7CiAgICAgICRpZCA9IENvbnRlbnRNYW5hZ2VyOjpHZXRQYWdlSURGcm9tQWxpYXMoICRwYWdlICk7CiAgICAgIGlmKCAkaWQgPT0gZmFsc2UgKQogICAgICB7CiAgICAgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdsaW5rX2ZvcmdvdCcsJzwhLS0gRXJyb3IgY291bGQgbm90IGRldGVybWluZSBwYWdlIGZyb20gYWxpYXMvaWQgLS0+Jyk7CiAgICAgIH0KICAgICAgZWxzZSAKICAgICAgewogICAgICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignbGlua19mb3Jnb3QnLAoJCQkgICAgJHRoaXMtPkNyZWF0ZUNvbnRlbnRMaW5rKCRpZCwkdGhpcy0+TGFuZygnZm9yZ290cHcnKSkpOwogICAgICB9CiAgICB9CiAgICBlbHNlIAogICAgewogICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2xpbmtfZm9yZ290JywKCQkJICAgICR0aGlzLT5DcmVhdGVMaW5rKCRpZCwnZm9yZ290cHcnLCAkcmV0dXJuaWQsCgkJCQkJICAgICR0aGlzLT5MYW5nKCdmb3Jnb3RwdycpKSk7CiAgICB9CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2VuZGZvcm0nLCAkdGhpcy0+Q3JlYXRlRm9ybUVuZCAoKSk7CiAgICBlY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGVGcm9tRGF0YWJhc2UoJ2ZldXNlcnNfbG9naW5mb3JtJyk7CiAgfQoKCQogIGZ1bmN0aW9uIF9HZXRVc2VyTG9nb3V0Rm9ybSgkaWQsJiRwYXJhbXMsJHJldHVybmlkKSAKICB7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3Byb21wdF9sb2dnZWRpbicsCgkJCSAgJHRoaXMtPkxhbmcoJ21zZ19jdXJyZW50bHlsb2dnZWRpbmFzJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCd1c2VybmFtZScsICR0aGlzLT5Mb2dnZWRJbk5hbWUoKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2xpbmtfbG9nb3V0JywKCQkJICAkdGhpcy0+Q3JlYXRlTGluaygkaWQsImxvZ291dCIsJHJldHVybmlkLAoJCQkJCSAgICAkdGhpcy0+TGFuZygnbG9nb3V0JykpKTsKICAgICRwYWdlID0gJHRoaXMtPkdldFByZWZlcmVuY2UoJ3BhZ2VpZF9jaGFuZ2VzZXR0aW5ncycpOwogICAgaWYoICRwYWdlICkKICAgIHsKICAgICAgJGlkID0gQ29udGVudE1hbmFnZXI6OkdldFBhZ2VJREZyb21BbGlhcyggJHBhZ2UgKTsKICAgICAgaWYoICRpZCA9PSBmYWxzZSApCiAgICAgIHsKICAgICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2xpbmtfY2hhbmdlc2V0dGluZ3MnLCc8IS0tIEVycm9yIGNvdWxkIG5vdCBkZXRlcm1pbmUgcGFnZSBmcm9tIGFsaWFzL2lkIC0tPicpOwogICAgICB9CiAgICAgIGVsc2UgCiAgICAgIHsKICAgICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2xpbmtfY2hhbmdlc2V0dGluZ3MnLAogICAgICAgICAgICR0aGlzLT5DcmVhdGVDb250ZW50TGluayggJGlkLCAkdGhpcy0+TGFuZygncHJvbXB0X2NoYW5nZXNldHRpbmdzJykpKTsKICAgICAgfQogICAgfQogICAgZWxzZQogICAgewogICAgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdsaW5rX2NoYW5nZXNldHRpbmdzJywKCQkJICAkdGhpcy0+Q3JlYXRlTGluaygkaWQsImNoYW5nZXNldHRpbmdzIiwkcmV0dXJuaWQsCgkJCQkJICAgICR0aGlzLT5MYW5nKCdwcm9tcHRfY2hhbmdlc2V0dGluZ3MnKSkpOwogICAgfQogICAgZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlRnJvbURhdGFiYXNlKCdmZXVzZXJzX2xvZ291dGZvcm0nKTsKICB9CgoKICBmdW5jdGlvbiBfSGFzU3VmZmljaWVudFBlcm1pc3Npb25zKCAkcGVybSA9ICcnICkKICB7CiAgICAkcDEgPSAkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCAnQWRkIFVzZXJzJyApOwogICAgJHAyID0gJHRoaXMtPkNoZWNrUGVybWlzc2lvbiggJ01vZGlmeSBVc2VycycgKTsKICAgICRwMyA9ICR0aGlzLT5DaGVja1Blcm1pc3Npb24oICdSZW1vdmUgVXNlcnMnICk7CiAgICAkcDQgPSAkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCAnQWRkIEdyb3VwcycgKTsKICAgICRwNSA9ICR0aGlzLT5DaGVja1Blcm1pc3Npb24oICdNb2RpZnkgR3JvdXBzJyApOwogICAgJHA2ID0gJHRoaXMtPkNoZWNrUGVybWlzc2lvbiggJ01vZGlmeSBHcm91cCBBc3NpZ25tZW50cycgKTsKICAgICRwNyA9ICR0aGlzLT5DaGVja1Blcm1pc3Npb24oICdSZW1vdmUgR3JvdXBzJyApOwogICAgJHA4ID0gJHRoaXMtPkNoZWNrUGVybWlzc2lvbiggJ01vZGlmeSBTaXRlIFByZWZlcmVuY2VzJyApOwogICAgJHA5ID0gJHRoaXMtPkNoZWNrUGVybWlzc2lvbiggJ01vZGlmeSBGcm9udEVuZFVzZXJQcm9wcycgKTsKICAgICRwMTAgPSAkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCAnTW9kaWZ5IFRlbXBsYXRlcycgKTsKCiAgICAkcmV0ID0gMDsKICAgIHN3aXRjaCggJHBlcm0gKQogICAgICB7CiAgICAgIGNhc2UgJyc6ICAvLyBhbnkgcGVybWlzc2lvbgoJJHJldCA9ICgkcDEgfHwgJHAyIHx8ICRwMyB8fCAkcDQgfHwgJHA1IHx8ICRwNiB8fCAkcDcgfHwgJHA4IHx8ICRwOSB8fCAkcDEwICk7CglicmVhazsKCiAgICAgIGNhc2UgJ2FkZGdyb3VwJzoKCSRyZXQgPSAoJHA0KTsKCWJyZWFrOwoKICAgICAgY2FzZSAnYWRkdXNlcic6CgkkcmV0ID0gKCRwMSk7CglicmVhazsKCiAgICAgIGNhc2UgJ2FkZHByb3AnOgogICAgICBjYXNlICdhZGRwcm9wMic6CiAgICAgIGNhc2UgJ2VkaXRwcm9wJzoKICAgICAgY2FzZSAnZGVsZXRlcHJvcCc6CiAgICAgIGNhc2UgJ3Byb3BlcnRpZXMnOwogICAgICAgICRyZXQgPSAoJHA5KTsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgJ2xpc3R1c2Vycyc6CgkkcmV0ID0gKCRwMiB8fCAkcDMpOwoJYnJlYWs7CgogICAgICBjYXNlICdsaXN0Z3JvdXBzJzoKCSRyZXQgPSAoJHA1IHx8ICRwNik7CglicmVhazsKCiAgICAgIGNhc2UgJ2VkaXRncm91cHMnOgoJJHJldCA9ICgkcDUgfHwgJHA2KTsKCWJyZWFrOwoKICAgICAgY2FzZSAnZWRpdHVzZXJzJzoKCSRyZXQgPSAoJHAyKTsKCWJyZWFrOwogCiAgICAgIGNhc2UgJ3JlbW92ZWdyb3Vwcyc6CgkkcmV0ID0gKCRwNyk7CglicmVhazsKCiAgICAgIGNhc2UgJ3JlbW92ZXVzZXJzJzoKCSRyZXQgPSAoJHAzKTsKCWJyZWFrOwoKICAgICAgY2FzZSAnZWRpdHByZWZzJzoKICAgICAgY2FzZSAnc2l0ZXByZWZzJzoKCSRyZXQgPSAoJHA4KTsKCWJyZWFrOwoKICAgICAgY2FzZSAndXNlcnNuZ3JvdXBzJzoKICAgICAgICAkcmV0ID0gKCRwMSB8fCAkcDIgfHwgJHAzIHx8ICRwNCB8fCAkcDUgfHwgJHA2IHx8ICRwNyk7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlICd0ZW1wbGF0ZXMnOgogICAgICAgICRyZXQgPSAoJHAxMCk7CiAgICAgICAgYnJlYWs7CgogICAgICBkZWZhdWx0OgoJJHJldCA9IDA7CglicmVhazsKICAgICAgfQoKICAgIHJldHVybiAkcmV0OwogIH0KCgogIGZ1bmN0aW9uIEdldFBhZ2VJZCgkYWxpYXMpIHsJCQogICAgaWYgKCRhbGlhcz09IiIpIHJldHVybiBmYWxzZTsKICAgICRkYiA9ICR0aGlzLT5HZXREYigpOwogICAgJHF1ZXJ5ID0gIlNFTEVDVCBjb250ZW50X2lkIEZST00gIi5jbXNfZGJfcHJlZml4KCkuImNvbnRlbnQgV0hFUkUgY29udGVudF9hbGlhcyA9ICciLiRhbGlhcy4iJyI7CiAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoJHF1ZXJ5KTsKICAgIGlmICgkZGJyZXN1bHQgJiYgJGRicmVzdWx0LT5Sb3dDb3VudCgpID4gMCkJewogICAgICAkcm93ID0gJGRicmVzdWx0LT5GZXRjaFJvdygpOwogICAgICByZXR1cm4gJHJvd1snY29udGVudF9pZCddOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCgkKICBmdW5jdGlvbiBSZWRpcmVjdFRvVGFyZ2V0KCRyZXR1cm5pZCwkaW5vdXQ9ImluIikgewkJCiAgICAkZGIgPSAkdGhpcy0+R2V0RGIoKTsKICAgIGlmICgkaW5vdXQ9PSJpbiIpIHsKICAgICAgc3dpdGNoICgkdGhpcy0+bG9naW50YXJnZXQpIHsKICAgICAgY2FzZSAiZnJvbnQiIDogewoJJHF1ZXJ5ID0gIlNFTEVDVCBjb250ZW50X2lkIEZST00gIi5jbXNfZGJfcHJlZml4KCkuImNvbnRlbnQgV0hFUkUgZGVmYXVsdF9jb250ZW50ID0gMSI7CgkkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoJHF1ZXJ5KTsKCWlmICgkZGJyZXN1bHQgJiYgJGRicmVzdWx0LT5Sb3dDb3VudCgpID4gMCkJewoJICAkcm93ID0gJGRicmVzdWx0LT5GZXRjaFJvdygpOwoJICAkcmVzdWx0ID0gJHJvd1snY29udGVudF9pZCddOwoJICAkdGhpcy0+UmVkaXJlY3RDb250ZW50KCRyZXN1bHQpOwkJCQkJCQoJICBicmVhazsKCX0KCS8vZmFsbHRocm91Z2ggaW50ZW50aW9uYWwKICAgICAgfQogICAgICBjYXNlICJyZXR1cm5pZCIgOiAkdGhpcy0+UmVkaXJlY3RDb250ZW50KCRyZXR1cm5pZCk7YnJlYWs7CiAgICAgIGNhc2UgIm90aGVyIiA6IHsKCWlmICgkaWQ9JHRoaXMtPkdldFBhZ2VJZCgkdGhpcy0+b3RoZXJpbnRhcmdldCkpIHsJCQkJCQkKCSAgJHRoaXMtPlJlZGlyZWN0Q29udGVudCgkaWQpOyAKCSAgYnJlYWs7Cgl9IGVsc2UgewoJICAkdGhpcy0+UmVkaXJlY3RDb250ZW50KCRyZXR1cm5pZCk7CgkgIGJyZWFrOwoJfQogICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHN3aXRjaCAoJHRoaXMtPmxvZ291dHRhcmdldCkgewogICAgICBjYXNlICJmcm9udCIgOiB7CgkkcXVlcnkgPSAiU0VMRUNUIGNvbnRlbnRfaWQgRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4iY29udGVudCBXSEVSRSBkZWZhdWx0X2NvbnRlbnQgPSAxIjsKCSRkYnJlc3VsdCA9ICRkYi0+RXhlY3V0ZSgkcXVlcnkpOwoJaWYgKCRkYnJlc3VsdCAmJiAkZGJyZXN1bHQtPlJvd0NvdW50KCkgPiAwKQl7CgkgICRyb3cgPSAkZGJyZXN1bHQtPkZldGNoUm93KCk7CgkgICRyZXN1bHQgPSAkcm93Wydjb250ZW50X2lkJ107CgkgICR0aGlzLT5SZWRpcmVjdENvbnRlbnQoJHJlc3VsdCk7CQkJCQkJCgkgIGJyZWFrOwoJfQoJLy9mYWxsdGhyb3VnaCBpbnRlbnRpb25hbAogICAgICB9CiAgICAgIGNhc2UgInJldHVybmlkIiA6ICR0aGlzLT5SZWRpcmVjdENvbnRlbnQoJHJldHVybmlkKTticmVhazsKICAgICAgY2FzZSAib3RoZXIiIDogewoJaWYgKCRpZD0kdGhpcy0+R2V0UGFnZUlkKCR0aGlzLT5vdGhlcm91dHRhcmdldCkpIHsJCQkJCQkKCSAgJHRoaXMtPlJlZGlyZWN0Q29udGVudCgkaWQpOyAKCSAgYnJlYWs7Cgl9IGVsc2UgewoJICAkdGhpcy0+UmVkaXJlY3RDb250ZW50KCRyZXR1cm5pZCk7CgkgIGJyZWFrOwoJfQogICAgICB9CiAgICAgIH0KICAgIH0JCQogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIF9EaXNwbGF5RXJyb3JQYWdlKCRpZCwgJHBhcmFtcywgJHJldHVybmlkLCAkbWVzc2FnZSkKICAgTk9UIFBBUlQgT0YgVEhFIE1PRFVMRSBBUEkKCiAgIFRoaXMgaXMgYW4gZXhhbXBsZSBvZiBhIHNpbXBsZSBtZXRob2QgdG8gZGlzcGxheQogICBlcnJvciBpbmZvcm1hdGlvbiBvbiB0aGUgYWRtaW4gc2lkZS4KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBfRGlzcGxheUVycm9yUGFnZSgkaWQsICYkcGFyYW1zLCAkcmV0dXJuaWQsICRtZXNzYWdlPScnKQogIHsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigndGl0bGVfZXJyb3InLCAkdGhpcy0+TGFuZygnZXJyb3InKSk7CiAgICBpZiAoJG1lc3NhZ2UgIT0gJycpCiAgICAgIHsKCSR0aGlzLT5zbWFydHktPmFzc2lnbignbWVzc2FnZScsICRtZXNzYWdlKTsKICAgICAgfQogICAgICAKICAgIC8vIERpc3BsYXkgdGhlIHBvcHVsYXRlZCB0ZW1wbGF0ZQogICAgZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCdlcnJvci50cGwnKTsKICB9CgoKICBmdW5jdGlvbiBfRG9BZGRHcm91cCggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKQogIHsKICAgIC8vIGFyZSB3ZSBjYW5jZWxsaW5nCiAgICBpZiAoaXNzZXQgKCRwYXJhbXNbJ2NhbmNlbCddKSkKICAgIHsKICAgICAgJHRoaXMtPm15UmVkaXJlY3RUb1RhYigkaWQsICdncm91cHMnICk7CiAgICB9CgogICAgJGdyb3VwbmFtZSA9ICcnOwogICAgaWYoIGlzc2V0KCAkcGFyYW1zWydpbnB1dF9ncm91cG5hbWUnXSApICkKICAgICAgewoJJGdyb3VwbmFtZSA9IHRyaW0oJHBhcmFtc1snaW5wdXRfZ3JvdXBuYW1lJ10pOwogICAgICB9CiAgICAkZ3JvdXBkZXNjID0gJyc7CiAgICBpZiggaXNzZXQoICRwYXJhbXNbJ2lucHV0X2dyb3VwZGVzYyddICkgKQogICAgICB7CgkkZ3JvdXBkZXNjID0gdHJpbSgkcGFyYW1zWydpbnB1dF9ncm91cGRlc2MnXSk7CiAgICAgIH0KCiAgICAvLyBtYWtlIHN1cmUgdGhlIHBhcmFtZXRlcnMgYXJlIGZpbGxlZCBpbgogICAgaWYoICRncm91cG5hbWUgPT0gJycgfHwgJGdyb3VwZGVzYyA9PSAnJyApCiAgICAgIHsKCSRwYXJhbXNbJ2Vycm9yJ10gPSAnMSc7CgkkcGFyYW1zWydtZXNzYWdlJ10gPSAkdGhpcy0+TGFuZygnZXJyb3JfaW52YWxpZHBhcmFtcycpOwoJJHRoaXMtPm15UmVkaXJlY3QoICRpZCwgJ2FkZGdyb3VwJywgJHBhcmFtcyApOwoJcmV0dXJuOwogICAgICB9CgogICAgLy8gbWFrZSBzdXJlIHRoZSBncm91cCBuYW1lIGRvZXNuJ3QgYWxyZWFkeSBleGlzdAogICAgaWYoICR0aGlzLT5HZXRHcm91cElEKCAkZ3JvdXBuYW1lICkgIT0gZmFsc2UgKQogICAgICB7CgkkcGFyYW1zWydlcnJvciddID0gJzEnOwoJJHBhcmFtc1snbWVzc2FnZSddID0gJHRoaXMtPkxhbmcoJ2Vycm9yX2dyb3VwZXhpc3RzJyk7CgkkdGhpcy0+bXlSZWRpcmVjdCggJGlkLCAnYWRkZ3JvdXAnLCAkcGFyYW1zICk7CglyZXR1cm47CiAgICAgIH0KCiAgICAkcmVsbmFkZGVkID0gMDsKICAgIGZvcmVhY2goICRwYXJhbXMgYXMgJGtleSA9PiAkdmFsICkKICAgIHsKICAgICAgJHByb3BuYW1lID0gJyc7CiAgICAgICRzb3J0b3JkZXIgPSAnJzsKICAgICAgaWYoIHByZWdfbWF0Y2goICcvXmlucHV0X3JlcXVpcmVkXy8nLCAka2V5ICkgJiYgKCR2YWwgIT0gMCkgKQoJewoJICAkcmVsbmFkZGVkKys7Cgl9CiAgICB9CiAgICBpZiggJHJlbG5hZGRlZCA9PSAwICkKICAgICAgewoJJHBhcmFtc1snZXJyb3InXSA9ICcxJzsKCSRwYXJhbXNbJ21lc3NhZ2UnXSA9ICR0aGlzLT5MYW5nKCdlcnJvcl9ub3JlbGF0aW9ucycpOwoJJHRoaXMtPm15UmVkaXJlY3QoICRpZCwgJ2FkZGdyb3VwJywgJHBhcmFtcyApOwoJcmV0dXJuOwogICAgICB9CgogICAgLy8gd2UncmUgY2xlYXIgdG8gYWRkCiAgICAkcmV0ID0gJHRoaXMtPkFkZEdyb3VwKCAkZ3JvdXBuYW1lLCAkZ3JvdXBkZXNjICk7CiAgICBpZiggJHJldFswXSA9PSBGQUxTRSApCiAgICAgIHsKCSRwYXJhbXNbJ2Vycm9yJ10gPSAnMSc7CgkkcGFyYW1zWydtZXNzYWdlJ10gPSAkcmV0WzFdOwoJJHRoaXMtPm15UmVkaXJlY3QoICRpZCwgJ2FkZGdyb3VwJywgJHBhcmFtcyApOwoJcmV0dXJuOwogICAgICB9CgogICAgLy8gYWxzbyBhZGQgdGhlIHByb3BlcnR5IGNob2ljZXMKICAgICR0aGlzLT5EZWxldGVBbGxHcm91cFByb3BlcnR5UmVsYXRpb25zKCAkcmV0WzFdICk7CiAgICBmb3JlYWNoKCAkcGFyYW1zIGFzICRrZXkgPT4gJHZhbCApCiAgICB7CiAgICAgICRwcm9wbmFtZSA9ICcnOwogICAgICAkc29ydG9yZGVyID0gJyc7CiAgICAgIGlmKCBwcmVnX21hdGNoKCAnL15pbnB1dF9yZXF1aXJlZF8vJywgJGtleSApICkKCXsKCSAgJHByb3BuYW1lID0gc3Vic3RyKCRrZXksc3RybGVuKCdpbnB1dF9yZXF1aXJlZF8nKSk7Cgl9CiAgICAgIGlmKCBpc3NldCggJHBhcmFtc1snaW5wdXRfc29ydG9yZGVyXycuJHByb3BuYW1lXSApICkKCXsKCSAgJHNvcnRvcmRlciA9ICRwYXJhbXNbJ2lucHV0X3NvcnRvcmRlcl8nLiRwcm9wbmFtZV07Cgl9CgogICAgICBpZiggJHZhbCAhPSAwICYmICRwcm9wbmFtZSAhPSAnJykKCXsKCSAgJHRoaXMtPkFkZEdyb3VwUHJvcGVydHlSZWxhdGlvbiggJHJldFsxXSwgJHByb3BuYW1lLCAkc29ydG9yZGVyLCAkdmFsICk7Cgl9CiAgICB9CgogICAgJHRoaXMtPm15UmVkaXJlY3RUb1RhYigkaWQsICdncm91cHMnLCAkcGFyYW1zICk7IAogIH0KCgogIGZ1bmN0aW9uIF9Eb0FkZFByb3AoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICkKICB7CiAgICAvLyBhcmUgd2UgY2FuY2VsbGluZwogICAgaWYgKGlzc2V0ICgkcGFyYW1zWydjYW5jZWwnXSkpCiAgICAgIHsKCSR0aGlzLT5teVJlZGlyZWN0VG9UYWIoJGlkLCAncHJvcGVydGllcycgKTsKICAgICAgfQogICAgCiAgICAkbmFtZSA9ICcnOwogICAgaWYoIGlzc2V0KCRwYXJhbXNbJ2lucHV0X25hbWUnXSApICkgewogICAgICAkbmFtZSA9IHRyaW0oJHBhcmFtc1snaW5wdXRfbmFtZSddKTsKICAgICAgJG5hbWUgPSBzdHJ0b2xvd2VyKHByZWdfcmVwbGFjZSgnLyAvJywnXycsJG5hbWUpKTsKICAgIH0KICAgICRwcm9tcHQgPSAnJzsKICAgIGlmKCBpc3NldCgkcGFyYW1zWydpbnB1dF9wcm9tcHQnXSApICkgewogICAgICAkcHJvbXB0ID0gdHJpbSgkcGFyYW1zWydpbnB1dF9wcm9tcHQnXSk7CiAgICB9CiAgICAkdHlwZSA9ICcnOwogICAgaWYoIGlzc2V0KCRwYXJhbXNbJ2lucHV0X3R5cGUnXSkgKSB7CiAgICAgICR0eXBlID0gJHBhcmFtc1snaW5wdXRfdHlwZSddOwogICAgfQogICAgJHNlbG9wdGlvbnMgPSAnJzsKICAgICRvcHRpb25zID0gJyc7CiAgICBpZiggaXNzZXQoJHBhcmFtc1snaW5wdXRfc2Vsb3B0aW9ucyddICkgKSB7CiAgICAgICRzZWxvcHRpb25zID0gJHBhcmFtc1snaW5wdXRfc2Vsb3B0aW9ucyddOwogICAgICAkb3B0aW9ucyA9IGV4cGxvZGUoIlxuIiwgJHNlbG9wdGlvbnMpOwogICAgfQogICAgCiAgICAvLyBub3cgY2hlY2sgZXZlcnl0aGluZyBvdXQKICAgIC8vIHRvZG8sIGFkZCBhIG1heGltdW0gZmllbGQgbGVuZ3RoIHByZWZlcmVuY2UKICAgIGlmKCAkbmFtZSA9PSAnJyB8fCAkcHJvbXB0ID09ICcnICl7CiAgICAgICRwYXJhbXNbJ2Vycm9yJ10gPSAxOwogICAgICAkcGFyYW1zWydtZXNzYWdlJ10gPSAkdGhpcy0+TGFuZygnZXJyb3JfaW52YWxpZHBhcmFtcycpOwogICAgICAkdGhpcy0+bXlSZWRpcmVjdCgkaWQsJ2FkZHByb3AnLCRwYXJhbXMpOwogICAgICByZXR1cm47CiAgICB9IAoKICAgIHN3aXRjaCgkdHlwZSl7CiAgICBjYXNlIDA6CiAgICBjYXNlIDI6CiAgICAgICRsZW5ndGggPSAyMDsKICAgICAgJG1heGxlbmd0aCA9IDIwOwogICAgICBpZiggaXNzZXQoICRwYXJhbXNbJ2lucHV0X2xlbmd0aCddICkgKSB7CgkkbGVuZ3RoID0gdHJpbSgkcGFyYW1zWydpbnB1dF9sZW5ndGgnXSk7CiAgICAgIH0KICAgICAgaWYoIGlzc2V0KCAkcGFyYW1zWydpbnB1dF9tYXhsZW5ndGgnXSApICkgewoJJG1heGxlbmd0aCA9IHRyaW0oJHBhcmFtc1snaW5wdXRfbWF4bGVuZ3RoJ10pOwogICAgICB9CiAgICAgIGJyZWFrOwogICAgY2FzZSAxOgogICAgICAkbGVuZ3RoID0gMTsKICAgICAgYnJlYWs7CiAgICBjYXNlIDM6CiAgICAgICRsZW5ndGggPSAyNTU7CiAgICAgIGJyZWFrOwogICAgY2FzZSA0OgogICAgICAvLyBnZXQgdGhlIG51bWJlciBvZiBlbXB0eSB2YWx1ZXMKICAgICAgLy8gYW5kIHN1YnRyYWN0IGl0IGZyb20gdGhlIGFycmF5IGNvdW50CiAgICAgICRlbGVtZW50X2NvdW50X2FycmF5ID0gYXJyYXlfY291bnRfdmFsdWVzKCRvcHRpb25zKTsKICAgICAgJGVtcHR5X2VsZW1lbnRfY291bnQgPSAKCSRlbGVtZW50X2NvdW50X2FycmF5WyIiXSArCgkkZWxlbWVudF9jb3VudF9hcnJheVsiXHIiXSArCgkkZWxlbWVudF9jb3VudF9hcnJheVsiX18iXSArCgkkZWxlbWVudF9jb3VudF9hcnJheVsiX19cciJdOwogICAgICAkbGVuZ3RoID0gY291bnQoJG9wdGlvbnMpIC0gJGVtcHR5X2VsZW1lbnRfY291bnQ7CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgJGxlbmd0aCA9IDE7CiAgICB9CiAgICAKICAgIAogICAgaWYoICgoJHR5cGUgPT0gMCB8fCAkdHlwZSA9PSAyKSAmJiAoICRsZW5ndGggPCAxIHx8ICRsZW5ndGggPiAyNTUgKSkgfHwKCSgkdHlwZSA9PSA0ICYmICRzZWxvcHRpb25zID09ICcnICkgKXsKICAgICAgJHBhcmFtc1snZXJyb3InXSA9IDE7CiAgICAgICRwYXJhbXNbJ21lc3NhZ2UnXSA9ICR0aGlzLT5MYW5nKCdlcnJvcl9pbnZhbGlkcGFyYW1zJyk7CiAgICAgICR0aGlzLT5teVJlZGlyZWN0KCRpZCwnYWRkcHJvcDInLCRwYXJhbXMpOwogICAgICByZXR1cm47CiAgICB9CgogICAgCiAgICAvLyBBZGQgc2VsZWN0IG9wdGlvbnMKICAgIGlmICgkc2Vsb3B0aW9ucykgewogICAgICAkcmVzdWx0ID0gJHRoaXMtPkFkZFNlbGVjdE9wdGlvbnMoICRuYW1lLCAkb3B0aW9ucyApOwogICAgICBpZiggISRyZXN1bHRbMF0gKSB7CgkkcGFyYW1zWydlcnJvciddID0gMTsKCSRwYXJhbXNbJ21lc3NhZ2UnXSA9ICRyZXN1bHRbMV07CgkkdGhpcy0+bXlSZWRpcmVjdCgkaWQsJ2FkZHByb3AnLCRwYXJhbXMpOwogICAgICB9CiAgICB9CgogICAgCiAgICAvLyBhbmQgYWRkIHRoZSBwcm9wZXJ0eSBkZWZpbml0aW9uCiAgICAkcmVzdWx0ID0gJHRoaXMtPkFkZFByb3BlcnR5RGVmbiggJG5hbWUsICRwcm9tcHQsICR0eXBlLCAkbGVuZ3RoLCAkbWF4bGVuZ3RoICk7CiAgICBpZiggISRyZXN1bHRbMF0gKSB7CiAgICAgICRwYXJhbXNbJ2Vycm9yJ10gPSAxOwogICAgICAkcGFyYW1zWydtZXNzYWdlJ10gPSAkcmVzdWx0WzFdOwogICAgICAkdGhpcy0+bXlSZWRpcmVjdCgkaWQsJ2FkZHByb3AnLCRwYXJhbXMpOwogICAgfQogICAgCiAgICAkdGhpcy0+bXlSZWRpcmVjdHRvVGFiKCAkaWQsICdwcm9wZXJ0aWVzJyApOwogIH0KCgogIGZ1bmN0aW9uIF9Eb0FkZFVzZXJTdGVwMSggJGlkLCAmJHBhcmFtcywgJHJldHVybmlkICkKICB7CiAgICAvLyBhcmUgd2UgY2FuY2VsbGluZwogICAgaWYgKGlzc2V0ICgkcGFyYW1zWydjYW5jZWwnXSkpCiAgICB7CiAgICAgICR0aGlzLT5teVJlZGlyZWN0VG9UYWIoJGlkLCAndXNlcnMnICk7CiAgICB9CgogICAgLy8gbWFrZSBzdXJlIHRoZSBwYXJhbWV0ZXJzIGFyZSBmaWxsZWQgaW4KICAgICR1c2VybmFtZSA9IHRyaW0oJHBhcmFtc1snaW5wdXRfdXNlcm5hbWUnXSk7CiAgICAkcGFzc3dvcmQgPSB0cmltKCRwYXJhbXNbJ2lucHV0X3Bhc3N3b3JkJ10pOwogICAgJHJlcGVhdCAgID0gdHJpbSgkcGFyYW1zWydpbnB1dF9yZXBlYXRwYXNzd29yZCddKTsKCiAgICAkcmV0ID0gJHRoaXMtPl9oYW5kbGVVc2VySW5mb1ZhbGlkYXRpb24oICRpZCwgJHBhcmFtcywgJHJldHVybmlkLCAkbWVzc2FnZSwgdHJ1ZSApOwogICAgc3dpdGNoKCAkcmV0ICkKICAgICAgewogICAgICBjYXNlIC0xOiAvLyBlcnJvcgoJJHBhcmFtc1snZXJyb3InXSA9IDE7CgkkcGFyYW1zWydtZXNzYWdlJ10gPSAkbWVzc2FnZTsKCSR0aGlzLT5teVJlZGlyZWN0KCAkaWQsICdhZGR1c2VyJywgJHBhcmFtcyApOwoJcmV0dXJuOwoJYnJlYWs7CiAgICAgIGNhc2UgMDogIC8vIG5vIGVycm9yLCBidXQgZG9uJ3QgY29udGludWUgb3BlcmF0aW9uCgkkdGhpcy0+bXlSZWRpcmVjdCggJGlkLCAnYWRkdXNlcicsICRwYXJhbXMgKTsKCXJldHVybjsKCWJyZWFrOwogICAgICBjYXNlIDE6ICAvLyBhbGwgaXMgZ29vZCwgY29udGludWUgb3BlcmF0aW9uCglicmVhazsKICAgICAgfQoKCiAgICAvLyBjb252ZXJ0IHRoZSBleHBpcmVzIGZpZWxkIHRvIGEgcmVhbCB0aW1lCiAgICAkZXhwaXJlcyA9IE5VTEw7CgogICAgLy8gYW5kIHN0b3JlIHRoaXMgYWxsIGluIHRoZSBwYXJhbXMsIAogICAgJHBhcmFtc1snaW5wdXRfdXNlcm5hbWUnXSA9ICR1c2VybmFtZTsKICAgICRwYXJhbXNbJ2lucHV0X3Bhc3N3b3JkJ10gPSAkcGFzc3dvcmQ7CiAgICAkcGFyYW1zWydpbnB1dF9yZXBlYXRwYXNzd29yZCddID0gJHJlcGVhdDsKCiAgICAvLyBhbmQgZ28gdG8gc3RlcCAyCiAgICAkdGhpcy0+bXlSZWRpcmVjdCggJGlkLCAnZG9fYWRkdXNlcjInLCAkcGFyYW1zICk7CgovKiAgICAKIC8vIGFuZCBhZGQgdGhlIHVzZXIKICRyZXQgPSAkdGhpcy0+QWRkVXNlciggJHVzZXJuYW1lLCAkZW1haWwsICRwYXNzd29yZCwgJGV4cGlyZXMgKTsKIGlmKCAkcmV0WzBdID09IGZhbHNlICkKIHsKICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2Vycm9yJywgIjEiKTsKICAgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnbWVzc2FnZScsICRyZXRbMV0gKTsKCSR0aGlzLT5fRGlzcGxheUFkbWluQWRkVXNlclN0ZXAxUGFnZSggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKTsKCXJldHVybjsJCiAgICAgIH0KCiAgICAgICR1aWQgPSAkdGhpcy0+R2V0VXNlcklEKCR1c2VybmFtZSk7CiAgICBpZiggJHVpZCA9PSBmYWxzZSApCiAgICB7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdlcnJvcicsICIxIik7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdtZXNzYWdlJywgJHRoaXMtPkxhbmcoJ2Vycm9yX3VzZXJub3Rmb3VuZCcpICk7CgkkdGhpcy0+X0Rpc3BsYXlBZG1pbkFkZFVzZXJTdGVwMVBhZ2UoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICk7CglyZXR1cm47CQogICAgICB9CgogICAgLy8gYW5kIHRoZW4gYWRkIGhpbSB0byBoaXMgZ3JvdXBzIAogICAgaWYoIGFycmF5X2tleV9leGlzdHNfc3Vic3RyKCAkcGFyYW1zLCAnbWVtYmVyb2ZfJykgKQogICAgICB7CiAgICAgIAoJJGdycGlkcyA9IHNwbGl0KCIsIiwkcGFyYW1zWydtZW1iZXJvZiddKTsKCWZvcmVhY2goICRncnBpZHMgYXMgJGdpZCApCgl7CgkgICRyZXQgPSAkdGhpcy0+QXNzaWduVXNlclRvR3JvdXAoICR1aWQsICRnaWQgKTsKCSAgaWYoICRyZXQgPT0gZmFsc2UgKQoJICAgIHsKCSAgICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2Vycm9yJywgIjEiKTsKCSAgICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ21lc3NhZ2UnLCAkdGhpcy0+TGFuZygnZXJyb3JfY2FudGFzc2lnbnVzZXInKSApOwoJICAgICAgJHRoaXMtPl9EaXNwbGF5QWRtaW5BZGRVc2VyU3RlcDFQYWdlKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApOwoJICAgICAgcmV0dXJuOwkKCSAgICB9Cgl9CiAgICAgIH0KCiAgICAvLyBhbmQgdGhlbiBhZGQgaGlzIHByb3BlcnRpZXMKICAgIGlmKCBpc3NldCggJHBhcmFtc1sndXNlcnByb3BzJ10gKSApCiAgICAgIHsKCSRwcm9wcyA9IHNwbGl0KCIsIiwkcGFyYW1zWyd1c2VycHJvcHMnXSk7Cglmb3JlYWNoKCAkcHJvcHMgYXMgJHByb3AgKQoJewoJICBsaXN0KCAkaywgJHYgKSA9IHNwbGl0KCI9IiwkcHJvcCk7CgkgICR0aGlzLT5TZXRVc2VyUHJvcGVydHlGdWxsKCRrLCR2LCR1aWQpOwoJfQogICAgICB9CgogICAgLy8gYW5kIHdlJ3JlIGRvbmUKICAgICR0aGlzLT5teVJlZGlyZWN0ICgkaWQsICdkZWZhdWx0YWRtaW4nKTsKKi8KICB9CgoKICBmdW5jdGlvbiBfRG9BZGRVc2VyU3RlcDIoICRpZCwgJiRwYXJhbXMsICRyZXR1cm5pZCApCiAgewogICAgLy8gZG8gd2Ugd2FudCB0byBnbyBiYWNrCiAgICBpZiggaXNzZXQoICRwYXJhbXNbJ2JhY2snXSApICkKICAgICAgewoJLy8geXVwIHdlIGRvCgkkcGFyYW1zID0gZXhwbG9kZV93aXRoX2tleSggJHBhcmFtc1snc3RlcDFfcGFyYW1zJ10gKTs7CgkkdGhpcy0+bXlSZWRpcmVjdCggJGlkLCAnYWRkdXNlcicsICRwYXJhbXMgKTsKICAgICAgfQogICAgaWYoIGlzc2V0KCAkcGFyYW1zWydjYW5jZWwnXSApICkKICAgICAgewoJLy8geXVwIHdlIGRvCgkkdGhpcy0+bXlSZWRpcmVjdFRvVGFiKCAkaWQsICd1c2VycycgKTsKICAgICAgfQoKICAgIC8vIGdldCB0aGUgZmllbGQgaW5mbwogICAgJGZsZGluZm8gPSBhcnJheSgpOwogICAgZm9yZWFjaCggJHBhcmFtcyBhcyAkayA9PiAkdiApCiAgICB7CiAgICAgIGlmKCBwcmVnX21hdGNoKCcvXmhpZGRlbl8vJywgJGsgKSApCgl7CgkgICRmbGRuYW1lID0gc3Vic3RyKCAkaywgc3RybGVuKCdoaWRkZW5fJykpOwoJICAkcHJvcGluZm8gPSBzcGxpdCgnOycsJHYpOwoJICAkZmxkaW5mb1skZmxkbmFtZV0gPSAkcHJvcGluZm87Cgl9CiAgICB9CgogICAgLy8gbm93IGdldCBlYWNoIG9mIHRoZSBmaWVsZHMKICAgICRmaWVsZHMgPSBhcnJheSgpOwogICAgZm9yZWFjaCggJHBhcmFtcyBhcyAkayA9PiAkdiApCiAgICB7CiAgICAgIGlmKCBwcmVnX21hdGNoKCcvXmlucHV0Xy8nLCAkayApICkKCXsKCSAgJGZsZG5hbWUgPSBzdWJzdHIoICRrLCBzdHJsZW4oJ2lucHV0XycpKTsKCSAgJGZpZWxkc1skZmxkbmFtZV0gPSAkdjsgCgl9CiAgICB9CgogICAgLy8gbm93IHZhbGlkYXRlCiAgICBmb3JlYWNoKCAkZmxkaW5mbyBhcyAkbmFtZSA9PiAkdmFsICkKICAgIHsKICAgICAgLy8gcHJvY2VzcyBlbXB0eSByZXF1aXJlZCBmaWVsZHMKICAgICAgLy8gd2UgZG9uJ3QgY2FyZSBhYm91dCBlbXB0eSBvcHRpb25hbCBvbmVzCiAgICAgIGlmKCAkdmFsWzNdID09IDIgJiYgKCFpc3NldCggJGZpZWxkc1skbmFtZV0gKSB8fCAkZmllbGRzWyRuYW1lXSA9PSAnJykgKQoJewoJICAvLyBhIHJlcXVpcmVkIGZpZWxkIGlzIGVtcHR5CgkgICRwYXJhbXMgPSBhcnJheV9tZXJnZSggJHBhcmFtcywgZXhwbG9kZV93aXRoX2tleSggJHBhcmFtc1snc3RlcDFfcGFyYW1zJ10gKSk7CgkgICRwYXJhbXNbJ2Vycm9yJ10gPSAxOwoJICAkcGFyYW1zWydtZXNzYWdlJ10gPSAkdGhpcy0+TGFuZygnZXJyb3JfbWlzc2luZ19yZXF1aXJlZF9wYXJhbScsJG5hbWUpOwoJICAkdGhpcy0+bXlSZWRpcmVjdCggJGlkLCAnZG9fYWRkdXNlcjInLCAkcGFyYW1zICk7CgkgIHJldHVybjsKCX0KCiAgICAgIC8vIHZhbGlkYXRlIGZpbGxlZCBpbiBmaWVsZHMKICAgICAgaWYoIGlzc2V0KCAkZmllbGRzWyRuYW1lXSApICkKCXsKCSAgc3dpdGNoKCAkdmFsWzFdICkKCSAgICB7CgkgICAgY2FzZSAwOiAvLyB0ZXh0CgkgICAgICAvLyBub3QgbXVjaCB3ZSBjYW4gZG8gdG8gdmFsaWRhdGUgYSB0ZXh0IGZpZWxkLgoJICAgICAgYnJlYWs7CgkgICAgY2FzZSAxOiAvLyBjaGVja2JveAoJICAgICAgLy8gb3IgYSBjaGVja2JveAoJICAgICAgYnJlYWs7CgkgICAgY2FzZSAyOiAvLyBlbWFpbAoJICAgICAgLy8gZW1haWwgYWRkcmVzc2VzIGNhbiBiZSB2YWxpZGF0ZWQgdGhvdWdoCgkgICAgICBicmVhazsKCSAgICBjYXNlIDM6IC8vIHRleHRhcmVhCgkgICAgICAvLyBhIHRleHRhcmVhIGNhbiBiZSB2YWxpZGF0ZWQgZm9yIGxlbmd0aC4KCSAgICAgIGJyZWFrOwoJICAgIGNhc2UgNDogLy8gZHJvcGRvd24KCSAgICAgIC8vIGhvdyBjYW4gd2UgdmFsaWRhdGUgYSBkcm9wZG93bj8KCSAgICAgIGJyZWFrOwoJICAgIH0KCX0KICAgIH0KCiAgICAvLyBnZXQgdGhlIHBhcm1zIGZyb20gdGhlIGZpcnN0IHN0ZXAKICAgICRwYXJtczEgPSBleHBsb2RlX3dpdGhfa2V5KCAkcGFyYW1zWydzdGVwMV9wYXJhbXMnXSApOwogICAgCiAgICAvLyBhbmQgbWVyZ2UgZW0gaW50byAkcGFyYW1zIHNvIHdlIGNhbiBhY3R1YWxseSBhZGQgdGhlIHVzZXIgYWNjb3VudAogICAgJHBhcmFtcyA9IGFycmF5X21lcmdlKCAkcGFyYW1zLCAkcGFybXMxICk7CgogICAgLy8gbm93IGZpbmQgb3V0IHdoaWNoIGdyb3VwcyBoZSdzIGEgbWVtYmVyIG9mCiAgICAkbWVtYmVyb2YgPSBhcnJheSgpOwogICAgZm9yZWFjaCggJHBhcmFtcyBhcyAkayA9PiAkdiApCiAgICB7CiAgICAgIGlmKCBwcmVnX21hdGNoKCcvXm1lbWJlcm9mXy8nLCAkayApICkKCXsKCSAgJG1lbWJlcm9mW10gPSAkcGFyYW1zWyRrXTsKCX0KICAgIH0KCiAgICAvLyBub3cgd2UgY2FuIGFjdHVhbGx5IGFkZCB0aGUgdXNlcgogICAgJHJldCA9ICR0aGlzLT5BZGRVc2VyKCAkcGFyYW1zWydpbnB1dF91c2VybmFtZSddLCAKCQkgICAgJHBhcmFtc1snaW5wdXRfcGFzc3dvcmQnXSwKCQkgICAgJHBhcmFtc1snaW5wdXRfZXhwaXJlc2RhdGUnXSApOwogICAgaWYoICRyZXRbMF0gPT0gRkFMU0UgKQogICAgICB7CgkgICRwYXJhbXNbJ2Vycm9yJ10gPSAxOwoJICAkcGFyYW1zWydtZXNzYWdlJ10gPSAkcmV0WzFdOwoJICAkdGhpcy0+bXlSZWRpcmVjdCggJGlkLCAnZG9fYWRkdXNlcjInLCAkcGFyYW1zICk7CgkgIHJldHVybjsKICAgICAgfQogICAgJHVpZCA9ICRyZXRbMV07CgogICAgLy8gYW5kIGFkZCBoaW0gdG8gaGlzIGdyb3VwcwogICAgZm9yZWFjaCggJG1lbWJlcm9mIGFzICRtZW0gKQogICAgewogICAgICBpZiggISR0aGlzLT5Bc3NpZ25Vc2VyVG9Hcm91cCggJHJldFsxXSwgJG1lbSApICkKCXsKCSAgJHBhcmFtc1snZXJyb3InXSA9IDE7CgkgICRwYXJhbXNbJ21lc3NhZ2UnXSA9ICR0aGlzLT5MYW5nKCdlcnJvcl9pbnZhbGlkZ3JvdXBpZCcsJG1lbSk7CgkgICR0aGlzLT5teVJlZGlyZWN0KCAkaWQsICdkb19hZGR1c2VyMicsICRwYXJhbXMgKTsKCSAgcmV0dXJuOwoJfQogICAgfQoKICAgIC8vIGFuZCBhZGQgaGlzIHByb3BlcnRpZXMKICAgIGZvcmVhY2goICRmaWVsZHMgYXMgJGsgPT4gJHYgKQogICAgewogICAgICAkcmV0ID0gJHRoaXMtPlNldFVzZXJQcm9wZXJ0eUZ1bGwoICRrLCAkdiwgJHVpZCApOwogICAgICBpZiggJHJldCA9PSBmYWxzZSApCgl7CgkgICRwYXJhbXNbJ2Vycm9yJ10gPSAxOwoJICAkcGFyYW1zWydtZXNzYWdlJ10gPSAkdGhpcy0+bGFuZygnZXJyb3InKTsKCSAgJHRoaXMtPm15UmVkaXJlY3QoICRpZCwgJ2RvX2FkZHVzZXIyJywgJHBhcmFtcyApOwoJICByZXR1cm47Cgl9CiAgICB9CgogICAgLy8gYW5kIHRoYXQgc2hvdWxkIGJlIGl0CiAgICAkdGhpcy0+bXlSZWRpcmVjdFRvVGFiKCAkaWQsICd1c2VycycgKTsKICB9CgoKICBmdW5jdGlvbiBfRG9BZG1pbkFjdGlvbnMoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICkKICB7CiAgICBpZiggaXNzZXQoICRwYXJhbXNbJ2J1dHRvbl9leHBvcnQnXSApICkKICAgICAgewoJLy8gd2Ugd2FudCB0byBleHBvcnQgYSBjc3YgZmlsZSBkbyB3ZQoJJGNzdiA9ICR0aGlzLT5fR2V0VXNlcnNJbkNTVkZvcm1hdCgpOwoJaWYoICRjc3YgPT0gJycgKQoJICB7CgkgICAgJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlKCRpZCwkcGFyYW1zLCRyZXR1cm5pZCwKCQkJCSAgICAgJHRoaXMtPkxhbmcoJ25vY3N2cmVzdWx0cycpKTsKCSAgICByZXR1cm47CgkgIH0KCWhlYWRlcignQ29udGVudC1EZXNjcmlwdGlvbjogRmlsZSBUcmFuc2ZlcicpOwoJaGVhZGVyKCdDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2ZvcmNlLWRvd25sb2FkJyk7CgloZWFkZXIoJ0NvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQ7IGZpbGVuYW1lPXRyYXBwZWRpbnNlbGZyZWcuY3N2Jyk7Cgl3aGlsZShAb2JfZW5kX2NsZWFuKCkpOwoJZWNobyAkY3N2OwoJZXhpdCgpOwogICAgICB9CiAgfQoKICBmdW5jdGlvbiBfRG9EZWxldGVHcm91cCggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKQogIHsKICAgIGlmICghaXNzZXQgKCRwYXJhbXNbJ2dyb3VwX2lkJ10pIHx8ICRwYXJhbXNbJ2dyb3VwX2lkJ10gPT0gIiIpCiAgICAgIHsKCSR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSAoJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQsCgkJCQkgJHRoaXMtPkxhbmcgKCdlcnJvcl9pbnN1ZmZpY2llbnRwYXJhbXMnKSk7CglyZXR1cm47CiAgICAgIH0gIAoKICAgICRyZXQgPSAkdGhpcy0+RGVsZXRlR3JvdXBGdWxsKCAkcGFyYW1zWydncm91cF9pZCddICk7CiAgICBpZiggJHJldFswXSA9PSBGQUxTRSApCiAgICAgIHsKCSR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSAoJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQsICRyZXRbMV0gKTsKCXJldHVybjsKICAgICAgfQogICAgICAkdGhpcy0+bXlSZWRpcmVjdFRvVGFiKCRpZCwgJ2dyb3VwcycgKTsKICB9CgoKICBmdW5jdGlvbiBfRG9EZWxldGVQcm9wZXJ0eSggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKQogIHsKICAgICR0aGlzLT5fZGVidWdhcnJheSgkcGFyYW1zLCAicmVjZWl2ZWQgcGFyYW1zIik7CiAgICBpZiggIWlzc2V0KCAkcGFyYW1zWydwcm9wbmFtZSddICkgKQogICAgICB7CgkkcGFyYW1zWydlcnJvciddID0gMTsKCSRwYXJhbXNbJ21lc2FnZSddID0gJHRoaXMtPkxhbmcoJ2Vycm9yX2luc3VmZmljZW50cGFyYW1zJyk7CgkkdGhpcy0+bXlSZWRpcmVjdFRvVGFiKCRpZCwncHJvcGVydGllcycsJHBhcmFtcyk7CglyZXR1cm47CiAgICAgIH0KCiAgICAvLyBkZWxldGUgYWxsIG9jY3VyYW5jZXMgb2YgdGhpcyBwcm9wZXJ0eSBuYW1lIGluIHRoZSBwcm9wZXJ0aWVzIHRhYmxlCiAgICAkcmVzdWx0ID0gJHRoaXMtPkRlbGV0ZVVzZXJQcm9wZXJ0eUJ5TmFtZSggJHBhcmFtc1sncHJvcG5hbWUnXSApOwoKICAgIC8vIFdlIG5lZWQgdG8gZGVsZXRlIHNlbGVjdCBvcHRpb25zIHJlZ2FyZGxlc3Mgb2YgdGhlIGNvbnRyb2wgdHlwZSwKICAgIC8vIGJlY2F1c2Ugd2UgZG9uJ3QgZGVsZXRlIHNlbGVjdCBvcHRpb25zIHdoZW4gY2hhbmdpbmcgY29udHJvbCB0eXBlcwogICAgJHJlc3VsdCA9ICR0aGlzLT5EZWxldGVTZWxlY3RPcHRpb25zKCAkcGFyYW1zWydwcm9wbmFtZSddICk7CiAgICAvLyBub3cgcmVhZHkgdG8gZGVsZXRlIHRoZSBwcm9wZXJ0eQogICAgJHJlc3VsdCA9ICR0aGlzLT5EZWxldGVQcm9wZXJ0eURlZm4oICRwYXJhbXNbJ3Byb3BuYW1lJ10gKTsKICAgIGlmKCAhJHJlc3VsdCApCiAgICAgIHsKCSRwYXJhbXNbJ2Vycm9yJ10gPSAxOwoJJHBhcmFtc1snbWVzYWdlJ10gPSAkdGhpcy0+TGFuZygnZXJyb3JfY291bGRub3RkZWxldGVwcm9wZXJ0eScpOwogICAgICB9CiAgICAkdGhpcy0+bXlSZWRpcmVjdFRvVGFiKCRpZCwncHJvcGVydGllcycsJHBhcmFtcyk7CiAgfQoKCiAgZnVuY3Rpb24gX0RvRGVsZXRlVXNlciggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKQogIHsKICAgIGlmICghaXNzZXQgKCRwYXJhbXNbJ3VzZXJfaWQnXSkgfHwgJHBhcmFtc1sndXNlcl9pZCddID09ICIiKQogICAgICB7CgkkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UgKCRpZCwgJHBhcmFtcywgJHJldHVybmlkLAoJCQkJICR0aGlzLT5MYW5nICgnZXJyb3JfaW5zdWZmaWNpZW50cGFyYW1zJykpOwoJcmV0dXJuOwogICAgICB9ICAKCiAgICAkcmV0ID0gJHRoaXMtPkRlbGV0ZVVzZXJGdWxsKCAkcGFyYW1zWyd1c2VyX2lkJ10gKTsKICAgIGlmKCAkcmV0WzBdID09IEZBTFNFICkKICAgICAgewoJJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlICgkaWQsICRwYXJhbXMsICRyZXR1cm5pZCwgJHJldFsxXSApOwoJcmV0dXJuOwogICAgICB9CgogICAgLy8gYW5kIGxvZyBpdAogICAgJHRoaXMtPkF1ZGl0KCAwLCAkdGhpcy0+TGFuZygnZnJpZW5kbHluYW1lJyksCgkJICAkdGhpcy0+TGFuZygndXNlcl9kZWxldGVkJykgKTsKCiAgICAkdGhpcy0+bXlSZWRpcmVjdFRvVGFiKCRpZCwgJ3VzZXJzJyApOwogIH0KCgogIGZ1bmN0aW9uIF9Eb0VkaXRHcm91cCggJGlkLCAmJHBhcmFtcywgJHJldHVybmlkICkKICB7CiAgICBpZiAoaXNzZXQgKCRwYXJhbXNbJ2NhbmNlbCddKSkKICAgIHsKICAgICAgJHRoaXMtPm15UmVkaXJlY3RUb1RhYigkaWQsICdncm91cHMnICk7CiAgICB9CgogICAgaWYgKCFpc3NldCAoJHBhcmFtc1snZ3JvdXBfaWQnXSkgfHwgJHBhcmFtc1snZ3JvdXBfaWQnXSA9PSAiIikKICAgICAgewoJJHBhcmFtc1snZXJyb3InXSA9IDE7CgkkcGFyYW1zWydtZXNzYWdlJ10gPSAkdGhpcy0+TGFuZygnZXJyb3JfaW5zdWZmaWNpZW50cGFyYW1zJyk7CgkkdGhpcy0+bXlSZWRpcmVjdCggJGlkLCAnZWRpdGdyb3VwJywgJHBhcmFtcyApOwoJcmV0dXJuOwogICAgICB9ICAKCiAgICAkZ3JvdXBuYW1lID0gJyc7CiAgICBpZiggaXNzZXQoICRwYXJhbXNbJ2lucHV0X2dyb3VwbmFtZSddICkgKQogICAgICB7CgkkZ3JvdXBuYW1lID0gdHJpbSgkcGFyYW1zWydpbnB1dF9ncm91cG5hbWUnXSk7CiAgICAgIH0KICAgICRncm91cGRlc2MgPSAnJzsKICAgIGlmKCBpc3NldCggJHBhcmFtc1snaW5wdXRfZ3JvdXBkZXNjJ10gKSApCiAgICAgIHsKCSRncm91cGRlc2MgPSB0cmltKCRwYXJhbXNbJ2lucHV0X2dyb3VwZGVzYyddKTsKICAgICAgfQoKICAgIC8vIG1ha2Ugc3VyZSB0aGUgcGFyYW1ldGVycyBhcmUgZmlsbGVkIGluCiAgICBpZiggJGdyb3VwbmFtZSA9PSAnJyB8fCAkZ3JvdXBkZXNjID09ICcnICkKICAgICAgewoJJHBhcmFtc1snZXJyb3InXSA9IDE7CgkkcGFyYW1zWydtZXNzYWdlJ10gPSAkdGhpcy0+TGFuZygnZXJyb3JfaW52YWxpZHBhcmFtcycpOwoJJHRoaXMtPm15UmVkaXJlY3QoICRpZCwgJ2VkaXRncm91cCcsICRwYXJhbXMgKTsKCXJldHVybjsKICAgICAgfQoKICAgICRyZWxuYWRkZWQgPSAwOwogICAgZm9yZWFjaCggJHBhcmFtcyBhcyAka2V5ID0+ICR2YWwgKQogICAgewogICAgICAkcHJvcG5hbWUgPSAnJzsKICAgICAgJHNvcnRvcmRlciA9ICcnOwogICAgICBpZiggcHJlZ19tYXRjaCggJy9eaW5wdXRfcmVxdWlyZWRfLycsICRrZXkgKSAmJiAoJHZhbCAhPSAwKSApCgl7CgkgICRyZWxuYWRkZWQrKzsKCX0KICAgIH0KICAgIGlmKCAkcmVsbmFkZGVkID09IDAgKQogICAgICB7CgkkcGFyYW1zWydlcnJvciddID0gJzEnOwoJJHBhcmFtc1snbWVzc2FnZSddID0gJHRoaXMtPkxhbmcoJ2Vycm9yX25vcmVsYXRpb25zJyk7CgkkdGhpcy0+bXlSZWRpcmVjdCggJGlkLCAnYWRkZ3JvdXAnLCAkcGFyYW1zICk7CglyZXR1cm47CiAgICAgIH0KCiAgICAkcmV0ID0gJHRoaXMtPlNldEdyb3VwKCAkcGFyYW1zWydncm91cF9pZCddLCAkcGFyYW1zWydpbnB1dF9ncm91cG5hbWUnXSwKCQkJICAgICRwYXJhbXNbJ2lucHV0X2dyb3VwZGVzYyddICk7CiAgICBpZiggJHJldFswXSA9PSBGQUxTRSApCiAgICAgIHsKCSR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSAoJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQsICRyZXRbMV0gKTsKCXJldHVybjsKICAgICAgfQoKICAgIC8vIGFsc28gYWRkIHRoZSBwcm9wZXJ0eSBjaG9pY2VzCiAgICAkdGhpcy0+RGVsZXRlQWxsR3JvdXBQcm9wZXJ0eVJlbGF0aW9ucyggJHBhcmFtc1snZ3JvdXBfaWQnXSApOwogICAgZm9yZWFjaCggJHBhcmFtcyBhcyAka2V5ID0+ICR2YWwgKQogICAgewogICAgICBpZiggcHJlZ19tYXRjaCggJy9eaW5wdXRfcmVxdWlyZWRfLycsICRrZXkgKSApCgl7CgkgICRwcm9wbmFtZSA9IHN1YnN0cigka2V5LHN0cmxlbignaW5wdXRfcmVxdWlyZWRfJykpOwoJfQogICAgICBlbHNlIAoJewoJICBjb250aW51ZTsKCX0KICAgICAgaWYoIGlzc2V0KCAkcGFyYW1zWydpbnB1dF9zb3J0b3JkZXJfJy4kcHJvcG5hbWVdICkgKQoJewoJICAkc29ydG9yZGVyID0gJHBhcmFtc1snaW5wdXRfc29ydG9yZGVyXycuJHByb3BuYW1lXTsKCX0KICAgICAgaWYoICR2YWwgIT0gMCAmJiAkcHJvcG5hbWUgIT0gJycgKQoJewoJICAkdGhpcy0+QWRkR3JvdXBQcm9wZXJ0eVJlbGF0aW9uKCAkcGFyYW1zWydncm91cF9pZCddLCAkcHJvcG5hbWUsICRzb3J0b3JkZXIsICR2YWwgKTsKCX0KICAgIH0KCiAgICAkdGhpcy0+bXlSZWRpcmVjdFRvVGFiKCRpZCwgJ2dyb3VwcycgKTsKICB9CgoKICBmdW5jdGlvbiBfRG9FZGl0UHJvcGVydHkoICRpZCwgJiRwYXJhbXMsICRyZXR1cm5pZCApCiAgewogICAgJHRoaXMtPl9kZWJ1Z2FycmF5KCRwYXJhbXMsICJyZWNlaXZlZCBwYXJhbXMiKTsKCiAgICAkbmFtZSA9ICcnOwogICAgaWYoIGlzc2V0KCAkcGFyYW1zWydpbnB1dF9uYW1lJ10gKSApIAogICAgICB7CgkkbmFtZSA9IHRyaW0oJHBhcmFtc1snaW5wdXRfbmFtZSddKTsgCgkkbmFtZSA9IHN0cnRvbG93ZXIocHJlZ19yZXBsYWNlKCcvIC8nLCdfJywkbmFtZSkpOwogICAgICB9CiAgICAkcHJvbXB0ID0gJyc7CiAgICBpZiggaXNzZXQoICRwYXJhbXNbJ2lucHV0X3Byb21wdCddICkgKXsKICAgICAgJHByb21wdCA9IHRyaW0oJHBhcmFtc1snaW5wdXRfcHJvbXB0J10pOyAKICAgIH0KICAgICR0eXBlID0gJyc7CiAgICBpZiggaXNzZXQoICRwYXJhbXNbJ2lucHV0X3R5cGUnXSApICkgewogICAgICAkdHlwZSA9IHRyaW0oJHBhcmFtc1snaW5wdXRfdHlwZSddKTsgCiAgICB9CiAgICAkc2Vsb3B0aW9ucyA9ICcnOwogICAgJG9wdGlvbnMgPSAnJzsKICAgIGlmKCBpc3NldCgkcGFyYW1zWydpbnB1dF9leHRyYSddICkgKSB7CiAgICAgICRzZWxvcHRpb25zID0gdHJpbSgkcGFyYW1zWydpbnB1dF9leHRyYSddKTsKICAgICAgJG9wdGlvbnMgPSBleHBsb2RlKCJfXyIsICRzZWxvcHRpb25zKTsKICAgIH0KCQogICAgaWYoICRuYW1lID09ICcnIHx8ICRwcm9tcHQgPT0gJycpCiAgICAgIHsKCSRwYXJhbXNbJ2Vycm9yJ10gPSAxOwoJJHBhcmFtc1snbWVzc2FnZSddID0gJHRoaXMtPkxhbmcoJ2Vycm9yX2luc3VmZmljaWVudHBhcmFtcycpOwoJZWNobyAkdGhpcy0+TGFuZygnZXJyb3JfaW5zdWZmaWNpZW50cGFyYW1zJyk7CgkkdGhpcy0+bXlSZWRpcmVjdFRvVGFiKCRpZCwncHJvcGVydGllcycsJHBhcmFtcyk7CglyZXR1cm47CiAgICAgIH0KCiAgICBzd2l0Y2goJHR5cGUpewogICAgY2FzZSAwOiAvLyB0ZXh0IGlucHV0CiAgICBjYXNlIDI6IC8vIGVtYWlsCiAgICAgICRsZW5ndGggPSAyMDsKICAgICAgJG1heGxlbmd0aCA9IDIwOwogICAgICBpZiggaXNzZXQoICRwYXJhbXNbJ2lucHV0X2xlbmd0aCddICkgKSB7CgkkbGVuZ3RoID0gdHJpbSgkcGFyYW1zWydpbnB1dF9sZW5ndGgnXSk7CiAgICAgIH0KICAgICAgaWYoIGlzc2V0KCAkcGFyYW1zWydpbnB1dF9tYXhsZW5ndGgnXSApICkgewoJJG1heGxlbmd0aCA9IHRyaW0oJHBhcmFtc1snaW5wdXRfbWF4bGVuZ3RoJ10pOwogICAgICB9CiAgICAgIGJyZWFrOwogICAgY2FzZSAxOiAvLyBjaGVja2JveAogICAgICAkbGVuZ3RoID0gMTsKICAgICAgYnJlYWs7CiAgICBjYXNlIDM6IC8vIHRleHRhcmVhCiAgICAgICRsZW5ndGggPSAyNTU7CiAgICAgIGJyZWFrOwogICAgY2FzZSA0OiAvLyBkcm9wZG93bgogICAgICAvLyBnZXQgdGhlIG51bWJlciBvZiBlbXB0eSB2YWx1ZXMKICAgICAgLy8gYW5kIHN1YnRyYWN0IGl0IGZyb20gdGhlIGFycmF5IGNvdW50CiAgICAgICRlbGVtZW50X2NvdW50X2FycmF5ID0gYXJyYXlfY291bnRfdmFsdWVzKCRvcHRpb25zKTsKICAgICAgJGVtcHR5X2VsZW1lbnRfY291bnQgPSAKCSRlbGVtZW50X2NvdW50X2FycmF5WyIiXSArCgkkZWxlbWVudF9jb3VudF9hcnJheVsiXHIiXSArCgkkZWxlbWVudF9jb3VudF9hcnJheVsiX18iXSArCgkkZWxlbWVudF9jb3VudF9hcnJheVsiX19cciJdOwogICAgICAkbGVuZ3RoID0gY291bnQoJG9wdGlvbnMpIC0gJGVtcHR5X2VsZW1lbnRfY291bnQ7CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgJGxlbmd0aCA9IDE7CiAgICB9CgkKICAgIGlmKCAoJHR5cGUgPT0gMCAmJiAoICRsZW5ndGggPCAxIHx8ICRsZW5ndGggPiAyNTUgKSkgfHwKCSgkdHlwZSA9PSA0ICYmICRzZWxvcHRpb25zID09ICcnICkgKXsKICAgICAgJHBhcmFtc1snZXJyb3InXSA9IDE7CiAgICAgICRwYXJhbXNbJ21lc3NhZ2UnXSA9ICR0aGlzLT5MYW5nKCdlcnJvcl9pbnZhbGlkcGFyYW1zJyk7CiAgICAgIGVjaG8gJHRoaXMtPkxhbmcoJ2Vycm9yX2ludmFsaWRwYXJhbXMnKTsKICAgICAgZWNobyAic2Vsb3B0aW9ucyA9ICIgLiAkc2Vsb3B0aW9uczsKICAgICAgJHRoaXMtPm15UmVkaXJlY3QoJGlkLCdhZGRwcm9wJywkcGFyYW1zKTsKICAgICAgcmV0dXJuOwogICAgfQoJCiAgICAvLyBhbmQgYWRkIHRoZSBwcm9lcHJ0eSBkZWZpbml0aW9uCiAgICBpZiAoJHNlbG9wdGlvbnMpIHsKICAgICAgJHNlbG9wdGlvbnMgPSB0cmltKCRzZWxvcHRpb25zKTsgLy8gdHJpbSBzcGFjZXMgZXRjCiAgICAgICRzZWxvcHRpb25zID0gdHJpbSgkc2Vsb3B0aW9ucywgIl8iKTsgLy8gdHJpbSB1bmRlcnNjb3JlcyBhdCB0aGUgZW5kCiAgICAgICRvcHRpb25zID0gZXhwbG9kZSgiX18iLCAkc2Vsb3B0aW9ucyk7CiAgICAgICR0aGlzLT5EZWxldGVTZWxlY3RPcHRpb25zKCAkbmFtZSApOwogICAgICAkcmVzdWx0ID0gJHRoaXMtPkFkZFNlbGVjdE9wdGlvbnMoICRuYW1lLCAkb3B0aW9ucyApOwoKICAgICAgaWYoICEkcmVzdWx0WzBdICkgewoJJHBhcmFtc1snZXJyb3InXSA9IDE7CgkkcGFyYW1zWydtZXNzYWdlJ10gPSAkcmVzdWx0WzFdOwoJZWNobyAkcmVzdWx0WzFdOwoJJHRoaXMtPm15UmVkaXJlY3QoJGlkLCdhZGRwcm9wJywkcGFyYW1zKTsKICAgICAgfQogICAgfQoKICAgICRyZXMgPSAkdGhpcy0+U2V0UHJvcGVydHlEZWZuKCAkcGFyYW1zWydwcm9wbmFtZSddLCAkbmFtZSwgJHByb21wdCwgJGxlbmd0aCwgJHR5cGUsICRtYXhsZW5ndGggKTsKICAgIGlmKCAkcmVzID09IGZhbHNlICkKICAgICAgewoJJHBhcmFtc1snZXJyb3InXSA9IDE7CgkkcGFyYW1zWydtZXNzYWdlJ10gPSAkdGhpcy0+TGFuZygnZXJyb3JfZGJlcnJvcicpOwoJJHRoaXMtPm15UmVkaXJlY3RUb1RhYigkaWQsJ3Byb3BlcnRpZXMnLCRwYXJhbXMpOwoJcmV0dXJuOwogICAgICB9CgogICAgJHRoaXMtPm15UmVkaXJlY3RUb1RhYigkaWQsJ3Byb3BlcnRpZXMnKTsKICB9CgoKICBmdW5jdGlvbiBfRG9FZGl0VXNlclN0ZXAxKCAkaWQsICYkcGFyYW1zLCAkcmV0dXJuaWQgKQogIHsKICAgIC8vIGFyZSB3ZSBjYW5jZWxsaW5nCiAgICBpZiAoaXNzZXQgKCRwYXJhbXNbJ2NhbmNlbCddKSkKICAgICAgewoJJHRoaXMtPm15UmVkaXJlY3RUb1RhYigkaWQsICd1c2VycycgKTsKICAgICAgfQoKICAgIGlmICggIWlzc2V0KCRwYXJhbXNbJ3VzZXJfaWQnXSkgKQogICAgICB7CgkkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UoICRpZCwgJHBhcmFtcywgJHJldHVybmlkLCAkdGhpcy0+TGFuZygnZXJyb3JfaW5zdWZmaWNpZW50cGFyYW1zJykpOwoJcmV0dXJuOwogICAgICB9CgogICAgLy8gbWFrZSBzdXJlIHRoZSBwYXJhbWV0ZXJzIGFyZSBmaWxsZWQgaW4KICAgICR1c2VyX2lkICAgPSB0cmltKCRwYXJhbXNbJ3VzZXJfaWQnXSk7CiAgICAkdXNlcm5hbWUgPSB0cmltKCRwYXJhbXNbJ2lucHV0X3VzZXJuYW1lJ10pOwogICAgJHBhc3N3b3JkID0gdHJpbSgkcGFyYW1zWydpbnB1dF9wYXNzd29yZCddKTsKICAgICRyZXBlYXQgICA9IHRyaW0oJHBhcmFtc1snaW5wdXRfcmVwZWF0cGFzc3dvcmQnXSk7CiAgICAkcHJvcG5hbWUgPSB0cmltKCRwYXJhbXNbJ2lucHV0X3Byb3BuYW1lJ10pOwogICAgJHByb3BuYW1lID0gdHJpbSgkcGFyYW1zWydpbnB1dF9wcm9wdmFsdWUnXSk7CgogICAgJHJldCA9ICR0aGlzLT5faGFuZGxlVXNlckluZm9WYWxpZGF0aW9uKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCwgJG1lc3NhZ2UsIGZhbHNlICk7CiAgICBzd2l0Y2goICRyZXQgKQogICAgICB7CiAgICAgIGNhc2UgLTE6IC8vIGVycm9yCgkkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdlcnJvcicsICIxIik7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdtZXNzYWdlJywgJG1lc3NhZ2UgKTsKCSR0aGlzLT5fRGlzcGxheUFkbWluRWRpdFVzZXJTdGVwMVBhZ2UoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICk7CglyZXR1cm47CiAgICAgIGNhc2UgMDogIC8vIG5vIGVycm9yLCBidXQgZG9uJ3QgY29udGludWUgb3BlcmF0aW9uCgkkdGhpcy0+X0Rpc3BsYXlBZG1pblVzZXJQYWdlKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApOwoJcmV0dXJuOwogICAgICBjYXNlIDE6ICAvLyBhbGwgaXMgZ29vZCwgY29udGludWUgb3BlcmF0aW9uCglicmVhazsKICAgICAgfQoKICAgIC8vIGxvYWQgcHJvcGVydGllcyBhbmQgc2V0IHRoZW0gdXAKICAgIC8vIGZvciB0aGUgbmV4dCBwYWdlCiAgICAkcHJvcHMgPSAkdGhpcy0+R2V0VXNlclByb3BlcnRpZXMoICR1c2VyX2lkICk7CiAgICBmb3JlYWNoKCAkcHJvcHMgYXMgJHByb3AgKQogICAgewogICAgICAkcGFyYW1zWydpbnB1dF8nLiRwcm9wWyd0aXRsZSddXSA9ICRwcm9wWydkYXRhJ107CiAgICB9CgogICAgLy8gQW5kIEdvIHRvIHN0ZXAgMgogICAgJHRoaXMtPm15UmVkaXJlY3QoICRpZCwgJ2RvX2VkaXR1c2VyMicsICRwYXJhbXMgKTsKCiAgfQoKCiAgZnVuY3Rpb24gX0RvRWRpdFVzZXJTdGVwMyggJGlkLCAmJHBhcmFtcywgJHJldHVybmlkICkKICB7CiAgICAvLyBkbyB3ZSB3YW50IHRvIGdvIGJhY2sKICAgIGlmKCBpc3NldCggJHBhcmFtc1snYmFjayddICkgKQogICAgICB7CgkvLyB5dXAgd2UgZG8KCSRwYXJhbXMgPSBleHBsb2RlX3dpdGhfa2V5KCAkcGFyYW1zWydzdGVwMV9wYXJhbXMnXSApOzsKCSR0aGlzLT5teVJlZGlyZWN0KCAkaWQsICdlZGl0dXNlcicsICRwYXJhbXMgKTsKICAgICAgfQoKICAgIGlmKCAhaXNzZXQoICRwYXJhbXNbJ3VzZXJfaWQnXSApICkKICAgICAgewoJJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlKCRpZCwgJHBhcmFtcywgJHJldHVybmlkLAoJCQkJICR0aGlzLT5MYW5nKCdlcnJvcl9pbnN1ZmZpY2llbnRwYXJhbXMnKSk7CiAgICAgIH0KCiAgICAvLyBnZXQgdGhlIGZpZWxkIGluZm8KICAgICRmbGRpbmZvID0gYXJyYXkoKTsKICAgIGZvcmVhY2goICRwYXJhbXMgYXMgJGsgPT4gJHYgKQogICAgewogICAgICBpZiggcHJlZ19tYXRjaCgnL15oaWRkZW5fLycsICRrICkgKQoJewoJICAkZmxkbmFtZSA9IHN1YnN0ciggJGssIHN0cmxlbignaGlkZGVuXycpKTsKCSAgJHByb3BpbmZvID0gc3BsaXQoJzsnLCR2KTsKCSAgJGZsZGluZm9bJGZsZG5hbWVdID0gJHByb3BpbmZvOwoJfQogICAgfQoKICAgIC8vIG5vdyBnZXQgZWFjaCBvZiB0aGUgZmllbGRzCiAgICAkZmllbGRzID0gYXJyYXkoKTsKICAgIGZvcmVhY2goICRwYXJhbXMgYXMgJGsgPT4gJHYgKQogICAgewogICAgICBpZiggcHJlZ19tYXRjaCgnL15pbnB1dF8vJywgJGsgKSApCgl7CgkgICRmbGRuYW1lID0gc3Vic3RyKCAkaywgc3RybGVuKCdpbnB1dF8nKSk7CgkgICRmaWVsZHNbJGZsZG5hbWVdID0gJHY7IAoJfQogICAgfQoKICAgIC8vIG5vdyB2YWxpZGF0ZQogICAgZm9yZWFjaCggJGZsZGluZm8gYXMgJG5hbWUgPT4gJHZhbCApCiAgICB7CiAgICAgIC8vIHByb2Nlc3MgZW1wdHkgcmVxdWlyZWQgZmllbGRzCiAgICAgIC8vIHdlIGRvbid0IGNhcmUgYWJvdXQgZW1wdHkgb3B0aW9uYWwgb25lcwogICAgICBpZiggJHZhbFszXSA9PSAyICYmICghaXNzZXQoICRmaWVsZHNbJG5hbWVdICkgfHwgJGZpZWxkc1skbmFtZV0gPT0gJycpICkKCXsKCSAgLy8gYSByZXF1aXJlZCBmaWVsZCBpcyBlbXB0eQoJICAkcGFyYW1zID0gYXJyYXlfbWVyZ2UoICRwYXJhbXMsIGV4cGxvZGVfd2l0aF9rZXkoICRwYXJhbXNbJ3N0ZXAxX3BhcmFtcyddICkpOwoJICAkcGFyYW1zWydlcnJvciddID0gMTsKCSAgJHBhcmFtc1snbWVzc2FnZSddID0gJHRoaXMtPkxhbmcoJ2Vycm9yX21pc3NpbmdfcmVxdWlyZWRfcGFyYW0nLCRuYW1lKTsKCSAgJHRoaXMtPm15UmVkaXJlY3QoICRpZCwgJ2RvX2FkZHVzZXIyJywgJHBhcmFtcyApOwoJICByZXR1cm47Cgl9CgogICAgICAvLyB2YWxpZGF0ZSBmaWxsZWQgaW4gZmllbGRzCiAgICAgIGlmKCBpc3NldCggJGZpZWxkc1skbmFtZV0gKSApCgl7CgkgIHN3aXRjaCggJHZhbFsxXSApCgkgICAgewoJICAgIGNhc2UgMDogLy8gdGV4dAoJICAgICAgLy8gbm90IG11Y2ggd2UgY2FuIGRvIHRvIHZhbGlkYXRlIGEgdGV4dCBmaWVsZC4KCSAgICAgIGJyZWFrOwoJICAgIGNhc2UgMTogLy8gY2hlY2tib3gKCSAgICAgIC8vIG9yIGEgY2hlY2tib3gKCSAgICAgIGJyZWFrOwoJICAgIGNhc2UgMjogLy8gZW1haWwKCSAgICAgIC8vIGVtYWlsIGFkZHJlc3NlcyBjYW4gYmUgdmFsaWRhdGVkIHRob3VnaAoJICAgICAgYnJlYWs7CgkgICAgY2FzZSAzOiAvLyB0ZXh0YXJlYQoJICAgICAgLy8gbWF5YmUgc2l6ZT8KCSAgICAgIGJyZWFrOwoJICAgIGNhc2UgNDogLy8gZHJvcGRvd24KCSAgICAgIC8vIEhvdyBjYW4gd2UgdmFsaWRhdGUgYSBkcm9wZG93bj8KCSAgICAgIGJyZWFrOwoJICAgIH0KCX0KICAgIH0KCiAgICAvLyBnZXQgdGhlIHBhcm1zIGZyb20gdGhlIGZpcnN0IHN0ZXAKICAgICRwYXJtczEgPSBleHBsb2RlX3dpdGhfa2V5KCAkcGFyYW1zWydzdGVwMV9wYXJhbXMnXSApOwogICAgCiAgICAvLyBhbmQgbWVyZ2UgZW0gaW50byAkcGFyYW1zIHNvIHdlIGNhbiBhY3R1YWxseSBhZGQgdGhlIHVzZXIgYWNjb3VudAogICAgJHBhcmFtcyA9IGFycmF5X21lcmdlKCAkcGFyYW1zLCAkcGFybXMxICk7CgogICAgLy8gbm93IGZpbmQgb3V0IHdoaWNoIGdyb3VwcyBoZSdzIGEgbWVtYmVyIG9mCiAgICAkZ3JwaWRzID0gYXJyYXkoKTsKICAgIGZvcmVhY2goICRwYXJhbXMgYXMgJGsgPT4gJHYgKQogICAgewogICAgICBpZiggcHJlZ19tYXRjaCgnL15tZW1iZXJvZl8vJywgJGsgKSApCgl7CgkgICRncnBpZHNbXSA9ICRwYXJhbXNbJGtdOwoJfQogICAgfQoKICAgICR1c2VyX2lkID0gJyc7CiAgICBpZiggaXNzZXQoICRwYXJhbXNbJ3VzZXJfaWQnXSApICkKICAgICAgewoJJHVzZXJfaWQgPSAkcGFyYW1zWyd1c2VyX2lkJ107CiAgICAgIH0KICAgIGVsc2UgCiAgICAgIHsKCSR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2Vycm9yJywgIjEiKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ21lc3NhZ2UnLCAkcmV0WzFdICk7CgkkdGhpcy0+X0Rpc3BsYXlBZG1pbkFkZFVzZXJTdGVwMlBhZ2UoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICk7CglyZXR1cm47CQogICAgICB9CgogICAgJHVzZXJuYW1lID0gJyc7CiAgICBpZiggaXNzZXQoICRwYXJhbXNbJ2lucHV0X3VzZXJuYW1lJ10gKSApCiAgICAgIHsKCSR1c2VybmFtZSA9ICRwYXJhbXNbJ2lucHV0X3VzZXJuYW1lJ107CiAgICAgIH0KICAgICRwYXNzd29yZCA9ICcnOwogICAgaWYoIGlzc2V0KCAkcGFyYW1zWydpbnB1dF9wYXNzd29yZCddICkgJiYgJHBhcmFtc1snaW5wdXRfcGFzc3dvcmQnXSAhPSAnJyApCiAgICAgIHsKCSRwYXNzd29yZCA9ICRwYXJhbXNbJ2lucHV0X3Bhc3N3b3JkJ107CiAgICAgIH0KICAgICRleHBpcmVzID0gc3RydG90aW1lKCcrMTAgeWVhcnMnLCB0aW1lKCkpOwogICAgaWYoIGlzc2V0KCAkcGFyYW1zWydpbnB1dF9leHBpcmVzZGF0ZSddICkgKQogICAgICB7CgkkZXhwaXJlc2RhdGUgPSAkcGFyYW1zWydpbnB1dF9leHBpcmVzZGF0ZSddOwogICAgICB9CgogICAgLy8gYW5kIFNldCB0aGUgdXNlcgogICAgJHJldCA9ICR0aGlzLT5TZXRVc2VyKCAkdXNlcl9pZCwgJHVzZXJuYW1lLCAkcGFzc3dvcmQsICRleHBpcmVzICk7CiAgICBpZiggJHJldFswXSA9PSBmYWxzZSApCiAgICAgIHsKCSR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2Vycm9yJywgIjEiKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ21lc3NhZ2UnLCAkcmV0WzFdICk7CgkkdGhpcy0+X0Rpc3BsYXlBZG1pbkFkZFVzZXJTdGVwMlBhZ2UoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICk7CglyZXR1cm47CQogICAgICB9CgogICAgLy8gYW5kIHRoZW4gYWRkIGhpbSB0byBoaXMgZ3JvdXBzCiAgICAkcmV0ID0gJHRoaXMtPlNldFVzZXJHcm91cHMoICR1c2VyX2lkLCAkZ3JwaWRzICk7CiAgICBpZiggJHJldFswXSA9PSBmYWxzZSApCiAgICAgIHsKCSR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2Vycm9yJywgIjEiKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ21lc3NhZ2UnLCAkdGhpcy0+TGFuZygnZXJyb3JfY2FudGFzc2lnbnVzZXInKSApOwoJJHRoaXMtPl9EaXNwbGF5QWRtaW5BZGRVc2VyU3RlcDJQYWdlKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApOwoJcmV0dXJuOwkKICAgICAgfSAKCiAgICAvLyBhbmQgdGhlbiBhZGQgaGlzIHByb3BlcnRpZXMKICAgICR0aGlzLT5EZWxldGVVc2VyUHJvcGVydHlGdWxsKCAiIiwgJHVzZXJfaWQsIHRydWUgKTsKICAgIGZvcmVhY2goICRmaWVsZHMgYXMgJGsgPT4gJHYgKQogICAgewogICAgICAkcmV0ID0gJHRoaXMtPlNldFVzZXJQcm9wZXJ0eUZ1bGwoICRrLCAkdiwgJHVzZXJfaWQgKTsKICAgICAgaWYoICRyZXQgPT0gZmFsc2UgKQoJewoJICAkcGFyYW1zWydlcnJvciddID0gMTsKCSAgJHBhcmFtc1snbWVzc2FnZSddID0gJHRoaXMtPmxhbmcoJ2Vycm9yJyk7CgkgICR0aGlzLT5fRGlzcGxheUFkbWluQWRkVXNlclN0ZXAyUGFnZSggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKTsKCSAgcmV0dXJuOwoJfQogICAgfQoKICAgIC8vIGFuZCB3ZSdyZSBkb25lCiAgICAkdGhpcy0+bXlSZWRpcmVjdFRvVGFiKCRpZCwgJ3VzZXJzJyApOwogIH0KCgogIGZ1bmN0aW9uIF9Eb0ZvcmdvdFBhc3N3b3JkKCAkaWQsICYkcGFyYW1zLCAkcmV0dXJuaWQgKQogIHsKICAgIGlmKCAhaXNzZXQoICRwYXJhbXNbJ2lucHV0X3VzZXJuYW1lJ10gKSAgKQogICAgICB7CgkkcGFyYW1zWydlcnJvciddID0gMTsKCSRwYXJhbXNbJ21lc3NhZ2UnXSA9ICR0aGlzLT5MYW5nKCdlcnJvcl9pbnN1ZmZpY2llbnRwYXJhbXMnKTsKCSR0aGlzLT5teVJlZGlyZWN0KCAkaWQsICdmb3Jnb3RwdycsICRwYXJhbXMgKTsKCXJldHVybjsKICAgICAgfQogICAgCiAgICAvLyBzZWUgaWYgd2UgY2FuIGZpbmQgdGhpcyB1c2VyCiAgICAkdWlkID0gJHRoaXMtPkdldFVzZXJJRCggJHBhcmFtc1snaW5wdXRfdXNlcm5hbWUnXSApOwogICAgaWYoICEkdWlkICkKICAgICAgewoJJHBhcmFtc1snZXJyb3InXSA9IDE7CgkkcGFyYW1zWydtZXNzYWdlJ10gPSAkdGhpcy0+TGFuZygnZXJyb3JfdXNlcm5vdGZvdW5kJyk7CgkkdGhpcy0+bXlSZWRpcmVjdCggJGlkLCAnZm9yZ290cHcnLCAkcGFyYW1zICk7CglyZXR1cm47CiAgICAgIH0KCgogICAgLy8gc2VlIGlmIHdlIGNhbiBkaWcgdXAgYW4gZW1haWwgYWRkcmVzcyBmb3IgaGltCiAgICAkZW1haWwgPSBmYWxzZTsKICAgICRkZWZucyA9ICR0aGlzLT5HZXRQcm9wZXJ0eURlZm5zKCk7CiAgICAkcHJvcHMgPSAkdGhpcy0+R2V0VXNlclByb3BlcnRpZXMoICR1aWQgKTsKICAgIGlmKCAkcHJvcHMgKSAKICAgICAgewoJLy8gd2UgaGF2ZSBwcm9wZXJ0aWVzIGZvciB0aGlzIHVzZXIKCS8vIG5vdyBzZWUgaWYgd2UgaGF2ZSBhbiBlbWFpbCBmaWVsZAoJLy8gd2UncmUgZ29ubmEgaXRlcmF0ZSB0aHJvdWdoIHRoZSBwcm9wZXJ0aWVzIHRpbGwgb25lIGlzIGFuIGVtYWlsIHR5cGUKCS8vIHRoZW4gd2UncmUgZ29ubmEgYXNrIHRoZSB1c2VyIGlmIHRoaXMgaXMgdGhlIHJpZ2h0IGFkZHJlc3MuLgoJZm9yZWFjaCggJHByb3BzIGFzICRwcm9wZSApCgl7CgkgIGZvcmVhY2goICRkZWZucyBhcyAkZGVmbmUgKQoJICB7CgkgICAgaWYoICRwcm9wZVsndGl0bGUnXSA9PSAkZGVmbmVbJ25hbWUnXSAmJiAkZGVmbmVbJ3R5cGUnXSA9PSAyICYmICRlbWFpbCA9PSBmYWxzZSApCgkgICAgICB7CgkJLy8gZm91bmQgYSBtYXRjaCBhbmQgaXQncyBhbiBlbWFpbCBmaWVsZAoJCSRlbWFpbCA9ICRwcm9wZVsnZGF0YSddOwoJCWJyZWFrOwoJICAgICAgfQoJICB9CgoJICBpZiggJGVtYWlsICE9IGZhbHNlICkKCSAgICB7CgkgICAgICBicmVhazsKCSAgICB9Cgl9CgoJaWYoICEkZW1haWwgKQoJICB7CgkgICAgJHBhcmFtc1snZXJyb3InXSA9IDE7CgkgICAgJHBhcmFtc1snbWVzc2FnZSddID0gJHRoaXMtPkxhbmcoJ2Vycm9yX25vZW1haWxhZGRyZXNzJyk7CgkgICAgJHRoaXMtPm15UmVkaXJlY3QoICRpZCwgJ2ZvcmdvdHB3JywgJHBhcmFtcyApOwoJICAgIHJldHVybjsKCSAgfQoJZWxzZQoJICB7CgkgICAgJGNtc21haWxlciA9ICR0aGlzLT5HZXRNb2R1bGVJbnN0YW5jZSgnQ01TTWFpbGVyJyk7CgkgICAgaWYoICEkY21zbWFpbGVyICkKCSAgICAgIHsKCQkkcGFyYW1zWydlcnJvciddID0gMTsKCQkkcGFyYW1zWydtZXNzYWdlJ10gPSAkdGhpcy0+TGFuZygnZXJyb3Jfbm9tYWlsZXJtb2R1bGUnKTsKCQkkdGhpcy0+bXlSZWRpcmVjdCggJGlkLCAnZm9yZ290cHcnLCAkcGFyYW1zICk7CgkJcmV0dXJuOwoJICAgICAgfQoKCSAgICAvLyB3ZSBmb3VuZCBhbmUgbWFpbCBhZGRyZXNzCgkgICAgLy8gZ2VuZXJhdGUgYSBjb2RlLCBhbmQgc3RvcmUgaXQgc29tZXBsYWNlCgkgICAgLy8gYnV0IHRoYXQgbWVhbnMgd2UgZ290dGEgY2xlYW4gdGhlc2UgdGhpbmdzIHVwCgkgICAgLy8gZnJvbSB0aW1lIHRvIHRpbWUuCgkgICAgJGNvZGUgPSAkdGhpcy0+R2VuZXJhdGVSYW5kb21QcmludGFibGVTdHJpbmcoKTsKCSAgICBpZiggISR0aGlzLT5TZXRVc2VyVGVtcENvZGUoICR1aWQsICRjb2RlICkgKQoJICAgICAgewoJCSRwYXJhbXNbJ2Vycm9yJ10gPSAxOwoJCSRwYXJhbXNbJ21lc3NhZ2UnXSA9ICR0aGlzLT5MYW5nKCdlcnJvcl9yZXNldGFscmVhZHlzZW50Jyk7CgkJJHRoaXMtPm15UmVkaXJlY3QoICRpZCwgJ2ZvcmdvdHB3JywgJHBhcmFtcyApOwoJCXJldHVybjsKCSAgICAgIH0KCgkgICAgLy8gc2VuZCBvdXIgZnVua3kgZW1haWwKCSAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ21lc3NhZ2VfZm9yZ290cHdlbWFpbCcsCgkJCQkgICR0aGlzLT5MYW5nKCdtZXNzYWdlX2ZvcmdvdHB3ZW1haWwnKSk7CgkgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdwcm9tcHRfY29kZScsJHRoaXMtPkxhbmcoJ21lc3NhZ2VfY29kZScpKTsKCSAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2RhdGFfY29kZScsJGNvZGUpOwoJICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigncHJvbXB0X2xpbmsnLCR0aGlzLT5MYW5nKCdwcm9tcHRfbGluaycpKTsKCSAgICAkcGFybXMgPSBhcnJheSggJ2lucHV0X3VpZCcgPT4gJHVpZCwgJ2lucHV0X2NvZGUnID0+ICRjb2RlICk7CgkgICAgJGxpbmsgPSAkdGhpcy0+Q3JlYXRlTGluaygkaWQsJ3ZlcmlmeWNvZGUnLCRyZXR1cm5pZCwnJywkcGFybXMsICcnLCB0cnVlKTsKCSAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2RhdGFfbGluaycsCgkJCQkgICR0aGlzLT5DcmVhdGVMaW5rKCRpZCwndmVyaWZ5Y29kZScsJHJldHVybmlkLCRsaW5rLCRwYXJtcykpOwoJICAgICRib2R5ID0gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZUZyb21EYXRhYmFzZSgnZmV1c2Vyc19mb3Jnb3RwYXNzd29yZGVtYWlsZm9ybScpOwoKCSAgICAkY21zbWFpbGVyLT5BZGRBZGRyZXNzKCAkZW1haWwgKTsKCSAgICAkY21zbWFpbGVyLT5TZXRCb2R5KCAkYm9keSApOwoJICAgICRjbXNtYWlsZXItPklzSFRNTCh0cnVlKTsKCSAgICAkY21zbWFpbGVyLT5TZXRTdWJqZWN0KCR0aGlzLT5MYW5nKCdsb3N0cGFzc3dvcmRfZW1haWxzdWJqZWN0JykpOwoJICAgICRjbXNtYWlsZXItPlNlbmQoKTsKCgkgICAgLy8gYW5kIHRlbGwgdGhlIHVzZXIgc29tZXRoaW5nCgkgICAgJHBhcmFtc1snbWVzc2FnZSddID0gJHRoaXMtPkxhbmcoJ2luZm9fZm9yZ290cHdtZXNzYWdlc2VudCcsJGVtYWlsKTsKCSAgICAkcGFyYW1zWydza2lwZm9ybWRpc3BsYXknXSA9IDE7CgkgICAgJHRoaXMtPm15UmVkaXJlY3QoICRpZCwgJ2ZvcmdvdHB3JywgJHBhcmFtcyApOwoJICAgIHJldHVybiAxOwoJICB9CiAgICAgIH0KCiAgICAvLyB3ZSBmb3VuZCBubyBlbWFpbCBhZGRyZXNzCiAgICAkcGFyYW1zWydlcnJvciddID0gMTsKICAgICRwYXJhbXNbJ21lc2FnZSddID0gJHRoaXMtPkxhbmcoJ2Vycm9yX2NvdWxkbm90ZmluZGVtYWlsJyk7CiAgICAkdGhpcy0+bXlSZWRpcmVjdCggJGlkLCAnZm9yZ290cHcnLCAkcGFyYW1zICk7CiAgfQoKCiAgZnVuY3Rpb24gX0RvTG9naW4oICRpZCwgJiRwYXJhbXMsICRyZXR1cm5pZCApCiAgewogICAgaWYoICFpc3NldCggJHBhcmFtc1snaW5wdXRfdXNlcm5hbWUnXSApICkKICAgICAgewoJJHBhcmFtc1snZXJyb3InXSA9ICR0aGlzLT5MYW5nKCdlcnJvcl9taXNzaW5ndXNlcm5hbWUnKTsKCSR0aGlzLT5fR2V0VXNlckxvZ2luRm9ybSggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKTsKCXJldHVybjsKICAgICAgfQoKICAgIGlmKCAhaXNzZXQoICRwYXJhbXNbJ2lucHV0X3Bhc3N3b3JkJ10gKSApCiAgICAgIHsKCSRwYXJhbXNbJ2Vycm9yJ10gPSAkdGhpcy0+TGFuZygnZXJyb3JfbWlzc2luZ3Bhc3N3b3JkJyk7CgkkdGhpcy0+X0dldFVzZXJMb2dpbkZvcm0oICRpZCwgJHBhcmFtcywgJHJldHVybmlkICk7CglyZXR1cm47CiAgICAgIH0KCiAgICAvLyBub3cgdmFsaWRhdGUgdGhlIHBhc3N3b3JkIGFuZCB1c2VybmFtZQogICAgJHJlc3VsdCA9ICR0aGlzLT5Mb2dpbiggJHBhcmFtc1snaW5wdXRfdXNlcm5hbWUnXSwgJHBhcmFtc1snaW5wdXRfcGFzc3dvcmQnXSApOwogICAgaWYoICRyZXN1bHRbMF0gPT0gZmFsc2UgKQogICAgICB7CgkkcGFyYW1zWydlcnJvciddID0gJHJlc3VsdFsxXTsKCSR0aGlzLT5fR2V0VXNlckxvZ2luRm9ybSggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKTsKCXJldHVybjsKICAgICAgfQogICAgJHRoaXMtPkF1ZGl0KCAwLCAkdGhpcy0+TGFuZygnZnJpZW5kbHluYW1lJyksCgkJICAkdGhpcy0+TGFuZygnZnJvbnRlbmR1c2VyX2xvZ2dlZGluJykuIjogIi4kcGFyYW1zWydpbnB1dF91c2VybmFtZSddICk7CiAgICAvLyB3ZSdyZSBsb2dnZWQgaW4KICAgIC8vIHJlZGlyZWN0IHNvbWV3aGVyZSAKICAgIC8vIHRvZG8sIGFkZCBtb3JlIG9wdGlvbnMgaGVyZS4KICAgICRwYWdlID0gJHRoaXMtPkdldFByZWZlcmVuY2UoJ3BhZ2VpZF9sb2dpbicpOwogICAgaWYoIGlzc2V0KCAkcGFyYW1zWydyZXR1cm50byddICkgKQogICAgICB7CgkkcGFnZSA9ICRwYXJhbXNbJ3JldHVybnRvJ107CiAgICAgIH0KICAgIGlmKCAkcGFnZSApCiAgICAgIHsKCSRpZCA9IENvbnRlbnRNYW5hZ2VyOjpHZXRQYWdlSURGcm9tQWxpYXMoICRwYWdlICk7CglpZiggJGlkICkKCSAgewoJICAgICR0aGlzLT5SZWRpcmVjdENvbnRlbnQoICRpZCApOwoJICAgIHJldHVybjsKCSAgfQogICAgICB9CiAgICAkdGhpcy0+UmVkaXJlY3RDb250ZW50KCAkcmV0dXJuaWQgKTsKICB9CgoKICBmdW5jdGlvbiBfRG9Mb2dvdXQoICRpZCwgJiRwYXJhbXMsICRyZXR1cm5pZCApCiAgewogICAgJHRoaXMtPkxvZ291dCgpOwogICAgJHRoaXMtPkF1ZGl0KCAwLCAkdGhpcy0+TGFuZygnZnJpZW5kbHluYW1lJyksCgkJICAkdGhpcy0+TGFuZygnZnJvbnRlbmR1c2VyX2xvZ291dCcpKTsKCiAgICAvLyB3ZSdyZSBsb2dnZWQgb3V0CiAgICAvLyByZWRpcmVjdCBzb21ld2hlcmUgCiAgICAvLyB0b2RvLCBhZGQgbW9yZSBvcHRpb25zIGhlcmUuCiAgICAkcGFnZSA9ICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdwYWdlaWRfbG9nb3V0Jyk7CiAgICBpZiggaXNzZXQoICRwYXJhbXNbJ3JldHVybnRvJ10gKSApCiAgICAgIHsKCSRwYWdlID0gJHBhcmFtc1sncmV0dXJudG8nXTsKICAgICAgfQogICAgaWYoICRwYWdlICkKICAgICAgewoJJGlkID0gQ29udGVudE1hbmFnZXI6OkdldFBhZ2VJREZyb21BbGlhcyggJHBhZ2UgKTsKCWlmKCAkaWQgKQoJICB7CgkgICAgJHRoaXMtPlJlZGlyZWN0Q29udGVudCggJGlkICk7CgkgICAgcmV0dXJuOwoJICB9CiAgICAgIH0KICAgICR0aGlzLT5SZWRpcmVjdENvbnRlbnQoICRyZXR1cm5pZCApOwogIH0KCgogIGZ1bmN0aW9uIF9Eb1Jlc2V0VXNlckFjY291bnQoICRpZCwgJiRwYXJhbXMsICRyZXR1cm5pZCApCiAgewogICAgJHVpZCA9ICcnOwogICAgaWYoIGlzc2V0KCAkcGFyYW1zWydpbnB1dF91aWQnXSApICkKICAgICAgewoJJHVpZCA9IHRyaW0oJHBhcmFtc1snaW5wdXRfdWlkJ10pOwogICAgICB9CiAgICAkY29kZSA9ICcnOwogICAgaWYoIGlzc2V0KCAkcGFyYW1zWydpbnB1dF9jb2RlJ10gKSApCiAgICAgIHsKCSRjb2RlID0gdHJpbSgkcGFyYW1zWydpbnB1dF9jb2RlJ10pOwogICAgICB9CiAgICAkcGFzc3dvcmQgPSAnJzsKICAgIGlmKCBpc3NldCggJHBhcmFtc1snaW5wdXRfcGFzc3dvcmQnXSApICkKICAgICAgewoJJHBhc3N3b3JkID0gdHJpbSgkcGFyYW1zWydpbnB1dF9wYXNzd29yZCddKTsKICAgICAgfQogICAgJHJlcGVhdHBhc3N3b3JkID0gJyc7CiAgICBpZiggaXNzZXQoICRwYXJhbXNbJ2lucHV0X3JlcGVhdHBhc3N3b3JkJ10gKSApCiAgICAgIHsKCSRyZXBlYXRwYXNzd29yZCA9IHRyaW0oJHBhcmFtc1snaW5wdXRfcmVwZWF0cGFzc3dvcmQnXSk7CiAgICAgIH0KCiAgICBpZiggJHBhc3N3b3JkID09ICcnIHx8ICRyZXBlYXRwYXNzd29yZCA9PSAnJyB8fCAKCSRwYXNzd29yZCAhPSAkcmVwZWF0cGFzc3dvcmQgfHwgISR0aGlzLT5Jc1ZhbGlkUGFzc3dvcmQoJHBhc3N3b3JkKSkKICAgICAgewoJJHBhcmFtc1snZXJyb3InXSA9IDE7CgkkcGFyYW1zWydtZXNzYWdlJ10gPSAkdGhpcy0+TGFuZygnZXJyb3JfaW52YWxpZHBhc3N3b3JkJyk7CgkkdGhpcy0+bXlSZWRpcmVjdCggJGlkLCAndmVyaWZ5Y29kZScsICRwYXJhbXMgKTsKCXJldHVybjsKICAgICAgfQoKICAgIC8vIG5vdyB3ZSBoYXZlIHRvIHZlcmlmeSB0aGUgY29kZQogICAgJHJlc3VsdCA9ICR0aGlzLT5HZXRVc2VyVGVtcENvZGUoICR1aWQgKTsKICAgIGlmKCAkcmVzdWx0WzBdID09IEZBTFNFICkKICAgICAgewoJJHBhcmFtc1snZXJyb3InXSA9IDE7CgkkcGFyYW1zWydtZXNzYWdlJ10gPSAkcmVzdWx0WzFdOwoJJHRoaXMtPm15UmVkaXJlY3QoICRpZCwgJ3ZlcmlmeWNvZGUnLCAkcGFyYW1zICk7CglyZXR1cm47CiAgICAgIH0KICAgICRkYmNvZGUgPSAkcmVzdWx0WzFdWydjb2RlJ107CgogICAgaWYoICRkYmNvZGUgIT0gJGNvZGUgKQogICAgICB7CgkkcGFyYW1zWydlcnJvciddID0gMTsKCSRwYXJhbXNbJ21lc3NhZ2UnXSA9ICR0aGlzLT5MYW5nKCdlcnJvcl9pbnZhbGlkY29kZScpOwoJJHRoaXMtPm15UmVkaXJlY3QoICRpZCwgJ3ZlcmlmeWNvZGUnLCAkcGFyYW1zICk7CglyZXR1cm47CiAgICAgIH0KCiAgICAvLyB3aGV3LCB3ZSBnb3QgaXQuLi4gbm93IHdlIGNhbiByZXNldCB0aGUgcGFzc3dvcmQKICAgICRyZXQgPSAkdGhpcy0+U2V0VXNlclBhc3N3b3JkKCAkdWlkLCAkcGFzc3dvcmQgKTsKICAgIGlmKCAkcmV0WzBdICE9IFRSVUUgKQogICAgICB7CgkkcGFyYW1zWydlcnJvciddID0gMTsKCSRwYXJhbXNbJ21lc3NhZ2UnXSA9ICRyZXRbMV07CgkkdGhpcy0+bXlSZWRpcmVjdCggJGlkLCAndmVyaWZ5Y29kZScsICRwYXJhbXMgKTsKCXJldHVybjsKICAgICAgfQoKICAgIC8vIGFuZCBkZWxldGUgdGhlIGNvZGUKICAgICR0aGlzLT5SZW1vdmVVc2VyVGVtcENvZGUoICR1aWQgKTsKCiAgICAvLyBhbmQgZGlzcGxheSBhIG5pY2Ugd2FybSBmdXp6eSBtZXNzYWdlCiAgICAvLyB0b2RvCiAgICAkdGhpcy0+bXlSZWRpcmVjdCggJGlkLCAnZGVmYXVsdCcgKTsKICAgIGJyZWFrOwogIH0KCiAgCiAgZnVuY3Rpb24gX0RvU2V0Q2hhbmdlU2V0dGluZ3NUZW1wbGF0ZSggJGlkLCAmJHBhcmFtcywgJHJldHVybmlkICkKICB7CiAgICBpZiggaXNzZXQoICRwYXJhbXNbJ2RlZmF1bHRzJ10gKSApCiAgICAgIHsKCSR0aGlzLT5TZXRUZW1wbGF0ZSgnZmV1c2Vyc19jaGFuZ2VzZXR0aW5nc2Zvcm0nLCAkdGhpcy0+ZGZsdF9jaGFuZ2VzZXR0aW5nc3RlbXBsYXRlKTsKICAgICAgfQogICAgZWxzZQogICAgICB7CgkkdGhpcy0+U2V0VGVtcGxhdGUoJ2ZldXNlcnNfY2hhbmdlc2V0dGluZ3Nmb3JtJywgJHBhcmFtc1sndGVtcGxhdGVjb250ZW50J10pOwogICAgICB9CiAgICAkdGhpcy0+bXlSZWRpcmVjdFRvVGFiKCRpZCwgJ2NoYW5nZXNldHRpbmdzX3RlbXBsYXRlJyApOwogIH0KCgogIGZ1bmN0aW9uIF9Eb1NldEZvcmdvdFBXVGVtcGxhdGUoICRpZCwgJiRwYXJhbXMsICRyZXR1cm5pZCApCiAgewogICAgaWYoIGlzc2V0KCAkcGFyYW1zWydkZWZhdWx0cyddICkgKQogICAgICB7CgkkdGhpcy0+U2V0VGVtcGxhdGUoJ2ZldXNlcnNfZm9yZ290cGFzc3dvcmRmb3JtJywgJHRoaXMtPmRmbHRfZm9yZ290cGFzc3dvcmR0ZW1wbGF0ZTEpOwoJJHRoaXMtPlNldFRlbXBsYXRlKCdmZXVzZXJzX2ZvcmdvdHBhc3N3b3JkZW1haWxmb3JtJywgJHRoaXMtPmRmbHRfZm9yZ290cGFzc3dvcmR0ZW1wbGF0ZTIpOwoJJHRoaXMtPlNldFRlbXBsYXRlKCdmZXVzZXJzX2ZvcmdvdHBhc3N3b3JkdmVyaWZ5Zm9ybScsJHRoaXMtPmRmbHRfZm9yZ290cGFzc3dvcmR0ZW1wbGF0ZTMpOwogICAgICB9CiAgICBlbHNlCiAgICAgIHsKCSR0aGlzLT5TZXRUZW1wbGF0ZSgnZmV1c2Vyc19mb3Jnb3RwYXNzd29yZGZvcm0nLCAkcGFyYW1zWyd0ZW1wbGF0ZWNvbnRlbnQxJ10pOwoJJHRoaXMtPlNldFRlbXBsYXRlKCdmZXVzZXJzX2ZvcmdvdHBhc3N3b3JkZW1haWxmb3JtJywgJHBhcmFtc1sndGVtcGxhdGVjb250ZW50MiddKTs7CgkkdGhpcy0+U2V0VGVtcGxhdGUoJ2ZldXNlcnNfZm9yZ290cGFzc3dvcmR2ZXJpZnlmb3JtJywgJHBhcmFtc1sndGVtcGxhdGVjb250ZW50MyddKTs7CiAgICAgIH0KICAgICR0aGlzLT5teVJlZGlyZWN0VG9UYWIoJGlkLCAnZm9yZ290cGFzc3dvcmRfdGVtcGxhdGUnICk7CiAgfQoKCiAgZnVuY3Rpb24gX0RvU2V0TG9naW5UZW1wbGF0ZSggJGlkLCAmJHBhcmFtcywgJHJldHVybmlkICkKICB7CiAgICBpZiggaXNzZXQoICRwYXJhbXNbJ2RlZmF1bHRzJ10gKSApCiAgICAgIHsKCSR0aGlzLT5TZXRUZW1wbGF0ZSgnZmV1c2Vyc19sb2dpbmZvcm0nLCAkdGhpcy0+ZGZsdF9sb2dpbmZvcm10ZW1wbGF0ZSk7CiAgICAgIH0KICAgIGVsc2UKICAgICAgewoJJHRoaXMtPlNldFRlbXBsYXRlKCdmZXVzZXJzX2xvZ2luZm9ybScsICRwYXJhbXNbJ3RlbXBsYXRlbG9naW5mb3JtJ10pOwogICAgICB9CiAgICAkdGhpcy0+bXlSZWRpcmVjdFRvVGFiKCRpZCwgJ2xvZ2ludGVtcGxhdGUnICk7CiAgfQoKICAKICBmdW5jdGlvbiBfRG9TZXRMb2dvdXRUZW1wbGF0ZSggJGlkLCAmJHBhcmFtcywgJHJldHVybmlkICkKICB7CiAgICBpZiggaXNzZXQoICRwYXJhbXNbJ2RlZmF1bHRzJ10gKSApCiAgICAgIHsKCSR0aGlzLT5TZXRUZW1wbGF0ZSgnZmV1c2Vyc19sb2dvdXRmb3JtJywgJHRoaXMtPmRmbHRfbG9nb3V0Zm9ybXRlbXBsYXRlKTsKICAgICAgfQogICAgZWxzZQogICAgICB7CgkkdGhpcy0+U2V0VGVtcGxhdGUoJ2ZldXNlcnNfbG9nb3V0Zm9ybScsICRwYXJhbXNbJ3RlbXBsYXRlbG9nb3V0Zm9ybSddKTsKICAgICAgfQogICAgJHRoaXMtPm15UmVkaXJlY3RUb1RhYigkaWQsICdsb2dvdXR0ZW1wbGF0ZScsICRwYXJhbXMpOwogIH0KCiAgCiAgZnVuY3Rpb24gX0RvU2V0UHJlZnMoICRpZCwgJiRwYXJhbXMsICRyZXR1cm5pZCApCiAgewogICAgaWYoIGlzc2V0KCAkcGFyYW1zWydpbnB1dF9yZW1vdmVhbGwnXSApICkKICAgICAgewoJJHRoaXMtPkV4cGlyZVRlbXBDb2RlcygnLTUgeWVhcnMnKTsKCXJldHVybjsKICAgICAgfQoKICAgIGlmKCBpc3NldCggJHBhcmFtc1snaW5wdXRfcmVtb3ZlMXdlZWsnXSApICkKICAgICAgewoJJHRoaXMtPkV4cGlyZVRlbXBDb2RlcygnLTEgd2VlaycpOwoJJHRoaXMtPm15UmVkaXJlY3RUb1RhYigkaWQsICdwcmVmcycpOwogICAgICB9CgogICAgaWYoIGlzc2V0KCAkcGFyYW1zWydpbnB1dF9yZW1vdmUxbW9udGgnXSApICkKICAgICAgewoJJHRoaXMtPkV4cGlyZVRlbXBDb2RlcygnLTEgbW9udGgnKTsKCSR0aGlzLT5teVJlZGlyZWN0VG9UYWIoJGlkLCAncHJlZnMnKTsKICAgICAgfQoKICAgIGlmKCBpc3NldCggJHBhcmFtc1snY2FuY2VsJ10gKSApCiAgICAgIHsKCSR0aGlzLT5teVJlZGlyZWN0VG9UYWIoJGlkLCAncHJlZnMnICk7CiAgICAgIH0KCiAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgnbWluX3Bhc3N3b3JkbGVuZ3RoJywkcGFyYW1zWydpbnB1dF9taW5wd2xlbiddKTsKICAgICR0aGlzLT5TZXRQcmVmZXJlbmNlKCdtYXhfcGFzc3dvcmRsZW5ndGgnLCRwYXJhbXNbJ2lucHV0X21heHB3bGVuJ10pOwogICAgJHRoaXMtPlNldFByZWZlcmVuY2UoJ21pbl91c2VybmFtZWxlbmd0aCcsJHBhcmFtc1snaW5wdXRfbWludW5sZW4nXSk7CiAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgnbWF4X3VzZXJuYW1lbGVuZ3RoJywkcGFyYW1zWydpbnB1dF9tYXh1bmxlbiddKTsKICAgICR0aGlzLT5TZXRQcmVmZXJlbmNlKCd1c2VyX3Nlc3Npb25fZXhwaXJlcycsICRwYXJhbXNbJ2lucHV0X3Nlc3Npb250aW1lb3V0J10pOwogICAgJHRoaXMtPlNldFByZWZlcmVuY2UoJ2RlZmF1bHRfZ3JvdXAnLCAkcGFyYW1zWydpbnB1dF9kZmx0Z3JvdXAnXSk7CiAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgnZG9fc210cF92YWxpZGF0ZV9lbWFpbCcsICRwYXJhbXNbJ2lucHV0X3NtdHB2YWxpZGF0ZSddKTsKICAgICR0aGlzLT5TZXRQcmVmZXJlbmNlKCdyZXF1aXJlZF9maWVsZF9tYXJrZXInLCAkcGFyYW1zWydpbnB1dF9yZXF1aXJlZGZpZWxkbWFya2VyJ10pOwogICAgJHRoaXMtPlNldFByZWZlcmVuY2UoJ3JlcXVpcmVkX2ZpZWxkX2NvbG9yJywgJHBhcmFtc1snaW5wdXRfcmVxdWlyZWRmaWVsZGNvbG9yJ10pOwogICAgJHRoaXMtPlNldFByZWZlcmVuY2UoJ3JlcXVpcmVfb25lZ3JvdXAnLCAkcGFyYW1zWydpbnB1dF9yZXF1aXJlb25lZ3JvdXAnXSk7CiAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgnaGlkZGVuX2ZpZWxkX21hcmtlcicsICRwYXJhbXNbJ2lucHV0X2hpZGRlbmZpZWxkbWFya2VyJ10pOwogICAgJHRoaXMtPlNldFByZWZlcmVuY2UoJ2hpZGRlbl9maWVsZF9jb2xvcicsICRwYXJhbXNbJ2lucHV0X2hpZGRlbmZpZWxkY29sb3InXSk7CiAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgncGFnZWlkZm9yZ290cGFzc3dkJywgJHBhcmFtc1snaW5wdXRfZm9yZ290cHdfcGFnZSddKTsKICAgICR0aGlzLT5TZXRQcmVmZXJlbmNlKCdwYWdlaWRfY2hhbmdlc2V0dGluZ3MnLCAkcGFyYW1zWydpbnB1dF9jaGFuZ2VzZXR0aW5nc19wYWdlJ10pOwogICAgJHRoaXMtPlNldFByZWZlcmVuY2UoJ3BhZ2VpZF9sb2dpbicsICRwYXJhbXNbJ2lucHV0X2xvZ2luX3BhZ2UnXSk7CiAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgncGFnZWlkX2xvZ291dCcsICRwYXJhbXNbJ2lucHV0X2xvZ291dF9wYWdlJ10pOwogICAgCiAgICAkdGhpcy0+bXlSZWRpcmVjdFRvVGFiKCRpZCwgJ3ByZWZzJyk7CiAgfQoKICAKICBmdW5jdGlvbiBfRG9TZXRQcm9wZXJ0aWVzKCAkaWQsICYkcGFyYW1zLCAkcmV0dXJuaWQgKQogIHsKICAgIGlmKCBpc3NldCggJHBhcmFtc1snY2FuY2VsJ10gKSApCiAgICAgIHsKCS8vIHdlIGFyZSBjYW5jZWxsaW5nCgkkdGhpcy0+bXlSZWRpcmVjdFRvVGFiICgkaWQsICdwcm9wZXJ0aWVzJyApOwogICAgICB9CgogICAgLy8gY2hlY2sgaWYgd2UgYXJlIGFkZGluZyBhIHByb3BlcnR5CiAgICBpZiggaXNzZXQoICRwYXJhbXNbJ3Byb3BhZGQnXSApICkKICAgICAgewoJLy8geXVwCgkvLyB2YWxpZGF0ZSBmaWVsZHMKCSRuYW1lID0gdHJpbSgkcGFyYW1zWydpbnB1dF9uYW1lJ10pOwoJJG5hbWUgPSBzdHJ0b2xvd2VyKHByZWdfcmVwbGFjZSgnLyAvJywnXycsJG5hbWUpKTsKCSRwcm9tcHQgPSB0cmltKCRwYXJhbXNbJ2lucHV0X3Byb21wdCddKTsKCSRsZW5ndGggPSB0cmltKCRwYXJhbXNbJ2lucHV0X2xlbmd0aCddKTsKCSR0eXBlID0gJHBhcmFtc1snaW5wdXRfdHlwZSddOwoKCWlmKCAkbmFtZSA9PSAnJyB8fCAkcHJvbXB0ID09ICcnICkKCSAgewoJICAgICRwYXJhbXNbJ2Vycm9yJ10gPSAxOwoJICAgICRwYXJhbXNbJ21lc3NzYWdlJ10gPSAkdGhpcy0+TGFuZygnZXJyb3JfaW5zdWZmaWNpZW50cGFyYW1zJyk7CgkgICAgJHRoaXMtPm15UmVkaXJlY3RUb1RhYiggJGlkLCAncHJvcGVydGllcycsICRwYXJhbXMgKTsKCSAgICByZXR1cm47CgkgIH0KCglpZiggaXNzZXQoJHBhcmFtc1sncHJvcGRlZm4nXSkgKQoJICB7CgkgICAgJHByb3BzID0gc3BsaXQoIiwiLCRwYXJhbXNbJ3Byb3BkZWZuJ10pOwoJICAgIGZvcmVhY2goICRwcm9wcyBhcyAkcHJvcCApCgkgICAgewoJICAgICAgbGlzdCggJGVuYW1lLCAkZXByb21wdCwgJGV0eXBlLCAkZWxlbmd0aCApID0gc3BsaXQoIjsiLCRwcm9wKTsKCSAgICAgIGlmKCAkbmFtZSA9PSAkZW5hbWUgKSAKCQl7CgkJICAvLyBuYW1lIGlzIGFscmVhZHkgdGFrZW4KCQkgICRwYXJhbXNbJ2Vycm9yJ10gPSAxOwoJCSAgJHBhcmFtc1snbWVzc2FnZSddID0gJHRoaXMtPkxhbmcoJ2Vycm9yX2R1cGxpY2F0ZW5hbWUnKTsKCQkgICR0aGlzLT5teVJlZGlyZWN0VG9UYWIoICRpZCwgJ3Byb3BlcnRpZXMnLCAkcGFyYW1zICk7CgkJICByZXR1cm47CgkJfQoJICAgIH0KCSAgfQoKCSRlbnRyeSA9IGltcGxvZGUoIjsiLGFycmF5KCRuYW1lLCRwcm9tcHQsJHR5cGUsJGxlbmd0aCkpOwoJaWYoIGlzc2V0KCRwYXJhbXNbJ3Byb3BkZWZuJ10pKQoJICB7CgkgICAgJHBhcmFtc1sncHJvcGRlZm4nXSAuPSAiLCIuJGVudHJ5OwoJICB9CgllbHNlIAoJICB7CgkgICAgJHBhcmFtc1sncHJvcGRlZm4nXSA9ICRlbnRyeTsKCSAgfQoJJHBhcmFtc1snZG9ub3Rsb2FkcHJvcHMnXSA9IDE7CgkkdGhpcy0+bXlSZWRpcmVjdFRvVGFiKCAkaWQsICdwcm9wZXJ0aWVzJywgJHBhcmFtcyApOwoJcmV0dXJuOwogICAgICB9CiAgICBlbHNlIGlmKCBhcnJheV9rZXlfZXhpc3RzX3N1YnN0ciggJHBhcmFtcywgJ3Byb3BlZGl0XycpICYmIGlzc2V0KCRwYXJhbXNbJ3Byb3BkZWZuJ10pKQogICAgICB7CgkkayA9IGFycmF5X2ZpbmRfa2V5X3JlZ2V4cCggJHBhcmFtcywgJy9ecHJvcGVkaXRfLycgKTsKCSRwb3MxID0gc3RycG9zKCAkaywgJy0nICk7CgkkcG9zMiA9IHN0cnJwb3MoICRrLCAnXycgKTsKCSRrZXkgID0gc3Vic3RyKCAkayAsICRwb3MxKzEsICRwb3MyIC0gJHBvczEgLSAxKTsKCgkvLyB3ZSdyZSBlZGl0aW5nIGEgcHJvcGVydHkKCS8vIHNvIHdlIHRha2UgdGhlIGN1cnJlbnQgcHJvcGVydHkgKCRrZXkpIGFuZCByZW1vdmUgaXQKCS8vIGZyb20gcHJvcHMsIGFuZCBwdXQgaXQgaW4gdGhlIHBhcmFtcwoJJHByb3BzID0gc3BsaXQoJywnLCRwYXJhbXNbJ3Byb3BkZWZuJ10pOwoJJG5ld3Byb3BzID0gIiI7Cglmb3JlYWNoKCAkcHJvcHMgYXMgJHAgKQoJewoJICAkYXByb3AgPSBzcGxpdCgiOyIsJHApOwoJICBpZiggJGFwcm9wWzBdID09ICRrZXkgKQoJICAgIHsKCSAgICAgICRwYXJhbXNbJ2lucHV0X25hbWUnXSA9ICRhcHJvcFswXTsKCSAgICAgICRwYXJhbXNbJ2lucHV0X3Byb21wdCddID0gJGFwcm9wWzFdOwoJICAgICAgJHBhcmFtc1snaW5wdXRfdHlwZSddID0gJGFwcm9wWzJdOwoJICAgICAgJHBhcmFtc1snaW5wdXRfbGVuZ3RoJ10gPSAkYXByb3BbM107CgkgICAgfQoJICBlbHNlIAoJICAgIHsKCSAgICAgIGlmKCAkbmV3cHJvcHMgPT0gJycgKQoJCXsKCQkgICRuZXdwcm9wcyA9ICRwOwoJCX0KCSAgICAgIGVsc2UKCQl7CgkJICAkbmV3cHJvcHMgPSAkbmV3cHJvcHMuIiwiLiRwOwoJCX0KCSAgICB9Cgl9CgkkcGFyYW1zWydwcm9wZGVmbiddID0gJG5ld3Byb3BzOwoJJHBhcmFtc1snZG9ub3Rsb2FkcHJvcHMnXSA9IDE7CgkkdGhpcy0+bXlSZWRpcmVjdFRvVGFiKCAkaWQsICdwcm9wZXJ0aWVzJywgJHBhcmFtcyApOwoJcmV0dXJuOwogICAgICB9CiAgICBlbHNlIGlmKCBhcnJheV9rZXlfZXhpc3RzX3N1YnN0ciggJHBhcmFtcywgJ3Byb3BkZWxldGVfJykgJiYgaXNzZXQoJHBhcmFtc1sncHJvcGRlZm4nXSkpCiAgICAgIHsKCSRrID0gYXJyYXlfZmluZF9rZXlfcmVnZXhwKCAkcGFyYW1zLCAnL15wcm9wZGVsZXRlXy8nICk7CglsaXN0KCAkanVuaywgJGtleSApID0gc3BsaXQoICJfIiwgJGsgKTsKCgkvLyB3ZSdyZSBkZWxldGluZyBhIHByb3BlcnR5CgkvLyBzbyB3ZSB0YWtlIHRoZSBjdXJyZW50IHByb3BlcnR5ICgka2V5KSBhbmQgcmVtb3ZlIGl0CgkvLyBmcm9tIHByb3BzLCAKCSRwcm9wcyA9IHNwbGl0KCcsJywkcGFyYW1zWydwcm9wZGVmbiddKTsKCSRuZXdwcm9wcyA9ICIiOwoJZm9yZWFjaCggJHByb3BzIGFzICRwICkKCXsKCSAgJGFwcm9wID0gc3BsaXQoIjsiLCRwKTsKCSAgaWYoICRhcHJvcFswXSA9PSAka2V5ICkKCSAgICB7CgkgICAgICBjb250aW51ZTsKCSAgICB9CgkgIGVsc2UgCgkgICAgewoJICAgICAgaWYoICRuZXdwcm9wcyA9PSAnJyApCgkJewoJCSAgJG5ld3Byb3BzID0gJHA7CgkJfQoJICAgICAgZWxzZQoJCXsKCQkgICRuZXdwcm9wcyA9ICRuZXdwcm9wcy4iLCIuJHA7CgkJfQoJICAgIH0KCX0KCSRwYXJhbXNbJ3Byb3BkZWZuJ10gPSAkbmV3cHJvcHM7CgkkcGFyYW1zWydkb25vdGxvYWRwcm9wcyddID0gMTsKICAgICAgICAkdGhpcy0+bXlSZWRpcmVjdFRvVGFiKCAkaWQsICdwcm9wZXJ0aWVzJywgJHBhcmFtcyApOwoJcmV0dXJuOwogICAgICB9CgoKICAgIC8vIHdlJ3JlIHN1Ym1pdHRpbmcgdGhlIHByb3BlcnR5IGRlZmluaXRpb25zCiAgICAkcHJvcHMgPSBzcGxpdCgnLCcsJHBhcmFtc1sncHJvcGRlZm4nXSk7CiAgICAkdGhpcy0+RGVsZXRlUHJvcGVydHlEZWZucygpOwogICAgZm9yZWFjaCggJHByb3BzIGFzICRwcm9wICkKICAgIHsKICAgICAgJGFwcm9wID0gc3BsaXQoIjsiLCRwcm9wKTsKCiAgICAgICRyZXQgPSAkdGhpcy0+QWRkUHJvcGVydHlEZWZuKCAkYXByb3BbMF0sICRhcHJvcFsxXSwgJGFwcm9wWzJdLCAkYXByb3BbM10sICRhcHJvcFs0XSApOwogICAgICBpZiggJHJldFswXSA9PSBmYWxzZSApCgl7CgkgIC8vIG5hbWUgaXMgYWxyZWFkeSB0YWtlbgoJICAkdGhpcy0+bXlSZWRpcmVjdFRvVGFiKCRpZCwgJ3Byb3BlcnRpZXMnICk7CgkgIHJldHVybjsKCX0KICAgIH0KCiAgICAkdGhpcy0+bXlSZWRpcmVjdFRvVGFiKCRpZCwgJ3Byb3BlcnRpZXMnLCAkcGFyYW1zICk7CiAgICByZXR1cm47CiAgfQoKCiAgZnVuY3Rpb24gX0RvVXNlckFjdGlvbiggJGlkLCAmJHBhcmFtcywgJHJldHVybmlkICkKICB7CiAgICBpZiggaXNzZXQoICRwYXJhbXNbJ2Zvcm0nXSApICkKICAgICAgewoJc3dpdGNoKCAkcGFyYW1zWydmb3JtJ10gKSAKCSAgewoJICBjYXNlICdsb2dpbic6CgkgICAgJHRoaXMtPl9HZXRVc2VyTG9naW5Gb3JtKCRpZCwkcGFyYW1zLCRyZXR1cm5pZCk7CgkgICAgYnJlYWs7CgkgIGNhc2UgJ2xvZ291dCc6CgkgICAgJHRoaXMtPl9HZXRVc2VyTG9nb3V0Rm9ybSgkaWQsJHBhcmFtcywkcmV0dXJuaWQpOwoJICAgIGJyZWFrOwoJICBjYXNlICdmb3Jnb3Rwdyc6CgkgICAgJHRoaXMtPl9EaXNwbGF5VXNlckZvcmdvdFBhc3N3b3JkUGFnZSggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKTsKCSAgICBicmVhazsKCSAgY2FzZSAnY2hhbmdlc2V0dGluZ3MnOgoJICAgICR0aGlzLT5fRGlzcGxheVVzZXJTZXR0aW5nc1BhZ2UoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICk7CgkgICAgYnJlYWs7CgkgIH0KCXJldHVybjsKICAgICAgfQoKICAgIGlmKCAhJHRoaXMtPkxvZ2dlZEluKCkgKSAKICAgICAgewoJJHRoaXMtPl9HZXRVc2VyTG9naW5Gb3JtKCRpZCwkcGFyYW1zLCRyZXR1cm5pZCk7CiAgICAgIH0KICAgIGVsc2UgCiAgICAgIHsKCSR0aGlzLT5fR2V0VXNlckxvZ291dEZvcm0oJGlkLCRwYXJhbXMsJHJldHVybmlkKTsKICAgICAgfQogIH0KCgogIGZ1bmN0aW9uIF9Eb1VzZXJDaGFuZ2VTZXR0aW5ncyggJGlkLCAmJHBhcmFtcywgJHJldHVybmlkICkKICB7CiAgICAkdWlkID0gJHRoaXMtPkxvZ2dlZEluSWQoKTsKICAgIGlmKCAkdWlkID09IGZhbHNlICkgCiAgICAgIHsKCS8vIHVzZXIgaXNuJ3QgbG9nZ2VkIGluCgkkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UoICRpZCwgJHBhcmFtcywgJHJldHVybmlkLCAKCQkJCSAgJHRoaXMtPkxhbmcoJ2Vycm9yX25vdGxvZ2dlZGluJykpOwoJcmV0dXJuOwogICAgICB9CiAgICAkcmVzdWx0ID0gJHRoaXMtPkdldFVzZXJJbmZvKCAkdWlkICk7CiAgICBpZiggJHJlc3VsdFswXSA9PSBGQUxTRSApCiAgICAgIHsKCS8vIHVzZXIgaXNuJ3QgbG9nZ2VkIGluCgkkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UoICRpZCwgJHBhcmFtcywgJHJldHVybmlkLCAKCQkJCSAgJHJlc3VsdFsxXSk7CglyZXR1cm47CiAgICAgIH0KICAgICR1aW5mbyA9ICRyZXN1bHRbMV07CgogICAgJHBhc3N3b3JkID0gdHJpbSgkcGFyYW1zWydpbnB1dF9wYXNzd29yZCddKTsKICAgICRyZXBlYXQgICA9IHRyaW0oJHBhcmFtc1snaW5wdXRfcmVwZWF0cGFzc3dvcmQnXSk7CiAgICBpZiggJHBhc3N3b3JkICE9ICRyZXBlYXQgJiYgJHBhc3N3b3JkICE9ICcnKQogICAgICB7CgkkcGFyYW1zWydlcnJvciddID0gMTsKCSRwYXJhbXNbJ21lc3NhZ2UnXSA9ICR0aGlzLT5MYW5nKCdlcnJvcl9wYXNzd29yZG1pc21hdGNoJyk7CgkkdGhpcy0+UmVkaXJlY3QoJGlkLCAnY2hhbmdlc2V0dGluZ3MnLCAkcmV0dXJuaWQsICRwYXJhbXMgKTsKICAgICAgfQoKICAgIC8vIGRvIHZhbGlkYXRpb24gb2YgdGhlIGZpZWxkcy4KICAgIGZvcmVhY2goICRwYXJhbXMgYXMgJGtleSA9PiAkdmFsICkKICAgIHsKICAgICAgaWYoIHByZWdfbWF0Y2goICcvXmhpZGRlbl8vJywgJGtleSApICkKCXsKCSAgJHByb3BuYW1lID0gc3Vic3RyKCAka2V5LCBzdHJsZW4oJ2hpZGRlbl8nKSk7CgkgICRhcnIgPSBzcGxpdCgiOyIsJHBhcmFtc1ska2V5XSk7CgkgICRyZXF1aXJlZCA9ICRhcnJbM107CgkgIGlmKCAkcmVxdWlyZWQgPT0gMiAmJiAKCSAgICAgICghaXNzZXQoJHBhcmFtc1snaW5wdXRfJy4kcHJvcG5hbWVdKSB8fCAkcGFyYW1zWydpbnB1dF8nLiRwcm9wbmFtZV0gPT0gJycgKSApCgkgICAgewoJICAgICAgJHBhcmFtc1snZXJyb3InXSA9IDE7CgkgICAgICAkcGFyYW1zWydtZXNzYWdlJ10gPSAkdGhpcy0+TGFuZygnZXJyb3JfcmVxdWlyZWRmaWVsZCcsJHByb3BuYW1lKTsKCSAgICAgICR0aGlzLT5SZWRpcmVjdCggJGlkLCAnY2hhbmdlc2V0dGluZ3MnLCAkcmV0dXJuaWQsICRwYXJhbXMgKTsKCSAgICB9CgoJICBpZiggJGFyclsxXSA9PSAnMicgKQoJICAgIHsKCSAgICAgICRyZXN1bHQgPSAkdGhpcy0+SXNWYWxpZEVtYWlsQWRkcmVzcyggJHBhcmFtc1snaW5wdXRfJy4kcHJvcG5hbWVdLAoJCQkJCQkgICAgJHRoaXMtPkdldFByZWZlcmVuY2UoJ2RvX3NtdHBfdmFsaWRhdGVfZW1haWwnKSApOwoJICAgICAgaWYoICRyZXN1bHRbMF0gPT0gZmFsc2UgKQoJCXsKCQkgICRwYXJhbXNbJ2Vycm9yJ10gPSAxOwoJCSAgJHBhcmFtc1snbWVzc2FnZSddID0gJHJlc3VsdFsxXTsKCQkgICR0aGlzLT5SZWRpcmVjdCggJGlkLCAnY2hhbmdlc2V0dGluZ3MnLCAkcmV0dXJuaWQsICRwYXJhbXMgKTsKCQl9CgkgICAgfQoJfQogICAgfQoKICAgIC8vCiAgICAvLyBub3cgd2UgYWN0dWFsbHkgY2hhbmdlIHRoZSB1c2VyIHNldHRpbmdzCiAgICAvLwoKICAgIC8vIHBhc3N3b3JkCiAgICBpZiggJHBhc3N3b3JkICE9ICcnKQogICAgICB7CgkkcmVzdWx0ID0gJHRoaXMtPlNldFVzZXIoICR1aWQsICR1aW5mb1sndXNlcm5hbWUnXSwgJHBhc3N3b3JkLCAkdWluZm9bJ2V4cGlyZXMnXSApOwoJaWYoICRyZXN1bHRbMF0gPT0gRkFMU0UgKQoJICB7CgkgICAgJHBhcmFtc1snZXJyb3InXSA9IDE7CgkgICAgJHBhcmFtc1snbWVzc2FnZSddID0gJHJlc3VsdFsxXTsKCSAgICAkdGhpcy0+UmVkaXJlY3QoICRpZCwgJ2NoYW5nZXNldHRpbmdzJywgJHJldHVybmlkLCAkcGFyYW1zICk7CgkgIH0KICAgICAgfQoKICAgIC8vIG5vdyB0aGUgcHJvcGVydGllcwogICAgJHRoaXMtPkRlbGV0ZVVzZXJQcm9wZXJ0eUZ1bGwoICIiLCAkdWlkLCB0cnVlICk7CgogICAgZm9yZWFjaCggJHBhcmFtcyBhcyAka2V5ID0+ICR2YWwgKQogICAgewogICAgICBpZiggcHJlZ19tYXRjaCggJy9eaGlkZGVuXy8nLCAka2V5ICkgKQoJewoJICAkcHJvcG5hbWUgPSBzdWJzdHIoICRrZXksIHN0cmxlbignaGlkZGVuXycpKTsKCSAgJGFyciA9IHNwbGl0KCI7IiwkcGFyYW1zWyRrZXldKTsKCSAgaWYoIGlzc2V0KCAkcGFyYW1zWydpbnB1dF8nLiRwcm9wbmFtZV0gKSApCgkgICAgewoJICAgICAgJHZhbCA9ICRwYXJhbXNbJ2lucHV0XycuJHByb3BuYW1lXTsKCSAgICAgICRyZXQgPSAkdGhpcy0+U2V0VXNlclByb3BlcnR5RnVsbCggJHByb3BuYW1lLCAkdmFsLCAkdWlkICk7CgkgICAgICBpZiggJHJldCA9PSBmYWxzZSApCgkJewoJCSAgJHBhcmFtc1snZXJyb3InXSA9IDE7CgkJICAkcGFyYW1zWydtZXNzYWdlJ10gPSAkdGhpcy0+bGFuZygnZXJyb3InKTsKCQkgICR0aGlzLT5SZWRpcmVjdCggJGlkLCAnY2hhbmdlc2V0dGluZ3MnLCAkcmV0dXJuaWQsICRwYXJhbXMgKTsKCQkgIHJldHVybjsKCQl9CgkgICAgfQoJfQogICAgfQoKICAgIGlmKCBpc3NldCggJHBhcmFtc1snaW5wdXRfcmV0dXJudG8nXSApICkKICAgICAgewoJJGlkID0gQ29udGVudE1hbmFnZXI6OkdldFBhZ2VJREZyb21BbGlhcyggJHBhcmFtc1snaW5wdXRfcmV0dXJudG8nXSApOwoJaWYoICRpZCApCgkgIHsKCSAgICAkdGhpcy0+UmVkaXJlY3RDb250ZW50KCAkaWQgKTsKCSAgICByZXR1cm47CgkgIH0KICAgICAgfQoKICAgIC8vIGFuZCByZWRpcmVjdCBiYWNrIHRvIGRlZmF1bHQKICAgICR0aGlzLT5SZWRpcmVjdENvbnRlbnQoIENvbnRlbnRNYW5hZ2VyOjpHZXREZWZhdWx0UGFnZUlEKCkgKTsKICB9CgogIGZ1bmN0aW9uIF9EaXNwbGF5QWRtaW5BZG1pblRhYiggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKQogIHsKICAgIC8vIGEgZm9ybSBmb3IgcGVyZm9ybWluZyB2YXJpb3VzIGFkbWluIHRhc2tzCiAgICAvLyBsaWtlIGV4cG9ydGluZyB1c2VycyB0byBDU1YsIHJlc2V0dGluZyBleHBpcnkgZGF0ZXMsIGV0YywgZXRjLgogICAgCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3N0YXJ0Zm9ybScsICR0aGlzLT5DcmVhdGVGb3JtU3RhcnQoICRpZCwgJ2RvX2FkbWludGFza3MnICkgKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignZW5kZm9ybScsJHRoaXMtPkNyZWF0ZUZvcm1FbmQoKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3Byb21wdF9leHBvcnQnLCR0aGlzLT5MYW5nKCdwcm9tcHRfZXhwb3J0Y3N2JykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpbnB1dF9leHBvcnQnLAoJCQkgICR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCgkaWQsJ2J1dHRvbl9leHBvcnQnLAoJCQkJCQkgICAkdGhpcy0+TGFuZygnZXhwb3J0Y3N2JykpKTsKICAgIGVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZSgnYWRtaW50YXNrcy50cGwnKTsKICB9CgogIGZ1bmN0aW9uIF9EaXNwbGF5QWRtaW5BZGRHcm91cFBhZ2UoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICkKICB7CiAgICAkcHJvcGRlZm4gPSAkdGhpcy0+R2V0UHJvcGVydHlEZWZucygpOwogICAgaWYoIGNvdW50KCRwcm9wZGVmbikgPT0gMCApCiAgICAgIHsKCSR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSgkaWQsICRwYXJhbXMsICRyZXR1cm5pZCwKCQkJCSAkdGhpcy0+TGFuZygnZXJyb3Jfbm9wcm9wZXJ0aWVzJykpOwoJcmV0dXJuOwogICAgICB9CgogICAgLy8gcG9wdWxhdGUgdGhlIHRlbXBsYXRlCiAgICBpZiggaXNzZXQoICRwYXJhbXNbJ2Vycm9yJ10gKSApCiAgICAgIHsKCSR0aGlzLT5zbWFydHktPmFzc2lnbignZXJyb3InLCRwYXJhbXNbJ2Vycm9yJ10pOwogICAgICB9CiAgICBpZiggaXNzZXQoICRwYXJhbXNbJ21lc3NhZ2UnXSApICkKICAgICAgewoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdtZXNzYWdlJywkcGFyYW1zWydtZXNzYWdlJ10pOwogICAgICB9CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3RpdGxlJywgJHRoaXMtPkxhbmcoJ2FkZGdyb3VwJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnc3RhcnRmb3JtJywKCQkJCSAgJHRoaXMtPkNyZWF0ZUZvcm1TdGFydCAoJGlkLAoJCQkJCQkJICAnZG9fYWRkZ3JvdXAnLAoJCQkJCQkJICAkcmV0dXJuaWQpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2VuZGZvcm0nLCAkdGhpcy0+Q3JlYXRlRm9ybUVuZCAoKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdzdWJtaXQnLAoJCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQgKCRpZCwgJ3N1Ym1pdCcsCgkJCQkJCQkgICAgJHRoaXMtPkxhbmcoJ3N1Ym1pdCcpKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdjYW5jZWwnLAoJCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQgKCRpZCwgJ2NhbmNlbCcsCgkJCQkJCQkgICAgJHRoaXMtPkxhbmcoJ2NhbmNlbCcpKSk7CiAgICAKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ3Byb21wdF9ncm91cG5hbWUnLAoJCQkgICAkdGhpcy0+TGFuZyAoJ25hbWUnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdpbnB1dF9ncm91cG5hbWUnLAoJCQkgICAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0ICgkaWQsICdpbnB1dF9ncm91cG5hbWUnLAoJCQkJCQkgICAiIiwgMjAsIDgwKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdwcm9tcHRfZ3JvdXBkZXNjJywKCQkJICAgJHRoaXMtPkxhbmcgKCdkZXNjcmlwdGlvbicpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2lucHV0X2dyb3VwZGVzYycsCgkJCSAgICR0aGlzLT5DcmVhdGVJbnB1dFRleHQgKCRpZCwgJ2lucHV0X2dyb3VwZGVzYycsCgkJCQkJCSAgICIiLCA4MCwgMjU1KSk7ICAgIAoKICAgIC8vIGRpc3BsYXkgYSBsaXN0IG9mIHRoZSBwcm9wZXJ0aWVzIGluIGEgZm9ybQogICAgLy8gdG8gYWxsb3cgdGhlIHVzZXIgdG8gcGljayB3aGljaCBvbmVzIGFyZSByZXF1aXJlZCBhbmQgd2hpY2ggb25lcyBhcmVudC4KICAgICRyb3dhcnJheSA9IGFycmF5KCk7CiAgICAkcm93Y2xhc3MgPSAncm93MSc7CiAgICAka2V5cyA9IGFycmF5X2tleXMoJHRoaXMtPnR5cGVzKTsKICAgICRvcHRpb25zID0gYXJyYXkoICR0aGlzLT5MYW5nKCdvZmYnKSA9PiAwLAoJCSAgICAgICR0aGlzLT5MYW5nKCdvcHRpb25hbCcpID0+IDEsCgkJICAgICAgJHRoaXMtPkxhbmcoJ3JlcXVpcmVkJykgPT4gMiwKCQkgICAgICAkdGhpcy0+TGFuZygnaGlkZGVuJykgPT4gMyk7CiAgICAKICAgIGZvcmVhY2goICRwcm9wZGVmbiBhcyAkZGVmbiApCiAgICAgIHsKCSRvbmVyb3cgPSBuZXcgU3RkQ2xhc3MoKTsKICAgICAgICAkb25lcm93LT5uYW1lID0gJGRlZm5bJ25hbWUnXTsKICAgICAgICAkb25lcm93LT5wcm9tcHQgPSAkZGVmblsncHJvbXB0J107Cgkkb25lcm93LT50eXBlID0gJHRoaXMtPkxhbmcoICRrZXlzWyRkZWZuWyd0eXBlJ11dICk7Cgkkb25lcm93LT5zb3J0b3JkZXIgPSAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCAkaWQsICdpbnB1dF9zb3J0b3JkZXJfJy4kZGVmblsnbmFtZSddLCAnJywgMywgMiApOwoJJG9uZXJvdy0+cmVxdWlyZWQgPSAkdGhpcy0+Q3JlYXRlSW5wdXRSYWRpb0dyb3VwKCAkaWQsICdpbnB1dF9yZXF1aXJlZF8nLiRkZWZuWyduYW1lJ10sICRvcHRpb25zICk7Cgkkb25lcm93LT5yb3djbGFzcyA9ICRyb3djbGFzczsKCglhcnJheV9wdXNoICgkcm93YXJyYXksICRvbmVyb3cpOwoJKCRyb3djbGFzcyA9PSAicm93MSIgPyAkcm93Y2xhc3MgPSAicm93MiIgOiAkcm93Y2xhc3MgPSAicm93MSIpOwogICAgICB9CgogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdwcm9wcycsICRyb3dhcnJheSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3Byb3Bjb3VudCcsY291bnQoJHJvd2FycmF5KSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3NvcnRvcmRlcnRleHQnLCAkdGhpcy0+TGFuZygnc29ydG9yZGVyJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCduYW1ldGV4dCcsJHRoaXMtPkxhbmcoJ25hbWUnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3Byb21wdHRleHQnLCAkdGhpcy0+TGFuZygncHJvbXB0JykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCd0eXBldGV4dCcsJHRoaXMtPkxhbmcoJ3R5cGUnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3JlcXVpcmVkdGV4dCcsJHRoaXMtPkxhbmcoJ3JlcXVpcmVkJykpOwoKICAgIC8vIERpc3BsYXkgdGhlIHBvcHVsYXRlZCB0ZW1wbGF0ZQogICAgZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlICgnYWRkZ3JvdXAudHBsJyk7CiAgfQoKCiAgZnVuY3Rpb24gX0Rpc3BsYXlBZG1pbkFkZFByb3BlcnR5UGFnZSggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKQogIHsKICAgICR0aGlzLT5fZGVidWdhcnJheSgkcGFyYW1zLCAicmVjZWl2ZWQgcGFyYW1zIik7CgogICAgaWYoIGlzc2V0KCAkcGFyYW1zWydlZGl0cHJvcCddICkgKXsKICAgICAgaWYoIGlzc2V0KCRwYXJhbXNbJ29yaWdfdHlwZSddKSAmJiAkcGFyYW1zWydvcmlnX3R5cGUnXSA9PSAkcGFyYW1zWyduZXdfdHlwZSddICl7CgkkcGFyYW1zWydpbnB1dF90eXBlJ10gPSAkcGFyYW1zWyduZXdfdHlwZSddOwoJJHRoaXMtPlJlZGlyZWN0KCRpZCwgJ2RvX2VkaXRwcm9wJywkcmV0dXJuaWQsICRwYXJhbXMpOwoJcmV0dXJuOwogICAgICB9CiAgICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiggJ3N0YXJ0Zm9ybScsIAoJCQkgICAgICR0aGlzLT5DcmVhdGVGb3JtU3RhcnQoJGlkLCdlZGl0cHJvcCcsJHJldHVybmlkKSk7CiAgICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiggJ2hpZGRlbicsCgkJCSAgICAgJHRoaXMtPkNyZWF0ZUlucHV0SGlkZGVuKCRpZCwncHJvcG5hbWUnLCRwYXJhbXNbJ2VkaXRwcm9wJ10pKTsKICAgIH0KICAgIGVsc2UgCiAgICAgIHsKCSR0aGlzLT5zbWFydHktPmFzc2lnbiggJ3N0YXJ0Zm9ybScsIAoJCQkgICAgICAgJHRoaXMtPkNyZWF0ZUZvcm1TdGFydCgkaWQsJ2FkZHByb3AyJywkcmV0dXJuaWQpKTsKICAgICAgfQogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpbmZvbXNnMScsCgkJCSAgJHRoaXMtPkxhbmcoJ21zZ19kb250Y3JlYXRldXNlcm5hbWUnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oICdlbmRmb3JtJywKCQkJICAgJHRoaXMtPkNyZWF0ZUZvcm1FbmQoKSk7CiAgICBpZiggaXNzZXQoICRwYXJhbXNbJ21lc3NhZ2UnXSApICkKICAgICAgewoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdtZXNzYWdlJywgJHBhcmFtc1snbWVzc2FnZSddICk7CiAgICAgIH0KICAgIGlmKCBpc3NldCggJHBhcmFtc1snZXJyb3InXSApICkKICAgICAgewoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdlcnJvcicsICRwYXJhbXNbJ2Vycm9yJ10gKTsKICAgICAgfQogICAgCiAgICAkbmFtZSA9ICcnOwogICAgaWYoIGlzc2V0KCRwYXJhbXNbJ2lucHV0X25hbWUnXSApICkgJG5hbWUgPSAkcGFyYW1zWydpbnB1dF9uYW1lJ107CiAgICAkcHJvbXB0ID0gJyc7CiAgICBpZiggaXNzZXQoJHBhcmFtc1snaW5wdXRfcHJvbXB0J10gKSApICRwcm9tcHQgPSAkcGFyYW1zWydpbnB1dF9wcm9tcHQnXTsKICAgICR0eXBlID0gJyc7CiAgICBpZiggaXNzZXQoJHBhcmFtc1snbmV3X3R5cGUnXSkgKSB7CiAgICAgICR0eXBlID0gJHBhcmFtc1snbmV3X3R5cGUnXTsKICAgIH0gZWxzZSBpZiggaXNzZXQoJHBhcmFtc1snaW5wdXRfdHlwZSddKSApIHsKICAgICAgJHR5cGUgPSAkcGFyYW1zWydpbnB1dF90eXBlJ107CiAgICB9CiAgICBpZigkdGhpcy0+ZGV2ZGVidWcpewogICAgICBlY2hvICJpbnB1dF90eXBlID0gIiAuICRwYXJhbXNbJ2lucHV0X3R5cGUnXSAuICI8YnI+IjsKICAgICAgZWNobyAidHlwZSA9ICIgLiAkdHlwZSAuICI8YnI+IjsKICAgIH0KICAgIAogICAgaWYoIGlzc2V0KCAkcGFyYW1zWydlZGl0cHJvcCddICkgKQl7CiAgICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignaW5mb21zZzInLCR0aGlzLT5MYW5nKCdlZGl0cHJvcF9pbmZvbXNnJykpOwogICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2VkaXRwcm9wJywgIAoJCQkgICAgJHRoaXMtPkNyZWF0ZUlucHV0SGlkZGVuKCRpZCwgJ2VkaXRwcm9wJywgJHBhcmFtc1snZWRpdHByb3AnXSkpOwogICAgICAKICAgICAgaWYoICR0eXBlID09IDAgfHwgJHR5cGUgPT0gMiApeyAvLyB0ZXh0IG9yIGVtYWlsIGlucHV0CgkkbGVuZ3RoID0gJyc7CglpZiggaXNzZXQoJHBhcmFtc1snaW5wdXRfbGVuZ3RoJ10gKSApIHsKCSAgJGxlbmd0aCA9ICRwYXJhbXNbJ2lucHV0X2xlbmd0aCddOwoJfQoJJG1heGxlbmd0aCA9ICcnOwoJaWYoIGlzc2V0KCRwYXJhbXNbJ2lucHV0X21heGxlbmd0aCddICkgKSB7CgkgICRtYXhsZW5ndGggPSAkcGFyYW1zWydpbnB1dF9tYXhsZW5ndGgnXTsKCX0KCSR0aGlzLT5zbWFydHktPmFzc2lnbigncHJvbXB0JywkdGhpcy0+TGFuZygnbGVuZ3RoJykKCQkJICAgICAgLiR0aGlzLT5MYW5nKCdsZW5ndGhjb21tZW50JykpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpbnB1dCcsCgkJCSAgICAgICR0aGlzLT5DcmVhdGVJbnB1dFRleHQoJGlkLCdpbnB1dF9sZW5ndGgnLCRsZW5ndGgsIDMsIDMgKSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3Byb21wdDInLCR0aGlzLT5MYW5nKCdtYXhsZW5ndGgnKSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2lucHV0MicsCgkJCSAgICAgICR0aGlzLT5DcmVhdGVJbnB1dFRleHQoJGlkLCdpbnB1dF9tYXhsZW5ndGgnLCRtYXhsZW5ndGgsIDMsIDMgKSk7CiAgICAgIH0gZWxzZSBpZigkdHlwZSA9PSA0KXsgLy8gZHJvcGRvd24KCSRzZWxvcHRpb25zID0gJHRoaXMtPkdldFNlbGVjdE9wdGlvbnMoICRuYW1lLCAxICk7Cgkkc2Vsb3B0aW9uc1N0ciA9IGltcGxvZGUoIlxuIiwgJHNlbG9wdGlvbnMpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdwcm9tcHQnLCR0aGlzLT5MYW5nKCdzZWxvcHRpb25zJykpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpbnB1dCcsICAKCQkJICAgICAgJHRoaXMtPkNyZWF0ZVRleHRBcmVhKGZhbHNlLCAkaWQsICRzZWxvcHRpb25zU3RyLCAnaW5wdXRfZXh0cmEnKSk7CiAgICAgIH0KICAgIH0KICAgIAogICAgJHN1Ym1pdCA9ICR0aGlzLT5MYW5nKCduZXh0Jyk7CiAgICAkdGl0bGUgPSAkdGhpcy0+TGFuZygnYWRkcHJvcCcpOwogICAgaWYoIGlzc2V0KCRwYXJhbXNbJ2VkaXRwcm9wJ10gKSApIAogICAgICB7CgkkdGl0bGUgPSAkdGhpcy0+TGFuZygnZWRpdHByb3AnKTsKCSRzdWJtaXQgPSAkdGhpcy0+TGFuZygnc3VibWl0Jyk7CiAgICAgIH0KICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiggJ3RpdGxlJywgJHRpdGxlICk7CiAgICAkaWR4ID0gZmluZF9pbmRleF9vZl92YWx1ZSgkdGhpcy0+dHlwZXMsJHR5cGUsLTEpOwogICAgJHR5cGVzID0gJHRoaXMtPmxhbmdpZnlLZXlzKCR0aGlzLT50eXBlcyk7CiAgICAKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigncHJvbXB0X25hbWUnLCR0aGlzLT5MYW5nKCduYW1lJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpbnB1dF9uYW1lJywKCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCRpZCwnaW5wdXRfbmFtZScsJG5hbWUsIDMwLCAzMCApKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigncHJvbXB0X3Byb21wdCcsJHRoaXMtPkxhbmcoJ3Byb21wdCcpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignaW5wdXRfcHJvbXB0JywKCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCRpZCwnaW5wdXRfcHJvbXB0JywkcHJvbXB0LCA1MCwgODAgKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3Byb21wdF90eXBlJywkdGhpcy0+TGFuZygndHlwZScpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignaW5wdXRfdHlwZScsICAKCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXREcm9wZG93biggJGlkLCAnaW5wdXRfdHlwZScsICR0eXBlcywgCgkJCQkJCSAgICAgICRpZHgsICR0eXBlKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ29yaWdfdHlwZScsICAKCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRIaWRkZW4oJGlkLCAnb3JpZ190eXBlJywgJHR5cGUpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ3N1Ym1pdCcsCgkJCSAgICR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCAoJGlkLCAnc3VibWl0JywgJHN1Ym1pdCApKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2NhbmNlbCcsCgkJCSAgICR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCAoJGlkLCAnY2FuY2VsJywKCQkJCQkJICAgICAkdGhpcy0+TGFuZygnY2FuY2VsJykpKTsKICAgIGVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZSgnYWRkcHJvcC50cGwnKTsKICB9CgoKICBmdW5jdGlvbiBfRGlzcGxheUFkbWluQWRkUHJvcGVydHlQYWdlMiggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKQogIHsKICAgIGlmKCRwYXJhbXNbJ2lucHV0X3R5cGUnXSA9PSAxIHx8IC8vY2hlY2tib3gKICAgICAgICRwYXJhbXNbJ2lucHV0X3R5cGUnXSA9PSAzICl7IC8vdGV4dGFyZWEKICAgICAgaWYoIGlzc2V0KCAkcGFyYW1zWydlZGl0cHJvcCddICkgKSB7CgkkdGhpcy0+UmVkaXJlY3QoJGlkLCAnZG9fZWRpdHByb3AnLCRyZXR1cm5pZCwgJHBhcmFtcyk7CglyZXR1cm47CiAgICAgIH0gZWxzZSB7CgkkdGhpcy0+UmVkaXJlY3QoJGlkLCAnZG9fYWRkcHJvcCcsJHJldHVybmlkLCAkcGFyYW1zKTsKCXJldHVybjsKICAgICAgfQogICAgfQoKICAgIGlmKCBpc3NldCggJHBhcmFtc1snZWRpdHByb3AnXSApICkgewogICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oICdzdGFydGZvcm0nLCAKCQkJICAgICAkdGhpcy0+Q3JlYXRlRm9ybVN0YXJ0KCRpZCwnZG9fZWRpdHByb3AnLCRyZXR1cm5pZCkpOwogICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oICdoaWRkZW4nLAoJCQkgICAgICR0aGlzLT5DcmVhdGVJbnB1dEhpZGRlbigkaWQsJ3Byb3BuYW1lJywkcGFyYW1zWydlZGl0cHJvcCddKSk7CiAgICB9IGVsc2UgewogICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oICdzdGFydGZvcm0nLCAKCQkJICAgICAkdGhpcy0+Q3JlYXRlRm9ybVN0YXJ0KCRpZCwnZG9fYWRkcHJvcCcsJHJldHVybmlkKSk7CiAgICB9CgogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCAnZW5kZm9ybScsICAkdGhpcy0+Q3JlYXRlRm9ybUVuZCgpKTsKCiAgICBpZiggaXNzZXQoICRwYXJhbXNbJ21lc3NhZ2UnXSApICkgewogICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ21lc3NhZ2UnLCAkcGFyYW1zWydtZXNzYWdlJ10gKTsKICAgIH0KICAgIGlmKCBpc3NldCggJHBhcmFtc1snZXJyb3InXSApICkJewogICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2Vycm9yJywgJHBhcmFtc1snZXJyb3InXSApOwogICAgfQoKICAgIGlmICgkcGFyYW1zWydpbnB1dF90eXBlJ10gPT0gNCkgeyAvL2Ryb3AtZG93bgogICAgICAkc2Vsb3B0aW9ucyA9ICcnOwogICAgICBpZiggaXNzZXQoJHBhcmFtc1snaW5wdXRfc2Vsb3B0aW9ucyddICkgKSB7Cgkkc2Vsb3B0aW9ucyA9ICRwYXJhbXNbJ2lucHV0X3NlbG9wdGlvbnMnXTsKICAgICAgfQogICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3Byb21wdDEnLCR0aGlzLT5MYW5nKCdzZWxvcHRpb25zJykpOwogICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2lucHV0MScsICAKCQkJICAgICR0aGlzLT5DcmVhdGVUZXh0QXJlYShmYWxzZSwgJGlkLCAkc2Vsb3B0aW9ucywgJ2lucHV0X3NlbG9wdGlvbnMnKSk7CiAgICB9IGVsc2UgeyAvL3RleHQgaW5wdXQgb3IgZW1haWwKICAgICAgJGxlbmd0aCA9ICcnOwogICAgICBpZiggaXNzZXQoJHBhcmFtc1snaW5wdXRfbGVuZ3RoJ10gKSApIHsKCSRsZW5ndGggPSAkcGFyYW1zWydpbnB1dF9sZW5ndGgnXTsKICAgICAgfQogICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3Byb21wdDEnLCR0aGlzLT5MYW5nKCdsZW5ndGgnKQoJCQkgICAgLiR0aGlzLT5MYW5nKCdsZW5ndGhjb21tZW50JykpOwogICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2lucHV0MScsCgkJCSAgICAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCRpZCwnaW5wdXRfbGVuZ3RoJywkbGVuZ3RoLCAzLCAzICkpOwogICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3Byb21wdDInLCR0aGlzLT5MYW5nKCdtYXhsZW5ndGgnKSk7CiAgICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignaW5wdXQyJywKCQkJICAgICR0aGlzLT5DcmVhdGVJbnB1dFRleHQoJGlkLCdpbnB1dF9tYXhsZW5ndGgnLCRsZW5ndGgsIDMsIDMgKSk7CiAgICB9CiAgICAkdGl0bGUgPSAkdGhpcy0+TGFuZygnYWRkcHJvcCcpOwogICAgaWYoIGlzc2V0KCRwYXJhbXNbJ2VkaXRpbmcnXSApICkgewogICAgICAkdGl0bGUgPSAkdGhpcy0+TGFuZygnZWRpdHByb3AnKTsKICAgIH0KICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiggJ3RpdGxlJywgJHRpdGxlICk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2lucHV0X25hbWUnLAoJCQkgICR0aGlzLT5DcmVhdGVJbnB1dEhpZGRlbigkaWQsICdpbnB1dF9uYW1lJywgJHBhcmFtc1snaW5wdXRfbmFtZSddKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2lucHV0X3Byb21wdCcsCgkJCSAgJHRoaXMtPkNyZWF0ZUlucHV0SGlkZGVuKCRpZCwnaW5wdXRfcHJvbXB0JywkcGFyYW1zWydpbnB1dF9wcm9tcHQnXSkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpbnB1dF90eXBlJywgIAoJCQkgICR0aGlzLT5DcmVhdGVJbnB1dEhpZGRlbigkaWQsICdpbnB1dF90eXBlJywgJHBhcmFtc1snaW5wdXRfdHlwZSddKSk7CiAgICAKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ3N1Ym1pdCcsICR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCAoJGlkLCAnc3VibWl0JywKCQkJCQkJCSAgICAgICAkdGhpcy0+TGFuZygnc3VibWl0JykpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2NhbmNlbCcsICR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCAoJGlkLCAnY2FuY2VsJywKCQkJCQkJCSAgICAgICAkdGhpcy0+TGFuZygnY2FuY2VsJykpKTsKICAgIGVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZSgnYWRkcHJvcDIudHBsJyk7CiAgfQoKCiAgZnVuY3Rpb24gX0Rpc3BsYXlBZG1pbkFkZFVzZXJTdGVwMVBhZ2UoICRpZCwgJiRwYXJhbXMsICRyZXR1cm5pZCApCiAgewogICAgaWYoIGlzc2V0KCAkcGFyYW1zWydjYW5jZWwnXSApICkKICAgICAgewoJJHRoaXMtPm15UmVkaXJlY3RUb1RhYigkaWQsICd1c2VycycgKTsKICAgICAgfQoKICAgICRnaWQgPSAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnZGVmYXVsdF9ncm91cCcsIC0xKTsKICAgIGlmKCAkZ2lkICE9IC0xICkKICAgICAgewoJLy8gdGhlIGRlZmF1bHQgZ3JvdXAgaGFzIGJlZW4gc2V0CgkvLyBzbyB3ZSdsbCBwdXQgdGhpcyBpbiB0aGUgbWVtYmVyb2YgcGFyYW1ldGVyCgkvLyBpZiBpdCdzIG5vdCBhbHJlYWR5IHNldAoJaWYoICFpc3NldCggJHBhcmFtc1snbWVtYmVyb2YnXSApICkKCSAgewoJICAgICRwYXJhbXNbJ21lbWJlcm9mXycuJGdpZF0gPSAkZ2lkOwoJICB9CiAgICAgIH0KCiAgICAkdGhpcy0+X0Rpc3BsYXlBZG1pblVzZXJQYWdlKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApOwogIH0KCgogIGZ1bmN0aW9uIF9EaXNwbGF5QWRtaW5BZGRVc2VyU3RlcDJQYWdlKCAkaWQsICYkcGFyYW1zLCAkcmV0dXJuaWQgKQogIHsKICAgIGdsb2JhbCAkZ0NtczsKICAgIGlmKCBpc3NldCggJHBhcmFtc1snbWVzc2FnZSddICkgKQogICAgICB7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ21lc3NhZ2UnLCAkcGFyYW1zWydtZXNzYWdlJ10gKTsKICAgICAgfQogICAgaWYoIGlzc2V0KCAkcGFyYW1zWydlcnJvciddICkgKQogICAgICB7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2Vycm9yJywgJHBhcmFtc1snZXJyb3InXSApOwogICAgICB9CgogICAgLy8gY2FsY3VsYXRlIHRoZSB1bmlvbiAoeWVwLCB1bmlvbiwgbm90IGludGVyc2VjdGlvbikKICAgIC8vIG9mIGFsbCBvZiB0aGUgcHJvcGVydGllcyBvZiBhbGwgb2YgdGhlIG1lbWJlciBncm91cHMKICAgIC8vIHByZWZlcnJpbmcgYWxsIGl0ZW1zIHdpdGggYSBwcmlvcml0eSBvZiAyCiAgICAkcHJvcGVydGllcyA9IGFycmF5KCk7CiAgICAkZ3JvdXBzID0gMDsKICAgIGZvcmVhY2goICRwYXJhbXMgYXMgJGtleSA9PiAkdmFsICkKICAgIHsKICAgICAgaWYoIHByZWdfbWF0Y2goICcvXm1lbWJlcm9mXy8nLCAka2V5ICkgKQoJewoJICAkZ3JvdXBzKys7CgkgIC8vIGdldCB0aGUgZ3JvdXBpZCBmcm9tIHRoZSBjaGVja2JveAoJICAkZ3JwaWQgPSBzdWJzdHIoJGtleSxzdHJsZW4oJ21lbWJlcm9mXycpKTsKCSAgCgkgIC8vIGhhdmUgdGhlIGdyb3VwIGlkLCBub3cgZ2V0IGEgbGlzdCBvZiB0aGUgcHJvcGVydAoJICAkcHJvcHJlbGF0aW9ucyA9ICR0aGlzLT5HZXRHcm91cFByb3BlcnR5UmVsYXRpb25zKCAkZ3JwaWQgKTsKCSAgJHByb3BlcnRpZXMgPSBhcnJheV9tZXJnZV9ieV9uYW1lX3JlcXVpcmVkKCAkcHJvcGVydGllcywgJHByb3ByZWxhdGlvbnMgKTsKCSAgdWFzb3J0KCAkcHJvcGVydGllcywgJ2NvbXBhcmVfZWxlbWVudHNfYnlfc29ydG9yZGVyX2tleScgKTsKCX0KICAgIH0JICAKICAgIGlmKCAkZ3JvdXBzID09IDAgKQogICAgICB7CglpZiggJHRoaXMtPkdldFByZWZlcmVuY2UoJ3JlcXVpcmVfb25lZ3JvdXAnKSA9PSAxICkKCSAgewoJICAgICRwYXJhbXNbJ2Vycm9yJ10gPSAxOwoJICAgICRwYXJhbXNbJ21lc3NhZ2UnXSA9ICR0aGlzLT5MYW5nKCdlcnJvcl9vbmVncm91cHJlcXVpcmVkJyk7CgkgICAgJHRoaXMtPm15UmVkaXJlY3QoICRpZCwgJ2FkZHVzZXInLCAkcGFyYW1zICk7CgkgICAgcmV0dXJuOwoJICB9CgkKCSR0aGlzLT5teVJlZGlyZWN0KCAkaWQsICdkb19hZGR1c2VyMycsICRwYXJhbXMgKTsKICAgICAgfQogICAgaWYoIGNvdW50KCRwcm9wZXJ0aWVzKSA9PSAwICkKICAgICAgewoJJHBhcmFtc1snZXJyb3InXSA9IDE7CgkkcGFyYW1zWydtZXNzYWdlJ10gPSAkdGhpcy0+TGFuZygnZXJyb3JfcHJvcGVydGllcycpOwoJJHRoaXMtPm15UmVkaXJlY3QoICRpZCwgJ2FkZHVzZXInLCAkcGFyYW1zICk7CglyZXR1cm47CiAgICAgIH0KCiAgICAvLyBub3cgd2UncmUgcmVhZHkgdG8gcG9wdWxhdGUgdGhlIHRlbXBsYXRlCiAgICAkcm93YXJyYXkgPSBhcnJheSgpOwogICAgJHRoaXMtPl9kZWJ1Z2FycmF5KCAkcHJvcGVydGllcywgIlByb3BlcnRpZXMiICk7CiAgICBmb3JlYWNoKCAkcHJvcGVydGllcyBhcyAkcHJvcCApCiAgICB7CiAgICAgIC8vIGdldCB0aGUgcHJvcGVydHkgZGVmaW5pdGlvbgogICAgICAkZGVmbiA9ICR0aGlzLT5HZXRQcm9wZXJ0eURlZm4oICRwcm9wWyduYW1lJ10gKTsKICAgICAgCiAgICAgICRvbmVyb3cgPSBuZXcgU3RkQ2xhc3MoKTsKCiAgICAgICRjb2xvciA9ICcnOwogICAgICBpZiggJHByb3BbJ3JlcXVpcmVkJ10gPT0gMiApICRjb2xvciA9ICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdyZXF1cmllZF9maWVsZF9jb2xvcicsJ2JsdWUnKTsKICAgICAgaWYoICRwcm9wWydyZXF1aXJlZCddID09IDMgKSAkY29sb3IgPSAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnaGlkZGVuX2ZpZWxkX2NvbG9yJywnZ3JlZW4nKTsKICAgICAgJG1hcmtlciA9ICcnOwogICAgICBpZiggJHByb3BbJ3JlcXVpcmVkJ10gPT0gMiApICRtYXJrZXIgPSAkdGhpcy0+R2V0UHJlZmVyZW5jZSgncmVxdXJpZWRfZmllbGRfbWFya2VyJywnKicpOwogICAgICBpZiggJHByb3BbJ3JlcXVpcmVkJ10gPT0gMyApICRtYXJrZXIgPSAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnaGlkZGVuX2ZpZWxkX21hcmtlcicsJyEhJyk7CiAgICAgICRvbmVyb3ctPnJlcXVpcmVkID0gKCRwcm9wWydyZXF1aXJlZCddID09IDIpOwogICAgICAkb25lcm93LT5jb2xvciAgICA9ICRjb2xvcjsKICAgICAgJG9uZXJvdy0+bWFya2VyICAgPSAkbWFya2VyOwogICAgICAkb25lcm93LT5oaWRkZW4gPSBteUNyZWF0ZUlucHV0SGlkZGVuKCAkaWQsICdoaWRkZW5fJy4kcHJvcFsnbmFtZSddLAoJCQkJCSAgICAgaW1wbG9kZSgiOyIsYXJyYXkoJHByb3BbJ25hbWUnXSwkZGVmblsndHlwZSddLAoJCQkJCQkJICAgICAgICRkZWZuWydsZW5ndGgnXSwkcHJvcFsncmVxdWlyZWQnXSwKCQkJCQkJCSAgICAgICAkZGVmblsnbWF4bGVuZ3RoJ10pKSk7CgogICAgICAkdmFsID0gaXNzZXQoJHBhcmFtc1snaW5wdXRfJy4kcHJvcFsnbmFtZSddXSkgPyAkcGFyYW1zWydpbnB1dF8nLiRwcm9wWyduYW1lJ11dIDogJyc7CiAgICAgICRvbmVyb3ctPnByb21wdCA9ICRkZWZuWydwcm9tcHQnXTsKICAgICAgc3dpdGNoKCAkZGVmblsndHlwZSddICkKCXsKCWNhc2UgMDogLy8gdGV4dAoJICAkb25lcm93LT5jb250cm9sID0gJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCggJGlkLCAnaW5wdXRfJy4kcHJvcFsnbmFtZSddLAoJCQkJCQkgICAgICR2YWwsICRkZWZuWydsZW5ndGgnXSwgJGRlZm5bJ21heGxlbmd0aCddICk7CgkgIGJyZWFrOwoKCWNhc2UgMTogLy8gY2hlY2tib3gKCSAgJG9uZXJvdy0+Y29udHJvbCA9IG15Q3JlYXRlSW5wdXRDaGVja2JveCggJGlkLCAnaW5wdXRfJy4kcHJvcFsnbmFtZSddLCAxLCAkdmFsICk7CgkgIGJyZWFrOwoKCWNhc2UgMjogLy8gZW1haWwKCSAgJG9uZXJvdy0+Y29udHJvbCA9ICR0aGlzLT5DcmVhdGVJbnB1dFRleHQoICRpZCwgJ2lucHV0XycuJHByb3BbJ25hbWUnXSwKCQkJCQkJICAgICAkdmFsLCAkZGVmblsnbGVuZ3RoJ10sICRkZWZuWydtYXhsZW5ndGgnXSApOwoJICBicmVhazsKCgljYXNlIDM6IC8vIHRleHRhcmVhCgkgICRvbmVyb3ctPmNvbnRyb2wgPSAkdGhpcy0+Q3JlYXRlVGV4dEFyZWEoZmFsc2UsICRpZCwgJHZhbCwgJ2lucHV0XycuJHByb3BbJ25hbWUnXSk7CgkgIGJyZWFrOwoKCWNhc2UgNDogLy8gZHJvcGRvd24KCSAgJG9uZXJvdy0+Y29udHJvbCA9ICR0aGlzLT5DcmVhdGVJbnB1dERyb3Bkb3duKCAKCQkJCQkJCSRpZCwgCgkJCQkJCQknaW5wdXRfJy4kcHJvcFsnbmFtZSddLCAKCQkJCQkJCSR0aGlzLT5HZXRTZWxlY3RPcHRpb25zKCRkZWZuWyduYW1lJ10sIDEpLCAKCQkJCQkJCS0xLCAKCQkJCQkJCSR2YWwpOwoJICBicmVhazsKCX0KCiAgICAgIGFycmF5X3B1c2goICRyb3dhcnJheSwgJG9uZXJvdyApOwogICAgfQoKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignaGlkZGVuJywgCgkJCSAgbXlDcmVhdGVJbnB1dEhpZGRlbiggJGlkLCAnc3RlcDFfcGFyYW1zJywgJHBhcmFtcyApKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignY29udHJvbHMnLCAkcm93YXJyYXkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdjb250cm9sY291bnQnLCBjb3VudCgkcm93YXJyYXkpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignc3VibWl0JywkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQoJGlkLCdzdWJtaXQnLAoJCQkJCQkJICAgICR0aGlzLT5MYW5nKCdzdWJtaXQnKSkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdjYW5jZWwnLCR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCgkaWQsJ2NhbmNlbCcsCgkJCQkJCQkgICAgJHRoaXMtPkxhbmcoJ2NhbmNlbCcpKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2JhY2snLCR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCgkaWQsJ2JhY2snLAoJCQkJCQkJICAgICR0aGlzLT5MYW5nKCdiYWNrJykpKTsKICAgIGlmKCBpc3NldCggJHBhcmFtc1sndXNlcl9pZCddICkgKQogICAgICB7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2hpZGRlbjInLCAKCQkJICAgICAgJHRoaXMtPkNyZWF0ZUlucHV0SGlkZGVuKCRpZCwndXNlcl9pZCcsJHBhcmFtc1sndXNlcl9pZCddKSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3N0YXJ0Zm9ybScsCgkJCQkgICAgICAkdGhpcy0+Q3JlYXRlRm9ybVN0YXJ0ICgkaWQsCgkJCQkJCQkgICAgICAnZG9fZWRpdHVzZXIzJywKCQkJCQkJCSAgICAgICRyZXR1cm5pZCkpOwogICAgICB9CiAgICBlbHNlIAogICAgICB7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3N0YXJ0Zm9ybScsCgkJCQkgICAgICAkdGhpcy0+Q3JlYXRlRm9ybVN0YXJ0ICgkaWQsCgkJCQkJCQkgICAgICAnZG9fYWRkdXNlcjMnLAoJCQkJCQkJICAgICAgJHJldHVybmlkKSk7CiAgICAgIH0KICAgIAogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdlbmRmb3JtJywgJHRoaXMtPkNyZWF0ZUZvcm1FbmQgKCkpOwogICAgZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCAnYWRkdXNlcjIudHBsJyApOwogIH0KCgogIGZ1bmN0aW9uIF9EaXNwbGF5QWRtaW5Vc2VyUGFnZSggJGlkLCAmJHBhcmFtcywgJHJldHVybmlkICkKICB7CiAgICBnbG9iYWwgJGdDbXM7CgogICAgLy8gcG9wdWxhdGUgdGhlIHRlbXBsYXRlCiAgICBpZiggJHBhcmFtc1snYWN0aW9uJ10gPT0gJ2VkaXR1c2VyJ3x8ICRwYXJhbXNbJ2FjdGlvbiddID09ICdkb19lZGl0dXNlcjEnICkKICAgICAgewoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdoaWRkZW4nLCAKCQkJICAgICAgJHRoaXMtPkNyZWF0ZUlucHV0SGlkZGVuKCRpZCwndXNlcl9pZCcsJHBhcmFtc1sndXNlcl9pZCddKSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3RpdGxlJywgJHRoaXMtPkxhbmcoJ2VkaXR1c2VyJykpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdzdGFydGZvcm0nLAoJCQkJICAgICAgJHRoaXMtPkNyZWF0ZUZvcm1TdGFydCAoJGlkLAoJCQkJCQkJICAgICAgJ2RvX2VkaXR1c2VyMScsCgkJCQkJCQkgICAgICAkcmV0dXJuaWQpKTsKICAgICAgfQogICAgZWxzZQogICAgICB7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3RpdGxlJywgJHRoaXMtPkxhbmcoJ2FkZHVzZXInKSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3N0YXJ0Zm9ybScsCgkJCQkgICAgICAkdGhpcy0+Q3JlYXRlRm9ybVN0YXJ0ICgkaWQsCgkJCQkJCQkgICAgICAnZG9fYWRkdXNlcjEnLAoJCQkJCQkJICAgICAgJHJldHVybmlkKSk7CiAgICAgIH0KCiAgICBpZiggaXNzZXQoJHBhcmFtc1snZXJyb3InXSkgKQogICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2Vycm9yJywkcGFyYW1zWydlcnJvciddKTsKICAgIGlmKCBpc3NldCgkcGFyYW1zWydtZXNzYWdlJ10pICkKICAgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdtZXNzYWdlJywkcGFyYW1zWydtZXNzYWdlJ10pOwogICAgJHVzZXJuYW1lID0gJyc7CiAgICBpZiggaXNzZXQoJHBhcmFtc1snaW5wdXRfdXNlcm5hbWUnXSkgKQogICAgICAkdXNlcm5hbWUgPSB0cmltKCRwYXJhbXNbJ2lucHV0X3VzZXJuYW1lJ10pOwogICAgJHBhc3N3b3JkID0gJyc7CiAgICBpZiggaXNzZXQoJHBhcmFtc1snaW5wdXRfcGFzc3dvcmQnXSkgKQogICAgICAkcGFzc3dvcmQgPSB0cmltKCRwYXJhbXNbJ2lucHV0X3Bhc3N3b3JkJ10pOwogICAgJHJlcGVhdHBhc3N3b3JkID0gJyc7CiAgICBpZiggaXNzZXQoJHBhcmFtc1snaW5wdXRfcmVwZWF0cGFzc3dvcmQnXSkgKQogICAgICAkcmVwZWF0cGFzc3dvcmQgPSB0cmltKCRwYXJhbXNbJ2lucHV0X3JlcGVhdHBhc3N3b3JkJ10pOwogICAgJGV4cGlyZXMgPSAnJzsKICAgIGlmKCBpc3NldCgkcGFyYW1zWydpbnB1dF9leHBpcmVzJ10pICkKICAgICAgJGV4cGlyZXMgPSB0cmltKCRwYXJhbXNbJ2lucHV0X2V4cGlyZXMnXSk7CiAgICAKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignZW5kZm9ybScsICR0aGlzLT5DcmVhdGVGb3JtRW5kICgpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignc3VibWl0JywKCQkJCSAgJHRoaXMtPkNyZWF0ZUlucHV0U3VibWl0ICgkaWQsICdzdWJtaXQnLAoJCQkJCQkJICAgICR0aGlzLT5MYW5nKCduZXh0JykpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignY2FuY2VsJywKCQkJCSAgJHRoaXMtPkNyZWF0ZUlucHV0U3VibWl0ICgkaWQsICdjYW5jZWwnLAoJCQkJCQkJICAgICR0aGlzLT5MYW5nKCdjYW5jZWwnKSkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgncHJvbXB0X3VzZXJuYW1lJywKCQkJICAgJHRoaXMtPkxhbmcgKCduYW1lJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnaW5wdXRfdXNlcm5hbWUnLAoJCQkgICAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0ICgkaWQsICdpbnB1dF91c2VybmFtZScsCgkJCQkJCSAgICR1c2VybmFtZSwgMjAsIDgwKSk7CgogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgncHJvbXB0X3Bhc3N3b3JkJywKCQkJICAgJHRoaXMtPkxhbmcgKCdwYXNzd29yZCcpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2lucHV0X3Bhc3N3b3JkJywKCQkJICAgJHRoaXMtPkNyZWF0ZUlucHV0UGFzc3dvcmQgKCRpZCwgJ2lucHV0X3Bhc3N3b3JkJywKCQkJCQkJICAgJHBhc3N3b3JkLCAyMCwgODApKTsKCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdwcm9tcHRfcmVwZWF0cGFzc3dvcmQnLAoJCQkgICAkdGhpcy0+TGFuZyAoJ3JlcGVhdHBhc3N3b3JkJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnaW5wdXRfcmVwZWF0cGFzc3dvcmQnLAoJCQkgICAkdGhpcy0+Q3JlYXRlSW5wdXRQYXNzd29yZCAoJGlkLCAnaW5wdXRfcmVwZWF0cGFzc3dvcmQnLAoJCQkJCQkgICAkcmVwZWF0cGFzc3dvcmQsIDIwLCA4MCkpOwoKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ3Byb21wdF9leHBpcmVzJywKCQkJICAgJHRoaXMtPkxhbmcoJ2V4cGlyZXMnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdleHBpcmVzX2RhdGVwcmVmaXgnLCAkaWQuJ2V4cGlyZXNkYXRlXycpOwogICAgJGV4cGlyZXNkYXRlID0gc3RydG90aW1lKCcrMTAgeWVhcnMnLCB0aW1lKCkpOwogICAgaWYoIGlzc2V0KCAkcGFyYW1zWydpbnB1dF9leHBpcmVzZGF0ZSddICkgKQogICAgICB7CgkkZXhwaXJlc2RhdGUgPSAkcGFyYW1zWydpbnB1dF9leHBpcmVzZGF0ZSddOwogICAgICB9CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdleHBpcmVzZGF0ZScsICRleHBpcmVzZGF0ZSApOwogICAgCgogICAgLy8gRGlzcGxheSB0aGlzIHVzZXIncyBwcm9wZXJ0aWVzIGFuZCBhbGxvdyB1cyB0byBlZGl0IHRoZW0KCiAgICAvLyBkaXNwbGF5IGFuZCBlZGl0IGdyb3VwcwogICAgaWYoICR0aGlzLT5fSGFzU3VmZmljaWVudFBlcm1pc3Npb25zKCdlZGl0Z3JvdXBzJykgKQogICAgICB7CgkvLyBub3cgZGlzcGxheSBhIGxpc3Qgb2YgZ3JvdXBzIHRoYXQgdGhpcyB1c2VyIG1heSBvcHRpb25hbGx5IGJlIGluCgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oICdpZHRleHQnLCAkdGhpcy0+TGFuZygnaWQnKSApOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCAnbmFtZXRleHQnLCAkdGhpcy0+TGFuZygnbmFtZScpICk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oICdkZXNjdGV4dCcsICR0aGlzLT5MYW5nKCdkZXNjcmlwdGlvbicpICk7CgkKCSRncm91cHMgPSAkdGhpcy0+R2V0R3JvdXBMaXN0RnVsbCgpOwoJJHJvd2FycmF5ID0gYXJyYXkoKTsKCSRyb3djbGFzcyA9ICdyb3cxJzsKCWZvcmVhY2goICRncm91cHMgYXMgJGdyb3VwICkKCXsKCSAgJG9uZXJvdyA9IG5ldyBTdGRDbGFzcygpOwoJICAkb25lcm93LT5pZCA9ICRncm91cFsnaWQnXTsKCSAgJG9uZXJvdy0+bmFtZSA9ICRncm91cFsnZ3JvdXBuYW1lJ107CgkgICRvbmVyb3ctPmRlc2MgPSAkZ3JvdXBbJ2dyb3VwZGVzYyddOwoJICAkb25lcm93LT5tZW1iZXIgPSAkdGhpcy0+Q3JlYXRlSW5wdXRDaGVja2JveCgkaWQsJ21lbWJlcm9mXycuJGdyb3VwWydpZCddLAoJCQkJCQkgICRncm91cFsnaWQnXSwKCQkJCQkJICAoaXNzZXQoJHBhcmFtc1snbWVtYmVyb2ZfJy4kZ3JvdXBbJ2lkJ11dKSA/IAoJCQkJCQkgICAkcGFyYW1zWydtZW1iZXJvZl8nLiRncm91cFsnaWQnXV0gOiAtMSkpOwoJICAkb25lcm93LT5yb3djbGFzcyA9ICRyb3djbGFzczsKCSAgCgkgIGFycmF5X3B1c2ggKCRyb3dhcnJheSwgJG9uZXJvdyk7CgkgICgkcm93Y2xhc3MgPT0gInJvdzEiID8gJHJvd2NsYXNzID0gInJvdzIiIDogJHJvd2NsYXNzID0gInJvdzEiKTsKCX0KCSR0aGlzLT5zbWFydHktPmFzc2lnbignaXRlbWNvdW50Jyxjb3VudCgkcm93YXJyYXkpKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbignaXRlbXMnLCRyb3dhcnJheSk7CiAgICAgIH0KCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3Byb3BhZGQnLCAkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQoICRpZCwgJ3Byb3BhZGQnLCAKCQkJCQkJCSAgICAgICAkdGhpcy0+TGFuZygnYWRkJykpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignZ3JvdXBzdGl0bGUnLCAkdGhpcy0+TGFuZygnZ3JvdXBzJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdwcm9wZXJ0aWVzdGl0bGUnLCAkdGhpcy0+TGFuZygncHJvcGVydGllcycpKTsKCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3Byb3BzJywKCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQoJGlkLCAncHJvcHMnLCAkdGhpcy0+TGFuZygncHJvcGVydGllcycpLiIuLi4iKSk7CiAgICBlY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUoJ2FkZHVzZXIxLnRwbCcpOwogIH0KCgogIGZ1bmN0aW9uIERvQWN0aW9uKCRhY3Rpb24sICRpZCwgJHBhcmFtcywgJHJldHVybmlkID0gLTEpIAogIHsKICAgIHN3aXRjaCAoJGFjdGlvbikKICAgICAgewogICAgICBjYXNlICdhZGRncm91cCc6Cgl7CgkgIC8vIGNoZWNrIHBlcm1pc3Npb25zIGFnYWluCgkgIGlmKCAkdGhpcy0+X0hhc1N1ZmZpY2llbnRQZXJtaXNzaW9ucyggJ2FkZGdyb3VwJyApICkKCSAgICB7CgkgICAgICAkdGhpcy0+X0Rpc3BsYXlBZG1pbkFkZEdyb3VwUGFnZSggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKTsKCSAgICB9CgkgIGVsc2UgCgkgICAgewoJICAgICAgJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlKCRpZCwgJHBhcmFtcywgJHJldHVybmlkLAoJCQkJICAgICAgJHRoaXMtPkxhbmcoJ2FjY2Vzc2RlbmllZCcpKTsKCSAgICB9CgkgIGJyZWFrOwoJfQoKICAgICAgY2FzZSAnYWRkcHJvcCc6Cgl7CgkgIC8vIGNoZWNrIHBlcm1pc3Npb25zIGFnYWluCgkgIGlmKCAkdGhpcy0+X0hhc1N1ZmZpY2llbnRQZXJtaXNzaW9ucyggJ2FkZHByb3AnICkgKQoJICAgIHsKCSAgICAgICR0aGlzLT5fRGlzcGxheUFkbWluQWRkUHJvcGVydHlQYWdlKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApOwoJICAgIH0KCSAgZWxzZSAKCSAgICB7CgkgICAgICAkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UoJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQsCgkJCQkgICAgICAkdGhpcy0+TGFuZygnYWNjZXNzZGVuaWVkJykpOwoJICAgIH0KCSAgYnJlYWs7Cgl9CgogICAgICAvLyBUaGlzIGlzIHJlc3BvbnNpYmxlIGZvciBzdGVwIDIgaW4gYWRkaW5nIGEgcHJvcGVydHkKICAgICAgY2FzZSAnYWRkcHJvcDInOgoJewoJICAvLyBjaGVjayBwZXJtaXNzaW9ucyBhZ2FpbgoJICBpZiggJHRoaXMtPl9IYXNTdWZmaWNpZW50UGVybWlzc2lvbnMoICdhZGRwcm9wJyApICkKCSAgICB7CgkgICAgICAkdGhpcy0+X0Rpc3BsYXlBZG1pbkFkZFByb3BlcnR5UGFnZTIoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICk7CgkgICAgfQoJICBlbHNlIAoJICAgIHsKCSAgICAgICR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSgkaWQsICRwYXJhbXMsICRyZXR1cm5pZCwKCQkJCSAgICAgICR0aGlzLT5MYW5nKCdhY2Nlc3NkZW5pZWQnKSk7CgkgICAgfQoJICBicmVhazsKCX0KCiAgICAgIGNhc2UgJ2FkZHVzZXInOgoJewoJICAvLyBjaGVjayBwZXJtaXNzaW9ucyBhZ2FpbgoJICBpZiggJHRoaXMtPl9IYXNTdWZmaWNpZW50UGVybWlzc2lvbnMoICdhZGR1c2VyJyApICkKCSAgICB7CgkgICAgICAkdGhpcy0+X0Rpc3BsYXlBZG1pbkFkZFVzZXJTdGVwMVBhZ2UoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICk7CgkgICAgfQoJICBlbHNlIAoJICAgIHsKCSAgICAgICR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSgkaWQsICRwYXJhbXMsICRyZXR1cm5pZCwKCQkJCSAgICAgICR0aGlzLT5MYW5nKCdhY2Nlc3NkZW5pZWQnKSk7CgkgICAgfQoJICBicmVhazsKCX0KCiAgICAgIGNhc2UgImNoYW5nZXNldHRpbmdzIjsKICAgICAgICB7CgkgICR0aGlzLT5fRGlzcGxheVVzZXJTZXR0aW5nc1BhZ2UoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICk7CgkgIGJyZWFrOwogICAgICAgIH0KCiAgICAgIGNhc2UgImRlZmF1bHQiOiAKCXsKCSAgJHRoaXMtPl9Eb1VzZXJBY3Rpb24oICRpZCwgJHBhcmFtcywgJHJldHVybmlkICk7CgkgIGJyZWFrOwoJfQoKICAgICAgY2FzZSAiZGVmYXVsdGFkbWluIjogCgl7CgkgIGlmICgkdGhpcy0+X0hhc1N1ZmZpY2llbnRQZXJtaXNzaW9ucygpKSAgewoJICAgICR0aGlzLT5fRGlzcGxheUFkbWluUGFuZWwoJGlkLCRwYXJhbXMsJHJldHVybmlkKTsKCSAgfSBlbHNlIHsKCSAgICBlY2hvICJCcmVha2luZyBhbiBlbnRyeSwgYXJlIHdlPyI7CgkgIH0KCSAgYnJlYWs7Cgl9CgogICAgICBjYXNlICdkb19hZGRncm91cCc6Cgl7CgkgIGlmKCAkdGhpcy0+X0hhc1N1ZmZpY2llbnRQZXJtaXNzaW9ucyggJ2FkZGdyb3VwJyApICkKCSAgICB7CgkgICAgICAkdGhpcy0+X0RvQWRkR3JvdXAoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICk7CgkgICAgfQoJICBlbHNlIAoJICAgIHsKCSAgICAgICR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSgkaWQsICRwYXJhbXMsICRyZXR1cm5pZCwKCQkJCSAgICAgICR0aGlzLT5MYW5nKCdhY2Nlc3NkZW5pZWQnKSk7CgkgICAgfQoJICBicmVhazsKCX0KCiAgICAgIGNhc2UgJ2RvX2FkZHByb3AnOgoJewoJICBpZiggJHRoaXMtPl9IYXNTdWZmaWNpZW50UGVybWlzc2lvbnMoICdhZGRwcm9wJyApICkKCSAgICB7CgkgICAgICAkdGhpcy0+X0RvQWRkUHJvcCggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKTsKCSAgICB9CgkgIGVsc2UgCgkgICAgewoJICAgICAgJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlKCRpZCwgJHBhcmFtcywgJHJldHVybmlkLAoJCQkJICAgICAgJHRoaXMtPkxhbmcoJ2FjY2Vzc2RlbmllZCcpKTsKCSAgICB9CgkgIGJyZWFrOwoJfQoKICAgICAgY2FzZSAnZG9fYWRkdXNlcjEnOgoJewoJICBpZiggJHRoaXMtPl9IYXNTdWZmaWNpZW50UGVybWlzc2lvbnMoICdhZGR1c2VyJyApICkKCSAgICB7CgkgICAgICAkdGhpcy0+X0RvQWRkVXNlclN0ZXAxKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApOwoJICAgIH0KCSAgZWxzZSAKCSAgICB7CgkgICAgICAkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UoJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQsCgkJCQkgICAgICAkdGhpcy0+TGFuZygnYWNjZXNzZGVuaWVkJykpOwoJICAgIH0KCSAgYnJlYWs7Cgl9CgogICAgICAKICAgICAgY2FzZSAnZG9fYWRkdXNlcjInOgoJewoJICBpZiggJHRoaXMtPl9IYXNTdWZmaWNpZW50UGVybWlzc2lvbnMoICdhZGR1c2VyJyApICkKCSAgICB7CgkgICAgICAkdGhpcy0+X0Rpc3BsYXlBZG1pbkFkZFVzZXJTdGVwMlBhZ2UoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICk7CgkgICAgfQoJICBlbHNlIAoJICAgIHsKCSAgICAgICR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSgkaWQsICRwYXJhbXMsICRyZXR1cm5pZCwKCQkJCSAgICAgICR0aGlzLT5MYW5nKCdhY2Nlc3NkZW5pZWQnKSk7CgkgICAgfQoJICBicmVhazsKCX0KCiAgICAgIAogICAgICBjYXNlICdkb19hZGR1c2VyMyc6Cgl7CgkgIGlmKCAkdGhpcy0+X0hhc1N1ZmZpY2llbnRQZXJtaXNzaW9ucyggJ2FkZHVzZXInICkgKQoJICAgIHsKCSAgICAgICR0aGlzLT5fRG9BZGRVc2VyU3RlcDIoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICk7CgkgICAgfQoJICBlbHNlIAoJICAgIHsKCSAgICAgICR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSgkaWQsICRwYXJhbXMsICRyZXR1cm5pZCwKCQkJCSAgICAgICR0aGlzLT5MYW5nKCdhY2Nlc3NkZW5pZWQnKSk7CgkgICAgfQoJICBicmVhazsKCX0KCiAgICAgIGNhc2UgJ2RvX2FkbWludGFza3MnOgoJewoJICBpZiggJHRoaXMtPl9IYXNTdWZmaWNpZW50UGVybWlzc2lvbnMoJ3VzZXJzbmdyb3VwcycpICkKCSAgICB7CgkgICAgICAkdGhpcy0+X0RvQWRtaW5BY3Rpb25zKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApOwoJICAgIH0KCSAgZWxzZQoJICAgIHsKCSAgICAgICR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSgkaWQsICRwYXJhbXMsICRyZXR1cm5pZCwKCQkJCSAgICAgICR0aGlzLT5MYW5nKCdhY2Nlc3NkZW5pZWQnKSk7CgkgICAgfQoJICBicmVhazsKCX0KCiAgICAgIGNhc2UgJ2RvX2RlbGV0ZWdyb3VwJzoKCXsKCSAgaWYoICR0aGlzLT5fSGFzU3VmZmljaWVudFBlcm1pc3Npb25zKCAncmVtb3ZlZ3JvdXBzJyApICkKCSAgICB7CgkgICAgICAkdGhpcy0+X0RvRGVsZXRlR3JvdXAoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICk7CgkgICAgfQoJICBlbHNlCgkgICAgewoJICAgICAgJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlKCRpZCwgJHBhcmFtcywgJHJldHVybmlkLAoJCQkJICAgICAgJHRoaXMtPkxhbmcoJ2FjY2Vzc2RlbmllZCcpKTsKCSAgICB9CgkgIGJyZWFrOwoJfQoKICAgICAgY2FzZSAnZG9fZGVsZXRlcHJvcCc6Cgl7CgkgIC8vIGNoZWNrIHBlcm1pc3Npb25zIGFnYWluCgkgIGlmKCAkdGhpcy0+X0hhc1N1ZmZpY2llbnRQZXJtaXNzaW9ucyggJ2RlbGV0ZXByb3AnICkgKQoJICAgIHsKCSAgICAgICR0aGlzLT5fRG9EZWxldGVQcm9wZXJ0eSggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKTsKCSAgICB9CgkgIGVsc2UgCgkgICAgewoJICAgICAgJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlKCRpZCwgJHBhcmFtcywgJHJldHVybmlkLAoJCQkJICAgICAgJHRoaXMtPkxhbmcoJ2FjY2Vzc2RlbmllZCcpKTsKCSAgICB9CgkgIGJyZWFrOwoJfQoKICAgICAgY2FzZSAnZG9fZGVsZXRldXNlcic6Cgl7CgkgIGlmKCAkdGhpcy0+X0hhc1N1ZmZpY2llbnRQZXJtaXNzaW9ucyggJ3JlbW92ZXVzZXJzJyApICkKCSAgICB7CgkgICAgICAkdGhpcy0+X0RvRGVsZXRlVXNlciggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKTsKCSAgICB9CgkgIGVsc2UKCSAgICB7CgkgICAgICAkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UoJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQsCgkJCQkgICAgICAkdGhpcy0+TGFuZygnYWNjZXNzZGVuaWVkJykpOwoJICAgIH0KCSAgYnJlYWs7Cgl9CgogICAgICBjYXNlICdkb19lZGl0Z3JvdXAnOgoJewoJICBpZiggJHRoaXMtPl9IYXNTdWZmaWNpZW50UGVybWlzc2lvbnMoICdlZGl0Z3JvdXBzJyApICkKCSAgICB7CgkgICAgICAkdGhpcy0+X0RvRWRpdEdyb3VwKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApOwoJICAgIH0KCSAgZWxzZQoJICAgIHsKCSAgICAgICR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSgkaWQsICRwYXJhbXMsICRyZXR1cm5pZCwKCQkJCSAgICAgICR0aGlzLT5MYW5nKCdhY2Nlc3NkZW5pZWQnKSk7CgkgICAgfQoJICBicmVhazsKCX0KCiAgICAgIGNhc2UgJ2RvX2VkaXRwcm9wJzoKCXsKCSAgaWYoICR0aGlzLT5fSGFzU3VmZmljaWVudFBlcm1pc3Npb25zKCAnZWRpdHByb3AnICkgKQoJICAgIHsKCSAgICAgICR0aGlzLT5fRG9FZGl0UHJvcGVydHkoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICk7CgkgICAgfQoJICBlbHNlCgkgICAgewoJICAgICAgJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlKCRpZCwgJHBhcmFtcywgJHJldHVybmlkLAoJCQkJICAgICAgJHRoaXMtPkxhbmcoJ2FjY2Vzc2RlbmllZCcpKTsKCSAgICB9CgkgIGJyZWFrOwoJfQoKICAgICAgY2FzZSAnZG9fZWRpdHVzZXIxJzoKCXsKCSAgaWYoICR0aGlzLT5fSGFzU3VmZmljaWVudFBlcm1pc3Npb25zKCAnZWRpdHVzZXJzJyApICkKCSAgICB7CgkgICAgICAkdGhpcy0+X0RvRWRpdFVzZXJTdGVwMSggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKTsKCSAgICB9CgkgIGVsc2UKCSAgICB7CgkgICAgICAkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UoJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQsCgkJCQkgICAgICAkdGhpcy0+TGFuZygnYWNjZXNzZGVuaWVkJykpOwoJICAgIH0KCSAgYnJlYWs7Cgl9CgogICAgICBjYXNlICdkb19lZGl0dXNlcjInOgoJewoJICBpZiggJHRoaXMtPl9IYXNTdWZmaWNpZW50UGVybWlzc2lvbnMoICdlZGl0dXNlcnMnICkgKQoJICAgIHsKCSAgICAgICR0aGlzLT5fRGlzcGxheUFkbWluQWRkVXNlclN0ZXAyUGFnZSggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKTsKCSAgICB9CgkgIGVsc2UKCSAgICB7CgkgICAgICAkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UoJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQsCgkJCQkgICAgICAkdGhpcy0+TGFuZygnYWNjZXNzZGVuaWVkJykpOwoJICAgIH0KCSAgYnJlYWs7Cgl9CgogICAgICBjYXNlICdkb19lZGl0dXNlcjMnOgoJewoJICBpZiggJHRoaXMtPl9IYXNTdWZmaWNpZW50UGVybWlzc2lvbnMoICdlZGl0dXNlcnMnICkgKQoJICAgIHsKCSAgICAgICR0aGlzLT5fRG9FZGl0VXNlclN0ZXAzKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApOwoJICAgIH0KCSAgZWxzZQoJICAgIHsKCSAgICAgICR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSgkaWQsICRwYXJhbXMsICRyZXR1cm5pZCwKCQkJCSAgICAgICR0aGlzLT5MYW5nKCdhY2Nlc3NkZW5pZWQnKSk7CgkgICAgfQoJICBicmVhazsKCX0KCiAgICAgIGNhc2UgJ2RvX2ZvcmdvdHB3JzoKCXsKCSAgJHRoaXMtPl9Eb0ZvcmdvdFBhc3N3b3JkKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApOwoJICBicmVhazsKCX0KCiAgICAgIGNhc2UgJ2RvX2hhbmRsZXByb3BlcnR5JzoKCXsKCSAgaWYoICR0aGlzLT5fSGFzU3VmZmljaWVudFBlcm1pc3Npb25zKCAnZWRpdHByZWZzJyApICkKCSAgICB7CgkgICAgICAkdGhpcy0+X0RvU2V0UHJvcGVydGllcyggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKTsKCSAgICB9CgkgIGVsc2UKCSAgICB7CgkgICAgICAkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UoJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQsCgkJCQkgICAgICAkdGhpcy0+TGFuZygnYWNjZXNzZGVuaWVkJykpOwoJICAgIH0KCSAgYnJlYWs7Cgl9CgogICAgICBjYXNlICdkb19sb2dpbic6Cgl7CgkgICR0aGlzLT5fRG9Mb2dpbiggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKTsKCSAgYnJlYWs7Cgl9CgogICAgICBjYXNlICdkb19zZXRjaGFuZ2VzZXR0aW5nc3RlbXBsYXRlJzoKCXsKCSAgaWYoICR0aGlzLT5fSGFzU3VmZmljaWVudFBlcm1pc3Npb25zKCAndGVtcGxhdGVzJyApICkKCSAgICB7CgkgICAgICAkdGhpcy0+X0RvU2V0Q2hhbmdlU2V0dGluZ3NUZW1wbGF0ZSggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKTsKCSAgICB9CgkgIGVsc2UKCSAgICB7CgkgICAgICAkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UoJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQsCgkJCQkgICAgICAkdGhpcy0+TGFuZygnYWNjZXNzZGVuaWVkJykpOwoJICAgIH0KCSAgYnJlYWs7Cgl9CgogICAgICBjYXNlICdkb19zZXRmb3Jnb3Rwd3RlbXBsYXRlJzoKCXsKCSAgaWYoICR0aGlzLT5fSGFzU3VmZmljaWVudFBlcm1pc3Npb25zKCAndGVtcGxhdGVzJyApICkKCSAgICB7CgkgICAgICAkdGhpcy0+X0RvU2V0Rm9yZ290UFdUZW1wbGF0ZSggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKTsKCSAgICB9CgkgIGVsc2UKCSAgICB7CgkgICAgICAkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UoJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQsCgkJCQkgICAgICAkdGhpcy0+TGFuZygnYWNjZXNzZGVuaWVkJykpOwoJICAgIH0KCSAgYnJlYWs7Cgl9CgogICAgICBjYXNlICdkb19zZXRsb2dpbnRlbXBsYXRlJzoKCXsKCSAgaWYoICR0aGlzLT5fSGFzU3VmZmljaWVudFBlcm1pc3Npb25zKCAndGVtcGxhdGVzJyApICkKCSAgICB7CgkgICAgICAkdGhpcy0+X0RvU2V0TG9naW5UZW1wbGF0ZSggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKTsKCSAgICB9CgkgIGVsc2UKCSAgICB7CgkgICAgICAkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UoJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQsCgkJCQkgICAgICAkdGhpcy0+TGFuZygnYWNjZXNzZGVuaWVkJykpOwoJICAgIH0KCSAgYnJlYWs7Cgl9CgogICAgICBjYXNlICdkb19zZXRsb2dvdXR0ZW1wbGF0ZSc6Cgl7CgkgIGlmKCAkdGhpcy0+X0hhc1N1ZmZpY2llbnRQZXJtaXNzaW9ucyggJ3RlbXBsYXRlcycgKSApCgkgICAgewoJICAgICAgJHRoaXMtPl9Eb1NldExvZ291dFRlbXBsYXRlKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApOwoJICAgIH0KCSAgZWxzZQoJICAgIHsKCSAgICAgICR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSgkaWQsICRwYXJhbXMsICRyZXR1cm5pZCwKCQkJCSAgICAgICR0aGlzLT5MYW5nKCdhY2Nlc3NkZW5pZWQnKSk7CgkgICAgfQoJICBicmVhazsKCX0KCiAgICAgIGNhc2UgJ2RvX3NldHByZWZzJzoKCXsKCSAgaWYoICR0aGlzLT5fSGFzU3VmZmljaWVudFBlcm1pc3Npb25zKCAnZWRpdHByZWZzJyApICkKCSAgICB7CgkgICAgICAkdGhpcy0+X0RvU2V0UHJlZnMoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICk7CgkgICAgfQoJICBlbHNlCgkgICAgewoJICAgICAgJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlKCRpZCwgJHBhcmFtcywgJHJldHVybmlkLAoJCQkJICAgICAgJHRoaXMtPkxhbmcoJ2FjY2Vzc2RlbmllZCcpKTsKCSAgICB9CgkgIGJyZWFrOwoJfQoKICAgICAgY2FzZSAnZG9fdXNlcmNoYW5nZXNldHRpbmdzJzoKCXsKCSAgJHRoaXMtPl9Eb1VzZXJDaGFuZ2VTZXR0aW5ncyggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKTsKCSAgYnJlYWs7Cgl9CgogICAgICBjYXNlICdkb192ZXJpZnljb2RlJzoKCXsKCSAgJHRoaXMtPl9Eb1Jlc2V0VXNlckFjY291bnQoJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKTsKCSAgYnJlYWs7Cgl9CgogICAgICBjYXNlICdlZGl0Z3JvdXAnOgoJewoJICBpZiggJHRoaXMtPl9IYXNTdWZmaWNpZW50UGVybWlzc2lvbnMoICdlZGl0Z3JvdXBzJyApICkKCSAgICB7CgkgICAgICAkdGhpcy0+X0Rpc3BsYXlBZG1pbkVkaXRHcm91cFBhZ2UoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICk7CgkgICAgfQoJICBlbHNlCgkgICAgewoJICAgICAgJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlKCRpZCwgJHBhcmFtcywgJHJldHVybmlkLAoJCQkJICAgICAgJHRoaXMtPkxhbmcoJ2FjY2Vzc2RlbmllZCcpKTsKCSAgICB9CgkgIGJyZWFrOwoJfQogICAgCiAgICAgIGNhc2UgJ2VkaXRwcm9wJzoKCXsKCSAgaWYoICR0aGlzLT5fSGFzU3VmZmljaWVudFBlcm1pc3Npb25zKCAnZWRpdHByb3AnICkgKQoJICAgIHsKCSAgICAgICR0aGlzLT5fRGlzcGxheUFkbWluRWRpdFByb3BlcnR5UGFnZSggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKTsKCSAgICB9CgkgIGVsc2UKCSAgICB7CgkgICAgICAkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UoJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQsCgkJCQkgICAgICAkdGhpcy0+TGFuZygnYWNjZXNzZGVuaWVkJykpOwoJICAgIH0KCSAgYnJlYWs7Cgl9CgogICAgICBjYXNlICdlZGl0dXNlcic6Cgl7CgkgIGlmKCAkdGhpcy0+X0hhc1N1ZmZpY2llbnRQZXJtaXNzaW9ucyggJ2VkaXR1c2VycycgKSApCgkgICAgewoJICAgICAgJHRoaXMtPl9EaXNwbGF5QWRtaW5FZGl0VXNlclN0ZXAxUGFnZSggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKTsKCSAgICB9CgkgIGVsc2UKCSAgICB7CgkgICAgICAkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UoJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQsCgkJCQkgICAgICAgJHRoaXMtPkxhbmcoJ2FjY2Vzc2RlbmllZCcpKTsKCSAgICB9CgkgIGJyZWFrOwoJfQoKICAgICAgY2FzZSAnZm9yZ290cHcnOgoJewoJICAvLyB1c2VyIGl0ZW0KCSAgJHRoaXMtPl9EaXNwbGF5VXNlckZvcmdvdFBhc3N3b3JkUGFnZSggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKTsKCSAgYnJlYWs7Cgl9CgogICAgICBjYXNlICdsb2dvdXQnOgoJewoJICAkdGhpcy0+X0RvTG9nb3V0KCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApOwoJICBicmVhazsKCX0KCiAgICAgIGNhc2UgJ3ZlcmlmeWNvZGUnOgoJewoJICAkdGhpcy0+X0Rpc3BsYXlVc2VyRm9yZ290UGFzc3dvcmRWZXJpZmljYXRpb25QYWdlKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApOwoJICBicmVhazsKCX0KICAgICAgfQogIH0KCgogIGZ1bmN0aW9uIF9EaXNwbGF5QWRtaW5FZGl0R3JvdXBQYWdlKCAkaWQsICYkcGFyYW1zLCAkcmV0dXJuaWQgKQogIHsKICAgIGlmKCAhaXNzZXQoICRwYXJhbXNbJ2dyb3VwX2lkJ10gKSApCiAgICAgIHsKCSR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSAoJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQsCgkJCQkgJHRoaXMtPkxhbmcgKCdlcnJvcl9pbnN1ZmZpY2llbnRwYXJhbXMnKSk7CglyZXR1cm47CiAgICAgIH0KCiAgICAvLyBub3cgZ2V0IHRoZSBncm91cCBpbmZvCiAgICAkZ3JvdXAgPSAkdGhpcy0+R2V0R3JvdXBJbmZvKCAkcGFyYW1zWydncm91cF9pZCddICk7CiAgICBpZiggIWlzc2V0KCAkZ3JvdXBbJ2lkJ10gKSApCiAgICAgIHsKCSR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSAoJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQsICRncm91cFsxXSApOwoJCQkJIAoJcmV0dXJuOwogICAgICB9CgogICAgLy8gcG9wdWxhdGUgdGhlIHRlbXBsYXRlCiAgICBpZiggaXNzZXQoICRwYXJhbXNbJ2Vycm9yJ10gKSApCiAgICAgIHsKCSR0aGlzLT5zbWFydHktPmFzc2lnbignZXJyb3InLCRwYXJhbXNbJ2Vycm9yJ10pOwogICAgICB9CiAgICBpZiggaXNzZXQoICRwYXJhbXNbJ21lc3NhZ2UnXSApICkKICAgICAgewoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdtZXNzYWdlJywkcGFyYW1zWydtZXNzYWdlJ10pOwogICAgICB9CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3RpdGxlJywgJHRoaXMtPkxhbmcoJ2VkaXRncm91cCcpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignaGlkZGVuJywgCgkJCSAgJHRoaXMtPkNyZWF0ZUlucHV0SGlkZGVuKCAkaWQsICdncm91cF9pZCcsICRncm91cFsnaWQnXSApICk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3N0YXJ0Zm9ybScsCgkJCQkgICR0aGlzLT5DcmVhdGVGb3JtU3RhcnQgKCRpZCwKCQkJCQkJCSAgJ2RvX2VkaXRncm91cCcsCgkJCQkJCQkgICRyZXR1cm5pZCkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdlbmRmb3JtJywgJHRoaXMtPkNyZWF0ZUZvcm1FbmQgKCkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdzdWJtaXQnLAoJCQkgICR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCAoJGlkLCAnc3VibWl0JywKCQkJCQkJICAgICR0aGlzLT5MYW5nKCdzdWJtaXQnKSwgJycsICcnLCAKCQkJCQkJICAgICR0aGlzLT5MYW5nKCdjb25maXJtX2VkaXRncm91cCcpKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2NhbmNlbCcsCgkJCSAgJHRoaXMtPkNyZWF0ZUlucHV0U3VibWl0ICgkaWQsICdjYW5jZWwnLCAkdGhpcy0+TGFuZygnY2FuY2VsJykpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigncHJvbXB0X2dyb3VwbmFtZScsJHRoaXMtPkxhbmcoJ25hbWUnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdpbnB1dF9ncm91cG5hbWUnLAoJCQkgICAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0ICgkaWQsICdpbnB1dF9ncm91cG5hbWUnLAoJCQkJCQkgICAkZ3JvdXBbJ2dyb3VwbmFtZSddLCAyMCwgODApKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ3Byb21wdF9ncm91cGRlc2MnLAoJCQkgICAkdGhpcy0+TGFuZyAoJ2Rlc2NyaXB0aW9uJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnaW5wdXRfZ3JvdXBkZXNjJywKCQkJICAgJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCAoJGlkLCAnaW5wdXRfZ3JvdXBkZXNjJywKCQkJCQkJICAgJGdyb3VwWydncm91cGRlc2MnXSwgODAsIDI1NSkpOwoKICAgIC8vIGRpc3BsYXkgYSBsaXN0IG9mIHRoZSBwcm9wZXJ0aWVzIGluIGEgZm9ybQogICAgLy8gdG8gYWxsb3cgdGhlIHVzZXIgdG8gcGljayB3aGljaCBvbmVzIGFyZSByZXF1aXJlZCBhbmQgd2hpY2ggb25lcyBhcmVudC4KICAgICRwcm9wZGVmbiA9ICR0aGlzLT5HZXRQcm9wZXJ0eURlZm5zKCk7CiAgICAkZ3JvdXBwcm9wbWFwID0gJHRoaXMtPkdldEdyb3VwUHJvcGVydHlSZWxhdGlvbnMoICRncm91cFsnaWQnXSApOwogICAgJHJvd2FycmF5ID0gYXJyYXkoKTsKICAgICRyb3djbGFzcyA9ICdyb3cxJzsKICAgICRrZXlzID0gYXJyYXlfa2V5cygkdGhpcy0+dHlwZXMpOwogICAgJG9wdGlvbnMgPSBhcnJheSggJHRoaXMtPkxhbmcoJ29mZicpID0+IDAsCgkJICAgICAgJHRoaXMtPkxhbmcoJ29wdGlvbmFsJykgPT4gMSwKCQkgICAgICAkdGhpcy0+TGFuZygncmVxdWlyZWQnKSA9PiAyLAoJCSAgICAgICR0aGlzLT5MYW5nKCdoaWRkZW4nKSA9PiAzKTsKICAgIGZvcmVhY2goICRwcm9wZGVmbiBhcyAkZGVmbiApCiAgICAgIHsKCS8vIGZpbmQgdGhlIGdyb3VwIHByb3BlcnR5IG1hcCBmb3IgdGhpcyBncm91cAoJLy8gaWYgaXQgZXhpc3RzLCBpZiBpdCBkb2Vzbid0LCB0aGVuIHRoZSB2YWx1ZSBpcyAtMQoJJHNlbGVjdGVkdmFsdWUgPSAwOwoJJHNvcnRvcmRlciA9ICcnOwoJZm9yZWFjaCggJGdyb3VwcHJvcG1hcCBhcyAkbWFwICkKCXsKCSAgaWYoICRtYXBbJ25hbWUnXSA9PSAkZGVmblsnbmFtZSddICkKCSAgICB7CgkgICAgICAkc2VsZWN0ZWR2YWx1ZSA9ICRtYXBbJ3JlcXVpcmVkJ107CgkgICAgICAkc29ydG9yZGVyID0gJG1hcFsnc29ydF9rZXknXTsKCSAgICAgIGJyZWFrOwoJICAgIH0KCX0KCSRvbmVyb3cgPSBuZXcgU3RkQ2xhc3MoKTsKICAgICAgICAkb25lcm93LT5uYW1lID0gJGRlZm5bJ25hbWUnXTsKICAgICAgICAkb25lcm93LT5wcm9tcHQgPSAkZGVmblsncHJvbXB0J107Cgkkb25lcm93LT50eXBlID0gJHRoaXMtPkxhbmcoICRrZXlzWyRkZWZuWyd0eXBlJ11dICk7Cgkkb25lcm93LT5zb3J0b3JkZXIgPSAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCAkaWQsICdpbnB1dF9zb3J0b3JkZXJfJy4kZGVmblsnbmFtZSddLAoJCQkJCQkgICAgICRzb3J0b3JkZXIsIDMsIDIpOwoJJG9uZXJvdy0+cmVxdWlyZWQgPSAkdGhpcy0+Q3JlYXRlSW5wdXRSYWRpb0dyb3VwKCAkaWQsICdpbnB1dF9yZXF1aXJlZF8nLiRkZWZuWyduYW1lJ10sIAoJCQkJCQkJICAkb3B0aW9ucywkc2VsZWN0ZWR2YWx1ZSAgKTsKCSRvbmVyb3ctPnJvd2NsYXNzID0gJHJvd2NsYXNzOwoKCWFycmF5X3B1c2ggKCRyb3dhcnJheSwgJG9uZXJvdyk7CgkoJHJvd2NsYXNzID09ICJyb3cxIiA/ICRyb3djbGFzcyA9ICJyb3cyIiA6ICRyb3djbGFzcyA9ICJyb3cxIik7CiAgICAgIH0KCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3Byb3BzJywgJHJvd2FycmF5KTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigncHJvcGNvdW50Jyxjb3VudCgkcm93YXJyYXkpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignbmFtZXRleHQnLCR0aGlzLT5MYW5nKCduYW1lJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdwcm9tcHR0ZXh0JywgJHRoaXMtPkxhbmcoJ3Byb21wdCcpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigndHlwZXRleHQnLCR0aGlzLT5MYW5nKCd0eXBlJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdzb3J0b3JkZXJ0ZXh0JywkdGhpcy0+TGFuZygnc29ydG9yZGVyJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdyZXF1aXJlZHRleHQnLCR0aGlzLT5MYW5nKCdyZXF1aXJlZCcpKTsKCiAgICBlY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUgKCdhZGRncm91cC50cGwnKTsKICB9CgoKICBmdW5jdGlvbiBfRGlzcGxheUFkbWluRWRpdFByb3BlcnR5UGFnZSggJGlkLCAmJHBhcmFtcywgJHJldHVybmlkICkKICB7CiAgICAkdGhpcy0+X2RlYnVnYXJyYXkoJHBhcmFtcywgInJlY2VpdmVkIHBhcmFtcyIpOwogICAgLy8gRm9yIHRoZSBiZWxvdyBjb250cm9sIHR5cGVzIGRvbid0IHJlZHJhdyB0aGUgcGFnZSwganVzdCB1cGRhdGUuCiAgICAvLyBPdGhlcndpc2Ugd2UnbGwgbmVlZCB0byByZWRyYXcgdGhlIHBhZ2Ugd2l0aCBhZGRpdGlvbmFsIHBhcmFtcywKICAgIC8vIHN1Y2ggYXMgbGVuZ3RoIG9yIGRyb3Bkb3duIHNlbGVjdCBvcHRpb25zLgogICAgLy8gVGhlIGlucHV0IHR5cGUgd2lsbCBiZSBrbm93biBvbmx5IGF0IHRoZSBzZWNvbmQgZ28uCiAgICBpZigkcGFyYW1zWydpbnB1dF90eXBlJ10gPT0gMSB8fCAvL2NoZWNrYm94CiAgICAgICAkcGFyYW1zWydpbnB1dF90eXBlJ10gPT0gMiB8fCAvL2VtYWlsCiAgICAgICAkcGFyYW1zWydpbnB1dF90eXBlJ10gPT0gMyApeyAvL3RleHRhcmVhCiAgICAgICR0aGlzLT5SZWRpcmVjdCgkaWQsICdkb19lZGl0cHJvcCcsJHJldHVybmlkLCAkcGFyYW1zKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8vIGRpc3BsYXkgYSBmdW5reSBwYWdlIHRvIHRoZSB1c2VyIHRvIGFsbG93IGhpbSB0byBlZGl0IGEgcHJvcGVydHkgZGVmaW5pdGlvbgogICAgLy8gYWN0dWFsbHksIHdlJ2xsIGp1c3Qgc2V0IHNvbWUgc3R1ZmYgdXAgYW5kIHVzZSB0aGUgYWRkIHByb3BlcnR5IHBhZ2UKICAgIGlmKCAhaXNzZXQoICRwYXJhbXNbJ3Byb3BuYW1lJ10gKSApCiAgICAgIHsKCSRwYXJhbXNbJ2Vycm9yJ10gPSAxOwoJJHBhcmFtc1snbWVzYWdlJ10gPSAkdGhpcy0+TGFuZygnZXJyb3JfaW5zdWZmaWNlbnRwYXJhbXMnKTsKCSR0aGlzLT5teVJlZGlyZWN0VG9UYWIoJGlkLCdwcm9wZXJ0aWVzJywkcGFyYW1zKTsKCXJldHVybjsKICAgICAgfQoKICAgICRkZWZuID0gJHRoaXMtPkdldFByb3BlcnR5RGVmbiggJHBhcmFtc1sncHJvcG5hbWUnXSApOwogICAgaWYoICRkZWZuID09IEZBTFNFICkgCiAgICAgIHsKCSRwYXJhbXNbJ2Vycm9yJ10gPSAxOwoJJHBhcmFtc1snbWVzYWdlJ10gPSAkdGhpcy0+TGFuZygnZXJyb3JfcHJvcG5vdGZvdW5kJyk7CgkkdGhpcy0+bXlSZWRpcmVjdFRvVGFiKCRpZCwncHJvcGVydGllcycsJHBhcmFtc1sncHJvcG5hbWUnXSk7CglyZXR1cm47CiAgICAgIH0KICAgIAogICAgJHBhcmFtc1snZWRpdHByb3AnXQk9ICRwYXJhbXNbJ3Byb3BuYW1lJ107CiAgICBpZiAoIWlzc2V0KCRwYXJhbXNbJ2lucHV0X25hbWUnXSkpIHsKICAgICAgJHBhcmFtc1snaW5wdXRfbmFtZSddIAk9ICRwYXJhbXNbJ3Byb3BuYW1lJ107CiAgICB9CiAgICBpZiAoIWlzc2V0KCRwYXJhbXNbJ2lucHV0X3Byb21wdCddKSkgewogICAgICAkcGFyYW1zWydpbnB1dF9wcm9tcHQnXQk9ICRkZWZuWydwcm9tcHQnXTsKICAgIH0KICAgIGlmKGlzc2V0KCRwYXJhbXNbJ2lucHV0X3R5cGUnXSkpewogICAgICAkcGFyYW1zWyduZXdfdHlwZSddCT0gJHBhcmFtc1snaW5wdXRfdHlwZSddOwogICAgfQogICAgJHBhcmFtc1snaW5wdXRfdHlwZSddCT0gJGRlZm5bJ3R5cGUnXTsKICAgIGlmICghaXNzZXQoJHBhcmFtc1snaW5wdXRfbGVuZ3RoJ10pKSB7CiAgICAgICRwYXJhbXNbJ2lucHV0X2xlbmd0aCddCT0gJGRlZm5bJ2xlbmd0aCddOwogICAgfQogICAgaWYgKCFpc3NldCgkcGFyYW1zWydpbnB1dF9tYXhsZW5ndGgnXSkpIHsKICAgICAgJHBhcmFtc1snaW5wdXRfbWF4bGVuZ3RoJ10gPSAkZGVmblsnbWF4bGVuZ3RoJ107CiAgICB9CgogICAgJHRoaXMtPm15UmVkaXJlY3QoJGlkLCdhZGRwcm9wJywkcGFyYW1zKTsKICB9CgoKICBmdW5jdGlvbiBfRGlzcGxheUFkbWluRWRpdFVzZXJTdGVwMVBhZ2UoICRpZCwgJiRwYXJhbXMsICRyZXR1cm5pZCApCiAgewogICAgaWYoICFpc3NldCggJHBhcmFtc1sndXNlcl9pZCddICkgKQogICAgICB7CgkkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UgKCRpZCwgJHBhcmFtcywgJHJldHVybmlkLAoJCQkJICR0aGlzLT5MYW5nICgnZXJyb3JfaW5zdWZmaWNpZW50cGFyYW1zJykpOwoJcmV0dXJuOwogICAgICB9CgogICAgLy8gbm93IGdldCB0aGUgdXNlciBpbmZvCiAgICAkdXNlciA9ICR0aGlzLT5HZXRVc2VySW5mbyggJHBhcmFtc1sndXNlcl9pZCddICk7CiAgICBpZiggJHVzZXJbMF0gPT0gZmFsc2UgKQogICAgICB7CgkkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UgKCRpZCwgJHBhcmFtcywgJHJldHVybmlkLCAkdXNlclsxXSApOwoJcmV0dXJuOwogICAgICB9CiAgICAkdXNlciA9ICR1c2VyWzFdOwoKICAgIC8vIGdldCB0aGUgdXNlciBwcm9wZXJ0aWVzCiAgICAkcHJvcHMgPSAkdGhpcy0+R2V0VXNlclByb3BlcnRpZXMoICRwYXJhbXNbJ3VzZXJfaWQnXSApOwogICAgCiAgICAvLyBnZXQgdGhlIGdyb3VwIG1lbWJlcnNoaXBzCiAgICAkZ3JvdXBzID0gJHRoaXMtPkdldE1lbWJlckdyb3Vwc0FycmF5KCAkcGFyYW1zWyd1c2VyX2lkJ10gKTsKLy8gdG9kbywgdXNlcnMgbWF5IChvcHRpb25hbGx5KSBub3QgYmUgcGFydCBvZiBhbnkgZ3J1b3BzCi8vICAgICBpZiggJGdyb3VwcyA9PSBmYWxzZSApCi8vICAgICAgIHsKLy8gCSR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSAoJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQsICR0aGlzLT5MYW5nKCdlcnJvcl9tZW1iZXJncm91cHMnKSApOwovLyAJcmV0dXJuOwovLyAgICAgICB9CgogICAgLy8gcG9wdWxhdGUgdGhlIHBhcmFtcyB3aXRoIHRoZSBhcHByb3ByaWF0ZSBzdHVmZgogICAgLy8gdGhhdCB3ZSBqdXN0IGxvYWRlZAogICAgJHBhcmFtc1snaW5wdXRfdXNlcm5hbWUnXSA9ICR1c2VyWyd1c2VybmFtZSddOwogICAgJHBhcmFtc1snaW5wdXRfZXhwaXJlc2RhdGUnXSA9ICR1c2VyWydleHBpcmVzJ107Ci8vICAgICAkcGFyYW1zWydpbnB1dF9wYXNzd29yZCddID0gJHVzZXJbJ3Bhc3N3b3JkJ107ICAvLyB0aGUgcGFzc3dvcmQgcm93IGlzIG1kNSBoYXNoZWQsIGRvbid0IGJvdGhlciBkaXNwbGF5aW5nIGl0Ci8vICAgICAkcGFyYW1zWydpbnB1dF9yZXBlYXRwYXNzd29yZCddID0gJHVzZXJbJ3Bhc3N3b3JkJ107CiAgICAkdXNlcnByb3BzID0gJyc7CiAgICBmb3JlYWNoKCAkcHJvcHMgYXMgJHByb3AgKQogICAgewogICAgICBpZiggJHVzZXJwcm9wcyA9PSAnJyApCgl7CgkgICR1c2VycHJvcHMgPSAkcHJvcFsndGl0bGUnXS4iPSIuJHByb3BbJ2RhdGEnXTsKCX0KICAgICAgZWxzZQoJewoJICAkdXNlcnByb3BzIC49ICIsIi4kcHJvcFsndGl0bGUnXS4iPSIuJHByb3BbJ2RhdGEnXTsKCX0KICAgIH0KICAgICRwYXJhbXNbJ3VzZXJwcm9wcyddID0gJHVzZXJwcm9wczsKCiAgICAkbWVtYmVyb2YgPSAnJzsKICAgIGlmKCAkZ3JvdXBzICE9IGZhbHNlICkKICAgICAgewoJZm9yZWFjaCggJGdyb3VwcyBhcyAkZ3JvdXAgKQoJewoJICAkcGFyYW1zWydtZW1iZXJvZl8nLiRncm91cFsnZ3JvdXBpZCddXSA9ICRncm91cFsnZ3JvdXBpZCddOwoJfQogICAgICB9CgogICAgLy8gYW5kIGRpc3BsYXkgdGhlIHVzZXIgcGFnZQogICAgLy8gdG9kbywgcHV0IGEgcmVkaXJlY3QgaGVyZQogICAgJHRoaXMtPl9EaXNwbGF5QWRtaW5Vc2VyUGFnZSggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKTsKICB9CgoKICBmdW5jdGlvbiBfRGlzcGxheUFkbWluR3JvdXBzVGFiKCRpZCwgJiRwYXJhbXMsICRyZXR1cm5pZCApCiAgewogICAgZ2xvYmFsICRnQ21zOwogICAgJGRiID0gJHRoaXMtPkdldERiKCk7CiAgICAkZ3JvdXBzID0gJHRoaXMtPkdldEdyb3VwTGlzdEZ1bGwoKTsKICAgICRyb3djbGFzcyA9ICdyb3cxJzsKCiAgICAkcm93YXJyYXkgPSBhcnJheSgpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCAnZ3JvdXBzZm91bmQnLCAkdGhpcy0+TGFuZygnZ3JvdXBzZm91bmQnKSk7CiAgICBmb3JlYWNoKCAkZ3JvdXBzIGFzICRvbmVncm91cCApCiAgICB7CiAgICAgIGlmKCAkdGhpcy0+X0hhc1N1ZmZpY2llbnRQZXJtaXNzaW9ucygnbGlzdGdyb3VwcycpICkKCXsKCSAgJG9uZXJvdyA9IG5ldyBzdGRDbGFzcygpOwoJICAkb25lcm93LT5pZCA9ICRvbmVncm91cFsnaWQnXTsKCSAgJG9uZXJvdy0+bmFtZSA9CgkgICAgJHRoaXMtPkNyZWF0ZUxpbmsoICRpZCwgJ2VkaXRncm91cCcsICRyZXR1cm5pZCwgJG9uZWdyb3VwWydncm91cG5hbWUnXSwKCQkJICAgICAgIGFycmF5ICgnZ3JvdXBfaWQnID0+ICRvbmVncm91cFsnaWQnXSkpOwkJCSAgICAgICAKCSAgJG9uZXJvdy0+ZGVzYyA9ICRvbmVncm91cFsnZ3JvdXBkZXNjJ107CgkgICRvbmVyb3ctPnJvd2NsYXNzID0gJHJvd2NsYXNzOwoKCSAgaWYoICR0aGlzLT5fSGFzU3VmZmljaWVudFBlcm1pc3Npb25zKCdlZGl0Z3JvdXBzJykgKQoJICAgIHsKCSAgICAgICRvbmVyb3ctPmVkaXRsaW5rID0KCQkkdGhpcy0+Q3JlYXRlTGluayAoJGlkLCAnZWRpdGdyb3VwJywgJHJldHVybmlkLAoJCQkJICAgJGdDbXMtPnZhcmlhYmxlc1snYWRtaW50aGVtZSddLT5EaXNwbGF5SW1hZ2UgKCdpY29ucy9zeXN0ZW0vZWRpdC5naWYnLAoJCQkJCQkJCQkJICR0aGlzLT5MYW5nICgnZWRpdCcpLCAnJywgJycsICdzeXN0ZW1pY29uJyksCgkJCQkgICBhcnJheSAoJ2dyb3VwX2lkJyA9PiAkb25lZ3JvdXBbJ2lkJ10pKTsKCQl9CgkgIGlmKCAkdGhpcy0+X0hhc1N1ZmZpY2llbnRQZXJtaXNzaW9ucygncmVtb3ZlZ3JvdXBzJykgKQoJICAgIHsKCSAgICAgICRvbmVyb3ctPmRlbGV0ZWxpbmsgPQoJCSR0aGlzLT5DcmVhdGVMaW5rICgkaWQsICdkb19kZWxldGVncm91cCcsICRyZXR1cm5pZCwKCQkJCSAgICRnQ21zLT52YXJpYWJsZXNbJ2FkbWludGhlbWUnXS0+RGlzcGxheUltYWdlICgnaWNvbnMvc3lzdGVtL2RlbGV0ZS5naWYnLAoJCQkJCQkJCQkJICR0aGlzLT5MYW5nICgnZGVsZXRlJyksICcnLCAnJywgJ3N5c3RlbWljb24nKSwKCQkJCSAgIGFycmF5ICgnZ3JvdXBfaWQnID0+ICRvbmVncm91cFsnaWQnXSksCgkJCQkgICAkdGhpcy0+TGFuZyAoJ2FyZXlvdXN1cmVfZGVsZXRlZ3JvdXAnKSk7CgkgICAgfQoJICAKCSAgYXJyYXlfcHVzaCAoJHJvd2FycmF5LCAkb25lcm93KTsKCSAgKCRyb3djbGFzcyA9PSAicm93MSIgPyAkcm93Y2xhc3MgPSAicm93MiIgOiAkcm93Y2xhc3MgPSAicm93MSIpOwoJfQoKICAgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpdGVtY291bnQnLGNvdW50KCRyb3dhcnJheSkpOwogICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2l0ZW1zJywkcm93YXJyYXkpOwogICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2dyb3Vwc2ZvdW5kJywgJHRoaXMtPkxhbmcoJ2dyb3Vwc2ZvdW5kJykgKTsKICAgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpZHRleHQnLCAkdGhpcy0+TGFuZyggJ2lkJyApKTsKICAgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCduYW1ldGV4dCcsICR0aGlzLT5MYW5nKCAnbmFtZScgKSk7CiAgICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignZGVzY3RleHQnLCAkdGhpcy0+TGFuZyggJ2Rlc2NyaXB0aW9uJyApKTsKICAgIH0KCiAgICBpZiggJHRoaXMtPl9IYXNTdWZmaWNpZW50UGVybWlzc2lvbnMoJ2xpc3Rncm91cHMnKSApCiAgICAgIHsKCSR0aGlzLT5zbWFydHktPmFzc2lnbignYWRkbGluaycsIAoJCQkgICAgICAkdGhpcy0+Q3JlYXRlTGluayggJGlkLCAnYWRkZ3JvdXAnLAoJCQkJCQkgJHJldHVybmlkLAoJCQkJCQkgJHRoaXMtPkxhbmcoJ2FkZGdyb3VwJyksCgkJCQkJCSBhcnJheSgpLCAnJywgZmFsc2UsCgkJCQkJCSBmYWxzZSwKCQkJCQkJICdjbGFzcz0icGFnZW9wdGlvbnMiJykpOwogICAgICB9CgogICAgZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCAnZ3JvdXBsaXN0LnRwbCcgKTsKICB9CgoKICBmdW5jdGlvbiBfRGlzcGxheUFkbWluQ2hhbmdlU2V0dGluZ3NUZW1wbGF0ZVRhYiggJGlkLCAmJHBhcmFtcywgJHJldHVybmlkICkKICB7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3N0YXJ0Zm9ybScsCgkJCSAgJHRoaXMtPkNyZWF0ZUZvcm1TdGFydCggJGlkLCAnZG9fc2V0Y2hhbmdlc2V0dGluZ3N0ZW1wbGF0ZScpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigncHJvbXB0X3RlbXBsYXRlJywkdGhpcy0+TGFuZygndGVtcGxhdGUnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2lucHV0X3RlbXBsYXRlJywKCQkJICAkdGhpcy0+Q3JlYXRlVGV4dEFyZWEoIGZhbHNlLCAkaWQsCgkJCQkJICAgICAkdGhpcy0+R2V0VGVtcGxhdGUgKCdmZXVzZXJzX2NoYW5nZXNldHRpbmdzZm9ybScpLAoJCQkJCQkgJ3RlbXBsYXRlY29udGVudCcpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignc3VibWl0JywKCQkJCSAgJHRoaXMtPkNyZWF0ZUlucHV0U3VibWl0ICgkaWQsICdzdWJtaXQnLAoJCQkJCQkJICAgICR0aGlzLT5MYW5nKCdzdWJtaXQnKSkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdkZWZhdWx0cycsCgkJCQkgICR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCAoJGlkLCAnZGVmYXVsdHMnLAoJCQkJCQkJICAgICR0aGlzLT5MYW5nKCdkZWZhdWx0cycpKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2VuZGZvcm0nLCR0aGlzLT5DcmVhdGVGb3JtRW5kKCkpOwogICAgZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCd0ZW1wbGF0ZWZvcm0udHBsJyk7CiAgfQoKCiAgZnVuY3Rpb24gX0Rpc3BsYXlBZG1pbkZvcmdvdFBhc3N3b3JkVGVtcGxhdGVUYWIoICRpZCwgJiRwYXJhbXMsICRyZXR1cm5pZCApCiAgewogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdzdGFydGZvcm0nLAoJCQkgICR0aGlzLT5DcmVhdGVGb3JtU3RhcnQoICRpZCwgJ2RvX3NldGZvcmdvdHB3dGVtcGxhdGUnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3Byb21wdF90ZW1wbGF0ZTEnLCR0aGlzLT5MYW5nKCdmb3Jnb3RwYXNzd29yZF90ZW1wbGF0ZScpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignaW5wdXRfdGVtcGxhdGUxJywKCQkJICAkdGhpcy0+Q3JlYXRlVGV4dEFyZWEoIGZhbHNlLCAkaWQsCgkJCQkJICAgICAkdGhpcy0+R2V0VGVtcGxhdGUgKCdmZXVzZXJzX2ZvcmdvdHBhc3N3b3JkZm9ybScpLAoJCQkJCQkgJ3RlbXBsYXRlY29udGVudDEnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3Byb21wdF90ZW1wbGF0ZTInLCR0aGlzLT5MYW5nKCdmb3Jnb3RwYXNzd29yZF9lbWFpbHRlbXBsYXRlJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpbnB1dF90ZW1wbGF0ZTInLAoJCQkgICR0aGlzLT5DcmVhdGVUZXh0QXJlYSggZmFsc2UsICRpZCwKCQkJCQkgICAgICR0aGlzLT5HZXRUZW1wbGF0ZSAoJ2ZldXNlcnNfZm9yZ290cGFzc3dvcmRlbWFpbGZvcm0nKSwKCQkJCQkJICd0ZW1wbGF0ZWNvbnRlbnQyJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdwcm9tcHRfdGVtcGxhdGUzJywkdGhpcy0+TGFuZygnZm9yZ290cGFzc3dvcmRfdmVyaWZ5dGVtcGxhdGUnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2lucHV0X3RlbXBsYXRlMycsCgkJCSAgJHRoaXMtPkNyZWF0ZVRleHRBcmVhKCBmYWxzZSwgJGlkLAoJCQkJCSAgICAgJHRoaXMtPkdldFRlbXBsYXRlICgnZmV1c2Vyc19mb3Jnb3RwYXNzd29yZHZlcmlmeWZvcm0nKSwKCQkJCQkJICd0ZW1wbGF0ZWNvbnRlbnQzJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdzdWJtaXQnLAoJCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQgKCRpZCwgJ3N1Ym1pdCcsCgkJCQkJCQkgICAgJHRoaXMtPkxhbmcoJ3N1Ym1pdCcpKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2RlZmF1bHRzJywKCQkJCSAgJHRoaXMtPkNyZWF0ZUlucHV0U3VibWl0ICgkaWQsICdkZWZhdWx0cycsCgkJCQkJCQkgICAgJHRoaXMtPkxhbmcoJ2RlZmF1bHRzJykpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignZW5kZm9ybScsJHRoaXMtPkNyZWF0ZUZvcm1FbmQoKSk7CiAgICBlY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUoJ2ZvcmdvdHB3X3RlbXBsYXRlZm9ybS50cGwnKTsKICB9CgoKICBmdW5jdGlvbiBfRGlzcGxheUFkbWluTG9naW5UZW1wbGF0ZVRhYiggJGlkLCAmJHBhcmFtcywgJHJldHVybmlkICkKICB7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3N0YXJ0Zm9ybScsCgkJCSAgJHRoaXMtPkNyZWF0ZUZvcm1TdGFydCggJGlkLCAnZG9fc2V0bG9naW50ZW1wbGF0ZScpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigncHJvbXB0X3RlbXBsYXRlJywkdGhpcy0+TGFuZygndGVtcGxhdGUnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2lucHV0X3RlbXBsYXRlJywKCQkJICAkdGhpcy0+Q3JlYXRlVGV4dEFyZWEoIGZhbHNlLCAkaWQsCgkJCQkJICAgICAkdGhpcy0+R2V0VGVtcGxhdGUgKCdmZXVzZXJzX2xvZ2luZm9ybScpLAoJCQkJCQkgJ3RlbXBsYXRlbG9naW5mb3JtJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdzdWJtaXQnLAoJCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQgKCRpZCwgJ3N1Ym1pdCcsCgkJCQkJCQkgICAgJHRoaXMtPkxhbmcoJ3N1Ym1pdCcpKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2RlZmF1bHRzJywKCQkJCSAgJHRoaXMtPkNyZWF0ZUlucHV0U3VibWl0ICgkaWQsICdkZWZhdWx0cycsCgkJCQkJCQkgICAgJHRoaXMtPkxhbmcoJ2RlZmF1bHRzJykpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignZW5kZm9ybScsJHRoaXMtPkNyZWF0ZUZvcm1FbmQoKSk7CiAgICBlY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUoJ3RlbXBsYXRlZm9ybS50cGwnKTsKICB9CgoKICBmdW5jdGlvbiBfRGlzcGxheUFkbWluTG9nb3V0VGVtcGxhdGVUYWIoICRpZCwgJiRwYXJhbXMsICRyZXR1cm5pZCApCiAgewogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdzdGFydGZvcm0nLAoJCQkgICR0aGlzLT5DcmVhdGVGb3JtU3RhcnQoICRpZCwgJ2RvX3NldGxvZ291dHRlbXBsYXRlJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdwcm9tcHRfdGVtcGxhdGUnLCR0aGlzLT5MYW5nKCd0ZW1wbGF0ZScpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignaW5wdXRfdGVtcGxhdGUnLAoJCQkgICR0aGlzLT5DcmVhdGVUZXh0QXJlYSggZmFsc2UsICRpZCwKCQkJCQkgICAgICR0aGlzLT5HZXRUZW1wbGF0ZSAoJ2ZldXNlcnNfbG9nb3V0Zm9ybScpLAoJCQkJCQkgJ3RlbXBsYXRlbG9nb3V0Zm9ybScpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignc3VibWl0JywKCQkJCSAgJHRoaXMtPkNyZWF0ZUlucHV0U3VibWl0ICgkaWQsICdzdWJtaXQnLAoJCQkJCQkJICAgICR0aGlzLT5MYW5nKCdzdWJtaXQnKSkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdkZWZhdWx0cycsCgkJCQkgICR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCAoJGlkLCAnZGVmYXVsdHMnLAoJCQkJCQkJICAgICR0aGlzLT5MYW5nKCdkZWZhdWx0cycpKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2VuZGZvcm0nLCR0aGlzLT5DcmVhdGVGb3JtRW5kKCkpOwogICAgZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCd0ZW1wbGF0ZWZvcm0udHBsJyk7CiAgfQoKCiAgZnVuY3Rpb24gX0Rpc3BsYXlBZG1pblByb3BlcnRpZXNUYWIoICRpZCwgJiRwYXJhbXMsICRyZXR1cm5pZCApCiAgewogICAgZ2xvYmFsICRnQ21zOwogICAgJG1lc3NhZ2UgPSAnJzsKICAgIGlmKCBpc3NldCggJHBhcmFtc1snbWVzc2FnZSddICkgKQogICAgICB7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ21lc3NhZ2UnLCAkbWVzc2FnZSk7CiAgICAgIH0KCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3RpdGxlJywkdGhpcy0+TGFuZygncHJvcGVydGllcycpKTsKCiAgICAkZGVmbnMgPSAkdGhpcy0+R2V0UHJvcGVydHlEZWZucygpOwogICAgJHJvd2FycmF5ID0gYXJyYXkoKTsKICAgICRyb3djbGFzcyA9ICdyb3cxJzsKICAgICRrZXlzID0gYXJyYXlfa2V5cygkdGhpcy0+dHlwZXMpOwogICAgZm9yZWFjaCggJGRlZm5zIGFzICRkZWZuICkKICAgIHsKICAgICAgJHByb3Bncm91cHMgPSAkdGhpcy0+R2V0UHJvcGVydHlHcm91cFJlbGF0aW9ucygkZGVmblsnbmFtZSddKTsKCiAgICAgICRvbmVyb3cgPSBuZXcgU3RkQ2xhc3MoKTsKICAgICAgaWYoICR0aGlzLT5fSGFzU3VmZmljaWVudFBlcm1pc3Npb25zKCdlZGl0cHJvcCcpKSAKCXsKCSAgJG9uZXJvdy0+bmFtZSA9IAoJICAgICR0aGlzLT5DcmVhdGVMaW5rKCAkaWQsICdlZGl0cHJvcCcsICRyZXR1cm5pZCwgJGRlZm5bJ25hbWUnXSwKCQkJICAgICAgIGFycmF5KCdwcm9wbmFtZScgPT4gJGRlZm5bJ25hbWUnXSkpOwoJfQogICAgICBlbHNlCgl7CgkgICRvbmVyb3ctPm5hbWUgPSAkZGVmblsnbmFtZSddOwoJfQogICAgICAkb25lcm93LT5wcm9tcHQgPSAkZGVmblsncHJvbXB0J107CiAgICAgICRvbmVyb3ctPnR5cGUgPSAkdGhpcy0+TGFuZyggJGtleXNbJGRlZm5bJ3R5cGUnXV0gKTsKICAgICAgJG9uZXJvdy0+bGVuZ3RoID0gJGRlZm5bJ2xlbmd0aCddOwogICAgICAkb25lcm93LT5yb3djbGFzcyA9ICRyb3djbGFzczsKCiAgICAgIGlmKCAkdGhpcy0+X0hhc1N1ZmZpY2llbnRQZXJtaXNzaW9ucygnZWRpdHByb3AnKSkKCXsKCSAgJG9uZXJvdy0+ZWRpdGxpbmsgPQoJICAgICR0aGlzLT5DcmVhdGVMaW5rICgkaWQsICdlZGl0cHJvcCcsICRyZXR1cm5pZCwKCQkJICAgICAgICRnQ21zLT52YXJpYWJsZXNbJ2FkbWludGhlbWUnXS0+RGlzcGxheUltYWdlKCdpY29ucy9zeXN0ZW0vZWRpdC5naWYnLAoJCQkJCQkJCQkgICAgJHRoaXMtPkxhbmcgKCdlZGl0JyksICcnLCAnJywgJ3N5c3RlbWljb24nKSwKCQkJICAgICAgIGFycmF5KCdwcm9wbmFtZScgPT4gJGRlZm5bJ25hbWUnXSkpOwoKCSAgaWYoIGNvdW50KCRwcm9wZ3JvdXBzKSA9PSAwICkKCSAgICB7CgkgICAgICAkb25lcm93LT5kZWxldGVsaW5rID0KCQkkdGhpcy0+Q3JlYXRlTGluayAoJGlkLCAnZG9fZGVsZXRlcHJvcCcsICRyZXR1cm5pZCwKCQkJCSAgICRnQ21zLT52YXJpYWJsZXNbJ2FkbWludGhlbWUnXS0+RGlzcGxheUltYWdlKCdpY29ucy9zeXN0ZW0vZGVsZXRlLmdpZicsCgkJCQkJCQkJCQkkdGhpcy0+TGFuZyAoJ2RlbGV0ZScpLCAnJywgJycsICdzeXN0ZW1pY29uJyksCgkJCQkgICBhcnJheSgncHJvcG5hbWUnID0+ICRkZWZuWyduYW1lJ10sICdwcm9wdHlwZScgPT4gJGRlZm5bJ3R5cGUnXSksIAoJCQkJICAgJHRoaXMtPkxhbmcoJ2NvbmZpcm1fZGVsZXRlX3Byb3AnKSk7CgkgICAgfQoJfQoKICAgICAgYXJyYXlfcHVzaCAoJHJvd2FycmF5LCAkb25lcm93KTsKICAgICAgKCRyb3djbGFzcyA9PSAicm93MSIgPyAkcm93Y2xhc3MgPSAicm93MiIgOiAkcm93Y2xhc3MgPSAicm93MSIpOwogICAgfQoKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignbmFtZXRleHQnLCR0aGlzLT5MYW5nKCduYW1lJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdsZW5ndGh0ZXh0JywkdGhpcy0+TGFuZygnbGVuZ3RoJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdwcm9tcHR0ZXh0JywkdGhpcy0+TGFuZygncHJvbXB0JykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCd0eXBldGV4dCcsJHRoaXMtPkxhbmcoJ3R5cGUnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3Byb3BzJywkcm93YXJyYXkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdwcm9wY291bnQnLCBjb3VudCgkcm93YXJyYXkpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigncHJvcHNmb3VuZCcsJHRoaXMtPkxhbmcoJ3Byb3BzZm91bmQnKSk7CgogICAgaWYoICR0aGlzLT5fSGFzU3VmZmljaWVudFBlcm1pc3Npb25zKCdhZGRwcm9wJykgKQogICAgICB7CgkvLyB0b2RvLCBhZGQgYSBwZXJtaXNzaW9uIGNoZWNrIGFyb3VuZCB0aGlzCgkvLyBtYXliZSBjcmVhdGUgYW4gImVkaXQgZnJvbnRlbmR1c2VyIHByb3BlcnRpZXMiIHBlcm1pc3Npb24KCSR0aGlzLT5zbWFydHktPmFzc2lnbignYWRkbGluaycsIAoJCQkgICAgICAkdGhpcy0+Q3JlYXRlTGluayggJGlkLCAnYWRkcHJvcCcsCgkJCQkJCSAkcmV0dXJuaWQsCgkJCQkJCSAkdGhpcy0+TGFuZygnYWRkcHJvcCcpLAoJCQkJCQkgYXJyYXkoKSwgJycsIGZhbHNlLAoJCQkJCQkgZmFsc2UsCgkJCQkJCSAnY2xhc3M9InBhZ2VvcHRpb25zIicpKTsKICAgICAgfQoKCiAgICBlY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUoJ3Byb3BlcnRpZXNmb3JtLnRwbCcpOwogIH0KCgogIGZ1bmN0aW9uIF9EaXNwbGF5QWRtaW5Vc2Vyc1RhYigkaWQsICYkcGFyYW1zLCAkcmV0dXJuaWQpCiAgewogICAgLy8gdGhpcyB0YWIgaGFzIG1lcmVseSBvbmUgbW9mbyBsaXN0IG9mIHVzZXMgYW5kIHRoZSBhYmlsaXR5IHRvIGVkaXQgdGhlbSwgCiAgICAvLyBzZWUgZGV0YWlscyBhYm91dCB0aGVtLCBhbmQgdGhlbiBkZWxldGUgdGhlbQogICAgLy8gbWF5YmUgc2VuZCBhbiBlbWFpbCB0byB0aGVtIHRvbyBpZiBJIGdldCBhcm91bmQgdG8gaXQgdGhhdCBpcy4KCiAgICBpZiggJHRoaXMtPl9IYXNTdWZmaWNpZW50UGVybWlzc2lvbnMoJ2xpc3R1c2VycycpICkKICAgICAgewoJLy8gZmlsdGVyaW5nIHN0dWZmCglpZiggaXNzZXQoICRwYXJhbXNbJ2ZpbHRlciddKSApCgkgIHsKCSAgICBpZiggaXNzZXQoICRwYXJhbXNbJ2ZpbHRlcl9ncm91cCddICkgKQoJICAgICAgewoJCSR0aGlzLT5TZXRQcmVmZXJlbmNlKCdjdXJyZW50X2dyb3VwJywgJHBhcmFtc1snZmlsdGVyX2dyb3VwJ10gKTsKCSAgICAgIH0KCSAgICBpZiggaXNzZXQoICRwYXJhbXNbJ2ZpbHRlcl9yZWdleCddICkgKQoJICAgICAgewoJCSR0aGlzLT5TZXRQcmVmZXJlbmNlKCdjdXJyZW50X3JlZ2V4JywgJHBhcmFtc1snZmlsdGVyX3JlZ2V4J10gKTsKCSAgICAgIH0KCSAgICBpZiggaXNzZXQoICRwYXJhbXNbJ2ZpbHRlcl9saW1pdCddICkgKQoJICAgICAgewoJCSR0aGlzLT5TZXRQcmVmZXJlbmNlKCdjdXJyZW50X2xpbWl0JywgJHBhcmFtc1snZmlsdGVyX2xpbWl0J10gKTsKCSAgICAgIH0KCSAgICBpZiggaXNzZXQoICRwYXJhbXNbJ2ZpbHRlcl9zb3J0YnknXSApICkKCSAgICAgIHsKCQkkdGhpcy0+U2V0UHJlZmVyZW5jZSgnY3VycmVudF9zb3J0JywgJHBhcmFtc1snZmlsdGVyX3NvcnRieSddICk7CgkgICAgICB9CgkgIH0KCSRjdXJncm91cCA9ICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdjdXJyZW50X2dyb3VwJywgJycpOwoJJGN1cnJlZ2V4ID0gJHRoaXMtPkdldFByZWZlcmVuY2UoJ2N1cnJlbnRfcmVnZXgnLCAnJyk7CgkkY3VybGltaXQgPSAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnY3VycmVudF9saW1pdCcsIC0xKTsKCSRjdXJzb3J0ICA9ICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdjdXJyZW50X3NvcnQnLCAnJyk7CgkKCS8vIGdldCBhIGdyb3VwIGxpc3QgZm9yIHRoZSBmaWx0ZXIKCS8vIGl0IHNob3VsZCBiZSByZWFkeSB0byBnbyByaWdodCBpbnRvIHRoZSBkcm9wZG93biAoY29vbCBlaCkKCSRncm91cHMxID0gJHRoaXMtPkdldEdyb3VwTGlzdCgpOwoJJGdyb3VwcyA9IGFycmF5X21lcmdlKCBhcnJheSgiQWxsIEdyb3VwcyIgPT4gLTEpLCAkZ3JvdXBzMSApOwoJCgkvLyBhIHB1bGxkb3duIGxpc3QgZm9yIGxpbWl0cwoJJGxpbWl0cyA9IGFycmF5KCAnMTAwJyA9PiAxMDAsCgkJCSAnMTAnID0+IDEwLAoJCQkgJzI1JyA9PiAyNSwKCQkJICc1MCcgPT4gNTAsCgkJCSAnMjUwJyA9PiAyNTAsCgkJCSAnNTAwJyA9PiA1MDAgKTsKCSRzb3J0cyA9IGFycmF5ICgnVXNlcm5hbWUnID0+ICd1c2VybmFtZScsCgkJCSdVc2VybmFtZSAoZGVzY2VuZGluZyknID0+ICd1c2VybmFtZSBkZXNjJywKCQkJJ0NyZWF0ZSBEYXRlJyA9PiAnY3JlYXRlZGF0ZScsCgkJCSdDcmVhdGUgRGF0ZSAoZGVzY2VuZGluZyknID0+ICdjcmVhdGVkYXRlIGRlc2MnLAoJCQknRXhwaXJ5IERhdGUnID0+ICdleHBpcmVzJywKCQkJJ0V4cGlyeSBEYXRlIChkZXNjZW5kaW5nKScgPT4gJ2V4cGlyZXMgZGVzYycpOwoJLy8gbm93IHNldHVwIHRoZSB0ZW1wbGF0ZSBmaWVsZHMKCSR0aGlzLT5zbWFydHktPmFzc2lnbiggJ3Byb21wdF9maWx0ZXInLCAkdGhpcy0+TGFuZygnZmlsdGVyJykpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCAncHJvbXB0X3NvcnQnLCAkdGhpcy0+TGFuZygnc29ydCcpKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbiggJ3N0YXJ0Zm9ybScsCgkJCSAgICAgICAkdGhpcy0+Q3JlYXRlRm9ybVN0YXJ0KCAkaWQsICdkZWZhdWx0YWRtaW4nKSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oICdwcm9tcHRfZ3JvdXAnLCAkdGhpcy0+TGFuZygnZ3JvdXAnKSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oICd1c2Vyc2ZvdW5kJywgJHRoaXMtPkxhbmcoJ3VzZXJzZm91bmQnKSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oICd1c2Vyc2luZ3JvdXAnLCAkdGhpcy0+TGFuZygndXNlcnNpbmdyb3VwJykpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCAnZmlsdGVyX2dyb3VwJywKCQkJICAgICAgICR0aGlzLT5DcmVhdGVJbnB1dERyb3BEb3duKCAkaWQsICdmaWx0ZXJfZ3JvdXAnLCAkZ3JvdXBzLCAtMSwKCQkJCQkJCSAgICRjdXJncm91cCkpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCAncHJvbXB0X3VzZXJmaWx0ZXInLCAkdGhpcy0+TGFuZygndXNlcmZpbHRlcicpKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbiggJ2ZpbHRlcl9yZWdleCcsIAoJCQkgICAgICAgJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCggJGlkLCAnZmlsdGVyX3JlZ2V4JywKCQkJCQkJICAgICAgICRjdXJyZWdleCwgMjAsIDIwICkpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCAncHJvbXB0X2xpbWl0JywKCQkJICAgICAgICR0aGlzLT5MYW5nKCd1c2VybGltaXQnKSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oICdmaWx0ZXJfbGltaXQnLAoJCQkgICAgICAgJHRoaXMtPkNyZWF0ZUlucHV0RHJvcERvd24oICRpZCwgJ2ZpbHRlcl9saW1pdCcsICRsaW1pdHMsIC0xLAoJCQkJCQkJICAgJGN1cmxpbWl0KSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oICdwcm9tcHRfc29ydGJ5JywKCQkJICAgICAgICR0aGlzLT5MYW5nKCdzb3J0YnknKSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oICdmaWx0ZXJfc29ydGJ5JywKCQkJICAgICAgICR0aGlzLT5DcmVhdGVJbnB1dERyb3BEb3duKCAkaWQsICdmaWx0ZXJfc29ydGJ5JywgJHNvcnRzLCAtMSwKCQkJCQkJCSAgICRjdXJzb3J0KSk7CgoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpbnB1dF9zZWxlY3QnLAoJCQkgICAgICAkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQoICRpZCwgJ2ZpbHRlcicsIAoJCQkJCQkJJHRoaXMtPkxhbmcoJ2FwcGx5ZmlsdGVyJykpKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbignaW5wdXRfaGlkZGVuJywKCQkJICAgICAgJHRoaXMtPkNyZWF0ZUlucHV0SGlkZGVuKCAkaWQsICdhY3RpdmVfdGFiJywgJ3VzZXJzJykKCQkJICAgICAgKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2VuZGZvcm0nLCAkdGhpcy0+Q3JlYXRlRm9ybUVuZCAoKSk7CgoKCSR1c2VycyA9ICR0aGlzLT5HZXRVc2Vyc0luR3JvdXAoICRjdXJncm91cCwgJGN1cnJlZ2V4LCAkY3VybGltaXQsICRjdXJzb3J0ICk7CglpZiggIWlzX2FycmF5KCR1c2VycykgKQoJICB7CgkgICAgLy8gYW4gZXJyb3Igb2NjdXJyZWQKCSAgICAkZGIgPSAkdGhpcy0+R2V0RGIoKTsKCSAgICAkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UgKCRpZCwgJHBhcmFtcywgJHJldHVybmlkLAoJCQkJICAgICAgJGRiLT5FcnJvck1zZygpICk7CgkgICAgcmV0dXJuOwoJICB9CgoJLy8gZ2V0IHRoZSB0b3RhbCBudW1iZXIgb2YgdXNlcnMKCSRudW11c2VycyA9ICR0aGlzLT5Db3VudFVzZXJzSW5Hcm91cCggJGN1cmdyb3VwICk7CgoJJHJvd2FycmF5ID0gYXJyYXkoKTsKCSRyb3djbGFzcyA9ICJyb3cxIjsKCWdsb2JhbCAkZ0NtczsKCSR0aGlzLT5zbWFydHktPmFzc2lnbignbnVtdXNlcnMnLCAkbnVtdXNlcnMgKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbigndXNlcm5hbWV0ZXh0JywgJHRoaXMtPkxhbmcoJ3VzZXJuYW1lJykpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdlbWFpbHRleHQnLCAkdGhpcy0+TGFuZygnZW1haWwnKSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3N0YXR1c3RleHQnLCAkdGhpcy0+TGFuZygnc3RhdHVzJykpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdjcmVhdGVkdGV4dCcsICR0aGlzLT5MYW5nKCdjcmVhdGVkJykpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdleHBpcmVzdGV4dCcsICR0aGlzLT5MYW5nKCdleHBpcmVzJykpOwoJZm9yZWFjaCggJHVzZXJzIGFzICRyb3cgKQoJewoJICAkb25lcm93ID0gbmV3IFN0ZENsYXNzKCk7CgkgICRvbmVyb3ctPnJvd2NsYXNzID0gJHJvd2NsYXNzOwoJICAkb25lcm93LT5jcmVhdGVkICA9ICRyb3dbJ2NyZWF0ZWRhdGUnXTsKCSAgJG9uZXJvdy0+dXNlcm5hbWUgPSAkdGhpcy0+Q3JlYXRlTGluaygkaWQsICdlZGl0dXNlcicsICRyZXR1cm5pZCwgJHJvd1sndXNlcm5hbWUnXSwKCQkJCQkJYXJyYXkoJ3VzZXJfaWQnID0+ICRyb3dbJ2lkJ10pKTsKCSAgJG9uZXJvdy0+ZXhwaXJlcyAgPSAkcm93WydleHBpcmVzJ107CgkgICRvbmVyb3ctPmVkaXRsaW5rID0KCSAgICAkdGhpcy0+Q3JlYXRlTGluayAoJGlkLCAnZWRpdHVzZXInLCAkcmV0dXJuaWQsCgkJCSAgICAgICAkZ0Ntcy0+dmFyaWFibGVzWydhZG1pbnRoZW1lJ10tPkRpc3BsYXlJbWFnZSgnaWNvbnMvc3lzdGVtL2VkaXQuZ2lmJywKCQkJCQkJCQkJICAgICR0aGlzLT5MYW5nICgnZWRpdCcpLCAnJywgJycsICdzeXN0ZW1pY29uJyksCgkJCSAgICAgICBhcnJheSAoJ3VzZXJfaWQnID0+ICRyb3dbJ2lkJ10gKSk7CgkgICRvbmVyb3ctPmRlbGV0ZWxpbmsgPSAKCSAgICAkdGhpcy0+Q3JlYXRlTGluayAoJGlkLCdkb19kZWxldGV1c2VyJywkcmV0dXJuaWQsCgkJCSAgICAgICAkZ0Ntcy0+dmFyaWFibGVzWydhZG1pbnRoZW1lJ10tPkRpc3BsYXlJbWFnZSgnaWNvbnMvc3lzdGVtL2RlbGV0ZS5naWYnLAoJCQkJCQkJCQkgICAgJHRoaXMtPkxhbmcgKCdkZWxldGUnKSwgJycsICcnLCAnc3lzdGVtaWNvbicpLAoJCQkgICAgICAgYXJyYXkgKCd1c2VyX2lkJyA9PiAkcm93WydpZCddKSwKCQkJICAgICAgICR0aGlzLT5MYW5nICgnYXJleW91c3VyZScpKTsKCSAgCgkgIGFycmF5X3B1c2ggKCRyb3dhcnJheSwgJG9uZXJvdyk7CgkgICgkcm93Y2xhc3MgPT0gInJvdzEiID8gJHJvd2NsYXNzID0gInJvdzIiIDogJHJvd2NsYXNzID0gInJvdzEiKTsKCX0KCgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2l0ZW1zJywkcm93YXJyYXkpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpdGVtY291bnQnLCBjb3VudCgkcm93YXJyYXkpKTsKICAgICAgfQoKICAgIGlmKCAkdGhpcy0+X0hhc1N1ZmZpY2llbnRQZXJtaXNzaW9ucygnYWRkdXNlcicpICkKICAgICAgewoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdhZGRsaW5rJywgCgkJCSAgICAgICR0aGlzLT5DcmVhdGVMaW5rKCAkaWQsICdhZGR1c2VyJywKCQkJCQkJICRyZXR1cm5pZCwKCQkJCQkJICR0aGlzLT5MYW5nKCdhZGR1c2VyJyksCgkJCQkJCSBhcnJheSgpLCAnJywgZmFsc2UsCgkJCQkJCSBmYWxzZSwKCQkJCQkJICdjbGFzcz0icGFnZW9wdGlvbnMiJykpOwogICAgICB9CgogICAgZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCAndXNlcmxpc3QudHBsJyApOwogIH0KCgogIGZ1bmN0aW9uIF9EaXNwbGF5QWRtaW5QYW5lbCgkaWQsJiRwYXJhbXMsJHJldHVybmlkKQogIHsKICAgICRkYiA9ICR0aGlzLT5jbXMtPmRiOwoKICAgICRhY3RpdmVfdGFiID0gJHRoaXMtPkdldFByZWZlcmVuY2UoJ2FjdGl2ZV90YWInLC0xKTsKICAgIGlmKCBpc3NldCggJHBhcmFtc1snYWN0aXZlX3RhYiddICkgKQogICAgICB7CgkkYWN0aXZlX3RhYiA9ICRwYXJhbXNbJ2FjdGl2ZV90YWInXTsKICAgICAgfQoKICAgIC8vIHRoZSB0YWJzCiAgICBlY2hvICR0aGlzLT5TdGFydFRhYkhlYWRlcnMoKTsKCiAgICBpZiggJHRoaXMtPl9IYXNTdWZmaWNpZW50UGVybWlzc2lvbnMoJ3Byb3BlcnRpZXMnKSApCiAgICAgIHsKCWVjaG8gJHRoaXMtPlNldFRhYkhlYWRlciggJ3Byb3BlcnRpZXMnLCAkdGhpcy0+TGFuZygncHJvcGVydGllcycpLAoJCQkgICAgICAoJGFjdGl2ZV90YWIgPT0gJ3Byb3BlcnRpZXMnKSk7CiAgICAgIH0KICAgIGlmKCAkdGhpcy0+X0hhc1N1ZmZpY2llbnRQZXJtaXNzaW9ucygndXNlcnNuZ3JvdXBzJykgKQogICAgICB7CgllY2hvICR0aGlzLT5TZXRUYWJIZWFkZXIoICdncm91cHMnLCAkdGhpcy0+TGFuZygnZ3JvdXBzJyksKCRhY3RpdmVfdGFiID09ICdncm91cHMnKSk7CgllY2hvICR0aGlzLT5TZXRUYWJIZWFkZXIoICd1c2VycycsICR0aGlzLT5MYW5nKCd1c2VycycpLCgkYWN0aXZlX3RhYiA9PSAndXNlcnMnKSk7CgllY2hvICR0aGlzLT5TZXRUYWJIZWFkZXIoICdhZG1pbicsICR0aGlzLT5MYW5nKCdhZG1pbicpLCgkYWN0aXZlX3RhYiA9PSAnYWRtaW4nKSk7CiAgICAgIH0KICAgIGlmKCAkdGhpcy0+X0hhc1N1ZmZpY2llbnRQZXJtaXNzaW9ucygnc2l0ZXByZWZzJykgKQogICAgICB7CgllY2hvICR0aGlzLT5TZXRUYWJIZWFkZXIoICdwcmVmcycsICR0aGlzLT5MYW5nKCdwcmVmZXJlbmNlcycpLCgkYWN0aXZlX3RhYiA9PSAncHJlZnMnKSk7CiAgICAgIH0KICAgIGlmKCAkdGhpcy0+X0hhc1N1ZmZpY2llbnRQZXJtaXNzaW9ucygndGVtcGxhdGVzJykgKQogICAgICB7CgllY2hvICR0aGlzLT5TZXRUYWJIZWFkZXIoICdsb2dpbnRlbXBsYXRlJywgJHRoaXMtPkxhbmcoJ2xvZ2luX3RlbXBsYXRlJyksCgkJCQkgICgkYWN0aXZlX3RhYiA9PSAnbG9naW50ZW1wbGF0ZScpKTsKCWVjaG8gJHRoaXMtPlNldFRhYkhlYWRlciggJ2xvZ291dHRlbXBsYXRlJywgJHRoaXMtPkxhbmcoJ2xvZ291dF90ZW1wbGF0ZScpLAoJCQkJICAoJGFjdGl2ZV90YWIgPT0gJ2xvZ291dHRlbXBsYXRlJykpOwoJZWNobyAkdGhpcy0+U2V0VGFiSGVhZGVyKCAnY2hhbmdlc2V0dGluZ3NfdGVtcGxhdGUnLCAkdGhpcy0+TGFuZygnY2hhbmdlc2V0dGluZ3NfdGVtcGxhdGUnKSwKCQkJCSAgKCRhY3RpdmVfdGFiID09ICdjaGFuZ2VzZXR0aW5nc190ZW1wbGF0ZScpKTsKCWVjaG8gJHRoaXMtPlNldFRhYkhlYWRlciggJ2ZvcmdvdHBhc3N3b3JkX3RlbXBsYXRlJywgJHRoaXMtPkxhbmcoJ2ZvcmdvdHBhc3N3b3JkX3RlbXBsYXRlJyksCgkJCQkgICgkYWN0aXZlX3RhYiA9PSAnZm9yZ290cGFzc3dvcmRfdGVtcGxhdGUnKSk7CiAgICAgIH0KICAgIGVjaG8gJHRoaXMtPkVuZFRhYkhlYWRlcnMoKTsKCiAgICAvLyBUaGVjb250ZW50IG9mIHRoZSB0YWJzCiAgICBlY2hvICR0aGlzLT5TdGFydFRhYkNvbnRlbnQoKTsKCiAgICBpZiggJHRoaXMtPl9IYXNTdWZmaWNpZW50UGVybWlzc2lvbnMoJ3Byb3BlcnRpZXMnKSApCiAgICAgIHsKCWVjaG8gJHRoaXMtPlN0YXJ0VGFiKCdwcm9wZXJ0aWVzJyk7CgkkdGhpcy0+X0Rpc3BsYXlBZG1pblByb3BlcnRpZXNUYWIoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICk7CgllY2hvICR0aGlzLT5FbmRUYWIoKTsKICAgICAgfQogICAgCiAgICBpZiggJHRoaXMtPl9IYXNTdWZmaWNpZW50UGVybWlzc2lvbnMoJ3VzZXJzbmdyb3VwcycpICkKICAgICAgewoJZWNobyAkdGhpcy0+U3RhcnRUYWIoJ2dyb3VwcycpOwoJJHRoaXMtPl9EaXNwbGF5QWRtaW5Hcm91cHNUYWIoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICk7CgllY2hvICR0aGlzLT5FbmRUYWIoKTsKCgllY2hvICR0aGlzLT5TdGFydFRhYigndXNlcnMnKTsKCSR0aGlzLT5fRGlzcGxheUFkbWluVXNlcnNUYWIoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICk7CgllY2hvICR0aGlzLT5FbmRUYWIoKTsKCgllY2hvICR0aGlzLT5TdGFydFRhYignYWRtaW4nKTsKCSR0aGlzLT5fRGlzcGxheUFkbWluQWRtaW5UYWIoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICk7CgllY2hvICR0aGlzLT5FbmRUYWIoKTsKICAgICAgfQoKICAgIGlmKCAkdGhpcy0+X0hhc1N1ZmZpY2llbnRQZXJtaXNzaW9ucygnc2l0ZXByZWZzJykgKQogICAgICB7CgllY2hvICR0aGlzLT5TdGFydFRhYigncHJlZnMnKTsKCSR0aGlzLT5fRGlzcGxheUFkbWluUHJlZnNUYWIoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICk7CgllY2hvICR0aGlzLT5FbmRUYWIoKTsKICAgICAgfQoKICAgIGlmKCAkdGhpcy0+X0hhc1N1ZmZpY2llbnRQZXJtaXNzaW9ucygndGVtcGxhdGVzJykgKQogICAgICB7CgllY2hvICR0aGlzLT5TdGFydFRhYignbG9naW50ZW1wbGF0ZScpOwoJJHRoaXMtPl9EaXNwbGF5QWRtaW5Mb2dpblRlbXBsYXRlVGFiKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApOwoJZWNobyAkdGhpcy0+RW5kVGFiKCk7CgoJZWNobyAkdGhpcy0+U3RhcnRUYWIoJ2xvZ291dHRlbXBsYXRlJyk7CgkkdGhpcy0+X0Rpc3BsYXlBZG1pbkxvZ291dFRlbXBsYXRlVGFiKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApOwoJZWNobyAkdGhpcy0+RW5kVGFiKCk7CgoJZWNobyAkdGhpcy0+U3RhcnRUYWIoJ2NoYW5nZXNldHRpbmdzX3RlbXBsYXRlJyk7CgkkdGhpcy0+X0Rpc3BsYXlBZG1pbkNoYW5nZVNldHRpbmdzVGVtcGxhdGVUYWIoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICk7CgllY2hvICR0aGlzLT5FbmRUYWIoKTsKCgllY2hvICR0aGlzLT5TdGFydFRhYignZm9yZ290cGFzc3dvcmRfdGVtcGxhdGUnKTsKCSR0aGlzLT5fRGlzcGxheUFkbWluRm9yZ290UGFzc3dvcmRUZW1wbGF0ZVRhYiggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKTsKCWVjaG8gJHRoaXMtPkVuZFRhYigpOwogICAgICB9CgogICAgZWNobyAkdGhpcy0+RW5kVGFiQ29udGVudCgpOwogIH0KCgogIGZ1bmN0aW9uIF9EaXNwbGF5QWRtaW5QcmVmc1RhYiggJGlkLCAmJHBhcmFtcywgJHJldHVybmlkICkKICB7CiAgICAvLyBmaWxsIG91dCB0aGUgdGVtcGxhdGUKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignc3RhcnRmb3JtJywKCQkJICAkdGhpcy0+Q3JlYXRlRm9ybVN0YXJ0KCAkaWQsICdkb19zZXRwcmVmcycpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigncHJvbXB0X21pbnB3bGVuJywgJHRoaXMtPkxhbmcoJ3Byb21wdF9taW5wd2xlbicpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignaW5wdXRfbWlucHdsZW4nLCAKCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCRpZCwgJ2lucHV0X21pbnB3bGVuJywgCgkJCQkJCSAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnbWluX3Bhc3N3b3JkbGVuZ3RoJyksIDIsIDIgKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3Byb21wdF9tYXhwd2xlbicsICR0aGlzLT5MYW5nKCdwcm9tcHRfbWF4cHdsZW4nKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2lucHV0X21heHB3bGVuJywgCgkJCSAgJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCgkaWQsICdpbnB1dF9tYXhwd2xlbicsIAoJCQkJCQkgJHRoaXMtPkdldFByZWZlcmVuY2UoJ21heF9wYXNzd29yZGxlbmd0aCcpLCAyLCAyICkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdwcm9tcHRfbWludW5sZW4nLCAkdGhpcy0+TGFuZygncHJvbXB0X21pbnVubGVuJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpbnB1dF9taW51bmxlbicsIAoJCQkgICR0aGlzLT5DcmVhdGVJbnB1dFRleHQoJGlkLCAnaW5wdXRfbWludW5sZW4nLCAKCQkJCQkJICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdtaW5fdXNlcm5hbWVsZW5ndGgnKSwgMiwgMiApKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigncHJvbXB0X21heHVubGVuJywgJHRoaXMtPkxhbmcoJ3Byb21wdF9tYXh1bmxlbicpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignaW5wdXRfbWF4dW5sZW4nLCAKCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCRpZCwgJ2lucHV0X21heHVubGVuJywgCgkJCQkJCSAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnbWF4X3VzZXJuYW1lbGVuZ3RoJyksIDIsIDIgKSk7CgogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdwcm9tcHRfc2Vzc2lvbnRpbWVvdXQnLCAkdGhpcy0+TGFuZygncHJvbXB0X3Nlc3Npb250aW1lb3V0JykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpbnB1dF9zZXNzaW9udGltZW91dCcsIAoJCQkgICR0aGlzLT5DcmVhdGVJbnB1dFRleHQoJGlkLCAnaW5wdXRfc2Vzc2lvbnRpbWVvdXQnLCAKCQkJCQkJICR0aGlzLT5HZXRQcmVmZXJlbmNlKCd1c2VyX3Nlc3Npb25fZXhwaXJlcycpLCA0LCA0ICkpOwoJCQkgIAogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdwcm9tcHRfcmVxdWlyZW9uZWdyb3VwJywgJHRoaXMtPkxhbmcoJ3Byb21wdF9yZXF1aXJlb25lZ3JvdXAnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2lucHV0X3JlcXVpcmVvbmVncm91cCcsIAoJCQkgIG15Q3JlYXRlSW5wdXRDaGVja2JveCgkaWQsICdpbnB1dF9yZXF1aXJlb25lZ3JvdXAnLCAxLCAKCQkJCQkJJHRoaXMtPkdldFByZWZlcmVuY2UoJ3JlcXVpcmVfb25lZ3JvdXAnKSkpOwoKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigncHJvbXB0X3NtdHB2YWxpZGF0ZScsICR0aGlzLT5MYW5nKCdwcm9tcHRfc210cHZhbGlkYXRlJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpbnB1dF9zbXRwdmFsaWRhdGUnLCAKCQkJICBteUNyZWF0ZUlucHV0Q2hlY2tib3goJGlkLCAnaW5wdXRfc210cHZhbGlkYXRlJywgMSwgCgkJCQkJCSR0aGlzLT5HZXRQcmVmZXJlbmNlKCdkb19zbXRwX3ZhbGlkYXRlX2VtYWlsJykpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignaW5mb19zbXRwdmFsaWRhdGUnLCAkdGhpcy0+TGFuZygnaW5mb19zbXRwdmFsaWRhdGUnKSk7CiAgICAKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigncHJvbXB0X2RmbHRncm91cCcsICR0aGlzLT5MYW5nKCdwcm9tcHRfZGZsdGdyb3VwJykpOwogICAgJGdyb3VwczEgPSAkdGhpcy0+R2V0R3JvdXBMaXN0KCk7CiAgICAkZ3JvdXBzID0gYXJyYXlfbWVyZ2UoIGFycmF5KCJOb25lIiA9PiAtMSksICRncm91cHMxICk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2lucHV0X2RmbHRncm91cCcsCgkJCSAgJHRoaXMtPkNyZWF0ZUlucHV0RHJvcERvd24oICRpZCwgJ2lucHV0X2RmbHRncm91cCcsICRncm91cHMsIC0xLAoJCQkJCQkgICAgICAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnZGVmYXVsdF9ncm91cCcpKSk7CgogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdzdWJtaXQnLAoJCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQgKCRpZCwgJ3N1Ym1pdCcsCgkJCQkJCQkgICAgJHRoaXMtPkxhbmcoJ3N1Ym1pdCcpKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdjYW5jZWwnLAoJCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQgKCRpZCwgJ2NhbmNlbCcsCgkJCQkJCQkgICAgJHRoaXMtPkxhbmcoJ2NhbmNlbCcpKSk7CgogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdwcm9tcHRfcmVxdWlyZWRtYXJrZXInLAoJCQkgICR0aGlzLT5MYW5nKCdyZXF1aXJlZGZpZWxkbWFya2VyJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpbnB1dF9yZXF1aXJlZG1hcmtlcicsCgkJCSAgJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCgkaWQsJ2lucHV0X3JlcXVpcmVkZmllbGRtYXJrZXInLAoJCQkJCQkgJHRoaXMtPkdldFByZWZlcmVuY2UoJ3JlcXVpcmVkX2ZpZWxkX21hcmtlcicsJyonKSwyLDIpKTsKCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3Byb21wdF9yZXF1aXJlZGNvbG9yJywKCQkJICAkdGhpcy0+TGFuZygncmVxdWlyZWRmaWVsZGNvbG9yJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpbnB1dF9yZXF1aXJlZGNvbG9yJywKCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCRpZCwnaW5wdXRfcmVxdWlyZWRmaWVsZGNvbG9yJywKCQkJCQkJICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdyZXF1aXJlZF9maWVsZF9jb2xvcicsJ2JsdWUnKSwxMCwxMCkpOwoKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigncHJvbXB0X2hpZGRlbm1hcmtlcicsCgkJCSAgJHRoaXMtPkxhbmcoJ2hpZGRlbmZpZWxkbWFya2VyJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpbnB1dF9oaWRkZW5tYXJrZXInLAoJCQkgICR0aGlzLT5DcmVhdGVJbnB1dFRleHQoJGlkLCdpbnB1dF9oaWRkZW5maWVsZG1hcmtlcicsCgkJCQkJCSAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnaGlkZGVuX2ZpZWxkX21hcmtlcicsJyEhJyksMiwyKSk7CgogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdwcm9tcHRfaGlkZGVuY29sb3InLAoJCQkgICR0aGlzLT5MYW5nKCdoaWRkZW5maWVsZGNvbG9yJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpbnB1dF9oaWRkZW5jb2xvcicsCgkJCSAgJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCgkaWQsJ2lucHV0X2hpZGRlbmZpZWxkY29sb3InLAoJCQkJCQkgJHRoaXMtPkdldFByZWZlcmVuY2UoJ2hpZGRlbl9maWVsZF9jb2xvcicsJ2dyZWVuJyksMTAsMTApKTsKCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3Byb21wdF9mb3Jnb3Rwd19wYWdlJywKCQkJICAkdGhpcy0+TGFuZygncHJvbXB0X2ZvcmdvdHB3X3BhZ2UnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2lucHV0X2ZvcmdvdHB3X3BhZ2UnLAoJCQkgICR0aGlzLT5DcmVhdGVJbnB1dFRleHQoJGlkLCdpbnB1dF9mb3Jnb3Rwd19wYWdlJywgCgkJCQkJCSAkdGhpcy0+R2V0UHJlZmVyZW5jZSgncGFnZWlkZm9yZ290cGFzc3dkJyksIDE1LCAxNSkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdwcm9tcHRfY2hhbmdlc2V0dGluZ3NfcGFnZScsCgkJCSAgJHRoaXMtPkxhbmcoJ3Byb21wdF9jaGFuZ2VzZXR0aW5nc19wYWdlJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpbnB1dF9jaGFuZ2VzZXR0aW5nc19wYWdlJywKCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCRpZCwnaW5wdXRfY2hhbmdlc2V0dGluZ3NfcGFnZScsIAoJCQkJCQkgJHRoaXMtPkdldFByZWZlcmVuY2UoJ3BhZ2VpZF9jaGFuZ2VzZXR0aW5ncycpLCAxNSwgMTUpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigncHJvbXB0X2xvZ2luX3BhZ2UnLAoJCQkgICR0aGlzLT5MYW5nKCdwcm9tcHRfbG9naW5fcGFnZScpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignaW5wdXRfbG9naW5fcGFnZScsCgkJCSAgJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCgkaWQsJ2lucHV0X2xvZ2luX3BhZ2UnLCAKCQkJCQkJICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdwYWdlaWRfbG9naW4nKSwgMTUsIDE1KSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3Byb21wdF9sb2dvdXRfcGFnZScsCgkJCSAgJHRoaXMtPkxhbmcoJ3Byb21wdF9sb2dvdXRfcGFnZScpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignaW5wdXRfbG9nb3V0X3BhZ2UnLAoJCQkgICR0aGlzLT5DcmVhdGVJbnB1dFRleHQoJGlkLCdpbnB1dF9sb2dvdXRfcGFnZScsIAoJCQkJCQkgJHRoaXMtPkdldFByZWZlcmVuY2UoJ3BhZ2VpZF9sb2dvdXQnKSwgMTUsIDE1KSk7CgkJCQkJCSAKICAgICRudW0gPSAkdGhpcy0+Q291bnRUZW1wQ29kZVJlY29yZHMoKTsKICAgIGlmKCAkbnVtICkKICAgIHsKICAgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdwcm9tcHRfbnVtcmVzZXRyZWNvcmRzJywKCQkJICAgICR0aGlzLT5MYW5nKCdwcm9tcHRfbnVtcmVzZXRyZWNvcmQnKSk7CiAgICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignZGF0YV9udW1yZXNldHJlY29yZHMnLCAkbnVtKTsgLy90b2RvCiAgICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignaW5wdXRfcmVtb3ZlYWxsJywKCQkJICAgICR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCgkaWQsJ2lucHV0X3JlbW92ZWFsbCcsCgkJCQkJCSAgICAgJHRoaXMtPkxhbmcoJ3JlbW92ZWFsbCcpLAoJCQkJCQkgICAgICdvbmNsaWNrPSJyZXR1cm4gY29uZmlybShcJycuJHRoaXMtPkxhbmcoJ2FyZXlvdXN1cmUnKS4nXCcpIicpKTsKICAgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpbnB1dF9yZW1vdmUxd2VlaycsCgkJCSAgICAkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQoJGlkLCdpbnB1dF9yZW1vdmUxd2VlaycsCgkJCQkJCSAgICAgJHRoaXMtPkxhbmcoJ3JlbW92ZTF3ZWVrJyksCgkJCQkJCSAgICAgJ29uY2xpY2s9InJldHVybiBjb25maXJtKFwnJy4kdGhpcy0+TGFuZygnYXJleW91c3VyZScpLidcJykiJykpOwogICAgICAKICAgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpbnB1dF9yZW1vdmUxbW9udGgnLAoJCQkgICAgJHRoaXMtPkNyZWF0ZUlucHV0U3VibWl0KCRpZCwnaW5wdXRfcmVtb3ZlMW1vbnRoJywKCQkJCQkJICAgICAkdGhpcy0+TGFuZygncmVtb3ZlMW1vbnRoJyksCgkJCQkJCSAgICAgJ29uY2xpY2s9InJldHVybiBjb25maXJtKFwnJy4kdGhpcy0+TGFuZygnYXJleW91c3VyZScpLidcJykiJykpOwogICAgfQogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdlbmRmb3JtJywkdGhpcy0+Q3JlYXRlRm9ybUVuZCgpKTsKICAgIGVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZSgnYWRtaW5wcmVmcy50cGwnKTsKICB9CgoKICBmdW5jdGlvbiBfRGlzcGxheVVzZXJGb3Jnb3RQYXNzd29yZFBhZ2UoICRpZCwgJiRwYXJhbXMsICRyZXR1cm5pZCApCiAgewogICAgJHVzZXJuYW1lID0gJyc7CiAgICBpZiggaXNzZXQoICRwYXJhbXNbJ2lucHV0X3VzZXJuYW1lJ10gKSApCiAgICAgIHsKCSR1c2VybmFtZSA9IHRyaW0oICRwYXJhbXNbJ2lucHV0X3VzZXJuYW1lJ10gKTsKICAgICAgfQoKICAgIGlmKCBpc3NldCggJHBhcmFtc1snZXJyb3InXSApICkKICAgICAgewoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdlcnJvcicsICRwYXJhbXNbJ2Vycm9yJ10gKTsKICAgICAgfQogICAgaWYoIGlzc2V0KCAkcGFyYW1zWydtZXNzYWdlJ10gKSApCiAgICAgIHsKCSR0aGlzLT5zbWFydHktPmFzc2lnbignbWVzc2FnZScsICRwYXJhbXNbJ21lc3NhZ2UnXSApOwogICAgICB9CiAgICAKICAgIGlmKCAhaXNzZXQoICRwYXJhbXNbJ3NraXBmb3JtZGlzcGxheSddICkgKQogICAgICB7CgkvLyBzZXR1cCB0aGUgdGVtcGxhdGUKCSR0aGlzLT5zbWFydHktPmFzc2lnbignc3RhcnRmb3JtJywKCQkJICAgICAgJHRoaXMtPkNyZWF0ZUZvcm1TdGFydCggJGlkLCAnZG9fZm9yZ290cHcnLCAkcmV0dXJuaWQgKSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2VuZGZvcm0nLAoJCQkgICAgICAkdGhpcy0+Q3JlYXRlRm9ybUVuZCgpKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbigndGl0bGUnLAoJCQkgICAgICAkdGhpcy0+TGFuZygnZm9yZ290cHcnKSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2xvc3Rwd19tZXNzYWdlJywKCQkJICAgICAgJHRoaXMtPkxhbmcoJ2xvc3Rwd19tZXNzYWdlJykpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdwcm9tcHRfdXNlcm5hbWUnLAoJCQkgICAgICAkdGhpcy0+TGFuZygncHJvbXB0X3VzZXJuYW1lJykpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpbnB1dF91c2VybmFtZScsCgkJCSAgICAgICR0aGlzLT5DcmVhdGVJbnB1dFRleHQoICRpZCwgJ2lucHV0X3VzZXJuYW1lJywgJHVzZXJuYW1lLCAzMCwgMzAgKSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3N1Ym1pdCcsCgkJCSAgICAgICR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCgkaWQsICdzdWJtaXQnLCR0aGlzLT5MYW5nKCdzdWJtaXQnKSkpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdjYW5jZWwnLAoJCQkgICAgICAkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQoJGlkLCAnY2FuY2VsJywkdGhpcy0+TGFuZygnY2FuY2VsJykpKTsKCWlmKCBpc3NldCggJHBhcmFtc1sncmV0dXJudG8nXSApICkKCSAgewoJICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignaGlkZGVuJywKCQkJCSAgJHRoaXMtPkNyZWF0ZUlucHV0SGlkZGVuKCRpZCwnaW5wdXRfcmV0dXJudG8nLCRwYXJhbXNbJ3JldHVybnRvJ10pKTsKCSAgfQogICAgICB9CiAgICBlY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGVGcm9tRGF0YWJhc2UoICdmZXVzZXJzX2ZvcmdvdHBhc3N3b3JkZm9ybScgKTsKICB9CgoKICBmdW5jdGlvbiBfRGlzcGxheVVzZXJGb3Jnb3RQYXNzd29yZFZlcmlmaWNhdGlvblBhZ2UoICRpZCwgJiRwYXJhbXMsICRyZXR1cm5pZCApCiAgewogICAgLy8gZmlsbCBpbiB0aGUgdGVtcGxhdGUKICAgICR1aWQgPSAnJzsKICAgIGlmKCBpc3NldCggJHBhcmFtc1snaW5wdXRfdWlkJ10gKSApCiAgICAgIHsKCSR1aWQgPSAkcGFyYW1zWydpbnB1dF91aWQnXTsKICAgICAgfQogICAgJHVzZXJuYW1lID0gJyc7CiAgICBpZiggaXNzZXQoICRwYXJhbXNbJ2lucHV0X3VzZXJuYW1lJ10gKSApCiAgICAgIHsKCSR1c2VybmFtZSA9ICRwYXJhbXNbJ2lucHV0X3VzZXJuYW1lJ107CiAgICAgIH0KICAgIGVsc2UKICAgICAgewoJJHVzZXJuYW1lID0gJHRoaXMtPkdldFVzZXJOYW1lKCAkdWlkICk7CiAgICAgIH0KICAgICRjb2RlID0gJyc7CiAgICBpZiggaXNzZXQoICRwYXJhbXNbJ2lucHV0X2NvZGUnXSApICkKICAgICAgewoJJGNvZGUgPSAkcGFyYW1zWydpbnB1dF9jb2RlJ107CiAgICAgIH0KICAgIGlmKCBpc3NldCggJHBhcmFtc1snZXJyb3InXSApICkKICAgICAgewoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdlcnJvcicsJHBhcmFtc1snZXJyb3InXSk7CiAgICAgIH0KICAgIGlmKCBpc3NldCggJHBhcmFtc1snbWVzc2FnZSddICkgKQogICAgICB7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ21lc3NhZ2UnLCRwYXJhbXNbJ21lc3NhZ2UnXSk7CiAgICAgIH0KCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3N0YXJ0Zm9ybScsCgkJCSAgJHRoaXMtPkNyZWF0ZUZvcm1TdGFydCgkaWQsJ2RvX3ZlcmlmeWNvZGUnLCRyZXR1cm5pZCkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdlbmRmb3JtJywKCQkJICAkdGhpcy0+Q3JlYXRlRm9ybUVuZCgpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignaGlkZGVuJywKCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRIaWRkZW4oJGlkLCdpbnB1dF91aWQnLCR1aWQpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignc3VibWl0JywKCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQoJGlkLCAnc3VibWl0JywkdGhpcy0+TGFuZygnc3VibWl0JykpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigncHJvbXB0X3VzZXJuYW1lJywkdGhpcy0+TGFuZygncHJvbXB0X3VzZXJuYW1lJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpbnB1dF91c2VybmFtZScsCgkJCSAgJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCggJGlkLCAnaW5wdXRfdXNlcm5hbWUnLCAkdXNlcm5hbWUsIDMwLCAzMCwKCQkJCQkJICAnRGlzYWJsZWQ9IjEiJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdwcm9tcHRfY29kZScsJHRoaXMtPkxhbmcoJ3Byb21wdF9jb2RlJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpbnB1dF9jb2RlJywKCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCAkaWQsICdpbnB1dF9jb2RlJywgJGNvZGUsIDEwLCAxMCApKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigncHJvbXB0X3Bhc3N3b3JkJywkdGhpcy0+TGFuZygncHJvbXB0X3Bhc3N3b3JkJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpbnB1dF9wYXNzd29yZCcsCgkJCSAgJHRoaXMtPkNyZWF0ZUlucHV0UGFzc3dvcmQoJGlkLCAnaW5wdXRfcGFzc3dvcmQnLCAnJywgMzAsIDMwICkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdwcm9tcHRfcmVwZWF0cGFzc3dvcmQnLCR0aGlzLT5MYW5nKCdyZXBlYXRwYXNzd29yZCcpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignaW5wdXRfcmVwZWF0cGFzc3dvcmQnLAoJCQkgICR0aGlzLT5DcmVhdGVJbnB1dFBhc3N3b3JkKCRpZCwgJ2lucHV0X3JlcGVhdHBhc3N3b3JkJywgJycsIDMwLCAzMCApKTsKICAgIGVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZUZyb21EYXRhYmFzZSgnZmV1c2Vyc19mb3Jnb3RwYXNzd29yZHZlcmlmeWZvcm0nKTsKICB9CgoKICBmdW5jdGlvbiBfRGlzcGxheVVzZXJTZXR0aW5nc1BhZ2UoICRpZCwgJiRwYXJhbXMsICRyZXR1cm5pZCApCiAgewogICAgJHVpZCA9ICR0aGlzLT5Mb2dnZWRJbklkKCk7CiAgICBpZiggJHVpZCA9PSBmYWxzZSApIAogICAgICB7CgkvLyB1c2VyIGlzbid0IGxvZ2dlZCBpbgoJJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCwgCgkJCQkgICR0aGlzLT5MYW5nKCdlcnJvcl9ub3Rsb2dnZWRpbicpKTsKCXJldHVybjsKICAgICAgfQogICAgJHJlc3VsdCA9ICR0aGlzLT5HZXRVc2VySW5mbyggJHVpZCApOwogICAgaWYoICRyZXN1bHRbMF0gPT0gRkFMU0UgKQogICAgICB7CgkvLyB1c2VyIGlzbid0IGxvZ2dlZCBpbgoJJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCwgCgkJCQkgICRyZXN1bHRbMV0pOwoJcmV0dXJuOwogICAgICB9CiAgICAkdWluZm8gPSAkcmVzdWx0WzFdOwoKICAgIGlmKCBpc3NldCggJHBhcmFtc1snZXJyb3InXSApICkKICAgICAgewoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdlcnJvcicsICRwYXJhbXNbJ2Vycm9yJ10gKTsKICAgICAgfQogICAgaWYoIGlzc2V0KCAkcGFyYW1zWydtZXNzYWdlJ10gKSApCiAgICAgIHsKCSR0aGlzLT5zbWFydHktPmFzc2lnbignbWVzc2FnZScsICRwYXJhbXNbJ21lc3NhZ2UnXSApOwogICAgICB9CgogICAgLy8gZ2V0IHRoZSB1c2VycyBtZW1iZXIgZ3JvdXBzCiAgICAkZ3JvdXBzID0gJHRoaXMtPkdldE1lbWJlckdyb3Vwc0FycmF5KCAkdWlkICk7CiAgICBpZiggISRncm91cHMgKQogICAgICB7CgkvLyB0aGlzIHVzZXIgaXMgbm90IGEgbWVtYmVyIG9mIGFueSBncnVvcHMuLi4KCS8vIGhhbmRsZSB0aGlzIGxhdGVyIHRvZG8KCSR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQsIAoJCQkJICAkdGhpcy0+TGFuZygnZXJyb3Jfbm9ncm91cHMnKSk7CglyZXR1cm47CiAgICAgIH0KCiAgICAvLyBub3cgd2UgaGF2ZSB0aGUgZ3JvdXBzLCB3ZSBidWlsZCBhIHVuaW9uIG9mIGFsbCBvZiB0aGUgZ3JvdXBzIHByb3BlcnRpZXMKICAgICRwcm9wZXJ0aWVzID0gYXJyYXkoKTsKICAgIGZvcmVhY2goICRncm91cHMgYXMgJGdycHJlY29yZCApCiAgICB7CiAgICAgICRnaWQgPSAkZ3JwcmVjb3JkWydncm91cGlkJ107CiAgICAgICRwcm9wcmVsYXRpb25zID0gJHRoaXMtPkdldEdyb3VwUHJvcGVydHlSZWxhdGlvbnMoICRnaWQgKTsKICAgICAgJHByb3BlcnRpZXMgPSBhcnJheV9tZXJnZV9ieV9uYW1lX3JlcXVpcmVkKCAkcHJvcGVydGllcywgJHByb3ByZWxhdGlvbnMgKTsKICAgICAgdWFzb3J0KCAkcHJvcGVydGllcywgJ2NvbXBhcmVfZWxlbWVudHNfYnlfc29ydG9yZGVyX2tleScgKTsKICAgIH0KCiAgICBpZiggY291bnQoJHByb3BlcnRpZXMpID09IDAgKQogICAgICB7CglpZiggJHRoaXMtPkdldFByZWZlcmVuY2UoJ3JlcXVpcmVfb25lZ3JvdXAnKSA9PSAxICkKCSAgewoJICAgIC8vIHRoaXMgdXNlciBpcyBub3QgYSBtZW1iZXIgb2YgYW55IGdydW9wcy4uLgoJICAgIC8vIGhhbmRsZSB0aGlzIGxhdGVyIHRvZG8KCSAgICAkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UoICRpZCwgJHBhcmFtcywgJHJldHVybmlkLCAKCQkJCSAgICAgICR0aGlzLT5MYW5nKCdlcnJvcl9vbmVncm91cHJlcXVpcmVkJykpOwoJICAgIHJldHVybjsKCSAgfQogICAgICB9CgoKICAgIC8vIG5vdyB3ZSdyZSByZWFkeSB0byBwb3B1bGF0ZSB0aGUgdGVtcGxhdGUKICAgIC8vIGZpcnN0IHdlIHB1dCBpbiBzdHVmZiB0aGF0IGlzIHJlcXVpcmVkICh1c2VybmFtZSwgcGFzc3dvcmQsIGV0YywgZXRjKQogICAgJHJvd2FycmF5ID0gYXJyYXkoKTsKCiAgICAvLyBtYWtlIHN1cmUgdXNlcm5hbWUgaXMgaW4gdGhlcmUKICAgICR2YWwgPSAkdWluZm9bJ3VzZXJuYW1lJ107CiAgICAkb25lcm93ID0gbmV3IFN0ZENsYXNzKCk7CiAgICAkb25lcm93LT5jb2xvciA9ICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdyZXF1aXJlZF9maWVsZF9jb2xvcicsJ2JsdWUnKTsKICAgICRvbmVyb3ctPm1hcmtlciA9ICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdyZXF1aXJlZF9maWVsZF9tYXJrZXInLCcqJyk7CiAgICAkb25lcm93LT5yZXF1aXJlZCA9IDE7CiAgICAkb25lcm93LT5oaWRkZW4gPSBteUNyZWF0ZUlucHV0SGlkZGVuKCAkaWQsICdoaWRkZW5fdXNlcm5hbWUnLAoJCQkJCSAgIGltcGxvZGUoIjsiLGFycmF5KCd1c2VybmFtZScsMCwzMCwzKSkpOwogICAgJG9uZXJvdy0+cHJvbXB0ID0gJHRoaXMtPkxhbmcoJ3VzZXJuYW1lJyk7CiAgICAkb25lcm93LT5jb250cm9sID0kdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCRpZCwgJ2lucHV0X3VzZXJuYW1lJywgJHZhbCwgMzAsIDMwLAoJCQkJCSAgICAgJ0Rpc2FibGVkPSIxIicpOwogICAgYXJyYXlfcHVzaCggJHJvd2FycmF5LCAkb25lcm93ICk7CgogICAgLy8gYW5kIHBhc3N3b3JkCiAgICAkdmFsID0gJyc7CiAgICBpZiggaXNzZXQoICRwYXJhbXNbJ2lucHV0X3Bhc3N3b3JkJ10gKSApCiAgICAgICR2YWwgPSAkcGFyYW1zWydpbnB1dF9wYXNzd29yZCddOwogICAgJG9uZXJvdyA9IG5ldyBTdGRDbGFzcygpOwogICAgJG9uZXJvdy0+Y29sb3IgPSAkdGhpcy0+R2V0UHJlZmVyZW5jZSgncmVxdWlyZWRfZmllbGRfY29sb3InLCdibHVlJyk7CiAgICAkb25lcm93LT5tYXJrZXIgPSAkdGhpcy0+R2V0UHJlZmVyZW5jZSgncmVxdWlyZWRfZmllbGRfbWFya2VyJywnKicpOwogICAgJG9uZXJvdy0+cmVxdWlyZWQgPSAxOwogICAgJG9uZXJvdy0+aGlkZGVuID0gbXlDcmVhdGVJbnB1dEhpZGRlbiggJGlkLCAnaGlkZGVuX3Bhc3N3b3JkJywKCQkJCQkgICBpbXBsb2RlKCI7IixhcnJheSgncGFzc3dvcmQnLDAsMzAsMykpKTsKICAgICRvbmVyb3ctPnByb21wdCA9ICR0aGlzLT5MYW5nKCdwYXNzd29yZCcpOwogICAgJG9uZXJvdy0+Y29udHJvbCA9JHRoaXMtPkNyZWF0ZUlucHV0UGFzc3dvcmQoJGlkLCAnaW5wdXRfcGFzc3dvcmQnLCAkdmFsLCAzMCwgMzApOwogICAgJG9uZXJvdy0+YWRkdGV4dCA9JHRoaXMtPkxhbmcoJ2luZm9fZW1wdHlwYXNzd29yZGZpZWxkJyk7CiAgICBhcnJheV9wdXNoKCAkcm93YXJyYXksICRvbmVyb3cgKTsKCiAgICAvLyBhbmQgbWFrZSBoaW0gcmVwZWF0IHRoZSBwYXNzd29yZAogICAgJHZhbCA9ICcnOwogICAgaWYoIGlzc2V0KCAkcGFyYW1zWydpbnB1dF9yZXBlYXRwYXNzd29yZCddICkgKQogICAgICAkdmFsID0gJHBhcmFtc1snaW5wdXRfcmVwZWF0cGFzc3dvcmQnXTsKICAgICRvbmVyb3cgPSBuZXcgU3RkQ2xhc3MoKTsKICAgICRvbmVyb3ctPmNvbG9yID0gJHRoaXMtPkdldFByZWZlcmVuY2UoJ3JlcXVpcmVkX2ZpZWxkX2NvbG9yJywnYmx1ZScpOwogICAgJG9uZXJvdy0+bWFya2VyID0gJHRoaXMtPkdldFByZWZlcmVuY2UoJ3JlcXVpcmVkX2ZpZWxkX21hcmtlcicsJyonKTsKICAgICRvbmVyb3ctPnJlcXVpcmVkID0gMTsKICAgICRvbmVyb3ctPmhpZGRlbiA9IG15Q3JlYXRlSW5wdXRIaWRkZW4oICRpZCwgJ2hpZGRlbl9yZXBlYXRwYXNzd29yZCcsCgkJCQkJICAgaW1wbG9kZSgiOyIsYXJyYXkoJ3JlcGVhdHBhc3N3b3JkJywwLDMwLDMpKSk7CiAgICAkb25lcm93LT5wcm9tcHQgPSAkdGhpcy0+TGFuZygncmVwZWF0cGFzc3dvcmQnKTsKICAgICRvbmVyb3ctPmNvbnRyb2wgPSR0aGlzLT5DcmVhdGVJbnB1dFBhc3N3b3JkKCRpZCwgJ2lucHV0X3JlcGVhdHBhc3N3b3JkJywgJHZhbCwgMzAsIDMwKTsKICAgICRvbmVyb3ctPmFkZHRleHQgPSR0aGlzLT5MYW5nKCdpbmZvX2VtcHR5cGFzc3dvcmRmaWVsZCcpOwogICAgYXJyYXlfcHVzaCggJHJvd2FycmF5LCAkb25lcm93ICk7CiAgICAgICAgCiAgICBmb3JlYWNoKCAkcHJvcGVydGllcyBhcyAkcHJvcCApCiAgICB7CiAgICAgIC8vIGRvbid0IHByb2Nlc3MgaGlkZGVuIGZpZWxkcyBoZXJlCiAgICAgIGlmKCAkcHJvcFsncmVxdWlyZWQnXSA9PSAzICkgY29udGludWU7CgogICAgICAvLyBnZXQgdGhlIHByb3BlcnR5IGRlZmluaXRpb24KICAgICAgJGRlZm4gPSAkdGhpcy0+R2V0UHJvcGVydHlEZWZuKCAkcHJvcFsnbmFtZSddICk7CiAgICAgICR2YWwgPSAkdGhpcy0+R2V0VXNlclByb3BlcnR5RnVsbCggJHByb3BbJ25hbWUnXSwgJHVpZCApOwogICAgICAkb25lcm93ID0gbmV3IFN0ZENsYXNzKCk7IAoKICAgICAgJGNvbG9yID0gJyc7CiAgICAgIGlmKCAkcHJvcFsncmVxdWlyZWQnXSA9PSAyICkgJGNvbG9yID0gJHRoaXMtPkdldFByZWZlcmVuY2UoJ3JlcXVpcmVkX2ZpZWxkX2NvbG9yJywnYmx1ZScpOwogICAgICAkbWFya2VyID0gJyc7CiAgICAgIGlmKCAkcHJvcFsncmVxdWlyZWQnXSA9PSAyICkgJG1hcmtlciA9ICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdyZXF1aXJlZF9maWVsZF9tYXJrZXInLCcqJyk7CiAgICAgICRvbmVyb3ctPnJlcXVpcmVkID0gKCRwcm9wWydyZXF1aXJlZCddID09IDIpOwogICAgICAkb25lcm93LT5jb2xvciAgICA9ICRjb2xvcjsKICAgICAgJG9uZXJvdy0+bWFya2VyICAgPSAkbWFya2VyOwogICAgICAkb25lcm93LT5oaWRkZW4gPSBteUNyZWF0ZUlucHV0SGlkZGVuKCAkaWQsICdoaWRkZW5fJy4kcHJvcFsnbmFtZSddLAoJCQkJCSAgICAgaW1wbG9kZSgiOyIsYXJyYXkoJHByb3BbJ25hbWUnXSwkZGVmblsndHlwZSddLAoJCQkJCQkJICAgICAgICRkZWZuWydsZW5ndGgnXSwkcHJvcFsncmVxdWlyZWQnXSkpKTsKCiAgICAgICRvbmVyb3ctPnByb21wdCA9ICRkZWZuWydwcm9tcHQnXTsKICAgICAgc3dpdGNoKCAkZGVmblsndHlwZSddICkKCXsKCWNhc2UgMDogLy8gdGV4dAoJICAkb25lcm93LT5jb250cm9sID0gJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCggJGlkLCAnaW5wdXRfJy4kcHJvcFsnbmFtZSddLAoJCQkJCQkgICAgICR2YWwsICRkZWZuWydsZW5ndGgnXSwgJGRlZm5bJ21heGxlbmd0aCddICk7CgkgIGJyZWFrOwoKCWNhc2UgMTogLy8gY2hlY2tib3gKCSAgJG9uZXJvdy0+Y29udHJvbCA9IG15Q3JlYXRlSW5wdXRDaGVja2JveCggJGlkLCAnaW5wdXRfJy4kcHJvcFsnbmFtZSddLCAxLCAkdmFsICk7CgkgIGJyZWFrOwoKCWNhc2UgMjogLy8gZW1haWwKCSAgJG9uZXJvdy0+Y29udHJvbCA9ICR0aGlzLT5DcmVhdGVJbnB1dFRleHQoICRpZCwgJ2lucHV0XycuJHByb3BbJ25hbWUnXSwKCQkJCQkJICAgICAkdmFsLCAkZGVmblsnbGVuZ3RoJ10sICRkZWZuWydtYXhsZW5ndGgnXSApOwoJICBicmVhazsKCgljYXNlIDM6IC8vIHRleHRhcmVhCgkgICRvbmVyb3ctPmNvbnRyb2wgPSAkdGhpcy0+Q3JlYXRlVGV4dEFyZWEoZmFsc2UsICRpZCwgJHZhbCwgJ2lucHV0XycuJHByb3BbJ25hbWUnXSk7CgkgIGJyZWFrOwoKCWNhc2UgNDogLy8gZHJvcGRvd24KCSAgJHRoaXMtPl9kZWJ1Z2FycmF5KEdldFNlbGVjdE9wdGlvbnMoJGRlZm5bJ25hbWUnXSwgMSksICJzZWxlY3Qgb3B0aW9ucyIpOwoJICAkb25lcm93LT5jb250cm9sID0gJHRoaXMtPkNyZWF0ZUlucHV0RHJvcGRvd24oIAoJCQkJCQkJCQkJJGlkLCAKCQkJCQkJCQkJCSdpbnB1dF8nLiRwcm9wWyduYW1lJ10sIAoJCQkJCQkJCQkJJHRoaXMtPkdldFNlbGVjdE9wdGlvbnMoJGRlZm5bJ25hbWUnXSwgMSksIAoJCQkJCQkJCQkJLTEsIAoJCQkJCQkJCQkJJHZhbCk7CgkgIGJyZWFrOwoJfQoKICAgICAgYXJyYXlfcHVzaCggJHJvd2FycmF5LCAkb25lcm93ICk7CiAgICB9CgkgICR0aGlzLT5fZGVidWdhcnJheSgkcm93YXJyYXksICJhbGwgY29udHJvbHMiKTsKCiAgICAvLyBmaWxsIGluIHRoZSB2YXJpYWJsZXMgZm9yIHRoZSB0ZW1wbGF0ZQogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCd0aXRsZScsJHRoaXMtPkxhbmcoJ3VzZXJfc2V0dGluZ3MnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3N0YXJ0Zm9ybScsCgkJCSAgJHRoaXMtPkNyZWF0ZUZvcm1TdGFydCgkaWQsJ2RvX3VzZXJjaGFuZ2VzZXR0aW5ncycsJHJldHVybmlkICkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdlbmRmb3JtJywKCQkJICAkdGhpcy0+Q3JlYXRlRm9ybUVuZCgpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignc3VibWl0JywKCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQoJGlkLCAnc3VibWl0JywkdGhpcy0+TGFuZygnc3VibWl0JykpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignY2FuY2VsJywKCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQoJGlkLCAnY2FuY2VsJywkdGhpcy0+TGFuZygnY2FuY2VsJykpKTsKICAgIGlmKCBpc3NldCggJHBhcmFtc1sncmV0dXJudG8nXSApICkKICAgICAgewoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdoaWRkZW4nLAoJCQkgICAgICAkdGhpcy0+Q3JlYXRlSW5wdXRIaWRkZW4oJGlkLCdpbnB1dF9yZXR1cm50bycsJHBhcmFtc1sncmV0dXJudG8nXSkpOwogICAgICB9CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2NvbnRyb2xzJywgJHJvd2FycmF5KTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignY29udHJvbGNvdW50JywgY291bnQoJHJvd2FycmF5KSk7CgogICAgZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlRnJvbURhdGFiYXNlKCdmZXVzZXJzX2NoYW5nZXNldHRpbmdzZm9ybScpOwogIH0KCgpmdW5jdGlvbiBfaGFuZGxlVXNlckluZm9WYWxpZGF0aW9uKCAkaWQsICYkcGFyYW1zLCAkcmV0dXJuaWQsICYkbWVzc2FnZSwgJG5lZWRwdyA9IHRydWUsICRkb2V4cGlyZSA9IHRydWUgKQogIHsKICAgIC8vIG1ha2Ugc3VyZSB0aGUgcGFyYW1ldGVycyBhcmUgZmlsbGVkIGluCiAgICAkdXNlcm5hbWUgPSB0cmltKCRwYXJhbXNbJ2lucHV0X3VzZXJuYW1lJ10pOwogICAgJHBhc3N3b3JkID0gdHJpbSgkcGFyYW1zWydpbnB1dF9wYXNzd29yZCddKTsKICAgICRyZXBlYXQgICA9IHRyaW0oJHBhcmFtc1snaW5wdXRfcmVwZWF0cGFzc3dvcmQnXSk7CgogICAgaWYoICR1c2VybmFtZSA9PSAnJyAKCXx8ICgkbmVlZHB3ICYmICgkcGFzc3dvcmQgPT0gJycgfHwgJHJlcGVhdCA9PSAnJykpICApCiAgICAgIHsKCSRtZXNzYWdlID0gJHRoaXMtPkxhbmcgKCJlcnJvcl9pbnZhbGlkcGFyYW1zIik7CglyZXR1cm4gLTE7CiAgICAgIH0KCiAgICAvLyBtYWtlIHN1cmUgdGhlIHBhc3N3b3JkcyBtYXRjaAogICAgaWYoICRwYXNzd29yZCAhPSAkcmVwZWF0ICkKICAgICAgewoJJG1lc3NhZ2UgPSAkdGhpcy0+TGFuZygiZXJyb3JfcGFzc3dvcmRtaXNtYXRjaCIpOwoJcmV0dXJuIC0xOwogICAgICB9CgogICAgLy8gbWFrZSBzdXJlIHRoZSB1c2VybmFtZSBmaXRzIHRoZSBydWxlcwogICAgaWYoICEkdGhpcy0+SXNWYWxpZFVzZXJuYW1lKCAkdXNlcm5hbWUgKSApCiAgICAgIHsKCSRtZXNzYWdlID0gJHRoaXMtPkxhbmcoICJlcnJvcl9pbnZhbGlkdXNlcm5hbWUiICk7CglyZXR1cm4gLTE7CiAgICAgIH0KCiAgICAvLyBtYWtlIHN1cmUgdGhlIHBhc3N3b3JkIGZpdHMgdGhlIHJ1bGVzCiAgICBpZiggJG5lZWRwdyAmJiAhJHRoaXMtPklzVmFsaWRQYXNzd29yZCggJHBhc3N3b3JkICkgKQogICAgICB7CgkkbWVzc2FnZSA9ICR0aGlzLT5MYW5nKCJlcnJvcl9pbnZhbGlkcGFzc3dvcmQiKTsKCXJldHVybiAtMTsKICAgICAgfQoKICAgIGlmKCAkZG9leHBpcmUgPT0gZmFsc2UgKQogICAgICB7CglyZXR1cm4gMTsKICAgICAgfQoKICAgIC8vIG1ha2Ugc3VyZSBhbiBleHBpcnkgZGF0ZSBpcyBzZXQKICAgIGlmKCAhaXNzZXQoJHBhcmFtc1snZXhwaXJlc2RhdGVfTW9udGgnXSkgKQogICAgICB7CgkkbWVzc2FnZSA9ICR0aGlzLT5MYW5nKCdlcnJvcl9pbnZhbGlkZXhwaXJ5ZGF0ZScpOwogICAgICB9CgogICAgJGV4cGlyZXMgPSBta3RpbWUoJHBhcmFtc1snZXhwaXJlc2RhdGVfSG91ciddLCAkcGFyYW1zWydleHBpcmVzZGF0ZV9NaW51dGUnXSwgJHBhcmFtc1snZXhwaXJlc2RhdGVfU2Vjb25kJ10sCgkJICAgICAgJHBhcmFtc1snZXhwaXJlc2RhdGVfTW9udGgnXSwgJHBhcmFtc1snZXhwaXJlc2RhdGVfRGF5J10sICRwYXJhbXNbJ2V4cGlyZXNkYXRlX1llYXInXSk7CiAgICAkcGFyYW1zWydpbnB1dF9leHBpcmVzZGF0ZSddID0gJGV4cGlyZXM7CiAgICByZXR1cm4gMTsKICB9CgoKICBmdW5jdGlvbiBteU1vZHVsZVBhdGgoKQogIHsKICAgICRzdHIgPSAiL21vZHVsZXMvIi4kdGhpcy0+R2V0TmFtZSgpLiIvIjsKICAgIHJldHVybiAkc3RyOwogIH0KCiAgZnVuY3Rpb24gbXlSZWRpcmVjdFRvVGFiKCAkaWQsICR0YWIsICRwYXJhbXMgPSAnJyApCiAgewogICAgJHBhcm1zID0gYXJyYXkoKTsKICAgIGlmKCBpc19hcnJheSggJHBhcmFtcyApICkKICAgICAgewoJJHBhcm1zID0gJHBhcmFtczsKICAgICAgfQogICAgJHRoaXMtPlNldFByZWZlcmVuY2UoJ2FjdGl2ZV90YWInLCAkdGFiKTsKICAgICR0aGlzLT5teVJlZGlyZWN0KCAkaWQsICdkZWZhdWx0YWRtaW4nLCAkcGFybXMgKTsKICB9CgogIGZ1bmN0aW9uIG15UmVkaXJlY3QoICRpZCwgJGFjdGlvbiwgJHBhcmFtcyA9ICcnICkKICB7CiAgICB1bnNldCggJHBhcmFtc1snYWN0aW9uJ10gKTsKICAgICR0aGlzLT5SZWRpcmVjdCggJGlkLCAkYWN0aW9uLCAnJywgJHBhcmFtcyApOwogIH0KCiAgZnVuY3Rpb24gR2V0SGVscCgkbGFuZz0nZW5fVVMnKQkKICB7CiAgICByZXR1cm4gJHRoaXMtPkxhbmcoJ2hlbHAnKTsKICB9CgogIGZ1bmN0aW9uIEdldEF1dGhvcigpIAogIHsKICAgIHJldHVybiAnY2FsZ3V5MTAwMCc7CiAgfQogIAogIGZ1bmN0aW9uIEdldEF1dGhvckVtYWlsKCkJCiAgewogICAgcmV0dXJuICdjYWxndXkxMDAwQGhvdG1haWwuY29tJzsKICB9CiAgCiAgZnVuY3Rpb24gR2V0Q2hhbmdlTG9nKCkJCiAgewogICAgcmV0dXJuICR0aGlzLT5MYW5nKCdjaGFuZ2Vsb2cnKTsKICB9CgogIC8qKgogICAqIFRoaXMgaXMgYSBhd2Vzb21lIHV0aWxpdHkgZnVuY3Rpb24gdGhhdCBwcm9kdWNlcyB2aXJ0dWFsbHkgYWxsIGhlbHBmdWwKICAgKiBkZWJ1ZyBpbmZvLiAgUmVsaWVzIG9uIHRoZSB2YWx1ZSBvZiB0aGUgJHZhcmRlYnVnIG9mIHRoZSBjbGFzcy4KICAgKgogICAqIEBwYXJhbSBhcnJheSAkZGVidWdhcnJheSBzaW5nbGUtIG9yIG11bHRpZGltZW50aW9uYWwgYXJyYXkKICAgKiBAcGFyYW0gU3RyaW5nICRtZXNzYWdlIHRoYXQgaGVscCBpZGVudGlmeSB0aGUgZnVuY3Rpb24gY2FsbAogICAqLwogIGZ1bmN0aW9uIF9kZWJ1Z2FycmF5KCRkZWJ1Z2FycmF5LCAkbWVzc2FnZT0nJykKICB7CiAgICBpZiAoJHRoaXMtPmRldmRlYnVnID09IDEpewogICAgICBlY2hvICJcblxuPGJyPjxicj4tLS0tLS0tLS0tLS0tIERlYnVnIGluZm86IC0tLS0tLS0tLS0tLS0tLS08YnI+XG4iOwogICAgICAkc3RhY2t0cmFjZSA9IGRlYnVnX2JhY2t0cmFjZSgpOwogICAgICBpZiAoY291bnQoJHN0YWNrdHJhY2UpID4gMSAmJiAkc3RhY2t0cmFjZVsxXVsnZnVuY3Rpb24nXSAhPSAnJyl7CgllY2hvICJJbnNpZGUgIiAuICRzdGFja3RyYWNlWzFdWydmdW5jdGlvbiddIC4gIjxicj5cbiI7CgllY2hvICJDYWxsZWQgZnJvbSAiCgkgIC4gJHN0YWNrdHJhY2VbM11bJ2Z1bmN0aW9uJ10gLiAiLCAiCgkgIC4gJHN0YWNrdHJhY2VbMl1bJ2Z1bmN0aW9uJ10gLiAiPGJyPlxuIjsKICAgICAgfQogICAgICBpZiAoJG1lc3NhZ2UgIT0gJycpewoJZWNobyAkbWVzc2FnZSAuICI8YnI+IjsKICAgICAgfQogICAgICBlY2hvICJcbjx0YWJsZSBjZWxscGFkZGluZz0xMCBib3JkZXI9MD5cbjx0cj5cbjx0ZD4iOwogICAgICBmb3JlYWNoKCAkZGVidWdhcnJheSBhcyAka2V5ID0+ICR2YWwgKXsKCS8vCQkJCWVjaG8gIjxiPiRrZXk8L2I+PGJyPiI7CglpZihpc19hcnJheSgkdmFsKSl7CgkgIGVjaG8gIjwvdGQ+XG48dGQ+IjsKCSAgZWNobyAiPGI+QXJyYXk8L2I+PGJyPiI7CgkgICR0aGlzLT5fZGVidWdzdWJhcnJheSgkdmFsKTsKCX0gZWxzZSBpZiAoaXNfb2JqZWN0KCR2YWwpKXsKCSAgZWNobyAiPC90ZD5cbjx0ZD4iOwoJICBlY2hvICI8Yj5PYmplY3Q8L2I+PGJyPiI7CgkgICR0aGlzLT5fZGVidWdzdWJhcnJheShnZXRfb2JqZWN0X3ZhcnMoJHZhbCkpOwoJfSBlbHNlIHsKCSAgZWNobyAiPGI+VmVjdG9yPC9iPjxicj4iOwoJICBlY2hvICJcdDxzcGFuIHN0eWxlPVxwYWRkaW5nLWxlZnQ6MjBweFwiPiIKCSAgICAuICRrZXkgLiAiOiAiIC4gJHZhbCAuICI8L3NwYW4+PGJyPlxuIjsKCX0KICAgICAgfTsKICAgICAgZWNobyAiPC90ZD5cbjwvdHI+XG48L3RhYmxlPlxuIjsKICAgICAgZWNobyAiLS0tLS0tLS0tLS0tLSBFbmQgZGVidWcgaW5mbyAtLS0tLS0tLS0tLS0tLS0tPGJyPjxicj5cblxuIjsKICAgIH0KICB9CgoJLyoqCgkgKiBVdGlsaXR5IGZ1bmN0aW9uLCB1c2VkIGJ5IHRoZSBfZGVidWdhcnJheSBmdW5jdGlvbgoJICovCglmdW5jdGlvbiBfZGVidWdzdWJhcnJheSgkZGVidWdhcnJheSl7CgkJZm9yZWFjaCggJGRlYnVnYXJyYXkgYXMgJGtleSA9PiAkdmFsICl7CgkJCWlmKGlzX2FycmF5KCR2YWwpKXsKCQkJCWVjaG8gIlx0IiAuICRrZXkgLiAiOiAiIC4gcHJpbnRfcigkdmFsKSAuICI8YnI+XG4iOwoJCQl9IGVsc2UgewoJCQkJZWNobyAiXHQiIC4gJGtleSAuICI6ICIgLiAkdmFsIC4gIjxicj5cbiI7CgkJCX0KCQl9Cgl9CgoKICAvLyBvbGQgZnVuY3Rpb24gKG5vdCB1c2VkPykKICAvLyB0b2RvLCBwdXQgdGhpcyBpbnRvIHRoZSBVc2VyTWFuaXB1bGF0b3Igc3R1ZmYKCWZ1bmN0aW9uIENyZWF0ZU5ld1VzZXIoJGlkKSB7CgkgICRkYj0kdGhpcy0+R2V0RGIoKTsKCSAgaWYgKGlzc2V0KCRfUE9TVFskaWQuInVzZXJuYW1lIl0pKSAkbmV3dXNlcm5hbWU9dHJpbSgkX1BPU1RbJGlkLiJ1c2VybmFtZSJdKTsgZWxzZSAkbmV3dXNlcm5hbWU9IiI7CgkgIGlmICgkbmV3dXNlcm5hbWU9PSIiKSByZXR1cm4gIlVzZXJuYW1lIG11c3QgYmUgcHJvdmlkZWQhIjsKCSAgJHF1ZXJ5PSJTRUxFQ1QgKiBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc191c2VycyBXSEVSRSB1c2VybmFtZT0nIi4kbmV3dXNlcm5hbWUuIiciOwoJICAkcmVzdWx0PSRkYi0+RXhlY3V0ZSgkcXVlcnkpOwogCSAgaWYgKCRyZXN1bHQgJiYgJHJlc3VsdC0+Um93Q291bnQoKSkgcmV0dXJuICJVc2VybmFtZSBhbHJlYWR5IGV4aXN0cyEiOwoJICAKCSAgJG5ld2VtYWlsPXRyaW0oJF9QT1NUWyRpZC4iZW1haWwiXSk7CgkgIAoJICAkbmV3cGFzc3dvcmQ9dHJpbSgkX1BPU1RbJGlkLiJwYXNzd29yZCJdKTsKCSAgaWYgKCRuZXdwYXNzd29yZD09IiIpIHJldHVybiAiUGFzc3dvcmQgY2Fubm90IGJlIGJsYW5rISI7CgkgICRuZXdwYXNzd29yZDI9dHJpbSgkX1BPU1RbJGlkLiJwYXNzd29yZDIiXSk7CgkgIGlmICgkbmV3cGFzc3dvcmQhPSRuZXdwYXNzd29yZDIpIHJldHVybiAiUGFzc3dvcmRzIGRvIG5vdCBtYXRjaCEiOwoJICAkbmV3aWQ9JGRiLT5HZW5JRChjbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX3VzZXJzX3NlcSIpOwoJICAkcXVlcnk9IklOU0VSVCBJTlRPICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc191c2VycyAoaWQsdXNlcm5hbWUscGFzc3dvcmQsZW1haWwpIFZBTFVFUyAoPyw/LD8sPykiOwoJICAkcGFyYW1zPWFycmF5KCRuZXdpZCwkbmV3dXNlcm5hbWUsbWQ1KCRuZXdwYXNzd29yZCksJG5ld2VtYWlsKTsKCSAgJGRicmVzdWx0PSRkYi0+RXhlY3V0ZSgkcXVlcnksJHBhcmFtcyk7CgkgIAoJICAkcT0iU0VMRUNUICogRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfZ3JvdXBzIjsKCSAgJGRicmVzdWx0PSRkYi0+RXhlY3V0ZSgkcSk7CgkgIGlmICgkZGJyZXN1bHQgJiYgJGRicmVzdWx0LT5Sb3dDb3VudCgpKSB7CgkgICAgd2hpbGUgKCRyb3c9JGRicmVzdWx0LT5GZXRjaFJvdygpKSB7CgkgICAgICBpZiAoJF9QT1NUWyRpZC4iZ3JvdXAiLiRyb3dbImlkIl1dPT0ieWVzIikgewoJCS8vQ3JlYXRlIGFuIGFzc29jaWF0aW9uCgkJJHE9IklOU0VSVCBJTlRPICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19iZWxvbmdzICh1c2VyaWQsZ3JvdXBpZCkgVkFMVUVTICg/LD8pIjsKCQkkcGFyYW1zMj1hcnJheSgkbmV3aWQsJHJvd1siaWQiXSk7CgkJJGRicmVzdWx0Mj0kZGItPkV4ZWN1dGUoJHEsJHBhcmFtczIpOwoJICAgICAgfQoJICAgIH0KCSAgfQoJICByZXR1cm4gIiI7Cgl9CgkKCiAgLy8gb2xkIGZ1bmN0aW9uIChub3QgdXNlZD8pCiAgLy8gdG9kbywgcHV0IHRoaXMgaW50byB0aGUgVXNlck1hbmlwdWxhdG9yIHN0dWZmCglmdW5jdGlvbiBDcmVhdGVOZXdHcm91cCgkaWQpIHsKCQkkZGI9JHRoaXMtPkdldERiKCk7CgkJJG5ld2dyb3VwbmFtZT10cmltKCRfUE9TVFskaWQuImdyb3VwbmFtZSJdKTsKCQlpZiAoJG5ld2dyb3VwbmFtZT09IiIpIHJldHVybiAiQSB1bmlxdWUgZ3JvdXAgbmFtZSBtdXN0IGJlIHByb3ZpZGVkISI7CgkJJHF1ZXJ5PSJTRUxFQ1QgKiBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19ncm91cHMgV0hFUkUgZ3JvdXBuYW1lPSciLiRuZXdncm91cG5hbWUuIiciOwoJCSRyZXN1bHQ9JGRiLT5FeGVjdXRlKCRxdWVyeSk7CgkJaWYgKCRyZXN1bHQgJiYgJHJlc3VsdC0+Um93Q291bnQoKSkgcmV0dXJuICJHcm91cCBuYW1lIGFscmVhZHkgZXhpc3RzISI7CgkJJG5ld2dyb3VwZGVzYz10cmltKCRfUE9TVFskaWQuImdyb3VwZGVzYyJdKTsKCQkkbmV3aWQ9JGRiLT5HZW5JRChjbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX2dyb3Vwc19zZXEiKTsKCQkkcXVlcnk9IklOU0VSVCBJTlRPICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19ncm91cHMgKGlkLGdyb3VwbmFtZSxncm91cGRlc2MpIFZBTFVFUyAoPyw/LD8pIjsKCQkkcGFyYW1zPWFycmF5KCRuZXdpZCwkbmV3Z3JvdXBuYW1lLCRuZXdncm91cGRlc2MpOwoJCSRkYnJlc3VsdD0kZGItPkV4ZWN1dGUoJHF1ZXJ5LCRwYXJhbXMpOwoJCXJldHVybiAiIjsKCX0KCgogIC8vIG9sZCBmdW5jdGlvbiAobm90IHVzZWQ/KQogIC8vIHRvZG8sIHB1dCB0aGlzIGludG8gdGhlIFVzZXJNYW5pcHVsYXRvciBzdHVmZgoJZnVuY3Rpb24gQ2hhbmdlR3JvdXAoJGlkKSB7CgkJJGRiPSR0aGlzLT5HZXREYigpOwoJCWlmIChpc3NldCgkX1BPU1RbJGlkLiJncm91cGlkIl0pKSAkZ3JvdXBpZD10cmltKCRfUE9TVFskaWQuImdyb3VwaWQiXSk7IGVsc2UgcmV0dXJuICJVbnJlY292ZXJhYmxlIGVycm9yIjsKCQlpZiAoaXNzZXQoJF9QT1NUWyRpZC4iZ3JvdXBuYW1lIl0pKSAkZ3JvdXBuYW1lPXRyaW0oJF9QT1NUWyRpZC4iZ3JvdXBuYW1lIl0pOyBlbHNlIHJldHVybiAiQSB1bmlxdWUgZ3JvdXAgbmFtZSBtdXN0IGJlIHByb3ZpZGVkISI7CgoJCS8vQ2hlY2sgZm9yIGV4aXN0aW5nIGdyb3VwbmFtZQoJCSRxdWVyeT0iU0VMRUNUICogRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfZ3JvdXBzIFdIRVJFIGdyb3VwbmFtZT0nIi4kZ3JvdXBuYW1lLiInIjsKCQkkcmVzdWx0PSRkYi0+RXhlY3V0ZSgkcXVlcnkpOwoJCWlmICgkcmVzdWx0ICYmICRyZXN1bHQtPlJvd0NvdW50KCkpIHsKCQkJJHJvdz0kcmVzdWx0LT5GZXRjaFJvdygpOwoJCQlpZiAoJHJvd1siaWQiXSE9JGdyb3VwaWQpIHJldHVybiAiR3JvdXAgbmFtZSBhbHJlYWR5IGV4aXN0cyEiOwoJCQkvL0Vsc2Ugc2FtZSBncm91cC4uLgoJCX0KCgkJJGdyb3VwZGVzYz10cmltKCRfUE9TVFskaWQuImdyb3VwZGVzYyJdKTsKCQkkcXVlcnk9IlVQREFURSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfZ3JvdXBzIFNFVCBncm91cG5hbWU9Pyxncm91cGRlc2M9PyBXSEVSRSBpZD0/IjsKCQkkcGFyYW1zPWFycmF5KCRncm91cG5hbWUsJGdyb3VwZGVzYywkZ3JvdXBpZCk7CgkJJGRicmVzdWx0PSRkYi0+RXhlY3V0ZSgkcXVlcnksJHBhcmFtcyk7Cgl9CgoKCQogIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogIC8vICBBUEkgRlVOQ1RJT05TIC8vCiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogIGZ1bmN0aW9uIENvdW50VGVtcENvZGVSZWNvcmRzKCkKICB7CiAgICByZXR1cm4gJHRoaXMtPnVzZXJtYW5pcC0+Q291bnRUZW1wQ29kZVJlY29yZHMoKTsKICB9CgogIGZ1bmN0aW9uIEV4cGlyZVRlbXBDb2RlcyggJGV4cGlyeWNvZGUgKQogIHsKICAgIHJldHVybiAkdGhpcy0+dXNlcm1hbmlwLT5FeHBpcmVUZW1wQ29kZXMoICRleHBpcnljb2RlICk7CiAgfQoKICBmdW5jdGlvbiBSZW1vdmVVc2VyVGVtcENvZGUoICR1aWQgKQogIHsKICAgIHJldHVybiAkdGhpcy0+dXNlcm1hbmlwLT5SZW1vdmVVc2VyVGVtcENvZGUoICR1aWQgKTsKICB9ICAKCiAgZnVuY3Rpb24gR2V0VXNlclRlbXBDb2RlKCAkdWlkICkKICB7CiAgICByZXR1cm4gJHRoaXMtPnVzZXJtYW5pcC0+R2V0VXNlclRlbXBDb2RlKCAkdWlkICk7CiAgfSAgCgogIGZ1bmN0aW9uIFNldFVzZXJUZW1wQ29kZSggJHVpZCwgJGNvZGUgKQogIHsKICAgIHJldHVybiAkdGhpcy0+dXNlcm1hbmlwLT5TZXRVc2VyVGVtcENvZGUoICR1aWQsICRjb2RlICk7CiAgfQoKICBmdW5jdGlvbiBTZXRQcm9wZXJ0eURlZm4oICRuYW1lLCAkbmV3bmFtZSwgJHByb21wdCwgJGxlbmd0aCwgJHR5cGUsICRtYXhsZW5ndGggKQogIHsKICAgIHJldHVybiAkdGhpcy0+dXNlcm1hbmlwLT5TZXRQcm9wZXJ0eURlZm4oICRuYW1lLCAkbmV3bmFtZSwgJHByb21wdCwgJGxlbmd0aCwgJHR5cGUsICRtYXhsZW5ndGggKTsKICB9CgogIGZ1bmN0aW9uIEdldFByb3BlcnR5R3JvdXBSZWxhdGlvbnMoICR0aXRsZSApCiAgewogICAgcmV0dXJuICR0aGlzLT51c2VybWFuaXAtPkdldFByb3BlcnR5R3JvdXBSZWxhdGlvbnMoICR0aXRsZSApOwogIH0KCiAgZnVuY3Rpb24gSXNBY2NvdW50RXhwaXJlZCggJHVpZCApCiAgewogICAgcmV0dXJuICR0aGlzLT51c2VybWFuaXAtPklzQWNjb3VudEV4cGlyZWQoICR1aWQgKTsKICB9CgogIGZ1bmN0aW9uIEdldEdyb3VwUHJvcGVydHlSZWxhdGlvbnMoICRncnBpZCApCiAgewogICAgcmV0dXJuICR0aGlzLT51c2VybWFuaXAtPkdldEdyb3VwUHJvcGVydHlSZWxhdGlvbnMoICRncnBpZCApOwogIH0KCiAgZnVuY3Rpb24gQWRkR3JvdXBQcm9wZXJ0eVJlbGF0aW9uKCAkZ3JwaWQsICRwcm9wbmFtZSwgJHNvcnRrZXksICR2YWwgKQogIHsKICAgIHJldHVybiAkdGhpcy0+dXNlcm1hbmlwLT5BZGRHcm91cFByb3BlcnR5UmVsYXRpb24oICRncnBpZCwgJHByb3BuYW1lLCAkc29ydGtleSwgJHZhbCApOwogIH0KCQogIGZ1bmN0aW9uIERlbGV0ZUFsbEdyb3VwUHJvcGVydHlSZWxhdGlvbnMoICRncnBpZCApCiAgewogICAgcmV0dXJuICR0aGlzLT51c2VybWFuaXAtPkRlbGV0ZUFsbEdyb3VwUHJvcGVydHlSZWxhdGlvbnMoICRncnBpZCApOwogIH0KCiAgZnVuY3Rpb24gRGVsZXRlQWxsR3JvdXBQcm9wZXJ0eVJlbGF0aW9uKCAkZ3JwaWQsICRwcm9wbmFtZSApCiAgewogICAgcmV0dXJuICR0aGlzLT51c2VybWFuaXAtPkRlbGV0ZUFsbEdyb3VwUHJvcGVydHlSZWxhdGlvbnMoICRncnBpZCwgJHByb3BuYW1lICk7CiAgfQoKICBmdW5jdGlvbiBBZGRQcm9wZXJ0eURlZm4oICRuYW1lLCAkcHJvbXB0LCAkdHlwZSwgJGxlbmd0aCwgJG1heGxlbmd0aCApCiAgewogICAgcmV0dXJuICR0aGlzLT51c2VybWFuaXAtPkFkZFByb3BlcnR5RGVmbiggJG5hbWUsICRwcm9tcHQsICR0eXBlLCAkbGVuZ3RoLCAkbWF4bGVuZ3RoICk7CiAgfQoKICBmdW5jdGlvbiBBZGRTZWxlY3RPcHRpb25zKCAkbmFtZSwgJHNlbG9wdGlvbnMgKQogIHsKICAgIHJldHVybiAkdGhpcy0+dXNlcm1hbmlwLT5BZGRTZWxlY3RPcHRpb25zKCAkbmFtZSwgJHNlbG9wdGlvbnMgKTsKICB9CgogIGZ1bmN0aW9uIERlbGV0ZVByb3BlcnR5RGVmbiggJG5hbWUgKQogIHsKICAgIHJldHVybiAkdGhpcy0+dXNlcm1hbmlwLT5EZWxldGVQcm9wZXJ0eURlZm4oICRuYW1lICk7CiAgfQoKICBmdW5jdGlvbiBEZWxldGVQcm9wZXJ0eURlZm5zKCkKICB7CiAgICByZXR1cm4gJHRoaXMtPnVzZXJtYW5pcC0+RGVsZXRlUHJvcGVydHlEZWZucygpOwogIH0KCiAgZnVuY3Rpb24gRGVsZXRlU2VsZWN0T3B0aW9ucyggJG5hbWUgKQogIHsKICAgIHJldHVybiAkdGhpcy0+dXNlcm1hbmlwLT5EZWxldGVTZWxlY3RPcHRpb25zKCAkbmFtZSApOwogIH0KCiAgZnVuY3Rpb24gR2V0UHJvcGVydHlEZWZucygpCiAgewogICAgcmV0dXJuICR0aGlzLT51c2VybWFuaXAtPkdldFByb3BlcnR5RGVmbnMoKTsKICB9CgogIGZ1bmN0aW9uIEdldFByb3BlcnR5RGVmbiggJG5hbWUgKQogIHsKICAgIHJldHVybiAkdGhpcy0+dXNlcm1hbmlwLT5HZXRQcm9wZXJ0eURlZm4oICRuYW1lICk7CiAgfQoKICBmdW5jdGlvbiBHZXRTZWxlY3RPcHRpb25zKCAkbmFtZSwgJGRpbSApCiAgewogICAgcmV0dXJuICR0aGlzLT51c2VybWFuaXAtPkdldFNlbGVjdE9wdGlvbnMoICRuYW1lLCAkZGltICk7CiAgfQoKICBmdW5jdGlvbiBMb2dpbiggJHVzZXJuYW1lLCAkcGFzc3dvcmQgKQogIHsKICAgIHJldHVybiAkdGhpcy0+dXNlcm1hbmlwLT5Mb2dpbiggJHVzZXJuYW1lLCAkcGFzc3dvcmQgKTsKICB9CgogIGZ1bmN0aW9uIEFzc2lnblVzZXJUb0dyb3VwKCAkdWlkLCAkZ2lkICkKICB7CiAgICByZXR1cm4gJHRoaXMtPnVzZXJtYW5pcC0+QXNzaWduVXNlclRvR3JvdXAoICR1aWQsICRnaWQgKTsKICB9CgogIGZ1bmN0aW9uIElzVmFsaWRQYXNzd29yZCggJHBhc3N3b3JkICkKICB7CiAgICByZXR1cm4gJHRoaXMtPnVzZXJtYW5pcC0+SXNWYWxpZFBhc3N3b3JkKCAkcGFzc3dvcmQgKTsKICB9CgogIGZ1bmN0aW9uIERlbGV0ZVVzZXJGdWxsKCAkdWlkICkKICB7CiAgICByZXR1cm4gJHRoaXMtPnVzZXJtYW5pcC0+RGVsZXRlVXNlckZ1bGwoICR1aWQgKTsKICB9CgogIGZ1bmN0aW9uIEdldEdyb3VwSW5mbyggJGdpZCApCiAgewogICAgcmV0dXJuICR0aGlzLT51c2VybWFuaXAtPkdldEdyb3VwSW5mbyggJGdpZCApOwogIH0KCiAgZnVuY3Rpb24gQ291bnRVc2Vyc0luR3JvdXAoICRnaWQgPSAnJyApCiAgewogICAgcmV0dXJuICR0aGlzLT51c2VybWFuaXAtPkNvdW50VXNlcnNJbkdyb3VwKCAkZ2lkICk7CiAgfQoKICBmdW5jdGlvbiBHZXRVc2VySW5mbyggJHVpZCApCiAgewogICAgcmV0dXJuICR0aGlzLT51c2VybWFuaXAtPkdldFVzZXJJbmZvKCAkdWlkICk7CiAgfQogCiAgZnVuY3Rpb24gR2V0VXNlcnNJbkdyb3VwKCAkZ2lkID0gJycsICRyZWdleCA9ICcnLCAkbGltaXQgPSAnJywgJHNvcnQgPSAnJyApCiAgewogICAgcmV0dXJuICR0aGlzLT51c2VybWFuaXAtPkdldFVzZXJzSW5Hcm91cCggJGdpZCwgJHJlZ2V4LCAkbGltaXQsICRzb3J0ICk7CiAgfQoKICBmdW5jdGlvbiBHcm91cEV4aXN0c0J5SUQoICRnaWQgKQogIHsKICAgIHJldHVybiAkdGhpcy0+dXNlcm1hbmlwLT5Hcm91cEV4aXN0c0J5SUQoICRnaWQgKTsKICB9CgogIGZ1bmN0aW9uIEdyb3VwRXhpc3RzQnlOYW1lKCAkbmFtZSApCiAgewogICAgcmV0dXJuICR0aGlzLT51c2VybWFuaXAtPkdyb3VwRXhpc3RzQnlOYW1lKCAkbmFtZSApOwogIH0KCiAgZnVuY3Rpb24gSXNWYWxpZEVtYWlsQWRkcmVzcyggJGVtYWlsLCAkc210cHZhbGlkYXRlID0gZmFsc2UgKQogIHsKICAgIHJldHVybiAkdGhpcy0+dXNlcm1hbmlwLT5Jc1ZhbGlkRW1haWxBZGRyZXNzKCAkZW1haWwsICRzbXRwdmFsaWRhdGUgKTsKICB9CgogIGZ1bmN0aW9uIElzVmFsaWRVc2VybmFtZSggJHVzZXJuYW1lICkKICB7CiAgICByZXR1cm4gJHRoaXMtPnVzZXJtYW5pcC0+SXNWYWxpZFVzZXJuYW1lKCAkdXNlcm5hbWUgKTsKICB9CgogIGZ1bmN0aW9uIFJlbW92ZVVzZXJGcm9tR3JvdXAoICR1aWQsICRnaWQgKQogIHsKICAgIHJldHVybiAkdGhpcy0+dXNlcm1hbmlwLT5SZW1vdmVVc2VyRnJvbUdyb3VwKCAkdWlkLCAkZ2lkICk7CiAgfQoKICBmdW5jdGlvbiBTZXRHcm91cCggJGdpZCwgJG5hbWUsICRkZXNjICkKICB7CiAgICByZXR1cm4gJHRoaXMtPnVzZXJtYW5pcC0+U2V0R3JvdXAoICRnaWQsICRuYW1lLCAkZGVzYyApOwogIH0KCiAgZnVuY3Rpb24gU2V0VXNlclBhc3N3b3JkKCAkdWlkLCAkcGFzc3dvcmQgKQogIHsKICAgIHJldHVybiAkdGhpcy0+dXNlcm1hbmlwLT5TZXRVc2VyUGFzc3dvcmQoICR1aWQsICRwYXNzd29yZCApOwogIH0KCiAgZnVuY3Rpb24gU2V0VXNlciggJHVpZCwgJHVzZXJuYW1lLCAkcGFzc3dvcmQsICRleHBpcmVzICkKICB7CiAgICByZXR1cm4gJHRoaXMtPnVzZXJtYW5pcC0+U2V0VXNlciggJHVpZCwgJHVzZXJuYW1lLCAkcGFzc3dvcmQsICRleHBpcmVzICk7CiAgfQoKICBmdW5jdGlvbiBTZXRVc2VyR3JvdXBzKCAkdWlkLCAkZ3JwaWRzICkKICB7CiAgICByZXR1cm4gJHRoaXMtPnVzZXJtYW5pcC0+U2V0VXNlckdyb3VwcyggJHVpZCwgJGdycGlkcyApOwogIH0KCiAgZnVuY3Rpb24gU2V0VXNlclByb3BlcnRpZXMoICR1aWQsICRwcm9wcyApCiAgewogICAgcmV0dXJuICR0aGlzLT51c2VybWFuaXAtPlNldFVzZXJQcm9wZXJ0aWVzKCAkdWlkLCAkcHJvcHMgKTsKICB9CgogIGZ1bmN0aW9uIFVzZXJFeGlzdHNCeUlEKCAkdWlkICkKICB7CiAgICByZXR1cm4gJHRoaXMtPnVzZXJtYW5pcC0+VXNlckV4aXN0c0J5SUQoICR1aWQgKTsKICB9CgogIGZ1bmN0aW9uIEdldFVzZXJQcm9wZXJ0aWVzKCR1aWQpCiAgewogICAgcmV0dXJuICR0aGlzLT51c2VybWFuaXAtPkdldFVzZXJQcm9wZXJ0aWVzKCAkdWlkICk7CiAgfQoKICBmdW5jdGlvbiBHZXRNZW1iZXJHcm91cHNBcnJheSgkdXNlcmlkKQogIHsKICAgIHJldHVybiAkdGhpcy0+dXNlcm1hbmlwLT5HZXRNZW1iZXJHcm91cHNBcnJheSgkdXNlcmlkKTsKICB9CgogIGZ1bmN0aW9uIEdldFVzZXJQcm9wZXJ0eSgkdGl0bGUsJGRlZmF1bHR2YWx1ZT1mYWxzZSkgCiAgewogICAgcmV0dXJuICR0aGlzLT51c2VybWFuaXAtPkdldFVzZXJQcm9wZXJ0eSggJHRpdGxlLCAkZGVmYXVsdHZhbHVlICk7CiAgfQoKICBmdW5jdGlvbiBHZXRVc2VyUHJvcGVydHlGdWxsKCR0aXRsZSwkdXNlcmlkLCAkZGVmYXVsdHZhbHVlPWZhbHNlKSAKICB7CiAgICByZXR1cm4gJHRoaXMtPnVzZXJtYW5pcC0+R2V0VXNlclByb3BlcnR5RnVsbCgkdGl0bGUsJHVzZXJpZCwkZGVmYXVsdHZhbHVlKTsKICB9CgogIGZ1bmN0aW9uIFNldFVzZXJQcm9wZXJ0eSgkdGl0bGUsJGRhdGEpIAogIHsKICAgIHJldHVybiAkdGhpcy0+dXNlcm1hbmlwLT5TZXRVc2VyUHJvcGVydHkoJHRpdGxlLCRkYXRhKTsKICB9CgogIGZ1bmN0aW9uIFNldFVzZXJQcm9wZXJ0eUZ1bGwoJHRpdGxlLCRkYXRhLCR1c2VyaWQpIAogIHsKICAgIHJldHVybiAkdGhpcy0+dXNlcm1hbmlwLT5TZXRVc2VyUHJvcGVydHlGdWxsKCR0aXRsZSwkZGF0YSwkdXNlcmlkKTsKICB9CgogIGZ1bmN0aW9uIERlbGV0ZVVzZXJQcm9wZXJ0eUJ5TmFtZSggJHRpdGxlICkKICB7CiAgICByZXR1cm4gJHRoaXMtPnVzZXJtYW5pcC0+RGVsZXRlVXNlclByb3BlcnR5QnlOYW1lKCR0aXRsZSk7CiAgfQoKICBmdW5jdGlvbiBEZWxldGVVc2VyUHJvcGVydHkoJHRpdGxlLCRhbGw9ZmFsc2UpIAogIHsKICAgIHJldHVybiAkdGhpcy0+dXNlcm1hbmlwLT5EZWxldGVVc2VyUHJvcGVydHkoJHRpdGxlLCRhbGwpOwogIH0KCiAgZnVuY3Rpb24gRGVsZXRlVXNlclByb3BlcnR5RnVsbCgkdGl0bGUsJHVzZXJpZCwkYWxsPWZhbHNlKSAKICB7CiAgICByZXR1cm4gJHRoaXMtPnVzZXJtYW5pcC0+RGVsZXRlVXNlclByb3BlcnR5RnVsbCgkdGl0bGUsJHVzZXJpZCwkYWxsKTsKICB9CgogIGZ1bmN0aW9uIERlbGV0ZUFsbFVzZXJQcm9wZXJ0aWVzKCkgCiAgewogICAgcmV0dXJuICR0aGlzLT51c2VybWFuaXAtPkRlbGV0ZUFsbFVzZXJQcm9wZXJ0aWVzKCk7CiAgfQoKICBmdW5jdGlvbiBEZWxldGVBbGxVc2VyUHJvcGVydGllc0Z1bGwoJHVzZXJpZCkgCiAgewogICAgcmV0dXJuICR0aGlzLT51c2VybWFuaXAtPkRlbGV0ZUFsbFVzZXJQcm9wZXJ0aWVzRnVsbCgkdXNlcmlkKTsKICB9CgogIGZ1bmN0aW9uIENoZWNrUGFzc3dvcmQoJHVzZXJuYW1lLCRwYXNzd29yZCkgCiAgewogICAgcmV0dXJuICR0aGlzLT51c2VybWFuaXAtPkNoZWNrUGFzc3dvcmQoJHVzZXJuYW1lLCRwYXNzb3JkKTsKICB9CgogIGZ1bmN0aW9uIExvZ2dlZEluTmFtZSgpIAogIHsKICAgICRzdHIgPSAkdGhpcy0+dXNlcm1hbmlwLT5Mb2dnZWRJbk5hbWUoKTsKICAgIHJldHVybiAkc3RyOwogIH0KCiAgZnVuY3Rpb24gTG9nZ2VkSW5FbWFpbCgpIAogIHsKICAgIHJldHVybiAkdGhpcy0+dXNlcm1hbmlwLT5Mb2dnZWRJbkVtYWlsKCk7CiAgfQoKICBmdW5jdGlvbiBMb2dvdXQoKSAKICB7CiAgICByZXR1cm4gJHRoaXMtPnVzZXJtYW5pcC0+TG9nb3V0KCk7CiAgfQoKICBmdW5jdGlvbiBMb2dvdXRVc2VyKCR1aWQpIAogIHsKICAgIHJldHVybiAkdGhpcy0+dXNlcm1hbmlwLT5Mb2dvdXRVc2VyKCR1aWQpOwogIH0KCiAgZnVuY3Rpb24gRXhwaXJlVXNlcnMoKSAKICB7CiAgICByZXR1cm4gJHRoaXMtPnVzZXJtYW5pcC0+RXhwaXJlVXNlcnMoKTsKICB9CgogIGZ1bmN0aW9uIExvZ2dlZEluSWQoKSAKICB7CiAgICByZXR1cm4gJHRoaXMtPnVzZXJtYW5pcC0+TG9nZ2VkSW5JZCgpOwogIH0KCiAgZnVuY3Rpb24gTG9nZ2VkSW4oKSAKICB7CiAgICByZXR1cm4gJHRoaXMtPnVzZXJtYW5pcC0+TG9nZ2VkSW4oKTsKICB9CgogIGZ1bmN0aW9uIE1lbWJlck9mR3JvdXAoJHVzZXJpZCwkZ3JvdXBpZCkgCiAgewogICAgcmV0dXJuICR0aGlzLT51c2VybWFuaXAtPk1lbWJlck9mR3JvdXAoJHVzZXJpZCwkZ3JvdXBpZCk7CiAgfQoKICBmdW5jdGlvbiBHZXRVc2VyTmFtZSgkdXNlcmlkKSAKICB7CiAgICByZXR1cm4gJHRoaXMtPnVzZXJtYW5pcC0+R2V0VXNlck5hbWUoJHVzZXJpZCk7CiAgfQoKICBmdW5jdGlvbiBHZXRFbWFpbCgkdXNlcmlkKSAKICB7CiAgICByZXR1cm4gJHRoaXMtPnVzZXJtYW5pcC0+R2V0RW1haWwoJHVzZXJpZCk7CiAgfQoKICBmdW5jdGlvbiBHZXRVc2VySUQoJHVzZXJuYW1lKSAKICB7CiAgICByZXR1cm4gJHRoaXMtPnVzZXJtYW5pcC0+R2V0VXNlcklEKCR1c2VybmFtZSk7CiAgfQoKICBmdW5jdGlvbiBBZGRHcm91cCggJG5hbWUsICRkZXNjcmlwdGlvbiApCiAgewogICAgcmV0dXJuICR0aGlzLT51c2VybWFuaXAtPkFkZEdyb3VwKCAkbmFtZSwgJGRlc2NyaXB0aW9uICk7CiAgfQoKICBmdW5jdGlvbiBBZGRVc2VyKCAkbmFtZSwgJHBhc3N3b3JkLCAkZXhwaXJlcyApCiAgewogICAgcmV0dXJuICR0aGlzLT51c2VybWFuaXAtPkFkZFVzZXIoICRuYW1lLCAkcGFzc3dvcmQsICRleHBpcmVzICk7CiAgfQoKICBmdW5jdGlvbiBHZXRHcm91cE5hbWUoJGdyb3VwaWQpIAogIHsKICAgIHJldHVybiAkdGhpcy0+dXNlcm1hbmlwLT5HZXRHcm91cE5hbWUoICRncm91cGlkICk7CiAgfQoKICBmdW5jdGlvbiBHZXRHcm91cERlc2MoJGdyb3VwaWQpCiAgewogICAgcmV0dXJuICR0aGlzLT51c2VybWFuaXAtPkdldEdyb3VwRGVzYyggJGdyb3VwaWQgKTsKICB9CgogIGZ1bmN0aW9uIERlbGV0ZUdyb3VwRnVsbCggJGdpZCApCiAgewogICAgcmV0dXJuICR0aGlzLT51c2VybWFuaXAtPkRlbGV0ZUdyb3VwRnVsbCggJGdpZCApOwogIH0KCiAgZnVuY3Rpb24gR2V0R3JvdXBMaXN0KCkKICB7CiAgICByZXR1cm4gJHRoaXMtPnVzZXJtYW5pcC0+R2V0R3JvdXBMaXN0KCk7CiAgfQoKICBmdW5jdGlvbiBHZXRHcm91cExpc3RGdWxsKCkKICB7CiAgICByZXR1cm4gJHRoaXMtPnVzZXJtYW5pcC0+R2V0R3JvdXBMaXN0RnVsbCgpOwogIH0KCiAgZnVuY3Rpb24gR2V0R3JvdXBJRCgkZ3JvdXBuYW1lKQogIHsKICAgIHJldHVybiAkdGhpcy0+dXNlcm1hbmlwLT5HZXRHcm91cElEKCAkZ3JvdXBuYW1lICk7CiAgfQoKICBmdW5jdGlvbiBHZXRNZW1iZXJHcm91cHMoJHVzZXJpZCkKICB7CiAgICByZXR1cm4gJHRoaXMtPnVzZXJtYW5pcC0+R2V0TWVtYmVyR3JvdXBzKCR1c2VyaWQpOwogIH0KCiAgZnVuY3Rpb24gRGVsZXRlVXNlcigkaWQpIAogIHsKICAgIHJldHVybiAkdGhpcy0+dXNlcm1hbmlwLT5EZWxldGVVc2VyKCAkaWQgKTsKICB9Cn0gLy8gY2xhc3MKCj8+Cg==]]></data>
  </file>
  <file>
    <filename>/icons/</filename>
    <isdir>1</isdir>
  </file>
  <file>
    <filename>/icons/delete.gif</filename>
    <isdir>0</isdir>
    <data><![CDATA[R0lGODlhEAAQAOZ/AAE82AkNrcLT4rHS4gpU4iJr4Cs51gBF4gYjqk1Wyhle4R1m4hk0zQZF2QkMlglJ2wAAfAAAggAuqgAAci514gkOpgBD4mWK3A5R22OK35Wh0bXW4rDL4q/J4jh64QpGzBI6pzNtygtL28DA0x000Qcou6e23hVoxoqKyyBXvmGP0gAi1REjtl9fo3FxzszM6BBW4jF84kmN2JTA4T2G0sjZ4ktXzCZmwhVZ3hE3qQADiAATlAAVmDJnyEKD4RcclgBBthNErBtCvVl/21JcxFNb05a43rjW4gAAXwAzrAYfogkUtgAioAA4tgAAbAovqJ2/4j1T15aW0K6/4gNK38XV4rXT4gEhmiY0yWNjtz2G4pSy4cfH4U5XxBVk4h9q4sHB3CRw4hcuyUiM4kFy2U1z2leU4h8ops3c4lCQ4iM01zl70ExXzyVhy6Gh44iItRBR3SArsCkxtnZ23Rg9qwAMjzx/4ghP4IKy4gAdnQAt13ST3xMpvkWG4g1X3ezs7CH5BAEAAH8ALAAAAAAQABAAAAe6gH+Cg4SFhC9zBiQMDGJYLlyFbgZkazcpQSB0QnxShGoyJ0ASeXURExM5LIRRNE0STDs6EE5IVyWERTMhSTyzExBPfkuEbBscRio9KW0FXgcBhDYDAmh4Y1oxXwQW0YMJ1B1mfXYUC9zegglWVVBpPh4U2wcVhF1HNRcAAA0iGHf0CBHZYqLMCn4PEgYcJGfPlCF6GsDBoUABFQeEUMTRkOEAjAVhCnxw8KYQmCxnEKhU8qPFCEMwDQUCADs=]]></data>
  </file>
  <file>
    <filename>/icons/edit.gif</filename>
    <isdir>0</isdir>
    <data><![CDATA[R0lGODlhEAAQAOZ/ANfq//r+/ur0/+Xy/9/1/9rs/9bu/nehxf/+/fX///H4/+32/+j0/+P3/+bz/+Hw/3+ny3mgxV2XzViTyXqhxVuXzePx//z9/3eew3CYv/j7//r9//3+///+/9zu//f7//j8/3GZv/T6//b6/9/u/93u/+3+//b7/+Dv/1qTyVeY0HGYv/r8/8jf84etz26Xv1eTyfP4/+v1/uX1+FuY0NHq+q/L5IWhwVCKwG6fyun5/+n6/8DL2dzj6VaRyVqAp+T4//z+//T5//L5+9zt/6Kyxc/b5ODy/+Dn63ifxD9nkUdoj+P//1KKv9/v/52ww/D6/3KawfP6/1ORylGSzGOc0N/w/9fi64ykvJWmvPT9//f+/+Xx/////uH0/42ryf7+//7//1qQw0N1pkx5pYuetleNwFiVzePt8luWz+v7/9PZ41qX0J650MPM29ni6vH3++Lv/97u//b4+VJwllZzlVWTytjr/+Lx/16Bp+31/4Sdt+b4/3adw////////yH5BAEAAH8ALAAAAAAQABAAAAfjgH95BxQUGIeHfRERBz9/fyt+fgiSlX5dkhCPIX5rWZVgF35FPH6af0lIdWWSHEEgfk9LRi6PUQg9c5IXGx8fcG9DOY8ZlWEXLBonIgpQCRPEfh0dQRvKIgsDFiYp0R28GiNSC1x4cWrQf8UcGyAfMTLaKHI66ZwX4QoCDhZOJQVAYDx64YeDED0M5Hko4KGBj0dmAqCRsc+ClYUAWhiw80jMFTpYEjx4UOKOly9KbKR51MSPmz1aSJAgAuDIjTYmpjzC4WfLDBM7+DQgQKCGASZUHpGpwlSC0woVztBgo2LMn0AAOw==]]></data>
  </file>
  <file>
    <filename>/index.html</filename>
    <isdir>0</isdir>
    <data><![CDATA[]]></data>
  </file>
  <file>
    <filename>/lang/</filename>
    <isdir>1</isdir>
  </file>
  <file>
    <filename>/lang/en_US.php</filename>
    <isdir>0</isdir>
    <data><![CDATA[PD9waHAKJGxhbmdbJ2Zyb250ZW5kdXNlcl9sb2dvdXQnXSA9ICdGcm9udGVuZCBVc2VyIExvZ291dCc7CiRsYW5nWydmcm9udGVuZHVzZXJfbG9nZ2VkaW4nXSA9ICdGcm9udGVuZCBVc2VyIExvZ2luJzsKJGxhbmdbJ2VkaXRwcm9wX2luZm9tc2cnXSA9ICc8Zm9udCBjb2xvcj0icmVkIj48Yj5VU0UgQ0FVVElPTjwvYj4gd2hlbiBjaGFuZ2luZyBleGlzdGluZyBwcm9wZXJ0aWVzIHRoYXQgYXJlIGFzc2lnbmVkIHRvIGdyb3VwcywgeW91IG1heSBwb3RlbnRpYWxseSBjYXVzZSBkYW1hZ2UgYW5kIGJyZWFrIGFuIGV4aXN0aW5nIHNpdGUgPGk+KGVzcGVjaWFsbHkgaWYgeW91IHJlZHVjZSBmaWVsZCBsZW5ndGhzLCBldGMpPC9pPjwvZm9udD4nOwokbGFuZ1snaW5mb19zbXRwdmFsaWRhdGUnXSA9ICdUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHdvcmsgb24gd2luZG93cyc7CiRsYW5nWydtc2dfZG9udGNyZWF0ZXVzZXJuYW1lJ10gPSAnRG8gbm90IGNyZWF0ZSBhIHByb3BlcnR5IGZvciB1c2VybmFtZSwgb3Igc29tZSBzdWNoIHRoaW5nIGFzIHRoaXMgaXMgYnVpbHRpbiB0byB0aGUgRnJvbnRFbmRVc2VycyBtb2R1bGUnOwokbGFuZ1sncHJvbXB0X2V4cG9ydGNzdiddID0gJ0V4cG9ydCBVc2VycyB0byBDU1YnOwokbGFuZ1snZXhwb3J0Y3N2J10gPSAnRXhwb3J0JzsKJGxhbmdbJ2FkbWluJ10gPSAnQWRtaW4nOwokbGFuZ1snZWRpdHByb3AnXSA9ICdFZGl0IFByb3BlcnR5JzsKJGxhbmdbJ21heGxlbmd0aCddID0gJ01heGltdW0gTGVuZ3RoJzsKJGxhbmdbJ2NyZWF0ZWQnXSA9ICdDcmVhdGVkJzsKJGxhbmdbJ3NvcnRieSddID0gJ1NvcnQgQnknOwokbGFuZ1snc29ydCddID0gJ1NvcnRpbmcnOwokbGFuZ1sndXNlcnNpbmdyb3VwJ10gPSAnVXNlcnMgaW4gdGhlIGdyb3VwJzsKJGxhbmdbJ3VzZXJsaW1pdCddID0gJ0xpbWl0IHJlc3VsdHMgdG8nOwokbGFuZ1snZXJyb3Jfbm9lbWFpbGZpZWxkJ10gPSAnQ291bGQgbm90IGZpbmQgYW4gZW1haWwgZmllbGQgZm9yIHRoaXMgdXNlci4gIFlvdSBtYXkgbmVlZCB0byBjb250YWN0IHRoZSBzeXN0ZW0gYWRtaW5pc3RyYXRvcic7CiRsYW5nWydwcm9tcHRfZm9yZ290cHdfcGFnZSddID0gJ1BhZ2VJRC9BbGlhcyBmb3IgRm9yZ290IFBhc3N3b3JkIGZvcm0nOwokbGFuZ1sncHJvbXB0X2NoYW5nZXNldHRpbmdzX3BhZ2UnXSA9ICdQYWdlSUQvQWxpYXMgZm9yIENoYW5nZSBTZXR0aW5ncyBmb3JtJzsKJGxhbmdbJ3Byb21wdF9sb2dpbl9wYWdlJ10gPSAnUGFnZUlEL0FsaWFzIHRvIGp1bXAgdG8gYWZ0ZXIgbG9naW4nOwokbGFuZ1sncHJvbXB0X2xvZ291dF9wYWdlJ10gPSAnUGFnZUlEL0FsaWFzIHRvIGp1bXAgdG8gYWZ0ZXIgbG9nb3V0JzsKJGxhbmdbJ3NvcnRvcmRlciddID0gJ1NvcnQgb3JkZXInOwokbGFuZ1sncHJvbXB0X251bXJlc2V0cmVjb3JkJ10gPSAnQSBudW1iZXIgb2YgdXNlcnMgYXJlIGluIHRoZSBtaWRkbGUgb2YgcmVzZXR0aW5nIGxvc3QgcGFzc3dvcmRzLiAgQ3VycmVudGx5IHRoaXMgY291bnQgaXMgYXQ6JzsKJGxhbmdbJ3JlbW92ZTF3ZWVrJ10gPSAnUmVtb3ZlIGFsbCBlbnRyaWVzIG1vcmUgdGhhbiBhIHdlZWsgb2xkJzsKJGxhbmdbJ3JlbW92ZTFtb250aCddID0gJ1JlbW92ZSBhbGwgZW50cmllcyBtb3JlIHRoYW4gYSBtb250aCBvbGQnOwokbGFuZ1sncmVtb3ZlYWxsJ10gPSAnUmVtb3ZlIGFsbCBlbnRyaWVzJzsKJGxhbmdbJ2FyZXlvdXN1cmUnXSA9ICdBcmUgeW91IHN1cmU/JzsgCiRsYW5nWydlcnJvcl9pbnZhbGlkY29kZSddID0gJ0FuIGludmFsaWQgY29kZSBoYXMgYmVlbiBlbnRlcmVkLCBwbGVhc2UgdHJ5IGFnYWluJzsKJGxhbmdbJ2Vycm9yX3RlbXBjb2Rlbm90Zm91bmQnXSA9ICdBIHRlbXBvcmFyeSBjb2RlIGZvciB5b3VyIHVzZXIgaWQgY291bGQgbm90IGJlIGZvdW5kIGluIHRoZSBkYXRhYmFzZSc7CiRsYW5nWydmb3Jnb3RwYXNzd29yZF92ZXJpZnl0ZW1wbGF0ZSddID0gJ1RlbXBsYXRlIHVzZWQgdG8gZGlzcGxheSB2ZXJpZmljYXRpb24gZm9ybSc7CiRsYW5nWydmb3Jnb3RwYXNzd29yZF9lbWFpbHRlbXBsYXRlJ10gPSAnVGVtcGxhdGUgdXNlZCBmb3IgZm9yZ290dGVuIHBhc3N3b3JkIGVtYWlsJzsgCiRsYW5nWydlcnJvcl9yZXNldGFscmVhZHlzZW50J10gPSAnRWl0aGVyIHlvdXJzZWxmIG9yIHNvbWVvbmUgZWxzZSBoYXMgYWxyZWFkeSB0cmlnZ2VyZWQgYSBwYXNzd29yZCByZXNldCBvcGVyYXRpb24gZm9yIHRoaXMgYWNjb3VudC4gIENoZWNrIHlvdXIgZW1haWwsIHlvdSBtYXkgaGF2ZSBmdXJ0aGVyIGluc3RydWN0aW9ucyBvbiBob3cgdG8gcmVzZXQgeW91ciBwYXNzd29yZCBpbiB5b3VyIGluYm94JzsKJGxhbmdbJ2Vycm9yX2RiZXJyb3InXSA9ICdEYXRhYmFzZSBlcnJvcic7CiRsYW5nWydtZXNzYWdlX2ZvcmdvdHB3ZW1haWwnXSA9ICdZb3UgYXJlIHJlY2VpdmluZyB0aGlzIG1lc3NhZ2UgYmVjYXVzZSBzb21lYm9keSB0b2xkIG91ciBzaXRlIHRoYXQgeW91IGhhZCBsb3N0IHlvdXIgcGFzc3dvcmQuICBJZiB0aGlzIGlzIHRoZSBjYXNlLCByZWFkIHRoZSBpbnN0cnVjdGlvbnMgYmVsb3cuICBJZiB5b3UgZG9uXCd0IGhhdmUgYSBjbHVlIHdoYXQgdGhpcyBpcywgdGhlbiB5b3UgYXJlIHNhZmUgdG8gZGVsZXRlIHRoaXMgbWVzc2FnZSwgYW5kIHdlIHRoYW5rIHlvdSBmb3IgeW91ciB0aW1lLic7CiRsYW5nWydwcm9tcHRfY29kZSddID0gJ0NvZGUnOwokbGFuZ1snbWVzc2FnZV9jb2RlJ10gPSAnVGhlIGZvbGxvd2luZyBjb2RlIGhhcyBiZWVuIGdlbmVyYXRlZCByYW5kb21seSBnZW5lcmF0ZWQgaW4gb3JkZXIgdG8gdmVyaWZ5IHRoZSB1c2VyIGFjY291bnQuICB3aGVuIHlvdSBjbGljayBvbiB0aGUgbGluayBiZWxvdyB5b3Ugd2lsbCBiZSBwcmVzZW50ZWQgd2l0aCBhIGZpZWxkIHRvIGVudGVyIHRoaXMgY29kZS4gIE5vcm1hbGx5IHRoZSBmaWVsZCBpcyBwcmUtY29tcGxldGVkIGZvciB5b3UsIGJ1dCBpbmNhc2UgaXQgaXNuXCd0IHRoZSBjb2RlIGlzOic7CiRsYW5nWydwcm9tcHRfbGluayddID0gJ0NsaWNraW5nIG9uIHRoZSBmb2xsb3dpbmcgbGluayB3aWxsIHRha2UgeW91IHRvIHRoZSB3ZWJzaXRlIHdoZXJlIHlvdSBjYW4gZW50ZXIgdGhlIGFib3ZlIGNvZGUsIGFuZCByZXNldCB5b3VyIHBhc3N3b3JkOic7CiRsYW5nWydsb3N0cGFzc3dvcmRfZW1haWxzdWJqZWN0J10gPSAnTG9zdCBQYXNzd29yZCc7CiRsYW5nWydlcnJvcl9ub21haWxlcm1vZHVsZSddID0gJ0NvdWxkIG5vdCBmaW5kIHRoZSBDTVNNYWlsZXIgbW9kdWxlJzsKJGxhbmdbJ2luZm9fZm9yZ290cHdtZXNzYWdlc2VudCddID0gJ0FuIGVtYWlsIGhhcyBiZWVuIHNlbnQgdG8gJXMgd2l0aCBpbnN0cnVjdGlvbnMgYXMgdG8gaG93IHRvIHJlc2V0IHlvdXIgcGFzc3dvcmQuICBUaGFuayB5b3UnOwokbGFuZ1snbG9zdHB3X21lc3NhZ2UnXSA9ICdTbyB5b3UgZm9yZ290IG9yIGxvc3QgeW91ciBwYXNzd29yZC4gV2VsbCwgdHlwZSB5b3VyIHVzZXJuYW1lIGluIGhlcmUsIGFuZCBpZiB3ZSBjYW4gZmluZCB5b3Ugd2Ugd2lsbCBzZW5kIHlvdSBhbiBlbWFpbCB3aXRoIGluc3RydWN0aW9ucyBvbiBob3cgdG8gcmVzZXQgaXQnOwokbGFuZ1snZm9yZ290cGFzc3dvcmRfdGVtcGxhdGUnXSA9ICdGb3Jnb3QgUGFzc3dvcmQgVGVtcGF0ZXMnOwokbGFuZ1snZXJyb3JfcHJvcG5vdGZvdW5kJ10gPSAnUHJvcGVydHkgJXMgbm90IGZvdW5kJzsKJGxhbmdbJ3Byb3BzZm91bmQnXSA9ICdQcm9wZXJ0aWVzIGZvdW5kJzsKJGxhbmdbJ2FkZHByb3AnXSA9ICdBZGQgUHJvcGVydHknOwokbGFuZ1snZXJyb3JfcmVxdWlyZWRmaWVsZCddID0gJ0EgcmVxdWlyZWQgZmllbGQgKCVzKSB3YXMgZW1wdHknOwokbGFuZ1snaW5mb19lbXB0eXBhc3N3b3JkZmllbGQnXSA9ICdFbnRlciBhIG5ldyBwYXNzd29yZCBoZXJlIHRvIGNoYW5nZSB5b3VyIHBhc3N3b3JkJzsKJGxhbmdbJ2Vycm9yX25vdGxvZ2dlZGluJ10gPSAnWW91IGRvIG5vdCBhcHBlYXIgdG8gYmUgbG9nZ2VkIGluJzsKJGxhbmdbJ3VzZXJfc2V0dGluZ3MnXSA9ICdTZXR0aW5ncyc7CiRsYW5nWyd1c2VyX3JlZ2lzdHJhdGlvbiddID0gJ1JlZ2lzdHJhdGlvbic7CiRsYW5nWydlcnJvcl9hY2NvdW50ZXhwaXJlZCddID0gJ1RoaXMgYWNjb3VudCBoYXMgZXhwaXJlZCc7CiRsYW5nWydlcnJvcl9pbXByb3BlcmVtYWlsZm9ybWF0J10gPSAnSW1wcm9wZXIgZW1haWwgYWRkcmVzcyBmb3JtYXR0aW5nJzsKJGxhbmdbJ2Vycm9yX2ludmFsaWRleHBpcnlkYXRlJ10gPSAnSW52YWxpZCBleHBpcnkgZGF0ZSc7CiRsYW5nWydlcnJvcl9wcm9ibGVtc2V0dGluZ3Byb3BlcnR5J10gPSAnRXJyb3Igc2V0dGluZyBwcm9wZXJ0eSAlcyBmb3IgdXNlciAkcyc7CiRsYW5nWydlcnJvcl9pbnZhbGlkZ3JvdXBpZCddID0gJ0ludmFsaWQgZ3JvdXAgaWQgJXMnOwokbGFuZ1snc29ydG9yZGVyJ10gPSAnU29ydCBvcmRlcic7CiRsYW5nWydoaWRkZW5maWVsZG1hcmtlciddID0gJ0hpZGRlbiBmaWVsZCBtYXJrZXInOwokbGFuZ1snaGlkZGVuZmllbGRjb2xvciddID0gJ0hpZGRlbiBmaWVsZCBjb2xvcic7CiRsYW5nWydoaWRkZW4nXSA9ICdIaWRkZW4nOwokbGFuZ1snZXJyb3JfZHVwbGljYXRlbmFtZSddID0gJ0EgcHJvcGVydHkgd2l0aCB0aGF0IG5hbWUgaXMgYWxyZWFkeSBkZWZpbmVkJzsKJGxhbmdbJ2Vycm9yX25vcHJvcGVydGllcyddID0gJ05vIHByb3BlcnRpZXMgZGVmaW5lZCc7CiRsYW5nWydlcnJvcl9ub3JlbGF0aW9ucyddID0gJ05vIHByb3BlcnRpZXMgd2VyZSBzZWxlY3RlZCBmb3IgdGhpcyBncm91cCc7CiRsYW5nWydncm91cHNmb3VuZCddID0gJ0dyb3VwcyBmb3VuZCc7CiRsYW5nWydlcnJvcl9vbmVncm91cHJlcXVpcmVkJ10gPSAnTWVtYmVyc2hpcCBpbiBhdCBsZWFzdCBvbmUgZ3JvdXAgaXMgcmVxdWlyZWQnOwokbGFuZ1sncHJvbXB0X3JlcXVpcmVvbmVncm91cCddID0gJ1JlcXVpcmUgbWVtYmVyc2hpcCBpbiBhdGxlYXN0IG9uZSBncm91cCc7CiRsYW5nWydiYWNrJ10gPSAnQmFjayc7CiRsYW5nWydlcnJvcl9taXNzaW5nX3JlcXVpcmVkX3BhcmFtJ10gPSAnJXMgaXMgYSByZXF1aXJlZCBmaWVsZCc7CiRsYW5nWydyZXF1aXJlZGZpZWxkbWFya2VyJ10gPSAnTWFyayByZXF1aXJlZCBmaWVsZHMgd2l0aCc7CiRsYW5nWydyZXF1aXJlZGZpZWxkY29sb3InXSA9ICdIaWxpdGUgcmVxdWlyZWQgZmllbGRzIGluJzsKJGxhbmdbJ25leHQnXSA9ICdOZXh0JzsKJGxhbmdbJ2Vycm9yX2dyb3VwZXhpc3RzJ10gPSAnQSBHcm91cCB3aXRoIHRoYXQgbmFtZSBhbHJlYWR5IGV4aXN0cyc7CiRsYW5nWydyZXF1aXJlZCddID0gJ1JlcXVpcmVkJzsKJGxhbmdbJ29wdGlvbmFsJ10gPSAnT3B0aW9uYWwnOwokbGFuZ1snb2ZmJ10gPSAnT2ZmJzsKJGxhbmdbJ2xlbmd0aCddID0gJ0xlbmd0aCc7CiRsYW5nWydsZW5ndGhjb21tZW50J10gPSAnPGJyPihjaGFycyBpbiB0aGUgdGV4dCBpbnB1dCknOwokbGFuZ1snc2Vsb3B0aW9ucyddID0gJ0Ryb3Bkb3duIG9wdGlvbnMsIHNlcGFyYXRlZCBieSBsaW5lIGJyZWFrcyc7CiRsYW5nWyd5ZXMnXSA9ICdZZXMnOwokbGFuZ1sncHJvbXB0J10gPSAnUHJvbXB0JzsKJGxhbmdbJ3R5cGUnXSA9ICdUeXBlJzsKJGxhbmdbJ3JlcXVpcmVkJ10gPSAnUmVxdWlyZWQgRmllbGQnOwokbGFuZ1sndGV4dCddID0gJ1RleHQnOwokbGFuZ1snY2hlY2tib3gnXSA9ICdDaGVja2JveCc7CiRsYW5nWydlbWFpbCddID0gJ0VtYWlsJzsKJGxhbmdbJ3RleHRhcmVhJ10gPSAnVGV4dGFyZWEnOwokbGFuZ1snZHJvcGRvd24nXSA9ICdEcm9wZG93bic7CiRsYW5nWydtc2dfY3VycmVudGx5bG9nZ2VkaW5hcyddID0gJ1dlbGNvbWUnOwokbGFuZ1snbG9nb3V0J10gPSAnU2lnbiBvdXQnOwokbGFuZ1sncHJvbXB0X2NoYW5nZXNldHRpbmdzJ10gPSAnQ2hhbmdlIE15IFNldHRpbmdzJzsKJGxhbmdbJ2Vycm9yX2xvZ2luZmFpbGVkJ10gPSAnTG9naW4gZmFpbGVkIC0gSW52YWxpZCB1c2VybmFtZSBvciBwYXNzd29yZD8nOwokbGFuZ1snbG9naW4nXSA9ICdTaWduIGluJzsKJGxhbmdbJ3Byb21wdF91c2VybmFtZSddID0gJ1VzZXJuYW1lJzsKJGxhbmdbJ3Byb21wdF9wYXNzd29yZCddID0gJ1Bhc3N3b3JkJzsKJGxhbmdbJ3JlZ2lzdGVyJ10gPSAnUmVnaXN0ZXInOwokbGFuZ1snZm9yZ290cHcnXSA9ICdGb3Jnb3QgWW91ciBQYXNzd29yZD8nOwokbGFuZ1snZGVmYXVsdHMnXSA9ICdEZWZhdWx0cyc7CiRsYW5nWyd0ZW1wbGF0ZSddID0gJ1RlbXBsYXRlJzsKJGxhbmdbJ2Vycm9yX3VzZXJub3Rmb3VuZCddID0gJ1VzZXIgSUQgbm90IGZvdW5kJzsKJGxhbmdbJ2Vycm9yX3VzZXJuYW1ldGFrZW4nXSA9ICdUaGF0IHVzZXJuYW1lICglcykgaXMgYWxyZWFkeSBpbiB1c2UnOwokbGFuZ1sncHJvbXB0X3NtdHB2YWxpZGF0ZSddID0gJ1VzZSBTTVRQIHRvIHZhbGlkYXRlIGVtYWlsIGFkZHJlc3Nlcz8nOwokbGFuZ1sncHJvbXB0X21pbnB3bGVuJ10gPSAnTWluaW11bSBQYXNzd29yZCBMZW5ndGgnOwokbGFuZ1sncHJvbXB0X21heHB3bGVuJ10gPSAnTWF4aW11bSBQYXNzd29yZCBMZW5ndGgnOwokbGFuZ1sncHJvbXB0X21pbnVubGVuJ10gPSAnTWluaW11bSBVc2VybmFtZSBMZW5ndGgnOwokbGFuZ1sncHJvbXB0X21heHVubGVuJ10gPSAnTWF4aW11bSBVc2VybmFtZSBMZW5ndGgnOwokbGFuZ1sncHJvbXB0X3Nlc3Npb250aW1lb3V0J10gPSAnU2Vzc2lvbiBUaW1lb3V0IChtaW51dGVzKSc7CiRsYW5nWydwcm9tcHRfYWxsb3dlbWFpbHJlZyddID0gJ0FsbG93IEVtYWlsIFJlZ2lzdHJhdGlvbic7CiRsYW5nWydwcm9tcHRfZGZsdGdyb3VwJ10gPSAnRGVmYXVsdCBHcm91cCBmb3IgbmV3IHVzZXJzJzsKJGxhbmdbJ2NoYW5nZXNldHRpbmdzX3RlbXBsYXRlJ10gPSAnQ2hhbmdlIFNldHRpbmdzIFRlbXBsYXRlJzsKJGxhbmdbJ2Vycm9yX3Bhc3N3b3JkbWlzbWF0Y2gnXSA9ICdQYXNzd29yZHMgRG8gbm90IG1hdGNoJzsKJGxhbmdbJ2Vycm9yX2ludmFsaWR1c2VybmFtZSddID0gJ0ludmFsaWQgVXNlcm5hbWUnOwokbGFuZ1snZXJyb3JfaW52YWxpZHBhc3N3b3JkJ10gPSAnSW52YWxpZCBQYXNzd29yZCc7CiRsYW5nWydlZGl0dXNlciddID0gJ0VkaXQgVXNlcic7CiRsYW5nWyd2YWxpZCddID0gJ1ZhbGlkJzsKJGxhbmdbJ3VzZXJuYW1lJ10gPSAnVXNlcm5hbWUnOwokbGFuZ1snc3RhdHVzJ10gPSAnU3RhdHVzJzsKJGxhbmdbJ2Vycm9yX21lbWJlcmdyb3VwcyddID0gJ1RoaXMgdXNlciBpcyBub3QgYSBtZW1iZXIgb2YgYW55IGdyb3Vwcyc7CiRsYW5nWydlcnJvcl9wcm9wZXJ0aWVzJ10gPSAnTm8gUHJvcGVydGllcyc7CiRsYW5nWyd2YWx1ZSddID0gJ1ZhbHVlJzsKJGxhbmdbJ2dyb3VwcyddID0gJ0dyb3Vwcyc7CiRsYW5nWydwcm9wZXJ0aWVzJ10gPSAnUHJvcGVydGllcyc7CiRsYW5nWydwcm9wbmFtZSddID0gJ1Byb3BlcnR5IE5hbWUnOwokbGFuZ1sncHJvcHZhbHVlJ10gPSAnUHJvcGVydHkgVmFsdWUnOwokbGFuZ1snYWRkJ10gPSAnQWRkJzsKJGxhbmdbJ2VkaXQnXSA9ICdFZGl0JzsKJGxhbmdbJ2V4cGlyZXMnXSA9ICdFeHBpcmVzJzsKJGxhbmdbJ3NwZWNpZnlfZGF0ZSddID0gJ1NwZWNpZnkgRGF0ZSc7CiRsYW5nWycxMmhycyddID0gJzEyIEhvdXJzJzsKJGxhbmdbJzI0aHJzJ10gPSAnMjQgSG91cnMnOwokbGFuZ1snNDhocnMnXSA9ICc0OCBIb3Vycyc7CiRsYW5nWycxd2VlayddID0gJzEgV2Vlayc7CiRsYW5nWycyd2Vla3MnXSA9ICcyIFdlZWtzJzsKJGxhbmdbJzFtb250aCddID0gJzEgTW9udGgnOwokbGFuZ1snM21vbnRocyddID0gJzMgTW9udGhzJzsKJGxhbmdbJzZtb250aHMnXSA9ICc2IE1vbnRocyc7CiRsYW5nWycxeWVhciddID0gJzEgWWVhcic7CiRsYW5nWyduZXZlciddID0gJ05ldmVyJzsKJGxhbmdbJ3Bvc3RpbnN0YWxsbWVzc2FnZSddID0gJ01vZHVsZSBpbnN0YWxsZWQgc3VjZXNzZnVsbHkuPGJyLz5CZSBzdXJlIHRvIHNldCB0aGUgIk1vZGlmeSBGcm9udEVuZFVzZXIgUHJvcGVydGllcyBwZXJtaXNzaW9uLiInOwokbGFuZ1snZW1haWwnXSA9ICdFbWFpbCBBZGRyZXNzJzsKJGxhbmdbJ3Bhc3N3b3JkJ10gPSAnUGFzc3dvcmQnOwokbGFuZ1sncmVwZWF0cGFzc3dvcmQnXSA9ICdBZ2Fpbic7CiRsYW5nWydlcnJvcl9ncm91cG5hbWVfZXhpc3RzJ10gPSAnR3JvdXAgYnkgdGhhdCBuYW1lIGFscmVhZHkgZXhpc3RzJzsKJGxhbmdbJ2VkaXRncm91cCddID0gJ0VkaXQgR3JvdXAnOwokbGFuZ1snc3VibWl0J10gPSAnU3VibWl0JzsKJGxhbmdbJ2NhbmNlbCddID0gJ0NhbmNlbCc7CiRsYW5nWydkZWxldGUnXSA9ICdEZWxldGUnOwokbGFuZ1snY29uZmlybV9lZGl0Z3JvdXAnXSA9ICdBcmUgeW91IHN1cmUgdGhpcyBpcyB0aGUgcHJvcGVyIHNldHRpbmdzIGZvciB0aGlzIGdyb3VwP1xuVHVybmluZyBhIHByb3BlcnR5IG9mZiB3aWxsIG5vdCBkZWxldGUgYW55IGVudHJpZXMgaW4gdGhlIHByb3BlcnRpZXMgdGFibGUgZm9yIHRoaXMgZ3JvdXAvdXNlci4gIFRoZXkgd2lsbCBtZXJlbHkgYmUgdW5hdmFpbGFibGUuJzsKJGxhbmdbJ2FyZXlvdXN1cmVfZGVsZXRlZ3JvdXAnXSA9ICdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoaXMgZ3JvdXA/JzsKJGxhbmdbJ2NvbmZpcm1fZGVsZXRlX3Byb3AnXSA9ICdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gY29tcGxldGVseSBkZWxldGUgdGhpcyBwcm9wZXJ0eT9cbkRvaW5nIHNvIHdpbGwgYWxzbyBlcmFzZSBhbnkgdXNlciBlbnRyaWVzIGZvciB0aGlzIHByb3BlcnR5Lic7CiRsYW5nWydlcnJvcl9pbnN1ZmZpY2llbnRwYXJhbXMnXSA9ICdJbnN1ZmZpY2llbnQgUGFyYW1ldGVycyc7CiRsYW5nWydpZCddID0gJ0lkJzsKJGxhbmdbJ25hbWUnXSA9ICdOYW1lJzsKJGxhbmdbJ2Vycm9yX2NhbnRhZGRnb3J1cCddID0gJ1Byb2JsZW0gYWRkaW5nIGdyb3VwJzsKJGxhbmdbJ2Vycm9yX2ludmFsaWRwYXJhbXMnXSA9ICdJbnZhbGlkIFBhcmFtZXRlcnMnOwokbGFuZ1snYXBwbHlmaWx0ZXInXSA9ICdBcHBseSc7CiRsYW5nWydmaWx0ZXInXSA9ICdGaWx0ZXInOwokbGFuZ1sndXNlcmZpbHRlciddID0gJ1VzZXJuYW1lIFJlZ3VsYXIgRXhwcmVzc2lvbic7CiRsYW5nWydkZXNjcmlwdGlvbiddID0gJ0Rlc2NyaXB0aW9uJzsKJGxhbmdbJ25hbWUnXSA9ICdOYW1lJzsKJGxhbmdbJ2dyb3VwbmFtZSddID0gJ0dyb3VwIE5hbWUnOwokbGFuZ1snYWNjZXNzZGVuaWVkJ10gPSAnQWNjZXNzIERlbmllZCc7CiRsYW5nWydlcnJvciddID0gJ0Vycm9yJzsKJGxhbmdbJ2FkZGdyb3VwJ10gPSAnQWRkIEdyb3VwJzsKJGxhbmdbJ2FkZHVzZXInXSA9ICdBZGQgVXNlcic7CiRsYW5nWydncm91cHNmb3VuZCddID0gJ0dyb3VwcyBGb3VuZCc7CiRsYW5nWyd1c2Vyc2ZvdW5kJ10gPSAnVXNlcnMgZm91bmQgdGhhdCBtYXRjaCB0aGUgY3JpdGVyaWEnOwokbGFuZ1snZ3JvdXAnXSA9ICdHcm91cCc7CiRsYW5nWydzZWxlY3Rncm91cCddID0gJ1NlbGVjdCBHcm91cCc7CiRsYW5nWydyZWdpc3RyYXRpb25fdGVtcGxhdGUnXSA9ICdSZWdpc3RyYXRpb24gVGVtcGxhdGUnOwokbGFuZ1snbG9nb3V0X3RlbXBsYXRlJ10gPSAnTG9nb3V0IFRlbXBsYXRlJzsKJGxhbmdbJ2xvZ2luX3RlbXBsYXRlJ10gPSAnTG9naW4gVGVtcGxhdGUnOwokbGFuZ1sncHJlZmVyZW5jZXMnXSA9ICdQcmVmZXJlbmNlcyc7CiRsYW5nWydncm91cHMnXSA9ICdHcm91cHMnOwokbGFuZ1sndXNlcnMnXSA9ICJVc2VycyI7CiRsYW5nWydmcmllbmRseW5hbWUnXSA9ICdGcm9udGVuZCBVc2VyIE1hbmFnbWVudCc7CiRsYW5nWydtb2RkZXNjcmlwdGlvbiddID0gJ01hbmFnZSBGcm9udGVuZCBVc2Vycyc7CiRsYW5nWydkZWZhdWx0ZnJvbnRwYWdlJ10gPSAiRGVmYXVsdCBmcm9udCBwYWdlIjsKJGxhbmdbJ2xhc3RhY2Nlc3NlZHBhZ2UnXSA9ICdMYXN0IGFjY2Vzc2VkIHBhZ2UnOwokbGFuZ1snb3RoZXJwYWdlJ10gPSAnT3RoZXIgcGFnZTogJzsKJGxhbmdbJ2NoYW5nZWxvZyddID0gPDw8RU9GCjx1bD4KPGxpPjAuMC4xIC0gT2N0b2JlciwgMjAwNSAtIEluaXRpYWwgTlJQVCAoTm90IFJlYWR5IGZvciBQcmltZSBUaW1lKSByZWxlYXNlPC9saT4KPGxpPjAuMS4wIC0gT2N0b2JlciwgMjAwNSAtIEluaXRpYWwgcmVsZWFzZTwvbGk+CjxsaT4wLjEuMSAtIE9jdG9iZXIsIDIwMDUgLSBGaXhlZCBpc3N1ZXMgd2l0aCBwcm9wZXJ0aWVzPC9saT4KPGxpPjAuMS4yIC0gT2N0b2JlciwgMjAwNSAtIEFkZGVkIGZvcmdvdHRlbiBwYXNzd29yZCBmdW5jdGlvbmFsaXR5PC9saT4KPGxpPjxwPjAuMS4zIC0gTm92ZW1iZXIsIDIwMDU8L3A+CiAgICA8cD5BZGRlZCB0aGUgYWJpbGl0eSB0byBzcGVjaWZ5IGEgcmVkaXJlY3QgcGFnZSBvbiBsb2dpbiwgbG9nb3V0LCBmb3Jnb3QgcGFzc3dvcmQsIGFuZCBjaGFuZ2Ugc2V0dGluZ3MsIGFuZCBhZGRlZCB0aGUgcmV0dXJudG8gYW5kIGZvcm0gcGFyYW1ldGVycyB0byB0aGUgdXNlciBzaWRlIG9mIHRoaW5ncywgYWxzbyBkaWQgYSBjb3VwbGUgbGYgbGl0dGxlIGNsZWFudXBzLiAgVGhpcyB2ZXJzaW9uIHJlcXVpcmVzIHYwLjExIGFuZCBhYm92ZSBmb3IgY2VydGFpbi48L3A+PC9saT4KPGxpPjAuMS40IC0gTm92ZW1iZXIsIDIwMDUgLSBWZXJ5IG1pbm9yIGNoYW5nZSB3aXRoIHJlc3BlY3QgdG8gYSBmb3Jnb3R0ZW4gYW5kIG5vIGxvbmdlciBuZWVkZWQgZnVuY3Rpb24gY2FsbDwvbGk+CjxsaT48cD4wLjEuNSAtIE5vdmVtYmVyLCAyMDA1PC9wPgogICAgPHA+QW5vdGhlciB2ZXJ5IG1pbm9yIGNoYW5nZSwgYWRkZWQgc29tZSB0ZXh0IHRvIHRoZSBQb3N0SW5zdGFsbCBtZXNzYWdlLjwvcD48L2xpPgo8bGk+PHA+MC4xLjYgLSBKYW51YXJ5LCAyMDA2PHA+CiAgICA8cD5DaGFuZ2VzIHRvIHRoZSBwZXJtaXNzaW9uIG1vZGVsLCBhbmQgbWlub3IgYnVnIGZpeGVzIHRvIHRoZSBwcmVmZXJlbmNlcy4gIEFsc28gc29tZSBwaHA1IGZpeGVzIGJ1dCBJIGFtIHN1cmUgdGhhdCB0aGVyZSBhcmUgbW9yZSBvdXQgdGhlcmUuPC9wPjwvbGk+CjxsaT48cD4wLjEuNyAtIEphbnVhcnksIDIwMDY8cD4KICAgIDxwPk1hbnkgdGhhbmtzIHRvIDxiPmthdG9uPC9iPiBmb3IgYWRkaW5nIHRoZSB0ZXh0YXJlYSBhbmQgZHJvcGRvd24gcHJvcGVydHkgdHlwZXMuPC9wPgogICAgPHA+Rml4ZXMgdG8gdGhlIHByb3BlcnR5IGFkZGluZyB0byBmaXggcHJvYmxlbXMgd2l0aCBzcGFjZXMgaW4gcHJvcGVydHkgbmFtZXMgKHdlIG5vIGxvbmdlciBsZXQgdGhhdCBoYXBwZW4pLjwvcD4KPC9saT4KPGxpPjxwPjEuMC4wIC0gRmVicnVhcnksIDIwMDY8cD4KICAgIDxwPkFkZGVkIGZpbHRlcmluZyBhbmQgcm93IGxpbWl0aW5nIHRvIHRoZSBhZG1pbiBwYW5lbC4gVGhpcyB3aWxsIGhhdmUgYmlnIGJlbmVmaXRzIHRvIHRob3NlIHRoYXQgYXJlIHVzaW5nIHRoaXMgbW9kdWxlIGZvciBoaWdoIHRyYWZpYywgYW5kIGhpZ2ggdXNlciBzaXRlcy48L3A+CiAgICA8cD5BZGRlZCBzb3J0aW5nIHRvIHRoZSBhZG1pbiBwYW5lbDwvcD4KICAgIDxwPkFkZGVkIG1heCBsZW5ndGggYWJpbGl0eSB0byB0ZXh0IGFuZCBlbWFpbCBmaWVsZHM8L3A+CiAgICA8cD5GaXhlZCBhIHNtYWxsIHByb2JsZW0gd2l0aCB0aGUgZGVmYXVsdCBncm91cCBub3QgYmVpbmcgY2hlY2tlZCB3aGVuIGFkZGluZyBhIHVzZXI8L3A+CiAgICA8cD5TYXZlIGZpbHRlciBzZXR0aW5ncyBpbiBwcmVmZXJlbmNlcywgYW5kIHRoZSBhY3RpdmUgdGFiIHRvby48L3A+CiAgICA8cD5EZWxldGUgdXNlciBwcm9wZXJ0aWVzIHdoZW4gYSBwcm9wZXJ0eSBpcyBkZWxldGVkIDxlbT5Ob3RlPC9lbT4sIG5vdCB3aGVuIGl0IGlzIGRpc2FibGVkIGluIHRoZSBlZGl0IGdyb3VwIGRpYWxvZzwvcD4KICAgIDxwPkFkZCBjb25maXJtYXRpb24gbWVzc2FnZSBpbiBlZGl0IGdyb3Vwcy48L3A+CiAgICA8cD5BZGRlZCBhIGNvdXBsZSBtb3JlIGNvbmZpcm1hdGlvbiBtZXNzYWdlcy48L3A+CiAgICA8cD5BZGRlZCBDU1YgRXhwb3J0IG9wdGlvbjwvcD4KICAgIDxwPlRvZG8gLSBBZGQgcHJlZmVyZW5jZXMgZm9yIHVzZXJuYW1lIGFuZCBwYXNzd29yZCBmaWVsZGxlbmd0aDwvcD4KPC9saT4KPC91bD4KRU9GOwokbGFuZ1snaGVscCddID0gPDw8RU9GCjxoMz5XaGF0IERvZXMgVGhpcyBEbz88L2gzPgo8cD5UaGlzIG1vZHVsZSBhbGxvd3MgbWFuYWdlbWVudCBhbmQgYWRtaW5pc3RyYXRpb24gb2YgZnJvbnQgZW5kIHVzZXJzIDxpPih1c2VycyB3aG8gaGF2ZSBubyBhZG1pbiBhY2Nlc3NzKTwvaT4uICBJdCBhbGxvd3MgY3JlYXRpb24gb2YgdXNlciBncm91cHMsIGFuZCB1c2VyIGFjY291bnRzIGFuZCBhbGxvd3MgdXNlcnMgdG8gbG9naW4gYW5kIGxvZ291dC4gIGl0IGNhbiBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIEN1c3RvbUNvbnRlbnQgbW9kdWxlIHRvIGRpc3BsYXkgZGlmZmVyZW50IGNvbnRlbnQgdG8gZGlmZmVyZW50IHVzZXJzIG9uY2UgdGhleSBoYXZlIGxvZ2dlZCBpbjwvcD4KPGgzPkZlYXR1cmVzPC9oMz4KPHVsPgo8bGk+PHA+VXNlciBhY2NvdW50IGV4cGlyYXRpb24uICBZb3UgY2FuIGNyZWF0ZSB0ZW1wb3JhcnkgdXNlcnM8L3A+PC9saT4KPGxpPjxwPkdyb3VwIFByb3BlcnRpZXMuICBZb3UgY2FuIGFzayBmb3IgZGlmZmVyZW50IGluZm9ybWF0aW9uIGZyb20gbWVtYmVycyBvZiBkaWZmZXJlbnQgZ3JvdXBzPC9wPjwvbGk+CjxsaT48cD5DYXBhYmxlIG9mIGhhbmRsaW5nIGh1bmRyZWRzIG9mIHVzZXJzPC9wPjwvbGk+CjxsaT48cD5IYXMgYW4gZXh0ZW5zaXZlIEFQSSBmb3IgYWRkaW5nIGZ1bmN0aW9uYWxpdHk8L3A+PC9saT4KPC91bD4KPGgzPkhvdyBkbyBJIHVzZSBpdDwvaDM+Cjx1bD4KPGxpPjxwPkFmdGVyIGluc3RhbGxhdGlvbiB5b3UgY2FuIGFjY2VzcyBhZG1pbiBwYW5lbCB0byB0aGUgRnJvbnRFbmRVc2VycyBtb2R1bGUgdW5kZXIgdGhlICZxdW90O1VzZXJzICYgZ0dyb3VwcyZxdW90OyBtZW51LjwvcD48L2xpPgo8bGk+CjxwPlNlY29uZGx5LCB5b3Ugc2hvdWxkIGRlZmluZSBwcm9wZXJ0aWVzLiAgUHJvcGVydGllcyBhcmUgZXNzZW50aWFsbHkgZmllbGQgZGVmaW5pdGlvbnMsIGhlcmUgeW91IHNwZWNpZnkgdGhlIHR5cGUgb2YgaW5mb3JtYXRpb24geW91IHdhbnQgdG8gZ2F0aGVyLCBhbmQgbGltaXRzLiBpLmU6ICBOYW1lLCBBZ2UsIENpdHksIFN0YXRlLCBDb3VudHJ5LCBFbWFpbCBhZGRyZXNzLCBldGMuPC9wPgo8cD48Yj5Ob3RlOjwvYj4gWW91IGRvIG5vdCBuZWVkIHRvIGRlZmluZSBwcm9wZXJ0aWVzIGZvciB1c2VybmFtZSBhbmQgcGFzc3dvcmQsIHRoZXNlIHdpbGwgYmUgcHJvdmlkZWQgZm9yIHlvdTwvYj4KPC9saT4KPGxpPjxwPk5leHQgeW91IHNob3VsZCBjcmVhdGUgb25lIG9yIG1vcmUgdXNlciBncm91cHMuICBXaGVuIHlvdSBjcmVhdGUgYSBncm91cCwgeW91IGFyZSBhc2tlZCBmb3IgYSBncm91cCBuYW1lLCBhIGRlc2NyaXB0aW9uIGFuZCB0byBhc3NvY2lhdGUgcHJvcGVydGllcyB3aXRoIHRoYXQgZ3JvdXAsIHNwZWNpZnkgdGhlIHByb3BlcnRpZXMgc29ydCBvcmRlciwgYW5kIHdldGhlciBpdCBpcyBhbiBvcHRpb25hbCwgcmVxdWlyZWQsIG9yIGhpZGRlbiBmaWVsZCA8aT4ob2ZmIGlzIGFsc28gdmFsaWQpPC9pPjwvcD48L2xpPgo8bGk+PHA+PGI+Tm90ZTo8L2I+IEJlZm9yZSBwcm9jZWVkaW5nLCB5b3Ugc2hvdWxkIGVuc3VyZSB0aGF0IHRoZSBwcmVmZXJlbmNlcyBhcmUgc2V0IGNvcnJlY3RseS48L3A+PC9saT4KPGxpPjxwPlRoaXJkbHkgeW91IHNob3VsZCBjcmVhdGUgc29tZSB1c2Vycy4gIEFkZGluZyB1c2VycyBpcyBhIHR3byBzdGVwIHByb2Nlc3MuICBXaGVuIGNyZWF0aW5nIGEgdXNlciB5b3UgYXJlIGFza2VkIGZvciB0aGUgdXNlcm5hbWUgYW5kIHBhc3N3b3JkLCBhbmQgYW4gZXhwaXJ5IGRhdGUgZm9yIHRoYXQgdXNlci4gIFlvdSB0aGVuIG11c3Qgc2VsZWN0IHRoZSBncm91cHMgdGhhdCB0aGF0IHVzZXIgaXMgYSBtZW1iZXIgb2YsIGFuZCBjbGljayBcJ05leHRcJzwvcD4KPHA+PGVtPk5vdGU6IDwvZW0+VGhpcyBpcyBhIGxhYm91ciBpbnRlbnNpdmUgYW5kIGJvcmluZyBwcm9jZXNzLCBpdCBpcyBlYXNpZXIgdG8gbGV0IHVzZXJzIHJlZ2lzdGVyIHRoZW1zZWx2ZXMsIGFuZCB0aGVuIHlvdSBjYW4gZWRpdCB0aGVpciBncm91cCBpbmZvcm1hdGlvbi4gIGJ1dCBmb3IgdGVzdGluZyBwdXJwb3NlcywgcGxlYXNlIGNyZWF0ZSBhdCBsZXN0IG9uZSB1c2VyPC9wPjwvbGk+CjxsaT48cD5MYXN0bHksIGFmdGVyIHRoZSBzeXN0ZW0gaGFzIGRldGVybWluZWQgYWxsIG9mIHRoZSBpbmZvcm1hdGlvbiBmaWVsZHMgdG8gYmUgcHJlc2VudGVkIGZvciB0aGF0IHVzZXIsIHlvdSBhcmUgcHJlc2VudGVkIHdpdGggYSBmb3JtIGFza2luZyBmb3IgYWxsIG9mIHRoZSByZXF1aXJlZCB1c2VyIGluZm9ybWF0aW9uLiAgQ29tcGxldGUgdGhpcyBmb3JtIHRvIGNvbXBsZXRlIHRoZSB1c2VyIGFkZGl0aW9uPC9wPjwvbGk+CjxsaT48cD5Zb3UgYXJlIG5vdyByZWFkeSB0byBhZGQgdGhlIGZyb250IGVuZCBmdW5jdGlvbmFsaXR5IHRvIHlvdXIgc2l0ZS4gIFRoaXMgaXMgYXMgc2ltcGxlIGFzIGFkZGluZyB0aGUge2Ntc19tb2R1bGUgbW9kdWxlPUZyb250RW5kVXNlcnN9IHRhZyB0byB5b3VyIHBhZ2Ugb3IgdGVtcGxhdGU8L3A+PC9saT4KPC91bD4KPGgzPlN1cHBvcnQ8L2gzPgo8cD5UaGlzIG1vZHVsZSBkb2VzIG5vdCBpbmNsdWRlIGNvbW1lcmNpYWwgc3VwcG9ydC4gSG93ZXZlciwgdGhlcmUgYXJlIGEgbnVtYmVyIG9mIHJlc291cmNlcyBhdmFpbGFibGUgdG8gaGVscCB5b3Ugd2l0aCBpdDo8L3A+Cjx1bD4KPGxpPkZvciB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhpcyBtb2R1bGUsIEZBUXMsIG9yIHRvIGZpbGUgYSBCdWcgUmVwb3J0IG9yIGJ1eSBjb21tZXJjaWFsIHN1cHBvcnQsIHBsZWFzZSB2aXNpdCBjYWxndXlcJ3MKbW9kdWxlIGhvbWVwYWdlIGF0IDxhIGhyZWY9Imh0dHA6Ly90ZWNoY29tLmR5bmRucy5vcmciPnRlY2hjb20uZHluZG5zLm9yZzwvYT4uPC9saT4KPGxpPkFkZGl0aW9uYWwgZGlzY3Vzc2lvbiBvZiB0aGlzIG1vZHVsZSBtYXkgYWxzbyBiZSBmb3VuZCBpbiB0aGUgPGEgaHJlZj0iaHR0cDovL2ZvcnVtLmNtc21hZGVzaW1wbGUub3JnIj5DTVMgTWFkZSBTaW1wbGUgRm9ydW1zPC9hPi48L2xpPgo8bGk+VGhlIGF1dGhvciwgY2FsZ3V5MTAwMCwgY2FuIG9mdGVuIGJlIGZvdW5kIGluIHRoZSA8YSBocmVmPSJpcmM6Ly9pcmMuZnJlZW5vZGUubmV0LyNjbXMiPkNNUyBJUkMgQ2hhbm5lbDwvYT4uPC9saT4KPGxpPkxhc3RseSwgeW91IG1heSBoYXZlIHNvbWUgc3VjY2VzcyBlbWFpbGluZyB0aGUgYXV0aG9yIGRpcmVjdGx5LjwvbGk+ICAKPC91bD4KPGgzPlBhcmFtZXRlcnM8L2gzPgo8dWw+CjxsaT48ZW0+KG9wdGlvbmFsKTwvZW0+IGZvcm09Im5hbWUiPC9saT4KPHA+Rm9ybXM6Cjx1bD4KIDxsaT48ZW0+bG9naW48L2VtPiAtIERpc3BsYXkgdGhlIGxvZ2luIGZvcm08L2xpPgogPGxpPjxlbT5sb2dvdXQ8L2VtPiAtIERpc3BsYXkgdGhlIGxvZ291dCBmb3JtPC9saT4KIDxsaT48ZW0+Y2hhbmdlc2V0dGluZ3M8L2VtPiAtIERpc3BsYXkgdGhlIGNoYW5nZSBzZXR0aW5ncyBmb3JtPC9saT4KIDxsaT48ZW0+Zm9yZ290cHc8L2VtPiAtIERpc3BsYXkgdGhlIGZvcmdvdCBwYXNzd29yZCBmb3JtPC9saT4KPC91bD4KPC9wPgo8bGk+PGVtPihvcHRpb25hbCk8L2VtPiByZXR1cm50bz0icGFnZSI8L2xpPgo8cD5Vc2VkIHdpdGggdGhlIGxvZ2luLCBsb2dvdXQsIGFuZCBjaGFuZ2VzZXR0aW5ncyBmb3JtcywgdGhpcyBwYXJhbWV0ZXIgY29udGFpbnMgdGhlIHBhZ2UgaWQgb3IgYWxpYXMgb2YgYSBwYWdlIHRvIHJlZGlyZWN0IHRvLCB3aGVuIHRoZSBmb3JtIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQ8L3A+CjwvdWw+CjxwPkFzIHBlciB0aGUgR1BMLCB0aGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGFzLWlzLiBQbGVhc2UgcmVhZCB0aGUgdGV4dApvZiB0aGUgbGljZW5zZSBmb3IgdGhlIGZ1bGwgZGlzY2xhaW1lci48L3A+CjxoMz5SZXF1aXJlbWVudHM8L2gzPgo8cD5JbiBvcmRlciB0byBpbXBsZW1lbnQgdGhlIGZvcmdvdHRlbiBwYXNzd29yZCBmdW5jdGlvbmFsaXR5LCB0aGlzIG1vZHVsZSByZXF1aXJlcyB0aGUgQ01TTWFpbGVyIG1vZHVsZSB0byBiZSBwcmV2aW91c2x5IGluc3RhbGxlZDwvcD4KPGgzPkNvcHlyaWdodCBhbmQgTGljZW5zZTwvaDM+CjxwPkNvcHlyaWdodCAmY29weTsgMjAwNSwgUm9iZXJ0IENhbXBiZWwgPGEgaHJlZj0ibWFpbHRvOmNhbGd1eTEwMDBAaG90bWFpbC5jb20iPiZsdDtjYWxndXkxMDAwQGhvdG1haWwuY29tJmd0OzwvYT4uIEFsbCBSaWdodHMgQXJlIFJlc2VydmVkLjwvcD4KPHA+VGhpcyBtb2R1bGUgaGFzIGJlZW4gcmVsZWFzZWQgdW5kZXIgdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTCI+R05VIFB1YmxpYyBMaWNlbnNlPC9hPi4gWW91IG11c3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlIGJlZm9yZSB1c2luZyB0aGUgbW9kdWxlLjwvcD4KRU9GOwo/Pgo=]]></data>
  </file>
  <file>
    <filename>/lang/ext/</filename>
    <isdir>1</isdir>
  </file>
  <file>
    <filename>/lang/ext/fr_FR.php</filename>
    <isdir>0</isdir>
    <data><![CDATA[PD9waHAKJGxhbmdbJ3Byb21wdF9mb3Jnb3Rwd19wYWdlJ10gPSAnUGFnZUlEL0FsaWFzIGR1IGZvcm11bGFpcmUgbW90IGRlIHBhc3NlIG91Ymxpw6knOwokbGFuZ1sncHJvbXB0X2NoYW5nZXNldHRpbmdzX3BhZ2UnXSA9ICdQYWdlSUQvQWxpYXMgZHUgZm9ybXVsYWlyZSBkZSBjaGFuZ2VtZW50IGRlIHBhcmFtw6h0cmVzJzsKJGxhbmdbJ3Byb21wdF9sb2dpbl9wYWdlJ10gPSAnUGFnZUlEL0FsaWFzIG/DuSByZWRpcmlnZXIgbFwndXRpbGlzYXRldXIgYXByw6hzIHF1XCdpbCBzZSBzb2l0IGNvbm5lY3TDqSc7CiRsYW5nWydwcm9tcHRfbG9nb3V0X3BhZ2UnXSA9ICdQYWdlSUQvQWxpYXMgb8O5IHJlZGlyaWdlciBsXCd1dGlsaXNhdGV1ciBhcHLDqHMgcXVcJ2lsIHNlIHNvaXQgZMOpY29ubmVjdMOpJzsKJGxhbmdbJ3NvcnRvcmRlciddID0gJ09yZGUgZGUgdHJpJzsKJGxhbmdbJ3Byb21wdF9udW1yZXNldHJlY29yZCddID0gJ1VuIG5vbWJyZSBkXCd1dGlsaXNhdGV1cnMgZXN0IGVuIGNvdXJzIGRlIHLDqWluaXRpYWxpc2F0aW9uIGRlIG1vdHMgZGUgcGFzc2UuIENlIG5vbWJyZSBlc3QgYWN0dWVsbGVtZW50IGRlOic7CiRsYW5nWydyZW1vdmUxd2VlayddID0gJ1N1cHByaW1lciB0b3V0ZXMgbGVzIGVudHLDqWVzIHZpZWlsbGVzIGRlIHBsdXMgZFwndW5lIHNlbWFpbmUnOwokbGFuZ1sncmVtb3ZlMW1vbnRoJ10gPSAnU3VwcHJpbWVyIHRvdXRlcyBsZXMgZW50csOpZXMgdmllaWxsZXMgZGUgcGx1cyBkXCd1biBtb2lzJzsKJGxhbmdbJ3JlbW92ZWFsbCddID0gJ1N1cHByaW1lciB0b3V0ZXMgbGVzIGVudHLDqWVzJzsKJGxhbmdbJ2FyZXlvdXN1cmUnXSA9ICfDinRlcy12b3VzIHPDu3I/JzsKJGxhbmdbJ2Vycm9yX2ludmFsaWRjb2RlJ10gPSAnVW4gY29kZSBpbnZhbGlkZSBhIMOpdMOpIGVudHLDqSwgdmV1aWxsZXogcsOpZXNzYXllcic7CiRsYW5nWydlcnJvcl90ZW1wY29kZW5vdGZvdW5kJ10gPSAnTGUgY29kZSB0ZW1wb3JhaXJlIHBvdXIgdm90cmUgaWQgdXRpbGlzYXR1ZXIgblwnYSBwYXMgcHUgw6p0cmUgdHJvdXbDqSBkYW5zIGxhIGJhc2UgZGUgZG9ubsOpZXMnOwokbGFuZ1snZm9yZ290cGFzc3dvcmRfdmVyaWZ5dGVtcGxhdGUnXSA9ICdHYWJhcml0IHV0aWxpc8OpIHBvdXIgYWZmaWNoZXIgbGUgZm9ybXVsYWlyZSBkZSB2w6lyaWZpY2F0aW9uJzsKJGxhbmdbJ2ZvcmdvdHBhc3N3b3JkX2VtYWlsdGVtcGxhdGUnXSA9ICdHYWJhcml0IHV0aWxpc8OpIHBvdXIgbFwnZW1haWwgZW52b3nDqSBsb3JzIGRlIGxcJ291YmxpIGR1IG1vdCBkZSBwYXNzZSc7CiRsYW5nWydlcnJvcl9yZXNldGFscmVhZHlzZW50J10gPSAnVW5lIGRlbWFuZGUgZGUgcsOpaW5pdGlhbGlzYXRpb24gZGUgbW90IGRlIHBhc3NlIGEgw6l0w6kgc291bWlzZSBwb3VyIGNlIGNvbXB0ZSwgc29pdCBwYXIgdm91cy1tw6ptZSwgc29pdCBwYXIgcXVlbHF1XCd1biBkXCdhdXRyZS4gVsOpcmlmaWV6IHZvdHJlIGVtYWlsLCB2b3VzIHkgdHJvdXZlcmV6IGxlcyBpbnN0cnVjdGlvbnMgcG91ciBsYSByw6lpbml0aWFsaXNhdGlvbiBkZSB2b3RyZSBtb3QgZGUgcGFzc2UuJzsKJGxhbmdbJ2Vycm9yX2RiZXJyb3InXSA9ICdFcnJldXIgZGUgYmFzZSBkZSBkb25uw6llcyc7CiRsYW5nWydtZXNzYWdlX2ZvcmdvdHB3ZW1haWwnXSA9ICdWb3VzIHJlY2V2ZXogY2UgbWVzc2FnZSBjYXIgcXVlbHF1XCd1biBub3VzIGEgZGl0IHF1ZSB2b3VzIGF2aWV6IHBlcmR1IHZvdHJlIG1vdCBkZSBwYXNzZS4gU2kgY1wnZXN0IGxlIGNhcywgbGlzZXogbGVzIGluc3RydWN0aW9ucyBjaS1kZXNzb3VzLiBTaSB2b3VzIG5lIHNhdmV6IHBhcyBkZSBxdW9pIGlsIHNcJ2FnaXQsIHZvdXMgcG91dmV6IHNpbXBsZW1lbnQgZWZmYWNlciBjZSBtZXNzYWdlLiBOb3VzIHZvdXMgcmVtZXJjaW9ucy4nOwokbGFuZ1sncHJvbXB0X2NvZGUnXSA9ICdDb2RlJzsKJGxhbmdbJ21lc3NhZ2VfY29kZSddID0gJ0xlIGNvZGUgc3VpdmFudCBhIMOpdMOpIGfDqW7DqXLDqSBhdSBoYXNhcmQgcG91ciBsYSB2w6lyaWZpY2F0aW9uIGR1IGNvbXBlIHV0aWxpc2F0ZXVyLiBMb3JzcXVlIHZvdXMgY2xpcXVlcmV6IHN1ciBsZSBsaWVuIGNpLWRlc3NvdXMsIHZvdXMgdHJvdXZlcmV6IHVuIGNoYW1wIGRhbnMgbGVxdWVsIGVudHJlciBjZSBjb2RlLiBOb3JtYWxlbWVudCwgY2UgY2hhbXAgZXN0IHJlbXBsaSBwb3VyIHZvdXMsIG1haXMgZGFucyBsZSBjYXMgY29udHJhaXJlLCBsZSBjb2RlIGVzdCZuYnNwOzonOwokbGFuZ1sncHJvbXB0X2xpbmsnXSA9ICdMZSBsaWVuIHN1aXZhbnQgdm91cyBhbcOobmUgYXUgc2l0ZSBvw7kgdm91cyBwb3V2ZXogZW50cmVyIGxlIGNvZGUgY2ktZGVzc3VzLCBldCByw6lpbml0aWFsaXNlciB2b3RyZSBtb3QgZGUgcGFzc2UmbmJzcDs6JzsKJGxhbmdbJ2xvc3RwYXNzd29yZF9lbWFpbHN1YmplY3QnXSA9ICdNb3QgZGUgcGFzc2Ugb3VibGnDqSc7CiRsYW5nWydlcnJvcl9ub21haWxlcm1vZHVsZSddID0gJ0xlIG1vZHVsZSBDTVNNYWlsZXIgblwnYSBwYXMgw6l0w6kgdHJvdXbDqSc7CiRsYW5nWydpbmZvX2ZvcmdvdHB3bWVzc2FnZXNlbnQnXSA9ICdVbiBlbWFpbCBhIMOpdMOpIGVudm95w6kgw6AgJXMgYXZlYyBsZXMgaW5zdHJ1Y3Rpb25zIHBvdXIgbGEgcsOpaW5pdGlhbGlzYXRpb24gZHUgbW90IGRlIHBhc3NlLiBNZXJjaSc7CiRsYW5nWydsb3N0cHdfbWVzc2FnZSddID0gJ1NpIHZvdXMgYXZleiBvdWJsacOpIHZvdHJlIG1vdCBkZSBwYXNzZSwgdmV1aWxsZXogZW50cmVyIHZvdHJlIGlkZW50aWZpYW50IGljaSwgZXQgc2kgbm91cyBsZSB0cm91dm9ucywgdm91cyByZWNldnJleiB1biBlbWFpbCBhdmVjIGxlcyBpbnN0cnVjdGlvbnMgcG91ciBsYSByw6lpbml0aWFsaXNhdGlvbiBkdSBtb3QgZGUgcGFzc2UuJzsKJGxhbmdbJ2ZvcmdvdHBhc3N3b3JkX3RlbXBsYXRlJ10gPSAnR2FiYXJpdHMgcG91ciBsXCdvdWJsaSBkdSBtb3QgZGUgcGFzc2UnOwokbGFuZ1snZXJyb3JfcHJvcG5vdGZvdW5kJ10gPSAnTGEgcHJvcHJpw6l0w6kgJXMgblwnYSBwYXMgw6l0w6kgdHJvdXbDqWUnOwokbGFuZ1sncHJvcHNmb3VuZCddID0gJ3Byb3ByacOpdMOpcyB0cm91dsOpZXMnOwokbGFuZ1snYWRkcHJvcCddID0gJ0Fqb3V0ZXIgdW5lIHByb3ByacOpdMOpJzsKJGxhbmdbJ2Vycm9yX3JlcXVpcmVkZmllbGQnXSA9ICdVbiBjaGFtcCByZXF1aXMgKCVzKSBlc3QgdmlkZSc7CiRsYW5nWydpbmZvX2VtcHR5cGFzc3dvcmRmaWVsZCddID0gJ1ZldWlsbGV6IGVudHJlciBpY2kgdW4gbm91dmVhdSBtb3QgZGUgcGFzc2UnOwokbGFuZ1snZXJyb3Jfbm90bG9nZ2VkaW4nXSA9ICdWb3VzIG5lIHNlbWJsZXogcGFzIMOqdHJlIGNvbm5lY3TDqSc7CiRsYW5nWyd1c2VyX3NldHRpbmdzJ10gPSAnUGFyYW3DqHRyZXMnOwokbGFuZ1sndXNlcl9yZWdpc3RyYXRpb24nXSA9ICdFbnJlZ2lzdHJlbWVudCc7CiRsYW5nWydlcnJvcl9hY2NvdW50ZXhwaXJlZCddID0gJ0NlIGNvbXB0ZSBhIGV4cGlyw6knOwokbGFuZ1snZXJyb3JfaW1wcm9wZXJlbWFpbGZvcm1hdCddID0gJ0Zvcm1hdCBkXCdhZHJlc3NlIGVtYWlsIGludmFsaWRlJzsKJGxhbmdbJ2Vycm9yX2ludmFsaWRleHBpcnlkYXRlJ10gPSAnRGF0ZSBkXCdleHBpcmF0aW9uIGludmFsaWRlJzsKJGxhbmdbJ2Vycm9yX3Byb2JsZW1zZXR0aW5ncHJvcGVydHknXSA9ICdJbCB5IGEgZXUgdW5lIGVycmV1ciBsb3JzIGRlIGxhIGTDqWZpbml0aW9uICVzIHBvdXIgbFwndXRpbGlzYXRldXIgJHMnOwokbGFuZ1snZXJyb3JfaW52YWxpZGdyb3VwaWQnXSA9ICdpZCBkZSBncm91cGUgJXMgaW52YWxpZGUnOwokbGFuZ1snaGlkZGVuZmllbGRtYXJrZXInXSA9ICdNYXJxdWV1ciBkZSBjaGFtcCBjYWNow6knOwokbGFuZ1snaGlkZGVuZmllbGRjb2xvciddID0gJ0NvdWxldXIgZGUgY2hhbXAgY2FjaMOpJzsKJGxhbmdbJ2hpZGRlbiddID0gJ0NhY2jDqSc7CiRsYW5nWydlcnJvcl9kdXBsaWNhdGVuYW1lJ10gPSAnVW5lIHByb3ByacOpdMOpIGR1IG3Dqm1lIG5vbSBlc3QgZMOpasOgIGTDqWZpbmllJzsKJGxhbmdbJ2Vycm9yX25vcHJvcGVydGllcyddID0gJ0F1Y3VuZSBwcm9wcmnDqXTDqSBkw6lmaW5pZSc7CiRsYW5nWydncm91cHNmb3VuZCddID0gJ0dyb3VwZXMgdHJvdXbDqXMnOwokbGFuZ1snZXJyb3Jfb25lZ3JvdXByZXF1aXJlZCddID0gJ0xcJ2FwcGFydGVuYW5jZSDDoCBhdSBtb2lucyB1biBncm91cGUgZXN0IHJlcXVpc2UnOwokbGFuZ1sncHJvbXB0X3JlcXVpcmVvbmVncm91cCddID0gJ1JlcXVpZXJ0IGxcJ2FwcGFydGVuYW5jZSDDoCBhdSBtb2lucyB1biBncm91cGUnOwokbGFuZ1snYmFjayddID0gJ1JldG91cic7CiRsYW5nWydlcnJvcl9taXNzaW5nX3JlcXVpcmVkX3BhcmFtJ10gPSAnJXMgZXN0IHVuIGNoYW1wIHJlcXVpcyc7CiRsYW5nWydyZXF1aXJlZGZpZWxkbWFya2VyJ10gPSAnTWFycXVlIGxlcyBjaGFtcHMgcmVxdWlzIGF2ZWMnOwokbGFuZ1sncmVxdWlyZWRmaWVsZGNvbG9yJ10gPSAnTWlzZSBlbiDDqXZpZGVuY2UgZGVzIGNoYW1wcyByZXF1aXMgZW4nOwokbGFuZ1snbmV4dCddID0gJ1Byb2NoYWluJzsKJGxhbmdbJ2Vycm9yX2dyb3VwZXhpc3RzJ10gPSAnVW4gZ3JvdXBlIGR1IG3Dqm1lIG5vbSBleGlzdGUgZMOpasOgJzsKJGxhbmdbJ3JlcXVpcmVkJ10gPSAnQ2hhbXAgcmVxdWlzJzsKJGxhbmdbJ29wdGlvbmFsJ10gPSAnT3B0aW9uZWwnOwokbGFuZ1snb2ZmJ10gPSAnT2ZmJzsKJGxhbmdbJ2xlbmd0aCddID0gJ0xvbmd1ZXVyJzsKJGxhbmdbJ3llcyddID0gJ091aSc7CiRsYW5nWydwcm9tcHQnXSA9ICdJbnZpdGUnOwokbGFuZ1sndHlwZSddID0gJ1R5cGUnOwokbGFuZ1sndGV4dCddID0gJ1RleHRlJzsKJGxhbmdbJ2NoZWNrYm94J10gPSAnQ2FzZSDDoCBjb2NoZXInOwokbGFuZ1snZW1haWwnXSA9ICdBZHJlc3NlIGVtYWlsJzsKJGxhbmdbJ3RleHRhcmVhJ10gPSAnVGV4dGFyZWEnOwokbGFuZ1snbXNnX2N1cnJlbnRseWxvZ2dlZGluYXMnXSA9ICdCaWVudmVudWUnOwokbGFuZ1snbG9nb3V0J10gPSAnRMOpY29ubmV4aW9uJzsKJGxhbmdbJ3Byb21wdF9jaGFuZ2VzZXR0aW5ncyddID0gJ0NoYW5nZW1lbnQgZGUgTWVzIFBhcmFtw6h0cmVzJzsKJGxhbmdbJ2Vycm9yX2xvZ2luZmFpbGVkJ10gPSAnTGEgY29ubmV4aW9uIGEgw6ljaG91w6kgLSBpZGVudGlmaWFudCBvdSBtb3QgZGUgcGFzc2UgaW52YWxpZGU/JzsKJGxhbmdbJ2xvZ2luJ10gPSAnU2lnbiBpbic7CiRsYW5nWydwcm9tcHRfdXNlcm5hbWUnXSA9ICdJZGVudGlmaWFudCc7CiRsYW5nWydwcm9tcHRfcGFzc3dvcmQnXSA9ICdNb3QgZGUgcGFzc2UnOwokbGFuZ1sncmVnaXN0ZXInXSA9ICdFbnJlZ2lzdHJlei12b3VzJzsKJGxhbmdbJ2ZvcmdvdHB3J10gPSAnQXZlei12b3VzIG91Ymxpw6kgdm90cmUgbW90IGRlIHBhc3NlPyc7CiRsYW5nWydkZWZhdWx0cyddID0gJ1BhciBkw6lmYXV0JzsKJGxhbmdbJ3RlbXBsYXRlJ10gPSAnR2FiYXJpdCc7CiRsYW5nWydlcnJvcl91c2Vybm90Zm91bmQnXSA9ICdJRCB1dGlsaXNhdGV1ciBub24gdHJvdXbDqSc7CiRsYW5nWydlcnJvcl91c2VybmFtZXRha2VuJ10gPSAnQ2V0IGlkZW50aWZpYW50ICglcykgZXhpc3RlIGTDqWrDoCc7CiRsYW5nWydwcm9tcHRfc210cHZhbGlkYXRlJ10gPSAnVXRpbGlzZXIgU01UUCBwb3VyIGxhIHZhbGlkYXRpb24gZGVzIGFkcmVzc2VzIGVtYWlsPyc7CiRsYW5nWydwcm9tcHRfbWlucHdsZW4nXSA9ICdMb25ndWV1ciBtaW5pbWFsZSBkdSBtb3QgZGUgcGFzc2UnOwokbGFuZ1sncHJvbXB0X21heHB3bGVuJ10gPSAnTG9uZ3VldXIgbWF4aW1hbGUgZHUgbW90IGRlIHBhc3NlJzsKJGxhbmdbJ3Byb21wdF9taW51bmxlbiddID0gJ0xvbmd1ZXVyIG1pbmltYWxlIGRlIGxcJ2lkZW50aWZpYW50JzsKJGxhbmdbJ3Byb21wdF9tYXh1bmxlbiddID0gJ0xvbmd1ZXVyIG1heGltYWxlIGRlIGxcJ2lkZW50aWZpYW50JzsKJGxhbmdbJ3Byb21wdF9zZXNzaW9udGltZW91dCddID0gJ0V4cGlyYXRpb24gZGUgc2Vzc2lvbiAobWludXRlcyknOwokbGFuZ1sncHJvbXB0X2FsbG93ZW1haWxyZWcnXSA9ICdBdXRvcmlzZSBsXCdlbnJlZ2lzdHJlbWVudCBwYXIgZW1haWwnOwokbGFuZ1sncHJvbXB0X2RmbHRncm91cCddID0gJ0dyb3VwZSBwYXIgZMOpZmF1dCBwb3VyIGxlcyBub3V2ZWF1eCB1dGlsaXNhdGV1cnMnOwokbGFuZ1snY2hhbmdlc2V0dGluZ3NfdGVtcGxhdGUnXSA9ICdDaGFuZ2VyIGxlIGdhYmFyaXQgZGVzIHBhcmFtw6h0cmVzJzsKJGxhbmdbJ2Vycm9yX3Bhc3N3b3JkbWlzbWF0Y2gnXSA9ICdMZXMgbW90cyBkZSBwYXNzZSBuZSBjb25jb3JkZW50IHBhcyc7CiRsYW5nWydlcnJvcl9pbnZhbGlkdXNlcm5hbWUnXSA9ICdJZGVudGlmaWFudCBub24gdmFsaWRlJzsKJGxhbmdbJ2Vycm9yX2ludmFsaWRwYXNzd29yZCddID0gJ01vdCBkZSBwYXNzZSBub24gdmFsaWRlJzsKJGxhbmdbJ2VkaXR1c2VyJ10gPSAnw4lkaXRlciBsXCd1dGlsaXNhdGV1cic7CiRsYW5nWyd2YWxpZCddID0gJ1ZhbGlkZSc7CiRsYW5nWyd1c2VybmFtZSddID0gJ0lkZW50aWZpYW50JzsKJGxhbmdbJ3N0YXR1cyddID0gJ1N0YXR1dCc7CiRsYW5nWydlcnJvcl9tZW1iZXJncm91cHMnXSA9ICdDZXQgdXRpbGlzYXRldXIgblwnZXN0IG1lbWJyZSBkXCdhdWN1biBncm91cGUnOwokbGFuZ1snZXJyb3JfcHJvcGVydGllcyddID0gJ0F1Y3VuZSBwcm9wcmnDqXTDqSc7CiRsYW5nWyd2YWx1ZSddID0gJ1ZhbGV1cic7CiRsYW5nWydncm91cHMnXSA9ICdHcm91cGVzJzsKJGxhbmdbJ3Byb3BlcnRpZXMnXSA9ICdQcm9wcmnDqXTDqXMnOwokbGFuZ1sncHJvcG5hbWUnXSA9ICdOb20gZGUgcHJvcHJpw6l0w6knOwokbGFuZ1sncHJvcHZhbHVlJ10gPSAnVmFsZXVyIGRlIGxhIHByb3ByacOpdMOpJzsKJGxhbmdbJ2FkZCddID0gJ0Fqb3V0ZXInOwokbGFuZ1snZWRpdCddID0gJ8OJZGl0ZXInOwokbGFuZ1snZXhwaXJlcyddID0gJ0V4cGlyZSc7CiRsYW5nWydzcGVjaWZ5X2RhdGUnXSA9ICdTcMOpY2lmaWV6IHVuZSBkYXRlJzsKJGxhbmdbJzEyaHJzJ10gPSAnMTIgaGV1cmVzJzsKJGxhbmdbJzI0aHJzJ10gPSAnMjQgaGV1cmVzJzsKJGxhbmdbJzQ4aHJzJ10gPSAnNDggaGV1cmVzJzsKJGxhbmdbJzF3ZWVrJ10gPSAnMSBzZW1haW5lJzsKJGxhbmdbJzJ3ZWVrcyddID0gJzIgc2VtYWluZXMnOwokbGFuZ1snMW1vbnRoJ10gPSAnMSBtb2lzJzsKJGxhbmdbJzNtb250aHMnXSA9ICczIG1vaXMnOwokbGFuZ1snNm1vbnRocyddID0gJzYgbW9pcyc7CiRsYW5nWycxeWVhciddID0gJzEgYW4nOwokbGFuZ1snbmV2ZXInXSA9ICdKYW1haXMnOwokbGFuZ1sncG9zdGluc3RhbGxtZXNzYWdlJ10gPSAnTGUgbW9kdWxlIGEgw6l0w6kgaW5zdGFsbMOpIGF2ZWMgc3VjY8Oocy48YnIvPkFzc3VyZXotdm91cyBkZSBkw6lmaW5pciBsYSBwZXJtaXNzaW9uICJNb2RpZnkgRnJvbnRFbmRVc2VyIFByb3BlcnRpZXMiJzsKJGxhbmdbJ3Bhc3N3b3JkJ10gPSAnTW90IGRlIHBhc3NlJzsKJGxhbmdbJ3JlcGVhdHBhc3N3b3JkJ10gPSAnRW5jb3JlJzsKJGxhbmdbJ2Vycm9yX2dyb3VwbmFtZV9leGlzdHMnXSA9ICdVbiBncm91cGUgZHUgbcOqbWUgbm9tIGV4aXN0ZSBkw6lqw6AnOwokbGFuZ1snZWRpdGdyb3VwJ10gPSAnw4lkaXRlciBsZSBncm91cGUnOwokbGFuZ1snc3VibWl0J10gPSAnRW52b3llcic7CiRsYW5nWydjYW5jZWwnXSA9ICdBbm51bGVyJzsKJGxhbmdbJ2RlbGV0ZSddID0gJ1N1cHByaW1lcic7CiRsYW5nWydhcmV5b3VzdXJlX2RlbGV0ZWdyb3VwJ10gPSAnw4p0ZXMtdm91cyBzw7tyIGRlIHZvdWxvaXIgc3VwcHJpbWVyIGNlIGdyb3VwZT8nOwokbGFuZ1snZXJyb3JfaW5zdWZmaWNpZW50cGFyYW1zJ10gPSAnUGFyYW3DqHRyZXMgaW5zdWZmaXNhbnRzJzsKJGxhbmdbJ2lkJ10gPSAnSWQnOwokbGFuZ1snbmFtZSddID0gJ05vbSc7CiRsYW5nWydlcnJvcl9jYW50YWRkZ29ydXAnXSA9ICdwcm9ibMOobWUgbG9ycyBkZSBsXCdham91dCBkdSBncm91cGUnOwokbGFuZ1snZXJyb3JfaW52YWxpZHBhcmFtcyddID0gJ1BhcmFtw6h0cmVzIG5vbiB2YWxpZGVzJzsKJGxhbmdbJ2FwcGx5ZmlsdGVyJ10gPSAnQXBwbGlxdWVyJzsKJGxhbmdbJ2ZpbHRlciddID0gJ0ZpbHRyZSc7CiRsYW5nWyd1c2VyZmlsdGVyJ10gPSAnVXNlciBSZWd1bGFyIEV4cHJlc3Npb24nOwokbGFuZ1snZGVzY3JpcHRpb24nXSA9ICdEZXNjcmlwdGlvbic7CiRsYW5nWydncm91cG5hbWUnXSA9ICdOb20gZHUgZ3JvdXBlJzsKJGxhbmdbJ2FjY2Vzc2RlbmllZCddID0gJ0FjY8OocyByZWZ1c8OpJzsKJGxhbmdbJ2Vycm9yJ10gPSAnRXJyZXVyJzsKJGxhbmdbJ2FkZGdyb3VwJ10gPSAnQWpvdXRlciB1biBncm91cGUnOwokbGFuZ1snYWRkdXNlciddID0gJ0Fqb3V0ZXIgdW4gdXRpbGlzYXRldXInOwokbGFuZ1sndXNlcnNmb3VuZCddID0gJ1V0aWxpc2F0ZXVycyB0cm91dsOpcyc7CiRsYW5nWydncm91cCddID0gJ0dyb3VwZSc7CiRsYW5nWydzZWxlY3Rncm91cCddID0gJ1PDqWxlY3Rpb25uZXIgbGUgZ3JvdXBlJzsKJGxhbmdbJ3JlZ2lzdHJhdGlvbl90ZW1wbGF0ZSddID0gJ0dhYmFyaXQgZFwnZW5yZWdpc3RyZW1lbnQnOwokbGFuZ1snbG9nb3V0X3RlbXBsYXRlJ10gPSAnR2FiYXJpdCBkZSBkw6ljb25uZXhpb24nOwokbGFuZ1snbG9naW5fdGVtcGxhdGUnXSA9ICdHYWJhcml0IGRlIGNvbm5leGlvbic7CiRsYW5nWydwcmVmZXJlbmNlcyddID0gJ1Byw6lmw6lyZW5jZXMnOwokbGFuZ1sndXNlcnMnXSA9ICdVdGlsaXNhdGV1cnMnOwokbGFuZ1snZnJpZW5kbHluYW1lJ10gPSAnR2VzdGlvbiBkZXMgdXRpbGlzYXRldXJzIGR1IHNpdGUnOwokbGFuZ1snbW9kZGVzY3JpcHRpb24nXSA9ICdHw6hyZSBsZXMgdXRpbGlzYXRldXJzIGR1IHNpdGUnOwokbGFuZ1snZGVmYXVsdGZyb250cGFnZSddID0gJ1BhZ2UgcGFyIGTDqWZhdXQnOwokbGFuZ1snbGFzdGFjY2Vzc2VkcGFnZSddID0gJ0Rlcm5pw6hyZSBwYWdlIGFjY8OpZMOpZSc7CiRsYW5nWydvdGhlcnBhZ2UnXSA9ICdBdXRyZSBwYWdlJm5ic3A7Oic7CiRsYW5nWydjaGFuZ2Vsb2cnXSA9ICc8dWw+DQo8bGk+MC4wLjEgLSBPY3RvYmVyIDIwMDUgLSBWZXJzaW9uIGluaXRpYWxlLCBub24gZm9uY3Rpb25uZWxsZTwvbGk+DQo8bGk+MC4xLjAgLSBPY3RvYmVyIDIwMDUgLSBWZXJzaW9uIGluaXRpYWxlPC9saT4NCjxsaT4wLjEuMSAtIE9jdG9icmUgMjAwNSAtIENvcnJlY3Rpb24gZGVzIHByb2Jsw6htZXMgYXZlYyBsZXMgcHJvcHJpw6l0w6lzPC9saT4NCjxsaT4wLjEuMiAtIE9jdG9icmUgMjAwNSAtIEFqb3V0IGRlIGxhIGZvbmN0aW9uIHBvdXIgbGVzIG1vdHMgZGUgcGFzc2Ugb3VibGnDqXM8L2xpPg0KPGxpPjxwPjAuMS4zIC0gTm92ZW1icmUgMjAwNTwvcD4NCiAgICA8cD5Bam91dCBkZSBsYSBwb3NzaWJpbGl0w6kgZGUgc3DDqWNpZmllciBsZXMgcGFnZXMgZGUgcmVkaXJlY3Rpb24gYXByw6hzIGNvbm5leGlvbiBldCBkw6ljb25uZXhpb24sIG91YmxpIGRlIG1vdCBkZSBwYXNzZSBldCBjaGFuZ2VtZW50IGRlIHBhcmFtw6h0cmVzLCBham91dCBkZXMgcGFyYW3DqHRyZXMgcmV0dXJudG8gZXQgZGUgZm9ybXVsYWlyZXMgZGFucyBsZSBwYW5uZWF1IHV0aWxpc2F0ZXVyLCBuZXR0b3lhZ2UgZGUgY29kZS4gIENldHRlIHZlcnNpb24gcmVxdWllcnQgQ01TTVMgdjAuMTEgZXQgc3VpdmFudGVzLjwvcD48L2xpPg0KPGxpPjAuMS40IC0gTm92ZW1icmUgMjAwNSAtIFBldGl0IGNoYW5nZW1lbnQgZW4gcmFwcG9ydCBhdmVjIHVuZSBmb25jdGlvbiBvdWJsacOpZSBxdWkgblwnZXN0IHBsdXMgdXRpbGlzw6llPC9saT4NCjxsaT48cD4wLjEuNSAtIE5vdmVtYnJlIDIwMDU8L3A+DQogICAgPHA+VW4gYXV0cmUgcGV0aXQgY2hhbmdlbWVudCwgYWpvdXQgZGUgdGV4dGUgYXUgbWVzc2FnZSBhZmZpY2jDqSBhcHLDqHMgbFwnaW5zdGFsbGF0aW9uLjwvcD48L2xpPg0KPGxpPjxwPjAuMS42IC0gSmFudmllciAyMDA2PHA+DQogICAgPHA+Q2hhbmdlbWVudCBkYW5zIGxlcyBwcm9jZXNzdXMgZGUgcGVybWlzc2lvbnMsIGV0IHBldGl0ZXMgY29ycmVjdGlvbnMgZGFucyBsZXMgcHLDqWbDqXJlbmNlcy4gIMOJZ2FsZW1lbnQgcXVlbHF1ZXMgY29ycmVjdGlvbiBlbiByYXBwb3J0IGF2ZWMgcGhwNSwgaWwgZG9pdCBjZXBlbmRhbnQgcmVzdGVyIHF1ZWxxdWVzIGVycmV1cnMuPC9wPjwvbGk+DQo8L3VsPic7CiRsYW5nWydoZWxwJ10gPSAnPGgzPlF1ZSBmYWl0IGNlIG1vZHVsZSA/PC9oMz4NCjxwPkNlIG1vZHVsZSBwZXJtZXQgbGEgZ2VzdGlvbiBldCBsXCdhZG1pbmlzdHJhdGlvbiBkZXMgdXRpbGlzYXRldXJzIGR1IHNpdGUgc3VyIGxhIHBhcnRpZSBwdWJsaXF1ZSA8aT4odXRpbGlzYXRldXJzIHF1aSBuXCdvbnQgcGFzIGFjY8OocyBhdSBwYW5uZWF1IGRcJ2FkbWluaXN0cmF0aW9uKTwvaT4uIElsIHBlcm1ldCBsYSBjcsOpYXRpb24gZGUgZ3JvdXBlcyBkXCd1dGlsaXNhdGV1cnMsIGRlIGNvbXB0ZXMgdXRpbGlzYXRldXIsIGV0IHBlcm1ldCBhdXggdXRpbGlzYXRldXJzIGRlIHNlIGNvbm5lY3RlciBldCBzZSBkw6ljb25uZWN0ZXIuIElsIHBldXQgw6p0cmUgdXRpbGlzw6kgYXZlYyBsZSBtb2R1bGUgQ3VzdG9tQ29udGVudCBwb3VyIGFmZmljaGVyIGR1IGNvbnRlbnUgZGlmZsOpcmVudCBzZWxvbiBsZXMgdXRpbGlzYXRldXJzLCB1bmUgZm9pcyBxdVwnaWxzIHNvbnQgY29ubmVjdMOpcy48L3A+DQo8aDM+Rm9uY3Rpb25uYWxpdMOpczwvaDM+DQo8dWw+DQo8bGk+PHA+RXhwaXJhdGlvbiBkdSBjb21wdGUgdXRpbGlzYXRldXIuICBWb3VzIHBvdXZleiBjcsOpZXIgZGVzIHV0aWxpc2F0ZXVycyB0ZW1wb3JhaXJlczwvcD48L2xpPg0KPGxpPjxwPlByb3ByacOpdMOpcyBkZSBncm91cGUuICBWb3VzIHBvdXZleiBkZW1hbmRlciBkZXMgaW5mb3JtYXRpb25zIGRpZmbDqXJlbnRlcyBhdXggbWVtYnJlcyBkZSBkaWZmw6lyZW50cyBncm91cGVzPC9wPjwvbGk+DQo8bGk+PHA+UGV1dCBnw6lyZXIgZGVzIGNlbnRhaW5lcyBkXCd1dGlsaXNhdGV1cnM8L3A+PC9saT4NCjxsaT48cD5Db250aWVudCB1bmUgQVBJIMOpdGVuZHVlLCBwb3VyIGxcJ2Fqb3V0IGRlIGZvbmN0aW9ubmFsaXTDqXM8L3A+PC9saT4NCjwvdWw+DQo8aDM+Q29tbWVudCBsXCd1dGlsaXNlcjwvaDM+DQo8dWw+DQo8bGk+PHA+QXByw6hzIGluc3RhbGxhdGlvbiwgdm91cyBwb3V2ZXogYWNjw6lkZXIgYXUgbW9kdWxlIEZyb250RW5kVXNlcnMgcGFyIGxlIHBhbm5lYXUgZFwnYWRtaW5pc3RyYXRpb24gc291cyBsZSBtZW51ICZxdW90O0dyb3VwZXMgJiBVdGlsaXNhdGV1cnMmcXVvdDsuPC9wPjwvbGk+DQo8bGk+DQo8cD5EZXV4acOobWVtZW50LCB2b3VzIGRldnJpZXogZMOpZmluaXIgZGVzIHByb3ByacOpdMOpcy4gTGVzIHByb3ByacOpdMOpcyBzb250IGVzc2VudGllbGxlbWVudCBkZXMgZMOpZmluaXRpb25zIGRlIGNoYW1wLCB2b3VzIHBvdXZleiBpY2kgZMOpZmluaXIgbGUgdHlwZSBkXCdpbmZvcm1hdGlvbiBxdWUgdm91cyBkw6lzaXJleiBjb2xsZWN0ZXIsIGV0IGxlcyBsaW1pdGVzLiBwLmV4LiBOb20sIEFnZSwgVmlsbGUsIETDqXBhcnRlbWVudCwgUGF5cywgQWRyZXNzZSBlbWFpbCwgZXRjLiA8L3A+DQo8cD48Yj5Ob3RlOjwvYj4gVm91cyBuXCdhdmV6IHBhcyBiZXNvaW4gZGUgZMOpZmluaXIgbGVzIHByb3ByacOpdMOpcyBkZSBsXCdpZGVudGlmaWFudCBldCBkdSBtb3QgZGUgcGFzc2UsIGlscyBzb250IGNyw6nDqXMgcG91ciB2b3VzLjwvYj4NCjwvbGk+DQo8bGk+PHA+RW5zdWl0ZSwgdm91cyBkZXZyaWV6IGNyw6llciB1biBvdSBwbHVzaWV1cnMgbm9tKHMpIGRlIGdyb3VwZS4gUXVhbmQgdm91cyBjcsOpw6l6IHVuIGdyb3VwZSwgdm91cyBkZXZleiBlbnRyZXIgdW4gbm9tIGRlIGdyb3VwZSwgdW5lIGRlc2NyaXB0aW9uIGV0IGRldmV6IGFzc29jaWVyIGRlcyBwcm9wcmnDqXTDqXMgYXUgZ3JvdXBlLCBzcMOpY2lmaWVyIGxcJ29yZHJlIGRlcyBwcm9wcmnDqXTDqXMsIHNpIGNlbGxlcy1jaSBzb250IG9wdGlvbm5lbGxlcywgcmVxdWlzZXMgb3UgZGUgY2hhbXAgY2FjaMOpPGk+KG9mZiBlc3QgYXVzc2kgdmFsaWRlKTwvaT48L3A+PC9saT4NCjxsaT48cD48Yj5Ob3RlOjwvYj4gQXZhbnQgZGUgY29udGludWVyLCB2ZXVpbGxleiB2b3VzIGFzc3VyZXIgcXVlIGxlcyBwcsOpZsOpcmVuY2VzIHNvbnQgZMOpZmluaWVzIGNvcnJlY3RlbWVudC48L3A+PC9saT4NCjxsaT48cD5Ucm9pc2nDqG1lbWVudCwgY3LDqWV6IGxlcyB1dGlsaXNhdGV1cnMuIExcJ2Fqb3V0IGRcJ3V0aWxpc2F0ZXVyIGVzdCB1biBwcm9jZXNzdXMgZW4gZGV1eCB0ZW1wcy4gUXVhbmQgdm91cyBjcsOpw6l6IHVuIHV0aWxpc2F0ZXVyLCB2b3VzIGRldmV6IGVudHJlciB1biBpZGVudGlmaWFudCBldCB1biBtb3QgZGUgcGFzc2UsIGFpbnNpIHF1XCd1bmUgZGF0ZSBkXCdleHBpcmF0aW9uLiBWb3VzIGRldmV6IGVuc3VpdGUgc8OpbGVjdGlvbm5lciBsZSBvdSBsZXMgZ3JvdXBlKHMpIGF1KHgpcXVlbChzKSBjZXQgdXRpbGlzYXRldXIgYXBwYXJ0aWVuZHJhLCBwdWlzIGNsaXF1ZXIgc3VyIFxcXCdTdWl2YW50XFxcJzwvcD4NCjxwPjxlbT5Ob3RlOiA8L2VtPkNlY2kgZXN0IHVuIHRyYXZhaWwgbG9uZyBldCBsYWJvcmlldXgsIGlsIGVzdCBwbHVzIGZhY2lsZSBkZSBsYWlzc2VyIGxlcyB1dGlsaXNhdGV1cnMgc1wnZW5yZWdpc3RyZXIgZXV4LW3Dqm1lcy4gUHVpcyB2b3VzIHBvdXZleiDDqWRpdGVyIGxldXIgZ3JvdXBlIGRcJ2FwcGFydGVuYW5jZS4gQ2VwZW5kYW50LCBjcsOpw6l6IGF1IG1vaW5zIHVuIHV0aWxpc2F0ZXVyLXRlc3QuPC9wPjwvbGk+DQo8bGk+PHA+RW5maW4sIGFwcsOocyBxdWUgbGUgc3lzdMOobWUgYWllIGTDqXRlcm1pbsOpIHRvdXMgbGVzIGNoYW1wcyBhIHByw6lzZW50ZXIgw6AgbFwndXRpbGlzYXRldXIsIHZvdXMgdmVycmV6IHVuIGZvcm11bGFpcmUgcXVpIHZvdXMgZGVtYW5kZXJhIGRlIGTDqWZpbmlyIHRvdXMgbGVzIGNoYW1wcyBvYmxpZ2F0b2lyZXMuIFJlbXBsaXNzZXogY2UgZm9ybXVsYWlyZSBwb3VyIHRlcm1pbmVyIGxcJ2Fqb3V0IGRlIGxcJ3V0aWxpc2F0ZXVyLjwvcD48L2xpPg0KPGxpPjxwPlZvdXMgw6p0ZXMgbWFpbnRlbmFudCBwcsOqdCDDoCBham91dGVyIGxhIGZvbmN0aW9uIGF1eCBwYWdlcyBkZSB2b3RyZSBzaXRlLiBDXCdlc3QgdHLDqHMgc2ltcGxlLCBham91dGV6IGxhIGJhc2xpc2UgU21hcnR5IHtjbXNfbW9kdWxlIG1vZHVsZT1Gcm9udEVuZFVzZXJzfSDDoCB2b3RyZSBwYWdlIG91IGdhYmFyaXQ8L3A+PC9saT4NCjwvdWw+DQo8aDM+U3VwcG9ydDwvaDM+DQo8cD5DZSBtb2R1bGUgbmUgY29udGllbnQgYXVjdW4gc3VwcG9ydCBjb21tZXJjaWFsLiBDZXBlbmRhbnQsIGNlcyByZXNzb3VyY2VzIHNvbnQgZGlzcG9uaWJsZXMgcG91ciB2b3VzIGFpZGVyJm5ic3A7OjwvcD4NCjx1bD4NCjxsaT5Qb3VyIGxhIGRlcm5pw6hyZSB2ZXJzaW9uIGRlIGNlIG1vZHVsZSwgbGVzIEZBUXMsIG91IHBvdXIgYW5ub25jZXIgdW4gYnVnLCBvdSBwb3VyIGFjaGV0ZXIgZHUgc3VwcG9ydCBjb21tZXJjaWFsLCB2ZXVpbGxleiB2aXNpdGVyIGxlIHNpdGUgZGUgY2FsZ3V5XCdzIDxhIGhyZWY9Imh0dHA6Ly90ZWNoY29tLmR5bmRucy5vcmciPnRlY2hjb20uZHluZG5zLm9yZzwvYT4uPC9saT4NCjxsaT5EZXMgZGlzY3Vzc2lvbnMgY29tcGzDqW1lbnRhaXJlcyByZWxhdGl2ZXMgw6AgY2UgbW9kdWxlIHBldXZlbnQgYXVzc2kgw6p0cmUgdHJvdXbDqWVzIHN1ciBsZXMgPGEgaHJlZj0iaHR0cDovL2ZvcnVtLmNtc21hZGVzaW1wbGUub3JnIiB0YXJnZXQ9Il9ibGFuayI+Rm9ydW1zIENNUyBNYWRlIFNpbXBsZTwvYT4uPC9saT4NCjxsaT5MXCdhdXRldXIsIGNhbGd1eTEwMDAsIGVzdCBzb3V2ZW50IHN1ciBJUkMgc3VyIGNhbmFsICNjbXM6IGlyYy5mcmVlbm9kZS5uZXQvI2NtczwvbGk+DQo8bGk+RXQgZW5maW4sIHZvdXMgcG91dmV6IHJlbmNvbnRyZXIgdW4gY2VydGFpbiBzdWNjw6hzIGVuIGVudm95YW50IHVuIGVtYWlsIGRpcmVjdGVtZW50IMOgIGxcJ2F1dGV1ci48L2xpPiAgDQo8L3VsPg0KPGgzPlBhcmFtw6h0cmVzPC9oMz4NCjx1bD4NCjxsaT48ZW0+KG9wdGlvbmVsKTwvZW0+IGZvcm09Im5hbWUiPC9saT4NCjxwPkZvcm11bGFpcmVzOg0KPHVsPg0KIDxsaT48ZW0+bG9naW48L2VtPiAtIEFmZmljaGUgbGUgZm9ybXVsYWlyZSBkZSBjb25uZXhpb248L2xpPg0KIDxsaT48ZW0+bG9nb3V0PC9lbT4gLSBBZmZpY2hlIGxlIGZvcm11bGFpcmUgZGUgZMOpY29ubmV4aW9uPC9saT4NCiA8bGk+PGVtPmNoYW5nZXNldHRpbmdzPC9lbT4gLSBBZmZpY2hlIGxlIGZvcm11bGFpcmUgZGUgY2hhbmdlbWVudCBkZSBwYXJhbcOodHJlczwvbGk+DQogPGxpPjxlbT5mb3Jnb3RwdzwvZW0+IC0gQWZmaWNoZSBsZSBmb3JtdWxhaXJlIGRcJ291YmxpIGRlIG1vdCBkZSBwYXNzZTwvbGk+DQo8L3VsPg0KPC9wPg0KPGxpPjxlbT4ob3B0aW9uZWwpPC9lbT4gcmV0dXJudG89InBhZ2UiPC9saT4NCjxwPlV0aWxpc8OpIGF2ZWMgbGVzIGZvcm11bGFpcmVzIGRlIGNvbm5leGlvbiwgZGUgZMOpY29ubmV4aW9uLCBldCBkZSBjaGFuZ2VtZW50IGRlIHBhcmFtw6h0cmVzLCBjZSBwYXJhbcOodHJlIGNvbnRpZW50IGxcJ2lkIG91IGxcJ2FsaWFzIGRlIGxhIHBhZ2Ugw6AgbGFxdWVsbGUgcmVkaXJpZ2VyIGxcJ3V0aWxpc2F0ZXVyIGFwcsOocyBsXCdlbnZvaSBkdSBmb3JtdWxhaXJlLCBzaSBjZWx1aS1jaSBhIMOpdMOpIHRyYWl0w6kgYXZlYyBzdWNjw6hzPC9wPg0KPC91bD4NCjxwPkNvbmZvcm3DqW1lbnQgw6AgbGEgbGljZW5jZSBHUEwsIGNlIG1vZHVsZSBlc3QgZGlzdHJpYnXDqSB0ZWwgcXVlbC4gVmV1aWxsZXogdm91cyByw6lmw6lyZXIgZGlyZWN0ZW1lbnQgw6AgbGEgbGljZW5jZSBwb3VyIHRvdXQgYXZpcyBkZSBub24gcmVzcG9uc2FiaWxpdMOpLjwvcD4NCjxoMz5SZXF1aXM8L2gzPg0KPHA+UG91ciBsXCdpbXBsw6ltZW50YXRpb24gZGUgbGEgcsOpaW5pdGlhbGlzYXRpb24gZGUgbW90IGRlIHBhc3NlIG91Ymxpw6ksIGNlIG1vZHVsZSByZXF1aWVydCBxdWUgbGUgbW9kdWxlIENNU01haWxlciBzb2l0IHByw6lhbGFibGVtZW50IGluc3RhbGzDqS48L3A+DQo8aDM+Q29weXJpZ2h0IGV0IExpY2VuY2U8L2gzPg0KPHA+Q29weXJpZ2h0ICZjb3B5OyAyMDA1LCBSb2JlcnQgQ2FtcGJlbCA8YSBocmVmPSJtYWlsdG86Y2FsZ3V5MTAwMEBob3RtYWlsLmNvbSI+Jmx0O2NhbGd1eTEwMDBAaG90bWFpbC5jb20mZ3Q7PC9hPi4gVG91cyBkcm9pdHMgcsOpc2VydsOpcy48L3A+DQo8cD5DZSBtb2R1bGUgZXN0IGRpc3RyaWJ1w6kgc291cyBsYSBsaWNlbmNlIDxhIGhyZWY9Imh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTCIgdGFyZ2V0PSJfYmxhbmsiPkdOVSBQdWJsaWMgTGljZW5zZTwvYT4uIFZvdXMgZGV2ZXogYWdyw6llciBhdXggdGVybWVzIGRlIGNldHRlIGxpY2VuY2UgcG91ciBwb3V2b2lyIHV0aWxpc2VyIGNlIG1vZHVsZS48L3A+JzsKPz4=]]></data>
  </file>
  <file>
    <filename>/lang/ext/it_IT.php</filename>
    <isdir>0</isdir>
    <data><![CDATA[PD9waHAKJGxhbmdbJ2luZm9fc210cHZhbGlkYXRlJ10gPSAnVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCB3b3JrIG9uIHdpbmRvd3MnOwokbGFuZ1snbXNnX2RvbnRjcmVhdGV1c2VybmFtZSddID0gJ0RvIG5vdCBjcmVhdGUgYSBwcm9wZXJ0eSBmb3IgdXNlcm5hbWUsIG9yIHNvbWUgc3VjaCB0aGluZyBhcyB0aGlzIGlzIGJ1aWx0aW4gdG8gdGhlIEZyb250RW5kVXNlcnMgbW9kdWxlJzsKJGxhbmdbJ3Byb21wdF9leHBvcnRjc3YnXSA9ICdFeHBvcnQgVXNlcnMgdG8gQ1NWJzsKJGxhbmdbJ2V4cG9ydGNzdiddID0gJ0VzcG9ydGEnOwokbGFuZ1snYWRtaW4nXSA9ICdBbW1pbmlzdGF6aW9uZSc7CiRsYW5nWydlZGl0cHJvcCddID0gJ01vZGlmaWNhIHByb3ByaWV0JmFncmF2ZTsnOwokbGFuZ1snbWF4bGVuZ3RoJ10gPSAnTWFzc2ltYSBsdW5naGV6emEnOwokbGFuZ1snY3JlYXRlZCddID0gJ0NyZWF0byc7CiRsYW5nWydzb3J0YnknXSA9ICdPcmRpbmF0byBwZXInOwokbGFuZ1snc29ydCddID0gJ09yZGluYW1lbnRvJzsKJGxhbmdbJ3VzZXJzaW5ncm91cCddID0gJ1V0ZW50aSBuZWwgZ3J1cHBvJzsKJGxhbmdbJ3VzZXJsaW1pdCddID0gJ0xpbWl0IHJlc3VsdHMgdG8nOwokbGFuZ1snZXJyb3Jfbm9lbWFpbGZpZWxkJ10gPSAnQ291bGQgbm90IGZpbmQgYW4gZW1haWwgZmllbGQgZm9yIHRoaXMgdXNlci4gIFlvdSBtYXkgbmVlZCB0byBjb250YWN0IHRoZSBzeXN0ZW0gYWRtaW5pc3RyYXRvcic7CiRsYW5nWydwcm9tcHRfZm9yZ290cHdfcGFnZSddID0gJ1BhZ2VJRC9BbGlhcyBmb3IgRm9yZ290IFBhc3N3b3JkIGZvcm0nOwokbGFuZ1sncHJvbXB0X2NoYW5nZXNldHRpbmdzX3BhZ2UnXSA9ICdQYWdlSUQvQWxpYXMgZm9yIENoYW5nZSBTZXR0aW5ncyBmb3JtJzsKJGxhbmdbJ3Byb21wdF9sb2dpbl9wYWdlJ10gPSAnUGFnZUlEL0FsaWFzIHRvIGp1bXAgdG8gYWZ0ZXIgbG9naW4nOwokbGFuZ1sncHJvbXB0X2xvZ291dF9wYWdlJ10gPSAnUGFnZUlEL0FsaWFzIHRvIGp1bXAgdG8gYWZ0ZXIgbG9nb3V0JzsKJGxhbmdbJ3NvcnRvcmRlciddID0gJ09yZGluZSc7CiRsYW5nWydwcm9tcHRfbnVtcmVzZXRyZWNvcmQnXSA9ICdBIG51bWJlciBvZiB1c2VycyBhcmUgaW4gdGhlIG1pZGRsZSBvZiByZXNldHRpbmcgbG9zdCBwYXNzd29yZHMuICBDdXJyZW50bHkgdGhpcyBjb3VudCBpcyBhdDonOwokbGFuZ1sncmVtb3ZlMXdlZWsnXSA9ICdSaW11b3ZpIHR1dHRlIGxlIGVudGl0JmFncmF2ZTsgcGkmdWdyYXZlOyB2ZWNjaGllIGRpIHVuYSBzZXR0aW1hbmEnOwokbGFuZ1sncmVtb3ZlMW1vbnRoJ10gPSAnUmltdW92aSB0dXR0ZSBsZSBlbnRpdCZhZ3JhdmU7IHBpJnVncmF2ZTsgdmVjY2hpZSBkaSB1biBtZXNlJzsKJGxhbmdbJ3JlbW92ZWFsbCddID0gJ1JpbXVvdmkgdHV0dGUgbGUgZW50aXQmYWdyYXZlOyc7CiRsYW5nWydhcmV5b3VzdXJlJ10gPSAnU2VpIHNpY3Vybz8nOwokbGFuZ1snZXJyb3JfaW52YWxpZGNvZGUnXSA9ICdVbiBjb2RpY2UgaW52YWxpZG8gJmVncmF2ZTsgc3RhdG8gYWdnaXVudG8sIHByb3ZhIGRpIG51b3ZvJzsKJGxhbmdbJ2Vycm9yX3RlbXBjb2Rlbm90Zm91bmQnXSA9ICdBIHRlbXBvcmFyeSBjb2RlIGZvciB5b3VyIHVzZXIgaWQgY291bGQgbm90IGJlIGZvdW5kIGluIHRoZSBkYXRhYmFzZSc7CiRsYW5nWydmb3Jnb3RwYXNzd29yZF92ZXJpZnl0ZW1wbGF0ZSddID0gJ01vZGVsbG8gdXNhdG8gcGVyIHZpc3VhbGl6emFyZSBpbCBtb2R1bG8gZGkgdmVyaWZpY2EnOwokbGFuZ1snZm9yZ290cGFzc3dvcmRfZW1haWx0ZW1wbGF0ZSddID0gJ01vZGVsbG8gdXNhdG8gcGVyIGxhIHBhc3NvcmQgZGltZW50aWNhdGEnOwokbGFuZ1snZXJyb3JfcmVzZXRhbHJlYWR5c2VudCddID0gJ0VpdGhlciB5b3Vyc2VsZiBvciBzb21lb25lIGVsc2UgaGFzIGFscmVhZHkgdHJpZ2dlcmVkIGEgcGFzc3dvcmQgcmVzZXQgb3BlcmF0aW9uIGZvciB0aGlzIGFjY291bnQuICBDaGVjayB5b3VyIGVtYWlsLCB5b3UgbWF5IGhhdmUgZnVydGhlciBpbnN0cnVjdGlvbnMgb24gaG93IHRvIHJlc2V0IHlvdXIgcGFzc3dvcmQgaW4geW91ciBpbmJveCc7CiRsYW5nWydlcnJvcl9kYmVycm9yJ10gPSAnRXJyb3JlIGRhdGFiYXNlJzsKJGxhbmdbJ21lc3NhZ2VfZm9yZ290cHdlbWFpbCddID0gJ1lvdSBhcmUgcmVjZWl2aW5nIHRoaXMgbWVzc2FnZSBiZWNhdXNlIHNvbWVib2R5IHRvbGQgb3VyIHNpdGUgdGhhdCB5b3UgaGFkIGxvc3QgeW91ciBwYXNzd29yZC4gIElmIHRoaXMgaXMgdGhlIGNhc2UsIHJlYWQgdGhlIGluc3RydWN0aW9ucyBiZWxvdy4gIElmIHlvdSBkb24mIzAzOTt0IGhhdmUgYSBjbHVlIHdoYXQgdGhpcyBpcywgdGhlbiB5b3UgYXJlIHNhZmUgdG8gZGVsZXRlIHRoaXMgbWVzc2FnZSwgYW5kIHdlIHRoYW5rIHlvdSBmb3IgeW91ciB0aW1lLic7CiRsYW5nWydwcm9tcHRfY29kZSddID0gJ0NvZGljZSc7CiRsYW5nWydtZXNzYWdlX2NvZGUnXSA9ICdUaGUgZm9sbG93aW5nIGNvZGUgaGFzIGJlZW4gZ2VuZXJhdGVkIHJhbmRvbWx5IGdlbmVyYXRlZCBpbiBvcmRlciB0byB2ZXJpZnkgdGhlIHVzZXIgYWNjb3VudC4gIHdoZW4geW91IGNsaWNrIG9uIHRoZSBsaW5rIGJlbG93IHlvdSB3aWxsIGJlIHByZXNlbnRlZCB3aXRoIGEgZmllbGQgdG8gZW50ZXIgdGhpcyBjb2RlLiAgTm9ybWFsbHkgdGhlIGZpZWxkIGlzIHByZS1jb21wbGV0ZWQgZm9yIHlvdSwgYnV0IGluY2FzZSBpdCBpc24mIzAzOTt0IHRoZSBjb2RlIGlzOic7CiRsYW5nWydwcm9tcHRfbGluayddID0gJ0NsaWNraW5nIG9uIHRoZSBmb2xsb3dpbmcgbGluayB3aWxsIHRha2UgeW91IHRvIHRoZSB3ZWJzaXRlIHdoZXJlIHlvdSBjYW4gZW50ZXIgdGhlIGFib3ZlIGNvZGUsIGFuZCByZXNldCB5b3VyIHBhc3N3b3JkOic7CiRsYW5nWydsb3N0cGFzc3dvcmRfZW1haWxzdWJqZWN0J10gPSAnUGFzc3dvcmQgcGVyc2EnOwokbGFuZ1snZXJyb3Jfbm9tYWlsZXJtb2R1bGUnXSA9ICdOb24gdHJvdm8gaWwgbW9kdWxvIENNU01haWxlcic7CiRsYW5nWydpbmZvX2ZvcmdvdHB3bWVzc2FnZXNlbnQnXSA9ICdVbmEgZW1haWwgJmVncmF2ZTsgc3RhdGEgc3BlZGl0YSBhICVzIGNvbiBsZSBpc3RydXppb25pIGRpIGNvbWUgYXp6ZXJhcmUgbGEgdm9zdHJhIHBhc3N3b3JkLiBHcmF6aWUnOwokbGFuZ1snbG9zdHB3X21lc3NhZ2UnXSA9ICdTbyB5b3UgZm9yZ290IG9yIGxvc3QgeW91ciBwYXNzd29yZC4gV2VsbCwgdHlwZSB5b3VyIHVzZXJuYW1lIGluIGhlcmUsIGFuZCBpZiB3ZSBjYW4gZmluZCB5b3Ugd2Ugd2lsbCBzZW5kIHlvdSBhbiBlbWFpbCB3aXRoIGluc3RydWN0aW9ucyBvbiBob3cgdG8gcmVzZXQgaXQnOwokbGFuZ1snZm9yZ290cGFzc3dvcmRfdGVtcGxhdGUnXSA9ICdGb3Jnb3QgUGFzc3dvcmQgVGVtcGF0ZXMnOwokbGFuZ1snZXJyb3JfcHJvcG5vdGZvdW5kJ10gPSAnUHJvcGVydHkgJXMgbm90IGZvdW5kJzsKJGxhbmdbJ3Byb3BzZm91bmQnXSA9ICdQcm9wZXJ0aWVzIGZvdW5kJzsKJGxhbmdbJ2FkZHByb3AnXSA9ICdBZGQgUHJvcGVydHknOwokbGFuZ1snZXJyb3JfcmVxdWlyZWRmaWVsZCddID0gJ0EgcmVxdWlyZWQgZmllbGQgKCVzKSB3YXMgZW1wdHknOwokbGFuZ1snaW5mb19lbXB0eXBhc3N3b3JkZmllbGQnXSA9ICdFbnRlciBhIG5ldyBwYXNzd29yZCBoZXJlIHRvIGNoYW5nZSB5b3VyIHBhc3N3b3JkJzsKJGxhbmdbJ2Vycm9yX25vdGxvZ2dlZGluJ10gPSAnWW91IGRvIG5vdCBhcHBlYXIgdG8gYmUgbG9nZ2VkIGluJzsKJGxhbmdbJ3VzZXJfc2V0dGluZ3MnXSA9ICdDb25maWd1cmF6aW9uaSc7CiRsYW5nWyd1c2VyX3JlZ2lzdHJhdGlvbiddID0gJ1JlZ2lzdHJhemlvbmUnOwokbGFuZ1snZXJyb3JfYWNjb3VudGV4cGlyZWQnXSA9ICdUaGlzIGFjY291bnQgaGFzIGV4cGlyZWQnOwokbGFuZ1snZXJyb3JfaW1wcm9wZXJlbWFpbGZvcm1hdCddID0gJ0ltcHJvcGVyIGVtYWlsIGFkZHJlc3MgZm9ybWF0dGluZyc7CiRsYW5nWydlcnJvcl9pbnZhbGlkZXhwaXJ5ZGF0ZSddID0gJ0ludmFsaWQgZXhwaXJ5IGRhdGUnOwokbGFuZ1snZXJyb3JfcHJvYmxlbXNldHRpbmdwcm9wZXJ0eSddID0gJ0Vycm9yIHNldHRpbmcgcHJvcGVydHkgJXMgZm9yIHVzZXIgJHMnOwokbGFuZ1snZXJyb3JfaW52YWxpZGdyb3VwaWQnXSA9ICdJbnZhbGlkIGdyb3VwIGlkICVzJzsKJGxhbmdbJ2hpZGRlbmZpZWxkbWFya2VyJ10gPSAnSGlkZGVuIGZpZWxkIG1hcmtlcic7CiRsYW5nWydoaWRkZW5maWVsZGNvbG9yJ10gPSAnSGlkZGVuIGZpZWxkIGNvbG9yJzsKJGxhbmdbJ2hpZGRlbiddID0gJ0hpZGRlbic7CiRsYW5nWydlcnJvcl9kdXBsaWNhdGVuYW1lJ10gPSAnQSBwcm9wZXJ0eSB3aXRoIHRoYXQgbmFtZSBpcyBhbHJlYWR5IGRlZmluZWQnOwokbGFuZ1snZXJyb3Jfbm9wcm9wZXJ0aWVzJ10gPSAnTm8gcHJvcGVydGllcyBkZWZpbmVkJzsKJGxhbmdbJ2Vycm9yX25vcmVsYXRpb25zJ10gPSAnTm8gcHJvcGVydGllcyB3ZXJlIHNlbGVjdGVkIGZvciB0aGlzIGdyb3VwJzsKJGxhbmdbJ2dyb3Vwc2ZvdW5kJ10gPSAnR3JvdXBzIEZvdW5kJzsKJGxhbmdbJ2Vycm9yX29uZWdyb3VwcmVxdWlyZWQnXSA9ICdNZW1iZXJzaGlwIGluIGF0IGxlYXN0IG9uZSBncm91cCBpcyByZXF1aXJlZCc7CiRsYW5nWydwcm9tcHRfcmVxdWlyZW9uZWdyb3VwJ10gPSAnUmVxdWlyZSBtZW1iZXJzaGlwIGluIGF0bGVhc3Qgb25lIGdyb3VwJzsKJGxhbmdbJ2JhY2snXSA9ICdCYWNrJzsKJGxhbmdbJ2Vycm9yX21pc3NpbmdfcmVxdWlyZWRfcGFyYW0nXSA9ICclcyBpcyBhIHJlcXVpcmVkIGZpZWxkJzsKJGxhbmdbJ3JlcXVpcmVkZmllbGRtYXJrZXInXSA9ICdNYXJrIHJlcXVpcmVkIGZpZWxkcyB3aXRoJzsKJGxhbmdbJ3JlcXVpcmVkZmllbGRjb2xvciddID0gJ0hpbGl0ZSByZXF1aXJlZCBmaWVsZHMgaW4nOwokbGFuZ1snbmV4dCddID0gJ05leHQnOwokbGFuZ1snZXJyb3JfZ3JvdXBleGlzdHMnXSA9ICdBIEdyb3VwIHdpdGggdGhhdCBuYW1lIGFscmVhZHkgZXhpc3RzJzsKJGxhbmdbJ3JlcXVpcmVkJ10gPSAnUmVxdWlyZWQgRmllbGQnOwokbGFuZ1snb3B0aW9uYWwnXSA9ICdPcHRpb25hbCc7CiRsYW5nWydvZmYnXSA9ICdPZmYnOwokbGFuZ1snbGVuZ3RoJ10gPSAnTGVuZ3RoJzsKJGxhbmdbJ2xlbmd0aGNvbW1lbnQnXSA9ICc8YnI+KGNoYXJzIGluIHRoZSB0ZXh0IGlucHV0KSc7CiRsYW5nWydzZWxvcHRpb25zJ10gPSAnRHJvcGRvd24gb3B0aW9ucywgc2VwYXJhdGVkIGJ5IGxpbmUgYnJlYWtzJzsKJGxhbmdbJ3llcyddID0gJ1llcyc7CiRsYW5nWydwcm9tcHQnXSA9ICdQcm9tcHQnOwokbGFuZ1sndHlwZSddID0gJ1R5cGUnOwokbGFuZ1sndGV4dCddID0gJ1RleHQnOwokbGFuZ1snY2hlY2tib3gnXSA9ICdDaGVja2JveCc7CiRsYW5nWydlbWFpbCddID0gJ0VtYWlsIEFkZHJlc3MnOwokbGFuZ1sndGV4dGFyZWEnXSA9ICdUZXh0YXJlYSc7CiRsYW5nWydkcm9wZG93biddID0gJ0Ryb3Bkb3duJzsKJGxhbmdbJ21zZ19jdXJyZW50bHlsb2dnZWRpbmFzJ10gPSAnV2VsY29tZSc7CiRsYW5nWydsb2dvdXQnXSA9ICdTaWduIG91dCc7CiRsYW5nWydwcm9tcHRfY2hhbmdlc2V0dGluZ3MnXSA9ICdDaGFuZ2UgTXkgU2V0dGluZ3MnOwokbGFuZ1snZXJyb3JfbG9naW5mYWlsZWQnXSA9ICdMb2dpbiBmYWlsZWQgLSBJbnZhbGlkIHVzZXJuYW1lIG9yIHBhc3N3b3JkPyc7CiRsYW5nWydsb2dpbiddID0gJ1NpZ24gaW4nOwokbGFuZ1sncHJvbXB0X3VzZXJuYW1lJ10gPSAnVXNlcm5hbWUnOwokbGFuZ1sncHJvbXB0X3Bhc3N3b3JkJ10gPSAnUGFzc3dvcmQnOwokbGFuZ1sncmVnaXN0ZXInXSA9ICdSZWdpc3Rlcic7CiRsYW5nWydmb3Jnb3RwdyddID0gJ0ZvcmdvdCBZb3VyIFBhc3N3b3JkPyc7CiRsYW5nWydkZWZhdWx0cyddID0gJ0RlZmF1bHRzJzsKJGxhbmdbJ3RlbXBsYXRlJ10gPSAnVGVtcGxhdGUnOwokbGFuZ1snZXJyb3JfdXNlcm5vdGZvdW5kJ10gPSAnVXNlciBJRCBub3QgZm91bmQnOwokbGFuZ1snZXJyb3JfdXNlcm5hbWV0YWtlbiddID0gJ1RoYXQgdXNlcm5hbWUgKCVzKSBpcyBhbHJlYWR5IGluIHVzZSc7CiRsYW5nWydwcm9tcHRfc210cHZhbGlkYXRlJ10gPSAnVXNlIFNNVFAgdG8gdmFsaWRhdGUgZW1haWwgYWRkcmVzc2VzPyc7CiRsYW5nWydwcm9tcHRfbWlucHdsZW4nXSA9ICdNaW5pbXVtIFBhc3N3b3JkIExlbmd0aCc7CiRsYW5nWydwcm9tcHRfbWF4cHdsZW4nXSA9ICdNYXhpbXVtIFBhc3N3b3JkIExlbmd0aCc7CiRsYW5nWydwcm9tcHRfbWludW5sZW4nXSA9ICdNaW5pbXVtIFVzZXJuYW1lIExlbmd0aCc7CiRsYW5nWydwcm9tcHRfbWF4dW5sZW4nXSA9ICdNYXhpbXVtIFVzZXJuYW1lIExlbmd0aCc7CiRsYW5nWydwcm9tcHRfc2Vzc2lvbnRpbWVvdXQnXSA9ICdTZXNzaW9uIFRpbWVvdXQgKG1pbnV0ZXMpJzsKJGxhbmdbJ3Byb21wdF9hbGxvd2VtYWlscmVnJ10gPSAnQWxsb3cgRW1haWwgUmVnaXN0cmF0aW9uJzsKJGxhbmdbJ3Byb21wdF9kZmx0Z3JvdXAnXSA9ICdEZWZhdWx0IEdyb3VwIGZvciBuZXcgdXNlcnMnOwokbGFuZ1snY2hhbmdlc2V0dGluZ3NfdGVtcGxhdGUnXSA9ICdDaGFuZ2UgU2V0dGluZ3MgVGVtcGxhdGUnOwokbGFuZ1snZXJyb3JfcGFzc3dvcmRtaXNtYXRjaCddID0gJ1Bhc3N3b3JkcyBEbyBub3QgbWF0Y2gnOwokbGFuZ1snZXJyb3JfaW52YWxpZHVzZXJuYW1lJ10gPSAnSW52YWxpZCBVc2VybmFtZSc7CiRsYW5nWydlcnJvcl9pbnZhbGlkcGFzc3dvcmQnXSA9ICdJbnZhbGlkIFBhc3N3b3JkJzsKJGxhbmdbJ2VkaXR1c2VyJ10gPSAnRWRpdCBVc2VyJzsKJGxhbmdbJ3ZhbGlkJ10gPSAnVmFsaWQnOwokbGFuZ1sndXNlcm5hbWUnXSA9ICdVc2VybmFtZSc7CiRsYW5nWydzdGF0dXMnXSA9ICdTdGF0dXMnOwokbGFuZ1snZXJyb3JfbWVtYmVyZ3JvdXBzJ10gPSAnVGhpcyB1c2VyIGlzIG5vdCBhIG1lbWJlciBvZiBhbnkgZ3JvdXBzJzsKJGxhbmdbJ2Vycm9yX3Byb3BlcnRpZXMnXSA9ICdObyBQcm9wZXJ0aWVzJzsKJGxhbmdbJ3ZhbHVlJ10gPSAnVmFsdWUnOwokbGFuZ1snZ3JvdXBzJ10gPSAnR3JvdXBzJzsKJGxhbmdbJ3Byb3BlcnRpZXMnXSA9ICdQcm9wZXJ0aWVzJzsKJGxhbmdbJ3Byb3BuYW1lJ10gPSAnUHJvcGVydHkgTmFtZSc7CiRsYW5nWydwcm9wdmFsdWUnXSA9ICdQcm9wZXJ0eSBWYWx1ZSc7CiRsYW5nWydhZGQnXSA9ICdBZGQnOwokbGFuZ1snZWRpdCddID0gJ0VkaXQnOwokbGFuZ1snZXhwaXJlcyddID0gJ0V4cGlyZXMnOwokbGFuZ1snc3BlY2lmeV9kYXRlJ10gPSAnU3BlY2lmeSBEYXRlJzsKJGxhbmdbJzEyaHJzJ10gPSAnMTIgT3JlJzsKJGxhbmdbJzI0aHJzJ10gPSAnMjQgT3JlJzsKJGxhbmdbJzQ4aHJzJ10gPSAnNDggT3JlJzsKJGxhbmdbJzF3ZWVrJ10gPSAnMSBTZXR0aW1hbmEnOwokbGFuZ1snMndlZWtzJ10gPSAnMiBTZXR0aW1hbmUnOwokbGFuZ1snMW1vbnRoJ10gPSAnMSBNZXNlJzsKJGxhbmdbJzNtb250aHMnXSA9ICczIE1lc2knOwokbGFuZ1snNm1vbnRocyddID0gJzYgTWVzaSc7CiRsYW5nWycxeWVhciddID0gJzEgQW5ubyc7CiRsYW5nWyduZXZlciddID0gJ01haSc7CiRsYW5nWydwb3N0aW5zdGFsbG1lc3NhZ2UnXSA9ICdNb2R1bGUgaW5zdGFsbGVkIHN1Y2Vzc2Z1bGx5Ljxici8+QmUgc3VyZSB0byBzZXQgdGhlICZxdW90O01vZGlmeSBGcm9udEVuZFVzZXIgUHJvcGVydGllcyBwZXJtaXNzaW9uLiZxdW90Oyc7CiRsYW5nWydwYXNzd29yZCddID0gJ1Bhc3N3b3JkJzsKJGxhbmdbJ3JlcGVhdHBhc3N3b3JkJ10gPSAnRGkgbnVvdm8nOwokbGFuZ1snZXJyb3JfZ3JvdXBuYW1lX2V4aXN0cyddID0gJ0dyb3VwIGJ5IHRoYXQgbmFtZSBhbHJlYWR5IGV4aXN0cyc7CiRsYW5nWydlZGl0Z3JvdXAnXSA9ICdFZGl0IEdyb3VwJzsKJGxhbmdbJ3N1Ym1pdCddID0gJ1N1Ym1pdCc7CiRsYW5nWydjYW5jZWwnXSA9ICdDYW5jZWxsYSc7CiRsYW5nWydkZWxldGUnXSA9ICdDYW5jZWxsYSc7CiRsYW5nWydjb25maXJtX2VkaXRncm91cCddID0gJ0FyZSB5b3Ugc3VyZSB0aGlzIGlzIHRoZSBwcm9wZXIgc2V0dGluZ3MgZm9yIHRoaXMgZ3JvdXA/XG5UdXJuaW5nIGEgcHJvcGVydHkgb2ZmIHdpbGwgbm90IGRlbGV0ZSBhbnkgZW50cmllcyBpbiB0aGUgcHJvcGVydGllcyB0YWJsZSBmb3IgdGhpcyBncm91cC91c2VyLiAgVGhleSB3aWxsIG1lcmVseSBiZSB1bmF2YWlsYWJsZS4nOwokbGFuZ1snYXJleW91c3VyZV9kZWxldGVncm91cCddID0gJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyBncm91cD8nOwokbGFuZ1snY29uZmlybV9kZWxldGVfcHJvcCddID0gJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBjb21wbGV0ZWx5IGRlbGV0ZSB0aGlzIHByb3BlcnR5P1xuRG9pbmcgc28gd2lsbCBhbHNvIGVyYXNlIGFueSB1c2VyIGVudHJpZXMgZm9yIHRoaXMgcHJvcGVydHkuJzsKJGxhbmdbJ2Vycm9yX2luc3VmZmljaWVudHBhcmFtcyddID0gJ0luc3VmZmljaWVudCBQYXJhbWV0ZXJzJzsKJGxhbmdbJ2lkJ10gPSAnSWQnOwokbGFuZ1snbmFtZSddID0gJ05vbWUnOwokbGFuZ1snZXJyb3JfY2FudGFkZGdvcnVwJ10gPSAnUHJvYmxlbSBhZGRpbmcgZ3JvdXAnOwokbGFuZ1snZXJyb3JfaW52YWxpZHBhcmFtcyddID0gJ0ludmFsaWQgUGFyYW1ldGVycyc7CiRsYW5nWydhcHBseWZpbHRlciddID0gJ0FwcGxpY2EnOwokbGFuZ1snZmlsdGVyJ10gPSAnRmlsdGVyJzsKJGxhbmdbJ3VzZXJmaWx0ZXInXSA9ICdVc2VybmFtZSBSZWd1bGFyIEV4cHJlc3Npb24nOwokbGFuZ1snZGVzY3JpcHRpb24nXSA9ICdEZXNjcml6aW9uZSc7CiRsYW5nWydncm91cG5hbWUnXSA9ICdOb21lIGdydXBwbyc7CiRsYW5nWydhY2Nlc3NkZW5pZWQnXSA9ICdBY2Nlc3NvIG5lZ2F0byc7CiRsYW5nWydlcnJvciddID0gJ0Vycm9yZSc7CiRsYW5nWydhZGRncm91cCddID0gJ0FkZCBHcm91cCc7CiRsYW5nWydhZGR1c2VyJ10gPSAnQWRkIFVzZXInOwokbGFuZ1sndXNlcnNmb3VuZCddID0gJ1VzZXJzIGZvdW5kIHRoYXQgbWF0Y2ggdGhlIGNyaXRlcmlhJzsKJGxhbmdbJ2dyb3VwJ10gPSAnR3J1cHBvJzsKJGxhbmdbJ3NlbGVjdGdyb3VwJ10gPSAnU2VsZWN0IEdyb3VwJzsKJGxhbmdbJ3JlZ2lzdHJhdGlvbl90ZW1wbGF0ZSddID0gJ01vZGVsbG8gcmVnaXN0cmF6aW9uZSc7CiRsYW5nWydsb2dvdXRfdGVtcGxhdGUnXSA9ICdMb2dvdXQgVGVtcGxhdGUnOwokbGFuZ1snbG9naW5fdGVtcGxhdGUnXSA9ICdMb2dpbiBUZW1wbGF0ZSc7CiRsYW5nWydwcmVmZXJlbmNlcyddID0gJ1ByZWZlcmVuY2VzJzsKJGxhbmdbJ3VzZXJzJ10gPSAnVXNlcnMnOwokbGFuZ1snZnJpZW5kbHluYW1lJ10gPSAnRnJvbnRlbmQgVXNlciBNYW5hZ21lbnQnOwokbGFuZ1snbW9kZGVzY3JpcHRpb24nXSA9ICdNYW5hZ2UgRnJvbnRlbmQgVXNlcnMnOwokbGFuZ1snZGVmYXVsdGZyb250cGFnZSddID0gJ0RlZmF1bHQgZnJvbnQgcGFnZSc7CiRsYW5nWydsYXN0YWNjZXNzZWRwYWdlJ10gPSAnTGFzdCBhY2Nlc3NlZCBwYWdlJzsKJGxhbmdbJ290aGVycGFnZSddID0gJ0FsdHJhIHBhZ2luYTogJzsKJGxhbmdbJ2NoYW5nZWxvZyddID0gJzx1bD4NCjxsaT4wLjAuMSAtIE9jdG9iZXIsIDIwMDUgLSBJbml0aWFsIE5SUFQgKE5vdCBSZWFkeSBmb3IgUHJpbWUgVGltZSkgcmVsZWFzZTwvbGk+DQo8bGk+MC4xLjAgLSBPY3RvYmVyLCAyMDA1IC0gSW5pdGlhbCByZWxlYXNlPC9saT4NCjxsaT4wLjEuMSAtIE9jdG9iZXIsIDIwMDUgLSBGaXhlZCBpc3N1ZXMgd2l0aCBwcm9wZXJ0aWVzPC9saT4NCjxsaT4wLjEuMiAtIE9jdG9iZXIsIDIwMDUgLSBBZGRlZCBmb3Jnb3R0ZW4gcGFzc3dvcmQgZnVuY3Rpb25hbGl0eTwvbGk+DQo8bGk+PHA+MC4xLjMgLSBOb3ZlbWJlciwgMjAwNTwvcD4NCiAgICA8cD5BZGRlZCB0aGUgYWJpbGl0eSB0byBzcGVjaWZ5IGEgcmVkaXJlY3QgcGFnZSBvbiBsb2dpbiwgbG9nb3V0LCBmb3Jnb3QgcGFzc3dvcmQsIGFuZCBjaGFuZ2Ugc2V0dGluZ3MsIGFuZCBhZGRlZCB0aGUgcmV0dXJudG8gYW5kIGZvcm0gcGFyYW1ldGVycyB0byB0aGUgdXNlciBzaWRlIG9mIHRoaW5ncywgYWxzbyBkaWQgYSBjb3VwbGUgbGYgbGl0dGxlIGNsZWFudXBzLiAgVGhpcyB2ZXJzaW9uIHJlcXVpcmVzIHYwLjExIGFuZCBhYm92ZSBmb3IgY2VydGFpbi48L3A+PC9saT4NCjxsaT4wLjEuNCAtIE5vdmVtYmVyLCAyMDA1IC0gVmVyeSBtaW5vciBjaGFuZ2Ugd2l0aCByZXNwZWN0IHRvIGEgZm9yZ290dGVuIGFuZCBubyBsb25nZXIgbmVlZGVkIGZ1bmN0aW9uIGNhbGw8L2xpPg0KPGxpPjxwPjAuMS41IC0gTm92ZW1iZXIsIDIwMDU8L3A+DQogICAgPHA+QW5vdGhlciB2ZXJ5IG1pbm9yIGNoYW5nZSwgYWRkZWQgc29tZSB0ZXh0IHRvIHRoZSBQb3N0SW5zdGFsbCBtZXNzYWdlLjwvcD48L2xpPg0KPGxpPjxwPjAuMS42IC0gSmFudWFyeSwgMjAwNjxwPg0KICAgIDxwPkNoYW5nZXMgdG8gdGhlIHBlcm1pc3Npb24gbW9kZWwsIGFuZCBtaW5vciBidWcgZml4ZXMgdG8gdGhlIHByZWZlcmVuY2VzLiAgQWxzbyBzb21lIHBocDUgZml4ZXMgYnV0IEkgYW0gc3VyZSB0aGF0IHRoZXJlIGFyZSBtb3JlIG91dCB0aGVyZS48L3A+PC9saT4NCjxsaT48cD4wLjEuNyAtIEphbnVhcnksIDIwMDY8cD4NCiAgICA8cD5NYW55IHRoYW5rcyB0byA8Yj5rYXRvbjwvYj4gZm9yIGFkZGluZyB0aGUgdGV4dGFyZWEgYW5kIGRyb3Bkb3duIHByb3BlcnR5IHR5cGVzLjwvcD4NCiAgICA8cD5GaXhlcyB0byB0aGUgcHJvcGVydHkgYWRkaW5nIHRvIGZpeCBwcm9ibGVtcyB3aXRoIHNwYWNlcyBpbiBwcm9wZXJ0eSBuYW1lcyAod2Ugbm8gbG9uZ2VyIGxldCB0aGF0IGhhcHBlbikuPC9wPg0KPC9saT4NCjxsaT48cD4xLjAuMCAtIEZlYnJ1YXJ5LCAyMDA2PHA+DQogICAgPHA+QWRkZWQgZmlsdGVyaW5nIGFuZCByb3cgbGltaXRpbmcgdG8gdGhlIGFkbWluIHBhbmVsLiBUaGlzIHdpbGwgaGF2ZSBiaWcgYmVuZWZpdHMgdG8gdGhvc2UgdGhhdCBhcmUgdXNpbmcgdGhpcyBtb2R1bGUgZm9yIGhpZ2ggdHJhZmljLCBhbmQgaGlnaCB1c2VyIHNpdGVzLjwvcD4NCiAgICA8cD5BZGRlZCBzb3J0aW5nIHRvIHRoZSBhZG1pbiBwYW5lbDwvcD4NCiAgICA8cD5BZGRlZCBtYXggbGVuZ3RoIGFiaWxpdHkgdG8gdGV4dCBhbmQgZW1haWwgZmllbGRzPC9wPg0KICAgIDxwPkZpeGVkIGEgc21hbGwgcHJvYmxlbSB3aXRoIHRoZSBkZWZhdWx0IGdyb3VwIG5vdCBiZWluZyBjaGVja2VkIHdoZW4gYWRkaW5nIGEgdXNlcjwvcD4NCiAgICA8cD5TYXZlIGZpbHRlciBzZXR0aW5ncyBpbiBwcmVmZXJlbmNlcywgYW5kIHRoZSBhY3RpdmUgdGFiIHRvby48L3A+DQogICAgPHA+RGVsZXRlIHVzZXIgcHJvcGVydGllcyB3aGVuIGEgcHJvcGVydHkgaXMgZGVsZXRlZCA8ZW0+Tm90ZTwvZW0+LCBub3Qgd2hlbiBpdCBpcyBkaXNhYmxlZCBpbiB0aGUgZWRpdCBncm91cCBkaWFsb2c8L3A+DQogICAgPHA+QWRkIGNvbmZpcm1hdGlvbiBtZXNzYWdlIGluIGVkaXQgZ3JvdXBzLjwvcD4NCiAgICA8cD5BZGRlZCBhIGNvdXBsZSBtb3JlIGNvbmZpcm1hdGlvbiBtZXNzYWdlcy48L3A+DQogICAgPHA+QWRkZWQgQ1NWIEV4cG9ydCBvcHRpb248L3A+DQogICAgPHA+VG9kbyAtIEFkZCBwcmVmZXJlbmNlcyBmb3IgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIGZpZWxkbGVuZ3RoPC9wPg0KPC9saT4NCjwvdWw+JzsKJGxhbmdbJ2hlbHAnXSA9ICc8aDM+V2hhdCBEb2VzIFRoaXMgRG8/PC9oMz4NCjxwPlRoaXMgbW9kdWxlIGFsbG93cyBtYW5hZ2VtZW50IGFuZCBhZG1pbmlzdHJhdGlvbiBvZiBmcm9udCBlbmQgdXNlcnMgPGk+KHVzZXJzIHdobyBoYXZlIG5vIGFkbWluIGFjY2Vzc3MpPC9pPi4gIEl0IGFsbG93cyBjcmVhdGlvbiBvZiB1c2VyIGdyb3VwcywgYW5kIHVzZXIgYWNjb3VudHMgYW5kIGFsbG93cyB1c2VycyB0byBsb2dpbiBhbmQgbG9nb3V0LiAgaXQgY2FuIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgQ3VzdG9tQ29udGVudCBtb2R1bGUgdG8gZGlzcGxheSBkaWZmZXJlbnQgY29udGVudCB0byBkaWZmZXJlbnQgdXNlcnMgb25jZSB0aGV5IGhhdmUgbG9nZ2VkIGluPC9wPg0KPGgzPkZlYXR1cmVzPC9oMz4NCjx1bD4NCjxsaT48cD5Vc2VyIGFjY291bnQgZXhwaXJhdGlvbi4gIFlvdSBjYW4gY3JlYXRlIHRlbXBvcmFyeSB1c2VyczwvcD48L2xpPg0KPGxpPjxwPkdyb3VwIFByb3BlcnRpZXMuICBZb3UgY2FuIGFzayBmb3IgZGlmZmVyZW50IGluZm9ybWF0aW9uIGZyb20gbWVtYmVycyBvZiBkaWZmZXJlbnQgZ3JvdXBzPC9wPjwvbGk+DQo8bGk+PHA+Q2FwYWJsZSBvZiBoYW5kbGluZyBodW5kcmVkcyBvZiB1c2VyczwvcD48L2xpPg0KPGxpPjxwPkhhcyBhbiBleHRlbnNpdmUgQVBJIGZvciBhZGRpbmcgZnVuY3Rpb25hbGl0eTwvcD48L2xpPg0KPC91bD4NCjxoMz5Ib3cgZG8gSSB1c2UgaXQ8L2gzPg0KPHVsPg0KPGxpPjxwPkFmdGVyIGluc3RhbGxhdGlvbiB5b3UgY2FuIGFjY2VzcyBhZG1pbiBwYW5lbCB0byB0aGUgRnJvbnRFbmRVc2VycyBtb2R1bGUgdW5kZXIgdGhlICZxdW90O1VzZXJzICZhbXA7IGdHcm91cHMmcXVvdDsgbWVudS48L3A+PC9saT4NCjxsaT4NCjxwPlNlY29uZGx5LCB5b3Ugc2hvdWxkIGRlZmluZSBwcm9wZXJ0aWVzLiAgUHJvcGVydGllcyBhcmUgZXNzZW50aWFsbHkgZmllbGQgZGVmaW5pdGlvbnMsIGhlcmUgeW91IHNwZWNpZnkgdGhlIHR5cGUgb2YgaW5mb3JtYXRpb24geW91IHdhbnQgdG8gZ2F0aGVyLCBhbmQgbGltaXRzLiBpLmU6ICBOYW1lLCBBZ2UsIENpdHksIFN0YXRlLCBDb3VudHJ5LCBFbWFpbCBhZGRyZXNzLCBldGMuPC9wPg0KPHA+PGI+Tm90ZTo8L2I+IFlvdSBkbyBub3QgbmVlZCB0byBkZWZpbmUgcHJvcGVydGllcyBmb3IgdXNlcm5hbWUgYW5kIHBhc3N3b3JkLCB0aGVzZSB3aWxsIGJlIHByb3ZpZGVkIGZvciB5b3U8L2I+DQo8L2xpPg0KPGxpPjxwPk5leHQgeW91IHNob3VsZCBjcmVhdGUgb25lIG9yIG1vcmUgdXNlciBncm91cHMuICBXaGVuIHlvdSBjcmVhdGUgYSBncm91cCwgeW91IGFyZSBhc2tlZCBmb3IgYSBncm91cCBuYW1lLCBhIGRlc2NyaXB0aW9uIGFuZCB0byBhc3NvY2lhdGUgcHJvcGVydGllcyB3aXRoIHRoYXQgZ3JvdXAsIHNwZWNpZnkgdGhlIHByb3BlcnRpZXMgc29ydCBvcmRlciwgYW5kIHdldGhlciBpdCBpcyBhbiBvcHRpb25hbCwgcmVxdWlyZWQsIG9yIGhpZGRlbiBmaWVsZCA8aT4ob2ZmIGlzIGFsc28gdmFsaWQpPC9pPjwvcD48L2xpPg0KPGxpPjxwPjxiPk5vdGU6PC9iPiBCZWZvcmUgcHJvY2VlZGluZywgeW91IHNob3VsZCBlbnN1cmUgdGhhdCB0aGUgcHJlZmVyZW5jZXMgYXJlIHNldCBjb3JyZWN0bHkuPC9wPjwvbGk+DQo8bGk+PHA+VGhpcmRseSB5b3Ugc2hvdWxkIGNyZWF0ZSBzb21lIHVzZXJzLiAgQWRkaW5nIHVzZXJzIGlzIGEgdHdvIHN0ZXAgcHJvY2Vzcy4gIFdoZW4gY3JlYXRpbmcgYSB1c2VyIHlvdSBhcmUgYXNrZWQgZm9yIHRoZSB1c2VybmFtZSBhbmQgcGFzc3dvcmQsIGFuZCBhbiBleHBpcnkgZGF0ZSBmb3IgdGhhdCB1c2VyLiAgWW91IHRoZW4gbXVzdCBzZWxlY3QgdGhlIGdyb3VwcyB0aGF0IHRoYXQgdXNlciBpcyBhIG1lbWJlciBvZiwgYW5kIGNsaWNrIFwmIzAzOTtOZXh0XCYjMDM5OzwvcD4NCjxwPjxlbT5Ob3RlOiA8L2VtPlRoaXMgaXMgYSBsYWJvdXIgaW50ZW5zaXZlIGFuZCBib3JpbmcgcHJvY2VzcywgaXQgaXMgZWFzaWVyIHRvIGxldCB1c2VycyByZWdpc3RlciB0aGVtc2VsdmVzLCBhbmQgdGhlbiB5b3UgY2FuIGVkaXQgdGhlaXIgZ3JvdXAgaW5mb3JtYXRpb24uICBidXQgZm9yIHRlc3RpbmcgcHVycG9zZXMsIHBsZWFzZSBjcmVhdGUgYXQgbGVzdCBvbmUgdXNlcjwvcD48L2xpPg0KPGxpPjxwPkxhc3RseSwgYWZ0ZXIgdGhlIHN5c3RlbSBoYXMgZGV0ZXJtaW5lZCBhbGwgb2YgdGhlIGluZm9ybWF0aW9uIGZpZWxkcyB0byBiZSBwcmVzZW50ZWQgZm9yIHRoYXQgdXNlciwgeW91IGFyZSBwcmVzZW50ZWQgd2l0aCBhIGZvcm0gYXNraW5nIGZvciBhbGwgb2YgdGhlIHJlcXVpcmVkIHVzZXIgaW5mb3JtYXRpb24uICBDb21wbGV0ZSB0aGlzIGZvcm0gdG8gY29tcGxldGUgdGhlIHVzZXIgYWRkaXRpb248L3A+PC9saT4NCjxsaT48cD5Zb3UgYXJlIG5vdyByZWFkeSB0byBhZGQgdGhlIGZyb250IGVuZCBmdW5jdGlvbmFsaXR5IHRvIHlvdXIgc2l0ZS4gIFRoaXMgaXMgYXMgc2ltcGxlIGFzIGFkZGluZyB0aGUge2Ntc19tb2R1bGUgbW9kdWxlPUZyb250RW5kVXNlcnN9IHRhZyB0byB5b3VyIHBhZ2Ugb3IgdGVtcGxhdGU8L3A+PC9saT4NCjwvdWw+DQo8aDM+U3VwcG9ydDwvaDM+DQo8cD5UaGlzIG1vZHVsZSBkb2VzIG5vdCBpbmNsdWRlIGNvbW1lcmNpYWwgc3VwcG9ydC4gSG93ZXZlciwgdGhlcmUgYXJlIGEgbnVtYmVyIG9mIHJlc291cmNlcyBhdmFpbGFibGUgdG8gaGVscCB5b3Ugd2l0aCBpdDo8L3A+DQo8dWw+DQo8bGk+Rm9yIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGlzIG1vZHVsZSwgRkFRcywgb3IgdG8gZmlsZSBhIEJ1ZyBSZXBvcnQgb3IgYnV5IGNvbW1lcmNpYWwgc3VwcG9ydCwgcGxlYXNlIHZpc2l0IGNhbGd1eVwmIzAzOTtzDQptb2R1bGUgaG9tZXBhZ2UgYXQgPGEgaHJlZj0mcXVvdDtodHRwOi8vdGVjaGNvbS5keW5kbnMub3JnJnF1b3Q7PnRlY2hjb20uZHluZG5zLm9yZzwvYT4uPC9saT4NCjxsaT5BZGRpdGlvbmFsIGRpc2N1c3Npb24gb2YgdGhpcyBtb2R1bGUgbWF5IGFsc28gYmUgZm91bmQgaW4gdGhlIDxhIGhyZWY9JnF1b3Q7aHR0cDovL2ZvcnVtLmNtc21hZGVzaW1wbGUub3JnJnF1b3Q7PkNNUyBNYWRlIFNpbXBsZSBGb3J1bXM8L2E+LjwvbGk+DQo8bGk+VGhlIGF1dGhvciwgY2FsZ3V5MTAwMCwgY2FuIG9mdGVuIGJlIGZvdW5kIGluIHRoZSA8YSBocmVmPSZxdW90O2lyYzovL2lyYy5mcmVlbm9kZS5uZXQvI2NtcyZxdW90Oz5DTVMgSVJDIENoYW5uZWw8L2E+LjwvbGk+DQo8bGk+TGFzdGx5LCB5b3UgbWF5IGhhdmUgc29tZSBzdWNjZXNzIGVtYWlsaW5nIHRoZSBhdXRob3IgZGlyZWN0bHkuPC9saT4gIA0KPC91bD4NCjxoMz5QYXJhbWV0ZXJzPC9oMz4NCjx1bD4NCjxsaT48ZW0+KG9wdGlvbmFsKTwvZW0+IGZvcm09JnF1b3Q7bmFtZSZxdW90OzwvbGk+DQo8cD5Gb3JtczoNCjx1bD4NCiA8bGk+PGVtPmxvZ2luPC9lbT4gLSBEaXNwbGF5IHRoZSBsb2dpbiBmb3JtPC9saT4NCiA8bGk+PGVtPmxvZ291dDwvZW0+IC0gRGlzcGxheSB0aGUgbG9nb3V0IGZvcm08L2xpPg0KIDxsaT48ZW0+Y2hhbmdlc2V0dGluZ3M8L2VtPiAtIERpc3BsYXkgdGhlIGNoYW5nZSBzZXR0aW5ncyBmb3JtPC9saT4NCiA8bGk+PGVtPmZvcmdvdHB3PC9lbT4gLSBEaXNwbGF5IHRoZSBmb3Jnb3QgcGFzc3dvcmQgZm9ybTwvbGk+DQo8L3VsPg0KPC9wPg0KPGxpPjxlbT4ob3B0aW9uYWwpPC9lbT4gcmV0dXJudG89JnF1b3Q7cGFnZSZxdW90OzwvbGk+DQo8cD5Vc2VkIHdpdGggdGhlIGxvZ2luLCBsb2dvdXQsIGFuZCBjaGFuZ2VzZXR0aW5ncyBmb3JtcywgdGhpcyBwYXJhbWV0ZXIgY29udGFpbnMgdGhlIHBhZ2UgaWQgb3IgYWxpYXMgb2YgYSBwYWdlIHRvIHJlZGlyZWN0IHRvLCB3aGVuIHRoZSBmb3JtIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQ8L3A+DQo8L3VsPg0KPHA+QXMgcGVyIHRoZSBHUEwsIHRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYXMtaXMuIFBsZWFzZSByZWFkIHRoZSB0ZXh0DQpvZiB0aGUgbGljZW5zZSBmb3IgdGhlIGZ1bGwgZGlzY2xhaW1lci48L3A+DQo8aDM+UmVxdWlyZW1lbnRzPC9oMz4NCjxwPkluIG9yZGVyIHRvIGltcGxlbWVudCB0aGUgZm9yZ290dGVuIHBhc3N3b3JkIGZ1bmN0aW9uYWxpdHksIHRoaXMgbW9kdWxlIHJlcXVpcmVzIHRoZSBDTVNNYWlsZXIgbW9kdWxlIHRvIGJlIHByZXZpb3VzbHkgaW5zdGFsbGVkPC9wPg0KPGgzPkNvcHlyaWdodCBhbmQgTGljZW5zZTwvaDM+DQo8cD5Db3B5cmlnaHQgJmNvcHk7IDIwMDUsIFJvYmVydCBDYW1wYmVsIDxhIGhyZWY9JnF1b3Q7bWFpbHRvOmNhbGd1eTEwMDBAaG90bWFpbC5jb20mcXVvdDs+PGNhbGd1eTEwMDBAaG90bWFpbC5jb20+PC9hPi4gQWxsIFJpZ2h0cyBBcmUgUmVzZXJ2ZWQuPC9wPg0KPHA+VGhpcyBtb2R1bGUgaGFzIGJlZW4gcmVsZWFzZWQgdW5kZXIgdGhlIDxhIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMJnF1b3Q7PkdOVSBQdWJsaWMgTGljZW5zZTwvYT4uIFlvdSBtdXN0IGFncmVlIHRvIHRoaXMgbGljZW5zZSBiZWZvcmUgdXNpbmcgdGhlIG1vZHVsZS48L3A+JzsKPz4=]]></data>
  </file>
  <file>
    <filename>/Random.php</filename>
    <isdir>0</isdir>
    <data><![CDATA[PD9waHANCg0KLyoqDQogKiBHZW5lcmF0ZSByYW5kb20gY2hhcmFjdGVycy4NCiAqDQogKiBAYXV0aG9yICAgIExhdXJlbnRpdSBUYW5hc2UgPGV4cGVydHBocEB5YWhvby5jb20+DQogKiBAdmVyc2lvbiAgIDEuMQ0KICovDQoNCmNsYXNzIFJhbmRvbQ0Kew0KCS8qKg0KCSAqIFNldCBkZWZhdWx0IGNoYXJhY3RlcnMuDQogICAgICoNCiAgICAgKiBAdmFyICAgICAgc3RyaW5nDQogICAgICogQGFjY2VzcyAgIHByaXZhdGUNCiAgICAgKi8NCg0KCXZhciAkX3ZjcnM7DQoNCgkvKioNCgkgKiBJZiBoYXZlIG51bWJlcg0KICAgICAqDQogICAgICogQHZhciAgICAgIGJvb2wNCiAgICAgKiBAYWNjZXNzICAgcHJpdmF0ZQ0KICAgICAqLw0KDQoJdmFyICRfdm51bTsNCg0KCS8qKg0KCSAqIElmIGRvZXNuJ3QgaGF2ZSBudW1iZXINCiAgICAgKg0KICAgICAqIEB2YXIgICAgICBib29sDQogICAgICogQGFjY2VzcyAgIHByaXZhdGUNCiAgICAgKi8NCg0KCXZhciAkX3Zub3Q7DQoNCgkvKioNCgkgKiBDb25zdHJ1Y3Rvcg0KCSAqDQoJICogU2V0IGRlZmF1bHQgdmFsdWVzDQoJICoNCgkgKiBAcGFyYW0gIHN0cmluZyAgJGNycyAgIENoYXJhY3RlcnMgb3V0cHV0DQoJICogQHBhcmFtICBib29sICAgICRudW0gICBXaXRoIG51bWJlcg0KCSAqIEBwYXJhbSAgYm9vbCAgICAkbm90ICAgV2l0aCBub3QgbnVtYmVyDQoJICovDQoNCglmdW5jdGlvbiBSYW5kb20oJGNycyA9IGZhbHNlLCAkbnVtID0gZmFsc2UsICRub3QgPSBmYWxzZSl7DQoJCSR0aGlzLT5fdm51bSA9ICRudW07DQoJCSR0aGlzLT5fdm5vdCA9ICRub3Q7DQoJCWlmKCEkY3JzKXsNCgkJCSR0aGlzLT5fdmNycyA9ICIwMTIzNDU2Nzg5Ii4NCgkJCQkiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiLg0KCQkJCSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiI7DQoJCX1lbHNlew0KCQkJJHRoaXMtPl92Y3JzID0gJGNyczsNCgkJCWlmKCgkbnVtIHx8ICRub3QpICYmICEkdGhpcy0+X3JlYygkY3JzLCAkbnVtLCAkbm90KSl7DQoJCQkJaWYoJG51bSAmJiAkbm90KSAkZXJyID0gIm51bWJlciBvciBub3QgbnVtYmVyIjsNCgkJCQllbHNlaWYoJG51bSkgJGVyciA9ICJudW1iZXIiOw0KCQkJCWVsc2VpZigkbm90KSAkZXJyID0gIm5vdCBudW1iZXIiOw0KCQkJCWVsc2UgJGVyciA9ICJjb21wYXJhdGlvbiI7DQoJCQkJdHJpZ2dlcl9lcnJvcigiQ2xhc3MgUmFuZG9tIC0gU3RyaW5nIGlucHV0IFsgIi4kY3JzLiIgXSBkb2Vzbid0IGhhdmUgIi4kZXJyLCBFX1VTRVJfRVJST1IpOw0KCQkJfQ0KCQl9DQoJfQ0KDQoJLyoqDQoJICogQ29tcGFyZSBpbnB1dCBzdHJpbmcNCgkgKg0KCSAqIEBhY2Nlc3MgIHByaXZhdGUNCgkgKiBAcGFyYW0gICBzdHJpbmcgICAkc3RyICAgICAgQ2hhcmFjdGVycyBpbnB1dA0KCSAqIEBwYXJhbSAgIGJvb2wgICAgICRudW1iZXIgICBIYXZlIG51bWJlcg0KCSAqIEBwYXJhbSAgIGJvb2wgICAgICRub3RudW0gICBIYXZlIG5vdCBudW1iZXINCgkgKiBAcmV0dXJuICBib29sICAgICBJZiBoYXZlIG51bWJlciBvci9hbmQgbm90IG51bWJlcg0KCSAqLw0KDQoJZnVuY3Rpb24gX3JlYygkc3RyLCAkbnVtYmVyID0gdHJ1ZSwgJG5vdG51bSA9IHRydWUpew0KCQkkY250ID0gc3RybGVuKCRzdHIpOw0KCQkkc2V0MSA9ICRzZXQyID0gZmFsc2U7DQoJCWlmKCRudW1iZXIgfHwgJG5vdG51bSl7DQoJCQlmb3IoJGk9MDskaTwkY250OyRpKyspew0KCQkJCWlmKCRzdHJ7JGl9ID09PSBzdHJ2YWwoaW50dmFsKCRzdHJ7JGl9KSkpICRzZXQxID0gdHJ1ZTsNCgkJCQllbHNlICRzZXQyID0gdHJ1ZTsNCgkJCQlpZigkc2V0MSAmJiAkc2V0MikgYnJlYWs7DQoJCQl9DQoJCQlpZigkbnVtYmVyICYmICRub3RudW0pIHJldHVybiAoJHNldDEgJiYgJHNldDIpOw0KCQkJZWxzZWlmKCRudW1iZXIpIHJldHVybiAkc2V0MTsNCgkJCWVsc2VpZigkbm90bnVtKSByZXR1cm4gJHNldDI7DQoJCQllbHNlIHJldHVybiB0cnVlOw0KCQl9ZWxzZSByZXR1cm4gdHJ1ZTsNCgl9DQoNCgkvKioNCgkgKiBHZW5lcmF0ZSByYW5kb20gY2hhcmFjdGVycw0KCSAqDQoJICogQGFjY2VzcyAgcHVibGljDQoJICogQHBhcmFtICAgaW50ICAgICAgJGxlbiAgIExlbmd0aCBvZiB0aGUgc3RyaW5nIHlvdSB3YW50IGdlbmVyYXRlZA0KCSAqIEByZXR1cm4gIHN0cmluZyAgIFJhbmRvbSBjaGFyYWN0ZXJzDQoJICovDQoNCglmdW5jdGlvbiBnZXQoJGxlbil7DQoJCWlmKCEoaXNfaW50KCRsZW4pICYmICRsZW4gPiAwKSkgcmV0dXJuICR0aGlzLT5fdmNyczsNCgkJJHJldCA9ICIiOw0KCQkkY250ID0gc3RybGVuKCR0aGlzLT5fdmNycyktMTsNCgkJZm9yKCRpPTA7JGk8JGxlbjskaSsrKSAkcmV0IC49ICR0aGlzLT5fdmNyc3tyYW5kKDAsICRjbnQpfTsNCgkJaWYoJHRoaXMtPl92bnVtIHx8ICR0aGlzLT5fdm5vdCkgcmV0dXJuICR0aGlzLT5fcmVjKCRyZXQsICR0aGlzLT5fdm51bSwgJHRoaXMtPl92bm90KSA/ICRyZXQgOiBSYW5kb206OmdldCgkbGVuKTsNCgkJZWxzZSByZXR1cm4gJHJldDsNCgl9DQoNCn0NCg0KPz4=]]></data>
  </file>
  <file>
    <filename>/templates/</filename>
    <isdir>1</isdir>
  </file>
  <file>
    <filename>/templates/addgroup.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[eyR0aXRsZX0Ke2lmICRtZXNzYWdlICE9ICcnfQogIHtpZiAkZXJyb3IgIT0gJyd9CiAgICA8cD48Zm9udCBjb2xvcj0icmVkIj57JG1lc3NhZ2V9PC9mb250PjwvcD4KICB7ZWxzZX0KICAgIDxwPnskbWVzc2FnZX08L3A+CiAgey9pZn0Key9pZn0KeyRzdGFydGZvcm19CiAgPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+eyRwcm9tcHRfZ3JvdXBuYW1lfTwvcD4KICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaW5wdXRfZ3JvdXBuYW1lfTwvcD4KICA8L2Rpdj4KICA8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHByb21wdF9ncm91cGRlc2N9PC9wPgogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dF9ncm91cGRlc2N9PC9wPgogIDwvZGl2Pgp7aWYgJHByb3Bjb3VudCA+IDB9Cjxici8+Cjx0YWJsZSBjZWxsc3BhY2luZz0iMCIgY2xhc3M9InBhZ2V0YWJsZSI+Cgk8dGhlYWQ+CgkJPHRyPgoJCQk8dGg+eyRuYW1ldGV4dH08L3RoPgoJICAgICAgICAgICAgICAgIDx0aD57JHByb21wdHRleHR9PC90aD4KCQkJPHRoPnskdHlwZXRleHR9PC90aD4KCSAgICAgICAgICAgICAgICA8dGg+eyRzb3J0b3JkZXJ0ZXh0fTwvdGg+CgkJCTx0aD57JHJlcXVpcmVkdGV4dH08L3RoPgoJCTwvdHI+Cgk8L3RoZWFkPgoJPHRib2R5Pgp7Zm9yZWFjaCBmcm9tPSRwcm9wcyBpdGVtPXByb3BlfQoJCTx0ciBjbGFzcz0ieyRwcm9wLT5yb3djbGFzc30iPgoJCQk8dGQ+eyRwcm9wZS0+bmFtZX08L3RkPgoJCQk8dGQ+eyRwcm9wZS0+cHJvbXB0fTwvdGQ+CgkJCTx0ZD57JHByb3BlLT50eXBlfTwvdGQ+CgkgICAgICAgICAgICAgICAgPHRkPnskcHJvcGUtPnNvcnRvcmRlcn08L3RkPgoJCQk8dGQ+eyRwcm9wZS0+cmVxdWlyZWR9PC90ZD4KCQk8L3RyPgp7L2ZvcmVhY2h9Cgk8L3Rib2R5Pgo8L3RhYmxlPgp7L2lmfQogIDxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgICA8cCBjbGFzcz0icGFnZXRleHQiPiZuYnNwOzwvcD4KICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaGlkZGVufXskc3VibWl0fXskY2FuY2VsfTwvcD4KICA8L2Rpdj4KeyRlbmRmb3JtfQo=]]></data>
  </file>
  <file>
    <filename>/templates/addprop.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[eyR0aXRsZX0Ke2lmICRtZXNzYWdlICE9ICcnfQogIHtpZiAkZXJyb3IgIT0gJyd9CiAgICA8cD48Zm9udCBjb2xvcj0icmVkIj57JG1lc3NhZ2V9PC9mb250PjwvcD4KICB7ZWxzZX0KICAgIDxwPnskbWVzc2FnZX08L3A+CiAgey9pZn0Key9pZn0KeyRzdGFydGZvcm19Cnskb3JpZ190eXBlfQp7JGVkaXRwcm9wfTxici8+CnskaW5mb21zZzF9PGJyLz4KeyRpbmZvbXNnMn08aHIvPgogIDxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgICA8cCBjbGFzcz0icGFnZXRleHQiPnskcHJvbXB0X25hbWV9PC9wPgogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dF9uYW1lfTwvcD4KICA8L2Rpdj4KICA8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHByb21wdF9wcm9tcHR9PC9wPgogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dF9wcm9tcHR9PC9wPgogIDwvZGl2PgogIDxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgICA8cCBjbGFzcz0icGFnZXRleHQiPnskcHJvbXB0X3R5cGV9PC9wPgogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dF90eXBlfTwvcD4KICA8L2Rpdj4KICA8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHByb21wdH08L3A+CiAgICA8cCBjbGFzcz0icGFnZWlucHV0Ij57JGlucHV0fTwvcD4KICA8L2Rpdj4KICA8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHByb21wdDJ9PC9wPgogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dDJ9PC9wPgogIDwvZGl2PgogIDxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgICA8cCBjbGFzcz0icGFnZXRleHQiPiZuYnNwOzwvcD4KICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaGlkZGVufXskc3VibWl0fXskY2FuY2VsfTwvcD4KICA8L2Rpdj4KeyRlbmRmb3JtfQo=]]></data>
  </file>
  <file>
    <filename>/templates/addprop2.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[eyR0aXRsZX0Ke2lmICRtZXNzYWdlICE9ICcnfQogIHtpZiAkZXJyb3IgIT0gJyd9CiAgICA8cD48Zm9udCBjb2xvcj0icmVkIj57JG1lc3NhZ2V9PC9mb250PjwvcD4KICB7ZWxzZX0KICAgIDxwPnskbWVzc2FnZX08L3A+CiAgey9pZn0Key9pZn0KeyRzdGFydGZvcm19CiAgeyRpbnB1dF9uYW1lfQogIHskaW5wdXRfcHJvbXB0fQogIHskaW5wdXRfdHlwZX0KICA8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHByb21wdDF9PC9wPgogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dDF9PC9wPgogIDwvZGl2PgogIDxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgICA8cCBjbGFzcz0icGFnZXRleHQiPnskcHJvbXB0Mn08L3A+CiAgICA8cCBjbGFzcz0icGFnZWlucHV0Ij57JGlucHV0Mn08L3A+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+Jm5ic3A7PC9wPgogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRoaWRkZW59eyRzdWJtaXR9eyRjYW5jZWx9PC9wPgogIDwvZGl2Pgp7JGVuZGZvcm19Cg==]]></data>
  </file>
  <file>
    <filename>/templates/adduser1.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[eyR0aXRsZX0Ke2lmICRtZXNzYWdlICE9ICcnfQogIHtpZiAkZXJyb3IgIT0gJyd9CiAgICA8cD48Zm9udCBjb2xvcj0icmVkIj57JG1lc3NhZ2V9PC9mb250PjwvcD4KICB7ZWxzZX0KICAgIDxwPnskbWVzc2FnZX08L3A+CiAgey9pZn0Key9pZn0KeyRzdGFydGZvcm19CiAgPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+eyRwcm9tcHRfdXNlcm5hbWV9PC9wPgogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dF91c2VybmFtZX08L3A+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+eyRwcm9tcHRfcGFzc3dvcmR9PC9wPgogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dF9wYXNzd29yZH08L3A+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+eyRwcm9tcHRfcmVwZWF0cGFzc3dvcmR9PC9wPgogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dF9yZXBlYXRwYXNzd29yZH08L3A+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+eyRwcm9tcHRfZXhwaXJlc308L3A+CiAgICA8cCBjbGFzcz0icGFnZWlucHV0Ij57aHRtbF9zZWxlY3RfZGF0ZSBwcmVmaXg9JGV4cGlyZXNfZGF0ZXByZWZpeCB0aW1lPSRleHBpcmVzZGF0ZSBzdGFydF95ZWFyPTIwMDAgZW5kX3llYXI9MjA0MH0ge2h0bWxfc2VsZWN0X3RpbWUgcHJlZml4PSRleHBpcmVzZGF0ZXByZWZpeCB0aW1lPSRleHBpcmVzZGF0ZX08L3A+CiAgPC9kaXY+CntpZiAkaXRlbWNvdW50ID4gMH0KPGJyLz4KeyRncm91cHN0aXRsZX0KPHRhYmxlIGNlbGxzcGFjaW5nPSIwIiBjbGFzcz0icGFnZXRhYmxlIj4KCTx0aGVhZD4KCQk8dHI+CgkJCTx0aCB3aWR0aD0iNSUiPnskaWR0ZXh0fTwvdGg+CgkJCTx0aD57JG5hbWV0ZXh0fTwvdGg+CgkJCTx0aD57JGRlc2N0ZXh0fTwvdGg+CgkJCTx0aCBjbGFzcz0icGFnZWljb24iPiZuYnNwOzwvdGg+CgkJPC90cj4KCTwvdGhlYWQ+Cgk8dGJvZHk+Cntmb3JlYWNoIGZyb209JGl0ZW1zIGl0ZW09ZW50cnl9CgkJPHRyIGNsYXNzPSJ7JGVudHJ5LT5yb3djbGFzc30iPgoJCQk8dGQ+eyRlbnRyeS0+aWR9PC90ZD4KCQkJPHRkPnskZW50cnktPm5hbWV9PC90ZD4KCQkJPHRkPnskZW50cnktPmRlc2N9PC90ZD4KCQkJPHRkPnskZW50cnktPm1lbWJlcn08L3RkPgoJCTwvdHI+CnsvZm9yZWFjaH0KCTwvdGJvZHk+CjwvdGFibGU+CnsvaWZ9CiAgPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+Jm5ic3A7PC9wPgogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRoaWRkZW59eyR1c2VyX2lkfXskc3VibWl0fXskY2FuY2VsfTwvcD4KICA8L2Rpdj4KeyRlbmRmb3JtfQo=]]></data>
  </file>
  <file>
    <filename>/templates/adduser2.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[eyR0aXRsZX0Ke2lmICRtZXNzYWdlICE9ICcnfQogIHtpZiAkZXJyb3IgIT0gJyd9CiAgICA8cD48Zm9udCBjb2xvcj0icmVkIj57JG1lc3NhZ2V9PC9mb250PjwvcD4KICB7ZWxzZX0KICAgIDxwPnskbWVzc2FnZX08L3A+CiAgey9pZn0Key9pZn0KeyRzdGFydGZvcm19CntpZiAkY29udHJvbGNvdW50ID4gMH0KICA8Y2VudGVyPgogIDx0YWJsZSB3aWR0aD0iNzUlIj4Ke2ZvcmVhY2ggZnJvbT0kY29udHJvbHMgaXRlbT1jb250cm9sfQogIDx0cj4KICAgIDx0ZD57JGNvbnRyb2wtPmhpZGRlbn08Zm9udCBjb2xvcj0ieyRjb250cm9sLT5jb2xvcn0iPnskY29udHJvbC0+cHJvbXB0fXskY29udHJvbC0+bWFya2VyfTwvZm9udD48L3RkPgogICAgPHRkPnskY29udHJvbC0+Y29udHJvbH08L3RkPgogIDwvdHI+CnsvZm9yZWFjaH0KICA8L3RhYmxlPgogIDwvY2VudGVyPgo8YnIvPgp7L2lmfQp7JGhpZGRlbn17JGhpZGRlbjJ9eyRiYWNrfXskc3VibWl0fXskY2FuY2VsfQp7JGVuZGZvcm19Cg==]]></data>
  </file>
  <file>
    <filename>/templates/adminprefs.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[e2lmICRtZXNzYWdlIT0nJ308cD57JG1lc3NhZ2V9PC9wPnsvaWZ9Cnskc3RhcnRmb3JtfQo8dGFibGUgd2lkdGg9IjEwMCUiPgogIDx0cj4KICAgIDx0ZCB3aWR0aD0iNTAlIj4KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHByb21wdF9taW5wd2xlbn06PC9wPgoJCTxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaW5wdXRfbWlucHdsZW59PC9wPgoJPC9kaXY+Cgk8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgoJCTxwIGNsYXNzPSJwYWdldGV4dCI+eyRwcm9tcHRfbWF4cHdsZW59OjwvcD4KCQk8cCBjbGFzcz0icGFnZWlucHV0Ij57JGlucHV0X21heHB3bGVufTwvcD4KCTwvZGl2PgoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KCQk8cCBjbGFzcz0icGFnZXRleHQiPnskcHJvbXB0X21pbnVubGVufTo8L3A+CgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dF9taW51bmxlbn08L3A+Cgk8L2Rpdj4KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHByb21wdF9tYXh1bmxlbn06PC9wPgoJCTxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaW5wdXRfbWF4dW5sZW59PC9wPgoJPC9kaXY+Cgk8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgoJCTxwIGNsYXNzPSJwYWdldGV4dCI+eyRwcm9tcHRfc2Vzc2lvbnRpbWVvdXR9OjwvcD4KCQk8cCBjbGFzcz0icGFnZWlucHV0Ij57JGlucHV0X3Nlc3Npb250aW1lb3V0fTwvcD4KCTwvZGl2PgoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KCQk8cCBjbGFzcz0icGFnZXRleHQiPnskcHJvbXB0X3NtdHB2YWxpZGF0ZX06PC9wPgoJCTxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaW5wdXRfc210cHZhbGlkYXRlfSZuYnNwOzxzdHJvbmc+eyRpbmZvX3NtdHB2YWxpZGF0ZX08L3N0cm9uZz48L3A+Cgk8L2Rpdj4KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHByb21wdF9yZXF1aXJlb25lZ3JvdXB9OjwvcD4KCQk8cCBjbGFzcz0icGFnZWlucHV0Ij57JGlucHV0X3JlcXVpcmVvbmVncm91cH08L3A+Cgk8L2Rpdj4KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHByb21wdF9kZmx0Z3JvdXB9OjwvcD4KCQk8cCBjbGFzcz0icGFnZWlucHV0Ij57JGlucHV0X2RmbHRncm91cH08L3A+Cgk8L2Rpdj4KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHByb21wdF9yZXF1aXJlZG1hcmtlcn06PC9wPgoJCTxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaW5wdXRfcmVxdWlyZWRtYXJrZXJ9PC9wPgoJPC9kaXY+Cgk8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgoJCTxwIGNsYXNzPSJwYWdldGV4dCI+eyRwcm9tcHRfcmVxdWlyZWRjb2xvcn06PC9wPgoJCTxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaW5wdXRfcmVxdWlyZWRjb2xvcn08L3A+Cgk8L2Rpdj4KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHByb21wdF9oaWRkZW5tYXJrZXJ9OjwvcD4KCQk8cCBjbGFzcz0icGFnZWlucHV0Ij57JGlucHV0X2hpZGRlbm1hcmtlcn08L3A+Cgk8L2Rpdj4KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHByb21wdF9oaWRkZW5jb2xvcn06PC9wPgoJCTxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaW5wdXRfaGlkZGVuY29sb3J9PC9wPgoJPC9kaXY+Cgk8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgoJCTxwIGNsYXNzPSJwYWdldGV4dCI+Jm5ic3A7PC9wPgoJCTxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaGlkZGVufXskc3VibWl0fXskY2FuY2VsfTwvcD4KCTwvZGl2PgogICA8dGQ+CiAgIDx0ZCB3aWR0aD0iNTAlIiB2YWxpZ249InRvcCI+Cgk8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgoJCTxwIGNsYXNzPSJwYWdldGV4dCI+eyRwcm9tcHRfZm9yZ290cHdfcGFnZX06PC9wPgoJCTxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaW5wdXRfZm9yZ290cHdfcGFnZX08L3A+Cgk8L2Rpdj4KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHByb21wdF9jaGFuZ2VzZXR0aW5nc19wYWdlfTo8L3A+CgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dF9jaGFuZ2VzZXR0aW5nc19wYWdlfTwvcD4KCTwvZGl2PgoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KCQk8cCBjbGFzcz0icGFnZXRleHQiPnskcHJvbXB0X2xvZ2luX3BhZ2V9OjwvcD4KCQk8cCBjbGFzcz0icGFnZWlucHV0Ij57JGlucHV0X2xvZ2luX3BhZ2V9PC9wPgoJPC9kaXY+Cgk8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgoJCTxwIGNsYXNzPSJwYWdldGV4dCI+eyRwcm9tcHRfbG9nb3V0X3BhZ2V9OjwvcD4KCQk8cCBjbGFzcz0icGFnZWlucHV0Ij57JGlucHV0X2xvZ291dF9wYWdlfTwvcD4KCTwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgoJPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHByb21wdF9udW1yZXNldHJlY29yZHN9PC9wPgoJPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRkYXRhX251bXJlc2V0cmVjb3Jkc308L3A+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgoJPHAgY2xhc3M9InBhZ2V0ZXh0Ij4mbmJzcDs8L3A+Cgk8cCBjbGFzcz0icGFnZWlucHV0Ij57JGlucHV0X3JlbW92ZTF3ZWVrfXskaW5wdXRfcmVtb3ZlMW1vbnRofXskaW5wdXRfcmVtb3ZlYWxsfTwvcD4KICAgICAgPC9kaXY+CiAgIDwvdGQ+CiA8L3RhYmxlPgp7JGVuZGZvcm19Cg==]]></data>
  </file>
  <file>
    <filename>/templates/admintasks.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[e2lmICRtZXNzYWdlIT0nJ308cD57JG1lc3NhZ2V9PC9wPnsvaWZ9Cnskc3RhcnRmb3JtfQo8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogIDxwIGNsYXNzPSJwYWdldGV4dCI+eyRwcm9tcHRfZXhwb3J0fTo8L3A+CiAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dF9leHBvcnR9PC9wPgo8L2Rpdj4KPGhyLz4KeyRlbmRmb3JtfQo=]]></data>
  </file>
  <file>
    <filename>/templates/edituserprops.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[eyR0aXRsZX0Ke2lmICRtZXNzYWdlICE9ICcnfQogIHtpZiAkZXJyb3IgIT0gJyd9CiAgICA8cD48Zm9udCBjb2xvcj0icmVkIj57JG1lc3NhZ2V9PC9mb250PjwvcD4KICB7ZWxzZX0KICAgIDxwPnskbWVzc2FnZX08L3A+CiAgey9pZn0Key9pZn0KeyRzdGFydGZvcm19CiAgPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+eyRwcm9tcHRfcHJvcG5hbWV9PC9wPgogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dF9wcm9wbmFtZX08L3A+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+eyRwcm9tcHRfcHJvcHZhbHVlfTwvcD4KICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaW5wdXRfcHJvcHZhbHVlfTwvcD4KICA8L2Rpdj4KICA8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij4mbmJzcDs8L3A+CiAgICA8cCBjbGFzcz0icGFnZWlucHV0Ij57JGhpZGRlbnBhcmFtc317JHN1Ym1pdH08L3A+CiAgPC9kaXY+CnskZW5kZm9ybX0K]]></data>
  </file>
  <file>
    <filename>/templates/error.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[PGgzPnskdGl0bGVfZXJyb3J9PC9oMz4KPHA+eyRhZG1pbl9uYXZ9PC9wPgp7aWYgJG1lc3NhZ2UhPScnfTxwPnskbWVzc2FnZX08L3A+ey9pZn0=]]></data>
  </file>
  <file>
    <filename>/templates/forgotpw_templateform.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[eyRzdGFydGZvcm19CjxwPnskcHJvbXB0X3RlbXBsYXRlMX08L3A+CnskaW5wdXRfdGVtcGxhdGUxfQo8YnIvPgo8cD57JHByb21wdF90ZW1wbGF0ZTJ9PC9wPgp7JGlucHV0X3RlbXBsYXRlMn0KPGJyLz4KPHA+eyRwcm9tcHRfdGVtcGxhdGUzfTwvcD4KeyRpbnB1dF90ZW1wbGF0ZTN9Cjxici8+Cnskc3VibWl0fXskZGVmYXVsdHN9CnskZW5kZm9ybX0K]]></data>
  </file>
  <file>
    <filename>/templates/grouplist.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[PHA+eyRpdGVtY291bnR9Jm5ic3A7eyRncm91cHNmb3VuZH08L3A+CntpZiAkaXRlbWNvdW50ID4gMH0KPHRhYmxlIGNlbGxzcGFjaW5nPSIwIiBjbGFzcz0icGFnZXRhYmxlIj4KCTx0aGVhZD4KCQk8dHI+CgkJCTx0aCB3aWR0aD0iNSUiPnskaWR0ZXh0fTwvdGg+CgkJCTx0aD57JG5hbWV0ZXh0fTwvdGg+CgkJCTx0aD57JGRlc2N0ZXh0fTwvdGg+CgkJCTx0aCBjbGFzcz0icGFnZWljb24iPiZuYnNwOzwvdGg+CgkJCTx0aCBjbGFzcz0icGFnZWljb24iPiZuYnNwOzwvdGg+CgkJPC90cj4KCTwvdGhlYWQ+Cgk8dGJvZHk+Cntmb3JlYWNoIGZyb209JGl0ZW1zIGl0ZW09ZW50cnl9CgkJPHRyIGNsYXNzPSJ7JGVudHJ5LT5yb3djbGFzc30iPgoJCQk8dGQ+eyRlbnRyeS0+aWR9PC90ZD4KCQkJPHRkPnskZW50cnktPm5hbWV9PC90ZD4KCQkJPHRkPnskZW50cnktPmRlc2N9PC90ZD4KCQkJPHRkPnskZW50cnktPmVkaXRsaW5rfTwvdGQ+CgkJCTx0ZD57JGVudHJ5LT5kZWxldGVsaW5rfTwvdGQ+CgkJPC90cj4Key9mb3JlYWNofQoJPC90Ym9keT4KPC90YWJsZT4Key9pZn0KPGRpdiBjbGFzcz0icGFnZW9wdGlvbnMiPjxwIGNsYXNzPSJwYWdlb3B0aW9ucyI+eyRhZGRsaW5rfTwvcD48L2Rpdj4K]]></data>
  </file>
  <file>
    <filename>/templates/propertiesform.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[eyR0aXRsZX0Ke2lmICRtZXNzYWdlICE9ICcnfQogIHtpZiAkZXJyb3IgIT0gJyd9CiAgICA8cD48Zm9udCBjb2xvcj0icmVkIj57JG1lc3NhZ2V9PC9mb250PjwvcD4KICB7ZWxzZX0KICAgIDxwPnskbWVzc2FnZX08L3A+CiAgey9pZn0Key9pZn0KPGRpdiBjbGFzcz0icGFnZW9wdGlvbnMiPgo8cD57JHByb3Bjb3VudH0mbmJzcDt7JHByb3BzZm91bmR9PC9wPgp7aWYgJHByb3Bjb3VudCA+IDB9Cjxici8+Cjx0YWJsZSBjZWxsc3BhY2luZz0iMCIgY2xhc3M9InBhZ2V0YWJsZSI+Cgk8dGhlYWQ+CgkJPHRyPgoJCQk8dGg+eyRuYW1ldGV4dH08L3RoPgoJCQk8dGg+eyRwcm9tcHR0ZXh0fTwvdGg+CgkJCTx0aD57JHR5cGV0ZXh0fTwvdGg+CgkJCTx0aD57JGxlbmd0aHRleHR9PC90aD4KCQkJPHRoIGNsYXNzPSJwYWdlaWNvbiI+Jm5ic3A7PC90aD4KCQkJPHRoIGNsYXNzPSJwYWdlaWNvbiI+Jm5ic3A7PC90aD4KCQk8L3RyPgoJPC90aGVhZD4KCTx0Ym9keT4Ke2ZvcmVhY2ggZnJvbT0kcHJvcHMgaXRlbT1wcm9wZX0KCQk8dHIgY2xhc3M9InskcHJvcGUtPnJvd2NsYXNzfSI+CgkJCTx0ZD57JHByb3BlLT5uYW1lfTwvdGQ+CgkJCTx0ZD57JHByb3BlLT5wcm9tcHR9PC90ZD4KCQkJPHRkPnskcHJvcGUtPnR5cGV9PC90ZD4KCQkJPHRkPnskcHJvcGUtPmxlbmd0aH08L3RkPgoJCQk8dGQ+eyRwcm9wZS0+ZWRpdGxpbmt9PC90ZD4KCQkJPHRkPnskcHJvcGUtPmRlbGV0ZWxpbmt9PC90ZD4KCQk8L3RyPgp7L2ZvcmVhY2h9Cgk8L3Rib2R5Pgo8L3RhYmxlPgp7L2lmfQo8L2Rpdj4KPGJyLz4KPHA+eyRhZGRsaW5rfTwvcD4K]]></data>
  </file>
  <file>
    <filename>/templates/templateform.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[eyRzdGFydGZvcm19CjxwPnskcHJvbXB0X3RlbXBsYXRlfTwvcD4KeyRpbnB1dF90ZW1wbGF0ZX0KPGJyLz4KeyRzdWJtaXR9eyRkZWZhdWx0c30KeyRlbmRmb3JtfQo=]]></data>
  </file>
  <file>
    <filename>/templates/userlist.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[eyRzdGFydGZvcm19CjxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiA8cCBjbGFzcz0icGFnZXRleHQiPjxzdHJvbmc+eyRwcm9tcHRfZmlsdGVyfTo8L3N0cm9uZz48L3A+CiA8cCBjbGFzcz0icGFnZWlucHV0Ij4mbmJzcDs8L3A+CjwvZGl2Pgo8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHByb21wdF9ncm91cH08L3A+CiA8cCBjbGFzcz0icGFnZWlucHV0Ij57JGZpbHRlcl9ncm91cH08L3A+CjwvZGl2Pgo8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHByb21wdF91c2VyZmlsdGVyfTwvcD4KIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskZmlsdGVyX3JlZ2V4fTwvcD4KPC9kaXY+CjxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiA8cCBjbGFzcz0icGFnZXRleHQiPnskcHJvbXB0X2xpbWl0fTwvcD4KIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskZmlsdGVyX2xpbWl0fTwvcD4KPC9kaXY+CjxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiA8cCBjbGFzcz0icGFnZXRleHQiPjxzdHJvbmc+eyRwcm9tcHRfc29ydH06PC9zdHJvbmc+PC9wPgogPHAgY2xhc3M9InBhZ2VpbnB1dCI+Jm5ic3A7PC9wPgo8L2Rpdj4KPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KIDxwIGNsYXNzPSJwYWdldGV4dCI+eyRwcm9tcHRfc29ydGJ5fTwvcD4KIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskZmlsdGVyX3NvcnRieX08L3A+CjwvZGl2Pgo8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogPHAgY2xhc3M9InBhZ2V0ZXh0Ij4mbmJzcDs8L3A+CiA8cCBjbGFzcz0icGFnZWlucHV0Ij57JGlucHV0X3NlbGVjdH17JGlucHV0X2hpZGRlbn08L3A+PGJyLz4KPC9kaXY+CnskZW5kZm9ybX0KPGhyIHdpZHRoPSI1MCUiIGFsaWduPSJsZWZ0Ii8+CjxkaXYgY2xhc3M9InBhZ2VvcHRpb25zIj4KIDxwPnskbnVtdXNlcnN9Jm5ic3A7eyR1c2Vyc2luZ3JvdXB9PC9wPgogPHA+eyRpdGVtY291bnR9Jm5ic3A7eyR1c2Vyc2ZvdW5kfTwvcD4Ke2lmICRpdGVtY291bnQgPiAwfQo8dGFibGUgY2VsbHNwYWNpbmc9IjAiIGNsYXNzPSJwYWdldGFibGUiPgoJPHRoZWFkPgoJCTx0cj4KCQkJPHRoPnskdXNlcm5hbWV0ZXh0fTwvdGg+CgkJCTx0aD57JGNyZWF0ZWR0ZXh0fTwvdGg+CgkJCTx0aD57JGV4cGlyZXN0ZXh0fTwvdGg+CgkJCTx0aCBjbGFzcz0icGFnZWljb24iPiZuYnNwOzwvdGg+CgkJCTx0aCBjbGFzcz0icGFnZWljb24iPiZuYnNwOzwvdGg+CgkJPC90cj4KCTwvdGhlYWQ+Cgk8dGJvZHk+Cntmb3JlYWNoIGZyb209JGl0ZW1zIGl0ZW09ZW50cnl9CgkJPHRyIGNsYXNzPSJ7JGVudHJ5LT5yb3djbGFzc30iPgoJCQk8dGQ+eyRlbnRyeS0+dXNlcm5hbWV9PC90ZD4KCQkJPHRkPnskZW50cnktPmNyZWF0ZWR9PC90ZD4KCQkJPHRkPnskZW50cnktPmV4cGlyZXN9PC90ZD4KCQkJPHRkPnskZW50cnktPmVkaXRsaW5rfTwvdGQ+CgkJCTx0ZD57JGVudHJ5LT5kZWxldGVsaW5rfTwvdGQ+CgkJPC90cj4JIAp7L2ZvcmVhY2h9Cgk8L3Rib2R5Pgo8L3RhYmxlPgp7L2lmfQogPHA+eyRhZGRsaW5rfTwvcD4KPC9kaXY+Cg==]]></data>
  </file>
  <file>
    <filename>/UserManipulator.class.php</filename>
    <isdir>0</isdir>
    <data><![CDATA[PD9waHAKCmNsYXNzIFVzZXJNYW5pcHVsYXRvcgp7CiAgdmFyICRtb2Q7CgogIGZ1bmN0aW9uIENvdW50VGVtcENvZGVSZWNvcmRzKCkKICB7CiAgICByZXR1cm4gMDsKICB9CgogIC8qIGV4cGlyeWNvZGUgaXMgYSBzdHJ0b3RpbWUgc3RyaW5nICovCiAgZnVuY3Rpb24gRXhwaXJlVGVtcENvZGVzKCRleHBpcnljb2RlKQogIHsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIGZ1bmN0aW9uIFJlbW92ZVVzZXJUZW1wQ29kZSggJHVpZCApCiAgewogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgZnVuY3Rpb24gR2V0VXNlclRlbXBDb2RlKCAkdWlkICkKICB7CiAgICByZXR1cm4gYXJyYXkoRkFMU0UsIkZ1bmN0aW9uIG5vdCBpbXBsZW1lbnRlZCIpOwogIH0KCiAgZnVuY3Rpb24gU2V0VXNlclRlbXBDb2RlKCAkdWlkLCAkY29kZSApCiAgewogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgZnVuY3Rpb24gU2V0UHJvcGVydHlEZWZuKCAkbmFtZSwgJG5ld25hbWUsICRwcm9tcHQsICRsZW5ndGgsICR0eXBlICkKICB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBmdW5jdGlvbiBEZWxldGVQcm9wZXJ0eURlZm4oICRuYW1lICkKICB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBmdW5jdGlvbiBHZXRQcm9wZXJ0eUdyb3VwUmVsYXRpb25zKCAkdGl0bGUgKQogIHsKICAgIHJldHVybiBhcnJheShGQUxTRSwiRnVuY3Rpb24gbm90IGltcGxlbWVudGVkIik7CiAgfQoKICBmdW5jdGlvbiBJc0FjY291bnRFeHBpcmVkKCAkdWlkICkKICB7CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIGZ1bmN0aW9uIEdldEdyb3VwUHJvcGVydHlSZWxhdGlvbnMoICRncnBpZCApCiAgewogICAgcmV0dXJuIGFycmF5KEZBTFNFLCJGdW5jdGlvbiBub3QgaW1wbGVtZW50ZWQiKTsKICB9CgoKICBmdW5jdGlvbiBBZGRHcm91cFByb3BlcnR5UmVsYXRpb24oICRncnBpZCwgJHByb3BuYW1lLCAkc29ydGtleSwgJHZhbCApCiAgewogICAgcmV0dXJuIGFycmF5KEZBTFNFLCJGdW5jdGlvbiBub3QgaW1wbGVtZW50ZWQiKTsKICB9CgoKICBmdW5jdGlvbiBEZWxldGVBbGxHcm91cFByb3BlcnR5UmVsYXRpb25zKCAkZ3JwaWQgKQogIHsKICAgIHJldHVybiBhcnJheShGQUxTRSwiRnVuY3Rpb24gbm90IGltcGxlbWVudGVkIik7CiAgfQoKCiAgZnVuY3Rpb24gRGVsZXRlR3JvdXBQcm9wZXJ0eVJlbGF0aW9uKCAkZ3JwaWQsICRwcm9wbmFtZSApCiAgewogICAgcmV0dXJuIGFycmF5KEZBTFNFLCJGdW5jdGlvbiBub3QgaW1wbGVtZW50ZWQiKTsKICB9CgoKICBmdW5jdGlvbiBMb2dpbiggJHVzZXJuYW1lLCAkcGFzc3dvcmQgKQogIHsKICAgIHJldHVybiBhcnJheShGQUxTRSwiRnVuY3Rpb24gbm90IGltcGxlbWVudGVkIik7CiAgfQoKCiAgZnVuY3Rpb24gVXNlck1hbmlwdWxhdG9yKCAkdGhlX21vZHVsZSApCiAgewogICAgJHRoaXMtPm1vZCA9ICR0aGVfbW9kdWxlOwogIH0KCgogIGZ1bmN0aW9uIEdldERiKCkKICB7CiAgICByZXR1cm4gJHRoaXMtPm1vZC0+R2V0RGIoKTsKICB9CgoKICBmdW5jdGlvbiBHZXRNb2R1bGUoKQogIHsKICAgIHJldHVybiAkdGhpcy0+bW9kOwogIH0KCgogIC8vISBDaGVjayBpZiB0aGUgZ3JvdXAgc3BlY2lmaWVkIGhhcyB0aGUgcmVxdWlyZWQgcGVybWlzc2lvbgogIGZ1bmN0aW9uIENoZWNrR3JvdXBQZXJtaXNzaW9uKCAkZ2lkLCAkcGVybSApCiAgewogICAgcmV0dXJuIGZhbHNlOwogIH0KCgogIC8vISBDaGVjayBpZiB0aGUgdXNlciBoYXMgdGhlIHNwZWNpZmllZCBwZXJtaXNzaW9uCiAgZnVuY3Rpb24gQ2hlY2tVc2VyUGVybWlzc2lvbiggJHBlcm0gKQogIHsKICAgIHJldHVybiBmYWxzZTsKICB9CgoKICAvLyEgQ2hlY2sgaWYgdGhlIHNwZWNpZmllZCB1c2VyIGhhcyB0aGUgc3BlY2lmaWVkIHBlcm1pc3Npb24KICBmdW5jdGlvbiBDaGVja1VzZXJQZXJtaXNzaW9uQnlVaWQoICR1aWQsICRwZXJtICkKICB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICAvLyEgQXNzaWduIHRoZSB1c2VyIHNwZWNpZmllZCAoYnkgaWQpIHRvIHRoZSBncm91cCBzcGVjaWZpZWQgKGJ5IGlkKQogIC8vIQogIC8vIVxwYXJhbSAgdWlkICBUaGUgdXNlcmlkIGZvciB0aGUgbmV3IGFzc29jaWF0aW9uCiAgLy8hXHBhcmFtICBnaWQgIFRoZSBncm91cCBpZCBmb3IgdGhlIG5ldyBhc3NvY2lhdGlvbgogIC8vIVxyZXR1cm4gdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvdGhlcndpc2UKICAvLyEKICBmdW5jdGlvbiBBc3NpZ25Vc2VyVG9Hcm91cCggJHVpZCwgJGdpZCApCiAgewogICAgcmV0dXJuIGZhbHNlOwogIH0KCgogIC8vISBDaGVjayB0aGUgdmFsaWRpdHkgb2YgdGhlIHN1cHBsaWVkIHBhc3N3b3JkCiAgLy8hCiAgLy8hXHBhcmFtICBwYXNzd29yZCBUaGUgcGFzc3dvcmQgdG8gdGVzdC4KICAvLyFccmV0dXJuIHRydWUgaWYgdGhlIHBhc3N3b3JkIGlzIHZhbGlkLCBmYWxzZSBvdGhlcndpc2UKICAvLyEKICBmdW5jdGlvbiBJc1ZhbGlkUGFzc3dvcmQoICRwYXNzd29yZCApCiAgewogICAgcmV0dXJuIGZhbHNlOwogIH0KCgogIC8vISBDb21wbGV0ZWx5IGRlbGV0ZSBhbGwgcmVmZXJlbmNlcyB0byB0aGUgc3VwcGxpZWQgdXNlciBpZAogIC8vIQogIC8vIVRoaXMgbWV0aG9kIGNvbXBsZXRlbHkgZGVsZXRlcyBhbnl0aGluZyBmcm9tIHRoZSBkYXRhYmFzZSByZWxhdGVkIHRvIHRoZSBzcGVjaWZpZWQgdXNlciBpZC4KICAvLyFzcGVjaWZpY2FsbHksIGdyb3VwIGFzc29jaWF0aW9ucywgcHJvcGVydGllcywgYW5kIHRoZSB1c2VyIHJlY29yZCBpdHNlbGYuCiAgLy8hCiAgLy8hXHBhcmFtIHVpZCB0aGUgdXNlcmlkIHRvIGRlbGV0ZSBhbGwgcmVmZXJlbmNlcyB0bwogIC8vIVxyZXR1cm4gYXJyYXksIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBhcnJheSBpcyBhIGJvb2xlYW4gaW5kaWNhdGluZyBzdWNjZXNzIG9yIGZhaWx1cmUuCiAgLy8hICAgaWYgdGhlIGZpcnN0IGVsZW1lbnQgaXMgZmFsc2UsIHRoZW4gdGhlIHNlY29uZCBlbGVtZW50IHdpbGwgY29udGFpbiBhbiBlcnJvciBtZXNzYWdlLgogIC8vIQogIGZ1bmN0aW9uIERlbGV0ZVVzZXJGdWxsKCAkdWlkICkKICB7CiAgICByZXR1cm4gYXJyYXkoRkFMU0UsIk5vIGZ1bmN0aW9uIGRlZmluZWQiKTsKICB9CgoKICAvLyEgR2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBncm91cAogIC8vIQogIC8vISBUaGlzIG1ldGhvZCByZXR1cm5zIGFuIGFzc29jaWF0aW9uIHdpdGggdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3BlY2lmaWVkIAogIC8vISBncm91cCBpZAogIC8vISAgICBpZCA9PiBUaGUgcmVxdWVzdGVkIGdyb3VwIGlkCiAgLy8hICAgIGdyb3VwbmFtZSA9PiBUaGUgbmFtZSBvZiB0aGUgZ3JvdXAKICAvLyEgICAgZ3JvdXBkZXNjID0+IFRoZSBncm91cCBkZXNjcmlwdGlvbgogIC8vIQogIC8vISBccGFyYW0gZ2lkIFRoZSBncm91cCBpZAogIC8vISBccGFyYW0gYXNzb2NpYXRpdmUgYXJyYXksIG9yIGFycmF5IHdpdGggZmlyc3QgZWxlbWVudCBvZiBmYWxzZSwgc2Vjb25kIGVsZW1lbnQgY29udGFpbnMgZXJyb3IgbWVzc2FnZQogIC8vISBccmV0dXJuIGFuIGFzc29jaWF0aXZlIGFycmF5IHdpdGggZ3JvdXAgaW5mbywgb3IgZmFsc2UKICAvLyEKICBmdW5jdGlvbiBHZXRHcm91cEluZm8oICRnaWQgKQogIHsKICAgIHJldHVybiBmYWxzZTsKICB9CgoKICAvLyEgR2V0IGluZm9ybWF0aW9uIGFib3V0IGEgdXNlcgogIC8vIQogIC8vISBUaGlzIG1ldGhvZCByZXR1cm5zIGFuIGFzc29jaWF0aW9uIHdpdGggdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3BlY2lmaWVkIAogIC8vISB1c2VyIGlkCiAgLy8hICAgaWQgPSB0aGUgcmVxdWVzdGVkIHVzZXIgaWQKICAvLyEgICB1c2VybmFtZSA9IHRoZSB1c2VycyBuYW1lCiAgLy8hICAgcGFzc3dvcmQgPSB0aGUgKGVuY3J5cHRlZCkgdXNlciBwYXNzd29yZAogIC8vISAgIGVtYWlsICAgID0gdGhlIHVzZXJzIGVtYWlsIGFkZHJlc3MKICAvLyEgICBleHBpcmVzICA9IHRoZSB1c2VycyBleHBpcnkgZGF0ZQogIC8vISAgIHN0YXR1cyAgID0gdGhlIHVzZXJzIHN0YXR1cwogIC8vIQogIC8vISBccGFyYW0gdWlkIFRoZSB1c2VyaWQgdG8gaW5xdWlyZSBhYm91dAogIC8vISBccmV0dXJuIGFuIGFycmF5LCB0aGUgZmlyc3QgZWxlbWVudCBjb250YWlucyByZXR1cm4gc3RhdHVzICh0cnVlL2ZhbHNlKSwgdGhlIHNlY29uZCBlbGVtZW50CiAgLy8hICAgIGlzIGVpdGhlciBhbiBhcnJheSBjb250YWluaW5nIHRoZSBkZXRhaWxzIGFib3ZlLCBvciBhbiBlcnJvciBtZXNzYWdlLgogIC8vIQogIGZ1bmN0aW9uIEdldFVzZXJJbmZvKCAkdWlkICkKICB7CiAgICByZXR1cm4gYXJyYXkoRkFMU0UsIkZ1bmN0aW9uIG5vdCBkZWZpbmVkIik7CiAgfQoKCiAgLy8hIEdldCBhIGxpc3Qgb2YgdGhlIHVzZXJzIHRoYXQgYmVsb25nIHRvIHRoZSBzcGVjaWZpZWQgZ3JvdXAKICAvLyEKICAvLyEgVGhpcyBtZXRob2QgcmV0dXJucyBhbiBhc3NvY2lhdGl2ZSBhcnJheSBjb250YWluaW5nIGEgY29tcGxldGUgc2V0IG9mIHRoZQogIC8vISBpbmZvcm1hdGlvbiBhYm91dCBhbGwgb2YgdGhlIHVzZXJzIHRoYXQgYmVsb25nIHRvIHRoZSBzcGVjaWZpZWQgZ3JvdXAKICAvLyEgCiAgLy8hIFxwYXJhbSBncm91cGlkIHRoZSBkZXNpcmVkIGdyb3VwIGlkCiAgLy8hIFxyZXR1cm4gYW4gYXJyYXkgb2YgdXNlciBpbmZvcm1hdGlvbiAoc2VlIEdldFVzZXJJbmZvKSwgb3IgZmFsc2UKICAvLyEgXHNhIEdldFVzZXJJbmZvCiAgLy8hCiAgZnVuY3Rpb24gR2V0VXNlcnNJbkdyb3VwKCAkZ3JvdXBpZCA9ICcnICkKICB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKCiAgLy8hIEEgZnVuY3Rpb24gdGhhdCB0ZXN0cyB3ZXRoZXIgYSBncm91cCB3aXRoIHRoZSBzcGVmaWZpZWQgaWQgZXhpc3RzCiAgLy8hCiAgLy8hIFxwYXJhbSBnaWQgVGhlIGRlc2lyZWQgZ3JvdXAgaWQKICAvLyEgXHJldHVybiBib29sZWFuCiAgIC8vIQogIGZ1bmN0aW9uIEdyb3VwRXhpc3RzQnlJRCggJGdpZCApCiAgewogICAgcmV0dXJuIGZhbHNlOwogIH0KCgogIC8vISBBIGZ1bmN0aW9uIHRoYXQgdGVzdHMgd2V0aGVyIGEgZ3JvdXAgd2l0aCB0aGUgbmFtZSBleGlzdHMKICAvLyEKICAvLyEgXHBhcmFtIGdpZCBUaGUgZGVzaXJlZCBncm91cCBuYW1lCiAgLy8hIFxyZXR1cm4gYm9vbGVhbgogICAvLyEKICBmdW5jdGlvbiBHcm91cEV4aXN0c0J5TmFtZSggJG5hbWUgKQogIHsKICAgIHJldHVybiBmYWxzZTsKICB9CgoKICAvLyEgVGVzdCB3ZXRoZXIgdGhlIHNwZWNpZmllZCBlbWFpbCBhZGRyZXNzIHBhc3NlcyB0aGUgcnVsZXMuCiAgLy8hCiAgLy8hIFRoaXMgbWV0aG9kIHdpbGwgdGVzdCBpZiB0aGUgZW1haWwgYWRkcmVzcyBzdXBwbGllZCBtYXRjaGVzIHRoZSAKICAvLyEgc2V0IHJ1bGVzLiAgT3B0aW9uYWxseSwgdGhlIGVtYWlsIGFkZHJlc3MgY2FuIGJlIHZhbGlkYXRlZCB2aWEKICAvLyEgc210cC4KICAvLyEKICAvLyEgXHBhcmFtICBlbWFpbCBUaGUgYWRkcmVzcyB0byB0ZXN0CiAgLy8hIFxwYXJhbSBzbXRwdmFsaWRhdGUgQSBib29sZWFuIGluZGljYXRpbmcgd2V0aGVyIHNtdHAgdmFsaWRhdGlvbiBzaG91bGQgYmUgdXNlZC4KICAvLyEgXHJldHVybiBhbiBhcnJheSwgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGFycmF5IGluZGljdWF0ZXMgc3VjY2VzcyBvciBmYWlsdXJlCiAgLy8hICAgIHRoZSBzZWNvbmQgZWxlbWVudCBpcyB0aGUgZXJyb3IgbWVzc2FnZSwgaWYgYW4gZXJyb3Igb2NjdXJyZWQKICAvLyEKICBmdW5jdGlvbiBJc1ZhbGlkRW1haWxBZGRyZXNzKCAkZW1haWwsICRzbXRwdmFsaWRhdGUgPSBmYWxzZSApCiAgewogICAgcmV0dXJuIGFycmF5KEZBTFNFLCJGdW5jdGlvbiBub3QgZGVmaW5lZCIpOwogIH0KCgogIC8vISBDaGVjayB3ZXRoZXIgdGhlIHVzZXJuYW1lIHN1cHBsaWVkIHBhc3NlcyB0aGUgcnVsZXMKICAvLyEKICAvLyFccGFyYW0gdXNlcm5hbWUgVGhlIHVzZXJuYW1lIHRvIGJlIHRlc3RlZAogIC8vIVxyZXR1cm4gYm9vbGVhbiB0cnVlL2ZhbHNlCiAgLy8hCiAgZnVuY3Rpb24gSXNWYWxpZFVzZXJuYW1lKCAkdXNlcm5hbWUgKQogIHsKICAgIHJldHVybiBmYWxzZTsKICB9CgoKICAvLyEgUmVtb3ZlIHRoZSBzcGVjaWZpZWQgdXNlciBmcm9tIHRoZSBzcGVjaWZpZWQgZ3JvdXAKICAvLyEKICAvLyFUaGlzIG1ldGhvZCByZXZva2VzIHRoZSBtZW1iZXJzaGlwIG9mIHVzZXIgJHVpZCBmcm9tIGdyb3VwICRnaWQKICAvLyEKICAvLyFccGFyYW0gdWlkCiAgLy8hXHBhcmFtIGdpZAogIC8vIVxyZXR1cm4gYXJyYXksIHRoZSBmaXJzdCBlbGVtZW50IGNvbnRhaW5zIGV4aXQgc3RhdHVzIChib29sZWFuKSwgdGhlIHNlY29uZCBlbGVtZW50CiAgLy8hICAgKG9wdGlvbmFsKSByZXR1cm5zIGFuIGVycm9yIG1lc3NhZ2UsIGlmIGFuIGVycm9yIG9jY3VycmVkLgogIC8vIQogIGZ1bmN0aW9uIFJlbW92ZVVzZXJGcm9tR3JvdXAoICR1aWQsICRnaWQgKQogIHsKICAgIHJldHVybiBhcnJheShGQUxTRSwiRnVuY3Rpb24gbm90IGRlZmluZWQiKTsKICB9CgoKICAvLyEgQSBtZXRob2QgdG8gbW9kaWZ5IGFuIGV4aXN0aW5nIGdyb3VwCiAgLy8hCiAgLy8hXHBhcmFtIGdpZCBBbiBleGlzdGluZyBncm91cCBpZAogIC8vIVxwYXJhbSBuYW1lIFRoZSBuZXcgZ3JvdXAgbmFtZQogIC8vIVxwYXJhbSBkZXNjIFRoZSBuZXcgZ3JvdXAgZGVzY3JpcHRpb24KICAvLyFccmV0dXJuIEFuIGFycmF5LCB0aGUgZmlyc3QgZWxlbWVudCBpcyBhIGJvb2xlYW4gd2hpY2ggaW5kaWNhdGVzIHN1Y2Nlc3Mgb3IgZmFpbHVyZSwgdGhlCiAgLy8hICBzZWNvbmQgZWxlbWVudCAob3B0aW9uYWwpIGNvbnRhaW5zIGFuIGVycm9yIG1lc3NhZ2UgaW4gdGhlIGV2ZW50IG9mIGFuIGVycm9yLgogIC8vIQogIGZ1bmN0aW9uIFNldEdyb3VwKCAkZ2lkLCAkbmFtZSwgJGRlc2MgKQogIHsKICAgIHJldHVybiBhcnJheShGQUxTRSwiRnVuY3Rpb24gbm90IGRlZmluZWQiKTsKICB9CgoKICBmdW5jdGlvbiBTZXRVc2VyUGFzc3dvcmQoICR1aWQsICRwYXNzd29yZCApCiAgewogICAgcmV0dXJuIGFycmF5KEZBTFNFLCJGdW5jdGlvbiBub3QgZGVmaW5lZCIpOwogIH0KCgogIC8vISBNb2RpZnkgYW4gZXhpc3RpbmcgZ3JvdXAKICAvLyEKICAvLyEgXHBhcmFtIHVpZCBUaGUgaWQgb2YgdGhlIGV4aXN0aW5nIHVzZXIKICAvLyEgXHBhcmFtIHVzZXJuYW1lIFRoZSBuZXcgdXNlciBuYW1lCiAgLy8hIFxwYXJhbSBlbWFpbCBUaGUgbmV3IGVtYWlsIGFkZHJlc3MKICAvLyEgXHBhcmFtIHBhc3N3b3JkIFRoZSBuZXcgKHVuZW5jcnlwdGVkKSBwYXNzd29yZAogIC8vISBccGFyYW0gZXhwaXJlcyBUaGUgbmV3IGV4cGlyeSBkYXRlCiAgLy8hIFxwYXJhbSBzdGF0dXMgdGhlIG5ldyBzdGF0dXMKICAvLyEgXHJldHVybiBBbiBhcnJheSwgdGhlIGZpcnN0IGVsZW1lbnQgaXMgYSBib29sZWFuIHdoaWNoIGluZGljYXRlcyBzdWNjZXNzIG9yIGZhaWx1cmUsIHRoZQogIC8vISAgICBzZWNvbmQgZWxlbWVudCAob3B0aW9uYWwpIGNvbnRhaW5zIGFuIGVycm9yIG1lc3NhZ2UgaW4gdGhlIGV2ZW50IG9mIGFuIGVycm9yLgogIC8vIQogIGZ1bmN0aW9uIFNldFVzZXIoICR1aWQsICR1c2VybmFtZSwgJHBhc3N3b3JkLCAkZXhwaXJlcyApCiAgewogICAgcmV0dXJuIGFycmF5KEZBTFNFLCJGdW5jdGlvbiBub3QgZGVmaW5lZCIpOwogIH0KCgogIC8vISBTZXQgdGhlIHVzZXIncyBncm91cCBtZW1iZXJzaGlwcyBhYnNvbHV0ZWx5CiAgLy8hCiAgLy8hVGhpcyBtZXRob2QgcmVtb3ZlcyBhbGwgcHJldmlvdXMgZ3JvdXAgYXNzb2NpYXRpb25zLCBhbmQgc2V0cyBuZXcgb25lcwogIC8vIXRvIG1hdGNoIHRob3NlIGluIHRoZSBncnBpZHMgYXJyYXkuCiAgLy8hCiAgLy8hXHBhcmFtIHVpZCBUaGUgdXNlciBpZCB0byBlZGl0CiAgLy8hXHBhcmFtIGdycGlkcyBBbiBhcnJheSBvZiB1c2VyIGlkcyB0byBhc3NvY2lhdGUgd2l0aAogIC8vIVxyZXR1cm5zIHRydWUgb24gc3VjY2VzcywgZmFsc2Ugb3RoZXJ3aXNlCiAgLy8hCiAgZnVuY3Rpb24gU2V0VXNlckdyb3VwcyggJHVpZCwgJGdycGlkcyApCiAgewogICAgcmV0dXJuIGZhbHNlOwogIH0KCgogIC8vISBTZXQgdGhlIHVzZXIncyBwcm9wZXJ0aWVzIGFic29sdXRlbHkuCiAgLy8hCiAgLy8hIFRoaXMgbWV0aG9kIGRlbGV0ZXMgYW55IGV4aXN0aW5nIHVzZXIgcHJvcGVydGllcyBhbmQgc2V0cyB0aGVtIGFjY29yZGluZyB0byB0aGUgcHJvcGVydGllcwogIC8vISBzdXBwbGllZC4KICAvLyEKICAvLyEgXHBhcmFtIHVpZCBUaGUgdXNlciBpZCB0byBiZSBlZGl0ZWQKICAvLyEgXHBhcmFtIHByb3BzIEFuIGFycmF5IG9mIEtleT1WYWx1ZSBzdHJpbmdzIGNvbnNpc3Rpbmcgb2YgdGhlIHVzZXIgcHJvcGVydGllcy4KICAvLyEgXHJldHVybiB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG90aGVyd2lzZQogIC8vIQogIGZ1bmN0aW9uIFNldFVzZXJQcm9wZXJ0aWVzKCAkdWlkLCAkcHJvcHMgKSAgCiAgewogICAgcmV0dXJuIGZhbHNlOwogIH0KCgogIC8vISBUZXN0IGlmIHRoZSB1c2VyIGlkIGlzIGFscmVhZHkgdGFrZW4KICAvLyEKICAvLyEgVGVzdHMgaWYgYSB1c2VyIGJ5IHRoYXQgaWQgYWxyZWFkeSBleGlzdHMKICAvLyEKICAvLyEgXHBhcmFtIHVpZCBUaGUgdXNlcmlkIHRvIHRlc3QKICAvLyEgXHJldHVybiBib29sZWFuCiAgLy8hCiAgZnVuY3Rpb24gVXNlckV4aXN0c0J5SUQoICR1aWQgKQogIHsKICAgIHJldHVybiBmYWxzZTsKICB9CgoKICAvLyEgUmV0dXJuIGFuIGFycmF5IG9mIHRoZSB1c2VyJ3MgcHJvcGVydGllcwogIC8vIQogIC8vISBSZXR1cm5zIGEgY29tcGxldGUgbGlzdCBvZiB0aGUgdXNlcnMgcHJvcGVydGllcwogIC8vIQogIC8vISBccGFyYW0gdWlkIFRoZSB1aWQgdG8gdGVzdAogIC8vISBccmV0dXJuIGZhbHNlIG9uIGVycm9yLCBvdGhlcndpc2UgYW4gYXJyYXkgb2YgYXNzb2NpYXRpb25zLCBlYWNoIGFzc29jaWF0aW9uCiAgLy8hICAgaGFzIHRoZSBmb2xsb3dpbmcga2V5czoKICAvLyEgICAgICBpZCAgICAgPSBUaGUgcHJvcGVydHkgaWQKICAvLyEgICAgICB1c2VyaWQgPSBUaGUgbWF0Y2hpbmcgdXNlciBpZAogIC8vISAgICAgIHRpdGxlICA9IFRoZSBwcm9wZXJ0eSB0aXRsZQogIC8vISAgICAgIGRhdGEgICA9IFRoZSBwcm9wZXJ0eSBkYXRhCiAgLy8hCiAgZnVuY3Rpb24gR2V0VXNlclByb3BlcnRpZXMoJHVpZCkKICB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICAvLyEgUmV0dXJuIGEgY29tcGxldGUgbGlzdCBvZiB0aGUgZ3JvdXBzIHRoYXQgdGhpcyB1c2VyIGJlbG9uZ3MgdG8KICAvLyEKICAvLyEgUmV0dXJucyBhbiBhcnJheSBvZiBncm91cGluZm8gcmVjb3JkcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBncm91cHMgdGhhdAogIC8vISB0aGlzIHVzZXIgaXMgYXNzb2NpYXRlZCB3aXRoLgogIC8vIQogIC8vISBccGFyYW0gdXNlcmlkIFRoZSB1c2VyaWQgdG8gdGVzdAogIC8vISBccmV0dXJuIGZhbHNlIG9uIGVycm9yLCBvdGhlcndpc2UsIGFuIGFycmF5IG9mIGdyb3VwaW5mbyByZWNvcmRzLgogIC8vIQogIGZ1bmN0aW9uIEdldE1lbWJlckdyb3Vwc0FycmF5KCR1c2VyaWQpCiAgewogICAgcmV0dXJuIGZhbHNlOwogIH0KCgogIC8vISBBZGQgYSBzaW5nbGUgcHJvcGVydHkgZGVmaW5pdGlvbgogIC8vISBccGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkKICAvLyEgXHBhcmFtIHByb21wdCBUaGUgcHJvbXB0IHRvIGRpc3BsYXkgdG8gdGhlIHVzZXIKICAvLyEgICAgICAgbm90ZSwgdGhpcyB3aWxsIGJlIExhbmdpZmllZAogIC8vISBccGFyYW0gdHlwZSAgVGhlIHR5cGUgb2YgdGhlIHByb3BlcnR5CiAgLy8hICAgICAgIDAgPSB0ZXh0LCAxID0gY2hlY2tib3gsIDIgPSBlbWFpbAogIC8vISBccGFyYW0gcmVxdWlyZWQgd2V0aGVyIG9yIG5vdCB0aGUgcHJvcGVydHkgaXMgcmVxdWlyZWQKICAvLyEgXHJldHVybiBBbiBhcnJheSwgdGhlIGZpcnN0IGVsZW1lbnQgaXMgYSBib29sZWFuIHdoaWNoIGluZGljYXRlcyBzdWNjZXNzIG9yIGZhaWx1cmUsIHRoZQogIC8vISAgICBzZWNvbmQgZWxlbWVudCAob3B0aW9uYWwpIGNvbnRhaW5zIGFuIGVycm9yIG1lc3NhZ2UgaW4gdGhlIGV2ZW50IG9mIGFuIGVycm9yLgogIC8vIQogIGZ1bmN0aW9uIEFkZFByb3BlcnR5RGVmbiggJG5hbWUsICRwcm9tcHQsICR0eXBlLCAkbGVuZ3RoICkKICB7CiAgICByZXR1cm4gYXJyYXkoRkFMU0UsIk5vdCBJbXBsZW1lbnRlZCIpOwogIH0KCgogIC8vISBEZWxldGUgYWxsIHByb3BlcnR5IGRlZmluaXRpb25zICh1c2Ugd2l0aCBjYXV0aW9uKQogIGZ1bmN0aW9uIERlbGV0ZVByb3BlcnR5RGVmbnMoKQogIHsKICAgIHJldHVybiBhcnJheShGQUxTRSwiTm90IEltcGxlbWVudGVkIik7CiAgfQoKICAvLyEgR2V0IGEgc2luZ2xlIHByb3BlcnR5IGRlZmluaXRpb24gYnkgbmFtZQogIGZ1bmN0aW9uIEdldFByb3BlcnR5RGVmbiggJG5hbWUgKQogIHsKICAgIHJldHVybiBGQUxTRTsKICB9CgogIC8vISBHZXQgYW4gYXJyYXkgb2YgcHJvcGVydHkgZGVmaW5pdGlvbnMKICBmdW5jdGlvbiBHZXRQcm9wZXJ0eURlZm5zKCkKICB7CiAgICByZXR1cm4gYXJyYXkoRkFMU0UsIk5vdCBJbXBsZW1lbnRlZCIpOwogIH0KCgogIC8vISBHZXQgYSBzaW5nbGUgcHJvcGVydHkgZm9yIHRoZSBjdXJyZW50IHVzZXIKICAvLyEKICAvLyEgR2V0IGEgc2luZ2xlIHByb3BlcnR5IGZvciB0aGUgY3VycmVudGx5IGxvZ2dlZCBpbiB1c2VyLgogIC8vISAKICAvLyEgXHBhcmFtIHRpdGxlIFRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIgdG8gcmV0dXJuCiAgLy8hIFxwYXJhbSBkZWZhdWx0dmFsdWUgQSB2YWx1ZSB0byByZXR1cm4gaWYgdGhlIHByb3BlcnR5IGRvZXMgbm90IGV4aXN0IGZvciB0aGF0IHVzZXIKICAvLyEgXHJldHVybiBUaGUgcHJvcGVydHkgdmFsdWUsIG9yIGZhbHNlLgogIC8vIQogIGZ1bmN0aW9uIEdldFVzZXJQcm9wZXJ0eSgkdGl0bGUsJGRlZmF1bHR2YWx1ZT1mYWxzZSkgCiAgewogICAgcmV0dXJuIGZhbHNlOwogIH0KCgogIC8vISBHZXQgcHJvcGVydHkgaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgdXNlciBpZAogIC8vIQogIC8vISBccGFyYW0gdGl0bGUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHdlIGFyZSBzZWFyY2hpbmcgZm9yCiAgLy8hIFxwYXJhbSB1c2VyaWQgVGhlIHVzZXJpZCBmb3Igd2hvJ3MgcHJvcGVydHkgd2UgYXJlIHNlYXJjaGluZwogIC8vISBccGFyYW0gZGVmYXVsdHZhbHVlIFRoZSB2YWx1ZSB0byByZXR1cm4gaWYgdGhpcyBwcm9wZXJ0eSBkb2VzIG5vdCBleGlzdCBmb3IgdGhpcyB1c2VyCiAgLy8hIFxyZXR1cm4gVGhlIHByb3BlcnR5IHZhbHVlLCBvciBmYWxzZS4KICAvLyEKICBmdW5jdGlvbiBHZXRVc2VyUHJvcGVydHlGdWxsKCR0aXRsZSwkdXNlcmlkLCAkZGVmYXVsdHZhbHVlPWZhbHNlKSAKICB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKCgogIC8vISBTZXQgYSBwcm9wZXJ0eSBmb3IgdGhlIGN1cnJlbnQgdXNlcgogIC8vISAKICAvLyEgU2V0cyBhIHByb3BlcnR5IGZvciB0aGUgY3VycmVudGx5IGxvZ2dlZCBpbiB1c2VyCiAgLy8hCiAgLy8hIFxwYXJhbSB0aXRsZSBUaGUgcHJvcGVydHkgbmFtZQogIC8vISBccGFyYW0gZGF0YSAgVGhlIHByb3BlcnR5IHZhbHVlCiAgLy8hIFxyZXR1cm5zIHRydWUgb24gc3VjY2VzcywgZmFsc2Ugb3RoZXJ3aXNlCiAgLy8hCiAgZnVuY3Rpb24gU2V0VXNlclByb3BlcnR5KCR0aXRsZSwkZGF0YSkgCiAgewogICAgcmV0dXJuIGZhbHNlOwogIH0KCgogIC8vISBTZXQgYSBwcm9wZXJ0eSBmb3IgdGhlIHByb3ZpZGVkIHVzZXJpZAogIC8vIQogIC8vISBTZXRzIGEgcHJvcGVydHkgZXhjbHVzaXZlbHkgZm9yIGEgY2VydGFpbiB1c2VyCiAgLy8hCiAgLy8hIFxwYXJhbSB0aXRsZSBUaGUgcHJvcGVydHkgbmFtZQogIC8vISBccGFyYW0gZGF0YSAgVGhlIHByb3BlcnR5IHZhbHVlCiAgLy8hIFxwYXJhbSB1c2VyaWQgVGhlIGRlc2lyZWQgdXNlciBpZAogIC8vIQogIGZ1bmN0aW9uIFNldFVzZXJQcm9wZXJ0eUZ1bGwoJHRpdGxlLCRkYXRhLCR1c2VyaWQpIAogIHsKICAgIHJldHVybiBmYWxzZTsKICB9CgoKICAvLyEgRGVsZXRlIGEgcHJvcGVydHkgZm9yIHRoZSBjdXJyZW50IHVzZXIKICAvLyEKICAvLyEgUmVtb3ZlIGEgcHJvcGVydHkgZnJvbSB0aGUgZGF0YWJhc2UgZm9yIHRoZSBjdXJyZW50bHkgbG9nZ2VkIGluIHVzZXIKICAvLyEKICAvLyEgXHBhcmFtIHRpdGxlIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBkZWxldGUKICAvLyEgXHBhcmFtIGFsbCAgIE9wdGlvbmFsbHkgZGVsZXRlIGFsbCBwcm9wZXJ0aWVzIGZvciB0aGlzIHVzZXIgIAogIC8vISBccmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG90aHdlcmlzZW4KICAvLyEKICBmdW5jdGlvbiBEZWxldGVVc2VyUHJvcGVydHkoJHRpdGxlLCRhbGw9ZmFsc2UpIAogIHsKICAgIHJldHVybiBmYWxzZTsKICB9CgoKICAvLyEgRGVsZXRlIGEgcHJvcGVydHkgZm9yIGEgc3BlY2lmaWVkIHVzZXIKICAvLyEKICAvLyFccGFyYW0gdGl0bGUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGRlbGV0ZQogIC8vIVxwYXJhbSB1c2VyaWQgVGhlIGlkIHRvIGRlbGV0ZSB0aGUgcHJvcGVydHkgZm9yCiAgLy8hXHBhcmFtIGFsbCAob3B0aW9uYWwpIERlbGV0ZSBhbGwgcHJvcGVydGllcyBmb3IgdGhlIHNwZWNpZmllZCB1c2VyaWQuCiAgLy8hXHJldHVybiB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG90aGVyd2lzZS4KICAvLyEKICBmdW5jdGlvbiBEZWxldGVVc2VyUHJvcGVydHlGdWxsKCR0aXRsZSwkdXNlcmlkLCRhbGw9ZmFsc2UpIAogIHsKICAgIHJldHVybiBmYWxzZTsKICB9CgoKICAvLyEgRGVsZXRlIGFsbCBvZiB0aGUgY3VycmVudCB1c2VycyBwcm9wZXJ0aWVzCiAgLy8hCiAgLy8hIFxyZXR1cm4gdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvdGhlcndpc2UKICAvLyEKICBmdW5jdGlvbiBEZWxldGVBbGxVc2VyUHJvcGVydGllcygpIAogIHsKICAgIHJldHVybiBmYWxzZTsKICB9CgoKICAvLyEgRGVsZXRlIEFsbCBwcm9wZXJ0aWVzIGZvciBhIHNwZWNpZmllZCB1c2VyIGlkCiAgLy8hCiAgLy8hIFxwYXJhbSB1c2VyaWQKICAvLyEgXHJldHVybiB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG90aGVyd2lzZQogIC8vIQogIGZ1bmN0aW9uIERlbGV0ZUFsbFVzZXJQcm9wZXJ0aWVzRnVsbCgkdXNlcmlkKSAKICB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKCiAgLy8hIENoZWNrIHRoZSBzdXBwbGllZCBwYXNzd29yZCBhbmQgZW5zdXJlIGl0IG1hY2hlcyB0aGUgb25lIGluIHRoZSBkYXRhYmFzZQogIC8vIQogIC8vIVxwYXJhbXMgdXNlcm5hbWUgVGhlIHVzZXJuYW1lIHRvIHRlc3QgZm9yCiAgLy8hXHBhcmFtcyBwYXNzd29yZCBUaGUgcGFzc3dvcmQgdG8gdGVzdAogIC8vIVxyZXR1cm4gdHJ1ZSBpZiBwYXNzd29yZHMgbWF0Y2gsIGZhbHNlIG90aGVyd2lzZS4KICAvLyEKICBmdW5jdGlvbiBDaGVja1Bhc3N3b3JkKCR1c2VybmFtZSwkcGFzc3dvcmQpIAogIHsKICAgIHJldHVybiBmYWxzZTsKICB9CgoKICAvLyEgUmV0dXJuIHRoZSB1c2VybmFtZSBvZiB0aGUgY3VycmVudCB1c2VyCiAgLy8hCiAgLy8hIFxyZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgdXNlcm5hbWUgb2YgdGhlIGN1cnJlbnRseSBsb2dnZWQgaW4gdXNlcgogIC8vISAgIGlmIG5vb25lIGlzIGxvZ2dlZCBpbiwgdGhlbiBhbiBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQKICAvLyEKICBmdW5jdGlvbiBMb2dnZWRJbk5hbWUoKSAKICB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKCiAgLy8hIFJldHVybiB0aGUgZW1haWwgYWRkcmVzcyBvZiB0aGUgY3VycmVudCB1c2VyCiAgLy8hCiAgLy8hIFxyZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZW1haWwgYWRkcmVzcyBvZiB0aGUgY3VycmVudGx5IGxvZ2dlZCBpbiB1c2VyCiAgLy8hICAgaWYgbm9vbmUgaXMgbG9nZ2VkIGluLCB0aGVuIGFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZAogIC8vIQogIGZ1bmN0aW9uIExvZ2dlZEluRW1haWwoKSAKICB7CiAgICByZXR1cm4gIiI7CiAgfQoKCiAgLy8hIExvZ291dCB0aGUgY3VycmVudCB1c2VyCiAgZnVuY3Rpb24gTG9nb3V0KCkgCiAgewogICAgcmV0dXJuIGZhbHNlOwogIH0KCgogIC8vISBFeHBpcmUgYW55IGFuZCBhbGwgdXNlcnMgdGhhdCBoYXZlIGJlZW4gYXdheSBmb3IgdG9vIGxvbmcKICBmdW5jdGlvbiBFeHBpcmVVc2VycygpIAogIHsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIC8vISBSZXR1cm4gdGhlIHVzZXJpZCBvZiB0aGUgY3VycmVudGx5IGxvZ2dlZCBpbiB1c2VyCiAgZnVuY3Rpb24gTG9nZ2VkSW5JZCgpIAogIHsKICAgIHJldHVybiBmYWxzZTsKICB9CgoKICAvLyEgVGVzdHMgd2V0aGVyIHRoZSBjdXJyZW50IHVzZXIgaXMgbG9nZ2VkIGluIG9yIG5vdC4KICBmdW5jdGlvbiBMb2dnZWRJbigpIAogIHsKICAgIGlmICgkdGhpcy0+TG9nZ2VkSW5JZCgpPT1mYWxzZSkgcmV0dXJuIGZhbHNlOyBlbHNlIHJldHVybiB0cnVlOwogIH0KCgogIC8vISBUZXN0IHdldGhlciBhbiBhc3NvY2lhdGlvbiBleGlzdHMgYmV0d2VlbiB0aGUgc3BlY2lmaWVkIHVzZXIgYW5kIGdyb3VwCiAgLy8hCiAgLy8hIFxwYXJhbSB1c2VyaWQgVGhlIHVzZXJpZCB0byB0ZXN0CiAgLy8hIFxwYXJhbSBncm91cGlkIFRoZSBncm91cGlkIHRvIHRlc3QKICAvLyEgXHJldHVybiB0cnVlIGlmIGFuIGFzc29jaWF0aW9uIGV4aXN0cywgZmFsc2Ugb3RoZXJ3aXNlCiAgLy8hCiAgZnVuY3Rpb24gTWVtYmVyT2ZHcm91cCgkdXNlcmlkLCRncm91cGlkKSAKICB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKCiAgLy8hIFJldHVybiB0aGUgdXNlcm5hbWUgdGhhdCBtYWNoZXMgdGhlIHNwZWNpZmllZCB1c2VyIGlkCiAgLy8hCiAgLy8hXHJldHVybiBUaGUgbWF0Y2hpbmcgdXNlcm5hbWUsIG9yIGZhbHNlCiAgLy8hCiAgZnVuY3Rpb24gR2V0VXNlck5hbWUoJHVzZXJpZCkgCiAgewogICAgcmV0dXJuIGZhbHNlOwogIH0KCgogIC8vISBHZXQgdGhlIGVtYWlsIGFkZHJlc3Mgb2YgdGhlIHVzZXIgd2l0aCB0aGUgc3BlY2lmaWVkIGlkCiAgLy8hCiAgLy8hXHJldHVybiBFbWFpbCBhZGRyZXNzLCBvciBmYWxzZQogIC8vIQogIGZ1bmN0aW9uIEdldEVtYWlsKCR1c2VyaWQpIAogIHsKICAgIHJldHVybiBmYWxzZTsKICB9CgoKICAvLyEgR2V0IHRoZSB1c2VyaWQgb2YgdGhlIHVzZXIgd2l0aCB0aGUgbWF0Y2hpbmcgbmFtZQogIC8vIQogIC8vISBccmV0dXJuIFVzZXJJRCwgb3IgZmFsc2UKICAvLyEKICBmdW5jdGlvbiBHZXRVc2VySUQoJHVzZXJuYW1lKSAKICB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKCiAgLy8hIEFkZCBhIG5ldyBncm91cAogIC8vIQogIC8vISBBZGRzIGEgbmV3IGdyb3VwIHdpdGggdGhlIHN1cHBsaWVkIG5hbWUgYW5kIGRlc2NyaXB0aW9uCiAgLy8hCiAgLy8hIFxwYXJhbSBuYW1lIFRoZSBuZXcgZ3JvdXAgbmFtZQogIC8vISBccGFyYW0gZGVzY3JpcHRpb24gdGhlIGdyb3VwIGRlc2NyaXB0aW9uCiAgLy8hIFxyZXR1cm4gYW4gYXJyYXksIHRoZSBmaXJzdCBlbGVtZW50IGlzIGEgZGVzY3JpcHRpb24gZGVzY3JpYmluZyB0aGUgcmV0dXJuIHN0YXR1cyAKICAvLyEgICAgKHRydWUgb24gc3VjY2VzcywgZmFsc2Ugb24gZXJyb3IpLiAgVGhlIHNlY29uZCBlbGVtZW50IChvcHRpb25hbCkgaXMgYW4gZXJyb3Igc3RyaW5nIGluIHRoZSAKICAvLyEgICAgZXZlbnQgb2YgYW4gZXJyb3IuCiAgLy8hCiAgZnVuY3Rpb24gQWRkR3JvdXAoICRuYW1lLCAkZGVzY3JpcHRpb24gKQogIHsKICAgIHJldHVybiBhcnJheShGQUxTRSwiRnVuY3Rpb24gbm90IGRlZmluZWQiKTsKICB9CgoKICAvLyEgQWRkIGEgbmV3IHVzZXIKICAvLyEKICAvLyEgQWRkIHRoZSBzcGVjaWZpZWQgdXNlciB0byB0aGUgZGF0YWJhc2UKICAvLyEKICAvLyEgXHBhcmFtIG5hbWUgVGhlIGRlc2lyZWQgdXNlcm5hbWUKICAvLyEgXHBhcmFtIHBhc3N3b3JkIFRoZSBkZXNpcmVkIHBhc3N3b3JkICh1bmVuY3J5cHRlZCkKICAvLyEgXHBhcmFtIGV4cGlyZXMgVGhlIGV4cGlyeSBkYXRlCiAgLy8hIFxyZXR1cm4gYW4gYXJyYXksIHRoZSBmaXJzdCBlbGVtZW50IGlzIGEgZGVzY3JpcHRpb24gZGVzY3JpYmluZyB0aGUgcmV0dXJuIHN0YXR1cyAKICAvLyEgICAgKHRydWUgb24gc3VjY2VzcywgZmFsc2Ugb24gZXJyb3IpLiAgVGhlIHNlY29uZCBlbGVtZW50IChvcHRpb25hbCkgaXMgYW4gZXJyb3Igc3RyaW5nIGluIHRoZSAKICAvLyEgICAgZXZlbnQgb2YgYW4gZXJyb3IsIG9yIHRoZSB1c2VyaWQgb3RoZXJ3aXNlCiAgLy8hCiAgZnVuY3Rpb24gQWRkVXNlciggJG5hbWUsICRwYXNzd29yZCwgJGV4cGlyZXMgKQogIHsKICAgIHJldHVybiBhcnJheShGQUxTRSwiRnVuY3Rpb24gbm90IGRlZmluZWQiKTsKICB9CgoKICAvLyEgR2V0IHRoZSBncm91cCBuYW1lIGdpdmVuIGEgZ3JvdXAgaWQKICAvLyEKICAvLyEgXHJldHVybiBncm91cCBuYW1lLCBvciBmYWxzZQogIC8vIQogIGZ1bmN0aW9uIEdldEdyb3VwTmFtZSgkZ3JvdXBpZCkgCiAgewogICAgcmV0dXJuIGZhbHNlOwogIH0KCgogIC8vISBHZXQgdGhlIGdyb3VwIGRlc2NyaXB0aW9uIGdpdmVuIGEgZ3JvdXAgaWQKICAvLyEKICAvLyEgXHJldHVybiBncm91cCBkZXNjcmlwdGlvbiwgb3IgZmFsc2UKICAvLyEKICBmdW5jdGlvbiBHZXRHcm91cERlc2MoJGdyb3VwaWQpCiAgewogICAgcmV0dXJuIGZhbHNlOwogIH0KCgogIC8vISBEZWxldGUgdGhlIHNwZWNpZmllZCBncm91cAogIC8vIQogIC8vISBEZWxldGUgdGhlIGdyb3VwIHJlY29yZCBmb3IgdGhlIG1hdGNoaW5kIGlkCiAgLy8hCiAgLy8hIFxyZXR1cm4gYW4gYXJyYXksIHRoZSBmaXJzdCBlbGVtZW50IGlzIGEgZGVzY3JpcHRpb24gZGVzY3JpYmluZyB0aGUgcmV0dXJuIHN0YXR1cyAKICAvLyEgICAgKHRydWUgb24gc3VjY2VzcywgZmFsc2Ugb24gZXJyb3IpLiAgVGhlIHNlY29uZCBlbGVtZW50IChvcHRpb25hbCkgaXMgYW4gZXJyb3Igc3RyaW5nIGluIHRoZSAKICAvLyEgICAgZXZlbnQgb2YgYW4gZXJyb3IuCiAgLy8hCiAgZnVuY3Rpb24gRGVsZXRlR3JvdXBGdWxsKCAkaWQgKQogIHsKICAgIHJldHVybiBhcnJheShGQUxTRSwiRnVuY3Rpb24gbm90IGRlZmluZWQiKTsKICB9CgoKICAvLyEgR2V0IGEgbGlzdCBvZiBhbGwgb2YgdGhlIGdyb3VwcywgYW5kIHRoZWlyIGlkJ3MKICAvLyEKICAvLyEgXHJldHVybiBhbiBhc3NvY2lhdGl2ZSBhcnJheSBjb250YWluaW5nIGdyb3VwIG5hbWVzIGFzIGtleXMsIGFuZCBpZCdzIGFzIHZhbHVlcwogIC8vIQogIGZ1bmN0aW9uIEdldEdyb3VwTGlzdCgpCiAgewogICAgcmV0dXJuIGFycmF5KCk7CiAgfQoKCiAgLy8hIEdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29tcGxldGUgbGlzdCBvZiBncm91cHMKICAvLyEKICAvLyEgVGhpcyBtZXRob2QgcmV0dXJucyBhbiBhcnJheSBvZiBncm91cGluZm8gYXNzb2NpYXRpb25zLCByZXByZXNlbnRpbmcgYWxsIG9mIHRoZQogIC8vISBncm91cHMgaW4gdGhlIHRhYmxlLgogIC8vIQogIC8vISBccmV0dXJucyBhbiBhcnJheSBvZiBncm91cGluZm8gYXNzb2NpYXRpb25zCiAgLy8hCiAgZnVuY3Rpb24gR2V0R3JvdXBMaXN0RnVsbCgpCiAgewogICAgcmV0dXJuIGFycmF5KCk7CiAgfQoKCiAgLy8hIEdldCB0aGUgZ3JvdXBpZCBnaXZlbiBhIGdyb3VwIG5hbWUKICAvLyEKICAvLyEgXHJldHVybiBncm91cGlkIG9yIGZhbHNlCiAgLy8hCiAgZnVuY3Rpb24gR2V0R3JvdXBJRCgkZ3JvdXBuYW1lKQogIHsKICAgIHJldHVybiBmYWxzZTsKICB9CgoKICAvLyEgR2V0IGEgbGlzdCBvZiB0aGUgZ3JvdXBzIHRoYXQgdGhlIHNwZWNpZmllZCB1c2VyIGJlbG9uZ3MgdG8KICAvLyEKICAvLyEgUmV0dXJuIGEgc3RyaW5nIG9mIGNvbW1hIGRlbGltaXRlZCBncm91cCBuYW1lcywgY29ycmVzcG9uZGluZyB0byB0aGUKICAvLyEgZ3JvdXBzIHRoYXQgdGhlIHVzZXIgaXMgYSBtZW1iZXIgb2YKICAvLyEKICAvLyEgXHJldHVybiBhIGNvbW1hIGRlbGltaXRlZCBsaXN0IG9mIGdyb3VwIG5hbWVzLCBvciAibm9uZSIKICAvLyEKICBmdW5jdGlvbiBHZXRNZW1iZXJHcm91cHMoJHVzZXJpZCkKICB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKCiAgLy8hIERlbGV0ZSB0aGUgdXNlciB3aXRoIHRoZSBzcGVjaWZpZWQgaWQKICAvLyEgXG5vdGUgVGhpcyBpcyBhIGRlcHJlY2F0ZWQgZnVuY3Rpb24gYXMgaXQgcmVsaWVzIG9uIHRoZSB1c2VyaWQgYmVpbmcgc2V0IGluIHRoZSBfR0VUCiAgLy8hIHZhcmlhYmxlLgogIC8vIQogIGZ1bmN0aW9uIERlbGV0ZVVzZXIoJGlkKSAgCiAgewogICAgcmV0dXJuIGZhbHNlOwogIH0KCn0gLy8gY2xhc3MKCj8+]]></data>
  </file>
</module>
