<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE module [
  <!ELEMENT module (name,version,description*,requires*,file+)>
  <!ELEMENT name (#PCDATA)>
  <!ELEMENT version (#PCDATA)>
  <!ELEMENT description (#PCDATA)>
  <!ELEMENT requires (requiredname,requiredversion)>
  <!ELEMENT requiredname (#PCDATA)>
  <!ELEMENT requiredversion (#PCDATA)>
  <!ELEMENT file (filename,isdir,data)>
  <!ELEMENT filename (#PCDATA)>
  <!ELEMENT isdir (#PCDATA)>
  <!ELEMENT data (#PCDATA)>
]>
<module>
  <name>nuSOAP</name>
  <version>1.0</version>
  <description></description>
  <file>
    <filename>classes/</filename>
    <isdir>1</isdir>
  </file>
  <file>
    <filename>classes/changelog</filename>
    <isdir>0</isdir>
    <data><![CDATA[MjAwMy0wNy0yMSwgdmVyc2lvbiAwLjYuNQotIHNvYXBfdHJhbnNwb3J0X2h0dHA6IFNPQVBBY3Rpb24gaGVhZGVyIGlzIHF1b3RlZCBhZ2FpbiwgZml4ZXMgcHJvYmxlbSB3LyBXZWJsb2dpYyBTZXJ2ZXIKLSBhcHBsaWVkIEphc29uIExldml0dCBwYXRjaCBmb3IgcHJvcGVyIGFycmF5IHNlcmlhbGl6YXRpb24sIGZpeGVzIHByb2JsZW0gdy8gQW1hem9uIHNob3BwaW5nIGNhcnQgc2VydmljZXMKLSBmaXhlZCBudWxsIHZhbHVlIHNlcmlhbGl6YXRpb24KLSBhcHBsaWVkIHBhdGNoIGZyb20gIkJaQyBUb09uJ1MiIC0gZml4ZXMgd3NkbCBzZXJpYWxpemF0aW9uIHdoZW4gbm8gcGFyYW1ldGVycwotIGFwcGxpZWQgSm9obidzIHBhdGNoLCBpbXBsZW1lbnRpbmcgY29tcHJlc3Npb24gZm9yIHRoZSBzZXJ2ZXIKCjIwMDMtMDctMjIsIHZlcnNpb24gMC42LjUKLSBzb2FwX3NlcnZlcjogZml4ZWQgYnVnIGNhdXNpbmcgY2hhcnNldCBlbmNvZGluZyBub3QgdG8gYmUgcGFzc2VkIHRvIHRoZSBwYXJzZXIKLSBzb2FwX2ZhdWx0OiBhZGRlZCBkZWZhdWx0IGVuY29kaW5nIHRvIHRoZSBmYXVsdCBzZXJpYWxpemF0aW9uCi0gc29hcF9wYXJzZXI6IGNoYW5nZWQgdGhlIHBhcnNlciB0byBwcmUtbG9hZCB0aGUgcGFyZW50J3MgcmVzdWx0IGFycmF5IHdoZW4gcHJvY2Vzc2luZyBzY2FsYXIgdmFsdWVzLiBUaGlzIGluY3JlYXNlcyBwYXJzaW5nIHNwZWVkLgoKMjAwMy0wNy0yMywgdmVyc2lvbiAwLjYuNQotIHNvYXBfYmFzZTogZml4IGNvZGUgdGhhdCBvdmVyd3JpdGVzIHVzZXItc3VwcGxpZWQgYXR0cmlidXRlcyBpbiBzZXJpYWxpemVfdmFsCi0gc29hcF9iYXNlOiB1c2UgYXJyYXlzLW9mLWFycmF5cyByYXRoZXIgdGhhbiBhdHRlbXB0aW5nIG11bHRpLWRpbWVuc2lvbmFsIGluIHNlcmlhbGl6ZV92YWwKLSB4bWxzY2hlbWE6IGVtaXQgaW1wb3J0IHN0YXRlbWVudHMgYW5kIHF1YWxpZnkgYWxsIGVsZW1lbnRzIHdpdGggcHJlZml4IGluIHNlcmlhbGl6ZVNjaGVtYSAoYmV0dGVyIGludGVyb3Agd2l0aCB2YWxpZGF0aW9uIHRvb2xzKQotIHNvYXBjbGllbnQ6IGdldCB4bWwgY2hhcmFjdGVyIGVuY29kaW5nIGZyb20gSFRUUCBDb250ZW50LVR5cGUgaGVhZGVyIGlmIHByb3ZpZGVkLCBlLmcuIHRleHQveG1sO2NoYXJzZXQ9IlVURi04IgotIHNvYXBjbGllbnQ6IHVzZSBoZWFkZXJzIGluIGNhbGwgaWYgcHJvdmlkZWQgKHByZXZpb3VzbHkgaWdub3JlZCB0aGlzIHBhcmFtZXRlcikKLSBzb2FwX3NlcnZlcjogaW4gcGFyc2VfcmVxdWVzdCwgaWYgbmVpdGhlciBnZXRhbGxoZWFkZXJzIG5vciAkX1NFUlZFUiBhcmUgYXZhaWxhYmxlLCB1c2UgJEhUVFBfU0VSVkVSX1ZBUlMgdG8gZ2V0IFNPQVBBY3Rpb24gYW5kIHhtbCBlbmNvZGluZwoKMjAwMy0wNy0yNCwgdmVyc2lvbiAwLjYuNQotIHNvYXBfdHJhbnNwb3J0X2h0dHA6IGFwcGx5IHBhdGNoIGZyb20gU3RldmVuIEJyb3duICJpZiB0aGUgc2VydmVyIGNsb3NlcyBjb25uZWN0aW9uIHByZW1hdHVyZWx5LCBudXNvYXAgd291bGQgc3BpbiB0cnlpbmcgdG8gcmVhZCBkYXRhIHRoYXQgaXNuJ3QgdGhlcmUiCgoyMDAzLTA3LTI1LCB2ZXJzaW9uIDAuNi41Ci0gd3NkbDogYXBwbHkgcGF0Y2ggZnJvbSBTdmVuIHRvIHdvcmthcm91bmQgc2luZ2xlIHNjaGVtYSBsaW1pdGF0aW9uCi0gd3NkbDogYXBwbHkgYSB2YXJpYW50IG9mIHRoZSBwYXRjaCBmcm9tIEhvbGdlciB0byBoYW5kbGUgZW1wdHkgdmFsdWVzIGZvciBhcnJheSBieSBzZXJpYWxpemluZyBhbiBhcnJheSB3aXRoIDAgZWxlbWVudHMKLSB4bWxzY2hlbWE6IHJlbW92ZSB0aGUgcmVkdW5kYW50IGRlZmF1bHQgbmFtZXNwYWNlIGF0dHJpYnV0ZSBvbiB0aGUgc2NoZW1hIGVsZW1lbnQ7IGV2ZXJ5dGhpbmcgaW4geHNkIGlzIGV4cGxpY2l0bHkgc3BlY2lmaWVkIGFzIGJlaW5nIGZyb20geHNkCi0gc29hcF90cmFuc3BvcnRfaHR0cDogZml4IHNldENyZWRlbnRpYWxzIGFuZCBhZGQgVE9ETyBjb21tZW50cyBpbiBzZW5kSFRUUFMgYWJvdXQgd2hhdCB0byBjaGFuZ2UgaWYgdGhpcyBzZXRDcmVkZW50aWFscyBzdGF5cwoKMjAwMy0wNy0zMCwgdmVyc2lvbiAwLjYuNQotIG51c29hcF9iYXNlOiBjaGFuZ2UgZG9jdW1lbnRhdGlvbiBvZiBzb2FwX2RlZmVuY29kaW5nIHRvIHNwZWNpZnkgaXQgaXMgdGhlIGVuY29kaW5nIGZvciBvdXRnb2luZyBtZXNzYWdlcwotIG51c29hcF9iYXNlOiBvbmx5IGNoYW5nZSAmLCA8LCA+IHRvIGVudGl0aWVzLCBub3QgYWxsIEhUTUwgZW50aXRpZXMKLSBzb2FwX3RyYW5zcG9ydF9odHRwOiB1cGRhdGUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXIgaW4gc2VuZFJlcXVlc3QsIHNpbmNlIHNvYXBfZGVmZW5jb2RpbmcgY291bGQgYmUgY2hhbmdlZCBhZnRlciBjdG9yIGlzIGNhbGxlZAotIHNvYXBfc2VydmVyOiB1c2Ugc29hcF9kZWZlbmNvZGluZyBpbnN0ZWFkIG9mIGNoYXJzZXRfZW5jb2RpbmcKLSBzb2FwX3NlcnZlcjogcmVhZCBlbmNvZGluZyBmcm9tIF9TRVJWRVIgaWYgYXZhaWxhYmxlCi0gbnVzb2FwX2Jhc2U6IGRvIGVudGl0eSB0cmFuc2xhdGlvbiBmb3Igc3RyaW5nIHBhcmFtZXRlcnMgd2l0aCBhbiB4c2QgdHlwZSBzcGVjaWZpZWQgKHRoYW5rcyBEYXZpZCBEZXJyKQoKMjAwMy0wNy0zMSwgdmVyc2lvbiAwLjYuNQotIHNvYXBfdHJhbnNwb3J0X2h0dHA6IGFkZCBwcm94eSBhdXRoZW50aWNhdGlvbgotIHNvYXBfdHJhbnNwb3J0X2h0dHA6IGJ1aWxkIHBheWxvYWQgdGhlIHNhbWUgd2F5IGZvciBodHRwIGFuZCBodHRwcwotIHdzZGw6IGFkZCBwcm94eSBhdXRoZW50aWNhdGlvbgotIHNvYXBjbGllbnQ6IGFkZCBwcm94eSBhdXRoZW50aWNhdGlvbgotIHNvYXBjbGllbnQ6IGFsbG93IHByb3h5IGluZm9ybWF0aW9uIGluIGN0b3IsIHNvIHRoYXQgaXQgY2FuIGJlIHVzZWQgZm9yIHdzZGwKCjIwMDMtMDgtMDEsIHZlcnNpb24gMC42LjUKLSBzb2FwX3RyYW5zcG9ydF9odHRwOiBjbG9zZSBhIHBlcnNpc3RlbnQgY29ubmVjdGlvbiB0aGF0J3MgYXQgRU9GCi0gc29hcF90cmFuc3BvcnRfaHR0cDogcHJldmVudCBjb25mbGljdHMgYmV0d2VlbiBzZXRFbmNvZGluZyBhbmQgdXNlUGVyc2lzdGVudENvbm5lY3Rpb24KLSBzb2FwX3RyYW5zcG9ydF9odHRwOiBmaXggdXNlIG9mICRoZWFkZXJzIGluc3RlYWQgb2YgJHRoaXMtPmluY29taW5nX2hlYWRlcnMgaW4gZ2V0UmVzcG9uc2UKLSBzb2FwY2xpZW50OiBpbXByb3ZlIGhhbmRsaW5nIG9mIHBlcnNpc3RlbnQgY29ubmVjdGlvbnMKLSBzb2FwY2xpZW50OiBmb3JjZSB4bWxfZW5jb2RpbmcgdG8gdXBwZXIgY2FzZQotIHNvYXBfc2VydmVyOiBsZXQgdGhlIFdlYiBzZXJ2ZXIgZGVjaWRlIHdoZXRoZXIgdG8gY2xvc2UgdGhlIGNvbm5lY3Rpb24gKG5vIENvbm5lY3Rpb246IGNsb3NlIGhlYWRlcikKLSBzb2FwX3NlcnZlcjogZm9yY2UgeG1sX2VuY29kaW5nIHRvIHVwcGVyIGNhc2UKCjIwMDMtMDgtMDQsIHZlcnNpb24gMC42LjUKLSBzb2FwX3BhcnNlcjogdXNlIFhNTCB0eXBlIGluZm9ybWF0aW9uIHRvIHBpY2sgYSBQSFAgZGF0YSB0eXBlOyBhbHNvIGRlY29kZSBiYXNlNjQKLSBzb2FwX3NlcnZlcjogcmVhZCBhbGwgSFRUUCBoZWFkZXJzIHdoZW4gdXNpbmcgX1NFUlZFUiBvciBIVFRQX1NFUlZFUl9WQVJTCi0gc29hcF9zZXJ2ZXI6IGFkZCBnemlwIGVuY29kaW5nIHN1cHBvcnQgZm9yIG91dGdvaW5nIG1lc3NhZ2VzCi0gc29hcF90cmFuc3BvcnRfaHR0cDogZGVmbGF0ZSBpcyBnemNvbXByZXNzL2d6dW5jb21wcmVzcyAoY2YuIGh0dHA6Ly9hcmNoaXZlLmRldmVsb29wZXIuY29tL2xpYnd3d0BwZXJsLm9yZy9tc2cwNDY1MC5odG1sKQotIHNvYXBfdHJhbnNwb3J0X2h0dHA6IGNsZWFuIHVzZSBvZiBwZXJzaXN0ZW50Q29ubmVjdGlvbiBzbyBpdCdzIGFsd2F5cyBhIHNldCBib29sZWFuCi0gc29hcGNsaWVudDogYWRkIHJlc3BvbnNlRGF0YSBtZW1iZXIgdG8gYWNjZXNzIGRlZmxhdGVkL2d1bnppcHBlZCBwYXlsb2FkCgoyMDAzLTA4LTA1LCB2ZXJzaW9uIDAuNi41Ci0gc29hcF9zZXJ2ZXI6IGxvb2sgbXVsdGlwbGUgcGxhY2VzIHdoZW4gc2V0dGluZyBkZWJ1Z19mbGFnCgoyMDAzLTA4LTA3LCB2ZXJzaW9uIDAuNi41Ci0gbnVzb2FwX2Jhc2U6IHNlcmlhbGl6ZSBzcGVjaWZpZWQgdHlwZSAoZS5nLiBBcnJheU9mU3RyaW5nKSBldmVuIGZvciBzaW1wbGUgYXJyYXkKLSB3c2RsOiBvbmx5IHNwZWNpZnkgZW5jb2RpbmdTdHlsZSBpbiB0aGUgaW5wdXQvb3V0cHV0IHNvYXAgYmluZGluZ3Mgd2hlbiBpdCBpcyBub3QgZW1wdHkgKHRoYW5rcyBHdWlsbGF1bWUpCgoyMDAzLTA4LTE1LCB2ZXJzaW9uIDAuNi41Ci0gc29hcF9wYXJzZXI6IGZpeCBwYXJzaW5nIG9mIGVsZW1lbnRzIHdpdGggbm8gWFNEIHR5cGUgc3BlY2lmaWVkCi0gc29hcF9wYXJzZXI6IHVzZSBQSFAgc3RyaW5nIHR5cGUgZm9yIFhTRCBsb25nIGFuZCB1bnNpZ25lZExvbmcgdHlwZXMKCjIwMDMtMDgtMTYsIHZlcnNpb24gMC42LjUKLSBzb2FwX3BhcnNlcjogZml4IGNvZGUgZ2VuZXJhdGluZyB3YXJuaW5nICh0aGFua3MgVG9yc3RlbikKCjIwMDMtMDgtMTksIHZlcnNpb24gMC42LjUKLSBzb2FwX3BhcnNlcjogZml4IGFub3RoZXIgbGluZSBvZiBjb2RlIGdlbmVyYXRpbmcgYSB3YXJuaW5nICh0aGFua3MgVG9yc3RlbikKCjIwMDMtMDgtMjIsIHZlcnNpb24gMC42LjUKLSBzb2FwX3NlcnZlcjogcmVtb3ZlIGFsbCAnLS0nIGZyb20gZGVidWdfc3RyOyBwcmV2aW91cyBjb2RlIGNoYW5nZWQgJy0tLScgdG8gJy0gLS0nCi0gd3NkbCwgc29hcGNsaWVudCwgc29hcF9wYXJzZXI6IHBhdGNoIHN1Ym1pdHRlZCBieSBNYXJrIFNwYXZpbiBhcyBkZXNjcmliZWQgYnkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZvbGxvd2luZy4uLgo+IENoYW5nZXMgZm9yIHRoZSBtdWx0aXBsZS9uZXN0ZWQgaW1wb3J0cyBmcm9tIHRoZSB3c2RsIGZpbGUuIFRoaXMgYnVpbGRzIGFuCj4gYXJyYXkgb2YgZmlsZXMgbm90IGp1c3QgdGhlIGxhc3Qgb25lIGFuZCBhbHNvIGNoZWNrcyBmb3IgcmVsYXRpdmUgcGF0aHMgdG8KPiB0aGUgcGFyZW50LiBUaGlzIHdpbGwgdGhlbiBnZXQgdGhlIGltcG9ydGVkIGZpbGVzIGZyb20gdGhlIHJlbW90ZSBzaXRlCj4gaW5zdGVhZCBvZiB5b3VyIGxvY2FsIGRpc2suIExvY2FsIHdzZGwgZmlsZXMgc2hvdWxkIHN0aWxsIHdvcmsgKHVudGVzdGVkKS4KPgo+IENoYW5nZXMgZm9yIG11bHRpcGxlIGVuY29kaW5nIHN5dGxlcyBhcyBwcmV2aW91c2x5IHBvc3RlZAoKMjAwMy0wOC0yNCwgdmVyc2lvbiAwLjYuNQotIHdzZGwsIHNvYXBjbGllbnQ6IGZpeCBzb21lIFBIUCBub3RpY2VzIGZyb20gcHJldmlvdXMgdXBkYXRlCgoyMDAzLTA4LTI2LCB2ZXJzaW9uIDAuNi41Ci0gd3NkbDogc3VwcG9ydCBtdWx0aXBsZSBTT0FQIHBvcnRzCi0gc29hcGNsaWVudCwgc29hcF9zZXJ2ZXI6IHdoZW4gbm8gY2hhcnNldCBpcyBzcGVjaWZpZWQsIHVzZSBVVEYtOCwgZXZlbiB0aG91Z2ggSFRUUCBzcGVjaWZpZXMgVVMtQVNDSUkuCi0gc29hcF90cmFuc3BvcnRfaHR0cDogZG8gbm90IHByZXBlbmQgJGhvc3Qgd2l0aCAnc3NsOi8vJyBmb3IgaHR0cHMgKGlzIHRoaXMgcmVxdWlyZWQgZm9yIG9sZGVyIGNVUkwgdmVyc2lvbnM/KQoKMjAwMy0wOC0yNywgdmVyc2lvbiAwLjYuNQotIHNvYXBfc2VydmVyOiBzdXBwb3J0IGNvbXByZXNzZWQgcmVxdWVzdCBtZXNzYWdlcyAodGhhbmtzIEpvaG4gSHVvbmcpCi0gc29hcF9wYXJzZXI6IGRlc2VyaWFsaXplIEFwYWNoZSBWZWN0b3IgYXMgYW4gYXJyYXkKLSB4bWxzY2hlbWE6IHVzZSAkdGhpcy0+dHlwZW1hcCBpbiBnZXRQSFBUeXBlICh3aGljaCBpcyBub3QgdXNlZCkKLSBzb2FwY2xpZW50LCB3c2RsOiBjaGVjayBmb3IgV1NETCBlcnJvcnMgYWZ0ZXIgc2VyaWFsaXppbmcgcGFyYW1ldGVycwotIG51c29hcF9iYXNlOiBhZGQgc2VyaWFsaXphdGlvbiBvZiBBcGFjaGUgTWFwICh3aGVuIG5vdCB1c2luZyBXU0RMKQotIHdzZGw6IGFkZCBzZXJpYWxpemF0aW9uIG9mIEFwYWNoZSBNYXAgKHdoZW4gdXNpbmcgV1NETCkKLSB3c2RsOiBvbmx5IGNoYW5nZSAmLCA8LCA+IHRvIGVudGl0aWVzLCBub3QgYWxsIEhUTUwgZW50aXRpZXMKCjIwMDMtMDgtMjgsIHZlcnNpb24gMC42LjUKLSBzb2FwX3RyYW5zcG9ydF9odHRwOiBkaXNhYmxlIGNVUkwgdmVyaWZpY2F0aW9uIG9mIHBlZXIgYW5kIHNlcnZlciAoZm9ybWVybHkgdGhlIGNVUkwgZGVmYXVsdCkKLSBzb2FwX3RyYW5zcG9ydF9odHRwOiBtaW5nbGUgY1VSTCBjb2RlIHdpdGggc3RyYWlnaHQgaHR0cCwgc28gc2VuZEhUVFAgaXMgbm8gbG9uZ2VyIG5lZWRlZAoKMjAwMy0wOC0yOSwgdmVyc2lvbiAwLjYuNgotIHNvYXBfdHJhbnNwb3J0X2h0dHA6IGFkZCBzZXRDb250ZW50VHlwZQotIHNvYXBjbGllbnQ6IGNhbGwgc2V0Q29udGVudFR5cGUgdXNpbmcgbmV3IGdldEhUVFBDb250ZW50VHlwZSBhbmQgZ2V0SFRUUENvbnRlbnRUeXBlQ2hhcnNldAoKMjAwMy0wOS0wNSwgdmVyc2lvbiAwLjYuNgotIHdzZGw6IGFkZCBzb21lIG1vcmUgY29kZSB0byBoYW5kbGUgbnVsbC9uaWwgdmFsdWVzIChidXQgdGhlcmUncyBzdGlsbCBhIHdheSB0byBnbykKCjIwMDMtMTAtMjEsIHZlcnNpb24gMC42LjYKLSBzb2FwX3RyYW5zcG9ydF9odHRwOiBvbmx5IGluY2x1ZGUgcG9ydCBpbiBIb3N0IGhlYWRlciBpZiBpdCB3YXMgc3BlY2lmaWVkIGluIHRoZSBVUkwKLSBzb2FwX3RyYW5zcG9ydF9odHRwOiBhZGQgc29tZSBjb2RlIHRvIHVzZSBPcGVuU1NMIGZvciBQSFAgc3NsOi8vIHNjaGVtZSwgYnV0IGNvbW1lbnQgb3V0IHNpbmNlIGl0J3Mgbm90IHJlYWR5Ci0gc29hcF9zZXJ2ZXI6IHVzZSAkX1NFUlZFUlsnUEhQX1NFTEYnXSBpZiAkR0xPQkFMU1snUEhQX1NFTEYnXSBpcyBub3Qgc2V0Ci0gd3NkbDogYWRkIFdTREwgcmVxdWVzdCBhbmQgcmVzcG9uc2UgYW5kIHRyYW5zcG9ydCBkZWJ1ZyB0byBkZWJ1ZwotIHdzZGw6IGhhbmRsZSBjdXN0b20gdHlwZSBleHRlbmRpbmcgeG1sc2NoZW1hIG5hbWVzcGFjZSAoR0xVRSAuLi4gVGhhbmtzIE1hdHQpCi0gc29hcF9wYXJzZXI6IGFkZCBwYXJhbSB0byBkb2NzCi0gc29hcGNsaWVudDogYWRkIGdldEhUVFBCb2R5LCBnZXRIVFRQQ29udGVudFR5cGUsIGdldEhUVFBDb250ZW50VHlwZUNoYXJzZXQgKGFudGljaXBhdGluZyBNSU1FIHN1YmNsYXNzKQoKMjAwMy0xMC0yOCwgdmVyc2lvbiAwLjYuNgotIG51c29hcF9iYXNlOiBhZGQgZXhwYW5kRW50aXRpZXMgbWV0aG9kCi0gd3NkbDogdXNlIGV4cGFuZEVudGl0aWVzCi0gc29hcF9mYXVsdDogdXNlIGV4cGFuZEVudGl0aWVzCi0gc29hcF90cmFuc3BvcnRfaHR0cDogQWxsb3cgY3JlZGVudGlhbHMgdG8gYmUgaW5jbHVkZWQgaW4gVVJMLCByYXRoZXIgdGhhbiByZXF1aXJpbmcgc2V0Q3JlZGVudGlhbHMKLSBzb2FwX3RyYW5zcG9ydF9odHRwOiBNZXJnZSBIVFRQIGhlYWRlcnMgdGhhdCBzcGFuIG11bHRpcGxlIGxpbmVzCi0gc29hcF9wYXJzZXI6IFByb3Blcmx5IHNldCBlcnJvcnMgaW4gY3RvcgotIHNvYXBjbGllbnQ6IFBhc3MgaGVhZGVycyB0byBwYXJzZVJlc3BvbnNlIGFuZCBwYXJzZSB0aGVtIGluIHRoYXQgbWV0aG9kCgoyMDAzLTEwLTMwLCB2ZXJzaW9uIDAuNi42Ci0geG1sc2NoZW1hOiBBZGQgc29tZSBpbmZvcm1hdGlvbiBmb3IgdGhlIHJlbGF0ZWQgdHlwZSB0byBhbiBlbGVtZW50CgoyMDAzLTEyLTA5LCB2ZXJzaW9uIDAuNi42Ci0gbnVzb2FwX2Jhc2U6IEFkZCBzb21lIG5hbWVzcGFjZSBtZXRob2RzIHByZXZpb3VzbHkgaW4geG1sc2NoZW1hCi0geG1sc2NoZW1hOiBJbXByb3ZlIHBhcnNpbmcgb2YgY29tcGxleFR5cGUsIGVsZW1lbnQgYW5kIHNpbXBsZVR5cGUKLSB4bWxzY2hlbWE6IEltcHJvdmUgc2VyaWFsaXphdGlvbgotIHhtbHNjaGVtYTogVHJhY2sgaW1wb3J0cwotIHhtbHNjaGVtYTogVHJhY2sgZWxlbWVudEZvcm1EZWZhdWx0IGFuZCBmb3JtIGF0dHJpYnV0ZXMKLSB3c2RsOiBTdXBwb3J0IG11bHRpcGxlIDxzY2hlbWE+IChub3RlIHRoYXQgc2V0dGluZyAkc2VydmVyLT53c2RsLT5zY2hlbWFUYXJnZXROYW1lc3BhY2Ugbm8gbG9uZ2VyIGRvZXMgYW55dGhpbmchICBVc2UgY29uZmlndXJlV1NETCBpbnN0ZWFkLikKLSB3c2RsOiBVc2UgZm9ybSBhdHRyaWJ1dGUgb2YgZWxlbWVudCB0byBjb250cm9sIG5hbWVzcGFjZSBzcGVjaWZpY2F0aW9uCi0gd3NkbDogU3VwcG9ydCBjaGFpbmVkIGltcG9ydHMgKEEgaW1wb3J0cyBCIHdoaWNoIGltcG9ydHMgQykKLSB3c2RsOiBJbmNsdWRlIHBvcnQgaW4gZW5kcG9pbnQgYWRkcmVzcyB3aGVuIHNlcmlhbGl6aW5nCi0gc29hcF9zZXJ2ZXI6IEZpeCB1c2Ugb2Ygc3R5bGUgKHJwY3xkb2N1bWVudCkgYW5kIHVzZSAoZW5jb2RlZHxsaXRlcmFsKQotIHNvYXBfc2VydmVyOiBTdXBwb3J0IF9TRVJWRVJbQ09OVEVOVF9UWVBFXSBpbiBhZGRpdGlvbiB0byBfU0VSVkVSW0hUVFBfQ09OVEVOVF9UWVBFXQotIHNvYXBfc2VydmVyOiBTdXBwb3J0IHdzZGwgd2l0aCBtdWx0aXBsZSA8c2NoZW1hPgotIHNvYXBfY2xpZW50OiBSZW1vdmUgYSB2YXJfZHVtcAotIHNvYXBfY2xpZW50OiBBZGQgc3R5bGUgYW5kIHVzZSBwYXJhbWV0ZXJzIHRvIGNhbGwgbWV0aG9kIHRvIHN1cHBvcnQgZG9jL2xpdCB3aXRob3V0IFdTREwKLSBzb2FwX3RyYW5zcG9ydF9odHRwOiBDaGVjayB0aGF0ICR0aGlzLT5mcCBleGlzdHMgd2hlbiBkb2luZyBwZXJzaXN0ZW50IGNvbm5lY3Rpb25zCgoyMDAzLTEyLTE3LCB2ZXJzaW9uIDAuNi42Ci0gc29hcF9zZXJ2ZXI6IHBhc3MgbmFtZXNwYWNlcyB0byB4bWxzY2hlbWEgY29uc3RydWN0b3IKLSB3c2RsOiBwb3N0LXByb2Nlc3MgYWZ0ZXIgYWxsIGltcG9ydHMKLSB3c2RsOiByZW1vdmUgc29tZSBkZWJ1ZywgYWRkIHNvbWUgZXJyb3IgaGFuZGxpbmcKLSB4bWxzY2hlbWE6IGFsbG93IGVuY2xvc2luZyBuYW1lc3BhY2VzIHRvIGJlIHNwZWNpZmllZCBpbiBjb25zdHJ1Y3RvcgotIHhtbHNjaGVtYTogaW1wcm92ZSBoYW5kbGluZyBvZiBjb21wb3NpdG9ycyBhbmQgc2ltcGxlIHR5cGVzCgoyMDA0LTAxLTA4LCB2ZXJzaW9uIDAuNi42Ci0gc29hcF9zZXJ2ZXI6IHdoZW4gcmVxdWVzdGVkIFdTREwgaXMgaW4gYSBmaWxlLCByZXR1cm4gdG8gY2xpZW50IHVzaW5nIHBhc3N0aHJ1ICh0aGFua3MgSW5nbyBGaXNjaGVyKQotIHNvYXBjbGllbnQ6IGhhdmUgcHJveHkgaW5oZXJpdCBtb3JlIGNsaWVudCBzdGF0ZQotIHNvYXBjbGllbnQ6IGFsbG93IHRpbWVvdXQgYW5kIHJlc3BvbnNlIHRpbWVvdXQgdG8gYmUgc3BlY2lmaWVkIGluIHRoZSBjb25zdHJ1Y3RvcgotIHdzZGw6IGFsbG93IHRpbWVvdXQgYW5kIHJlc3BvbnNlIHRpbWVvdXQgdG8gYmUgc3BlY2lmaWVkIGluIHRoZSBjb25zdHJ1Y3RvcgotIHNvYXBfdHJhbnNwb3J0X2h0dHA6IGFsbG93IHJlc3BvbnNlIHRpbWVvdXQgdG8gYmUgc3BlY2lmaWVkIGluIHNlbmQgYW5kIHNlbmRIVFRQUwoKMjAwNC0wMS0yOCwgdmVyc2lvbiAwLjYuNgotIHdzZGw6IGFkZCBuYW1lc3BhY2UgZm9yIGFycmF5IGFuZCBzY2FsYXIgd2hlbiBmb3JtIGlzIHF1YWxpZmllZAotIHdzZGw6IGZpeCBhIGJ1ZyBpbiB3aGljaCBkYXRhIHR5cGUgb2YgY29tcGxleFR5cGUgZWxlbWVudHMgd2VyZSBpZ25vcmVkIGluIHNlcmlhbGl6YXRpb24KLSB3c2RsOiBlbmhhbmNlIGhhbmRsaW5nIG9mIFVSTHMgd2l0aCBmaWxlIHNjaGVtZQotIHdzZGw6IGFkZCBhZGRTaW1wbGVUeXBlCi0geG1sc2NoZW1hOiBhZGQgYWRkU2ltcGxlVHlwZQotIHhtbHNjaGVtYTogYWx3YXlzIHNldCBwaHBUeXBlIGVsZW1lbnRzCi0gc29hcGNsaWVudDogYWxsb3cgYSB3c2RsIGluc3RhbmNlIHRvIGJlIHNwZWNpZmllZCBpbiBjb25zdHJ1Y3RvcgotIHNvYXBfc2VydmVyOiBhbGxvdyBhIHdzZGwgaW5zdGFuY2UgdG8gYmUgc3BlY2lmaWVkIGluIGNvbnN0cnVjdG9yIChub3QgdGVzdGVkISkKLSBzb2FwX3NlcnZlcjogZml4IGRlZmF1bHQgU09BUEFjdGlvbiBjcmVhdGVkIGluIHJlZ2lzdGVyIG1ldGhvZAotIHNvYXBfdHJhbnNwb3J0X2h0dHA6IGFjY2VwdCBjaHVua2luZyB3aXRoIExGIHNlcGFyYXRvcnMgaW4gYWRkaXRpb24gdG8gQ1JMRi4KLSB3c2RsY2FjaGU6IGFkZGVkIGNsYXNzCi0gbnVzb2FwbWltZTogZml4IGNvbW1lbnRzCgoyMDA0LTAyLTIzLCB2ZXJzaW9uIDAuNi42Ci0gc29hcF90cmFuc3BvcnRfaHR0cDogZG9uJ3QgdHJ5IHRvIHVuY2h1bmsgY1VSTCBkYXRhLCBzaW5jZSBjVVJMIGFscmVhZHkgZG9lcyBpdAotIHNvYXBfdHJhbnNwb3J0X2h0dHA6IGFwcGVuZCBDVlMgcmV2aXNpb24gdG8gdmVyc2lvbiBpbiBVc2VyLUFnZW50Ci0gd3NkbDogc2VyaWFsaXplIGJvb2xlYW4gYXMgdHJ1ZXxmYWxzZSwgbm90IDF8MCwgdG8gYWdyZWUgd2l0aCBYTUwgU2NoZW1hCi0gc29hcF9zZXJ2ZXI6IGFsd2F5cyBleGl0KCkgYWZ0ZXIgcmV0dXJuaW5nIFdTREwKLSBzb2FwX3NlcnZlcjogdXNlIHRoZSBXU0RMIFVSTCBzY2hlbWUgYXMgdGhlIGRlZmF1bHQgZW5kcG9pbnQgVVJMIHNjaGVtZQotIHNvYXBfc2VydmVyOiBhcHBlbmQgQ1ZTIHJldmlzaW9uIHRvIHZlcnNpb24gaW4gWC1TT0FQLVNlcnZlcgotIG51c29hcF9iYXNlOiBhZGQgKENWUykgcmV2aXNpb24KLSB3c2RsY2FjaGU6IHN5bmNocm9uaXplIHVzaW5nIGEgcGVyLVdTREwgbG9jayBmaWxlIChUaGFua3MgSW5nbykKLSB3c2RsY2FjaGU6IGFkZCBjYWNoZSBsaWZldGltZSwgYWZ0ZXIgd2hpY2ggY2FjaGUgY29udGVudHMgYXJlIGludmFsaWRhdGVkIChUaGFua3MgSW5nbykKCjIwMDQtMDMtMTUsIHZlcnNpb24gMC42LjYKLSBudXNvYXBfYmFzZTogYWRkIGlzQXJyYXlTaW1wbGVPclN0cnVjdCBtZXRob2QKLSBzb2FwX3NlcnZlcjogaW1wcm92ZSBXU0RMIFVSTCBzY2hlbWUgZGV0ZXJtaW5hdGlvbgotIHNvYXBfc2VydmVyOiBvbmx5IGRlZmxhdGUvZ3ppcCBwYXlsb2FkcyA+IDEwMjQgYnl0ZXMKLSBzb2FwX3NlcnZlcjogZml4IHBhcmFtZXRlciBvcmRlciBpbiBmYXVsdCBtZXRob2QgKGFsd2F5cyB1c2VkIGFzIGZhdWx0Y29kZSwgZmF1bHRzdHJpbmcpCi0gc29hcF9zZXJ2ZXI6IHJlZmFjdG9yIHBhcnNlX3JlcXVlc3QgaW50byBtdWx0aXBsZSBmdW5jdGlvbnMgKGZvciBzYW5pdHkpCi0gc29hcF9zZXJ2ZXI6IHNldCB0aGUgbmFtZXNwYWNlIG9uIHRoZSBSZXNwb25zZSBlbGVtZW50IHRvIHRoZSBzYW1lIGFzIHRoZSByZXF1ZXN0Ci0gc29hcF9zZXJ2ZXI6IG5hbWUgdGhlIHJldHVybiB2YWx1ZSBlbGVtZW50ICdyZXR1cm4nIGJ5IGRlZmF1bHQKLSBzb2FwX3NlcnZlcjogYWRkZWQgYW5kIGRvY3VtZW50ZWQgZGF0YSBmaWVsZHMsIHNvIHRoYXQgc2VydmljZSBwcm9ncmFtbWVycyBjYW4gdXNlIHRoZW0gaWYgZGVzaXJlZAotIHNvYXBfcGFyc2VyOiBzdGFuZGFyZGl6ZSBwYXJzaW5nIGVycm9yIG1lc3NhZ2UKLSBzb2FwX3BhcnNlcjogZml4IGRvY3VtZW50IGFuZCByZXNwb25zZUhlYWRlcnMgc28gdGhleSBhcmUgdGhlIGNvcnJlY3QgWE1MIHRleHQgKGFzIGRvY3VtZW50ZWQpCi0gc29hcF90cmFuc3BvcnRfaHR0cDogZml4IHJlYWQgZnJvbSBwZXJzaXN0ZW50IGNvbm5lY3Rpb24KLSBzb2FwY2xpZW50OiBjbGVhbiB1cCBkZWJ1Z2dpbmcgZm9yIHBlcnNpc3RlbnQgY29ubmVjdGlvbgotIHdzZGw6IGVuZm9yY2UgY29ycmVjdCBuYW1pbmcgb2YgbWVzc2FnZXMgcGFydHMgd2hlbiBhbiBhc3NvY2lhdGl2ZSBhcnJheSBpcyB1c2VkIGZvciBwYXJhbWV0ZXJzCi0gd3NkbDogYmV0dGVyIHNlcmlhbGl6YXRpb24gb2YgbnVsbCB2YWx1ZXMKLSB3c2RsOiBzdGFuZGFyZGl6ZSBwYXJzaW5nIGVycm9yIG1lc3NhZ2UKLSB4bWxzY2hlbWE6IHN0YW5kYXJkaXplIHBhcnNpbmcgZXJyb3IgbWVzc2FnZQoKMjAwNC0wMy0yNCwgdmVyc2lvbiAwLjYuNwotIHNvYXBfdHJhbnNwb3J0X2h0dHA6IGFkZCBkaWdlc3QgYXV0aGVudGljYXRpb24gKGJhc2VkIG9uIGNvZGUgYnkgS2V2aW4gQS4gTWlsbGVyKQotIHhtbHNjaGVtYTogaW1wcm92ZSBwYXJzaW5nIG9mIGltcG9ydCBlbGVtZW50cwotIHdzZGw6IGRvIHNjaGVtYSBpbXBvcnRzIGV2ZW4gaWYgdGhlcmUgYXJlIG5vIHdzZGwgaW1wb3J0cwoKMjAwNC0wNC0xMiwgdmVyc2lvbiAwLjYuNwotIHdzZGw6IHNlcmlhbGl6ZSBtdWx0aXBsZSBlbGVtZW50cyB3aGVuIG1heE9jY3Vycz0idW5ib3VuZGVkIiBhbmQgdmFsdWUgaXMgYW4gYXJyYXkKLSB3c2RsOiBzZXJpYWxpemUgc29hcHZhbCB2YWx1ZXMgKHVzZWQgdG8gZm9yY2UgYW4gWE1MIHR5cGUsIGUuZy4gd2hlbiBXU0RMIHVzZXMgYW4gYWJzdHJhY3QgdHlwZSkKLSBudXNvYXBtaW1lOiBkbyBub3QgcmVxdWlyZSBudXNvYXAucGhwIChpdCBpcyBub3cgdGhlIHByb2dyYW1tZXIncyByZXNwb25zaWJpbGl0eSkKCjIwMDQtMDQtMjEsIHZlcnNpb24gMC42LjcKLSBzb2FwX3BhcnNlcjogcGFyc2UgcmVwZWF0ZWQgZWxlbWVudCBuYW1lIGludG8gYW4gYXJyYXkgKGRlLXNlcmlhbGl6ZXMgZG9jL2xpdCBhcnJheSBpbnRvIGEgUEhQIGFycmF5IHdoZW4gdGhlcmUgaXMgbW9yZSB0aGFuIDEgYXJyYXkgZWxlbWVudCkKLSBzb2FwX3NlcnZlcjogZG8gbm90IHdyYXAgcmVzcG9uc2UgaW4gYSByZXNwb25zZSBlbGVtZW50IGZvciBhIGRvY3VtZW50IHN0eWxlIHNlcnZpY2UKCjIwMDQtMDQtMzAsIHZlcnNpb24gMC42LjcKLSBzb2FwX3RyYW5zcG9ydF9odHRwOiBhbGxvdyBkaWdlc3QgYXV0aCBwYXJhbXMgdG8gYmUgc2VwYXJhdGVkIGJ5ICIsIiBhcyB3ZWxsIGFzICIsICIKLSBzb2FwX3RyYW5zcG9ydF9odHRwOiByZS1pbml0aWFsaXplIGluY29taW5nIGhlYWRlcnMgZm9yIGVhY2ggcmVzcG9uc2UKLSBzb2FwX3NlcnZlcjogYWRkIG1ldGhvZHJldHVybmlzbGl0ZXJhbHhtbCBwcm9wZXJ0eSB0byBhbGxvdyBzZXJ2aWNlIGZ1bmN0aW9uIHRvIHJldHVybiBYTUwgYXMgYSBzdHJpbmcKLSBzb2FwY2xpZW50OiBpbXByb3ZlIHJwYy9saXRlcmFsIHN1cHBvcnQKLSBzb2FwY2xpZW50OiBhbGxvdyBYTUwgc3RyaW5nIGFzIGNhbGwgcGFyYW1zIGluIGFkZGl0aW9uIHRvIGFycmF5Ci0gc29hcGNsaWVudDogc3VwcG9ydCBkb2N1bWVudCBzdHlsZSBhbmQgbGl0ZXJhbCBlbmNvZGluZyB3aGVuIG5vdCB1c2luZyBXU0RMCgoyMDA0LTA1LTA1LCB2ZXJzaW9uIDAuNi43Ci0gd3NkbDogc2VyaWFsaXplIFBIUCBvYmplY3RzIGZvciBXU0RMIFhNTCBTY2hlbWEgY29tcGxleFR5cGVzLCBpbiBhZGRpdGlvbiB0byBhc3NvY2lhdGl2ZSBhcnJheXMKLSB3c2RsOiBmaXggV1NETCBnZW5lcmF0aW9uIHdoZW4gdGhlcmUgaXMgbm8gZW5jb2RpbmdTdHlsZQotIHNvYXBfdHJhbnNwb3J0X2h0dHA6IHN1cHByZXNzIGZzb2Nrb3BlbiB3YXJuaW5ncwotIHNvYXBfdHJhbnNwb3J0X2h0dHA6IGRldGVjdCBzb2NrZXQgdGltZW91dHMgd2hlbiByZWFkaW5nICgwIGJ5dGVzIHJldHVybmVkKQotIHNvYXBfdHJhbnNwb3J0X2h0dHA6IHJlYWQgY2h1bmtlZCBjb250ZW50ICJpbi1saW5lIiBzbyBpdCB3b3JrcyBvbiBhIHBlcnNpc3RlbnQgY29ubmVjdGlvbgotIG51c29hcF9iYXNlOiBzZXJpYWxpemUgYm9vbGVhbiBhcyB0cnVlfGZhbHNlLCBub3QgMXwwLCB0byBhZ3JlZSB3aXRoIFhNTCBTY2hlbWEKLSBudXNvYXBfYmFzZTogc2VyaWFsaXplIGFycmF5IG9mIHN0cnVjdCBkaWZmZXJlbnRseSB0aGFuIGFycmF5IG9mIGFycmF5CgoyMDA0LTA2LTI1LCB2ZXJzaW9uIDAuNi44Ci0gc29hcF9zZXJ2ZXI6IHByZWZlciBnemlwIHRvIGRlZmxhdGUsIHNpbmNlIElFIGRvZXMgbm90IGxpa2Ugb3VyIGRlZmxhdGUKLSBzb2FwX3NlcnZlcjogbW92ZSB3ZWJEZXNjcmlwdGlvbiB0byB0aGUgd3NkbCBjbGFzcwotIHNvYXBfc2VydmVyOiBhbGxvdyBjbGFzcyBhbmQgaW5zdGFuY2UgbWV0aG9kIGNhbGxzIGZvciBzZXJ2aWNlICh0aGFua3MgSW5nbyBGaXNjaGVyIGFuZCBSb2xhbmQgS25hbGwpCi0gd3NkbDogZ2V0IHdlYkRlc2NyaXB0aW9uIGZyb20gdGhlIHNvYXBfc2VydmVyIGNsYXNzCi0gd3NkbDogYWxsb3cgY29tcHJlc3Npb24gZnJvbSB0aGUgc2VydmVyCi0gd3NkbDogZml4IHNlcmlhbGl6YXRpb24gb2Ygc29hcHZhbCB3aXRob3V0IGEgdHlwZQotIHdzZGw6IHByb3BhZ2F0ZSBkZWJ1ZyB2YWx1ZSBmcm9tIHF1ZXJ5IHN0cmluZyB0byBTT0FQIGVuZHBvaW50IGluIHByb2dyYW1tYXRpYyBXU0RMIGdlbmVyYXRpb24KLSBudXNvYXBfYmFzZTogYWRkIGFueVR5cGUsIGFueVNpbXBsZVR5cGUgZm9yIDIwMDEgWE1MIFNjaGVtYQotIG51c29hcF9iYXNlOiBwcm92aWRlIGFkZGl0aW9uYWwgZGVidWcgZnVuY3Rpb25zCi0gc29hcF90cmFuc3BvcnRfaHR0cDogaWdub3JlIENvbnRlbnQtTGVuZ3RoIHdoZW4gY2h1bmtlZCBlbmNvZGluZyBpcyB1c2VkCi0gc29hcF90cmFuc3BvcnRfaHR0cDogcmVtb3ZlICc6JyBmcm9tIHVzZXJuYW1lIGZvciBCYXNpYyBhdXRoZW50aWNhdGlvbiAoY2YuIFJGQyAyNjE3KQotIHNvYXBfdHJhbnNwb3J0X2h0dHA6IHVybGRlY29kZSB1c2VybmFtZSBhbmQgcGFzc3dvcmQgdGFrZW4gZnJvbSBVUkwKLSBzb2FwX3RyYW5zcG9ydF9odHRwOiB1c2UgcmF3IGluZmxhdGUvZGVmbGF0ZSBmb3IgSUUvSUlTIGNvbXBhdGliaWxpdHksIHJhdGhlciB0aGFuIGhhdmluZyBabGliIGhlYWRlcnMgYWNjb3JkaW5nIHRvIEhUVFAgMS4xIHNwZWMKLSBzb2FwX3RyYW5zcG9ydF9odHRwOiBhdHRlbXB0IHRvIGhhbmRsZSB0aGUgY2FzZSB3aGVuIGJvdGggdGhlIHNlcnZpY2UgYXBwbGljYXRpb24gYW5kIFdlYiBzZXJ2ZXIgY29tcHJlc3MgdGhlIHJlc3BvbnNlCi0gc29hcGNsaWVudDogd2hlbiBjcmVhdGluZyBwcm94eSBtZXRob2RzLCByZXBsYWNlICcuJyBpbiBvcGVyYXRpb24gbmFtZSB3aXRoICdfXycgaW4gZnVuY3Rpb24gbmFtZQotIHNvYXBjbGllbnQ6IGluaXRpYWxpemUgcmVxdWVzdEhlYWRlcnMgaW4gcHJveHkKLSBnZW5lcmFsOiB1c2UgbmV3IGRlYnVnIG1ldGhvZHM7IG5ldmVyIGFjY2VzcyBkZWJ1Z19zdHIgZGlyZWN0bHkKCjIwMDQtMDktMzAsIHZlcnNpb24gMC42LjgKLSBzb2FwY2xpZW50OiBkbyBub3QgYWxsb3cgZ2V0UHJveHkgY2FsbCB3aGVuIFdTREwgaXMgbm90IHVzZWQKLSBzb2FwY2xpZW50OiB1c2UgSVNPLTg4NTktMSBhcyB0aGUgY2hhcnNldCBpZiBub3Qgc3BlY2lmaWVkIGluIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyCi0gc29hcGNsaWVudDogd2hlbiBhbiBlbXB0eSBzdHJpbmcgaXMgc3BlY2lmaWVkIGZvciB0aGUgY2FsbCBuYW1lc3BhY2UsIGRvIG5vdCBwdXQgdGhlIG1ldGhvZCBlbGVtZW50IGluIGEgbmFtZXNwYWNlCi0gc29hcGNsaWVudDogbGV0IHNvYXBfdHJhbnNwb3J0X2h0dHAgY2hlY2sgZm9yIFNTTCBzdXBwb3J0Ci0gc29hcGNsaWVudDogaGF2ZSBwcm94eSBpbmhlcml0IHNvYXBfZGVmZW5jb2RpbmcgZnJvbSB0aGUgY2xpZW50IGZyb20gd2hpY2ggaXQgaXMgZ2VuZXJhdGVkCi0gc29hcGNsaWVudDogZG8gbm90IGFzc3VtZSB0aGF0ICduczEnIGlzIGFuIHVudXNlZCBuYW1lc3BhY2UgcHJlZml4OyBhbHdheXMgZ2VuZXJhdGUgbmFtZXNwYWNlIHByZWZpeGVzIHJhbmRvbWx5Ci0gc29hcF9wYXJzZXI6IGNvbXBhcmUgYW55IGVuY29kaW5nIGluIHRoZSBYTUwgZGVjbGFyYXRpb24gdG8gdGhlIGNoYXJzZXQgZnJvbSB0aGUgSFRUUCBDb250ZW50LVR5cGUgaGVhZGVyICh0aGFua3MgSW5nbyBGaXNjaGVyKQotIHNvYXBfcGFyc2VyOiBpbXByb3ZlIHBhcnNlIHJlcGVhdGVkIGVsZW1lbnQgbmFtZSBpbnRvIGFuIGFycmF5IChkZS1zZXJpYWxpemVzIGRvYy9saXQgYXJyYXkgaW50byBhIFBIUCBhcnJheSB3aGVuIHRoZXJlIGlzIG1vcmUgdGhhbiAxIGFycmF5IGVsZW1lbnQpCi0gc29hcF9zZXJ2ZXI6IHVzZSBJU08tODg1OS0xIGFzIHRoZSBjaGFyc2V0IGlmIG5vdCBzcGVjaWZpZWQgaW4gdGhlIENvbnRlbnQtVHlwZSBoZWFkZXIKLSBzb2FwX3NlcnZlcjogYWxsb3cgc3VwcHJlc3Npb24gb2YgYXV0b21hdGljIFVURi04IGRlY29kaW5nCi0gc29hcF9zZXJ2ZXI6IGZpeCBhIGJ1ZyB3aGVuIGNhbGxfdXNlcl9mdW5jX2FycmF5KCkgaXMgdXNlZAotIHNvYXBfdHJhbnNwb3J0X2h0dHA6IGNvcnJlY3QgZGlnZXN0IGF1dGhlbnRpY2F0aW9uIHRocm91Z2ggYSBwcm94eQotIHdzZGw6IHNlcmlhbGl6ZSBTT0FQLUVOQyB0eXBlcyBzaW1pbGFybHkgdG8gWFNEIHR5cGVzCi0geG1sc2NoZW1hOiBmb3JjZSB1bnByZWZpeGVkIHR5cGUgaW50byBkZWZhdWx0IG5hbWVzcGFjZQotIHhtbHNjaGVtYTogZml4IHNlcmlhbGl6YXRpb24gb2YgZGVmaW5pdGlvbiBvZiBzaW1wbGUgdHlwZXMKCjIwMDQtMTAtMDEsIHZlcnNpb24gMC42LjgKLSBzb2FwX3BhcnNlcjogaGFuZGxlIGRlZmF1bHQgbmFtZXNwYWNlIGF0dHJpYnV0ZXMKLSBzb2FwX3NlcnZlcjogYWRkIGRlZmF1bHRfdXRmOCBmaWVsZAotIHNvYXBfc2VydmVyOiBzdXBwb3J0IGxpdGVyYWwgZW5jb2RpbmcgKHdpdGggUlBDIHN0eWxlKQotIHNvYXBfdHJhbnNwb3J0X2h0dHA6IHBhcnNlIEhUVFAgc3RhdHVzIGFuZCBnZW5lcmF0ZSBlcnJvciBmb3IgMzAwLCAzMDItMzA3LCA0MDAsIDQwMS00MTcsIDUwMS01MDUgKHRoYW5rcyBmb3IgdGhlIGlkZWEgR2hpc2xhaW4pCi0gc29hcF90cmFuc3BvcnRfaHR0cDogZm9sbG93IEhUVFAgcmVkaXJlY3Rpb24gKEhUVFAgc3RhdHVzIDMwMSBhbmQgTG9jYXRpb24gaGVhZGVyKSAodGhhbmtzIGZvciB0aGUgaWRlYSBHaGlzbGFpbikKLSB4bWxzY2hlbWE6IGFsbG93IGFueSBhdHRyaWJ1dGVzIHRvIGJlIHNwZWNpZmllZCBpbiBhbiBlbGVtZW50IG9mIGEgY29tcGxleFR5cGUsIGUuZy4sIGFic3RyYWN0LCBkZWZhdWx0LCBmb3JtLCBtaW5PY2N1cnMsIG1heE9jY3VycywgbmlsbGFibGUgKHRoYW5rcyBKaXJrYSBQZWNoIGZvciB0aGUgb3JpZ2luYWwgcGF0Y2gpCgoyMDA0LTEwLTAyLCB2ZXJzaW9uIDAuNi44Ci0gc29hcGNsaWVudDogcmVhZC93cml0ZSBjb29raWVzICh0aGFua3MgSW5nbykKLSBzb2FwX3NlcnZlcjogY2hhbmdlIGZhdWx0Y29kZSBvbiBub24tcmVzZW5kYWJsZSBmYXVsdHMgdG8gQ2xpZW50Ci0gc29hcF90cmFuc3BvcnRfaHR0cDogcmVhZC93cml0ZSBjb29raWVzICh0aGFua3MgSW5nbykKCjIwMDQtMTAtMDUsIHZlcnNpb24gMC42LjgKLSB3c2RsOiBhZGQgYWRkRWxlbWVudCBtZXRob2QKLSB3c2RsOiBzdXBwb3J0IHRoZSBkb2N1bWVudCBzdHlsZSBpbiB0aGUgcmVnaXN0ZXIgbWV0aG9kCi0geG1sc2NoZW1hOiBwYXJzZSB1bm5hbWVkIHNpbXBsZVR5cGVzLCByYXRoZXIgdGhhbiBpZ25vcmluZyB0aGVtCi0geG1sc2NoZW1hOiBpbmNsdWRlIHVudHlwZWQgZWxlbWVudHMgd2hlbiBwYXJzaW5nIGEgY29tcGxleFR5cGUKLSB4bWxzY2hlbWE6IGFkZCBhZGRFbGVtZW50IG1ldGhvZAoKMjAwNC0xMC0xNCwgdmVyc2lvbiAwLjYuOAotIHNvYXBjbGllbnQ6IHN1cHBvcnQgY2xpZW50IGNlcnRpZmljYXRlcwotIHNvYXBfcGFyc2VyOiBkZXNlcmlhbGl6ZSBhdHRyaWJ1dGVzLCBwcmVmaXhpbmcgbmFtZXMgd2l0aCAiISIKLSBzb2FwX3NlcnZlcjogbm90aWZ5IHRoZSBjbGllbnQgd2l0aCBIVE1MIHdoZW4gV1NETCBpcyByZXF1ZXN0ZWQgYnV0IG5vdCBzdXBwb3J0ZWQgYnkgc2VydmljZQotIHNvYXBfdHJhbnNwb3J0X2h0dHA6IHN1cHBvcnQgY2xpZW50IGNlcnRpZmljYXRlcwotIHdzZGw6IHN1cHBvcnQgZGVmYXVsdHMgZm9yIGVsZW1lbnRzIG9mIGEgY29tcGxleFR5cGUKLSB3c2RsOiBzZXJpYWxpemUgZWxlbWVudHMgZnJvbSBjb21wbGV4VHlwZSBleHRlbnNpb24gYmFzZQotIHdzZGw6IHNlcmlhbGl6ZSBkYXRhIChhc3NvY2lhdGl2ZSBhcnJheSBlbGVtZW50cykgYXMgYXR0cmlidXRlcyBhY2NvcmRpbmcgdG8gWE1MIFNjaGVtYQotIHhtbHNjaGVtYTogcmVjb3JkIGV4dGVuc2lvbiBiYXNlIGlmIHByZXNlbnQgZm9yIGEgY29tcGxleFR5cGUKCjIwMDQtMTItMTUsIHZlcnNpb24gMC42LjgKLSBudXNvYXBfYmFzZTogYWRkIDIwMDAgWE1MIFNjaGVtYSAocmFyZSwgYnV0IHVzZWQgYnkgQWthbWFpKQotIHNvYXBfcGFyc2VyOiBhdm9pZCBkZXNlcmlhbGl6aW5nIG1vcmUgY29tbW9uIGF0dHJpYnV0ZXMgdGhhdCBhcmUgbm90IGRhdGEKLSBzb2FwX3BhcnNlcjogYmUgbGF4IHdoZW4gSFRUUCBzcGVjaWZpZXMgSVNPLTg4NTktMSAodGhlIGRlZmF1bHQpIGFuZCBYTUwgc3BlY2lmaWVzIFVURi04ICh0aGUgbm9ybSkKLSBzb2FwX3NlcnZlcjogYWNjb3VudCBmb3IgdGhlIGZhY3QgdGhhdCBnZXRfY2xhc3NfbWV0aG9kcyByZXR1cm5zIG1ldGhvZHMgaW4gYWxsIGxvd2VyIGNhc2UgKHRoYW5rcyBTdGV2ZSBIYWxkYW5lKQotIHNvYXBfdHJhbnNwb3J0X2h0dHA6IHBhcnNlIGRpZ2VzdCBpbmZvIHRoYXQgaW5jbHVkZXMgJz0nIGluIHRoZSBkYXRhICh0aGFua3MgSmluc3VrIEtpbSkKLSB3c2RsOiBmZWFibHkgaGFuZGxlIHNvbWUgY2FzZXMgZm9yIGxpdGVyYWwgc2VyaWFsaXphdGlvbiBvZiBmb3JtPSJ1bnF1YWxpZmllZCIgZWxlbWVudHMKLSB3c2RsOiBkb24ndCBzZXJpYWxpemUgdGhlIGRlY2ltYWwgcG9ydGlvbiBvZiBhIFBIUCBkb3VibGUgd2hlbiB0aGUgWE1MIHR5cGUgaXMgbG9uZwotIHdzZGw6IGZpeCBzZXJpYWxpemF0aW9uIG9mIGF0dHJpYnV0ZXMgZm9yIGNvbXBsZXhUeXBlIHRoYXQgaXMgYW4gZXh0ZW5zaW9uCi0gd3NkbGNhY2hlOiBlbmhhbmNlIGRpYWdub3N0aWNzCi0geG1sc2NoZW1hOiBoYW5kbGUgdW50eXBlZCBlbGVtZW50cwotIHhtbHNjaGVtYTogaGFuZGxlIFdTREwgZm9yIFNPQVAgQXJyYXkgdGhhdCB1c2VzIHRoZSBiYXNlIGF0dHJpYnV0ZSBwbHVzIGEgc2VxdWVuY2Ugb2YgZWxlbWVudAoKMjAwNS0wMS0yMiwgdmVyc2lvbiAwLjYuOAotIHdzZGw6IGFsbG93IGFuIGVsZW1lbnQgaW4gb25lIHNjaGVtYSB0byBoYXZlIGEgdHlwZSBmcm9tIGFub3RoZXIgc2NoZW1hCgoyMDA1LTAxLTI0LCB2ZXJzaW9uIDAuNi44Ci0geG1sc2NoZW1hOiBjb3JyZWN0bHkgcGFyc2UgbmVzdGVkIGNvbXBsZXhUeXBlIGRlZmluaXRpb25zCgoyMDA1LTAyLTE0LCB2ZXJzaW9uIDAuNi44Ci0gbnVzb2FwX2Jhc2U6IGZpeCBhIGJ1ZyBpbiB3aGljaCBhdHRyaWJ1dGVzIHdlcmUgc29tZXRpbWVzIG5vdCBzZXJpYWxpemVkIHdpdGggYSB2YWx1ZQotIG51c29hcF9iYXNlOiBpbXByb3ZlIHNlcmlhbGl6YXRpb24gb2YgbnVsbCB2YWx1ZXMgKHRoYW5rcyBEb21pbmlxdWUgU3RlbmRlcikKLSBzb2FwX3BhcnNlcjogcGFyc2UgbnVsbCB2YWx1ZXMgYnkgaGFuZGxpbmcgdGhlIG5pbCBhdHRyaWJ1dGUgKHRoYW5rcyBEb21pbmlxdWUgU3RlbmRlcikKLSBzb2FwX3NlcnZlcjogc2V0IGNoYXJhY3RlciBlbmNvZGluZyBmb3IgYSBmYXVsdCB0byBiZSB0aGUgc2FtZSBhcyBmb3IgdGhlIHNlcnZlciAodGhhbmtzIE1hcmsgU2NvdHQpCi0gc29hcF9zZXJ2ZXI6IGNvcnJlY3RseSBjaGVjayBmb3IgbnVsbCB2YWx1ZSByZXR1cm5lZCBmcm9tIG1ldGhvZCB3aGVuIFdTREwgaXMgdXNlZCAod2l0aG91dCBXU0RMLCBjYW5ub3QgZGlzdGluZ3Vpc2ggd2hldGhlciBOVUxMIG9yIHZvaWQgcmV0dXJuIGlzIGRlc2lyZWQpCi0gc29hcGNsaWVudDogZm9yIGRvY3VtZW50IHN0eWxlLCBjYWxsIHNob3VsZCBhbHdheXMgcmV0dXJuIGFuIGFycmF5IHJvb3RlZCBhdCB0aGUgcmVzcG9uc2UgcGFydCAoYWxsIGJldHMgYXJlIG9mZiB3aGVuIHRoZXJlIGFyZSBtdWx0aXBsZSBwYXJ0cykKLSB4bWxzY2hlbWE6IHNhdmUgZW51bWVyYXRpb24gdmFsdWVzIHBhcnNlZCBmcm9tIFdTREwKCjIwMDUtMDItMTAsIHZlcnNpb24gMC42LjkKLSBzb2FwY2xpZW50OiBvbmx5IHNldCBTT0FQIGhlYWRlcnMgd2hlbiB0aGV5IGFyZSBzcGVjaWZpZWQgaW4gY2FsbCBwYXJhbXMgKHNvIHNldEhlYWRlcnMgc3RpbGwgd29ya3MpCgoyMDA1LTA0LTA0LCB2ZXJzaW9uIDAuNi45Ci0gc29hcF9zZXJ2ZXI6IHVzZSBnZXRfY2xhc3MgaW5zdGVhZCBvZiBpc19hICh0aGFua3MgVGhvbWFzIE5vZWwpCi0gc29hcGNsaWVudDogdXNlIGdldF9jbGFzcyBpbnN0ZWFkIG9mIGlzX2EgKHRoYW5rcyBUaG9tYXMgTm9lbCkKLSBzb2FwY2xpZW50OiBhZGQgc2V0RW5kcG9pbnQgbWV0aG9kCi0gc29hcF90cmFuc3BvcnRfaHR0cDogZml4IGNsaWVudCBjZXJ0aWZpY2F0ZXMgKHRoYW5rcyBEb3VnIEFuYXJpbm8gYW5kIEVyeWFuIEVyaW9ib3dvKQoKMjAwNS0wNC0yOSwgdmVyc2lvbiAwLjYuOQotIG51c29hcF9iYXNlOiBhZGQgZ2xvYmFsIHZhcmlhYmxlIGFuZCBtZXRob2RzIGZvciBzZXR0aW5nIGRlYnVnIGxldmVsCi0gbnVzb2FwX2Jhc2U6IHVzZSB4c2Q6YW55VHlwZSBpbnN0ZWFkIG9mIHhzZDp1ci10eXBlIHRvIHNlcmlhbGl6ZSBhcnJheXMgd2l0aCBtdWx0aXBsZSBlbGVtZW50IHR5cGVzICh0aGFua3MgSW5nbyBGaXNjaGVyKQotIG51c29hcF9iYXNlOiBleHBhbmQgZW50aXRpZXMgaW4gYXR0cmlidXRlcyAodGhhbmtzIEdhZXRhbm8gR2l1bnRhKQotIHNvYXBjbGllbnQ6IGNhbGwgcGFyZW50IGNvbnN0cnVjdG9yCi0gc29hcHZhbDogY2FsbCBwYXJlbnQgY29uc3RydWN0b3IKLSBzb2FwX2ZhdWx0OiBjYWxsIHBhcmVudCBjb25zdHJ1Y3RvcgotIHNvYXBfcGFyc2VyOiBjYWxsIHBhcmVudCBjb25zdHJ1Y3RvcgotIHNvYXBfc2VydmVyOiBhc3N1bWUgZ2V0X2NsYXNzX21ldGhvZHMgYWx3YXlzIHJldHVybnMgbG93ZXIgY2FzZSBmb3IgUEhQIDQueCBvbmx5Ci0gc29hcF9zZXJ2ZXI6IGNhbGwgcGFyZW50IGNvbnN0cnVjdG9yCi0gc29hcF90cmFuc3BvcnRfaHR0cDogZG8gbm90aGluZyBpbiBzZXRFbmNvZGluZyBpZiBnemRlZmxhdGUgaXMgbm90IHByZXNlbnQgKHRoYW5rcyBGcmFuY2sgVG91YW5lbiBmb3IgcG9pbnRpbmcgdGhpcyBvdXQpCi0gc29hcF90cmFuc3BvcnRfaHR0cDogZml4IGNoZWNrIGZvciBzZXJ2ZXIgcmVxdWVzdCBmb3IgZGlnZXN0IGF1dGhlbnRpY2F0aW9uICh0aGFua3MgTWFyayBTcGF2aW4pCi0gc29hcF90cmFuc3BvcnRfaHR0cDogY2FsbCBwYXJlbnQgY29uc3RydWN0b3IKLSB3c2RsOiBmaXggZG9jdW1lbnRhdGlvbiBwYWdlIHBvcHVwIG9mIG9uZSBtZXRob2QgYWZ0ZXIgYW5vdGhlciAodGhhbmtzIE93ZW4pCi0gd3NkbDogY2FsbCBwYXJlbnQgY29uc3RydWN0b3IKLSB3c2RsOiBleHBhbmQgZW50aXRpZXMgaW4gYXR0cmlidXRlcyAodGhhbmtzIEdhZXRhbm8gR2l1bnRhKQotIHhtbHNjaGVtYTogY2FsbCBwYXJlbnQgY29uc3RydWN0b3IKCjIwMDUtMDYtMDMsIHZlcnNpb24gMC42LjkKLSBudXNvYXBfYmFzZTogc2VyaWFsaXplIGVtcHR5IGFycmF5cyBhcyBoYXZpbmcgZWxlbWVudHMgeHNkOmFueVR5cGVbMF0KLSBudXNvYXBfYmFzZTogYWRkIGVuY29kaW5nU3R5bGUgcGFyYW1ldGVyIHRvIHNlcmlhbGl6ZUVudmVsb3BlCi0gbnVzb2FwX2Jhc2U6IHNlcmlhbGl6ZSB4c2k6dHlwZSB3aXRoIG5pbCB2YWx1ZXMKLSBudXNvYXBfYmFzZTogaW1wcm92ZSBkZWJ1ZyBhbmQgY29tbWVudHMKLSBzb2FwX3BhcnNlcjogY29ycmVjdGx5IHBhcnNlIGFuIGVtcHR5IGFycmF5IHRvIGFuIGVtcHR5IGFycmF5LCBub3QgYW4gZW1wdHkgc3RyaW5nCi0gc29hcF9wYXJzZXI6IGltcHJvdmUgZGVidWcgYW5kIGNvbW1lbnRzCi0gc29hcF9zZXJ2ZXI6IHNwZWNpZnkgZW5jb2RpbmdTdHlsZSBmb3IgZW52ZWxvcGUgd2hlbiBXU0RMIGlzIHVzZWQKLSBzb2FwY2xpZW50OiBmYWN0b3Igb3V0IG5ldyBnZXRQcm94eUNsYXNzQ29kZSBtZXRob2QKLSBzb2FwY2xpZW50OiBzcGVjaWZ5IGVuY29kaW5nU3R5bGUgZm9yIGVudmVsb3BlCi0gc29hcGNsaWVudDogaW1wcm92ZSBkZWJ1ZyBhbmQgY29tbWVudHMKLSB3c2RsOiBhZGQgbmFtZXNwYWNlIGZvciBBcGFjaGUgU09BUCB0eXBlcyBpZiBhIHZhcmlhYmxlIG9mIHN1Y2ggdHlwZSBpcyBzZXJpYWxpemVkCi0gd3NkbDogc2VyaWFsaXplIG5pbCB2YWx1ZSBmb3IgbmlsbGFibGUgZWxlbWVudHMgd2hlbiBubyB2YWx1ZSBpcyBwcm92aWRlZAotIHdzZGw6IHNlcmlhbGl6ZSB4c2k6dHlwZSB3aXRoIG5pbCB2YWx1ZXMKLSB3c2RsOiBjb3B5IGF0dHJpYnV0ZXMgYXMgd2VsbCBhcyBlbGVtZW50cyB0byBhbiBlbGVtZW50IGZyb20gaXRzIGNvbXBsZXhUeXBlCi0gd3NkbDogc3BlY2lmeSBlbmNvZGluZ1N0eWxlIGZvciBvcGVyYXRpb25zCi0gd3NkbDogaW1wcm92ZSBkZWJ1ZyBhbmQgY29tbWVudHMKLSB4bWxzY2hlbWE6IGltcHJvdmUgZGVidWcgYW5kIGNvbW1lbnRzCgoyMDA1LTA2LTAzLCB2ZXJzaW9uIDAuNy4wCi0gbnVzb2FwX2Jhc2U6IGltcHJvdmUgZGVidWcgYW5kIGNvbW1lbnRzCi0gbnVzb2FwX2Jhc2U6IGZpeCB2ZXJzaW9uLCB3aGljaCBzaG91bGQgaGF2ZSBiZWVuIDAuNy4wIHNpbmNlIDIwMDUtMDMtMDQKCjIwMDUtMDYtMDYsIHZlcnNpb24gMC43LjEKLSBudXNvYXBfYmFzZTogYWRqdXN0IG51bWVyaWMgZWxlbWVudCBuYW1lcyBmb3Igc2VyaWFsaXphdGlvbiwgaW5zdGVhZCBvZiBmb3JjaW5nIHRoZW0gdG8gJ3NvYXBWYWwnCi0gbnVzb2FwbWltZTogYWRkIHR5cGU9dGV4dC94bWwgdG8gbXVsdGlwYXJ0L3JlbGF0ZWQgKHRoYW5rcyBFbW1hbnVlbCBDb3Jkb25uaWVyKQotIHNvYXBfZmF1bHQ6IGZpeCBzZXJpYWxpemF0aW9uIG9mIGRldGFpbAotIHNvYXBfc2VydmVyOiBjaGVjayByZXF1aXJlZCBwYXJhbWV0ZXJzIGZvciByZWdpc3RlciBtZXRob2QKLSBzb2FwX3NlcnZlcjogd2hlbiBnZXRhbGxoZWFkZXJzIGlzIHVzZWQsIG1hc3NhZ2UgaGVhZGVyIG5hbWVzCi0gc29hcF9zZXJ2ZXI6IHVzZSBTT0FQQWN0aW9uIHRvIGRldGVybWluZSBvcGVyYXRpb24gd2hlbiBkb2MvbGl0IHNlcnZpY2UgZG9lcyBub3Qgd3JhcCBwYXJhbWV0ZXJzIGluIGFuIGVsZW1lbnQgd2l0aCB0aGUgbWV0aG9kIG5hbWUgKHRoYW5rcyBQZXRlciBIcmFzdG5paykKLSBzb2FwX3RyYW5zcG9ydF9odHRwOiBjb3JyZWN0bHkgaGFuZGxlIG11bHRpcGxlIEhUVFAvMS4xIDEwMCByZXNwb25zZXMgZm9yIGh0dHBzICh0aGFua3MgSmFuIFNsYWJvbikKLSB3c2RsOiBmaXhlZCBkb2N1bWVudGF0aW9uIGZvciBhZGRDb21wbGV4VHlwZSAodGhhbmtzIENzaW50YWxhbiDBZOFtKQotIHdzZGw6IHNlcmlhbGl6ZSBhcnJheSBkYXRhIHdoZW4gbWF4T2NjdXJzID0gJ3VuYm91bmRlZCcgT1IgbWF4T2NjdXJzID4gMSAodGhhbmtzIERvbWluaXF1ZSBTY2hyZWNrbGluZykKLSB3c2RsOiB3aGVuIHNlcmlhbGl6aW5nIGEgc3RyaW5nID09ICdmYWxzZScgYXMgYSBib29sZWFuLCBzZXQgdGhlIHZhbHVlIHRvIGZhbHNlCi0gd3NkbDogd2hlbiBzZXJpYWxpemluZyBhIGNvbXBsZXhUeXBlLCByZXF1aXJlIHRoZSBQSFAgdmFsdWUgc3VwcGxpZWQgdG8gYmUgYW4gYXJyYXkKCjIwMDUtMDctMDEsIHZlcnNpb24gMC43LjEKLSBudXNvYXBfYmFzZTogQWxsb3cgU09BUCBoZWFkZXJzIHRvIGJlIHN1cHBsaWVkIGFzIGFuIGFycmF5IGxpa2UgcGFyYW1ldGVycwotIHNvYXBfcGFyc2VyOiBkZS1zZXJpYWxpemUgc2ltcGxlQ29udGVudCB0aGF0IGFjY29tcGFuaWVzIGNvbXBsZXhDb250ZW50Ci0gc29hcF9zZXJ2ZXI6IGFwcGVuZCBkZWJ1ZyBpbmZvcm1hdGlvbiB3aGVuIHByb2dyYW1tYXRpY2FsbHktZGVmaW5lZCBXU0RMIGlzIHJldHVybmVkCi0gc29hcF90cmFuc3BvcnRfaHR0cDogQWRkIGRlYnVnIHdoZW4gYW4gb3V0Z29pbmcgaGVhZGVyIGlzIHNldAotIHNvYXBjbGllbnQ6IEFsbG93IFNPQVAgaGVhZGVycyB0byBiZSBzdXBwbGllZCBhcyBhbiBhcnJheSBsaWtlIHBhcmFtZXRlcnMKLSB4bWxzY2hlbWE6IHNlcmlhbGl6ZSBhdHRyaWJ1dGVzIG1vcmUgZ2VuZXJhbGx5LCByYXRoZXIgdGhhbiBhc3N1bWluZyB0aGV5IGFyZSBmb3IgU09BUCAxLjEgQXJyYXkKLSB3c2RsOiB3aGVuIHNlcmlhbGl6aW5nLCBsb29rIHVwIHR5cGVzIGJ5IG5hbWVzcGFjZSwgbm90IHByZWZpeCAoc2ltcGxlIHByb2dyYW1tYXRpYyBkb2MvbGl0IFdTREwgbm93IHNlZW1zIHRvIHdvcmspCi0gd3NkbDogcHJvY2VzcyBuYW1lc3BhY2UgZGVjbGFyYXRpb25zIGZpcnN0IHdoZW4gcGFyc2luZyBhbiBlbGVtZW50CgoyMDA1LTA3LTI3LCB2ZXJzaW9uIDAuNy4xCi0gbnVzb2FwX2Jhc2U6IGRvIG5vdCBvdmVycmlkZSBzdXBwbGllZCBlbGVtZW50IG5hbWUgd2l0aCBjbGFzcyBuYW1lIHdoZW4gc2VyaWFsaXppbmcgYW4gb2JqZWN0IGluIHNlcmlhbGl6ZV92YWwKLSBudXNvYXBfYmFzZTogcmVtb3ZlIGh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkIChzaSkgZnJvbSBuYW1lc3BhY2VzIGFycmF5Ci0gbnVzb2FwbWltZTogYWRkIG51c29hcHNlcnZlcm1pbWUgY2xhc3MgdG8gaW1wbGVtZW50IE1JTUUgYXR0YWNobWVudHMgb24gdGhlIHNlcnZlcgotIHNvYXBfZmF1bHQ6IGltcHJvdmUgZG9jdW1lbnRhdGlvbgotIHNvYXBfc2VydmVyOiBpbXByb3ZlIGRvY3VtZW50YXRpb24KLSBzb2FwX3NlcnZlcjogbWFrZSBjb25zaXN0ZW50IHVzZSBvZiBfU0VSVkVSIGFuZCBIVFRQX1NFUlZFUl9WQVJTCi0gc29hcF9zZXJ2ZXI6IG1ha2UgYWxsIGluY29taW5nIEhUVFAgaGVhZGVyIGtleXMgbG93ZXIgY2FzZQotIHNvYXBfc2VydmVyOiBhZGQgaG9vayBmdW5jdGlvbnMgdG8gc3VwcG9ydCBzdWJjbGFzc2luZyBmb3IgTUlNRSBhdHRhY2htZW50cwotIHNvYXBfdHJhbnNwb3J0X2h0dHA6IHJlbW92ZSBhbiB1bm5lY2Vzc2FyeSBnbG9iYWwgc3RhdGVtZW50Ci0gc29hcGNsaWVudDogd2hlbiBjcmVhdGluZyBhIHByb3h5LCBtYWtlICRwYXJhbXMgd2l0aGluIGVhY2ggZnVuY3Rpb24gYW4gYXNzb2NpYXRpdmUgYXJyYXkKLSBzb2FwdmFsOiBpbXByb3ZlIGRvY3VtZW50YXRpb24KLSB3c2RsOiB3aGVuIHNlcmlhbGl6aW5nIGNvbXBsZXhUeXBlIGVsZW1lbnRzLCB1c2VkIHR5cGVkIHNlcmlhbGl6YXRpb24gaWYgdGhlcmUgaXMgZWl0aGVyIGEgdHlwZSBvciBhIHJlZmVyZW5jZSBmb3IgdGhlIGVsZW1lbnQKLSB3c2RsOiBhbGxvdyBQSFAgb2JqZWN0cyB0byBiZSBzZXJpYWxpemVkIGFzIFNPQVAgc3RydWN0cyBpbiBzZXJpYWxpemVUeXBlCi0gd3NkbDogZm9yIFdTREwgYW5kIFhNTCBTY2hlbWEgaW1wb3J0cywgZG9uJ3QgZm9yZ2V0IHRvIHVzZSB0aGUgVENQIHBvcnQgbnVtYmVyICh0aGFua3MgTHVjYSBHSU9QUE8pCi0gd3NkbDogbWFrZSBjb25zaXN0ZW50IHVzZSBvZiBfU0VSVkVSIGFuZCBIVFRQX1NFUlZFUl9WQVJTCi0geG1sc2NoZW1hOiBpbXByb3ZlIGRvY3VtZW50YXRpb24KCjIwMDUtMDctMzEsIHZlcnNpb24gMC43LjIKLSBudXNvYXBfYmFzZTogY29ycmVjdGx5IHNlcmlhbGl6ZSBhdHRyaWJ1dGVzIGluIHNlcmlhbGl6ZV92YWwgKHRoYW5rcyBIaWRyYW4gQXJpYXMpCi0gc29hcF9wYXJzZXI6IHdoZW4gcmVzb2x2aW5nIHJlZmVyZW5jZXMsIGRvIG5vdCBhc3N1bWUgdGhhdCBidWlsZFZhbCByZXR1cm5zIGFuIGFycmF5ICh0aGFua3MgQWtzaGVsbCkKLSBzb2FwX3BhcnNlcjogcmVtb3ZlZCBkZWNvZGVfZW50aXRpZXMsIHdoaWNoIGRvZXMgbm90IHdvcmsgKHRoYW5rcyBNYXJ0aW4gU2Fyc2FsZSkKLSBzb2FwX3NlcnZlcjogZml4IGEgYnVnIHBhcnNpbmcgaGVhZGVycyBmcm9tIF9TRVJWRVIgYW5kIEhUVFBfU0VSVkVSX1ZBUlMgKHRoYW5rcyBCZXJ0IENhdHNidXJnKQotIHNvYXBfc2VydmVyOiBwYXJzZSBhbGwgImhlYWRlcnMiIGZyb20gSFRUUF9TRVJWRVJfVkFSUyAobm90IGp1c3QgSFRUUF8qKQotIHNvYXBfc2VydmVyOiB1c2UgUEhQX1NFTEYgaW5zdGVhZCBvZiBTQ1JJUFRfTkFNRSBmb3IgV1NETCBlbmRwb2ludAotIHNvYXBfc2VydmVyOiB3aGVuIGdlbmVyYXRpbmcgYSBmYXVsdCB3aGlsZSBkZWJ1Z19mbGFnIGlzIHRydWUsIHB1dCBkZWJ1ZyBpbnRvIGZhdWx0ZGV0YWlsCi0gd3NkbDogYWRkIGVudW1lcmF0aW9uIHBhcmFtZXRlciB0byBhZGRTaW1wbGVUeXBlCi0geG1sc2NoZW1hOiBhZGQgZW51bWVyYXRpb24gcGFyYW1ldGVyIHRvIGFkZFNpbXBsZVR5cGUK]]></data>
  </file>
  <file>
    <filename>classes/class.nusoap_base.php</filename>
    <isdir>0</isdir>
    <data><![CDATA[PD9waHAKCi8qCiRJZDogY2xhc3MubnVzb2FwX2Jhc2UucGhwLHYgMS40MyAyMDA1LzA4LzA0IDAxOjI3OjQyIHNuaWNob2wgRXhwICQKCk51U09BUCAtIFdlYiBTZXJ2aWNlcyBUb29sa2l0IGZvciBQSFAKCkNvcHlyaWdodCAoYykgMjAwMiBOdVNwaGVyZSBDb3Jwb3JhdGlvbgoKVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgptb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCkxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgp2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KClRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLApidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgpNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQpMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwpMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCkZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKCklmIHlvdSBoYXZlIGFueSBxdWVzdGlvbnMgb3IgY29tbWVudHMsIHBsZWFzZSBlbWFpbDoKCkRpZXRyaWNoIEF5YWxhCmRpZXRyaWNoQGdhbng0LmNvbQpodHRwOi8vZGlldHJpY2guZ2FueDQuY29tL251c29hcAoKTnVTcGhlcmUgQ29ycG9yYXRpb24KaHR0cDovL3d3dy5udXNwaGVyZS5jb20KCiovCgovKiBsb2FkIGNsYXNzZXMKCi8vIG5lY2Vzc2FyeSBjbGFzc2VzCnJlcXVpcmVfb25jZSgnY2xhc3Muc29hcGNsaWVudC5waHAnKTsKcmVxdWlyZV9vbmNlKCdjbGFzcy5zb2FwX3ZhbC5waHAnKTsKcmVxdWlyZV9vbmNlKCdjbGFzcy5zb2FwX3BhcnNlci5waHAnKTsKcmVxdWlyZV9vbmNlKCdjbGFzcy5zb2FwX2ZhdWx0LnBocCcpOwoKLy8gdHJhbnNwb3J0IGNsYXNzZXMKcmVxdWlyZV9vbmNlKCdjbGFzcy5zb2FwX3RyYW5zcG9ydF9odHRwLnBocCcpOwoKLy8gb3B0aW9uYWwgYWRkLW9uIGNsYXNzZXMKcmVxdWlyZV9vbmNlKCdjbGFzcy54bWxzY2hlbWEucGhwJyk7CnJlcXVpcmVfb25jZSgnY2xhc3Mud3NkbC5waHAnKTsKCi8vIHNlcnZlciBjbGFzcwpyZXF1aXJlX29uY2UoJ2NsYXNzLnNvYXBfc2VydmVyLnBocCcpOyovCgovLyBjbGFzcyB2YXJpYWJsZSBlbXVsYXRpb24KLy8gY2YuIGh0dHA6Ly93d3cud2Via3JlYXRvci5jb20vcGhwL3RlY2huaXF1ZXMvcGhwLXN0YXRpYy1jbGFzcy12YXJpYWJsZXMuaHRtbAokR0xPQkFMU1snX3RyYW5zaWVudCddWydzdGF0aWMnXVsnbnVzb2FwX2Jhc2UnXS0+Z2xvYmFsRGVidWdMZXZlbCA9IDk7CgovKioKKgoqIG51c29hcF9iYXNlCioKKiBAYXV0aG9yICAgRGlldHJpY2ggQXlhbGEgPGRpZXRyaWNoQGdhbng0LmNvbT4KKiBAdmVyc2lvbiAgJElkOiBjbGFzcy5udXNvYXBfYmFzZS5waHAsdiAxLjQzIDIwMDUvMDgvMDQgMDE6Mjc6NDIgc25pY2hvbCBFeHAgJAoqIEBhY2Nlc3MgICBwdWJsaWMKKi8KY2xhc3MgbnVzb2FwX2Jhc2UgewoJLyoqCgkgKiBJZGVudGlmaWNhdGlvbiBmb3IgSFRUUCBoZWFkZXJzLgoJICoKCSAqIEB2YXIgc3RyaW5nCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJdmFyICR0aXRsZSA9ICdOdVNPQVAnOwoJLyoqCgkgKiBWZXJzaW9uIGZvciBIVFRQIGhlYWRlcnMuCgkgKgoJICogQHZhciBzdHJpbmcKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCgl2YXIgJHZlcnNpb24gPSAnMC43LjInOwoJLyoqCgkgKiBDVlMgcmV2aXNpb24gZm9yIEhUVFAgaGVhZGVycy4KCSAqCgkgKiBAdmFyIHN0cmluZwoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCXZhciAkcmV2aXNpb24gPSAnJFJldmlzaW9uOiAxLjQzICQnOwogICAgLyoqCiAgICAgKiBDdXJyZW50IGVycm9yIHN0cmluZyAobWFuaXB1bGF0ZWQgYnkgZ2V0RXJyb3Ivc2V0RXJyb3IpCgkgKgoJICogQHZhciBzdHJpbmcKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCgl2YXIgJGVycm9yX3N0ciA9ICcnOwogICAgLyoqCiAgICAgKiBDdXJyZW50IGRlYnVnIHN0cmluZyAobWFuaXB1bGF0ZWQgYnkgZGVidWcvYXBwZW5kRGVidWcvY2xlYXJEZWJ1Zy9nZXREZWJ1Zy9nZXREZWJ1Z0FzWE1MQ29tbWVudCkKCSAqCgkgKiBAdmFyIHN0cmluZwoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KICAgIHZhciAkZGVidWdfc3RyID0gJyc7CiAgICAvKioKCSAqIHRvZ2dsZXMgYXV0b21hdGljIGVuY29kaW5nIG9mIHNwZWNpYWwgY2hhcmFjdGVycyBhcyBlbnRpdGllcwoJICogKHNob3VsZCBhbHdheXMgYmUgdHJ1ZSwgSSB0aGluaykKCSAqCgkgKiBAdmFyIGJvb2xlYW4KCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCgl2YXIgJGNoYXJlbmNvZGluZyA9IHRydWU7CgkvKioKCSAqIHRoZSBkZWJ1ZyBsZXZlbCBmb3IgdGhpcyBpbnN0YW5jZQoJICoKCSAqIEB2YXIJaW50ZWdlcgoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCXZhciAkZGVidWdMZXZlbDsKCiAgICAvKioKCSogc2V0IHNjaGVtYSB2ZXJzaW9uCgkqCgkqIEB2YXIgICAgICBzdHJpbmcKCSogQGFjY2VzcyAgIHB1YmxpYwoJKi8KCXZhciAkWE1MU2NoZW1hVmVyc2lvbiA9ICdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSc7CgkKICAgIC8qKgoJKiBjaGFyc2V0IGVuY29kaW5nIGZvciBvdXRnb2luZyBtZXNzYWdlcwoJKgoJKiBAdmFyICAgICAgc3RyaW5nCgkqIEBhY2Nlc3MgICBwdWJsaWMKCSovCiAgICB2YXIgJHNvYXBfZGVmZW5jb2RpbmcgPSAnSVNPLTg4NTktMSc7CgkvL3ZhciAkc29hcF9kZWZlbmNvZGluZyA9ICdVVEYtOCc7CgoJLyoqCgkqIG5hbWVzcGFjZXMgaW4gYW4gYXJyYXkgb2YgcHJlZml4ID0+IHVyaQoJKgoJKiB0aGlzIGlzICJzZWVkZWQiIGJ5IGEgc2V0IG9mIGNvbnN0YW50cywgYnV0IGl0IG1heSBiZSBhbHRlcmVkIGJ5IGNvZGUKCSoKCSogQHZhciAgICAgIGFycmF5CgkqIEBhY2Nlc3MgICBwdWJsaWMKCSovCgl2YXIgJG5hbWVzcGFjZXMgPSBhcnJheSgKCQknU09BUC1FTlYnID0+ICdodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLycsCgkJJ3hzZCcgPT4gJ2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJywKCQkneHNpJyA9PiAnaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UnLAoJCSdTT0FQLUVOQycgPT4gJ2h0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvJwoJCSk7CgoJLyoqCgkqIG5hbWVzcGFjZXMgdXNlZCBpbiB0aGUgY3VycmVudCBjb250ZXh0LCBlLmcuIGR1cmluZyBzZXJpYWxpemF0aW9uCgkqCgkqIEB2YXIgICAgICBhcnJheQoJKiBAYWNjZXNzICAgcHJpdmF0ZQoJKi8KCXZhciAkdXNlZE5hbWVzcGFjZXMgPSBhcnJheSgpOwoKCS8qKgoJKiBYTUwgU2NoZW1hIHR5cGVzIGluIGFuIGFycmF5IG9mIHVyaSA9PiAoYXJyYXkgb2YgeG1sIHR5cGUgPT4gcGhwIHR5cGUpCgkqIGlzIHRoaXMgbGVnYWN5IHlldD8KCSogbm8sIHRoaXMgaXMgdXNlZCBieSB0aGUgeG1sc2NoZW1hIGNsYXNzIHRvIHZlcmlmeSB0eXBlID0+IG5hbWVzcGFjZSBtYXBwaW5ncy4KCSogQHZhciAgICAgIGFycmF5CgkqIEBhY2Nlc3MgICBwdWJsaWMKCSovCgl2YXIgJHR5cGVtYXAgPSBhcnJheSgKCSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYScgPT4gYXJyYXkoCgkJJ3N0cmluZyc9PidzdHJpbmcnLCdib29sZWFuJz0+J2Jvb2xlYW4nLCdmbG9hdCc9Pidkb3VibGUnLCdkb3VibGUnPT4nZG91YmxlJywnZGVjaW1hbCc9Pidkb3VibGUnLAoJCSdkdXJhdGlvbic9PicnLCdkYXRlVGltZSc9PidzdHJpbmcnLCd0aW1lJz0+J3N0cmluZycsJ2RhdGUnPT4nc3RyaW5nJywnZ1llYXJNb250aCc9PicnLAoJCSdnWWVhcic9PicnLCdnTW9udGhEYXknPT4nJywnZ0RheSc9PicnLCdnTW9udGgnPT4nJywnaGV4QmluYXJ5Jz0+J3N0cmluZycsJ2Jhc2U2NEJpbmFyeSc9PidzdHJpbmcnLAoJCS8vIGFic3RyYWN0ICJhbnkiIHR5cGVzCgkJJ2FueVR5cGUnPT4nc3RyaW5nJywnYW55U2ltcGxlVHlwZSc9PidzdHJpbmcnLAoJCS8vIGRlcml2ZWQgZGF0YXR5cGVzCgkJJ25vcm1hbGl6ZWRTdHJpbmcnPT4nc3RyaW5nJywndG9rZW4nPT4nc3RyaW5nJywnbGFuZ3VhZ2UnPT4nJywnTk1UT0tFTic9PicnLCdOTVRPS0VOUyc9PicnLCdOYW1lJz0+JycsJ05DTmFtZSc9PicnLCdJRCc9PicnLAoJCSdJRFJFRic9PicnLCdJRFJFRlMnPT4nJywnRU5USVRZJz0+JycsJ0VOVElUSUVTJz0+JycsJ2ludGVnZXInPT4naW50ZWdlcicsJ25vblBvc2l0aXZlSW50ZWdlcic9PidpbnRlZ2VyJywKCQknbmVnYXRpdmVJbnRlZ2VyJz0+J2ludGVnZXInLCdsb25nJz0+J2ludGVnZXInLCdpbnQnPT4naW50ZWdlcicsJ3Nob3J0Jz0+J2ludGVnZXInLCdieXRlJz0+J2ludGVnZXInLCdub25OZWdhdGl2ZUludGVnZXInPT4naW50ZWdlcicsCgkJJ3Vuc2lnbmVkTG9uZyc9PicnLCd1bnNpZ25lZEludCc9PicnLCd1bnNpZ25lZFNob3J0Jz0+JycsJ3Vuc2lnbmVkQnl0ZSc9PicnLCdwb3NpdGl2ZUludGVnZXInPT4nJyksCgknaHR0cDovL3d3dy53My5vcmcvMjAwMC8xMC9YTUxTY2hlbWEnID0+IGFycmF5KAoJCSdpNCc9PicnLCdpbnQnPT4naW50ZWdlcicsJ2Jvb2xlYW4nPT4nYm9vbGVhbicsJ3N0cmluZyc9PidzdHJpbmcnLCdkb3VibGUnPT4nZG91YmxlJywKCQknZmxvYXQnPT4nZG91YmxlJywnZGF0ZVRpbWUnPT4nc3RyaW5nJywKCQkndGltZUluc3RhbnQnPT4nc3RyaW5nJywnYmFzZTY0QmluYXJ5Jz0+J3N0cmluZycsJ2Jhc2U2NCc9PidzdHJpbmcnLCd1ci10eXBlJz0+J2FycmF5JyksCgknaHR0cDovL3d3dy53My5vcmcvMTk5OS9YTUxTY2hlbWEnID0+IGFycmF5KAoJCSdpNCc9PicnLCdpbnQnPT4naW50ZWdlcicsJ2Jvb2xlYW4nPT4nYm9vbGVhbicsJ3N0cmluZyc9PidzdHJpbmcnLCdkb3VibGUnPT4nZG91YmxlJywKCQknZmxvYXQnPT4nZG91YmxlJywnZGF0ZVRpbWUnPT4nc3RyaW5nJywKCQkndGltZUluc3RhbnQnPT4nc3RyaW5nJywnYmFzZTY0QmluYXJ5Jz0+J3N0cmluZycsJ2Jhc2U2NCc9PidzdHJpbmcnLCd1ci10eXBlJz0+J2FycmF5JyksCgknaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2QnID0+IGFycmF5KCdTT0FQU3RydWN0Jz0+J3N0cnVjdCcpLAoJJ2h0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvJyA9PiBhcnJheSgnYmFzZTY0Jz0+J3N0cmluZycsJ2FycmF5Jz0+J2FycmF5JywnQXJyYXknPT4nYXJyYXknKSwKICAgICdodHRwOi8veG1sLmFwYWNoZS5vcmcveG1sLXNvYXAnID0+IGFycmF5KCdNYXAnKQoJKTsKCgkvKioKCSogWE1MIGVudGl0aWVzIHRvIGNvbnZlcnQKCSoKCSogQHZhciAgICAgIGFycmF5CgkqIEBhY2Nlc3MgICBwdWJsaWMKCSogQGRlcHJlY2F0ZWQKCSogQHNlZQlleHBhbmRFbnRpdGllcwoJKi8KCXZhciAkeG1sRW50aXRpZXMgPSBhcnJheSgncXVvdCcgPT4gJyInLCdhbXAnID0+ICcmJywKCQknbHQnID0+ICc8JywnZ3QnID0+ICc+JywnYXBvcycgPT4gIiciKTsKCgkvKioKCSogY29uc3RydWN0b3IKCSoKCSogQGFjY2VzcwlwdWJsaWMKCSovCglmdW5jdGlvbiBudXNvYXBfYmFzZSgpIHsKCQkkdGhpcy0+ZGVidWdMZXZlbCA9ICRHTE9CQUxTWydfdHJhbnNpZW50J11bJ3N0YXRpYyddWydudXNvYXBfYmFzZSddLT5nbG9iYWxEZWJ1Z0xldmVsOwoJfQoKCS8qKgoJKiBnZXRzIHRoZSBnbG9iYWwgZGVidWcgbGV2ZWwsIHdoaWNoIGFwcGxpZXMgdG8gZnV0dXJlIGluc3RhbmNlcwoJKgoJKiBAcmV0dXJuCWludGVnZXIJRGVidWcgbGV2ZWwgMC05LCB3aGVyZSAwIHR1cm5zIG9mZgoJKiBAYWNjZXNzCXB1YmxpYwoJKi8KCWZ1bmN0aW9uIGdldEdsb2JhbERlYnVnTGV2ZWwoKSB7CgkJcmV0dXJuICRHTE9CQUxTWydfdHJhbnNpZW50J11bJ3N0YXRpYyddWydudXNvYXBfYmFzZSddLT5nbG9iYWxEZWJ1Z0xldmVsOwoJfQoKCS8qKgoJKiBzZXRzIHRoZSBnbG9iYWwgZGVidWcgbGV2ZWwsIHdoaWNoIGFwcGxpZXMgdG8gZnV0dXJlIGluc3RhbmNlcwoJKgoJKiBAcGFyYW0JaW50CSRsZXZlbAlEZWJ1ZyBsZXZlbCAwLTksIHdoZXJlIDAgdHVybnMgb2ZmCgkqIEBhY2Nlc3MJcHVibGljCgkqLwoJZnVuY3Rpb24gc2V0R2xvYmFsRGVidWdMZXZlbCgkbGV2ZWwpIHsKCQkkR0xPQkFMU1snX3RyYW5zaWVudCddWydzdGF0aWMnXVsnbnVzb2FwX2Jhc2UnXS0+Z2xvYmFsRGVidWdMZXZlbCA9ICRsZXZlbDsKCX0KCgkvKioKCSogZ2V0cyB0aGUgZGVidWcgbGV2ZWwgZm9yIHRoaXMgaW5zdGFuY2UKCSoKCSogQHJldHVybglpbnQJRGVidWcgbGV2ZWwgMC05LCB3aGVyZSAwIHR1cm5zIG9mZgoJKiBAYWNjZXNzCXB1YmxpYwoJKi8KCWZ1bmN0aW9uIGdldERlYnVnTGV2ZWwoKSB7CgkJcmV0dXJuICR0aGlzLT5kZWJ1Z0xldmVsOwoJfQoKCS8qKgoJKiBzZXRzIHRoZSBkZWJ1ZyBsZXZlbCBmb3IgdGhpcyBpbnN0YW5jZQoJKgoJKiBAcGFyYW0JaW50CSRsZXZlbAlEZWJ1ZyBsZXZlbCAwLTksIHdoZXJlIDAgdHVybnMgb2ZmCgkqIEBhY2Nlc3MJcHVibGljCgkqLwoJZnVuY3Rpb24gc2V0RGVidWdMZXZlbCgkbGV2ZWwpIHsKCQkkdGhpcy0+ZGVidWdMZXZlbCA9ICRsZXZlbDsKCX0KCgkvKioKCSogYWRkcyBkZWJ1ZyBkYXRhIHRvIHRoZSBpbnN0YW5jZSBkZWJ1ZyBzdHJpbmcgd2l0aCBmb3JtYXR0aW5nCgkqCgkqIEBwYXJhbSAgICBzdHJpbmcgJHN0cmluZyBkZWJ1ZyBkYXRhCgkqIEBhY2Nlc3MgICBwcml2YXRlCgkqLwoJZnVuY3Rpb24gZGVidWcoJHN0cmluZyl7CgkJaWYgKCR0aGlzLT5kZWJ1Z0xldmVsID4gMCkgewoJCQkkdGhpcy0+YXBwZW5kRGVidWcoJHRoaXMtPmdldG1pY3JvdGltZSgpLicgJy5nZXRfY2xhc3MoJHRoaXMpLiI6ICRzdHJpbmdcbiIpOwoJCX0KCX0KCgkvKioKCSogYWRkcyBkZWJ1ZyBkYXRhIHRvIHRoZSBpbnN0YW5jZSBkZWJ1ZyBzdHJpbmcgd2l0aG91dCBmb3JtYXR0aW5nCgkqCgkqIEBwYXJhbSAgICBzdHJpbmcgJHN0cmluZyBkZWJ1ZyBkYXRhCgkqIEBhY2Nlc3MgICBwdWJsaWMKCSovCglmdW5jdGlvbiBhcHBlbmREZWJ1Zygkc3RyaW5nKXsKCQlpZiAoJHRoaXMtPmRlYnVnTGV2ZWwgPiAwKSB7CgkJCS8vIGl0IHdvdWxkIGJlIG5pY2UgdG8gdXNlIGEgbWVtb3J5IHN0cmVhbSBoZXJlIHRvIHVzZQoJCQkvLyBtZW1vcnkgbW9yZSBlZmZpY2llbnRseQoJCQkkdGhpcy0+ZGVidWdfc3RyIC49ICRzdHJpbmc7CgkJfQoJfQoKCS8qKgoJKiBjbGVhcnMgdGhlIGN1cnJlbnQgZGVidWcgZGF0YSBmb3IgdGhpcyBpbnN0YW5jZQoJKgoJKiBAYWNjZXNzICAgcHVibGljCgkqLwoJZnVuY3Rpb24gY2xlYXJEZWJ1ZygpIHsKCQkvLyBpdCB3b3VsZCBiZSBuaWNlIHRvIHVzZSBhIG1lbW9yeSBzdHJlYW0gaGVyZSB0byB1c2UKCQkvLyBtZW1vcnkgbW9yZSBlZmZpY2llbnRseQoJCSR0aGlzLT5kZWJ1Z19zdHIgPSAnJzsKCX0KCgkvKioKCSogZ2V0cyB0aGUgY3VycmVudCBkZWJ1ZyBkYXRhIGZvciB0aGlzIGluc3RhbmNlCgkqCgkqIEByZXR1cm4gICBkZWJ1ZyBkYXRhCgkqIEBhY2Nlc3MgICBwdWJsaWMKCSovCglmdW5jdGlvbiAmZ2V0RGVidWcoKSB7CgkJLy8gaXQgd291bGQgYmUgbmljZSB0byB1c2UgYSBtZW1vcnkgc3RyZWFtIGhlcmUgdG8gdXNlCgkJLy8gbWVtb3J5IG1vcmUgZWZmaWNpZW50bHkKCQlyZXR1cm4gJHRoaXMtPmRlYnVnX3N0cjsKCX0KCgkvKioKCSogZ2V0cyB0aGUgY3VycmVudCBkZWJ1ZyBkYXRhIGZvciB0aGlzIGluc3RhbmNlIGFzIGFuIFhNTCBjb21tZW50CgkqIHRoaXMgbWF5IGNoYW5nZSB0aGUgY29udGVudHMgb2YgdGhlIGRlYnVnIGRhdGEKCSoKCSogQHJldHVybiAgIGRlYnVnIGRhdGEgYXMgYW4gWE1MIGNvbW1lbnQKCSogQGFjY2VzcyAgIHB1YmxpYwoJKi8KCWZ1bmN0aW9uICZnZXREZWJ1Z0FzWE1MQ29tbWVudCgpIHsKCQkvLyBpdCB3b3VsZCBiZSBuaWNlIHRvIHVzZSBhIG1lbW9yeSBzdHJlYW0gaGVyZSB0byB1c2UKCQkvLyBtZW1vcnkgbW9yZSBlZmZpY2llbnRseQoJCXdoaWxlIChzdHJwb3MoJHRoaXMtPmRlYnVnX3N0ciwgJy0tJykpIHsKCQkJJHRoaXMtPmRlYnVnX3N0ciA9IHN0cl9yZXBsYWNlKCctLScsICctIC0nLCAkdGhpcy0+ZGVidWdfc3RyKTsKCQl9CiAgICAJcmV0dXJuICI8IS0tXG4iIC4gJHRoaXMtPmRlYnVnX3N0ciAuICJcbi0tPiI7Cgl9CgoJLyoqCgkqIGV4cGFuZHMgZW50aXRpZXMsIGUuZy4gY2hhbmdlcyAnPCcgdG8gJyZsdDsnLgoJKgoJKiBAcGFyYW0Jc3RyaW5nCSR2YWwJVGhlIHN0cmluZyBpbiB3aGljaCB0byBleHBhbmQgZW50aXRpZXMuCgkqIEBhY2Nlc3MJcHJpdmF0ZQoJKi8KCWZ1bmN0aW9uIGV4cGFuZEVudGl0aWVzKCR2YWwpIHsKCQlpZiAoJHRoaXMtPmNoYXJlbmNvZGluZykgewoJICAgIAkkdmFsID0gc3RyX3JlcGxhY2UoJyYnLCAnJmFtcDsnLCAkdmFsKTsKCSAgICAJJHZhbCA9IHN0cl9yZXBsYWNlKCInIiwgJyZhcG9zOycsICR2YWwpOwoJICAgIAkkdmFsID0gc3RyX3JlcGxhY2UoJyInLCAnJnF1b3Q7JywgJHZhbCk7CgkgICAgCSR2YWwgPSBzdHJfcmVwbGFjZSgnPCcsICcmbHQ7JywgJHZhbCk7CgkgICAgCSR2YWwgPSBzdHJfcmVwbGFjZSgnPicsICcmZ3Q7JywgJHZhbCk7CgkgICAgfQoJICAgIHJldHVybiAkdmFsOwoJfQoKCS8qKgoJKiByZXR1cm5zIGVycm9yIHN0cmluZyBpZiBwcmVzZW50CgkqCgkqIEByZXR1cm4gICBtaXhlZCBlcnJvciBzdHJpbmcgb3IgZmFsc2UKCSogQGFjY2VzcyAgIHB1YmxpYwoJKi8KCWZ1bmN0aW9uIGdldEVycm9yKCl7CgkJaWYoJHRoaXMtPmVycm9yX3N0ciAhPSAnJyl7CgkJCXJldHVybiAkdGhpcy0+ZXJyb3Jfc3RyOwoJCX0KCQlyZXR1cm4gZmFsc2U7Cgl9CgoJLyoqCgkqIHNldHMgZXJyb3Igc3RyaW5nCgkqCgkqIEByZXR1cm4gICBib29sZWFuICRzdHJpbmcgZXJyb3Igc3RyaW5nCgkqIEBhY2Nlc3MgICBwcml2YXRlCgkqLwoJZnVuY3Rpb24gc2V0RXJyb3IoJHN0cil7CgkJJHRoaXMtPmVycm9yX3N0ciA9ICRzdHI7Cgl9CgoJLyoqCgkqIGRldGVjdCBpZiBhcnJheSBpcyBhIHNpbXBsZSBhcnJheSBvciBhIHN0cnVjdCAoYXNzb2NpYXRpdmUgYXJyYXkpCgkqCgkqIEBwYXJhbQltaXhlZAkkdmFsCVRoZSBQSFAgYXJyYXkKCSogQHJldHVybglzdHJpbmcJKGFycmF5U2ltcGxlfGFycmF5U3RydWN0KQoJKiBAYWNjZXNzCXByaXZhdGUKCSovCglmdW5jdGlvbiBpc0FycmF5U2ltcGxlT3JTdHJ1Y3QoJHZhbCkgewogICAgICAgICRrZXlMaXN0ID0gYXJyYXlfa2V5cygkdmFsKTsKCQlmb3JlYWNoICgka2V5TGlzdCBhcyAka2V5TGlzdFZhbHVlKSB7CgkJCWlmICghaXNfaW50KCRrZXlMaXN0VmFsdWUpKSB7CgkJCQlyZXR1cm4gJ2FycmF5U3RydWN0JzsKCQkJfQoJCX0KCQlyZXR1cm4gJ2FycmF5U2ltcGxlJzsKCX0KCgkvKioKCSogc2VyaWFsaXplcyBQSFAgdmFsdWVzIGluIGFjY29yZGFuY2Ugdy8gc2VjdGlvbiA1LiBUeXBlIGluZm9ybWF0aW9uIGlzCgkqIG5vdCBzZXJpYWxpemVkIGlmICR1c2UgPT0gJ2xpdGVyYWwnLgoJKgoJKiBAcGFyYW0JbWl4ZWQJJHZhbAlUaGUgdmFsdWUgdG8gc2VyaWFsaXplCgkqIEBwYXJhbQlzdHJpbmcJJG5hbWUJVGhlIG5hbWUgKGxvY2FsIHBhcnQpIG9mIHRoZSBYTUwgZWxlbWVudAoJKiBAcGFyYW0Jc3RyaW5nCSR0eXBlCVRoZSBYTUwgc2NoZW1hIHR5cGUgKGxvY2FsIHBhcnQpIGZvciB0aGUgZWxlbWVudAoJKiBAcGFyYW0Jc3RyaW5nCSRuYW1lX25zCVRoZSBuYW1lc3BhY2UgZm9yIHRoZSBuYW1lIG9mIHRoZSBYTUwgZWxlbWVudAoJKiBAcGFyYW0Jc3RyaW5nCSR0eXBlX25zCVRoZSBuYW1lc3BhY2UgZm9yIHRoZSB0eXBlIG9mIHRoZSBlbGVtZW50CgkqIEBwYXJhbQlhcnJheQkkYXR0cmlidXRlcwlUaGUgYXR0cmlidXRlcyB0byBzZXJpYWxpemUgYXMgbmFtZT0+dmFsdWUgcGFpcnMKCSogQHBhcmFtCXN0cmluZwkkdXNlCVRoZSBXU0RMICJ1c2UiIChlbmNvZGVkfGxpdGVyYWwpCgkqIEByZXR1cm4Jc3RyaW5nCVRoZSBzZXJpYWxpemVkIGVsZW1lbnQsIHBvc3NpYmx5IHdpdGggY2hpbGQgZWxlbWVudHMKICAgICogQGFjY2VzcwlwdWJsaWMKCSovCglmdW5jdGlvbiBzZXJpYWxpemVfdmFsKCR2YWwsJG5hbWU9ZmFsc2UsJHR5cGU9ZmFsc2UsJG5hbWVfbnM9ZmFsc2UsJHR5cGVfbnM9ZmFsc2UsJGF0dHJpYnV0ZXM9ZmFsc2UsJHVzZT0nZW5jb2RlZCcpewoJCSR0aGlzLT5kZWJ1ZygiaW4gc2VyaWFsaXplX3ZhbDogbmFtZT0kbmFtZSwgdHlwZT0kdHlwZSwgbmFtZV9ucz0kbmFtZV9ucywgdHlwZV9ucz0kdHlwZV9ucywgdXNlPSR1c2UiKTsKCQkkdGhpcy0+YXBwZW5kRGVidWcoJ3ZhbHVlPScgLiAkdGhpcy0+dmFyRHVtcCgkdmFsKSk7CgkJJHRoaXMtPmFwcGVuZERlYnVnKCdhdHRyaWJ1dGVzPScgLiAkdGhpcy0+dmFyRHVtcCgkYXR0cmlidXRlcykpOwoJCQogICAgCWlmKGlzX29iamVjdCgkdmFsKSAmJiBnZXRfY2xhc3MoJHZhbCkgPT0gJ3NvYXB2YWwnKXsKICAgICAgICAJcmV0dXJuICR2YWwtPnNlcmlhbGl6ZSgkdXNlKTsKICAgICAgICB9CgkJLy8gZm9yY2UgdmFsaWQgbmFtZSBpZiBuZWNlc3NhcnkKCQlpZiAoaXNfbnVtZXJpYygkbmFtZSkpIHsKCQkJJG5hbWUgPSAnX19udW1lcmljXycgLiAkbmFtZTsKCQl9IGVsc2VpZiAoISAkbmFtZSkgewoJCQkkbmFtZSA9ICdub25hbWUnOwoJCX0KCQkvLyBpZiBuYW1lIGhhcyBucywgYWRkIG5zIHByZWZpeCB0byBuYW1lCgkJJHhtbG5zID0gJyc7CiAgICAgICAgaWYoJG5hbWVfbnMpewoJCQkkcHJlZml4ID0gJ251Jy5yYW5kKDEwMDAsOTk5OSk7CgkJCSRuYW1lID0gJHByZWZpeC4nOicuJG5hbWU7CgkJCSR4bWxucyAuPSAiIHhtbG5zOiRwcmVmaXg9XCIkbmFtZV9uc1wiIjsKCQl9CgkJLy8gaWYgdHlwZSBpcyBwcmVmaXhlZCwgY3JlYXRlIHR5cGUgcHJlZml4CgkJaWYoJHR5cGVfbnMgIT0gJycgJiYgJHR5cGVfbnMgPT0gJHRoaXMtPm5hbWVzcGFjZXNbJ3hzZCddKXsKCQkJLy8gbmVlZCB0byBmaXggdGhpcy4gc2hvdWxkbid0IGRlZmF1bHQgdG8geHNkIGlmIG5vIG5zIHNwZWNpZmllZAoJCSAgICAvLyB3L28gY2hlY2tpbmcgYWdhaW5zdCB0eXBlbWFwCgkJCSR0eXBlX3ByZWZpeCA9ICd4c2QnOwoJCX0gZWxzZWlmKCR0eXBlX25zKXsKCQkJJHR5cGVfcHJlZml4ID0gJ25zJy5yYW5kKDEwMDAsOTk5OSk7CgkJCSR4bWxucyAuPSAiIHhtbG5zOiR0eXBlX3ByZWZpeD1cIiR0eXBlX25zXCIiOwoJCX0KCQkvLyBzZXJpYWxpemUgYXR0cmlidXRlcyBpZiBwcmVzZW50CgkJJGF0dHMgPSAnJzsKCQlpZigkYXR0cmlidXRlcyl7CgkJCWZvcmVhY2goJGF0dHJpYnV0ZXMgYXMgJGsgPT4gJHYpewoJCQkJJGF0dHMgLj0gIiAkaz1cIiIuJHRoaXMtPmV4cGFuZEVudGl0aWVzKCR2KS4nIic7CgkJCX0KCQl9CgkJLy8gc2VyaWFsaXplIG51bGwgdmFsdWUKCQlpZiAoaXNfbnVsbCgkdmFsKSkgewoJCQlpZiAoJHVzZSA9PSAnbGl0ZXJhbCcpIHsKCQkJCS8vIFRPRE86IGRlcGVuZHMgb24gbWluT2NjdXJzCgkgICAgICAgIAlyZXR1cm4gIjwkbmFtZSR4bWxucyAkYXR0cy8+IjsKICAgICAgICAJfSBlbHNlIHsKCQkJCWlmIChpc3NldCgkdHlwZSkgJiYgaXNzZXQoJHR5cGVfcHJlZml4KSkgewoJCQkJCSR0eXBlX3N0ciA9ICIgeHNpOnR5cGU9XCIkdHlwZV9wcmVmaXg6JHR5cGVcIiI7CgkJCQl9IGVsc2UgewoJCQkJCSR0eXBlX3N0ciA9ICcnOwoJCQkJfQoJICAgICAgICAJcmV0dXJuICI8JG5hbWUkeG1sbnMkdHlwZV9zdHIgJGF0dHMgeHNpOm5pbD1cInRydWVcIi8+IjsKICAgICAgICAJfQoJCX0KICAgICAgICAvLyBzZXJpYWxpemUgaWYgYW4geHNkIGJ1aWx0LWluIHByaW1pdGl2ZSB0eXBlCiAgICAgICAgaWYoJHR5cGUgIT0gJycgJiYgaXNzZXQoJHRoaXMtPnR5cGVtYXBbJHRoaXMtPlhNTFNjaGVtYVZlcnNpb25dWyR0eXBlXSkpewogICAgICAgIAlpZiAoaXNfYm9vbCgkdmFsKSkgewogICAgICAgIAkJaWYgKCR0eXBlID09ICdib29sZWFuJykgewoJICAgICAgICAJCSR2YWwgPSAkdmFsID8gJ3RydWUnIDogJ2ZhbHNlJzsKCSAgICAgICAgCX0gZWxzZWlmICghICR2YWwpIHsKCSAgICAgICAgCQkkdmFsID0gMDsKCSAgICAgICAgCX0KCQkJfSBlbHNlIGlmIChpc19zdHJpbmcoJHZhbCkpIHsKCQkJCSR2YWwgPSAkdGhpcy0+ZXhwYW5kRW50aXRpZXMoJHZhbCk7CgkJCX0KCQkJaWYgKCR1c2UgPT0gJ2xpdGVyYWwnKSB7CgkgICAgICAgIAlyZXR1cm4gIjwkbmFtZSR4bWxucyAkYXR0cz4kdmFsPC8kbmFtZT4iOwogICAgICAgIAl9IGVsc2UgewoJICAgICAgICAJcmV0dXJuICI8JG5hbWUkeG1sbnMgJGF0dHMgeHNpOnR5cGU9XCJ4c2Q6JHR5cGVcIj4kdmFsPC8kbmFtZT4iOwogICAgICAgIAl9CiAgICAgICAgfQoJCS8vIGRldGVjdCB0eXBlIGFuZCBzZXJpYWxpemUKCQkkeG1sID0gJyc7CgkJc3dpdGNoKHRydWUpIHsKCQkJY2FzZSAoaXNfYm9vbCgkdmFsKSB8fCAkdHlwZSA9PSAnYm9vbGVhbicpOgogICAgICAgIAkJaWYgKCR0eXBlID09ICdib29sZWFuJykgewoJICAgICAgICAJCSR2YWwgPSAkdmFsID8gJ3RydWUnIDogJ2ZhbHNlJzsKCSAgICAgICAgCX0gZWxzZWlmICghICR2YWwpIHsKCSAgICAgICAgCQkkdmFsID0gMDsKCSAgICAgICAgCX0KCQkJCWlmICgkdXNlID09ICdsaXRlcmFsJykgewoJCQkJCSR4bWwgLj0gIjwkbmFtZSR4bWxucyAkYXR0cz4kdmFsPC8kbmFtZT4iOwoJCQkJfSBlbHNlIHsKCQkJCQkkeG1sIC49ICI8JG5hbWUkeG1sbnMgeHNpOnR5cGU9XCJ4c2Q6Ym9vbGVhblwiJGF0dHM+JHZhbDwvJG5hbWU+IjsKCQkJCX0KCQkJCWJyZWFrOwoJCQljYXNlIChpc19pbnQoJHZhbCkgfHwgaXNfbG9uZygkdmFsKSB8fCAkdHlwZSA9PSAnaW50Jyk6CgkJCQlpZiAoJHVzZSA9PSAnbGl0ZXJhbCcpIHsKCQkJCQkkeG1sIC49ICI8JG5hbWUkeG1sbnMgJGF0dHM+JHZhbDwvJG5hbWU+IjsKCQkJCX0gZWxzZSB7CgkJCQkJJHhtbCAuPSAiPCRuYW1lJHhtbG5zIHhzaTp0eXBlPVwieHNkOmludFwiJGF0dHM+JHZhbDwvJG5hbWU+IjsKCQkJCX0KCQkJCWJyZWFrOwoJCQljYXNlIChpc19mbG9hdCgkdmFsKXx8IGlzX2RvdWJsZSgkdmFsKSB8fCAkdHlwZSA9PSAnZmxvYXQnKToKCQkJCWlmICgkdXNlID09ICdsaXRlcmFsJykgewoJCQkJCSR4bWwgLj0gIjwkbmFtZSR4bWxucyAkYXR0cz4kdmFsPC8kbmFtZT4iOwoJCQkJfSBlbHNlIHsKCQkJCQkkeG1sIC49ICI8JG5hbWUkeG1sbnMgeHNpOnR5cGU9XCJ4c2Q6ZmxvYXRcIiRhdHRzPiR2YWw8LyRuYW1lPiI7CgkJCQl9CgkJCQlicmVhazsKCQkJY2FzZSAoaXNfc3RyaW5nKCR2YWwpIHx8ICR0eXBlID09ICdzdHJpbmcnKToKCQkJCSR2YWwgPSAkdGhpcy0+ZXhwYW5kRW50aXRpZXMoJHZhbCk7CgkJCQlpZiAoJHVzZSA9PSAnbGl0ZXJhbCcpIHsKCQkJCQkkeG1sIC49ICI8JG5hbWUkeG1sbnMgJGF0dHM+JHZhbDwvJG5hbWU+IjsKCQkJCX0gZWxzZSB7CgkJCQkJJHhtbCAuPSAiPCRuYW1lJHhtbG5zIHhzaTp0eXBlPVwieHNkOnN0cmluZ1wiJGF0dHM+JHZhbDwvJG5hbWU+IjsKCQkJCX0KCQkJCWJyZWFrOwoJCQljYXNlIGlzX29iamVjdCgkdmFsKToKCQkJCWlmICghICRuYW1lKSB7CgkJCQkJJG5hbWUgPSBnZXRfY2xhc3MoJHZhbCk7CgkJCQkJJHRoaXMtPmRlYnVnKCJJbiBzZXJpYWxpemVfdmFsLCB1c2VkIGNsYXNzIG5hbWUgJG5hbWUgYXMgZWxlbWVudCBuYW1lIik7CgkJCQl9IGVsc2UgewoJCQkJCSR0aGlzLT5kZWJ1ZygiSW4gc2VyaWFsaXplX3ZhbCwgZG8gbm90IG92ZXJyaWRlIG5hbWUgJG5hbWUgZm9yIGVsZW1lbnQgbmFtZSBmb3IgY2xhc3MgIiAuIGdldF9jbGFzcygkdmFsKSk7CgkJCQl9CgkJCQlmb3JlYWNoKGdldF9vYmplY3RfdmFycygkdmFsKSBhcyAkayA9PiAkdil7CgkJCQkJJHBYbWwgPSBpc3NldCgkcFhtbCkgPyAkcFhtbC4kdGhpcy0+c2VyaWFsaXplX3ZhbCgkdiwkayxmYWxzZSxmYWxzZSxmYWxzZSxmYWxzZSwkdXNlKSA6ICR0aGlzLT5zZXJpYWxpemVfdmFsKCR2LCRrLGZhbHNlLGZhbHNlLGZhbHNlLGZhbHNlLCR1c2UpOwoJCQkJfQoJCQkJJHhtbCAuPSAnPCcuJG5hbWUuJz4nLiRwWG1sLic8LycuJG5hbWUuJz4nOwoJCQkJYnJlYWs7CgkJCWJyZWFrOwoJCQljYXNlIChpc19hcnJheSgkdmFsKSB8fCAkdHlwZSk6CgkJCQkvLyBkZXRlY3QgaWYgc3RydWN0IG9yIGFycmF5CgkJCQkkdmFsdWVUeXBlID0gJHRoaXMtPmlzQXJyYXlTaW1wbGVPclN0cnVjdCgkdmFsKTsKICAgICAgICAgICAgICAgIGlmKCR2YWx1ZVR5cGU9PSdhcnJheVNpbXBsZScgfHwgZXJlZygnXkFycmF5T2YnLCR0eXBlKSl7CgkJCQkJJGkgPSAwOwoJCQkJCWlmKGlzX2FycmF5KCR2YWwpICYmIGNvdW50KCR2YWwpPiAwKXsKCQkJCQkJZm9yZWFjaCgkdmFsIGFzICR2KXsKCSAgICAgICAgICAgICAgICAgICAgCWlmKGlzX29iamVjdCgkdikgJiYgZ2V0X2NsYXNzKCR2KSA9PSAgJ3NvYXB2YWwnKXsKCQkJCQkJCQkkdHRfbnMgPSAkdi0+dHlwZV9uczsKCQkJCQkJCQkkdHQgPSAkdi0+dHlwZTsKCQkJCQkJCX0gZWxzZWlmIChpc19hcnJheSgkdikpIHsKCQkJCQkJCQkkdHQgPSAkdGhpcy0+aXNBcnJheVNpbXBsZU9yU3RydWN0KCR2KTsKCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJJHR0ID0gZ2V0dHlwZSgkdik7CgkgICAgICAgICAgICAgICAgICAgICAgICB9CgkJCQkJCQkkYXJyYXlfdHlwZXNbJHR0XSA9IDE7CgkJCQkJCQkvLyBUT0RPOiBmb3IgbGl0ZXJhbCwgdGhlIG5hbWUgc2hvdWxkIGJlICRuYW1lCgkJCQkJCQkkeG1sIC49ICR0aGlzLT5zZXJpYWxpemVfdmFsKCR2LCdpdGVtJyxmYWxzZSxmYWxzZSxmYWxzZSxmYWxzZSwkdXNlKTsKCQkJCQkJCSsrJGk7CgkJCQkJCX0KCQkJCQkJaWYoY291bnQoJGFycmF5X3R5cGVzKSA+IDEpewoJCQkJCQkJJGFycmF5X3R5cGVuYW1lID0gJ3hzZDphbnlUeXBlJzsKCQkJCQkJfSBlbHNlaWYoaXNzZXQoJHR0KSAmJiBpc3NldCgkdGhpcy0+dHlwZW1hcFskdGhpcy0+WE1MU2NoZW1hVmVyc2lvbl1bJHR0XSkpIHsKCQkJCQkJCWlmICgkdHQgPT0gJ2ludGVnZXInKSB7CgkJCQkJCQkJJHR0ID0gJ2ludCc7CgkJCQkJCQl9CgkJCQkJCQkkYXJyYXlfdHlwZW5hbWUgPSAneHNkOicuJHR0OwoJCQkJCQl9IGVsc2VpZihpc3NldCgkdHQpICYmICR0dCA9PSAnYXJyYXlTaW1wbGUnKXsKCQkJCQkJCSRhcnJheV90eXBlbmFtZSA9ICdTT0FQLUVOQzpBcnJheSc7CgkJCQkJCX0gZWxzZWlmKGlzc2V0KCR0dCkgJiYgJHR0ID09ICdhcnJheVN0cnVjdCcpewoJCQkJCQkJJGFycmF5X3R5cGVuYW1lID0gJ3VubmFtZWRfc3RydWN0X3VzZV9zb2FwdmFsJzsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCS8vIGlmIHR5cGUgaXMgcHJlZml4ZWQsIGNyZWF0ZSB0eXBlIHByZWZpeAoJCQkJCQkJaWYgKCR0dF9ucyAhPSAnJyAmJiAkdHRfbnMgPT0gJHRoaXMtPm5hbWVzcGFjZXNbJ3hzZCddKXsKCQkJCQkJCQkgJGFycmF5X3R5cGVuYW1lID0gJ3hzZDonIC4gJHR0OwoJCQkJCQkJfSBlbHNlaWYgKCR0dF9ucykgewoJCQkJCQkJCSR0dF9wcmVmaXggPSAnbnMnIC4gcmFuZCgxMDAwLCA5OTk5KTsKCQkJCQkJCQkkYXJyYXlfdHlwZW5hbWUgPSAiJHR0X3ByZWZpeDokdHQiOwoJCQkJCQkJCSR4bWxucyAuPSAiIHhtbG5zOiR0dF9wcmVmaXg9XCIkdHRfbnNcIiI7CgkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCSRhcnJheV90eXBlbmFtZSA9ICR0dDsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQkkYXJyYXlfdHlwZSA9ICRpOwoJCQkJCQlpZiAoJHVzZSA9PSAnbGl0ZXJhbCcpIHsKCQkJCQkJCSR0eXBlX3N0ciA9ICcnOwoJCQkJCQl9IGVsc2UgaWYgKGlzc2V0KCR0eXBlKSAmJiBpc3NldCgkdHlwZV9wcmVmaXgpKSB7CgkJCQkJCQkkdHlwZV9zdHIgPSAiIHhzaTp0eXBlPVwiJHR5cGVfcHJlZml4OiR0eXBlXCIiOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJJHR5cGVfc3RyID0gIiB4c2k6dHlwZT1cIlNPQVAtRU5DOkFycmF5XCIgU09BUC1FTkM6YXJyYXlUeXBlPVwiIi4kYXJyYXlfdHlwZW5hbWUuIlskYXJyYXlfdHlwZV1cIiI7CgkJCQkJCX0KCQkJCQkvLyBlbXB0eSBhcnJheQoJCQkJCX0gZWxzZSB7CgkJCQkJCWlmICgkdXNlID09ICdsaXRlcmFsJykgewoJCQkJCQkJJHR5cGVfc3RyID0gJyc7CgkJCQkJCX0gZWxzZSBpZiAoaXNzZXQoJHR5cGUpICYmIGlzc2V0KCR0eXBlX3ByZWZpeCkpIHsKCQkJCQkJCSR0eXBlX3N0ciA9ICIgeHNpOnR5cGU9XCIkdHlwZV9wcmVmaXg6JHR5cGVcIiI7CgkJCQkJCX0gZWxzZSB7CgkJCQkJCQkkdHlwZV9zdHIgPSAiIHhzaTp0eXBlPVwiU09BUC1FTkM6QXJyYXlcIiBTT0FQLUVOQzphcnJheVR5cGU9XCJ4c2Q6YW55VHlwZVswXVwiIjsKCQkJCQkJfQoJCQkJCX0KCQkJCQkvLyBUT0RPOiBmb3IgYXJyYXkgaW4gbGl0ZXJhbCwgdGhlcmUgaXMgbm8gd3JhcHBlciBoZXJlCgkJCQkJJHhtbCA9ICI8JG5hbWUkeG1sbnMkdHlwZV9zdHIkYXR0cz4iLiR4bWwuIjwvJG5hbWU+IjsKCQkJCX0gZWxzZSB7CgkJCQkJLy8gZ290IGEgc3RydWN0CgkJCQkJaWYoaXNzZXQoJHR5cGUpICYmIGlzc2V0KCR0eXBlX3ByZWZpeCkpewoJCQkJCQkkdHlwZV9zdHIgPSAiIHhzaTp0eXBlPVwiJHR5cGVfcHJlZml4OiR0eXBlXCIiOwoJCQkJCX0gZWxzZSB7CgkJCQkJCSR0eXBlX3N0ciA9ICcnOwoJCQkJCX0KCQkJCQlpZiAoJHVzZSA9PSAnbGl0ZXJhbCcpIHsKCQkJCQkJJHhtbCAuPSAiPCRuYW1lJHhtbG5zICRhdHRzPiI7CgkJCQkJfSBlbHNlIHsKCQkJCQkJJHhtbCAuPSAiPCRuYW1lJHhtbG5zJHR5cGVfc3RyJGF0dHM+IjsKCQkJCQl9CgkJCQkJZm9yZWFjaCgkdmFsIGFzICRrID0+ICR2KXsKCQkJCQkJLy8gQXBhY2hlIE1hcAoJCQkJCQlpZiAoJHR5cGUgPT0gJ01hcCcgJiYgJHR5cGVfbnMgPT0gJ2h0dHA6Ly94bWwuYXBhY2hlLm9yZy94bWwtc29hcCcpIHsKCQkJCQkJCSR4bWwgLj0gJzxpdGVtPic7CgkJCQkJCQkkeG1sIC49ICR0aGlzLT5zZXJpYWxpemVfdmFsKCRrLCdrZXknLGZhbHNlLGZhbHNlLGZhbHNlLGZhbHNlLCR1c2UpOwoJCQkJCQkJJHhtbCAuPSAkdGhpcy0+c2VyaWFsaXplX3ZhbCgkdiwndmFsdWUnLGZhbHNlLGZhbHNlLGZhbHNlLGZhbHNlLCR1c2UpOwoJCQkJCQkJJHhtbCAuPSAnPC9pdGVtPic7CgkJCQkJCX0gZWxzZSB7CgkJCQkJCQkkeG1sIC49ICR0aGlzLT5zZXJpYWxpemVfdmFsKCR2LCRrLGZhbHNlLGZhbHNlLGZhbHNlLGZhbHNlLCR1c2UpOwoJCQkJCQl9CgkJCQkJfQoJCQkJCSR4bWwgLj0gIjwvJG5hbWU+IjsKCQkJCX0KCQkJCWJyZWFrOwoJCQlkZWZhdWx0OgoJCQkJJHhtbCAuPSAnbm90IGRldGVjdGVkLCBnb3QgJy5nZXR0eXBlKCR2YWwpLicgZm9yICcuJHZhbDsKCQkJCWJyZWFrOwoJCX0KCQlyZXR1cm4gJHhtbDsKCX0KCiAgICAvKioKICAgICogc2VyaWFsaXplcyBhIG1lc3NhZ2UKICAgICoKICAgICogQHBhcmFtIHN0cmluZyAkYm9keSB0aGUgWE1MIG9mIHRoZSBTT0FQIGJvZHkKICAgICogQHBhcmFtIG1peGVkICRoZWFkZXJzIG9wdGlvbmFsIHN0cmluZyBvZiBYTUwgd2l0aCBTT0FQIGhlYWRlciBjb250ZW50LCBvciBhcnJheSBvZiBzb2FwdmFsIG9iamVjdHMgZm9yIFNPQVAgaGVhZGVycwogICAgKiBAcGFyYW0gYXJyYXkgJG5hbWVzcGFjZXMgb3B0aW9uYWwgdGhlIG5hbWVzcGFjZXMgdXNlZCBpbiBnZW5lcmF0aW5nIHRoZSBib2R5IGFuZCBoZWFkZXJzCiAgICAqIEBwYXJhbSBzdHJpbmcgJHN0eWxlIG9wdGlvbmFsIChycGN8ZG9jdW1lbnQpCiAgICAqIEBwYXJhbSBzdHJpbmcgJHVzZSBvcHRpb25hbCAoZW5jb2RlZHxsaXRlcmFsKQogICAgKiBAcGFyYW0gc3RyaW5nICRlbmNvZGluZ1N0eWxlIG9wdGlvbmFsICh1c3VhbGx5ICdodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLycgZm9yIGVuY29kZWQpCiAgICAqIEByZXR1cm4gc3RyaW5nIHRoZSBtZXNzYWdlCiAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAqLwogICAgZnVuY3Rpb24gc2VyaWFsaXplRW52ZWxvcGUoJGJvZHksJGhlYWRlcnM9ZmFsc2UsJG5hbWVzcGFjZXM9YXJyYXkoKSwkc3R5bGU9J3JwYycsJHVzZT0nZW5jb2RlZCcsJGVuY29kaW5nU3R5bGU9J2h0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvJyl7CiAgICAvLyBUT0RPOiBhZGQgYW4gb3B0aW9uIHRvIGF1dG9tYXRpY2FsbHkgcnVuIHV0ZjhfZW5jb2RlIG9uICRib2R5IGFuZCAkaGVhZGVycwogICAgLy8gaWYgJHRoaXMtPnNvYXBfZGVmZW5jb2RpbmcgaXMgVVRGLTguICBOb3QgZG9pbmcgdGhpcyBhdXRvbWF0aWNhbGx5IGFsbG93cwogICAgLy8gb25lIHRvIHNlbmQgYXJiaXRyYXJ5IFVURi04IGNoYXJhY3RlcnMsIG5vdCBqdXN0IGNoYXJhY3RlcnMgdGhhdCBtYXAgdG8gSVNPLTg4NTktMQoKCSR0aGlzLT5kZWJ1ZygiSW4gc2VyaWFsaXplRW52ZWxvcGUgbGVuZ3RoPSIgLiBzdHJsZW4oJGJvZHkpIC4gIiBib2R5IChtYXggMTAwMCBjaGFyYWN0ZXJzKT0iIC4gc3Vic3RyKCRib2R5LCAwLCAxMDAwKSAuICIgc3R5bGU9JHN0eWxlIHVzZT0kdXNlIGVuY29kaW5nU3R5bGU9JGVuY29kaW5nU3R5bGUiKTsKCSR0aGlzLT5kZWJ1ZygiaGVhZGVyczoiKTsKCSR0aGlzLT5hcHBlbmREZWJ1ZygkdGhpcy0+dmFyRHVtcCgkaGVhZGVycykpOwoJJHRoaXMtPmRlYnVnKCJuYW1lc3BhY2VzOiIpOwoJJHRoaXMtPmFwcGVuZERlYnVnKCR0aGlzLT52YXJEdW1wKCRuYW1lc3BhY2VzKSk7CgoJLy8gc2VyaWFsaXplIG5hbWVzcGFjZXMKICAgICRuc19zdHJpbmcgPSAnJzsKCWZvcmVhY2goYXJyYXlfbWVyZ2UoJHRoaXMtPm5hbWVzcGFjZXMsJG5hbWVzcGFjZXMpIGFzICRrID0+ICR2KXsKCQkkbnNfc3RyaW5nIC49ICIgeG1sbnM6JGs9XCIkdlwiIjsKCX0KCWlmKCRlbmNvZGluZ1N0eWxlKSB7CgkJJG5zX3N0cmluZyA9ICIgU09BUC1FTlY6ZW5jb2RpbmdTdHlsZT1cIiRlbmNvZGluZ1N0eWxlXCIkbnNfc3RyaW5nIjsKCX0KCgkvLyBzZXJpYWxpemUgaGVhZGVycwoJaWYoJGhlYWRlcnMpewoJCWlmIChpc19hcnJheSgkaGVhZGVycykpIHsKCQkJJHhtbCA9ICcnOwoJCQlmb3JlYWNoICgkaGVhZGVycyBhcyAkaGVhZGVyKSB7CgkJCQkkeG1sIC49ICR0aGlzLT5zZXJpYWxpemVfdmFsKCRoZWFkZXIsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgJHVzZSk7CgkJCX0KCQkJJGhlYWRlcnMgPSAkeG1sOwoJCQkkdGhpcy0+ZGVidWcoIkluIHNlcmlhbGl6ZUVudmVsb3BlLCBzZXJpYWx6aWVkIGFycmF5IG9mIGhlYWRlcnMgdG8gJGhlYWRlcnMiKTsKCQl9CgkJJGhlYWRlcnMgPSAiPFNPQVAtRU5WOkhlYWRlcj4iLiRoZWFkZXJzLiI8L1NPQVAtRU5WOkhlYWRlcj4iOwoJfQoJLy8gc2VyaWFsaXplIGVudmVsb3BlCglyZXR1cm4KCSc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSInLiR0aGlzLT5zb2FwX2RlZmVuY29kaW5nIC4nIj8nLiI+Ii4KCSc8U09BUC1FTlY6RW52ZWxvcGUnLiRuc19zdHJpbmcuIj4iLgoJJGhlYWRlcnMuCgkiPFNPQVAtRU5WOkJvZHk+Ii4KCQkkYm9keS4KCSI8L1NPQVAtRU5WOkJvZHk+Ii4KCSI8L1NPQVAtRU5WOkVudmVsb3BlPiI7CiAgICB9CgoJLyoqCgkgKiBmb3JtYXRzIGEgc3RyaW5nIHRvIGJlIGluc2VydGVkIGludG8gYW4gSFRNTCBzdHJlYW0KCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRzdHIgVGhlIHN0cmluZyB0byBmb3JtYXQKCSAqIEByZXR1cm4gc3RyaW5nIFRoZSBmb3JtYXR0ZWQgc3RyaW5nCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQGRlcHJlY2F0ZWQKCSAqLwogICAgZnVuY3Rpb24gZm9ybWF0RHVtcCgkc3RyKXsKCQkkc3RyID0gaHRtbHNwZWNpYWxjaGFycygkc3RyKTsKCQlyZXR1cm4gbmwyYnIoJHN0cik7CiAgICB9CgoJLyoqCgkqIGNvbnRyYWN0cyAoY2hhbmdlcyBuYW1lc3BhY2UgdG8gcHJlZml4KSBhIHF1YWxpZmllZCBuYW1lCgkqCgkqIEBwYXJhbSAgICBzdHJpbmcgJHFuYW1lIHFuYW1lCgkqIEByZXR1cm4Jc3RyaW5nIGNvbnRyYWN0ZWQgcW5hbWUKCSogQGFjY2VzcyAgIHByaXZhdGUKCSovCglmdW5jdGlvbiBjb250cmFjdFFuYW1lKCRxbmFtZSl7CgkJLy8gZ2V0IGVsZW1lbnQgbmFtZXNwYWNlCgkJLy8kdGhpcy0+eGRlYnVnKCJDb250cmFjdCAkcW5hbWUiKTsKCQlpZiAoc3RycnBvcygkcW5hbWUsICc6JykpIHsKCQkJLy8gZ2V0IHVucXVhbGlmaWVkIG5hbWUKCQkJJG5hbWUgPSBzdWJzdHIoJHFuYW1lLCBzdHJycG9zKCRxbmFtZSwgJzonKSArIDEpOwoJCQkvLyBnZXQgbnMKCQkJJG5zID0gc3Vic3RyKCRxbmFtZSwgMCwgc3RycnBvcygkcW5hbWUsICc6JykpOwoJCQkkcCA9ICR0aGlzLT5nZXRQcmVmaXhGcm9tTmFtZXNwYWNlKCRucyk7CgkJCWlmICgkcCkgewoJCQkJcmV0dXJuICRwIC4gJzonIC4gJG5hbWU7CgkJCX0KCQkJcmV0dXJuICRxbmFtZTsKCQl9IGVsc2UgewoJCQlyZXR1cm4gJHFuYW1lOwoJCX0KCX0KCgkvKioKCSogZXhwYW5kcyAoY2hhbmdlcyBwcmVmaXggdG8gbmFtZXNwYWNlKSBhIHF1YWxpZmllZCBuYW1lCgkqCgkqIEBwYXJhbSAgICBzdHJpbmcgJHN0cmluZyBxbmFtZQoJKiBAcmV0dXJuCXN0cmluZyBleHBhbmRlZCBxbmFtZQoJKiBAYWNjZXNzICAgcHJpdmF0ZQoJKi8KCWZ1bmN0aW9uIGV4cGFuZFFuYW1lKCRxbmFtZSl7CgkJLy8gZ2V0IGVsZW1lbnQgcHJlZml4CgkJaWYoc3RycG9zKCRxbmFtZSwnOicpICYmICFlcmVnKCdeaHR0cDovLycsJHFuYW1lKSl7CgkJCS8vIGdldCB1bnF1YWxpZmllZCBuYW1lCgkJCSRuYW1lID0gc3Vic3RyKHN0cnN0cigkcW5hbWUsJzonKSwxKTsKCQkJLy8gZ2V0IG5zIHByZWZpeAoJCQkkcHJlZml4ID0gc3Vic3RyKCRxbmFtZSwwLHN0cnBvcygkcW5hbWUsJzonKSk7CgkJCWlmKGlzc2V0KCR0aGlzLT5uYW1lc3BhY2VzWyRwcmVmaXhdKSl7CgkJCQlyZXR1cm4gJHRoaXMtPm5hbWVzcGFjZXNbJHByZWZpeF0uJzonLiRuYW1lOwoJCQl9IGVsc2UgewoJCQkJcmV0dXJuICRxbmFtZTsKCQkJfQoJCX0gZWxzZSB7CgkJCXJldHVybiAkcW5hbWU7CgkJfQoJfQoKICAgIC8qKgogICAgKiByZXR1cm5zIHRoZSBsb2NhbCBwYXJ0IG9mIGEgcHJlZml4ZWQgc3RyaW5nCiAgICAqIHJldHVybnMgdGhlIG9yaWdpbmFsIHN0cmluZywgaWYgbm90IHByZWZpeGVkCiAgICAqCiAgICAqIEBwYXJhbSBzdHJpbmcgJHN0ciBUaGUgcHJlZml4ZWQgc3RyaW5nCiAgICAqIEByZXR1cm4gc3RyaW5nIFRoZSBsb2NhbCBwYXJ0CiAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAqLwoJZnVuY3Rpb24gZ2V0TG9jYWxQYXJ0KCRzdHIpewoJCWlmKCRzc3RyID0gc3RycmNocigkc3RyLCc6JykpewoJCQkvLyBnZXQgdW5xdWFsaWZpZWQgbmFtZQoJCQlyZXR1cm4gc3Vic3RyKCAkc3N0ciwgMSApOwoJCX0gZWxzZSB7CgkJCXJldHVybiAkc3RyOwoJCX0KCX0KCgkvKioKICAgICogcmV0dXJucyB0aGUgcHJlZml4IHBhcnQgb2YgYSBwcmVmaXhlZCBzdHJpbmcKICAgICogcmV0dXJucyBmYWxzZSwgaWYgbm90IHByZWZpeGVkCiAgICAqCiAgICAqIEBwYXJhbSBzdHJpbmcgJHN0ciBUaGUgcHJlZml4ZWQgc3RyaW5nCiAgICAqIEByZXR1cm4gbWl4ZWQgVGhlIHByZWZpeCBvciBmYWxzZSBpZiB0aGVyZSBpcyBubyBwcmVmaXgKICAgICogQGFjY2VzcyBwdWJsaWMKICAgICovCglmdW5jdGlvbiBnZXRQcmVmaXgoJHN0cil7CgkJaWYoJHBvcyA9IHN0cnJwb3MoJHN0ciwnOicpKXsKCQkJLy8gZ2V0IHByZWZpeAoJCQlyZXR1cm4gc3Vic3RyKCRzdHIsMCwkcG9zKTsKCQl9CgkJcmV0dXJuIGZhbHNlOwoJfQoKCS8qKgogICAgKiBwYXNzIGl0IGEgcHJlZml4LCBpdCByZXR1cm5zIGEgbmFtZXNwYWNlCiAgICAqCiAgICAqIEBwYXJhbSBzdHJpbmcgJHByZWZpeCBUaGUgcHJlZml4CiAgICAqIEByZXR1cm4gbWl4ZWQgVGhlIG5hbWVzcGFjZSwgZmFsc2UgaWYgbm8gbmFtZXNwYWNlIGhhcyB0aGUgc3BlY2lmaWVkIHByZWZpeAogICAgKiBAYWNjZXNzIHB1YmxpYwogICAgKi8KCWZ1bmN0aW9uIGdldE5hbWVzcGFjZUZyb21QcmVmaXgoJHByZWZpeCl7CgkJaWYgKGlzc2V0KCR0aGlzLT5uYW1lc3BhY2VzWyRwcmVmaXhdKSkgewoJCQlyZXR1cm4gJHRoaXMtPm5hbWVzcGFjZXNbJHByZWZpeF07CgkJfQoJCS8vJHRoaXMtPnNldEVycm9yKCJObyBuYW1lc3BhY2UgcmVnaXN0ZXJlZCBmb3IgcHJlZml4ICckcHJlZml4JyIpOwoJCXJldHVybiBmYWxzZTsKCX0KCgkvKioKICAgICogcmV0dXJucyB0aGUgcHJlZml4IGZvciBhIGdpdmVuIG5hbWVzcGFjZSAob3IgcHJlZml4KQogICAgKiBvciBmYWxzZSBpZiBubyBwcmVmaXhlcyByZWdpc3RlcmVkIGZvciB0aGUgZ2l2ZW4gbmFtZXNwYWNlCiAgICAqCiAgICAqIEBwYXJhbSBzdHJpbmcgJG5zIFRoZSBuYW1lc3BhY2UKICAgICogQHJldHVybiBtaXhlZCBUaGUgcHJlZml4LCBmYWxzZSBpZiB0aGUgbmFtZXNwYWNlIGhhcyBubyBwcmVmaXhlcwogICAgKiBAYWNjZXNzIHB1YmxpYwogICAgKi8KCWZ1bmN0aW9uIGdldFByZWZpeEZyb21OYW1lc3BhY2UoJG5zKSB7CgkJZm9yZWFjaCAoJHRoaXMtPm5hbWVzcGFjZXMgYXMgJHAgPT4gJG4pIHsKCQkJaWYgKCRucyA9PSAkbiB8fCAkbnMgPT0gJHApIHsKCQkJICAgICR0aGlzLT51c2VkTmFtZXNwYWNlc1skcF0gPSAkbjsKCQkJCXJldHVybiAkcDsKCQkJfQoJCX0KCQlyZXR1cm4gZmFsc2U7Cgl9CgoJLyoqCiAgICAqIHJldHVybnMgdGhlIHRpbWUgaW4gT0RCQyBjYW5vbmljYWwgZm9ybSB3aXRoIG1pY3Jvc2Vjb25kcwogICAgKgogICAgKiBAcmV0dXJuIHN0cmluZyBUaGUgdGltZSBpbiBPREJDIGNhbm9uaWNhbCBmb3JtIHdpdGggbWljcm9zZWNvbmRzCiAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAqLwoJZnVuY3Rpb24gZ2V0bWljcm90aW1lKCkgewoJCWlmIChmdW5jdGlvbl9leGlzdHMoJ2dldHRpbWVvZmRheScpKSB7CgkJCSR0b2QgPSBnZXR0aW1lb2ZkYXkoKTsKCQkJJHNlYyA9ICR0b2RbJ3NlYyddOwoJCQkkdXNlYyA9ICR0b2RbJ3VzZWMnXTsKCQl9IGVsc2UgewoJCQkkc2VjID0gdGltZSgpOwoJCQkkdXNlYyA9IDA7CgkJfQoJCXJldHVybiBzdHJmdGltZSgnJVktJW0tJWQgJUg6JU06JVMnLCAkc2VjKSAuICcuJyAuIHNwcmludGYoJyUwNmQnLCAkdXNlYyk7Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIGEgc3RyaW5nIHdpdGggdGhlIG91dHB1dCBvZiB2YXJfZHVtcAoJICoKCSAqIEBwYXJhbSBtaXhlZCAkZGF0YSBUaGUgdmFyaWFibGUgdG8gdmFyX2R1bXAKCSAqIEByZXR1cm4gc3RyaW5nIFRoZSBvdXRwdXQgb2YgdmFyX2R1bXAKCSAqIEBhY2Nlc3MgcHVibGljCgkgKi8KICAgIGZ1bmN0aW9uIHZhckR1bXAoJGRhdGEpIHsKCQlvYl9zdGFydCgpOwoJCXZhcl9kdW1wKCRkYXRhKTsKCQkkcmV0X3ZhbCA9IG9iX2dldF9jb250ZW50cygpOwoJCW9iX2VuZF9jbGVhbigpOwoJCXJldHVybiAkcmV0X3ZhbDsKCX0KfQoKLy8gWE1MIFNjaGVtYSBEYXRhdHlwZSBIZWxwZXIgRnVuY3Rpb25zCgovL3hzZDpkYXRlVGltZSBoZWxwZXJzCgovKioKKiBjb252ZXJ0IHVuaXggdGltZXN0YW1wIHRvIElTTyA4NjAxIGNvbXBsaWFudCBkYXRlIHN0cmluZwoqCiogQHBhcmFtICAgIHN0cmluZyAkdGltZXN0YW1wIFVuaXggdGltZSBzdGFtcAoqIEBhY2Nlc3MgICBwdWJsaWMKKi8KZnVuY3Rpb24gdGltZXN0YW1wX3RvX2lzbzg2MDEoJHRpbWVzdGFtcCwkdXRjPXRydWUpewoJJGRhdGVzdHIgPSBkYXRlKCdZLW0tZFxUSDppOnNPJywkdGltZXN0YW1wKTsKCWlmKCR1dGMpewoJCSRlcmVnU3RyID0KCQknKFswLTldezR9KS0nLgkvLyBjZW50dXJpZXMgJiB5ZWFycyBDQ1lZLQoJCScoWzAtOV17Mn0pLScuCS8vIG1vbnRocyBNTS0KCQknKFswLTldezJ9KScuCS8vIGRheXMgREQKCQknVCcuCQkJLy8gc2VwYXJhdG9yIFQKCQknKFswLTldezJ9KTonLgkvLyBob3VycyBoaDoKCQknKFswLTldezJ9KTonLgkvLyBtaW51dGVzIG1tOgoJCScoWzAtOV17Mn0pKFwuWzAtOV0qKT8nLiAvLyBzZWNvbmRzIHNzLnNzLi4uCgkJJyhafFsrXC1dWzAtOV17Mn06P1swLTldezJ9KT8nOyAvLyBaIHRvIGluZGljYXRlIFVUQywgLS8rSEg6TU06U1MuU1MuLi4gZm9yIGxvY2FsIHR6J3MKCgkJaWYoZXJlZygkZXJlZ1N0ciwkZGF0ZXN0ciwkcmVncykpewoJCQlyZXR1cm4gc3ByaW50ZignJTA0ZC0lMDJkLSUwMmRUJTAyZDolMDJkOiUwMmRaJywkcmVnc1sxXSwkcmVnc1syXSwkcmVnc1szXSwkcmVnc1s0XSwkcmVnc1s1XSwkcmVnc1s2XSk7CgkJfQoJCXJldHVybiBmYWxzZTsKCX0gZWxzZSB7CgkJcmV0dXJuICRkYXRlc3RyOwoJfQp9CgovKioKKiBjb252ZXJ0IElTTyA4NjAxIGNvbXBsaWFudCBkYXRlIHN0cmluZyB0byB1bml4IHRpbWVzdGFtcAoqCiogQHBhcmFtICAgIHN0cmluZyAkZGF0ZXN0ciBJU08gODYwMSBjb21wbGlhbnQgZGF0ZSBzdHJpbmcKKiBAYWNjZXNzICAgcHVibGljCiovCmZ1bmN0aW9uIGlzbzg2MDFfdG9fdGltZXN0YW1wKCRkYXRlc3RyKXsKCSRlcmVnU3RyID0KCScoWzAtOV17NH0pLScuCS8vIGNlbnR1cmllcyAmIHllYXJzIENDWVktCgknKFswLTldezJ9KS0nLgkvLyBtb250aHMgTU0tCgknKFswLTldezJ9KScuCS8vIGRheXMgREQKCSdUJy4JCQkvLyBzZXBhcmF0b3IgVAoJJyhbMC05XXsyfSk6Jy4JLy8gaG91cnMgaGg6CgknKFswLTldezJ9KTonLgkvLyBtaW51dGVzIG1tOgoJJyhbMC05XXsyfSkoXC5bMC05XSspPycuIC8vIHNlY29uZHMgc3Muc3MuLi4KCScoWnxbK1wtXVswLTldezJ9Oj9bMC05XXsyfSk/JzsgLy8gWiB0byBpbmRpY2F0ZSBVVEMsIC0vK0hIOk1NOlNTLlNTLi4uIGZvciBsb2NhbCB0eidzCglpZihlcmVnKCRlcmVnU3RyLCRkYXRlc3RyLCRyZWdzKSl7CgkJLy8gbm90IHV0YwoJCWlmKCRyZWdzWzhdICE9ICdaJyl7CgkJCSRvcCA9IHN1YnN0cigkcmVnc1s4XSwwLDEpOwoJCQkkaCA9IHN1YnN0cigkcmVnc1s4XSwxLDIpOwoJCQkkbSA9IHN1YnN0cigkcmVnc1s4XSxzdHJsZW4oJHJlZ3NbOF0pLTIsMik7CgkJCWlmKCRvcCA9PSAnLScpewoJCQkJJHJlZ3NbNF0gPSAkcmVnc1s0XSArICRoOwoJCQkJJHJlZ3NbNV0gPSAkcmVnc1s1XSArICRtOwoJCQl9IGVsc2VpZigkb3AgPT0gJysnKXsKCQkJCSRyZWdzWzRdID0gJHJlZ3NbNF0gLSAkaDsKCQkJCSRyZWdzWzVdID0gJHJlZ3NbNV0gLSAkbTsKCQkJfQoJCX0KCQlyZXR1cm4gc3RydG90aW1lKCIkcmVnc1sxXS0kcmVnc1syXS0kcmVnc1szXSAkcmVnc1s0XTokcmVnc1s1XTokcmVnc1s2XVoiKTsKCX0gZWxzZSB7CgkJcmV0dXJuIGZhbHNlOwoJfQp9CgovKioKKiBzbGVlcHMgc29tZSBudW1iZXIgb2YgbWljcm9zZWNvbmRzCioKKiBAcGFyYW0gICAgc3RyaW5nICR1c2VjIHRoZSBudW1iZXIgb2YgbWljcm9zZWNvbmRzIHRvIHNsZWVwCiogQGFjY2VzcyAgIHB1YmxpYwoqIEBkZXByZWNhdGVkCiovCmZ1bmN0aW9uIHVzbGVlcFdpbmRvd3MoJHVzZWMpCnsKCSRzdGFydCA9IGdldHRpbWVvZmRheSgpOwoJCglkbwoJewoJCSRzdG9wID0gZ2V0dGltZW9mZGF5KCk7CgkJJHRpbWVQYXNzZWQgPSAxMDAwMDAwICogKCRzdG9wWydzZWMnXSAtICRzdGFydFsnc2VjJ10pCgkJKyAkc3RvcFsndXNlYyddIC0gJHN0YXJ0Wyd1c2VjJ107Cgl9Cgl3aGlsZSAoJHRpbWVQYXNzZWQgPCAkdXNlYyk7Cn0KCgo/Pg==]]></data>
  </file>
  <file>
    <filename>classes/class.soapclient.php</filename>
    <isdir>0</isdir>
    <data><![CDATA[PD9waHAKCgoKCi8qKgoqCiogc29hcGNsaWVudCBoaWdoZXIgbGV2ZWwgY2xhc3MgZm9yIGVhc3kgdXNhZ2UuCioKKiB1c2FnZToKKgoqIC8vIGluc3RhbnRpYXRlIGNsaWVudCB3aXRoIHNlcnZlciBpbmZvCiogJHNvYXBjbGllbnQgPSBuZXcgc29hcGNsaWVudCggc3RyaW5nIHBhdGggWyAsYm9vbGVhbiB3c2RsXSApOwoqCiogLy8gY2FsbCBtZXRob2QsIGdldCByZXN1bHRzCiogZWNobyAkc29hcGNsaWVudC0+Y2FsbCggc3RyaW5nIG1ldGhvZG5hbWUgWyAsYXJyYXkgcGFyYW1ldGVyc10gKTsKKgoqIC8vIGJ5ZSBieWUgY2xpZW50CiogdW5zZXQoJHNvYXBjbGllbnQpOwoqCiogQGF1dGhvciAgIERpZXRyaWNoIEF5YWxhIDxkaWV0cmljaEBnYW54NC5jb20+CiogQHZlcnNpb24gICRJZDogY2xhc3Muc29hcGNsaWVudC5waHAsdiAxLjUyIDIwMDUvMDcvMjcgMTk6MjQ6NDIgc25pY2hvbCBFeHAgJAoqIEBhY2Nlc3MgICBwdWJsaWMKKi8KY2xhc3Mgc29hcGNsaWVudCBleHRlbmRzIG51c29hcF9iYXNlICB7CgoJdmFyICR1c2VybmFtZSA9ICcnOwoJdmFyICRwYXNzd29yZCA9ICcnOwoJdmFyICRhdXRodHlwZSA9ICcnOwoJdmFyICRjZXJ0UmVxdWVzdCA9IGFycmF5KCk7Cgl2YXIgJHJlcXVlc3RIZWFkZXJzID0gZmFsc2U7CS8vIFNPQVAgaGVhZGVycyBpbiByZXF1ZXN0ICh0ZXh0KQoJdmFyICRyZXNwb25zZUhlYWRlcnMgPSAnJzsJCS8vIFNPQVAgaGVhZGVycyBmcm9tIHJlc3BvbnNlIChpbmNvbXBsZXRlIG5hbWVzcGFjZSByZXNvbHV0aW9uKSAodGV4dCkKCXZhciAkZG9jdW1lbnQgPSAnJzsJCQkJLy8gU09BUCBib2R5IHJlc3BvbnNlIHBvcnRpb24gKGluY29tcGxldGUgbmFtZXNwYWNlIHJlc29sdXRpb24pICh0ZXh0KQoJdmFyICRlbmRwb2ludDsKCXZhciAkZm9yY2VFbmRwb2ludCA9ICcnOwkJLy8gb3ZlcnJpZGVzIFdTREwgZW5kcG9pbnQKICAgIHZhciAkcHJveHlob3N0ID0gJyc7CiAgICB2YXIgJHByb3h5cG9ydCA9ICcnOwoJdmFyICRwcm94eXVzZXJuYW1lID0gJyc7Cgl2YXIgJHByb3h5cGFzc3dvcmQgPSAnJzsKICAgIHZhciAkeG1sX2VuY29kaW5nID0gJyc7CQkJLy8gY2hhcmFjdGVyIHNldCBlbmNvZGluZyBvZiBpbmNvbWluZyAocmVzcG9uc2UpIG1lc3NhZ2VzCgl2YXIgJGh0dHBfZW5jb2RpbmcgPSBmYWxzZTsKCXZhciAkdGltZW91dCA9IDA7CQkJCS8vIEhUVFAgY29ubmVjdGlvbiB0aW1lb3V0Cgl2YXIgJHJlc3BvbnNlX3RpbWVvdXQgPSAzMDsJCS8vIEhUVFAgcmVzcG9uc2UgdGltZW91dAoJdmFyICRlbmRwb2ludFR5cGUgPSAnJzsJCQkvLyBzb2FwfHdzZGwsIGVtcHR5IGZvciBXU0RMIGluaXRpYWxpemF0aW9uIGVycm9yCgl2YXIgJHBlcnNpc3RlbnRDb25uZWN0aW9uID0gZmFsc2U7Cgl2YXIgJGRlZmF1bHRScGNQYXJhbXMgPSBmYWxzZTsJLy8gVGhpcyBpcyBubyBsb25nZXIgdXNlZAoJdmFyICRyZXF1ZXN0ID0gJyc7CQkJCS8vIEhUVFAgcmVxdWVzdAoJdmFyICRyZXNwb25zZSA9ICcnOwkJCQkvLyBIVFRQIHJlc3BvbnNlCgl2YXIgJHJlc3BvbnNlRGF0YSA9ICcnOwkJCS8vIFNPQVAgcGF5bG9hZCBvZiByZXNwb25zZQoJdmFyICRjb29raWVzID0gYXJyYXkoKTsJCQkvLyBDb29raWVzIGZyb20gcmVzcG9uc2Ugb3IgZm9yIHJlcXVlc3QKICAgIHZhciAkZGVjb2RlX3V0ZjggPSB0cnVlOwkJLy8gdG9nZ2xlcyB3aGV0aGVyIHRoZSBwYXJzZXIgZGVjb2RlcyBlbGVtZW50IGNvbnRlbnQgdy8gdXRmOF9kZWNvZGUoKQoJdmFyICRvcGVyYXRpb25zID0gYXJyYXkoKTsJCS8vIFdTREwgb3BlcmF0aW9ucywgZW1wdHkgZm9yIFdTREwgaW5pdGlhbGl6YXRpb24gZXJyb3IKCQoJLyoKCSAqIGZhdWx0IHJlbGF0ZWQgdmFyaWFibGVzCgkgKi8KCS8qKgoJICogQHZhciAgICAgIGZhdWx0CgkgKiBAYWNjZXNzICAgcHVibGljCgkgKi8KCXZhciAkZmF1bHQ7CgkvKioKCSAqIEB2YXIgICAgICBmYXVsdGNvZGUKCSAqIEBhY2Nlc3MgICBwdWJsaWMKCSAqLwoJdmFyICRmYXVsdGNvZGU7CgkvKioKCSAqIEB2YXIgICAgICBmYXVsdHN0cmluZwoJICogQGFjY2VzcyAgIHB1YmxpYwoJICovCgl2YXIgJGZhdWx0c3RyaW5nOwoJLyoqCgkgKiBAdmFyICAgICAgZmF1bHRkZXRhaWwKCSAqIEBhY2Nlc3MgICBwdWJsaWMKCSAqLwoJdmFyICRmYXVsdGRldGFpbDsKCgkvKioKCSogY29uc3RydWN0b3IKCSoKCSogQHBhcmFtICAgIG1peGVkICRlbmRwb2ludCBTT0FQIHNlcnZlciBvciBXU0RMIFVSTCAoc3RyaW5nKSwgb3Igd3NkbCBpbnN0YW5jZSAob2JqZWN0KQoJKiBAcGFyYW0gICAgYm9vbCAkd3NkbCBvcHRpb25hbCwgc2V0IHRvIHRydWUgaWYgdXNpbmcgV1NETAoJKiBAcGFyYW0JaW50ICRwb3J0TmFtZSBvcHRpb25hbCBwb3J0TmFtZSBpbiBXU0RMIGRvY3VtZW50CgkqIEBwYXJhbSAgICBzdHJpbmcgJHByb3h5aG9zdAoJKiBAcGFyYW0gICAgc3RyaW5nICRwcm94eXBvcnQKCSogQHBhcmFtCXN0cmluZyAkcHJveHl1c2VybmFtZQoJKiBAcGFyYW0Jc3RyaW5nICRwcm94eXBhc3N3b3JkCgkqIEBwYXJhbQlpbnRlZ2VyICR0aW1lb3V0IHNldCB0aGUgY29ubmVjdGlvbiB0aW1lb3V0CgkqIEBwYXJhbQlpbnRlZ2VyICRyZXNwb25zZV90aW1lb3V0IHNldCB0aGUgcmVzcG9uc2UgdGltZW91dAoJKiBAYWNjZXNzICAgcHVibGljCgkqLwoJZnVuY3Rpb24gc29hcGNsaWVudCgkZW5kcG9pbnQsJHdzZGwgPSBmYWxzZSwkcHJveHlob3N0ID0gZmFsc2UsJHByb3h5cG9ydCA9IGZhbHNlLCRwcm94eXVzZXJuYW1lID0gZmFsc2UsICRwcm94eXBhc3N3b3JkID0gZmFsc2UsICR0aW1lb3V0ID0gMCwgJHJlc3BvbnNlX3RpbWVvdXQgPSAzMCl7CgkJcGFyZW50OjpudXNvYXBfYmFzZSgpOwoJCSR0aGlzLT5lbmRwb2ludCA9ICRlbmRwb2ludDsKCQkkdGhpcy0+cHJveHlob3N0ID0gJHByb3h5aG9zdDsKCQkkdGhpcy0+cHJveHlwb3J0ID0gJHByb3h5cG9ydDsKCQkkdGhpcy0+cHJveHl1c2VybmFtZSA9ICRwcm94eXVzZXJuYW1lOwoJCSR0aGlzLT5wcm94eXBhc3N3b3JkID0gJHByb3h5cGFzc3dvcmQ7CgkJJHRoaXMtPnRpbWVvdXQgPSAkdGltZW91dDsKCQkkdGhpcy0+cmVzcG9uc2VfdGltZW91dCA9ICRyZXNwb25zZV90aW1lb3V0OwoKCQkvLyBtYWtlIHZhbHVlcwoJCWlmKCR3c2RsKXsKCQkJaWYgKGlzX29iamVjdCgkZW5kcG9pbnQpICYmIChnZXRfY2xhc3MoJGVuZHBvaW50KSA9PSAnd3NkbCcpKSB7CgkJCQkkdGhpcy0+d3NkbCA9ICRlbmRwb2ludDsKCQkJCSR0aGlzLT5lbmRwb2ludCA9ICR0aGlzLT53c2RsLT53c2RsOwoJCQkJJHRoaXMtPndzZGxGaWxlID0gJHRoaXMtPmVuZHBvaW50OwoJCQkJJHRoaXMtPmRlYnVnKCdleGlzdGluZyB3c2RsIGluc3RhbmNlIGNyZWF0ZWQgZnJvbSAnIC4gJHRoaXMtPmVuZHBvaW50KTsKCQkJfSBlbHNlIHsKCQkJCSR0aGlzLT53c2RsRmlsZSA9ICR0aGlzLT5lbmRwb2ludDsKCQkJCQoJCQkJLy8gaW5zdGFudGlhdGUgd3NkbCBvYmplY3QgYW5kIHBhcnNlIHdzZGwgZmlsZQoJCQkJJHRoaXMtPmRlYnVnKCdpbnN0YW50aWF0aW5nIHdzZGwgY2xhc3Mgd2l0aCBkb2M6ICcuJGVuZHBvaW50KTsKCQkJCSR0aGlzLT53c2RsID0mIG5ldyB3c2RsKCR0aGlzLT53c2RsRmlsZSwkdGhpcy0+cHJveHlob3N0LCR0aGlzLT5wcm94eXBvcnQsJHRoaXMtPnByb3h5dXNlcm5hbWUsJHRoaXMtPnByb3h5cGFzc3dvcmQsJHRoaXMtPnRpbWVvdXQsJHRoaXMtPnJlc3BvbnNlX3RpbWVvdXQpOwoJCQl9CgkJCSR0aGlzLT5hcHBlbmREZWJ1ZygkdGhpcy0+d3NkbC0+Z2V0RGVidWcoKSk7CgkJCSR0aGlzLT53c2RsLT5jbGVhckRlYnVnKCk7CgkJCS8vIGNhdGNoIGVycm9ycwoJCQlpZigkZXJyc3RyID0gJHRoaXMtPndzZGwtPmdldEVycm9yKCkpewoJCQkJJHRoaXMtPmRlYnVnKCdnb3Qgd3NkbCBlcnJvcjogJy4kZXJyc3RyKTsKCQkJCSR0aGlzLT5zZXRFcnJvcignd3NkbCBlcnJvcjogJy4kZXJyc3RyKTsKCQkJfSBlbHNlaWYoJHRoaXMtPm9wZXJhdGlvbnMgPSAkdGhpcy0+d3NkbC0+Z2V0T3BlcmF0aW9ucygpKXsKCQkJCSR0aGlzLT5kZWJ1ZyggJ2dvdCAnLmNvdW50KCR0aGlzLT5vcGVyYXRpb25zKS4nIG9wZXJhdGlvbnMgZnJvbSB3c2RsICcuJHRoaXMtPndzZGxGaWxlKTsKCQkJCSR0aGlzLT5lbmRwb2ludFR5cGUgPSAnd3NkbCc7CgkJCX0gZWxzZSB7CgkJCQkkdGhpcy0+ZGVidWcoICdnZXRPcGVyYXRpb25zIHJldHVybmVkIGZhbHNlJyk7CgkJCQkkdGhpcy0+c2V0RXJyb3IoJ25vIG9wZXJhdGlvbnMgZGVmaW5lZCBpbiB0aGUgV1NETCBkb2N1bWVudCEnKTsKCQkJfQoJCX0gZWxzZSB7CgkJCSR0aGlzLT5kZWJ1ZygiaW5zdGFudGlhdGUgU09BUCB3aXRoIGVuZHBvaW50IGF0ICRlbmRwb2ludCIpOwoJCQkkdGhpcy0+ZW5kcG9pbnRUeXBlID0gJ3NvYXAnOwoJCX0KCX0KCgkvKioKCSogY2FsbHMgbWV0aG9kLCByZXR1cm5zIFBIUCBuYXRpdmUgdHlwZQoJKgoJKiBAcGFyYW0gICAgc3RyaW5nICRtZXRob2QgU09BUCBzZXJ2ZXIgVVJMIG9yIHBhdGgKCSogQHBhcmFtICAgIG1peGVkICRwYXJhbXMgQW4gYXJyYXksIGFzc29jaWF0aXZlIG9yIHNpbXBsZSwgb2YgdGhlIHBhcmFtZXRlcnMKCSoJCQkgICAgICAgICAgICAgIGZvciB0aGUgbWV0aG9kIGNhbGwsIG9yIGEgc3RyaW5nIHRoYXQgaXMgdGhlIFhNTAoJKgkJCSAgICAgICAgICAgICAgZm9yIHRoZSBjYWxsLiAgRm9yIHJwYyBzdHlsZSwgdGhpcyBjYWxsIHdpbGwKCSoJCQkgICAgICAgICAgICAgIHdyYXAgdGhlIFhNTCBpbiBhIHRhZyBuYW1lZCBhZnRlciB0aGUgbWV0aG9kLCBhcwoJKgkJCSAgICAgICAgICAgICAgd2VsbCBhcyB0aGUgU09BUCBFbnZlbG9wZSBhbmQgQm9keS4gIEZvciBkb2N1bWVudAoJKgkJCSAgICAgICAgICAgICAgc3R5bGUsIHRoaXMgd2lsbCBvbmx5IHdyYXAgd2l0aCB0aGUgRW52ZWxvcGUgYW5kIEJvZHkuCgkqCQkJICAgICAgICAgICAgICBJTVBPUlRBTlQ6IHdoZW4gdXNpbmcgYW4gYXJyYXkgd2l0aCBkb2N1bWVudCBzdHlsZSwKCSoJCQkgICAgICAgICAgICAgIGluIHdoaWNoIGNhc2UgdGhlcmUKCSogICAgICAgICAgICAgICAgICAgICAgICAgaXMgcmVhbGx5IG9uZSBwYXJhbWV0ZXIsIHRoZSByb290IG9mIHRoZSBmcmFnbWVudAoJKiAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIGluIHRoZSBjYWxsLCB3aGljaCBlbmNsb3NlcyB3aGF0IHByb2dyYW1tZXJzCgkqICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGx5IHRoaW5rIG9mIHBhcmFtZXRlcnMuICBBIHBhcmFtZXRlciBhcnJheQoJKiAgICAgICAgICAgICAgICAgICAgICAgICAqbXVzdCogaW5jbHVkZSB0aGUgd3JhcHBlci4KCSogQHBhcmFtCXN0cmluZyAkbmFtZXNwYWNlIG9wdGlvbmFsIG1ldGhvZCBuYW1lc3BhY2UgKFdTREwgY2FuIG92ZXJyaWRlKQoJKiBAcGFyYW0Jc3RyaW5nICRzb2FwQWN0aW9uIG9wdGlvbmFsIFNPQVBBY3Rpb24gdmFsdWUgKFdTREwgY2FuIG92ZXJyaWRlKQoJKiBAcGFyYW0JbWl4ZWQgJGhlYWRlcnMgb3B0aW9uYWwgc3RyaW5nIG9mIFhNTCB3aXRoIFNPQVAgaGVhZGVyIGNvbnRlbnQsIG9yIGFycmF5IG9mIHNvYXB2YWwgb2JqZWN0cyBmb3IgU09BUCBoZWFkZXJzCgkqIEBwYXJhbQlib29sZWFuICRycGNQYXJhbXMgb3B0aW9uYWwgKG5vIGxvbmdlciB1c2VkKQoJKiBAcGFyYW0Jc3RyaW5nCSRzdHlsZSBvcHRpb25hbCAocnBjfGRvY3VtZW50KSB0aGUgc3R5bGUgdG8gdXNlIHdoZW4gc2VyaWFsaXppbmcgcGFyYW1ldGVycyAoV1NETCBjYW4gb3ZlcnJpZGUpCgkqIEBwYXJhbQlzdHJpbmcJJHVzZSBvcHRpb25hbCAoZW5jb2RlZHxsaXRlcmFsKSB0aGUgdXNlIHdoZW4gc2VyaWFsaXppbmcgcGFyYW1ldGVycyAoV1NETCBjYW4gb3ZlcnJpZGUpCgkqIEByZXR1cm4JbWl4ZWQJcmVzcG9uc2UgZnJvbSBTT0FQIGNhbGwKCSogQGFjY2VzcyAgIHB1YmxpYwoJKi8KCWZ1bmN0aW9uIGNhbGwoJG9wZXJhdGlvbiwkcGFyYW1zPWFycmF5KCksJG5hbWVzcGFjZT0naHR0cDovL3RlbXB1cmkub3JnJywkc29hcEFjdGlvbj0nJywkaGVhZGVycz1mYWxzZSwkcnBjUGFyYW1zPW51bGwsJHN0eWxlPSdycGMnLCR1c2U9J2VuY29kZWQnKXsKCQkkdGhpcy0+b3BlcmF0aW9uID0gJG9wZXJhdGlvbjsKCQkkdGhpcy0+ZmF1bHQgPSBmYWxzZTsKCQkkdGhpcy0+c2V0RXJyb3IoJycpOwoJCSR0aGlzLT5yZXF1ZXN0ID0gJyc7CgkJJHRoaXMtPnJlc3BvbnNlID0gJyc7CgkJJHRoaXMtPnJlc3BvbnNlRGF0YSA9ICcnOwoJCSR0aGlzLT5mYXVsdHN0cmluZyA9ICcnOwoJCSR0aGlzLT5mYXVsdGNvZGUgPSAnJzsKCQkkdGhpcy0+b3BEYXRhID0gYXJyYXkoKTsKCQkKCQkkdGhpcy0+ZGVidWcoImNhbGw6IG9wZXJhdGlvbj0kb3BlcmF0aW9uLCBuYW1lc3BhY2U9JG5hbWVzcGFjZSwgc29hcEFjdGlvbj0kc29hcEFjdGlvbiwgcnBjUGFyYW1zPSRycGNQYXJhbXMsIHN0eWxlPSRzdHlsZSwgdXNlPSR1c2UsIGVuZHBvaW50VHlwZT0kdGhpcy0+ZW5kcG9pbnRUeXBlIik7CgkJJHRoaXMtPmFwcGVuZERlYnVnKCdwYXJhbXM9JyAuICR0aGlzLT52YXJEdW1wKCRwYXJhbXMpKTsKCQkkdGhpcy0+YXBwZW5kRGVidWcoJ2hlYWRlcnM9JyAuICR0aGlzLT52YXJEdW1wKCRoZWFkZXJzKSk7CgkJaWYgKCRoZWFkZXJzKSB7CgkJCSR0aGlzLT5yZXF1ZXN0SGVhZGVycyA9ICRoZWFkZXJzOwoJCX0KCQkvLyBzZXJpYWxpemUgcGFyYW1ldGVycwoJCWlmKCR0aGlzLT5lbmRwb2ludFR5cGUgPT0gJ3dzZGwnICYmICRvcERhdGEgPSAkdGhpcy0+Z2V0T3BlcmF0aW9uRGF0YSgkb3BlcmF0aW9uKSl7CgkJCS8vIHVzZSBXU0RMIGZvciBvcGVyYXRpb24KCQkJJHRoaXMtPm9wRGF0YSA9ICRvcERhdGE7CgkJCSR0aGlzLT5kZWJ1ZygiZm91bmQgb3BlcmF0aW9uIik7CgkJCSR0aGlzLT5hcHBlbmREZWJ1Zygnb3BEYXRhPScgLiAkdGhpcy0+dmFyRHVtcCgkb3BEYXRhKSk7CgkJCWlmIChpc3NldCgkb3BEYXRhWydzb2FwQWN0aW9uJ10pKSB7CgkJCQkkc29hcEFjdGlvbiA9ICRvcERhdGFbJ3NvYXBBY3Rpb24nXTsKCQkJfQoJCQlpZiAoISAkdGhpcy0+Zm9yY2VFbmRwb2ludCkgewoJCQkJJHRoaXMtPmVuZHBvaW50ID0gJG9wRGF0YVsnZW5kcG9pbnQnXTsKCQkJfSBlbHNlIHsKCQkJCSR0aGlzLT5lbmRwb2ludCA9ICR0aGlzLT5mb3JjZUVuZHBvaW50OwoJCQl9CgkJCSRuYW1lc3BhY2UgPSBpc3NldCgkb3BEYXRhWydpbnB1dCddWyduYW1lc3BhY2UnXSkgPyAkb3BEYXRhWydpbnB1dCddWyduYW1lc3BhY2UnXSA6CSRuYW1lc3BhY2U7CgkJCSRzdHlsZSA9ICRvcERhdGFbJ3N0eWxlJ107CgkJCSR1c2UgPSAkb3BEYXRhWydpbnB1dCddWyd1c2UnXTsKCQkJLy8gYWRkIG5zIHRvIG5zIGFycmF5CgkJCWlmKCRuYW1lc3BhY2UgIT0gJycgJiYgIWlzc2V0KCR0aGlzLT53c2RsLT5uYW1lc3BhY2VzWyRuYW1lc3BhY2VdKSl7CgkJCQkkbnNQcmVmaXggPSAnbnMnIC4gcmFuZCgxMDAwLCA5OTk5KTsKCQkJCSR0aGlzLT53c2RsLT5uYW1lc3BhY2VzWyRuc1ByZWZpeF0gPSAkbmFtZXNwYWNlOwoJCQl9CiAgICAgICAgICAgICRuc1ByZWZpeCA9ICR0aGlzLT53c2RsLT5nZXRQcmVmaXhGcm9tTmFtZXNwYWNlKCRuYW1lc3BhY2UpOwoJCQkvLyBzZXJpYWxpemUgcGF5bG9hZAoJCQlpZiAoaXNfc3RyaW5nKCRwYXJhbXMpKSB7CgkJCQkkdGhpcy0+ZGVidWcoInNlcmlhbGl6aW5nIHBhcmFtIHN0cmluZyBmb3IgV1NETCBvcGVyYXRpb24gJG9wZXJhdGlvbiIpOwoJCQkJJHBheWxvYWQgPSAkcGFyYW1zOwoJCQl9IGVsc2VpZiAoaXNfYXJyYXkoJHBhcmFtcykpIHsKCQkJCSR0aGlzLT5kZWJ1Zygic2VyaWFsaXppbmcgcGFyYW0gYXJyYXkgZm9yIFdTREwgb3BlcmF0aW9uICRvcGVyYXRpb24iKTsKCQkJCSRwYXlsb2FkID0gJHRoaXMtPndzZGwtPnNlcmlhbGl6ZVJQQ1BhcmFtZXRlcnMoJG9wZXJhdGlvbiwnaW5wdXQnLCRwYXJhbXMpOwoJCQl9IGVsc2UgewoJCQkJJHRoaXMtPmRlYnVnKCdwYXJhbXMgbXVzdCBiZSBhcnJheSBvciBzdHJpbmcnKTsKCQkJCSR0aGlzLT5zZXRFcnJvcigncGFyYW1zIG11c3QgYmUgYXJyYXkgb3Igc3RyaW5nJyk7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KICAgICAgICAgICAgJHVzZWROYW1lc3BhY2VzID0gJHRoaXMtPndzZGwtPnVzZWROYW1lc3BhY2VzOwoJCQlpZiAoaXNzZXQoJG9wRGF0YVsnaW5wdXQnXVsnZW5jb2RpbmdTdHlsZSddKSkgewoJCQkJJGVuY29kaW5nU3R5bGUgPSAkb3BEYXRhWydpbnB1dCddWydlbmNvZGluZ1N0eWxlJ107CgkJCX0gZWxzZSB7CgkJCQkkZW5jb2RpbmdTdHlsZSA9ICcnOwoJCQl9CgkJCSR0aGlzLT5hcHBlbmREZWJ1ZygkdGhpcy0+d3NkbC0+Z2V0RGVidWcoKSk7CgkJCSR0aGlzLT53c2RsLT5jbGVhckRlYnVnKCk7CgkJCWlmICgkZXJyc3RyID0gJHRoaXMtPndzZGwtPmdldEVycm9yKCkpIHsKCQkJCSR0aGlzLT5kZWJ1ZygnZ290IHdzZGwgZXJyb3I6ICcuJGVycnN0cik7CgkJCQkkdGhpcy0+c2V0RXJyb3IoJ3dzZGwgZXJyb3I6ICcuJGVycnN0cik7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQl9IGVsc2VpZigkdGhpcy0+ZW5kcG9pbnRUeXBlID09ICd3c2RsJykgewoJCQkvLyBvcGVyYXRpb24gbm90IGluIFdTREwKCQkJJHRoaXMtPmFwcGVuZERlYnVnKCR0aGlzLT53c2RsLT5nZXREZWJ1ZygpKTsKCQkJJHRoaXMtPndzZGwtPmNsZWFyRGVidWcoKTsKCQkJJHRoaXMtPnNldEVycm9yKCAnb3BlcmF0aW9uICcuJG9wZXJhdGlvbi4nIG5vdCBwcmVzZW50LicpOwoJCQkkdGhpcy0+ZGVidWcoIm9wZXJhdGlvbiAnJG9wZXJhdGlvbicgbm90IHByZXNlbnQuIik7CgkJCXJldHVybiBmYWxzZTsKCQl9IGVsc2UgewoJCQkvLyBubyBXU0RMCgkJCS8vJHRoaXMtPm5hbWVzcGFjZXNbJ25zMSddID0gJG5hbWVzcGFjZTsKCQkJJG5zUHJlZml4ID0gJ25zJyAuIHJhbmQoMTAwMCwgOTk5OSk7CgkJCS8vIHNlcmlhbGl6ZSAKCQkJJHBheWxvYWQgPSAnJzsKCQkJaWYgKGlzX3N0cmluZygkcGFyYW1zKSkgewoJCQkJJHRoaXMtPmRlYnVnKCJzZXJpYWxpemluZyBwYXJhbSBzdHJpbmcgZm9yIG9wZXJhdGlvbiAkb3BlcmF0aW9uIik7CgkJCQkkcGF5bG9hZCA9ICRwYXJhbXM7CgkJCX0gZWxzZWlmIChpc19hcnJheSgkcGFyYW1zKSkgewoJCQkJJHRoaXMtPmRlYnVnKCJzZXJpYWxpemluZyBwYXJhbSBhcnJheSBmb3Igb3BlcmF0aW9uICRvcGVyYXRpb24iKTsKCQkJCWZvcmVhY2goJHBhcmFtcyBhcyAkayA9PiAkdil7CgkJCQkJJHBheWxvYWQgLj0gJHRoaXMtPnNlcmlhbGl6ZV92YWwoJHYsJGssZmFsc2UsZmFsc2UsZmFsc2UsZmFsc2UsJHVzZSk7CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQkkdGhpcy0+ZGVidWcoJ3BhcmFtcyBtdXN0IGJlIGFycmF5IG9yIHN0cmluZycpOwoJCQkJJHRoaXMtPnNldEVycm9yKCdwYXJhbXMgbXVzdCBiZSBhcnJheSBvciBzdHJpbmcnKTsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCQkkdXNlZE5hbWVzcGFjZXMgPSBhcnJheSgpOwoJCQlpZiAoJHVzZSA9PSAnZW5jb2RlZCcpIHsKCQkJCSRlbmNvZGluZ1N0eWxlID0gJ2h0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvJzsKCQkJfSBlbHNlIHsKCQkJCSRlbmNvZGluZ1N0eWxlID0gJyc7CgkJCX0KCQl9CgkJLy8gd3JhcCBSUEMgY2FsbHMgd2l0aCBtZXRob2QgZWxlbWVudAoJCWlmICgkc3R5bGUgPT0gJ3JwYycpIHsKCQkJaWYgKCR1c2UgPT0gJ2xpdGVyYWwnKSB7CgkJCQkkdGhpcy0+ZGVidWcoIndyYXBwaW5nIFJQQyByZXF1ZXN0IHdpdGggbGl0ZXJhbCBtZXRob2QgZWxlbWVudCIpOwoJCQkJaWYgKCRuYW1lc3BhY2UpIHsKCQkJCQkkcGF5bG9hZCA9ICI8JG9wZXJhdGlvbiB4bWxucz1cIiRuYW1lc3BhY2VcIj4iIC4gJHBheWxvYWQgLiAiPC8kb3BlcmF0aW9uPiI7CgkJCQl9IGVsc2UgewoJCQkJCSRwYXlsb2FkID0gIjwkb3BlcmF0aW9uPiIgLiAkcGF5bG9hZCAuICI8LyRvcGVyYXRpb24+IjsKCQkJCX0KCQkJfSBlbHNlIHsKCQkJCSR0aGlzLT5kZWJ1Zygid3JhcHBpbmcgUlBDIHJlcXVlc3Qgd2l0aCBlbmNvZGVkIG1ldGhvZCBlbGVtZW50Iik7CgkJCQlpZiAoJG5hbWVzcGFjZSkgewoJCQkJCSRwYXlsb2FkID0gIjwkbnNQcmVmaXg6JG9wZXJhdGlvbiB4bWxuczokbnNQcmVmaXg9XCIkbmFtZXNwYWNlXCI+IiAuCgkJCQkJCQkJJHBheWxvYWQgLgoJCQkJCQkJCSI8LyRuc1ByZWZpeDokb3BlcmF0aW9uPiI7CgkJCQl9IGVsc2UgewoJCQkJCSRwYXlsb2FkID0gIjwkb3BlcmF0aW9uPiIgLgoJCQkJCQkJCSRwYXlsb2FkIC4KCQkJCQkJCQkiPC8kb3BlcmF0aW9uPiI7CgkJCQl9CgkJCX0KCQl9CgkJLy8gc2VyaWFsaXplIGVudmVsb3BlCgkJJHNvYXBtc2cgPSAkdGhpcy0+c2VyaWFsaXplRW52ZWxvcGUoJHBheWxvYWQsJHRoaXMtPnJlcXVlc3RIZWFkZXJzLCR1c2VkTmFtZXNwYWNlcywkc3R5bGUsJHVzZSwkZW5jb2RpbmdTdHlsZSk7CgkJJHRoaXMtPmRlYnVnKCJlbmRwb2ludD0kdGhpcy0+ZW5kcG9pbnQsIHNvYXBBY3Rpb249JHNvYXBBY3Rpb24sIG5hbWVzcGFjZT0kbmFtZXNwYWNlLCBzdHlsZT0kc3R5bGUsIHVzZT0kdXNlLCBlbmNvZGluZ1N0eWxlPSRlbmNvZGluZ1N0eWxlIik7CgkJJHRoaXMtPmRlYnVnKCdTT0FQIG1lc3NhZ2UgbGVuZ3RoPScgLiBzdHJsZW4oJHNvYXBtc2cpIC4gJyBjb250ZW50cyAobWF4IDEwMDAgYnl0ZXMpPScgLiBzdWJzdHIoJHNvYXBtc2csIDAsIDEwMDApKTsKCQkvLyBzZW5kCgkJJHJldHVybiA9ICR0aGlzLT5zZW5kKCR0aGlzLT5nZXRIVFRQQm9keSgkc29hcG1zZyksJHNvYXBBY3Rpb24sJHRoaXMtPnRpbWVvdXQsJHRoaXMtPnJlc3BvbnNlX3RpbWVvdXQpOwoJCWlmKCRlcnJzdHIgPSAkdGhpcy0+Z2V0RXJyb3IoKSl7CgkJCSR0aGlzLT5kZWJ1ZygnRXJyb3I6ICcuJGVycnN0cik7CgkJCXJldHVybiBmYWxzZTsKCQl9IGVsc2UgewoJCQkkdGhpcy0+cmV0dXJuID0gJHJldHVybjsKCQkJJHRoaXMtPmRlYnVnKCdzZW50IG1lc3NhZ2Ugc3VjY2Vzc2Z1bGx5IGFuZCBnb3QgYShuKSAnLmdldHR5cGUoJHJldHVybikpOwogICAgICAgICAgIAkkdGhpcy0+YXBwZW5kRGVidWcoJ3JldHVybj0nIC4gJHRoaXMtPnZhckR1bXAoJHJldHVybikpOwoJCQkKCQkJLy8gZmF1bHQ/CgkJCWlmKGlzX2FycmF5KCRyZXR1cm4pICYmIGlzc2V0KCRyZXR1cm5bJ2ZhdWx0Y29kZSddKSl7CgkJCQkkdGhpcy0+ZGVidWcoJ2dvdCBmYXVsdCcpOwoJCQkJJHRoaXMtPnNldEVycm9yKCRyZXR1cm5bJ2ZhdWx0Y29kZSddLic6ICcuJHJldHVyblsnZmF1bHRzdHJpbmcnXSk7CgkJCQkkdGhpcy0+ZmF1bHQgPSB0cnVlOwoJCQkJZm9yZWFjaCgkcmV0dXJuIGFzICRrID0+ICR2KXsKCQkJCQkkdGhpcy0+JGsgPSAkdjsKCQkJCQkkdGhpcy0+ZGVidWcoIiRrID0gJHY8YnI+Iik7CgkJCQl9CgkJCQlyZXR1cm4gJHJldHVybjsKCQkJfSBlbHNlaWYgKCRzdHlsZSA9PSAnZG9jdW1lbnQnKSB7CgkJCQkvLyBOT1RFOiBpZiB0aGUgcmVzcG9uc2UgaXMgZGVmaW5lZCB0byBoYXZlIG11bHRpcGxlIHBhcnRzIChpLmUuIHVud3JhcHBlZCksCgkJCQkvLyB3ZSBhcmUgb25seSBnb2luZyB0byByZXR1cm4gdGhlIGZpcnN0IHBhcnQgaGVyZS4uLnNvcnJ5IGFib3V0IHRoYXQKCQkJCXJldHVybiAkcmV0dXJuOwoJCQl9IGVsc2UgewoJCQkJLy8gYXJyYXkgb2YgcmV0dXJuIHZhbHVlcwoJCQkJaWYoaXNfYXJyYXkoJHJldHVybikpewoJCQkJCS8vIG11bHRpcGxlICdvdXQnIHBhcmFtZXRlcnMsIHdoaWNoIHdlIHJldHVybiB3cmFwcGVkIHVwCgkJCQkJLy8gaW4gdGhlIGFycmF5CgkJCQkJaWYoc2l6ZW9mKCRyZXR1cm4pID4gMSl7CgkJCQkJCXJldHVybiAkcmV0dXJuOwoJCQkJCX0KCQkJCQkvLyBzaW5nbGUgJ291dCcgcGFyYW1ldGVyIChub3JtYWxseSB0aGUgcmV0dXJuIHZhbHVlKQoJCQkJCSRyZXR1cm4gPSBhcnJheV9zaGlmdCgkcmV0dXJuKTsKCQkJCQkkdGhpcy0+ZGVidWcoJ3JldHVybiBzaGlmdGVkIHZhbHVlOiAnKTsKCQkJCQkkdGhpcy0+YXBwZW5kRGVidWcoJHRoaXMtPnZhckR1bXAoJHJldHVybikpOwogICAgICAgICAgIAkJCXJldHVybiAkcmV0dXJuOwoJCQkJLy8gbm90aGluZyByZXR1cm5lZCAoaWUsIGVjaG9Wb2lkKQoJCQkJfSBlbHNlIHsKCQkJCQlyZXR1cm4gIiI7CgkJCQl9CgkJCX0KCQl9Cgl9CgoJLyoqCgkqIGdldCBhdmFpbGFibGUgZGF0YSBwZXJ0YWluaW5nIHRvIGFuIG9wZXJhdGlvbgoJKgoJKiBAcGFyYW0gICAgc3RyaW5nICRvcGVyYXRpb24gb3BlcmF0aW9uIG5hbWUKCSogQHJldHVybglhcnJheSBhcnJheSBvZiBkYXRhIHBlcnRhaW5pbmcgdG8gdGhlIG9wZXJhdGlvbgoJKiBAYWNjZXNzICAgcHVibGljCgkqLwoJZnVuY3Rpb24gZ2V0T3BlcmF0aW9uRGF0YSgkb3BlcmF0aW9uKXsKCQlpZihpc3NldCgkdGhpcy0+b3BlcmF0aW9uc1skb3BlcmF0aW9uXSkpewoJCQlyZXR1cm4gJHRoaXMtPm9wZXJhdGlvbnNbJG9wZXJhdGlvbl07CgkJfQoJCSR0aGlzLT5kZWJ1ZygiTm8gZGF0YSBmb3Igb3BlcmF0aW9uOiAkb3BlcmF0aW9uIik7Cgl9CgogICAgLyoqCiAgICAqIHNlbmQgdGhlIFNPQVAgbWVzc2FnZQogICAgKgogICAgKiBOb3RlOiBpZiB0aGUgb3BlcmF0aW9uIGhhcyBtdWx0aXBsZSByZXR1cm4gdmFsdWVzCiAgICAqIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhpcyBtZXRob2Qgd2lsbCBiZSBhbiBhcnJheQogICAgKiBvZiB0aG9zZSB2YWx1ZXMuCiAgICAqCgkqIEBwYXJhbSAgICBzdHJpbmcgJG1zZyBhIFNPQVB4NCBzb2FwbXNnIG9iamVjdAoJKiBAcGFyYW0gICAgc3RyaW5nICRzb2FwYWN0aW9uIFNPQVBBY3Rpb24gdmFsdWUKCSogQHBhcmFtICAgIGludGVnZXIgJHRpbWVvdXQgc2V0IGNvbm5lY3Rpb24gdGltZW91dCBpbiBzZWNvbmRzCgkqIEBwYXJhbQlpbnRlZ2VyICRyZXNwb25zZV90aW1lb3V0IHNldCByZXNwb25zZSB0aW1lb3V0IGluIHNlY29uZHMKCSogQHJldHVybgltaXhlZCBuYXRpdmUgUEhQIHR5cGVzLgoJKiBAYWNjZXNzICAgcHJpdmF0ZQoJKi8KCWZ1bmN0aW9uIHNlbmQoJG1zZywgJHNvYXBhY3Rpb24gPSAnJywgJHRpbWVvdXQ9MCwgJHJlc3BvbnNlX3RpbWVvdXQ9MzApIHsKCQkkdGhpcy0+Y2hlY2tDb29raWVzKCk7CgkJLy8gZGV0ZWN0IHRyYW5zcG9ydAoJCXN3aXRjaCh0cnVlKXsKCQkJLy8gaHR0cChzKQoJCQljYXNlIGVyZWcoJ15odHRwJywkdGhpcy0+ZW5kcG9pbnQpOgoJCQkJJHRoaXMtPmRlYnVnKCd0cmFuc3BvcnRpbmcgdmlhIEhUVFAnKTsKCQkJCWlmKCR0aGlzLT5wZXJzaXN0ZW50Q29ubmVjdGlvbiA9PSB0cnVlICYmIGlzX29iamVjdCgkdGhpcy0+cGVyc2lzdGVudENvbm5lY3Rpb24pKXsKCQkJCQkkaHR0cCA9JiAkdGhpcy0+cGVyc2lzdGVudENvbm5lY3Rpb247CgkJCQl9IGVsc2UgewoJCQkJCSRodHRwID0gbmV3IHNvYXBfdHJhbnNwb3J0X2h0dHAoJHRoaXMtPmVuZHBvaW50KTsKCQkJCQlpZiAoJHRoaXMtPnBlcnNpc3RlbnRDb25uZWN0aW9uKSB7CgkJCQkJCSRodHRwLT51c2VQZXJzaXN0ZW50Q29ubmVjdGlvbigpOwoJCQkJCX0KCQkJCX0KCQkJCSRodHRwLT5zZXRDb250ZW50VHlwZSgkdGhpcy0+Z2V0SFRUUENvbnRlbnRUeXBlKCksICR0aGlzLT5nZXRIVFRQQ29udGVudFR5cGVDaGFyc2V0KCkpOwoJCQkJJGh0dHAtPnNldFNPQVBBY3Rpb24oJHNvYXBhY3Rpb24pOwoJCQkJaWYoJHRoaXMtPnByb3h5aG9zdCAmJiAkdGhpcy0+cHJveHlwb3J0KXsKCQkJCQkkaHR0cC0+c2V0UHJveHkoJHRoaXMtPnByb3h5aG9zdCwkdGhpcy0+cHJveHlwb3J0LCR0aGlzLT5wcm94eXVzZXJuYW1lLCR0aGlzLT5wcm94eXBhc3N3b3JkKTsKCQkJCX0KICAgICAgICAgICAgICAgIGlmKCR0aGlzLT5hdXRodHlwZSAhPSAnJykgewoJCQkJCSRodHRwLT5zZXRDcmVkZW50aWFscygkdGhpcy0+dXNlcm5hbWUsICR0aGlzLT5wYXNzd29yZCwgJHRoaXMtPmF1dGh0eXBlLCBhcnJheSgpLCAkdGhpcy0+Y2VydFJlcXVlc3QpOwoJCQkJfQoJCQkJaWYoJHRoaXMtPmh0dHBfZW5jb2RpbmcgIT0gJycpewoJCQkJCSRodHRwLT5zZXRFbmNvZGluZygkdGhpcy0+aHR0cF9lbmNvZGluZyk7CgkJCQl9CgkJCQkkdGhpcy0+ZGVidWcoJ3NlbmRpbmcgbWVzc2FnZSwgbGVuZ3RoPScuc3RybGVuKCRtc2cpKTsKCQkJCWlmKGVyZWcoJ15odHRwOicsJHRoaXMtPmVuZHBvaW50KSl7CgkJCQkvL2lmKHN0cnBvcygkdGhpcy0+ZW5kcG9pbnQsJ2h0dHA6JykpewoJCQkJCSR0aGlzLT5yZXNwb25zZURhdGEgPSAkaHR0cC0+c2VuZCgkbXNnLCR0aW1lb3V0LCRyZXNwb25zZV90aW1lb3V0LCR0aGlzLT5jb29raWVzKTsKCQkJCX0gZWxzZWlmKGVyZWcoJ15odHRwcycsJHRoaXMtPmVuZHBvaW50KSl7CgkJCQkvL30gZWxzZWlmKHN0cnBvcygkdGhpcy0+ZW5kcG9pbnQsJ2h0dHBzOicpKXsKCQkJCQkvL2lmKHBocHZlcnNpb24oKSA9PSAnNC4zLjAtZGV2Jyl7CgkJCQkJCS8vJHJlc3BvbnNlID0gJGh0dHAtPnNlbmQoJG1zZywkdGltZW91dCwkcmVzcG9uc2VfdGltZW91dCk7CiAgICAgICAgICAgICAgICAgICAJCS8vJHRoaXMtPnJlcXVlc3QgPSAkaHR0cC0+b3V0Z29pbmdfcGF5bG9hZDsKCQkJCQkJLy8kdGhpcy0+cmVzcG9uc2UgPSAkaHR0cC0+aW5jb21pbmdfcGF5bG9hZDsKCQkJCQkvL30gZWxzZQoJCQkJCSR0aGlzLT5yZXNwb25zZURhdGEgPSAkaHR0cC0+c2VuZEhUVFBTKCRtc2csJHRpbWVvdXQsJHJlc3BvbnNlX3RpbWVvdXQsJHRoaXMtPmNvb2tpZXMpOwoJCQkJfSBlbHNlIHsKCQkJCQkkdGhpcy0+c2V0RXJyb3IoJ25vIGh0dHAvcyBpbiBlbmRwb2ludCB1cmwnKTsKCQkJCX0KCQkJCSR0aGlzLT5yZXF1ZXN0ID0gJGh0dHAtPm91dGdvaW5nX3BheWxvYWQ7CgkJCQkkdGhpcy0+cmVzcG9uc2UgPSAkaHR0cC0+aW5jb21pbmdfcGF5bG9hZDsKCQkJCSR0aGlzLT5hcHBlbmREZWJ1ZygkaHR0cC0+Z2V0RGVidWcoKSk7CgkJCQkkdGhpcy0+VXBkYXRlQ29va2llcygkaHR0cC0+aW5jb21pbmdfY29va2llcyk7CgoJCQkJLy8gc2F2ZSB0cmFuc3BvcnQgb2JqZWN0IGlmIHVzaW5nIHBlcnNpc3RlbnQgY29ubmVjdGlvbnMKCQkJCWlmICgkdGhpcy0+cGVyc2lzdGVudENvbm5lY3Rpb24pIHsKCQkJCQkkaHR0cC0+Y2xlYXJEZWJ1ZygpOwoJCQkJCWlmICghaXNfb2JqZWN0KCR0aGlzLT5wZXJzaXN0ZW50Q29ubmVjdGlvbikpIHsKCQkJCQkJJHRoaXMtPnBlcnNpc3RlbnRDb25uZWN0aW9uID0gJGh0dHA7CgkJCQkJfQoJCQkJfQoJCQkJCgkJCQlpZigkZXJyID0gJGh0dHAtPmdldEVycm9yKCkpewoJCQkJCSR0aGlzLT5zZXRFcnJvcignSFRUUCBFcnJvcjogJy4kZXJyKTsKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9IGVsc2VpZigkdGhpcy0+Z2V0RXJyb3IoKSl7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfSBlbHNlIHsKCQkJCQkkdGhpcy0+ZGVidWcoJ2dvdCByZXNwb25zZSwgbGVuZ3RoPScuIHN0cmxlbigkdGhpcy0+cmVzcG9uc2VEYXRhKS4nIHR5cGU9Jy4kaHR0cC0+aW5jb21pbmdfaGVhZGVyc1snY29udGVudC10eXBlJ10pOwoJCQkJCXJldHVybiAkdGhpcy0+cGFyc2VSZXNwb25zZSgkaHR0cC0+aW5jb21pbmdfaGVhZGVycywgJHRoaXMtPnJlc3BvbnNlRGF0YSk7CgkJCQl9CgkJCWJyZWFrOwoJCQlkZWZhdWx0OgoJCQkJJHRoaXMtPnNldEVycm9yKCdubyB0cmFuc3BvcnQgZm91bmQsIG9yIHNlbGVjdGVkIHRyYW5zcG9ydCBpcyBub3QgeWV0IHN1cHBvcnRlZCEnKTsKCQkJcmV0dXJuIGZhbHNlOwoJCQlicmVhazsKCQl9Cgl9CgoJLyoqCgkqIHByb2Nlc3NlcyBTT0FQIG1lc3NhZ2UgcmV0dXJuZWQgZnJvbSBzZXJ2ZXIKCSoKCSogQHBhcmFtCWFycmF5CSRoZWFkZXJzCVRoZSBIVFRQIGhlYWRlcnMKCSogQHBhcmFtCXN0cmluZwkkZGF0YQkJdW5wcm9jZXNzZWQgcmVzcG9uc2UgZGF0YSBmcm9tIHNlcnZlcgoJKiBAcmV0dXJuCW1peGVkCXZhbHVlIG9mIHRoZSBtZXNzYWdlLCBkZWNvZGVkIGludG8gYSBQSFAgdHlwZQoJKiBAYWNjZXNzICAgcHJpdmF0ZQoJKi8KICAgIGZ1bmN0aW9uIHBhcnNlUmVzcG9uc2UoJGhlYWRlcnMsICRkYXRhKSB7CgkJJHRoaXMtPmRlYnVnKCdFbnRlcmluZyBwYXJzZVJlc3BvbnNlKCkgZm9yIGRhdGEgb2YgbGVuZ3RoICcgLiBzdHJsZW4oJGRhdGEpIC4gJyBhbmQgdHlwZSAnIC4gJGhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddKTsKCQlpZiAoIXN0cnN0cigkaGVhZGVyc1snY29udGVudC10eXBlJ10sICd0ZXh0L3htbCcpKSB7CgkJCSR0aGlzLT5zZXRFcnJvcignUmVzcG9uc2Ugbm90IG9mIHR5cGUgdGV4dC94bWwnKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQlpZiAoc3RycG9zKCRoZWFkZXJzWydjb250ZW50LXR5cGUnXSwgJz0nKSkgewoJCQkkZW5jID0gc3RyX3JlcGxhY2UoJyInLCAnJywgc3Vic3RyKHN0cnN0cigkaGVhZGVyc1siY29udGVudC10eXBlIl0sICc9JyksIDEpKTsKCQkJJHRoaXMtPmRlYnVnKCdHb3QgcmVzcG9uc2UgZW5jb2Rpbmc6ICcgLiAkZW5jKTsKCQkJaWYoZXJlZ2koJ14oSVNPLTg4NTktMXxVUy1BU0NJSXxVVEYtOCkkJywkZW5jKSl7CgkJCQkkdGhpcy0+eG1sX2VuY29kaW5nID0gc3RydG91cHBlcigkZW5jKTsKCQkJfSBlbHNlIHsKCQkJCSR0aGlzLT54bWxfZW5jb2RpbmcgPSAnVVMtQVNDSUknOwoJCQl9CgkJfSBlbHNlIHsKCQkJLy8gc2hvdWxkIGJlIFVTLUFTQ0lJIGZvciBIVFRQIDEuMCBvciBJU08tODg1OS0xIGZvciBIVFRQIDEuMQoJCQkkdGhpcy0+eG1sX2VuY29kaW5nID0gJ0lTTy04ODU5LTEnOwoJCX0KCQkkdGhpcy0+ZGVidWcoJ1VzZSBlbmNvZGluZzogJyAuICR0aGlzLT54bWxfZW5jb2RpbmcgLiAnIHdoZW4gY3JlYXRpbmcgc29hcF9wYXJzZXInKTsKCQkkcGFyc2VyID0gbmV3IHNvYXBfcGFyc2VyKCRkYXRhLCR0aGlzLT54bWxfZW5jb2RpbmcsJHRoaXMtPm9wZXJhdGlvbiwkdGhpcy0+ZGVjb2RlX3V0ZjgpOwoJCS8vIGFkZCBwYXJzZXIgZGVidWcgZGF0YSB0byBvdXIgZGVidWcKCQkkdGhpcy0+YXBwZW5kRGVidWcoJHBhcnNlci0+Z2V0RGVidWcoKSk7CgkJLy8gaWYgcGFyc2UgZXJyb3JzCgkJaWYoJGVycnN0ciA9ICRwYXJzZXItPmdldEVycm9yKCkpewoJCQkkdGhpcy0+c2V0RXJyb3IoICRlcnJzdHIpOwoJCQkvLyBkZXN0cm95IHRoZSBwYXJzZXIgb2JqZWN0CgkJCXVuc2V0KCRwYXJzZXIpOwoJCQlyZXR1cm4gZmFsc2U7CgkJfSBlbHNlIHsKCQkJLy8gZ2V0IFNPQVAgaGVhZGVycwoJCQkkdGhpcy0+cmVzcG9uc2VIZWFkZXJzID0gJHBhcnNlci0+Z2V0SGVhZGVycygpOwoJCQkvLyBnZXQgZGVjb2RlZCBtZXNzYWdlCgkJCSRyZXR1cm4gPSAkcGFyc2VyLT5nZXRfcmVzcG9uc2UoKTsKICAgICAgICAgICAgLy8gYWRkIGRvY3VtZW50IGZvciBkb2NsaXQgc3VwcG9ydAogICAgICAgICAgICAkdGhpcy0+ZG9jdW1lbnQgPSAkcGFyc2VyLT5kb2N1bWVudDsKCQkJLy8gZGVzdHJveSB0aGUgcGFyc2VyIG9iamVjdAoJCQl1bnNldCgkcGFyc2VyKTsKCQkJLy8gcmV0dXJuIGRlY29kZSBtZXNzYWdlCgkJCXJldHVybiAkcmV0dXJuOwoJCX0KCSB9CgoJLyoqCgkqIHNldHMgdGhlIFNPQVAgZW5kcG9pbnQsIHdoaWNoIGNhbiBvdmVycmlkZSBXU0RMCgkqCgkqIEBwYXJhbQkkZW5kcG9pbnQgc3RyaW5nIFRoZSBlbmRwb2ludCBVUkwgdG8gdXNlLCBvciBlbXB0eSBzdHJpbmcgb3IgZmFsc2UgdG8gcHJldmVudCBvdmVycmlkZQoJKiBAYWNjZXNzICAgcHVibGljCgkqLwoJZnVuY3Rpb24gc2V0RW5kcG9pbnQoJGVuZHBvaW50KSB7CgkJJHRoaXMtPmZvcmNlRW5kcG9pbnQgPSAkZW5kcG9pbnQ7Cgl9CgoJLyoqCgkqIHNldCB0aGUgU09BUCBoZWFkZXJzCgkqCgkqIEBwYXJhbQkkaGVhZGVycyBtaXhlZCBTdHJpbmcgb2YgWE1MIHdpdGggU09BUCBoZWFkZXIgY29udGVudCwgb3IgYXJyYXkgb2Ygc29hcHZhbCBvYmplY3RzIGZvciBTT0FQIGhlYWRlcnMKCSogQGFjY2VzcyAgIHB1YmxpYwoJKi8KCWZ1bmN0aW9uIHNldEhlYWRlcnMoJGhlYWRlcnMpewoJCSR0aGlzLT5yZXF1ZXN0SGVhZGVycyA9ICRoZWFkZXJzOwoJfQoKCS8qKgoJKiBnZXQgdGhlIFNPQVAgcmVzcG9uc2UgaGVhZGVycyAobmFtZXNwYWNlIHJlc29sdXRpb24gaW5jb21wbGV0ZSkKCSoKCSogQHJldHVybglzdHJpbmcKCSogQGFjY2VzcyAgIHB1YmxpYwoJKi8KCWZ1bmN0aW9uIGdldEhlYWRlcnMoKXsKCQlyZXR1cm4gJHRoaXMtPnJlc3BvbnNlSGVhZGVyczsKCX0KCgkvKioKCSogc2V0IHByb3h5IGluZm8gaGVyZQoJKgoJKiBAcGFyYW0gICAgc3RyaW5nICRwcm94eWhvc3QKCSogQHBhcmFtICAgIHN0cmluZyAkcHJveHlwb3J0CgkqIEBwYXJhbQlzdHJpbmcgJHByb3h5dXNlcm5hbWUKCSogQHBhcmFtCXN0cmluZyAkcHJveHlwYXNzd29yZAoJKiBAYWNjZXNzICAgcHVibGljCgkqLwoJZnVuY3Rpb24gc2V0SFRUUFByb3h5KCRwcm94eWhvc3QsICRwcm94eXBvcnQsICRwcm94eXVzZXJuYW1lID0gJycsICRwcm94eXBhc3N3b3JkID0gJycpIHsKCQkkdGhpcy0+cHJveHlob3N0ID0gJHByb3h5aG9zdDsKCQkkdGhpcy0+cHJveHlwb3J0ID0gJHByb3h5cG9ydDsKCQkkdGhpcy0+cHJveHl1c2VybmFtZSA9ICRwcm94eXVzZXJuYW1lOwoJCSR0aGlzLT5wcm94eXBhc3N3b3JkID0gJHByb3h5cGFzc3dvcmQ7Cgl9CgoJLyoqCgkqIGlmIGF1dGhlbnRpY2F0aW5nLCBzZXQgdXNlciBjcmVkZW50aWFscyBoZXJlCgkqCgkqIEBwYXJhbSAgICBzdHJpbmcgJHVzZXJuYW1lCgkqIEBwYXJhbSAgICBzdHJpbmcgJHBhc3N3b3JkCgkqIEBwYXJhbQlzdHJpbmcgJGF1dGh0eXBlIChiYXNpY3xkaWdlc3R8Y2VydGlmaWNhdGUpCgkqIEBwYXJhbQlhcnJheSAkY2VydFJlcXVlc3QgKGtleXMgbXVzdCBiZSBjYWluZm9maWxlIChvcHRpb25hbCksIHNzbGNlcnRmaWxlLCBzc2xrZXlmaWxlLCBwYXNzcGhyYXNlLCB2ZXJpZnlwZWVyIChvcHRpb25hbCksIHZlcmlmeWhvc3QgKG9wdGlvbmFsKTogc2VlIGNvcnJlc3BvbmRpbmcgb3B0aW9ucyBpbiBjVVJMIGRvY3MpCgkqIEBhY2Nlc3MgICBwdWJsaWMKCSovCglmdW5jdGlvbiBzZXRDcmVkZW50aWFscygkdXNlcm5hbWUsICRwYXNzd29yZCwgJGF1dGh0eXBlID0gJ2Jhc2ljJywgJGNlcnRSZXF1ZXN0ID0gYXJyYXkoKSkgewoJCSR0aGlzLT51c2VybmFtZSA9ICR1c2VybmFtZTsKCQkkdGhpcy0+cGFzc3dvcmQgPSAkcGFzc3dvcmQ7CgkJJHRoaXMtPmF1dGh0eXBlID0gJGF1dGh0eXBlOwoJCSR0aGlzLT5jZXJ0UmVxdWVzdCA9ICRjZXJ0UmVxdWVzdDsKCX0KCQoJLyoqCgkqIHVzZSBIVFRQIGVuY29kaW5nCgkqCgkqIEBwYXJhbSAgICBzdHJpbmcgJGVuYwoJKiBAYWNjZXNzICAgcHVibGljCgkqLwoJZnVuY3Rpb24gc2V0SFRUUEVuY29kaW5nKCRlbmM9J2d6aXAsIGRlZmxhdGUnKXsKCQkkdGhpcy0+aHR0cF9lbmNvZGluZyA9ICRlbmM7Cgl9CgkKCS8qKgoJKiB1c2UgSFRUUCBwZXJzaXN0ZW50IGNvbm5lY3Rpb25zIGlmIHBvc3NpYmxlCgkqCgkqIEBhY2Nlc3MgICBwdWJsaWMKCSovCglmdW5jdGlvbiB1c2VIVFRQUGVyc2lzdGVudENvbm5lY3Rpb24oKXsKCQkkdGhpcy0+cGVyc2lzdGVudENvbm5lY3Rpb24gPSB0cnVlOwoJfQoJCgkvKioKCSogZ2V0cyB0aGUgZGVmYXVsdCBSUEMgcGFyYW1ldGVyIHNldHRpbmcuCgkqIElmIHRydWUsIGRlZmF1bHQgaXMgdGhhdCBjYWxsIHBhcmFtcyBhcmUgbGlrZSBSUEMgZXZlbiBmb3IgZG9jdW1lbnQgc3R5bGUuCgkqIEVhY2ggY2FsbCgpIGNhbiBvdmVycmlkZSB0aGlzIHZhbHVlLgoJKgoJKiBUaGlzIGlzIG5vIGxvbmdlciB1c2VkLgoJKgoJKiBAcmV0dXJuIGJvb2xlYW4KCSogQGFjY2VzcyBwdWJsaWMKCSogQGRlcHJlY2F0ZWQKCSovCglmdW5jdGlvbiBnZXREZWZhdWx0UnBjUGFyYW1zKCkgewoJCXJldHVybiAkdGhpcy0+ZGVmYXVsdFJwY1BhcmFtczsKCX0KCgkvKioKCSogc2V0cyB0aGUgZGVmYXVsdCBSUEMgcGFyYW1ldGVyIHNldHRpbmcuCgkqIElmIHRydWUsIGRlZmF1bHQgaXMgdGhhdCBjYWxsIHBhcmFtcyBhcmUgbGlrZSBSUEMgZXZlbiBmb3IgZG9jdW1lbnQgc3R5bGUKCSogRWFjaCBjYWxsKCkgY2FuIG92ZXJyaWRlIHRoaXMgdmFsdWUuCgkqCgkqIFRoaXMgaXMgbm8gbG9uZ2VyIHVzZWQuCgkqCgkqIEBwYXJhbSAgICBib29sZWFuICRycGNQYXJhbXMKCSogQGFjY2VzcyBwdWJsaWMKCSogQGRlcHJlY2F0ZWQKCSovCglmdW5jdGlvbiBzZXREZWZhdWx0UnBjUGFyYW1zKCRycGNQYXJhbXMpIHsKCQkkdGhpcy0+ZGVmYXVsdFJwY1BhcmFtcyA9ICRycGNQYXJhbXM7Cgl9CgkKCS8qKgoJKiBkeW5hbWljYWxseSBjcmVhdGVzIGFuIGluc3RhbmNlIG9mIGEgcHJveHkgY2xhc3MsCgkqIGFsbG93aW5nIHVzZXIgdG8gZGlyZWN0bHkgY2FsbCBtZXRob2RzIGZyb20gd3NkbAoJKgoJKiBAcmV0dXJuICAgb2JqZWN0IHNvYXBfcHJveHkgb2JqZWN0CgkqIEBhY2Nlc3MgICBwdWJsaWMKCSovCglmdW5jdGlvbiBnZXRQcm94eSgpewoJCSRyID0gcmFuZCgpOwoJCSRldmFsU3RyID0gJHRoaXMtPl9nZXRQcm94eUNsYXNzQ29kZSgkcik7CgkJLy8kdGhpcy0+ZGVidWcoInByb3h5IGNsYXNzOiAkZXZhbFN0ciI7CgkJLy8gZXZhbCB0aGUgY2xhc3MKCQlldmFsKCRldmFsU3RyKTsKCQkvLyBpbnN0YW50aWF0ZSBwcm94eSBvYmplY3QKCQlldmFsKCJcJHByb3h5ID0gbmV3IHNvYXBfcHJveHlfJHIoJycpOyIpOwoJCS8vIHRyYW5zZmVyIGN1cnJlbnQgd3NkbCBkYXRhIHRvIHRoZSBwcm94eSB0aGVyZWJ5IGF2b2lkaW5nIHBhcnNpbmcgdGhlIHdzZGwgdHdpY2UKCQkkcHJveHktPmVuZHBvaW50VHlwZSA9ICd3c2RsJzsKCQkkcHJveHktPndzZGxGaWxlID0gJHRoaXMtPndzZGxGaWxlOwoJCSRwcm94eS0+d3NkbCA9ICR0aGlzLT53c2RsOwoJCSRwcm94eS0+b3BlcmF0aW9ucyA9ICR0aGlzLT5vcGVyYXRpb25zOwoJCSRwcm94eS0+ZGVmYXVsdFJwY1BhcmFtcyA9ICR0aGlzLT5kZWZhdWx0UnBjUGFyYW1zOwoJCS8vIHRyYW5zZmVyIG90aGVyIHN0YXRlCgkJJHByb3h5LT51c2VybmFtZSA9ICR0aGlzLT51c2VybmFtZTsKCQkkcHJveHktPnBhc3N3b3JkID0gJHRoaXMtPnBhc3N3b3JkOwoJCSRwcm94eS0+YXV0aHR5cGUgPSAkdGhpcy0+YXV0aHR5cGU7CgkJJHByb3h5LT5wcm94eWhvc3QgPSAkdGhpcy0+cHJveHlob3N0OwoJCSRwcm94eS0+cHJveHlwb3J0ID0gJHRoaXMtPnByb3h5cG9ydDsKCQkkcHJveHktPnByb3h5dXNlcm5hbWUgPSAkdGhpcy0+cHJveHl1c2VybmFtZTsKCQkkcHJveHktPnByb3h5cGFzc3dvcmQgPSAkdGhpcy0+cHJveHlwYXNzd29yZDsKCQkkcHJveHktPnRpbWVvdXQgPSAkdGhpcy0+dGltZW91dDsKCQkkcHJveHktPnJlc3BvbnNlX3RpbWVvdXQgPSAkdGhpcy0+cmVzcG9uc2VfdGltZW91dDsKCQkkcHJveHktPmh0dHBfZW5jb2RpbmcgPSAkdGhpcy0+aHR0cF9lbmNvZGluZzsKCQkkcHJveHktPnBlcnNpc3RlbnRDb25uZWN0aW9uID0gJHRoaXMtPnBlcnNpc3RlbnRDb25uZWN0aW9uOwoJCSRwcm94eS0+cmVxdWVzdEhlYWRlcnMgPSAkdGhpcy0+cmVxdWVzdEhlYWRlcnM7CgkJJHByb3h5LT5zb2FwX2RlZmVuY29kaW5nID0gJHRoaXMtPnNvYXBfZGVmZW5jb2Rpbmc7CgkJJHByb3h5LT5lbmRwb2ludCA9ICR0aGlzLT5lbmRwb2ludDsKCQkkcHJveHktPmZvcmNlRW5kcG9pbnQgPSAkdGhpcy0+Zm9yY2VFbmRwb2ludDsKCQlyZXR1cm4gJHByb3h5OwoJfQoKCS8qKgoJKiBkeW5hbWljYWxseSBjcmVhdGVzIHByb3h5IGNsYXNzIGNvZGUKCSoKCSogQHJldHVybiAgIHN0cmluZyBQSFAvTnVTT0FQIGNvZGUgZm9yIHRoZSBwcm94eSBjbGFzcwoJKiBAYWNjZXNzICAgcHJpdmF0ZQoJKi8KCWZ1bmN0aW9uIF9nZXRQcm94eUNsYXNzQ29kZSgkcikgewoJCWlmICgkdGhpcy0+ZW5kcG9pbnRUeXBlICE9ICd3c2RsJykgewoJCQkkZXZhbFN0ciA9ICdBIHByb3h5IGNhbiBvbmx5IGJlIGNyZWF0ZWQgZm9yIGEgV1NETCBjbGllbnQnOwoJCQkkdGhpcy0+c2V0RXJyb3IoJGV2YWxTdHIpOwoJCQlyZXR1cm4gJGV2YWxTdHI7CgkJfQoJCSRldmFsU3RyID0gJyc7CgkJZm9yZWFjaCAoJHRoaXMtPm9wZXJhdGlvbnMgYXMgJG9wZXJhdGlvbiA9PiAkb3BEYXRhKSB7CgkJCWlmICgkb3BlcmF0aW9uICE9ICcnKSB7CgkJCQkvLyBjcmVhdGUgcGFyYW0gc3RyaW5nIGFuZCBwYXJhbSBjb21tZW50IHN0cmluZwoJCQkJaWYgKHNpemVvZigkb3BEYXRhWydpbnB1dCddWydwYXJ0cyddKSA+IDApIHsKCQkJCQkkcGFyYW1TdHIgPSAnJzsKCQkJCQkkcGFyYW1BcnJheVN0ciA9ICcnOwoJCQkJCSRwYXJhbUNvbW1lbnRTdHIgPSAnJzsKCQkJCQlmb3JlYWNoICgkb3BEYXRhWydpbnB1dCddWydwYXJ0cyddIGFzICRuYW1lID0+ICR0eXBlKSB7CgkJCQkJCSRwYXJhbVN0ciAuPSAiXCQkbmFtZSwgIjsKCQkJCQkJJHBhcmFtQXJyYXlTdHIgLj0gIickbmFtZScgPT4gXCQkbmFtZSwgIjsKCQkJCQkJJHBhcmFtQ29tbWVudFN0ciAuPSAiJHR5cGUgXCQkbmFtZSwgIjsKCQkJCQl9CgkJCQkJJHBhcmFtU3RyID0gc3Vic3RyKCRwYXJhbVN0ciwgMCwgc3RybGVuKCRwYXJhbVN0ciktMik7CgkJCQkJJHBhcmFtQXJyYXlTdHIgPSBzdWJzdHIoJHBhcmFtQXJyYXlTdHIsIDAsIHN0cmxlbigkcGFyYW1BcnJheVN0ciktMik7CgkJCQkJJHBhcmFtQ29tbWVudFN0ciA9IHN1YnN0cigkcGFyYW1Db21tZW50U3RyLCAwLCBzdHJsZW4oJHBhcmFtQ29tbWVudFN0ciktMik7CgkJCQl9IGVsc2UgewoJCQkJCSRwYXJhbVN0ciA9ICcnOwoJCQkJCSRwYXJhbUNvbW1lbnRTdHIgPSAndm9pZCc7CgkJCQl9CgkJCQkkb3BEYXRhWyduYW1lc3BhY2UnXSA9ICFpc3NldCgkb3BEYXRhWyduYW1lc3BhY2UnXSkgPyAnaHR0cDovL3Rlc3R1cmkuY29tJyA6ICRvcERhdGFbJ25hbWVzcGFjZSddOwoJCQkJJGV2YWxTdHIgLj0gIi8vICRwYXJhbUNvbW1lbnRTdHIKCWZ1bmN0aW9uICIgLiBzdHJfcmVwbGFjZSgnLicsICdfXycsICRvcGVyYXRpb24pIC4gIigkcGFyYW1TdHIpIHsKCQlcJHBhcmFtcyA9IGFycmF5KCRwYXJhbUFycmF5U3RyKTsKCQlyZXR1cm4gXCR0aGlzLT5jYWxsKCckb3BlcmF0aW9uJywgXCRwYXJhbXMsICciLiRvcERhdGFbJ25hbWVzcGFjZSddLiInLCAnIi4oaXNzZXQoJG9wRGF0YVsnc29hcEFjdGlvbiddKSA/ICRvcERhdGFbJ3NvYXBBY3Rpb24nXSA6ICcnKS4iJyk7Cgl9CgkiOwoJCQkJdW5zZXQoJHBhcmFtU3RyKTsKCQkJCXVuc2V0KCRwYXJhbUNvbW1lbnRTdHIpOwoJCQl9CgkJfQoJCSRldmFsU3RyID0gJ2NsYXNzIHNvYXBfcHJveHlfJy4kci4nIGV4dGVuZHMgc29hcGNsaWVudCB7CgknLiRldmFsU3RyLicKfSc7CgkJcmV0dXJuICRldmFsU3RyOwoJfQoKCS8qKgoJKiBkeW5hbWljYWxseSBjcmVhdGVzIHByb3h5IGNsYXNzIGNvZGUKCSoKCSogQHJldHVybiAgIHN0cmluZyBQSFAvTnVTT0FQIGNvZGUgZm9yIHRoZSBwcm94eSBjbGFzcwoJKiBAYWNjZXNzICAgcHVibGljCgkqLwoJZnVuY3Rpb24gZ2V0UHJveHlDbGFzc0NvZGUoKSB7CgkJJHIgPSByYW5kKCk7CgkJcmV0dXJuICR0aGlzLT5fZ2V0UHJveHlDbGFzc0NvZGUoJHIpOwoJfQoKCS8qKgoJKiBnZXRzIHRoZSBIVFRQIGJvZHkgZm9yIHRoZSBjdXJyZW50IHJlcXVlc3QuCgkqCgkqIEBwYXJhbSBzdHJpbmcgJHNvYXBtc2cgVGhlIFNPQVAgcGF5bG9hZAoJKiBAcmV0dXJuIHN0cmluZyBUaGUgSFRUUCBib2R5LCB3aGljaCBpbmNsdWRlcyB0aGUgU09BUCBwYXlsb2FkCgkqIEBhY2Nlc3MgcHJpdmF0ZQoJKi8KCWZ1bmN0aW9uIGdldEhUVFBCb2R5KCRzb2FwbXNnKSB7CgkJcmV0dXJuICRzb2FwbXNnOwoJfQoJCgkvKioKCSogZ2V0cyB0aGUgSFRUUCBjb250ZW50IHR5cGUgZm9yIHRoZSBjdXJyZW50IHJlcXVlc3QuCgkqCgkqIE5vdGU6IGdldEhUVFBCb2R5IG11c3QgYmUgY2FsbGVkIGJlZm9yZSB0aGlzLgoJKgoJKiBAcmV0dXJuIHN0cmluZyB0aGUgSFRUUCBjb250ZW50IHR5cGUgZm9yIHRoZSBjdXJyZW50IHJlcXVlc3QuCgkqIEBhY2Nlc3MgcHJpdmF0ZQoJKi8KCWZ1bmN0aW9uIGdldEhUVFBDb250ZW50VHlwZSgpIHsKCQlyZXR1cm4gJ3RleHQveG1sJzsKCX0KCQoJLyoqCgkqIGdldHMgdGhlIEhUVFAgY29udGVudCB0eXBlIGNoYXJzZXQgZm9yIHRoZSBjdXJyZW50IHJlcXVlc3QuCgkqIHJldHVybnMgZmFsc2UgZm9yIG5vbi10ZXh0IGNvbnRlbnQgdHlwZXMuCgkqCgkqIE5vdGU6IGdldEhUVFBCb2R5IG11c3QgYmUgY2FsbGVkIGJlZm9yZSB0aGlzLgoJKgoJKiBAcmV0dXJuIHN0cmluZyB0aGUgSFRUUCBjb250ZW50IHR5cGUgY2hhcnNldCBmb3IgdGhlIGN1cnJlbnQgcmVxdWVzdC4KCSogQGFjY2VzcyBwcml2YXRlCgkqLwoJZnVuY3Rpb24gZ2V0SFRUUENvbnRlbnRUeXBlQ2hhcnNldCgpIHsKCQlyZXR1cm4gJHRoaXMtPnNvYXBfZGVmZW5jb2Rpbmc7Cgl9CgoJLyoKCSogd2hldGhlciBvciBub3QgcGFyc2VyIHNob3VsZCBkZWNvZGUgdXRmOCBlbGVtZW50IGNvbnRlbnQKICAgICoKICAgICogQHJldHVybiAgIGFsd2F5cyByZXR1cm5zIHRydWUKICAgICogQGFjY2VzcyAgIHB1YmxpYwogICAgKi8KICAgIGZ1bmN0aW9uIGRlY29kZVVURjgoJGJvb2wpewoJCSR0aGlzLT5kZWNvZGVfdXRmOCA9ICRib29sOwoJCXJldHVybiB0cnVlOwogICAgfQoKCS8qKgoJICogYWRkcyBhIG5ldyBDb29raWUgaW50byAkdGhpcy0+Y29va2llcyBhcnJheQoJICoKCSAqIEBwYXJhbQlzdHJpbmcgJG5hbWUgQ29va2llIE5hbWUKCSAqIEBwYXJhbQlzdHJpbmcgJHZhbHVlIENvb2tpZSBWYWx1ZQoJICogQHJldHVybglpZiBjb29raWUtc2V0IHdhcyBzdWNjZXNzZnVsIHJldHVybnMgdHJ1ZSwgZWxzZSBmYWxzZQoJICogQGFjY2VzcwlwdWJsaWMKCSAqLwoJZnVuY3Rpb24gc2V0Q29va2llKCRuYW1lLCAkdmFsdWUpIHsKCQlpZiAoc3RybGVuKCRuYW1lKSA9PSAwKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJJHRoaXMtPmNvb2tpZXNbXSA9IGFycmF5KCduYW1lJyA9PiAkbmFtZSwgJ3ZhbHVlJyA9PiAkdmFsdWUpOwoJCXJldHVybiB0cnVlOwoJfQoKCS8qKgoJICogZ2V0cyBhbGwgQ29va2llcwoJICoKCSAqIEByZXR1cm4gICBhcnJheSB3aXRoIGFsbCBpbnRlcm5hbCBjb29raWVzCgkgKiBAYWNjZXNzICAgcHVibGljCgkgKi8KCWZ1bmN0aW9uIGdldENvb2tpZXMoKSB7CgkJcmV0dXJuICR0aGlzLT5jb29raWVzOwoJfQoKCS8qKgoJICogY2hlY2tzIGFsbCBDb29raWVzIGFuZCBkZWxldGUgdGhvc2Ugd2hpY2ggYXJlIGV4cGlyZWQKCSAqCgkgKiBAcmV0dXJuICAgYWx3YXlzIHJldHVybiB0cnVlCgkgKiBAYWNjZXNzICAgcHJpdmF0ZQoJICovCglmdW5jdGlvbiBjaGVja0Nvb2tpZXMoKSB7CgkJaWYgKHNpemVvZigkdGhpcy0+Y29va2llcykgPT0gMCkgewoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgkJJHRoaXMtPmRlYnVnKCdjaGVja0Nvb2tpZTogY2hlY2sgJyAuIHNpemVvZigkdGhpcy0+Y29va2llcykgLiAnIGNvb2tpZXMnKTsKCQkkY3Vycl9jb29raWVzID0gJHRoaXMtPmNvb2tpZXM7CgkJJHRoaXMtPmNvb2tpZXMgPSBhcnJheSgpOwoJCWZvcmVhY2ggKCRjdXJyX2Nvb2tpZXMgYXMgJGNvb2tpZSkgewoJCQlpZiAoISBpc19hcnJheSgkY29va2llKSkgewoJCQkJJHRoaXMtPmRlYnVnKCdSZW1vdmUgY29va2llIHRoYXQgaXMgbm90IGFuIGFycmF5Jyk7CgkJCQljb250aW51ZTsKCQkJfQoJCQlpZiAoKGlzc2V0KCRjb29raWVbJ2V4cGlyZXMnXSkpICYmICghIGVtcHR5KCRjb29raWVbJ2V4cGlyZXMnXSkpKSB7CgkJCQlpZiAoc3RydG90aW1lKCRjb29raWVbJ2V4cGlyZXMnXSkgPiB0aW1lKCkpIHsKCQkJCQkkdGhpcy0+Y29va2llc1tdID0gJGNvb2tpZTsKCQkJCX0gZWxzZSB7CgkJCQkJJHRoaXMtPmRlYnVnKCdSZW1vdmUgZXhwaXJlZCBjb29raWUgJyAuICRjb29raWVbJ25hbWUnXSk7CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQkkdGhpcy0+Y29va2llc1tdID0gJGNvb2tpZTsKCQkJfQoJCX0KCQkkdGhpcy0+ZGVidWcoJ2NoZWNrQ29va2llOiAnLnNpemVvZigkdGhpcy0+Y29va2llcykuJyBjb29raWVzIGxlZnQgaW4gYXJyYXknKTsKCQlyZXR1cm4gdHJ1ZTsKCX0KCgkvKioKCSAqIHVwZGF0ZXMgdGhlIGN1cnJlbnQgY29va2llcyB3aXRoIGEgbmV3IHNldAoJICoKCSAqIEBwYXJhbQlhcnJheSAkY29va2llcyBuZXcgY29va2llcyB3aXRoIHdoaWNoIHRvIHVwZGF0ZSBjdXJyZW50IG9uZXMKCSAqIEByZXR1cm4JYWx3YXlzIHJldHVybiB0cnVlCgkgKiBAYWNjZXNzCXByaXZhdGUKCSAqLwoJZnVuY3Rpb24gVXBkYXRlQ29va2llcygkY29va2llcykgewoJCWlmIChzaXplb2YoJHRoaXMtPmNvb2tpZXMpID09IDApIHsKCQkJLy8gbm8gZXhpc3RpbmcgY29va2llczogdGFrZSB3aGF0ZXZlciBpcyBuZXcKCQkJaWYgKHNpemVvZigkY29va2llcykgPiAwKSB7CgkJCQkkdGhpcy0+ZGVidWcoJ1NldHRpbmcgbmV3IGNvb2tpZShzKScpOwoJCQkJJHRoaXMtPmNvb2tpZXMgPSAkY29va2llczsKCQkJfQoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgkJaWYgKHNpemVvZigkY29va2llcykgPT0gMCkgewoJCQkvLyBubyBuZXcgY29va2llczoga2VlcCB3aGF0IHdlJ3ZlIGdvdAoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgkJLy8gbWVyZ2UKCQlmb3JlYWNoICgkY29va2llcyBhcyAkbmV3Q29va2llKSB7CgkJCWlmICghaXNfYXJyYXkoJG5ld0Nvb2tpZSkpIHsKCQkJCWNvbnRpbnVlOwoJCQl9CgkJCWlmICgoIWlzc2V0KCRuZXdDb29raWVbJ25hbWUnXSkpIHx8ICghaXNzZXQoJG5ld0Nvb2tpZVsndmFsdWUnXSkpKSB7CgkJCQljb250aW51ZTsKCQkJfQoJCQkkbmV3TmFtZSA9ICRuZXdDb29raWVbJ25hbWUnXTsKCgkJCSRmb3VuZCA9IGZhbHNlOwoJCQlmb3IgKCRpID0gMDsgJGkgPCBjb3VudCgkdGhpcy0+Y29va2llcyk7ICRpKyspIHsKCQkJCSRjb29raWUgPSAkdGhpcy0+Y29va2llc1skaV07CgkJCQlpZiAoIWlzX2FycmF5KCRjb29raWUpKSB7CgkJCQkJY29udGludWU7CgkJCQl9CgkJCQlpZiAoIWlzc2V0KCRjb29raWVbJ25hbWUnXSkpIHsKCQkJCQljb250aW51ZTsKCQkJCX0KCQkJCWlmICgkbmV3TmFtZSAhPSAkY29va2llWyduYW1lJ10pIHsKCQkJCQljb250aW51ZTsKCQkJCX0KCQkJCSRuZXdEb21haW4gPSBpc3NldCgkbmV3Q29va2llWydkb21haW4nXSkgPyAkbmV3Q29va2llWydkb21haW4nXSA6ICdOT0RPTUFJTic7CgkJCQkkZG9tYWluID0gaXNzZXQoJGNvb2tpZVsnZG9tYWluJ10pID8gJGNvb2tpZVsnZG9tYWluJ10gOiAnTk9ET01BSU4nOwoJCQkJaWYgKCRuZXdEb21haW4gIT0gJGRvbWFpbikgewoJCQkJCWNvbnRpbnVlOwoJCQkJfQoJCQkJJG5ld1BhdGggPSBpc3NldCgkbmV3Q29va2llWydwYXRoJ10pID8gJG5ld0Nvb2tpZVsncGF0aCddIDogJ05PUEFUSCc7CgkJCQkkcGF0aCA9IGlzc2V0KCRjb29raWVbJ3BhdGgnXSkgPyAkY29va2llWydwYXRoJ10gOiAnTk9QQVRIJzsKCQkJCWlmICgkbmV3UGF0aCAhPSAkcGF0aCkgewoJCQkJCWNvbnRpbnVlOwoJCQkJfQoJCQkJJHRoaXMtPmNvb2tpZXNbJGldID0gJG5ld0Nvb2tpZTsKCQkJCSRmb3VuZCA9IHRydWU7CgkJCQkkdGhpcy0+ZGVidWcoJ1VwZGF0ZSBjb29raWUgJyAuICRuZXdOYW1lIC4gJz0nIC4gJG5ld0Nvb2tpZVsndmFsdWUnXSk7CgkJCQlicmVhazsKCQkJfQoJCQlpZiAoISAkZm91bmQpIHsKCQkJCSR0aGlzLT5kZWJ1ZygnQWRkIGNvb2tpZSAnIC4gJG5ld05hbWUgLiAnPScgLiAkbmV3Q29va2llWyd2YWx1ZSddKTsKCQkJCSR0aGlzLT5jb29raWVzW10gPSAkbmV3Q29va2llOwoJCQl9CgkJfQoJCXJldHVybiB0cnVlOwoJfQp9Cj8+Cg==]]></data>
  </file>
  <file>
    <filename>classes/class.soap_fault.php</filename>
    <isdir>0</isdir>
    <data><![CDATA[PD9waHAKCgoKCi8qKgoqIENvbnRhaW5zIGluZm9ybWF0aW9uIGZvciBhIFNPQVAgZmF1bHQuCiogTWFpbmx5IHVzZWQgZm9yIHJldHVybmluZyBmYXVsdHMgZnJvbSBkZXBsb3llZCBmdW5jdGlvbnMKKiBpbiBhIHNlcnZlciBpbnN0YW5jZS4KKiBAYXV0aG9yICAgRGlldHJpY2ggQXlhbGEgPGRpZXRyaWNoQGdhbng0LmNvbT4KKiBAdmVyc2lvbiAgJElkOiBjbGFzcy5zb2FwX2ZhdWx0LnBocCx2IDEuMTIgMjAwNS8wNy8yNyAxOToyNDo0MiBzbmljaG9sIEV4cCAkCiogQGFjY2VzcyBwdWJsaWMKKi8KY2xhc3Mgc29hcF9mYXVsdCBleHRlbmRzIG51c29hcF9iYXNlIHsKCS8qKgoJICogVGhlIGZhdWx0IGNvZGUgKGNsaWVudHxzZXJ2ZXIpCgkgKiBAdmFyIHN0cmluZwoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCXZhciAkZmF1bHRjb2RlOwoJLyoqCgkgKiBUaGUgZmF1bHQgYWN0b3IKCSAqIEB2YXIgc3RyaW5nCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJdmFyICRmYXVsdGFjdG9yOwoJLyoqCgkgKiBUaGUgZmF1bHQgc3RyaW5nLCBhIGRlc2NyaXB0aW9uIG9mIHRoZSBmYXVsdAoJICogQHZhciBzdHJpbmcKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCgl2YXIgJGZhdWx0c3RyaW5nOwoJLyoqCgkgKiBUaGUgZmF1bHQgZGV0YWlsLCB0eXBpY2FsbHkgYSBzdHJpbmcgb3IgYXJyYXkgb2Ygc3RyaW5nCgkgKiBAdmFyIG1peGVkCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJdmFyICRmYXVsdGRldGFpbDsKCgkvKioKCSogY29uc3RydWN0b3IKICAgICoKICAgICogQHBhcmFtIHN0cmluZyAkZmF1bHRjb2RlIChjbGllbnQgfCBzZXJ2ZXIpCiAgICAqIEBwYXJhbSBzdHJpbmcgJGZhdWx0YWN0b3Igb25seSB1c2VkIHdoZW4gbXNnIHJvdXRlZCBiZXR3ZWVuIG11bHRpcGxlIGFjdG9ycwogICAgKiBAcGFyYW0gc3RyaW5nICRmYXVsdHN0cmluZyBodW1hbiByZWFkYWJsZSBlcnJvciBtZXNzYWdlCiAgICAqIEBwYXJhbSBtaXhlZCAkZmF1bHRkZXRhaWwgZGV0YWlsLCB0eXBpY2FsbHkgYSBzdHJpbmcgb3IgYXJyYXkgb2Ygc3RyaW5nCgkqLwoJZnVuY3Rpb24gc29hcF9mYXVsdCgkZmF1bHRjb2RlLCRmYXVsdGFjdG9yPScnLCRmYXVsdHN0cmluZz0nJywkZmF1bHRkZXRhaWw9JycpewoJCXBhcmVudDo6bnVzb2FwX2Jhc2UoKTsKCQkkdGhpcy0+ZmF1bHRjb2RlID0gJGZhdWx0Y29kZTsKCQkkdGhpcy0+ZmF1bHRhY3RvciA9ICRmYXVsdGFjdG9yOwoJCSR0aGlzLT5mYXVsdHN0cmluZyA9ICRmYXVsdHN0cmluZzsKCQkkdGhpcy0+ZmF1bHRkZXRhaWwgPSAkZmF1bHRkZXRhaWw7Cgl9CgoJLyoqCgkqIHNlcmlhbGl6ZSBhIGZhdWx0CgkqCgkqIEByZXR1cm4Jc3RyaW5nCVRoZSBzZXJpYWxpemF0aW9uIG9mIHRoZSBmYXVsdCBpbnN0YW5jZS4KCSogQGFjY2VzcyAgIHB1YmxpYwoJKi8KCWZ1bmN0aW9uIHNlcmlhbGl6ZSgpewoJCSRuc19zdHJpbmcgPSAnJzsKCQlmb3JlYWNoKCR0aGlzLT5uYW1lc3BhY2VzIGFzICRrID0+ICR2KXsKCQkJJG5zX3N0cmluZyAuPSAiXG4gIHhtbG5zOiRrPVwiJHZcIiI7CgkJfQoJCSRyZXR1cm5fbXNnID0KCQkJJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IicuJHRoaXMtPnNvYXBfZGVmZW5jb2RpbmcuJyI/PicuCgkJCSc8U09BUC1FTlY6RW52ZWxvcGUgU09BUC1FTlY6ZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iJy4kbnNfc3RyaW5nLiI+XG4iLgoJCQkJJzxTT0FQLUVOVjpCb2R5PicuCgkJCQknPFNPQVAtRU5WOkZhdWx0PicuCgkJCQkJJHRoaXMtPnNlcmlhbGl6ZV92YWwoJHRoaXMtPmZhdWx0Y29kZSwgJ2ZhdWx0Y29kZScpLgoJCQkJCSR0aGlzLT5zZXJpYWxpemVfdmFsKCR0aGlzLT5mYXVsdGFjdG9yLCAnZmF1bHRhY3RvcicpLgoJCQkJCSR0aGlzLT5zZXJpYWxpemVfdmFsKCR0aGlzLT5mYXVsdHN0cmluZywgJ2ZhdWx0c3RyaW5nJykuCgkJCQkJJHRoaXMtPnNlcmlhbGl6ZV92YWwoJHRoaXMtPmZhdWx0ZGV0YWlsLCAnZGV0YWlsJykuCgkJCQknPC9TT0FQLUVOVjpGYXVsdD4nLgoJCQkJJzwvU09BUC1FTlY6Qm9keT4nLgoJCQknPC9TT0FQLUVOVjpFbnZlbG9wZT4nOwoJCXJldHVybiAkcmV0dXJuX21zZzsKCX0KfQoKCgoKPz4=]]></data>
  </file>
  <file>
    <filename>classes/class.soap_parser.php</filename>
    <isdir>0</isdir>
    <data><![CDATA[PD9waHAKCgoKCi8qKgoqCiogc29hcF9wYXJzZXIgY2xhc3MgcGFyc2VzIFNPQVAgWE1MIG1lc3NhZ2VzIGludG8gbmF0aXZlIFBIUCB2YWx1ZXMKKgoqIEBhdXRob3IgICBEaWV0cmljaCBBeWFsYSA8ZGlldHJpY2hAZ2FueDQuY29tPgoqIEB2ZXJzaW9uICAkSWQ6IGNsYXNzLnNvYXBfcGFyc2VyLnBocCx2IDEuMzYgMjAwNS8wOC8wNCAwMToyNzo0MiBzbmljaG9sIEV4cCAkCiogQGFjY2VzcyAgIHB1YmxpYwoqLwpjbGFzcyBzb2FwX3BhcnNlciBleHRlbmRzIG51c29hcF9iYXNlIHsKCgl2YXIgJHhtbCA9ICcnOwoJdmFyICR4bWxfZW5jb2RpbmcgPSAnJzsKCXZhciAkbWV0aG9kID0gJyc7Cgl2YXIgJHJvb3Rfc3RydWN0ID0gJyc7Cgl2YXIgJHJvb3Rfc3RydWN0X25hbWUgPSAnJzsKCXZhciAkcm9vdF9zdHJ1Y3RfbmFtZXNwYWNlID0gJyc7Cgl2YXIgJHJvb3RfaGVhZGVyID0gJyc7CiAgICB2YXIgJGRvY3VtZW50ID0gJyc7CQkJLy8gaW5jb21pbmcgU09BUCBib2R5ICh0ZXh0KQoJLy8gZGV0ZXJtaW5lcyB3aGVyZSBpbiB0aGUgbWVzc2FnZSB3ZSBhcmUgKGVudmVsb3BlLGhlYWRlcixib2R5LG1ldGhvZCkKCXZhciAkc3RhdHVzID0gJyc7Cgl2YXIgJHBvc2l0aW9uID0gMDsKCXZhciAkZGVwdGggPSAwOwoJdmFyICRkZWZhdWx0X25hbWVzcGFjZSA9ICcnOwoJdmFyICRuYW1lc3BhY2VzID0gYXJyYXkoKTsKCXZhciAkbWVzc2FnZSA9IGFycmF5KCk7CiAgICB2YXIgJHBhcmVudCA9ICcnOwoJdmFyICRmYXVsdCA9IGZhbHNlOwoJdmFyICRmYXVsdF9jb2RlID0gJyc7Cgl2YXIgJGZhdWx0X3N0ciA9ICcnOwoJdmFyICRmYXVsdF9kZXRhaWwgPSAnJzsKCXZhciAkZGVwdGhfYXJyYXkgPSBhcnJheSgpOwoJdmFyICRkZWJ1Z19mbGFnID0gdHJ1ZTsKCXZhciAkc29hcHJlc3BvbnNlID0gTlVMTDsKCXZhciAkcmVzcG9uc2VIZWFkZXJzID0gJyc7CS8vIGluY29taW5nIFNPQVAgaGVhZGVycyAodGV4dCkKCXZhciAkYm9keV9wb3NpdGlvbiA9IDA7CgkvLyBmb3IgbXVsdGlyZWYgcGFyc2luZzoKCS8vIGFycmF5IG9mIGlkID0+IHBvcwoJdmFyICRpZHMgPSBhcnJheSgpOwoJLy8gYXJyYXkgb2YgaWQgPT4gaHJlZnMgPT4gcG9zCgl2YXIgJG11bHRpcmVmcyA9IGFycmF5KCk7CgkvLyB0b2dnbGUgZm9yIGF1dG8tZGVjb2RpbmcgZWxlbWVudCBjb250ZW50Cgl2YXIgJGRlY29kZV91dGY4ID0gdHJ1ZTsKCgkvKioKCSogY29uc3RydWN0b3IgdGhhdCBhY3R1YWxseSBkb2VzIHRoZSBwYXJzaW5nCgkqCgkqIEBwYXJhbSAgICBzdHJpbmcgJHhtbCBTT0FQIG1lc3NhZ2UKCSogQHBhcmFtICAgIHN0cmluZyAkZW5jb2RpbmcgY2hhcmFjdGVyIGVuY29kaW5nIHNjaGVtZSBvZiBtZXNzYWdlCgkqIEBwYXJhbSAgICBzdHJpbmcgJG1ldGhvZCBtZXRob2QgZm9yIHdoaWNoIFhNTCBpcyBwYXJzZWQgKHVudXNlZD8pCgkqIEBwYXJhbSAgICBzdHJpbmcgJGRlY29kZV91dGY4IHdoZXRoZXIgdG8gZGVjb2RlIFVURi04IHRvIElTTy04ODU5LTEKCSogQGFjY2VzcyAgIHB1YmxpYwoJKi8KCWZ1bmN0aW9uIHNvYXBfcGFyc2VyKCR4bWwsJGVuY29kaW5nPSdVVEYtOCcsJG1ldGhvZD0nJywkZGVjb2RlX3V0Zjg9dHJ1ZSl7CgkJcGFyZW50OjpudXNvYXBfYmFzZSgpOwoJCSR0aGlzLT54bWwgPSAkeG1sOwoJCSR0aGlzLT54bWxfZW5jb2RpbmcgPSAkZW5jb2Rpbmc7CgkJJHRoaXMtPm1ldGhvZCA9ICRtZXRob2Q7CgkJJHRoaXMtPmRlY29kZV91dGY4ID0gJGRlY29kZV91dGY4OwoKCQkvLyBDaGVjayB3aGV0aGVyIGNvbnRlbnQgaGFzIGJlZW4gcmVhZC4KCQlpZighZW1wdHkoJHhtbCkpewoJCQkvLyBDaGVjayBYTUwgZW5jb2RpbmcKCQkJJHBvc194bWwgPSBzdHJwb3MoJHhtbCwgJzw/eG1sJyk7CgkJCWlmICgkcG9zX3htbCAhPT0gRkFMU0UpIHsKCQkJCSR4bWxfZGVjbCA9IHN1YnN0cigkeG1sLCAkcG9zX3htbCwgc3RycG9zKCR4bWwsICc/PicsICRwb3NfeG1sICsgMikgLSAkcG9zX3htbCArIDEpOwoJCQkJaWYgKHByZWdfbWF0Y2goIi9lbmNvZGluZz1bXCInXShbXlwiJ10qKVtcIiddLyIsICR4bWxfZGVjbCwgJHJlcykpIHsKCQkJCQkkeG1sX2VuY29kaW5nID0gJHJlc1sxXTsKCQkJCQlpZiAoc3RydG91cHBlcigkeG1sX2VuY29kaW5nKSAhPSAkZW5jb2RpbmcpIHsKCQkJCQkJJGVyciA9ICJDaGFyc2V0IGZyb20gSFRUUCBDb250ZW50LVR5cGUgJyIgLiAkZW5jb2RpbmcgLiAiJyBkb2VzIG5vdCBtYXRjaCBlbmNvZGluZyBmcm9tIFhNTCBkZWNsYXJhdGlvbiAnIiAuICR4bWxfZW5jb2RpbmcgLiAiJyI7CgkJCQkJCSR0aGlzLT5kZWJ1ZygkZXJyKTsKCQkJCQkJaWYgKCRlbmNvZGluZyAhPSAnSVNPLTg4NTktMScgfHwgc3RydG91cHBlcigkeG1sX2VuY29kaW5nKSAhPSAnVVRGLTgnKSB7CgkJCQkJCQkkdGhpcy0+c2V0RXJyb3IoJGVycik7CgkJCQkJCQlyZXR1cm47CgkJCQkJCX0KCQkJCQkJLy8gd2hlbiBIVFRQIHNheXMgSVNPLTg4NTktMSAodGhlIGRlZmF1bHQpIGFuZCBYTUwgc2F5cyBVVEYtOCAodGhlIHR5cGljYWwpLCBhc3N1bWUgdGhlIG90aGVyIGVuZHBvaW50IGlzIGp1c3Qgc2xvcHB5IGFuZCBwcm9jZWVkCgkJCQkJfSBlbHNlIHsKCQkJCQkJJHRoaXMtPmRlYnVnKCdDaGFyc2V0IGZyb20gSFRUUCBDb250ZW50LVR5cGUgbWF0Y2hlcyBlbmNvZGluZyBmcm9tIFhNTCBkZWNsYXJhdGlvbicpOwoJCQkJCX0KCQkJCX0gZWxzZSB7CgkJCQkJJHRoaXMtPmRlYnVnKCdObyBlbmNvZGluZyBzcGVjaWZpZWQgaW4gWE1MIGRlY2xhcmF0aW9uJyk7CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQkkdGhpcy0+ZGVidWcoJ05vIFhNTCBkZWNsYXJhdGlvbicpOwoJCQl9CgkJCSR0aGlzLT5kZWJ1ZygnRW50ZXJpbmcgc29hcF9wYXJzZXIoKSwgbGVuZ3RoPScuc3RybGVuKCR4bWwpLicsIGVuY29kaW5nPScuJGVuY29kaW5nKTsKCQkJLy8gQ3JlYXRlIGFuIFhNTCBwYXJzZXIgLSB3aHkgbm90IHhtbF9wYXJzZXJfY3JlYXRlX25zPwoJCQkkdGhpcy0+cGFyc2VyID0geG1sX3BhcnNlcl9jcmVhdGUoJHRoaXMtPnhtbF9lbmNvZGluZyk7CgkJCS8vIFNldCB0aGUgb3B0aW9ucyBmb3IgcGFyc2luZyB0aGUgWE1MIGRhdGEuCgkJCS8veG1sX3BhcnNlcl9zZXRfb3B0aW9uKCRwYXJzZXIsIFhNTF9PUFRJT05fU0tJUF9XSElURSwgMSk7CgkJCXhtbF9wYXJzZXJfc2V0X29wdGlvbigkdGhpcy0+cGFyc2VyLCBYTUxfT1BUSU9OX0NBU0VfRk9MRElORywgMCk7CgkJCXhtbF9wYXJzZXJfc2V0X29wdGlvbigkdGhpcy0+cGFyc2VyLCBYTUxfT1BUSU9OX1RBUkdFVF9FTkNPRElORywgJHRoaXMtPnhtbF9lbmNvZGluZyk7CgkJCS8vIFNldCB0aGUgb2JqZWN0IGZvciB0aGUgcGFyc2VyLgoJCQl4bWxfc2V0X29iamVjdCgkdGhpcy0+cGFyc2VyLCAkdGhpcyk7CgkJCS8vIFNldCB0aGUgZWxlbWVudCBoYW5kbGVycyBmb3IgdGhlIHBhcnNlci4KCQkJeG1sX3NldF9lbGVtZW50X2hhbmRsZXIoJHRoaXMtPnBhcnNlciwgJ3N0YXJ0X2VsZW1lbnQnLCdlbmRfZWxlbWVudCcpOwoJCQl4bWxfc2V0X2NoYXJhY3Rlcl9kYXRhX2hhbmRsZXIoJHRoaXMtPnBhcnNlciwnY2hhcmFjdGVyX2RhdGEnKTsKCgkJCS8vIFBhcnNlIHRoZSBYTUwgZmlsZS4KCQkJaWYoIXhtbF9wYXJzZSgkdGhpcy0+cGFyc2VyLCR4bWwsdHJ1ZSkpewoJCQkgICAgLy8gRGlzcGxheSBhbiBlcnJvciBtZXNzYWdlLgoJCQkgICAgJGVyciA9IHNwcmludGYoJ1hNTCBlcnJvciBwYXJzaW5nIFNPQVAgcGF5bG9hZCBvbiBsaW5lICVkOiAlcycsCgkJCSAgICB4bWxfZ2V0X2N1cnJlbnRfbGluZV9udW1iZXIoJHRoaXMtPnBhcnNlciksCgkJCSAgICB4bWxfZXJyb3Jfc3RyaW5nKHhtbF9nZXRfZXJyb3JfY29kZSgkdGhpcy0+cGFyc2VyKSkpOwoJCQkJJHRoaXMtPmRlYnVnKCRlcnIpOwoJCQkJJHRoaXMtPmRlYnVnKCJYTUwgcGF5bG9hZDpcbiIgLiAkeG1sKTsKCQkJCSR0aGlzLT5zZXRFcnJvcigkZXJyKTsKCQkJfSBlbHNlIHsKCQkJCSR0aGlzLT5kZWJ1ZygncGFyc2VkIHN1Y2Nlc3NmdWxseSwgZm91bmQgcm9vdCBzdHJ1Y3Q6ICcuJHRoaXMtPnJvb3Rfc3RydWN0Licgb2YgbmFtZSAnLiR0aGlzLT5yb290X3N0cnVjdF9uYW1lKTsKCQkJCS8vIGdldCBmaW5hbCB2YWx1ZQoJCQkJJHRoaXMtPnNvYXByZXNwb25zZSA9ICR0aGlzLT5tZXNzYWdlWyR0aGlzLT5yb290X3N0cnVjdF1bJ3Jlc3VsdCddOwoJCQkJLy8gZ2V0IGhlYWRlciB2YWx1ZTogbm8sIGJlY2F1c2UgdGhpcyBpcyBkb2N1bWVudGVkIGFzIFhNTCBzdHJpbmcKLy8JCQkJaWYoJHRoaXMtPnJvb3RfaGVhZGVyICE9ICcnICYmIGlzc2V0KCR0aGlzLT5tZXNzYWdlWyR0aGlzLT5yb290X2hlYWRlcl1bJ3Jlc3VsdCddKSl7Ci8vCQkJCQkkdGhpcy0+cmVzcG9uc2VIZWFkZXJzID0gJHRoaXMtPm1lc3NhZ2VbJHRoaXMtPnJvb3RfaGVhZGVyXVsncmVzdWx0J107Ci8vCQkJCX0KCQkJCS8vIHJlc29sdmUgaHJlZnMvaWRzCgkJCQlpZihzaXplb2YoJHRoaXMtPm11bHRpcmVmcykgPiAwKXsKCQkJCQlmb3JlYWNoKCR0aGlzLT5tdWx0aXJlZnMgYXMgJGlkID0+ICRocmVmcyl7CgkJCQkJCSR0aGlzLT5kZWJ1ZygncmVzb2x2aW5nIG11bHRpcmVmcyBmb3IgaWQ6ICcuJGlkKTsKCQkJCQkJJGlkVmFsID0gJHRoaXMtPmJ1aWxkVmFsKCR0aGlzLT5pZHNbJGlkXSk7CgkJCQkJCWlmIChpc19hcnJheSgkaWRWYWwpICYmIGlzc2V0KCRpZFZhbFsnIWlkJ10pKSB7CgkJCQkJCQl1bnNldCgkaWRWYWxbJyFpZCddKTsKCQkJCQkJfQoJCQkJCQlmb3JlYWNoKCRocmVmcyBhcyAkcmVmUG9zID0+ICRyZWYpewoJCQkJCQkJJHRoaXMtPmRlYnVnKCdyZXNvbHZpbmcgaHJlZiBhdCBwb3MgJy4kcmVmUG9zKTsKCQkJCQkJCSR0aGlzLT5tdWx0aXJlZnNbJGlkXVskcmVmUG9zXSA9ICRpZFZhbDsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoJCQl4bWxfcGFyc2VyX2ZyZWUoJHRoaXMtPnBhcnNlcik7CgkJfSBlbHNlIHsKCQkJJHRoaXMtPmRlYnVnKCd4bWwgd2FzIGVtcHR5LCBkaWRuXCd0IHBhcnNlIScpOwoJCQkkdGhpcy0+c2V0RXJyb3IoJ3htbCB3YXMgZW1wdHksIGRpZG5cJ3QgcGFyc2UhJyk7CgkJfQoJfQoKCS8qKgoJKiBzdGFydC1lbGVtZW50IGhhbmRsZXIKCSoKCSogQHBhcmFtICAgIHJlc291cmNlICRwYXJzZXIgWE1MIHBhcnNlciBvYmplY3QKCSogQHBhcmFtICAgIHN0cmluZyAkbmFtZSBlbGVtZW50IG5hbWUKCSogQHBhcmFtICAgIGFycmF5ICRhdHRycyBhc3NvY2lhdGl2ZSBhcnJheSBvZiBhdHRyaWJ1dGVzCgkqIEBhY2Nlc3MgICBwcml2YXRlCgkqLwoJZnVuY3Rpb24gc3RhcnRfZWxlbWVudCgkcGFyc2VyLCAkbmFtZSwgJGF0dHJzKSB7CgkJLy8gcG9zaXRpb24gaW4gYSB0b3RhbCBudW1iZXIgb2YgZWxlbWVudHMsIHN0YXJ0aW5nIGZyb20gMAoJCS8vIHVwZGF0ZSBjbGFzcyBsZXZlbCBwb3MKCQkkcG9zID0gJHRoaXMtPnBvc2l0aW9uKys7CgkJLy8gYW5kIHNldCBtaW5lCgkJJHRoaXMtPm1lc3NhZ2VbJHBvc10gPSBhcnJheSgncG9zJyA9PiAkcG9zLCdjaGlsZHJlbic9PicnLCdjZGF0YSc9PicnKTsKCQkvLyBkZXB0aCA9IGhvdyBtYW55IGxldmVscyByZW1vdmVkIGZyb20gcm9vdD8KCQkvLyBzZXQgbWluZSBhcyBjdXJyZW50IGdsb2JhbCBkZXB0aCBhbmQgaW5jcmVtZW50IGdsb2JhbCBkZXB0aCB2YWx1ZQoJCSR0aGlzLT5tZXNzYWdlWyRwb3NdWydkZXB0aCddID0gJHRoaXMtPmRlcHRoKys7CgoJCS8vIGVsc2UgYWRkIHNlbGYgYXMgY2hpbGQgdG8gd2hvZXZlciB0aGUgY3VycmVudCBwYXJlbnQgaXMKCQlpZigkcG9zICE9IDApewoJCQkkdGhpcy0+bWVzc2FnZVskdGhpcy0+cGFyZW50XVsnY2hpbGRyZW4nXSAuPSAnfCcuJHBvczsKCQl9CgkJLy8gc2V0IG15IHBhcmVudAoJCSR0aGlzLT5tZXNzYWdlWyRwb3NdWydwYXJlbnQnXSA9ICR0aGlzLT5wYXJlbnQ7CgkJLy8gc2V0IHNlbGYgYXMgY3VycmVudCBwYXJlbnQKCQkkdGhpcy0+cGFyZW50ID0gJHBvczsKCQkvLyBzZXQgc2VsZiBhcyBjdXJyZW50IHZhbHVlIGZvciB0aGlzIGRlcHRoCgkJJHRoaXMtPmRlcHRoX2FycmF5WyR0aGlzLT5kZXB0aF0gPSAkcG9zOwoJCS8vIGdldCBlbGVtZW50IHByZWZpeAoJCWlmKHN0cnBvcygkbmFtZSwnOicpKXsKCQkJLy8gZ2V0IG5zIHByZWZpeAoJCQkkcHJlZml4ID0gc3Vic3RyKCRuYW1lLDAsc3RycG9zKCRuYW1lLCc6JykpOwoJCQkvLyBnZXQgdW5xdWFsaWZpZWQgbmFtZQoJCQkkbmFtZSA9IHN1YnN0cihzdHJzdHIoJG5hbWUsJzonKSwxKTsKCQl9CgkJLy8gc2V0IHN0YXR1cwoJCWlmKCRuYW1lID09ICdFbnZlbG9wZScpewoJCQkkdGhpcy0+c3RhdHVzID0gJ2VudmVsb3BlJzsKCQl9IGVsc2VpZigkbmFtZSA9PSAnSGVhZGVyJyl7CgkJCSR0aGlzLT5yb290X2hlYWRlciA9ICRwb3M7CgkJCSR0aGlzLT5zdGF0dXMgPSAnaGVhZGVyJzsKCQl9IGVsc2VpZigkbmFtZSA9PSAnQm9keScpewoJCQkkdGhpcy0+c3RhdHVzID0gJ2JvZHknOwoJCQkkdGhpcy0+Ym9keV9wb3NpdGlvbiA9ICRwb3M7CgkJLy8gc2V0IG1ldGhvZAoJCX0gZWxzZWlmKCR0aGlzLT5zdGF0dXMgPT0gJ2JvZHknICYmICRwb3MgPT0gKCR0aGlzLT5ib2R5X3Bvc2l0aW9uKzEpKXsKCQkJJHRoaXMtPnN0YXR1cyA9ICdtZXRob2QnOwoJCQkkdGhpcy0+cm9vdF9zdHJ1Y3RfbmFtZSA9ICRuYW1lOwoJCQkkdGhpcy0+cm9vdF9zdHJ1Y3QgPSAkcG9zOwoJCQkkdGhpcy0+bWVzc2FnZVskcG9zXVsndHlwZSddID0gJ3N0cnVjdCc7CgkJCSR0aGlzLT5kZWJ1ZygiZm91bmQgcm9vdCBzdHJ1Y3QgJHRoaXMtPnJvb3Rfc3RydWN0X25hbWUsIHBvcyAkdGhpcy0+cm9vdF9zdHJ1Y3QiKTsKCQl9CgkJLy8gc2V0IG15IHN0YXR1cwoJCSR0aGlzLT5tZXNzYWdlWyRwb3NdWydzdGF0dXMnXSA9ICR0aGlzLT5zdGF0dXM7CgkJLy8gc2V0IG5hbWUKCQkkdGhpcy0+bWVzc2FnZVskcG9zXVsnbmFtZSddID0gaHRtbHNwZWNpYWxjaGFycygkbmFtZSk7CgkJLy8gc2V0IGF0dHJzCgkJJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ2F0dHJzJ10gPSAkYXR0cnM7CgoJCS8vIGxvb3AgdGhyb3VnaCBhdHRzLCBsb2dnaW5nIG5zIGFuZCB0eXBlIGRlY2xhcmF0aW9ucwogICAgICAgICRhdHRzdHIgPSAnJzsKCQlmb3JlYWNoKCRhdHRycyBhcyAka2V5ID0+ICR2YWx1ZSl7CiAgICAgICAgCSRrZXlfcHJlZml4ID0gJHRoaXMtPmdldFByZWZpeCgka2V5KTsKCQkJJGtleV9sb2NhbHBhcnQgPSAkdGhpcy0+Z2V0TG9jYWxQYXJ0KCRrZXkpOwoJCQkvLyBpZiBucyBkZWNsYXJhdGlvbnMsIGFkZCB0byBjbGFzcyBsZXZlbCBhcnJheSBvZiB2YWxpZCBuYW1lc3BhY2VzCiAgICAgICAgICAgIGlmKCRrZXlfcHJlZml4ID09ICd4bWxucycpewoJCQkJaWYoZXJlZygnXmh0dHA6Ly93d3cudzMub3JnL1swLTldezR9L1hNTFNjaGVtYSQnLCR2YWx1ZSkpewoJCQkJCSR0aGlzLT5YTUxTY2hlbWFWZXJzaW9uID0gJHZhbHVlOwoJCQkJCSR0aGlzLT5uYW1lc3BhY2VzWyd4c2QnXSA9ICR0aGlzLT5YTUxTY2hlbWFWZXJzaW9uOwoJCQkJCSR0aGlzLT5uYW1lc3BhY2VzWyd4c2knXSA9ICR0aGlzLT5YTUxTY2hlbWFWZXJzaW9uLictaW5zdGFuY2UnOwoJCQkJfQogICAgICAgICAgICAgICAgJHRoaXMtPm5hbWVzcGFjZXNbJGtleV9sb2NhbHBhcnRdID0gJHZhbHVlOwoJCQkJLy8gc2V0IG1ldGhvZCBuYW1lc3BhY2UKCQkJCWlmKCRuYW1lID09ICR0aGlzLT5yb290X3N0cnVjdF9uYW1lKXsKCQkJCQkkdGhpcy0+bWV0aG9kTmFtZXNwYWNlID0gJHZhbHVlOwoJCQkJfQoJCQkvLyBpZiBpdCdzIGEgdHlwZSBkZWNsYXJhdGlvbiwgc2V0IHR5cGUKICAgICAgICAgICAgfSBlbHNlaWYoJGtleV9sb2NhbHBhcnQgPT0gJ3R5cGUnKXsKICAgICAgICAgICAgCSR2YWx1ZV9wcmVmaXggPSAkdGhpcy0+Z2V0UHJlZml4KCR2YWx1ZSk7CiAgICAgICAgICAgICAgICAkdmFsdWVfbG9jYWxwYXJ0ID0gJHRoaXMtPmdldExvY2FsUGFydCgkdmFsdWUpOwoJCQkJJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ3R5cGUnXSA9ICR2YWx1ZV9sb2NhbHBhcnQ7CgkJCQkkdGhpcy0+bWVzc2FnZVskcG9zXVsndHlwZVByZWZpeCddID0gJHZhbHVlX3ByZWZpeDsKICAgICAgICAgICAgICAgIGlmKGlzc2V0KCR0aGlzLT5uYW1lc3BhY2VzWyR2YWx1ZV9wcmVmaXhdKSl7CiAgICAgICAgICAgICAgICAJJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ3R5cGVfbmFtZXNwYWNlJ10gPSAkdGhpcy0+bmFtZXNwYWNlc1skdmFsdWVfcHJlZml4XTsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZihpc3NldCgkYXR0cnNbJ3htbG5zOicuJHZhbHVlX3ByZWZpeF0pKSB7CgkJCQkJJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ3R5cGVfbmFtZXNwYWNlJ10gPSAkYXR0cnNbJ3htbG5zOicuJHZhbHVlX3ByZWZpeF07CiAgICAgICAgICAgICAgICB9CgkJCQkvLyBzaG91bGQgZG8gc29tZXRoaW5nIGhlcmUgd2l0aCB0aGUgbmFtZXNwYWNlIG9mIHNwZWNpZmllZCB0eXBlPwoJCQl9IGVsc2VpZigka2V5X2xvY2FscGFydCA9PSAnYXJyYXlUeXBlJyl7CgkJCQkkdGhpcy0+bWVzc2FnZVskcG9zXVsndHlwZSddID0gJ2FycmF5JzsKCQkJCS8qIGRvIGFycmF5VHlwZSBlcmVnIGhlcmUKCQkJCVsxXSAgICBhcnJheVR5cGVWYWx1ZSAgICA6Oj0gICAgYXR5cGUgYXNpemUKCQkJCVsyXSAgICBhdHlwZSAgICA6Oj0gICAgUU5hbWUgcmFuayoKCQkJCVszXSAgICByYW5rICAgIDo6PSAgICAnWycgKCcsJykqICddJwoJCQkJWzRdICAgIGFzaXplICAgIDo6PSAgICAnWycgbGVuZ3RofiAnXScKCQkJCVs1XSAgICBsZW5ndGggICAgOjo9ICAgIG5leHREaW1lbnNpb24qIERpZ2l0KwoJCQkJWzZdICAgIG5leHREaW1lbnNpb24gICAgOjo9ICAgIERpZ2l0KyAnLCcKCQkJCSovCgkJCQkkZXhwciA9ICcoW0EtWmEtejAtOV9dKyk6KFtBLVphLXpdK1tBLVphLXowLTlfXSspXFsoWzAtOV0rKSw/KFswLTldKilcXSc7CgkJCQlpZihlcmVnKCRleHByLCR2YWx1ZSwkcmVncykpewoJCQkJCSR0aGlzLT5tZXNzYWdlWyRwb3NdWyd0eXBlUHJlZml4J10gPSAkcmVnc1sxXTsKCQkJCQkkdGhpcy0+bWVzc2FnZVskcG9zXVsnYXJyYXlUeXBlUHJlZml4J10gPSAkcmVnc1sxXTsKCSAgICAgICAgICAgICAgICBpZiAoaXNzZXQoJHRoaXMtPm5hbWVzcGFjZXNbJHJlZ3NbMV1dKSkgewoJICAgICAgICAgICAgICAgIAkkdGhpcy0+bWVzc2FnZVskcG9zXVsnYXJyYXlUeXBlTmFtZXNwYWNlJ10gPSAkdGhpcy0+bmFtZXNwYWNlc1skcmVnc1sxXV07CgkgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc3NldCgkYXR0cnNbJ3htbG5zOicuJHJlZ3NbMV1dKSkgewoJCQkJCQkkdGhpcy0+bWVzc2FnZVskcG9zXVsnYXJyYXlUeXBlTmFtZXNwYWNlJ10gPSAkYXR0cnNbJ3htbG5zOicuJHJlZ3NbMV1dOwoJICAgICAgICAgICAgICAgIH0KCQkJCQkkdGhpcy0+bWVzc2FnZVskcG9zXVsnYXJyYXlUeXBlJ10gPSAkcmVnc1syXTsKCQkJCQkkdGhpcy0+bWVzc2FnZVskcG9zXVsnYXJyYXlTaXplJ10gPSAkcmVnc1szXTsKCQkJCQkkdGhpcy0+bWVzc2FnZVskcG9zXVsnYXJyYXlDb2xzJ10gPSAkcmVnc1s0XTsKCQkJCX0KCQkJLy8gc3BlY2lmaWVzIG5pbCB2YWx1ZSAob3Igbm90KQoJCQl9IGVsc2VpZiAoJGtleV9sb2NhbHBhcnQgPT0gJ25pbCcpewoJCQkJJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ25pbCddID0gKCR2YWx1ZSA9PSAndHJ1ZScgfHwgJHZhbHVlID09ICcxJyk7CgkJCS8vIHNvbWUgb3RoZXIgYXR0cmlidXRlCgkJCX0gZWxzZWlmICgka2V5ICE9ICdocmVmJyAmJiAka2V5ICE9ICd4bWxucycgJiYgJGtleV9sb2NhbHBhcnQgIT0gJ2VuY29kaW5nU3R5bGUnICYmICRrZXlfbG9jYWxwYXJ0ICE9ICdyb290JykgewoJCQkJJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ3hhdHRycyddWychJyAuICRrZXldID0gJHZhbHVlOwoJCQl9CgoJCQlpZiAoJGtleSA9PSAneG1sbnMnKSB7CgkJCQkkdGhpcy0+ZGVmYXVsdF9uYW1lc3BhY2UgPSAkdmFsdWU7CgkJCX0KCQkJLy8gbG9nIGlkCgkJCWlmKCRrZXkgPT0gJ2lkJyl7CgkJCQkkdGhpcy0+aWRzWyR2YWx1ZV0gPSAkcG9zOwoJCQl9CgkJCS8vIHJvb3QKCQkJaWYoJGtleV9sb2NhbHBhcnQgPT0gJ3Jvb3QnICYmICR2YWx1ZSA9PSAxKXsKCQkJCSR0aGlzLT5zdGF0dXMgPSAnbWV0aG9kJzsKCQkJCSR0aGlzLT5yb290X3N0cnVjdF9uYW1lID0gJG5hbWU7CgkJCQkkdGhpcy0+cm9vdF9zdHJ1Y3QgPSAkcG9zOwoJCQkJJHRoaXMtPmRlYnVnKCJmb3VuZCByb290IHN0cnVjdCAkdGhpcy0+cm9vdF9zdHJ1Y3RfbmFtZSwgcG9zICRwb3MiKTsKCQkJfQogICAgICAgICAgICAvLyBmb3IgZG9jbGl0CiAgICAgICAgICAgICRhdHRzdHIgLj0gIiAka2V5PVwiJHZhbHVlXCIiOwoJCX0KICAgICAgICAvLyBnZXQgbmFtZXNwYWNlIC0gbXVzdCBiZSBkb25lIGFmdGVyIG5hbWVzcGFjZSBhdHRzIGFyZSBwcm9jZXNzZWQKCQlpZihpc3NldCgkcHJlZml4KSl7CgkJCSR0aGlzLT5tZXNzYWdlWyRwb3NdWyduYW1lc3BhY2UnXSA9ICR0aGlzLT5uYW1lc3BhY2VzWyRwcmVmaXhdOwoJCQkkdGhpcy0+ZGVmYXVsdF9uYW1lc3BhY2UgPSAkdGhpcy0+bmFtZXNwYWNlc1skcHJlZml4XTsKCQl9IGVsc2UgewoJCQkkdGhpcy0+bWVzc2FnZVskcG9zXVsnbmFtZXNwYWNlJ10gPSAkdGhpcy0+ZGVmYXVsdF9uYW1lc3BhY2U7CgkJfQogICAgICAgIGlmKCR0aGlzLT5zdGF0dXMgPT0gJ2hlYWRlcicpewogICAgICAgIAlpZiAoJHRoaXMtPnJvb3RfaGVhZGVyICE9ICRwb3MpIHsKCSAgICAgICAgCSR0aGlzLT5yZXNwb25zZUhlYWRlcnMgLj0gIjwiIC4gKGlzc2V0KCRwcmVmaXgpID8gJHByZWZpeCAuICc6JyA6ICcnKSAuICIkbmFtZSRhdHRzdHI+IjsKCSAgICAgICAgfQogICAgICAgIH0gZWxzZWlmKCR0aGlzLT5yb290X3N0cnVjdF9uYW1lICE9ICcnKXsKICAgICAgICAJJHRoaXMtPmRvY3VtZW50IC49ICI8IiAuIChpc3NldCgkcHJlZml4KSA/ICRwcmVmaXggLiAnOicgOiAnJykgLiAiJG5hbWUkYXR0c3RyPiI7CiAgICAgICAgfQoJfQoKCS8qKgoJKiBlbmQtZWxlbWVudCBoYW5kbGVyCgkqCgkqIEBwYXJhbSAgICByZXNvdXJjZSAkcGFyc2VyIFhNTCBwYXJzZXIgb2JqZWN0CgkqIEBwYXJhbSAgICBzdHJpbmcgJG5hbWUgZWxlbWVudCBuYW1lCgkqIEBhY2Nlc3MgICBwcml2YXRlCgkqLwoJZnVuY3Rpb24gZW5kX2VsZW1lbnQoJHBhcnNlciwgJG5hbWUpIHsKCQkvLyBwb3NpdGlvbiBvZiBjdXJyZW50IGVsZW1lbnQgaXMgZXF1YWwgdG8gdGhlIGxhc3QgdmFsdWUgbGVmdCBpbiBkZXB0aF9hcnJheSBmb3IgbXkgZGVwdGgKCQkkcG9zID0gJHRoaXMtPmRlcHRoX2FycmF5WyR0aGlzLT5kZXB0aC0tXTsKCiAgICAgICAgLy8gZ2V0IGVsZW1lbnQgcHJlZml4CgkJaWYoc3RycG9zKCRuYW1lLCc6JykpewoJCQkvLyBnZXQgbnMgcHJlZml4CgkJCSRwcmVmaXggPSBzdWJzdHIoJG5hbWUsMCxzdHJwb3MoJG5hbWUsJzonKSk7CgkJCS8vIGdldCB1bnF1YWxpZmllZCBuYW1lCgkJCSRuYW1lID0gc3Vic3RyKHN0cnN0cigkbmFtZSwnOicpLDEpOwoJCX0KCQkKCQkvLyBidWlsZCB0byBuYXRpdmUgdHlwZQoJCWlmKGlzc2V0KCR0aGlzLT5ib2R5X3Bvc2l0aW9uKSAmJiAkcG9zID4gJHRoaXMtPmJvZHlfcG9zaXRpb24pewoJCQkvLyBkZWFsIHcvIG11bHRpcmVmcwoJCQlpZihpc3NldCgkdGhpcy0+bWVzc2FnZVskcG9zXVsnYXR0cnMnXVsnaHJlZiddKSl7CgkJCQkvLyBnZXQgaWQKCQkJCSRpZCA9IHN1YnN0cigkdGhpcy0+bWVzc2FnZVskcG9zXVsnYXR0cnMnXVsnaHJlZiddLDEpOwoJCQkJLy8gYWRkIHBsYWNlaG9sZGVyIHRvIGhyZWYgYXJyYXkKCQkJCSR0aGlzLT5tdWx0aXJlZnNbJGlkXVskcG9zXSA9ICdwbGFjZWhvbGRlcic7CgkJCQkvLyBhZGQgc2V0IGEgcmVmZXJlbmNlIHRvIGl0IGFzIHRoZSByZXN1bHQgdmFsdWUKCQkJCSR0aGlzLT5tZXNzYWdlWyRwb3NdWydyZXN1bHQnXSA9JiAkdGhpcy0+bXVsdGlyZWZzWyRpZF1bJHBvc107CiAgICAgICAgICAgIC8vIGJ1aWxkIGNvbXBsZXhUeXBlIHZhbHVlcwoJCQl9IGVsc2VpZigkdGhpcy0+bWVzc2FnZVskcG9zXVsnY2hpbGRyZW4nXSAhPSAnJyl7CgkJCQkvLyBpZiByZXN1bHQgaGFzIGFscmVhZHkgYmVlbiBnZW5lcmF0ZWQgKHN0cnVjdC9hcnJheSkKCQkJCWlmKCFpc3NldCgkdGhpcy0+bWVzc2FnZVskcG9zXVsncmVzdWx0J10pKXsKCQkJCQkkdGhpcy0+bWVzc2FnZVskcG9zXVsncmVzdWx0J10gPSAkdGhpcy0+YnVpbGRWYWwoJHBvcyk7CgkJCQl9CgkJCS8vIGJ1aWxkIGNvbXBsZXhUeXBlIHZhbHVlcyBvZiBhdHRyaWJ1dGVzIGFuZCBwb3NzaWJseSBzaW1wbGVDb250ZW50CgkJCX0gZWxzZWlmIChpc3NldCgkdGhpcy0+bWVzc2FnZVskcG9zXVsneGF0dHJzJ10pKSB7CgkJCQlpZiAoaXNzZXQoJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ25pbCddKSAmJiAkdGhpcy0+bWVzc2FnZVskcG9zXVsnbmlsJ10pIHsKCQkJCQkkdGhpcy0+bWVzc2FnZVskcG9zXVsneGF0dHJzJ11bJyEnXSA9IG51bGw7CgkJCQl9IGVsc2VpZiAoaXNzZXQoJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ2NkYXRhJ10pICYmIHRyaW0oJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ2NkYXRhJ10pICE9ICcnKSB7CgkgICAgICAgICAgICAJaWYgKGlzc2V0KCR0aGlzLT5tZXNzYWdlWyRwb3NdWyd0eXBlJ10pKSB7CgkJCQkJCSR0aGlzLT5tZXNzYWdlWyRwb3NdWyd4YXR0cnMnXVsnISddID0gJHRoaXMtPmRlY29kZVNpbXBsZSgkdGhpcy0+bWVzc2FnZVskcG9zXVsnY2RhdGEnXSwgJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ3R5cGUnXSwgaXNzZXQoJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ3R5cGVfbmFtZXNwYWNlJ10pID8gJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ3R5cGVfbmFtZXNwYWNlJ10gOiAnJyk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJJHBhcmVudCA9ICR0aGlzLT5tZXNzYWdlWyRwb3NdWydwYXJlbnQnXTsKCQkJCQkJaWYgKGlzc2V0KCR0aGlzLT5tZXNzYWdlWyRwYXJlbnRdWyd0eXBlJ10pICYmICgkdGhpcy0+bWVzc2FnZVskcGFyZW50XVsndHlwZSddID09ICdhcnJheScpICYmIGlzc2V0KCR0aGlzLT5tZXNzYWdlWyRwYXJlbnRdWydhcnJheVR5cGUnXSkpIHsKCQkJCQkJCSR0aGlzLT5tZXNzYWdlWyRwb3NdWyd4YXR0cnMnXVsnISddID0gJHRoaXMtPmRlY29kZVNpbXBsZSgkdGhpcy0+bWVzc2FnZVskcG9zXVsnY2RhdGEnXSwgJHRoaXMtPm1lc3NhZ2VbJHBhcmVudF1bJ2FycmF5VHlwZSddLCBpc3NldCgkdGhpcy0+bWVzc2FnZVskcGFyZW50XVsnYXJyYXlUeXBlTmFtZXNwYWNlJ10pID8gJHRoaXMtPm1lc3NhZ2VbJHBhcmVudF1bJ2FycmF5VHlwZU5hbWVzcGFjZSddIDogJycpOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ3hhdHRycyddWychJ10gPSAkdGhpcy0+bWVzc2FnZVskcG9zXVsnY2RhdGEnXTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJCSR0aGlzLT5tZXNzYWdlWyRwb3NdWydyZXN1bHQnXSA9ICR0aGlzLT5tZXNzYWdlWyRwb3NdWyd4YXR0cnMnXTsKCQkJLy8gc2V0IHZhbHVlIG9mIHNpbXBsZVR5cGUgKG9yIG5pbCBjb21wbGV4VHlwZSkKCQkJfSBlbHNlIHsKICAgICAgICAgICAgCS8vJHRoaXMtPmRlYnVnKCdhZGRpbmcgZGF0YSBmb3Igc2NhbGFyIHZhbHVlICcuJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ25hbWUnXS4nIG9mIHZhbHVlICcuJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ2NkYXRhJ10pOwoJCQkJaWYgKGlzc2V0KCR0aGlzLT5tZXNzYWdlWyRwb3NdWyduaWwnXSkgJiYgJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ25pbCddKSB7CgkJCQkJJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ3hhdHRycyddWychJ10gPSBudWxsOwoJCQkJfSBlbHNlaWYgKGlzc2V0KCR0aGlzLT5tZXNzYWdlWyRwb3NdWyd0eXBlJ10pKSB7CgkJCQkJJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ3Jlc3VsdCddID0gJHRoaXMtPmRlY29kZVNpbXBsZSgkdGhpcy0+bWVzc2FnZVskcG9zXVsnY2RhdGEnXSwgJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ3R5cGUnXSwgaXNzZXQoJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ3R5cGVfbmFtZXNwYWNlJ10pID8gJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ3R5cGVfbmFtZXNwYWNlJ10gOiAnJyk7CgkJCQl9IGVsc2UgewoJCQkJCSRwYXJlbnQgPSAkdGhpcy0+bWVzc2FnZVskcG9zXVsncGFyZW50J107CgkJCQkJaWYgKGlzc2V0KCR0aGlzLT5tZXNzYWdlWyRwYXJlbnRdWyd0eXBlJ10pICYmICgkdGhpcy0+bWVzc2FnZVskcGFyZW50XVsndHlwZSddID09ICdhcnJheScpICYmIGlzc2V0KCR0aGlzLT5tZXNzYWdlWyRwYXJlbnRdWydhcnJheVR5cGUnXSkpIHsKCQkJCQkJJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ3Jlc3VsdCddID0gJHRoaXMtPmRlY29kZVNpbXBsZSgkdGhpcy0+bWVzc2FnZVskcG9zXVsnY2RhdGEnXSwgJHRoaXMtPm1lc3NhZ2VbJHBhcmVudF1bJ2FycmF5VHlwZSddLCBpc3NldCgkdGhpcy0+bWVzc2FnZVskcGFyZW50XVsnYXJyYXlUeXBlTmFtZXNwYWNlJ10pID8gJHRoaXMtPm1lc3NhZ2VbJHBhcmVudF1bJ2FycmF5VHlwZU5hbWVzcGFjZSddIDogJycpOwoJCQkJCX0gZWxzZSB7CgkJCQkJCSR0aGlzLT5tZXNzYWdlWyRwb3NdWydyZXN1bHQnXSA9ICR0aGlzLT5tZXNzYWdlWyRwb3NdWydjZGF0YSddOwoJCQkJCX0KCQkJCX0KCgkJCQkvKiBhZGQgdmFsdWUgdG8gcGFyZW50J3MgcmVzdWx0LCBpZiBwYXJlbnQgaXMgc3RydWN0L2FycmF5CgkJCQkkcGFyZW50ID0gJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ3BhcmVudCddOwoJCQkJaWYoJHRoaXMtPm1lc3NhZ2VbJHBhcmVudF1bJ3R5cGUnXSAhPSAnbWFwJyl7CgkJCQkJaWYoc3RydG9sb3dlcigkdGhpcy0+bWVzc2FnZVskcGFyZW50XVsndHlwZSddKSA9PSAnYXJyYXknKXsKCQkJCQkJJHRoaXMtPm1lc3NhZ2VbJHBhcmVudF1bJ3Jlc3VsdCddW10gPSAkdGhpcy0+bWVzc2FnZVskcG9zXVsncmVzdWx0J107CgkJCQkJfSBlbHNlIHsKCQkJCQkJJHRoaXMtPm1lc3NhZ2VbJHBhcmVudF1bJ3Jlc3VsdCddWyR0aGlzLT5tZXNzYWdlWyRwb3NdWyduYW1lJ11dID0gJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ3Jlc3VsdCddOwoJCQkJCX0KCQkJCX0KCQkJCSovCgkJCX0KCQl9CgkJCiAgICAgICAgLy8gZm9yIGRvY2xpdAogICAgICAgIGlmKCR0aGlzLT5zdGF0dXMgPT0gJ2hlYWRlcicpewogICAgICAgIAlpZiAoJHRoaXMtPnJvb3RfaGVhZGVyICE9ICRwb3MpIHsKCSAgICAgICAgCSR0aGlzLT5yZXNwb25zZUhlYWRlcnMgLj0gIjwvIiAuIChpc3NldCgkcHJlZml4KSA/ICRwcmVmaXggLiAnOicgOiAnJykgLiAiJG5hbWU+IjsKCSAgICAgICAgfQogICAgICAgIH0gZWxzZWlmKCRwb3MgPj0gJHRoaXMtPnJvb3Rfc3RydWN0KXsKICAgICAgICAJJHRoaXMtPmRvY3VtZW50IC49ICI8LyIgLiAoaXNzZXQoJHByZWZpeCkgPyAkcHJlZml4IC4gJzonIDogJycpIC4gIiRuYW1lPiI7CiAgICAgICAgfQoJCS8vIHN3aXRjaCBzdGF0dXMKCQlpZigkcG9zID09ICR0aGlzLT5yb290X3N0cnVjdCl7CgkJCSR0aGlzLT5zdGF0dXMgPSAnYm9keSc7CgkJCSR0aGlzLT5yb290X3N0cnVjdF9uYW1lc3BhY2UgPSAkdGhpcy0+bWVzc2FnZVskcG9zXVsnbmFtZXNwYWNlJ107CgkJfSBlbHNlaWYoJG5hbWUgPT0gJ0JvZHknKXsKCQkJJHRoaXMtPnN0YXR1cyA9ICdlbnZlbG9wZSc7CgkJIH0gZWxzZWlmKCRuYW1lID09ICdIZWFkZXInKXsKCQkJJHRoaXMtPnN0YXR1cyA9ICdlbnZlbG9wZSc7CgkJfSBlbHNlaWYoJG5hbWUgPT0gJ0VudmVsb3BlJyl7CgkJCS8vCgkJfQoJCS8vIHNldCBwYXJlbnQgYmFjayB0byBteSBwYXJlbnQKCQkkdGhpcy0+cGFyZW50ID0gJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ3BhcmVudCddOwoJfQoKCS8qKgoJKiBlbGVtZW50IGNvbnRlbnQgaGFuZGxlcgoJKgoJKiBAcGFyYW0gICAgcmVzb3VyY2UgJHBhcnNlciBYTUwgcGFyc2VyIG9iamVjdAoJKiBAcGFyYW0gICAgc3RyaW5nICRkYXRhIGVsZW1lbnQgY29udGVudAoJKiBAYWNjZXNzICAgcHJpdmF0ZQoJKi8KCWZ1bmN0aW9uIGNoYXJhY3Rlcl9kYXRhKCRwYXJzZXIsICRkYXRhKXsKCQkkcG9zID0gJHRoaXMtPmRlcHRoX2FycmF5WyR0aGlzLT5kZXB0aF07CgkJaWYgKCR0aGlzLT54bWxfZW5jb2Rpbmc9PSdVVEYtOCcpewoJCQkvLyBUT0RPOiBhZGQgYW4gb3B0aW9uIHRvIGRpc2FibGUgdGhpcyBmb3IgZm9sa3Mgd2hvIHdhbnQKCQkJLy8gcmF3IFVURi04IHRoYXQsIGUuZy4sIG1pZ2h0IG5vdCBtYXAgdG8gaXNvLTg4NTktMQoJCQkvLyBUT0RPOiB0aGlzIGNhbiBhbHNvIGJlIGhhbmRsZWQgd2l0aCB4bWxfcGFyc2VyX3NldF9vcHRpb24oJHRoaXMtPnBhcnNlciwgWE1MX09QVElPTl9UQVJHRVRfRU5DT0RJTkcsICJJU08tODg1OS0xIik7CgkJCWlmKCR0aGlzLT5kZWNvZGVfdXRmOCl7CgkJCQkkZGF0YSA9IHV0ZjhfZGVjb2RlKCRkYXRhKTsKCQkJfQoJCX0KICAgICAgICAkdGhpcy0+bWVzc2FnZVskcG9zXVsnY2RhdGEnXSAuPSAkZGF0YTsKICAgICAgICAvLyBmb3IgZG9jbGl0CiAgICAgICAgaWYoJHRoaXMtPnN0YXR1cyA9PSAnaGVhZGVyJyl7CiAgICAgICAgCSR0aGlzLT5yZXNwb25zZUhlYWRlcnMgLj0gJGRhdGE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAJJHRoaXMtPmRvY3VtZW50IC49ICRkYXRhOwogICAgICAgIH0KCX0KCgkvKioKCSogZ2V0IHRoZSBwYXJzZWQgbWVzc2FnZQoJKgoJKiBAcmV0dXJuCW1peGVkCgkqIEBhY2Nlc3MgICBwdWJsaWMKCSovCglmdW5jdGlvbiBnZXRfcmVzcG9uc2UoKXsKCQlyZXR1cm4gJHRoaXMtPnNvYXByZXNwb25zZTsKCX0KCgkvKioKCSogZ2V0IHRoZSBwYXJzZWQgaGVhZGVycwoJKgoJKiBAcmV0dXJuCXN0cmluZyBYTUwgb3IgZW1wdHkgaWYgbm8gaGVhZGVycwoJKiBAYWNjZXNzICAgcHVibGljCgkqLwoJZnVuY3Rpb24gZ2V0SGVhZGVycygpewoJICAgIHJldHVybiAkdGhpcy0+cmVzcG9uc2VIZWFkZXJzOwoJfQoKCS8qKgoJKiBkZWNvZGVzIHNpbXBsZSB0eXBlcyBpbnRvIFBIUCB2YXJpYWJsZXMKCSoKCSogQHBhcmFtICAgIHN0cmluZyAkdmFsdWUgdmFsdWUgdG8gZGVjb2RlCgkqIEBwYXJhbSAgICBzdHJpbmcgJHR5cGUgWE1MIHR5cGUgdG8gZGVjb2RlCgkqIEBwYXJhbSAgICBzdHJpbmcgJHR5cGVucyBYTUwgdHlwZSBuYW1lc3BhY2UgdG8gZGVjb2RlCgkqIEByZXR1cm4JbWl4ZWQgUEhQIHZhbHVlCgkqIEBhY2Nlc3MgICBwcml2YXRlCgkqLwoJZnVuY3Rpb24gZGVjb2RlU2ltcGxlKCR2YWx1ZSwgJHR5cGUsICR0eXBlbnMpIHsKCQkvLyBUT0RPOiB1c2UgdGhlIG5hbWVzcGFjZSEKCQlpZiAoKCFpc3NldCgkdHlwZSkpIHx8ICR0eXBlID09ICdzdHJpbmcnIHx8ICR0eXBlID09ICdsb25nJyB8fCAkdHlwZSA9PSAndW5zaWduZWRMb25nJykgewoJCQlyZXR1cm4gKHN0cmluZykgJHZhbHVlOwoJCX0KCQlpZiAoJHR5cGUgPT0gJ2ludCcgfHwgJHR5cGUgPT0gJ2ludGVnZXInIHx8ICR0eXBlID09ICdzaG9ydCcgfHwgJHR5cGUgPT0gJ2J5dGUnKSB7CgkJCXJldHVybiAoaW50KSAkdmFsdWU7CgkJfQoJCWlmICgkdHlwZSA9PSAnZmxvYXQnIHx8ICR0eXBlID09ICdkb3VibGUnIHx8ICR0eXBlID09ICdkZWNpbWFsJykgewoJCQlyZXR1cm4gKGRvdWJsZSkgJHZhbHVlOwoJCX0KCQlpZiAoJHR5cGUgPT0gJ2Jvb2xlYW4nKSB7CgkJCWlmIChzdHJ0b2xvd2VyKCR2YWx1ZSkgPT0gJ2ZhbHNlJyB8fCBzdHJ0b2xvd2VyKCR2YWx1ZSkgPT0gJ2YnKSB7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQkJcmV0dXJuIChib29sZWFuKSAkdmFsdWU7CgkJfQoJCWlmICgkdHlwZSA9PSAnYmFzZTY0JyB8fCAkdHlwZSA9PSAnYmFzZTY0QmluYXJ5JykgewoJCQkkdGhpcy0+ZGVidWcoJ0RlY29kZSBiYXNlNjQgdmFsdWUnKTsKCQkJcmV0dXJuIGJhc2U2NF9kZWNvZGUoJHZhbHVlKTsKCQl9CgkJLy8gb2JzY3VyZSBudW1lcmljIHR5cGVzCgkJaWYgKCR0eXBlID09ICdub25Qb3NpdGl2ZUludGVnZXInIHx8ICR0eXBlID09ICduZWdhdGl2ZUludGVnZXInCgkJCXx8ICR0eXBlID09ICdub25OZWdhdGl2ZUludGVnZXInIHx8ICR0eXBlID09ICdwb3NpdGl2ZUludGVnZXInCgkJCXx8ICR0eXBlID09ICd1bnNpZ25lZEludCcKCQkJfHwgJHR5cGUgPT0gJ3Vuc2lnbmVkU2hvcnQnIHx8ICR0eXBlID09ICd1bnNpZ25lZEJ5dGUnKSB7CgkJCXJldHVybiAoaW50KSAkdmFsdWU7CgkJfQoJCS8vIGJvZ3VzOiBwYXJzZXIgdHJlYXRzIGFycmF5IHdpdGggbm8gZWxlbWVudHMgYXMgYSBzaW1wbGUgdHlwZQoJCWlmICgkdHlwZSA9PSAnYXJyYXknKSB7CgkJCXJldHVybiBhcnJheSgpOwoJCX0KCQkvLyBldmVyeXRoaW5nIGVsc2UKCQlyZXR1cm4gKHN0cmluZykgJHZhbHVlOwoJfQoKCS8qKgoJKiBidWlsZHMgcmVzcG9uc2Ugc3RydWN0dXJlcyBmb3IgY29tcG91bmQgdmFsdWVzIChhcnJheXMvc3RydWN0cykKCSogYW5kIHNjYWxhcnMKCSoKCSogQHBhcmFtICAgIGludGVnZXIgJHBvcyBwb3NpdGlvbiBpbiBub2RlIHRyZWUKCSogQHJldHVybgltaXhlZAlQSFAgdmFsdWUKCSogQGFjY2VzcyAgIHByaXZhdGUKCSovCglmdW5jdGlvbiBidWlsZFZhbCgkcG9zKXsKCQlpZighaXNzZXQoJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ3R5cGUnXSkpewoJCQkkdGhpcy0+bWVzc2FnZVskcG9zXVsndHlwZSddID0gJyc7CgkJfQoJCSR0aGlzLT5kZWJ1ZygnaW4gYnVpbGRWYWwoKSBmb3IgJy4kdGhpcy0+bWVzc2FnZVskcG9zXVsnbmFtZSddLiIocG9zICRwb3MpIG9mIHR5cGUgIi4kdGhpcy0+bWVzc2FnZVskcG9zXVsndHlwZSddKTsKCQkvLyBpZiB0aGVyZSBhcmUgY2hpbGRyZW4uLi4KCQlpZigkdGhpcy0+bWVzc2FnZVskcG9zXVsnY2hpbGRyZW4nXSAhPSAnJyl7CgkJCSR0aGlzLT5kZWJ1ZygnaW4gYnVpbGRWYWwsIHRoZXJlIGFyZSBjaGlsZHJlbicpOwoJCQkkY2hpbGRyZW4gPSBleHBsb2RlKCd8JywkdGhpcy0+bWVzc2FnZVskcG9zXVsnY2hpbGRyZW4nXSk7CgkJCWFycmF5X3NoaWZ0KCRjaGlsZHJlbik7IC8vIGtub2NrIG9mZiBlbXB0eQoJCQkvLyBtZCBhcnJheQoJCQlpZihpc3NldCgkdGhpcy0+bWVzc2FnZVskcG9zXVsnYXJyYXlDb2xzJ10pICYmICR0aGlzLT5tZXNzYWdlWyRwb3NdWydhcnJheUNvbHMnXSAhPSAnJyl7CiAgICAgICAgICAgIAkkcj0wOyAvLyByb3djb3VudAogICAgICAgICAgICAJJGM9MDsgLy8gY29sY291bnQKICAgICAgICAgICAgCWZvcmVhY2goJGNoaWxkcmVuIGFzICRjaGlsZF9wb3MpewoJCQkJCSR0aGlzLT5kZWJ1ZygiaW4gYnVpbGRWYWwsIGdvdCBhbiBNRCBhcnJheSBlbGVtZW50OiAkciwgJGMiKTsKCQkJCQkkcGFyYW1zWyRyXVtdID0gJHRoaXMtPm1lc3NhZ2VbJGNoaWxkX3Bvc11bJ3Jlc3VsdCddOwoJCQkJICAgICRjKys7CgkJCQkgICAgaWYoJGMgPT0gJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ2FycmF5Q29scyddKXsKCQkJCSAgICAJJGMgPSAwOwoJCQkJCQkkcisrOwoJCQkJICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gYXJyYXkKCQkJfSBlbHNlaWYoJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ3R5cGUnXSA9PSAnYXJyYXknIHx8ICR0aGlzLT5tZXNzYWdlWyRwb3NdWyd0eXBlJ10gPT0gJ0FycmF5Jyl7CiAgICAgICAgICAgICAgICAkdGhpcy0+ZGVidWcoJ2luIGJ1aWxkVmFsLCBhZGRpbmcgYXJyYXkgJy4kdGhpcy0+bWVzc2FnZVskcG9zXVsnbmFtZSddKTsKICAgICAgICAgICAgICAgIGZvcmVhY2goJGNoaWxkcmVuIGFzICRjaGlsZF9wb3MpewogICAgICAgICAgICAgICAgCSRwYXJhbXNbXSA9ICYkdGhpcy0+bWVzc2FnZVskY2hpbGRfcG9zXVsncmVzdWx0J107CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIGFwYWNoZSBNYXAgdHlwZTogamF2YSBoYXNodGFibGUKICAgICAgICAgICAgfSBlbHNlaWYoJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ3R5cGUnXSA9PSAnTWFwJyAmJiAkdGhpcy0+bWVzc2FnZVskcG9zXVsndHlwZV9uYW1lc3BhY2UnXSA9PSAnaHR0cDovL3htbC5hcGFjaGUub3JnL3htbC1zb2FwJyl7CiAgICAgICAgICAgICAgICAkdGhpcy0+ZGVidWcoJ2luIGJ1aWxkVmFsLCBKYXZhIE1hcCAnLiR0aGlzLT5tZXNzYWdlWyRwb3NdWyduYW1lJ10pOwogICAgICAgICAgICAgICAgZm9yZWFjaCgkY2hpbGRyZW4gYXMgJGNoaWxkX3Bvcyl7CiAgICAgICAgICAgICAgICAJJGt2ID0gZXhwbG9kZSgifCIsJHRoaXMtPm1lc3NhZ2VbJGNoaWxkX3Bvc11bJ2NoaWxkcmVuJ10pOwogICAgICAgICAgICAgICAgICAgCSRwYXJhbXNbJHRoaXMtPm1lc3NhZ2VbJGt2WzFdXVsncmVzdWx0J11dID0gJiR0aGlzLT5tZXNzYWdlWyRrdlsyXV1bJ3Jlc3VsdCddOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBnZW5lcmljIGNvbXBvdW5kIHR5cGUKICAgICAgICAgICAgLy99IGVsc2VpZigkdGhpcy0+bWVzc2FnZVskcG9zXVsndHlwZSddID09ICdTT0FQU3RydWN0JyB8fCAkdGhpcy0+bWVzc2FnZVskcG9zXVsndHlwZSddID09ICdzdHJ1Y3QnKSB7CgkJICAgIH0gZWxzZSB7CgkgICAgCQkvLyBBcGFjaGUgVmVjdG9yIHR5cGU6IHRyZWF0IGFzIGFuIGFycmF5CiAgICAgICAgICAgICAgICAkdGhpcy0+ZGVidWcoJ2luIGJ1aWxkVmFsLCBhZGRpbmcgSmF2YSBWZWN0b3IgJy4kdGhpcy0+bWVzc2FnZVskcG9zXVsnbmFtZSddKTsKCQkJCWlmICgkdGhpcy0+bWVzc2FnZVskcG9zXVsndHlwZSddID09ICdWZWN0b3InICYmICR0aGlzLT5tZXNzYWdlWyRwb3NdWyd0eXBlX25hbWVzcGFjZSddID09ICdodHRwOi8veG1sLmFwYWNoZS5vcmcveG1sLXNvYXAnKSB7CgkJCQkJJG5vdHN0cnVjdCA9IDE7CgkJCQl9IGVsc2UgewoJCQkJCSRub3RzdHJ1Y3QgPSAwOwoJICAgICAgICAgICAgfQogICAgICAgICAgICAJLy8KICAgICAgICAgICAgCWZvcmVhY2goJGNoaWxkcmVuIGFzICRjaGlsZF9wb3MpewogICAgICAgICAgICAJCWlmKCRub3RzdHJ1Y3QpewogICAgICAgICAgICAJCQkkcGFyYW1zW10gPSAmJHRoaXMtPm1lc3NhZ2VbJGNoaWxkX3Bvc11bJ3Jlc3VsdCddOwogICAgICAgICAgICAJCX0gZWxzZSB7CiAgICAgICAgICAgIAkJCWlmIChpc3NldCgkcGFyYW1zWyR0aGlzLT5tZXNzYWdlWyRjaGlsZF9wb3NdWyduYW1lJ11dKSkgewogICAgICAgICAgICAJCQkJLy8gZGUtc2VyaWFsaXplIHJlcGVhdGVkIGVsZW1lbnQgbmFtZSBpbnRvIGFuIGFycmF5CiAgICAgICAgICAgIAkJCQlpZiAoKCFpc19hcnJheSgkcGFyYW1zWyR0aGlzLT5tZXNzYWdlWyRjaGlsZF9wb3NdWyduYW1lJ11dKSkgfHwgKCFpc3NldCgkcGFyYW1zWyR0aGlzLT5tZXNzYWdlWyRjaGlsZF9wb3NdWyduYW1lJ11dWzBdKSkpIHsKICAgICAgICAgICAgCQkJCQkkcGFyYW1zWyR0aGlzLT5tZXNzYWdlWyRjaGlsZF9wb3NdWyduYW1lJ11dID0gYXJyYXkoJHBhcmFtc1skdGhpcy0+bWVzc2FnZVskY2hpbGRfcG9zXVsnbmFtZSddXSk7CiAgICAgICAgICAgIAkJCQl9CiAgICAgICAgICAgIAkJCQkkcGFyYW1zWyR0aGlzLT5tZXNzYWdlWyRjaGlsZF9wb3NdWyduYW1lJ11dW10gPSAmJHRoaXMtPm1lc3NhZ2VbJGNoaWxkX3Bvc11bJ3Jlc3VsdCddOwogICAgICAgICAgICAJCQl9IGVsc2UgewoJCQkJCSAgICAJJHBhcmFtc1skdGhpcy0+bWVzc2FnZVskY2hpbGRfcG9zXVsnbmFtZSddXSA9ICYkdGhpcy0+bWVzc2FnZVskY2hpbGRfcG9zXVsncmVzdWx0J107CgkJCQkJICAgIH0KICAgICAgICAgICAgICAgIAl9CiAgICAgICAgICAgICAgICB9CgkJCX0KCQkJaWYgKGlzc2V0KCR0aGlzLT5tZXNzYWdlWyRwb3NdWyd4YXR0cnMnXSkpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5kZWJ1ZygnaW4gYnVpbGRWYWwsIGhhbmRsaW5nIGF0dHJpYnV0ZXMnKTsKCQkJCWZvcmVhY2ggKCR0aGlzLT5tZXNzYWdlWyRwb3NdWyd4YXR0cnMnXSBhcyAkbiA9PiAkdikgewoJCQkJCSRwYXJhbXNbJG5dID0gJHY7CgkJCQl9CgkJCX0KCQkJLy8gaGFuZGxlIHNpbXBsZUNvbnRlbnQKCQkJaWYgKGlzc2V0KCR0aGlzLT5tZXNzYWdlWyRwb3NdWydjZGF0YSddKSAmJiB0cmltKCR0aGlzLT5tZXNzYWdlWyRwb3NdWydjZGF0YSddKSAhPSAnJykgewogICAgICAgICAgICAgICAgJHRoaXMtPmRlYnVnKCdpbiBidWlsZFZhbCwgaGFuZGxpbmcgc2ltcGxlQ29udGVudCcpOwogICAgICAgICAgICAJaWYgKGlzc2V0KCR0aGlzLT5tZXNzYWdlWyRwb3NdWyd0eXBlJ10pKSB7CgkJCQkJJHBhcmFtc1snISddID0gJHRoaXMtPmRlY29kZVNpbXBsZSgkdGhpcy0+bWVzc2FnZVskcG9zXVsnY2RhdGEnXSwgJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ3R5cGUnXSwgaXNzZXQoJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ3R5cGVfbmFtZXNwYWNlJ10pID8gJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ3R5cGVfbmFtZXNwYWNlJ10gOiAnJyk7CgkJCQl9IGVsc2UgewoJCQkJCSRwYXJlbnQgPSAkdGhpcy0+bWVzc2FnZVskcG9zXVsncGFyZW50J107CgkJCQkJaWYgKGlzc2V0KCR0aGlzLT5tZXNzYWdlWyRwYXJlbnRdWyd0eXBlJ10pICYmICgkdGhpcy0+bWVzc2FnZVskcGFyZW50XVsndHlwZSddID09ICdhcnJheScpICYmIGlzc2V0KCR0aGlzLT5tZXNzYWdlWyRwYXJlbnRdWydhcnJheVR5cGUnXSkpIHsKCQkJCQkJJHBhcmFtc1snISddID0gJHRoaXMtPmRlY29kZVNpbXBsZSgkdGhpcy0+bWVzc2FnZVskcG9zXVsnY2RhdGEnXSwgJHRoaXMtPm1lc3NhZ2VbJHBhcmVudF1bJ2FycmF5VHlwZSddLCBpc3NldCgkdGhpcy0+bWVzc2FnZVskcGFyZW50XVsnYXJyYXlUeXBlTmFtZXNwYWNlJ10pID8gJHRoaXMtPm1lc3NhZ2VbJHBhcmVudF1bJ2FycmF5VHlwZU5hbWVzcGFjZSddIDogJycpOwoJCQkJCX0gZWxzZSB7CgkJCQkJCSRwYXJhbXNbJyEnXSA9ICR0aGlzLT5tZXNzYWdlWyRwb3NdWydjZGF0YSddOwoJCQkJCX0KCQkJCX0KCQkJfQoJCQlyZXR1cm4gaXNfYXJyYXkoJHBhcmFtcykgPyAkcGFyYW1zIDogYXJyYXkoKTsKCQl9IGVsc2UgewogICAgICAgIAkkdGhpcy0+ZGVidWcoJ2luIGJ1aWxkVmFsLCBubyBjaGlsZHJlbiwgYnVpbGRpbmcgc2NhbGFyJyk7CgkJCSRjZGF0YSA9IGlzc2V0KCR0aGlzLT5tZXNzYWdlWyRwb3NdWydjZGF0YSddKSA/ICR0aGlzLT5tZXNzYWdlWyRwb3NdWydjZGF0YSddIDogJyc7CiAgICAgICAgCWlmIChpc3NldCgkdGhpcy0+bWVzc2FnZVskcG9zXVsndHlwZSddKSkgewoJCQkJcmV0dXJuICR0aGlzLT5kZWNvZGVTaW1wbGUoJGNkYXRhLCAkdGhpcy0+bWVzc2FnZVskcG9zXVsndHlwZSddLCBpc3NldCgkdGhpcy0+bWVzc2FnZVskcG9zXVsndHlwZV9uYW1lc3BhY2UnXSkgPyAkdGhpcy0+bWVzc2FnZVskcG9zXVsndHlwZV9uYW1lc3BhY2UnXSA6ICcnKTsKCQkJfQoJCQkkcGFyZW50ID0gJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ3BhcmVudCddOwoJCQlpZiAoaXNzZXQoJHRoaXMtPm1lc3NhZ2VbJHBhcmVudF1bJ3R5cGUnXSkgJiYgKCR0aGlzLT5tZXNzYWdlWyRwYXJlbnRdWyd0eXBlJ10gPT0gJ2FycmF5JykgJiYgaXNzZXQoJHRoaXMtPm1lc3NhZ2VbJHBhcmVudF1bJ2FycmF5VHlwZSddKSkgewoJCQkJcmV0dXJuICR0aGlzLT5kZWNvZGVTaW1wbGUoJGNkYXRhLCAkdGhpcy0+bWVzc2FnZVskcGFyZW50XVsnYXJyYXlUeXBlJ10sIGlzc2V0KCR0aGlzLT5tZXNzYWdlWyRwYXJlbnRdWydhcnJheVR5cGVOYW1lc3BhY2UnXSkgPyAkdGhpcy0+bWVzc2FnZVskcGFyZW50XVsnYXJyYXlUeXBlTmFtZXNwYWNlJ10gOiAnJyk7CgkJCX0KICAgICAgICAgICAJcmV0dXJuICR0aGlzLT5tZXNzYWdlWyRwb3NdWydjZGF0YSddOwoJCX0KCX0KfQoKCgoKPz4=]]></data>
  </file>
  <file>
    <filename>classes/class.soap_server.php</filename>
    <isdir>0</isdir>
    <data><![CDATA[PD9waHAKCgoKCi8qKgoqCiogc29hcF9zZXJ2ZXIgYWxsb3dzIHRoZSB1c2VyIHRvIGNyZWF0ZSBhIFNPQVAgc2VydmVyCiogdGhhdCBpcyBjYXBhYmxlIG9mIHJlY2VpdmluZyBtZXNzYWdlcyBhbmQgcmV0dXJuaW5nIHJlc3BvbnNlcwoqCiogTk9URTogV1NETCBmdW5jdGlvbmFsaXR5IGlzIGV4cGVyaW1lbnRhbAoqCiogQGF1dGhvciAgIERpZXRyaWNoIEF5YWxhIDxkaWV0cmljaEBnYW54NC5jb20+CiogQHZlcnNpb24gICRJZDogY2xhc3Muc29hcF9zZXJ2ZXIucGhwLHYgMS40OCAyMDA1LzA4LzA0IDAxOjI3OjQyIHNuaWNob2wgRXhwICQKKiBAYWNjZXNzICAgcHVibGljCiovCmNsYXNzIHNvYXBfc2VydmVyIGV4dGVuZHMgbnVzb2FwX2Jhc2UgewoJLyoqCgkgKiBIVFRQIGhlYWRlcnMgb2YgcmVxdWVzdAoJICogQHZhciBhcnJheQoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCXZhciAkaGVhZGVycyA9IGFycmF5KCk7CgkvKioKCSAqIEhUVFAgcmVxdWVzdAoJICogQHZhciBzdHJpbmcKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCgl2YXIgJHJlcXVlc3QgPSAnJzsKCS8qKgoJICogU09BUCBoZWFkZXJzIGZyb20gcmVxdWVzdCAoaW5jb21wbGV0ZSBuYW1lc3BhY2UgcmVzb2x1dGlvbjsgc3BlY2lhbCBjaGFyYWN0ZXJzIG5vdCBlc2NhcGVkKSAodGV4dCkKCSAqIEB2YXIgc3RyaW5nCgkgKiBAYWNjZXNzIHB1YmxpYwoJICovCgl2YXIgJHJlcXVlc3RIZWFkZXJzID0gJyc7CgkvKioKCSAqIFNPQVAgYm9keSByZXF1ZXN0IHBvcnRpb24gKGluY29tcGxldGUgbmFtZXNwYWNlIHJlc29sdXRpb247IHNwZWNpYWwgY2hhcmFjdGVycyBub3QgZXNjYXBlZCkgKHRleHQpCgkgKiBAdmFyIHN0cmluZwoJICogQGFjY2VzcyBwdWJsaWMKCSAqLwoJdmFyICRkb2N1bWVudCA9ICcnOwoJLyoqCgkgKiBTT0FQIHBheWxvYWQgZm9yIHJlcXVlc3QgKHRleHQpCgkgKiBAdmFyIHN0cmluZwoJICogQGFjY2VzcyBwdWJsaWMKCSAqLwoJdmFyICRyZXF1ZXN0U09BUCA9ICcnOwoJLyoqCgkgKiByZXF1ZXN0ZWQgbWV0aG9kIG5hbWVzcGFjZSBVUkkKCSAqIEB2YXIgc3RyaW5nCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJdmFyICRtZXRob2RVUkkgPSAnJzsKCS8qKgoJICogbmFtZSBvZiBtZXRob2QgcmVxdWVzdGVkCgkgKiBAdmFyIHN0cmluZwoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCXZhciAkbWV0aG9kbmFtZSA9ICcnOwoJLyoqCgkgKiBtZXRob2QgcGFyYW1ldGVycyBmcm9tIHJlcXVlc3QKCSAqIEB2YXIgYXJyYXkKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCgl2YXIgJG1ldGhvZHBhcmFtcyA9IGFycmF5KCk7CgkvKioKCSAqIFNPQVAgQWN0aW9uIGZyb20gcmVxdWVzdAoJICogQHZhciBzdHJpbmcKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCgl2YXIgJFNPQVBBY3Rpb24gPSAnJzsKCS8qKgoJICogY2hhcmFjdGVyIHNldCBlbmNvZGluZyBvZiBpbmNvbWluZyAocmVxdWVzdCkgbWVzc2FnZXMKCSAqIEB2YXIgc3RyaW5nCgkgKiBAYWNjZXNzIHB1YmxpYwoJICovCgl2YXIgJHhtbF9lbmNvZGluZyA9ICcnOwoJLyoqCgkgKiB0b2dnbGVzIHdoZXRoZXIgdGhlIHBhcnNlciBkZWNvZGVzIGVsZW1lbnQgY29udGVudCB3LyB1dGY4X2RlY29kZSgpCgkgKiBAdmFyIGJvb2xlYW4KCSAqIEBhY2Nlc3MgcHVibGljCgkgKi8KICAgIHZhciAkZGVjb2RlX3V0ZjggPSB0cnVlOwoKCS8qKgoJICogSFRUUCBoZWFkZXJzIG9mIHJlc3BvbnNlCgkgKiBAdmFyIGFycmF5CgkgKiBAYWNjZXNzIHB1YmxpYwoJICovCgl2YXIgJG91dGdvaW5nX2hlYWRlcnMgPSBhcnJheSgpOwoJLyoqCgkgKiBIVFRQIHJlc3BvbnNlCgkgKiBAdmFyIHN0cmluZwoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCXZhciAkcmVzcG9uc2UgPSAnJzsKCS8qKgoJICogU09BUCBoZWFkZXJzIGZvciByZXNwb25zZSAodGV4dCkKCSAqIEB2YXIgc3RyaW5nCgkgKiBAYWNjZXNzIHB1YmxpYwoJICovCgl2YXIgJHJlc3BvbnNlSGVhZGVycyA9ICcnOwoJLyoqCgkgKiBTT0FQIHBheWxvYWQgZm9yIHJlc3BvbnNlICh0ZXh0KQoJICogQHZhciBzdHJpbmcKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCgl2YXIgJHJlc3BvbnNlU09BUCA9ICcnOwoJLyoqCgkgKiBtZXRob2QgcmV0dXJuIHZhbHVlIHRvIHBsYWNlIGluIHJlc3BvbnNlCgkgKiBAdmFyIG1peGVkCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJdmFyICRtZXRob2RyZXR1cm4gPSBmYWxzZTsKCS8qKgoJICogd2hldGhlciAkbWV0aG9kcmV0dXJuIGlzIGEgc3RyaW5nIG9mIGxpdGVyYWwgWE1MCgkgKiBAdmFyIGJvb2xlYW4KCSAqIEBhY2Nlc3MgcHVibGljCgkgKi8KCXZhciAkbWV0aG9kcmV0dXJuaXNsaXRlcmFseG1sID0gZmFsc2U7CgkvKioKCSAqIFNPQVAgZmF1bHQgZm9yIHJlc3BvbnNlIChvciBmYWxzZSkKCSAqIEB2YXIgbWl4ZWQKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCgl2YXIgJGZhdWx0ID0gZmFsc2U7CgkvKioKCSAqIHRleHQgaW5kaWNhdGlvbiBvZiByZXN1bHQgKGZvciBkZWJ1Z2dpbmcpCgkgKiBAdmFyIHN0cmluZwoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCXZhciAkcmVzdWx0ID0gJ3N1Y2Nlc3NmdWwnOwoKCS8qKgoJICogYXNzb2MgYXJyYXkgb2Ygb3BlcmF0aW9ucyA9PiBvcERhdGE7IG9wZXJhdGlvbnMgYXJlIGFkZGVkIGJ5IHRoZSByZWdpc3RlcigpCgkgKiBtZXRob2Qgb3IgYnkgcGFyc2luZyBhbiBleHRlcm5hbCBXU0RMIGRlZmluaXRpb24KCSAqIEB2YXIgYXJyYXkKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCgl2YXIgJG9wZXJhdGlvbnMgPSBhcnJheSgpOwoJLyoqCgkgKiB3c2RsIGluc3RhbmNlIChpZiBvbmUpCgkgKiBAdmFyIG1peGVkCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJdmFyICR3c2RsID0gZmFsc2U7CgkvKioKCSAqIFVSTCBmb3IgV1NETCAoaWYgb25lKQoJICogQHZhciBtaXhlZAoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCXZhciAkZXh0ZXJuYWxXU0RMVVJMID0gZmFsc2U7CgkvKioKCSAqIHdoZXRoZXIgdG8gYXBwZW5kIGRlYnVnIHRvIHJlc3BvbnNlIGFzIFhNTCBjb21tZW50CgkgKiBAdmFyIGJvb2xlYW4KCSAqIEBhY2Nlc3MgcHVibGljCgkgKi8KCXZhciAkZGVidWdfZmxhZyA9IGZhbHNlOwoKCgkvKioKCSogY29uc3RydWN0b3IKICAgICogdGhlIG9wdGlvbmFsIHBhcmFtZXRlciBpcyBhIHBhdGggdG8gYSBXU0RMIGZpbGUgdGhhdCB5b3UnZCBsaWtlIHRvIGJpbmQgdGhlIHNlcnZlciBpbnN0YW5jZSB0by4KCSoKICAgICogQHBhcmFtIG1peGVkICR3c2RsIGZpbGUgcGF0aCBvciBVUkwgKHN0cmluZyksIG9yIHdzZGwgaW5zdGFuY2UgKG9iamVjdCkKCSogQGFjY2VzcyAgIHB1YmxpYwoJKi8KCWZ1bmN0aW9uIHNvYXBfc2VydmVyKCR3c2RsPWZhbHNlKXsKCQlwYXJlbnQ6Om51c29hcF9iYXNlKCk7CgkJLy8gdHVybiBvbiBkZWJ1Z2dpbmc/CgkJZ2xvYmFsICRkZWJ1ZzsKCQlnbG9iYWwgJEhUVFBfU0VSVkVSX1ZBUlM7CgoJCWlmIChpc3NldCgkX1NFUlZFUikpIHsKCQkJJHRoaXMtPmRlYnVnKCJfU0VSVkVSIGlzIGRlZmluZWQ6Iik7CgkJCSR0aGlzLT5hcHBlbmREZWJ1ZygkdGhpcy0+dmFyRHVtcCgkX1NFUlZFUikpOwoJCX0gZWxzZWlmIChpc3NldCgkSFRUUF9TRVJWRVJfVkFSUykpIHsKCQkJJHRoaXMtPmRlYnVnKCJIVFRQX1NFUlZFUl9WQVJTIGlzIGRlZmluZWQ6Iik7CgkJCSR0aGlzLT5hcHBlbmREZWJ1ZygkdGhpcy0+dmFyRHVtcCgkSFRUUF9TRVJWRVJfVkFSUykpOwoJCX0gZWxzZSB7CgkJCSR0aGlzLT5kZWJ1ZygiTmVpdGhlciBfU0VSVkVSIG5vciBIVFRQX1NFUlZFUl9WQVJTIGlzIGRlZmluZWQuIik7CgkJfQoKCQlpZiAoaXNzZXQoJGRlYnVnKSkgewoJCQkkdGhpcy0+ZGVidWcoIkluIHNvYXBfc2VydmVyLCBzZXQgZGVidWdfZmxhZz0kZGVidWcgYmFzZWQgb24gZ2xvYmFsIGZsYWciKTsKCQkJJHRoaXMtPmRlYnVnX2ZsYWcgPSAkZGVidWc7CgkJfSBlbHNlaWYgKGlzc2V0KCRfU0VSVkVSWydRVUVSWV9TVFJJTkcnXSkpIHsKCQkJJHFzID0gZXhwbG9kZSgnJicsICRfU0VSVkVSWydRVUVSWV9TVFJJTkcnXSk7CgkJCWZvcmVhY2ggKCRxcyBhcyAkdikgewoJCQkJaWYgKHN1YnN0cigkdiwgMCwgNikgPT0gJ2RlYnVnPScpIHsKCQkJCQkkdGhpcy0+ZGVidWcoIkluIHNvYXBfc2VydmVyLCBzZXQgZGVidWdfZmxhZz0iIC4gc3Vic3RyKCR2LCA2KSAuICIgYmFzZWQgb24gcXVlcnkgc3RyaW5nICMxIik7CgkJCQkJJHRoaXMtPmRlYnVnX2ZsYWcgPSBzdWJzdHIoJHYsIDYpOwoJCQkJfQoJCQl9CgkJfSBlbHNlaWYgKGlzc2V0KCRIVFRQX1NFUlZFUl9WQVJTWydRVUVSWV9TVFJJTkcnXSkpIHsKCQkJJHFzID0gZXhwbG9kZSgnJicsICRIVFRQX1NFUlZFUl9WQVJTWydRVUVSWV9TVFJJTkcnXSk7CgkJCWZvcmVhY2ggKCRxcyBhcyAkdikgewoJCQkJaWYgKHN1YnN0cigkdiwgMCwgNikgPT0gJ2RlYnVnPScpIHsKCQkJCQkkdGhpcy0+ZGVidWcoIkluIHNvYXBfc2VydmVyLCBzZXQgZGVidWdfZmxhZz0iIC4gc3Vic3RyKCR2LCA2KSAuICIgYmFzZWQgb24gcXVlcnkgc3RyaW5nICMyIik7CgkJCQkJJHRoaXMtPmRlYnVnX2ZsYWcgPSBzdWJzdHIoJHYsIDYpOwoJCQkJfQoJCQl9CgkJfQoKCQkvLyB3c2RsCgkJaWYoJHdzZGwpewoJCQkkdGhpcy0+ZGVidWcoIkluIHNvYXBfc2VydmVyLCBXU0RMIGlzIHNwZWNpZmllZCIpOwoJCQlpZiAoaXNfb2JqZWN0KCR3c2RsKSAmJiAoZ2V0X2NsYXNzKCR3c2RsKSA9PSAnd3NkbCcpKSB7CgkJCQkkdGhpcy0+d3NkbCA9ICR3c2RsOwoJCQkJJHRoaXMtPmV4dGVybmFsV1NETFVSTCA9ICR0aGlzLT53c2RsLT53c2RsOwoJCQkJJHRoaXMtPmRlYnVnKCdVc2UgZXhpc3Rpbmcgd3NkbCBpbnN0YW5jZSBmcm9tICcgLiAkdGhpcy0+ZXh0ZXJuYWxXU0RMVVJMKTsKCQkJfSBlbHNlIHsKCQkJCSR0aGlzLT5kZWJ1ZygnQ3JlYXRlIHdzZGwgZnJvbSAnIC4gJHdzZGwpOwoJCQkJJHRoaXMtPndzZGwgPSBuZXcgd3NkbCgkd3NkbCk7CgkJCQkkdGhpcy0+ZXh0ZXJuYWxXU0RMVVJMID0gJHdzZGw7CgkJCX0KCQkJJHRoaXMtPmFwcGVuZERlYnVnKCR0aGlzLT53c2RsLT5nZXREZWJ1ZygpKTsKCQkJJHRoaXMtPndzZGwtPmNsZWFyRGVidWcoKTsKCQkJaWYoJGVyciA9ICR0aGlzLT53c2RsLT5nZXRFcnJvcigpKXsKCQkJCWRpZSgnV1NETCBFUlJPUjogJy4kZXJyKTsKCQkJfQoJCX0KCX0KCgkvKioKCSogcHJvY2Vzc2VzIHJlcXVlc3QgYW5kIHJldHVybnMgcmVzcG9uc2UKCSoKCSogQHBhcmFtICAgIHN0cmluZyAkZGF0YSB1c3VhbGx5IGlzIHRoZSB2YWx1ZSBvZiAkSFRUUF9SQVdfUE9TVF9EQVRBCgkqIEBhY2Nlc3MgICBwdWJsaWMKCSovCglmdW5jdGlvbiBzZXJ2aWNlKCRkYXRhKXsKCQlnbG9iYWwgJEhUVFBfU0VSVkVSX1ZBUlM7CgoJCWlmIChpc3NldCgkX1NFUlZFUlsnUVVFUllfU1RSSU5HJ10pKSB7CgkJCSRxcyA9ICRfU0VSVkVSWydRVUVSWV9TVFJJTkcnXTsKCQl9IGVsc2VpZiAoaXNzZXQoJEhUVFBfU0VSVkVSX1ZBUlNbJ1FVRVJZX1NUUklORyddKSkgewoJCQkkcXMgPSAkSFRUUF9TRVJWRVJfVkFSU1snUVVFUllfU1RSSU5HJ107CgkJfSBlbHNlIHsKCQkJJHFzID0gJyc7CgkJfQoJCSR0aGlzLT5kZWJ1ZygiSW4gc2VydmljZSwgcXVlcnkgc3RyaW5nPSRxcyIpOwoJCSR0aGlzLT5kZWJ1ZygiSW4gc2VydmljZSwgZGF0YT0kZGF0YSIpOwoKCQlpZiAoZXJlZygnd3NkbCcsICRxcykgKXsKCQkJJHRoaXMtPmRlYnVnKCJJbiBzZXJ2aWNlLCB0aGlzIGlzIGEgcmVxdWVzdCBmb3IgV1NETCIpOwoJCQlpZigkdGhpcy0+ZXh0ZXJuYWxXU0RMVVJMKXsKICAgICAgICAgICAgICBpZiAoc3RycG9zKCR0aGlzLT5leHRlcm5hbFdTRExVUkwsIjovLyIpIT09ZmFsc2UpIHsgLy8gYXNzdW1lIFVSTAoJCQkJaGVhZGVyKCdMb2NhdGlvbjogJy4kdGhpcy0+ZXh0ZXJuYWxXU0RMVVJMKTsKICAgICAgICAgICAgICB9IGVsc2UgeyAvLyBhc3N1bWUgZmlsZQogICAgICAgICAgICAgICAgaGVhZGVyKCJDb250ZW50LVR5cGU6IHRleHQveG1sXHJcbiIpOwogICAgICAgICAgICAgICAgJGZwID0gZm9wZW4oJHRoaXMtPmV4dGVybmFsV1NETFVSTCwgJ3InKTsKICAgICAgICAgICAgICAgIGZwYXNzdGhydSgkZnApOwogICAgICAgICAgICAgIH0KCQkJfSBlbHNlaWYgKCR0aGlzLT53c2RsKSB7CgkJCQloZWFkZXIoIkNvbnRlbnQtVHlwZTogdGV4dC94bWw7IGNoYXJzZXQ9SVNPLTg4NTktMVxyXG4iKTsKCQkJCXByaW50ICR0aGlzLT53c2RsLT5zZXJpYWxpemUoJHRoaXMtPmRlYnVnX2ZsYWcpOwoJCQkJaWYgKCR0aGlzLT5kZWJ1Z19mbGFnKSB7CgkJCQkJJHRoaXMtPmRlYnVnKCd3c2RsOicpOwoJCQkJCSR0aGlzLT5hcHBlbmREZWJ1ZygkdGhpcy0+dmFyRHVtcCgkdGhpcy0+d3NkbCkpOwoJCQkJCXByaW50ICR0aGlzLT5nZXREZWJ1Z0FzWE1MQ29tbWVudCgpOwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJaGVhZGVyKCJDb250ZW50LVR5cGU6IHRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xXHJcbiIpOwoJCQkJcHJpbnQgIlRoaXMgc2VydmljZSBkb2VzIG5vdCBwcm92aWRlIFdTREwiOwoJCQl9CgkJfSBlbHNlaWYgKCRkYXRhID09ICcnICYmICR0aGlzLT53c2RsKSB7CgkJCSR0aGlzLT5kZWJ1ZygiSW4gc2VydmljZSwgdGhlcmUgaXMgbm8gZGF0YSwgc28gcmV0dXJuIFdlYiBkZXNjcmlwdGlvbiIpOwoJCQlwcmludCAkdGhpcy0+d3NkbC0+d2ViRGVzY3JpcHRpb24oKTsKCQl9IGVsc2UgewoJCQkkdGhpcy0+ZGVidWcoIkluIHNlcnZpY2UsIGludm9rZSB0aGUgcmVxdWVzdCIpOwoJCQkkdGhpcy0+cGFyc2VfcmVxdWVzdCgkZGF0YSk7CgkJCWlmICghICR0aGlzLT5mYXVsdCkgewoJCQkJJHRoaXMtPmludm9rZV9tZXRob2QoKTsKCQkJfQoJCQlpZiAoISAkdGhpcy0+ZmF1bHQpIHsKCQkJCSR0aGlzLT5zZXJpYWxpemVfcmV0dXJuKCk7CgkJCX0KCQkJJHRoaXMtPnNlbmRfcmVzcG9uc2UoKTsKCQl9Cgl9CgoJLyoqCgkqIHBhcnNlcyBIVFRQIHJlcXVlc3QgaGVhZGVycy4KCSoKCSogVGhlIGZvbGxvd2luZyBmaWVsZHMgYXJlIHNldCBieSB0aGlzIGZ1bmN0aW9uICh3aGVuIHN1Y2Nlc3NmdWwpCgkqCgkqIGhlYWRlcnMKCSogcmVxdWVzdAoJKiB4bWxfZW5jb2RpbmcKCSogU09BUEFjdGlvbgoJKgoJKiBAYWNjZXNzICAgcHJpdmF0ZQoJKi8KCWZ1bmN0aW9uIHBhcnNlX2h0dHBfaGVhZGVycygpIHsKCQlnbG9iYWwgJEhUVFBfU0VSVkVSX1ZBUlM7CgoJCSR0aGlzLT5yZXF1ZXN0ID0gJyc7CgkJJHRoaXMtPlNPQVBBY3Rpb24gPSAnJzsKCQlpZihmdW5jdGlvbl9leGlzdHMoJ2dldGFsbGhlYWRlcnMnKSl7CgkJCSR0aGlzLT5kZWJ1ZygiSW4gcGFyc2VfaHR0cF9oZWFkZXJzLCB1c2UgZ2V0YWxsaGVhZGVycyIpOwoJCQkkaGVhZGVycyA9IGdldGFsbGhlYWRlcnMoKTsKCQkJZm9yZWFjaCgkaGVhZGVycyBhcyAkaz0+JHYpewoJCQkJJGsgPSBzdHJ0b2xvd2VyKCRrKTsKCQkJCSR0aGlzLT5oZWFkZXJzWyRrXSA9ICR2OwoJCQkJJHRoaXMtPnJlcXVlc3QgLj0gIiRrOiAkdlxyXG4iOwoJCQkJJHRoaXMtPmRlYnVnKCIkazogJHYiKTsKCQkJfQoJCQkvLyBnZXQgU09BUEFjdGlvbiBoZWFkZXIKCQkJaWYoaXNzZXQoJHRoaXMtPmhlYWRlcnNbJ3NvYXBhY3Rpb24nXSkpewoJCQkJJHRoaXMtPlNPQVBBY3Rpb24gPSBzdHJfcmVwbGFjZSgnIicsJycsJHRoaXMtPmhlYWRlcnNbJ3NvYXBhY3Rpb24nXSk7CgkJCX0KCQkJLy8gZ2V0IHRoZSBjaGFyYWN0ZXIgZW5jb2Rpbmcgb2YgdGhlIGluY29taW5nIHJlcXVlc3QKCQkJaWYoaXNzZXQoJHRoaXMtPmhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddKSAmJiBzdHJwb3MoJHRoaXMtPmhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddLCc9JykpewoJCQkJJGVuYyA9IHN0cl9yZXBsYWNlKCciJywnJyxzdWJzdHIoc3Ryc3RyKCR0aGlzLT5oZWFkZXJzWyJjb250ZW50LXR5cGUiXSwnPScpLDEpKTsKCQkJCWlmKGVyZWdpKCdeKElTTy04ODU5LTF8VVMtQVNDSUl8VVRGLTgpJCcsJGVuYykpewoJCQkJCSR0aGlzLT54bWxfZW5jb2RpbmcgPSBzdHJ0b3VwcGVyKCRlbmMpOwoJCQkJfSBlbHNlIHsKCQkJCQkkdGhpcy0+eG1sX2VuY29kaW5nID0gJ1VTLUFTQ0lJJzsKCQkJCX0KCQkJfSBlbHNlIHsKCQkJCS8vIHNob3VsZCBiZSBVUy1BU0NJSSBmb3IgSFRUUCAxLjAgb3IgSVNPLTg4NTktMSBmb3IgSFRUUCAxLjEKCQkJCSR0aGlzLT54bWxfZW5jb2RpbmcgPSAnSVNPLTg4NTktMSc7CgkJCX0KCQl9IGVsc2VpZihpc3NldCgkX1NFUlZFUikgJiYgaXNfYXJyYXkoJF9TRVJWRVIpKXsKCQkJJHRoaXMtPmRlYnVnKCJJbiBwYXJzZV9odHRwX2hlYWRlcnMsIHVzZSBfU0VSVkVSIik7CgkJCWZvcmVhY2ggKCRfU0VSVkVSIGFzICRrID0+ICR2KSB7CgkJCQlpZiAoc3Vic3RyKCRrLCAwLCA1KSA9PSAnSFRUUF8nKSB7CgkJCQkJJGsgPSBzdHJfcmVwbGFjZSgnICcsICctJywgc3RydG9sb3dlcihzdHJfcmVwbGFjZSgnXycsICcgJywgc3Vic3RyKCRrLCA1KSkpKTsgCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGsgPSBzdHJ0b2xvd2VyKHN1YnN0cigkaywgNSkpOwoJCQkJfSBlbHNlIHsKCQkJCQkkayA9IHN0cl9yZXBsYWNlKCcgJywgJy0nLCBzdHJ0b2xvd2VyKHN0cl9yZXBsYWNlKCdfJywgJyAnLCAkaykpKTsgCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGsgPSBzdHJ0b2xvd2VyKCRrKTsKCQkJCX0KCQkJCWlmICgkayA9PSAnc29hcGFjdGlvbicpIHsKCQkJCQkvLyBnZXQgU09BUEFjdGlvbiBoZWFkZXIKCQkJCQkkayA9ICdTT0FQQWN0aW9uJzsKCQkJCQkkdiA9IHN0cl9yZXBsYWNlKCciJywgJycsICR2KTsKCQkJCQkkdiA9IHN0cl9yZXBsYWNlKCdcXCcsICcnLCAkdik7CgkJCQkJJHRoaXMtPlNPQVBBY3Rpb24gPSAkdjsKCQkJCX0gZWxzZSBpZiAoJGsgPT0gJ2NvbnRlbnQtdHlwZScpIHsKCQkJCQkvLyBnZXQgdGhlIGNoYXJhY3RlciBlbmNvZGluZyBvZiB0aGUgaW5jb21pbmcgcmVxdWVzdAoJCQkJCWlmIChzdHJwb3MoJHYsICc9JykpIHsKCQkJCQkJJGVuYyA9IHN1YnN0cihzdHJzdHIoJHYsICc9JyksIDEpOwoJCQkJCQkkZW5jID0gc3RyX3JlcGxhY2UoJyInLCAnJywgJGVuYyk7CgkJCQkJCSRlbmMgPSBzdHJfcmVwbGFjZSgnXFwnLCAnJywgJGVuYyk7CgkJCQkJCWlmIChlcmVnaSgnXihJU08tODg1OS0xfFVTLUFTQ0lJfFVURi04KSQnLCAkZW5jKSkgewoJCQkJCQkJJHRoaXMtPnhtbF9lbmNvZGluZyA9IHN0cnRvdXBwZXIoJGVuYyk7CgkJCQkJCX0gZWxzZSB7CgkJCQkJCQkkdGhpcy0+eG1sX2VuY29kaW5nID0gJ1VTLUFTQ0lJJzsKCQkJCQkJfQoJCQkJCX0gZWxzZSB7CgkJCQkJCS8vIHNob3VsZCBiZSBVUy1BU0NJSSBmb3IgSFRUUCAxLjAgb3IgSVNPLTg4NTktMSBmb3IgSFRUUCAxLjEKCQkJCQkJJHRoaXMtPnhtbF9lbmNvZGluZyA9ICdJU08tODg1OS0xJzsKCQkJCQl9CgkJCQl9CgkJCQkkdGhpcy0+aGVhZGVyc1ska10gPSAkdjsKCQkJCSR0aGlzLT5yZXF1ZXN0IC49ICIkazogJHZcclxuIjsKCQkJCSR0aGlzLT5kZWJ1ZygiJGs6ICR2Iik7CgkJCX0KCQl9IGVsc2VpZiAoaXNfYXJyYXkoJEhUVFBfU0VSVkVSX1ZBUlMpKSB7CgkJCSR0aGlzLT5kZWJ1ZygiSW4gcGFyc2VfaHR0cF9oZWFkZXJzLCB1c2UgSFRUUF9TRVJWRVJfVkFSUyIpOwoJCQlmb3JlYWNoICgkSFRUUF9TRVJWRVJfVkFSUyBhcyAkayA9PiAkdikgewoJCQkJaWYgKHN1YnN0cigkaywgMCwgNSkgPT0gJ0hUVFBfJykgewoJCQkJCSRrID0gc3RyX3JlcGxhY2UoJyAnLCAnLScsIHN0cnRvbG93ZXIoc3RyX3JlcGxhY2UoJ18nLCAnICcsIHN1YnN0cigkaywgNSkpKSk7IAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRrID0gc3RydG9sb3dlcihzdWJzdHIoJGssIDUpKTsKCQkJCX0gZWxzZSB7CgkJCQkJJGsgPSBzdHJfcmVwbGFjZSgnICcsICctJywgc3RydG9sb3dlcihzdHJfcmVwbGFjZSgnXycsICcgJywgJGspKSk7IAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRrID0gc3RydG9sb3dlcigkayk7CgkJCQl9CgkJCQlpZiAoJGsgPT0gJ3NvYXBhY3Rpb24nKSB7CgkJCQkJLy8gZ2V0IFNPQVBBY3Rpb24gaGVhZGVyCgkJCQkJJGsgPSAnU09BUEFjdGlvbic7CgkJCQkJJHYgPSBzdHJfcmVwbGFjZSgnIicsICcnLCAkdik7CgkJCQkJJHYgPSBzdHJfcmVwbGFjZSgnXFwnLCAnJywgJHYpOwoJCQkJCSR0aGlzLT5TT0FQQWN0aW9uID0gJHY7CgkJCQl9IGVsc2UgaWYgKCRrID09ICdjb250ZW50LXR5cGUnKSB7CgkJCQkJLy8gZ2V0IHRoZSBjaGFyYWN0ZXIgZW5jb2Rpbmcgb2YgdGhlIGluY29taW5nIHJlcXVlc3QKCQkJCQlpZiAoc3RycG9zKCR2LCAnPScpKSB7CgkJCQkJCSRlbmMgPSBzdWJzdHIoc3Ryc3RyKCR2LCAnPScpLCAxKTsKCQkJCQkJJGVuYyA9IHN0cl9yZXBsYWNlKCciJywgJycsICRlbmMpOwoJCQkJCQkkZW5jID0gc3RyX3JlcGxhY2UoJ1xcJywgJycsICRlbmMpOwoJCQkJCQlpZiAoZXJlZ2koJ14oSVNPLTg4NTktMXxVUy1BU0NJSXxVVEYtOCkkJywgJGVuYykpIHsKCQkJCQkJCSR0aGlzLT54bWxfZW5jb2RpbmcgPSBzdHJ0b3VwcGVyKCRlbmMpOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJJHRoaXMtPnhtbF9lbmNvZGluZyA9ICdVUy1BU0NJSSc7CgkJCQkJCX0KCQkJCQl9IGVsc2UgewoJCQkJCQkvLyBzaG91bGQgYmUgVVMtQVNDSUkgZm9yIEhUVFAgMS4wIG9yIElTTy04ODU5LTEgZm9yIEhUVFAgMS4xCgkJCQkJCSR0aGlzLT54bWxfZW5jb2RpbmcgPSAnSVNPLTg4NTktMSc7CgkJCQkJfQoJCQkJfQoJCQkJJHRoaXMtPmhlYWRlcnNbJGtdID0gJHY7CgkJCQkkdGhpcy0+cmVxdWVzdCAuPSAiJGs6ICR2XHJcbiI7CgkJCQkkdGhpcy0+ZGVidWcoIiRrOiAkdiIpOwoJCQl9CgkJfSBlbHNlIHsKCQkJJHRoaXMtPmRlYnVnKCJJbiBwYXJzZV9odHRwX2hlYWRlcnMsIEhUVFAgaGVhZGVycyBub3QgYWNjZXNzaWJsZSIpOwoJCQkkdGhpcy0+c2V0RXJyb3IoIkhUVFAgaGVhZGVycyBub3QgYWNjZXNzaWJsZSIpOwoJCX0KCX0KCgkvKioKCSogcGFyc2VzIGEgcmVxdWVzdAoJKgoJKiBUaGUgZm9sbG93aW5nIGZpZWxkcyBhcmUgc2V0IGJ5IHRoaXMgZnVuY3Rpb24gKHdoZW4gc3VjY2Vzc2Z1bCkKCSoKCSogaGVhZGVycwoJKiByZXF1ZXN0CgkqIHhtbF9lbmNvZGluZwoJKiBTT0FQQWN0aW9uCgkqIHJlcXVlc3QKCSogcmVxdWVzdFNPQVAKCSogbWV0aG9kVVJJCgkqIG1ldGhvZG5hbWUKCSogbWV0aG9kcGFyYW1zCgkqIHJlcXVlc3RIZWFkZXJzCgkqIGRvY3VtZW50CgkqCgkqIFRoaXMgc2V0cyB0aGUgZmF1bHQgZmllbGQgb24gZXJyb3IKCSoKCSogQHBhcmFtICAgIHN0cmluZyAkZGF0YSBYTUwgc3RyaW5nCgkqIEBhY2Nlc3MgICBwcml2YXRlCgkqLwoJZnVuY3Rpb24gcGFyc2VfcmVxdWVzdCgkZGF0YT0nJykgewoJCSR0aGlzLT5kZWJ1ZygnZW50ZXJpbmcgcGFyc2VfcmVxdWVzdCgpJyk7CgkJJHRoaXMtPnBhcnNlX2h0dHBfaGVhZGVycygpOwoJCSR0aGlzLT5kZWJ1ZygnZ290IGNoYXJhY3RlciBlbmNvZGluZzogJy4kdGhpcy0+eG1sX2VuY29kaW5nKTsKCQkvLyB1bmNvbXByZXNzIGlmIG5lY2Vzc2FyeQoJCWlmIChpc3NldCgkdGhpcy0+aGVhZGVyc1snY29udGVudC1lbmNvZGluZyddKSAmJiAkdGhpcy0+aGVhZGVyc1snY29udGVudC1lbmNvZGluZyddICE9ICcnKSB7CgkJCSR0aGlzLT5kZWJ1ZygnZ290IGNvbnRlbnQgZW5jb2Rpbmc6ICcgLiAkdGhpcy0+aGVhZGVyc1snY29udGVudC1lbmNvZGluZyddKTsKCQkJaWYgKCR0aGlzLT5oZWFkZXJzWydjb250ZW50LWVuY29kaW5nJ10gPT0gJ2RlZmxhdGUnIHx8ICR0aGlzLT5oZWFkZXJzWydjb250ZW50LWVuY29kaW5nJ10gPT0gJ2d6aXAnKSB7CgkJICAgIAkvLyBpZiBkZWNvZGluZyB3b3JrcywgdXNlIGl0LiBlbHNlIGFzc3VtZSBkYXRhIHdhc24ndCBnemVuY29kZWQKCQkJCWlmIChmdW5jdGlvbl9leGlzdHMoJ2d6dW5jb21wcmVzcycpKSB7CgkJCQkJaWYgKCR0aGlzLT5oZWFkZXJzWydjb250ZW50LWVuY29kaW5nJ10gPT0gJ2RlZmxhdGUnICYmICRkZWd6ZGF0YSA9IEBnenVuY29tcHJlc3MoJGRhdGEpKSB7CgkJCQkJCSRkYXRhID0gJGRlZ3pkYXRhOwoJCQkJCX0gZWxzZWlmICgkdGhpcy0+aGVhZGVyc1snY29udGVudC1lbmNvZGluZyddID09ICdnemlwJyAmJiAkZGVnemRhdGEgPSBnemluZmxhdGUoc3Vic3RyKCRkYXRhLCAxMCkpKSB7CgkJCQkJCSRkYXRhID0gJGRlZ3pkYXRhOwoJCQkJCX0gZWxzZSB7CgkJCQkJCSR0aGlzLT5mYXVsdCgnQ2xpZW50JywgJ0Vycm9ycyBvY2N1cnJlZCB3aGVuIHRyeWluZyB0byBkZWNvZGUgdGhlIGRhdGEnKTsKCQkJCQkJcmV0dXJuOwoJCQkJCX0KCQkJCX0gZWxzZSB7CgkJCQkJJHRoaXMtPmZhdWx0KCdDbGllbnQnLCAnVGhpcyBTZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCBjb21wcmVzc2VkIGRhdGEnKTsKCQkJCQlyZXR1cm47CgkJCQl9CgkJCX0KCQl9CgkJJHRoaXMtPnJlcXVlc3QgLj0gIlxyXG4iLiRkYXRhOwoJCSRkYXRhID0gJHRoaXMtPnBhcnNlUmVxdWVzdCgkdGhpcy0+aGVhZGVycywgJGRhdGEpOwoJCSR0aGlzLT5yZXF1ZXN0U09BUCA9ICRkYXRhOwoJCSR0aGlzLT5kZWJ1ZygnbGVhdmluZyBwYXJzZV9yZXF1ZXN0Jyk7Cgl9CgoJLyoqCgkqIGludm9rZXMgYSBQSFAgZnVuY3Rpb24gZm9yIHRoZSByZXF1ZXN0ZWQgU09BUCBtZXRob2QKCSoKCSogVGhlIGZvbGxvd2luZyBmaWVsZHMgYXJlIHNldCBieSB0aGlzIGZ1bmN0aW9uICh3aGVuIHN1Y2Nlc3NmdWwpCgkqCgkqIG1ldGhvZHJldHVybgoJKgoJKiBOb3RlIHRoYXQgdGhlIFBIUCBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCBtYXkgYWxzbyBzZXQgdGhlIGZvbGxvd2luZwoJKiBmaWVsZHMgdG8gYWZmZWN0IHRoZSByZXNwb25zZSBzZW50IHRvIHRoZSBjbGllbnQKCSoKCSogcmVzcG9uc2VIZWFkZXJzCgkqIG91dGdvaW5nX2hlYWRlcnMKCSoKCSogVGhpcyBzZXRzIHRoZSBmYXVsdCBmaWVsZCBvbiBlcnJvcgoJKgoJKiBAYWNjZXNzICAgcHJpdmF0ZQoJKi8KCWZ1bmN0aW9uIGludm9rZV9tZXRob2QoKSB7CgkJJHRoaXMtPmRlYnVnKCdpbiBpbnZva2VfbWV0aG9kLCBtZXRob2RuYW1lPScgLiAkdGhpcy0+bWV0aG9kbmFtZSAuICcgbWV0aG9kVVJJPScgLiAkdGhpcy0+bWV0aG9kVVJJIC4gJyBTT0FQQWN0aW9uPScgLiAkdGhpcy0+U09BUEFjdGlvbik7CgoJCWlmICgkdGhpcy0+d3NkbCkgewoJCQlpZiAoJHRoaXMtPm9wRGF0YSA9ICR0aGlzLT53c2RsLT5nZXRPcGVyYXRpb25EYXRhKCR0aGlzLT5tZXRob2RuYW1lKSkgewoJCQkJJHRoaXMtPmRlYnVnKCdpbiBpbnZva2VfbWV0aG9kLCBmb3VuZCBXU0RMIG9wZXJhdGlvbj0nIC4gJHRoaXMtPm1ldGhvZG5hbWUpOwoJCQkJJHRoaXMtPmFwcGVuZERlYnVnKCdvcERhdGE9JyAuICR0aGlzLT52YXJEdW1wKCR0aGlzLT5vcERhdGEpKTsKCQkJfSBlbHNlaWYgKCR0aGlzLT5vcERhdGEgPSAkdGhpcy0+d3NkbC0+Z2V0T3BlcmF0aW9uRGF0YUZvclNvYXBBY3Rpb24oJHRoaXMtPlNPQVBBY3Rpb24pKSB7CgkJCQkvLyBOb3RlOiBob3BlZnVsbHkgdGhpcyBjYXNlIHdpbGwgb25seSBiZSB1c2VkIGZvciBkb2MvbGl0LCBzaW5jZSBycGMgc2VydmljZXMgc2hvdWxkIGhhdmUgd3JhcHBlciBlbGVtZW50CgkJCQkkdGhpcy0+ZGVidWcoJ2luIGludm9rZV9tZXRob2QsIGZvdW5kIFdTREwgc29hcEFjdGlvbj0nIC4gJHRoaXMtPlNPQVBBY3Rpb24gLiAnIGZvciBvcGVyYXRpb249JyAuICR0aGlzLT5vcERhdGFbJ25hbWUnXSk7CgkJCQkkdGhpcy0+YXBwZW5kRGVidWcoJ29wRGF0YT0nIC4gJHRoaXMtPnZhckR1bXAoJHRoaXMtPm9wRGF0YSkpOwoJCQkJJHRoaXMtPm1ldGhvZG5hbWUgPSAkdGhpcy0+b3BEYXRhWyduYW1lJ107CgkJCX0gZWxzZSB7CgkJCQkkdGhpcy0+ZGVidWcoJ2luIGludm9rZV9tZXRob2QsIG5vIFdTREwgZm9yIG9wZXJhdGlvbj0nIC4gJHRoaXMtPm1ldGhvZG5hbWUpOwoJCQkJJHRoaXMtPmZhdWx0KCdDbGllbnQnLCAiT3BlcmF0aW9uICciIC4gJHRoaXMtPm1ldGhvZG5hbWUgLiAiJyBpcyBub3QgZGVmaW5lZCBpbiB0aGUgV1NETCBmb3IgdGhpcyBzZXJ2aWNlIik7CgkJCQlyZXR1cm47CgkJCX0KCQl9IGVsc2UgewoJCQkkdGhpcy0+ZGVidWcoJ2luIGludm9rZV9tZXRob2QsIG5vIFdTREwgdG8gdmFsaWRhdGUgbWV0aG9kJyk7CgkJfQoKCQkvLyBpZiBhIC4gaXMgcHJlc2VudCBpbiAkdGhpcy0+bWV0aG9kbmFtZSwgd2Ugc2VlIGlmIHRoZXJlIGlzIGEgY2xhc3MgaW4gc2NvcGUsCgkJLy8gd2hpY2ggY291bGQgYmUgcmVmZXJyZWQgdG8uIFdlIHdpbGwgYWxzbyBkaXN0aW5ndWlzaCBiZXR3ZWVuIHR3byBkZWxpbWluYXRvcnMsCgkJLy8gdG8gYWxsb3cgbWV0aG9kcyB0byBiZSBjYWxsZWQgYSB0aGUgY2xhc3Mgb3IgYW4gaW5zdGFuY2UKCQkkY2xhc3MgPSAnJzsKCQkkbWV0aG9kID0gJyc7CgkJaWYgKHN0cnBvcygkdGhpcy0+bWV0aG9kbmFtZSwgJy4uJykgPiAwKSB7CgkJCSRkZWxpbSA9ICcuLic7CgkJfSBlbHNlIGlmIChzdHJwb3MoJHRoaXMtPm1ldGhvZG5hbWUsICcuJykgPiAwKSB7CgkJCSRkZWxpbSA9ICcuJzsKCQl9IGVsc2UgewoJCQkkZGVsaW0gPSAnJzsKCQl9CgoJCWlmIChzdHJsZW4oJGRlbGltKSA+IDAgJiYgc3Vic3RyX2NvdW50KCR0aGlzLT5tZXRob2RuYW1lLCAkZGVsaW0pID09IDEgJiYKCQkJY2xhc3NfZXhpc3RzKHN1YnN0cigkdGhpcy0+bWV0aG9kbmFtZSwgMCwgc3RycG9zKCR0aGlzLT5tZXRob2RuYW1lLCAkZGVsaW0pKSkpIHsKCQkJLy8gZ2V0IHRoZSBjbGFzcyBhbmQgbWV0aG9kIG5hbWUKCQkJJGNsYXNzID0gc3Vic3RyKCR0aGlzLT5tZXRob2RuYW1lLCAwLCBzdHJwb3MoJHRoaXMtPm1ldGhvZG5hbWUsICRkZWxpbSkpOwoJCQkkbWV0aG9kID0gc3Vic3RyKCR0aGlzLT5tZXRob2RuYW1lLCBzdHJwb3MoJHRoaXMtPm1ldGhvZG5hbWUsICRkZWxpbSkgKyBzdHJsZW4oJGRlbGltKSk7CgkJCSR0aGlzLT5kZWJ1ZygiaW4gaW52b2tlX21ldGhvZCwgY2xhc3M9JGNsYXNzIG1ldGhvZD0kbWV0aG9kIGRlbGltPSRkZWxpbSIpOwoJCX0KCgkJLy8gZG9lcyBtZXRob2QgZXhpc3Q/CgkJaWYgKCRjbGFzcyA9PSAnJykgewoJCQlpZiAoIWZ1bmN0aW9uX2V4aXN0cygkdGhpcy0+bWV0aG9kbmFtZSkpIHsKCQkJCSR0aGlzLT5kZWJ1ZygiaW4gaW52b2tlX21ldGhvZCwgZnVuY3Rpb24gJyR0aGlzLT5tZXRob2RuYW1lJyBub3QgZm91bmQhIik7CgkJCQkkdGhpcy0+cmVzdWx0ID0gJ2ZhdWx0OiBtZXRob2Qgbm90IGZvdW5kJzsKCQkJCSR0aGlzLT5mYXVsdCgnQ2xpZW50JywibWV0aG9kICckdGhpcy0+bWV0aG9kbmFtZScgbm90IGRlZmluZWQgaW4gc2VydmljZSIpOwoJCQkJcmV0dXJuOwoJCQl9CgkJfSBlbHNlIHsKCQkJJG1ldGhvZF90b19jb21wYXJlID0gKHN1YnN0cihwaHB2ZXJzaW9uKCksIDAsIDIpID09ICc0LicpID8gc3RydG9sb3dlcigkbWV0aG9kKSA6ICRtZXRob2Q7CgkJCWlmICghaW5fYXJyYXkoJG1ldGhvZF90b19jb21wYXJlLCBnZXRfY2xhc3NfbWV0aG9kcygkY2xhc3MpKSkgewoJCQkJJHRoaXMtPmRlYnVnKCJpbiBpbnZva2VfbWV0aG9kLCBtZXRob2QgJyR0aGlzLT5tZXRob2RuYW1lJyBub3QgZm91bmQgaW4gY2xhc3MgJyRjbGFzcychIik7CgkJCQkkdGhpcy0+cmVzdWx0ID0gJ2ZhdWx0OiBtZXRob2Qgbm90IGZvdW5kJzsKCQkJCSR0aGlzLT5mYXVsdCgnQ2xpZW50JywibWV0aG9kICckdGhpcy0+bWV0aG9kbmFtZScgbm90IGRlZmluZWQgaW4gc2VydmljZSIpOwoJCQkJcmV0dXJuOwoJCQl9CgkJfQoKCQkvLyBldmFsdWF0ZSBtZXNzYWdlLCBnZXR0aW5nIGJhY2sgcGFyYW1ldGVycwoJCS8vIHZlcmlmeSB0aGF0IHJlcXVlc3QgcGFyYW1ldGVycyBtYXRjaCB0aGUgbWV0aG9kJ3Mgc2lnbmF0dXJlCgkJaWYoISAkdGhpcy0+dmVyaWZ5X21ldGhvZCgkdGhpcy0+bWV0aG9kbmFtZSwkdGhpcy0+bWV0aG9kcGFyYW1zKSl7CgkJCS8vIGRlYnVnCgkJCSR0aGlzLT5kZWJ1ZygnRVJST1I6IHJlcXVlc3Qgbm90IHZlcmlmaWVkIGFnYWluc3QgbWV0aG9kIHNpZ25hdHVyZScpOwoJCQkkdGhpcy0+cmVzdWx0ID0gJ2ZhdWx0OiByZXF1ZXN0IGZhaWxlZCB2YWxpZGF0aW9uIGFnYWluc3QgbWV0aG9kIHNpZ25hdHVyZSc7CgkJCS8vIHJldHVybiBmYXVsdAoJCQkkdGhpcy0+ZmF1bHQoJ0NsaWVudCcsIk9wZXJhdGlvbiAnJHRoaXMtPm1ldGhvZG5hbWUnIG5vdCBkZWZpbmVkIGluIHNlcnZpY2UuIik7CgkJCXJldHVybjsKCQl9CgoJCS8vIGlmIHRoZXJlIGFyZSBwYXJhbWV0ZXJzIHRvIHBhc3MKCQkkdGhpcy0+ZGVidWcoJ2luIGludm9rZV9tZXRob2QsIHBhcmFtczonKTsKCQkkdGhpcy0+YXBwZW5kRGVidWcoJHRoaXMtPnZhckR1bXAoJHRoaXMtPm1ldGhvZHBhcmFtcykpOwoJCSR0aGlzLT5kZWJ1ZygiaW4gaW52b2tlX21ldGhvZCwgY2FsbGluZyAnJHRoaXMtPm1ldGhvZG5hbWUnIik7CgkJaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2NhbGxfdXNlcl9mdW5jX2FycmF5JykpIHsKCQkJaWYgKCRjbGFzcyA9PSAnJykgewoJCQkJJHRoaXMtPmRlYnVnKCdpbiBpbnZva2VfbWV0aG9kLCBjYWxsaW5nIGZ1bmN0aW9uIHVzaW5nIGV2YWwoKScpOwoJCQkJJGZ1bmNDYWxsID0gIlwkdGhpcy0+bWV0aG9kcmV0dXJuID0gJHRoaXMtPm1ldGhvZG5hbWUoIjsKCQkJfSBlbHNlIHsKCQkJCWlmICgkZGVsaW0gPT0gJy4uJykgewoJCQkJCSR0aGlzLT5kZWJ1ZygnaW4gaW52b2tlX21ldGhvZCwgY2FsbGluZyBjbGFzcyBtZXRob2QgdXNpbmcgZXZhbCgpJyk7CgkJCQkJJGZ1bmNDYWxsID0gIlwkdGhpcy0+bWV0aG9kcmV0dXJuID0gIi4kY2xhc3MuIjo6Ii4kbWV0aG9kLiIoIjsKCQkJCX0gZWxzZSB7CgkJCQkJJHRoaXMtPmRlYnVnKCdpbiBpbnZva2VfbWV0aG9kLCBjYWxsaW5nIGluc3RhbmNlIG1ldGhvZCB1c2luZyBldmFsKCknKTsKCQkJCQkvLyBnZW5lcmF0ZSB1bmlxdWUgaW5zdGFuY2UgbmFtZQoJCQkJCSRpbnN0bmFtZSA9ICJcJGluc3RfIi50aW1lKCk7CgkJCQkJJGZ1bmNDYWxsID0gJGluc3RuYW1lLiIgPSBuZXcgIi4kY2xhc3MuIigpOyAiOwoJCQkJCSRmdW5jQ2FsbCAuPSAiXCR0aGlzLT5tZXRob2RyZXR1cm4gPSAiLiRpbnN0bmFtZS4iLT4iLiRtZXRob2QuIigiOwoJCQkJfQoJCQl9CgkJCWlmICgkdGhpcy0+bWV0aG9kcGFyYW1zKSB7CgkJCQlmb3JlYWNoICgkdGhpcy0+bWV0aG9kcGFyYW1zIGFzICRwYXJhbSkgewoJCQkJCWlmIChpc19hcnJheSgkcGFyYW0pKSB7CgkJCQkJCSR0aGlzLT5mYXVsdCgnQ2xpZW50JywgJ051U09BUCBkb2VzIG5vdCBoYW5kbGUgY29tcGxleFR5cGUgcGFyYW1ldGVycyBjb3JyZWN0bHkgd2hlbiB1c2luZyBldmFsOyBjYWxsX3VzZXJfZnVuY19hcnJheSBtdXN0IGJlIGF2YWlsYWJsZScpOwoJCQkJCQlyZXR1cm47CgkJCQkJfQoJCQkJCSRmdW5jQ2FsbCAuPSAiXCIkcGFyYW1cIiwiOwoJCQkJfQoJCQkJJGZ1bmNDYWxsID0gc3Vic3RyKCRmdW5jQ2FsbCwgMCwgLTEpOwoJCQl9CgkJCSRmdW5jQ2FsbCAuPSAnKTsnOwoJCQkkdGhpcy0+ZGVidWcoJ2luIGludm9rZV9tZXRob2QsIGZ1bmN0aW9uIGNhbGw6ICcuJGZ1bmNDYWxsKTsKCQkJQGV2YWwoJGZ1bmNDYWxsKTsKCQl9IGVsc2UgewoJCQlpZiAoJGNsYXNzID09ICcnKSB7CgkJCQkkdGhpcy0+ZGVidWcoJ2luIGludm9rZV9tZXRob2QsIGNhbGxpbmcgZnVuY3Rpb24gdXNpbmcgY2FsbF91c2VyX2Z1bmNfYXJyYXkoKScpOwoJCQkJJGNhbGxfYXJnID0gIiR0aGlzLT5tZXRob2RuYW1lIjsJLy8gc3RyYWlnaHQgYXNzaWdubWVudCBjaGFuZ2VzICR0aGlzLT5tZXRob2RuYW1lIHRvIGxvd2VyIGNhc2UgYWZ0ZXIgY2FsbF91c2VyX2Z1bmNfYXJyYXkoKQoJCQl9IGVsc2VpZiAoJGRlbGltID09ICcuLicpIHsKCQkJCSR0aGlzLT5kZWJ1ZygnaW4gaW52b2tlX21ldGhvZCwgY2FsbGluZyBjbGFzcyBtZXRob2QgdXNpbmcgY2FsbF91c2VyX2Z1bmNfYXJyYXkoKScpOwoJCQkJJGNhbGxfYXJnID0gYXJyYXkgKCRjbGFzcywgJG1ldGhvZCk7CgkJCX0gZWxzZSB7CgkJCQkkdGhpcy0+ZGVidWcoJ2luIGludm9rZV9tZXRob2QsIGNhbGxpbmcgaW5zdGFuY2UgbWV0aG9kIHVzaW5nIGNhbGxfdXNlcl9mdW5jX2FycmF5KCknKTsKCQkJCSRpbnN0YW5jZSA9IG5ldyAkY2xhc3MgKCk7CgkJCQkkY2FsbF9hcmcgPSBhcnJheSgmJGluc3RhbmNlLCAkbWV0aG9kKTsKCQkJfQoJCQkkdGhpcy0+bWV0aG9kcmV0dXJuID0gY2FsbF91c2VyX2Z1bmNfYXJyYXkoJGNhbGxfYXJnLCAkdGhpcy0+bWV0aG9kcGFyYW1zKTsKCQl9CiAgICAgICAgJHRoaXMtPmRlYnVnKCdpbiBpbnZva2VfbWV0aG9kLCBtZXRob2RyZXR1cm46Jyk7CiAgICAgICAgJHRoaXMtPmFwcGVuZERlYnVnKCR0aGlzLT52YXJEdW1wKCR0aGlzLT5tZXRob2RyZXR1cm4pKTsKCQkkdGhpcy0+ZGVidWcoImluIGludm9rZV9tZXRob2QsIGNhbGxlZCBtZXRob2QgJHRoaXMtPm1ldGhvZG5hbWUsIHJlY2VpdmVkICR0aGlzLT5tZXRob2RyZXR1cm4gb2YgdHlwZSAiLmdldHR5cGUoJHRoaXMtPm1ldGhvZHJldHVybikpOwoJfQoKCS8qKgoJKiBzZXJpYWxpemVzIHRoZSByZXR1cm4gdmFsdWUgZnJvbSBhIFBIUCBmdW5jdGlvbiBpbnRvIGEgZnVsbCBTT0FQIEVudmVsb3BlCgkqCgkqIFRoZSBmb2xsb3dpbmcgZmllbGRzIGFyZSBzZXQgYnkgdGhpcyBmdW5jdGlvbiAod2hlbiBzdWNjZXNzZnVsKQoJKgoJKiByZXNwb25zZVNPQVAKCSoKCSogVGhpcyBzZXRzIHRoZSBmYXVsdCBmaWVsZCBvbiBlcnJvcgoJKgoJKiBAYWNjZXNzICAgcHJpdmF0ZQoJKi8KCWZ1bmN0aW9uIHNlcmlhbGl6ZV9yZXR1cm4oKSB7CgkJJHRoaXMtPmRlYnVnKCdFbnRlcmluZyBzZXJpYWxpemVfcmV0dXJuIG1ldGhvZG5hbWU6ICcgLiAkdGhpcy0+bWV0aG9kbmFtZSAuICcgbWV0aG9kVVJJOiAnIC4gJHRoaXMtPm1ldGhvZFVSSSk7CgkJLy8gaWYgZmF1bHQKCQlpZiAoaXNzZXQoJHRoaXMtPm1ldGhvZHJldHVybikgJiYgKGdldF9jbGFzcygkdGhpcy0+bWV0aG9kcmV0dXJuKSA9PSAnc29hcF9mYXVsdCcpKSB7CgkJCSR0aGlzLT5kZWJ1ZygnZ290IGEgZmF1bHQgb2JqZWN0IGZyb20gbWV0aG9kJyk7CgkJCSR0aGlzLT5mYXVsdCA9ICR0aGlzLT5tZXRob2RyZXR1cm47CgkJCXJldHVybjsKCQl9IGVsc2VpZiAoJHRoaXMtPm1ldGhvZHJldHVybmlzbGl0ZXJhbHhtbCkgewoJCQkkcmV0dXJuX3ZhbCA9ICR0aGlzLT5tZXRob2RyZXR1cm47CgkJLy8gcmV0dXJuZWQgdmFsdWUocykKCQl9IGVsc2UgewoJCQkkdGhpcy0+ZGVidWcoJ2dvdCBhKG4pICcuZ2V0dHlwZSgkdGhpcy0+bWV0aG9kcmV0dXJuKS4nIGZyb20gbWV0aG9kJyk7CgkJCSR0aGlzLT5kZWJ1Zygnc2VyaWFsaXppbmcgcmV0dXJuIHZhbHVlJyk7CgkJCWlmKCR0aGlzLT53c2RsKXsKCQkJCS8vIHdlYWsgYXR0ZW1wdCBhdCBzdXBwb3J0aW5nIG11bHRpcGxlIG91dHB1dCBwYXJhbXMKCQkJCWlmKHNpemVvZigkdGhpcy0+b3BEYXRhWydvdXRwdXQnXVsncGFydHMnXSkgPiAxKXsKCQkJICAgIAkkb3BQYXJhbXMgPSAkdGhpcy0+bWV0aG9kcmV0dXJuOwoJCQkgICAgfSBlbHNlIHsKCQkJICAgIAkvLyBUT0RPOiBpcyB0aGlzIHJlYWxseSBuZWNlc3Nhcnk/CgkJCSAgICAJJG9wUGFyYW1zID0gYXJyYXkoJHRoaXMtPm1ldGhvZHJldHVybik7CgkJCSAgICB9CgkJCSAgICAkcmV0dXJuX3ZhbCA9ICR0aGlzLT53c2RsLT5zZXJpYWxpemVSUENQYXJhbWV0ZXJzKCR0aGlzLT5tZXRob2RuYW1lLCdvdXRwdXQnLCRvcFBhcmFtcyk7CgkJCSAgICAkdGhpcy0+YXBwZW5kRGVidWcoJHRoaXMtPndzZGwtPmdldERlYnVnKCkpOwoJCQkgICAgJHRoaXMtPndzZGwtPmNsZWFyRGVidWcoKTsKCQkJCWlmKCRlcnJzdHIgPSAkdGhpcy0+d3NkbC0+Z2V0RXJyb3IoKSl7CgkJCQkJJHRoaXMtPmRlYnVnKCdnb3Qgd3NkbCBlcnJvcjogJy4kZXJyc3RyKTsKCQkJCQkkdGhpcy0+ZmF1bHQoJ1NlcnZlcicsICd1bmFibGUgdG8gc2VyaWFsaXplIHJlc3VsdCcpOwoJCQkJCXJldHVybjsKCQkJCX0KCQkJfSBlbHNlIHsKCQkJCWlmIChpc3NldCgkdGhpcy0+bWV0aG9kcmV0dXJuKSkgewoJCQkJCSRyZXR1cm5fdmFsID0gJHRoaXMtPnNlcmlhbGl6ZV92YWwoJHRoaXMtPm1ldGhvZHJldHVybiwgJ3JldHVybicpOwoJCQkJfSBlbHNlIHsKCQkJCQkkcmV0dXJuX3ZhbCA9ICcnOwoJCQkJCSR0aGlzLT5kZWJ1ZygnaW4gYWJzZW5jZSBvZiBXU0RMLCBhc3N1bWUgdm9pZCByZXR1cm4gZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHknKTsKCQkJCX0KCQkJfQoJCX0KCQkkdGhpcy0+ZGVidWcoJ3JldHVybiB2YWx1ZTonKTsKCQkkdGhpcy0+YXBwZW5kRGVidWcoJHRoaXMtPnZhckR1bXAoJHJldHVybl92YWwpKTsKCgkJJHRoaXMtPmRlYnVnKCdzZXJpYWxpemluZyByZXNwb25zZScpOwoJCWlmICgkdGhpcy0+d3NkbCkgewoJCQkkdGhpcy0+ZGVidWcoJ2hhdmUgV1NETCBmb3Igc2VyaWFsaXphdGlvbjogc3R5bGUgaXMgJyAuICR0aGlzLT5vcERhdGFbJ3N0eWxlJ10pOwoJCQlpZiAoJHRoaXMtPm9wRGF0YVsnc3R5bGUnXSA9PSAncnBjJykgewoJCQkJJHRoaXMtPmRlYnVnKCdzdHlsZSBpcyBycGMgZm9yIHNlcmlhbGl6YXRpb246IHVzZSBpcyAnIC4gJHRoaXMtPm9wRGF0YVsnb3V0cHV0J11bJ3VzZSddKTsKCQkJCWlmICgkdGhpcy0+b3BEYXRhWydvdXRwdXQnXVsndXNlJ10gPT0gJ2xpdGVyYWwnKSB7CgkJCQkJJHBheWxvYWQgPSAnPCcuJHRoaXMtPm1ldGhvZG5hbWUuJ1Jlc3BvbnNlIHhtbG5zPSInLiR0aGlzLT5tZXRob2RVUkkuJyI+Jy4kcmV0dXJuX3ZhbC4nPC8nLiR0aGlzLT5tZXRob2RuYW1lLiJSZXNwb25zZT4iOwoJCQkJfSBlbHNlIHsKCQkJCQkkcGF5bG9hZCA9ICc8bnMxOicuJHRoaXMtPm1ldGhvZG5hbWUuJ1Jlc3BvbnNlIHhtbG5zOm5zMT0iJy4kdGhpcy0+bWV0aG9kVVJJLiciPicuJHJldHVybl92YWwuJzwvbnMxOicuJHRoaXMtPm1ldGhvZG5hbWUuIlJlc3BvbnNlPiI7CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQkkdGhpcy0+ZGVidWcoJ3N0eWxlIGlzIG5vdCBycGMgZm9yIHNlcmlhbGl6YXRpb246IGFzc3VtZSBkb2N1bWVudCcpOwoJCQkJJHBheWxvYWQgPSAkcmV0dXJuX3ZhbDsKCQkJfQoJCX0gZWxzZSB7CgkJCSR0aGlzLT5kZWJ1ZygnZG8gbm90IGhhdmUgV1NETCBmb3Igc2VyaWFsaXphdGlvbjogYXNzdW1lIHJwYy9lbmNvZGVkJyk7CgkJCSRwYXlsb2FkID0gJzxuczE6Jy4kdGhpcy0+bWV0aG9kbmFtZS4nUmVzcG9uc2UgeG1sbnM6bnMxPSInLiR0aGlzLT5tZXRob2RVUkkuJyI+Jy4kcmV0dXJuX3ZhbC4nPC9uczE6Jy4kdGhpcy0+bWV0aG9kbmFtZS4iUmVzcG9uc2U+IjsKCQl9CgkJJHRoaXMtPnJlc3VsdCA9ICdzdWNjZXNzZnVsJzsKCQlpZigkdGhpcy0+d3NkbCl7CgkJCS8vaWYoJHRoaXMtPmRlYnVnX2ZsYWcpewogICAgICAgICAgICAJJHRoaXMtPmFwcGVuZERlYnVnKCR0aGlzLT53c2RsLT5nZXREZWJ1ZygpKTsKICAgICAgICAgICAgLy8JfQoJCQlpZiAoaXNzZXQoJG9wRGF0YVsnb3V0cHV0J11bJ2VuY29kaW5nU3R5bGUnXSkpIHsKCQkJCSRlbmNvZGluZ1N0eWxlID0gJG9wRGF0YVsnb3V0cHV0J11bJ2VuY29kaW5nU3R5bGUnXTsKCQkJfSBlbHNlIHsKCQkJCSRlbmNvZGluZ1N0eWxlID0gJyc7CgkJCX0KCQkJLy8gQWRkZWQ6IEluIGNhc2Ugd2UgdXNlIGEgV1NETCwgcmV0dXJuIGEgc2VyaWFsaXplZCBlbnYuIFdJVEggdGhlIHVzZWROYW1lc3BhY2VzLgoJCQkkdGhpcy0+cmVzcG9uc2VTT0FQID0gJHRoaXMtPnNlcmlhbGl6ZUVudmVsb3BlKCRwYXlsb2FkLCR0aGlzLT5yZXNwb25zZUhlYWRlcnMsJHRoaXMtPndzZGwtPnVzZWROYW1lc3BhY2VzLCR0aGlzLT5vcERhdGFbJ3N0eWxlJ10sJGVuY29kaW5nU3R5bGUpOwoJCX0gZWxzZSB7CgkJCSR0aGlzLT5yZXNwb25zZVNPQVAgPSAkdGhpcy0+c2VyaWFsaXplRW52ZWxvcGUoJHBheWxvYWQsJHRoaXMtPnJlc3BvbnNlSGVhZGVycyk7CgkJfQoJCSR0aGlzLT5kZWJ1ZygiTGVhdmluZyBzZXJpYWxpemVfcmV0dXJuIik7Cgl9CgoJLyoqCgkqIHNlbmRzIGFuIEhUVFAgcmVzcG9uc2UKCSoKCSogVGhlIGZvbGxvd2luZyBmaWVsZHMgYXJlIHNldCBieSB0aGlzIGZ1bmN0aW9uICh3aGVuIHN1Y2Nlc3NmdWwpCgkqCgkqIG91dGdvaW5nX2hlYWRlcnMKCSogcmVzcG9uc2UKCSoKCSogQGFjY2VzcyAgIHByaXZhdGUKCSovCglmdW5jdGlvbiBzZW5kX3Jlc3BvbnNlKCkgewoJCSR0aGlzLT5kZWJ1ZygnRW50ZXIgc2VuZF9yZXNwb25zZScpOwoJCWlmICgkdGhpcy0+ZmF1bHQpIHsKCQkJJHBheWxvYWQgPSAkdGhpcy0+ZmF1bHQtPnNlcmlhbGl6ZSgpOwoJCQkkdGhpcy0+b3V0Z29pbmdfaGVhZGVyc1tdID0gIkhUVFAvMS4wIDUwMCBJbnRlcm5hbCBTZXJ2ZXIgRXJyb3IiOwoJCQkkdGhpcy0+b3V0Z29pbmdfaGVhZGVyc1tdID0gIlN0YXR1czogNTAwIEludGVybmFsIFNlcnZlciBFcnJvciI7CgkJfSBlbHNlIHsKCQkJJHBheWxvYWQgPSAkdGhpcy0+cmVzcG9uc2VTT0FQOwoJCQkvLyBTb21lIGNvbWJpbmF0aW9ucyBvZiBQSFArV2ViIHNlcnZlciBhbGxvdyB0aGUgU3RhdHVzCgkJCS8vIHRvIGNvbWUgdGhyb3VnaCBhcyBhIGhlYWRlci4gIFNpbmNlIE9LIGlzIHRoZSBkZWZhdWx0CgkJCS8vIGp1c3QgZG8gbm90aGluZy4KCQkJLy8gJHRoaXMtPm91dGdvaW5nX2hlYWRlcnNbXSA9ICJIVFRQLzEuMCAyMDAgT0siOwoJCQkvLyAkdGhpcy0+b3V0Z29pbmdfaGVhZGVyc1tdID0gIlN0YXR1czogMjAwIE9LIjsKCQl9CiAgICAgICAgLy8gYWRkIGRlYnVnIGRhdGEgaWYgaW4gZGVidWcgbW9kZQoJCWlmKGlzc2V0KCR0aGlzLT5kZWJ1Z19mbGFnKSAmJiAkdGhpcy0+ZGVidWdfZmxhZyl7CiAgICAgICAgCSRwYXlsb2FkIC49ICR0aGlzLT5nZXREZWJ1Z0FzWE1MQ29tbWVudCgpOwogICAgICAgIH0KCQkkdGhpcy0+b3V0Z29pbmdfaGVhZGVyc1tdID0gIlNlcnZlcjogJHRoaXMtPnRpdGxlIFNlcnZlciB2JHRoaXMtPnZlcnNpb24iOwoJCWVyZWcoJ1wkUmV2aXNpbycgLiAnbjogKFteIF0rKScsICR0aGlzLT5yZXZpc2lvbiwgJHJldik7CgkJJHRoaXMtPm91dGdvaW5nX2hlYWRlcnNbXSA9ICJYLVNPQVAtU2VydmVyOiAkdGhpcy0+dGl0bGUvJHRoaXMtPnZlcnNpb24gKCIuJHJldlsxXS4iKSI7CgkJLy8gTGV0IHRoZSBXZWIgc2VydmVyIGRlY2lkZSBhYm91dCB0aGlzCgkJLy8kdGhpcy0+b3V0Z29pbmdfaGVhZGVyc1tdID0gIkNvbm5lY3Rpb246IENsb3NlXHJcbiI7CgkJJHBheWxvYWQgPSAkdGhpcy0+Z2V0SFRUUEJvZHkoJHBheWxvYWQpOwoJCSR0eXBlID0gJHRoaXMtPmdldEhUVFBDb250ZW50VHlwZSgpOwoJCSRjaGFyc2V0ID0gJHRoaXMtPmdldEhUVFBDb250ZW50VHlwZUNoYXJzZXQoKTsKCQkkdGhpcy0+b3V0Z29pbmdfaGVhZGVyc1tdID0gIkNvbnRlbnQtVHlwZTogJHR5cGUiIC4gKCRjaGFyc2V0ID8gJzsgY2hhcnNldD0nIC4gJGNoYXJzZXQgOiAnJyk7CgkJLy9iZWdpbiBjb2RlIHRvIGNvbXByZXNzIHBheWxvYWQgLSBieSBKb2huCgkJLy8gTk9URTogdGhlcmUgaXMgbm8gd2F5IHRvIGtub3cgd2hldGhlciB0aGUgV2ViIHNlcnZlciB3aWxsIGFsc28gY29tcHJlc3MKCQkvLyB0aGlzIGRhdGEuCgkJaWYgKHN0cmxlbigkcGF5bG9hZCkgPiAxMDI0ICYmIGlzc2V0KCR0aGlzLT5oZWFkZXJzKSAmJiBpc3NldCgkdGhpcy0+aGVhZGVyc1snYWNjZXB0LWVuY29kaW5nJ10pKSB7CQoJCQlpZiAoc3Ryc3RyKCR0aGlzLT5oZWFkZXJzWydhY2NlcHQtZW5jb2RpbmcnXSwgJ2d6aXAnKSkgewoJCQkJaWYgKGZ1bmN0aW9uX2V4aXN0cygnZ3plbmNvZGUnKSkgewoJCQkJCWlmIChpc3NldCgkdGhpcy0+ZGVidWdfZmxhZykgJiYgJHRoaXMtPmRlYnVnX2ZsYWcpIHsKCQkJCQkJJHBheWxvYWQgLj0gIjwhLS0gQ29udGVudCBiZWluZyBnemlwcGVkIC0tPiI7CgkJCQkJfQoJCQkJCSR0aGlzLT5vdXRnb2luZ19oZWFkZXJzW10gPSAiQ29udGVudC1FbmNvZGluZzogZ3ppcCI7CgkJCQkJJHBheWxvYWQgPSBnemVuY29kZSgkcGF5bG9hZCk7CgkJCQl9IGVsc2UgewoJCQkJCWlmIChpc3NldCgkdGhpcy0+ZGVidWdfZmxhZykgJiYgJHRoaXMtPmRlYnVnX2ZsYWcpIHsKCQkJCQkJJHBheWxvYWQgLj0gIjwhLS0gQ29udGVudCB3aWxsIG5vdCBiZSBnemlwcGVkOiBubyBnemVuY29kZSAtLT4iOwoJCQkJCX0KCQkJCX0KCQkJfSBlbHNlaWYgKHN0cnN0cigkdGhpcy0+aGVhZGVyc1snYWNjZXB0LWVuY29kaW5nJ10sICdkZWZsYXRlJykpIHsKCQkJCS8vIE5vdGU6IE1TSUUgcmVxdWlyZXMgZ3pkZWZsYXRlIG91dHB1dCAobm8gWmxpYiBoZWFkZXIgYW5kIGNoZWNrc3VtKSwKCQkJCS8vIGluc3RlYWQgb2YgZ3pjb21wcmVzcyBvdXRwdXQsCgkJCQkvLyB3aGljaCBjb25mbGljdHMgd2l0aCBIVFRQIDEuMSBzcGVjIChodHRwOi8vd3d3LnczLm9yZy9Qcm90b2NvbHMvcmZjMjYxNi9yZmMyNjE2LXNlYzMuaHRtbCNzZWMzLjUpCgkJCQlpZiAoZnVuY3Rpb25fZXhpc3RzKCdnemRlZmxhdGUnKSkgewoJCQkJCWlmIChpc3NldCgkdGhpcy0+ZGVidWdfZmxhZykgJiYgJHRoaXMtPmRlYnVnX2ZsYWcpIHsKCQkJCQkJJHBheWxvYWQgLj0gIjwhLS0gQ29udGVudCBiZWluZyBkZWZsYXRlZCAtLT4iOwoJCQkJCX0KCQkJCQkkdGhpcy0+b3V0Z29pbmdfaGVhZGVyc1tdID0gIkNvbnRlbnQtRW5jb2Rpbmc6IGRlZmxhdGUiOwoJCQkJCSRwYXlsb2FkID0gZ3pkZWZsYXRlKCRwYXlsb2FkKTsKCQkJCX0gZWxzZSB7CgkJCQkJaWYgKGlzc2V0KCR0aGlzLT5kZWJ1Z19mbGFnKSAmJiAkdGhpcy0+ZGVidWdfZmxhZykgewoJCQkJCQkkcGF5bG9hZCAuPSAiPCEtLSBDb250ZW50IHdpbGwgbm90IGJlIGRlZmxhdGVkOiBubyBnemNvbXByZXNzIC0tPiI7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoJCS8vZW5kIGNvZGUKCQkkdGhpcy0+b3V0Z29pbmdfaGVhZGVyc1tdID0gIkNvbnRlbnQtTGVuZ3RoOiAiLnN0cmxlbigkcGF5bG9hZCk7CgkJcmVzZXQoJHRoaXMtPm91dGdvaW5nX2hlYWRlcnMpOwoJCWZvcmVhY2goJHRoaXMtPm91dGdvaW5nX2hlYWRlcnMgYXMgJGhkcil7CgkJCWhlYWRlcigkaGRyLCBmYWxzZSk7CgkJfQoJCXByaW50ICRwYXlsb2FkOwoJCSR0aGlzLT5yZXNwb25zZSA9IGpvaW4oIlxyXG4iLCR0aGlzLT5vdXRnb2luZ19oZWFkZXJzKS4iXHJcblxyXG4iLiRwYXlsb2FkOwoJfQoKCS8qKgoJKiB0YWtlcyB0aGUgdmFsdWUgdGhhdCB3YXMgY3JlYXRlZCBieSBwYXJzaW5nIHRoZSByZXF1ZXN0CgkqIGFuZCBjb21wYXJlcyB0byB0aGUgbWV0aG9kJ3Mgc2lnbmF0dXJlLCBpZiBhdmFpbGFibGUuCgkqCgkqIEBwYXJhbQlzdHJpbmcJJG9wZXJhdGlvbglUaGUgb3BlcmF0aW9uIHRvIGJlIGludm9rZWQKCSogQHBhcmFtCWFycmF5CSRyZXF1ZXN0CVRoZSBhcnJheSBvZiBwYXJhbWV0ZXIgdmFsdWVzCgkqIEByZXR1cm4JYm9vbGVhbglXaGV0aGVyIHRoZSBvcGVyYXRpb24gd2FzIGZvdW5kCgkqIEBhY2Nlc3MgICBwcml2YXRlCgkqLwoJZnVuY3Rpb24gdmVyaWZ5X21ldGhvZCgkb3BlcmF0aW9uLCRyZXF1ZXN0KXsKCQlpZihpc3NldCgkdGhpcy0+d3NkbCkgJiYgaXNfb2JqZWN0KCR0aGlzLT53c2RsKSl7CgkJCWlmKCR0aGlzLT53c2RsLT5nZXRPcGVyYXRpb25EYXRhKCRvcGVyYXRpb24pKXsKCQkJCXJldHVybiB0cnVlOwoJCQl9CgkgICAgfSBlbHNlaWYoaXNzZXQoJHRoaXMtPm9wZXJhdGlvbnNbJG9wZXJhdGlvbl0pKXsKCQkJcmV0dXJuIHRydWU7CgkJfQoJCXJldHVybiBmYWxzZTsKCX0KCgkvKioKCSogcHJvY2Vzc2VzIFNPQVAgbWVzc2FnZSByZWNlaXZlZCBmcm9tIGNsaWVudAoJKgoJKiBAcGFyYW0JYXJyYXkJJGhlYWRlcnMJVGhlIEhUVFAgaGVhZGVycwoJKiBAcGFyYW0Jc3RyaW5nCSRkYXRhCQl1bnByb2Nlc3NlZCByZXF1ZXN0IGRhdGEgZnJvbSBjbGllbnQKCSogQHJldHVybgltaXhlZAl2YWx1ZSBvZiB0aGUgbWVzc2FnZSwgZGVjb2RlZCBpbnRvIGEgUEhQIHR5cGUKCSogQGFjY2VzcyAgIHByaXZhdGUKCSovCiAgICBmdW5jdGlvbiBwYXJzZVJlcXVlc3QoJGhlYWRlcnMsICRkYXRhKSB7CgkJJHRoaXMtPmRlYnVnKCdFbnRlcmluZyBwYXJzZVJlcXVlc3QoKSBmb3IgZGF0YSBvZiBsZW5ndGggJyAuIHN0cmxlbigkZGF0YSkgLiAnIGFuZCB0eXBlICcgLiAkaGVhZGVyc1snY29udGVudC10eXBlJ10pOwoJCWlmICghc3Ryc3RyKCRoZWFkZXJzWydjb250ZW50LXR5cGUnXSwgJ3RleHQveG1sJykpIHsKCQkJJHRoaXMtPnNldEVycm9yKCdSZXF1ZXN0IG5vdCBvZiB0eXBlIHRleHQveG1sJyk7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJaWYgKHN0cnBvcygkaGVhZGVyc1snY29udGVudC10eXBlJ10sICc9JykpIHsKCQkJJGVuYyA9IHN0cl9yZXBsYWNlKCciJywgJycsIHN1YnN0cihzdHJzdHIoJGhlYWRlcnNbImNvbnRlbnQtdHlwZSJdLCAnPScpLCAxKSk7CgkJCSR0aGlzLT5kZWJ1ZygnR290IHJlc3BvbnNlIGVuY29kaW5nOiAnIC4gJGVuYyk7CgkJCWlmKGVyZWdpKCdeKElTTy04ODU5LTF8VVMtQVNDSUl8VVRGLTgpJCcsJGVuYykpewoJCQkJJHRoaXMtPnhtbF9lbmNvZGluZyA9IHN0cnRvdXBwZXIoJGVuYyk7CgkJCX0gZWxzZSB7CgkJCQkkdGhpcy0+eG1sX2VuY29kaW5nID0gJ1VTLUFTQ0lJJzsKCQkJfQoJCX0gZWxzZSB7CgkJCS8vIHNob3VsZCBiZSBVUy1BU0NJSSBmb3IgSFRUUCAxLjAgb3IgSVNPLTg4NTktMSBmb3IgSFRUUCAxLjEKCQkJJHRoaXMtPnhtbF9lbmNvZGluZyA9ICdJU08tODg1OS0xJzsKCQl9CgkJJHRoaXMtPmRlYnVnKCdVc2UgZW5jb2Rpbmc6ICcgLiAkdGhpcy0+eG1sX2VuY29kaW5nIC4gJyB3aGVuIGNyZWF0aW5nIHNvYXBfcGFyc2VyJyk7CgkJLy8gcGFyc2UgcmVzcG9uc2UsIGdldCBzb2FwIHBhcnNlciBvYmoKCQkkcGFyc2VyID0gbmV3IHNvYXBfcGFyc2VyKCRkYXRhLCR0aGlzLT54bWxfZW5jb2RpbmcsJycsJHRoaXMtPmRlY29kZV91dGY4KTsKCQkvLyBwYXJzZXIgZGVidWcKCQkkdGhpcy0+ZGVidWcoInBhcnNlciBkZWJ1ZzogXG4iLiRwYXJzZXItPmdldERlYnVnKCkpOwoJCS8vIGlmIGZhdWx0IG9jY3VycmVkIGR1cmluZyBtZXNzYWdlIHBhcnNpbmcKCQlpZigkZXJyID0gJHBhcnNlci0+Z2V0RXJyb3IoKSl7CgkJCSR0aGlzLT5yZXN1bHQgPSAnZmF1bHQ6IGVycm9yIGluIG1zZyBwYXJzaW5nOiAnLiRlcnI7CgkJCSR0aGlzLT5mYXVsdCgnQ2xpZW50JywiZXJyb3IgaW4gbXNnIHBhcnNpbmc6XG4iLiRlcnIpOwoJCS8vIGVsc2Ugc3VjY2Vzc2Z1bGx5IHBhcnNlZCByZXF1ZXN0IGludG8gc29hcHZhbCBvYmplY3QKCQl9IGVsc2UgewoJCQkvLyBnZXQvc2V0IG1ldGhvZG5hbWUKCQkJJHRoaXMtPm1ldGhvZFVSSSA9ICRwYXJzZXItPnJvb3Rfc3RydWN0X25hbWVzcGFjZTsKCQkJJHRoaXMtPm1ldGhvZG5hbWUgPSAkcGFyc2VyLT5yb290X3N0cnVjdF9uYW1lOwoJCQkkdGhpcy0+ZGVidWcoJ21ldGhvZG5hbWU6ICcuJHRoaXMtPm1ldGhvZG5hbWUuJyBtZXRob2RVUkk6ICcuJHRoaXMtPm1ldGhvZFVSSSk7CgkJCSR0aGlzLT5kZWJ1ZygnY2FsbGluZyBwYXJzZXItPmdldF9yZXNwb25zZSgpJyk7CgkJCSR0aGlzLT5tZXRob2RwYXJhbXMgPSAkcGFyc2VyLT5nZXRfcmVzcG9uc2UoKTsKCQkJLy8gZ2V0IFNPQVAgaGVhZGVycwoJCQkkdGhpcy0+cmVxdWVzdEhlYWRlcnMgPSAkcGFyc2VyLT5nZXRIZWFkZXJzKCk7CiAgICAgICAgICAgIC8vIGFkZCBkb2N1bWVudCBmb3IgZG9jbGl0IHN1cHBvcnQKICAgICAgICAgICAgJHRoaXMtPmRvY3VtZW50ID0gJHBhcnNlci0+ZG9jdW1lbnQ7CgkJfQoJIH0KCgkvKioKCSogZ2V0cyB0aGUgSFRUUCBib2R5IGZvciB0aGUgY3VycmVudCByZXNwb25zZS4KCSoKCSogQHBhcmFtIHN0cmluZyAkc29hcG1zZyBUaGUgU09BUCBwYXlsb2FkCgkqIEByZXR1cm4gc3RyaW5nIFRoZSBIVFRQIGJvZHksIHdoaWNoIGluY2x1ZGVzIHRoZSBTT0FQIHBheWxvYWQKCSogQGFjY2VzcyBwcml2YXRlCgkqLwoJZnVuY3Rpb24gZ2V0SFRUUEJvZHkoJHNvYXBtc2cpIHsKCQlyZXR1cm4gJHNvYXBtc2c7Cgl9CgkKCS8qKgoJKiBnZXRzIHRoZSBIVFRQIGNvbnRlbnQgdHlwZSBmb3IgdGhlIGN1cnJlbnQgcmVzcG9uc2UuCgkqCgkqIE5vdGU6IGdldEhUVFBCb2R5IG11c3QgYmUgY2FsbGVkIGJlZm9yZSB0aGlzLgoJKgoJKiBAcmV0dXJuIHN0cmluZyB0aGUgSFRUUCBjb250ZW50IHR5cGUgZm9yIHRoZSBjdXJyZW50IHJlc3BvbnNlLgoJKiBAYWNjZXNzIHByaXZhdGUKCSovCglmdW5jdGlvbiBnZXRIVFRQQ29udGVudFR5cGUoKSB7CgkJcmV0dXJuICd0ZXh0L3htbCc7Cgl9CgkKCS8qKgoJKiBnZXRzIHRoZSBIVFRQIGNvbnRlbnQgdHlwZSBjaGFyc2V0IGZvciB0aGUgY3VycmVudCByZXNwb25zZS4KCSogcmV0dXJucyBmYWxzZSBmb3Igbm9uLXRleHQgY29udGVudCB0eXBlcy4KCSoKCSogTm90ZTogZ2V0SFRUUEJvZHkgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHRoaXMuCgkqCgkqIEByZXR1cm4gc3RyaW5nIHRoZSBIVFRQIGNvbnRlbnQgdHlwZSBjaGFyc2V0IGZvciB0aGUgY3VycmVudCByZXNwb25zZS4KCSogQGFjY2VzcyBwcml2YXRlCgkqLwoJZnVuY3Rpb24gZ2V0SFRUUENvbnRlbnRUeXBlQ2hhcnNldCgpIHsKCQlyZXR1cm4gJHRoaXMtPnNvYXBfZGVmZW5jb2Rpbmc7Cgl9CgoJLyoqCgkqIGFkZCBhIG1ldGhvZCB0byB0aGUgZGlzcGF0Y2ggbWFwICh0aGlzIGhhcyBiZWVuIHJlcGxhY2VkIGJ5IHRoZSByZWdpc3RlciBtZXRob2QpCgkqCgkqIEBwYXJhbSAgICBzdHJpbmcgJG1ldGhvZG5hbWUKCSogQHBhcmFtICAgIHN0cmluZyAkaW4gYXJyYXkgb2YgaW5wdXQgdmFsdWVzCgkqIEBwYXJhbSAgICBzdHJpbmcgJG91dCBhcnJheSBvZiBvdXRwdXQgdmFsdWVzCgkqIEBhY2Nlc3MgICBwdWJsaWMKCSogQGRlcHJlY2F0ZWQKCSovCglmdW5jdGlvbiBhZGRfdG9fbWFwKCRtZXRob2RuYW1lLCRpbiwkb3V0KXsKCQkJJHRoaXMtPm9wZXJhdGlvbnNbJG1ldGhvZG5hbWVdID0gYXJyYXkoJ25hbWUnID0+ICRtZXRob2RuYW1lLCdpbicgPT4gJGluLCdvdXQnID0+ICRvdXQpOwoJfQoKCS8qKgoJKiByZWdpc3RlciBhIHNlcnZpY2UgZnVuY3Rpb24gd2l0aCB0aGUgc2VydmVyCgkqCgkqIEBwYXJhbSAgICBzdHJpbmcgJG5hbWUgdGhlIG5hbWUgb2YgdGhlIFBIUCBmdW5jdGlvbiwgY2xhc3MubWV0aG9kIG9yIGNsYXNzLi5tZXRob2QKCSogQHBhcmFtICAgIGFycmF5ICRpbiBhc3NvYyBhcnJheSBvZiBpbnB1dCB2YWx1ZXM6IGtleSA9IHBhcmFtIG5hbWUsIHZhbHVlID0gcGFyYW0gdHlwZQoJKiBAcGFyYW0gICAgYXJyYXkgJG91dCBhc3NvYyBhcnJheSBvZiBvdXRwdXQgdmFsdWVzOiBrZXkgPSBwYXJhbSBuYW1lLCB2YWx1ZSA9IHBhcmFtIHR5cGUKCSogQHBhcmFtCW1peGVkICRuYW1lc3BhY2UgdGhlIGVsZW1lbnQgbmFtZXNwYWNlIGZvciB0aGUgbWV0aG9kIG9yIGZhbHNlCgkqIEBwYXJhbQltaXhlZCAkc29hcGFjdGlvbiB0aGUgc29hcGFjdGlvbiBmb3IgdGhlIG1ldGhvZCBvciBmYWxzZQoJKiBAcGFyYW0JbWl4ZWQgJHN0eWxlIG9wdGlvbmFsIChycGN8ZG9jdW1lbnQpIG9yIGZhbHNlIE5vdGU6IHdoZW4gJ2RvY3VtZW50JyBpcyBzcGVjaWZpZWQsIHBhcmFtZXRlciBhbmQgcmV0dXJuIHdyYXBwZXJzIGFyZSBjcmVhdGVkIGZvciB5b3UgYXV0b21hdGljYWxseQoJKiBAcGFyYW0JbWl4ZWQgJHVzZSBvcHRpb25hbCAoZW5jb2RlZHxsaXRlcmFsKSBvciBmYWxzZQoJKiBAcGFyYW0Jc3RyaW5nICRkb2N1bWVudGF0aW9uIG9wdGlvbmFsIERlc2NyaXB0aW9uIHRvIGluY2x1ZGUgaW4gV1NETAoJKiBAcGFyYW0Jc3RyaW5nICRlbmNvZGluZ1N0eWxlIG9wdGlvbmFsICh1c3VhbGx5ICdodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLycgZm9yIGVuY29kZWQpCgkqIEBhY2Nlc3MgICBwdWJsaWMKCSovCglmdW5jdGlvbiByZWdpc3RlcigkbmFtZSwkaW49YXJyYXkoKSwkb3V0PWFycmF5KCksJG5hbWVzcGFjZT1mYWxzZSwkc29hcGFjdGlvbj1mYWxzZSwkc3R5bGU9ZmFsc2UsJHVzZT1mYWxzZSwkZG9jdW1lbnRhdGlvbj0nJywkZW5jb2RpbmdTdHlsZT0nJyl7CgkJZ2xvYmFsICRIVFRQX1NFUlZFUl9WQVJTOwoKCQlpZigkdGhpcy0+ZXh0ZXJuYWxXU0RMVVJMKXsKCQkJZGllKCdZb3UgY2Fubm90IGJpbmQgdG8gYW4gZXh0ZXJuYWwgV1NETCBmaWxlLCBhbmQgcmVnaXN0ZXIgbWV0aG9kcyBvdXRzaWRlIG9mIGl0ISBQbGVhc2UgY2hvb3NlIGVpdGhlciBXU0RMIG9yIG5vIFdTREwuJyk7CgkJfQoJCWlmICghICRuYW1lKSB7CgkJCWRpZSgnWW91IG11c3Qgc3BlY2lmeSBhIG5hbWUgd2hlbiB5b3UgcmVnaXN0ZXIgYW4gb3BlcmF0aW9uJyk7CgkJfQoJCWlmICghaXNfYXJyYXkoJGluKSkgewoJCQlkaWUoJ1lvdSBtdXN0IHByb3ZpZGUgYW4gYXJyYXkgZm9yIG9wZXJhdGlvbiBpbnB1dHMnKTsKCQl9CgkJaWYgKCFpc19hcnJheSgkb3V0KSkgewoJCQlkaWUoJ1lvdSBtdXN0IHByb3ZpZGUgYW4gYXJyYXkgZm9yIG9wZXJhdGlvbiBvdXRwdXRzJyk7CgkJfQoJCWlmKGZhbHNlID09ICRuYW1lc3BhY2UpIHsKCQl9CgkJaWYoZmFsc2UgPT0gJHNvYXBhY3Rpb24pIHsKCQkJaWYgKGlzc2V0KCRfU0VSVkVSKSkgewoJCQkJJFNFUlZFUl9OQU1FID0gJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ107CgkJCQkkU0NSSVBUX05BTUUgPSBpc3NldCgkX1NFUlZFUlsnUEhQX1NFTEYnXSkgPyAkX1NFUlZFUlsnUEhQX1NFTEYnXSA6ICRfU0VSVkVSWydTQ1JJUFRfTkFNRSddOwoJCQl9IGVsc2VpZiAoaXNzZXQoJEhUVFBfU0VSVkVSX1ZBUlMpKSB7CgkJCQkkU0VSVkVSX05BTUUgPSAkSFRUUF9TRVJWRVJfVkFSU1snU0VSVkVSX05BTUUnXTsKCQkJCSRTQ1JJUFRfTkFNRSA9IGlzc2V0KCRIVFRQX1NFUlZFUl9WQVJTWydQSFBfU0VMRiddKSA/ICRIVFRQX1NFUlZFUl9WQVJTWydQSFBfU0VMRiddIDogJEhUVFBfU0VSVkVSX1ZBUlNbJ1NDUklQVF9OQU1FJ107CgkJCX0gZWxzZSB7CgkJCQkkdGhpcy0+c2V0RXJyb3IoIk5laXRoZXIgX1NFUlZFUiBub3IgSFRUUF9TRVJWRVJfVkFSUyBpcyBhdmFpbGFibGUiKTsKCQkJfQoJCQkkc29hcGFjdGlvbiA9ICJodHRwOi8vJFNFUlZFUl9OQU1FJFNDUklQVF9OQU1FLyRuYW1lIjsKCQl9CgkJaWYoZmFsc2UgPT0gJHN0eWxlKSB7CgkJCSRzdHlsZSA9ICJycGMiOwoJCX0KCQlpZihmYWxzZSA9PSAkdXNlKSB7CgkJCSR1c2UgPSAiZW5jb2RlZCI7CgkJfQoJCWlmICgkdXNlID09ICdlbmNvZGVkJyAmJiAkZW5jb2RpbmdTdHlsZSA9ICcnKSB7CgkJCSRlbmNvZGluZ1N0eWxlID0gJ2h0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvJzsKCQl9CgoJCSR0aGlzLT5vcGVyYXRpb25zWyRuYW1lXSA9IGFycmF5KAoJICAgICduYW1lJyA9PiAkbmFtZSwKCSAgICAnaW4nID0+ICRpbiwKCSAgICAnb3V0JyA9PiAkb3V0LAoJICAgICduYW1lc3BhY2UnID0+ICRuYW1lc3BhY2UsCgkgICAgJ3NvYXBhY3Rpb24nID0+ICRzb2FwYWN0aW9uLAoJICAgICdzdHlsZScgPT4gJHN0eWxlKTsKICAgICAgICBpZigkdGhpcy0+d3NkbCl7CiAgICAgICAgCSR0aGlzLT53c2RsLT5hZGRPcGVyYXRpb24oJG5hbWUsJGluLCRvdXQsJG5hbWVzcGFjZSwkc29hcGFjdGlvbiwkc3R5bGUsJHVzZSwkZG9jdW1lbnRhdGlvbiwkZW5jb2RpbmdTdHlsZSk7CgkgICAgfQoJCXJldHVybiB0cnVlOwoJfQoKCS8qKgoJKiBTcGVjaWZ5IGEgZmF1bHQgdG8gYmUgcmV0dXJuZWQgdG8gdGhlIGNsaWVudC4KCSogVGhpcyBhbHNvIGFjdHMgYXMgYSBmbGFnIHRvIHRoZSBzZXJ2ZXIgdGhhdCBhIGZhdWx0IGhhcyBvY2N1cmVkLgoJKgoJKiBAcGFyYW0Jc3RyaW5nICRmYXVsdGNvZGUKCSogQHBhcmFtCXN0cmluZyAkZmF1bHRzdHJpbmcKCSogQHBhcmFtCXN0cmluZyAkZmF1bHRhY3RvcgoJKiBAcGFyYW0Jc3RyaW5nICRmYXVsdGRldGFpbAoJKiBAYWNjZXNzICAgcHVibGljCgkqLwoJZnVuY3Rpb24gZmF1bHQoJGZhdWx0Y29kZSwkZmF1bHRzdHJpbmcsJGZhdWx0YWN0b3I9JycsJGZhdWx0ZGV0YWlsPScnKXsKCQlpZiAoJGZhdWx0ZGV0YWlsID09ICcnICYmICR0aGlzLT5kZWJ1Z19mbGFnKSB7CgkJCSRmYXVsdGRldGFpbCA9ICR0aGlzLT5nZXREZWJ1ZygpOwoJCX0KCQkkdGhpcy0+ZmF1bHQgPSBuZXcgc29hcF9mYXVsdCgkZmF1bHRjb2RlLCRmYXVsdGFjdG9yLCRmYXVsdHN0cmluZywkZmF1bHRkZXRhaWwpOwoJCSR0aGlzLT5mYXVsdC0+c29hcF9kZWZlbmNvZGluZyA9ICR0aGlzLT5zb2FwX2RlZmVuY29kaW5nOwoJfQoKICAgIC8qKgogICAgKiBTZXRzIHVwIHdzZGwgb2JqZWN0LgogICAgKiBBY3RzIGFzIGEgZmxhZyB0byBlbmFibGUgaW50ZXJuYWwgV1NETCBnZW5lcmF0aW9uCiAgICAqCiAgICAqIEBwYXJhbSBzdHJpbmcgJHNlcnZpY2VOYW1lLCBuYW1lIG9mIHRoZSBzZXJ2aWNlCiAgICAqIEBwYXJhbSBtaXhlZCAkbmFtZXNwYWNlIG9wdGlvbmFsICd0bnMnIHNlcnZpY2UgbmFtZXNwYWNlIG9yIGZhbHNlCiAgICAqIEBwYXJhbSBtaXhlZCAkZW5kcG9pbnQgb3B0aW9uYWwgVVJMIG9mIHNlcnZpY2UgZW5kcG9pbnQgb3IgZmFsc2UKICAgICogQHBhcmFtIHN0cmluZyAkc3R5bGUgb3B0aW9uYWwgKHJwY3xkb2N1bWVudCkgV1NETCBzdHlsZSAoYWxzbyBzcGVjaWZpZWQgYnkgb3BlcmF0aW9uKQogICAgKiBAcGFyYW0gc3RyaW5nICR0cmFuc3BvcnQgb3B0aW9uYWwgU09BUCB0cmFuc3BvcnQKICAgICogQHBhcmFtIG1peGVkICRzY2hlbWFUYXJnZXROYW1lc3BhY2Ugb3B0aW9uYWwgJ3R5cGVzJyB0YXJnZXROYW1lc3BhY2UgZm9yIHNlcnZpY2Ugc2NoZW1hIG9yIGZhbHNlCiAgICAqLwogICAgZnVuY3Rpb24gY29uZmlndXJlV1NETCgkc2VydmljZU5hbWUsJG5hbWVzcGFjZSA9IGZhbHNlLCRlbmRwb2ludCA9IGZhbHNlLCRzdHlsZT0ncnBjJywgJHRyYW5zcG9ydCA9ICdodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAnLCAkc2NoZW1hVGFyZ2V0TmFtZXNwYWNlID0gZmFsc2UpCiAgICB7CiAgICAJZ2xvYmFsICRIVFRQX1NFUlZFUl9WQVJTOwoKCQlpZiAoaXNzZXQoJF9TRVJWRVIpKSB7CgkJCSRTRVJWRVJfTkFNRSA9ICRfU0VSVkVSWydTRVJWRVJfTkFNRSddOwoJCQkkU0VSVkVSX1BPUlQgPSAkX1NFUlZFUlsnU0VSVkVSX1BPUlQnXTsKCQkJJFNDUklQVF9OQU1FID0gaXNzZXQoJF9TRVJWRVJbJ1BIUF9TRUxGJ10pID8gJF9TRVJWRVJbJ1BIUF9TRUxGJ10gOiAkX1NFUlZFUlsnU0NSSVBUX05BTUUnXTsKCQkJJEhUVFBTID0gJF9TRVJWRVJbJ0hUVFBTJ107CgkJfSBlbHNlaWYgKGlzc2V0KCRIVFRQX1NFUlZFUl9WQVJTKSkgewoJCQkkU0VSVkVSX05BTUUgPSAkSFRUUF9TRVJWRVJfVkFSU1snU0VSVkVSX05BTUUnXTsKCQkJJFNFUlZFUl9QT1JUID0gJEhUVFBfU0VSVkVSX1ZBUlNbJ1NFUlZFUl9QT1JUJ107CgkJCSRTQ1JJUFRfTkFNRSA9IGlzc2V0KCRIVFRQX1NFUlZFUl9WQVJTWydQSFBfU0VMRiddKSA/ICRIVFRQX1NFUlZFUl9WQVJTWydQSFBfU0VMRiddIDogJEhUVFBfU0VSVkVSX1ZBUlNbJ1NDUklQVF9OQU1FJ107CgkJCSRIVFRQUyA9ICRIVFRQX1NFUlZFUl9WQVJTWydIVFRQUyddOwoJCX0gZWxzZSB7CgkJCSR0aGlzLT5zZXRFcnJvcigiTmVpdGhlciBfU0VSVkVSIG5vciBIVFRQX1NFUlZFUl9WQVJTIGlzIGF2YWlsYWJsZSIpOwoJCX0KCQlpZiAoJFNFUlZFUl9QT1JUID09IDgwKSB7CgkJCSRTRVJWRVJfUE9SVCA9ICcnOwoJCX0gZWxzZSB7CgkJCSRTRVJWRVJfUE9SVCA9ICc6JyAuICRTRVJWRVJfUE9SVDsKCQl9CiAgICAgICAgaWYoZmFsc2UgPT0gJG5hbWVzcGFjZSkgewogICAgICAgICAgICAkbmFtZXNwYWNlID0gImh0dHA6Ly8kU0VSVkVSX05BTUUvc29hcC8kc2VydmljZU5hbWUiOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihmYWxzZSA9PSAkZW5kcG9pbnQpIHsKICAgICAgICAJaWYgKCRIVFRQUyA9PSAnMScgfHwgJEhUVFBTID09ICdvbicpIHsKICAgICAgICAJCSRTQ0hFTUUgPSAnaHR0cHMnOwogICAgICAgIAl9IGVsc2UgewogICAgICAgIAkJJFNDSEVNRSA9ICdodHRwJzsKICAgICAgICAJfQogICAgICAgICAgICAkZW5kcG9pbnQgPSAiJFNDSEVNRTovLyRTRVJWRVJfTkFNRSRTRVJWRVJfUE9SVCRTQ1JJUFRfTkFNRSI7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGZhbHNlID09ICRzY2hlbWFUYXJnZXROYW1lc3BhY2UpIHsKICAgICAgICAgICAgJHNjaGVtYVRhcmdldE5hbWVzcGFjZSA9ICRuYW1lc3BhY2U7CiAgICAgICAgfQogICAgICAgIAoJCSR0aGlzLT53c2RsID0gbmV3IHdzZGw7CgkJJHRoaXMtPndzZGwtPnNlcnZpY2VOYW1lID0gJHNlcnZpY2VOYW1lOwogICAgICAgICR0aGlzLT53c2RsLT5lbmRwb2ludCA9ICRlbmRwb2ludDsKCQkkdGhpcy0+d3NkbC0+bmFtZXNwYWNlc1sndG5zJ10gPSAkbmFtZXNwYWNlOwoJCSR0aGlzLT53c2RsLT5uYW1lc3BhY2VzWydzb2FwJ10gPSAnaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyc7CgkJJHRoaXMtPndzZGwtPm5hbWVzcGFjZXNbJ3dzZGwnXSA9ICdodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyc7CgkJaWYgKCRzY2hlbWFUYXJnZXROYW1lc3BhY2UgIT0gJG5hbWVzcGFjZSkgewoJCQkkdGhpcy0+d3NkbC0+bmFtZXNwYWNlc1sndHlwZXMnXSA9ICRzY2hlbWFUYXJnZXROYW1lc3BhY2U7CgkJfQogICAgICAgICR0aGlzLT53c2RsLT5zY2hlbWFzWyRzY2hlbWFUYXJnZXROYW1lc3BhY2VdWzBdID0gbmV3IHhtbHNjaGVtYSgnJywgJycsICR0aGlzLT53c2RsLT5uYW1lc3BhY2VzKTsKICAgICAgICAkdGhpcy0+d3NkbC0+c2NoZW1hc1skc2NoZW1hVGFyZ2V0TmFtZXNwYWNlXVswXS0+c2NoZW1hVGFyZ2V0TmFtZXNwYWNlID0gJHNjaGVtYVRhcmdldE5hbWVzcGFjZTsKICAgICAgICAkdGhpcy0+d3NkbC0+c2NoZW1hc1skc2NoZW1hVGFyZ2V0TmFtZXNwYWNlXVswXS0+aW1wb3J0c1snaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8nXVswXSA9IGFycmF5KCdsb2NhdGlvbicgPT4gJycsICdsb2FkZWQnID0+IHRydWUpOwogICAgICAgICR0aGlzLT53c2RsLT5zY2hlbWFzWyRzY2hlbWFUYXJnZXROYW1lc3BhY2VdWzBdLT5pbXBvcnRzWydodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyddWzBdID0gYXJyYXkoJ2xvY2F0aW9uJyA9PiAnJywgJ2xvYWRlZCcgPT4gdHJ1ZSk7CiAgICAgICAgJHRoaXMtPndzZGwtPmJpbmRpbmdzWyRzZXJ2aWNlTmFtZS4nQmluZGluZyddID0gYXJyYXkoCiAgICAgICAgCSduYW1lJz0+JHNlcnZpY2VOYW1lLidCaW5kaW5nJywKICAgICAgICAgICAgJ3N0eWxlJz0+JHN0eWxlLAogICAgICAgICAgICAndHJhbnNwb3J0Jz0+JHRyYW5zcG9ydCwKICAgICAgICAgICAgJ3BvcnRUeXBlJz0+JHNlcnZpY2VOYW1lLidQb3J0VHlwZScpOwogICAgICAgICR0aGlzLT53c2RsLT5wb3J0c1skc2VydmljZU5hbWUuJ1BvcnQnXSA9IGFycmF5KAogICAgICAgIAknYmluZGluZyc9PiRzZXJ2aWNlTmFtZS4nQmluZGluZycsCiAgICAgICAgICAgICdsb2NhdGlvbic9PiRlbmRwb2ludCwKICAgICAgICAgICAgJ2JpbmRpbmdUeXBlJz0+J2h0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8nKTsKICAgIH0KfQoKCgoKPz4K]]></data>
  </file>
  <file>
    <filename>classes/class.soap_transport_http.php</filename>
    <isdir>0</isdir>
    <data><![CDATA[PD9waHAKCgoKCi8qKgoqIHRyYW5zcG9ydCBjbGFzcyBmb3Igc2VuZGluZy9yZWNlaXZpbmcgZGF0YSB2aWEgSFRUUCBhbmQgSFRUUFMKKiBOT1RFOiBQSFAgbXVzdCBiZSBjb21waWxlZCB3aXRoIHRoZSBDVVJMIGV4dGVuc2lvbiBmb3IgSFRUUFMgc3VwcG9ydAoqCiogQGF1dGhvciAgIERpZXRyaWNoIEF5YWxhIDxkaWV0cmljaEBnYW54NC5jb20+CiogQHZlcnNpb24gICRJZDogY2xhc3Muc29hcF90cmFuc3BvcnRfaHR0cC5waHAsdiAxLjU3IDIwMDUvMDcvMjcgMTk6MjQ6NDIgc25pY2hvbCBFeHAgJAoqIEBhY2Nlc3MgcHVibGljCiovCmNsYXNzIHNvYXBfdHJhbnNwb3J0X2h0dHAgZXh0ZW5kcyBudXNvYXBfYmFzZSB7CgoJdmFyICR1cmwgPSAnJzsKCXZhciAkdXJpID0gJyc7Cgl2YXIgJGRpZ2VzdF91cmkgPSAnJzsKCXZhciAkc2NoZW1lID0gJyc7Cgl2YXIgJGhvc3QgPSAnJzsKCXZhciAkcG9ydCA9ICcnOwoJdmFyICRwYXRoID0gJyc7Cgl2YXIgJHJlcXVlc3RfbWV0aG9kID0gJ1BPU1QnOwoJdmFyICRwcm90b2NvbF92ZXJzaW9uID0gJzEuMCc7Cgl2YXIgJGVuY29kaW5nID0gJyc7Cgl2YXIgJG91dGdvaW5nX2hlYWRlcnMgPSBhcnJheSgpOwoJdmFyICRpbmNvbWluZ19oZWFkZXJzID0gYXJyYXkoKTsKCXZhciAkaW5jb21pbmdfY29va2llcyA9IGFycmF5KCk7Cgl2YXIgJG91dGdvaW5nX3BheWxvYWQgPSAnJzsKCXZhciAkaW5jb21pbmdfcGF5bG9hZCA9ICcnOwoJdmFyICR1c2VTT0FQQWN0aW9uID0gdHJ1ZTsKCXZhciAkcGVyc2lzdGVudENvbm5lY3Rpb24gPSBmYWxzZTsKCXZhciAkY2ggPSBmYWxzZTsJLy8gY1VSTCBoYW5kbGUKCXZhciAkdXNlcm5hbWUgPSAnJzsKCXZhciAkcGFzc3dvcmQgPSAnJzsKCXZhciAkYXV0aHR5cGUgPSAnJzsKCXZhciAkZGlnZXN0UmVxdWVzdCA9IGFycmF5KCk7Cgl2YXIgJGNlcnRSZXF1ZXN0ID0gYXJyYXkoKTsJLy8ga2V5cyBtdXN0IGJlIGNhaW5mb2ZpbGUgKG9wdGlvbmFsKSwgc3NsY2VydGZpbGUsIHNzbGtleWZpbGUsIHBhc3NwaHJhc2UsIHZlcmlmeXBlZXIgKG9wdGlvbmFsKSwgdmVyaWZ5aG9zdCAob3B0aW9uYWwpCgkJCQkJCQkJLy8gY2FpbmZvZmlsZTogY2VydGlmaWNhdGUgYXV0aG9yaXR5IGZpbGUsIGUuZy4gJyRwYXRoVG9QZW1GaWxlcy9yb290Y2EucGVtJwoJCQkJCQkJCS8vIHNzbGNlcnRmaWxlOiBTU0wgY2VydGlmaWNhdGUgZmlsZSwgZS5nLiAnJHBhdGhUb1BlbUZpbGVzL215Y2VydC5wZW0nCgkJCQkJCQkJLy8gc3Nsa2V5ZmlsZTogU1NMIGtleSBmaWxlLCBlLmcuICckcGF0aFRvUGVtRmlsZXMvbXlrZXkucGVtJwoJCQkJCQkJCS8vIHBhc3NwaHJhc2U6IFNTTCBrZXkgcGFzc3dvcmQvcGFzc3BocmFzZQoJCQkJCQkJCS8vIHZlcmlmeXBlZXI6IGRlZmF1bHQgaXMgMQoJCQkJCQkJCS8vIHZlcmlmeWhvc3Q6IGRlZmF1bHQgaXMgMQoKCS8qKgoJKiBjb25zdHJ1Y3RvcgoJKi8KCWZ1bmN0aW9uIHNvYXBfdHJhbnNwb3J0X2h0dHAoJHVybCl7CgkJcGFyZW50OjpudXNvYXBfYmFzZSgpOwoJCSR0aGlzLT5zZXRVUkwoJHVybCk7CgkJZXJlZygnXCRSZXZpc2lvJyAuICduOiAoW14gXSspJywgJHRoaXMtPnJldmlzaW9uLCAkcmV2KTsKCQkkdGhpcy0+b3V0Z29pbmdfaGVhZGVyc1snVXNlci1BZ2VudCddID0gJHRoaXMtPnRpdGxlLicvJy4kdGhpcy0+dmVyc2lvbi4nICgnLiRyZXZbMV0uJyknOwoJCSR0aGlzLT5kZWJ1Zygnc2V0IFVzZXItQWdlbnQ6ICcgLiAkdGhpcy0+b3V0Z29pbmdfaGVhZGVyc1snVXNlci1BZ2VudCddKTsKCX0KCglmdW5jdGlvbiBzZXRVUkwoJHVybCkgewoJCSR0aGlzLT51cmwgPSAkdXJsOwoKCQkkdSA9IHBhcnNlX3VybCgkdXJsKTsKCQlmb3JlYWNoKCR1IGFzICRrID0+ICR2KXsKCQkJJHRoaXMtPmRlYnVnKCIkayA9ICR2Iik7CgkJCSR0aGlzLT4kayA9ICR2OwoJCX0KCQkKCQkvLyBhZGQgYW55IEdFVCBwYXJhbXMgdG8gcGF0aAoJCWlmKGlzc2V0KCR1WydxdWVyeSddKSAmJiAkdVsncXVlcnknXSAhPSAnJyl7CiAgICAgICAgICAgICR0aGlzLT5wYXRoIC49ICc/JyAuICR1WydxdWVyeSddOwoJCX0KCQkKCQkvLyBzZXQgZGVmYXVsdCBwb3J0CgkJaWYoIWlzc2V0KCR1Wydwb3J0J10pKXsKCQkJaWYoJHVbJ3NjaGVtZSddID09ICdodHRwcycpewoJCQkJJHRoaXMtPnBvcnQgPSA0NDM7CgkJCX0gZWxzZSB7CgkJCQkkdGhpcy0+cG9ydCA9IDgwOwoJCQl9CgkJfQoJCQoJCSR0aGlzLT51cmkgPSAkdGhpcy0+cGF0aDsKCQkkdGhpcy0+ZGlnZXN0X3VyaSA9ICR0aGlzLT51cmk7CgkJCgkJLy8gYnVpbGQgaGVhZGVycwoJCWlmICghaXNzZXQoJHVbJ3BvcnQnXSkpIHsKCQkJJHRoaXMtPm91dGdvaW5nX2hlYWRlcnNbJ0hvc3QnXSA9ICR0aGlzLT5ob3N0OwoJCX0gZWxzZSB7CgkJCSR0aGlzLT5vdXRnb2luZ19oZWFkZXJzWydIb3N0J10gPSAkdGhpcy0+aG9zdC4nOicuJHRoaXMtPnBvcnQ7CgkJfQoJCSR0aGlzLT5kZWJ1Zygnc2V0IEhvc3Q6ICcgLiAkdGhpcy0+b3V0Z29pbmdfaGVhZGVyc1snSG9zdCddKTsKCgkJaWYgKGlzc2V0KCR1Wyd1c2VyJ10pICYmICR1Wyd1c2VyJ10gIT0gJycpIHsKCQkJJHRoaXMtPnNldENyZWRlbnRpYWxzKHVybGRlY29kZSgkdVsndXNlciddKSwgaXNzZXQoJHVbJ3Bhc3MnXSkgPyB1cmxkZWNvZGUoJHVbJ3Bhc3MnXSkgOiAnJyk7CgkJfQoJfQoJCglmdW5jdGlvbiBjb25uZWN0KCRjb25uZWN0aW9uX3RpbWVvdXQ9MCwkcmVzcG9uc2VfdGltZW91dD0zMCl7CgkgIAkvLyBGb3IgUEhQIDQuMyB3aXRoIE9wZW5TU0wsIGNoYW5nZSBodHRwcyBzY2hlbWUgdG8gc3NsLCB0aGVuIHRyZWF0IGxpa2UKCSAgCS8vICJyZWd1bGFyIiBzb2NrZXQuCgkgIAkvLyBUT0RPOiBkaXNhYmxlZCBmb3Igbm93IGJlY2F1c2UgT3BlblNTTCBtdXN0IGJlICpjb21waWxlZCogaW4gKG5vdCBqdXN0CgkgIAkvLyAgICAgICBsb2FkZWQpLCBhbmQgdW50aWwgUEhQNSBzdHJlYW1fZ2V0X3dyYXBwZXJzIGlzIG5vdCBhdmFpbGFibGUuCi8vCSAgCWlmICgkdGhpcy0+c2NoZW1lID09ICdodHRwcycpIHsKLy8JCSAgCWlmICh2ZXJzaW9uX2NvbXBhcmUocGhwdmVyc2lvbigpLCAnNC4zLjAnKSA+PSAwKSB7Ci8vCQkgIAkJaWYgKGV4dGVuc2lvbl9sb2FkZWQoJ29wZW5zc2wnKSkgewovLwkJICAJCQkkdGhpcy0+c2NoZW1lID0gJ3NzbCc7Ci8vCQkgIAkJCSR0aGlzLT5kZWJ1ZygnVXNpbmcgU1NMIG92ZXIgT3BlblNTTCcpOwovLwkJICAJCX0KLy8JCSAgCX0KLy8JCX0KCQkkdGhpcy0+ZGVidWcoImNvbm5lY3QgY29ubmVjdGlvbl90aW1lb3V0ICRjb25uZWN0aW9uX3RpbWVvdXQsIHJlc3BvbnNlX3RpbWVvdXQgJHJlc3BvbnNlX3RpbWVvdXQsIHNjaGVtZSAkdGhpcy0+c2NoZW1lLCBob3N0ICR0aGlzLT5ob3N0LCBwb3J0ICR0aGlzLT5wb3J0Iik7CgkgIGlmICgkdGhpcy0+c2NoZW1lID09ICdodHRwJyB8fCAkdGhpcy0+c2NoZW1lID09ICdzc2wnKSB7CgkJLy8gdXNlIHBlcnNpc3RlbnQgY29ubmVjdGlvbgoJCWlmKCR0aGlzLT5wZXJzaXN0ZW50Q29ubmVjdGlvbiAmJiBpc3NldCgkdGhpcy0+ZnApICYmIGlzX3Jlc291cmNlKCR0aGlzLT5mcCkpewoJCQlpZiAoIWZlb2YoJHRoaXMtPmZwKSkgewoJCQkJJHRoaXMtPmRlYnVnKCdSZS11c2UgcGVyc2lzdGVudCBjb25uZWN0aW9uJyk7CgkJCQlyZXR1cm4gdHJ1ZTsKCQkJfQoJCQlmY2xvc2UoJHRoaXMtPmZwKTsKCQkJJHRoaXMtPmRlYnVnKCdDbG9zZWQgcGVyc2lzdGVudCBjb25uZWN0aW9uIGF0IEVPRicpOwoJCX0KCgkJLy8gbXVuZ2UgaG9zdCBpZiB1c2luZyBPcGVuU1NMCgkJaWYgKCR0aGlzLT5zY2hlbWUgPT0gJ3NzbCcpIHsKCQkJJGhvc3QgPSAnc3NsOi8vJyAuICR0aGlzLT5ob3N0OwoJCX0gZWxzZSB7CgkJCSRob3N0ID0gJHRoaXMtPmhvc3Q7CgkJfQoJCSR0aGlzLT5kZWJ1ZygnY2FsbGluZyBmc29ja29wZW4gd2l0aCBob3N0ICcgLiAkaG9zdCAuICcgY29ubmVjdGlvbl90aW1lb3V0ICcgLiAkY29ubmVjdGlvbl90aW1lb3V0KTsKCgkJLy8gb3BlbiBzb2NrZXQKCQlpZigkY29ubmVjdGlvbl90aW1lb3V0ID4gMCl7CgkJCSR0aGlzLT5mcCA9IEBmc29ja29wZW4oICRob3N0LCAkdGhpcy0+cG9ydCwgJHRoaXMtPmVycm5vLCAkdGhpcy0+ZXJyb3Jfc3RyLCAkY29ubmVjdGlvbl90aW1lb3V0KTsKCQl9IGVsc2UgewoJCQkkdGhpcy0+ZnAgPSBAZnNvY2tvcGVuKCAkaG9zdCwgJHRoaXMtPnBvcnQsICR0aGlzLT5lcnJubywgJHRoaXMtPmVycm9yX3N0cik7CgkJfQoJCQoJCS8vIHRlc3QgcG9pbnRlcgoJCWlmKCEkdGhpcy0+ZnApIHsKCQkJJG1zZyA9ICdDb3VsZG5cJ3Qgb3BlbiBzb2NrZXQgY29ubmVjdGlvbiB0byBzZXJ2ZXIgJyAuICR0aGlzLT51cmw7CgkJCWlmICgkdGhpcy0+ZXJybm8pIHsKCQkJCSRtc2cgLj0gJywgRXJyb3IgKCcuJHRoaXMtPmVycm5vLicpOiAnLiR0aGlzLT5lcnJvcl9zdHI7CgkJCX0gZWxzZSB7CgkJCQkkbXNnIC49ICcgcHJpb3IgdG8gY29ubmVjdCgpLiAgVGhpcyBpcyBvZnRlbiBhIHByb2JsZW0gbG9va2luZyB1cCB0aGUgaG9zdCBuYW1lLic7CgkJCX0KCQkJJHRoaXMtPmRlYnVnKCRtc2cpOwoJCQkkdGhpcy0+c2V0RXJyb3IoJG1zZyk7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJCgkJLy8gc2V0IHJlc3BvbnNlIHRpbWVvdXQKCQkkdGhpcy0+ZGVidWcoJ3NldCByZXNwb25zZSB0aW1lb3V0IHRvICcgLiAkcmVzcG9uc2VfdGltZW91dCk7CgkJc29ja2V0X3NldF90aW1lb3V0KCAkdGhpcy0+ZnAsICRyZXNwb25zZV90aW1lb3V0KTsKCgkJJHRoaXMtPmRlYnVnKCdzb2NrZXQgY29ubmVjdGVkJyk7CgkJcmV0dXJuIHRydWU7CgkgIH0gZWxzZSBpZiAoJHRoaXMtPnNjaGVtZSA9PSAnaHR0cHMnKSB7CgkJaWYgKCFleHRlbnNpb25fbG9hZGVkKCdjdXJsJykpIHsKCQkJJHRoaXMtPnNldEVycm9yKCdDVVJMIEV4dGVuc2lvbiwgb3IgT3BlblNTTCBleHRlbnNpb24gdy8gUEhQIHZlcnNpb24gPj0gNC4zIGlzIHJlcXVpcmVkIGZvciBIVFRQUycpOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCSR0aGlzLT5kZWJ1ZygnY29ubmVjdCB1c2luZyBodHRwcycpOwoJCS8vIGluaXQgQ1VSTAoJCSR0aGlzLT5jaCA9IGN1cmxfaW5pdCgpOwoJCS8vIHNldCB1cmwKCQkkaG9zdFVSTCA9ICgkdGhpcy0+cG9ydCAhPSAnJykgPyAiaHR0cHM6Ly8kdGhpcy0+aG9zdDokdGhpcy0+cG9ydCIgOiAiaHR0cHM6Ly8kdGhpcy0+aG9zdCI7CgkJLy8gYWRkIHBhdGgKCQkkaG9zdFVSTCAuPSAkdGhpcy0+cGF0aDsKCQljdXJsX3NldG9wdCgkdGhpcy0+Y2gsIENVUkxPUFRfVVJMLCAkaG9zdFVSTCk7CgkJLy8gZm9sbG93IGxvY2F0aW9uIGhlYWRlcnMgKHJlLWRpcmVjdHMpCgkJY3VybF9zZXRvcHQoJHRoaXMtPmNoLCBDVVJMT1BUX0ZPTExPV0xPQ0FUSU9OLCAxKTsKCQkvLyBhc2sgZm9yIGhlYWRlcnMgaW4gdGhlIHJlc3BvbnNlIG91dHB1dAoJCWN1cmxfc2V0b3B0KCR0aGlzLT5jaCwgQ1VSTE9QVF9IRUFERVIsIDEpOwoJCS8vIGFzayBmb3IgdGhlIHJlc3BvbnNlIG91dHB1dCBhcyB0aGUgcmV0dXJuIHZhbHVlCgkJY3VybF9zZXRvcHQoJHRoaXMtPmNoLCBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLCAxKTsKCQkvLyBlbmNvZGUKCQkvLyBXZSBtYW5hZ2UgdGhpcyBvdXJzZWx2ZXMgdGhyb3VnaCBoZWFkZXJzIGFuZCBlbmNvZGluZwovLwkJaWYoZnVuY3Rpb25fZXhpc3RzKCdnenVuY29tcHJlc3MnKSl7Ci8vCQkJY3VybF9zZXRvcHQoJHRoaXMtPmNoLCBDVVJMT1BUX0VOQ09ESU5HLCAnZGVmbGF0ZScpOwovLwkJfQoJCS8vIHBlcnNpc3RlbnQgY29ubmVjdGlvbgoJCWlmICgkdGhpcy0+cGVyc2lzdGVudENvbm5lY3Rpb24pIHsKCQkJLy8gVGhlIHdheSB3ZSBzZW5kIGRhdGEsIHdlIGNhbm5vdCB1c2UgcGVyc2lzdGVudCBjb25uZWN0aW9ucywgc2luY2UKCQkJLy8gdGhlcmUgd2lsbCBiZSBzb21lICJqdW5rIiBhdCB0aGUgZW5kIG9mIG91ciByZXF1ZXN0LgoJCQkvL2N1cmxfc2V0b3B0KCR0aGlzLT5jaCwgQ1VSTF9IVFRQX1ZFUlNJT05fMV8xLCB0cnVlKTsKCQkJJHRoaXMtPnBlcnNpc3RlbnRDb25uZWN0aW9uID0gZmFsc2U7CgkJCSR0aGlzLT5vdXRnb2luZ19oZWFkZXJzWydDb25uZWN0aW9uJ10gPSAnY2xvc2UnOwoJCQkkdGhpcy0+ZGVidWcoJ3NldCBDb25uZWN0aW9uOiAnIC4gJHRoaXMtPm91dGdvaW5nX2hlYWRlcnNbJ0Nvbm5lY3Rpb24nXSk7CgkJfQoJCS8vIHNldCB0aW1lb3V0CgkJaWYgKCRjb25uZWN0aW9uX3RpbWVvdXQgIT0gMCkgewoJCQljdXJsX3NldG9wdCgkdGhpcy0+Y2gsIENVUkxPUFRfVElNRU9VVCwgJGNvbm5lY3Rpb25fdGltZW91dCk7CgkJfQoJCS8vIFRPRE86IGNVUkwgaGFzIGFkZGVkIGEgY29ubmVjdGlvbiB0aW1lb3V0IHNlcGFyYXRlIGZyb20gdGhlIHJlc3BvbnNlIHRpbWVvdXQKCQkvL2lmICgkY29ubmVjdGlvbl90aW1lb3V0ICE9IDApIHsKCQkvLwljdXJsX3NldG9wdCgkdGhpcy0+Y2gsIENVUkxPUFRfQ09OTkVDVElPTlRJTUVPVVQsICRjb25uZWN0aW9uX3RpbWVvdXQpOwoJCS8vfQoJCS8vaWYgKCRyZXNwb25zZV90aW1lb3V0ICE9IDApIHsKCQkvLwljdXJsX3NldG9wdCgkdGhpcy0+Y2gsIENVUkxPUFRfVElNRU9VVCwgJHJlc3BvbnNlX3RpbWVvdXQpOwoJCS8vfQoKCQkvLyByZWNlbnQgdmVyc2lvbnMgb2YgY1VSTCB0dXJuIG9uIHBlZXIvaG9zdCBjaGVja2luZyBieSBkZWZhdWx0LAoJCS8vIHdoaWxlIFBIUCBiaW5hcmllcyBhcmUgbm90IGNvbXBpbGVkIHdpdGggYSBkZWZhdWx0IGxvY2F0aW9uIGZvciB0aGUKCQkvLyBDQSBjZXJ0IGJ1bmRsZSwgc28gZGlzYWJsZSBwZWVyL2hvc3QgY2hlY2tpbmcuCi8vY3VybF9zZXRvcHQoJHRoaXMtPmNoLCBDVVJMT1BUX0NBSU5GTywgJ2Y6XHBocC00LjMuMi13aW4zMlxleHRlbnNpb25zXGN1cmwtY2EtYnVuZGxlLmNydCcpOwkJCgkJY3VybF9zZXRvcHQoJHRoaXMtPmNoLCBDVVJMT1BUX1NTTF9WRVJJRllQRUVSLCAwKTsKCQljdXJsX3NldG9wdCgkdGhpcy0+Y2gsIENVUkxPUFRfU1NMX1ZFUklGWUhPU1QsIDApOwoKCQkvLyBzdXBwb3J0IGNsaWVudCBjZXJ0aWZpY2F0ZXMgKHRoYW5rcyBUb2JpYXMgQm9lcywgRG91ZyBBbmFyaW5vLCBFcnlhbiBBcmlvYm93bykKCQlpZiAoJHRoaXMtPmF1dGh0eXBlID09ICdjZXJ0aWZpY2F0ZScpIHsKCQkJaWYgKGlzc2V0KCR0aGlzLT5jZXJ0UmVxdWVzdFsnY2FpbmZvZmlsZSddKSkgewoJCQkJY3VybF9zZXRvcHQoJHRoaXMtPmNoLCBDVVJMT1BUX0NBSU5GTywgJHRoaXMtPmNlcnRSZXF1ZXN0WydjYWluZm9maWxlJ10pOwoJCQl9CgkJCWlmIChpc3NldCgkdGhpcy0+Y2VydFJlcXVlc3RbJ3ZlcmlmeXBlZXInXSkpIHsKCQkJCWN1cmxfc2V0b3B0KCR0aGlzLT5jaCwgQ1VSTE9QVF9TU0xfVkVSSUZZUEVFUiwgJHRoaXMtPmNlcnRSZXF1ZXN0Wyd2ZXJpZnlwZWVyJ10pOwoJCQl9IGVsc2UgewoJCQkJY3VybF9zZXRvcHQoJHRoaXMtPmNoLCBDVVJMT1BUX1NTTF9WRVJJRllQRUVSLCAxKTsKCQkJfQoJCQlpZiAoaXNzZXQoJHRoaXMtPmNlcnRSZXF1ZXN0Wyd2ZXJpZnlob3N0J10pKSB7CgkJCQljdXJsX3NldG9wdCgkdGhpcy0+Y2gsIENVUkxPUFRfU1NMX1ZFUklGWUhPU1QsICR0aGlzLT5jZXJ0UmVxdWVzdFsndmVyaWZ5aG9zdCddKTsKCQkJfSBlbHNlIHsKCQkJCWN1cmxfc2V0b3B0KCR0aGlzLT5jaCwgQ1VSTE9QVF9TU0xfVkVSSUZZSE9TVCwgMSk7CgkJCX0KCQkJaWYgKGlzc2V0KCR0aGlzLT5jZXJ0UmVxdWVzdFsnc3NsY2VydGZpbGUnXSkpIHsKCQkJCWN1cmxfc2V0b3B0KCR0aGlzLT5jaCwgQ1VSTE9QVF9TU0xDRVJULCAkdGhpcy0+Y2VydFJlcXVlc3RbJ3NzbGNlcnRmaWxlJ10pOwoJCQl9CgkJCWlmIChpc3NldCgkdGhpcy0+Y2VydFJlcXVlc3RbJ3NzbGtleWZpbGUnXSkpIHsKCQkJCWN1cmxfc2V0b3B0KCR0aGlzLT5jaCwgQ1VSTE9QVF9TU0xLRVksICR0aGlzLT5jZXJ0UmVxdWVzdFsnc3Nsa2V5ZmlsZSddKTsKCQkJfQoJCQlpZiAoaXNzZXQoJHRoaXMtPmNlcnRSZXF1ZXN0WydwYXNzcGhyYXNlJ10pKSB7CgkJCQljdXJsX3NldG9wdCgkdGhpcy0+Y2gsIENVUkxPUFRfU1NMS0VZUEFTU1dEICwgJHRoaXMtPmNlcnRSZXF1ZXN0WydwYXNzcGhyYXNlJ10pOwoJCQl9CgkJfQoJCSR0aGlzLT5kZWJ1ZygnY1VSTCBjb25uZWN0aW9uIHNldCB1cCcpOwoJCXJldHVybiB0cnVlOwoJICB9IGVsc2UgewoJCSR0aGlzLT5zZXRFcnJvcignVW5rbm93biBzY2hlbWUgJyAuICR0aGlzLT5zY2hlbWUpOwoJCSR0aGlzLT5kZWJ1ZygnVW5rbm93biBzY2hlbWUgJyAuICR0aGlzLT5zY2hlbWUpOwoJCXJldHVybiBmYWxzZTsKCSAgfQoJfQoJCgkvKioKCSogc2VuZCB0aGUgU09BUCBtZXNzYWdlIHZpYSBIVFRQCgkqCgkqIEBwYXJhbSAgICBzdHJpbmcgJGRhdGEgbWVzc2FnZSBkYXRhCgkqIEBwYXJhbSAgICBpbnRlZ2VyICR0aW1lb3V0IHNldCBjb25uZWN0aW9uIHRpbWVvdXQgaW4gc2Vjb25kcwoJKiBAcGFyYW0JaW50ZWdlciAkcmVzcG9uc2VfdGltZW91dCBzZXQgcmVzcG9uc2UgdGltZW91dCBpbiBzZWNvbmRzCgkqIEBwYXJhbQlhcnJheSAkY29va2llcyBjb29raWVzIHRvIHNlbmQKCSogQHJldHVybglzdHJpbmcgZGF0YQoJKiBAYWNjZXNzICAgcHVibGljCgkqLwoJZnVuY3Rpb24gc2VuZCgkZGF0YSwgJHRpbWVvdXQ9MCwgJHJlc3BvbnNlX3RpbWVvdXQ9MzAsICRjb29raWVzPU5VTEwpIHsKCQkKCQkkdGhpcy0+ZGVidWcoJ2VudGVyZWQgc2VuZCgpIHdpdGggZGF0YSBvZiBsZW5ndGg6ICcuc3RybGVuKCRkYXRhKSk7CgoJCSR0aGlzLT50cnlhZ2FpbiA9IHRydWU7CgkJJHRyaWVzID0gMDsKCQl3aGlsZSAoJHRoaXMtPnRyeWFnYWluKSB7CgkJCSR0aGlzLT50cnlhZ2FpbiA9IGZhbHNlOwoJCQlpZiAoJHRyaWVzKysgPCAyKSB7CgkJCQkvLyBtYWtlIGNvbm5uZWN0aW9uCgkJCQlpZiAoISR0aGlzLT5jb25uZWN0KCR0aW1lb3V0LCAkcmVzcG9uc2VfdGltZW91dCkpewoJCQkJCXJldHVybiBmYWxzZTsKCQkJCX0KCQkJCQoJCQkJLy8gc2VuZCByZXF1ZXN0CgkJCQlpZiAoISR0aGlzLT5zZW5kUmVxdWVzdCgkZGF0YSwgJGNvb2tpZXMpKXsKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9CgkJCQkKCQkJCS8vIGdldCByZXNwb25zZQoJCQkJJHJlc3BkYXRhID0gJHRoaXMtPmdldFJlc3BvbnNlKCk7CgkJCX0gZWxzZSB7CgkJCQkkdGhpcy0+c2V0RXJyb3IoJ1RvbyBtYW55IHRyaWVzIHRvIGdldCBhbiBPSyByZXNwb25zZScpOwoJCQl9CgkJfQkJCgkJJHRoaXMtPmRlYnVnKCdlbmQgb2Ygc2VuZCgpJyk7CgkJcmV0dXJuICRyZXNwZGF0YTsKCX0KCgoJLyoqCgkqIHNlbmQgdGhlIFNPQVAgbWVzc2FnZSB2aWEgSFRUUFMgMS4wIHVzaW5nIENVUkwKCSoKCSogQHBhcmFtICAgIHN0cmluZyAkbXNnIG1lc3NhZ2UgZGF0YQoJKiBAcGFyYW0gICAgaW50ZWdlciAkdGltZW91dCBzZXQgY29ubmVjdGlvbiB0aW1lb3V0IGluIHNlY29uZHMKCSogQHBhcmFtCWludGVnZXIgJHJlc3BvbnNlX3RpbWVvdXQgc2V0IHJlc3BvbnNlIHRpbWVvdXQgaW4gc2Vjb25kcwoJKiBAcGFyYW0JYXJyYXkgJGNvb2tpZXMgY29va2llcyB0byBzZW5kCgkqIEByZXR1cm4Jc3RyaW5nIGRhdGEKCSogQGFjY2VzcyAgIHB1YmxpYwoJKi8KCWZ1bmN0aW9uIHNlbmRIVFRQUygkZGF0YSwgJHRpbWVvdXQ9MCwgJHJlc3BvbnNlX3RpbWVvdXQ9MzAsICRjb29raWVzKSB7CgkJcmV0dXJuICR0aGlzLT5zZW5kKCRkYXRhLCAkdGltZW91dCwgJHJlc3BvbnNlX3RpbWVvdXQsICRjb29raWVzKTsKCX0KCQoJLyoqCgkqIGlmIGF1dGhlbnRpY2F0aW5nLCBzZXQgdXNlciBjcmVkZW50aWFscyBoZXJlCgkqCgkqIEBwYXJhbSAgICBzdHJpbmcgJHVzZXJuYW1lCgkqIEBwYXJhbSAgICBzdHJpbmcgJHBhc3N3b3JkCgkqIEBwYXJhbQlzdHJpbmcgJGF1dGh0eXBlIChiYXNpYywgZGlnZXN0LCBjZXJ0aWZpY2F0ZSkKCSogQHBhcmFtCWFycmF5ICRkaWdlc3RSZXF1ZXN0IChrZXlzIG11c3QgYmUgbm9uY2UsIG5jLCByZWFsbSwgcW9wKQoJKiBAcGFyYW0JYXJyYXkgJGNlcnRSZXF1ZXN0IChrZXlzIG11c3QgYmUgY2FpbmZvZmlsZSAob3B0aW9uYWwpLCBzc2xjZXJ0ZmlsZSwgc3Nsa2V5ZmlsZSwgcGFzc3BocmFzZSwgdmVyaWZ5cGVlciAob3B0aW9uYWwpLCB2ZXJpZnlob3N0IChvcHRpb25hbCk6IHNlZSBjb3JyZXNwb25kaW5nIG9wdGlvbnMgaW4gY1VSTCBkb2NzKQoJKiBAYWNjZXNzICAgcHVibGljCgkqLwoJZnVuY3Rpb24gc2V0Q3JlZGVudGlhbHMoJHVzZXJuYW1lLCAkcGFzc3dvcmQsICRhdXRodHlwZSA9ICdiYXNpYycsICRkaWdlc3RSZXF1ZXN0ID0gYXJyYXkoKSwgJGNlcnRSZXF1ZXN0ID0gYXJyYXkoKSkgewoJCSR0aGlzLT5kZWJ1ZygiU2V0IGNyZWRlbnRpYWxzIGZvciBhdXRodHlwZSAkYXV0aHR5cGUiKTsKCQkvLyBjZi4gUkZDIDI2MTcKCQlpZiAoJGF1dGh0eXBlID09ICdiYXNpYycpIHsKCQkJJHRoaXMtPm91dGdvaW5nX2hlYWRlcnNbJ0F1dGhvcml6YXRpb24nXSA9ICdCYXNpYyAnLmJhc2U2NF9lbmNvZGUoc3RyX3JlcGxhY2UoJzonLCcnLCR1c2VybmFtZSkuJzonLiRwYXNzd29yZCk7CgkJfSBlbHNlaWYgKCRhdXRodHlwZSA9PSAnZGlnZXN0JykgewoJCQlpZiAoaXNzZXQoJGRpZ2VzdFJlcXVlc3RbJ25vbmNlJ10pKSB7CgkJCQkkZGlnZXN0UmVxdWVzdFsnbmMnXSA9IGlzc2V0KCRkaWdlc3RSZXF1ZXN0WyduYyddKSA/ICRkaWdlc3RSZXF1ZXN0WyduYyddKysgOiAxOwoJCQkJCgkJCQkvLyBjYWxjdWxhdGUgdGhlIERpZ2VzdCBoYXNoZXMgKGNhbGN1bGF0ZSBjb2RlIGJhc2VkIG9uIGRpZ2VzdCBpbXBsZW1lbnRhdGlvbiBmb3VuZCBhdDogaHR0cDovL3d3dy5yYXNzb2MuY29tL2dyZWdyL3dlYmxvZy9zdG9yaWVzLzIwMDIvMDcvMDkvd2ViU2VydmljZXNTZWN1cml0eUh0dHBEaWdlc3RBdXRoZW50aWNhdGlvbldpdGhvdXRBY3RpdmVEaXJlY3RvcnkuaHRtbCkKCQoJCQkJLy8gQTEgPSB1bnEodXNlcm5hbWUtdmFsdWUpICI6IiB1bnEocmVhbG0tdmFsdWUpICI6IiBwYXNzd2QKCQkJCSRBMSA9ICR1c2VybmFtZS4gJzonIC4gKGlzc2V0KCRkaWdlc3RSZXF1ZXN0WydyZWFsbSddKSA/ICRkaWdlc3RSZXF1ZXN0WydyZWFsbSddIDogJycpIC4gJzonIC4gJHBhc3N3b3JkOwoJCgkJCQkvLyBIKEExKSA9IE1ENShBMSkKCQkJCSRIQTEgPSBtZDUoJEExKTsKCQoJCQkJLy8gQTIgPSBNZXRob2QgIjoiIGRpZ2VzdC11cmktdmFsdWUKCQkJCSRBMiA9ICdQT1NUOicgLiAkdGhpcy0+ZGlnZXN0X3VyaTsKCQoJCQkJLy8gSChBMikKCQkJCSRIQTIgPSAgbWQ1KCRBMik7CgkKCQkJCS8vIEtEKHNlY3JldCwgZGF0YSkgPSBIKGNvbmNhdChzZWNyZXQsICI6IiwgZGF0YSkpCgkJCQkvLyBpZiBxb3AgPT0gYXV0aDoKCQkJCS8vIHJlcXVlc3QtZGlnZXN0ICA9IDwiPiA8IEtEICggSChBMSksICAgICB1bnEobm9uY2UtdmFsdWUpCgkJCQkvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI6IiBuYy12YWx1ZQoJCQkJLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOiIgdW5xKGNub25jZS12YWx1ZSkKCQkJCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjoiIHVucShxb3AtdmFsdWUpCgkJCQkvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI6IiBIKEEyKQoJCQkJLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSA8Ij4KCQkJCS8vIGlmIHFvcCBpcyBtaXNzaW5nLAoJCQkJLy8gcmVxdWVzdC1kaWdlc3QgID0gPCI+IDwgS0QgKCBIKEExKSwgdW5xKG5vbmNlLXZhbHVlKSAiOiIgSChBMikgKSA+IDwiPgoJCgkJCQkkdW5oYXNoZWREaWdlc3QgPSAnJzsKCQkJCSRub25jZSA9IGlzc2V0KCRkaWdlc3RSZXF1ZXN0Wydub25jZSddKSA/ICRkaWdlc3RSZXF1ZXN0Wydub25jZSddIDogJyc7CgkJCQkkY25vbmNlID0gJG5vbmNlOwoJCQkJaWYgKCRkaWdlc3RSZXF1ZXN0Wydxb3AnXSAhPSAnJykgewoJCQkJCSR1bmhhc2hlZERpZ2VzdCA9ICRIQTEgLiAnOicgLiAkbm9uY2UgLiAnOicgLiBzcHJpbnRmKCIlMDhkIiwgJGRpZ2VzdFJlcXVlc3RbJ25jJ10pIC4gJzonIC4gJGNub25jZSAuICc6JyAuICRkaWdlc3RSZXF1ZXN0Wydxb3AnXSAuICc6JyAuICRIQTI7CgkJCQl9IGVsc2UgewoJCQkJCSR1bmhhc2hlZERpZ2VzdCA9ICRIQTEgLiAnOicgLiAkbm9uY2UgLiAnOicgLiAkSEEyOwoJCQkJfQoJCgkJCQkkaGFzaGVkRGlnZXN0ID0gbWQ1KCR1bmhhc2hlZERpZ2VzdCk7CgkKCQkJCSR0aGlzLT5vdXRnb2luZ19oZWFkZXJzWydBdXRob3JpemF0aW9uJ10gPSAnRGlnZXN0IHVzZXJuYW1lPSInIC4gJHVzZXJuYW1lIC4gJyIsIHJlYWxtPSInIC4gJGRpZ2VzdFJlcXVlc3RbJ3JlYWxtJ10gLiAnIiwgbm9uY2U9IicgLiAkbm9uY2UgLiAnIiwgdXJpPSInIC4gJHRoaXMtPmRpZ2VzdF91cmkgLiAnIiwgY25vbmNlPSInIC4gJGNub25jZSAuICciLCBuYz0nIC4gc3ByaW50ZigiJTA4eCIsICRkaWdlc3RSZXF1ZXN0WyduYyddKSAuICcsIHFvcD0iJyAuICRkaWdlc3RSZXF1ZXN0Wydxb3AnXSAuICciLCByZXNwb25zZT0iJyAuICRoYXNoZWREaWdlc3QgLiAnIic7CgkJCX0KCQl9IGVsc2VpZiAoJGF1dGh0eXBlID09ICdjZXJ0aWZpY2F0ZScpIHsKCQkJJHRoaXMtPmNlcnRSZXF1ZXN0ID0gJGNlcnRSZXF1ZXN0OwoJCX0KCQkkdGhpcy0+dXNlcm5hbWUgPSAkdXNlcm5hbWU7CgkJJHRoaXMtPnBhc3N3b3JkID0gJHBhc3N3b3JkOwoJCSR0aGlzLT5hdXRodHlwZSA9ICRhdXRodHlwZTsKCQkkdGhpcy0+ZGlnZXN0UmVxdWVzdCA9ICRkaWdlc3RSZXF1ZXN0OwoJCQoJCWlmIChpc3NldCgkdGhpcy0+b3V0Z29pbmdfaGVhZGVyc1snQXV0aG9yaXphdGlvbiddKSkgewoJCQkkdGhpcy0+ZGVidWcoJ3NldCBBdXRob3JpemF0aW9uOiAnIC4gc3Vic3RyKCR0aGlzLT5vdXRnb2luZ19oZWFkZXJzWydBdXRob3JpemF0aW9uJ10sIDAsIDEyKSAuICcuLi4nKTsKCQl9IGVsc2UgewoJCQkkdGhpcy0+ZGVidWcoJ0F1dGhvcml6YXRpb24gaGVhZGVyIG5vdCBzZXQnKTsKCQl9Cgl9CgkKCS8qKgoJKiBzZXQgdGhlIHNvYXBhY3Rpb24gdmFsdWUKCSoKCSogQHBhcmFtICAgIHN0cmluZyAkc29hcGFjdGlvbgoJKiBAYWNjZXNzICAgcHVibGljCgkqLwoJZnVuY3Rpb24gc2V0U09BUEFjdGlvbigkc29hcGFjdGlvbikgewoJCSR0aGlzLT5vdXRnb2luZ19oZWFkZXJzWydTT0FQQWN0aW9uJ10gPSAnIicgLiAkc29hcGFjdGlvbiAuICciJzsKCQkkdGhpcy0+ZGVidWcoJ3NldCBTT0FQQWN0aW9uOiAnIC4gJHRoaXMtPm91dGdvaW5nX2hlYWRlcnNbJ1NPQVBBY3Rpb24nXSk7Cgl9CgkKCS8qKgoJKiB1c2UgaHR0cCBlbmNvZGluZwoJKgoJKiBAcGFyYW0gICAgc3RyaW5nICRlbmMgZW5jb2Rpbmcgc3R5bGUuIHN1cHBvcnRlZCB2YWx1ZXM6IGd6aXAsIGRlZmxhdGUsIG9yIGJvdGgKCSogQGFjY2VzcyAgIHB1YmxpYwoJKi8KCWZ1bmN0aW9uIHNldEVuY29kaW5nKCRlbmM9J2d6aXAsIGRlZmxhdGUnKSB7CgkJaWYgKGZ1bmN0aW9uX2V4aXN0cygnZ3pkZWZsYXRlJykpIHsKCQkJJHRoaXMtPnByb3RvY29sX3ZlcnNpb24gPSAnMS4xJzsKCQkJJHRoaXMtPm91dGdvaW5nX2hlYWRlcnNbJ0FjY2VwdC1FbmNvZGluZyddID0gJGVuYzsKCQkJJHRoaXMtPmRlYnVnKCdzZXQgQWNjZXB0LUVuY29kaW5nOiAnIC4gJHRoaXMtPm91dGdvaW5nX2hlYWRlcnNbJ0FjY2VwdC1FbmNvZGluZyddKTsKCQkJaWYgKCFpc3NldCgkdGhpcy0+b3V0Z29pbmdfaGVhZGVyc1snQ29ubmVjdGlvbiddKSkgewoJCQkJJHRoaXMtPm91dGdvaW5nX2hlYWRlcnNbJ0Nvbm5lY3Rpb24nXSA9ICdjbG9zZSc7CgkJCQkkdGhpcy0+cGVyc2lzdGVudENvbm5lY3Rpb24gPSBmYWxzZTsKCQkJCSR0aGlzLT5kZWJ1Zygnc2V0IENvbm5lY3Rpb246ICcgLiAkdGhpcy0+b3V0Z29pbmdfaGVhZGVyc1snQ29ubmVjdGlvbiddKTsKCQkJfQoJCQlzZXRfbWFnaWNfcXVvdGVzX3J1bnRpbWUoMCk7CgkJCS8vIGRlcHJlY2F0ZWQKCQkJJHRoaXMtPmVuY29kaW5nID0gJGVuYzsKCQl9Cgl9CgkKCS8qKgoJKiBzZXQgcHJveHkgaW5mbyBoZXJlCgkqCgkqIEBwYXJhbSAgICBzdHJpbmcgJHByb3h5aG9zdAoJKiBAcGFyYW0gICAgc3RyaW5nICRwcm94eXBvcnQKCSogQHBhcmFtCXN0cmluZyAkcHJveHl1c2VybmFtZQoJKiBAcGFyYW0Jc3RyaW5nICRwcm94eXBhc3N3b3JkCgkqIEBhY2Nlc3MgICBwdWJsaWMKCSovCglmdW5jdGlvbiBzZXRQcm94eSgkcHJveHlob3N0LCAkcHJveHlwb3J0LCAkcHJveHl1c2VybmFtZSA9ICcnLCAkcHJveHlwYXNzd29yZCA9ICcnKSB7CgkJJHRoaXMtPnVyaSA9ICR0aGlzLT51cmw7CgkJJHRoaXMtPmhvc3QgPSAkcHJveHlob3N0OwoJCSR0aGlzLT5wb3J0ID0gJHByb3h5cG9ydDsKCQlpZiAoJHByb3h5dXNlcm5hbWUgIT0gJycgJiYgJHByb3h5cGFzc3dvcmQgIT0gJycpIHsKCQkJJHRoaXMtPm91dGdvaW5nX2hlYWRlcnNbJ1Byb3h5LUF1dGhvcml6YXRpb24nXSA9ICcgQmFzaWMgJy5iYXNlNjRfZW5jb2RlKCRwcm94eXVzZXJuYW1lLic6Jy4kcHJveHlwYXNzd29yZCk7CgkJCSR0aGlzLT5kZWJ1Zygnc2V0IFByb3h5LUF1dGhvcml6YXRpb246ICcgLiAkdGhpcy0+b3V0Z29pbmdfaGVhZGVyc1snUHJveHktQXV0aG9yaXphdGlvbiddKTsKCQl9Cgl9CgkKCS8qKgoJKiBkZWNvZGUgYSBzdHJpbmcgdGhhdCBpcyBlbmNvZGVkIHcvICJjaHVua2VkJyB0cmFuc2ZlciBlbmNvZGluZwogCSogYXMgZGVmaW5lZCBpbiBSRkMyMDY4IDE5LjQuNgoJKgoJKiBAcGFyYW0gICAgc3RyaW5nICRidWZmZXIKCSogQHBhcmFtICAgIHN0cmluZyAkbGIKCSogQHJldHVybnMJc3RyaW5nCgkqIEBhY2Nlc3MgICBwdWJsaWMKCSogQGRlcHJlY2F0ZWQKCSovCglmdW5jdGlvbiBkZWNvZGVDaHVua2VkKCRidWZmZXIsICRsYil7CgkJLy8gbGVuZ3RoIDo9IDAKCQkkbGVuZ3RoID0gMDsKCQkkbmV3ID0gJyc7CgkJCgkJLy8gcmVhZCBjaHVuay1zaXplLCBjaHVuay1leHRlbnNpb24gKGlmIGFueSkgYW5kIENSTEYKCQkvLyBnZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBsaW5lYnJlYWsKCQkkY2h1bmtlbmQgPSBzdHJwb3MoJGJ1ZmZlciwgJGxiKTsKCQlpZiAoJGNodW5rZW5kID09IEZBTFNFKSB7CgkJCSR0aGlzLT5kZWJ1Zygnbm8gbGluZWJyZWFrIGZvdW5kIGluIGRlY29kZUNodW5rZWQnKTsKCQkJcmV0dXJuICRuZXc7CgkJfQoJCSR0ZW1wID0gc3Vic3RyKCRidWZmZXIsMCwkY2h1bmtlbmQpOwoJCSRjaHVua19zaXplID0gaGV4ZGVjKCB0cmltKCR0ZW1wKSApOwoJCSRjaHVua3N0YXJ0ID0gJGNodW5rZW5kICsgc3RybGVuKCRsYik7CgkJLy8gd2hpbGUgKGNodW5rLXNpemUgPiAwKSB7CgkJd2hpbGUgKCRjaHVua19zaXplID4gMCkgewoJCQkkdGhpcy0+ZGVidWcoImNodW5rc3RhcnQ6ICRjaHVua3N0YXJ0IGNodW5rX3NpemU6ICRjaHVua19zaXplIik7CgkJCSRjaHVua2VuZCA9IHN0cnBvcyggJGJ1ZmZlciwgJGxiLCAkY2h1bmtzdGFydCArICRjaHVua19zaXplKTsKCQkgIAkKCQkJLy8gSnVzdCBpbiBjYXNlIHdlIGdvdCBhIGJyb2tlbiBjb25uZWN0aW9uCgkJICAJaWYgKCRjaHVua2VuZCA9PSBGQUxTRSkgewoJCSAgCSAgICAkY2h1bmsgPSBzdWJzdHIoJGJ1ZmZlciwkY2h1bmtzdGFydCk7CgkJCQkvLyBhcHBlbmQgY2h1bmstZGF0YSB0byBlbnRpdHktYm9keQoJCSAgICAJJG5ldyAuPSAkY2h1bms7CgkJICAJICAgICRsZW5ndGggKz0gc3RybGVuKCRjaHVuayk7CgkJICAJICAgIGJyZWFrOwoJCQl9CgkJCQoJCSAgCS8vIHJlYWQgY2h1bmstZGF0YSBhbmQgQ1JMRgoJCSAgCSRjaHVuayA9IHN1YnN0cigkYnVmZmVyLCRjaHVua3N0YXJ0LCRjaHVua2VuZC0kY2h1bmtzdGFydCk7CgkJICAJLy8gYXBwZW5kIGNodW5rLWRhdGEgdG8gZW50aXR5LWJvZHkKCQkgIAkkbmV3IC49ICRjaHVuazsKCQkgIAkvLyBsZW5ndGggOj0gbGVuZ3RoICsgY2h1bmstc2l6ZQoJCSAgCSRsZW5ndGggKz0gc3RybGVuKCRjaHVuayk7CgkJICAJLy8gcmVhZCBjaHVuay1zaXplIGFuZCBDUkxGCgkJICAJJGNodW5rc3RhcnQgPSAkY2h1bmtlbmQgKyBzdHJsZW4oJGxiKTsKCQkJCgkJICAJJGNodW5rZW5kID0gc3RycG9zKCRidWZmZXIsICRsYiwgJGNodW5rc3RhcnQpICsgc3RybGVuKCRsYik7CgkJCWlmICgkY2h1bmtlbmQgPT0gRkFMU0UpIHsKCQkJCWJyZWFrOyAvL0p1c3QgaW4gY2FzZSB3ZSBnb3QgYSBicm9rZW4gY29ubmVjdGlvbgoJCQl9CgkJCSR0ZW1wID0gc3Vic3RyKCRidWZmZXIsJGNodW5rc3RhcnQsJGNodW5rZW5kLSRjaHVua3N0YXJ0KTsKCQkJJGNodW5rX3NpemUgPSBoZXhkZWMoIHRyaW0oJHRlbXApICk7CgkJCSRjaHVua3N0YXJ0ID0gJGNodW5rZW5kOwoJCX0KCQlyZXR1cm4gJG5ldzsKCX0KCQoJLyoKCSAqCVdyaXRlcyBwYXlsb2FkLCBpbmNsdWRpbmcgSFRUUCBoZWFkZXJzLCB0byAkdGhpcy0+b3V0Z29pbmdfcGF5bG9hZC4KCSAqLwoJZnVuY3Rpb24gYnVpbGRQYXlsb2FkKCRkYXRhLCAkY29va2llX3N0ciA9ICcnKSB7CgkJLy8gYWRkIGNvbnRlbnQtbGVuZ3RoIGhlYWRlcgoJCSR0aGlzLT5vdXRnb2luZ19oZWFkZXJzWydDb250ZW50LUxlbmd0aCddID0gc3RybGVuKCRkYXRhKTsKCQkkdGhpcy0+ZGVidWcoJ3NldCBDb250ZW50LUxlbmd0aDogJyAuICR0aGlzLT5vdXRnb2luZ19oZWFkZXJzWydDb250ZW50LUxlbmd0aCddKTsKCgkJLy8gc3RhcnQgYnVpbGRpbmcgb3V0Z29pbmcgcGF5bG9hZDoKCQkkcmVxID0gIiR0aGlzLT5yZXF1ZXN0X21ldGhvZCAkdGhpcy0+dXJpIEhUVFAvJHRoaXMtPnByb3RvY29sX3ZlcnNpb24iOwoJCSR0aGlzLT5kZWJ1ZygiSFRUUCByZXF1ZXN0OiAkcmVxIik7CgkJJHRoaXMtPm91dGdvaW5nX3BheWxvYWQgPSAiJHJlcVxyXG4iOwoKCQkvLyBsb29wIHRocnUgaGVhZGVycywgc2VyaWFsaXppbmcKCQlmb3JlYWNoKCR0aGlzLT5vdXRnb2luZ19oZWFkZXJzIGFzICRrID0+ICR2KXsKCQkJJGhkciA9ICRrLic6ICcuJHY7CgkJCSR0aGlzLT5kZWJ1ZygiSFRUUCBoZWFkZXI6ICRoZHIiKTsKCQkJJHRoaXMtPm91dGdvaW5nX3BheWxvYWQgLj0gIiRoZHJcclxuIjsKCQl9CgoJCS8vIGFkZCBhbnkgY29va2llcwoJCWlmICgkY29va2llX3N0ciAhPSAnJykgewoJCQkkaGRyID0gJ0Nvb2tpZTogJy4kY29va2llX3N0cjsKCQkJJHRoaXMtPmRlYnVnKCJIVFRQIGhlYWRlcjogJGhkciIpOwoJCQkkdGhpcy0+b3V0Z29pbmdfcGF5bG9hZCAuPSAiJGhkclxyXG4iOwoJCX0KCgkJLy8gaGVhZGVyL2JvZHkgc2VwYXJhdG9yCgkJJHRoaXMtPm91dGdvaW5nX3BheWxvYWQgLj0gIlxyXG4iOwoJCQoJCS8vIGFkZCBkYXRhCgkJJHRoaXMtPm91dGdvaW5nX3BheWxvYWQgLj0gJGRhdGE7Cgl9CgoJZnVuY3Rpb24gc2VuZFJlcXVlc3QoJGRhdGEsICRjb29raWVzID0gTlVMTCkgewoJCS8vIGJ1aWxkIGNvb2tpZSBzdHJpbmcKCQkkY29va2llX3N0ciA9ICR0aGlzLT5nZXRDb29raWVzRm9yUmVxdWVzdCgkY29va2llcywgKCgkdGhpcy0+c2NoZW1lID09ICdzc2wnKSB8fCAoJHRoaXMtPnNjaGVtZSA9PSAnaHR0cHMnKSkpOwoKCQkvLyBidWlsZCBwYXlsb2FkCgkJJHRoaXMtPmJ1aWxkUGF5bG9hZCgkZGF0YSwgJGNvb2tpZV9zdHIpOwoKCSAgaWYgKCR0aGlzLT5zY2hlbWUgPT0gJ2h0dHAnIHx8ICR0aGlzLT5zY2hlbWUgPT0gJ3NzbCcpIHsKCQkvLyBzZW5kIHBheWxvYWQKCQlpZighZnB1dHMoJHRoaXMtPmZwLCAkdGhpcy0+b3V0Z29pbmdfcGF5bG9hZCwgc3RybGVuKCR0aGlzLT5vdXRnb2luZ19wYXlsb2FkKSkpIHsKCQkJJHRoaXMtPnNldEVycm9yKCdjb3VsZG5cJ3Qgd3JpdGUgbWVzc2FnZSBkYXRhIHRvIHNvY2tldCcpOwoJCQkkdGhpcy0+ZGVidWcoJ2NvdWxkblwndCB3cml0ZSBtZXNzYWdlIGRhdGEgdG8gc29ja2V0Jyk7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJJHRoaXMtPmRlYnVnKCd3cm90ZSBkYXRhIHRvIHNvY2tldCwgbGVuZ3RoID0gJyAuIHN0cmxlbigkdGhpcy0+b3V0Z29pbmdfcGF5bG9hZCkpOwoJCXJldHVybiB0cnVlOwoJICB9IGVsc2UgaWYgKCR0aGlzLT5zY2hlbWUgPT0gJ2h0dHBzJykgewoJCS8vIHNldCBwYXlsb2FkCgkJLy8gVE9ETzogY1VSTCBkb2VzIHNheSB0aGlzIHNob3VsZCBvbmx5IGJlIHRoZSB2ZXJiLCBhbmQgaW4gZmFjdCBpdAoJCS8vIHR1cm5zIG91dCB0aGF0IHRoZSBVUkkgYW5kIEhUVFAgdmVyc2lvbiBhcmUgYXBwZW5kZWQgdG8gdGhpcywgd2hpY2gKCQkvLyBzb21lIHNlcnZlcnMgcmVmdXNlIHRvIHdvcmsgd2l0aAoJCS8vY3VybF9zZXRvcHQoJHRoaXMtPmNoLCBDVVJMT1BUX0NVU1RPTVJFUVVFU1QsICR0aGlzLT5vdXRnb2luZ19wYXlsb2FkKTsKCQlmb3JlYWNoKCR0aGlzLT5vdXRnb2luZ19oZWFkZXJzIGFzICRrID0+ICR2KXsKCQkJJGN1cmxfaGVhZGVyc1tdID0gIiRrOiAkdiI7CgkJfQoJCWlmICgkY29va2llX3N0ciAhPSAnJykgewoJCQkkY3VybF9oZWFkZXJzW10gPSAnQ29va2llOiAnIC4gJGNvb2tpZV9zdHI7CgkJfQoJCWN1cmxfc2V0b3B0KCR0aGlzLT5jaCwgQ1VSTE9QVF9IVFRQSEVBREVSLCAkY3VybF9oZWFkZXJzKTsKCQlpZiAoJHRoaXMtPnJlcXVlc3RfbWV0aG9kID09ICJQT1NUIikgewoJICAJCWN1cmxfc2V0b3B0KCR0aGlzLT5jaCwgQ1VSTE9QVF9QT1NULCAxKTsKCSAgCQljdXJsX3NldG9wdCgkdGhpcy0+Y2gsIENVUkxPUFRfUE9TVEZJRUxEUywgJGRhdGEpOwoJICAJfSBlbHNlIHsKCSAgCX0KCQkkdGhpcy0+ZGVidWcoJ3NldCBjVVJMIHBheWxvYWQnKTsKCQlyZXR1cm4gdHJ1ZTsKCSAgfQoJfQoKCWZ1bmN0aW9uIGdldFJlc3BvbnNlKCl7CgkJJHRoaXMtPmluY29taW5nX3BheWxvYWQgPSAnJzsKCSAgICAKCSAgaWYgKCR0aGlzLT5zY2hlbWUgPT0gJ2h0dHAnIHx8ICR0aGlzLT5zY2hlbWUgPT0gJ3NzbCcpIHsKCSAgICAvLyBsb29wIHVudGlsIGhlYWRlcnMgaGF2ZSBiZWVuIHJldHJpZXZlZAoJICAgICRkYXRhID0gJyc7CgkgICAgd2hpbGUgKCFpc3NldCgkbGIpKXsKCgkJCS8vIFdlIG1pZ2h0IEVPRiBkdXJpbmcgaGVhZGVyIHJlYWQuCgkJCWlmKGZlb2YoJHRoaXMtPmZwKSkgewoJCQkJJHRoaXMtPmluY29taW5nX3BheWxvYWQgPSAkZGF0YTsKCQkJCSR0aGlzLT5kZWJ1ZygnZm91bmQgbm8gaGVhZGVycyBiZWZvcmUgRU9GIGFmdGVyIGxlbmd0aCAnIC4gc3RybGVuKCRkYXRhKSk7CgkJCQkkdGhpcy0+ZGVidWcoInJlY2VpdmVkIGJlZm9yZSBFT0Y6XG4iIC4gJGRhdGEpOwoJCQkJJHRoaXMtPnNldEVycm9yKCdzZXJ2ZXIgZmFpbGVkIHRvIHNlbmQgaGVhZGVycycpOwoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgoJCQkkdG1wID0gZmdldHMoJHRoaXMtPmZwLCAyNTYpOwoJCQkkdG1wbGVuID0gc3RybGVuKCR0bXApOwoJCQkkdGhpcy0+ZGVidWcoInJlYWQgbGluZSBvZiAkdG1wbGVuIGJ5dGVzOiAiIC4gdHJpbSgkdG1wKSk7CgoJCQlpZiAoJHRtcGxlbiA9PSAwKSB7CgkJCQkkdGhpcy0+aW5jb21pbmdfcGF5bG9hZCA9ICRkYXRhOwoJCQkJJHRoaXMtPmRlYnVnKCdzb2NrZXQgcmVhZCBvZiBoZWFkZXJzIHRpbWVkIG91dCBhZnRlciBsZW5ndGggJyAuIHN0cmxlbigkZGF0YSkpOwoJCQkJJHRoaXMtPmRlYnVnKCJyZWFkIGJlZm9yZSB0aW1lb3V0OiAiIC4gJGRhdGEpOwoJCQkJJHRoaXMtPnNldEVycm9yKCdzb2NrZXQgcmVhZCBvZiBoZWFkZXJzIHRpbWVkIG91dCcpOwoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgoJCQkkZGF0YSAuPSAkdG1wOwoJCQkkcG9zID0gc3RycG9zKCRkYXRhLCJcclxuXHJcbiIpOwoJCQlpZigkcG9zID4gMSl7CgkJCQkkbGIgPSAiXHJcbiI7CgkJCX0gZWxzZSB7CgkJCQkkcG9zID0gc3RycG9zKCRkYXRhLCJcblxuIik7CgkJCQlpZigkcG9zID4gMSl7CgkJCQkJJGxiID0gIlxuIjsKCQkJCX0KCQkJfQoJCQkvLyByZW1vdmUgMTAwIGhlYWRlcgoJCQlpZihpc3NldCgkbGIpICYmIGVyZWcoJ15IVFRQLzEuMSAxMDAnLCRkYXRhKSl7CgkJCQl1bnNldCgkbGIpOwoJCQkJJGRhdGEgPSAnJzsKCQkJfS8vCgkJfQoJCS8vIHN0b3JlIGhlYWRlciBkYXRhCgkJJHRoaXMtPmluY29taW5nX3BheWxvYWQgLj0gJGRhdGE7CgkJJHRoaXMtPmRlYnVnKCdmb3VuZCBlbmQgb2YgaGVhZGVycyBhZnRlciBsZW5ndGggJyAuIHN0cmxlbigkZGF0YSkpOwoJCS8vIHByb2Nlc3MgaGVhZGVycwoJCSRoZWFkZXJfZGF0YSA9IHRyaW0oc3Vic3RyKCRkYXRhLDAsJHBvcykpOwoJCSRoZWFkZXJfYXJyYXkgPSBleHBsb2RlKCRsYiwkaGVhZGVyX2RhdGEpOwoJCSR0aGlzLT5pbmNvbWluZ19oZWFkZXJzID0gYXJyYXkoKTsKCQkkdGhpcy0+aW5jb21pbmdfY29va2llcyA9IGFycmF5KCk7CgkJZm9yZWFjaCgkaGVhZGVyX2FycmF5IGFzICRoZWFkZXJfbGluZSl7CgkJCSRhcnIgPSBleHBsb2RlKCc6JywkaGVhZGVyX2xpbmUsIDIpOwoJCQlpZihjb3VudCgkYXJyKSA+IDEpewoJCQkJJGhlYWRlcl9uYW1lID0gc3RydG9sb3dlcih0cmltKCRhcnJbMF0pKTsKCQkJCSR0aGlzLT5pbmNvbWluZ19oZWFkZXJzWyRoZWFkZXJfbmFtZV0gPSB0cmltKCRhcnJbMV0pOwoJCQkJaWYgKCRoZWFkZXJfbmFtZSA9PSAnc2V0LWNvb2tpZScpIHsKCQkJCQkvLyBUT0RPOiBhbGxvdyBtdWx0aXBsZSBjb29raWVzIGZyb20gcGFyc2VDb29raWUKCQkJCQkkY29va2llID0gJHRoaXMtPnBhcnNlQ29va2llKHRyaW0oJGFyclsxXSkpOwoJCQkJCWlmICgkY29va2llKSB7CgkJCQkJCSR0aGlzLT5pbmNvbWluZ19jb29raWVzW10gPSAkY29va2llOwoJCQkJCQkkdGhpcy0+ZGVidWcoJ2ZvdW5kIGNvb2tpZTogJyAuICRjb29raWVbJ25hbWUnXSAuICcgPSAnIC4gJGNvb2tpZVsndmFsdWUnXSk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJJHRoaXMtPmRlYnVnKCdkaWQgbm90IGZpbmQgY29va2llIGluICcgLiB0cmltKCRhcnJbMV0pKTsKCQkJCQl9CiAgICAJCQl9CgkJCX0gZWxzZSBpZiAoaXNzZXQoJGhlYWRlcl9uYW1lKSkgewoJCQkJLy8gYXBwZW5kIGNvbnRpbnVhdGlvbiBsaW5lIHRvIHByZXZpb3VzIGhlYWRlcgoJCQkJJHRoaXMtPmluY29taW5nX2hlYWRlcnNbJGhlYWRlcl9uYW1lXSAuPSAkbGIgLiAnICcgLiAkaGVhZGVyX2xpbmU7CgkJCX0KCQl9CgkJCgkJLy8gbG9vcCB1bnRpbCBtc2cgaGFzIGJlZW4gcmVjZWl2ZWQKCQlpZiAoaXNzZXQoJHRoaXMtPmluY29taW5nX2hlYWRlcnNbJ3RyYW5zZmVyLWVuY29kaW5nJ10pICYmIHN0cnRvbG93ZXIoJHRoaXMtPmluY29taW5nX2hlYWRlcnNbJ3RyYW5zZmVyLWVuY29kaW5nJ10pID09ICdjaHVua2VkJykgewoJCQkkY29udGVudF9sZW5ndGggPSAgMjE0NzQ4MzY0NzsJLy8gaWdub3JlIGFueSBjb250ZW50LWxlbmd0aCBoZWFkZXIKCQkJJGNodW5rZWQgPSB0cnVlOwoJCQkkdGhpcy0+ZGVidWcoIndhbnQgdG8gcmVhZCBjaHVua2VkIGNvbnRlbnQiKTsKCQl9IGVsc2VpZiAoaXNzZXQoJHRoaXMtPmluY29taW5nX2hlYWRlcnNbJ2NvbnRlbnQtbGVuZ3RoJ10pKSB7CgkJCSRjb250ZW50X2xlbmd0aCA9ICR0aGlzLT5pbmNvbWluZ19oZWFkZXJzWydjb250ZW50LWxlbmd0aCddOwoJCQkkY2h1bmtlZCA9IGZhbHNlOwoJCQkkdGhpcy0+ZGVidWcoIndhbnQgdG8gcmVhZCBjb250ZW50IG9mIGxlbmd0aCAkY29udGVudF9sZW5ndGgiKTsKCQl9IGVsc2UgewoJCQkkY29udGVudF9sZW5ndGggPSAgMjE0NzQ4MzY0NzsKCQkJJGNodW5rZWQgPSBmYWxzZTsKCQkJJHRoaXMtPmRlYnVnKCJ3YW50IHRvIHJlYWQgY29udGVudCB0byBFT0YiKTsKCQl9CgkJJGRhdGEgPSAnJzsKCQlkbyB7CgkJCWlmICgkY2h1bmtlZCkgewoJCQkJJHRtcCA9IGZnZXRzKCR0aGlzLT5mcCwgMjU2KTsKCQkJCSR0bXBsZW4gPSBzdHJsZW4oJHRtcCk7CgkJCQkkdGhpcy0+ZGVidWcoInJlYWQgY2h1bmsgbGluZSBvZiAkdG1wbGVuIGJ5dGVzIik7CgkJCQlpZiAoJHRtcGxlbiA9PSAwKSB7CgkJCQkJJHRoaXMtPmluY29taW5nX3BheWxvYWQgPSAkZGF0YTsKCQkJCQkkdGhpcy0+ZGVidWcoJ3NvY2tldCByZWFkIG9mIGNodW5rIGxlbmd0aCB0aW1lZCBvdXQgYWZ0ZXIgbGVuZ3RoICcgLiBzdHJsZW4oJGRhdGEpKTsKCQkJCQkkdGhpcy0+ZGVidWcoInJlYWQgYmVmb3JlIHRpbWVvdXQ6XG4iIC4gJGRhdGEpOwoJCQkJCSR0aGlzLT5zZXRFcnJvcignc29ja2V0IHJlYWQgb2YgY2h1bmsgbGVuZ3RoIHRpbWVkIG91dCcpOwoJCQkJCXJldHVybiBmYWxzZTsKCQkJCX0KCQkJCSRjb250ZW50X2xlbmd0aCA9IGhleGRlYyh0cmltKCR0bXApKTsKCQkJCSR0aGlzLT5kZWJ1ZygiY2h1bmsgbGVuZ3RoICRjb250ZW50X2xlbmd0aCIpOwoJCQl9CgkJCSRzdHJsZW4gPSAwOwoJCSAgICB3aGlsZSAoKCRzdHJsZW4gPCAkY29udGVudF9sZW5ndGgpICYmICghZmVvZigkdGhpcy0+ZnApKSkgewoJCSAgICAJJHJlYWRsZW4gPSBtaW4oODE5MiwgJGNvbnRlbnRfbGVuZ3RoIC0gJHN0cmxlbik7CgkJCQkkdG1wID0gZnJlYWQoJHRoaXMtPmZwLCAkcmVhZGxlbik7CgkJCQkkdG1wbGVuID0gc3RybGVuKCR0bXApOwoJCQkJJHRoaXMtPmRlYnVnKCJyZWFkIGJ1ZmZlciBvZiAkdG1wbGVuIGJ5dGVzIik7CgkJCQlpZiAoKCR0bXBsZW4gPT0gMCkgJiYgKCFmZW9mKCR0aGlzLT5mcCkpKSB7CgkJCQkJJHRoaXMtPmluY29taW5nX3BheWxvYWQgPSAkZGF0YTsKCQkJCQkkdGhpcy0+ZGVidWcoJ3NvY2tldCByZWFkIG9mIGJvZHkgdGltZWQgb3V0IGFmdGVyIGxlbmd0aCAnIC4gc3RybGVuKCRkYXRhKSk7CgkJCQkJJHRoaXMtPmRlYnVnKCJyZWFkIGJlZm9yZSB0aW1lb3V0OlxuIiAuICRkYXRhKTsKCQkJCQkkdGhpcy0+c2V0RXJyb3IoJ3NvY2tldCByZWFkIG9mIGJvZHkgdGltZWQgb3V0Jyk7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQkJJHN0cmxlbiArPSAkdG1wbGVuOwoJCQkJJGRhdGEgLj0gJHRtcDsKCQkJfQoJCQlpZiAoJGNodW5rZWQgJiYgKCRjb250ZW50X2xlbmd0aCA+IDApKSB7CgkJCQkkdG1wID0gZmdldHMoJHRoaXMtPmZwLCAyNTYpOwoJCQkJJHRtcGxlbiA9IHN0cmxlbigkdG1wKTsKCQkJCSR0aGlzLT5kZWJ1ZygicmVhZCBjaHVuayB0ZXJtaW5hdG9yIG9mICR0bXBsZW4gYnl0ZXMiKTsKCQkJCWlmICgkdG1wbGVuID09IDApIHsKCQkJCQkkdGhpcy0+aW5jb21pbmdfcGF5bG9hZCA9ICRkYXRhOwoJCQkJCSR0aGlzLT5kZWJ1Zygnc29ja2V0IHJlYWQgb2YgY2h1bmsgdGVybWluYXRvciB0aW1lZCBvdXQgYWZ0ZXIgbGVuZ3RoICcgLiBzdHJsZW4oJGRhdGEpKTsKCQkJCQkkdGhpcy0+ZGVidWcoInJlYWQgYmVmb3JlIHRpbWVvdXQ6XG4iIC4gJGRhdGEpOwoJCQkJCSR0aGlzLT5zZXRFcnJvcignc29ja2V0IHJlYWQgb2YgY2h1bmsgdGVybWluYXRvciB0aW1lZCBvdXQnKTsKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9CgkJCX0KCQl9IHdoaWxlICgkY2h1bmtlZCAmJiAoJGNvbnRlbnRfbGVuZ3RoID4gMCkgJiYgKCFmZW9mKCR0aGlzLT5mcCkpKTsKCQlpZiAoZmVvZigkdGhpcy0+ZnApKSB7CgkJCSR0aGlzLT5kZWJ1ZygncmVhZCB0byBFT0YnKTsKCQl9CgkJJHRoaXMtPmRlYnVnKCdyZWFkIGJvZHkgb2YgbGVuZ3RoICcgLiBzdHJsZW4oJGRhdGEpKTsKCQkkdGhpcy0+aW5jb21pbmdfcGF5bG9hZCAuPSAkZGF0YTsKCQkkdGhpcy0+ZGVidWcoJ3JlY2VpdmVkIGEgdG90YWwgb2YgJy5zdHJsZW4oJHRoaXMtPmluY29taW5nX3BheWxvYWQpLicgYnl0ZXMgb2YgZGF0YSBmcm9tIHNlcnZlcicpOwoJCQoJCS8vIGNsb3NlIGZpbGVwb2ludGVyCgkJaWYoCgkJCShpc3NldCgkdGhpcy0+aW5jb21pbmdfaGVhZGVyc1snY29ubmVjdGlvbiddKSAmJiBzdHJ0b2xvd2VyKCR0aGlzLT5pbmNvbWluZ19oZWFkZXJzWydjb25uZWN0aW9uJ10pID09ICdjbG9zZScpIHx8IAoJCQkoISAkdGhpcy0+cGVyc2lzdGVudENvbm5lY3Rpb24pIHx8IGZlb2YoJHRoaXMtPmZwKSl7CgkJCWZjbG9zZSgkdGhpcy0+ZnApOwoJCQkkdGhpcy0+ZnAgPSBmYWxzZTsKCQkJJHRoaXMtPmRlYnVnKCdjbG9zZWQgc29ja2V0Jyk7CgkJfQoJCQoJCS8vIGNvbm5lY3Rpb24gd2FzIGNsb3NlZCB1bmV4cGVjdGVkbHkKCQlpZigkdGhpcy0+aW5jb21pbmdfcGF5bG9hZCA9PSAnJyl7CgkJCSR0aGlzLT5zZXRFcnJvcignbm8gcmVzcG9uc2UgZnJvbSBzZXJ2ZXInKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQkKCQkvLyBkZWNvZGUgdHJhbnNmZXItZW5jb2RpbmcKLy8JCWlmKGlzc2V0KCR0aGlzLT5pbmNvbWluZ19oZWFkZXJzWyd0cmFuc2Zlci1lbmNvZGluZyddKSAmJiBzdHJ0b2xvd2VyKCR0aGlzLT5pbmNvbWluZ19oZWFkZXJzWyd0cmFuc2Zlci1lbmNvZGluZyddKSA9PSAnY2h1bmtlZCcpewovLwkJCWlmKCEkZGF0YSA9ICR0aGlzLT5kZWNvZGVDaHVua2VkKCRkYXRhLCAkbGIpKXsKLy8JCQkJJHRoaXMtPnNldEVycm9yKCdEZWNvZGluZyBvZiBjaHVua2VkIGRhdGEgZmFpbGVkJyk7Ci8vCQkJCXJldHVybiBmYWxzZTsKLy8JCQl9CgkJCS8vcHJpbnQgIjxwcmU+XG5kZS1jaHVua2VkOlxuLS0tLS0tLS0tLS0tLS0tXG4kZGF0YVxuXG4tLS0tLS0tLS0tLS0tLS1cbjwvcHJlPiI7CgkJCS8vIHNldCBkZWNvZGVkIHBheWxvYWQKLy8JCQkkdGhpcy0+aW5jb21pbmdfcGF5bG9hZCA9ICRoZWFkZXJfZGF0YS4kbGIuJGxiLiRkYXRhOwovLwkJfQoJCgkgIH0gZWxzZSBpZiAoJHRoaXMtPnNjaGVtZSA9PSAnaHR0cHMnKSB7CgkJLy8gc2VuZCBhbmQgcmVjZWl2ZQoJCSR0aGlzLT5kZWJ1Zygnc2VuZCBhbmQgcmVjZWl2ZSB3aXRoIGNVUkwnKTsKCQkkdGhpcy0+aW5jb21pbmdfcGF5bG9hZCA9IGN1cmxfZXhlYygkdGhpcy0+Y2gpOwoJCSRkYXRhID0gJHRoaXMtPmluY29taW5nX3BheWxvYWQ7CgogICAgICAgICRjRXJyID0gY3VybF9lcnJvcigkdGhpcy0+Y2gpOwoJCWlmICgkY0VyciAhPSAnJykgewogICAgICAgIAkkZXJyID0gJ2NVUkwgRVJST1I6ICcuY3VybF9lcnJubygkdGhpcy0+Y2gpLic6ICcuJGNFcnIuJzxicj4nOwogICAgICAgIAkvLyBUT0RPOiB0aGVyZSBpcyBhIFBIUCBidWcgdGhhdCBjYW4gY2F1c2UgdGhpcyB0byBTRUdWIGZvciBDVVJMSU5GT19DT05URU5UX1RZUEUKCQkJZm9yZWFjaChjdXJsX2dldGluZm8oJHRoaXMtPmNoKSBhcyAkayA9PiAkdil7CgkJCQkkZXJyIC49ICIkazogJHY8YnI+IjsKCQkJfQoJCQkkdGhpcy0+ZGVidWcoJGVycik7CgkJCSR0aGlzLT5zZXRFcnJvcigkZXJyKTsKCQkJY3VybF9jbG9zZSgkdGhpcy0+Y2gpOwoJICAgIAlyZXR1cm4gZmFsc2U7CgkJfSBlbHNlIHsKCQkJLy9lY2hvICc8cHJlPic7CgkJCS8vdmFyX2R1bXAoY3VybF9nZXRpbmZvKCR0aGlzLT5jaCkpOwoJCQkvL2VjaG8gJzwvcHJlPic7CgkJfQoJCS8vIGNsb3NlIGN1cmwKCQkkdGhpcy0+ZGVidWcoJ05vIGNVUkwgZXJyb3IsIGNsb3NpbmcgY1VSTCcpOwoJCWN1cmxfY2xvc2UoJHRoaXMtPmNoKTsKCQkKCQkvLyByZW1vdmUgMTAwIGhlYWRlcihzKQoJCXdoaWxlIChlcmVnKCdeSFRUUC8xLjEgMTAwJywkZGF0YSkpIHsKCQkJaWYgKCRwb3MgPSBzdHJwb3MoJGRhdGEsIlxyXG5cclxuIikpIHsKCQkJCSRkYXRhID0gbHRyaW0oc3Vic3RyKCRkYXRhLCRwb3MpKTsKCQkJfSBlbHNlaWYoJHBvcyA9IHN0cnBvcygkZGF0YSwiXG5cbiIpICkgewoJCQkJJGRhdGEgPSBsdHJpbShzdWJzdHIoJGRhdGEsJHBvcykpOwoJCQl9CgkJfQoJCQoJCS8vIHNlcGFyYXRlIGNvbnRlbnQgZnJvbSBIVFRQIGhlYWRlcnMKCQlpZiAoJHBvcyA9IHN0cnBvcygkZGF0YSwiXHJcblxyXG4iKSkgewoJCQkkbGIgPSAiXHJcbiI7CgkJfSBlbHNlaWYoICRwb3MgPSBzdHJwb3MoJGRhdGEsIlxuXG4iKSkgewoJCQkkbGIgPSAiXG4iOwoJCX0gZWxzZSB7CgkJCSR0aGlzLT5kZWJ1Zygnbm8gcHJvcGVyIHNlcGFyYXRpb24gb2YgaGVhZGVycyBhbmQgZG9jdW1lbnQnKTsKCQkJJHRoaXMtPnNldEVycm9yKCdubyBwcm9wZXIgc2VwYXJhdGlvbiBvZiBoZWFkZXJzIGFuZCBkb2N1bWVudCcpOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCSRoZWFkZXJfZGF0YSA9IHRyaW0oc3Vic3RyKCRkYXRhLDAsJHBvcykpOwoJCSRoZWFkZXJfYXJyYXkgPSBleHBsb2RlKCRsYiwkaGVhZGVyX2RhdGEpOwoJCSRkYXRhID0gbHRyaW0oc3Vic3RyKCRkYXRhLCRwb3MpKTsKCQkkdGhpcy0+ZGVidWcoJ2ZvdW5kIHByb3BlciBzZXBhcmF0aW9uIG9mIGhlYWRlcnMgYW5kIGRvY3VtZW50Jyk7CgkJJHRoaXMtPmRlYnVnKCdjbGVhbmVkIGRhdGEsIHN0cmluZ2xlbjogJy5zdHJsZW4oJGRhdGEpKTsKCQkvLyBjbGVhbiBoZWFkZXJzCgkJZm9yZWFjaCAoJGhlYWRlcl9hcnJheSBhcyAkaGVhZGVyX2xpbmUpIHsKCQkJJGFyciA9IGV4cGxvZGUoJzonLCRoZWFkZXJfbGluZSwyKTsKCQkJaWYoY291bnQoJGFycikgPiAxKXsKCQkJCSRoZWFkZXJfbmFtZSA9IHN0cnRvbG93ZXIodHJpbSgkYXJyWzBdKSk7CgkJCQkkdGhpcy0+aW5jb21pbmdfaGVhZGVyc1skaGVhZGVyX25hbWVdID0gdHJpbSgkYXJyWzFdKTsKCQkJCWlmICgkaGVhZGVyX25hbWUgPT0gJ3NldC1jb29raWUnKSB7CgkJCQkJLy8gVE9ETzogYWxsb3cgbXVsdGlwbGUgY29va2llcyBmcm9tIHBhcnNlQ29va2llCgkJCQkJJGNvb2tpZSA9ICR0aGlzLT5wYXJzZUNvb2tpZSh0cmltKCRhcnJbMV0pKTsKCQkJCQlpZiAoJGNvb2tpZSkgewoJCQkJCQkkdGhpcy0+aW5jb21pbmdfY29va2llc1tdID0gJGNvb2tpZTsKCQkJCQkJJHRoaXMtPmRlYnVnKCdmb3VuZCBjb29raWU6ICcgLiAkY29va2llWyduYW1lJ10gLiAnID0gJyAuICRjb29raWVbJ3ZhbHVlJ10pOwoJCQkJCX0gZWxzZSB7CgkJCQkJCSR0aGlzLT5kZWJ1ZygnZGlkIG5vdCBmaW5kIGNvb2tpZSBpbiAnIC4gdHJpbSgkYXJyWzFdKSk7CgkJCQkJfQogICAgCQkJfQoJCQl9IGVsc2UgaWYgKGlzc2V0KCRoZWFkZXJfbmFtZSkpIHsKCQkJCS8vIGFwcGVuZCBjb250aW51YXRpb24gbGluZSB0byBwcmV2aW91cyBoZWFkZXIKCQkJCSR0aGlzLT5pbmNvbWluZ19oZWFkZXJzWyRoZWFkZXJfbmFtZV0gLj0gJGxiIC4gJyAnIC4gJGhlYWRlcl9saW5lOwoJCQl9CgkJfQoJICB9CgoJCSRhcnIgPSBleHBsb2RlKCcgJywgJGhlYWRlcl9hcnJheVswXSwgMyk7CgkJJGh0dHBfdmVyc2lvbiA9ICRhcnJbMF07CgkJJGh0dHBfc3RhdHVzID0gaW50dmFsKCRhcnJbMV0pOwoJCSRodHRwX3JlYXNvbiA9IGNvdW50KCRhcnIpID4gMiA/ICRhcnJbMl0gOiAnJzsKCiAJCS8vIHNlZSBpZiB3ZSBuZWVkIHRvIHJlc2VuZCB0aGUgcmVxdWVzdCB3aXRoIGh0dHAgZGlnZXN0IGF1dGhlbnRpY2F0aW9uCiAJCWlmIChpc3NldCgkdGhpcy0+aW5jb21pbmdfaGVhZGVyc1snbG9jYXRpb24nXSkgJiYgJGh0dHBfc3RhdHVzID09IDMwMSkgewogCQkJJHRoaXMtPmRlYnVnKCJHb3QgMzAxICRodHRwX3JlYXNvbiB3aXRoIExvY2F0aW9uOiAiIC4gJHRoaXMtPmluY29taW5nX2hlYWRlcnNbJ2xvY2F0aW9uJ10pOwogCQkJJHRoaXMtPnNldFVSTCgkdGhpcy0+aW5jb21pbmdfaGVhZGVyc1snbG9jYXRpb24nXSk7CgkJCSR0aGlzLT50cnlhZ2FpbiA9IHRydWU7CgkJCXJldHVybiBmYWxzZTsKCQl9CgogCQkvLyBzZWUgaWYgd2UgbmVlZCB0byByZXNlbmQgdGhlIHJlcXVlc3Qgd2l0aCBodHRwIGRpZ2VzdCBhdXRoZW50aWNhdGlvbgogCQlpZiAoaXNzZXQoJHRoaXMtPmluY29taW5nX2hlYWRlcnNbJ3d3dy1hdXRoZW50aWNhdGUnXSkgJiYgJGh0dHBfc3RhdHVzID09IDQwMSkgewogCQkJJHRoaXMtPmRlYnVnKCJHb3QgNDAxICRodHRwX3JlYXNvbiB3aXRoIFdXVy1BdXRoZW50aWNhdGU6ICIgLiAkdGhpcy0+aW5jb21pbmdfaGVhZGVyc1snd3d3LWF1dGhlbnRpY2F0ZSddKTsKIAkJCWlmIChzdHJzdHIoJHRoaXMtPmluY29taW5nX2hlYWRlcnNbJ3d3dy1hdXRoZW50aWNhdGUnXSwgIkRpZ2VzdCAiKSkgewogCQkJCSR0aGlzLT5kZWJ1ZygnU2VydmVyIHdhbnRzIGRpZ2VzdCBhdXRoZW50aWNhdGlvbicpOwogCQkJCS8vIHJlbW92ZSAiRGlnZXN0ICIgZnJvbSBvdXIgZWxlbWVudHMKIAkJCQkkZGlnZXN0U3RyaW5nID0gc3RyX3JlcGxhY2UoJ0RpZ2VzdCAnLCAnJywgJHRoaXMtPmluY29taW5nX2hlYWRlcnNbJ3d3dy1hdXRoZW50aWNhdGUnXSk7CiAJCQkJCiAJCQkJLy8gcGFyc2UgZWxlbWVudHMgaW50byBhcnJheQogCQkJCSRkaWdlc3RFbGVtZW50cyA9IGV4cGxvZGUoJywnLCAkZGlnZXN0U3RyaW5nKTsKIAkJCQlmb3JlYWNoICgkZGlnZXN0RWxlbWVudHMgYXMgJHZhbCkgewogCQkJCQkkdGVtcEVsZW1lbnQgPSBleHBsb2RlKCc9JywgdHJpbSgkdmFsKSwgMik7CiAJCQkJCSRkaWdlc3RSZXF1ZXN0WyR0ZW1wRWxlbWVudFswXV0gPSBzdHJfcmVwbGFjZSgiXCIiLCAnJywgJHRlbXBFbGVtZW50WzFdKTsKIAkJCQl9CgoJCQkJLy8gc2hvdWxkIGhhdmUgKGF0IGxlYXN0KSBxb3AsIHJlYWxtLCBub25jZQogCQkJCWlmIChpc3NldCgkZGlnZXN0UmVxdWVzdFsnbm9uY2UnXSkpIHsKIAkJCQkJJHRoaXMtPnNldENyZWRlbnRpYWxzKCR0aGlzLT51c2VybmFtZSwgJHRoaXMtPnBhc3N3b3JkLCAnZGlnZXN0JywgJGRpZ2VzdFJlcXVlc3QpOwogCQkJCQkkdGhpcy0+dHJ5YWdhaW4gPSB0cnVlOwogCQkJCQlyZXR1cm4gZmFsc2U7CiAJCQkJfQogCQkJfQoJCQkkdGhpcy0+ZGVidWcoJ0hUVFAgYXV0aGVudGljYXRpb24gZmFpbGVkJyk7CgkJCSR0aGlzLT5zZXRFcnJvcignSFRUUCBhdXRoZW50aWNhdGlvbiBmYWlsZWQnKTsKCQkJcmV0dXJuIGZhbHNlOwogCQl9CgkJCgkJaWYgKAoJCQkoJGh0dHBfc3RhdHVzID49IDMwMCAmJiAkaHR0cF9zdGF0dXMgPD0gMzA3KSB8fAoJCQkoJGh0dHBfc3RhdHVzID49IDQwMCAmJiAkaHR0cF9zdGF0dXMgPD0gNDE3KSB8fAoJCQkoJGh0dHBfc3RhdHVzID49IDUwMSAmJiAkaHR0cF9zdGF0dXMgPD0gNTA1KQoJCSAgICkgewoJCQkkdGhpcy0+c2V0RXJyb3IoIlVuc3VwcG9ydGVkIEhUVFAgcmVzcG9uc2Ugc3RhdHVzICRodHRwX3N0YXR1cyAkaHR0cF9yZWFzb24gKHNvYXBjbGllbnQtPnJlc3BvbnNlIGhhcyBjb250ZW50cyBvZiB0aGUgcmVzcG9uc2UpIik7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCS8vIGRlY29kZSBjb250ZW50LWVuY29kaW5nCgkJaWYoaXNzZXQoJHRoaXMtPmluY29taW5nX2hlYWRlcnNbJ2NvbnRlbnQtZW5jb2RpbmcnXSkgJiYgJHRoaXMtPmluY29taW5nX2hlYWRlcnNbJ2NvbnRlbnQtZW5jb2RpbmcnXSAhPSAnJyl7CgkJCWlmKHN0cnRvbG93ZXIoJHRoaXMtPmluY29taW5nX2hlYWRlcnNbJ2NvbnRlbnQtZW5jb2RpbmcnXSkgPT0gJ2RlZmxhdGUnIHx8IHN0cnRvbG93ZXIoJHRoaXMtPmluY29taW5nX2hlYWRlcnNbJ2NvbnRlbnQtZW5jb2RpbmcnXSkgPT0gJ2d6aXAnKXsKICAgIAkJCS8vIGlmIGRlY29kaW5nIHdvcmtzLCB1c2UgaXQuIGVsc2UgYXNzdW1lIGRhdGEgd2Fzbid0IGd6ZW5jb2RlZAogICAgCQkJaWYoZnVuY3Rpb25fZXhpc3RzKCdnemluZmxhdGUnKSl7CgkJCQkJLy8kdGltZXItPnNldE1hcmtlcignc3RhcnRpbmcgZGVjb2Rpbmcgb2YgZ3ppcC9kZWZsYXRlZCBjb250ZW50Jyk7CgkJCQkJLy8gSUlTIDUgcmVxdWlyZXMgZ3ppbmZsYXRlIGluc3RlYWQgb2YgZ3p1bmNvbXByZXNzIChzaW1pbGFyIHRvIElFIDUgYW5kIGd6ZGVmbGF0ZSB2LiBnemNvbXByZXNzKQoJCQkJCS8vIHRoaXMgbWVhbnMgdGhlcmUgYXJlIG5vIFpsaWIgaGVhZGVycywgYWx0aG91Z2ggdGhlcmUgc2hvdWxkIGJlCgkJCQkJJHRoaXMtPmRlYnVnKCdUaGUgZ3ppbmZsYXRlIGZ1bmN0aW9uIGV4aXN0cycpOwoJCQkJCSRkYXRhbGVuID0gc3RybGVuKCRkYXRhKTsKCQkJCQlpZiAoJHRoaXMtPmluY29taW5nX2hlYWRlcnNbJ2NvbnRlbnQtZW5jb2RpbmcnXSA9PSAnZGVmbGF0ZScpIHsKCQkJCQkJaWYgKCRkZWd6ZGF0YSA9IEBnemluZmxhdGUoJGRhdGEpKSB7CgkgICAgCQkJCQkkZGF0YSA9ICRkZWd6ZGF0YTsKCSAgICAJCQkJCSR0aGlzLT5kZWJ1ZygnVGhlIHBheWxvYWQgaGFzIGJlZW4gaW5mbGF0ZWQgdG8gJyAuIHN0cmxlbigkZGF0YSkgLiAnIGJ5dGVzJyk7CgkgICAgCQkJCQlpZiAoc3RybGVuKCRkYXRhKSA8ICRkYXRhbGVuKSB7CgkgICAgCQkJCQkJLy8gdGVzdCBmb3IgdGhlIGNhc2UgdGhhdCB0aGUgcGF5bG9hZCBoYXMgYmVlbiBjb21wcmVzc2VkIHR3aWNlCgkJICAgIAkJCQkJJHRoaXMtPmRlYnVnKCdUaGUgaW5mbGF0ZWQgcGF5bG9hZCBpcyBzbWFsbGVyIHRoYW4gdGhlIGd6aXBwZWQgb25lOyB0cnkgYWdhaW4nKTsKCQkJCQkJCQlpZiAoJGRlZ3pkYXRhID0gQGd6aW5mbGF0ZSgkZGF0YSkpIHsKCQkJICAgIAkJCQkJJGRhdGEgPSAkZGVnemRhdGE7CgkJCSAgICAJCQkJCSR0aGlzLT5kZWJ1ZygnVGhlIHBheWxvYWQgaGFzIGJlZW4gaW5mbGF0ZWQgYWdhaW4gdG8gJyAuIHN0cmxlbigkZGF0YSkgLiAnIGJ5dGVzJyk7CgkJCQkJCQkJfQoJICAgIAkJCQkJfQoJICAgIAkJCQl9IGVsc2UgewoJICAgIAkJCQkJJHRoaXMtPmRlYnVnKCdFcnJvciB1c2luZyBnemluZmxhdGUgdG8gaW5mbGF0ZSB0aGUgcGF5bG9hZCcpOwoJICAgIAkJCQkJJHRoaXMtPnNldEVycm9yKCdFcnJvciB1c2luZyBnemluZmxhdGUgdG8gaW5mbGF0ZSB0aGUgcGF5bG9hZCcpOwoJICAgIAkJCQl9CgkJCQkJfSBlbHNlaWYgKCR0aGlzLT5pbmNvbWluZ19oZWFkZXJzWydjb250ZW50LWVuY29kaW5nJ10gPT0gJ2d6aXAnKSB7CgkJCQkJCWlmICgkZGVnemRhdGEgPSBAZ3ppbmZsYXRlKHN1YnN0cigkZGF0YSwgMTApKSkgewkvLyBkbyBvdXIgYmVzdAoJCQkJCQkJJGRhdGEgPSAkZGVnemRhdGE7CgkgICAgCQkJCQkkdGhpcy0+ZGVidWcoJ1RoZSBwYXlsb2FkIGhhcyBiZWVuIHVuLWd6aXBwZWQgdG8gJyAuIHN0cmxlbigkZGF0YSkgLiAnIGJ5dGVzJyk7CgkgICAgCQkJCQlpZiAoc3RybGVuKCRkYXRhKSA8ICRkYXRhbGVuKSB7CgkgICAgCQkJCQkJLy8gdGVzdCBmb3IgdGhlIGNhc2UgdGhhdCB0aGUgcGF5bG9hZCBoYXMgYmVlbiBjb21wcmVzc2VkIHR3aWNlCgkJICAgIAkJCQkJJHRoaXMtPmRlYnVnKCdUaGUgdW4tZ3ppcHBlZCBwYXlsb2FkIGlzIHNtYWxsZXIgdGhhbiB0aGUgZ3ppcHBlZCBvbmU7IHRyeSBhZ2FpbicpOwoJCQkJCQkJCWlmICgkZGVnemRhdGEgPSBAZ3ppbmZsYXRlKHN1YnN0cigkZGF0YSwgMTApKSkgewoJCQkgICAgCQkJCQkkZGF0YSA9ICRkZWd6ZGF0YTsKCQkJICAgIAkJCQkJJHRoaXMtPmRlYnVnKCdUaGUgcGF5bG9hZCBoYXMgYmVlbiB1bi1nemlwcGVkIGFnYWluIHRvICcgLiBzdHJsZW4oJGRhdGEpIC4gJyBieXRlcycpOwoJCQkJCQkJCX0KCSAgICAJCQkJCX0KCSAgICAJCQkJfSBlbHNlIHsKCSAgICAJCQkJCSR0aGlzLT5kZWJ1ZygnRXJyb3IgdXNpbmcgZ3ppbmZsYXRlIHRvIHVuLWd6aXAgdGhlIHBheWxvYWQnKTsKCQkJCQkJCSR0aGlzLT5zZXRFcnJvcignRXJyb3IgdXNpbmcgZ3ppbmZsYXRlIHRvIHVuLWd6aXAgdGhlIHBheWxvYWQnKTsKCSAgICAJCQkJfQoJCQkJCX0KCQkJCQkvLyR0aW1lci0+c2V0TWFya2VyKCdmaW5pc2hlZCBkZWNvZGluZyBvZiBnemlwL2RlZmxhdGVkIGNvbnRlbnQnKTsKCQkJCQkvL3ByaW50ICI8eG1wPlxuZGUtaW5mbGF0ZWQ6XG4tLS0tLS0tLS0tLS0tLS1cbiRkYXRhXG4tLS0tLS0tLS0tLS0tXG48L3htcD4iOwoJCQkJCS8vIHNldCBkZWNvZGVkIHBheWxvYWQKCQkJCQkkdGhpcy0+aW5jb21pbmdfcGF5bG9hZCA9ICRoZWFkZXJfZGF0YS4kbGIuJGxiLiRkYXRhOwogICAgCQkJfSBlbHNlIHsKCQkJCQkkdGhpcy0+ZGVidWcoJ1RoZSBzZXJ2ZXIgc2VudCBjb21wcmVzc2VkIGRhdGEuIFlvdXIgcGhwIGluc3RhbGwgbXVzdCBoYXZlIHRoZSBabGliIGV4dGVuc2lvbiBjb21waWxlZCBpbiB0byBzdXBwb3J0IHRoaXMuJyk7CgkJCQkJJHRoaXMtPnNldEVycm9yKCdUaGUgc2VydmVyIHNlbnQgY29tcHJlc3NlZCBkYXRhLiBZb3VyIHBocCBpbnN0YWxsIG11c3QgaGF2ZSB0aGUgWmxpYiBleHRlbnNpb24gY29tcGlsZWQgaW4gdG8gc3VwcG9ydCB0aGlzLicpOwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJJHRoaXMtPmRlYnVnKCdVbnN1cHBvcnRlZCBDb250ZW50LUVuY29kaW5nICcgLiAkdGhpcy0+aW5jb21pbmdfaGVhZGVyc1snY29udGVudC1lbmNvZGluZyddKTsKCQkJCSR0aGlzLT5zZXRFcnJvcignVW5zdXBwb3J0ZWQgQ29udGVudC1FbmNvZGluZyAnIC4gJHRoaXMtPmluY29taW5nX2hlYWRlcnNbJ2NvbnRlbnQtZW5jb2RpbmcnXSk7CgkJCX0KCQl9IGVsc2UgewoJCQkkdGhpcy0+ZGVidWcoJ05vIENvbnRlbnQtRW5jb2RpbmcgaGVhZGVyJyk7CgkJfQoJCQoJCWlmKHN0cmxlbigkZGF0YSkgPT0gMCl7CgkJCSR0aGlzLT5kZWJ1Zygnbm8gZGF0YSBhZnRlciBoZWFkZXJzIScpOwoJCQkkdGhpcy0+c2V0RXJyb3IoJ25vIGRhdGEgcHJlc2VudCBhZnRlciBIVFRQIGhlYWRlcnMnKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQkKCQlyZXR1cm4gJGRhdGE7Cgl9CgoJZnVuY3Rpb24gc2V0Q29udGVudFR5cGUoJHR5cGUsICRjaGFyc2V0ID0gZmFsc2UpIHsKCQkkdGhpcy0+b3V0Z29pbmdfaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSAkdHlwZSAuICgkY2hhcnNldCA/ICc7IGNoYXJzZXQ9JyAuICRjaGFyc2V0IDogJycpOwoJCSR0aGlzLT5kZWJ1Zygnc2V0IENvbnRlbnQtVHlwZTogJyAuICR0aGlzLT5vdXRnb2luZ19oZWFkZXJzWydDb250ZW50LVR5cGUnXSk7Cgl9CgoJZnVuY3Rpb24gdXNlUGVyc2lzdGVudENvbm5lY3Rpb24oKXsKCQlpZiAoaXNzZXQoJHRoaXMtPm91dGdvaW5nX2hlYWRlcnNbJ0FjY2VwdC1FbmNvZGluZyddKSkgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCSR0aGlzLT5wcm90b2NvbF92ZXJzaW9uID0gJzEuMSc7CgkJJHRoaXMtPnBlcnNpc3RlbnRDb25uZWN0aW9uID0gdHJ1ZTsKCQkkdGhpcy0+b3V0Z29pbmdfaGVhZGVyc1snQ29ubmVjdGlvbiddID0gJ0tlZXAtQWxpdmUnOwoJCSR0aGlzLT5kZWJ1Zygnc2V0IENvbm5lY3Rpb246ICcgLiAkdGhpcy0+b3V0Z29pbmdfaGVhZGVyc1snQ29ubmVjdGlvbiddKTsKCQlyZXR1cm4gdHJ1ZTsKCX0KCgkvKioKCSAqIHBhcnNlIGFuIGluY29taW5nIENvb2tpZSBpbnRvIGl0J3MgcGFydHMKCSAqCgkgKiBAcGFyYW0Jc3RyaW5nICRjb29raWVfc3RyIGNvbnRlbnQgb2YgY29va2llCgkgKiBAcmV0dXJuCWFycmF5IHdpdGggZGF0YSBvZiB0aGF0IGNvb2tpZQoJICogQGFjY2Vzcwlwcml2YXRlCgkgKi8KCS8qCgkgKiBUT0RPOiBhbGxvdyBhIFNldC1Db29raWUgc3RyaW5nIHRvIGJlIHBhcnNlZCBpbnRvIG11bHRpcGxlIGNvb2tpZXMKCSAqLwoJZnVuY3Rpb24gcGFyc2VDb29raWUoJGNvb2tpZV9zdHIpIHsKCQkkY29va2llX3N0ciA9IHN0cl9yZXBsYWNlKCc7ICcsICc7JywgJGNvb2tpZV9zdHIpIC4gJzsnOwoJCSRkYXRhID0gc3BsaXQoJzsnLCAkY29va2llX3N0cik7CgkJJHZhbHVlX3N0ciA9ICRkYXRhWzBdOwoKCQkkY29va2llX3BhcmFtID0gJ2RvbWFpbj0nOwoJCSRzdGFydCA9IHN0cnBvcygkY29va2llX3N0ciwgJGNvb2tpZV9wYXJhbSk7CgkJaWYgKCRzdGFydCA+IDApIHsKCQkJJGRvbWFpbiA9IHN1YnN0cigkY29va2llX3N0ciwgJHN0YXJ0ICsgc3RybGVuKCRjb29raWVfcGFyYW0pKTsKCQkJJGRvbWFpbiA9IHN1YnN0cigkZG9tYWluLCAwLCBzdHJwb3MoJGRvbWFpbiwgJzsnKSk7CgkJfSBlbHNlIHsKCQkJJGRvbWFpbiA9ICcnOwoJCX0KCgkJJGNvb2tpZV9wYXJhbSA9ICdleHBpcmVzPSc7CgkJJHN0YXJ0ID0gc3RycG9zKCRjb29raWVfc3RyLCAkY29va2llX3BhcmFtKTsKCQlpZiAoJHN0YXJ0ID4gMCkgewoJCQkkZXhwaXJlcyA9IHN1YnN0cigkY29va2llX3N0ciwgJHN0YXJ0ICsgc3RybGVuKCRjb29raWVfcGFyYW0pKTsKCQkJJGV4cGlyZXMgPSBzdWJzdHIoJGV4cGlyZXMsIDAsIHN0cnBvcygkZXhwaXJlcywgJzsnKSk7CgkJfSBlbHNlIHsKCQkJJGV4cGlyZXMgPSAnJzsKCQl9CgoJCSRjb29raWVfcGFyYW0gPSAncGF0aD0nOwoJCSRzdGFydCA9IHN0cnBvcygkY29va2llX3N0ciwgJGNvb2tpZV9wYXJhbSk7CgkJaWYgKCAkc3RhcnQgPiAwICkgewoJCQkkcGF0aCA9IHN1YnN0cigkY29va2llX3N0ciwgJHN0YXJ0ICsgc3RybGVuKCRjb29raWVfcGFyYW0pKTsKCQkJJHBhdGggPSBzdWJzdHIoJHBhdGgsIDAsIHN0cnBvcygkcGF0aCwgJzsnKSk7CgkJfSBlbHNlIHsKCQkJJHBhdGggPSAnLyc7CgkJfQoJCQkJCQkKCQkkY29va2llX3BhcmFtID0gJztzZWN1cmU7JzsKCQlpZiAoc3RycG9zKCRjb29raWVfc3RyLCAkY29va2llX3BhcmFtKSAhPT0gRkFMU0UpIHsKCQkJJHNlY3VyZSA9IHRydWU7CgkJfSBlbHNlIHsKCQkJJHNlY3VyZSA9IGZhbHNlOwoJCX0KCgkJJHNlcF9wb3MgPSBzdHJwb3MoJHZhbHVlX3N0ciwgJz0nKTsKCgkJaWYgKCRzZXBfcG9zKSB7CgkJCSRuYW1lID0gc3Vic3RyKCR2YWx1ZV9zdHIsIDAsICRzZXBfcG9zKTsKCQkJJHZhbHVlID0gc3Vic3RyKCR2YWx1ZV9zdHIsICRzZXBfcG9zICsgMSk7CgkJCSRjb29raWU9IGFycmF5KAknbmFtZScgPT4gJG5hbWUsCgkJCSAgICAgICAgICAgICAgICAndmFsdWUnID0+ICR2YWx1ZSwKCQkJCQkJCSdkb21haW4nID0+ICRkb21haW4sCgkJCQkJCQkncGF0aCcgPT4gJHBhdGgsCgkJCQkJCQknZXhwaXJlcycgPT4gJGV4cGlyZXMsCgkJCQkJCQknc2VjdXJlJyA9PiAkc2VjdXJlCgkJCQkJCQkpOwkJCgkJCXJldHVybiAkY29va2llOwoJCX0KCQlyZXR1cm4gZmFsc2U7Cgl9CiAgCgkvKioKCSAqIHNvcnQgb3V0IGNvb2tpZXMgZm9yIHRoZSBjdXJyZW50IHJlcXVlc3QKCSAqCgkgKiBAcGFyYW0JYXJyYXkgJGNvb2tpZXMgYXJyYXkgd2l0aCBhbGwgY29va2llcwoJICogQHBhcmFtCWJvb2xlYW4gJHNlY3VyZSBpcyB0aGUgc2VuZC1jb250ZW50IHNlY3VyZSBvciBub3Q/CgkgKiBAcmV0dXJuCXN0cmluZyBmb3IgQ29va2llLUhUVFAtSGVhZGVyCgkgKiBAYWNjZXNzCXByaXZhdGUKCSAqLwoJZnVuY3Rpb24gZ2V0Q29va2llc0ZvclJlcXVlc3QoJGNvb2tpZXMsICRzZWN1cmU9ZmFsc2UpIHsKCQkkY29va2llX3N0ciA9ICcnOwoJCWlmICgoISBpc19udWxsKCRjb29raWVzKSkgJiYgKGlzX2FycmF5KCRjb29raWVzKSkpIHsKCQkJZm9yZWFjaCAoJGNvb2tpZXMgYXMgJGNvb2tpZSkgewoJCQkJaWYgKCEgaXNfYXJyYXkoJGNvb2tpZSkpIHsKCQkJCQljb250aW51ZTsKCQkJCX0KCSAgICAJCSR0aGlzLT5kZWJ1ZygiY2hlY2sgY29va2llIGZvciB2YWxpZGl0eTogIi4kY29va2llWyduYW1lJ10uJz0nLiRjb29raWVbJ3ZhbHVlJ10pOwoJCQkJaWYgKChpc3NldCgkY29va2llWydleHBpcmVzJ10pKSAmJiAoISBlbXB0eSgkY29va2llWydleHBpcmVzJ10pKSkgewoJCQkJCWlmIChzdHJ0b3RpbWUoJGNvb2tpZVsnZXhwaXJlcyddKSA8PSB0aW1lKCkpIHsKCQkJCQkJJHRoaXMtPmRlYnVnKCdjb29raWUgaGFzIGV4cGlyZWQnKTsKCQkJCQkJY29udGludWU7CgkJCQkJfQoJCQkJfQoJCQkJaWYgKChpc3NldCgkY29va2llWydkb21haW4nXSkpICYmICghIGVtcHR5KCRjb29raWVbJ2RvbWFpbiddKSkpIHsKCQkJCQkkZG9tYWluID0gcHJlZ19xdW90ZSgkY29va2llWydkb21haW4nXSk7CgkJCQkJaWYgKCEgcHJlZ19tYXRjaCgiJy4qJGRvbWFpbiQnaSIsICR0aGlzLT5ob3N0KSkgewoJCQkJCQkkdGhpcy0+ZGVidWcoJ2Nvb2tpZSBoYXMgZGlmZmVyZW50IGRvbWFpbicpOwoJCQkJCQljb250aW51ZTsKCQkJCQl9CgkJCQl9CgkJCQlpZiAoKGlzc2V0KCRjb29raWVbJ3BhdGgnXSkpICYmICghIGVtcHR5KCRjb29raWVbJ3BhdGgnXSkpKSB7CgkJCQkJJHBhdGggPSBwcmVnX3F1b3RlKCRjb29raWVbJ3BhdGgnXSk7CgkJCQkJaWYgKCEgcHJlZ19tYXRjaCgiJ14kcGF0aC4qJ2kiLCAkdGhpcy0+cGF0aCkpIHsKCQkJCQkJJHRoaXMtPmRlYnVnKCdjb29raWUgaXMgZm9yIGEgZGlmZmVyZW50IHBhdGgnKTsKCQkJCQkJY29udGludWU7CgkJCQkJfQoJCQkJfQoJCQkJaWYgKCghICRzZWN1cmUpICYmIChpc3NldCgkY29va2llWydzZWN1cmUnXSkpICYmICgkY29va2llWydzZWN1cmUnXSkpIHsKCQkJCQkkdGhpcy0+ZGVidWcoJ2Nvb2tpZSBpcyBzZWN1cmUsIHRyYW5zcG9ydCBpcyBub3QnKTsKCQkJCQljb250aW51ZTsKCQkJCX0KCQkJCSRjb29raWVfc3RyIC49ICRjb29raWVbJ25hbWUnXSAuICc9JyAuICRjb29raWVbJ3ZhbHVlJ10gLiAnOyAnOwoJICAgIAkJJHRoaXMtPmRlYnVnKCdhZGQgY29va2llIHRvIENvb2tpZS1TdHJpbmc6ICcgLiAkY29va2llWyduYW1lJ10gLiAnPScgLiAkY29va2llWyd2YWx1ZSddKTsKCQkJfQoJCX0KCQlyZXR1cm4gJGNvb2tpZV9zdHI7CiAgfQp9CgoKPz4=]]></data>
  </file>
  <file>
    <filename>classes/class.soap_val.php</filename>
    <isdir>0</isdir>
    <data><![CDATA[PD9waHAKCgoKCi8qKgoqIEZvciBjcmVhdGluZyBzZXJpYWxpemFibGUgYWJzdHJhY3Rpb25zIG9mIG5hdGl2ZSBQSFAgdHlwZXMuICBUaGlzIGNsYXNzCiogYWxsb3dzIGVsZW1lbnQgbmFtZS9uYW1lc3BhY2UsIFhTRCB0eXBlLCBhbmQgWE1MIGF0dHJpYnV0ZXMgdG8gYmUKKiBhc3NvY2lhdGVkIHdpdGggYSB2YWx1ZS4gIFRoaXMgaXMgZXh0cmVtZWx5IHVzZWZ1bCB3aGVuIFdTREwgaXMgbm90CiogdXNlZCwgYnV0IGlzIGFsc28gdXNlZnVsIHdoZW4gV1NETCBpcyB1c2VkIHdpdGggcG9seW1vcnBoaWMgdHlwZXMsIGluY2x1ZGluZwoqIHhzZDphbnlUeXBlIGFuZCB1c2VyLWRlZmluZWQgdHlwZXMuCioKKiBAYXV0aG9yICAgRGlldHJpY2ggQXlhbGEgPGRpZXRyaWNoQGdhbng0LmNvbT4KKiBAdmVyc2lvbiAgJElkOiBjbGFzcy5zb2FwX3ZhbC5waHAsdiAxLjkgMjAwNS8wNy8yNyAxOToyNDo0MiBzbmljaG9sIEV4cCAkCiogQGFjY2VzcyAgIHB1YmxpYwoqLwpjbGFzcyBzb2FwdmFsIGV4dGVuZHMgbnVzb2FwX2Jhc2UgewoJLyoqCgkgKiBUaGUgWE1MIGVsZW1lbnQgbmFtZQoJICoKCSAqIEB2YXIgc3RyaW5nCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJdmFyICRuYW1lOwoJLyoqCgkgKiBUaGUgWE1MIHR5cGUgbmFtZSAoc3RyaW5nIG9yIGZhbHNlKQoJICoKCSAqIEB2YXIgbWl4ZWQKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCgl2YXIgJHR5cGU7CgkvKioKCSAqIFRoZSBQSFAgdmFsdWUKCSAqCgkgKiBAdmFyIG1peGVkCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJdmFyICR2YWx1ZTsKCS8qKgoJICogVGhlIFhNTCBlbGVtZW50IG5hbWVzcGFjZSAoc3RyaW5nIG9yIGZhbHNlKQoJICoKCSAqIEB2YXIgbWl4ZWQKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCgl2YXIgJGVsZW1lbnRfbnM7CgkvKioKCSAqIFRoZSBYTUwgdHlwZSBuYW1lc3BhY2UgKHN0cmluZyBvciBmYWxzZSkKCSAqCgkgKiBAdmFyIG1peGVkCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJdmFyICR0eXBlX25zOwoJLyoqCgkgKiBUaGUgWE1MIGVsZW1lbnQgYXR0cmlidXRlcyAoYXJyYXkgb3IgZmFsc2UpCgkgKgoJICogQHZhciBtaXhlZAoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCXZhciAkYXR0cmlidXRlczsKCgkvKioKCSogY29uc3RydWN0b3IKCSoKCSogQHBhcmFtICAgIHN0cmluZyAkbmFtZSBvcHRpb25hbCBuYW1lCgkqIEBwYXJhbSAgICBtaXhlZCAkdHlwZSBvcHRpb25hbCB0eXBlIG5hbWUKCSogQHBhcmFtCW1peGVkICR2YWx1ZSBvcHRpb25hbCB2YWx1ZQoJKiBAcGFyYW0JbWl4ZWQgJGVsZW1lbnRfbnMgb3B0aW9uYWwgbmFtZXNwYWNlIG9mIHZhbHVlCgkqIEBwYXJhbQltaXhlZCAkdHlwZV9ucyBvcHRpb25hbCBuYW1lc3BhY2Ugb2YgdHlwZQoJKiBAcGFyYW0JbWl4ZWQgJGF0dHJpYnV0ZXMgYXNzb2NpYXRpdmUgYXJyYXkgb2YgYXR0cmlidXRlcyB0byBhZGQgdG8gZWxlbWVudCBzZXJpYWxpemF0aW9uCgkqIEBhY2Nlc3MgICBwdWJsaWMKCSovCiAgCWZ1bmN0aW9uIHNvYXB2YWwoJG5hbWU9J3NvYXB2YWwnLCR0eXBlPWZhbHNlLCR2YWx1ZT0tMSwkZWxlbWVudF9ucz1mYWxzZSwkdHlwZV9ucz1mYWxzZSwkYXR0cmlidXRlcz1mYWxzZSkgewoJCXBhcmVudDo6bnVzb2FwX2Jhc2UoKTsKCQkkdGhpcy0+bmFtZSA9ICRuYW1lOwoJCSR0aGlzLT50eXBlID0gJHR5cGU7CgkJJHRoaXMtPnZhbHVlID0gJHZhbHVlOwoJCSR0aGlzLT5lbGVtZW50X25zID0gJGVsZW1lbnRfbnM7CgkJJHRoaXMtPnR5cGVfbnMgPSAkdHlwZV9uczsKCQkkdGhpcy0+YXR0cmlidXRlcyA9ICRhdHRyaWJ1dGVzOwogICAgfQoKCS8qKgoJKiByZXR1cm4gc2VyaWFsaXplZCB2YWx1ZQoJKgoJKiBAcGFyYW0Jc3RyaW5nICR1c2UgVGhlIFdTREwgdXNlIHZhbHVlIChlbmNvZGVkfGxpdGVyYWwpCgkqIEByZXR1cm4Jc3RyaW5nIFhNTCBkYXRhCgkqIEBhY2Nlc3MgICBwdWJsaWMKCSovCglmdW5jdGlvbiBzZXJpYWxpemUoJHVzZT0nZW5jb2RlZCcpIHsKCQlyZXR1cm4gJHRoaXMtPnNlcmlhbGl6ZV92YWwoJHRoaXMtPnZhbHVlLCR0aGlzLT5uYW1lLCR0aGlzLT50eXBlLCR0aGlzLT5lbGVtZW50X25zLCR0aGlzLT50eXBlX25zLCR0aGlzLT5hdHRyaWJ1dGVzLCR1c2UpOwogICAgfQoKCS8qKgoJKiBkZWNvZGVzIGEgc29hcHZhbCBvYmplY3QgaW50byBhIFBIUCBuYXRpdmUgdHlwZQoJKgoJKiBAcmV0dXJuCW1peGVkCgkqIEBhY2Nlc3MgICBwdWJsaWMKCSovCglmdW5jdGlvbiBkZWNvZGUoKXsKCQlyZXR1cm4gJHRoaXMtPnZhbHVlOwoJfQp9CgoKCgo/Pg==]]></data>
  </file>
  <file>
    <filename>classes/class.wsdl.php</filename>
    <isdir>0</isdir>
    <data><![CDATA[PD9waHAKCgoKCi8qKgoqIHBhcnNlcyBhIFdTREwgZmlsZSwgYWxsb3dzIGFjY2VzcyB0byBpdCdzIGRhdGEsIG90aGVyIHV0aWxpdHkgbWV0aG9kcwoqIAoqIEBhdXRob3IgICBEaWV0cmljaCBBeWFsYSA8ZGlldHJpY2hAZ2FueDQuY29tPgoqIEB2ZXJzaW9uICAkSWQ6IGNsYXNzLndzZGwucGhwLHYgMS41NiAyMDA1LzA4LzA0IDAxOjI3OjQyIHNuaWNob2wgRXhwICQKKiBAYWNjZXNzIHB1YmxpYyAKKi8KY2xhc3Mgd3NkbCBleHRlbmRzIG51c29hcF9iYXNlIHsKCS8vIFVSTCBvciBmaWxlbmFtZSBvZiB0aGUgcm9vdCBvZiB0aGlzIFdTREwKICAgIHZhciAkd3NkbDsgCiAgICAvLyBkZWZpbmUgaW50ZXJuYWwgYXJyYXlzIG9mIGJpbmRpbmdzLCBwb3J0cywgb3BlcmF0aW9ucywgbWVzc2FnZXMsIGV0Yy4KICAgIHZhciAkc2NoZW1hcyA9IGFycmF5KCk7CiAgICB2YXIgJGN1cnJlbnRTY2hlbWE7CiAgICB2YXIgJG1lc3NhZ2UgPSBhcnJheSgpOwogICAgdmFyICRjb21wbGV4VHlwZXMgPSBhcnJheSgpOwogICAgdmFyICRtZXNzYWdlcyA9IGFycmF5KCk7CiAgICB2YXIgJGN1cnJlbnRNZXNzYWdlOwogICAgdmFyICRjdXJyZW50T3BlcmF0aW9uOwogICAgdmFyICRwb3J0VHlwZXMgPSBhcnJheSgpOwogICAgdmFyICRjdXJyZW50UG9ydFR5cGU7CiAgICB2YXIgJGJpbmRpbmdzID0gYXJyYXkoKTsKICAgIHZhciAkY3VycmVudEJpbmRpbmc7CiAgICB2YXIgJHBvcnRzID0gYXJyYXkoKTsKICAgIHZhciAkY3VycmVudFBvcnQ7CiAgICB2YXIgJG9wRGF0YSA9IGFycmF5KCk7CiAgICB2YXIgJHN0YXR1cyA9ICcnOwogICAgdmFyICRkb2N1bWVudGF0aW9uID0gZmFsc2U7CiAgICB2YXIgJGVuZHBvaW50ID0gJyc7IAogICAgLy8gYXJyYXkgb2Ygd3NkbCBkb2NzIHRvIGltcG9ydAogICAgdmFyICRpbXBvcnQgPSBhcnJheSgpOyAKICAgIC8vIHBhcnNlciB2YXJzCiAgICB2YXIgJHBhcnNlcjsKICAgIHZhciAkcG9zaXRpb24gPSAwOwogICAgdmFyICRkZXB0aCA9IDA7CiAgICB2YXIgJGRlcHRoX2FycmF5ID0gYXJyYXkoKTsKCS8vIGZvciBnZXR0aW5nIHdzZGwKCXZhciAkcHJveHlob3N0ID0gJyc7CiAgICB2YXIgJHByb3h5cG9ydCA9ICcnOwoJdmFyICRwcm94eXVzZXJuYW1lID0gJyc7Cgl2YXIgJHByb3h5cGFzc3dvcmQgPSAnJzsKCXZhciAkdGltZW91dCA9IDA7Cgl2YXIgJHJlc3BvbnNlX3RpbWVvdXQgPSAzMDsKCiAgICAvKioKICAgICAqIGNvbnN0cnVjdG9yCiAgICAgKiAKICAgICAqIEBwYXJhbSBzdHJpbmcgJHdzZGwgV1NETCBkb2N1bWVudCBVUkwKCSAqIEBwYXJhbSBzdHJpbmcgJHByb3h5aG9zdAoJICogQHBhcmFtIHN0cmluZyAkcHJveHlwb3J0CgkgKiBAcGFyYW0gc3RyaW5nICRwcm94eXVzZXJuYW1lCgkgKiBAcGFyYW0gc3RyaW5nICRwcm94eXBhc3N3b3JkCgkgKiBAcGFyYW0gaW50ZWdlciAkdGltZW91dCBzZXQgdGhlIGNvbm5lY3Rpb24gdGltZW91dAoJICogQHBhcmFtIGludGVnZXIgJHJlc3BvbnNlX3RpbWVvdXQgc2V0IHRoZSByZXNwb25zZSB0aW1lb3V0CiAgICAgKiBAYWNjZXNzIHB1YmxpYyAKICAgICAqLwogICAgZnVuY3Rpb24gd3NkbCgkd3NkbCA9ICcnLCRwcm94eWhvc3Q9ZmFsc2UsJHByb3h5cG9ydD1mYWxzZSwkcHJveHl1c2VybmFtZT1mYWxzZSwkcHJveHlwYXNzd29yZD1mYWxzZSwkdGltZW91dD0wLCRyZXNwb25zZV90aW1lb3V0PTMwKXsKCQlwYXJlbnQ6Om51c29hcF9iYXNlKCk7CiAgICAgICAgJHRoaXMtPndzZGwgPSAkd3NkbDsKICAgICAgICAkdGhpcy0+cHJveHlob3N0ID0gJHByb3h5aG9zdDsKICAgICAgICAkdGhpcy0+cHJveHlwb3J0ID0gJHByb3h5cG9ydDsKCQkkdGhpcy0+cHJveHl1c2VybmFtZSA9ICRwcm94eXVzZXJuYW1lOwoJCSR0aGlzLT5wcm94eXBhc3N3b3JkID0gJHByb3h5cGFzc3dvcmQ7CgkJJHRoaXMtPnRpbWVvdXQgPSAkdGltZW91dDsKCQkkdGhpcy0+cmVzcG9uc2VfdGltZW91dCA9ICRyZXNwb25zZV90aW1lb3V0OwogICAgICAgIAogICAgICAgIC8vIHBhcnNlIHdzZGwgZmlsZQogICAgICAgIGlmICgkd3NkbCAhPSAiIikgewogICAgICAgICAgICAkdGhpcy0+ZGVidWcoJ2luaXRpYWwgd3NkbCBVUkw6ICcgLiAkd3NkbCk7CiAgICAgICAgICAgICR0aGlzLT5wYXJzZVdTREwoJHdzZGwpOwogICAgICAgIH0KICAgICAgICAvLyBpbXBvcnRzCiAgICAgICAgLy8gVE9ETzogaGFuZGxlIGltcG9ydHMgbW9yZSBwcm9wZXJseSwgZ3JhYmJpbmcgdGhlbSBpbi1saW5lIGFuZCBuZXN0aW5nIHRoZW0KICAgICAgICAJJGltcG9ydGVkX3VybHMgPSBhcnJheSgpOwogICAgICAgIAkkaW1wb3J0ZWQgPSAxOwogICAgICAgIAl3aGlsZSAoJGltcG9ydGVkID4gMCkgewogICAgICAgIAkJJGltcG9ydGVkID0gMDsKICAgICAgICAJCS8vIFNjaGVtYSBpbXBvcnRzCiAgICAgICAgCQlmb3JlYWNoICgkdGhpcy0+c2NoZW1hcyBhcyAkbnMgPT4gJGxpc3QpIHsKICAgICAgICAJCQlmb3JlYWNoICgkbGlzdCBhcyAkeHMpIHsKCQkJCQkJJHdzZGxwYXJ0cyA9IHBhcnNlX3VybCgkdGhpcy0+d3NkbCk7CS8vIHRoaXMgaXMgYm9ndXNseSBzaW1wbGUhCgkJCSAgICAgICAgICAgIGZvcmVhY2ggKCR4cy0+aW1wb3J0cyBhcyAkbnMyID0+ICRsaXN0MikgewoJCQkgICAgICAgICAgICAgICAgZm9yICgkaWkgPSAwOyAkaWkgPCBjb3VudCgkbGlzdDIpOyAkaWkrKykgewoJCQkgICAgICAgICAgICAgICAgCWlmICghICRsaXN0MlskaWldWydsb2FkZWQnXSkgewoJCQkgICAgICAgICAgICAgICAgCQkkdGhpcy0+c2NoZW1hc1skbnNdLT5pbXBvcnRzWyRuczJdWyRpaV1bJ2xvYWRlZCddID0gdHJ1ZTsKCQkJICAgICAgICAgICAgICAgIAkJJHVybCA9ICRsaXN0MlskaWldWydsb2NhdGlvbiddOwoJCQkJCQkJCQlpZiAoJHVybCAhPSAnJykgewoJCQkJCQkJCQkJJHVybHBhcnRzID0gcGFyc2VfdXJsKCR1cmwpOwoJCQkJCQkJCQkJaWYgKCFpc3NldCgkdXJscGFydHNbJ2hvc3QnXSkpIHsKCQkJCQkJCQkJCQkkdXJsID0gJHdzZGxwYXJ0c1snc2NoZW1lJ10gLiAnOi8vJyAuICR3c2RscGFydHNbJ2hvc3QnXSAuIChpc3NldCgkd3NkbHBhcnRzWydwb3J0J10pID8gJzonIC4kd3NkbHBhcnRzWydwb3J0J10gOiAnJykgLgoJCQkJCQkJCQkJCQkJc3Vic3RyKCR3c2RscGFydHNbJ3BhdGgnXSwwLHN0cnJwb3MoJHdzZGxwYXJ0c1sncGF0aCddLCcvJykgKyAxKSAuJHVybHBhcnRzWydwYXRoJ107CgkJCQkJCQkJCQl9CgkJCQkJCQkJCQlpZiAoISBpbl9hcnJheSgkdXJsLCAkaW1wb3J0ZWRfdXJscykpIHsKCQkJCQkJICAgICAgICAgICAgICAgIAkkdGhpcy0+cGFyc2VXU0RMKCR1cmwpOwoJCQkJCSAgICAgICAgICAgICAgICAJCSRpbXBvcnRlZCsrOwoJCQkJCSAgICAgICAgICAgICAgICAJCSRpbXBvcnRlZF91cmxzW10gPSAkdXJsOwoJCQkJCSAgICAgICAgICAgICAgICAJfQoJCQkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCQkJJHRoaXMtPmRlYnVnKCJVbmV4cGVjdGVkIHNjZW5hcmlvOiBlbXB0eSBVUkwgZm9yIHVubG9hZGVkIGltcG9ydCIpOwoJCQkJCQkJCQl9CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkgICAgICAgICAgICB9IAogICAgICAgIAkJCX0KICAgICAgICAJCX0KICAgICAgICAJCS8vIFdTREwgaW1wb3J0cwoJCQkJJHdzZGxwYXJ0cyA9IHBhcnNlX3VybCgkdGhpcy0+d3NkbCk7CS8vIHRoaXMgaXMgYm9ndXNseSBzaW1wbGUhCgkgICAgICAgICAgICBmb3JlYWNoICgkdGhpcy0+aW1wb3J0IGFzICRucyA9PiAkbGlzdCkgewoJICAgICAgICAgICAgICAgIGZvciAoJGlpID0gMDsgJGlpIDwgY291bnQoJGxpc3QpOyAkaWkrKykgewoJICAgICAgICAgICAgICAgIAlpZiAoISAkbGlzdFskaWldWydsb2FkZWQnXSkgewoJICAgICAgICAgICAgICAgIAkJJHRoaXMtPmltcG9ydFskbnNdWyRpaV1bJ2xvYWRlZCddID0gdHJ1ZTsKCSAgICAgICAgICAgICAgICAJCSR1cmwgPSAkbGlzdFskaWldWydsb2NhdGlvbiddOwoJCQkJCQkJaWYgKCR1cmwgIT0gJycpIHsKCQkJCQkJCQkkdXJscGFydHMgPSBwYXJzZV91cmwoJHVybCk7CgkJCQkJCQkJaWYgKCFpc3NldCgkdXJscGFydHNbJ2hvc3QnXSkpIHsKCQkJCQkJCQkJJHVybCA9ICR3c2RscGFydHNbJ3NjaGVtZSddIC4gJzovLycgLiAkd3NkbHBhcnRzWydob3N0J10gLiAoaXNzZXQoJHdzZGxwYXJ0c1sncG9ydCddKSA/ICc6JyAuICR3c2RscGFydHNbJ3BvcnQnXSA6ICcnKSAuCgkJCQkJCQkJCQkJc3Vic3RyKCR3c2RscGFydHNbJ3BhdGgnXSwwLHN0cnJwb3MoJHdzZGxwYXJ0c1sncGF0aCddLCcvJykgKyAxKSAuJHVybHBhcnRzWydwYXRoJ107CgkJCQkJCQkJfQoJCQkJCQkJCWlmICghIGluX2FycmF5KCR1cmwsICRpbXBvcnRlZF91cmxzKSkgewoJCQkJICAgICAgICAgICAgICAgIAkkdGhpcy0+cGFyc2VXU0RMKCR1cmwpOwoJCQkgICAgICAgICAgICAgICAgCQkkaW1wb3J0ZWQrKzsKCQkJICAgICAgICAgICAgICAgIAkJJGltcG9ydGVkX3VybHNbXSA9ICR1cmw7CgkJCSAgICAgICAgICAgICAgICAJfQoJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQkkdGhpcy0+ZGVidWcoIlVuZXhwZWN0ZWQgc2NlbmFyaW86IGVtcHR5IFVSTCBmb3IgdW5sb2FkZWQgaW1wb3J0Iik7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9CgkgICAgICAgICAgICB9IAoJCQl9CiAgICAgICAgLy8gYWRkIG5ldyBkYXRhIHRvIG9wZXJhdGlvbiBkYXRhCiAgICAgICAgZm9yZWFjaCgkdGhpcy0+YmluZGluZ3MgYXMgJGJpbmRpbmcgPT4gJGJpbmRpbmdEYXRhKSB7CiAgICAgICAgICAgIGlmIChpc3NldCgkYmluZGluZ0RhdGFbJ29wZXJhdGlvbnMnXSkgJiYgaXNfYXJyYXkoJGJpbmRpbmdEYXRhWydvcGVyYXRpb25zJ10pKSB7CiAgICAgICAgICAgICAgICBmb3JlYWNoKCRiaW5kaW5nRGF0YVsnb3BlcmF0aW9ucyddIGFzICRvcGVyYXRpb24gPT4gJGRhdGEpIHsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+ZGVidWcoJ3Bvc3QtcGFyc2UgZGF0YSBnYXRoZXJpbmcgZm9yICcgLiAkb3BlcmF0aW9uKTsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+YmluZGluZ3NbJGJpbmRpbmddWydvcGVyYXRpb25zJ11bJG9wZXJhdGlvbl1bJ2lucHV0J10gPSAKCQkJCQkJaXNzZXQoJHRoaXMtPmJpbmRpbmdzWyRiaW5kaW5nXVsnb3BlcmF0aW9ucyddWyRvcGVyYXRpb25dWydpbnB1dCddKSA/IAoJCQkJCQlhcnJheV9tZXJnZSgkdGhpcy0+YmluZGluZ3NbJGJpbmRpbmddWydvcGVyYXRpb25zJ11bJG9wZXJhdGlvbl1bJ2lucHV0J10sICR0aGlzLT5wb3J0VHlwZXNbICRiaW5kaW5nRGF0YVsncG9ydFR5cGUnXSBdWyRvcGVyYXRpb25dWydpbnB1dCddKSA6CgkJCQkJCSR0aGlzLT5wb3J0VHlwZXNbICRiaW5kaW5nRGF0YVsncG9ydFR5cGUnXSBdWyRvcGVyYXRpb25dWydpbnB1dCddOwogICAgICAgICAgICAgICAgICAgICR0aGlzLT5iaW5kaW5nc1skYmluZGluZ11bJ29wZXJhdGlvbnMnXVskb3BlcmF0aW9uXVsnb3V0cHV0J10gPSAKCQkJCQkJaXNzZXQoJHRoaXMtPmJpbmRpbmdzWyRiaW5kaW5nXVsnb3BlcmF0aW9ucyddWyRvcGVyYXRpb25dWydvdXRwdXQnXSkgPwoJCQkJCQlhcnJheV9tZXJnZSgkdGhpcy0+YmluZGluZ3NbJGJpbmRpbmddWydvcGVyYXRpb25zJ11bJG9wZXJhdGlvbl1bJ291dHB1dCddLCAkdGhpcy0+cG9ydFR5cGVzWyAkYmluZGluZ0RhdGFbJ3BvcnRUeXBlJ10gXVskb3BlcmF0aW9uXVsnb3V0cHV0J10pIDoKCQkJCQkJJHRoaXMtPnBvcnRUeXBlc1sgJGJpbmRpbmdEYXRhWydwb3J0VHlwZSddIF1bJG9wZXJhdGlvbl1bJ291dHB1dCddOwogICAgICAgICAgICAgICAgICAgIGlmKGlzc2V0KCR0aGlzLT5tZXNzYWdlc1sgJHRoaXMtPmJpbmRpbmdzWyRiaW5kaW5nXVsnb3BlcmF0aW9ucyddWyRvcGVyYXRpb25dWydpbnB1dCddWydtZXNzYWdlJ10gXSkpewoJCQkJCQkkdGhpcy0+YmluZGluZ3NbJGJpbmRpbmddWydvcGVyYXRpb25zJ11bJG9wZXJhdGlvbl1bJ2lucHV0J11bJ3BhcnRzJ10gPSAkdGhpcy0+bWVzc2FnZXNbICR0aGlzLT5iaW5kaW5nc1skYmluZGluZ11bJ29wZXJhdGlvbnMnXVskb3BlcmF0aW9uXVsnaW5wdXQnXVsnbWVzc2FnZSddIF07CgkJCQkJfQoJCQkJCWlmKGlzc2V0KCR0aGlzLT5tZXNzYWdlc1sgJHRoaXMtPmJpbmRpbmdzWyRiaW5kaW5nXVsnb3BlcmF0aW9ucyddWyRvcGVyYXRpb25dWydvdXRwdXQnXVsnbWVzc2FnZSddIF0pKXsKICAgICAgICAgICAgICAgICAgIAkJJHRoaXMtPmJpbmRpbmdzWyRiaW5kaW5nXVsnb3BlcmF0aW9ucyddWyRvcGVyYXRpb25dWydvdXRwdXQnXVsncGFydHMnXSA9ICR0aGlzLT5tZXNzYWdlc1sgJHRoaXMtPmJpbmRpbmdzWyRiaW5kaW5nXVsnb3BlcmF0aW9ucyddWyRvcGVyYXRpb25dWydvdXRwdXQnXVsnbWVzc2FnZSddIF07CiAgICAgICAgICAgICAgICAgICAgfQoJCQkJCWlmIChpc3NldCgkYmluZGluZ0RhdGFbJ3N0eWxlJ10pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5iaW5kaW5nc1skYmluZGluZ11bJ29wZXJhdGlvbnMnXVskb3BlcmF0aW9uXVsnc3R5bGUnXSA9ICRiaW5kaW5nRGF0YVsnc3R5bGUnXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmJpbmRpbmdzWyRiaW5kaW5nXVsnb3BlcmF0aW9ucyddWyRvcGVyYXRpb25dWyd0cmFuc3BvcnQnXSA9IGlzc2V0KCRiaW5kaW5nRGF0YVsndHJhbnNwb3J0J10pID8gJGJpbmRpbmdEYXRhWyd0cmFuc3BvcnQnXSA6ICcnOwogICAgICAgICAgICAgICAgICAgICR0aGlzLT5iaW5kaW5nc1skYmluZGluZ11bJ29wZXJhdGlvbnMnXVskb3BlcmF0aW9uXVsnZG9jdW1lbnRhdGlvbiddID0gaXNzZXQoJHRoaXMtPnBvcnRUeXBlc1sgJGJpbmRpbmdEYXRhWydwb3J0VHlwZSddIF1bJG9wZXJhdGlvbl1bJ2RvY3VtZW50YXRpb24nXSkgPyAkdGhpcy0+cG9ydFR5cGVzWyAkYmluZGluZ0RhdGFbJ3BvcnRUeXBlJ10gXVskb3BlcmF0aW9uXVsnZG9jdW1lbnRhdGlvbiddIDogJyc7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmJpbmRpbmdzWyRiaW5kaW5nXVsnb3BlcmF0aW9ucyddWyRvcGVyYXRpb25dWydlbmRwb2ludCddID0gaXNzZXQoJGJpbmRpbmdEYXRhWydlbmRwb2ludCddKSA/ICRiaW5kaW5nRGF0YVsnZW5kcG9pbnQnXSA6ICcnOwogICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgfSAKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBwYXJzZXMgdGhlIHdzZGwgZG9jdW1lbnQKICAgICAqIAogICAgICogQHBhcmFtIHN0cmluZyAkd3NkbCBwYXRoIG9yIFVSTAogICAgICogQGFjY2VzcyBwcml2YXRlIAogICAgICovCiAgICBmdW5jdGlvbiBwYXJzZVdTREwoJHdzZGwgPSAnJykKICAgIHsKICAgICAgICBpZiAoJHdzZGwgPT0gJycpIHsKICAgICAgICAgICAgJHRoaXMtPmRlYnVnKCdubyB3c2RsIHBhc3NlZCB0byBwYXJzZVdTREwoKSEhJyk7CiAgICAgICAgICAgICR0aGlzLT5zZXRFcnJvcignbm8gd3NkbCBwYXNzZWQgdG8gcGFyc2VXU0RMKCkhIScpOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vIHBhcnNlICR3c2RsIGZvciB1cmwgZm9ybWF0CiAgICAgICAgJHdzZGxfcHJvcHMgPSBwYXJzZV91cmwoJHdzZGwpOwoKICAgICAgICBpZiAoaXNzZXQoJHdzZGxfcHJvcHNbJ3NjaGVtZSddKSAmJiAoJHdzZGxfcHJvcHNbJ3NjaGVtZSddID09ICdodHRwJyB8fCAkd3NkbF9wcm9wc1snc2NoZW1lJ10gPT0gJ2h0dHBzJykpIHsKICAgICAgICAgICAgJHRoaXMtPmRlYnVnKCdnZXR0aW5nIFdTREwgaHR0cChzKSBVUkwgJyAuICR3c2RsKTsKICAgICAgICAJLy8gZ2V0IHdzZGwKCSAgICAgICAgJHRyID0gbmV3IHNvYXBfdHJhbnNwb3J0X2h0dHAoJHdzZGwpOwoJCQkkdHItPnJlcXVlc3RfbWV0aG9kID0gJ0dFVCc7CgkJCSR0ci0+dXNlU09BUEFjdGlvbiA9IGZhbHNlOwoJCQlpZigkdGhpcy0+cHJveHlob3N0ICYmICR0aGlzLT5wcm94eXBvcnQpewoJCQkJJHRyLT5zZXRQcm94eSgkdGhpcy0+cHJveHlob3N0LCR0aGlzLT5wcm94eXBvcnQsJHRoaXMtPnByb3h5dXNlcm5hbWUsJHRoaXMtPnByb3h5cGFzc3dvcmQpOwoJCQl9CgkJCSR0ci0+c2V0RW5jb2RpbmcoJ2d6aXAsIGRlZmxhdGUnKTsKCQkJJHdzZGxfc3RyaW5nID0gJHRyLT5zZW5kKCcnLCAkdGhpcy0+dGltZW91dCwgJHRoaXMtPnJlc3BvbnNlX3RpbWVvdXQpOwoJCQkvLyR0aGlzLT5kZWJ1ZygiV1NETCByZXF1ZXN0XG4iIC4gJHRyLT5vdXRnb2luZ19wYXlsb2FkKTsKCQkJLy8kdGhpcy0+ZGVidWcoIldTREwgcmVzcG9uc2VcbiIgLiAkdHItPmluY29taW5nX3BheWxvYWQpOwoJCQkkdGhpcy0+YXBwZW5kRGVidWcoJHRyLT5nZXREZWJ1ZygpKTsKCQkJLy8gY2F0Y2ggZXJyb3JzCgkJCWlmKCRlcnIgPSAkdHItPmdldEVycm9yKCkgKXsKCQkJCSRlcnJzdHIgPSAnSFRUUCBFUlJPUjogJy4kZXJyOwoJCQkJJHRoaXMtPmRlYnVnKCRlcnJzdHIpOwoJICAgICAgICAgICAgJHRoaXMtPnNldEVycm9yKCRlcnJzdHIpOwoJCQkJdW5zZXQoJHRyKTsKCSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKCQkJfQoJCQl1bnNldCgkdHIpOwoJCQkkdGhpcy0+ZGVidWcoImdvdCBXU0RMIFVSTCIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vICR3c2RsIGlzIG5vdCBodHRwKHMpLCBzbyB0cmVhdCBpdCBhcyBhIGZpbGUgVVJMIG9yIHBsYWluIGZpbGUgcGF0aAogICAgICAgIAlpZiAoaXNzZXQoJHdzZGxfcHJvcHNbJ3NjaGVtZSddKSAmJiAoJHdzZGxfcHJvcHNbJ3NjaGVtZSddID09ICdmaWxlJykgJiYgaXNzZXQoJHdzZGxfcHJvcHNbJ3BhdGgnXSkpIHsKICAgICAgICAJCSRwYXRoID0gaXNzZXQoJHdzZGxfcHJvcHNbJ2hvc3QnXSkgPyAoJHdzZGxfcHJvcHNbJ2hvc3QnXSAuICc6JyAuICR3c2RsX3Byb3BzWydwYXRoJ10pIDogJHdzZGxfcHJvcHNbJ3BhdGgnXTsKICAgICAgICAJfSBlbHNlIHsKICAgICAgICAJCSRwYXRoID0gJHdzZGw7CiAgICAgICAgCX0KICAgICAgICAgICAgJHRoaXMtPmRlYnVnKCdnZXR0aW5nIFdTREwgZmlsZSAnIC4gJHBhdGgpOwogICAgICAgICAgICBpZiAoJGZwID0gQGZvcGVuKCRwYXRoLCAncicpKSB7CiAgICAgICAgICAgICAgICAkd3NkbF9zdHJpbmcgPSAnJzsKICAgICAgICAgICAgICAgIHdoaWxlICgkZGF0YSA9IGZyZWFkKCRmcCwgMzI3NjgpKSB7CiAgICAgICAgICAgICAgICAgICAgJHdzZGxfc3RyaW5nIC49ICRkYXRhOwogICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgIGZjbG9zZSgkZnApOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAJJGVycnN0ciA9ICJCYWQgcGF0aCB0byBXU0RMIGZpbGUgJHBhdGgiOwogICAgICAgICAgICAJJHRoaXMtPmRlYnVnKCRlcnJzdHIpOwogICAgICAgICAgICAgICAgJHRoaXMtPnNldEVycm9yKCRlcnJzdHIpOwogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9IAogICAgICAgIH0KICAgICAgICAkdGhpcy0+ZGVidWcoJ1BhcnNlIFdTREwnKTsKICAgICAgICAvLyBlbmQgbmV3IGNvZGUgYWRkZWQKICAgICAgICAvLyBDcmVhdGUgYW4gWE1MIHBhcnNlci4KICAgICAgICAkdGhpcy0+cGFyc2VyID0geG1sX3BhcnNlcl9jcmVhdGUoKTsgCiAgICAgICAgLy8gU2V0IHRoZSBvcHRpb25zIGZvciBwYXJzaW5nIHRoZSBYTUwgZGF0YS4KICAgICAgICAvLyB4bWxfcGFyc2VyX3NldF9vcHRpb24oJHBhcnNlciwgWE1MX09QVElPTl9TS0lQX1dISVRFLCAxKTsKICAgICAgICB4bWxfcGFyc2VyX3NldF9vcHRpb24oJHRoaXMtPnBhcnNlciwgWE1MX09QVElPTl9DQVNFX0ZPTERJTkcsIDApOyAKICAgICAgICAvLyBTZXQgdGhlIG9iamVjdCBmb3IgdGhlIHBhcnNlci4KICAgICAgICB4bWxfc2V0X29iamVjdCgkdGhpcy0+cGFyc2VyLCAkdGhpcyk7IAogICAgICAgIC8vIFNldCB0aGUgZWxlbWVudCBoYW5kbGVycyBmb3IgdGhlIHBhcnNlci4KICAgICAgICB4bWxfc2V0X2VsZW1lbnRfaGFuZGxlcigkdGhpcy0+cGFyc2VyLCAnc3RhcnRfZWxlbWVudCcsICdlbmRfZWxlbWVudCcpOwogICAgICAgIHhtbF9zZXRfY2hhcmFjdGVyX2RhdGFfaGFuZGxlcigkdGhpcy0+cGFyc2VyLCAnY2hhcmFjdGVyX2RhdGEnKTsKICAgICAgICAvLyBQYXJzZSB0aGUgWE1MIGZpbGUuCiAgICAgICAgaWYgKCF4bWxfcGFyc2UoJHRoaXMtPnBhcnNlciwgJHdzZGxfc3RyaW5nLCB0cnVlKSkgewogICAgICAgICAgICAvLyBEaXNwbGF5IGFuIGVycm9yIG1lc3NhZ2UuCiAgICAgICAgICAgICRlcnJzdHIgPSBzcHJpbnRmKAoJCQkJJ1hNTCBlcnJvciBwYXJzaW5nIFdTREwgZnJvbSAlcyBvbiBsaW5lICVkOiAlcycsCgkJCQkkd3NkbCwKICAgICAgICAgICAgICAgIHhtbF9nZXRfY3VycmVudF9saW5lX251bWJlcigkdGhpcy0+cGFyc2VyKSwKICAgICAgICAgICAgICAgIHhtbF9lcnJvcl9zdHJpbmcoeG1sX2dldF9lcnJvcl9jb2RlKCR0aGlzLT5wYXJzZXIpKQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgJHRoaXMtPmRlYnVnKCRlcnJzdHIpOwoJCQkkdGhpcy0+ZGVidWcoIlhNTCBwYXlsb2FkOlxuIiAuICR3c2RsX3N0cmluZyk7CiAgICAgICAgICAgICR0aGlzLT5zZXRFcnJvcigkZXJyc3RyKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0gCgkJLy8gZnJlZSB0aGUgcGFyc2VyCiAgICAgICAgeG1sX3BhcnNlcl9mcmVlKCR0aGlzLT5wYXJzZXIpOwogICAgICAgICR0aGlzLT5kZWJ1ZygnUGFyc2luZyBXU0RMIGRvbmUnKTsKCQkvLyBjYXRjaCB3c2RsIHBhcnNlIGVycm9ycwoJCWlmKCR0aGlzLT5nZXRFcnJvcigpKXsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0gCgogICAgLyoqCiAgICAgKiBzdGFydC1lbGVtZW50IGhhbmRsZXIKICAgICAqIAogICAgICogQHBhcmFtIHN0cmluZyAkcGFyc2VyIFhNTCBwYXJzZXIgb2JqZWN0CiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lIGVsZW1lbnQgbmFtZQogICAgICogQHBhcmFtIHN0cmluZyAkYXR0cnMgYXNzb2NpYXRpdmUgYXJyYXkgb2YgYXR0cmlidXRlcwogICAgICogQGFjY2VzcyBwcml2YXRlIAogICAgICovCiAgICBmdW5jdGlvbiBzdGFydF9lbGVtZW50KCRwYXJzZXIsICRuYW1lLCAkYXR0cnMpCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT5zdGF0dXMgPT0gJ3NjaGVtYScpIHsKICAgICAgICAgICAgJHRoaXMtPmN1cnJlbnRTY2hlbWEtPnNjaGVtYVN0YXJ0RWxlbWVudCgkcGFyc2VyLCAkbmFtZSwgJGF0dHJzKTsKICAgICAgICAgICAgJHRoaXMtPmFwcGVuZERlYnVnKCR0aGlzLT5jdXJyZW50U2NoZW1hLT5nZXREZWJ1ZygpKTsKICAgICAgICAgICAgJHRoaXMtPmN1cnJlbnRTY2hlbWEtPmNsZWFyRGVidWcoKTsKICAgICAgICB9IGVsc2VpZiAoZXJlZygnc2NoZW1hJCcsICRuYW1lKSkgewogICAgICAgIAkkdGhpcy0+ZGVidWcoJ1BhcnNpbmcgV1NETCBzY2hlbWEnKTsKICAgICAgICAgICAgLy8gJHRoaXMtPmRlYnVnKCJzdGFydEVsZW1lbnQgZm9yICRuYW1lICgkYXR0cnNbbmFtZV0pLiBzdGF0dXMgPSAkdGhpcy0+c3RhdHVzICgiLiR0aGlzLT5nZXRMb2NhbFBhcnQoJG5hbWUpLiIpIik7CiAgICAgICAgICAgICR0aGlzLT5zdGF0dXMgPSAnc2NoZW1hJzsKICAgICAgICAgICAgJHRoaXMtPmN1cnJlbnRTY2hlbWEgPSBuZXcgeG1sc2NoZW1hKCcnLCAnJywgJHRoaXMtPm5hbWVzcGFjZXMpOwogICAgICAgICAgICAkdGhpcy0+Y3VycmVudFNjaGVtYS0+c2NoZW1hU3RhcnRFbGVtZW50KCRwYXJzZXIsICRuYW1lLCAkYXR0cnMpOwogICAgICAgICAgICAkdGhpcy0+YXBwZW5kRGVidWcoJHRoaXMtPmN1cnJlbnRTY2hlbWEtPmdldERlYnVnKCkpOwogICAgICAgICAgICAkdGhpcy0+Y3VycmVudFNjaGVtYS0+Y2xlYXJEZWJ1ZygpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIHBvc2l0aW9uIGluIHRoZSB0b3RhbCBudW1iZXIgb2YgZWxlbWVudHMsIHN0YXJ0aW5nIGZyb20gMAogICAgICAgICAgICAkcG9zID0gJHRoaXMtPnBvc2l0aW9uKys7CiAgICAgICAgICAgICRkZXB0aCA9ICR0aGlzLT5kZXB0aCsrOyAKICAgICAgICAgICAgLy8gc2V0IHNlbGYgYXMgY3VycmVudCB2YWx1ZSBmb3IgdGhpcyBkZXB0aAogICAgICAgICAgICAkdGhpcy0+ZGVwdGhfYXJyYXlbJGRlcHRoXSA9ICRwb3M7CiAgICAgICAgICAgICR0aGlzLT5tZXNzYWdlWyRwb3NdID0gYXJyYXkoJ2NkYXRhJyA9PiAnJyk7IAogICAgICAgICAgICAvLyBwcm9jZXNzIGF0dHJpYnV0ZXMKICAgICAgICAgICAgaWYgKGNvdW50KCRhdHRycykgPiAwKSB7CgkJCQkvLyByZWdpc3RlciBuYW1lc3BhY2UgZGVjbGFyYXRpb25zCiAgICAgICAgICAgICAgICBmb3JlYWNoKCRhdHRycyBhcyAkayA9PiAkdikgewogICAgICAgICAgICAgICAgICAgIGlmIChlcmVnKCJeeG1sbnMiLCAkaykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRuc19wcmVmaXggPSBzdWJzdHIoc3RycmNocigkaywgJzonKSwgMSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5uYW1lc3BhY2VzWyRuc19wcmVmaXhdID0gJHY7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+bmFtZXNwYWNlc1snbnMnIC4gKGNvdW50KCR0aGlzLT5uYW1lc3BhY2VzKSArIDEpXSA9ICR2OwogICAgICAgICAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHYgPT0gJ2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJyB8fCAkdiA9PSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS9YTUxTY2hlbWEnIHx8ICR2ID09ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwLzEwL1hNTFNjaGVtYScpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5YTUxTY2hlbWFWZXJzaW9uID0gJHY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+bmFtZXNwYWNlc1sneHNpJ10gPSAkdiAuICctaW5zdGFuY2UnOwogICAgICAgICAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIGV4cGFuZCBlYWNoIGF0dHJpYnV0ZSBwcmVmaXggdG8gaXRzIG5hbWVzcGFjZQogICAgICAgICAgICAgICAgZm9yZWFjaCgkYXR0cnMgYXMgJGsgPT4gJHYpIHsKICAgICAgICAgICAgICAgICAgICAkayA9IHN0cnBvcygkaywgJzonKSA/ICR0aGlzLT5leHBhbmRRbmFtZSgkaykgOiAkazsKICAgICAgICAgICAgICAgICAgICBpZiAoJGsgIT0gJ2xvY2F0aW9uJyAmJiAkayAhPSAnc29hcEFjdGlvbicgJiYgJGsgIT0gJ25hbWVzcGFjZScpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHYgPSBzdHJwb3MoJHYsICc6JykgPyAkdGhpcy0+ZXhwYW5kUW5hbWUoJHYpIDogJHY7CiAgICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgICAgICAkZUF0dHJzWyRrXSA9ICR2OwogICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgICRhdHRycyA9ICRlQXR0cnM7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkYXR0cnMgPSBhcnJheSgpOwogICAgICAgICAgICB9IAogICAgICAgICAgICAvLyBnZXQgZWxlbWVudCBwcmVmaXgsIG5hbWVzcGFjZSBhbmQgbmFtZQogICAgICAgICAgICBpZiAoZXJlZygnOicsICRuYW1lKSkgewogICAgICAgICAgICAgICAgLy8gZ2V0IG5zIHByZWZpeAogICAgICAgICAgICAgICAgJHByZWZpeCA9IHN1YnN0cigkbmFtZSwgMCwgc3RycG9zKCRuYW1lLCAnOicpKTsgCiAgICAgICAgICAgICAgICAvLyBnZXQgbnMKICAgICAgICAgICAgICAgICRuYW1lc3BhY2UgPSBpc3NldCgkdGhpcy0+bmFtZXNwYWNlc1skcHJlZml4XSkgPyAkdGhpcy0+bmFtZXNwYWNlc1skcHJlZml4XSA6ICcnOyAKICAgICAgICAgICAgICAgIC8vIGdldCB1bnF1YWxpZmllZCBuYW1lCiAgICAgICAgICAgICAgICAkbmFtZSA9IHN1YnN0cihzdHJzdHIoJG5hbWUsICc6JyksIDEpOwogICAgICAgICAgICB9IAoJCQkvLyBwcm9jZXNzIGF0dHJpYnV0ZXMsIGV4cGFuZGluZyBhbnkgcHJlZml4ZXMgdG8gbmFtZXNwYWNlcwogICAgICAgICAgICAvLyBmaW5kIHN0YXR1cywgcmVnaXN0ZXIgZGF0YQogICAgICAgICAgICBzd2l0Y2ggKCR0aGlzLT5zdGF0dXMpIHsKICAgICAgICAgICAgICAgIGNhc2UgJ21lc3NhZ2UnOgogICAgICAgICAgICAgICAgICAgIGlmICgkbmFtZSA9PSAncGFydCcpIHsKCQkJICAgICAgICAgICAgaWYgKGlzc2V0KCRhdHRyc1sndHlwZSddKSkgewoJCSAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmRlYnVnKCJtc2cgIiAuICR0aGlzLT5jdXJyZW50TWVzc2FnZSAuICI6IGZvdW5kIHBhcnQgJGF0dHJzW25hbWVdOiAiIC4gaW1wbG9kZSgnLCcsICRhdHRycykpOwoJCSAgICAgICAgICAgICAgICAgICAgJHRoaXMtPm1lc3NhZ2VzWyR0aGlzLT5jdXJyZW50TWVzc2FnZV1bJGF0dHJzWyduYW1lJ11dID0gJGF0dHJzWyd0eXBlJ107CiAgICAgICAgICAgIAkJCX0gCgkJCSAgICAgICAgICAgIGlmIChpc3NldCgkYXR0cnNbJ2VsZW1lbnQnXSkpIHsKCQkgICAgICAgICAgICAgICAgICAgICR0aGlzLT5kZWJ1ZygibXNnICIgLiAkdGhpcy0+Y3VycmVudE1lc3NhZ2UgLiAiOiBmb3VuZCBwYXJ0ICRhdHRyc1tuYW1lXTogIiAuIGltcGxvZGUoJywnLCAkYXR0cnMpKTsKCQkJICAgICAgICAgICAgICAgICR0aGlzLT5tZXNzYWdlc1skdGhpcy0+Y3VycmVudE1lc3NhZ2VdWyRhdHRyc1snbmFtZSddXSA9ICRhdHRyc1snZWxlbWVudCddOwoJCQkgICAgICAgICAgICB9IAogICAgICAgIAkJCX0gCiAgICAgICAgCQkJYnJlYWs7CgkJCSAgICBjYXNlICdwb3J0VHlwZSc6CgkJCSAgICAgICAgc3dpdGNoICgkbmFtZSkgewoJCQkgICAgICAgICAgICBjYXNlICdvcGVyYXRpb24nOgoJCQkgICAgICAgICAgICAgICAgJHRoaXMtPmN1cnJlbnRQb3J0T3BlcmF0aW9uID0gJGF0dHJzWyduYW1lJ107CgkJCSAgICAgICAgICAgICAgICAkdGhpcy0+ZGVidWcoInBvcnRUeXBlICR0aGlzLT5jdXJyZW50UG9ydFR5cGUgb3BlcmF0aW9uOiAkdGhpcy0+Y3VycmVudFBvcnRPcGVyYXRpb24iKTsKCQkJICAgICAgICAgICAgICAgIGlmIChpc3NldCgkYXR0cnNbJ3BhcmFtZXRlck9yZGVyJ10pKSB7CgkJCSAgICAgICAgICAgICAgICAJJHRoaXMtPnBvcnRUeXBlc1skdGhpcy0+Y3VycmVudFBvcnRUeXBlXVskYXR0cnNbJ25hbWUnXV1bJ3BhcmFtZXRlck9yZGVyJ10gPSAkYXR0cnNbJ3BhcmFtZXRlck9yZGVyJ107CgkJCSAgICAgICAgCQl9IAoJCQkgICAgICAgIAkJYnJlYWs7CgkJCQkJICAgIGNhc2UgJ2RvY3VtZW50YXRpb24nOgoJCQkJCSAgICAgICAgJHRoaXMtPmRvY3VtZW50YXRpb24gPSB0cnVlOwoJCQkJCSAgICAgICAgYnJlYWs7IAoJCQkJCSAgICAvLyBtZXJnZSBpbnB1dC9vdXRwdXQgZGF0YQoJCQkJCSAgICBkZWZhdWx0OgoJCQkJCSAgICAgICAgJG0gPSBpc3NldCgkYXR0cnNbJ21lc3NhZ2UnXSkgPyAkdGhpcy0+Z2V0TG9jYWxQYXJ0KCRhdHRyc1snbWVzc2FnZSddKSA6ICcnOwoJCQkJCSAgICAgICAgJHRoaXMtPnBvcnRUeXBlc1skdGhpcy0+Y3VycmVudFBvcnRUeXBlXVskdGhpcy0+Y3VycmVudFBvcnRPcGVyYXRpb25dWyRuYW1lXVsnbWVzc2FnZSddID0gJG07CgkJCQkJICAgICAgICBicmVhazsKCQkJCQl9IAoJCQkgICAgCWJyZWFrOwoJCQkJY2FzZSAnYmluZGluZyc6CgkJCQkgICAgc3dpdGNoICgkbmFtZSkgewoJCQkJICAgICAgICBjYXNlICdiaW5kaW5nJzogCgkJCQkgICAgICAgICAgICAvLyBnZXQgbnMgcHJlZml4CgkJCQkgICAgICAgICAgICBpZiAoaXNzZXQoJGF0dHJzWydzdHlsZSddKSkgewoJCQkJICAgICAgICAgICAgJHRoaXMtPmJpbmRpbmdzWyR0aGlzLT5jdXJyZW50QmluZGluZ11bJ3ByZWZpeCddID0gJHByZWZpeDsKCQkJCQkgICAgCX0gCgkJCQkJICAgIAkkdGhpcy0+YmluZGluZ3NbJHRoaXMtPmN1cnJlbnRCaW5kaW5nXSA9IGFycmF5X21lcmdlKCR0aGlzLT5iaW5kaW5nc1skdGhpcy0+Y3VycmVudEJpbmRpbmddLCAkYXR0cnMpOwoJCQkJCSAgICAJYnJlYWs7CgkJCQkJCWNhc2UgJ2hlYWRlcic6CgkJCQkJCSAgICAkdGhpcy0+YmluZGluZ3NbJHRoaXMtPmN1cnJlbnRCaW5kaW5nXVsnb3BlcmF0aW9ucyddWyR0aGlzLT5jdXJyZW50T3BlcmF0aW9uXVskdGhpcy0+b3BTdGF0dXNdWydoZWFkZXJzJ11bXSA9ICRhdHRyczsKCQkJCQkJICAgIGJyZWFrOwoJCQkJCQljYXNlICdvcGVyYXRpb24nOgoJCQkJCQkgICAgaWYgKGlzc2V0KCRhdHRyc1snc29hcEFjdGlvbiddKSkgewoJCQkJCQkgICAgICAgICR0aGlzLT5iaW5kaW5nc1skdGhpcy0+Y3VycmVudEJpbmRpbmddWydvcGVyYXRpb25zJ11bJHRoaXMtPmN1cnJlbnRPcGVyYXRpb25dWydzb2FwQWN0aW9uJ10gPSAkYXR0cnNbJ3NvYXBBY3Rpb24nXTsKCQkJCQkJICAgIH0gCgkJCQkJCSAgICBpZiAoaXNzZXQoJGF0dHJzWydzdHlsZSddKSkgewoJCQkJCQkgICAgICAgICR0aGlzLT5iaW5kaW5nc1skdGhpcy0+Y3VycmVudEJpbmRpbmddWydvcGVyYXRpb25zJ11bJHRoaXMtPmN1cnJlbnRPcGVyYXRpb25dWydzdHlsZSddID0gJGF0dHJzWydzdHlsZSddOwoJCQkJCQkgICAgfSAKCQkJCQkJICAgIGlmIChpc3NldCgkYXR0cnNbJ25hbWUnXSkpIHsKCQkJCQkJICAgICAgICAkdGhpcy0+Y3VycmVudE9wZXJhdGlvbiA9ICRhdHRyc1snbmFtZSddOwoJCQkJCQkgICAgICAgICR0aGlzLT5kZWJ1ZygiY3VycmVudCBiaW5kaW5nIG9wZXJhdGlvbjogJHRoaXMtPmN1cnJlbnRPcGVyYXRpb24iKTsKCQkJCQkJICAgICAgICAkdGhpcy0+YmluZGluZ3NbJHRoaXMtPmN1cnJlbnRCaW5kaW5nXVsnb3BlcmF0aW9ucyddWyR0aGlzLT5jdXJyZW50T3BlcmF0aW9uXVsnbmFtZSddID0gJGF0dHJzWyduYW1lJ107CgkJCQkJCSAgICAgICAgJHRoaXMtPmJpbmRpbmdzWyR0aGlzLT5jdXJyZW50QmluZGluZ11bJ29wZXJhdGlvbnMnXVskdGhpcy0+Y3VycmVudE9wZXJhdGlvbl1bJ2JpbmRpbmcnXSA9ICR0aGlzLT5jdXJyZW50QmluZGluZzsKCQkJCQkJICAgICAgICAkdGhpcy0+YmluZGluZ3NbJHRoaXMtPmN1cnJlbnRCaW5kaW5nXVsnb3BlcmF0aW9ucyddWyR0aGlzLT5jdXJyZW50T3BlcmF0aW9uXVsnZW5kcG9pbnQnXSA9IGlzc2V0KCR0aGlzLT5iaW5kaW5nc1skdGhpcy0+Y3VycmVudEJpbmRpbmddWydlbmRwb2ludCddKSA/ICR0aGlzLT5iaW5kaW5nc1skdGhpcy0+Y3VycmVudEJpbmRpbmddWydlbmRwb2ludCddIDogJyc7CgkJCQkJCSAgICB9IAoJCQkJCQkgICAgYnJlYWs7CgkJCQkJCWNhc2UgJ2lucHV0JzoKCQkJCQkJICAgICR0aGlzLT5vcFN0YXR1cyA9ICdpbnB1dCc7CgkJCQkJCSAgICBicmVhazsKCQkJCQkJY2FzZSAnb3V0cHV0JzoKCQkJCQkJICAgICR0aGlzLT5vcFN0YXR1cyA9ICdvdXRwdXQnOwoJCQkJCQkgICAgYnJlYWs7CgkJCQkJCWNhc2UgJ2JvZHknOgoJCQkJCQkgICAgaWYgKGlzc2V0KCR0aGlzLT5iaW5kaW5nc1skdGhpcy0+Y3VycmVudEJpbmRpbmddWydvcGVyYXRpb25zJ11bJHRoaXMtPmN1cnJlbnRPcGVyYXRpb25dWyR0aGlzLT5vcFN0YXR1c10pKSB7CgkJCQkJCSAgICAgICAgJHRoaXMtPmJpbmRpbmdzWyR0aGlzLT5jdXJyZW50QmluZGluZ11bJ29wZXJhdGlvbnMnXVskdGhpcy0+Y3VycmVudE9wZXJhdGlvbl1bJHRoaXMtPm9wU3RhdHVzXSA9IGFycmF5X21lcmdlKCR0aGlzLT5iaW5kaW5nc1skdGhpcy0+Y3VycmVudEJpbmRpbmddWydvcGVyYXRpb25zJ11bJHRoaXMtPmN1cnJlbnRPcGVyYXRpb25dWyR0aGlzLT5vcFN0YXR1c10sICRhdHRycyk7CgkJCQkJCSAgICB9IGVsc2UgewoJCQkJCQkgICAgICAgICR0aGlzLT5iaW5kaW5nc1skdGhpcy0+Y3VycmVudEJpbmRpbmddWydvcGVyYXRpb25zJ11bJHRoaXMtPmN1cnJlbnRPcGVyYXRpb25dWyR0aGlzLT5vcFN0YXR1c10gPSAkYXR0cnM7CgkJCQkJCSAgICB9IAoJCQkJCQkgICAgYnJlYWs7CgkJCQkJfSAKCQkJCQlicmVhazsKCQkJCWNhc2UgJ3NlcnZpY2UnOgoJCQkJCXN3aXRjaCAoJG5hbWUpIHsKCQkJCQkgICAgY2FzZSAncG9ydCc6CgkJCQkJICAgICAgICAkdGhpcy0+Y3VycmVudFBvcnQgPSAkYXR0cnNbJ25hbWUnXTsKCQkJCQkgICAgICAgICR0aGlzLT5kZWJ1ZygnY3VycmVudCBwb3J0OiAnIC4gJHRoaXMtPmN1cnJlbnRQb3J0KTsKCQkJCQkgICAgICAgICR0aGlzLT5wb3J0c1skdGhpcy0+Y3VycmVudFBvcnRdWydiaW5kaW5nJ10gPSAkdGhpcy0+Z2V0TG9jYWxQYXJ0KCRhdHRyc1snYmluZGluZyddKTsKCQkJCQkKCQkJCQkgICAgICAgIGJyZWFrOwoJCQkJCSAgICBjYXNlICdhZGRyZXNzJzoKCQkJCQkgICAgICAgICR0aGlzLT5wb3J0c1skdGhpcy0+Y3VycmVudFBvcnRdWydsb2NhdGlvbiddID0gJGF0dHJzWydsb2NhdGlvbiddOwoJCQkJCSAgICAgICAgJHRoaXMtPnBvcnRzWyR0aGlzLT5jdXJyZW50UG9ydF1bJ2JpbmRpbmdUeXBlJ10gPSAkbmFtZXNwYWNlOwoJCQkJCSAgICAgICAgJHRoaXMtPmJpbmRpbmdzWyAkdGhpcy0+cG9ydHNbJHRoaXMtPmN1cnJlbnRQb3J0XVsnYmluZGluZyddIF1bJ2JpbmRpbmdUeXBlJ10gPSAkbmFtZXNwYWNlOwoJCQkJCSAgICAgICAgJHRoaXMtPmJpbmRpbmdzWyAkdGhpcy0+cG9ydHNbJHRoaXMtPmN1cnJlbnRQb3J0XVsnYmluZGluZyddIF1bJ2VuZHBvaW50J10gPSAkYXR0cnNbJ2xvY2F0aW9uJ107CgkJCQkJICAgICAgICBicmVhazsKCQkJCQl9IAoJCQkJCWJyZWFrOwoJCQl9IAoJCS8vIHNldCBzdGF0dXMKCQlzd2l0Y2ggKCRuYW1lKSB7CgkJCWNhc2UgJ2ltcG9ydCc6CgkJCSAgICBpZiAoaXNzZXQoJGF0dHJzWydsb2NhdGlvbiddKSkgewogICAgICAgICAgICAgICAgICAgICR0aGlzLT5pbXBvcnRbJGF0dHJzWyduYW1lc3BhY2UnXV1bXSA9IGFycmF5KCdsb2NhdGlvbicgPT4gJGF0dHJzWydsb2NhdGlvbiddLCAnbG9hZGVkJyA9PiBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmRlYnVnKCdwYXJzaW5nIGltcG9ydCAnIC4gJGF0dHJzWyduYW1lc3BhY2UnXS4gJyAtICcgLiAkYXR0cnNbJ2xvY2F0aW9uJ10gLiAnICgnIC4gY291bnQoJHRoaXMtPmltcG9ydFskYXR0cnNbJ25hbWVzcGFjZSddXSkuJyknKTsKCQkJCX0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmltcG9ydFskYXR0cnNbJ25hbWVzcGFjZSddXVtdID0gYXJyYXkoJ2xvY2F0aW9uJyA9PiAnJywgJ2xvYWRlZCcgPT4gdHJ1ZSk7CgkJCQkJaWYgKCEgJHRoaXMtPmdldFByZWZpeEZyb21OYW1lc3BhY2UoJGF0dHJzWyduYW1lc3BhY2UnXSkpIHsKCQkJCQkJJHRoaXMtPm5hbWVzcGFjZXNbJ25zJy4oY291bnQoJHRoaXMtPm5hbWVzcGFjZXMpKzEpXSA9ICRhdHRyc1snbmFtZXNwYWNlJ107CgkJCQkJfQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5kZWJ1ZygncGFyc2luZyBpbXBvcnQgJyAuICRhdHRyc1snbmFtZXNwYWNlJ10uICcgLSBbbm8gbG9jYXRpb25dICgnIC4gY291bnQoJHRoaXMtPmltcG9ydFskYXR0cnNbJ25hbWVzcGFjZSddXSkuJyknKTsKCQkJCX0KCQkJCWJyZWFrOwoJCQkvL3dhaXQgZm9yIHNjaGVtYQoJCQkvL2Nhc2UgJ3R5cGVzJzoKCQkJLy8JJHRoaXMtPnN0YXR1cyA9ICdzY2hlbWEnOwoJCQkvLwlicmVhazsKCQkJY2FzZSAnbWVzc2FnZSc6CgkJCQkkdGhpcy0+c3RhdHVzID0gJ21lc3NhZ2UnOwoJCQkJJHRoaXMtPm1lc3NhZ2VzWyRhdHRyc1snbmFtZSddXSA9IGFycmF5KCk7CgkJCQkkdGhpcy0+Y3VycmVudE1lc3NhZ2UgPSAkYXR0cnNbJ25hbWUnXTsKCQkJCWJyZWFrOwoJCQljYXNlICdwb3J0VHlwZSc6CgkJCQkkdGhpcy0+c3RhdHVzID0gJ3BvcnRUeXBlJzsKCQkJCSR0aGlzLT5wb3J0VHlwZXNbJGF0dHJzWyduYW1lJ11dID0gYXJyYXkoKTsKCQkJCSR0aGlzLT5jdXJyZW50UG9ydFR5cGUgPSAkYXR0cnNbJ25hbWUnXTsKCQkJCWJyZWFrOwoJCQljYXNlICJiaW5kaW5nIjoKCQkJCWlmIChpc3NldCgkYXR0cnNbJ25hbWUnXSkpIHsKCQkJCS8vIGdldCBiaW5kaW5nIG5hbWUKCQkJCQlpZiAoc3RycG9zKCRhdHRyc1snbmFtZSddLCAnOicpKSB7CgkJCSAgICAJCSR0aGlzLT5jdXJyZW50QmluZGluZyA9ICR0aGlzLT5nZXRMb2NhbFBhcnQoJGF0dHJzWyduYW1lJ10pOwoJCQkJCX0gZWxzZSB7CgkJCSAgICAJCSR0aGlzLT5jdXJyZW50QmluZGluZyA9ICRhdHRyc1snbmFtZSddOwoJCQkJCX0gCgkJCQkJJHRoaXMtPnN0YXR1cyA9ICdiaW5kaW5nJzsKCQkJCQkkdGhpcy0+YmluZGluZ3NbJHRoaXMtPmN1cnJlbnRCaW5kaW5nXVsncG9ydFR5cGUnXSA9ICR0aGlzLT5nZXRMb2NhbFBhcnQoJGF0dHJzWyd0eXBlJ10pOwoJCQkJCSR0aGlzLT5kZWJ1ZygiY3VycmVudCBiaW5kaW5nOiAkdGhpcy0+Y3VycmVudEJpbmRpbmcgb2YgcG9ydFR5cGU6ICIgLiAkYXR0cnNbJ3R5cGUnXSk7CgkJCQl9IAoJCQkJYnJlYWs7CgkJCWNhc2UgJ3NlcnZpY2UnOgoJCQkJJHRoaXMtPnNlcnZpY2VOYW1lID0gJGF0dHJzWyduYW1lJ107CgkJCQkkdGhpcy0+c3RhdHVzID0gJ3NlcnZpY2UnOwoJCQkJJHRoaXMtPmRlYnVnKCdjdXJyZW50IHNlcnZpY2U6ICcgLiAkdGhpcy0+c2VydmljZU5hbWUpOwoJCQkJYnJlYWs7CgkJCWNhc2UgJ2RlZmluaXRpb25zJzoKCQkJCWZvcmVhY2ggKCRhdHRycyBhcyAkbmFtZSA9PiAkdmFsdWUpIHsKCQkJCQkkdGhpcy0+d3NkbF9pbmZvWyRuYW1lXSA9ICR2YWx1ZTsKCQkJCX0gCgkJCQlicmVhazsKCQkJfSAKCQl9IAoJfSAKCgkvKioKCSogZW5kLWVsZW1lbnQgaGFuZGxlcgoJKiAKCSogQHBhcmFtIHN0cmluZyAkcGFyc2VyIFhNTCBwYXJzZXIgb2JqZWN0CgkqIEBwYXJhbSBzdHJpbmcgJG5hbWUgZWxlbWVudCBuYW1lCgkqIEBhY2Nlc3MgcHJpdmF0ZSAKCSovCglmdW5jdGlvbiBlbmRfZWxlbWVudCgkcGFyc2VyLCAkbmFtZSl7IAoJCS8vIHVuc2V0IHNjaGVtYSBzdGF0dXMKCQlpZiAoLyplcmVnKCd0eXBlcyQnLCAkbmFtZSkgfHwqLyBlcmVnKCdzY2hlbWEkJywgJG5hbWUpKSB7CgkJCSR0aGlzLT5zdGF0dXMgPSAiIjsKICAgICAgICAgICAgJHRoaXMtPmFwcGVuZERlYnVnKCR0aGlzLT5jdXJyZW50U2NoZW1hLT5nZXREZWJ1ZygpKTsKICAgICAgICAgICAgJHRoaXMtPmN1cnJlbnRTY2hlbWEtPmNsZWFyRGVidWcoKTsKCQkJJHRoaXMtPnNjaGVtYXNbJHRoaXMtPmN1cnJlbnRTY2hlbWEtPnNjaGVtYVRhcmdldE5hbWVzcGFjZV1bXSA9ICR0aGlzLT5jdXJyZW50U2NoZW1hOwogICAgICAgIAkkdGhpcy0+ZGVidWcoJ1BhcnNpbmcgV1NETCBzY2hlbWEgZG9uZScpOwoJCX0gCgkJaWYgKCR0aGlzLT5zdGF0dXMgPT0gJ3NjaGVtYScpIHsKCQkJJHRoaXMtPmN1cnJlbnRTY2hlbWEtPnNjaGVtYUVuZEVsZW1lbnQoJHBhcnNlciwgJG5hbWUpOwoJCX0gZWxzZSB7CgkJCS8vIGJyaW5nIGRlcHRoIGRvd24gYSBub3RjaAoJCQkkdGhpcy0+ZGVwdGgtLTsKCQl9IAoJCS8vIGVuZCBkb2N1bWVudGF0aW9uCgkJaWYgKCR0aGlzLT5kb2N1bWVudGF0aW9uKSB7CgkJCS8vVE9ETzogdHJhY2sgdGhlIG5vZGUgdG8gd2hpY2ggZG9jdW1lbnRhdGlvbiBzaG91bGQgYmUgYXNzaWduZWQ7IGl0IGNhbiBiZSBhIHBhcnQsIG1lc3NhZ2UsIGV0Yy4KCQkJLy8kdGhpcy0+cG9ydFR5cGVzWyR0aGlzLT5jdXJyZW50UG9ydFR5cGVdWyR0aGlzLT5jdXJyZW50UG9ydE9wZXJhdGlvbl1bJ2RvY3VtZW50YXRpb24nXSA9ICR0aGlzLT5kb2N1bWVudGF0aW9uOwoJCQkkdGhpcy0+ZG9jdW1lbnRhdGlvbiA9IGZhbHNlOwoJCX0gCgl9IAoKCS8qKgoJICogZWxlbWVudCBjb250ZW50IGhhbmRsZXIKCSAqIAoJICogQHBhcmFtIHN0cmluZyAkcGFyc2VyIFhNTCBwYXJzZXIgb2JqZWN0CgkgKiBAcGFyYW0gc3RyaW5nICRkYXRhIGVsZW1lbnQgY29udGVudAoJICogQGFjY2VzcyBwcml2YXRlIAoJICovCglmdW5jdGlvbiBjaGFyYWN0ZXJfZGF0YSgkcGFyc2VyLCAkZGF0YSkKCXsKCQkkcG9zID0gaXNzZXQoJHRoaXMtPmRlcHRoX2FycmF5WyR0aGlzLT5kZXB0aF0pID8gJHRoaXMtPmRlcHRoX2FycmF5WyR0aGlzLT5kZXB0aF0gOiAwOwoJCWlmIChpc3NldCgkdGhpcy0+bWVzc2FnZVskcG9zXVsnY2RhdGEnXSkpIHsKCQkJJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ2NkYXRhJ10gLj0gJGRhdGE7CgkJfSAKCQlpZiAoJHRoaXMtPmRvY3VtZW50YXRpb24pIHsKCQkJJHRoaXMtPmRvY3VtZW50YXRpb24gLj0gJGRhdGE7CgkJfSAKCX0gCgkKCWZ1bmN0aW9uIGdldEJpbmRpbmdEYXRhKCRiaW5kaW5nKQoJewoJCWlmIChpc19hcnJheSgkdGhpcy0+YmluZGluZ3NbJGJpbmRpbmddKSkgewoJCQlyZXR1cm4gJHRoaXMtPmJpbmRpbmdzWyRiaW5kaW5nXTsKCQl9IAoJfQoJCgkvKioKCSAqIHJldHVybnMgYW4gYXNzb2MgYXJyYXkgb2Ygb3BlcmF0aW9uIG5hbWVzID0+IG9wZXJhdGlvbiBkYXRhCgkgKiAKCSAqIEBwYXJhbSBzdHJpbmcgJGJpbmRpbmdUeXBlIGVnOiBzb2FwLCBzbXRwLCBkaW1lIChvbmx5IHNvYXAgaXMgY3VycmVudGx5IHN1cHBvcnRlZCkKCSAqIEByZXR1cm4gYXJyYXkgCgkgKiBAYWNjZXNzIHB1YmxpYyAKCSAqLwoJZnVuY3Rpb24gZ2V0T3BlcmF0aW9ucygkYmluZGluZ1R5cGUgPSAnc29hcCcpCgl7CgkJJG9wcyA9IGFycmF5KCk7CgkJaWYgKCRiaW5kaW5nVHlwZSA9PSAnc29hcCcpIHsKCQkJJGJpbmRpbmdUeXBlID0gJ2h0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8nOwoJCX0KCQkvLyBsb29wIHRocnUgcG9ydHMKCQlmb3JlYWNoKCR0aGlzLT5wb3J0cyBhcyAkcG9ydCA9PiAkcG9ydERhdGEpIHsKCQkJLy8gYmluZGluZyB0eXBlIG9mIHBvcnQgbWF0Y2hlcyBwYXJhbWV0ZXIKCQkJaWYgKCRwb3J0RGF0YVsnYmluZGluZ1R5cGUnXSA9PSAkYmluZGluZ1R5cGUpIHsKCQkJCS8vJHRoaXMtPmRlYnVnKCJnZXRPcGVyYXRpb25zIGZvciBwb3J0ICRwb3J0Iik7CgkJCQkvLyR0aGlzLT5kZWJ1ZygicG9ydCBkYXRhOiAiIC4gJHRoaXMtPnZhckR1bXAoJHBvcnREYXRhKSk7CgkJCQkvLyR0aGlzLT5kZWJ1ZygiYmluZGluZ3M6ICIgLiAkdGhpcy0+dmFyRHVtcCgkdGhpcy0+YmluZGluZ3NbICRwb3J0RGF0YVsnYmluZGluZyddIF0pKTsKCQkJCS8vIG1lcmdlIGJpbmRpbmdzCgkJCQlpZiAoaXNzZXQoJHRoaXMtPmJpbmRpbmdzWyAkcG9ydERhdGFbJ2JpbmRpbmcnXSBdWydvcGVyYXRpb25zJ10pKSB7CgkJCQkJJG9wcyA9IGFycmF5X21lcmdlICgkb3BzLCAkdGhpcy0+YmluZGluZ3NbICRwb3J0RGF0YVsnYmluZGluZyddIF1bJ29wZXJhdGlvbnMnXSk7CgkJCQl9CgkJCX0KCQl9IAoJCXJldHVybiAkb3BzOwoJfSAKCQoJLyoqCgkgKiByZXR1cm5zIGFuIGFzc29jaWF0aXZlIGFycmF5IG9mIGRhdGEgbmVjZXNzYXJ5IGZvciBjYWxsaW5nIGFuIG9wZXJhdGlvbgoJICogCgkgKiBAcGFyYW0gc3RyaW5nICRvcGVyYXRpb24gLCBuYW1lIG9mIG9wZXJhdGlvbgoJICogQHBhcmFtIHN0cmluZyAkYmluZGluZ1R5cGUgLCB0eXBlIG9mIGJpbmRpbmcgZWc6IHNvYXAKCSAqIEByZXR1cm4gYXJyYXkgCgkgKiBAYWNjZXNzIHB1YmxpYyAKCSAqLwoJZnVuY3Rpb24gZ2V0T3BlcmF0aW9uRGF0YSgkb3BlcmF0aW9uLCAkYmluZGluZ1R5cGUgPSAnc29hcCcpCgl7CgkJaWYgKCRiaW5kaW5nVHlwZSA9PSAnc29hcCcpIHsKCQkJJGJpbmRpbmdUeXBlID0gJ2h0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8nOwoJCX0KCQkvLyBsb29wIHRocnUgcG9ydHMKCQlmb3JlYWNoKCR0aGlzLT5wb3J0cyBhcyAkcG9ydCA9PiAkcG9ydERhdGEpIHsKCQkJLy8gYmluZGluZyB0eXBlIG9mIHBvcnQgbWF0Y2hlcyBwYXJhbWV0ZXIKCQkJaWYgKCRwb3J0RGF0YVsnYmluZGluZ1R5cGUnXSA9PSAkYmluZGluZ1R5cGUpIHsKCQkJCS8vIGdldCBiaW5kaW5nCgkJCQkvL2ZvcmVhY2goJHRoaXMtPmJpbmRpbmdzWyAkcG9ydERhdGFbJ2JpbmRpbmcnXSBdWydvcGVyYXRpb25zJ10gYXMgJGJPcGVyYXRpb24gPT4gJG9wRGF0YSkgewoJCQkJZm9yZWFjaChhcnJheV9rZXlzKCR0aGlzLT5iaW5kaW5nc1sgJHBvcnREYXRhWydiaW5kaW5nJ10gXVsnb3BlcmF0aW9ucyddKSBhcyAkYk9wZXJhdGlvbikgewoJCQkJCS8vIG5vdGUgdGhhdCB3ZSBjb3VsZC9zaG91bGQgYWxzbyBjaGVjayB0aGUgbmFtZXNwYWNlIGhlcmUKCQkJCQlpZiAoJG9wZXJhdGlvbiA9PSAkYk9wZXJhdGlvbikgewoJCQkJCQkkb3BEYXRhID0gJHRoaXMtPmJpbmRpbmdzWyAkcG9ydERhdGFbJ2JpbmRpbmcnXSBdWydvcGVyYXRpb25zJ11bJG9wZXJhdGlvbl07CgkJCQkJICAgIHJldHVybiAkb3BEYXRhOwoJCQkJCX0gCgkJCQl9IAoJCQl9CgkJfSAKCX0KCQoJLyoqCgkgKiByZXR1cm5zIGFuIGFzc29jaWF0aXZlIGFycmF5IG9mIGRhdGEgbmVjZXNzYXJ5IGZvciBjYWxsaW5nIGFuIG9wZXJhdGlvbgoJICogCgkgKiBAcGFyYW0gc3RyaW5nICRzb2FwQWN0aW9uIHNvYXBBY3Rpb24gZm9yIG9wZXJhdGlvbgoJICogQHBhcmFtIHN0cmluZyAkYmluZGluZ1R5cGUgdHlwZSBvZiBiaW5kaW5nIGVnOiBzb2FwCgkgKiBAcmV0dXJuIGFycmF5IAoJICogQGFjY2VzcyBwdWJsaWMgCgkgKi8KCWZ1bmN0aW9uIGdldE9wZXJhdGlvbkRhdGFGb3JTb2FwQWN0aW9uKCRzb2FwQWN0aW9uLCAkYmluZGluZ1R5cGUgPSAnc29hcCcpIHsKCQlpZiAoJGJpbmRpbmdUeXBlID09ICdzb2FwJykgewoJCQkkYmluZGluZ1R5cGUgPSAnaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyc7CgkJfQoJCS8vIGxvb3AgdGhydSBwb3J0cwoJCWZvcmVhY2goJHRoaXMtPnBvcnRzIGFzICRwb3J0ID0+ICRwb3J0RGF0YSkgewoJCQkvLyBiaW5kaW5nIHR5cGUgb2YgcG9ydCBtYXRjaGVzIHBhcmFtZXRlcgoJCQlpZiAoJHBvcnREYXRhWydiaW5kaW5nVHlwZSddID09ICRiaW5kaW5nVHlwZSkgewoJCQkJLy8gbG9vcCB0aHJvdWdoIG9wZXJhdGlvbnMgZm9yIHRoZSBiaW5kaW5nCgkJCQlmb3JlYWNoICgkdGhpcy0+YmluZGluZ3NbICRwb3J0RGF0YVsnYmluZGluZyddIF1bJ29wZXJhdGlvbnMnXSBhcyAkYk9wZXJhdGlvbiA9PiAkb3BEYXRhKSB7CgkJCQkJaWYgKCRvcERhdGFbJ3NvYXBBY3Rpb24nXSA9PSAkc29hcEFjdGlvbikgewoJCQkJCSAgICByZXR1cm4gJG9wRGF0YTsKCQkJCQl9IAoJCQkJfSAKCQkJfQoJCX0gCgl9CgkKCS8qKgogICAgKiByZXR1cm5zIGFuIGFycmF5IG9mIGluZm9ybWF0aW9uIGFib3V0IGEgZ2l2ZW4gdHlwZQogICAgKiByZXR1cm5zIGZhbHNlIGlmIG5vIHR5cGUgZXhpc3RzIGJ5IHRoZSBnaXZlbiBuYW1lCiAgICAqCgkqCSB0eXBlRGVmID0gYXJyYXkoCgkqCSAnZWxlbWVudHMnID0+IGFycmF5KCksIC8vIHJlZnMgdG8gZWxlbWVudHMgYXJyYXkKCSoJJ3Jlc3RyaWN0aW9uQmFzZScgPT4gJycsCgkqCSdwaHBUeXBlJyA9PiAnJywKCSoJJ29yZGVyJyA9PiAnKHNlcXVlbmNlfGFsbCknLAoJKgknYXR0cnMnID0+IGFycmF5KCkgLy8gcmVmcyB0byBhdHRyaWJ1dGVzIGFycmF5CgkqCSkKICAgICoKICAgICogQHBhcmFtICR0eXBlIHN0cmluZyB0aGUgdHlwZQogICAgKiBAcGFyYW0gJG5zIHN0cmluZyBuYW1lc3BhY2UgKG5vdCBwcmVmaXgpIG9mIHRoZSB0eXBlCiAgICAqIEByZXR1cm4gbWl4ZWQKICAgICogQGFjY2VzcyBwdWJsaWMKICAgICogQHNlZSB4bWxzY2hlbWEKICAgICovCglmdW5jdGlvbiBnZXRUeXBlRGVmKCR0eXBlLCAkbnMpIHsKCQkkdGhpcy0+ZGVidWcoImluIGdldFR5cGVEZWY6IHR5cGU9JHR5cGUsIG5zPSRucyIpOwoJCWlmICgoISAkbnMpICYmIGlzc2V0KCR0aGlzLT5uYW1lc3BhY2VzWyd0bnMnXSkpIHsKCQkJJG5zID0gJHRoaXMtPm5hbWVzcGFjZXNbJ3RucyddOwoJCQkkdGhpcy0+ZGVidWcoImluIGdldFR5cGVEZWY6IHR5cGUgbmFtZXNwYWNlIGZvcmNlZCB0byAkbnMiKTsKCQl9CgkJaWYgKGlzc2V0KCR0aGlzLT5zY2hlbWFzWyRuc10pKSB7CgkJCSR0aGlzLT5kZWJ1ZygiaW4gZ2V0VHlwZURlZjogaGF2ZSBzY2hlbWEgZm9yIG5hbWVzcGFjZSAkbnMiKTsKCQkJZm9yICgkaSA9IDA7ICRpIDwgY291bnQoJHRoaXMtPnNjaGVtYXNbJG5zXSk7ICRpKyspIHsKCQkJCSR4cyA9ICYkdGhpcy0+c2NoZW1hc1skbnNdWyRpXTsKCQkJCSR0ID0gJHhzLT5nZXRUeXBlRGVmKCR0eXBlKTsKCQkJCSR0aGlzLT5hcHBlbmREZWJ1ZygkeHMtPmdldERlYnVnKCkpOwoJCQkJJHhzLT5jbGVhckRlYnVnKCk7CgkJCQlpZiAoJHQpIHsKCQkJCQlpZiAoIWlzc2V0KCR0WydwaHBUeXBlJ10pKSB7CgkJCQkJCS8vIGdldCBpbmZvIGZvciB0eXBlIHRvIHRhY2sgb250byB0aGUgZWxlbWVudAoJCQkJCQkkdXFUeXBlID0gc3Vic3RyKCR0Wyd0eXBlJ10sIHN0cnJwb3MoJHRbJ3R5cGUnXSwgJzonKSArIDEpOwoJCQkJCQkkbnMgPSBzdWJzdHIoJHRbJ3R5cGUnXSwgMCwgc3RycnBvcygkdFsndHlwZSddLCAnOicpKTsKCQkJCQkJJGV0eXBlID0gJHRoaXMtPmdldFR5cGVEZWYoJHVxVHlwZSwgJG5zKTsKCQkJCQkJaWYgKCRldHlwZSkgewoJCQkJCQkJJHRoaXMtPmRlYnVnKCJmb3VuZCB0eXBlIGZvciBbZWxlbWVudF0gJHR5cGU6Iik7CgkJCQkJCQkkdGhpcy0+ZGVidWcoJHRoaXMtPnZhckR1bXAoJGV0eXBlKSk7CgkJCQkJCQlpZiAoaXNzZXQoJGV0eXBlWydwaHBUeXBlJ10pKSB7CgkJCQkJCQkJJHRbJ3BocFR5cGUnXSA9ICRldHlwZVsncGhwVHlwZSddOwoJCQkJCQkJfQoJCQkJCQkJaWYgKGlzc2V0KCRldHlwZVsnZWxlbWVudHMnXSkpIHsKCQkJCQkJCQkkdFsnZWxlbWVudHMnXSA9ICRldHlwZVsnZWxlbWVudHMnXTsKCQkJCQkJCX0KCQkJCQkJCWlmIChpc3NldCgkZXR5cGVbJ2F0dHJzJ10pKSB7CgkJCQkJCQkJJHRbJ2F0dHJzJ10gPSAkZXR5cGVbJ2F0dHJzJ107CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9CgkJCQkJcmV0dXJuICR0OwoJCQkJfQoJCQl9CgkJfSBlbHNlIHsKCQkJJHRoaXMtPmRlYnVnKCJpbiBnZXRUeXBlRGVmOiBkbyBub3QgaGF2ZSBzY2hlbWEgZm9yIG5hbWVzcGFjZSAkbnMiKTsKCQl9CgkJcmV0dXJuIGZhbHNlOwoJfQoKICAgIC8qKgogICAgKiBwcmludHMgaHRtbCBkZXNjcmlwdGlvbiBvZiBzZXJ2aWNlcwogICAgKgogICAgKiBAYWNjZXNzIHByaXZhdGUKICAgICovCiAgICBmdW5jdGlvbiB3ZWJEZXNjcmlwdGlvbigpewogICAgCWdsb2JhbCAkSFRUUF9TRVJWRVJfVkFSUzsKCgkJaWYgKGlzc2V0KCRfU0VSVkVSKSkgewoJCQkkUEhQX1NFTEYgPSAkX1NFUlZFUlsnUEhQX1NFTEYnXTsKCQl9IGVsc2VpZiAoaXNzZXQoJEhUVFBfU0VSVkVSX1ZBUlMpKSB7CgkJCSRQSFBfU0VMRiA9ICRIVFRQX1NFUlZFUl9WQVJTWydQSFBfU0VMRiddOwoJCX0gZWxzZSB7CgkJCSR0aGlzLT5zZXRFcnJvcigiTmVpdGhlciBfU0VSVkVSIG5vciBIVFRQX1NFUlZFUl9WQVJTIGlzIGF2YWlsYWJsZSIpOwoJCX0KCgkJJGIgPSAnCgkJPGh0bWw+PGhlYWQ+PHRpdGxlPk51U09BUDogJy4kdGhpcy0+c2VydmljZU5hbWUuJzwvdGl0bGU+CgkJPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KCQkgICAgYm9keSAgICB7IGZvbnQtZmFtaWx5OiBhcmlhbDsgY29sb3I6ICMwMDAwMDA7IGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7IG1hcmdpbjogMHB4IDBweCAwcHggMHB4OyB9CgkJICAgIHAgICAgICAgeyBmb250LWZhbWlseTogYXJpYWw7IGNvbG9yOiAjMDAwMDAwOyBtYXJnaW4tdG9wOiAwcHg7IG1hcmdpbi1ib3R0b206IDEycHg7IH0KCQkgICAgcHJlIHsgYmFja2dyb3VuZC1jb2xvcjogc2lsdmVyOyBwYWRkaW5nOiA1cHg7IGZvbnQtZmFtaWx5OiBDb3VyaWVyIE5ldzsgZm9udC1zaXplOiB4LXNtYWxsOyBjb2xvcjogIzAwMDAwMDt9CgkJICAgIHVsICAgICAgeyBtYXJnaW4tdG9wOiAxMHB4OyBtYXJnaW4tbGVmdDogMjBweDsgfQoJCSAgICBsaSAgICAgIHsgbGlzdC1zdHlsZS10eXBlOiBub25lOyBtYXJnaW4tdG9wOiAxMHB4OyBjb2xvcjogIzAwMDAwMDsgfQoJCSAgICAuY29udGVudHsKCQkJbWFyZ2luLWxlZnQ6IDBweDsgcGFkZGluZy1ib3R0b206IDJlbTsgfQoJCSAgICAubmF2IHsKCQkJcGFkZGluZy10b3A6IDEwcHg7IHBhZGRpbmctYm90dG9tOiAxMHB4OyBwYWRkaW5nLWxlZnQ6IDE1cHg7IGZvbnQtc2l6ZTogLjcwZW07CgkJCW1hcmdpbi10b3A6IDEwcHg7IG1hcmdpbi1sZWZ0OiAwcHg7IGNvbG9yOiAjMDAwMDAwOwoJCQliYWNrZ3JvdW5kLWNvbG9yOiAjY2NjY2ZmOyB3aWR0aDogMjAlOyBtYXJnaW4tbGVmdDogMjBweDsgbWFyZ2luLXRvcDogMjBweDsgfQoJCSAgICAudGl0bGUgewoJCQlmb250LWZhbWlseTogYXJpYWw7IGZvbnQtc2l6ZTogMjZweDsgY29sb3I6ICNmZmZmZmY7CgkJCWJhY2tncm91bmQtY29sb3I6ICM5OTk5OTk7IHdpZHRoOiAxMDUlOyBtYXJnaW4tbGVmdDogMHB4OwoJCQlwYWRkaW5nLXRvcDogMTBweDsgcGFkZGluZy1ib3R0b206IDEwcHg7IHBhZGRpbmctbGVmdDogMTVweDt9CgkJICAgIC5oaWRkZW4gewoJCQlwb3NpdGlvbjogYWJzb2x1dGU7IHZpc2liaWxpdHk6IGhpZGRlbjsgei1pbmRleDogMjAwOyBsZWZ0OiAyNTBweDsgdG9wOiAxMDBweDsKCQkJZm9udC1mYW1pbHk6IGFyaWFsOyBvdmVyZmxvdzogaGlkZGVuOyB3aWR0aDogNjAwOwoJCQlwYWRkaW5nOiAyMHB4OyBmb250LXNpemU6IDEwcHg7IGJhY2tncm91bmQtY29sb3I6ICM5OTk5OTk7CgkJCWxheWVyLWJhY2tncm91bmQtY29sb3I6I0ZGRkZGRjsgfQoJCSAgICBhLGE6YWN0aXZlICB7IGNvbG9yOiBjaGFyY29hbDsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KCQkgICAgYTp2aXNpdGVkICAgeyBjb2xvcjogIzY2NjY2NjsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KCQkgICAgYTpob3ZlciAgICAgeyBjb2xvcjogY2MzMzAwOyBmb250LXdlaWdodDogYm9sZDsgfQoJCTwvc3R5bGU+CgkJPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQk8IS0tCgkJLy8gUE9QLVVQIENBUFRJT05TLi4uCgkJZnVuY3Rpb24gbGliX2J3Y2hlY2soKXsgLy9Ccm93c2VyY2hlY2sgKG5lZWRlZCkKCQkgICAgdGhpcy52ZXI9bmF2aWdhdG9yLmFwcFZlcnNpb24KCQkgICAgdGhpcy5hZ2VudD1uYXZpZ2F0b3IudXNlckFnZW50CgkJICAgIHRoaXMuZG9tPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkPzE6MAoJCSAgICB0aGlzLm9wZXJhNT10aGlzLmFnZW50LmluZGV4T2YoIk9wZXJhIDUiKT4tMQoJCSAgICB0aGlzLmllNT0odGhpcy52ZXIuaW5kZXhPZigiTVNJRSA1Iik+LTEgJiYgdGhpcy5kb20gJiYgIXRoaXMub3BlcmE1KT8xOjA7CgkJICAgIHRoaXMuaWU2PSh0aGlzLnZlci5pbmRleE9mKCJNU0lFIDYiKT4tMSAmJiB0aGlzLmRvbSAmJiAhdGhpcy5vcGVyYTUpPzE6MDsKCQkgICAgdGhpcy5pZTQ9KGRvY3VtZW50LmFsbCAmJiAhdGhpcy5kb20gJiYgIXRoaXMub3BlcmE1KT8xOjA7CgkJICAgIHRoaXMuaWU9dGhpcy5pZTR8fHRoaXMuaWU1fHx0aGlzLmllNgoJCSAgICB0aGlzLm1hYz10aGlzLmFnZW50LmluZGV4T2YoIk1hYyIpPi0xCgkJICAgIHRoaXMubnM2PSh0aGlzLmRvbSAmJiBwYXJzZUludCh0aGlzLnZlcikgPj0gNSkgPzE6MDsKCQkgICAgdGhpcy5uczQ9KGRvY3VtZW50LmxheWVycyAmJiAhdGhpcy5kb20pPzE6MDsKCQkgICAgdGhpcy5idz0odGhpcy5pZTYgfHwgdGhpcy5pZTUgfHwgdGhpcy5pZTQgfHwgdGhpcy5uczQgfHwgdGhpcy5uczYgfHwgdGhpcy5vcGVyYTUpCgkJICAgIHJldHVybiB0aGlzCgkJfQoJCXZhciBidyA9IG5ldyBsaWJfYndjaGVjaygpCgkJLy9NYWtlcyBjcm9zc2Jyb3dzZXIgb2JqZWN0LgoJCWZ1bmN0aW9uIG1ha2VPYmoob2JqKXsKCQkgICAgdGhpcy5ldm50PWJ3LmRvbT8gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQob2JqKTpidy5pZTQ/ZG9jdW1lbnQuYWxsW29ial06YncubnM0P2RvY3VtZW50LmxheWVyc1tvYmpdOjA7CgkJICAgIGlmKCF0aGlzLmV2bnQpIHJldHVybiBmYWxzZQoJCSAgICB0aGlzLmNzcz1idy5kb218fGJ3LmllND90aGlzLmV2bnQuc3R5bGU6YncubnM0P3RoaXMuZXZudDowOwoJCSAgICB0aGlzLndyZWY9YncuZG9tfHxidy5pZTQ/dGhpcy5ldm50OmJ3Lm5zND90aGlzLmNzcy5kb2N1bWVudDowOwoJCSAgICB0aGlzLndyaXRlSXQ9Yl93cml0ZUl0OwoJCSAgICByZXR1cm4gdGhpcwoJCX0KCQkvLyBBIHVuaXQgb2YgbWVhc3VyZSB0aGF0IHdpbGwgYmUgYWRkZWQgd2hlbiBzZXR0aW5nIHRoZSBwb3NpdGlvbiBvZiBhIGxheWVyLgoJCS8vdmFyIHB4ID0gYncubnM0fHx3aW5kb3cub3BlcmE/IiI6InB4IjsKCQlmdW5jdGlvbiBiX3dyaXRlSXQodGV4dCl7CgkJICAgIGlmIChidy5uczQpe3RoaXMud3JlZi53cml0ZSh0ZXh0KTt0aGlzLndyZWYuY2xvc2UoKX0KCQkgICAgZWxzZSB0aGlzLndyZWYuaW5uZXJIVE1MID0gdGV4dAoJCX0KCQkvL1Nob3dzIHRoZSBtZXNzYWdlcwoJCXZhciBvRGVzYzsKCQlmdW5jdGlvbiBwb3B1cChkaXZpZCl7CgkJICAgIGlmKG9EZXNjID0gbmV3IG1ha2VPYmooZGl2aWQpKXsKCQkJb0Rlc2MuY3NzLnZpc2liaWxpdHkgPSAidmlzaWJsZSIKCQkgICAgfQoJCX0KCQlmdW5jdGlvbiBwb3BvdXQoKXsgLy8gSGlkZXMgbWVzc2FnZQoJCSAgICBpZihvRGVzYykgb0Rlc2MuY3NzLnZpc2liaWxpdHkgPSAiaGlkZGVuIgoJCX0KCQkvLy0tPgoJCTwvc2NyaXB0PgoJCTwvaGVhZD4KCQk8Ym9keT4KCQk8ZGl2IGNsYXNzPWNvbnRlbnQ+CgkJCTxicj48YnI+CgkJCTxkaXYgY2xhc3M9dGl0bGU+Jy4kdGhpcy0+c2VydmljZU5hbWUuJzwvZGl2PgoJCQk8ZGl2IGNsYXNzPW5hdj4KCQkJCTxwPlZpZXcgdGhlIDxhIGhyZWY9IicuJFBIUF9TRUxGLic/d3NkbCI+V1NETDwvYT4gZm9yIHRoZSBzZXJ2aWNlLgoJCQkJQ2xpY2sgb24gYW4gb3BlcmF0aW9uIG5hbWUgdG8gdmlldyBpdCZhcG9zO3MgZGV0YWlscy48L3A+CgkJCQk8dWw+JzsKCQkJCWZvcmVhY2goJHRoaXMtPmdldE9wZXJhdGlvbnMoKSBhcyAkb3AgPT4gJGRhdGEpewoJCQkJICAgICRiIC49ICI8bGk+PGEgaHJlZj0nIycgb25jbGljaz1cInBvcG91dCgpO3BvcHVwKCckb3AnKVwiPiRvcDwvYT48L2xpPiI7CgkJCQkgICAgLy8gY3JlYXRlIGhpZGRlbiBkaXYKCQkJCSAgICAkYiAuPSAiPGRpdiBpZD0nJG9wJyBjbGFzcz0naGlkZGVuJz4KCQkJCSAgICA8YSBocmVmPScjJyBvbmNsaWNrPSdwb3BvdXQoKSc+PGZvbnQgY29sb3I9JyNmZmZmZmYnPkNsb3NlPC9mb250PjwvYT48YnI+PGJyPiI7CgkJCQkgICAgZm9yZWFjaCgkZGF0YSBhcyAkZG9ubmllID0+ICRtYXJpZSl7IC8vIGxvb3AgdGhyb3VnaCBvcGRhdGEKCQkJCQkJaWYoJGRvbm5pZSA9PSAnaW5wdXQnIHx8ICRkb25uaWUgPT0gJ291dHB1dCcpeyAvLyBzaG93IGlucHV0L291dHB1dCBkYXRhCgkJCQkJCSAgICAkYiAuPSAiPGZvbnQgY29sb3I9J3doaXRlJz4iLnVjZmlyc3QoJGRvbm5pZSkuJzo8L2ZvbnQ+PGJyPic7CgkJCQkJCSAgICBmb3JlYWNoKCRtYXJpZSBhcyAkY2FwdGFpbiA9PiAkdGVuaWxsZSl7IC8vIGxvb3AgdGhyb3VnaCBkYXRhCgkJCQkJCQkJaWYoJGNhcHRhaW4gPT0gJ3BhcnRzJyl7IC8vIGxvb3AgdGhydSBwYXJ0cwoJCQkJCQkJCSAgICAkYiAuPSAiJm5ic3A7Jm5ic3A7JGNhcHRhaW46PGJyPiI7CgkJCQkJICAgICAgICAgICAgICAgIC8vaWYoaXNfYXJyYXkoJHRlbmlsbGUpKXsKCQkJCQkJCQkgICAgCWZvcmVhY2goJHRlbmlsbGUgYXMgJGpvYW5pZSA9PiAkY2hhY2hpKXsKCQkJCQkJCQkJCQkkYiAuPSAiJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7JGpvYW5pZTogJGNoYWNoaTxicj4iOwoJCQkJCQkJCSAgICAJfQoJCQkJCSAgICAgICAgCQkvL30KCQkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCSAgICAkYiAuPSAiJm5ic3A7Jm5ic3A7JGNhcHRhaW46ICR0ZW5pbGxlPGJyPiI7CgkJCQkJCQkJfQoJCQkJCQkgICAgfQoJCQkJCQl9IGVsc2UgewoJCQkJCQkgICAgJGIgLj0gIjxmb250IGNvbG9yPSd3aGl0ZSc+Ii51Y2ZpcnN0KCRkb25uaWUpLiI6PC9mb250PiAkbWFyaWU8YnI+IjsKCQkJCQkJfQoJCQkJICAgIH0KCQkJCQkkYiAuPSAnPC9kaXY+JzsKCQkJCX0KCQkJCSRiIC49ICcKCQkJCTx1bD4KCQkJPC9kaXY+CgkJPC9kaXY+PC9ib2R5PjwvaHRtbD4nOwoJCXJldHVybiAkYjsKICAgIH0KCgkvKioKCSogc2VyaWFsaXplIHRoZSBwYXJzZWQgd3NkbAoJKgoJKiBAcGFyYW0gbWl4ZWQgJGRlYnVnIHdoZXRoZXIgdG8gcHV0IGRlYnVnPTEgaW4gZW5kcG9pbnQgVVJMCgkqIEByZXR1cm4gc3RyaW5nIHNlcmlhbGl6YXRpb24gb2YgV1NETAoJKiBAYWNjZXNzIHB1YmxpYyAKCSovCglmdW5jdGlvbiBzZXJpYWxpemUoJGRlYnVnID0gMCkKCXsKCQkkeG1sID0gJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4nOwoJCSR4bWwgLj0gIlxuPGRlZmluaXRpb25zIjsKCQlmb3JlYWNoKCR0aGlzLT5uYW1lc3BhY2VzIGFzICRrID0+ICR2KSB7CgkJCSR4bWwgLj0gIiB4bWxuczokaz1cIiR2XCIiOwoJCX0gCgkJLy8gMTAuOS4wMiAtIGFkZCBwb3VsdGVyIGZpeCBmb3Igd3NkbCBhbmQgdG5zIGRlY2xhcmF0aW9ucwoJCWlmIChpc3NldCgkdGhpcy0+bmFtZXNwYWNlc1snd3NkbCddKSkgewoJCQkkeG1sIC49ICIgeG1sbnM9XCIiIC4gJHRoaXMtPm5hbWVzcGFjZXNbJ3dzZGwnXSAuICJcIiI7CgkJfSAKCQlpZiAoaXNzZXQoJHRoaXMtPm5hbWVzcGFjZXNbJ3RucyddKSkgewoJCQkkeG1sIC49ICIgdGFyZ2V0TmFtZXNwYWNlPVwiIiAuICR0aGlzLT5uYW1lc3BhY2VzWyd0bnMnXSAuICJcIiI7CgkJfSAKCQkkeG1sIC49ICc+JzsgCgkJLy8gaW1wb3J0cwoJCWlmIChzaXplb2YoJHRoaXMtPmltcG9ydCkgPiAwKSB7CgkJCWZvcmVhY2goJHRoaXMtPmltcG9ydCBhcyAkbnMgPT4gJGxpc3QpIHsKCQkJCWZvcmVhY2ggKCRsaXN0IGFzICRpaSkgewoJCQkJCWlmICgkaWlbJ2xvY2F0aW9uJ10gIT0gJycpIHsKCQkJCQkJJHhtbCAuPSAnPGltcG9ydCBsb2NhdGlvbj0iJyAuICRpaVsnbG9jYXRpb24nXSAuICciIG5hbWVzcGFjZT0iJyAuICRucyAuICciIC8+JzsKCQkJCQl9IGVsc2UgewoJCQkJCQkkeG1sIC49ICc8aW1wb3J0IG5hbWVzcGFjZT0iJyAuICRucyAuICciIC8+JzsKCQkJCQl9CgkJCQl9CgkJCX0gCgkJfSAKCQkvLyB0eXBlcwoJCWlmIChjb3VudCgkdGhpcy0+c2NoZW1hcyk+PTEpIHsKCQkJJHhtbCAuPSAiXG48dHlwZXM+IjsKCQkJZm9yZWFjaCAoJHRoaXMtPnNjaGVtYXMgYXMgJG5zID0+ICRsaXN0KSB7CgkJCQlmb3JlYWNoICgkbGlzdCBhcyAkeHMpIHsKCQkJCQkkeG1sIC49ICR4cy0+c2VyaWFsaXplU2NoZW1hKCk7CgkJCQl9CgkJCX0KCQkJJHhtbCAuPSAnPC90eXBlcz4nOwoJCX0gCgkJLy8gbWVzc2FnZXMKCQlpZiAoY291bnQoJHRoaXMtPm1lc3NhZ2VzKSA+PSAxKSB7CgkJCWZvcmVhY2goJHRoaXMtPm1lc3NhZ2VzIGFzICRtc2dOYW1lID0+ICRtc2dQYXJ0cykgewoJCQkJJHhtbCAuPSAiXG48bWVzc2FnZSBuYW1lPVwiIiAuICRtc2dOYW1lIC4gJyI+JzsKCQkJCWlmKGlzX2FycmF5KCRtc2dQYXJ0cykpewoJCQkJCWZvcmVhY2goJG1zZ1BhcnRzIGFzICRwYXJ0TmFtZSA9PiAkcGFydFR5cGUpIHsKCQkJCQkJLy8gcHJpbnQgJ3NlcmlhbGl6aW5nICcuJHBhcnRUeXBlLicsIHN2OiAnLiR0aGlzLT5YTUxTY2hlbWFWZXJzaW9uLic8YnI+JzsKCQkJCQkJaWYgKHN0cnBvcygkcGFydFR5cGUsICc6JykpIHsKCQkJCQkJICAgICR0eXBlUHJlZml4ID0gJHRoaXMtPmdldFByZWZpeEZyb21OYW1lc3BhY2UoJHRoaXMtPmdldFByZWZpeCgkcGFydFR5cGUpKTsKCQkJCQkJfSBlbHNlaWYgKGlzc2V0KCR0aGlzLT50eXBlbWFwWyR0aGlzLT5uYW1lc3BhY2VzWyd4c2QnXV1bJHBhcnRUeXBlXSkpIHsKCQkJCQkJICAgIC8vIHByaW50ICdjaGVja2luZyB0eXBlbWFwOiAnLiR0aGlzLT5YTUxTY2hlbWFWZXJzaW9uLic8YnI+JzsKCQkJCQkJICAgICR0eXBlUHJlZml4ID0gJ3hzZCc7CgkJCQkJCX0gZWxzZSB7CgkJCQkJCSAgICBmb3JlYWNoKCR0aGlzLT50eXBlbWFwIGFzICRucyA9PiAkdHlwZXMpIHsKCQkJCQkJICAgICAgICBpZiAoaXNzZXQoJHR5cGVzWyRwYXJ0VHlwZV0pKSB7CgkJCQkJCSAgICAgICAgICAgICR0eXBlUHJlZml4ID0gJHRoaXMtPmdldFByZWZpeEZyb21OYW1lc3BhY2UoJG5zKTsKCQkJCQkJICAgICAgICB9IAoJCQkJCQkgICAgfSAKCQkJCQkJICAgIGlmICghaXNzZXQoJHR5cGVQcmVmaXgpKSB7CgkJCQkJCSAgICAgICAgZGllKCIkcGFydFR5cGUgaGFzIG5vIG5hbWVzcGFjZSEiKTsKCQkJCQkJICAgIH0gCgkJCQkJCX0KCQkJCQkJJG5zID0gJHRoaXMtPmdldE5hbWVzcGFjZUZyb21QcmVmaXgoJHR5cGVQcmVmaXgpOwoJCQkJCQkkdHlwZURlZiA9ICR0aGlzLT5nZXRUeXBlRGVmKCR0aGlzLT5nZXRMb2NhbFBhcnQoJHBhcnRUeXBlKSwgJG5zKTsKCQkJCQkJaWYgKCR0eXBlRGVmWyd0eXBlQ2xhc3MnXSA9PSAnZWxlbWVudCcpIHsKCQkJCQkJCSRlbGVtZW50b3J0eXBlID0gJ2VsZW1lbnQnOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJJGVsZW1lbnRvcnR5cGUgPSAndHlwZSc7CgkJCQkJCX0KCQkJCQkJJHhtbCAuPSAnPHBhcnQgbmFtZT0iJyAuICRwYXJ0TmFtZSAuICciICcgLiAkZWxlbWVudG9ydHlwZSAuICc9IicgLiAkdHlwZVByZWZpeCAuICc6JyAuICR0aGlzLT5nZXRMb2NhbFBhcnQoJHBhcnRUeXBlKSAuICciIC8+JzsKCQkJCQl9CgkJCQl9CgkJCQkkeG1sIC49ICc8L21lc3NhZ2U+JzsKCQkJfSAKCQl9IAoJCS8vIGJpbmRpbmdzICYgcG9ydHR5cGVzCgkJaWYgKGNvdW50KCR0aGlzLT5iaW5kaW5ncykgPj0gMSkgewoJCQkkYmluZGluZ194bWwgPSAnJzsKCQkJJHBvcnRUeXBlX3htbCA9ICcnOwoJCQlmb3JlYWNoKCR0aGlzLT5iaW5kaW5ncyBhcyAkYmluZGluZ05hbWUgPT4gJGF0dHJzKSB7CgkJCQkkYmluZGluZ194bWwgLj0gIlxuPGJpbmRpbmcgbmFtZT1cIiIgLiAkYmluZGluZ05hbWUgLiAnIiB0eXBlPSJ0bnM6JyAuICRhdHRyc1sncG9ydFR5cGUnXSAuICciPic7CgkJCQkkYmluZGluZ194bWwgLj0gJzxzb2FwOmJpbmRpbmcgc3R5bGU9IicgLiAkYXR0cnNbJ3N0eWxlJ10gLiAnIiB0cmFuc3BvcnQ9IicgLiAkYXR0cnNbJ3RyYW5zcG9ydCddIC4gJyIvPic7CgkJCQkkcG9ydFR5cGVfeG1sIC49ICJcbjxwb3J0VHlwZSBuYW1lPVwiIiAuICRhdHRyc1sncG9ydFR5cGUnXSAuICciPic7CgkJCQlmb3JlYWNoKCRhdHRyc1snb3BlcmF0aW9ucyddIGFzICRvcE5hbWUgPT4gJG9wUGFydHMpIHsKCQkJCQkkYmluZGluZ194bWwgLj0gJzxvcGVyYXRpb24gbmFtZT0iJyAuICRvcE5hbWUgLiAnIj4nOwoJCQkJCSRiaW5kaW5nX3htbCAuPSAnPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IicgLiAkb3BQYXJ0c1snc29hcEFjdGlvbiddIC4gJyIgc3R5bGU9IicuICRvcFBhcnRzWydzdHlsZSddIC4gJyIvPic7CgkJCQkJaWYgKGlzc2V0KCRvcFBhcnRzWydpbnB1dCddWydlbmNvZGluZ1N0eWxlJ10pICYmICRvcFBhcnRzWydpbnB1dCddWydlbmNvZGluZ1N0eWxlJ10gIT0gJycpIHsKCQkJCQkJJGVuY19zdHlsZSA9ICcgZW5jb2RpbmdTdHlsZT0iJyAuICRvcFBhcnRzWydpbnB1dCddWydlbmNvZGluZ1N0eWxlJ10gLiAnIic7CgkJCQkJfSBlbHNlIHsKCQkJCQkJJGVuY19zdHlsZSA9ICcnOwoJCQkJCX0KCQkJCQkkYmluZGluZ194bWwgLj0gJzxpbnB1dD48c29hcDpib2R5IHVzZT0iJyAuICRvcFBhcnRzWydpbnB1dCddWyd1c2UnXSAuICciIG5hbWVzcGFjZT0iJyAuICRvcFBhcnRzWydpbnB1dCddWyduYW1lc3BhY2UnXSAuICciJyAuICRlbmNfc3R5bGUgLiAnLz48L2lucHV0Pic7CgkJCQkJaWYgKGlzc2V0KCRvcFBhcnRzWydvdXRwdXQnXVsnZW5jb2RpbmdTdHlsZSddKSAmJiAkb3BQYXJ0c1snb3V0cHV0J11bJ2VuY29kaW5nU3R5bGUnXSAhPSAnJykgewoJCQkJCQkkZW5jX3N0eWxlID0gJyBlbmNvZGluZ1N0eWxlPSInIC4gJG9wUGFydHNbJ291dHB1dCddWydlbmNvZGluZ1N0eWxlJ10gLiAnIic7CgkJCQkJfSBlbHNlIHsKCQkJCQkJJGVuY19zdHlsZSA9ICcnOwoJCQkJCX0KCQkJCQkkYmluZGluZ194bWwgLj0gJzxvdXRwdXQ+PHNvYXA6Ym9keSB1c2U9IicgLiAkb3BQYXJ0c1snb3V0cHV0J11bJ3VzZSddIC4gJyIgbmFtZXNwYWNlPSInIC4gJG9wUGFydHNbJ291dHB1dCddWyduYW1lc3BhY2UnXSAuICciJyAuICRlbmNfc3R5bGUgLiAnLz48L291dHB1dD4nOwoJCQkJCSRiaW5kaW5nX3htbCAuPSAnPC9vcGVyYXRpb24+JzsKCQkJCQkkcG9ydFR5cGVfeG1sIC49ICc8b3BlcmF0aW9uIG5hbWU9IicgLiAkb3BQYXJ0c1snbmFtZSddIC4gJyInOwoJCQkJCWlmIChpc3NldCgkb3BQYXJ0c1sncGFyYW1ldGVyT3JkZXInXSkpIHsKCQkJCQkgICAgJHBvcnRUeXBlX3htbCAuPSAnIHBhcmFtZXRlck9yZGVyPSInIC4gJG9wUGFydHNbJ3BhcmFtZXRlck9yZGVyJ10gLiAnIic7CgkJCQkJfSAKCQkJCQkkcG9ydFR5cGVfeG1sIC49ICc+JzsKCQkJCQlpZihpc3NldCgkb3BQYXJ0c1snZG9jdW1lbnRhdGlvbiddKSAmJiAkb3BQYXJ0c1snZG9jdW1lbnRhdGlvbiddICE9ICcnKSB7CgkJCQkJCSRwb3J0VHlwZV94bWwgLj0gJzxkb2N1bWVudGF0aW9uPicgLiBodG1sc3BlY2lhbGNoYXJzKCRvcFBhcnRzWydkb2N1bWVudGF0aW9uJ10pIC4gJzwvZG9jdW1lbnRhdGlvbj4nOwoJCQkJCX0KCQkJCQkkcG9ydFR5cGVfeG1sIC49ICc8aW5wdXQgbWVzc2FnZT0idG5zOicgLiAkb3BQYXJ0c1snaW5wdXQnXVsnbWVzc2FnZSddIC4gJyIvPic7CgkJCQkJJHBvcnRUeXBlX3htbCAuPSAnPG91dHB1dCBtZXNzYWdlPSJ0bnM6JyAuICRvcFBhcnRzWydvdXRwdXQnXVsnbWVzc2FnZSddIC4gJyIvPic7CgkJCQkJJHBvcnRUeXBlX3htbCAuPSAnPC9vcGVyYXRpb24+JzsKCQkJCX0gCgkJCQkkcG9ydFR5cGVfeG1sIC49ICc8L3BvcnRUeXBlPic7CgkJCQkkYmluZGluZ194bWwgLj0gJzwvYmluZGluZz4nOwoJCQl9IAoJCQkkeG1sIC49ICRwb3J0VHlwZV94bWwgLiAkYmluZGluZ194bWw7CgkJfSAKCQkvLyBzZXJ2aWNlcwoJCSR4bWwgLj0gIlxuPHNlcnZpY2UgbmFtZT1cIiIgLiAkdGhpcy0+c2VydmljZU5hbWUgLiAnIj4nOwoJCWlmIChjb3VudCgkdGhpcy0+cG9ydHMpID49IDEpIHsKCQkJZm9yZWFjaCgkdGhpcy0+cG9ydHMgYXMgJHBOYW1lID0+ICRhdHRycykgewoJCQkJJHhtbCAuPSAnPHBvcnQgbmFtZT0iJyAuICRwTmFtZSAuICciIGJpbmRpbmc9InRuczonIC4gJGF0dHJzWydiaW5kaW5nJ10gLiAnIj4nOwoJCQkJJHhtbCAuPSAnPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iJyAuICRhdHRyc1snbG9jYXRpb24nXSAuICgkZGVidWcgPyAnP2RlYnVnPTEnIDogJycpIC4gJyIvPic7CgkJCQkkeG1sIC49ICc8L3BvcnQ+JzsKCQkJfSAKCQl9IAoJCSR4bWwgLj0gJzwvc2VydmljZT4nOwoJCXJldHVybiAkeG1sIC4gIlxuPC9kZWZpbml0aW9ucz4iOwoJfSAKCQoJLyoqCgkgKiBzZXJpYWxpemUgUEhQIHZhbHVlcyBhY2NvcmRpbmcgdG8gYSBXU0RMIG1lc3NhZ2UgZGVmaW5pdGlvbgoJICoKCSAqIFRPRE8KCSAqIC0gbXVsdGktcmVmIHNlcmlhbGl6YXRpb24KCSAqIC0gdmFsaWRhdGUgUEhQIHZhbHVlcyBhZ2FpbnN0IHR5cGUgZGVmaW5pdGlvbnMsIHJldHVybiBlcnJvcnMgaWYgaW52YWxpZAoJICogCgkgKiBAcGFyYW0gc3RyaW5nICRvcGVyYXRpb24gb3BlcmF0aW9uIG5hbWUKCSAqIEBwYXJhbSBzdHJpbmcgJGRpcmVjdGlvbiAoaW5wdXR8b3V0cHV0KQoJICogQHBhcmFtIG1peGVkICRwYXJhbWV0ZXJzIHBhcmFtZXRlciB2YWx1ZShzKQoJICogQHJldHVybiBtaXhlZCBwYXJhbWV0ZXJzIHNlcmlhbGl6ZWQgYXMgWE1MIG9yIGZhbHNlIG9uIGVycm9yIChlLmcuIG9wZXJhdGlvbiBub3QgZm91bmQpCgkgKiBAYWNjZXNzIHB1YmxpYwoJICovCglmdW5jdGlvbiBzZXJpYWxpemVSUENQYXJhbWV0ZXJzKCRvcGVyYXRpb24sICRkaXJlY3Rpb24sICRwYXJhbWV0ZXJzKQoJewoJCSR0aGlzLT5kZWJ1ZygiaW4gc2VyaWFsaXplUlBDUGFyYW1ldGVyczogb3BlcmF0aW9uPSRvcGVyYXRpb24sIGRpcmVjdGlvbj0kZGlyZWN0aW9uLCBYTUxTY2hlbWFWZXJzaW9uPSR0aGlzLT5YTUxTY2hlbWFWZXJzaW9uIik7IAoJCSR0aGlzLT5hcHBlbmREZWJ1ZygncGFyYW1ldGVycz0nIC4gJHRoaXMtPnZhckR1bXAoJHBhcmFtZXRlcnMpKTsKCQkKCQlpZiAoJGRpcmVjdGlvbiAhPSAnaW5wdXQnICYmICRkaXJlY3Rpb24gIT0gJ291dHB1dCcpIHsKCQkJJHRoaXMtPmRlYnVnKCdUaGUgdmFsdWUgb2YgdGhlIFwkZGlyZWN0aW9uIGFyZ3VtZW50IG5lZWRzIHRvIGJlIGVpdGhlciAiaW5wdXQiIG9yICJvdXRwdXQiJyk7CgkJCSR0aGlzLT5zZXRFcnJvcignVGhlIHZhbHVlIG9mIHRoZSBcJGRpcmVjdGlvbiBhcmd1bWVudCBuZWVkcyB0byBiZSBlaXRoZXIgImlucHV0IiBvciAib3V0cHV0IicpOwoJCQlyZXR1cm4gZmFsc2U7CgkJfSAKCQlpZiAoISRvcERhdGEgPSAkdGhpcy0+Z2V0T3BlcmF0aW9uRGF0YSgkb3BlcmF0aW9uKSkgewoJCQkkdGhpcy0+ZGVidWcoJ1VuYWJsZSB0byByZXRyaWV2ZSBXU0RMIGRhdGEgZm9yIG9wZXJhdGlvbjogJyAuICRvcGVyYXRpb24pOwoJCQkkdGhpcy0+c2V0RXJyb3IoJ1VuYWJsZSB0byByZXRyaWV2ZSBXU0RMIGRhdGEgZm9yIG9wZXJhdGlvbjogJyAuICRvcGVyYXRpb24pOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCSR0aGlzLT5kZWJ1Zygnb3BEYXRhOicpOwoJCSR0aGlzLT5hcHBlbmREZWJ1ZygkdGhpcy0+dmFyRHVtcCgkb3BEYXRhKSk7CgoJCS8vIEdldCBlbmNvZGluZyBzdHlsZSBmb3Igb3V0cHV0IGFuZCBzZXQgdG8gY3VycmVudAoJCSRlbmNvZGluZ1N0eWxlID0gJ2h0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvJzsKCQlpZigoJGRpcmVjdGlvbiA9PSAnaW5wdXQnKSAmJiBpc3NldCgkb3BEYXRhWydvdXRwdXQnXVsnZW5jb2RpbmdTdHlsZSddKSAmJiAoJG9wRGF0YVsnb3V0cHV0J11bJ2VuY29kaW5nU3R5bGUnXSAhPSAkZW5jb2RpbmdTdHlsZSkpIHsKCQkJJGVuY29kaW5nU3R5bGUgPSAkb3BEYXRhWydvdXRwdXQnXVsnZW5jb2RpbmdTdHlsZSddOwoJCQkkZW5jX3N0eWxlID0gJGVuY29kaW5nU3R5bGU7CgkJfQoKCQkvLyBzZXQgaW5wdXQgcGFyYW1zCgkJJHhtbCA9ICcnOwoJCWlmIChpc3NldCgkb3BEYXRhWyRkaXJlY3Rpb25dWydwYXJ0cyddKSAmJiBzaXplb2YoJG9wRGF0YVskZGlyZWN0aW9uXVsncGFydHMnXSkgPiAwKSB7CgkJCQoJCQkkdXNlID0gJG9wRGF0YVskZGlyZWN0aW9uXVsndXNlJ107CgkJCSR0aGlzLT5kZWJ1ZygnaGF2ZSAnIC4gY291bnQoJG9wRGF0YVskZGlyZWN0aW9uXVsncGFydHMnXSkgLiAnIHBhcnQocykgdG8gc2VyaWFsaXplJyk7CgkJCWlmIChpc19hcnJheSgkcGFyYW1ldGVycykpIHsKCQkJCSRwYXJhbWV0ZXJzQXJyYXlUeXBlID0gJHRoaXMtPmlzQXJyYXlTaW1wbGVPclN0cnVjdCgkcGFyYW1ldGVycyk7CgkJCQkkdGhpcy0+ZGVidWcoJ2hhdmUgJyAuIGNvdW50KCRwYXJhbWV0ZXJzKSAuICcgcGFyYW1ldGVyKHMpIHByb3ZpZGVkIGFzICcgLiAkcGFyYW1ldGVyc0FycmF5VHlwZSAuICcgdG8gc2VyaWFsaXplJyk7CgkJCQlmb3JlYWNoKCRvcERhdGFbJGRpcmVjdGlvbl1bJ3BhcnRzJ10gYXMgJG5hbWUgPT4gJHR5cGUpIHsKCQkJCQkkdGhpcy0+ZGVidWcoJ3NlcmlhbGl6aW5nIHBhcnQgIicuJG5hbWUuJyIgb2YgdHlwZSAiJy4kdHlwZS4nIicpOwoJCQkJCS8vIFRyYWNrIGVuY29kaW5nIHN0eWxlCgkJCQkJaWYgKGlzc2V0KCRvcERhdGFbJGRpcmVjdGlvbl1bJ2VuY29kaW5nU3R5bGUnXSkgJiYgJGVuY29kaW5nU3R5bGUgIT0gJG9wRGF0YVskZGlyZWN0aW9uXVsnZW5jb2RpbmdTdHlsZSddKSB7CgkJCQkJCSRlbmNvZGluZ1N0eWxlID0gJG9wRGF0YVskZGlyZWN0aW9uXVsnZW5jb2RpbmdTdHlsZSddOwkJCQoJCQkJCQkkZW5jX3N0eWxlID0gJGVuY29kaW5nU3R5bGU7CgkJCQkJfSBlbHNlIHsKCQkJCQkJJGVuY19zdHlsZSA9IGZhbHNlOwoJCQkJCX0KCQkJCQkvLyBOT1RFOiBhZGQgZXJyb3IgaGFuZGxpbmcgaGVyZQoJCQkJCS8vIGlmIHNlcmlhbGl6ZVR5cGUgcmV0dXJucyBmYWxzZSwgdGhlbiBjYXRjaCBnbG9iYWwgZXJyb3IgYW5kIGZhdWx0CgkJCQkJaWYgKCRwYXJhbWV0ZXJzQXJyYXlUeXBlID09ICdhcnJheVNpbXBsZScpIHsKCQkJCQkJJHAgPSBhcnJheV9zaGlmdCgkcGFyYW1ldGVycyk7CgkJCQkJCSR0aGlzLT5kZWJ1ZygnY2FsbGluZyBzZXJpYWxpemVUeXBlIHcvaW5kZXhlZCBwYXJhbScpOwoJCQkJCQkkeG1sIC49ICR0aGlzLT5zZXJpYWxpemVUeXBlKCRuYW1lLCAkdHlwZSwgJHAsICR1c2UsICRlbmNfc3R5bGUpOwoJCQkJCX0gZWxzZWlmIChpc3NldCgkcGFyYW1ldGVyc1skbmFtZV0pKSB7CgkJCQkJCSR0aGlzLT5kZWJ1ZygnY2FsbGluZyBzZXJpYWxpemVUeXBlIHcvbmFtZWQgcGFyYW0nKTsKCQkJCQkJJHhtbCAuPSAkdGhpcy0+c2VyaWFsaXplVHlwZSgkbmFtZSwgJHR5cGUsICRwYXJhbWV0ZXJzWyRuYW1lXSwgJHVzZSwgJGVuY19zdHlsZSk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJLy8gVE9ETzogb25seSBzZW5kIG5pbGxhYmxlCgkJCQkJCSR0aGlzLT5kZWJ1ZygnY2FsbGluZyBzZXJpYWxpemVUeXBlIHcvbnVsbCBwYXJhbScpOwoJCQkJCQkkeG1sIC49ICR0aGlzLT5zZXJpYWxpemVUeXBlKCRuYW1lLCAkdHlwZSwgbnVsbCwgJHVzZSwgJGVuY19zdHlsZSk7CgkJCQkJfQoJCQkJfQoJCQl9IGVsc2UgewoJCQkJJHRoaXMtPmRlYnVnKCdubyBwYXJhbWV0ZXJzIHBhc3NlZC4nKTsKCQkJfQoJCX0KCQkkdGhpcy0+ZGVidWcoInNlcmlhbGl6ZVJQQ1BhcmFtZXRlcnMgcmV0dXJuaW5nOiAkeG1sIik7CgkJcmV0dXJuICR4bWw7Cgl9IAoJCgkvKioKCSAqIHNlcmlhbGl6ZSBhIFBIUCB2YWx1ZSBhY2NvcmRpbmcgdG8gYSBXU0RMIG1lc3NhZ2UgZGVmaW5pdGlvbgoJICogCgkgKiBUT0RPCgkgKiAtIG11bHRpLXJlZiBzZXJpYWxpemF0aW9uCgkgKiAtIHZhbGlkYXRlIFBIUCB2YWx1ZXMgYWdhaW5zdCB0eXBlIGRlZmluaXRpb25zLCByZXR1cm4gZXJyb3JzIGlmIGludmFsaWQKCSAqIAoJICogQHBhcmFtIHN0cmluZyAkIHR5cGUgbmFtZQoJICogQHBhcmFtIG1peGVkICQgcGFyYW0gdmFsdWUKCSAqIEByZXR1cm4gbWl4ZWQgbmV3IHBhcmFtIG9yIGZhbHNlIGlmIGluaXRpYWwgdmFsdWUgZGlkbid0IHZhbGlkYXRlCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQGRlcHJlY2F0ZWQKCSAqLwoJZnVuY3Rpb24gc2VyaWFsaXplUGFyYW1ldGVycygkb3BlcmF0aW9uLCAkZGlyZWN0aW9uLCAkcGFyYW1ldGVycykKCXsKCQkkdGhpcy0+ZGVidWcoImluIHNlcmlhbGl6ZVBhcmFtZXRlcnM6IG9wZXJhdGlvbj0kb3BlcmF0aW9uLCBkaXJlY3Rpb249JGRpcmVjdGlvbiwgWE1MU2NoZW1hVmVyc2lvbj0kdGhpcy0+WE1MU2NoZW1hVmVyc2lvbiIpOyAKCQkkdGhpcy0+YXBwZW5kRGVidWcoJ3BhcmFtZXRlcnM9JyAuICR0aGlzLT52YXJEdW1wKCRwYXJhbWV0ZXJzKSk7CgkJCgkJaWYgKCRkaXJlY3Rpb24gIT0gJ2lucHV0JyAmJiAkZGlyZWN0aW9uICE9ICdvdXRwdXQnKSB7CgkJCSR0aGlzLT5kZWJ1ZygnVGhlIHZhbHVlIG9mIHRoZSBcJGRpcmVjdGlvbiBhcmd1bWVudCBuZWVkcyB0byBiZSBlaXRoZXIgImlucHV0IiBvciAib3V0cHV0IicpOwoJCQkkdGhpcy0+c2V0RXJyb3IoJ1RoZSB2YWx1ZSBvZiB0aGUgXCRkaXJlY3Rpb24gYXJndW1lbnQgbmVlZHMgdG8gYmUgZWl0aGVyICJpbnB1dCIgb3IgIm91dHB1dCInKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0gCgkJaWYgKCEkb3BEYXRhID0gJHRoaXMtPmdldE9wZXJhdGlvbkRhdGEoJG9wZXJhdGlvbikpIHsKCQkJJHRoaXMtPmRlYnVnKCdVbmFibGUgdG8gcmV0cmlldmUgV1NETCBkYXRhIGZvciBvcGVyYXRpb246ICcgLiAkb3BlcmF0aW9uKTsKCQkJJHRoaXMtPnNldEVycm9yKCdVbmFibGUgdG8gcmV0cmlldmUgV1NETCBkYXRhIGZvciBvcGVyYXRpb246ICcgLiAkb3BlcmF0aW9uKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQkkdGhpcy0+ZGVidWcoJ29wRGF0YTonKTsKCQkkdGhpcy0+YXBwZW5kRGVidWcoJHRoaXMtPnZhckR1bXAoJG9wRGF0YSkpOwoJCQoJCS8vIEdldCBlbmNvZGluZyBzdHlsZSBmb3Igb3V0cHV0IGFuZCBzZXQgdG8gY3VycmVudAoJCSRlbmNvZGluZ1N0eWxlID0gJ2h0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvJzsKCQlpZigoJGRpcmVjdGlvbiA9PSAnaW5wdXQnKSAmJiBpc3NldCgkb3BEYXRhWydvdXRwdXQnXVsnZW5jb2RpbmdTdHlsZSddKSAmJiAoJG9wRGF0YVsnb3V0cHV0J11bJ2VuY29kaW5nU3R5bGUnXSAhPSAkZW5jb2RpbmdTdHlsZSkpIHsKCQkJJGVuY29kaW5nU3R5bGUgPSAkb3BEYXRhWydvdXRwdXQnXVsnZW5jb2RpbmdTdHlsZSddOwoJCQkkZW5jX3N0eWxlID0gJGVuY29kaW5nU3R5bGU7CgkJfQoJCQoJCS8vIHNldCBpbnB1dCBwYXJhbXMKCQkkeG1sID0gJyc7CgkJaWYgKGlzc2V0KCRvcERhdGFbJGRpcmVjdGlvbl1bJ3BhcnRzJ10pICYmIHNpemVvZigkb3BEYXRhWyRkaXJlY3Rpb25dWydwYXJ0cyddKSA+IDApIHsKCQkJCgkJCSR1c2UgPSAkb3BEYXRhWyRkaXJlY3Rpb25dWyd1c2UnXTsKCQkJJHRoaXMtPmRlYnVnKCJ1c2U9JHVzZSIpOwoJCQkkdGhpcy0+ZGVidWcoJ2dvdCAnIC4gY291bnQoJG9wRGF0YVskZGlyZWN0aW9uXVsncGFydHMnXSkgLiAnIHBhcnQocyknKTsKCQkJaWYgKGlzX2FycmF5KCRwYXJhbWV0ZXJzKSkgewoJCQkJJHBhcmFtZXRlcnNBcnJheVR5cGUgPSAkdGhpcy0+aXNBcnJheVNpbXBsZU9yU3RydWN0KCRwYXJhbWV0ZXJzKTsKCQkJCSR0aGlzLT5kZWJ1ZygnaGF2ZSAnIC4gJHBhcmFtZXRlcnNBcnJheVR5cGUgLiAnIHBhcmFtZXRlcnMnKTsKCQkJCWZvcmVhY2goJG9wRGF0YVskZGlyZWN0aW9uXVsncGFydHMnXSBhcyAkbmFtZSA9PiAkdHlwZSkgewoJCQkJCSR0aGlzLT5kZWJ1Zygnc2VyaWFsaXppbmcgcGFydCAiJy4kbmFtZS4nIiBvZiB0eXBlICInLiR0eXBlLiciJyk7CgkJCQkJLy8gVHJhY2sgZW5jb2Rpbmcgc3R5bGUKCQkJCQlpZihpc3NldCgkb3BEYXRhWyRkaXJlY3Rpb25dWydlbmNvZGluZ1N0eWxlJ10pICYmICRlbmNvZGluZ1N0eWxlICE9ICRvcERhdGFbJGRpcmVjdGlvbl1bJ2VuY29kaW5nU3R5bGUnXSkgewoJCQkJCQkkZW5jb2RpbmdTdHlsZSA9ICRvcERhdGFbJGRpcmVjdGlvbl1bJ2VuY29kaW5nU3R5bGUnXTsJCQkKCQkJCQkJJGVuY19zdHlsZSA9ICRlbmNvZGluZ1N0eWxlOwoJCQkJCX0gZWxzZSB7CgkJCQkJCSRlbmNfc3R5bGUgPSBmYWxzZTsKCQkJCQl9CgkJCQkJLy8gTk9URTogYWRkIGVycm9yIGhhbmRsaW5nIGhlcmUKCQkJCQkvLyBpZiBzZXJpYWxpemVUeXBlIHJldHVybnMgZmFsc2UsIHRoZW4gY2F0Y2ggZ2xvYmFsIGVycm9yIGFuZCBmYXVsdAoJCQkJCWlmICgkcGFyYW1ldGVyc0FycmF5VHlwZSA9PSAnYXJyYXlTaW1wbGUnKSB7CgkJCQkJCSRwID0gYXJyYXlfc2hpZnQoJHBhcmFtZXRlcnMpOwoJCQkJCQkkdGhpcy0+ZGVidWcoJ2NhbGxpbmcgc2VyaWFsaXplVHlwZSB3L2luZGV4ZWQgcGFyYW0nKTsKCQkJCQkJJHhtbCAuPSAkdGhpcy0+c2VyaWFsaXplVHlwZSgkbmFtZSwgJHR5cGUsICRwLCAkdXNlLCAkZW5jX3N0eWxlKTsKCQkJCQl9IGVsc2VpZiAoaXNzZXQoJHBhcmFtZXRlcnNbJG5hbWVdKSkgewoJCQkJCQkkdGhpcy0+ZGVidWcoJ2NhbGxpbmcgc2VyaWFsaXplVHlwZSB3L25hbWVkIHBhcmFtJyk7CgkJCQkJCSR4bWwgLj0gJHRoaXMtPnNlcmlhbGl6ZVR5cGUoJG5hbWUsICR0eXBlLCAkcGFyYW1ldGVyc1skbmFtZV0sICR1c2UsICRlbmNfc3R5bGUpOwoJCQkJCX0gZWxzZSB7CgkJCQkJCS8vIFRPRE86IG9ubHkgc2VuZCBuaWxsYWJsZQoJCQkJCQkkdGhpcy0+ZGVidWcoJ2NhbGxpbmcgc2VyaWFsaXplVHlwZSB3L251bGwgcGFyYW0nKTsKCQkJCQkJJHhtbCAuPSAkdGhpcy0+c2VyaWFsaXplVHlwZSgkbmFtZSwgJHR5cGUsIG51bGwsICR1c2UsICRlbmNfc3R5bGUpOwoJCQkJCX0KCQkJCX0KCQkJfSBlbHNlIHsKCQkJCSR0aGlzLT5kZWJ1Zygnbm8gcGFyYW1ldGVycyBwYXNzZWQuJyk7CgkJCX0KCQl9CgkJJHRoaXMtPmRlYnVnKCJzZXJpYWxpemVQYXJhbWV0ZXJzIHJldHVybmluZzogJHhtbCIpOwoJCXJldHVybiAkeG1sOwoJfSAKCQoJLyoqCgkgKiBzZXJpYWxpemVzIGEgUEhQIHZhbHVlIGFjY29yZGluZyBhIGdpdmVuIHR5cGUgZGVmaW5pdGlvbgoJICogCgkgKiBAcGFyYW0gc3RyaW5nICRuYW1lIG5hbWUgb2YgdmFsdWUgKHBhcnQgb3IgZWxlbWVudCkKCSAqIEBwYXJhbSBzdHJpbmcgJHR5cGUgWE1MIHNjaGVtYSB0eXBlIG9mIHZhbHVlICh0eXBlIG9yIGVsZW1lbnQpCgkgKiBAcGFyYW0gbWl4ZWQgJHZhbHVlIGEgbmF0aXZlIFBIUCB2YWx1ZSAocGFyYW1ldGVyIHZhbHVlKQoJICogQHBhcmFtIHN0cmluZyAkdXNlIHVzZSBmb3IgcGFydCAoZW5jb2RlZHxsaXRlcmFsKQoJICogQHBhcmFtIHN0cmluZyAkZW5jb2RpbmdTdHlsZSBTT0FQIGVuY29kaW5nIHN0eWxlIGZvciB0aGUgdmFsdWUgKGlmIGRpZmZlcmVudCB0aGFuIHRoZSBlbmNsb3Npbmcgc3R5bGUpCgkgKiBAcGFyYW0gYm9vbGVhbiAkdW5xdWFsaWZpZWQgYSBrbHVkZ2UgZm9yIHdoYXQgc2hvdWxkIGJlIFhNTCBuYW1lc3BhY2UgZm9ybSBoYW5kbGluZwoJICogQHJldHVybiBzdHJpbmcgdmFsdWUgc2VyaWFsaXplZCBhcyBhbiBYTUwgc3RyaW5nCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJZnVuY3Rpb24gc2VyaWFsaXplVHlwZSgkbmFtZSwgJHR5cGUsICR2YWx1ZSwgJHVzZT0nZW5jb2RlZCcsICRlbmNvZGluZ1N0eWxlPWZhbHNlLCAkdW5xdWFsaWZpZWQ9ZmFsc2UpCgl7CgkJJHRoaXMtPmRlYnVnKCJpbiBzZXJpYWxpemVUeXBlOiBuYW1lPSRuYW1lLCB0eXBlPSR0eXBlLCB1c2U9JHVzZSwgZW5jb2RpbmdTdHlsZT0kZW5jb2RpbmdTdHlsZSwgdW5xdWFsaWZpZWQ9IiAuICgkdW5xdWFsaWZpZWQgPyAidW5xdWFsaWZpZWQiIDogInF1YWxpZmllZCIpKTsKCQkkdGhpcy0+YXBwZW5kRGVidWcoInZhbHVlPSIgLiAkdGhpcy0+dmFyRHVtcCgkdmFsdWUpKTsKCQlpZigkdXNlID09ICdlbmNvZGVkJyAmJiAkZW5jb2RpbmdTdHlsZSkgewoJCQkkZW5jb2RpbmdTdHlsZSA9ICcgU09BUC1FTlY6ZW5jb2RpbmdTdHlsZT0iJyAuICRlbmNvZGluZ1N0eWxlIC4gJyInOwoJCX0KCgkJLy8gaWYgYSBzb2FwdmFsIGhhcyBiZWVuIHN1cHBsaWVkLCBsZXQgaXRzIHR5cGUgb3ZlcnJpZGUgdGhlIFdTREwKICAgIAlpZiAoaXNfb2JqZWN0KCR2YWx1ZSkgJiYgZ2V0X2NsYXNzKCR2YWx1ZSkgPT0gJ3NvYXB2YWwnKSB7CiAgICAJCWlmICgkdmFsdWUtPnR5cGVfbnMpIHsKICAgIAkJCSR0eXBlID0gJHZhbHVlLT50eXBlX25zIC4gJzonIC4gJHZhbHVlLT50eXBlOwoJCSAgICAJJGZvcmNlVHlwZSA9IHRydWU7CgkJICAgIAkkdGhpcy0+ZGVidWcoImluIHNlcmlhbGl6ZVR5cGU6IHNvYXB2YWwgb3ZlcnJpZGVzIHR5cGUgdG8gJHR5cGUiKTsKICAgIAkJfSBlbHNlaWYgKCR2YWx1ZS0+dHlwZSkgewoJICAgIAkJJHR5cGUgPSAkdmFsdWUtPnR5cGU7CgkJICAgIAkkZm9yY2VUeXBlID0gdHJ1ZTsKCQkgICAgCSR0aGlzLT5kZWJ1ZygiaW4gc2VyaWFsaXplVHlwZTogc29hcHZhbCBvdmVycmlkZXMgdHlwZSB0byAkdHlwZSIpOwoJICAgIAl9IGVsc2UgewoJICAgIAkJJGZvcmNlVHlwZSA9IGZhbHNlOwoJCSAgICAJJHRoaXMtPmRlYnVnKCJpbiBzZXJpYWxpemVUeXBlOiBzb2FwdmFsIGRvZXMgbm90IG92ZXJyaWRlIHR5cGUiKTsKCSAgICAJfQoJICAgIAkkYXR0cnMgPSAkdmFsdWUtPmF0dHJpYnV0ZXM7CgkgICAgCSR2YWx1ZSA9ICR2YWx1ZS0+dmFsdWU7CgkgICAgCSR0aGlzLT5kZWJ1ZygiaW4gc2VyaWFsaXplVHlwZTogc29hcHZhbCBvdmVycmlkZXMgdmFsdWUgdG8gJHZhbHVlIik7CgkgICAgCWlmICgkYXR0cnMpIHsKCSAgICAJCWlmICghaXNfYXJyYXkoJHZhbHVlKSkgewoJICAgIAkJCSR2YWx1ZVsnISddID0gJHZhbHVlOwoJICAgIAkJfQoJICAgIAkJZm9yZWFjaCAoJGF0dHJzIGFzICRuID0+ICR2KSB7CgkgICAgCQkJJHZhbHVlWychJyAuICRuXSA9ICR2OwoJICAgIAkJfQoJCSAgICAJJHRoaXMtPmRlYnVnKCJpbiBzZXJpYWxpemVUeXBlOiBzb2FwdmFsIHByb3ZpZGVzIGF0dHJpYnV0ZXMiKTsKCQkgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgCSRmb3JjZVR5cGUgPSBmYWxzZTsKICAgICAgICB9CgoJCSR4bWwgPSAnJzsKCQlpZiAoc3RycG9zKCR0eXBlLCAnOicpKSB7CgkJCSR1cVR5cGUgPSBzdWJzdHIoJHR5cGUsIHN0cnJwb3MoJHR5cGUsICc6JykgKyAxKTsKCQkJJG5zID0gc3Vic3RyKCR0eXBlLCAwLCBzdHJycG9zKCR0eXBlLCAnOicpKTsKCQkJJHRoaXMtPmRlYnVnKCJpbiBzZXJpYWxpemVUeXBlOiBnb3QgYSBwcmVmaXhlZCB0eXBlOiAkdXFUeXBlLCAkbnMiKTsKCQkJaWYgKCR0aGlzLT5nZXROYW1lc3BhY2VGcm9tUHJlZml4KCRucykpIHsKCQkJCSRucyA9ICR0aGlzLT5nZXROYW1lc3BhY2VGcm9tUHJlZml4KCRucyk7CgkJCQkkdGhpcy0+ZGVidWcoImluIHNlcmlhbGl6ZVR5cGU6IGV4cGFuZGVkIHByZWZpeGVkIHR5cGU6ICR1cVR5cGUsICRucyIpOwoJCQl9CgoJCQlpZigkbnMgPT0gJHRoaXMtPlhNTFNjaGVtYVZlcnNpb24gfHwgJG5zID09ICdodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLycpewoJCQkJJHRoaXMtPmRlYnVnKCdpbiBzZXJpYWxpemVUeXBlOiB0eXBlIG5hbWVzcGFjZSBpbmRpY2F0ZXMgWE1MIFNjaGVtYSBvciBTT0FQIEVuY29kaW5nIHR5cGUnKTsKCQkJCWlmICgkdW5xdWFsaWZpZWQgICYmICR1c2UgPT0gJ2xpdGVyYWwnKSB7CgkJCQkJJGVsZW1lbnROUyA9ICIgeG1sbnM9XCJcIiI7CgkJCQl9IGVsc2UgewoJCQkJCSRlbGVtZW50TlMgPSAnJzsKCQkJCX0KCQkJCWlmIChpc19udWxsKCR2YWx1ZSkpIHsKCQkJCQlpZiAoJHVzZSA9PSAnbGl0ZXJhbCcpIHsKCQkJCQkJLy8gVE9ETzogZGVwZW5kcyBvbiBtaW5PY2N1cnMKCQkJCQkJJHhtbCA9ICI8JG5hbWUkZWxlbWVudE5TLz4iOwoJCQkJCX0gZWxzZSB7CgkJCQkJCS8vIFRPRE86IGRlcGVuZHMgb24gbmlsbGFibGUsIHdoaWNoIHNob3VsZCBiZSBjaGVja2VkIGJlZm9yZSBjYWxsaW5nIHRoaXMgbWV0aG9kCgkJCQkJCSR4bWwgPSAiPCRuYW1lJGVsZW1lbnROUyB4c2k6bmlsPVwidHJ1ZVwiIHhzaTp0eXBlPVwiIiAuICR0aGlzLT5nZXRQcmVmaXhGcm9tTmFtZXNwYWNlKCRucykgLiAiOiR1cVR5cGVcIi8+IjsKCQkJCQl9CgkJCQkJJHRoaXMtPmRlYnVnKCJpbiBzZXJpYWxpemVUeXBlOiByZXR1cm5pbmc6ICR4bWwiKTsKCQkJCQlyZXR1cm4gJHhtbDsKCQkJCX0KCQkgICAgCWlmICgkdXFUeXBlID09ICdib29sZWFuJykgewoJCSAgICAJCWlmICgoaXNfc3RyaW5nKCR2YWx1ZSkgJiYgJHZhbHVlID09ICdmYWxzZScpIHx8ICghICR2YWx1ZSkpIHsKCQkJCQkJJHZhbHVlID0gJ2ZhbHNlJzsKCQkJCQl9IGVsc2UgewoJCQkJCQkkdmFsdWUgPSAndHJ1ZSc7CgkJCQkJfQoJCQkJfSAKCQkJCWlmICgkdXFUeXBlID09ICdzdHJpbmcnICYmIGdldHR5cGUoJHZhbHVlKSA9PSAnc3RyaW5nJykgewoJCQkJCSR2YWx1ZSA9ICR0aGlzLT5leHBhbmRFbnRpdGllcygkdmFsdWUpOwoJCQkJfQoJCQkJaWYgKCgkdXFUeXBlID09ICdsb25nJyB8fCAkdXFUeXBlID09ICd1bnNpZ25lZExvbmcnKSAmJiBnZXR0eXBlKCR2YWx1ZSkgPT0gJ2RvdWJsZScpIHsKCQkJCQkkdmFsdWUgPSBzcHJpbnRmKCIlLjBsZiIsICR2YWx1ZSk7CgkJCQl9CgkJCQkvLyBpdCdzIGEgc2NhbGFyCgkJCQkvLyBUT0RPOiB3aGF0IGFib3V0IG51bGwvbmlsIHZhbHVlcz8KCQkJCS8vIGNoZWNrIHR5cGUgaXNuJ3QgYSBjdXN0b20gdHlwZSBleHRlbmRpbmcgeG1sc2NoZW1hIG5hbWVzcGFjZQoJCQkJaWYgKCEkdGhpcy0+Z2V0VHlwZURlZigkdXFUeXBlLCAkbnMpKSB7CgkJCQkJaWYgKCR1c2UgPT0gJ2xpdGVyYWwnKSB7CgkJCQkJCWlmICgkZm9yY2VUeXBlKSB7CgkJCQkJCQkkeG1sID0gIjwkbmFtZSRlbGVtZW50TlMgeHNpOnR5cGU9XCIiIC4gJHRoaXMtPmdldFByZWZpeEZyb21OYW1lc3BhY2UoJG5zKSAuICI6JHVxVHlwZVwiPiR2YWx1ZTwvJG5hbWU+IjsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCSR4bWwgPSAiPCRuYW1lJGVsZW1lbnROUz4kdmFsdWU8LyRuYW1lPiI7CgkJCQkJCX0KCQkJCQl9IGVsc2UgewoJCQkJCQkkeG1sID0gIjwkbmFtZSRlbGVtZW50TlMgeHNpOnR5cGU9XCIiIC4gJHRoaXMtPmdldFByZWZpeEZyb21OYW1lc3BhY2UoJG5zKSAuICI6JHVxVHlwZVwiJGVuY29kaW5nU3R5bGU+JHZhbHVlPC8kbmFtZT4iOwoJCQkJCX0KCQkJCQkkdGhpcy0+ZGVidWcoImluIHNlcmlhbGl6ZVR5cGU6IHJldHVybmluZzogJHhtbCIpOwoJCQkJCXJldHVybiAkeG1sOwoJCQkJfQoJCQkJJHRoaXMtPmRlYnVnKCdjdXN0b20gdHlwZSBleHRlbmRzIFhNTCBTY2hlbWEgb3IgU09BUCBFbmNvZGluZyBuYW1lc3BhY2UgKHl1Y2spJyk7CgkJCX0gZWxzZSBpZiAoJG5zID09ICdodHRwOi8veG1sLmFwYWNoZS5vcmcveG1sLXNvYXAnKSB7CgkJCQkkdGhpcy0+ZGVidWcoJ2luIHNlcmlhbGl6ZVR5cGU6IGFwcGVhcnMgdG8gYmUgQXBhY2hlIFNPQVAgdHlwZScpOwoJCQkJaWYgKCR1cVR5cGUgPT0gJ01hcCcpIHsKCQkJCQkkdHRfcHJlZml4ID0gJHRoaXMtPmdldFByZWZpeEZyb21OYW1lc3BhY2UoJ2h0dHA6Ly94bWwuYXBhY2hlLm9yZy94bWwtc29hcCcpOwoJCQkJCWlmICghICR0dF9wcmVmaXgpIHsKCQkJCQkJJHRoaXMtPmRlYnVnKCdpbiBzZXJpYWxpemVUeXBlOiBBZGQgbmFtZXNwYWNlIGZvciBBcGFjaGUgU09BUCB0eXBlJyk7CgkJCQkJCSR0dF9wcmVmaXggPSAnbnMnIC4gcmFuZCgxMDAwLCA5OTk5KTsKCQkJCQkJJHRoaXMtPm5hbWVzcGFjZXNbJHR0X3ByZWZpeF0gPSAnaHR0cDovL3htbC5hcGFjaGUub3JnL3htbC1zb2FwJzsKCQkJCQkJLy8gZm9yY2UgdGhpcyB0byBiZSBhZGRlZCB0byB1c2VkTmFtZXNwYWNlcwoJCQkJCQkkdHRfcHJlZml4ID0gJHRoaXMtPmdldFByZWZpeEZyb21OYW1lc3BhY2UoJ2h0dHA6Ly94bWwuYXBhY2hlLm9yZy94bWwtc29hcCcpOwoJCQkJCX0KCQkJCQkkY29udGVudHMgPSAnJzsKCQkJCQlmb3JlYWNoKCR2YWx1ZSBhcyAkayA9PiAkdikgewoJCQkJCQkkdGhpcy0+ZGVidWcoInNlcmlhbGl6aW5nIG1hcCBlbGVtZW50OiBrZXkgJGssIHZhbHVlICR2Iik7CgkJCQkJCSRjb250ZW50cyAuPSAnPGl0ZW0+JzsKCQkJCQkJJGNvbnRlbnRzIC49ICR0aGlzLT5zZXJpYWxpemVfdmFsKCRrLCdrZXknLGZhbHNlLGZhbHNlLGZhbHNlLGZhbHNlLCR1c2UpOwoJCQkJCQkkY29udGVudHMgLj0gJHRoaXMtPnNlcmlhbGl6ZV92YWwoJHYsJ3ZhbHVlJyxmYWxzZSxmYWxzZSxmYWxzZSxmYWxzZSwkdXNlKTsKCQkJCQkJJGNvbnRlbnRzIC49ICc8L2l0ZW0+JzsKCQkJCQl9CgkJCQkJaWYgKCR1c2UgPT0gJ2xpdGVyYWwnKSB7CgkJCQkJCWlmICgkZm9yY2VUeXBlKSB7CgkJCQkJCQkkeG1sID0gIjwkbmFtZSB4c2k6dHlwZT1cIiIgLiAkdHRfcHJlZml4IC4gIjokdXFUeXBlXCI+JGNvbnRlbnRzPC8kbmFtZT4iOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJJHhtbCA9ICI8JG5hbWU+JGNvbnRlbnRzPC8kbmFtZT4iOwoJCQkJCQl9CgkJCQkJfSBlbHNlIHsKCQkJCQkJJHhtbCA9ICI8JG5hbWUgeHNpOnR5cGU9XCIiIC4gJHR0X3ByZWZpeCAuICI6JHVxVHlwZVwiJGVuY29kaW5nU3R5bGU+JGNvbnRlbnRzPC8kbmFtZT4iOwoJCQkJCX0KCQkJCQkkdGhpcy0+ZGVidWcoImluIHNlcmlhbGl6ZVR5cGU6IHJldHVybmluZzogJHhtbCIpOwoJCQkJCXJldHVybiAkeG1sOwoJCQkJfQoJCQkJJHRoaXMtPmRlYnVnKCdpbiBzZXJpYWxpemVUeXBlOiBBcGFjaGUgU09BUCB0eXBlLCBidXQgb25seSBzdXBwb3J0IE1hcCcpOwoJCQl9CgkJfSBlbHNlIHsKCQkJLy8gVE9ETzogc2hvdWxkIHRoZSB0eXBlIGJlIGNvbXBhcmVkIHRvIHR5cGVzIGluIFhTRCwgYW5kIHRoZSBuYW1lc3BhY2UKCQkJLy8gc2V0IHRvIFhTRCBpZiB0aGUgdHlwZSBtYXRjaGVzPwoJCQkkdGhpcy0+ZGVidWcoImluIHNlcmlhbGl6ZVR5cGU6IE5vIG5hbWVzcGFjZSBmb3IgdHlwZSAkdHlwZSIpOwoJCQkkbnMgPSAnJzsKCQkJJHVxVHlwZSA9ICR0eXBlOwoJCX0KCQlpZighJHR5cGVEZWYgPSAkdGhpcy0+Z2V0VHlwZURlZigkdXFUeXBlLCAkbnMpKXsKCQkJJHRoaXMtPnNldEVycm9yKCIkdHlwZSAoJHVxVHlwZSkgaXMgbm90IGEgc3VwcG9ydGVkIHR5cGUuIik7CgkJCSR0aGlzLT5kZWJ1ZygiaW4gc2VyaWFsaXplVHlwZTogJHR5cGUgKCR1cVR5cGUpIGlzIG5vdCBhIHN1cHBvcnRlZCB0eXBlLiIpOwoJCQlyZXR1cm4gZmFsc2U7CgkJfSBlbHNlIHsKCQkJJHRoaXMtPmRlYnVnKCJpbiBzZXJpYWxpemVUeXBlOiBmb3VuZCB0eXBlRGVmIik7CgkJCSR0aGlzLT5hcHBlbmREZWJ1ZygndHlwZURlZj0nIC4gJHRoaXMtPnZhckR1bXAoJHR5cGVEZWYpKTsKCQl9CgkJJHBocFR5cGUgPSAkdHlwZURlZlsncGhwVHlwZSddOwoJCSR0aGlzLT5kZWJ1ZygiaW4gc2VyaWFsaXplVHlwZTogdXFUeXBlOiAkdXFUeXBlLCBuczogJG5zLCBwaHB0eXBlOiAkcGhwVHlwZSwgYXJyYXlUeXBlOiAiIC4gKGlzc2V0KCR0eXBlRGVmWydhcnJheVR5cGUnXSkgPyAkdHlwZURlZlsnYXJyYXlUeXBlJ10gOiAnJykgKTsgCgkJLy8gaWYgcGhwIHR5cGUgPT0gc3RydWN0LCBtYXAgdmFsdWUgdG8gdGhlIDxhbGw+IGVsZW1lbnQgbmFtZXMKCQlpZiAoJHBocFR5cGUgPT0gJ3N0cnVjdCcpIHsKCQkJaWYgKGlzc2V0KCR0eXBlRGVmWyd0eXBlQ2xhc3MnXSkgJiYgJHR5cGVEZWZbJ3R5cGVDbGFzcyddID09ICdlbGVtZW50JykgewoJCQkJJGVsZW1lbnROYW1lID0gJHVxVHlwZTsKCQkJCWlmIChpc3NldCgkdHlwZURlZlsnZm9ybSddKSAmJiAoJHR5cGVEZWZbJ2Zvcm0nXSA9PSAncXVhbGlmaWVkJykpIHsKCQkJCQkkZWxlbWVudE5TID0gIiB4bWxucz1cIiRuc1wiIjsKCQkJCX0gZWxzZSB7CgkJCQkJJGVsZW1lbnROUyA9ICIgeG1sbnM9XCJcIiI7CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQkkZWxlbWVudE5hbWUgPSAkbmFtZTsKCQkJCWlmICgkdW5xdWFsaWZpZWQpIHsKCQkJCQkkZWxlbWVudE5TID0gIiB4bWxucz1cIlwiIjsKCQkJCX0gZWxzZSB7CgkJCQkJJGVsZW1lbnROUyA9ICcnOwoJCQkJfQoJCQl9CgkJCWlmIChpc19udWxsKCR2YWx1ZSkpIHsKCQkJCWlmICgkdXNlID09ICdsaXRlcmFsJykgewoJCQkJCS8vIFRPRE86IGRlcGVuZHMgb24gbWluT2NjdXJzCgkJCQkJJHhtbCA9ICI8JGVsZW1lbnROYW1lJGVsZW1lbnROUy8+IjsKCQkJCX0gZWxzZSB7CgkJCQkJJHhtbCA9ICI8JGVsZW1lbnROYW1lJGVsZW1lbnROUyB4c2k6bmlsPVwidHJ1ZVwiIHhzaTp0eXBlPVwiIiAuICR0aGlzLT5nZXRQcmVmaXhGcm9tTmFtZXNwYWNlKCRucykgLiAiOiR1cVR5cGVcIi8+IjsKCQkJCX0KCQkJCSR0aGlzLT5kZWJ1ZygiaW4gc2VyaWFsaXplVHlwZTogcmV0dXJuaW5nOiAkeG1sIik7CgkJCQlyZXR1cm4gJHhtbDsKCQkJfQoJCQlpZiAoaXNfb2JqZWN0KCR2YWx1ZSkpIHsKCQkJCSR2YWx1ZSA9IGdldF9vYmplY3RfdmFycygkdmFsdWUpOwoJCQl9CgkJCWlmIChpc19hcnJheSgkdmFsdWUpKSB7CgkJCQkkZWxlbWVudEF0dHJzID0gJHRoaXMtPnNlcmlhbGl6ZUNvbXBsZXhUeXBlQXR0cmlidXRlcygkdHlwZURlZiwgJHZhbHVlLCAkbnMsICR1cVR5cGUpOwoJCQkJaWYgKCR1c2UgPT0gJ2xpdGVyYWwnKSB7CgkJCQkJaWYgKCRmb3JjZVR5cGUpIHsKCQkJCQkJJHhtbCA9ICI8JGVsZW1lbnROYW1lJGVsZW1lbnROUyRlbGVtZW50QXR0cnMgeHNpOnR5cGU9XCIiIC4gJHRoaXMtPmdldFByZWZpeEZyb21OYW1lc3BhY2UoJG5zKSAuICI6JHVxVHlwZVwiPiI7CgkJCQkJfSBlbHNlIHsKCQkJCQkJJHhtbCA9ICI8JGVsZW1lbnROYW1lJGVsZW1lbnROUyRlbGVtZW50QXR0cnM+IjsKCQkJCQl9CgkJCQl9IGVsc2UgewoJCQkJCSR4bWwgPSAiPCRlbGVtZW50TmFtZSRlbGVtZW50TlMkZWxlbWVudEF0dHJzIHhzaTp0eXBlPVwiIiAuICR0aGlzLT5nZXRQcmVmaXhGcm9tTmFtZXNwYWNlKCRucykgLiAiOiR1cVR5cGVcIiRlbmNvZGluZ1N0eWxlPiI7CgkJCQl9CgkKCQkJCSR4bWwgLj0gJHRoaXMtPnNlcmlhbGl6ZUNvbXBsZXhUeXBlRWxlbWVudHMoJHR5cGVEZWYsICR2YWx1ZSwgJG5zLCAkdXFUeXBlLCAkdXNlLCAkZW5jb2RpbmdTdHlsZSk7CgkJCQkkeG1sIC49ICI8LyRlbGVtZW50TmFtZT4iOwoJCQl9IGVsc2UgewoJCQkJJHRoaXMtPmRlYnVnKCJpbiBzZXJpYWxpemVUeXBlOiBwaHBUeXBlIGlzIHN0cnVjdCwgYnV0IHZhbHVlIGlzIG5vdCBhbiBhcnJheSIpOwoJCQkJJHRoaXMtPnNldEVycm9yKCJwaHBUeXBlIGlzIHN0cnVjdCwgYnV0IHZhbHVlIGlzIG5vdCBhbiBhcnJheTogc2VlIGRlYnVnIG91dHB1dCBmb3IgZGV0YWlscyIpOwoJCQkJJHhtbCA9ICcnOwoJCQl9CgkJfSBlbHNlaWYgKCRwaHBUeXBlID09ICdhcnJheScpIHsKCQkJaWYgKGlzc2V0KCR0eXBlRGVmWydmb3JtJ10pICYmICgkdHlwZURlZlsnZm9ybSddID09ICdxdWFsaWZpZWQnKSkgewoJCQkJJGVsZW1lbnROUyA9ICIgeG1sbnM9XCIkbnNcIiI7CgkJCX0gZWxzZSB7CgkJCQlpZiAoJHVucXVhbGlmaWVkKSB7CgkJCQkJJGVsZW1lbnROUyA9ICIgeG1sbnM9XCJcIiI7CgkJCQl9IGVsc2UgewoJCQkJCSRlbGVtZW50TlMgPSAnJzsKCQkJCX0KCQkJfQoJCQlpZiAoaXNfbnVsbCgkdmFsdWUpKSB7CgkJCQlpZiAoJHVzZSA9PSAnbGl0ZXJhbCcpIHsKCQkJCQkvLyBUT0RPOiBkZXBlbmRzIG9uIG1pbk9jY3VycwoJCQkJCSR4bWwgPSAiPCRuYW1lJGVsZW1lbnROUy8+IjsKCQkJCX0gZWxzZSB7CgkJCQkJJHhtbCA9ICI8JG5hbWUkZWxlbWVudE5TIHhzaTpuaWw9XCJ0cnVlXCIgeHNpOnR5cGU9XCIiIC4KCQkJCQkJJHRoaXMtPmdldFByZWZpeEZyb21OYW1lc3BhY2UoJ2h0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvJykgLgoJCQkJCQkiOkFycmF5XCIgIiAuCgkJCQkJCSR0aGlzLT5nZXRQcmVmaXhGcm9tTmFtZXNwYWNlKCdodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLycpIC4KCQkJCQkJJzphcnJheVR5cGU9IicgLgoJCQkJCQkkdGhpcy0+Z2V0UHJlZml4RnJvbU5hbWVzcGFjZSgkdGhpcy0+Z2V0UHJlZml4KCR0eXBlRGVmWydhcnJheVR5cGUnXSkpIC4KCQkJCQkJJzonIC4KCQkJCQkJJHRoaXMtPmdldExvY2FsUGFydCgkdHlwZURlZlsnYXJyYXlUeXBlJ10pLiJbMF1cIi8+IjsKCQkJCX0KCQkJCSR0aGlzLT5kZWJ1ZygiaW4gc2VyaWFsaXplVHlwZTogcmV0dXJuaW5nOiAkeG1sIik7CgkJCQlyZXR1cm4gJHhtbDsKCQkJfQoJCQlpZiAoaXNzZXQoJHR5cGVEZWZbJ211bHRpZGltZW5zaW9uYWwnXSkpIHsKCQkJCSRudiA9IGFycmF5KCk7CgkJCQlmb3JlYWNoKCR2YWx1ZSBhcyAkdikgewoJCQkJCSRjb2xzID0gJywnIC4gc2l6ZW9mKCR2KTsKCQkJCQkkbnYgPSBhcnJheV9tZXJnZSgkbnYsICR2KTsKCQkJCX0gCgkJCQkkdmFsdWUgPSAkbnY7CgkJCX0gZWxzZSB7CgkJCQkkY29scyA9ICcnOwoJCQl9IAoJCQlpZiAoaXNfYXJyYXkoJHZhbHVlKSAmJiBzaXplb2YoJHZhbHVlKSA+PSAxKSB7CgkJCQkkcm93cyA9IHNpemVvZigkdmFsdWUpOwoJCQkJJGNvbnRlbnRzID0gJyc7CgkJCQlmb3JlYWNoKCR2YWx1ZSBhcyAkayA9PiAkdikgewoJCQkJCSR0aGlzLT5kZWJ1Zygic2VyaWFsaXppbmcgYXJyYXkgZWxlbWVudDogJGssICR2IG9mIHR5cGU6ICR0eXBlRGVmW2FycmF5VHlwZV0iKTsKCQkJCQkvL2lmIChzdHJwb3MoJHR5cGVEZWZbJ2FycmF5VHlwZSddLCAnOicpICkgewoJCQkJCWlmICghaW5fYXJyYXkoJHR5cGVEZWZbJ2FycmF5VHlwZSddLCR0aGlzLT50eXBlbWFwWydodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSddKSkgewoJCQkJCSAgICAkY29udGVudHMgLj0gJHRoaXMtPnNlcmlhbGl6ZVR5cGUoJ2l0ZW0nLCAkdHlwZURlZlsnYXJyYXlUeXBlJ10sICR2LCAkdXNlKTsKCQkJCQl9IGVsc2UgewoJCQkJCSAgICAkY29udGVudHMgLj0gJHRoaXMtPnNlcmlhbGl6ZV92YWwoJHYsICdpdGVtJywgJHR5cGVEZWZbJ2FycmF5VHlwZSddLCBudWxsLCAkdGhpcy0+WE1MU2NoZW1hVmVyc2lvbiwgZmFsc2UsICR1c2UpOwoJCQkJCX0gCgkJCQl9CgkJCX0gZWxzZSB7CgkJCQkkcm93cyA9IDA7CgkJCQkkY29udGVudHMgPSBudWxsOwoJCQl9CgkJCS8vIFRPRE86IGZvciBub3csIGFuIGVtcHR5IHZhbHVlIHdpbGwgYmUgc2VyaWFsaXplZCBhcyBhIHplcm8gZWxlbWVudAoJCQkvLyBhcnJheS4gIFJldmlzaXQgdGhpcyB3aGVuIGNvZGluZyB0aGUgaGFuZGxpbmcgb2YgbnVsbC9uaWwgdmFsdWVzLgoJCQlpZiAoJHVzZSA9PSAnbGl0ZXJhbCcpIHsKCQkJCSR4bWwgPSAiPCRuYW1lJGVsZW1lbnROUz4iCgkJCQkJLiRjb250ZW50cwoJCQkJCS4iPC8kbmFtZT4iOwoJCQl9IGVsc2UgewoJCQkJJHhtbCA9ICI8JG5hbWUkZWxlbWVudE5TIHhzaTp0eXBlPVwiIi4kdGhpcy0+Z2V0UHJlZml4RnJvbU5hbWVzcGFjZSgnaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8nKS4nOkFycmF5IiAnLgoJCQkJCSR0aGlzLT5nZXRQcmVmaXhGcm9tTmFtZXNwYWNlKCdodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLycpCgkJCQkJLic6YXJyYXlUeXBlPSInCgkJCQkJLiR0aGlzLT5nZXRQcmVmaXhGcm9tTmFtZXNwYWNlKCR0aGlzLT5nZXRQcmVmaXgoJHR5cGVEZWZbJ2FycmF5VHlwZSddKSkKCQkJCQkuIjoiLiR0aGlzLT5nZXRMb2NhbFBhcnQoJHR5cGVEZWZbJ2FycmF5VHlwZSddKS4iWyRyb3dzJGNvbHNdXCI+IgoJCQkJCS4kY29udGVudHMKCQkJCQkuIjwvJG5hbWU+IjsKCQkJfQoJCX0gZWxzZWlmICgkcGhwVHlwZSA9PSAnc2NhbGFyJykgewoJCQlpZiAoaXNzZXQoJHR5cGVEZWZbJ2Zvcm0nXSkgJiYgKCR0eXBlRGVmWydmb3JtJ10gPT0gJ3F1YWxpZmllZCcpKSB7CgkJCQkkZWxlbWVudE5TID0gIiB4bWxucz1cIiRuc1wiIjsKCQkJfSBlbHNlIHsKCQkJCWlmICgkdW5xdWFsaWZpZWQpIHsKCQkJCQkkZWxlbWVudE5TID0gIiB4bWxucz1cIlwiIjsKCQkJCX0gZWxzZSB7CgkJCQkJJGVsZW1lbnROUyA9ICcnOwoJCQkJfQoJCQl9CgkJCWlmICgkdXNlID09ICdsaXRlcmFsJykgewoJCQkJaWYgKCRmb3JjZVR5cGUpIHsKCQkJCQkkeG1sID0gIjwkbmFtZSRlbGVtZW50TlMgeHNpOnR5cGU9XCIiIC4gJHRoaXMtPmdldFByZWZpeEZyb21OYW1lc3BhY2UoJG5zKSAuICI6JHVxVHlwZVwiPiR2YWx1ZTwvJG5hbWU+IjsKCQkJCX0gZWxzZSB7CgkJCQkJJHhtbCA9ICI8JG5hbWUkZWxlbWVudE5TPiR2YWx1ZTwvJG5hbWU+IjsKCQkJCX0KCQkJfSBlbHNlIHsKCQkJCSR4bWwgPSAiPCRuYW1lJGVsZW1lbnROUyB4c2k6dHlwZT1cIiIgLiAkdGhpcy0+Z2V0UHJlZml4RnJvbU5hbWVzcGFjZSgkbnMpIC4gIjokdXFUeXBlXCIkZW5jb2RpbmdTdHlsZT4kdmFsdWU8LyRuYW1lPiI7CgkJCX0KCQl9CgkJJHRoaXMtPmRlYnVnKCJpbiBzZXJpYWxpemVUeXBlOiByZXR1cm5pbmc6ICR4bWwiKTsKCQlyZXR1cm4gJHhtbDsKCX0KCQoJLyoqCgkgKiBzZXJpYWxpemVzIHRoZSBhdHRyaWJ1dGVzIGZvciBhIGNvbXBsZXhUeXBlCgkgKgoJICogQHBhcmFtIGFycmF5ICR0eXBlRGVmIG91ciBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiBhbiBYTUwgc2NoZW1hIHR5cGUgKG9yIGVsZW1lbnQpCgkgKiBAcGFyYW0gbWl4ZWQgJHZhbHVlIGEgbmF0aXZlIFBIUCB2YWx1ZSAocGFyYW1ldGVyIHZhbHVlKQoJICogQHBhcmFtIHN0cmluZyAkbnMgdGhlIG5hbWVzcGFjZSBvZiB0aGUgdHlwZQoJICogQHBhcmFtIHN0cmluZyAkdXFUeXBlIHRoZSBsb2NhbCBwYXJ0IG9mIHRoZSB0eXBlCgkgKiBAcmV0dXJuIHN0cmluZyB2YWx1ZSBzZXJpYWxpemVkIGFzIGFuIFhNTCBzdHJpbmcKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCglmdW5jdGlvbiBzZXJpYWxpemVDb21wbGV4VHlwZUF0dHJpYnV0ZXMoJHR5cGVEZWYsICR2YWx1ZSwgJG5zLCAkdXFUeXBlKSB7CgkJJHhtbCA9ICcnOwoJCWlmIChpc3NldCgkdHlwZURlZlsnYXR0cnMnXSkgJiYgaXNfYXJyYXkoJHR5cGVEZWZbJ2F0dHJzJ10pKSB7CgkJCSR0aGlzLT5kZWJ1Zygic2VyaWFsaXplIGF0dHJpYnV0ZXMgZm9yIFhNTCBTY2hlbWEgdHlwZSAkbnM6JHVxVHlwZSIpOwoJCQlpZiAoaXNfYXJyYXkoJHZhbHVlKSkgewoJCQkJJHh2YWx1ZSA9ICR2YWx1ZTsKCQkJfSBlbHNlaWYgKGlzX29iamVjdCgkdmFsdWUpKSB7CgkJCQkkeHZhbHVlID0gZ2V0X29iamVjdF92YXJzKCR2YWx1ZSk7CgkJCX0gZWxzZSB7CgkJCQkkdGhpcy0+ZGVidWcoInZhbHVlIGlzIG5laXRoZXIgYW4gYXJyYXkgbm9yIGFuIG9iamVjdCBmb3IgWE1MIFNjaGVtYSB0eXBlICRuczokdXFUeXBlIik7CgkJCQkkeHZhbHVlID0gYXJyYXkoKTsKCQkJfQoJCQlmb3JlYWNoICgkdHlwZURlZlsnYXR0cnMnXSBhcyAkYU5hbWUgPT4gJGF0dHJzKSB7CgkJCQlpZiAoaXNzZXQoJHh2YWx1ZVsnIScgLiAkYU5hbWVdKSkgewoJCQkJCSR4bmFtZSA9ICchJyAuICRhTmFtZTsKCQkJCQkkdGhpcy0+ZGVidWcoInZhbHVlIHByb3ZpZGVkIGZvciBhdHRyaWJ1dGUgJGFOYW1lIHdpdGgga2V5ICR4bmFtZSIpOwoJCQkJfSBlbHNlaWYgKGlzc2V0KCR4dmFsdWVbJGFOYW1lXSkpIHsKCQkJCQkkeG5hbWUgPSAkYU5hbWU7CgkJCQkJJHRoaXMtPmRlYnVnKCJ2YWx1ZSBwcm92aWRlZCBmb3IgYXR0cmlidXRlICRhTmFtZSB3aXRoIGtleSAkeG5hbWUiKTsKCQkJCX0gZWxzZWlmIChpc3NldCgkYXR0cnNbJ2RlZmF1bHQnXSkpIHsKCQkJCQkkeG5hbWUgPSAnIScgLiAkYU5hbWU7CgkJCQkJJHh2YWx1ZVskeG5hbWVdID0gJGF0dHJzWydkZWZhdWx0J107CgkJCQkJJHRoaXMtPmRlYnVnKCd1c2UgZGVmYXVsdCB2YWx1ZSBvZiAnIC4gJHh2YWx1ZVskYU5hbWVdIC4gJyBmb3IgYXR0cmlidXRlICcgLiAkYU5hbWUpOwoJCQkJfSBlbHNlIHsKCQkJCQkkeG5hbWUgPSAnJzsKCQkJCQkkdGhpcy0+ZGVidWcoIm5vIHZhbHVlIHByb3ZpZGVkIGZvciBhdHRyaWJ1dGUgJGFOYW1lIik7CgkJCQl9CgkJCQlpZiAoJHhuYW1lKSB7CgkJCQkJJHhtbCAuPSAgIiAkYU5hbWU9XCIiIC4gJHRoaXMtPmV4cGFuZEVudGl0aWVzKCR4dmFsdWVbJHhuYW1lXSkgLiAiXCIiOwoJCQkJfQoJCQl9IAoJCX0gZWxzZSB7CgkJCSR0aGlzLT5kZWJ1Zygibm8gYXR0cmlidXRlcyB0byBzZXJpYWxpemUgZm9yIFhNTCBTY2hlbWEgdHlwZSAkbnM6JHVxVHlwZSIpOwoJCX0KCQlpZiAoaXNzZXQoJHR5cGVEZWZbJ2V4dGVuc2lvbkJhc2UnXSkpIHsKCQkJJG5zID0gJHRoaXMtPmdldFByZWZpeCgkdHlwZURlZlsnZXh0ZW5zaW9uQmFzZSddKTsKCQkJJHVxVHlwZSA9ICR0aGlzLT5nZXRMb2NhbFBhcnQoJHR5cGVEZWZbJ2V4dGVuc2lvbkJhc2UnXSk7CgkJCWlmICgkdGhpcy0+Z2V0TmFtZXNwYWNlRnJvbVByZWZpeCgkbnMpKSB7CgkJCQkkbnMgPSAkdGhpcy0+Z2V0TmFtZXNwYWNlRnJvbVByZWZpeCgkbnMpOwoJCQl9CgkJCWlmICgkdHlwZURlZiA9ICR0aGlzLT5nZXRUeXBlRGVmKCR1cVR5cGUsICRucykpIHsKCQkJCSR0aGlzLT5kZWJ1Zygic2VyaWFsaXplIGF0dHJpYnV0ZXMgZm9yIGV4dGVuc2lvbiBiYXNlICRuczokdXFUeXBlIik7CgkJCQkkeG1sIC49ICR0aGlzLT5zZXJpYWxpemVDb21wbGV4VHlwZUF0dHJpYnV0ZXMoJHR5cGVEZWYsICR2YWx1ZSwgJG5zLCAkdXFUeXBlKTsKCQkJfSBlbHNlIHsKCQkJCSR0aGlzLT5kZWJ1ZygiZXh0ZW5zaW9uIGJhc2UgJG5zOiR1cVR5cGUgaXMgbm90IGEgc3VwcG9ydGVkIHR5cGUiKTsKCQkJfQoJCX0KCQlyZXR1cm4gJHhtbDsKCX0KCgkvKioKCSAqIHNlcmlhbGl6ZXMgdGhlIGVsZW1lbnRzIGZvciBhIGNvbXBsZXhUeXBlCgkgKgoJICogQHBhcmFtIGFycmF5ICR0eXBlRGVmIG91ciBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiBhbiBYTUwgc2NoZW1hIHR5cGUgKG9yIGVsZW1lbnQpCgkgKiBAcGFyYW0gbWl4ZWQgJHZhbHVlIGEgbmF0aXZlIFBIUCB2YWx1ZSAocGFyYW1ldGVyIHZhbHVlKQoJICogQHBhcmFtIHN0cmluZyAkbnMgdGhlIG5hbWVzcGFjZSBvZiB0aGUgdHlwZQoJICogQHBhcmFtIHN0cmluZyAkdXFUeXBlIHRoZSBsb2NhbCBwYXJ0IG9mIHRoZSB0eXBlCgkgKiBAcGFyYW0gc3RyaW5nICR1c2UgdXNlIGZvciBwYXJ0IChlbmNvZGVkfGxpdGVyYWwpCgkgKiBAcGFyYW0gc3RyaW5nICRlbmNvZGluZ1N0eWxlIFNPQVAgZW5jb2Rpbmcgc3R5bGUgZm9yIHRoZSB2YWx1ZSAoaWYgZGlmZmVyZW50IHRoYW4gdGhlIGVuY2xvc2luZyBzdHlsZSkKCSAqIEByZXR1cm4gc3RyaW5nIHZhbHVlIHNlcmlhbGl6ZWQgYXMgYW4gWE1MIHN0cmluZwoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCWZ1bmN0aW9uIHNlcmlhbGl6ZUNvbXBsZXhUeXBlRWxlbWVudHMoJHR5cGVEZWYsICR2YWx1ZSwgJG5zLCAkdXFUeXBlLCAkdXNlPSdlbmNvZGVkJywgJGVuY29kaW5nU3R5bGU9ZmFsc2UpIHsKCQkkeG1sID0gJyc7CgkJaWYgKGlzc2V0KCR0eXBlRGVmWydlbGVtZW50cyddKSAmJiBpc19hcnJheSgkdHlwZURlZlsnZWxlbWVudHMnXSkpIHsKCQkJJHRoaXMtPmRlYnVnKCJpbiBzZXJpYWxpemVDb21wbGV4VHlwZUVsZW1lbnRzLCBzZXJpYWxpemUgZWxlbWVudHMgZm9yIFhNTCBTY2hlbWEgdHlwZSAkbnM6JHVxVHlwZSIpOwoJCQlpZiAoaXNfYXJyYXkoJHZhbHVlKSkgewoJCQkJJHh2YWx1ZSA9ICR2YWx1ZTsKCQkJfSBlbHNlaWYgKGlzX29iamVjdCgkdmFsdWUpKSB7CgkJCQkkeHZhbHVlID0gZ2V0X29iamVjdF92YXJzKCR2YWx1ZSk7CgkJCX0gZWxzZSB7CgkJCQkkdGhpcy0+ZGVidWcoInZhbHVlIGlzIG5laXRoZXIgYW4gYXJyYXkgbm9yIGFuIG9iamVjdCBmb3IgWE1MIFNjaGVtYSB0eXBlICRuczokdXFUeXBlIik7CgkJCQkkeHZhbHVlID0gYXJyYXkoKTsKCQkJfQoJCQkvLyB0b2dnbGUgd2hldGhlciBhbGwgZWxlbWVudHMgYXJlIHByZXNlbnQgLSBpZGVhbGx5IHNob3VsZCB2YWxpZGF0ZSBhZ2FpbnN0IHNjaGVtYQoJCQlpZiAoY291bnQoJHR5cGVEZWZbJ2VsZW1lbnRzJ10pICE9IGNvdW50KCR4dmFsdWUpKXsKCQkJCSRvcHRpb25hbHMgPSB0cnVlOwoJCQl9CgkJCWZvcmVhY2ggKCR0eXBlRGVmWydlbGVtZW50cyddIGFzICRlTmFtZSA9PiAkYXR0cnMpIHsKCQkJCWlmICghaXNzZXQoJHh2YWx1ZVskZU5hbWVdKSkgewoJCQkJCWlmIChpc3NldCgkYXR0cnNbJ2RlZmF1bHQnXSkpIHsKCQkJCQkJJHh2YWx1ZVskZU5hbWVdID0gJGF0dHJzWydkZWZhdWx0J107CgkJCQkJCSR0aGlzLT5kZWJ1ZygndXNlIGRlZmF1bHQgdmFsdWUgb2YgJyAuICR4dmFsdWVbJGVOYW1lXSAuICcgZm9yIGVsZW1lbnQgJyAuICRlTmFtZSk7CgkJCQkJfQoJCQkJfQoJCQkJLy8gaWYgdXNlciB0b29rIGFkdmFudGFnZSBvZiBhIG1pbk9jY3Vycz0wLCB0aGVuIG9ubHkgc2VyaWFsaXplIG5hbWVkIHBhcmFtZXRlcnMKCQkJCWlmIChpc3NldCgkb3B0aW9uYWxzKQoJCQkJICAgICYmICghaXNzZXQoJHh2YWx1ZVskZU5hbWVdKSkgCgkJCQkJJiYgKCAoIWlzc2V0KCRhdHRyc1snbmlsbGFibGUnXSkpIHx8ICRhdHRyc1snbmlsbGFibGUnXSAhPSAndHJ1ZScpCgkJCQkJKXsKCQkJCQlpZiAoaXNzZXQoJGF0dHJzWydtaW5PY2N1cnMnXSkgJiYgJGF0dHJzWydtaW5PY2N1cnMnXSA8PiAnMCcpIHsKCQkJCQkJJHRoaXMtPmRlYnVnKCJhcHBhcmVudCBlcnJvcjogbm8gdmFsdWUgcHJvdmlkZWQgZm9yIGVsZW1lbnQgJGVOYW1lIHdpdGggbWluT2NjdXJzPSIgLiAkYXR0cnNbJ21pbk9jY3VycyddKTsKCQkJCQl9CgkJCQkJLy8gZG8gbm90aGluZwoJCQkJCSR0aGlzLT5kZWJ1Zygibm8gdmFsdWUgcHJvdmlkZWQgZm9yIGNvbXBsZXhUeXBlIGVsZW1lbnQgJGVOYW1lIGFuZCBlbGVtZW50IGlzIG5vdCBuaWxsYWJsZSwgc28gc2VyaWFsaXplIG5vdGhpbmciKTsKCQkJCX0gZWxzZSB7CgkJCQkJLy8gZ2V0IHZhbHVlCgkJCQkJaWYgKGlzc2V0KCR4dmFsdWVbJGVOYW1lXSkpIHsKCQkJCQkgICAgJHYgPSAkeHZhbHVlWyRlTmFtZV07CgkJCQkJfSBlbHNlIHsKCQkJCQkgICAgJHYgPSBudWxsOwoJCQkJCX0KCQkJCQlpZiAoaXNzZXQoJGF0dHJzWydmb3JtJ10pKSB7CgkJCQkJCSR1bnF1YWxpZmllZCA9ICgkYXR0cnNbJ2Zvcm0nXSA9PSAndW5xdWFsaWZpZWQnKTsKCQkJCQl9IGVsc2UgewoJCQkJCQkkdW5xdWFsaWZpZWQgPSBmYWxzZTsKCQkJCQl9CgkJCQkJaWYgKGlzc2V0KCRhdHRyc1snbWF4T2NjdXJzJ10pICYmICgkYXR0cnNbJ21heE9jY3VycyddID09ICd1bmJvdW5kZWQnIHx8ICRhdHRyc1snbWF4T2NjdXJzJ10gPiAxKSAmJiBpc3NldCgkdikgJiYgaXNfYXJyYXkoJHYpICYmICR0aGlzLT5pc0FycmF5U2ltcGxlT3JTdHJ1Y3QoJHYpID09ICdhcnJheVNpbXBsZScpIHsKCQkJCQkJJHZ2ID0gJHY7CgkJCQkJCWZvcmVhY2ggKCR2diBhcyAkayA9PiAkdikgewoJCQkJCQkJaWYgKGlzc2V0KCRhdHRyc1sndHlwZSddKSB8fCBpc3NldCgkYXR0cnNbJ3JlZiddKSkgewoJCQkJCQkJCS8vIHNlcmlhbGl6ZSBzY2hlbWEtZGVmaW5lZCB0eXBlCgkJCQkJCQkgICAgJHhtbCAuPSAkdGhpcy0+c2VyaWFsaXplVHlwZSgkZU5hbWUsIGlzc2V0KCRhdHRyc1sndHlwZSddKSA/ICRhdHRyc1sndHlwZSddIDogJGF0dHJzWydyZWYnXSwgJHYsICR1c2UsICRlbmNvZGluZ1N0eWxlLCAkdW5xdWFsaWZpZWQpOwoJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQkvLyBzZXJpYWxpemUgZ2VuZXJpYyB0eXBlIChjYW4gdGhpcyBldmVyIHJlYWxseSBoYXBwZW4/KQoJCQkJCQkJICAgICR0aGlzLT5kZWJ1ZygiY2FsbGluZyBzZXJpYWxpemVfdmFsKCkgZm9yICR2LCAkZU5hbWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAkdXNlIik7CgkJCQkJCQkgICAgJHhtbCAuPSAkdGhpcy0+c2VyaWFsaXplX3ZhbCgkdiwgJGVOYW1lLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgJHVzZSk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9IGVsc2UgewoJCQkJCQlpZiAoaXNzZXQoJGF0dHJzWyd0eXBlJ10pIHx8IGlzc2V0KCRhdHRyc1sncmVmJ10pKSB7CgkJCQkJCQkvLyBzZXJpYWxpemUgc2NoZW1hLWRlZmluZWQgdHlwZQoJCQkJCQkgICAgJHhtbCAuPSAkdGhpcy0+c2VyaWFsaXplVHlwZSgkZU5hbWUsIGlzc2V0KCRhdHRyc1sndHlwZSddKSA/ICRhdHRyc1sndHlwZSddIDogJGF0dHJzWydyZWYnXSwgJHYsICR1c2UsICRlbmNvZGluZ1N0eWxlLCAkdW5xdWFsaWZpZWQpOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJLy8gc2VyaWFsaXplIGdlbmVyaWMgdHlwZSAoY2FuIHRoaXMgZXZlciByZWFsbHkgaGFwcGVuPykKCQkJCQkJICAgICR0aGlzLT5kZWJ1ZygiY2FsbGluZyBzZXJpYWxpemVfdmFsKCkgZm9yICR2LCAkZU5hbWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAkdXNlIik7CgkJCQkJCSAgICAkeG1sIC49ICR0aGlzLT5zZXJpYWxpemVfdmFsKCR2LCAkZU5hbWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAkdXNlKTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfSAKCQl9IGVsc2UgewoJCQkkdGhpcy0+ZGVidWcoIm5vIGVsZW1lbnRzIHRvIHNlcmlhbGl6ZSBmb3IgWE1MIFNjaGVtYSB0eXBlICRuczokdXFUeXBlIik7CgkJfQoJCWlmIChpc3NldCgkdHlwZURlZlsnZXh0ZW5zaW9uQmFzZSddKSkgewoJCQkkbnMgPSAkdGhpcy0+Z2V0UHJlZml4KCR0eXBlRGVmWydleHRlbnNpb25CYXNlJ10pOwoJCQkkdXFUeXBlID0gJHRoaXMtPmdldExvY2FsUGFydCgkdHlwZURlZlsnZXh0ZW5zaW9uQmFzZSddKTsKCQkJaWYgKCR0aGlzLT5nZXROYW1lc3BhY2VGcm9tUHJlZml4KCRucykpIHsKCQkJCSRucyA9ICR0aGlzLT5nZXROYW1lc3BhY2VGcm9tUHJlZml4KCRucyk7CgkJCX0KCQkJaWYgKCR0eXBlRGVmID0gJHRoaXMtPmdldFR5cGVEZWYoJHVxVHlwZSwgJG5zKSkgewoJCQkJJHRoaXMtPmRlYnVnKCJzZXJpYWxpemUgZWxlbWVudHMgZm9yIGV4dGVuc2lvbiBiYXNlICRuczokdXFUeXBlIik7CgkJCQkkeG1sIC49ICR0aGlzLT5zZXJpYWxpemVDb21wbGV4VHlwZUVsZW1lbnRzKCR0eXBlRGVmLCAkdmFsdWUsICRucywgJHVxVHlwZSwgJHVzZSwgJGVuY29kaW5nU3R5bGUpOwoJCQl9IGVsc2UgewoJCQkJJHRoaXMtPmRlYnVnKCJleHRlbnNpb24gYmFzZSAkbnM6JHVxVHlwZSBpcyBub3QgYSBzdXBwb3J0ZWQgdHlwZSIpOwoJCQl9CgkJfQoJCXJldHVybiAkeG1sOwoJfQoKCS8qKgoJKiBhZGRzIGFuIFhNTCBTY2hlbWEgY29tcGxleCB0eXBlIHRvIHRoZSBXU0RMIHR5cGVzCgkqCgkqIEBwYXJhbSBzdHJpbmcJbmFtZQoJKiBAcGFyYW0gc3RyaW5nIHR5cGVDbGFzcyAoY29tcGxleFR5cGV8c2ltcGxlVHlwZXxhdHRyaWJ1dGUpCgkqIEBwYXJhbSBzdHJpbmcgcGhwVHlwZTogY3VycmVudGx5IHN1cHBvcnRlZCBhcmUgYXJyYXkgYW5kIHN0cnVjdCAocGhwIGFzc29jIGFycmF5KQoJKiBAcGFyYW0gc3RyaW5nIGNvbXBvc2l0b3IgKGFsbHxzZXF1ZW5jZXxjaG9pY2UpCgkqIEBwYXJhbSBzdHJpbmcgcmVzdHJpY3Rpb25CYXNlIG5hbWVzcGFjZTpuYW1lIChodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLzpBcnJheSkKCSogQHBhcmFtIGFycmF5IGVsZW1lbnRzID0gYXJyYXkgKCBuYW1lID0+IGFycmF5KG5hbWU9PicnLHR5cGU9PicnKSApCgkqIEBwYXJhbSBhcnJheSBhdHRycyA9IAlhcnJheShhcnJheSgncmVmJz0+J1NPQVAtRU5DOmFycmF5VHlwZScsJ3dzZGw6YXJyYXlUeXBlJz0+J3hzZDpzdHJpbmdbXScpKQoJKiBAcGFyYW0gc3RyaW5nIGFycmF5VHlwZTogbmFtZXNwYWNlOm5hbWUgKHhzZDpzdHJpbmcpCgkqIEBzZWUgeG1sc2NoZW1hCgkqIEBhY2Nlc3MgcHVibGljCgkqLwoJZnVuY3Rpb24gYWRkQ29tcGxleFR5cGUoJG5hbWUsJHR5cGVDbGFzcz0nY29tcGxleFR5cGUnLCRwaHBUeXBlPSdhcnJheScsJGNvbXBvc2l0b3I9JycsJHJlc3RyaWN0aW9uQmFzZT0nJywkZWxlbWVudHM9YXJyYXkoKSwkYXR0cnM9YXJyYXkoKSwkYXJyYXlUeXBlPScnKSB7CgkJaWYgKGNvdW50KCRlbGVtZW50cykgPiAwKSB7CgkgICAgCWZvcmVhY2goJGVsZW1lbnRzIGFzICRuID0+ICRlKXsKCSAgICAgICAgICAgIC8vIGV4cGFuZCBlYWNoIGVsZW1lbnQKCSAgICAgICAgICAgIGZvcmVhY2ggKCRlIGFzICRrID0+ICR2KSB7CgkJICAgICAgICAgICAgJGsgPSBzdHJwb3MoJGssJzonKSA/ICR0aGlzLT5leHBhbmRRbmFtZSgkaykgOiAkazsKCQkgICAgICAgICAgICAkdiA9IHN0cnBvcygkdiwnOicpID8gJHRoaXMtPmV4cGFuZFFuYW1lKCR2KSA6ICR2OwoJCSAgICAgICAgICAgICRlZVska10gPSAkdjsKCQkgICAgCX0KCSAgICAJCSRlRWxlbWVudHNbJG5dID0gJGVlOwoJICAgIAl9CgkgICAgCSRlbGVtZW50cyA9ICRlRWxlbWVudHM7CgkJfQoJCQoJCWlmIChjb3VudCgkYXR0cnMpID4gMCkgewoJICAgIAlmb3JlYWNoKCRhdHRycyBhcyAkbiA9PiAkYSl7CgkgICAgICAgICAgICAvLyBleHBhbmQgZWFjaCBhdHRyaWJ1dGUKCSAgICAgICAgICAgIGZvcmVhY2ggKCRhIGFzICRrID0+ICR2KSB7CgkJICAgICAgICAgICAgJGsgPSBzdHJwb3MoJGssJzonKSA/ICR0aGlzLT5leHBhbmRRbmFtZSgkaykgOiAkazsKCQkgICAgICAgICAgICAkdiA9IHN0cnBvcygkdiwnOicpID8gJHRoaXMtPmV4cGFuZFFuYW1lKCR2KSA6ICR2OwoJCSAgICAgICAgICAgICRhYVska10gPSAkdjsKCQkgICAgCX0KCSAgICAJCSRlQXR0cnNbJG5dID0gJGFhOwoJICAgIAl9CgkgICAgCSRhdHRycyA9ICRlQXR0cnM7CgkJfQoKCQkkcmVzdHJpY3Rpb25CYXNlID0gc3RycG9zKCRyZXN0cmljdGlvbkJhc2UsJzonKSA/ICR0aGlzLT5leHBhbmRRbmFtZSgkcmVzdHJpY3Rpb25CYXNlKSA6ICRyZXN0cmljdGlvbkJhc2U7CgkJJGFycmF5VHlwZSA9IHN0cnBvcygkYXJyYXlUeXBlLCc6JykgPyAkdGhpcy0+ZXhwYW5kUW5hbWUoJGFycmF5VHlwZSkgOiAkYXJyYXlUeXBlOwoKCQkkdHlwZW5zID0gaXNzZXQoJHRoaXMtPm5hbWVzcGFjZXNbJ3R5cGVzJ10pID8gJHRoaXMtPm5hbWVzcGFjZXNbJ3R5cGVzJ10gOiAkdGhpcy0+bmFtZXNwYWNlc1sndG5zJ107CgkJJHRoaXMtPnNjaGVtYXNbJHR5cGVuc11bMF0tPmFkZENvbXBsZXhUeXBlKCRuYW1lLCR0eXBlQ2xhc3MsJHBocFR5cGUsJGNvbXBvc2l0b3IsJHJlc3RyaWN0aW9uQmFzZSwkZWxlbWVudHMsJGF0dHJzLCRhcnJheVR5cGUpOwoJfQoKCS8qKgoJKiBhZGRzIGFuIFhNTCBTY2hlbWEgc2ltcGxlIHR5cGUgdG8gdGhlIFdTREwgdHlwZXMKCSoKCSogQHBhcmFtIHN0cmluZyAkbmFtZQoJKiBAcGFyYW0gc3RyaW5nICRyZXN0cmljdGlvbkJhc2UgbmFtZXNwYWNlOm5hbWUgKGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvOkFycmF5KQoJKiBAcGFyYW0gc3RyaW5nICR0eXBlQ2xhc3MgKHNob3VsZCBhbHdheXMgYmUgc2ltcGxlVHlwZSkKCSogQHBhcmFtIHN0cmluZyAkcGhwVHlwZSAoc2hvdWxkIGFsd2F5cyBiZSBzY2FsYXIpCgkqIEBwYXJhbSBhcnJheSAkZW51bWVyYXRpb24gYXJyYXkgb2YgdmFsdWVzCgkqIEBzZWUgeG1sc2NoZW1hCgkqIEBhY2Nlc3MgcHVibGljCgkqLwoJZnVuY3Rpb24gYWRkU2ltcGxlVHlwZSgkbmFtZSwgJHJlc3RyaWN0aW9uQmFzZT0nJywgJHR5cGVDbGFzcz0nc2ltcGxlVHlwZScsICRwaHBUeXBlPSdzY2FsYXInLCAkZW51bWVyYXRpb249YXJyYXkoKSkgewoJCSRyZXN0cmljdGlvbkJhc2UgPSBzdHJwb3MoJHJlc3RyaWN0aW9uQmFzZSwnOicpID8gJHRoaXMtPmV4cGFuZFFuYW1lKCRyZXN0cmljdGlvbkJhc2UpIDogJHJlc3RyaWN0aW9uQmFzZTsKCgkJJHR5cGVucyA9IGlzc2V0KCR0aGlzLT5uYW1lc3BhY2VzWyd0eXBlcyddKSA/ICR0aGlzLT5uYW1lc3BhY2VzWyd0eXBlcyddIDogJHRoaXMtPm5hbWVzcGFjZXNbJ3RucyddOwoJCSR0aGlzLT5zY2hlbWFzWyR0eXBlbnNdWzBdLT5hZGRTaW1wbGVUeXBlKCRuYW1lLCAkcmVzdHJpY3Rpb25CYXNlLCAkdHlwZUNsYXNzLCAkcGhwVHlwZSwgJGVudW1lcmF0aW9uKTsKCX0KCgkvKioKCSogYWRkcyBhbiBlbGVtZW50IHRvIHRoZSBXU0RMIHR5cGVzCgkqCgkqIEBwYXJhbSBhcnJheSAkYXR0cnMgYXR0cmlidXRlcyB0aGF0IG11c3QgaW5jbHVkZSBuYW1lIGFuZCB0eXBlCgkqIEBzZWUgeG1sc2NoZW1hCgkqIEBhY2Nlc3MgcHVibGljCgkqLwoJZnVuY3Rpb24gYWRkRWxlbWVudCgkYXR0cnMpIHsKCQkkdHlwZW5zID0gaXNzZXQoJHRoaXMtPm5hbWVzcGFjZXNbJ3R5cGVzJ10pID8gJHRoaXMtPm5hbWVzcGFjZXNbJ3R5cGVzJ10gOiAkdGhpcy0+bmFtZXNwYWNlc1sndG5zJ107CgkJJHRoaXMtPnNjaGVtYXNbJHR5cGVuc11bMF0tPmFkZEVsZW1lbnQoJGF0dHJzKTsKCX0KCgkvKioKCSogcmVnaXN0ZXIgYW4gb3BlcmF0aW9uIHdpdGggdGhlIHNlcnZlcgoJKiAKCSogQHBhcmFtIHN0cmluZyAkbmFtZSBvcGVyYXRpb24gKG1ldGhvZCkgbmFtZQoJKiBAcGFyYW0gYXJyYXkgJGluIGFzc29jIGFycmF5IG9mIGlucHV0IHZhbHVlczoga2V5ID0gcGFyYW0gbmFtZSwgdmFsdWUgPSBwYXJhbSB0eXBlCgkqIEBwYXJhbSBhcnJheSAkb3V0IGFzc29jIGFycmF5IG9mIG91dHB1dCB2YWx1ZXM6IGtleSA9IHBhcmFtIG5hbWUsIHZhbHVlID0gcGFyYW0gdHlwZQoJKiBAcGFyYW0gc3RyaW5nICRuYW1lc3BhY2Ugb3B0aW9uYWwgVGhlIG5hbWVzcGFjZSBmb3IgdGhlIG9wZXJhdGlvbgoJKiBAcGFyYW0gc3RyaW5nICRzb2FwYWN0aW9uIG9wdGlvbmFsIFRoZSBzb2FwYWN0aW9uIGZvciB0aGUgb3BlcmF0aW9uCgkqIEBwYXJhbSBzdHJpbmcgJHN0eWxlIChycGN8ZG9jdW1lbnQpIG9wdGlvbmFsIFRoZSBzdHlsZSBmb3IgdGhlIG9wZXJhdGlvbiBOb3RlOiB3aGVuICdkb2N1bWVudCcgaXMgc3BlY2lmaWVkLCBwYXJhbWV0ZXIgYW5kIHJldHVybiB3cmFwcGVycyBhcmUgY3JlYXRlZCBmb3IgeW91IGF1dG9tYXRpY2FsbHkKCSogQHBhcmFtIHN0cmluZyAkdXNlIChlbmNvZGVkfGxpdGVyYWwpIG9wdGlvbmFsIFRoZSB1c2UgZm9yIHRoZSBwYXJhbWV0ZXJzIChjYW5ub3QgbWl4IHJpZ2h0IG5vdykKCSogQHBhcmFtIHN0cmluZyAkZG9jdW1lbnRhdGlvbiBvcHRpb25hbCBUaGUgZGVzY3JpcHRpb24gdG8gaW5jbHVkZSBpbiB0aGUgV1NETAoJKiBAcGFyYW0gc3RyaW5nICRlbmNvZGluZ1N0eWxlIG9wdGlvbmFsICh1c3VhbGx5ICdodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLycgZm9yIGVuY29kZWQpCgkqIEBhY2Nlc3MgcHVibGljIAoJKi8KCWZ1bmN0aW9uIGFkZE9wZXJhdGlvbigkbmFtZSwgJGluID0gZmFsc2UsICRvdXQgPSBmYWxzZSwgJG5hbWVzcGFjZSA9IGZhbHNlLCAkc29hcGFjdGlvbiA9IGZhbHNlLCAkc3R5bGUgPSAncnBjJywgJHVzZSA9ICdlbmNvZGVkJywgJGRvY3VtZW50YXRpb24gPSAnJywgJGVuY29kaW5nU3R5bGUgPSAnJyl7CgkJaWYgKCR1c2UgPT0gJ2VuY29kZWQnICYmICRlbmNvZGluZ1N0eWxlID09ICcnKSB7CgkJCSRlbmNvZGluZ1N0eWxlID0gJ2h0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvJzsKCQl9CgoJCWlmICgkc3R5bGUgPT0gJ2RvY3VtZW50JykgewoJCQkkZWxlbWVudHMgPSBhcnJheSgpOwoJCQlmb3JlYWNoICgkaW4gYXMgJG4gPT4gJHQpIHsKCQkJCSRlbGVtZW50c1skbl0gPSBhcnJheSgnbmFtZScgPT4gJG4sICd0eXBlJyA9PiAkdCk7CgkJCX0KCQkJJHRoaXMtPmFkZENvbXBsZXhUeXBlKCRuYW1lIC4gJ1JlcXVlc3RUeXBlJywgJ2NvbXBsZXhUeXBlJywgJ3N0cnVjdCcsICdhbGwnLCAnJywgJGVsZW1lbnRzKTsKCQkJJHRoaXMtPmFkZEVsZW1lbnQoYXJyYXkoJ25hbWUnID0+ICRuYW1lLCAndHlwZScgPT4gJG5hbWUgLiAnUmVxdWVzdFR5cGUnKSk7CgkJCSRpbiA9IGFycmF5KCdwYXJhbWV0ZXJzJyA9PiAndG5zOicgLiAkbmFtZSk7CgoJCQkkZWxlbWVudHMgPSBhcnJheSgpOwoJCQlmb3JlYWNoICgkb3V0IGFzICRuID0+ICR0KSB7CgkJCQkkZWxlbWVudHNbJG5dID0gYXJyYXkoJ25hbWUnID0+ICRuLCAndHlwZScgPT4gJHQpOwoJCQl9CgkJCSR0aGlzLT5hZGRDb21wbGV4VHlwZSgkbmFtZSAuICdSZXNwb25zZVR5cGUnLCAnY29tcGxleFR5cGUnLCAnc3RydWN0JywgJ2FsbCcsICcnLCAkZWxlbWVudHMpOwoJCQkkdGhpcy0+YWRkRWxlbWVudChhcnJheSgnbmFtZScgPT4gJG5hbWUgLiAnUmVzcG9uc2UnLCAndHlwZScgPT4gJG5hbWUgLiAnUmVzcG9uc2VUeXBlJykpOwoJCQkkb3V0ID0gYXJyYXkoJ3BhcmFtZXRlcnMnID0+ICd0bnM6JyAuICRuYW1lIC4gJ1Jlc3BvbnNlJyk7CgkJfQoKCQkvLyBnZXQgYmluZGluZwoJCSR0aGlzLT5iaW5kaW5nc1sgJHRoaXMtPnNlcnZpY2VOYW1lIC4gJ0JpbmRpbmcnIF1bJ29wZXJhdGlvbnMnXVskbmFtZV0gPQoJCWFycmF5KAoJCSduYW1lJyA9PiAkbmFtZSwKCQknYmluZGluZycgPT4gJHRoaXMtPnNlcnZpY2VOYW1lIC4gJ0JpbmRpbmcnLAoJCSdlbmRwb2ludCcgPT4gJHRoaXMtPmVuZHBvaW50LAoJCSdzb2FwQWN0aW9uJyA9PiAkc29hcGFjdGlvbiwKCQknc3R5bGUnID0+ICRzdHlsZSwKCQknaW5wdXQnID0+IGFycmF5KAoJCQkndXNlJyA9PiAkdXNlLAoJCQknbmFtZXNwYWNlJyA9PiAkbmFtZXNwYWNlLAoJCQknZW5jb2RpbmdTdHlsZScgPT4gJGVuY29kaW5nU3R5bGUsCgkJCSdtZXNzYWdlJyA9PiAkbmFtZSAuICdSZXF1ZXN0JywKCQkJJ3BhcnRzJyA9PiAkaW4pLAoJCSdvdXRwdXQnID0+IGFycmF5KAoJCQkndXNlJyA9PiAkdXNlLAoJCQknbmFtZXNwYWNlJyA9PiAkbmFtZXNwYWNlLAoJCQknZW5jb2RpbmdTdHlsZScgPT4gJGVuY29kaW5nU3R5bGUsCgkJCSdtZXNzYWdlJyA9PiAkbmFtZSAuICdSZXNwb25zZScsCgkJCSdwYXJ0cycgPT4gJG91dCksCgkJJ25hbWVzcGFjZScgPT4gJG5hbWVzcGFjZSwKCQkndHJhbnNwb3J0JyA9PiAnaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwJywKCQknZG9jdW1lbnRhdGlvbicgPT4gJGRvY3VtZW50YXRpb24pOyAKCQkvLyBhZGQgcG9ydFR5cGVzCgkJLy8gYWRkIG1lc3NhZ2VzCgkJaWYoJGluKQoJCXsKCQkJZm9yZWFjaCgkaW4gYXMgJHBOYW1lID0+ICRwVHlwZSkKCQkJewoJCQkJaWYoc3RycG9zKCRwVHlwZSwnOicpKSB7CgkJCQkJJHBUeXBlID0gJHRoaXMtPmdldE5hbWVzcGFjZUZyb21QcmVmaXgoJHRoaXMtPmdldFByZWZpeCgkcFR5cGUpKS4iOiIuJHRoaXMtPmdldExvY2FsUGFydCgkcFR5cGUpOwoJCQkJfQoJCQkJJHRoaXMtPm1lc3NhZ2VzWyRuYW1lLidSZXF1ZXN0J11bJHBOYW1lXSA9ICRwVHlwZTsKCQkJfQoJCX0gZWxzZSB7CiAgICAgICAgICAgICR0aGlzLT5tZXNzYWdlc1skbmFtZS4nUmVxdWVzdCddPSAnMCc7CiAgICAgICAgfQoJCWlmKCRvdXQpCgkJewoJCQlmb3JlYWNoKCRvdXQgYXMgJHBOYW1lID0+ICRwVHlwZSkKCQkJewoJCQkJaWYoc3RycG9zKCRwVHlwZSwnOicpKSB7CgkJCQkJJHBUeXBlID0gJHRoaXMtPmdldE5hbWVzcGFjZUZyb21QcmVmaXgoJHRoaXMtPmdldFByZWZpeCgkcFR5cGUpKS4iOiIuJHRoaXMtPmdldExvY2FsUGFydCgkcFR5cGUpOwoJCQkJfQoJCQkJJHRoaXMtPm1lc3NhZ2VzWyRuYW1lLidSZXNwb25zZSddWyRwTmFtZV0gPSAkcFR5cGU7CgkJCX0KCQl9IGVsc2UgewogICAgICAgICAgICAkdGhpcy0+bWVzc2FnZXNbJG5hbWUuJ1Jlc3BvbnNlJ109ICcwJzsKICAgICAgICB9CgkJcmV0dXJuIHRydWU7Cgl9IAp9Cgo/Pg==]]></data>
  </file>
  <file>
    <filename>classes/class.wsdlcache.php</filename>
    <isdir>0</isdir>
    <data><![CDATA[PD9waHAKCgoKLyoqCiogY2FjaGVzIGluc3RhbmNlcyBvZiB0aGUgd3NkbCBjbGFzcwoqIAoqIEBhdXRob3IgICBTY290dCBOaWNob2wgPHNuaWNob2xAY29tcHV0ZXIub3JnPgoqIEBhdXRob3IJSW5nbyBGaXNjaGVyIDxpbmdvQGFwb2xsb24uZGU+CiogQHZlcnNpb24gICRJZDogY2xhc3Mud3NkbGNhY2hlLnBocCx2IDEuNSAyMDA1LzA1LzIwIDE3OjU4OjE3IHNuaWNob2wgRXhwICQKKiBAYWNjZXNzIHB1YmxpYyAKKi8KY2xhc3Mgd3NkbGNhY2hlIHsKCS8qKgoJICoJQHZhciByZXNvdXJjZQoJICoJQGFjY2VzcyBwcml2YXRlCgkgKi8KCXZhciAkZnBsb2NrOwoJLyoqCgkgKglAdmFyIGludGVnZXIKCSAqCUBhY2Nlc3MgcHJpdmF0ZQoJICovCgl2YXIgJGNhY2hlX2xpZmV0aW1lOwoJLyoqCgkgKglAdmFyIHN0cmluZwoJICoJQGFjY2VzcyBwcml2YXRlCgkgKi8KCXZhciAkY2FjaGVfZGlyOwoJLyoqCgkgKglAdmFyIHN0cmluZwoJICoJQGFjY2VzcyBwdWJsaWMKCSAqLwoJdmFyICRkZWJ1Z19zdHIgPSAnJzsKCgkvKioKCSogY29uc3RydWN0b3IKCSoKCSogQHBhcmFtIHN0cmluZyAkY2FjaGVfZGlyIGRpcmVjdG9yeSBmb3IgY2FjaGUtZmlsZXMKCSogQHBhcmFtIGludGVnZXIgJGNhY2hlX2xpZmV0aW1lIGxpZmV0aW1lIGZvciBjYWNoaW5nLWZpbGVzIGluIHNlY29uZHMgb3IgMCBmb3IgdW5saW1pdGVkCgkqIEBhY2Nlc3MgcHVibGljCgkqLwoJZnVuY3Rpb24gd3NkbGNhY2hlKCRjYWNoZV9kaXI9Jy4nLCAkY2FjaGVfbGlmZXRpbWU9MCkgewoJCSR0aGlzLT5mcGxvY2sgPSBhcnJheSgpOwoJCSR0aGlzLT5jYWNoZV9kaXIgPSAkY2FjaGVfZGlyICE9ICcnID8gJGNhY2hlX2RpciA6ICcuJzsKCQkkdGhpcy0+Y2FjaGVfbGlmZXRpbWUgPSAkY2FjaGVfbGlmZXRpbWU7Cgl9CgoJLyoqCgkqIGNyZWF0ZXMgdGhlIGZpbGVuYW1lIHVzZWQgdG8gY2FjaGUgYSB3c2RsIGluc3RhbmNlCgkqCgkqIEBwYXJhbSBzdHJpbmcgJHdzZGwgVGhlIFVSTCBvZiB0aGUgd3NkbCBpbnN0YW5jZQoJKiBAcmV0dXJuIHN0cmluZyBUaGUgZmlsZW5hbWUgdXNlZCB0byBjYWNoZSB0aGUgaW5zdGFuY2UKCSogQGFjY2VzcyBwcml2YXRlCgkqLwoJZnVuY3Rpb24gY3JlYXRlRmlsZW5hbWUoJHdzZGwpIHsKCQlyZXR1cm4gJHRoaXMtPmNhY2hlX2Rpci4nL3dzZGxjYWNoZS0nIC4gbWQ1KCR3c2RsKTsKCX0KCgkvKioKCSogYWRkcyBkZWJ1ZyBkYXRhIHRvIHRoZSBjbGFzcyBsZXZlbCBkZWJ1ZyBzdHJpbmcKCSoKCSogQHBhcmFtICAgIHN0cmluZyAkc3RyaW5nIGRlYnVnIGRhdGEKCSogQGFjY2VzcyAgIHByaXZhdGUKCSovCglmdW5jdGlvbiBkZWJ1Zygkc3RyaW5nKXsKCQkkdGhpcy0+ZGVidWdfc3RyIC49IGdldF9jbGFzcygkdGhpcykuIjogJHN0cmluZ1xuIjsKCX0KCgkvKioKCSogZ2V0cyBhIHdzZGwgaW5zdGFuY2UgZnJvbSB0aGUgY2FjaGUKCSoKCSogQHBhcmFtIHN0cmluZyAkd3NkbCBUaGUgVVJMIG9mIHRoZSB3c2RsIGluc3RhbmNlCgkqIEByZXR1cm4gb2JqZWN0IHdzZGwgVGhlIGNhY2hlZCB3c2RsIGluc3RhbmNlLCBudWxsIGlmIHRoZSBpbnN0YW5jZSBpcyBub3QgaW4gdGhlIGNhY2hlCgkqIEBhY2Nlc3MgcHVibGljCgkqLwoJZnVuY3Rpb24gZ2V0KCR3c2RsKSB7CgkJJGZpbGVuYW1lID0gJHRoaXMtPmNyZWF0ZUZpbGVuYW1lKCR3c2RsKTsKCQlpZiAoJHRoaXMtPm9idGFpbk11dGV4KCRmaWxlbmFtZSwgInIiKSkgewoJCQkvLyBjaGVjayBmb3IgZXhwaXJlZCBXU0RMIHRoYXQgbXVzdCBiZSByZW1vdmVkIGZyb20gdGhlIGNhY2hlCiAJCQlpZiAoJHRoaXMtPmNhY2hlX2xpZmV0aW1lID4gMCkgewoJCQkJaWYgKGZpbGVfZXhpc3RzKCRmaWxlbmFtZSkgJiYgKHRpbWUoKSAtIGZpbGVtdGltZSgkZmlsZW5hbWUpID4gJHRoaXMtPmNhY2hlX2xpZmV0aW1lKSkgewoJCQkJCXVubGluaygkZmlsZW5hbWUpOwoJCQkJCSR0aGlzLT5kZWJ1ZygiRXhwaXJlZCAkd3NkbCAoJGZpbGVuYW1lKSBmcm9tIGNhY2hlIik7CgkJCQkJJHRoaXMtPnJlbGVhc2VNdXRleCgkZmlsZW5hbWUpOwoJCQkJCXJldHVybiBudWxsOwogIAkJCQl9CgkJCX0KCQkJLy8gc2VlIHdoYXQgdGhlcmUgaXMgdG8gcmV0dXJuCgkJCSRmcCA9IEBmb3BlbigkZmlsZW5hbWUsICJyIik7CgkJCWlmICgkZnApIHsKCQkJCSRzID0gaW1wbG9kZSgiIiwgQGZpbGUoJGZpbGVuYW1lKSk7CgkJCQlmY2xvc2UoJGZwKTsKCQkJCSR0aGlzLT5kZWJ1ZygiR290ICR3c2RsICgkZmlsZW5hbWUpIGZyb20gY2FjaGUiKTsKCQkJfSBlbHNlIHsKCQkJCSRzID0gbnVsbDsKCQkJCSR0aGlzLT5kZWJ1ZygiJHdzZGwgKCRmaWxlbmFtZSkgbm90IGluIGNhY2hlIik7CgkJCX0KCQkJJHRoaXMtPnJlbGVhc2VNdXRleCgkZmlsZW5hbWUpOwoJCQlyZXR1cm4gKCFpc19udWxsKCRzKSkgPyB1bnNlcmlhbGl6ZSgkcykgOiBudWxsOwoJCX0gZWxzZSB7CgkJCSR0aGlzLT5kZWJ1ZygiVW5hYmxlIHRvIG9idGFpbiBtdXRleCBmb3IgJGZpbGVuYW1lIGluIGdldCIpOwoJCX0KCQlyZXR1cm4gbnVsbDsKCX0KCgkvKioKCSogb2J0YWlucyB0aGUgbG9jYWwgbXV0ZXgKCSoKCSogQHBhcmFtIHN0cmluZyAkZmlsZW5hbWUgVGhlIEZpbGVuYW1lIG9mIHRoZSBDYWNoZSB0byBsb2NrCgkqIEBwYXJhbSBzdHJpbmcgJG1vZGUgVGhlIG9wZW4tbW9kZSAoInIiIG9yICJ3Iikgb3IgdGhlIGZpbGUgLSBhZmZlY3RzIGxvY2stbW9kZQoJKiBAcmV0dXJuIGJvb2xlYW4gTG9jayBzdWNjZXNzZnVsbHkgb2J0YWluZWQgPyEKCSogQGFjY2VzcyBwcml2YXRlCgkqLwoJZnVuY3Rpb24gb2J0YWluTXV0ZXgoJGZpbGVuYW1lLCAkbW9kZSkgewoJCWlmIChpc3NldCgkdGhpcy0+ZnBsb2NrW21kNSgkZmlsZW5hbWUpXSkpIHsKCQkJJHRoaXMtPmRlYnVnKCJMb2NrIGZvciAkZmlsZW5hbWUgYWxyZWFkeSBleGlzdHMiKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQkkdGhpcy0+ZnBsb2NrW21kNSgkZmlsZW5hbWUpXSA9IGZvcGVuKCRmaWxlbmFtZS4iLmxvY2siLCAidyIpOwoJCWlmICgkbW9kZSA9PSAiciIpIHsKCQkJcmV0dXJuIGZsb2NrKCR0aGlzLT5mcGxvY2tbbWQ1KCRmaWxlbmFtZSldLCBMT0NLX1NIKTsKCQl9IGVsc2UgewoJCQlyZXR1cm4gZmxvY2soJHRoaXMtPmZwbG9ja1ttZDUoJGZpbGVuYW1lKV0sIExPQ0tfRVgpOwoJCX0KCX0KCgkvKioKCSogYWRkcyBhIHdzZGwgaW5zdGFuY2UgdG8gdGhlIGNhY2hlCgkqCgkqIEBwYXJhbSBvYmplY3Qgd3NkbCAkd3NkbF9pbnN0YW5jZSBUaGUgd3NkbCBpbnN0YW5jZSB0byBhZGQKCSogQHJldHVybiBib29sZWFuIFdTREwgc3VjY2Vzc2Z1bGx5IGNhY2hlZAoJKiBAYWNjZXNzIHB1YmxpYwoJKi8KCWZ1bmN0aW9uIHB1dCgkd3NkbF9pbnN0YW5jZSkgewoJCSRmaWxlbmFtZSA9ICR0aGlzLT5jcmVhdGVGaWxlbmFtZSgkd3NkbF9pbnN0YW5jZS0+d3NkbCk7CgkJJHMgPSBzZXJpYWxpemUoJHdzZGxfaW5zdGFuY2UpOwoJCWlmICgkdGhpcy0+b2J0YWluTXV0ZXgoJGZpbGVuYW1lLCAidyIpKSB7CgkJCSRmcCA9IGZvcGVuKCRmaWxlbmFtZSwgInciKTsKCQkJZnB1dHMoJGZwLCAkcyk7CgkJCWZjbG9zZSgkZnApOwoJCQkkdGhpcy0+ZGVidWcoIlB1dCAkd3NkbF9pbnN0YW5jZS0+d3NkbCAoJGZpbGVuYW1lKSBpbiBjYWNoZSIpOwoJCQkkdGhpcy0+cmVsZWFzZU11dGV4KCRmaWxlbmFtZSk7CgkJCXJldHVybiB0cnVlOwoJCX0gZWxzZSB7CgkJCSR0aGlzLT5kZWJ1ZygiVW5hYmxlIHRvIG9idGFpbiBtdXRleCBmb3IgJGZpbGVuYW1lIGluIHB1dCIpOwoJCX0KCQlyZXR1cm4gZmFsc2U7Cgl9CgoJLyoqCgkqIHJlbGVhc2VzIHRoZSBsb2NhbCBtdXRleAoJKgoJKiBAcGFyYW0gc3RyaW5nICRmaWxlbmFtZSBUaGUgRmlsZW5hbWUgb2YgdGhlIENhY2hlIHRvIGxvY2sKCSogQHJldHVybiBib29sZWFuIExvY2sgc3VjY2Vzc2Z1bGx5IHJlbGVhc2VkCgkqIEBhY2Nlc3MgcHJpdmF0ZQoJKi8KCWZ1bmN0aW9uIHJlbGVhc2VNdXRleCgkZmlsZW5hbWUpIHsKCQkkcmV0ID0gZmxvY2soJHRoaXMtPmZwbG9ja1ttZDUoJGZpbGVuYW1lKV0sIExPQ0tfVU4pOwoJCWZjbG9zZSgkdGhpcy0+ZnBsb2NrW21kNSgkZmlsZW5hbWUpXSk7CgkJdW5zZXQoJHRoaXMtPmZwbG9ja1ttZDUoJGZpbGVuYW1lKV0pOwoJCWlmICghICRyZXQpIHsKCQkJJHRoaXMtPmRlYnVnKCJOb3QgYWJsZSB0byByZWxlYXNlIGxvY2sgZm9yICRmaWxlbmFtZSIpOwoJCX0KCQlyZXR1cm4gJHJldDsKCX0KCgkvKioKCSogcmVtb3ZlcyBhIHdzZGwgaW5zdGFuY2UgZnJvbSB0aGUgY2FjaGUKCSoKCSogQHBhcmFtIHN0cmluZyAkd3NkbCBUaGUgVVJMIG9mIHRoZSB3c2RsIGluc3RhbmNlCgkqIEByZXR1cm4gYm9vbGVhbiBXaGV0aGVyIHRoZXJlIHdhcyBhbiBpbnN0YW5jZSB0byByZW1vdmUKCSogQGFjY2VzcyBwdWJsaWMKCSovCglmdW5jdGlvbiByZW1vdmUoJHdzZGwpIHsKCQkkZmlsZW5hbWUgPSAkdGhpcy0+Y3JlYXRlRmlsZW5hbWUoJHdzZGwpOwoJCS8vIGlnbm9yZSBlcnJvcnMgb2J0YWluaW5nIG11dGV4CgkJJHRoaXMtPm9idGFpbk11dGV4KCRmaWxlbmFtZSwgInciKTsKCQkkcmV0ID0gdW5saW5rKCRmaWxlbmFtZSk7CgkJJHRoaXMtPmRlYnVnKCJSZW1vdmVkICgkcmV0KSAkd3NkbCAoJGZpbGVuYW1lKSBmcm9tIGNhY2hlIik7CgkJJHRoaXMtPnJlbGVhc2VNdXRleCgkZmlsZW5hbWUpOwoJCXJldHVybiAkcmV0OwoJfQp9Cj8+Cg==]]></data>
  </file>
  <file>
    <filename>classes/class.xmlschema.php</filename>
    <isdir>0</isdir>
    <data><![CDATA[PD9waHAKCgoKCi8qKgoqIHBhcnNlcyBhbiBYTUwgU2NoZW1hLCBhbGxvd3MgYWNjZXNzIHRvIGl0J3MgZGF0YSwgb3RoZXIgdXRpbGl0eSBtZXRob2RzCiogbm8gdmFsaWRhdGlvbi4uLiB5ZXQuCiogdmVyeSBleHBlcmltZW50YWwgYW5kIGxpbWl0ZWQuIEFzIGlzIGRpc2N1c3NlZCBvbiBYTUwtREVWLCBJJ20gb25lIG9mIHRoZSBwZW9wbGUKKiB0aGF0IGp1c3QgZG9lc24ndCBoYXZlIHRpbWUgdG8gcmVhZCB0aGUgc3BlYyhzKSB0aG9yb3VnaGx5LCBhbmQganVzdCBoYXZlIGEgY291cGxlIG9mIHRydXN0eQoqIHR1dG9yaWFscyBJIHJlZmVyIHRvIDopCioKKiBAYXV0aG9yICAgRGlldHJpY2ggQXlhbGEgPGRpZXRyaWNoQGdhbng0LmNvbT4KKiBAdmVyc2lvbiAgJElkOiBjbGFzcy54bWxzY2hlbWEucGhwLHYgMS4zOSAyMDA1LzA4LzA0IDAxOjI3OjQyIHNuaWNob2wgRXhwICQKKiBAYWNjZXNzICAgcHVibGljCiovCmNsYXNzIFhNTFNjaGVtYSBleHRlbmRzIG51c29hcF9iYXNlICB7CgkKCS8vIGZpbGVzCgl2YXIgJHNjaGVtYSA9ICcnOwoJdmFyICR4bWwgPSAnJzsKCS8vIG5hbWVzcGFjZXMKCXZhciAkZW5jbG9zaW5nTmFtZXNwYWNlczsKCS8vIHNjaGVtYSBpbmZvCgl2YXIgJHNjaGVtYUluZm8gPSBhcnJheSgpOwoJdmFyICRzY2hlbWFUYXJnZXROYW1lc3BhY2UgPSAnJzsKCS8vIHR5cGVzLCBlbGVtZW50cywgYXR0cmlidXRlcyBkZWZpbmVkIGJ5IHRoZSBzY2hlbWEKCXZhciAkYXR0cmlidXRlcyA9IGFycmF5KCk7Cgl2YXIgJGNvbXBsZXhUeXBlcyA9IGFycmF5KCk7Cgl2YXIgJGNvbXBsZXhUeXBlU3RhY2sgPSBhcnJheSgpOwoJdmFyICRjdXJyZW50Q29tcGxleFR5cGUgPSBudWxsOwoJdmFyICRlbGVtZW50cyA9IGFycmF5KCk7Cgl2YXIgJGVsZW1lbnRTdGFjayA9IGFycmF5KCk7Cgl2YXIgJGN1cnJlbnRFbGVtZW50ID0gbnVsbDsKCXZhciAkc2ltcGxlVHlwZXMgPSBhcnJheSgpOwoJdmFyICRzaW1wbGVUeXBlU3RhY2sgPSBhcnJheSgpOwoJdmFyICRjdXJyZW50U2ltcGxlVHlwZSA9IG51bGw7CgkvLyBpbXBvcnRzCgl2YXIgJGltcG9ydHMgPSBhcnJheSgpOwoJLy8gcGFyc2VyIHZhcnMKCXZhciAkcGFyc2VyOwoJdmFyICRwb3NpdGlvbiA9IDA7Cgl2YXIgJGRlcHRoID0gMDsKCXZhciAkZGVwdGhfYXJyYXkgPSBhcnJheSgpOwoJdmFyICRtZXNzYWdlID0gYXJyYXkoKTsKCXZhciAkZGVmYXVsdE5hbWVzcGFjZSA9IGFycmF5KCk7CiAgICAKCS8qKgoJKiBjb25zdHJ1Y3RvcgoJKgoJKiBAcGFyYW0gICAgc3RyaW5nICRzY2hlbWEgc2NoZW1hIGRvY3VtZW50IFVSSQoJKiBAcGFyYW0gICAgc3RyaW5nICR4bWwgeG1sIGRvY3VtZW50IFVSSQoJKiBAcGFyYW0Jc3RyaW5nICRuYW1lc3BhY2VzIG5hbWVzcGFjZXMgZGVmaW5lZCBpbiBlbmNsb3NpbmcgWE1MCgkqIEBhY2Nlc3MgICBwdWJsaWMKCSovCglmdW5jdGlvbiBYTUxTY2hlbWEoJHNjaGVtYT0nJywkeG1sPScnLCRuYW1lc3BhY2VzPWFycmF5KCkpewoJCXBhcmVudDo6bnVzb2FwX2Jhc2UoKTsKCQkkdGhpcy0+ZGVidWcoJ3htbHNjaGVtYSBjbGFzcyBpbnN0YW50aWF0ZWQsIGluc2lkZSBjb25zdHJ1Y3RvcicpOwoJCS8vIGZpbGVzCgkJJHRoaXMtPnNjaGVtYSA9ICRzY2hlbWE7CgkJJHRoaXMtPnhtbCA9ICR4bWw7CgoJCS8vIG5hbWVzcGFjZXMKCQkkdGhpcy0+ZW5jbG9zaW5nTmFtZXNwYWNlcyA9ICRuYW1lc3BhY2VzOwoJCSR0aGlzLT5uYW1lc3BhY2VzID0gYXJyYXlfbWVyZ2UoJHRoaXMtPm5hbWVzcGFjZXMsICRuYW1lc3BhY2VzKTsKCgkJLy8gcGFyc2Ugc2NoZW1hIGZpbGUKCQlpZigkc2NoZW1hICE9ICcnKXsKCQkJJHRoaXMtPmRlYnVnKCdpbml0aWFsIHNjaGVtYSBmaWxlOiAnLiRzY2hlbWEpOwoJCQkkdGhpcy0+cGFyc2VGaWxlKCRzY2hlbWEsICdzY2hlbWEnKTsKCQl9CgoJCS8vIHBhcnNlIHhtbCBmaWxlCgkJaWYoJHhtbCAhPSAnJyl7CgkJCSR0aGlzLT5kZWJ1ZygnaW5pdGlhbCB4bWwgZmlsZTogJy4keG1sKTsKCQkJJHRoaXMtPnBhcnNlRmlsZSgkeG1sLCAneG1sJyk7CgkJfQoKCX0KCiAgICAvKioKICAgICogcGFyc2UgYW4gWE1MIGZpbGUKICAgICoKICAgICogQHBhcmFtIHN0cmluZyAkeG1sLCBwYXRoL1VSTCB0byBYTUwgZmlsZQogICAgKiBAcGFyYW0gc3RyaW5nICR0eXBlLCAoc2NoZW1hIHwgeG1sKQoJKiBAcmV0dXJuIGJvb2xlYW4KICAgICogQGFjY2VzcyBwdWJsaWMKICAgICovCglmdW5jdGlvbiBwYXJzZUZpbGUoJHhtbCwkdHlwZSl7CgkJLy8gcGFyc2UgeG1sIGZpbGUKCQlpZigkeG1sICE9ICIiKXsKCQkJJHhtbFN0ciA9IEBqb2luKCIiLEBmaWxlKCR4bWwpKTsKCQkJaWYoJHhtbFN0ciA9PSAiIil7CgkJCQkkbXNnID0gJ0Vycm9yIHJlYWRpbmcgWE1MIGZyb20gJy4keG1sOwoJCQkJJHRoaXMtPnNldEVycm9yKCRtc2cpOwoJCQkJJHRoaXMtPmRlYnVnKCRtc2cpOwoJCQlyZXR1cm4gZmFsc2U7CgkJCX0gZWxzZSB7CgkJCQkkdGhpcy0+ZGVidWcoInBhcnNpbmcgJHhtbCIpOwoJCQkJJHRoaXMtPnBhcnNlU3RyaW5nKCR4bWxTdHIsJHR5cGUpOwoJCQkJJHRoaXMtPmRlYnVnKCJkb25lIHBhcnNpbmcgJHhtbCIpOwoJCQlyZXR1cm4gdHJ1ZTsKCQkJfQoJCX0KCQlyZXR1cm4gZmFsc2U7Cgl9CgoJLyoqCgkqIHBhcnNlIGFuIFhNTCBzdHJpbmcKCSoKCSogQHBhcmFtICAgIHN0cmluZyAkeG1sIHBhdGggb3IgVVJMCiAgICAqIEBwYXJhbSBzdHJpbmcgJHR5cGUsIChzY2hlbWF8eG1sKQoJKiBAYWNjZXNzICAgcHJpdmF0ZQoJKi8KCWZ1bmN0aW9uIHBhcnNlU3RyaW5nKCR4bWwsJHR5cGUpewoJCS8vIHBhcnNlIHhtbCBzdHJpbmcKCQlpZigkeG1sICE9ICIiKXsKCgkgICAgCS8vIENyZWF0ZSBhbiBYTUwgcGFyc2VyLgoJICAgIAkkdGhpcy0+cGFyc2VyID0geG1sX3BhcnNlcl9jcmVhdGUoKTsKCSAgICAJLy8gU2V0IHRoZSBvcHRpb25zIGZvciBwYXJzaW5nIHRoZSBYTUwgZGF0YS4KCSAgICAJeG1sX3BhcnNlcl9zZXRfb3B0aW9uKCR0aGlzLT5wYXJzZXIsIFhNTF9PUFRJT05fQ0FTRV9GT0xESU5HLCAwKTsKCgkgICAgCS8vIFNldCB0aGUgb2JqZWN0IGZvciB0aGUgcGFyc2VyLgoJICAgIAl4bWxfc2V0X29iamVjdCgkdGhpcy0+cGFyc2VyLCAkdGhpcyk7CgoJICAgIAkvLyBTZXQgdGhlIGVsZW1lbnQgaGFuZGxlcnMgZm9yIHRoZSBwYXJzZXIuCgkJCWlmKCR0eXBlID09ICJzY2hlbWEiKXsKCQkgICAgCXhtbF9zZXRfZWxlbWVudF9oYW5kbGVyKCR0aGlzLT5wYXJzZXIsICdzY2hlbWFTdGFydEVsZW1lbnQnLCdzY2hlbWFFbmRFbGVtZW50Jyk7CgkJICAgIAl4bWxfc2V0X2NoYXJhY3Rlcl9kYXRhX2hhbmRsZXIoJHRoaXMtPnBhcnNlciwnc2NoZW1hQ2hhcmFjdGVyRGF0YScpOwoJCQl9IGVsc2VpZigkdHlwZSA9PSAieG1sIil7CgkJCQl4bWxfc2V0X2VsZW1lbnRfaGFuZGxlcigkdGhpcy0+cGFyc2VyLCAneG1sU3RhcnRFbGVtZW50JywneG1sRW5kRWxlbWVudCcpOwoJCSAgICAJeG1sX3NldF9jaGFyYWN0ZXJfZGF0YV9oYW5kbGVyKCR0aGlzLT5wYXJzZXIsJ3htbENoYXJhY3RlckRhdGEnKTsKCQkJfQoKCQkgICAgLy8gUGFyc2UgdGhlIFhNTCBmaWxlLgoJCSAgICBpZigheG1sX3BhcnNlKCR0aGlzLT5wYXJzZXIsJHhtbCx0cnVlKSl7CgkJCS8vIERpc3BsYXkgYW4gZXJyb3IgbWVzc2FnZS4KCQkJCSRlcnJzdHIgPSBzcHJpbnRmKCdYTUwgZXJyb3IgcGFyc2luZyBYTUwgc2NoZW1hIG9uIGxpbmUgJWQ6ICVzJywKCQkJCXhtbF9nZXRfY3VycmVudF9saW5lX251bWJlcigkdGhpcy0+cGFyc2VyKSwKCQkJCXhtbF9lcnJvcl9zdHJpbmcoeG1sX2dldF9lcnJvcl9jb2RlKCR0aGlzLT5wYXJzZXIpKQoJCQkJKTsKCQkJCSR0aGlzLT5kZWJ1ZygkZXJyc3RyKTsKCQkJCSR0aGlzLT5kZWJ1ZygiWE1MIHBheWxvYWQ6XG4iIC4gJHhtbCk7CgkJCQkkdGhpcy0+c2V0RXJyb3IoJGVycnN0cik7CgkgICAgCX0KICAgICAgICAgICAgCgkJCXhtbF9wYXJzZXJfZnJlZSgkdGhpcy0+cGFyc2VyKTsKCQl9IGVsc2V7CgkJCSR0aGlzLT5kZWJ1Zygnbm8geG1sIHBhc3NlZCB0byBwYXJzZVN0cmluZygpISEnKTsKCQkJJHRoaXMtPnNldEVycm9yKCdubyB4bWwgcGFzc2VkIHRvIHBhcnNlU3RyaW5nKCkhIScpOwoJCX0KCX0KCgkvKioKCSogc3RhcnQtZWxlbWVudCBoYW5kbGVyCgkqCgkqIEBwYXJhbSAgICBzdHJpbmcgJHBhcnNlciBYTUwgcGFyc2VyIG9iamVjdAoJKiBAcGFyYW0gICAgc3RyaW5nICRuYW1lIGVsZW1lbnQgbmFtZQoJKiBAcGFyYW0gICAgc3RyaW5nICRhdHRycyBhc3NvY2lhdGl2ZSBhcnJheSBvZiBhdHRyaWJ1dGVzCgkqIEBhY2Nlc3MgICBwcml2YXRlCgkqLwoJZnVuY3Rpb24gc2NoZW1hU3RhcnRFbGVtZW50KCRwYXJzZXIsICRuYW1lLCAkYXR0cnMpIHsKCQkKCQkvLyBwb3NpdGlvbiBpbiB0aGUgdG90YWwgbnVtYmVyIG9mIGVsZW1lbnRzLCBzdGFydGluZyBmcm9tIDAKCQkkcG9zID0gJHRoaXMtPnBvc2l0aW9uKys7CgkJJGRlcHRoID0gJHRoaXMtPmRlcHRoKys7CgkJLy8gc2V0IHNlbGYgYXMgY3VycmVudCB2YWx1ZSBmb3IgdGhpcyBkZXB0aAoJCSR0aGlzLT5kZXB0aF9hcnJheVskZGVwdGhdID0gJHBvczsKCQkkdGhpcy0+bWVzc2FnZVskcG9zXSA9IGFycmF5KCdjZGF0YScgPT4gJycpOyAKCQlpZiAoJGRlcHRoID4gMCkgewoJCQkkdGhpcy0+ZGVmYXVsdE5hbWVzcGFjZVskcG9zXSA9ICR0aGlzLT5kZWZhdWx0TmFtZXNwYWNlWyR0aGlzLT5kZXB0aF9hcnJheVskZGVwdGggLSAxXV07CgkJfSBlbHNlIHsKCQkJJHRoaXMtPmRlZmF1bHROYW1lc3BhY2VbJHBvc10gPSBmYWxzZTsKCQl9CgoJCS8vIGdldCBlbGVtZW50IHByZWZpeAoJCWlmKCRwcmVmaXggPSAkdGhpcy0+Z2V0UHJlZml4KCRuYW1lKSl7CgkJCS8vIGdldCB1bnF1YWxpZmllZCBuYW1lCgkJCSRuYW1lID0gJHRoaXMtPmdldExvY2FsUGFydCgkbmFtZSk7CgkJfSBlbHNlIHsKICAgICAgICAJJHByZWZpeCA9ICcnOwogICAgICAgIH0KCQkKICAgICAgICAvLyBsb29wIHRocnUgYXR0cmlidXRlcywgZXhwYW5kaW5nLCBhbmQgcmVnaXN0ZXJpbmcgbmFtZXNwYWNlIGRlY2xhcmF0aW9ucwogICAgICAgIGlmKGNvdW50KCRhdHRycykgPiAwKXsKICAgICAgICAJZm9yZWFjaCgkYXR0cnMgYXMgJGsgPT4gJHYpewogICAgICAgICAgICAgICAgLy8gaWYgbnMgZGVjbGFyYXRpb25zLCBhZGQgdG8gY2xhc3MgbGV2ZWwgYXJyYXkgb2YgdmFsaWQgbmFtZXNwYWNlcwoJCQkJaWYoZXJlZygiXnhtbG5zIiwkaykpewogICAgICAgICAgICAgICAgCS8vJHRoaXMtPnhkZWJ1ZygiJGs6ICR2Iik7CiAgICAgICAgICAgICAgICAJLy8kdGhpcy0+eGRlYnVnKCduc19wcmVmaXg6ICcuJHRoaXMtPmdldFByZWZpeCgkaykpOwogICAgICAgICAgICAgICAgCWlmKCRuc19wcmVmaXggPSBzdWJzdHIoc3RycmNocigkaywnOicpLDEpKXsKICAgICAgICAgICAgICAgIAkJLy8kdGhpcy0+eGRlYnVnKCJBZGQgbmFtZXNwYWNlWyRuc19wcmVmaXhdID0gJHYiKTsKCQkJCQkJJHRoaXMtPm5hbWVzcGFjZXNbJG5zX3ByZWZpeF0gPSAkdjsKCQkJCQl9IGVsc2UgewoJCQkJCQkkdGhpcy0+ZGVmYXVsdE5hbWVzcGFjZVskcG9zXSA9ICR2OwoJCQkJCQlpZiAoISAkdGhpcy0+Z2V0UHJlZml4RnJvbU5hbWVzcGFjZSgkdikpIHsKCQkJCQkJCSR0aGlzLT5uYW1lc3BhY2VzWyducycuKGNvdW50KCR0aGlzLT5uYW1lc3BhY2VzKSsxKV0gPSAkdjsKCQkJCQkJfQoJCQkJCX0KCQkJCQlpZigkdiA9PSAnaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnIHx8ICR2ID09ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hNTFNjaGVtYScgfHwgJHYgPT0gJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvMTAvWE1MU2NoZW1hJyl7CgkJCQkJCSR0aGlzLT5YTUxTY2hlbWFWZXJzaW9uID0gJHY7CgkJCQkJCSR0aGlzLT5uYW1lc3BhY2VzWyd4c2knXSA9ICR2LictaW5zdGFuY2UnOwoJCQkJCX0KCQkJCX0KICAgICAgICAJfQogICAgICAgIAlmb3JlYWNoKCRhdHRycyBhcyAkayA9PiAkdil7CiAgICAgICAgICAgICAgICAvLyBleHBhbmQgZWFjaCBhdHRyaWJ1dGUKICAgICAgICAgICAgICAgICRrID0gc3RycG9zKCRrLCc6JykgPyAkdGhpcy0+ZXhwYW5kUW5hbWUoJGspIDogJGs7CiAgICAgICAgICAgICAgICAkdiA9IHN0cnBvcygkdiwnOicpID8gJHRoaXMtPmV4cGFuZFFuYW1lKCR2KSA6ICR2OwogICAgICAgIAkJJGVBdHRyc1ska10gPSAkdjsKICAgICAgICAJfQogICAgICAgIAkkYXR0cnMgPSAkZUF0dHJzOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgCSRhdHRycyA9IGFycmF5KCk7CiAgICAgICAgfQoJCS8vIGZpbmQgc3RhdHVzLCByZWdpc3RlciBkYXRhCgkJc3dpdGNoKCRuYW1lKXsKCQkJY2FzZSAnYWxsJzoJCQkvLyAob3B0aW9uYWwpIGNvbXBvc2l0b3IgY29udGVudCBmb3IgYSBjb21wbGV4VHlwZQoJCQljYXNlICdjaG9pY2UnOgoJCQljYXNlICdncm91cCc6CgkJCWNhc2UgJ3NlcXVlbmNlJzoKCQkJCS8vJHRoaXMtPnhkZWJ1ZygiY29tcG9zaXRvciAkbmFtZSBmb3IgY3VycmVudENvbXBsZXhUeXBlOiAkdGhpcy0+Y3VycmVudENvbXBsZXhUeXBlIGFuZCBjdXJyZW50RWxlbWVudDogJHRoaXMtPmN1cnJlbnRFbGVtZW50Iik7CgkJCQkkdGhpcy0+Y29tcGxleFR5cGVzWyR0aGlzLT5jdXJyZW50Q29tcGxleFR5cGVdWydjb21wb3NpdG9yJ10gPSAkbmFtZTsKCQkJCS8vaWYoJG5hbWUgPT0gJ2FsbCcgfHwgJG5hbWUgPT0gJ3NlcXVlbmNlJyl7CgkJCQkvLwkkdGhpcy0+Y29tcGxleFR5cGVzWyR0aGlzLT5jdXJyZW50Q29tcGxleFR5cGVdWydwaHBUeXBlJ10gPSAnc3RydWN0JzsKCQkJCS8vfQoJCQlicmVhazsKCQkJY2FzZSAnYXR0cmlidXRlJzoJLy8gY29tcGxleFR5cGUgYXR0cmlidXRlCiAgICAgICAgICAgIAkvLyR0aGlzLT54ZGVidWcoInBhcnNpbmcgYXR0cmlidXRlICRhdHRyc1tuYW1lXSAkYXR0cnNbcmVmXSBvZiB2YWx1ZTogIi4kYXR0cnNbJ2h0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvOmFycmF5VHlwZSddKTsKICAgICAgICAgICAgCSR0aGlzLT54ZGVidWcoInBhcnNpbmcgYXR0cmlidXRlOiIpOwogICAgICAgICAgICAJJHRoaXMtPmFwcGVuZERlYnVnKCR0aGlzLT52YXJEdW1wKCRhdHRycykpOwoJCQkJaWYgKCFpc3NldCgkYXR0cnNbJ2Zvcm0nXSkpIHsKCQkJCQkkYXR0cnNbJ2Zvcm0nXSA9ICR0aGlzLT5zY2hlbWFJbmZvWydhdHRyaWJ1dGVGb3JtRGVmYXVsdCddOwoJCQkJfQogICAgICAgICAgICAJaWYgKGlzc2V0KCRhdHRyc1snaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC86YXJyYXlUeXBlJ10pKSB7CgkJCQkJJHYgPSAkYXR0cnNbJ2h0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvOmFycmF5VHlwZSddOwoJCQkJCWlmICghc3RycG9zKCR2LCAnOicpKSB7CgkJCQkJCS8vIG5vIG5hbWVzcGFjZSBpbiBhcnJheVR5cGUgYXR0cmlidXRlIHZhbHVlLi4uCgkJCQkJCWlmICgkdGhpcy0+ZGVmYXVsdE5hbWVzcGFjZVskcG9zXSkgewoJCQkJCQkJLy8gLi4uc28gdXNlIHRoZSBkZWZhdWx0CgkJCQkJCQkkYXR0cnNbJ2h0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvOmFycmF5VHlwZSddID0gJHRoaXMtPmRlZmF1bHROYW1lc3BhY2VbJHBvc10gLiAnOicgLiAkYXR0cnNbJ2h0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvOmFycmF5VHlwZSddOwoJCQkJCQl9CgkJCQkJfQogICAgICAgICAgICAJfQogICAgICAgICAgICAgICAgaWYoaXNzZXQoJGF0dHJzWyduYW1lJ10pKXsKCQkJCQkkdGhpcy0+YXR0cmlidXRlc1skYXR0cnNbJ25hbWUnXV0gPSAkYXR0cnM7CgkJCQkJJGFuYW1lID0gJGF0dHJzWyduYW1lJ107CgkJCQl9IGVsc2VpZihpc3NldCgkYXR0cnNbJ3JlZiddKSAmJiAkYXR0cnNbJ3JlZiddID09ICdodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLzphcnJheVR5cGUnKXsKCQkJCQlpZiAoaXNzZXQoJGF0dHJzWydodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLzphcnJheVR5cGUnXSkpIHsKCSAgICAgICAgICAgICAgICAJJGFuYW1lID0gJGF0dHJzWydodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLzphcnJheVR5cGUnXTsKCSAgICAgICAgICAgICAgICB9IGVsc2UgewoJICAgICAgICAgICAgICAgIAkkYW5hbWUgPSAnJzsKCSAgICAgICAgICAgICAgICB9CgkJCQl9IGVsc2VpZihpc3NldCgkYXR0cnNbJ3JlZiddKSl7CgkJCQkJJGFuYW1lID0gJGF0dHJzWydyZWYnXTsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+YXR0cmlidXRlc1skYXR0cnNbJ3JlZiddXSA9ICRhdHRyczsKCQkJCX0KICAgICAgICAgICAgICAgIAoJCQkJaWYoJHRoaXMtPmN1cnJlbnRDb21wbGV4VHlwZSl7CS8vIFRoaXMgc2hvdWxkICphbHdheXMqIGJlCgkJCQkJJHRoaXMtPmNvbXBsZXhUeXBlc1skdGhpcy0+Y3VycmVudENvbXBsZXhUeXBlXVsnYXR0cnMnXVskYW5hbWVdID0gJGF0dHJzOwoJCQkJfQoJCQkJLy8gYXJyYXlUeXBlIGF0dHJpYnV0ZQoJCQkJaWYoaXNzZXQoJGF0dHJzWydodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLzphcnJheVR5cGUnXSkgfHwgJHRoaXMtPmdldExvY2FsUGFydCgkYW5hbWUpID09ICdhcnJheVR5cGUnKXsKCQkJCQkkdGhpcy0+Y29tcGxleFR5cGVzWyR0aGlzLT5jdXJyZW50Q29tcGxleFR5cGVdWydwaHBUeXBlJ10gPSAnYXJyYXknOwogICAgICAgICAgICAgICAgCSRwcmVmaXggPSAkdGhpcy0+Z2V0UHJlZml4KCRhbmFtZSk7CgkJCQkJaWYoaXNzZXQoJGF0dHJzWydodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLzphcnJheVR5cGUnXSkpewoJCQkJCQkkdiA9ICRhdHRyc1snaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC86YXJyYXlUeXBlJ107CgkJCQkJfSBlbHNlIHsKCQkJCQkJJHYgPSAnJzsKCQkJCQl9CiAgICAgICAgICAgICAgICAgICAgaWYoc3RycG9zKCR2LCdbLF0nKSl7CiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5jb21wbGV4VHlwZXNbJHRoaXMtPmN1cnJlbnRDb21wbGV4VHlwZV1bJ211bHRpZGltZW5zaW9uYWwnXSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICR2ID0gc3Vic3RyKCR2LDAsc3RycG9zKCR2LCdbJykpOyAvLyBjbGlwIHRoZSBbXQogICAgICAgICAgICAgICAgICAgIGlmKCFzdHJwb3MoJHYsJzonKSAmJiBpc3NldCgkdGhpcy0+dHlwZW1hcFskdGhpcy0+WE1MU2NoZW1hVmVyc2lvbl1bJHZdKSl7CiAgICAgICAgICAgICAgICAgICAgICAgICR2ID0gJHRoaXMtPlhNTFNjaGVtYVZlcnNpb24uJzonLiR2OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+Y29tcGxleFR5cGVzWyR0aGlzLT5jdXJyZW50Q29tcGxleFR5cGVdWydhcnJheVR5cGUnXSA9ICR2OwoJCQkJfQoJCQlicmVhazsKCQkJY2FzZSAnY29tcGxleENvbnRlbnQnOgkvLyAob3B0aW9uYWwpIGNvbnRlbnQgZm9yIGEgY29tcGxleFR5cGUKCQkJYnJlYWs7CgkJCWNhc2UgJ2NvbXBsZXhUeXBlJzoKCQkJCWFycmF5X3B1c2goJHRoaXMtPmNvbXBsZXhUeXBlU3RhY2ssICR0aGlzLT5jdXJyZW50Q29tcGxleFR5cGUpOwoJCQkJaWYoaXNzZXQoJGF0dHJzWyduYW1lJ10pKXsKCQkJCQkkdGhpcy0+eGRlYnVnKCdwcm9jZXNzaW5nIG5hbWVkIGNvbXBsZXhUeXBlICcuJGF0dHJzWyduYW1lJ10pOwoJCQkJCS8vJHRoaXMtPmN1cnJlbnRFbGVtZW50ID0gZmFsc2U7CgkJCQkJJHRoaXMtPmN1cnJlbnRDb21wbGV4VHlwZSA9ICRhdHRyc1snbmFtZSddOwoJCQkJCSR0aGlzLT5jb21wbGV4VHlwZXNbJHRoaXMtPmN1cnJlbnRDb21wbGV4VHlwZV0gPSAkYXR0cnM7CgkJCQkJJHRoaXMtPmNvbXBsZXhUeXBlc1skdGhpcy0+Y3VycmVudENvbXBsZXhUeXBlXVsndHlwZUNsYXNzJ10gPSAnY29tcGxleFR5cGUnOwoJCQkJCS8vIFRoaXMgaXMgZm9yIGNvbnN0cnVjdHMgbGlrZQoJCQkJCS8vICAgICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mU3RyaW5nIiBiYXNlPSJzb2FwOkFycmF5Ij4KCQkJCQkvLyAgICAgICAgICAgICAgICA8c2VxdWVuY2U+CgkJCQkJLy8gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InN0cmluZyIgdHlwZT0ieHNkOnN0cmluZyIKCQkJCQkvLyAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+CgkJCQkJLy8gICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KCQkJCQkvLyAgICAgICAgICAgIDwvY29tcGxleFR5cGU+CgkJCQkJaWYoaXNzZXQoJGF0dHJzWydiYXNlJ10pICYmIGVyZWcoJzpBcnJheSQnLCRhdHRyc1snYmFzZSddKSl7CgkJCQkJCSR0aGlzLT54ZGVidWcoJ2NvbXBsZXhUeXBlIGlzIHVudXN1YWwgYXJyYXknKTsKCQkJCQkJJHRoaXMtPmNvbXBsZXhUeXBlc1skdGhpcy0+Y3VycmVudENvbXBsZXhUeXBlXVsncGhwVHlwZSddID0gJ2FycmF5JzsKCQkJCQl9IGVsc2UgewoJCQkJCQkkdGhpcy0+Y29tcGxleFR5cGVzWyR0aGlzLT5jdXJyZW50Q29tcGxleFR5cGVdWydwaHBUeXBlJ10gPSAnc3RydWN0JzsKCQkJCQl9CgkJCQl9ZWxzZXsKCQkJCQkkdGhpcy0+eGRlYnVnKCdwcm9jZXNzaW5nIHVubmFtZWQgY29tcGxleFR5cGUgZm9yIGVsZW1lbnQgJy4kdGhpcy0+Y3VycmVudEVsZW1lbnQpOwoJCQkJCSR0aGlzLT5jdXJyZW50Q29tcGxleFR5cGUgPSAkdGhpcy0+Y3VycmVudEVsZW1lbnQgLiAnX0NvbnRhaW5lZFR5cGUnOwoJCQkJCS8vJHRoaXMtPmN1cnJlbnRFbGVtZW50ID0gZmFsc2U7CgkJCQkJJHRoaXMtPmNvbXBsZXhUeXBlc1skdGhpcy0+Y3VycmVudENvbXBsZXhUeXBlXSA9ICRhdHRyczsKCQkJCQkkdGhpcy0+Y29tcGxleFR5cGVzWyR0aGlzLT5jdXJyZW50Q29tcGxleFR5cGVdWyd0eXBlQ2xhc3MnXSA9ICdjb21wbGV4VHlwZSc7CgkJCQkJLy8gVGhpcyBpcyBmb3IgY29uc3RydWN0cyBsaWtlCgkJCQkJLy8gICAgICAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZTdHJpbmciIGJhc2U9InNvYXA6QXJyYXkiPgoJCQkJCS8vICAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4KCQkJCQkvLyAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0ic3RyaW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIgoJCQkJCS8vICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KCQkJCQkvLyAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgoJCQkJCS8vICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KCQkJCQlpZihpc3NldCgkYXR0cnNbJ2Jhc2UnXSkgJiYgZXJlZygnOkFycmF5JCcsJGF0dHJzWydiYXNlJ10pKXsKCQkJCQkJJHRoaXMtPnhkZWJ1ZygnY29tcGxleFR5cGUgaXMgdW51c3VhbCBhcnJheScpOwoJCQkJCQkkdGhpcy0+Y29tcGxleFR5cGVzWyR0aGlzLT5jdXJyZW50Q29tcGxleFR5cGVdWydwaHBUeXBlJ10gPSAnYXJyYXknOwoJCQkJCX0gZWxzZSB7CgkJCQkJCSR0aGlzLT5jb21wbGV4VHlwZXNbJHRoaXMtPmN1cnJlbnRDb21wbGV4VHlwZV1bJ3BocFR5cGUnXSA9ICdzdHJ1Y3QnOwoJCQkJCX0KCQkJCX0KCQkJYnJlYWs7CgkJCWNhc2UgJ2VsZW1lbnQnOgoJCQkJYXJyYXlfcHVzaCgkdGhpcy0+ZWxlbWVudFN0YWNrLCAkdGhpcy0+Y3VycmVudEVsZW1lbnQpOwoJCQkJLy8gZWxlbWVudHMgZGVmaW5lZCBhcyBwYXJ0IG9mIGEgY29tcGxleCB0eXBlIHNob3VsZAoJCQkJLy8gbm90IHJlYWxseSBiZSBhZGRlZCB0byAkdGhpcy0+ZWxlbWVudHMsIGJ1dCBmb3Igc29tZQoJCQkJLy8gcmVhc29uLCB0aGV5IGFyZQoJCQkJaWYgKCFpc3NldCgkYXR0cnNbJ2Zvcm0nXSkpIHsKCQkJCQkkYXR0cnNbJ2Zvcm0nXSA9ICR0aGlzLT5zY2hlbWFJbmZvWydlbGVtZW50Rm9ybURlZmF1bHQnXTsKCQkJCX0KCQkJCWlmKGlzc2V0KCRhdHRyc1sndHlwZSddKSl7CgkJCQkJJHRoaXMtPnhkZWJ1ZygicHJvY2Vzc2luZyB0eXBlZCBlbGVtZW50ICIuJGF0dHJzWyduYW1lJ10uIiBvZiB0eXBlICIuJGF0dHJzWyd0eXBlJ10pOwoJCQkJCWlmICghICR0aGlzLT5nZXRQcmVmaXgoJGF0dHJzWyd0eXBlJ10pKSB7CgkJCQkJCWlmICgkdGhpcy0+ZGVmYXVsdE5hbWVzcGFjZVskcG9zXSkgewoJCQkJCQkJJGF0dHJzWyd0eXBlJ10gPSAkdGhpcy0+ZGVmYXVsdE5hbWVzcGFjZVskcG9zXSAuICc6JyAuICRhdHRyc1sndHlwZSddOwoJCQkJCQkJJHRoaXMtPnhkZWJ1ZygndXNlZCBkZWZhdWx0IG5hbWVzcGFjZSB0byBtYWtlIHR5cGUgJyAuICRhdHRyc1sndHlwZSddKTsKCQkJCQkJfQoJCQkJCX0KCQkJCQkvLyBUaGlzIGlzIGZvciBjb25zdHJ1Y3RzIGxpa2UKCQkJCQkvLyAgICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZlN0cmluZyIgYmFzZT0ic29hcDpBcnJheSI+CgkJCQkJLy8gICAgICAgICAgICAgICAgPHNlcXVlbmNlPgoJCQkJCS8vICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJzdHJpbmciIHR5cGU9InhzZDpzdHJpbmciCgkJCQkJLy8gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgoJCQkJCS8vICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+CgkJCQkJLy8gICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgoJCQkJCWlmICgkdGhpcy0+Y3VycmVudENvbXBsZXhUeXBlICYmICR0aGlzLT5jb21wbGV4VHlwZXNbJHRoaXMtPmN1cnJlbnRDb21wbGV4VHlwZV1bJ3BocFR5cGUnXSA9PSAnYXJyYXknKSB7CgkJCQkJCSR0aGlzLT54ZGVidWcoJ2FycmF5VHlwZSBmb3IgdW51c3VhbCBhcnJheSBpcyAnIC4gJGF0dHJzWyd0eXBlJ10pOwoJCQkJCQkkdGhpcy0+Y29tcGxleFR5cGVzWyR0aGlzLT5jdXJyZW50Q29tcGxleFR5cGVdWydhcnJheVR5cGUnXSA9ICRhdHRyc1sndHlwZSddOwoJCQkJCX0KCQkJCQkkdGhpcy0+Y3VycmVudEVsZW1lbnQgPSAkYXR0cnNbJ25hbWUnXTsKCQkJCQkkdGhpcy0+ZWxlbWVudHNbICRhdHRyc1snbmFtZSddIF0gPSAkYXR0cnM7CgkJCQkJJHRoaXMtPmVsZW1lbnRzWyAkYXR0cnNbJ25hbWUnXSBdWyd0eXBlQ2xhc3MnXSA9ICdlbGVtZW50JzsKCQkJCQkkZW5hbWUgPSAkYXR0cnNbJ25hbWUnXTsKCQkJCX0gZWxzZWlmKGlzc2V0KCRhdHRyc1sncmVmJ10pKXsKCQkJCQkkdGhpcy0+eGRlYnVnKCJwcm9jZXNzaW5nIGVsZW1lbnQgYXMgcmVmIHRvICIuJGF0dHJzWydyZWYnXSk7CgkJCQkJJHRoaXMtPmN1cnJlbnRFbGVtZW50ID0gInJlZiB0byAiLiRhdHRyc1sncmVmJ107CgkJCQkJJGVuYW1lID0gJHRoaXMtPmdldExvY2FsUGFydCgkYXR0cnNbJ3JlZiddKTsKCQkJCX0gZWxzZSB7CgkJCQkJJHRoaXMtPnhkZWJ1ZygicHJvY2Vzc2luZyB1bnR5cGVkIGVsZW1lbnQgIi4kYXR0cnNbJ25hbWUnXSk7CgkJCQkJJHRoaXMtPmN1cnJlbnRFbGVtZW50ID0gJGF0dHJzWyduYW1lJ107CgkJCQkJJHRoaXMtPmVsZW1lbnRzWyAkYXR0cnNbJ25hbWUnXSBdID0gJGF0dHJzOwoJCQkJCSR0aGlzLT5lbGVtZW50c1sgJGF0dHJzWyduYW1lJ10gXVsndHlwZUNsYXNzJ10gPSAnZWxlbWVudCc7CgkJCQkJJGF0dHJzWyd0eXBlJ10gPSAkdGhpcy0+c2NoZW1hVGFyZ2V0TmFtZXNwYWNlIC4gJzonIC4gJGF0dHJzWyduYW1lJ10gLiAnX0NvbnRhaW5lZFR5cGUnOwoJCQkJCSR0aGlzLT5lbGVtZW50c1sgJGF0dHJzWyduYW1lJ10gXVsndHlwZSddID0gJGF0dHJzWyd0eXBlJ107CgkJCQkJJGVuYW1lID0gJGF0dHJzWyduYW1lJ107CgkJCQl9CgkJCQlpZihpc3NldCgkZW5hbWUpICYmICR0aGlzLT5jdXJyZW50Q29tcGxleFR5cGUpewoJCQkJCSR0aGlzLT5jb21wbGV4VHlwZXNbJHRoaXMtPmN1cnJlbnRDb21wbGV4VHlwZV1bJ2VsZW1lbnRzJ11bJGVuYW1lXSA9ICRhdHRyczsKCQkJCX0KCQkJYnJlYWs7CgkJCWNhc2UgJ2VudW1lcmF0aW9uJzoJLy8JcmVzdHJpY3Rpb24gdmFsdWUgbGlzdCBtZW1iZXIKCQkJCSR0aGlzLT54ZGVidWcoJ2VudW1lcmF0aW9uICcgLiAkYXR0cnNbJ3ZhbHVlJ10pOwoJCQkJaWYgKCR0aGlzLT5jdXJyZW50U2ltcGxlVHlwZSkgewoJCQkJCSR0aGlzLT5zaW1wbGVUeXBlc1skdGhpcy0+Y3VycmVudFNpbXBsZVR5cGVdWydlbnVtZXJhdGlvbiddW10gPSAkYXR0cnNbJ3ZhbHVlJ107CgkJCQl9IGVsc2VpZiAoJHRoaXMtPmN1cnJlbnRDb21wbGV4VHlwZSkgewoJCQkJCSR0aGlzLT5jb21wbGV4VHlwZXNbJHRoaXMtPmN1cnJlbnRDb21wbGV4VHlwZV1bJ2VudW1lcmF0aW9uJ11bXSA9ICRhdHRyc1sndmFsdWUnXTsKCQkJCX0KCQkJYnJlYWs7CgkJCWNhc2UgJ2V4dGVuc2lvbic6CS8vIHNpbXBsZUNvbnRlbnQgb3IgY29tcGxleENvbnRlbnQgdHlwZSBleHRlbnNpb24KCQkJCSR0aGlzLT54ZGVidWcoJ2V4dGVuc2lvbiAnIC4gJGF0dHJzWydiYXNlJ10pOwoJCQkJaWYgKCR0aGlzLT5jdXJyZW50Q29tcGxleFR5cGUpIHsKCQkJCQkkdGhpcy0+Y29tcGxleFR5cGVzWyR0aGlzLT5jdXJyZW50Q29tcGxleFR5cGVdWydleHRlbnNpb25CYXNlJ10gPSAkYXR0cnNbJ2Jhc2UnXTsKCQkJCX0KCQkJYnJlYWs7CgkJCWNhc2UgJ2ltcG9ydCc6CgkJCSAgICBpZiAoaXNzZXQoJGF0dHJzWydzY2hlbWFMb2NhdGlvbiddKSkgewoJCQkJCS8vJHRoaXMtPnhkZWJ1ZygnaW1wb3J0IG5hbWVzcGFjZSAnIC4gJGF0dHJzWyduYW1lc3BhY2UnXSAuICcgZnJvbSAnIC4gJGF0dHJzWydzY2hlbWFMb2NhdGlvbiddKTsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+aW1wb3J0c1skYXR0cnNbJ25hbWVzcGFjZSddXVtdID0gYXJyYXkoJ2xvY2F0aW9uJyA9PiAkYXR0cnNbJ3NjaGVtYUxvY2F0aW9uJ10sICdsb2FkZWQnID0+IGZhbHNlKTsKCQkJCX0gZWxzZSB7CgkJCQkJLy8kdGhpcy0+eGRlYnVnKCdpbXBvcnQgbmFtZXNwYWNlICcgLiAkYXR0cnNbJ25hbWVzcGFjZSddKTsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+aW1wb3J0c1skYXR0cnNbJ25hbWVzcGFjZSddXVtdID0gYXJyYXkoJ2xvY2F0aW9uJyA9PiAnJywgJ2xvYWRlZCcgPT4gdHJ1ZSk7CgkJCQkJaWYgKCEgJHRoaXMtPmdldFByZWZpeEZyb21OYW1lc3BhY2UoJGF0dHJzWyduYW1lc3BhY2UnXSkpIHsKCQkJCQkJJHRoaXMtPm5hbWVzcGFjZXNbJ25zJy4oY291bnQoJHRoaXMtPm5hbWVzcGFjZXMpKzEpXSA9ICRhdHRyc1snbmFtZXNwYWNlJ107CgkJCQkJfQoJCQkJfQoJCQlicmVhazsKCQkJY2FzZSAnbGlzdCc6CS8vIHNpbXBsZVR5cGUgdmFsdWUgbGlzdAoJCQlicmVhazsKCQkJY2FzZSAncmVzdHJpY3Rpb24nOgkvLyBzaW1wbGVUeXBlLCBzaW1wbGVDb250ZW50IG9yIGNvbXBsZXhDb250ZW50IHZhbHVlIHJlc3RyaWN0aW9uCgkJCQkkdGhpcy0+eGRlYnVnKCdyZXN0cmljdGlvbiAnIC4gJGF0dHJzWydiYXNlJ10pOwoJCQkJaWYoJHRoaXMtPmN1cnJlbnRTaW1wbGVUeXBlKXsKCQkJCQkkdGhpcy0+c2ltcGxlVHlwZXNbJHRoaXMtPmN1cnJlbnRTaW1wbGVUeXBlXVsndHlwZSddID0gJGF0dHJzWydiYXNlJ107CgkJCQl9IGVsc2VpZigkdGhpcy0+Y3VycmVudENvbXBsZXhUeXBlKXsKCQkJCQkkdGhpcy0+Y29tcGxleFR5cGVzWyR0aGlzLT5jdXJyZW50Q29tcGxleFR5cGVdWydyZXN0cmljdGlvbkJhc2UnXSA9ICRhdHRyc1snYmFzZSddOwoJCQkJCWlmKHN0cnN0cigkYXR0cnNbJ2Jhc2UnXSwnOicpID09ICc6QXJyYXknKXsKCQkJCQkJJHRoaXMtPmNvbXBsZXhUeXBlc1skdGhpcy0+Y3VycmVudENvbXBsZXhUeXBlXVsncGhwVHlwZSddID0gJ2FycmF5JzsKCQkJCQl9CgkJCQl9CgkJCWJyZWFrOwoJCQljYXNlICdzY2hlbWEnOgoJCQkJJHRoaXMtPnNjaGVtYUluZm8gPSAkYXR0cnM7CgkJCQkkdGhpcy0+c2NoZW1hSW5mb1snc2NoZW1hVmVyc2lvbiddID0gJHRoaXMtPmdldE5hbWVzcGFjZUZyb21QcmVmaXgoJHByZWZpeCk7CgkJCQlpZiAoaXNzZXQoJGF0dHJzWyd0YXJnZXROYW1lc3BhY2UnXSkpIHsKCQkJCQkkdGhpcy0+c2NoZW1hVGFyZ2V0TmFtZXNwYWNlID0gJGF0dHJzWyd0YXJnZXROYW1lc3BhY2UnXTsKCQkJCX0KCQkJCWlmICghaXNzZXQoJGF0dHJzWydlbGVtZW50Rm9ybURlZmF1bHQnXSkpIHsKCQkJCQkkdGhpcy0+c2NoZW1hSW5mb1snZWxlbWVudEZvcm1EZWZhdWx0J10gPSAndW5xdWFsaWZpZWQnOwoJCQkJfQoJCQkJaWYgKCFpc3NldCgkYXR0cnNbJ2F0dHJpYnV0ZUZvcm1EZWZhdWx0J10pKSB7CgkJCQkJJHRoaXMtPnNjaGVtYUluZm9bJ2F0dHJpYnV0ZUZvcm1EZWZhdWx0J10gPSAndW5xdWFsaWZpZWQnOwoJCQkJfQoJCQlicmVhazsKCQkJY2FzZSAnc2ltcGxlQ29udGVudCc6CS8vIChvcHRpb25hbCkgY29udGVudCBmb3IgYSBjb21wbGV4VHlwZQoJCQlicmVhazsKCQkJY2FzZSAnc2ltcGxlVHlwZSc6CgkJCQlhcnJheV9wdXNoKCR0aGlzLT5zaW1wbGVUeXBlU3RhY2ssICR0aGlzLT5jdXJyZW50U2ltcGxlVHlwZSk7CgkJCQlpZihpc3NldCgkYXR0cnNbJ25hbWUnXSkpewoJCQkJCSR0aGlzLT54ZGVidWcoInByb2Nlc3Npbmcgc2ltcGxlVHlwZSBmb3IgbmFtZSAiIC4gJGF0dHJzWyduYW1lJ10pOwoJCQkJCSR0aGlzLT5jdXJyZW50U2ltcGxlVHlwZSA9ICRhdHRyc1snbmFtZSddOwoJCQkJCSR0aGlzLT5zaW1wbGVUeXBlc1sgJGF0dHJzWyduYW1lJ10gXSA9ICRhdHRyczsKCQkJCQkkdGhpcy0+c2ltcGxlVHlwZXNbICRhdHRyc1snbmFtZSddIF1bJ3R5cGVDbGFzcyddID0gJ3NpbXBsZVR5cGUnOwoJCQkJCSR0aGlzLT5zaW1wbGVUeXBlc1sgJGF0dHJzWyduYW1lJ10gXVsncGhwVHlwZSddID0gJ3NjYWxhcic7CgkJCQl9IGVsc2UgewoJCQkJCSR0aGlzLT54ZGVidWcoJ3Byb2Nlc3NpbmcgdW5uYW1lZCBzaW1wbGVUeXBlIGZvciBlbGVtZW50ICcuJHRoaXMtPmN1cnJlbnRFbGVtZW50KTsKCQkJCQkkdGhpcy0+Y3VycmVudFNpbXBsZVR5cGUgPSAkdGhpcy0+Y3VycmVudEVsZW1lbnQgLiAnX0NvbnRhaW5lZFR5cGUnOwoJCQkJCS8vJHRoaXMtPmN1cnJlbnRFbGVtZW50ID0gZmFsc2U7CgkJCQkJJHRoaXMtPnNpbXBsZVR5cGVzWyR0aGlzLT5jdXJyZW50U2ltcGxlVHlwZV0gPSAkYXR0cnM7CgkJCQkJJHRoaXMtPnNpbXBsZVR5cGVzWyR0aGlzLT5jdXJyZW50U2ltcGxlVHlwZV1bJ3BocFR5cGUnXSA9ICdzY2FsYXInOwoJCQkJfQoJCQlicmVhazsKCQkJY2FzZSAndW5pb24nOgkvLyBzaW1wbGVUeXBlIHR5cGUgbGlzdAoJCQlicmVhazsKCQkJZGVmYXVsdDoKCQkJCS8vJHRoaXMtPnhkZWJ1ZygiZG8gbm90IGhhdmUgYW55dGhpbmcgdG8gZG8gZm9yIGVsZW1lbnQgJG5hbWUiKTsKCQl9Cgl9CgoJLyoqCgkqIGVuZC1lbGVtZW50IGhhbmRsZXIKCSoKCSogQHBhcmFtICAgIHN0cmluZyAkcGFyc2VyIFhNTCBwYXJzZXIgb2JqZWN0CgkqIEBwYXJhbSAgICBzdHJpbmcgJG5hbWUgZWxlbWVudCBuYW1lCgkqIEBhY2Nlc3MgICBwcml2YXRlCgkqLwoJZnVuY3Rpb24gc2NoZW1hRW5kRWxlbWVudCgkcGFyc2VyLCAkbmFtZSkgewoJCS8vIGJyaW5nIGRlcHRoIGRvd24gYSBub3RjaAoJCSR0aGlzLT5kZXB0aC0tOwoJCS8vIHBvc2l0aW9uIG9mIGN1cnJlbnQgZWxlbWVudCBpcyBlcXVhbCB0byB0aGUgbGFzdCB2YWx1ZSBsZWZ0IGluIGRlcHRoX2FycmF5IGZvciBteSBkZXB0aAoJCWlmKGlzc2V0KCR0aGlzLT5kZXB0aF9hcnJheVskdGhpcy0+ZGVwdGhdKSl7CiAgICAgICAgCSRwb3MgPSAkdGhpcy0+ZGVwdGhfYXJyYXlbJHRoaXMtPmRlcHRoXTsKICAgICAgICB9CgkJLy8gZ2V0IGVsZW1lbnQgcHJlZml4CgkJaWYgKCRwcmVmaXggPSAkdGhpcy0+Z2V0UHJlZml4KCRuYW1lKSl7CgkJCS8vIGdldCB1bnF1YWxpZmllZCBuYW1lCgkJCSRuYW1lID0gJHRoaXMtPmdldExvY2FsUGFydCgkbmFtZSk7CgkJfSBlbHNlIHsKICAgICAgICAJJHByZWZpeCA9ICcnOwogICAgICAgIH0KCQkvLyBtb3ZlIG9uLi4uCgkJaWYoJG5hbWUgPT0gJ2NvbXBsZXhUeXBlJyl7CgkJCSR0aGlzLT54ZGVidWcoJ2RvbmUgcHJvY2Vzc2luZyBjb21wbGV4VHlwZSAnIC4gKCR0aGlzLT5jdXJyZW50Q29tcGxleFR5cGUgPyAkdGhpcy0+Y3VycmVudENvbXBsZXhUeXBlIDogJyh1bmtub3duKScpKTsKCQkJJHRoaXMtPmN1cnJlbnRDb21wbGV4VHlwZSA9IGFycmF5X3BvcCgkdGhpcy0+Y29tcGxleFR5cGVTdGFjayk7CgkJCS8vJHRoaXMtPmN1cnJlbnRFbGVtZW50ID0gZmFsc2U7CgkJfQoJCWlmKCRuYW1lID09ICdlbGVtZW50Jyl7CgkJCSR0aGlzLT54ZGVidWcoJ2RvbmUgcHJvY2Vzc2luZyBlbGVtZW50ICcgLiAoJHRoaXMtPmN1cnJlbnRFbGVtZW50ID8gJHRoaXMtPmN1cnJlbnRFbGVtZW50IDogJyh1bmtub3duKScpKTsKCQkJJHRoaXMtPmN1cnJlbnRFbGVtZW50ID0gYXJyYXlfcG9wKCR0aGlzLT5lbGVtZW50U3RhY2spOwoJCX0KCQlpZigkbmFtZSA9PSAnc2ltcGxlVHlwZScpewoJCQkkdGhpcy0+eGRlYnVnKCdkb25lIHByb2Nlc3Npbmcgc2ltcGxlVHlwZSAnIC4gKCR0aGlzLT5jdXJyZW50U2ltcGxlVHlwZSA/ICR0aGlzLT5jdXJyZW50U2ltcGxlVHlwZSA6ICcodW5rbm93biknKSk7CgkJCSR0aGlzLT5jdXJyZW50U2ltcGxlVHlwZSA9IGFycmF5X3BvcCgkdGhpcy0+c2ltcGxlVHlwZVN0YWNrKTsKCQl9Cgl9CgoJLyoqCgkqIGVsZW1lbnQgY29udGVudCBoYW5kbGVyCgkqCgkqIEBwYXJhbSAgICBzdHJpbmcgJHBhcnNlciBYTUwgcGFyc2VyIG9iamVjdAoJKiBAcGFyYW0gICAgc3RyaW5nICRkYXRhIGVsZW1lbnQgY29udGVudAoJKiBAYWNjZXNzICAgcHJpdmF0ZQoJKi8KCWZ1bmN0aW9uIHNjaGVtYUNoYXJhY3RlckRhdGEoJHBhcnNlciwgJGRhdGEpewoJCSRwb3MgPSAkdGhpcy0+ZGVwdGhfYXJyYXlbJHRoaXMtPmRlcHRoIC0gMV07CgkJJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ2NkYXRhJ10gLj0gJGRhdGE7Cgl9CgoJLyoqCgkqIHNlcmlhbGl6ZSB0aGUgc2NoZW1hCgkqCgkqIEBhY2Nlc3MgICBwdWJsaWMKCSovCglmdW5jdGlvbiBzZXJpYWxpemVTY2hlbWEoKXsKCgkJJHNjaGVtYVByZWZpeCA9ICR0aGlzLT5nZXRQcmVmaXhGcm9tTmFtZXNwYWNlKCR0aGlzLT5YTUxTY2hlbWFWZXJzaW9uKTsKCQkkeG1sID0gJyc7CgkJLy8gaW1wb3J0cwoJCWlmIChzaXplb2YoJHRoaXMtPmltcG9ydHMpID4gMCkgewoJCQlmb3JlYWNoKCR0aGlzLT5pbXBvcnRzIGFzICRucyA9PiAkbGlzdCkgewoJCQkJZm9yZWFjaCAoJGxpc3QgYXMgJGlpKSB7CgkJCQkJaWYgKCRpaVsnbG9jYXRpb24nXSAhPSAnJykgewoJCQkJCQkkeG1sIC49ICIgPCRzY2hlbWFQcmVmaXg6aW1wb3J0IGxvY2F0aW9uPVwiIiAuICRpaVsnbG9jYXRpb24nXSAuICciIG5hbWVzcGFjZT0iJyAuICRucyAuICJcIiAvPlxuIjsKCQkJCQl9IGVsc2UgewoJCQkJCQkkeG1sIC49ICIgPCRzY2hlbWFQcmVmaXg6aW1wb3J0IG5hbWVzcGFjZT1cIiIgLiAkbnMgLiAiXCIgLz5cbiI7CgkJCQkJfQoJCQkJfQoJCQl9IAoJCX0gCgkJLy8gY29tcGxleCB0eXBlcwoJCWZvcmVhY2goJHRoaXMtPmNvbXBsZXhUeXBlcyBhcyAkdHlwZU5hbWUgPT4gJGF0dHJzKXsKCQkJJGNvbnRlbnRTdHIgPSAnJzsKCQkJLy8gc2VyaWFsaXplIGNoaWxkIGVsZW1lbnRzCgkJCWlmKGlzc2V0KCRhdHRyc1snZWxlbWVudHMnXSkgJiYgKGNvdW50KCRhdHRyc1snZWxlbWVudHMnXSkgPiAwKSl7CgkJCQlmb3JlYWNoKCRhdHRyc1snZWxlbWVudHMnXSBhcyAkZWxlbWVudCA9PiAkZVBhcnRzKXsKCQkJCQlpZihpc3NldCgkZVBhcnRzWydyZWYnXSkpewoJCQkJCQkkY29udGVudFN0ciAuPSAiICAgPCRzY2hlbWFQcmVmaXg6ZWxlbWVudCByZWY9XCIkZWxlbWVudFwiLz5cbiI7CgkJCQkJfSBlbHNlIHsKCQkJCQkJJGNvbnRlbnRTdHIgLj0gIiAgIDwkc2NoZW1hUHJlZml4OmVsZW1lbnQgbmFtZT1cIiRlbGVtZW50XCIgdHlwZT1cIiIgLiAkdGhpcy0+Y29udHJhY3RRTmFtZSgkZVBhcnRzWyd0eXBlJ10pIC4gIlwiIjsKCQkJCQkJZm9yZWFjaCAoJGVQYXJ0cyBhcyAkYU5hbWUgPT4gJGFWYWx1ZSkgewoJCQkJCQkJLy8gaGFuZGxlLCBlLmcuLCBhYnN0cmFjdCwgZGVmYXVsdCwgZm9ybSwgbWluT2NjdXJzLCBtYXhPY2N1cnMsIG5pbGxhYmxlCgkJCQkJCQlpZiAoJGFOYW1lICE9ICduYW1lJyAmJiAkYU5hbWUgIT0gJ3R5cGUnKSB7CgkJCQkJCQkJJGNvbnRlbnRTdHIgLj0gIiAkYU5hbWU9XCIkYVZhbHVlXCIiOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCSRjb250ZW50U3RyIC49ICIvPlxuIjsKCQkJCQl9CgkJCQl9CgkJCQkvLyBjb21wb3NpdG9yIHdyYXBzIGVsZW1lbnRzCgkJCQlpZiAoaXNzZXQoJGF0dHJzWydjb21wb3NpdG9yJ10pICYmICgkYXR0cnNbJ2NvbXBvc2l0b3InXSAhPSAnJykpIHsKCQkJCQkkY29udGVudFN0ciA9ICIgIDwkc2NoZW1hUHJlZml4OiRhdHRyc1tjb21wb3NpdG9yXT5cbiIuJGNvbnRlbnRTdHIuIiAgPC8kc2NoZW1hUHJlZml4OiRhdHRyc1tjb21wb3NpdG9yXT5cbiI7CgkJCQl9CgkJCX0KCQkJLy8gYXR0cmlidXRlcwoJCQlpZihpc3NldCgkYXR0cnNbJ2F0dHJzJ10pICYmIChjb3VudCgkYXR0cnNbJ2F0dHJzJ10pID49IDEpKXsKCQkJCWZvcmVhY2goJGF0dHJzWydhdHRycyddIGFzICRhdHRyID0+ICRhUGFydHMpewoJCQkJCSRjb250ZW50U3RyIC49ICIgICAgPCRzY2hlbWFQcmVmaXg6YXR0cmlidXRlIjsKCQkJCQlmb3JlYWNoICgkYVBhcnRzIGFzICRhID0+ICR2KSB7CgkJCQkJCWlmICgkYSA9PSAncmVmJyB8fCAkYSA9PSAndHlwZScpIHsKCQkJCQkJCSRjb250ZW50U3RyIC49ICIgJGE9XCIiLiR0aGlzLT5jb250cmFjdFFOYW1lKCR2KS4nIic7CgkJCQkJCX0gZWxzZWlmICgkYSA9PSAnaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC86YXJyYXlUeXBlJykgewoJCQkJCQkJJHRoaXMtPnVzZWROYW1lc3BhY2VzWyd3c2RsJ10gPSAkdGhpcy0+bmFtZXNwYWNlc1snd3NkbCddOwoJCQkJCQkJJGNvbnRlbnRTdHIgLj0gJyB3c2RsOmFycmF5VHlwZT0iJy4kdGhpcy0+Y29udHJhY3RRTmFtZSgkdikuJyInOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJJGNvbnRlbnRTdHIgLj0gIiAkYT1cIiR2XCIiOwoJCQkJCQl9CgkJCQkJfQoJCQkJCSRjb250ZW50U3RyIC49ICIvPlxuIjsKCQkJCX0KCQkJfQoJCQkvLyBpZiByZXN0cmljdGlvbgoJCQlpZiAoaXNzZXQoJGF0dHJzWydyZXN0cmljdGlvbkJhc2UnXSkgJiYgJGF0dHJzWydyZXN0cmljdGlvbkJhc2UnXSAhPSAnJyl7CgkJCQkkY29udGVudFN0ciA9ICIgICA8JHNjaGVtYVByZWZpeDpyZXN0cmljdGlvbiBiYXNlPVwiIi4kdGhpcy0+Y29udHJhY3RRTmFtZSgkYXR0cnNbJ3Jlc3RyaWN0aW9uQmFzZSddKS4iXCI+XG4iLiRjb250ZW50U3RyLiIgICA8LyRzY2hlbWFQcmVmaXg6cmVzdHJpY3Rpb24+XG4iOwoJCQkJLy8gY29tcGxleCBvciBzaW1wbGUgY29udGVudAoJCQkJaWYgKChpc3NldCgkYXR0cnNbJ2VsZW1lbnRzJ10pICYmIGNvdW50KCRhdHRyc1snZWxlbWVudHMnXSkgPiAwKSB8fCAoaXNzZXQoJGF0dHJzWydhdHRycyddKSAmJiBjb3VudCgkYXR0cnNbJ2F0dHJzJ10pID4gMCkpewoJCQkJCSRjb250ZW50U3RyID0gIiAgPCRzY2hlbWFQcmVmaXg6Y29tcGxleENvbnRlbnQ+XG4iLiRjb250ZW50U3RyLiIgIDwvJHNjaGVtYVByZWZpeDpjb21wbGV4Q29udGVudD5cbiI7CgkJCQl9CgkJCX0KCQkJLy8gZmluYWxpemUgY29tcGxleCB0eXBlCgkJCWlmKCRjb250ZW50U3RyICE9ICcnKXsKCQkJCSRjb250ZW50U3RyID0gIiA8JHNjaGVtYVByZWZpeDpjb21wbGV4VHlwZSBuYW1lPVwiJHR5cGVOYW1lXCI+XG4iLiRjb250ZW50U3RyLiIgPC8kc2NoZW1hUHJlZml4OmNvbXBsZXhUeXBlPlxuIjsKCQkJfSBlbHNlIHsKCQkJCSRjb250ZW50U3RyID0gIiA8JHNjaGVtYVByZWZpeDpjb21wbGV4VHlwZSBuYW1lPVwiJHR5cGVOYW1lXCIvPlxuIjsKCQkJfQoJCQkkeG1sIC49ICRjb250ZW50U3RyOwoJCX0KCQkvLyBzaW1wbGUgdHlwZXMKCQlpZihpc3NldCgkdGhpcy0+c2ltcGxlVHlwZXMpICYmIGNvdW50KCR0aGlzLT5zaW1wbGVUeXBlcykgPiAwKXsKCQkJZm9yZWFjaCgkdGhpcy0+c2ltcGxlVHlwZXMgYXMgJHR5cGVOYW1lID0+ICRlUGFydHMpewoJCQkJJHhtbCAuPSAiIDwkc2NoZW1hUHJlZml4OnNpbXBsZVR5cGUgbmFtZT1cIiR0eXBlTmFtZVwiPlxuICA8JHNjaGVtYVByZWZpeDpyZXN0cmljdGlvbiBiYXNlPVwiIi4kdGhpcy0+Y29udHJhY3RRTmFtZSgkZVBhcnRzWyd0eXBlJ10pLiJcIi8+XG4iOwoJCQkJaWYgKGlzc2V0KCRlUGFydHNbJ2VudW1lcmF0aW9uJ10pKSB7CgkJCQkJZm9yZWFjaCAoJGVQYXJ0c1snZW51bWVyYXRpb24nXSBhcyAkZSkgewoJCQkJCQkkeG1sIC49ICIgIDwkc2NoZW1hUHJlZml4OmVudW1lcmF0aW9uIHZhbHVlPVwiJGVcIi8+XG4iOwoJCQkJCX0KCQkJCX0KCQkJCSR4bWwgLj0gIiA8LyRzY2hlbWFQcmVmaXg6c2ltcGxlVHlwZT4iOwoJCQl9CgkJfQoJCS8vIGVsZW1lbnRzCgkJaWYoaXNzZXQoJHRoaXMtPmVsZW1lbnRzKSAmJiBjb3VudCgkdGhpcy0+ZWxlbWVudHMpID4gMCl7CgkJCWZvcmVhY2goJHRoaXMtPmVsZW1lbnRzIGFzICRlbGVtZW50ID0+ICRlUGFydHMpewoJCQkJJHhtbCAuPSAiIDwkc2NoZW1hUHJlZml4OmVsZW1lbnQgbmFtZT1cIiRlbGVtZW50XCIgdHlwZT1cIiIuJHRoaXMtPmNvbnRyYWN0UU5hbWUoJGVQYXJ0c1sndHlwZSddKS4iXCIvPlxuIjsKCQkJfQoJCX0KCQkvLyBhdHRyaWJ1dGVzCgkJaWYoaXNzZXQoJHRoaXMtPmF0dHJpYnV0ZXMpICYmIGNvdW50KCR0aGlzLT5hdHRyaWJ1dGVzKSA+IDApewoJCQlmb3JlYWNoKCR0aGlzLT5hdHRyaWJ1dGVzIGFzICRhdHRyID0+ICRhUGFydHMpewoJCQkJJHhtbCAuPSAiIDwkc2NoZW1hUHJlZml4OmF0dHJpYnV0ZSBuYW1lPVwiJGF0dHJcIiB0eXBlPVwiIi4kdGhpcy0+Y29udHJhY3RRTmFtZSgkYVBhcnRzWyd0eXBlJ10pLiJcIlxuLz4iOwoJCQl9CgkJfQoJCS8vIGZpbmlzaCAnZXIgdXAKCQkkZWwgPSAiPCRzY2hlbWFQcmVmaXg6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT1cIiR0aGlzLT5zY2hlbWFUYXJnZXROYW1lc3BhY2VcIlxuIjsKCQlmb3JlYWNoIChhcnJheV9kaWZmKCR0aGlzLT51c2VkTmFtZXNwYWNlcywgJHRoaXMtPmVuY2xvc2luZ05hbWVzcGFjZXMpIGFzICRuc3AgPT4gJG5zKSB7CgkJCSRlbCAuPSAiIHhtbG5zOiRuc3A9XCIkbnNcIlxuIjsKCQl9CgkJJHhtbCA9ICRlbCAuICI+XG4iLiR4bWwuIjwvJHNjaGVtYVByZWZpeDpzY2hlbWE+XG4iOwoJCXJldHVybiAkeG1sOwoJfQoKCS8qKgoJKiBhZGRzIGRlYnVnIGRhdGEgdG8gdGhlIGNsYXMgbGV2ZWwgZGVidWcgc3RyaW5nCgkqCgkqIEBwYXJhbSAgICBzdHJpbmcgJHN0cmluZyBkZWJ1ZyBkYXRhCgkqIEBhY2Nlc3MgICBwcml2YXRlCgkqLwoJZnVuY3Rpb24geGRlYnVnKCRzdHJpbmcpewoJCSR0aGlzLT5kZWJ1ZygnPCcgLiAkdGhpcy0+c2NoZW1hVGFyZ2V0TmFtZXNwYWNlIC4gJz4gJy4kc3RyaW5nKTsKCX0KCiAgICAvKioKICAgICogZ2V0IHRoZSBQSFAgdHlwZSBvZiBhIHVzZXIgZGVmaW5lZCB0eXBlIGluIHRoZSBzY2hlbWEKICAgICogUEhQIHR5cGUgaXMga2luZCBvZiBhIG1pc25vbWVyIHNpbmNlIGl0IGFjdHVhbGx5IHJldHVybnMgJ3N0cnVjdCcgZm9yIGFzc29jLiBhcnJheXMKICAgICogcmV0dXJucyBmYWxzZSBpZiBubyB0eXBlIGV4aXN0cywgb3Igbm90IHcvIHRoZSBnaXZlbiBuYW1lc3BhY2UKICAgICogZWxzZSByZXR1cm5zIGEgc3RyaW5nIHRoYXQgaXMgZWl0aGVyIGEgbmF0aXZlIHBocCB0eXBlLCBvciAnc3RydWN0JwogICAgKgogICAgKiBAcGFyYW0gc3RyaW5nICR0eXBlLCBuYW1lIG9mIGRlZmluZWQgdHlwZQogICAgKiBAcGFyYW0gc3RyaW5nICRucywgbmFtZXNwYWNlIG9mIHR5cGUKICAgICogQHJldHVybiBtaXhlZAogICAgKiBAYWNjZXNzIHB1YmxpYwogICAgKiBAZGVwcmVjYXRlZAogICAgKi8KCWZ1bmN0aW9uIGdldFBIUFR5cGUoJHR5cGUsJG5zKXsKCQlpZihpc3NldCgkdGhpcy0+dHlwZW1hcFskbnNdWyR0eXBlXSkpewoJCQkvL3ByaW50ICJmb3VuZCB0eXBlICckdHlwZScgYW5kIG5zICRucyBpbiB0eXBlbWFwPGJyPiI7CgkJCXJldHVybiAkdGhpcy0+dHlwZW1hcFskbnNdWyR0eXBlXTsKCQl9IGVsc2VpZihpc3NldCgkdGhpcy0+Y29tcGxleFR5cGVzWyR0eXBlXSkpewoJCQkvL3ByaW50ICJnZXR0aW5nIHR5cGUgJyR0eXBlJyBhbmQgbnMgJG5zIGZyb20gY29tcGxleFR5cGVzIGFycmF5PGJyPiI7CgkJCXJldHVybiAkdGhpcy0+Y29tcGxleFR5cGVzWyR0eXBlXVsncGhwVHlwZSddOwoJCX0KCQlyZXR1cm4gZmFsc2U7Cgl9CgoJLyoqCiAgICAqIHJldHVybnMgYW4gYXNzb2NpYXRpdmUgYXJyYXkgb2YgaW5mb3JtYXRpb24gYWJvdXQgYSBnaXZlbiB0eXBlCiAgICAqIHJldHVybnMgZmFsc2UgaWYgbm8gdHlwZSBleGlzdHMgYnkgdGhlIGdpdmVuIG5hbWUKICAgICoKCSoJRm9yIGEgY29tcGxleFR5cGUgdHlwZURlZiA9IGFycmF5KAoJKgkncmVzdHJpY3Rpb25CYXNlJyA9PiAnJywKCSoJJ3BocFR5cGUnID0+ICcnLAoJKgknY29tcG9zaXRvcicgPT4gJyhzZXF1ZW5jZXxhbGwpJywKCSoJJ2VsZW1lbnRzJyA9PiBhcnJheSgpLCAvLyByZWZzIHRvIGVsZW1lbnRzIGFycmF5CgkqCSdhdHRycycgPT4gYXJyYXkoKSAvLyByZWZzIHRvIGF0dHJpYnV0ZXMgYXJyYXkKCSoJLi4uIGFuZCBzbyBvbiAoc2VlIGFkZENvbXBsZXhUeXBlKQoJKgkpCgkqCgkqICAgRm9yIHNpbXBsZVR5cGUgb3IgZWxlbWVudCwgdGhlIGFycmF5IGhhcyBkaWZmZXJlbnQga2V5cy4KICAgICoKICAgICogQHBhcmFtIHN0cmluZwogICAgKiBAcmV0dXJuIG1peGVkCiAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAqIEBzZWUgYWRkQ29tcGxleFR5cGUKICAgICogQHNlZSBhZGRTaW1wbGVUeXBlCiAgICAqIEBzZWUgYWRkRWxlbWVudAogICAgKi8KCWZ1bmN0aW9uIGdldFR5cGVEZWYoJHR5cGUpewoJCS8vJHRoaXMtPmRlYnVnKCJpbiBnZXRUeXBlRGVmIGZvciB0eXBlICR0eXBlIik7CgkJaWYoaXNzZXQoJHRoaXMtPmNvbXBsZXhUeXBlc1skdHlwZV0pKXsKCQkJJHRoaXMtPnhkZWJ1ZygiaW4gZ2V0VHlwZURlZiwgZm91bmQgY29tcGxleFR5cGUgJHR5cGUiKTsKCQkJcmV0dXJuICR0aGlzLT5jb21wbGV4VHlwZXNbJHR5cGVdOwoJCX0gZWxzZWlmKGlzc2V0KCR0aGlzLT5zaW1wbGVUeXBlc1skdHlwZV0pKXsKCQkJJHRoaXMtPnhkZWJ1ZygiaW4gZ2V0VHlwZURlZiwgZm91bmQgc2ltcGxlVHlwZSAkdHlwZSIpOwoJCQlpZiAoIWlzc2V0KCR0aGlzLT5zaW1wbGVUeXBlc1skdHlwZV1bJ3BocFR5cGUnXSkpIHsKCQkJCS8vIGdldCBpbmZvIGZvciB0eXBlIHRvIHRhY2sgb250byB0aGUgc2ltcGxlIHR5cGUKCQkJCS8vIFRPRE86IGNhbiB0aGlzIGV2ZXIgcmVhbGx5IGFwcGx5IChpLmUuIHdoYXQgaXMgYSBzaW1wbGVUeXBlIHJlYWxseT8pCgkJCQkkdXFUeXBlID0gc3Vic3RyKCR0aGlzLT5zaW1wbGVUeXBlc1skdHlwZV1bJ3R5cGUnXSwgc3RycnBvcygkdGhpcy0+c2ltcGxlVHlwZXNbJHR5cGVdWyd0eXBlJ10sICc6JykgKyAxKTsKCQkJCSRucyA9IHN1YnN0cigkdGhpcy0+c2ltcGxlVHlwZXNbJHR5cGVdWyd0eXBlJ10sIDAsIHN0cnJwb3MoJHRoaXMtPnNpbXBsZVR5cGVzWyR0eXBlXVsndHlwZSddLCAnOicpKTsKCQkJCSRldHlwZSA9ICR0aGlzLT5nZXRUeXBlRGVmKCR1cVR5cGUpOwoJCQkJaWYgKCRldHlwZSkgewoJCQkJCSR0aGlzLT54ZGVidWcoImluIGdldFR5cGVEZWYsIGZvdW5kIHR5cGUgZm9yIHNpbXBsZVR5cGUgJHR5cGU6Iik7CgkJCQkJJHRoaXMtPnhkZWJ1ZygkdGhpcy0+dmFyRHVtcCgkZXR5cGUpKTsKCQkJCQlpZiAoaXNzZXQoJGV0eXBlWydwaHBUeXBlJ10pKSB7CgkJCQkJCSR0aGlzLT5zaW1wbGVUeXBlc1skdHlwZV1bJ3BocFR5cGUnXSA9ICRldHlwZVsncGhwVHlwZSddOwoJCQkJCX0KCQkJCQlpZiAoaXNzZXQoJGV0eXBlWydlbGVtZW50cyddKSkgewoJCQkJCQkkdGhpcy0+c2ltcGxlVHlwZXNbJHR5cGVdWydlbGVtZW50cyddID0gJGV0eXBlWydlbGVtZW50cyddOwoJCQkJCX0KCQkJCX0KCQkJfQoJCQlyZXR1cm4gJHRoaXMtPnNpbXBsZVR5cGVzWyR0eXBlXTsKCQl9IGVsc2VpZihpc3NldCgkdGhpcy0+ZWxlbWVudHNbJHR5cGVdKSl7CgkJCSR0aGlzLT54ZGVidWcoImluIGdldFR5cGVEZWYsIGZvdW5kIGVsZW1lbnQgJHR5cGUiKTsKCQkJaWYgKCFpc3NldCgkdGhpcy0+ZWxlbWVudHNbJHR5cGVdWydwaHBUeXBlJ10pKSB7CgkJCQkvLyBnZXQgaW5mbyBmb3IgdHlwZSB0byB0YWNrIG9udG8gdGhlIGVsZW1lbnQKCQkJCSR1cVR5cGUgPSBzdWJzdHIoJHRoaXMtPmVsZW1lbnRzWyR0eXBlXVsndHlwZSddLCBzdHJycG9zKCR0aGlzLT5lbGVtZW50c1skdHlwZV1bJ3R5cGUnXSwgJzonKSArIDEpOwoJCQkJJG5zID0gc3Vic3RyKCR0aGlzLT5lbGVtZW50c1skdHlwZV1bJ3R5cGUnXSwgMCwgc3RycnBvcygkdGhpcy0+ZWxlbWVudHNbJHR5cGVdWyd0eXBlJ10sICc6JykpOwoJCQkJJGV0eXBlID0gJHRoaXMtPmdldFR5cGVEZWYoJHVxVHlwZSk7CgkJCQlpZiAoJGV0eXBlKSB7CgkJCQkJJHRoaXMtPnhkZWJ1ZygiaW4gZ2V0VHlwZURlZiwgZm91bmQgdHlwZSBmb3IgZWxlbWVudCAkdHlwZToiKTsKCQkJCQkkdGhpcy0+eGRlYnVnKCR0aGlzLT52YXJEdW1wKCRldHlwZSkpOwoJCQkJCWlmIChpc3NldCgkZXR5cGVbJ3BocFR5cGUnXSkpIHsKCQkJCQkJJHRoaXMtPmVsZW1lbnRzWyR0eXBlXVsncGhwVHlwZSddID0gJGV0eXBlWydwaHBUeXBlJ107CgkJCQkJfQoJCQkJCWlmIChpc3NldCgkZXR5cGVbJ2VsZW1lbnRzJ10pKSB7CgkJCQkJCSR0aGlzLT5lbGVtZW50c1skdHlwZV1bJ2VsZW1lbnRzJ10gPSAkZXR5cGVbJ2VsZW1lbnRzJ107CgkJCQkJfQoJCQkJfSBlbHNlaWYgKCRucyA9PSAnaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnKSB7CgkJCQkJJHRoaXMtPnhkZWJ1ZygiaW4gZ2V0VHlwZURlZiwgZWxlbWVudCAkdHlwZSBpcyBhbiBYU0QgdHlwZSIpOwoJCQkJCSR0aGlzLT5lbGVtZW50c1skdHlwZV1bJ3BocFR5cGUnXSA9ICdzY2FsYXInOwoJCQkJfQoJCQl9CgkJCXJldHVybiAkdGhpcy0+ZWxlbWVudHNbJHR5cGVdOwoJCX0gZWxzZWlmKGlzc2V0KCR0aGlzLT5hdHRyaWJ1dGVzWyR0eXBlXSkpewoJCQkkdGhpcy0+eGRlYnVnKCJpbiBnZXRUeXBlRGVmLCBmb3VuZCBhdHRyaWJ1dGUgJHR5cGUiKTsKCQkJcmV0dXJuICR0aGlzLT5hdHRyaWJ1dGVzWyR0eXBlXTsKCQl9IGVsc2VpZiAoZXJlZygnX0NvbnRhaW5lZFR5cGUkJywgJHR5cGUpKSB7CgkJCSR0aGlzLT54ZGVidWcoImluIGdldFR5cGVEZWYsIGhhdmUgYW4gdW50eXBlZCBlbGVtZW50ICR0eXBlIik7CgkJCSR0eXBlRGVmWyd0eXBlQ2xhc3MnXSA9ICdzaW1wbGVUeXBlJzsKCQkJJHR5cGVEZWZbJ3BocFR5cGUnXSA9ICdzY2FsYXInOwoJCQkkdHlwZURlZlsndHlwZSddID0gJ2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hOnN0cmluZyc7CgkJCXJldHVybiAkdHlwZURlZjsKCQl9CgkJJHRoaXMtPnhkZWJ1ZygiaW4gZ2V0VHlwZURlZiwgZGlkIG5vdCBmaW5kICR0eXBlIik7CgkJcmV0dXJuIGZhbHNlOwoJfQoKCS8qKgogICAgKiByZXR1cm5zIGEgc2FtcGxlIHNlcmlhbGl6YXRpb24gb2YgYSBnaXZlbiB0eXBlLCBvciBmYWxzZSBpZiBubyB0eXBlIGJ5IHRoZSBnaXZlbiBuYW1lCiAgICAqCiAgICAqIEBwYXJhbSBzdHJpbmcgJHR5cGUsIG5hbWUgb2YgdHlwZQogICAgKiBAcmV0dXJuIG1peGVkCiAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAqIEBkZXByZWNhdGVkCiAgICAqLwogICAgZnVuY3Rpb24gc2VyaWFsaXplVHlwZURlZigkdHlwZSl7CiAgICAJLy9wcmludCAiaW4gc1REKCkgZm9yIHR5cGUgJHR5cGU8YnI+IjsKCWlmKCR0eXBlRGVmID0gJHRoaXMtPmdldFR5cGVEZWYoJHR5cGUpKXsKCQkkc3RyIC49ICc8Jy4kdHlwZTsKCSAgICBpZihpc19hcnJheSgkdHlwZURlZlsnYXR0cnMnXSkpewoJCWZvcmVhY2goJGF0dHJzIGFzICRhdHROYW1lID0+ICRkYXRhKXsKCQkgICAgJHN0ciAuPSAiICRhdHROYW1lPVwie3R5cGUgPSAiLiRkYXRhWyd0eXBlJ10uIn1cIiI7CgkJfQoJICAgIH0KCSAgICAkc3RyIC49ICIgeG1sbnM9XCIiLiR0aGlzLT5zY2hlbWFbJ3RhcmdldE5hbWVzcGFjZSddLiJcIiI7CgkgICAgaWYoY291bnQoJHR5cGVEZWZbJ2VsZW1lbnRzJ10pID4gMCl7CgkJJHN0ciAuPSAiPiI7CgkJZm9yZWFjaCgkdHlwZURlZlsnZWxlbWVudHMnXSBhcyAkZWxlbWVudCA9PiAkZURhdGEpewoJCSAgICAkc3RyIC49ICR0aGlzLT5zZXJpYWxpemVUeXBlRGVmKCRlbGVtZW50KTsKCQl9CgkJJHN0ciAuPSAiPC8kdHlwZT4iOwoJICAgIH0gZWxzZWlmKCR0eXBlRGVmWyd0eXBlQ2xhc3MnXSA9PSAnZWxlbWVudCcpIHsKCQkkc3RyIC49ICI+PC8kdHlwZT4iOwoJICAgIH0gZWxzZSB7CgkJJHN0ciAuPSAiLz4iOwoJICAgIH0KCQkJcmV0dXJuICRzdHI7Cgl9CiAgICAJcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8qKgogICAgKiByZXR1cm5zIEhUTUwgZm9ybSBlbGVtZW50cyB0aGF0IGFsbG93IGEgdXNlcgogICAgKiB0byBlbnRlciB2YWx1ZXMgZm9yIGNyZWF0aW5nIGFuIGluc3RhbmNlIG9mIHRoZSBnaXZlbiB0eXBlLgogICAgKgogICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lLCBuYW1lIGZvciB0eXBlIGluc3RhbmNlCiAgICAqIEBwYXJhbSBzdHJpbmcgJHR5cGUsIG5hbWUgb2YgdHlwZQogICAgKiBAcmV0dXJuIHN0cmluZwogICAgKiBAYWNjZXNzIHB1YmxpYwogICAgKiBAZGVwcmVjYXRlZAoJKi8KCWZ1bmN0aW9uIHR5cGVUb0Zvcm0oJG5hbWUsJHR5cGUpewoJCS8vIGdldCB0eXBlZGVmCgkJaWYoJHR5cGVEZWYgPSAkdGhpcy0+Z2V0VHlwZURlZigkdHlwZSkpewoJCQkvLyBpZiBzdHJ1Y3QKCQkJaWYoJHR5cGVEZWZbJ3BocFR5cGUnXSA9PSAnc3RydWN0Jyl7CgkJCQkkYnVmZmVyIC49ICc8dGFibGU+JzsKCQkJCWZvcmVhY2goJHR5cGVEZWZbJ2VsZW1lbnRzJ10gYXMgJGNoaWxkID0+ICRjaGlsZERlZil7CgkJCQkJJGJ1ZmZlciAuPSAiCgkJCQkJPHRyPjx0ZCBhbGlnbj0ncmlnaHQnPiRjaGlsZERlZltuYW1lXSAodHlwZTogIi4kdGhpcy0+Z2V0TG9jYWxQYXJ0KCRjaGlsZERlZlsndHlwZSddKS4iKTo8L3RkPgoJCQkJCTx0ZD48aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0ncGFyYW1ldGVyc1siLiRuYW1lLiJdWyRjaGlsZERlZltuYW1lXV0nPjwvdGQ+PC90cj4iOwoJCQkJfQoJCQkJJGJ1ZmZlciAuPSAnPC90YWJsZT4nOwoJCQkvLyBpZiBhcnJheQoJCQl9IGVsc2VpZigkdHlwZURlZlsncGhwVHlwZSddID09ICdhcnJheScpewoJCQkJJGJ1ZmZlciAuPSAnPHRhYmxlPic7CgkJCQlmb3IoJGk9MDskaSA8IDM7ICRpKyspewoJCQkJCSRidWZmZXIgLj0gIgoJCQkJCTx0cj48dGQgYWxpZ249J3JpZ2h0Jz5hcnJheSBpdGVtICh0eXBlOiAkdHlwZURlZlthcnJheVR5cGVdKTo8L3RkPgoJCQkJCTx0ZD48aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0ncGFyYW1ldGVyc1siLiRuYW1lLiJdW10nPjwvdGQ+PC90cj4iOwoJCQkJfQoJCQkJJGJ1ZmZlciAuPSAnPC90YWJsZT4nOwoJCQkvLyBpZiBzY2FsYXIKCQkJfSBlbHNlIHsKCQkJCSRidWZmZXIgLj0gIjxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSdwYXJhbWV0ZXJzWyRuYW1lXSc+IjsKCQkJfQoJCX0gZWxzZSB7CgkJCSRidWZmZXIgLj0gIjxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSdwYXJhbWV0ZXJzWyRuYW1lXSc+IjsKCQl9CgkJcmV0dXJuICRidWZmZXI7Cgl9CgkKCS8qKgoJKiBhZGRzIGEgY29tcGxleCB0eXBlIHRvIHRoZSBzY2hlbWEKCSogCgkqIGV4YW1wbGU6IGFycmF5CgkqIAoJKiBhZGRUeXBlKAoJKiAJJ0FycmF5T2ZzdHJpbmcnLAoJKiAJJ2NvbXBsZXhUeXBlJywKCSogCSdhcnJheScsCgkqIAknJywKCSogCSdTT0FQLUVOQzpBcnJheScsCgkqIAlhcnJheSgncmVmJz0+J1NPQVAtRU5DOmFycmF5VHlwZScsJ3dzZGw6YXJyYXlUeXBlJz0+J3N0cmluZ1tdJyksCgkqIAkneHNkOnN0cmluZycKCSogKTsKCSogCgkqIGV4YW1wbGU6IFBIUCBhc3NvY2lhdGl2ZSBhcnJheSAoIFNPQVAgU3RydWN0ICkKCSogCgkqIGFkZFR5cGUoCgkqIAknU09BUFN0cnVjdCcsCgkqIAknY29tcGxleFR5cGUnLAoJKiAJJ3N0cnVjdCcsCgkqIAknYWxsJywKCSogCWFycmF5KCdteVZhcic9PiBhcnJheSgnbmFtZSc9PidteVZhcicsJ3R5cGUnPT4nc3RyaW5nJykKCSogKTsKCSogCgkqIEBwYXJhbSBuYW1lCgkqIEBwYXJhbSB0eXBlQ2xhc3MgKGNvbXBsZXhUeXBlfHNpbXBsZVR5cGV8YXR0cmlidXRlKQoJKiBAcGFyYW0gcGhwVHlwZTogY3VycmVudGx5IHN1cHBvcnRlZCBhcmUgYXJyYXkgYW5kIHN0cnVjdCAocGhwIGFzc29jIGFycmF5KQoJKiBAcGFyYW0gY29tcG9zaXRvciAoYWxsfHNlcXVlbmNlfGNob2ljZSkKCSogQHBhcmFtIHJlc3RyaWN0aW9uQmFzZSBuYW1lc3BhY2U6bmFtZSAoaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy86QXJyYXkpCgkqIEBwYXJhbSBlbGVtZW50cyA9IGFycmF5ICggbmFtZSA9IGFycmF5KG5hbWU9PicnLHR5cGU9PicnKSApCgkqIEBwYXJhbSBhdHRycyA9IGFycmF5KAoJKiAJYXJyYXkoCgkqCQkncmVmJyA9PiAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy86YXJyYXlUeXBlIiwKCSoJCSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLzphcnJheVR5cGUiID0+ICJzdHJpbmdbXSIKCSogCSkKCSogKQoJKiBAcGFyYW0gYXJyYXlUeXBlOiBuYW1lc3BhY2U6bmFtZSAoaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWE6c3RyaW5nKQoJKiBAYWNjZXNzIHB1YmxpYwoJKiBAc2VlIGdldFR5cGVEZWYKCSovCglmdW5jdGlvbiBhZGRDb21wbGV4VHlwZSgkbmFtZSwkdHlwZUNsYXNzPSdjb21wbGV4VHlwZScsJHBocFR5cGU9J2FycmF5JywkY29tcG9zaXRvcj0nJywkcmVzdHJpY3Rpb25CYXNlPScnLCRlbGVtZW50cz1hcnJheSgpLCRhdHRycz1hcnJheSgpLCRhcnJheVR5cGU9JycpewoJCSR0aGlzLT5jb21wbGV4VHlwZXNbJG5hbWVdID0gYXJyYXkoCgkgICAgJ25hbWUnCQk9PiAkbmFtZSwKCSAgICAndHlwZUNsYXNzJwk9PiAkdHlwZUNsYXNzLAoJICAgICdwaHBUeXBlJwk9PiAkcGhwVHlwZSwKCQknY29tcG9zaXRvcic9PiAkY29tcG9zaXRvciwKCSAgICAncmVzdHJpY3Rpb25CYXNlJyA9PiAkcmVzdHJpY3Rpb25CYXNlLAoJCSdlbGVtZW50cycJPT4gJGVsZW1lbnRzLAoJICAgICdhdHRycycJCT0+ICRhdHRycywKCSAgICAnYXJyYXlUeXBlJwk9PiAkYXJyYXlUeXBlCgkJKTsKCQkKCQkkdGhpcy0+eGRlYnVnKCJhZGRDb21wbGV4VHlwZSAkbmFtZToiKTsKCQkkdGhpcy0+YXBwZW5kRGVidWcoJHRoaXMtPnZhckR1bXAoJHRoaXMtPmNvbXBsZXhUeXBlc1skbmFtZV0pKTsKCX0KCQoJLyoqCgkqIGFkZHMgYSBzaW1wbGUgdHlwZSB0byB0aGUgc2NoZW1hCgkqCgkqIEBwYXJhbSBzdHJpbmcgJG5hbWUKCSogQHBhcmFtIHN0cmluZyAkcmVzdHJpY3Rpb25CYXNlIG5hbWVzcGFjZTpuYW1lIChodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLzpBcnJheSkKCSogQHBhcmFtIHN0cmluZyAkdHlwZUNsYXNzIChzaG91bGQgYWx3YXlzIGJlIHNpbXBsZVR5cGUpCgkqIEBwYXJhbSBzdHJpbmcgJHBocFR5cGUgKHNob3VsZCBhbHdheXMgYmUgc2NhbGFyKQoJKiBAcGFyYW0gYXJyYXkgJGVudW1lcmF0aW9uIGFycmF5IG9mIHZhbHVlcwoJKiBAYWNjZXNzIHB1YmxpYwoJKiBAc2VlIHhtbHNjaGVtYQoJKiBAc2VlIGdldFR5cGVEZWYKCSovCglmdW5jdGlvbiBhZGRTaW1wbGVUeXBlKCRuYW1lLCAkcmVzdHJpY3Rpb25CYXNlPScnLCAkdHlwZUNsYXNzPSdzaW1wbGVUeXBlJywgJHBocFR5cGU9J3NjYWxhcicsICRlbnVtZXJhdGlvbj1hcnJheSgpKSB7CgkJJHRoaXMtPnNpbXBsZVR5cGVzWyRuYW1lXSA9IGFycmF5KAoJICAgICduYW1lJwkJCT0+ICRuYW1lLAoJICAgICd0eXBlQ2xhc3MnCQk9PiAkdHlwZUNsYXNzLAoJICAgICdwaHBUeXBlJwkJPT4gJHBocFR5cGUsCgkgICAgJ3R5cGUnCQkJPT4gJHJlc3RyaWN0aW9uQmFzZSwKCSAgICAnZW51bWVyYXRpb24nCT0+ICRlbnVtZXJhdGlvbgoJCSk7CgkJCgkJJHRoaXMtPnhkZWJ1ZygiYWRkU2ltcGxlVHlwZSAkbmFtZToiKTsKCQkkdGhpcy0+YXBwZW5kRGVidWcoJHRoaXMtPnZhckR1bXAoJHRoaXMtPnNpbXBsZVR5cGVzWyRuYW1lXSkpOwoJfQoKCS8qKgoJKiBhZGRzIGFuIGVsZW1lbnQgdG8gdGhlIHNjaGVtYQoJKgoJKiBAcGFyYW0gYXJyYXkgJGF0dHJzIGF0dHJpYnV0ZXMgdGhhdCBtdXN0IGluY2x1ZGUgbmFtZSBhbmQgdHlwZQoJKiBAc2VlIHhtbHNjaGVtYQoJKiBAYWNjZXNzIHB1YmxpYwoJKi8KCWZ1bmN0aW9uIGFkZEVsZW1lbnQoJGF0dHJzKSB7CgkJaWYgKCEgJHRoaXMtPmdldFByZWZpeCgkYXR0cnNbJ3R5cGUnXSkpIHsKCQkJJGF0dHJzWyd0eXBlJ10gPSAkdGhpcy0+c2NoZW1hVGFyZ2V0TmFtZXNwYWNlIC4gJzonIC4gJGF0dHJzWyd0eXBlJ107CgkJfQoJCSR0aGlzLT5lbGVtZW50c1sgJGF0dHJzWyduYW1lJ10gXSA9ICRhdHRyczsKCQkkdGhpcy0+ZWxlbWVudHNbICRhdHRyc1snbmFtZSddIF1bJ3R5cGVDbGFzcyddID0gJ2VsZW1lbnQnOwoJCQoJCSR0aGlzLT54ZGVidWcoImFkZEVsZW1lbnQgIiAuICRhdHRyc1snbmFtZSddKTsKCQkkdGhpcy0+YXBwZW5kRGVidWcoJHRoaXMtPnZhckR1bXAoJHRoaXMtPmVsZW1lbnRzWyAkYXR0cnNbJ25hbWUnXSBdKSk7Cgl9Cn0KCgoKCj8+]]></data>
  </file>
  <file>
    <filename>classes/nusoap.php</filename>
    <isdir>0</isdir>
    <data><![CDATA[PD9waHAKCi8qCiRJZDogbnVzb2FwLnBocCx2IDEuOTQgMjAwNS8wOC8wNCAwMToyNzo0MiBzbmljaG9sIEV4cCAkCgpOdVNPQVAgLSBXZWIgU2VydmljZXMgVG9vbGtpdCBmb3IgUEhQCgpDb3B5cmlnaHQgKGMpIDIwMDIgTnVTcGhlcmUgQ29ycG9yYXRpb24KClRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwpMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgpUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCllvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQpGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCgpJZiB5b3UgaGF2ZSBhbnkgcXVlc3Rpb25zIG9yIGNvbW1lbnRzLCBwbGVhc2UgZW1haWw6CgpEaWV0cmljaCBBeWFsYQpkaWV0cmljaEBnYW54NC5jb20KaHR0cDovL2RpZXRyaWNoLmdhbng0LmNvbS9udXNvYXAKCk51U3BoZXJlIENvcnBvcmF0aW9uCmh0dHA6Ly93d3cubnVzcGhlcmUuY29tCgoqLwoKLyogbG9hZCBjbGFzc2VzCgovLyBuZWNlc3NhcnkgY2xhc3NlcwpyZXF1aXJlX29uY2UoJ2NsYXNzLnNvYXBjbGllbnQucGhwJyk7CnJlcXVpcmVfb25jZSgnY2xhc3Muc29hcF92YWwucGhwJyk7CnJlcXVpcmVfb25jZSgnY2xhc3Muc29hcF9wYXJzZXIucGhwJyk7CnJlcXVpcmVfb25jZSgnY2xhc3Muc29hcF9mYXVsdC5waHAnKTsKCi8vIHRyYW5zcG9ydCBjbGFzc2VzCnJlcXVpcmVfb25jZSgnY2xhc3Muc29hcF90cmFuc3BvcnRfaHR0cC5waHAnKTsKCi8vIG9wdGlvbmFsIGFkZC1vbiBjbGFzc2VzCnJlcXVpcmVfb25jZSgnY2xhc3MueG1sc2NoZW1hLnBocCcpOwpyZXF1aXJlX29uY2UoJ2NsYXNzLndzZGwucGhwJyk7CgovLyBzZXJ2ZXIgY2xhc3MKcmVxdWlyZV9vbmNlKCdjbGFzcy5zb2FwX3NlcnZlci5waHAnKTsqLwoKLy8gY2xhc3MgdmFyaWFibGUgZW11bGF0aW9uCi8vIGNmLiBodHRwOi8vd3d3LndlYmtyZWF0b3IuY29tL3BocC90ZWNobmlxdWVzL3BocC1zdGF0aWMtY2xhc3MtdmFyaWFibGVzLmh0bWwKJEdMT0JBTFNbJ190cmFuc2llbnQnXVsnc3RhdGljJ11bJ251c29hcF9iYXNlJ10tPmdsb2JhbERlYnVnTGV2ZWwgPSA5OwoKLyoqCioKKiBudXNvYXBfYmFzZQoqCiogQGF1dGhvciAgIERpZXRyaWNoIEF5YWxhIDxkaWV0cmljaEBnYW54NC5jb20+CiogQHZlcnNpb24gICRJZDogbnVzb2FwLnBocCx2IDEuOTQgMjAwNS8wOC8wNCAwMToyNzo0MiBzbmljaG9sIEV4cCAkCiogQGFjY2VzcyAgIHB1YmxpYwoqLwpjbGFzcyBudXNvYXBfYmFzZSB7CgkvKioKCSAqIElkZW50aWZpY2F0aW9uIGZvciBIVFRQIGhlYWRlcnMuCgkgKgoJICogQHZhciBzdHJpbmcKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCgl2YXIgJHRpdGxlID0gJ051U09BUCc7CgkvKioKCSAqIFZlcnNpb24gZm9yIEhUVFAgaGVhZGVycy4KCSAqCgkgKiBAdmFyIHN0cmluZwoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCXZhciAkdmVyc2lvbiA9ICcwLjcuMic7CgkvKioKCSAqIENWUyByZXZpc2lvbiBmb3IgSFRUUCBoZWFkZXJzLgoJICoKCSAqIEB2YXIgc3RyaW5nCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJdmFyICRyZXZpc2lvbiA9ICckUmV2aXNpb246IDEuOTQgJCc7CiAgICAvKioKICAgICAqIEN1cnJlbnQgZXJyb3Igc3RyaW5nIChtYW5pcHVsYXRlZCBieSBnZXRFcnJvci9zZXRFcnJvcikKCSAqCgkgKiBAdmFyIHN0cmluZwoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCXZhciAkZXJyb3Jfc3RyID0gJyc7CiAgICAvKioKICAgICAqIEN1cnJlbnQgZGVidWcgc3RyaW5nIChtYW5pcHVsYXRlZCBieSBkZWJ1Zy9hcHBlbmREZWJ1Zy9jbGVhckRlYnVnL2dldERlYnVnL2dldERlYnVnQXNYTUxDb21tZW50KQoJICoKCSAqIEB2YXIgc3RyaW5nCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwogICAgdmFyICRkZWJ1Z19zdHIgPSAnJzsKICAgIC8qKgoJICogdG9nZ2xlcyBhdXRvbWF0aWMgZW5jb2Rpbmcgb2Ygc3BlY2lhbCBjaGFyYWN0ZXJzIGFzIGVudGl0aWVzCgkgKiAoc2hvdWxkIGFsd2F5cyBiZSB0cnVlLCBJIHRoaW5rKQoJICoKCSAqIEB2YXIgYm9vbGVhbgoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCXZhciAkY2hhcmVuY29kaW5nID0gdHJ1ZTsKCS8qKgoJICogdGhlIGRlYnVnIGxldmVsIGZvciB0aGlzIGluc3RhbmNlCgkgKgoJICogQHZhcglpbnRlZ2VyCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJdmFyICRkZWJ1Z0xldmVsOwoKICAgIC8qKgoJKiBzZXQgc2NoZW1hIHZlcnNpb24KCSoKCSogQHZhciAgICAgIHN0cmluZwoJKiBAYWNjZXNzICAgcHVibGljCgkqLwoJdmFyICRYTUxTY2hlbWFWZXJzaW9uID0gJ2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJzsKCQogICAgLyoqCgkqIGNoYXJzZXQgZW5jb2RpbmcgZm9yIG91dGdvaW5nIG1lc3NhZ2VzCgkqCgkqIEB2YXIgICAgICBzdHJpbmcKCSogQGFjY2VzcyAgIHB1YmxpYwoJKi8KICAgIHZhciAkc29hcF9kZWZlbmNvZGluZyA9ICdJU08tODg1OS0xJzsKCS8vdmFyICRzb2FwX2RlZmVuY29kaW5nID0gJ1VURi04JzsKCgkvKioKCSogbmFtZXNwYWNlcyBpbiBhbiBhcnJheSBvZiBwcmVmaXggPT4gdXJpCgkqCgkqIHRoaXMgaXMgInNlZWRlZCIgYnkgYSBzZXQgb2YgY29uc3RhbnRzLCBidXQgaXQgbWF5IGJlIGFsdGVyZWQgYnkgY29kZQoJKgoJKiBAdmFyICAgICAgYXJyYXkKCSogQGFjY2VzcyAgIHB1YmxpYwoJKi8KCXZhciAkbmFtZXNwYWNlcyA9IGFycmF5KAoJCSdTT0FQLUVOVicgPT4gJ2h0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvJywKCQkneHNkJyA9PiAnaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnLAoJCSd4c2knID0+ICdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZScsCgkJJ1NPQVAtRU5DJyA9PiAnaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8nCgkJKTsKCgkvKioKCSogbmFtZXNwYWNlcyB1c2VkIGluIHRoZSBjdXJyZW50IGNvbnRleHQsIGUuZy4gZHVyaW5nIHNlcmlhbGl6YXRpb24KCSoKCSogQHZhciAgICAgIGFycmF5CgkqIEBhY2Nlc3MgICBwcml2YXRlCgkqLwoJdmFyICR1c2VkTmFtZXNwYWNlcyA9IGFycmF5KCk7CgoJLyoqCgkqIFhNTCBTY2hlbWEgdHlwZXMgaW4gYW4gYXJyYXkgb2YgdXJpID0+IChhcnJheSBvZiB4bWwgdHlwZSA9PiBwaHAgdHlwZSkKCSogaXMgdGhpcyBsZWdhY3kgeWV0PwoJKiBubywgdGhpcyBpcyB1c2VkIGJ5IHRoZSB4bWxzY2hlbWEgY2xhc3MgdG8gdmVyaWZ5IHR5cGUgPT4gbmFtZXNwYWNlIG1hcHBpbmdzLgoJKiBAdmFyICAgICAgYXJyYXkKCSogQGFjY2VzcyAgIHB1YmxpYwoJKi8KCXZhciAkdHlwZW1hcCA9IGFycmF5KAoJJ2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJyA9PiBhcnJheSgKCQknc3RyaW5nJz0+J3N0cmluZycsJ2Jvb2xlYW4nPT4nYm9vbGVhbicsJ2Zsb2F0Jz0+J2RvdWJsZScsJ2RvdWJsZSc9Pidkb3VibGUnLCdkZWNpbWFsJz0+J2RvdWJsZScsCgkJJ2R1cmF0aW9uJz0+JycsJ2RhdGVUaW1lJz0+J3N0cmluZycsJ3RpbWUnPT4nc3RyaW5nJywnZGF0ZSc9PidzdHJpbmcnLCdnWWVhck1vbnRoJz0+JycsCgkJJ2dZZWFyJz0+JycsJ2dNb250aERheSc9PicnLCdnRGF5Jz0+JycsJ2dNb250aCc9PicnLCdoZXhCaW5hcnknPT4nc3RyaW5nJywnYmFzZTY0QmluYXJ5Jz0+J3N0cmluZycsCgkJLy8gYWJzdHJhY3QgImFueSIgdHlwZXMKCQknYW55VHlwZSc9PidzdHJpbmcnLCdhbnlTaW1wbGVUeXBlJz0+J3N0cmluZycsCgkJLy8gZGVyaXZlZCBkYXRhdHlwZXMKCQknbm9ybWFsaXplZFN0cmluZyc9PidzdHJpbmcnLCd0b2tlbic9PidzdHJpbmcnLCdsYW5ndWFnZSc9PicnLCdOTVRPS0VOJz0+JycsJ05NVE9LRU5TJz0+JycsJ05hbWUnPT4nJywnTkNOYW1lJz0+JycsJ0lEJz0+JycsCgkJJ0lEUkVGJz0+JycsJ0lEUkVGUyc9PicnLCdFTlRJVFknPT4nJywnRU5USVRJRVMnPT4nJywnaW50ZWdlcic9PidpbnRlZ2VyJywnbm9uUG9zaXRpdmVJbnRlZ2VyJz0+J2ludGVnZXInLAoJCSduZWdhdGl2ZUludGVnZXInPT4naW50ZWdlcicsJ2xvbmcnPT4naW50ZWdlcicsJ2ludCc9PidpbnRlZ2VyJywnc2hvcnQnPT4naW50ZWdlcicsJ2J5dGUnPT4naW50ZWdlcicsJ25vbk5lZ2F0aXZlSW50ZWdlcic9PidpbnRlZ2VyJywKCQkndW5zaWduZWRMb25nJz0+JycsJ3Vuc2lnbmVkSW50Jz0+JycsJ3Vuc2lnbmVkU2hvcnQnPT4nJywndW5zaWduZWRCeXRlJz0+JycsJ3Bvc2l0aXZlSW50ZWdlcic9PicnKSwKCSdodHRwOi8vd3d3LnczLm9yZy8yMDAwLzEwL1hNTFNjaGVtYScgPT4gYXJyYXkoCgkJJ2k0Jz0+JycsJ2ludCc9PidpbnRlZ2VyJywnYm9vbGVhbic9Pidib29sZWFuJywnc3RyaW5nJz0+J3N0cmluZycsJ2RvdWJsZSc9Pidkb3VibGUnLAoJCSdmbG9hdCc9Pidkb3VibGUnLCdkYXRlVGltZSc9PidzdHJpbmcnLAoJCSd0aW1lSW5zdGFudCc9PidzdHJpbmcnLCdiYXNlNjRCaW5hcnknPT4nc3RyaW5nJywnYmFzZTY0Jz0+J3N0cmluZycsJ3VyLXR5cGUnPT4nYXJyYXknKSwKCSdodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hNTFNjaGVtYScgPT4gYXJyYXkoCgkJJ2k0Jz0+JycsJ2ludCc9PidpbnRlZ2VyJywnYm9vbGVhbic9Pidib29sZWFuJywnc3RyaW5nJz0+J3N0cmluZycsJ2RvdWJsZSc9Pidkb3VibGUnLAoJCSdmbG9hdCc9Pidkb3VibGUnLCdkYXRlVGltZSc9PidzdHJpbmcnLAoJCSd0aW1lSW5zdGFudCc9PidzdHJpbmcnLCdiYXNlNjRCaW5hcnknPT4nc3RyaW5nJywnYmFzZTY0Jz0+J3N0cmluZycsJ3VyLXR5cGUnPT4nYXJyYXknKSwKCSdodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZCcgPT4gYXJyYXkoJ1NPQVBTdHJ1Y3QnPT4nc3RydWN0JyksCgknaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8nID0+IGFycmF5KCdiYXNlNjQnPT4nc3RyaW5nJywnYXJyYXknPT4nYXJyYXknLCdBcnJheSc9PidhcnJheScpLAogICAgJ2h0dHA6Ly94bWwuYXBhY2hlLm9yZy94bWwtc29hcCcgPT4gYXJyYXkoJ01hcCcpCgkpOwoKCS8qKgoJKiBYTUwgZW50aXRpZXMgdG8gY29udmVydAoJKgoJKiBAdmFyICAgICAgYXJyYXkKCSogQGFjY2VzcyAgIHB1YmxpYwoJKiBAZGVwcmVjYXRlZAoJKiBAc2VlCWV4cGFuZEVudGl0aWVzCgkqLwoJdmFyICR4bWxFbnRpdGllcyA9IGFycmF5KCdxdW90JyA9PiAnIicsJ2FtcCcgPT4gJyYnLAoJCSdsdCcgPT4gJzwnLCdndCcgPT4gJz4nLCdhcG9zJyA9PiAiJyIpOwoKCS8qKgoJKiBjb25zdHJ1Y3RvcgoJKgoJKiBAYWNjZXNzCXB1YmxpYwoJKi8KCWZ1bmN0aW9uIG51c29hcF9iYXNlKCkgewoJCSR0aGlzLT5kZWJ1Z0xldmVsID0gJEdMT0JBTFNbJ190cmFuc2llbnQnXVsnc3RhdGljJ11bJ251c29hcF9iYXNlJ10tPmdsb2JhbERlYnVnTGV2ZWw7Cgl9CgoJLyoqCgkqIGdldHMgdGhlIGdsb2JhbCBkZWJ1ZyBsZXZlbCwgd2hpY2ggYXBwbGllcyB0byBmdXR1cmUgaW5zdGFuY2VzCgkqCgkqIEByZXR1cm4JaW50ZWdlcglEZWJ1ZyBsZXZlbCAwLTksIHdoZXJlIDAgdHVybnMgb2ZmCgkqIEBhY2Nlc3MJcHVibGljCgkqLwoJZnVuY3Rpb24gZ2V0R2xvYmFsRGVidWdMZXZlbCgpIHsKCQlyZXR1cm4gJEdMT0JBTFNbJ190cmFuc2llbnQnXVsnc3RhdGljJ11bJ251c29hcF9iYXNlJ10tPmdsb2JhbERlYnVnTGV2ZWw7Cgl9CgoJLyoqCgkqIHNldHMgdGhlIGdsb2JhbCBkZWJ1ZyBsZXZlbCwgd2hpY2ggYXBwbGllcyB0byBmdXR1cmUgaW5zdGFuY2VzCgkqCgkqIEBwYXJhbQlpbnQJJGxldmVsCURlYnVnIGxldmVsIDAtOSwgd2hlcmUgMCB0dXJucyBvZmYKCSogQGFjY2VzcwlwdWJsaWMKCSovCglmdW5jdGlvbiBzZXRHbG9iYWxEZWJ1Z0xldmVsKCRsZXZlbCkgewoJCSRHTE9CQUxTWydfdHJhbnNpZW50J11bJ3N0YXRpYyddWydudXNvYXBfYmFzZSddLT5nbG9iYWxEZWJ1Z0xldmVsID0gJGxldmVsOwoJfQoKCS8qKgoJKiBnZXRzIHRoZSBkZWJ1ZyBsZXZlbCBmb3IgdGhpcyBpbnN0YW5jZQoJKgoJKiBAcmV0dXJuCWludAlEZWJ1ZyBsZXZlbCAwLTksIHdoZXJlIDAgdHVybnMgb2ZmCgkqIEBhY2Nlc3MJcHVibGljCgkqLwoJZnVuY3Rpb24gZ2V0RGVidWdMZXZlbCgpIHsKCQlyZXR1cm4gJHRoaXMtPmRlYnVnTGV2ZWw7Cgl9CgoJLyoqCgkqIHNldHMgdGhlIGRlYnVnIGxldmVsIGZvciB0aGlzIGluc3RhbmNlCgkqCgkqIEBwYXJhbQlpbnQJJGxldmVsCURlYnVnIGxldmVsIDAtOSwgd2hlcmUgMCB0dXJucyBvZmYKCSogQGFjY2VzcwlwdWJsaWMKCSovCglmdW5jdGlvbiBzZXREZWJ1Z0xldmVsKCRsZXZlbCkgewoJCSR0aGlzLT5kZWJ1Z0xldmVsID0gJGxldmVsOwoJfQoKCS8qKgoJKiBhZGRzIGRlYnVnIGRhdGEgdG8gdGhlIGluc3RhbmNlIGRlYnVnIHN0cmluZyB3aXRoIGZvcm1hdHRpbmcKCSoKCSogQHBhcmFtICAgIHN0cmluZyAkc3RyaW5nIGRlYnVnIGRhdGEKCSogQGFjY2VzcyAgIHByaXZhdGUKCSovCglmdW5jdGlvbiBkZWJ1Zygkc3RyaW5nKXsKCQlpZiAoJHRoaXMtPmRlYnVnTGV2ZWwgPiAwKSB7CgkJCSR0aGlzLT5hcHBlbmREZWJ1ZygkdGhpcy0+Z2V0bWljcm90aW1lKCkuJyAnLmdldF9jbGFzcygkdGhpcykuIjogJHN0cmluZ1xuIik7CgkJfQoJfQoKCS8qKgoJKiBhZGRzIGRlYnVnIGRhdGEgdG8gdGhlIGluc3RhbmNlIGRlYnVnIHN0cmluZyB3aXRob3V0IGZvcm1hdHRpbmcKCSoKCSogQHBhcmFtICAgIHN0cmluZyAkc3RyaW5nIGRlYnVnIGRhdGEKCSogQGFjY2VzcyAgIHB1YmxpYwoJKi8KCWZ1bmN0aW9uIGFwcGVuZERlYnVnKCRzdHJpbmcpewoJCWlmICgkdGhpcy0+ZGVidWdMZXZlbCA+IDApIHsKCQkJLy8gaXQgd291bGQgYmUgbmljZSB0byB1c2UgYSBtZW1vcnkgc3RyZWFtIGhlcmUgdG8gdXNlCgkJCS8vIG1lbW9yeSBtb3JlIGVmZmljaWVudGx5CgkJCSR0aGlzLT5kZWJ1Z19zdHIgLj0gJHN0cmluZzsKCQl9Cgl9CgoJLyoqCgkqIGNsZWFycyB0aGUgY3VycmVudCBkZWJ1ZyBkYXRhIGZvciB0aGlzIGluc3RhbmNlCgkqCgkqIEBhY2Nlc3MgICBwdWJsaWMKCSovCglmdW5jdGlvbiBjbGVhckRlYnVnKCkgewoJCS8vIGl0IHdvdWxkIGJlIG5pY2UgdG8gdXNlIGEgbWVtb3J5IHN0cmVhbSBoZXJlIHRvIHVzZQoJCS8vIG1lbW9yeSBtb3JlIGVmZmljaWVudGx5CgkJJHRoaXMtPmRlYnVnX3N0ciA9ICcnOwoJfQoKCS8qKgoJKiBnZXRzIHRoZSBjdXJyZW50IGRlYnVnIGRhdGEgZm9yIHRoaXMgaW5zdGFuY2UKCSoKCSogQHJldHVybiAgIGRlYnVnIGRhdGEKCSogQGFjY2VzcyAgIHB1YmxpYwoJKi8KCWZ1bmN0aW9uICZnZXREZWJ1ZygpIHsKCQkvLyBpdCB3b3VsZCBiZSBuaWNlIHRvIHVzZSBhIG1lbW9yeSBzdHJlYW0gaGVyZSB0byB1c2UKCQkvLyBtZW1vcnkgbW9yZSBlZmZpY2llbnRseQoJCXJldHVybiAkdGhpcy0+ZGVidWdfc3RyOwoJfQoKCS8qKgoJKiBnZXRzIHRoZSBjdXJyZW50IGRlYnVnIGRhdGEgZm9yIHRoaXMgaW5zdGFuY2UgYXMgYW4gWE1MIGNvbW1lbnQKCSogdGhpcyBtYXkgY2hhbmdlIHRoZSBjb250ZW50cyBvZiB0aGUgZGVidWcgZGF0YQoJKgoJKiBAcmV0dXJuICAgZGVidWcgZGF0YSBhcyBhbiBYTUwgY29tbWVudAoJKiBAYWNjZXNzICAgcHVibGljCgkqLwoJZnVuY3Rpb24gJmdldERlYnVnQXNYTUxDb21tZW50KCkgewoJCS8vIGl0IHdvdWxkIGJlIG5pY2UgdG8gdXNlIGEgbWVtb3J5IHN0cmVhbSBoZXJlIHRvIHVzZQoJCS8vIG1lbW9yeSBtb3JlIGVmZmljaWVudGx5CgkJd2hpbGUgKHN0cnBvcygkdGhpcy0+ZGVidWdfc3RyLCAnLS0nKSkgewoJCQkkdGhpcy0+ZGVidWdfc3RyID0gc3RyX3JlcGxhY2UoJy0tJywgJy0gLScsICR0aGlzLT5kZWJ1Z19zdHIpOwoJCX0KICAgIAlyZXR1cm4gIjwhLS1cbiIgLiAkdGhpcy0+ZGVidWdfc3RyIC4gIlxuLS0+IjsKCX0KCgkvKioKCSogZXhwYW5kcyBlbnRpdGllcywgZS5nLiBjaGFuZ2VzICc8JyB0byAnJmx0OycuCgkqCgkqIEBwYXJhbQlzdHJpbmcJJHZhbAlUaGUgc3RyaW5nIGluIHdoaWNoIHRvIGV4cGFuZCBlbnRpdGllcy4KCSogQGFjY2Vzcwlwcml2YXRlCgkqLwoJZnVuY3Rpb24gZXhwYW5kRW50aXRpZXMoJHZhbCkgewoJCWlmICgkdGhpcy0+Y2hhcmVuY29kaW5nKSB7CgkgICAgCSR2YWwgPSBzdHJfcmVwbGFjZSgnJicsICcmYW1wOycsICR2YWwpOwoJICAgIAkkdmFsID0gc3RyX3JlcGxhY2UoIiciLCAnJmFwb3M7JywgJHZhbCk7CgkgICAgCSR2YWwgPSBzdHJfcmVwbGFjZSgnIicsICcmcXVvdDsnLCAkdmFsKTsKCSAgICAJJHZhbCA9IHN0cl9yZXBsYWNlKCc8JywgJyZsdDsnLCAkdmFsKTsKCSAgICAJJHZhbCA9IHN0cl9yZXBsYWNlKCc+JywgJyZndDsnLCAkdmFsKTsKCSAgICB9CgkgICAgcmV0dXJuICR2YWw7Cgl9CgoJLyoqCgkqIHJldHVybnMgZXJyb3Igc3RyaW5nIGlmIHByZXNlbnQKCSoKCSogQHJldHVybiAgIG1peGVkIGVycm9yIHN0cmluZyBvciBmYWxzZQoJKiBAYWNjZXNzICAgcHVibGljCgkqLwoJZnVuY3Rpb24gZ2V0RXJyb3IoKXsKCQlpZigkdGhpcy0+ZXJyb3Jfc3RyICE9ICcnKXsKCQkJcmV0dXJuICR0aGlzLT5lcnJvcl9zdHI7CgkJfQoJCXJldHVybiBmYWxzZTsKCX0KCgkvKioKCSogc2V0cyBlcnJvciBzdHJpbmcKCSoKCSogQHJldHVybiAgIGJvb2xlYW4gJHN0cmluZyBlcnJvciBzdHJpbmcKCSogQGFjY2VzcyAgIHByaXZhdGUKCSovCglmdW5jdGlvbiBzZXRFcnJvcigkc3RyKXsKCQkkdGhpcy0+ZXJyb3Jfc3RyID0gJHN0cjsKCX0KCgkvKioKCSogZGV0ZWN0IGlmIGFycmF5IGlzIGEgc2ltcGxlIGFycmF5IG9yIGEgc3RydWN0IChhc3NvY2lhdGl2ZSBhcnJheSkKCSoKCSogQHBhcmFtCW1peGVkCSR2YWwJVGhlIFBIUCBhcnJheQoJKiBAcmV0dXJuCXN0cmluZwkoYXJyYXlTaW1wbGV8YXJyYXlTdHJ1Y3QpCgkqIEBhY2Nlc3MJcHJpdmF0ZQoJKi8KCWZ1bmN0aW9uIGlzQXJyYXlTaW1wbGVPclN0cnVjdCgkdmFsKSB7CiAgICAgICAgJGtleUxpc3QgPSBhcnJheV9rZXlzKCR2YWwpOwoJCWZvcmVhY2ggKCRrZXlMaXN0IGFzICRrZXlMaXN0VmFsdWUpIHsKCQkJaWYgKCFpc19pbnQoJGtleUxpc3RWYWx1ZSkpIHsKCQkJCXJldHVybiAnYXJyYXlTdHJ1Y3QnOwoJCQl9CgkJfQoJCXJldHVybiAnYXJyYXlTaW1wbGUnOwoJfQoKCS8qKgoJKiBzZXJpYWxpemVzIFBIUCB2YWx1ZXMgaW4gYWNjb3JkYW5jZSB3LyBzZWN0aW9uIDUuIFR5cGUgaW5mb3JtYXRpb24gaXMKCSogbm90IHNlcmlhbGl6ZWQgaWYgJHVzZSA9PSAnbGl0ZXJhbCcuCgkqCgkqIEBwYXJhbQltaXhlZAkkdmFsCVRoZSB2YWx1ZSB0byBzZXJpYWxpemUKCSogQHBhcmFtCXN0cmluZwkkbmFtZQlUaGUgbmFtZSAobG9jYWwgcGFydCkgb2YgdGhlIFhNTCBlbGVtZW50CgkqIEBwYXJhbQlzdHJpbmcJJHR5cGUJVGhlIFhNTCBzY2hlbWEgdHlwZSAobG9jYWwgcGFydCkgZm9yIHRoZSBlbGVtZW50CgkqIEBwYXJhbQlzdHJpbmcJJG5hbWVfbnMJVGhlIG5hbWVzcGFjZSBmb3IgdGhlIG5hbWUgb2YgdGhlIFhNTCBlbGVtZW50CgkqIEBwYXJhbQlzdHJpbmcJJHR5cGVfbnMJVGhlIG5hbWVzcGFjZSBmb3IgdGhlIHR5cGUgb2YgdGhlIGVsZW1lbnQKCSogQHBhcmFtCWFycmF5CSRhdHRyaWJ1dGVzCVRoZSBhdHRyaWJ1dGVzIHRvIHNlcmlhbGl6ZSBhcyBuYW1lPT52YWx1ZSBwYWlycwoJKiBAcGFyYW0Jc3RyaW5nCSR1c2UJVGhlIFdTREwgInVzZSIgKGVuY29kZWR8bGl0ZXJhbCkKCSogQHJldHVybglzdHJpbmcJVGhlIHNlcmlhbGl6ZWQgZWxlbWVudCwgcG9zc2libHkgd2l0aCBjaGlsZCBlbGVtZW50cwogICAgKiBAYWNjZXNzCXB1YmxpYwoJKi8KCWZ1bmN0aW9uIHNlcmlhbGl6ZV92YWwoJHZhbCwkbmFtZT1mYWxzZSwkdHlwZT1mYWxzZSwkbmFtZV9ucz1mYWxzZSwkdHlwZV9ucz1mYWxzZSwkYXR0cmlidXRlcz1mYWxzZSwkdXNlPSdlbmNvZGVkJyl7CgkJJHRoaXMtPmRlYnVnKCJpbiBzZXJpYWxpemVfdmFsOiBuYW1lPSRuYW1lLCB0eXBlPSR0eXBlLCBuYW1lX25zPSRuYW1lX25zLCB0eXBlX25zPSR0eXBlX25zLCB1c2U9JHVzZSIpOwoJCSR0aGlzLT5hcHBlbmREZWJ1ZygndmFsdWU9JyAuICR0aGlzLT52YXJEdW1wKCR2YWwpKTsKCQkkdGhpcy0+YXBwZW5kRGVidWcoJ2F0dHJpYnV0ZXM9JyAuICR0aGlzLT52YXJEdW1wKCRhdHRyaWJ1dGVzKSk7CgkJCiAgICAJaWYoaXNfb2JqZWN0KCR2YWwpICYmIGdldF9jbGFzcygkdmFsKSA9PSAnc29hcHZhbCcpewogICAgICAgIAlyZXR1cm4gJHZhbC0+c2VyaWFsaXplKCR1c2UpOwogICAgICAgIH0KCQkvLyBmb3JjZSB2YWxpZCBuYW1lIGlmIG5lY2Vzc2FyeQoJCWlmIChpc19udW1lcmljKCRuYW1lKSkgewoJCQkkbmFtZSA9ICdfX251bWVyaWNfJyAuICRuYW1lOwoJCX0gZWxzZWlmICghICRuYW1lKSB7CgkJCSRuYW1lID0gJ25vbmFtZSc7CgkJfQoJCS8vIGlmIG5hbWUgaGFzIG5zLCBhZGQgbnMgcHJlZml4IHRvIG5hbWUKCQkkeG1sbnMgPSAnJzsKICAgICAgICBpZigkbmFtZV9ucyl7CgkJCSRwcmVmaXggPSAnbnUnLnJhbmQoMTAwMCw5OTk5KTsKCQkJJG5hbWUgPSAkcHJlZml4Lic6Jy4kbmFtZTsKCQkJJHhtbG5zIC49ICIgeG1sbnM6JHByZWZpeD1cIiRuYW1lX25zXCIiOwoJCX0KCQkvLyBpZiB0eXBlIGlzIHByZWZpeGVkLCBjcmVhdGUgdHlwZSBwcmVmaXgKCQlpZigkdHlwZV9ucyAhPSAnJyAmJiAkdHlwZV9ucyA9PSAkdGhpcy0+bmFtZXNwYWNlc1sneHNkJ10pewoJCQkvLyBuZWVkIHRvIGZpeCB0aGlzLiBzaG91bGRuJ3QgZGVmYXVsdCB0byB4c2QgaWYgbm8gbnMgc3BlY2lmaWVkCgkJICAgIC8vIHcvbyBjaGVja2luZyBhZ2FpbnN0IHR5cGVtYXAKCQkJJHR5cGVfcHJlZml4ID0gJ3hzZCc7CgkJfSBlbHNlaWYoJHR5cGVfbnMpewoJCQkkdHlwZV9wcmVmaXggPSAnbnMnLnJhbmQoMTAwMCw5OTk5KTsKCQkJJHhtbG5zIC49ICIgeG1sbnM6JHR5cGVfcHJlZml4PVwiJHR5cGVfbnNcIiI7CgkJfQoJCS8vIHNlcmlhbGl6ZSBhdHRyaWJ1dGVzIGlmIHByZXNlbnQKCQkkYXR0cyA9ICcnOwoJCWlmKCRhdHRyaWJ1dGVzKXsKCQkJZm9yZWFjaCgkYXR0cmlidXRlcyBhcyAkayA9PiAkdil7CgkJCQkkYXR0cyAuPSAiICRrPVwiIi4kdGhpcy0+ZXhwYW5kRW50aXRpZXMoJHYpLiciJzsKCQkJfQoJCX0KCQkvLyBzZXJpYWxpemUgbnVsbCB2YWx1ZQoJCWlmIChpc19udWxsKCR2YWwpKSB7CgkJCWlmICgkdXNlID09ICdsaXRlcmFsJykgewoJCQkJLy8gVE9ETzogZGVwZW5kcyBvbiBtaW5PY2N1cnMKCSAgICAgICAgCXJldHVybiAiPCRuYW1lJHhtbG5zICRhdHRzLz4iOwogICAgICAgIAl9IGVsc2UgewoJCQkJaWYgKGlzc2V0KCR0eXBlKSAmJiBpc3NldCgkdHlwZV9wcmVmaXgpKSB7CgkJCQkJJHR5cGVfc3RyID0gIiB4c2k6dHlwZT1cIiR0eXBlX3ByZWZpeDokdHlwZVwiIjsKCQkJCX0gZWxzZSB7CgkJCQkJJHR5cGVfc3RyID0gJyc7CgkJCQl9CgkgICAgICAgIAlyZXR1cm4gIjwkbmFtZSR4bWxucyR0eXBlX3N0ciAkYXR0cyB4c2k6bmlsPVwidHJ1ZVwiLz4iOwogICAgICAgIAl9CgkJfQogICAgICAgIC8vIHNlcmlhbGl6ZSBpZiBhbiB4c2QgYnVpbHQtaW4gcHJpbWl0aXZlIHR5cGUKICAgICAgICBpZigkdHlwZSAhPSAnJyAmJiBpc3NldCgkdGhpcy0+dHlwZW1hcFskdGhpcy0+WE1MU2NoZW1hVmVyc2lvbl1bJHR5cGVdKSl7CiAgICAgICAgCWlmIChpc19ib29sKCR2YWwpKSB7CiAgICAgICAgCQlpZiAoJHR5cGUgPT0gJ2Jvb2xlYW4nKSB7CgkgICAgICAgIAkJJHZhbCA9ICR2YWwgPyAndHJ1ZScgOiAnZmFsc2UnOwoJICAgICAgICAJfSBlbHNlaWYgKCEgJHZhbCkgewoJICAgICAgICAJCSR2YWwgPSAwOwoJICAgICAgICAJfQoJCQl9IGVsc2UgaWYgKGlzX3N0cmluZygkdmFsKSkgewoJCQkJJHZhbCA9ICR0aGlzLT5leHBhbmRFbnRpdGllcygkdmFsKTsKCQkJfQoJCQlpZiAoJHVzZSA9PSAnbGl0ZXJhbCcpIHsKCSAgICAgICAgCXJldHVybiAiPCRuYW1lJHhtbG5zICRhdHRzPiR2YWw8LyRuYW1lPiI7CiAgICAgICAgCX0gZWxzZSB7CgkgICAgICAgIAlyZXR1cm4gIjwkbmFtZSR4bWxucyAkYXR0cyB4c2k6dHlwZT1cInhzZDokdHlwZVwiPiR2YWw8LyRuYW1lPiI7CiAgICAgICAgCX0KICAgICAgICB9CgkJLy8gZGV0ZWN0IHR5cGUgYW5kIHNlcmlhbGl6ZQoJCSR4bWwgPSAnJzsKCQlzd2l0Y2godHJ1ZSkgewoJCQljYXNlIChpc19ib29sKCR2YWwpIHx8ICR0eXBlID09ICdib29sZWFuJyk6CiAgICAgICAgCQlpZiAoJHR5cGUgPT0gJ2Jvb2xlYW4nKSB7CgkgICAgICAgIAkJJHZhbCA9ICR2YWwgPyAndHJ1ZScgOiAnZmFsc2UnOwoJICAgICAgICAJfSBlbHNlaWYgKCEgJHZhbCkgewoJICAgICAgICAJCSR2YWwgPSAwOwoJICAgICAgICAJfQoJCQkJaWYgKCR1c2UgPT0gJ2xpdGVyYWwnKSB7CgkJCQkJJHhtbCAuPSAiPCRuYW1lJHhtbG5zICRhdHRzPiR2YWw8LyRuYW1lPiI7CgkJCQl9IGVsc2UgewoJCQkJCSR4bWwgLj0gIjwkbmFtZSR4bWxucyB4c2k6dHlwZT1cInhzZDpib29sZWFuXCIkYXR0cz4kdmFsPC8kbmFtZT4iOwoJCQkJfQoJCQkJYnJlYWs7CgkJCWNhc2UgKGlzX2ludCgkdmFsKSB8fCBpc19sb25nKCR2YWwpIHx8ICR0eXBlID09ICdpbnQnKToKCQkJCWlmICgkdXNlID09ICdsaXRlcmFsJykgewoJCQkJCSR4bWwgLj0gIjwkbmFtZSR4bWxucyAkYXR0cz4kdmFsPC8kbmFtZT4iOwoJCQkJfSBlbHNlIHsKCQkJCQkkeG1sIC49ICI8JG5hbWUkeG1sbnMgeHNpOnR5cGU9XCJ4c2Q6aW50XCIkYXR0cz4kdmFsPC8kbmFtZT4iOwoJCQkJfQoJCQkJYnJlYWs7CgkJCWNhc2UgKGlzX2Zsb2F0KCR2YWwpfHwgaXNfZG91YmxlKCR2YWwpIHx8ICR0eXBlID09ICdmbG9hdCcpOgoJCQkJaWYgKCR1c2UgPT0gJ2xpdGVyYWwnKSB7CgkJCQkJJHhtbCAuPSAiPCRuYW1lJHhtbG5zICRhdHRzPiR2YWw8LyRuYW1lPiI7CgkJCQl9IGVsc2UgewoJCQkJCSR4bWwgLj0gIjwkbmFtZSR4bWxucyB4c2k6dHlwZT1cInhzZDpmbG9hdFwiJGF0dHM+JHZhbDwvJG5hbWU+IjsKCQkJCX0KCQkJCWJyZWFrOwoJCQljYXNlIChpc19zdHJpbmcoJHZhbCkgfHwgJHR5cGUgPT0gJ3N0cmluZycpOgoJCQkJJHZhbCA9ICR0aGlzLT5leHBhbmRFbnRpdGllcygkdmFsKTsKCQkJCWlmICgkdXNlID09ICdsaXRlcmFsJykgewoJCQkJCSR4bWwgLj0gIjwkbmFtZSR4bWxucyAkYXR0cz4kdmFsPC8kbmFtZT4iOwoJCQkJfSBlbHNlIHsKCQkJCQkkeG1sIC49ICI8JG5hbWUkeG1sbnMgeHNpOnR5cGU9XCJ4c2Q6c3RyaW5nXCIkYXR0cz4kdmFsPC8kbmFtZT4iOwoJCQkJfQoJCQkJYnJlYWs7CgkJCWNhc2UgaXNfb2JqZWN0KCR2YWwpOgoJCQkJaWYgKCEgJG5hbWUpIHsKCQkJCQkkbmFtZSA9IGdldF9jbGFzcygkdmFsKTsKCQkJCQkkdGhpcy0+ZGVidWcoIkluIHNlcmlhbGl6ZV92YWwsIHVzZWQgY2xhc3MgbmFtZSAkbmFtZSBhcyBlbGVtZW50IG5hbWUiKTsKCQkJCX0gZWxzZSB7CgkJCQkJJHRoaXMtPmRlYnVnKCJJbiBzZXJpYWxpemVfdmFsLCBkbyBub3Qgb3ZlcnJpZGUgbmFtZSAkbmFtZSBmb3IgZWxlbWVudCBuYW1lIGZvciBjbGFzcyAiIC4gZ2V0X2NsYXNzKCR2YWwpKTsKCQkJCX0KCQkJCWZvcmVhY2goZ2V0X29iamVjdF92YXJzKCR2YWwpIGFzICRrID0+ICR2KXsKCQkJCQkkcFhtbCA9IGlzc2V0KCRwWG1sKSA/ICRwWG1sLiR0aGlzLT5zZXJpYWxpemVfdmFsKCR2LCRrLGZhbHNlLGZhbHNlLGZhbHNlLGZhbHNlLCR1c2UpIDogJHRoaXMtPnNlcmlhbGl6ZV92YWwoJHYsJGssZmFsc2UsZmFsc2UsZmFsc2UsZmFsc2UsJHVzZSk7CgkJCQl9CgkJCQkkeG1sIC49ICc8Jy4kbmFtZS4nPicuJHBYbWwuJzwvJy4kbmFtZS4nPic7CgkJCQlicmVhazsKCQkJYnJlYWs7CgkJCWNhc2UgKGlzX2FycmF5KCR2YWwpIHx8ICR0eXBlKToKCQkJCS8vIGRldGVjdCBpZiBzdHJ1Y3Qgb3IgYXJyYXkKCQkJCSR2YWx1ZVR5cGUgPSAkdGhpcy0+aXNBcnJheVNpbXBsZU9yU3RydWN0KCR2YWwpOwogICAgICAgICAgICAgICAgaWYoJHZhbHVlVHlwZT09J2FycmF5U2ltcGxlJyB8fCBlcmVnKCdeQXJyYXlPZicsJHR5cGUpKXsKCQkJCQkkaSA9IDA7CgkJCQkJaWYoaXNfYXJyYXkoJHZhbCkgJiYgY291bnQoJHZhbCk+IDApewoJCQkJCQlmb3JlYWNoKCR2YWwgYXMgJHYpewoJICAgICAgICAgICAgICAgICAgICAJaWYoaXNfb2JqZWN0KCR2KSAmJiBnZXRfY2xhc3MoJHYpID09ICAnc29hcHZhbCcpewoJCQkJCQkJCSR0dF9ucyA9ICR2LT50eXBlX25zOwoJCQkJCQkJCSR0dCA9ICR2LT50eXBlOwoJCQkJCQkJfSBlbHNlaWYgKGlzX2FycmF5KCR2KSkgewoJCQkJCQkJCSR0dCA9ICR0aGlzLT5pc0FycmF5U2ltcGxlT3JTdHJ1Y3QoJHYpOwoJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQkkdHQgPSBnZXR0eXBlKCR2KTsKCSAgICAgICAgICAgICAgICAgICAgICAgIH0KCQkJCQkJCSRhcnJheV90eXBlc1skdHRdID0gMTsKCQkJCQkJCS8vIFRPRE86IGZvciBsaXRlcmFsLCB0aGUgbmFtZSBzaG91bGQgYmUgJG5hbWUKCQkJCQkJCSR4bWwgLj0gJHRoaXMtPnNlcmlhbGl6ZV92YWwoJHYsJ2l0ZW0nLGZhbHNlLGZhbHNlLGZhbHNlLGZhbHNlLCR1c2UpOwoJCQkJCQkJKyskaTsKCQkJCQkJfQoJCQkJCQlpZihjb3VudCgkYXJyYXlfdHlwZXMpID4gMSl7CgkJCQkJCQkkYXJyYXlfdHlwZW5hbWUgPSAneHNkOmFueVR5cGUnOwoJCQkJCQl9IGVsc2VpZihpc3NldCgkdHQpICYmIGlzc2V0KCR0aGlzLT50eXBlbWFwWyR0aGlzLT5YTUxTY2hlbWFWZXJzaW9uXVskdHRdKSkgewoJCQkJCQkJaWYgKCR0dCA9PSAnaW50ZWdlcicpIHsKCQkJCQkJCQkkdHQgPSAnaW50JzsKCQkJCQkJCX0KCQkJCQkJCSRhcnJheV90eXBlbmFtZSA9ICd4c2Q6Jy4kdHQ7CgkJCQkJCX0gZWxzZWlmKGlzc2V0KCR0dCkgJiYgJHR0ID09ICdhcnJheVNpbXBsZScpewoJCQkJCQkJJGFycmF5X3R5cGVuYW1lID0gJ1NPQVAtRU5DOkFycmF5JzsKCQkJCQkJfSBlbHNlaWYoaXNzZXQoJHR0KSAmJiAkdHQgPT0gJ2FycmF5U3RydWN0Jyl7CgkJCQkJCQkkYXJyYXlfdHlwZW5hbWUgPSAndW5uYW1lZF9zdHJ1Y3RfdXNlX3NvYXB2YWwnOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJLy8gaWYgdHlwZSBpcyBwcmVmaXhlZCwgY3JlYXRlIHR5cGUgcHJlZml4CgkJCQkJCQlpZiAoJHR0X25zICE9ICcnICYmICR0dF9ucyA9PSAkdGhpcy0+bmFtZXNwYWNlc1sneHNkJ10pewoJCQkJCQkJCSAkYXJyYXlfdHlwZW5hbWUgPSAneHNkOicgLiAkdHQ7CgkJCQkJCQl9IGVsc2VpZiAoJHR0X25zKSB7CgkJCQkJCQkJJHR0X3ByZWZpeCA9ICducycgLiByYW5kKDEwMDAsIDk5OTkpOwoJCQkJCQkJCSRhcnJheV90eXBlbmFtZSA9ICIkdHRfcHJlZml4OiR0dCI7CgkJCQkJCQkJJHhtbG5zIC49ICIgeG1sbnM6JHR0X3ByZWZpeD1cIiR0dF9uc1wiIjsKCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJJGFycmF5X3R5cGVuYW1lID0gJHR0OwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCSRhcnJheV90eXBlID0gJGk7CgkJCQkJCWlmICgkdXNlID09ICdsaXRlcmFsJykgewoJCQkJCQkJJHR5cGVfc3RyID0gJyc7CgkJCQkJCX0gZWxzZSBpZiAoaXNzZXQoJHR5cGUpICYmIGlzc2V0KCR0eXBlX3ByZWZpeCkpIHsKCQkJCQkJCSR0eXBlX3N0ciA9ICIgeHNpOnR5cGU9XCIkdHlwZV9wcmVmaXg6JHR5cGVcIiI7CgkJCQkJCX0gZWxzZSB7CgkJCQkJCQkkdHlwZV9zdHIgPSAiIHhzaTp0eXBlPVwiU09BUC1FTkM6QXJyYXlcIiBTT0FQLUVOQzphcnJheVR5cGU9XCIiLiRhcnJheV90eXBlbmFtZS4iWyRhcnJheV90eXBlXVwiIjsKCQkJCQkJfQoJCQkJCS8vIGVtcHR5IGFycmF5CgkJCQkJfSBlbHNlIHsKCQkJCQkJaWYgKCR1c2UgPT0gJ2xpdGVyYWwnKSB7CgkJCQkJCQkkdHlwZV9zdHIgPSAnJzsKCQkJCQkJfSBlbHNlIGlmIChpc3NldCgkdHlwZSkgJiYgaXNzZXQoJHR5cGVfcHJlZml4KSkgewoJCQkJCQkJJHR5cGVfc3RyID0gIiB4c2k6dHlwZT1cIiR0eXBlX3ByZWZpeDokdHlwZVwiIjsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCSR0eXBlX3N0ciA9ICIgeHNpOnR5cGU9XCJTT0FQLUVOQzpBcnJheVwiIFNPQVAtRU5DOmFycmF5VHlwZT1cInhzZDphbnlUeXBlWzBdXCIiOwoJCQkJCQl9CgkJCQkJfQoJCQkJCS8vIFRPRE86IGZvciBhcnJheSBpbiBsaXRlcmFsLCB0aGVyZSBpcyBubyB3cmFwcGVyIGhlcmUKCQkJCQkkeG1sID0gIjwkbmFtZSR4bWxucyR0eXBlX3N0ciRhdHRzPiIuJHhtbC4iPC8kbmFtZT4iOwoJCQkJfSBlbHNlIHsKCQkJCQkvLyBnb3QgYSBzdHJ1Y3QKCQkJCQlpZihpc3NldCgkdHlwZSkgJiYgaXNzZXQoJHR5cGVfcHJlZml4KSl7CgkJCQkJCSR0eXBlX3N0ciA9ICIgeHNpOnR5cGU9XCIkdHlwZV9wcmVmaXg6JHR5cGVcIiI7CgkJCQkJfSBlbHNlIHsKCQkJCQkJJHR5cGVfc3RyID0gJyc7CgkJCQkJfQoJCQkJCWlmICgkdXNlID09ICdsaXRlcmFsJykgewoJCQkJCQkkeG1sIC49ICI8JG5hbWUkeG1sbnMgJGF0dHM+IjsKCQkJCQl9IGVsc2UgewoJCQkJCQkkeG1sIC49ICI8JG5hbWUkeG1sbnMkdHlwZV9zdHIkYXR0cz4iOwoJCQkJCX0KCQkJCQlmb3JlYWNoKCR2YWwgYXMgJGsgPT4gJHYpewoJCQkJCQkvLyBBcGFjaGUgTWFwCgkJCQkJCWlmICgkdHlwZSA9PSAnTWFwJyAmJiAkdHlwZV9ucyA9PSAnaHR0cDovL3htbC5hcGFjaGUub3JnL3htbC1zb2FwJykgewoJCQkJCQkJJHhtbCAuPSAnPGl0ZW0+JzsKCQkJCQkJCSR4bWwgLj0gJHRoaXMtPnNlcmlhbGl6ZV92YWwoJGssJ2tleScsZmFsc2UsZmFsc2UsZmFsc2UsZmFsc2UsJHVzZSk7CgkJCQkJCQkkeG1sIC49ICR0aGlzLT5zZXJpYWxpemVfdmFsKCR2LCd2YWx1ZScsZmFsc2UsZmFsc2UsZmFsc2UsZmFsc2UsJHVzZSk7CgkJCQkJCQkkeG1sIC49ICc8L2l0ZW0+JzsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCSR4bWwgLj0gJHRoaXMtPnNlcmlhbGl6ZV92YWwoJHYsJGssZmFsc2UsZmFsc2UsZmFsc2UsZmFsc2UsJHVzZSk7CgkJCQkJCX0KCQkJCQl9CgkJCQkJJHhtbCAuPSAiPC8kbmFtZT4iOwoJCQkJfQoJCQkJYnJlYWs7CgkJCWRlZmF1bHQ6CgkJCQkkeG1sIC49ICdub3QgZGV0ZWN0ZWQsIGdvdCAnLmdldHR5cGUoJHZhbCkuJyBmb3IgJy4kdmFsOwoJCQkJYnJlYWs7CgkJfQoJCXJldHVybiAkeG1sOwoJfQoKICAgIC8qKgogICAgKiBzZXJpYWxpemVzIGEgbWVzc2FnZQogICAgKgogICAgKiBAcGFyYW0gc3RyaW5nICRib2R5IHRoZSBYTUwgb2YgdGhlIFNPQVAgYm9keQogICAgKiBAcGFyYW0gbWl4ZWQgJGhlYWRlcnMgb3B0aW9uYWwgc3RyaW5nIG9mIFhNTCB3aXRoIFNPQVAgaGVhZGVyIGNvbnRlbnQsIG9yIGFycmF5IG9mIHNvYXB2YWwgb2JqZWN0cyBmb3IgU09BUCBoZWFkZXJzCiAgICAqIEBwYXJhbSBhcnJheSAkbmFtZXNwYWNlcyBvcHRpb25hbCB0aGUgbmFtZXNwYWNlcyB1c2VkIGluIGdlbmVyYXRpbmcgdGhlIGJvZHkgYW5kIGhlYWRlcnMKICAgICogQHBhcmFtIHN0cmluZyAkc3R5bGUgb3B0aW9uYWwgKHJwY3xkb2N1bWVudCkKICAgICogQHBhcmFtIHN0cmluZyAkdXNlIG9wdGlvbmFsIChlbmNvZGVkfGxpdGVyYWwpCiAgICAqIEBwYXJhbSBzdHJpbmcgJGVuY29kaW5nU3R5bGUgb3B0aW9uYWwgKHVzdWFsbHkgJ2h0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvJyBmb3IgZW5jb2RlZCkKICAgICogQHJldHVybiBzdHJpbmcgdGhlIG1lc3NhZ2UKICAgICogQGFjY2VzcyBwdWJsaWMKICAgICovCiAgICBmdW5jdGlvbiBzZXJpYWxpemVFbnZlbG9wZSgkYm9keSwkaGVhZGVycz1mYWxzZSwkbmFtZXNwYWNlcz1hcnJheSgpLCRzdHlsZT0ncnBjJywkdXNlPSdlbmNvZGVkJywkZW5jb2RpbmdTdHlsZT0naHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8nKXsKICAgIC8vIFRPRE86IGFkZCBhbiBvcHRpb24gdG8gYXV0b21hdGljYWxseSBydW4gdXRmOF9lbmNvZGUgb24gJGJvZHkgYW5kICRoZWFkZXJzCiAgICAvLyBpZiAkdGhpcy0+c29hcF9kZWZlbmNvZGluZyBpcyBVVEYtOC4gIE5vdCBkb2luZyB0aGlzIGF1dG9tYXRpY2FsbHkgYWxsb3dzCiAgICAvLyBvbmUgdG8gc2VuZCBhcmJpdHJhcnkgVVRGLTggY2hhcmFjdGVycywgbm90IGp1c3QgY2hhcmFjdGVycyB0aGF0IG1hcCB0byBJU08tODg1OS0xCgoJJHRoaXMtPmRlYnVnKCJJbiBzZXJpYWxpemVFbnZlbG9wZSBsZW5ndGg9IiAuIHN0cmxlbigkYm9keSkgLiAiIGJvZHkgKG1heCAxMDAwIGNoYXJhY3RlcnMpPSIgLiBzdWJzdHIoJGJvZHksIDAsIDEwMDApIC4gIiBzdHlsZT0kc3R5bGUgdXNlPSR1c2UgZW5jb2RpbmdTdHlsZT0kZW5jb2RpbmdTdHlsZSIpOwoJJHRoaXMtPmRlYnVnKCJoZWFkZXJzOiIpOwoJJHRoaXMtPmFwcGVuZERlYnVnKCR0aGlzLT52YXJEdW1wKCRoZWFkZXJzKSk7CgkkdGhpcy0+ZGVidWcoIm5hbWVzcGFjZXM6Iik7CgkkdGhpcy0+YXBwZW5kRGVidWcoJHRoaXMtPnZhckR1bXAoJG5hbWVzcGFjZXMpKTsKCgkvLyBzZXJpYWxpemUgbmFtZXNwYWNlcwogICAgJG5zX3N0cmluZyA9ICcnOwoJZm9yZWFjaChhcnJheV9tZXJnZSgkdGhpcy0+bmFtZXNwYWNlcywkbmFtZXNwYWNlcykgYXMgJGsgPT4gJHYpewoJCSRuc19zdHJpbmcgLj0gIiB4bWxuczokaz1cIiR2XCIiOwoJfQoJaWYoJGVuY29kaW5nU3R5bGUpIHsKCQkkbnNfc3RyaW5nID0gIiBTT0FQLUVOVjplbmNvZGluZ1N0eWxlPVwiJGVuY29kaW5nU3R5bGVcIiRuc19zdHJpbmciOwoJfQoKCS8vIHNlcmlhbGl6ZSBoZWFkZXJzCglpZigkaGVhZGVycyl7CgkJaWYgKGlzX2FycmF5KCRoZWFkZXJzKSkgewoJCQkkeG1sID0gJyc7CgkJCWZvcmVhY2ggKCRoZWFkZXJzIGFzICRoZWFkZXIpIHsKCQkJCSR4bWwgLj0gJHRoaXMtPnNlcmlhbGl6ZV92YWwoJGhlYWRlciwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAkdXNlKTsKCQkJfQoJCQkkaGVhZGVycyA9ICR4bWw7CgkJCSR0aGlzLT5kZWJ1ZygiSW4gc2VyaWFsaXplRW52ZWxvcGUsIHNlcmlhbHppZWQgYXJyYXkgb2YgaGVhZGVycyB0byAkaGVhZGVycyIpOwoJCX0KCQkkaGVhZGVycyA9ICI8U09BUC1FTlY6SGVhZGVyPiIuJGhlYWRlcnMuIjwvU09BUC1FTlY6SGVhZGVyPiI7Cgl9CgkvLyBzZXJpYWxpemUgZW52ZWxvcGUKCXJldHVybgoJJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IicuJHRoaXMtPnNvYXBfZGVmZW5jb2RpbmcgLiciPycuIj4iLgoJJzxTT0FQLUVOVjpFbnZlbG9wZScuJG5zX3N0cmluZy4iPiIuCgkkaGVhZGVycy4KCSI8U09BUC1FTlY6Qm9keT4iLgoJCSRib2R5LgoJIjwvU09BUC1FTlY6Qm9keT4iLgoJIjwvU09BUC1FTlY6RW52ZWxvcGU+IjsKICAgIH0KCgkvKioKCSAqIGZvcm1hdHMgYSBzdHJpbmcgdG8gYmUgaW5zZXJ0ZWQgaW50byBhbiBIVE1MIHN0cmVhbQoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJHN0ciBUaGUgc3RyaW5nIHRvIGZvcm1hdAoJICogQHJldHVybiBzdHJpbmcgVGhlIGZvcm1hdHRlZCBzdHJpbmcKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAZGVwcmVjYXRlZAoJICovCiAgICBmdW5jdGlvbiBmb3JtYXREdW1wKCRzdHIpewoJCSRzdHIgPSBodG1sc3BlY2lhbGNoYXJzKCRzdHIpOwoJCXJldHVybiBubDJicigkc3RyKTsKICAgIH0KCgkvKioKCSogY29udHJhY3RzIChjaGFuZ2VzIG5hbWVzcGFjZSB0byBwcmVmaXgpIGEgcXVhbGlmaWVkIG5hbWUKCSoKCSogQHBhcmFtICAgIHN0cmluZyAkcW5hbWUgcW5hbWUKCSogQHJldHVybglzdHJpbmcgY29udHJhY3RlZCBxbmFtZQoJKiBAYWNjZXNzICAgcHJpdmF0ZQoJKi8KCWZ1bmN0aW9uIGNvbnRyYWN0UW5hbWUoJHFuYW1lKXsKCQkvLyBnZXQgZWxlbWVudCBuYW1lc3BhY2UKCQkvLyR0aGlzLT54ZGVidWcoIkNvbnRyYWN0ICRxbmFtZSIpOwoJCWlmIChzdHJycG9zKCRxbmFtZSwgJzonKSkgewoJCQkvLyBnZXQgdW5xdWFsaWZpZWQgbmFtZQoJCQkkbmFtZSA9IHN1YnN0cigkcW5hbWUsIHN0cnJwb3MoJHFuYW1lLCAnOicpICsgMSk7CgkJCS8vIGdldCBucwoJCQkkbnMgPSBzdWJzdHIoJHFuYW1lLCAwLCBzdHJycG9zKCRxbmFtZSwgJzonKSk7CgkJCSRwID0gJHRoaXMtPmdldFByZWZpeEZyb21OYW1lc3BhY2UoJG5zKTsKCQkJaWYgKCRwKSB7CgkJCQlyZXR1cm4gJHAgLiAnOicgLiAkbmFtZTsKCQkJfQoJCQlyZXR1cm4gJHFuYW1lOwoJCX0gZWxzZSB7CgkJCXJldHVybiAkcW5hbWU7CgkJfQoJfQoKCS8qKgoJKiBleHBhbmRzIChjaGFuZ2VzIHByZWZpeCB0byBuYW1lc3BhY2UpIGEgcXVhbGlmaWVkIG5hbWUKCSoKCSogQHBhcmFtICAgIHN0cmluZyAkc3RyaW5nIHFuYW1lCgkqIEByZXR1cm4Jc3RyaW5nIGV4cGFuZGVkIHFuYW1lCgkqIEBhY2Nlc3MgICBwcml2YXRlCgkqLwoJZnVuY3Rpb24gZXhwYW5kUW5hbWUoJHFuYW1lKXsKCQkvLyBnZXQgZWxlbWVudCBwcmVmaXgKCQlpZihzdHJwb3MoJHFuYW1lLCc6JykgJiYgIWVyZWcoJ15odHRwOi8vJywkcW5hbWUpKXsKCQkJLy8gZ2V0IHVucXVhbGlmaWVkIG5hbWUKCQkJJG5hbWUgPSBzdWJzdHIoc3Ryc3RyKCRxbmFtZSwnOicpLDEpOwoJCQkvLyBnZXQgbnMgcHJlZml4CgkJCSRwcmVmaXggPSBzdWJzdHIoJHFuYW1lLDAsc3RycG9zKCRxbmFtZSwnOicpKTsKCQkJaWYoaXNzZXQoJHRoaXMtPm5hbWVzcGFjZXNbJHByZWZpeF0pKXsKCQkJCXJldHVybiAkdGhpcy0+bmFtZXNwYWNlc1skcHJlZml4XS4nOicuJG5hbWU7CgkJCX0gZWxzZSB7CgkJCQlyZXR1cm4gJHFuYW1lOwoJCQl9CgkJfSBlbHNlIHsKCQkJcmV0dXJuICRxbmFtZTsKCQl9Cgl9CgogICAgLyoqCiAgICAqIHJldHVybnMgdGhlIGxvY2FsIHBhcnQgb2YgYSBwcmVmaXhlZCBzdHJpbmcKICAgICogcmV0dXJucyB0aGUgb3JpZ2luYWwgc3RyaW5nLCBpZiBub3QgcHJlZml4ZWQKICAgICoKICAgICogQHBhcmFtIHN0cmluZyAkc3RyIFRoZSBwcmVmaXhlZCBzdHJpbmcKICAgICogQHJldHVybiBzdHJpbmcgVGhlIGxvY2FsIHBhcnQKICAgICogQGFjY2VzcyBwdWJsaWMKICAgICovCglmdW5jdGlvbiBnZXRMb2NhbFBhcnQoJHN0cil7CgkJaWYoJHNzdHIgPSBzdHJyY2hyKCRzdHIsJzonKSl7CgkJCS8vIGdldCB1bnF1YWxpZmllZCBuYW1lCgkJCXJldHVybiBzdWJzdHIoICRzc3RyLCAxICk7CgkJfSBlbHNlIHsKCQkJcmV0dXJuICRzdHI7CgkJfQoJfQoKCS8qKgogICAgKiByZXR1cm5zIHRoZSBwcmVmaXggcGFydCBvZiBhIHByZWZpeGVkIHN0cmluZwogICAgKiByZXR1cm5zIGZhbHNlLCBpZiBub3QgcHJlZml4ZWQKICAgICoKICAgICogQHBhcmFtIHN0cmluZyAkc3RyIFRoZSBwcmVmaXhlZCBzdHJpbmcKICAgICogQHJldHVybiBtaXhlZCBUaGUgcHJlZml4IG9yIGZhbHNlIGlmIHRoZXJlIGlzIG5vIHByZWZpeAogICAgKiBAYWNjZXNzIHB1YmxpYwogICAgKi8KCWZ1bmN0aW9uIGdldFByZWZpeCgkc3RyKXsKCQlpZigkcG9zID0gc3RycnBvcygkc3RyLCc6JykpewoJCQkvLyBnZXQgcHJlZml4CgkJCXJldHVybiBzdWJzdHIoJHN0ciwwLCRwb3MpOwoJCX0KCQlyZXR1cm4gZmFsc2U7Cgl9CgoJLyoqCiAgICAqIHBhc3MgaXQgYSBwcmVmaXgsIGl0IHJldHVybnMgYSBuYW1lc3BhY2UKICAgICoKICAgICogQHBhcmFtIHN0cmluZyAkcHJlZml4IFRoZSBwcmVmaXgKICAgICogQHJldHVybiBtaXhlZCBUaGUgbmFtZXNwYWNlLCBmYWxzZSBpZiBubyBuYW1lc3BhY2UgaGFzIHRoZSBzcGVjaWZpZWQgcHJlZml4CiAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAqLwoJZnVuY3Rpb24gZ2V0TmFtZXNwYWNlRnJvbVByZWZpeCgkcHJlZml4KXsKCQlpZiAoaXNzZXQoJHRoaXMtPm5hbWVzcGFjZXNbJHByZWZpeF0pKSB7CgkJCXJldHVybiAkdGhpcy0+bmFtZXNwYWNlc1skcHJlZml4XTsKCQl9CgkJLy8kdGhpcy0+c2V0RXJyb3IoIk5vIG5hbWVzcGFjZSByZWdpc3RlcmVkIGZvciBwcmVmaXggJyRwcmVmaXgnIik7CgkJcmV0dXJuIGZhbHNlOwoJfQoKCS8qKgogICAgKiByZXR1cm5zIHRoZSBwcmVmaXggZm9yIGEgZ2l2ZW4gbmFtZXNwYWNlIChvciBwcmVmaXgpCiAgICAqIG9yIGZhbHNlIGlmIG5vIHByZWZpeGVzIHJlZ2lzdGVyZWQgZm9yIHRoZSBnaXZlbiBuYW1lc3BhY2UKICAgICoKICAgICogQHBhcmFtIHN0cmluZyAkbnMgVGhlIG5hbWVzcGFjZQogICAgKiBAcmV0dXJuIG1peGVkIFRoZSBwcmVmaXgsIGZhbHNlIGlmIHRoZSBuYW1lc3BhY2UgaGFzIG5vIHByZWZpeGVzCiAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAqLwoJZnVuY3Rpb24gZ2V0UHJlZml4RnJvbU5hbWVzcGFjZSgkbnMpIHsKCQlmb3JlYWNoICgkdGhpcy0+bmFtZXNwYWNlcyBhcyAkcCA9PiAkbikgewoJCQlpZiAoJG5zID09ICRuIHx8ICRucyA9PSAkcCkgewoJCQkgICAgJHRoaXMtPnVzZWROYW1lc3BhY2VzWyRwXSA9ICRuOwoJCQkJcmV0dXJuICRwOwoJCQl9CgkJfQoJCXJldHVybiBmYWxzZTsKCX0KCgkvKioKICAgICogcmV0dXJucyB0aGUgdGltZSBpbiBPREJDIGNhbm9uaWNhbCBmb3JtIHdpdGggbWljcm9zZWNvbmRzCiAgICAqCiAgICAqIEByZXR1cm4gc3RyaW5nIFRoZSB0aW1lIGluIE9EQkMgY2Fub25pY2FsIGZvcm0gd2l0aCBtaWNyb3NlY29uZHMKICAgICogQGFjY2VzcyBwdWJsaWMKICAgICovCglmdW5jdGlvbiBnZXRtaWNyb3RpbWUoKSB7CgkJaWYgKGZ1bmN0aW9uX2V4aXN0cygnZ2V0dGltZW9mZGF5JykpIHsKCQkJJHRvZCA9IGdldHRpbWVvZmRheSgpOwoJCQkkc2VjID0gJHRvZFsnc2VjJ107CgkJCSR1c2VjID0gJHRvZFsndXNlYyddOwoJCX0gZWxzZSB7CgkJCSRzZWMgPSB0aW1lKCk7CgkJCSR1c2VjID0gMDsKCQl9CgkJcmV0dXJuIHN0cmZ0aW1lKCclWS0lbS0lZCAlSDolTTolUycsICRzZWMpIC4gJy4nIC4gc3ByaW50ZignJTA2ZCcsICR1c2VjKTsKCX0KCgkvKioKCSAqIFJldHVybnMgYSBzdHJpbmcgd2l0aCB0aGUgb3V0cHV0IG9mIHZhcl9kdW1wCgkgKgoJICogQHBhcmFtIG1peGVkICRkYXRhIFRoZSB2YXJpYWJsZSB0byB2YXJfZHVtcAoJICogQHJldHVybiBzdHJpbmcgVGhlIG91dHB1dCBvZiB2YXJfZHVtcAoJICogQGFjY2VzcyBwdWJsaWMKCSAqLwogICAgZnVuY3Rpb24gdmFyRHVtcCgkZGF0YSkgewoJCW9iX3N0YXJ0KCk7CgkJdmFyX2R1bXAoJGRhdGEpOwoJCSRyZXRfdmFsID0gb2JfZ2V0X2NvbnRlbnRzKCk7CgkJb2JfZW5kX2NsZWFuKCk7CgkJcmV0dXJuICRyZXRfdmFsOwoJfQp9CgovLyBYTUwgU2NoZW1hIERhdGF0eXBlIEhlbHBlciBGdW5jdGlvbnMKCi8veHNkOmRhdGVUaW1lIGhlbHBlcnMKCi8qKgoqIGNvbnZlcnQgdW5peCB0aW1lc3RhbXAgdG8gSVNPIDg2MDEgY29tcGxpYW50IGRhdGUgc3RyaW5nCioKKiBAcGFyYW0gICAgc3RyaW5nICR0aW1lc3RhbXAgVW5peCB0aW1lIHN0YW1wCiogQGFjY2VzcyAgIHB1YmxpYwoqLwpmdW5jdGlvbiB0aW1lc3RhbXBfdG9faXNvODYwMSgkdGltZXN0YW1wLCR1dGM9dHJ1ZSl7CgkkZGF0ZXN0ciA9IGRhdGUoJ1ktbS1kXFRIOmk6c08nLCR0aW1lc3RhbXApOwoJaWYoJHV0Yyl7CgkJJGVyZWdTdHIgPQoJCScoWzAtOV17NH0pLScuCS8vIGNlbnR1cmllcyAmIHllYXJzIENDWVktCgkJJyhbMC05XXsyfSktJy4JLy8gbW9udGhzIE1NLQoJCScoWzAtOV17Mn0pJy4JLy8gZGF5cyBERAoJCSdUJy4JCQkvLyBzZXBhcmF0b3IgVAoJCScoWzAtOV17Mn0pOicuCS8vIGhvdXJzIGhoOgoJCScoWzAtOV17Mn0pOicuCS8vIG1pbnV0ZXMgbW06CgkJJyhbMC05XXsyfSkoXC5bMC05XSopPycuIC8vIHNlY29uZHMgc3Muc3MuLi4KCQknKFp8WytcLV1bMC05XXsyfTo/WzAtOV17Mn0pPyc7IC8vIFogdG8gaW5kaWNhdGUgVVRDLCAtLytISDpNTTpTUy5TUy4uLiBmb3IgbG9jYWwgdHoncwoKCQlpZihlcmVnKCRlcmVnU3RyLCRkYXRlc3RyLCRyZWdzKSl7CgkJCXJldHVybiBzcHJpbnRmKCclMDRkLSUwMmQtJTAyZFQlMDJkOiUwMmQ6JTAyZFonLCRyZWdzWzFdLCRyZWdzWzJdLCRyZWdzWzNdLCRyZWdzWzRdLCRyZWdzWzVdLCRyZWdzWzZdKTsKCQl9CgkJcmV0dXJuIGZhbHNlOwoJfSBlbHNlIHsKCQlyZXR1cm4gJGRhdGVzdHI7Cgl9Cn0KCi8qKgoqIGNvbnZlcnQgSVNPIDg2MDEgY29tcGxpYW50IGRhdGUgc3RyaW5nIHRvIHVuaXggdGltZXN0YW1wCioKKiBAcGFyYW0gICAgc3RyaW5nICRkYXRlc3RyIElTTyA4NjAxIGNvbXBsaWFudCBkYXRlIHN0cmluZwoqIEBhY2Nlc3MgICBwdWJsaWMKKi8KZnVuY3Rpb24gaXNvODYwMV90b190aW1lc3RhbXAoJGRhdGVzdHIpewoJJGVyZWdTdHIgPQoJJyhbMC05XXs0fSktJy4JLy8gY2VudHVyaWVzICYgeWVhcnMgQ0NZWS0KCScoWzAtOV17Mn0pLScuCS8vIG1vbnRocyBNTS0KCScoWzAtOV17Mn0pJy4JLy8gZGF5cyBERAoJJ1QnLgkJCS8vIHNlcGFyYXRvciBUCgknKFswLTldezJ9KTonLgkvLyBob3VycyBoaDoKCScoWzAtOV17Mn0pOicuCS8vIG1pbnV0ZXMgbW06CgknKFswLTldezJ9KShcLlswLTldKyk/Jy4gLy8gc2Vjb25kcyBzcy5zcy4uLgoJJyhafFsrXC1dWzAtOV17Mn06P1swLTldezJ9KT8nOyAvLyBaIHRvIGluZGljYXRlIFVUQywgLS8rSEg6TU06U1MuU1MuLi4gZm9yIGxvY2FsIHR6J3MKCWlmKGVyZWcoJGVyZWdTdHIsJGRhdGVzdHIsJHJlZ3MpKXsKCQkvLyBub3QgdXRjCgkJaWYoJHJlZ3NbOF0gIT0gJ1onKXsKCQkJJG9wID0gc3Vic3RyKCRyZWdzWzhdLDAsMSk7CgkJCSRoID0gc3Vic3RyKCRyZWdzWzhdLDEsMik7CgkJCSRtID0gc3Vic3RyKCRyZWdzWzhdLHN0cmxlbigkcmVnc1s4XSktMiwyKTsKCQkJaWYoJG9wID09ICctJyl7CgkJCQkkcmVnc1s0XSA9ICRyZWdzWzRdICsgJGg7CgkJCQkkcmVnc1s1XSA9ICRyZWdzWzVdICsgJG07CgkJCX0gZWxzZWlmKCRvcCA9PSAnKycpewoJCQkJJHJlZ3NbNF0gPSAkcmVnc1s0XSAtICRoOwoJCQkJJHJlZ3NbNV0gPSAkcmVnc1s1XSAtICRtOwoJCQl9CgkJfQoJCXJldHVybiBzdHJ0b3RpbWUoIiRyZWdzWzFdLSRyZWdzWzJdLSRyZWdzWzNdICRyZWdzWzRdOiRyZWdzWzVdOiRyZWdzWzZdWiIpOwoJfSBlbHNlIHsKCQlyZXR1cm4gZmFsc2U7Cgl9Cn0KCi8qKgoqIHNsZWVwcyBzb21lIG51bWJlciBvZiBtaWNyb3NlY29uZHMKKgoqIEBwYXJhbSAgICBzdHJpbmcgJHVzZWMgdGhlIG51bWJlciBvZiBtaWNyb3NlY29uZHMgdG8gc2xlZXAKKiBAYWNjZXNzICAgcHVibGljCiogQGRlcHJlY2F0ZWQKKi8KZnVuY3Rpb24gdXNsZWVwV2luZG93cygkdXNlYykKewoJJHN0YXJ0ID0gZ2V0dGltZW9mZGF5KCk7CgkKCWRvCgl7CgkJJHN0b3AgPSBnZXR0aW1lb2ZkYXkoKTsKCQkkdGltZVBhc3NlZCA9IDEwMDAwMDAgKiAoJHN0b3BbJ3NlYyddIC0gJHN0YXJ0WydzZWMnXSkKCQkrICRzdG9wWyd1c2VjJ10gLSAkc3RhcnRbJ3VzZWMnXTsKCX0KCXdoaWxlICgkdGltZVBhc3NlZCA8ICR1c2VjKTsKfQoKPz48P3BocAoKCgovKioKKiBDb250YWlucyBpbmZvcm1hdGlvbiBmb3IgYSBTT0FQIGZhdWx0LgoqIE1haW5seSB1c2VkIGZvciByZXR1cm5pbmcgZmF1bHRzIGZyb20gZGVwbG95ZWQgZnVuY3Rpb25zCiogaW4gYSBzZXJ2ZXIgaW5zdGFuY2UuCiogQGF1dGhvciAgIERpZXRyaWNoIEF5YWxhIDxkaWV0cmljaEBnYW54NC5jb20+CiogQHZlcnNpb24gICRJZDogbnVzb2FwLnBocCx2IDEuOTQgMjAwNS8wOC8wNCAwMToyNzo0MiBzbmljaG9sIEV4cCAkCiogQGFjY2VzcyBwdWJsaWMKKi8KY2xhc3Mgc29hcF9mYXVsdCBleHRlbmRzIG51c29hcF9iYXNlIHsKCS8qKgoJICogVGhlIGZhdWx0IGNvZGUgKGNsaWVudHxzZXJ2ZXIpCgkgKiBAdmFyIHN0cmluZwoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCXZhciAkZmF1bHRjb2RlOwoJLyoqCgkgKiBUaGUgZmF1bHQgYWN0b3IKCSAqIEB2YXIgc3RyaW5nCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJdmFyICRmYXVsdGFjdG9yOwoJLyoqCgkgKiBUaGUgZmF1bHQgc3RyaW5nLCBhIGRlc2NyaXB0aW9uIG9mIHRoZSBmYXVsdAoJICogQHZhciBzdHJpbmcKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCgl2YXIgJGZhdWx0c3RyaW5nOwoJLyoqCgkgKiBUaGUgZmF1bHQgZGV0YWlsLCB0eXBpY2FsbHkgYSBzdHJpbmcgb3IgYXJyYXkgb2Ygc3RyaW5nCgkgKiBAdmFyIG1peGVkCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJdmFyICRmYXVsdGRldGFpbDsKCgkvKioKCSogY29uc3RydWN0b3IKICAgICoKICAgICogQHBhcmFtIHN0cmluZyAkZmF1bHRjb2RlIChjbGllbnQgfCBzZXJ2ZXIpCiAgICAqIEBwYXJhbSBzdHJpbmcgJGZhdWx0YWN0b3Igb25seSB1c2VkIHdoZW4gbXNnIHJvdXRlZCBiZXR3ZWVuIG11bHRpcGxlIGFjdG9ycwogICAgKiBAcGFyYW0gc3RyaW5nICRmYXVsdHN0cmluZyBodW1hbiByZWFkYWJsZSBlcnJvciBtZXNzYWdlCiAgICAqIEBwYXJhbSBtaXhlZCAkZmF1bHRkZXRhaWwgZGV0YWlsLCB0eXBpY2FsbHkgYSBzdHJpbmcgb3IgYXJyYXkgb2Ygc3RyaW5nCgkqLwoJZnVuY3Rpb24gc29hcF9mYXVsdCgkZmF1bHRjb2RlLCRmYXVsdGFjdG9yPScnLCRmYXVsdHN0cmluZz0nJywkZmF1bHRkZXRhaWw9JycpewoJCXBhcmVudDo6bnVzb2FwX2Jhc2UoKTsKCQkkdGhpcy0+ZmF1bHRjb2RlID0gJGZhdWx0Y29kZTsKCQkkdGhpcy0+ZmF1bHRhY3RvciA9ICRmYXVsdGFjdG9yOwoJCSR0aGlzLT5mYXVsdHN0cmluZyA9ICRmYXVsdHN0cmluZzsKCQkkdGhpcy0+ZmF1bHRkZXRhaWwgPSAkZmF1bHRkZXRhaWw7Cgl9CgoJLyoqCgkqIHNlcmlhbGl6ZSBhIGZhdWx0CgkqCgkqIEByZXR1cm4Jc3RyaW5nCVRoZSBzZXJpYWxpemF0aW9uIG9mIHRoZSBmYXVsdCBpbnN0YW5jZS4KCSogQGFjY2VzcyAgIHB1YmxpYwoJKi8KCWZ1bmN0aW9uIHNlcmlhbGl6ZSgpewoJCSRuc19zdHJpbmcgPSAnJzsKCQlmb3JlYWNoKCR0aGlzLT5uYW1lc3BhY2VzIGFzICRrID0+ICR2KXsKCQkJJG5zX3N0cmluZyAuPSAiXG4gIHhtbG5zOiRrPVwiJHZcIiI7CgkJfQoJCSRyZXR1cm5fbXNnID0KCQkJJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IicuJHRoaXMtPnNvYXBfZGVmZW5jb2RpbmcuJyI/PicuCgkJCSc8U09BUC1FTlY6RW52ZWxvcGUgU09BUC1FTlY6ZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iJy4kbnNfc3RyaW5nLiI+XG4iLgoJCQkJJzxTT0FQLUVOVjpCb2R5PicuCgkJCQknPFNPQVAtRU5WOkZhdWx0PicuCgkJCQkJJHRoaXMtPnNlcmlhbGl6ZV92YWwoJHRoaXMtPmZhdWx0Y29kZSwgJ2ZhdWx0Y29kZScpLgoJCQkJCSR0aGlzLT5zZXJpYWxpemVfdmFsKCR0aGlzLT5mYXVsdGFjdG9yLCAnZmF1bHRhY3RvcicpLgoJCQkJCSR0aGlzLT5zZXJpYWxpemVfdmFsKCR0aGlzLT5mYXVsdHN0cmluZywgJ2ZhdWx0c3RyaW5nJykuCgkJCQkJJHRoaXMtPnNlcmlhbGl6ZV92YWwoJHRoaXMtPmZhdWx0ZGV0YWlsLCAnZGV0YWlsJykuCgkJCQknPC9TT0FQLUVOVjpGYXVsdD4nLgoJCQkJJzwvU09BUC1FTlY6Qm9keT4nLgoJCQknPC9TT0FQLUVOVjpFbnZlbG9wZT4nOwoJCXJldHVybiAkcmV0dXJuX21zZzsKCX0KfQoKCgo/Pjw/cGhwCgoKCi8qKgoqIHBhcnNlcyBhbiBYTUwgU2NoZW1hLCBhbGxvd3MgYWNjZXNzIHRvIGl0J3MgZGF0YSwgb3RoZXIgdXRpbGl0eSBtZXRob2RzCiogbm8gdmFsaWRhdGlvbi4uLiB5ZXQuCiogdmVyeSBleHBlcmltZW50YWwgYW5kIGxpbWl0ZWQuIEFzIGlzIGRpc2N1c3NlZCBvbiBYTUwtREVWLCBJJ20gb25lIG9mIHRoZSBwZW9wbGUKKiB0aGF0IGp1c3QgZG9lc24ndCBoYXZlIHRpbWUgdG8gcmVhZCB0aGUgc3BlYyhzKSB0aG9yb3VnaGx5LCBhbmQganVzdCBoYXZlIGEgY291cGxlIG9mIHRydXN0eQoqIHR1dG9yaWFscyBJIHJlZmVyIHRvIDopCioKKiBAYXV0aG9yICAgRGlldHJpY2ggQXlhbGEgPGRpZXRyaWNoQGdhbng0LmNvbT4KKiBAdmVyc2lvbiAgJElkOiBudXNvYXAucGhwLHYgMS45NCAyMDA1LzA4LzA0IDAxOjI3OjQyIHNuaWNob2wgRXhwICQKKiBAYWNjZXNzICAgcHVibGljCiovCmNsYXNzIFhNTFNjaGVtYSBleHRlbmRzIG51c29hcF9iYXNlICB7CgkKCS8vIGZpbGVzCgl2YXIgJHNjaGVtYSA9ICcnOwoJdmFyICR4bWwgPSAnJzsKCS8vIG5hbWVzcGFjZXMKCXZhciAkZW5jbG9zaW5nTmFtZXNwYWNlczsKCS8vIHNjaGVtYSBpbmZvCgl2YXIgJHNjaGVtYUluZm8gPSBhcnJheSgpOwoJdmFyICRzY2hlbWFUYXJnZXROYW1lc3BhY2UgPSAnJzsKCS8vIHR5cGVzLCBlbGVtZW50cywgYXR0cmlidXRlcyBkZWZpbmVkIGJ5IHRoZSBzY2hlbWEKCXZhciAkYXR0cmlidXRlcyA9IGFycmF5KCk7Cgl2YXIgJGNvbXBsZXhUeXBlcyA9IGFycmF5KCk7Cgl2YXIgJGNvbXBsZXhUeXBlU3RhY2sgPSBhcnJheSgpOwoJdmFyICRjdXJyZW50Q29tcGxleFR5cGUgPSBudWxsOwoJdmFyICRlbGVtZW50cyA9IGFycmF5KCk7Cgl2YXIgJGVsZW1lbnRTdGFjayA9IGFycmF5KCk7Cgl2YXIgJGN1cnJlbnRFbGVtZW50ID0gbnVsbDsKCXZhciAkc2ltcGxlVHlwZXMgPSBhcnJheSgpOwoJdmFyICRzaW1wbGVUeXBlU3RhY2sgPSBhcnJheSgpOwoJdmFyICRjdXJyZW50U2ltcGxlVHlwZSA9IG51bGw7CgkvLyBpbXBvcnRzCgl2YXIgJGltcG9ydHMgPSBhcnJheSgpOwoJLy8gcGFyc2VyIHZhcnMKCXZhciAkcGFyc2VyOwoJdmFyICRwb3NpdGlvbiA9IDA7Cgl2YXIgJGRlcHRoID0gMDsKCXZhciAkZGVwdGhfYXJyYXkgPSBhcnJheSgpOwoJdmFyICRtZXNzYWdlID0gYXJyYXkoKTsKCXZhciAkZGVmYXVsdE5hbWVzcGFjZSA9IGFycmF5KCk7CiAgICAKCS8qKgoJKiBjb25zdHJ1Y3RvcgoJKgoJKiBAcGFyYW0gICAgc3RyaW5nICRzY2hlbWEgc2NoZW1hIGRvY3VtZW50IFVSSQoJKiBAcGFyYW0gICAgc3RyaW5nICR4bWwgeG1sIGRvY3VtZW50IFVSSQoJKiBAcGFyYW0Jc3RyaW5nICRuYW1lc3BhY2VzIG5hbWVzcGFjZXMgZGVmaW5lZCBpbiBlbmNsb3NpbmcgWE1MCgkqIEBhY2Nlc3MgICBwdWJsaWMKCSovCglmdW5jdGlvbiBYTUxTY2hlbWEoJHNjaGVtYT0nJywkeG1sPScnLCRuYW1lc3BhY2VzPWFycmF5KCkpewoJCXBhcmVudDo6bnVzb2FwX2Jhc2UoKTsKCQkkdGhpcy0+ZGVidWcoJ3htbHNjaGVtYSBjbGFzcyBpbnN0YW50aWF0ZWQsIGluc2lkZSBjb25zdHJ1Y3RvcicpOwoJCS8vIGZpbGVzCgkJJHRoaXMtPnNjaGVtYSA9ICRzY2hlbWE7CgkJJHRoaXMtPnhtbCA9ICR4bWw7CgoJCS8vIG5hbWVzcGFjZXMKCQkkdGhpcy0+ZW5jbG9zaW5nTmFtZXNwYWNlcyA9ICRuYW1lc3BhY2VzOwoJCSR0aGlzLT5uYW1lc3BhY2VzID0gYXJyYXlfbWVyZ2UoJHRoaXMtPm5hbWVzcGFjZXMsICRuYW1lc3BhY2VzKTsKCgkJLy8gcGFyc2Ugc2NoZW1hIGZpbGUKCQlpZigkc2NoZW1hICE9ICcnKXsKCQkJJHRoaXMtPmRlYnVnKCdpbml0aWFsIHNjaGVtYSBmaWxlOiAnLiRzY2hlbWEpOwoJCQkkdGhpcy0+cGFyc2VGaWxlKCRzY2hlbWEsICdzY2hlbWEnKTsKCQl9CgoJCS8vIHBhcnNlIHhtbCBmaWxlCgkJaWYoJHhtbCAhPSAnJyl7CgkJCSR0aGlzLT5kZWJ1ZygnaW5pdGlhbCB4bWwgZmlsZTogJy4keG1sKTsKCQkJJHRoaXMtPnBhcnNlRmlsZSgkeG1sLCAneG1sJyk7CgkJfQoKCX0KCiAgICAvKioKICAgICogcGFyc2UgYW4gWE1MIGZpbGUKICAgICoKICAgICogQHBhcmFtIHN0cmluZyAkeG1sLCBwYXRoL1VSTCB0byBYTUwgZmlsZQogICAgKiBAcGFyYW0gc3RyaW5nICR0eXBlLCAoc2NoZW1hIHwgeG1sKQoJKiBAcmV0dXJuIGJvb2xlYW4KICAgICogQGFjY2VzcyBwdWJsaWMKICAgICovCglmdW5jdGlvbiBwYXJzZUZpbGUoJHhtbCwkdHlwZSl7CgkJLy8gcGFyc2UgeG1sIGZpbGUKCQlpZigkeG1sICE9ICIiKXsKCQkJJHhtbFN0ciA9IEBqb2luKCIiLEBmaWxlKCR4bWwpKTsKCQkJaWYoJHhtbFN0ciA9PSAiIil7CgkJCQkkbXNnID0gJ0Vycm9yIHJlYWRpbmcgWE1MIGZyb20gJy4keG1sOwoJCQkJJHRoaXMtPnNldEVycm9yKCRtc2cpOwoJCQkJJHRoaXMtPmRlYnVnKCRtc2cpOwoJCQlyZXR1cm4gZmFsc2U7CgkJCX0gZWxzZSB7CgkJCQkkdGhpcy0+ZGVidWcoInBhcnNpbmcgJHhtbCIpOwoJCQkJJHRoaXMtPnBhcnNlU3RyaW5nKCR4bWxTdHIsJHR5cGUpOwoJCQkJJHRoaXMtPmRlYnVnKCJkb25lIHBhcnNpbmcgJHhtbCIpOwoJCQlyZXR1cm4gdHJ1ZTsKCQkJfQoJCX0KCQlyZXR1cm4gZmFsc2U7Cgl9CgoJLyoqCgkqIHBhcnNlIGFuIFhNTCBzdHJpbmcKCSoKCSogQHBhcmFtICAgIHN0cmluZyAkeG1sIHBhdGggb3IgVVJMCiAgICAqIEBwYXJhbSBzdHJpbmcgJHR5cGUsIChzY2hlbWF8eG1sKQoJKiBAYWNjZXNzICAgcHJpdmF0ZQoJKi8KCWZ1bmN0aW9uIHBhcnNlU3RyaW5nKCR4bWwsJHR5cGUpewoJCS8vIHBhcnNlIHhtbCBzdHJpbmcKCQlpZigkeG1sICE9ICIiKXsKCgkgICAgCS8vIENyZWF0ZSBhbiBYTUwgcGFyc2VyLgoJICAgIAkkdGhpcy0+cGFyc2VyID0geG1sX3BhcnNlcl9jcmVhdGUoKTsKCSAgICAJLy8gU2V0IHRoZSBvcHRpb25zIGZvciBwYXJzaW5nIHRoZSBYTUwgZGF0YS4KCSAgICAJeG1sX3BhcnNlcl9zZXRfb3B0aW9uKCR0aGlzLT5wYXJzZXIsIFhNTF9PUFRJT05fQ0FTRV9GT0xESU5HLCAwKTsKCgkgICAgCS8vIFNldCB0aGUgb2JqZWN0IGZvciB0aGUgcGFyc2VyLgoJICAgIAl4bWxfc2V0X29iamVjdCgkdGhpcy0+cGFyc2VyLCAkdGhpcyk7CgoJICAgIAkvLyBTZXQgdGhlIGVsZW1lbnQgaGFuZGxlcnMgZm9yIHRoZSBwYXJzZXIuCgkJCWlmKCR0eXBlID09ICJzY2hlbWEiKXsKCQkgICAgCXhtbF9zZXRfZWxlbWVudF9oYW5kbGVyKCR0aGlzLT5wYXJzZXIsICdzY2hlbWFTdGFydEVsZW1lbnQnLCdzY2hlbWFFbmRFbGVtZW50Jyk7CgkJICAgIAl4bWxfc2V0X2NoYXJhY3Rlcl9kYXRhX2hhbmRsZXIoJHRoaXMtPnBhcnNlciwnc2NoZW1hQ2hhcmFjdGVyRGF0YScpOwoJCQl9IGVsc2VpZigkdHlwZSA9PSAieG1sIil7CgkJCQl4bWxfc2V0X2VsZW1lbnRfaGFuZGxlcigkdGhpcy0+cGFyc2VyLCAneG1sU3RhcnRFbGVtZW50JywneG1sRW5kRWxlbWVudCcpOwoJCSAgICAJeG1sX3NldF9jaGFyYWN0ZXJfZGF0YV9oYW5kbGVyKCR0aGlzLT5wYXJzZXIsJ3htbENoYXJhY3RlckRhdGEnKTsKCQkJfQoKCQkgICAgLy8gUGFyc2UgdGhlIFhNTCBmaWxlLgoJCSAgICBpZigheG1sX3BhcnNlKCR0aGlzLT5wYXJzZXIsJHhtbCx0cnVlKSl7CgkJCS8vIERpc3BsYXkgYW4gZXJyb3IgbWVzc2FnZS4KCQkJCSRlcnJzdHIgPSBzcHJpbnRmKCdYTUwgZXJyb3IgcGFyc2luZyBYTUwgc2NoZW1hIG9uIGxpbmUgJWQ6ICVzJywKCQkJCXhtbF9nZXRfY3VycmVudF9saW5lX251bWJlcigkdGhpcy0+cGFyc2VyKSwKCQkJCXhtbF9lcnJvcl9zdHJpbmcoeG1sX2dldF9lcnJvcl9jb2RlKCR0aGlzLT5wYXJzZXIpKQoJCQkJKTsKCQkJCSR0aGlzLT5kZWJ1ZygkZXJyc3RyKTsKCQkJCSR0aGlzLT5kZWJ1ZygiWE1MIHBheWxvYWQ6XG4iIC4gJHhtbCk7CgkJCQkkdGhpcy0+c2V0RXJyb3IoJGVycnN0cik7CgkgICAgCX0KICAgICAgICAgICAgCgkJCXhtbF9wYXJzZXJfZnJlZSgkdGhpcy0+cGFyc2VyKTsKCQl9IGVsc2V7CgkJCSR0aGlzLT5kZWJ1Zygnbm8geG1sIHBhc3NlZCB0byBwYXJzZVN0cmluZygpISEnKTsKCQkJJHRoaXMtPnNldEVycm9yKCdubyB4bWwgcGFzc2VkIHRvIHBhcnNlU3RyaW5nKCkhIScpOwoJCX0KCX0KCgkvKioKCSogc3RhcnQtZWxlbWVudCBoYW5kbGVyCgkqCgkqIEBwYXJhbSAgICBzdHJpbmcgJHBhcnNlciBYTUwgcGFyc2VyIG9iamVjdAoJKiBAcGFyYW0gICAgc3RyaW5nICRuYW1lIGVsZW1lbnQgbmFtZQoJKiBAcGFyYW0gICAgc3RyaW5nICRhdHRycyBhc3NvY2lhdGl2ZSBhcnJheSBvZiBhdHRyaWJ1dGVzCgkqIEBhY2Nlc3MgICBwcml2YXRlCgkqLwoJZnVuY3Rpb24gc2NoZW1hU3RhcnRFbGVtZW50KCRwYXJzZXIsICRuYW1lLCAkYXR0cnMpIHsKCQkKCQkvLyBwb3NpdGlvbiBpbiB0aGUgdG90YWwgbnVtYmVyIG9mIGVsZW1lbnRzLCBzdGFydGluZyBmcm9tIDAKCQkkcG9zID0gJHRoaXMtPnBvc2l0aW9uKys7CgkJJGRlcHRoID0gJHRoaXMtPmRlcHRoKys7CgkJLy8gc2V0IHNlbGYgYXMgY3VycmVudCB2YWx1ZSBmb3IgdGhpcyBkZXB0aAoJCSR0aGlzLT5kZXB0aF9hcnJheVskZGVwdGhdID0gJHBvczsKCQkkdGhpcy0+bWVzc2FnZVskcG9zXSA9IGFycmF5KCdjZGF0YScgPT4gJycpOyAKCQlpZiAoJGRlcHRoID4gMCkgewoJCQkkdGhpcy0+ZGVmYXVsdE5hbWVzcGFjZVskcG9zXSA9ICR0aGlzLT5kZWZhdWx0TmFtZXNwYWNlWyR0aGlzLT5kZXB0aF9hcnJheVskZGVwdGggLSAxXV07CgkJfSBlbHNlIHsKCQkJJHRoaXMtPmRlZmF1bHROYW1lc3BhY2VbJHBvc10gPSBmYWxzZTsKCQl9CgoJCS8vIGdldCBlbGVtZW50IHByZWZpeAoJCWlmKCRwcmVmaXggPSAkdGhpcy0+Z2V0UHJlZml4KCRuYW1lKSl7CgkJCS8vIGdldCB1bnF1YWxpZmllZCBuYW1lCgkJCSRuYW1lID0gJHRoaXMtPmdldExvY2FsUGFydCgkbmFtZSk7CgkJfSBlbHNlIHsKICAgICAgICAJJHByZWZpeCA9ICcnOwogICAgICAgIH0KCQkKICAgICAgICAvLyBsb29wIHRocnUgYXR0cmlidXRlcywgZXhwYW5kaW5nLCBhbmQgcmVnaXN0ZXJpbmcgbmFtZXNwYWNlIGRlY2xhcmF0aW9ucwogICAgICAgIGlmKGNvdW50KCRhdHRycykgPiAwKXsKICAgICAgICAJZm9yZWFjaCgkYXR0cnMgYXMgJGsgPT4gJHYpewogICAgICAgICAgICAgICAgLy8gaWYgbnMgZGVjbGFyYXRpb25zLCBhZGQgdG8gY2xhc3MgbGV2ZWwgYXJyYXkgb2YgdmFsaWQgbmFtZXNwYWNlcwoJCQkJaWYoZXJlZygiXnhtbG5zIiwkaykpewogICAgICAgICAgICAgICAgCS8vJHRoaXMtPnhkZWJ1ZygiJGs6ICR2Iik7CiAgICAgICAgICAgICAgICAJLy8kdGhpcy0+eGRlYnVnKCduc19wcmVmaXg6ICcuJHRoaXMtPmdldFByZWZpeCgkaykpOwogICAgICAgICAgICAgICAgCWlmKCRuc19wcmVmaXggPSBzdWJzdHIoc3RycmNocigkaywnOicpLDEpKXsKICAgICAgICAgICAgICAgIAkJLy8kdGhpcy0+eGRlYnVnKCJBZGQgbmFtZXNwYWNlWyRuc19wcmVmaXhdID0gJHYiKTsKCQkJCQkJJHRoaXMtPm5hbWVzcGFjZXNbJG5zX3ByZWZpeF0gPSAkdjsKCQkJCQl9IGVsc2UgewoJCQkJCQkkdGhpcy0+ZGVmYXVsdE5hbWVzcGFjZVskcG9zXSA9ICR2OwoJCQkJCQlpZiAoISAkdGhpcy0+Z2V0UHJlZml4RnJvbU5hbWVzcGFjZSgkdikpIHsKCQkJCQkJCSR0aGlzLT5uYW1lc3BhY2VzWyducycuKGNvdW50KCR0aGlzLT5uYW1lc3BhY2VzKSsxKV0gPSAkdjsKCQkJCQkJfQoJCQkJCX0KCQkJCQlpZigkdiA9PSAnaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnIHx8ICR2ID09ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hNTFNjaGVtYScgfHwgJHYgPT0gJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvMTAvWE1MU2NoZW1hJyl7CgkJCQkJCSR0aGlzLT5YTUxTY2hlbWFWZXJzaW9uID0gJHY7CgkJCQkJCSR0aGlzLT5uYW1lc3BhY2VzWyd4c2knXSA9ICR2LictaW5zdGFuY2UnOwoJCQkJCX0KCQkJCX0KICAgICAgICAJfQogICAgICAgIAlmb3JlYWNoKCRhdHRycyBhcyAkayA9PiAkdil7CiAgICAgICAgICAgICAgICAvLyBleHBhbmQgZWFjaCBhdHRyaWJ1dGUKICAgICAgICAgICAgICAgICRrID0gc3RycG9zKCRrLCc6JykgPyAkdGhpcy0+ZXhwYW5kUW5hbWUoJGspIDogJGs7CiAgICAgICAgICAgICAgICAkdiA9IHN0cnBvcygkdiwnOicpID8gJHRoaXMtPmV4cGFuZFFuYW1lKCR2KSA6ICR2OwogICAgICAgIAkJJGVBdHRyc1ska10gPSAkdjsKICAgICAgICAJfQogICAgICAgIAkkYXR0cnMgPSAkZUF0dHJzOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgCSRhdHRycyA9IGFycmF5KCk7CiAgICAgICAgfQoJCS8vIGZpbmQgc3RhdHVzLCByZWdpc3RlciBkYXRhCgkJc3dpdGNoKCRuYW1lKXsKCQkJY2FzZSAnYWxsJzoJCQkvLyAob3B0aW9uYWwpIGNvbXBvc2l0b3IgY29udGVudCBmb3IgYSBjb21wbGV4VHlwZQoJCQljYXNlICdjaG9pY2UnOgoJCQljYXNlICdncm91cCc6CgkJCWNhc2UgJ3NlcXVlbmNlJzoKCQkJCS8vJHRoaXMtPnhkZWJ1ZygiY29tcG9zaXRvciAkbmFtZSBmb3IgY3VycmVudENvbXBsZXhUeXBlOiAkdGhpcy0+Y3VycmVudENvbXBsZXhUeXBlIGFuZCBjdXJyZW50RWxlbWVudDogJHRoaXMtPmN1cnJlbnRFbGVtZW50Iik7CgkJCQkkdGhpcy0+Y29tcGxleFR5cGVzWyR0aGlzLT5jdXJyZW50Q29tcGxleFR5cGVdWydjb21wb3NpdG9yJ10gPSAkbmFtZTsKCQkJCS8vaWYoJG5hbWUgPT0gJ2FsbCcgfHwgJG5hbWUgPT0gJ3NlcXVlbmNlJyl7CgkJCQkvLwkkdGhpcy0+Y29tcGxleFR5cGVzWyR0aGlzLT5jdXJyZW50Q29tcGxleFR5cGVdWydwaHBUeXBlJ10gPSAnc3RydWN0JzsKCQkJCS8vfQoJCQlicmVhazsKCQkJY2FzZSAnYXR0cmlidXRlJzoJLy8gY29tcGxleFR5cGUgYXR0cmlidXRlCiAgICAgICAgICAgIAkvLyR0aGlzLT54ZGVidWcoInBhcnNpbmcgYXR0cmlidXRlICRhdHRyc1tuYW1lXSAkYXR0cnNbcmVmXSBvZiB2YWx1ZTogIi4kYXR0cnNbJ2h0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvOmFycmF5VHlwZSddKTsKICAgICAgICAgICAgCSR0aGlzLT54ZGVidWcoInBhcnNpbmcgYXR0cmlidXRlOiIpOwogICAgICAgICAgICAJJHRoaXMtPmFwcGVuZERlYnVnKCR0aGlzLT52YXJEdW1wKCRhdHRycykpOwoJCQkJaWYgKCFpc3NldCgkYXR0cnNbJ2Zvcm0nXSkpIHsKCQkJCQkkYXR0cnNbJ2Zvcm0nXSA9ICR0aGlzLT5zY2hlbWFJbmZvWydhdHRyaWJ1dGVGb3JtRGVmYXVsdCddOwoJCQkJfQogICAgICAgICAgICAJaWYgKGlzc2V0KCRhdHRyc1snaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC86YXJyYXlUeXBlJ10pKSB7CgkJCQkJJHYgPSAkYXR0cnNbJ2h0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvOmFycmF5VHlwZSddOwoJCQkJCWlmICghc3RycG9zKCR2LCAnOicpKSB7CgkJCQkJCS8vIG5vIG5hbWVzcGFjZSBpbiBhcnJheVR5cGUgYXR0cmlidXRlIHZhbHVlLi4uCgkJCQkJCWlmICgkdGhpcy0+ZGVmYXVsdE5hbWVzcGFjZVskcG9zXSkgewoJCQkJCQkJLy8gLi4uc28gdXNlIHRoZSBkZWZhdWx0CgkJCQkJCQkkYXR0cnNbJ2h0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvOmFycmF5VHlwZSddID0gJHRoaXMtPmRlZmF1bHROYW1lc3BhY2VbJHBvc10gLiAnOicgLiAkYXR0cnNbJ2h0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvOmFycmF5VHlwZSddOwoJCQkJCQl9CgkJCQkJfQogICAgICAgICAgICAJfQogICAgICAgICAgICAgICAgaWYoaXNzZXQoJGF0dHJzWyduYW1lJ10pKXsKCQkJCQkkdGhpcy0+YXR0cmlidXRlc1skYXR0cnNbJ25hbWUnXV0gPSAkYXR0cnM7CgkJCQkJJGFuYW1lID0gJGF0dHJzWyduYW1lJ107CgkJCQl9IGVsc2VpZihpc3NldCgkYXR0cnNbJ3JlZiddKSAmJiAkYXR0cnNbJ3JlZiddID09ICdodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLzphcnJheVR5cGUnKXsKCQkJCQlpZiAoaXNzZXQoJGF0dHJzWydodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLzphcnJheVR5cGUnXSkpIHsKCSAgICAgICAgICAgICAgICAJJGFuYW1lID0gJGF0dHJzWydodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLzphcnJheVR5cGUnXTsKCSAgICAgICAgICAgICAgICB9IGVsc2UgewoJICAgICAgICAgICAgICAgIAkkYW5hbWUgPSAnJzsKCSAgICAgICAgICAgICAgICB9CgkJCQl9IGVsc2VpZihpc3NldCgkYXR0cnNbJ3JlZiddKSl7CgkJCQkJJGFuYW1lID0gJGF0dHJzWydyZWYnXTsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+YXR0cmlidXRlc1skYXR0cnNbJ3JlZiddXSA9ICRhdHRyczsKCQkJCX0KICAgICAgICAgICAgICAgIAoJCQkJaWYoJHRoaXMtPmN1cnJlbnRDb21wbGV4VHlwZSl7CS8vIFRoaXMgc2hvdWxkICphbHdheXMqIGJlCgkJCQkJJHRoaXMtPmNvbXBsZXhUeXBlc1skdGhpcy0+Y3VycmVudENvbXBsZXhUeXBlXVsnYXR0cnMnXVskYW5hbWVdID0gJGF0dHJzOwoJCQkJfQoJCQkJLy8gYXJyYXlUeXBlIGF0dHJpYnV0ZQoJCQkJaWYoaXNzZXQoJGF0dHJzWydodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLzphcnJheVR5cGUnXSkgfHwgJHRoaXMtPmdldExvY2FsUGFydCgkYW5hbWUpID09ICdhcnJheVR5cGUnKXsKCQkJCQkkdGhpcy0+Y29tcGxleFR5cGVzWyR0aGlzLT5jdXJyZW50Q29tcGxleFR5cGVdWydwaHBUeXBlJ10gPSAnYXJyYXknOwogICAgICAgICAgICAgICAgCSRwcmVmaXggPSAkdGhpcy0+Z2V0UHJlZml4KCRhbmFtZSk7CgkJCQkJaWYoaXNzZXQoJGF0dHJzWydodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLzphcnJheVR5cGUnXSkpewoJCQkJCQkkdiA9ICRhdHRyc1snaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC86YXJyYXlUeXBlJ107CgkJCQkJfSBlbHNlIHsKCQkJCQkJJHYgPSAnJzsKCQkJCQl9CiAgICAgICAgICAgICAgICAgICAgaWYoc3RycG9zKCR2LCdbLF0nKSl7CiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5jb21wbGV4VHlwZXNbJHRoaXMtPmN1cnJlbnRDb21wbGV4VHlwZV1bJ211bHRpZGltZW5zaW9uYWwnXSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICR2ID0gc3Vic3RyKCR2LDAsc3RycG9zKCR2LCdbJykpOyAvLyBjbGlwIHRoZSBbXQogICAgICAgICAgICAgICAgICAgIGlmKCFzdHJwb3MoJHYsJzonKSAmJiBpc3NldCgkdGhpcy0+dHlwZW1hcFskdGhpcy0+WE1MU2NoZW1hVmVyc2lvbl1bJHZdKSl7CiAgICAgICAgICAgICAgICAgICAgICAgICR2ID0gJHRoaXMtPlhNTFNjaGVtYVZlcnNpb24uJzonLiR2OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+Y29tcGxleFR5cGVzWyR0aGlzLT5jdXJyZW50Q29tcGxleFR5cGVdWydhcnJheVR5cGUnXSA9ICR2OwoJCQkJfQoJCQlicmVhazsKCQkJY2FzZSAnY29tcGxleENvbnRlbnQnOgkvLyAob3B0aW9uYWwpIGNvbnRlbnQgZm9yIGEgY29tcGxleFR5cGUKCQkJYnJlYWs7CgkJCWNhc2UgJ2NvbXBsZXhUeXBlJzoKCQkJCWFycmF5X3B1c2goJHRoaXMtPmNvbXBsZXhUeXBlU3RhY2ssICR0aGlzLT5jdXJyZW50Q29tcGxleFR5cGUpOwoJCQkJaWYoaXNzZXQoJGF0dHJzWyduYW1lJ10pKXsKCQkJCQkkdGhpcy0+eGRlYnVnKCdwcm9jZXNzaW5nIG5hbWVkIGNvbXBsZXhUeXBlICcuJGF0dHJzWyduYW1lJ10pOwoJCQkJCS8vJHRoaXMtPmN1cnJlbnRFbGVtZW50ID0gZmFsc2U7CgkJCQkJJHRoaXMtPmN1cnJlbnRDb21wbGV4VHlwZSA9ICRhdHRyc1snbmFtZSddOwoJCQkJCSR0aGlzLT5jb21wbGV4VHlwZXNbJHRoaXMtPmN1cnJlbnRDb21wbGV4VHlwZV0gPSAkYXR0cnM7CgkJCQkJJHRoaXMtPmNvbXBsZXhUeXBlc1skdGhpcy0+Y3VycmVudENvbXBsZXhUeXBlXVsndHlwZUNsYXNzJ10gPSAnY29tcGxleFR5cGUnOwoJCQkJCS8vIFRoaXMgaXMgZm9yIGNvbnN0cnVjdHMgbGlrZQoJCQkJCS8vICAgICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mU3RyaW5nIiBiYXNlPSJzb2FwOkFycmF5Ij4KCQkJCQkvLyAgICAgICAgICAgICAgICA8c2VxdWVuY2U+CgkJCQkJLy8gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InN0cmluZyIgdHlwZT0ieHNkOnN0cmluZyIKCQkJCQkvLyAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+CgkJCQkJLy8gICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KCQkJCQkvLyAgICAgICAgICAgIDwvY29tcGxleFR5cGU+CgkJCQkJaWYoaXNzZXQoJGF0dHJzWydiYXNlJ10pICYmIGVyZWcoJzpBcnJheSQnLCRhdHRyc1snYmFzZSddKSl7CgkJCQkJCSR0aGlzLT54ZGVidWcoJ2NvbXBsZXhUeXBlIGlzIHVudXN1YWwgYXJyYXknKTsKCQkJCQkJJHRoaXMtPmNvbXBsZXhUeXBlc1skdGhpcy0+Y3VycmVudENvbXBsZXhUeXBlXVsncGhwVHlwZSddID0gJ2FycmF5JzsKCQkJCQl9IGVsc2UgewoJCQkJCQkkdGhpcy0+Y29tcGxleFR5cGVzWyR0aGlzLT5jdXJyZW50Q29tcGxleFR5cGVdWydwaHBUeXBlJ10gPSAnc3RydWN0JzsKCQkJCQl9CgkJCQl9ZWxzZXsKCQkJCQkkdGhpcy0+eGRlYnVnKCdwcm9jZXNzaW5nIHVubmFtZWQgY29tcGxleFR5cGUgZm9yIGVsZW1lbnQgJy4kdGhpcy0+Y3VycmVudEVsZW1lbnQpOwoJCQkJCSR0aGlzLT5jdXJyZW50Q29tcGxleFR5cGUgPSAkdGhpcy0+Y3VycmVudEVsZW1lbnQgLiAnX0NvbnRhaW5lZFR5cGUnOwoJCQkJCS8vJHRoaXMtPmN1cnJlbnRFbGVtZW50ID0gZmFsc2U7CgkJCQkJJHRoaXMtPmNvbXBsZXhUeXBlc1skdGhpcy0+Y3VycmVudENvbXBsZXhUeXBlXSA9ICRhdHRyczsKCQkJCQkkdGhpcy0+Y29tcGxleFR5cGVzWyR0aGlzLT5jdXJyZW50Q29tcGxleFR5cGVdWyd0eXBlQ2xhc3MnXSA9ICdjb21wbGV4VHlwZSc7CgkJCQkJLy8gVGhpcyBpcyBmb3IgY29uc3RydWN0cyBsaWtlCgkJCQkJLy8gICAgICAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZTdHJpbmciIGJhc2U9InNvYXA6QXJyYXkiPgoJCQkJCS8vICAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4KCQkJCQkvLyAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0ic3RyaW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIgoJCQkJCS8vICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KCQkJCQkvLyAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgoJCQkJCS8vICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KCQkJCQlpZihpc3NldCgkYXR0cnNbJ2Jhc2UnXSkgJiYgZXJlZygnOkFycmF5JCcsJGF0dHJzWydiYXNlJ10pKXsKCQkJCQkJJHRoaXMtPnhkZWJ1ZygnY29tcGxleFR5cGUgaXMgdW51c3VhbCBhcnJheScpOwoJCQkJCQkkdGhpcy0+Y29tcGxleFR5cGVzWyR0aGlzLT5jdXJyZW50Q29tcGxleFR5cGVdWydwaHBUeXBlJ10gPSAnYXJyYXknOwoJCQkJCX0gZWxzZSB7CgkJCQkJCSR0aGlzLT5jb21wbGV4VHlwZXNbJHRoaXMtPmN1cnJlbnRDb21wbGV4VHlwZV1bJ3BocFR5cGUnXSA9ICdzdHJ1Y3QnOwoJCQkJCX0KCQkJCX0KCQkJYnJlYWs7CgkJCWNhc2UgJ2VsZW1lbnQnOgoJCQkJYXJyYXlfcHVzaCgkdGhpcy0+ZWxlbWVudFN0YWNrLCAkdGhpcy0+Y3VycmVudEVsZW1lbnQpOwoJCQkJLy8gZWxlbWVudHMgZGVmaW5lZCBhcyBwYXJ0IG9mIGEgY29tcGxleCB0eXBlIHNob3VsZAoJCQkJLy8gbm90IHJlYWxseSBiZSBhZGRlZCB0byAkdGhpcy0+ZWxlbWVudHMsIGJ1dCBmb3Igc29tZQoJCQkJLy8gcmVhc29uLCB0aGV5IGFyZQoJCQkJaWYgKCFpc3NldCgkYXR0cnNbJ2Zvcm0nXSkpIHsKCQkJCQkkYXR0cnNbJ2Zvcm0nXSA9ICR0aGlzLT5zY2hlbWFJbmZvWydlbGVtZW50Rm9ybURlZmF1bHQnXTsKCQkJCX0KCQkJCWlmKGlzc2V0KCRhdHRyc1sndHlwZSddKSl7CgkJCQkJJHRoaXMtPnhkZWJ1ZygicHJvY2Vzc2luZyB0eXBlZCBlbGVtZW50ICIuJGF0dHJzWyduYW1lJ10uIiBvZiB0eXBlICIuJGF0dHJzWyd0eXBlJ10pOwoJCQkJCWlmICghICR0aGlzLT5nZXRQcmVmaXgoJGF0dHJzWyd0eXBlJ10pKSB7CgkJCQkJCWlmICgkdGhpcy0+ZGVmYXVsdE5hbWVzcGFjZVskcG9zXSkgewoJCQkJCQkJJGF0dHJzWyd0eXBlJ10gPSAkdGhpcy0+ZGVmYXVsdE5hbWVzcGFjZVskcG9zXSAuICc6JyAuICRhdHRyc1sndHlwZSddOwoJCQkJCQkJJHRoaXMtPnhkZWJ1ZygndXNlZCBkZWZhdWx0IG5hbWVzcGFjZSB0byBtYWtlIHR5cGUgJyAuICRhdHRyc1sndHlwZSddKTsKCQkJCQkJfQoJCQkJCX0KCQkJCQkvLyBUaGlzIGlzIGZvciBjb25zdHJ1Y3RzIGxpa2UKCQkJCQkvLyAgICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZlN0cmluZyIgYmFzZT0ic29hcDpBcnJheSI+CgkJCQkJLy8gICAgICAgICAgICAgICAgPHNlcXVlbmNlPgoJCQkJCS8vICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJzdHJpbmciIHR5cGU9InhzZDpzdHJpbmciCgkJCQkJLy8gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgoJCQkJCS8vICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+CgkJCQkJLy8gICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgoJCQkJCWlmICgkdGhpcy0+Y3VycmVudENvbXBsZXhUeXBlICYmICR0aGlzLT5jb21wbGV4VHlwZXNbJHRoaXMtPmN1cnJlbnRDb21wbGV4VHlwZV1bJ3BocFR5cGUnXSA9PSAnYXJyYXknKSB7CgkJCQkJCSR0aGlzLT54ZGVidWcoJ2FycmF5VHlwZSBmb3IgdW51c3VhbCBhcnJheSBpcyAnIC4gJGF0dHJzWyd0eXBlJ10pOwoJCQkJCQkkdGhpcy0+Y29tcGxleFR5cGVzWyR0aGlzLT5jdXJyZW50Q29tcGxleFR5cGVdWydhcnJheVR5cGUnXSA9ICRhdHRyc1sndHlwZSddOwoJCQkJCX0KCQkJCQkkdGhpcy0+Y3VycmVudEVsZW1lbnQgPSAkYXR0cnNbJ25hbWUnXTsKCQkJCQkkdGhpcy0+ZWxlbWVudHNbICRhdHRyc1snbmFtZSddIF0gPSAkYXR0cnM7CgkJCQkJJHRoaXMtPmVsZW1lbnRzWyAkYXR0cnNbJ25hbWUnXSBdWyd0eXBlQ2xhc3MnXSA9ICdlbGVtZW50JzsKCQkJCQkkZW5hbWUgPSAkYXR0cnNbJ25hbWUnXTsKCQkJCX0gZWxzZWlmKGlzc2V0KCRhdHRyc1sncmVmJ10pKXsKCQkJCQkkdGhpcy0+eGRlYnVnKCJwcm9jZXNzaW5nIGVsZW1lbnQgYXMgcmVmIHRvICIuJGF0dHJzWydyZWYnXSk7CgkJCQkJJHRoaXMtPmN1cnJlbnRFbGVtZW50ID0gInJlZiB0byAiLiRhdHRyc1sncmVmJ107CgkJCQkJJGVuYW1lID0gJHRoaXMtPmdldExvY2FsUGFydCgkYXR0cnNbJ3JlZiddKTsKCQkJCX0gZWxzZSB7CgkJCQkJJHRoaXMtPnhkZWJ1ZygicHJvY2Vzc2luZyB1bnR5cGVkIGVsZW1lbnQgIi4kYXR0cnNbJ25hbWUnXSk7CgkJCQkJJHRoaXMtPmN1cnJlbnRFbGVtZW50ID0gJGF0dHJzWyduYW1lJ107CgkJCQkJJHRoaXMtPmVsZW1lbnRzWyAkYXR0cnNbJ25hbWUnXSBdID0gJGF0dHJzOwoJCQkJCSR0aGlzLT5lbGVtZW50c1sgJGF0dHJzWyduYW1lJ10gXVsndHlwZUNsYXNzJ10gPSAnZWxlbWVudCc7CgkJCQkJJGF0dHJzWyd0eXBlJ10gPSAkdGhpcy0+c2NoZW1hVGFyZ2V0TmFtZXNwYWNlIC4gJzonIC4gJGF0dHJzWyduYW1lJ10gLiAnX0NvbnRhaW5lZFR5cGUnOwoJCQkJCSR0aGlzLT5lbGVtZW50c1sgJGF0dHJzWyduYW1lJ10gXVsndHlwZSddID0gJGF0dHJzWyd0eXBlJ107CgkJCQkJJGVuYW1lID0gJGF0dHJzWyduYW1lJ107CgkJCQl9CgkJCQlpZihpc3NldCgkZW5hbWUpICYmICR0aGlzLT5jdXJyZW50Q29tcGxleFR5cGUpewoJCQkJCSR0aGlzLT5jb21wbGV4VHlwZXNbJHRoaXMtPmN1cnJlbnRDb21wbGV4VHlwZV1bJ2VsZW1lbnRzJ11bJGVuYW1lXSA9ICRhdHRyczsKCQkJCX0KCQkJYnJlYWs7CgkJCWNhc2UgJ2VudW1lcmF0aW9uJzoJLy8JcmVzdHJpY3Rpb24gdmFsdWUgbGlzdCBtZW1iZXIKCQkJCSR0aGlzLT54ZGVidWcoJ2VudW1lcmF0aW9uICcgLiAkYXR0cnNbJ3ZhbHVlJ10pOwoJCQkJaWYgKCR0aGlzLT5jdXJyZW50U2ltcGxlVHlwZSkgewoJCQkJCSR0aGlzLT5zaW1wbGVUeXBlc1skdGhpcy0+Y3VycmVudFNpbXBsZVR5cGVdWydlbnVtZXJhdGlvbiddW10gPSAkYXR0cnNbJ3ZhbHVlJ107CgkJCQl9IGVsc2VpZiAoJHRoaXMtPmN1cnJlbnRDb21wbGV4VHlwZSkgewoJCQkJCSR0aGlzLT5jb21wbGV4VHlwZXNbJHRoaXMtPmN1cnJlbnRDb21wbGV4VHlwZV1bJ2VudW1lcmF0aW9uJ11bXSA9ICRhdHRyc1sndmFsdWUnXTsKCQkJCX0KCQkJYnJlYWs7CgkJCWNhc2UgJ2V4dGVuc2lvbic6CS8vIHNpbXBsZUNvbnRlbnQgb3IgY29tcGxleENvbnRlbnQgdHlwZSBleHRlbnNpb24KCQkJCSR0aGlzLT54ZGVidWcoJ2V4dGVuc2lvbiAnIC4gJGF0dHJzWydiYXNlJ10pOwoJCQkJaWYgKCR0aGlzLT5jdXJyZW50Q29tcGxleFR5cGUpIHsKCQkJCQkkdGhpcy0+Y29tcGxleFR5cGVzWyR0aGlzLT5jdXJyZW50Q29tcGxleFR5cGVdWydleHRlbnNpb25CYXNlJ10gPSAkYXR0cnNbJ2Jhc2UnXTsKCQkJCX0KCQkJYnJlYWs7CgkJCWNhc2UgJ2ltcG9ydCc6CgkJCSAgICBpZiAoaXNzZXQoJGF0dHJzWydzY2hlbWFMb2NhdGlvbiddKSkgewoJCQkJCS8vJHRoaXMtPnhkZWJ1ZygnaW1wb3J0IG5hbWVzcGFjZSAnIC4gJGF0dHJzWyduYW1lc3BhY2UnXSAuICcgZnJvbSAnIC4gJGF0dHJzWydzY2hlbWFMb2NhdGlvbiddKTsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+aW1wb3J0c1skYXR0cnNbJ25hbWVzcGFjZSddXVtdID0gYXJyYXkoJ2xvY2F0aW9uJyA9PiAkYXR0cnNbJ3NjaGVtYUxvY2F0aW9uJ10sICdsb2FkZWQnID0+IGZhbHNlKTsKCQkJCX0gZWxzZSB7CgkJCQkJLy8kdGhpcy0+eGRlYnVnKCdpbXBvcnQgbmFtZXNwYWNlICcgLiAkYXR0cnNbJ25hbWVzcGFjZSddKTsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+aW1wb3J0c1skYXR0cnNbJ25hbWVzcGFjZSddXVtdID0gYXJyYXkoJ2xvY2F0aW9uJyA9PiAnJywgJ2xvYWRlZCcgPT4gdHJ1ZSk7CgkJCQkJaWYgKCEgJHRoaXMtPmdldFByZWZpeEZyb21OYW1lc3BhY2UoJGF0dHJzWyduYW1lc3BhY2UnXSkpIHsKCQkJCQkJJHRoaXMtPm5hbWVzcGFjZXNbJ25zJy4oY291bnQoJHRoaXMtPm5hbWVzcGFjZXMpKzEpXSA9ICRhdHRyc1snbmFtZXNwYWNlJ107CgkJCQkJfQoJCQkJfQoJCQlicmVhazsKCQkJY2FzZSAnbGlzdCc6CS8vIHNpbXBsZVR5cGUgdmFsdWUgbGlzdAoJCQlicmVhazsKCQkJY2FzZSAncmVzdHJpY3Rpb24nOgkvLyBzaW1wbGVUeXBlLCBzaW1wbGVDb250ZW50IG9yIGNvbXBsZXhDb250ZW50IHZhbHVlIHJlc3RyaWN0aW9uCgkJCQkkdGhpcy0+eGRlYnVnKCdyZXN0cmljdGlvbiAnIC4gJGF0dHJzWydiYXNlJ10pOwoJCQkJaWYoJHRoaXMtPmN1cnJlbnRTaW1wbGVUeXBlKXsKCQkJCQkkdGhpcy0+c2ltcGxlVHlwZXNbJHRoaXMtPmN1cnJlbnRTaW1wbGVUeXBlXVsndHlwZSddID0gJGF0dHJzWydiYXNlJ107CgkJCQl9IGVsc2VpZigkdGhpcy0+Y3VycmVudENvbXBsZXhUeXBlKXsKCQkJCQkkdGhpcy0+Y29tcGxleFR5cGVzWyR0aGlzLT5jdXJyZW50Q29tcGxleFR5cGVdWydyZXN0cmljdGlvbkJhc2UnXSA9ICRhdHRyc1snYmFzZSddOwoJCQkJCWlmKHN0cnN0cigkYXR0cnNbJ2Jhc2UnXSwnOicpID09ICc6QXJyYXknKXsKCQkJCQkJJHRoaXMtPmNvbXBsZXhUeXBlc1skdGhpcy0+Y3VycmVudENvbXBsZXhUeXBlXVsncGhwVHlwZSddID0gJ2FycmF5JzsKCQkJCQl9CgkJCQl9CgkJCWJyZWFrOwoJCQljYXNlICdzY2hlbWEnOgoJCQkJJHRoaXMtPnNjaGVtYUluZm8gPSAkYXR0cnM7CgkJCQkkdGhpcy0+c2NoZW1hSW5mb1snc2NoZW1hVmVyc2lvbiddID0gJHRoaXMtPmdldE5hbWVzcGFjZUZyb21QcmVmaXgoJHByZWZpeCk7CgkJCQlpZiAoaXNzZXQoJGF0dHJzWyd0YXJnZXROYW1lc3BhY2UnXSkpIHsKCQkJCQkkdGhpcy0+c2NoZW1hVGFyZ2V0TmFtZXNwYWNlID0gJGF0dHJzWyd0YXJnZXROYW1lc3BhY2UnXTsKCQkJCX0KCQkJCWlmICghaXNzZXQoJGF0dHJzWydlbGVtZW50Rm9ybURlZmF1bHQnXSkpIHsKCQkJCQkkdGhpcy0+c2NoZW1hSW5mb1snZWxlbWVudEZvcm1EZWZhdWx0J10gPSAndW5xdWFsaWZpZWQnOwoJCQkJfQoJCQkJaWYgKCFpc3NldCgkYXR0cnNbJ2F0dHJpYnV0ZUZvcm1EZWZhdWx0J10pKSB7CgkJCQkJJHRoaXMtPnNjaGVtYUluZm9bJ2F0dHJpYnV0ZUZvcm1EZWZhdWx0J10gPSAndW5xdWFsaWZpZWQnOwoJCQkJfQoJCQlicmVhazsKCQkJY2FzZSAnc2ltcGxlQ29udGVudCc6CS8vIChvcHRpb25hbCkgY29udGVudCBmb3IgYSBjb21wbGV4VHlwZQoJCQlicmVhazsKCQkJY2FzZSAnc2ltcGxlVHlwZSc6CgkJCQlhcnJheV9wdXNoKCR0aGlzLT5zaW1wbGVUeXBlU3RhY2ssICR0aGlzLT5jdXJyZW50U2ltcGxlVHlwZSk7CgkJCQlpZihpc3NldCgkYXR0cnNbJ25hbWUnXSkpewoJCQkJCSR0aGlzLT54ZGVidWcoInByb2Nlc3Npbmcgc2ltcGxlVHlwZSBmb3IgbmFtZSAiIC4gJGF0dHJzWyduYW1lJ10pOwoJCQkJCSR0aGlzLT5jdXJyZW50U2ltcGxlVHlwZSA9ICRhdHRyc1snbmFtZSddOwoJCQkJCSR0aGlzLT5zaW1wbGVUeXBlc1sgJGF0dHJzWyduYW1lJ10gXSA9ICRhdHRyczsKCQkJCQkkdGhpcy0+c2ltcGxlVHlwZXNbICRhdHRyc1snbmFtZSddIF1bJ3R5cGVDbGFzcyddID0gJ3NpbXBsZVR5cGUnOwoJCQkJCSR0aGlzLT5zaW1wbGVUeXBlc1sgJGF0dHJzWyduYW1lJ10gXVsncGhwVHlwZSddID0gJ3NjYWxhcic7CgkJCQl9IGVsc2UgewoJCQkJCSR0aGlzLT54ZGVidWcoJ3Byb2Nlc3NpbmcgdW5uYW1lZCBzaW1wbGVUeXBlIGZvciBlbGVtZW50ICcuJHRoaXMtPmN1cnJlbnRFbGVtZW50KTsKCQkJCQkkdGhpcy0+Y3VycmVudFNpbXBsZVR5cGUgPSAkdGhpcy0+Y3VycmVudEVsZW1lbnQgLiAnX0NvbnRhaW5lZFR5cGUnOwoJCQkJCS8vJHRoaXMtPmN1cnJlbnRFbGVtZW50ID0gZmFsc2U7CgkJCQkJJHRoaXMtPnNpbXBsZVR5cGVzWyR0aGlzLT5jdXJyZW50U2ltcGxlVHlwZV0gPSAkYXR0cnM7CgkJCQkJJHRoaXMtPnNpbXBsZVR5cGVzWyR0aGlzLT5jdXJyZW50U2ltcGxlVHlwZV1bJ3BocFR5cGUnXSA9ICdzY2FsYXInOwoJCQkJfQoJCQlicmVhazsKCQkJY2FzZSAndW5pb24nOgkvLyBzaW1wbGVUeXBlIHR5cGUgbGlzdAoJCQlicmVhazsKCQkJZGVmYXVsdDoKCQkJCS8vJHRoaXMtPnhkZWJ1ZygiZG8gbm90IGhhdmUgYW55dGhpbmcgdG8gZG8gZm9yIGVsZW1lbnQgJG5hbWUiKTsKCQl9Cgl9CgoJLyoqCgkqIGVuZC1lbGVtZW50IGhhbmRsZXIKCSoKCSogQHBhcmFtICAgIHN0cmluZyAkcGFyc2VyIFhNTCBwYXJzZXIgb2JqZWN0CgkqIEBwYXJhbSAgICBzdHJpbmcgJG5hbWUgZWxlbWVudCBuYW1lCgkqIEBhY2Nlc3MgICBwcml2YXRlCgkqLwoJZnVuY3Rpb24gc2NoZW1hRW5kRWxlbWVudCgkcGFyc2VyLCAkbmFtZSkgewoJCS8vIGJyaW5nIGRlcHRoIGRvd24gYSBub3RjaAoJCSR0aGlzLT5kZXB0aC0tOwoJCS8vIHBvc2l0aW9uIG9mIGN1cnJlbnQgZWxlbWVudCBpcyBlcXVhbCB0byB0aGUgbGFzdCB2YWx1ZSBsZWZ0IGluIGRlcHRoX2FycmF5IGZvciBteSBkZXB0aAoJCWlmKGlzc2V0KCR0aGlzLT5kZXB0aF9hcnJheVskdGhpcy0+ZGVwdGhdKSl7CiAgICAgICAgCSRwb3MgPSAkdGhpcy0+ZGVwdGhfYXJyYXlbJHRoaXMtPmRlcHRoXTsKICAgICAgICB9CgkJLy8gZ2V0IGVsZW1lbnQgcHJlZml4CgkJaWYgKCRwcmVmaXggPSAkdGhpcy0+Z2V0UHJlZml4KCRuYW1lKSl7CgkJCS8vIGdldCB1bnF1YWxpZmllZCBuYW1lCgkJCSRuYW1lID0gJHRoaXMtPmdldExvY2FsUGFydCgkbmFtZSk7CgkJfSBlbHNlIHsKICAgICAgICAJJHByZWZpeCA9ICcnOwogICAgICAgIH0KCQkvLyBtb3ZlIG9uLi4uCgkJaWYoJG5hbWUgPT0gJ2NvbXBsZXhUeXBlJyl7CgkJCSR0aGlzLT54ZGVidWcoJ2RvbmUgcHJvY2Vzc2luZyBjb21wbGV4VHlwZSAnIC4gKCR0aGlzLT5jdXJyZW50Q29tcGxleFR5cGUgPyAkdGhpcy0+Y3VycmVudENvbXBsZXhUeXBlIDogJyh1bmtub3duKScpKTsKCQkJJHRoaXMtPmN1cnJlbnRDb21wbGV4VHlwZSA9IGFycmF5X3BvcCgkdGhpcy0+Y29tcGxleFR5cGVTdGFjayk7CgkJCS8vJHRoaXMtPmN1cnJlbnRFbGVtZW50ID0gZmFsc2U7CgkJfQoJCWlmKCRuYW1lID09ICdlbGVtZW50Jyl7CgkJCSR0aGlzLT54ZGVidWcoJ2RvbmUgcHJvY2Vzc2luZyBlbGVtZW50ICcgLiAoJHRoaXMtPmN1cnJlbnRFbGVtZW50ID8gJHRoaXMtPmN1cnJlbnRFbGVtZW50IDogJyh1bmtub3duKScpKTsKCQkJJHRoaXMtPmN1cnJlbnRFbGVtZW50ID0gYXJyYXlfcG9wKCR0aGlzLT5lbGVtZW50U3RhY2spOwoJCX0KCQlpZigkbmFtZSA9PSAnc2ltcGxlVHlwZScpewoJCQkkdGhpcy0+eGRlYnVnKCdkb25lIHByb2Nlc3Npbmcgc2ltcGxlVHlwZSAnIC4gKCR0aGlzLT5jdXJyZW50U2ltcGxlVHlwZSA/ICR0aGlzLT5jdXJyZW50U2ltcGxlVHlwZSA6ICcodW5rbm93biknKSk7CgkJCSR0aGlzLT5jdXJyZW50U2ltcGxlVHlwZSA9IGFycmF5X3BvcCgkdGhpcy0+c2ltcGxlVHlwZVN0YWNrKTsKCQl9Cgl9CgoJLyoqCgkqIGVsZW1lbnQgY29udGVudCBoYW5kbGVyCgkqCgkqIEBwYXJhbSAgICBzdHJpbmcgJHBhcnNlciBYTUwgcGFyc2VyIG9iamVjdAoJKiBAcGFyYW0gICAgc3RyaW5nICRkYXRhIGVsZW1lbnQgY29udGVudAoJKiBAYWNjZXNzICAgcHJpdmF0ZQoJKi8KCWZ1bmN0aW9uIHNjaGVtYUNoYXJhY3RlckRhdGEoJHBhcnNlciwgJGRhdGEpewoJCSRwb3MgPSAkdGhpcy0+ZGVwdGhfYXJyYXlbJHRoaXMtPmRlcHRoIC0gMV07CgkJJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ2NkYXRhJ10gLj0gJGRhdGE7Cgl9CgoJLyoqCgkqIHNlcmlhbGl6ZSB0aGUgc2NoZW1hCgkqCgkqIEBhY2Nlc3MgICBwdWJsaWMKCSovCglmdW5jdGlvbiBzZXJpYWxpemVTY2hlbWEoKXsKCgkJJHNjaGVtYVByZWZpeCA9ICR0aGlzLT5nZXRQcmVmaXhGcm9tTmFtZXNwYWNlKCR0aGlzLT5YTUxTY2hlbWFWZXJzaW9uKTsKCQkkeG1sID0gJyc7CgkJLy8gaW1wb3J0cwoJCWlmIChzaXplb2YoJHRoaXMtPmltcG9ydHMpID4gMCkgewoJCQlmb3JlYWNoKCR0aGlzLT5pbXBvcnRzIGFzICRucyA9PiAkbGlzdCkgewoJCQkJZm9yZWFjaCAoJGxpc3QgYXMgJGlpKSB7CgkJCQkJaWYgKCRpaVsnbG9jYXRpb24nXSAhPSAnJykgewoJCQkJCQkkeG1sIC49ICIgPCRzY2hlbWFQcmVmaXg6aW1wb3J0IGxvY2F0aW9uPVwiIiAuICRpaVsnbG9jYXRpb24nXSAuICciIG5hbWVzcGFjZT0iJyAuICRucyAuICJcIiAvPlxuIjsKCQkJCQl9IGVsc2UgewoJCQkJCQkkeG1sIC49ICIgPCRzY2hlbWFQcmVmaXg6aW1wb3J0IG5hbWVzcGFjZT1cIiIgLiAkbnMgLiAiXCIgLz5cbiI7CgkJCQkJfQoJCQkJfQoJCQl9IAoJCX0gCgkJLy8gY29tcGxleCB0eXBlcwoJCWZvcmVhY2goJHRoaXMtPmNvbXBsZXhUeXBlcyBhcyAkdHlwZU5hbWUgPT4gJGF0dHJzKXsKCQkJJGNvbnRlbnRTdHIgPSAnJzsKCQkJLy8gc2VyaWFsaXplIGNoaWxkIGVsZW1lbnRzCgkJCWlmKGlzc2V0KCRhdHRyc1snZWxlbWVudHMnXSkgJiYgKGNvdW50KCRhdHRyc1snZWxlbWVudHMnXSkgPiAwKSl7CgkJCQlmb3JlYWNoKCRhdHRyc1snZWxlbWVudHMnXSBhcyAkZWxlbWVudCA9PiAkZVBhcnRzKXsKCQkJCQlpZihpc3NldCgkZVBhcnRzWydyZWYnXSkpewoJCQkJCQkkY29udGVudFN0ciAuPSAiICAgPCRzY2hlbWFQcmVmaXg6ZWxlbWVudCByZWY9XCIkZWxlbWVudFwiLz5cbiI7CgkJCQkJfSBlbHNlIHsKCQkJCQkJJGNvbnRlbnRTdHIgLj0gIiAgIDwkc2NoZW1hUHJlZml4OmVsZW1lbnQgbmFtZT1cIiRlbGVtZW50XCIgdHlwZT1cIiIgLiAkdGhpcy0+Y29udHJhY3RRTmFtZSgkZVBhcnRzWyd0eXBlJ10pIC4gIlwiIjsKCQkJCQkJZm9yZWFjaCAoJGVQYXJ0cyBhcyAkYU5hbWUgPT4gJGFWYWx1ZSkgewoJCQkJCQkJLy8gaGFuZGxlLCBlLmcuLCBhYnN0cmFjdCwgZGVmYXVsdCwgZm9ybSwgbWluT2NjdXJzLCBtYXhPY2N1cnMsIG5pbGxhYmxlCgkJCQkJCQlpZiAoJGFOYW1lICE9ICduYW1lJyAmJiAkYU5hbWUgIT0gJ3R5cGUnKSB7CgkJCQkJCQkJJGNvbnRlbnRTdHIgLj0gIiAkYU5hbWU9XCIkYVZhbHVlXCIiOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCSRjb250ZW50U3RyIC49ICIvPlxuIjsKCQkJCQl9CgkJCQl9CgkJCQkvLyBjb21wb3NpdG9yIHdyYXBzIGVsZW1lbnRzCgkJCQlpZiAoaXNzZXQoJGF0dHJzWydjb21wb3NpdG9yJ10pICYmICgkYXR0cnNbJ2NvbXBvc2l0b3InXSAhPSAnJykpIHsKCQkJCQkkY29udGVudFN0ciA9ICIgIDwkc2NoZW1hUHJlZml4OiRhdHRyc1tjb21wb3NpdG9yXT5cbiIuJGNvbnRlbnRTdHIuIiAgPC8kc2NoZW1hUHJlZml4OiRhdHRyc1tjb21wb3NpdG9yXT5cbiI7CgkJCQl9CgkJCX0KCQkJLy8gYXR0cmlidXRlcwoJCQlpZihpc3NldCgkYXR0cnNbJ2F0dHJzJ10pICYmIChjb3VudCgkYXR0cnNbJ2F0dHJzJ10pID49IDEpKXsKCQkJCWZvcmVhY2goJGF0dHJzWydhdHRycyddIGFzICRhdHRyID0+ICRhUGFydHMpewoJCQkJCSRjb250ZW50U3RyIC49ICIgICAgPCRzY2hlbWFQcmVmaXg6YXR0cmlidXRlIjsKCQkJCQlmb3JlYWNoICgkYVBhcnRzIGFzICRhID0+ICR2KSB7CgkJCQkJCWlmICgkYSA9PSAncmVmJyB8fCAkYSA9PSAndHlwZScpIHsKCQkJCQkJCSRjb250ZW50U3RyIC49ICIgJGE9XCIiLiR0aGlzLT5jb250cmFjdFFOYW1lKCR2KS4nIic7CgkJCQkJCX0gZWxzZWlmICgkYSA9PSAnaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC86YXJyYXlUeXBlJykgewoJCQkJCQkJJHRoaXMtPnVzZWROYW1lc3BhY2VzWyd3c2RsJ10gPSAkdGhpcy0+bmFtZXNwYWNlc1snd3NkbCddOwoJCQkJCQkJJGNvbnRlbnRTdHIgLj0gJyB3c2RsOmFycmF5VHlwZT0iJy4kdGhpcy0+Y29udHJhY3RRTmFtZSgkdikuJyInOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJJGNvbnRlbnRTdHIgLj0gIiAkYT1cIiR2XCIiOwoJCQkJCQl9CgkJCQkJfQoJCQkJCSRjb250ZW50U3RyIC49ICIvPlxuIjsKCQkJCX0KCQkJfQoJCQkvLyBpZiByZXN0cmljdGlvbgoJCQlpZiAoaXNzZXQoJGF0dHJzWydyZXN0cmljdGlvbkJhc2UnXSkgJiYgJGF0dHJzWydyZXN0cmljdGlvbkJhc2UnXSAhPSAnJyl7CgkJCQkkY29udGVudFN0ciA9ICIgICA8JHNjaGVtYVByZWZpeDpyZXN0cmljdGlvbiBiYXNlPVwiIi4kdGhpcy0+Y29udHJhY3RRTmFtZSgkYXR0cnNbJ3Jlc3RyaWN0aW9uQmFzZSddKS4iXCI+XG4iLiRjb250ZW50U3RyLiIgICA8LyRzY2hlbWFQcmVmaXg6cmVzdHJpY3Rpb24+XG4iOwoJCQkJLy8gY29tcGxleCBvciBzaW1wbGUgY29udGVudAoJCQkJaWYgKChpc3NldCgkYXR0cnNbJ2VsZW1lbnRzJ10pICYmIGNvdW50KCRhdHRyc1snZWxlbWVudHMnXSkgPiAwKSB8fCAoaXNzZXQoJGF0dHJzWydhdHRycyddKSAmJiBjb3VudCgkYXR0cnNbJ2F0dHJzJ10pID4gMCkpewoJCQkJCSRjb250ZW50U3RyID0gIiAgPCRzY2hlbWFQcmVmaXg6Y29tcGxleENvbnRlbnQ+XG4iLiRjb250ZW50U3RyLiIgIDwvJHNjaGVtYVByZWZpeDpjb21wbGV4Q29udGVudD5cbiI7CgkJCQl9CgkJCX0KCQkJLy8gZmluYWxpemUgY29tcGxleCB0eXBlCgkJCWlmKCRjb250ZW50U3RyICE9ICcnKXsKCQkJCSRjb250ZW50U3RyID0gIiA8JHNjaGVtYVByZWZpeDpjb21wbGV4VHlwZSBuYW1lPVwiJHR5cGVOYW1lXCI+XG4iLiRjb250ZW50U3RyLiIgPC8kc2NoZW1hUHJlZml4OmNvbXBsZXhUeXBlPlxuIjsKCQkJfSBlbHNlIHsKCQkJCSRjb250ZW50U3RyID0gIiA8JHNjaGVtYVByZWZpeDpjb21wbGV4VHlwZSBuYW1lPVwiJHR5cGVOYW1lXCIvPlxuIjsKCQkJfQoJCQkkeG1sIC49ICRjb250ZW50U3RyOwoJCX0KCQkvLyBzaW1wbGUgdHlwZXMKCQlpZihpc3NldCgkdGhpcy0+c2ltcGxlVHlwZXMpICYmIGNvdW50KCR0aGlzLT5zaW1wbGVUeXBlcykgPiAwKXsKCQkJZm9yZWFjaCgkdGhpcy0+c2ltcGxlVHlwZXMgYXMgJHR5cGVOYW1lID0+ICRlUGFydHMpewoJCQkJJHhtbCAuPSAiIDwkc2NoZW1hUHJlZml4OnNpbXBsZVR5cGUgbmFtZT1cIiR0eXBlTmFtZVwiPlxuICA8JHNjaGVtYVByZWZpeDpyZXN0cmljdGlvbiBiYXNlPVwiIi4kdGhpcy0+Y29udHJhY3RRTmFtZSgkZVBhcnRzWyd0eXBlJ10pLiJcIi8+XG4iOwoJCQkJaWYgKGlzc2V0KCRlUGFydHNbJ2VudW1lcmF0aW9uJ10pKSB7CgkJCQkJZm9yZWFjaCAoJGVQYXJ0c1snZW51bWVyYXRpb24nXSBhcyAkZSkgewoJCQkJCQkkeG1sIC49ICIgIDwkc2NoZW1hUHJlZml4OmVudW1lcmF0aW9uIHZhbHVlPVwiJGVcIi8+XG4iOwoJCQkJCX0KCQkJCX0KCQkJCSR4bWwgLj0gIiA8LyRzY2hlbWFQcmVmaXg6c2ltcGxlVHlwZT4iOwoJCQl9CgkJfQoJCS8vIGVsZW1lbnRzCgkJaWYoaXNzZXQoJHRoaXMtPmVsZW1lbnRzKSAmJiBjb3VudCgkdGhpcy0+ZWxlbWVudHMpID4gMCl7CgkJCWZvcmVhY2goJHRoaXMtPmVsZW1lbnRzIGFzICRlbGVtZW50ID0+ICRlUGFydHMpewoJCQkJJHhtbCAuPSAiIDwkc2NoZW1hUHJlZml4OmVsZW1lbnQgbmFtZT1cIiRlbGVtZW50XCIgdHlwZT1cIiIuJHRoaXMtPmNvbnRyYWN0UU5hbWUoJGVQYXJ0c1sndHlwZSddKS4iXCIvPlxuIjsKCQkJfQoJCX0KCQkvLyBhdHRyaWJ1dGVzCgkJaWYoaXNzZXQoJHRoaXMtPmF0dHJpYnV0ZXMpICYmIGNvdW50KCR0aGlzLT5hdHRyaWJ1dGVzKSA+IDApewoJCQlmb3JlYWNoKCR0aGlzLT5hdHRyaWJ1dGVzIGFzICRhdHRyID0+ICRhUGFydHMpewoJCQkJJHhtbCAuPSAiIDwkc2NoZW1hUHJlZml4OmF0dHJpYnV0ZSBuYW1lPVwiJGF0dHJcIiB0eXBlPVwiIi4kdGhpcy0+Y29udHJhY3RRTmFtZSgkYVBhcnRzWyd0eXBlJ10pLiJcIlxuLz4iOwoJCQl9CgkJfQoJCS8vIGZpbmlzaCAnZXIgdXAKCQkkZWwgPSAiPCRzY2hlbWFQcmVmaXg6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT1cIiR0aGlzLT5zY2hlbWFUYXJnZXROYW1lc3BhY2VcIlxuIjsKCQlmb3JlYWNoIChhcnJheV9kaWZmKCR0aGlzLT51c2VkTmFtZXNwYWNlcywgJHRoaXMtPmVuY2xvc2luZ05hbWVzcGFjZXMpIGFzICRuc3AgPT4gJG5zKSB7CgkJCSRlbCAuPSAiIHhtbG5zOiRuc3A9XCIkbnNcIlxuIjsKCQl9CgkJJHhtbCA9ICRlbCAuICI+XG4iLiR4bWwuIjwvJHNjaGVtYVByZWZpeDpzY2hlbWE+XG4iOwoJCXJldHVybiAkeG1sOwoJfQoKCS8qKgoJKiBhZGRzIGRlYnVnIGRhdGEgdG8gdGhlIGNsYXMgbGV2ZWwgZGVidWcgc3RyaW5nCgkqCgkqIEBwYXJhbSAgICBzdHJpbmcgJHN0cmluZyBkZWJ1ZyBkYXRhCgkqIEBhY2Nlc3MgICBwcml2YXRlCgkqLwoJZnVuY3Rpb24geGRlYnVnKCRzdHJpbmcpewoJCSR0aGlzLT5kZWJ1ZygnPCcgLiAkdGhpcy0+c2NoZW1hVGFyZ2V0TmFtZXNwYWNlIC4gJz4gJy4kc3RyaW5nKTsKCX0KCiAgICAvKioKICAgICogZ2V0IHRoZSBQSFAgdHlwZSBvZiBhIHVzZXIgZGVmaW5lZCB0eXBlIGluIHRoZSBzY2hlbWEKICAgICogUEhQIHR5cGUgaXMga2luZCBvZiBhIG1pc25vbWVyIHNpbmNlIGl0IGFjdHVhbGx5IHJldHVybnMgJ3N0cnVjdCcgZm9yIGFzc29jLiBhcnJheXMKICAgICogcmV0dXJucyBmYWxzZSBpZiBubyB0eXBlIGV4aXN0cywgb3Igbm90IHcvIHRoZSBnaXZlbiBuYW1lc3BhY2UKICAgICogZWxzZSByZXR1cm5zIGEgc3RyaW5nIHRoYXQgaXMgZWl0aGVyIGEgbmF0aXZlIHBocCB0eXBlLCBvciAnc3RydWN0JwogICAgKgogICAgKiBAcGFyYW0gc3RyaW5nICR0eXBlLCBuYW1lIG9mIGRlZmluZWQgdHlwZQogICAgKiBAcGFyYW0gc3RyaW5nICRucywgbmFtZXNwYWNlIG9mIHR5cGUKICAgICogQHJldHVybiBtaXhlZAogICAgKiBAYWNjZXNzIHB1YmxpYwogICAgKiBAZGVwcmVjYXRlZAogICAgKi8KCWZ1bmN0aW9uIGdldFBIUFR5cGUoJHR5cGUsJG5zKXsKCQlpZihpc3NldCgkdGhpcy0+dHlwZW1hcFskbnNdWyR0eXBlXSkpewoJCQkvL3ByaW50ICJmb3VuZCB0eXBlICckdHlwZScgYW5kIG5zICRucyBpbiB0eXBlbWFwPGJyPiI7CgkJCXJldHVybiAkdGhpcy0+dHlwZW1hcFskbnNdWyR0eXBlXTsKCQl9IGVsc2VpZihpc3NldCgkdGhpcy0+Y29tcGxleFR5cGVzWyR0eXBlXSkpewoJCQkvL3ByaW50ICJnZXR0aW5nIHR5cGUgJyR0eXBlJyBhbmQgbnMgJG5zIGZyb20gY29tcGxleFR5cGVzIGFycmF5PGJyPiI7CgkJCXJldHVybiAkdGhpcy0+Y29tcGxleFR5cGVzWyR0eXBlXVsncGhwVHlwZSddOwoJCX0KCQlyZXR1cm4gZmFsc2U7Cgl9CgoJLyoqCiAgICAqIHJldHVybnMgYW4gYXNzb2NpYXRpdmUgYXJyYXkgb2YgaW5mb3JtYXRpb24gYWJvdXQgYSBnaXZlbiB0eXBlCiAgICAqIHJldHVybnMgZmFsc2UgaWYgbm8gdHlwZSBleGlzdHMgYnkgdGhlIGdpdmVuIG5hbWUKICAgICoKCSoJRm9yIGEgY29tcGxleFR5cGUgdHlwZURlZiA9IGFycmF5KAoJKgkncmVzdHJpY3Rpb25CYXNlJyA9PiAnJywKCSoJJ3BocFR5cGUnID0+ICcnLAoJKgknY29tcG9zaXRvcicgPT4gJyhzZXF1ZW5jZXxhbGwpJywKCSoJJ2VsZW1lbnRzJyA9PiBhcnJheSgpLCAvLyByZWZzIHRvIGVsZW1lbnRzIGFycmF5CgkqCSdhdHRycycgPT4gYXJyYXkoKSAvLyByZWZzIHRvIGF0dHJpYnV0ZXMgYXJyYXkKCSoJLi4uIGFuZCBzbyBvbiAoc2VlIGFkZENvbXBsZXhUeXBlKQoJKgkpCgkqCgkqICAgRm9yIHNpbXBsZVR5cGUgb3IgZWxlbWVudCwgdGhlIGFycmF5IGhhcyBkaWZmZXJlbnQga2V5cy4KICAgICoKICAgICogQHBhcmFtIHN0cmluZwogICAgKiBAcmV0dXJuIG1peGVkCiAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAqIEBzZWUgYWRkQ29tcGxleFR5cGUKICAgICogQHNlZSBhZGRTaW1wbGVUeXBlCiAgICAqIEBzZWUgYWRkRWxlbWVudAogICAgKi8KCWZ1bmN0aW9uIGdldFR5cGVEZWYoJHR5cGUpewoJCS8vJHRoaXMtPmRlYnVnKCJpbiBnZXRUeXBlRGVmIGZvciB0eXBlICR0eXBlIik7CgkJaWYoaXNzZXQoJHRoaXMtPmNvbXBsZXhUeXBlc1skdHlwZV0pKXsKCQkJJHRoaXMtPnhkZWJ1ZygiaW4gZ2V0VHlwZURlZiwgZm91bmQgY29tcGxleFR5cGUgJHR5cGUiKTsKCQkJcmV0dXJuICR0aGlzLT5jb21wbGV4VHlwZXNbJHR5cGVdOwoJCX0gZWxzZWlmKGlzc2V0KCR0aGlzLT5zaW1wbGVUeXBlc1skdHlwZV0pKXsKCQkJJHRoaXMtPnhkZWJ1ZygiaW4gZ2V0VHlwZURlZiwgZm91bmQgc2ltcGxlVHlwZSAkdHlwZSIpOwoJCQlpZiAoIWlzc2V0KCR0aGlzLT5zaW1wbGVUeXBlc1skdHlwZV1bJ3BocFR5cGUnXSkpIHsKCQkJCS8vIGdldCBpbmZvIGZvciB0eXBlIHRvIHRhY2sgb250byB0aGUgc2ltcGxlIHR5cGUKCQkJCS8vIFRPRE86IGNhbiB0aGlzIGV2ZXIgcmVhbGx5IGFwcGx5IChpLmUuIHdoYXQgaXMgYSBzaW1wbGVUeXBlIHJlYWxseT8pCgkJCQkkdXFUeXBlID0gc3Vic3RyKCR0aGlzLT5zaW1wbGVUeXBlc1skdHlwZV1bJ3R5cGUnXSwgc3RycnBvcygkdGhpcy0+c2ltcGxlVHlwZXNbJHR5cGVdWyd0eXBlJ10sICc6JykgKyAxKTsKCQkJCSRucyA9IHN1YnN0cigkdGhpcy0+c2ltcGxlVHlwZXNbJHR5cGVdWyd0eXBlJ10sIDAsIHN0cnJwb3MoJHRoaXMtPnNpbXBsZVR5cGVzWyR0eXBlXVsndHlwZSddLCAnOicpKTsKCQkJCSRldHlwZSA9ICR0aGlzLT5nZXRUeXBlRGVmKCR1cVR5cGUpOwoJCQkJaWYgKCRldHlwZSkgewoJCQkJCSR0aGlzLT54ZGVidWcoImluIGdldFR5cGVEZWYsIGZvdW5kIHR5cGUgZm9yIHNpbXBsZVR5cGUgJHR5cGU6Iik7CgkJCQkJJHRoaXMtPnhkZWJ1ZygkdGhpcy0+dmFyRHVtcCgkZXR5cGUpKTsKCQkJCQlpZiAoaXNzZXQoJGV0eXBlWydwaHBUeXBlJ10pKSB7CgkJCQkJCSR0aGlzLT5zaW1wbGVUeXBlc1skdHlwZV1bJ3BocFR5cGUnXSA9ICRldHlwZVsncGhwVHlwZSddOwoJCQkJCX0KCQkJCQlpZiAoaXNzZXQoJGV0eXBlWydlbGVtZW50cyddKSkgewoJCQkJCQkkdGhpcy0+c2ltcGxlVHlwZXNbJHR5cGVdWydlbGVtZW50cyddID0gJGV0eXBlWydlbGVtZW50cyddOwoJCQkJCX0KCQkJCX0KCQkJfQoJCQlyZXR1cm4gJHRoaXMtPnNpbXBsZVR5cGVzWyR0eXBlXTsKCQl9IGVsc2VpZihpc3NldCgkdGhpcy0+ZWxlbWVudHNbJHR5cGVdKSl7CgkJCSR0aGlzLT54ZGVidWcoImluIGdldFR5cGVEZWYsIGZvdW5kIGVsZW1lbnQgJHR5cGUiKTsKCQkJaWYgKCFpc3NldCgkdGhpcy0+ZWxlbWVudHNbJHR5cGVdWydwaHBUeXBlJ10pKSB7CgkJCQkvLyBnZXQgaW5mbyBmb3IgdHlwZSB0byB0YWNrIG9udG8gdGhlIGVsZW1lbnQKCQkJCSR1cVR5cGUgPSBzdWJzdHIoJHRoaXMtPmVsZW1lbnRzWyR0eXBlXVsndHlwZSddLCBzdHJycG9zKCR0aGlzLT5lbGVtZW50c1skdHlwZV1bJ3R5cGUnXSwgJzonKSArIDEpOwoJCQkJJG5zID0gc3Vic3RyKCR0aGlzLT5lbGVtZW50c1skdHlwZV1bJ3R5cGUnXSwgMCwgc3RycnBvcygkdGhpcy0+ZWxlbWVudHNbJHR5cGVdWyd0eXBlJ10sICc6JykpOwoJCQkJJGV0eXBlID0gJHRoaXMtPmdldFR5cGVEZWYoJHVxVHlwZSk7CgkJCQlpZiAoJGV0eXBlKSB7CgkJCQkJJHRoaXMtPnhkZWJ1ZygiaW4gZ2V0VHlwZURlZiwgZm91bmQgdHlwZSBmb3IgZWxlbWVudCAkdHlwZToiKTsKCQkJCQkkdGhpcy0+eGRlYnVnKCR0aGlzLT52YXJEdW1wKCRldHlwZSkpOwoJCQkJCWlmIChpc3NldCgkZXR5cGVbJ3BocFR5cGUnXSkpIHsKCQkJCQkJJHRoaXMtPmVsZW1lbnRzWyR0eXBlXVsncGhwVHlwZSddID0gJGV0eXBlWydwaHBUeXBlJ107CgkJCQkJfQoJCQkJCWlmIChpc3NldCgkZXR5cGVbJ2VsZW1lbnRzJ10pKSB7CgkJCQkJCSR0aGlzLT5lbGVtZW50c1skdHlwZV1bJ2VsZW1lbnRzJ10gPSAkZXR5cGVbJ2VsZW1lbnRzJ107CgkJCQkJfQoJCQkJfSBlbHNlaWYgKCRucyA9PSAnaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnKSB7CgkJCQkJJHRoaXMtPnhkZWJ1ZygiaW4gZ2V0VHlwZURlZiwgZWxlbWVudCAkdHlwZSBpcyBhbiBYU0QgdHlwZSIpOwoJCQkJCSR0aGlzLT5lbGVtZW50c1skdHlwZV1bJ3BocFR5cGUnXSA9ICdzY2FsYXInOwoJCQkJfQoJCQl9CgkJCXJldHVybiAkdGhpcy0+ZWxlbWVudHNbJHR5cGVdOwoJCX0gZWxzZWlmKGlzc2V0KCR0aGlzLT5hdHRyaWJ1dGVzWyR0eXBlXSkpewoJCQkkdGhpcy0+eGRlYnVnKCJpbiBnZXRUeXBlRGVmLCBmb3VuZCBhdHRyaWJ1dGUgJHR5cGUiKTsKCQkJcmV0dXJuICR0aGlzLT5hdHRyaWJ1dGVzWyR0eXBlXTsKCQl9IGVsc2VpZiAoZXJlZygnX0NvbnRhaW5lZFR5cGUkJywgJHR5cGUpKSB7CgkJCSR0aGlzLT54ZGVidWcoImluIGdldFR5cGVEZWYsIGhhdmUgYW4gdW50eXBlZCBlbGVtZW50ICR0eXBlIik7CgkJCSR0eXBlRGVmWyd0eXBlQ2xhc3MnXSA9ICdzaW1wbGVUeXBlJzsKCQkJJHR5cGVEZWZbJ3BocFR5cGUnXSA9ICdzY2FsYXInOwoJCQkkdHlwZURlZlsndHlwZSddID0gJ2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hOnN0cmluZyc7CgkJCXJldHVybiAkdHlwZURlZjsKCQl9CgkJJHRoaXMtPnhkZWJ1ZygiaW4gZ2V0VHlwZURlZiwgZGlkIG5vdCBmaW5kICR0eXBlIik7CgkJcmV0dXJuIGZhbHNlOwoJfQoKCS8qKgogICAgKiByZXR1cm5zIGEgc2FtcGxlIHNlcmlhbGl6YXRpb24gb2YgYSBnaXZlbiB0eXBlLCBvciBmYWxzZSBpZiBubyB0eXBlIGJ5IHRoZSBnaXZlbiBuYW1lCiAgICAqCiAgICAqIEBwYXJhbSBzdHJpbmcgJHR5cGUsIG5hbWUgb2YgdHlwZQogICAgKiBAcmV0dXJuIG1peGVkCiAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAqIEBkZXByZWNhdGVkCiAgICAqLwogICAgZnVuY3Rpb24gc2VyaWFsaXplVHlwZURlZigkdHlwZSl7CiAgICAJLy9wcmludCAiaW4gc1REKCkgZm9yIHR5cGUgJHR5cGU8YnI+IjsKCWlmKCR0eXBlRGVmID0gJHRoaXMtPmdldFR5cGVEZWYoJHR5cGUpKXsKCQkkc3RyIC49ICc8Jy4kdHlwZTsKCSAgICBpZihpc19hcnJheSgkdHlwZURlZlsnYXR0cnMnXSkpewoJCWZvcmVhY2goJGF0dHJzIGFzICRhdHROYW1lID0+ICRkYXRhKXsKCQkgICAgJHN0ciAuPSAiICRhdHROYW1lPVwie3R5cGUgPSAiLiRkYXRhWyd0eXBlJ10uIn1cIiI7CgkJfQoJICAgIH0KCSAgICAkc3RyIC49ICIgeG1sbnM9XCIiLiR0aGlzLT5zY2hlbWFbJ3RhcmdldE5hbWVzcGFjZSddLiJcIiI7CgkgICAgaWYoY291bnQoJHR5cGVEZWZbJ2VsZW1lbnRzJ10pID4gMCl7CgkJJHN0ciAuPSAiPiI7CgkJZm9yZWFjaCgkdHlwZURlZlsnZWxlbWVudHMnXSBhcyAkZWxlbWVudCA9PiAkZURhdGEpewoJCSAgICAkc3RyIC49ICR0aGlzLT5zZXJpYWxpemVUeXBlRGVmKCRlbGVtZW50KTsKCQl9CgkJJHN0ciAuPSAiPC8kdHlwZT4iOwoJICAgIH0gZWxzZWlmKCR0eXBlRGVmWyd0eXBlQ2xhc3MnXSA9PSAnZWxlbWVudCcpIHsKCQkkc3RyIC49ICI+PC8kdHlwZT4iOwoJICAgIH0gZWxzZSB7CgkJJHN0ciAuPSAiLz4iOwoJICAgIH0KCQkJcmV0dXJuICRzdHI7Cgl9CiAgICAJcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8qKgogICAgKiByZXR1cm5zIEhUTUwgZm9ybSBlbGVtZW50cyB0aGF0IGFsbG93IGEgdXNlcgogICAgKiB0byBlbnRlciB2YWx1ZXMgZm9yIGNyZWF0aW5nIGFuIGluc3RhbmNlIG9mIHRoZSBnaXZlbiB0eXBlLgogICAgKgogICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lLCBuYW1lIGZvciB0eXBlIGluc3RhbmNlCiAgICAqIEBwYXJhbSBzdHJpbmcgJHR5cGUsIG5hbWUgb2YgdHlwZQogICAgKiBAcmV0dXJuIHN0cmluZwogICAgKiBAYWNjZXNzIHB1YmxpYwogICAgKiBAZGVwcmVjYXRlZAoJKi8KCWZ1bmN0aW9uIHR5cGVUb0Zvcm0oJG5hbWUsJHR5cGUpewoJCS8vIGdldCB0eXBlZGVmCgkJaWYoJHR5cGVEZWYgPSAkdGhpcy0+Z2V0VHlwZURlZigkdHlwZSkpewoJCQkvLyBpZiBzdHJ1Y3QKCQkJaWYoJHR5cGVEZWZbJ3BocFR5cGUnXSA9PSAnc3RydWN0Jyl7CgkJCQkkYnVmZmVyIC49ICc8dGFibGU+JzsKCQkJCWZvcmVhY2goJHR5cGVEZWZbJ2VsZW1lbnRzJ10gYXMgJGNoaWxkID0+ICRjaGlsZERlZil7CgkJCQkJJGJ1ZmZlciAuPSAiCgkJCQkJPHRyPjx0ZCBhbGlnbj0ncmlnaHQnPiRjaGlsZERlZltuYW1lXSAodHlwZTogIi4kdGhpcy0+Z2V0TG9jYWxQYXJ0KCRjaGlsZERlZlsndHlwZSddKS4iKTo8L3RkPgoJCQkJCTx0ZD48aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0ncGFyYW1ldGVyc1siLiRuYW1lLiJdWyRjaGlsZERlZltuYW1lXV0nPjwvdGQ+PC90cj4iOwoJCQkJfQoJCQkJJGJ1ZmZlciAuPSAnPC90YWJsZT4nOwoJCQkvLyBpZiBhcnJheQoJCQl9IGVsc2VpZigkdHlwZURlZlsncGhwVHlwZSddID09ICdhcnJheScpewoJCQkJJGJ1ZmZlciAuPSAnPHRhYmxlPic7CgkJCQlmb3IoJGk9MDskaSA8IDM7ICRpKyspewoJCQkJCSRidWZmZXIgLj0gIgoJCQkJCTx0cj48dGQgYWxpZ249J3JpZ2h0Jz5hcnJheSBpdGVtICh0eXBlOiAkdHlwZURlZlthcnJheVR5cGVdKTo8L3RkPgoJCQkJCTx0ZD48aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0ncGFyYW1ldGVyc1siLiRuYW1lLiJdW10nPjwvdGQ+PC90cj4iOwoJCQkJfQoJCQkJJGJ1ZmZlciAuPSAnPC90YWJsZT4nOwoJCQkvLyBpZiBzY2FsYXIKCQkJfSBlbHNlIHsKCQkJCSRidWZmZXIgLj0gIjxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSdwYXJhbWV0ZXJzWyRuYW1lXSc+IjsKCQkJfQoJCX0gZWxzZSB7CgkJCSRidWZmZXIgLj0gIjxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSdwYXJhbWV0ZXJzWyRuYW1lXSc+IjsKCQl9CgkJcmV0dXJuICRidWZmZXI7Cgl9CgkKCS8qKgoJKiBhZGRzIGEgY29tcGxleCB0eXBlIHRvIHRoZSBzY2hlbWEKCSogCgkqIGV4YW1wbGU6IGFycmF5CgkqIAoJKiBhZGRUeXBlKAoJKiAJJ0FycmF5T2ZzdHJpbmcnLAoJKiAJJ2NvbXBsZXhUeXBlJywKCSogCSdhcnJheScsCgkqIAknJywKCSogCSdTT0FQLUVOQzpBcnJheScsCgkqIAlhcnJheSgncmVmJz0+J1NPQVAtRU5DOmFycmF5VHlwZScsJ3dzZGw6YXJyYXlUeXBlJz0+J3N0cmluZ1tdJyksCgkqIAkneHNkOnN0cmluZycKCSogKTsKCSogCgkqIGV4YW1wbGU6IFBIUCBhc3NvY2lhdGl2ZSBhcnJheSAoIFNPQVAgU3RydWN0ICkKCSogCgkqIGFkZFR5cGUoCgkqIAknU09BUFN0cnVjdCcsCgkqIAknY29tcGxleFR5cGUnLAoJKiAJJ3N0cnVjdCcsCgkqIAknYWxsJywKCSogCWFycmF5KCdteVZhcic9PiBhcnJheSgnbmFtZSc9PidteVZhcicsJ3R5cGUnPT4nc3RyaW5nJykKCSogKTsKCSogCgkqIEBwYXJhbSBuYW1lCgkqIEBwYXJhbSB0eXBlQ2xhc3MgKGNvbXBsZXhUeXBlfHNpbXBsZVR5cGV8YXR0cmlidXRlKQoJKiBAcGFyYW0gcGhwVHlwZTogY3VycmVudGx5IHN1cHBvcnRlZCBhcmUgYXJyYXkgYW5kIHN0cnVjdCAocGhwIGFzc29jIGFycmF5KQoJKiBAcGFyYW0gY29tcG9zaXRvciAoYWxsfHNlcXVlbmNlfGNob2ljZSkKCSogQHBhcmFtIHJlc3RyaWN0aW9uQmFzZSBuYW1lc3BhY2U6bmFtZSAoaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy86QXJyYXkpCgkqIEBwYXJhbSBlbGVtZW50cyA9IGFycmF5ICggbmFtZSA9IGFycmF5KG5hbWU9PicnLHR5cGU9PicnKSApCgkqIEBwYXJhbSBhdHRycyA9IGFycmF5KAoJKiAJYXJyYXkoCgkqCQkncmVmJyA9PiAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy86YXJyYXlUeXBlIiwKCSoJCSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLzphcnJheVR5cGUiID0+ICJzdHJpbmdbXSIKCSogCSkKCSogKQoJKiBAcGFyYW0gYXJyYXlUeXBlOiBuYW1lc3BhY2U6bmFtZSAoaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWE6c3RyaW5nKQoJKiBAYWNjZXNzIHB1YmxpYwoJKiBAc2VlIGdldFR5cGVEZWYKCSovCglmdW5jdGlvbiBhZGRDb21wbGV4VHlwZSgkbmFtZSwkdHlwZUNsYXNzPSdjb21wbGV4VHlwZScsJHBocFR5cGU9J2FycmF5JywkY29tcG9zaXRvcj0nJywkcmVzdHJpY3Rpb25CYXNlPScnLCRlbGVtZW50cz1hcnJheSgpLCRhdHRycz1hcnJheSgpLCRhcnJheVR5cGU9JycpewoJCSR0aGlzLT5jb21wbGV4VHlwZXNbJG5hbWVdID0gYXJyYXkoCgkgICAgJ25hbWUnCQk9PiAkbmFtZSwKCSAgICAndHlwZUNsYXNzJwk9PiAkdHlwZUNsYXNzLAoJICAgICdwaHBUeXBlJwk9PiAkcGhwVHlwZSwKCQknY29tcG9zaXRvcic9PiAkY29tcG9zaXRvciwKCSAgICAncmVzdHJpY3Rpb25CYXNlJyA9PiAkcmVzdHJpY3Rpb25CYXNlLAoJCSdlbGVtZW50cycJPT4gJGVsZW1lbnRzLAoJICAgICdhdHRycycJCT0+ICRhdHRycywKCSAgICAnYXJyYXlUeXBlJwk9PiAkYXJyYXlUeXBlCgkJKTsKCQkKCQkkdGhpcy0+eGRlYnVnKCJhZGRDb21wbGV4VHlwZSAkbmFtZToiKTsKCQkkdGhpcy0+YXBwZW5kRGVidWcoJHRoaXMtPnZhckR1bXAoJHRoaXMtPmNvbXBsZXhUeXBlc1skbmFtZV0pKTsKCX0KCQoJLyoqCgkqIGFkZHMgYSBzaW1wbGUgdHlwZSB0byB0aGUgc2NoZW1hCgkqCgkqIEBwYXJhbSBzdHJpbmcgJG5hbWUKCSogQHBhcmFtIHN0cmluZyAkcmVzdHJpY3Rpb25CYXNlIG5hbWVzcGFjZTpuYW1lIChodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLzpBcnJheSkKCSogQHBhcmFtIHN0cmluZyAkdHlwZUNsYXNzIChzaG91bGQgYWx3YXlzIGJlIHNpbXBsZVR5cGUpCgkqIEBwYXJhbSBzdHJpbmcgJHBocFR5cGUgKHNob3VsZCBhbHdheXMgYmUgc2NhbGFyKQoJKiBAcGFyYW0gYXJyYXkgJGVudW1lcmF0aW9uIGFycmF5IG9mIHZhbHVlcwoJKiBAYWNjZXNzIHB1YmxpYwoJKiBAc2VlIHhtbHNjaGVtYQoJKiBAc2VlIGdldFR5cGVEZWYKCSovCglmdW5jdGlvbiBhZGRTaW1wbGVUeXBlKCRuYW1lLCAkcmVzdHJpY3Rpb25CYXNlPScnLCAkdHlwZUNsYXNzPSdzaW1wbGVUeXBlJywgJHBocFR5cGU9J3NjYWxhcicsICRlbnVtZXJhdGlvbj1hcnJheSgpKSB7CgkJJHRoaXMtPnNpbXBsZVR5cGVzWyRuYW1lXSA9IGFycmF5KAoJICAgICduYW1lJwkJCT0+ICRuYW1lLAoJICAgICd0eXBlQ2xhc3MnCQk9PiAkdHlwZUNsYXNzLAoJICAgICdwaHBUeXBlJwkJPT4gJHBocFR5cGUsCgkgICAgJ3R5cGUnCQkJPT4gJHJlc3RyaWN0aW9uQmFzZSwKCSAgICAnZW51bWVyYXRpb24nCT0+ICRlbnVtZXJhdGlvbgoJCSk7CgkJCgkJJHRoaXMtPnhkZWJ1ZygiYWRkU2ltcGxlVHlwZSAkbmFtZToiKTsKCQkkdGhpcy0+YXBwZW5kRGVidWcoJHRoaXMtPnZhckR1bXAoJHRoaXMtPnNpbXBsZVR5cGVzWyRuYW1lXSkpOwoJfQoKCS8qKgoJKiBhZGRzIGFuIGVsZW1lbnQgdG8gdGhlIHNjaGVtYQoJKgoJKiBAcGFyYW0gYXJyYXkgJGF0dHJzIGF0dHJpYnV0ZXMgdGhhdCBtdXN0IGluY2x1ZGUgbmFtZSBhbmQgdHlwZQoJKiBAc2VlIHhtbHNjaGVtYQoJKiBAYWNjZXNzIHB1YmxpYwoJKi8KCWZ1bmN0aW9uIGFkZEVsZW1lbnQoJGF0dHJzKSB7CgkJaWYgKCEgJHRoaXMtPmdldFByZWZpeCgkYXR0cnNbJ3R5cGUnXSkpIHsKCQkJJGF0dHJzWyd0eXBlJ10gPSAkdGhpcy0+c2NoZW1hVGFyZ2V0TmFtZXNwYWNlIC4gJzonIC4gJGF0dHJzWyd0eXBlJ107CgkJfQoJCSR0aGlzLT5lbGVtZW50c1sgJGF0dHJzWyduYW1lJ10gXSA9ICRhdHRyczsKCQkkdGhpcy0+ZWxlbWVudHNbICRhdHRyc1snbmFtZSddIF1bJ3R5cGVDbGFzcyddID0gJ2VsZW1lbnQnOwoJCQoJCSR0aGlzLT54ZGVidWcoImFkZEVsZW1lbnQgIiAuICRhdHRyc1snbmFtZSddKTsKCQkkdGhpcy0+YXBwZW5kRGVidWcoJHRoaXMtPnZhckR1bXAoJHRoaXMtPmVsZW1lbnRzWyAkYXR0cnNbJ25hbWUnXSBdKSk7Cgl9Cn0KCgoKPz48P3BocAoKCgovKioKKiBGb3IgY3JlYXRpbmcgc2VyaWFsaXphYmxlIGFic3RyYWN0aW9ucyBvZiBuYXRpdmUgUEhQIHR5cGVzLiAgVGhpcyBjbGFzcwoqIGFsbG93cyBlbGVtZW50IG5hbWUvbmFtZXNwYWNlLCBYU0QgdHlwZSwgYW5kIFhNTCBhdHRyaWJ1dGVzIHRvIGJlCiogYXNzb2NpYXRlZCB3aXRoIGEgdmFsdWUuICBUaGlzIGlzIGV4dHJlbWVseSB1c2VmdWwgd2hlbiBXU0RMIGlzIG5vdAoqIHVzZWQsIGJ1dCBpcyBhbHNvIHVzZWZ1bCB3aGVuIFdTREwgaXMgdXNlZCB3aXRoIHBvbHltb3JwaGljIHR5cGVzLCBpbmNsdWRpbmcKKiB4c2Q6YW55VHlwZSBhbmQgdXNlci1kZWZpbmVkIHR5cGVzLgoqCiogQGF1dGhvciAgIERpZXRyaWNoIEF5YWxhIDxkaWV0cmljaEBnYW54NC5jb20+CiogQHZlcnNpb24gICRJZDogbnVzb2FwLnBocCx2IDEuOTQgMjAwNS8wOC8wNCAwMToyNzo0MiBzbmljaG9sIEV4cCAkCiogQGFjY2VzcyAgIHB1YmxpYwoqLwpjbGFzcyBzb2FwdmFsIGV4dGVuZHMgbnVzb2FwX2Jhc2UgewoJLyoqCgkgKiBUaGUgWE1MIGVsZW1lbnQgbmFtZQoJICoKCSAqIEB2YXIgc3RyaW5nCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJdmFyICRuYW1lOwoJLyoqCgkgKiBUaGUgWE1MIHR5cGUgbmFtZSAoc3RyaW5nIG9yIGZhbHNlKQoJICoKCSAqIEB2YXIgbWl4ZWQKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCgl2YXIgJHR5cGU7CgkvKioKCSAqIFRoZSBQSFAgdmFsdWUKCSAqCgkgKiBAdmFyIG1peGVkCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJdmFyICR2YWx1ZTsKCS8qKgoJICogVGhlIFhNTCBlbGVtZW50IG5hbWVzcGFjZSAoc3RyaW5nIG9yIGZhbHNlKQoJICoKCSAqIEB2YXIgbWl4ZWQKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCgl2YXIgJGVsZW1lbnRfbnM7CgkvKioKCSAqIFRoZSBYTUwgdHlwZSBuYW1lc3BhY2UgKHN0cmluZyBvciBmYWxzZSkKCSAqCgkgKiBAdmFyIG1peGVkCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJdmFyICR0eXBlX25zOwoJLyoqCgkgKiBUaGUgWE1MIGVsZW1lbnQgYXR0cmlidXRlcyAoYXJyYXkgb3IgZmFsc2UpCgkgKgoJICogQHZhciBtaXhlZAoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCXZhciAkYXR0cmlidXRlczsKCgkvKioKCSogY29uc3RydWN0b3IKCSoKCSogQHBhcmFtICAgIHN0cmluZyAkbmFtZSBvcHRpb25hbCBuYW1lCgkqIEBwYXJhbSAgICBtaXhlZCAkdHlwZSBvcHRpb25hbCB0eXBlIG5hbWUKCSogQHBhcmFtCW1peGVkICR2YWx1ZSBvcHRpb25hbCB2YWx1ZQoJKiBAcGFyYW0JbWl4ZWQgJGVsZW1lbnRfbnMgb3B0aW9uYWwgbmFtZXNwYWNlIG9mIHZhbHVlCgkqIEBwYXJhbQltaXhlZCAkdHlwZV9ucyBvcHRpb25hbCBuYW1lc3BhY2Ugb2YgdHlwZQoJKiBAcGFyYW0JbWl4ZWQgJGF0dHJpYnV0ZXMgYXNzb2NpYXRpdmUgYXJyYXkgb2YgYXR0cmlidXRlcyB0byBhZGQgdG8gZWxlbWVudCBzZXJpYWxpemF0aW9uCgkqIEBhY2Nlc3MgICBwdWJsaWMKCSovCiAgCWZ1bmN0aW9uIHNvYXB2YWwoJG5hbWU9J3NvYXB2YWwnLCR0eXBlPWZhbHNlLCR2YWx1ZT0tMSwkZWxlbWVudF9ucz1mYWxzZSwkdHlwZV9ucz1mYWxzZSwkYXR0cmlidXRlcz1mYWxzZSkgewoJCXBhcmVudDo6bnVzb2FwX2Jhc2UoKTsKCQkkdGhpcy0+bmFtZSA9ICRuYW1lOwoJCSR0aGlzLT50eXBlID0gJHR5cGU7CgkJJHRoaXMtPnZhbHVlID0gJHZhbHVlOwoJCSR0aGlzLT5lbGVtZW50X25zID0gJGVsZW1lbnRfbnM7CgkJJHRoaXMtPnR5cGVfbnMgPSAkdHlwZV9uczsKCQkkdGhpcy0+YXR0cmlidXRlcyA9ICRhdHRyaWJ1dGVzOwogICAgfQoKCS8qKgoJKiByZXR1cm4gc2VyaWFsaXplZCB2YWx1ZQoJKgoJKiBAcGFyYW0Jc3RyaW5nICR1c2UgVGhlIFdTREwgdXNlIHZhbHVlIChlbmNvZGVkfGxpdGVyYWwpCgkqIEByZXR1cm4Jc3RyaW5nIFhNTCBkYXRhCgkqIEBhY2Nlc3MgICBwdWJsaWMKCSovCglmdW5jdGlvbiBzZXJpYWxpemUoJHVzZT0nZW5jb2RlZCcpIHsKCQlyZXR1cm4gJHRoaXMtPnNlcmlhbGl6ZV92YWwoJHRoaXMtPnZhbHVlLCR0aGlzLT5uYW1lLCR0aGlzLT50eXBlLCR0aGlzLT5lbGVtZW50X25zLCR0aGlzLT50eXBlX25zLCR0aGlzLT5hdHRyaWJ1dGVzLCR1c2UpOwogICAgfQoKCS8qKgoJKiBkZWNvZGVzIGEgc29hcHZhbCBvYmplY3QgaW50byBhIFBIUCBuYXRpdmUgdHlwZQoJKgoJKiBAcmV0dXJuCW1peGVkCgkqIEBhY2Nlc3MgICBwdWJsaWMKCSovCglmdW5jdGlvbiBkZWNvZGUoKXsKCQlyZXR1cm4gJHRoaXMtPnZhbHVlOwoJfQp9CgoKCj8+PD9waHAKCgoKLyoqCiogdHJhbnNwb3J0IGNsYXNzIGZvciBzZW5kaW5nL3JlY2VpdmluZyBkYXRhIHZpYSBIVFRQIGFuZCBIVFRQUwoqIE5PVEU6IFBIUCBtdXN0IGJlIGNvbXBpbGVkIHdpdGggdGhlIENVUkwgZXh0ZW5zaW9uIGZvciBIVFRQUyBzdXBwb3J0CioKKiBAYXV0aG9yICAgRGlldHJpY2ggQXlhbGEgPGRpZXRyaWNoQGdhbng0LmNvbT4KKiBAdmVyc2lvbiAgJElkOiBudXNvYXAucGhwLHYgMS45NCAyMDA1LzA4LzA0IDAxOjI3OjQyIHNuaWNob2wgRXhwICQKKiBAYWNjZXNzIHB1YmxpYwoqLwpjbGFzcyBzb2FwX3RyYW5zcG9ydF9odHRwIGV4dGVuZHMgbnVzb2FwX2Jhc2UgewoKCXZhciAkdXJsID0gJyc7Cgl2YXIgJHVyaSA9ICcnOwoJdmFyICRkaWdlc3RfdXJpID0gJyc7Cgl2YXIgJHNjaGVtZSA9ICcnOwoJdmFyICRob3N0ID0gJyc7Cgl2YXIgJHBvcnQgPSAnJzsKCXZhciAkcGF0aCA9ICcnOwoJdmFyICRyZXF1ZXN0X21ldGhvZCA9ICdQT1NUJzsKCXZhciAkcHJvdG9jb2xfdmVyc2lvbiA9ICcxLjAnOwoJdmFyICRlbmNvZGluZyA9ICcnOwoJdmFyICRvdXRnb2luZ19oZWFkZXJzID0gYXJyYXkoKTsKCXZhciAkaW5jb21pbmdfaGVhZGVycyA9IGFycmF5KCk7Cgl2YXIgJGluY29taW5nX2Nvb2tpZXMgPSBhcnJheSgpOwoJdmFyICRvdXRnb2luZ19wYXlsb2FkID0gJyc7Cgl2YXIgJGluY29taW5nX3BheWxvYWQgPSAnJzsKCXZhciAkdXNlU09BUEFjdGlvbiA9IHRydWU7Cgl2YXIgJHBlcnNpc3RlbnRDb25uZWN0aW9uID0gZmFsc2U7Cgl2YXIgJGNoID0gZmFsc2U7CS8vIGNVUkwgaGFuZGxlCgl2YXIgJHVzZXJuYW1lID0gJyc7Cgl2YXIgJHBhc3N3b3JkID0gJyc7Cgl2YXIgJGF1dGh0eXBlID0gJyc7Cgl2YXIgJGRpZ2VzdFJlcXVlc3QgPSBhcnJheSgpOwoJdmFyICRjZXJ0UmVxdWVzdCA9IGFycmF5KCk7CS8vIGtleXMgbXVzdCBiZSBjYWluZm9maWxlIChvcHRpb25hbCksIHNzbGNlcnRmaWxlLCBzc2xrZXlmaWxlLCBwYXNzcGhyYXNlLCB2ZXJpZnlwZWVyIChvcHRpb25hbCksIHZlcmlmeWhvc3QgKG9wdGlvbmFsKQoJCQkJCQkJCS8vIGNhaW5mb2ZpbGU6IGNlcnRpZmljYXRlIGF1dGhvcml0eSBmaWxlLCBlLmcuICckcGF0aFRvUGVtRmlsZXMvcm9vdGNhLnBlbScKCQkJCQkJCQkvLyBzc2xjZXJ0ZmlsZTogU1NMIGNlcnRpZmljYXRlIGZpbGUsIGUuZy4gJyRwYXRoVG9QZW1GaWxlcy9teWNlcnQucGVtJwoJCQkJCQkJCS8vIHNzbGtleWZpbGU6IFNTTCBrZXkgZmlsZSwgZS5nLiAnJHBhdGhUb1BlbUZpbGVzL215a2V5LnBlbScKCQkJCQkJCQkvLyBwYXNzcGhyYXNlOiBTU0wga2V5IHBhc3N3b3JkL3Bhc3NwaHJhc2UKCQkJCQkJCQkvLyB2ZXJpZnlwZWVyOiBkZWZhdWx0IGlzIDEKCQkJCQkJCQkvLyB2ZXJpZnlob3N0OiBkZWZhdWx0IGlzIDEKCgkvKioKCSogY29uc3RydWN0b3IKCSovCglmdW5jdGlvbiBzb2FwX3RyYW5zcG9ydF9odHRwKCR1cmwpewoJCXBhcmVudDo6bnVzb2FwX2Jhc2UoKTsKCQkkdGhpcy0+c2V0VVJMKCR1cmwpOwoJCWVyZWcoJ1wkUmV2aXNpbycgLiAnbjogKFteIF0rKScsICR0aGlzLT5yZXZpc2lvbiwgJHJldik7CgkJJHRoaXMtPm91dGdvaW5nX2hlYWRlcnNbJ1VzZXItQWdlbnQnXSA9ICR0aGlzLT50aXRsZS4nLycuJHRoaXMtPnZlcnNpb24uJyAoJy4kcmV2WzFdLicpJzsKCQkkdGhpcy0+ZGVidWcoJ3NldCBVc2VyLUFnZW50OiAnIC4gJHRoaXMtPm91dGdvaW5nX2hlYWRlcnNbJ1VzZXItQWdlbnQnXSk7Cgl9CgoJZnVuY3Rpb24gc2V0VVJMKCR1cmwpIHsKCQkkdGhpcy0+dXJsID0gJHVybDsKCgkJJHUgPSBwYXJzZV91cmwoJHVybCk7CgkJZm9yZWFjaCgkdSBhcyAkayA9PiAkdil7CgkJCSR0aGlzLT5kZWJ1ZygiJGsgPSAkdiIpOwoJCQkkdGhpcy0+JGsgPSAkdjsKCQl9CgkJCgkJLy8gYWRkIGFueSBHRVQgcGFyYW1zIHRvIHBhdGgKCQlpZihpc3NldCgkdVsncXVlcnknXSkgJiYgJHVbJ3F1ZXJ5J10gIT0gJycpewogICAgICAgICAgICAkdGhpcy0+cGF0aCAuPSAnPycgLiAkdVsncXVlcnknXTsKCQl9CgkJCgkJLy8gc2V0IGRlZmF1bHQgcG9ydAoJCWlmKCFpc3NldCgkdVsncG9ydCddKSl7CgkJCWlmKCR1WydzY2hlbWUnXSA9PSAnaHR0cHMnKXsKCQkJCSR0aGlzLT5wb3J0ID0gNDQzOwoJCQl9IGVsc2UgewoJCQkJJHRoaXMtPnBvcnQgPSA4MDsKCQkJfQoJCX0KCQkKCQkkdGhpcy0+dXJpID0gJHRoaXMtPnBhdGg7CgkJJHRoaXMtPmRpZ2VzdF91cmkgPSAkdGhpcy0+dXJpOwoJCQoJCS8vIGJ1aWxkIGhlYWRlcnMKCQlpZiAoIWlzc2V0KCR1Wydwb3J0J10pKSB7CgkJCSR0aGlzLT5vdXRnb2luZ19oZWFkZXJzWydIb3N0J10gPSAkdGhpcy0+aG9zdDsKCQl9IGVsc2UgewoJCQkkdGhpcy0+b3V0Z29pbmdfaGVhZGVyc1snSG9zdCddID0gJHRoaXMtPmhvc3QuJzonLiR0aGlzLT5wb3J0OwoJCX0KCQkkdGhpcy0+ZGVidWcoJ3NldCBIb3N0OiAnIC4gJHRoaXMtPm91dGdvaW5nX2hlYWRlcnNbJ0hvc3QnXSk7CgoJCWlmIChpc3NldCgkdVsndXNlciddKSAmJiAkdVsndXNlciddICE9ICcnKSB7CgkJCSR0aGlzLT5zZXRDcmVkZW50aWFscyh1cmxkZWNvZGUoJHVbJ3VzZXInXSksIGlzc2V0KCR1WydwYXNzJ10pID8gdXJsZGVjb2RlKCR1WydwYXNzJ10pIDogJycpOwoJCX0KCX0KCQoJZnVuY3Rpb24gY29ubmVjdCgkY29ubmVjdGlvbl90aW1lb3V0PTAsJHJlc3BvbnNlX3RpbWVvdXQ9MzApewoJICAJLy8gRm9yIFBIUCA0LjMgd2l0aCBPcGVuU1NMLCBjaGFuZ2UgaHR0cHMgc2NoZW1lIHRvIHNzbCwgdGhlbiB0cmVhdCBsaWtlCgkgIAkvLyAicmVndWxhciIgc29ja2V0LgoJICAJLy8gVE9ETzogZGlzYWJsZWQgZm9yIG5vdyBiZWNhdXNlIE9wZW5TU0wgbXVzdCBiZSAqY29tcGlsZWQqIGluIChub3QganVzdAoJICAJLy8gICAgICAgbG9hZGVkKSwgYW5kIHVudGlsIFBIUDUgc3RyZWFtX2dldF93cmFwcGVycyBpcyBub3QgYXZhaWxhYmxlLgovLwkgIAlpZiAoJHRoaXMtPnNjaGVtZSA9PSAnaHR0cHMnKSB7Ci8vCQkgIAlpZiAodmVyc2lvbl9jb21wYXJlKHBocHZlcnNpb24oKSwgJzQuMy4wJykgPj0gMCkgewovLwkJICAJCWlmIChleHRlbnNpb25fbG9hZGVkKCdvcGVuc3NsJykpIHsKLy8JCSAgCQkJJHRoaXMtPnNjaGVtZSA9ICdzc2wnOwovLwkJICAJCQkkdGhpcy0+ZGVidWcoJ1VzaW5nIFNTTCBvdmVyIE9wZW5TU0wnKTsKLy8JCSAgCQl9Ci8vCQkgIAl9Ci8vCQl9CgkJJHRoaXMtPmRlYnVnKCJjb25uZWN0IGNvbm5lY3Rpb25fdGltZW91dCAkY29ubmVjdGlvbl90aW1lb3V0LCByZXNwb25zZV90aW1lb3V0ICRyZXNwb25zZV90aW1lb3V0LCBzY2hlbWUgJHRoaXMtPnNjaGVtZSwgaG9zdCAkdGhpcy0+aG9zdCwgcG9ydCAkdGhpcy0+cG9ydCIpOwoJICBpZiAoJHRoaXMtPnNjaGVtZSA9PSAnaHR0cCcgfHwgJHRoaXMtPnNjaGVtZSA9PSAnc3NsJykgewoJCS8vIHVzZSBwZXJzaXN0ZW50IGNvbm5lY3Rpb24KCQlpZigkdGhpcy0+cGVyc2lzdGVudENvbm5lY3Rpb24gJiYgaXNzZXQoJHRoaXMtPmZwKSAmJiBpc19yZXNvdXJjZSgkdGhpcy0+ZnApKXsKCQkJaWYgKCFmZW9mKCR0aGlzLT5mcCkpIHsKCQkJCSR0aGlzLT5kZWJ1ZygnUmUtdXNlIHBlcnNpc3RlbnQgY29ubmVjdGlvbicpOwoJCQkJcmV0dXJuIHRydWU7CgkJCX0KCQkJZmNsb3NlKCR0aGlzLT5mcCk7CgkJCSR0aGlzLT5kZWJ1ZygnQ2xvc2VkIHBlcnNpc3RlbnQgY29ubmVjdGlvbiBhdCBFT0YnKTsKCQl9CgoJCS8vIG11bmdlIGhvc3QgaWYgdXNpbmcgT3BlblNTTAoJCWlmICgkdGhpcy0+c2NoZW1lID09ICdzc2wnKSB7CgkJCSRob3N0ID0gJ3NzbDovLycgLiAkdGhpcy0+aG9zdDsKCQl9IGVsc2UgewoJCQkkaG9zdCA9ICR0aGlzLT5ob3N0OwoJCX0KCQkkdGhpcy0+ZGVidWcoJ2NhbGxpbmcgZnNvY2tvcGVuIHdpdGggaG9zdCAnIC4gJGhvc3QgLiAnIGNvbm5lY3Rpb25fdGltZW91dCAnIC4gJGNvbm5lY3Rpb25fdGltZW91dCk7CgoJCS8vIG9wZW4gc29ja2V0CgkJaWYoJGNvbm5lY3Rpb25fdGltZW91dCA+IDApewoJCQkkdGhpcy0+ZnAgPSBAZnNvY2tvcGVuKCAkaG9zdCwgJHRoaXMtPnBvcnQsICR0aGlzLT5lcnJubywgJHRoaXMtPmVycm9yX3N0ciwgJGNvbm5lY3Rpb25fdGltZW91dCk7CgkJfSBlbHNlIHsKCQkJJHRoaXMtPmZwID0gQGZzb2Nrb3BlbiggJGhvc3QsICR0aGlzLT5wb3J0LCAkdGhpcy0+ZXJybm8sICR0aGlzLT5lcnJvcl9zdHIpOwoJCX0KCQkKCQkvLyB0ZXN0IHBvaW50ZXIKCQlpZighJHRoaXMtPmZwKSB7CgkJCSRtc2cgPSAnQ291bGRuXCd0IG9wZW4gc29ja2V0IGNvbm5lY3Rpb24gdG8gc2VydmVyICcgLiAkdGhpcy0+dXJsOwoJCQlpZiAoJHRoaXMtPmVycm5vKSB7CgkJCQkkbXNnIC49ICcsIEVycm9yICgnLiR0aGlzLT5lcnJuby4nKTogJy4kdGhpcy0+ZXJyb3Jfc3RyOwoJCQl9IGVsc2UgewoJCQkJJG1zZyAuPSAnIHByaW9yIHRvIGNvbm5lY3QoKS4gIFRoaXMgaXMgb2Z0ZW4gYSBwcm9ibGVtIGxvb2tpbmcgdXAgdGhlIGhvc3QgbmFtZS4nOwoJCQl9CgkJCSR0aGlzLT5kZWJ1ZygkbXNnKTsKCQkJJHRoaXMtPnNldEVycm9yKCRtc2cpOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCQoJCS8vIHNldCByZXNwb25zZSB0aW1lb3V0CgkJJHRoaXMtPmRlYnVnKCdzZXQgcmVzcG9uc2UgdGltZW91dCB0byAnIC4gJHJlc3BvbnNlX3RpbWVvdXQpOwoJCXNvY2tldF9zZXRfdGltZW91dCggJHRoaXMtPmZwLCAkcmVzcG9uc2VfdGltZW91dCk7CgoJCSR0aGlzLT5kZWJ1Zygnc29ja2V0IGNvbm5lY3RlZCcpOwoJCXJldHVybiB0cnVlOwoJICB9IGVsc2UgaWYgKCR0aGlzLT5zY2hlbWUgPT0gJ2h0dHBzJykgewoJCWlmICghZXh0ZW5zaW9uX2xvYWRlZCgnY3VybCcpKSB7CgkJCSR0aGlzLT5zZXRFcnJvcignQ1VSTCBFeHRlbnNpb24sIG9yIE9wZW5TU0wgZXh0ZW5zaW9uIHcvIFBIUCB2ZXJzaW9uID49IDQuMyBpcyByZXF1aXJlZCBmb3IgSFRUUFMnKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQkkdGhpcy0+ZGVidWcoJ2Nvbm5lY3QgdXNpbmcgaHR0cHMnKTsKCQkvLyBpbml0IENVUkwKCQkkdGhpcy0+Y2ggPSBjdXJsX2luaXQoKTsKCQkvLyBzZXQgdXJsCgkJJGhvc3RVUkwgPSAoJHRoaXMtPnBvcnQgIT0gJycpID8gImh0dHBzOi8vJHRoaXMtPmhvc3Q6JHRoaXMtPnBvcnQiIDogImh0dHBzOi8vJHRoaXMtPmhvc3QiOwoJCS8vIGFkZCBwYXRoCgkJJGhvc3RVUkwgLj0gJHRoaXMtPnBhdGg7CgkJY3VybF9zZXRvcHQoJHRoaXMtPmNoLCBDVVJMT1BUX1VSTCwgJGhvc3RVUkwpOwoJCS8vIGZvbGxvdyBsb2NhdGlvbiBoZWFkZXJzIChyZS1kaXJlY3RzKQoJCWN1cmxfc2V0b3B0KCR0aGlzLT5jaCwgQ1VSTE9QVF9GT0xMT1dMT0NBVElPTiwgMSk7CgkJLy8gYXNrIGZvciBoZWFkZXJzIGluIHRoZSByZXNwb25zZSBvdXRwdXQKCQljdXJsX3NldG9wdCgkdGhpcy0+Y2gsIENVUkxPUFRfSEVBREVSLCAxKTsKCQkvLyBhc2sgZm9yIHRoZSByZXNwb25zZSBvdXRwdXQgYXMgdGhlIHJldHVybiB2YWx1ZQoJCWN1cmxfc2V0b3B0KCR0aGlzLT5jaCwgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwgMSk7CgkJLy8gZW5jb2RlCgkJLy8gV2UgbWFuYWdlIHRoaXMgb3Vyc2VsdmVzIHRocm91Z2ggaGVhZGVycyBhbmQgZW5jb2RpbmcKLy8JCWlmKGZ1bmN0aW9uX2V4aXN0cygnZ3p1bmNvbXByZXNzJykpewovLwkJCWN1cmxfc2V0b3B0KCR0aGlzLT5jaCwgQ1VSTE9QVF9FTkNPRElORywgJ2RlZmxhdGUnKTsKLy8JCX0KCQkvLyBwZXJzaXN0ZW50IGNvbm5lY3Rpb24KCQlpZiAoJHRoaXMtPnBlcnNpc3RlbnRDb25uZWN0aW9uKSB7CgkJCS8vIFRoZSB3YXkgd2Ugc2VuZCBkYXRhLCB3ZSBjYW5ub3QgdXNlIHBlcnNpc3RlbnQgY29ubmVjdGlvbnMsIHNpbmNlCgkJCS8vIHRoZXJlIHdpbGwgYmUgc29tZSAianVuayIgYXQgdGhlIGVuZCBvZiBvdXIgcmVxdWVzdC4KCQkJLy9jdXJsX3NldG9wdCgkdGhpcy0+Y2gsIENVUkxfSFRUUF9WRVJTSU9OXzFfMSwgdHJ1ZSk7CgkJCSR0aGlzLT5wZXJzaXN0ZW50Q29ubmVjdGlvbiA9IGZhbHNlOwoJCQkkdGhpcy0+b3V0Z29pbmdfaGVhZGVyc1snQ29ubmVjdGlvbiddID0gJ2Nsb3NlJzsKCQkJJHRoaXMtPmRlYnVnKCdzZXQgQ29ubmVjdGlvbjogJyAuICR0aGlzLT5vdXRnb2luZ19oZWFkZXJzWydDb25uZWN0aW9uJ10pOwoJCX0KCQkvLyBzZXQgdGltZW91dAoJCWlmICgkY29ubmVjdGlvbl90aW1lb3V0ICE9IDApIHsKCQkJY3VybF9zZXRvcHQoJHRoaXMtPmNoLCBDVVJMT1BUX1RJTUVPVVQsICRjb25uZWN0aW9uX3RpbWVvdXQpOwoJCX0KCQkvLyBUT0RPOiBjVVJMIGhhcyBhZGRlZCBhIGNvbm5lY3Rpb24gdGltZW91dCBzZXBhcmF0ZSBmcm9tIHRoZSByZXNwb25zZSB0aW1lb3V0CgkJLy9pZiAoJGNvbm5lY3Rpb25fdGltZW91dCAhPSAwKSB7CgkJLy8JY3VybF9zZXRvcHQoJHRoaXMtPmNoLCBDVVJMT1BUX0NPTk5FQ1RJT05USU1FT1VULCAkY29ubmVjdGlvbl90aW1lb3V0KTsKCQkvL30KCQkvL2lmICgkcmVzcG9uc2VfdGltZW91dCAhPSAwKSB7CgkJLy8JY3VybF9zZXRvcHQoJHRoaXMtPmNoLCBDVVJMT1BUX1RJTUVPVVQsICRyZXNwb25zZV90aW1lb3V0KTsKCQkvL30KCgkJLy8gcmVjZW50IHZlcnNpb25zIG9mIGNVUkwgdHVybiBvbiBwZWVyL2hvc3QgY2hlY2tpbmcgYnkgZGVmYXVsdCwKCQkvLyB3aGlsZSBQSFAgYmluYXJpZXMgYXJlIG5vdCBjb21waWxlZCB3aXRoIGEgZGVmYXVsdCBsb2NhdGlvbiBmb3IgdGhlCgkJLy8gQ0EgY2VydCBidW5kbGUsIHNvIGRpc2FibGUgcGVlci9ob3N0IGNoZWNraW5nLgovL2N1cmxfc2V0b3B0KCR0aGlzLT5jaCwgQ1VSTE9QVF9DQUlORk8sICdmOlxwaHAtNC4zLjItd2luMzJcZXh0ZW5zaW9uc1xjdXJsLWNhLWJ1bmRsZS5jcnQnKTsJCQoJCWN1cmxfc2V0b3B0KCR0aGlzLT5jaCwgQ1VSTE9QVF9TU0xfVkVSSUZZUEVFUiwgMCk7CgkJY3VybF9zZXRvcHQoJHRoaXMtPmNoLCBDVVJMT1BUX1NTTF9WRVJJRllIT1NULCAwKTsKCgkJLy8gc3VwcG9ydCBjbGllbnQgY2VydGlmaWNhdGVzICh0aGFua3MgVG9iaWFzIEJvZXMsIERvdWcgQW5hcmlubywgRXJ5YW4gQXJpb2Jvd28pCgkJaWYgKCR0aGlzLT5hdXRodHlwZSA9PSAnY2VydGlmaWNhdGUnKSB7CgkJCWlmIChpc3NldCgkdGhpcy0+Y2VydFJlcXVlc3RbJ2NhaW5mb2ZpbGUnXSkpIHsKCQkJCWN1cmxfc2V0b3B0KCR0aGlzLT5jaCwgQ1VSTE9QVF9DQUlORk8sICR0aGlzLT5jZXJ0UmVxdWVzdFsnY2FpbmZvZmlsZSddKTsKCQkJfQoJCQlpZiAoaXNzZXQoJHRoaXMtPmNlcnRSZXF1ZXN0Wyd2ZXJpZnlwZWVyJ10pKSB7CgkJCQljdXJsX3NldG9wdCgkdGhpcy0+Y2gsIENVUkxPUFRfU1NMX1ZFUklGWVBFRVIsICR0aGlzLT5jZXJ0UmVxdWVzdFsndmVyaWZ5cGVlciddKTsKCQkJfSBlbHNlIHsKCQkJCWN1cmxfc2V0b3B0KCR0aGlzLT5jaCwgQ1VSTE9QVF9TU0xfVkVSSUZZUEVFUiwgMSk7CgkJCX0KCQkJaWYgKGlzc2V0KCR0aGlzLT5jZXJ0UmVxdWVzdFsndmVyaWZ5aG9zdCddKSkgewoJCQkJY3VybF9zZXRvcHQoJHRoaXMtPmNoLCBDVVJMT1BUX1NTTF9WRVJJRllIT1NULCAkdGhpcy0+Y2VydFJlcXVlc3RbJ3ZlcmlmeWhvc3QnXSk7CgkJCX0gZWxzZSB7CgkJCQljdXJsX3NldG9wdCgkdGhpcy0+Y2gsIENVUkxPUFRfU1NMX1ZFUklGWUhPU1QsIDEpOwoJCQl9CgkJCWlmIChpc3NldCgkdGhpcy0+Y2VydFJlcXVlc3RbJ3NzbGNlcnRmaWxlJ10pKSB7CgkJCQljdXJsX3NldG9wdCgkdGhpcy0+Y2gsIENVUkxPUFRfU1NMQ0VSVCwgJHRoaXMtPmNlcnRSZXF1ZXN0Wydzc2xjZXJ0ZmlsZSddKTsKCQkJfQoJCQlpZiAoaXNzZXQoJHRoaXMtPmNlcnRSZXF1ZXN0Wydzc2xrZXlmaWxlJ10pKSB7CgkJCQljdXJsX3NldG9wdCgkdGhpcy0+Y2gsIENVUkxPUFRfU1NMS0VZLCAkdGhpcy0+Y2VydFJlcXVlc3RbJ3NzbGtleWZpbGUnXSk7CgkJCX0KCQkJaWYgKGlzc2V0KCR0aGlzLT5jZXJ0UmVxdWVzdFsncGFzc3BocmFzZSddKSkgewoJCQkJY3VybF9zZXRvcHQoJHRoaXMtPmNoLCBDVVJMT1BUX1NTTEtFWVBBU1NXRCAsICR0aGlzLT5jZXJ0UmVxdWVzdFsncGFzc3BocmFzZSddKTsKCQkJfQoJCX0KCQkkdGhpcy0+ZGVidWcoJ2NVUkwgY29ubmVjdGlvbiBzZXQgdXAnKTsKCQlyZXR1cm4gdHJ1ZTsKCSAgfSBlbHNlIHsKCQkkdGhpcy0+c2V0RXJyb3IoJ1Vua25vd24gc2NoZW1lICcgLiAkdGhpcy0+c2NoZW1lKTsKCQkkdGhpcy0+ZGVidWcoJ1Vua25vd24gc2NoZW1lICcgLiAkdGhpcy0+c2NoZW1lKTsKCQlyZXR1cm4gZmFsc2U7CgkgIH0KCX0KCQoJLyoqCgkqIHNlbmQgdGhlIFNPQVAgbWVzc2FnZSB2aWEgSFRUUAoJKgoJKiBAcGFyYW0gICAgc3RyaW5nICRkYXRhIG1lc3NhZ2UgZGF0YQoJKiBAcGFyYW0gICAgaW50ZWdlciAkdGltZW91dCBzZXQgY29ubmVjdGlvbiB0aW1lb3V0IGluIHNlY29uZHMKCSogQHBhcmFtCWludGVnZXIgJHJlc3BvbnNlX3RpbWVvdXQgc2V0IHJlc3BvbnNlIHRpbWVvdXQgaW4gc2Vjb25kcwoJKiBAcGFyYW0JYXJyYXkgJGNvb2tpZXMgY29va2llcyB0byBzZW5kCgkqIEByZXR1cm4Jc3RyaW5nIGRhdGEKCSogQGFjY2VzcyAgIHB1YmxpYwoJKi8KCWZ1bmN0aW9uIHNlbmQoJGRhdGEsICR0aW1lb3V0PTAsICRyZXNwb25zZV90aW1lb3V0PTMwLCAkY29va2llcz1OVUxMKSB7CgkJCgkJJHRoaXMtPmRlYnVnKCdlbnRlcmVkIHNlbmQoKSB3aXRoIGRhdGEgb2YgbGVuZ3RoOiAnLnN0cmxlbigkZGF0YSkpOwoKCQkkdGhpcy0+dHJ5YWdhaW4gPSB0cnVlOwoJCSR0cmllcyA9IDA7CgkJd2hpbGUgKCR0aGlzLT50cnlhZ2FpbikgewoJCQkkdGhpcy0+dHJ5YWdhaW4gPSBmYWxzZTsKCQkJaWYgKCR0cmllcysrIDwgMikgewoJCQkJLy8gbWFrZSBjb25ubmVjdGlvbgoJCQkJaWYgKCEkdGhpcy0+Y29ubmVjdCgkdGltZW91dCwgJHJlc3BvbnNlX3RpbWVvdXQpKXsKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9CgkJCQkKCQkJCS8vIHNlbmQgcmVxdWVzdAoJCQkJaWYgKCEkdGhpcy0+c2VuZFJlcXVlc3QoJGRhdGEsICRjb29raWVzKSl7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQkJCgkJCQkvLyBnZXQgcmVzcG9uc2UKCQkJCSRyZXNwZGF0YSA9ICR0aGlzLT5nZXRSZXNwb25zZSgpOwoJCQl9IGVsc2UgewoJCQkJJHRoaXMtPnNldEVycm9yKCdUb28gbWFueSB0cmllcyB0byBnZXQgYW4gT0sgcmVzcG9uc2UnKTsKCQkJfQoJCX0JCQoJCSR0aGlzLT5kZWJ1ZygnZW5kIG9mIHNlbmQoKScpOwoJCXJldHVybiAkcmVzcGRhdGE7Cgl9CgoKCS8qKgoJKiBzZW5kIHRoZSBTT0FQIG1lc3NhZ2UgdmlhIEhUVFBTIDEuMCB1c2luZyBDVVJMCgkqCgkqIEBwYXJhbSAgICBzdHJpbmcgJG1zZyBtZXNzYWdlIGRhdGEKCSogQHBhcmFtICAgIGludGVnZXIgJHRpbWVvdXQgc2V0IGNvbm5lY3Rpb24gdGltZW91dCBpbiBzZWNvbmRzCgkqIEBwYXJhbQlpbnRlZ2VyICRyZXNwb25zZV90aW1lb3V0IHNldCByZXNwb25zZSB0aW1lb3V0IGluIHNlY29uZHMKCSogQHBhcmFtCWFycmF5ICRjb29raWVzIGNvb2tpZXMgdG8gc2VuZAoJKiBAcmV0dXJuCXN0cmluZyBkYXRhCgkqIEBhY2Nlc3MgICBwdWJsaWMKCSovCglmdW5jdGlvbiBzZW5kSFRUUFMoJGRhdGEsICR0aW1lb3V0PTAsICRyZXNwb25zZV90aW1lb3V0PTMwLCAkY29va2llcykgewoJCXJldHVybiAkdGhpcy0+c2VuZCgkZGF0YSwgJHRpbWVvdXQsICRyZXNwb25zZV90aW1lb3V0LCAkY29va2llcyk7Cgl9CgkKCS8qKgoJKiBpZiBhdXRoZW50aWNhdGluZywgc2V0IHVzZXIgY3JlZGVudGlhbHMgaGVyZQoJKgoJKiBAcGFyYW0gICAgc3RyaW5nICR1c2VybmFtZQoJKiBAcGFyYW0gICAgc3RyaW5nICRwYXNzd29yZAoJKiBAcGFyYW0Jc3RyaW5nICRhdXRodHlwZSAoYmFzaWMsIGRpZ2VzdCwgY2VydGlmaWNhdGUpCgkqIEBwYXJhbQlhcnJheSAkZGlnZXN0UmVxdWVzdCAoa2V5cyBtdXN0IGJlIG5vbmNlLCBuYywgcmVhbG0sIHFvcCkKCSogQHBhcmFtCWFycmF5ICRjZXJ0UmVxdWVzdCAoa2V5cyBtdXN0IGJlIGNhaW5mb2ZpbGUgKG9wdGlvbmFsKSwgc3NsY2VydGZpbGUsIHNzbGtleWZpbGUsIHBhc3NwaHJhc2UsIHZlcmlmeXBlZXIgKG9wdGlvbmFsKSwgdmVyaWZ5aG9zdCAob3B0aW9uYWwpOiBzZWUgY29ycmVzcG9uZGluZyBvcHRpb25zIGluIGNVUkwgZG9jcykKCSogQGFjY2VzcyAgIHB1YmxpYwoJKi8KCWZ1bmN0aW9uIHNldENyZWRlbnRpYWxzKCR1c2VybmFtZSwgJHBhc3N3b3JkLCAkYXV0aHR5cGUgPSAnYmFzaWMnLCAkZGlnZXN0UmVxdWVzdCA9IGFycmF5KCksICRjZXJ0UmVxdWVzdCA9IGFycmF5KCkpIHsKCQkkdGhpcy0+ZGVidWcoIlNldCBjcmVkZW50aWFscyBmb3IgYXV0aHR5cGUgJGF1dGh0eXBlIik7CgkJLy8gY2YuIFJGQyAyNjE3CgkJaWYgKCRhdXRodHlwZSA9PSAnYmFzaWMnKSB7CgkJCSR0aGlzLT5vdXRnb2luZ19oZWFkZXJzWydBdXRob3JpemF0aW9uJ10gPSAnQmFzaWMgJy5iYXNlNjRfZW5jb2RlKHN0cl9yZXBsYWNlKCc6JywnJywkdXNlcm5hbWUpLic6Jy4kcGFzc3dvcmQpOwoJCX0gZWxzZWlmICgkYXV0aHR5cGUgPT0gJ2RpZ2VzdCcpIHsKCQkJaWYgKGlzc2V0KCRkaWdlc3RSZXF1ZXN0Wydub25jZSddKSkgewoJCQkJJGRpZ2VzdFJlcXVlc3RbJ25jJ10gPSBpc3NldCgkZGlnZXN0UmVxdWVzdFsnbmMnXSkgPyAkZGlnZXN0UmVxdWVzdFsnbmMnXSsrIDogMTsKCQkJCQoJCQkJLy8gY2FsY3VsYXRlIHRoZSBEaWdlc3QgaGFzaGVzIChjYWxjdWxhdGUgY29kZSBiYXNlZCBvbiBkaWdlc3QgaW1wbGVtZW50YXRpb24gZm91bmQgYXQ6IGh0dHA6Ly93d3cucmFzc29jLmNvbS9ncmVnci93ZWJsb2cvc3Rvcmllcy8yMDAyLzA3LzA5L3dlYlNlcnZpY2VzU2VjdXJpdHlIdHRwRGlnZXN0QXV0aGVudGljYXRpb25XaXRob3V0QWN0aXZlRGlyZWN0b3J5Lmh0bWwpCgkKCQkJCS8vIEExID0gdW5xKHVzZXJuYW1lLXZhbHVlKSAiOiIgdW5xKHJlYWxtLXZhbHVlKSAiOiIgcGFzc3dkCgkJCQkkQTEgPSAkdXNlcm5hbWUuICc6JyAuIChpc3NldCgkZGlnZXN0UmVxdWVzdFsncmVhbG0nXSkgPyAkZGlnZXN0UmVxdWVzdFsncmVhbG0nXSA6ICcnKSAuICc6JyAuICRwYXNzd29yZDsKCQoJCQkJLy8gSChBMSkgPSBNRDUoQTEpCgkJCQkkSEExID0gbWQ1KCRBMSk7CgkKCQkJCS8vIEEyID0gTWV0aG9kICI6IiBkaWdlc3QtdXJpLXZhbHVlCgkJCQkkQTIgPSAnUE9TVDonIC4gJHRoaXMtPmRpZ2VzdF91cmk7CgkKCQkJCS8vIEgoQTIpCgkJCQkkSEEyID0gIG1kNSgkQTIpOwoJCgkJCQkvLyBLRChzZWNyZXQsIGRhdGEpID0gSChjb25jYXQoc2VjcmV0LCAiOiIsIGRhdGEpKQoJCQkJLy8gaWYgcW9wID09IGF1dGg6CgkJCQkvLyByZXF1ZXN0LWRpZ2VzdCAgPSA8Ij4gPCBLRCAoIEgoQTEpLCAgICAgdW5xKG5vbmNlLXZhbHVlKQoJCQkJLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOiIgbmMtdmFsdWUKCQkJCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjoiIHVucShjbm9uY2UtdmFsdWUpCgkJCQkvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI6IiB1bnEocW9wLXZhbHVlKQoJCQkJLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOiIgSChBMikKCQkJCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgPCI+CgkJCQkvLyBpZiBxb3AgaXMgbWlzc2luZywKCQkJCS8vIHJlcXVlc3QtZGlnZXN0ICA9IDwiPiA8IEtEICggSChBMSksIHVucShub25jZS12YWx1ZSkgIjoiIEgoQTIpICkgPiA8Ij4KCQoJCQkJJHVuaGFzaGVkRGlnZXN0ID0gJyc7CgkJCQkkbm9uY2UgPSBpc3NldCgkZGlnZXN0UmVxdWVzdFsnbm9uY2UnXSkgPyAkZGlnZXN0UmVxdWVzdFsnbm9uY2UnXSA6ICcnOwoJCQkJJGNub25jZSA9ICRub25jZTsKCQkJCWlmICgkZGlnZXN0UmVxdWVzdFsncW9wJ10gIT0gJycpIHsKCQkJCQkkdW5oYXNoZWREaWdlc3QgPSAkSEExIC4gJzonIC4gJG5vbmNlIC4gJzonIC4gc3ByaW50ZigiJTA4ZCIsICRkaWdlc3RSZXF1ZXN0WyduYyddKSAuICc6JyAuICRjbm9uY2UgLiAnOicgLiAkZGlnZXN0UmVxdWVzdFsncW9wJ10gLiAnOicgLiAkSEEyOwoJCQkJfSBlbHNlIHsKCQkJCQkkdW5oYXNoZWREaWdlc3QgPSAkSEExIC4gJzonIC4gJG5vbmNlIC4gJzonIC4gJEhBMjsKCQkJCX0KCQoJCQkJJGhhc2hlZERpZ2VzdCA9IG1kNSgkdW5oYXNoZWREaWdlc3QpOwoJCgkJCQkkdGhpcy0+b3V0Z29pbmdfaGVhZGVyc1snQXV0aG9yaXphdGlvbiddID0gJ0RpZ2VzdCB1c2VybmFtZT0iJyAuICR1c2VybmFtZSAuICciLCByZWFsbT0iJyAuICRkaWdlc3RSZXF1ZXN0WydyZWFsbSddIC4gJyIsIG5vbmNlPSInIC4gJG5vbmNlIC4gJyIsIHVyaT0iJyAuICR0aGlzLT5kaWdlc3RfdXJpIC4gJyIsIGNub25jZT0iJyAuICRjbm9uY2UgLiAnIiwgbmM9JyAuIHNwcmludGYoIiUwOHgiLCAkZGlnZXN0UmVxdWVzdFsnbmMnXSkgLiAnLCBxb3A9IicgLiAkZGlnZXN0UmVxdWVzdFsncW9wJ10gLiAnIiwgcmVzcG9uc2U9IicgLiAkaGFzaGVkRGlnZXN0IC4gJyInOwoJCQl9CgkJfSBlbHNlaWYgKCRhdXRodHlwZSA9PSAnY2VydGlmaWNhdGUnKSB7CgkJCSR0aGlzLT5jZXJ0UmVxdWVzdCA9ICRjZXJ0UmVxdWVzdDsKCQl9CgkJJHRoaXMtPnVzZXJuYW1lID0gJHVzZXJuYW1lOwoJCSR0aGlzLT5wYXNzd29yZCA9ICRwYXNzd29yZDsKCQkkdGhpcy0+YXV0aHR5cGUgPSAkYXV0aHR5cGU7CgkJJHRoaXMtPmRpZ2VzdFJlcXVlc3QgPSAkZGlnZXN0UmVxdWVzdDsKCQkKCQlpZiAoaXNzZXQoJHRoaXMtPm91dGdvaW5nX2hlYWRlcnNbJ0F1dGhvcml6YXRpb24nXSkpIHsKCQkJJHRoaXMtPmRlYnVnKCdzZXQgQXV0aG9yaXphdGlvbjogJyAuIHN1YnN0cigkdGhpcy0+b3V0Z29pbmdfaGVhZGVyc1snQXV0aG9yaXphdGlvbiddLCAwLCAxMikgLiAnLi4uJyk7CgkJfSBlbHNlIHsKCQkJJHRoaXMtPmRlYnVnKCdBdXRob3JpemF0aW9uIGhlYWRlciBub3Qgc2V0Jyk7CgkJfQoJfQoJCgkvKioKCSogc2V0IHRoZSBzb2FwYWN0aW9uIHZhbHVlCgkqCgkqIEBwYXJhbSAgICBzdHJpbmcgJHNvYXBhY3Rpb24KCSogQGFjY2VzcyAgIHB1YmxpYwoJKi8KCWZ1bmN0aW9uIHNldFNPQVBBY3Rpb24oJHNvYXBhY3Rpb24pIHsKCQkkdGhpcy0+b3V0Z29pbmdfaGVhZGVyc1snU09BUEFjdGlvbiddID0gJyInIC4gJHNvYXBhY3Rpb24gLiAnIic7CgkJJHRoaXMtPmRlYnVnKCdzZXQgU09BUEFjdGlvbjogJyAuICR0aGlzLT5vdXRnb2luZ19oZWFkZXJzWydTT0FQQWN0aW9uJ10pOwoJfQoJCgkvKioKCSogdXNlIGh0dHAgZW5jb2RpbmcKCSoKCSogQHBhcmFtICAgIHN0cmluZyAkZW5jIGVuY29kaW5nIHN0eWxlLiBzdXBwb3J0ZWQgdmFsdWVzOiBnemlwLCBkZWZsYXRlLCBvciBib3RoCgkqIEBhY2Nlc3MgICBwdWJsaWMKCSovCglmdW5jdGlvbiBzZXRFbmNvZGluZygkZW5jPSdnemlwLCBkZWZsYXRlJykgewoJCWlmIChmdW5jdGlvbl9leGlzdHMoJ2d6ZGVmbGF0ZScpKSB7CgkJCSR0aGlzLT5wcm90b2NvbF92ZXJzaW9uID0gJzEuMSc7CgkJCSR0aGlzLT5vdXRnb2luZ19oZWFkZXJzWydBY2NlcHQtRW5jb2RpbmcnXSA9ICRlbmM7CgkJCSR0aGlzLT5kZWJ1Zygnc2V0IEFjY2VwdC1FbmNvZGluZzogJyAuICR0aGlzLT5vdXRnb2luZ19oZWFkZXJzWydBY2NlcHQtRW5jb2RpbmcnXSk7CgkJCWlmICghaXNzZXQoJHRoaXMtPm91dGdvaW5nX2hlYWRlcnNbJ0Nvbm5lY3Rpb24nXSkpIHsKCQkJCSR0aGlzLT5vdXRnb2luZ19oZWFkZXJzWydDb25uZWN0aW9uJ10gPSAnY2xvc2UnOwoJCQkJJHRoaXMtPnBlcnNpc3RlbnRDb25uZWN0aW9uID0gZmFsc2U7CgkJCQkkdGhpcy0+ZGVidWcoJ3NldCBDb25uZWN0aW9uOiAnIC4gJHRoaXMtPm91dGdvaW5nX2hlYWRlcnNbJ0Nvbm5lY3Rpb24nXSk7CgkJCX0KCQkJc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApOwoJCQkvLyBkZXByZWNhdGVkCgkJCSR0aGlzLT5lbmNvZGluZyA9ICRlbmM7CgkJfQoJfQoJCgkvKioKCSogc2V0IHByb3h5IGluZm8gaGVyZQoJKgoJKiBAcGFyYW0gICAgc3RyaW5nICRwcm94eWhvc3QKCSogQHBhcmFtICAgIHN0cmluZyAkcHJveHlwb3J0CgkqIEBwYXJhbQlzdHJpbmcgJHByb3h5dXNlcm5hbWUKCSogQHBhcmFtCXN0cmluZyAkcHJveHlwYXNzd29yZAoJKiBAYWNjZXNzICAgcHVibGljCgkqLwoJZnVuY3Rpb24gc2V0UHJveHkoJHByb3h5aG9zdCwgJHByb3h5cG9ydCwgJHByb3h5dXNlcm5hbWUgPSAnJywgJHByb3h5cGFzc3dvcmQgPSAnJykgewoJCSR0aGlzLT51cmkgPSAkdGhpcy0+dXJsOwoJCSR0aGlzLT5ob3N0ID0gJHByb3h5aG9zdDsKCQkkdGhpcy0+cG9ydCA9ICRwcm94eXBvcnQ7CgkJaWYgKCRwcm94eXVzZXJuYW1lICE9ICcnICYmICRwcm94eXBhc3N3b3JkICE9ICcnKSB7CgkJCSR0aGlzLT5vdXRnb2luZ19oZWFkZXJzWydQcm94eS1BdXRob3JpemF0aW9uJ10gPSAnIEJhc2ljICcuYmFzZTY0X2VuY29kZSgkcHJveHl1c2VybmFtZS4nOicuJHByb3h5cGFzc3dvcmQpOwoJCQkkdGhpcy0+ZGVidWcoJ3NldCBQcm94eS1BdXRob3JpemF0aW9uOiAnIC4gJHRoaXMtPm91dGdvaW5nX2hlYWRlcnNbJ1Byb3h5LUF1dGhvcml6YXRpb24nXSk7CgkJfQoJfQoJCgkvKioKCSogZGVjb2RlIGEgc3RyaW5nIHRoYXQgaXMgZW5jb2RlZCB3LyAiY2h1bmtlZCcgdHJhbnNmZXIgZW5jb2RpbmcKIAkqIGFzIGRlZmluZWQgaW4gUkZDMjA2OCAxOS40LjYKCSoKCSogQHBhcmFtICAgIHN0cmluZyAkYnVmZmVyCgkqIEBwYXJhbSAgICBzdHJpbmcgJGxiCgkqIEByZXR1cm5zCXN0cmluZwoJKiBAYWNjZXNzICAgcHVibGljCgkqIEBkZXByZWNhdGVkCgkqLwoJZnVuY3Rpb24gZGVjb2RlQ2h1bmtlZCgkYnVmZmVyLCAkbGIpewoJCS8vIGxlbmd0aCA6PSAwCgkJJGxlbmd0aCA9IDA7CgkJJG5ldyA9ICcnOwoJCQoJCS8vIHJlYWQgY2h1bmstc2l6ZSwgY2h1bmstZXh0ZW5zaW9uIChpZiBhbnkpIGFuZCBDUkxGCgkJLy8gZ2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgbGluZWJyZWFrCgkJJGNodW5rZW5kID0gc3RycG9zKCRidWZmZXIsICRsYik7CgkJaWYgKCRjaHVua2VuZCA9PSBGQUxTRSkgewoJCQkkdGhpcy0+ZGVidWcoJ25vIGxpbmVicmVhayBmb3VuZCBpbiBkZWNvZGVDaHVua2VkJyk7CgkJCXJldHVybiAkbmV3OwoJCX0KCQkkdGVtcCA9IHN1YnN0cigkYnVmZmVyLDAsJGNodW5rZW5kKTsKCQkkY2h1bmtfc2l6ZSA9IGhleGRlYyggdHJpbSgkdGVtcCkgKTsKCQkkY2h1bmtzdGFydCA9ICRjaHVua2VuZCArIHN0cmxlbigkbGIpOwoJCS8vIHdoaWxlIChjaHVuay1zaXplID4gMCkgewoJCXdoaWxlICgkY2h1bmtfc2l6ZSA+IDApIHsKCQkJJHRoaXMtPmRlYnVnKCJjaHVua3N0YXJ0OiAkY2h1bmtzdGFydCBjaHVua19zaXplOiAkY2h1bmtfc2l6ZSIpOwoJCQkkY2h1bmtlbmQgPSBzdHJwb3MoICRidWZmZXIsICRsYiwgJGNodW5rc3RhcnQgKyAkY2h1bmtfc2l6ZSk7CgkJICAJCgkJCS8vIEp1c3QgaW4gY2FzZSB3ZSBnb3QgYSBicm9rZW4gY29ubmVjdGlvbgoJCSAgCWlmICgkY2h1bmtlbmQgPT0gRkFMU0UpIHsKCQkgIAkgICAgJGNodW5rID0gc3Vic3RyKCRidWZmZXIsJGNodW5rc3RhcnQpOwoJCQkJLy8gYXBwZW5kIGNodW5rLWRhdGEgdG8gZW50aXR5LWJvZHkKCQkgICAgCSRuZXcgLj0gJGNodW5rOwoJCSAgCSAgICAkbGVuZ3RoICs9IHN0cmxlbigkY2h1bmspOwoJCSAgCSAgICBicmVhazsKCQkJfQoJCQkKCQkgIAkvLyByZWFkIGNodW5rLWRhdGEgYW5kIENSTEYKCQkgIAkkY2h1bmsgPSBzdWJzdHIoJGJ1ZmZlciwkY2h1bmtzdGFydCwkY2h1bmtlbmQtJGNodW5rc3RhcnQpOwoJCSAgCS8vIGFwcGVuZCBjaHVuay1kYXRhIHRvIGVudGl0eS1ib2R5CgkJICAJJG5ldyAuPSAkY2h1bms7CgkJICAJLy8gbGVuZ3RoIDo9IGxlbmd0aCArIGNodW5rLXNpemUKCQkgIAkkbGVuZ3RoICs9IHN0cmxlbigkY2h1bmspOwoJCSAgCS8vIHJlYWQgY2h1bmstc2l6ZSBhbmQgQ1JMRgoJCSAgCSRjaHVua3N0YXJ0ID0gJGNodW5rZW5kICsgc3RybGVuKCRsYik7CgkJCQoJCSAgCSRjaHVua2VuZCA9IHN0cnBvcygkYnVmZmVyLCAkbGIsICRjaHVua3N0YXJ0KSArIHN0cmxlbigkbGIpOwoJCQlpZiAoJGNodW5rZW5kID09IEZBTFNFKSB7CgkJCQlicmVhazsgLy9KdXN0IGluIGNhc2Ugd2UgZ290IGEgYnJva2VuIGNvbm5lY3Rpb24KCQkJfQoJCQkkdGVtcCA9IHN1YnN0cigkYnVmZmVyLCRjaHVua3N0YXJ0LCRjaHVua2VuZC0kY2h1bmtzdGFydCk7CgkJCSRjaHVua19zaXplID0gaGV4ZGVjKCB0cmltKCR0ZW1wKSApOwoJCQkkY2h1bmtzdGFydCA9ICRjaHVua2VuZDsKCQl9CgkJcmV0dXJuICRuZXc7Cgl9CgkKCS8qCgkgKglXcml0ZXMgcGF5bG9hZCwgaW5jbHVkaW5nIEhUVFAgaGVhZGVycywgdG8gJHRoaXMtPm91dGdvaW5nX3BheWxvYWQuCgkgKi8KCWZ1bmN0aW9uIGJ1aWxkUGF5bG9hZCgkZGF0YSwgJGNvb2tpZV9zdHIgPSAnJykgewoJCS8vIGFkZCBjb250ZW50LWxlbmd0aCBoZWFkZXIKCQkkdGhpcy0+b3V0Z29pbmdfaGVhZGVyc1snQ29udGVudC1MZW5ndGgnXSA9IHN0cmxlbigkZGF0YSk7CgkJJHRoaXMtPmRlYnVnKCdzZXQgQ29udGVudC1MZW5ndGg6ICcgLiAkdGhpcy0+b3V0Z29pbmdfaGVhZGVyc1snQ29udGVudC1MZW5ndGgnXSk7CgoJCS8vIHN0YXJ0IGJ1aWxkaW5nIG91dGdvaW5nIHBheWxvYWQ6CgkJJHJlcSA9ICIkdGhpcy0+cmVxdWVzdF9tZXRob2QgJHRoaXMtPnVyaSBIVFRQLyR0aGlzLT5wcm90b2NvbF92ZXJzaW9uIjsKCQkkdGhpcy0+ZGVidWcoIkhUVFAgcmVxdWVzdDogJHJlcSIpOwoJCSR0aGlzLT5vdXRnb2luZ19wYXlsb2FkID0gIiRyZXFcclxuIjsKCgkJLy8gbG9vcCB0aHJ1IGhlYWRlcnMsIHNlcmlhbGl6aW5nCgkJZm9yZWFjaCgkdGhpcy0+b3V0Z29pbmdfaGVhZGVycyBhcyAkayA9PiAkdil7CgkJCSRoZHIgPSAkay4nOiAnLiR2OwoJCQkkdGhpcy0+ZGVidWcoIkhUVFAgaGVhZGVyOiAkaGRyIik7CgkJCSR0aGlzLT5vdXRnb2luZ19wYXlsb2FkIC49ICIkaGRyXHJcbiI7CgkJfQoKCQkvLyBhZGQgYW55IGNvb2tpZXMKCQlpZiAoJGNvb2tpZV9zdHIgIT0gJycpIHsKCQkJJGhkciA9ICdDb29raWU6ICcuJGNvb2tpZV9zdHI7CgkJCSR0aGlzLT5kZWJ1ZygiSFRUUCBoZWFkZXI6ICRoZHIiKTsKCQkJJHRoaXMtPm91dGdvaW5nX3BheWxvYWQgLj0gIiRoZHJcclxuIjsKCQl9CgoJCS8vIGhlYWRlci9ib2R5IHNlcGFyYXRvcgoJCSR0aGlzLT5vdXRnb2luZ19wYXlsb2FkIC49ICJcclxuIjsKCQkKCQkvLyBhZGQgZGF0YQoJCSR0aGlzLT5vdXRnb2luZ19wYXlsb2FkIC49ICRkYXRhOwoJfQoKCWZ1bmN0aW9uIHNlbmRSZXF1ZXN0KCRkYXRhLCAkY29va2llcyA9IE5VTEwpIHsKCQkvLyBidWlsZCBjb29raWUgc3RyaW5nCgkJJGNvb2tpZV9zdHIgPSAkdGhpcy0+Z2V0Q29va2llc0ZvclJlcXVlc3QoJGNvb2tpZXMsICgoJHRoaXMtPnNjaGVtZSA9PSAnc3NsJykgfHwgKCR0aGlzLT5zY2hlbWUgPT0gJ2h0dHBzJykpKTsKCgkJLy8gYnVpbGQgcGF5bG9hZAoJCSR0aGlzLT5idWlsZFBheWxvYWQoJGRhdGEsICRjb29raWVfc3RyKTsKCgkgIGlmICgkdGhpcy0+c2NoZW1lID09ICdodHRwJyB8fCAkdGhpcy0+c2NoZW1lID09ICdzc2wnKSB7CgkJLy8gc2VuZCBwYXlsb2FkCgkJaWYoIWZwdXRzKCR0aGlzLT5mcCwgJHRoaXMtPm91dGdvaW5nX3BheWxvYWQsIHN0cmxlbigkdGhpcy0+b3V0Z29pbmdfcGF5bG9hZCkpKSB7CgkJCSR0aGlzLT5zZXRFcnJvcignY291bGRuXCd0IHdyaXRlIG1lc3NhZ2UgZGF0YSB0byBzb2NrZXQnKTsKCQkJJHRoaXMtPmRlYnVnKCdjb3VsZG5cJ3Qgd3JpdGUgbWVzc2FnZSBkYXRhIHRvIHNvY2tldCcpOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCSR0aGlzLT5kZWJ1Zygnd3JvdGUgZGF0YSB0byBzb2NrZXQsIGxlbmd0aCA9ICcgLiBzdHJsZW4oJHRoaXMtPm91dGdvaW5nX3BheWxvYWQpKTsKCQlyZXR1cm4gdHJ1ZTsKCSAgfSBlbHNlIGlmICgkdGhpcy0+c2NoZW1lID09ICdodHRwcycpIHsKCQkvLyBzZXQgcGF5bG9hZAoJCS8vIFRPRE86IGNVUkwgZG9lcyBzYXkgdGhpcyBzaG91bGQgb25seSBiZSB0aGUgdmVyYiwgYW5kIGluIGZhY3QgaXQKCQkvLyB0dXJucyBvdXQgdGhhdCB0aGUgVVJJIGFuZCBIVFRQIHZlcnNpb24gYXJlIGFwcGVuZGVkIHRvIHRoaXMsIHdoaWNoCgkJLy8gc29tZSBzZXJ2ZXJzIHJlZnVzZSB0byB3b3JrIHdpdGgKCQkvL2N1cmxfc2V0b3B0KCR0aGlzLT5jaCwgQ1VSTE9QVF9DVVNUT01SRVFVRVNULCAkdGhpcy0+b3V0Z29pbmdfcGF5bG9hZCk7CgkJZm9yZWFjaCgkdGhpcy0+b3V0Z29pbmdfaGVhZGVycyBhcyAkayA9PiAkdil7CgkJCSRjdXJsX2hlYWRlcnNbXSA9ICIkazogJHYiOwoJCX0KCQlpZiAoJGNvb2tpZV9zdHIgIT0gJycpIHsKCQkJJGN1cmxfaGVhZGVyc1tdID0gJ0Nvb2tpZTogJyAuICRjb29raWVfc3RyOwoJCX0KCQljdXJsX3NldG9wdCgkdGhpcy0+Y2gsIENVUkxPUFRfSFRUUEhFQURFUiwgJGN1cmxfaGVhZGVycyk7CgkJaWYgKCR0aGlzLT5yZXF1ZXN0X21ldGhvZCA9PSAiUE9TVCIpIHsKCSAgCQljdXJsX3NldG9wdCgkdGhpcy0+Y2gsIENVUkxPUFRfUE9TVCwgMSk7CgkgIAkJY3VybF9zZXRvcHQoJHRoaXMtPmNoLCBDVVJMT1BUX1BPU1RGSUVMRFMsICRkYXRhKTsKCSAgCX0gZWxzZSB7CgkgIAl9CgkJJHRoaXMtPmRlYnVnKCdzZXQgY1VSTCBwYXlsb2FkJyk7CgkJcmV0dXJuIHRydWU7CgkgIH0KCX0KCglmdW5jdGlvbiBnZXRSZXNwb25zZSgpewoJCSR0aGlzLT5pbmNvbWluZ19wYXlsb2FkID0gJyc7CgkgICAgCgkgIGlmICgkdGhpcy0+c2NoZW1lID09ICdodHRwJyB8fCAkdGhpcy0+c2NoZW1lID09ICdzc2wnKSB7CgkgICAgLy8gbG9vcCB1bnRpbCBoZWFkZXJzIGhhdmUgYmVlbiByZXRyaWV2ZWQKCSAgICAkZGF0YSA9ICcnOwoJICAgIHdoaWxlICghaXNzZXQoJGxiKSl7CgoJCQkvLyBXZSBtaWdodCBFT0YgZHVyaW5nIGhlYWRlciByZWFkLgoJCQlpZihmZW9mKCR0aGlzLT5mcCkpIHsKCQkJCSR0aGlzLT5pbmNvbWluZ19wYXlsb2FkID0gJGRhdGE7CgkJCQkkdGhpcy0+ZGVidWcoJ2ZvdW5kIG5vIGhlYWRlcnMgYmVmb3JlIEVPRiBhZnRlciBsZW5ndGggJyAuIHN0cmxlbigkZGF0YSkpOwoJCQkJJHRoaXMtPmRlYnVnKCJyZWNlaXZlZCBiZWZvcmUgRU9GOlxuIiAuICRkYXRhKTsKCQkJCSR0aGlzLT5zZXRFcnJvcignc2VydmVyIGZhaWxlZCB0byBzZW5kIGhlYWRlcnMnKTsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoKCQkJJHRtcCA9IGZnZXRzKCR0aGlzLT5mcCwgMjU2KTsKCQkJJHRtcGxlbiA9IHN0cmxlbigkdG1wKTsKCQkJJHRoaXMtPmRlYnVnKCJyZWFkIGxpbmUgb2YgJHRtcGxlbiBieXRlczogIiAuIHRyaW0oJHRtcCkpOwoKCQkJaWYgKCR0bXBsZW4gPT0gMCkgewoJCQkJJHRoaXMtPmluY29taW5nX3BheWxvYWQgPSAkZGF0YTsKCQkJCSR0aGlzLT5kZWJ1Zygnc29ja2V0IHJlYWQgb2YgaGVhZGVycyB0aW1lZCBvdXQgYWZ0ZXIgbGVuZ3RoICcgLiBzdHJsZW4oJGRhdGEpKTsKCQkJCSR0aGlzLT5kZWJ1ZygicmVhZCBiZWZvcmUgdGltZW91dDogIiAuICRkYXRhKTsKCQkJCSR0aGlzLT5zZXRFcnJvcignc29ja2V0IHJlYWQgb2YgaGVhZGVycyB0aW1lZCBvdXQnKTsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoKCQkJJGRhdGEgLj0gJHRtcDsKCQkJJHBvcyA9IHN0cnBvcygkZGF0YSwiXHJcblxyXG4iKTsKCQkJaWYoJHBvcyA+IDEpewoJCQkJJGxiID0gIlxyXG4iOwoJCQl9IGVsc2UgewoJCQkJJHBvcyA9IHN0cnBvcygkZGF0YSwiXG5cbiIpOwoJCQkJaWYoJHBvcyA+IDEpewoJCQkJCSRsYiA9ICJcbiI7CgkJCQl9CgkJCX0KCQkJLy8gcmVtb3ZlIDEwMCBoZWFkZXIKCQkJaWYoaXNzZXQoJGxiKSAmJiBlcmVnKCdeSFRUUC8xLjEgMTAwJywkZGF0YSkpewoJCQkJdW5zZXQoJGxiKTsKCQkJCSRkYXRhID0gJyc7CgkJCX0vLwoJCX0KCQkvLyBzdG9yZSBoZWFkZXIgZGF0YQoJCSR0aGlzLT5pbmNvbWluZ19wYXlsb2FkIC49ICRkYXRhOwoJCSR0aGlzLT5kZWJ1ZygnZm91bmQgZW5kIG9mIGhlYWRlcnMgYWZ0ZXIgbGVuZ3RoICcgLiBzdHJsZW4oJGRhdGEpKTsKCQkvLyBwcm9jZXNzIGhlYWRlcnMKCQkkaGVhZGVyX2RhdGEgPSB0cmltKHN1YnN0cigkZGF0YSwwLCRwb3MpKTsKCQkkaGVhZGVyX2FycmF5ID0gZXhwbG9kZSgkbGIsJGhlYWRlcl9kYXRhKTsKCQkkdGhpcy0+aW5jb21pbmdfaGVhZGVycyA9IGFycmF5KCk7CgkJJHRoaXMtPmluY29taW5nX2Nvb2tpZXMgPSBhcnJheSgpOwoJCWZvcmVhY2goJGhlYWRlcl9hcnJheSBhcyAkaGVhZGVyX2xpbmUpewoJCQkkYXJyID0gZXhwbG9kZSgnOicsJGhlYWRlcl9saW5lLCAyKTsKCQkJaWYoY291bnQoJGFycikgPiAxKXsKCQkJCSRoZWFkZXJfbmFtZSA9IHN0cnRvbG93ZXIodHJpbSgkYXJyWzBdKSk7CgkJCQkkdGhpcy0+aW5jb21pbmdfaGVhZGVyc1skaGVhZGVyX25hbWVdID0gdHJpbSgkYXJyWzFdKTsKCQkJCWlmICgkaGVhZGVyX25hbWUgPT0gJ3NldC1jb29raWUnKSB7CgkJCQkJLy8gVE9ETzogYWxsb3cgbXVsdGlwbGUgY29va2llcyBmcm9tIHBhcnNlQ29va2llCgkJCQkJJGNvb2tpZSA9ICR0aGlzLT5wYXJzZUNvb2tpZSh0cmltKCRhcnJbMV0pKTsKCQkJCQlpZiAoJGNvb2tpZSkgewoJCQkJCQkkdGhpcy0+aW5jb21pbmdfY29va2llc1tdID0gJGNvb2tpZTsKCQkJCQkJJHRoaXMtPmRlYnVnKCdmb3VuZCBjb29raWU6ICcgLiAkY29va2llWyduYW1lJ10gLiAnID0gJyAuICRjb29raWVbJ3ZhbHVlJ10pOwoJCQkJCX0gZWxzZSB7CgkJCQkJCSR0aGlzLT5kZWJ1ZygnZGlkIG5vdCBmaW5kIGNvb2tpZSBpbiAnIC4gdHJpbSgkYXJyWzFdKSk7CgkJCQkJfQogICAgCQkJfQoJCQl9IGVsc2UgaWYgKGlzc2V0KCRoZWFkZXJfbmFtZSkpIHsKCQkJCS8vIGFwcGVuZCBjb250aW51YXRpb24gbGluZSB0byBwcmV2aW91cyBoZWFkZXIKCQkJCSR0aGlzLT5pbmNvbWluZ19oZWFkZXJzWyRoZWFkZXJfbmFtZV0gLj0gJGxiIC4gJyAnIC4gJGhlYWRlcl9saW5lOwoJCQl9CgkJfQoJCQoJCS8vIGxvb3AgdW50aWwgbXNnIGhhcyBiZWVuIHJlY2VpdmVkCgkJaWYgKGlzc2V0KCR0aGlzLT5pbmNvbWluZ19oZWFkZXJzWyd0cmFuc2Zlci1lbmNvZGluZyddKSAmJiBzdHJ0b2xvd2VyKCR0aGlzLT5pbmNvbWluZ19oZWFkZXJzWyd0cmFuc2Zlci1lbmNvZGluZyddKSA9PSAnY2h1bmtlZCcpIHsKCQkJJGNvbnRlbnRfbGVuZ3RoID0gIDIxNDc0ODM2NDc7CS8vIGlnbm9yZSBhbnkgY29udGVudC1sZW5ndGggaGVhZGVyCgkJCSRjaHVua2VkID0gdHJ1ZTsKCQkJJHRoaXMtPmRlYnVnKCJ3YW50IHRvIHJlYWQgY2h1bmtlZCBjb250ZW50Iik7CgkJfSBlbHNlaWYgKGlzc2V0KCR0aGlzLT5pbmNvbWluZ19oZWFkZXJzWydjb250ZW50LWxlbmd0aCddKSkgewoJCQkkY29udGVudF9sZW5ndGggPSAkdGhpcy0+aW5jb21pbmdfaGVhZGVyc1snY29udGVudC1sZW5ndGgnXTsKCQkJJGNodW5rZWQgPSBmYWxzZTsKCQkJJHRoaXMtPmRlYnVnKCJ3YW50IHRvIHJlYWQgY29udGVudCBvZiBsZW5ndGggJGNvbnRlbnRfbGVuZ3RoIik7CgkJfSBlbHNlIHsKCQkJJGNvbnRlbnRfbGVuZ3RoID0gIDIxNDc0ODM2NDc7CgkJCSRjaHVua2VkID0gZmFsc2U7CgkJCSR0aGlzLT5kZWJ1Zygid2FudCB0byByZWFkIGNvbnRlbnQgdG8gRU9GIik7CgkJfQoJCSRkYXRhID0gJyc7CgkJZG8gewoJCQlpZiAoJGNodW5rZWQpIHsKCQkJCSR0bXAgPSBmZ2V0cygkdGhpcy0+ZnAsIDI1Nik7CgkJCQkkdG1wbGVuID0gc3RybGVuKCR0bXApOwoJCQkJJHRoaXMtPmRlYnVnKCJyZWFkIGNodW5rIGxpbmUgb2YgJHRtcGxlbiBieXRlcyIpOwoJCQkJaWYgKCR0bXBsZW4gPT0gMCkgewoJCQkJCSR0aGlzLT5pbmNvbWluZ19wYXlsb2FkID0gJGRhdGE7CgkJCQkJJHRoaXMtPmRlYnVnKCdzb2NrZXQgcmVhZCBvZiBjaHVuayBsZW5ndGggdGltZWQgb3V0IGFmdGVyIGxlbmd0aCAnIC4gc3RybGVuKCRkYXRhKSk7CgkJCQkJJHRoaXMtPmRlYnVnKCJyZWFkIGJlZm9yZSB0aW1lb3V0OlxuIiAuICRkYXRhKTsKCQkJCQkkdGhpcy0+c2V0RXJyb3IoJ3NvY2tldCByZWFkIG9mIGNodW5rIGxlbmd0aCB0aW1lZCBvdXQnKTsKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9CgkJCQkkY29udGVudF9sZW5ndGggPSBoZXhkZWModHJpbSgkdG1wKSk7CgkJCQkkdGhpcy0+ZGVidWcoImNodW5rIGxlbmd0aCAkY29udGVudF9sZW5ndGgiKTsKCQkJfQoJCQkkc3RybGVuID0gMDsKCQkgICAgd2hpbGUgKCgkc3RybGVuIDwgJGNvbnRlbnRfbGVuZ3RoKSAmJiAoIWZlb2YoJHRoaXMtPmZwKSkpIHsKCQkgICAgCSRyZWFkbGVuID0gbWluKDgxOTIsICRjb250ZW50X2xlbmd0aCAtICRzdHJsZW4pOwoJCQkJJHRtcCA9IGZyZWFkKCR0aGlzLT5mcCwgJHJlYWRsZW4pOwoJCQkJJHRtcGxlbiA9IHN0cmxlbigkdG1wKTsKCQkJCSR0aGlzLT5kZWJ1ZygicmVhZCBidWZmZXIgb2YgJHRtcGxlbiBieXRlcyIpOwoJCQkJaWYgKCgkdG1wbGVuID09IDApICYmICghZmVvZigkdGhpcy0+ZnApKSkgewoJCQkJCSR0aGlzLT5pbmNvbWluZ19wYXlsb2FkID0gJGRhdGE7CgkJCQkJJHRoaXMtPmRlYnVnKCdzb2NrZXQgcmVhZCBvZiBib2R5IHRpbWVkIG91dCBhZnRlciBsZW5ndGggJyAuIHN0cmxlbigkZGF0YSkpOwoJCQkJCSR0aGlzLT5kZWJ1ZygicmVhZCBiZWZvcmUgdGltZW91dDpcbiIgLiAkZGF0YSk7CgkJCQkJJHRoaXMtPnNldEVycm9yKCdzb2NrZXQgcmVhZCBvZiBib2R5IHRpbWVkIG91dCcpOwoJCQkJCXJldHVybiBmYWxzZTsKCQkJCX0KCQkJCSRzdHJsZW4gKz0gJHRtcGxlbjsKCQkJCSRkYXRhIC49ICR0bXA7CgkJCX0KCQkJaWYgKCRjaHVua2VkICYmICgkY29udGVudF9sZW5ndGggPiAwKSkgewoJCQkJJHRtcCA9IGZnZXRzKCR0aGlzLT5mcCwgMjU2KTsKCQkJCSR0bXBsZW4gPSBzdHJsZW4oJHRtcCk7CgkJCQkkdGhpcy0+ZGVidWcoInJlYWQgY2h1bmsgdGVybWluYXRvciBvZiAkdG1wbGVuIGJ5dGVzIik7CgkJCQlpZiAoJHRtcGxlbiA9PSAwKSB7CgkJCQkJJHRoaXMtPmluY29taW5nX3BheWxvYWQgPSAkZGF0YTsKCQkJCQkkdGhpcy0+ZGVidWcoJ3NvY2tldCByZWFkIG9mIGNodW5rIHRlcm1pbmF0b3IgdGltZWQgb3V0IGFmdGVyIGxlbmd0aCAnIC4gc3RybGVuKCRkYXRhKSk7CgkJCQkJJHRoaXMtPmRlYnVnKCJyZWFkIGJlZm9yZSB0aW1lb3V0OlxuIiAuICRkYXRhKTsKCQkJCQkkdGhpcy0+c2V0RXJyb3IoJ3NvY2tldCByZWFkIG9mIGNodW5rIHRlcm1pbmF0b3IgdGltZWQgb3V0Jyk7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9CgkJfSB3aGlsZSAoJGNodW5rZWQgJiYgKCRjb250ZW50X2xlbmd0aCA+IDApICYmICghZmVvZigkdGhpcy0+ZnApKSk7CgkJaWYgKGZlb2YoJHRoaXMtPmZwKSkgewoJCQkkdGhpcy0+ZGVidWcoJ3JlYWQgdG8gRU9GJyk7CgkJfQoJCSR0aGlzLT5kZWJ1ZygncmVhZCBib2R5IG9mIGxlbmd0aCAnIC4gc3RybGVuKCRkYXRhKSk7CgkJJHRoaXMtPmluY29taW5nX3BheWxvYWQgLj0gJGRhdGE7CgkJJHRoaXMtPmRlYnVnKCdyZWNlaXZlZCBhIHRvdGFsIG9mICcuc3RybGVuKCR0aGlzLT5pbmNvbWluZ19wYXlsb2FkKS4nIGJ5dGVzIG9mIGRhdGEgZnJvbSBzZXJ2ZXInKTsKCQkKCQkvLyBjbG9zZSBmaWxlcG9pbnRlcgoJCWlmKAoJCQkoaXNzZXQoJHRoaXMtPmluY29taW5nX2hlYWRlcnNbJ2Nvbm5lY3Rpb24nXSkgJiYgc3RydG9sb3dlcigkdGhpcy0+aW5jb21pbmdfaGVhZGVyc1snY29ubmVjdGlvbiddKSA9PSAnY2xvc2UnKSB8fCAKCQkJKCEgJHRoaXMtPnBlcnNpc3RlbnRDb25uZWN0aW9uKSB8fCBmZW9mKCR0aGlzLT5mcCkpewoJCQlmY2xvc2UoJHRoaXMtPmZwKTsKCQkJJHRoaXMtPmZwID0gZmFsc2U7CgkJCSR0aGlzLT5kZWJ1ZygnY2xvc2VkIHNvY2tldCcpOwoJCX0KCQkKCQkvLyBjb25uZWN0aW9uIHdhcyBjbG9zZWQgdW5leHBlY3RlZGx5CgkJaWYoJHRoaXMtPmluY29taW5nX3BheWxvYWQgPT0gJycpewoJCQkkdGhpcy0+c2V0RXJyb3IoJ25vIHJlc3BvbnNlIGZyb20gc2VydmVyJyk7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJCgkJLy8gZGVjb2RlIHRyYW5zZmVyLWVuY29kaW5nCi8vCQlpZihpc3NldCgkdGhpcy0+aW5jb21pbmdfaGVhZGVyc1sndHJhbnNmZXItZW5jb2RpbmcnXSkgJiYgc3RydG9sb3dlcigkdGhpcy0+aW5jb21pbmdfaGVhZGVyc1sndHJhbnNmZXItZW5jb2RpbmcnXSkgPT0gJ2NodW5rZWQnKXsKLy8JCQlpZighJGRhdGEgPSAkdGhpcy0+ZGVjb2RlQ2h1bmtlZCgkZGF0YSwgJGxiKSl7Ci8vCQkJCSR0aGlzLT5zZXRFcnJvcignRGVjb2Rpbmcgb2YgY2h1bmtlZCBkYXRhIGZhaWxlZCcpOwovLwkJCQlyZXR1cm4gZmFsc2U7Ci8vCQkJfQoJCQkvL3ByaW50ICI8cHJlPlxuZGUtY2h1bmtlZDpcbi0tLS0tLS0tLS0tLS0tLVxuJGRhdGFcblxuLS0tLS0tLS0tLS0tLS0tXG48L3ByZT4iOwoJCQkvLyBzZXQgZGVjb2RlZCBwYXlsb2FkCi8vCQkJJHRoaXMtPmluY29taW5nX3BheWxvYWQgPSAkaGVhZGVyX2RhdGEuJGxiLiRsYi4kZGF0YTsKLy8JCX0KCQoJICB9IGVsc2UgaWYgKCR0aGlzLT5zY2hlbWUgPT0gJ2h0dHBzJykgewoJCS8vIHNlbmQgYW5kIHJlY2VpdmUKCQkkdGhpcy0+ZGVidWcoJ3NlbmQgYW5kIHJlY2VpdmUgd2l0aCBjVVJMJyk7CgkJJHRoaXMtPmluY29taW5nX3BheWxvYWQgPSBjdXJsX2V4ZWMoJHRoaXMtPmNoKTsKCQkkZGF0YSA9ICR0aGlzLT5pbmNvbWluZ19wYXlsb2FkOwoKICAgICAgICAkY0VyciA9IGN1cmxfZXJyb3IoJHRoaXMtPmNoKTsKCQlpZiAoJGNFcnIgIT0gJycpIHsKICAgICAgICAJJGVyciA9ICdjVVJMIEVSUk9SOiAnLmN1cmxfZXJybm8oJHRoaXMtPmNoKS4nOiAnLiRjRXJyLic8YnI+JzsKICAgICAgICAJLy8gVE9ETzogdGhlcmUgaXMgYSBQSFAgYnVnIHRoYXQgY2FuIGNhdXNlIHRoaXMgdG8gU0VHViBmb3IgQ1VSTElORk9fQ09OVEVOVF9UWVBFCgkJCWZvcmVhY2goY3VybF9nZXRpbmZvKCR0aGlzLT5jaCkgYXMgJGsgPT4gJHYpewoJCQkJJGVyciAuPSAiJGs6ICR2PGJyPiI7CgkJCX0KCQkJJHRoaXMtPmRlYnVnKCRlcnIpOwoJCQkkdGhpcy0+c2V0RXJyb3IoJGVycik7CgkJCWN1cmxfY2xvc2UoJHRoaXMtPmNoKTsKCSAgICAJcmV0dXJuIGZhbHNlOwoJCX0gZWxzZSB7CgkJCS8vZWNobyAnPHByZT4nOwoJCQkvL3Zhcl9kdW1wKGN1cmxfZ2V0aW5mbygkdGhpcy0+Y2gpKTsKCQkJLy9lY2hvICc8L3ByZT4nOwoJCX0KCQkvLyBjbG9zZSBjdXJsCgkJJHRoaXMtPmRlYnVnKCdObyBjVVJMIGVycm9yLCBjbG9zaW5nIGNVUkwnKTsKCQljdXJsX2Nsb3NlKCR0aGlzLT5jaCk7CgkJCgkJLy8gcmVtb3ZlIDEwMCBoZWFkZXIocykKCQl3aGlsZSAoZXJlZygnXkhUVFAvMS4xIDEwMCcsJGRhdGEpKSB7CgkJCWlmICgkcG9zID0gc3RycG9zKCRkYXRhLCJcclxuXHJcbiIpKSB7CgkJCQkkZGF0YSA9IGx0cmltKHN1YnN0cigkZGF0YSwkcG9zKSk7CgkJCX0gZWxzZWlmKCRwb3MgPSBzdHJwb3MoJGRhdGEsIlxuXG4iKSApIHsKCQkJCSRkYXRhID0gbHRyaW0oc3Vic3RyKCRkYXRhLCRwb3MpKTsKCQkJfQoJCX0KCQkKCQkvLyBzZXBhcmF0ZSBjb250ZW50IGZyb20gSFRUUCBoZWFkZXJzCgkJaWYgKCRwb3MgPSBzdHJwb3MoJGRhdGEsIlxyXG5cclxuIikpIHsKCQkJJGxiID0gIlxyXG4iOwoJCX0gZWxzZWlmKCAkcG9zID0gc3RycG9zKCRkYXRhLCJcblxuIikpIHsKCQkJJGxiID0gIlxuIjsKCQl9IGVsc2UgewoJCQkkdGhpcy0+ZGVidWcoJ25vIHByb3BlciBzZXBhcmF0aW9uIG9mIGhlYWRlcnMgYW5kIGRvY3VtZW50Jyk7CgkJCSR0aGlzLT5zZXRFcnJvcignbm8gcHJvcGVyIHNlcGFyYXRpb24gb2YgaGVhZGVycyBhbmQgZG9jdW1lbnQnKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQkkaGVhZGVyX2RhdGEgPSB0cmltKHN1YnN0cigkZGF0YSwwLCRwb3MpKTsKCQkkaGVhZGVyX2FycmF5ID0gZXhwbG9kZSgkbGIsJGhlYWRlcl9kYXRhKTsKCQkkZGF0YSA9IGx0cmltKHN1YnN0cigkZGF0YSwkcG9zKSk7CgkJJHRoaXMtPmRlYnVnKCdmb3VuZCBwcm9wZXIgc2VwYXJhdGlvbiBvZiBoZWFkZXJzIGFuZCBkb2N1bWVudCcpOwoJCSR0aGlzLT5kZWJ1ZygnY2xlYW5lZCBkYXRhLCBzdHJpbmdsZW46ICcuc3RybGVuKCRkYXRhKSk7CgkJLy8gY2xlYW4gaGVhZGVycwoJCWZvcmVhY2ggKCRoZWFkZXJfYXJyYXkgYXMgJGhlYWRlcl9saW5lKSB7CgkJCSRhcnIgPSBleHBsb2RlKCc6JywkaGVhZGVyX2xpbmUsMik7CgkJCWlmKGNvdW50KCRhcnIpID4gMSl7CgkJCQkkaGVhZGVyX25hbWUgPSBzdHJ0b2xvd2VyKHRyaW0oJGFyclswXSkpOwoJCQkJJHRoaXMtPmluY29taW5nX2hlYWRlcnNbJGhlYWRlcl9uYW1lXSA9IHRyaW0oJGFyclsxXSk7CgkJCQlpZiAoJGhlYWRlcl9uYW1lID09ICdzZXQtY29va2llJykgewoJCQkJCS8vIFRPRE86IGFsbG93IG11bHRpcGxlIGNvb2tpZXMgZnJvbSBwYXJzZUNvb2tpZQoJCQkJCSRjb29raWUgPSAkdGhpcy0+cGFyc2VDb29raWUodHJpbSgkYXJyWzFdKSk7CgkJCQkJaWYgKCRjb29raWUpIHsKCQkJCQkJJHRoaXMtPmluY29taW5nX2Nvb2tpZXNbXSA9ICRjb29raWU7CgkJCQkJCSR0aGlzLT5kZWJ1ZygnZm91bmQgY29va2llOiAnIC4gJGNvb2tpZVsnbmFtZSddIC4gJyA9ICcgLiAkY29va2llWyd2YWx1ZSddKTsKCQkJCQl9IGVsc2UgewoJCQkJCQkkdGhpcy0+ZGVidWcoJ2RpZCBub3QgZmluZCBjb29raWUgaW4gJyAuIHRyaW0oJGFyclsxXSkpOwoJCQkJCX0KICAgIAkJCX0KCQkJfSBlbHNlIGlmIChpc3NldCgkaGVhZGVyX25hbWUpKSB7CgkJCQkvLyBhcHBlbmQgY29udGludWF0aW9uIGxpbmUgdG8gcHJldmlvdXMgaGVhZGVyCgkJCQkkdGhpcy0+aW5jb21pbmdfaGVhZGVyc1skaGVhZGVyX25hbWVdIC49ICRsYiAuICcgJyAuICRoZWFkZXJfbGluZTsKCQkJfQoJCX0KCSAgfQoKCQkkYXJyID0gZXhwbG9kZSgnICcsICRoZWFkZXJfYXJyYXlbMF0sIDMpOwoJCSRodHRwX3ZlcnNpb24gPSAkYXJyWzBdOwoJCSRodHRwX3N0YXR1cyA9IGludHZhbCgkYXJyWzFdKTsKCQkkaHR0cF9yZWFzb24gPSBjb3VudCgkYXJyKSA+IDIgPyAkYXJyWzJdIDogJyc7CgogCQkvLyBzZWUgaWYgd2UgbmVlZCB0byByZXNlbmQgdGhlIHJlcXVlc3Qgd2l0aCBodHRwIGRpZ2VzdCBhdXRoZW50aWNhdGlvbgogCQlpZiAoaXNzZXQoJHRoaXMtPmluY29taW5nX2hlYWRlcnNbJ2xvY2F0aW9uJ10pICYmICRodHRwX3N0YXR1cyA9PSAzMDEpIHsKIAkJCSR0aGlzLT5kZWJ1ZygiR290IDMwMSAkaHR0cF9yZWFzb24gd2l0aCBMb2NhdGlvbjogIiAuICR0aGlzLT5pbmNvbWluZ19oZWFkZXJzWydsb2NhdGlvbiddKTsKIAkJCSR0aGlzLT5zZXRVUkwoJHRoaXMtPmluY29taW5nX2hlYWRlcnNbJ2xvY2F0aW9uJ10pOwoJCQkkdGhpcy0+dHJ5YWdhaW4gPSB0cnVlOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKIAkJLy8gc2VlIGlmIHdlIG5lZWQgdG8gcmVzZW5kIHRoZSByZXF1ZXN0IHdpdGggaHR0cCBkaWdlc3QgYXV0aGVudGljYXRpb24KIAkJaWYgKGlzc2V0KCR0aGlzLT5pbmNvbWluZ19oZWFkZXJzWyd3d3ctYXV0aGVudGljYXRlJ10pICYmICRodHRwX3N0YXR1cyA9PSA0MDEpIHsKIAkJCSR0aGlzLT5kZWJ1ZygiR290IDQwMSAkaHR0cF9yZWFzb24gd2l0aCBXV1ctQXV0aGVudGljYXRlOiAiIC4gJHRoaXMtPmluY29taW5nX2hlYWRlcnNbJ3d3dy1hdXRoZW50aWNhdGUnXSk7CiAJCQlpZiAoc3Ryc3RyKCR0aGlzLT5pbmNvbWluZ19oZWFkZXJzWyd3d3ctYXV0aGVudGljYXRlJ10sICJEaWdlc3QgIikpIHsKIAkJCQkkdGhpcy0+ZGVidWcoJ1NlcnZlciB3YW50cyBkaWdlc3QgYXV0aGVudGljYXRpb24nKTsKIAkJCQkvLyByZW1vdmUgIkRpZ2VzdCAiIGZyb20gb3VyIGVsZW1lbnRzCiAJCQkJJGRpZ2VzdFN0cmluZyA9IHN0cl9yZXBsYWNlKCdEaWdlc3QgJywgJycsICR0aGlzLT5pbmNvbWluZ19oZWFkZXJzWyd3d3ctYXV0aGVudGljYXRlJ10pOwogCQkJCQogCQkJCS8vIHBhcnNlIGVsZW1lbnRzIGludG8gYXJyYXkKIAkJCQkkZGlnZXN0RWxlbWVudHMgPSBleHBsb2RlKCcsJywgJGRpZ2VzdFN0cmluZyk7CiAJCQkJZm9yZWFjaCAoJGRpZ2VzdEVsZW1lbnRzIGFzICR2YWwpIHsKIAkJCQkJJHRlbXBFbGVtZW50ID0gZXhwbG9kZSgnPScsIHRyaW0oJHZhbCksIDIpOwogCQkJCQkkZGlnZXN0UmVxdWVzdFskdGVtcEVsZW1lbnRbMF1dID0gc3RyX3JlcGxhY2UoIlwiIiwgJycsICR0ZW1wRWxlbWVudFsxXSk7CiAJCQkJfQoKCQkJCS8vIHNob3VsZCBoYXZlIChhdCBsZWFzdCkgcW9wLCByZWFsbSwgbm9uY2UKIAkJCQlpZiAoaXNzZXQoJGRpZ2VzdFJlcXVlc3RbJ25vbmNlJ10pKSB7CiAJCQkJCSR0aGlzLT5zZXRDcmVkZW50aWFscygkdGhpcy0+dXNlcm5hbWUsICR0aGlzLT5wYXNzd29yZCwgJ2RpZ2VzdCcsICRkaWdlc3RSZXF1ZXN0KTsKIAkJCQkJJHRoaXMtPnRyeWFnYWluID0gdHJ1ZTsKIAkJCQkJcmV0dXJuIGZhbHNlOwogCQkJCX0KIAkJCX0KCQkJJHRoaXMtPmRlYnVnKCdIVFRQIGF1dGhlbnRpY2F0aW9uIGZhaWxlZCcpOwoJCQkkdGhpcy0+c2V0RXJyb3IoJ0hUVFAgYXV0aGVudGljYXRpb24gZmFpbGVkJyk7CgkJCXJldHVybiBmYWxzZTsKIAkJfQoJCQoJCWlmICgKCQkJKCRodHRwX3N0YXR1cyA+PSAzMDAgJiYgJGh0dHBfc3RhdHVzIDw9IDMwNykgfHwKCQkJKCRodHRwX3N0YXR1cyA+PSA0MDAgJiYgJGh0dHBfc3RhdHVzIDw9IDQxNykgfHwKCQkJKCRodHRwX3N0YXR1cyA+PSA1MDEgJiYgJGh0dHBfc3RhdHVzIDw9IDUwNSkKCQkgICApIHsKCQkJJHRoaXMtPnNldEVycm9yKCJVbnN1cHBvcnRlZCBIVFRQIHJlc3BvbnNlIHN0YXR1cyAkaHR0cF9zdGF0dXMgJGh0dHBfcmVhc29uIChzb2FwY2xpZW50LT5yZXNwb25zZSBoYXMgY29udGVudHMgb2YgdGhlIHJlc3BvbnNlKSIpOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCQkvLyBkZWNvZGUgY29udGVudC1lbmNvZGluZwoJCWlmKGlzc2V0KCR0aGlzLT5pbmNvbWluZ19oZWFkZXJzWydjb250ZW50LWVuY29kaW5nJ10pICYmICR0aGlzLT5pbmNvbWluZ19oZWFkZXJzWydjb250ZW50LWVuY29kaW5nJ10gIT0gJycpewoJCQlpZihzdHJ0b2xvd2VyKCR0aGlzLT5pbmNvbWluZ19oZWFkZXJzWydjb250ZW50LWVuY29kaW5nJ10pID09ICdkZWZsYXRlJyB8fCBzdHJ0b2xvd2VyKCR0aGlzLT5pbmNvbWluZ19oZWFkZXJzWydjb250ZW50LWVuY29kaW5nJ10pID09ICdnemlwJyl7CiAgICAJCQkvLyBpZiBkZWNvZGluZyB3b3JrcywgdXNlIGl0LiBlbHNlIGFzc3VtZSBkYXRhIHdhc24ndCBnemVuY29kZWQKICAgIAkJCWlmKGZ1bmN0aW9uX2V4aXN0cygnZ3ppbmZsYXRlJykpewoJCQkJCS8vJHRpbWVyLT5zZXRNYXJrZXIoJ3N0YXJ0aW5nIGRlY29kaW5nIG9mIGd6aXAvZGVmbGF0ZWQgY29udGVudCcpOwoJCQkJCS8vIElJUyA1IHJlcXVpcmVzIGd6aW5mbGF0ZSBpbnN0ZWFkIG9mIGd6dW5jb21wcmVzcyAoc2ltaWxhciB0byBJRSA1IGFuZCBnemRlZmxhdGUgdi4gZ3pjb21wcmVzcykKCQkJCQkvLyB0aGlzIG1lYW5zIHRoZXJlIGFyZSBubyBabGliIGhlYWRlcnMsIGFsdGhvdWdoIHRoZXJlIHNob3VsZCBiZQoJCQkJCSR0aGlzLT5kZWJ1ZygnVGhlIGd6aW5mbGF0ZSBmdW5jdGlvbiBleGlzdHMnKTsKCQkJCQkkZGF0YWxlbiA9IHN0cmxlbigkZGF0YSk7CgkJCQkJaWYgKCR0aGlzLT5pbmNvbWluZ19oZWFkZXJzWydjb250ZW50LWVuY29kaW5nJ10gPT0gJ2RlZmxhdGUnKSB7CgkJCQkJCWlmICgkZGVnemRhdGEgPSBAZ3ppbmZsYXRlKCRkYXRhKSkgewoJICAgIAkJCQkJJGRhdGEgPSAkZGVnemRhdGE7CgkgICAgCQkJCQkkdGhpcy0+ZGVidWcoJ1RoZSBwYXlsb2FkIGhhcyBiZWVuIGluZmxhdGVkIHRvICcgLiBzdHJsZW4oJGRhdGEpIC4gJyBieXRlcycpOwoJICAgIAkJCQkJaWYgKHN0cmxlbigkZGF0YSkgPCAkZGF0YWxlbikgewoJICAgIAkJCQkJCS8vIHRlc3QgZm9yIHRoZSBjYXNlIHRoYXQgdGhlIHBheWxvYWQgaGFzIGJlZW4gY29tcHJlc3NlZCB0d2ljZQoJCSAgICAJCQkJCSR0aGlzLT5kZWJ1ZygnVGhlIGluZmxhdGVkIHBheWxvYWQgaXMgc21hbGxlciB0aGFuIHRoZSBnemlwcGVkIG9uZTsgdHJ5IGFnYWluJyk7CgkJCQkJCQkJaWYgKCRkZWd6ZGF0YSA9IEBnemluZmxhdGUoJGRhdGEpKSB7CgkJCSAgICAJCQkJCSRkYXRhID0gJGRlZ3pkYXRhOwoJCQkgICAgCQkJCQkkdGhpcy0+ZGVidWcoJ1RoZSBwYXlsb2FkIGhhcyBiZWVuIGluZmxhdGVkIGFnYWluIHRvICcgLiBzdHJsZW4oJGRhdGEpIC4gJyBieXRlcycpOwoJCQkJCQkJCX0KCSAgICAJCQkJCX0KCSAgICAJCQkJfSBlbHNlIHsKCSAgICAJCQkJCSR0aGlzLT5kZWJ1ZygnRXJyb3IgdXNpbmcgZ3ppbmZsYXRlIHRvIGluZmxhdGUgdGhlIHBheWxvYWQnKTsKCSAgICAJCQkJCSR0aGlzLT5zZXRFcnJvcignRXJyb3IgdXNpbmcgZ3ppbmZsYXRlIHRvIGluZmxhdGUgdGhlIHBheWxvYWQnKTsKCSAgICAJCQkJfQoJCQkJCX0gZWxzZWlmICgkdGhpcy0+aW5jb21pbmdfaGVhZGVyc1snY29udGVudC1lbmNvZGluZyddID09ICdnemlwJykgewoJCQkJCQlpZiAoJGRlZ3pkYXRhID0gQGd6aW5mbGF0ZShzdWJzdHIoJGRhdGEsIDEwKSkpIHsJLy8gZG8gb3VyIGJlc3QKCQkJCQkJCSRkYXRhID0gJGRlZ3pkYXRhOwoJICAgIAkJCQkJJHRoaXMtPmRlYnVnKCdUaGUgcGF5bG9hZCBoYXMgYmVlbiB1bi1nemlwcGVkIHRvICcgLiBzdHJsZW4oJGRhdGEpIC4gJyBieXRlcycpOwoJICAgIAkJCQkJaWYgKHN0cmxlbigkZGF0YSkgPCAkZGF0YWxlbikgewoJICAgIAkJCQkJCS8vIHRlc3QgZm9yIHRoZSBjYXNlIHRoYXQgdGhlIHBheWxvYWQgaGFzIGJlZW4gY29tcHJlc3NlZCB0d2ljZQoJCSAgICAJCQkJCSR0aGlzLT5kZWJ1ZygnVGhlIHVuLWd6aXBwZWQgcGF5bG9hZCBpcyBzbWFsbGVyIHRoYW4gdGhlIGd6aXBwZWQgb25lOyB0cnkgYWdhaW4nKTsKCQkJCQkJCQlpZiAoJGRlZ3pkYXRhID0gQGd6aW5mbGF0ZShzdWJzdHIoJGRhdGEsIDEwKSkpIHsKCQkJICAgIAkJCQkJJGRhdGEgPSAkZGVnemRhdGE7CgkJCSAgICAJCQkJCSR0aGlzLT5kZWJ1ZygnVGhlIHBheWxvYWQgaGFzIGJlZW4gdW4tZ3ppcHBlZCBhZ2FpbiB0byAnIC4gc3RybGVuKCRkYXRhKSAuICcgYnl0ZXMnKTsKCQkJCQkJCQl9CgkgICAgCQkJCQl9CgkgICAgCQkJCX0gZWxzZSB7CgkgICAgCQkJCQkkdGhpcy0+ZGVidWcoJ0Vycm9yIHVzaW5nIGd6aW5mbGF0ZSB0byB1bi1nemlwIHRoZSBwYXlsb2FkJyk7CgkJCQkJCQkkdGhpcy0+c2V0RXJyb3IoJ0Vycm9yIHVzaW5nIGd6aW5mbGF0ZSB0byB1bi1nemlwIHRoZSBwYXlsb2FkJyk7CgkgICAgCQkJCX0KCQkJCQl9CgkJCQkJLy8kdGltZXItPnNldE1hcmtlcignZmluaXNoZWQgZGVjb2Rpbmcgb2YgZ3ppcC9kZWZsYXRlZCBjb250ZW50Jyk7CgkJCQkJLy9wcmludCAiPHhtcD5cbmRlLWluZmxhdGVkOlxuLS0tLS0tLS0tLS0tLS0tXG4kZGF0YVxuLS0tLS0tLS0tLS0tLVxuPC94bXA+IjsKCQkJCQkvLyBzZXQgZGVjb2RlZCBwYXlsb2FkCgkJCQkJJHRoaXMtPmluY29taW5nX3BheWxvYWQgPSAkaGVhZGVyX2RhdGEuJGxiLiRsYi4kZGF0YTsKICAgIAkJCX0gZWxzZSB7CgkJCQkJJHRoaXMtPmRlYnVnKCdUaGUgc2VydmVyIHNlbnQgY29tcHJlc3NlZCBkYXRhLiBZb3VyIHBocCBpbnN0YWxsIG11c3QgaGF2ZSB0aGUgWmxpYiBleHRlbnNpb24gY29tcGlsZWQgaW4gdG8gc3VwcG9ydCB0aGlzLicpOwoJCQkJCSR0aGlzLT5zZXRFcnJvcignVGhlIHNlcnZlciBzZW50IGNvbXByZXNzZWQgZGF0YS4gWW91ciBwaHAgaW5zdGFsbCBtdXN0IGhhdmUgdGhlIFpsaWIgZXh0ZW5zaW9uIGNvbXBpbGVkIGluIHRvIHN1cHBvcnQgdGhpcy4nKTsKCQkJCX0KCQkJfSBlbHNlIHsKCQkJCSR0aGlzLT5kZWJ1ZygnVW5zdXBwb3J0ZWQgQ29udGVudC1FbmNvZGluZyAnIC4gJHRoaXMtPmluY29taW5nX2hlYWRlcnNbJ2NvbnRlbnQtZW5jb2RpbmcnXSk7CgkJCQkkdGhpcy0+c2V0RXJyb3IoJ1Vuc3VwcG9ydGVkIENvbnRlbnQtRW5jb2RpbmcgJyAuICR0aGlzLT5pbmNvbWluZ19oZWFkZXJzWydjb250ZW50LWVuY29kaW5nJ10pOwoJCQl9CgkJfSBlbHNlIHsKCQkJJHRoaXMtPmRlYnVnKCdObyBDb250ZW50LUVuY29kaW5nIGhlYWRlcicpOwoJCX0KCQkKCQlpZihzdHJsZW4oJGRhdGEpID09IDApewoJCQkkdGhpcy0+ZGVidWcoJ25vIGRhdGEgYWZ0ZXIgaGVhZGVycyEnKTsKCQkJJHRoaXMtPnNldEVycm9yKCdubyBkYXRhIHByZXNlbnQgYWZ0ZXIgSFRUUCBoZWFkZXJzJyk7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJCgkJcmV0dXJuICRkYXRhOwoJfQoKCWZ1bmN0aW9uIHNldENvbnRlbnRUeXBlKCR0eXBlLCAkY2hhcnNldCA9IGZhbHNlKSB7CgkJJHRoaXMtPm91dGdvaW5nX2hlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gJHR5cGUgLiAoJGNoYXJzZXQgPyAnOyBjaGFyc2V0PScgLiAkY2hhcnNldCA6ICcnKTsKCQkkdGhpcy0+ZGVidWcoJ3NldCBDb250ZW50LVR5cGU6ICcgLiAkdGhpcy0+b3V0Z29pbmdfaGVhZGVyc1snQ29udGVudC1UeXBlJ10pOwoJfQoKCWZ1bmN0aW9uIHVzZVBlcnNpc3RlbnRDb25uZWN0aW9uKCl7CgkJaWYgKGlzc2V0KCR0aGlzLT5vdXRnb2luZ19oZWFkZXJzWydBY2NlcHQtRW5jb2RpbmcnXSkpIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQkkdGhpcy0+cHJvdG9jb2xfdmVyc2lvbiA9ICcxLjEnOwoJCSR0aGlzLT5wZXJzaXN0ZW50Q29ubmVjdGlvbiA9IHRydWU7CgkJJHRoaXMtPm91dGdvaW5nX2hlYWRlcnNbJ0Nvbm5lY3Rpb24nXSA9ICdLZWVwLUFsaXZlJzsKCQkkdGhpcy0+ZGVidWcoJ3NldCBDb25uZWN0aW9uOiAnIC4gJHRoaXMtPm91dGdvaW5nX2hlYWRlcnNbJ0Nvbm5lY3Rpb24nXSk7CgkJcmV0dXJuIHRydWU7Cgl9CgoJLyoqCgkgKiBwYXJzZSBhbiBpbmNvbWluZyBDb29raWUgaW50byBpdCdzIHBhcnRzCgkgKgoJICogQHBhcmFtCXN0cmluZyAkY29va2llX3N0ciBjb250ZW50IG9mIGNvb2tpZQoJICogQHJldHVybglhcnJheSB3aXRoIGRhdGEgb2YgdGhhdCBjb29raWUKCSAqIEBhY2Nlc3MJcHJpdmF0ZQoJICovCgkvKgoJICogVE9ETzogYWxsb3cgYSBTZXQtQ29va2llIHN0cmluZyB0byBiZSBwYXJzZWQgaW50byBtdWx0aXBsZSBjb29raWVzCgkgKi8KCWZ1bmN0aW9uIHBhcnNlQ29va2llKCRjb29raWVfc3RyKSB7CgkJJGNvb2tpZV9zdHIgPSBzdHJfcmVwbGFjZSgnOyAnLCAnOycsICRjb29raWVfc3RyKSAuICc7JzsKCQkkZGF0YSA9IHNwbGl0KCc7JywgJGNvb2tpZV9zdHIpOwoJCSR2YWx1ZV9zdHIgPSAkZGF0YVswXTsKCgkJJGNvb2tpZV9wYXJhbSA9ICdkb21haW49JzsKCQkkc3RhcnQgPSBzdHJwb3MoJGNvb2tpZV9zdHIsICRjb29raWVfcGFyYW0pOwoJCWlmICgkc3RhcnQgPiAwKSB7CgkJCSRkb21haW4gPSBzdWJzdHIoJGNvb2tpZV9zdHIsICRzdGFydCArIHN0cmxlbigkY29va2llX3BhcmFtKSk7CgkJCSRkb21haW4gPSBzdWJzdHIoJGRvbWFpbiwgMCwgc3RycG9zKCRkb21haW4sICc7JykpOwoJCX0gZWxzZSB7CgkJCSRkb21haW4gPSAnJzsKCQl9CgoJCSRjb29raWVfcGFyYW0gPSAnZXhwaXJlcz0nOwoJCSRzdGFydCA9IHN0cnBvcygkY29va2llX3N0ciwgJGNvb2tpZV9wYXJhbSk7CgkJaWYgKCRzdGFydCA+IDApIHsKCQkJJGV4cGlyZXMgPSBzdWJzdHIoJGNvb2tpZV9zdHIsICRzdGFydCArIHN0cmxlbigkY29va2llX3BhcmFtKSk7CgkJCSRleHBpcmVzID0gc3Vic3RyKCRleHBpcmVzLCAwLCBzdHJwb3MoJGV4cGlyZXMsICc7JykpOwoJCX0gZWxzZSB7CgkJCSRleHBpcmVzID0gJyc7CgkJfQoKCQkkY29va2llX3BhcmFtID0gJ3BhdGg9JzsKCQkkc3RhcnQgPSBzdHJwb3MoJGNvb2tpZV9zdHIsICRjb29raWVfcGFyYW0pOwoJCWlmICggJHN0YXJ0ID4gMCApIHsKCQkJJHBhdGggPSBzdWJzdHIoJGNvb2tpZV9zdHIsICRzdGFydCArIHN0cmxlbigkY29va2llX3BhcmFtKSk7CgkJCSRwYXRoID0gc3Vic3RyKCRwYXRoLCAwLCBzdHJwb3MoJHBhdGgsICc7JykpOwoJCX0gZWxzZSB7CgkJCSRwYXRoID0gJy8nOwoJCX0KCQkJCQkJCgkJJGNvb2tpZV9wYXJhbSA9ICc7c2VjdXJlOyc7CgkJaWYgKHN0cnBvcygkY29va2llX3N0ciwgJGNvb2tpZV9wYXJhbSkgIT09IEZBTFNFKSB7CgkJCSRzZWN1cmUgPSB0cnVlOwoJCX0gZWxzZSB7CgkJCSRzZWN1cmUgPSBmYWxzZTsKCQl9CgoJCSRzZXBfcG9zID0gc3RycG9zKCR2YWx1ZV9zdHIsICc9Jyk7CgoJCWlmICgkc2VwX3BvcykgewoJCQkkbmFtZSA9IHN1YnN0cigkdmFsdWVfc3RyLCAwLCAkc2VwX3Bvcyk7CgkJCSR2YWx1ZSA9IHN1YnN0cigkdmFsdWVfc3RyLCAkc2VwX3BvcyArIDEpOwoJCQkkY29va2llPSBhcnJheSgJJ25hbWUnID0+ICRuYW1lLAoJCQkgICAgICAgICAgICAgICAgJ3ZhbHVlJyA9PiAkdmFsdWUsCgkJCQkJCQknZG9tYWluJyA9PiAkZG9tYWluLAoJCQkJCQkJJ3BhdGgnID0+ICRwYXRoLAoJCQkJCQkJJ2V4cGlyZXMnID0+ICRleHBpcmVzLAoJCQkJCQkJJ3NlY3VyZScgPT4gJHNlY3VyZQoJCQkJCQkJKTsJCQoJCQlyZXR1cm4gJGNvb2tpZTsKCQl9CgkJcmV0dXJuIGZhbHNlOwoJfQogIAoJLyoqCgkgKiBzb3J0IG91dCBjb29raWVzIGZvciB0aGUgY3VycmVudCByZXF1ZXN0CgkgKgoJICogQHBhcmFtCWFycmF5ICRjb29raWVzIGFycmF5IHdpdGggYWxsIGNvb2tpZXMKCSAqIEBwYXJhbQlib29sZWFuICRzZWN1cmUgaXMgdGhlIHNlbmQtY29udGVudCBzZWN1cmUgb3Igbm90PwoJICogQHJldHVybglzdHJpbmcgZm9yIENvb2tpZS1IVFRQLUhlYWRlcgoJICogQGFjY2Vzcwlwcml2YXRlCgkgKi8KCWZ1bmN0aW9uIGdldENvb2tpZXNGb3JSZXF1ZXN0KCRjb29raWVzLCAkc2VjdXJlPWZhbHNlKSB7CgkJJGNvb2tpZV9zdHIgPSAnJzsKCQlpZiAoKCEgaXNfbnVsbCgkY29va2llcykpICYmIChpc19hcnJheSgkY29va2llcykpKSB7CgkJCWZvcmVhY2ggKCRjb29raWVzIGFzICRjb29raWUpIHsKCQkJCWlmICghIGlzX2FycmF5KCRjb29raWUpKSB7CgkJCQkJY29udGludWU7CgkJCQl9CgkgICAgCQkkdGhpcy0+ZGVidWcoImNoZWNrIGNvb2tpZSBmb3IgdmFsaWRpdHk6ICIuJGNvb2tpZVsnbmFtZSddLic9Jy4kY29va2llWyd2YWx1ZSddKTsKCQkJCWlmICgoaXNzZXQoJGNvb2tpZVsnZXhwaXJlcyddKSkgJiYgKCEgZW1wdHkoJGNvb2tpZVsnZXhwaXJlcyddKSkpIHsKCQkJCQlpZiAoc3RydG90aW1lKCRjb29raWVbJ2V4cGlyZXMnXSkgPD0gdGltZSgpKSB7CgkJCQkJCSR0aGlzLT5kZWJ1ZygnY29va2llIGhhcyBleHBpcmVkJyk7CgkJCQkJCWNvbnRpbnVlOwoJCQkJCX0KCQkJCX0KCQkJCWlmICgoaXNzZXQoJGNvb2tpZVsnZG9tYWluJ10pKSAmJiAoISBlbXB0eSgkY29va2llWydkb21haW4nXSkpKSB7CgkJCQkJJGRvbWFpbiA9IHByZWdfcXVvdGUoJGNvb2tpZVsnZG9tYWluJ10pOwoJCQkJCWlmICghIHByZWdfbWF0Y2goIicuKiRkb21haW4kJ2kiLCAkdGhpcy0+aG9zdCkpIHsKCQkJCQkJJHRoaXMtPmRlYnVnKCdjb29raWUgaGFzIGRpZmZlcmVudCBkb21haW4nKTsKCQkJCQkJY29udGludWU7CgkJCQkJfQoJCQkJfQoJCQkJaWYgKChpc3NldCgkY29va2llWydwYXRoJ10pKSAmJiAoISBlbXB0eSgkY29va2llWydwYXRoJ10pKSkgewoJCQkJCSRwYXRoID0gcHJlZ19xdW90ZSgkY29va2llWydwYXRoJ10pOwoJCQkJCWlmICghIHByZWdfbWF0Y2goIideJHBhdGguKidpIiwgJHRoaXMtPnBhdGgpKSB7CgkJCQkJCSR0aGlzLT5kZWJ1ZygnY29va2llIGlzIGZvciBhIGRpZmZlcmVudCBwYXRoJyk7CgkJCQkJCWNvbnRpbnVlOwoJCQkJCX0KCQkJCX0KCQkJCWlmICgoISAkc2VjdXJlKSAmJiAoaXNzZXQoJGNvb2tpZVsnc2VjdXJlJ10pKSAmJiAoJGNvb2tpZVsnc2VjdXJlJ10pKSB7CgkJCQkJJHRoaXMtPmRlYnVnKCdjb29raWUgaXMgc2VjdXJlLCB0cmFuc3BvcnQgaXMgbm90Jyk7CgkJCQkJY29udGludWU7CgkJCQl9CgkJCQkkY29va2llX3N0ciAuPSAkY29va2llWyduYW1lJ10gLiAnPScgLiAkY29va2llWyd2YWx1ZSddIC4gJzsgJzsKCSAgICAJCSR0aGlzLT5kZWJ1ZygnYWRkIGNvb2tpZSB0byBDb29raWUtU3RyaW5nOiAnIC4gJGNvb2tpZVsnbmFtZSddIC4gJz0nIC4gJGNvb2tpZVsndmFsdWUnXSk7CgkJCX0KCQl9CgkJcmV0dXJuICRjb29raWVfc3RyOwogIH0KfQoKPz48P3BocAoKCgovKioKKgoqIHNvYXBfc2VydmVyIGFsbG93cyB0aGUgdXNlciB0byBjcmVhdGUgYSBTT0FQIHNlcnZlcgoqIHRoYXQgaXMgY2FwYWJsZSBvZiByZWNlaXZpbmcgbWVzc2FnZXMgYW5kIHJldHVybmluZyByZXNwb25zZXMKKgoqIE5PVEU6IFdTREwgZnVuY3Rpb25hbGl0eSBpcyBleHBlcmltZW50YWwKKgoqIEBhdXRob3IgICBEaWV0cmljaCBBeWFsYSA8ZGlldHJpY2hAZ2FueDQuY29tPgoqIEB2ZXJzaW9uICAkSWQ6IG51c29hcC5waHAsdiAxLjk0IDIwMDUvMDgvMDQgMDE6Mjc6NDIgc25pY2hvbCBFeHAgJAoqIEBhY2Nlc3MgICBwdWJsaWMKKi8KY2xhc3Mgc29hcF9zZXJ2ZXIgZXh0ZW5kcyBudXNvYXBfYmFzZSB7CgkvKioKCSAqIEhUVFAgaGVhZGVycyBvZiByZXF1ZXN0CgkgKiBAdmFyIGFycmF5CgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJdmFyICRoZWFkZXJzID0gYXJyYXkoKTsKCS8qKgoJICogSFRUUCByZXF1ZXN0CgkgKiBAdmFyIHN0cmluZwoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCXZhciAkcmVxdWVzdCA9ICcnOwoJLyoqCgkgKiBTT0FQIGhlYWRlcnMgZnJvbSByZXF1ZXN0IChpbmNvbXBsZXRlIG5hbWVzcGFjZSByZXNvbHV0aW9uOyBzcGVjaWFsIGNoYXJhY3RlcnMgbm90IGVzY2FwZWQpICh0ZXh0KQoJICogQHZhciBzdHJpbmcKCSAqIEBhY2Nlc3MgcHVibGljCgkgKi8KCXZhciAkcmVxdWVzdEhlYWRlcnMgPSAnJzsKCS8qKgoJICogU09BUCBib2R5IHJlcXVlc3QgcG9ydGlvbiAoaW5jb21wbGV0ZSBuYW1lc3BhY2UgcmVzb2x1dGlvbjsgc3BlY2lhbCBjaGFyYWN0ZXJzIG5vdCBlc2NhcGVkKSAodGV4dCkKCSAqIEB2YXIgc3RyaW5nCgkgKiBAYWNjZXNzIHB1YmxpYwoJICovCgl2YXIgJGRvY3VtZW50ID0gJyc7CgkvKioKCSAqIFNPQVAgcGF5bG9hZCBmb3IgcmVxdWVzdCAodGV4dCkKCSAqIEB2YXIgc3RyaW5nCgkgKiBAYWNjZXNzIHB1YmxpYwoJICovCgl2YXIgJHJlcXVlc3RTT0FQID0gJyc7CgkvKioKCSAqIHJlcXVlc3RlZCBtZXRob2QgbmFtZXNwYWNlIFVSSQoJICogQHZhciBzdHJpbmcKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCgl2YXIgJG1ldGhvZFVSSSA9ICcnOwoJLyoqCgkgKiBuYW1lIG9mIG1ldGhvZCByZXF1ZXN0ZWQKCSAqIEB2YXIgc3RyaW5nCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJdmFyICRtZXRob2RuYW1lID0gJyc7CgkvKioKCSAqIG1ldGhvZCBwYXJhbWV0ZXJzIGZyb20gcmVxdWVzdAoJICogQHZhciBhcnJheQoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCXZhciAkbWV0aG9kcGFyYW1zID0gYXJyYXkoKTsKCS8qKgoJICogU09BUCBBY3Rpb24gZnJvbSByZXF1ZXN0CgkgKiBAdmFyIHN0cmluZwoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCXZhciAkU09BUEFjdGlvbiA9ICcnOwoJLyoqCgkgKiBjaGFyYWN0ZXIgc2V0IGVuY29kaW5nIG9mIGluY29taW5nIChyZXF1ZXN0KSBtZXNzYWdlcwoJICogQHZhciBzdHJpbmcKCSAqIEBhY2Nlc3MgcHVibGljCgkgKi8KCXZhciAkeG1sX2VuY29kaW5nID0gJyc7CgkvKioKCSAqIHRvZ2dsZXMgd2hldGhlciB0aGUgcGFyc2VyIGRlY29kZXMgZWxlbWVudCBjb250ZW50IHcvIHV0ZjhfZGVjb2RlKCkKCSAqIEB2YXIgYm9vbGVhbgoJICogQGFjY2VzcyBwdWJsaWMKCSAqLwogICAgdmFyICRkZWNvZGVfdXRmOCA9IHRydWU7CgoJLyoqCgkgKiBIVFRQIGhlYWRlcnMgb2YgcmVzcG9uc2UKCSAqIEB2YXIgYXJyYXkKCSAqIEBhY2Nlc3MgcHVibGljCgkgKi8KCXZhciAkb3V0Z29pbmdfaGVhZGVycyA9IGFycmF5KCk7CgkvKioKCSAqIEhUVFAgcmVzcG9uc2UKCSAqIEB2YXIgc3RyaW5nCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJdmFyICRyZXNwb25zZSA9ICcnOwoJLyoqCgkgKiBTT0FQIGhlYWRlcnMgZm9yIHJlc3BvbnNlICh0ZXh0KQoJICogQHZhciBzdHJpbmcKCSAqIEBhY2Nlc3MgcHVibGljCgkgKi8KCXZhciAkcmVzcG9uc2VIZWFkZXJzID0gJyc7CgkvKioKCSAqIFNPQVAgcGF5bG9hZCBmb3IgcmVzcG9uc2UgKHRleHQpCgkgKiBAdmFyIHN0cmluZwoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCXZhciAkcmVzcG9uc2VTT0FQID0gJyc7CgkvKioKCSAqIG1ldGhvZCByZXR1cm4gdmFsdWUgdG8gcGxhY2UgaW4gcmVzcG9uc2UKCSAqIEB2YXIgbWl4ZWQKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCgl2YXIgJG1ldGhvZHJldHVybiA9IGZhbHNlOwoJLyoqCgkgKiB3aGV0aGVyICRtZXRob2RyZXR1cm4gaXMgYSBzdHJpbmcgb2YgbGl0ZXJhbCBYTUwKCSAqIEB2YXIgYm9vbGVhbgoJICogQGFjY2VzcyBwdWJsaWMKCSAqLwoJdmFyICRtZXRob2RyZXR1cm5pc2xpdGVyYWx4bWwgPSBmYWxzZTsKCS8qKgoJICogU09BUCBmYXVsdCBmb3IgcmVzcG9uc2UgKG9yIGZhbHNlKQoJICogQHZhciBtaXhlZAoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCXZhciAkZmF1bHQgPSBmYWxzZTsKCS8qKgoJICogdGV4dCBpbmRpY2F0aW9uIG9mIHJlc3VsdCAoZm9yIGRlYnVnZ2luZykKCSAqIEB2YXIgc3RyaW5nCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJdmFyICRyZXN1bHQgPSAnc3VjY2Vzc2Z1bCc7CgoJLyoqCgkgKiBhc3NvYyBhcnJheSBvZiBvcGVyYXRpb25zID0+IG9wRGF0YTsgb3BlcmF0aW9ucyBhcmUgYWRkZWQgYnkgdGhlIHJlZ2lzdGVyKCkKCSAqIG1ldGhvZCBvciBieSBwYXJzaW5nIGFuIGV4dGVybmFsIFdTREwgZGVmaW5pdGlvbgoJICogQHZhciBhcnJheQoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCXZhciAkb3BlcmF0aW9ucyA9IGFycmF5KCk7CgkvKioKCSAqIHdzZGwgaW5zdGFuY2UgKGlmIG9uZSkKCSAqIEB2YXIgbWl4ZWQKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCgl2YXIgJHdzZGwgPSBmYWxzZTsKCS8qKgoJICogVVJMIGZvciBXU0RMIChpZiBvbmUpCgkgKiBAdmFyIG1peGVkCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJdmFyICRleHRlcm5hbFdTRExVUkwgPSBmYWxzZTsKCS8qKgoJICogd2hldGhlciB0byBhcHBlbmQgZGVidWcgdG8gcmVzcG9uc2UgYXMgWE1MIGNvbW1lbnQKCSAqIEB2YXIgYm9vbGVhbgoJICogQGFjY2VzcyBwdWJsaWMKCSAqLwoJdmFyICRkZWJ1Z19mbGFnID0gZmFsc2U7CgoKCS8qKgoJKiBjb25zdHJ1Y3RvcgogICAgKiB0aGUgb3B0aW9uYWwgcGFyYW1ldGVyIGlzIGEgcGF0aCB0byBhIFdTREwgZmlsZSB0aGF0IHlvdSdkIGxpa2UgdG8gYmluZCB0aGUgc2VydmVyIGluc3RhbmNlIHRvLgoJKgogICAgKiBAcGFyYW0gbWl4ZWQgJHdzZGwgZmlsZSBwYXRoIG9yIFVSTCAoc3RyaW5nKSwgb3Igd3NkbCBpbnN0YW5jZSAob2JqZWN0KQoJKiBAYWNjZXNzICAgcHVibGljCgkqLwoJZnVuY3Rpb24gc29hcF9zZXJ2ZXIoJHdzZGw9ZmFsc2UpewoJCXBhcmVudDo6bnVzb2FwX2Jhc2UoKTsKCQkvLyB0dXJuIG9uIGRlYnVnZ2luZz8KCQlnbG9iYWwgJGRlYnVnOwoJCWdsb2JhbCAkSFRUUF9TRVJWRVJfVkFSUzsKCgkJaWYgKGlzc2V0KCRfU0VSVkVSKSkgewoJCQkkdGhpcy0+ZGVidWcoIl9TRVJWRVIgaXMgZGVmaW5lZDoiKTsKCQkJJHRoaXMtPmFwcGVuZERlYnVnKCR0aGlzLT52YXJEdW1wKCRfU0VSVkVSKSk7CgkJfSBlbHNlaWYgKGlzc2V0KCRIVFRQX1NFUlZFUl9WQVJTKSkgewoJCQkkdGhpcy0+ZGVidWcoIkhUVFBfU0VSVkVSX1ZBUlMgaXMgZGVmaW5lZDoiKTsKCQkJJHRoaXMtPmFwcGVuZERlYnVnKCR0aGlzLT52YXJEdW1wKCRIVFRQX1NFUlZFUl9WQVJTKSk7CgkJfSBlbHNlIHsKCQkJJHRoaXMtPmRlYnVnKCJOZWl0aGVyIF9TRVJWRVIgbm9yIEhUVFBfU0VSVkVSX1ZBUlMgaXMgZGVmaW5lZC4iKTsKCQl9CgoJCWlmIChpc3NldCgkZGVidWcpKSB7CgkJCSR0aGlzLT5kZWJ1ZygiSW4gc29hcF9zZXJ2ZXIsIHNldCBkZWJ1Z19mbGFnPSRkZWJ1ZyBiYXNlZCBvbiBnbG9iYWwgZmxhZyIpOwoJCQkkdGhpcy0+ZGVidWdfZmxhZyA9ICRkZWJ1ZzsKCQl9IGVsc2VpZiAoaXNzZXQoJF9TRVJWRVJbJ1FVRVJZX1NUUklORyddKSkgewoJCQkkcXMgPSBleHBsb2RlKCcmJywgJF9TRVJWRVJbJ1FVRVJZX1NUUklORyddKTsKCQkJZm9yZWFjaCAoJHFzIGFzICR2KSB7CgkJCQlpZiAoc3Vic3RyKCR2LCAwLCA2KSA9PSAnZGVidWc9JykgewoJCQkJCSR0aGlzLT5kZWJ1ZygiSW4gc29hcF9zZXJ2ZXIsIHNldCBkZWJ1Z19mbGFnPSIgLiBzdWJzdHIoJHYsIDYpIC4gIiBiYXNlZCBvbiBxdWVyeSBzdHJpbmcgIzEiKTsKCQkJCQkkdGhpcy0+ZGVidWdfZmxhZyA9IHN1YnN0cigkdiwgNik7CgkJCQl9CgkJCX0KCQl9IGVsc2VpZiAoaXNzZXQoJEhUVFBfU0VSVkVSX1ZBUlNbJ1FVRVJZX1NUUklORyddKSkgewoJCQkkcXMgPSBleHBsb2RlKCcmJywgJEhUVFBfU0VSVkVSX1ZBUlNbJ1FVRVJZX1NUUklORyddKTsKCQkJZm9yZWFjaCAoJHFzIGFzICR2KSB7CgkJCQlpZiAoc3Vic3RyKCR2LCAwLCA2KSA9PSAnZGVidWc9JykgewoJCQkJCSR0aGlzLT5kZWJ1ZygiSW4gc29hcF9zZXJ2ZXIsIHNldCBkZWJ1Z19mbGFnPSIgLiBzdWJzdHIoJHYsIDYpIC4gIiBiYXNlZCBvbiBxdWVyeSBzdHJpbmcgIzIiKTsKCQkJCQkkdGhpcy0+ZGVidWdfZmxhZyA9IHN1YnN0cigkdiwgNik7CgkJCQl9CgkJCX0KCQl9CgoJCS8vIHdzZGwKCQlpZigkd3NkbCl7CgkJCSR0aGlzLT5kZWJ1ZygiSW4gc29hcF9zZXJ2ZXIsIFdTREwgaXMgc3BlY2lmaWVkIik7CgkJCWlmIChpc19vYmplY3QoJHdzZGwpICYmIChnZXRfY2xhc3MoJHdzZGwpID09ICd3c2RsJykpIHsKCQkJCSR0aGlzLT53c2RsID0gJHdzZGw7CgkJCQkkdGhpcy0+ZXh0ZXJuYWxXU0RMVVJMID0gJHRoaXMtPndzZGwtPndzZGw7CgkJCQkkdGhpcy0+ZGVidWcoJ1VzZSBleGlzdGluZyB3c2RsIGluc3RhbmNlIGZyb20gJyAuICR0aGlzLT5leHRlcm5hbFdTRExVUkwpOwoJCQl9IGVsc2UgewoJCQkJJHRoaXMtPmRlYnVnKCdDcmVhdGUgd3NkbCBmcm9tICcgLiAkd3NkbCk7CgkJCQkkdGhpcy0+d3NkbCA9IG5ldyB3c2RsKCR3c2RsKTsKCQkJCSR0aGlzLT5leHRlcm5hbFdTRExVUkwgPSAkd3NkbDsKCQkJfQoJCQkkdGhpcy0+YXBwZW5kRGVidWcoJHRoaXMtPndzZGwtPmdldERlYnVnKCkpOwoJCQkkdGhpcy0+d3NkbC0+Y2xlYXJEZWJ1ZygpOwoJCQlpZigkZXJyID0gJHRoaXMtPndzZGwtPmdldEVycm9yKCkpewoJCQkJZGllKCdXU0RMIEVSUk9SOiAnLiRlcnIpOwoJCQl9CgkJfQoJfQoKCS8qKgoJKiBwcm9jZXNzZXMgcmVxdWVzdCBhbmQgcmV0dXJucyByZXNwb25zZQoJKgoJKiBAcGFyYW0gICAgc3RyaW5nICRkYXRhIHVzdWFsbHkgaXMgdGhlIHZhbHVlIG9mICRIVFRQX1JBV19QT1NUX0RBVEEKCSogQGFjY2VzcyAgIHB1YmxpYwoJKi8KCWZ1bmN0aW9uIHNlcnZpY2UoJGRhdGEpewoJCWdsb2JhbCAkSFRUUF9TRVJWRVJfVkFSUzsKCgkJaWYgKGlzc2V0KCRfU0VSVkVSWydRVUVSWV9TVFJJTkcnXSkpIHsKCQkJJHFzID0gJF9TRVJWRVJbJ1FVRVJZX1NUUklORyddOwoJCX0gZWxzZWlmIChpc3NldCgkSFRUUF9TRVJWRVJfVkFSU1snUVVFUllfU1RSSU5HJ10pKSB7CgkJCSRxcyA9ICRIVFRQX1NFUlZFUl9WQVJTWydRVUVSWV9TVFJJTkcnXTsKCQl9IGVsc2UgewoJCQkkcXMgPSAnJzsKCQl9CgkJJHRoaXMtPmRlYnVnKCJJbiBzZXJ2aWNlLCBxdWVyeSBzdHJpbmc9JHFzIik7CgoJCWlmIChlcmVnKCd3c2RsJywgJHFzKSApewoJCQkkdGhpcy0+ZGVidWcoIkluIHNlcnZpY2UsIHRoaXMgaXMgYSByZXF1ZXN0IGZvciBXU0RMIik7CgkJCWlmKCR0aGlzLT5leHRlcm5hbFdTRExVUkwpewogICAgICAgICAgICAgIGlmIChzdHJwb3MoJHRoaXMtPmV4dGVybmFsV1NETFVSTCwiOi8vIikhPT1mYWxzZSkgeyAvLyBhc3N1bWUgVVJMCgkJCQloZWFkZXIoJ0xvY2F0aW9uOiAnLiR0aGlzLT5leHRlcm5hbFdTRExVUkwpOwogICAgICAgICAgICAgIH0gZWxzZSB7IC8vIGFzc3VtZSBmaWxlCiAgICAgICAgICAgICAgICBoZWFkZXIoIkNvbnRlbnQtVHlwZTogdGV4dC94bWxcclxuIik7CiAgICAgICAgICAgICAgICAkZnAgPSBmb3BlbigkdGhpcy0+ZXh0ZXJuYWxXU0RMVVJMLCAncicpOwogICAgICAgICAgICAgICAgZnBhc3N0aHJ1KCRmcCk7CiAgICAgICAgICAgICAgfQoJCQl9IGVsc2VpZiAoJHRoaXMtPndzZGwpIHsKCQkJCWhlYWRlcigiQ29udGVudC1UeXBlOiB0ZXh0L3htbDsgY2hhcnNldD1JU08tODg1OS0xXHJcbiIpOwoJCQkJcHJpbnQgJHRoaXMtPndzZGwtPnNlcmlhbGl6ZSgkdGhpcy0+ZGVidWdfZmxhZyk7CgkJCQlpZiAoJHRoaXMtPmRlYnVnX2ZsYWcpIHsKCQkJCQkkdGhpcy0+ZGVidWcoJ3dzZGw6Jyk7CgkJCQkJJHRoaXMtPmFwcGVuZERlYnVnKCR0aGlzLT52YXJEdW1wKCR0aGlzLT53c2RsKSk7CgkJCQkJcHJpbnQgJHRoaXMtPmdldERlYnVnQXNYTUxDb21tZW50KCk7CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQloZWFkZXIoIkNvbnRlbnQtVHlwZTogdGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTFcclxuIik7CgkJCQlwcmludCAiVGhpcyBzZXJ2aWNlIGRvZXMgbm90IHByb3ZpZGUgV1NETCI7CgkJCX0KCQl9IGVsc2VpZiAoJGRhdGEgPT0gJycgJiYgJHRoaXMtPndzZGwpIHsKCQkJJHRoaXMtPmRlYnVnKCJJbiBzZXJ2aWNlLCB0aGVyZSBpcyBubyBkYXRhLCBzbyByZXR1cm4gV2ViIGRlc2NyaXB0aW9uIik7CgkJCXByaW50ICR0aGlzLT53c2RsLT53ZWJEZXNjcmlwdGlvbigpOwoJCX0gZWxzZSB7CgkJCSR0aGlzLT5kZWJ1ZygiSW4gc2VydmljZSwgaW52b2tlIHRoZSByZXF1ZXN0Iik7CgkJCSR0aGlzLT5wYXJzZV9yZXF1ZXN0KCRkYXRhKTsKCQkJaWYgKCEgJHRoaXMtPmZhdWx0KSB7CgkJCQkkdGhpcy0+aW52b2tlX21ldGhvZCgpOwoJCQl9CgkJCWlmICghICR0aGlzLT5mYXVsdCkgewoJCQkJJHRoaXMtPnNlcmlhbGl6ZV9yZXR1cm4oKTsKCQkJfQoJCQkkdGhpcy0+c2VuZF9yZXNwb25zZSgpOwoJCX0KCX0KCgkvKioKCSogcGFyc2VzIEhUVFAgcmVxdWVzdCBoZWFkZXJzLgoJKgoJKiBUaGUgZm9sbG93aW5nIGZpZWxkcyBhcmUgc2V0IGJ5IHRoaXMgZnVuY3Rpb24gKHdoZW4gc3VjY2Vzc2Z1bCkKCSoKCSogaGVhZGVycwoJKiByZXF1ZXN0CgkqIHhtbF9lbmNvZGluZwoJKiBTT0FQQWN0aW9uCgkqCgkqIEBhY2Nlc3MgICBwcml2YXRlCgkqLwoJZnVuY3Rpb24gcGFyc2VfaHR0cF9oZWFkZXJzKCkgewoJCWdsb2JhbCAkSFRUUF9TRVJWRVJfVkFSUzsKCgkJJHRoaXMtPnJlcXVlc3QgPSAnJzsKCQkkdGhpcy0+U09BUEFjdGlvbiA9ICcnOwoJCWlmKGZ1bmN0aW9uX2V4aXN0cygnZ2V0YWxsaGVhZGVycycpKXsKCQkJJHRoaXMtPmRlYnVnKCJJbiBwYXJzZV9odHRwX2hlYWRlcnMsIHVzZSBnZXRhbGxoZWFkZXJzIik7CgkJCSRoZWFkZXJzID0gZ2V0YWxsaGVhZGVycygpOwoJCQlmb3JlYWNoKCRoZWFkZXJzIGFzICRrPT4kdil7CgkJCQkkayA9IHN0cnRvbG93ZXIoJGspOwoJCQkJJHRoaXMtPmhlYWRlcnNbJGtdID0gJHY7CgkJCQkkdGhpcy0+cmVxdWVzdCAuPSAiJGs6ICR2XHJcbiI7CgkJCQkkdGhpcy0+ZGVidWcoIiRrOiAkdiIpOwoJCQl9CgkJCS8vIGdldCBTT0FQQWN0aW9uIGhlYWRlcgoJCQlpZihpc3NldCgkdGhpcy0+aGVhZGVyc1snc29hcGFjdGlvbiddKSl7CgkJCQkkdGhpcy0+U09BUEFjdGlvbiA9IHN0cl9yZXBsYWNlKCciJywnJywkdGhpcy0+aGVhZGVyc1snc29hcGFjdGlvbiddKTsKCQkJfQoJCQkvLyBnZXQgdGhlIGNoYXJhY3RlciBlbmNvZGluZyBvZiB0aGUgaW5jb21pbmcgcmVxdWVzdAoJCQlpZihpc3NldCgkdGhpcy0+aGVhZGVyc1snY29udGVudC10eXBlJ10pICYmIHN0cnBvcygkdGhpcy0+aGVhZGVyc1snY29udGVudC10eXBlJ10sJz0nKSl7CgkJCQkkZW5jID0gc3RyX3JlcGxhY2UoJyInLCcnLHN1YnN0cihzdHJzdHIoJHRoaXMtPmhlYWRlcnNbImNvbnRlbnQtdHlwZSJdLCc9JyksMSkpOwoJCQkJaWYoZXJlZ2koJ14oSVNPLTg4NTktMXxVUy1BU0NJSXxVVEYtOCkkJywkZW5jKSl7CgkJCQkJJHRoaXMtPnhtbF9lbmNvZGluZyA9IHN0cnRvdXBwZXIoJGVuYyk7CgkJCQl9IGVsc2UgewoJCQkJCSR0aGlzLT54bWxfZW5jb2RpbmcgPSAnVVMtQVNDSUknOwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJLy8gc2hvdWxkIGJlIFVTLUFTQ0lJIGZvciBIVFRQIDEuMCBvciBJU08tODg1OS0xIGZvciBIVFRQIDEuMQoJCQkJJHRoaXMtPnhtbF9lbmNvZGluZyA9ICdJU08tODg1OS0xJzsKCQkJfQoJCX0gZWxzZWlmKGlzc2V0KCRfU0VSVkVSKSAmJiBpc19hcnJheSgkX1NFUlZFUikpewoJCQkkdGhpcy0+ZGVidWcoIkluIHBhcnNlX2h0dHBfaGVhZGVycywgdXNlIF9TRVJWRVIiKTsKCQkJZm9yZWFjaCAoJF9TRVJWRVIgYXMgJGsgPT4gJHYpIHsKCQkJCWlmIChzdWJzdHIoJGssIDAsIDUpID09ICdIVFRQXycpIHsKCQkJCQkkayA9IHN0cl9yZXBsYWNlKCcgJywgJy0nLCBzdHJ0b2xvd2VyKHN0cl9yZXBsYWNlKCdfJywgJyAnLCBzdWJzdHIoJGssIDUpKSkpOyAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkayA9IHN0cnRvbG93ZXIoc3Vic3RyKCRrLCA1KSk7CgkJCQl9IGVsc2UgewoJCQkJCSRrID0gc3RyX3JlcGxhY2UoJyAnLCAnLScsIHN0cnRvbG93ZXIoc3RyX3JlcGxhY2UoJ18nLCAnICcsICRrKSkpOyAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkayA9IHN0cnRvbG93ZXIoJGspOwoJCQkJfQoJCQkJaWYgKCRrID09ICdzb2FwYWN0aW9uJykgewoJCQkJCS8vIGdldCBTT0FQQWN0aW9uIGhlYWRlcgoJCQkJCSRrID0gJ1NPQVBBY3Rpb24nOwoJCQkJCSR2ID0gc3RyX3JlcGxhY2UoJyInLCAnJywgJHYpOwoJCQkJCSR2ID0gc3RyX3JlcGxhY2UoJ1xcJywgJycsICR2KTsKCQkJCQkkdGhpcy0+U09BUEFjdGlvbiA9ICR2OwoJCQkJfSBlbHNlIGlmICgkayA9PSAnY29udGVudC10eXBlJykgewoJCQkJCS8vIGdldCB0aGUgY2hhcmFjdGVyIGVuY29kaW5nIG9mIHRoZSBpbmNvbWluZyByZXF1ZXN0CgkJCQkJaWYgKHN0cnBvcygkdiwgJz0nKSkgewoJCQkJCQkkZW5jID0gc3Vic3RyKHN0cnN0cigkdiwgJz0nKSwgMSk7CgkJCQkJCSRlbmMgPSBzdHJfcmVwbGFjZSgnIicsICcnLCAkZW5jKTsKCQkJCQkJJGVuYyA9IHN0cl9yZXBsYWNlKCdcXCcsICcnLCAkZW5jKTsKCQkJCQkJaWYgKGVyZWdpKCdeKElTTy04ODU5LTF8VVMtQVNDSUl8VVRGLTgpJCcsICRlbmMpKSB7CgkJCQkJCQkkdGhpcy0+eG1sX2VuY29kaW5nID0gc3RydG91cHBlcigkZW5jKTsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCSR0aGlzLT54bWxfZW5jb2RpbmcgPSAnVVMtQVNDSUknOwoJCQkJCQl9CgkJCQkJfSBlbHNlIHsKCQkJCQkJLy8gc2hvdWxkIGJlIFVTLUFTQ0lJIGZvciBIVFRQIDEuMCBvciBJU08tODg1OS0xIGZvciBIVFRQIDEuMQoJCQkJCQkkdGhpcy0+eG1sX2VuY29kaW5nID0gJ0lTTy04ODU5LTEnOwoJCQkJCX0KCQkJCX0KCQkJCSR0aGlzLT5oZWFkZXJzWyRrXSA9ICR2OwoJCQkJJHRoaXMtPnJlcXVlc3QgLj0gIiRrOiAkdlxyXG4iOwoJCQkJJHRoaXMtPmRlYnVnKCIkazogJHYiKTsKCQkJfQoJCX0gZWxzZWlmIChpc19hcnJheSgkSFRUUF9TRVJWRVJfVkFSUykpIHsKCQkJJHRoaXMtPmRlYnVnKCJJbiBwYXJzZV9odHRwX2hlYWRlcnMsIHVzZSBIVFRQX1NFUlZFUl9WQVJTIik7CgkJCWZvcmVhY2ggKCRIVFRQX1NFUlZFUl9WQVJTIGFzICRrID0+ICR2KSB7CgkJCQlpZiAoc3Vic3RyKCRrLCAwLCA1KSA9PSAnSFRUUF8nKSB7CgkJCQkJJGsgPSBzdHJfcmVwbGFjZSgnICcsICctJywgc3RydG9sb3dlcihzdHJfcmVwbGFjZSgnXycsICcgJywgc3Vic3RyKCRrLCA1KSkpKTsgCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGsgPSBzdHJ0b2xvd2VyKHN1YnN0cigkaywgNSkpOwoJCQkJfSBlbHNlIHsKCQkJCQkkayA9IHN0cl9yZXBsYWNlKCcgJywgJy0nLCBzdHJ0b2xvd2VyKHN0cl9yZXBsYWNlKCdfJywgJyAnLCAkaykpKTsgCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGsgPSBzdHJ0b2xvd2VyKCRrKTsKCQkJCX0KCQkJCWlmICgkayA9PSAnc29hcGFjdGlvbicpIHsKCQkJCQkvLyBnZXQgU09BUEFjdGlvbiBoZWFkZXIKCQkJCQkkayA9ICdTT0FQQWN0aW9uJzsKCQkJCQkkdiA9IHN0cl9yZXBsYWNlKCciJywgJycsICR2KTsKCQkJCQkkdiA9IHN0cl9yZXBsYWNlKCdcXCcsICcnLCAkdik7CgkJCQkJJHRoaXMtPlNPQVBBY3Rpb24gPSAkdjsKCQkJCX0gZWxzZSBpZiAoJGsgPT0gJ2NvbnRlbnQtdHlwZScpIHsKCQkJCQkvLyBnZXQgdGhlIGNoYXJhY3RlciBlbmNvZGluZyBvZiB0aGUgaW5jb21pbmcgcmVxdWVzdAoJCQkJCWlmIChzdHJwb3MoJHYsICc9JykpIHsKCQkJCQkJJGVuYyA9IHN1YnN0cihzdHJzdHIoJHYsICc9JyksIDEpOwoJCQkJCQkkZW5jID0gc3RyX3JlcGxhY2UoJyInLCAnJywgJGVuYyk7CgkJCQkJCSRlbmMgPSBzdHJfcmVwbGFjZSgnXFwnLCAnJywgJGVuYyk7CgkJCQkJCWlmIChlcmVnaSgnXihJU08tODg1OS0xfFVTLUFTQ0lJfFVURi04KSQnLCAkZW5jKSkgewoJCQkJCQkJJHRoaXMtPnhtbF9lbmNvZGluZyA9IHN0cnRvdXBwZXIoJGVuYyk7CgkJCQkJCX0gZWxzZSB7CgkJCQkJCQkkdGhpcy0+eG1sX2VuY29kaW5nID0gJ1VTLUFTQ0lJJzsKCQkJCQkJfQoJCQkJCX0gZWxzZSB7CgkJCQkJCS8vIHNob3VsZCBiZSBVUy1BU0NJSSBmb3IgSFRUUCAxLjAgb3IgSVNPLTg4NTktMSBmb3IgSFRUUCAxLjEKCQkJCQkJJHRoaXMtPnhtbF9lbmNvZGluZyA9ICdJU08tODg1OS0xJzsKCQkJCQl9CgkJCQl9CgkJCQkkdGhpcy0+aGVhZGVyc1ska10gPSAkdjsKCQkJCSR0aGlzLT5yZXF1ZXN0IC49ICIkazogJHZcclxuIjsKCQkJCSR0aGlzLT5kZWJ1ZygiJGs6ICR2Iik7CgkJCX0KCQl9IGVsc2UgewoJCQkkdGhpcy0+ZGVidWcoIkluIHBhcnNlX2h0dHBfaGVhZGVycywgSFRUUCBoZWFkZXJzIG5vdCBhY2Nlc3NpYmxlIik7CgkJCSR0aGlzLT5zZXRFcnJvcigiSFRUUCBoZWFkZXJzIG5vdCBhY2Nlc3NpYmxlIik7CgkJfQoJfQoKCS8qKgoJKiBwYXJzZXMgYSByZXF1ZXN0CgkqCgkqIFRoZSBmb2xsb3dpbmcgZmllbGRzIGFyZSBzZXQgYnkgdGhpcyBmdW5jdGlvbiAod2hlbiBzdWNjZXNzZnVsKQoJKgoJKiBoZWFkZXJzCgkqIHJlcXVlc3QKCSogeG1sX2VuY29kaW5nCgkqIFNPQVBBY3Rpb24KCSogcmVxdWVzdAoJKiByZXF1ZXN0U09BUAoJKiBtZXRob2RVUkkKCSogbWV0aG9kbmFtZQoJKiBtZXRob2RwYXJhbXMKCSogcmVxdWVzdEhlYWRlcnMKCSogZG9jdW1lbnQKCSoKCSogVGhpcyBzZXRzIHRoZSBmYXVsdCBmaWVsZCBvbiBlcnJvcgoJKgoJKiBAcGFyYW0gICAgc3RyaW5nICRkYXRhIFhNTCBzdHJpbmcKCSogQGFjY2VzcyAgIHByaXZhdGUKCSovCglmdW5jdGlvbiBwYXJzZV9yZXF1ZXN0KCRkYXRhPScnKSB7CgkJJHRoaXMtPmRlYnVnKCdlbnRlcmluZyBwYXJzZV9yZXF1ZXN0KCknKTsKCQkkdGhpcy0+cGFyc2VfaHR0cF9oZWFkZXJzKCk7CgkJJHRoaXMtPmRlYnVnKCdnb3QgY2hhcmFjdGVyIGVuY29kaW5nOiAnLiR0aGlzLT54bWxfZW5jb2RpbmcpOwoJCS8vIHVuY29tcHJlc3MgaWYgbmVjZXNzYXJ5CgkJaWYgKGlzc2V0KCR0aGlzLT5oZWFkZXJzWydjb250ZW50LWVuY29kaW5nJ10pICYmICR0aGlzLT5oZWFkZXJzWydjb250ZW50LWVuY29kaW5nJ10gIT0gJycpIHsKCQkJJHRoaXMtPmRlYnVnKCdnb3QgY29udGVudCBlbmNvZGluZzogJyAuICR0aGlzLT5oZWFkZXJzWydjb250ZW50LWVuY29kaW5nJ10pOwoJCQlpZiAoJHRoaXMtPmhlYWRlcnNbJ2NvbnRlbnQtZW5jb2RpbmcnXSA9PSAnZGVmbGF0ZScgfHwgJHRoaXMtPmhlYWRlcnNbJ2NvbnRlbnQtZW5jb2RpbmcnXSA9PSAnZ3ppcCcpIHsKCQkgICAgCS8vIGlmIGRlY29kaW5nIHdvcmtzLCB1c2UgaXQuIGVsc2UgYXNzdW1lIGRhdGEgd2Fzbid0IGd6ZW5jb2RlZAoJCQkJaWYgKGZ1bmN0aW9uX2V4aXN0cygnZ3p1bmNvbXByZXNzJykpIHsKCQkJCQlpZiAoJHRoaXMtPmhlYWRlcnNbJ2NvbnRlbnQtZW5jb2RpbmcnXSA9PSAnZGVmbGF0ZScgJiYgJGRlZ3pkYXRhID0gQGd6dW5jb21wcmVzcygkZGF0YSkpIHsKCQkJCQkJJGRhdGEgPSAkZGVnemRhdGE7CgkJCQkJfSBlbHNlaWYgKCR0aGlzLT5oZWFkZXJzWydjb250ZW50LWVuY29kaW5nJ10gPT0gJ2d6aXAnICYmICRkZWd6ZGF0YSA9IGd6aW5mbGF0ZShzdWJzdHIoJGRhdGEsIDEwKSkpIHsKCQkJCQkJJGRhdGEgPSAkZGVnemRhdGE7CgkJCQkJfSBlbHNlIHsKCQkJCQkJJHRoaXMtPmZhdWx0KCdDbGllbnQnLCAnRXJyb3JzIG9jY3VycmVkIHdoZW4gdHJ5aW5nIHRvIGRlY29kZSB0aGUgZGF0YScpOwoJCQkJCQlyZXR1cm47CgkJCQkJfQoJCQkJfSBlbHNlIHsKCQkJCQkkdGhpcy0+ZmF1bHQoJ0NsaWVudCcsICdUaGlzIFNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IGNvbXByZXNzZWQgZGF0YScpOwoJCQkJCXJldHVybjsKCQkJCX0KCQkJfQoJCX0KCQkkdGhpcy0+cmVxdWVzdCAuPSAiXHJcbiIuJGRhdGE7CgkJJGRhdGEgPSAkdGhpcy0+cGFyc2VSZXF1ZXN0KCR0aGlzLT5oZWFkZXJzLCAkZGF0YSk7CgkJJHRoaXMtPnJlcXVlc3RTT0FQID0gJGRhdGE7CgkJJHRoaXMtPmRlYnVnKCdsZWF2aW5nIHBhcnNlX3JlcXVlc3QnKTsKCX0KCgkvKioKCSogaW52b2tlcyBhIFBIUCBmdW5jdGlvbiBmb3IgdGhlIHJlcXVlc3RlZCBTT0FQIG1ldGhvZAoJKgoJKiBUaGUgZm9sbG93aW5nIGZpZWxkcyBhcmUgc2V0IGJ5IHRoaXMgZnVuY3Rpb24gKHdoZW4gc3VjY2Vzc2Z1bCkKCSoKCSogbWV0aG9kcmV0dXJuCgkqCgkqIE5vdGUgdGhhdCB0aGUgUEhQIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIG1heSBhbHNvIHNldCB0aGUgZm9sbG93aW5nCgkqIGZpZWxkcyB0byBhZmZlY3QgdGhlIHJlc3BvbnNlIHNlbnQgdG8gdGhlIGNsaWVudAoJKgoJKiByZXNwb25zZUhlYWRlcnMKCSogb3V0Z29pbmdfaGVhZGVycwoJKgoJKiBUaGlzIHNldHMgdGhlIGZhdWx0IGZpZWxkIG9uIGVycm9yCgkqCgkqIEBhY2Nlc3MgICBwcml2YXRlCgkqLwoJZnVuY3Rpb24gaW52b2tlX21ldGhvZCgpIHsKCQkkdGhpcy0+ZGVidWcoJ2luIGludm9rZV9tZXRob2QsIG1ldGhvZG5hbWU9JyAuICR0aGlzLT5tZXRob2RuYW1lIC4gJyBtZXRob2RVUkk9JyAuICR0aGlzLT5tZXRob2RVUkkgLiAnIFNPQVBBY3Rpb249JyAuICR0aGlzLT5TT0FQQWN0aW9uKTsKCgkJaWYgKCR0aGlzLT53c2RsKSB7CgkJCWlmICgkdGhpcy0+b3BEYXRhID0gJHRoaXMtPndzZGwtPmdldE9wZXJhdGlvbkRhdGEoJHRoaXMtPm1ldGhvZG5hbWUpKSB7CgkJCQkkdGhpcy0+ZGVidWcoJ2luIGludm9rZV9tZXRob2QsIGZvdW5kIFdTREwgb3BlcmF0aW9uPScgLiAkdGhpcy0+bWV0aG9kbmFtZSk7CgkJCQkkdGhpcy0+YXBwZW5kRGVidWcoJ29wRGF0YT0nIC4gJHRoaXMtPnZhckR1bXAoJHRoaXMtPm9wRGF0YSkpOwoJCQl9IGVsc2VpZiAoJHRoaXMtPm9wRGF0YSA9ICR0aGlzLT53c2RsLT5nZXRPcGVyYXRpb25EYXRhRm9yU29hcEFjdGlvbigkdGhpcy0+U09BUEFjdGlvbikpIHsKCQkJCS8vIE5vdGU6IGhvcGVmdWxseSB0aGlzIGNhc2Ugd2lsbCBvbmx5IGJlIHVzZWQgZm9yIGRvYy9saXQsIHNpbmNlIHJwYyBzZXJ2aWNlcyBzaG91bGQgaGF2ZSB3cmFwcGVyIGVsZW1lbnQKCQkJCSR0aGlzLT5kZWJ1ZygnaW4gaW52b2tlX21ldGhvZCwgZm91bmQgV1NETCBzb2FwQWN0aW9uPScgLiAkdGhpcy0+U09BUEFjdGlvbiAuICcgZm9yIG9wZXJhdGlvbj0nIC4gJHRoaXMtPm9wRGF0YVsnbmFtZSddKTsKCQkJCSR0aGlzLT5hcHBlbmREZWJ1Zygnb3BEYXRhPScgLiAkdGhpcy0+dmFyRHVtcCgkdGhpcy0+b3BEYXRhKSk7CgkJCQkkdGhpcy0+bWV0aG9kbmFtZSA9ICR0aGlzLT5vcERhdGFbJ25hbWUnXTsKCQkJfSBlbHNlIHsKCQkJCSR0aGlzLT5kZWJ1ZygnaW4gaW52b2tlX21ldGhvZCwgbm8gV1NETCBmb3Igb3BlcmF0aW9uPScgLiAkdGhpcy0+bWV0aG9kbmFtZSk7CgkJCQkkdGhpcy0+ZmF1bHQoJ0NsaWVudCcsICJPcGVyYXRpb24gJyIgLiAkdGhpcy0+bWV0aG9kbmFtZSAuICInIGlzIG5vdCBkZWZpbmVkIGluIHRoZSBXU0RMIGZvciB0aGlzIHNlcnZpY2UiKTsKCQkJCXJldHVybjsKCQkJfQoJCX0gZWxzZSB7CgkJCSR0aGlzLT5kZWJ1ZygnaW4gaW52b2tlX21ldGhvZCwgbm8gV1NETCB0byB2YWxpZGF0ZSBtZXRob2QnKTsKCQl9CgoJCS8vIGlmIGEgLiBpcyBwcmVzZW50IGluICR0aGlzLT5tZXRob2RuYW1lLCB3ZSBzZWUgaWYgdGhlcmUgaXMgYSBjbGFzcyBpbiBzY29wZSwKCQkvLyB3aGljaCBjb3VsZCBiZSByZWZlcnJlZCB0by4gV2Ugd2lsbCBhbHNvIGRpc3Rpbmd1aXNoIGJldHdlZW4gdHdvIGRlbGltaW5hdG9ycywKCQkvLyB0byBhbGxvdyBtZXRob2RzIHRvIGJlIGNhbGxlZCBhIHRoZSBjbGFzcyBvciBhbiBpbnN0YW5jZQoJCSRjbGFzcyA9ICcnOwoJCSRtZXRob2QgPSAnJzsKCQlpZiAoc3RycG9zKCR0aGlzLT5tZXRob2RuYW1lLCAnLi4nKSA+IDApIHsKCQkJJGRlbGltID0gJy4uJzsKCQl9IGVsc2UgaWYgKHN0cnBvcygkdGhpcy0+bWV0aG9kbmFtZSwgJy4nKSA+IDApIHsKCQkJJGRlbGltID0gJy4nOwoJCX0gZWxzZSB7CgkJCSRkZWxpbSA9ICcnOwoJCX0KCgkJaWYgKHN0cmxlbigkZGVsaW0pID4gMCAmJiBzdWJzdHJfY291bnQoJHRoaXMtPm1ldGhvZG5hbWUsICRkZWxpbSkgPT0gMSAmJgoJCQljbGFzc19leGlzdHMoc3Vic3RyKCR0aGlzLT5tZXRob2RuYW1lLCAwLCBzdHJwb3MoJHRoaXMtPm1ldGhvZG5hbWUsICRkZWxpbSkpKSkgewoJCQkvLyBnZXQgdGhlIGNsYXNzIGFuZCBtZXRob2QgbmFtZQoJCQkkY2xhc3MgPSBzdWJzdHIoJHRoaXMtPm1ldGhvZG5hbWUsIDAsIHN0cnBvcygkdGhpcy0+bWV0aG9kbmFtZSwgJGRlbGltKSk7CgkJCSRtZXRob2QgPSBzdWJzdHIoJHRoaXMtPm1ldGhvZG5hbWUsIHN0cnBvcygkdGhpcy0+bWV0aG9kbmFtZSwgJGRlbGltKSArIHN0cmxlbigkZGVsaW0pKTsKCQkJJHRoaXMtPmRlYnVnKCJpbiBpbnZva2VfbWV0aG9kLCBjbGFzcz0kY2xhc3MgbWV0aG9kPSRtZXRob2QgZGVsaW09JGRlbGltIik7CgkJfQoKCQkvLyBkb2VzIG1ldGhvZCBleGlzdD8KCQlpZiAoJGNsYXNzID09ICcnKSB7CgkJCWlmICghZnVuY3Rpb25fZXhpc3RzKCR0aGlzLT5tZXRob2RuYW1lKSkgewoJCQkJJHRoaXMtPmRlYnVnKCJpbiBpbnZva2VfbWV0aG9kLCBmdW5jdGlvbiAnJHRoaXMtPm1ldGhvZG5hbWUnIG5vdCBmb3VuZCEiKTsKCQkJCSR0aGlzLT5yZXN1bHQgPSAnZmF1bHQ6IG1ldGhvZCBub3QgZm91bmQnOwoJCQkJJHRoaXMtPmZhdWx0KCdDbGllbnQnLCJtZXRob2QgJyR0aGlzLT5tZXRob2RuYW1lJyBub3QgZGVmaW5lZCBpbiBzZXJ2aWNlIik7CgkJCQlyZXR1cm47CgkJCX0KCQl9IGVsc2UgewoJCQkkbWV0aG9kX3RvX2NvbXBhcmUgPSAoc3Vic3RyKHBocHZlcnNpb24oKSwgMCwgMikgPT0gJzQuJykgPyBzdHJ0b2xvd2VyKCRtZXRob2QpIDogJG1ldGhvZDsKCQkJaWYgKCFpbl9hcnJheSgkbWV0aG9kX3RvX2NvbXBhcmUsIGdldF9jbGFzc19tZXRob2RzKCRjbGFzcykpKSB7CgkJCQkkdGhpcy0+ZGVidWcoImluIGludm9rZV9tZXRob2QsIG1ldGhvZCAnJHRoaXMtPm1ldGhvZG5hbWUnIG5vdCBmb3VuZCBpbiBjbGFzcyAnJGNsYXNzJyEiKTsKCQkJCSR0aGlzLT5yZXN1bHQgPSAnZmF1bHQ6IG1ldGhvZCBub3QgZm91bmQnOwoJCQkJJHRoaXMtPmZhdWx0KCdDbGllbnQnLCJtZXRob2QgJyR0aGlzLT5tZXRob2RuYW1lJyBub3QgZGVmaW5lZCBpbiBzZXJ2aWNlIik7CgkJCQlyZXR1cm47CgkJCX0KCQl9CgoJCS8vIGV2YWx1YXRlIG1lc3NhZ2UsIGdldHRpbmcgYmFjayBwYXJhbWV0ZXJzCgkJLy8gdmVyaWZ5IHRoYXQgcmVxdWVzdCBwYXJhbWV0ZXJzIG1hdGNoIHRoZSBtZXRob2QncyBzaWduYXR1cmUKCQlpZighICR0aGlzLT52ZXJpZnlfbWV0aG9kKCR0aGlzLT5tZXRob2RuYW1lLCR0aGlzLT5tZXRob2RwYXJhbXMpKXsKCQkJLy8gZGVidWcKCQkJJHRoaXMtPmRlYnVnKCdFUlJPUjogcmVxdWVzdCBub3QgdmVyaWZpZWQgYWdhaW5zdCBtZXRob2Qgc2lnbmF0dXJlJyk7CgkJCSR0aGlzLT5yZXN1bHQgPSAnZmF1bHQ6IHJlcXVlc3QgZmFpbGVkIHZhbGlkYXRpb24gYWdhaW5zdCBtZXRob2Qgc2lnbmF0dXJlJzsKCQkJLy8gcmV0dXJuIGZhdWx0CgkJCSR0aGlzLT5mYXVsdCgnQ2xpZW50JywiT3BlcmF0aW9uICckdGhpcy0+bWV0aG9kbmFtZScgbm90IGRlZmluZWQgaW4gc2VydmljZS4iKTsKCQkJcmV0dXJuOwoJCX0KCgkJLy8gaWYgdGhlcmUgYXJlIHBhcmFtZXRlcnMgdG8gcGFzcwoJCSR0aGlzLT5kZWJ1ZygnaW4gaW52b2tlX21ldGhvZCwgcGFyYW1zOicpOwoJCSR0aGlzLT5hcHBlbmREZWJ1ZygkdGhpcy0+dmFyRHVtcCgkdGhpcy0+bWV0aG9kcGFyYW1zKSk7CgkJJHRoaXMtPmRlYnVnKCJpbiBpbnZva2VfbWV0aG9kLCBjYWxsaW5nICckdGhpcy0+bWV0aG9kbmFtZSciKTsKCQlpZiAoIWZ1bmN0aW9uX2V4aXN0cygnY2FsbF91c2VyX2Z1bmNfYXJyYXknKSkgewoJCQlpZiAoJGNsYXNzID09ICcnKSB7CgkJCQkkdGhpcy0+ZGVidWcoJ2luIGludm9rZV9tZXRob2QsIGNhbGxpbmcgZnVuY3Rpb24gdXNpbmcgZXZhbCgpJyk7CgkJCQkkZnVuY0NhbGwgPSAiXCR0aGlzLT5tZXRob2RyZXR1cm4gPSAkdGhpcy0+bWV0aG9kbmFtZSgiOwoJCQl9IGVsc2UgewoJCQkJaWYgKCRkZWxpbSA9PSAnLi4nKSB7CgkJCQkJJHRoaXMtPmRlYnVnKCdpbiBpbnZva2VfbWV0aG9kLCBjYWxsaW5nIGNsYXNzIG1ldGhvZCB1c2luZyBldmFsKCknKTsKCQkJCQkkZnVuY0NhbGwgPSAiXCR0aGlzLT5tZXRob2RyZXR1cm4gPSAiLiRjbGFzcy4iOjoiLiRtZXRob2QuIigiOwoJCQkJfSBlbHNlIHsKCQkJCQkkdGhpcy0+ZGVidWcoJ2luIGludm9rZV9tZXRob2QsIGNhbGxpbmcgaW5zdGFuY2UgbWV0aG9kIHVzaW5nIGV2YWwoKScpOwoJCQkJCS8vIGdlbmVyYXRlIHVuaXF1ZSBpbnN0YW5jZSBuYW1lCgkJCQkJJGluc3RuYW1lID0gIlwkaW5zdF8iLnRpbWUoKTsKCQkJCQkkZnVuY0NhbGwgPSAkaW5zdG5hbWUuIiA9IG5ldyAiLiRjbGFzcy4iKCk7ICI7CgkJCQkJJGZ1bmNDYWxsIC49ICJcJHRoaXMtPm1ldGhvZHJldHVybiA9ICIuJGluc3RuYW1lLiItPiIuJG1ldGhvZC4iKCI7CgkJCQl9CgkJCX0KCQkJaWYgKCR0aGlzLT5tZXRob2RwYXJhbXMpIHsKCQkJCWZvcmVhY2ggKCR0aGlzLT5tZXRob2RwYXJhbXMgYXMgJHBhcmFtKSB7CgkJCQkJaWYgKGlzX2FycmF5KCRwYXJhbSkpIHsKCQkJCQkJJHRoaXMtPmZhdWx0KCdDbGllbnQnLCAnTnVTT0FQIGRvZXMgbm90IGhhbmRsZSBjb21wbGV4VHlwZSBwYXJhbWV0ZXJzIGNvcnJlY3RseSB3aGVuIHVzaW5nIGV2YWw7IGNhbGxfdXNlcl9mdW5jX2FycmF5IG11c3QgYmUgYXZhaWxhYmxlJyk7CgkJCQkJCXJldHVybjsKCQkJCQl9CgkJCQkJJGZ1bmNDYWxsIC49ICJcIiRwYXJhbVwiLCI7CgkJCQl9CgkJCQkkZnVuY0NhbGwgPSBzdWJzdHIoJGZ1bmNDYWxsLCAwLCAtMSk7CgkJCX0KCQkJJGZ1bmNDYWxsIC49ICcpOyc7CgkJCSR0aGlzLT5kZWJ1ZygnaW4gaW52b2tlX21ldGhvZCwgZnVuY3Rpb24gY2FsbDogJy4kZnVuY0NhbGwpOwoJCQlAZXZhbCgkZnVuY0NhbGwpOwoJCX0gZWxzZSB7CgkJCWlmICgkY2xhc3MgPT0gJycpIHsKCQkJCSR0aGlzLT5kZWJ1ZygnaW4gaW52b2tlX21ldGhvZCwgY2FsbGluZyBmdW5jdGlvbiB1c2luZyBjYWxsX3VzZXJfZnVuY19hcnJheSgpJyk7CgkJCQkkY2FsbF9hcmcgPSAiJHRoaXMtPm1ldGhvZG5hbWUiOwkvLyBzdHJhaWdodCBhc3NpZ25tZW50IGNoYW5nZXMgJHRoaXMtPm1ldGhvZG5hbWUgdG8gbG93ZXIgY2FzZSBhZnRlciBjYWxsX3VzZXJfZnVuY19hcnJheSgpCgkJCX0gZWxzZWlmICgkZGVsaW0gPT0gJy4uJykgewoJCQkJJHRoaXMtPmRlYnVnKCdpbiBpbnZva2VfbWV0aG9kLCBjYWxsaW5nIGNsYXNzIG1ldGhvZCB1c2luZyBjYWxsX3VzZXJfZnVuY19hcnJheSgpJyk7CgkJCQkkY2FsbF9hcmcgPSBhcnJheSAoJGNsYXNzLCAkbWV0aG9kKTsKCQkJfSBlbHNlIHsKCQkJCSR0aGlzLT5kZWJ1ZygnaW4gaW52b2tlX21ldGhvZCwgY2FsbGluZyBpbnN0YW5jZSBtZXRob2QgdXNpbmcgY2FsbF91c2VyX2Z1bmNfYXJyYXkoKScpOwoJCQkJJGluc3RhbmNlID0gbmV3ICRjbGFzcyAoKTsKCQkJCSRjYWxsX2FyZyA9IGFycmF5KCYkaW5zdGFuY2UsICRtZXRob2QpOwoJCQl9CgkJCSR0aGlzLT5tZXRob2RyZXR1cm4gPSBjYWxsX3VzZXJfZnVuY19hcnJheSgkY2FsbF9hcmcsICR0aGlzLT5tZXRob2RwYXJhbXMpOwoJCX0KICAgICAgICAkdGhpcy0+ZGVidWcoJ2luIGludm9rZV9tZXRob2QsIG1ldGhvZHJldHVybjonKTsKICAgICAgICAkdGhpcy0+YXBwZW5kRGVidWcoJHRoaXMtPnZhckR1bXAoJHRoaXMtPm1ldGhvZHJldHVybikpOwoJCSR0aGlzLT5kZWJ1ZygiaW4gaW52b2tlX21ldGhvZCwgY2FsbGVkIG1ldGhvZCAkdGhpcy0+bWV0aG9kbmFtZSwgcmVjZWl2ZWQgJHRoaXMtPm1ldGhvZHJldHVybiBvZiB0eXBlICIuZ2V0dHlwZSgkdGhpcy0+bWV0aG9kcmV0dXJuKSk7Cgl9CgoJLyoqCgkqIHNlcmlhbGl6ZXMgdGhlIHJldHVybiB2YWx1ZSBmcm9tIGEgUEhQIGZ1bmN0aW9uIGludG8gYSBmdWxsIFNPQVAgRW52ZWxvcGUKCSoKCSogVGhlIGZvbGxvd2luZyBmaWVsZHMgYXJlIHNldCBieSB0aGlzIGZ1bmN0aW9uICh3aGVuIHN1Y2Nlc3NmdWwpCgkqCgkqIHJlc3BvbnNlU09BUAoJKgoJKiBUaGlzIHNldHMgdGhlIGZhdWx0IGZpZWxkIG9uIGVycm9yCgkqCgkqIEBhY2Nlc3MgICBwcml2YXRlCgkqLwoJZnVuY3Rpb24gc2VyaWFsaXplX3JldHVybigpIHsKCQkkdGhpcy0+ZGVidWcoJ0VudGVyaW5nIHNlcmlhbGl6ZV9yZXR1cm4gbWV0aG9kbmFtZTogJyAuICR0aGlzLT5tZXRob2RuYW1lIC4gJyBtZXRob2RVUkk6ICcgLiAkdGhpcy0+bWV0aG9kVVJJKTsKCQkvLyBpZiBmYXVsdAoJCWlmIChpc3NldCgkdGhpcy0+bWV0aG9kcmV0dXJuKSAmJiAoZ2V0X2NsYXNzKCR0aGlzLT5tZXRob2RyZXR1cm4pID09ICdzb2FwX2ZhdWx0JykpIHsKCQkJJHRoaXMtPmRlYnVnKCdnb3QgYSBmYXVsdCBvYmplY3QgZnJvbSBtZXRob2QnKTsKCQkJJHRoaXMtPmZhdWx0ID0gJHRoaXMtPm1ldGhvZHJldHVybjsKCQkJcmV0dXJuOwoJCX0gZWxzZWlmICgkdGhpcy0+bWV0aG9kcmV0dXJuaXNsaXRlcmFseG1sKSB7CgkJCSRyZXR1cm5fdmFsID0gJHRoaXMtPm1ldGhvZHJldHVybjsKCQkvLyByZXR1cm5lZCB2YWx1ZShzKQoJCX0gZWxzZSB7CgkJCSR0aGlzLT5kZWJ1ZygnZ290IGEobikgJy5nZXR0eXBlKCR0aGlzLT5tZXRob2RyZXR1cm4pLicgZnJvbSBtZXRob2QnKTsKCQkJJHRoaXMtPmRlYnVnKCdzZXJpYWxpemluZyByZXR1cm4gdmFsdWUnKTsKCQkJaWYoJHRoaXMtPndzZGwpewoJCQkJLy8gd2VhayBhdHRlbXB0IGF0IHN1cHBvcnRpbmcgbXVsdGlwbGUgb3V0cHV0IHBhcmFtcwoJCQkJaWYoc2l6ZW9mKCR0aGlzLT5vcERhdGFbJ291dHB1dCddWydwYXJ0cyddKSA+IDEpewoJCQkgICAgCSRvcFBhcmFtcyA9ICR0aGlzLT5tZXRob2RyZXR1cm47CgkJCSAgICB9IGVsc2UgewoJCQkgICAgCS8vIFRPRE86IGlzIHRoaXMgcmVhbGx5IG5lY2Vzc2FyeT8KCQkJICAgIAkkb3BQYXJhbXMgPSBhcnJheSgkdGhpcy0+bWV0aG9kcmV0dXJuKTsKCQkJICAgIH0KCQkJICAgICRyZXR1cm5fdmFsID0gJHRoaXMtPndzZGwtPnNlcmlhbGl6ZVJQQ1BhcmFtZXRlcnMoJHRoaXMtPm1ldGhvZG5hbWUsJ291dHB1dCcsJG9wUGFyYW1zKTsKCQkJICAgICR0aGlzLT5hcHBlbmREZWJ1ZygkdGhpcy0+d3NkbC0+Z2V0RGVidWcoKSk7CgkJCSAgICAkdGhpcy0+d3NkbC0+Y2xlYXJEZWJ1ZygpOwoJCQkJaWYoJGVycnN0ciA9ICR0aGlzLT53c2RsLT5nZXRFcnJvcigpKXsKCQkJCQkkdGhpcy0+ZGVidWcoJ2dvdCB3c2RsIGVycm9yOiAnLiRlcnJzdHIpOwoJCQkJCSR0aGlzLT5mYXVsdCgnU2VydmVyJywgJ3VuYWJsZSB0byBzZXJpYWxpemUgcmVzdWx0Jyk7CgkJCQkJcmV0dXJuOwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJaWYgKGlzc2V0KCR0aGlzLT5tZXRob2RyZXR1cm4pKSB7CgkJCQkJJHJldHVybl92YWwgPSAkdGhpcy0+c2VyaWFsaXplX3ZhbCgkdGhpcy0+bWV0aG9kcmV0dXJuLCAncmV0dXJuJyk7CgkJCQl9IGVsc2UgewoJCQkJCSRyZXR1cm5fdmFsID0gJyc7CgkJCQkJJHRoaXMtPmRlYnVnKCdpbiBhYnNlbmNlIG9mIFdTREwsIGFzc3VtZSB2b2lkIHJldHVybiBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eScpOwoJCQkJfQoJCQl9CgkJfQoJCSR0aGlzLT5kZWJ1ZygncmV0dXJuIHZhbHVlOicpOwoJCSR0aGlzLT5hcHBlbmREZWJ1ZygkdGhpcy0+dmFyRHVtcCgkcmV0dXJuX3ZhbCkpOwoKCQkkdGhpcy0+ZGVidWcoJ3NlcmlhbGl6aW5nIHJlc3BvbnNlJyk7CgkJaWYgKCR0aGlzLT53c2RsKSB7CgkJCSR0aGlzLT5kZWJ1ZygnaGF2ZSBXU0RMIGZvciBzZXJpYWxpemF0aW9uOiBzdHlsZSBpcyAnIC4gJHRoaXMtPm9wRGF0YVsnc3R5bGUnXSk7CgkJCWlmICgkdGhpcy0+b3BEYXRhWydzdHlsZSddID09ICdycGMnKSB7CgkJCQkkdGhpcy0+ZGVidWcoJ3N0eWxlIGlzIHJwYyBmb3Igc2VyaWFsaXphdGlvbjogdXNlIGlzICcgLiAkdGhpcy0+b3BEYXRhWydvdXRwdXQnXVsndXNlJ10pOwoJCQkJaWYgKCR0aGlzLT5vcERhdGFbJ291dHB1dCddWyd1c2UnXSA9PSAnbGl0ZXJhbCcpIHsKCQkJCQkkcGF5bG9hZCA9ICc8Jy4kdGhpcy0+bWV0aG9kbmFtZS4nUmVzcG9uc2UgeG1sbnM9IicuJHRoaXMtPm1ldGhvZFVSSS4nIj4nLiRyZXR1cm5fdmFsLic8LycuJHRoaXMtPm1ldGhvZG5hbWUuIlJlc3BvbnNlPiI7CgkJCQl9IGVsc2UgewoJCQkJCSRwYXlsb2FkID0gJzxuczE6Jy4kdGhpcy0+bWV0aG9kbmFtZS4nUmVzcG9uc2UgeG1sbnM6bnMxPSInLiR0aGlzLT5tZXRob2RVUkkuJyI+Jy4kcmV0dXJuX3ZhbC4nPC9uczE6Jy4kdGhpcy0+bWV0aG9kbmFtZS4iUmVzcG9uc2U+IjsKCQkJCX0KCQkJfSBlbHNlIHsKCQkJCSR0aGlzLT5kZWJ1Zygnc3R5bGUgaXMgbm90IHJwYyBmb3Igc2VyaWFsaXphdGlvbjogYXNzdW1lIGRvY3VtZW50Jyk7CgkJCQkkcGF5bG9hZCA9ICRyZXR1cm5fdmFsOwoJCQl9CgkJfSBlbHNlIHsKCQkJJHRoaXMtPmRlYnVnKCdkbyBub3QgaGF2ZSBXU0RMIGZvciBzZXJpYWxpemF0aW9uOiBhc3N1bWUgcnBjL2VuY29kZWQnKTsKCQkJJHBheWxvYWQgPSAnPG5zMTonLiR0aGlzLT5tZXRob2RuYW1lLidSZXNwb25zZSB4bWxuczpuczE9IicuJHRoaXMtPm1ldGhvZFVSSS4nIj4nLiRyZXR1cm5fdmFsLic8L25zMTonLiR0aGlzLT5tZXRob2RuYW1lLiJSZXNwb25zZT4iOwoJCX0KCQkkdGhpcy0+cmVzdWx0ID0gJ3N1Y2Nlc3NmdWwnOwoJCWlmKCR0aGlzLT53c2RsKXsKCQkJLy9pZigkdGhpcy0+ZGVidWdfZmxhZyl7CiAgICAgICAgICAgIAkkdGhpcy0+YXBwZW5kRGVidWcoJHRoaXMtPndzZGwtPmdldERlYnVnKCkpOwogICAgICAgICAgICAvLwl9CgkJCWlmIChpc3NldCgkb3BEYXRhWydvdXRwdXQnXVsnZW5jb2RpbmdTdHlsZSddKSkgewoJCQkJJGVuY29kaW5nU3R5bGUgPSAkb3BEYXRhWydvdXRwdXQnXVsnZW5jb2RpbmdTdHlsZSddOwoJCQl9IGVsc2UgewoJCQkJJGVuY29kaW5nU3R5bGUgPSAnJzsKCQkJfQoJCQkvLyBBZGRlZDogSW4gY2FzZSB3ZSB1c2UgYSBXU0RMLCByZXR1cm4gYSBzZXJpYWxpemVkIGVudi4gV0lUSCB0aGUgdXNlZE5hbWVzcGFjZXMuCgkJCSR0aGlzLT5yZXNwb25zZVNPQVAgPSAkdGhpcy0+c2VyaWFsaXplRW52ZWxvcGUoJHBheWxvYWQsJHRoaXMtPnJlc3BvbnNlSGVhZGVycywkdGhpcy0+d3NkbC0+dXNlZE5hbWVzcGFjZXMsJHRoaXMtPm9wRGF0YVsnc3R5bGUnXSwkZW5jb2RpbmdTdHlsZSk7CgkJfSBlbHNlIHsKCQkJJHRoaXMtPnJlc3BvbnNlU09BUCA9ICR0aGlzLT5zZXJpYWxpemVFbnZlbG9wZSgkcGF5bG9hZCwkdGhpcy0+cmVzcG9uc2VIZWFkZXJzKTsKCQl9CgkJJHRoaXMtPmRlYnVnKCJMZWF2aW5nIHNlcmlhbGl6ZV9yZXR1cm4iKTsKCX0KCgkvKioKCSogc2VuZHMgYW4gSFRUUCByZXNwb25zZQoJKgoJKiBUaGUgZm9sbG93aW5nIGZpZWxkcyBhcmUgc2V0IGJ5IHRoaXMgZnVuY3Rpb24gKHdoZW4gc3VjY2Vzc2Z1bCkKCSoKCSogb3V0Z29pbmdfaGVhZGVycwoJKiByZXNwb25zZQoJKgoJKiBAYWNjZXNzICAgcHJpdmF0ZQoJKi8KCWZ1bmN0aW9uIHNlbmRfcmVzcG9uc2UoKSB7CgkJJHRoaXMtPmRlYnVnKCdFbnRlciBzZW5kX3Jlc3BvbnNlJyk7CgkJaWYgKCR0aGlzLT5mYXVsdCkgewoJCQkkcGF5bG9hZCA9ICR0aGlzLT5mYXVsdC0+c2VyaWFsaXplKCk7CgkJCSR0aGlzLT5vdXRnb2luZ19oZWFkZXJzW10gPSAiSFRUUC8xLjAgNTAwIEludGVybmFsIFNlcnZlciBFcnJvciI7CgkJCSR0aGlzLT5vdXRnb2luZ19oZWFkZXJzW10gPSAiU3RhdHVzOiA1MDAgSW50ZXJuYWwgU2VydmVyIEVycm9yIjsKCQl9IGVsc2UgewoJCQkkcGF5bG9hZCA9ICR0aGlzLT5yZXNwb25zZVNPQVA7CgkJCS8vIFNvbWUgY29tYmluYXRpb25zIG9mIFBIUCtXZWIgc2VydmVyIGFsbG93IHRoZSBTdGF0dXMKCQkJLy8gdG8gY29tZSB0aHJvdWdoIGFzIGEgaGVhZGVyLiAgU2luY2UgT0sgaXMgdGhlIGRlZmF1bHQKCQkJLy8ganVzdCBkbyBub3RoaW5nLgoJCQkvLyAkdGhpcy0+b3V0Z29pbmdfaGVhZGVyc1tdID0gIkhUVFAvMS4wIDIwMCBPSyI7CgkJCS8vICR0aGlzLT5vdXRnb2luZ19oZWFkZXJzW10gPSAiU3RhdHVzOiAyMDAgT0siOwoJCX0KICAgICAgICAvLyBhZGQgZGVidWcgZGF0YSBpZiBpbiBkZWJ1ZyBtb2RlCgkJaWYoaXNzZXQoJHRoaXMtPmRlYnVnX2ZsYWcpICYmICR0aGlzLT5kZWJ1Z19mbGFnKXsKICAgICAgICAJJHBheWxvYWQgLj0gJHRoaXMtPmdldERlYnVnQXNYTUxDb21tZW50KCk7CiAgICAgICAgfQoJCSR0aGlzLT5vdXRnb2luZ19oZWFkZXJzW10gPSAiU2VydmVyOiAkdGhpcy0+dGl0bGUgU2VydmVyIHYkdGhpcy0+dmVyc2lvbiI7CgkJZXJlZygnXCRSZXZpc2lvJyAuICduOiAoW14gXSspJywgJHRoaXMtPnJldmlzaW9uLCAkcmV2KTsKCQkkdGhpcy0+b3V0Z29pbmdfaGVhZGVyc1tdID0gIlgtU09BUC1TZXJ2ZXI6ICR0aGlzLT50aXRsZS8kdGhpcy0+dmVyc2lvbiAoIi4kcmV2WzFdLiIpIjsKCQkvLyBMZXQgdGhlIFdlYiBzZXJ2ZXIgZGVjaWRlIGFib3V0IHRoaXMKCQkvLyR0aGlzLT5vdXRnb2luZ19oZWFkZXJzW10gPSAiQ29ubmVjdGlvbjogQ2xvc2VcclxuIjsKCQkkcGF5bG9hZCA9ICR0aGlzLT5nZXRIVFRQQm9keSgkcGF5bG9hZCk7CgkJJHR5cGUgPSAkdGhpcy0+Z2V0SFRUUENvbnRlbnRUeXBlKCk7CgkJJGNoYXJzZXQgPSAkdGhpcy0+Z2V0SFRUUENvbnRlbnRUeXBlQ2hhcnNldCgpOwoJCSR0aGlzLT5vdXRnb2luZ19oZWFkZXJzW10gPSAiQ29udGVudC1UeXBlOiAkdHlwZSIgLiAoJGNoYXJzZXQgPyAnOyBjaGFyc2V0PScgLiAkY2hhcnNldCA6ICcnKTsKCQkvL2JlZ2luIGNvZGUgdG8gY29tcHJlc3MgcGF5bG9hZCAtIGJ5IEpvaG4KCQkvLyBOT1RFOiB0aGVyZSBpcyBubyB3YXkgdG8ga25vdyB3aGV0aGVyIHRoZSBXZWIgc2VydmVyIHdpbGwgYWxzbyBjb21wcmVzcwoJCS8vIHRoaXMgZGF0YS4KCQlpZiAoc3RybGVuKCRwYXlsb2FkKSA+IDEwMjQgJiYgaXNzZXQoJHRoaXMtPmhlYWRlcnMpICYmIGlzc2V0KCR0aGlzLT5oZWFkZXJzWydhY2NlcHQtZW5jb2RpbmcnXSkpIHsJCgkJCWlmIChzdHJzdHIoJHRoaXMtPmhlYWRlcnNbJ2FjY2VwdC1lbmNvZGluZyddLCAnZ3ppcCcpKSB7CgkJCQlpZiAoZnVuY3Rpb25fZXhpc3RzKCdnemVuY29kZScpKSB7CgkJCQkJaWYgKGlzc2V0KCR0aGlzLT5kZWJ1Z19mbGFnKSAmJiAkdGhpcy0+ZGVidWdfZmxhZykgewoJCQkJCQkkcGF5bG9hZCAuPSAiPCEtLSBDb250ZW50IGJlaW5nIGd6aXBwZWQgLS0+IjsKCQkJCQl9CgkJCQkJJHRoaXMtPm91dGdvaW5nX2hlYWRlcnNbXSA9ICJDb250ZW50LUVuY29kaW5nOiBnemlwIjsKCQkJCQkkcGF5bG9hZCA9IGd6ZW5jb2RlKCRwYXlsb2FkKTsKCQkJCX0gZWxzZSB7CgkJCQkJaWYgKGlzc2V0KCR0aGlzLT5kZWJ1Z19mbGFnKSAmJiAkdGhpcy0+ZGVidWdfZmxhZykgewoJCQkJCQkkcGF5bG9hZCAuPSAiPCEtLSBDb250ZW50IHdpbGwgbm90IGJlIGd6aXBwZWQ6IG5vIGd6ZW5jb2RlIC0tPiI7CgkJCQkJfQoJCQkJfQoJCQl9IGVsc2VpZiAoc3Ryc3RyKCR0aGlzLT5oZWFkZXJzWydhY2NlcHQtZW5jb2RpbmcnXSwgJ2RlZmxhdGUnKSkgewoJCQkJLy8gTm90ZTogTVNJRSByZXF1aXJlcyBnemRlZmxhdGUgb3V0cHV0IChubyBabGliIGhlYWRlciBhbmQgY2hlY2tzdW0pLAoJCQkJLy8gaW5zdGVhZCBvZiBnemNvbXByZXNzIG91dHB1dCwKCQkJCS8vIHdoaWNoIGNvbmZsaWN0cyB3aXRoIEhUVFAgMS4xIHNwZWMgKGh0dHA6Ly93d3cudzMub3JnL1Byb3RvY29scy9yZmMyNjE2L3JmYzI2MTYtc2VjMy5odG1sI3NlYzMuNSkKCQkJCWlmIChmdW5jdGlvbl9leGlzdHMoJ2d6ZGVmbGF0ZScpKSB7CgkJCQkJaWYgKGlzc2V0KCR0aGlzLT5kZWJ1Z19mbGFnKSAmJiAkdGhpcy0+ZGVidWdfZmxhZykgewoJCQkJCQkkcGF5bG9hZCAuPSAiPCEtLSBDb250ZW50IGJlaW5nIGRlZmxhdGVkIC0tPiI7CgkJCQkJfQoJCQkJCSR0aGlzLT5vdXRnb2luZ19oZWFkZXJzW10gPSAiQ29udGVudC1FbmNvZGluZzogZGVmbGF0ZSI7CgkJCQkJJHBheWxvYWQgPSBnemRlZmxhdGUoJHBheWxvYWQpOwoJCQkJfSBlbHNlIHsKCQkJCQlpZiAoaXNzZXQoJHRoaXMtPmRlYnVnX2ZsYWcpICYmICR0aGlzLT5kZWJ1Z19mbGFnKSB7CgkJCQkJCSRwYXlsb2FkIC49ICI8IS0tIENvbnRlbnQgd2lsbCBub3QgYmUgZGVmbGF0ZWQ6IG5vIGd6Y29tcHJlc3MgLS0+IjsKCQkJCQl9CgkJCQl9CgkJCX0KCQl9CgkJLy9lbmQgY29kZQoJCSR0aGlzLT5vdXRnb2luZ19oZWFkZXJzW10gPSAiQ29udGVudC1MZW5ndGg6ICIuc3RybGVuKCRwYXlsb2FkKTsKCQlyZXNldCgkdGhpcy0+b3V0Z29pbmdfaGVhZGVycyk7CgkJZm9yZWFjaCgkdGhpcy0+b3V0Z29pbmdfaGVhZGVycyBhcyAkaGRyKXsKCQkJaGVhZGVyKCRoZHIsIGZhbHNlKTsKCQl9CgkJcHJpbnQgJHBheWxvYWQ7CgkJJHRoaXMtPnJlc3BvbnNlID0gam9pbigiXHJcbiIsJHRoaXMtPm91dGdvaW5nX2hlYWRlcnMpLiJcclxuXHJcbiIuJHBheWxvYWQ7Cgl9CgoJLyoqCgkqIHRha2VzIHRoZSB2YWx1ZSB0aGF0IHdhcyBjcmVhdGVkIGJ5IHBhcnNpbmcgdGhlIHJlcXVlc3QKCSogYW5kIGNvbXBhcmVzIHRvIHRoZSBtZXRob2QncyBzaWduYXR1cmUsIGlmIGF2YWlsYWJsZS4KCSoKCSogQHBhcmFtCXN0cmluZwkkb3BlcmF0aW9uCVRoZSBvcGVyYXRpb24gdG8gYmUgaW52b2tlZAoJKiBAcGFyYW0JYXJyYXkJJHJlcXVlc3QJVGhlIGFycmF5IG9mIHBhcmFtZXRlciB2YWx1ZXMKCSogQHJldHVybglib29sZWFuCVdoZXRoZXIgdGhlIG9wZXJhdGlvbiB3YXMgZm91bmQKCSogQGFjY2VzcyAgIHByaXZhdGUKCSovCglmdW5jdGlvbiB2ZXJpZnlfbWV0aG9kKCRvcGVyYXRpb24sJHJlcXVlc3QpewoJCWlmKGlzc2V0KCR0aGlzLT53c2RsKSAmJiBpc19vYmplY3QoJHRoaXMtPndzZGwpKXsKCQkJaWYoJHRoaXMtPndzZGwtPmdldE9wZXJhdGlvbkRhdGEoJG9wZXJhdGlvbikpewoJCQkJcmV0dXJuIHRydWU7CgkJCX0KCSAgICB9IGVsc2VpZihpc3NldCgkdGhpcy0+b3BlcmF0aW9uc1skb3BlcmF0aW9uXSkpewoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgkJcmV0dXJuIGZhbHNlOwoJfQoKCS8qKgoJKiBwcm9jZXNzZXMgU09BUCBtZXNzYWdlIHJlY2VpdmVkIGZyb20gY2xpZW50CgkqCgkqIEBwYXJhbQlhcnJheQkkaGVhZGVycwlUaGUgSFRUUCBoZWFkZXJzCgkqIEBwYXJhbQlzdHJpbmcJJGRhdGEJCXVucHJvY2Vzc2VkIHJlcXVlc3QgZGF0YSBmcm9tIGNsaWVudAoJKiBAcmV0dXJuCW1peGVkCXZhbHVlIG9mIHRoZSBtZXNzYWdlLCBkZWNvZGVkIGludG8gYSBQSFAgdHlwZQoJKiBAYWNjZXNzICAgcHJpdmF0ZQoJKi8KICAgIGZ1bmN0aW9uIHBhcnNlUmVxdWVzdCgkaGVhZGVycywgJGRhdGEpIHsKCQkkdGhpcy0+ZGVidWcoJ0VudGVyaW5nIHBhcnNlUmVxdWVzdCgpIGZvciBkYXRhIG9mIGxlbmd0aCAnIC4gc3RybGVuKCRkYXRhKSAuICcgYW5kIHR5cGUgJyAuICRoZWFkZXJzWydjb250ZW50LXR5cGUnXSk7CgkJaWYgKCFzdHJzdHIoJGhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddLCAndGV4dC94bWwnKSkgewoJCQkkdGhpcy0+c2V0RXJyb3IoJ1JlcXVlc3Qgbm90IG9mIHR5cGUgdGV4dC94bWwnKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQlpZiAoc3RycG9zKCRoZWFkZXJzWydjb250ZW50LXR5cGUnXSwgJz0nKSkgewoJCQkkZW5jID0gc3RyX3JlcGxhY2UoJyInLCAnJywgc3Vic3RyKHN0cnN0cigkaGVhZGVyc1siY29udGVudC10eXBlIl0sICc9JyksIDEpKTsKCQkJJHRoaXMtPmRlYnVnKCdHb3QgcmVzcG9uc2UgZW5jb2Rpbmc6ICcgLiAkZW5jKTsKCQkJaWYoZXJlZ2koJ14oSVNPLTg4NTktMXxVUy1BU0NJSXxVVEYtOCkkJywkZW5jKSl7CgkJCQkkdGhpcy0+eG1sX2VuY29kaW5nID0gc3RydG91cHBlcigkZW5jKTsKCQkJfSBlbHNlIHsKCQkJCSR0aGlzLT54bWxfZW5jb2RpbmcgPSAnVVMtQVNDSUknOwoJCQl9CgkJfSBlbHNlIHsKCQkJLy8gc2hvdWxkIGJlIFVTLUFTQ0lJIGZvciBIVFRQIDEuMCBvciBJU08tODg1OS0xIGZvciBIVFRQIDEuMQoJCQkkdGhpcy0+eG1sX2VuY29kaW5nID0gJ0lTTy04ODU5LTEnOwoJCX0KCQkkdGhpcy0+ZGVidWcoJ1VzZSBlbmNvZGluZzogJyAuICR0aGlzLT54bWxfZW5jb2RpbmcgLiAnIHdoZW4gY3JlYXRpbmcgc29hcF9wYXJzZXInKTsKCQkvLyBwYXJzZSByZXNwb25zZSwgZ2V0IHNvYXAgcGFyc2VyIG9iagoJCSRwYXJzZXIgPSBuZXcgc29hcF9wYXJzZXIoJGRhdGEsJHRoaXMtPnhtbF9lbmNvZGluZywnJywkdGhpcy0+ZGVjb2RlX3V0ZjgpOwoJCS8vIHBhcnNlciBkZWJ1ZwoJCSR0aGlzLT5kZWJ1ZygicGFyc2VyIGRlYnVnOiBcbiIuJHBhcnNlci0+Z2V0RGVidWcoKSk7CgkJLy8gaWYgZmF1bHQgb2NjdXJyZWQgZHVyaW5nIG1lc3NhZ2UgcGFyc2luZwoJCWlmKCRlcnIgPSAkcGFyc2VyLT5nZXRFcnJvcigpKXsKCQkJJHRoaXMtPnJlc3VsdCA9ICdmYXVsdDogZXJyb3IgaW4gbXNnIHBhcnNpbmc6ICcuJGVycjsKCQkJJHRoaXMtPmZhdWx0KCdDbGllbnQnLCJlcnJvciBpbiBtc2cgcGFyc2luZzpcbiIuJGVycik7CgkJLy8gZWxzZSBzdWNjZXNzZnVsbHkgcGFyc2VkIHJlcXVlc3QgaW50byBzb2FwdmFsIG9iamVjdAoJCX0gZWxzZSB7CgkJCS8vIGdldC9zZXQgbWV0aG9kbmFtZQoJCQkkdGhpcy0+bWV0aG9kVVJJID0gJHBhcnNlci0+cm9vdF9zdHJ1Y3RfbmFtZXNwYWNlOwoJCQkkdGhpcy0+bWV0aG9kbmFtZSA9ICRwYXJzZXItPnJvb3Rfc3RydWN0X25hbWU7CgkJCSR0aGlzLT5kZWJ1ZygnbWV0aG9kbmFtZTogJy4kdGhpcy0+bWV0aG9kbmFtZS4nIG1ldGhvZFVSSTogJy4kdGhpcy0+bWV0aG9kVVJJKTsKCQkJJHRoaXMtPmRlYnVnKCdjYWxsaW5nIHBhcnNlci0+Z2V0X3Jlc3BvbnNlKCknKTsKCQkJJHRoaXMtPm1ldGhvZHBhcmFtcyA9ICRwYXJzZXItPmdldF9yZXNwb25zZSgpOwoJCQkvLyBnZXQgU09BUCBoZWFkZXJzCgkJCSR0aGlzLT5yZXF1ZXN0SGVhZGVycyA9ICRwYXJzZXItPmdldEhlYWRlcnMoKTsKICAgICAgICAgICAgLy8gYWRkIGRvY3VtZW50IGZvciBkb2NsaXQgc3VwcG9ydAogICAgICAgICAgICAkdGhpcy0+ZG9jdW1lbnQgPSAkcGFyc2VyLT5kb2N1bWVudDsKCQl9CgkgfQoKCS8qKgoJKiBnZXRzIHRoZSBIVFRQIGJvZHkgZm9yIHRoZSBjdXJyZW50IHJlc3BvbnNlLgoJKgoJKiBAcGFyYW0gc3RyaW5nICRzb2FwbXNnIFRoZSBTT0FQIHBheWxvYWQKCSogQHJldHVybiBzdHJpbmcgVGhlIEhUVFAgYm9keSwgd2hpY2ggaW5jbHVkZXMgdGhlIFNPQVAgcGF5bG9hZAoJKiBAYWNjZXNzIHByaXZhdGUKCSovCglmdW5jdGlvbiBnZXRIVFRQQm9keSgkc29hcG1zZykgewoJCXJldHVybiAkc29hcG1zZzsKCX0KCQoJLyoqCgkqIGdldHMgdGhlIEhUVFAgY29udGVudCB0eXBlIGZvciB0aGUgY3VycmVudCByZXNwb25zZS4KCSoKCSogTm90ZTogZ2V0SFRUUEJvZHkgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHRoaXMuCgkqCgkqIEByZXR1cm4gc3RyaW5nIHRoZSBIVFRQIGNvbnRlbnQgdHlwZSBmb3IgdGhlIGN1cnJlbnQgcmVzcG9uc2UuCgkqIEBhY2Nlc3MgcHJpdmF0ZQoJKi8KCWZ1bmN0aW9uIGdldEhUVFBDb250ZW50VHlwZSgpIHsKCQlyZXR1cm4gJ3RleHQveG1sJzsKCX0KCQoJLyoqCgkqIGdldHMgdGhlIEhUVFAgY29udGVudCB0eXBlIGNoYXJzZXQgZm9yIHRoZSBjdXJyZW50IHJlc3BvbnNlLgoJKiByZXR1cm5zIGZhbHNlIGZvciBub24tdGV4dCBjb250ZW50IHR5cGVzLgoJKgoJKiBOb3RlOiBnZXRIVFRQQm9keSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgdGhpcy4KCSoKCSogQHJldHVybiBzdHJpbmcgdGhlIEhUVFAgY29udGVudCB0eXBlIGNoYXJzZXQgZm9yIHRoZSBjdXJyZW50IHJlc3BvbnNlLgoJKiBAYWNjZXNzIHByaXZhdGUKCSovCglmdW5jdGlvbiBnZXRIVFRQQ29udGVudFR5cGVDaGFyc2V0KCkgewoJCXJldHVybiAkdGhpcy0+c29hcF9kZWZlbmNvZGluZzsKCX0KCgkvKioKCSogYWRkIGEgbWV0aG9kIHRvIHRoZSBkaXNwYXRjaCBtYXAgKHRoaXMgaGFzIGJlZW4gcmVwbGFjZWQgYnkgdGhlIHJlZ2lzdGVyIG1ldGhvZCkKCSoKCSogQHBhcmFtICAgIHN0cmluZyAkbWV0aG9kbmFtZQoJKiBAcGFyYW0gICAgc3RyaW5nICRpbiBhcnJheSBvZiBpbnB1dCB2YWx1ZXMKCSogQHBhcmFtICAgIHN0cmluZyAkb3V0IGFycmF5IG9mIG91dHB1dCB2YWx1ZXMKCSogQGFjY2VzcyAgIHB1YmxpYwoJKiBAZGVwcmVjYXRlZAoJKi8KCWZ1bmN0aW9uIGFkZF90b19tYXAoJG1ldGhvZG5hbWUsJGluLCRvdXQpewoJCQkkdGhpcy0+b3BlcmF0aW9uc1skbWV0aG9kbmFtZV0gPSBhcnJheSgnbmFtZScgPT4gJG1ldGhvZG5hbWUsJ2luJyA9PiAkaW4sJ291dCcgPT4gJG91dCk7Cgl9CgoJLyoqCgkqIHJlZ2lzdGVyIGEgc2VydmljZSBmdW5jdGlvbiB3aXRoIHRoZSBzZXJ2ZXIKCSoKCSogQHBhcmFtICAgIHN0cmluZyAkbmFtZSB0aGUgbmFtZSBvZiB0aGUgUEhQIGZ1bmN0aW9uLCBjbGFzcy5tZXRob2Qgb3IgY2xhc3MuLm1ldGhvZAoJKiBAcGFyYW0gICAgYXJyYXkgJGluIGFzc29jIGFycmF5IG9mIGlucHV0IHZhbHVlczoga2V5ID0gcGFyYW0gbmFtZSwgdmFsdWUgPSBwYXJhbSB0eXBlCgkqIEBwYXJhbSAgICBhcnJheSAkb3V0IGFzc29jIGFycmF5IG9mIG91dHB1dCB2YWx1ZXM6IGtleSA9IHBhcmFtIG5hbWUsIHZhbHVlID0gcGFyYW0gdHlwZQoJKiBAcGFyYW0JbWl4ZWQgJG5hbWVzcGFjZSB0aGUgZWxlbWVudCBuYW1lc3BhY2UgZm9yIHRoZSBtZXRob2Qgb3IgZmFsc2UKCSogQHBhcmFtCW1peGVkICRzb2FwYWN0aW9uIHRoZSBzb2FwYWN0aW9uIGZvciB0aGUgbWV0aG9kIG9yIGZhbHNlCgkqIEBwYXJhbQltaXhlZCAkc3R5bGUgb3B0aW9uYWwgKHJwY3xkb2N1bWVudCkgb3IgZmFsc2UgTm90ZTogd2hlbiAnZG9jdW1lbnQnIGlzIHNwZWNpZmllZCwgcGFyYW1ldGVyIGFuZCByZXR1cm4gd3JhcHBlcnMgYXJlIGNyZWF0ZWQgZm9yIHlvdSBhdXRvbWF0aWNhbGx5CgkqIEBwYXJhbQltaXhlZCAkdXNlIG9wdGlvbmFsIChlbmNvZGVkfGxpdGVyYWwpIG9yIGZhbHNlCgkqIEBwYXJhbQlzdHJpbmcgJGRvY3VtZW50YXRpb24gb3B0aW9uYWwgRGVzY3JpcHRpb24gdG8gaW5jbHVkZSBpbiBXU0RMCgkqIEBwYXJhbQlzdHJpbmcgJGVuY29kaW5nU3R5bGUgb3B0aW9uYWwgKHVzdWFsbHkgJ2h0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvJyBmb3IgZW5jb2RlZCkKCSogQGFjY2VzcyAgIHB1YmxpYwoJKi8KCWZ1bmN0aW9uIHJlZ2lzdGVyKCRuYW1lLCRpbj1hcnJheSgpLCRvdXQ9YXJyYXkoKSwkbmFtZXNwYWNlPWZhbHNlLCRzb2FwYWN0aW9uPWZhbHNlLCRzdHlsZT1mYWxzZSwkdXNlPWZhbHNlLCRkb2N1bWVudGF0aW9uPScnLCRlbmNvZGluZ1N0eWxlPScnKXsKCQlnbG9iYWwgJEhUVFBfU0VSVkVSX1ZBUlM7CgoJCWlmKCR0aGlzLT5leHRlcm5hbFdTRExVUkwpewoJCQlkaWUoJ1lvdSBjYW5ub3QgYmluZCB0byBhbiBleHRlcm5hbCBXU0RMIGZpbGUsIGFuZCByZWdpc3RlciBtZXRob2RzIG91dHNpZGUgb2YgaXQhIFBsZWFzZSBjaG9vc2UgZWl0aGVyIFdTREwgb3Igbm8gV1NETC4nKTsKCQl9CgkJaWYgKCEgJG5hbWUpIHsKCQkJZGllKCdZb3UgbXVzdCBzcGVjaWZ5IGEgbmFtZSB3aGVuIHlvdSByZWdpc3RlciBhbiBvcGVyYXRpb24nKTsKCQl9CgkJaWYgKCFpc19hcnJheSgkaW4pKSB7CgkJCWRpZSgnWW91IG11c3QgcHJvdmlkZSBhbiBhcnJheSBmb3Igb3BlcmF0aW9uIGlucHV0cycpOwoJCX0KCQlpZiAoIWlzX2FycmF5KCRvdXQpKSB7CgkJCWRpZSgnWW91IG11c3QgcHJvdmlkZSBhbiBhcnJheSBmb3Igb3BlcmF0aW9uIG91dHB1dHMnKTsKCQl9CgkJaWYoZmFsc2UgPT0gJG5hbWVzcGFjZSkgewoJCX0KCQlpZihmYWxzZSA9PSAkc29hcGFjdGlvbikgewoJCQlpZiAoaXNzZXQoJF9TRVJWRVIpKSB7CgkJCQkkU0VSVkVSX05BTUUgPSAkX1NFUlZFUlsnU0VSVkVSX05BTUUnXTsKCQkJCSRTQ1JJUFRfTkFNRSA9IGlzc2V0KCRfU0VSVkVSWydQSFBfU0VMRiddKSA/ICRfU0VSVkVSWydQSFBfU0VMRiddIDogJF9TRVJWRVJbJ1NDUklQVF9OQU1FJ107CgkJCX0gZWxzZWlmIChpc3NldCgkSFRUUF9TRVJWRVJfVkFSUykpIHsKCQkJCSRTRVJWRVJfTkFNRSA9ICRIVFRQX1NFUlZFUl9WQVJTWydTRVJWRVJfTkFNRSddOwoJCQkJJFNDUklQVF9OQU1FID0gaXNzZXQoJEhUVFBfU0VSVkVSX1ZBUlNbJ1BIUF9TRUxGJ10pID8gJEhUVFBfU0VSVkVSX1ZBUlNbJ1BIUF9TRUxGJ10gOiAkSFRUUF9TRVJWRVJfVkFSU1snU0NSSVBUX05BTUUnXTsKCQkJfSBlbHNlIHsKCQkJCSR0aGlzLT5zZXRFcnJvcigiTmVpdGhlciBfU0VSVkVSIG5vciBIVFRQX1NFUlZFUl9WQVJTIGlzIGF2YWlsYWJsZSIpOwoJCQl9CgkJCSRzb2FwYWN0aW9uID0gImh0dHA6Ly8kU0VSVkVSX05BTUUkU0NSSVBUX05BTUUvJG5hbWUiOwoJCX0KCQlpZihmYWxzZSA9PSAkc3R5bGUpIHsKCQkJJHN0eWxlID0gInJwYyI7CgkJfQoJCWlmKGZhbHNlID09ICR1c2UpIHsKCQkJJHVzZSA9ICJlbmNvZGVkIjsKCQl9CgkJaWYgKCR1c2UgPT0gJ2VuY29kZWQnICYmICRlbmNvZGluZ1N0eWxlID0gJycpIHsKCQkJJGVuY29kaW5nU3R5bGUgPSAnaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8nOwoJCX0KCgkJJHRoaXMtPm9wZXJhdGlvbnNbJG5hbWVdID0gYXJyYXkoCgkgICAgJ25hbWUnID0+ICRuYW1lLAoJICAgICdpbicgPT4gJGluLAoJICAgICdvdXQnID0+ICRvdXQsCgkgICAgJ25hbWVzcGFjZScgPT4gJG5hbWVzcGFjZSwKCSAgICAnc29hcGFjdGlvbicgPT4gJHNvYXBhY3Rpb24sCgkgICAgJ3N0eWxlJyA9PiAkc3R5bGUpOwogICAgICAgIGlmKCR0aGlzLT53c2RsKXsKICAgICAgICAJJHRoaXMtPndzZGwtPmFkZE9wZXJhdGlvbigkbmFtZSwkaW4sJG91dCwkbmFtZXNwYWNlLCRzb2FwYWN0aW9uLCRzdHlsZSwkdXNlLCRkb2N1bWVudGF0aW9uLCRlbmNvZGluZ1N0eWxlKTsKCSAgICB9CgkJcmV0dXJuIHRydWU7Cgl9CgoJLyoqCgkqIFNwZWNpZnkgYSBmYXVsdCB0byBiZSByZXR1cm5lZCB0byB0aGUgY2xpZW50LgoJKiBUaGlzIGFsc28gYWN0cyBhcyBhIGZsYWcgdG8gdGhlIHNlcnZlciB0aGF0IGEgZmF1bHQgaGFzIG9jY3VyZWQuCgkqCgkqIEBwYXJhbQlzdHJpbmcgJGZhdWx0Y29kZQoJKiBAcGFyYW0Jc3RyaW5nICRmYXVsdHN0cmluZwoJKiBAcGFyYW0Jc3RyaW5nICRmYXVsdGFjdG9yCgkqIEBwYXJhbQlzdHJpbmcgJGZhdWx0ZGV0YWlsCgkqIEBhY2Nlc3MgICBwdWJsaWMKCSovCglmdW5jdGlvbiBmYXVsdCgkZmF1bHRjb2RlLCRmYXVsdHN0cmluZywkZmF1bHRhY3Rvcj0nJywkZmF1bHRkZXRhaWw9JycpewoJCWlmICgkZmF1bHRkZXRhaWwgPT0gJycgJiYgJHRoaXMtPmRlYnVnX2ZsYWcpIHsKCQkJJGZhdWx0ZGV0YWlsID0gJHRoaXMtPmdldERlYnVnKCk7CgkJfQoJCSR0aGlzLT5mYXVsdCA9IG5ldyBzb2FwX2ZhdWx0KCRmYXVsdGNvZGUsJGZhdWx0YWN0b3IsJGZhdWx0c3RyaW5nLCRmYXVsdGRldGFpbCk7CgkJJHRoaXMtPmZhdWx0LT5zb2FwX2RlZmVuY29kaW5nID0gJHRoaXMtPnNvYXBfZGVmZW5jb2Rpbmc7Cgl9CgogICAgLyoqCiAgICAqIFNldHMgdXAgd3NkbCBvYmplY3QuCiAgICAqIEFjdHMgYXMgYSBmbGFnIHRvIGVuYWJsZSBpbnRlcm5hbCBXU0RMIGdlbmVyYXRpb24KICAgICoKICAgICogQHBhcmFtIHN0cmluZyAkc2VydmljZU5hbWUsIG5hbWUgb2YgdGhlIHNlcnZpY2UKICAgICogQHBhcmFtIG1peGVkICRuYW1lc3BhY2Ugb3B0aW9uYWwgJ3Rucycgc2VydmljZSBuYW1lc3BhY2Ugb3IgZmFsc2UKICAgICogQHBhcmFtIG1peGVkICRlbmRwb2ludCBvcHRpb25hbCBVUkwgb2Ygc2VydmljZSBlbmRwb2ludCBvciBmYWxzZQogICAgKiBAcGFyYW0gc3RyaW5nICRzdHlsZSBvcHRpb25hbCAocnBjfGRvY3VtZW50KSBXU0RMIHN0eWxlIChhbHNvIHNwZWNpZmllZCBieSBvcGVyYXRpb24pCiAgICAqIEBwYXJhbSBzdHJpbmcgJHRyYW5zcG9ydCBvcHRpb25hbCBTT0FQIHRyYW5zcG9ydAogICAgKiBAcGFyYW0gbWl4ZWQgJHNjaGVtYVRhcmdldE5hbWVzcGFjZSBvcHRpb25hbCAndHlwZXMnIHRhcmdldE5hbWVzcGFjZSBmb3Igc2VydmljZSBzY2hlbWEgb3IgZmFsc2UKICAgICovCiAgICBmdW5jdGlvbiBjb25maWd1cmVXU0RMKCRzZXJ2aWNlTmFtZSwkbmFtZXNwYWNlID0gZmFsc2UsJGVuZHBvaW50ID0gZmFsc2UsJHN0eWxlPSdycGMnLCAkdHJhbnNwb3J0ID0gJ2h0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCcsICRzY2hlbWFUYXJnZXROYW1lc3BhY2UgPSBmYWxzZSkKICAgIHsKICAgIAlnbG9iYWwgJEhUVFBfU0VSVkVSX1ZBUlM7CgoJCWlmIChpc3NldCgkX1NFUlZFUikpIHsKCQkJJFNFUlZFUl9OQU1FID0gJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ107CgkJCSRTRVJWRVJfUE9SVCA9ICRfU0VSVkVSWydTRVJWRVJfUE9SVCddOwoJCQkkU0NSSVBUX05BTUUgPSBpc3NldCgkX1NFUlZFUlsnUEhQX1NFTEYnXSkgPyAkX1NFUlZFUlsnUEhQX1NFTEYnXSA6ICRfU0VSVkVSWydTQ1JJUFRfTkFNRSddOwoJCQkkSFRUUFMgPSAkX1NFUlZFUlsnSFRUUFMnXTsKCQl9IGVsc2VpZiAoaXNzZXQoJEhUVFBfU0VSVkVSX1ZBUlMpKSB7CgkJCSRTRVJWRVJfTkFNRSA9ICRIVFRQX1NFUlZFUl9WQVJTWydTRVJWRVJfTkFNRSddOwoJCQkkU0VSVkVSX1BPUlQgPSAkSFRUUF9TRVJWRVJfVkFSU1snU0VSVkVSX1BPUlQnXTsKCQkJJFNDUklQVF9OQU1FID0gaXNzZXQoJEhUVFBfU0VSVkVSX1ZBUlNbJ1BIUF9TRUxGJ10pID8gJEhUVFBfU0VSVkVSX1ZBUlNbJ1BIUF9TRUxGJ10gOiAkSFRUUF9TRVJWRVJfVkFSU1snU0NSSVBUX05BTUUnXTsKCQkJJEhUVFBTID0gJEhUVFBfU0VSVkVSX1ZBUlNbJ0hUVFBTJ107CgkJfSBlbHNlIHsKCQkJJHRoaXMtPnNldEVycm9yKCJOZWl0aGVyIF9TRVJWRVIgbm9yIEhUVFBfU0VSVkVSX1ZBUlMgaXMgYXZhaWxhYmxlIik7CgkJfQoJCWlmICgkU0VSVkVSX1BPUlQgPT0gODApIHsKCQkJJFNFUlZFUl9QT1JUID0gJyc7CgkJfSBlbHNlIHsKCQkJJFNFUlZFUl9QT1JUID0gJzonIC4gJFNFUlZFUl9QT1JUOwoJCX0KICAgICAgICBpZihmYWxzZSA9PSAkbmFtZXNwYWNlKSB7CiAgICAgICAgICAgICRuYW1lc3BhY2UgPSAiaHR0cDovLyRTRVJWRVJfTkFNRS9zb2FwLyRzZXJ2aWNlTmFtZSI7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGZhbHNlID09ICRlbmRwb2ludCkgewogICAgICAgIAlpZiAoJEhUVFBTID09ICcxJyB8fCAkSFRUUFMgPT0gJ29uJykgewogICAgICAgIAkJJFNDSEVNRSA9ICdodHRwcyc7CiAgICAgICAgCX0gZWxzZSB7CiAgICAgICAgCQkkU0NIRU1FID0gJ2h0dHAnOwogICAgICAgIAl9CiAgICAgICAgICAgICRlbmRwb2ludCA9ICIkU0NIRU1FOi8vJFNFUlZFUl9OQU1FJFNFUlZFUl9QT1JUJFNDUklQVF9OQU1FIjsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoZmFsc2UgPT0gJHNjaGVtYVRhcmdldE5hbWVzcGFjZSkgewogICAgICAgICAgICAkc2NoZW1hVGFyZ2V0TmFtZXNwYWNlID0gJG5hbWVzcGFjZTsKICAgICAgICB9CiAgICAgICAgCgkJJHRoaXMtPndzZGwgPSBuZXcgd3NkbDsKCQkkdGhpcy0+d3NkbC0+c2VydmljZU5hbWUgPSAkc2VydmljZU5hbWU7CiAgICAgICAgJHRoaXMtPndzZGwtPmVuZHBvaW50ID0gJGVuZHBvaW50OwoJCSR0aGlzLT53c2RsLT5uYW1lc3BhY2VzWyd0bnMnXSA9ICRuYW1lc3BhY2U7CgkJJHRoaXMtPndzZGwtPm5hbWVzcGFjZXNbJ3NvYXAnXSA9ICdodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvJzsKCQkkdGhpcy0+d3NkbC0+bmFtZXNwYWNlc1snd3NkbCddID0gJ2h0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvJzsKCQlpZiAoJHNjaGVtYVRhcmdldE5hbWVzcGFjZSAhPSAkbmFtZXNwYWNlKSB7CgkJCSR0aGlzLT53c2RsLT5uYW1lc3BhY2VzWyd0eXBlcyddID0gJHNjaGVtYVRhcmdldE5hbWVzcGFjZTsKCQl9CiAgICAgICAgJHRoaXMtPndzZGwtPnNjaGVtYXNbJHNjaGVtYVRhcmdldE5hbWVzcGFjZV1bMF0gPSBuZXcgeG1sc2NoZW1hKCcnLCAnJywgJHRoaXMtPndzZGwtPm5hbWVzcGFjZXMpOwogICAgICAgICR0aGlzLT53c2RsLT5zY2hlbWFzWyRzY2hlbWFUYXJnZXROYW1lc3BhY2VdWzBdLT5zY2hlbWFUYXJnZXROYW1lc3BhY2UgPSAkc2NoZW1hVGFyZ2V0TmFtZXNwYWNlOwogICAgICAgICR0aGlzLT53c2RsLT5zY2hlbWFzWyRzY2hlbWFUYXJnZXROYW1lc3BhY2VdWzBdLT5pbXBvcnRzWydodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyddWzBdID0gYXJyYXkoJ2xvY2F0aW9uJyA9PiAnJywgJ2xvYWRlZCcgPT4gdHJ1ZSk7CiAgICAgICAgJHRoaXMtPndzZGwtPnNjaGVtYXNbJHNjaGVtYVRhcmdldE5hbWVzcGFjZV1bMF0tPmltcG9ydHNbJ2h0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvJ11bMF0gPSBhcnJheSgnbG9jYXRpb24nID0+ICcnLCAnbG9hZGVkJyA9PiB0cnVlKTsKICAgICAgICAkdGhpcy0+d3NkbC0+YmluZGluZ3NbJHNlcnZpY2VOYW1lLidCaW5kaW5nJ10gPSBhcnJheSgKICAgICAgICAJJ25hbWUnPT4kc2VydmljZU5hbWUuJ0JpbmRpbmcnLAogICAgICAgICAgICAnc3R5bGUnPT4kc3R5bGUsCiAgICAgICAgICAgICd0cmFuc3BvcnQnPT4kdHJhbnNwb3J0LAogICAgICAgICAgICAncG9ydFR5cGUnPT4kc2VydmljZU5hbWUuJ1BvcnRUeXBlJyk7CiAgICAgICAgJHRoaXMtPndzZGwtPnBvcnRzWyRzZXJ2aWNlTmFtZS4nUG9ydCddID0gYXJyYXkoCiAgICAgICAgCSdiaW5kaW5nJz0+JHNlcnZpY2VOYW1lLidCaW5kaW5nJywKICAgICAgICAgICAgJ2xvY2F0aW9uJz0+JGVuZHBvaW50LAogICAgICAgICAgICAnYmluZGluZ1R5cGUnPT4naHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLycpOwogICAgfQp9CgoKCj8+PD9waHAKCgoKLyoqCiogcGFyc2VzIGEgV1NETCBmaWxlLCBhbGxvd3MgYWNjZXNzIHRvIGl0J3MgZGF0YSwgb3RoZXIgdXRpbGl0eSBtZXRob2RzCiogCiogQGF1dGhvciAgIERpZXRyaWNoIEF5YWxhIDxkaWV0cmljaEBnYW54NC5jb20+CiogQHZlcnNpb24gICRJZDogbnVzb2FwLnBocCx2IDEuOTQgMjAwNS8wOC8wNCAwMToyNzo0MiBzbmljaG9sIEV4cCAkCiogQGFjY2VzcyBwdWJsaWMgCiovCmNsYXNzIHdzZGwgZXh0ZW5kcyBudXNvYXBfYmFzZSB7CgkvLyBVUkwgb3IgZmlsZW5hbWUgb2YgdGhlIHJvb3Qgb2YgdGhpcyBXU0RMCiAgICB2YXIgJHdzZGw7IAogICAgLy8gZGVmaW5lIGludGVybmFsIGFycmF5cyBvZiBiaW5kaW5ncywgcG9ydHMsIG9wZXJhdGlvbnMsIG1lc3NhZ2VzLCBldGMuCiAgICB2YXIgJHNjaGVtYXMgPSBhcnJheSgpOwogICAgdmFyICRjdXJyZW50U2NoZW1hOwogICAgdmFyICRtZXNzYWdlID0gYXJyYXkoKTsKICAgIHZhciAkY29tcGxleFR5cGVzID0gYXJyYXkoKTsKICAgIHZhciAkbWVzc2FnZXMgPSBhcnJheSgpOwogICAgdmFyICRjdXJyZW50TWVzc2FnZTsKICAgIHZhciAkY3VycmVudE9wZXJhdGlvbjsKICAgIHZhciAkcG9ydFR5cGVzID0gYXJyYXkoKTsKICAgIHZhciAkY3VycmVudFBvcnRUeXBlOwogICAgdmFyICRiaW5kaW5ncyA9IGFycmF5KCk7CiAgICB2YXIgJGN1cnJlbnRCaW5kaW5nOwogICAgdmFyICRwb3J0cyA9IGFycmF5KCk7CiAgICB2YXIgJGN1cnJlbnRQb3J0OwogICAgdmFyICRvcERhdGEgPSBhcnJheSgpOwogICAgdmFyICRzdGF0dXMgPSAnJzsKICAgIHZhciAkZG9jdW1lbnRhdGlvbiA9IGZhbHNlOwogICAgdmFyICRlbmRwb2ludCA9ICcnOyAKICAgIC8vIGFycmF5IG9mIHdzZGwgZG9jcyB0byBpbXBvcnQKICAgIHZhciAkaW1wb3J0ID0gYXJyYXkoKTsgCiAgICAvLyBwYXJzZXIgdmFycwogICAgdmFyICRwYXJzZXI7CiAgICB2YXIgJHBvc2l0aW9uID0gMDsKICAgIHZhciAkZGVwdGggPSAwOwogICAgdmFyICRkZXB0aF9hcnJheSA9IGFycmF5KCk7CgkvLyBmb3IgZ2V0dGluZyB3c2RsCgl2YXIgJHByb3h5aG9zdCA9ICcnOwogICAgdmFyICRwcm94eXBvcnQgPSAnJzsKCXZhciAkcHJveHl1c2VybmFtZSA9ICcnOwoJdmFyICRwcm94eXBhc3N3b3JkID0gJyc7Cgl2YXIgJHRpbWVvdXQgPSAwOwoJdmFyICRyZXNwb25zZV90aW1lb3V0ID0gMzA7CgogICAgLyoqCiAgICAgKiBjb25zdHJ1Y3RvcgogICAgICogCiAgICAgKiBAcGFyYW0gc3RyaW5nICR3c2RsIFdTREwgZG9jdW1lbnQgVVJMCgkgKiBAcGFyYW0gc3RyaW5nICRwcm94eWhvc3QKCSAqIEBwYXJhbSBzdHJpbmcgJHByb3h5cG9ydAoJICogQHBhcmFtIHN0cmluZyAkcHJveHl1c2VybmFtZQoJICogQHBhcmFtIHN0cmluZyAkcHJveHlwYXNzd29yZAoJICogQHBhcmFtIGludGVnZXIgJHRpbWVvdXQgc2V0IHRoZSBjb25uZWN0aW9uIHRpbWVvdXQKCSAqIEBwYXJhbSBpbnRlZ2VyICRyZXNwb25zZV90aW1lb3V0IHNldCB0aGUgcmVzcG9uc2UgdGltZW91dAogICAgICogQGFjY2VzcyBwdWJsaWMgCiAgICAgKi8KICAgIGZ1bmN0aW9uIHdzZGwoJHdzZGwgPSAnJywkcHJveHlob3N0PWZhbHNlLCRwcm94eXBvcnQ9ZmFsc2UsJHByb3h5dXNlcm5hbWU9ZmFsc2UsJHByb3h5cGFzc3dvcmQ9ZmFsc2UsJHRpbWVvdXQ9MCwkcmVzcG9uc2VfdGltZW91dD0zMCl7CgkJcGFyZW50OjpudXNvYXBfYmFzZSgpOwogICAgICAgICR0aGlzLT53c2RsID0gJHdzZGw7CiAgICAgICAgJHRoaXMtPnByb3h5aG9zdCA9ICRwcm94eWhvc3Q7CiAgICAgICAgJHRoaXMtPnByb3h5cG9ydCA9ICRwcm94eXBvcnQ7CgkJJHRoaXMtPnByb3h5dXNlcm5hbWUgPSAkcHJveHl1c2VybmFtZTsKCQkkdGhpcy0+cHJveHlwYXNzd29yZCA9ICRwcm94eXBhc3N3b3JkOwoJCSR0aGlzLT50aW1lb3V0ID0gJHRpbWVvdXQ7CgkJJHRoaXMtPnJlc3BvbnNlX3RpbWVvdXQgPSAkcmVzcG9uc2VfdGltZW91dDsKICAgICAgICAKICAgICAgICAvLyBwYXJzZSB3c2RsIGZpbGUKICAgICAgICBpZiAoJHdzZGwgIT0gIiIpIHsKICAgICAgICAgICAgJHRoaXMtPmRlYnVnKCdpbml0aWFsIHdzZGwgVVJMOiAnIC4gJHdzZGwpOwogICAgICAgICAgICAkdGhpcy0+cGFyc2VXU0RMKCR3c2RsKTsKICAgICAgICB9CiAgICAgICAgLy8gaW1wb3J0cwogICAgICAgIC8vIFRPRE86IGhhbmRsZSBpbXBvcnRzIG1vcmUgcHJvcGVybHksIGdyYWJiaW5nIHRoZW0gaW4tbGluZSBhbmQgbmVzdGluZyB0aGVtCiAgICAgICAgCSRpbXBvcnRlZF91cmxzID0gYXJyYXkoKTsKICAgICAgICAJJGltcG9ydGVkID0gMTsKICAgICAgICAJd2hpbGUgKCRpbXBvcnRlZCA+IDApIHsKICAgICAgICAJCSRpbXBvcnRlZCA9IDA7CiAgICAgICAgCQkvLyBTY2hlbWEgaW1wb3J0cwogICAgICAgIAkJZm9yZWFjaCAoJHRoaXMtPnNjaGVtYXMgYXMgJG5zID0+ICRsaXN0KSB7CiAgICAgICAgCQkJZm9yZWFjaCAoJGxpc3QgYXMgJHhzKSB7CgkJCQkJCSR3c2RscGFydHMgPSBwYXJzZV91cmwoJHRoaXMtPndzZGwpOwkvLyB0aGlzIGlzIGJvZ3VzbHkgc2ltcGxlIQoJCQkgICAgICAgICAgICBmb3JlYWNoICgkeHMtPmltcG9ydHMgYXMgJG5zMiA9PiAkbGlzdDIpIHsKCQkJICAgICAgICAgICAgICAgIGZvciAoJGlpID0gMDsgJGlpIDwgY291bnQoJGxpc3QyKTsgJGlpKyspIHsKCQkJICAgICAgICAgICAgICAgIAlpZiAoISAkbGlzdDJbJGlpXVsnbG9hZGVkJ10pIHsKCQkJICAgICAgICAgICAgICAgIAkJJHRoaXMtPnNjaGVtYXNbJG5zXS0+aW1wb3J0c1skbnMyXVskaWldWydsb2FkZWQnXSA9IHRydWU7CgkJCSAgICAgICAgICAgICAgICAJCSR1cmwgPSAkbGlzdDJbJGlpXVsnbG9jYXRpb24nXTsKCQkJCQkJCQkJaWYgKCR1cmwgIT0gJycpIHsKCQkJCQkJCQkJCSR1cmxwYXJ0cyA9IHBhcnNlX3VybCgkdXJsKTsKCQkJCQkJCQkJCWlmICghaXNzZXQoJHVybHBhcnRzWydob3N0J10pKSB7CgkJCQkJCQkJCQkJJHVybCA9ICR3c2RscGFydHNbJ3NjaGVtZSddIC4gJzovLycgLiAkd3NkbHBhcnRzWydob3N0J10gLiAoaXNzZXQoJHdzZGxwYXJ0c1sncG9ydCddKSA/ICc6JyAuJHdzZGxwYXJ0c1sncG9ydCddIDogJycpIC4KCQkJCQkJCQkJCQkJCXN1YnN0cigkd3NkbHBhcnRzWydwYXRoJ10sMCxzdHJycG9zKCR3c2RscGFydHNbJ3BhdGgnXSwnLycpICsgMSkgLiR1cmxwYXJ0c1sncGF0aCddOwoJCQkJCQkJCQkJfQoJCQkJCQkJCQkJaWYgKCEgaW5fYXJyYXkoJHVybCwgJGltcG9ydGVkX3VybHMpKSB7CgkJCQkJCSAgICAgICAgICAgICAgICAJJHRoaXMtPnBhcnNlV1NETCgkdXJsKTsKCQkJCQkgICAgICAgICAgICAgICAgCQkkaW1wb3J0ZWQrKzsKCQkJCQkgICAgICAgICAgICAgICAgCQkkaW1wb3J0ZWRfdXJsc1tdID0gJHVybDsKCQkJCQkgICAgICAgICAgICAgICAgCX0KCQkJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQkJCSR0aGlzLT5kZWJ1ZygiVW5leHBlY3RlZCBzY2VuYXJpbzogZW1wdHkgVVJMIGZvciB1bmxvYWRlZCBpbXBvcnQiKTsKCQkJCQkJCQkJfQoJCQkJCQkJCX0KCQkJCQkJCX0KCQkJICAgICAgICAgICAgfSAKICAgICAgICAJCQl9CiAgICAgICAgCQl9CiAgICAgICAgCQkvLyBXU0RMIGltcG9ydHMKCQkJCSR3c2RscGFydHMgPSBwYXJzZV91cmwoJHRoaXMtPndzZGwpOwkvLyB0aGlzIGlzIGJvZ3VzbHkgc2ltcGxlIQoJICAgICAgICAgICAgZm9yZWFjaCAoJHRoaXMtPmltcG9ydCBhcyAkbnMgPT4gJGxpc3QpIHsKCSAgICAgICAgICAgICAgICBmb3IgKCRpaSA9IDA7ICRpaSA8IGNvdW50KCRsaXN0KTsgJGlpKyspIHsKCSAgICAgICAgICAgICAgICAJaWYgKCEgJGxpc3RbJGlpXVsnbG9hZGVkJ10pIHsKCSAgICAgICAgICAgICAgICAJCSR0aGlzLT5pbXBvcnRbJG5zXVskaWldWydsb2FkZWQnXSA9IHRydWU7CgkgICAgICAgICAgICAgICAgCQkkdXJsID0gJGxpc3RbJGlpXVsnbG9jYXRpb24nXTsKCQkJCQkJCWlmICgkdXJsICE9ICcnKSB7CgkJCQkJCQkJJHVybHBhcnRzID0gcGFyc2VfdXJsKCR1cmwpOwoJCQkJCQkJCWlmICghaXNzZXQoJHVybHBhcnRzWydob3N0J10pKSB7CgkJCQkJCQkJCSR1cmwgPSAkd3NkbHBhcnRzWydzY2hlbWUnXSAuICc6Ly8nIC4gJHdzZGxwYXJ0c1snaG9zdCddIC4gKGlzc2V0KCR3c2RscGFydHNbJ3BvcnQnXSkgPyAnOicgLiAkd3NkbHBhcnRzWydwb3J0J10gOiAnJykgLgoJCQkJCQkJCQkJCXN1YnN0cigkd3NkbHBhcnRzWydwYXRoJ10sMCxzdHJycG9zKCR3c2RscGFydHNbJ3BhdGgnXSwnLycpICsgMSkgLiR1cmxwYXJ0c1sncGF0aCddOwoJCQkJCQkJCX0KCQkJCQkJCQlpZiAoISBpbl9hcnJheSgkdXJsLCAkaW1wb3J0ZWRfdXJscykpIHsKCQkJCSAgICAgICAgICAgICAgICAJJHRoaXMtPnBhcnNlV1NETCgkdXJsKTsKCQkJICAgICAgICAgICAgICAgIAkJJGltcG9ydGVkKys7CgkJCSAgICAgICAgICAgICAgICAJCSRpbXBvcnRlZF91cmxzW10gPSAkdXJsOwoJCQkgICAgICAgICAgICAgICAgCX0KCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJJHRoaXMtPmRlYnVnKCJVbmV4cGVjdGVkIHNjZW5hcmlvOiBlbXB0eSBVUkwgZm9yIHVubG9hZGVkIGltcG9ydCIpOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoJICAgICAgICAgICAgfSAKCQkJfQogICAgICAgIC8vIGFkZCBuZXcgZGF0YSB0byBvcGVyYXRpb24gZGF0YQogICAgICAgIGZvcmVhY2goJHRoaXMtPmJpbmRpbmdzIGFzICRiaW5kaW5nID0+ICRiaW5kaW5nRGF0YSkgewogICAgICAgICAgICBpZiAoaXNzZXQoJGJpbmRpbmdEYXRhWydvcGVyYXRpb25zJ10pICYmIGlzX2FycmF5KCRiaW5kaW5nRGF0YVsnb3BlcmF0aW9ucyddKSkgewogICAgICAgICAgICAgICAgZm9yZWFjaCgkYmluZGluZ0RhdGFbJ29wZXJhdGlvbnMnXSBhcyAkb3BlcmF0aW9uID0+ICRkYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmRlYnVnKCdwb3N0LXBhcnNlIGRhdGEgZ2F0aGVyaW5nIGZvciAnIC4gJG9wZXJhdGlvbik7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmJpbmRpbmdzWyRiaW5kaW5nXVsnb3BlcmF0aW9ucyddWyRvcGVyYXRpb25dWydpbnB1dCddID0gCgkJCQkJCWlzc2V0KCR0aGlzLT5iaW5kaW5nc1skYmluZGluZ11bJ29wZXJhdGlvbnMnXVskb3BlcmF0aW9uXVsnaW5wdXQnXSkgPyAKCQkJCQkJYXJyYXlfbWVyZ2UoJHRoaXMtPmJpbmRpbmdzWyRiaW5kaW5nXVsnb3BlcmF0aW9ucyddWyRvcGVyYXRpb25dWydpbnB1dCddLCAkdGhpcy0+cG9ydFR5cGVzWyAkYmluZGluZ0RhdGFbJ3BvcnRUeXBlJ10gXVskb3BlcmF0aW9uXVsnaW5wdXQnXSkgOgoJCQkJCQkkdGhpcy0+cG9ydFR5cGVzWyAkYmluZGluZ0RhdGFbJ3BvcnRUeXBlJ10gXVskb3BlcmF0aW9uXVsnaW5wdXQnXTsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+YmluZGluZ3NbJGJpbmRpbmddWydvcGVyYXRpb25zJ11bJG9wZXJhdGlvbl1bJ291dHB1dCddID0gCgkJCQkJCWlzc2V0KCR0aGlzLT5iaW5kaW5nc1skYmluZGluZ11bJ29wZXJhdGlvbnMnXVskb3BlcmF0aW9uXVsnb3V0cHV0J10pID8KCQkJCQkJYXJyYXlfbWVyZ2UoJHRoaXMtPmJpbmRpbmdzWyRiaW5kaW5nXVsnb3BlcmF0aW9ucyddWyRvcGVyYXRpb25dWydvdXRwdXQnXSwgJHRoaXMtPnBvcnRUeXBlc1sgJGJpbmRpbmdEYXRhWydwb3J0VHlwZSddIF1bJG9wZXJhdGlvbl1bJ291dHB1dCddKSA6CgkJCQkJCSR0aGlzLT5wb3J0VHlwZXNbICRiaW5kaW5nRGF0YVsncG9ydFR5cGUnXSBdWyRvcGVyYXRpb25dWydvdXRwdXQnXTsKICAgICAgICAgICAgICAgICAgICBpZihpc3NldCgkdGhpcy0+bWVzc2FnZXNbICR0aGlzLT5iaW5kaW5nc1skYmluZGluZ11bJ29wZXJhdGlvbnMnXVskb3BlcmF0aW9uXVsnaW5wdXQnXVsnbWVzc2FnZSddIF0pKXsKCQkJCQkJJHRoaXMtPmJpbmRpbmdzWyRiaW5kaW5nXVsnb3BlcmF0aW9ucyddWyRvcGVyYXRpb25dWydpbnB1dCddWydwYXJ0cyddID0gJHRoaXMtPm1lc3NhZ2VzWyAkdGhpcy0+YmluZGluZ3NbJGJpbmRpbmddWydvcGVyYXRpb25zJ11bJG9wZXJhdGlvbl1bJ2lucHV0J11bJ21lc3NhZ2UnXSBdOwoJCQkJCX0KCQkJCQlpZihpc3NldCgkdGhpcy0+bWVzc2FnZXNbICR0aGlzLT5iaW5kaW5nc1skYmluZGluZ11bJ29wZXJhdGlvbnMnXVskb3BlcmF0aW9uXVsnb3V0cHV0J11bJ21lc3NhZ2UnXSBdKSl7CiAgICAgICAgICAgICAgICAgICAJCSR0aGlzLT5iaW5kaW5nc1skYmluZGluZ11bJ29wZXJhdGlvbnMnXVskb3BlcmF0aW9uXVsnb3V0cHV0J11bJ3BhcnRzJ10gPSAkdGhpcy0+bWVzc2FnZXNbICR0aGlzLT5iaW5kaW5nc1skYmluZGluZ11bJ29wZXJhdGlvbnMnXVskb3BlcmF0aW9uXVsnb3V0cHV0J11bJ21lc3NhZ2UnXSBdOwogICAgICAgICAgICAgICAgICAgIH0KCQkJCQlpZiAoaXNzZXQoJGJpbmRpbmdEYXRhWydzdHlsZSddKSkgewogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+YmluZGluZ3NbJGJpbmRpbmddWydvcGVyYXRpb25zJ11bJG9wZXJhdGlvbl1bJ3N0eWxlJ10gPSAkYmluZGluZ0RhdGFbJ3N0eWxlJ107CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5iaW5kaW5nc1skYmluZGluZ11bJ29wZXJhdGlvbnMnXVskb3BlcmF0aW9uXVsndHJhbnNwb3J0J10gPSBpc3NldCgkYmluZGluZ0RhdGFbJ3RyYW5zcG9ydCddKSA/ICRiaW5kaW5nRGF0YVsndHJhbnNwb3J0J10gOiAnJzsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+YmluZGluZ3NbJGJpbmRpbmddWydvcGVyYXRpb25zJ11bJG9wZXJhdGlvbl1bJ2RvY3VtZW50YXRpb24nXSA9IGlzc2V0KCR0aGlzLT5wb3J0VHlwZXNbICRiaW5kaW5nRGF0YVsncG9ydFR5cGUnXSBdWyRvcGVyYXRpb25dWydkb2N1bWVudGF0aW9uJ10pID8gJHRoaXMtPnBvcnRUeXBlc1sgJGJpbmRpbmdEYXRhWydwb3J0VHlwZSddIF1bJG9wZXJhdGlvbl1bJ2RvY3VtZW50YXRpb24nXSA6ICcnOwogICAgICAgICAgICAgICAgICAgICR0aGlzLT5iaW5kaW5nc1skYmluZGluZ11bJ29wZXJhdGlvbnMnXVskb3BlcmF0aW9uXVsnZW5kcG9pbnQnXSA9IGlzc2V0KCRiaW5kaW5nRGF0YVsnZW5kcG9pbnQnXSkgPyAkYmluZGluZ0RhdGFbJ2VuZHBvaW50J10gOiAnJzsKICAgICAgICAgICAgICAgIH0gCiAgICAgICAgICAgIH0gCiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogcGFyc2VzIHRoZSB3c2RsIGRvY3VtZW50CiAgICAgKiAKICAgICAqIEBwYXJhbSBzdHJpbmcgJHdzZGwgcGF0aCBvciBVUkwKICAgICAqIEBhY2Nlc3MgcHJpdmF0ZSAKICAgICAqLwogICAgZnVuY3Rpb24gcGFyc2VXU0RMKCR3c2RsID0gJycpCiAgICB7CiAgICAgICAgaWYgKCR3c2RsID09ICcnKSB7CiAgICAgICAgICAgICR0aGlzLT5kZWJ1Zygnbm8gd3NkbCBwYXNzZWQgdG8gcGFyc2VXU0RMKCkhIScpOwogICAgICAgICAgICAkdGhpcy0+c2V0RXJyb3IoJ25vIHdzZGwgcGFzc2VkIHRvIHBhcnNlV1NETCgpISEnKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAvLyBwYXJzZSAkd3NkbCBmb3IgdXJsIGZvcm1hdAogICAgICAgICR3c2RsX3Byb3BzID0gcGFyc2VfdXJsKCR3c2RsKTsKCiAgICAgICAgaWYgKGlzc2V0KCR3c2RsX3Byb3BzWydzY2hlbWUnXSkgJiYgKCR3c2RsX3Byb3BzWydzY2hlbWUnXSA9PSAnaHR0cCcgfHwgJHdzZGxfcHJvcHNbJ3NjaGVtZSddID09ICdodHRwcycpKSB7CiAgICAgICAgICAgICR0aGlzLT5kZWJ1ZygnZ2V0dGluZyBXU0RMIGh0dHAocykgVVJMICcgLiAkd3NkbCk7CiAgICAgICAgCS8vIGdldCB3c2RsCgkgICAgICAgICR0ciA9IG5ldyBzb2FwX3RyYW5zcG9ydF9odHRwKCR3c2RsKTsKCQkJJHRyLT5yZXF1ZXN0X21ldGhvZCA9ICdHRVQnOwoJCQkkdHItPnVzZVNPQVBBY3Rpb24gPSBmYWxzZTsKCQkJaWYoJHRoaXMtPnByb3h5aG9zdCAmJiAkdGhpcy0+cHJveHlwb3J0KXsKCQkJCSR0ci0+c2V0UHJveHkoJHRoaXMtPnByb3h5aG9zdCwkdGhpcy0+cHJveHlwb3J0LCR0aGlzLT5wcm94eXVzZXJuYW1lLCR0aGlzLT5wcm94eXBhc3N3b3JkKTsKCQkJfQoJCQkkdHItPnNldEVuY29kaW5nKCdnemlwLCBkZWZsYXRlJyk7CgkJCSR3c2RsX3N0cmluZyA9ICR0ci0+c2VuZCgnJywgJHRoaXMtPnRpbWVvdXQsICR0aGlzLT5yZXNwb25zZV90aW1lb3V0KTsKCQkJLy8kdGhpcy0+ZGVidWcoIldTREwgcmVxdWVzdFxuIiAuICR0ci0+b3V0Z29pbmdfcGF5bG9hZCk7CgkJCS8vJHRoaXMtPmRlYnVnKCJXU0RMIHJlc3BvbnNlXG4iIC4gJHRyLT5pbmNvbWluZ19wYXlsb2FkKTsKCQkJJHRoaXMtPmFwcGVuZERlYnVnKCR0ci0+Z2V0RGVidWcoKSk7CgkJCS8vIGNhdGNoIGVycm9ycwoJCQlpZigkZXJyID0gJHRyLT5nZXRFcnJvcigpICl7CgkJCQkkZXJyc3RyID0gJ0hUVFAgRVJST1I6ICcuJGVycjsKCQkJCSR0aGlzLT5kZWJ1ZygkZXJyc3RyKTsKCSAgICAgICAgICAgICR0aGlzLT5zZXRFcnJvcigkZXJyc3RyKTsKCQkJCXVuc2V0KCR0cik7CgkgICAgICAgICAgICByZXR1cm4gZmFsc2U7CgkJCX0KCQkJdW5zZXQoJHRyKTsKCQkJJHRoaXMtPmRlYnVnKCJnb3QgV1NETCBVUkwiKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyAkd3NkbCBpcyBub3QgaHR0cChzKSwgc28gdHJlYXQgaXQgYXMgYSBmaWxlIFVSTCBvciBwbGFpbiBmaWxlIHBhdGgKICAgICAgICAJaWYgKGlzc2V0KCR3c2RsX3Byb3BzWydzY2hlbWUnXSkgJiYgKCR3c2RsX3Byb3BzWydzY2hlbWUnXSA9PSAnZmlsZScpICYmIGlzc2V0KCR3c2RsX3Byb3BzWydwYXRoJ10pKSB7CiAgICAgICAgCQkkcGF0aCA9IGlzc2V0KCR3c2RsX3Byb3BzWydob3N0J10pID8gKCR3c2RsX3Byb3BzWydob3N0J10gLiAnOicgLiAkd3NkbF9wcm9wc1sncGF0aCddKSA6ICR3c2RsX3Byb3BzWydwYXRoJ107CiAgICAgICAgCX0gZWxzZSB7CiAgICAgICAgCQkkcGF0aCA9ICR3c2RsOwogICAgICAgIAl9CiAgICAgICAgICAgICR0aGlzLT5kZWJ1ZygnZ2V0dGluZyBXU0RMIGZpbGUgJyAuICRwYXRoKTsKICAgICAgICAgICAgaWYgKCRmcCA9IEBmb3BlbigkcGF0aCwgJ3InKSkgewogICAgICAgICAgICAgICAgJHdzZGxfc3RyaW5nID0gJyc7CiAgICAgICAgICAgICAgICB3aGlsZSAoJGRhdGEgPSBmcmVhZCgkZnAsIDMyNzY4KSkgewogICAgICAgICAgICAgICAgICAgICR3c2RsX3N0cmluZyAuPSAkZGF0YTsKICAgICAgICAgICAgICAgIH0gCiAgICAgICAgICAgICAgICBmY2xvc2UoJGZwKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgCSRlcnJzdHIgPSAiQmFkIHBhdGggdG8gV1NETCBmaWxlICRwYXRoIjsKICAgICAgICAgICAgCSR0aGlzLT5kZWJ1ZygkZXJyc3RyKTsKICAgICAgICAgICAgICAgICR0aGlzLT5zZXRFcnJvcigkZXJyc3RyKTsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfSAKICAgICAgICB9CiAgICAgICAgJHRoaXMtPmRlYnVnKCdQYXJzZSBXU0RMJyk7CiAgICAgICAgLy8gZW5kIG5ldyBjb2RlIGFkZGVkCiAgICAgICAgLy8gQ3JlYXRlIGFuIFhNTCBwYXJzZXIuCiAgICAgICAgJHRoaXMtPnBhcnNlciA9IHhtbF9wYXJzZXJfY3JlYXRlKCk7IAogICAgICAgIC8vIFNldCB0aGUgb3B0aW9ucyBmb3IgcGFyc2luZyB0aGUgWE1MIGRhdGEuCiAgICAgICAgLy8geG1sX3BhcnNlcl9zZXRfb3B0aW9uKCRwYXJzZXIsIFhNTF9PUFRJT05fU0tJUF9XSElURSwgMSk7CiAgICAgICAgeG1sX3BhcnNlcl9zZXRfb3B0aW9uKCR0aGlzLT5wYXJzZXIsIFhNTF9PUFRJT05fQ0FTRV9GT0xESU5HLCAwKTsgCiAgICAgICAgLy8gU2V0IHRoZSBvYmplY3QgZm9yIHRoZSBwYXJzZXIuCiAgICAgICAgeG1sX3NldF9vYmplY3QoJHRoaXMtPnBhcnNlciwgJHRoaXMpOyAKICAgICAgICAvLyBTZXQgdGhlIGVsZW1lbnQgaGFuZGxlcnMgZm9yIHRoZSBwYXJzZXIuCiAgICAgICAgeG1sX3NldF9lbGVtZW50X2hhbmRsZXIoJHRoaXMtPnBhcnNlciwgJ3N0YXJ0X2VsZW1lbnQnLCAnZW5kX2VsZW1lbnQnKTsKICAgICAgICB4bWxfc2V0X2NoYXJhY3Rlcl9kYXRhX2hhbmRsZXIoJHRoaXMtPnBhcnNlciwgJ2NoYXJhY3Rlcl9kYXRhJyk7CiAgICAgICAgLy8gUGFyc2UgdGhlIFhNTCBmaWxlLgogICAgICAgIGlmICgheG1sX3BhcnNlKCR0aGlzLT5wYXJzZXIsICR3c2RsX3N0cmluZywgdHJ1ZSkpIHsKICAgICAgICAgICAgLy8gRGlzcGxheSBhbiBlcnJvciBtZXNzYWdlLgogICAgICAgICAgICAkZXJyc3RyID0gc3ByaW50ZigKCQkJCSdYTUwgZXJyb3IgcGFyc2luZyBXU0RMIGZyb20gJXMgb24gbGluZSAlZDogJXMnLAoJCQkJJHdzZGwsCiAgICAgICAgICAgICAgICB4bWxfZ2V0X2N1cnJlbnRfbGluZV9udW1iZXIoJHRoaXMtPnBhcnNlciksCiAgICAgICAgICAgICAgICB4bWxfZXJyb3Jfc3RyaW5nKHhtbF9nZXRfZXJyb3JfY29kZSgkdGhpcy0+cGFyc2VyKSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICR0aGlzLT5kZWJ1ZygkZXJyc3RyKTsKCQkJJHRoaXMtPmRlYnVnKCJYTUwgcGF5bG9hZDpcbiIgLiAkd3NkbF9zdHJpbmcpOwogICAgICAgICAgICAkdGhpcy0+c2V0RXJyb3IoJGVycnN0cik7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9IAoJCS8vIGZyZWUgdGhlIHBhcnNlcgogICAgICAgIHhtbF9wYXJzZXJfZnJlZSgkdGhpcy0+cGFyc2VyKTsKICAgICAgICAkdGhpcy0+ZGVidWcoJ1BhcnNpbmcgV1NETCBkb25lJyk7CgkJLy8gY2F0Y2ggd3NkbCBwYXJzZSBlcnJvcnMKCQlpZigkdGhpcy0+Z2V0RXJyb3IoKSl7CgkJCXJldHVybiBmYWxzZTsKCQl9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9IAoKICAgIC8qKgogICAgICogc3RhcnQtZWxlbWVudCBoYW5kbGVyCiAgICAgKiAKICAgICAqIEBwYXJhbSBzdHJpbmcgJHBhcnNlciBYTUwgcGFyc2VyIG9iamVjdAogICAgICogQHBhcmFtIHN0cmluZyAkbmFtZSBlbGVtZW50IG5hbWUKICAgICAqIEBwYXJhbSBzdHJpbmcgJGF0dHJzIGFzc29jaWF0aXZlIGFycmF5IG9mIGF0dHJpYnV0ZXMKICAgICAqIEBhY2Nlc3MgcHJpdmF0ZSAKICAgICAqLwogICAgZnVuY3Rpb24gc3RhcnRfZWxlbWVudCgkcGFyc2VyLCAkbmFtZSwgJGF0dHJzKQogICAgewogICAgICAgIGlmICgkdGhpcy0+c3RhdHVzID09ICdzY2hlbWEnKSB7CiAgICAgICAgICAgICR0aGlzLT5jdXJyZW50U2NoZW1hLT5zY2hlbWFTdGFydEVsZW1lbnQoJHBhcnNlciwgJG5hbWUsICRhdHRycyk7CiAgICAgICAgICAgICR0aGlzLT5hcHBlbmREZWJ1ZygkdGhpcy0+Y3VycmVudFNjaGVtYS0+Z2V0RGVidWcoKSk7CiAgICAgICAgICAgICR0aGlzLT5jdXJyZW50U2NoZW1hLT5jbGVhckRlYnVnKCk7CiAgICAgICAgfSBlbHNlaWYgKGVyZWcoJ3NjaGVtYSQnLCAkbmFtZSkpIHsKICAgICAgICAJJHRoaXMtPmRlYnVnKCdQYXJzaW5nIFdTREwgc2NoZW1hJyk7CiAgICAgICAgICAgIC8vICR0aGlzLT5kZWJ1Zygic3RhcnRFbGVtZW50IGZvciAkbmFtZSAoJGF0dHJzW25hbWVdKS4gc3RhdHVzID0gJHRoaXMtPnN0YXR1cyAoIi4kdGhpcy0+Z2V0TG9jYWxQYXJ0KCRuYW1lKS4iKSIpOwogICAgICAgICAgICAkdGhpcy0+c3RhdHVzID0gJ3NjaGVtYSc7CiAgICAgICAgICAgICR0aGlzLT5jdXJyZW50U2NoZW1hID0gbmV3IHhtbHNjaGVtYSgnJywgJycsICR0aGlzLT5uYW1lc3BhY2VzKTsKICAgICAgICAgICAgJHRoaXMtPmN1cnJlbnRTY2hlbWEtPnNjaGVtYVN0YXJ0RWxlbWVudCgkcGFyc2VyLCAkbmFtZSwgJGF0dHJzKTsKICAgICAgICAgICAgJHRoaXMtPmFwcGVuZERlYnVnKCR0aGlzLT5jdXJyZW50U2NoZW1hLT5nZXREZWJ1ZygpKTsKICAgICAgICAgICAgJHRoaXMtPmN1cnJlbnRTY2hlbWEtPmNsZWFyRGVidWcoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBwb3NpdGlvbiBpbiB0aGUgdG90YWwgbnVtYmVyIG9mIGVsZW1lbnRzLCBzdGFydGluZyBmcm9tIDAKICAgICAgICAgICAgJHBvcyA9ICR0aGlzLT5wb3NpdGlvbisrOwogICAgICAgICAgICAkZGVwdGggPSAkdGhpcy0+ZGVwdGgrKzsgCiAgICAgICAgICAgIC8vIHNldCBzZWxmIGFzIGN1cnJlbnQgdmFsdWUgZm9yIHRoaXMgZGVwdGgKICAgICAgICAgICAgJHRoaXMtPmRlcHRoX2FycmF5WyRkZXB0aF0gPSAkcG9zOwogICAgICAgICAgICAkdGhpcy0+bWVzc2FnZVskcG9zXSA9IGFycmF5KCdjZGF0YScgPT4gJycpOyAKICAgICAgICAgICAgLy8gcHJvY2VzcyBhdHRyaWJ1dGVzCiAgICAgICAgICAgIGlmIChjb3VudCgkYXR0cnMpID4gMCkgewoJCQkJLy8gcmVnaXN0ZXIgbmFtZXNwYWNlIGRlY2xhcmF0aW9ucwogICAgICAgICAgICAgICAgZm9yZWFjaCgkYXR0cnMgYXMgJGsgPT4gJHYpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZXJlZygiXnhtbG5zIiwgJGspKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkbnNfcHJlZml4ID0gc3Vic3RyKHN0cnJjaHIoJGssICc6JyksIDEpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+bmFtZXNwYWNlc1skbnNfcHJlZml4XSA9ICR2OwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPm5hbWVzcGFjZXNbJ25zJyAuIChjb3VudCgkdGhpcy0+bmFtZXNwYWNlcykgKyAxKV0gPSAkdjsKICAgICAgICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCR2ID09ICdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYScgfHwgJHYgPT0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkvWE1MU2NoZW1hJyB8fCAkdiA9PSAnaHR0cDovL3d3dy53My5vcmcvMjAwMC8xMC9YTUxTY2hlbWEnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+WE1MU2NoZW1hVmVyc2lvbiA9ICR2OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPm5hbWVzcGFjZXNbJ3hzaSddID0gJHYgLiAnLWluc3RhbmNlJzsKICAgICAgICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBleHBhbmQgZWFjaCBhdHRyaWJ1dGUgcHJlZml4IHRvIGl0cyBuYW1lc3BhY2UKICAgICAgICAgICAgICAgIGZvcmVhY2goJGF0dHJzIGFzICRrID0+ICR2KSB7CiAgICAgICAgICAgICAgICAgICAgJGsgPSBzdHJwb3MoJGssICc6JykgPyAkdGhpcy0+ZXhwYW5kUW5hbWUoJGspIDogJGs7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRrICE9ICdsb2NhdGlvbicgJiYgJGsgIT0gJ3NvYXBBY3Rpb24nICYmICRrICE9ICduYW1lc3BhY2UnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICR2ID0gc3RycG9zKCR2LCAnOicpID8gJHRoaXMtPmV4cGFuZFFuYW1lKCR2KSA6ICR2OwogICAgICAgICAgICAgICAgICAgIH0gCiAgICAgICAgICAgICAgICAgICAgJGVBdHRyc1ska10gPSAkdjsKICAgICAgICAgICAgICAgIH0gCiAgICAgICAgICAgICAgICAkYXR0cnMgPSAkZUF0dHJzOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJGF0dHJzID0gYXJyYXkoKTsKICAgICAgICAgICAgfSAKICAgICAgICAgICAgLy8gZ2V0IGVsZW1lbnQgcHJlZml4LCBuYW1lc3BhY2UgYW5kIG5hbWUKICAgICAgICAgICAgaWYgKGVyZWcoJzonLCAkbmFtZSkpIHsKICAgICAgICAgICAgICAgIC8vIGdldCBucyBwcmVmaXgKICAgICAgICAgICAgICAgICRwcmVmaXggPSBzdWJzdHIoJG5hbWUsIDAsIHN0cnBvcygkbmFtZSwgJzonKSk7IAogICAgICAgICAgICAgICAgLy8gZ2V0IG5zCiAgICAgICAgICAgICAgICAkbmFtZXNwYWNlID0gaXNzZXQoJHRoaXMtPm5hbWVzcGFjZXNbJHByZWZpeF0pID8gJHRoaXMtPm5hbWVzcGFjZXNbJHByZWZpeF0gOiAnJzsgCiAgICAgICAgICAgICAgICAvLyBnZXQgdW5xdWFsaWZpZWQgbmFtZQogICAgICAgICAgICAgICAgJG5hbWUgPSBzdWJzdHIoc3Ryc3RyKCRuYW1lLCAnOicpLCAxKTsKICAgICAgICAgICAgfSAKCQkJLy8gcHJvY2VzcyBhdHRyaWJ1dGVzLCBleHBhbmRpbmcgYW55IHByZWZpeGVzIHRvIG5hbWVzcGFjZXMKICAgICAgICAgICAgLy8gZmluZCBzdGF0dXMsIHJlZ2lzdGVyIGRhdGEKICAgICAgICAgICAgc3dpdGNoICgkdGhpcy0+c3RhdHVzKSB7CiAgICAgICAgICAgICAgICBjYXNlICdtZXNzYWdlJzoKICAgICAgICAgICAgICAgICAgICBpZiAoJG5hbWUgPT0gJ3BhcnQnKSB7CgkJCSAgICAgICAgICAgIGlmIChpc3NldCgkYXR0cnNbJ3R5cGUnXSkpIHsKCQkgICAgICAgICAgICAgICAgICAgICR0aGlzLT5kZWJ1ZygibXNnICIgLiAkdGhpcy0+Y3VycmVudE1lc3NhZ2UgLiAiOiBmb3VuZCBwYXJ0ICRhdHRyc1tuYW1lXTogIiAuIGltcGxvZGUoJywnLCAkYXR0cnMpKTsKCQkgICAgICAgICAgICAgICAgICAgICR0aGlzLT5tZXNzYWdlc1skdGhpcy0+Y3VycmVudE1lc3NhZ2VdWyRhdHRyc1snbmFtZSddXSA9ICRhdHRyc1sndHlwZSddOwogICAgICAgICAgICAJCQl9IAoJCQkgICAgICAgICAgICBpZiAoaXNzZXQoJGF0dHJzWydlbGVtZW50J10pKSB7CgkJICAgICAgICAgICAgICAgICAgICAkdGhpcy0+ZGVidWcoIm1zZyAiIC4gJHRoaXMtPmN1cnJlbnRNZXNzYWdlIC4gIjogZm91bmQgcGFydCAkYXR0cnNbbmFtZV06ICIgLiBpbXBsb2RlKCcsJywgJGF0dHJzKSk7CgkJCSAgICAgICAgICAgICAgICAkdGhpcy0+bWVzc2FnZXNbJHRoaXMtPmN1cnJlbnRNZXNzYWdlXVskYXR0cnNbJ25hbWUnXV0gPSAkYXR0cnNbJ2VsZW1lbnQnXTsKCQkJICAgICAgICAgICAgfSAKICAgICAgICAJCQl9IAogICAgICAgIAkJCWJyZWFrOwoJCQkgICAgY2FzZSAncG9ydFR5cGUnOgoJCQkgICAgICAgIHN3aXRjaCAoJG5hbWUpIHsKCQkJICAgICAgICAgICAgY2FzZSAnb3BlcmF0aW9uJzoKCQkJICAgICAgICAgICAgICAgICR0aGlzLT5jdXJyZW50UG9ydE9wZXJhdGlvbiA9ICRhdHRyc1snbmFtZSddOwoJCQkgICAgICAgICAgICAgICAgJHRoaXMtPmRlYnVnKCJwb3J0VHlwZSAkdGhpcy0+Y3VycmVudFBvcnRUeXBlIG9wZXJhdGlvbjogJHRoaXMtPmN1cnJlbnRQb3J0T3BlcmF0aW9uIik7CgkJCSAgICAgICAgICAgICAgICBpZiAoaXNzZXQoJGF0dHJzWydwYXJhbWV0ZXJPcmRlciddKSkgewoJCQkgICAgICAgICAgICAgICAgCSR0aGlzLT5wb3J0VHlwZXNbJHRoaXMtPmN1cnJlbnRQb3J0VHlwZV1bJGF0dHJzWyduYW1lJ11dWydwYXJhbWV0ZXJPcmRlciddID0gJGF0dHJzWydwYXJhbWV0ZXJPcmRlciddOwoJCQkgICAgICAgIAkJfSAKCQkJICAgICAgICAJCWJyZWFrOwoJCQkJCSAgICBjYXNlICdkb2N1bWVudGF0aW9uJzoKCQkJCQkgICAgICAgICR0aGlzLT5kb2N1bWVudGF0aW9uID0gdHJ1ZTsKCQkJCQkgICAgICAgIGJyZWFrOyAKCQkJCQkgICAgLy8gbWVyZ2UgaW5wdXQvb3V0cHV0IGRhdGEKCQkJCQkgICAgZGVmYXVsdDoKCQkJCQkgICAgICAgICRtID0gaXNzZXQoJGF0dHJzWydtZXNzYWdlJ10pID8gJHRoaXMtPmdldExvY2FsUGFydCgkYXR0cnNbJ21lc3NhZ2UnXSkgOiAnJzsKCQkJCQkgICAgICAgICR0aGlzLT5wb3J0VHlwZXNbJHRoaXMtPmN1cnJlbnRQb3J0VHlwZV1bJHRoaXMtPmN1cnJlbnRQb3J0T3BlcmF0aW9uXVskbmFtZV1bJ21lc3NhZ2UnXSA9ICRtOwoJCQkJCSAgICAgICAgYnJlYWs7CgkJCQkJfSAKCQkJICAgIAlicmVhazsKCQkJCWNhc2UgJ2JpbmRpbmcnOgoJCQkJICAgIHN3aXRjaCAoJG5hbWUpIHsKCQkJCSAgICAgICAgY2FzZSAnYmluZGluZyc6IAoJCQkJICAgICAgICAgICAgLy8gZ2V0IG5zIHByZWZpeAoJCQkJICAgICAgICAgICAgaWYgKGlzc2V0KCRhdHRyc1snc3R5bGUnXSkpIHsKCQkJCSAgICAgICAgICAgICR0aGlzLT5iaW5kaW5nc1skdGhpcy0+Y3VycmVudEJpbmRpbmddWydwcmVmaXgnXSA9ICRwcmVmaXg7CgkJCQkJICAgIAl9IAoJCQkJCSAgICAJJHRoaXMtPmJpbmRpbmdzWyR0aGlzLT5jdXJyZW50QmluZGluZ10gPSBhcnJheV9tZXJnZSgkdGhpcy0+YmluZGluZ3NbJHRoaXMtPmN1cnJlbnRCaW5kaW5nXSwgJGF0dHJzKTsKCQkJCQkgICAgCWJyZWFrOwoJCQkJCQljYXNlICdoZWFkZXInOgoJCQkJCQkgICAgJHRoaXMtPmJpbmRpbmdzWyR0aGlzLT5jdXJyZW50QmluZGluZ11bJ29wZXJhdGlvbnMnXVskdGhpcy0+Y3VycmVudE9wZXJhdGlvbl1bJHRoaXMtPm9wU3RhdHVzXVsnaGVhZGVycyddW10gPSAkYXR0cnM7CgkJCQkJCSAgICBicmVhazsKCQkJCQkJY2FzZSAnb3BlcmF0aW9uJzoKCQkJCQkJICAgIGlmIChpc3NldCgkYXR0cnNbJ3NvYXBBY3Rpb24nXSkpIHsKCQkJCQkJICAgICAgICAkdGhpcy0+YmluZGluZ3NbJHRoaXMtPmN1cnJlbnRCaW5kaW5nXVsnb3BlcmF0aW9ucyddWyR0aGlzLT5jdXJyZW50T3BlcmF0aW9uXVsnc29hcEFjdGlvbiddID0gJGF0dHJzWydzb2FwQWN0aW9uJ107CgkJCQkJCSAgICB9IAoJCQkJCQkgICAgaWYgKGlzc2V0KCRhdHRyc1snc3R5bGUnXSkpIHsKCQkJCQkJICAgICAgICAkdGhpcy0+YmluZGluZ3NbJHRoaXMtPmN1cnJlbnRCaW5kaW5nXVsnb3BlcmF0aW9ucyddWyR0aGlzLT5jdXJyZW50T3BlcmF0aW9uXVsnc3R5bGUnXSA9ICRhdHRyc1snc3R5bGUnXTsKCQkJCQkJICAgIH0gCgkJCQkJCSAgICBpZiAoaXNzZXQoJGF0dHJzWyduYW1lJ10pKSB7CgkJCQkJCSAgICAgICAgJHRoaXMtPmN1cnJlbnRPcGVyYXRpb24gPSAkYXR0cnNbJ25hbWUnXTsKCQkJCQkJICAgICAgICAkdGhpcy0+ZGVidWcoImN1cnJlbnQgYmluZGluZyBvcGVyYXRpb246ICR0aGlzLT5jdXJyZW50T3BlcmF0aW9uIik7CgkJCQkJCSAgICAgICAgJHRoaXMtPmJpbmRpbmdzWyR0aGlzLT5jdXJyZW50QmluZGluZ11bJ29wZXJhdGlvbnMnXVskdGhpcy0+Y3VycmVudE9wZXJhdGlvbl1bJ25hbWUnXSA9ICRhdHRyc1snbmFtZSddOwoJCQkJCQkgICAgICAgICR0aGlzLT5iaW5kaW5nc1skdGhpcy0+Y3VycmVudEJpbmRpbmddWydvcGVyYXRpb25zJ11bJHRoaXMtPmN1cnJlbnRPcGVyYXRpb25dWydiaW5kaW5nJ10gPSAkdGhpcy0+Y3VycmVudEJpbmRpbmc7CgkJCQkJCSAgICAgICAgJHRoaXMtPmJpbmRpbmdzWyR0aGlzLT5jdXJyZW50QmluZGluZ11bJ29wZXJhdGlvbnMnXVskdGhpcy0+Y3VycmVudE9wZXJhdGlvbl1bJ2VuZHBvaW50J10gPSBpc3NldCgkdGhpcy0+YmluZGluZ3NbJHRoaXMtPmN1cnJlbnRCaW5kaW5nXVsnZW5kcG9pbnQnXSkgPyAkdGhpcy0+YmluZGluZ3NbJHRoaXMtPmN1cnJlbnRCaW5kaW5nXVsnZW5kcG9pbnQnXSA6ICcnOwoJCQkJCQkgICAgfSAKCQkJCQkJICAgIGJyZWFrOwoJCQkJCQljYXNlICdpbnB1dCc6CgkJCQkJCSAgICAkdGhpcy0+b3BTdGF0dXMgPSAnaW5wdXQnOwoJCQkJCQkgICAgYnJlYWs7CgkJCQkJCWNhc2UgJ291dHB1dCc6CgkJCQkJCSAgICAkdGhpcy0+b3BTdGF0dXMgPSAnb3V0cHV0JzsKCQkJCQkJICAgIGJyZWFrOwoJCQkJCQljYXNlICdib2R5JzoKCQkJCQkJICAgIGlmIChpc3NldCgkdGhpcy0+YmluZGluZ3NbJHRoaXMtPmN1cnJlbnRCaW5kaW5nXVsnb3BlcmF0aW9ucyddWyR0aGlzLT5jdXJyZW50T3BlcmF0aW9uXVskdGhpcy0+b3BTdGF0dXNdKSkgewoJCQkJCQkgICAgICAgICR0aGlzLT5iaW5kaW5nc1skdGhpcy0+Y3VycmVudEJpbmRpbmddWydvcGVyYXRpb25zJ11bJHRoaXMtPmN1cnJlbnRPcGVyYXRpb25dWyR0aGlzLT5vcFN0YXR1c10gPSBhcnJheV9tZXJnZSgkdGhpcy0+YmluZGluZ3NbJHRoaXMtPmN1cnJlbnRCaW5kaW5nXVsnb3BlcmF0aW9ucyddWyR0aGlzLT5jdXJyZW50T3BlcmF0aW9uXVskdGhpcy0+b3BTdGF0dXNdLCAkYXR0cnMpOwoJCQkJCQkgICAgfSBlbHNlIHsKCQkJCQkJICAgICAgICAkdGhpcy0+YmluZGluZ3NbJHRoaXMtPmN1cnJlbnRCaW5kaW5nXVsnb3BlcmF0aW9ucyddWyR0aGlzLT5jdXJyZW50T3BlcmF0aW9uXVskdGhpcy0+b3BTdGF0dXNdID0gJGF0dHJzOwoJCQkJCQkgICAgfSAKCQkJCQkJICAgIGJyZWFrOwoJCQkJCX0gCgkJCQkJYnJlYWs7CgkJCQljYXNlICdzZXJ2aWNlJzoKCQkJCQlzd2l0Y2ggKCRuYW1lKSB7CgkJCQkJICAgIGNhc2UgJ3BvcnQnOgoJCQkJCSAgICAgICAgJHRoaXMtPmN1cnJlbnRQb3J0ID0gJGF0dHJzWyduYW1lJ107CgkJCQkJICAgICAgICAkdGhpcy0+ZGVidWcoJ2N1cnJlbnQgcG9ydDogJyAuICR0aGlzLT5jdXJyZW50UG9ydCk7CgkJCQkJICAgICAgICAkdGhpcy0+cG9ydHNbJHRoaXMtPmN1cnJlbnRQb3J0XVsnYmluZGluZyddID0gJHRoaXMtPmdldExvY2FsUGFydCgkYXR0cnNbJ2JpbmRpbmcnXSk7CgkJCQkJCgkJCQkJICAgICAgICBicmVhazsKCQkJCQkgICAgY2FzZSAnYWRkcmVzcyc6CgkJCQkJICAgICAgICAkdGhpcy0+cG9ydHNbJHRoaXMtPmN1cnJlbnRQb3J0XVsnbG9jYXRpb24nXSA9ICRhdHRyc1snbG9jYXRpb24nXTsKCQkJCQkgICAgICAgICR0aGlzLT5wb3J0c1skdGhpcy0+Y3VycmVudFBvcnRdWydiaW5kaW5nVHlwZSddID0gJG5hbWVzcGFjZTsKCQkJCQkgICAgICAgICR0aGlzLT5iaW5kaW5nc1sgJHRoaXMtPnBvcnRzWyR0aGlzLT5jdXJyZW50UG9ydF1bJ2JpbmRpbmcnXSBdWydiaW5kaW5nVHlwZSddID0gJG5hbWVzcGFjZTsKCQkJCQkgICAgICAgICR0aGlzLT5iaW5kaW5nc1sgJHRoaXMtPnBvcnRzWyR0aGlzLT5jdXJyZW50UG9ydF1bJ2JpbmRpbmcnXSBdWydlbmRwb2ludCddID0gJGF0dHJzWydsb2NhdGlvbiddOwoJCQkJCSAgICAgICAgYnJlYWs7CgkJCQkJfSAKCQkJCQlicmVhazsKCQkJfSAKCQkvLyBzZXQgc3RhdHVzCgkJc3dpdGNoICgkbmFtZSkgewoJCQljYXNlICdpbXBvcnQnOgoJCQkgICAgaWYgKGlzc2V0KCRhdHRyc1snbG9jYXRpb24nXSkpIHsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+aW1wb3J0WyRhdHRyc1snbmFtZXNwYWNlJ11dW10gPSBhcnJheSgnbG9jYXRpb24nID0+ICRhdHRyc1snbG9jYXRpb24nXSwgJ2xvYWRlZCcgPT4gZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICR0aGlzLT5kZWJ1ZygncGFyc2luZyBpbXBvcnQgJyAuICRhdHRyc1snbmFtZXNwYWNlJ10uICcgLSAnIC4gJGF0dHJzWydsb2NhdGlvbiddIC4gJyAoJyAuIGNvdW50KCR0aGlzLT5pbXBvcnRbJGF0dHJzWyduYW1lc3BhY2UnXV0pLicpJyk7CgkJCQl9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICR0aGlzLT5pbXBvcnRbJGF0dHJzWyduYW1lc3BhY2UnXV1bXSA9IGFycmF5KCdsb2NhdGlvbicgPT4gJycsICdsb2FkZWQnID0+IHRydWUpOwoJCQkJCWlmICghICR0aGlzLT5nZXRQcmVmaXhGcm9tTmFtZXNwYWNlKCRhdHRyc1snbmFtZXNwYWNlJ10pKSB7CgkJCQkJCSR0aGlzLT5uYW1lc3BhY2VzWyducycuKGNvdW50KCR0aGlzLT5uYW1lc3BhY2VzKSsxKV0gPSAkYXR0cnNbJ25hbWVzcGFjZSddOwoJCQkJCX0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+ZGVidWcoJ3BhcnNpbmcgaW1wb3J0ICcgLiAkYXR0cnNbJ25hbWVzcGFjZSddLiAnIC0gW25vIGxvY2F0aW9uXSAoJyAuIGNvdW50KCR0aGlzLT5pbXBvcnRbJGF0dHJzWyduYW1lc3BhY2UnXV0pLicpJyk7CgkJCQl9CgkJCQlicmVhazsKCQkJLy93YWl0IGZvciBzY2hlbWEKCQkJLy9jYXNlICd0eXBlcyc6CgkJCS8vCSR0aGlzLT5zdGF0dXMgPSAnc2NoZW1hJzsKCQkJLy8JYnJlYWs7CgkJCWNhc2UgJ21lc3NhZ2UnOgoJCQkJJHRoaXMtPnN0YXR1cyA9ICdtZXNzYWdlJzsKCQkJCSR0aGlzLT5tZXNzYWdlc1skYXR0cnNbJ25hbWUnXV0gPSBhcnJheSgpOwoJCQkJJHRoaXMtPmN1cnJlbnRNZXNzYWdlID0gJGF0dHJzWyduYW1lJ107CgkJCQlicmVhazsKCQkJY2FzZSAncG9ydFR5cGUnOgoJCQkJJHRoaXMtPnN0YXR1cyA9ICdwb3J0VHlwZSc7CgkJCQkkdGhpcy0+cG9ydFR5cGVzWyRhdHRyc1snbmFtZSddXSA9IGFycmF5KCk7CgkJCQkkdGhpcy0+Y3VycmVudFBvcnRUeXBlID0gJGF0dHJzWyduYW1lJ107CgkJCQlicmVhazsKCQkJY2FzZSAiYmluZGluZyI6CgkJCQlpZiAoaXNzZXQoJGF0dHJzWyduYW1lJ10pKSB7CgkJCQkvLyBnZXQgYmluZGluZyBuYW1lCgkJCQkJaWYgKHN0cnBvcygkYXR0cnNbJ25hbWUnXSwgJzonKSkgewoJCQkgICAgCQkkdGhpcy0+Y3VycmVudEJpbmRpbmcgPSAkdGhpcy0+Z2V0TG9jYWxQYXJ0KCRhdHRyc1snbmFtZSddKTsKCQkJCQl9IGVsc2UgewoJCQkgICAgCQkkdGhpcy0+Y3VycmVudEJpbmRpbmcgPSAkYXR0cnNbJ25hbWUnXTsKCQkJCQl9IAoJCQkJCSR0aGlzLT5zdGF0dXMgPSAnYmluZGluZyc7CgkJCQkJJHRoaXMtPmJpbmRpbmdzWyR0aGlzLT5jdXJyZW50QmluZGluZ11bJ3BvcnRUeXBlJ10gPSAkdGhpcy0+Z2V0TG9jYWxQYXJ0KCRhdHRyc1sndHlwZSddKTsKCQkJCQkkdGhpcy0+ZGVidWcoImN1cnJlbnQgYmluZGluZzogJHRoaXMtPmN1cnJlbnRCaW5kaW5nIG9mIHBvcnRUeXBlOiAiIC4gJGF0dHJzWyd0eXBlJ10pOwoJCQkJfSAKCQkJCWJyZWFrOwoJCQljYXNlICdzZXJ2aWNlJzoKCQkJCSR0aGlzLT5zZXJ2aWNlTmFtZSA9ICRhdHRyc1snbmFtZSddOwoJCQkJJHRoaXMtPnN0YXR1cyA9ICdzZXJ2aWNlJzsKCQkJCSR0aGlzLT5kZWJ1ZygnY3VycmVudCBzZXJ2aWNlOiAnIC4gJHRoaXMtPnNlcnZpY2VOYW1lKTsKCQkJCWJyZWFrOwoJCQljYXNlICdkZWZpbml0aW9ucyc6CgkJCQlmb3JlYWNoICgkYXR0cnMgYXMgJG5hbWUgPT4gJHZhbHVlKSB7CgkJCQkJJHRoaXMtPndzZGxfaW5mb1skbmFtZV0gPSAkdmFsdWU7CgkJCQl9IAoJCQkJYnJlYWs7CgkJCX0gCgkJfSAKCX0gCgoJLyoqCgkqIGVuZC1lbGVtZW50IGhhbmRsZXIKCSogCgkqIEBwYXJhbSBzdHJpbmcgJHBhcnNlciBYTUwgcGFyc2VyIG9iamVjdAoJKiBAcGFyYW0gc3RyaW5nICRuYW1lIGVsZW1lbnQgbmFtZQoJKiBAYWNjZXNzIHByaXZhdGUgCgkqLwoJZnVuY3Rpb24gZW5kX2VsZW1lbnQoJHBhcnNlciwgJG5hbWUpeyAKCQkvLyB1bnNldCBzY2hlbWEgc3RhdHVzCgkJaWYgKC8qZXJlZygndHlwZXMkJywgJG5hbWUpIHx8Ki8gZXJlZygnc2NoZW1hJCcsICRuYW1lKSkgewoJCQkkdGhpcy0+c3RhdHVzID0gIiI7CiAgICAgICAgICAgICR0aGlzLT5hcHBlbmREZWJ1ZygkdGhpcy0+Y3VycmVudFNjaGVtYS0+Z2V0RGVidWcoKSk7CiAgICAgICAgICAgICR0aGlzLT5jdXJyZW50U2NoZW1hLT5jbGVhckRlYnVnKCk7CgkJCSR0aGlzLT5zY2hlbWFzWyR0aGlzLT5jdXJyZW50U2NoZW1hLT5zY2hlbWFUYXJnZXROYW1lc3BhY2VdW10gPSAkdGhpcy0+Y3VycmVudFNjaGVtYTsKICAgICAgICAJJHRoaXMtPmRlYnVnKCdQYXJzaW5nIFdTREwgc2NoZW1hIGRvbmUnKTsKCQl9IAoJCWlmICgkdGhpcy0+c3RhdHVzID09ICdzY2hlbWEnKSB7CgkJCSR0aGlzLT5jdXJyZW50U2NoZW1hLT5zY2hlbWFFbmRFbGVtZW50KCRwYXJzZXIsICRuYW1lKTsKCQl9IGVsc2UgewoJCQkvLyBicmluZyBkZXB0aCBkb3duIGEgbm90Y2gKCQkJJHRoaXMtPmRlcHRoLS07CgkJfSAKCQkvLyBlbmQgZG9jdW1lbnRhdGlvbgoJCWlmICgkdGhpcy0+ZG9jdW1lbnRhdGlvbikgewoJCQkvL1RPRE86IHRyYWNrIHRoZSBub2RlIHRvIHdoaWNoIGRvY3VtZW50YXRpb24gc2hvdWxkIGJlIGFzc2lnbmVkOyBpdCBjYW4gYmUgYSBwYXJ0LCBtZXNzYWdlLCBldGMuCgkJCS8vJHRoaXMtPnBvcnRUeXBlc1skdGhpcy0+Y3VycmVudFBvcnRUeXBlXVskdGhpcy0+Y3VycmVudFBvcnRPcGVyYXRpb25dWydkb2N1bWVudGF0aW9uJ10gPSAkdGhpcy0+ZG9jdW1lbnRhdGlvbjsKCQkJJHRoaXMtPmRvY3VtZW50YXRpb24gPSBmYWxzZTsKCQl9IAoJfSAKCgkvKioKCSAqIGVsZW1lbnQgY29udGVudCBoYW5kbGVyCgkgKiAKCSAqIEBwYXJhbSBzdHJpbmcgJHBhcnNlciBYTUwgcGFyc2VyIG9iamVjdAoJICogQHBhcmFtIHN0cmluZyAkZGF0YSBlbGVtZW50IGNvbnRlbnQKCSAqIEBhY2Nlc3MgcHJpdmF0ZSAKCSAqLwoJZnVuY3Rpb24gY2hhcmFjdGVyX2RhdGEoJHBhcnNlciwgJGRhdGEpCgl7CgkJJHBvcyA9IGlzc2V0KCR0aGlzLT5kZXB0aF9hcnJheVskdGhpcy0+ZGVwdGhdKSA/ICR0aGlzLT5kZXB0aF9hcnJheVskdGhpcy0+ZGVwdGhdIDogMDsKCQlpZiAoaXNzZXQoJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ2NkYXRhJ10pKSB7CgkJCSR0aGlzLT5tZXNzYWdlWyRwb3NdWydjZGF0YSddIC49ICRkYXRhOwoJCX0gCgkJaWYgKCR0aGlzLT5kb2N1bWVudGF0aW9uKSB7CgkJCSR0aGlzLT5kb2N1bWVudGF0aW9uIC49ICRkYXRhOwoJCX0gCgl9IAoJCglmdW5jdGlvbiBnZXRCaW5kaW5nRGF0YSgkYmluZGluZykKCXsKCQlpZiAoaXNfYXJyYXkoJHRoaXMtPmJpbmRpbmdzWyRiaW5kaW5nXSkpIHsKCQkJcmV0dXJuICR0aGlzLT5iaW5kaW5nc1skYmluZGluZ107CgkJfSAKCX0KCQoJLyoqCgkgKiByZXR1cm5zIGFuIGFzc29jIGFycmF5IG9mIG9wZXJhdGlvbiBuYW1lcyA9PiBvcGVyYXRpb24gZGF0YQoJICogCgkgKiBAcGFyYW0gc3RyaW5nICRiaW5kaW5nVHlwZSBlZzogc29hcCwgc210cCwgZGltZSAob25seSBzb2FwIGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQpCgkgKiBAcmV0dXJuIGFycmF5IAoJICogQGFjY2VzcyBwdWJsaWMgCgkgKi8KCWZ1bmN0aW9uIGdldE9wZXJhdGlvbnMoJGJpbmRpbmdUeXBlID0gJ3NvYXAnKQoJewoJCSRvcHMgPSBhcnJheSgpOwoJCWlmICgkYmluZGluZ1R5cGUgPT0gJ3NvYXAnKSB7CgkJCSRiaW5kaW5nVHlwZSA9ICdodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvJzsKCQl9CgkJLy8gbG9vcCB0aHJ1IHBvcnRzCgkJZm9yZWFjaCgkdGhpcy0+cG9ydHMgYXMgJHBvcnQgPT4gJHBvcnREYXRhKSB7CgkJCS8vIGJpbmRpbmcgdHlwZSBvZiBwb3J0IG1hdGNoZXMgcGFyYW1ldGVyCgkJCWlmICgkcG9ydERhdGFbJ2JpbmRpbmdUeXBlJ10gPT0gJGJpbmRpbmdUeXBlKSB7CgkJCQkvLyR0aGlzLT5kZWJ1ZygiZ2V0T3BlcmF0aW9ucyBmb3IgcG9ydCAkcG9ydCIpOwoJCQkJLy8kdGhpcy0+ZGVidWcoInBvcnQgZGF0YTogIiAuICR0aGlzLT52YXJEdW1wKCRwb3J0RGF0YSkpOwoJCQkJLy8kdGhpcy0+ZGVidWcoImJpbmRpbmdzOiAiIC4gJHRoaXMtPnZhckR1bXAoJHRoaXMtPmJpbmRpbmdzWyAkcG9ydERhdGFbJ2JpbmRpbmcnXSBdKSk7CgkJCQkvLyBtZXJnZSBiaW5kaW5ncwoJCQkJaWYgKGlzc2V0KCR0aGlzLT5iaW5kaW5nc1sgJHBvcnREYXRhWydiaW5kaW5nJ10gXVsnb3BlcmF0aW9ucyddKSkgewoJCQkJCSRvcHMgPSBhcnJheV9tZXJnZSAoJG9wcywgJHRoaXMtPmJpbmRpbmdzWyAkcG9ydERhdGFbJ2JpbmRpbmcnXSBdWydvcGVyYXRpb25zJ10pOwoJCQkJfQoJCQl9CgkJfSAKCQlyZXR1cm4gJG9wczsKCX0gCgkKCS8qKgoJICogcmV0dXJucyBhbiBhc3NvY2lhdGl2ZSBhcnJheSBvZiBkYXRhIG5lY2Vzc2FyeSBmb3IgY2FsbGluZyBhbiBvcGVyYXRpb24KCSAqIAoJICogQHBhcmFtIHN0cmluZyAkb3BlcmF0aW9uICwgbmFtZSBvZiBvcGVyYXRpb24KCSAqIEBwYXJhbSBzdHJpbmcgJGJpbmRpbmdUeXBlICwgdHlwZSBvZiBiaW5kaW5nIGVnOiBzb2FwCgkgKiBAcmV0dXJuIGFycmF5IAoJICogQGFjY2VzcyBwdWJsaWMgCgkgKi8KCWZ1bmN0aW9uIGdldE9wZXJhdGlvbkRhdGEoJG9wZXJhdGlvbiwgJGJpbmRpbmdUeXBlID0gJ3NvYXAnKQoJewoJCWlmICgkYmluZGluZ1R5cGUgPT0gJ3NvYXAnKSB7CgkJCSRiaW5kaW5nVHlwZSA9ICdodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvJzsKCQl9CgkJLy8gbG9vcCB0aHJ1IHBvcnRzCgkJZm9yZWFjaCgkdGhpcy0+cG9ydHMgYXMgJHBvcnQgPT4gJHBvcnREYXRhKSB7CgkJCS8vIGJpbmRpbmcgdHlwZSBvZiBwb3J0IG1hdGNoZXMgcGFyYW1ldGVyCgkJCWlmICgkcG9ydERhdGFbJ2JpbmRpbmdUeXBlJ10gPT0gJGJpbmRpbmdUeXBlKSB7CgkJCQkvLyBnZXQgYmluZGluZwoJCQkJLy9mb3JlYWNoKCR0aGlzLT5iaW5kaW5nc1sgJHBvcnREYXRhWydiaW5kaW5nJ10gXVsnb3BlcmF0aW9ucyddIGFzICRiT3BlcmF0aW9uID0+ICRvcERhdGEpIHsKCQkJCWZvcmVhY2goYXJyYXlfa2V5cygkdGhpcy0+YmluZGluZ3NbICRwb3J0RGF0YVsnYmluZGluZyddIF1bJ29wZXJhdGlvbnMnXSkgYXMgJGJPcGVyYXRpb24pIHsKCQkJCQkvLyBub3RlIHRoYXQgd2UgY291bGQvc2hvdWxkIGFsc28gY2hlY2sgdGhlIG5hbWVzcGFjZSBoZXJlCgkJCQkJaWYgKCRvcGVyYXRpb24gPT0gJGJPcGVyYXRpb24pIHsKCQkJCQkJJG9wRGF0YSA9ICR0aGlzLT5iaW5kaW5nc1sgJHBvcnREYXRhWydiaW5kaW5nJ10gXVsnb3BlcmF0aW9ucyddWyRvcGVyYXRpb25dOwoJCQkJCSAgICByZXR1cm4gJG9wRGF0YTsKCQkJCQl9IAoJCQkJfSAKCQkJfQoJCX0gCgl9CgkKCS8qKgoJICogcmV0dXJucyBhbiBhc3NvY2lhdGl2ZSBhcnJheSBvZiBkYXRhIG5lY2Vzc2FyeSBmb3IgY2FsbGluZyBhbiBvcGVyYXRpb24KCSAqIAoJICogQHBhcmFtIHN0cmluZyAkc29hcEFjdGlvbiBzb2FwQWN0aW9uIGZvciBvcGVyYXRpb24KCSAqIEBwYXJhbSBzdHJpbmcgJGJpbmRpbmdUeXBlIHR5cGUgb2YgYmluZGluZyBlZzogc29hcAoJICogQHJldHVybiBhcnJheSAKCSAqIEBhY2Nlc3MgcHVibGljIAoJICovCglmdW5jdGlvbiBnZXRPcGVyYXRpb25EYXRhRm9yU29hcEFjdGlvbigkc29hcEFjdGlvbiwgJGJpbmRpbmdUeXBlID0gJ3NvYXAnKSB7CgkJaWYgKCRiaW5kaW5nVHlwZSA9PSAnc29hcCcpIHsKCQkJJGJpbmRpbmdUeXBlID0gJ2h0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8nOwoJCX0KCQkvLyBsb29wIHRocnUgcG9ydHMKCQlmb3JlYWNoKCR0aGlzLT5wb3J0cyBhcyAkcG9ydCA9PiAkcG9ydERhdGEpIHsKCQkJLy8gYmluZGluZyB0eXBlIG9mIHBvcnQgbWF0Y2hlcyBwYXJhbWV0ZXIKCQkJaWYgKCRwb3J0RGF0YVsnYmluZGluZ1R5cGUnXSA9PSAkYmluZGluZ1R5cGUpIHsKCQkJCS8vIGxvb3AgdGhyb3VnaCBvcGVyYXRpb25zIGZvciB0aGUgYmluZGluZwoJCQkJZm9yZWFjaCAoJHRoaXMtPmJpbmRpbmdzWyAkcG9ydERhdGFbJ2JpbmRpbmcnXSBdWydvcGVyYXRpb25zJ10gYXMgJGJPcGVyYXRpb24gPT4gJG9wRGF0YSkgewoJCQkJCWlmICgkb3BEYXRhWydzb2FwQWN0aW9uJ10gPT0gJHNvYXBBY3Rpb24pIHsKCQkJCQkgICAgcmV0dXJuICRvcERhdGE7CgkJCQkJfSAKCQkJCX0gCgkJCX0KCQl9IAoJfQoJCgkvKioKICAgICogcmV0dXJucyBhbiBhcnJheSBvZiBpbmZvcm1hdGlvbiBhYm91dCBhIGdpdmVuIHR5cGUKICAgICogcmV0dXJucyBmYWxzZSBpZiBubyB0eXBlIGV4aXN0cyBieSB0aGUgZ2l2ZW4gbmFtZQogICAgKgoJKgkgdHlwZURlZiA9IGFycmF5KAoJKgkgJ2VsZW1lbnRzJyA9PiBhcnJheSgpLCAvLyByZWZzIHRvIGVsZW1lbnRzIGFycmF5CgkqCSdyZXN0cmljdGlvbkJhc2UnID0+ICcnLAoJKgkncGhwVHlwZScgPT4gJycsCgkqCSdvcmRlcicgPT4gJyhzZXF1ZW5jZXxhbGwpJywKCSoJJ2F0dHJzJyA9PiBhcnJheSgpIC8vIHJlZnMgdG8gYXR0cmlidXRlcyBhcnJheQoJKgkpCiAgICAqCiAgICAqIEBwYXJhbSAkdHlwZSBzdHJpbmcgdGhlIHR5cGUKICAgICogQHBhcmFtICRucyBzdHJpbmcgbmFtZXNwYWNlIChub3QgcHJlZml4KSBvZiB0aGUgdHlwZQogICAgKiBAcmV0dXJuIG1peGVkCiAgICAqIEBhY2Nlc3MgcHVibGljCiAgICAqIEBzZWUgeG1sc2NoZW1hCiAgICAqLwoJZnVuY3Rpb24gZ2V0VHlwZURlZigkdHlwZSwgJG5zKSB7CgkJJHRoaXMtPmRlYnVnKCJpbiBnZXRUeXBlRGVmOiB0eXBlPSR0eXBlLCBucz0kbnMiKTsKCQlpZiAoKCEgJG5zKSAmJiBpc3NldCgkdGhpcy0+bmFtZXNwYWNlc1sndG5zJ10pKSB7CgkJCSRucyA9ICR0aGlzLT5uYW1lc3BhY2VzWyd0bnMnXTsKCQkJJHRoaXMtPmRlYnVnKCJpbiBnZXRUeXBlRGVmOiB0eXBlIG5hbWVzcGFjZSBmb3JjZWQgdG8gJG5zIik7CgkJfQoJCWlmIChpc3NldCgkdGhpcy0+c2NoZW1hc1skbnNdKSkgewoJCQkkdGhpcy0+ZGVidWcoImluIGdldFR5cGVEZWY6IGhhdmUgc2NoZW1hIGZvciBuYW1lc3BhY2UgJG5zIik7CgkJCWZvciAoJGkgPSAwOyAkaSA8IGNvdW50KCR0aGlzLT5zY2hlbWFzWyRuc10pOyAkaSsrKSB7CgkJCQkkeHMgPSAmJHRoaXMtPnNjaGVtYXNbJG5zXVskaV07CgkJCQkkdCA9ICR4cy0+Z2V0VHlwZURlZigkdHlwZSk7CgkJCQkkdGhpcy0+YXBwZW5kRGVidWcoJHhzLT5nZXREZWJ1ZygpKTsKCQkJCSR4cy0+Y2xlYXJEZWJ1ZygpOwoJCQkJaWYgKCR0KSB7CgkJCQkJaWYgKCFpc3NldCgkdFsncGhwVHlwZSddKSkgewoJCQkJCQkvLyBnZXQgaW5mbyBmb3IgdHlwZSB0byB0YWNrIG9udG8gdGhlIGVsZW1lbnQKCQkJCQkJJHVxVHlwZSA9IHN1YnN0cigkdFsndHlwZSddLCBzdHJycG9zKCR0Wyd0eXBlJ10sICc6JykgKyAxKTsKCQkJCQkJJG5zID0gc3Vic3RyKCR0Wyd0eXBlJ10sIDAsIHN0cnJwb3MoJHRbJ3R5cGUnXSwgJzonKSk7CgkJCQkJCSRldHlwZSA9ICR0aGlzLT5nZXRUeXBlRGVmKCR1cVR5cGUsICRucyk7CgkJCQkJCWlmICgkZXR5cGUpIHsKCQkJCQkJCSR0aGlzLT5kZWJ1ZygiZm91bmQgdHlwZSBmb3IgW2VsZW1lbnRdICR0eXBlOiIpOwoJCQkJCQkJJHRoaXMtPmRlYnVnKCR0aGlzLT52YXJEdW1wKCRldHlwZSkpOwoJCQkJCQkJaWYgKGlzc2V0KCRldHlwZVsncGhwVHlwZSddKSkgewoJCQkJCQkJCSR0WydwaHBUeXBlJ10gPSAkZXR5cGVbJ3BocFR5cGUnXTsKCQkJCQkJCX0KCQkJCQkJCWlmIChpc3NldCgkZXR5cGVbJ2VsZW1lbnRzJ10pKSB7CgkJCQkJCQkJJHRbJ2VsZW1lbnRzJ10gPSAkZXR5cGVbJ2VsZW1lbnRzJ107CgkJCQkJCQl9CgkJCQkJCQlpZiAoaXNzZXQoJGV0eXBlWydhdHRycyddKSkgewoJCQkJCQkJCSR0WydhdHRycyddID0gJGV0eXBlWydhdHRycyddOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoJCQkJCXJldHVybiAkdDsKCQkJCX0KCQkJfQoJCX0gZWxzZSB7CgkJCSR0aGlzLT5kZWJ1ZygiaW4gZ2V0VHlwZURlZjogZG8gbm90IGhhdmUgc2NoZW1hIGZvciBuYW1lc3BhY2UgJG5zIik7CgkJfQoJCXJldHVybiBmYWxzZTsKCX0KCiAgICAvKioKICAgICogcHJpbnRzIGh0bWwgZGVzY3JpcHRpb24gb2Ygc2VydmljZXMKICAgICoKICAgICogQGFjY2VzcyBwcml2YXRlCiAgICAqLwogICAgZnVuY3Rpb24gd2ViRGVzY3JpcHRpb24oKXsKICAgIAlnbG9iYWwgJEhUVFBfU0VSVkVSX1ZBUlM7CgoJCWlmIChpc3NldCgkX1NFUlZFUikpIHsKCQkJJFBIUF9TRUxGID0gJF9TRVJWRVJbJ1BIUF9TRUxGJ107CgkJfSBlbHNlaWYgKGlzc2V0KCRIVFRQX1NFUlZFUl9WQVJTKSkgewoJCQkkUEhQX1NFTEYgPSAkSFRUUF9TRVJWRVJfVkFSU1snUEhQX1NFTEYnXTsKCQl9IGVsc2UgewoJCQkkdGhpcy0+c2V0RXJyb3IoIk5laXRoZXIgX1NFUlZFUiBub3IgSFRUUF9TRVJWRVJfVkFSUyBpcyBhdmFpbGFibGUiKTsKCQl9CgoJCSRiID0gJwoJCTxodG1sPjxoZWFkPjx0aXRsZT5OdVNPQVA6ICcuJHRoaXMtPnNlcnZpY2VOYW1lLic8L3RpdGxlPgoJCTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CgkJICAgIGJvZHkgICAgeyBmb250LWZhbWlseTogYXJpYWw7IGNvbG9yOiAjMDAwMDAwOyBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOyBtYXJnaW46IDBweCAwcHggMHB4IDBweDsgfQoJCSAgICBwICAgICAgIHsgZm9udC1mYW1pbHk6IGFyaWFsOyBjb2xvcjogIzAwMDAwMDsgbWFyZ2luLXRvcDogMHB4OyBtYXJnaW4tYm90dG9tOiAxMnB4OyB9CgkJICAgIHByZSB7IGJhY2tncm91bmQtY29sb3I6IHNpbHZlcjsgcGFkZGluZzogNXB4OyBmb250LWZhbWlseTogQ291cmllciBOZXc7IGZvbnQtc2l6ZTogeC1zbWFsbDsgY29sb3I6ICMwMDAwMDA7fQoJCSAgICB1bCAgICAgIHsgbWFyZ2luLXRvcDogMTBweDsgbWFyZ2luLWxlZnQ6IDIwcHg7IH0KCQkgICAgbGkgICAgICB7IGxpc3Qtc3R5bGUtdHlwZTogbm9uZTsgbWFyZ2luLXRvcDogMTBweDsgY29sb3I6ICMwMDAwMDA7IH0KCQkgICAgLmNvbnRlbnR7CgkJCW1hcmdpbi1sZWZ0OiAwcHg7IHBhZGRpbmctYm90dG9tOiAyZW07IH0KCQkgICAgLm5hdiB7CgkJCXBhZGRpbmctdG9wOiAxMHB4OyBwYWRkaW5nLWJvdHRvbTogMTBweDsgcGFkZGluZy1sZWZ0OiAxNXB4OyBmb250LXNpemU6IC43MGVtOwoJCQltYXJnaW4tdG9wOiAxMHB4OyBtYXJnaW4tbGVmdDogMHB4OyBjb2xvcjogIzAwMDAwMDsKCQkJYmFja2dyb3VuZC1jb2xvcjogI2NjY2NmZjsgd2lkdGg6IDIwJTsgbWFyZ2luLWxlZnQ6IDIwcHg7IG1hcmdpbi10b3A6IDIwcHg7IH0KCQkgICAgLnRpdGxlIHsKCQkJZm9udC1mYW1pbHk6IGFyaWFsOyBmb250LXNpemU6IDI2cHg7IGNvbG9yOiAjZmZmZmZmOwoJCQliYWNrZ3JvdW5kLWNvbG9yOiAjOTk5OTk5OyB3aWR0aDogMTA1JTsgbWFyZ2luLWxlZnQ6IDBweDsKCQkJcGFkZGluZy10b3A6IDEwcHg7IHBhZGRpbmctYm90dG9tOiAxMHB4OyBwYWRkaW5nLWxlZnQ6IDE1cHg7fQoJCSAgICAuaGlkZGVuIHsKCQkJcG9zaXRpb246IGFic29sdXRlOyB2aXNpYmlsaXR5OiBoaWRkZW47IHotaW5kZXg6IDIwMDsgbGVmdDogMjUwcHg7IHRvcDogMTAwcHg7CgkJCWZvbnQtZmFtaWx5OiBhcmlhbDsgb3ZlcmZsb3c6IGhpZGRlbjsgd2lkdGg6IDYwMDsKCQkJcGFkZGluZzogMjBweDsgZm9udC1zaXplOiAxMHB4OyBiYWNrZ3JvdW5kLWNvbG9yOiAjOTk5OTk5OwoJCQlsYXllci1iYWNrZ3JvdW5kLWNvbG9yOiNGRkZGRkY7IH0KCQkgICAgYSxhOmFjdGl2ZSAgeyBjb2xvcjogY2hhcmNvYWw7IGZvbnQtd2VpZ2h0OiBib2xkOyB9CgkJICAgIGE6dmlzaXRlZCAgIHsgY29sb3I6ICM2NjY2NjY7IGZvbnQtd2VpZ2h0OiBib2xkOyB9CgkJICAgIGE6aG92ZXIgICAgIHsgY29sb3I6IGNjMzMwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KCQk8L3N0eWxlPgoJCTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkJPCEtLQoJCS8vIFBPUC1VUCBDQVBUSU9OUy4uLgoJCWZ1bmN0aW9uIGxpYl9id2NoZWNrKCl7IC8vQnJvd3NlcmNoZWNrIChuZWVkZWQpCgkJICAgIHRoaXMudmVyPW5hdmlnYXRvci5hcHBWZXJzaW9uCgkJICAgIHRoaXMuYWdlbnQ9bmF2aWdhdG9yLnVzZXJBZ2VudAoJCSAgICB0aGlzLmRvbT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZD8xOjAKCQkgICAgdGhpcy5vcGVyYTU9dGhpcy5hZ2VudC5pbmRleE9mKCJPcGVyYSA1Iik+LTEKCQkgICAgdGhpcy5pZTU9KHRoaXMudmVyLmluZGV4T2YoIk1TSUUgNSIpPi0xICYmIHRoaXMuZG9tICYmICF0aGlzLm9wZXJhNSk/MTowOwoJCSAgICB0aGlzLmllNj0odGhpcy52ZXIuaW5kZXhPZigiTVNJRSA2Iik+LTEgJiYgdGhpcy5kb20gJiYgIXRoaXMub3BlcmE1KT8xOjA7CgkJICAgIHRoaXMuaWU0PShkb2N1bWVudC5hbGwgJiYgIXRoaXMuZG9tICYmICF0aGlzLm9wZXJhNSk/MTowOwoJCSAgICB0aGlzLmllPXRoaXMuaWU0fHx0aGlzLmllNXx8dGhpcy5pZTYKCQkgICAgdGhpcy5tYWM9dGhpcy5hZ2VudC5pbmRleE9mKCJNYWMiKT4tMQoJCSAgICB0aGlzLm5zNj0odGhpcy5kb20gJiYgcGFyc2VJbnQodGhpcy52ZXIpID49IDUpID8xOjA7CgkJICAgIHRoaXMubnM0PShkb2N1bWVudC5sYXllcnMgJiYgIXRoaXMuZG9tKT8xOjA7CgkJICAgIHRoaXMuYnc9KHRoaXMuaWU2IHx8IHRoaXMuaWU1IHx8IHRoaXMuaWU0IHx8IHRoaXMubnM0IHx8IHRoaXMubnM2IHx8IHRoaXMub3BlcmE1KQoJCSAgICByZXR1cm4gdGhpcwoJCX0KCQl2YXIgYncgPSBuZXcgbGliX2J3Y2hlY2soKQoJCS8vTWFrZXMgY3Jvc3Nicm93c2VyIG9iamVjdC4KCQlmdW5jdGlvbiBtYWtlT2JqKG9iail7CgkJICAgIHRoaXMuZXZudD1idy5kb20/IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG9iaik6YncuaWU0P2RvY3VtZW50LmFsbFtvYmpdOmJ3Lm5zND9kb2N1bWVudC5sYXllcnNbb2JqXTowOwoJCSAgICBpZighdGhpcy5ldm50KSByZXR1cm4gZmFsc2UKCQkgICAgdGhpcy5jc3M9YncuZG9tfHxidy5pZTQ/dGhpcy5ldm50LnN0eWxlOmJ3Lm5zND90aGlzLmV2bnQ6MDsKCQkgICAgdGhpcy53cmVmPWJ3LmRvbXx8YncuaWU0P3RoaXMuZXZudDpidy5uczQ/dGhpcy5jc3MuZG9jdW1lbnQ6MDsKCQkgICAgdGhpcy53cml0ZUl0PWJfd3JpdGVJdDsKCQkgICAgcmV0dXJuIHRoaXMKCQl9CgkJLy8gQSB1bml0IG9mIG1lYXN1cmUgdGhhdCB3aWxsIGJlIGFkZGVkIHdoZW4gc2V0dGluZyB0aGUgcG9zaXRpb24gb2YgYSBsYXllci4KCQkvL3ZhciBweCA9IGJ3Lm5zNHx8d2luZG93Lm9wZXJhPyIiOiJweCI7CgkJZnVuY3Rpb24gYl93cml0ZUl0KHRleHQpewoJCSAgICBpZiAoYncubnM0KXt0aGlzLndyZWYud3JpdGUodGV4dCk7dGhpcy53cmVmLmNsb3NlKCl9CgkJICAgIGVsc2UgdGhpcy53cmVmLmlubmVySFRNTCA9IHRleHQKCQl9CgkJLy9TaG93cyB0aGUgbWVzc2FnZXMKCQl2YXIgb0Rlc2M7CgkJZnVuY3Rpb24gcG9wdXAoZGl2aWQpewoJCSAgICBpZihvRGVzYyA9IG5ldyBtYWtlT2JqKGRpdmlkKSl7CgkJCW9EZXNjLmNzcy52aXNpYmlsaXR5ID0gInZpc2libGUiCgkJICAgIH0KCQl9CgkJZnVuY3Rpb24gcG9wb3V0KCl7IC8vIEhpZGVzIG1lc3NhZ2UKCQkgICAgaWYob0Rlc2MpIG9EZXNjLmNzcy52aXNpYmlsaXR5ID0gImhpZGRlbiIKCQl9CgkJLy8tLT4KCQk8L3NjcmlwdD4KCQk8L2hlYWQ+CgkJPGJvZHk+CgkJPGRpdiBjbGFzcz1jb250ZW50PgoJCQk8YnI+PGJyPgoJCQk8ZGl2IGNsYXNzPXRpdGxlPicuJHRoaXMtPnNlcnZpY2VOYW1lLic8L2Rpdj4KCQkJPGRpdiBjbGFzcz1uYXY+CgkJCQk8cD5WaWV3IHRoZSA8YSBocmVmPSInLiRQSFBfU0VMRi4nP3dzZGwiPldTREw8L2E+IGZvciB0aGUgc2VydmljZS4KCQkJCUNsaWNrIG9uIGFuIG9wZXJhdGlvbiBuYW1lIHRvIHZpZXcgaXQmYXBvcztzIGRldGFpbHMuPC9wPgoJCQkJPHVsPic7CgkJCQlmb3JlYWNoKCR0aGlzLT5nZXRPcGVyYXRpb25zKCkgYXMgJG9wID0+ICRkYXRhKXsKCQkJCSAgICAkYiAuPSAiPGxpPjxhIGhyZWY9JyMnIG9uY2xpY2s9XCJwb3BvdXQoKTtwb3B1cCgnJG9wJylcIj4kb3A8L2E+PC9saT4iOwoJCQkJICAgIC8vIGNyZWF0ZSBoaWRkZW4gZGl2CgkJCQkgICAgJGIgLj0gIjxkaXYgaWQ9JyRvcCcgY2xhc3M9J2hpZGRlbic+CgkJCQkgICAgPGEgaHJlZj0nIycgb25jbGljaz0ncG9wb3V0KCknPjxmb250IGNvbG9yPScjZmZmZmZmJz5DbG9zZTwvZm9udD48L2E+PGJyPjxicj4iOwoJCQkJICAgIGZvcmVhY2goJGRhdGEgYXMgJGRvbm5pZSA9PiAkbWFyaWUpeyAvLyBsb29wIHRocm91Z2ggb3BkYXRhCgkJCQkJCWlmKCRkb25uaWUgPT0gJ2lucHV0JyB8fCAkZG9ubmllID09ICdvdXRwdXQnKXsgLy8gc2hvdyBpbnB1dC9vdXRwdXQgZGF0YQoJCQkJCQkgICAgJGIgLj0gIjxmb250IGNvbG9yPSd3aGl0ZSc+Ii51Y2ZpcnN0KCRkb25uaWUpLic6PC9mb250Pjxicj4nOwoJCQkJCQkgICAgZm9yZWFjaCgkbWFyaWUgYXMgJGNhcHRhaW4gPT4gJHRlbmlsbGUpeyAvLyBsb29wIHRocm91Z2ggZGF0YQoJCQkJCQkJCWlmKCRjYXB0YWluID09ICdwYXJ0cycpeyAvLyBsb29wIHRocnUgcGFydHMKCQkJCQkJCQkgICAgJGIgLj0gIiZuYnNwOyZuYnNwOyRjYXB0YWluOjxicj4iOwoJCQkJCSAgICAgICAgICAgICAgICAvL2lmKGlzX2FycmF5KCR0ZW5pbGxlKSl7CgkJCQkJCQkJICAgIAlmb3JlYWNoKCR0ZW5pbGxlIGFzICRqb2FuaWUgPT4gJGNoYWNoaSl7CgkJCQkJCQkJCQkJJGIgLj0gIiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyRqb2FuaWU6ICRjaGFjaGk8YnI+IjsKCQkJCQkJCQkgICAgCX0KCQkJCQkgICAgICAgIAkJLy99CgkJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQkgICAgJGIgLj0gIiZuYnNwOyZuYnNwOyRjYXB0YWluOiAkdGVuaWxsZTxicj4iOwoJCQkJCQkJCX0KCQkJCQkJICAgIH0KCQkJCQkJfSBlbHNlIHsKCQkJCQkJICAgICRiIC49ICI8Zm9udCBjb2xvcj0nd2hpdGUnPiIudWNmaXJzdCgkZG9ubmllKS4iOjwvZm9udD4gJG1hcmllPGJyPiI7CgkJCQkJCX0KCQkJCSAgICB9CgkJCQkJJGIgLj0gJzwvZGl2Pic7CgkJCQl9CgkJCQkkYiAuPSAnCgkJCQk8dWw+CgkJCTwvZGl2PgoJCTwvZGl2PjwvYm9keT48L2h0bWw+JzsKCQlyZXR1cm4gJGI7CiAgICB9CgoJLyoqCgkqIHNlcmlhbGl6ZSB0aGUgcGFyc2VkIHdzZGwKCSoKCSogQHBhcmFtIG1peGVkICRkZWJ1ZyB3aGV0aGVyIHRvIHB1dCBkZWJ1Zz0xIGluIGVuZHBvaW50IFVSTAoJKiBAcmV0dXJuIHN0cmluZyBzZXJpYWxpemF0aW9uIG9mIFdTREwKCSogQGFjY2VzcyBwdWJsaWMgCgkqLwoJZnVuY3Rpb24gc2VyaWFsaXplKCRkZWJ1ZyA9IDApCgl7CgkJJHhtbCA9ICc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+JzsKCQkkeG1sIC49ICJcbjxkZWZpbml0aW9ucyI7CgkJZm9yZWFjaCgkdGhpcy0+bmFtZXNwYWNlcyBhcyAkayA9PiAkdikgewoJCQkkeG1sIC49ICIgeG1sbnM6JGs9XCIkdlwiIjsKCQl9IAoJCS8vIDEwLjkuMDIgLSBhZGQgcG91bHRlciBmaXggZm9yIHdzZGwgYW5kIHRucyBkZWNsYXJhdGlvbnMKCQlpZiAoaXNzZXQoJHRoaXMtPm5hbWVzcGFjZXNbJ3dzZGwnXSkpIHsKCQkJJHhtbCAuPSAiIHhtbG5zPVwiIiAuICR0aGlzLT5uYW1lc3BhY2VzWyd3c2RsJ10gLiAiXCIiOwoJCX0gCgkJaWYgKGlzc2V0KCR0aGlzLT5uYW1lc3BhY2VzWyd0bnMnXSkpIHsKCQkJJHhtbCAuPSAiIHRhcmdldE5hbWVzcGFjZT1cIiIgLiAkdGhpcy0+bmFtZXNwYWNlc1sndG5zJ10gLiAiXCIiOwoJCX0gCgkJJHhtbCAuPSAnPic7IAoJCS8vIGltcG9ydHMKCQlpZiAoc2l6ZW9mKCR0aGlzLT5pbXBvcnQpID4gMCkgewoJCQlmb3JlYWNoKCR0aGlzLT5pbXBvcnQgYXMgJG5zID0+ICRsaXN0KSB7CgkJCQlmb3JlYWNoICgkbGlzdCBhcyAkaWkpIHsKCQkJCQlpZiAoJGlpWydsb2NhdGlvbiddICE9ICcnKSB7CgkJCQkJCSR4bWwgLj0gJzxpbXBvcnQgbG9jYXRpb249IicgLiAkaWlbJ2xvY2F0aW9uJ10gLiAnIiBuYW1lc3BhY2U9IicgLiAkbnMgLiAnIiAvPic7CgkJCQkJfSBlbHNlIHsKCQkJCQkJJHhtbCAuPSAnPGltcG9ydCBuYW1lc3BhY2U9IicgLiAkbnMgLiAnIiAvPic7CgkJCQkJfQoJCQkJfQoJCQl9IAoJCX0gCgkJLy8gdHlwZXMKCQlpZiAoY291bnQoJHRoaXMtPnNjaGVtYXMpPj0xKSB7CgkJCSR4bWwgLj0gIlxuPHR5cGVzPiI7CgkJCWZvcmVhY2ggKCR0aGlzLT5zY2hlbWFzIGFzICRucyA9PiAkbGlzdCkgewoJCQkJZm9yZWFjaCAoJGxpc3QgYXMgJHhzKSB7CgkJCQkJJHhtbCAuPSAkeHMtPnNlcmlhbGl6ZVNjaGVtYSgpOwoJCQkJfQoJCQl9CgkJCSR4bWwgLj0gJzwvdHlwZXM+JzsKCQl9IAoJCS8vIG1lc3NhZ2VzCgkJaWYgKGNvdW50KCR0aGlzLT5tZXNzYWdlcykgPj0gMSkgewoJCQlmb3JlYWNoKCR0aGlzLT5tZXNzYWdlcyBhcyAkbXNnTmFtZSA9PiAkbXNnUGFydHMpIHsKCQkJCSR4bWwgLj0gIlxuPG1lc3NhZ2UgbmFtZT1cIiIgLiAkbXNnTmFtZSAuICciPic7CgkJCQlpZihpc19hcnJheSgkbXNnUGFydHMpKXsKCQkJCQlmb3JlYWNoKCRtc2dQYXJ0cyBhcyAkcGFydE5hbWUgPT4gJHBhcnRUeXBlKSB7CgkJCQkJCS8vIHByaW50ICdzZXJpYWxpemluZyAnLiRwYXJ0VHlwZS4nLCBzdjogJy4kdGhpcy0+WE1MU2NoZW1hVmVyc2lvbi4nPGJyPic7CgkJCQkJCWlmIChzdHJwb3MoJHBhcnRUeXBlLCAnOicpKSB7CgkJCQkJCSAgICAkdHlwZVByZWZpeCA9ICR0aGlzLT5nZXRQcmVmaXhGcm9tTmFtZXNwYWNlKCR0aGlzLT5nZXRQcmVmaXgoJHBhcnRUeXBlKSk7CgkJCQkJCX0gZWxzZWlmIChpc3NldCgkdGhpcy0+dHlwZW1hcFskdGhpcy0+bmFtZXNwYWNlc1sneHNkJ11dWyRwYXJ0VHlwZV0pKSB7CgkJCQkJCSAgICAvLyBwcmludCAnY2hlY2tpbmcgdHlwZW1hcDogJy4kdGhpcy0+WE1MU2NoZW1hVmVyc2lvbi4nPGJyPic7CgkJCQkJCSAgICAkdHlwZVByZWZpeCA9ICd4c2QnOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkgICAgZm9yZWFjaCgkdGhpcy0+dHlwZW1hcCBhcyAkbnMgPT4gJHR5cGVzKSB7CgkJCQkJCSAgICAgICAgaWYgKGlzc2V0KCR0eXBlc1skcGFydFR5cGVdKSkgewoJCQkJCQkgICAgICAgICAgICAkdHlwZVByZWZpeCA9ICR0aGlzLT5nZXRQcmVmaXhGcm9tTmFtZXNwYWNlKCRucyk7CgkJCQkJCSAgICAgICAgfSAKCQkJCQkJICAgIH0gCgkJCQkJCSAgICBpZiAoIWlzc2V0KCR0eXBlUHJlZml4KSkgewoJCQkJCQkgICAgICAgIGRpZSgiJHBhcnRUeXBlIGhhcyBubyBuYW1lc3BhY2UhIik7CgkJCQkJCSAgICB9IAoJCQkJCQl9CgkJCQkJCSRucyA9ICR0aGlzLT5nZXROYW1lc3BhY2VGcm9tUHJlZml4KCR0eXBlUHJlZml4KTsKCQkJCQkJJHR5cGVEZWYgPSAkdGhpcy0+Z2V0VHlwZURlZigkdGhpcy0+Z2V0TG9jYWxQYXJ0KCRwYXJ0VHlwZSksICRucyk7CgkJCQkJCWlmICgkdHlwZURlZlsndHlwZUNsYXNzJ10gPT0gJ2VsZW1lbnQnKSB7CgkJCQkJCQkkZWxlbWVudG9ydHlwZSA9ICdlbGVtZW50JzsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCSRlbGVtZW50b3J0eXBlID0gJ3R5cGUnOwoJCQkJCQl9CgkJCQkJCSR4bWwgLj0gJzxwYXJ0IG5hbWU9IicgLiAkcGFydE5hbWUgLiAnIiAnIC4gJGVsZW1lbnRvcnR5cGUgLiAnPSInIC4gJHR5cGVQcmVmaXggLiAnOicgLiAkdGhpcy0+Z2V0TG9jYWxQYXJ0KCRwYXJ0VHlwZSkgLiAnIiAvPic7CgkJCQkJfQoJCQkJfQoJCQkJJHhtbCAuPSAnPC9tZXNzYWdlPic7CgkJCX0gCgkJfSAKCQkvLyBiaW5kaW5ncyAmIHBvcnR0eXBlcwoJCWlmIChjb3VudCgkdGhpcy0+YmluZGluZ3MpID49IDEpIHsKCQkJJGJpbmRpbmdfeG1sID0gJyc7CgkJCSRwb3J0VHlwZV94bWwgPSAnJzsKCQkJZm9yZWFjaCgkdGhpcy0+YmluZGluZ3MgYXMgJGJpbmRpbmdOYW1lID0+ICRhdHRycykgewoJCQkJJGJpbmRpbmdfeG1sIC49ICJcbjxiaW5kaW5nIG5hbWU9XCIiIC4gJGJpbmRpbmdOYW1lIC4gJyIgdHlwZT0idG5zOicgLiAkYXR0cnNbJ3BvcnRUeXBlJ10gLiAnIj4nOwoJCQkJJGJpbmRpbmdfeG1sIC49ICc8c29hcDpiaW5kaW5nIHN0eWxlPSInIC4gJGF0dHJzWydzdHlsZSddIC4gJyIgdHJhbnNwb3J0PSInIC4gJGF0dHJzWyd0cmFuc3BvcnQnXSAuICciLz4nOwoJCQkJJHBvcnRUeXBlX3htbCAuPSAiXG48cG9ydFR5cGUgbmFtZT1cIiIgLiAkYXR0cnNbJ3BvcnRUeXBlJ10gLiAnIj4nOwoJCQkJZm9yZWFjaCgkYXR0cnNbJ29wZXJhdGlvbnMnXSBhcyAkb3BOYW1lID0+ICRvcFBhcnRzKSB7CgkJCQkJJGJpbmRpbmdfeG1sIC49ICc8b3BlcmF0aW9uIG5hbWU9IicgLiAkb3BOYW1lIC4gJyI+JzsKCQkJCQkkYmluZGluZ194bWwgLj0gJzxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSInIC4gJG9wUGFydHNbJ3NvYXBBY3Rpb24nXSAuICciIHN0eWxlPSInLiAkb3BQYXJ0c1snc3R5bGUnXSAuICciLz4nOwoJCQkJCWlmIChpc3NldCgkb3BQYXJ0c1snaW5wdXQnXVsnZW5jb2RpbmdTdHlsZSddKSAmJiAkb3BQYXJ0c1snaW5wdXQnXVsnZW5jb2RpbmdTdHlsZSddICE9ICcnKSB7CgkJCQkJCSRlbmNfc3R5bGUgPSAnIGVuY29kaW5nU3R5bGU9IicgLiAkb3BQYXJ0c1snaW5wdXQnXVsnZW5jb2RpbmdTdHlsZSddIC4gJyInOwoJCQkJCX0gZWxzZSB7CgkJCQkJCSRlbmNfc3R5bGUgPSAnJzsKCQkJCQl9CgkJCQkJJGJpbmRpbmdfeG1sIC49ICc8aW5wdXQ+PHNvYXA6Ym9keSB1c2U9IicgLiAkb3BQYXJ0c1snaW5wdXQnXVsndXNlJ10gLiAnIiBuYW1lc3BhY2U9IicgLiAkb3BQYXJ0c1snaW5wdXQnXVsnbmFtZXNwYWNlJ10gLiAnIicgLiAkZW5jX3N0eWxlIC4gJy8+PC9pbnB1dD4nOwoJCQkJCWlmIChpc3NldCgkb3BQYXJ0c1snb3V0cHV0J11bJ2VuY29kaW5nU3R5bGUnXSkgJiYgJG9wUGFydHNbJ291dHB1dCddWydlbmNvZGluZ1N0eWxlJ10gIT0gJycpIHsKCQkJCQkJJGVuY19zdHlsZSA9ICcgZW5jb2RpbmdTdHlsZT0iJyAuICRvcFBhcnRzWydvdXRwdXQnXVsnZW5jb2RpbmdTdHlsZSddIC4gJyInOwoJCQkJCX0gZWxzZSB7CgkJCQkJCSRlbmNfc3R5bGUgPSAnJzsKCQkJCQl9CgkJCQkJJGJpbmRpbmdfeG1sIC49ICc8b3V0cHV0Pjxzb2FwOmJvZHkgdXNlPSInIC4gJG9wUGFydHNbJ291dHB1dCddWyd1c2UnXSAuICciIG5hbWVzcGFjZT0iJyAuICRvcFBhcnRzWydvdXRwdXQnXVsnbmFtZXNwYWNlJ10gLiAnIicgLiAkZW5jX3N0eWxlIC4gJy8+PC9vdXRwdXQ+JzsKCQkJCQkkYmluZGluZ194bWwgLj0gJzwvb3BlcmF0aW9uPic7CgkJCQkJJHBvcnRUeXBlX3htbCAuPSAnPG9wZXJhdGlvbiBuYW1lPSInIC4gJG9wUGFydHNbJ25hbWUnXSAuICciJzsKCQkJCQlpZiAoaXNzZXQoJG9wUGFydHNbJ3BhcmFtZXRlck9yZGVyJ10pKSB7CgkJCQkJICAgICRwb3J0VHlwZV94bWwgLj0gJyBwYXJhbWV0ZXJPcmRlcj0iJyAuICRvcFBhcnRzWydwYXJhbWV0ZXJPcmRlciddIC4gJyInOwoJCQkJCX0gCgkJCQkJJHBvcnRUeXBlX3htbCAuPSAnPic7CgkJCQkJaWYoaXNzZXQoJG9wUGFydHNbJ2RvY3VtZW50YXRpb24nXSkgJiYgJG9wUGFydHNbJ2RvY3VtZW50YXRpb24nXSAhPSAnJykgewoJCQkJCQkkcG9ydFR5cGVfeG1sIC49ICc8ZG9jdW1lbnRhdGlvbj4nIC4gaHRtbHNwZWNpYWxjaGFycygkb3BQYXJ0c1snZG9jdW1lbnRhdGlvbiddKSAuICc8L2RvY3VtZW50YXRpb24+JzsKCQkJCQl9CgkJCQkJJHBvcnRUeXBlX3htbCAuPSAnPGlucHV0IG1lc3NhZ2U9InRuczonIC4gJG9wUGFydHNbJ2lucHV0J11bJ21lc3NhZ2UnXSAuICciLz4nOwoJCQkJCSRwb3J0VHlwZV94bWwgLj0gJzxvdXRwdXQgbWVzc2FnZT0idG5zOicgLiAkb3BQYXJ0c1snb3V0cHV0J11bJ21lc3NhZ2UnXSAuICciLz4nOwoJCQkJCSRwb3J0VHlwZV94bWwgLj0gJzwvb3BlcmF0aW9uPic7CgkJCQl9IAoJCQkJJHBvcnRUeXBlX3htbCAuPSAnPC9wb3J0VHlwZT4nOwoJCQkJJGJpbmRpbmdfeG1sIC49ICc8L2JpbmRpbmc+JzsKCQkJfSAKCQkJJHhtbCAuPSAkcG9ydFR5cGVfeG1sIC4gJGJpbmRpbmdfeG1sOwoJCX0gCgkJLy8gc2VydmljZXMKCQkkeG1sIC49ICJcbjxzZXJ2aWNlIG5hbWU9XCIiIC4gJHRoaXMtPnNlcnZpY2VOYW1lIC4gJyI+JzsKCQlpZiAoY291bnQoJHRoaXMtPnBvcnRzKSA+PSAxKSB7CgkJCWZvcmVhY2goJHRoaXMtPnBvcnRzIGFzICRwTmFtZSA9PiAkYXR0cnMpIHsKCQkJCSR4bWwgLj0gJzxwb3J0IG5hbWU9IicgLiAkcE5hbWUgLiAnIiBiaW5kaW5nPSJ0bnM6JyAuICRhdHRyc1snYmluZGluZyddIC4gJyI+JzsKCQkJCSR4bWwgLj0gJzxzb2FwOmFkZHJlc3MgbG9jYXRpb249IicgLiAkYXR0cnNbJ2xvY2F0aW9uJ10gLiAoJGRlYnVnID8gJz9kZWJ1Zz0xJyA6ICcnKSAuICciLz4nOwoJCQkJJHhtbCAuPSAnPC9wb3J0Pic7CgkJCX0gCgkJfSAKCQkkeG1sIC49ICc8L3NlcnZpY2U+JzsKCQlyZXR1cm4gJHhtbCAuICJcbjwvZGVmaW5pdGlvbnM+IjsKCX0gCgkKCS8qKgoJICogc2VyaWFsaXplIFBIUCB2YWx1ZXMgYWNjb3JkaW5nIHRvIGEgV1NETCBtZXNzYWdlIGRlZmluaXRpb24KCSAqCgkgKiBUT0RPCgkgKiAtIG11bHRpLXJlZiBzZXJpYWxpemF0aW9uCgkgKiAtIHZhbGlkYXRlIFBIUCB2YWx1ZXMgYWdhaW5zdCB0eXBlIGRlZmluaXRpb25zLCByZXR1cm4gZXJyb3JzIGlmIGludmFsaWQKCSAqIAoJICogQHBhcmFtIHN0cmluZyAkb3BlcmF0aW9uIG9wZXJhdGlvbiBuYW1lCgkgKiBAcGFyYW0gc3RyaW5nICRkaXJlY3Rpb24gKGlucHV0fG91dHB1dCkKCSAqIEBwYXJhbSBtaXhlZCAkcGFyYW1ldGVycyBwYXJhbWV0ZXIgdmFsdWUocykKCSAqIEByZXR1cm4gbWl4ZWQgcGFyYW1ldGVycyBzZXJpYWxpemVkIGFzIFhNTCBvciBmYWxzZSBvbiBlcnJvciAoZS5nLiBvcGVyYXRpb24gbm90IGZvdW5kKQoJICogQGFjY2VzcyBwdWJsaWMKCSAqLwoJZnVuY3Rpb24gc2VyaWFsaXplUlBDUGFyYW1ldGVycygkb3BlcmF0aW9uLCAkZGlyZWN0aW9uLCAkcGFyYW1ldGVycykKCXsKCQkkdGhpcy0+ZGVidWcoImluIHNlcmlhbGl6ZVJQQ1BhcmFtZXRlcnM6IG9wZXJhdGlvbj0kb3BlcmF0aW9uLCBkaXJlY3Rpb249JGRpcmVjdGlvbiwgWE1MU2NoZW1hVmVyc2lvbj0kdGhpcy0+WE1MU2NoZW1hVmVyc2lvbiIpOyAKCQkkdGhpcy0+YXBwZW5kRGVidWcoJ3BhcmFtZXRlcnM9JyAuICR0aGlzLT52YXJEdW1wKCRwYXJhbWV0ZXJzKSk7CgkJCgkJaWYgKCRkaXJlY3Rpb24gIT0gJ2lucHV0JyAmJiAkZGlyZWN0aW9uICE9ICdvdXRwdXQnKSB7CgkJCSR0aGlzLT5kZWJ1ZygnVGhlIHZhbHVlIG9mIHRoZSBcJGRpcmVjdGlvbiBhcmd1bWVudCBuZWVkcyB0byBiZSBlaXRoZXIgImlucHV0IiBvciAib3V0cHV0IicpOwoJCQkkdGhpcy0+c2V0RXJyb3IoJ1RoZSB2YWx1ZSBvZiB0aGUgXCRkaXJlY3Rpb24gYXJndW1lbnQgbmVlZHMgdG8gYmUgZWl0aGVyICJpbnB1dCIgb3IgIm91dHB1dCInKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0gCgkJaWYgKCEkb3BEYXRhID0gJHRoaXMtPmdldE9wZXJhdGlvbkRhdGEoJG9wZXJhdGlvbikpIHsKCQkJJHRoaXMtPmRlYnVnKCdVbmFibGUgdG8gcmV0cmlldmUgV1NETCBkYXRhIGZvciBvcGVyYXRpb246ICcgLiAkb3BlcmF0aW9uKTsKCQkJJHRoaXMtPnNldEVycm9yKCdVbmFibGUgdG8gcmV0cmlldmUgV1NETCBkYXRhIGZvciBvcGVyYXRpb246ICcgLiAkb3BlcmF0aW9uKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQkkdGhpcy0+ZGVidWcoJ29wRGF0YTonKTsKCQkkdGhpcy0+YXBwZW5kRGVidWcoJHRoaXMtPnZhckR1bXAoJG9wRGF0YSkpOwoKCQkvLyBHZXQgZW5jb2Rpbmcgc3R5bGUgZm9yIG91dHB1dCBhbmQgc2V0IHRvIGN1cnJlbnQKCQkkZW5jb2RpbmdTdHlsZSA9ICdodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyc7CgkJaWYoKCRkaXJlY3Rpb24gPT0gJ2lucHV0JykgJiYgaXNzZXQoJG9wRGF0YVsnb3V0cHV0J11bJ2VuY29kaW5nU3R5bGUnXSkgJiYgKCRvcERhdGFbJ291dHB1dCddWydlbmNvZGluZ1N0eWxlJ10gIT0gJGVuY29kaW5nU3R5bGUpKSB7CgkJCSRlbmNvZGluZ1N0eWxlID0gJG9wRGF0YVsnb3V0cHV0J11bJ2VuY29kaW5nU3R5bGUnXTsKCQkJJGVuY19zdHlsZSA9ICRlbmNvZGluZ1N0eWxlOwoJCX0KCgkJLy8gc2V0IGlucHV0IHBhcmFtcwoJCSR4bWwgPSAnJzsKCQlpZiAoaXNzZXQoJG9wRGF0YVskZGlyZWN0aW9uXVsncGFydHMnXSkgJiYgc2l6ZW9mKCRvcERhdGFbJGRpcmVjdGlvbl1bJ3BhcnRzJ10pID4gMCkgewoJCQkKCQkJJHVzZSA9ICRvcERhdGFbJGRpcmVjdGlvbl1bJ3VzZSddOwoJCQkkdGhpcy0+ZGVidWcoJ2hhdmUgJyAuIGNvdW50KCRvcERhdGFbJGRpcmVjdGlvbl1bJ3BhcnRzJ10pIC4gJyBwYXJ0KHMpIHRvIHNlcmlhbGl6ZScpOwoJCQlpZiAoaXNfYXJyYXkoJHBhcmFtZXRlcnMpKSB7CgkJCQkkcGFyYW1ldGVyc0FycmF5VHlwZSA9ICR0aGlzLT5pc0FycmF5U2ltcGxlT3JTdHJ1Y3QoJHBhcmFtZXRlcnMpOwoJCQkJJHRoaXMtPmRlYnVnKCdoYXZlICcgLiBjb3VudCgkcGFyYW1ldGVycykgLiAnIHBhcmFtZXRlcihzKSBwcm92aWRlZCBhcyAnIC4gJHBhcmFtZXRlcnNBcnJheVR5cGUgLiAnIHRvIHNlcmlhbGl6ZScpOwoJCQkJZm9yZWFjaCgkb3BEYXRhWyRkaXJlY3Rpb25dWydwYXJ0cyddIGFzICRuYW1lID0+ICR0eXBlKSB7CgkJCQkJJHRoaXMtPmRlYnVnKCdzZXJpYWxpemluZyBwYXJ0ICInLiRuYW1lLiciIG9mIHR5cGUgIicuJHR5cGUuJyInKTsKCQkJCQkvLyBUcmFjayBlbmNvZGluZyBzdHlsZQoJCQkJCWlmIChpc3NldCgkb3BEYXRhWyRkaXJlY3Rpb25dWydlbmNvZGluZ1N0eWxlJ10pICYmICRlbmNvZGluZ1N0eWxlICE9ICRvcERhdGFbJGRpcmVjdGlvbl1bJ2VuY29kaW5nU3R5bGUnXSkgewoJCQkJCQkkZW5jb2RpbmdTdHlsZSA9ICRvcERhdGFbJGRpcmVjdGlvbl1bJ2VuY29kaW5nU3R5bGUnXTsJCQkKCQkJCQkJJGVuY19zdHlsZSA9ICRlbmNvZGluZ1N0eWxlOwoJCQkJCX0gZWxzZSB7CgkJCQkJCSRlbmNfc3R5bGUgPSBmYWxzZTsKCQkJCQl9CgkJCQkJLy8gTk9URTogYWRkIGVycm9yIGhhbmRsaW5nIGhlcmUKCQkJCQkvLyBpZiBzZXJpYWxpemVUeXBlIHJldHVybnMgZmFsc2UsIHRoZW4gY2F0Y2ggZ2xvYmFsIGVycm9yIGFuZCBmYXVsdAoJCQkJCWlmICgkcGFyYW1ldGVyc0FycmF5VHlwZSA9PSAnYXJyYXlTaW1wbGUnKSB7CgkJCQkJCSRwID0gYXJyYXlfc2hpZnQoJHBhcmFtZXRlcnMpOwoJCQkJCQkkdGhpcy0+ZGVidWcoJ2NhbGxpbmcgc2VyaWFsaXplVHlwZSB3L2luZGV4ZWQgcGFyYW0nKTsKCQkJCQkJJHhtbCAuPSAkdGhpcy0+c2VyaWFsaXplVHlwZSgkbmFtZSwgJHR5cGUsICRwLCAkdXNlLCAkZW5jX3N0eWxlKTsKCQkJCQl9IGVsc2VpZiAoaXNzZXQoJHBhcmFtZXRlcnNbJG5hbWVdKSkgewoJCQkJCQkkdGhpcy0+ZGVidWcoJ2NhbGxpbmcgc2VyaWFsaXplVHlwZSB3L25hbWVkIHBhcmFtJyk7CgkJCQkJCSR4bWwgLj0gJHRoaXMtPnNlcmlhbGl6ZVR5cGUoJG5hbWUsICR0eXBlLCAkcGFyYW1ldGVyc1skbmFtZV0sICR1c2UsICRlbmNfc3R5bGUpOwoJCQkJCX0gZWxzZSB7CgkJCQkJCS8vIFRPRE86IG9ubHkgc2VuZCBuaWxsYWJsZQoJCQkJCQkkdGhpcy0+ZGVidWcoJ2NhbGxpbmcgc2VyaWFsaXplVHlwZSB3L251bGwgcGFyYW0nKTsKCQkJCQkJJHhtbCAuPSAkdGhpcy0+c2VyaWFsaXplVHlwZSgkbmFtZSwgJHR5cGUsIG51bGwsICR1c2UsICRlbmNfc3R5bGUpOwoJCQkJCX0KCQkJCX0KCQkJfSBlbHNlIHsKCQkJCSR0aGlzLT5kZWJ1Zygnbm8gcGFyYW1ldGVycyBwYXNzZWQuJyk7CgkJCX0KCQl9CgkJJHRoaXMtPmRlYnVnKCJzZXJpYWxpemVSUENQYXJhbWV0ZXJzIHJldHVybmluZzogJHhtbCIpOwoJCXJldHVybiAkeG1sOwoJfSAKCQoJLyoqCgkgKiBzZXJpYWxpemUgYSBQSFAgdmFsdWUgYWNjb3JkaW5nIHRvIGEgV1NETCBtZXNzYWdlIGRlZmluaXRpb24KCSAqIAoJICogVE9ETwoJICogLSBtdWx0aS1yZWYgc2VyaWFsaXphdGlvbgoJICogLSB2YWxpZGF0ZSBQSFAgdmFsdWVzIGFnYWluc3QgdHlwZSBkZWZpbml0aW9ucywgcmV0dXJuIGVycm9ycyBpZiBpbnZhbGlkCgkgKiAKCSAqIEBwYXJhbSBzdHJpbmcgJCB0eXBlIG5hbWUKCSAqIEBwYXJhbSBtaXhlZCAkIHBhcmFtIHZhbHVlCgkgKiBAcmV0dXJuIG1peGVkIG5ldyBwYXJhbSBvciBmYWxzZSBpZiBpbml0aWFsIHZhbHVlIGRpZG4ndCB2YWxpZGF0ZQoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEBkZXByZWNhdGVkCgkgKi8KCWZ1bmN0aW9uIHNlcmlhbGl6ZVBhcmFtZXRlcnMoJG9wZXJhdGlvbiwgJGRpcmVjdGlvbiwgJHBhcmFtZXRlcnMpCgl7CgkJJHRoaXMtPmRlYnVnKCJpbiBzZXJpYWxpemVQYXJhbWV0ZXJzOiBvcGVyYXRpb249JG9wZXJhdGlvbiwgZGlyZWN0aW9uPSRkaXJlY3Rpb24sIFhNTFNjaGVtYVZlcnNpb249JHRoaXMtPlhNTFNjaGVtYVZlcnNpb24iKTsgCgkJJHRoaXMtPmFwcGVuZERlYnVnKCdwYXJhbWV0ZXJzPScgLiAkdGhpcy0+dmFyRHVtcCgkcGFyYW1ldGVycykpOwoJCQoJCWlmICgkZGlyZWN0aW9uICE9ICdpbnB1dCcgJiYgJGRpcmVjdGlvbiAhPSAnb3V0cHV0JykgewoJCQkkdGhpcy0+ZGVidWcoJ1RoZSB2YWx1ZSBvZiB0aGUgXCRkaXJlY3Rpb24gYXJndW1lbnQgbmVlZHMgdG8gYmUgZWl0aGVyICJpbnB1dCIgb3IgIm91dHB1dCInKTsKCQkJJHRoaXMtPnNldEVycm9yKCdUaGUgdmFsdWUgb2YgdGhlIFwkZGlyZWN0aW9uIGFyZ3VtZW50IG5lZWRzIHRvIGJlIGVpdGhlciAiaW5wdXQiIG9yICJvdXRwdXQiJyk7CgkJCXJldHVybiBmYWxzZTsKCQl9IAoJCWlmICghJG9wRGF0YSA9ICR0aGlzLT5nZXRPcGVyYXRpb25EYXRhKCRvcGVyYXRpb24pKSB7CgkJCSR0aGlzLT5kZWJ1ZygnVW5hYmxlIHRvIHJldHJpZXZlIFdTREwgZGF0YSBmb3Igb3BlcmF0aW9uOiAnIC4gJG9wZXJhdGlvbik7CgkJCSR0aGlzLT5zZXRFcnJvcignVW5hYmxlIHRvIHJldHJpZXZlIFdTREwgZGF0YSBmb3Igb3BlcmF0aW9uOiAnIC4gJG9wZXJhdGlvbik7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJJHRoaXMtPmRlYnVnKCdvcERhdGE6Jyk7CgkJJHRoaXMtPmFwcGVuZERlYnVnKCR0aGlzLT52YXJEdW1wKCRvcERhdGEpKTsKCQkKCQkvLyBHZXQgZW5jb2Rpbmcgc3R5bGUgZm9yIG91dHB1dCBhbmQgc2V0IHRvIGN1cnJlbnQKCQkkZW5jb2RpbmdTdHlsZSA9ICdodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyc7CgkJaWYoKCRkaXJlY3Rpb24gPT0gJ2lucHV0JykgJiYgaXNzZXQoJG9wRGF0YVsnb3V0cHV0J11bJ2VuY29kaW5nU3R5bGUnXSkgJiYgKCRvcERhdGFbJ291dHB1dCddWydlbmNvZGluZ1N0eWxlJ10gIT0gJGVuY29kaW5nU3R5bGUpKSB7CgkJCSRlbmNvZGluZ1N0eWxlID0gJG9wRGF0YVsnb3V0cHV0J11bJ2VuY29kaW5nU3R5bGUnXTsKCQkJJGVuY19zdHlsZSA9ICRlbmNvZGluZ1N0eWxlOwoJCX0KCQkKCQkvLyBzZXQgaW5wdXQgcGFyYW1zCgkJJHhtbCA9ICcnOwoJCWlmIChpc3NldCgkb3BEYXRhWyRkaXJlY3Rpb25dWydwYXJ0cyddKSAmJiBzaXplb2YoJG9wRGF0YVskZGlyZWN0aW9uXVsncGFydHMnXSkgPiAwKSB7CgkJCQoJCQkkdXNlID0gJG9wRGF0YVskZGlyZWN0aW9uXVsndXNlJ107CgkJCSR0aGlzLT5kZWJ1ZygidXNlPSR1c2UiKTsKCQkJJHRoaXMtPmRlYnVnKCdnb3QgJyAuIGNvdW50KCRvcERhdGFbJGRpcmVjdGlvbl1bJ3BhcnRzJ10pIC4gJyBwYXJ0KHMpJyk7CgkJCWlmIChpc19hcnJheSgkcGFyYW1ldGVycykpIHsKCQkJCSRwYXJhbWV0ZXJzQXJyYXlUeXBlID0gJHRoaXMtPmlzQXJyYXlTaW1wbGVPclN0cnVjdCgkcGFyYW1ldGVycyk7CgkJCQkkdGhpcy0+ZGVidWcoJ2hhdmUgJyAuICRwYXJhbWV0ZXJzQXJyYXlUeXBlIC4gJyBwYXJhbWV0ZXJzJyk7CgkJCQlmb3JlYWNoKCRvcERhdGFbJGRpcmVjdGlvbl1bJ3BhcnRzJ10gYXMgJG5hbWUgPT4gJHR5cGUpIHsKCQkJCQkkdGhpcy0+ZGVidWcoJ3NlcmlhbGl6aW5nIHBhcnQgIicuJG5hbWUuJyIgb2YgdHlwZSAiJy4kdHlwZS4nIicpOwoJCQkJCS8vIFRyYWNrIGVuY29kaW5nIHN0eWxlCgkJCQkJaWYoaXNzZXQoJG9wRGF0YVskZGlyZWN0aW9uXVsnZW5jb2RpbmdTdHlsZSddKSAmJiAkZW5jb2RpbmdTdHlsZSAhPSAkb3BEYXRhWyRkaXJlY3Rpb25dWydlbmNvZGluZ1N0eWxlJ10pIHsKCQkJCQkJJGVuY29kaW5nU3R5bGUgPSAkb3BEYXRhWyRkaXJlY3Rpb25dWydlbmNvZGluZ1N0eWxlJ107CQkJCgkJCQkJCSRlbmNfc3R5bGUgPSAkZW5jb2RpbmdTdHlsZTsKCQkJCQl9IGVsc2UgewoJCQkJCQkkZW5jX3N0eWxlID0gZmFsc2U7CgkJCQkJfQoJCQkJCS8vIE5PVEU6IGFkZCBlcnJvciBoYW5kbGluZyBoZXJlCgkJCQkJLy8gaWYgc2VyaWFsaXplVHlwZSByZXR1cm5zIGZhbHNlLCB0aGVuIGNhdGNoIGdsb2JhbCBlcnJvciBhbmQgZmF1bHQKCQkJCQlpZiAoJHBhcmFtZXRlcnNBcnJheVR5cGUgPT0gJ2FycmF5U2ltcGxlJykgewoJCQkJCQkkcCA9IGFycmF5X3NoaWZ0KCRwYXJhbWV0ZXJzKTsKCQkJCQkJJHRoaXMtPmRlYnVnKCdjYWxsaW5nIHNlcmlhbGl6ZVR5cGUgdy9pbmRleGVkIHBhcmFtJyk7CgkJCQkJCSR4bWwgLj0gJHRoaXMtPnNlcmlhbGl6ZVR5cGUoJG5hbWUsICR0eXBlLCAkcCwgJHVzZSwgJGVuY19zdHlsZSk7CgkJCQkJfSBlbHNlaWYgKGlzc2V0KCRwYXJhbWV0ZXJzWyRuYW1lXSkpIHsKCQkJCQkJJHRoaXMtPmRlYnVnKCdjYWxsaW5nIHNlcmlhbGl6ZVR5cGUgdy9uYW1lZCBwYXJhbScpOwoJCQkJCQkkeG1sIC49ICR0aGlzLT5zZXJpYWxpemVUeXBlKCRuYW1lLCAkdHlwZSwgJHBhcmFtZXRlcnNbJG5hbWVdLCAkdXNlLCAkZW5jX3N0eWxlKTsKCQkJCQl9IGVsc2UgewoJCQkJCQkvLyBUT0RPOiBvbmx5IHNlbmQgbmlsbGFibGUKCQkJCQkJJHRoaXMtPmRlYnVnKCdjYWxsaW5nIHNlcmlhbGl6ZVR5cGUgdy9udWxsIHBhcmFtJyk7CgkJCQkJCSR4bWwgLj0gJHRoaXMtPnNlcmlhbGl6ZVR5cGUoJG5hbWUsICR0eXBlLCBudWxsLCAkdXNlLCAkZW5jX3N0eWxlKTsKCQkJCQl9CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQkkdGhpcy0+ZGVidWcoJ25vIHBhcmFtZXRlcnMgcGFzc2VkLicpOwoJCQl9CgkJfQoJCSR0aGlzLT5kZWJ1Zygic2VyaWFsaXplUGFyYW1ldGVycyByZXR1cm5pbmc6ICR4bWwiKTsKCQlyZXR1cm4gJHhtbDsKCX0gCgkKCS8qKgoJICogc2VyaWFsaXplcyBhIFBIUCB2YWx1ZSBhY2NvcmRpbmcgYSBnaXZlbiB0eXBlIGRlZmluaXRpb24KCSAqIAoJICogQHBhcmFtIHN0cmluZyAkbmFtZSBuYW1lIG9mIHZhbHVlIChwYXJ0IG9yIGVsZW1lbnQpCgkgKiBAcGFyYW0gc3RyaW5nICR0eXBlIFhNTCBzY2hlbWEgdHlwZSBvZiB2YWx1ZSAodHlwZSBvciBlbGVtZW50KQoJICogQHBhcmFtIG1peGVkICR2YWx1ZSBhIG5hdGl2ZSBQSFAgdmFsdWUgKHBhcmFtZXRlciB2YWx1ZSkKCSAqIEBwYXJhbSBzdHJpbmcgJHVzZSB1c2UgZm9yIHBhcnQgKGVuY29kZWR8bGl0ZXJhbCkKCSAqIEBwYXJhbSBzdHJpbmcgJGVuY29kaW5nU3R5bGUgU09BUCBlbmNvZGluZyBzdHlsZSBmb3IgdGhlIHZhbHVlIChpZiBkaWZmZXJlbnQgdGhhbiB0aGUgZW5jbG9zaW5nIHN0eWxlKQoJICogQHBhcmFtIGJvb2xlYW4gJHVucXVhbGlmaWVkIGEga2x1ZGdlIGZvciB3aGF0IHNob3VsZCBiZSBYTUwgbmFtZXNwYWNlIGZvcm0gaGFuZGxpbmcKCSAqIEByZXR1cm4gc3RyaW5nIHZhbHVlIHNlcmlhbGl6ZWQgYXMgYW4gWE1MIHN0cmluZwoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCWZ1bmN0aW9uIHNlcmlhbGl6ZVR5cGUoJG5hbWUsICR0eXBlLCAkdmFsdWUsICR1c2U9J2VuY29kZWQnLCAkZW5jb2RpbmdTdHlsZT1mYWxzZSwgJHVucXVhbGlmaWVkPWZhbHNlKQoJewoJCSR0aGlzLT5kZWJ1ZygiaW4gc2VyaWFsaXplVHlwZTogbmFtZT0kbmFtZSwgdHlwZT0kdHlwZSwgdXNlPSR1c2UsIGVuY29kaW5nU3R5bGU9JGVuY29kaW5nU3R5bGUsIHVucXVhbGlmaWVkPSIgLiAoJHVucXVhbGlmaWVkID8gInVucXVhbGlmaWVkIiA6ICJxdWFsaWZpZWQiKSk7CgkJJHRoaXMtPmFwcGVuZERlYnVnKCJ2YWx1ZT0iIC4gJHRoaXMtPnZhckR1bXAoJHZhbHVlKSk7CgkJaWYoJHVzZSA9PSAnZW5jb2RlZCcgJiYgJGVuY29kaW5nU3R5bGUpIHsKCQkJJGVuY29kaW5nU3R5bGUgPSAnIFNPQVAtRU5WOmVuY29kaW5nU3R5bGU9IicgLiAkZW5jb2RpbmdTdHlsZSAuICciJzsKCQl9CgoJCS8vIGlmIGEgc29hcHZhbCBoYXMgYmVlbiBzdXBwbGllZCwgbGV0IGl0cyB0eXBlIG92ZXJyaWRlIHRoZSBXU0RMCiAgICAJaWYgKGlzX29iamVjdCgkdmFsdWUpICYmIGdldF9jbGFzcygkdmFsdWUpID09ICdzb2FwdmFsJykgewogICAgCQlpZiAoJHZhbHVlLT50eXBlX25zKSB7CiAgICAJCQkkdHlwZSA9ICR2YWx1ZS0+dHlwZV9ucyAuICc6JyAuICR2YWx1ZS0+dHlwZTsKCQkgICAgCSRmb3JjZVR5cGUgPSB0cnVlOwoJCSAgICAJJHRoaXMtPmRlYnVnKCJpbiBzZXJpYWxpemVUeXBlOiBzb2FwdmFsIG92ZXJyaWRlcyB0eXBlIHRvICR0eXBlIik7CiAgICAJCX0gZWxzZWlmICgkdmFsdWUtPnR5cGUpIHsKCSAgICAJCSR0eXBlID0gJHZhbHVlLT50eXBlOwoJCSAgICAJJGZvcmNlVHlwZSA9IHRydWU7CgkJICAgIAkkdGhpcy0+ZGVidWcoImluIHNlcmlhbGl6ZVR5cGU6IHNvYXB2YWwgb3ZlcnJpZGVzIHR5cGUgdG8gJHR5cGUiKTsKCSAgICAJfSBlbHNlIHsKCSAgICAJCSRmb3JjZVR5cGUgPSBmYWxzZTsKCQkgICAgCSR0aGlzLT5kZWJ1ZygiaW4gc2VyaWFsaXplVHlwZTogc29hcHZhbCBkb2VzIG5vdCBvdmVycmlkZSB0eXBlIik7CgkgICAgCX0KCSAgICAJJGF0dHJzID0gJHZhbHVlLT5hdHRyaWJ1dGVzOwoJICAgIAkkdmFsdWUgPSAkdmFsdWUtPnZhbHVlOwoJICAgIAkkdGhpcy0+ZGVidWcoImluIHNlcmlhbGl6ZVR5cGU6IHNvYXB2YWwgb3ZlcnJpZGVzIHZhbHVlIHRvICR2YWx1ZSIpOwoJICAgIAlpZiAoJGF0dHJzKSB7CgkgICAgCQlpZiAoIWlzX2FycmF5KCR2YWx1ZSkpIHsKCSAgICAJCQkkdmFsdWVbJyEnXSA9ICR2YWx1ZTsKCSAgICAJCX0KCSAgICAJCWZvcmVhY2ggKCRhdHRycyBhcyAkbiA9PiAkdikgewoJICAgIAkJCSR2YWx1ZVsnIScgLiAkbl0gPSAkdjsKCSAgICAJCX0KCQkgICAgCSR0aGlzLT5kZWJ1ZygiaW4gc2VyaWFsaXplVHlwZTogc29hcHZhbCBwcm92aWRlcyBhdHRyaWJ1dGVzIik7CgkJICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgIAkkZm9yY2VUeXBlID0gZmFsc2U7CiAgICAgICAgfQoKCQkkeG1sID0gJyc7CgkJaWYgKHN0cnBvcygkdHlwZSwgJzonKSkgewoJCQkkdXFUeXBlID0gc3Vic3RyKCR0eXBlLCBzdHJycG9zKCR0eXBlLCAnOicpICsgMSk7CgkJCSRucyA9IHN1YnN0cigkdHlwZSwgMCwgc3RycnBvcygkdHlwZSwgJzonKSk7CgkJCSR0aGlzLT5kZWJ1ZygiaW4gc2VyaWFsaXplVHlwZTogZ290IGEgcHJlZml4ZWQgdHlwZTogJHVxVHlwZSwgJG5zIik7CgkJCWlmICgkdGhpcy0+Z2V0TmFtZXNwYWNlRnJvbVByZWZpeCgkbnMpKSB7CgkJCQkkbnMgPSAkdGhpcy0+Z2V0TmFtZXNwYWNlRnJvbVByZWZpeCgkbnMpOwoJCQkJJHRoaXMtPmRlYnVnKCJpbiBzZXJpYWxpemVUeXBlOiBleHBhbmRlZCBwcmVmaXhlZCB0eXBlOiAkdXFUeXBlLCAkbnMiKTsKCQkJfQoKCQkJaWYoJG5zID09ICR0aGlzLT5YTUxTY2hlbWFWZXJzaW9uIHx8ICRucyA9PSAnaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8nKXsKCQkJCSR0aGlzLT5kZWJ1ZygnaW4gc2VyaWFsaXplVHlwZTogdHlwZSBuYW1lc3BhY2UgaW5kaWNhdGVzIFhNTCBTY2hlbWEgb3IgU09BUCBFbmNvZGluZyB0eXBlJyk7CgkJCQlpZiAoJHVucXVhbGlmaWVkICAmJiAkdXNlID09ICdsaXRlcmFsJykgewoJCQkJCSRlbGVtZW50TlMgPSAiIHhtbG5zPVwiXCIiOwoJCQkJfSBlbHNlIHsKCQkJCQkkZWxlbWVudE5TID0gJyc7CgkJCQl9CgkJCQlpZiAoaXNfbnVsbCgkdmFsdWUpKSB7CgkJCQkJaWYgKCR1c2UgPT0gJ2xpdGVyYWwnKSB7CgkJCQkJCS8vIFRPRE86IGRlcGVuZHMgb24gbWluT2NjdXJzCgkJCQkJCSR4bWwgPSAiPCRuYW1lJGVsZW1lbnROUy8+IjsKCQkJCQl9IGVsc2UgewoJCQkJCQkvLyBUT0RPOiBkZXBlbmRzIG9uIG5pbGxhYmxlLCB3aGljaCBzaG91bGQgYmUgY2hlY2tlZCBiZWZvcmUgY2FsbGluZyB0aGlzIG1ldGhvZAoJCQkJCQkkeG1sID0gIjwkbmFtZSRlbGVtZW50TlMgeHNpOm5pbD1cInRydWVcIiB4c2k6dHlwZT1cIiIgLiAkdGhpcy0+Z2V0UHJlZml4RnJvbU5hbWVzcGFjZSgkbnMpIC4gIjokdXFUeXBlXCIvPiI7CgkJCQkJfQoJCQkJCSR0aGlzLT5kZWJ1ZygiaW4gc2VyaWFsaXplVHlwZTogcmV0dXJuaW5nOiAkeG1sIik7CgkJCQkJcmV0dXJuICR4bWw7CgkJCQl9CgkJICAgIAlpZiAoJHVxVHlwZSA9PSAnYm9vbGVhbicpIHsKCQkgICAgCQlpZiAoKGlzX3N0cmluZygkdmFsdWUpICYmICR2YWx1ZSA9PSAnZmFsc2UnKSB8fCAoISAkdmFsdWUpKSB7CgkJCQkJCSR2YWx1ZSA9ICdmYWxzZSc7CgkJCQkJfSBlbHNlIHsKCQkJCQkJJHZhbHVlID0gJ3RydWUnOwoJCQkJCX0KCQkJCX0gCgkJCQlpZiAoJHVxVHlwZSA9PSAnc3RyaW5nJyAmJiBnZXR0eXBlKCR2YWx1ZSkgPT0gJ3N0cmluZycpIHsKCQkJCQkkdmFsdWUgPSAkdGhpcy0+ZXhwYW5kRW50aXRpZXMoJHZhbHVlKTsKCQkJCX0KCQkJCWlmICgoJHVxVHlwZSA9PSAnbG9uZycgfHwgJHVxVHlwZSA9PSAndW5zaWduZWRMb25nJykgJiYgZ2V0dHlwZSgkdmFsdWUpID09ICdkb3VibGUnKSB7CgkJCQkJJHZhbHVlID0gc3ByaW50ZigiJS4wbGYiLCAkdmFsdWUpOwoJCQkJfQoJCQkJLy8gaXQncyBhIHNjYWxhcgoJCQkJLy8gVE9ETzogd2hhdCBhYm91dCBudWxsL25pbCB2YWx1ZXM/CgkJCQkvLyBjaGVjayB0eXBlIGlzbid0IGEgY3VzdG9tIHR5cGUgZXh0ZW5kaW5nIHhtbHNjaGVtYSBuYW1lc3BhY2UKCQkJCWlmICghJHRoaXMtPmdldFR5cGVEZWYoJHVxVHlwZSwgJG5zKSkgewoJCQkJCWlmICgkdXNlID09ICdsaXRlcmFsJykgewoJCQkJCQlpZiAoJGZvcmNlVHlwZSkgewoJCQkJCQkJJHhtbCA9ICI8JG5hbWUkZWxlbWVudE5TIHhzaTp0eXBlPVwiIiAuICR0aGlzLT5nZXRQcmVmaXhGcm9tTmFtZXNwYWNlKCRucykgLiAiOiR1cVR5cGVcIj4kdmFsdWU8LyRuYW1lPiI7CgkJCQkJCX0gZWxzZSB7CgkJCQkJCQkkeG1sID0gIjwkbmFtZSRlbGVtZW50TlM+JHZhbHVlPC8kbmFtZT4iOwoJCQkJCQl9CgkJCQkJfSBlbHNlIHsKCQkJCQkJJHhtbCA9ICI8JG5hbWUkZWxlbWVudE5TIHhzaTp0eXBlPVwiIiAuICR0aGlzLT5nZXRQcmVmaXhGcm9tTmFtZXNwYWNlKCRucykgLiAiOiR1cVR5cGVcIiRlbmNvZGluZ1N0eWxlPiR2YWx1ZTwvJG5hbWU+IjsKCQkJCQl9CgkJCQkJJHRoaXMtPmRlYnVnKCJpbiBzZXJpYWxpemVUeXBlOiByZXR1cm5pbmc6ICR4bWwiKTsKCQkJCQlyZXR1cm4gJHhtbDsKCQkJCX0KCQkJCSR0aGlzLT5kZWJ1ZygnY3VzdG9tIHR5cGUgZXh0ZW5kcyBYTUwgU2NoZW1hIG9yIFNPQVAgRW5jb2RpbmcgbmFtZXNwYWNlICh5dWNrKScpOwoJCQl9IGVsc2UgaWYgKCRucyA9PSAnaHR0cDovL3htbC5hcGFjaGUub3JnL3htbC1zb2FwJykgewoJCQkJJHRoaXMtPmRlYnVnKCdpbiBzZXJpYWxpemVUeXBlOiBhcHBlYXJzIHRvIGJlIEFwYWNoZSBTT0FQIHR5cGUnKTsKCQkJCWlmICgkdXFUeXBlID09ICdNYXAnKSB7CgkJCQkJJHR0X3ByZWZpeCA9ICR0aGlzLT5nZXRQcmVmaXhGcm9tTmFtZXNwYWNlKCdodHRwOi8veG1sLmFwYWNoZS5vcmcveG1sLXNvYXAnKTsKCQkJCQlpZiAoISAkdHRfcHJlZml4KSB7CgkJCQkJCSR0aGlzLT5kZWJ1ZygnaW4gc2VyaWFsaXplVHlwZTogQWRkIG5hbWVzcGFjZSBmb3IgQXBhY2hlIFNPQVAgdHlwZScpOwoJCQkJCQkkdHRfcHJlZml4ID0gJ25zJyAuIHJhbmQoMTAwMCwgOTk5OSk7CgkJCQkJCSR0aGlzLT5uYW1lc3BhY2VzWyR0dF9wcmVmaXhdID0gJ2h0dHA6Ly94bWwuYXBhY2hlLm9yZy94bWwtc29hcCc7CgkJCQkJCS8vIGZvcmNlIHRoaXMgdG8gYmUgYWRkZWQgdG8gdXNlZE5hbWVzcGFjZXMKCQkJCQkJJHR0X3ByZWZpeCA9ICR0aGlzLT5nZXRQcmVmaXhGcm9tTmFtZXNwYWNlKCdodHRwOi8veG1sLmFwYWNoZS5vcmcveG1sLXNvYXAnKTsKCQkJCQl9CgkJCQkJJGNvbnRlbnRzID0gJyc7CgkJCQkJZm9yZWFjaCgkdmFsdWUgYXMgJGsgPT4gJHYpIHsKCQkJCQkJJHRoaXMtPmRlYnVnKCJzZXJpYWxpemluZyBtYXAgZWxlbWVudDoga2V5ICRrLCB2YWx1ZSAkdiIpOwoJCQkJCQkkY29udGVudHMgLj0gJzxpdGVtPic7CgkJCQkJCSRjb250ZW50cyAuPSAkdGhpcy0+c2VyaWFsaXplX3ZhbCgkaywna2V5JyxmYWxzZSxmYWxzZSxmYWxzZSxmYWxzZSwkdXNlKTsKCQkJCQkJJGNvbnRlbnRzIC49ICR0aGlzLT5zZXJpYWxpemVfdmFsKCR2LCd2YWx1ZScsZmFsc2UsZmFsc2UsZmFsc2UsZmFsc2UsJHVzZSk7CgkJCQkJCSRjb250ZW50cyAuPSAnPC9pdGVtPic7CgkJCQkJfQoJCQkJCWlmICgkdXNlID09ICdsaXRlcmFsJykgewoJCQkJCQlpZiAoJGZvcmNlVHlwZSkgewoJCQkJCQkJJHhtbCA9ICI8JG5hbWUgeHNpOnR5cGU9XCIiIC4gJHR0X3ByZWZpeCAuICI6JHVxVHlwZVwiPiRjb250ZW50czwvJG5hbWU+IjsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCSR4bWwgPSAiPCRuYW1lPiRjb250ZW50czwvJG5hbWU+IjsKCQkJCQkJfQoJCQkJCX0gZWxzZSB7CgkJCQkJCSR4bWwgPSAiPCRuYW1lIHhzaTp0eXBlPVwiIiAuICR0dF9wcmVmaXggLiAiOiR1cVR5cGVcIiRlbmNvZGluZ1N0eWxlPiRjb250ZW50czwvJG5hbWU+IjsKCQkJCQl9CgkJCQkJJHRoaXMtPmRlYnVnKCJpbiBzZXJpYWxpemVUeXBlOiByZXR1cm5pbmc6ICR4bWwiKTsKCQkJCQlyZXR1cm4gJHhtbDsKCQkJCX0KCQkJCSR0aGlzLT5kZWJ1ZygnaW4gc2VyaWFsaXplVHlwZTogQXBhY2hlIFNPQVAgdHlwZSwgYnV0IG9ubHkgc3VwcG9ydCBNYXAnKTsKCQkJfQoJCX0gZWxzZSB7CgkJCS8vIFRPRE86IHNob3VsZCB0aGUgdHlwZSBiZSBjb21wYXJlZCB0byB0eXBlcyBpbiBYU0QsIGFuZCB0aGUgbmFtZXNwYWNlCgkJCS8vIHNldCB0byBYU0QgaWYgdGhlIHR5cGUgbWF0Y2hlcz8KCQkJJHRoaXMtPmRlYnVnKCJpbiBzZXJpYWxpemVUeXBlOiBObyBuYW1lc3BhY2UgZm9yIHR5cGUgJHR5cGUiKTsKCQkJJG5zID0gJyc7CgkJCSR1cVR5cGUgPSAkdHlwZTsKCQl9CgkJaWYoISR0eXBlRGVmID0gJHRoaXMtPmdldFR5cGVEZWYoJHVxVHlwZSwgJG5zKSl7CgkJCSR0aGlzLT5zZXRFcnJvcigiJHR5cGUgKCR1cVR5cGUpIGlzIG5vdCBhIHN1cHBvcnRlZCB0eXBlLiIpOwoJCQkkdGhpcy0+ZGVidWcoImluIHNlcmlhbGl6ZVR5cGU6ICR0eXBlICgkdXFUeXBlKSBpcyBub3QgYSBzdXBwb3J0ZWQgdHlwZS4iKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0gZWxzZSB7CgkJCSR0aGlzLT5kZWJ1ZygiaW4gc2VyaWFsaXplVHlwZTogZm91bmQgdHlwZURlZiIpOwoJCQkkdGhpcy0+YXBwZW5kRGVidWcoJ3R5cGVEZWY9JyAuICR0aGlzLT52YXJEdW1wKCR0eXBlRGVmKSk7CgkJfQoJCSRwaHBUeXBlID0gJHR5cGVEZWZbJ3BocFR5cGUnXTsKCQkkdGhpcy0+ZGVidWcoImluIHNlcmlhbGl6ZVR5cGU6IHVxVHlwZTogJHVxVHlwZSwgbnM6ICRucywgcGhwdHlwZTogJHBocFR5cGUsIGFycmF5VHlwZTogIiAuIChpc3NldCgkdHlwZURlZlsnYXJyYXlUeXBlJ10pID8gJHR5cGVEZWZbJ2FycmF5VHlwZSddIDogJycpICk7IAoJCS8vIGlmIHBocCB0eXBlID09IHN0cnVjdCwgbWFwIHZhbHVlIHRvIHRoZSA8YWxsPiBlbGVtZW50IG5hbWVzCgkJaWYgKCRwaHBUeXBlID09ICdzdHJ1Y3QnKSB7CgkJCWlmIChpc3NldCgkdHlwZURlZlsndHlwZUNsYXNzJ10pICYmICR0eXBlRGVmWyd0eXBlQ2xhc3MnXSA9PSAnZWxlbWVudCcpIHsKCQkJCSRlbGVtZW50TmFtZSA9ICR1cVR5cGU7CgkJCQlpZiAoaXNzZXQoJHR5cGVEZWZbJ2Zvcm0nXSkgJiYgKCR0eXBlRGVmWydmb3JtJ10gPT0gJ3F1YWxpZmllZCcpKSB7CgkJCQkJJGVsZW1lbnROUyA9ICIgeG1sbnM9XCIkbnNcIiI7CgkJCQl9IGVsc2UgewoJCQkJCSRlbGVtZW50TlMgPSAiIHhtbG5zPVwiXCIiOwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJJGVsZW1lbnROYW1lID0gJG5hbWU7CgkJCQlpZiAoJHVucXVhbGlmaWVkKSB7CgkJCQkJJGVsZW1lbnROUyA9ICIgeG1sbnM9XCJcIiI7CgkJCQl9IGVsc2UgewoJCQkJCSRlbGVtZW50TlMgPSAnJzsKCQkJCX0KCQkJfQoJCQlpZiAoaXNfbnVsbCgkdmFsdWUpKSB7CgkJCQlpZiAoJHVzZSA9PSAnbGl0ZXJhbCcpIHsKCQkJCQkvLyBUT0RPOiBkZXBlbmRzIG9uIG1pbk9jY3VycwoJCQkJCSR4bWwgPSAiPCRlbGVtZW50TmFtZSRlbGVtZW50TlMvPiI7CgkJCQl9IGVsc2UgewoJCQkJCSR4bWwgPSAiPCRlbGVtZW50TmFtZSRlbGVtZW50TlMgeHNpOm5pbD1cInRydWVcIiB4c2k6dHlwZT1cIiIgLiAkdGhpcy0+Z2V0UHJlZml4RnJvbU5hbWVzcGFjZSgkbnMpIC4gIjokdXFUeXBlXCIvPiI7CgkJCQl9CgkJCQkkdGhpcy0+ZGVidWcoImluIHNlcmlhbGl6ZVR5cGU6IHJldHVybmluZzogJHhtbCIpOwoJCQkJcmV0dXJuICR4bWw7CgkJCX0KCQkJaWYgKGlzX29iamVjdCgkdmFsdWUpKSB7CgkJCQkkdmFsdWUgPSBnZXRfb2JqZWN0X3ZhcnMoJHZhbHVlKTsKCQkJfQoJCQlpZiAoaXNfYXJyYXkoJHZhbHVlKSkgewoJCQkJJGVsZW1lbnRBdHRycyA9ICR0aGlzLT5zZXJpYWxpemVDb21wbGV4VHlwZUF0dHJpYnV0ZXMoJHR5cGVEZWYsICR2YWx1ZSwgJG5zLCAkdXFUeXBlKTsKCQkJCWlmICgkdXNlID09ICdsaXRlcmFsJykgewoJCQkJCWlmICgkZm9yY2VUeXBlKSB7CgkJCQkJCSR4bWwgPSAiPCRlbGVtZW50TmFtZSRlbGVtZW50TlMkZWxlbWVudEF0dHJzIHhzaTp0eXBlPVwiIiAuICR0aGlzLT5nZXRQcmVmaXhGcm9tTmFtZXNwYWNlKCRucykgLiAiOiR1cVR5cGVcIj4iOwoJCQkJCX0gZWxzZSB7CgkJCQkJCSR4bWwgPSAiPCRlbGVtZW50TmFtZSRlbGVtZW50TlMkZWxlbWVudEF0dHJzPiI7CgkJCQkJfQoJCQkJfSBlbHNlIHsKCQkJCQkkeG1sID0gIjwkZWxlbWVudE5hbWUkZWxlbWVudE5TJGVsZW1lbnRBdHRycyB4c2k6dHlwZT1cIiIgLiAkdGhpcy0+Z2V0UHJlZml4RnJvbU5hbWVzcGFjZSgkbnMpIC4gIjokdXFUeXBlXCIkZW5jb2RpbmdTdHlsZT4iOwoJCQkJfQoJCgkJCQkkeG1sIC49ICR0aGlzLT5zZXJpYWxpemVDb21wbGV4VHlwZUVsZW1lbnRzKCR0eXBlRGVmLCAkdmFsdWUsICRucywgJHVxVHlwZSwgJHVzZSwgJGVuY29kaW5nU3R5bGUpOwoJCQkJJHhtbCAuPSAiPC8kZWxlbWVudE5hbWU+IjsKCQkJfSBlbHNlIHsKCQkJCSR0aGlzLT5kZWJ1ZygiaW4gc2VyaWFsaXplVHlwZTogcGhwVHlwZSBpcyBzdHJ1Y3QsIGJ1dCB2YWx1ZSBpcyBub3QgYW4gYXJyYXkiKTsKCQkJCSR0aGlzLT5zZXRFcnJvcigicGhwVHlwZSBpcyBzdHJ1Y3QsIGJ1dCB2YWx1ZSBpcyBub3QgYW4gYXJyYXk6IHNlZSBkZWJ1ZyBvdXRwdXQgZm9yIGRldGFpbHMiKTsKCQkJCSR4bWwgPSAnJzsKCQkJfQoJCX0gZWxzZWlmICgkcGhwVHlwZSA9PSAnYXJyYXknKSB7CgkJCWlmIChpc3NldCgkdHlwZURlZlsnZm9ybSddKSAmJiAoJHR5cGVEZWZbJ2Zvcm0nXSA9PSAncXVhbGlmaWVkJykpIHsKCQkJCSRlbGVtZW50TlMgPSAiIHhtbG5zPVwiJG5zXCIiOwoJCQl9IGVsc2UgewoJCQkJaWYgKCR1bnF1YWxpZmllZCkgewoJCQkJCSRlbGVtZW50TlMgPSAiIHhtbG5zPVwiXCIiOwoJCQkJfSBlbHNlIHsKCQkJCQkkZWxlbWVudE5TID0gJyc7CgkJCQl9CgkJCX0KCQkJaWYgKGlzX251bGwoJHZhbHVlKSkgewoJCQkJaWYgKCR1c2UgPT0gJ2xpdGVyYWwnKSB7CgkJCQkJLy8gVE9ETzogZGVwZW5kcyBvbiBtaW5PY2N1cnMKCQkJCQkkeG1sID0gIjwkbmFtZSRlbGVtZW50TlMvPiI7CgkJCQl9IGVsc2UgewoJCQkJCSR4bWwgPSAiPCRuYW1lJGVsZW1lbnROUyB4c2k6bmlsPVwidHJ1ZVwiIHhzaTp0eXBlPVwiIiAuCgkJCQkJCSR0aGlzLT5nZXRQcmVmaXhGcm9tTmFtZXNwYWNlKCdodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLycpIC4KCQkJCQkJIjpBcnJheVwiICIgLgoJCQkJCQkkdGhpcy0+Z2V0UHJlZml4RnJvbU5hbWVzcGFjZSgnaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8nKSAuCgkJCQkJCSc6YXJyYXlUeXBlPSInIC4KCQkJCQkJJHRoaXMtPmdldFByZWZpeEZyb21OYW1lc3BhY2UoJHRoaXMtPmdldFByZWZpeCgkdHlwZURlZlsnYXJyYXlUeXBlJ10pKSAuCgkJCQkJCSc6JyAuCgkJCQkJCSR0aGlzLT5nZXRMb2NhbFBhcnQoJHR5cGVEZWZbJ2FycmF5VHlwZSddKS4iWzBdXCIvPiI7CgkJCQl9CgkJCQkkdGhpcy0+ZGVidWcoImluIHNlcmlhbGl6ZVR5cGU6IHJldHVybmluZzogJHhtbCIpOwoJCQkJcmV0dXJuICR4bWw7CgkJCX0KCQkJaWYgKGlzc2V0KCR0eXBlRGVmWydtdWx0aWRpbWVuc2lvbmFsJ10pKSB7CgkJCQkkbnYgPSBhcnJheSgpOwoJCQkJZm9yZWFjaCgkdmFsdWUgYXMgJHYpIHsKCQkJCQkkY29scyA9ICcsJyAuIHNpemVvZigkdik7CgkJCQkJJG52ID0gYXJyYXlfbWVyZ2UoJG52LCAkdik7CgkJCQl9IAoJCQkJJHZhbHVlID0gJG52OwoJCQl9IGVsc2UgewoJCQkJJGNvbHMgPSAnJzsKCQkJfSAKCQkJaWYgKGlzX2FycmF5KCR2YWx1ZSkgJiYgc2l6ZW9mKCR2YWx1ZSkgPj0gMSkgewoJCQkJJHJvd3MgPSBzaXplb2YoJHZhbHVlKTsKCQkJCSRjb250ZW50cyA9ICcnOwoJCQkJZm9yZWFjaCgkdmFsdWUgYXMgJGsgPT4gJHYpIHsKCQkJCQkkdGhpcy0+ZGVidWcoInNlcmlhbGl6aW5nIGFycmF5IGVsZW1lbnQ6ICRrLCAkdiBvZiB0eXBlOiAkdHlwZURlZlthcnJheVR5cGVdIik7CgkJCQkJLy9pZiAoc3RycG9zKCR0eXBlRGVmWydhcnJheVR5cGUnXSwgJzonKSApIHsKCQkJCQlpZiAoIWluX2FycmF5KCR0eXBlRGVmWydhcnJheVR5cGUnXSwkdGhpcy0+dHlwZW1hcFsnaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnXSkpIHsKCQkJCQkgICAgJGNvbnRlbnRzIC49ICR0aGlzLT5zZXJpYWxpemVUeXBlKCdpdGVtJywgJHR5cGVEZWZbJ2FycmF5VHlwZSddLCAkdiwgJHVzZSk7CgkJCQkJfSBlbHNlIHsKCQkJCQkgICAgJGNvbnRlbnRzIC49ICR0aGlzLT5zZXJpYWxpemVfdmFsKCR2LCAnaXRlbScsICR0eXBlRGVmWydhcnJheVR5cGUnXSwgbnVsbCwgJHRoaXMtPlhNTFNjaGVtYVZlcnNpb24sIGZhbHNlLCAkdXNlKTsKCQkJCQl9IAoJCQkJfQoJCQl9IGVsc2UgewoJCQkJJHJvd3MgPSAwOwoJCQkJJGNvbnRlbnRzID0gbnVsbDsKCQkJfQoJCQkvLyBUT0RPOiBmb3Igbm93LCBhbiBlbXB0eSB2YWx1ZSB3aWxsIGJlIHNlcmlhbGl6ZWQgYXMgYSB6ZXJvIGVsZW1lbnQKCQkJLy8gYXJyYXkuICBSZXZpc2l0IHRoaXMgd2hlbiBjb2RpbmcgdGhlIGhhbmRsaW5nIG9mIG51bGwvbmlsIHZhbHVlcy4KCQkJaWYgKCR1c2UgPT0gJ2xpdGVyYWwnKSB7CgkJCQkkeG1sID0gIjwkbmFtZSRlbGVtZW50TlM+IgoJCQkJCS4kY29udGVudHMKCQkJCQkuIjwvJG5hbWU+IjsKCQkJfSBlbHNlIHsKCQkJCSR4bWwgPSAiPCRuYW1lJGVsZW1lbnROUyB4c2k6dHlwZT1cIiIuJHRoaXMtPmdldFByZWZpeEZyb21OYW1lc3BhY2UoJ2h0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvJykuJzpBcnJheSIgJy4KCQkJCQkkdGhpcy0+Z2V0UHJlZml4RnJvbU5hbWVzcGFjZSgnaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8nKQoJCQkJCS4nOmFycmF5VHlwZT0iJwoJCQkJCS4kdGhpcy0+Z2V0UHJlZml4RnJvbU5hbWVzcGFjZSgkdGhpcy0+Z2V0UHJlZml4KCR0eXBlRGVmWydhcnJheVR5cGUnXSkpCgkJCQkJLiI6Ii4kdGhpcy0+Z2V0TG9jYWxQYXJ0KCR0eXBlRGVmWydhcnJheVR5cGUnXSkuIlskcm93cyRjb2xzXVwiPiIKCQkJCQkuJGNvbnRlbnRzCgkJCQkJLiI8LyRuYW1lPiI7CgkJCX0KCQl9IGVsc2VpZiAoJHBocFR5cGUgPT0gJ3NjYWxhcicpIHsKCQkJaWYgKGlzc2V0KCR0eXBlRGVmWydmb3JtJ10pICYmICgkdHlwZURlZlsnZm9ybSddID09ICdxdWFsaWZpZWQnKSkgewoJCQkJJGVsZW1lbnROUyA9ICIgeG1sbnM9XCIkbnNcIiI7CgkJCX0gZWxzZSB7CgkJCQlpZiAoJHVucXVhbGlmaWVkKSB7CgkJCQkJJGVsZW1lbnROUyA9ICIgeG1sbnM9XCJcIiI7CgkJCQl9IGVsc2UgewoJCQkJCSRlbGVtZW50TlMgPSAnJzsKCQkJCX0KCQkJfQoJCQlpZiAoJHVzZSA9PSAnbGl0ZXJhbCcpIHsKCQkJCWlmICgkZm9yY2VUeXBlKSB7CgkJCQkJJHhtbCA9ICI8JG5hbWUkZWxlbWVudE5TIHhzaTp0eXBlPVwiIiAuICR0aGlzLT5nZXRQcmVmaXhGcm9tTmFtZXNwYWNlKCRucykgLiAiOiR1cVR5cGVcIj4kdmFsdWU8LyRuYW1lPiI7CgkJCQl9IGVsc2UgewoJCQkJCSR4bWwgPSAiPCRuYW1lJGVsZW1lbnROUz4kdmFsdWU8LyRuYW1lPiI7CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQkkeG1sID0gIjwkbmFtZSRlbGVtZW50TlMgeHNpOnR5cGU9XCIiIC4gJHRoaXMtPmdldFByZWZpeEZyb21OYW1lc3BhY2UoJG5zKSAuICI6JHVxVHlwZVwiJGVuY29kaW5nU3R5bGU+JHZhbHVlPC8kbmFtZT4iOwoJCQl9CgkJfQoJCSR0aGlzLT5kZWJ1ZygiaW4gc2VyaWFsaXplVHlwZTogcmV0dXJuaW5nOiAkeG1sIik7CgkJcmV0dXJuICR4bWw7Cgl9CgkKCS8qKgoJICogc2VyaWFsaXplcyB0aGUgYXR0cmlidXRlcyBmb3IgYSBjb21wbGV4VHlwZQoJICoKCSAqIEBwYXJhbSBhcnJheSAkdHlwZURlZiBvdXIgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgYW4gWE1MIHNjaGVtYSB0eXBlIChvciBlbGVtZW50KQoJICogQHBhcmFtIG1peGVkICR2YWx1ZSBhIG5hdGl2ZSBQSFAgdmFsdWUgKHBhcmFtZXRlciB2YWx1ZSkKCSAqIEBwYXJhbSBzdHJpbmcgJG5zIHRoZSBuYW1lc3BhY2Ugb2YgdGhlIHR5cGUKCSAqIEBwYXJhbSBzdHJpbmcgJHVxVHlwZSB0aGUgbG9jYWwgcGFydCBvZiB0aGUgdHlwZQoJICogQHJldHVybiBzdHJpbmcgdmFsdWUgc2VyaWFsaXplZCBhcyBhbiBYTUwgc3RyaW5nCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJZnVuY3Rpb24gc2VyaWFsaXplQ29tcGxleFR5cGVBdHRyaWJ1dGVzKCR0eXBlRGVmLCAkdmFsdWUsICRucywgJHVxVHlwZSkgewoJCSR4bWwgPSAnJzsKCQlpZiAoaXNzZXQoJHR5cGVEZWZbJ2F0dHJzJ10pICYmIGlzX2FycmF5KCR0eXBlRGVmWydhdHRycyddKSkgewoJCQkkdGhpcy0+ZGVidWcoInNlcmlhbGl6ZSBhdHRyaWJ1dGVzIGZvciBYTUwgU2NoZW1hIHR5cGUgJG5zOiR1cVR5cGUiKTsKCQkJaWYgKGlzX2FycmF5KCR2YWx1ZSkpIHsKCQkJCSR4dmFsdWUgPSAkdmFsdWU7CgkJCX0gZWxzZWlmIChpc19vYmplY3QoJHZhbHVlKSkgewoJCQkJJHh2YWx1ZSA9IGdldF9vYmplY3RfdmFycygkdmFsdWUpOwoJCQl9IGVsc2UgewoJCQkJJHRoaXMtPmRlYnVnKCJ2YWx1ZSBpcyBuZWl0aGVyIGFuIGFycmF5IG5vciBhbiBvYmplY3QgZm9yIFhNTCBTY2hlbWEgdHlwZSAkbnM6JHVxVHlwZSIpOwoJCQkJJHh2YWx1ZSA9IGFycmF5KCk7CgkJCX0KCQkJZm9yZWFjaCAoJHR5cGVEZWZbJ2F0dHJzJ10gYXMgJGFOYW1lID0+ICRhdHRycykgewoJCQkJaWYgKGlzc2V0KCR4dmFsdWVbJyEnIC4gJGFOYW1lXSkpIHsKCQkJCQkkeG5hbWUgPSAnIScgLiAkYU5hbWU7CgkJCQkJJHRoaXMtPmRlYnVnKCJ2YWx1ZSBwcm92aWRlZCBmb3IgYXR0cmlidXRlICRhTmFtZSB3aXRoIGtleSAkeG5hbWUiKTsKCQkJCX0gZWxzZWlmIChpc3NldCgkeHZhbHVlWyRhTmFtZV0pKSB7CgkJCQkJJHhuYW1lID0gJGFOYW1lOwoJCQkJCSR0aGlzLT5kZWJ1ZygidmFsdWUgcHJvdmlkZWQgZm9yIGF0dHJpYnV0ZSAkYU5hbWUgd2l0aCBrZXkgJHhuYW1lIik7CgkJCQl9IGVsc2VpZiAoaXNzZXQoJGF0dHJzWydkZWZhdWx0J10pKSB7CgkJCQkJJHhuYW1lID0gJyEnIC4gJGFOYW1lOwoJCQkJCSR4dmFsdWVbJHhuYW1lXSA9ICRhdHRyc1snZGVmYXVsdCddOwoJCQkJCSR0aGlzLT5kZWJ1ZygndXNlIGRlZmF1bHQgdmFsdWUgb2YgJyAuICR4dmFsdWVbJGFOYW1lXSAuICcgZm9yIGF0dHJpYnV0ZSAnIC4gJGFOYW1lKTsKCQkJCX0gZWxzZSB7CgkJCQkJJHhuYW1lID0gJyc7CgkJCQkJJHRoaXMtPmRlYnVnKCJubyB2YWx1ZSBwcm92aWRlZCBmb3IgYXR0cmlidXRlICRhTmFtZSIpOwoJCQkJfQoJCQkJaWYgKCR4bmFtZSkgewoJCQkJCSR4bWwgLj0gICIgJGFOYW1lPVwiIiAuICR0aGlzLT5leHBhbmRFbnRpdGllcygkeHZhbHVlWyR4bmFtZV0pIC4gIlwiIjsKCQkJCX0KCQkJfSAKCQl9IGVsc2UgewoJCQkkdGhpcy0+ZGVidWcoIm5vIGF0dHJpYnV0ZXMgdG8gc2VyaWFsaXplIGZvciBYTUwgU2NoZW1hIHR5cGUgJG5zOiR1cVR5cGUiKTsKCQl9CgkJaWYgKGlzc2V0KCR0eXBlRGVmWydleHRlbnNpb25CYXNlJ10pKSB7CgkJCSRucyA9ICR0aGlzLT5nZXRQcmVmaXgoJHR5cGVEZWZbJ2V4dGVuc2lvbkJhc2UnXSk7CgkJCSR1cVR5cGUgPSAkdGhpcy0+Z2V0TG9jYWxQYXJ0KCR0eXBlRGVmWydleHRlbnNpb25CYXNlJ10pOwoJCQlpZiAoJHRoaXMtPmdldE5hbWVzcGFjZUZyb21QcmVmaXgoJG5zKSkgewoJCQkJJG5zID0gJHRoaXMtPmdldE5hbWVzcGFjZUZyb21QcmVmaXgoJG5zKTsKCQkJfQoJCQlpZiAoJHR5cGVEZWYgPSAkdGhpcy0+Z2V0VHlwZURlZigkdXFUeXBlLCAkbnMpKSB7CgkJCQkkdGhpcy0+ZGVidWcoInNlcmlhbGl6ZSBhdHRyaWJ1dGVzIGZvciBleHRlbnNpb24gYmFzZSAkbnM6JHVxVHlwZSIpOwoJCQkJJHhtbCAuPSAkdGhpcy0+c2VyaWFsaXplQ29tcGxleFR5cGVBdHRyaWJ1dGVzKCR0eXBlRGVmLCAkdmFsdWUsICRucywgJHVxVHlwZSk7CgkJCX0gZWxzZSB7CgkJCQkkdGhpcy0+ZGVidWcoImV4dGVuc2lvbiBiYXNlICRuczokdXFUeXBlIGlzIG5vdCBhIHN1cHBvcnRlZCB0eXBlIik7CgkJCX0KCQl9CgkJcmV0dXJuICR4bWw7Cgl9CgoJLyoqCgkgKiBzZXJpYWxpemVzIHRoZSBlbGVtZW50cyBmb3IgYSBjb21wbGV4VHlwZQoJICoKCSAqIEBwYXJhbSBhcnJheSAkdHlwZURlZiBvdXIgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgYW4gWE1MIHNjaGVtYSB0eXBlIChvciBlbGVtZW50KQoJICogQHBhcmFtIG1peGVkICR2YWx1ZSBhIG5hdGl2ZSBQSFAgdmFsdWUgKHBhcmFtZXRlciB2YWx1ZSkKCSAqIEBwYXJhbSBzdHJpbmcgJG5zIHRoZSBuYW1lc3BhY2Ugb2YgdGhlIHR5cGUKCSAqIEBwYXJhbSBzdHJpbmcgJHVxVHlwZSB0aGUgbG9jYWwgcGFydCBvZiB0aGUgdHlwZQoJICogQHBhcmFtIHN0cmluZyAkdXNlIHVzZSBmb3IgcGFydCAoZW5jb2RlZHxsaXRlcmFsKQoJICogQHBhcmFtIHN0cmluZyAkZW5jb2RpbmdTdHlsZSBTT0FQIGVuY29kaW5nIHN0eWxlIGZvciB0aGUgdmFsdWUgKGlmIGRpZmZlcmVudCB0aGFuIHRoZSBlbmNsb3Npbmcgc3R5bGUpCgkgKiBAcmV0dXJuIHN0cmluZyB2YWx1ZSBzZXJpYWxpemVkIGFzIGFuIFhNTCBzdHJpbmcKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCglmdW5jdGlvbiBzZXJpYWxpemVDb21wbGV4VHlwZUVsZW1lbnRzKCR0eXBlRGVmLCAkdmFsdWUsICRucywgJHVxVHlwZSwgJHVzZT0nZW5jb2RlZCcsICRlbmNvZGluZ1N0eWxlPWZhbHNlKSB7CgkJJHhtbCA9ICcnOwoJCWlmIChpc3NldCgkdHlwZURlZlsnZWxlbWVudHMnXSkgJiYgaXNfYXJyYXkoJHR5cGVEZWZbJ2VsZW1lbnRzJ10pKSB7CgkJCSR0aGlzLT5kZWJ1ZygiaW4gc2VyaWFsaXplQ29tcGxleFR5cGVFbGVtZW50cywgc2VyaWFsaXplIGVsZW1lbnRzIGZvciBYTUwgU2NoZW1hIHR5cGUgJG5zOiR1cVR5cGUiKTsKCQkJaWYgKGlzX2FycmF5KCR2YWx1ZSkpIHsKCQkJCSR4dmFsdWUgPSAkdmFsdWU7CgkJCX0gZWxzZWlmIChpc19vYmplY3QoJHZhbHVlKSkgewoJCQkJJHh2YWx1ZSA9IGdldF9vYmplY3RfdmFycygkdmFsdWUpOwoJCQl9IGVsc2UgewoJCQkJJHRoaXMtPmRlYnVnKCJ2YWx1ZSBpcyBuZWl0aGVyIGFuIGFycmF5IG5vciBhbiBvYmplY3QgZm9yIFhNTCBTY2hlbWEgdHlwZSAkbnM6JHVxVHlwZSIpOwoJCQkJJHh2YWx1ZSA9IGFycmF5KCk7CgkJCX0KCQkJLy8gdG9nZ2xlIHdoZXRoZXIgYWxsIGVsZW1lbnRzIGFyZSBwcmVzZW50IC0gaWRlYWxseSBzaG91bGQgdmFsaWRhdGUgYWdhaW5zdCBzY2hlbWEKCQkJaWYgKGNvdW50KCR0eXBlRGVmWydlbGVtZW50cyddKSAhPSBjb3VudCgkeHZhbHVlKSl7CgkJCQkkb3B0aW9uYWxzID0gdHJ1ZTsKCQkJfQoJCQlmb3JlYWNoICgkdHlwZURlZlsnZWxlbWVudHMnXSBhcyAkZU5hbWUgPT4gJGF0dHJzKSB7CgkJCQlpZiAoIWlzc2V0KCR4dmFsdWVbJGVOYW1lXSkpIHsKCQkJCQlpZiAoaXNzZXQoJGF0dHJzWydkZWZhdWx0J10pKSB7CgkJCQkJCSR4dmFsdWVbJGVOYW1lXSA9ICRhdHRyc1snZGVmYXVsdCddOwoJCQkJCQkkdGhpcy0+ZGVidWcoJ3VzZSBkZWZhdWx0IHZhbHVlIG9mICcgLiAkeHZhbHVlWyRlTmFtZV0gLiAnIGZvciBlbGVtZW50ICcgLiAkZU5hbWUpOwoJCQkJCX0KCQkJCX0KCQkJCS8vIGlmIHVzZXIgdG9vayBhZHZhbnRhZ2Ugb2YgYSBtaW5PY2N1cnM9MCwgdGhlbiBvbmx5IHNlcmlhbGl6ZSBuYW1lZCBwYXJhbWV0ZXJzCgkJCQlpZiAoaXNzZXQoJG9wdGlvbmFscykKCQkJCSAgICAmJiAoIWlzc2V0KCR4dmFsdWVbJGVOYW1lXSkpIAoJCQkJCSYmICggKCFpc3NldCgkYXR0cnNbJ25pbGxhYmxlJ10pKSB8fCAkYXR0cnNbJ25pbGxhYmxlJ10gIT0gJ3RydWUnKQoJCQkJCSl7CgkJCQkJaWYgKGlzc2V0KCRhdHRyc1snbWluT2NjdXJzJ10pICYmICRhdHRyc1snbWluT2NjdXJzJ10gPD4gJzAnKSB7CgkJCQkJCSR0aGlzLT5kZWJ1ZygiYXBwYXJlbnQgZXJyb3I6IG5vIHZhbHVlIHByb3ZpZGVkIGZvciBlbGVtZW50ICRlTmFtZSB3aXRoIG1pbk9jY3Vycz0iIC4gJGF0dHJzWydtaW5PY2N1cnMnXSk7CgkJCQkJfQoJCQkJCS8vIGRvIG5vdGhpbmcKCQkJCQkkdGhpcy0+ZGVidWcoIm5vIHZhbHVlIHByb3ZpZGVkIGZvciBjb21wbGV4VHlwZSBlbGVtZW50ICRlTmFtZSBhbmQgZWxlbWVudCBpcyBub3QgbmlsbGFibGUsIHNvIHNlcmlhbGl6ZSBub3RoaW5nIik7CgkJCQl9IGVsc2UgewoJCQkJCS8vIGdldCB2YWx1ZQoJCQkJCWlmIChpc3NldCgkeHZhbHVlWyRlTmFtZV0pKSB7CgkJCQkJICAgICR2ID0gJHh2YWx1ZVskZU5hbWVdOwoJCQkJCX0gZWxzZSB7CgkJCQkJICAgICR2ID0gbnVsbDsKCQkJCQl9CgkJCQkJaWYgKGlzc2V0KCRhdHRyc1snZm9ybSddKSkgewoJCQkJCQkkdW5xdWFsaWZpZWQgPSAoJGF0dHJzWydmb3JtJ10gPT0gJ3VucXVhbGlmaWVkJyk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJJHVucXVhbGlmaWVkID0gZmFsc2U7CgkJCQkJfQoJCQkJCWlmIChpc3NldCgkYXR0cnNbJ21heE9jY3VycyddKSAmJiAoJGF0dHJzWydtYXhPY2N1cnMnXSA9PSAndW5ib3VuZGVkJyB8fCAkYXR0cnNbJ21heE9jY3VycyddID4gMSkgJiYgaXNzZXQoJHYpICYmIGlzX2FycmF5KCR2KSAmJiAkdGhpcy0+aXNBcnJheVNpbXBsZU9yU3RydWN0KCR2KSA9PSAnYXJyYXlTaW1wbGUnKSB7CgkJCQkJCSR2diA9ICR2OwoJCQkJCQlmb3JlYWNoICgkdnYgYXMgJGsgPT4gJHYpIHsKCQkJCQkJCWlmIChpc3NldCgkYXR0cnNbJ3R5cGUnXSkgfHwgaXNzZXQoJGF0dHJzWydyZWYnXSkpIHsKCQkJCQkJCQkvLyBzZXJpYWxpemUgc2NoZW1hLWRlZmluZWQgdHlwZQoJCQkJCQkJICAgICR4bWwgLj0gJHRoaXMtPnNlcmlhbGl6ZVR5cGUoJGVOYW1lLCBpc3NldCgkYXR0cnNbJ3R5cGUnXSkgPyAkYXR0cnNbJ3R5cGUnXSA6ICRhdHRyc1sncmVmJ10sICR2LCAkdXNlLCAkZW5jb2RpbmdTdHlsZSwgJHVucXVhbGlmaWVkKTsKCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJLy8gc2VyaWFsaXplIGdlbmVyaWMgdHlwZSAoY2FuIHRoaXMgZXZlciByZWFsbHkgaGFwcGVuPykKCQkJCQkJCSAgICAkdGhpcy0+ZGVidWcoImNhbGxpbmcgc2VyaWFsaXplX3ZhbCgpIGZvciAkdiwgJGVOYW1lLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgJHVzZSIpOwoJCQkJCQkJICAgICR4bWwgLj0gJHRoaXMtPnNlcmlhbGl6ZV92YWwoJHYsICRlTmFtZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsICR1c2UpOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfSBlbHNlIHsKCQkJCQkJaWYgKGlzc2V0KCRhdHRyc1sndHlwZSddKSB8fCBpc3NldCgkYXR0cnNbJ3JlZiddKSkgewoJCQkJCQkJLy8gc2VyaWFsaXplIHNjaGVtYS1kZWZpbmVkIHR5cGUKCQkJCQkJICAgICR4bWwgLj0gJHRoaXMtPnNlcmlhbGl6ZVR5cGUoJGVOYW1lLCBpc3NldCgkYXR0cnNbJ3R5cGUnXSkgPyAkYXR0cnNbJ3R5cGUnXSA6ICRhdHRyc1sncmVmJ10sICR2LCAkdXNlLCAkZW5jb2RpbmdTdHlsZSwgJHVucXVhbGlmaWVkKTsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCS8vIHNlcmlhbGl6ZSBnZW5lcmljIHR5cGUgKGNhbiB0aGlzIGV2ZXIgcmVhbGx5IGhhcHBlbj8pCgkJCQkJCSAgICAkdGhpcy0+ZGVidWcoImNhbGxpbmcgc2VyaWFsaXplX3ZhbCgpIGZvciAkdiwgJGVOYW1lLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgJHVzZSIpOwoJCQkJCQkgICAgJHhtbCAuPSAkdGhpcy0+c2VyaWFsaXplX3ZhbCgkdiwgJGVOYW1lLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgJHVzZSk7CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCX0gCgkJfSBlbHNlIHsKCQkJJHRoaXMtPmRlYnVnKCJubyBlbGVtZW50cyB0byBzZXJpYWxpemUgZm9yIFhNTCBTY2hlbWEgdHlwZSAkbnM6JHVxVHlwZSIpOwoJCX0KCQlpZiAoaXNzZXQoJHR5cGVEZWZbJ2V4dGVuc2lvbkJhc2UnXSkpIHsKCQkJJG5zID0gJHRoaXMtPmdldFByZWZpeCgkdHlwZURlZlsnZXh0ZW5zaW9uQmFzZSddKTsKCQkJJHVxVHlwZSA9ICR0aGlzLT5nZXRMb2NhbFBhcnQoJHR5cGVEZWZbJ2V4dGVuc2lvbkJhc2UnXSk7CgkJCWlmICgkdGhpcy0+Z2V0TmFtZXNwYWNlRnJvbVByZWZpeCgkbnMpKSB7CgkJCQkkbnMgPSAkdGhpcy0+Z2V0TmFtZXNwYWNlRnJvbVByZWZpeCgkbnMpOwoJCQl9CgkJCWlmICgkdHlwZURlZiA9ICR0aGlzLT5nZXRUeXBlRGVmKCR1cVR5cGUsICRucykpIHsKCQkJCSR0aGlzLT5kZWJ1Zygic2VyaWFsaXplIGVsZW1lbnRzIGZvciBleHRlbnNpb24gYmFzZSAkbnM6JHVxVHlwZSIpOwoJCQkJJHhtbCAuPSAkdGhpcy0+c2VyaWFsaXplQ29tcGxleFR5cGVFbGVtZW50cygkdHlwZURlZiwgJHZhbHVlLCAkbnMsICR1cVR5cGUsICR1c2UsICRlbmNvZGluZ1N0eWxlKTsKCQkJfSBlbHNlIHsKCQkJCSR0aGlzLT5kZWJ1ZygiZXh0ZW5zaW9uIGJhc2UgJG5zOiR1cVR5cGUgaXMgbm90IGEgc3VwcG9ydGVkIHR5cGUiKTsKCQkJfQoJCX0KCQlyZXR1cm4gJHhtbDsKCX0KCgkvKioKCSogYWRkcyBhbiBYTUwgU2NoZW1hIGNvbXBsZXggdHlwZSB0byB0aGUgV1NETCB0eXBlcwoJKgoJKiBAcGFyYW0gc3RyaW5nCW5hbWUKCSogQHBhcmFtIHN0cmluZyB0eXBlQ2xhc3MgKGNvbXBsZXhUeXBlfHNpbXBsZVR5cGV8YXR0cmlidXRlKQoJKiBAcGFyYW0gc3RyaW5nIHBocFR5cGU6IGN1cnJlbnRseSBzdXBwb3J0ZWQgYXJlIGFycmF5IGFuZCBzdHJ1Y3QgKHBocCBhc3NvYyBhcnJheSkKCSogQHBhcmFtIHN0cmluZyBjb21wb3NpdG9yIChhbGx8c2VxdWVuY2V8Y2hvaWNlKQoJKiBAcGFyYW0gc3RyaW5nIHJlc3RyaWN0aW9uQmFzZSBuYW1lc3BhY2U6bmFtZSAoaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy86QXJyYXkpCgkqIEBwYXJhbSBhcnJheSBlbGVtZW50cyA9IGFycmF5ICggbmFtZSA9PiBhcnJheShuYW1lPT4nJyx0eXBlPT4nJykgKQoJKiBAcGFyYW0gYXJyYXkgYXR0cnMgPSAJYXJyYXkoYXJyYXkoJ3JlZic9PidTT0FQLUVOQzphcnJheVR5cGUnLCd3c2RsOmFycmF5VHlwZSc9Pid4c2Q6c3RyaW5nW10nKSkKCSogQHBhcmFtIHN0cmluZyBhcnJheVR5cGU6IG5hbWVzcGFjZTpuYW1lICh4c2Q6c3RyaW5nKQoJKiBAc2VlIHhtbHNjaGVtYQoJKiBAYWNjZXNzIHB1YmxpYwoJKi8KCWZ1bmN0aW9uIGFkZENvbXBsZXhUeXBlKCRuYW1lLCR0eXBlQ2xhc3M9J2NvbXBsZXhUeXBlJywkcGhwVHlwZT0nYXJyYXknLCRjb21wb3NpdG9yPScnLCRyZXN0cmljdGlvbkJhc2U9JycsJGVsZW1lbnRzPWFycmF5KCksJGF0dHJzPWFycmF5KCksJGFycmF5VHlwZT0nJykgewoJCWlmIChjb3VudCgkZWxlbWVudHMpID4gMCkgewoJICAgIAlmb3JlYWNoKCRlbGVtZW50cyBhcyAkbiA9PiAkZSl7CgkgICAgICAgICAgICAvLyBleHBhbmQgZWFjaCBlbGVtZW50CgkgICAgICAgICAgICBmb3JlYWNoICgkZSBhcyAkayA9PiAkdikgewoJCSAgICAgICAgICAgICRrID0gc3RycG9zKCRrLCc6JykgPyAkdGhpcy0+ZXhwYW5kUW5hbWUoJGspIDogJGs7CgkJICAgICAgICAgICAgJHYgPSBzdHJwb3MoJHYsJzonKSA/ICR0aGlzLT5leHBhbmRRbmFtZSgkdikgOiAkdjsKCQkgICAgICAgICAgICAkZWVbJGtdID0gJHY7CgkJICAgIAl9CgkgICAgCQkkZUVsZW1lbnRzWyRuXSA9ICRlZTsKCSAgICAJfQoJICAgIAkkZWxlbWVudHMgPSAkZUVsZW1lbnRzOwoJCX0KCQkKCQlpZiAoY291bnQoJGF0dHJzKSA+IDApIHsKCSAgICAJZm9yZWFjaCgkYXR0cnMgYXMgJG4gPT4gJGEpewoJICAgICAgICAgICAgLy8gZXhwYW5kIGVhY2ggYXR0cmlidXRlCgkgICAgICAgICAgICBmb3JlYWNoICgkYSBhcyAkayA9PiAkdikgewoJCSAgICAgICAgICAgICRrID0gc3RycG9zKCRrLCc6JykgPyAkdGhpcy0+ZXhwYW5kUW5hbWUoJGspIDogJGs7CgkJICAgICAgICAgICAgJHYgPSBzdHJwb3MoJHYsJzonKSA/ICR0aGlzLT5leHBhbmRRbmFtZSgkdikgOiAkdjsKCQkgICAgICAgICAgICAkYWFbJGtdID0gJHY7CgkJICAgIAl9CgkgICAgCQkkZUF0dHJzWyRuXSA9ICRhYTsKCSAgICAJfQoJICAgIAkkYXR0cnMgPSAkZUF0dHJzOwoJCX0KCgkJJHJlc3RyaWN0aW9uQmFzZSA9IHN0cnBvcygkcmVzdHJpY3Rpb25CYXNlLCc6JykgPyAkdGhpcy0+ZXhwYW5kUW5hbWUoJHJlc3RyaWN0aW9uQmFzZSkgOiAkcmVzdHJpY3Rpb25CYXNlOwoJCSRhcnJheVR5cGUgPSBzdHJwb3MoJGFycmF5VHlwZSwnOicpID8gJHRoaXMtPmV4cGFuZFFuYW1lKCRhcnJheVR5cGUpIDogJGFycmF5VHlwZTsKCgkJJHR5cGVucyA9IGlzc2V0KCR0aGlzLT5uYW1lc3BhY2VzWyd0eXBlcyddKSA/ICR0aGlzLT5uYW1lc3BhY2VzWyd0eXBlcyddIDogJHRoaXMtPm5hbWVzcGFjZXNbJ3RucyddOwoJCSR0aGlzLT5zY2hlbWFzWyR0eXBlbnNdWzBdLT5hZGRDb21wbGV4VHlwZSgkbmFtZSwkdHlwZUNsYXNzLCRwaHBUeXBlLCRjb21wb3NpdG9yLCRyZXN0cmljdGlvbkJhc2UsJGVsZW1lbnRzLCRhdHRycywkYXJyYXlUeXBlKTsKCX0KCgkvKioKCSogYWRkcyBhbiBYTUwgU2NoZW1hIHNpbXBsZSB0eXBlIHRvIHRoZSBXU0RMIHR5cGVzCgkqCgkqIEBwYXJhbSBzdHJpbmcgJG5hbWUKCSogQHBhcmFtIHN0cmluZyAkcmVzdHJpY3Rpb25CYXNlIG5hbWVzcGFjZTpuYW1lIChodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLzpBcnJheSkKCSogQHBhcmFtIHN0cmluZyAkdHlwZUNsYXNzIChzaG91bGQgYWx3YXlzIGJlIHNpbXBsZVR5cGUpCgkqIEBwYXJhbSBzdHJpbmcgJHBocFR5cGUgKHNob3VsZCBhbHdheXMgYmUgc2NhbGFyKQoJKiBAcGFyYW0gYXJyYXkgJGVudW1lcmF0aW9uIGFycmF5IG9mIHZhbHVlcwoJKiBAc2VlIHhtbHNjaGVtYQoJKiBAYWNjZXNzIHB1YmxpYwoJKi8KCWZ1bmN0aW9uIGFkZFNpbXBsZVR5cGUoJG5hbWUsICRyZXN0cmljdGlvbkJhc2U9JycsICR0eXBlQ2xhc3M9J3NpbXBsZVR5cGUnLCAkcGhwVHlwZT0nc2NhbGFyJywgJGVudW1lcmF0aW9uPWFycmF5KCkpIHsKCQkkcmVzdHJpY3Rpb25CYXNlID0gc3RycG9zKCRyZXN0cmljdGlvbkJhc2UsJzonKSA/ICR0aGlzLT5leHBhbmRRbmFtZSgkcmVzdHJpY3Rpb25CYXNlKSA6ICRyZXN0cmljdGlvbkJhc2U7CgoJCSR0eXBlbnMgPSBpc3NldCgkdGhpcy0+bmFtZXNwYWNlc1sndHlwZXMnXSkgPyAkdGhpcy0+bmFtZXNwYWNlc1sndHlwZXMnXSA6ICR0aGlzLT5uYW1lc3BhY2VzWyd0bnMnXTsKCQkkdGhpcy0+c2NoZW1hc1skdHlwZW5zXVswXS0+YWRkU2ltcGxlVHlwZSgkbmFtZSwgJHJlc3RyaWN0aW9uQmFzZSwgJHR5cGVDbGFzcywgJHBocFR5cGUsICRlbnVtZXJhdGlvbik7Cgl9CgoJLyoqCgkqIGFkZHMgYW4gZWxlbWVudCB0byB0aGUgV1NETCB0eXBlcwoJKgoJKiBAcGFyYW0gYXJyYXkgJGF0dHJzIGF0dHJpYnV0ZXMgdGhhdCBtdXN0IGluY2x1ZGUgbmFtZSBhbmQgdHlwZQoJKiBAc2VlIHhtbHNjaGVtYQoJKiBAYWNjZXNzIHB1YmxpYwoJKi8KCWZ1bmN0aW9uIGFkZEVsZW1lbnQoJGF0dHJzKSB7CgkJJHR5cGVucyA9IGlzc2V0KCR0aGlzLT5uYW1lc3BhY2VzWyd0eXBlcyddKSA/ICR0aGlzLT5uYW1lc3BhY2VzWyd0eXBlcyddIDogJHRoaXMtPm5hbWVzcGFjZXNbJ3RucyddOwoJCSR0aGlzLT5zY2hlbWFzWyR0eXBlbnNdWzBdLT5hZGRFbGVtZW50KCRhdHRycyk7Cgl9CgoJLyoqCgkqIHJlZ2lzdGVyIGFuIG9wZXJhdGlvbiB3aXRoIHRoZSBzZXJ2ZXIKCSogCgkqIEBwYXJhbSBzdHJpbmcgJG5hbWUgb3BlcmF0aW9uIChtZXRob2QpIG5hbWUKCSogQHBhcmFtIGFycmF5ICRpbiBhc3NvYyBhcnJheSBvZiBpbnB1dCB2YWx1ZXM6IGtleSA9IHBhcmFtIG5hbWUsIHZhbHVlID0gcGFyYW0gdHlwZQoJKiBAcGFyYW0gYXJyYXkgJG91dCBhc3NvYyBhcnJheSBvZiBvdXRwdXQgdmFsdWVzOiBrZXkgPSBwYXJhbSBuYW1lLCB2YWx1ZSA9IHBhcmFtIHR5cGUKCSogQHBhcmFtIHN0cmluZyAkbmFtZXNwYWNlIG9wdGlvbmFsIFRoZSBuYW1lc3BhY2UgZm9yIHRoZSBvcGVyYXRpb24KCSogQHBhcmFtIHN0cmluZyAkc29hcGFjdGlvbiBvcHRpb25hbCBUaGUgc29hcGFjdGlvbiBmb3IgdGhlIG9wZXJhdGlvbgoJKiBAcGFyYW0gc3RyaW5nICRzdHlsZSAocnBjfGRvY3VtZW50KSBvcHRpb25hbCBUaGUgc3R5bGUgZm9yIHRoZSBvcGVyYXRpb24gTm90ZTogd2hlbiAnZG9jdW1lbnQnIGlzIHNwZWNpZmllZCwgcGFyYW1ldGVyIGFuZCByZXR1cm4gd3JhcHBlcnMgYXJlIGNyZWF0ZWQgZm9yIHlvdSBhdXRvbWF0aWNhbGx5CgkqIEBwYXJhbSBzdHJpbmcgJHVzZSAoZW5jb2RlZHxsaXRlcmFsKSBvcHRpb25hbCBUaGUgdXNlIGZvciB0aGUgcGFyYW1ldGVycyAoY2Fubm90IG1peCByaWdodCBub3cpCgkqIEBwYXJhbSBzdHJpbmcgJGRvY3VtZW50YXRpb24gb3B0aW9uYWwgVGhlIGRlc2NyaXB0aW9uIHRvIGluY2x1ZGUgaW4gdGhlIFdTREwKCSogQHBhcmFtIHN0cmluZyAkZW5jb2RpbmdTdHlsZSBvcHRpb25hbCAodXN1YWxseSAnaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8nIGZvciBlbmNvZGVkKQoJKiBAYWNjZXNzIHB1YmxpYyAKCSovCglmdW5jdGlvbiBhZGRPcGVyYXRpb24oJG5hbWUsICRpbiA9IGZhbHNlLCAkb3V0ID0gZmFsc2UsICRuYW1lc3BhY2UgPSBmYWxzZSwgJHNvYXBhY3Rpb24gPSBmYWxzZSwgJHN0eWxlID0gJ3JwYycsICR1c2UgPSAnZW5jb2RlZCcsICRkb2N1bWVudGF0aW9uID0gJycsICRlbmNvZGluZ1N0eWxlID0gJycpewoJCWlmICgkdXNlID09ICdlbmNvZGVkJyAmJiAkZW5jb2RpbmdTdHlsZSA9PSAnJykgewoJCQkkZW5jb2RpbmdTdHlsZSA9ICdodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyc7CgkJfQoKCQlpZiAoJHN0eWxlID09ICdkb2N1bWVudCcpIHsKCQkJJGVsZW1lbnRzID0gYXJyYXkoKTsKCQkJZm9yZWFjaCAoJGluIGFzICRuID0+ICR0KSB7CgkJCQkkZWxlbWVudHNbJG5dID0gYXJyYXkoJ25hbWUnID0+ICRuLCAndHlwZScgPT4gJHQpOwoJCQl9CgkJCSR0aGlzLT5hZGRDb21wbGV4VHlwZSgkbmFtZSAuICdSZXF1ZXN0VHlwZScsICdjb21wbGV4VHlwZScsICdzdHJ1Y3QnLCAnYWxsJywgJycsICRlbGVtZW50cyk7CgkJCSR0aGlzLT5hZGRFbGVtZW50KGFycmF5KCduYW1lJyA9PiAkbmFtZSwgJ3R5cGUnID0+ICRuYW1lIC4gJ1JlcXVlc3RUeXBlJykpOwoJCQkkaW4gPSBhcnJheSgncGFyYW1ldGVycycgPT4gJ3RuczonIC4gJG5hbWUpOwoKCQkJJGVsZW1lbnRzID0gYXJyYXkoKTsKCQkJZm9yZWFjaCAoJG91dCBhcyAkbiA9PiAkdCkgewoJCQkJJGVsZW1lbnRzWyRuXSA9IGFycmF5KCduYW1lJyA9PiAkbiwgJ3R5cGUnID0+ICR0KTsKCQkJfQoJCQkkdGhpcy0+YWRkQ29tcGxleFR5cGUoJG5hbWUgLiAnUmVzcG9uc2VUeXBlJywgJ2NvbXBsZXhUeXBlJywgJ3N0cnVjdCcsICdhbGwnLCAnJywgJGVsZW1lbnRzKTsKCQkJJHRoaXMtPmFkZEVsZW1lbnQoYXJyYXkoJ25hbWUnID0+ICRuYW1lIC4gJ1Jlc3BvbnNlJywgJ3R5cGUnID0+ICRuYW1lIC4gJ1Jlc3BvbnNlVHlwZScpKTsKCQkJJG91dCA9IGFycmF5KCdwYXJhbWV0ZXJzJyA9PiAndG5zOicgLiAkbmFtZSAuICdSZXNwb25zZScpOwoJCX0KCgkJLy8gZ2V0IGJpbmRpbmcKCQkkdGhpcy0+YmluZGluZ3NbICR0aGlzLT5zZXJ2aWNlTmFtZSAuICdCaW5kaW5nJyBdWydvcGVyYXRpb25zJ11bJG5hbWVdID0KCQlhcnJheSgKCQknbmFtZScgPT4gJG5hbWUsCgkJJ2JpbmRpbmcnID0+ICR0aGlzLT5zZXJ2aWNlTmFtZSAuICdCaW5kaW5nJywKCQknZW5kcG9pbnQnID0+ICR0aGlzLT5lbmRwb2ludCwKCQknc29hcEFjdGlvbicgPT4gJHNvYXBhY3Rpb24sCgkJJ3N0eWxlJyA9PiAkc3R5bGUsCgkJJ2lucHV0JyA9PiBhcnJheSgKCQkJJ3VzZScgPT4gJHVzZSwKCQkJJ25hbWVzcGFjZScgPT4gJG5hbWVzcGFjZSwKCQkJJ2VuY29kaW5nU3R5bGUnID0+ICRlbmNvZGluZ1N0eWxlLAoJCQknbWVzc2FnZScgPT4gJG5hbWUgLiAnUmVxdWVzdCcsCgkJCSdwYXJ0cycgPT4gJGluKSwKCQknb3V0cHV0JyA9PiBhcnJheSgKCQkJJ3VzZScgPT4gJHVzZSwKCQkJJ25hbWVzcGFjZScgPT4gJG5hbWVzcGFjZSwKCQkJJ2VuY29kaW5nU3R5bGUnID0+ICRlbmNvZGluZ1N0eWxlLAoJCQknbWVzc2FnZScgPT4gJG5hbWUgLiAnUmVzcG9uc2UnLAoJCQkncGFydHMnID0+ICRvdXQpLAoJCSduYW1lc3BhY2UnID0+ICRuYW1lc3BhY2UsCgkJJ3RyYW5zcG9ydCcgPT4gJ2h0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCcsCgkJJ2RvY3VtZW50YXRpb24nID0+ICRkb2N1bWVudGF0aW9uKTsgCgkJLy8gYWRkIHBvcnRUeXBlcwoJCS8vIGFkZCBtZXNzYWdlcwoJCWlmKCRpbikKCQl7CgkJCWZvcmVhY2goJGluIGFzICRwTmFtZSA9PiAkcFR5cGUpCgkJCXsKCQkJCWlmKHN0cnBvcygkcFR5cGUsJzonKSkgewoJCQkJCSRwVHlwZSA9ICR0aGlzLT5nZXROYW1lc3BhY2VGcm9tUHJlZml4KCR0aGlzLT5nZXRQcmVmaXgoJHBUeXBlKSkuIjoiLiR0aGlzLT5nZXRMb2NhbFBhcnQoJHBUeXBlKTsKCQkJCX0KCQkJCSR0aGlzLT5tZXNzYWdlc1skbmFtZS4nUmVxdWVzdCddWyRwTmFtZV0gPSAkcFR5cGU7CgkJCX0KCQl9IGVsc2UgewogICAgICAgICAgICAkdGhpcy0+bWVzc2FnZXNbJG5hbWUuJ1JlcXVlc3QnXT0gJzAnOwogICAgICAgIH0KCQlpZigkb3V0KQoJCXsKCQkJZm9yZWFjaCgkb3V0IGFzICRwTmFtZSA9PiAkcFR5cGUpCgkJCXsKCQkJCWlmKHN0cnBvcygkcFR5cGUsJzonKSkgewoJCQkJCSRwVHlwZSA9ICR0aGlzLT5nZXROYW1lc3BhY2VGcm9tUHJlZml4KCR0aGlzLT5nZXRQcmVmaXgoJHBUeXBlKSkuIjoiLiR0aGlzLT5nZXRMb2NhbFBhcnQoJHBUeXBlKTsKCQkJCX0KCQkJCSR0aGlzLT5tZXNzYWdlc1skbmFtZS4nUmVzcG9uc2UnXVskcE5hbWVdID0gJHBUeXBlOwoJCQl9CgkJfSBlbHNlIHsKICAgICAgICAgICAgJHRoaXMtPm1lc3NhZ2VzWyRuYW1lLidSZXNwb25zZSddPSAnMCc7CiAgICAgICAgfQoJCXJldHVybiB0cnVlOwoJfSAKfQo/Pjw/cGhwCgoKCi8qKgoqCiogc29hcF9wYXJzZXIgY2xhc3MgcGFyc2VzIFNPQVAgWE1MIG1lc3NhZ2VzIGludG8gbmF0aXZlIFBIUCB2YWx1ZXMKKgoqIEBhdXRob3IgICBEaWV0cmljaCBBeWFsYSA8ZGlldHJpY2hAZ2FueDQuY29tPgoqIEB2ZXJzaW9uICAkSWQ6IG51c29hcC5waHAsdiAxLjk0IDIwMDUvMDgvMDQgMDE6Mjc6NDIgc25pY2hvbCBFeHAgJAoqIEBhY2Nlc3MgICBwdWJsaWMKKi8KY2xhc3Mgc29hcF9wYXJzZXIgZXh0ZW5kcyBudXNvYXBfYmFzZSB7CgoJdmFyICR4bWwgPSAnJzsKCXZhciAkeG1sX2VuY29kaW5nID0gJyc7Cgl2YXIgJG1ldGhvZCA9ICcnOwoJdmFyICRyb290X3N0cnVjdCA9ICcnOwoJdmFyICRyb290X3N0cnVjdF9uYW1lID0gJyc7Cgl2YXIgJHJvb3Rfc3RydWN0X25hbWVzcGFjZSA9ICcnOwoJdmFyICRyb290X2hlYWRlciA9ICcnOwogICAgdmFyICRkb2N1bWVudCA9ICcnOwkJCS8vIGluY29taW5nIFNPQVAgYm9keSAodGV4dCkKCS8vIGRldGVybWluZXMgd2hlcmUgaW4gdGhlIG1lc3NhZ2Ugd2UgYXJlIChlbnZlbG9wZSxoZWFkZXIsYm9keSxtZXRob2QpCgl2YXIgJHN0YXR1cyA9ICcnOwoJdmFyICRwb3NpdGlvbiA9IDA7Cgl2YXIgJGRlcHRoID0gMDsKCXZhciAkZGVmYXVsdF9uYW1lc3BhY2UgPSAnJzsKCXZhciAkbmFtZXNwYWNlcyA9IGFycmF5KCk7Cgl2YXIgJG1lc3NhZ2UgPSBhcnJheSgpOwogICAgdmFyICRwYXJlbnQgPSAnJzsKCXZhciAkZmF1bHQgPSBmYWxzZTsKCXZhciAkZmF1bHRfY29kZSA9ICcnOwoJdmFyICRmYXVsdF9zdHIgPSAnJzsKCXZhciAkZmF1bHRfZGV0YWlsID0gJyc7Cgl2YXIgJGRlcHRoX2FycmF5ID0gYXJyYXkoKTsKCXZhciAkZGVidWdfZmxhZyA9IHRydWU7Cgl2YXIgJHNvYXByZXNwb25zZSA9IE5VTEw7Cgl2YXIgJHJlc3BvbnNlSGVhZGVycyA9ICcnOwkvLyBpbmNvbWluZyBTT0FQIGhlYWRlcnMgKHRleHQpCgl2YXIgJGJvZHlfcG9zaXRpb24gPSAwOwoJLy8gZm9yIG11bHRpcmVmIHBhcnNpbmc6CgkvLyBhcnJheSBvZiBpZCA9PiBwb3MKCXZhciAkaWRzID0gYXJyYXkoKTsKCS8vIGFycmF5IG9mIGlkID0+IGhyZWZzID0+IHBvcwoJdmFyICRtdWx0aXJlZnMgPSBhcnJheSgpOwoJLy8gdG9nZ2xlIGZvciBhdXRvLWRlY29kaW5nIGVsZW1lbnQgY29udGVudAoJdmFyICRkZWNvZGVfdXRmOCA9IHRydWU7CgoJLyoqCgkqIGNvbnN0cnVjdG9yIHRoYXQgYWN0dWFsbHkgZG9lcyB0aGUgcGFyc2luZwoJKgoJKiBAcGFyYW0gICAgc3RyaW5nICR4bWwgU09BUCBtZXNzYWdlCgkqIEBwYXJhbSAgICBzdHJpbmcgJGVuY29kaW5nIGNoYXJhY3RlciBlbmNvZGluZyBzY2hlbWUgb2YgbWVzc2FnZQoJKiBAcGFyYW0gICAgc3RyaW5nICRtZXRob2QgbWV0aG9kIGZvciB3aGljaCBYTUwgaXMgcGFyc2VkICh1bnVzZWQ/KQoJKiBAcGFyYW0gICAgc3RyaW5nICRkZWNvZGVfdXRmOCB3aGV0aGVyIHRvIGRlY29kZSBVVEYtOCB0byBJU08tODg1OS0xCgkqIEBhY2Nlc3MgICBwdWJsaWMKCSovCglmdW5jdGlvbiBzb2FwX3BhcnNlcigkeG1sLCRlbmNvZGluZz0nVVRGLTgnLCRtZXRob2Q9JycsJGRlY29kZV91dGY4PXRydWUpewoJCXBhcmVudDo6bnVzb2FwX2Jhc2UoKTsKCQkkdGhpcy0+eG1sID0gJHhtbDsKCQkkdGhpcy0+eG1sX2VuY29kaW5nID0gJGVuY29kaW5nOwoJCSR0aGlzLT5tZXRob2QgPSAkbWV0aG9kOwoJCSR0aGlzLT5kZWNvZGVfdXRmOCA9ICRkZWNvZGVfdXRmODsKCgkJLy8gQ2hlY2sgd2hldGhlciBjb250ZW50IGhhcyBiZWVuIHJlYWQuCgkJaWYoIWVtcHR5KCR4bWwpKXsKCQkJLy8gQ2hlY2sgWE1MIGVuY29kaW5nCgkJCSRwb3NfeG1sID0gc3RycG9zKCR4bWwsICc8P3htbCcpOwoJCQlpZiAoJHBvc194bWwgIT09IEZBTFNFKSB7CgkJCQkkeG1sX2RlY2wgPSBzdWJzdHIoJHhtbCwgJHBvc194bWwsIHN0cnBvcygkeG1sLCAnPz4nLCAkcG9zX3htbCArIDIpIC0gJHBvc194bWwgKyAxKTsKCQkJCWlmIChwcmVnX21hdGNoKCIvZW5jb2Rpbmc9W1wiJ10oW15cIiddKilbXCInXS8iLCAkeG1sX2RlY2wsICRyZXMpKSB7CgkJCQkJJHhtbF9lbmNvZGluZyA9ICRyZXNbMV07CgkJCQkJaWYgKHN0cnRvdXBwZXIoJHhtbF9lbmNvZGluZykgIT0gJGVuY29kaW5nKSB7CgkJCQkJCSRlcnIgPSAiQ2hhcnNldCBmcm9tIEhUVFAgQ29udGVudC1UeXBlICciIC4gJGVuY29kaW5nIC4gIicgZG9lcyBub3QgbWF0Y2ggZW5jb2RpbmcgZnJvbSBYTUwgZGVjbGFyYXRpb24gJyIgLiAkeG1sX2VuY29kaW5nIC4gIiciOwoJCQkJCQkkdGhpcy0+ZGVidWcoJGVycik7CgkJCQkJCWlmICgkZW5jb2RpbmcgIT0gJ0lTTy04ODU5LTEnIHx8IHN0cnRvdXBwZXIoJHhtbF9lbmNvZGluZykgIT0gJ1VURi04JykgewoJCQkJCQkJJHRoaXMtPnNldEVycm9yKCRlcnIpOwoJCQkJCQkJcmV0dXJuOwoJCQkJCQl9CgkJCQkJCS8vIHdoZW4gSFRUUCBzYXlzIElTTy04ODU5LTEgKHRoZSBkZWZhdWx0KSBhbmQgWE1MIHNheXMgVVRGLTggKHRoZSB0eXBpY2FsKSwgYXNzdW1lIHRoZSBvdGhlciBlbmRwb2ludCBpcyBqdXN0IHNsb3BweSBhbmQgcHJvY2VlZAoJCQkJCX0gZWxzZSB7CgkJCQkJCSR0aGlzLT5kZWJ1ZygnQ2hhcnNldCBmcm9tIEhUVFAgQ29udGVudC1UeXBlIG1hdGNoZXMgZW5jb2RpbmcgZnJvbSBYTUwgZGVjbGFyYXRpb24nKTsKCQkJCQl9CgkJCQl9IGVsc2UgewoJCQkJCSR0aGlzLT5kZWJ1ZygnTm8gZW5jb2Rpbmcgc3BlY2lmaWVkIGluIFhNTCBkZWNsYXJhdGlvbicpOwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJJHRoaXMtPmRlYnVnKCdObyBYTUwgZGVjbGFyYXRpb24nKTsKCQkJfQoJCQkkdGhpcy0+ZGVidWcoJ0VudGVyaW5nIHNvYXBfcGFyc2VyKCksIGxlbmd0aD0nLnN0cmxlbigkeG1sKS4nLCBlbmNvZGluZz0nLiRlbmNvZGluZyk7CgkJCS8vIENyZWF0ZSBhbiBYTUwgcGFyc2VyIC0gd2h5IG5vdCB4bWxfcGFyc2VyX2NyZWF0ZV9ucz8KCQkJJHRoaXMtPnBhcnNlciA9IHhtbF9wYXJzZXJfY3JlYXRlKCR0aGlzLT54bWxfZW5jb2RpbmcpOwoJCQkvLyBTZXQgdGhlIG9wdGlvbnMgZm9yIHBhcnNpbmcgdGhlIFhNTCBkYXRhLgoJCQkvL3htbF9wYXJzZXJfc2V0X29wdGlvbigkcGFyc2VyLCBYTUxfT1BUSU9OX1NLSVBfV0hJVEUsIDEpOwoJCQl4bWxfcGFyc2VyX3NldF9vcHRpb24oJHRoaXMtPnBhcnNlciwgWE1MX09QVElPTl9DQVNFX0ZPTERJTkcsIDApOwoJCQl4bWxfcGFyc2VyX3NldF9vcHRpb24oJHRoaXMtPnBhcnNlciwgWE1MX09QVElPTl9UQVJHRVRfRU5DT0RJTkcsICR0aGlzLT54bWxfZW5jb2RpbmcpOwoJCQkvLyBTZXQgdGhlIG9iamVjdCBmb3IgdGhlIHBhcnNlci4KCQkJeG1sX3NldF9vYmplY3QoJHRoaXMtPnBhcnNlciwgJHRoaXMpOwoJCQkvLyBTZXQgdGhlIGVsZW1lbnQgaGFuZGxlcnMgZm9yIHRoZSBwYXJzZXIuCgkJCXhtbF9zZXRfZWxlbWVudF9oYW5kbGVyKCR0aGlzLT5wYXJzZXIsICdzdGFydF9lbGVtZW50JywnZW5kX2VsZW1lbnQnKTsKCQkJeG1sX3NldF9jaGFyYWN0ZXJfZGF0YV9oYW5kbGVyKCR0aGlzLT5wYXJzZXIsJ2NoYXJhY3Rlcl9kYXRhJyk7CgoJCQkvLyBQYXJzZSB0aGUgWE1MIGZpbGUuCgkJCWlmKCF4bWxfcGFyc2UoJHRoaXMtPnBhcnNlciwkeG1sLHRydWUpKXsKCQkJICAgIC8vIERpc3BsYXkgYW4gZXJyb3IgbWVzc2FnZS4KCQkJICAgICRlcnIgPSBzcHJpbnRmKCdYTUwgZXJyb3IgcGFyc2luZyBTT0FQIHBheWxvYWQgb24gbGluZSAlZDogJXMnLAoJCQkgICAgeG1sX2dldF9jdXJyZW50X2xpbmVfbnVtYmVyKCR0aGlzLT5wYXJzZXIpLAoJCQkgICAgeG1sX2Vycm9yX3N0cmluZyh4bWxfZ2V0X2Vycm9yX2NvZGUoJHRoaXMtPnBhcnNlcikpKTsKCQkJCSR0aGlzLT5kZWJ1ZygkZXJyKTsKCQkJCSR0aGlzLT5kZWJ1ZygiWE1MIHBheWxvYWQ6XG4iIC4gJHhtbCk7CgkJCQkkdGhpcy0+c2V0RXJyb3IoJGVycik7CgkJCX0gZWxzZSB7CgkJCQkkdGhpcy0+ZGVidWcoJ3BhcnNlZCBzdWNjZXNzZnVsbHksIGZvdW5kIHJvb3Qgc3RydWN0OiAnLiR0aGlzLT5yb290X3N0cnVjdC4nIG9mIG5hbWUgJy4kdGhpcy0+cm9vdF9zdHJ1Y3RfbmFtZSk7CgkJCQkvLyBnZXQgZmluYWwgdmFsdWUKCQkJCSR0aGlzLT5zb2FwcmVzcG9uc2UgPSAkdGhpcy0+bWVzc2FnZVskdGhpcy0+cm9vdF9zdHJ1Y3RdWydyZXN1bHQnXTsKCQkJCS8vIGdldCBoZWFkZXIgdmFsdWU6IG5vLCBiZWNhdXNlIHRoaXMgaXMgZG9jdW1lbnRlZCBhcyBYTUwgc3RyaW5nCi8vCQkJCWlmKCR0aGlzLT5yb290X2hlYWRlciAhPSAnJyAmJiBpc3NldCgkdGhpcy0+bWVzc2FnZVskdGhpcy0+cm9vdF9oZWFkZXJdWydyZXN1bHQnXSkpewovLwkJCQkJJHRoaXMtPnJlc3BvbnNlSGVhZGVycyA9ICR0aGlzLT5tZXNzYWdlWyR0aGlzLT5yb290X2hlYWRlcl1bJ3Jlc3VsdCddOwovLwkJCQl9CgkJCQkvLyByZXNvbHZlIGhyZWZzL2lkcwoJCQkJaWYoc2l6ZW9mKCR0aGlzLT5tdWx0aXJlZnMpID4gMCl7CgkJCQkJZm9yZWFjaCgkdGhpcy0+bXVsdGlyZWZzIGFzICRpZCA9PiAkaHJlZnMpewoJCQkJCQkkdGhpcy0+ZGVidWcoJ3Jlc29sdmluZyBtdWx0aXJlZnMgZm9yIGlkOiAnLiRpZCk7CgkJCQkJCSRpZFZhbCA9ICR0aGlzLT5idWlsZFZhbCgkdGhpcy0+aWRzWyRpZF0pOwoJCQkJCQlpZiAoaXNfYXJyYXkoJGlkVmFsKSAmJiBpc3NldCgkaWRWYWxbJyFpZCddKSkgewoJCQkJCQkJdW5zZXQoJGlkVmFsWychaWQnXSk7CgkJCQkJCX0KCQkJCQkJZm9yZWFjaCgkaHJlZnMgYXMgJHJlZlBvcyA9PiAkcmVmKXsKCQkJCQkJCSR0aGlzLT5kZWJ1ZygncmVzb2x2aW5nIGhyZWYgYXQgcG9zICcuJHJlZlBvcyk7CgkJCQkJCQkkdGhpcy0+bXVsdGlyZWZzWyRpZF1bJHJlZlBvc10gPSAkaWRWYWw7CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCX0KCQkJeG1sX3BhcnNlcl9mcmVlKCR0aGlzLT5wYXJzZXIpOwoJCX0gZWxzZSB7CgkJCSR0aGlzLT5kZWJ1ZygneG1sIHdhcyBlbXB0eSwgZGlkblwndCBwYXJzZSEnKTsKCQkJJHRoaXMtPnNldEVycm9yKCd4bWwgd2FzIGVtcHR5LCBkaWRuXCd0IHBhcnNlIScpOwoJCX0KCX0KCgkvKioKCSogc3RhcnQtZWxlbWVudCBoYW5kbGVyCgkqCgkqIEBwYXJhbSAgICByZXNvdXJjZSAkcGFyc2VyIFhNTCBwYXJzZXIgb2JqZWN0CgkqIEBwYXJhbSAgICBzdHJpbmcgJG5hbWUgZWxlbWVudCBuYW1lCgkqIEBwYXJhbSAgICBhcnJheSAkYXR0cnMgYXNzb2NpYXRpdmUgYXJyYXkgb2YgYXR0cmlidXRlcwoJKiBAYWNjZXNzICAgcHJpdmF0ZQoJKi8KCWZ1bmN0aW9uIHN0YXJ0X2VsZW1lbnQoJHBhcnNlciwgJG5hbWUsICRhdHRycykgewoJCS8vIHBvc2l0aW9uIGluIGEgdG90YWwgbnVtYmVyIG9mIGVsZW1lbnRzLCBzdGFydGluZyBmcm9tIDAKCQkvLyB1cGRhdGUgY2xhc3MgbGV2ZWwgcG9zCgkJJHBvcyA9ICR0aGlzLT5wb3NpdGlvbisrOwoJCS8vIGFuZCBzZXQgbWluZQoJCSR0aGlzLT5tZXNzYWdlWyRwb3NdID0gYXJyYXkoJ3BvcycgPT4gJHBvcywnY2hpbGRyZW4nPT4nJywnY2RhdGEnPT4nJyk7CgkJLy8gZGVwdGggPSBob3cgbWFueSBsZXZlbHMgcmVtb3ZlZCBmcm9tIHJvb3Q/CgkJLy8gc2V0IG1pbmUgYXMgY3VycmVudCBnbG9iYWwgZGVwdGggYW5kIGluY3JlbWVudCBnbG9iYWwgZGVwdGggdmFsdWUKCQkkdGhpcy0+bWVzc2FnZVskcG9zXVsnZGVwdGgnXSA9ICR0aGlzLT5kZXB0aCsrOwoKCQkvLyBlbHNlIGFkZCBzZWxmIGFzIGNoaWxkIHRvIHdob2V2ZXIgdGhlIGN1cnJlbnQgcGFyZW50IGlzCgkJaWYoJHBvcyAhPSAwKXsKCQkJJHRoaXMtPm1lc3NhZ2VbJHRoaXMtPnBhcmVudF1bJ2NoaWxkcmVuJ10gLj0gJ3wnLiRwb3M7CgkJfQoJCS8vIHNldCBteSBwYXJlbnQKCQkkdGhpcy0+bWVzc2FnZVskcG9zXVsncGFyZW50J10gPSAkdGhpcy0+cGFyZW50OwoJCS8vIHNldCBzZWxmIGFzIGN1cnJlbnQgcGFyZW50CgkJJHRoaXMtPnBhcmVudCA9ICRwb3M7CgkJLy8gc2V0IHNlbGYgYXMgY3VycmVudCB2YWx1ZSBmb3IgdGhpcyBkZXB0aAoJCSR0aGlzLT5kZXB0aF9hcnJheVskdGhpcy0+ZGVwdGhdID0gJHBvczsKCQkvLyBnZXQgZWxlbWVudCBwcmVmaXgKCQlpZihzdHJwb3MoJG5hbWUsJzonKSl7CgkJCS8vIGdldCBucyBwcmVmaXgKCQkJJHByZWZpeCA9IHN1YnN0cigkbmFtZSwwLHN0cnBvcygkbmFtZSwnOicpKTsKCQkJLy8gZ2V0IHVucXVhbGlmaWVkIG5hbWUKCQkJJG5hbWUgPSBzdWJzdHIoc3Ryc3RyKCRuYW1lLCc6JyksMSk7CgkJfQoJCS8vIHNldCBzdGF0dXMKCQlpZigkbmFtZSA9PSAnRW52ZWxvcGUnKXsKCQkJJHRoaXMtPnN0YXR1cyA9ICdlbnZlbG9wZSc7CgkJfSBlbHNlaWYoJG5hbWUgPT0gJ0hlYWRlcicpewoJCQkkdGhpcy0+cm9vdF9oZWFkZXIgPSAkcG9zOwoJCQkkdGhpcy0+c3RhdHVzID0gJ2hlYWRlcic7CgkJfSBlbHNlaWYoJG5hbWUgPT0gJ0JvZHknKXsKCQkJJHRoaXMtPnN0YXR1cyA9ICdib2R5JzsKCQkJJHRoaXMtPmJvZHlfcG9zaXRpb24gPSAkcG9zOwoJCS8vIHNldCBtZXRob2QKCQl9IGVsc2VpZigkdGhpcy0+c3RhdHVzID09ICdib2R5JyAmJiAkcG9zID09ICgkdGhpcy0+Ym9keV9wb3NpdGlvbisxKSl7CgkJCSR0aGlzLT5zdGF0dXMgPSAnbWV0aG9kJzsKCQkJJHRoaXMtPnJvb3Rfc3RydWN0X25hbWUgPSAkbmFtZTsKCQkJJHRoaXMtPnJvb3Rfc3RydWN0ID0gJHBvczsKCQkJJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ3R5cGUnXSA9ICdzdHJ1Y3QnOwoJCQkkdGhpcy0+ZGVidWcoImZvdW5kIHJvb3Qgc3RydWN0ICR0aGlzLT5yb290X3N0cnVjdF9uYW1lLCBwb3MgJHRoaXMtPnJvb3Rfc3RydWN0Iik7CgkJfQoJCS8vIHNldCBteSBzdGF0dXMKCQkkdGhpcy0+bWVzc2FnZVskcG9zXVsnc3RhdHVzJ10gPSAkdGhpcy0+c3RhdHVzOwoJCS8vIHNldCBuYW1lCgkJJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ25hbWUnXSA9IGh0bWxzcGVjaWFsY2hhcnMoJG5hbWUpOwoJCS8vIHNldCBhdHRycwoJCSR0aGlzLT5tZXNzYWdlWyRwb3NdWydhdHRycyddID0gJGF0dHJzOwoKCQkvLyBsb29wIHRocm91Z2ggYXR0cywgbG9nZ2luZyBucyBhbmQgdHlwZSBkZWNsYXJhdGlvbnMKICAgICAgICAkYXR0c3RyID0gJyc7CgkJZm9yZWFjaCgkYXR0cnMgYXMgJGtleSA9PiAkdmFsdWUpewogICAgICAgIAkka2V5X3ByZWZpeCA9ICR0aGlzLT5nZXRQcmVmaXgoJGtleSk7CgkJCSRrZXlfbG9jYWxwYXJ0ID0gJHRoaXMtPmdldExvY2FsUGFydCgka2V5KTsKCQkJLy8gaWYgbnMgZGVjbGFyYXRpb25zLCBhZGQgdG8gY2xhc3MgbGV2ZWwgYXJyYXkgb2YgdmFsaWQgbmFtZXNwYWNlcwogICAgICAgICAgICBpZigka2V5X3ByZWZpeCA9PSAneG1sbnMnKXsKCQkJCWlmKGVyZWcoJ15odHRwOi8vd3d3LnczLm9yZy9bMC05XXs0fS9YTUxTY2hlbWEkJywkdmFsdWUpKXsKCQkJCQkkdGhpcy0+WE1MU2NoZW1hVmVyc2lvbiA9ICR2YWx1ZTsKCQkJCQkkdGhpcy0+bmFtZXNwYWNlc1sneHNkJ10gPSAkdGhpcy0+WE1MU2NoZW1hVmVyc2lvbjsKCQkJCQkkdGhpcy0+bmFtZXNwYWNlc1sneHNpJ10gPSAkdGhpcy0+WE1MU2NoZW1hVmVyc2lvbi4nLWluc3RhbmNlJzsKCQkJCX0KICAgICAgICAgICAgICAgICR0aGlzLT5uYW1lc3BhY2VzWyRrZXlfbG9jYWxwYXJ0XSA9ICR2YWx1ZTsKCQkJCS8vIHNldCBtZXRob2QgbmFtZXNwYWNlCgkJCQlpZigkbmFtZSA9PSAkdGhpcy0+cm9vdF9zdHJ1Y3RfbmFtZSl7CgkJCQkJJHRoaXMtPm1ldGhvZE5hbWVzcGFjZSA9ICR2YWx1ZTsKCQkJCX0KCQkJLy8gaWYgaXQncyBhIHR5cGUgZGVjbGFyYXRpb24sIHNldCB0eXBlCiAgICAgICAgICAgIH0gZWxzZWlmKCRrZXlfbG9jYWxwYXJ0ID09ICd0eXBlJyl7CiAgICAgICAgICAgIAkkdmFsdWVfcHJlZml4ID0gJHRoaXMtPmdldFByZWZpeCgkdmFsdWUpOwogICAgICAgICAgICAgICAgJHZhbHVlX2xvY2FscGFydCA9ICR0aGlzLT5nZXRMb2NhbFBhcnQoJHZhbHVlKTsKCQkJCSR0aGlzLT5tZXNzYWdlWyRwb3NdWyd0eXBlJ10gPSAkdmFsdWVfbG9jYWxwYXJ0OwoJCQkJJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ3R5cGVQcmVmaXgnXSA9ICR2YWx1ZV9wcmVmaXg7CiAgICAgICAgICAgICAgICBpZihpc3NldCgkdGhpcy0+bmFtZXNwYWNlc1skdmFsdWVfcHJlZml4XSkpewogICAgICAgICAgICAgICAgCSR0aGlzLT5tZXNzYWdlWyRwb3NdWyd0eXBlX25hbWVzcGFjZSddID0gJHRoaXMtPm5hbWVzcGFjZXNbJHZhbHVlX3ByZWZpeF07CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYoaXNzZXQoJGF0dHJzWyd4bWxuczonLiR2YWx1ZV9wcmVmaXhdKSkgewoJCQkJCSR0aGlzLT5tZXNzYWdlWyRwb3NdWyd0eXBlX25hbWVzcGFjZSddID0gJGF0dHJzWyd4bWxuczonLiR2YWx1ZV9wcmVmaXhdOwogICAgICAgICAgICAgICAgfQoJCQkJLy8gc2hvdWxkIGRvIHNvbWV0aGluZyBoZXJlIHdpdGggdGhlIG5hbWVzcGFjZSBvZiBzcGVjaWZpZWQgdHlwZT8KCQkJfSBlbHNlaWYoJGtleV9sb2NhbHBhcnQgPT0gJ2FycmF5VHlwZScpewoJCQkJJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ3R5cGUnXSA9ICdhcnJheSc7CgkJCQkvKiBkbyBhcnJheVR5cGUgZXJlZyBoZXJlCgkJCQlbMV0gICAgYXJyYXlUeXBlVmFsdWUgICAgOjo9ICAgIGF0eXBlIGFzaXplCgkJCQlbMl0gICAgYXR5cGUgICAgOjo9ICAgIFFOYW1lIHJhbmsqCgkJCQlbM10gICAgcmFuayAgICA6Oj0gICAgJ1snICgnLCcpKiAnXScKCQkJCVs0XSAgICBhc2l6ZSAgICA6Oj0gICAgJ1snIGxlbmd0aH4gJ10nCgkJCQlbNV0gICAgbGVuZ3RoICAgIDo6PSAgICBuZXh0RGltZW5zaW9uKiBEaWdpdCsKCQkJCVs2XSAgICBuZXh0RGltZW5zaW9uICAgIDo6PSAgICBEaWdpdCsgJywnCgkJCQkqLwoJCQkJJGV4cHIgPSAnKFtBLVphLXowLTlfXSspOihbQS1aYS16XStbQS1aYS16MC05X10rKVxbKFswLTldKyksPyhbMC05XSopXF0nOwoJCQkJaWYoZXJlZygkZXhwciwkdmFsdWUsJHJlZ3MpKXsKCQkJCQkkdGhpcy0+bWVzc2FnZVskcG9zXVsndHlwZVByZWZpeCddID0gJHJlZ3NbMV07CgkJCQkJJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ2FycmF5VHlwZVByZWZpeCddID0gJHJlZ3NbMV07CgkgICAgICAgICAgICAgICAgaWYgKGlzc2V0KCR0aGlzLT5uYW1lc3BhY2VzWyRyZWdzWzFdXSkpIHsKCSAgICAgICAgICAgICAgICAJJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ2FycmF5VHlwZU5hbWVzcGFjZSddID0gJHRoaXMtPm5hbWVzcGFjZXNbJHJlZ3NbMV1dOwoJICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNzZXQoJGF0dHJzWyd4bWxuczonLiRyZWdzWzFdXSkpIHsKCQkJCQkJJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ2FycmF5VHlwZU5hbWVzcGFjZSddID0gJGF0dHJzWyd4bWxuczonLiRyZWdzWzFdXTsKCSAgICAgICAgICAgICAgICB9CgkJCQkJJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ2FycmF5VHlwZSddID0gJHJlZ3NbMl07CgkJCQkJJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ2FycmF5U2l6ZSddID0gJHJlZ3NbM107CgkJCQkJJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ2FycmF5Q29scyddID0gJHJlZ3NbNF07CgkJCQl9CgkJCS8vIHNwZWNpZmllcyBuaWwgdmFsdWUgKG9yIG5vdCkKCQkJfSBlbHNlaWYgKCRrZXlfbG9jYWxwYXJ0ID09ICduaWwnKXsKCQkJCSR0aGlzLT5tZXNzYWdlWyRwb3NdWyduaWwnXSA9ICgkdmFsdWUgPT0gJ3RydWUnIHx8ICR2YWx1ZSA9PSAnMScpOwoJCQkvLyBzb21lIG90aGVyIGF0dHJpYnV0ZQoJCQl9IGVsc2VpZiAoJGtleSAhPSAnaHJlZicgJiYgJGtleSAhPSAneG1sbnMnICYmICRrZXlfbG9jYWxwYXJ0ICE9ICdlbmNvZGluZ1N0eWxlJyAmJiAka2V5X2xvY2FscGFydCAhPSAncm9vdCcpIHsKCQkJCSR0aGlzLT5tZXNzYWdlWyRwb3NdWyd4YXR0cnMnXVsnIScgLiAka2V5XSA9ICR2YWx1ZTsKCQkJfQoKCQkJaWYgKCRrZXkgPT0gJ3htbG5zJykgewoJCQkJJHRoaXMtPmRlZmF1bHRfbmFtZXNwYWNlID0gJHZhbHVlOwoJCQl9CgkJCS8vIGxvZyBpZAoJCQlpZigka2V5ID09ICdpZCcpewoJCQkJJHRoaXMtPmlkc1skdmFsdWVdID0gJHBvczsKCQkJfQoJCQkvLyByb290CgkJCWlmKCRrZXlfbG9jYWxwYXJ0ID09ICdyb290JyAmJiAkdmFsdWUgPT0gMSl7CgkJCQkkdGhpcy0+c3RhdHVzID0gJ21ldGhvZCc7CgkJCQkkdGhpcy0+cm9vdF9zdHJ1Y3RfbmFtZSA9ICRuYW1lOwoJCQkJJHRoaXMtPnJvb3Rfc3RydWN0ID0gJHBvczsKCQkJCSR0aGlzLT5kZWJ1ZygiZm91bmQgcm9vdCBzdHJ1Y3QgJHRoaXMtPnJvb3Rfc3RydWN0X25hbWUsIHBvcyAkcG9zIik7CgkJCX0KICAgICAgICAgICAgLy8gZm9yIGRvY2xpdAogICAgICAgICAgICAkYXR0c3RyIC49ICIgJGtleT1cIiR2YWx1ZVwiIjsKCQl9CiAgICAgICAgLy8gZ2V0IG5hbWVzcGFjZSAtIG11c3QgYmUgZG9uZSBhZnRlciBuYW1lc3BhY2UgYXR0cyBhcmUgcHJvY2Vzc2VkCgkJaWYoaXNzZXQoJHByZWZpeCkpewoJCQkkdGhpcy0+bWVzc2FnZVskcG9zXVsnbmFtZXNwYWNlJ10gPSAkdGhpcy0+bmFtZXNwYWNlc1skcHJlZml4XTsKCQkJJHRoaXMtPmRlZmF1bHRfbmFtZXNwYWNlID0gJHRoaXMtPm5hbWVzcGFjZXNbJHByZWZpeF07CgkJfSBlbHNlIHsKCQkJJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ25hbWVzcGFjZSddID0gJHRoaXMtPmRlZmF1bHRfbmFtZXNwYWNlOwoJCX0KICAgICAgICBpZigkdGhpcy0+c3RhdHVzID09ICdoZWFkZXInKXsKICAgICAgICAJaWYgKCR0aGlzLT5yb290X2hlYWRlciAhPSAkcG9zKSB7CgkgICAgICAgIAkkdGhpcy0+cmVzcG9uc2VIZWFkZXJzIC49ICI8IiAuIChpc3NldCgkcHJlZml4KSA/ICRwcmVmaXggLiAnOicgOiAnJykgLiAiJG5hbWUkYXR0c3RyPiI7CgkgICAgICAgIH0KICAgICAgICB9IGVsc2VpZigkdGhpcy0+cm9vdF9zdHJ1Y3RfbmFtZSAhPSAnJyl7CiAgICAgICAgCSR0aGlzLT5kb2N1bWVudCAuPSAiPCIgLiAoaXNzZXQoJHByZWZpeCkgPyAkcHJlZml4IC4gJzonIDogJycpIC4gIiRuYW1lJGF0dHN0cj4iOwogICAgICAgIH0KCX0KCgkvKioKCSogZW5kLWVsZW1lbnQgaGFuZGxlcgoJKgoJKiBAcGFyYW0gICAgcmVzb3VyY2UgJHBhcnNlciBYTUwgcGFyc2VyIG9iamVjdAoJKiBAcGFyYW0gICAgc3RyaW5nICRuYW1lIGVsZW1lbnQgbmFtZQoJKiBAYWNjZXNzICAgcHJpdmF0ZQoJKi8KCWZ1bmN0aW9uIGVuZF9lbGVtZW50KCRwYXJzZXIsICRuYW1lKSB7CgkJLy8gcG9zaXRpb24gb2YgY3VycmVudCBlbGVtZW50IGlzIGVxdWFsIHRvIHRoZSBsYXN0IHZhbHVlIGxlZnQgaW4gZGVwdGhfYXJyYXkgZm9yIG15IGRlcHRoCgkJJHBvcyA9ICR0aGlzLT5kZXB0aF9hcnJheVskdGhpcy0+ZGVwdGgtLV07CgogICAgICAgIC8vIGdldCBlbGVtZW50IHByZWZpeAoJCWlmKHN0cnBvcygkbmFtZSwnOicpKXsKCQkJLy8gZ2V0IG5zIHByZWZpeAoJCQkkcHJlZml4ID0gc3Vic3RyKCRuYW1lLDAsc3RycG9zKCRuYW1lLCc6JykpOwoJCQkvLyBnZXQgdW5xdWFsaWZpZWQgbmFtZQoJCQkkbmFtZSA9IHN1YnN0cihzdHJzdHIoJG5hbWUsJzonKSwxKTsKCQl9CgkJCgkJLy8gYnVpbGQgdG8gbmF0aXZlIHR5cGUKCQlpZihpc3NldCgkdGhpcy0+Ym9keV9wb3NpdGlvbikgJiYgJHBvcyA+ICR0aGlzLT5ib2R5X3Bvc2l0aW9uKXsKCQkJLy8gZGVhbCB3LyBtdWx0aXJlZnMKCQkJaWYoaXNzZXQoJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ2F0dHJzJ11bJ2hyZWYnXSkpewoJCQkJLy8gZ2V0IGlkCgkJCQkkaWQgPSBzdWJzdHIoJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ2F0dHJzJ11bJ2hyZWYnXSwxKTsKCQkJCS8vIGFkZCBwbGFjZWhvbGRlciB0byBocmVmIGFycmF5CgkJCQkkdGhpcy0+bXVsdGlyZWZzWyRpZF1bJHBvc10gPSAncGxhY2Vob2xkZXInOwoJCQkJLy8gYWRkIHNldCBhIHJlZmVyZW5jZSB0byBpdCBhcyB0aGUgcmVzdWx0IHZhbHVlCgkJCQkkdGhpcy0+bWVzc2FnZVskcG9zXVsncmVzdWx0J10gPSYgJHRoaXMtPm11bHRpcmVmc1skaWRdWyRwb3NdOwogICAgICAgICAgICAvLyBidWlsZCBjb21wbGV4VHlwZSB2YWx1ZXMKCQkJfSBlbHNlaWYoJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ2NoaWxkcmVuJ10gIT0gJycpewoJCQkJLy8gaWYgcmVzdWx0IGhhcyBhbHJlYWR5IGJlZW4gZ2VuZXJhdGVkIChzdHJ1Y3QvYXJyYXkpCgkJCQlpZighaXNzZXQoJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ3Jlc3VsdCddKSl7CgkJCQkJJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ3Jlc3VsdCddID0gJHRoaXMtPmJ1aWxkVmFsKCRwb3MpOwoJCQkJfQoJCQkvLyBidWlsZCBjb21wbGV4VHlwZSB2YWx1ZXMgb2YgYXR0cmlidXRlcyBhbmQgcG9zc2libHkgc2ltcGxlQ29udGVudAoJCQl9IGVsc2VpZiAoaXNzZXQoJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ3hhdHRycyddKSkgewoJCQkJaWYgKGlzc2V0KCR0aGlzLT5tZXNzYWdlWyRwb3NdWyduaWwnXSkgJiYgJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ25pbCddKSB7CgkJCQkJJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ3hhdHRycyddWychJ10gPSBudWxsOwoJCQkJfSBlbHNlaWYgKGlzc2V0KCR0aGlzLT5tZXNzYWdlWyRwb3NdWydjZGF0YSddKSAmJiB0cmltKCR0aGlzLT5tZXNzYWdlWyRwb3NdWydjZGF0YSddKSAhPSAnJykgewoJICAgICAgICAgICAgCWlmIChpc3NldCgkdGhpcy0+bWVzc2FnZVskcG9zXVsndHlwZSddKSkgewoJCQkJCQkkdGhpcy0+bWVzc2FnZVskcG9zXVsneGF0dHJzJ11bJyEnXSA9ICR0aGlzLT5kZWNvZGVTaW1wbGUoJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ2NkYXRhJ10sICR0aGlzLT5tZXNzYWdlWyRwb3NdWyd0eXBlJ10sIGlzc2V0KCR0aGlzLT5tZXNzYWdlWyRwb3NdWyd0eXBlX25hbWVzcGFjZSddKSA/ICR0aGlzLT5tZXNzYWdlWyRwb3NdWyd0eXBlX25hbWVzcGFjZSddIDogJycpOwoJCQkJCX0gZWxzZSB7CgkJCQkJCSRwYXJlbnQgPSAkdGhpcy0+bWVzc2FnZVskcG9zXVsncGFyZW50J107CgkJCQkJCWlmIChpc3NldCgkdGhpcy0+bWVzc2FnZVskcGFyZW50XVsndHlwZSddKSAmJiAoJHRoaXMtPm1lc3NhZ2VbJHBhcmVudF1bJ3R5cGUnXSA9PSAnYXJyYXknKSAmJiBpc3NldCgkdGhpcy0+bWVzc2FnZVskcGFyZW50XVsnYXJyYXlUeXBlJ10pKSB7CgkJCQkJCQkkdGhpcy0+bWVzc2FnZVskcG9zXVsneGF0dHJzJ11bJyEnXSA9ICR0aGlzLT5kZWNvZGVTaW1wbGUoJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ2NkYXRhJ10sICR0aGlzLT5tZXNzYWdlWyRwYXJlbnRdWydhcnJheVR5cGUnXSwgaXNzZXQoJHRoaXMtPm1lc3NhZ2VbJHBhcmVudF1bJ2FycmF5VHlwZU5hbWVzcGFjZSddKSA/ICR0aGlzLT5tZXNzYWdlWyRwYXJlbnRdWydhcnJheVR5cGVOYW1lc3BhY2UnXSA6ICcnKTsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCSR0aGlzLT5tZXNzYWdlWyRwb3NdWyd4YXR0cnMnXVsnISddID0gJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ2NkYXRhJ107CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCQkkdGhpcy0+bWVzc2FnZVskcG9zXVsncmVzdWx0J10gPSAkdGhpcy0+bWVzc2FnZVskcG9zXVsneGF0dHJzJ107CgkJCS8vIHNldCB2YWx1ZSBvZiBzaW1wbGVUeXBlIChvciBuaWwgY29tcGxleFR5cGUpCgkJCX0gZWxzZSB7CiAgICAgICAgICAgIAkvLyR0aGlzLT5kZWJ1ZygnYWRkaW5nIGRhdGEgZm9yIHNjYWxhciB2YWx1ZSAnLiR0aGlzLT5tZXNzYWdlWyRwb3NdWyduYW1lJ10uJyBvZiB2YWx1ZSAnLiR0aGlzLT5tZXNzYWdlWyRwb3NdWydjZGF0YSddKTsKCQkJCWlmIChpc3NldCgkdGhpcy0+bWVzc2FnZVskcG9zXVsnbmlsJ10pICYmICR0aGlzLT5tZXNzYWdlWyRwb3NdWyduaWwnXSkgewoJCQkJCSR0aGlzLT5tZXNzYWdlWyRwb3NdWyd4YXR0cnMnXVsnISddID0gbnVsbDsKCQkJCX0gZWxzZWlmIChpc3NldCgkdGhpcy0+bWVzc2FnZVskcG9zXVsndHlwZSddKSkgewoJCQkJCSR0aGlzLT5tZXNzYWdlWyRwb3NdWydyZXN1bHQnXSA9ICR0aGlzLT5kZWNvZGVTaW1wbGUoJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ2NkYXRhJ10sICR0aGlzLT5tZXNzYWdlWyRwb3NdWyd0eXBlJ10sIGlzc2V0KCR0aGlzLT5tZXNzYWdlWyRwb3NdWyd0eXBlX25hbWVzcGFjZSddKSA/ICR0aGlzLT5tZXNzYWdlWyRwb3NdWyd0eXBlX25hbWVzcGFjZSddIDogJycpOwoJCQkJfSBlbHNlIHsKCQkJCQkkcGFyZW50ID0gJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ3BhcmVudCddOwoJCQkJCWlmIChpc3NldCgkdGhpcy0+bWVzc2FnZVskcGFyZW50XVsndHlwZSddKSAmJiAoJHRoaXMtPm1lc3NhZ2VbJHBhcmVudF1bJ3R5cGUnXSA9PSAnYXJyYXknKSAmJiBpc3NldCgkdGhpcy0+bWVzc2FnZVskcGFyZW50XVsnYXJyYXlUeXBlJ10pKSB7CgkJCQkJCSR0aGlzLT5tZXNzYWdlWyRwb3NdWydyZXN1bHQnXSA9ICR0aGlzLT5kZWNvZGVTaW1wbGUoJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ2NkYXRhJ10sICR0aGlzLT5tZXNzYWdlWyRwYXJlbnRdWydhcnJheVR5cGUnXSwgaXNzZXQoJHRoaXMtPm1lc3NhZ2VbJHBhcmVudF1bJ2FycmF5VHlwZU5hbWVzcGFjZSddKSA/ICR0aGlzLT5tZXNzYWdlWyRwYXJlbnRdWydhcnJheVR5cGVOYW1lc3BhY2UnXSA6ICcnKTsKCQkJCQl9IGVsc2UgewoJCQkJCQkkdGhpcy0+bWVzc2FnZVskcG9zXVsncmVzdWx0J10gPSAkdGhpcy0+bWVzc2FnZVskcG9zXVsnY2RhdGEnXTsKCQkJCQl9CgkJCQl9CgoJCQkJLyogYWRkIHZhbHVlIHRvIHBhcmVudCdzIHJlc3VsdCwgaWYgcGFyZW50IGlzIHN0cnVjdC9hcnJheQoJCQkJJHBhcmVudCA9ICR0aGlzLT5tZXNzYWdlWyRwb3NdWydwYXJlbnQnXTsKCQkJCWlmKCR0aGlzLT5tZXNzYWdlWyRwYXJlbnRdWyd0eXBlJ10gIT0gJ21hcCcpewoJCQkJCWlmKHN0cnRvbG93ZXIoJHRoaXMtPm1lc3NhZ2VbJHBhcmVudF1bJ3R5cGUnXSkgPT0gJ2FycmF5Jyl7CgkJCQkJCSR0aGlzLT5tZXNzYWdlWyRwYXJlbnRdWydyZXN1bHQnXVtdID0gJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ3Jlc3VsdCddOwoJCQkJCX0gZWxzZSB7CgkJCQkJCSR0aGlzLT5tZXNzYWdlWyRwYXJlbnRdWydyZXN1bHQnXVskdGhpcy0+bWVzc2FnZVskcG9zXVsnbmFtZSddXSA9ICR0aGlzLT5tZXNzYWdlWyRwb3NdWydyZXN1bHQnXTsKCQkJCQl9CgkJCQl9CgkJCQkqLwoJCQl9CgkJfQoJCQogICAgICAgIC8vIGZvciBkb2NsaXQKICAgICAgICBpZigkdGhpcy0+c3RhdHVzID09ICdoZWFkZXInKXsKICAgICAgICAJaWYgKCR0aGlzLT5yb290X2hlYWRlciAhPSAkcG9zKSB7CgkgICAgICAgIAkkdGhpcy0+cmVzcG9uc2VIZWFkZXJzIC49ICI8LyIgLiAoaXNzZXQoJHByZWZpeCkgPyAkcHJlZml4IC4gJzonIDogJycpIC4gIiRuYW1lPiI7CgkgICAgICAgIH0KICAgICAgICB9IGVsc2VpZigkcG9zID49ICR0aGlzLT5yb290X3N0cnVjdCl7CiAgICAgICAgCSR0aGlzLT5kb2N1bWVudCAuPSAiPC8iIC4gKGlzc2V0KCRwcmVmaXgpID8gJHByZWZpeCAuICc6JyA6ICcnKSAuICIkbmFtZT4iOwogICAgICAgIH0KCQkvLyBzd2l0Y2ggc3RhdHVzCgkJaWYoJHBvcyA9PSAkdGhpcy0+cm9vdF9zdHJ1Y3QpewoJCQkkdGhpcy0+c3RhdHVzID0gJ2JvZHknOwoJCQkkdGhpcy0+cm9vdF9zdHJ1Y3RfbmFtZXNwYWNlID0gJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ25hbWVzcGFjZSddOwoJCX0gZWxzZWlmKCRuYW1lID09ICdCb2R5Jyl7CgkJCSR0aGlzLT5zdGF0dXMgPSAnZW52ZWxvcGUnOwoJCSB9IGVsc2VpZigkbmFtZSA9PSAnSGVhZGVyJyl7CgkJCSR0aGlzLT5zdGF0dXMgPSAnZW52ZWxvcGUnOwoJCX0gZWxzZWlmKCRuYW1lID09ICdFbnZlbG9wZScpewoJCQkvLwoJCX0KCQkvLyBzZXQgcGFyZW50IGJhY2sgdG8gbXkgcGFyZW50CgkJJHRoaXMtPnBhcmVudCA9ICR0aGlzLT5tZXNzYWdlWyRwb3NdWydwYXJlbnQnXTsKCX0KCgkvKioKCSogZWxlbWVudCBjb250ZW50IGhhbmRsZXIKCSoKCSogQHBhcmFtICAgIHJlc291cmNlICRwYXJzZXIgWE1MIHBhcnNlciBvYmplY3QKCSogQHBhcmFtICAgIHN0cmluZyAkZGF0YSBlbGVtZW50IGNvbnRlbnQKCSogQGFjY2VzcyAgIHByaXZhdGUKCSovCglmdW5jdGlvbiBjaGFyYWN0ZXJfZGF0YSgkcGFyc2VyLCAkZGF0YSl7CgkJJHBvcyA9ICR0aGlzLT5kZXB0aF9hcnJheVskdGhpcy0+ZGVwdGhdOwoJCWlmICgkdGhpcy0+eG1sX2VuY29kaW5nPT0nVVRGLTgnKXsKCQkJLy8gVE9ETzogYWRkIGFuIG9wdGlvbiB0byBkaXNhYmxlIHRoaXMgZm9yIGZvbGtzIHdobyB3YW50CgkJCS8vIHJhdyBVVEYtOCB0aGF0LCBlLmcuLCBtaWdodCBub3QgbWFwIHRvIGlzby04ODU5LTEKCQkJLy8gVE9ETzogdGhpcyBjYW4gYWxzbyBiZSBoYW5kbGVkIHdpdGggeG1sX3BhcnNlcl9zZXRfb3B0aW9uKCR0aGlzLT5wYXJzZXIsIFhNTF9PUFRJT05fVEFSR0VUX0VOQ09ESU5HLCAiSVNPLTg4NTktMSIpOwoJCQlpZigkdGhpcy0+ZGVjb2RlX3V0ZjgpewoJCQkJJGRhdGEgPSB1dGY4X2RlY29kZSgkZGF0YSk7CgkJCX0KCQl9CiAgICAgICAgJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ2NkYXRhJ10gLj0gJGRhdGE7CiAgICAgICAgLy8gZm9yIGRvY2xpdAogICAgICAgIGlmKCR0aGlzLT5zdGF0dXMgPT0gJ2hlYWRlcicpewogICAgICAgIAkkdGhpcy0+cmVzcG9uc2VIZWFkZXJzIC49ICRkYXRhOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgCSR0aGlzLT5kb2N1bWVudCAuPSAkZGF0YTsKICAgICAgICB9Cgl9CgoJLyoqCgkqIGdldCB0aGUgcGFyc2VkIG1lc3NhZ2UKCSoKCSogQHJldHVybgltaXhlZAoJKiBAYWNjZXNzICAgcHVibGljCgkqLwoJZnVuY3Rpb24gZ2V0X3Jlc3BvbnNlKCl7CgkJcmV0dXJuICR0aGlzLT5zb2FwcmVzcG9uc2U7Cgl9CgoJLyoqCgkqIGdldCB0aGUgcGFyc2VkIGhlYWRlcnMKCSoKCSogQHJldHVybglzdHJpbmcgWE1MIG9yIGVtcHR5IGlmIG5vIGhlYWRlcnMKCSogQGFjY2VzcyAgIHB1YmxpYwoJKi8KCWZ1bmN0aW9uIGdldEhlYWRlcnMoKXsKCSAgICByZXR1cm4gJHRoaXMtPnJlc3BvbnNlSGVhZGVyczsKCX0KCgkvKioKCSogZGVjb2RlcyBzaW1wbGUgdHlwZXMgaW50byBQSFAgdmFyaWFibGVzCgkqCgkqIEBwYXJhbSAgICBzdHJpbmcgJHZhbHVlIHZhbHVlIHRvIGRlY29kZQoJKiBAcGFyYW0gICAgc3RyaW5nICR0eXBlIFhNTCB0eXBlIHRvIGRlY29kZQoJKiBAcGFyYW0gICAgc3RyaW5nICR0eXBlbnMgWE1MIHR5cGUgbmFtZXNwYWNlIHRvIGRlY29kZQoJKiBAcmV0dXJuCW1peGVkIFBIUCB2YWx1ZQoJKiBAYWNjZXNzICAgcHJpdmF0ZQoJKi8KCWZ1bmN0aW9uIGRlY29kZVNpbXBsZSgkdmFsdWUsICR0eXBlLCAkdHlwZW5zKSB7CgkJLy8gVE9ETzogdXNlIHRoZSBuYW1lc3BhY2UhCgkJaWYgKCghaXNzZXQoJHR5cGUpKSB8fCAkdHlwZSA9PSAnc3RyaW5nJyB8fCAkdHlwZSA9PSAnbG9uZycgfHwgJHR5cGUgPT0gJ3Vuc2lnbmVkTG9uZycpIHsKCQkJcmV0dXJuIChzdHJpbmcpICR2YWx1ZTsKCQl9CgkJaWYgKCR0eXBlID09ICdpbnQnIHx8ICR0eXBlID09ICdpbnRlZ2VyJyB8fCAkdHlwZSA9PSAnc2hvcnQnIHx8ICR0eXBlID09ICdieXRlJykgewoJCQlyZXR1cm4gKGludCkgJHZhbHVlOwoJCX0KCQlpZiAoJHR5cGUgPT0gJ2Zsb2F0JyB8fCAkdHlwZSA9PSAnZG91YmxlJyB8fCAkdHlwZSA9PSAnZGVjaW1hbCcpIHsKCQkJcmV0dXJuIChkb3VibGUpICR2YWx1ZTsKCQl9CgkJaWYgKCR0eXBlID09ICdib29sZWFuJykgewoJCQlpZiAoc3RydG9sb3dlcigkdmFsdWUpID09ICdmYWxzZScgfHwgc3RydG9sb3dlcigkdmFsdWUpID09ICdmJykgewoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJCXJldHVybiAoYm9vbGVhbikgJHZhbHVlOwoJCX0KCQlpZiAoJHR5cGUgPT0gJ2Jhc2U2NCcgfHwgJHR5cGUgPT0gJ2Jhc2U2NEJpbmFyeScpIHsKCQkJJHRoaXMtPmRlYnVnKCdEZWNvZGUgYmFzZTY0IHZhbHVlJyk7CgkJCXJldHVybiBiYXNlNjRfZGVjb2RlKCR2YWx1ZSk7CgkJfQoJCS8vIG9ic2N1cmUgbnVtZXJpYyB0eXBlcwoJCWlmICgkdHlwZSA9PSAnbm9uUG9zaXRpdmVJbnRlZ2VyJyB8fCAkdHlwZSA9PSAnbmVnYXRpdmVJbnRlZ2VyJwoJCQl8fCAkdHlwZSA9PSAnbm9uTmVnYXRpdmVJbnRlZ2VyJyB8fCAkdHlwZSA9PSAncG9zaXRpdmVJbnRlZ2VyJwoJCQl8fCAkdHlwZSA9PSAndW5zaWduZWRJbnQnCgkJCXx8ICR0eXBlID09ICd1bnNpZ25lZFNob3J0JyB8fCAkdHlwZSA9PSAndW5zaWduZWRCeXRlJykgewoJCQlyZXR1cm4gKGludCkgJHZhbHVlOwoJCX0KCQkvLyBib2d1czogcGFyc2VyIHRyZWF0cyBhcnJheSB3aXRoIG5vIGVsZW1lbnRzIGFzIGEgc2ltcGxlIHR5cGUKCQlpZiAoJHR5cGUgPT0gJ2FycmF5JykgewoJCQlyZXR1cm4gYXJyYXkoKTsKCQl9CgkJLy8gZXZlcnl0aGluZyBlbHNlCgkJcmV0dXJuIChzdHJpbmcpICR2YWx1ZTsKCX0KCgkvKioKCSogYnVpbGRzIHJlc3BvbnNlIHN0cnVjdHVyZXMgZm9yIGNvbXBvdW5kIHZhbHVlcyAoYXJyYXlzL3N0cnVjdHMpCgkqIGFuZCBzY2FsYXJzCgkqCgkqIEBwYXJhbSAgICBpbnRlZ2VyICRwb3MgcG9zaXRpb24gaW4gbm9kZSB0cmVlCgkqIEByZXR1cm4JbWl4ZWQJUEhQIHZhbHVlCgkqIEBhY2Nlc3MgICBwcml2YXRlCgkqLwoJZnVuY3Rpb24gYnVpbGRWYWwoJHBvcyl7CgkJaWYoIWlzc2V0KCR0aGlzLT5tZXNzYWdlWyRwb3NdWyd0eXBlJ10pKXsKCQkJJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ3R5cGUnXSA9ICcnOwoJCX0KCQkkdGhpcy0+ZGVidWcoJ2luIGJ1aWxkVmFsKCkgZm9yICcuJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ25hbWUnXS4iKHBvcyAkcG9zKSBvZiB0eXBlICIuJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ3R5cGUnXSk7CgkJLy8gaWYgdGhlcmUgYXJlIGNoaWxkcmVuLi4uCgkJaWYoJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ2NoaWxkcmVuJ10gIT0gJycpewoJCQkkdGhpcy0+ZGVidWcoJ2luIGJ1aWxkVmFsLCB0aGVyZSBhcmUgY2hpbGRyZW4nKTsKCQkJJGNoaWxkcmVuID0gZXhwbG9kZSgnfCcsJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ2NoaWxkcmVuJ10pOwoJCQlhcnJheV9zaGlmdCgkY2hpbGRyZW4pOyAvLyBrbm9jayBvZmYgZW1wdHkKCQkJLy8gbWQgYXJyYXkKCQkJaWYoaXNzZXQoJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ2FycmF5Q29scyddKSAmJiAkdGhpcy0+bWVzc2FnZVskcG9zXVsnYXJyYXlDb2xzJ10gIT0gJycpewogICAgICAgICAgICAJJHI9MDsgLy8gcm93Y291bnQKICAgICAgICAgICAgCSRjPTA7IC8vIGNvbGNvdW50CiAgICAgICAgICAgIAlmb3JlYWNoKCRjaGlsZHJlbiBhcyAkY2hpbGRfcG9zKXsKCQkJCQkkdGhpcy0+ZGVidWcoImluIGJ1aWxkVmFsLCBnb3QgYW4gTUQgYXJyYXkgZWxlbWVudDogJHIsICRjIik7CgkJCQkJJHBhcmFtc1skcl1bXSA9ICR0aGlzLT5tZXNzYWdlWyRjaGlsZF9wb3NdWydyZXN1bHQnXTsKCQkJCSAgICAkYysrOwoJCQkJICAgIGlmKCRjID09ICR0aGlzLT5tZXNzYWdlWyRwb3NdWydhcnJheUNvbHMnXSl7CgkJCQkgICAgCSRjID0gMDsKCQkJCQkJJHIrKzsKCQkJCSAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIGFycmF5CgkJCX0gZWxzZWlmKCR0aGlzLT5tZXNzYWdlWyRwb3NdWyd0eXBlJ10gPT0gJ2FycmF5JyB8fCAkdGhpcy0+bWVzc2FnZVskcG9zXVsndHlwZSddID09ICdBcnJheScpewogICAgICAgICAgICAgICAgJHRoaXMtPmRlYnVnKCdpbiBidWlsZFZhbCwgYWRkaW5nIGFycmF5ICcuJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ25hbWUnXSk7CiAgICAgICAgICAgICAgICBmb3JlYWNoKCRjaGlsZHJlbiBhcyAkY2hpbGRfcG9zKXsKICAgICAgICAgICAgICAgIAkkcGFyYW1zW10gPSAmJHRoaXMtPm1lc3NhZ2VbJGNoaWxkX3Bvc11bJ3Jlc3VsdCddOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBhcGFjaGUgTWFwIHR5cGU6IGphdmEgaGFzaHRhYmxlCiAgICAgICAgICAgIH0gZWxzZWlmKCR0aGlzLT5tZXNzYWdlWyRwb3NdWyd0eXBlJ10gPT0gJ01hcCcgJiYgJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ3R5cGVfbmFtZXNwYWNlJ10gPT0gJ2h0dHA6Ly94bWwuYXBhY2hlLm9yZy94bWwtc29hcCcpewogICAgICAgICAgICAgICAgJHRoaXMtPmRlYnVnKCdpbiBidWlsZFZhbCwgSmF2YSBNYXAgJy4kdGhpcy0+bWVzc2FnZVskcG9zXVsnbmFtZSddKTsKICAgICAgICAgICAgICAgIGZvcmVhY2goJGNoaWxkcmVuIGFzICRjaGlsZF9wb3MpewogICAgICAgICAgICAgICAgCSRrdiA9IGV4cGxvZGUoInwiLCR0aGlzLT5tZXNzYWdlWyRjaGlsZF9wb3NdWydjaGlsZHJlbiddKTsKICAgICAgICAgICAgICAgICAgIAkkcGFyYW1zWyR0aGlzLT5tZXNzYWdlWyRrdlsxXV1bJ3Jlc3VsdCddXSA9ICYkdGhpcy0+bWVzc2FnZVska3ZbMl1dWydyZXN1bHQnXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gZ2VuZXJpYyBjb21wb3VuZCB0eXBlCiAgICAgICAgICAgIC8vfSBlbHNlaWYoJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ3R5cGUnXSA9PSAnU09BUFN0cnVjdCcgfHwgJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ3R5cGUnXSA9PSAnc3RydWN0JykgewoJCSAgICB9IGVsc2UgewoJICAgIAkJLy8gQXBhY2hlIFZlY3RvciB0eXBlOiB0cmVhdCBhcyBhbiBhcnJheQogICAgICAgICAgICAgICAgJHRoaXMtPmRlYnVnKCdpbiBidWlsZFZhbCwgYWRkaW5nIEphdmEgVmVjdG9yICcuJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ25hbWUnXSk7CgkJCQlpZiAoJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ3R5cGUnXSA9PSAnVmVjdG9yJyAmJiAkdGhpcy0+bWVzc2FnZVskcG9zXVsndHlwZV9uYW1lc3BhY2UnXSA9PSAnaHR0cDovL3htbC5hcGFjaGUub3JnL3htbC1zb2FwJykgewoJCQkJCSRub3RzdHJ1Y3QgPSAxOwoJCQkJfSBlbHNlIHsKCQkJCQkkbm90c3RydWN0ID0gMDsKCSAgICAgICAgICAgIH0KICAgICAgICAgICAgCS8vCiAgICAgICAgICAgIAlmb3JlYWNoKCRjaGlsZHJlbiBhcyAkY2hpbGRfcG9zKXsKICAgICAgICAgICAgCQlpZigkbm90c3RydWN0KXsKICAgICAgICAgICAgCQkJJHBhcmFtc1tdID0gJiR0aGlzLT5tZXNzYWdlWyRjaGlsZF9wb3NdWydyZXN1bHQnXTsKICAgICAgICAgICAgCQl9IGVsc2UgewogICAgICAgICAgICAJCQlpZiAoaXNzZXQoJHBhcmFtc1skdGhpcy0+bWVzc2FnZVskY2hpbGRfcG9zXVsnbmFtZSddXSkpIHsKICAgICAgICAgICAgCQkJCS8vIGRlLXNlcmlhbGl6ZSByZXBlYXRlZCBlbGVtZW50IG5hbWUgaW50byBhbiBhcnJheQogICAgICAgICAgICAJCQkJaWYgKCghaXNfYXJyYXkoJHBhcmFtc1skdGhpcy0+bWVzc2FnZVskY2hpbGRfcG9zXVsnbmFtZSddXSkpIHx8ICghaXNzZXQoJHBhcmFtc1skdGhpcy0+bWVzc2FnZVskY2hpbGRfcG9zXVsnbmFtZSddXVswXSkpKSB7CiAgICAgICAgICAgIAkJCQkJJHBhcmFtc1skdGhpcy0+bWVzc2FnZVskY2hpbGRfcG9zXVsnbmFtZSddXSA9IGFycmF5KCRwYXJhbXNbJHRoaXMtPm1lc3NhZ2VbJGNoaWxkX3Bvc11bJ25hbWUnXV0pOwogICAgICAgICAgICAJCQkJfQogICAgICAgICAgICAJCQkJJHBhcmFtc1skdGhpcy0+bWVzc2FnZVskY2hpbGRfcG9zXVsnbmFtZSddXVtdID0gJiR0aGlzLT5tZXNzYWdlWyRjaGlsZF9wb3NdWydyZXN1bHQnXTsKICAgICAgICAgICAgCQkJfSBlbHNlIHsKCQkJCQkgICAgCSRwYXJhbXNbJHRoaXMtPm1lc3NhZ2VbJGNoaWxkX3Bvc11bJ25hbWUnXV0gPSAmJHRoaXMtPm1lc3NhZ2VbJGNoaWxkX3Bvc11bJ3Jlc3VsdCddOwoJCQkJCSAgICB9CiAgICAgICAgICAgICAgICAJfQogICAgICAgICAgICAgICAgfQoJCQl9CgkJCWlmIChpc3NldCgkdGhpcy0+bWVzc2FnZVskcG9zXVsneGF0dHJzJ10pKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+ZGVidWcoJ2luIGJ1aWxkVmFsLCBoYW5kbGluZyBhdHRyaWJ1dGVzJyk7CgkJCQlmb3JlYWNoICgkdGhpcy0+bWVzc2FnZVskcG9zXVsneGF0dHJzJ10gYXMgJG4gPT4gJHYpIHsKCQkJCQkkcGFyYW1zWyRuXSA9ICR2OwoJCQkJfQoJCQl9CgkJCS8vIGhhbmRsZSBzaW1wbGVDb250ZW50CgkJCWlmIChpc3NldCgkdGhpcy0+bWVzc2FnZVskcG9zXVsnY2RhdGEnXSkgJiYgdHJpbSgkdGhpcy0+bWVzc2FnZVskcG9zXVsnY2RhdGEnXSkgIT0gJycpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5kZWJ1ZygnaW4gYnVpbGRWYWwsIGhhbmRsaW5nIHNpbXBsZUNvbnRlbnQnKTsKICAgICAgICAgICAgCWlmIChpc3NldCgkdGhpcy0+bWVzc2FnZVskcG9zXVsndHlwZSddKSkgewoJCQkJCSRwYXJhbXNbJyEnXSA9ICR0aGlzLT5kZWNvZGVTaW1wbGUoJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ2NkYXRhJ10sICR0aGlzLT5tZXNzYWdlWyRwb3NdWyd0eXBlJ10sIGlzc2V0KCR0aGlzLT5tZXNzYWdlWyRwb3NdWyd0eXBlX25hbWVzcGFjZSddKSA/ICR0aGlzLT5tZXNzYWdlWyRwb3NdWyd0eXBlX25hbWVzcGFjZSddIDogJycpOwoJCQkJfSBlbHNlIHsKCQkJCQkkcGFyZW50ID0gJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ3BhcmVudCddOwoJCQkJCWlmIChpc3NldCgkdGhpcy0+bWVzc2FnZVskcGFyZW50XVsndHlwZSddKSAmJiAoJHRoaXMtPm1lc3NhZ2VbJHBhcmVudF1bJ3R5cGUnXSA9PSAnYXJyYXknKSAmJiBpc3NldCgkdGhpcy0+bWVzc2FnZVskcGFyZW50XVsnYXJyYXlUeXBlJ10pKSB7CgkJCQkJCSRwYXJhbXNbJyEnXSA9ICR0aGlzLT5kZWNvZGVTaW1wbGUoJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ2NkYXRhJ10sICR0aGlzLT5tZXNzYWdlWyRwYXJlbnRdWydhcnJheVR5cGUnXSwgaXNzZXQoJHRoaXMtPm1lc3NhZ2VbJHBhcmVudF1bJ2FycmF5VHlwZU5hbWVzcGFjZSddKSA/ICR0aGlzLT5tZXNzYWdlWyRwYXJlbnRdWydhcnJheVR5cGVOYW1lc3BhY2UnXSA6ICcnKTsKCQkJCQl9IGVsc2UgewoJCQkJCQkkcGFyYW1zWychJ10gPSAkdGhpcy0+bWVzc2FnZVskcG9zXVsnY2RhdGEnXTsKCQkJCQl9CgkJCQl9CgkJCX0KCQkJcmV0dXJuIGlzX2FycmF5KCRwYXJhbXMpID8gJHBhcmFtcyA6IGFycmF5KCk7CgkJfSBlbHNlIHsKICAgICAgICAJJHRoaXMtPmRlYnVnKCdpbiBidWlsZFZhbCwgbm8gY2hpbGRyZW4sIGJ1aWxkaW5nIHNjYWxhcicpOwoJCQkkY2RhdGEgPSBpc3NldCgkdGhpcy0+bWVzc2FnZVskcG9zXVsnY2RhdGEnXSkgPyAkdGhpcy0+bWVzc2FnZVskcG9zXVsnY2RhdGEnXSA6ICcnOwogICAgICAgIAlpZiAoaXNzZXQoJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ3R5cGUnXSkpIHsKCQkJCXJldHVybiAkdGhpcy0+ZGVjb2RlU2ltcGxlKCRjZGF0YSwgJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ3R5cGUnXSwgaXNzZXQoJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ3R5cGVfbmFtZXNwYWNlJ10pID8gJHRoaXMtPm1lc3NhZ2VbJHBvc11bJ3R5cGVfbmFtZXNwYWNlJ10gOiAnJyk7CgkJCX0KCQkJJHBhcmVudCA9ICR0aGlzLT5tZXNzYWdlWyRwb3NdWydwYXJlbnQnXTsKCQkJaWYgKGlzc2V0KCR0aGlzLT5tZXNzYWdlWyRwYXJlbnRdWyd0eXBlJ10pICYmICgkdGhpcy0+bWVzc2FnZVskcGFyZW50XVsndHlwZSddID09ICdhcnJheScpICYmIGlzc2V0KCR0aGlzLT5tZXNzYWdlWyRwYXJlbnRdWydhcnJheVR5cGUnXSkpIHsKCQkJCXJldHVybiAkdGhpcy0+ZGVjb2RlU2ltcGxlKCRjZGF0YSwgJHRoaXMtPm1lc3NhZ2VbJHBhcmVudF1bJ2FycmF5VHlwZSddLCBpc3NldCgkdGhpcy0+bWVzc2FnZVskcGFyZW50XVsnYXJyYXlUeXBlTmFtZXNwYWNlJ10pID8gJHRoaXMtPm1lc3NhZ2VbJHBhcmVudF1bJ2FycmF5VHlwZU5hbWVzcGFjZSddIDogJycpOwoJCQl9CiAgICAgICAgICAgCXJldHVybiAkdGhpcy0+bWVzc2FnZVskcG9zXVsnY2RhdGEnXTsKCQl9Cgl9Cn0KCgoKPz48P3BocAoKCgovKioKKgoqIHNvYXBjbGllbnQgaGlnaGVyIGxldmVsIGNsYXNzIGZvciBlYXN5IHVzYWdlLgoqCiogdXNhZ2U6CioKKiAvLyBpbnN0YW50aWF0ZSBjbGllbnQgd2l0aCBzZXJ2ZXIgaW5mbwoqICRzb2FwY2xpZW50ID0gbmV3IHNvYXBjbGllbnQoIHN0cmluZyBwYXRoIFsgLGJvb2xlYW4gd3NkbF0gKTsKKgoqIC8vIGNhbGwgbWV0aG9kLCBnZXQgcmVzdWx0cwoqIGVjaG8gJHNvYXBjbGllbnQtPmNhbGwoIHN0cmluZyBtZXRob2RuYW1lIFsgLGFycmF5IHBhcmFtZXRlcnNdICk7CioKKiAvLyBieWUgYnllIGNsaWVudAoqIHVuc2V0KCRzb2FwY2xpZW50KTsKKgoqIEBhdXRob3IgICBEaWV0cmljaCBBeWFsYSA8ZGlldHJpY2hAZ2FueDQuY29tPgoqIEB2ZXJzaW9uICAkSWQ6IG51c29hcC5waHAsdiAxLjk0IDIwMDUvMDgvMDQgMDE6Mjc6NDIgc25pY2hvbCBFeHAgJAoqIEBhY2Nlc3MgICBwdWJsaWMKKi8KY2xhc3Mgc29hcGNsaWVudCBleHRlbmRzIG51c29hcF9iYXNlICB7CgoJdmFyICR1c2VybmFtZSA9ICcnOwoJdmFyICRwYXNzd29yZCA9ICcnOwoJdmFyICRhdXRodHlwZSA9ICcnOwoJdmFyICRjZXJ0UmVxdWVzdCA9IGFycmF5KCk7Cgl2YXIgJHJlcXVlc3RIZWFkZXJzID0gZmFsc2U7CS8vIFNPQVAgaGVhZGVycyBpbiByZXF1ZXN0ICh0ZXh0KQoJdmFyICRyZXNwb25zZUhlYWRlcnMgPSAnJzsJCS8vIFNPQVAgaGVhZGVycyBmcm9tIHJlc3BvbnNlIChpbmNvbXBsZXRlIG5hbWVzcGFjZSByZXNvbHV0aW9uKSAodGV4dCkKCXZhciAkZG9jdW1lbnQgPSAnJzsJCQkJLy8gU09BUCBib2R5IHJlc3BvbnNlIHBvcnRpb24gKGluY29tcGxldGUgbmFtZXNwYWNlIHJlc29sdXRpb24pICh0ZXh0KQoJdmFyICRlbmRwb2ludDsKCXZhciAkZm9yY2VFbmRwb2ludCA9ICcnOwkJLy8gb3ZlcnJpZGVzIFdTREwgZW5kcG9pbnQKICAgIHZhciAkcHJveHlob3N0ID0gJyc7CiAgICB2YXIgJHByb3h5cG9ydCA9ICcnOwoJdmFyICRwcm94eXVzZXJuYW1lID0gJyc7Cgl2YXIgJHByb3h5cGFzc3dvcmQgPSAnJzsKICAgIHZhciAkeG1sX2VuY29kaW5nID0gJyc7CQkJLy8gY2hhcmFjdGVyIHNldCBlbmNvZGluZyBvZiBpbmNvbWluZyAocmVzcG9uc2UpIG1lc3NhZ2VzCgl2YXIgJGh0dHBfZW5jb2RpbmcgPSBmYWxzZTsKCXZhciAkdGltZW91dCA9IDA7CQkJCS8vIEhUVFAgY29ubmVjdGlvbiB0aW1lb3V0Cgl2YXIgJHJlc3BvbnNlX3RpbWVvdXQgPSAzMDsJCS8vIEhUVFAgcmVzcG9uc2UgdGltZW91dAoJdmFyICRlbmRwb2ludFR5cGUgPSAnJzsJCQkvLyBzb2FwfHdzZGwsIGVtcHR5IGZvciBXU0RMIGluaXRpYWxpemF0aW9uIGVycm9yCgl2YXIgJHBlcnNpc3RlbnRDb25uZWN0aW9uID0gZmFsc2U7Cgl2YXIgJGRlZmF1bHRScGNQYXJhbXMgPSBmYWxzZTsJLy8gVGhpcyBpcyBubyBsb25nZXIgdXNlZAoJdmFyICRyZXF1ZXN0ID0gJyc7CQkJCS8vIEhUVFAgcmVxdWVzdAoJdmFyICRyZXNwb25zZSA9ICcnOwkJCQkvLyBIVFRQIHJlc3BvbnNlCgl2YXIgJHJlc3BvbnNlRGF0YSA9ICcnOwkJCS8vIFNPQVAgcGF5bG9hZCBvZiByZXNwb25zZQoJdmFyICRjb29raWVzID0gYXJyYXkoKTsJCQkvLyBDb29raWVzIGZyb20gcmVzcG9uc2Ugb3IgZm9yIHJlcXVlc3QKICAgIHZhciAkZGVjb2RlX3V0ZjggPSB0cnVlOwkJLy8gdG9nZ2xlcyB3aGV0aGVyIHRoZSBwYXJzZXIgZGVjb2RlcyBlbGVtZW50IGNvbnRlbnQgdy8gdXRmOF9kZWNvZGUoKQoJdmFyICRvcGVyYXRpb25zID0gYXJyYXkoKTsJCS8vIFdTREwgb3BlcmF0aW9ucywgZW1wdHkgZm9yIFdTREwgaW5pdGlhbGl6YXRpb24gZXJyb3IKCQoJLyoKCSAqIGZhdWx0IHJlbGF0ZWQgdmFyaWFibGVzCgkgKi8KCS8qKgoJICogQHZhciAgICAgIGZhdWx0CgkgKiBAYWNjZXNzICAgcHVibGljCgkgKi8KCXZhciAkZmF1bHQ7CgkvKioKCSAqIEB2YXIgICAgICBmYXVsdGNvZGUKCSAqIEBhY2Nlc3MgICBwdWJsaWMKCSAqLwoJdmFyICRmYXVsdGNvZGU7CgkvKioKCSAqIEB2YXIgICAgICBmYXVsdHN0cmluZwoJICogQGFjY2VzcyAgIHB1YmxpYwoJICovCgl2YXIgJGZhdWx0c3RyaW5nOwoJLyoqCgkgKiBAdmFyICAgICAgZmF1bHRkZXRhaWwKCSAqIEBhY2Nlc3MgICBwdWJsaWMKCSAqLwoJdmFyICRmYXVsdGRldGFpbDsKCgkvKioKCSogY29uc3RydWN0b3IKCSoKCSogQHBhcmFtICAgIG1peGVkICRlbmRwb2ludCBTT0FQIHNlcnZlciBvciBXU0RMIFVSTCAoc3RyaW5nKSwgb3Igd3NkbCBpbnN0YW5jZSAob2JqZWN0KQoJKiBAcGFyYW0gICAgYm9vbCAkd3NkbCBvcHRpb25hbCwgc2V0IHRvIHRydWUgaWYgdXNpbmcgV1NETAoJKiBAcGFyYW0JaW50ICRwb3J0TmFtZSBvcHRpb25hbCBwb3J0TmFtZSBpbiBXU0RMIGRvY3VtZW50CgkqIEBwYXJhbSAgICBzdHJpbmcgJHByb3h5aG9zdAoJKiBAcGFyYW0gICAgc3RyaW5nICRwcm94eXBvcnQKCSogQHBhcmFtCXN0cmluZyAkcHJveHl1c2VybmFtZQoJKiBAcGFyYW0Jc3RyaW5nICRwcm94eXBhc3N3b3JkCgkqIEBwYXJhbQlpbnRlZ2VyICR0aW1lb3V0IHNldCB0aGUgY29ubmVjdGlvbiB0aW1lb3V0CgkqIEBwYXJhbQlpbnRlZ2VyICRyZXNwb25zZV90aW1lb3V0IHNldCB0aGUgcmVzcG9uc2UgdGltZW91dAoJKiBAYWNjZXNzICAgcHVibGljCgkqLwoJZnVuY3Rpb24gc29hcGNsaWVudCgkZW5kcG9pbnQsJHdzZGwgPSBmYWxzZSwkcHJveHlob3N0ID0gZmFsc2UsJHByb3h5cG9ydCA9IGZhbHNlLCRwcm94eXVzZXJuYW1lID0gZmFsc2UsICRwcm94eXBhc3N3b3JkID0gZmFsc2UsICR0aW1lb3V0ID0gMCwgJHJlc3BvbnNlX3RpbWVvdXQgPSAzMCl7CgkJcGFyZW50OjpudXNvYXBfYmFzZSgpOwoJCSR0aGlzLT5lbmRwb2ludCA9ICRlbmRwb2ludDsKCQkkdGhpcy0+cHJveHlob3N0ID0gJHByb3h5aG9zdDsKCQkkdGhpcy0+cHJveHlwb3J0ID0gJHByb3h5cG9ydDsKCQkkdGhpcy0+cHJveHl1c2VybmFtZSA9ICRwcm94eXVzZXJuYW1lOwoJCSR0aGlzLT5wcm94eXBhc3N3b3JkID0gJHByb3h5cGFzc3dvcmQ7CgkJJHRoaXMtPnRpbWVvdXQgPSAkdGltZW91dDsKCQkkdGhpcy0+cmVzcG9uc2VfdGltZW91dCA9ICRyZXNwb25zZV90aW1lb3V0OwoKCQkvLyBtYWtlIHZhbHVlcwoJCWlmKCR3c2RsKXsKCQkJaWYgKGlzX29iamVjdCgkZW5kcG9pbnQpICYmIChnZXRfY2xhc3MoJGVuZHBvaW50KSA9PSAnd3NkbCcpKSB7CgkJCQkkdGhpcy0+d3NkbCA9ICRlbmRwb2ludDsKCQkJCSR0aGlzLT5lbmRwb2ludCA9ICR0aGlzLT53c2RsLT53c2RsOwoJCQkJJHRoaXMtPndzZGxGaWxlID0gJHRoaXMtPmVuZHBvaW50OwoJCQkJJHRoaXMtPmRlYnVnKCdleGlzdGluZyB3c2RsIGluc3RhbmNlIGNyZWF0ZWQgZnJvbSAnIC4gJHRoaXMtPmVuZHBvaW50KTsKCQkJfSBlbHNlIHsKCQkJCSR0aGlzLT53c2RsRmlsZSA9ICR0aGlzLT5lbmRwb2ludDsKCQkJCQoJCQkJLy8gaW5zdGFudGlhdGUgd3NkbCBvYmplY3QgYW5kIHBhcnNlIHdzZGwgZmlsZQoJCQkJJHRoaXMtPmRlYnVnKCdpbnN0YW50aWF0aW5nIHdzZGwgY2xhc3Mgd2l0aCBkb2M6ICcuJGVuZHBvaW50KTsKCQkJCSR0aGlzLT53c2RsID0mIG5ldyB3c2RsKCR0aGlzLT53c2RsRmlsZSwkdGhpcy0+cHJveHlob3N0LCR0aGlzLT5wcm94eXBvcnQsJHRoaXMtPnByb3h5dXNlcm5hbWUsJHRoaXMtPnByb3h5cGFzc3dvcmQsJHRoaXMtPnRpbWVvdXQsJHRoaXMtPnJlc3BvbnNlX3RpbWVvdXQpOwoJCQl9CgkJCSR0aGlzLT5hcHBlbmREZWJ1ZygkdGhpcy0+d3NkbC0+Z2V0RGVidWcoKSk7CgkJCSR0aGlzLT53c2RsLT5jbGVhckRlYnVnKCk7CgkJCS8vIGNhdGNoIGVycm9ycwoJCQlpZigkZXJyc3RyID0gJHRoaXMtPndzZGwtPmdldEVycm9yKCkpewoJCQkJJHRoaXMtPmRlYnVnKCdnb3Qgd3NkbCBlcnJvcjogJy4kZXJyc3RyKTsKCQkJCSR0aGlzLT5zZXRFcnJvcignd3NkbCBlcnJvcjogJy4kZXJyc3RyKTsKCQkJfSBlbHNlaWYoJHRoaXMtPm9wZXJhdGlvbnMgPSAkdGhpcy0+d3NkbC0+Z2V0T3BlcmF0aW9ucygpKXsKCQkJCSR0aGlzLT5kZWJ1ZyggJ2dvdCAnLmNvdW50KCR0aGlzLT5vcGVyYXRpb25zKS4nIG9wZXJhdGlvbnMgZnJvbSB3c2RsICcuJHRoaXMtPndzZGxGaWxlKTsKCQkJCSR0aGlzLT5lbmRwb2ludFR5cGUgPSAnd3NkbCc7CgkJCX0gZWxzZSB7CgkJCQkkdGhpcy0+ZGVidWcoICdnZXRPcGVyYXRpb25zIHJldHVybmVkIGZhbHNlJyk7CgkJCQkkdGhpcy0+c2V0RXJyb3IoJ25vIG9wZXJhdGlvbnMgZGVmaW5lZCBpbiB0aGUgV1NETCBkb2N1bWVudCEnKTsKCQkJfQoJCX0gZWxzZSB7CgkJCSR0aGlzLT5kZWJ1ZygiaW5zdGFudGlhdGUgU09BUCB3aXRoIGVuZHBvaW50IGF0ICRlbmRwb2ludCIpOwoJCQkkdGhpcy0+ZW5kcG9pbnRUeXBlID0gJ3NvYXAnOwoJCX0KCX0KCgkvKioKCSogY2FsbHMgbWV0aG9kLCByZXR1cm5zIFBIUCBuYXRpdmUgdHlwZQoJKgoJKiBAcGFyYW0gICAgc3RyaW5nICRtZXRob2QgU09BUCBzZXJ2ZXIgVVJMIG9yIHBhdGgKCSogQHBhcmFtICAgIG1peGVkICRwYXJhbXMgQW4gYXJyYXksIGFzc29jaWF0aXZlIG9yIHNpbXBsZSwgb2YgdGhlIHBhcmFtZXRlcnMKCSoJCQkgICAgICAgICAgICAgIGZvciB0aGUgbWV0aG9kIGNhbGwsIG9yIGEgc3RyaW5nIHRoYXQgaXMgdGhlIFhNTAoJKgkJCSAgICAgICAgICAgICAgZm9yIHRoZSBjYWxsLiAgRm9yIHJwYyBzdHlsZSwgdGhpcyBjYWxsIHdpbGwKCSoJCQkgICAgICAgICAgICAgIHdyYXAgdGhlIFhNTCBpbiBhIHRhZyBuYW1lZCBhZnRlciB0aGUgbWV0aG9kLCBhcwoJKgkJCSAgICAgICAgICAgICAgd2VsbCBhcyB0aGUgU09BUCBFbnZlbG9wZSBhbmQgQm9keS4gIEZvciBkb2N1bWVudAoJKgkJCSAgICAgICAgICAgICAgc3R5bGUsIHRoaXMgd2lsbCBvbmx5IHdyYXAgd2l0aCB0aGUgRW52ZWxvcGUgYW5kIEJvZHkuCgkqCQkJICAgICAgICAgICAgICBJTVBPUlRBTlQ6IHdoZW4gdXNpbmcgYW4gYXJyYXkgd2l0aCBkb2N1bWVudCBzdHlsZSwKCSoJCQkgICAgICAgICAgICAgIGluIHdoaWNoIGNhc2UgdGhlcmUKCSogICAgICAgICAgICAgICAgICAgICAgICAgaXMgcmVhbGx5IG9uZSBwYXJhbWV0ZXIsIHRoZSByb290IG9mIHRoZSBmcmFnbWVudAoJKiAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIGluIHRoZSBjYWxsLCB3aGljaCBlbmNsb3NlcyB3aGF0IHByb2dyYW1tZXJzCgkqICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGx5IHRoaW5rIG9mIHBhcmFtZXRlcnMuICBBIHBhcmFtZXRlciBhcnJheQoJKiAgICAgICAgICAgICAgICAgICAgICAgICAqbXVzdCogaW5jbHVkZSB0aGUgd3JhcHBlci4KCSogQHBhcmFtCXN0cmluZyAkbmFtZXNwYWNlIG9wdGlvbmFsIG1ldGhvZCBuYW1lc3BhY2UgKFdTREwgY2FuIG92ZXJyaWRlKQoJKiBAcGFyYW0Jc3RyaW5nICRzb2FwQWN0aW9uIG9wdGlvbmFsIFNPQVBBY3Rpb24gdmFsdWUgKFdTREwgY2FuIG92ZXJyaWRlKQoJKiBAcGFyYW0JbWl4ZWQgJGhlYWRlcnMgb3B0aW9uYWwgc3RyaW5nIG9mIFhNTCB3aXRoIFNPQVAgaGVhZGVyIGNvbnRlbnQsIG9yIGFycmF5IG9mIHNvYXB2YWwgb2JqZWN0cyBmb3IgU09BUCBoZWFkZXJzCgkqIEBwYXJhbQlib29sZWFuICRycGNQYXJhbXMgb3B0aW9uYWwgKG5vIGxvbmdlciB1c2VkKQoJKiBAcGFyYW0Jc3RyaW5nCSRzdHlsZSBvcHRpb25hbCAocnBjfGRvY3VtZW50KSB0aGUgc3R5bGUgdG8gdXNlIHdoZW4gc2VyaWFsaXppbmcgcGFyYW1ldGVycyAoV1NETCBjYW4gb3ZlcnJpZGUpCgkqIEBwYXJhbQlzdHJpbmcJJHVzZSBvcHRpb25hbCAoZW5jb2RlZHxsaXRlcmFsKSB0aGUgdXNlIHdoZW4gc2VyaWFsaXppbmcgcGFyYW1ldGVycyAoV1NETCBjYW4gb3ZlcnJpZGUpCgkqIEByZXR1cm4JbWl4ZWQJcmVzcG9uc2UgZnJvbSBTT0FQIGNhbGwKCSogQGFjY2VzcyAgIHB1YmxpYwoJKi8KCWZ1bmN0aW9uIGNhbGwoJG9wZXJhdGlvbiwkcGFyYW1zPWFycmF5KCksJG5hbWVzcGFjZT0naHR0cDovL3RlbXB1cmkub3JnJywkc29hcEFjdGlvbj0nJywkaGVhZGVycz1mYWxzZSwkcnBjUGFyYW1zPW51bGwsJHN0eWxlPSdycGMnLCR1c2U9J2VuY29kZWQnKXsKCQkkdGhpcy0+b3BlcmF0aW9uID0gJG9wZXJhdGlvbjsKCQkkdGhpcy0+ZmF1bHQgPSBmYWxzZTsKCQkkdGhpcy0+c2V0RXJyb3IoJycpOwoJCSR0aGlzLT5yZXF1ZXN0ID0gJyc7CgkJJHRoaXMtPnJlc3BvbnNlID0gJyc7CgkJJHRoaXMtPnJlc3BvbnNlRGF0YSA9ICcnOwoJCSR0aGlzLT5mYXVsdHN0cmluZyA9ICcnOwoJCSR0aGlzLT5mYXVsdGNvZGUgPSAnJzsKCQkkdGhpcy0+b3BEYXRhID0gYXJyYXkoKTsKCQkKCQkkdGhpcy0+ZGVidWcoImNhbGw6IG9wZXJhdGlvbj0kb3BlcmF0aW9uLCBuYW1lc3BhY2U9JG5hbWVzcGFjZSwgc29hcEFjdGlvbj0kc29hcEFjdGlvbiwgcnBjUGFyYW1zPSRycGNQYXJhbXMsIHN0eWxlPSRzdHlsZSwgdXNlPSR1c2UsIGVuZHBvaW50VHlwZT0kdGhpcy0+ZW5kcG9pbnRUeXBlIik7CgkJJHRoaXMtPmFwcGVuZERlYnVnKCdwYXJhbXM9JyAuICR0aGlzLT52YXJEdW1wKCRwYXJhbXMpKTsKCQkkdGhpcy0+YXBwZW5kRGVidWcoJ2hlYWRlcnM9JyAuICR0aGlzLT52YXJEdW1wKCRoZWFkZXJzKSk7CgkJaWYgKCRoZWFkZXJzKSB7CgkJCSR0aGlzLT5yZXF1ZXN0SGVhZGVycyA9ICRoZWFkZXJzOwoJCX0KCQkvLyBzZXJpYWxpemUgcGFyYW1ldGVycwoJCWlmKCR0aGlzLT5lbmRwb2ludFR5cGUgPT0gJ3dzZGwnICYmICRvcERhdGEgPSAkdGhpcy0+Z2V0T3BlcmF0aW9uRGF0YSgkb3BlcmF0aW9uKSl7CgkJCS8vIHVzZSBXU0RMIGZvciBvcGVyYXRpb24KCQkJJHRoaXMtPm9wRGF0YSA9ICRvcERhdGE7CgkJCSR0aGlzLT5kZWJ1ZygiZm91bmQgb3BlcmF0aW9uIik7CgkJCSR0aGlzLT5hcHBlbmREZWJ1Zygnb3BEYXRhPScgLiAkdGhpcy0+dmFyRHVtcCgkb3BEYXRhKSk7CgkJCWlmIChpc3NldCgkb3BEYXRhWydzb2FwQWN0aW9uJ10pKSB7CgkJCQkkc29hcEFjdGlvbiA9ICRvcERhdGFbJ3NvYXBBY3Rpb24nXTsKCQkJfQoJCQlpZiAoISAkdGhpcy0+Zm9yY2VFbmRwb2ludCkgewoJCQkJJHRoaXMtPmVuZHBvaW50ID0gJG9wRGF0YVsnZW5kcG9pbnQnXTsKCQkJfSBlbHNlIHsKCQkJCSR0aGlzLT5lbmRwb2ludCA9ICR0aGlzLT5mb3JjZUVuZHBvaW50OwoJCQl9CgkJCSRuYW1lc3BhY2UgPSBpc3NldCgkb3BEYXRhWydpbnB1dCddWyduYW1lc3BhY2UnXSkgPyAkb3BEYXRhWydpbnB1dCddWyduYW1lc3BhY2UnXSA6CSRuYW1lc3BhY2U7CgkJCSRzdHlsZSA9ICRvcERhdGFbJ3N0eWxlJ107CgkJCSR1c2UgPSAkb3BEYXRhWydpbnB1dCddWyd1c2UnXTsKCQkJLy8gYWRkIG5zIHRvIG5zIGFycmF5CgkJCWlmKCRuYW1lc3BhY2UgIT0gJycgJiYgIWlzc2V0KCR0aGlzLT53c2RsLT5uYW1lc3BhY2VzWyRuYW1lc3BhY2VdKSl7CgkJCQkkbnNQcmVmaXggPSAnbnMnIC4gcmFuZCgxMDAwLCA5OTk5KTsKCQkJCSR0aGlzLT53c2RsLT5uYW1lc3BhY2VzWyRuc1ByZWZpeF0gPSAkbmFtZXNwYWNlOwoJCQl9CiAgICAgICAgICAgICRuc1ByZWZpeCA9ICR0aGlzLT53c2RsLT5nZXRQcmVmaXhGcm9tTmFtZXNwYWNlKCRuYW1lc3BhY2UpOwoJCQkvLyBzZXJpYWxpemUgcGF5bG9hZAoJCQlpZiAoaXNfc3RyaW5nKCRwYXJhbXMpKSB7CgkJCQkkdGhpcy0+ZGVidWcoInNlcmlhbGl6aW5nIHBhcmFtIHN0cmluZyBmb3IgV1NETCBvcGVyYXRpb24gJG9wZXJhdGlvbiIpOwoJCQkJJHBheWxvYWQgPSAkcGFyYW1zOwoJCQl9IGVsc2VpZiAoaXNfYXJyYXkoJHBhcmFtcykpIHsKCQkJCSR0aGlzLT5kZWJ1Zygic2VyaWFsaXppbmcgcGFyYW0gYXJyYXkgZm9yIFdTREwgb3BlcmF0aW9uICRvcGVyYXRpb24iKTsKCQkJCSRwYXlsb2FkID0gJHRoaXMtPndzZGwtPnNlcmlhbGl6ZVJQQ1BhcmFtZXRlcnMoJG9wZXJhdGlvbiwnaW5wdXQnLCRwYXJhbXMpOwoJCQl9IGVsc2UgewoJCQkJJHRoaXMtPmRlYnVnKCdwYXJhbXMgbXVzdCBiZSBhcnJheSBvciBzdHJpbmcnKTsKCQkJCSR0aGlzLT5zZXRFcnJvcigncGFyYW1zIG11c3QgYmUgYXJyYXkgb3Igc3RyaW5nJyk7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KICAgICAgICAgICAgJHVzZWROYW1lc3BhY2VzID0gJHRoaXMtPndzZGwtPnVzZWROYW1lc3BhY2VzOwoJCQlpZiAoaXNzZXQoJG9wRGF0YVsnaW5wdXQnXVsnZW5jb2RpbmdTdHlsZSddKSkgewoJCQkJJGVuY29kaW5nU3R5bGUgPSAkb3BEYXRhWydpbnB1dCddWydlbmNvZGluZ1N0eWxlJ107CgkJCX0gZWxzZSB7CgkJCQkkZW5jb2RpbmdTdHlsZSA9ICcnOwoJCQl9CgkJCSR0aGlzLT5hcHBlbmREZWJ1ZygkdGhpcy0+d3NkbC0+Z2V0RGVidWcoKSk7CgkJCSR0aGlzLT53c2RsLT5jbGVhckRlYnVnKCk7CgkJCWlmICgkZXJyc3RyID0gJHRoaXMtPndzZGwtPmdldEVycm9yKCkpIHsKCQkJCSR0aGlzLT5kZWJ1ZygnZ290IHdzZGwgZXJyb3I6ICcuJGVycnN0cik7CgkJCQkkdGhpcy0+c2V0RXJyb3IoJ3dzZGwgZXJyb3I6ICcuJGVycnN0cik7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQl9IGVsc2VpZigkdGhpcy0+ZW5kcG9pbnRUeXBlID09ICd3c2RsJykgewoJCQkvLyBvcGVyYXRpb24gbm90IGluIFdTREwKCQkJJHRoaXMtPmFwcGVuZERlYnVnKCR0aGlzLT53c2RsLT5nZXREZWJ1ZygpKTsKCQkJJHRoaXMtPndzZGwtPmNsZWFyRGVidWcoKTsKCQkJJHRoaXMtPnNldEVycm9yKCAnb3BlcmF0aW9uICcuJG9wZXJhdGlvbi4nIG5vdCBwcmVzZW50LicpOwoJCQkkdGhpcy0+ZGVidWcoIm9wZXJhdGlvbiAnJG9wZXJhdGlvbicgbm90IHByZXNlbnQuIik7CgkJCXJldHVybiBmYWxzZTsKCQl9IGVsc2UgewoJCQkvLyBubyBXU0RMCgkJCS8vJHRoaXMtPm5hbWVzcGFjZXNbJ25zMSddID0gJG5hbWVzcGFjZTsKCQkJJG5zUHJlZml4ID0gJ25zJyAuIHJhbmQoMTAwMCwgOTk5OSk7CgkJCS8vIHNlcmlhbGl6ZSAKCQkJJHBheWxvYWQgPSAnJzsKCQkJaWYgKGlzX3N0cmluZygkcGFyYW1zKSkgewoJCQkJJHRoaXMtPmRlYnVnKCJzZXJpYWxpemluZyBwYXJhbSBzdHJpbmcgZm9yIG9wZXJhdGlvbiAkb3BlcmF0aW9uIik7CgkJCQkkcGF5bG9hZCA9ICRwYXJhbXM7CgkJCX0gZWxzZWlmIChpc19hcnJheSgkcGFyYW1zKSkgewoJCQkJJHRoaXMtPmRlYnVnKCJzZXJpYWxpemluZyBwYXJhbSBhcnJheSBmb3Igb3BlcmF0aW9uICRvcGVyYXRpb24iKTsKCQkJCWZvcmVhY2goJHBhcmFtcyBhcyAkayA9PiAkdil7CgkJCQkJJHBheWxvYWQgLj0gJHRoaXMtPnNlcmlhbGl6ZV92YWwoJHYsJGssZmFsc2UsZmFsc2UsZmFsc2UsZmFsc2UsJHVzZSk7CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQkkdGhpcy0+ZGVidWcoJ3BhcmFtcyBtdXN0IGJlIGFycmF5IG9yIHN0cmluZycpOwoJCQkJJHRoaXMtPnNldEVycm9yKCdwYXJhbXMgbXVzdCBiZSBhcnJheSBvciBzdHJpbmcnKTsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCQkkdXNlZE5hbWVzcGFjZXMgPSBhcnJheSgpOwoJCQlpZiAoJHVzZSA9PSAnZW5jb2RlZCcpIHsKCQkJCSRlbmNvZGluZ1N0eWxlID0gJ2h0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvJzsKCQkJfSBlbHNlIHsKCQkJCSRlbmNvZGluZ1N0eWxlID0gJyc7CgkJCX0KCQl9CgkJLy8gd3JhcCBSUEMgY2FsbHMgd2l0aCBtZXRob2QgZWxlbWVudAoJCWlmICgkc3R5bGUgPT0gJ3JwYycpIHsKCQkJaWYgKCR1c2UgPT0gJ2xpdGVyYWwnKSB7CgkJCQkkdGhpcy0+ZGVidWcoIndyYXBwaW5nIFJQQyByZXF1ZXN0IHdpdGggbGl0ZXJhbCBtZXRob2QgZWxlbWVudCIpOwoJCQkJaWYgKCRuYW1lc3BhY2UpIHsKCQkJCQkkcGF5bG9hZCA9ICI8JG9wZXJhdGlvbiB4bWxucz1cIiRuYW1lc3BhY2VcIj4iIC4gJHBheWxvYWQgLiAiPC8kb3BlcmF0aW9uPiI7CgkJCQl9IGVsc2UgewoJCQkJCSRwYXlsb2FkID0gIjwkb3BlcmF0aW9uPiIgLiAkcGF5bG9hZCAuICI8LyRvcGVyYXRpb24+IjsKCQkJCX0KCQkJfSBlbHNlIHsKCQkJCSR0aGlzLT5kZWJ1Zygid3JhcHBpbmcgUlBDIHJlcXVlc3Qgd2l0aCBlbmNvZGVkIG1ldGhvZCBlbGVtZW50Iik7CgkJCQlpZiAoJG5hbWVzcGFjZSkgewoJCQkJCSRwYXlsb2FkID0gIjwkbnNQcmVmaXg6JG9wZXJhdGlvbiB4bWxuczokbnNQcmVmaXg9XCIkbmFtZXNwYWNlXCI+IiAuCgkJCQkJCQkJJHBheWxvYWQgLgoJCQkJCQkJCSI8LyRuc1ByZWZpeDokb3BlcmF0aW9uPiI7CgkJCQl9IGVsc2UgewoJCQkJCSRwYXlsb2FkID0gIjwkb3BlcmF0aW9uPiIgLgoJCQkJCQkJCSRwYXlsb2FkIC4KCQkJCQkJCQkiPC8kb3BlcmF0aW9uPiI7CgkJCQl9CgkJCX0KCQl9CgkJLy8gc2VyaWFsaXplIGVudmVsb3BlCgkJJHNvYXBtc2cgPSAkdGhpcy0+c2VyaWFsaXplRW52ZWxvcGUoJHBheWxvYWQsJHRoaXMtPnJlcXVlc3RIZWFkZXJzLCR1c2VkTmFtZXNwYWNlcywkc3R5bGUsJHVzZSwkZW5jb2RpbmdTdHlsZSk7CgkJJHRoaXMtPmRlYnVnKCJlbmRwb2ludD0kdGhpcy0+ZW5kcG9pbnQsIHNvYXBBY3Rpb249JHNvYXBBY3Rpb24sIG5hbWVzcGFjZT0kbmFtZXNwYWNlLCBzdHlsZT0kc3R5bGUsIHVzZT0kdXNlLCBlbmNvZGluZ1N0eWxlPSRlbmNvZGluZ1N0eWxlIik7CgkJJHRoaXMtPmRlYnVnKCdTT0FQIG1lc3NhZ2UgbGVuZ3RoPScgLiBzdHJsZW4oJHNvYXBtc2cpIC4gJyBjb250ZW50cyAobWF4IDEwMDAgYnl0ZXMpPScgLiBzdWJzdHIoJHNvYXBtc2csIDAsIDEwMDApKTsKCQkvLyBzZW5kCgkJJHJldHVybiA9ICR0aGlzLT5zZW5kKCR0aGlzLT5nZXRIVFRQQm9keSgkc29hcG1zZyksJHNvYXBBY3Rpb24sJHRoaXMtPnRpbWVvdXQsJHRoaXMtPnJlc3BvbnNlX3RpbWVvdXQpOwoJCWlmKCRlcnJzdHIgPSAkdGhpcy0+Z2V0RXJyb3IoKSl7CgkJCSR0aGlzLT5kZWJ1ZygnRXJyb3I6ICcuJGVycnN0cik7CgkJCXJldHVybiBmYWxzZTsKCQl9IGVsc2UgewoJCQkkdGhpcy0+cmV0dXJuID0gJHJldHVybjsKCQkJJHRoaXMtPmRlYnVnKCdzZW50IG1lc3NhZ2Ugc3VjY2Vzc2Z1bGx5IGFuZCBnb3QgYShuKSAnLmdldHR5cGUoJHJldHVybikpOwogICAgICAgICAgIAkkdGhpcy0+YXBwZW5kRGVidWcoJ3JldHVybj0nIC4gJHRoaXMtPnZhckR1bXAoJHJldHVybikpOwoJCQkKCQkJLy8gZmF1bHQ/CgkJCWlmKGlzX2FycmF5KCRyZXR1cm4pICYmIGlzc2V0KCRyZXR1cm5bJ2ZhdWx0Y29kZSddKSl7CgkJCQkkdGhpcy0+ZGVidWcoJ2dvdCBmYXVsdCcpOwoJCQkJJHRoaXMtPnNldEVycm9yKCRyZXR1cm5bJ2ZhdWx0Y29kZSddLic6ICcuJHJldHVyblsnZmF1bHRzdHJpbmcnXSk7CgkJCQkkdGhpcy0+ZmF1bHQgPSB0cnVlOwoJCQkJZm9yZWFjaCgkcmV0dXJuIGFzICRrID0+ICR2KXsKCQkJCQkkdGhpcy0+JGsgPSAkdjsKCQkJCQkkdGhpcy0+ZGVidWcoIiRrID0gJHY8YnI+Iik7CgkJCQl9CgkJCQlyZXR1cm4gJHJldHVybjsKCQkJfSBlbHNlaWYgKCRzdHlsZSA9PSAnZG9jdW1lbnQnKSB7CgkJCQkvLyBOT1RFOiBpZiB0aGUgcmVzcG9uc2UgaXMgZGVmaW5lZCB0byBoYXZlIG11bHRpcGxlIHBhcnRzIChpLmUuIHVud3JhcHBlZCksCgkJCQkvLyB3ZSBhcmUgb25seSBnb2luZyB0byByZXR1cm4gdGhlIGZpcnN0IHBhcnQgaGVyZS4uLnNvcnJ5IGFib3V0IHRoYXQKCQkJCXJldHVybiAkcmV0dXJuOwoJCQl9IGVsc2UgewoJCQkJLy8gYXJyYXkgb2YgcmV0dXJuIHZhbHVlcwoJCQkJaWYoaXNfYXJyYXkoJHJldHVybikpewoJCQkJCS8vIG11bHRpcGxlICdvdXQnIHBhcmFtZXRlcnMsIHdoaWNoIHdlIHJldHVybiB3cmFwcGVkIHVwCgkJCQkJLy8gaW4gdGhlIGFycmF5CgkJCQkJaWYoc2l6ZW9mKCRyZXR1cm4pID4gMSl7CgkJCQkJCXJldHVybiAkcmV0dXJuOwoJCQkJCX0KCQkJCQkvLyBzaW5nbGUgJ291dCcgcGFyYW1ldGVyIChub3JtYWxseSB0aGUgcmV0dXJuIHZhbHVlKQoJCQkJCSRyZXR1cm4gPSBhcnJheV9zaGlmdCgkcmV0dXJuKTsKCQkJCQkkdGhpcy0+ZGVidWcoJ3JldHVybiBzaGlmdGVkIHZhbHVlOiAnKTsKCQkJCQkkdGhpcy0+YXBwZW5kRGVidWcoJHRoaXMtPnZhckR1bXAoJHJldHVybikpOwogICAgICAgICAgIAkJCXJldHVybiAkcmV0dXJuOwoJCQkJLy8gbm90aGluZyByZXR1cm5lZCAoaWUsIGVjaG9Wb2lkKQoJCQkJfSBlbHNlIHsKCQkJCQlyZXR1cm4gIiI7CgkJCQl9CgkJCX0KCQl9Cgl9CgoJLyoqCgkqIGdldCBhdmFpbGFibGUgZGF0YSBwZXJ0YWluaW5nIHRvIGFuIG9wZXJhdGlvbgoJKgoJKiBAcGFyYW0gICAgc3RyaW5nICRvcGVyYXRpb24gb3BlcmF0aW9uIG5hbWUKCSogQHJldHVybglhcnJheSBhcnJheSBvZiBkYXRhIHBlcnRhaW5pbmcgdG8gdGhlIG9wZXJhdGlvbgoJKiBAYWNjZXNzICAgcHVibGljCgkqLwoJZnVuY3Rpb24gZ2V0T3BlcmF0aW9uRGF0YSgkb3BlcmF0aW9uKXsKCQlpZihpc3NldCgkdGhpcy0+b3BlcmF0aW9uc1skb3BlcmF0aW9uXSkpewoJCQlyZXR1cm4gJHRoaXMtPm9wZXJhdGlvbnNbJG9wZXJhdGlvbl07CgkJfQoJCSR0aGlzLT5kZWJ1ZygiTm8gZGF0YSBmb3Igb3BlcmF0aW9uOiAkb3BlcmF0aW9uIik7Cgl9CgogICAgLyoqCiAgICAqIHNlbmQgdGhlIFNPQVAgbWVzc2FnZQogICAgKgogICAgKiBOb3RlOiBpZiB0aGUgb3BlcmF0aW9uIGhhcyBtdWx0aXBsZSByZXR1cm4gdmFsdWVzCiAgICAqIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhpcyBtZXRob2Qgd2lsbCBiZSBhbiBhcnJheQogICAgKiBvZiB0aG9zZSB2YWx1ZXMuCiAgICAqCgkqIEBwYXJhbSAgICBzdHJpbmcgJG1zZyBhIFNPQVB4NCBzb2FwbXNnIG9iamVjdAoJKiBAcGFyYW0gICAgc3RyaW5nICRzb2FwYWN0aW9uIFNPQVBBY3Rpb24gdmFsdWUKCSogQHBhcmFtICAgIGludGVnZXIgJHRpbWVvdXQgc2V0IGNvbm5lY3Rpb24gdGltZW91dCBpbiBzZWNvbmRzCgkqIEBwYXJhbQlpbnRlZ2VyICRyZXNwb25zZV90aW1lb3V0IHNldCByZXNwb25zZSB0aW1lb3V0IGluIHNlY29uZHMKCSogQHJldHVybgltaXhlZCBuYXRpdmUgUEhQIHR5cGVzLgoJKiBAYWNjZXNzICAgcHJpdmF0ZQoJKi8KCWZ1bmN0aW9uIHNlbmQoJG1zZywgJHNvYXBhY3Rpb24gPSAnJywgJHRpbWVvdXQ9MCwgJHJlc3BvbnNlX3RpbWVvdXQ9MzApIHsKCQkkdGhpcy0+Y2hlY2tDb29raWVzKCk7CgkJLy8gZGV0ZWN0IHRyYW5zcG9ydAoJCXN3aXRjaCh0cnVlKXsKCQkJLy8gaHR0cChzKQoJCQljYXNlIGVyZWcoJ15odHRwJywkdGhpcy0+ZW5kcG9pbnQpOgoJCQkJJHRoaXMtPmRlYnVnKCd0cmFuc3BvcnRpbmcgdmlhIEhUVFAnKTsKCQkJCWlmKCR0aGlzLT5wZXJzaXN0ZW50Q29ubmVjdGlvbiA9PSB0cnVlICYmIGlzX29iamVjdCgkdGhpcy0+cGVyc2lzdGVudENvbm5lY3Rpb24pKXsKCQkJCQkkaHR0cCA9JiAkdGhpcy0+cGVyc2lzdGVudENvbm5lY3Rpb247CgkJCQl9IGVsc2UgewoJCQkJCSRodHRwID0gbmV3IHNvYXBfdHJhbnNwb3J0X2h0dHAoJHRoaXMtPmVuZHBvaW50KTsKCQkJCQlpZiAoJHRoaXMtPnBlcnNpc3RlbnRDb25uZWN0aW9uKSB7CgkJCQkJCSRodHRwLT51c2VQZXJzaXN0ZW50Q29ubmVjdGlvbigpOwoJCQkJCX0KCQkJCX0KCQkJCSRodHRwLT5zZXRDb250ZW50VHlwZSgkdGhpcy0+Z2V0SFRUUENvbnRlbnRUeXBlKCksICR0aGlzLT5nZXRIVFRQQ29udGVudFR5cGVDaGFyc2V0KCkpOwoJCQkJJGh0dHAtPnNldFNPQVBBY3Rpb24oJHNvYXBhY3Rpb24pOwoJCQkJaWYoJHRoaXMtPnByb3h5aG9zdCAmJiAkdGhpcy0+cHJveHlwb3J0KXsKCQkJCQkkaHR0cC0+c2V0UHJveHkoJHRoaXMtPnByb3h5aG9zdCwkdGhpcy0+cHJveHlwb3J0LCR0aGlzLT5wcm94eXVzZXJuYW1lLCR0aGlzLT5wcm94eXBhc3N3b3JkKTsKCQkJCX0KICAgICAgICAgICAgICAgIGlmKCR0aGlzLT5hdXRodHlwZSAhPSAnJykgewoJCQkJCSRodHRwLT5zZXRDcmVkZW50aWFscygkdGhpcy0+dXNlcm5hbWUsICR0aGlzLT5wYXNzd29yZCwgJHRoaXMtPmF1dGh0eXBlLCBhcnJheSgpLCAkdGhpcy0+Y2VydFJlcXVlc3QpOwoJCQkJfQoJCQkJaWYoJHRoaXMtPmh0dHBfZW5jb2RpbmcgIT0gJycpewoJCQkJCSRodHRwLT5zZXRFbmNvZGluZygkdGhpcy0+aHR0cF9lbmNvZGluZyk7CgkJCQl9CgkJCQkkdGhpcy0+ZGVidWcoJ3NlbmRpbmcgbWVzc2FnZSwgbGVuZ3RoPScuc3RybGVuKCRtc2cpKTsKCQkJCWlmKGVyZWcoJ15odHRwOicsJHRoaXMtPmVuZHBvaW50KSl7CgkJCQkvL2lmKHN0cnBvcygkdGhpcy0+ZW5kcG9pbnQsJ2h0dHA6JykpewoJCQkJCSR0aGlzLT5yZXNwb25zZURhdGEgPSAkaHR0cC0+c2VuZCgkbXNnLCR0aW1lb3V0LCRyZXNwb25zZV90aW1lb3V0LCR0aGlzLT5jb29raWVzKTsKCQkJCX0gZWxzZWlmKGVyZWcoJ15odHRwcycsJHRoaXMtPmVuZHBvaW50KSl7CgkJCQkvL30gZWxzZWlmKHN0cnBvcygkdGhpcy0+ZW5kcG9pbnQsJ2h0dHBzOicpKXsKCQkJCQkvL2lmKHBocHZlcnNpb24oKSA9PSAnNC4zLjAtZGV2Jyl7CgkJCQkJCS8vJHJlc3BvbnNlID0gJGh0dHAtPnNlbmQoJG1zZywkdGltZW91dCwkcmVzcG9uc2VfdGltZW91dCk7CiAgICAgICAgICAgICAgICAgICAJCS8vJHRoaXMtPnJlcXVlc3QgPSAkaHR0cC0+b3V0Z29pbmdfcGF5bG9hZDsKCQkJCQkJLy8kdGhpcy0+cmVzcG9uc2UgPSAkaHR0cC0+aW5jb21pbmdfcGF5bG9hZDsKCQkJCQkvL30gZWxzZQoJCQkJCSR0aGlzLT5yZXNwb25zZURhdGEgPSAkaHR0cC0+c2VuZEhUVFBTKCRtc2csJHRpbWVvdXQsJHJlc3BvbnNlX3RpbWVvdXQsJHRoaXMtPmNvb2tpZXMpOwoJCQkJfSBlbHNlIHsKCQkJCQkkdGhpcy0+c2V0RXJyb3IoJ25vIGh0dHAvcyBpbiBlbmRwb2ludCB1cmwnKTsKCQkJCX0KCQkJCSR0aGlzLT5yZXF1ZXN0ID0gJGh0dHAtPm91dGdvaW5nX3BheWxvYWQ7CgkJCQkkdGhpcy0+cmVzcG9uc2UgPSAkaHR0cC0+aW5jb21pbmdfcGF5bG9hZDsKCQkJCSR0aGlzLT5hcHBlbmREZWJ1ZygkaHR0cC0+Z2V0RGVidWcoKSk7CgkJCQkkdGhpcy0+VXBkYXRlQ29va2llcygkaHR0cC0+aW5jb21pbmdfY29va2llcyk7CgoJCQkJLy8gc2F2ZSB0cmFuc3BvcnQgb2JqZWN0IGlmIHVzaW5nIHBlcnNpc3RlbnQgY29ubmVjdGlvbnMKCQkJCWlmICgkdGhpcy0+cGVyc2lzdGVudENvbm5lY3Rpb24pIHsKCQkJCQkkaHR0cC0+Y2xlYXJEZWJ1ZygpOwoJCQkJCWlmICghaXNfb2JqZWN0KCR0aGlzLT5wZXJzaXN0ZW50Q29ubmVjdGlvbikpIHsKCQkJCQkJJHRoaXMtPnBlcnNpc3RlbnRDb25uZWN0aW9uID0gJGh0dHA7CgkJCQkJfQoJCQkJfQoJCQkJCgkJCQlpZigkZXJyID0gJGh0dHAtPmdldEVycm9yKCkpewoJCQkJCSR0aGlzLT5zZXRFcnJvcignSFRUUCBFcnJvcjogJy4kZXJyKTsKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9IGVsc2VpZigkdGhpcy0+Z2V0RXJyb3IoKSl7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfSBlbHNlIHsKCQkJCQkkdGhpcy0+ZGVidWcoJ2dvdCByZXNwb25zZSwgbGVuZ3RoPScuIHN0cmxlbigkdGhpcy0+cmVzcG9uc2VEYXRhKS4nIHR5cGU9Jy4kaHR0cC0+aW5jb21pbmdfaGVhZGVyc1snY29udGVudC10eXBlJ10pOwoJCQkJCXJldHVybiAkdGhpcy0+cGFyc2VSZXNwb25zZSgkaHR0cC0+aW5jb21pbmdfaGVhZGVycywgJHRoaXMtPnJlc3BvbnNlRGF0YSk7CgkJCQl9CgkJCWJyZWFrOwoJCQlkZWZhdWx0OgoJCQkJJHRoaXMtPnNldEVycm9yKCdubyB0cmFuc3BvcnQgZm91bmQsIG9yIHNlbGVjdGVkIHRyYW5zcG9ydCBpcyBub3QgeWV0IHN1cHBvcnRlZCEnKTsKCQkJcmV0dXJuIGZhbHNlOwoJCQlicmVhazsKCQl9Cgl9CgoJLyoqCgkqIHByb2Nlc3NlcyBTT0FQIG1lc3NhZ2UgcmV0dXJuZWQgZnJvbSBzZXJ2ZXIKCSoKCSogQHBhcmFtCWFycmF5CSRoZWFkZXJzCVRoZSBIVFRQIGhlYWRlcnMKCSogQHBhcmFtCXN0cmluZwkkZGF0YQkJdW5wcm9jZXNzZWQgcmVzcG9uc2UgZGF0YSBmcm9tIHNlcnZlcgoJKiBAcmV0dXJuCW1peGVkCXZhbHVlIG9mIHRoZSBtZXNzYWdlLCBkZWNvZGVkIGludG8gYSBQSFAgdHlwZQoJKiBAYWNjZXNzICAgcHJpdmF0ZQoJKi8KICAgIGZ1bmN0aW9uIHBhcnNlUmVzcG9uc2UoJGhlYWRlcnMsICRkYXRhKSB7CgkJJHRoaXMtPmRlYnVnKCdFbnRlcmluZyBwYXJzZVJlc3BvbnNlKCkgZm9yIGRhdGEgb2YgbGVuZ3RoICcgLiBzdHJsZW4oJGRhdGEpIC4gJyBhbmQgdHlwZSAnIC4gJGhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddKTsKCQlpZiAoIXN0cnN0cigkaGVhZGVyc1snY29udGVudC10eXBlJ10sICd0ZXh0L3htbCcpKSB7CgkJCSR0aGlzLT5zZXRFcnJvcignUmVzcG9uc2Ugbm90IG9mIHR5cGUgdGV4dC94bWwnKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQlpZiAoc3RycG9zKCRoZWFkZXJzWydjb250ZW50LXR5cGUnXSwgJz0nKSkgewoJCQkkZW5jID0gc3RyX3JlcGxhY2UoJyInLCAnJywgc3Vic3RyKHN0cnN0cigkaGVhZGVyc1siY29udGVudC10eXBlIl0sICc9JyksIDEpKTsKCQkJJHRoaXMtPmRlYnVnKCdHb3QgcmVzcG9uc2UgZW5jb2Rpbmc6ICcgLiAkZW5jKTsKCQkJaWYoZXJlZ2koJ14oSVNPLTg4NTktMXxVUy1BU0NJSXxVVEYtOCkkJywkZW5jKSl7CgkJCQkkdGhpcy0+eG1sX2VuY29kaW5nID0gc3RydG91cHBlcigkZW5jKTsKCQkJfSBlbHNlIHsKCQkJCSR0aGlzLT54bWxfZW5jb2RpbmcgPSAnVVMtQVNDSUknOwoJCQl9CgkJfSBlbHNlIHsKCQkJLy8gc2hvdWxkIGJlIFVTLUFTQ0lJIGZvciBIVFRQIDEuMCBvciBJU08tODg1OS0xIGZvciBIVFRQIDEuMQoJCQkkdGhpcy0+eG1sX2VuY29kaW5nID0gJ0lTTy04ODU5LTEnOwoJCX0KCQkkdGhpcy0+ZGVidWcoJ1VzZSBlbmNvZGluZzogJyAuICR0aGlzLT54bWxfZW5jb2RpbmcgLiAnIHdoZW4gY3JlYXRpbmcgc29hcF9wYXJzZXInKTsKCQkkcGFyc2VyID0gbmV3IHNvYXBfcGFyc2VyKCRkYXRhLCR0aGlzLT54bWxfZW5jb2RpbmcsJHRoaXMtPm9wZXJhdGlvbiwkdGhpcy0+ZGVjb2RlX3V0ZjgpOwoJCS8vIGFkZCBwYXJzZXIgZGVidWcgZGF0YSB0byBvdXIgZGVidWcKCQkkdGhpcy0+YXBwZW5kRGVidWcoJHBhcnNlci0+Z2V0RGVidWcoKSk7CgkJLy8gaWYgcGFyc2UgZXJyb3JzCgkJaWYoJGVycnN0ciA9ICRwYXJzZXItPmdldEVycm9yKCkpewoJCQkkdGhpcy0+c2V0RXJyb3IoICRlcnJzdHIpOwoJCQkvLyBkZXN0cm95IHRoZSBwYXJzZXIgb2JqZWN0CgkJCXVuc2V0KCRwYXJzZXIpOwoJCQlyZXR1cm4gZmFsc2U7CgkJfSBlbHNlIHsKCQkJLy8gZ2V0IFNPQVAgaGVhZGVycwoJCQkkdGhpcy0+cmVzcG9uc2VIZWFkZXJzID0gJHBhcnNlci0+Z2V0SGVhZGVycygpOwoJCQkvLyBnZXQgZGVjb2RlZCBtZXNzYWdlCgkJCSRyZXR1cm4gPSAkcGFyc2VyLT5nZXRfcmVzcG9uc2UoKTsKICAgICAgICAgICAgLy8gYWRkIGRvY3VtZW50IGZvciBkb2NsaXQgc3VwcG9ydAogICAgICAgICAgICAkdGhpcy0+ZG9jdW1lbnQgPSAkcGFyc2VyLT5kb2N1bWVudDsKCQkJLy8gZGVzdHJveSB0aGUgcGFyc2VyIG9iamVjdAoJCQl1bnNldCgkcGFyc2VyKTsKCQkJLy8gcmV0dXJuIGRlY29kZSBtZXNzYWdlCgkJCXJldHVybiAkcmV0dXJuOwoJCX0KCSB9CgoJLyoqCgkqIHNldHMgdGhlIFNPQVAgZW5kcG9pbnQsIHdoaWNoIGNhbiBvdmVycmlkZSBXU0RMCgkqCgkqIEBwYXJhbQkkZW5kcG9pbnQgc3RyaW5nIFRoZSBlbmRwb2ludCBVUkwgdG8gdXNlLCBvciBlbXB0eSBzdHJpbmcgb3IgZmFsc2UgdG8gcHJldmVudCBvdmVycmlkZQoJKiBAYWNjZXNzICAgcHVibGljCgkqLwoJZnVuY3Rpb24gc2V0RW5kcG9pbnQoJGVuZHBvaW50KSB7CgkJJHRoaXMtPmZvcmNlRW5kcG9pbnQgPSAkZW5kcG9pbnQ7Cgl9CgoJLyoqCgkqIHNldCB0aGUgU09BUCBoZWFkZXJzCgkqCgkqIEBwYXJhbQkkaGVhZGVycyBtaXhlZCBTdHJpbmcgb2YgWE1MIHdpdGggU09BUCBoZWFkZXIgY29udGVudCwgb3IgYXJyYXkgb2Ygc29hcHZhbCBvYmplY3RzIGZvciBTT0FQIGhlYWRlcnMKCSogQGFjY2VzcyAgIHB1YmxpYwoJKi8KCWZ1bmN0aW9uIHNldEhlYWRlcnMoJGhlYWRlcnMpewoJCSR0aGlzLT5yZXF1ZXN0SGVhZGVycyA9ICRoZWFkZXJzOwoJfQoKCS8qKgoJKiBnZXQgdGhlIFNPQVAgcmVzcG9uc2UgaGVhZGVycyAobmFtZXNwYWNlIHJlc29sdXRpb24gaW5jb21wbGV0ZSkKCSoKCSogQHJldHVybglzdHJpbmcKCSogQGFjY2VzcyAgIHB1YmxpYwoJKi8KCWZ1bmN0aW9uIGdldEhlYWRlcnMoKXsKCQlyZXR1cm4gJHRoaXMtPnJlc3BvbnNlSGVhZGVyczsKCX0KCgkvKioKCSogc2V0IHByb3h5IGluZm8gaGVyZQoJKgoJKiBAcGFyYW0gICAgc3RyaW5nICRwcm94eWhvc3QKCSogQHBhcmFtICAgIHN0cmluZyAkcHJveHlwb3J0CgkqIEBwYXJhbQlzdHJpbmcgJHByb3h5dXNlcm5hbWUKCSogQHBhcmFtCXN0cmluZyAkcHJveHlwYXNzd29yZAoJKiBAYWNjZXNzICAgcHVibGljCgkqLwoJZnVuY3Rpb24gc2V0SFRUUFByb3h5KCRwcm94eWhvc3QsICRwcm94eXBvcnQsICRwcm94eXVzZXJuYW1lID0gJycsICRwcm94eXBhc3N3b3JkID0gJycpIHsKCQkkdGhpcy0+cHJveHlob3N0ID0gJHByb3h5aG9zdDsKCQkkdGhpcy0+cHJveHlwb3J0ID0gJHByb3h5cG9ydDsKCQkkdGhpcy0+cHJveHl1c2VybmFtZSA9ICRwcm94eXVzZXJuYW1lOwoJCSR0aGlzLT5wcm94eXBhc3N3b3JkID0gJHByb3h5cGFzc3dvcmQ7Cgl9CgoJLyoqCgkqIGlmIGF1dGhlbnRpY2F0aW5nLCBzZXQgdXNlciBjcmVkZW50aWFscyBoZXJlCgkqCgkqIEBwYXJhbSAgICBzdHJpbmcgJHVzZXJuYW1lCgkqIEBwYXJhbSAgICBzdHJpbmcgJHBhc3N3b3JkCgkqIEBwYXJhbQlzdHJpbmcgJGF1dGh0eXBlIChiYXNpY3xkaWdlc3R8Y2VydGlmaWNhdGUpCgkqIEBwYXJhbQlhcnJheSAkY2VydFJlcXVlc3QgKGtleXMgbXVzdCBiZSBjYWluZm9maWxlIChvcHRpb25hbCksIHNzbGNlcnRmaWxlLCBzc2xrZXlmaWxlLCBwYXNzcGhyYXNlLCB2ZXJpZnlwZWVyIChvcHRpb25hbCksIHZlcmlmeWhvc3QgKG9wdGlvbmFsKTogc2VlIGNvcnJlc3BvbmRpbmcgb3B0aW9ucyBpbiBjVVJMIGRvY3MpCgkqIEBhY2Nlc3MgICBwdWJsaWMKCSovCglmdW5jdGlvbiBzZXRDcmVkZW50aWFscygkdXNlcm5hbWUsICRwYXNzd29yZCwgJGF1dGh0eXBlID0gJ2Jhc2ljJywgJGNlcnRSZXF1ZXN0ID0gYXJyYXkoKSkgewoJCSR0aGlzLT51c2VybmFtZSA9ICR1c2VybmFtZTsKCQkkdGhpcy0+cGFzc3dvcmQgPSAkcGFzc3dvcmQ7CgkJJHRoaXMtPmF1dGh0eXBlID0gJGF1dGh0eXBlOwoJCSR0aGlzLT5jZXJ0UmVxdWVzdCA9ICRjZXJ0UmVxdWVzdDsKCX0KCQoJLyoqCgkqIHVzZSBIVFRQIGVuY29kaW5nCgkqCgkqIEBwYXJhbSAgICBzdHJpbmcgJGVuYwoJKiBAYWNjZXNzICAgcHVibGljCgkqLwoJZnVuY3Rpb24gc2V0SFRUUEVuY29kaW5nKCRlbmM9J2d6aXAsIGRlZmxhdGUnKXsKCQkkdGhpcy0+aHR0cF9lbmNvZGluZyA9ICRlbmM7Cgl9CgkKCS8qKgoJKiB1c2UgSFRUUCBwZXJzaXN0ZW50IGNvbm5lY3Rpb25zIGlmIHBvc3NpYmxlCgkqCgkqIEBhY2Nlc3MgICBwdWJsaWMKCSovCglmdW5jdGlvbiB1c2VIVFRQUGVyc2lzdGVudENvbm5lY3Rpb24oKXsKCQkkdGhpcy0+cGVyc2lzdGVudENvbm5lY3Rpb24gPSB0cnVlOwoJfQoJCgkvKioKCSogZ2V0cyB0aGUgZGVmYXVsdCBSUEMgcGFyYW1ldGVyIHNldHRpbmcuCgkqIElmIHRydWUsIGRlZmF1bHQgaXMgdGhhdCBjYWxsIHBhcmFtcyBhcmUgbGlrZSBSUEMgZXZlbiBmb3IgZG9jdW1lbnQgc3R5bGUuCgkqIEVhY2ggY2FsbCgpIGNhbiBvdmVycmlkZSB0aGlzIHZhbHVlLgoJKgoJKiBUaGlzIGlzIG5vIGxvbmdlciB1c2VkLgoJKgoJKiBAcmV0dXJuIGJvb2xlYW4KCSogQGFjY2VzcyBwdWJsaWMKCSogQGRlcHJlY2F0ZWQKCSovCglmdW5jdGlvbiBnZXREZWZhdWx0UnBjUGFyYW1zKCkgewoJCXJldHVybiAkdGhpcy0+ZGVmYXVsdFJwY1BhcmFtczsKCX0KCgkvKioKCSogc2V0cyB0aGUgZGVmYXVsdCBSUEMgcGFyYW1ldGVyIHNldHRpbmcuCgkqIElmIHRydWUsIGRlZmF1bHQgaXMgdGhhdCBjYWxsIHBhcmFtcyBhcmUgbGlrZSBSUEMgZXZlbiBmb3IgZG9jdW1lbnQgc3R5bGUKCSogRWFjaCBjYWxsKCkgY2FuIG92ZXJyaWRlIHRoaXMgdmFsdWUuCgkqCgkqIFRoaXMgaXMgbm8gbG9uZ2VyIHVzZWQuCgkqCgkqIEBwYXJhbSAgICBib29sZWFuICRycGNQYXJhbXMKCSogQGFjY2VzcyBwdWJsaWMKCSogQGRlcHJlY2F0ZWQKCSovCglmdW5jdGlvbiBzZXREZWZhdWx0UnBjUGFyYW1zKCRycGNQYXJhbXMpIHsKCQkkdGhpcy0+ZGVmYXVsdFJwY1BhcmFtcyA9ICRycGNQYXJhbXM7Cgl9CgkKCS8qKgoJKiBkeW5hbWljYWxseSBjcmVhdGVzIGFuIGluc3RhbmNlIG9mIGEgcHJveHkgY2xhc3MsCgkqIGFsbG93aW5nIHVzZXIgdG8gZGlyZWN0bHkgY2FsbCBtZXRob2RzIGZyb20gd3NkbAoJKgoJKiBAcmV0dXJuICAgb2JqZWN0IHNvYXBfcHJveHkgb2JqZWN0CgkqIEBhY2Nlc3MgICBwdWJsaWMKCSovCglmdW5jdGlvbiBnZXRQcm94eSgpewoJCSRyID0gcmFuZCgpOwoJCSRldmFsU3RyID0gJHRoaXMtPl9nZXRQcm94eUNsYXNzQ29kZSgkcik7CgkJLy8kdGhpcy0+ZGVidWcoInByb3h5IGNsYXNzOiAkZXZhbFN0ciI7CgkJLy8gZXZhbCB0aGUgY2xhc3MKCQlldmFsKCRldmFsU3RyKTsKCQkvLyBpbnN0YW50aWF0ZSBwcm94eSBvYmplY3QKCQlldmFsKCJcJHByb3h5ID0gbmV3IHNvYXBfcHJveHlfJHIoJycpOyIpOwoJCS8vIHRyYW5zZmVyIGN1cnJlbnQgd3NkbCBkYXRhIHRvIHRoZSBwcm94eSB0aGVyZWJ5IGF2b2lkaW5nIHBhcnNpbmcgdGhlIHdzZGwgdHdpY2UKCQkkcHJveHktPmVuZHBvaW50VHlwZSA9ICd3c2RsJzsKCQkkcHJveHktPndzZGxGaWxlID0gJHRoaXMtPndzZGxGaWxlOwoJCSRwcm94eS0+d3NkbCA9ICR0aGlzLT53c2RsOwoJCSRwcm94eS0+b3BlcmF0aW9ucyA9ICR0aGlzLT5vcGVyYXRpb25zOwoJCSRwcm94eS0+ZGVmYXVsdFJwY1BhcmFtcyA9ICR0aGlzLT5kZWZhdWx0UnBjUGFyYW1zOwoJCS8vIHRyYW5zZmVyIG90aGVyIHN0YXRlCgkJJHByb3h5LT51c2VybmFtZSA9ICR0aGlzLT51c2VybmFtZTsKCQkkcHJveHktPnBhc3N3b3JkID0gJHRoaXMtPnBhc3N3b3JkOwoJCSRwcm94eS0+YXV0aHR5cGUgPSAkdGhpcy0+YXV0aHR5cGU7CgkJJHByb3h5LT5wcm94eWhvc3QgPSAkdGhpcy0+cHJveHlob3N0OwoJCSRwcm94eS0+cHJveHlwb3J0ID0gJHRoaXMtPnByb3h5cG9ydDsKCQkkcHJveHktPnByb3h5dXNlcm5hbWUgPSAkdGhpcy0+cHJveHl1c2VybmFtZTsKCQkkcHJveHktPnByb3h5cGFzc3dvcmQgPSAkdGhpcy0+cHJveHlwYXNzd29yZDsKCQkkcHJveHktPnRpbWVvdXQgPSAkdGhpcy0+dGltZW91dDsKCQkkcHJveHktPnJlc3BvbnNlX3RpbWVvdXQgPSAkdGhpcy0+cmVzcG9uc2VfdGltZW91dDsKCQkkcHJveHktPmh0dHBfZW5jb2RpbmcgPSAkdGhpcy0+aHR0cF9lbmNvZGluZzsKCQkkcHJveHktPnBlcnNpc3RlbnRDb25uZWN0aW9uID0gJHRoaXMtPnBlcnNpc3RlbnRDb25uZWN0aW9uOwoJCSRwcm94eS0+cmVxdWVzdEhlYWRlcnMgPSAkdGhpcy0+cmVxdWVzdEhlYWRlcnM7CgkJJHByb3h5LT5zb2FwX2RlZmVuY29kaW5nID0gJHRoaXMtPnNvYXBfZGVmZW5jb2Rpbmc7CgkJJHByb3h5LT5lbmRwb2ludCA9ICR0aGlzLT5lbmRwb2ludDsKCQkkcHJveHktPmZvcmNlRW5kcG9pbnQgPSAkdGhpcy0+Zm9yY2VFbmRwb2ludDsKCQlyZXR1cm4gJHByb3h5OwoJfQoKCS8qKgoJKiBkeW5hbWljYWxseSBjcmVhdGVzIHByb3h5IGNsYXNzIGNvZGUKCSoKCSogQHJldHVybiAgIHN0cmluZyBQSFAvTnVTT0FQIGNvZGUgZm9yIHRoZSBwcm94eSBjbGFzcwoJKiBAYWNjZXNzICAgcHJpdmF0ZQoJKi8KCWZ1bmN0aW9uIF9nZXRQcm94eUNsYXNzQ29kZSgkcikgewoJCWlmICgkdGhpcy0+ZW5kcG9pbnRUeXBlICE9ICd3c2RsJykgewoJCQkkZXZhbFN0ciA9ICdBIHByb3h5IGNhbiBvbmx5IGJlIGNyZWF0ZWQgZm9yIGEgV1NETCBjbGllbnQnOwoJCQkkdGhpcy0+c2V0RXJyb3IoJGV2YWxTdHIpOwoJCQlyZXR1cm4gJGV2YWxTdHI7CgkJfQoJCSRldmFsU3RyID0gJyc7CgkJZm9yZWFjaCAoJHRoaXMtPm9wZXJhdGlvbnMgYXMgJG9wZXJhdGlvbiA9PiAkb3BEYXRhKSB7CgkJCWlmICgkb3BlcmF0aW9uICE9ICcnKSB7CgkJCQkvLyBjcmVhdGUgcGFyYW0gc3RyaW5nIGFuZCBwYXJhbSBjb21tZW50IHN0cmluZwoJCQkJaWYgKHNpemVvZigkb3BEYXRhWydpbnB1dCddWydwYXJ0cyddKSA+IDApIHsKCQkJCQkkcGFyYW1TdHIgPSAnJzsKCQkJCQkkcGFyYW1BcnJheVN0ciA9ICcnOwoJCQkJCSRwYXJhbUNvbW1lbnRTdHIgPSAnJzsKCQkJCQlmb3JlYWNoICgkb3BEYXRhWydpbnB1dCddWydwYXJ0cyddIGFzICRuYW1lID0+ICR0eXBlKSB7CgkJCQkJCSRwYXJhbVN0ciAuPSAiXCQkbmFtZSwgIjsKCQkJCQkJJHBhcmFtQXJyYXlTdHIgLj0gIickbmFtZScgPT4gXCQkbmFtZSwgIjsKCQkJCQkJJHBhcmFtQ29tbWVudFN0ciAuPSAiJHR5cGUgXCQkbmFtZSwgIjsKCQkJCQl9CgkJCQkJJHBhcmFtU3RyID0gc3Vic3RyKCRwYXJhbVN0ciwgMCwgc3RybGVuKCRwYXJhbVN0ciktMik7CgkJCQkJJHBhcmFtQXJyYXlTdHIgPSBzdWJzdHIoJHBhcmFtQXJyYXlTdHIsIDAsIHN0cmxlbigkcGFyYW1BcnJheVN0ciktMik7CgkJCQkJJHBhcmFtQ29tbWVudFN0ciA9IHN1YnN0cigkcGFyYW1Db21tZW50U3RyLCAwLCBzdHJsZW4oJHBhcmFtQ29tbWVudFN0ciktMik7CgkJCQl9IGVsc2UgewoJCQkJCSRwYXJhbVN0ciA9ICcnOwoJCQkJCSRwYXJhbUNvbW1lbnRTdHIgPSAndm9pZCc7CgkJCQl9CgkJCQkkb3BEYXRhWyduYW1lc3BhY2UnXSA9ICFpc3NldCgkb3BEYXRhWyduYW1lc3BhY2UnXSkgPyAnaHR0cDovL3Rlc3R1cmkuY29tJyA6ICRvcERhdGFbJ25hbWVzcGFjZSddOwoJCQkJJGV2YWxTdHIgLj0gIi8vICRwYXJhbUNvbW1lbnRTdHIKCWZ1bmN0aW9uICIgLiBzdHJfcmVwbGFjZSgnLicsICdfXycsICRvcGVyYXRpb24pIC4gIigkcGFyYW1TdHIpIHsKCQlcJHBhcmFtcyA9IGFycmF5KCRwYXJhbUFycmF5U3RyKTsKCQlyZXR1cm4gXCR0aGlzLT5jYWxsKCckb3BlcmF0aW9uJywgXCRwYXJhbXMsICciLiRvcERhdGFbJ25hbWVzcGFjZSddLiInLCAnIi4oaXNzZXQoJG9wRGF0YVsnc29hcEFjdGlvbiddKSA/ICRvcERhdGFbJ3NvYXBBY3Rpb24nXSA6ICcnKS4iJyk7Cgl9CgkiOwoJCQkJdW5zZXQoJHBhcmFtU3RyKTsKCQkJCXVuc2V0KCRwYXJhbUNvbW1lbnRTdHIpOwoJCQl9CgkJfQoJCSRldmFsU3RyID0gJ2NsYXNzIHNvYXBfcHJveHlfJy4kci4nIGV4dGVuZHMgc29hcGNsaWVudCB7CgknLiRldmFsU3RyLicKfSc7CgkJcmV0dXJuICRldmFsU3RyOwoJfQoKCS8qKgoJKiBkeW5hbWljYWxseSBjcmVhdGVzIHByb3h5IGNsYXNzIGNvZGUKCSoKCSogQHJldHVybiAgIHN0cmluZyBQSFAvTnVTT0FQIGNvZGUgZm9yIHRoZSBwcm94eSBjbGFzcwoJKiBAYWNjZXNzICAgcHVibGljCgkqLwoJZnVuY3Rpb24gZ2V0UHJveHlDbGFzc0NvZGUoKSB7CgkJJHIgPSByYW5kKCk7CgkJcmV0dXJuICR0aGlzLT5fZ2V0UHJveHlDbGFzc0NvZGUoJHIpOwoJfQoKCS8qKgoJKiBnZXRzIHRoZSBIVFRQIGJvZHkgZm9yIHRoZSBjdXJyZW50IHJlcXVlc3QuCgkqCgkqIEBwYXJhbSBzdHJpbmcgJHNvYXBtc2cgVGhlIFNPQVAgcGF5bG9hZAoJKiBAcmV0dXJuIHN0cmluZyBUaGUgSFRUUCBib2R5LCB3aGljaCBpbmNsdWRlcyB0aGUgU09BUCBwYXlsb2FkCgkqIEBhY2Nlc3MgcHJpdmF0ZQoJKi8KCWZ1bmN0aW9uIGdldEhUVFBCb2R5KCRzb2FwbXNnKSB7CgkJcmV0dXJuICRzb2FwbXNnOwoJfQoJCgkvKioKCSogZ2V0cyB0aGUgSFRUUCBjb250ZW50IHR5cGUgZm9yIHRoZSBjdXJyZW50IHJlcXVlc3QuCgkqCgkqIE5vdGU6IGdldEhUVFBCb2R5IG11c3QgYmUgY2FsbGVkIGJlZm9yZSB0aGlzLgoJKgoJKiBAcmV0dXJuIHN0cmluZyB0aGUgSFRUUCBjb250ZW50IHR5cGUgZm9yIHRoZSBjdXJyZW50IHJlcXVlc3QuCgkqIEBhY2Nlc3MgcHJpdmF0ZQoJKi8KCWZ1bmN0aW9uIGdldEhUVFBDb250ZW50VHlwZSgpIHsKCQlyZXR1cm4gJ3RleHQveG1sJzsKCX0KCQoJLyoqCgkqIGdldHMgdGhlIEhUVFAgY29udGVudCB0eXBlIGNoYXJzZXQgZm9yIHRoZSBjdXJyZW50IHJlcXVlc3QuCgkqIHJldHVybnMgZmFsc2UgZm9yIG5vbi10ZXh0IGNvbnRlbnQgdHlwZXMuCgkqCgkqIE5vdGU6IGdldEhUVFBCb2R5IG11c3QgYmUgY2FsbGVkIGJlZm9yZSB0aGlzLgoJKgoJKiBAcmV0dXJuIHN0cmluZyB0aGUgSFRUUCBjb250ZW50IHR5cGUgY2hhcnNldCBmb3IgdGhlIGN1cnJlbnQgcmVxdWVzdC4KCSogQGFjY2VzcyBwcml2YXRlCgkqLwoJZnVuY3Rpb24gZ2V0SFRUUENvbnRlbnRUeXBlQ2hhcnNldCgpIHsKCQlyZXR1cm4gJHRoaXMtPnNvYXBfZGVmZW5jb2Rpbmc7Cgl9CgoJLyoKCSogd2hldGhlciBvciBub3QgcGFyc2VyIHNob3VsZCBkZWNvZGUgdXRmOCBlbGVtZW50IGNvbnRlbnQKICAgICoKICAgICogQHJldHVybiAgIGFsd2F5cyByZXR1cm5zIHRydWUKICAgICogQGFjY2VzcyAgIHB1YmxpYwogICAgKi8KICAgIGZ1bmN0aW9uIGRlY29kZVVURjgoJGJvb2wpewoJCSR0aGlzLT5kZWNvZGVfdXRmOCA9ICRib29sOwoJCXJldHVybiB0cnVlOwogICAgfQoKCS8qKgoJICogYWRkcyBhIG5ldyBDb29raWUgaW50byAkdGhpcy0+Y29va2llcyBhcnJheQoJICoKCSAqIEBwYXJhbQlzdHJpbmcgJG5hbWUgQ29va2llIE5hbWUKCSAqIEBwYXJhbQlzdHJpbmcgJHZhbHVlIENvb2tpZSBWYWx1ZQoJICogQHJldHVybglpZiBjb29raWUtc2V0IHdhcyBzdWNjZXNzZnVsIHJldHVybnMgdHJ1ZSwgZWxzZSBmYWxzZQoJICogQGFjY2VzcwlwdWJsaWMKCSAqLwoJZnVuY3Rpb24gc2V0Q29va2llKCRuYW1lLCAkdmFsdWUpIHsKCQlpZiAoc3RybGVuKCRuYW1lKSA9PSAwKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJJHRoaXMtPmNvb2tpZXNbXSA9IGFycmF5KCduYW1lJyA9PiAkbmFtZSwgJ3ZhbHVlJyA9PiAkdmFsdWUpOwoJCXJldHVybiB0cnVlOwoJfQoKCS8qKgoJICogZ2V0cyBhbGwgQ29va2llcwoJICoKCSAqIEByZXR1cm4gICBhcnJheSB3aXRoIGFsbCBpbnRlcm5hbCBjb29raWVzCgkgKiBAYWNjZXNzICAgcHVibGljCgkgKi8KCWZ1bmN0aW9uIGdldENvb2tpZXMoKSB7CgkJcmV0dXJuICR0aGlzLT5jb29raWVzOwoJfQoKCS8qKgoJICogY2hlY2tzIGFsbCBDb29raWVzIGFuZCBkZWxldGUgdGhvc2Ugd2hpY2ggYXJlIGV4cGlyZWQKCSAqCgkgKiBAcmV0dXJuICAgYWx3YXlzIHJldHVybiB0cnVlCgkgKiBAYWNjZXNzICAgcHJpdmF0ZQoJICovCglmdW5jdGlvbiBjaGVja0Nvb2tpZXMoKSB7CgkJaWYgKHNpemVvZigkdGhpcy0+Y29va2llcykgPT0gMCkgewoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgkJJHRoaXMtPmRlYnVnKCdjaGVja0Nvb2tpZTogY2hlY2sgJyAuIHNpemVvZigkdGhpcy0+Y29va2llcykgLiAnIGNvb2tpZXMnKTsKCQkkY3Vycl9jb29raWVzID0gJHRoaXMtPmNvb2tpZXM7CgkJJHRoaXMtPmNvb2tpZXMgPSBhcnJheSgpOwoJCWZvcmVhY2ggKCRjdXJyX2Nvb2tpZXMgYXMgJGNvb2tpZSkgewoJCQlpZiAoISBpc19hcnJheSgkY29va2llKSkgewoJCQkJJHRoaXMtPmRlYnVnKCdSZW1vdmUgY29va2llIHRoYXQgaXMgbm90IGFuIGFycmF5Jyk7CgkJCQljb250aW51ZTsKCQkJfQoJCQlpZiAoKGlzc2V0KCRjb29raWVbJ2V4cGlyZXMnXSkpICYmICghIGVtcHR5KCRjb29raWVbJ2V4cGlyZXMnXSkpKSB7CgkJCQlpZiAoc3RydG90aW1lKCRjb29raWVbJ2V4cGlyZXMnXSkgPiB0aW1lKCkpIHsKCQkJCQkkdGhpcy0+Y29va2llc1tdID0gJGNvb2tpZTsKCQkJCX0gZWxzZSB7CgkJCQkJJHRoaXMtPmRlYnVnKCdSZW1vdmUgZXhwaXJlZCBjb29raWUgJyAuICRjb29raWVbJ25hbWUnXSk7CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQkkdGhpcy0+Y29va2llc1tdID0gJGNvb2tpZTsKCQkJfQoJCX0KCQkkdGhpcy0+ZGVidWcoJ2NoZWNrQ29va2llOiAnLnNpemVvZigkdGhpcy0+Y29va2llcykuJyBjb29raWVzIGxlZnQgaW4gYXJyYXknKTsKCQlyZXR1cm4gdHJ1ZTsKCX0KCgkvKioKCSAqIHVwZGF0ZXMgdGhlIGN1cnJlbnQgY29va2llcyB3aXRoIGEgbmV3IHNldAoJICoKCSAqIEBwYXJhbQlhcnJheSAkY29va2llcyBuZXcgY29va2llcyB3aXRoIHdoaWNoIHRvIHVwZGF0ZSBjdXJyZW50IG9uZXMKCSAqIEByZXR1cm4JYWx3YXlzIHJldHVybiB0cnVlCgkgKiBAYWNjZXNzCXByaXZhdGUKCSAqLwoJZnVuY3Rpb24gVXBkYXRlQ29va2llcygkY29va2llcykgewoJCWlmIChzaXplb2YoJHRoaXMtPmNvb2tpZXMpID09IDApIHsKCQkJLy8gbm8gZXhpc3RpbmcgY29va2llczogdGFrZSB3aGF0ZXZlciBpcyBuZXcKCQkJaWYgKHNpemVvZigkY29va2llcykgPiAwKSB7CgkJCQkkdGhpcy0+ZGVidWcoJ1NldHRpbmcgbmV3IGNvb2tpZShzKScpOwoJCQkJJHRoaXMtPmNvb2tpZXMgPSAkY29va2llczsKCQkJfQoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgkJaWYgKHNpemVvZigkY29va2llcykgPT0gMCkgewoJCQkvLyBubyBuZXcgY29va2llczoga2VlcCB3aGF0IHdlJ3ZlIGdvdAoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgkJLy8gbWVyZ2UKCQlmb3JlYWNoICgkY29va2llcyBhcyAkbmV3Q29va2llKSB7CgkJCWlmICghaXNfYXJyYXkoJG5ld0Nvb2tpZSkpIHsKCQkJCWNvbnRpbnVlOwoJCQl9CgkJCWlmICgoIWlzc2V0KCRuZXdDb29raWVbJ25hbWUnXSkpIHx8ICghaXNzZXQoJG5ld0Nvb2tpZVsndmFsdWUnXSkpKSB7CgkJCQljb250aW51ZTsKCQkJfQoJCQkkbmV3TmFtZSA9ICRuZXdDb29raWVbJ25hbWUnXTsKCgkJCSRmb3VuZCA9IGZhbHNlOwoJCQlmb3IgKCRpID0gMDsgJGkgPCBjb3VudCgkdGhpcy0+Y29va2llcyk7ICRpKyspIHsKCQkJCSRjb29raWUgPSAkdGhpcy0+Y29va2llc1skaV07CgkJCQlpZiAoIWlzX2FycmF5KCRjb29raWUpKSB7CgkJCQkJY29udGludWU7CgkJCQl9CgkJCQlpZiAoIWlzc2V0KCRjb29raWVbJ25hbWUnXSkpIHsKCQkJCQljb250aW51ZTsKCQkJCX0KCQkJCWlmICgkbmV3TmFtZSAhPSAkY29va2llWyduYW1lJ10pIHsKCQkJCQljb250aW51ZTsKCQkJCX0KCQkJCSRuZXdEb21haW4gPSBpc3NldCgkbmV3Q29va2llWydkb21haW4nXSkgPyAkbmV3Q29va2llWydkb21haW4nXSA6ICdOT0RPTUFJTic7CgkJCQkkZG9tYWluID0gaXNzZXQoJGNvb2tpZVsnZG9tYWluJ10pID8gJGNvb2tpZVsnZG9tYWluJ10gOiAnTk9ET01BSU4nOwoJCQkJaWYgKCRuZXdEb21haW4gIT0gJGRvbWFpbikgewoJCQkJCWNvbnRpbnVlOwoJCQkJfQoJCQkJJG5ld1BhdGggPSBpc3NldCgkbmV3Q29va2llWydwYXRoJ10pID8gJG5ld0Nvb2tpZVsncGF0aCddIDogJ05PUEFUSCc7CgkJCQkkcGF0aCA9IGlzc2V0KCRjb29raWVbJ3BhdGgnXSkgPyAkY29va2llWydwYXRoJ10gOiAnTk9QQVRIJzsKCQkJCWlmICgkbmV3UGF0aCAhPSAkcGF0aCkgewoJCQkJCWNvbnRpbnVlOwoJCQkJfQoJCQkJJHRoaXMtPmNvb2tpZXNbJGldID0gJG5ld0Nvb2tpZTsKCQkJCSRmb3VuZCA9IHRydWU7CgkJCQkkdGhpcy0+ZGVidWcoJ1VwZGF0ZSBjb29raWUgJyAuICRuZXdOYW1lIC4gJz0nIC4gJG5ld0Nvb2tpZVsndmFsdWUnXSk7CgkJCQlicmVhazsKCQkJfQoJCQlpZiAoISAkZm91bmQpIHsKCQkJCSR0aGlzLT5kZWJ1ZygnQWRkIGNvb2tpZSAnIC4gJG5ld05hbWUgLiAnPScgLiAkbmV3Q29va2llWyd2YWx1ZSddKTsKCQkJCSR0aGlzLT5jb29raWVzW10gPSAkbmV3Q29va2llOwoJCQl9CgkJfQoJCXJldHVybiB0cnVlOwoJfQp9Cj8+Cg==]]></data>
  </file>
  <file>
    <filename>classes/nusoapmime.php</filename>
    <isdir>0</isdir>
    <data><![CDATA[PD9waHAKLyoKJElkOiBudXNvYXBtaW1lLnBocCx2IDEuNyAyMDA1LzA3LzI3IDE5OjI0OjQyIHNuaWNob2wgRXhwICQKCk51U09BUCAtIFdlYiBTZXJ2aWNlcyBUb29sa2l0IGZvciBQSFAKCkNvcHlyaWdodCAoYykgMjAwMiBOdVNwaGVyZSBDb3Jwb3JhdGlvbgoKVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgptb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCkxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgp2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KClRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLApidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgpNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQpMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwpMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCkZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKCklmIHlvdSBoYXZlIGFueSBxdWVzdGlvbnMgb3IgY29tbWVudHMsIHBsZWFzZSBlbWFpbDoKCkRpZXRyaWNoIEF5YWxhCmRpZXRyaWNoQGdhbng0LmNvbQpodHRwOi8vZGlldHJpY2guZ2FueDQuY29tL251c29hcAoKTnVTcGhlcmUgQ29ycG9yYXRpb24KaHR0cDovL3d3dy5udXNwaGVyZS5jb20KCiovCgovKnJlcXVpcmVfb25jZSgnbnVzb2FwLnBocCcpOyovCi8qIFBFQVIgTWFpbF9NSU1FIGxpYnJhcnkgKi8KcmVxdWlyZV9vbmNlKCdNYWlsL21pbWVEZWNvZGUucGhwJyk7CnJlcXVpcmVfb25jZSgnTWFpbC9taW1lUGFydC5waHAnKTsKCi8qKgoqIHNvYXBjbGllbnRtaW1lIGNsaWVudCBzdXBwb3J0aW5nIE1JTUUgYXR0YWNobWVudHMgZGVmaW5lZCBhdAoqIGh0dHA6Ly93d3cudzMub3JnL1RSL1NPQVAtYXR0YWNobWVudHMuICBJdCBkZXBlbmRzIG9uIHRoZSBQRUFSIE1haWxfTUlNRSBsaWJyYXJ5LgoqCiogQGF1dGhvciAgIFNjb3R0IE5pY2hvbCA8c25pY2hvbEBzb3VyY2Vmb3JnZS5uZXQ+CiogQGF1dGhvcglUaGFua3MgdG8gR3VpbGxhdW1lIGFuZCBIZW5uaW5nIFJlaWNoIGZvciBwb3N0aW5nIGdyZWF0IGF0dGFjaG1lbnQgY29kZSB0byB0aGUgbWFpbCBsaXN0CiogQHZlcnNpb24gICRJZDogbnVzb2FwbWltZS5waHAsdiAxLjcgMjAwNS8wNy8yNyAxOToyNDo0MiBzbmljaG9sIEV4cCAkCiogQGFjY2VzcyAgIHB1YmxpYwoqLwpjbGFzcyBzb2FwY2xpZW50bWltZSBleHRlbmRzIHNvYXBjbGllbnQgewoJLyoqCgkgKiBAdmFyIGFycmF5IEVhY2ggYXJyYXkgZWxlbWVudCBpbiB0aGUgcmV0dXJuIGlzIGFuIGFzc29jaWF0aXZlIGFycmF5IHdpdGgga2V5cwoJICogZGF0YSwgZmlsZW5hbWUsIGNvbnRlbnR0eXBlLCBjaWQKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCgl2YXIgJHJlcXVlc3RBdHRhY2htZW50cyA9IGFycmF5KCk7CgkvKioKCSAqIEB2YXIgYXJyYXkgRWFjaCBhcnJheSBlbGVtZW50IGluIHRoZSByZXR1cm4gaXMgYW4gYXNzb2NpYXRpdmUgYXJyYXkgd2l0aCBrZXlzCgkgKiBkYXRhLCBmaWxlbmFtZSwgY29udGVudHR5cGUsIGNpZAoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCXZhciAkcmVzcG9uc2VBdHRhY2htZW50czsKCS8qKgoJICogQHZhciBzdHJpbmcKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCgl2YXIgJG1pbWVDb250ZW50VHlwZTsKCQoJLyoqCgkqIGFkZHMgYSBNSU1FIGF0dGFjaG1lbnQgdG8gdGhlIGN1cnJlbnQgcmVxdWVzdC4KCSoKCSogSWYgdGhlICRkYXRhIHBhcmFtZXRlciBjb250YWlucyBhbiBlbXB0eSBzdHJpbmcsIHRoaXMgbWV0aG9kIHdpbGwgcmVhZAoJKiB0aGUgY29udGVudHMgb2YgdGhlIGZpbGUgbmFtZWQgYnkgdGhlICRmaWxlbmFtZSBwYXJhbWV0ZXIuCgkqCgkqIElmIHRoZSAkY2lkIHBhcmFtZXRlciBpcyBmYWxzZSwgdGhpcyBtZXRob2Qgd2lsbCBnZW5lcmF0ZSB0aGUgY2lkLgoJKgoJKiBAcGFyYW0gc3RyaW5nICRkYXRhIFRoZSBkYXRhIG9mIHRoZSBhdHRhY2htZW50CgkqIEBwYXJhbSBzdHJpbmcgJGZpbGVuYW1lIFRoZSBmaWxlbmFtZSBvZiB0aGUgYXR0YWNobWVudCAoZGVmYXVsdCBpcyBlbXB0eSBzdHJpbmcpCgkqIEBwYXJhbSBzdHJpbmcgJGNvbnRlbnR0eXBlIFRoZSBNSU1FIENvbnRlbnQtVHlwZSBvZiB0aGUgYXR0YWNobWVudCAoZGVmYXVsdCBpcyBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0pCgkqIEBwYXJhbSBzdHJpbmcgJGNpZCBUaGUgY29udGVudC1pZCAoY2lkKSBvZiB0aGUgYXR0YWNobWVudCAoZGVmYXVsdCBpcyBmYWxzZSkKCSogQHJldHVybiBzdHJpbmcgVGhlIGNvbnRlbnQtaWQgKGNpZCkgb2YgdGhlIGF0dGFjaG1lbnQKCSogQGFjY2VzcyBwdWJsaWMKCSovCglmdW5jdGlvbiBhZGRBdHRhY2htZW50KCRkYXRhLCAkZmlsZW5hbWUgPSAnJywgJGNvbnRlbnR0eXBlID0gJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScsICRjaWQgPSBmYWxzZSkgewoJCWlmICghICRjaWQpIHsKCQkJJGNpZCA9IG1kNSh1bmlxaWQodGltZSgpKSk7CgkJfQoKCQkkaW5mb1snZGF0YSddID0gJGRhdGE7CgkJJGluZm9bJ2ZpbGVuYW1lJ10gPSAkZmlsZW5hbWU7CgkJJGluZm9bJ2NvbnRlbnR0eXBlJ10gPSAkY29udGVudHR5cGU7CgkJJGluZm9bJ2NpZCddID0gJGNpZDsKCQkKCQkkdGhpcy0+cmVxdWVzdEF0dGFjaG1lbnRzW10gPSAkaW5mbzsKCgkJcmV0dXJuICRjaWQ7Cgl9CgoJLyoqCgkqIGNsZWFycyB0aGUgTUlNRSBhdHRhY2htZW50cyBmb3IgdGhlIGN1cnJlbnQgcmVxdWVzdC4KCSoKCSogQGFjY2VzcyBwdWJsaWMKCSovCglmdW5jdGlvbiBjbGVhckF0dGFjaG1lbnRzKCkgewoJCSR0aGlzLT5yZXF1ZXN0QXR0YWNobWVudHMgPSBhcnJheSgpOwoJfQoKCS8qKgoJKiBnZXRzIHRoZSBNSU1FIGF0dGFjaG1lbnRzIGZyb20gdGhlIGN1cnJlbnQgcmVzcG9uc2UuCgkqCgkqIEVhY2ggYXJyYXkgZWxlbWVudCBpbiB0aGUgcmV0dXJuIGlzIGFuIGFzc29jaWF0aXZlIGFycmF5IHdpdGgga2V5cwoJKiBkYXRhLCBmaWxlbmFtZSwgY29udGVudHR5cGUsIGNpZC4gIFRoZXNlIGtleXMgY29ycmVzcG9uZCB0byB0aGUgcGFyYW1ldGVycwoJKiBmb3IgYWRkQXR0YWNobWVudC4KCSoKCSogQHJldHVybiBhcnJheSBUaGUgYXR0YWNobWVudHMuCgkqIEBhY2Nlc3MgcHVibGljCgkqLwoJZnVuY3Rpb24gZ2V0QXR0YWNobWVudHMoKSB7CgkJcmV0dXJuICR0aGlzLT5yZXNwb25zZUF0dGFjaG1lbnRzOwoJfQoKCS8qKgoJKiBnZXRzIHRoZSBIVFRQIGJvZHkgZm9yIHRoZSBjdXJyZW50IHJlcXVlc3QuCgkqCgkqIEBwYXJhbSBzdHJpbmcgJHNvYXBtc2cgVGhlIFNPQVAgcGF5bG9hZAoJKiBAcmV0dXJuIHN0cmluZyBUaGUgSFRUUCBib2R5LCB3aGljaCBpbmNsdWRlcyB0aGUgU09BUCBwYXlsb2FkCgkqIEBhY2Nlc3MgcHJpdmF0ZQoJKi8KCWZ1bmN0aW9uIGdldEhUVFBCb2R5KCRzb2FwbXNnKSB7CgkJaWYgKGNvdW50KCR0aGlzLT5yZXF1ZXN0QXR0YWNobWVudHMpID4gMCkgewoJCQkkcGFyYW1zWydjb250ZW50X3R5cGUnXSA9ICdtdWx0aXBhcnQvcmVsYXRlZDsgdHlwZT10ZXh0L3htbCc7CgkJCSRtaW1lTWVzc2FnZSA9JiBuZXcgTWFpbF9taW1lUGFydCgnJywgJHBhcmFtcyk7CgkJCXVuc2V0KCRwYXJhbXMpOwoKCQkJJHBhcmFtc1snY29udGVudF90eXBlJ10gPSAndGV4dC94bWwnOwoJCQkkcGFyYW1zWydlbmNvZGluZyddICAgICA9ICc4Yml0JzsKCQkJJHBhcmFtc1snY2hhcnNldCddICAgICAgPSAkdGhpcy0+c29hcF9kZWZlbmNvZGluZzsKCQkJJG1pbWVNZXNzYWdlLT5hZGRTdWJwYXJ0KCRzb2FwbXNnLCAkcGFyYW1zKTsKCQkJCgkJCWZvcmVhY2ggKCR0aGlzLT5yZXF1ZXN0QXR0YWNobWVudHMgYXMgJGF0dCkgewoJCQkJdW5zZXQoJHBhcmFtcyk7CgoJCQkJJHBhcmFtc1snY29udGVudF90eXBlJ10gPSAkYXR0Wydjb250ZW50dHlwZSddOwoJCQkJJHBhcmFtc1snZW5jb2RpbmcnXSAgICAgPSAnYmFzZTY0JzsKCQkJCSRwYXJhbXNbJ2Rpc3Bvc2l0aW9uJ10gID0gJ2F0dGFjaG1lbnQnOwoJCQkJJHBhcmFtc1snZGZpbGVuYW1lJ10gICAgPSAkYXR0WydmaWxlbmFtZSddOwoJCQkJJHBhcmFtc1snY2lkJ10gICAgICAgICAgPSAkYXR0WydjaWQnXTsKCgkJCQlpZiAoJGF0dFsnZGF0YSddID09ICcnICYmICRhdHRbJ2ZpbGVuYW1lJ10gPD4gJycpIHsKCQkJCQlpZiAoJGZkID0gZm9wZW4oJGF0dFsnZmlsZW5hbWUnXSwgJ3JiJykpIHsKCQkJCQkJJGRhdGEgPSBmcmVhZCgkZmQsIGZpbGVzaXplKCRhdHRbJ2ZpbGVuYW1lJ10pKTsKCQkJCQkJZmNsb3NlKCRmZCk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJJGRhdGEgPSAnJzsKCQkJCQl9CgkJCQkJJG1pbWVNZXNzYWdlLT5hZGRTdWJwYXJ0KCRkYXRhLCAkcGFyYW1zKTsKCQkJCX0gZWxzZSB7CgkJCQkJJG1pbWVNZXNzYWdlLT5hZGRTdWJwYXJ0KCRhdHRbJ2RhdGEnXSwgJHBhcmFtcyk7CgkJCQl9CgkJCX0KCgkJCSRvdXRwdXQgPSAkbWltZU1lc3NhZ2UtPmVuY29kZSgpOwoJCQkkbWltZUhlYWRlcnMgPSAkb3V0cHV0WydoZWFkZXJzJ107CgkKCQkJZm9yZWFjaCAoJG1pbWVIZWFkZXJzIGFzICRrID0+ICR2KSB7CgkJCQkkdGhpcy0+ZGVidWcoIk1JTUUgaGVhZGVyICRrOiAkdiIpOwoJCQkJaWYgKHN0cnRvbG93ZXIoJGspID09ICdjb250ZW50LXR5cGUnKSB7CgkJCQkJLy8gUEhQIGhlYWRlcigpIHNlZW1zIHRvIHN0cmlwIGxlYWRpbmcgd2hpdGVzcGFjZSBzdGFydGluZwoJCQkJCS8vIHRoZSBzZWNvbmQgbGluZSwgc28gZm9yY2UgZXZlcnl0aGluZyB0byBvbmUgbGluZQoJCQkJCSR0aGlzLT5taW1lQ29udGVudFR5cGUgPSBzdHJfcmVwbGFjZSgiXHJcbiIsICIgIiwgJHYpOwoJCQkJfQoJCQl9CgkKCQkJcmV0dXJuICRvdXRwdXRbJ2JvZHknXTsKCQl9CgoJCXJldHVybiBwYXJlbnQ6OmdldEhUVFBCb2R5KCRzb2FwbXNnKTsKCX0KCQoJLyoqCgkqIGdldHMgdGhlIEhUVFAgY29udGVudCB0eXBlIGZvciB0aGUgY3VycmVudCByZXF1ZXN0LgoJKgoJKiBOb3RlOiBnZXRIVFRQQm9keSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgdGhpcy4KCSoKCSogQHJldHVybiBzdHJpbmcgdGhlIEhUVFAgY29udGVudCB0eXBlIGZvciB0aGUgY3VycmVudCByZXF1ZXN0LgoJKiBAYWNjZXNzIHByaXZhdGUKCSovCglmdW5jdGlvbiBnZXRIVFRQQ29udGVudFR5cGUoKSB7CgkJaWYgKGNvdW50KCR0aGlzLT5yZXF1ZXN0QXR0YWNobWVudHMpID4gMCkgewoJCQlyZXR1cm4gJHRoaXMtPm1pbWVDb250ZW50VHlwZTsKCQl9CgkJcmV0dXJuIHBhcmVudDo6Z2V0SFRUUENvbnRlbnRUeXBlKCk7Cgl9CgkKCS8qKgoJKiBnZXRzIHRoZSBIVFRQIGNvbnRlbnQgdHlwZSBjaGFyc2V0IGZvciB0aGUgY3VycmVudCByZXF1ZXN0LgoJKiByZXR1cm5zIGZhbHNlIGZvciBub24tdGV4dCBjb250ZW50IHR5cGVzLgoJKgoJKiBOb3RlOiBnZXRIVFRQQm9keSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgdGhpcy4KCSoKCSogQHJldHVybiBzdHJpbmcgdGhlIEhUVFAgY29udGVudCB0eXBlIGNoYXJzZXQgZm9yIHRoZSBjdXJyZW50IHJlcXVlc3QuCgkqIEBhY2Nlc3MgcHJpdmF0ZQoJKi8KCWZ1bmN0aW9uIGdldEhUVFBDb250ZW50VHlwZUNoYXJzZXQoKSB7CgkJaWYgKGNvdW50KCR0aGlzLT5yZXF1ZXN0QXR0YWNobWVudHMpID4gMCkgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCXJldHVybiBwYXJlbnQ6OmdldEhUVFBDb250ZW50VHlwZUNoYXJzZXQoKTsKCX0KCgkvKioKCSogcHJvY2Vzc2VzIFNPQVAgbWVzc2FnZSByZXR1cm5lZCBmcm9tIHNlcnZlcgoJKgoJKiBAcGFyYW0JYXJyYXkJJGhlYWRlcnMJVGhlIEhUVFAgaGVhZGVycwoJKiBAcGFyYW0Jc3RyaW5nCSRkYXRhCQl1bnByb2Nlc3NlZCByZXNwb25zZSBkYXRhIGZyb20gc2VydmVyCgkqIEByZXR1cm4JbWl4ZWQJdmFsdWUgb2YgdGhlIG1lc3NhZ2UsIGRlY29kZWQgaW50byBhIFBIUCB0eXBlCgkqIEBhY2Nlc3MgICBwcml2YXRlCgkqLwogICAgZnVuY3Rpb24gcGFyc2VSZXNwb25zZSgkaGVhZGVycywgJGRhdGEpIHsKCQkkdGhpcy0+ZGVidWcoJ0VudGVyaW5nIHBhcnNlUmVzcG9uc2UoKSBmb3IgcGF5bG9hZCBvZiBsZW5ndGggJyAuIHN0cmxlbigkZGF0YSkgLiAnIGFuZCB0eXBlIG9mICcgLiAkaGVhZGVyc1snY29udGVudC10eXBlJ10pOwoJCSR0aGlzLT5yZXNwb25zZUF0dGFjaG1lbnRzID0gYXJyYXkoKTsKCQlpZiAoc3Ryc3RyKCRoZWFkZXJzWydjb250ZW50LXR5cGUnXSwgJ211bHRpcGFydC9yZWxhdGVkJykpIHsKCQkJJHRoaXMtPmRlYnVnKCdEZWNvZGUgbXVsdGlwYXJ0L3JlbGF0ZWQnKTsKCQkJJGlucHV0ID0gJyc7CgkJCWZvcmVhY2ggKCRoZWFkZXJzIGFzICRrID0+ICR2KSB7CgkJCQkkaW5wdXQgLj0gIiRrOiAkdlxyXG4iOwoJCQl9CgkJCSRwYXJhbXNbJ2lucHV0J10gPSAkaW5wdXQgLiAiXHJcbiIgLiAkZGF0YTsKCQkJJHBhcmFtc1snaW5jbHVkZV9ib2RpZXMnXSA9IHRydWU7CgkJCSRwYXJhbXNbJ2RlY29kZV9ib2RpZXMnXSA9IHRydWU7CgkJCSRwYXJhbXNbJ2RlY29kZV9oZWFkZXJzJ10gPSB0cnVlOwoJCQkKCQkJJHN0cnVjdHVyZSA9IE1haWxfbWltZURlY29kZTo6ZGVjb2RlKCRwYXJhbXMpOwoKCQkJZm9yZWFjaCAoJHN0cnVjdHVyZS0+cGFydHMgYXMgJHBhcnQpIHsKCQkJCWlmICghaXNzZXQoJHBhcnQtPmRpc3Bvc2l0aW9uKSkgewoJCQkJCSR0aGlzLT5kZWJ1ZygnSGF2ZSByb290IHBhcnQgb2YgdHlwZSAnIC4gJHBhcnQtPmhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddKTsKCQkJCQkkcmV0dXJuID0gcGFyZW50OjpwYXJzZVJlc3BvbnNlKCRwYXJ0LT5oZWFkZXJzLCAkcGFydC0+Ym9keSk7CgkJCQl9IGVsc2UgewoJCQkJCSR0aGlzLT5kZWJ1ZygnSGF2ZSBhbiBhdHRhY2htZW50IG9mIHR5cGUgJyAuICRwYXJ0LT5oZWFkZXJzWydjb250ZW50LXR5cGUnXSk7CgkJCQkJJGluZm9bJ2RhdGEnXSA9ICRwYXJ0LT5ib2R5OwoJCQkJCSRpbmZvWydmaWxlbmFtZSddID0gaXNzZXQoJHBhcnQtPmRfcGFyYW1ldGVyc1snZmlsZW5hbWUnXSkgPyAkcGFydC0+ZF9wYXJhbWV0ZXJzWydmaWxlbmFtZSddIDogJyc7CgkJCQkJJGluZm9bJ2NvbnRlbnR0eXBlJ10gPSAkcGFydC0+aGVhZGVyc1snY29udGVudC10eXBlJ107CgkJCQkJJGluZm9bJ2NpZCddID0gJHBhcnQtPmhlYWRlcnNbJ2NvbnRlbnQtaWQnXTsKCQkJCQkkdGhpcy0+cmVzcG9uc2VBdHRhY2htZW50c1tdID0gJGluZm87CgkJCQl9CgkJCX0KCQkKCQkJaWYgKGlzc2V0KCRyZXR1cm4pKSB7CgkJCQlyZXR1cm4gJHJldHVybjsKCQkJfQoJCQkKCQkJJHRoaXMtPnNldEVycm9yKCdObyByb290IHBhcnQgZm91bmQgaW4gbXVsdGlwYXJ0L3JlbGF0ZWQgY29udGVudCcpOwoJCQlyZXR1cm47CgkJfQoJCSR0aGlzLT5kZWJ1ZygnTm90IG11bHRpcGFydC9yZWxhdGVkJyk7CgkJcmV0dXJuIHBhcmVudDo6cGFyc2VSZXNwb25zZSgkaGVhZGVycywgJGRhdGEpOwoJfQp9CgovKioKKiBudXNvYXBzZXJ2ZXJtaW1lIHNlcnZlciBzdXBwb3J0aW5nIE1JTUUgYXR0YWNobWVudHMgZGVmaW5lZCBhdAoqIGh0dHA6Ly93d3cudzMub3JnL1RSL1NPQVAtYXR0YWNobWVudHMuICBJdCBkZXBlbmRzIG9uIHRoZSBQRUFSIE1haWxfTUlNRSBsaWJyYXJ5LgoqCiogQGF1dGhvciAgIFNjb3R0IE5pY2hvbCA8c25pY2hvbEBzb3VyY2Vmb3JnZS5uZXQ+CiogQGF1dGhvcglUaGFua3MgdG8gR3VpbGxhdW1lIGFuZCBIZW5uaW5nIFJlaWNoIGZvciBwb3N0aW5nIGdyZWF0IGF0dGFjaG1lbnQgY29kZSB0byB0aGUgbWFpbCBsaXN0CiogQHZlcnNpb24gICRJZDogbnVzb2FwbWltZS5waHAsdiAxLjcgMjAwNS8wNy8yNyAxOToyNDo0MiBzbmljaG9sIEV4cCAkCiogQGFjY2VzcyAgIHB1YmxpYwoqLwpjbGFzcyBudXNvYXBzZXJ2ZXJtaW1lIGV4dGVuZHMgc29hcF9zZXJ2ZXIgewoJLyoqCgkgKiBAdmFyIGFycmF5IEVhY2ggYXJyYXkgZWxlbWVudCBpbiB0aGUgcmV0dXJuIGlzIGFuIGFzc29jaWF0aXZlIGFycmF5IHdpdGgga2V5cwoJICogZGF0YSwgZmlsZW5hbWUsIGNvbnRlbnR0eXBlLCBjaWQKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCgl2YXIgJHJlcXVlc3RBdHRhY2htZW50cyA9IGFycmF5KCk7CgkvKioKCSAqIEB2YXIgYXJyYXkgRWFjaCBhcnJheSBlbGVtZW50IGluIHRoZSByZXR1cm4gaXMgYW4gYXNzb2NpYXRpdmUgYXJyYXkgd2l0aCBrZXlzCgkgKiBkYXRhLCBmaWxlbmFtZSwgY29udGVudHR5cGUsIGNpZAoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCXZhciAkcmVzcG9uc2VBdHRhY2htZW50czsKCS8qKgoJICogQHZhciBzdHJpbmcKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCgl2YXIgJG1pbWVDb250ZW50VHlwZTsKCQoJLyoqCgkqIGFkZHMgYSBNSU1FIGF0dGFjaG1lbnQgdG8gdGhlIGN1cnJlbnQgcmVzcG9uc2UuCgkqCgkqIElmIHRoZSAkZGF0YSBwYXJhbWV0ZXIgY29udGFpbnMgYW4gZW1wdHkgc3RyaW5nLCB0aGlzIG1ldGhvZCB3aWxsIHJlYWQKCSogdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlIG5hbWVkIGJ5IHRoZSAkZmlsZW5hbWUgcGFyYW1ldGVyLgoJKgoJKiBJZiB0aGUgJGNpZCBwYXJhbWV0ZXIgaXMgZmFsc2UsIHRoaXMgbWV0aG9kIHdpbGwgZ2VuZXJhdGUgdGhlIGNpZC4KCSoKCSogQHBhcmFtIHN0cmluZyAkZGF0YSBUaGUgZGF0YSBvZiB0aGUgYXR0YWNobWVudAoJKiBAcGFyYW0gc3RyaW5nICRmaWxlbmFtZSBUaGUgZmlsZW5hbWUgb2YgdGhlIGF0dGFjaG1lbnQgKGRlZmF1bHQgaXMgZW1wdHkgc3RyaW5nKQoJKiBAcGFyYW0gc3RyaW5nICRjb250ZW50dHlwZSBUaGUgTUlNRSBDb250ZW50LVR5cGUgb2YgdGhlIGF0dGFjaG1lbnQgKGRlZmF1bHQgaXMgYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtKQoJKiBAcGFyYW0gc3RyaW5nICRjaWQgVGhlIGNvbnRlbnQtaWQgKGNpZCkgb2YgdGhlIGF0dGFjaG1lbnQgKGRlZmF1bHQgaXMgZmFsc2UpCgkqIEByZXR1cm4gc3RyaW5nIFRoZSBjb250ZW50LWlkIChjaWQpIG9mIHRoZSBhdHRhY2htZW50CgkqIEBhY2Nlc3MgcHVibGljCgkqLwoJZnVuY3Rpb24gYWRkQXR0YWNobWVudCgkZGF0YSwgJGZpbGVuYW1lID0gJycsICRjb250ZW50dHlwZSA9ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nLCAkY2lkID0gZmFsc2UpIHsKCQlpZiAoISAkY2lkKSB7CgkJCSRjaWQgPSBtZDUodW5pcWlkKHRpbWUoKSkpOwoJCX0KCgkJJGluZm9bJ2RhdGEnXSA9ICRkYXRhOwoJCSRpbmZvWydmaWxlbmFtZSddID0gJGZpbGVuYW1lOwoJCSRpbmZvWydjb250ZW50dHlwZSddID0gJGNvbnRlbnR0eXBlOwoJCSRpbmZvWydjaWQnXSA9ICRjaWQ7CgkJCgkJJHRoaXMtPnJlc3BvbnNlQXR0YWNobWVudHNbXSA9ICRpbmZvOwoKCQlyZXR1cm4gJGNpZDsKCX0KCgkvKioKCSogY2xlYXJzIHRoZSBNSU1FIGF0dGFjaG1lbnRzIGZvciB0aGUgY3VycmVudCByZXNwb25zZS4KCSoKCSogQGFjY2VzcyBwdWJsaWMKCSovCglmdW5jdGlvbiBjbGVhckF0dGFjaG1lbnRzKCkgewoJCSR0aGlzLT5yZXNwb25zZUF0dGFjaG1lbnRzID0gYXJyYXkoKTsKCX0KCgkvKioKCSogZ2V0cyB0aGUgTUlNRSBhdHRhY2htZW50cyBmcm9tIHRoZSBjdXJyZW50IHJlcXVlc3QuCgkqCgkqIEVhY2ggYXJyYXkgZWxlbWVudCBpbiB0aGUgcmV0dXJuIGlzIGFuIGFzc29jaWF0aXZlIGFycmF5IHdpdGgga2V5cwoJKiBkYXRhLCBmaWxlbmFtZSwgY29udGVudHR5cGUsIGNpZC4gIFRoZXNlIGtleXMgY29ycmVzcG9uZCB0byB0aGUgcGFyYW1ldGVycwoJKiBmb3IgYWRkQXR0YWNobWVudC4KCSoKCSogQHJldHVybiBhcnJheSBUaGUgYXR0YWNobWVudHMuCgkqIEBhY2Nlc3MgcHVibGljCgkqLwoJZnVuY3Rpb24gZ2V0QXR0YWNobWVudHMoKSB7CgkJcmV0dXJuICR0aGlzLT5yZXF1ZXN0QXR0YWNobWVudHM7Cgl9CgoJLyoqCgkqIGdldHMgdGhlIEhUVFAgYm9keSBmb3IgdGhlIGN1cnJlbnQgcmVzcG9uc2UuCgkqCgkqIEBwYXJhbSBzdHJpbmcgJHNvYXBtc2cgVGhlIFNPQVAgcGF5bG9hZAoJKiBAcmV0dXJuIHN0cmluZyBUaGUgSFRUUCBib2R5LCB3aGljaCBpbmNsdWRlcyB0aGUgU09BUCBwYXlsb2FkCgkqIEBhY2Nlc3MgcHJpdmF0ZQoJKi8KCWZ1bmN0aW9uIGdldEhUVFBCb2R5KCRzb2FwbXNnKSB7CgkJaWYgKGNvdW50KCR0aGlzLT5yZXNwb25zZUF0dGFjaG1lbnRzKSA+IDApIHsKCQkJJHBhcmFtc1snY29udGVudF90eXBlJ10gPSAnbXVsdGlwYXJ0L3JlbGF0ZWQ7IHR5cGU9dGV4dC94bWwnOwoJCQkkbWltZU1lc3NhZ2UgPSYgbmV3IE1haWxfbWltZVBhcnQoJycsICRwYXJhbXMpOwoJCQl1bnNldCgkcGFyYW1zKTsKCgkJCSRwYXJhbXNbJ2NvbnRlbnRfdHlwZSddID0gJ3RleHQveG1sJzsKCQkJJHBhcmFtc1snZW5jb2RpbmcnXSAgICAgPSAnOGJpdCc7CgkJCSRwYXJhbXNbJ2NoYXJzZXQnXSAgICAgID0gJHRoaXMtPnNvYXBfZGVmZW5jb2Rpbmc7CgkJCSRtaW1lTWVzc2FnZS0+YWRkU3VicGFydCgkc29hcG1zZywgJHBhcmFtcyk7CgkJCQoJCQlmb3JlYWNoICgkdGhpcy0+cmVzcG9uc2VBdHRhY2htZW50cyBhcyAkYXR0KSB7CgkJCQl1bnNldCgkcGFyYW1zKTsKCgkJCQkkcGFyYW1zWydjb250ZW50X3R5cGUnXSA9ICRhdHRbJ2NvbnRlbnR0eXBlJ107CgkJCQkkcGFyYW1zWydlbmNvZGluZyddICAgICA9ICdiYXNlNjQnOwoJCQkJJHBhcmFtc1snZGlzcG9zaXRpb24nXSAgPSAnYXR0YWNobWVudCc7CgkJCQkkcGFyYW1zWydkZmlsZW5hbWUnXSAgICA9ICRhdHRbJ2ZpbGVuYW1lJ107CgkJCQkkcGFyYW1zWydjaWQnXSAgICAgICAgICA9ICRhdHRbJ2NpZCddOwoKCQkJCWlmICgkYXR0WydkYXRhJ10gPT0gJycgJiYgJGF0dFsnZmlsZW5hbWUnXSA8PiAnJykgewoJCQkJCWlmICgkZmQgPSBmb3BlbigkYXR0WydmaWxlbmFtZSddLCAncmInKSkgewoJCQkJCQkkZGF0YSA9IGZyZWFkKCRmZCwgZmlsZXNpemUoJGF0dFsnZmlsZW5hbWUnXSkpOwoJCQkJCQlmY2xvc2UoJGZkKTsKCQkJCQl9IGVsc2UgewoJCQkJCQkkZGF0YSA9ICcnOwoJCQkJCX0KCQkJCQkkbWltZU1lc3NhZ2UtPmFkZFN1YnBhcnQoJGRhdGEsICRwYXJhbXMpOwoJCQkJfSBlbHNlIHsKCQkJCQkkbWltZU1lc3NhZ2UtPmFkZFN1YnBhcnQoJGF0dFsnZGF0YSddLCAkcGFyYW1zKTsKCQkJCX0KCQkJfQoKCQkJJG91dHB1dCA9ICRtaW1lTWVzc2FnZS0+ZW5jb2RlKCk7CgkJCSRtaW1lSGVhZGVycyA9ICRvdXRwdXRbJ2hlYWRlcnMnXTsKCQoJCQlmb3JlYWNoICgkbWltZUhlYWRlcnMgYXMgJGsgPT4gJHYpIHsKCQkJCSR0aGlzLT5kZWJ1ZygiTUlNRSBoZWFkZXIgJGs6ICR2Iik7CgkJCQlpZiAoc3RydG9sb3dlcigkaykgPT0gJ2NvbnRlbnQtdHlwZScpIHsKCQkJCQkvLyBQSFAgaGVhZGVyKCkgc2VlbXMgdG8gc3RyaXAgbGVhZGluZyB3aGl0ZXNwYWNlIHN0YXJ0aW5nCgkJCQkJLy8gdGhlIHNlY29uZCBsaW5lLCBzbyBmb3JjZSBldmVyeXRoaW5nIHRvIG9uZSBsaW5lCgkJCQkJJHRoaXMtPm1pbWVDb250ZW50VHlwZSA9IHN0cl9yZXBsYWNlKCJcclxuIiwgIiAiLCAkdik7CgkJCQl9CgkJCX0KCQoJCQlyZXR1cm4gJG91dHB1dFsnYm9keSddOwoJCX0KCgkJcmV0dXJuIHBhcmVudDo6Z2V0SFRUUEJvZHkoJHNvYXBtc2cpOwoJfQoJCgkvKioKCSogZ2V0cyB0aGUgSFRUUCBjb250ZW50IHR5cGUgZm9yIHRoZSBjdXJyZW50IHJlc3BvbnNlLgoJKgoJKiBOb3RlOiBnZXRIVFRQQm9keSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgdGhpcy4KCSoKCSogQHJldHVybiBzdHJpbmcgdGhlIEhUVFAgY29udGVudCB0eXBlIGZvciB0aGUgY3VycmVudCByZXNwb25zZS4KCSogQGFjY2VzcyBwcml2YXRlCgkqLwoJZnVuY3Rpb24gZ2V0SFRUUENvbnRlbnRUeXBlKCkgewoJCWlmIChjb3VudCgkdGhpcy0+cmVzcG9uc2VBdHRhY2htZW50cykgPiAwKSB7CgkJCXJldHVybiAkdGhpcy0+bWltZUNvbnRlbnRUeXBlOwoJCX0KCQlyZXR1cm4gcGFyZW50OjpnZXRIVFRQQ29udGVudFR5cGUoKTsKCX0KCQoJLyoqCgkqIGdldHMgdGhlIEhUVFAgY29udGVudCB0eXBlIGNoYXJzZXQgZm9yIHRoZSBjdXJyZW50IHJlc3BvbnNlLgoJKiByZXR1cm5zIGZhbHNlIGZvciBub24tdGV4dCBjb250ZW50IHR5cGVzLgoJKgoJKiBOb3RlOiBnZXRIVFRQQm9keSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgdGhpcy4KCSoKCSogQHJldHVybiBzdHJpbmcgdGhlIEhUVFAgY29udGVudCB0eXBlIGNoYXJzZXQgZm9yIHRoZSBjdXJyZW50IHJlc3BvbnNlLgoJKiBAYWNjZXNzIHByaXZhdGUKCSovCglmdW5jdGlvbiBnZXRIVFRQQ29udGVudFR5cGVDaGFyc2V0KCkgewoJCWlmIChjb3VudCgkdGhpcy0+cmVzcG9uc2VBdHRhY2htZW50cykgPiAwKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJcmV0dXJuIHBhcmVudDo6Z2V0SFRUUENvbnRlbnRUeXBlQ2hhcnNldCgpOwoJfQoKCS8qKgoJKiBwcm9jZXNzZXMgU09BUCBtZXNzYWdlIHJlY2VpdmVkIGZyb20gY2xpZW50CgkqCgkqIEBwYXJhbQlhcnJheQkkaGVhZGVycwlUaGUgSFRUUCBoZWFkZXJzCgkqIEBwYXJhbQlzdHJpbmcJJGRhdGEJCXVucHJvY2Vzc2VkIHJlcXVlc3QgZGF0YSBmcm9tIGNsaWVudAoJKiBAcmV0dXJuCW1peGVkCXZhbHVlIG9mIHRoZSBtZXNzYWdlLCBkZWNvZGVkIGludG8gYSBQSFAgdHlwZQoJKiBAYWNjZXNzICAgcHJpdmF0ZQoJKi8KICAgIGZ1bmN0aW9uIHBhcnNlUmVxdWVzdCgkaGVhZGVycywgJGRhdGEpIHsKCQkkdGhpcy0+ZGVidWcoJ0VudGVyaW5nIHBhcnNlUmVxdWVzdCgpIGZvciBwYXlsb2FkIG9mIGxlbmd0aCAnIC4gc3RybGVuKCRkYXRhKSAuICcgYW5kIHR5cGUgb2YgJyAuICRoZWFkZXJzWydjb250ZW50LXR5cGUnXSk7CgkJJHRoaXMtPnJlcXVlc3RBdHRhY2htZW50cyA9IGFycmF5KCk7CgkJaWYgKHN0cnN0cigkaGVhZGVyc1snY29udGVudC10eXBlJ10sICdtdWx0aXBhcnQvcmVsYXRlZCcpKSB7CgkJCSR0aGlzLT5kZWJ1ZygnRGVjb2RlIG11bHRpcGFydC9yZWxhdGVkJyk7CgkJCSRpbnB1dCA9ICcnOwoJCQlmb3JlYWNoICgkaGVhZGVycyBhcyAkayA9PiAkdikgewoJCQkJJGlucHV0IC49ICIkazogJHZcclxuIjsKCQkJfQoJCQkkcGFyYW1zWydpbnB1dCddID0gJGlucHV0IC4gIlxyXG4iIC4gJGRhdGE7CgkJCSRwYXJhbXNbJ2luY2x1ZGVfYm9kaWVzJ10gPSB0cnVlOwoJCQkkcGFyYW1zWydkZWNvZGVfYm9kaWVzJ10gPSB0cnVlOwoJCQkkcGFyYW1zWydkZWNvZGVfaGVhZGVycyddID0gdHJ1ZTsKCQkJCgkJCSRzdHJ1Y3R1cmUgPSBNYWlsX21pbWVEZWNvZGU6OmRlY29kZSgkcGFyYW1zKTsKCgkJCWZvcmVhY2ggKCRzdHJ1Y3R1cmUtPnBhcnRzIGFzICRwYXJ0KSB7CgkJCQlpZiAoIWlzc2V0KCRwYXJ0LT5kaXNwb3NpdGlvbikpIHsKCQkJCQkkdGhpcy0+ZGVidWcoJ0hhdmUgcm9vdCBwYXJ0IG9mIHR5cGUgJyAuICRwYXJ0LT5oZWFkZXJzWydjb250ZW50LXR5cGUnXSk7CgkJCQkJJHJldHVybiA9IHBhcmVudDo6cGFyc2VSZXF1ZXN0KCRwYXJ0LT5oZWFkZXJzLCAkcGFydC0+Ym9keSk7CgkJCQl9IGVsc2UgewoJCQkJCSR0aGlzLT5kZWJ1ZygnSGF2ZSBhbiBhdHRhY2htZW50IG9mIHR5cGUgJyAuICRwYXJ0LT5oZWFkZXJzWydjb250ZW50LXR5cGUnXSk7CgkJCQkJJGluZm9bJ2RhdGEnXSA9ICRwYXJ0LT5ib2R5OwoJCQkJCSRpbmZvWydmaWxlbmFtZSddID0gaXNzZXQoJHBhcnQtPmRfcGFyYW1ldGVyc1snZmlsZW5hbWUnXSkgPyAkcGFydC0+ZF9wYXJhbWV0ZXJzWydmaWxlbmFtZSddIDogJyc7CgkJCQkJJGluZm9bJ2NvbnRlbnR0eXBlJ10gPSAkcGFydC0+aGVhZGVyc1snY29udGVudC10eXBlJ107CgkJCQkJJGluZm9bJ2NpZCddID0gJHBhcnQtPmhlYWRlcnNbJ2NvbnRlbnQtaWQnXTsKCQkJCQkkdGhpcy0+cmVxdWVzdEF0dGFjaG1lbnRzW10gPSAkaW5mbzsKCQkJCX0KCQkJfQoJCQoJCQlpZiAoaXNzZXQoJHJldHVybikpIHsKCQkJCXJldHVybiAkcmV0dXJuOwoJCQl9CgkJCQoJCQkkdGhpcy0+c2V0RXJyb3IoJ05vIHJvb3QgcGFydCBmb3VuZCBpbiBtdWx0aXBhcnQvcmVsYXRlZCBjb250ZW50Jyk7CgkJCXJldHVybjsKCQl9CgkJJHRoaXMtPmRlYnVnKCdOb3QgbXVsdGlwYXJ0L3JlbGF0ZWQnKTsKCQlyZXR1cm4gcGFyZW50OjpwYXJzZVJlcXVlc3QoJGhlYWRlcnMsICRkYXRhKTsKCX0KfQo/Pgo=]]></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[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ1BlZGFudGljIFNrZWxldG9uIE1vZHVsZSc7CiRsYW5nWydwb3N0aW5zdGFsbCddID0gJ1Bvc3QgSW5zdGFsbCBNZXNzYWdlLCBlLmcuLCBCZSBzdXJlIHRvIHNldCAiVXNlIFNrZWxldG9ucyIgcGVybWlzc2lvbnMgdG8gdXNlIHRoaXMgbW9kdWxlISc7CiRsYW5nWydwb3N0dW5pbnN0YWxsJ10gPSAnUG9zdCBVbmluc3RhbGwgTWVzc2FnZSwgZS5nLiwgIkN1cnNlcyEgRm9pbGVkIEFnYWluISInOwokbGFuZ1sndW5pbnN0YWxsZWQnXSA9ICdNb2R1bGUgVW5pbnN0YWxsZWQuJzsKJGxhbmdbJ2luc3RhbGxlZCddID0gJ01vZHVsZSB2ZXJzaW9uICVzIGluc3RhbGxlZC4nOwokbGFuZ1sncHJlZnN1cGRhdGVkJ10gPSAnTW9kdWxlIHByZWZlcmVuY2VzIHVwZGF0ZWQuJzsKJGxhbmdbJ2xvdWQnXSA9ICdMT1VELic7CiRsYW5nWydxdWlldCddID0gJ3F1aWV0JzsKJGxhbmdbJ2FjY2Vzc2RlbmllZCddID0gJ0FjY2VzcyBEZW5pZWQuIFBsZWFzZSBjaGVjayB5b3VyIHBlcm1pc3Npb25zLic7CiRsYW5nWydlcnJvciddID0gJ0Vycm9yISc7CiRsYW5nWyd1cGdyYWRlZCddID0gJ01vZHVsZSB1cGdyYWRlZCB0byB2ZXJzaW9uICVzLic7CiRsYW5nWyd0aXRsZV9zaW5nX2xvdWRseSddID0gJ1NpbmcgTG91ZGx5Pyc7CiRsYW5nWyd0aXRsZV9tb2RfcHJlZnMnXSA9ICdNb2R1bGUgUHJlZmVyZW5jZXMnOwokbGFuZ1sndGl0bGVfbW9kX2FkbWluJ10gPSAnTW9kdWxlIEFkbWluIFBhbmVsJzsKJGxhbmdbJ3RpdGxlX2FkbWluX3BhbmVsJ10gPSAnU2tlbGV0b24gTW9kdWxlJzsKJGxhbmdbJ21vZGRlc2NyaXB0aW9uJ10gPSAnVGhpcyBtb2R1bGUgaXMgYSBza2VsZXRvbiBtb2R1bGUgdGhhdCBkb2VzIG5vdGhpbmcuJzsKJGxhbmdbJ3dlbGNvbWVfdGV4dCddID0gJzxwPldlbGNvbWUgdG8gdGhlIFBlZGFudGljIFNrZWxldG9uIE1vZHVsZSBhZG1pbiBzZWN0aW9uLiBTb21ldGhpbmcgZWxzZSB3b3VsZCBwcm9iYWJseSBnbyBoZXJlIGlmIHRoZSBtb2R1bGUgYWN0dWFsbHkgZGlkIHNvbWV0aGluZy48L3A+JzsKJGxhbmdbJ2NoYW5nZWxvZyddID0gJzx1bD48bGk+VmVyc2lvbiAxLjEuIDExIFNlcHRlbWJlciAyMDA1LiBDbGVhbmVkIHVwIHJlZmVyZW5jZXMgdGhhdCBjYXVzZWQgcHJvYmxlbXMgZm9yIFBIUCA0LjQueCBvciA1LjAuNS48L2xpPgo8bGk+VmVyc2lvbiAxLjAuIDYgQXVndXN0IDIwMDUuIEluaXRpYWwgUmVsZWFzZS48L2xpPjwvdWw+JzsKJGxhbmdbJ2hlbHAnXSA9ICc8aDM+V2hhdCBEb2VzIFRoaXMgRG8/PC9oMz4KPHA+Tm90aGluZy4gSXRcJ3MgZGVzaWduZWQgdG8gYmUgYSBzdGFydGluZyBwb2ludCBmb3IgeW91IHRvIGRldmVsb3AgeW91ciBvd24gbW9kdWxlcy48L3A+CjxoMz5Ib3cgRG8gSSBVc2UgSXQ8L2gzPgo8cD5XZWxsLCB5b3UgY291bGQgYWN0dWFsbHkgaW5zdGFsbCBpdCBieSBwbGFjaW5nIHRoZSBtb2R1bGUgaW4gYSBwYWdlIG9yIHRlbXBsYXRlIHVzaW5nIHRoZSBzbWFydHkgdGFnICYjMTIzO2Ntc19tb2R1bGUgbW9kdWxlPVwnU2tlbGV0b25cJ308L3A+CjxwPllvdSB3b3VsZCBiZSB3aXNlciwgaG93ZXZlciwgdG8gdXNlIHRoZSBtb2R1bGUgYXMgYSBzdGFydGluZyBwb2ludCwgYW5kIGVkaXRpbmcgdGhlIGNvZGUgdG8gZG8gd2hhdGV2ZXIgaXQgaXMgeW91IGFyZSB3YW50aW5nIHRvIGRvLjwvcD4KPGgzPlN1cHBvcnQ8L2gzPgo8cD5UaGlzIG1vZHVsZSBkb2VzIG5vdCBpbmNsdWRlIGNvbW1lcmNpYWwgc3VwcG9ydC4gSG93ZXZlciwgdGhlcmUgYXJlIGEgbnVtYmVyIG9mIHJlc291cmNlcyBhdmFpbGFibGUgdG8gaGVscCB5b3Ugd2l0aCBpdDo8L3A+Cjx1bD4KPGxpPkZvciB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhpcyBtb2R1bGUsIEZBUXMsIG9yIHRvIGZpbGUgYSBCdWcgUmVwb3J0IG9yIGJ1eSBjb21tZXJjaWFsIHN1cHBvcnQsIHBsZWFzZSB2aXNpdCBTakdcJ3MKbW9kdWxlIGhvbWVwYWdlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuY21zbW9kdWxlcy5jb20iPkNNU01vZHVsZXMuY29tPC9hPi48L2xpPgo8bGk+QWRkaXRpb25hbCBkaXNjdXNzaW9uIG9mIHRoaXMgbW9kdWxlIG1heSBhbHNvIGJlIGZvdW5kIGluIHRoZSA8YSBocmVmPSJodHRwOi8vZm9ydW0uY21zbWFkZXNpbXBsZS5vcmciPkNNUyBNYWRlIFNpbXBsZSBGb3J1bXM8L2E+LjwvbGk+CjxsaT5UaGUgYXV0aG9yLCBTakcsIGNhbiBvZnRlbiBiZSBmb3VuZCBpbiB0aGUgPGEgaHJlZj0iaXJjOi8vaXJjLmZyZWVub2RlLm5ldC8jY21zIj5DTVMgSVJDIENoYW5uZWw8L2E+LjwvbGk+CjxsaT5MYXN0bHksIHlvdSBtYXkgaGF2ZSBzb21lIHN1Y2Nlc3MgZW1haWxpbmcgdGhlIGF1dGhvciBkaXJlY3RseS48L2xpPiAgCjwvdWw+CjxwPkFzIHBlciB0aGUgR1BMLCB0aGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGFzLWlzLiBQbGVhc2UgcmVhZCB0aGUgdGV4dApvZiB0aGUgbGljZW5zZSBmb3IgdGhlIGZ1bGwgZGlzY2xhaW1lci48L3A+Cgo8aDM+Q29weXJpZ2h0IGFuZCBMaWNlbnNlPC9oMz4KPHA+Q29weXJpZ2h0ICZjb3B5OyAyMDA1LCBTYW11ZWwgR29sZHN0ZWluIDxhIGhyZWY9Im1haWx0bzpzamdAY21zbW9kdWxlcy5jb20iPiZsdDtzamdAY21zbW9kdWxlcy5jb20mZ3Q7PC9hPi4gQWxsIFJpZ2h0cyBBcmUgUmVzZXJ2ZWQuPC9wPgo8cD5UaGlzIG1vZHVsZSBoYXMgYmVlbiByZWxlYXNlZCB1bmRlciB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMIj5HTlUgUHVibGljIExpY2Vuc2U8L2E+LiBZb3UgbXVzdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UgYmVmb3JlIHVzaW5nIHRoZSBtb2R1bGUuPC9wPgonOwo/Pgo=]]></data>
  </file>
  <file>
    <filename>nuSOAP.module.php</filename>
    <isdir>0</isdir>
    <data><![CDATA[PD9waHAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IG51U09BUCAtIGEgcGVkYW50aWMgInN0YXJ0aW5nIHBvaW50IiBtb2R1bGUKIyBWZXJzaW9uOiAxLjEsIGNhbGd1eTEwMDAKIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIENNUyAtIENNUyBNYWRlIFNpbXBsZSBpcyAoYykgMjAwNSBieSBUZWQgS3VscCAod2lzaHlAY21zbWFkZXNpbXBsZS5vcmcpCiMgVGhpcyBwcm9qZWN0J3MgaG9tZXBhZ2UgaXM6IGh0dHA6Ly93d3cuY21zbWFkZXNpbXBsZS5vcmcKIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoKcmVxdWlyZV9vbmNlKCJjbGFzc2VzL251c29hcC5waHAiKTsgCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovKiBZb3VyIGluaXRpYWwgQ2xhc3MgZGVjbGFyYXRpb24uIFRoaXMgZmlsZSdzIG5hbWUgbXVzdAogICBiZSAiW2NsYXNzJ3MgbmFtZV0ubW9kdWxlLnBocCIsIG9yLCBpbiB0aGlzIGNhc2UsCiAgIG51U09BUC5tb2R1bGUucGhwCiovIApjbGFzcyBudVNPQVAgZXh0ZW5kcyBDTVNNb2R1bGUKewoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBHZXROYW1lKCkKICAgbXVzdCByZXR1cm4gdGhlIGV4YWN0IGNsYXNzIG5hbWUgb2YgdGhlIG1vZHVsZS4KICAgSWYgdGhlc2UgZG8gbm90IG1hdGNoLCBiYWQgdGhpbmdzIGhhcHBlbi4KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBHZXROYW1lKCkKICB7CiAgICByZXR1cm4gJ251U09BUCc7CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgR2V0RnJpZW5kbHlOYW1lKCkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBHZXRGcmllbmRseU5hbWUoKQogIHsKICAgIHJldHVybiAkdGhpcy0+TGFuZygnZnJpZW5kbHluYW1lJyk7CiAgfQoKCQogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIEdldFZlcnNpb24oKQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIEdldFZlcnNpb24oKQogIHsKICAgIHJldHVybiAnMS4wJzsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBHZXRIZWxwKCkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBHZXRIZWxwKCkKICB7CiAgICByZXR1cm4gJHRoaXMtPkxhbmcoJ2hlbHAnKTsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBHZXRBdXRob3IoKQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIEdldEF1dGhvcigpCiAgewogICAgcmV0dXJuICdjYWxndXkxMDAwJzsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBHZXRBdXRob3JFbWFpbCgpCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gR2V0QXV0aG9yRW1haWwoKQogIHsKICAgIHJldHVybiAnY2FsZ3V5MTAwMEBob3RtYWlsLmNvbSc7CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgR2V0Q2hhbmdlTG9nKCkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBHZXRDaGFuZ2VMb2coKQogIHsKICAgIHJldHVybiAkdGhpcy0+TGFuZygnY2hhbmdlbG9nJyk7CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgSXNQbHVnaW5Nb2R1bGUoKQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIElzUGx1Z2luTW9kdWxlKCkKICB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBIYXNBZG1pbigpCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gSGFzQWRtaW4oKQogIHsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIEdldEFkbWluU2VjdGlvbigpCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gR2V0QWRtaW5TZWN0aW9uKCkKICB7CiAgICByZXR1cm4gJ2V4dGVuc2lvbnMnOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIEdldEFkbWluRGVzY3JpcHRpb24oKQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIEdldEFkbWluRGVzY3JpcHRpb24oKQogIHsKICAgIHJldHVybiAkdGhpcy0+TGFuZygnbW9kZGVzY3JpcHRpb24nKTsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBWaXNpYmxlVG9BZG1pblVzZXIoKQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIFZpc2libGVUb0FkbWluVXNlcigpCiAgewogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgR2V0RGVwZW5kZW5jaWVzKCkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBHZXREZXBlbmRlbmNpZXMoKQogIHsKICAgIHJldHVybiBhcnJheSgpOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIEluc3RhbGwoKQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIEluc3RhbGwoKQogIHsKICAgIC8vIHB1dCBtZW50aW9uIGludG8gdGhlIGFkbWluIGxvZwogICAgJHRoaXMtPkF1ZGl0KCAwLCAkdGhpcy0+TGFuZygnZnJpZW5kbHluYW1lJyksICR0aGlzLT5MYW5nKCdpbnN0YWxsZWQnLCR0aGlzLT5HZXRWZXJzaW9uKCkpKTsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBJbnN0YWxsUG9zdE1lc3NhZ2UoKQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIEluc3RhbGxQb3N0TWVzc2FnZSgpCiAgewogICAgcmV0dXJuICR0aGlzLT5MYW5nKCdwb3N0aW5zdGFsbCcpOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIFVuaW5zdGFsbFBvc3RNZXNzYWdlKCkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBVbmluc3RhbGxQb3N0TWVzc2FnZSgpCiAgewogICAgcmV0dXJuICR0aGlzLT5MYW5nKCdwb3N0dW5pbnN0YWxsJyk7CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgVXBncmFkZSgpCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gVXBncmFkZSgkb2xkdmVyc2lvbiwgJG5ld3ZlcnNpb24pCiAgewogICAgJGN1cnJlbnRfdmVyc2lvbiA9ICRvbGR2ZXJzaW9uOwogICAgc3dpdGNoKCRjdXJyZW50X3ZlcnNpb24pCiAgICAgIHsKICAgICAgY2FzZSAiMS4wIjoKCWJyZWFrOwogICAgICBjYXNlICIxLjEiOgoJYnJlYWs7CiAgICAgIH0KCQkKICAgIC8vIHB1dCBtZW50aW9uIGludG8gdGhlIGFkbWluIGxvZwogICAgJHRoaXMtPkF1ZGl0KCAwLCAkdGhpcy0+TGFuZygnZnJpZW5kbHluYW1lJyksICR0aGlzLT5MYW5nKCd1cGdyYWRlZCcsJHRoaXMtPkdldFZlcnNpb24oKSkpOwogIH0KCQoJCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgVW5pbnN0YWxsKCkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBVbmluc3RhbGwoKQogIHsKICAgIC8vIHB1dCBtZW50aW9uIGludG8gdGhlIGFkbWluIGxvZwogICAgJHRoaXMtPkF1ZGl0KCAwLCAkdGhpcy0+TGFuZygnZnJpZW5kbHluYW1lJyksICR0aGlzLT5MYW5nKCd1bmluc3RhbGxlZCcpKTsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBEb0FjdGlvbigkYWN0aW9uLCAkaWQsICRwYXJhbXMsICRyZXR1cm5faWQpCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gRG9BY3Rpb24oJGFjdGlvbiwgJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkPS0xKQogIHsKICAgIHN3aXRjaCAoJGFjdGlvbikKICAgICAgewogICAgICBjYXNlICdkZWZhdWx0JzoKCXsKCSAgYnJlYWs7Cgl9CiAgICAgIGNhc2UgJ2RlZmF1bHRhZG1pbic6Cgl7CgkgIGJyZWFrOwoJfQogICAgICB9CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBEaXNwbGF5RXJyb3JQYWdlKCRpZCwgJHBhcmFtcywgJHJldHVybl9pZCwgJG1lc3NhZ2UpCiAgIE5PVCBQQVJUIE9GIFRIRSBNT0RVTEUgQVBJCgogICBUaGlzIGlzIGFuIGV4YW1wbGUgb2YgYSBzaW1wbGUgbWV0aG9kIHRvIGRpc3BsYXkKICAgZXJyb3IgaW5mb3JtYXRpb24gb24gdGhlIGFkbWluIHNpZGUuCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gRGlzcGxheUVycm9yUGFnZSgkaWQsICYkcGFyYW1zLCAkcmV0dXJuaWQsICRtZXNzYWdlPScnKQogIHsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigndGl0bGVfZXJyb3InLCAkdGhpcy0+TGFuZygnZXJyb3InKSk7CiAgICBpZiAoJG1lc3NhZ2UgIT0gJycpCiAgICAgIHsKCSR0aGlzLT5zbWFydHktPmFzc2lnbl9ieV9yZWYoJ21lc3NhZ2UnLCAkbWVzc2FnZSk7CiAgICAgIH0KCiAgICAvLyBEaXNwbGF5IHRoZSBwb3B1bGF0ZWQgdGVtcGxhdGUKICAgIGVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZSgnZXJyb3IudHBsJyk7CiAgfQoKfSAvLyBjbGFzcwoKPz4K]]></data>
  </file>
  <file>
    <filename>templates/</filename>
    <isdir>1</isdir>
  </file>
  <file>
    <filename>templates/error.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[PGgzPnskdGl0bGVfZXJyb3J9PC9oMz4KPHA+eyRhZG1pbl9uYXZ9PC9wPgp7aWYgJG1lc3NhZ2UhPScnfTxwPnskbWVzc2FnZX08L3A+ey9pZn0=]]></data>
  </file>
</module>
