<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE module [
  <!ELEMENT module (dtdversion,name,version,description*,help*,about*,requires*,file+)>
  <!ELEMENT dtdversion (#PCDATA)>
  <!ELEMENT name (#PCDATA)>
  <!ELEMENT version (#PCDATA)>
  <!ELEMENT mincmsversion (#PCDATA)>
  <!ELEMENT description (#PCDATA)>
  <!ELEMENT help (#PCDATA)>
  <!ELEMENT about (#PCDATA)>
  <!ELEMENT requires (requiredname,requiredversion)>
  <!ELEMENT requiredname (#PCDATA)>
  <!ELEMENT requiredversion (#PCDATA)>
  <!ELEMENT file (filename,isdir,data)>
  <!ELEMENT filename (#PCDATA)>
  <!ELEMENT isdir (#PCDATA)>
  <!ELEMENT data (#PCDATA)>
]>
<module>
	<dtdversion>1.3</dtdversion>
	<name>NeoModule</name>
	<version>0.4.1</version>
  <mincmsversion>1.9</mincmsversion>
	<help><![CDATA[PHN0cm9uZz5Ob3RpY2UhIFRoaXMgaXMgYSBtb2R1bGUtZGV2ZWxvcGVyLW9ubHkgbW9kdWxlLiBJZiB5b3UgYXJlIG5vdCBhIGRldmVsb3Blcgp5b3UnbGwgcHJvYmFibHkganVzdCB3YW50IHRvIHNraXAgdGhlIGdvcnkgZGV0YWlscyBvZiB0aGlzIHBhZ2UgYW5kIHJlbHkgb24gdGhhdAp0aGUgbW9kdWxlIGp1c3QgZG9lcyBpdCdzIHdvcmsuPC9zdHJvbmc+CjxoMz5QdXJwb3NlIG9mIHRoZSBtb2R1bGU8L2gzPgpUaGUgcHVycG9zZSBvZiB0aGlzIG1vZHVsZSBpcyB0byBjdXQgb2ZmIG9uIGRldmVsb3BtZW50dGltZSBwcm92aWRpbmcgc29tZQplYXN5IHRvIHVzZSBmdW5jdGlvbnMgZXh0ZW5kaW5nIHRoZSBtb2R1bGUtQVBJIG9mIENNUyBNYWRlIFNpbXBsZS4gVGhpcyBpbmNsdWRlcywKYnV0IGlzIG5vIGxpbWl0ZWQgdG8sIHNob3J0Y3V0cyB0byBOZW9EYXRhU3RvcmFnZS1mdW5jaW9uYWxpdHksIGEgY291cGxlIG9mIG5pY2UKU21hcnR5LXNob3J0Y3V0cywgRmlyZVBIUC1pbnRlZ3JhdGlvbiBldGMuCjxoMz5Vc2FnZSBvZiB0aGUgbW9kdWxlPC9oMz4KVG8gdXNlIHRoaXMgZXh0ZW5kZWQgbW9kdWxlLWNsYXNzIHlvdSBzaG91bGQgaW5oZXJpdCBmcm9tIE5lb01vZHVsZS1jbGFzcyBpbnN0ZWFkCm9mIHRoZSB1c3VhbCBDTVNNb2R1bGUtY2xhc3MuIFRoaXMgY2FuIGJlIGRvbmUgbGlrZSB0aGlzOgo8cHJlPgpyZXF1aXJlX29uY2UoZGlybmFtZShkaXJuYW1lKF9fRklMRV9fKSkuIi9OZW9Nb2R1bGUvTmVvTW9kdWxlLm1vZHVsZS5waHAiKTsKY2xhc3MgTXlNb2R1bGUgZXh0ZW5kcyBOZW9Nb2R1bGUgewo8L3ByZT4KSWYgeW91IHdpc2ggdG8gdXNlIHRoZSBOZXdEYXRhU3RvcmFnZSBmdW5jdGlvbmFsaXR5LCB5b3Ugc2hvdWxkIG9mIGNvdXJzZSBhbHNvCmluc3RhbGwgdGhhdCBtb2R1bGUuCjxoMz5Ib3cgdG8gZ2V0IGhlbHA8L2gzPgpJIHdpbGwgcmVwZWF0LCB0aGlzIG1vZHVsZSBpcyBmb3IgZGV2ZWxvcGVycyBvbmx5LiBJZiB5b3UgY2Fubm90IHJlYWQgcGhwLXNvdXJjZSBjb2RlLAp5b3Ugc2hvdWxkIHVzZSBpdCBmb3IgZGV2ZWxvcG1lbnQgYW55d2F5LiBJZiB5b3UgY2FuLCBhbHdheXMgY2hlY2sgb3V0IHRoZSBjb2RlIApmb3IgaGludHMgb24gaG93IHRvIG1ha2UgaXQgd29yay4gSWYgeW91IHN0aWxsIGhhdmUgcXVlc3Rpb25zIG9yIHN1Z2dlc3Rpb25zIGZvcgpmaXhlcy9pbXByb3ZlbWVudHMsIHBsZWFzZSBmZWVsIGZyZWUgdG8gY2F0Y2ggbWUgKFNpbG1hcmlsbGlvbikgaW4gdGhlIGZvcnVtIG9nICNpcmMuCgo8aDM+TGlzdCBvZiBtZXRob2RzPC9oMz4KSSB3aWxsIHRyeSB0byBrZWVwIHRoaXMgbGlzdCB1cHRvZGF0ZSwgYnV0IGZvciBtb3N0IHJlY2VudCBsaXN0LCBwbGVhc2UKY2hlY2sgdGhlIE5lb01vZHVsZS5tb2R1bGUucGhwLWZpbGUgaXRzZWxmLiBTb21lIGRvY3VtZW50YXRpb24gb2YgdGhlIG1ldGhvZHMKbWF5IGV2ZW4gc25lYWsgaW4gdGhlcmUgc29tIGRheS4KPHByZT4KLyoKICoKICogU2V0dXAgZnVuY3Rpb25zCiAqCiAqLwoKZnVuY3Rpb24gU2V0SWQoJGlkKQpmdW5jdGlvbiBOZW9TZXRJZCgkaWQpCmZ1bmN0aW9uIE5lb1NldFJldHVybklkKCRyZXR1cm5pZCkKZnVuY3Rpb24gTmVvU2V0dXAoJGlkLCRtb2R1bGUsJHJldHVybmlkPSIwIiwkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb1NldFBhcmFtcygkcGFyYW1zKTsKCiAgLyoKICAgKgogICAqIEdlbmVyYWwgc2hvcnRjdXQgZnVuY3Rpb25zCiAgICoKICAgKi8KZnVuY3Rpb24gUHJlZigkcHJlZm5hbWUsJGRlZmF1bHQ9IiIpCmZ1bmN0aW9uIFNldFByZWYoJHByZWZuYW1lLCAkdmFsdWUpIHsKCi8vU2V0cyBhIHByZWZlcmVuY2UgdG8gdGhlIHZhbHVlIG9mIHRoZSBzYW1lIG5hbWUgaW4gdGhlICRwYXJhbXMtYXJyYXkgc2V0IGJ5IE5lb1NldFVwLgovL09wdGlvbmFsbHkgZGVsZXRpbmcgYXNzaWduaW5nIGEgdmFsdWUgb3IgZGVsZXRpbmcgdGhlIHByZWZlcmVuY2UgaWYgbm90IHNldCBpbiB0aGlzIGFycmF5CmZ1bmN0aW9uIE5lb1NldFByZWYoJHByZWZuYW1lLCAkbm90c2V0dmFsdWU9IiIsICRkZWxldGVpZm5vdHNldD1mYWxzZSkKZnVuY3Rpb24gTmVvU2V0UHJlZnMoJHByZWZzPWFycmF5KCkpIC8vcmVxdWlyZXMgYW4gYXNzb2NpYXRlZCBhcnJheSBvZiAkcHJlZm5hbWVzPT4kbm90c2V0dmFsdWUKZnVuY3Rpb24gTmVvQ21zTGluaygkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb0Ntc1VybCgkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb1JlZGlyZWN0KCRhY3Rpb249IiIsJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBOZW9SZWRpcmVjdEZ1bGwoJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBOZW9BZG1pblJldHVybigkcGFyYW1zPWFycmF5KCkpCi8qCiAqCiAqIEZvcm0tZ2VuZXJhdGlvbiBmdW5jdGlvbnMKICoKICovCgpmdW5jdGlvbiBOZW9Gb3JtU3RhcnQoJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBOZW9Gb3JtRW5kKCRwYXJhbXM9YXJyYXkoKSkKZnVuY3Rpb24gTmVvSW5wdXRUZXh0KCRwYXJhbXM9YXJyYXkoKQpmdW5jdGlvbiBOZW9UZXh0YXJlYSgkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb0lucHV0Q2hlY2tib3goJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBOZW9JbnB1dFN1Ym1pdCgkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb0lucHV0UmVzZXQoJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBOZW9JbnB1dElucHV0RHJvcGRvd24oJHBhcmFtcz1hcnJheSgpKQoKLyogZnVuY3Rpb24gYmVsb3cgaW5jbHVkZSBzbWFydHlhc3NpZ25tZW50LCBkb2VzIG5vdCByZXR1cm4gYW55dGhpbmcgKi8KZnVuY3Rpb24gU21hcnR5Rm9ybVN0YXJ0KCRzbWFydHluYW1lLCRwYXJhbXM9YXJyYXkoKSkKCmZ1bmN0aW9uIFNtYXJ0eUZvcm1FbmQoJHNtYXJ0eW5hbWUpCmZ1bmN0aW9uIFNtYXJ0eUlucHV0U3VibWl0KCRzbWFydHluYW1lLCRwYXJhbXMpCgpmdW5jdGlvbiBTbWFydHlJbnB1dFRleHQoJHNtYXJ0eW5hbWUsJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBTbWFydHlJbnB1dENoZWNrYm94KCRzbWFydHluYW1lLCRwYXJhbXM9YXJyYXkoKSkKCmZ1bmN0aW9uIFNtYXJ0eUlucHV0SGlkZGVuKCRzbWFydHluYW1lLCRuYW1lLCR2YWx1ZSkKb3IKZnVuY3Rpb24gU21hcnR5SW5wdXRIaWRkZW4oJHNtYXJ0eW5hbWUsJHBhcmFtcykKCmZ1bmN0aW9uIFNtYXJ0eUlucHV0TXVsdGlIaWRkZW4oJHNtYXJ0eW5hbWUsJGZpZWxkcz1hcnJheSgpKQoKLyoKICoKICogTmVvRGF0YVN0b3JhZ2Ugc2hvcnRjdXRzCiAqCiAqLwpmdW5jdGlvbiBBZGRFbnRpdHkoJHRhYmxlLCAkcHJvcHM9YXJyYXkoKSkKZnVuY3Rpb24gRGVsZXRlRW50aXR5KCRpZCkKZnVuY3Rpb24gR2V0RW50aXR5KCRpZCwgJG92ZXJyaWRlcHJvcHM9YXJyYXkoKSkKZnVuY3Rpb24gR2V0RW50aXRpZXMoJHRhYmxlPSIiLCAkY3JpdGVyaWE9YXJyYXkoKSwgJGFsd2F5c3JldHVybmFycmF5PWZhbHNlKQpmdW5jdGlvbiBHZXRPbmVFbnRpdHkoJHRhYmxlLCAkY3JpdGVyaWE9YXJyYXkoKSwgJGZhaWxpZm11bHRpcGxlPWZhbHNlKQpmdW5jdGlvbiBHZXRFbnRpdGllc0Z1bGwoJHRhYmxlPSIiLCAkY3JpdGVyaWE9YXJyYXkoKSwgJGFsd2F5c3JldHVybmFycmF5PWZhbHNlKQpmdW5jdGlvbiBTZXRFbnRpdHlQcm9wKCRpZCwkcHJvcG5hbWUsJHByb3B2YWx1ZSwkcHJvcHR5cGU9InVuZGVmaW5lZCIpCmZ1bmN0aW9uIENsZWFyRW50aXR5UHJvcCgkaWQsICRwcm9wbmFtZSkKZnVuY3Rpb24gU2V0RW50aXR5UHJvcHMoJGlkLCAkcHJvcHMsICRjbGVhcj10cnVlKQpmdW5jdGlvbiBTZXRFbnRpdHlQcm9wc0Zyb21BcnJheSgkaWQsICRwcm9wcywgJHZhbHVlcywgJGNsZWFyPXRydWUsICRmaWxsPWZhbHNlKQpmdW5jdGlvbiBTZXRFbnRpdHlQcm9wc09uQ3JpdGVyaWEoJHRhYmxlLCAkcHJvcHMsICRjcml0ZXJpYSwgJGNyZWF0ZT10cnVlLCAkY2xlYXI9ZmFsc2UpIC8vRG9lcyBub3Qgd29yawpmdW5jdGlvbiBSZXNldEVudGl0eVByb3BzKCRpZCwgJG5ld3Byb3BzPWFycmF5KCkpCmZ1bmN0aW9uIFJlbW92ZU1vZHVsZUVudGl0aWVzKCkKZnVuY3Rpb24gQ2xlYXJFbnRpdHlQcm9wcygkaWQpCmZ1bmN0aW9uIENvbXBhcmVFbnRpdGllcygkZW50aXR5MSwgJGVudGl0eTIsICRzb3J0ZmllbGQpCmZ1bmN0aW9uIENvbXBhcmVFbnRpdGllc0NvbXBsZXgoJGVudGl0eTEsICRlbnRpdHkyLCAkc29ydGZpZWxkcykKZnVuY3Rpb24gU29ydEVudGl0aWVzKCRsaXN0LCAkc29ydGZpZWxkcykKZnVuY3Rpb24gRW50aXRpZXNDb3VudCgkdGFibGU9IiIsICRjcml0ZXJpYT1hcnJheSgpKQpmdW5jdGlvbiBDbGVhck1vZHVsZUVudGl0aWVzKCkKZnVuY3Rpb24gU2V0RW50aXR5Q29ubmVjdGlvbigkaWQxLCAkaWQyLCAkdHlwZT0iIikKZnVuY3Rpb24gQ2xlYXJFbnRpdHlDb25uZWN0aW9ucygkaWQxLCAkaWQyPS0xLCAkdHlwZT0iIikKZnVuY3Rpb24gQ2xlYXJFbnRpdHlDb25uZWN0aW9uKCRpZDEsICRpZDIsICR0eXBlPSIiKQpmdW5jdGlvbiBDaGVja0VudGl0eUNvbm5lY3Rpb24oJGlkMSwkaWQyLCR0eXBlPSIiLCRyZXR1cm52YWx1ZT10cnVlKQpmdW5jdGlvbiBHZXRFbnRpdHlDb25uZWN0aW9ucygkaWQxLCAkaWQyPS0xLCAkdHlwZT0iIikKZnVuY3Rpb24gQWRkRmllbGRTZXQoJG5hbWUsJGZpZWxkcykKZnVuY3Rpb24gR2V0RmllbGRTZXQoJG5hbWUpCmZ1bmN0aW9uIEVudGl0eVNldFVuc2V0UHJvcHMoJGVudGl0eSwkZmllbGRzZXQsJGZpbGx2YWx1ZT0iIikgewpmdW5jdGlvbiBHZXREU0Vycm9ycygkbmwyYnI9dHJ1ZSwkY2xlYXI9dHJ1ZSkKZnVuY3Rpb24gT3V0cHV0RFNFcnJvcnMoJGNsZWFyPXRydWUpCmZ1bmN0aW9uIERTSW5FcnJvcigpCmZ1bmN0aW9uIE1ha2VTaW1wbGVBcnJheSgkdGFibGUsJGZpZWxkKQpmdW5jdGlvbiBNYWtlQXNzb2NBcnJheSgkdGFibGUsJGZpZWxkcykKCgovKgogKgogKiBMaW5rIGFuZCBpY29uIGZ1bmN0aW9ucwogKgogKi8KCmZ1bmN0aW9uIE5lb0RlbGV0ZUljb24oJGFjdGlvbiwkdGV4dCwkcGFyYW1zPWFycmF5KCksJGNvbmZpcm1hdGlvbj0iIikKZnVuY3Rpb24gTmVvQ29weUljb24oJGFjdGlvbiwkdGV4dCwkcGFyYW1zPWFycmF5KCksJGNvbmZpcm1hdGlvbj0iIikKZnVuY3Rpb24gTmVvRWRpdEljb24oJGFjdGlvbiwkdGV4dCwkcGFyYW1zPWFycmF5KCksJGNvbmZpcm1hdGlvbj0iIikKZnVuY3Rpb24gTmVvQWRkSWNvbigkYWN0aW9uLCR0ZXh0LCRwYXJhbXM9YXJyYXkoKSwkY29uZmlybWF0aW9uPSIiKQpmdW5jdGlvbiBOZW9UcnVlSWNvbigkYWN0aW9uLCR0ZXh0LCRwYXJhbXM9YXJyYXkoKSwkY29uZmlybWF0aW9uPSIiKQpmdW5jdGlvbiBOZW9GYWxzZUljb24oJGFjdGlvbiwkdGV4dCwkcGFyYW1zPWFycmF5KCksJGNvbmZpcm1hdGlvbj0iIikKZnVuY3Rpb24gTmVvU3lzdGVtSWNvbigkaWNvbiwkdGV4dD0iIikKCi8qCiAqCiAqIFV0aWxpdHkgZnVuY3Rpb25zCiAqCiAqLwpmdW5jdGlvbiBOZW9TbGFzaGVzKCR1cmwpCmZ1bmN0aW9uIERlY29kZUhUTUxFbnRpdGllcygkcykKZnVuY3Rpb24gU2xhc2goJHN0ciwkc3RyMj0iIiwkc3RyMz0iIikKZnVuY3Rpb24gU2xhc2hlcygkdXJsKQpmdW5jdGlvbiBpc19hc3NvYygkYXJyYXkpCmZ1bmN0aW9uIE5lb0Rpckxpc3QoJHJvb3QsJHdoYXQ9ImZpbGVzIiwkaW50cm9kdWN0aW9uPWFycmF5KCksJGV4Y2x1ZGVzPWFycmF5KCkpCmZ1bmN0aW9uIE5lb0dldE1pbWVUeXBlKCRmaWxlbmFtZSkKCi8qQ2hlY2tzIGZvciB0aGUgZXhpc3RlbmNlIG9mIGFuIGluZGV4IGluIGFuIGFycmF5IGFuZCByZXR1cm4gdGhlIHZhbHVlIGlmIGl0J3MgdGhlcmUKICphbmQgdGhlIGRlZmF1bHQgdmFsdWUgaWYgaXQncyBub3QKKi8KZnVuY3Rpb24gTmVvUGFyYW1WYWx1ZSgkbmFtZSwkcGFyYW1zLCRkZWZhdWx0PSIiKQoKLy9TaG9ydGN1dCBmb3IgdGhlIGFib3ZlCmZ1bmN0aW9uIE5QVigkbmFtZSwgJHBhcmFtcykKZnVuY3Rpb24gTmVvQXBwbHlQYXJhbVZhbHVlcygkdGhpc2FycmF5LCAkcGFyYW1zLCAkaW5kZXhlcywgJGFsd2F5c2ZpbGw9ZmFsc2UpCmZ1bmN0aW9uIENoZWNrRmlsZUV4dGVuc2lvbigkZmlsZW5hbWUsICRhbGxvd2VkZXh0ZW5zaW9ucz1hcnJheSgpKQoKLy9Gb3Igbm93LCByZWFkIHNvdXJjZSB0byB1bmRlcnN0YW5kCmZ1bmN0aW9uIE5lb1Rvb2xUaXAoJHBhcmFtcz1hcnJheSgpKSAvL3JlcXVpcmVzIDIgY3NzLWNsYXNzZXMgdG8gYmUgc2V0IHVwCgovL0NoZWNrcyBib3RoIHdoZXRoZXIgdGhlIGluZGV4IGV4aXN0cyBpbiB0aGUgYXJyYXkgYW5kIHdoZXRoZXIgaXQgaGFzIGEgdmFsdWUgZGlmZmVyZW50IGZvbXIgbm90aGluZyBvdCBvbmx5IHNwYWNlcwpmdW5jdGlvbiBOZW9FbXB0eSgkaW5kZXg9IiIsJGRhdGE9YXJyYXkoKSkKCi8vVmFsaWRhdGVzIGFuIGVtYWlsYWRyZXNzLCBvcHRpb25hbGx5IGF2b2lkaW5nIGNoZWNraW5nIHRoZSBteC1hdmFpbGFiaWxpdHkgb2YgdGhlIGRvbWFpbgpmdW5jdGlvbiBOZW9WYWxpZGF0ZUVtYWlsKCRlbWFpbCwgJGF2b2lkb25saW5lID0gZmFsc2UpCgovL1ZhbGlkYXRlcyBhbiB1cmwKZnVuY3Rpb24gTmVvVmFsaWRhdGVVUkwoJHVybCkgewoKLy9SZXR1cm5zIGEgdmVyc2lvbiBvZiB0aGUgc3RyaW5nIHdoaWNoIGNhbm5vdCAocGVyaGFwcykgYmUgbGluZS1icm9rZW4KZnVuY3Rpb24gTmVvTm9CcmVha3MoJHN0cmluZykKCi8vc2FtZSBhcyBwcmludF9yLCBidXQgd3JhcHMgaW4gPHByZT4ncyBhbmQgaW4gYSBkaXYgdHJ5aW5nIHRvIG1ha2UgaXQgbW9yZSByZWFkYWJsZQpmdW5jdGlvbiBOZW9QcmludFIoJGRhdGE9YXJyYXkoKSwkc2VuZG91dD10cnVlKQoKLy9yZW1vdmVkIGtleS92YWx1ZXMgd2hlcmUgdHJpbSh2YWx1ZSkgaXMgZW1wdHkgYW5kIHRyaW1zIHZhbHVlcyBpZiBub3QKZnVuY3Rpb24gTmVvVHJpbUFycmF5KCRpbmFycmF5PWFycmF5KCkpCgovKgogKgogKiBTbWFydHkgc2hvcnRjdXRzCiAqCiAqLwpmdW5jdGlvbiBTbWFydHlBc3NpZ24oJHNtYXJ0eWluZm8sICRzbWFydHljb250ZW50PSIiKQpmdW5jdGlvbiBTbWFydHlBc3NpZ25QcmVmKCRzbWFydHluYW1lLCAkcHJlZmVyZW5jZW5hbWU9IiIpIHsKZnVuY3Rpb24gU21hcnR5QXNzaWduQ01TKCRtb2R1bGUsJHZhcm5hbWU9ImNtcyIpCmZ1bmN0aW9uIFNtYXJ0eVVwbG9hZEZvcm1TdGFydCgkc21hcnR5bmFtZSwkcGFyYW1zPWFycmF5KCkpIHsKCi8qCiAqCiAqIERlYnVnZ2luZyBmdW5jdGlvbnMKICoKICovCmZ1bmN0aW9uIEZpcmVEZWJ1ZygkY29tbWFuZCwkbWVzc2FnZT0iIiwkdmFyaWFibGVzPWFycmF5KCkpCgovKgogKgogKiBFcnJvciBoYW5kbGluZwogKgogKi8KZnVuY3Rpb24gRXJyb3IoJGVycm9ydGV4dCwkcmV0dXJudmFsdWU9ZmFsc2UsJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBHZXRFcnJvcnMoJG5sMmJyPXRydWUsJGNsZWFyPXRydWUsJGluY2x1ZGVkcz10cnVlKQpmdW5jdGlvbiBPdXRwdXRFcnJvcnMoJGNsZWFyPXRydWUsJGluY2x1ZGVkcz10cnVlKQpmdW5jdGlvbiBJbkVycm9yKCkKPC9wcmU+PGgzPlBhcmFtZXRyZTwvaDM+PHVsPjxsaT48ZW0+KG9wdGlvbmFsKTwvZW0+IGxhbmc9ImVuX1VTIiAtIFBhcmFtZXRyZXQgYW5naXZlciBodmlsa2V0IHNwcm9nIGRlciBza2FsIGJydWdlcyB0aWwgdmlzbmluZyBmb3IgYmVzJm9zbGFzaDtnZW5kZS4gSWtrZSBhbGxlIG1vZHVsZXIgdW5kZXJzdCZvc2xhc2g7dHRlciBlbGxlciBiZWgmb3NsYXNoO3ZlciBkZXR0ZS48L2xpPjwvdWw+]]></help>
	<about><![CDATA[PGJyIC8+TGF2ZXQgYWY6IE1vcnRlbiBQb3Vsc2VuICZsdDttb3J0ZW5AcG91bHNlbi5vcmcmZ3Q7PGJyIC8+PGJyIC8+VmVyc2lvbjogMC40LjE8YnIgLz48YnIgLz5IaXN0b3JpayBvdmVyICZhZWxpZztuZHJpbmdlcjo8YnIgLz48dWw+CiAgPGxpPnZlcnNpb24gMC40LjE8L2xpPgogIEFkZGVkIG1vcmUgdmFsaWRhdGlvbnMsIGVxdWFsIGFuZCBpZGVudGljYWw8YnIvPgogIEFkZGVkIGV2ZW4gc2hvcnRlciBOZW9VcmwgYW5kIE5lb0xpbmsKICBQcmVwYXJlZCBmb3IgY21zbXMgMS4xMAoKICA8bGk+dmVyc2lvbiAwLjQuMDwvbGk+CiAgQWRkZWQgZGF0ZXRpbWVwaWNrZXIgYW5kIGludGVncmF0ZWQgaXQKCiAgPGxpPnZlcnNpb24gMC4zLjU8YnIvPgogIE11bHRpcGxlIGJ1Z2ZpeGVzIGRpc2NvdmVyZWQgYnkgUGhwU3Rvcm0KICA8YnIvPgoKICA8bGk+dmVyc2lvbiAwLjMuNDxici8+CiAgcmV3b3JrZWQgZm9yIGNtc21zKCktbWV0aG9kcwogIDxici8+CgoKICA8bGk+dmVyc2lvbiAwLjMuMzxici8+CiAgTmV3IGZvcm12YWxpZGF0aW9uIG1ldGhvZHMgZm9yIGRyb3Bkb3ducyBhbmQgcmFkaW9ncm91cHMKICA8YnIvPgogIAogIDxsaT52ZXJzaW9uIDAuMy4yPGJyLz4KICBhZGRlZCBjc3MtaW5qZWN0aW9ucyBzdHlsaW5nIHRoZSBmb3JtdmFsaWRhdGlvbi1wb3B1cAogIDxici8+CiAgc3RhcnRlZCBkb2luZyBzb21lIGV4YW1wbGVzIG9mIGhvdyB0byB1c2UgdGhlIG1vZHVsZS1jbGFzcwoKICA8bGk+dmVyc2lvbiAwLjMuMTxici8+CiAgZml4ZWQgdGhlIHVnbHkgY3NzIGluIGJvZHksaXQncyBub3cgamF2YXNjcmlwdAogIDxici8+Cgo8bGk+dmVyc2lvbiAwLjMuMDxici8+CiAgICBhZGRlZCBuZXcgZnVuY3Rpb24gTmVvU2V0UHJlZnMsIHNob3J0aW5nIHRoZSBzYXZpbmcgb2YgcHJlZnMgZm9yIGluc3RhbmNlCiAgICA8YnIvPgogICAgYWRkZWQgZWFzeSBmb3JtLXZhbGlkYXRpb24gYW5kIG5pY2UgbWVzc2FnZXMgbGlua2VkIHRvIHRoYXQKICAgIDxici8+CiAgICBPYnNvbGV0ZWQgU21hcnR5VXBsb2FkRm9ybVN0YXJ0LgogICAgPGJyLz4KICAgIEFkZGVkIGZ1bmN0aW9uIE5lb1RyaW1BcnJheSgkaW5hcnJheT1hcnJheSgpKQoKICA8bGk+dmVyc2lvbiAwLjIuODxici8+CiAgICBhZGRlZCBuZXcgZnVuY3Rpb24gTmVvR2V0TWltZVR5cGUKICAgIAogIDxsaT52ZXJzaW9uIDAuMi43PGJyLz4KICAgIGZpeGVkIE5lb0Ntc0xpbmsgZm9yIHByZXR0eSB1cmxzLCBtaXNzZWQgdGhlIHRhcmdldGNvbnRlbnRvbmx5IHBhcmFtZXRlci4uLgoKICA8bGk+dmVyc2lvbiAwLjIuNjxici8+CiAgICBBZGRlZCBhIFNldFByZWYtc2hvcnRjdXQgYW5kIGEgbmljZSBOZW9TZXRQcmVmLW1ldGhvZCAoc2VlIGhlbHApCiAgICA8YnIvPgogICAgc2V0IGVudGl0eSBwcm9wcyBmcm9tIGFycmF5IG5vdyB1c2VzIHN0b3JlZCBwYXJhbXMtdmFsdWVzIGlzIG90aGVyIG5vdCBzcGVjaWZpZXMKICAgIDxici8+CiAgICBSZXdvcmtlZCBOZW9SZWRpcmVjdChGdWxsKSB0byBiZSBmYXN0ZXIgdG8gdXNlCiAgICA8YnIvPgogICAgQWRkZWQgTmVvVmFsaWRhdGVVUkwtbWV0aG9kCiAgICA8YnIvPgogICAgQWRkZWQgRGVjb2RlSFRNTEVudGl0aWVzCiAgICA8YnIvPgogICAgQWRkZWQgTmVvQWRtaW5SZXR1cm4KCgogIDxsaT52ZXJzaW9uIDAuMi41PGJyLz4KICAgIEFkZGVkIGFuIG9wdGlvbiB0byBOZW9BZGRJY29uIHRvIGFsc28gaW5jbHVkZSB0aGUgZm9sbGluZ3MgdGV4dCBsaW5rCiAgICA8YnIvPgogICAgQWRkZWQgSXNUYWJsZUVtcHR5CiAgICA8YnIvPgogICAgVXBkYXRlIEVtYWlsVmFsaWRhdGlvbiB0byBtYWlsLWNhcGFiaWxpdGllcyBvZiBkb21haW4gYXMgd2VsbAogICAgPGJyLz4KICAgIE1hZGUgMm5kIHBhcmFtIHRvIE5lb1DDhWFyYW1WYWx1ZSBkb3VibGUgYXMgZGVmYXVsdCB2YWx1ZSAod2hlbiBub3QgYW4gYXJyYXkpCgoKCiAgPGxpPnZlcnNpb24gMC4yLjQ8YnIvPgogICAgQWRkZWQgTmVvRW1wdHktZnVuY3Rpb24gd2hpY2ggY2hlY2tzIGZvciBhbiBpbmRleCBpbiBhbiBhcnJheQogICAgPGJyLz4KICAgIE1hZGUgTmVvUHJpbnRSIG91dHB1dCBjb250ZW50IG9mICRfcGFyYW1zIGlmIG5vIHBhcmFtZXRlciB3YXMgZ2l2ZW4KICAgIDxici8+QWRkZWQgTmVvVmFsaWRhdGVFbWFpbC1mdW5jdGlvbgogICAgPGJyLz5BZGRlZCBOZW9Ob0JyZWFrcy1mdW5jdGlvbgoKICA8bGk+dmVyc2lvbiAwLjIuMzxici8+CiAgICBOb3cgcG9zc2libGUgdG8gcmVnaXN0ZXIgJHBhcmFtcyBmb3IgZXZlbiBlYXNpZXIgc3ludGF4IGluIHJlbGV2YW50IGZ1bmN0aW9ucyBsaWtlIE5QVgogICAgPGJyLz4KICAgIEFkZGVkIENyZWF0ZUlucHV0UGFzc3dvcmQtd3JhcHBlcgogICAgPGJyLz4KICAgIEFkZGVkIGZpbGwgcGFyYW1ldGVyIHRvIFNldEVudGl0eVByb3BzRnJvbUFycmF5CgoKICA8bGk+dmVyc2lvbiAwLjIuMjxici8+CiAgICBBZGRlZCBhIGN1c3RvbSByZXR1cm52YWx1ZSB0byBjaGVja2VudGl0eWNvbm5lY3Rpb25zCiAgICA8YnIvPgogICAgSW1wbGVtZW50ZWQgTWFrZVNpbXBsZUFycmF5CiAgICA8YnIvPgogICAgQWRkZWQgTmVvVHJ1ZUljb24gYW5kICBOZW9UcnVlSWNvbgoKICA8bGk+dmVyc2lvbiAwLjIuMTxici8+CiAgICBhZGRlZCBhcnJheV9kaWZmX2tleSBpbXBsZW1lbnRhdGlvbiBmb3IgcHJlLTUuMS4wIHZlcnNpb24KICAgIDxici8+CiAgICBBZGRlZCAkYWx3YXlzcmV0dXJuYXJyYXk9ZmFsc2UgdG8gR2V0RW50aXRpZXMoRnVsbCktbWV0aG9kcwogICAgPGJyLz4KICAgIEFkZGVkIFNtYXJ0QXNzaWduUHJlZi1tZXRob2QKICAgIDxici8+CiAgICBBZGRlZCBUb29sdGlwLVN1cHBvcnQKICAgIDxici8+CiAgICBBZGRlZCBOZW9SZWRpcmVjdC1mdW5jdGlvbgoKICA8bGk+dmVyc2lvbiAwLjIuMDxici8+CiAgICAtIGdlbmVyYWwgYnVnZml4aW5nPGJyLz4KICAgIC0gQWRkZWQgYSBOZW9EaXJMaXN0LWZ1bmN0aW9uPGJyLz4KICAgIC0gRml4ZWQgbmFtZSBlcnJvciBvbiBOZW9JbnB1dERyb3Bkb3duPGJyLz4KICAgIC0gYWRkZWQgc3VwcG9ydCBmb3IgM3JkIHBhcmFtZXRlciB0byBTbGFzaC1mdW5jdGlvbjxici8+CiAgICAtIGFkZGVkIE5lb0Ntc0xpbmsgYW5kIE5lb0Ntc1VybCBzaG9ydGN1dHM8YnIvPgogICAgLSBhZGRlZCBTbWFydHlVcGxvYWRGb3JtU3RhcnQ8YnIvPgogICAgLSBhZGRlZCBTbWFydHlJbnB1dE11bHRpSGlkZGVuPGJyLz4KCiAgPC9saT4KICA8bGk+dmVyc2lvbiAwLjEuMDxici8+CiAgICAtIGluaXRpYWwgcmVsZWFzZTwvbGk+CjwvdWw+PGJyIC8+]]></about>
	<description><![CDATA[An extended module-class, mainly for the Neo-series modules, but also for others to use]]></description>
	<file>
	  <filename>/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/action.datetimepicker.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKaWYgKCFmdW5jdGlvbl9leGlzdHMoImNtc21zIikpIGRpZSgpOwoKJGpzPWZpbGVfZ2V0X2NvbnRlbnRzKGRpcm5hbWUoX19GSUxFX18pLiIvZGF0ZXRpbWVwaWNrZXIvZGF0ZXRpbWVwaWNrZXJfY3NzLmpzIik7CgppZiAoISRqcykgZGllKCk7CgokcG9zPXN0cnBvcygkanMsIi8vZW5kIEdsb2JhbCB2YXJpYWJsZSIpOwoKJHN0YXJ0PXN1YnN0cigkanMsMCwkcG9zKTsKJGVuZD1zdWJzdHIoJGpzLCRwb3MpOwokY29uZmlnPWNtc21zKCktPkdldENvbmZpZygpOwoKJHJlc3VsdD0nCgp2YXIgaW1hZ2VGaWxlc1BhdGggPSAiJy4kY29uZmlnWyJyb290X3VybCJdLicvbW9kdWxlcy9OZW9Nb2R1bGUvZGF0ZXRpbWVwaWNrZXIvaW1hZ2VzLyI7CgonOwoKJHJlc3VsdD0kc3RhcnQuJHJlc3VsdC4kZW5kOwoKJHJlc3VsdD1zdHJfcmVwbGFjZSgKICBhcnJheSgKICAgICciTW9uZGF5IicsCiAgICAnIlR1ZXNkYXkiJywKICAgICciV2VkbmVzZGF5IicsCiAgICAnIlRodXJzZGF5IicsCiAgICAnIkZyaWRheSInLAogICAgJyJTYXR1cmRheSInLAogICAgJyJTdW5kYXkiJwogICksCiAgYXJyYXkoCiAgICAnIicuaHRtbF9lbnRpdHlfZGVjb2RlKCR0aGlzLT5MYW5nKCJtb25kYXkiKSxFTlRfTk9RVU9URVMsIlVURi04IikuJyInLAogICAgJyInLmh0bWxfZW50aXR5X2RlY29kZSgkdGhpcy0+TGFuZygidHVlc2RheSIpLEVOVF9OT1FVT1RFUywiVVRGLTgiKS4nIicsCiAgICAnIicuaHRtbF9lbnRpdHlfZGVjb2RlKCR0aGlzLT5MYW5nKCJ3ZWRuZXNkYXkiKSxFTlRfTk9RVU9URVMsIlVURi04IikuJyInLAogICAgJyInLmh0bWxfZW50aXR5X2RlY29kZSgkdGhpcy0+TGFuZygidGh1cnNkYXkiKSxFTlRfTk9RVU9URVMsIlVURi04IikuJyInLAogICAgJyInLmh0bWxfZW50aXR5X2RlY29kZSgkdGhpcy0+TGFuZygiZnJpZGF5IiksRU5UX05PUVVPVEVTLCJVVEYtOCIpLiciJywKICAgICciJy5odG1sX2VudGl0eV9kZWNvZGUoJHRoaXMtPkxhbmcoInNhdHVyZGF5IiksRU5UX05PUVVPVEVTLCJVVEYtOCIpLiciJywKICAgICciJy5odG1sX2VudGl0eV9kZWNvZGUoJHRoaXMtPkxhbmcoInN1bmRheSIpLEVOVF9OT1FVT1RFUywiVVRGLTgiKS4nIicKICApCiAgLCRyZXN1bHQpOwoKCgplY2hvICRyZXN1bHQ7CmRpZSgpOwo/Pg==]]></data>
	</file>
	<file>
	  <filename>/datetimepicker/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/datetimepicker/datetimepicker_css.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly9KYXZhc3JpcHQgbmFtZTogTXkgRGF0ZSBUaW1lIFBpY2tlcgovL0RhdGUgY3JlYXRlZDogMTYtTm92LTIwMDMgMjM6MTkKLy9DcmVhdG9yOiBUZW5nWW9uZyBOZwovL1dlYnNpdGU6IGh0dHA6Ly93d3cucmFpbmZvcmVzdG5ldC5jb20KLy9Db3B5cmlnaHQgKGMpIDIwMDMgVGVuZ1lvbmcgTmcKLy9GaWxlTmFtZTogRGF0ZVRpbWVQaWNrZXJfY3NzLmpzCi8vVmVyc2lvbjogMi4yLjAKLy8gTm90ZTogUGVybWlzc2lvbiBnaXZlbiB0byB1c2UgYW5kIG1vZGlmeSB0aGlzIHNjcmlwdCBpbiBBTlkga2luZCBvZiBhcHBsaWNhdGlvbnMgaWYKLy8gICAgICAgaGVhZGVyIGxpbmVzIGFyZSBsZWZ0IHVuY2hhbmdlZC4KLy9QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gcmVkaXN0cmlidXRlIGFuZCBtb2RpZnkgdGhpcyBqYXZhc2NyaXB0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgMy4wLgovL05ldyBDc3Mgc3R5bGUgdmVyc2lvbiBhZGRlZCBieSBZdmFuIExhdm9pZSAoUXXDqWJlYywgQ2FuYWRhKSAyOS1KYW4tMjAwOQovL0Zvcm1hdHRlZCBmb3IgSlNMaW50IGNvbXBhdGliaWxpdHkgYnkgTGFic21lZGlhLmNvbSAoMzAtRGVjLTIwMTApCgovL0dsb2JhbCB2YXJpYWJsZXMKdmFyIHdpbkNhbDsKdmFyIGR0VG9kYXk7CnZhciBDYWw7CnZhciBNb250aE5hbWU7CnZhciBXZWVrRGF5TmFtZTE7CnZhciBXZWVrRGF5TmFtZTI7CnZhciBleERhdGVUaW1lOy8vRXhpc3RpbmcgRGF0ZSBhbmQgVGltZQp2YXIgc2VsRGF0ZTsvL3NlbGVjdGVkIGRhdGUuIHZlcnNpb24gMS43CnZhciBjYWxTcGFuSUQgPSAiY2FsQm9yZGVyIjsgLy8gc3BhbiBJRAp2YXIgZG9tU3R5bGUgPSBudWxsOyAvLyBzcGFuIERPTSBvYmplY3Qgd2l0aCBzdHlsZQp2YXIgY25MZWZ0ID0gIjAiOy8vbGVmdCBjb29yZGluYXRlIG9mIGNhbGVuZGFyIHNwYW4KdmFyIGNuVG9wID0gIjAiOy8vdG9wIGNvb3JkaW5hdGUgb2YgY2FsZW5kYXIgc3Bhbgp2YXIgeHBvcyA9IDA7IC8vIG1vdXNlIHggcG9zaXRpb24KdmFyIHlwb3MgPSAwOyAvLyBtb3VzZSB5IHBvc2l0aW9uCnZhciBjYWxIZWlnaHQgPSAwOyAvLyBjYWxlbmRhciBoZWlnaHQKdmFyIENhbFdpZHRoID0gMjA4Oy8vIGNhbGVuZGFyIHdpZHRoCnZhciBDZWxsV2lkdGggPSAzMDsvLyB3aWR0aCBvZiBkYXkgY2VsbC4KdmFyIFRpbWVNb2RlID0gMjQ7Ly8gRGVmYXVsdCBUaW1lTW9kZSB2YWx1ZS4gMTIgb3IgMjQKdmFyIENhbFBvc09mZnNldFggPSA4OyAvL1ggcG9zaXRpb24gb2Zmc2V0IHJlbGF0aXZlIHRvIGNhbGVuZGFyIGljb24sIGNhbiBiZSBuZWdhdGl2ZSB2YWx1ZQp2YXIgQ2FsUG9zT2Zmc2V0WSA9IDg7IC8vWSBwb3NpdGlvbiBvZmZzZXQgcmVsYXRpdmUgdG8gY2FsZW5kYXIgaWNvbiwgY2FuIGJlIG5lZ2F0aXZlIHZhbHVlCgovL0NvbmZpZ3VyYWJsZSBwYXJhbWV0ZXJzIC0gc3RhcnQKdmFyIFNwYW5Cb3JkZXJDb2xvciA9ICIjMDAwMDAwIjsvL0NhbGVuZGFyIGJvcmRlciBjb2xvcgp2YXIgTW9udGhZZWFyQ29sb3IgPSAiI2NjMDAzMyI7IC8vRm9udCBDb2xvciBvZiBNb250aCBhbmQgWWVhciBpbiBDYWxlbmRhciBoZWFkZXIKdmFyIFdlZWtIZWFkQ29sb3IgPSAiIzE4ODYxQiI7IC8vQmFja2dyb3VuZCBDb2xvciBpbiBXZWVrIGhlYWRlcgp2YXIgU3VuZGF5Q29sb3IgPSAiI0MwRjY0RiI7IC8vQmFja2dyb3VuZCBjb2xvciBvZiBTdW5kYXkKdmFyIFNhdHVyZGF5Q29sb3IgPSAiI0MwRjY0RiI7IC8vQmFja2dyb3VuZCBjb2xvciBvZiBTYXR1cmRheQp2YXIgV2Vla0RheUNvbG9yID0gIiNGRkVEQTYiOyAvL0JhY2tncm91bmQgY29sb3Igb2Ygd2Vla2RheXMKdmFyIFRvZGF5Q29sb3IgPSAiI2ZmYmQzNSI7IC8vQmFja2dyb3VuZCBjb2xvciBvZiB0b2RheQp2YXIgU2VsRGF0ZUNvbG9yID0gIiM4REQ1M0MiOyAvL0JhY2tncm9uZCBjb2xvciBvZiBzZWxlY3RlZCBkYXRlIGluIHRleHRib3gKdmFyIFlyU2VsQ29sb3IgPSAiI2NjMDAzMyI7IC8vY29sb3Igb2YgZm9udCBvZiBNb250aC1ZZWFyIHNlbGVjdG9yLkFwcGxpZXMgb25seSBmb3IgQXJyb3cgbmF2aWdhdGlvbgp2YXIgSG92ZXJDb2xvciA9ICIjRTBGRjM4IjsgLy9jb2xvciBvZiBjZWxsIGJhY2tncm91bmQgd2hlbiBtb3VzZSBtb3ZlIG92ZXIKdmFyIERpc2FibGVDb2xvciA9ICIjOTk5OTY2IjsgLy9jb2xvciBvZiBkaXNhYmxlZCBjZWxsCnZhciBDYWxCZ0NvbG9yID0gIiNGRkZGRkYiOyAvL0JhY2tncm91bmQgY29sb3Igb2YgQ2FsZW5kYXIgd2luZG93IG5vdCBjZWxsCgp2YXIgU3RhcnRZZWFyID0gMTk0MDsgLy9GaXJzdCBzZWxlY3RhYmxlIHllYXIKdmFyIEVuZFllYXIgPSA1OyAvLyBUaGUgb2Zmc2V0IGxhc3QgeWVhciBvZiBwaWNrYWJsZSBkYXRlLiBJZiBjdXJyZW50IHllYXIgaXMgMjAxMSwgdGhlIGxhc3QgeWVhciB0aGF0IHN0aWxsIHBpY2tlciB3aWxsIGJlIDIwMTYgKDIwMTErNSkKdmFyIFdlZWtDaGFyID0gMjsvL251bWJlciBvZiBjaGFyYWN0ZXIgZm9yIHdlZWsgZGF5LiBpZiAyIHRoZW4gTW8sVHUsV2UuIGlmIDMgdGhlbiBNb24sVHVlLFdlZAp2YXIgRGF0ZVNlcGFyYXRvciA9ICIvIjsvL0RhdGUgU2VwYXJhdG9yLCB5b3UgY2FuIGNoYW5nZSBpdCB0byAiLyIgYXMgeW91IHdpc2gKdmFyIFNob3dMb25nTW9udGggPSB0cnVlOy8vU2hvdyBsb25nIG1vbnRoIG5hbWUgaW4gQ2FsZW5kYXIgaGVhZGVyLiBleGFtcGxlOiAiSmFudWFyeSIKdmFyIFNob3dNb250aFllYXIgPSB0cnVlOy8vU2hvdyBNb250aCBhbmQgWWVhciBpbiBDYWxlbmRhciBoZWFkZXIuTm90IGFwcGxpY2FibGUgZm9yIEFycm93IG5hdmlnYXRpb24KdmFyIFByZWNlZGVaZXJvID0gdHJ1ZTsvL1ByZWNlZGluZyB6ZXJvIGluIGRhdGUgZm9ybWF0CnZhciBNb25kYXlGaXJzdERheSA9IHRydWU7Ly90cnVlOlVzZSBNb25kYXkgYXMgZmlyc3QgZGF5OyBmYWxzZTpTdW5kYXkgYXMgZmlyc3QgZGF5LiBbdHJ1ZXxmYWxzZV0gCnZhciBVc2VJbWFnZUZpbGVzID0gdHJ1ZTsvL1VzZSBpbWFnZSBmaWxlcyB3aXRoICJhcnJvd3MiIGFuZCAiY2xvc2UiIGJ1dHRvbgp2YXIgRGlzYWJsZUJlZm9yZVRvZGF5ID0gZmFsc2U7IC8vTWFrZSBkYXRlIGJlZm9yZSB0b2RheSB1bmNsaWNrYWJsZQp2YXIgaW1hZ2VGaWxlc1BhdGggPSAiaW1hZ2VzLyI7IC8vUGF0aCBvZiBkYXRlIHRpbWUgcGlja2VyIGltYWdlIGZpbGVzIHJlbGF0aXZlIHRvIEhUTUwgcGFnZS4KLy9Db25maWd1cmFibGUgcGFyYW1ldGVycyAtIGVuZAoKLy91c2UgdGhlIE1vbnRoIGFuZCBXZWVrZGF5IGluIHlvdXIgcHJlZmVycmVkIGxhbmd1YWdlLgp2YXIgTW9udGhOYW1lID0gWyJKYW51YXJ5IiwgIkZlYnJ1YXJ5IiwgIk1hcmNoIiwgIkFwcmlsIiwgIk1heSIsICJKdW5lIiwgIkp1bHkiLCAiQXVndXN0IiwgIlNlcHRlbWJlciIsICJPY3RvYmVyIiwgIk5vdmVtYmVyIiwgIkRlY2VtYmVyIl07CnZhciBXZWVrRGF5TmFtZTEgPSBbIlN1bmRheSIsICJNb25kYXkiLCAiVHVlc2RheSIsICJXZWRuZXNkYXkiLCAiVGh1cnNkYXkiLCAiRnJpZGF5IiwgIlNhdHVyZGF5Il07CnZhciBXZWVrRGF5TmFtZTIgPSBbIk1vbmRheSIsICJUdWVzZGF5IiwgIldlZG5lc2RheSIsICJUaHVyc2RheSIsICJGcmlkYXkiLCAiU2F0dXJkYXkiLCAiU3VuZGF5Il07CgoKLy9lbmQgQ29uZmlndXJhYmxlIHBhcmFtZXRlcnMKCi8vZW5kIEdsb2JhbCB2YXJpYWJsZQoKCi8vIENhbGVuZGFyIHByb3RvdHlwZQpmdW5jdGlvbiBDYWxlbmRhcihwRGF0ZSwgcEN0cmwpCnsKCgkvL1Byb3BlcnRpZXMKCXRoaXMuRGF0ZSA9IHBEYXRlLmdldERhdGUoKTsvL3NlbGVjdGVkIGRhdGUKCXRoaXMuTW9udGggPSBwRGF0ZS5nZXRNb250aCgpOy8vc2VsZWN0ZWQgbW9udGggbnVtYmVyCgl0aGlzLlllYXIgPSBwRGF0ZS5nZXRGdWxsWWVhcigpOy8vc2VsZWN0ZWQgeWVhciBpbiA0IGRpZ2l0cwoJdGhpcy5Ib3VycyA9IHBEYXRlLmdldEhvdXJzKCk7CgoJaWYgKHBEYXRlLmdldE1pbnV0ZXMoKSA8IDEwKQoJewoJCXRoaXMuTWludXRlcyA9ICIwIiArIHBEYXRlLmdldE1pbnV0ZXMoKTsKCX0KCWVsc2UKCXsKCQl0aGlzLk1pbnV0ZXMgPSBwRGF0ZS5nZXRNaW51dGVzKCk7Cgl9CgoJaWYgKHBEYXRlLmdldFNlY29uZHMoKSA8IDEwKQoJewoJCXRoaXMuU2Vjb25kcyA9ICIwIiArIHBEYXRlLmdldFNlY29uZHMoKTsKCX0KCWVsc2UKCXsKCQl0aGlzLlNlY29uZHMgPSBwRGF0ZS5nZXRTZWNvbmRzKCk7Cgl9CgoKCXRoaXMuTXlXaW5kb3cgPSB3aW5DYWw7Cgl0aGlzLkN0cmwgPSBwQ3RybDsKCXRoaXMuRm9ybWF0ID0gImRkTU15eXl5IjsKCXRoaXMuU2VwYXJhdG9yID0gRGF0ZVNlcGFyYXRvcjsKCXRoaXMuU2hvd1RpbWUgPSBmYWxzZTsKCXRoaXMuU2Nyb2xsZXIgPSAiRFJPUERPV04iOwoJaWYgKHBEYXRlLmdldEhvdXJzKCkgPCAxMikKCXsKCQl0aGlzLkFNb3JQTSA9ICJBTSI7Cgl9CgllbHNlCgl7CgkJdGhpcy5BTW9yUE0gPSAiUE0iOwoJfQoKCXRoaXMuU2hvd1NlY29uZHMgPSBmYWxzZTsKfQoKQ2FsZW5kYXIucHJvdG90eXBlLkdldE1vbnRoSW5kZXggPSBmdW5jdGlvbiAoc2hvcnRNb250aE5hbWUpCnsKCWZvciAodmFyIGkgPSAwOyBpIDwgMTI7IGkgKz0gMSkKCXsKCQlpZiAoTW9udGhOYW1lW2ldLnN1YnN0cmluZygwLCAzKS50b1VwcGVyQ2FzZSgpID09PSBzaG9ydE1vbnRoTmFtZS50b1VwcGVyQ2FzZSgpKQoJCXsKCQkJcmV0dXJuIGk7CgkJfQoJfQp9OwoKQ2FsZW5kYXIucHJvdG90eXBlLkluY1llYXIgPSBmdW5jdGlvbiAoKSB7CiAgICBpZiAoQ2FsLlllYXIgPD0gZHRUb2RheS5nZXRGdWxsWWVhcigpK0VuZFllYXIpCgkgICAgQ2FsLlllYXIgKz0gMTsKfTsKCkNhbGVuZGFyLnByb3RvdHlwZS5EZWNZZWFyID0gZnVuY3Rpb24gKCkgewogICAgaWYgKENhbC5ZZWFyID4gU3RhcnRZZWFyKQoJICAgIENhbC5ZZWFyIC09IDE7Cn07CgpDYWxlbmRhci5wcm90b3R5cGUuSW5jTW9udGggPSBmdW5jdGlvbigpIHsKICAgIGlmIChDYWwuWWVhciA8PSBkdFRvZGF5LmdldEZ1bGxZZWFyKCkgKyBFbmRZZWFyKSB7CiAgICAgICAgQ2FsLk1vbnRoICs9IDE7CiAgICAgICAgaWYgKENhbC5Nb250aCA+PSAxMikgewogICAgICAgICAgICBDYWwuTW9udGggPSAwOwogICAgICAgICAgICBDYWwuSW5jWWVhcigpOwogICAgICAgIH0KICAgIH0KfTsKCkNhbGVuZGFyLnByb3RvdHlwZS5EZWNNb250aCA9IGZ1bmN0aW9uKCkgewogICAgaWYgKENhbC5ZZWFyID49IFN0YXJ0WWVhcikgewogICAgICAgIENhbC5Nb250aCAtPSAxOwogICAgICAgIGlmIChDYWwuTW9udGggPCAwKSB7CiAgICAgICAgICAgIENhbC5Nb250aCA9IDExOwogICAgICAgICAgICBDYWwuRGVjWWVhcigpOwogICAgICAgIH0KICAgIH0KfTsKCkNhbGVuZGFyLnByb3RvdHlwZS5Td2l0Y2hNdGggPSBmdW5jdGlvbiAoaW50TXRoKQp7CglDYWwuTW9udGggPSBwYXJzZUludChpbnRNdGgsIDEwKTsKfTsKCkNhbGVuZGFyLnByb3RvdHlwZS5Td2l0Y2hZZWFyID0gZnVuY3Rpb24gKGludFllYXIpCnsKCUNhbC5ZZWFyID0gcGFyc2VJbnQoaW50WWVhciwgMTApOwp9OwoKQ2FsZW5kYXIucHJvdG90eXBlLlNldEhvdXIgPSBmdW5jdGlvbiAoaW50SG91cikKewoJdmFyIE1heEhvdXIsCglNaW5Ib3VyLAoJSG91ckV4cCA9IG5ldyBSZWdFeHAoIl5cXGRcXGQiKSwKCVNpbmdsZURpZ2l0ID0gbmV3IFJlZ0V4cCgiXFxkIik7CgoJaWYgKFRpbWVNb2RlID09PSAyNCkKCXsKCQlNYXhIb3VyID0gMjM7CgkJTWluSG91ciA9IDA7Cgl9CgllbHNlIGlmIChUaW1lTW9kZSA9PT0gMTIpCgl7CgkJTWF4SG91ciA9IDEyOwoJCU1pbkhvdXIgPSAxOwoJfQoJZWxzZQoJewoJCWFsZXJ0KCJUaW1lTW9kZSBjYW4gb25seSBiZSAxMiBvciAyNCIpOwoJfQoKCWlmICgoSG91ckV4cC50ZXN0KGludEhvdXIpIHx8IFNpbmdsZURpZ2l0LnRlc3QoaW50SG91cikpICYmIChwYXJzZUludChpbnRIb3VyLCAxMCkgPiBNYXhIb3VyKSkKCXsKCQlpbnRIb3VyID0gTWluSG91cjsKCX0KCgllbHNlIGlmICgoSG91ckV4cC50ZXN0KGludEhvdXIpIHx8IFNpbmdsZURpZ2l0LnRlc3QoaW50SG91cikpICYmIChwYXJzZUludChpbnRIb3VyLCAxMCkgPCBNaW5Ib3VyKSkKCXsKCQlpbnRIb3VyID0gTWF4SG91cjsKCX0KCglpZiAoU2luZ2xlRGlnaXQudGVzdChpbnRIb3VyKSkKCXsKCQlpbnRIb3VyID0gIjAiICsgaW50SG91cjsKCX0KCglpZiAoSG91ckV4cC50ZXN0KGludEhvdXIpICYmIChwYXJzZUludChpbnRIb3VyLCAxMCkgPD0gTWF4SG91cikgJiYgKHBhcnNlSW50KGludEhvdXIsIDEwKSA+PSBNaW5Ib3VyKSkKCXsKCQlpZiAoKFRpbWVNb2RlID09PSAxMikgJiYgKENhbC5BTW9yUE0gPT09ICJQTSIpKQoJCXsKCQkJaWYgKHBhcnNlSW50KGludEhvdXIsIDEwKSA9PT0gMTIpCgkJCXsKCQkJCUNhbC5Ib3VycyA9IDEyOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJQ2FsLkhvdXJzID0gcGFyc2VJbnQoaW50SG91ciwgMTApICsgMTI7CgkJCX0KCQl9CgoJCWVsc2UgaWYgKChUaW1lTW9kZSA9PT0gMTIpICYmIChDYWwuQU1vclBNID09PSAiQU0iKSkKCQl7CgkJCWlmIChpbnRIb3VyID09PSAxMikKCQkJewoJCQkJaW50SG91ciAtPSAxMjsKCQkJfQoKCQkJQ2FsLkhvdXJzID0gcGFyc2VJbnQoaW50SG91ciwgMTApOwoJCX0KCgkJZWxzZSBpZiAoVGltZU1vZGUgPT09IDI0KQoJCXsKCQkJQ2FsLkhvdXJzID0gcGFyc2VJbnQoaW50SG91ciwgMTApOwoJCX0KCX0KCn07CgpDYWxlbmRhci5wcm90b3R5cGUuU2V0TWludXRlID0gZnVuY3Rpb24gKGludE1pbikKewoJdmFyIE1heE1pbiA9IDU5LAoJTWluTWluID0gMCwKCglTaW5nbGVEaWdpdCA9IG5ldyBSZWdFeHAoIlxcZCIpLAoJU2luZ2xlRGlnaXQyID0gbmV3IFJlZ0V4cCgiXlxcZHsxfSQiKSwKCU1pbkV4cCA9IG5ldyBSZWdFeHAoIl5cXGR7Mn0kIiksCgoJc3RyTWluID0gMDsKCglpZiAoKE1pbkV4cC50ZXN0KGludE1pbikgfHwgU2luZ2xlRGlnaXQudGVzdChpbnRNaW4pKSAmJiAocGFyc2VJbnQoaW50TWluLCAxMCkgPiBNYXhNaW4pKQoJewoJCWludE1pbiA9IE1pbk1pbjsKCX0KCgllbHNlIGlmICgoTWluRXhwLnRlc3QoaW50TWluKSB8fCBTaW5nbGVEaWdpdC50ZXN0KGludE1pbikpICYmIChwYXJzZUludChpbnRNaW4sIDEwKSA8IE1pbk1pbikpCgl7CgkJaW50TWluID0gTWF4TWluOwoJfQoKCXN0ck1pbiA9IGludE1pbiArICIiOwoJaWYgKFNpbmdsZURpZ2l0Mi50ZXN0KGludE1pbikpCgl7CgkJc3RyTWluID0gIjAiICsgc3RyTWluOwoJfQoKCWlmICgoTWluRXhwLnRlc3QoaW50TWluKSB8fCBTaW5nbGVEaWdpdC50ZXN0KGludE1pbikpICYmIChwYXJzZUludChpbnRNaW4sIDEwKSA8PSA1OSkgJiYgKHBhcnNlSW50KGludE1pbiwgMTApID49IDApKQoJewoJCUNhbC5NaW51dGVzID0gc3RyTWluOwoJfQp9OwoKQ2FsZW5kYXIucHJvdG90eXBlLlNldFNlY29uZCA9IGZ1bmN0aW9uIChpbnRTZWMpCnsKCXZhciBNYXhTZWMgPSA1OSwKCU1pblNlYyA9IDAsCgoJU2luZ2xlRGlnaXQgPSBuZXcgUmVnRXhwKCJcXGQiKSwKCVNpbmdsZURpZ2l0MiA9IG5ldyBSZWdFeHAoIl5cXGR7MX0kIiksCglTZWNFeHAgPSBuZXcgUmVnRXhwKCJeXFxkezJ9JCIpLAoKCXN0clNlYyA9IDA7CgoJaWYgKChTZWNFeHAudGVzdChpbnRTZWMpIHx8IFNpbmdsZURpZ2l0LnRlc3QoaW50U2VjKSkgJiYgKHBhcnNlSW50KGludFNlYywgMTApID4gTWF4U2VjKSkKCXsKCQlpbnRTZWMgPSBNaW5TZWM7Cgl9CgoJZWxzZSBpZiAoKFNlY0V4cC50ZXN0KGludFNlYykgfHwgU2luZ2xlRGlnaXQudGVzdChpbnRTZWMpKSAmJiAocGFyc2VJbnQoaW50U2VjLCAxMCkgPCBNaW5TZWMpKQoJewoJCWludFNlYyA9IE1heFNlYzsKCX0KCglzdHJTZWMgPSBpbnRTZWMgKyAiIjsKCWlmIChTaW5nbGVEaWdpdDIudGVzdChpbnRTZWMpKQoJewoJCXN0clNlYyA9ICIwIiArIHN0clNlYzsKCX0KCglpZiAoKFNlY0V4cC50ZXN0KGludFNlYykgfHwgU2luZ2xlRGlnaXQudGVzdChpbnRTZWMpKSAmJiAocGFyc2VJbnQoaW50U2VjLCAxMCkgPD0gNTkpICYmIChwYXJzZUludChpbnRTZWMsIDEwKSA+PSAwKSkKCXsKCQlDYWwuU2Vjb25kcyA9IHN0clNlYzsKCX0KCn07CgpDYWxlbmRhci5wcm90b3R5cGUuU2V0QW1QbSA9IGZ1bmN0aW9uIChwdmFsdWUpCnsKCXRoaXMuQU1vclBNID0gcHZhbHVlOwoJaWYgKHB2YWx1ZSA9PT0gIlBNIikKCXsKCQl0aGlzLkhvdXJzID0gcGFyc2VJbnQodGhpcy5Ib3VycywgMTApICsgMTI7CgkJaWYgKHRoaXMuSG91cnMgPT09IDI0KQoJCXsKCQkJdGhpcy5Ib3VycyA9IDEyOwoJCX0KCX0KCgllbHNlIGlmIChwdmFsdWUgPT09ICJBTSIpCgl7CgkJdGhpcy5Ib3VycyAtPSAxMjsKCX0KfTsKCkNhbGVuZGFyLnByb3RvdHlwZS5nZXRTaG93SG91ciA9IGZ1bmN0aW9uICgpCnsKCXZhciBmaW5hbEhvdXI7CgoJaWYgKFRpbWVNb2RlID09PSAxMikKCXsKCQlpZiAocGFyc2VJbnQodGhpcy5Ib3VycywgMTApID09PSAwKQoJCXsKCQkJdGhpcy5BTW9yUE0gPSAiQU0iOwoJCQlmaW5hbEhvdXIgPSBwYXJzZUludCh0aGlzLkhvdXJzLCAxMCkgKyAxMjsKCQl9CgoJCWVsc2UgaWYgKHBhcnNlSW50KHRoaXMuSG91cnMsIDEwKSA9PT0gMTIpCgkJewoJCQl0aGlzLkFNb3JQTSA9ICJQTSI7CgkJCWZpbmFsSG91ciA9IDEyOwoJCX0KCgkJZWxzZSBpZiAodGhpcy5Ib3VycyA+IDEyKQoJCXsKCQkJdGhpcy5BTW9yUE0gPSAiUE0iOwoJCQlpZiAoKHRoaXMuSG91cnMgLSAxMikgPCAxMCkKCQkJewoJCQkJZmluYWxIb3VyID0gIjAiICsgKChwYXJzZUludCh0aGlzLkhvdXJzLCAxMCkpIC0gMTIpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJZmluYWxIb3VyID0gcGFyc2VJbnQodGhpcy5Ib3VycywgMTApIC0gMTI7CgkJCX0KCQl9CgkJZWxzZQoJCXsKCQkJdGhpcy5BTW9yUE0gPSAiQU0iOwoJCQlpZiAodGhpcy5Ib3VycyA8IDEwKQoJCQl7CgkJCQlmaW5hbEhvdXIgPSAiMCIgKyBwYXJzZUludCh0aGlzLkhvdXJzLCAxMCk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlmaW5hbEhvdXIgPSB0aGlzLkhvdXJzOwoJCQl9CgkJfQoJfQoKCWVsc2UgaWYgKFRpbWVNb2RlID09PSAyNCkKCXsKCQlpZiAodGhpcy5Ib3VycyA8IDEwKQoJCXsKCQkJZmluYWxIb3VyID0gIjAiICsgcGFyc2VJbnQodGhpcy5Ib3VycywgMTApOwoJCX0KCQllbHNlCgkJewoJCQlmaW5hbEhvdXIgPSB0aGlzLkhvdXJzOwoJCX0KCX0KCglyZXR1cm4gZmluYWxIb3VyOwp9OwoKQ2FsZW5kYXIucHJvdG90eXBlLmdldFNob3dBTW9yUE0gPSBmdW5jdGlvbiAoKQp7CglyZXR1cm4gdGhpcy5BTW9yUE07Cn07CgpDYWxlbmRhci5wcm90b3R5cGUuR2V0TW9udGhOYW1lID0gZnVuY3Rpb24gKElzTG9uZykKewoJdmFyIE1vbnRoID0gTW9udGhOYW1lW3RoaXMuTW9udGhdOwoJaWYgKElzTG9uZykKCXsKCQlyZXR1cm4gTW9udGg7Cgl9CgllbHNlCgl7CgkJcmV0dXJuIE1vbnRoLnN1YnN0cigwLCAzKTsKCX0KfTsKCkNhbGVuZGFyLnByb3RvdHlwZS5HZXRNb25EYXlzID0gZnVuY3Rpb24oKSB7IC8vR2V0IG51bWJlciBvZiBkYXlzIGluIGEgbW9udGgKCiAgICB2YXIgRGF5c0luTW9udGggPSBbMzEsIDI4LCAzMSwgMzAsIDMxLCAzMCwgMzEsIDMxLCAzMCwgMzEsIDMwLCAzMV07CiAgICBpZiAoQ2FsLklzTGVhcFllYXIoKSkgewogICAgICAgIERheXNJbk1vbnRoWzFdID0gMjk7CiAgICB9CgogICAgcmV0dXJuIERheXNJbk1vbnRoW3RoaXMuTW9udGhdOwp9OwoKQ2FsZW5kYXIucHJvdG90eXBlLklzTGVhcFllYXIgPSBmdW5jdGlvbiAoKQp7CglpZiAoKHRoaXMuWWVhciAlIDQpID09PSAwKQoJewoJCWlmICgodGhpcy5ZZWFyICUgMTAwID09PSAwKSAmJiAodGhpcy5ZZWFyICUgNDAwKSAhPT0gMCkKCQl7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIHRydWU7CgkJfQoJfQoJZWxzZQoJewoJCXJldHVybiBmYWxzZTsKCX0KfTsKCkNhbGVuZGFyLnByb3RvdHlwZS5Gb3JtYXREYXRlID0gZnVuY3Rpb24gKHBEYXRlKQp7Cgl2YXIgTW9udGhEaWdpdCA9IHRoaXMuTW9udGggKyAxOwoJaWYgKFByZWNlZGVaZXJvID09PSB0cnVlKQoJewoJCWlmICgocERhdGUgPCAxMCkgJiYgU3RyaW5nKHBEYXRlKS5sZW5ndGg9PT0xKSAvL2xlbmd0aCBjaGVja2luZyBhZGRlZCBpbiB2ZXJzaW9uIDIuMgoJCXsJCQoJCQlwRGF0ZSA9ICIwIiArIHBEYXRlOwoJCX0KCQlpZiAoTW9udGhEaWdpdCA8IDEwKQoJCXsKCQkJTW9udGhEaWdpdCA9ICIwIiArIE1vbnRoRGlnaXQ7CgkJfQoJfQoKCXN3aXRjaCAodGhpcy5Gb3JtYXQudG9VcHBlckNhc2UoKSkKCXsKCQljYXNlICJERE1NWVlZWSI6CgkJcmV0dXJuIChwRGF0ZSArIERhdGVTZXBhcmF0b3IgKyBNb250aERpZ2l0ICsgRGF0ZVNlcGFyYXRvciArIHRoaXMuWWVhcik7CgkJY2FzZSAiRERNTU1ZWVlZIjoKCQlyZXR1cm4gKHBEYXRlICsgRGF0ZVNlcGFyYXRvciArIHRoaXMuR2V0TW9udGhOYW1lKGZhbHNlKSArIERhdGVTZXBhcmF0b3IgKyB0aGlzLlllYXIpOwoJCWNhc2UgIk1NRERZWVlZIjoKCQlyZXR1cm4gKE1vbnRoRGlnaXQgKyBEYXRlU2VwYXJhdG9yICsgcERhdGUgKyBEYXRlU2VwYXJhdG9yICsgdGhpcy5ZZWFyKTsKCQljYXNlICJNTU1ERFlZWVkiOgoJCXJldHVybiAodGhpcy5HZXRNb250aE5hbWUoZmFsc2UpICsgRGF0ZVNlcGFyYXRvciArIHBEYXRlICsgRGF0ZVNlcGFyYXRvciArIHRoaXMuWWVhcik7CgkJY2FzZSAiWVlZWU1NREQiOgoJCXJldHVybiAodGhpcy5ZZWFyICsgRGF0ZVNlcGFyYXRvciArIE1vbnRoRGlnaXQgKyBEYXRlU2VwYXJhdG9yICsgcERhdGUpOwoJCWNhc2UgIllZTU1ERCI6CgkJcmV0dXJuIChTdHJpbmcodGhpcy5ZZWFyKS5zdWJzdHJpbmcoMiwgNCkgKyBEYXRlU2VwYXJhdG9yICsgTW9udGhEaWdpdCArIERhdGVTZXBhcmF0b3IgKyBwRGF0ZSk7CgkJY2FzZSAiWVlNTU1ERCI6CgkJcmV0dXJuIChTdHJpbmcodGhpcy5ZZWFyKS5zdWJzdHJpbmcoMiwgNCkgKyBEYXRlU2VwYXJhdG9yICsgdGhpcy5HZXRNb250aE5hbWUoZmFsc2UpICsgRGF0ZVNlcGFyYXRvciArIHBEYXRlKTsKCQljYXNlICJZWVlZTU1NREQiOgoJCXJldHVybiAodGhpcy5ZZWFyICsgRGF0ZVNlcGFyYXRvciArIHRoaXMuR2V0TW9udGhOYW1lKGZhbHNlKSArIERhdGVTZXBhcmF0b3IgKyBwRGF0ZSk7CgkJZGVmYXVsdDoKCQlyZXR1cm4gKHBEYXRlICsgRGF0ZVNlcGFyYXRvciArICh0aGlzLk1vbnRoICsgMSkgKyBEYXRlU2VwYXJhdG9yICsgdGhpcy5ZZWFyKTsKCX0KfTsKCi8vIGVuZCBDYWxlbmRhciBwcm90b3R5cGUKCmZ1bmN0aW9uIEdlbkNlbGwocFZhbHVlLCBwSGlnaExpZ2h0LCBwQ29sb3IsIHBDbGlja2FibGUpCnsgLy9HZW5lcmF0ZSB0YWJsZSBjZWxsIHdpdGggdmFsdWUKCXZhciBQVmFsdWUsCglQQ2VsbFN0ciwKCVBDbGlja2FibGUsCgl2VGltZVN0cjsKCglpZiAoIXBWYWx1ZSkKCXsKCQlQVmFsdWUgPSAiIjsKCX0KCWVsc2UKCXsKCQlQVmFsdWUgPSBwVmFsdWU7Cgl9CgoJaWYgKHBDb2xvciA9PT0gdW5kZWZpbmVkKQoJICAgIHBDb2xvciA9IENhbEJnQ29sb3I7CgkKCWlmIChwQ2xpY2thYmxlICE9PSB1bmRlZmluZWQpewoJCVBDbGlja2FibGUgPSBwQ2xpY2thYmxlOwoJfQoJZWxzZXsKCQlQQ2xpY2thYmxlID0gdHJ1ZTsKCX0KCglpZiAoQ2FsLlNob3dUaW1lKQoJewoJCXZUaW1lU3RyID0gJyAnICsgQ2FsLkhvdXJzICsgJzonICsgQ2FsLk1pbnV0ZXM7CgkJaWYgKENhbC5TaG93U2Vjb25kcykKCQl7CgkJCXZUaW1lU3RyICs9ICc6JyArIENhbC5TZWNvbmRzOwoJCX0KCQlpZiAoVGltZU1vZGUgPT09IDEyKQoJCXsKCQkJdlRpbWVTdHIgKz0gJyAnICsgQ2FsLkFNb3JQTTsKCQl9Cgl9CgoJZWxzZQoJewoJCXZUaW1lU3RyID0gIiI7Cgl9CgoJaWYgKFBWYWx1ZSAhPT0gIiIpCgl7CgkJaWYgKFBDbGlja2FibGUgPT09IHRydWUpIHsKCQkgICAgaWYgKENhbC5TaG93VGltZSA9PT0gdHJ1ZSkKCQkgICAgeyBQQ2VsbFN0ciA9ICI8dGQgaWQ9J2MiICsgUFZhbHVlICsgIicgY2xhc3M9J2NhbFREJyBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXI7Y3Vyc29yOnBvaW50ZXI7YmFja2dyb3VuZC1jb2xvcjoiK3BDb2xvcisiJyBvbm1vdXNlZG93bj0nc2VsZWN0RGF0ZSh0aGlzLCIgKyBQVmFsdWUgKyAiKTsnPiIgKyBQVmFsdWUgKyAiPC90ZD4iOyB9CgkJICAgIGVsc2UgeyBQQ2VsbFN0ciA9ICI8dGQgY2xhc3M9J2NhbFREJyBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXI7Y3Vyc29yOnBvaW50ZXI7YmFja2dyb3VuZC1jb2xvcjoiICsgcENvbG9yICsgIicgb25tb3VzZW92ZXI9J2NoYW5nZUJvcmRlcih0aGlzLCAwKTsnIG9ubW91c2VvdXQ9XCJjaGFuZ2VCb3JkZXIodGhpcywgMSwgJyIgKyBwQ29sb3IgKyAiJyk7XCIgb25DbGljaz1cImphdmFzY3JpcHQ6Y2FsbGJhY2soJyIgKyBDYWwuQ3RybCArICInLCciICsgQ2FsLkZvcm1hdERhdGUoUFZhbHVlKSArICInKTtcIj4iICsgUFZhbHVlICsgIjwvdGQ+IjsgfQoJCX0KCQllbHNlCgkJeyBQQ2VsbFN0ciA9ICI8dGQgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyO2JhY2tncm91bmQtY29sb3I6IitwQ29sb3IrIicgY2xhc3M9J2NhbFREJz4iK1BWYWx1ZSsiPC90ZD4iOyB9Cgl9CgllbHNlCgl7IFBDZWxsU3RyID0gIjx0ZCBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXI7YmFja2dyb3VuZC1jb2xvcjoiK3BDb2xvcisiJyBjbGFzcz0nY2FsVEQnPiZuYnNwOzwvdGQ+IjsgfQoKCXJldHVybiBQQ2VsbFN0cjsKfQoKZnVuY3Rpb24gUmVuZGVyQ3NzQ2FsKGJOZXdDYWwpCnsKCglpZiAodHlwZW9mIGJOZXdDYWwgPT09ICJ1bmRlZmluZWQiIHx8IGJOZXdDYWwgIT09IHRydWUpCgl7CgkJYk5ld0NhbCA9IGZhbHNlOwoJfQoJdmFyIHZDYWxIZWFkZXIsCgl2Q2FsRGF0YSwKCXZDYWxUaW1lID0gIiIsCgl2Q2FsQ2xvc2luZyA9ICIiLAoJd2luQ2FsRGF0YSA9ICIiLAoJQ2FsRGF0ZSwKCglpLAoJaiwKCglTZWxlY3RTdHIsCgl2RGF5Q291bnQgPSAwLAoJdkZpcnN0RGF5LAoKCVdlZWtEYXlOYW1lID0gW10sLy9BZGRlZCB2ZXJzaW9uIDEuNwoJc3RyQ2VsbCwKCglzaG93SG91ciwKCVNob3dBcnJvd3MgPSBmYWxzZSwKCUhvdXJDZWxsV2lkdGggPSAiMzVweCIsIC8vY2VsbCB3aWR0aCB3aXRoIHNlY29uZHMuCgoJU2VsZWN0QW0sCglTZWxlY3RQbSwKCglmdW5jQ2FsYmFjaywKCgloZWFkSUQsCgllLAoJY3NzU3RyLAoJc3R5bGUsCgljc3NUZXh0LAoJc3BhbjsKCgljYWxIZWlnaHQgPSAwOyAvLyByZXNldCB0aGUgd2luZG93IGhlaWdodCBvbiByZWZyZXNoCgoJLy8gU2V0IHRoZSBkZWZhdWx0IGN1cnNvciBmb3IgdGhlIGNhbGVuZGFyCgoJd2luQ2FsRGF0YSA9ICI8c3BhbiBzdHlsZT0nY3Vyc29yOmF1dG87Jz4iOwoJdkNhbEhlYWRlciA9ICI8dGFibGUgc3R5bGU9J2JhY2tncm91bmQtY29sb3I6IitDYWxCZ0NvbG9yKyI7d2lkdGg6MjAwcHg7cGFkZGluZzowO21hcmdpbjo1cHggYXV0byA1cHggYXV0byc+PHRib2R5PiI7CgoJLy9UYWJsZSBmb3IgTW9udGggJiBZZWFyIFNlbGVjdG9yCgoJdkNhbEhlYWRlciArPSAiPHRyPjx0ZCBjb2xzcGFuPSc3Jz48dGFibGUgYm9yZGVyPScwJyB3aWR0aD0nMjAwcHgnIGNlbGxwYWRkaW5nPScwJyBjZWxsc3BhY2luZz0nMCc+PHRyPiI7CgkvLyoqKioqKioqKioqKioqKioqKk1vbnRoIGFuZCBZZWFyIHNlbGVjdG9yIGluIGRyb3Bkb3duIGxpc3QqKioqKioqKioqKioqKioqKioqKioqKioKCglpZiAoQ2FsLlNjcm9sbGVyID09PSAiRFJPUERPV04iKQoJewoJICAgIHZDYWxIZWFkZXIgKz0gIjx0ZCBhbGlnbj0nY2VudGVyJz48c2VsZWN0IG5hbWU9J01vbnRoU2VsZWN0b3InIG9uQ2hhbmdlPSdqYXZhc2NyaXB0OkNhbC5Td2l0Y2hNdGgodGhpcy5zZWxlY3RlZEluZGV4KTtSZW5kZXJDc3NDYWwoKTsnPiI7CgkJZm9yIChpID0gMDsgaSA8IDEyOyBpICs9IDEpCgkJewoJCQlpZiAoaSA9PT0gQ2FsLk1vbnRoKQoJCQl7CgkJCQlTZWxlY3RTdHIgPSAiU2VsZWN0ZWQiOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJU2VsZWN0U3RyID0gIiI7CgkJCX0KCQkJdkNhbEhlYWRlciArPSAiPG9wdGlvbiAiICsgU2VsZWN0U3RyICsgIiB2YWx1ZT0iICsgaSArICI+IiArIE1vbnRoTmFtZVtpXSArICI8L29wdGlvbj4iOwoJCX0KCgkJdkNhbEhlYWRlciArPSAiPC9zZWxlY3Q+PC90ZD4iOwoJCS8vWWVhciBzZWxlY3RvcgoKCQl2Q2FsSGVhZGVyICs9ICI8dGQgYWxpZ249J2NlbnRlcic+PHNlbGVjdCBuYW1lPSdZZWFyU2VsZWN0b3InIHNpemU9JzEnIG9uQ2hhbmdlPSdqYXZhc2NyaXB0OkNhbC5Td2l0Y2hZZWFyKHRoaXMudmFsdWUpO1JlbmRlckNzc0NhbCgpOyc+IjsKCQlmb3IgKGkgPSBTdGFydFllYXI7IGkgPD0gKGR0VG9kYXkuZ2V0RnVsbFllYXIoKSArIEVuZFllYXIpOyBpICs9IDEpCgkJewoJCQlpZiAoaSA9PT0gQ2FsLlllYXIpCgkJCXsKCQkJCVNlbGVjdFN0ciA9ICdzZWxlY3RlZD0ic2VsZWN0ZWQiJzsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCVNlbGVjdFN0ciA9ICcnOwoJCQl9CgkJCXZDYWxIZWFkZXIgKz0gIjxvcHRpb24gIiArIFNlbGVjdFN0ciArICIgdmFsdWU9IiArIGkgKyAiPiIgKyBpICsgIjwvb3B0aW9uPlxuIjsKCQl9CgkJdkNhbEhlYWRlciArPSAiPC9zZWxlY3Q+PC90ZD5cbiI7CgkJY2FsSGVpZ2h0ICs9IDMwOwoJfQoKCS8vKioqKioqKioqKioqKioqKioqRW5kIE1vbnRoIGFuZCBZZWFyIHNlbGVjdG9yIGluIGRyb3Bkb3duIGxpc3QqKioqKioqKioqKioqKioqKioqKioKCgkvLyoqKioqKioqKioqKioqKioqKk1vbnRoIGFuZCBZZWFyIHNlbGVjdG9yIGluIGFycm93KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgoJZWxzZSBpZiAoQ2FsLlNjcm9sbGVyID09PSAiQVJST1ciKQoJewoJCWlmIChVc2VJbWFnZUZpbGVzKQoJCXsKCQkJdkNhbEhlYWRlciArPSAiPHRkPjxpbWcgb25tb3VzZWRvd249J2phdmFzY3JpcHQ6Q2FsLkRlY1llYXIoKTtSZW5kZXJDc3NDYWwoKTsnIHNyYz0nIitpbWFnZUZpbGVzUGF0aCsiY2FsX2Zhc3RyZXZlcnNlLmdpZicgd2lkdGg9JzEzcHgnIGhlaWdodD0nOScgb25tb3VzZW92ZXI9J2NoYW5nZUJvcmRlcih0aGlzLCAwKScgb25tb3VzZW91dD0nY2hhbmdlQm9yZGVyKHRoaXMsIDEpJyBzdHlsZT0nYm9yZGVyOjFweCBzb2xpZCB3aGl0ZSc+PC90ZD5cbiI7Ly9ZZWFyIHNjcm9sbGVyIChkZWNyZWFzZSAxIHllYXIpCgkJCXZDYWxIZWFkZXIgKz0gIjx0ZD48aW1nIG9ubW91c2Vkb3duPSdqYXZhc2NyaXB0OkNhbC5EZWNNb250aCgpO1JlbmRlckNzc0NhbCgpOycgc3JjPSciICsgaW1hZ2VGaWxlc1BhdGggKyAiY2FsX3JldmVyc2UuZ2lmJyB3aWR0aD0nMTNweCcgaGVpZ2h0PSc5JyBvbm1vdXNlb3Zlcj0nY2hhbmdlQm9yZGVyKHRoaXMsIDApJyBvbm1vdXNlb3V0PSdjaGFuZ2VCb3JkZXIodGhpcywgMSknIHN0eWxlPSdib3JkZXI6MXB4IHNvbGlkIHdoaXRlJz48L3RkPlxuIjsgLy9Nb250aCBzY3JvbGxlciAoZGVjcmVhc2UgMSBtb250aCkKCQkJdkNhbEhlYWRlciArPSAiPHRkIHdpZHRoPSc3MCUnIGNsYXNzPSdjYWxSJyBzdHlsZT0nY29sb3I6IitZclNlbENvbG9yKyInPiIrIENhbC5HZXRNb250aE5hbWUoU2hvd0xvbmdNb250aCkgKyAiICIgKyBDYWwuWWVhciArICI8L3RkPiI7IC8vTW9udGggYW5kIFllYXIKCQkJdkNhbEhlYWRlciArPSAiPHRkPjxpbWcgb25tb3VzZWRvd249J2phdmFzY3JpcHQ6Q2FsLkluY01vbnRoKCk7UmVuZGVyQ3NzQ2FsKCk7JyBzcmM9JyIgKyBpbWFnZUZpbGVzUGF0aCArICJjYWxfZm9yd2FyZC5naWYnIHdpZHRoPScxM3B4JyBoZWlnaHQ9JzknIG9ubW91c2VvdmVyPSdjaGFuZ2VCb3JkZXIodGhpcywgMCknIG9ubW91c2VvdXQ9J2NoYW5nZUJvcmRlcih0aGlzLCAxKScgc3R5bGU9J2JvcmRlcjoxcHggc29saWQgd2hpdGUnPjwvdGQ+XG4iOyAvL01vbnRoIHNjcm9sbGVyIChpbmNyZWFzZSAxIG1vbnRoKQoJCQl2Q2FsSGVhZGVyICs9ICI8dGQ+PGltZyBvbm1vdXNlZG93bj0namF2YXNjcmlwdDpDYWwuSW5jWWVhcigpO1JlbmRlckNzc0NhbCgpOycgc3JjPSciICsgaW1hZ2VGaWxlc1BhdGggKyAiY2FsX2Zhc3Rmb3J3YXJkLmdpZicgd2lkdGg9JzEzcHgnIGhlaWdodD0nOScgb25tb3VzZW92ZXI9J2NoYW5nZUJvcmRlcih0aGlzLCAwKScgb25tb3VzZW91dD0nY2hhbmdlQm9yZGVyKHRoaXMsIDEpJyBzdHlsZT0nYm9yZGVyOjFweCBzb2xpZCB3aGl0ZSc+PC90ZD5cbiI7IC8vWWVhciBzY3JvbGxlciAoaW5jcmVhc2UgMSB5ZWFyKQoJCQljYWxIZWlnaHQgKz0gMjI7CgkJfQoJCWVsc2UKCQl7CgkJCXZDYWxIZWFkZXIgKz0gIjx0ZD48c3BhbiBpZD0nZGVjX3llYXInIHRpdGxlPSdyZXZlcnNlIHllYXInIG9ubW91c2Vkb3duPSdqYXZhc2NyaXB0OkNhbC5EZWNZZWFyKCk7UmVuZGVyQ3NzQ2FsKCk7JyBvbm1vdXNlb3Zlcj0nY2hhbmdlQm9yZGVyKHRoaXMsIDApJyBvbm1vdXNlb3V0PSdjaGFuZ2VCb3JkZXIodGhpcywgMSknIHN0eWxlPSdib3JkZXI6MXB4IHNvbGlkIHdoaXRlOyBjb2xvcjoiICsgWXJTZWxDb2xvciArICInPi08L3NwYW4+PC90ZD4iOy8vWWVhciBzY3JvbGxlciAoZGVjcmVhc2UgMSB5ZWFyKQoJCQl2Q2FsSGVhZGVyICs9ICI8dGQ+PHNwYW4gaWQ9J2RlY19tb250aCcgdGl0bGU9J3JldmVyc2UgbW9udGgnIG9ubW91c2Vkb3duPSdqYXZhc2NyaXB0OkNhbC5EZWNNb250aCgpO1JlbmRlckNzc0NhbCgpOycgb25tb3VzZW92ZXI9J2NoYW5nZUJvcmRlcih0aGlzLCAwKScgb25tb3VzZW91dD0nY2hhbmdlQm9yZGVyKHRoaXMsIDEpJyBzdHlsZT0nYm9yZGVyOjFweCBzb2xpZCB3aGl0ZSc+Jmx0Ozwvc3Bhbj48L3RkPlxuIjsvL01vbnRoIHNjcm9sbGVyIChkZWNyZWFzZSAxIG1vbnRoKQoJCQl2Q2FsSGVhZGVyICs9ICI8dGQgd2lkdGg9JzcwJScgY2xhc3M9J2NhbFInIHN0eWxlPSdjb2xvcjoiICsgWXJTZWxDb2xvciArICInPiIgKyBDYWwuR2V0TW9udGhOYW1lKFNob3dMb25nTW9udGgpICsgIiAiICsgQ2FsLlllYXIgKyAiPC90ZD5cbiI7IC8vTW9udGggYW5kIFllYXIKCQkJdkNhbEhlYWRlciArPSAiPHRkPjxzcGFuIGlkPSdpbmNfbW9udGgnIHRpdGxlPSdmb3J3YXJkIG1vbnRoJyBvbm1vdXNlZG93bj0namF2YXNjcmlwdDpDYWwuSW5jTW9udGgoKTtSZW5kZXJDc3NDYWwoKTsnIG9ubW91c2VvdmVyPSdjaGFuZ2VCb3JkZXIodGhpcywgMCknIG9ubW91c2VvdXQ9J2NoYW5nZUJvcmRlcih0aGlzLCAxKScgc3R5bGU9J2JvcmRlcjoxcHggc29saWQgd2hpdGUnPiZndDs8L3NwYW4+PC90ZD5cbiI7Ly9Nb250aCBzY3JvbGxlciAoaW5jcmVhc2UgMSBtb250aCkKCQkJdkNhbEhlYWRlciArPSAiPHRkPjxzcGFuIGlkPSdpbmNfeWVhcicgdGl0bGU9J2ZvcndhcmQgeWVhcicgb25tb3VzZWRvd249J2phdmFzY3JpcHQ6Q2FsLkluY1llYXIoKTtSZW5kZXJDc3NDYWwoKTsnICBvbm1vdXNlb3Zlcj0nY2hhbmdlQm9yZGVyKHRoaXMsIDApJyBvbm1vdXNlb3V0PSdjaGFuZ2VCb3JkZXIodGhpcywgMSknIHN0eWxlPSdib3JkZXI6MXB4IHNvbGlkIHdoaXRlOyBjb2xvcjoiICsgWXJTZWxDb2xvciArICInPis8L3NwYW4+PC90ZD5cbiI7Ly9ZZWFyIHNjcm9sbGVyIChpbmNyZWFzZSAxIHllYXIpCgkJCWNhbEhlaWdodCArPSAyMjsKCQl9Cgl9CgoJdkNhbEhlYWRlciArPSAiPC90cj48L3RhYmxlPjwvdGQ+PC90cj4iOwoKCS8vKioqKioqKioqKioqKioqKioqRW5kIE1vbnRoIGFuZCBZZWFyIHNlbGVjdG9yIGluIGFycm93KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgoJLy9DYWxlbmRhciBoZWFkZXIgc2hvd3MgTW9udGggYW5kIFllYXIKCWlmIChTaG93TW9udGhZZWFyICYmIENhbC5TY3JvbGxlciA9PT0gIkRST1BET1dOIikKCXsKCSAgICB2Q2FsSGVhZGVyICs9ICI8dHI+PHRkIGNvbHNwYW49JzcnIGNsYXNzPSdjYWxSJyBzdHlsZT0nY29sb3I6IiArIE1vbnRoWWVhckNvbG9yICsgIic+IiArIENhbC5HZXRNb250aE5hbWUoU2hvd0xvbmdNb250aCkgKyAiICIgKyBDYWwuWWVhciArICI8L3RkPjwvdHI+IjsKCQljYWxIZWlnaHQgKz0gMTk7Cgl9CgoJLy9XZWVrIGRheSBoZWFkZXIKCgl2Q2FsSGVhZGVyICs9ICI8dHI+PHRkIGNvbHNwYW49XCI3XCI+PHRhYmxlIHN0eWxlPSdib3JkZXItc3BhY2luZzoxcHg7Ym9yZGVyLWNvbGxhcHNlOnNlcGFyYXRlOyc+PHRyPiI7CglpZiAoTW9uZGF5Rmlyc3REYXkgPT09IHRydWUpCgl7CgkJV2Vla0RheU5hbWUgPSBXZWVrRGF5TmFtZTI7Cgl9CgllbHNlCgl7CgkJV2Vla0RheU5hbWUgPSBXZWVrRGF5TmFtZTE7Cgl9Cglmb3IgKGkgPSAwOyBpIDwgNzsgaSArPSAxKQoJewoJICAgIHZDYWxIZWFkZXIgKz0gIjx0ZCBzdHlsZT0nYmFja2dyb3VuZC1jb2xvcjoiK1dlZWtIZWFkQ29sb3IrIjt3aWR0aDoiK0NlbGxXaWR0aCsicHg7Y29sb3I6I0ZGRkZGRicgY2xhc3M9J2NhbFREJz4iICsgV2Vla0RheU5hbWVbaV0uc3Vic3RyKDAsIFdlZWtDaGFyKSArICI8L3RkPiI7Cgl9CgoJY2FsSGVpZ2h0ICs9IDE5OwoJdkNhbEhlYWRlciArPSAiPC90cj4iOwoJLy9DYWxlbmRhciBkZXRhaWwKCUNhbERhdGUgPSBuZXcgRGF0ZShDYWwuWWVhciwgQ2FsLk1vbnRoKTsKCUNhbERhdGUuc2V0RGF0ZSgxKTsKCgl2Rmlyc3REYXkgPSBDYWxEYXRlLmdldERheSgpOwoKCS8vQWRkZWQgdmVyc2lvbiAxLjcKCglpZiAoTW9uZGF5Rmlyc3REYXkgPT09IHRydWUpCgl7CgkJdkZpcnN0RGF5IC09IDE7CgkJaWYgKHZGaXJzdERheSA9PT0gLTEpCgkJewoJCQl2Rmlyc3REYXkgPSA2OwoJCX0KCX0KCgkvL0FkZGVkIHZlcnNpb24gMS43Cgl2Q2FsRGF0YSA9ICI8dHI+IjsKCWNhbEhlaWdodCArPSAxOTsKCWZvciAoaSA9IDA7IGkgPCB2Rmlyc3REYXk7IGkgKz0gMSkKCXsKCQl2Q2FsRGF0YSA9IHZDYWxEYXRhICsgR2VuQ2VsbCgpOwoJCXZEYXlDb3VudCA9IHZEYXlDb3VudCArIDE7Cgl9CgoJLy9BZGRlZCB2ZXJzaW9uIDEuNwoJZm9yIChqID0gMTsgaiA8PSBDYWwuR2V0TW9uRGF5cygpOyBqICs9IDEpCgl7CgkJaWYgKCh2RGF5Q291bnQgJSA3ID09PSAwKSAmJiAoaiA+IDEpKQoJCXsKCQkJdkNhbERhdGEgPSB2Q2FsRGF0YSArICI8dHI+IjsKCQl9CgoJCXZEYXlDb3VudCA9IHZEYXlDb3VudCArIDE7CgkJLy9hZGRlZCB2ZXJzaW9uIDIuMS4yCgkJaWYgKERpc2FibGVCZWZvcmVUb2RheSA9PT0gdHJ1ZSAmJiAoKGogPCBkdFRvZGF5LmdldERhdGUoKSkgJiYgKENhbC5Nb250aCA9PT0gZHRUb2RheS5nZXRNb250aCgpKSAmJiAoQ2FsLlllYXIgPT09IGR0VG9kYXkuZ2V0RnVsbFllYXIoKSkgfHwgKENhbC5Nb250aCA8IGR0VG9kYXkuZ2V0TW9udGgoKSkgJiYgKENhbC5ZZWFyID09PSBkdFRvZGF5LmdldEZ1bGxZZWFyKCkpIHx8IChDYWwuWWVhciA8IGR0VG9kYXkuZ2V0RnVsbFllYXIoKSkpKQoJCXsKCQkJc3RyQ2VsbCA9IEdlbkNlbGwoaiwgZmFsc2UsIERpc2FibGVDb2xvciwgZmFsc2UpOy8vQmVmb3JlIHRvZGF5J3MgZGF0ZSBpcyBub3QgY2xpY2thYmxlCgkJfQoJCS8vaWYgRW5kIFllYXIgKyBDdXJyZW50IFllYXIgPSBDYWwuWWVhci4gRGlzYWJsZS4KCQllbHNlIGlmIChDYWwuWWVhciA+IChkdFRvZGF5LmdldEZ1bGxZZWFyKCkrRW5kWWVhcikpCgkJewoJCSAgICBzdHJDZWxsID0gR2VuQ2VsbChqLCBmYWxzZSwgRGlzYWJsZUNvbG9yLCBmYWxzZSk7IAoJCX0KCQllbHNlIGlmICgoaiA9PT0gZHRUb2RheS5nZXREYXRlKCkpICYmIChDYWwuTW9udGggPT09IGR0VG9kYXkuZ2V0TW9udGgoKSkgJiYgKENhbC5ZZWFyID09PSBkdFRvZGF5LmdldEZ1bGxZZWFyKCkpKQoJCXsKCQkJc3RyQ2VsbCA9IEdlbkNlbGwoaiwgdHJ1ZSwgVG9kYXlDb2xvcik7Ly9IaWdobGlnaHQgdG9kYXkncyBkYXRlCgkJfQoJCWVsc2UKCQl7CgkJCWlmICgoaiA9PT0gc2VsRGF0ZS5nZXREYXRlKCkpICYmIChDYWwuTW9udGggPT09IHNlbERhdGUuZ2V0TW9udGgoKSkgJiYgKENhbC5ZZWFyID09PSBzZWxEYXRlLmdldEZ1bGxZZWFyKCkpKXsKCQkJICAgICAvL21vZGlmaWVkIHZlcnNpb24gMS43CgkJCQlzdHJDZWxsID0gR2VuQ2VsbChqLCB0cnVlLCBTZWxEYXRlQ29sb3IpOwogICAgICAgICAgICB9CgkJCWVsc2UKCQkJewoJCQkJaWYgKE1vbmRheUZpcnN0RGF5ID09PSB0cnVlKQoJCQkJewoJCQkJCWlmICh2RGF5Q291bnQgJSA3ID09PSAwKQoJCQkJCXsKCQkJCQkJc3RyQ2VsbCA9IEdlbkNlbGwoaiwgZmFsc2UsIFN1bmRheUNvbG9yKTsKCQkJCQl9CgkJCQkJZWxzZSBpZiAoKHZEYXlDb3VudCArIDEpICUgNyA9PT0gMCkKCQkJCQl7CgkJCQkJCXN0ckNlbGwgPSBHZW5DZWxsKGosIGZhbHNlLCBTYXR1cmRheUNvbG9yKTsKCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJc3RyQ2VsbCA9IEdlbkNlbGwoaiwgbnVsbCwgV2Vla0RheUNvbG9yKTsKCQkJCQl9CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJaWYgKHZEYXlDb3VudCAlIDcgPT09IDApCgkJCQkJewoJCQkJCQlzdHJDZWxsID0gR2VuQ2VsbChqLCBmYWxzZSwgU2F0dXJkYXlDb2xvcik7CgkJCQkJfQoJCQkJCWVsc2UgaWYgKCh2RGF5Q291bnQgKyA2KSAlIDcgPT09IDApCgkJCQkJewoJCQkJCQlzdHJDZWxsID0gR2VuQ2VsbChqLCBmYWxzZSwgU3VuZGF5Q29sb3IpOwoJCQkJCX0KCQkJCQllbHNlCgkJCQkJewoJCQkJCQlzdHJDZWxsID0gR2VuQ2VsbChqLCBudWxsLCBXZWVrRGF5Q29sb3IpOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCgkJdkNhbERhdGEgPSB2Q2FsRGF0YSArIHN0ckNlbGw7CgoJCWlmICgodkRheUNvdW50ICUgNyA9PT0gMCkgJiYgKGogPCBDYWwuR2V0TW9uRGF5cygpKSkKCQl7CgkJCXZDYWxEYXRhID0gdkNhbERhdGEgKyAiXG48L3RyPiI7CgkJCWNhbEhlaWdodCArPSAxOTsKCQl9Cgl9CgoJLy8gZmluaXNoIHRoZSB0YWJsZSBwcm9wZXIKCglpZiAodkRheUNvdW50ICUgNyAhPT0gMCkKCXsKCQl3aGlsZSAodkRheUNvdW50ICUgNyAhPT0gMCkKCQl7CgkJCXZDYWxEYXRhID0gdkNhbERhdGEgKyBHZW5DZWxsKCk7CgkJCXZEYXlDb3VudCA9IHZEYXlDb3VudCArIDE7CgkJfQoJfQoKCXZDYWxEYXRhID0gdkNhbERhdGEgKyAiPC90YWJsZT48L3RkPjwvdHI+IjsKCgoJLy9UaW1lIHBpY2tlcgoJaWYgKENhbC5TaG93VGltZSA9PT0gdHJ1ZSkKCXsKCQlzaG93SG91ciA9IENhbC5nZXRTaG93SG91cigpOwoKCQlpZiAoQ2FsLlNob3dTZWNvbmRzID09PSBmYWxzZSAmJiBUaW1lTW9kZSA9PT0gMjQpCgkJewoJCQlTaG93QXJyb3dzID0gdHJ1ZTsKCQkJSG91ckNlbGxXaWR0aCA9ICIxMHB4IjsKCQl9CgoJCXZDYWxUaW1lID0gIjx0cj48dGQgY29sc3Bhbj0nNycgc3R5bGU9XCJ0ZXh0LWFsaWduOmNlbnRlcjtcIj48dGFibGUgYm9yZGVyPScwJyB3aWR0aD0nMTk5cHgnIGNlbGxwYWRkaW5nPScwJyBjZWxsc3BhY2luZz0nMCc+PHRib2R5Pjx0cj48dGQgaGVpZ2h0PSc1cHgnIHdpZHRoPSciICsgSG91ckNlbGxXaWR0aCArICInPiZuYnNwOzwvdGQ+IjsKCgkJaWYgKFNob3dBcnJvd3MgJiYgVXNlSW1hZ2VGaWxlcykgLy90aGlzIGlzIHdoZXJlIHRoZSB1cCBhbmQgZG93biBhcnJvdyBjb250cm9sIHRoZSBob3VyLgoJCXsKCQkgICAgdkNhbFRpbWUgKz0gIjx0ZCBzdHlsZT0ndmVydGljYWwtYWxpZ246bWlkZGxlOyc+PHRhYmxlIGNlbGxzcGFjaW5nPScwJyBjZWxscGFkZGluZz0nMCcgc3R5bGU9J2xpbmUtaGVpZ2h0OjBwdDt3aWR0aDoxMDAlOyc+PHRyPjx0ZCBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXI7Jz48aW1nIG9uY2xpY2s9J25leHRTdGVwKFwiSG91clwiLCBcInBsdXNcIik7JyBvbm1vdXNlZG93bj0nc3RhcnRTcGluKFwiSG91clwiLCBcInBsdXNcIik7JyBvbm1vdXNldXA9J3N0b3BTcGluKCk7JyBzcmM9JyIgKyBpbWFnZUZpbGVzUGF0aCArICJjYWxfcGx1cy5naWYnIHdpZHRoPScxM3B4JyBoZWlnaHQ9JzlweCcgb25tb3VzZW92ZXI9J2NoYW5nZUJvcmRlcih0aGlzLCAwKScgb25tb3VzZW91dD0nY2hhbmdlQm9yZGVyKHRoaXMsIDEpJyBzdHlsZT0nYm9yZGVyOjFweCBzb2xpZCB3aGl0ZSc+PC90ZD48L3RyPjx0cj48dGQgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyOyc+PGltZyBvbmNsaWNrPSduZXh0U3RlcChcIkhvdXJcIiwgXCJtaW51c1wiKTsnIG9ubW91c2Vkb3duPSdzdGFydFNwaW4oXCJIb3VyXCIsIFwibWludXNcIik7JyBvbm1vdXNldXA9J3N0b3BTcGluKCk7JyBzcmM9JyIgKyBpbWFnZUZpbGVzUGF0aCArICJjYWxfbWludXMuZ2lmJyB3aWR0aD0nMTNweCcgaGVpZ2h0PSc5cHgnIG9ubW91c2VvdmVyPSdjaGFuZ2VCb3JkZXIodGhpcywgMCknIG9ubW91c2VvdXQ9J2NoYW5nZUJvcmRlcih0aGlzLCAxKScgc3R5bGU9J2JvcmRlcjoxcHggc29saWQgd2hpdGUnPjwvdGQ+PC90cj48L3RhYmxlPjwvdGQ+XG4iOwoJCX0KCgkJdkNhbFRpbWUgKz0gIjx0ZCB3aWR0aD0nMjJweCc+PGlucHV0IHR5cGU9J3RleHQnIG5hbWU9J2hvdXInIG1heGxlbmd0aD0yIHNpemU9MSBzdHlsZT1cIldJRFRIOjIycHhcIiB2YWx1ZT0iICsgc2hvd0hvdXIgKyAiIG9ua2V5dXA9XCJqYXZhc2NyaXB0OkNhbC5TZXRIb3VyKHRoaXMudmFsdWUpXCI+IjsKCQl2Q2FsVGltZSArPSAiPC90ZD48dGQgc3R5bGU9J2ZvbnQtd2VpZ2h0OmJvbGQ7dGV4dC1hbGlnbjpjZW50ZXI7Jz46PC90ZD48dGQgd2lkdGg9JzIycHgnPiI7CgkJdkNhbFRpbWUgKz0gIjxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSdtaW51dGUnIG1heGxlbmd0aD0yIHNpemU9MSBzdHlsZT1cIldJRFRIOiAyMnB4XCIgdmFsdWU9IiArIENhbC5NaW51dGVzICsgIiBvbmtleXVwPVwiamF2YXNjcmlwdDpDYWwuU2V0TWludXRlKHRoaXMudmFsdWUpXCI+IjsKCgkJaWYgKENhbC5TaG93U2Vjb25kcykKCQl7CgkJICAgIHZDYWxUaW1lICs9ICI8L3RkPjx0ZCBzdHlsZT0nZm9udC13ZWlnaHQ6Ym9sZDsnPjo8L3RkPjx0ZCB3aWR0aD0nMjJweCc+IjsKCQkJdkNhbFRpbWUgKz0gIjxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSdzZWNvbmQnIG1heGxlbmd0aD0yIHNpemU9MSBzdHlsZT1cIldJRFRIOiAyMnB4XCIgdmFsdWU9IiArIENhbC5TZWNvbmRzICsgIiBvbmtleXVwPVwiamF2YXNjcmlwdDpDYWwuU2V0U2Vjb25kKHBhcnNlSW50KHRoaXMudmFsdWUsMTApKVwiPiI7CgkJfQoKCQlpZiAoVGltZU1vZGUgPT09IDEyKQoJCXsKCQkJU2VsZWN0QW0gPSAoQ2FsLkFNb3JQTSA9PT0gIkFNIikgPyAiU2VsZWN0ZWQiIDogIiI7CgkJCVNlbGVjdFBtID0gKENhbC5BTW9yUE0gPT09ICJQTSIpID8gIlNlbGVjdGVkIiA6ICIiOwoKCQkJdkNhbFRpbWUgKz0gIjwvdGQ+PHRkPiI7CgkJCXZDYWxUaW1lICs9ICI8c2VsZWN0IG5hbWU9XCJhbXBtXCIgb25DaGFuZ2U9XCJqYXZhc2NyaXB0OkNhbC5TZXRBbVBtKHRoaXMub3B0aW9uc1t0aGlzLnNlbGVjdGVkSW5kZXhdLnZhbHVlKTtcIj4iOwoJCQl2Q2FsVGltZSArPSAiPG9wdGlvbiAiICsgU2VsZWN0QW0gKyAiIHZhbHVlPVwiQU1cIj5BTTwvb3B0aW9uPiI7CgkJCXZDYWxUaW1lICs9ICI8b3B0aW9uICIgKyBTZWxlY3RQbSArICIgdmFsdWU9XCJQTVwiPlBNPG9wdGlvbj4iOwoJCQl2Q2FsVGltZSArPSAiPC9zZWxlY3Q+IjsKCQl9CgoJCWlmIChTaG93QXJyb3dzICYmIFVzZUltYWdlRmlsZXMpIC8vdGhpcyBpcyB3aGVyZSB0aGUgdXAgYW5kIGRvd24gYXJyb3cgdG8gY2hhbmdlIHRoZSAiTWludXRlIi4KCQl7CgkJICAgIHZDYWxUaW1lICs9ICI8L3RkPlxuPHRkIHN0eWxlPSd2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7Jz48dGFibGUgY2VsbHNwYWNpbmc9JzAnIGNlbGxwYWRkaW5nPScwJyBzdHlsZT0nbGluZS1oZWlnaHQ6MHB0O3dpZHRoOjEwMCUnPjx0cj48dGQgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyOyc+PGltZyBvbmNsaWNrPSduZXh0U3RlcChcIk1pbnV0ZVwiLCBcInBsdXNcIik7JyBvbm1vdXNlZG93bj0nc3RhcnRTcGluKFwiTWludXRlXCIsIFwicGx1c1wiKTsnIG9ubW91c2V1cD0nc3RvcFNwaW4oKTsnIHNyYz0nIiArIGltYWdlRmlsZXNQYXRoICsgImNhbF9wbHVzLmdpZicgd2lkdGg9JzEzcHgnIGhlaWdodD0nOXB4JyBvbm1vdXNlb3Zlcj0nY2hhbmdlQm9yZGVyKHRoaXMsIDApJyBvbm1vdXNlb3V0PSdjaGFuZ2VCb3JkZXIodGhpcywgMSknIHN0eWxlPSdib3JkZXI6MXB4IHNvbGlkIHdoaXRlJz48L3RkPjwvdHI+PHRyPjx0ZCBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXI7Jz48aW1nIG9ubW91c2Vkb3duPSdzdGFydFNwaW4oXCJNaW51dGVcIiwgXCJtaW51c1wiKTsnIG9ubW91c2V1cD0nc3RvcFNwaW4oKTsnIG9uY2xpY2s9J25leHRTdGVwKFwiTWludXRlXCIsXCJtaW51c1wiKTsnIHNyYz0nIiArIGltYWdlRmlsZXNQYXRoICsgImNhbF9taW51cy5naWYnIHdpZHRoPScxM3B4JyBoZWlnaHQ9JzlweCcgb25tb3VzZW92ZXI9J2NoYW5nZUJvcmRlcih0aGlzLCAwKScgb25tb3VzZW91dD0nY2hhbmdlQm9yZGVyKHRoaXMsIDEpJyBzdHlsZT0nYm9yZGVyOjFweCBzb2xpZCB3aGl0ZSc+PC90ZD48L3RyPjwvdGFibGU+IjsKCQl9CgoJCXZDYWxUaW1lICs9ICI8L3RkPlxuPHRkIGFsaWduPSdyaWdodCcgdmFsaWduPSdib3R0b20nIHdpZHRoPSciICsgSG91ckNlbGxXaWR0aCArICJweCc+PC90ZD48L3RyPiI7CgkJdkNhbFRpbWUgKz0gIjx0cj48dGQgY29sc3Bhbj0nNycgc3R5bGU9XCJ0ZXh0LWFsaWduOmNlbnRlcjtcIj48aW5wdXQgc3R5bGU9J3dpZHRoOjYwcHg7Zm9udC1zaXplOjEycHg7JyBvbkNsaWNrPSdqYXZhc2NyaXB0OmNsb3Nld2luKFwiIiArIENhbC5DdHJsICsgIlwiKTsnICB0eXBlPVwiYnV0dG9uXCIgdmFsdWU9XCJPS1wiPiZuYnNwOzxpbnB1dCBzdHlsZT0nd2lkdGg6NjBweDtmb250LXNpemU6MTJweDsnIG9uQ2xpY2s9J2phdmFzY3JpcHQ6IHdpbkNhbC5zdHlsZS52aXNpYmlsaXR5ID0gXCJoaWRkZW5cIicgdHlwZT1cImJ1dHRvblwiIHZhbHVlPVwiQ2FuY2VsXCI+PC90ZD48L3RyPiI7Cgl9CgllbHNlIC8vaWYgbm90IHRvIHNob3cgdGltZS4KCXsKCSAgICB2Q2FsVGltZSArPSAiXG48dHI+XG48dGQgY29sc3Bhbj0nNycgc3R5bGU9XCJ0ZXh0LWFsaWduOnJpZ2h0O1wiPiI7CgkgICAgLy9jbG9zZSBidXR0b24KCSAgICBpZiAoVXNlSW1hZ2VGaWxlcykgewoJICAgICAgICB2Q2FsQ2xvc2luZyArPSAiPGltZyBvbm1vdXNlZG93bj0namF2YXNjcmlwdDpjbG9zZXdpbihcIiIgKyBDYWwuQ3RybCArICJcIik7IHN0b3BTcGluKCk7JyBzcmM9JyIraW1hZ2VGaWxlc1BhdGgrImNhbF9jbG9zZS5naWYnIHdpZHRoPScxNnB4JyBoZWlnaHQ9JzE0cHgnIG9ubW91c2VvdmVyPSdjaGFuZ2VCb3JkZXIodGhpcywwKScgb25tb3VzZW91dD0nY2hhbmdlQm9yZGVyKHRoaXMsIDEpJyBzdHlsZT0nYm9yZGVyOjFweCBzb2xpZCB3aGl0ZSc+PC90ZD4iOwoJICAgIH0KCSAgICBlbHNlIHsKCSAgICAgICAgdkNhbENsb3NpbmcgKz0gIjxzcGFuIGlkPSdjbG9zZV9jYWwnIHRpdGxlPSdjbG9zZSdvbm1vdXNlZG93bj0namF2YXNjcmlwdDpjbG9zZXdpbihcIiIgKyBDYWwuQ3RybCArICJcIik7c3RvcFNwaW4oKTsnIG9ubW91c2VvdmVyPSdjaGFuZ2VCb3JkZXIodGhpcywgMCknb25tb3VzZW91dD0nY2hhbmdlQm9yZGVyKHRoaXMsIDEpJyBzdHlsZT0nYm9yZGVyOjFweCBzb2xpZCB3aGl0ZTsgZm9udC1mYW1pbHk6IEFyaWFsO2ZvbnQtc2l6ZTogMTBwdDsnPng8L3NwYW4+PC90ZD4iOwoJICAgIH0KCSAgICB2Q2FsQ2xvc2luZyArPSAiPC90cj4iOwoJfQoKCgoJdkNhbENsb3NpbmcgKz0gIjwvdGJvZHk+PC90YWJsZT48L3RkPjwvdHI+IjsKCWNhbEhlaWdodCArPSAzMTsKCXZDYWxDbG9zaW5nICs9ICI8L3Rib2R5PjwvdGFibGU+XG48L3NwYW4+IjsKCgkvL2VuZCB0aW1lIHBpY2tlcgoJZnVuY0NhbGJhY2sgPSAiZnVuY3Rpb24gY2FsbGJhY2soaWQsIGRhdHVtKSB7XG4iOwoJZnVuY0NhbGJhY2sgKz0gIiB2YXIgQ2FsSWQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7IGlmIChkYXR1bT09PSAndW5kZWZpbmVkJykgeyB2YXIgZCA9IG5ldyBEYXRlKCk7IGRhdHVtID0gZC5nZXREYXRlKCkgKyAnLycgKyhkLmdldE1vbnRoKCkrMSkgKyAnLycgKyBkLmdldEZ1bGxZZWFyKCk7IH0gd2luZG93LmNhbERhdHVtPWRhdHVtO0NhbElkLnZhbHVlPWRhdHVtO1xuIjsKCWZ1bmNDYWxiYWNrICs9ICIgaWYgKENhbC5TaG93VGltZSkge1xuIjsKCWZ1bmNDYWxiYWNrICs9ICIgQ2FsSWQudmFsdWUrPScgJytDYWwuZ2V0U2hvd0hvdXIoKSsnOicrQ2FsLk1pbnV0ZXM7XG4iOwoJZnVuY0NhbGJhY2sgKz0gIiBpZiAoQ2FsLlNob3dTZWNvbmRzKVxuICBDYWxJZC52YWx1ZSs9JzonK0NhbC5TZWNvbmRzO1xuIjsKCWZ1bmNDYWxiYWNrICs9ICIgaWYgKFRpbWVNb2RlID09PSAxMilcbiAgQ2FsSWQudmFsdWUrPScnK0NhbC5nZXRTaG93QU1vclBNKCk7XG4iOwoJZnVuY0NhbGJhY2sgKz0gIn1cbiB3aW5DYWwuc3R5bGUudmlzaWJpbGl0eT0naGlkZGVuJztcbn1cbiI7CgoKCS8vIGRldGVybWluZXMgaWYgdGhlcmUgaXMgZW5vdWdoIHNwYWNlIHRvIG9wZW4gdGhlIGNhbCBhYm92ZSB0aGUgcG9zaXRpb24gd2hlcmUgaXQgaXMgY2FsbGVkCglpZiAoeXBvcyA+IGNhbEhlaWdodCkKCXsKCQl5cG9zID0geXBvcyAtIGNhbEhlaWdodDsKCX0KCglpZiAoIXdpbkNhbCkKCXsKCQloZWFkSUQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdOwoKCQkvLyBhZGQgamF2YXNjcmlwdCBmdW5jdGlvbiB0byB0aGUgc3BhbiBjYWwKCQllID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7CgkJZS50eXBlID0gInRleHQvamF2YXNjcmlwdCI7CgkJZS5sYW5ndWFnZSA9ICJqYXZhc2NyaXB0IjsKCQllLnRleHQgPSBmdW5jQ2FsYmFjazsKCQloZWFkSUQuYXBwZW5kQ2hpbGQoZSk7CgkJLy8gYWRkIHN0eWxlc2hlZXQgdG8gdGhlIHNwYW4gY2FsCgoJCWNzc1N0ciA9ICIuY2FsVEQge2ZvbnQtZmFtaWx5OiB2ZXJkYW5hOyBmb250LXNpemU6IDEycHg7IHRleHQtYWxpZ246IGNlbnRlcjsgYm9yZGVyOjA7IH1cbiI7CgkJY3NzU3RyICs9ICIuY2FsUiB7Zm9udC1mYW1pbHk6IHZlcmRhbmE7IGZvbnQtc2l6ZTogMTJweDsgdGV4dC1hbGlnbjogY2VudGVyOyBmb250LXdlaWdodDogYm9sZDt9IjsKCgkJc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpOwoJCXN0eWxlLnR5cGUgPSAidGV4dC9jc3MiOwoJCXN0eWxlLnJlbCA9ICJzdHlsZXNoZWV0IjsKCQlpZiAoc3R5bGUuc3R5bGVTaGVldCkKCQl7IC8vIElFCgkJCXN0eWxlLnN0eWxlU2hlZXQuY3NzVGV4dCA9IGNzc1N0cjsKCQl9CgoJCWVsc2UKCQl7IC8vIHczYwoJCQljc3NUZXh0ID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY3NzU3RyKTsKCQkJc3R5bGUuYXBwZW5kQ2hpbGQoY3NzVGV4dCk7CgkJfQoKCQloZWFkSUQuYXBwZW5kQ2hpbGQoc3R5bGUpOwoJCS8vIGNyZWF0ZSB0aGUgb3V0ZXIgZnJhbWUgdGhhdCBhbGxvd3MgdGhlIGNhbC4gdG8gYmUgbW92ZWQKCQlzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpOwoJCXNwYW4uaWQgPSBjYWxTcGFuSUQ7CgkJc3Bhbi5zdHlsZS5wb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CgkJc3Bhbi5zdHlsZS5sZWZ0ID0gKHhwb3MgKyBDYWxQb3NPZmZzZXRYKSArICdweCc7CgkJc3Bhbi5zdHlsZS50b3AgPSAoeXBvcyAtIENhbFBvc09mZnNldFkpICsgJ3B4JzsKCQlzcGFuLnN0eWxlLndpZHRoID0gQ2FsV2lkdGggKyAncHgnOwoJCXNwYW4uc3R5bGUuYm9yZGVyID0gInNvbGlkIDFwdCAiICsgU3BhbkJvcmRlckNvbG9yOwoJCXNwYW4uc3R5bGUucGFkZGluZyA9ICIwIjsKCQlzcGFuLnN0eWxlLmN1cnNvciA9ICJtb3ZlIjsKCQlzcGFuLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IENhbEJnQ29sb3I7CgkJc3Bhbi5zdHlsZS56SW5kZXggPSAxMDA7CgkJZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzcGFuKTsKCQl3aW5DYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChjYWxTcGFuSUQpOwoJfQoKCWVsc2UKCXsKCQl3aW5DYWwuc3R5bGUudmlzaWJpbGl0eSA9ICJ2aXNpYmxlIjsKCQl3aW5DYWwuc3R5bGUuSGVpZ2h0ID0gY2FsSGVpZ2h0OwoKCQkvLyBzZXQgdGhlIHBvc2l0aW9uIGZvciBhIG5ldyBjYWxlbmRhciBvbmx5CgkJaWYgKGJOZXdDYWwgPT09IHRydWUpCgkJewoJCQl3aW5DYWwuc3R5bGUubGVmdCA9ICh4cG9zICsgQ2FsUG9zT2Zmc2V0WCkgKyAncHgnOwoJCQl3aW5DYWwuc3R5bGUudG9wID0gKHlwb3MgLSBDYWxQb3NPZmZzZXRZKSArICdweCc7CgkJfQoJfQoKCXdpbkNhbC5pbm5lckhUTUwgPSB3aW5DYWxEYXRhICsgdkNhbEhlYWRlciArIHZDYWxEYXRhICsgdkNhbFRpbWUgKyB2Q2FsQ2xvc2luZzsKCXJldHVybiB0cnVlOwp9CgoKZnVuY3Rpb24gTmV3Q3NzQ2FsKHBDdHJsLCBwRm9ybWF0LCBwU2Nyb2xsZXIsIHBTaG93VGltZSwgcFRpbWVNb2RlLCBwU2hvd1NlY29uZHMpCnsKCS8vIGdldCBjdXJyZW50IGRhdGUgYW5kIHRpbWUKCglkdFRvZGF5ID0gbmV3IERhdGUoKTsKCUNhbCA9IG5ldyBDYWxlbmRhcihkdFRvZGF5KTsKCglpZiAocFNob3dUaW1lICE9PSB1bmRlZmluZWQpCgl7CgkgICAgaWYgKHBTaG93VGltZSkgewoJICAgICAgICBDYWwuU2hvd1RpbWUgPSB0cnVlOwoJICAgIH0KCSAgICBlbHNlIHsKCSAgICAgICAgQ2FsLlNob3dUaW1lID0gZmFsc2U7CgkgICAgfQoKCQlpZiAocFRpbWVNb2RlKQoJCXsKCQkJcFRpbWVNb2RlID0gcGFyc2VJbnQocFRpbWVNb2RlLCAxMCk7CgkJfQoJCWlmIChwVGltZU1vZGUgPT09IDEyIHx8IHBUaW1lTW9kZSA9PT0gMjQpCgkJewoJCQlUaW1lTW9kZSA9IHBUaW1lTW9kZTsKCQl9CgkJZWxzZQoJCXsKCQkJVGltZU1vZGUgPSAyNDsKCQl9CgoJCWlmIChwU2hvd1NlY29uZHMgIT09IHVuZGVmaW5lZCkKCQl7CgkJCWlmIChwU2hvd1NlY29uZHMpCgkJCXsKCQkJCUNhbC5TaG93U2Vjb25kcyA9IHRydWU7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlDYWwuU2hvd1NlY29uZHMgPSBmYWxzZTsKCQkJfQoJCX0KCQllbHNlCgkJewoJCQlDYWwuU2hvd1NlY29uZHMgPSBmYWxzZTsKCQl9CgoJfQoKCWlmIChwQ3RybCAhPT0gdW5kZWZpbmVkKQoJewoJCUNhbC5DdHJsID0gcEN0cmw7Cgl9CgoJaWYgKHBGb3JtYXQgIT09IHVuZGVmaW5lZCkKCXsKCQlDYWwuRm9ybWF0ID0gcEZvcm1hdC50b1VwcGVyQ2FzZSgpOwoJfQoJZWxzZQoJewoJCUNhbC5Gb3JtYXQgPSAiTU1ERFlZWVkiOwoJfQoKCWlmIChwU2Nyb2xsZXIgIT09IHVuZGVmaW5lZCkKCXsKCQlpZiAocFNjcm9sbGVyLnRvVXBwZXJDYXNlKCkgPT09ICJBUlJPVyIpCgkJewoJCQlDYWwuU2Nyb2xsZXIgPSAiQVJST1ciOwoJCX0KCQllbHNlCgkJewoJCQlDYWwuU2Nyb2xsZXIgPSAiRFJPUERPV04iOwoJCX0KCX0KCglleERhdGVUaW1lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocEN0cmwpLnZhbHVlOyAvL0V4aXN0aW5nIERhdGUgVGltZSB2YWx1ZSBpbiB0ZXh0Ym94LgoKCWlmIChleERhdGVUaW1lKQoJeyAvL1BhcnNlIGV4aXN0aW5nIERhdGUgU3RyaW5nCgkJdmFyIFNwMSA9IGV4RGF0ZVRpbWUuaW5kZXhPZihEYXRlU2VwYXJhdG9yLCAwKSwvL0luZGV4IG9mIERhdGUgU2VwYXJhdG9yIDEKCQlTcDIgPSBleERhdGVUaW1lLmluZGV4T2YoRGF0ZVNlcGFyYXRvciwgcGFyc2VJbnQoU3AxLCAxMCkgKyAxKSwvL0luZGV4IG9mIERhdGUgU2VwYXJhdG9yIDIKCQl0U3AxLC8vSW5kZXggb2YgVGltZSBTZXBhcmF0b3IgMQoJCXRTcDIsLy9JbmRleCBvZiBUaW1lIFNlcGFyYXRvciAyCgkJc3RyTW9udGgsCgkJc3RyRGF0ZSwKCQlzdHJZZWFyLAoJCWludE1vbnRoLAoJCVllYXJQYXR0ZXJuLAoJCXN0ckhvdXIsCgkJc3RyTWludXRlLAoJCXN0clNlY29uZCwKCQl3aW5IZWlnaHQsCgkJb2Zmc2V0ID0gcGFyc2VJbnQoQ2FsLkZvcm1hdC50b1VwcGVyQ2FzZSgpLmxhc3RJbmRleE9mKCJNIiksIDEwKSAtIHBhcnNlSW50KENhbC5Gb3JtYXQudG9VcHBlckNhc2UoKS5pbmRleE9mKCJNIiksIDEwKSAtIDEsCgkJc3RyQU1QTSA9ICIiOwoJCS8vcGFyc2UgbW9udGgKCgkJaWYgKENhbC5Gb3JtYXQudG9VcHBlckNhc2UoKSA9PT0gIkRETU1ZWVlZIiB8fCBDYWwuRm9ybWF0LnRvVXBwZXJDYXNlKCkgPT09ICJERE1NTVlZWVkiKQoJCXsKCQkJaWYgKERhdGVTZXBhcmF0b3IgPT09ICIiKQoJCQl7CgkJCQlzdHJNb250aCA9IGV4RGF0ZVRpbWUuc3Vic3RyaW5nKDIsIDQgKyBvZmZzZXQpOwoJCQkJc3RyRGF0ZSA9IGV4RGF0ZVRpbWUuc3Vic3RyaW5nKDAsIDIpOwoJCQkJc3RyWWVhciA9IGV4RGF0ZVRpbWUuc3Vic3RyaW5nKDQgKyBvZmZzZXQsIDggKyBvZmZzZXQpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJaWYgKGV4RGF0ZVRpbWUuaW5kZXhPZigiRCoiKSAhPT0gLTEpCgkJCQl7ICAgLy9EVEcKCQkJCQlzdHJNb250aCA9IGV4RGF0ZVRpbWUuc3Vic3RyaW5nKDgsIDExKTsKCQkJCQlzdHJEYXRlICA9IGV4RGF0ZVRpbWUuc3Vic3RyaW5nKDAsIDIpOwoJCQkJCXN0clllYXIgID0gIjIwIiArIGV4RGF0ZVRpbWUuc3Vic3RyaW5nKDExLCAxMyk7ICAvL0hhY2ssIG51ciBmw7xyIEphaHJlc3phaGxlbiBhYiAyMDAwCgoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCXN0ck1vbnRoID0gZXhEYXRlVGltZS5zdWJzdHJpbmcoU3AxICsgMSwgU3AyKTsKCQkJCQlzdHJEYXRlID0gZXhEYXRlVGltZS5zdWJzdHJpbmcoMCwgU3AxKTsKCQkJCQlzdHJZZWFyID0gZXhEYXRlVGltZS5zdWJzdHJpbmcoU3AyICsgMSwgU3AyICsgNSk7CgkJCQl9CgkJCX0KCQl9CgoJCWVsc2UgaWYgKENhbC5Gb3JtYXQudG9VcHBlckNhc2UoKSA9PT0gIk1NRERZWVlZIiB8fCBDYWwuRm9ybWF0LnRvVXBwZXJDYXNlKCkgPT09ICJNTU1ERFlZWVkiKXsKCQkJaWYgKERhdGVTZXBhcmF0b3IgPT09ICIiKXsKCQkJCXN0ck1vbnRoID0gZXhEYXRlVGltZS5zdWJzdHJpbmcoMCwgMiArIG9mZnNldCk7CgkJCQlzdHJEYXRlID0gZXhEYXRlVGltZS5zdWJzdHJpbmcoMiArIG9mZnNldCwgNCArIG9mZnNldCk7CgkJCQlzdHJZZWFyID0gZXhEYXRlVGltZS5zdWJzdHJpbmcoNCArIG9mZnNldCwgOCArIG9mZnNldCk7CgkJCX0KCQkJZWxzZXsKCQkJCXN0ck1vbnRoID0gZXhEYXRlVGltZS5zdWJzdHJpbmcoMCwgU3AxKTsKCQkJCXN0ckRhdGUgPSBleERhdGVUaW1lLnN1YnN0cmluZyhTcDEgKyAxLCBTcDIpOwoJCQkJc3RyWWVhciA9IGV4RGF0ZVRpbWUuc3Vic3RyaW5nKFNwMiArIDEsIFNwMiArIDUpOwoJCQl9CgkJfQoKCQllbHNlIGlmIChDYWwuRm9ybWF0LnRvVXBwZXJDYXNlKCkgPT09ICJZWVlZTU1ERCIgfHwgQ2FsLkZvcm1hdC50b1VwcGVyQ2FzZSgpID09PSAiWVlZWU1NTUREIikKCQl7CgkJCWlmIChEYXRlU2VwYXJhdG9yID09PSAiIil7CgkJCQlzdHJNb250aCA9IGV4RGF0ZVRpbWUuc3Vic3RyaW5nKDQsIDYgKyBvZmZzZXQpOwoJCQkJc3RyRGF0ZSA9IGV4RGF0ZVRpbWUuc3Vic3RyaW5nKDYgKyBvZmZzZXQsIDggKyBvZmZzZXQpOwoJCQkJc3RyWWVhciA9IGV4RGF0ZVRpbWUuc3Vic3RyaW5nKDAsIDQpOwoJCQl9CgkJCWVsc2V7CgkJCQlzdHJNb250aCA9IGV4RGF0ZVRpbWUuc3Vic3RyaW5nKFNwMSArIDEsIFNwMik7CgkJCQlzdHJEYXRlID0gZXhEYXRlVGltZS5zdWJzdHJpbmcoU3AyICsgMSwgU3AyICsgMyk7CgkJCQlzdHJZZWFyID0gZXhEYXRlVGltZS5zdWJzdHJpbmcoMCwgU3AxKTsKCQkJfQoJCX0KCgkJZWxzZSBpZiAoQ2FsLkZvcm1hdC50b1VwcGVyQ2FzZSgpID09PSAiWVlNTUREIiB8fCBDYWwuRm9ybWF0LnRvVXBwZXJDYXNlKCkgPT09ICJZWU1NTUREIikKCQl7CgkJCWlmIChEYXRlU2VwYXJhdG9yID09PSAiIikKCQkJewoJCQkJc3RyTW9udGggPSBleERhdGVUaW1lLnN1YnN0cmluZygyLCA0ICsgb2Zmc2V0KTsKCQkJCXN0ckRhdGUgPSBleERhdGVUaW1lLnN1YnN0cmluZyg0ICsgb2Zmc2V0LCA2ICsgb2Zmc2V0KTsKCQkJCXN0clllYXIgPSBleERhdGVUaW1lLnN1YnN0cmluZygwLCAyKTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCXN0ck1vbnRoID0gZXhEYXRlVGltZS5zdWJzdHJpbmcoU3AxICsgMSwgU3AyKTsKCQkJCXN0ckRhdGUgPSBleERhdGVUaW1lLnN1YnN0cmluZyhTcDIgKyAxLCBTcDIgKyAzKTsKCQkJCXN0clllYXIgPSBleERhdGVUaW1lLnN1YnN0cmluZygwLCBTcDEpOwoJCQl9CgkJfQoKCQlpZiAoaXNOYU4oc3RyTW9udGgpKXsKCQkJaW50TW9udGggPSBDYWwuR2V0TW9udGhJbmRleChzdHJNb250aCk7CgkJfQoJCWVsc2V7CgkJCWludE1vbnRoID0gcGFyc2VJbnQoc3RyTW9udGgsIDEwKSAtIDE7CgkJfQoJCWlmICgocGFyc2VJbnQoaW50TW9udGgsIDEwKSA+PSAwKSAmJiAocGFyc2VJbnQoaW50TW9udGgsIDEwKSA8IDEyKSkJewoJCQlDYWwuTW9udGggPSBpbnRNb250aDsKCQl9CgkJLy9lbmQgcGFyc2UgbW9udGgKCgkJLy9wYXJzZSB5ZWFyCgkJWWVhclBhdHRlcm4gPSAvXlxkezR9JC87CgkJaWYgKFllYXJQYXR0ZXJuLnRlc3Qoc3RyWWVhcikpIHsKCQkgICAgaWYgKChwYXJzZUludChzdHJZZWFyLCAxMCk+PVN0YXJ0WWVhcikgJiYgKHBhcnNlSW50KHN0clllYXIsIDEwKTw9IChkdFRvZGF5LmdldEZ1bGxZZWFyKCkrRW5kWWVhcikpKQoJCSAgICAgICAgQ2FsLlllYXIgPSBwYXJzZUludChzdHJZZWFyLCAxMCk7CgkJfQoJCS8vZW5kIHBhcnNlIHllYXIKCQkKCQkvL3BhcnNlIERhdGUKCQlpZiAoKHBhcnNlSW50KHN0ckRhdGUsIDEwKSA8PSBDYWwuR2V0TW9uRGF5cygpKSAmJiAocGFyc2VJbnQoc3RyRGF0ZSwgMTApID49IDEpKSB7CgkJCUNhbC5EYXRlID0gc3RyRGF0ZTsKCQl9CgkJLy9lbmQgcGFyc2UgRGF0ZQoKCQkvL3BhcnNlIHRpbWUKCgkJaWYgKENhbC5TaG93VGltZSA9PT0gdHJ1ZSkKCQl7CgoJCQkvL3BhcnNlIEFNIG9yIFBNCgoJCQlpZiAoVGltZU1vZGUgPT09IDEyKQoJCQl7CgkJCQlzdHJBTVBNID0gZXhEYXRlVGltZS5zdWJzdHJpbmcoZXhEYXRlVGltZS5sZW5ndGggLSAyLCBleERhdGVUaW1lLmxlbmd0aCk7CgkJCQlDYWwuQU1vclBNID0gc3RyQU1QTTsKCQkJfQoKCQkJdFNwMSA9IGV4RGF0ZVRpbWUuaW5kZXhPZigiOiIsIDApOwoJCQl0U3AyID0gZXhEYXRlVGltZS5pbmRleE9mKCI6IiwgKHBhcnNlSW50KHRTcDEsIDEwKSArIDEpKTsKCQkJaWYgKHRTcDEgPiAwKQoJCQl7CgoJCQkJc3RySG91ciA9IGV4RGF0ZVRpbWUuc3Vic3RyaW5nKHRTcDEsIHRTcDEgLSAyKTsKCQkJCUNhbC5TZXRIb3VyKHN0ckhvdXIpOwoKCQkJCXN0ck1pbnV0ZSA9IGV4RGF0ZVRpbWUuc3Vic3RyaW5nKHRTcDEgKyAxLCB0U3AxICsgMyk7CgkJCQlDYWwuU2V0TWludXRlKHN0ck1pbnV0ZSk7CgoJCQkJc3RyU2Vjb25kID0gZXhEYXRlVGltZS5zdWJzdHJpbmcodFNwMiArIDEsIHRTcDIgKyAzKTsKCQkJCUNhbC5TZXRTZWNvbmQoc3RyU2Vjb25kKTsKCgkJCX0KCQkJZWxzZSBpZiAoZXhEYXRlVGltZS5pbmRleE9mKCJEKiIpICE9PSAtMSkKCQkJeyAgIC8vRFRHCgkJCQlzdHJIb3VyID0gZXhEYXRlVGltZS5zdWJzdHJpbmcoMiwgNCk7CgkJCQlDYWwuU2V0SG91cihzdHJIb3VyKTsKCQkJCXN0ck1pbnV0ZSA9IGV4RGF0ZVRpbWUuc3Vic3RyaW5nKDQsIDYpOwoJCQkJQ2FsLlNldE1pbnV0ZShzdHJNaW51dGUpOwoKCQkJfQoJCX0KCgl9CgoJc2VsRGF0ZSA9IG5ldyBEYXRlKENhbC5ZZWFyLCBDYWwuTW9udGgsIENhbC5EYXRlKTsvL3ZlcnNpb24gMS43CglSZW5kZXJDc3NDYWwodHJ1ZSk7Cn0KCmZ1bmN0aW9uIGNsb3Nld2luKGlkKSB7CiAgICBpZiAoQ2FsLlNob3dUaW1lID09PSB0cnVlKSB7CiAgICAgICAgdmFyIE1heFllYXIgPSBkdFRvZGF5LmdldEZ1bGxZZWFyKCkgKyBFbmRZZWFyOwogICAgICAgIHZhciBiZWZvcmVUb2RheSA9CiAgICAgICAgICAgICAgICAgICAgKENhbC5EYXRlIDwgZHRUb2RheS5nZXREYXRlKCkpICYmCiAgICAgICAgICAgICAgICAgICAgKENhbC5Nb250aCA9PT0gZHRUb2RheS5nZXRNb250aCgpKSAmJgogICAgICAgICAgICAgICAgICAgIChDYWwuWWVhciA9PT0gZHRUb2RheS5nZXRGdWxsWWVhcigpKQogICAgICAgICAgICAgICAgICAgIHx8CiAgICAgICAgICAgICAgICAgICAgKENhbC5Nb250aCA8IGR0VG9kYXkuZ2V0TW9udGgoKSkgJiYKICAgICAgICAgICAgICAgICAgICAoQ2FsLlllYXIgPT09IGR0VG9kYXkuZ2V0RnVsbFllYXIoKSkKICAgICAgICAgICAgICAgICAgICB8fAogICAgICAgICAgICAgICAgICAgIChDYWwuWWVhciA8IGR0VG9kYXkuZ2V0RnVsbFllYXIoKSk7CgogICAgICAgIGlmICgoQ2FsLlllYXIgPD0gTWF4WWVhcikgJiYgKENhbC5ZZWFyID49IFN0YXJ0WWVhcikgJiYgKENhbC5Nb250aCA9PT0gc2VsRGF0ZS5nZXRNb250aCgpKSAmJiAoQ2FsLlllYXIgPT09IHNlbERhdGUuZ2V0RnVsbFllYXIoKSkpIHsKICAgICAgICAgICAgaWYgKERpc2FibGVCZWZvcmVUb2RheSA9PT0gdHJ1ZSkgewogICAgICAgICAgICAgICAgaWYgKGJlZm9yZVRvZGF5ID09PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGlkLCBDYWwuRm9ybWF0RGF0ZShDYWwuRGF0ZSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGNhbGxiYWNrKGlkLCBDYWwuRm9ybWF0RGF0ZShDYWwuRGF0ZSkpOwogICAgICAgIH0KICAgIH0KICAgIAoJdmFyIENhbElkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpOwoJQ2FsSWQuZm9jdXMoKTsKCXdpbkNhbC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7Cn0KCmZ1bmN0aW9uIGNoYW5nZUJvcmRlcihlbGVtZW50LCBjb2wsIG9sZEJnQ29sb3IpCnsKCWlmIChjb2wgPT09IDApCgl7CgkJZWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kID0gSG92ZXJDb2xvcjsKCQllbGVtZW50LnN0eWxlLmJvcmRlckNvbG9yID0gImJsYWNrIjsKCQllbGVtZW50LnN0eWxlLmN1cnNvciA9ICJwb2ludGVyIjsKCX0KCgllbHNlCgl7CgkJaWYgKG9sZEJnQ29sb3IpCgkJewoJCQllbGVtZW50LnN0eWxlLmJhY2tncm91bmQgPSBvbGRCZ0NvbG9yOwoJCX0KCQllbHNlCgkJewoJCQllbGVtZW50LnN0eWxlLmJhY2tncm91bmQgPSAid2hpdGUiOwoJCX0KCQllbGVtZW50LnN0eWxlLmJvcmRlckNvbG9yID0gIndoaXRlIjsKCQllbGVtZW50LnN0eWxlLmN1cnNvciA9ICJhdXRvIjsKCX0KfQoKZnVuY3Rpb24gc2VsZWN0RGF0ZShlbGVtZW50LCBkYXRlKSB7CiAgICBDYWwuRGF0ZSA9IGRhdGU7CiAgICBzZWxEYXRlID0gbmV3IERhdGUoQ2FsLlllYXIsIENhbC5Nb250aCwgQ2FsLkRhdGUpOwogICAgZWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kID0gU2VsRGF0ZUNvbG9yOwogICAgUmVuZGVyQ3NzQ2FsKCk7Cn0KCmZ1bmN0aW9uIHBpY2tJdChldnQpCnsKCXZhciBvYmplY3RJRCwKCWRvbSwKCWRlLAoJYjsKCS8vIGFjY2Vzc2VzIHRoZSBlbGVtZW50IHRoYXQgZ2VuZXJhdGVzIHRoZSBldmVudCBhbmQgcmV0cmlldmVzIGl0cyBJRAoJaWYgKGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIpCgl7IC8vIHczYwoJCW9iamVjdElEID0gZXZ0LnRhcmdldC5pZDsKCQlpZiAob2JqZWN0SUQuaW5kZXhPZihjYWxTcGFuSUQpICE9PSAtMSkKCQl7CgkJCWRvbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG9iamVjdElEKTsKCQkJY25MZWZ0ID0gZXZ0LnBhZ2VYOwoJCQljblRvcCA9IGV2dC5wYWdlWTsKCgkJCWlmIChkb20ub2Zmc2V0TGVmdCkKCQkJewoJCQkJY25MZWZ0ID0gKGNuTGVmdCAtIGRvbS5vZmZzZXRMZWZ0KTsKCQkJCWNuVG9wID0gKGNuVG9wIC0gZG9tLm9mZnNldFRvcCk7CgkJCX0KCQl9CgoJCS8vIGdldCBtb3VzZSBwb3NpdGlvbiBvbiBjbGljawoJCXhwb3MgPSAoZXZ0LnBhZ2VYKTsKCQl5cG9zID0gKGV2dC5wYWdlWSk7Cgl9CgoJZWxzZQoJeyAvLyBJRQoJCW9iamVjdElEID0gZXZlbnQuc3JjRWxlbWVudC5pZDsKCQljbkxlZnQgPSBldmVudC5vZmZzZXRYOwoJCWNuVG9wID0gKGV2ZW50Lm9mZnNldFkpOwoKCQkvLyBnZXQgbW91c2UgcG9zaXRpb24gb24gY2xpY2sKCQlkZSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsKCQliID0gZG9jdW1lbnQuYm9keTsKCgkJeHBvcyA9IGV2ZW50LmNsaWVudFggKyAoZGUuc2Nyb2xsTGVmdCB8fCBiLnNjcm9sbExlZnQpIC0gKGRlLmNsaWVudExlZnQgfHwgMCk7CgkJeXBvcyA9IGV2ZW50LmNsaWVudFkgKyAoZGUuc2Nyb2xsVG9wIHx8IGIuc2Nyb2xsVG9wKSAtIChkZS5jbGllbnRUb3AgfHwgMCk7Cgl9CgoJLy8gdmVyaWZ5IGlmIHRoaXMgaXMgYSB2YWxpZCBlbGVtZW50IHRvIHBpY2sKCWlmIChvYmplY3RJRC5pbmRleE9mKGNhbFNwYW5JRCkgIT09IC0xKQoJewoJCWRvbVN0eWxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQob2JqZWN0SUQpLnN0eWxlOwoJfQoKCWlmIChkb21TdHlsZSkKCXsKCQlkb21TdHlsZS56SW5kZXggPSAxMDA7CgkJcmV0dXJuIGZhbHNlOwoJfQoKCWVsc2UKCXsKCQlkb21TdHlsZSA9IG51bGw7CgkJcmV0dXJuOwoJfQp9CgoKCmZ1bmN0aW9uIGRyYWdJdChldnQpCnsKCWlmIChkb21TdHlsZSkKCXsKCQlpZiAoZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcikKCQl7IC8vZm9yIElFCgkJCWRvbVN0eWxlLmxlZnQgPSAoZXZlbnQuY2xpZW50WCAtIGNuTGVmdCArIGRvY3VtZW50LmJvZHkuc2Nyb2xsTGVmdCkgKyAncHgnOwoJCQlkb21TdHlsZS50b3AgPSAoZXZlbnQuY2xpZW50WSAtIGNuVG9wICsgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3ApICsgJ3B4JzsKCQl9CgkJZWxzZQoJCXsgIC8vRmlyZWZveAoJCQlkb21TdHlsZS5sZWZ0ID0gKGV2dC5jbGllbnRYIC0gY25MZWZ0ICsgZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0KSArICdweCc7CgkJCWRvbVN0eWxlLnRvcCA9IChldnQuY2xpZW50WSAtIGNuVG9wICsgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3ApICsgJ3B4JzsKCQl9Cgl9Cn0KCi8vIHBlcmZvcm1zIGEgc2luZ2xlIGluY3JlbWVudCBvciBkZWNyZW1lbnQKZnVuY3Rpb24gbmV4dFN0ZXAod2hhdFNwaW5uZXIsIGRpcmVjdGlvbikKewoJaWYgKHdoYXRTcGlubmVyID09PSAiSG91ciIpCgl7CgkJaWYgKGRpcmVjdGlvbiA9PT0gInBsdXMiKQoJCXsKCQkJQ2FsLlNldEhvdXIoQ2FsLkhvdXJzICsgMSk7CgkJCVJlbmRlckNzc0NhbCgpOwoJCX0KCQllbHNlIGlmIChkaXJlY3Rpb24gPT09ICJtaW51cyIpCgkJewoJCQlDYWwuU2V0SG91cihDYWwuSG91cnMgLSAxKTsKCQkJUmVuZGVyQ3NzQ2FsKCk7CgkJfQoJfQoJZWxzZSBpZiAod2hhdFNwaW5uZXIgPT09ICJNaW51dGUiKQoJewoJCWlmIChkaXJlY3Rpb24gPT09ICJwbHVzIikKCQl7CgkJCUNhbC5TZXRNaW51dGUocGFyc2VJbnQoQ2FsLk1pbnV0ZXMsIDEwKSArIDEpOwoJCQlSZW5kZXJDc3NDYWwoKTsKCQl9CgkJZWxzZSBpZiAoZGlyZWN0aW9uID09PSAibWludXMiKQoJCXsKCQkJQ2FsLlNldE1pbnV0ZShwYXJzZUludChDYWwuTWludXRlcywgMTApIC0gMSk7CgkJCVJlbmRlckNzc0NhbCgpOwoJCX0KCX0KCn0KCi8vIHN0YXJ0cyB0aGUgdGltZSBzcGlubmVyCmZ1bmN0aW9uIHN0YXJ0U3Bpbih3aGF0U3Bpbm5lciwgZGlyZWN0aW9uKQp7Cglkb2N1bWVudC50aGlzTG9vcCA9IHNldEludGVydmFsKGZ1bmN0aW9uICgpCgl7CgkJbmV4dFN0ZXAod2hhdFNwaW5uZXIsIGRpcmVjdGlvbik7Cgl9LCAxMjUpOyAvLzEyNSBtcwp9CgovL3N0b3BzIHRoZSB0aW1lIHNwaW5uZXIKZnVuY3Rpb24gc3RvcFNwaW4oKQp7CgljbGVhckludGVydmFsKGRvY3VtZW50LnRoaXNMb29wKTsKfQoKZnVuY3Rpb24gZHJvcEl0KCkKewoJc3RvcFNwaW4oKTsKCglpZiAoZG9tU3R5bGUpCgl7CgkJZG9tU3R5bGUgPSBudWxsOwoJfQp9CgovLyBEZWZhdWx0IGV2ZW50cyBjb25maWd1cmF0aW9uCgpkb2N1bWVudC5vbm1vdXNlZG93biA9IHBpY2tJdDsKZG9jdW1lbnQub25tb3VzZW1vdmUgPSBkcmFnSXQ7CmRvY3VtZW50Lm9ubW91c2V1cCA9IGRyb3BJdDs=]]></data>
	</file>
	<file>
	  <filename>/datetimepicker/demo_datetimepicker.htm</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KPGhlYWQ+CiAgICA8dGl0bGU+SmF2YXNjcmlwdCBEYXRlIFRpbWUgUGlja2VyIERlbW8gUGFnZTwvdGl0bGU+CiAgICA8c2NyaXB0IHNyYz0iZGF0ZXRpbWVwaWNrZXJfY3NzLmpzIj48L3NjcmlwdD4KPC9oZWFkPgo8Ym9keT4KCiAgICA8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlcjsgbWFyZ2luOjE1MHB4IGF1dG8gMTAwcHggYXV0bzsiPgogICAgICAgIDxsYWJlbCBmb3I9ImRlbW8xIj5QbGVhc2UgZW50ZXIgYSBkYXRlIGhlcmUgJmd0OyZndDsgPC9sYWJlbD4KICAgICAgICA8aW5wdXQgdHlwZT0iVGV4dCIgaWQ9ImRlbW8xIiBtYXhsZW5ndGg9IjI1IiBzaXplPSIyNSIvPgogICAgICAgIDxpbWcgc3JjPSJpbWFnZXMvY2FsLmdpZiIgb25jbGljaz0iamF2YXNjcmlwdDpOZXdDc3NDYWwoJ2RlbW8xJywnZGRtbXl5eXknKSIgc3R5bGU9ImN1cnNvcjpwb2ludGVyIi8+CiAgICA8L2Rpdj4KCjwvYm9keT4KPC9odG1sPgo=]]></data>
	</file>
	<file>
	  <filename>/datetimepicker/images/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/datetimepicker/images/cal.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhEAAQAKIAAKVNSkpNpUpNSqWmpdbT1v///////wAAACH5BAEAAAYALAAAAAAQABAAAANEaLrcNjDKKUa4OExYM95DVRTEWJLmKKLseVZELMdADcSrOwK7OqQsXkEIm8lsN0IOqCssW8Cicar8Qa/P5kvA7Xq/ggQAOw==]]></data>
	</file>
	<file>
	  <filename>/datetimepicker/images/cal_close.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhEAAOAPcAAAAAAEBAQICAgNTQyP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAAEAAOAAAITwAJCBxIsGAAAgMSKlyoUMBBhhATOkSYEACAhRYlPlSYcUDHARMZWvwIciPGiwtDniSpsiLKjy1JdmwZsaHJmhoJCNjJs2fPAECDCh0KNCAAOw==]]></data>
	</file>
	<file>
	  <filename>/datetimepicker/images/cal_fastforward.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhDQAJAIAAAAAAAP///yH5BAEAAGQALAAAAAANAAkAAAIVjI8JuBnQXjywVXXrvHJK6j2MQyYFADs=]]></data>
	</file>
	<file>
	  <filename>/datetimepicker/images/cal_fastreverse.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhDQAJAIAAAAAAAP///yH5BAEAAGQALAAAAAANAAkAAAIWjI95gJzgAnxTVgNnjrhmdV3NqJRBAQA7]]></data>
	</file>
	<file>
	  <filename>/datetimepicker/images/cal_forward.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhDQAJAIAAAAAAAP///yH5BAEAAGQALAAAAAANAAkAAAIQjI95oArc1ovmzWhpuBTqWAA7]]></data>
	</file>
	<file>
	  <filename>/datetimepicker/images/cal_minus.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODdhDQAJAIAAAAAAAP///ywAAAAADQAJAAACD4yPqRvgDxaM7LFDr948FAA7]]></data>
	</file>
	<file>
	  <filename>/datetimepicker/images/cal_plus.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODdhDQAJAIAAAAAAAP///ywAAAAADQAJAAACDoyPqcsNbYB0cqqKoWYFADs=]]></data>
	</file>
	<file>
	  <filename>/datetimepicker/images/cal_reverse.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhDQAJAIAAAAAAAP///yH5BAEAAGQALAAAAAANAAkAAAIQjI+ZoMttgIRBTmppfJrrVAA7]]></data>
	</file>
	<file>
	  <filename>/examples/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/examples/formvalidation.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyogCiAqIFRoZXNlIGV4YW1wbGVzIGFyZSBub3QgbWVhbnQgdG8gcnVuIG9uIHRoZWlyIG93biwgYnV0IHRoZXkgd2lsbCBob3BlZnVsbHkKICogZ2l2ZSB5b3Ugc29tZSBpZGVhIG9mIGhvdyB0byB1c2UgdGhlIE5lb01vZHVsZS1mdW5jdGlvbnMgdG8gd3JpdGUgY2xlYW4gY29kZS4KICogCiAqLwoKLyogTkVPX0lOSVQgKi8gZXZhbChORU9fSU5JVCk7IC8qIE5FT19JTklUICovCgokdmFsaWRhdGlvbj1hcnJheSgKICAvL1N0eWxlIHRoZSB2YWxpZGF0aW9uIHBvcHVwcyBhIGJpciBkaWZmZXJlbnRseSB0aGFuIHRoZSBkZWZhdWx0CiAgYXJyYXkoImV4dHJhY3NzIj0+IiNtc2djb250ZW50IHtjb2xvcjpyZWR9OyIpLAogIC8vbWFrZSB0aGUgbmFtZSBmaWVsZCByZXF1aXJlZAogIGFycmF5KCJuYW1lIj0+Im5hbWUiLCJ2YWxpZGF0aW9uIj0+Im5vbmVtcHR5IiwiWW91IG11c3QgcHJvdmlkZSBhIG5hbWUiKSwKICAvL21ha2UgdGhlIGVtYWlsIGZpZWxkIHZhbGlkYXRlIGZvciBwcm9wZXJseSBmb3JtYXR0ZWQgYWRkcmVzcwogIGFycmF5KCJuYW1lIj0+ImVtYWlsIiwidmFsaWRhdGlvbiI9PiJ2YWxpZGVtYWlsIiwiWW91IG11c3QgcHJvdmlkZSBhIHZhbGlkIGVtYWlsIiksCiAgLy9tYWtlIHRoZSBwaG9uZSBmaWVsZCBoYXZlIGF0IGxlYXN0IDggY2hhcmFjdGVycwogIGFycmF5KCJuYW1lIj0+InBob25lIiwidmFsaWRhdGlvbiI9PiJtaW5sZW5ndGgiLCJZb3UgbXVzdCBwcm92aWRlIGEgcGhvbmVudW1lciBvZiBhdCBsZWFzdCA4IGNoYXJzIiksCik7CiR0aGlzLT5TbWFydHlGb3JtU3RhcnQoImZvcm1zdGFydCIsCiAgYXJyYXkoCiAgICAiYWN0aW9uIj0+ImhhbmRsZWRhdGEiLAogICAgInZhbGlkYXRpb24iPT4kdmFsaWRhdGlvbgogICkKKTsKJHRoaXMtPlNtYXJ0eUZvcm1FbmQoImZvcm1lbmQiKTsKJHRoaXMtPlNtYXJ0eUlucHV0VGV4dCgibmFtZSIsYXJyYXkoInNpemUiPT4iNDAiKSk7CiR0aGlzLT5TbWFydHlJbnB1dFRleHQoImVtYWlsIixhcnJheSgic2l6ZSI9PiI0MCIpKTsKJHRoaXMtPlNtYXJ0eUlucHV0VGV4dCgicGhvbmUiLGFycmF5KCJzaXplIj0+IjE2IikpOwoKZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCJteXRlbXBsYXRlLnRwbCIpCgo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/formmessages/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/formmessages/messages.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gZm9ybSB2YWxpZGF0aW9uIGZ1bmN0aW9uIC8vCi8qZnVuY3Rpb24gdmFsaWRhdGUoZm9ybSkgewogIHZhciBuYW1lID0gZm9ybS5uYW1lLnZhbHVlOwogIHZhciBlbWFpbCA9IGZvcm0uZW1haWwudmFsdWU7CiAgdmFyIGdlbmRlciA9IGZvcm0uZ2VuZGVyLnZhbHVlOwogIHZhciBtZXNzYWdlID0gZm9ybS5tZXNzYWdlLnZhbHVlOwogIHZhciBuYW1lUmVnZXggPSAvXlthLXpBLVpdKygoW1wnXCxcLlwtIF1bYS16QS1aIF0pP1thLXpBLVpdKikqJC87CiAgdmFyIGVtYWlsUmVnZXggPSAvXltcdy1cLl0rQChbXHctXStcLikrW1x3LV17Miw0fSQvOwogIHZhciBtZXNzYWdlUmVnZXggPSBuZXcgUmVnRXhwKC88XC8/XHcrKChccytcdysoXHMqPVxzKig/OiIuKj8ifCcuKj8nfFteJyI+XHNdKykpPykrXHMqfFxzKilcLz8+L2dpbSk7CiAgaWYobmFtZSA9PSAiIikgewogICAgaW5saW5lTXNnKCduYW1lJywnWW91IG11c3QgZW50ZXIgeW91ciBuYW1lLicsMik7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIGlmKCFuYW1lLm1hdGNoKG5hbWVSZWdleCkpIHsKICAgIGlubGluZU1zZygnbmFtZScsJ1lvdSBoYXZlIGVudGVyZWQgYW4gaW52YWxpZCBuYW1lLicsMik7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIGlmKGVtYWlsID09ICIiKSB7CiAgICBpbmxpbmVNc2coJ2VtYWlsJywnPHN0cm9uZz5FcnJvcjwvc3Ryb25nPjxiciAvPllvdSBtdXN0IGVudGVyIHlvdXIgZW1haWwuJywyKTsKICAgIHJldHVybiBmYWxzZTsKICB9CiAgaWYoIWVtYWlsLm1hdGNoKGVtYWlsUmVnZXgpKSB7CiAgICBpbmxpbmVNc2coJ2VtYWlsJywnPHN0cm9uZz5FcnJvcjwvc3Ryb25nPjxiciAvPllvdSBoYXZlIGVudGVyZWQgYW4gaW52YWxpZCBlbWFpbC4nLDIpOwogICAgcmV0dXJuIGZhbHNlOwogIH0KICBpZihnZW5kZXIgPT0gIiIpIHsKICAgIGlubGluZU1zZygnZ2VuZGVyJywnPHN0cm9uZz5FcnJvcjwvc3Ryb25nPjxiciAvPllvdSBtdXN0IHNlbGVjdCB5b3VyIGdlbmRlci4nLDIpOwogICAgcmV0dXJuIGZhbHNlOwogIH0KICBpZihtZXNzYWdlID09ICIiKSB7CiAgICBpbmxpbmVNc2coJ21lc3NhZ2UnLCdZb3UgbXVzdCBlbnRlciBhIG1lc3NhZ2UuJyk7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIGlmKG1lc3NhZ2UubWF0Y2gobWVzc2FnZVJlZ2V4KSkgewogICAgaW5saW5lTXNnKCdtZXNzYWdlJywnWW91IGhhdmUgZW50ZXJlZCBhbiBpbnZhbGlkIG1lc3NhZ2UuJyk7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIHJldHVybiB0cnVlOwp9Ki8KCi8vIFNUQVJUIE9GIE1FU1NBR0UgU0NSSVBUIC8vCgp2YXIgTVNHVElNRVIgPSAyMDsKdmFyIE1TR1NQRUVEID0gNTsKdmFyIE1TR09GRlNFVCA9IDM7CnZhciBNU0dISURFID0gMzsKCi8vIGJ1aWxkIG91dCB0aGUgZGl2cywgc2V0IGF0dHJpYnV0ZXMgYW5kIGNhbGwgdGhlIGZhZGUgZnVuY3Rpb24gLy8KZnVuY3Rpb24gaW5saW5lTXNnKHRhcmdldCxzdHJpbmcsYXV0b2hpZGUpIHsKICB2YXIgbXNnOwogIHZhciBtc2djb250ZW50OwogIGlmKCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbXNnJykpIHsKICAgIG1zZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgbXNnLmlkID0gJ21zZyc7CiAgICBtc2djb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICBtc2djb250ZW50LmlkID0gJ21zZ2NvbnRlbnQnOwogICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChtc2cpOwogICAgbXNnLmFwcGVuZENoaWxkKG1zZ2NvbnRlbnQpOwogICAgbXNnLnN0eWxlLmZpbHRlciA9ICdhbHBoYShvcGFjaXR5PTApJzsKICAgIG1zZy5zdHlsZS5vcGFjaXR5ID0gMDsKICAgIG1zZy5hbHBoYSA9IDA7CiAgfSBlbHNlIHsKICAgIG1zZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtc2cnKTsKICAgIG1zZ2NvbnRlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbXNnY29udGVudCcpOwogIH0KICBtc2djb250ZW50LmlubmVySFRNTCA9IHN0cmluZzsKICBtc2cuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7CiAgdmFyIG1zZ2hlaWdodCA9IG1zZy5vZmZzZXRIZWlnaHQ7CiAgdmFyIHRhcmdldGRpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRhcmdldCk7CiAgdGFyZ2V0ZGl2LmZvY3VzKCk7CiAgdmFyIHRhcmdldGhlaWdodCA9IHRhcmdldGRpdi5vZmZzZXRIZWlnaHQ7CiAgdmFyIHRhcmdldHdpZHRoID0gdGFyZ2V0ZGl2Lm9mZnNldFdpZHRoOwogIHZhciB0b3Bwb3NpdGlvbiA9IHRvcFBvc2l0aW9uKHRhcmdldGRpdikgLSAoKG1zZ2hlaWdodCAtIHRhcmdldGhlaWdodCkgLyAyKTsKICB2YXIgbGVmdHBvc2l0aW9uID0gbGVmdFBvc2l0aW9uKHRhcmdldGRpdikgKyB0YXJnZXR3aWR0aCArIE1TR09GRlNFVDsKICBtc2cuc3R5bGUudG9wID0gdG9wcG9zaXRpb24gKyAncHgnOwogIG1zZy5zdHlsZS5sZWZ0ID0gbGVmdHBvc2l0aW9uICsgJ3B4JzsKICBjbGVhckludGVydmFsKG1zZy50aW1lcik7CiAgbXNnLnRpbWVyID0gc2V0SW50ZXJ2YWwoImZhZGVNc2coMSkiLCBNU0dUSU1FUik7CiAgaWYoIWF1dG9oaWRlKSB7CiAgICBhdXRvaGlkZSA9IE1TR0hJREU7ICAKICB9CiAgd2luZG93LnNldFRpbWVvdXQoImhpZGVNc2coKSIsIChhdXRvaGlkZSAqIDEwMDApKTsKfQoKLy8gaGlkZSB0aGUgZm9ybSBhbGVydCAvLwpmdW5jdGlvbiBoaWRlTXNnKG1zZykgewogIHZhciBtc2cgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbXNnJyk7CiAgaWYoIW1zZy50aW1lcikgewogICAgbXNnLnRpbWVyID0gc2V0SW50ZXJ2YWwoImZhZGVNc2coMCkiLCBNU0dUSU1FUik7CiAgfQp9CgovLyBmYWNlIHRoZSBtZXNzYWdlIGJveCAvLwpmdW5jdGlvbiBmYWRlTXNnKGZsYWcpIHsKICBpZihmbGFnID09IG51bGwpIHsKICAgIGZsYWcgPSAxOwogIH0KICB2YXIgbXNnID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21zZycpOwogIHZhciB2YWx1ZTsKICBpZihmbGFnID09IDEpIHsKICAgIHZhbHVlID0gbXNnLmFscGhhICsgTVNHU1BFRUQ7CiAgfSBlbHNlIHsKICAgIHZhbHVlID0gbXNnLmFscGhhIC0gTVNHU1BFRUQ7CiAgfQogIG1zZy5hbHBoYSA9IHZhbHVlOwogIG1zZy5zdHlsZS5vcGFjaXR5ID0gKHZhbHVlIC8gMTAwKTsKICBtc2cuc3R5bGUuZmlsdGVyID0gJ2FscGhhKG9wYWNpdHk9JyArIHZhbHVlICsgJyknOwogIGlmKHZhbHVlID49IDk5KSB7CiAgICBjbGVhckludGVydmFsKG1zZy50aW1lcik7CiAgICBtc2cudGltZXIgPSBudWxsOwogIH0gZWxzZSBpZih2YWx1ZSA8PSAxKSB7CiAgICBtc2cuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKICAgIGNsZWFySW50ZXJ2YWwobXNnLnRpbWVyKTsKICB9Cn0KCi8vIGNhbGN1bGF0ZSB0aGUgcG9zaXRpb24gb2YgdGhlIGVsZW1lbnQgaW4gcmVsYXRpb24gdG8gdGhlIGxlZnQgb2YgdGhlIGJyb3dzZXIgLy8KZnVuY3Rpb24gbGVmdFBvc2l0aW9uKHRhcmdldCkgewogIHZhciBsZWZ0ID0gMDsKICBpZih0YXJnZXQub2Zmc2V0UGFyZW50KSB7CiAgICB3aGlsZSgxKSB7CiAgICAgIGxlZnQgKz0gdGFyZ2V0Lm9mZnNldExlZnQ7CiAgICAgIGlmKCF0YXJnZXQub2Zmc2V0UGFyZW50KSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgdGFyZ2V0ID0gdGFyZ2V0Lm9mZnNldFBhcmVudDsKICAgIH0KICB9IGVsc2UgaWYodGFyZ2V0LngpIHsKICAgIGxlZnQgKz0gdGFyZ2V0Lng7CiAgfQogIHJldHVybiBsZWZ0Owp9CgovLyBjYWxjdWxhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBlbGVtZW50IGluIHJlbGF0aW9uIHRvIHRoZSB0b3Agb2YgdGhlIGJyb3dzZXIgd2luZG93IC8vCmZ1bmN0aW9uIHRvcFBvc2l0aW9uKHRhcmdldCkgewogIHZhciB0b3AgPSAwOwogIGlmKHRhcmdldC5vZmZzZXRQYXJlbnQpIHsKICAgIHdoaWxlKDEpIHsKICAgICAgdG9wICs9IHRhcmdldC5vZmZzZXRUb3A7CiAgICAgIGlmKCF0YXJnZXQub2Zmc2V0UGFyZW50KSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgdGFyZ2V0ID0gdGFyZ2V0Lm9mZnNldFBhcmVudDsKICAgIH0KICB9IGVsc2UgaWYodGFyZ2V0LnkpIHsKICAgIHRvcCArPSB0YXJnZXQueTsKICB9CiAgcmV0dXJuIHRvcDsKfQoKLy8gcHJlbG9hZCB0aGUgYXJyb3cgLy8KaWYoZG9jdW1lbnQuaW1hZ2VzKSB7CiAgYXJyb3cgPSBuZXcgSW1hZ2UoNyw4MCk7IAogIGFycm93LnNyYyA9ICJpbWFnZXMvbXNnX2Fycm93LmdpZiI7IAp9]]></data>
	</file>
	<file>
	  <filename>/formvalidation.inc.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKaWYgKCFmdW5jdGlvbl9leGlzdHMoImNtc21zIikpIGRpZSgpOwoKJGNvbmZpZyA9IGNtc21zKCktPkdldENvbmZpZygpOwppZiAoISRhbHJlYWR5dXNlZCkgewogICRvdXRwdXQuPSc8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSInIC4gJGNvbmZpZ1sicm9vdF91cmwiXSAuICcvbW9kdWxlcy9OZW9Nb2R1bGUvZm9ybW1lc3NhZ2VzL21lc3NhZ2VzLmpzIj48L3NjcmlwdD4KJzsKICAvL2luamVjdENTUygiI21zZyB7ZGlzcGxheTpub25lOyBwb3NpdGlvbjphYnNvbHV0ZTsgei1pbmRleDoyMDA7IGJhY2tncm91bmQ6dXJsKCcgLiAkY29uZmlnWyJyb290X3VybCJdIC4gJy9tb2R1bGVzL05lb01vZHVsZS9mb3JtbWVzc2FnZXMvbXNnX2Fycm93LmdpZikgbGVmdCBjZW50ZXIgbm8tcmVwZWF0OyBwYWRkaW5nLWxlZnQ6N3B4fSIpOwoKZm9yZWFjaCAoJGZpZWxkcyBhcyAkZmllbGQpIHsKICBpZiAoaXNzZXQoJGZpZWxkWyJleHRyYWNzcyJdKSkgewogICAgJHRoaXMtPl9leHRyYXZhbGlkYXRpb25jc3MuPSRmaWVsZFsiZXh0cmFjc3MiXTsKICB9Cn0KCiRvdXRwdXQuPScKPHNjcmlwdCB0eXBlPSJ0ZXh0L0phdmFTY3JpcHQiPgogIHZhciBpZ25vcmV2YWxpZGF0aW9uPWZhbHNlOwo8L3NjcmlwdD4KCjxzY3JpcHQgdHlwZT0idGV4dC9KYXZhU2NyaXB0Ij4KZnVuY3Rpb24gaW5qZWN0Q1NTKGNzc0NvZGUpIHsKICB2YXIgc3R5bGVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTsKICBzdHlsZUVsZW1lbnQudHlwZSA9ICJ0ZXh0L2NzcyI7CiAgaWYgKHN0eWxlRWxlbWVudC5zdHlsZVNoZWV0KSB7CiAgICBzdHlsZUVsZW1lbnQuc3R5bGVTaGVldC5jc3NUZXh0ID0gY3NzQ29kZTsKICB9IGVsc2UgewogICAgc3R5bGVFbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzc0NvZGUpKTsKICB9CiAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXS5hcHBlbmRDaGlsZChzdHlsZUVsZW1lbnQpOwp9Cjwvc2NyaXB0PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L0phdmFTY3JpcHQiPgogIGluamVjdENTUygiI21zZyB7ZGlzcGxheTpub25lOyBwb3NpdGlvbjphYnNvbHV0ZTsgei1pbmRleDoyMDA7IHBhZGRpbmctbGVmdDo3cHh9Iik7CiAgaW5qZWN0Q1NTKCIjbXNnY29udGVudCB7ZGlzcGxheTpibG9jazsgYmFja2dyb3VuZDojZjNlNmU2OyBib3JkZXI6MnB4IHNvbGlkICM5OTAwMDA7IHBhZGRpbmc6NXB4OyBtaW4td2lkdGg6MTUwcHg7IG1heC13aWR0aDoyNTBweH0iKTsKPC9zY3JpcHQ+Cic7CgppZiAoJHRoaXMtPl9leHRyYXZhbGlkYXRpb25jc3MhPSIiKSB7CiAkb3V0cHV0Lj0nCgo8c2NyaXB0IHR5cGU9InRleHQvSmF2YVNjcmlwdCI+CiAgaW5qZWN0Q1NTKCInLiR0aGlzLT5fZXh0cmF2YWxpZGF0aW9uY3NzLiciKTsKPC9zY3JpcHQ+CgonOwp9CgoKJG91dHB1dC49JzxzY3JpcHQgdHlwZT0idGV4dC9KYXZhU2NyaXB0Ij4KZnVuY3Rpb24gbmVvdHJpbShzdHIpIHsKICByZXR1cm4gc3RyLnJlcGxhY2UoL15ccyt8XHMrJC9nLCBcJ1wnKTsKfQo8L3NjcmlwdD4KJzsKICAkYWxyZWFkeXVzZWQgPSB0cnVlOwp9Cgokb3V0cHV0Lj0iPHNjcmlwdCB0eXBlPSd0ZXh0L0phdmFTY3JpcHQnPgoiOwokb3V0cHV0Lj0nCmZ1bmN0aW9uIE5lb1ZhbGlkYXRlRm9ybScgLiAkdmFsaWRhdGlvbmNvdW50IC4gJyh0aGlzZm9ybSkgewogIGlmIChpZ25vcmV2YWxpZGF0aW9uKSByZXR1cm4gdHJ1ZTsKICB2YXIgZW1haWxSZWdleCA9IC9eW1x3LVwuXStAKFtcdy1dK1wuKStbXHctXXsyLDR9JC87Cic7CiR2YWxpZGF0aW9uc3RyaW5nID0gInJldHVybiBmYWxzZTsiOwokcmV0dXJuc3RyaW5nID0gInJldHVybiB0cnVlOyI7CmlmICgkdGhpcy0+X2Z1bGx2YWxpZGF0aW9uKSB7CiAgJG91dHB1dC49JwogIHZhciB2YWxpZGF0ZWQgPSB0cnVlOwonOwogICR2YWxpZGF0aW9uc3RyaW5nID0gInZhbGlkYXRlZCA9IGZhbHNlOyI7CiAgJHJldHVybnN0cmluZyA9ICJyZXR1cm4gdmFsaWRhdGVkOyI7Cn0KJG91dHB1dC49JwogIHdpdGggKHRoaXNmb3JtKSB7Cic7CmZvcmVhY2ggKCRmaWVsZHMgYXMgJGZpZWxkKSB7CiAgaWYgKCFpc3NldCgkZmllbGRbIm5hbWUiXSkpIGNvbnRpbnVlOwogICRmaWVsZGlkID0gJHRoaXMtPl9pZCAuICRmaWVsZFsibmFtZSJdOwogIHN3aXRjaCAoJGZpZWxkWyJ2YWxpZGF0aW9uIl0pIHsKCiAgICBjYXNlICJub25lbXB0eSIgOiB7CiAgICAgICAgJG91dHB1dC49JwogICAgaWYgKG5lb3RyaW0oJyAuICRmaWVsZGlkIC4gJy52YWx1ZSk9PSIiKSB7CiAgICAgIGlubGluZU1zZygiJyAuICRmaWVsZGlkIC4gJyIsIicgLiAkZmllbGRbIm1lc3NhZ2UiXSAuICciLDEwKTsKICAgICAgJyAuICR2YWxpZGF0aW9uc3RyaW5nIC4gJwogICAgfSc7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIGNhc2UgInZhbGlkZW1haWwiIDogewogICAgICAgICRvdXRwdXQuPScKICAgIGlmICghJyAuICRmaWVsZGlkIC4gJy52YWx1ZS5tYXRjaChlbWFpbFJlZ2V4KSkgewogICAgICBpbmxpbmVNc2coIicgLiAkZmllbGRpZCAuICciLCInIC4gJGZpZWxkWyJtZXNzYWdlIl0gLiAnIiwxMCk7CiAgICAgICcgLiAkdmFsaWRhdGlvbnN0cmluZyAuICcKICAgIH0nOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICBjYXNlICJtaW5sZW5ndGgiIDogewogICAgICAgICRvdXRwdXQuPScKICAgIGlmIChuZW90cmltKCcgLiAkZmllbGRpZCAuICcudmFsdWUpLmxlbmd0aDwnIC4gJGZpZWxkWyJsZW5ndGgiXSAuICcpIHsKICAgICAgaW5saW5lTXNnKCInIC4gJGZpZWxkaWQgLiAnIiwiJyAuICRmaWVsZFsibWVzc2FnZSJdIC4gJyIsMTApOwogICAgICAnIC4gJHZhbGlkYXRpb25zdHJpbmcgLiAnCiAgICB9JzsKICAgICAgICBicmVhazsKICAgICAgfQogICAgY2FzZSAibWF4bGVuZ3RoIiA6IHsKICAgICAgICAkb3V0cHV0Lj0nCiAgICBpZiAobmVvdHJpbSgnIC4gJGZpZWxkaWQgLiAnLnZhbHVlKS5sZW5ndGg+JyAuICRmaWVsZFsibGVuZ3RoIl0gLiAnKSB7CiAgICAgIGlubGluZU1zZygiJyAuICRmaWVsZGlkIC4gJyIsIicgLiAkZmllbGRbIm1lc3NhZ2UiXSAuICciLDEwKTsKICAgICAgJyAuICR2YWxpZGF0aW9uc3RyaW5nIC4gJwogICAgfSc7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIGNhc2UgImV4YWN0bGVuZ3RoIiA6IHsKICAgICAgICAkb3V0cHV0Lj0nCiAgICBpZiAobmVvdHJpbSgnIC4gJGZpZWxkaWQgLiAnLnZhbHVlKS5sZW5ndGghPScgLiAkZmllbGRbImxlbmd0aCJdIC4gJykgewogICAgICBpbmxpbmVNc2coIicgLiAkZmllbGRpZCAuICciLCInIC4gJGZpZWxkWyJtZXNzYWdlIl0gLiAnIiwxMCk7CiAgICAgICcgLiAkdmFsaWRhdGlvbnN0cmluZyAuICcKICAgIH0nOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICBjYXNlICJjaGVja2VkIiA6IHsKICAgICAgICAkb3V0cHV0Lj0nCiAgICAgICAgCiAgICBpZiAoJyAuICRmaWVsZGlkIC4gJy5jaGVja2VkID09IGZhbHNlKSB7CiAgICAvL2FsZXJ0KCJoaSIpOwogICAgICBpbmxpbmVNc2coIicgLiAkZmllbGRpZCAuICciLCInIC4gJGZpZWxkWyJtZXNzYWdlIl0gLiAnIiwxMCk7CiAgICAgICcgLiAkdmFsaWRhdGlvbnN0cmluZyAuICcKICAgIH0nOwogICAgICAgIGJyZWFrOwogICAgICB9CgogICAgY2FzZSAidW5jaGVja2VkIiA6IHsKICAgICAgICAkb3V0cHV0Lj0nCiAgICBpZiAoJyAuICRmaWVsZGlkIC4gJy5jaGVja2VkID09IHRydWUpIHsKICAgICAgaW5saW5lTXNnKCInIC4gJGZpZWxkaWQgLiAnIiwiJyAuICRmaWVsZFsibWVzc2FnZSJdIC4gJyIsMTApOwogICAgICAnIC4gJHZhbGlkYXRpb25zdHJpbmcgLiAnCiAgICB9JzsKICAgICAgICBicmVhazsKICAgICAgfQoKCiAgICBjYXNlICJkcm9wZG93bl9ub25lbXB0eSIgOiB7CiAgICAgICRvdXRwdXQuPScKICAgIGlmICgnLiRmaWVsZGlkLicoJy4kZmllbGRpZC4nLnNlbGVjdGVkSW5kZXgpLnZhbHVlPT0iIikgewogICAgICBpbmxpbmVNc2coIicgLiAkZmllbGRpZCAuICciLCInIC4gJGZpZWxkWyJtZXNzYWdlIl0gLiAnIiwxMCk7CiAgICAgICcgLiAkdmFsaWRhdGlvbnN0cmluZyAuICcKICAgIH0nOwogICAgICBicmVhazsKICAgICAgfQogICAgY2FzZSAiZHJvcGRvd25fbm90Zmlyc3QiIDogewogICAgICAkb3V0cHV0Lj0nCiAgICBpZiAoJy4kZmllbGRpZC4nLnNlbGVjdGVkSW5kZXg9PTApIHsKICAgICAgaW5saW5lTXNnKCInIC4gJGZpZWxkaWQgLiAnIiwiJyAuICRmaWVsZFsibWVzc2FnZSJdIC4gJyIsMTApOwogICAgICAnIC4gJHZhbGlkYXRpb25zdHJpbmcgLiAnCiAgICB9JzsKICAgICAgYnJlYWs7CiAgICB9CgogICAgY2FzZSAicmFkaW9fbm9uZXNlbGVjdGVkIiA6IHsKICAgICAgJG91dHB1dC49JwogICAgdmFyIG9uZXNlbGVjdGVkID0gZmFsc2U7CiAgICBmb3IgKHZhciBpPTA7IGk8Jy4kZmllbGRpZC4nLmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmICgnLiRmaWVsZGlkLidbJy5pLiddLmNoZWNrZWQpIHsKICAgICAgICBvbmVzZWxlY3RlZCA9IHRydWU7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIGlmICghb25lc2VsZWN0ZWQpIHsKICAgICAgaW5saW5lTXNnKCInIC4gJGZpZWxkaWQgLiAnMSIsIicgLiAkZmllbGRbIm1lc3NhZ2UiXSAuICciLDEwKTsKICAgICAgJyAuICR2YWxpZGF0aW9uc3RyaW5nIC4gJwogICAgfSc7CiAgICAgIGJyZWFrOwogICAgfQoKICAgIGNhc2UgIm5vdGVxdWFsIiA6IHsKICAgICAgaWYgKGlzc2V0KCRmaWVsZFsidmFsdWUiXSkpIHsKICAgICAgICAkb3V0cHV0Lj0nCiAgICBpZiAobmVvdHJpbSgnIC4gJGZpZWxkaWQgLiAnLnZhbHVlKT09IicuIHRyaW0oJGZpZWxkWyJ2YWx1ZSJdKS4nIikgewogICAgICBpbmxpbmVNc2coIicgLiAkZmllbGRpZCAuICciLCInIC4gJGZpZWxkWyJtZXNzYWdlIl0gLiAnIiwxMCk7CiAgICAgICcgLiAkdmFsaWRhdGlvbnN0cmluZyAuICcKICAgIH0nOwogICAgICAgIGJyZWFrOwogICAgICB9CgogICAgICBpZiAoaXNzZXQoJGZpZWxkWyJ2YWx1ZXMiXSkpIHsKICAgICAgICBmb3JlYWNoKCRmaWVsZFsidmFsdWVzIl0gYXMgJHZhbHVlKSB7CiAgICAgICAgJG91dHB1dC49JwogICAgaWYgKG5lb3RyaW0oJyAuICRmaWVsZGlkIC4gJy52YWx1ZSk9PSInIC4gdHJpbSgkdmFsdWUpIC4gJyIpIHsKICAgICAgaW5saW5lTXNnKCInIC4gJGZpZWxkaWQgLiAnIiwiJyAuICRmaWVsZFsibWVzc2FnZSJdIC4gJyIsMTApOwogICAgICAnIC4gJHZhbGlkYXRpb25zdHJpbmcgLiAnCiAgICB9JzsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBjYXNlICJlcXVhbCIgOiB7CiAgICAgIGlmIChpc3NldCgkZmllbGRbInZhbHVlIl0pKSB7CiAgICAgICAgJG91dHB1dC49JwogICAgaWYgKG5lb3RyaW0oJyAuICRmaWVsZGlkIC4gJy52YWx1ZSkhPSInLiB0cmltKCRmaWVsZFsidmFsdWUiXSkuJyIpIHsKICAgICAgaW5saW5lTXNnKCInIC4gJGZpZWxkaWQgLiAnIiwiJyAuICRmaWVsZFsibWVzc2FnZSJdIC4gJyIsMTApOwogICAgICAnIC4gJHZhbGlkYXRpb25zdHJpbmcgLiAnCiAgICB9JzsKICAgICAgICBicmVhazsKICAgICAgfQoKICAgICAgaWYgKGlzc2V0KCRmaWVsZFsidmFsdWVzIl0pKSB7CiAgICAgICAgZm9yZWFjaCgkZmllbGRbInZhbHVlcyJdIGFzICR2YWx1ZSkgewogICAgICAgICRvdXRwdXQuPScKICAgIGlmIChuZW90cmltKCcgLiAkZmllbGRpZCAuICcudmFsdWUpIT0iJyAuIHRyaW0oJHZhbHVlKSAuICciKSB7CiAgICAgIGlubGluZU1zZygiJyAuICRmaWVsZGlkIC4gJyIsIicgLiAkZmllbGRbIm1lc3NhZ2UiXSAuICciLDEwKTsKICAgICAgJyAuICR2YWxpZGF0aW9uc3RyaW5nIC4gJwogICAgfSc7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgY2FzZSAiaWRlbnRpY2FsIiA6IHsKICAgICAgJGZpZWxkaWQyID0gJHRoaXMtPl9pZCAuICRmaWVsZFsibmFtZTIiXTsKICAgICAgICAkb3V0cHV0Lj0nCiAgICBpZiAobmVvdHJpbSgnIC4gJGZpZWxkaWQgLiAnLnZhbHVlKSE9bmVvdHJpbSgnIC4gJGZpZWxkaWQyIC4gJy52YWx1ZSkpIHsKICAgICAgaW5saW5lTXNnKCInIC4gJGZpZWxkaWQyIC4gJyIsIicgLiAkZmllbGRbIm1lc3NhZ2UiXSAuICciLDEwKTsKICAgICAgJyAuICR2YWxpZGF0aW9uc3RyaW5nIC4gJwogICAgfSc7CiAgICAgICAgYnJlYWs7CiAgICB9CgoKCgogIH0KfQokb3V0cHV0Lj0iCiAgfQogICIgLiAkcmV0dXJuc3RyaW5nIC4gIgp9Cjwvc2NyaXB0PlxuXG4iOwokZXh0cmEgPSAib25zdWJtaXQ9J3JldHVybiBOZW9WYWxpZGF0ZUZvcm0iIC4gJHZhbGlkYXRpb25jb3VudCAuICIodGhpcyk7JyI7CiRmdW5jdGlvbmNhbGwgPSAiTmVvVmFsaWRhdGVGb3JtIiAuICR2YWxpZGF0aW9uY291bnQgLiAiKHRoaXMpIjsKJHZhbGlkYXRpb25jb3VudCsrOwo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lang/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lang/en_US.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbIm1vbmRheSJdPSJNb25kYXkiOwokbGFuZ1sidHVlc2RheSJdPSJUdWVzZGF5IjsKJGxhbmdbIndlZG5lc2RheSJdPSJXZWRuZXNkYXkiOwokbGFuZ1sidGh1cnNkYXkiXT0iVGh1cnNkYXkiOwokbGFuZ1siZnJpZGF5Il09IkZyaWRheSI7CiRsYW5nWyJzYXR1cmRheSJdPSJTYXR1cmRheSI7CiRsYW5nWyJzdW5kYXkiXT0iU3VuZGF5IjsKCiRsYW5nWyJqYW51YXJ5Il09IkphbnVhcnkiOwokbGFuZ1siZmVicnVhcnkiXT0iRmVicnVhcnkiOwokbGFuZ1sibWFyY2giXT0iTWFyY2giOwokbGFuZ1siYXByaWwiXT0iQXByaWwiOwokbGFuZ1sibWF5Il09Ik1heSI7CiRsYW5nWyJqdW5lIl09Ikp1bmUiOwokbGFuZ1sianVseSJdPSJKdWx5IjsKJGxhbmdbImF1Z3VzdCJdPSJBdWd1c3QiOwokbGFuZ1sic2VwdGVtYmVyIl09IlNlcHRlbWJlciI7CiRsYW5nWyJvY3RvYmVyIl09Ik9jdG9iZXIiOwokbGFuZ1sibm92ZW1iZXIiXT0iTm92ZW1iZXIiOwokbGFuZ1siZGVjZW1iZXIiXT0iRGVjZW1iZXIiOwoKPz4K]]></data>
	</file>
	<file>
	  <filename>/lang/ext/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lang/ext/da_DK.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ21vbmRheSddID0gJ21hbmRhZyc7CiRsYW5nWyd0dWVzZGF5J10gPSAndGlyc2RhZyc7CiRsYW5nWyd3ZWRuZXNkYXknXSA9ICdvbnNkYWcnOwokbGFuZ1sndGh1cnNkYXknXSA9ICd0b3JzZGFnJzsKJGxhbmdbJ2ZyaWRheSddID0gJ2ZyZWRhZyc7CiRsYW5nWydzYXR1cmRheSddID0gJ2wmb3NsYXNoO3JkYWcnOwokbGFuZ1snc3VuZGF5J10gPSAncyZvc2xhc2g7bmRhZyc7CiRsYW5nWydqYW51YXJ5J10gPSAnamFudWFyJzsKJGxhbmdbJ2ZlYnJ1YXJ5J10gPSAnZmVicnVhcic7CiRsYW5nWydtYXJjaCddID0gJ21hcnRzJzsKJGxhbmdbJ2FwcmlsJ10gPSAnYXByaWwnOwokbGFuZ1snbWF5J10gPSAnbWFqJzsKJGxhbmdbJ2p1bmUnXSA9ICdqdW5pJzsKJGxhbmdbJ2p1bHknXSA9ICdqdWxpJzsKJGxhbmdbJ2F1Z3VzdCddID0gJ2F1Z3VzdCc7CiRsYW5nWydzZXB0ZW1iZXInXSA9ICdzZXB0ZW1iZXInOwokbGFuZ1snb2N0b2JlciddID0gJ29rdG9iZXInOwokbGFuZ1snbm92ZW1iZXInXSA9ICdub3ZlbWJlcic7CiRsYW5nWydkZWNlbWJlciddID0gJ2RlY2VtYmVyJzsKJGxhbmdbJ3FjYSddID0gJzEyMjk2MDE3OTAtODUyNDMxOTctNDMyNjA3MTMnOwokbGFuZ1sndXRtYSddID0gJzE1Njg2MTM1My4zODk2ODQzOTQuMTMwMTE0MjE0MC4xMzAxMTQyMTQwLjEzMDEyNTQ2OTcuMic7CiRsYW5nWyd1dG16J10gPSAnMTU2ODYxMzUzLjEzMDExNDIxNDAuMS4xLnV0bWNzcj0oZGlyZWN0KXx1dG1jY249KGRpcmVjdCl8dXRtY21kPShub25lKSc7CiRsYW5nWyd1dG1iJ10gPSAnMTU2ODYxMzUzJzsKJGxhbmdbJ3V0bWMnXSA9ICcxNTY4NjEzNTMnOwo/Pg==]]></data>
	</file>
	<file>
	  <filename>/lang/ext/nb_NO.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ21vbmRheSddID0gJ01hbmRhZyc7CiRsYW5nWyd1dG16J10gPSAnMTU2ODYxMzUzLjEzMDAyMjYzNjkuMzY5Mi44MS51dG1jc3I9ZGV2LmNtc21hZGVzaW1wbGUub3JnfHV0bWNjbj0ocmVmZXJyYWwpfHV0bWNtZD1yZWZlcnJhbHx1dG1jY3Q9L2ZlYXR1cmVfcmVxdWVzdC9saXN0LzYnOwokbGFuZ1sndXRtYSddID0gJzE1Njg2MTM1My4xNzkwNTI2MjMwODQxMTAxMDAuMTIxMDQyMzU3Ny4xMzAxMjUxMTQxLjEzMDEyNTQ5NTcuMzcxNic7CiRsYW5nWydxY2EnXSA9ICcxMjEwOTcxNjkwLTI3MzA4MDczLTgxOTUyODMyJzsKJGxhbmdbJ3V0bWInXSA9ICcxNTY4NjEzNTMuMi4xMC4xMzAxMjU0OTU3JzsKJGxhbmdbJ3V0bWMnXSA9ICcxNTY4NjEzNTMnOwo/Pg==]]></data>
	</file>
	<file>
	  <filename>/lang/ext/nl_NL.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ21vbmRheSddID0gJ01hYW5kYWcnOwokbGFuZ1sndHVlc2RheSddID0gJ0RpbnNkYWcnOwokbGFuZ1snd2VkbmVzZGF5J10gPSAnV29lbnNkYWcnOwokbGFuZ1sndGh1cnNkYXknXSA9ICdEb25kZXJkYWcnOwokbGFuZ1snZnJpZGF5J10gPSAnVnJpamRhZyc7CiRsYW5nWydzYXR1cmRheSddID0gJ1phdGVyZGFnJzsKJGxhbmdbJ3N1bmRheSddID0gJ1pvbmRhZyc7CiRsYW5nWydqYW51YXJ5J10gPSAnSmFudWFyaSc7CiRsYW5nWydmZWJydWFyeSddID0gJ0ZlYnJ1YXJpJzsKJGxhbmdbJ21hcmNoJ10gPSAnTWFhcnQnOwokbGFuZ1snYXByaWwnXSA9ICdBcHJpbCAnOwokbGFuZ1snbWF5J10gPSAnTWVpJzsKJGxhbmdbJ2p1bmUnXSA9ICdKdW5pJzsKJGxhbmdbJ2p1bHknXSA9ICdKdWxpJzsKJGxhbmdbJ2F1Z3VzdCddID0gJ0F1Z3VzdHVzJzsKJGxhbmdbJ3NlcHRlbWJlciddID0gJ1NlcHRlbWJlciAnOwokbGFuZ1snb2N0b2JlciddID0gJ09rdG9iZXInOwokbGFuZ1snbm92ZW1iZXInXSA9ICdOb3ZlbWJlciAnOwokbGFuZ1snZGVjZW1iZXInXSA9ICdEZWNlbWJlciAnOwokbGFuZ1sndXRtYSddID0gJzE1Njg2MTM1My4zMDk0ODI0MDUuMTI5NTk4NjM2OS4xMzAxMTUzNjk3LjEzMDE1NjQzNzAuMTAwJzsKJGxhbmdbJ3V0bXonXSA9ICcxNTY4NjEzNTMuMTMwMDczNzY0NC45NC4yNi51dG1jc3I9Zm9ydW0uY21zbWFkZXNpbXBsZS5vcmd8dXRtY2NuPShyZWZlcnJhbCl8dXRtY21kPXJlZmVycmFsfHV0bWNjdD0vdmlld3RvcGljLnBocCc7CiRsYW5nWydxY2EnXSA9ICdQMC0xMzQ2MTE5OTUzLTEyOTU5ODYzNjg5MDgnOwokbGFuZ1sndXRtYiddID0gJzE1Njg2MTM1Myc7CiRsYW5nWyd1dG1jJ10gPSAnMTU2ODYxMzUzJzsKPz4=]]></data>
	</file>
	<file>
	  <filename>/mimetypes.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKICAgIGZ1bmN0aW9uIHJldHVybk1JTUVUeXBlKCRmaWxlbmFtZSkKICAgIHsKICAgICAgICBwcmVnX21hdGNoKCJ8XC4oW2EtejAtOV17Miw0fSkkfGkiLCAkZmlsZW5hbWUsICRmaWxlU3VmZml4KTsKCiAgICAgICAgc3dpdGNoKHN0cnRvbG93ZXIoJGZpbGVTdWZmaXhbMV0pKQogICAgICAgIHsKICAgICAgICAgICAgY2FzZSAianMiIDoKICAgICAgICAgICAgICAgIHJldHVybiAiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0IjsKCiAgICAgICAgICAgIGNhc2UgImpzb24iIDoKICAgICAgICAgICAgICAgIHJldHVybiAiYXBwbGljYXRpb24vanNvbiI7CgogICAgICAgICAgICBjYXNlICJqcGciIDoKICAgICAgICAgICAgY2FzZSAianBlZyIgOgogICAgICAgICAgICBjYXNlICJqcGUiIDoKICAgICAgICAgICAgICAgIHJldHVybiAiaW1hZ2UvanBnIjsKCiAgICAgICAgICAgIGNhc2UgInBuZyIgOgogICAgICAgICAgICBjYXNlICJnaWYiIDoKICAgICAgICAgICAgY2FzZSAiYm1wIiA6CiAgICAgICAgICAgIGNhc2UgInRpZmYiIDoKICAgICAgICAgICAgICAgIHJldHVybiAiaW1hZ2UvIi5zdHJ0b2xvd2VyKCRmaWxlU3VmZml4WzFdKTsKCiAgICAgICAgICAgIGNhc2UgImNzcyIgOgogICAgICAgICAgICAgICAgcmV0dXJuICJ0ZXh0L2NzcyI7CgogICAgICAgICAgICBjYXNlICJ4bWwiIDoKICAgICAgICAgICAgICAgIHJldHVybiAiYXBwbGljYXRpb24veG1sIjsKCiAgICAgICAgICAgIGNhc2UgImRvYyIgOgogICAgICAgICAgICBjYXNlICJkb2N4IiA6CiAgICAgICAgICAgICAgICByZXR1cm4gImFwcGxpY2F0aW9uL21zd29yZCI7CgogICAgICAgICAgICBjYXNlICJ4bHMiIDoKICAgICAgICAgICAgY2FzZSAieGx0IiA6CiAgICAgICAgICAgIGNhc2UgInhsbSIgOgogICAgICAgICAgICBjYXNlICJ4bGQiIDoKICAgICAgICAgICAgY2FzZSAieGxhIiA6CiAgICAgICAgICAgIGNhc2UgInhsYyIgOgogICAgICAgICAgICBjYXNlICJ4bHciIDoKICAgICAgICAgICAgY2FzZSAieGxsIiA6CiAgICAgICAgICAgICAgICByZXR1cm4gImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbCI7CgogICAgICAgICAgICBjYXNlICJwcHQiIDoKICAgICAgICAgICAgY2FzZSAicHBzIiA6CiAgICAgICAgICAgICAgICByZXR1cm4gImFwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50IjsKCiAgICAgICAgICAgIGNhc2UgInJ0ZiIgOgogICAgICAgICAgICAgICAgcmV0dXJuICJhcHBsaWNhdGlvbi9ydGYiOwoKICAgICAgICAgICAgY2FzZSAicGRmIiA6CiAgICAgICAgICAgICAgICByZXR1cm4gImFwcGxpY2F0aW9uL3BkZiI7CgogICAgICAgICAgICBjYXNlICJodG1sIiA6CiAgICAgICAgICAgIGNhc2UgImh0bSIgOgogICAgICAgICAgICBjYXNlICJwaHAiIDoKICAgICAgICAgICAgICAgIHJldHVybiAidGV4dC9odG1sIjsKCiAgICAgICAgICAgIGNhc2UgInR4dCIgOgogICAgICAgICAgICAgICAgcmV0dXJuICJ0ZXh0L3BsYWluIjsKCiAgICAgICAgICAgIGNhc2UgIm1wZWciIDoKICAgICAgICAgICAgY2FzZSAibXBnIiA6CiAgICAgICAgICAgIGNhc2UgIm1wZSIgOgogICAgICAgICAgICAgICAgcmV0dXJuICJ2aWRlby9tcGVnIjsKCiAgICAgICAgICAgIGNhc2UgIm1wMyIgOgogICAgICAgICAgICAgICAgcmV0dXJuICJhdWRpby9tcGVnMyI7CgogICAgICAgICAgICBjYXNlICJ3YXYiIDoKICAgICAgICAgICAgICAgIHJldHVybiAiYXVkaW8vd2F2IjsKCiAgICAgICAgICAgIGNhc2UgImFpZmYiIDoKICAgICAgICAgICAgY2FzZSAiYWlmIiA6CiAgICAgICAgICAgICAgICByZXR1cm4gImF1ZGlvL2FpZmYiOwoKICAgICAgICAgICAgY2FzZSAiYXZpIiA6CiAgICAgICAgICAgICAgICByZXR1cm4gInZpZGVvL21zdmlkZW8iOwoKICAgICAgICAgICAgY2FzZSAid212IiA6CiAgICAgICAgICAgICAgICByZXR1cm4gInZpZGVvL3gtbXMtd212IjsKCiAgICAgICAgICAgIGNhc2UgIm1vdiIgOgogICAgICAgICAgICAgICAgcmV0dXJuICJ2aWRlby9xdWlja3RpbWUiOwoKICAgICAgICAgICAgY2FzZSAiemlwIiA6CiAgICAgICAgICAgICAgICByZXR1cm4gImFwcGxpY2F0aW9uL3ppcCI7CgogICAgICAgICAgICBjYXNlICJ0YXIiIDoKICAgICAgICAgICAgICAgIHJldHVybiAiYXBwbGljYXRpb24veC10YXIiOwoKICAgICAgICAgICAgY2FzZSAic3dmIiA6CiAgICAgICAgICAgICAgICByZXR1cm4gImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIjsKCiAgICAgICAgICAgIGRlZmF1bHQgOgogICAgICAgICAgICBpZihmdW5jdGlvbl9leGlzdHMoIm1pbWVfY29udGVudF90eXBlIikpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRmaWxlU3VmZml4ID0gbWltZV9jb250ZW50X3R5cGUoJGZpbGVuYW1lKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuICJ1bmtub3duLyIgLiB0cmltKCRmaWxlU3VmZml4WzBdLCAiLiIpOwogICAgICAgIH0KICAgIH0KPz4=]]></data>
	</file>
	<file>
	  <filename>/NeoModule.module.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIyBOZW9Nb2R1bGUuIEFuIGV4dGVuZGVkIG1vZHVsZWNsYXNzIGZvciBDTVMgLSBDTVMgTWFkZSBTaW1wbGUKIyBDb3B5cmlnaHQgKGMpIDIwMDktMTAgYnkgTW9ydGVuIFBvdWxzZW4gPG1vcnRlbkBwb3Vsc2VuLm9yZz4KIwojQ01TIC0gQ01TIE1hZGUgU2ltcGxlCiMoYykyMDA0LTA5IGJ5IFRlZCBLdWxwICh3aXNoeUB1c2Vycy5zZi5uZXQpCiNUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL2Ntc21hZGVzaW1wbGUuc2YubmV0CiMKI1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiNpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKIyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKI1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKI01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKI0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiNZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKI0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKIwoKCmlmICghZnVuY3Rpb25fZXhpc3RzKCJzdHJpcG9zIikpIHsKCWZ1bmN0aW9uIHN0cmlwb3MoJHN0ciwkbmVlZGxlKSB7CgkJcmV0dXJuIHN0cnBvcyhzdHJ0b2xvd2VyKCRzdHIpLHN0cnRvbG93ZXIoJG5lZWRsZSkpOwoJfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCJhcnJheV9kaWZmX2tleSIpKSB7CiAgZnVuY3Rpb24gYXJyYXlfZGlmZl9rZXkoKSB7CiAgICAkYXJycyA9IGZ1bmNfZ2V0X2FyZ3MoKTsKICAgICRyZXN1bHQgPSBhcnJheV9zaGlmdCgkYXJycyk7CiAgICBmb3JlYWNoICgkYXJycyBhcyAkYXJyYXkpIHsKICAgICAgZm9yZWFjaCAoJHJlc3VsdCBhcyAka2V5ID0+ICR2KSB7CiAgICAgICAgaWYgKGFycmF5X2tleV9leGlzdHMoJGtleSwgJGFycmF5KSkgewogICAgICAgICAgdW5zZXQoJHJlc3VsdFska2V5XSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gJHJlc3VsdDsKICB9Cn0KCmlmICghZnVuY3Rpb25fZXhpc3RzKCJpc19hc3NvYyIpKSB7CiAgZnVuY3Rpb24gaXNfYXNzb2MoJGFycmF5KSB7CiAgICByZXR1cm4gKGlzX2FycmF5KCRhcnJheSkgJiYgMCAhPT0gY291bnQoYXJyYXlfZGlmZl9rZXkoJGFycmF5LCBhcnJheV9rZXlzKGFycmF5X2tleXMoJGFycmF5KSkpKSk7CiAgfQp9CgpkZWZpbmUoIk5FT19JTklUIiwiCiAgaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2Ntc21zJykpIHtlY2hvICdtaXNzaW5nIGNtc21zKCknO2V4aXQ7fQogIFwkdGhpcy0+TmVvU2V0dXAoXCRpZCwgXCR0aGlzLCBcJHJldHVybmlkLCBcJHBhcmFtcyk7CiAgXCRnQ21zPWNtc21zKCk7CiIpOwoKY2xhc3MgTmVvTW9kdWxlIGV4dGVuZHMgQ01TTW9kdWxlIHsKICAvKgogICAqCiAgICogQSBjb3VwbGUgb2YgdmFyaWFibGVzIGFuZCBtZXRob2RzIGZvciBpbnRlcm5hbCBtb2R1bGUgdXNhZ2UKICAgKgogICAqLwogIHZhciAkX2RhdGFzdG9yYWdlPWZhbHNlOwogIHZhciAkX2RiPWZhbHNlOwogIHZhciAkX2lkPWZhbHNlOwogIHZhciAkX3JldHVybmlkPWZhbHNlOwogIHZhciAkX2Vycm9ycz0iIjsKICB2YXIgJF90aGVtZW9iamVjdD1mYWxzZTsKICB2YXIgJF9wYXJhbXM9YXJyYXkoKTsKICB2YXIgJF9mdWxsdmFsaWRhdGlvbj1mYWxzZTsKICB2YXIgJF9leHRyYXZhbGlkYXRpb25jc3M9IiI7CiAgCiAgZnVuY3Rpb24gX2dldGRzKCkgewogICAgaWYgKCR0aGlzLT5fZGF0YXN0b3JhZ2UhPT1mYWxzZSkgcmV0dXJuICR0aGlzLT5fZGF0YXN0b3JhZ2U7CiAgICAkdGhpcy0+X2RhdGFzdG9yYWdlPSR0aGlzLT5HZXRNb2R1bGVJbnN0YW5jZSgiTmVvRGF0YVN0b3JhZ2UiKTsKICAgIHJldHVybiAkdGhpcy0+X2RhdGFzdG9yYWdlOwogIH0KCiAgZnVuY3Rpb24gTmVvRGIoKSB7CiAgICBpZiAoJHRoaXMtPl9kYiE9PWZhbHNlKSByZXR1cm4gJHRoaXMtPl9kYjsKICAgICR0aGlzLT5fZGI9Y21zbXMoKS0+R2V0REIoKTsKICAgIHJldHVybiAkdGhpcy0+X2RiOwogIH0KICAKICBmdW5jdGlvbiBfZ2V0dGhlbWVvYmooKSB7CiAgICAkZ0Ntcz1jbXNtcygpOwogICAgaWYgKCR0aGlzLT5fdGhlbWVvYmplY3QhPT1mYWxzZSkgcmV0dXJuICR0aGlzLT5fdGhlbWVvYmplY3Q7CiAgICAkdGhpcy0+X3RoZW1lb2JqZWN0PSR0aGVtZU9iamVjdCA9ICRnQ21zLT52YXJpYWJsZXNbJ2FkbWludGhlbWUnXTsKICAgIHJldHVybiAkdGhpcy0+X3RoZW1lb2JqZWN0OwogIH0KCiAgLyoKICAgKgogICAqIFN0YW5kYXJkIG1vZHVsZS1BUEktbWV0aG9kcyBiZWhhdmluZyBpbiBhIHN0YW5kYXJkIHdheQogICAqCiAgICovCgoJZnVuY3Rpb24gR2V0TmFtZSgpIHsKCQlyZXR1cm4gJ05lb01vZHVsZSc7Cgl9CgogIGZ1bmN0aW9uIEdldFZlcnNpb24oKSB7CiAgICByZXR1cm4gIjAuNC4xIjsKICB9CgogIGZ1bmN0aW9uIEdldEZyaWVuZGx5TmFtZSgpIHsKCQlyZXR1cm4gIk5lbyBNb2R1bGUgYmFzZS1jbGFzcyI7Cgl9CgoJZnVuY3Rpb24gSXNQbHVnaW5Nb2R1bGUoKSB7CgkJcmV0dXJuIGZhbHNlOwoJfQoKCWZ1bmN0aW9uIE1pbmltdW1DTVNWZXJzaW9uKCkgewoJCXJldHVybiAnMS45JzsKCX0KCglmdW5jdGlvbiBHZXRBZG1pbkRlc2NyaXB0aW9uKCkgewoJCXJldHVybiAiQW4gZXh0ZW5kZWQgbW9kdWxlLWNsYXNzLCBtYWlubHkgZm9yIHRoZSBOZW8tc2VyaWVzIG1vZHVsZXMsIGJ1dCBhbHNvIGZvciBvdGhlcnMgdG8gdXNlIjsKCX0KCglmdW5jdGlvbiBIYXNBZG1pbigpIHsKCQlyZXR1cm4gZmFsc2U7Cgl9CgoJZnVuY3Rpb24gR2V0QXV0aG9yKCkgewoJCXJldHVybiAnTW9ydGVuIFBvdWxzZW4nOwoJfQoKCWZ1bmN0aW9uIEdldEF1dGhvckVtYWlsKCkJewoJCXJldHVybiAnbW9ydGVuQHBvdWxzZW4ub3JnJzsKCX0KCiAgZnVuY3Rpb24gR2V0SGVscCgkbGFuZz0nZW5fVVMnKSB7CiAgICByZXR1cm4gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZSgnaGVscC50cGwnKTsKIAl9CgogIGZ1bmN0aW9uIEdldENoYW5nZUxvZygpCXsKCQlyZXR1cm4gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZSgiY2hhbmdlbG9nLnRwbCIpOwoJfQoKICAvKgogICAqCiAgICogU2V0dXAgZnVuY3Rpb25zCiAgICoKICAgKi8KICBmdW5jdGlvbiBOZW9TZXRJZCgkaWQpIHsKICAgICR0aGlzLT5faWQ9JGlkOwogIH0KICBmdW5jdGlvbiBOZW9TZXRSZXR1cm5JZCgkcmV0dXJuaWQpIHsKICAgICR0aGlzLT5fcmV0dXJuaWQ9JHJldHVybmlkOwogIH0KICBmdW5jdGlvbiBOZW9TZXRQYXJhbXMoJHBhcmFtcz1hcnJheSgpKSB7CiAgICAkdGhpcy0+X3BhcmFtcz0kcGFyYW1zOwogIH0KICBmdW5jdGlvbiBOZW9TZXR1cCgkaWQsJG1vZHVsZSwkcmV0dXJuaWQ9IjAiLCRwYXJhbXM9YXJyYXkoKSkgewogICAgJHRoaXMtPk5lb1NldElkKCRpZCk7CiAgICAkdGhpcy0+TmVvU2V0UmV0dXJuSWQoJHJldHVybmlkKTsKICAgICR0aGlzLT5OZW9TZXRQYXJhbXMoJHBhcmFtcyk7CiAgICAkdGhpcy0+U21hcnR5QXNzaWduQ01TKCRtb2R1bGUpOwogICAgJHRoaXMtPlNtYXJ0eUFzc2lnbigibW9kdWxlX2lkIiwkaWQpOwogIH0KCgogIC8qCiAgICoKICAgKiBHZW5lcmFsIHNob3J0Y3V0IGZ1bmN0aW9ucwogICAqCiAgICovCiAgZnVuY3Rpb24gUHJlZigkcHJlZm5hbWUsJGRlZmF1bHQ9IiIpIHsKICAgIHJldHVybiAkdGhpcy0+R2V0UHJlZmVyZW5jZSgkcHJlZm5hbWUsJGRlZmF1bHQpOwogIH0KCiAgZnVuY3Rpb24gU2V0UHJlZigkcHJlZm5hbWUsICR2YWx1ZSkgewogICAgcmV0dXJuICR0aGlzLT5TZXRQcmVmZXJlbmNlKCRwcmVmbmFtZSwkdmFsdWUpOwogIH0KCiAgZnVuY3Rpb24gTmVvU2V0UHJlZigkcHJlZm5hbWUsICRub3RzZXR2YWx1ZT1mYWxzZSwgJGRlbGV0ZWlmbm90c2V0PWZhbHNlKSB7CiAgICAvL2lmIChlbXB0eSgkcGFyYW1zKSkgJHBhcmFtcz0kdGhpcy0+X3BhcmFtczsKICAgICRwYXJhbXM9JHRoaXMtPl9wYXJhbXM7CiAgICBpZiAoaXNzZXQoJHBhcmFtc1skcHJlZm5hbWVdKSkgeyAgICAgIAogICAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgkcHJlZm5hbWUsJHBhcmFtc1skcHJlZm5hbWVdKTsKICAgIH0gZWxzZSB7CiAgICAgIGlmICghJGRlbGV0ZWlmbm90c2V0KSB7CiAgICAgICAgaWYgKCRub3RzZXR2YWx1ZSE9PWZhbHNlKSB7CiAgICAgICAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgkcHJlZm5hbWUsICRub3RzZXR2YWx1ZSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgICR0aGlzLT5SZW1vdmVQcmVmZXJlbmNlKCRwcmVmbmFtZSk7CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIE5lb1NldFByZWZzKCRwcmVmcz1hcnJheSgpKSB7CiAgICBpZiAoaXNfYXNzb2MoJHByZWZzKSkgewogICAgICBmb3JlYWNoICgkcHJlZnMgYXMgJGtleSA9PiAkbm90c2V0dmFsdWUpIHsKICAgICAgICAkdGhpcy0+TmVvU2V0UHJlZigka2V5LCAkbm90c2V0dmFsdWUpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBmb3JlYWNoICgkcHJlZnMgYXMgJHByZWYpIHsKICAgICAgICAkdGhpcy0+TmVvU2V0UHJlZigkcHJlZik7CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIE5lb0Ntc0xpbmsoJHBhcmFtcz1hcnJheSgpKSB7CiAgICAvL0NyZWF0ZUxpbmsoJGlkLCAkYWN0aW9uLCAkcmV0dXJuaWQ9JycsICRjb250ZW50cz0nJywgJHBhcmFtcz1hcnJheSgpLCAkd2Fybl9tZXNzYWdlPScnLCAkb25seWhyZWY9ZmFsc2UsICRpbmxpbmU9ZmFsc2UsICRhZGR0dGV4dD0nJywgJHRhcmdldGNvbnRlbnRvbmx5PWZhbHNlLCAkcHJldHR5dXJsPScnKQogICAgLy9lY2hvICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJwcmV0dHl1cmwiLCRwYXJhbXMsIiIpOwogICAgcmV0dXJuICR0aGlzLT5DcmVhdGVMaW5rKAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiaWQiLCRwYXJhbXMsJHRoaXMtPl9pZCksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJhY3Rpb24iLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgicmV0dXJuaWQiLCRwYXJhbXMsJHRoaXMtPl9yZXR1cm5pZCksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKGFycmF5KCJjb250ZW50IiwidGV4dCIpLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgicGFyYW1zIiwkcGFyYW1zLGFycmF5KCkpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgid2Fybm1lc3NhZ2UiLCRwYXJhbXMsIiIpLAogICAgICBmYWxzZSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImlubGluZSIsJHBhcmFtcyxmYWxzZSksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJhZGR0ZXh0IiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInRhcmdldGNvbnRlbnRvbmx5IiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInByZXR0eXVybCIsJHBhcmFtcywiIikKICAgICk7CiAgfQoKICBmdW5jdGlvbiBOZW9DbXNVcmwoJHBhcmFtcz1hcnJheSgpKSB7CiAgICAvL0NyZWF0ZUxpbmsoJGlkLCAkYWN0aW9uLCAkcmV0dXJuaWQ9JycsICRjb250ZW50cz0nJywgJHBhcmFtcz1hcnJheSgpLCAkd2Fybl9tZXNzYWdlPScnLCAkb25seWhyZWY9ZmFsc2UsICRpbmxpbmU9ZmFsc2UsICRhZGR0dGV4dD0nJywgJHRhcmdldGNvbnRlbnRvbmx5PWZhbHNlLCAkcHJldHR5dXJsPScnKQogICAgcmV0dXJuICR0aGlzLT5DcmVhdGVMaW5rKAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiaWQiLCRwYXJhbXMsJHRoaXMtPl9pZCksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJhY3Rpb24iLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgicmV0dXJuaWQiLCRwYXJhbXMsJHRoaXMtPl9yZXR1cm5pZCksCiAgICAgICIiLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgicGFyYW1zIiwkcGFyYW1zLGFycmF5KCkpLAogICAgICAiIiwKICAgICAgdHJ1ZSAsCiAgICAgIGZhbHNlLAogICAgICAiIiwKICAgICAgZmFsc2UsCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJwcmV0dHl1cmwiLCRwYXJhbXMsIiIpCiAgICApOwogIH0KCiAgZnVuY3Rpb24gTmVvTGluaygkdGV4dCwkYWN0aW9uLCRwYXJhbXM9YXJyYXkoKSwgJHdhcm5pbmc9IiIpIHsKICAgIHJldHVybiAkdGhpcy0+TmVvQ21zTGluayhhcnJheSgidGV4dCI9PiR0ZXh0LCJhY3Rpb24iPT4kYWN0aW9uLCJwYXJhbXMiPT4kcGFyYW1zLCJ3YXJubWVzc2FnZSI9PiR3YXJuaW5nKSk7CiAgfQoKICBmdW5jdGlvbiBOZW9QcmV0dHlMaW5rKCR0ZXh0LCAkcHJldHR5dXJsKSB7CiAgICByZXR1cm4gJHRoaXMtPk5lb0Ntc0xpbmsoYXJyYXkoInRleHQiPT4kdGV4dCwicHJldHR5dXJsIj0+JHByZXR0eXVybCkpOwogIH0KCiAgZnVuY3Rpb24gTmVvVXJsKCRhY3Rpb24sJHBhcmFtcz1hcnJheSgpKSB7CiAgICByZXR1cm4gJHRoaXMtPk5lb0Ntc1VybChhcnJheSgiYWN0aW9uIj0+JGFjdGlvbiwicGFyYW1zIj0+JHBhcmFtcykpOwogIH0KCiAgZnVuY3Rpb24gTmVvUHJldHR5VXJsKCRwcmV0dHl1cmwpIHsKICAgIHJldHVybiAkdGhpcy0+TmVvQ21zVXJsKGFycmF5KCJwcmV0dHl1cmwiPT4kcHJldHR5dXJsKSk7CiAgfQoKICBmdW5jdGlvbiBOZW9SZWRpcmVjdCgkYWN0aW9uPSIiLCAkcGFyYW1zPWFycmF5KCkpIHsKICAgIGlmIChpc19hcnJheSgkYWN0aW9uKSkgJHRoaXMtPk5lb1JlZGlyZWN0RnVsbCgkYWN0aW9uKTsKICAgIHJldHVybiAkdGhpcy0+TmVvUmVkaXJlY3RGdWxsKAogICAgICBhcnJheSAoCiAgICAgICAgImFjdGlvbiIgPT4gJGFjdGlvbiwKICAgICAgICAicGFyYW1zIiA9PiAkcGFyYW1zCiAgICAgICkKICAgICk7CiAgfQoKICBmdW5jdGlvbiBOZW9SZWRpcmVjdEZ1bGwoJHBhcmFtcz1hcnJheSgpKSB7CiAgICAvL1JlZGlyZWN0KCRpZCwgJGFjdGlvbiwgJHJldHVybmlkPScnLCAkcGFyYW1zPWFycmF5KCksICRpbmxpbmU9ZmFsc2UpCiAgICByZXR1cm4gJHRoaXMtPlJlZGlyZWN0KAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiaWQiLCRwYXJhbXMsJHRoaXMtPl9pZCksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJhY3Rpb24iLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgicmV0dXJuaWQiLCRwYXJhbXMsJHRoaXMtPl9yZXR1cm5pZCksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJwYXJhbXMiLCRwYXJhbXMsYXJyYXkoKSksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJpbmxpbmUiLCRwYXJhbXMsZmFsc2UpCiAgICApOwogIH0KCiAgZnVuY3Rpb24gTmVvQWRtaW5SZXR1cm4oJHBhcmFtcz1hcnJheSgpKSB7CiAgICAvLyR0aGlzLT5SZWRpcmVjdCgkaWQsICdkZWZhdWx0YWRtaW4nLCAnJywgYXJyYXkoIm1vZHVsZV9tZXNzYWdlIj0+JHRoaXMtPkxhbmcoInNldHRpbmdzc2F2ZWQiKSwidGFiIj0+InNldHRpbmdzIikpOwogICAgJG1lc3NhZ2UgPSAkdGhpcy0+TlBWKCJtZXNzYWdlIiwgJHBhcmFtcyk7CiAgICAkZXJyb3IgPSAkdGhpcy0+TlBWKCJlcnJvciIsICRwYXJhbXMpOwogICAgJHRhYiA9ICR0aGlzLT5OUFYoInRhYiIsICRwYXJhbXMpOwoKICAgICR0aGlzLT5OZW9SZWRpcmVjdCgiZGVmYXVsdGFkbWluIiwKICAgICAgYXJyYXkoCiAgICAgICAgIm1vZHVsZV9tZXNzYWdlIiA9PiAkbWVzc2FnZSwKICAgICAgICAibW9kdWxlX2Vycm9ycyIgPT4gJGVycm9yLAogICAgICAgICJ0YWIiID0+ICR0YWIKICAgICAgKQogICAgKTsKICB9CgogIC8qCiAgICoKICAgKiBGb3JtLWdlbmVyYXRpb24gZnVuY3Rpb25zLCBpbmNsdWRpbmcgc21hcnR5IGFzc2lnbm1lbnRzCiAgICoKICAgKi8KICBmdW5jdGlvbiBOZW9TZXRGdWxsVmFsaWRhdGlvbigkZnVsbHZhbGlkYXRpb249dHJ1ZSkgewogICAgJHRoaXMtPl9mdWxsdmFsaWRhdGlvbj0kZnVsbHZhbGlkYXRpb247CiAgfQoKICBmdW5jdGlvbiBOZW9Gb3JtVmFsaWRhdGlvbigkZmllbGRzPWFycmF5KCkpIHsKICAgIGlmIChlbXB0eSgkZmllbGRzKSkgcmV0dXJuICIiOwogICAgc3RhdGljICRhbHJlYWR5dXNlZD1mYWxzZTsKICAgIHN0YXRpYyAkdmFsaWRhdGlvbmNvdW50PTA7CgogICAgJG91dHB1dD0iIjsKICAgIGluY2x1ZGUoZGlybmFtZShfX0ZJTEVfXykuIi9mb3JtdmFsaWRhdGlvbi5pbmMucGhwIik7CiAgICByZXR1cm4gYXJyYXkoImZ1bmN0aW9uIj0+JG91dHB1dCwiZXh0cmEiPT4kZXh0cmEsICJmdW5jdGlvbmNhbGwiPT4kZnVuY3Rpb25jYWxsKTsKICB9CgogIGZ1bmN0aW9uIE5lb0Zvcm1TdGFydCgkcGFyYW1zPWFycmF5KCkpIHsKICAgIC8vQ3JlYXRlRm9ybVN0YXJ0KCRpZCwgJGFjdGlvbj0nZGVmYXVsdCcsICRyZXR1cm5pZD0nJywgJG1ldGhvZD0ncG9zdCcsICRlbmN0eXBlPScnLCAkaW5saW5lPWZhbHNlLCAkaWRzdWZmaXg9JycsICRwYXJhbXMgPSBhcnJheSgpLCAkZXh0cmE9JycpCiAgICAkdmFsaWRhdGlvbj0iIjsKICAgICRleHRyYT0iIjsKICAgIGlmIChpc3NldCgkcGFyYW1zWyJ2YWxpZGF0aW9uIl0pKSB7CiAgICAgIC8vZWNobyAiaGkiOwogICAgICAkdmFsaWRhdGlvbj0kdGhpcy0+TmVvRm9ybVZhbGlkYXRpb24oJHBhcmFtc1sidmFsaWRhdGlvbiJdKTsKICAgICAgaWYgKGlzc2V0KCRwYXJhbXNbImV4dHJhdGVtcGxhdGUiXSkpIHsKICAgICAgICAkZXh0cmE9JHBhcmFtc1siZXh0cmF0ZW1wbGF0ZSJdOwogICAgICAgICRleHRyYT1zdHJfcmVwbGFjZSgiJXZhbGlkYXRpb25jYWxsJSIsJHZhbGlkYXRpb25bImZ1bmN0aW9uY2FsbCJdLCRleHRyYSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgJGV4dHJhPSR2YWxpZGF0aW9uWyJleHRyYSJdOwogICAgICB9CiAgICAgICR2YWxpZGF0aW9uPSR2YWxpZGF0aW9uWyJmdW5jdGlvbiJdOwogICAgfQogICAgcmV0dXJuICR2YWxpZGF0aW9uLiR0aGlzLT5DcmVhdGVGb3JtU3RhcnQoCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJpZCIsJHBhcmFtcywkdGhpcy0+X2lkKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImFjdGlvbiIsJHBhcmFtcywiZGVmYXVsdCIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgicmV0dXJuaWQiLCRwYXJhbXMsJHRoaXMtPl9yZXR1cm5pZCksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJtZXRob2QiLCRwYXJhbXMsInBvc3QiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoYXJyYXkoImVuY3R5cGUiLCJlbmNvZGluZyIpLCRwYXJhbXMsIm11bHRpcGFydC9mb3JtLWRhdGEiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImlubGluZSIsJHBhcmFtcyxmYWxzZSksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJpZHN1ZmZpeCIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJwYXJhbXMiLCRwYXJhbXMsYXJyYXkoKSksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJleHRyYSIsJHBhcmFtcywkZXh0cmEpCiAgICApOwogIH0KICBmdW5jdGlvbiBTbWFydHlGb3JtU3RhcnQoJHNtYXJ0eW5hbWUsJHBhcmFtcz1hcnJheSgpKSB7CiAgICAkdGhpcy0+U21hcnR5QXNzaWduKCRzbWFydHluYW1lLCR0aGlzLT5OZW9Gb3JtU3RhcnQoJHBhcmFtcykpOwogIH0KCiAgLy9PYnNvbGV0ZQogIGZ1bmN0aW9uIFNtYXJ0eVVwbG9hZEZvcm1TdGFydCgkc21hcnR5bmFtZSwkcGFyYW1zPWFycmF5KCkpIHsgICAgCiAgICAkdGhpcy0+U21hcnR5Rm9ybVN0YXJ0KCRzbWFydHluYW1lLCRwYXJhbXMpOwogIH0KCiAgZnVuY3Rpb24gTmVvRm9ybUVuZCgpIHsKICAgIHJldHVybiAkdGhpcy0+Q3JlYXRlRm9ybUVuZCgpOwogIH0KCiAgZnVuY3Rpb24gU21hcnR5Rm9ybUVuZCgkc21hcnR5bmFtZSkgewogICAgJHRoaXMtPlNtYXJ0eUFzc2lnbigkc21hcnR5bmFtZSwkdGhpcy0+TmVvRm9ybUVuZCgpKTsKICB9CgogIC8qZnVuY3Rpb24gU21hcnR5SW5wdXRTdWJtaXQoJHNtYXJ0eW5hbWUsJG5hbWUsJHRleHQsJGNvbmZpcm10ZXh0PSIiKSB7CiAgICAkdGhpcy0+U21hcnR5QXNzaWduKCRzbWFydHluYW1lLCR0aGlzLT5OZW9JbnB1dFN1Ym1pdChhcnJheSgibmFtZSI9PiRuYW1lLCJ2YWx1ZSI9PiR0ZXh0LCJjb25maXJtdGV4dCI9PiRjb25maXJtdGV4dCkpKTsKICB9Ki8KCiAgCiAgCiAgZnVuY3Rpb24gU21hcnR5SW5wdXRIaWRkZW5NdWx0aSgkc21hcnR5bmFtZSwkZmllbGRzPWFycmF5KCkpIHsKICAgICRvdXRwdXQ9IlxuIjsKICAgIGZvcmVhY2goJGZpZWxkcyBhcyAkbmFtZT0+JHZhbHVlKSB7CiAgICAgICRvdXRwdXQuPSR0aGlzLT5OZW9JbnB1dEhpZGRlbihhcnJheSgibmFtZSI9PiRuYW1lLCJ2YWx1ZSI9PiR2YWx1ZSkpLiJcbiI7CiAgICB9CiAgICAkb3V0cHV0Lj0iXG4iOwogICAgJHRoaXMtPlNtYXJ0eUFzc2lnbigkc21hcnR5bmFtZSwkb3V0cHV0KTsKICB9CgogIGZ1bmN0aW9uIFNtYXJ0eUxpbmsoJHNtYXJ0eW5hbWUsJGZpZWxkcz1hcnJheSgpKSB7CiAgICAkdGhpcy0+U21hcnR5QXNzaWduKCRzbWFydHluYW1lLCR0aGlzLT5OZW9DbXNMaW5rKCRmaWVsZHMpKTsKICB9CgogIGZ1bmN0aW9uIE5lb0lucHV0RmlsZSgkcGFyYW1zKSB7CiAgIHJldHVybiAkdGhpcy0+Q3JlYXRlSW5wdXRGaWxlKAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiaWQiLCRwYXJhbXMsJHRoaXMtPl9pZCksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJuYW1lIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImFjY2VwdCIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJzaXplIiwkcGFyYW1zLCIxMCIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiYWRkdGV4dCIsJHBhcmFtcywiIikKICAgICk7CiAgfQoKICBmdW5jdGlvbiBTbWFydHlJbnB1dEZpbGUoJHNtYXJ0eW5hbWUsICRwYXJhbXMpIHsKICAgICR0aGlzLT5TbWFydHlBc3NpZ24oJHNtYXJ0eW5hbWUsJHRoaXMtPk5lb0lucHV0RmlsZSgkcGFyYW1zKSk7CiAgfQoKICBmdW5jdGlvbiBOZW9JbnB1dFRleHQoJHBhcmFtcz1hcnJheSgpKSB7CiAgICByZXR1cm4gJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCgKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImlkIiwkcGFyYW1zLCR0aGlzLT5faWQpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgibmFtZSIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJ2YWx1ZSIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJzaXplIiwkcGFyYW1zLCIxMCIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgibWF4bGVuZ3RoIiwkcGFyYW1zLCIyNTUiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImFkZHRleHQiLCRwYXJhbXMsIiIpCiAgICApOwogIH0KCiAgZnVuY3Rpb24gRGF0ZTJVbml4KCR0aW1lLCAkZm9ybWF0PSJkZG1teXl5eSIpIHsKCQkkZHRwYXJ0cz1leHBsb2RlKCIvIiwkdGltZSk7CiAgICAkZGF5PSIiOyRtb250aD0iIjskeWVhcj0iIjsKICAgIHN3aXRjaCgkZm9ybWF0KSB7CiAgICAgIGNhc2UgIm1tZGR5eXl5IiA6ICRkYXk9JGR0cGFydHNbMV07ICRtb250aD0kZHRwYXJ0c1swXTsgJHllYXI9JGR0cGFydHNbMl07IGJyZWFrOwogICAgICBjYXNlICJ5eW1tZGQiIDogJGRheT0kZHRwYXJ0c1syXTsgJG1vbnRoPSRkdHBhcnRzWzFdOyAkeWVhcj0kZHRwYXJ0c1swXTsgYnJlYWs7CiAgICAgIGNhc2UgInl5eW1tZGQiIDogJGRheT0kZHRwYXJ0c1syXTsgJG1vbnRoPSRkdHBhcnRzWzFdOyAkeWVhcj0kZHRwYXJ0c1swXTsgYnJlYWs7CgogICAgICBjYXNlICJkZG1teXl5eSIgOiAKICAgICAgZGVmYXVsdCA6ICRkYXk9JGR0cGFydHNbMF07ICRtb250aD0kZHRwYXJ0c1sxXTskeWVhcj0kZHRwYXJ0c1syXTsKICAgIH0KCgkJcmV0dXJuIG1rdGltZSgwLDAsMCwkbW9udGgsJGRheSwkeWVhcik7Cgl9CgoKICAvKgogICAqIAljYXNlICJERE1NWVlZWSI6CgkJcmV0dXJuIChwRGF0ZSArIERhdGVTZXBhcmF0b3IgKyBNb250aERpZ2l0ICsgRGF0ZVNlcGFyYXRvciArIHRoaXMuWWVhcik7CgkJY2FzZSAiRERNTU1ZWVlZIjoKCQlyZXR1cm4gKHBEYXRlICsgRGF0ZVNlcGFyYXRvciArIHRoaXMuR2V0TW9udGhOYW1lKGZhbHNlKSArIERhdGVTZXBhcmF0b3IgKyB0aGlzLlllYXIpOwoJCWNhc2UgIk1NRERZWVlZIjoKCQlyZXR1cm4gKE1vbnRoRGlnaXQgKyBEYXRlU2VwYXJhdG9yICsgcERhdGUgKyBEYXRlU2VwYXJhdG9yICsgdGhpcy5ZZWFyKTsKCQljYXNlICJNTU1ERFlZWVkiOgoJCXJldHVybiAodGhpcy5HZXRNb250aE5hbWUoZmFsc2UpICsgRGF0ZVNlcGFyYXRvciArIHBEYXRlICsgRGF0ZVNlcGFyYXRvciArIHRoaXMuWWVhcik7CgkJY2FzZSAiWVlZWU1NREQiOgoJCXJldHVybiAodGhpcy5ZZWFyICsgRGF0ZVNlcGFyYXRvciArIE1vbnRoRGlnaXQgKyBEYXRlU2VwYXJhdG9yICsgcERhdGUpOwoJCWNhc2UgIllZTU1ERCI6CgkJcmV0dXJuIChTdHJpbmcodGhpcy5ZZWFyKS5zdWJzdHJpbmcoMiwgNCkgKyBEYXRlU2VwYXJhdG9yICsgTW9udGhEaWdpdCArIERhdGVTZXBhcmF0b3IgKyBwRGF0ZSk7CgkJY2FzZSAiWVlNTU1ERCI6CgkJcmV0dXJuIChTdHJpbmcodGhpcy5ZZWFyKS5zdWJzdHJpbmcoMiwgNCkgKyBEYXRlU2VwYXJhdG9yICsgdGhpcy5HZXRNb250aE5hbWUoZmFsc2UpICsgRGF0ZVNlcGFyYXRvciArIHBEYXRlKTsKCQljYXNlICJZWVlZTU1NREQiOgoJCXJldHVybiAodGhpcy5ZZWFyICsgRGF0ZVNlcGFyYXRvciArIHRoaXMuR2V0TW9udGhOYW1lKGZhbHNlKSArIERhdGVTZXBhcmF0b3IgKyBwRGF0ZSkKICAgKi8KICBmdW5jdGlvbiBOZW9JbnB1dERhdGV0aW1lKCRwYXJhbXM9YXJyYXkoKSkgewogICAgJHJlc3VsdD0iIjsKICAgIHN0YXRpYyAkanNzZW50ID0gZmFsc2U7CiAgICAkY29uZmlnPWNtc21zKCktPkdldENvbmZpZygpOwogICAgaWYgKCEkanNzZW50KSB7CiAgICAgICRuZW9tPSR0aGlzLT5HZXRNb2R1bGVJbnN0YW5jZSgiTmVvTW9kdWxlIik7CiAgICAgICRyZXN1bHQuPSIKCiAgICAgIDxzY3JpcHQgc3JjPSciLiRuZW9tLT5OZW9DbXNVcmwoYXJyYXkoImFjdGlvbiI9PiJkYXRldGltZXBpY2tlciIpKS4iJnNob3d0ZW1wbGF0ZT1mYWxzZSc+PC9zY3JpcHQ+CgogICAgICAiOwogICAgICAkanNzZW50PXRydWU7CiAgICB9CiAgICBpZiAoaXNzZXQoJHBhcmFtc1sicmVhZG9ubHkiXSkgJiYgJHBhcmFtc1sicmVhZG9ubHkiXT09dHJ1ZSkgewogICAgICAkcGFyYW1zWyJhZGR0ZXh0Il0uPSIgcmVhZG9ubHkiOwogICAgfQogICAgJGZvcm1hdD0kdGhpcy0+TlBWKCJmb3JtYXQiLCRwYXJhbXMsImRkbW15eXl5Iik7CiAgICBpZiAoaXNzZXQoJHBhcmFtc1sidW5peHZhbHVlIl0pICYmICRwYXJhbXNbInVuaXh2YWx1ZSJdIT0iIikgewogICAgICBzd2l0Y2ggKCRmb3JtYXQpIHsKICAgICAgICBjYXNlICJkZG1teXl5eSIgOiAkcGFyYW1zWyJ2YWx1ZSJdPWRhdGUoImovbi9ZIiwgJHBhcmFtc1sidW5peHZhbHVlIl0pOyBicmVhazsKICAgICAgICBjYXNlICJtbWRkeXl5eSIgOiAkcGFyYW1zWyJ2YWx1ZSJdPWRhdGUoIm4vai9ZIiwgJHBhcmFtc1sidW5peHZhbHVlIl0pOyBicmVhazsKICAgICAgICBjYXNlICJ5eW1tZGQiIDogJHBhcmFtc1sidmFsdWUiXT1kYXRlKCJ5L24vaiIsICRwYXJhbXNbInVuaXh2YWx1ZSJdKTsgYnJlYWs7CiAgICAgICAgY2FzZSAieXl5eW1tZGQiIDogJHBhcmFtc1sidmFsdWUiXT1kYXRlKCJZL24vaiIsICRwYXJhbXNbInVuaXh2YWx1ZSJdKTsgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgICRyZXN1bHQuPSR0aGlzLT5OZW9JbnB1dFRleHQoJHBhcmFtcyk7CgogICAgJHJlc3VsdC49IjxpbWcgc3JjPSciLiRjb25maWdbInJvb3RfdXJsIl0uIi9tb2R1bGVzL05lb01vZHVsZS9kYXRldGltZXBpY2tlci9pbWFnZXMvY2FsLmdpZicgb25jbGljaz1cImphdmFzY3JpcHQ6TmV3Q3NzQ2FsKCciLiR0aGlzLT5faWQuJHBhcmFtc1sibmFtZSJdLiInLCciLiRmb3JtYXQuIicpXCIgLz4iOwogICAgLy9vbmNsaWNrPSJqYXZhc2NyaXB0Ok5ld0Nzc0NhbCgnZGVtbzEnLCdkZG1teXl5eScpCiAgICByZXR1cm4gJHJlc3VsdDsKICB9CgogIGZ1bmN0aW9uIFNtYXJ0eUlucHV0VGV4dCgkc21hcnR5bmFtZSwgJHBhcmFtcz1hcnJheSgpKSB7CiAgICAkdGhpcy0+U21hcnR5QXNzaWduKCRzbWFydHluYW1lLCAkdGhpcy0+TmVvSW5wdXRUZXh0KCRwYXJhbXMpKTsKICB9CgogIGZ1bmN0aW9uIFNtYXJ0eUlucHV0RGF0ZXRpbWUoJHNtYXJ0eW5hbWUsICRwYXJhbXM9YXJyYXkoKSkgewogICAgJHRoaXMtPlNtYXJ0eUFzc2lnbigkc21hcnR5bmFtZSwgJHRoaXMtPk5lb0lucHV0RGF0ZXRpbWUoJHBhcmFtcykpOwogIH0KCiAgZnVuY3Rpb24gTmVvSW5wdXRQYXNzd29yZCgkcGFyYW1zPWFycmF5KCkpIHsKICAgIHJldHVybiAkdGhpcy0+Q3JlYXRlSW5wdXRQYXNzd29yZCgKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImlkIiwkcGFyYW1zLCR0aGlzLT5faWQpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgibmFtZSIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJ2YWx1ZSIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJzaXplIiwkcGFyYW1zLCIxMCIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgibWF4bGVuZ3RoIiwkcGFyYW1zLCIyNTUiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImFkZHRleHQiLCRwYXJhbXMsIiIpCiAgICApOwogIH0KICBmdW5jdGlvbiBTbWFydHlJbnB1dFBhc3N3b3JkKCRzbWFydHluYW1lLCAkcGFyYW1zPWFycmF5KCkpIHsKICAgICR0aGlzLT5TbWFydHlBc3NpZ24oJHNtYXJ0eW5hbWUsICR0aGlzLT5OZW9JbnB1dFBhc3N3b3JkKCRwYXJhbXMpKTsKICB9CgogIGZ1bmN0aW9uIE5lb1RleHRhcmVhKCRwYXJhbXM9YXJyYXkoKSkgewogICAgcmV0dXJuICR0aGlzLT5DcmVhdGVUZXh0QXJlYSgKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImVuYWJsZXd5c2l3eWciLCRwYXJhbXMsZmFsc2UpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiaWQiLCRwYXJhbXMsJHRoaXMtPl9pZCksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKGFycmF5KCJ2YWx1ZSIsInRleHQiLCJjb250ZW50IiksJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJuYW1lIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoYXJyYXkoImNsYXNzIiwiY2xhc3NuYW1lIiksJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJodG1saWQiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiZW5jb2RpbmciLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgic3R5bGVzaGVldCIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJjb2xzIiwkcGFyYW1zLCI4MCIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgicm93cyIsJHBhcmFtcywiMTUiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImZvcmNld3lzaXd5ZyIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJ3YW50ZWRzeW50YXgiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiYWRkdGV4dCIsJHBhcmFtcywiIikKICAgICk7CiAgfQoKICBmdW5jdGlvbiBTbWFydHlJbnB1dFRleHRhcmVhKCRzbWFydHluYW1lLCAkcGFyYW1zPWFycmF5KCkpIHsKICAgICR0aGlzLT5TbWFydHlBc3NpZ24oJHNtYXJ0eW5hbWUsICR0aGlzLT5OZW9UZXh0YXJlYSgkcGFyYW1zKSk7CiAgfQoKICBmdW5jdGlvbiBOZW9JbnB1dENoZWNrYm94KCRwYXJhbXM9YXJyYXkoKSkgewogICAgaWYgKGlzc2V0KCRwYXJhbXNbImNoZWNrZWQiXSkgJiYgJHBhcmFtc1siY2hlY2tlZCJdPT10cnVlKSB7CiAgICAgICRwYXJhbXNbInNlbGVjdGVkdmFsdWUiXT0kcGFyYW1zWyJ2YWx1ZSJdOwogICAgfQogICAgcmV0dXJuICR0aGlzLT5DcmVhdGVJbnB1dENoZWNrYm94KAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiaWQiLCRwYXJhbXMsJHRoaXMtPl9pZCksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJuYW1lIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInZhbHVlIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInNlbGVjdGVkdmFsdWUiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiYWRkdGV4dCIsJHBhcmFtcywiIikKICAgICk7CiAgfQoKICBmdW5jdGlvbiBTbWFydHlJbnB1dENoZWNrYm94KCRzbWFydHluYW1lLCAkcGFyYW1zPWFycmF5KCkpIHsKICAgICR0aGlzLT5TbWFydHlBc3NpZ24oJHNtYXJ0eW5hbWUsICR0aGlzLT5OZW9JbnB1dENoZWNrYm94KCRwYXJhbXMpKTsKICB9CgogIGZ1bmN0aW9uIE5lb0lucHV0U3VibWl0KCRwYXJhbXM9YXJyYXkoKSkgewogICAgaWYgKGlzc2V0KCRwYXJhbXNbImlnbm9yZXZhbGlkYXRpb24iXSkgJiYgJHBhcmFtc1siaWdub3JldmFsaWRhdGlvbiJdPT0iMSIpIHsKICAgICAgJHBhcmFtc1siYWRkdGV4dCJdPSJvbkNsaWNrPSdpZ25vcmV2YWxpZGF0aW9uPTE7JyI7CiAgICB9CiAgICByZXR1cm4gJHRoaXMtPkNyZWF0ZUlucHV0U3VibWl0KAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiaWQiLCRwYXJhbXMsJHRoaXMtPl9pZCksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJuYW1lIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInZhbHVlIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImFkZHRleHQiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiaW1hZ2UiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiY29uZmlybXRleHQiLCRwYXJhbXMsIiIpCiAgICApOwogIH0KCiAgZnVuY3Rpb24gU21hcnR5SW5wdXRTdWJtaXQoJHNtYXJ0eW5hbWUsICRwYXJhbXM9YXJyYXkoKSwgJHZhbHVlPSIiKSB7CiAgICBpZiAoaXNfYXJyYXkoJHBhcmFtcykpIHsKICAgICAgJHRoaXMtPlNtYXJ0eUFzc2lnbigkc21hcnR5bmFtZSwgJHRoaXMtPk5lb0lucHV0U3VibWl0KCRwYXJhbXMpKTsKICAgIH0gZWxzZSB7CiAgICAgICR0aGlzLT5TbWFydHlBc3NpZ24oJHNtYXJ0eW5hbWUsICR0aGlzLT5OZW9JbnB1dFN1Ym1pdChhcnJheSgibmFtZSI9PiRwYXJhbXMsInZhbHVlIj0+JHZhbHVlKSkpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gTmVvSW5wdXRSZXNldCgkcGFyYW1zPWFycmF5KCkpIHsKICAgIHJldHVybiAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiaWQiLCRwYXJhbXMsJHRoaXMtPl9pZCksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJuYW1lIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInZhbHVlIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImFkZHRleHQiLCRwYXJhbXMsIlJlc2V0IikKICAgICk7CiAgfQoKICBmdW5jdGlvbiBOZW9JbnB1dEhpZGRlbigkcGFyYW1zPWFycmF5KCkpIHsKICAgIHJldHVybiAkdGhpcy0+Q3JlYXRlSW5wdXRIaWRkZW4oCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJpZCIsJHBhcmFtcywkdGhpcy0+X2lkKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoIm5hbWUiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgidmFsdWUiLCRwYXJhbXMsIiIpCiAgICApOwogIH0KCiAgZnVuY3Rpb24gU21hcnR5SW5wdXRIaWRkZW4oJHNtYXJ0eW5hbWUsJHBhcmFtcz1hcnJheSgpLCRvcHR2YWx1ZT0iIikgewogICAgaWYgKGlzX2FycmF5KCRwYXJhbXMpKSB7CiAgICAgICR0aGlzLT5TbWFydHlBc3NpZ24oJHNtYXJ0eW5hbWUsJHRoaXMtPk5lb0lucHV0SGlkZGVuKCRwYXJhbXMpKTsKICAgIH0gZWxzZSB7CiAgICAgICR0aGlzLT5TbWFydHlBc3NpZ24oJHNtYXJ0eW5hbWUsJHRoaXMtPk5lb0lucHV0SGlkZGVuKGFycmF5KCJuYW1lIj0+JHBhcmFtcywidmFsdWUiPT4kb3B0dmFsdWUpKSk7CiAgICB9CgogIH0KCiAgZnVuY3Rpb24gTmVvSW5wdXREcm9wZG93bigkcGFyYW1zPWFycmF5KCkpIHsKICAgIHJldHVybiAkdGhpcy0+Q3JlYXRlSW5wdXREcm9wZG93bigKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImlkIiwkcGFyYW1zLCR0aGlzLT5faWQpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgibmFtZSIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJpdGVtcyIsJHBhcmFtcyxhcnJheSgpKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInNlbGVjdGVkaW5kZXgiLCRwYXJhbXMsLTEpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgic2VsZWN0ZWR2YWx1ZSIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJhZGR0ZXh0IiwkcGFyYW1zLCIiKQogICAgKTsKICB9CgogIGZ1bmN0aW9uIFNtYXJ0eUlucHV0RHJvcGRvd24oJHNtYXJ0eW5hbWUsJHBhcmFtcz1hcnJheSgpKSB7CiAgICAkdGhpcy0+U21hcnR5QXNzaWduKCRzbWFydHluYW1lLCAkdGhpcy0+TmVvSW5wdXREcm9wZG93bigkcGFyYW1zKSk7CiAgfQoKICBmdW5jdGlvbiBOZW9JbnB1dFJhZGlvR3JvdXAoJHBhcmFtcz1hcnJheSgpKSB7CiAgICByZXR1cm4gJHRoaXMtPkNyZWF0ZUlucHV0UmFkaW9Hcm91cCgKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImlkIiwkcGFyYW1zLCR0aGlzLT5faWQpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgibmFtZSIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJpdGVtcyIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJzZWxlY3RlZHZhbHVlIiwkcGFyYW1zLC0xKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImFkZHRleHQiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiZGVsaW1pdGVyIiwkcGFyYW1zLCIiKQogICAgKTsKICB9CgoKICAKCiAgZnVuY3Rpb24gTmVvSW5wdXRTZWxlY3RMaXN0KCRwYXJhbXM9YXJyYXkoKSkgewogICAgcmV0dXJuICR0aGlzLT5DcmVhdGVJbnB1dFNlbGVjdExpc3QoCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJpZCIsJHBhcmFtcywkdGhpcy0+X2lkKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoIm5hbWUiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiaXRlbXMiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgic2VsZWN0ZWRpdGVtcyIsJHBhcmFtcyxhcnJheSgpKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInNpemUiLCRwYXJhbXMsMyksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJhZGR0ZXh0IiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoIm11bHRpcGxlIiwkcGFyYW1zLHRydWUpCiAgICApOwogIH0KCgogIGZ1bmN0aW9uIFNtYXJ0eVNjcmFtYmxlRW1haWwoJGVtYWlsLCAkc2NyYW1ibGluZz0iaGV4IikgewogICAgICRzbWFydHlfZGF0YSA9ICJ7bWFpbHRvIGFkZHJlc3M9JyIuJGVtYWlsLiInIGVuY29kZT0nIi4kc2NyYW1ibGluZy4iJ30iOwogICAgIC8qJHNtYXJ0eS0+X2NvbXBpbGVfc291cmNlKCd0ZW1wb3JhcnkgdGVtcGxhdGUnLCAkc21hcnR5X2RhdGEsICRfY29tcGlsZWQgKTsKICAgICBAb2Jfc3RhcnQoKTsKICAgICAkc21hcnR5LT5fZXZhbCgnPz4nIC4gJF9jb21waWxlZCk7CiAgICAgJF9jb250ZW50cyA9IEBvYl9nZXRfY29udGVudHMoKTsKICAgICBAb2JfZW5kX2NsZWFuKCk7Ki8KICAgICAkcmVzdWx0PSR0aGlzLT5Qcm9jZXNzVGVtcGxhdGVGcm9tRGF0YSgkc21hcnR5X2RhdGEpOwogICAgIHJldHVybiAkcmVzdWx0OwogIH0KCiAgLyoqCiAgICoKICAgKiBMaXN0IGhlbHBlciBmdW5jdGlvbnMKICAgKgogICAqLwogICBmdW5jdGlvbiBOZW9EZWxldGVJY29uKCRhY3Rpb24sJHRleHQsJHBhcmFtcz1hcnJheSgpLCRjb25maXJtYXRpb249IiIpIHsKICAgICAkaWNvbj0kdGhpcy0+Q3JlYXRlTGluaygkdGhpcy0+X2lkLCAkYWN0aW9uLCAkdGhpcy0+X3JldHVybmlkLCR0aGlzLT5OZW9TeXN0ZW1JY29uKCJkZWxldGUuZ2lmIiwkdGV4dCksJHBhcmFtcywgJGNvbmZpcm1hdGlvbik7CiAgICAgcmV0dXJuICRpY29uOwogICB9CgogICBmdW5jdGlvbiBOZW9Db3B5SWNvbigkYWN0aW9uLCR0ZXh0LCRwYXJhbXM9YXJyYXkoKSwkY29uZmlybWF0aW9uPSIiKSB7CiAgICAgJGljb249JHRoaXMtPkNyZWF0ZUxpbmsoJHRoaXMtPl9pZCwgJGFjdGlvbiwgJHRoaXMtPl9yZXR1cm5pZCwJJHRoaXMtPk5lb1N5c3RlbUljb24oImNvcHkuZ2lmIiwkdGV4dCksICRwYXJhbXMsICRjb25maXJtYXRpb24pOwogICAgIHJldHVybiAkaWNvbjsKICAgfQoKICAgZnVuY3Rpb24gTmVvRWRpdEljb24oJGFjdGlvbiwkdGV4dCwkcGFyYW1zPWFycmF5KCksJGNvbmZpcm1hdGlvbj0iIikgewogICAgICRpY29uPSR0aGlzLT5DcmVhdGVMaW5rKCR0aGlzLT5faWQsICRhY3Rpb24sICR0aGlzLT5fcmV0dXJuaWQsCSR0aGlzLT5OZW9TeXN0ZW1JY29uKCJlZGl0LmdpZiIsJHRleHQpLAkkcGFyYW1zLCAkY29uZmlybWF0aW9uKTsKICAgICByZXR1cm4gJGljb247CiAgIH0KICAgZnVuY3Rpb24gTmVvVHJ1ZUljb24oJGFjdGlvbiwkdGV4dCwkcGFyYW1zPWFycmF5KCksJGNvbmZpcm1hdGlvbj0iIikgewogICAgICRpY29uPSR0aGlzLT5DcmVhdGVMaW5rKCR0aGlzLT5faWQsICRhY3Rpb24sICR0aGlzLT5fcmV0dXJuaWQsCSR0aGlzLT5OZW9TeXN0ZW1JY29uKCJ0cnVlLmdpZiIsJHRleHQpLAkkcGFyYW1zLCAkY29uZmlybWF0aW9uKTsKICAgICByZXR1cm4gJGljb247CiAgIH0KICAgZnVuY3Rpb24gTmVvRmFsc2VJY29uKCRhY3Rpb24sJHRleHQsJHBhcmFtcz1hcnJheSgpLCRjb25maXJtYXRpb249IiIpIHsKICAgICAkaWNvbj0kdGhpcy0+Q3JlYXRlTGluaygkdGhpcy0+X2lkLCAkYWN0aW9uLCAkdGhpcy0+X3JldHVybmlkLAkkdGhpcy0+TmVvU3lzdGVtSWNvbigiZmFsc2UuZ2lmIiwkdGV4dCksCSRwYXJhbXMsICRjb25maXJtYXRpb24pOwogICAgIHJldHVybiAkaWNvbjsKICAgfQoKICAgZnVuY3Rpb24gTmVvQWRkSWNvbigkYWN0aW9uLCR0ZXh0LCRwYXJhbXM9YXJyYXkoKSwkY29uZmlybWF0aW9uPSIiLCAkaW5jbHVkZXRleHRsaW5rID0gdHJ1ZSkgewogICAgICRpY29uPSR0aGlzLT5DcmVhdGVMaW5rKCR0aGlzLT5faWQsICRhY3Rpb24sICR0aGlzLT5fcmV0dXJuaWQsICR0aGlzLT5OZW9TeXN0ZW1JY29uKCJuZXdvYmplY3QuZ2lmIiwkdGV4dCksICRwYXJhbXMsICRjb25maXJtYXRpb24pOwogICAgIGlmICgkaW5jbHVkZXRleHRsaW5rKSB7CiAgICAgICAkaWNvbi49JHRoaXMtPkNyZWF0ZUxpbmsoJHRoaXMtPl9pZCwgJGFjdGlvbiwgJHRoaXMtPl9yZXR1cm5pZCwgJHRleHQsICRwYXJhbXMsICRjb25maXJtYXRpb24pOwogICAgIH0KICAgICAvLyRpY29uLj0kdGhpcy0+Q3JlYXRlTGluaygkdGhpcy0+X2lkLCAgJGFjdGlvbiwgJHRoaXMtPl9yZXR1cm5pZCwgJHRleHQsICRwYXJhbXMsICRjb25maXJtYXRpb24sIGZhbHNlLCBmYWxzZSwgJ2NsYXNzPSJwYWdlb3B0aW9ucyInKTsKCiAgICAgLy89JHRoaXMtPkNyZWF0ZUxpbmsoJGlkLCAnZWRpdHRlbXBsYXRlJywgMCwgJHRoZW1lT2JqZWN0LT5EaXNwbGF5SW1hZ2UoJ2ljb25zL3N5c3RlbS9uZXdvYmplY3QuZ2lmJywkdGhpcy0+TGFuZygiYWRkdGVtcGxhdGUiKSwnJywnJywnc3lzdGVtaWNvbicpLCBhcnJheSgpLCAnJywgZmFsc2UsIGZhbHNlLCAnJykgLicgJy4gJHRoaXMtPkNyZWF0ZUxpbmsoJGlkLCAnZWRpdHRlbXBsYXRlJywgJHJldHVybmlkLCAkdGhpcy0+TGFuZygiYWRkdGVtcGxhdGUiKSwgYXJyYXkoInRvZG8iPT4iYWRkIiksICcnLCBmYWxzZSwgZmFsc2UsICdjbGFzcz0icGFnZW9wdGlvbnMiJyk7CiAgICByZXR1cm4gJGljb247CiAgIH0KCiAgIGZ1bmN0aW9uIE5lb1N5c3RlbUljb24oJGljb24sJHRleHQ9IiIpIHsKICAgICAkdGhlbWVvYmo9JHRoaXMtPl9nZXR0aGVtZW9iaigpOwogICAgIGlmICgkdGhlbWVvYmopIHsKICAgICAgIHJldHVybiAkdGhlbWVvYmotPkRpc3BsYXlJbWFnZSgnaWNvbnMvc3lzdGVtLycuJGljb24sICR0ZXh0LCcnLCcnLCdzeXN0ZW1pY29uJyk7CiAgICAgfSByZXR1cm4gIiI7CiAgIH0KCiAgIGZ1bmN0aW9uIE5lb0hpZGRlbkNvbnRlbnQoJHRleHQsICRjb250ZW50LCAkY2xpY2t0eXBlPSJ0ZXh0IiwgJHN0YXJ0c2hvd249ZmFsc2UpIHsKICAgICByZXR1cm4gIjxzdHJvbmc+JHRleHQ8L3N0cm9uZz48YnIvPiRjb250ZW50IjsKICAgfQoKICAgLyoqCiAgICoKICAgKiBEQiBTaG9ydGN1dHMKICAgKgogICAqLwoKICBmdW5jdGlvbiBOZW9EQkluc2VydCgkdGFibGUsICR2YWx1ZXM9YXJyYXkoKSwgJHVzZWdlbmlkPWZhbHNlKSB7CiAgICAkZGIgPSBjbXNtcygpLT5HZXREQigpOwogICAgJHEgPSAiSU5TRVJUIElOVE8gIiAuIGNtc19kYl9wcmVmaXgoKSAuICR0YWJsZTsKICAgICRwPWFycmF5KCk7CiAgICAkZmllbGRzPSIiOwogICAgJHZhbD0iIjsKICAgIGZvcmVhY2goJHZhbHVlcyBhcyAka2V5PT4kdmFsdWUpIHsKICAgICAgaWYgKCRmaWVsZHM9PSIiKSAkZmllbGRzPSRrZXk7IGVsc2UgJGZpZWxkcy49IiwiLiRrZXk7CiAgICAgIGlmICgkdmFsPT0iIikgJHZhbD0iPyI7IGVsc2UgJHZhbC49Iiw/IjsKICAgICAgJHBbXT0kdmFsdWU7CiAgICB9CiAgICAkcS49IiAoIi4kZmllbGRzLiIpIFZBTFVFUyAoIi4kdmFsLiIpIjsKICAgIC8vZWNobyAkcTsKICAgICRkYnJlc3VsdCA9ICRkYi0+RXhlY3V0ZSgkcSwgJHApOwogICAgcmV0dXJuICgkZGJyZXN1bHQhPT10cnVlKTsKICB9CgogIGZ1bmN0aW9uIE5lb0RCRXJyb3JEaWUoKSB7CiAgICAkZGIgPSBjbXNtcygpLT5HZXREQigpOwogICAgZWNobyAkZGItPkVycm9yTXNnKCkgLiAiPGJyPjxicj4iIC4gJGRiLT5zcWw7CiAgICBkaWUoKTsKICB9CgogIGZ1bmN0aW9uIE5lb0RCVXBkYXRlKCR0YWJsZSwgJHZhbHVlcyA9IGFycmF5KCksICRjcml0ZXJpYSA9IGFycmF5KCkpIHsKICAgICRkYiA9IGNtc21zKCktPkdldERCKCk7CiAgICAkcSA9ICJVUERBVEUgIiAuIGNtc19kYl9wcmVmaXgoKSAuICR0YWJsZSAuICIgU0VUICI7CiAgICAkcCA9IGFycmF5KCk7CiAgICAkZmlyc3QgPSB0cnVlOwogICAgZm9yZWFjaCAoJHZhbHVlcyBhcyAkZmllbGQgPT4gJHZhbHVlKSB7CiAgICAgIGlmICgkZmlyc3QpIHsKICAgICAgICAkcSAuPSAkZmllbGQgLiAiPT8iOwogICAgICB9IGVsc2UgewogICAgICAgICRxIC49ICIsICIgLiAkZmllbGQgLiAiPT8iOwogICAgICB9CiAgICAgICRwID0gYXJyYXlfbWVyZ2UoJHAsIGFycmF5KCR2YWx1ZSkpOwogICAgICAkZmlyc3QgPSBmYWxzZTsKICAgIH0KICAgIGlmIChjb3VudCgkdmFsdWVzKT09MikgewoKICAgIH0KCiAgICAkZmlyc3QgPSB0cnVlOwogICAgZm9yZWFjaCAoJGNyaXRlcmlhIGFzICRmaWVsZCA9PiAkdmFsdWUpIHsKICAgICAgaWYgKCRmaXJzdCkgewogICAgICAgICRxIC49ICIgV0hFUkUgIiAuICRmaWVsZCAuICI9PyI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgJHEgLj0gIiBBTkQgIiAuICRmaWVsZCAuICI9PyI7CiAgICAgIH0KICAgICAgJHAgPSBhcnJheV9tZXJnZSgkcCwgYXJyYXkoJHZhbHVlKSk7CiAgICAgICRmaXJzdCA9IGZhbHNlOwogICAgfQogICAgLy9lY2hvICRxO3ByaW50X3IoJHApO2RpZSgpOwoKCgogICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCRxLCAkcCk7CiAgICBpZiAoY291bnQoJHZhbHVlcyk9PTIpIHsKICAgICAgLy9lY2hvICRxO3ByaW50X3IoJHApO2RpZSgpOwogICAgIC8vIGVjaG8gJGRiLT5zcWw7ZGllKCk7CiAgICB9CgogICAgaWYgKCEkZGJyZXN1bHQpIHsKICAgICAgLy9lY2hvICRkYi0+RXJyb3JNc2coKTtkaWUoKTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7Ly8kZGJyZXN1bHQtPkFmZmVjdGVkX1Jvd3MoKTsKICB9CgogIGZ1bmN0aW9uIE5lb0RCU2VsZWN0KCR0YWJsZSwgJHZhbHVlcz1hcnJheSgpKSB7CgogIH0KCiAgZnVuY3Rpb24gTmVvREJEZWxldGUoJHRhYmxlLCAkdmFsdWVzPWFycmF5KCkpIHsKCiAgfQoKCiAgLyoqCiAgICoKICAgKiBOZW9EYXRhU3RvcmFnZSBzaG9ydGN1dHMKICAgKgogICAqLwogIGZ1bmN0aW9uIEFkZEVudGl0eSgkdGFibGUsICRwcm9wcz1hcnJheSgpKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPkFkZEVudGl0eSgkdGhpcy0+R2V0TmFtZSgpLCR0YWJsZSwkcHJvcHMpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gQWRkRW50aXR5OiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gRGVsZXRlRW50aXR5KCRpZCkgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5EZWxldGVFbnRpdHkoJGlkKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIERlbGV0ZUVudGl0eTogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIERlbGV0ZUVudGl0aWVzKCR0YWJsZSwgJGNyaXRlcmlhPWFycmF5KCkpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+RGVsZXRlRW50aXRpZXMoJHRoaXMtPkdldE5hbWUoKSwgJHRhYmxlLCAkY3JpdGVyaWEpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gRGVsZXRlRW50aXRpZXM6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBHZXRFbnRpdHkoJGlkLCAkb3ZlcnJpZGVwcm9wcz1hcnJheSgpLCAkZmlsbGZpZWxkcz1hcnJheSgpKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPkdldEVudGl0eSgkaWQsICRvdmVycmlkZXByb3BzLCAkZmlsbGZpZWxkcyk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBHZXRFbnRpdHk6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBHZXRFbnRpdGllcygkdGFibGU9IiIsICRjcml0ZXJpYT1hcnJheSgpLCAkYWx3YXlzcmV0dXJuYXJyYXk9ZmFsc2UpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+R2V0RW50aXRpZXMoJHRoaXMtPkdldE5hbWUoKSwgJHRhYmxlLCAkY3JpdGVyaWEpOwogICAgfSBlbHNlIHsKICAgICAgaWYgKCRhbHdheXNyZXR1cm5hcnJheSkgewogICAgICAgIHJldHVybiBhcnJheSgpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIEdldEVudGl0aWVzOiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBHZXRPbmVFbnRpdHkoJHRhYmxlLCAkY3JpdGVyaWE9YXJyYXkoKSwgJGZhaWxpZm11bHRpcGxlPWZhbHNlKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPkdldE9uZUVudGl0eSgkdGhpcy0+R2V0TmFtZSgpLCAkdGFibGUsICRjcml0ZXJpYSwgJGZhaWxpZm11bHRpcGxlKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIEdldE9uZUVudGl0eTogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIEdldE9uZVNvcnRlZEVudGl0eSgkdGFibGUsICRjcml0ZXJpYT1hcnJheSgpLCAkc29ydGZpZWxkcz1hcnJheSgpLCRmYWlsaWZtdWx0aXBsZT1mYWxzZSApIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+R2V0T25lRW50aXR5KCR0aGlzLT5HZXROYW1lKCksICR0YWJsZSwgJGNyaXRlcmlhLCAkZmFpbGlmbXVsdGlwbGUpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gR2V0T25lRW50aXR5OiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gR2V0RW50aXRpZXNGdWxsKCR0YWJsZT0iIiwgJGNyaXRlcmlhPWFycmF5KCksICRhbHdheXNyZXR1cm5hcnJheT1mYWxzZSkgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5HZXRFbnRpdGllc0Z1bGwoJHRoaXMtPkdldE5hbWUoKSwgJHRhYmxlLCAkY3JpdGVyaWEpOwogICAgfSBlbHNlIHsKICAgICAgaWYgKCRhbHdheXNyZXR1cm5hcnJheSkgewogICAgICAgIHJldHVybiBhcnJheSgpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIEdldEVudGl0aWVzRnVsbDogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gU2V0RW50aXR5UHJvcCgkaWQsJHByb3BuYW1lLCRwcm9wdmFsdWUsJHByb3B0eXBlPSJ1bmRlZmluZWQiKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPlNldEVudGl0eVByb3AoJGlkLCRwcm9wbmFtZSwkcHJvcHZhbHVlLCRwcm9wdHlwZSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBTZXRFbnRpdHlQcm9wOiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gQ2xlYXJFbnRpdHlQcm9wKCRpZCwgJHByb3BuYW1lKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPkNsZWFyRW50aXR5UHJvcCgkaWQsICRwcm9wbmFtZSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBDbGVhckVudGl0eVByb3A6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBTZXRFbnRpdHlQcm9wcygkaWQsICRwcm9wcy8qLCAkY2xlYXI9dHJ1ZSovKSB7CiAgICAvL2VjaG8gImhpMSI7ZGllKCk7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPlNldEVudGl0eVByb3BzKCRpZCwgJHByb3BzLyosICRjbGVhciovKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIFNldEVudGl0eVByb3BzOiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gU2V0RW50aXR5UHJvcHNGcm9tQXJyYXkoJGlkLCAkcHJvcHMsICR2YWx1ZXM9YXJyYXkoKSwgJGNsZWFyPXRydWUsICRmaWxsPWZhbHNlKSB7CiAgICBpZiAoZW1wdHkoJHZhbHVlcykpIHsKICAgICAgJHZhbHVlcz0kdGhpcy0+X3BhcmFtczsKICAgIH0KICAgIC8vZWNobyAiaGkxIjtkaWUoKTsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+U2V0RW50aXR5UHJvcHNGcm9tQXJyYXkoJGlkLCAkcHJvcHMsICR2YWx1ZXMsICRjbGVhciwgJGZpbGwpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gU2V0RW50aXR5UHJvcHNGcm9tQXJyYXk6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKCgogIGZ1bmN0aW9uIFNldEVudGl0eVByb3BzT25Dcml0ZXJpYSgkdGFibGUsICRwcm9wcywgJGNyaXRlcmlhLCAkY3JlYXRlPXRydWUsICRjbGVhcj1mYWxzZSkgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5TZXRFbnRpdHlQcm9wc09uQ3JpdGVyaWEoJHRoaXMtPkdldE5hbWUoKSwgJHRhYmxlLCAkcHJvcHMsICRjcml0ZXJpYSwgJGNyZWF0ZSwgJGNsZWFyKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIFNldEVudGl0eVByb3BzT25Dcml0ZXJpYTogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTs7OwogICAgfQogIH0KCiAgZnVuY3Rpb24gUmVzZXRFbnRpdHlQcm9wcygkaWQsICRuZXdwcm9wcz1hcnJheSgpKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPlJlc2V0RW50aXR5UHJvcHMoJGlkLCAkbmV3cHJvcHMpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gUmVzZXRFbnRpdHlQcm9wczogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTs7OwogICAgfQogIH0KCiAgZnVuY3Rpb24gUmVtb3ZlTW9kdWxlRW50aXRpZXMoKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPlJlbW92ZU1vZHVsZUVudGl0aWVzKCR0aGlzLT5HZXROYW1lKCkpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gUmVtb3ZlTW9kdWxlRW50aXRpZXM6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBDbGVhckVudGl0eVByb3BzKCRpZCkgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5DbGVhckVudGl0eVByb3BzKCRpZCk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBDbGVhckVudGl0eVByb3BzOiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gQ29tcGFyZUVudGl0aWVzKCRlbnRpdHkxLCAkZW50aXR5MiwgJHNvcnRmaWVsZCkgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICAkZHMtPkNvbXBhcmVFbnRpdGllcygkZW50aXR5MSwgJGVudGl0eTIsICRzb3J0ZmllbGQpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gQ29tcGFyZUVudGl0aWVzOiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gQ29tcGFyZUVudGl0aWVzQ29tcGxleCgkZW50aXR5MSwgJGVudGl0eTIsICRzb3J0ZmllbGRzKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgICRkcy0+Q29tcGFyZUVudGl0aWVzQ29tcGxleCgkZW50aXR5MSwgJGVudGl0eTIsICRzb3J0ZmllbGRzKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIENvbXBhcmVFbnRpdGllc0NvbXBsZXg6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBTb3J0RW50aXRpZXMoJGxpc3QsICRzb3J0ZmllbGRzKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgICRkcy0+U29ydEVudGl0aWVzKCRsaXN0LCAkc29ydGZpZWxkcyk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBTb3J0RW50aXRpZXM6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBFbnRpdGllc0NvdW50KCR0YWJsZT0iIiwgJGNyaXRlcmlhPWFycmF5KCkpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+RW50aXRpZXNDb3VudCgkdGhpcy0+R2V0TmFtZSgpLCAkdGFibGUsICRjcml0ZXJpYSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBFbnRpdGllc0NvdW50OiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gQ2xlYXJNb2R1bGVFbnRpdGllcygpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+Q2xlYXJNb2R1bGVFbnRpdGllcygkdGhpcy0+R2V0TmFtZSgpKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIENsZWFyTW9kdWxlRW50aXRpZXM6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBDb3VudEVudGl0aWVzKCR0YWJsZSwgJGNyaXRlcmlhPWFycmF5KCkpIHsKICAgICRlbnRpdGllcz0kdGhpcy0+R2V0RW50aXRpZXMoJHRhYmxlLCAkY3JpdGVyaWEsIHRydWUpOwogICAgcmV0dXJuIGNvdW50KCRlbnRpdGllcyk7CiAgfQoKICBmdW5jdGlvbiBJc1RhYmxlRW1wdHkoJHRhYmxlKSB7ICAgIAogICAgcmV0dXJuICgkdGhpcy0+Q291bnRFbnRpdGllcygkdGFibGUpPT0wKTsKICB9CgogIC8qCiAgICoKICAgKiBDb25uZWN0aW9uIGZ1bmN0aW9ucwogICAqCiAgICovCgogIGZ1bmN0aW9uIFNldEVudGl0eUNvbm5lY3Rpb24oJGlkMSwgJGlkMiwgJHR5cGU9IiIpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+U2V0RW50aXR5Q29ubmVjdGlvbigkaWQxLCAkaWQyLCAkdHlwZSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBTZXRFbnRpdHlDb25uZWN0aW9uOiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gQ2xlYXJFbnRpdHlDb25uZWN0aW9ucygkaWQxLCAkaWQyPS0xLCAkdHlwZT0iIikgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5DbGVhckVudGl0eUNvbm5lY3Rpb25zKCRpZDEsICRpZDIsICR0eXBlKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIENsZWFyRW50aXR5Q29ubmVjdGlvbnM6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKCgogIGZ1bmN0aW9uIENsZWFyRW50aXR5Q29ubmVjdGlvbigkaWQxLCAkaWQyLCAkdHlwZT0iIikgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5DbGVhckVudGl0eUNvbm5lY3Rpb24oJGlkMSwgJGlkMiwgJHR5cGUpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gQ2xlYXJFbnRpdHlDb25uZWN0aW9uOiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gQ2hlY2tFbnRpdHlDb25uZWN0aW9uKCRpZDEsICRpZDIsICR0eXBlPSIiLCAkcmV0dXJudmFsdWU9dHJ1ZSkgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5DaGVja0VudGl0eUNvbm5lY3Rpb24oJGlkMSwgJGlkMiwgJHR5cGUsICRyZXR1cm52YWx1ZSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBDaGVja0VudGl0eUNvbm5lY3Rpb246IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBHZXRFbnRpdHlDb25uZWN0aW9ucygkaWQxLCAkaWQyPS0xLCAkdHlwZT0iIikgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5HZXRFbnRpdHlDb25uZWN0aW9ucygkaWQxLCAkaWQyLCAkdHlwZSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBHZXRFbnRpdHlDb25uZWN0aW9uczogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIEFkZEZpZWxkU2V0KCRuYW1lLCRmaWVsZHMpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+QWRkRmllbGRTZXQoJHRoaXMtPkdldE5hbWUoKSwkbmFtZSwkZmllbGRzKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIEFkZEZpZWxkU2V0OiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gR2V0RmllbGRTZXQoJG5hbWUpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+R2V0RmllbGRTZXQoJHRoaXMtPkdldE5hbWUoKSwkbmFtZSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBHZXRGaWVsZFNldDogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIEVudGl0eVNldFVuc2V0UHJvcHMoJGVudGl0eSwkZmllbGRzZXQsJGZpbGx2YWx1ZT0iIikgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5FbnRpdHlTZXRVbnNldFByb3BzKCR0aGlzLT5HZXRGaWVsZFNldCgkdGhpcy0+R2V0TmFtZSgpKSwkZW50aXR5LCRmaWVsZHNldCwkZmlsbHZhbHVlPSIiKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIEdldEZpZWxkU2V0OiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfQogIH0KCgogIGZ1bmN0aW9uIEdldERTRXJyb3JzKCRubDJicj10cnVlLCRjbGVhcj10cnVlKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPkdldEVycm9ycygkbmwyYnIsJGNsZWFyKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIEdldEZpZWxkU2V0OiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gU2hvd0RTRXJyb3JzKCRjbGVhcj10cnVlKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPkdldEVycm9ycygkY2xlYXIpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gU2hvd0RTRXJyb3JzOiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gRFNJbkVycm9yKCkgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5JbkVycm9yKCk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBEU0luRXJyb3I6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICAvKgogICAqCiAgICogVXRpbGl0eSBmdW5jdGlvbnMKICAgKgogICAqLwoKICBmdW5jdGlvbiBOZW9TbGFzaGVzKCR1cmwpIHsKCQkkcmVzdWx0PXN0cl9yZXBsYWNlKCJcXCIsIi8iLCR1cmwpOwogICAgLy9ZZXMsIHBocCB1bmRlciB3aW5kb3dzIHJ1bnMgcGVyZmVjdGx5IHdpdGggdGhvc2Ugc2xhc2hlcywgYXMgbG9uZyBhcyB5b3UKICAgIC8vZG9uJ3QgbWl4IHRoZW0gd2l0aCBiYWNrc2xhc2hlcyEhCgkJLy8kcmVzdWx0PXN0cl9yZXBsYWNlKCIvIixESVJFQ1RPUllfU0VQQVJBVE9SLCR1cmwpOwoJCS8vcmV0dXJuIHN0cl9yZXBsYWNlKCJcXCIsRElSRUNUT1JZX1NFUEFSQVRPUiwkcmVzdWx0KTsKCQlyZXR1cm4gJHJlc3VsdDsKCX0KCiAgZnVuY3Rpb24gRGVjb2RlSFRNTEVudGl0aWVzKCRzKSB7CiAgICAkdG1wPWh0bWxfZW50aXR5X2RlY29kZSgkcyk7CiAgICB3aGlsZSAoJHRtcCE9aHRtbF9lbnRpdHlfZGVjb2RlKCR0bXApKSB7CiAgICAgICR0bXA9aHRtbF9lbnRpdHlfZGVjb2RlKCR0bXApOwogICAgfQogICAgcmV0dXJuIGh0bWxfZW50aXR5X2RlY29kZSgkdG1wKTsKICB9CgogIGZ1bmN0aW9uIFNsYXNoZXMoJHVybCkgewogICAgcmV0dXJuICR0aGlzLT5OZW9TbGFzaGVzKCR1cmwpOwogIH0KCglmdW5jdGlvbiBTbGFzaCgkc3RyLCRzdHIyPSIiLCRzdHIzPSIiKSB7CgkJaWYgKCRzdHI9PSIiKSByZXR1cm4gJHN0cjI7CgkJaWYgKCRzdHIyPT0iIiAmJiAkc3RyMz09IiIpIHJldHVybiAkc3RyOwogICAgJHJlc3VsdD0iIjsKCQlpZiAoJHN0cltzdHJsZW4oJHN0ciktMV0hPSIvIikgewoJCQlpZiAoJHN0cjJbMF0hPSIvIikgewoJCQkJJHJlc3VsdD0kc3RyLiIvIi4kc3RyMjsKCQkJfSBlbHNlIHsKCQkJCSRyZXN1bHQ9JHN0ci4kc3RyMjsKCQkJfQoJCX0gZWxzZSB7CgkJCWlmICgkc3RyMlswXSE9Ii8iKSB7CgkJCQkkcmVzdWx0PSRzdHIuJHN0cjI7CgkJCX0gZWxzZSB7CgkJCQkkcmVzdWx0PSRzdHIuc3Vic3RyKCRzdHIyLDEpOyAvL3RyaW0gYXdheSBvbmUgb2YgdGhlIHNsYXNoZXMKCQkJfQoJCX0KICAgIGlmICgkc3RyMz09IiIpIHJldHVybiAkcmVzdWx0OwogICAgaWYgKCRyZXN1bHRbc3RybGVuKCRyZXN1bHQpLTFdIT0iLyIpIHsKCQkJaWYgKCRzdHIzWzBdIT0iLyIpIHsKCQkJCSRyZXN1bHQ9JHJlc3VsdC4iLyIuJHN0cjM7CgkJCX0gZWxzZSB7CgkJCQkkcmVzdWx0PSRyZXN1bHQuJHN0cjM7CgkJCX0KCQl9IGVsc2UgewoJCQlpZiAoJHN0cjNbMF0hPSIvIikgewoJCQkJJHJlc3VsdD0kcmVzdWx0LiRzdHIzOwoJCQl9IGVsc2UgewoJCQkJJHJlc3VsdD0kcmVzdWx0LnN1YnN0cigkc3RyMywxKTsgLy90cmltIGF3YXkgb25lIG9mIHRoZSBzbGFzaGVzCgkJCX0KCQl9CiAgICByZXR1cm4gJHJlc3VsdDsKCX0KCiAgZnVuY3Rpb24gTmVvRGlyTGlzdCgkcm9vdCwkcmV0dXJuPSJmaWxlcyIsJGludHJvZHVjdGlvbj1hcnJheSgpLCRleGNsdWRlcz1hcnJheSgpLCRtYXhyZWN1cnNpb249LTEpIHsKICAgICRkaXJsaXN0PWFycmF5KCk7CiAgICAkY29uZmlnPWNtc21zKCktPkdldENvbmZpZygpOwogICAgJG1vZGU9IiI7CiAgICBzd2l0Y2goJHJldHVybikgewogICAgICBjYXNlICJmaWxlcyI6ICRtb2RlPSJGSUxFUyI7YnJlYWs7CiAgICAgIGNhc2UgImRpcnMiOiAkbW9kZT0iRElSUyI7YnJlYWs7CiAgICAgIGNhc2UgImJvdGgiOiAkbW9kZT0iRlVMTCI7YnJlYWs7CiAgICB9CiAgICAkZnVsbHJvb3Q9JHRoaXMtPlNsYXNoKCRjb25maWdbInJvb3RfcGF0aCJdLCRyb290KTsKICAgICRmaWxlcmVjPSBnZXRfcmVjdXJzaXZlX2ZpbGVfbGlzdCAoJGZ1bGxyb290LCAkZXhjbHVkZXMgLCRtYXhyZWN1cnNpb24gLCRtb2RlKTsgLy9ObyBtYXhkZXB0aCBpbiByZWN1cnNpb24KICAgIGlmICghZW1wdHkoJGludHJvZHVjdGlvbikpIHsKICAgICAgJGRpcmxpc3Q9JGludHJvZHVjdGlvbjsKICAgIH0KICAgIGZvcmVhY2goJGZpbGVyZWMgYXMgJGtleT0+JHZhbHVlKSB7CiAgICAgICR2YWx1ZTE9JHRoaXMtPlNsYXNoZXMoc3RyX3JlcGxhY2UoJGNvbmZpZ1sncm9vdF9wYXRoJ10sJycsJHZhbHVlKSk7CiAgICAgIC8vcHJldmVudCBjdXJyZW50IGRpciBmcm9tIHNob3dpbmcgdXAKICAgICAgLy9pZiAoJHZhbHVlMT09KCRwcm9maWxlWyJwYXRoIl0uIi8iKSkgY29udGludWU7CiAgICAgIC8vQ2hlY2sgZm9yIGhpZGRlbiBmaWxlcwogICAgICAkZGlycz1leHBsb2RlKCIvIiwkdmFsdWUxKTsKICAgICAgJGhpZGRlbj1mYWxzZTsKICAgICAgZm9yZWFjaCgkZGlycyBhcyAkZGlyKSB7CiAgICAgICAgaWYgKHN1YnN0cigkZGlyLDAsMSk9PSIuIikgeyRoaWRkZW49dHJ1ZTsgYnJlYWs7fQogICAgICB9CiAgICAgIGlmICgkaGlkZGVuKSBjb250aW51ZTsKCiAgICAgIC8vbm90IGhpZGRlbiwgYWRkIHRvIGxpc3QKICAgICAgJGRpcmxpc3RbJHZhbHVlMV09JHZhbHVlMTsKICAgIH0KICAgIHJldHVybiAkZGlybGlzdDsKICB9CgogIGZ1bmN0aW9uIE5lb0dldE1pbWVUeXBlKCRmaWxlbmFtZSwgJGluY2x1ZGVlbmNvZGluZyA9IHRydWUpIHsKICAgIGlmIChjbGFzc19leGlzdHMoImZpbmZvIikpIHsKICAgICAgJGZpbmZvID0gYXJyYXkoKTsKICAgICAgaWYgKCRpbmNsdWRlZW5jb2RpbmcpIHsKICAgICAgICAkZmluZm8gPSBuZXcgZmluZm8oRklMRUlORk9fTUlNRSk7IC8vIHJldHVybiBtaW1lIHR5cGUgYWxhIG1pbWV0eXBlIGV4dGVuc2lvbgogICAgICB9IGVsc2UgewogICAgICAgICRmaW5mbyA9IG5ldyBmaW5mbyhGSUxFSU5GT19NSU1FX1RZUEUpOyAvLyByZXR1cm4gbWltZSB0eXBlIGFsYSBtaW1ldHlwZSBleHRlbnNpb24KICAgICAgfQogICAgICBpZiAoISRmaW5mbykgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICByZXR1cm4gJGZpbmZvLT5maWxlKCRmaWxlbmFtZSk7CiAgICB9IGVsc2UgewogICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCJtaW1lX2NvbnRlbnRfdHlwZSIpKSB7CiAgICAgICAgcmV0dXJuIG1pbWVfY29udGVudF90eXBlKCRmaWxlbmFtZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmVxdWlyZV9vbmNlKGRpcm5hbWUoX19GSUxFX18pLkRJUkVDVE9SWV9TRVBBUkFUT1IuIm1pbWV0eXBlcy5waHAiKTsKICAgICAgICByZXR1cm4gcmV0dXJuTUlNRVR5cGUoJGZpbGVuYW1lKTsKICAgICAgfQogICAgfQogIH0KCiAgLypDaGVja3MgZm9yIHRoZSBleGlzdGVuY2Ugb2YgYW4gaW5kZXggaW4gYW4gYXJyYXkgYW5kIHJldHVybiB0aGUgdmFsdWUgaWYgaXQncyB0aGVyZQogICAqYW5kIHRoZSBkZWZhdWx0IHZhbHVlIGlmIGl0J3Mgbm90CiAgKi8KICBmdW5jdGlvbiBOZW9QYXJhbVZhbHVlKCRuYW1lLCRwYXJhbXM9YXJyYXkoKSwkZGVmYXVsdD0iIikgewogICAgCiAgICBpZiAoIWlzX2FycmF5KCRwYXJhbXMpKSB7CiAgICAgIC8vVGhpcyB3YXkgMm5kIHBhcmFtZXRlciBjYW4gYWxzbyBiZSB1c2VkIGFzIGRlZmF1bHQgdmFsdWUKICAgICAgaWYgKCRwYXJhbXMhPSIiICYmICRkZWZhdWx0PT0iIikgewogICAgICAgICRkZWZhdWx0PSRwYXJhbXM7CiAgICAgIH0KICAgICAgJHBhcmFtcz0kdGhpcy0+X3BhcmFtczsKICAgIH0gZWxzZSB7CiAgICAgIGlmIChlbXB0eSgkcGFyYW1zKSkgJHBhcmFtcz0kdGhpcy0+X3BhcmFtczsKICAgIH0KICAgIGlmICghaXNfYXJyYXkoJG5hbWUpKSB7CiAgICAgIGlmIChpc3NldCgkcGFyYW1zWyRuYW1lXSkpIHJldHVybiAkcGFyYW1zWyRuYW1lXTsKICAgICAgcmV0dXJuICRkZWZhdWx0OwogICAgfSBlbHNlIHsKICAgICAgZm9yZWFjaCAoJG5hbWUgYXMgJHNpbmdsZW5hbWUpIHsKICAgICAgICBpZiAoaXNzZXQoJHBhcmFtc1skc2luZ2xlbmFtZV0pKSByZXR1cm4gJHBhcmFtc1skc2luZ2xlbmFtZV07CiAgICAgIH0KICAgICAgcmV0dXJuICRkZWZhdWx0OwogICAgfQogIH0KCiAgLy9TaG9ydGN1dCBmb3IgdGhlIGFib3ZlCiAgZnVuY3Rpb24gTlBWKCRuYW1lLCAkcGFyYW1zPWZhbHNlLCAkZGVmYXVsdD0iIikgewogICAgcmV0dXJuICR0aGlzLT5OZW9QYXJhbVZhbHVlKCRuYW1lLCAkcGFyYW1zLCAkZGVmYXVsdCk7CiAgfQoKICBGdW5jdGlvbiBOZW9BcHBseVBhcmFtVmFsdWVzKCR0aGlzYXJyYXksICRwYXJhbXM9YXJyYXkoKSwgJGluZGV4ZXM9YXJyYXkoKSwgJGFsd2F5c2ZpbGw9ZmFsc2UpIHsKICAgIGlmIChlbXB0eSgkcGFyYW1zKSkgJHBhcmFtcz0kdGhpcy0+X3BhcmFtczsKICAgIGlmIChlbXB0eSgkcGFyYW1zKSB8fCBlbXB0eSgkaW5kZXhlcykpIHJldHVybiAkdGhpc2FycmF5OwogICAgaWYgKGlzX2Fzc29jKCRpbmRleGVzKSkgewogICAgICBmb3JlYWNoKCRpbmRleGVzIGFzICRpbmRleD0+JGRlZmF1bHR2YWx1ZSkgewogICAgICAgIGlmIChpc3NldCgkcGFyYW1zWyRpbmRleF0pKSB7CiAgICAgICAgICAkdGhpc2FycmF5WyRpbmRleF09JHBhcmFtc1skaW5kZXhdOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAkdGhpc2FycmF5WyRpbmRleF09JGRlZmF1bHR2YWx1ZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGZvcmVhY2goJGluZGV4ZXMgYXMgJGluZGV4KSB7CiAgICAgICAgaWYgKGlzc2V0KCRwYXJhbXNbJGluZGV4XSkpIHsKICAgICAgICAgICR0aGlzYXJyYXlbJGluZGV4XT0kcGFyYW1zWyRpbmRleF07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmICgkYWx3YXlzZmlsbCkgewogICAgICAgICAgICBpZiAoIWlzc2V0KCR0aGlzYXJyYXlbJGluZGV4XSkpICR0aGlzYXJyYXlbJGluZGV4XT0iIjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIC8vcHJpbnRfcigkdGhpc2FycmF5KTsKICAgIHJldHVybiAkdGhpc2FycmF5OwogIH0KCiAgZnVuY3Rpb24gTmVvQXBwbHlOZXdWYWx1ZXMoJG9sZHZhbHVlcywgJG5ld3ZhbHVlcywkaWdub3JlYmxhbms9ZmFsc2UpIHsKICAgICRyZXN1bHQ9JG9sZHZhbHVlczsKICAgIGZvcmVhY2goJHJlc3VsdCBhcyAkaW5kZXg9PiR2YWx1ZSkgewogICAgICBpZiAoaXNzZXQoJG5ld3ZhbHVlc1skaW5kZXhdKSkgewogICAgICAgICRyZXN1bHRbJGluZGV4XT0kbmV3dmFsdWVzWyRpbmRleF07CiAgICAgIH0KICAgIH0KICAgIHJldHVybiAkcmVzdWx0OwogIH0KCiAgZnVuY3Rpb24gTWFrZVNpbXBsZUFycmF5KCR0YWJsZSwkZmllbGQsJGFzc29jaWQ9dHJ1ZSkgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5NYWtlU2ltcGxlQXJyYXkoJHRoaXMtPkdldE5hbWUoKSwgJHRhYmxlLCAkZmllbGQsICRhc3NvY2lkKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIE1ha2VTaW1wbGVBcnJheTogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTs7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBNYWtlQXNzb2NBcnJheSgkdGFibGUsJGZpZWxkcykgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5NYWtlQXNzb2NBcnJheSgkdGhpcy0+R2V0TmFtZSgpLCAkdGFibGUsICRmaWVsZHMpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gTWFrZUFzc29jQXJyYXk6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBDaGVja0ZpbGVFeHRlbnNpb24oJGZpbGVuYW1lLCAkYWxsb3dlZGV4dGVuc2lvbnM9YXJyYXkoKSkgewoJCSRleHBsb2RlZGZpbGU9ZXhwbG9kZSgiLiIsJGZpbGVuYW1lKTsKCQkkZXh0PXN0cnRvbG93ZXIoYXJyYXlfcG9wKCRleHBsb2RlZGZpbGUpKTsKCQlpZiAoaW5fYXJyYXkoJGV4dCwkYWxsb3dlZGV4dGVuc2lvbnMpKSByZXR1cm4gdHJ1ZTsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIGZ1bmN0aW9uIE5lb1Rvb2xUaXAoJHBhcmFtcz1hcnJheSgpKSB7CiAgICAkdGV4dD0kdGhpcy0+TlBWKCJ0ZXh0IiwkcGFyYW1zLCI/Iik7CiAgICAkdXJsPSR0aGlzLT5OUFYoInVybCIsJHBhcmFtcywiIik7CiAgICAkdGl0bGU9JHRoaXMtPk5QVigidGl0bGUiLCRwYXJhbXMsIiIpOwogICAgJGNvbnRlbnQ9JHRoaXMtPk5QVigiY29udGVudCIsJHBhcmFtcywiIik7CiAgICAkc3BhbmNsYXNzPSR0aGlzLT5OUFYoInNwYW5jbGFzcyIsJHBhcmFtcywibmVvdG9vbHRpcCIpOwogICAgaWYgKCR1cmwhPSIiKSB7CiAgICAgICRyZXN1bHQ9JzxhIGNsYXNzPSInLiRzcGFuY2xhc3MuJyIgaHJlZj0iJy4kdXJsLiciPic7CiAgICB9IGVsc2UgewogICAgICAkcmVzdWx0PSc8YSBjbGFzcz0iJy4kc3BhbmNsYXNzLiciIHN0eWxlPSJjdXJzb3I6IGRlZmF1bHQ7IiBocmVmPSIjIiBvbmNsaWNrPSJyZXR1cm4gZmFsc2U7Ij4nOwogICAgfQogICAgJHJlc3VsdC49JHRleHQ7CiAgICAkcmVzdWx0Lj0nPHNwYW4+JzsKICAgIGlmICgkdGl0bGUhPSIiKSB7CiAgICAgICRyZXN1bHQuPSI8c3Ryb25nPiIuJHRpdGxlLiI8L3N0cm9uZz48YnIvPiI7CiAgICB9CiAgICAkcmVzdWx0Lj0kY29udGVudDsKICAgICRyZXN1bHQuPSI8L3NwYW4+IjsKICAgICRyZXN1bHQuPSI8L2E+IjsKICAgIHJldHVybiAkcmVzdWx0OwogIH0KCiAgZnVuY3Rpb24gTmVvRW1wdHkoJGluZGV4PSIiLCRkYXRhPWFycmF5KCkpIHsKICAgIGlmICghaXNfYXJyYXkoJGRhdGEpKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChlbXB0eSgkZGF0YSkpIHsKICAgICAgJGRhdGE9JHRoaXMtPl9wYXJhbXM7CiAgICB9CiAgICBpZiAoZW1wdHkoJGRhdGEpKSByZXR1cm4gdHJ1ZTsKICAgIGlmICgkaW5kZXg9PSIiKSByZXR1cm4gdHJ1ZTsKICAgIGlmICghaXNzZXQoJGRhdGFbJGluZGV4XSkpIHJldHVybiB0cnVlOwogICAgaWYgKHRyaW0oJGRhdGFbJGluZGV4XSk9PSIiKSByZXR1cm4gdHJ1ZTsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIGZ1bmN0aW9uIE5lb1ZhbGlkYXRlRW1haWwoJGVtYWlsLCAkYXZvaWRvbmxpbmUgPSBmYWxzZSkgewogICAgaWYgKHByZWdfbWF0Y2goIi9eW2EtekEtWjAtOV9dK0BbYS16QS1aMC05XC1dK1wuW2EtekEtWjAtOVwtXC5dKyRdL2kiLCAkZW1haWwpKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICBpZiAoJGF2b2lkb25saW5lKSByZXR1cm4gdHJ1ZTsKCiAgICBsaXN0KCRVc2VybmFtZSwgJERvbWFpbikgPSBleHBsb2RlKCJAIiwgJGVtYWlsKTsKCiAgICBpZiAoZ2V0bXhycigkRG9tYWluLCAkTVhIb3N0KSkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0gZWxzZSB7CiAgICAgIGlmIChAZnNvY2tvcGVuKCREb21haW4sIDI1LCAkZXJybm8sICRlcnJzdHIsIDMwKSkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gTmVvVmFsaWRhdGVVUkwoJHVybCkgewogICAgLy8kcGF0dGVybiA9ICcvXigoW1x3XSs6KT9cL1wvKT8oKFtcZFx3XXwlW2EtZkEtZlxkXXsyLDJ9KSsoOihbXGRcd118JVthLWZBLWZcZF17MiwyfSkrKT9AKT8oW1xkXHddWy1cZFx3XXswLDI1M31bXGRcd11cLikrW1x3XXsyLDR9KDpbXGRdKyk/KFwvKFstK19+LlxkXHddfCVbYS1mQS1mXGRdezIsMn0pKikqKFw/KCZhbXA7PyhbLStffi5cZFx3XXwlW2EtZkEtZlxkXXsyLDJ9KT0/KSopPygjKFstK19+LlxkXHddfCVbYS1mQS1mXGRdezIsMn0pKik/JC8nOwogICAgcmV0dXJuICggISBwcmVnX21hdGNoKCcvXihodHRwfGh0dHBzfGZ0cCk6XC9cLyhbQS1aMC05XVtBLVowLTlfLV0qKD86XC5bQS1aMC05XVtBLVowLTlfLV0qKSspOj8oXGQrKT9cLz8vaScsICR1cmwpKSA/IEZBTFNFIDogVFJVRTsKCgkgIC8vcmV0dXJuIHByZWdfbWF0Y2goJHBhdHRlcm4sICR1cmwpOwogIH0KCiAgZnVuY3Rpb24gTmVvTm9CcmVha3MoJHN0cmluZykgewogICAgJHN0cmluZz1zdHJfcmVwbGFjZSgiICIsIiZuYnNwOyIsJHN0cmluZyk7CiAgICByZXR1cm4gJHN0cmluZzsKICB9CgogIGZ1bmN0aW9uIE5lb1ByaW50UigkZGF0YT1hcnJheSgpLCRzZW5kb3V0PXRydWUpIHsKICAgIGlmIChlbXB0eSgkZGF0YSkpIHsKICAgICAgJGRhdGE9JHRoaXMtPl9wYXJhbXM7CiAgICB9CiAgICBpZiAoZW1wdHkoJGRhdGEpKSB7CiAgICAgICRkYXRhPSJubyBjb250ZW50IGZvdW5kIjsKICAgIH0KICAgICRvdXRwdXQ9Jzxici8+PGRpdiBzdHlsZT0iYm9yZGVyOjFweCBzb2xpZCBibGFjayI+JzsKICAgICRvdXRwdXQuPSI8cHJlPiI7CiAgICAkb3V0cHV0Lj1wcmludF9yKCRkYXRhLHRydWUpOwogICAgJG91dHB1dC49IjwvcHJlPiI7CiAgICAkb3V0cHV0Lj0iPC9kaXY+PGJyLz4iOwogICAgaWYgKCRzZW5kb3V0KSB7CiAgICAgIGVjaG8gJG91dHB1dDsKICAgIH0KICAgIHJldHVybiAkb3V0cHV0OwogIH0KCiAgZnVuY3Rpb24gTmVvVHJpbUFycmF5KCRpbmFycmF5PWFycmF5KCkpICAgewogICAgJG91dGFycmF5PWFycmF5KCk7CiAgICBmb3JlYWNoICgkaW5hcnJheSBhcyAka2V5PT4kdmFsdWUpIHsKICAgICAgaWYgKHRyaW0oJHZhbHVlKT09IiIpIGNvbnRpbnVlOwogICAgICAkb3V0YXJyYXlbJGtleV09dHJpbSgkdmFsdWUpOwogICAgfQogICAgcmV0dXJuICRvdXRhcnJheTsKICB9CgogIAoKICAvKgogICAqCiAgICogU21hcnR5IHNob3J0Y3V0cwogICAqCiAgICovCiAgZnVuY3Rpb24gU21hcnR5QXNzaWduKCRzbWFydHlpbmZvLCAkc21hcnR5Y29udGVudD0iIikgewogICAgaWYgKCFpc19hcnJheSgkc21hcnR5aW5mbykpIHsKICAgICAgaWYgKCRzbWFydHlpbmZvIT0iIikgewogICAgICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigkc21hcnR5aW5mbywgJHNtYXJ0eWNvbnRlbnQpOwogICAgICB9IGVsc2UgewogICAgICAgIGlmICgkc21hcnR5aW5mbz09IiIpIHsKICAgICAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIFNtYXJ0eUFzc2lnbjogc21hcnR5LXZhcm5hbWUgbm90IHNldCIsZmFsc2UsYXJyYXkoInNtYXJ0eWluZm8iPT4kc21hcnR5aW5mbywic21hcnR5Y29udGVudCI9PiRzbWFydHljb250ZW50KSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgLy9PayBpdCdzIGFuIGFycmF5CiAgICBpZiAoaXNfYXNzb2MoJHNtYXJ0eWluZm8pKSB7CiAgICAgIC8vSXQncyBhbiBhc3NvY19hcnJheSwgc28gd2UgYXNzaWduIGV2ZXJ5IHNpbmdsZSBwYWlyIG9mIGluZm8KICAgICAgZm9yZWFjaCgkc21hcnR5aW5mbyBhcyAkc21hcnR5bmFtZT0+JHNtYXJ0eWNvbnRlbnQpIHsKICAgICAgICBpZiAoaXNfYXJyYXkoJHNtYXJ0eWNvbnRlbnQpKSB7CiAgICAgICAgICAvL2l0J3MgYSBuZXN0ZWQgYXJyYXkKICAgICAgICAgICR0aGlzLT5zbWFydHktPmFzc2lnbl9ieV9yZWYoJHNtYXJ0eW5hbWUsICRzbWFydHljb250ZW50KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCRzbWFydHluYW1lLCAkc21hcnR5Y29udGVudCk7CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgewogICAgICAvL0l0J3Mgbm90IGFuIGFzc29jX2FycmF5LCBzbyB3ZSBzaW1wbHkgcmVmLWFzc2lnbiBpdC4KICAgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduX2J5X3JlZigkc21hcnR5aW5mbywgJHNtYXJ0eWNvbnRlbnQpOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICBmdW5jdGlvbiBOZW9TbWFydHlBc3NpZ24oJHNtYXJ0eWluZm8sICRzbWFydHljb250ZW50PSIiKSB7CiAgICAkdGhpcy0+U21hcnR5QXNzaWduKCRzbWFydHlpbmZvLCAkc21hcnR5Y29udGVudCk7CiAgfQoKICBmdW5jdGlvbiBTbWFydHlBc3NpZ25QcmVmKCRzbWFydHluYW1lLCAkcHJlZmVyZW5jZW5hbWU9IiIpIHsKICAgIGlmICgkcHJlZmVyZW5jZW5hbWUhPSIiKSB7CiAgICAgICR0aGlzLT5TbWFydHlBc3NpZ24oJHNtYXJ0eW5hbWUsICR0aGlzLT5QcmVmKCRwcmVmZXJlbmNlbmFtZSkpOwogICAgfSBlbHNlIHsKICAgICAgJHRoaXMtPlNtYXJ0eUFzc2lnbigkc21hcnR5bmFtZSwgJHRoaXMtPlByZWYoJHNtYXJ0eW5hbWUpKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIFNtYXJ0eUFzc2lnbkNNUygkbW9kdWxlLCRzbWFydHluYW1lPSJtb2R1bGUiKSB7CiAgICBpZiAoaXNfb2JqZWN0KCRtb2R1bGUpKSB7CiAgICAgICR0aGlzLT5zbWFydHktPmFzc2lnbl9ieV9yZWYoJHNtYXJ0eW5hbWUsICRtb2R1bGUpOwogICAgfSBlbHNlIHsKICAgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduX2J5X3JlZigkc21hcnR5bmFtZSwgJHRoaXMtPkdldE1vZHVsZUluc3RhbmNlKCRtb2R1bGUpKTsKICAgIH0KICB9CgogIC8qCiAgICoKICAgKiBEZWJ1Z2dpbmcgZnVuY3Rpb25zCiAgICoKICAgKi8KCiAgZnVuY3Rpb24gRmlyZURlYnVnKCRjb21tYW5kLCRtZXNzYWdlPSIiLCR2YXJpYWJsZXM9YXJyYXkoKSkgewogICAgJGZpcmVwaHBtb2R1bGU9JHRoaXMtPkdldE1vZHVsZUluc3RhbmNlKCdGaXJlUEhQRGVidWcnKTsKICAgIGlmICgkZmlyZXBocG1vZHVsZSkgewogICAgICAvL01vZHVsZSBmb3VuZAogICAgICAkZmlyZXBocG1vZHVsZS0+U2V0TW9kdWxlTmFtZSgkdGhpcy0+R2V0TmFtZSgpKTsKICAgICAgJGZpcmVwaHBtb2R1bGUtPkNvbW1hbmQoJGNvbW1hbmQsICRtZXNzYWdlLCAkdmFyaWFibGVzKTsKICAgIH0gLy9lbHNlIE1vZHVsZSBub3QgZm91bmR9CiAgfQoKCiAgLyoKICAgKgogICAqIEVycm9yIGhhbmRsaW5nCiAgICoKICAgKi8KICBmdW5jdGlvbiBFcnJvcigkZXJyb3J0ZXh0LCRyZXR1cm52YWx1ZT1mYWxzZSwkcGFyYW1zPWFycmF5KCkpIHsKICAgICR0aGlzLT5fZXJyb3JzLj0kZXJyb3J0ZXh0OwogICAgaWYgKCFlbXB0eSgkcGFyYW1zKSAmJiBpc19hcnJheSgkcGFyYW1zKSkgewogICAgICAkdGhpcy0+X2Vycm9ycy49IiAoIjsKICAgICAgJGZpcnN0PXRydWU7IC8vSGFuZGxpbmcgdGhlIGNvbW1hCiAgICAgIGZvcmVhY2ggKCRwYXJhbXMgYXMgJHBhcmFtPT4kdmFsdWUpIHsKICAgICAgICBpZiAoJGZpcnN0KSAkZmlyc3Q9ZmFsc2U7IGVsc2UgJHRoaXMtPl9lcnJvcnMuPSIsIjsKICAgICAgICAkdGhpcy0+X2Vycm9ycy49JHBhcmFtLiI9PiIuJHZhbHVlOwogICAgICB9CiAgICAgICR0aGlzLT5fZXJyb3JzLj0iKSI7CiAgICB9CiAgICAkdGhpcy0+X2Vycm9ycy49IlxuIjsKICAgIHJldHVybiAkcmV0dXJudmFsdWU7CiAgfQoKICBmdW5jdGlvbiBHZXRFcnJvcnMoJG5sMmJyPXRydWUsJGNsZWFyPXRydWUsJGluY2x1ZGVkcz10cnVlKSB7CiAgICAkZXJyb3JzPSR0aGlzLT5fZXJyb3JzOwogICAgaWYgKCRubDJicikgewogICAgICAkZXJyb3JzPW5sMmJyKCRlcnJvcnMpOwogICAgfQogICAgaWYgKCRpbmNsdWRlZHMpIHsKICAgICAgaWYgKCR0aGlzLT5EU0luRXJyb3IoKSkgewogICAgICAgICRlcnJvcnMuPSR0aGlzLT5HZXREU0Vycm9ycygkbmwyYnIsJGNsZWFyKTsKICAgICAgfQogICAgfQogICAgaWYgKCRjbGVhcikgewogICAgICAkdGhpcy0+X2Vycm9ycz0iIjsKICAgIH0KICAgIHJldHVybiAkZXJyb3JzOwogIH0KCiAgZnVuY3Rpb24gT3V0cHV0RXJyb3JzKCRjbGVhcj10cnVlLCRpbmNsdWRlZHM9dHJ1ZSkgewogICAgaWYgKCR0aGlzLT5JbkVycm9yKCkpIHsKICAgICAgZWNobyAiXG5cbjxkaXYgc3R5bGU9J2JvcmRlcjozcHggc29saWQgcmVkPlxuIjsKICAgICAgZWNobyAkdGhpcy0+R2V0RXJyb3JzKHRydWUsJGNsZWFyLCRpbmNsdWRlZHMpOwogICAgICBlY2hvICJcbjwvZGl2PlxuXG4iOwogICAgfQogIH0KCiAgZnVuY3Rpb24gSW5FcnJvcigpIHsKICAgIHJldHVybiAoJHRoaXMtPl9lcnJvcnMhPSIiKTsKICB9CgoKICAvKgogICAqCiAgICogVGhhbmtzIHRvIGh0dHA6Ly93d3cucGhwdG95cy5jb20vZTEwN19wbHVnaW5zL2NvbnRlbnQvY29udGVudC5waHA/Y29udGVudC41OAogICAqIGZvciB0aGVzZSBmdW5jdGlvbnMKICAgKgogICAqLwoKICBmdW5jdGlvbiBhcnJheTJzdHJpbmcoJG15YXJyYXksICYkb3V0cHV0LCAmJHBhcmVudGtleSkgewogICAgZm9yZWFjaCAoJG15YXJyYXkgYXMgJGtleSA9PiAkdmFsdWUpIHsKICAgICAgaWYgKGlzX2FycmF5KCR2YWx1ZSkpIHsKICAgICAgICAkcGFyZW50a2V5IC49ICRrZXkgLiAiXiI7CiAgICAgICAgYXJyYXkyc3RyaW5nKCR2YWx1ZSwgJG91dHB1dCwgJHBhcmVudGtleSk7CiAgICAgICAgJHBhcmVudGtleSA9ICIiOwogICAgICB9IGVsc2UgewogICAgICAgICRvdXRwdXQgLj0gJHBhcmVudGtleSAuICRrZXkgLiAiXiIgLiAkdmFsdWUgLiAiXG4iOwogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBzdHJpbmcyYXJyYXkoJHN0cmluZywgJiRteWFycmF5KSB7CiAgICAkbGluZXMgPSBleHBsb2RlKCJcbiIsICRzdHJpbmcpOwogICAgZm9yZWFjaCAoJGxpbmVzIGFzICR2YWx1ZSkgewogICAgICAkaXRlbXMgPSBleHBsb2RlKCImIzE4MzsiLCAkdmFsdWUpOwogICAgICBpZiAoc2l6ZW9mKCRpdGVtcykgPT0gMikgewogICAgICAgICRteWFycmF5WyRpdGVtc1swXV0gPSAkaXRlbXNbMV07CiAgICAgIH0gZWxzZSBpZiAoc2l6ZW9mKCRpdGVtcykgPT0gMykgewogICAgICAgICRteWFycmF5WyRpdGVtc1swXV1bJGl0ZW1zWzFdXSA9ICRpdGVtc1syXTsKICAgICAgfQogICAgfQogIH0KCn0KPz4K]]></data>
	</file>
	<file>
	  <filename>/templates/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/templates/changelog.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PHVsPgogIDxsaT52ZXJzaW9uIDAuNC4xPC9saT4KICBBZGRlZCBtb3JlIHZhbGlkYXRpb25zLCBlcXVhbCBhbmQgaWRlbnRpY2FsPGJyLz4KICBBZGRlZCBldmVuIHNob3J0ZXIgTmVvVXJsIGFuZCBOZW9MaW5rCiAgUHJlcGFyZWQgZm9yIGNtc21zIDEuMTAKCiAgPGxpPnZlcnNpb24gMC40LjA8L2xpPgogIEFkZGVkIGRhdGV0aW1lcGlja2VyIGFuZCBpbnRlZ3JhdGVkIGl0CgogIDxsaT52ZXJzaW9uIDAuMy41PGJyLz4KICBNdWx0aXBsZSBidWdmaXhlcyBkaXNjb3ZlcmVkIGJ5IFBocFN0b3JtCiAgPGJyLz4KCiAgPGxpPnZlcnNpb24gMC4zLjQ8YnIvPgogIHJld29ya2VkIGZvciBjbXNtcygpLW1ldGhvZHMKICA8YnIvPgoKCiAgPGxpPnZlcnNpb24gMC4zLjM8YnIvPgogIE5ldyBmb3JtdmFsaWRhdGlvbiBtZXRob2RzIGZvciBkcm9wZG93bnMgYW5kIHJhZGlvZ3JvdXBzCiAgPGJyLz4KICAKICA8bGk+dmVyc2lvbiAwLjMuMjxici8+CiAgYWRkZWQgY3NzLWluamVjdGlvbnMgc3R5bGluZyB0aGUgZm9ybXZhbGlkYXRpb24tcG9wdXAKICA8YnIvPgogIHN0YXJ0ZWQgZG9pbmcgc29tZSBleGFtcGxlcyBvZiBob3cgdG8gdXNlIHRoZSBtb2R1bGUtY2xhc3MKCiAgPGxpPnZlcnNpb24gMC4zLjE8YnIvPgogIGZpeGVkIHRoZSB1Z2x5IGNzcyBpbiBib2R5LGl0J3Mgbm93IGphdmFzY3JpcHQKICA8YnIvPgoKPGxpPnZlcnNpb24gMC4zLjA8YnIvPgogICAgYWRkZWQgbmV3IGZ1bmN0aW9uIE5lb1NldFByZWZzLCBzaG9ydGluZyB0aGUgc2F2aW5nIG9mIHByZWZzIGZvciBpbnN0YW5jZQogICAgPGJyLz4KICAgIGFkZGVkIGVhc3kgZm9ybS12YWxpZGF0aW9uIGFuZCBuaWNlIG1lc3NhZ2VzIGxpbmtlZCB0byB0aGF0CiAgICA8YnIvPgogICAgT2Jzb2xldGVkIFNtYXJ0eVVwbG9hZEZvcm1TdGFydC4KICAgIDxici8+CiAgICBBZGRlZCBmdW5jdGlvbiBOZW9UcmltQXJyYXkoJGluYXJyYXk9YXJyYXkoKSkKCiAgPGxpPnZlcnNpb24gMC4yLjg8YnIvPgogICAgYWRkZWQgbmV3IGZ1bmN0aW9uIE5lb0dldE1pbWVUeXBlCiAgICAKICA8bGk+dmVyc2lvbiAwLjIuNzxici8+CiAgICBmaXhlZCBOZW9DbXNMaW5rIGZvciBwcmV0dHkgdXJscywgbWlzc2VkIHRoZSB0YXJnZXRjb250ZW50b25seSBwYXJhbWV0ZXIuLi4KCiAgPGxpPnZlcnNpb24gMC4yLjY8YnIvPgogICAgQWRkZWQgYSBTZXRQcmVmLXNob3J0Y3V0IGFuZCBhIG5pY2UgTmVvU2V0UHJlZi1tZXRob2QgKHNlZSBoZWxwKQogICAgPGJyLz4KICAgIHNldCBlbnRpdHkgcHJvcHMgZnJvbSBhcnJheSBub3cgdXNlcyBzdG9yZWQgcGFyYW1zLXZhbHVlcyBpcyBvdGhlciBub3Qgc3BlY2lmaWVzCiAgICA8YnIvPgogICAgUmV3b3JrZWQgTmVvUmVkaXJlY3QoRnVsbCkgdG8gYmUgZmFzdGVyIHRvIHVzZQogICAgPGJyLz4KICAgIEFkZGVkIE5lb1ZhbGlkYXRlVVJMLW1ldGhvZAogICAgPGJyLz4KICAgIEFkZGVkIERlY29kZUhUTUxFbnRpdGllcwogICAgPGJyLz4KICAgIEFkZGVkIE5lb0FkbWluUmV0dXJuCgoKICA8bGk+dmVyc2lvbiAwLjIuNTxici8+CiAgICBBZGRlZCBhbiBvcHRpb24gdG8gTmVvQWRkSWNvbiB0byBhbHNvIGluY2x1ZGUgdGhlIGZvbGxpbmdzIHRleHQgbGluawogICAgPGJyLz4KICAgIEFkZGVkIElzVGFibGVFbXB0eQogICAgPGJyLz4KICAgIFVwZGF0ZSBFbWFpbFZhbGlkYXRpb24gdG8gbWFpbC1jYXBhYmlsaXRpZXMgb2YgZG9tYWluIGFzIHdlbGwKICAgIDxici8+CiAgICBNYWRlIDJuZCBwYXJhbSB0byBOZW9Qw4VhcmFtVmFsdWUgZG91YmxlIGFzIGRlZmF1bHQgdmFsdWUgKHdoZW4gbm90IGFuIGFycmF5KQoKCgogIDxsaT52ZXJzaW9uIDAuMi40PGJyLz4KICAgIEFkZGVkIE5lb0VtcHR5LWZ1bmN0aW9uIHdoaWNoIGNoZWNrcyBmb3IgYW4gaW5kZXggaW4gYW4gYXJyYXkKICAgIDxici8+CiAgICBNYWRlIE5lb1ByaW50UiBvdXRwdXQgY29udGVudCBvZiAkX3BhcmFtcyBpZiBubyBwYXJhbWV0ZXIgd2FzIGdpdmVuCiAgICA8YnIvPkFkZGVkIE5lb1ZhbGlkYXRlRW1haWwtZnVuY3Rpb24KICAgIDxici8+QWRkZWQgTmVvTm9CcmVha3MtZnVuY3Rpb24KCiAgPGxpPnZlcnNpb24gMC4yLjM8YnIvPgogICAgTm93IHBvc3NpYmxlIHRvIHJlZ2lzdGVyICRwYXJhbXMgZm9yIGV2ZW4gZWFzaWVyIHN5bnRheCBpbiByZWxldmFudCBmdW5jdGlvbnMgbGlrZSBOUFYKICAgIDxici8+CiAgICBBZGRlZCBDcmVhdGVJbnB1dFBhc3N3b3JkLXdyYXBwZXIKICAgIDxici8+CiAgICBBZGRlZCBmaWxsIHBhcmFtZXRlciB0byBTZXRFbnRpdHlQcm9wc0Zyb21BcnJheQoKCiAgPGxpPnZlcnNpb24gMC4yLjI8YnIvPgogICAgQWRkZWQgYSBjdXN0b20gcmV0dXJudmFsdWUgdG8gY2hlY2tlbnRpdHljb25uZWN0aW9ucwogICAgPGJyLz4KICAgIEltcGxlbWVudGVkIE1ha2VTaW1wbGVBcnJheQogICAgPGJyLz4KICAgIEFkZGVkIE5lb1RydWVJY29uIGFuZCAgTmVvVHJ1ZUljb24KCiAgPGxpPnZlcnNpb24gMC4yLjE8YnIvPgogICAgYWRkZWQgYXJyYXlfZGlmZl9rZXkgaW1wbGVtZW50YXRpb24gZm9yIHByZS01LjEuMCB2ZXJzaW9uCiAgICA8YnIvPgogICAgQWRkZWQgJGFsd2F5c3JldHVybmFycmF5PWZhbHNlIHRvIEdldEVudGl0aWVzKEZ1bGwpLW1ldGhvZHMKICAgIDxici8+CiAgICBBZGRlZCBTbWFydEFzc2lnblByZWYtbWV0aG9kCiAgICA8YnIvPgogICAgQWRkZWQgVG9vbHRpcC1TdXBwb3J0CiAgICA8YnIvPgogICAgQWRkZWQgTmVvUmVkaXJlY3QtZnVuY3Rpb24KCiAgPGxpPnZlcnNpb24gMC4yLjA8YnIvPgogICAgLSBnZW5lcmFsIGJ1Z2ZpeGluZzxici8+CiAgICAtIEFkZGVkIGEgTmVvRGlyTGlzdC1mdW5jdGlvbjxici8+CiAgICAtIEZpeGVkIG5hbWUgZXJyb3Igb24gTmVvSW5wdXREcm9wZG93bjxici8+CiAgICAtIGFkZGVkIHN1cHBvcnQgZm9yIDNyZCBwYXJhbWV0ZXIgdG8gU2xhc2gtZnVuY3Rpb248YnIvPgogICAgLSBhZGRlZCBOZW9DbXNMaW5rIGFuZCBOZW9DbXNVcmwgc2hvcnRjdXRzPGJyLz4KICAgIC0gYWRkZWQgU21hcnR5VXBsb2FkRm9ybVN0YXJ0PGJyLz4KICAgIC0gYWRkZWQgU21hcnR5SW5wdXRNdWx0aUhpZGRlbjxici8+CgogIDwvbGk+CiAgPGxpPnZlcnNpb24gMC4xLjA8YnIvPgogICAgLSBpbml0aWFsIHJlbGVhc2U8L2xpPgo8L3VsPg==]]></data>
	</file>
	<file>
	  <filename>/templates/help.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PHN0cm9uZz5Ob3RpY2UhIFRoaXMgaXMgYSBtb2R1bGUtZGV2ZWxvcGVyLW9ubHkgbW9kdWxlLiBJZiB5b3UgYXJlIG5vdCBhIGRldmVsb3Blcgp5b3UnbGwgcHJvYmFibHkganVzdCB3YW50IHRvIHNraXAgdGhlIGdvcnkgZGV0YWlscyBvZiB0aGlzIHBhZ2UgYW5kIHJlbHkgb24gdGhhdAp0aGUgbW9kdWxlIGp1c3QgZG9lcyBpdCdzIHdvcmsuPC9zdHJvbmc+CjxoMz5QdXJwb3NlIG9mIHRoZSBtb2R1bGU8L2gzPgpUaGUgcHVycG9zZSBvZiB0aGlzIG1vZHVsZSBpcyB0byBjdXQgb2ZmIG9uIGRldmVsb3BtZW50dGltZSBwcm92aWRpbmcgc29tZQplYXN5IHRvIHVzZSBmdW5jdGlvbnMgZXh0ZW5kaW5nIHRoZSBtb2R1bGUtQVBJIG9mIENNUyBNYWRlIFNpbXBsZS4gVGhpcyBpbmNsdWRlcywKYnV0IGlzIG5vIGxpbWl0ZWQgdG8sIHNob3J0Y3V0cyB0byBOZW9EYXRhU3RvcmFnZS1mdW5jaW9uYWxpdHksIGEgY291cGxlIG9mIG5pY2UKU21hcnR5LXNob3J0Y3V0cywgRmlyZVBIUC1pbnRlZ3JhdGlvbiBldGMuCjxoMz5Vc2FnZSBvZiB0aGUgbW9kdWxlPC9oMz4KVG8gdXNlIHRoaXMgZXh0ZW5kZWQgbW9kdWxlLWNsYXNzIHlvdSBzaG91bGQgaW5oZXJpdCBmcm9tIE5lb01vZHVsZS1jbGFzcyBpbnN0ZWFkCm9mIHRoZSB1c3VhbCBDTVNNb2R1bGUtY2xhc3MuIFRoaXMgY2FuIGJlIGRvbmUgbGlrZSB0aGlzOgo8cHJlPgpyZXF1aXJlX29uY2UoZGlybmFtZShkaXJuYW1lKF9fRklMRV9fKSkuIi9OZW9Nb2R1bGUvTmVvTW9kdWxlLm1vZHVsZS5waHAiKTsKY2xhc3MgTXlNb2R1bGUgZXh0ZW5kcyBOZW9Nb2R1bGUgewo8L3ByZT4KSWYgeW91IHdpc2ggdG8gdXNlIHRoZSBOZXdEYXRhU3RvcmFnZSBmdW5jdGlvbmFsaXR5LCB5b3Ugc2hvdWxkIG9mIGNvdXJzZSBhbHNvCmluc3RhbGwgdGhhdCBtb2R1bGUuCjxoMz5Ib3cgdG8gZ2V0IGhlbHA8L2gzPgpJIHdpbGwgcmVwZWF0LCB0aGlzIG1vZHVsZSBpcyBmb3IgZGV2ZWxvcGVycyBvbmx5LiBJZiB5b3UgY2Fubm90IHJlYWQgcGhwLXNvdXJjZSBjb2RlLAp5b3Ugc2hvdWxkIHVzZSBpdCBmb3IgZGV2ZWxvcG1lbnQgYW55d2F5LiBJZiB5b3UgY2FuLCBhbHdheXMgY2hlY2sgb3V0IHRoZSBjb2RlIApmb3IgaGludHMgb24gaG93IHRvIG1ha2UgaXQgd29yay4gSWYgeW91IHN0aWxsIGhhdmUgcXVlc3Rpb25zIG9yIHN1Z2dlc3Rpb25zIGZvcgpmaXhlcy9pbXByb3ZlbWVudHMsIHBsZWFzZSBmZWVsIGZyZWUgdG8gY2F0Y2ggbWUgKFNpbG1hcmlsbGlvbikgaW4gdGhlIGZvcnVtIG9nICNpcmMuCgo8aDM+TGlzdCBvZiBtZXRob2RzPC9oMz4KSSB3aWxsIHRyeSB0byBrZWVwIHRoaXMgbGlzdCB1cHRvZGF0ZSwgYnV0IGZvciBtb3N0IHJlY2VudCBsaXN0LCBwbGVhc2UKY2hlY2sgdGhlIE5lb01vZHVsZS5tb2R1bGUucGhwLWZpbGUgaXRzZWxmLiBTb21lIGRvY3VtZW50YXRpb24gb2YgdGhlIG1ldGhvZHMKbWF5IGV2ZW4gc25lYWsgaW4gdGhlcmUgc29tIGRheS4KPHByZT4KLyoKICoKICogU2V0dXAgZnVuY3Rpb25zCiAqCiAqLwoKZnVuY3Rpb24gU2V0SWQoJGlkKQpmdW5jdGlvbiBOZW9TZXRJZCgkaWQpCmZ1bmN0aW9uIE5lb1NldFJldHVybklkKCRyZXR1cm5pZCkKZnVuY3Rpb24gTmVvU2V0dXAoJGlkLCRtb2R1bGUsJHJldHVybmlkPSIwIiwkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb1NldFBhcmFtcygkcGFyYW1zKTsKCiAgLyoKICAgKgogICAqIEdlbmVyYWwgc2hvcnRjdXQgZnVuY3Rpb25zCiAgICoKICAgKi8KZnVuY3Rpb24gUHJlZigkcHJlZm5hbWUsJGRlZmF1bHQ9IiIpCmZ1bmN0aW9uIFNldFByZWYoJHByZWZuYW1lLCAkdmFsdWUpIHsKCi8vU2V0cyBhIHByZWZlcmVuY2UgdG8gdGhlIHZhbHVlIG9mIHRoZSBzYW1lIG5hbWUgaW4gdGhlICRwYXJhbXMtYXJyYXkgc2V0IGJ5IE5lb1NldFVwLgovL09wdGlvbmFsbHkgZGVsZXRpbmcgYXNzaWduaW5nIGEgdmFsdWUgb3IgZGVsZXRpbmcgdGhlIHByZWZlcmVuY2UgaWYgbm90IHNldCBpbiB0aGlzIGFycmF5CmZ1bmN0aW9uIE5lb1NldFByZWYoJHByZWZuYW1lLCAkbm90c2V0dmFsdWU9IiIsICRkZWxldGVpZm5vdHNldD1mYWxzZSkKZnVuY3Rpb24gTmVvU2V0UHJlZnMoJHByZWZzPWFycmF5KCkpIC8vcmVxdWlyZXMgYW4gYXNzb2NpYXRlZCBhcnJheSBvZiAkcHJlZm5hbWVzPT4kbm90c2V0dmFsdWUKZnVuY3Rpb24gTmVvQ21zTGluaygkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb0Ntc1VybCgkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb1JlZGlyZWN0KCRhY3Rpb249IiIsJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBOZW9SZWRpcmVjdEZ1bGwoJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBOZW9BZG1pblJldHVybigkcGFyYW1zPWFycmF5KCkpCi8qCiAqCiAqIEZvcm0tZ2VuZXJhdGlvbiBmdW5jdGlvbnMKICoKICovCgpmdW5jdGlvbiBOZW9Gb3JtU3RhcnQoJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBOZW9Gb3JtRW5kKCRwYXJhbXM9YXJyYXkoKSkKZnVuY3Rpb24gTmVvSW5wdXRUZXh0KCRwYXJhbXM9YXJyYXkoKQpmdW5jdGlvbiBOZW9UZXh0YXJlYSgkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb0lucHV0Q2hlY2tib3goJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBOZW9JbnB1dFN1Ym1pdCgkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb0lucHV0UmVzZXQoJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBOZW9JbnB1dElucHV0RHJvcGRvd24oJHBhcmFtcz1hcnJheSgpKQoKLyogZnVuY3Rpb24gYmVsb3cgaW5jbHVkZSBzbWFydHlhc3NpZ25tZW50LCBkb2VzIG5vdCByZXR1cm4gYW55dGhpbmcgKi8KZnVuY3Rpb24gU21hcnR5Rm9ybVN0YXJ0KCRzbWFydHluYW1lLCRwYXJhbXM9YXJyYXkoKSkKCmZ1bmN0aW9uIFNtYXJ0eUZvcm1FbmQoJHNtYXJ0eW5hbWUpCmZ1bmN0aW9uIFNtYXJ0eUlucHV0U3VibWl0KCRzbWFydHluYW1lLCRwYXJhbXMpCgpmdW5jdGlvbiBTbWFydHlJbnB1dFRleHQoJHNtYXJ0eW5hbWUsJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBTbWFydHlJbnB1dENoZWNrYm94KCRzbWFydHluYW1lLCRwYXJhbXM9YXJyYXkoKSkKCmZ1bmN0aW9uIFNtYXJ0eUlucHV0SGlkZGVuKCRzbWFydHluYW1lLCRuYW1lLCR2YWx1ZSkKb3IKZnVuY3Rpb24gU21hcnR5SW5wdXRIaWRkZW4oJHNtYXJ0eW5hbWUsJHBhcmFtcykKCmZ1bmN0aW9uIFNtYXJ0eUlucHV0TXVsdGlIaWRkZW4oJHNtYXJ0eW5hbWUsJGZpZWxkcz1hcnJheSgpKQoKLyoKICoKICogTmVvRGF0YVN0b3JhZ2Ugc2hvcnRjdXRzCiAqCiAqLwpmdW5jdGlvbiBBZGRFbnRpdHkoJHRhYmxlLCAkcHJvcHM9YXJyYXkoKSkKZnVuY3Rpb24gRGVsZXRlRW50aXR5KCRpZCkKZnVuY3Rpb24gR2V0RW50aXR5KCRpZCwgJG92ZXJyaWRlcHJvcHM9YXJyYXkoKSkKZnVuY3Rpb24gR2V0RW50aXRpZXMoJHRhYmxlPSIiLCAkY3JpdGVyaWE9YXJyYXkoKSwgJGFsd2F5c3JldHVybmFycmF5PWZhbHNlKQpmdW5jdGlvbiBHZXRPbmVFbnRpdHkoJHRhYmxlLCAkY3JpdGVyaWE9YXJyYXkoKSwgJGZhaWxpZm11bHRpcGxlPWZhbHNlKQpmdW5jdGlvbiBHZXRFbnRpdGllc0Z1bGwoJHRhYmxlPSIiLCAkY3JpdGVyaWE9YXJyYXkoKSwgJGFsd2F5c3JldHVybmFycmF5PWZhbHNlKQpmdW5jdGlvbiBTZXRFbnRpdHlQcm9wKCRpZCwkcHJvcG5hbWUsJHByb3B2YWx1ZSwkcHJvcHR5cGU9InVuZGVmaW5lZCIpCmZ1bmN0aW9uIENsZWFyRW50aXR5UHJvcCgkaWQsICRwcm9wbmFtZSkKZnVuY3Rpb24gU2V0RW50aXR5UHJvcHMoJGlkLCAkcHJvcHMsICRjbGVhcj10cnVlKQpmdW5jdGlvbiBTZXRFbnRpdHlQcm9wc0Zyb21BcnJheSgkaWQsICRwcm9wcywgJHZhbHVlcywgJGNsZWFyPXRydWUsICRmaWxsPWZhbHNlKQpmdW5jdGlvbiBTZXRFbnRpdHlQcm9wc09uQ3JpdGVyaWEoJHRhYmxlLCAkcHJvcHMsICRjcml0ZXJpYSwgJGNyZWF0ZT10cnVlLCAkY2xlYXI9ZmFsc2UpIC8vRG9lcyBub3Qgd29yawpmdW5jdGlvbiBSZXNldEVudGl0eVByb3BzKCRpZCwgJG5ld3Byb3BzPWFycmF5KCkpCmZ1bmN0aW9uIFJlbW92ZU1vZHVsZUVudGl0aWVzKCkKZnVuY3Rpb24gQ2xlYXJFbnRpdHlQcm9wcygkaWQpCmZ1bmN0aW9uIENvbXBhcmVFbnRpdGllcygkZW50aXR5MSwgJGVudGl0eTIsICRzb3J0ZmllbGQpCmZ1bmN0aW9uIENvbXBhcmVFbnRpdGllc0NvbXBsZXgoJGVudGl0eTEsICRlbnRpdHkyLCAkc29ydGZpZWxkcykKZnVuY3Rpb24gU29ydEVudGl0aWVzKCRsaXN0LCAkc29ydGZpZWxkcykKZnVuY3Rpb24gRW50aXRpZXNDb3VudCgkdGFibGU9IiIsICRjcml0ZXJpYT1hcnJheSgpKQpmdW5jdGlvbiBDbGVhck1vZHVsZUVudGl0aWVzKCkKZnVuY3Rpb24gU2V0RW50aXR5Q29ubmVjdGlvbigkaWQxLCAkaWQyLCAkdHlwZT0iIikKZnVuY3Rpb24gQ2xlYXJFbnRpdHlDb25uZWN0aW9ucygkaWQxLCAkaWQyPS0xLCAkdHlwZT0iIikKZnVuY3Rpb24gQ2xlYXJFbnRpdHlDb25uZWN0aW9uKCRpZDEsICRpZDIsICR0eXBlPSIiKQpmdW5jdGlvbiBDaGVja0VudGl0eUNvbm5lY3Rpb24oJGlkMSwkaWQyLCR0eXBlPSIiLCRyZXR1cm52YWx1ZT10cnVlKQpmdW5jdGlvbiBHZXRFbnRpdHlDb25uZWN0aW9ucygkaWQxLCAkaWQyPS0xLCAkdHlwZT0iIikKZnVuY3Rpb24gQWRkRmllbGRTZXQoJG5hbWUsJGZpZWxkcykKZnVuY3Rpb24gR2V0RmllbGRTZXQoJG5hbWUpCmZ1bmN0aW9uIEVudGl0eVNldFVuc2V0UHJvcHMoJGVudGl0eSwkZmllbGRzZXQsJGZpbGx2YWx1ZT0iIikgewpmdW5jdGlvbiBHZXREU0Vycm9ycygkbmwyYnI9dHJ1ZSwkY2xlYXI9dHJ1ZSkKZnVuY3Rpb24gT3V0cHV0RFNFcnJvcnMoJGNsZWFyPXRydWUpCmZ1bmN0aW9uIERTSW5FcnJvcigpCmZ1bmN0aW9uIE1ha2VTaW1wbGVBcnJheSgkdGFibGUsJGZpZWxkKQpmdW5jdGlvbiBNYWtlQXNzb2NBcnJheSgkdGFibGUsJGZpZWxkcykKCgovKgogKgogKiBMaW5rIGFuZCBpY29uIGZ1bmN0aW9ucwogKgogKi8KCmZ1bmN0aW9uIE5lb0RlbGV0ZUljb24oJGFjdGlvbiwkdGV4dCwkcGFyYW1zPWFycmF5KCksJGNvbmZpcm1hdGlvbj0iIikKZnVuY3Rpb24gTmVvQ29weUljb24oJGFjdGlvbiwkdGV4dCwkcGFyYW1zPWFycmF5KCksJGNvbmZpcm1hdGlvbj0iIikKZnVuY3Rpb24gTmVvRWRpdEljb24oJGFjdGlvbiwkdGV4dCwkcGFyYW1zPWFycmF5KCksJGNvbmZpcm1hdGlvbj0iIikKZnVuY3Rpb24gTmVvQWRkSWNvbigkYWN0aW9uLCR0ZXh0LCRwYXJhbXM9YXJyYXkoKSwkY29uZmlybWF0aW9uPSIiKQpmdW5jdGlvbiBOZW9UcnVlSWNvbigkYWN0aW9uLCR0ZXh0LCRwYXJhbXM9YXJyYXkoKSwkY29uZmlybWF0aW9uPSIiKQpmdW5jdGlvbiBOZW9GYWxzZUljb24oJGFjdGlvbiwkdGV4dCwkcGFyYW1zPWFycmF5KCksJGNvbmZpcm1hdGlvbj0iIikKZnVuY3Rpb24gTmVvU3lzdGVtSWNvbigkaWNvbiwkdGV4dD0iIikKCi8qCiAqCiAqIFV0aWxpdHkgZnVuY3Rpb25zCiAqCiAqLwpmdW5jdGlvbiBOZW9TbGFzaGVzKCR1cmwpCmZ1bmN0aW9uIERlY29kZUhUTUxFbnRpdGllcygkcykKZnVuY3Rpb24gU2xhc2goJHN0ciwkc3RyMj0iIiwkc3RyMz0iIikKZnVuY3Rpb24gU2xhc2hlcygkdXJsKQpmdW5jdGlvbiBpc19hc3NvYygkYXJyYXkpCmZ1bmN0aW9uIE5lb0Rpckxpc3QoJHJvb3QsJHdoYXQ9ImZpbGVzIiwkaW50cm9kdWN0aW9uPWFycmF5KCksJGV4Y2x1ZGVzPWFycmF5KCkpCmZ1bmN0aW9uIE5lb0dldE1pbWVUeXBlKCRmaWxlbmFtZSkKCi8qQ2hlY2tzIGZvciB0aGUgZXhpc3RlbmNlIG9mIGFuIGluZGV4IGluIGFuIGFycmF5IGFuZCByZXR1cm4gdGhlIHZhbHVlIGlmIGl0J3MgdGhlcmUKICphbmQgdGhlIGRlZmF1bHQgdmFsdWUgaWYgaXQncyBub3QKKi8KZnVuY3Rpb24gTmVvUGFyYW1WYWx1ZSgkbmFtZSwkcGFyYW1zLCRkZWZhdWx0PSIiKQoKLy9TaG9ydGN1dCBmb3IgdGhlIGFib3ZlCmZ1bmN0aW9uIE5QVigkbmFtZSwgJHBhcmFtcykKZnVuY3Rpb24gTmVvQXBwbHlQYXJhbVZhbHVlcygkdGhpc2FycmF5LCAkcGFyYW1zLCAkaW5kZXhlcywgJGFsd2F5c2ZpbGw9ZmFsc2UpCmZ1bmN0aW9uIENoZWNrRmlsZUV4dGVuc2lvbigkZmlsZW5hbWUsICRhbGxvd2VkZXh0ZW5zaW9ucz1hcnJheSgpKQoKLy9Gb3Igbm93LCByZWFkIHNvdXJjZSB0byB1bmRlcnN0YW5kCmZ1bmN0aW9uIE5lb1Rvb2xUaXAoJHBhcmFtcz1hcnJheSgpKSAvL3JlcXVpcmVzIDIgY3NzLWNsYXNzZXMgdG8gYmUgc2V0IHVwCgovL0NoZWNrcyBib3RoIHdoZXRoZXIgdGhlIGluZGV4IGV4aXN0cyBpbiB0aGUgYXJyYXkgYW5kIHdoZXRoZXIgaXQgaGFzIGEgdmFsdWUgZGlmZmVyZW50IGZvbXIgbm90aGluZyBvdCBvbmx5IHNwYWNlcwpmdW5jdGlvbiBOZW9FbXB0eSgkaW5kZXg9IiIsJGRhdGE9YXJyYXkoKSkKCi8vVmFsaWRhdGVzIGFuIGVtYWlsYWRyZXNzLCBvcHRpb25hbGx5IGF2b2lkaW5nIGNoZWNraW5nIHRoZSBteC1hdmFpbGFiaWxpdHkgb2YgdGhlIGRvbWFpbgpmdW5jdGlvbiBOZW9WYWxpZGF0ZUVtYWlsKCRlbWFpbCwgJGF2b2lkb25saW5lID0gZmFsc2UpCgovL1ZhbGlkYXRlcyBhbiB1cmwKZnVuY3Rpb24gTmVvVmFsaWRhdGVVUkwoJHVybCkgewoKLy9SZXR1cm5zIGEgdmVyc2lvbiBvZiB0aGUgc3RyaW5nIHdoaWNoIGNhbm5vdCAocGVyaGFwcykgYmUgbGluZS1icm9rZW4KZnVuY3Rpb24gTmVvTm9CcmVha3MoJHN0cmluZykKCi8vc2FtZSBhcyBwcmludF9yLCBidXQgd3JhcHMgaW4gPHByZT4ncyBhbmQgaW4gYSBkaXYgdHJ5aW5nIHRvIG1ha2UgaXQgbW9yZSByZWFkYWJsZQpmdW5jdGlvbiBOZW9QcmludFIoJGRhdGE9YXJyYXkoKSwkc2VuZG91dD10cnVlKQoKLy9yZW1vdmVkIGtleS92YWx1ZXMgd2hlcmUgdHJpbSh2YWx1ZSkgaXMgZW1wdHkgYW5kIHRyaW1zIHZhbHVlcyBpZiBub3QKZnVuY3Rpb24gTmVvVHJpbUFycmF5KCRpbmFycmF5PWFycmF5KCkpCgovKgogKgogKiBTbWFydHkgc2hvcnRjdXRzCiAqCiAqLwpmdW5jdGlvbiBTbWFydHlBc3NpZ24oJHNtYXJ0eWluZm8sICRzbWFydHljb250ZW50PSIiKQpmdW5jdGlvbiBTbWFydHlBc3NpZ25QcmVmKCRzbWFydHluYW1lLCAkcHJlZmVyZW5jZW5hbWU9IiIpIHsKZnVuY3Rpb24gU21hcnR5QXNzaWduQ01TKCRtb2R1bGUsJHZhcm5hbWU9ImNtcyIpCmZ1bmN0aW9uIFNtYXJ0eVVwbG9hZEZvcm1TdGFydCgkc21hcnR5bmFtZSwkcGFyYW1zPWFycmF5KCkpIHsKCi8qCiAqCiAqIERlYnVnZ2luZyBmdW5jdGlvbnMKICoKICovCmZ1bmN0aW9uIEZpcmVEZWJ1ZygkY29tbWFuZCwkbWVzc2FnZT0iIiwkdmFyaWFibGVzPWFycmF5KCkpCgovKgogKgogKiBFcnJvciBoYW5kbGluZwogKgogKi8KZnVuY3Rpb24gRXJyb3IoJGVycm9ydGV4dCwkcmV0dXJudmFsdWU9ZmFsc2UsJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBHZXRFcnJvcnMoJG5sMmJyPXRydWUsJGNsZWFyPXRydWUsJGluY2x1ZGVkcz10cnVlKQpmdW5jdGlvbiBPdXRwdXRFcnJvcnMoJGNsZWFyPXRydWUsJGluY2x1ZGVkcz10cnVlKQpmdW5jdGlvbiBJbkVycm9yKCkKPC9wcmU+]]></data>
	</file>
</module>
