<?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>RDMap</name>
	<version>0.5.3</version>
    <mincmsversion>2.0</mincmsversion>
	<help><![CDATA[PGgzPldoYXQgaXMgdGhpcyB0aGluZz88L2gzPgo8cD5UaGUgUkQgTWFwIG1vZHVsZSBjYW4gZGlzcGxheSBhIG1hcCBvbiBhIHBhZ2UuIFRoYXQncyBhYm91dCBpdCwgcmVhbGx5LiBBIG1hcCBoYXMgYSBiYXNlbWFwIGxheWVyLCBhbmQgY2FuIGhhdmUgYW4gb3ZlcmxheSBsYXllci48L3A+PGgzPkhvdyBEbyBJIFVzZSBJdD88L2gzPgo8cD5XaGVuIGVkaXRpbmcgYSBwYWdlIChvciB0ZW1wbGF0ZSksIHBsYWNlIHRoZSB7UkRNYXB9IHRhZyBzb21ld2hlcmUuIFRoZSBtYXAgdGFnIGhhcyBvbmUgcmVxdWlyZWQgYXJndW1lbnQsIHRoYXQgb2YgdGhlIG5hbWUgb2YgdGhlIG1hcCB0byBpbmNsdWRlLCBsaWtlIHNvOiA8dHQ+e1JETWFwJm5ic3A7bmFtZT0mbHQ7bWFwX25hbWUmZ3Q7fTwvdHQ+LjwvcD4KPGgzPkNyZWF0aW5nIE1hcHM8L2gzPjxwPgpTbyBmYXIsIHRoZSBkZWZhdWx0IG1hcCB0ZW1wbGF0ZSByZXF1aXJlcyBhbiBBcmNHSVMgdGlsZWQgbWFwIHNlcnZpY2UgZm9yIGEgYmFzZW1hcCwgYW5kIGFuIEFyY0dJUyBmZWF0dXJlIHNlcnZpY2UgZm9yIHRoZSBvdmVybGF5IG1hcC4gVGhlIG1hcCB0ZW1wbGF0ZXMgYXJlIGNvbXBsZXRlbHkgY3VzdG9taXphYmxlLCBob3dldmVyLgo8aDQ+TWFwIE5hbWVzIGFuZCBUaXRsZXM8L2g0Pgo8cD5UaGUgbWFwIG5hbWUgaXMgYSBoYW5keSBuYW1lIHRoYXQgdGhlIHNpdGUgYWRtaW5pc3RyYXRvciBjYW4gdXNlIHRvIHJlZmVyZW5jZSB0aGUgbWFwIG9uIHRoZSBwYWdlcyB3aGVyZSBpdCBhcHBlYXJzLiBUaGUgc2l0ZSB1c2VycyBzaG91bGQgbmV2ZXIgc2VlIGl0LiBUaGUgbWFwIHRpdGxlIHNob3dzIHVwIGluIHRoZSBkZWZhdWx0IHRlbXBsYXRlIHJpZ2h0IGFib3ZlIHRoZSBtYXAuCjwvcD48aDQ+QmFzZW1hcHM8L2g0PjxwPlRoZSBiYXNlbWFwIHNob3VsZCBiZSB0aGUgVVJMIHRvIHRoZSBzZXJ2aWNlIHRoYXQgcHJvdmlkZXMgdGhlIHJhc3RlciBiYXNlbWFwIHRpbGVzLiBCeSBkZWZhdWx0IHRoaXMgaXMgQXJjR0lTIFNlcnZlciwgYW5kIHNob3VsZCBiZSB0aGUgVVJMIHJpZ2h0IHVwIHRvIChhbmQgaW5jbHVkaW5nKSB0aGUgTWFwU2VydmVyIHBhcnQuIEFueSBvdGhlciBraW5kIG9mIGJhc2VtYXAgc2VydmljZSB3aWxsIHJlcXVpcmUgYSBjdXN0b21pemVkIHRlbXBsYXRlIHRvIHN1cHBvcnQuPC9wPgo8aDQ+SW5pdGlhbCBNYXAgRXh0ZW50PGg0PjxwPgpUaGUgaW5pdGlhbCBtYXAgZXh0ZW50IHNldHRpbmcgZGV0ZXJtaW5lcyB3aGVyZSB0aGUgY2VudHJlIG9mIHRoZSBtYXAgYW5kIHRoZSB6b29tIGxldmVsIGFzIHRoZSBtYXAgbG9hZHMuIFRoZSBleHRldG50IHNob3VsZCBiZSBmb3JtYXR0ZWQgYXMgPHR0PmxhdC9sb25nL3pvb208L3R0Piwgd2hlcmUgPHR0PmxhdDwvdHQ+IGFuZCA8dHQ+bG9uZzwvdHQgYXJlIGluIGRlY2ltYWwgZGVncmVlcywgYW5kIHRoZSA8dHQ+em9vbTwvdHQ+IGlzIGFuIGludGVnZXIgYmV0d2VlbiAxIGFuZCAyMC48L3A+CjxoND5NYXAgT3ZlcmxheSBhbmQgT3ZlcmxheSBQYXJhbWV0ZXJzPC9oND48cD4KV2l0aCB0aGUgZGVmYXVsdCB0ZW1wbGF0ZSwgdGhlIG1hcCBvdmVybGF5IGlzIHRyZWF0ZWQgYXMgYW4gQXJjR0lTIFJFU1QgRmVhdHVyZVNlcnZlciBsYXllci4gT3RoZXIgc2VydmljZXMgYXJlIHBvc3NpYmxlIChhcyB1c3VhbCkgd2l0aCBhIGN1c3RvbWl6ZWQgdGVtcGxhdGUuIFRoZSBvcHRpb25hbCBvdmVybGF5IHBhcmFtZXRlcnMgYXJlIGV4dHJhIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gYmUgYWRkZWQgb24gdG8gZXZlcnkgcmVxdWVzdCB0byB0aGUgc2VydmVyLCBhbmQgbWlnaHQgYmUgc29tZXRoaW5nIGxpa2U8L3A+CjxwcmU+d2hlcmU9TkFNRSBMSUtFICJTVEFUSU9OIjwvcHJlPgo8cD5Gb3IgdGhlIGRlZmF1bHQgdGVtcGxhdGUsIHRoZSBvbmx5IGN1cnJlbnRseSBzdXBwb3J0ZWQgcGFyYW1ldGVycyBhcmUgPHR0PndoZXJlPC90dD4gYW5kIDx0dD50b2tlbjwvdHQ+Lgo8cD5NdWx0aXBsZSBwYXJhbWV0ZXJzIGNhbiBiZSBzZXBhcmF0ZWQgYnkgc2VtaWNvbG9ucy4KPC9wPjxoMz5QYXJhbWV0ZXJzPC9oMz48dWw+PGxpPjxlbT4ob3B0aW9uYWwpPC9lbT4gbmFtZT0iIiAtIFRoZSBuYW1lIG9mIHRoZSBtYXAgdG8gYmUgcGxhY2VkIG9uIHRoZSBwYWdlLiBUaGlzIG5hbWUgd29uJ3Qgc2hvdyB1cCBhbnl3aGVyZSB0aGUgc2l0ZSB1c2VycyBjYW4gc2VlLCBhbmQgY2FuJ3QgaGF2ZSBhbnkgc3BhY2VzIG9yIHNwZWNpYWwgY2hhcmFjdGVycy48L2xpPjwvdWw+]]></help>
	<about><![CDATA[PGJyIC8+VmVyc2lvbjogMC41LjM8YnIgLz4=]]></about>
	<file>
	  <filename>/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/action.admin_add_map.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyogdmltOiBzZXQgZXhwYW5kdGFiIHRhYnN0b3A9NCBzaGlmdHdpZHRoPTQgc29mdHRhYnN0b3A9NDogKi8KCi8qKgogKiBBZGQgYSBtYXAgdG8gdGhlIGRhdGFiYXNlCiAqCiAqIGNvcHlyaWdodCAyMDEzLCBSZWdpb25hbCBEaXN0cmljdCBvZiBGcmFzZXItRm9ydCBHZW9yZ2UKICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQogKiBhbnkgbGF0ZXIgdmVyc2lvbi4KCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAogKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgogKiBtb3JlIGRldGFpbHMuICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQSBPcgogKiByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMCgoqKi8KCmlmICghaXNzZXQoJGdDbXMgKSkgZXhpdDsKCiRzbWFydHkgPSAkdGhpcy0+c21hcnR5OwoKaWYgKCEgJHRoaXMtPkdldFByZWZlcmVuY2UoJ2FsbG93X2FkZCcsMSkgPT0gMSkgZXhpdDsKCiRkYiA9ICRnQ21zLT5HZXREYigpOwoKaWYgKGlzc2V0KCRwYXJhbXNbJ21hcF9pZCddKSkgewoJCSRtYXAgPSBtYXBfb3BlcmF0aW9uczo6Z2V0X21hcF9ieV9pZCgkcGFyYW1zWydtYXBfaWQnXSk7Cn0gZWxzZSB7CgkkbWFwID0gbmV3IHJkZmZnX21hcDsKfQokdGhpcy0+RmlyZURlYnVnKCdpbmZvJywnb3ZlcmxheSAnLiRtYXAtPm92ZXJsYXkuJyBhbmQgcGFyYW1ldGVyczogJy4kbWFwLT5vdmVybGF5X3BhcmFtZXRlcnMpOwoKLy8gcG9wdWxhdGUgdGhlIG1hcCBvYmplY3QgZnJvbSB0aGUgcHJldmlvdXMgZm9ybQppZiAoaXNzZXQoJHBhcmFtc1snbmFtZSddKSkgJG1hcC0+bmFtZSA9ICRwYXJhbXNbJ25hbWUnXTsKaWYgKGlzc2V0KCRwYXJhbXNbJ3RpdGxlJ10pKSAkbWFwLT50aXRsZSA9ICRwYXJhbXNbJ3RpdGxlJ107CmlmIChpc3NldCgkcGFyYW1zWydiYXNlbWFwJ10pKSAkbWFwLT5iYXNlbWFwID0gJHBhcmFtc1snYmFzZW1hcCddOwppZiAoaXNzZXQoJHBhcmFtc1snb3ZlcmxheSddKSkgJG1hcC0+b3ZlcmxheSA9ICRwYXJhbXNbJ292ZXJsYXknXTsKaWYgKGlzc2V0KCRwYXJhbXNbJ292ZXJsYXlfcGFyYW1ldGVycyddKSkgJG1hcC0+b3ZlcmxheV9wYXJhbWV0ZXJzID0gJHBhcmFtc1snb3ZlcmxheV9wYXJhbWV0ZXJzJ107CmlmIChpc3NldCgkcGFyYW1zWyd0ZW1wbGF0ZSddKSkgJG1hcC0+dGVtcGxhdGUgPSAkcGFyYW1zWyd0ZW1wbGF0ZSddOwoKJHRlbXBsYXRlX25hbWVzID0gJHRoaXMtPkxpc3RUZW1wbGF0ZXMoKTsKJHRlbXBsYXRlcyA9IGFycmF5KCk7Ci8vIGFkZCB0aGUgZmlsZSBiYXNlZCBkZWZhdWx0IHRlbXBsYXRlCiR0ZW1wbGF0ZXNbJ2RlZmF1bHQnXSA9ICdkZWZhdWx0JzsKZm9yZWFjaCAoJHRlbXBsYXRlX25hbWVzIGFzICR0KSB7CgkkdGVtcGxhdGVzWyR0XSA9ICR0Owp9CgovLyB3aXBlIG91dCB0aGUgbWFwIGlkIGlmIHdlIGFyZSBjcmVhdGluZyBhIGNvcHkgb2YgdGhlIG1hcAppZiAoYXJyYXlfa2V5X2V4aXN0cygnY29weV9tYXAnLCAkcGFyYW1zKSkgewogICAgJG1hcC0+bWFwX2lkID0gbnVsbDsKICAgICRtYXAtPm5hbWUgPSBudWxsOwp9CgppZiAoaXNzZXQoJHBhcmFtc1snZXJyb3InXSkpIHsKICAgICRzbWFydHktPmFzc2lnbignZXJyb3InLCAkcGFyYW1zWydlcnJvciddKTsKfQoKJHNtYXJ0eS0+YXNzaWduKCdzdGFydF9mb3JtJywgJHRoaXMtPkNyZWF0ZUZvcm1TdGFydCgkaWQsICdzYXZlX21hcCcsICRyZXR1cm5pZCkpOwoKJHNtYXJ0eS0+YXNzaWduKCduYW1lJywgJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCgkaWQsICduYW1lJywgJG1hcC0+bmFtZSwgOTYpKTsKJHNtYXJ0eS0+YXNzaWduKCd0aXRsZV9uYW1lJywgJHRoaXMtPkxhbmcoJ3RpdGxlX21hcF9uYW1lJykpOwokc21hcnR5LT5hc3NpZ24oJ3RpdGxlJywgJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCgkaWQsICd0aXRsZScsICRtYXAtPnRpdGxlLCA5NikpOwokc21hcnR5LT5hc3NpZ24oJ3RpdGxlX3RpdGxlJywgJHRoaXMtPkxhbmcoJ3RpdGxlX21hcF90aXRsZScpKTsKJHNtYXJ0eS0+YXNzaWduKCdiYXNlbWFwJywgJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCgkaWQsICdiYXNlbWFwJywgJG1hcC0+YmFzZW1hcCwgOTYpKTsKJHNtYXJ0eS0+YXNzaWduKCd0aXRsZV9iYXNlbWFwJywgJHRoaXMtPkxhbmcoJ3RpdGxlX2Jhc2VtYXAnKSk7CiRzbWFydHktPmFzc2lnbigndGl0bGVfZXh0ZW50JywgJHRoaXMtPkxhbmcoJ3RpdGxlX2luaXRpYWxfZXh0ZW50JykpOwokc21hcnR5LT5hc3NpZ24oJ292ZXJsYXknLCAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCRpZCwgJ292ZXJsYXknLCAkbWFwLT5vdmVybGF5LCA5NikpOwokc21hcnR5LT5hc3NpZ24oJ3RpdGxlX292ZXJsYXknLCAkdGhpcy0+TGFuZygndGl0bGVfb3ZlcmxheScpKTsKJHNtYXJ0eS0+YXNzaWduKCdvdmVybGF5X3BhcmFtZXRlcnMnLCAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCRpZCwgJ292ZXJsYXlfcGFyYW1ldGVycycsICRtYXAtPm92ZXJsYXlfcGFyYW1ldGVycywgOTYpKTsKJHNtYXJ0eS0+YXNzaWduKCd0aXRsZV9vdmVybGF5X3BhcmFtZXRlcnMnLCAkdGhpcy0+TGFuZygndGl0bGVfb3ZlcmxheV9wYXJhbWV0ZXJzJykpOwokc21hcnR5LT5hc3NpZ24oJ2luaXRpYWxfZXh0ZW50JywgJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCgkaWQsICdpbml0aWFsX2V4dGVudCcsICRtYXAtPmluaXRpYWxfZXh0ZW50LCA5NikpOwokc21hcnR5LT5hc3NpZ24oJ3N1Ym1pdCcsICR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCgkaWQsICdzdWJtaXQnLCAkdGhpcy0+TGFuZygnc3VibWl0JykpKTsKJHNtYXJ0eS0+YXNzaWduKCdjYW5jZWwnLCAkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQoJGlkLCAnY2FuY2VsJywgJHRoaXMtPkxhbmcoJ2NhbmNlbCcpKSk7CiRzbWFydHktPmFzc2lnbignbWFwX2lkJywgJHRoaXMtPkNyZWF0ZUlucHV0SGlkZGVuKCRpZCwgJ21hcF9pZCcsICRtYXAtPm1hcF9pZCkpOwokc21hcnR5LT5hc3NpZ24oJ2hlbHBfbmFtZScsICR0aGlzLT5MYW5nKCdoZWxwX21hcF9uYW1lJykpOwokc21hcnR5LT5hc3NpZ24oJ2hlbHBfdGl0bGUnLCAkdGhpcy0+TGFuZygnaGVscF9tYXBfdGl0bGUnKSk7CiRzbWFydHktPmFzc2lnbignaGVscF9iYXNlbWFwJywgJHRoaXMtPkxhbmcoJ2hlbHBfbWFwX2Jhc2VtYXAnKSk7CiRzbWFydHktPmFzc2lnbignaGVscF9leHRlbnQnLCAkdGhpcy0+TGFuZygnaGVscF9tYXBfZXh0ZW50JykpOwokc21hcnR5LT5hc3NpZ24oJ2hlbHBfb3ZlcmxheScsICR0aGlzLT5MYW5nKCdoZWxwX21hcF9vdmVybGF5JykpOwokc21hcnR5LT5hc3NpZ24oJ2hlbHBfb3ZlcmxheV9wYXJhbWV0ZXJzJywgJHRoaXMtPkxhbmcoJ2hlbHBfbWFwX292ZXJsYXlfcGFyYW1ldGVycycpKTsKJHNtYXJ0eS0+YXNzaWduKCdoZWxwX3RlbXBsYXRlX25hbWUnLCAkdGhpcy0+TGFuZygnaGVscF90ZW1wbGF0ZScpKTsKJHNtYXJ0eS0+YXNzaWduKCd0aXRsZV90ZW1wbGF0ZV9uYW1lJywgJHRoaXMtPkxhbmcoJ3RpdGxlX3RlbXBsYXRlX25hbWUnKSk7CiRzbWFydHktPmFzc2lnbigndGVtcGxhdGVzJywgJHRoaXMtPkNyZWF0ZUlucHV0RHJvcGRvd24oJGlkLCAndGVtcGxhdGVfbmFtZScsICR0ZW1wbGF0ZXMsIC0xLCAkbWFwLT50ZW1wbGF0ZV9uYW1lKSk7CmVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZSgnZWRpdF9tYXAudHBsJyk7Cj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/action.admin_add_template.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyogdmltOiBzZXQgZXhwYW5kdGFiIHRhYnN0b3A9NCBzaGlmdHdpZHRoPTQgc29mdHRhYnN0b3A9NDogKi8KCi8qKgogKiBFZGl0IGEgbWFwIHRlbXBsYXRlCiAqCiAqIGNvcHlyaWdodCAyMDEzLCBSZWdpb25hbCBEaXN0cmljdCBvZiBGcmFzZXItRm9ydCBHZW9yZ2UKICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQogKiBhbnkgbGF0ZXIgdmVyc2lvbi4KCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAogKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgogKiBtb3JlIGRldGFpbHMuICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQSBPcgogKiByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMCgoqKi8KCi8vIG1ha2Ugc3VyZSB3ZSdyZSBydW5uaW5nIGFzIGEgY21zbXMgbW9kdWxlIGFjdGlvbgppZiAoIWlzc2V0KCRnQ21zKSkgZXhpdDsgCgokdGVtcGxhdGUgPSBuZXcgQ21zTGF5b3V0VGVtcGxhdGUoKTsKaWYgKGlzc2V0KCRwYXJhbXNbJ3RlbXBsYXRlX25hbWUnXSkpIHsKICAgIC8vIHBvcHVsYXRlIGZpZWxkcyBmcm9tIHRoZSBkYXRhYmFzZQogICAgdHJ5IHsKICAgICAgICAkdGVtcGxhdGUtPnNldF9jb250ZW50KCR0aGlzLT5HZXRUZW1wbGF0ZSgkcGFyYW1zWyd0ZW1wbGF0ZV9uYW1lJ10pKTsKICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiAkZSkgewogICAgICAgICR0aGlzLT5SZWRpcmVjdFRvQWRtaW5UYWIoCiAgICAgICAgICAgICAgICAndGVtcGxhdGVzJywKICAgICAgICAgICAgICAgIGFycmF5KCdlcnJvcic9PiAnRmFpbGVkIHRvIGxvYWQgdGVtcGxhdGUgJy4kcGFyYW1zWyd0ZW1wbGF0ZV9uYW1lJ10uJyBBbHNvLCAnLiRlLT5nZXRNZXNzYWdlKCkpKTsKICAgIH0KICAgIGlmICghaXNzZXQoJHBhcmFtc1snY29weV90ZW1wbGF0ZSddKSkgewogICAgICAgICR0ZW1wbGF0ZS0+bmFtZSA9ICRwYXJhbXNbJ3RlbXBsYXRlX25hbWUnXTsKICAgIH0KfSBlbHNlIHsKICAgIC8vIG5ldyB0ZW1wbGF0ZSAtLSBwb3B1bGF0ZSBjb2RlIHdpdGggdGhlIGRlZmF1bHQgdGVtcGxhdGUuCiAgICAkdGVtcGxhdGUtPnNldF9jb250ZW50KGZpbGVfZ2V0X2NvbnRlbnRzKF9fRElSX18uJy90ZW1wbGF0ZXMvbWFwLnRwbCcpKTsKfQoKLy8gcG9wdWxhdGUgdGhlIGZpZWxkcyB3aXRoIGRhdGEgaW4gd2UgYXJlIHJldHVybmluZyBmcm9tIHRoaXMgcGFnZSwgaWUKLy8gZm9sbG93aW5nIGZhaWxlZCBmb3JtIHZhbGlkYXRpb24uCmlmIChpc3NldCgkcGFyYW1zWyduYW1lJ10pKSAkdGVtcGxhdGUtPm5hbWUgPSAkcGFyYW1zWyduYW1lJ107CmlmIChpc3NldCgkcGFyYW1zWydjb2RlJ10pKSAkdGVtcGxhdGUtPnNldF9jb250ZW50KCRwYXJhbXNbJ3RlbXBsYXRlX2NvZGUnXSk7Cgokc21hcnR5ID0gJHRoaXMtPnNtYXJ0eTsKJHNtYXJ0eS0+YXNzaWduKCdzdGFydF9mb3JtJywgJHRoaXMtPkNyZWF0ZUZvcm1TdGFydCgkaWQsICdhZG1pbl9zYXZlX3RlbXBsYXRlJywgJHJldHVybmlkKSk7CiRzbWFydHktPmFzc2lnbignbmFtZScsIAogICAgJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCgkaWQsIAogICAgICAgICduYW1lJywgCiAgICAgICAgJHRlbXBsYXRlLT5uYW1lLCAKICAgICAgICA5NiwgCiAgICAgICAgOTYsIAogICAgICAgIHN0cmxlbigkdGVtcGxhdGUtPm5hbWUpID4gMCAmJiAhYXJyYXlfa2V5X2V4aXN0cygnY29weV90ZW1wbGF0ZScsJHBhcmFtcykgPycgcmVhZG9ubHk9InJlYWRvbmx5Iic6JycpKTsKJHNtYXJ0eS0+YXNzaWduKCd0aXRsZV9uYW1lJywgJHRoaXMtPkxhbmcoJ3RpdGxlX3RlbXBsYXRlX25hbWUnKSk7CiRzbWFydHktPmFzc2lnbignY29kZScsICR0aGlzLT5DcmVhdGVTeW50YXhBcmVhKCRpZCwgJHRlbXBsYXRlLT5nZXRfY29udGVudCgpLCAndGVtcGxhdGVfY29kZScpKTsKJHNtYXJ0eS0+YXNzaWduKCd0aXRsZV9jb2RlJywgJHRoaXMtPkxhbmcoJ3RpdGxlX3RlbXBsYXRlX2NvZGUnKSk7CiRzbWFydHktPmFzc2lnbignaGVscF9uYW1lJywgJHRoaXMtPkxhbmcoJ2hlbHBfdGVtcGxhdGVfbmFtZScpKTsKJHNtYXJ0eS0+YXNzaWduKCdoZWxwX2NvZGUnLCAkdGhpcy0+TGFuZygnaGVscF90ZW1wbGF0ZV9jb2RlJykpOwokc21hcnR5LT5hc3NpZ24oJ3N1Ym1pdCcsICR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCgkaWQsICdzdWJtaXQnLCAkdGhpcy0+TGFuZygnc3VibWl0JykpKTsKJHNtYXJ0eS0+YXNzaWduKCdjYW5jZWwnLCAkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQoJGlkLCAnY2FuY2VsJywgJHRoaXMtPkxhbmcoJ2NhbmNlbCcpKSk7CmlmIChpc3NldCgkcGFyYW1zWydlcnJvciddKSkgewogICAgJHNtYXJ0eS0+YXNzaWduKCdlcnJvcicsICRwYXJhbXNbJ2Vycm9yJ10pOwp9CmVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZSgnZWRpdF90ZW1wbGF0ZS50cGwnKTsKPz4K]]></data>
	</file>
	<file>
	  <filename>/action.admin_copy_map.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyogdmltOiBzZXQgZXhwYW5kdGFiIHRhYnN0b3A9NCBzaGlmdHdpZHRoPTQgc29mdHRhYnN0b3A9NDogKi8KCi8qKgogKiBFZGl0IGEgbWFwIHRlbXBsYXRlCiAqCiAqIGNvcHlyaWdodCAyMDEzLCBSZWdpb25hbCBEaXN0cmljdCBvZiBGcmFzZXItRm9ydCBHZW9yZ2UKICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQogKiBhbnkgbGF0ZXIgdmVyc2lvbi4KCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAogKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgogKiBtb3JlIGRldGFpbHMuICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQSBPcgogKiByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMCgoqKi8KCi8vIG1ha2Ugc3VyZSB3ZSdyZSBydW5uaW5nIGFzIGEgY21zbXMgbW9kdWxlIGFjdGlvbgppZiAoIWlzc2V0KCRnQ21zKSkgZXhpdDsgCiAgICAkcGFyYW1zWydjb3B5X21hcCddID0gdHJ1ZTsKICAgICR0aGlzLT5SZWRpcmVjdCgkaWQsICdhZG1pbl9hZGRfbWFwJywgJHJldHVybmlkLCAkcGFyYW1zKTsKPz4K]]></data>
	</file>
	<file>
	  <filename>/action.admin_copy_template.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyogdmltOiBzZXQgZXhwYW5kdGFiIHRhYnN0b3A9NCBzaGlmdHdpZHRoPTQgc29mdHRhYnN0b3A9NDogKi8KCi8qKgogKiBFZGl0IGEgbWFwIHRlbXBsYXRlCiAqCiAqIGNvcHlyaWdodCAyMDEzLCBSZWdpb25hbCBEaXN0cmljdCBvZiBGcmFzZXItRm9ydCBHZW9yZ2UKICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQogKiBhbnkgbGF0ZXIgdmVyc2lvbi4KCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAogKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgogKiBtb3JlIGRldGFpbHMuICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQSBPcgogKiByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMCgoqKi8KCi8vIG1ha2Ugc3VyZSB3ZSdyZSBydW5uaW5nIGFzIGEgY21zbXMgbW9kdWxlIGFjdGlvbgppZiAoIWlzc2V0KCRnQ21zKSkgZXhpdDsgCiAgICAkcGFyYW1zWydjb3B5X3RlbXBsYXRlJ10gPSB0cnVlOwogICAgJHRoaXMtPlJlZGlyZWN0KCRpZCwgJ2FkbWluX2FkZF90ZW1wbGF0ZScsICRyZXR1cm5pZCwgJHBhcmFtcyk7Cj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/action.admin_delete_template.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAgCi8qIHZpbTogc2V0IGV4cGFuZHRhYiB0YWJzdG9wPTQgc2hpZnR3aWR0aD00IHNvZnR0YWJzdG9wPTQ6ICovCgovKioKICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgdGVtcGxhdGUgZnJvbSB0aGUgZGF0YWJhc2UuCiAqCiAqIGNvcHlyaWdodCAyMDEzLCBSZWdpb25hbCBEaXN0cmljdCBvZiBGcmFzZXItRm9ydCBHZW9yZ2UKICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQogKiBhbnkgbGF0ZXIgdmVyc2lvbi4KCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAogKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgogKiBtb3JlIGRldGFpbHMuICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQSBPcgogKiByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMCgoqKi8KCmlmICghaXNzZXQoJGdDbXMpKSBleGl0OwoKaWYgKCFpc3NldCgkcGFyYW1zWyd0ZW1wbGF0ZV9uYW1lJ10pIHx8IHN0cmxlbigkcGFyYW1zWyd0ZW1wbGF0ZV9uYW1lJ10pID09IDAgfHwgaXNfbnVsbCgkcGFyYW1zWyd0ZW1wbGF0ZV9uYW1lJ10pKSB7CiAgICAkcGFyYW1zWydlcnJvciddID0gJ3RlbXBsYXRlIG5hbWUgbm90IHNldCc7CiAgICAkdGhpcy0+UmVkaXJlY3RUb0FkbWluVGFiKCd0ZW1wbGF0ZXMnLCAkcGFyYW1zKTsKICAgIHJldHVybjsKfSBlbHNlIHsKICAgIHRyeSB7CiAgICAgICAgJHRoaXMtPkRlbGV0ZVRlbXBsYXRlKCRwYXJhbXNbJ3RlbXBsYXRlX25hbWUnXSk7CiAgICB9IGNhdGNoIChFeGNlcHRpb24gJGUpIHsKICAgICAgICAkcGFyYW1zWydlcnJvciddID0gJ0ZhaWxlZCB0byBkZWxldGUgdGVtcGxhdGUnOwogICAgfQp9CiR0aGlzLT5SZWRpcmVjdFRvQWRtaW5UYWIoJ3RlbXBsYXRlcycpOwo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/action.admin_save_template.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyogdmltOiBzZXQgZXhwYW5kdGFiIHRhYnN0b3A9NCBzaGlmdHdpZHRoPTQgc29mdHRhYnN0b3A9NDogKi8KCi8qKgogKiBTYXZlIGNoYW5nZXMgdG8gYSBtYXAgdGVtcGxhdGUKICoKICogY29weXJpZ2h0IDIwMTMsIFJlZ2lvbmFsIERpc3RyaWN0IG9mIEZyYXNlci1Gb3J0IEdlb3JnZQogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQogKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCiAqIGFueSBsYXRlciB2ZXJzaW9uLgoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgogKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCiAqIG1vcmUgZGV0YWlscy4gIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBIE9yCiAqIHJlYWQgaXQgb25saW5lOiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwKCioqLwoKLy8gbWFrZSBzdXJlIHdlJ3JlIHJ1bm5pbmcgYXMgYSBjbXNtcyBtb2R1bGUgYWN0aW9uCmlmICghaXNzZXQoJGdDbXMpKSBleGl0OyAKCmlmIChpc3NldCgkcGFyYW1zWydjYW5jZWwnXSkpIHsKCSR0aGlzLT5SZWRpcmVjdFRvQWRtaW5UYWIoJ3RlbXBsYXRlcycpOwp9IGVsc2UgaWYgKGlzc2V0KCRwYXJhbXNbJ3N1Ym1pdCddKSkgewogICAgaWYgKCRwYXJhbXNbJ25hbWUnXSA9PSAnZGVmYXVsdCcpIHsKICAgICAgICAkcGFyYW1zWydlcnJvciddID0gJyJkZWZhdWx0IiBpcyBub3QgYSB2YWxpZCB0ZW1wbGF0ZSBuYW1lLic7CiAgICAgICAgJHRoaXMtPlJlZGlyZWN0KCRpZCwnYWRtaW5fYWRkX3RlbXBsYXRlJywkcmV0dXJuaWQsJHBhcmFtcyk7CiAgICB9CiAgICBpZiAoIWlzc2V0KCRwYXJhbXNbJ25hbWUnXSkgfHwgc3RybGVuKCRwYXJhbXNbJ25hbWUnXSkgPT0gMCB8fCBpc19udWxsKCRwYXJhbXNbJ25hbWUnXSkpIHsKICAgICAgICAkcGFyYW1zWydlcnJvciddID0gJHRoaXMtPkxhbmcoJ2Vycm9yX3RlbXBsYXRlX25vX25hbWUnKTsKICAgICAgICAkdGhpcy0+UmVkaXJlY3QoJGlkLCAnYWRtaW5fYWRkX3RlbXBsYXRlJywgJHJldHVybmlkLCAkcGFyYW1zKTsKICAgIH0KICAgICR0ZW1wbGF0ZSA9IG5ldyByZGZmZ190ZW1wbGF0ZTsKCSR0ZW1wbGF0ZS0+bmFtZSA9ICRwYXJhbXNbJ25hbWUnXTsKCSR0ZW1wbGF0ZS0+Y29udGVudCA9ICRwYXJhbXNbJ3RlbXBsYXRlX2NvZGUnXTsKICAgIHRyeSB7CiAgICAgICAgJHRoaXMtPlNldFRlbXBsYXRlKCRwYXJhbXNbJ25hbWUnXSwkcGFyYW1zWyd0ZW1wbGF0ZV9jb2RlJ10pOwogICAgfSBjYXRjaCAoRXhjZXB0aW9uICRlKSB7CiAgICAgICAgJHBhcmFtc1snZXJyb3InXSA9ICdGYWlsZWQgdG8gc2F2ZSB0ZW1wbGF0ZSwgJy4kZS0+Z2V0TWVzc2FnZSgpOwogICAgfQoKICAgICR0aGlzLT5SZWRpcmVjdFRvQWRtaW5UYWIoJ3RlbXBsYXRlcycsICRwYXJhbXMpOwoKfSBlbHNlIHsKCS8vIHNob3VsZCBuZXZlciBnZXQgaGVyZQoJJHRoaXMtPkZpcmVEZWJ1Zygnd2FybmluZycsJ0dvdCB0byBzYXZlIHRlbXBsYXRlIHdpdGggbm8gc3VibWl0IG9yIGNhbmNlbCBhY3Rpb24gZGVmaW5lZC4nKTsKCSR0aGlzLT5SZWRpcmVjdFRvQWRtaW5UYWIoJ3RlbXBsYXRlcycpOwp9Cj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/action.default.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyogdmltOiBzZXQgZXhwYW5kdGFiIHRhYnN0b3A9NCBzaGlmdHdpZHRoPTQgc29mdHRhYnN0b3A9NDogKi8KCi8qKgogKiBDcmVhdGUgdGhlIG1hcCBvbiB0aGUgcGFnZQogKgogKiBjb3B5cmlnaHQgMjAxMywgUmVnaW9uYWwgRGlzdHJpY3Qgb2YgRnJhc2VyLUZvcnQgR2VvcmdlCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCiAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKICogYW55IGxhdGVyIHZlcnNpb24uCgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKICogbW9yZSBkZXRhaWxzLiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EgT3IKICogcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAoKKiovCgppZiAoIWlzc2V0KCRnQ21zKSkgZXhpdDsKCiRlcnJvciA9IG51bGw7CiRtYXAgPSBudWxsOwoKaWYgKCFpc3NldCgkcGFyYW1zWyduYW1lJ10pKSB7CgkkZXJyb3IgPSAkdGhpcy0+TGFuZygnbWFwX25hbWVfbm90X3NldCcpOwp9IGVsc2UgewoJdHJ5IHsKCQkkbWFwID0gbWFwX29wZXJhdGlvbnM6OmdldF9tYXBfYnlfbmFtZSgkcGFyYW1zWyduYW1lJ10pOwoJCSR0aGlzLT5zbWFydHktPmFzc2lnbigncmRtYXAnLCAkbWFwKTsKCX0gY2F0Y2ggKEV4Y2VwdGlvbiAkZSkgewoJCSR0aGlzLT5GaXJlRGVidWcoJ2Vycm9yJywgJ0NvdWxkIG5vdCByZXRyaWV2ZSBtYXAgJy4kcGFyYW1zWyduYW1lJ10pOwoJCSRlcnJvciA9ICR0aGlzLT5MYW5nKCdlcnJvcl9tYXBfbm90X2ZvdW5kJykgLiAnICgnIC4gJHBhcmFtc1snbmFtZSddIC4gJyknOwoJfQp9CiR0aGlzLT5zbWFydHktPmFzc2lnbignZXJyb3InLCAkZXJyb3IpOwppZiAoJG1hcCA9PT0gbnVsbCkgewogICAgZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCdlcnJvci50cGwnKTsKICAgIHJldHVybjsKfQoKaWYgKCRtYXAtPmJhc2VtYXAgPT0gTlVMTCkgewoJJG1hcC0+YmFzZW1hcCA9ICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdkZWZhdWx0X2Jhc2VtYXAnKTsKfQppZiAoJG1hcC0+aW5pdGlhbF9leHRlbnQgPT0gTlVMTCkgewoJJG1hcC0+aW5pdGlhbF9leHRlbnQgPSAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnaW5pdGlhbF9leHRlbnQnKTsKfQoKaWYgKCRtYXAtPnRlbXBsYXRlX25hbWUgPT0gJ2RlZmF1bHQnKSB7CiAgICAkdGhpcy0+RmlyZURlYnVnKCdpbmZvJywgJ1Byb2Nlc3NpbmcgZGVmYXVsdCB0ZW1wbGF0ZScpOwoJZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCdtYXAudHBsJyk7Cn0gZWxzZSB7CgllY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGVGcm9tRGF0YWJhc2UoJG1hcC0+dGVtcGxhdGVfbmFtZSk7Cn0KPz4K]]></data>
	</file>
	<file>
	  <filename>/action.defaultadmin.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyogdmltOiBzZXQgZXhwYW5kdGFiIHRhYnN0b3A9NCBzaGlmdHdpZHRoPTQgc29mdHRhYnN0b3A9NDogKi8KCi8qKgogKiBNYWluIGFkbWluIHBhbmVsCiAqCiAqIGNvcHlyaWdodCAyMDEzLCBSZWdpb25hbCBEaXN0cmljdCBvZiBGcmFzZXItRm9ydCBHZW9yZ2UKICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQogKiBhbnkgbGF0ZXIgdmVyc2lvbi4KCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAogKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgogKiBtb3JlIGRldGFpbHMuICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQSBPcgogKiByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMCgoqKi8KCmlmICghaXNzZXQoJGdDbXMpKSBleGl0OwoKaWYgKEZBTFNFID09IGVtcHR5KCRwYXJhbXNbJ2FjdGl2ZV90YWInXSkpIHsKCSR0YWIgPSAkcGFyYW1zWydhY3RpdmVfdGFiJ107Cn0gZWxzZSB7CgkkdGFiID0gJyc7Cn0KCiR0YWJfaGVhZGVyID0gJHRoaXMtPlN0YXJ0VGFiSGVhZGVycygpIC4KCSR0aGlzLT5TZXRUYWJIZWFkZXIoJ2dlbmVyYWwnLCAkdGhpcy0+TGFuZygndGl0bGVfZ2VuZXJhbCcpLCgnZ2VuZXJhbCcgPT0gJHRhYik/dHJ1ZTpmYWxzZSkgLgoJJHRoaXMtPlNldFRhYkhlYWRlcigncHJlZmVyZW5jZXMnLCAkdGhpcy0+TGFuZygndGl0bGVfcHJlZnMnKSwoJ3ByZWZlcmVuY2VzJyA9PSAkdGFiKT90cnVlOmZhbHNlKS4KCSR0aGlzLT5TZXRUYWJIZWFkZXIoJ21hcHMnLCAkdGhpcy0+TGFuZygndGl0bGVfbWFwcycpLCAoJ21hcHMnID09ICR0YWIpP3RydWU6ZmFsc2UpLgoJJHRoaXMtPlNldFRhYkhlYWRlcigndGVtcGxhdGVzJywgJHRoaXMtPkxhbmcoJ3RpdGxlX3RlbXBsYXRlcycpLCAoJ3RlbXBsYXRlcycgPT0gJHRhYik/dHJ1ZTpmYWxzZSkuCiAgICAkdGhpcy0+RW5kVGFiSGVhZGVycygpOwoKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCd0YWJzX3N0YXJ0JywgJHRoaXMtPlN0YXJ0VGFiQ29udGVudCgpKTsKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdzdGFydF9nZW5lcmFsX3RhYicsJHRoaXMtPlN0YXJ0VGFiKCdnZW5lcmFsJywkcGFyYW1zKSk7CiR0aGlzLT5zbWFydHktPmFzc2lnbignc3RhcnRfcHJlZmVyZW5jZV90YWInLCAkdGhpcy0+U3RhcnRUYWIoJ3ByZWZlcmVuY2VzJywgJHBhcmFtcykpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3N0YXJ0X21hcHNfdGFiJywgJHRoaXMtPlN0YXJ0VGFiKCdtYXBzJywgJHBhcmFtcykpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3N0YXJ0X3RlbXBsYXRlc190YWInLCAkdGhpcy0+U3RhcnRUYWIoJ3RlbXBsYXRlcycsICRwYXJhbXMpKTsKCiR0aGlzLT5zbWFydHktPmFzc2lnbigndGFiX2hlYWRlcnMnLCAkdGFiX2hlYWRlcik7CiR0aGlzLT5zbWFydHktPmFzc2lnbigndGFiX2VuZCcsJHRoaXMtPkVuZFRhYigpKTsKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCd0YWJzX2VuZCcsJHRoaXMtPkVuZFRhYkNvbnRlbnQoKSk7CgovLyBtb2R1bGUgZGVmYXVsdHMgZm9ybQokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3N0YXJ0X2Zvcm0nLCAkdGhpcy0+Q3JlYXRlRm9ybVN0YXJ0KCRpZCwgJ3NhdmVfYWRtaW5fcHJlZnMnLCAkcmV0dXJuaWQpKTsKCi8vIGRlZmF1bHQgYmFzZW1hcAokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3RpdGxlX2Jhc2VtYXAnLCAkdGhpcy0+TGFuZygndGl0bGVfZGVmYXVsdF9iYXNlbWFwJywnJykpOwokdGhpcy0+RmlyZURlYnVnKCdpbmZvJywnQmFzZW1hcDogJy4kdGhpcy0+R2V0UHJlZmVyZW5jZSgnZGVmYXVsdF9iYXNlbWFwJywnJykpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2lucHV0X2Jhc2VtYXAnLCAkdGhpcy0+Q3JlYXRlSW5wdXRVcmwoJGlkLCdiYXNlbWFwJywgJHRoaXMtPkdldFByZWZlcmVuY2UoJ2RlZmF1bHRfYmFzZW1hcCcsJycpLCA5NikpOwoKLy8gaW5pdGlhbCBleHRlbnRzCiR0aGlzLT5zbWFydHktPmFzc2lnbigndGl0bGVfZXh0ZW50JywgJHRoaXMtPkxhbmcoJ3RpdGxlX2RlZmF1bHRfZXh0ZW50JywnJykpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2lucHV0X2V4dGVudCcsICR0aGlzLT5DcmVhdGVJbnB1dFRleHQoJGlkLCAnaW5pdGlhbF9leHRlbnQnLCAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnaW5pdGlhbF9leHRlbnQnLCcnKSwgOTYpKTsKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdzdWJtaXQnLCR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCgkaWQsICdzdWJtaXQnLCAkdGhpcy0+TGFuZygnc3VibWl0JykpKTsKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCd3ZWxjb21lX3RleHQnLCR0aGlzLT5MYW5nKCd3ZWxjb21lX3RleHQnKSk7CgovLyBtYXBzIHBhZ2UKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdtYXBfaWQnLCAkdGhpcy0+TGFuZygnZmllbGRfbWFwX2lkJykpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ21hcF9uYW1lJywgJHRoaXMtPkxhbmcoJ2ZpZWxkX21hcF9uYW1lJykpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ21hcF9iYXNlbWFwJywgJHRoaXMtPkxhbmcoJ2ZpZWxkX21hcF9iYXNlbWFwJykpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ21hcF9vdmVybGF5JywgJHRoaXMtPkxhbmcoJ2ZpZWxkX21hcF9vdmVybGF5JykpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ21hcF9pbml0aWFsX2V4dGVudCcsICR0aGlzLT5MYW5nKCdmaWVsZF9tYXBfaW5pdGlhbF9leHRlbnQnKSk7CiR0aGlzLT5zbWFydHktPmFzc2lnbignbWFwc190ZW1wbGF0ZScsIF9fRElSX18uJy90ZW1wbGF0ZXMvYWRtaW5tYXBzLnRwbCcpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3RlbXBsYXRlc190ZW1wbGF0ZScsIF9fRElSX18uJy90ZW1wbGF0ZXMvYWRtaW50ZW1wbGF0ZXMudHBsJyk7CiR0aGlzLT5zbWFydHktPmFzc2lnbignZmllbGRfdGVtcGxhdGVfbmFtZScsICR0aGlzLT5MYW5nKCdmaWVsZF90ZW1wbGF0ZV9uYW1lJykpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2ZpZWxkX3RlbXBsYXRlX2lkJywgJHRoaXMtPkxhbmcoJ2ZpZWxkX3RlbXBsYXRlX2lkJykpOwoKJG1hcGxpc3QgPSBtYXBfb3BlcmF0aW9uczo6Z2V0X21hcHMoKTsKCmZvcmVhY2ggKCRtYXBsaXN0IGFzICRtYXApIHsKCSRtYXAtPmVkaXRfbGluayA9ICR0aGlzLT5DcmVhdGVJbWFnZUxpbmsoJGlkLCAnYWRtaW5fYWRkX21hcCcsICRyZXR1cm5pZCwgJHRoaXMtPkxhbmcoJ2VkaXRfbWFwJyksCgkJCSAnaWNvbnMvc3lzdGVtL2VkaXQuZ2lmJywnJywKCQkJYXJyYXkoJ21hcF9pZCc9PiRtYXAtPm1hcF9pZCkpOwogICAgJG1hcC0+Y29weV9saW5rID0gJHRoaXMtPkNyZWF0ZUltYWdlTGluaygkaWQsICdhZG1pbl9jb3B5X21hcCcsICRyZXR1cm5pZCwgJHRoaXMtPkxhbmcoJ2NvcHlfbWFwJyksCiAgICAgICAgICAgICdpY29ucy9zeXN0ZW0vY29weS5naWYnLCAnJywKICAgICAgICAgICAgYXJyYXkoJ21hcF9pZCc9PiRtYXAtPm1hcF9pZCkpOwoJJG1hcC0+ZGVsZXRlX2xpbmsgPSAkdGhpcy0+Q3JlYXRlSW1hZ2VMaW5rKCRpZCwgJ2RlbGV0ZV9tYXAnLCAkcmV0dXJuaWQsICR0aGlzLT5MYW5nKCdkZWxldGVfbWFwJyksCgkJCSdpY29ucy9zeXN0ZW0vZGVsZXRlLmdpZicsJycsCgkJCWFycmF5KCdtYXBfaWQnPT4kbWFwLT5tYXBfaWQpKTsKCSRtYXAtPm1hcF9saW5rID0gJHRoaXMtPkNyZWF0ZUxpbmsoJGlkLCAKCQknYWRtaW5fYWRkX21hcCcsIAoJCSRyZXR1cm5pZCwgCgkJJG1hcC0+bmFtZSwgCgkJYXJyYXkoJ21hcF9pZCc9PiRtYXAtPm1hcF9pZCkpOwoJCQkKfQoKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdtYXBsaXN0JywgJG1hcGxpc3QpOwokdGhpcy0+RmlyZURlYnVnKCdpbmZvJywgJ0ZvdW5kICcuY291bnQobWFwX29wZXJhdGlvbnM6OmdldF9tYXBzKCkpLicgbWFwcy4nKTsKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdhZGRfbWFwJywgJHRoaXMtPkNyZWF0ZUltYWdlTGluaygkaWQsJ2FkbWluX2FkZF9tYXAnLCRyZXR1cm5pZCwgJycsICdpY29ucy9zeXN0ZW0vbmV3b2JqZWN0LmdpZicsJHRoaXMtPkxhbmcoJ2FkZF9tYXAnKSkpOwoKLy8gdGVtcGxhdGVzIHBhZ2UKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCd0ZW1wbGF0ZV9pZCcsICR0aGlzLT5MYW5nKCdmaWVsZF90ZW1wbGF0ZV9pZCcpKTsKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCd0ZW1wbGF0ZV9uYW1lJywgJHRoaXMtPkxhbmcoJ2ZpZWxkX3RlbXBsYXRlX25hbWUnKSk7CiR0aGlzLT5zbWFydHktPmFzc2lnbigndGVtcGxhdGVfY29kZScsICR0aGlzLT5MYW5nKCdmaWVsZF90ZW1wbGF0ZV9jb2RlJykpOwokdGVtcGxhdGVfbmFtZXMgPSAkdGhpcy0+TGlzdFRlbXBsYXRlcygpOwokdGVtcGxhdGVfbGlzdCA9IGFycmF5KCk7Cgpmb3JlYWNoKCR0ZW1wbGF0ZV9uYW1lcyBhcyAkdGVtcGxhdGVfbmFtZSkgewoJJHRlbXBsYXRlID0gbmV3IHJkZmZnX3RlbXBsYXRlOwoJJHRlbXBsYXRlLT5uYW1lID0gJHRlbXBsYXRlX25hbWU7CgkkdGVtcGxhdGUtPmVkaXRfbGluayA9ICR0aGlzLT5DcmVhdGVMaW5rKCRpZCwKCQknYWRtaW5fYWRkX3RlbXBsYXRlJywKCQkkcmV0dXJuaWQsCgkJJHRlbXBsYXRlLT5uYW1lLAoJCWFycmF5KCd0ZW1wbGF0ZV9uYW1lJz0+JHRlbXBsYXRlLT5uYW1lKSk7CgkkdGVtcGxhdGUtPmVkaXRfaW1hZ2VsaW5rID0gJHRoaXMtPkNyZWF0ZUltYWdlTGluaygkaWQsIAoJCSdhZG1pbl9hZGRfdGVtcGxhdGUnLCAKCQkkcmV0dXJuaWQsICR0aGlzLT5MYW5nKCdlZGl0X3RlbXBsYXRlJyksCgkJJ2ljb25zL3N5c3RlbS9lZGl0LmdpZicsJycsCgkJYXJyYXkoJ3RlbXBsYXRlX25hbWUnPT4kdGVtcGxhdGUtPm5hbWUpKTsKICAgICR0ZW1wbGF0ZS0+Y29weV9saW5rID0gJHRoaXMtPkNyZWF0ZUltYWdlTGluaygkaWQsCiAgICAgICAgJ2FkbWluX2NvcHlfdGVtcGxhdGUnLAogICAgICAgICRyZXR1cm5pZCwgJHRoaXMtPkxhbmcoJ2NvcHlfdGVtcGxhdGUnKSwKICAgICAgICAnaWNvbnMvc3lzdGVtL2NvcHkuZ2lmJywnJywKICAgICAgICBhcnJheSgndGVtcGxhdGVfbmFtZSc9PiR0ZW1wbGF0ZS0+bmFtZSkpOwoJJHRlbXBsYXRlLT5kZWxldGVfbGluayA9ICR0aGlzLT5DcmVhdGVJbWFnZUxpbmsoJGlkLCAKCQknYWRtaW5fZGVsZXRlX3RlbXBsYXRlJywgCgkJJHJldHVybmlkLCAkdGhpcy0+TGFuZygnZGVsZXRlX3RlbXBsYXRlJyksCgkJJ2ljb25zL3N5c3RlbS9kZWxldGUuZ2lmJywnJywKCQlhcnJheSgndGVtcGxhdGVfbmFtZSc9PiR0ZW1wbGF0ZS0+bmFtZSkpOwoJJHRlbXBsYXRlX2xpc3RbXSA9ICR0ZW1wbGF0ZTsKfQoKJHRoaXMtPkZpcmVEZWJ1ZygnaW5mbycsJyRpZCBpczogJy4kaWQuJywgYW5kICRyZXR1cm5pZCBpczogJy4kcmV0dXJuaWQpOwoKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCd0ZW1wbGF0ZWxpc3QnLCAkdGVtcGxhdGVfbGlzdCk7CiR0aGlzLT5zbWFydHktPmFzc2lnbignYWRkX3RlbXBsYXRlJywgJHRoaXMtPkNyZWF0ZUltYWdlTGluaygkaWQsICdhZG1pbl9hZGRfdGVtcGxhdGUnLCAkcmV0dXJuaWQsCgknJywKCSdpY29ucy9zeXN0ZW0vbmV3b2JqZWN0LmdpZicsCgkkdGhpcy0+TGFuZygnYWRkX3RlbXBsYXRlJykpKTsKCmlmIChpc3NldCgkcGFyYW1zWydlcnJvciddKSkgewoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdlcnJvcl9tc2cnLCAkcGFyYW1zWydlcnJvciddKTsKfQoKZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCdhZG1pbnBhbmVsLnRwbCcpOwo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/action.delete_map.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyogdmltOiBzZXQgZXhwYW5kdGFiIHRhYnN0b3A9NCBzaGlmdHdpZHRoPTQgc29mdHRhYnN0b3A9NDogKi8KCi8qKgogKiBEZWxldGUgYSBtYXAgZnJvbSB0aGUgZGF0YWJhc2UKICoKICogY29weXJpZ2h0IDIwMTMsIFJlZ2lvbmFsIERpc3RyaWN0IG9mIEZyYXNlci1Gb3J0IEdlb3JnZQogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQogKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCiAqIGFueSBsYXRlciB2ZXJzaW9uLgoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgogKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCiAqIG1vcmUgZGV0YWlscy4gIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBIE9yCiAqIHJlYWQgaXQgb25saW5lOiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwKCioqLwoKaWYgKCFpc3NldCgkZ0NtcykpIGV4aXQ7CgppZiAoIWlzc2V0KCRwYXJhbXNbJ21hcF9pZCddKSkgewoJJHRoaXMtPkZpcmVEZWJ1ZygnZXJyb3InLCdtYXAgaWQgbm90IHNldCcpOyAKCSR0aGlzLT5SZWRpcmVjdFRvQWRtaW5UYWIoJ21hcHMnKTsKfQoKdHJ5IHsKCSRtYXAgPSBtYXBfb3BlcmF0aW9uczo6Z2V0X21hcF9ieV9pZCgkcGFyYW1zWydtYXBfaWQnXSk7Cn0KY2F0Y2ggKEV4Y2VwdGlvbiAkZSkgewoJJHRoaXMtPkZpcmVEZWJ1Zygnd2FybmluZycsICdGYWlsZWQgdG8gZ2V0IG1hcCAnLiRwYXJhbXNbJ21hcF9pZCddLicgZnJvbSB0aGUgZGF0YWJhc2UnKTsKCSR0aGlzLT5SZWRpcmVjdFRvQWRtaW5UYWIoJ21hcHMnKTsKfQoKbWFwX29wZXJhdGlvbnM6OmRlbGV0ZV9tYXAoJG1hcCk7CiR0aGlzLT5SZWRpcmVjdFRvQWRtaW5UYWIoJ21hcHMnKTsKCj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/action.save_admin_prefs.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyogdmltOiBzZXQgZXhwYW5kdGFiIHRhYnN0b3A9NCBzaGlmdHdpZHRoPTQgc29mdHRhYnN0b3A9NDogKi8KCi8qKgogKiBTYXZlIGNoYW5nZXMgdG8gbW9kdWxlIHByZWZlcmVuY2VzCiAqCiAqIGNvcHlyaWdodCAyMDEzLCBSZWdpb25hbCBEaXN0cmljdCBvZiBGcmFzZXItRm9ydCBHZW9yZ2UKICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQogKiBhbnkgbGF0ZXIgdmVyc2lvbi4KCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAogKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgogKiBtb3JlIGRldGFpbHMuICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQSBPcgogKiByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMCgoqKi8KCmlmICghaXNzZXQoJGdDbXMpKSBleGl0OwoKLy8gc2V0IHRoZSBwcmVmZXJlbmNlcwokdGhpcy0+U2V0UHJlZmVyZW5jZSgnZGVmYXVsdF9iYXNlbWFwJywgaXNzZXQoJHBhcmFtc1snYmFzZW1hcCddKT8kcGFyYW1zWydiYXNlbWFwJ106JycpOwokdGhpcy0+U2V0UHJlZmVyZW5jZSgnaW5pdGlhbF9leHRlbnQnLCBpc3NldCgkcGFyYW1zWydpbml0aWFsX2V4dGVudCddKT8kcGFyYW1zWydpbml0aWFsX2V4dGVudCddOicnKTsKCiRwYXJtcyA9IGFycmF5KCk7CiRwYXJtc1snYmFzZW1hcCddID0gKGlzc2V0KCRwYXJhbXNbJ2Jhc2VtYXAnXSk/JHBhcmFtc1snYmFzZW1hcCddOicnKTsKJHBhcm1zWydpbml0aWFsX2V4dGVudCddID0gKGlzc2V0KCRwYXJhbXNbJ2luaXRpYWxfZXh0ZW50J10pPyRwYXJhbXNbJ2luaXRpYWxfZXh0ZW50J106JycpOwokdGhpcy0+U2VuZEV2ZW50KCdPblJETWFwUHJlZmVyZW5jZUNoYW5nZScsJHBhcm1zKTsKCi8vIHNldCB0aGUgYWN0aXZlIHRhYiBhbmQgbWVzc2FnZQokcGFyYW1zID0gYXJyYXkoJ3RhYl9tZXNzYWdlJz0+ICdwcmVmc3VwZGF0ZWQnLCAnYWN0aXZldGFiJyA9PiAncHJlZmVyZW5jZXMnKTsKJHRoaXMtPlJlZGlyZWN0KCRpZCwgJ2RlZmF1bHRhZG1pbicsICRyZXR1cm5pZCwgJHBhcmFtcyk7Cj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/action.save_map.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyogdmltOiBzZXQgZXhwYW5kdGFiIHRhYnN0b3A9NCBzaGlmdHdpZHRoPTQgc29mdHRhYnN0b3A9NDogKi8KCi8qKgogKiBTYXZlIGNoYW5nZXMgdG8gYSBtYXAKICoKICogY29weXJpZ2h0IDIwMTMsIFJlZ2lvbmFsIERpc3RyaWN0IG9mIEZyYXNlci1Gb3J0IEdlb3JnZQogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQogKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCiAqIGFueSBsYXRlciB2ZXJzaW9uLgoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgogKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCiAqIG1vcmUgZGV0YWlscy4gIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBIE9yCiAqIHJlYWQgaXQgb25saW5lOiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwKCioqLwppZiAoIWlzc2V0KCRnQ21zKSkgZXhpdDsKCmlmIChpc3NldCgkcGFyYW1zWydjYW5jZWwnXSkpIHsKCSR0aGlzLT5SZWRpcmVjdFRvQWRtaW5UYWIoJ21hcHMnKTsKCn0gZWxzZSBpZiAoaXNzZXQoJHBhcmFtc1snc3VibWl0J10pKSB7CglpZiAoaXNzZXQoJHBhcmFtc1snbWFwX2lkJ10pICYmICRwYXJhbXNbJ21hcF9pZCddICE9PSAnJyApIHsKCQkkbWFwID0gbWFwX29wZXJhdGlvbnM6OmdldF9tYXBfYnlfaWQoJHBhcmFtc1snbWFwX2lkJ10pOwoJfSBlbHNlIHsKCQkkbWFwID0gbmV3IHJkZmZnX21hcDsKCX0KCiAgICBpZiAoIWlzc2V0KCRwYXJhbXNbJ25hbWUnXSkgfHwgc3RybGVuKCRwYXJhbXNbJ25hbWUnXSkgPT0gMCB8fCBpc19udWxsKCRwYXJhbXNbJ25hbWUnXSkpIHsKICAgICAgICAkcGFyYW1zWydlcnJvciddID0gJHRoaXMtPkxhbmcoJ2Vycm9yX21hcF9ub19uYW1lJyk7CiAgICAgICAgJHRoaXMtPlJlZGlyZWN0KCRpZCwgJ2FkbWluX2FkZF9tYXAnLCAkcmV0dXJuaWQsICRwYXJhbXMpOwogICAgfQoKCSRtYXAtPm5hbWUgPSAkcGFyYW1zWyduYW1lJ107CgkkbWFwLT50aXRsZSA9ICRwYXJhbXNbJ3RpdGxlJ107CgkkbWFwLT5iYXNlbWFwID0gJHBhcmFtc1snYmFzZW1hcCddOwoJJG1hcC0+b3ZlcmxheSA9ICRwYXJhbXNbJ292ZXJsYXknXTsKICAgICRtYXAtPm92ZXJsYXlfcGFyYW1ldGVycyA9ICRwYXJhbXNbJ292ZXJsYXlfcGFyYW1ldGVycyddOwoJJG1hcC0+aW5pdGlhbF9leHRlbnQgPSAkcGFyYW1zWydpbml0aWFsX2V4dGVudCddOwoJJG1hcC0+dGVtcGxhdGVfbmFtZSA9ICRwYXJhbXNbJ3RlbXBsYXRlX25hbWUnXTsKCW1hcF9vcGVyYXRpb25zOjpzYXZlX21hcCgkbWFwKTsKCn0gZWxzZSB7CgkvLyBlcnJvciBjb25kaXRpb24/Cn0KCSR0aGlzLT5SZWRpcmVjdFRvQWRtaW5UYWIoJ21hcHMnKTsKCj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/event.Core.ContentPostRender.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyogdmltOiBzZXQgZXhwYW5kdGFiIHRhYnN0b3A9NCBzaGlmdHdpZHRoPTQgc29mdHRhYnN0b3A9NDogKi8KCi8qKgogKiBQcm9jZXNzIHRoZSBwYWdlIHBvc3QtcmVuZGVyLiBTcGVjaWZpY2FsbHksIGFkZCB0aGUgbGVhZmxldCBKUyBzY3JpcHRzIGFuZAogKiBDU1MgdG8gdGhlIHBhZ2UuCiAqCiAqIGNvcHlyaWdodCAyMDEzLCBSZWdpb25hbCBEaXN0cmljdCBvZiBGcmFzZXItRm9ydCBHZW9yZ2UKICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQogKiBhbnkgbGF0ZXIgdmVyc2lvbi4KCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAogKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgogKiBtb3JlIGRldGFpbHMuICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQSBPcgogKiByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMCgoqKi8KCmlmICghaXNzZXQoJGdDbXMpKSBleGl0OwokbW9kID0gY21zX3V0aWxzOjpnZXRfbW9kdWxlKCdSRE1hcCcpOwoKJGNvbnRlbnQgPSAkcGFyYW1zWydjb250ZW50J107CmlmIChzdHJwb3MoJGNvbnRlbnQsICdMLm1hcCgnKSAhPT0gZmFsc2UpCnsKJGRldGFpbF9rZXl3b3JkcyA9ICcnOwoKLy8gR2V0IHRoZSBoZWFkIHNlY3Rpb24gb2YgdGhlIGRvY3VtZW50CgokaGVhZHN0YXJ0ID0gc3RycG9zKCRjb250ZW50LCc8aGVhZD4nKTsKJGhlYWRlbmQgICA9IHN0cnBvcygkY29udGVudCwnPC9oZWFkPicpOwokaGVhZGxlbmd0aCA9ICRoZWFkZW5kIC0gJGhlYWRzdGFydDsKJGhlYWRjb250ZW50ID0gc3Vic3RyKCRjb250ZW50LCRoZWFkc3RhcnQsJGhlYWRsZW5ndGgpOwoKLy8gY3NzIGZpbGUKaWYgKHByZWdfbWF0Y2goIi9ccyo8bGluay4qbGVhZmxldC5jc3MvIiwgJGhlYWRjb250ZW50KSkgewoJJGhlYWRjb250ZW50IC49ICc8IS0tIFJEIE1hcCBtb2R1bGUgZm91bmQgYW5vdGhlciBsZWFmbGV0IGNzcyBmaWxlIGhlcmUuIFJlbW92ZSBpdCBmcm9tIHRoZSB0ZW1wbGF0ZSB0byB1c2UgdGhlIG9uZSBpbmNsdWRlZCBieSB0aGUgTWFwIG1vZHVsZVxuIC0tPic7Cn0KZWxzZSB7CgkkaGVhZGNvbnRlbnQgLj0gIjxsaW5rIHJlbD1cInN0eWxlc2hlZXRcIiBocmVmPVwiaHR0cDovL2Nkbi5sZWFmbGV0anMuY29tL2xlYWZsZXQtMC43LjIvbGVhZmxldC5jc3NcIiAvPlxyXG4iOwp9CgovLyBqYXZhc2NyaXB0IGZpbGVzCmlmIChwcmVnX21hdGNoKCcvXHMqPHNjcmlwdC4qXC9sZWFmdGxldC5qcy8nLCRoZWFkY29udGVudCkpIHsKCSRoZWFkY29udGVudCAuPSAiPCEtLSBSRCBNYXAgbW9kdWxlIGZvdW5kIGFub3RoZXIgbGVhZmxldC5qcyBmaWxlIGluY2x1ZGVkLiBSZW1vdmUgaXQgZnJvbSB0aGUgdGVtcGxhdGUgdG8gdXNlIHRoZSBvbmUgaW5jbHVkZWQgYnkgdGhlIE1hcCBtb2R1bGUuIC0tPlxuIjsKfQplbHNlIHsKCSRoZWFkY29udGVudCAuPSAiXHQ8c2NyaXB0IHNyYz1cImh0dHA6Ly9jZG4ubGVhZmxldGpzLmNvbS9sZWFmbGV0LTAuNy4yL2xlYWZsZXQuanNcIj48L3NjcmlwdD5cclxuIjsKfQppZiAocHJlZ19tYXRjaCgnL3MqPHNjcmlwdC4qZXNyaS1sZWFmbGV0LmpzLycsICRoZWFkY29udGVudCkpIHsKCSRoZWFkY29udGVudCAuPSAiPCEtLSBSRCBNYXAgbW9kdWxlIGZvdW5kIGFub3RoZXIgZXNyaS1sZWFmbGV0LmpzIGZpbGUgaW5jbHVkZWQuIFJlbW92ZSBpdCBmcm9tIHRoZSB0ZW1wbGF0ZSB0byB1c2UgdGhlIG9uZSBpbmNsdWRlZCBieSB0aGUgTWFwIG1vZHVsZS4gLS0+XG4iOwp9IGVsc2UgewoJJGhlYWRjb250ZW50IC49ICJcdDxzY3JpcHQgc3JjPVwiIi4kdGhpcy0+R2V0TW9kdWxlVXJsUGF0aCgpLiIvbGliL2pzL2VzcmktbGVhZmxldC9lc3JpLWxlYWZsZXQtc3JjLmpzXCI+PC9zY3JpcHQ+XHJcbiI7Cn0KCgokY29udGVudCA9IHN1YnN0cl9yZXBsYWNlKCRjb250ZW50LCRoZWFkY29udGVudCwkaGVhZHN0YXJ0LCRoZWFkbGVuZ3RoKTsKCiRwYXJhbXNbJ2NvbnRlbnQnXSA9ICRjb250ZW50Owp9Cj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/images/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/images/icon.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhIAAgAKEEAAAAAAAA/38AAP7+/iwAAAAAIAAgAAACoNwSpiPrDw1yosX7JsVc6WV11weGYpY81QMAJ6msS3sel1xLSAqZogYD1VyLXQQ3ABBny2LQEFI6lE3nE6mgVq1Bn0E72vGg2CQVI+aFfNKtxwkVZr+RscfrddtU9jjdtdVn0TeTZOhgh0P4pRQQuFEUAXj4JhcJASh16ZeBaQiQNublYTc5JtrRB4poifZWlZgjAVsiW9dqqwOZW4mLUQAAOw==]]></data>
	</file>
	<file>
	  <filename>/index.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[]]></data>
	</file>
	<file>
	  <filename>/lang/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lang/en_US.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyogdmltOiBzZXQgZXhwYW5kdGFiIHRhYnN0b3A9NCBzaGlmdHdpZHRoPTQgc29mdHRhYnN0b3A9NDogKi8KCi8qKgogKgogKiBjb3B5cmlnaHQgMjAxMywgUmVnaW9uYWwgRGlzdHJpY3Qgb2YgRnJhc2VyLUZvcnQgR2VvcmdlCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCiAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKICogYW55IGxhdGVyIHZlcnNpb24uCgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKICogbW9yZSBkZXRhaWxzLiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EgT3IKICogcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAoKKiovCgoKJGxhbmdbJ2FkZF9tYXAnXSA9ICdBZGQgTWFwJzsKJGxhbmdbJ2FkZF90ZW1wbGF0ZSddID0gJ0FkZCBUZW1wbGF0ZSc7CiRsYW5nWydjb3B5X21hcCddID0gJ0NvcHkgTWFwJzsKJGxhbmdbJ2NvcHlfdGVtcGxhdGUnXSA9ICdDb3B5IFRlbXBsYXRlJzsKJGxhbmdbJ2RlbGV0ZV9tYXAnXSA9ICdEZWxldGUgTWFwJzsKJGxhbmdbJ2RlbGV0ZV90ZW1wbGF0ZSddID0gJ0RlbGV0ZSBUZW1wbGF0ZSc7CiRsYW5nWydlZGl0X21hcCddID0gJ0VkaXQgTWFwJzsKJGxhbmdbJ2VkaXRfdGVtcGxhdGUnXSA9ICdFZGl0IFRlbXBsYXRlJzsKJGxhbmdbJ2Vycm9yX21hcF9ub19uYW1lJ10gPSAnVGhlIG1hcCBtdXN0IGhhdmUgbmFtZSc7CiRsYW5nWydlcnJvcl90ZW1wbGF0ZV9ub19uYW1lJ10gPSAnVGhlIHRlbXBsYXRlIG11c3QgaGF2ZSBhIG5hbWUnOwokbGFuZ1snY2FuY2VsJ10gPSAnQ2FuY2VsJzsKJGxhbmdbJ2ZpZWxkX21hcF9pZCddID0gJ01hcCBJRCc7CiRsYW5nWydmaWVsZF9tYXBfdGl0bGUnXSA9ICdUaXRsZSc7CiRsYW5nWydmaWVsZF9tYXBfbmFtZSddID0gJ05hbWUnOwokbGFuZ1snZmllbGRfbWFwX2Jhc2VtYXAnXSA9ICdCYXNlbWFwJzsKJGxhbmdbJ2ZpZWxkX21hcF9vdmVybGF5J10gPSAnT3ZlcmxheSBNYXAnOwokbGFuZ1snZmllbGRfbWFwX2luaXRpYWxfZXh0ZW50J10gPSAnSW5pdGlhbCBFeHRlbnQnOwokbGFuZ1snZmllbGRfdGVtcGxhdGVfaWQnXSA9ICdUZW1wbGF0ZSBJRCc7CiRsYW5nWydmaWVsZF90ZW1wbGF0ZV9uYW1lJ10gPSAnTmFtZSc7IAokbGFuZ1snZnJpZW5kbHluYW1lJ10gPSAnUkQgTWFwJzsKJGxhbmdbJ2hlbHAnXSA9ICc8aDM+V2hhdCBpcyB0aGlzIHRoaW5nPzwvaDM+CjxwPlRoZSBSRCBNYXAgbW9kdWxlIGNhbiBkaXNwbGF5IGEgbWFwIG9uIGEgcGFnZS4gVGhhdFwncyBhYm91dCBpdCwgcmVhbGx5LiBBIG1hcCBoYXMgYSBiYXNlbWFwIGxheWVyLCBhbmQgY2FuIGhhdmUgYW4gb3ZlcmxheSBsYXllci48L3A+PGgzPkhvdyBEbyBJIFVzZSBJdD88L2gzPgo8cD5XaGVuIGVkaXRpbmcgYSBwYWdlIChvciB0ZW1wbGF0ZSksIHBsYWNlIHRoZSB7UkRNYXB9IHRhZyBzb21ld2hlcmUuIFRoZSBtYXAgdGFnIGhhcyBvbmUgcmVxdWlyZWQgYXJndW1lbnQsIHRoYXQgb2YgdGhlIG5hbWUgb2YgdGhlIG1hcCB0byBpbmNsdWRlLCBsaWtlIHNvOiA8dHQ+e1JETWFwJm5ic3A7bmFtZT0mbHQ7bWFwX25hbWUmZ3Q7fTwvdHQ+LjwvcD4KPGgzPkNyZWF0aW5nIE1hcHM8L2gzPjxwPgpTbyBmYXIsIHRoZSBkZWZhdWx0IG1hcCB0ZW1wbGF0ZSByZXF1aXJlcyBhbiBBcmNHSVMgdGlsZWQgbWFwIHNlcnZpY2UgZm9yIGEgYmFzZW1hcCwgYW5kIGFuIEFyY0dJUyBmZWF0dXJlIHNlcnZpY2UgZm9yIHRoZSBvdmVybGF5IG1hcC4gVGhlIG1hcCB0ZW1wbGF0ZXMgYXJlIGNvbXBsZXRlbHkgY3VzdG9taXphYmxlLCBob3dldmVyLgo8aDQ+TWFwIE5hbWVzIGFuZCBUaXRsZXM8L2g0Pgo8cD5UaGUgbWFwIG5hbWUgaXMgYSBoYW5keSBuYW1lIHRoYXQgdGhlIHNpdGUgYWRtaW5pc3RyYXRvciBjYW4gdXNlIHRvIHJlZmVyZW5jZSB0aGUgbWFwIG9uIHRoZSBwYWdlcyB3aGVyZSBpdCBhcHBlYXJzLiBUaGUgc2l0ZSB1c2VycyBzaG91bGQgbmV2ZXIgc2VlIGl0LiBUaGUgbWFwIHRpdGxlIHNob3dzIHVwIGluIHRoZSBkZWZhdWx0IHRlbXBsYXRlIHJpZ2h0IGFib3ZlIHRoZSBtYXAuCjwvcD48aDQ+QmFzZW1hcHM8L2g0PjxwPlRoZSBiYXNlbWFwIHNob3VsZCBiZSB0aGUgVVJMIHRvIHRoZSBzZXJ2aWNlIHRoYXQgcHJvdmlkZXMgdGhlIHJhc3RlciBiYXNlbWFwIHRpbGVzLiBCeSBkZWZhdWx0IHRoaXMgaXMgQXJjR0lTIFNlcnZlciwgYW5kIHNob3VsZCBiZSB0aGUgVVJMIHJpZ2h0IHVwIHRvIChhbmQgaW5jbHVkaW5nKSB0aGUgTWFwU2VydmVyIHBhcnQuIEFueSBvdGhlciBraW5kIG9mIGJhc2VtYXAgc2VydmljZSB3aWxsIHJlcXVpcmUgYSBjdXN0b21pemVkIHRlbXBsYXRlIHRvIHN1cHBvcnQuPC9wPgo8aDQ+SW5pdGlhbCBNYXAgRXh0ZW50PGg0PjxwPgpUaGUgaW5pdGlhbCBtYXAgZXh0ZW50IHNldHRpbmcgZGV0ZXJtaW5lcyB3aGVyZSB0aGUgY2VudHJlIG9mIHRoZSBtYXAgYW5kIHRoZSB6b29tIGxldmVsIGFzIHRoZSBtYXAgbG9hZHMuIFRoZSBleHRldG50IHNob3VsZCBiZSBmb3JtYXR0ZWQgYXMgPHR0PmxhdC9sb25nL3pvb208L3R0Piwgd2hlcmUgPHR0PmxhdDwvdHQ+IGFuZCA8dHQ+bG9uZzwvdHQgYXJlIGluIGRlY2ltYWwgZGVncmVlcywgYW5kIHRoZSA8dHQ+em9vbTwvdHQ+IGlzIGFuIGludGVnZXIgYmV0d2VlbiAxIGFuZCAyMC48L3A+CjxoND5NYXAgT3ZlcmxheSBhbmQgT3ZlcmxheSBQYXJhbWV0ZXJzPC9oND48cD4KV2l0aCB0aGUgZGVmYXVsdCB0ZW1wbGF0ZSwgdGhlIG1hcCBvdmVybGF5IGlzIHRyZWF0ZWQgYXMgYW4gQXJjR0lTIFJFU1QgRmVhdHVyZVNlcnZlciBsYXllci4gT3RoZXIgc2VydmljZXMgYXJlIHBvc3NpYmxlIChhcyB1c3VhbCkgd2l0aCBhIGN1c3RvbWl6ZWQgdGVtcGxhdGUuIFRoZSBvcHRpb25hbCBvdmVybGF5IHBhcmFtZXRlcnMgYXJlIGV4dHJhIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gYmUgYWRkZWQgb24gdG8gZXZlcnkgcmVxdWVzdCB0byB0aGUgc2VydmVyLCBhbmQgbWlnaHQgYmUgc29tZXRoaW5nIGxpa2U8L3A+CjxwcmU+d2hlcmU9TkFNRSBMSUtFICJTVEFUSU9OIjwvcHJlPgo8cD5Gb3IgdGhlIGRlZmF1bHQgdGVtcGxhdGUsIHRoZSBvbmx5IGN1cnJlbnRseSBzdXBwb3J0ZWQgcGFyYW1ldGVycyBhcmUgPHR0PndoZXJlPC90dD4gYW5kIDx0dD50b2tlbjwvdHQ+Lgo8cD5NdWx0aXBsZSBwYXJhbWV0ZXJzIGNhbiBiZSBzZXBhcmF0ZWQgYnkgc2VtaWNvbG9ucy4KPC9wPic7CiRsYW5nWydoZWxwX25hbWUnXSA9ICdUaGUgbmFtZSBvZiB0aGUgbWFwIHRvIGJlIHBsYWNlZCBvbiB0aGUgcGFnZS4gVGhpcyBuYW1lIHdvblwndCBzaG93IHVwIGFueXdoZXJlIHRoZSBzaXRlIHVzZXJzIGNhbiBzZWUsIGFuZCBjYW5cJ3QgaGF2ZSBhbnkgc3BhY2VzIG9yIHNwZWNpYWwgY2hhcmFjdGVycy4nOwokbGFuZ1snaGVscF9tYXBfYmFzZW1hcCddID0gJ1VybCB0byB0aGUgdGlsaW5nIG1hcCBzZXJ2aWNlIHRoYXQgc2VydmVzIGFzIHRoZSBiYXNlbWFwJzsKJGxhbmdbJ2hlbHBfbWFwX2V4dGVudCddID0gJ1RoZSBpbml0aWFsIGV4dGVudCBvZiB0aGUgbWFwLCBnaXZlbiBpbiB0aGUgZm9ybSBvZiBsb25naXR1ZGUvbGF0aXR1ZGUvem9vbS4gTGF0L2xvbmcgYXJlIGluIGRlY2ltYWwgZGVncmVlcywgYW5kIG1hcmsgdGhlIGNlbnRyZSBvZiB0aGUgbWFwLiBUaGUgWm9vbSBwYXJhbWV0ZXIgaXMgYSBudW1iZXIgYmV0d2VlbiAwIGFuZCAxOS4nOwokbGFuZ1snaGVscF9tYXBfbmFtZSddID0gJ1RoZSBuYW1lIGlzIHVzZWQgYnkgdGhlIHtSRE1hcH0gdGFnIGFuZCBzaG91bGQgY29udGFpbiBubyBzcGFjZXMgb3IgcHVuY3R1YXRpb24uJzsKJGxhbmdbJ2hlbHBfbWFwX292ZXJsYXknXSA9ICdVcmwgdG8gdGhlIG92ZXJsYXkgbWFwLiBUaGlzIHNob3VsZCBiZSBhIGZlYXR1cmUgc2VydmljZSB0aGF0IGNhbiBiZSBxdWVyaWVkIGZvciBhdHRyaWJ1dGVzLic7CiRsYW5nWydoZWxwX21hcF9vdmVybGF5X3BhcmFtZXRlcnMnXSA9ICdBZGRpdGlvbmFsIHBhcmFtZXRlcnMgdG8gaW5jbHVkZSB3aGVuIHF1ZXJ5aW5nIGZvciBvdmVybGF5IGZlYXR1cmVzLiBUaGUgdHlwaWNhbCB1c2Ugd291bGQgYmUgYSBBcmNHSVMgUkVTVCB3aGVyZSBjbGF1c2UuJzsKJGxhbmdbJ2hlbHBfbWFwX3RpdGxlJ10gPSAnVGhlIHRpdGxlIG9mIHRoZSBtYXAgdGhhdCB3aWxsIHNob3cgdXAgb24gdGhlIHBhZ2UuJzsKJGxhbmdbJ2hlbHBfdGVtcGxhdGUnXSA9ICdUaGUgdGVtcGxhdGUgZm9yIHRoZSBtYXAuIFRlbXBsYXRlcyBjYW4gYmUgY3VzdG9taXNlZCB0byBjb21wbGV0ZWx5IHJlZGVzaWduIGxvb2sgYW5kIGZ1bmN0aW9uIG9mIHRoZSBtYXAuJzsKJGxhbmdbJ2hlbHBfdGVtcGxhdGVfbmFtZSddID0gIlRoZSBuYW1lIG9mIHRoZSB0ZW1wbGF0ZS4gTWFrZSB0aGlzIGRlc2NyaXB0aXZlIGVub3VnaCB0aGF0IGl0XCdzIGVhc3kgdG8gaWRlbnRpZnkgd2hlbiBjcmVhdGluZyBhIG1hcC4iOwokbGFuZ1snaGVscF90ZW1wbGF0ZV9jb2RlJ10gPSAnVGhlIGNvZGUgdGhhdCBkZXNjcmliZSB0aGUgbG9vayBhbmQgYmVoYXZpb3VyIG9mIHRoZSBtYXAnOwokbGFuZ1snaW5zdGFsbGVkJ10gPSAnaW5zdGFsbGVkJzsKJGxhbmdbJ21hcF9uYW1lX25vdF9zZXQnXSA9ICdNYXAgZXJyb3I6IHRoZSBtYXAgbmFtZSB3YXMgbm90IHNldCc7CiRsYW5nWydlcnJvcl9tYXBfbm90X2ZvdW5kJ10gPSAnVGhlIG1hcCB3YXMgbm90IGZvdW5kJzsKJGxhbmdbJ3N1Ym1pdCddID0gJ1N1Ym1pdCc7CiRsYW5nWyd0aXRsZV9iYXNlbWFwJ10gPSAnQmFzZW1hcCc7CiRsYW5nWyd0aXRsZV9kZWZhdWx0X2Jhc2VtYXAnXSA9ICdEZWZhdWx0IEJhc2VtYXAnOwokbGFuZ1sndGl0bGVfZGVmYXVsdF9leHRlbnQnXSA9ICdEZWZhdWx0IE1hcCBFeHRlbnRzJzsKJGxhbmdbJ3RpdGxlX2luaXRpYWxfZXh0ZW50J10gPSAnSW5pdGlhbCBNYXAgRXh0ZW50JzsKJGxhbmdbJ3RpdGxlX2lucHV0X2RlZmF1bHRfYmFzZW1hcF9oZWxwJ10gPSAnU2V0IHRoZSBkZWZhdWx0IGJhc2VtYXAgdXJsJzsKJGxhbmdbJ3RpdGxlX2dlbmVyYWwnXSA9ICdHZW5lcmFsJzsKJGxhbmdbJ3RpdGxlX21hcHMnXSA9ICdNYXBzJzsKJGxhbmdbJ3RpdGxlX21hcF9uYW1lJ10gPSAnTmFtZSc7CiRsYW5nWyd0aXRsZV9tYXBfdGl0bGUnXSA9ICdUaXRsZSc7CiRsYW5nWyd0aXRsZV9vdmVybGF5J10gPSAnTWFwIE92ZXJsYXknOwokbGFuZ1sndGl0bGVfb3ZlcmxheV9wYXJhbWV0ZXJzJ10gPSAnTWFwIE92ZXJsYXkgQWRkaXRpb25hbCBQYXJhbWV0ZXJzJzsKJGxhbmdbJ3RpdGxlX3ByZWZzJ10gPSAnUHJlZmVyZW5jZXMnOwokbGFuZ1sndGl0bGVfdGVtcGxhdGVfbmFtZSddID0gJ01hcCBUZW1wbGF0ZSc7CiRsYW5nWyd0aXRsZV90ZW1wbGF0ZV9jb2RlJ10gPSAnVGVtcGxhdGUgQ29kZSc7CiRsYW5nWyd0aXRsZV90ZW1wbGF0ZXMnXSA9ICdUZW1wbGF0ZXMnOwokbGFuZ1sndW5pbnN0YWxsZWQnXSA9ICd1bmluc3RhbGxlZCc7CiRsYW5nWyd1cGdyYWRlX2ZhaWxlZCddID0gJ1VwZ3JhZGUgZmFpbGVkJzsKJGxhbmdbJ3dlbGNvbWVfdGV4dCddID0gJzxwPlRoaXMgaXMgdGhlIFJEIE1hcHMgbW9kdWxlLiBQbGFjZSBpdCBvbiBhIHBhZ2Ugd2l0aCB0aGUge1JETWFwIG5hbWU9Jmx0O21hcF9uYW1lJmd0O30gdGFnLjwvcD4nOwo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/class.map_operations.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyogdmltOiBzZXQgZXhwYW5kdGFiIHRhYnN0b3A9NCBzaGlmdHdpZHRoPTQgc29mdHRhYnN0b3A9NDogKi8KCi8qKgogKiBTYXZlIGFuZCBsb2FkIG1hcHMgdG8vZnJvbSB0aGUgZGF0YWJhc2UKICoKICogY29weXJpZ2h0IDIwMTMsIFJlZ2lvbmFsIERpc3RyaWN0IG9mIEZyYXNlci1Gb3J0IEdlb3JnZQogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQogKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCiAqIGFueSBsYXRlciB2ZXJzaW9uLgoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgogKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCiAqIG1vcmUgZGV0YWlscy4gIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBIE9yCiAqIHJlYWQgaXQgb25saW5lOiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwKCioqLwoKZmluYWwgY2xhc3MgbWFwX29wZXJhdGlvbnMgewoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzYXZlX21hcChyZGZmZ19tYXAmICRtYXApIHsKCQkkZGIgPSBjbXNtcygpLT5HZXREYigpOwoJCSR0bXAgPSBzZWxmOjptYXBfdG9fcm93KCRtYXApOwoJCWlmIChpc19udWxsKCRtYXAtPm1hcF9pZCkpIHsKCQkJLy8gc2F2ZSBtYXAKCQkJJHNxbCA9ICJJTlNFUlQgSU5UTyAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX3JkbWFwIChuYW1lLCB0aXRsZSwgYmFzZW1hcCwgb3ZlcmxheSwgaW5pdGlhbF9leHRlbnQsIHRlbXBsYXRlX25hbWUpIFZBTFVFUyAoPyw/LD8sPyw/LD8pIjsKCQl9CgkJZWxzZSB7CgkJCS8vIHVwZGF0ZSBtYXAKCQkJJHNxbCA9ICJVUERBVEUgIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9yZG1hcCBTRVQgbmFtZSA9ID8sIHRpdGxlID0gPywgYmFzZW1hcCA9ID8sIG92ZXJsYXkgPSA/LCBpbml0aWFsX2V4dGVudCA9ID8sIHRlbXBsYXRlX25hbWUgPSA/IFdIRVJFIG1hcF9pZCA9ID8iOwoJCQkkdG1wWydtYXBfaWQnXSA9IChpbnQpJG1hcC0+bWFwX2lkOwoJCX0KCQlpZighJGRiLT5FeGVjdXRlKCRzcWwsICR0bXApKSB7CgkJCWRpZSAoJGRiLT5zcWwuJzxici8+Jy4kZGItPkVycm9yTXNnKCkpOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCQlpZiAoaXNfbnVsbCgkbWFwLT5tYXBfaWQpKSB7CgkJCSRtYXAtPm1hcF9pZCA9ICRkYi0+SW5zZXJ0X0lkKCk7CgkJfQoJCXJldHVybiB0cnVlOwoJfQoKCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0X21hcF9ieV9pZCgkaWQpIHsKCQkkZGIgPSBjbXNtcygpLT5HZXREYigpOwoJCSRxID0gJ1NFTEVDVCAqIEZST00gJy5jbXNfZGJfcHJlZml4KCkuJ21vZHVsZV9yZG1hcCBXSEVSRSBtYXBfaWQgPSA/JzsKCQkkcmVzdWx0ID0gJGRiLT5FeGVjdXRlKCRxLCBhcnJheSgkaWQpKTsKCQlpZiAoJHJlc3VsdCAhPT0gZmFsc2UpIHsgCgkJCSRyb3cgPSAkcmVzdWx0LT5GZXRjaFJvdygpOwoJCQkkbWFwID0gc2VsZjo6cm93X3RvX21hcCgkcm93KTsKCQl9CgkJZWxzZSB7CgkJCXRocm93IG5ldyBFeGNlcHRpb24oJ21hcCBub3QgZm91bmQnKTsKCQl9CgkJcmV0dXJuICRtYXA7Cgl9CgoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRfbWFwX2J5X25hbWUoJG5hbWUpIHsKCQkkZGIgPSBjbXNtcygpLT5HZXREYigpOwoJCSRxID0gJ1NFTEVDVCAqIEZST00gJy5jbXNfZGJfcHJlZml4KCkuJ21vZHVsZV9yZG1hcCBXSEVSRSBuYW1lID0gPyc7CgkJJHJlc3VsdCA9ICRkYi0+RXhlY3V0ZSgkcSwgYXJyYXkoJG5hbWUpKTsKCQlpZiAoJHJlc3VsdCAhPT0gZmFsc2UgJiYgJHJlc3VsdC0+UmVjb3JkQ291bnQoKSA9PSAxKSB7CgkJCSRyb3cgPSAkcmVzdWx0LT5GZXRjaFJvdygpOwoJCQkkbWFwID0gc2VsZjo6cm93X3RvX21hcCgkcm93KTsKCQl9IGVsc2UgewoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCdtYXAgbm90IGZvdW5kLCcuJGRiLT5zcWwpOwoJCX0KCgkJcmV0dXJuICRtYXA7Cgl9CgoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRfbWFwcygpIHsKCQkkbWFwcyA9IGFycmF5KCk7CgkJJGRiID0gY21zbXMoKS0+R2V0RGIoKTsKCQkkcSA9ICdTRUxFQ1QgKiBGUk9NICcuY21zX2RiX3ByZWZpeCgpLidtb2R1bGVfcmRtYXAnOwoJCSRyZXN1bHQgPSAkZGItPkV4ZWN1dGUoJHEpOwoJCWlmICgkcmVzdWx0ICE9PSBmYWxzZSkgewoJCQlmb3JlYWNoICgkcmVzdWx0LT5HZXRSb3dzKCkgYXMgJHJvdykgewoJCQkJJG1hcHNbXSA9IHNlbGY6OnJvd190b19tYXAoJHJvdyk7CgkJCX0KCQl9CgkJcmV0dXJuICRtYXBzOwoJfQoKCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWFwX3RvX3JvdyhyZGZmZ19tYXAmICRtYXApIHsKCQkkYXJyID0gYXJyYXkoKTsKCQkvLyRhcnJbXSA9ICRtYXAtPm1hcF9pZDsKCQkkYXJyW10gPSAkbWFwLT5uYW1lOwoJCSRhcnJbXSA9ICRtYXAtPnRpdGxlOwoJCSRhcnJbXSA9ICRtYXAtPmJhc2VtYXA7CgkJJGFycltdID0gJG1hcC0+b3ZlcmxheTsKCQkkYXJyW10gPSAkbWFwLT5pbml0aWFsX2V4dGVudDsKCQkkYXJyW10gPSAkbWFwLT50ZW1wbGF0ZV9uYW1lOwoJCXJldHVybiAkYXJyOwoJfQoKCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gJnJvd190b19tYXAoJHJvdykgewoJCSRtID0gbmV3IHJkZmZnX21hcDsKCQkkbS0+bWFwX2lkID0gJHJvd1snbWFwX2lkJ107CgkJJG0tPm5hbWUgPSAkcm93WyduYW1lJ107CgkJJG0tPnRpdGxlID0gJHJvd1sndGl0bGUnXTsKCQkkbS0+YmFzZW1hcCA9ICRyb3dbJ2Jhc2VtYXAnXTsKCQkkbS0+b3ZlcmxheSA9ICRyb3dbJ292ZXJsYXknXTsKCQkkbS0+aW5pdGlhbF9leHRlbnQgPSAkcm93Wydpbml0aWFsX2V4dGVudCddOwoJCSRtLT50ZW1wbGF0ZV9uYW1lID0gJHJvd1sndGVtcGxhdGVfbmFtZSddOwoJCXJldHVybiAkbTsKCX0KCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGRlbGV0ZV9tYXAocmRmZmdfbWFwJiAkbWFwKSB7CgkJaWYgKCFpc3NldCgkbWFwLT5tYXBfaWQpKSB7CgkJCXRocm93IG5ldyBFeGNlcHRpb24oJ0NhblwndCBkZWxldGUgYSBtYXAgd2l0aCBubyBJRCcpOwoJCX0KCQkkZGIgPSBjbXNtcygpLT5HZXREYigpOwoJCSRxID0gJ0RFTEVURSBGUk9NICcuY21zX2RiX3ByZWZpeCgpLidtb2R1bGVfcmRtYXAgV0hFUkUgbWFwX2lkID0gPyc7CgkJJHJlc3VsdCA9ICRkYi0+RXhlY3V0ZSgkcSxhcnJheSgkbWFwLT5tYXBfaWQpKTsKCQlpZiAoJHJlc3VsdCAhPT0gZmFsc2UpIHsKCQkJcmV0dXJuOwoJCX0KCQllbHNlIHsKCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbignRmFpbGVkIHRvIGRlbGV0ZSB0aGUgbWFwJyk7CgkJfQoJfQp9Cj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/class.rdffg_map.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyogdmltOiBzZXQgZXhwYW5kdGFiIHRhYnN0b3A9NCBzaGlmdHdpZHRoPTQgc29mdHRhYnN0b3A9NDogKi8KCi8qKgogKiBSZXByZXNlbnRzIGEgbWFwCiAqCiAqIGNvcHlyaWdodCAyMDEzLCBSZWdpb25hbCBEaXN0cmljdCBvZiBGcmFzZXItRm9ydCBHZW9yZ2UKICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQogKiBhbnkgbGF0ZXIgdmVyc2lvbi4KCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAogKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgogKiBtb3JlIGRldGFpbHMuICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQSBPcgogKiByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMCgoqKi8KCgoJY2xhc3MgcmRmZmdfbWFwIHsKCQlwdWJsaWMgJG1hcF9pZCA9IE5VTEw7CgkJcHVibGljICRuYW1lID0gTlVMTDsKCQlwdWJsaWMgJHRpdGxlID0gTlVMTDsKCQlwdWJsaWMgJGJhc2VtYXAgPSBOVUxMOwoJCXB1YmxpYyAkb3ZlcmxheQk9IE5VTEw7CiAgICAgICAgcHVibGljICRvdmVybGF5X3BhcmFtZXRlcnMgPSBOVUxMOwoJCXB1YmxpYyAkaW5pdGlhbF9leHRlbnQgPSBOVUxMOwoJCXB1YmxpYyAkdGVtcGxhdGVfbmFtZSA9IE5VTEw7CgkJcHVibGljICRlZGl0X2xpbmsgPSBOVUxMOwoJCXB1YmxpYyAkbWFwX2xpbmsgPSBOVUxMOwoJCXB1YmxpYyAkY29weV9saW5rID0gTlVMTDsKCQlwdWJsaWMgJGRlbGV0ZV9saW5rID0gTlVMTDsKCX0KPz4K]]></data>
	</file>
	<file>
	  <filename>/lib/class.rdffg_template.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCmNsYXNzIHJkZmZnX3RlbXBsYXRlIGV4dGVuZHMgQ21zTGF5b3V0VGVtcGxhdGUgewoJcHVibGljICRlZGl0X2xpbmsgPSBOVUxMOwoJcHVibGljICRlZGl0X2ltYWdlbGluayA9IE5VTEw7CglwdWJsaWMgJGRlbGV0ZV9saW5rID0gTlVMTDsKCXB1YmxpYyAkY29weV9saW5rID0gTlVMTDsKfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/js/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/js/esri-leaflet/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/js/esri-leaflet/esri-leaflet-src.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohIEVzcmktTGVhZmxldCAtIHYwLjAuMSAtIDIwMTMtMDktMjYKKiAgIENvcHlyaWdodCAoYykgMjAxMyBFbnZpcm9ubWVudGFsIFN5c3RlbXMgUmVzZWFyY2ggSW5zdGl0dXRlLCBJbmMuCiogICBBcGFjaGUgTGljZW5zZSovCihmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSkgewoKICAvLyBOb2RlLgogIGlmKHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUuZXhwb3J0cyA9PT0gJ29iamVjdCcpIHsKICAgIGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTsKICB9CgogIC8vIEJyb3dzZXIgR2xvYmFsLgogIGlmKHR5cGVvZiB3aW5kb3cgPT09ICJvYmplY3QiKSB7CiAgICByb290LlRlcnJhZm9ybWVyID0gZmFjdG9yeSgpOwogIH0KCn0odGhpcywgZnVuY3Rpb24oKXsKICB2YXIgZXhwb3J0cyA9IHt9LAogICAgICBFYXJ0aFJhZGl1cyA9IDYzNzgxMzcsCiAgICAgIERlZ3JlZXNQZXJSYWRpYW4gPSA1Ny4yOTU3Nzk1MTMwODIzMjAsCiAgICAgIFJhZGlhbnNQZXJEZWdyZWUgPSAgMC4wMTc0NTMyOTI1MTk5NDMsCiAgICAgIE1lcmNhdG9yQ1JTID0gewogICAgICAgICJ0eXBlIjogImxpbmsiLAogICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgImhyZWYiOiAiaHR0cDovL3NwYXRpYWxyZWZlcmVuY2Uub3JnL3JlZi9zci1vcmcvNjkyOC9vZ2N3a3QvIiwKICAgICAgICAgICJ0eXBlIjogIm9nY3drdCIKICAgICAgICB9CiAgICAgIH0sCiAgICAgIEdlb2dyYXBoaWNDUlMgPSB7CiAgICAgICAgInR5cGUiOiAibGluayIsCiAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAiaHJlZiI6ICJodHRwOi8vc3BhdGlhbHJlZmVyZW5jZS5vcmcvcmVmL2Vwc2cvNDMyNi9vZ2N3a3QvIiwKICAgICAgICAgICJ0eXBlIjogIm9nY3drdCIKICAgICAgICB9CiAgICAgIH07CgogIC8qCiAgSW50ZXJuYWw6IHNhZmUgd2FybmluZwogICovCiAgZnVuY3Rpb24gd2FybigpIHsKICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmFwcGx5KGFyZ3VtZW50cyk7CgogICAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSB1bmRlZmluZWQgJiYgY29uc29sZS53YXJuKSB7CiAgICAgIGNvbnNvbGUud2Fybi5hcHBseShjb25zb2xlLCBhcmdzKTsKICAgIH0KICB9CgogIC8qCiAgSW50ZXJuYWw6IEV4dGVuZCBvbmUgb2JqZWN0IHdpdGggYW5vdGhlci4KICAqLwogIGZ1bmN0aW9uIGV4dGVuZChkZXN0aW5hdGlvbiwgc291cmNlKSB7CiAgICBmb3IgKHZhciBrIGluIHNvdXJjZSkgewogICAgICBpZiAoc291cmNlLmhhc093blByb3BlcnR5KGspKSB7CiAgICAgICAgZGVzdGluYXRpb25ba10gPSBzb3VyY2Vba107CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBkZXN0aW5hdGlvbjsKICB9CgogIC8qCiAgUHVibGljOiBDYWxjdWxhdGUgYW4gYm91bmRpbmcgYm94IGZvciBhIGdlb2pzb24gb2JqZWN0CiAgKi8KICBmdW5jdGlvbiBjYWxjdWxhdGVCb3VuZHMgKGdlb2pzb24pIHsKCiAgICBzd2l0Y2ggKGdlb2pzb24udHlwZSkgewogICAgICBjYXNlICdQb2ludCc6CiAgICAgICAgcmV0dXJuIFsgZ2VvanNvbi5jb29yZGluYXRlc1swXSwgZ2VvanNvbi5jb29yZGluYXRlc1sxXSwgZ2VvanNvbi5jb29yZGluYXRlc1swXSwgZ2VvanNvbi5jb29yZGluYXRlc1sxXV07CgogICAgICBjYXNlICdNdWx0aVBvaW50JzoKICAgICAgICByZXR1cm4gY2FsY3VsYXRlQm91bmRzRnJvbUFycmF5KGdlb2pzb24uY29vcmRpbmF0ZXMpOwoKICAgICAgY2FzZSAnTGluZVN0cmluZyc6CiAgICAgICAgcmV0dXJuIGNhbGN1bGF0ZUJvdW5kc0Zyb21BcnJheShnZW9qc29uLmNvb3JkaW5hdGVzKTsKCiAgICAgIGNhc2UgJ011bHRpTGluZVN0cmluZyc6CiAgICAgICAgcmV0dXJuIGNhbGN1bGF0ZUJvdW5kc0Zyb21OZXN0ZWRBcnJheXMoZ2VvanNvbi5jb29yZGluYXRlcyk7CgogICAgICBjYXNlICdQb2x5Z29uJzoKICAgICAgICByZXR1cm4gY2FsY3VsYXRlQm91bmRzRnJvbU5lc3RlZEFycmF5cyhnZW9qc29uLmNvb3JkaW5hdGVzKTsKCiAgICAgIGNhc2UgJ011bHRpUG9seWdvbic6CiAgICAgICAgcmV0dXJuIGNhbGN1bGF0ZUJvdW5kc0Zyb21OZXN0ZWRBcnJheU9mQXJyYXlzKGdlb2pzb24uY29vcmRpbmF0ZXMpOwoKICAgICAgY2FzZSAnRmVhdHVyZSc6CiAgICAgICAgcmV0dXJuIGNhbGN1bGF0ZUJvdW5kcyhnZW9qc29uLmdlb21ldHJ5KTsKCiAgICAgIGNhc2UgJ0ZlYXR1cmVDb2xsZWN0aW9uJzoKICAgICAgICByZXR1cm4gY2FsY3VsYXRlQm91bmRzRm9yRmVhdHVyZUNvbGxlY3Rpb24oZ2VvanNvbik7CgogICAgICBjYXNlICdHZW9tZXRyeUNvbGxlY3Rpb24nOgogICAgICAgIHJldHVybiBjYWxjdWxhdGVCb3VuZHNGb3JHZW9tZXRyeUNvbGxlY3Rpb24oZ2VvanNvbik7CgogICAgICBkZWZhdWx0OgogICAgICAgIHRocm93IG5ldyBFcnJvcigiVW5rbm93biB0eXBlOiAiICsgZ2VvanNvbi50eXBlKTsKICAgIH0KICB9CgogIC8qCiAgSW50ZXJuYWw6IENhbGN1bGF0ZSBhbiBib3VuZGluZyBib3ggZnJvbSBhbiBuZXN0ZWQgYXJyYXkgb2YgcG9zaXRpb25zCiAgWwogICAgWwogICAgICBbIFtsbmcsIGxhdF0sW2xuZywgbGF0XSxbbG5nLCBsYXRdIF0KICAgIF0KICAgIFsKICAgICAgW2xuZywgbGF0XSxbbG5nLCBsYXRdLFtsbmcsIGxhdF0KICAgIF0KICAgIFsKICAgICAgW2xuZywgbGF0XSxbbG5nLCBsYXRdLFtsbmcsIGxhdF0KICAgIF0KICBdCiAgKi8KICBmdW5jdGlvbiBjYWxjdWxhdGVCb3VuZHNGcm9tTmVzdGVkQXJyYXlzIChhcnJheSkgewogICAgdmFyIHgxID0gbnVsbCwgeDIgPSBudWxsLCB5MSA9IG51bGwsIHkyID0gbnVsbDsKCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBpbm5lciA9IGFycmF5W2ldOwoKICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBpbm5lci5sZW5ndGg7IGorKykgewogICAgICAgIHZhciBsb25sYXQgPSBpbm5lcltqXTsKCiAgICAgICAgdmFyIGxvbiA9IGxvbmxhdFswXTsKICAgICAgICB2YXIgbGF0ID0gbG9ubGF0WzFdOwoKICAgICAgICBpZiAoeDEgPT09IG51bGwpIHsKICAgICAgICAgIHgxID0gbG9uOwogICAgICAgIH0gZWxzZSBpZiAobG9uIDwgeDEpIHsKICAgICAgICAgIHgxID0gbG9uOwogICAgICAgIH0KCiAgICAgICAgaWYgKHgyID09PSBudWxsKSB7CiAgICAgICAgICB4MiA9IGxvbjsKICAgICAgICB9IGVsc2UgaWYgKGxvbiA+IHgyKSB7CiAgICAgICAgICB4MiA9IGxvbjsKICAgICAgICB9CgogICAgICAgIGlmICh5MSA9PT0gbnVsbCkgewogICAgICAgICAgeTEgPSBsYXQ7CiAgICAgICAgfSBlbHNlIGlmIChsYXQgPCB5MSkgewogICAgICAgICAgeTEgPSBsYXQ7CiAgICAgICAgfQoKICAgICAgICBpZiAoeTIgPT09IG51bGwpIHsKICAgICAgICAgIHkyID0gbGF0OwogICAgICAgIH0gZWxzZSBpZiAobGF0ID4geTIpIHsKICAgICAgICAgIHkyID0gbGF0OwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIHJldHVybiBbeDEsIHkxLCB4MiwgeTIgXTsKICB9CgogIC8qCiAgSW50ZXJuYWw6IENhbGN1bGF0ZSBhIGJvdW5kaW5nIGJveCBmcm9tIGFuIGFycmF5IG9mIGFycmF5cyBvZiBhcnJheXMKICBbCiAgICBbIFtsbmcsIGxhdF0sW2xuZywgbGF0XSxbbG5nLCBsYXRdIF0KICAgIFsgW2xuZywgbGF0XSxbbG5nLCBsYXRdLFtsbmcsIGxhdF0gXQogICAgWyBbbG5nLCBsYXRdLFtsbmcsIGxhdF0sW2xuZywgbGF0XSBdCiAgXQogICovCiAgZnVuY3Rpb24gY2FsY3VsYXRlQm91bmRzRnJvbU5lc3RlZEFycmF5T2ZBcnJheXMgKGFycmF5KSB7CiAgICB2YXIgeDEgPSBudWxsLCB4MiA9IG51bGwsIHkxID0gbnVsbCwgeTIgPSBudWxsOwoKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGlubmVyID0gYXJyYXlbaV07CgogICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGlubmVyLmxlbmd0aDsgaisrKSB7CiAgICAgICAgdmFyIGlubmVyaW5uZXIgPSBpbm5lcltqXTsKICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IGlubmVyaW5uZXIubGVuZ3RoOyBrKyspIHsKICAgICAgICAgIHZhciBsb25sYXQgPSBpbm5lcmlubmVyW2tdOwoKICAgICAgICAgIHZhciBsb24gPSBsb25sYXRbMF07CiAgICAgICAgICB2YXIgbGF0ID0gbG9ubGF0WzFdOwoKICAgICAgICAgIGlmICh4MSA9PT0gbnVsbCkgewogICAgICAgICAgICB4MSA9IGxvbjsKICAgICAgICAgIH0gZWxzZSBpZiAobG9uIDwgeDEpIHsKICAgICAgICAgICAgeDEgPSBsb247CiAgICAgICAgICB9CgogICAgICAgICAgaWYgKHgyID09PSBudWxsKSB7CiAgICAgICAgICAgIHgyID0gbG9uOwogICAgICAgICAgfSBlbHNlIGlmIChsb24gPiB4MikgewogICAgICAgICAgICB4MiA9IGxvbjsKICAgICAgICAgIH0KCiAgICAgICAgICBpZiAoeTEgPT09IG51bGwpIHsKICAgICAgICAgICAgeTEgPSBsYXQ7CiAgICAgICAgICB9IGVsc2UgaWYgKGxhdCA8IHkxKSB7CiAgICAgICAgICAgIHkxID0gbGF0OwogICAgICAgICAgfQoKICAgICAgICAgIGlmICh5MiA9PT0gbnVsbCkgewogICAgICAgICAgICB5MiA9IGxhdDsKICAgICAgICAgIH0gZWxzZSBpZiAobGF0ID4geTIpIHsKICAgICAgICAgICAgeTIgPSBsYXQ7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgcmV0dXJuIFt4MSwgeTEsIHgyLCB5Ml07CiAgfQoKICAvKgogIEludGVybmFsOiBDYWxjdWxhdGUgYSBib3VuZGluZyBib3ggZnJvbSBhbiBhcnJheSBvZiBwb3NpdGlvbnMKICBbCiAgICBbbG5nLCBsYXRdLFtsbmcsIGxhdF0sW2xuZywgbGF0XQogIF0KICAqLwogIGZ1bmN0aW9uIGNhbGN1bGF0ZUJvdW5kc0Zyb21BcnJheSAoYXJyYXkpIHsKICAgIHZhciB4MSA9IG51bGwsIHgyID0gbnVsbCwgeTEgPSBudWxsLCB5MiA9IG51bGw7CgogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgewogICAgICB2YXIgbG9ubGF0ID0gYXJyYXlbaV07CiAgICAgIHZhciBsb24gPSBsb25sYXRbMF07CiAgICAgIHZhciBsYXQgPSBsb25sYXRbMV07CgogICAgICBpZiAoeDEgPT09IG51bGwpIHsKICAgICAgICB4MSA9IGxvbjsKICAgICAgfSBlbHNlIGlmIChsb24gPCB4MSkgewogICAgICAgIHgxID0gbG9uOwogICAgICB9CgogICAgICBpZiAoeDIgPT09IG51bGwpIHsKICAgICAgICB4MiA9IGxvbjsKICAgICAgfSBlbHNlIGlmIChsb24gPiB4MikgewogICAgICAgIHgyID0gbG9uOwogICAgICB9CgogICAgICBpZiAoeTEgPT09IG51bGwpIHsKICAgICAgICB5MSA9IGxhdDsKICAgICAgfSBlbHNlIGlmIChsYXQgPCB5MSkgewogICAgICAgIHkxID0gbGF0OwogICAgICB9CgogICAgICBpZiAoeTIgPT09IG51bGwpIHsKICAgICAgICB5MiA9IGxhdDsKICAgICAgfSBlbHNlIGlmIChsYXQgPiB5MikgewogICAgICAgIHkyID0gbGF0OwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIFt4MSwgeTEsIHgyLCB5MiBdOwogIH0KCiAgLyoKICBJbnRlcm5hbDogQ2FsY3VsYXRlIGFuIGJvdW5kaW5nIGJveCBmb3IgYSBmZWF0dXJlIGNvbGxlY3Rpb24KICAqLwogIGZ1bmN0aW9uIGNhbGN1bGF0ZUJvdW5kc0ZvckZlYXR1cmVDb2xsZWN0aW9uKGZlYXR1cmVDb2xsZWN0aW9uKXsKICAgIHZhciBleHRlbnRzID0gW10sIGV4dGVudDsKICAgIGZvciAodmFyIGkgPSBmZWF0dXJlQ29sbGVjdGlvbi5mZWF0dXJlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewogICAgICBleHRlbnQgPSBjYWxjdWxhdGVCb3VuZHMoZmVhdHVyZUNvbGxlY3Rpb24uZmVhdHVyZXNbaV0uZ2VvbWV0cnkpOwogICAgICBleHRlbnRzLnB1c2goW2V4dGVudFswXSxleHRlbnRbMV1dKTsKICAgICAgZXh0ZW50cy5wdXNoKFtleHRlbnRbMl0sZXh0ZW50WzNdXSk7CiAgICB9CgogICAgcmV0dXJuIGNhbGN1bGF0ZUJvdW5kc0Zyb21BcnJheShleHRlbnRzKTsKICB9CgogIC8qCiAgSW50ZXJuYWw6IENhbGN1bGF0ZSBhbiBib3VuZGluZyBib3ggZm9yIGEgZ2VvbWV0cnkgY29sbGVjdGlvbgogICovCiAgZnVuY3Rpb24gY2FsY3VsYXRlQm91bmRzRm9yR2VvbWV0cnlDb2xsZWN0aW9uKGdlb21ldHJ5Q29sbGVjdGlvbil7CiAgICB2YXIgZXh0ZW50cyA9IFtdLCBleHRlbnQ7CgogICAgZm9yICh2YXIgaSA9IGdlb21ldHJ5Q29sbGVjdGlvbi5nZW9tZXRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgIGV4dGVudCA9IGNhbGN1bGF0ZUJvdW5kcyhnZW9tZXRyeUNvbGxlY3Rpb24uZ2VvbWV0cmllc1tpXSk7CiAgICAgIGV4dGVudHMucHVzaChbZXh0ZW50WzBdLGV4dGVudFsxXV0pOwogICAgICBleHRlbnRzLnB1c2goW2V4dGVudFsyXSxleHRlbnRbM11dKTsKICAgIH0KCiAgICByZXR1cm4gY2FsY3VsYXRlQm91bmRzRnJvbUFycmF5KGV4dGVudHMpOwogIH0KCiAgZnVuY3Rpb24gY2FsY3VsYXRlRW52ZWxvcGUoZ2VvanNvbil7CiAgICB2YXIgYm91bmRzID0gY2FsY3VsYXRlQm91bmRzKGdlb2pzb24pOwogICAgcmV0dXJuIHsKICAgICAgeDogYm91bmRzWzBdLAogICAgICB5OiBib3VuZHNbMV0sCiAgICAgIHc6IE1hdGguYWJzKGJvdW5kc1swXSAtIGJvdW5kc1syXSksCiAgICAgIGg6IE1hdGguYWJzKGJvdW5kc1sxXSAtIGJvdW5kc1szXSkKICAgIH07CiAgfQoKICAvKgogIEludGVybmFsOiBDb252ZXJ0IHJhZGlhbnMgdG8gZGVncmVlcy4gVXNlZCBieSBzcGF0aWFsIHJlZmVyZW5jZSBjb252ZXJ0ZXJzLgogICovCiAgZnVuY3Rpb24gcmFkVG9EZWcocmFkKSB7CiAgICByZXR1cm4gcmFkICogRGVncmVlc1BlclJhZGlhbjsKICB9CgogIC8qCiAgSW50ZXJuYWw6IENvbnZlcnQgZGVncmVlcyB0byByYWRpYW5zLiBVc2VkIGJ5IHNwYXRpYWwgcmVmZXJlbmNlIGNvbnZlcnRlcnMuCiAgKi8KICBmdW5jdGlvbiBkZWdUb1JhZChkZWcpIHsKICAgIHJldHVybiBkZWcgKiBSYWRpYW5zUGVyRGVncmVlOwogIH0KCiAgLyoKICBJbnRlcm5hbDogTG9vcCBvdmVyIGVhY2ggYXJyYXkgaW4gYSBnZW9qc29uIG9iamVjdCBhbmQgYXBwbHkgYSBmdW5jdGlvbiB0byBpdC4gVXNlZCBieSBzcGF0aWFsIHJlZmVyZW5jZSBjb252ZXJ0ZXJzLgogICovCiAgZnVuY3Rpb24gZWFjaFBvc2l0aW9uKGNvb3JkaW5hdGVzLCBmdW5jKSB7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvb3JkaW5hdGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIC8vIHdlIGZvdW5kIGEgbnVtYmVyIHNvIGxldHMgY29udmVydCB0aGlzIHBhaXIKICAgICAgaWYodHlwZW9mIGNvb3JkaW5hdGVzW2ldWzBdID09PSAibnVtYmVyIil7CiAgICAgICAgY29vcmRpbmF0ZXNbaV0gPSBmdW5jKGNvb3JkaW5hdGVzW2ldKTsKICAgICAgfQogICAgICAvLyB3ZSBmb3VuZCBhbiBjb29yZGluYXRlcyBhcnJheSBpdCBhZ2FpbiBhbmQgcnVuIFRISVMgZnVuY3Rpb24gYWdhaW5zdCBpdAogICAgICBpZih0eXBlb2YgY29vcmRpbmF0ZXNbaV0gPT09ICJvYmplY3QiKXsKICAgICAgICBjb29yZGluYXRlc1tpXSA9IGVhY2hQb3NpdGlvbihjb29yZGluYXRlc1tpXSwgZnVuYyk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBjb29yZGluYXRlczsKICB9CgogIC8qCiAgUHVibGljOiBDb252ZXJ0IGEgR2VvSlNPTiBQb3NpdGlvbiBvYmplY3QgdG8gR2VvZ3JhcGhpYyAoNDMyNikKICAqLwogIGZ1bmN0aW9uIHBvc2l0aW9uVG9HZW9ncmFwaGljKHBvc2l0aW9uKSB7CiAgICB2YXIgeCA9IHBvc2l0aW9uWzBdOwogICAgdmFyIHkgPSBwb3NpdGlvblsxXTsKICAgIHJldHVybiBbcmFkVG9EZWcoeCAvIEVhcnRoUmFkaXVzKSAtIChNYXRoLmZsb29yKChyYWRUb0RlZyh4IC8gRWFydGhSYWRpdXMpICsgMTgwKSAvIDM2MCkgKiAzNjApLCByYWRUb0RlZygoTWF0aC5QSSAvIDIpIC0gKDIgKiBNYXRoLmF0YW4oTWF0aC5leHAoLTEuMCAqIHkgLyBFYXJ0aFJhZGl1cykpKSldOwogIH0KCiAgLyoKICBQdWJsaWM6IENvbnZlcnQgYSBHZW9KU09OIFBvc2l0aW9uIG9iamVjdCB0byBXZWIgTWVyY2F0b3IgKDEwMjEwMCkKICAqLwogIGZ1bmN0aW9uIHBvc2l0aW9uVG9NZXJjYXRvcihwb3NpdGlvbikgewogICAgdmFyIGxuZyA9IHBvc2l0aW9uWzBdOwogICAgdmFyIGxhdCA9IE1hdGgubWF4KE1hdGgubWluKHBvc2l0aW9uWzFdLCA4OS45OTk5OSksIC04OS45OTk5OSk7CiAgICByZXR1cm4gW2RlZ1RvUmFkKGxuZykgKiBFYXJ0aFJhZGl1cywgRWFydGhSYWRpdXMvMi4wICogTWF0aC5sb2coICgxLjAgKyBNYXRoLnNpbihkZWdUb1JhZChsYXQpKSkgLyAoMS4wIC0gTWF0aC5zaW4oZGVnVG9SYWQobGF0KSkpICldOwogIH0KCiAgLyoKICBQdWJsaWM6IEFwcGx5IGEgZnVuY3Rpb24gYWdhaXN0IGFsbCBwb3NpdGlvbnMgaW4gYSBnZW9qc29uIG9iamVjdC4gVXNlZCBieSBzcGF0aWFsIHJlZmVyZW5jZSBjb252ZXJ0ZXJzLgogICovCiAgZnVuY3Rpb24gYXBwbHlDb252ZXJ0ZXIoZ2VvanNvbiwgY29udmVydGVyLCBub0Nycyl7CiAgICBpZihnZW9qc29uLnR5cGUgPT09ICJQb2ludCIpIHsKICAgICAgZ2VvanNvbi5jb29yZGluYXRlcyA9IGNvbnZlcnRlcihnZW9qc29uLmNvb3JkaW5hdGVzKTsKICAgIH0gZWxzZSBpZihnZW9qc29uLnR5cGUgPT09ICJGZWF0dXJlIikgewogICAgICBnZW9qc29uLmdlb21ldHJ5ID0gYXBwbHlDb252ZXJ0ZXIoZ2VvanNvbi5nZW9tZXRyeSwgY29udmVydGVyLCB0cnVlKTsKICAgIH0gZWxzZSBpZihnZW9qc29uLnR5cGUgPT09ICJGZWF0dXJlQ29sbGVjdGlvbiIpIHsKICAgICAgZm9yICh2YXIgZiA9IDA7IGYgPCBnZW9qc29uLmZlYXR1cmVzLmxlbmd0aDsgZisrKSB7CiAgICAgICAgZ2VvanNvbi5mZWF0dXJlc1tmXSA9IGFwcGx5Q29udmVydGVyKGdlb2pzb24uZmVhdHVyZXNbZl0sIGNvbnZlcnRlciwgdHJ1ZSk7CiAgICAgIH0KICAgIH0gZWxzZSBpZihnZW9qc29uLnR5cGUgPT09ICJHZW9tZXRyeUNvbGxlY3Rpb24iKSB7CiAgICAgIGZvciAodmFyIGcgPSAwOyBnIDwgZ2VvanNvbi5nZW9tZXRyaWVzLmxlbmd0aDsgZysrKSB7CiAgICAgICAgZ2VvanNvbi5nZW9tZXRyaWVzW2ddID0gYXBwbHlDb252ZXJ0ZXIoZ2VvanNvbi5nZW9tZXRyaWVzW2ddLCBjb252ZXJ0ZXIsIHRydWUpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBnZW9qc29uLmNvb3JkaW5hdGVzID0gZWFjaFBvc2l0aW9uKGdlb2pzb24uY29vcmRpbmF0ZXMsIGNvbnZlcnRlcik7CiAgICB9CgogICAgaWYoIW5vQ3JzKXsKICAgICAgaWYoY29udmVydGVyID09PSBwb3NpdGlvblRvTWVyY2F0b3IpewogICAgICAgIGdlb2pzb24uY3JzID0gTWVyY2F0b3JDUlM7CiAgICAgIH0KICAgIH0KCiAgICBpZihjb252ZXJ0ZXIgPT09IHBvc2l0aW9uVG9HZW9ncmFwaGljKXsKICAgICAgZGVsZXRlIGdlb2pzb24uY3JzOwogICAgfQoKICAgIHJldHVybiBnZW9qc29uOwogIH0KCiAgLyoKICBQdWJsaWM6IENvbnZlcnQgYSBHZW9KU09OIG9iamVjdCB0byBFU1JJIFdlYiBNZXJjYXRvciAoMTAyMTAwKQogICovCiAgZnVuY3Rpb24gdG9NZXJjYXRvcihnZW9qc29uKSB7CiAgICByZXR1cm4gYXBwbHlDb252ZXJ0ZXIoZ2VvanNvbiwgcG9zaXRpb25Ub01lcmNhdG9yKTsKICB9CgogIC8qCiAgQ29udmVydCBhIEdlb0pTT04gb2JqZWN0IHRvIEdlb2dyYXBoaWMgY29vcmRpbmF0ZXMgKFdTRzg0LCA0MzI2KQogICovCiAgZnVuY3Rpb24gdG9HZW9ncmFwaGljKGdlb2pzb24pIHsKICAgIHJldHVybiBhcHBseUNvbnZlcnRlcihnZW9qc29uLCBwb3NpdGlvblRvR2VvZ3JhcGhpYyk7CiAgfQoKCiAgLyoKICBJbnRlcm5hbDogLTEsMCwxIGNvbXBhcmlzb24gZnVuY3Rpb24KICAqLwogIGZ1bmN0aW9uIGNtcChhLCBiKSB7CiAgICBpZihhIDwgYikgewogICAgICByZXR1cm4gLTE7CiAgICB9IGVsc2UgaWYoYSA+IGIpIHsKICAgICAgcmV0dXJuIDE7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gMDsKICAgIH0KICB9CgogIC8qCiAgSW50ZXJuYWw6IHVzZWQgZm9yIHNvcnRpbmcKICAqLwogIGZ1bmN0aW9uIGNvbXBTb3J0KHAxLCBwMikgewogICAgaWYocDFbMF0gLSBwMlswXSA+IHAxWzFdIC0gcDJbMV0pIHsKICAgICAgcmV0dXJuIDE7CiAgICB9IGVsc2UgaWYocDFbMF0gLSBwMlswXSA8IHAxWzFdIC0gcDJbMV0pIHsKICAgICAgcmV0dXJuIC0xOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIDA7CiAgICB9CiAgfQoKCiAgLyoKICBJbnRlcm5hbDogdXNlZCB0byBkZXRlcm1pbmUgdHVybgogICovCiAgZnVuY3Rpb24gdHVybihwLCBxLCByKSB7CiAgICAvLyBSZXR1cm5zIC0xLCAwLCAxIGlmIHAscSxyIGZvcm1zIGEgcmlnaHQsIHN0cmFpZ2h0LCBvciBsZWZ0IHR1cm4uCiAgICByZXR1cm4gY21wKChxWzBdIC0gcFswXSkgKiAoclsxXSAtIHBbMV0pIC0gKHJbMF0gLSBwWzBdKSAqIChxWzFdIC0gcFsxXSksIDApOwogIH0KCiAgLyoKICBJbnRlcm5hbDogdXNlZCB0byBkZXRlcm1pbmUgZXVjbGlkZWFuIGRpc3RhbmNlIGJldHdlZW4gdHdvIHBvaW50cwogICovCiAgZnVuY3Rpb24gZXVjbGlkZWFuRGlzdGFuY2UocCwgcSkgewogICAgLy8gUmV0dXJucyB0aGUgc3F1YXJlZCBFdWNsaWRlYW4gZGlzdGFuY2UgYmV0d2VlbiBwIGFuZCBxLgogICAgdmFyIGR4ID0gcVswXSAtIHBbMF07CiAgICB2YXIgZHkgPSBxWzFdIC0gcFsxXTsKCiAgICByZXR1cm4gZHggKiBkeCArIGR5ICogZHk7CiAgfQoKICBmdW5jdGlvbiBuZXh0SHVsbFBvaW50KHBvaW50cywgcCkgewogICAgLy8gUmV0dXJucyB0aGUgbmV4dCBwb2ludCBvbiB0aGUgY29udmV4IGh1bGwgaW4gQ0NXIGZyb20gcC4KICAgIHZhciBxID0gcDsKICAgIGZvcih2YXIgciBpbiBwb2ludHMpIHsKICAgICAgdmFyIHQgPSB0dXJuKHAsIHEsIHBvaW50c1tyXSk7CiAgICAgIGlmKHQgPT09IC0xIHx8IHQgPT09IDAgJiYgZXVjbGlkZWFuRGlzdGFuY2UocCwgcG9pbnRzW3JdKSA+IGV1Y2xpZGVhbkRpc3RhbmNlKHAsIHEpKSB7CiAgICAgICAgcSA9IHBvaW50c1tyXTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHE7CiAgfQoKICBmdW5jdGlvbiBjb252ZXhIdWxsKHBvaW50cykgewogICAgLy8gaW1wbGVtZW50YXRpb24gb2YgdGhlIEphcnZpcyBNYXJjaCBhbGdvcml0aG0KICAgIC8vIGFkYXB0ZWQgZnJvbSBodHRwOi8vdGl4eGl0LndvcmRwcmVzcy5jb20vMjAwOS8xMi8wOS9qYXJ2aXMtbWFyY2gvCgogICAgaWYocG9pbnRzLmxlbmd0aCA9PT0gMCkgewogICAgICByZXR1cm4gW107CiAgICB9IGVsc2UgaWYocG9pbnRzLmxlbmd0aCA9PT0gMSkgewogICAgICByZXR1cm4gcG9pbnRzOwogICAgfQoKICAgIC8vIFJldHVybnMgdGhlIHBvaW50cyBvbiB0aGUgY29udmV4IGh1bGwgb2YgcG9pbnRzIGluIENDVyBvcmRlci4KICAgIHZhciBodWxsID0gW3BvaW50cy5zb3J0KGNvbXBTb3J0KVswXV07CgogICAgZm9yKHZhciBwID0gMDsgcCA8IGh1bGwubGVuZ3RoOyBwKyspIHsKICAgICAgdmFyIHEgPSBuZXh0SHVsbFBvaW50KHBvaW50cywgaHVsbFtwXSk7CgogICAgICBpZihxICE9PSBodWxsWzBdKSB7CiAgICAgICAgaHVsbC5wdXNoKHEpOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIGh1bGw7CiAgfQoKICBmdW5jdGlvbiBjb29yZGluYXRlc0NvbnRhaW5Qb2ludChjb29yZGluYXRlcywgcG9pbnQpIHsKICAgIHZhciBjb250YWlucyA9IGZhbHNlOwogICAgZm9yKHZhciBpID0gLTEsIGwgPSBjb29yZGluYXRlcy5sZW5ndGgsIGogPSBsIC0gMTsgKytpIDwgbDsgaiA9IGkpIHsKICAgICAgaWYgKCgoY29vcmRpbmF0ZXNbaV1bMV0gPD0gcG9pbnRbMV0gJiYgcG9pbnRbMV0gPCBjb29yZGluYXRlc1tqXVsxXSkgfHwKICAgICAgICAgICAoY29vcmRpbmF0ZXNbal1bMV0gPD0gcG9pbnRbMV0gJiYgcG9pbnRbMV0gPCBjb29yZGluYXRlc1tpXVsxXSkpICYmCiAgICAgICAgICAocG9pbnRbMF0gPCAoY29vcmRpbmF0ZXNbal1bMF0gLSBjb29yZGluYXRlc1tpXVswXSkgKiAocG9pbnRbMV0gLSBjb29yZGluYXRlc1tpXVsxXSkgLyAoY29vcmRpbmF0ZXNbal1bMV0gLSBjb29yZGluYXRlc1tpXVsxXSkgKyBjb29yZGluYXRlc1tpXVswXSkpIHsKICAgICAgICBjb250YWlucyA9ICFjb250YWluczsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGNvbnRhaW5zOwogIH0KCiAgZnVuY3Rpb24gcG9seWdvbkNvbnRhaW5zUG9pbnQocG9seWdvbiwgcG9pbnQpIHsKICAgIGlmIChwb2x5Z29uICYmIHBvbHlnb24ubGVuZ3RoKSB7CiAgICAgIGlmIChwb2x5Z29uLmxlbmd0aCA9PT0gMSkgeyAvLyBwb2x5Z29uIHdpdGggbm8gaG9sZXMKICAgICAgICByZXR1cm4gY29vcmRpbmF0ZXNDb250YWluUG9pbnQocG9seWdvblswXSwgcG9pbnQpOwogICAgICB9IGVsc2UgeyAvLyBwb2x5Z29uIHdpdGggaG9sZXMKICAgICAgICBpZiAoY29vcmRpbmF0ZXNDb250YWluUG9pbnQocG9seWdvblswXSwgcG9pbnQpKSB7CiAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IHBvbHlnb24ubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgaWYgKGNvb3JkaW5hdGVzQ29udGFpblBvaW50KHBvbHlnb25baV0sIHBvaW50KSkgewogICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gZm91bmQgaW4gaG9sZQogICAgICAgICAgICB9CiAgICAgICAgICB9CgogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHZlcnRleEludGVyc2VjdHNWZXJ0ZXgoYTEsIGEyLCBiMSwgYjIpIHsKICAgIHZhciB1YV90ID0gKGIyWzBdIC0gYjFbMF0pICogKGExWzFdIC0gYjFbMV0pIC0gKGIyWzFdIC0gYjFbMV0pICogKGExWzBdIC0gYjFbMF0pOwogICAgdmFyIHViX3QgPSAoYTJbMF0gLSBhMVswXSkgKiAoYTFbMV0gLSBiMVsxXSkgLSAoYTJbMV0gLSBhMVsxXSkgKiAoYTFbMF0gLSBiMVswXSk7CiAgICB2YXIgdV9iICA9IChiMlsxXSAtIGIxWzFdKSAqIChhMlswXSAtIGExWzBdKSAtIChiMlswXSAtIGIxWzBdKSAqIChhMlsxXSAtIGExWzFdKTsKCiAgICBpZiAoIHVfYiAhPT0gMCApIHsKICAgICAgdmFyIHVhID0gdWFfdCAvIHVfYjsKICAgICAgdmFyIHViID0gdWJfdCAvIHVfYjsKCiAgICAgIGlmICggMCA8PSB1YSAmJiB1YSA8PSAxICYmIDAgPD0gdWIgJiYgdWIgPD0gMSApIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgfQoKICAgIHJldHVybiBmYWxzZTsKICB9CgogIGZ1bmN0aW9uIGFycmF5SW50ZXJzZWN0c0FycmF5KGEsIGIpIHsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYS5sZW5ndGggLSAxOyBpKyspIHsKICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBiLmxlbmd0aCAtIDE7IGorKykgewogICAgICAgIGlmICh2ZXJ0ZXhJbnRlcnNlY3RzVmVydGV4KGFbaV0sIGFbaSArIDFdLCBiW2pdLCBiW2ogKyAxXSkpIHsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIHJldHVybiBmYWxzZTsKICB9CgogIGZ1bmN0aW9uIGFycmF5SW50ZXJzZWN0c011bHRpQXJyYXkoYSwgYikgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBiLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBpbm5lciA9IGJbaV07CgogICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGlubmVyLmxlbmd0aCAtIDE7IGorKykgewogICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgYS5sZW5ndGggLSAxOyBrKyspIHsKICAgICAgICAgIGlmICh2ZXJ0ZXhJbnRlcnNlY3RzVmVydGV4KGlubmVyW2pdLCBpbm5lcltqICsgMV0sIGFba10sIGFbayArIDFdKSkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBmdW5jdGlvbiBtdWx0aUFycmF5SW50ZXJzZWN0c011bHRpQXJyYXkoYSwgYikgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmIChhcnJheUludGVyc2VjdHNNdWx0aUFycmF5KGFbaV0sIGIpKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBmdW5jdGlvbiBhcnJheUludGVyc2VjdHNNdWx0aU11bHRpQXJyYXkoYSwgYikgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBiLmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmIChhcnJheUludGVyc2VjdHNNdWx0aUFycmF5KGEsIGJbaV0pKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KCiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIG11bHRpQXJyYXlJbnRlcnNlY3RzTXVsdGlNdWx0aUFycmF5KGEsIGIpIHsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykgewogICAgICBpZiAoYXJyYXlJbnRlcnNlY3RzTXVsdGlNdWx0aUFycmF5KGFbaV0sIGIpKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KCiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIG11bHRpTXVsdGlBcnJheUludGVyc2VjdHNNdWx0aU11bHRpQXJyYXkoYSwgYikgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmIChtdWx0aUFycmF5SW50ZXJzZWN0c011bHRpTXVsdGlBcnJheShhW2ldLCBiKSkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CgogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQoKICAvKgogIEludGVybmFsOiBSZXR1cm5zIGEgY29weSBvZiBjb29yZGluYXRlcyBmb3IgcyBjbG9zZWQgcG9seWdvbgogICovCiAgZnVuY3Rpb24gY2xvc2VkUG9seWdvbihjb29yZGluYXRlcykgewogICAgdmFyIG91dGVyID0gWyBdOwoKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29vcmRpbmF0ZXMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGlubmVyID0gY29vcmRpbmF0ZXNbaV0uc2xpY2UoKTsKCiAgICAgIGlmIChwb2ludHNFcXVhbChpbm5lclswXSwgaW5uZXJbaW5uZXIubGVuZ3RoIC0gMV0pID09PSBmYWxzZSkgewogICAgICAgIGlubmVyLnB1c2goaW5uZXJbMF0pOwogICAgICB9CgogICAgICBvdXRlci5wdXNoKGlubmVyKTsKICAgIH0KCiAgICByZXR1cm4gb3V0ZXI7CiAgfQoKICBmdW5jdGlvbiBwb2ludHNFcXVhbChhLCBiKSB7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHsKICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBiLmxlbmd0aDsgaisrKSB7CiAgICAgICAgaWYgKGFbaV0gIT09IGJbal0pIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIGZ1bmN0aW9uIGNvb3JkaW5hdGVzRXF1YWwoYSwgYikgewogICAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgdmFyIG5hID0gYS5zbGljZSgpLnNvcnQoY29tcFNvcnQpOwogICAgdmFyIG5iID0gYi5zbGljZSgpLnNvcnQoY29tcFNvcnQpOwoKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmEubGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKG5hW2ldLmxlbmd0aCAhPT0gbmJbaV0ubGVuZ3RoKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbmEubGVuZ3RoOyBqKyspIHsKICAgICAgICBpZiAobmFbaV1bal0gIT09IG5iW2ldW2pdKSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgcmV0dXJuIHRydWU7CiAgfQoKICAvKgogIEludGVybmFsOiBBbiBhcnJheSBvZiB2YXJpYWJsZXMgdGhhdCB3aWxsIGJlIGV4Y2x1ZGVkIGZvcm0gSlNPTiBvYmplY3RzLgogICovCiAgdmFyIGV4Y2x1ZGVGcm9tSlNPTiA9IFsibGVuZ3RoIl07CgogIC8qCiAgSW50ZXJuYWw6IEJhc2UgR2VvSlNPTiBQcmltaXRpdmUKICAqLwogIGZ1bmN0aW9uIFByaW1pdGl2ZShnZW9qc29uKXsKICAgIGlmKGdlb2pzb24pewogICAgICBzd2l0Y2ggKGdlb2pzb24udHlwZSkgewogICAgICBjYXNlICdQb2ludCc6CiAgICAgICAgcmV0dXJuIG5ldyBQb2ludChnZW9qc29uKTsKCiAgICAgIGNhc2UgJ011bHRpUG9pbnQnOgogICAgICAgIHJldHVybiBuZXcgTXVsdGlQb2ludChnZW9qc29uKTsKCiAgICAgIGNhc2UgJ0xpbmVTdHJpbmcnOgogICAgICAgIHJldHVybiBuZXcgTGluZVN0cmluZyhnZW9qc29uKTsKCiAgICAgIGNhc2UgJ011bHRpTGluZVN0cmluZyc6CiAgICAgICAgcmV0dXJuIG5ldyBNdWx0aUxpbmVTdHJpbmcoZ2VvanNvbik7CgogICAgICBjYXNlICdQb2x5Z29uJzoKICAgICAgICByZXR1cm4gbmV3IFBvbHlnb24oZ2VvanNvbik7CgogICAgICBjYXNlICdNdWx0aVBvbHlnb24nOgogICAgICAgIHJldHVybiBuZXcgTXVsdGlQb2x5Z29uKGdlb2pzb24pOwoKICAgICAgY2FzZSAnRmVhdHVyZSc6CiAgICAgICAgcmV0dXJuIG5ldyBGZWF0dXJlKGdlb2pzb24pOwoKICAgICAgY2FzZSAnRmVhdHVyZUNvbGxlY3Rpb24nOgogICAgICAgIHJldHVybiBuZXcgRmVhdHVyZUNvbGxlY3Rpb24oZ2VvanNvbik7CgogICAgICBjYXNlICdHZW9tZXRyeUNvbGxlY3Rpb24nOgogICAgICAgIHJldHVybiBuZXcgR2VvbWV0cnlDb2xsZWN0aW9uKGdlb2pzb24pOwoKICAgICAgZGVmYXVsdDoKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gdHlwZTogIiArIGdlb2pzb24udHlwZSk7CiAgICAgIH0KICAgIH0KICB9CgogIFByaW1pdGl2ZS5wcm90b3R5cGUudG9NZXJjYXRvciA9IGZ1bmN0aW9uKCl7CiAgICByZXR1cm4gdG9NZXJjYXRvcih0aGlzKTsKICB9OwoKICBQcmltaXRpdmUucHJvdG90eXBlLnRvR2VvZ3JhcGhpYyA9IGZ1bmN0aW9uKCl7CiAgICByZXR1cm4gdG9HZW9ncmFwaGljKHRoaXMpOwogIH07CgogIFByaW1pdGl2ZS5wcm90b3R5cGUuZW52ZWxvcGUgPSBmdW5jdGlvbigpewogICAgcmV0dXJuIGNhbGN1bGF0ZUVudmVsb3BlKHRoaXMpOwogIH07CgogIFByaW1pdGl2ZS5wcm90b3R5cGUuYmJveCA9IGZ1bmN0aW9uKCl7CiAgICByZXR1cm4gY2FsY3VsYXRlQm91bmRzKHRoaXMpOwogIH07CgogIFByaW1pdGl2ZS5wcm90b3R5cGUuY29udmV4SHVsbCA9IGZ1bmN0aW9uKCl7CiAgICB2YXIgY29vcmRpbmF0ZXMgPSBbIF0sIGksIGo7CiAgICBpZiAodGhpcy50eXBlID09PSAnUG9pbnQnKSB7CiAgICAgIGlmICh0aGlzLmNvb3JkaW5hdGVzICYmIHRoaXMuY29vcmRpbmF0ZXMubGVuZ3RoID4gMCkgewogICAgICAgIHJldHVybiBbIHRoaXMuY29vcmRpbmF0ZXMgXTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gWyBdOwogICAgICB9CiAgICB9IGVsc2UgaWYgKHRoaXMudHlwZSA9PT0gJ0xpbmVTdHJpbmcnIHx8IHRoaXMudHlwZSA9PT0gJ011bHRpUG9pbnQnKSB7CiAgICAgIGlmICh0aGlzLmNvb3JkaW5hdGVzICYmIHRoaXMuY29vcmRpbmF0ZXMubGVuZ3RoID4gMCkgewogICAgICAgIGNvb3JkaW5hdGVzID0gdGhpcy5jb29yZGluYXRlczsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gWyBdOwogICAgICB9CiAgICB9IGVsc2UgaWYgKHRoaXMudHlwZSA9PT0gJ1BvbHlnb24nIHx8IHRoaXMudHlwZSA9PT0gJ011bHRpTGluZVN0cmluZycpIHsKICAgICAgaWYgKHRoaXMuY29vcmRpbmF0ZXMgJiYgdGhpcy5jb29yZGluYXRlcy5sZW5ndGggPiAwKSB7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMuY29vcmRpbmF0ZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGNvb3JkaW5hdGVzID0gY29vcmRpbmF0ZXMuY29uY2F0KHRoaXMuY29vcmRpbmF0ZXNbaV0pOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gWyBdOwogICAgICB9CiAgICB9IGVsc2UgaWYgKHRoaXMudHlwZSA9PT0gJ011bHRpUG9seWdvbicpIHsKICAgICAgaWYgKHRoaXMuY29vcmRpbmF0ZXMgJiYgdGhpcy5jb29yZGluYXRlcy5sZW5ndGggPiAwKSB7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMuY29vcmRpbmF0ZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGZvciAoaiA9IDA7IGogPCB0aGlzLmNvb3JkaW5hdGVzW2ldLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgIGNvb3JkaW5hdGVzID0gY29vcmRpbmF0ZXMuY29uY2F0KHRoaXMuY29vcmRpbmF0ZXNbaV1bal0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gWyBdOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIlVuYWJsZSB0byBnZXQgY29udmV4IGh1bGwgb2YgIiArIHRoaXMudHlwZSk7CiAgICB9CgogICAgcmV0dXJuIGNvbnZleEh1bGwoY29vcmRpbmF0ZXMpOwogIH07CgogIFByaW1pdGl2ZS5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24oKXsKICAgIHZhciBvYmogPSB7fTsKICAgIGZvciAodmFyIGtleSBpbiB0aGlzKSB7CiAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGtleSkgJiYgZXhjbHVkZUZyb21KU09OLmluZGV4T2Yoa2V5KSA9PT0gLTEpIHsKICAgICAgICBvYmpba2V5XSA9IHRoaXNba2V5XTsKICAgICAgfQogICAgfQogICAgb2JqLmJib3ggPSBjYWxjdWxhdGVCb3VuZHModGhpcyk7CiAgICByZXR1cm4gb2JqOwogIH07CgogIFByaW1pdGl2ZS5wcm90b3R5cGUud2l0aGluID0gZnVuY3Rpb24ocHJpbWl0aXZlKSB7CiAgICB2YXIgY29vcmRpbmF0ZXMsIGksIGNvbnRhaW5zOwoKICAgIC8vIHBvaW50LndpdGhpbihwb2ludCkgOjogZXF1YWxpdHkKICAgIGlmIChwcmltaXRpdmUudHlwZSA9PT0gIlBvaW50IikgewogICAgICBpZiAodGhpcy50eXBlID09PSAiUG9pbnQiKSB7CiAgICAgICAgcmV0dXJuIHBvaW50c0VxdWFsKHRoaXMuY29vcmRpbmF0ZXMsIHByaW1pdGl2ZS5jb29yZGluYXRlcyk7CgogICAgICB9CiAgICB9CgogICAgLy8gcG9pbnQud2l0aGluKG11bHRpbGluZXN0cmluZykKICAgIGlmIChwcmltaXRpdmUudHlwZSA9PT0gIk11bHRpTGluZVN0cmluZyIpIHsKICAgICAgaWYgKHRoaXMudHlwZSA9PT0gIlBvaW50IikgewogICAgICAgIGZvciAoaSA9IDA7IGkgPCBwcmltaXRpdmUuY29vcmRpbmF0ZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHZhciBsaW5lc3RyaW5nID0geyB0eXBlOiAiTGluZVN0cmluZyIsIGNvb3JkaW5hdGVzOiBwcmltaXRpdmUuY29vcmRpbmF0ZXNbaV0gfTsKCiAgICAgICAgICBpZiAodGhpcy53aXRoaW4obGluZXN0cmluZykpIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLy8gcG9pbnQud2l0aGluKGxpbmVzdHJpbmcpLCBwb2ludC53aXRoaW4obXVsdGlwb2ludCkKICAgIGlmIChwcmltaXRpdmUudHlwZSA9PT0gIkxpbmVTdHJpbmciIHx8IHByaW1pdGl2ZS50eXBlID09PSAiTXVsdGlQb2ludCIpIHsKICAgICAgaWYgKHRoaXMudHlwZSA9PT0gIlBvaW50IikgewogICAgICAgIGZvciAoaSA9IDA7IGkgPCBwcmltaXRpdmUuY29vcmRpbmF0ZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGlmICh0aGlzLmNvb3JkaW5hdGVzLmxlbmd0aCAhPT0gcHJpbWl0aXZlLmNvb3JkaW5hdGVzW2ldLmxlbmd0aCkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICB9CgogICAgICAgICAgaWYgKHBvaW50c0VxdWFsKHRoaXMuY29vcmRpbmF0ZXMsIHByaW1pdGl2ZS5jb29yZGluYXRlc1tpXSkpIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgaWYgKHByaW1pdGl2ZS50eXBlID09PSAiUG9seWdvbiIpIHsKICAgICAgLy8gcG9seWdvbi53aXRoaW4ocG9seWdvbikKICAgICAgaWYgKHRoaXMudHlwZSA9PT0gIlBvbHlnb24iKSB7CiAgICAgICAgLy8gY2hlY2sgZm9yIGVxdWFsIHBvbHlnb25zCiAgICAgICAgaWYgKHByaW1pdGl2ZS5jb29yZGluYXRlcy5sZW5ndGggPT09IHRoaXMuY29vcmRpbmF0ZXMubGVuZ3RoKSB7CiAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5jb29yZGluYXRlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBpZiAoY29vcmRpbmF0ZXNFcXVhbCh0aGlzLmNvb3JkaW5hdGVzW2ldLCBwcmltaXRpdmUuY29vcmRpbmF0ZXNbaV0pKSB7CiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICh0aGlzLmNvb3JkaW5hdGVzLmxlbmd0aCAmJiBwb2x5Z29uQ29udGFpbnNQb2ludChwcmltaXRpdmUuY29vcmRpbmF0ZXMsIHRoaXMuY29vcmRpbmF0ZXNbMF1bMF0pKSB7CiAgICAgICAgICByZXR1cm4gIW11bHRpQXJyYXlJbnRlcnNlY3RzTXVsdGlBcnJheShjbG9zZWRQb2x5Z29uKHRoaXMuY29vcmRpbmF0ZXMpLCBjbG9zZWRQb2x5Z29uKHByaW1pdGl2ZS5jb29yZGluYXRlcykpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgLy8gcG9pbnQud2l0aGluKHBvbHlnb24pCiAgICAgIH0gZWxzZSBpZiAodGhpcy50eXBlID09PSAiUG9pbnQiKSB7CiAgICAgICAgcmV0dXJuIHBvbHlnb25Db250YWluc1BvaW50KHByaW1pdGl2ZS5jb29yZGluYXRlcywgdGhpcy5jb29yZGluYXRlcyk7CgogICAgICAvLyBsaW5lc3RyaW5nL211bHRpcG9pbnQgd2l0aGluZyBwb2x5Z29uCiAgICAgIH0gZWxzZSBpZiAodGhpcy50eXBlID09PSAiTGluZVN0cmluZyIgfHwgdGhpcy50eXBlID09PSAiTXVsdGlQb2ludCIpIHsKICAgICAgICBpZiAoIXRoaXMuY29vcmRpbmF0ZXMgfHwgdGhpcy5jb29yZGluYXRlcy5sZW5ndGggPT09IDApIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLmNvb3JkaW5hdGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBpZiAocG9seWdvbkNvbnRhaW5zUG9pbnQocHJpbWl0aXZlLmNvb3JkaW5hdGVzLCB0aGlzLmNvb3JkaW5hdGVzW2ldKSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHRydWU7CgogICAgICAvLyBtdWx0aWxpbmVzdHJpbmcud2l0aGluKHBvbHlnb24pCiAgICAgIH0gZWxzZSBpZiAodGhpcy50eXBlID09PSAiTXVsdGlMaW5lU3RyaW5nIikgewogICAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLmNvb3JkaW5hdGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB2YXIgbHMgPSBuZXcgTGluZVN0cmluZyh0aGlzLmNvb3JkaW5hdGVzW2ldKTsKCiAgICAgICAgICBpZiAobHMud2l0aGluKHByaW1pdGl2ZSkgPT09IGZhbHNlKSB7CiAgICAgICAgICAgIGNvbnRhaW5zKys7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiB0cnVlOwoKICAgICAgLy8gbXVsdGlwb2x5Z29uLndpdGhpbihwb2x5Z29uKQogICAgICB9IGVsc2UgaWYgKHRoaXMudHlwZSA9PT0gIk11bHRpUG9seWdvbiIpIHsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5jb29yZGluYXRlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgdmFyIHAxID0gbmV3IFByaW1pdGl2ZSh7IHR5cGU6ICJQb2x5Z29uIiwgY29vcmRpbmF0ZXM6IHRoaXMuY29vcmRpbmF0ZXNbaV0gfSk7CgogICAgICAgICAgaWYgKHAxLndpdGhpbihwcmltaXRpdmUpID09PSBmYWxzZSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQoKICAgIH0KCiAgICBpZiAocHJpbWl0aXZlLnR5cGUgPT09ICJNdWx0aVBvbHlnb24iKSB7CiAgICAgIC8vIHBvaW50LndpdGhpbihtdWx0aXBvbHlnb24pCiAgICAgIGlmICh0aGlzLnR5cGUgPT09ICJQb2ludCIpIHsKICAgICAgICBpZiAocHJpbWl0aXZlLmNvb3JkaW5hdGVzLmxlbmd0aCkgewogICAgICAgICAgZm9yIChpID0gMDsgaSA8IHByaW1pdGl2ZS5jb29yZGluYXRlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBjb29yZGluYXRlcyA9IHByaW1pdGl2ZS5jb29yZGluYXRlc1tpXTsKICAgICAgICAgICAgaWYgKHBvbHlnb25Db250YWluc1BvaW50KGNvb3JkaW5hdGVzLCB0aGlzLmNvb3JkaW5hdGVzKSAmJiBtdWx0aUFycmF5SW50ZXJzZWN0c011bHRpQXJyYXkodGhpcy5jb29yZGluYXRlcywgcHJpbWl0aXZlLmNvb3JkaW5hdGVzKSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAvLyBwb2x5Z29uLndpdGhpbihtdWx0aXBvbHlnb24pCiAgICAgIH0gZWxzZSBpZiAodGhpcy50eXBlID09PSAiUG9seWdvbiIpIHsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5jb29yZGluYXRlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgaWYgKHByaW1pdGl2ZS5jb29yZGluYXRlc1tpXS5sZW5ndGggPT09IHRoaXMuY29vcmRpbmF0ZXMubGVuZ3RoKSB7CiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCB0aGlzLmNvb3JkaW5hdGVzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgICAgaWYgKGNvb3JkaW5hdGVzRXF1YWwodGhpcy5jb29yZGluYXRlc1tqXSwgcHJpbWl0aXZlLmNvb3JkaW5hdGVzW2ldW2pdKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAobXVsdGlBcnJheUludGVyc2VjdHNNdWx0aU11bHRpQXJyYXkodGhpcy5jb29yZGluYXRlcywgcHJpbWl0aXZlLmNvb3JkaW5hdGVzKSA9PT0gZmFsc2UpIHsKICAgICAgICAgIGlmIChwcmltaXRpdmUuY29vcmRpbmF0ZXMubGVuZ3RoKSB7CiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwcmltaXRpdmUuY29vcmRpbmF0ZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICBjb29yZGluYXRlcyA9IHByaW1pdGl2ZS5jb29yZGluYXRlc1tpXTsKICAgICAgICAgICAgICBpZiAocG9seWdvbkNvbnRhaW5zUG9pbnQoY29vcmRpbmF0ZXMsIHRoaXMuY29vcmRpbmF0ZXNbMF1bMF0pID09PSBmYWxzZSkgewogICAgICAgICAgICAgICAgY29udGFpbnMgPSBmYWxzZTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgY29udGFpbnMgPSB0cnVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5zOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgIC8vIGxpbmVzdHJpbmcud2l0aGluKG11bHRpcG9seWdvbiksIG11bHRpcG9pbnQud2l0aGluKG11bHRpcG9seWdvbikKICAgICAgfSBlbHNlIGlmICh0aGlzLnR5cGUgPT09ICJMaW5lU3RyaW5nIiB8fCB0aGlzLnR5cGUgPT09ICJNdWx0aVBvaW50IikgewogICAgICAgIGZvciAoaSA9IDA7IGkgPCBwcmltaXRpdmUuY29vcmRpbmF0ZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHZhciBwID0geyB0eXBlOiAiUG9seWdvbiIsIGNvb3JkaW5hdGVzOiBwcmltaXRpdmUuY29vcmRpbmF0ZXNbaV0gfTsKCiAgICAgICAgICBpZiAodGhpcy53aXRoaW4ocCkpIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICB9CgogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgIC8vIG11bHRpbGluZXN0cmluZy53aXRoaW4obXVsdGlwb2x5Z29uKQogICAgICB9IGVsc2UgaWYgKHRoaXMudHlwZSA9PT0gIk11bHRpTGluZVN0cmluZyIpIHsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5jb29yZGluYXRlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgdmFyIGxpbmVzID0gbmV3IExpbmVTdHJpbmcodGhpcy5jb29yZGluYXRlc1tpXSk7CgogICAgICAgICAgaWYgKGxpbmVzLndpdGhpbihwcmltaXRpdmUpID09PSBmYWxzZSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gdHJ1ZTsKCiAgICAgIC8vIG11bHRpcG9seWdvbi53aXRoaW4obXVsdGlwb2x5Z29uKQogICAgICB9IGVsc2UgaWYgKHRoaXMudHlwZSA9PT0gIk11bHRpUG9seWdvbiIpIHsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcHJpbWl0aXZlLmNvb3JkaW5hdGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB2YXIgbXBvbHkgPSB7IHR5cGU6ICJQb2x5Z29uIiwgY29vcmRpbmF0ZXM6IHByaW1pdGl2ZS5jb29yZGluYXRlc1tpXSB9OwoKICAgICAgICAgIGlmICh0aGlzLndpdGhpbihtcG9seSkgPT09IGZhbHNlKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICB9CgogICAgLy8gZGVmYXVsdCB0byBmYWxzZQogICAgcmV0dXJuIGZhbHNlOwogIH07CgogIFByaW1pdGl2ZS5wcm90b3R5cGUuaW50ZXJzZWN0cyA9IGZ1bmN0aW9uKHByaW1pdGl2ZSkgewogICAgLy8gaWYgd2UgYXJlIHBhc3NlZCBhIGZlYXR1cmUsIHVzZSB0aGUgcG9seWdvbiBpbnNpZGUgaW5zdGVhZAogICAgaWYgKHByaW1pdGl2ZS50eXBlID09PSAnRmVhdHVyZScpIHsKICAgICAgcHJpbWl0aXZlID0gcHJpbWl0aXZlLmdlb21ldHJ5OwogICAgfQoKICAgIHZhciBwID0gbmV3IFByaW1pdGl2ZShwcmltaXRpdmUpOwogICAgaWYgKHRoaXMud2l0aGluKHByaW1pdGl2ZSkgfHwgcC53aXRoaW4odGhpcykpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgaWYgKHRoaXMudHlwZSA9PT0gJ0xpbmVTdHJpbmcnKSB7CiAgICAgIGlmIChwcmltaXRpdmUudHlwZSA9PT0gJ0xpbmVTdHJpbmcnKSB7CiAgICAgICAgcmV0dXJuIGFycmF5SW50ZXJzZWN0c0FycmF5KHRoaXMuY29vcmRpbmF0ZXMsIHByaW1pdGl2ZS5jb29yZGluYXRlcyk7CiAgICAgIH0gZWxzZSBpZiAocHJpbWl0aXZlLnR5cGUgPT09ICdNdWx0aUxpbmVTdHJpbmcnKSB7CiAgICAgICAgcmV0dXJuIGFycmF5SW50ZXJzZWN0c011bHRpQXJyYXkodGhpcy5jb29yZGluYXRlcywgcHJpbWl0aXZlLmNvb3JkaW5hdGVzKTsKICAgICAgfSBlbHNlIGlmIChwcmltaXRpdmUudHlwZSA9PT0gJ1BvbHlnb24nKSB7CiAgICAgICAgcmV0dXJuIGFycmF5SW50ZXJzZWN0c011bHRpQXJyYXkodGhpcy5jb29yZGluYXRlcywgY2xvc2VkUG9seWdvbihwcmltaXRpdmUuY29vcmRpbmF0ZXMpKTsKICAgICAgfSBlbHNlIGlmIChwcmltaXRpdmUudHlwZSA9PT0gJ011bHRpUG9seWdvbicpIHsKICAgICAgICByZXR1cm4gYXJyYXlJbnRlcnNlY3RzTXVsdGlNdWx0aUFycmF5KHRoaXMuY29vcmRpbmF0ZXMsIHByaW1pdGl2ZS5jb29yZGluYXRlcyk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAodGhpcy50eXBlID09PSAnTXVsdGlMaW5lU3RyaW5nJykgewogICAgICBpZiAocHJpbWl0aXZlLnR5cGUgPT09ICdMaW5lU3RyaW5nJykgewogICAgICAgIHJldHVybiBhcnJheUludGVyc2VjdHNNdWx0aUFycmF5KHByaW1pdGl2ZS5jb29yZGluYXRlcywgdGhpcy5jb29yZGluYXRlcyk7CiAgICAgIH0gZWxzZSBpZiAocHJpbWl0aXZlLnR5cGUgPT09ICdQb2x5Z29uJyB8fCBwcmltaXRpdmUudHlwZSA9PT0gJ011bHRpTGluZVN0cmluZycpIHsKICAgICAgICByZXR1cm4gbXVsdGlBcnJheUludGVyc2VjdHNNdWx0aUFycmF5KHRoaXMuY29vcmRpbmF0ZXMsIHByaW1pdGl2ZS5jb29yZGluYXRlcyk7CiAgICAgIH0gZWxzZSBpZiAocHJpbWl0aXZlLnR5cGUgPT09ICdNdWx0aVBvbHlnb24nKSB7CiAgICAgICAgcmV0dXJuIG11bHRpQXJyYXlJbnRlcnNlY3RzTXVsdGlNdWx0aUFycmF5KHRoaXMuY29vcmRpbmF0ZXMsIHByaW1pdGl2ZS5jb29yZGluYXRlcyk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAodGhpcy50eXBlID09PSAnUG9seWdvbicpIHsKICAgICAgaWYgKHByaW1pdGl2ZS50eXBlID09PSAnTGluZVN0cmluZycpIHsKICAgICAgICByZXR1cm4gYXJyYXlJbnRlcnNlY3RzTXVsdGlBcnJheShwcmltaXRpdmUuY29vcmRpbmF0ZXMsIGNsb3NlZFBvbHlnb24odGhpcy5jb29yZGluYXRlcykpOwogICAgICB9IGVsc2UgaWYgKHByaW1pdGl2ZS50eXBlID09PSAnTXVsdGlMaW5lU3RyaW5nJykgewogICAgICAgIHJldHVybiBtdWx0aUFycmF5SW50ZXJzZWN0c011bHRpQXJyYXkoY2xvc2VkUG9seWdvbih0aGlzLmNvb3JkaW5hdGVzKSwgcHJpbWl0aXZlLmNvb3JkaW5hdGVzKTsKICAgICAgfSBlbHNlIGlmIChwcmltaXRpdmUudHlwZSA9PT0gJ1BvbHlnb24nKSB7CiAgICAgICAgcmV0dXJuIG11bHRpQXJyYXlJbnRlcnNlY3RzTXVsdGlBcnJheShjbG9zZWRQb2x5Z29uKHRoaXMuY29vcmRpbmF0ZXMpLCBjbG9zZWRQb2x5Z29uKHByaW1pdGl2ZS5jb29yZGluYXRlcykpOwogICAgICB9IGVsc2UgaWYgKHByaW1pdGl2ZS50eXBlID09PSAnTXVsdGlQb2x5Z29uJykgewogICAgICAgIHJldHVybiBtdWx0aUFycmF5SW50ZXJzZWN0c011bHRpTXVsdGlBcnJheShjbG9zZWRQb2x5Z29uKHRoaXMuY29vcmRpbmF0ZXMpLCBwcmltaXRpdmUuY29vcmRpbmF0ZXMpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKHRoaXMudHlwZSA9PT0gJ011bHRpUG9seWdvbicpIHsKICAgICAgaWYgKHByaW1pdGl2ZS50eXBlID09PSAnTGluZVN0cmluZycpIHsKICAgICAgICByZXR1cm4gYXJyYXlJbnRlcnNlY3RzTXVsdGlNdWx0aUFycmF5KHByaW1pdGl2ZS5jb29yZGluYXRlcywgdGhpcy5jb29yZGluYXRlcyk7CiAgICAgIH0gZWxzZSBpZiAocHJpbWl0aXZlLnR5cGUgPT09ICdQb2x5Z29uJyB8fCBwcmltaXRpdmUudHlwZSA9PT0gJ011bHRpTGluZVN0cmluZycpIHsKICAgICAgICByZXR1cm4gbXVsdGlBcnJheUludGVyc2VjdHNNdWx0aU11bHRpQXJyYXkoY2xvc2VkUG9seWdvbihwcmltaXRpdmUuY29vcmRpbmF0ZXMpLCB0aGlzLmNvb3JkaW5hdGVzKTsKICAgICAgfSBlbHNlIGlmIChwcmltaXRpdmUudHlwZSA9PT0gJ011bHRpUG9seWdvbicpIHsKICAgICAgICByZXR1cm4gbXVsdGlNdWx0aUFycmF5SW50ZXJzZWN0c011bHRpTXVsdGlBcnJheSh0aGlzLmNvb3JkaW5hdGVzLCBwcmltaXRpdmUuY29vcmRpbmF0ZXMpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKHRoaXMudHlwZSA9PT0gJ0ZlYXR1cmUnKSB7CiAgICAgIC8vIGluIHRoZSBjYXNlIG9mIGEgRmVhdHVyZSwgdXNlIHRoZSBpbnRlcm5hbCBwcmltaXRpdmUgZm9yIGludGVyc2VjdGlvbgogICAgICB2YXIgaW5uZXIgPSBuZXcgUHJpbWl0aXZlKHRoaXMuZ2VvbWV0cnkpOwogICAgICByZXR1cm4gaW5uZXIuaW50ZXJzZWN0cyhwcmltaXRpdmUpOwogICAgfQoKICAgIHdhcm4oIlR5cGUgIiArIHRoaXMudHlwZSArICIgdG8gIiArIHByaW1pdGl2ZS50eXBlICsgIiBpbnRlcnNlY3Rpb24gaXMgbm90IHN1cHBvcnRlZCBieSBpbnRlcnNlY3RzIik7CiAgICByZXR1cm4gZmFsc2U7CiAgfTsKCgogIC8qCiAgR2VvSlNPTiBQb2ludCBDbGFzcwogICAgbmV3IFBvaW50KCk7CiAgICBuZXcgUG9pbnQoeCx5LHosd3RmKTsKICAgIG5ldyBQb2ludChbeCx5LHosd3RmXSk7CiAgICBuZXcgUG9pbnQoW3gseV0pOwogICAgbmV3IFBvaW50KHsKICAgICAgdHlwZTogIlBvaW50IiwKICAgICAgY29vcmRpbmF0ZXM6IFt4LHldCiAgICB9KTsKICAqLwogIGZ1bmN0aW9uIFBvaW50KGlucHV0KXsKICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKCiAgICBpZihpbnB1dCAmJiBpbnB1dC50eXBlID09PSAiUG9pbnQiICYmIGlucHV0LmNvb3JkaW5hdGVzKXsKICAgICAgZXh0ZW5kKHRoaXMsIGlucHV0KTsKICAgIH0gZWxzZSBpZihpbnB1dCAmJiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaW5wdXQpID09PSAiW29iamVjdCBBcnJheV0iKSB7CiAgICAgIHRoaXMuY29vcmRpbmF0ZXMgPSBpbnB1dDsKICAgIH0gZWxzZSBpZihhcmdzLmxlbmd0aCA+PSAyKSB7CiAgICAgIHRoaXMuY29vcmRpbmF0ZXMgPSBhcmdzOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgIlRlcnJhZm9ybWVyOiBpbnZhbGlkIGlucHV0IGZvciBUZXJyYWZvcm1lci5Qb2ludCI7CiAgICB9CgogICAgdGhpcy50eXBlID0gIlBvaW50IjsKICB9CgogIFBvaW50LnByb3RvdHlwZSA9IG5ldyBQcmltaXRpdmUoKTsKICBQb2ludC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBQb2ludDsKCiAgLyoKICBHZW9KU09OIE11bHRpUG9pbnQgQ2xhc3MKICAgICAgbmV3IE11bHRpUG9pbnQoKTsKICAgICAgbmV3IE11bHRpUG9pbnQoW1t4LHldLCBbeDEseTFdXSk7CiAgICAgIG5ldyBNdWx0aVBvaW50KHsKICAgICAgICB0eXBlOiAiTXVsdGlQb2ludCIsCiAgICAgICAgY29vcmRpbmF0ZXM6IFt4LHldCiAgICAgIH0pOwogICovCiAgZnVuY3Rpb24gTXVsdGlQb2ludChpbnB1dCl7CiAgICBpZihpbnB1dCAmJiBpbnB1dC50eXBlID09PSAiTXVsdGlQb2ludCIgJiYgaW5wdXQuY29vcmRpbmF0ZXMpewogICAgICBleHRlbmQodGhpcywgaW5wdXQpOwogICAgfSBlbHNlIGlmKEFycmF5LmlzQXJyYXkoaW5wdXQpKSB7CiAgICAgIHRoaXMuY29vcmRpbmF0ZXMgPSBpbnB1dDsKICAgIH0gZWxzZSB7CiAgICAgIHRocm93ICJUZXJyYWZvcm1lcjogaW52YWxpZCBpbnB1dCBmb3IgVGVycmFmb3JtZXIuTXVsdGlQb2ludCI7CiAgICB9CgogICAgdGhpcy50eXBlID0gIk11bHRpUG9pbnQiOwogIH0KCiAgTXVsdGlQb2ludC5wcm90b3R5cGUgPSBuZXcgUHJpbWl0aXZlKCk7CiAgTXVsdGlQb2ludC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNdWx0aVBvaW50OwogIE11bHRpUG9pbnQucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbihmdW5jKXsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jb29yZGluYXRlcy5sZW5ndGg7IGkrKykgewogICAgICBmdW5jLmFwcGx5KHRoaXMsIFt0aGlzLmNvb3JkaW5hdGVzW2ldLCBpLCB0aGlzLmNvb3JkaW5hdGVzXSk7CiAgICB9CiAgICByZXR1cm4gdGhpczsKICB9OwogIE11bHRpUG9pbnQucHJvdG90eXBlLmFkZFBvaW50ID0gZnVuY3Rpb24ocG9pbnQpewogICAgdGhpcy5jb29yZGluYXRlcy5wdXNoKHBvaW50KTsKICAgIHJldHVybiB0aGlzOwogIH07CiAgTXVsdGlQb2ludC5wcm90b3R5cGUuaW5zZXJ0UG9pbnQgPSBmdW5jdGlvbihwb2ludCwgaW5kZXgpewogICAgdGhpcy5jb29yZGluYXRlcy5zcGxpY2UoaW5kZXgsIDAsIHBvaW50KTsKICAgIHJldHVybiB0aGlzOwogIH07CiAgTXVsdGlQb2ludC5wcm90b3R5cGUucmVtb3ZlUG9pbnQgPSBmdW5jdGlvbihyZW1vdmUpewogICAgaWYodHlwZW9mIHJlbW92ZSA9PT0gIm51bWJlciIpewogICAgICB0aGlzLmNvb3JkaW5hdGVzLnNwbGljZShyZW1vdmUsIDEpOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5jb29yZGluYXRlcy5zcGxpY2UodGhpcy5jb29yZGluYXRlcy5pbmRleE9mKHJlbW92ZSksIDEpOwogICAgfQogICAgcmV0dXJuIHRoaXM7CiAgfTsKICBNdWx0aVBvaW50LnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbihpKXsKICAgIHJldHVybiBuZXcgUG9pbnQodGhpcy5jb29yZGluYXRlc1tpXSk7CiAgfTsKCiAgLyoKICBHZW9KU09OIExpbmVTdHJpbmcgQ2xhc3MKICAgICAgbmV3IExpbmVTdHJpbmcoKTsKICAgICAgbmV3IExpbmVTdHJpbmcoW1t4LHldLCBbeDEseTFdXSk7CiAgICAgIG5ldyBMaW5lU3RyaW5nKHsKICAgICAgICB0eXBlOiAiTGluZVN0cmluZyIsCiAgICAgICAgY29vcmRpbmF0ZXM6IFt4LHldCiAgICAgIH0pOwogICovCiAgZnVuY3Rpb24gTGluZVN0cmluZyhpbnB1dCl7CiAgICBpZihpbnB1dCAmJiBpbnB1dC50eXBlID09PSAiTGluZVN0cmluZyIgJiYgaW5wdXQuY29vcmRpbmF0ZXMpewogICAgICBleHRlbmQodGhpcywgaW5wdXQpOwogICAgfSBlbHNlIGlmKEFycmF5LmlzQXJyYXkoaW5wdXQpKSB7CiAgICAgIHRoaXMuY29vcmRpbmF0ZXMgPSBpbnB1dDsKICAgIH0gZWxzZSB7CiAgICAgIHRocm93ICJUZXJyYWZvcm1lcjogaW52YWxpZCBpbnB1dCBmb3IgVGVycmFmb3JtZXIuTGluZVN0cmluZyI7CiAgICB9CgogICAgdGhpcy50eXBlID0gIkxpbmVTdHJpbmciOwogIH0KCiAgTGluZVN0cmluZy5wcm90b3R5cGUgPSBuZXcgUHJpbWl0aXZlKCk7CiAgTGluZVN0cmluZy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBMaW5lU3RyaW5nOwogIExpbmVTdHJpbmcucHJvdG90eXBlLmFkZFZlcnRleCA9IGZ1bmN0aW9uKHBvaW50KXsKICAgIHRoaXMuY29vcmRpbmF0ZXMucHVzaChwb2ludCk7CiAgICByZXR1cm4gdGhpczsKICB9OwogIExpbmVTdHJpbmcucHJvdG90eXBlLmluc2VydFZlcnRleCA9IGZ1bmN0aW9uKHBvaW50LCBpbmRleCl7CiAgICB0aGlzLmNvb3JkaW5hdGVzLnNwbGljZShpbmRleCwgMCwgcG9pbnQpOwogICAgcmV0dXJuIHRoaXM7CiAgfTsKICBMaW5lU3RyaW5nLnByb3RvdHlwZS5yZW1vdmVWZXJ0ZXggPSBmdW5jdGlvbihyZW1vdmUpewogICAgdGhpcy5jb29yZGluYXRlcy5zcGxpY2UocmVtb3ZlLCAxKTsKICAgIHJldHVybiB0aGlzOwogIH07CgogIC8qCiAgR2VvSlNPTiBNdWx0aUxpbmVTdHJpbmcgQ2xhc3MKICAgICAgbmV3IE11bHRpTGluZVN0cmluZygpOwogICAgICBuZXcgTXVsdGlMaW5lU3RyaW5nKFsgW1t4LHldLCBbeDEseTFdXSwgW1t4Mix5Ml0sIFt4Myx5M11dIF0pOwogICAgICBuZXcgTXVsdGlMaW5lU3RyaW5nKHsKICAgICAgICB0eXBlOiAiTXVsdGlMaW5lU3RyaW5nIiwKICAgICAgICBjb29yZGluYXRlczogWyBbW3gseV0sIFt4MSx5MV1dLCBbW3gyLHkyXSwgW3gzLHkzXV0gXQogICAgICB9KTsKICAqLwogIGZ1bmN0aW9uIE11bHRpTGluZVN0cmluZyhpbnB1dCl7CiAgICBpZihpbnB1dCAmJiBpbnB1dC50eXBlID09PSAiTXVsdGlMaW5lU3RyaW5nIiAmJiBpbnB1dC5jb29yZGluYXRlcyl7CiAgICAgIGV4dGVuZCh0aGlzLCBpbnB1dCk7CiAgICB9IGVsc2UgaWYoQXJyYXkuaXNBcnJheShpbnB1dCkpIHsKICAgICAgdGhpcy5jb29yZGluYXRlcyA9IGlucHV0OwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgIlRlcnJhZm9ybWVyOiBpbnZhbGlkIGlucHV0IGZvciBUZXJyYWZvcm1lci5NdWx0aUxpbmVTdHJpbmciOwogICAgfQoKICAgIHRoaXMudHlwZSA9ICJNdWx0aUxpbmVTdHJpbmciOwogIH0KCiAgTXVsdGlMaW5lU3RyaW5nLnByb3RvdHlwZSA9IG5ldyBQcmltaXRpdmUoKTsKICBNdWx0aUxpbmVTdHJpbmcucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTXVsdGlMaW5lU3RyaW5nOwogIE11bHRpTGluZVN0cmluZy5wcm90b3R5cGUuZm9yRWFjaCA9IGZ1bmN0aW9uKGZ1bmMpewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvb3JkaW5hdGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGZ1bmMuYXBwbHkodGhpcywgW3RoaXMuY29vcmRpbmF0ZXNbaV0sIGksIHRoaXMuY29vcmRpbmF0ZXMgXSk7CiAgICB9CiAgfTsKICBNdWx0aUxpbmVTdHJpbmcucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uKGkpewogICAgcmV0dXJuIG5ldyBMaW5lU3RyaW5nKHRoaXMuY29vcmRpbmF0ZXNbaV0pOwogIH07CgogIC8qCiAgR2VvSlNPTiBQb2x5Z29uIENsYXNzCiAgICAgIG5ldyBQb2x5Z29uKCk7CiAgICAgIG5ldyBQb2x5Z29uKFsgW1t4LHldLCBbeDEseTFdLCBbeDIseTJdXSBdKTsKICAgICAgbmV3IFBvbHlnb24oewogICAgICAgIHR5cGU6ICJQb2x5Z29uIiwKICAgICAgICBjb29yZGluYXRlczogWyBbW3gseV0sIFt4MSx5MV0sIFt4Mix5Ml1dIF0KICAgICAgfSk7CiAgKi8KICBmdW5jdGlvbiBQb2x5Z29uKGlucHV0KXsKICAgIGlmKGlucHV0ICYmIGlucHV0LnR5cGUgPT09ICJQb2x5Z29uIiAmJiBpbnB1dC5jb29yZGluYXRlcyl7CiAgICAgIGV4dGVuZCh0aGlzLCBpbnB1dCk7CiAgICB9IGVsc2UgaWYoQXJyYXkuaXNBcnJheShpbnB1dCkpIHsKICAgICAgdGhpcy5jb29yZGluYXRlcyA9IGlucHV0OwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgIlRlcnJhZm9ybWVyOiBpbnZhbGlkIGlucHV0IGZvciBUZXJyYWZvcm1lci5Qb2x5Z29uIjsKICAgIH0KCiAgICB0aGlzLnR5cGUgPSAiUG9seWdvbiI7CiAgfQoKICBQb2x5Z29uLnByb3RvdHlwZSA9IG5ldyBQcmltaXRpdmUoKTsKICBQb2x5Z29uLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFBvbHlnb247CiAgUG9seWdvbi5wcm90b3R5cGUuYWRkVmVydGV4ID0gZnVuY3Rpb24ocG9pbnQpewogICAgdGhpcy5jb29yZGluYXRlc1swXS5wdXNoKHBvaW50KTsKICAgIHJldHVybiB0aGlzOwogIH07CiAgUG9seWdvbi5wcm90b3R5cGUuaW5zZXJ0VmVydGV4ID0gZnVuY3Rpb24ocG9pbnQsIGluZGV4KXsKICAgIHRoaXMuY29vcmRpbmF0ZXNbMF0uc3BsaWNlKGluZGV4LCAwLCBwb2ludCk7CiAgICByZXR1cm4gdGhpczsKICB9OwogIFBvbHlnb24ucHJvdG90eXBlLnJlbW92ZVZlcnRleCA9IGZ1bmN0aW9uKHJlbW92ZSl7CiAgICB0aGlzLmNvb3JkaW5hdGVzWzBdLnNwbGljZShyZW1vdmUsIDEpOwogICAgcmV0dXJuIHRoaXM7CiAgfTsKCiAgUG9seWdvbi5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbigpIHsKICAgIHRoaXMuY29vcmRpbmF0ZXMgPSBjbG9zZWRQb2x5Z29uKHRoaXMuY29vcmRpbmF0ZXMpOwogIH07CgogIC8qCiAgR2VvSlNPTiBNdWx0aVBvbHlnb24gQ2xhc3MKICAgICAgbmV3IE11bHRpUG9seWdvbigpOwogICAgICBuZXcgTXVsdGlQb2x5Z29uKFsgWyBbW3gseV0sIFt4MSx5MV1dLCBbW3gyLHkyXSwgW3gzLHkzXV0gXSBdKTsKICAgICAgbmV3IE11bHRpUG9seWdvbih7CiAgICAgICAgdHlwZTogIk11bHRpUG9seWdvbiIsCiAgICAgICAgY29vcmRpbmF0ZXM6IFsgWyBbW3gseV0sIFt4MSx5MV1dLCBbW3gyLHkyXSwgW3gzLHkzXV0gXSBdCiAgICAgIH0pOwogICovCiAgZnVuY3Rpb24gTXVsdGlQb2x5Z29uKGlucHV0KXsKICAgIGlmKGlucHV0ICYmIGlucHV0LnR5cGUgPT09ICJNdWx0aVBvbHlnb24iICYmIGlucHV0LmNvb3JkaW5hdGVzKXsKICAgICAgZXh0ZW5kKHRoaXMsIGlucHV0KTsKICAgIH0gZWxzZSBpZihBcnJheS5pc0FycmF5KGlucHV0KSkgewogICAgICB0aGlzLmNvb3JkaW5hdGVzID0gaW5wdXQ7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyAiVGVycmFmb3JtZXI6IGludmFsaWQgaW5wdXQgZm9yIFRlcnJhZm9ybWVyLk11bHRpUG9seWdvbiI7CiAgICB9CgogICAgdGhpcy50eXBlID0gIk11bHRpUG9seWdvbiI7CiAgfQoKICBNdWx0aVBvbHlnb24ucHJvdG90eXBlID0gbmV3IFByaW1pdGl2ZSgpOwogIE11bHRpUG9seWdvbi5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNdWx0aVBvbHlnb247CiAgTXVsdGlQb2x5Z29uLnByb3RvdHlwZS5mb3JFYWNoID0gZnVuY3Rpb24oZnVuYyl7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY29vcmRpbmF0ZXMubGVuZ3RoOyBpKyspIHsKICAgICAgZnVuYy5hcHBseSh0aGlzLCBbdGhpcy5jb29yZGluYXRlc1tpXSwgaSwgdGhpcy5jb29yZGluYXRlcyBdKTsKICAgIH0KICB9OwogIE11bHRpUG9seWdvbi5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24oaSl7CiAgICByZXR1cm4gbmV3IFBvbHlnb24odGhpcy5jb29yZGluYXRlc1tpXSk7CiAgfTsKCiAgLyoKICBHZW9KU09OIEZlYXR1cmUgQ2xhc3MKICAgICAgbmV3IEZlYXR1cmUoKTsKICAgICAgbmV3IEZlYXR1cmUoewogICAgICAgIHR5cGU6ICJGZWF0dXJlIiwKICAgICAgICBnZW9tZXRyeTogewogICAgICAgICAgdHlwZTogIlBvbHlnb24iLAogICAgICAgICAgY29vcmRpbmF0ZXM6IFsgWyBbW3gseV0sIFt4MSx5MV1dLCBbW3gyLHkyXSwgW3gzLHkzXV0gXSBdCiAgICAgICAgfQogICAgICB9KTsKICAgICAgbmV3IEZlYXR1cmUoewogICAgICAgIHR5cGU6ICJQb2x5Z29uIiwKICAgICAgICBjb29yZGluYXRlczogWyBbIFtbeCx5XSwgW3gxLHkxXV0sIFtbeDIseTJdLCBbeDMseTNdXSBdIF0KICAgICAgfSk7CiAgKi8KICBmdW5jdGlvbiBGZWF0dXJlKGlucHV0KXsKICAgIGlmKGlucHV0ICYmIGlucHV0LnR5cGUgPT09ICJGZWF0dXJlIiAmJiBpbnB1dC5nZW9tZXRyeSl7CiAgICAgIGV4dGVuZCh0aGlzLCBpbnB1dCk7CiAgICB9IGVsc2UgaWYoaW5wdXQgJiYgaW5wdXQudHlwZSAmJiBpbnB1dC5jb29yZGluYXRlcykgewogICAgICB0aGlzLmdlb21ldHJ5ID0gaW5wdXQ7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyAiVGVycmFmb3JtZXI6IGludmFsaWQgaW5wdXQgZm9yIFRlcnJhZm9ybWVyLkZlYXR1cmUiOwogICAgfQoKICAgIHRoaXMudHlwZSA9ICJGZWF0dXJlIjsKICB9CgogIEZlYXR1cmUucHJvdG90eXBlID0gbmV3IFByaW1pdGl2ZSgpOwogIEZlYXR1cmUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRmVhdHVyZTsKCiAgLyoKICBHZW9KU09OIEZlYXR1cmVDb2xsZWN0aW9uIENsYXNzCiAgICAgIG5ldyBGZWF0dXJlQ29sbGVjdGlvbigpOwogICAgICBuZXcgRmVhdHVyZUNvbGxlY3Rpb24oW2ZlYXR1cmUsIGZlYXR1cmUxXSk7CiAgICAgIG5ldyBGZWF0dXJlQ29sbGVjdGlvbih7CiAgICAgICAgdHlwZTogIkZlYXR1cmVDb2xsZWN0aW9uIiwKICAgICAgICBjb29yZGluYXRlczogW2ZlYXR1cmUsIGZlYXR1cmUxXQogICAgICB9KTsKICAqLwogIGZ1bmN0aW9uIEZlYXR1cmVDb2xsZWN0aW9uKGlucHV0KXsKICAgIGlmKGlucHV0ICYmIGlucHV0LnR5cGUgPT09ICJGZWF0dXJlQ29sbGVjdGlvbiIgJiYgaW5wdXQuZmVhdHVyZXMpewogICAgICBleHRlbmQodGhpcywgaW5wdXQpOwogICAgfSBlbHNlIGlmKEFycmF5LmlzQXJyYXkoaW5wdXQpKSB7CiAgICAgIHRoaXMuZmVhdHVyZXMgPSBpbnB1dDsKICAgIH0gZWxzZSB7CiAgICAgIHRocm93ICJUZXJyYWZvcm1lcjogaW52YWxpZCBpbnB1dCBmb3IgVGVycmFmb3JtZXIuRmVhdHVyZUNvbGxlY3Rpb24iOwogICAgfQoKICAgIHRoaXMudHlwZSA9ICJGZWF0dXJlQ29sbGVjdGlvbiI7CiAgfQoKICBGZWF0dXJlQ29sbGVjdGlvbi5wcm90b3R5cGUgPSBuZXcgUHJpbWl0aXZlKCk7CiAgRmVhdHVyZUNvbGxlY3Rpb24ucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRmVhdHVyZUNvbGxlY3Rpb247CiAgRmVhdHVyZUNvbGxlY3Rpb24ucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbihmdW5jKXsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5mZWF0dXJlcy5sZW5ndGg7IGkrKykgewogICAgICBmdW5jLmFwcGx5KHRoaXMsIFt0aGlzLmZlYXR1cmVzW2ldLCBpLCB0aGlzLmZlYXR1cmVzXSk7CiAgICB9CiAgfTsKICBGZWF0dXJlQ29sbGVjdGlvbi5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24oaWQpewogICAgdmFyIGZvdW5kOwogICAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKGZlYXR1cmUpewogICAgICBpZihmZWF0dXJlLmlkID09PSBpZCl7CiAgICAgICAgZm91bmQgPSBmZWF0dXJlOwogICAgICB9CiAgICB9KTsKICAgIHJldHVybiBuZXcgRmVhdHVyZShmb3VuZCk7CiAgfTsKCiAgLyoKICBHZW9KU09OIEdlb21ldHJ5Q29sbGVjdGlvbiBDbGFzcwogICAgICBuZXcgR2VvbWV0cnlDb2xsZWN0aW9uKCk7CiAgICAgIG5ldyBHZW9tZXRyeUNvbGxlY3Rpb24oW2dlb21ldHJ5LCBnZW9tZXRyeTFdKTsKICAgICAgbmV3IEdlb21ldHJ5Q29sbGVjdGlvbih7CiAgICAgICAgdHlwZTogIkdlb21ldHJ5Q29sbGVjdGlvbiIsCiAgICAgICAgY29vcmRpbmF0ZXM6IFtnZW9tZXRyeSwgZ2VvbWV0cnkxXQogICAgICB9KTsKICAqLwogIGZ1bmN0aW9uIEdlb21ldHJ5Q29sbGVjdGlvbihpbnB1dCl7CiAgICBpZihpbnB1dCAmJiBpbnB1dC50eXBlID09PSAiR2VvbWV0cnlDb2xsZWN0aW9uIiAmJiBpbnB1dC5nZW9tZXRyaWVzKXsKICAgICAgZXh0ZW5kKHRoaXMsIGlucHV0KTsKICAgIH0gZWxzZSBpZihBcnJheS5pc0FycmF5KGlucHV0KSkgewogICAgICB0aGlzLmdlb21ldHJpZXMgPSBpbnB1dDsKICAgIH0gZWxzZSBpZihpbnB1dC5jb29yZGluYXRlcyAmJiBpbnB1dC50eXBlKXsKICAgICAgdGhpcy50eXBlID0gIkdlb21ldHJ5Q29sbGVjdGlvbiI7CiAgICAgIHRoaXMuZ2VvbWV0cmllcyA9IFtpbnB1dF07CiAgICB9IGVsc2UgewogICAgICB0aHJvdyAiVGVycmFmb3JtZXI6IGludmFsaWQgaW5wdXQgZm9yIFRlcnJhZm9ybWVyLkdlb21ldHJ5Q29sbGVjdGlvbiI7CiAgICB9CgogICAgdGhpcy50eXBlID0gIkdlb21ldHJ5Q29sbGVjdGlvbiI7CiAgfQoKICBHZW9tZXRyeUNvbGxlY3Rpb24ucHJvdG90eXBlID0gbmV3IFByaW1pdGl2ZSgpOwogIEdlb21ldHJ5Q29sbGVjdGlvbi5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBHZW9tZXRyeUNvbGxlY3Rpb247CiAgR2VvbWV0cnlDb2xsZWN0aW9uLnByb3RvdHlwZS5mb3JFYWNoID0gZnVuY3Rpb24oZnVuYyl7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZ2VvbWV0cmllcy5sZW5ndGg7IGkrKykgewogICAgICBmdW5jLmFwcGx5KHRoaXMsIFt0aGlzLmdlb21ldHJpZXNbaV0sIGksIHRoaXMuZ2VvbWV0cmllc10pOwogICAgfQogIH07CiAgR2VvbWV0cnlDb2xsZWN0aW9uLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbihpKXsKICAgIHJldHVybiBuZXcgUHJpbWl0aXZlKHRoaXMuZ2VvbWV0cmllc1tpXSk7CiAgfTsKCiAgZnVuY3Rpb24gY3JlYXRlQ2lyY2xlKGNlbnRlciwgcmFkaXVzLCBpbnRlcnBvbGF0ZSl7CiAgICB2YXIgbWVyY2F0b3JQb3NpdGlvbiA9IHBvc2l0aW9uVG9NZXJjYXRvcihjZW50ZXIpOwogICAgdmFyIHN0ZXBzID0gaW50ZXJwb2xhdGUgfHwgNjQ7CiAgICB2YXIgcG9seWdvbiA9IHsKICAgICAgdHlwZTogIlBvbHlnb24iLAogICAgICBjb29yZGluYXRlczogW1tdXQogICAgfTsKICAgIGZvcih2YXIgaT0xOyBpPD1zdGVwczsgaSsrKSB7CiAgICAgIHZhciByYWRpYW5zID0gaSAqICgzNjAvc3RlcHMpICogTWF0aC5QSSAvIDE4MDsKICAgICAgcG9seWdvbi5jb29yZGluYXRlc1swXS5wdXNoKFttZXJjYXRvclBvc2l0aW9uWzBdICsgcmFkaXVzICogTWF0aC5jb3MocmFkaWFucyksIG1lcmNhdG9yUG9zaXRpb25bMV0gKyByYWRpdXMgKiBNYXRoLnNpbihyYWRpYW5zKV0pOwogICAgfQogICAgcmV0dXJuIHRvR2VvZ3JhcGhpYyhwb2x5Z29uKTsKICB9CgogIGZ1bmN0aW9uIENpcmNsZSAoY2VudGVyLCByYWQsIGludGVycG9sYXRlKSB7CiAgICB2YXIgc3RlcHMgPSBpbnRlcnBvbGF0ZSB8fCA2NDsKICAgIHZhciByYWRpdXMgPSByYWQgfHwgMjUwOwoKICAgIGlmKCFjZW50ZXIgfHwgY2VudGVyLmxlbmd0aCA8IDIgfHwgIXJhZGl1cyB8fCAhc3RlcHMpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJUZXJyYWZvcm1lcjogbWlzc2luZyBwYXJhbWV0ZXIgZm9yIFRlcnJhZm9ybWVyLkNpcmNsZSIpOwogICAgfQoKICAgIGV4dGVuZCh0aGlzLCBuZXcgRmVhdHVyZSh7CiAgICAgIHR5cGU6ICJGZWF0dXJlIiwKICAgICAgZ2VvbWV0cnk6IGNyZWF0ZUNpcmNsZShjZW50ZXIsIHJhZGl1cywgc3RlcHMpLAogICAgICBwcm9wZXJ0aWVzOiB7CiAgICAgICAgcmFkaXVzOiByYWRpdXMsCiAgICAgICAgY2VudGVyOiBjZW50ZXIsCiAgICAgICAgc3RlcHM6IHN0ZXBzCiAgICAgIH0KICAgIH0pKTsKICB9CgogIENpcmNsZS5wcm90b3R5cGUgPSBuZXcgUHJpbWl0aXZlKCk7CiAgQ2lyY2xlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IENpcmNsZTsKICBDaXJjbGUucHJvdG90eXBlLnJlY2FsY3VsYXRlID0gZnVuY3Rpb24oKXsKICAgIHRoaXMuZ2VvbWV0cnkgPSBjcmVhdGVDaXJjbGUodGhpcy5wcm9wZXJ0aWVzLmNlbnRlciwgdGhpcy5wcm9wZXJ0aWVzLnJhZGl1cywgdGhpcy5wcm9wZXJ0aWVzLnN0ZXBzKTsKICAgIHJldHVybiB0aGlzOwogIH07CiAgQ2lyY2xlLnByb3RvdHlwZS5jZW50ZXIgPSBmdW5jdGlvbihjb29yZGluYXRlcyl7CiAgICBpZihjb29yZGluYXRlcyl7CiAgICAgIHRoaXMucHJvcGVydGllcy5jZW50ZXIgPSBjb29yZGluYXRlczsKICAgICAgdGhpcy5yZWNhbGN1bGF0ZSgpOwogICAgfQogICAgcmV0dXJuIHRoaXMucHJvcGVydGllcy5jZW50ZXI7CiAgfTsKICBDaXJjbGUucHJvdG90eXBlLnJhZGl1cyA9IGZ1bmN0aW9uKHJhZGl1cyl7CiAgICBpZihyYWRpdXMpewogICAgICB0aGlzLnByb3BlcnRpZXMucmFkaXVzID0gcmFkaXVzOwogICAgICB0aGlzLnJlY2FsY3VsYXRlKCk7CiAgICB9CiAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzLnJhZGl1czsKICB9OwogIENpcmNsZS5wcm90b3R5cGUuc3RlcHMgPSBmdW5jdGlvbihzdGVwcyl7CiAgICBpZihzdGVwcyl7CiAgICAgIHRoaXMucHJvcGVydGllcy5zdGVwcyA9IHN0ZXBzOwogICAgICB0aGlzLnJlY2FsY3VsYXRlKCk7CiAgICB9CiAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzLnN0ZXBzOwogIH07CgogIENpcmNsZS5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgb3V0cHV0ID0gUHJpbWl0aXZlLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzKTsKICAgIHJldHVybiBvdXRwdXQ7CiAgfTsKCiAgZXhwb3J0cy5QcmltaXRpdmUgPSBQcmltaXRpdmU7CiAgZXhwb3J0cy5Qb2ludCA9IFBvaW50OwogIGV4cG9ydHMuTXVsdGlQb2ludCA9IE11bHRpUG9pbnQ7CiAgZXhwb3J0cy5MaW5lU3RyaW5nID0gTGluZVN0cmluZzsKICBleHBvcnRzLk11bHRpTGluZVN0cmluZyA9IE11bHRpTGluZVN0cmluZzsKICBleHBvcnRzLlBvbHlnb24gPSBQb2x5Z29uOwogIGV4cG9ydHMuTXVsdGlQb2x5Z29uID0gTXVsdGlQb2x5Z29uOwogIGV4cG9ydHMuRmVhdHVyZSA9IEZlYXR1cmU7CiAgZXhwb3J0cy5GZWF0dXJlQ29sbGVjdGlvbiA9IEZlYXR1cmVDb2xsZWN0aW9uOwogIGV4cG9ydHMuR2VvbWV0cnlDb2xsZWN0aW9uID0gR2VvbWV0cnlDb2xsZWN0aW9uOwogIGV4cG9ydHMuQ2lyY2xlID0gQ2lyY2xlOwoKICBleHBvcnRzLnRvTWVyY2F0b3IgPSB0b01lcmNhdG9yOwogIGV4cG9ydHMudG9HZW9ncmFwaGljID0gdG9HZW9ncmFwaGljOwoKICBleHBvcnRzLlRvb2xzID0ge307CiAgZXhwb3J0cy5Ub29scy5wb3NpdGlvblRvTWVyY2F0b3IgPSBwb3NpdGlvblRvTWVyY2F0b3I7CiAgZXhwb3J0cy5Ub29scy5wb3NpdGlvblRvR2VvZ3JhcGhpYyA9IHBvc2l0aW9uVG9HZW9ncmFwaGljOwogIGV4cG9ydHMuVG9vbHMuYXBwbHlDb252ZXJ0ZXIgPSBhcHBseUNvbnZlcnRlcjsKICBleHBvcnRzLlRvb2xzLnRvTWVyY2F0b3IgPSB0b01lcmNhdG9yOwogIGV4cG9ydHMuVG9vbHMudG9HZW9ncmFwaGljID0gdG9HZW9ncmFwaGljOwogIGV4cG9ydHMuVG9vbHMuY3JlYXRlQ2lyY2xlID0gY3JlYXRlQ2lyY2xlOwoKICBleHBvcnRzLlRvb2xzLmNhbGN1bGF0ZUJvdW5kcyA9IGNhbGN1bGF0ZUJvdW5kczsKICBleHBvcnRzLlRvb2xzLmNhbGN1bGF0ZUVudmVsb3BlID0gY2FsY3VsYXRlRW52ZWxvcGU7CiAgZXhwb3J0cy5Ub29scy5jb29yZGluYXRlc0NvbnRhaW5Qb2ludCA9IGNvb3JkaW5hdGVzQ29udGFpblBvaW50OwogIGV4cG9ydHMuVG9vbHMucG9seWdvbkNvbnRhaW5zUG9pbnQgPSBwb2x5Z29uQ29udGFpbnNQb2ludDsKICBleHBvcnRzLlRvb2xzLmFycmF5SW50ZXJzZWN0c0FycmF5ID0gYXJyYXlJbnRlcnNlY3RzQXJyYXk7CiAgZXhwb3J0cy5Ub29scy5jb29yZGluYXRlc0NvbnRhaW5Qb2ludCA9IGNvb3JkaW5hdGVzQ29udGFpblBvaW50OwogIGV4cG9ydHMuVG9vbHMuY29vcmRpbmF0ZXNFcXVhbCA9IGNvb3JkaW5hdGVzRXF1YWw7CiAgZXhwb3J0cy5Ub29scy5jb252ZXhIdWxsID0gY29udmV4SHVsbDsKCiAgZXhwb3J0cy5NZXJjYXRvckNSUyA9IE1lcmNhdG9yQ1JTOwogIGV4cG9ydHMuR2VvZ3JhcGhpY0NSUyA9IEdlb2dyYXBoaWNDUlM7CgogIHJldHVybiBleHBvcnRzOwp9KSk7CgovKiBnbG9iYWxzIFRlcnJhZm9ybWVyICovCihmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSkgewoKICAvLyBOb2RlLgogIGlmKHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUuZXhwb3J0cyA9PT0gJ29iamVjdCcpIHsKICAgIGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZSgndGVycmFmb3JtZXInKSk7CiAgfQoKICAvLyBCcm93c2VyIEdsb2JhbC4KICBpZih0eXBlb2Ygcm9vdC5uYXZpZ2F0b3IgPT09ICJvYmplY3QiKSB7CiAgICBpZiAoIXJvb3QuVGVycmFmb3JtZXIpewogICAgICB0aHJvdyBuZXcgRXJyb3IoIlRlcnJhZm9ybWVyLkFyY0dJUyByZXF1aXJlcyB0aGUgY29yZSBUZXJyYWZvcm1lciBsaWJyYXJ5LiBodHRwczovL2dpdGh1Yi5jb20vZXNyaS9UZXJyYWZvcm1lciIpOwogICAgfQogICAgcm9vdC5UZXJyYWZvcm1lci5BcmNHSVMgPSBmYWN0b3J5KHJvb3QuVGVycmFmb3JtZXIpOwogIH0KCn0odGhpcywgZnVuY3Rpb24oVGVycmFmb3JtZXIpIHsKICB2YXIgZXhwb3J0cyA9IHt9OwoKICAvLyBzaGFsbG93IG9iamVjdCBjbG9uZSBmb3IgZmVhdHVyZSBwcm9wZXJ0aWVzIGFuZCBhdHRyaWJ1dGVzCiAgLy8gZnJvbSBodHRwOi8vanNwZXJmLmNvbS9jbG9uaW5nLWFuLW9iamVjdC8yCiAgZnVuY3Rpb24gY2xvbmUob2JqKSB7CiAgICB2YXIgdGFyZ2V0ID0ge307CiAgICBmb3IgKHZhciBpIGluIG9iaikgewogICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGkpKSB7CiAgICAgICAgdGFyZ2V0W2ldID0gb2JqW2ldOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdGFyZ2V0OwogIH0KCiAgLy8gZGV0ZXJtaW5lIGlmIHBvbHlnb24gcmluZyBjb29yZGluYXRlcyBhcmUgY2xvY2t3aXNlLiBjbG9ja3dpc2Ugc2lnbmlmaWVzIG91dGVyIHJpbmcsIGNvdW50ZXItY2xvY2t3aXNlIGFuIGlubmVyIHJpbmcKICAvLyBvciBob2xlLiB0aGlzIGxvZ2ljIHdhcyBmb3VuZCBhdCBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzExNjU2NDcvaG93LXRvLWRldGVybWluZS1pZi1hLWxpc3Qtb2YtcG9seWdvbi0KICAvLyBwb2ludHMtYXJlLWluLWNsb2Nrd2lzZS1vcmRlcgogIGZ1bmN0aW9uIHJpbmdJc0Nsb2Nrd2lzZShyaW5nVG9UZXN0KSB7CiAgICB2YXIgdG90YWwgPSAwLGkgPSAwOwogICAgdmFyIHJMZW5ndGggPSByaW5nVG9UZXN0Lmxlbmd0aDsKICAgIHZhciBwdDEgPSByaW5nVG9UZXN0W2ldOwogICAgdmFyIHB0MjsKICAgIGZvciAoaTsgaSA8IHJMZW5ndGggLSAxOyBpKyspIHsKICAgICAgcHQyID0gcmluZ1RvVGVzdFtpICsgMV07CiAgICAgIHRvdGFsICs9IChwdDJbMF0gLSBwdDFbMF0pICogKHB0MlsxXSArIHB0MVsxXSk7CiAgICAgIHB0MSA9IHB0MjsKICAgIH0KICAgIHJldHVybiAodG90YWwgPj0gMCk7CiAgfQoKICAvLyBUaGlzIGZ1bmN0aW9uIGZsYXR0ZW5zIGhvbGVzIGluIHBvbHlnb25zIHRvIG9uZSBhcnJheSBvZiByaW5ncwogIC8vCiAgLy8gWwogIC8vICAgWyBhcnJheSBvZiBvdXRlciBjb29yZGluYXRlcyBdCiAgLy8gICBbIGhvbGUgY29vcmRpbmF0ZXMgXQogIC8vICAgWyBob2xlIGNvb3JkaW5hdGVzIF0KICAvLyBdCiAgLy8gYmVjb21lcwogIC8vIFsKICAvLyAgIFsgYXJyYXkgb2Ygb3V0ZXIgY29vcmRpbmF0ZXMgXQogIC8vICAgWyBob2xlIGNvb3JkaW5hdGVzIF0KICAvLyAgIFsgaG9sZSBjb29yZGluYXRlcyBdCiAgLy8gXQogIGZ1bmN0aW9uIGZsYXR0ZW5Qb2x5Z29uUmluZ3MocG9seSl7CiAgICB2YXIgb3V0cHV0ID0gW107CiAgICB2YXIgcG9seWdvbiA9IHBvbHkuc2xpY2UoMCk7CiAgICB2YXIgb3V0ZXJSaW5nID0gcG9seWdvbi5zaGlmdCgpLnNsaWNlKDApOwoKICAgIGlmKCFyaW5nSXNDbG9ja3dpc2Uob3V0ZXJSaW5nKSl7CiAgICAgIG91dGVyUmluZy5yZXZlcnNlKCk7CiAgICB9CgogICAgb3V0cHV0LnB1c2gob3V0ZXJSaW5nKTsKCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBvbHlnb24ubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGhvbGUgPSBwb2x5Z29uW2ldLnNsaWNlKDApOwogICAgICBpZihyaW5nSXNDbG9ja3dpc2UoaG9sZSkpewogICAgICAgIGhvbGUucmV2ZXJzZSgpOwogICAgICB9CiAgICAgIG91dHB1dC5wdXNoKGhvbGUpOwogICAgfQoKICAgIHJldHVybiBvdXRwdXQ7CiAgfQoKICAvLyBUaGlzIGZ1bmN0aW9uIGZsYXR0ZW5zIGhvbGVzIGluIG11bHRpcG9seWdvbnMgdG8gb25lIGFycmF5IG9mIHBvbHlnb25zCiAgLy8gc28KICAvLyBbCiAgLy8gICBbCiAgLy8gICAgIFsgYXJyYXkgb2Ygb3V0ZXIgY29vcmRpbmF0ZXMgXQogIC8vICAgICBbIGhvbGUgY29vcmRpbmF0ZXMgXQogIC8vICAgICBbIGhvbGUgY29vcmRpbmF0ZXMgXQogIC8vICAgXSwKICAvLyAgIFsKICAvLyAgICAgWyBhcnJheSBvZiBvdXRlciBjb29yZGluYXRlcyBdCiAgLy8gICAgIFsgaG9sZSBjb29yZGluYXRlcyBdCiAgLy8gICAgIFsgaG9sZSBjb29yZGluYXRlcyBdCiAgLy8gICBdLAogIC8vIF0KICAvLyBiZWNvbWVzCiAgLy8gWwogIC8vICAgWyBhcnJheSBvZiBvdXRlciBjb29yZGluYXRlcyBdCiAgLy8gICBbIGhvbGUgY29vcmRpbmF0ZXMgXQogIC8vICAgWyBob2xlIGNvb3JkaW5hdGVzIF0KICAvLyAgIFsgYXJyYXkgb2Ygb3V0ZXIgY29vcmRpbmF0ZXMgXQogIC8vICAgWyBob2xlIGNvb3JkaW5hdGVzIF0KICAvLyAgIFsgaG9sZSBjb29yZGluYXRlcyBdCiAgLy8gXQogIGZ1bmN0aW9uIGZsYXR0ZW5NdWx0aVBvbHlnb25SaW5ncyhyaW5ncyl7CiAgICB2YXIgb3V0cHV0ID0gW107CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJpbmdzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBwb2x5Z29uID0gZmxhdHRlblBvbHlnb25SaW5ncyhyaW5nc1tpXSk7CiAgICAgIGZvciAodmFyIHggPSBwb2x5Z29uLmxlbmd0aCAtIDE7IHggPj0gMDsgeC0tKSB7CiAgICAgICAgdmFyIHJpbmcgPSBwb2x5Z29uW3hdLnNsaWNlKDApOwogICAgICAgIG91dHB1dC5wdXNoKHJpbmcpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gb3V0cHV0OwogIH0KCiAgZnVuY3Rpb24gY29vcmRpbmF0ZXNDb250YWluQ29vcmRpbmF0ZXMob3V0ZXIsIGlubmVyKXsKICAgIHZhciBpbnRlcnNlY3RzID0gVGVycmFmb3JtZXIuVG9vbHMuYXJyYXlJbnRlcnNlY3RzQXJyYXkob3V0ZXIsIGlubmVyKTsKICAgIHZhciBjb250YWlucyA9IFRlcnJhZm9ybWVyLlRvb2xzLmNvb3JkaW5hdGVzQ29udGFpblBvaW50KG91dGVyLCBpbm5lclswXSk7CiAgICBpZighaW50ZXJzZWN0cyAmJiBjb250YWlucyl7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgLy8gZG8gYW55IHBvbHlnb25zIGluIHRoaXMgYXJyYXkgY29udGFpbiBhbnkgb3RoZXIgcG9seWdvbnMgaW4gdGhpcyBhcnJheT8KICAvLyB1c2VkIGZvciBjaGVja2luZyBmb3IgaG9sZXMgaW4gYXJjZ2lzIHJpbmdzCiAgZnVuY3Rpb24gY29udmVydFJpbmdzVG9HZW9KU09OKHJpbmdzKXsKICAgIHZhciBvdXRlclJpbmdzID0gW107CiAgICB2YXIgaG9sZXMgPSBbXTsKCiAgICAvLyBmb3IgZWFjaCByaW5nCiAgICBmb3IgKHZhciByID0gMDsgciA8IHJpbmdzLmxlbmd0aDsgcisrKSB7CiAgICAgIHZhciByaW5nID0gcmluZ3Nbcl0uc2xpY2UoMCk7CgogICAgICAvLyBpcyB0aGlzIHJpbmcgYW4gb3V0ZXIgcmluZz8gaXMgaXQgY2xvY2t3aXNlPwogICAgICBpZihyaW5nSXNDbG9ja3dpc2UocmluZykpewogICAgICAgIHZhciBwb2x5Z29uID0gWyByaW5nIF07CiAgICAgICAgb3V0ZXJSaW5ncy5wdXNoKHBvbHlnb24pOyAvLyBwdXNoIHRvIG91dGVyIHJpbmdzCiAgICAgIH0gZWxzZSB7CiAgICAgICAgaG9sZXMucHVzaChyaW5nKTsgLy8gY291bnRlcmNsb2Nrd2lzZSBwdXNoIHRvIGhvbGVzCiAgICAgIH0KICAgIH0KCiAgICAvLyB3aGlsZSB0aGVyZSBhcmUgaG9sZXMgbGVmdC4uLgogICAgd2hpbGUoaG9sZXMubGVuZ3RoKXsKICAgICAgLy8gcG9wIGEgaG9sZSBvZmYgb3V0IHN0YWNrCiAgICAgIHZhciBob2xlID0gaG9sZXMucG9wKCk7CiAgICAgIHZhciBtYXRjaGVkID0gZmFsc2U7CgogICAgICAvLyBsb29wIG92ZXIgYWxsIG91dGVyIHJpbmdzIGFuZCBzZWUgaWYgdGhleSBjb250YWluIG91ciBob2xlLgogICAgICBmb3IgKHZhciB4ID0gb3V0ZXJSaW5ncy5sZW5ndGggLSAxOyB4ID49IDA7IHgtLSkgewogICAgICAgIHZhciBvdXRlclJpbmcgPSBvdXRlclJpbmdzW3hdWzBdOwogICAgICAgIGlmKGNvb3JkaW5hdGVzQ29udGFpbkNvb3JkaW5hdGVzKG91dGVyUmluZywgaG9sZSkpewogICAgICAgICAgLy8gdGhlIGhvbGUgaXMgY29udGFpbmVkIHB1c2ggaXQgaW50byBvdXIgcG9seWdvbgogICAgICAgICAgb3V0ZXJSaW5nc1t4XS5wdXNoKGhvbGUpOwoKICAgICAgICAgIC8vIHdlIG1hdGNoZWQgdGhlIGhvbGUKICAgICAgICAgIG1hdGNoZWQgPSB0cnVlOwoKICAgICAgICAgIC8vIHN0b3AgY2hlY2tpbmcgdG8gc2VlIGlmIG90aGVyIG91dGVyIHJpbmdzIGNvbnRpYW4gdGhpcyBob2xlCiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIG5vIG91dGVyIHJpbmdzIGNvbnRhaW4gdGhpcyBob2xlIHR1cm4gaXQgaW50byBhbmQgb3V0ZXIgcmluZyAocmV2ZXJzZSBpdCkKICAgICAgaWYoIW1hdGNoZWQpewogICAgICAgIG91dGVyUmluZ3MucHVzaChbIGhvbGUucmV2ZXJzZSgpIF0pOwogICAgICB9CiAgICB9CgogICAgaWYob3V0ZXJSaW5ncy5sZW5ndGggPT09IDEpewogICAgICByZXR1cm4gewogICAgICAgIHR5cGU6ICJQb2x5Z29uIiwKICAgICAgICBjb29yZGluYXRlczogb3V0ZXJSaW5nc1swXQogICAgICB9OwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHsKICAgICAgICB0eXBlOiAiTXVsdGlQb2x5Z29uIiwKICAgICAgICBjb29yZGluYXRlczogb3V0ZXJSaW5ncwogICAgICB9OwogICAgfQogIH0KCiAgLy8gQXJjR0lTIC0+IEdlb0pTT04KICBmdW5jdGlvbiBwYXJzZShhcmNnaXMpewogICAgdmFyIGdlb2pzb24gPSB7fTsKCiAgICBpZihhcmNnaXMueCAmJiBhcmNnaXMueSl7CiAgICAgIGdlb2pzb24udHlwZSA9ICJQb2ludCI7CiAgICAgIGdlb2pzb24uY29vcmRpbmF0ZXMgPSBbYXJjZ2lzLngsIGFyY2dpcy55XTsKICAgIH0KCiAgICBpZihhcmNnaXMucG9pbnRzKXsKICAgICAgZ2VvanNvbi50eXBlID0gIk11bHRpUG9pbnQiOwogICAgICBnZW9qc29uLmNvb3JkaW5hdGVzID0gYXJjZ2lzLnBvaW50cy5zbGljZSgwKTsKICAgIH0KCiAgICBpZihhcmNnaXMucGF0aHMpIHsKICAgICAgaWYoYXJjZ2lzLnBhdGhzLmxlbmd0aCA9PT0gMSl7CiAgICAgICAgZ2VvanNvbi50eXBlID0gIkxpbmVTdHJpbmciOwogICAgICAgIGdlb2pzb24uY29vcmRpbmF0ZXMgPSBhcmNnaXMucGF0aHNbMF0uc2xpY2UoMCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZ2VvanNvbi50eXBlID0gIk11bHRpTGluZVN0cmluZyI7CiAgICAgICAgZ2VvanNvbi5jb29yZGluYXRlcyA9IGFyY2dpcy5wYXRocy5zbGljZSgwKTsKICAgICAgfQogICAgfQoKICAgIGlmKGFyY2dpcy5yaW5ncykgewogICAgICBnZW9qc29uID0gY29udmVydFJpbmdzVG9HZW9KU09OKGFyY2dpcy5yaW5ncy5zbGljZSgwKSk7CiAgICB9CgogICAgaWYoYXJjZ2lzLmdlb21ldHJ5KSB7CiAgICAgIGdlb2pzb24udHlwZSA9ICJGZWF0dXJlIjsKICAgICAgZ2VvanNvbi5nZW9tZXRyeSA9IHBhcnNlKGFyY2dpcy5nZW9tZXRyeSk7CiAgICAgIGdlb2pzb24ucHJvcGVydGllcyA9IGNsb25lKGFyY2dpcy5hdHRyaWJ1dGVzKSB8fCB7fTsKICAgIH0KCiAgICB2YXIgaW5wdXRTcGF0aWFsUmVmZXJlbmNlID0gKGFyY2dpcy5nZW9tZXRyeSkgPyBhcmNnaXMuZ2VvbWV0cnkuc3BhdGlhbFJlZmVyZW5jZSA6IGFyY2dpcy5zcGF0aWFsUmVmZXJlbmNlOwoKICAgIC8vY29udmVydCBzcGF0aWFsIHJlZiBpZiBuZWVkZWQKICAgIGlmKGlucHV0U3BhdGlhbFJlZmVyZW5jZSAmJiBpbnB1dFNwYXRpYWxSZWZlcmVuY2Uud2tpZCA9PT0gMTAyMTAwKXsKICAgICAgZ2VvanNvbiA9IFRlcnJhZm9ybWVyLnRvR2VvZ3JhcGhpYyhnZW9qc29uKTsKICAgIH0KCiAgICByZXR1cm4gbmV3IFRlcnJhZm9ybWVyLlByaW1pdGl2ZShnZW9qc29uKTsKICB9CgogIC8vIEdlb0pTT04gLT4gQXJjR0lTCiAgZnVuY3Rpb24gY29udmVydChnZW9qc29uLCBzcil7CiAgICB2YXIgc3BhdGlhbFJlZmVyZW5jZTsKCiAgICBpZihzcil7CiAgICAgIHNwYXRpYWxSZWZlcmVuY2UgPSBzcjsKICAgIH0gZWxzZSBpZiAoZ2VvanNvbiAmJiBnZW9qc29uLmNycyA9PT0gVGVycmFmb3JtZXIuTWVyY2F0b3JDUlMpIHsKICAgICAgc3BhdGlhbFJlZmVyZW5jZSA9IHsgd2tpZDogMTAyMTAwIH07CiAgICB9IGVsc2UgewogICAgICBzcGF0aWFsUmVmZXJlbmNlID0geyB3a2lkOiA0MzI2IH07CiAgICB9CgogICAgdmFyIHJlc3VsdCA9IHt9OwogICAgdmFyIGk7CgogICAgc3dpdGNoKGdlb2pzb24udHlwZSl7CiAgICBjYXNlICJQb2ludCI6CiAgICAgIHJlc3VsdC54ID0gZ2VvanNvbi5jb29yZGluYXRlc1swXTsKICAgICAgcmVzdWx0LnkgPSBnZW9qc29uLmNvb3JkaW5hdGVzWzFdOwogICAgICByZXN1bHQuc3BhdGlhbFJlZmVyZW5jZSA9IHNwYXRpYWxSZWZlcmVuY2U7CiAgICAgIGJyZWFrOwogICAgY2FzZSAiTXVsdGlQb2ludCI6CiAgICAgIHJlc3VsdC5wb2ludHMgPSBnZW9qc29uLmNvb3JkaW5hdGVzLnNsaWNlKDApOwogICAgICByZXN1bHQuc3BhdGlhbFJlZmVyZW5jZSA9IHNwYXRpYWxSZWZlcmVuY2U7CiAgICAgIGJyZWFrOwogICAgY2FzZSAiTGluZVN0cmluZyI6CiAgICAgIHJlc3VsdC5wYXRocyA9IFtnZW9qc29uLmNvb3JkaW5hdGVzLnNsaWNlKDApXTsKICAgICAgcmVzdWx0LnNwYXRpYWxSZWZlcmVuY2UgPSBzcGF0aWFsUmVmZXJlbmNlOwogICAgICBicmVhazsKICAgIGNhc2UgIk11bHRpTGluZVN0cmluZyI6CiAgICAgIHJlc3VsdC5wYXRocyA9IGdlb2pzb24uY29vcmRpbmF0ZXMuc2xpY2UoMCk7CiAgICAgIHJlc3VsdC5zcGF0aWFsUmVmZXJlbmNlID0gc3BhdGlhbFJlZmVyZW5jZTsKICAgICAgYnJlYWs7CiAgICBjYXNlICJQb2x5Z29uIjoKICAgICAgcmVzdWx0LnJpbmdzID0gZmxhdHRlblBvbHlnb25SaW5ncyhnZW9qc29uLmNvb3JkaW5hdGVzLnNsaWNlKDApKTsKICAgICAgcmVzdWx0LnNwYXRpYWxSZWZlcmVuY2UgPSBzcGF0aWFsUmVmZXJlbmNlOwogICAgICBicmVhazsKICAgIGNhc2UgIk11bHRpUG9seWdvbiI6CiAgICAgIHJlc3VsdC5yaW5ncyA9IGZsYXR0ZW5NdWx0aVBvbHlnb25SaW5ncyhnZW9qc29uLmNvb3JkaW5hdGVzLnNsaWNlKDApKTsKICAgICAgcmVzdWx0LnNwYXRpYWxSZWZlcmVuY2UgPSBzcGF0aWFsUmVmZXJlbmNlOwogICAgICBicmVhazsKICAgIGNhc2UgIkZlYXR1cmUiOgogICAgICByZXN1bHQuZ2VvbWV0cnkgPSBjb252ZXJ0KGdlb2pzb24uZ2VvbWV0cnkpOwogICAgICByZXN1bHQuYXR0cmlidXRlcyA9IGNsb25lKGdlb2pzb24ucHJvcGVydGllcyk7CiAgICAgIGJyZWFrOwogICAgY2FzZSAiRmVhdHVyZUNvbGxlY3Rpb24iOgogICAgICByZXN1bHQgPSBbXTsKICAgICAgZm9yIChpID0gMDsgaSA8IGdlb2pzb24uZmVhdHVyZXMubGVuZ3RoOyBpKyspewogICAgICAgIHJlc3VsdC5wdXNoKGNvbnZlcnQoZ2VvanNvbi5mZWF0dXJlc1tpXSkpOwogICAgICB9CiAgICAgIGJyZWFrOwogICAgY2FzZSAiR2VvbWV0cnlDb2xsZWN0aW9uIjoKICAgICAgcmVzdWx0ID0gW107CiAgICAgIGZvciAoaSA9IDA7IGkgPCBnZW9qc29uLmdlb21ldHJpZXMubGVuZ3RoOyBpKyspewogICAgICAgIHJlc3VsdC5wdXNoKGNvbnZlcnQoZ2VvanNvbi5nZW9tZXRyaWVzW2ldKSk7CiAgICAgIH0KICAgICAgYnJlYWs7CiAgICB9CgogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIGV4cG9ydHMucGFyc2UgICA9IHBhcnNlOwogIGV4cG9ydHMuY29udmVydCA9IGNvbnZlcnQ7CiAgZXhwb3J0cy50b0dlb0pTT04gPSBwYXJzZTsKICBleHBvcnRzLmZyb21HZW9KU09OID0gY29udmVydDsKCiAgcmV0dXJuIGV4cG9ydHM7Cn0pKTsKKGZ1bmN0aW9uIChyb290LCBmYWN0b3J5KSB7CgogIC8vIE5vZGUuCiAgaWYodHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZS5leHBvcnRzID09PSAnb2JqZWN0JykgewogICAgZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKCJ0ZXJyYWZvcm1lciIpKTsKICB9CgogIGlmKHR5cGVvZiByb290Lm5hdmlnYXRvciA9PT0gIm9iamVjdCIpIHsKICAgIGlmICghcm9vdC5UZXJyYWZvcm1lcil7CiAgICAgIHRocm93IG5ldyBFcnJvcigiVGVycmFmb3JtZXIuUlRyZWUgcmVxdWlyZXMgdGhlIGNvcmUgVGVycmFmb3JtZXIgbGlicmFyeS4gaHR0cHM6Ly9naXRodWIuY29tL2VzcmkvVGVycmFmb3JtZXIiKTsKICAgIH0KICAgIHJvb3QuVGVycmFmb3JtZXIuUlRyZWUgPSBmYWN0b3J5KHJvb3QuVGVycmFmb3JtZXIpLlJUcmVlOwogIH0KCn0odGhpcywgZnVuY3Rpb24oVGVycmFmb3JtZXIpIHsKICB2YXIgZXhwb3J0cyA9IHsgfTsKCiAgZnVuY3Rpb24gaXNBcnJheShvYmopIHsKICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKSA9PT0gJ1tvYmplY3QgQXJyYXldJzsKICB9CgogIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIHJ0cmVlLmpzIC0gR2VuZXJhbC1QdXJwb3NlIE5vbi1SZWN1cnNpdmUgSmF2YXNjcmlwdCBSLVRyZWUgTGlicmFyeQogVmVyc2lvbiAwLjYuMiwgRGVjZW1iZXIgNXN0IDIwMDkKIENvcHlyaWdodCAoYykgMjAwOSBKb24tQ2FybG9zIFJpdmVyYQogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQogaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUKIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgogV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCiBKb24tQ2FybG9zIFJpdmVyYSAtIGltYmNtZHRoQGhvdG1haWwuY29tCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKgogKiBSVHJlZSAtIEEgc2ltcGxlIHItdHJlZSBzdHJ1Y3R1cmUgZm9yIGdyZWF0IHJlc3VsdHMuCiAqIEBjb25zdHJ1Y3RvcgogKi8KdmFyIFJUcmVlID0gZnVuY3Rpb24gKHdpZHRoKSB7CiAgICAvLyBWYXJpYWJsZXMgdG8gY29udHJvbCB0cmVlLWRpbWVuc2lvbnMKICAgIHZhciBfTWluX1dpZHRoID0gMzsgLy8gTWluaW11bSB3aWR0aCBvZiBhbnkgbm9kZSBiZWZvcmUgYSBtZXJnZQogICAgdmFyIF9NYXhfV2lkdGggPSA2OyAvLyBNYXhpbXVtIHdpZHRoIG9mIGFueSBub2RlIGJlZm9yZSBhIHNwbGl0CiAgICBpZiAoIWlzTmFOKHdpZHRoKSkgewogICAgICBfTWluX1dpZHRoID0gTWF0aC5mbG9vcih3aWR0aCAvIDIuMCk7CiAgICAgIF9NYXhfV2lkdGggPSB3aWR0aDsKICAgIH0KCiAgICB0aGlzLm1pbl93aWR0aCA9IF9NaW5fV2lkdGg7CiAgICB0aGlzLm1heF93aWR0aCA9IF9NYXhfV2lkdGg7CgogICAgLy8gU3RhcnQgd2l0aCBhbiBlbXB0eSByb290LXRyZWUKICAgIHZhciBfVCA9IHsKICAgICAgeDogMCwKICAgICAgeTogMCwKICAgICAgdzogMCwKICAgICAgaDogMCwKICAgICAgaWQ6ICJyb290IiwKICAgICAgbm9kZXM6IFtdCiAgICB9OwoKICAgLyogQGZ1bmN0aW9uCiAgICAqIEBkZXNjcmlwdGlvbiBGdW5jdGlvbiB0byBnZW5lcmF0ZSB1bmlxdWUgc3RyaW5ncyBmb3IgZWxlbWVudCBJRHMKICAgICogQHBhcmFtIHtTdHJpbmd9IG4gICAgICBUaGUgcHJlZml4IHRvIHVzZSBmb3IgdGhlIElEcyBnZW5lcmF0ZWQuCiAgICAqIEByZXR1cm4ge1N0cmluZ30gICAgICAgIEEgZ3VhcmVudGVlZCB1bmlxdWUgSUQuCiAgICAqLwogICAgdmFyIF9uYW1lX3RvX2lkID0gKGZ1bmN0aW9uKCkgewogICAgICAvLyBoaWRlIG91ciBpZENhY2hlIGluc2lkZSB0aGlzIGNsb3N1cmUKICAgICAgdmFyIGlkQ2FjaGUgPSB7fTsKCiAgICAgIC8vIHJldHVybiB0aGUgYXBpOiBvdXIgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgdW5pcXVlIHN0cmluZyB3aXRoIGluY3JlbWVudGluZyBudW1iZXIgYXBwZW5kZWQgdG8gZ2l2ZW4gaWRQcmVmaXgKICAgICAgcmV0dXJuIGZ1bmN0aW9uKGlkUHJlZml4KSB7CiAgICAgICAgdmFyIGlkVmFsID0gMDsKICAgICAgICBpZiAoaWRQcmVmaXggaW4gaWRDYWNoZSkgewogICAgICAgICAgaWRWYWwgPSBpZENhY2hlW2lkUHJlZml4XSsrOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZENhY2hlW2lkUHJlZml4XSA9IDA7CiAgICAgICAgfQogICAgICAgIHJldHVybiBpZFByZWZpeCArICJfIiArIGlkVmFsOwogICAgICB9OwogICAgfSkoKTsKCiAgICAvLyBUaGlzIGlzIG15IHNwZWNpYWwgYWRkaXRpb24gdG8gdGhlIHdvcmxkIG9mIHItdHJlZXMKICAgIC8vIGV2ZXJ5IG90aGVyIChzaW1wbGUpIG1ldGhvZCBJIGZvdW5kIHByb2R1Y2VkIGNyYXAgdHJlZXMKICAgIC8vIHRoaXMgc2tld3MgaW5zZXJ0aW9ucyB0byBwcmVmZXJpbmcgc3F1YXJlciBhbmQgZW1wdGllciBub2RlcwogICAgUlRyZWUuUmVjdGFuZ2xlLnNxdWFyaWZpZWRfcmF0aW8gPSBmdW5jdGlvbihsLCB3LCBmaWxsKSB7CiAgICAgIC8vIEFyZWEgb2YgbmV3IGVubGFyZ2VkIHJlY3RhbmdsZQogICAgICB2YXIgbHBlcmkgPSAobCArIHcpIC8gMi4wOyAvLyBBdmVyYWdlIHNpemUgb2YgYSBzaWRlIG9mIHRoZSBuZXcgcmVjdGFuZ2xlCiAgICAgIHZhciBsYXJlYSA9IGwgKiB3OyAvLyBBcmVhIG9mIG5ldyByZWN0YW5nbGUKICAgICAgLy8gcmV0dXJuIHRoZSByYXRpbyBvZiB0aGUgcGVyaW1ldGVyIHRvIHRoZSBhcmVhIC0gdGhlIGNsb3NlciB0byAxIHdlIGFyZSwKICAgICAgLy8gdGhlIG1vcmUgInNxdWFyZSIgYSByZWN0YW5nbGUgaXMuIGNvbnZlcnNseSwgd2hlbiBhcHByb2FjaGluZyB6ZXJvIHRoZQogICAgICAvLyBtb3JlIGVsb25nYXRlZCBhIHJlY3RhbmdsZSBpcwogICAgICB2YXIgbGdlbyA9IGxhcmVhIC8gKGxwZXJpICogbHBlcmkpOwogICAgICByZXR1cm4gKGxhcmVhICogZmlsbCAvIGxnZW8pOwogICAgfTsKCiAgIC8qIGZpbmQgdGhlIGJlc3Qgc3BlY2lmaWMgbm9kZShzKSBmb3Igb2JqZWN0IHRvIGJlIGRlbGV0ZWQgZnJvbQogICAgKiBbIGxlYWYgbm9kZSBwYXJlbnQgXSA9IF9yZW1vdmVfc3VidHJlZShyZWN0YW5nbGUsIG9iamVjdCwgcm9vdCkKICAgICogQHByaXZhdGUKICAgICovCiAgICB2YXIgX3JlbW92ZV9zdWJ0cmVlID0gZnVuY3Rpb24ocmVjdCwgb2JqLCByb290KSB7CiAgICAgICAgdmFyIGhpdF9zdGFjayA9IFtdOyAvLyBDb250YWlucyB0aGUgZWxlbWVudHMgdGhhdCBvdmVybGFwCiAgICAgICAgdmFyIGNvdW50X3N0YWNrID0gW107IC8vIENvbnRhaW5zIHRoZSBlbGVtZW50cyB0aGF0IG92ZXJsYXAKICAgICAgICB2YXIgcmV0X2FycmF5ID0gW107CiAgICAgICAgdmFyIGN1cnJlbnRfZGVwdGggPSAxOwoKICAgICAgICBpZiAoIXJlY3QgfHwgIVJUcmVlLlJlY3RhbmdsZS5vdmVybGFwX3JlY3RhbmdsZShyZWN0LCByb290KSkgewogICAgICAgICAgcmV0dXJuIHJldF9hcnJheTsKICAgICAgICB9CgogICAgICAgIHZhciByZXRfb2JqID0gewogICAgICAgICAgeDogcmVjdC54LAogICAgICAgICAgeTogcmVjdC55LAogICAgICAgICAgdzogcmVjdC53LAogICAgICAgICAgaDogcmVjdC5oLAogICAgICAgICAgdGFyZ2V0OiBvYmoKICAgICAgICB9OwoKICAgICAgICBjb3VudF9zdGFjay5wdXNoKHJvb3Qubm9kZXMubGVuZ3RoKTsKICAgICAgICBoaXRfc3RhY2sucHVzaChyb290KTsKCiAgICAgICAgZG8gewogICAgICAgICAgdmFyIHRyZWUgPSBoaXRfc3RhY2sucG9wKCk7CiAgICAgICAgICB2YXIgaSA9IGNvdW50X3N0YWNrLnBvcCgpIC0gMTsKCiAgICAgICAgICBpZiAoInRhcmdldCIgaW4gcmV0X29iaikgeyAvLyBXZSBhcmUgc2VhcmNoaW5nIGZvciBhIHRhcmdldAogICAgICAgICAgICB3aGlsZSAoaSA+PSAwKSB7CiAgICAgICAgICAgICAgdmFyIGx0cmVlID0gdHJlZS5ub2Rlc1tpXTsKICAgICAgICAgICAgICBpZiAoUlRyZWUuUmVjdGFuZ2xlLm92ZXJsYXBfcmVjdGFuZ2xlKHJldF9vYmosIGx0cmVlKSkgewogICAgICAgICAgICAgICAgaWYgKChyZXRfb2JqLnRhcmdldCAmJiAibGVhZiIgaW4gbHRyZWUgJiYgbHRyZWUubGVhZiA9PT0gcmV0X29iai50YXJnZXQpIHx8ICghcmV0X29iai50YXJnZXQgJiYgKCJsZWFmIiBpbiBsdHJlZSB8fCBSVHJlZS5SZWN0YW5nbGUuY29udGFpbnNfcmVjdGFuZ2xlKGx0cmVlLCByZXRfb2JqKSkpKSB7IC8vIEEgTWF0Y2ggISEKICAgICAgICAgICAgICAgICAgLy8gWXVwIHdlIGZvdW5kIGEgbWF0Y2guLi4KICAgICAgICAgICAgICAgICAgLy8gd2UgY2FuIGNhbmNlbCBzZWFyY2ggYW5kIHN0YXJ0IHdhbGtpbmcgdXAgdGhlIGxpc3QKICAgICAgICAgICAgICAgICAgaWYgKCJub2RlcyIgaW4gbHRyZWUpIHsgLy8gSWYgd2UgYXJlIGRlbGV0aW5nIGEgbm9kZSBub3QgYSBsZWFmLi4uCiAgICAgICAgICAgICAgICAgICAgcmV0X2FycmF5ID0gX3NlYXJjaF9zdWJ0cmVlKGx0cmVlLCB0cnVlLCBbXSwgbHRyZWUpOwogICAgICAgICAgICAgICAgICAgIHRyZWUubm9kZXMuc3BsaWNlKGksIDEpOwogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJldF9hcnJheSA9IHRyZWUubm9kZXMuc3BsaWNlKGksIDEpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIFJlc2l6ZSBNQlIgZG93bi4uLgogICAgICAgICAgICAgICAgICBSVHJlZS5SZWN0YW5nbGUubWFrZV9NQlIodHJlZS5ub2RlcywgdHJlZSk7CiAgICAgICAgICAgICAgICAgIGRlbGV0ZSByZXRfb2JqLnRhcmdldDsKICAgICAgICAgICAgICAgICAgaWYgKHRyZWUubm9kZXMubGVuZ3RoIDwgX01pbl9XaWR0aCkgeyAvLyBVbmRlcmZsb3cKICAgICAgICAgICAgICAgICAgICByZXRfb2JqLm5vZGVzID0gX3NlYXJjaF9zdWJ0cmVlKHRyZWUsIHRydWUsIFtdLCB0cmVlKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8qICBlbHNlIGlmKCJsb2FkIiBpbiBsdHJlZSkgeyAvLyBBIGxvYWQKICAgICAgICAgICAgICAgIH0qLwogICAgICAgICAgICAgICAgZWxzZSBpZiAoIm5vZGVzIiBpbiBsdHJlZSkgeyAvLyBOb3QgYSBMZWFmCiAgICAgICAgICAgICAgICAgIGN1cnJlbnRfZGVwdGggKz0gMTsKICAgICAgICAgICAgICAgICAgY291bnRfc3RhY2sucHVzaChpKTsKICAgICAgICAgICAgICAgICAgaGl0X3N0YWNrLnB1c2godHJlZSk7CiAgICAgICAgICAgICAgICAgIHRyZWUgPSBsdHJlZTsKICAgICAgICAgICAgICAgICAgaSA9IGx0cmVlLm5vZGVzLmxlbmd0aDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaSAtPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgaWYgKCJub2RlcyIgaW4gcmV0X29iaikgeyAvLyBXZSBhcmUgdW5zcGxpdHRpbmcKICAgICAgICAgICAgdHJlZS5ub2Rlcy5zcGxpY2UoaSArIDEsIDEpOyAvLyBSZW1vdmUgdW5zcGxpdCBub2RlCiAgICAgICAgICAgIC8vIHJldF9vYmoubm9kZXMgY29udGFpbnMgYSBsaXN0IG9mIGVsZW1lbnRzIHJlbW92ZWQgZnJvbSB0aGUgdHJlZSBzbyBmYXIKICAgICAgICAgICAgaWYgKHRyZWUubm9kZXMubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgIFJUcmVlLlJlY3RhbmdsZS5tYWtlX01CUih0cmVlLm5vZGVzLCB0cmVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IgKHZhciB0ID0gMDsgdCA8IHJldF9vYmoubm9kZXMubGVuZ3RoOyB0KyspIHsKICAgICAgICAgICAgICBfaW5zZXJ0X3N1YnRyZWUocmV0X29iai5ub2Rlc1t0XSwgdHJlZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0X29iai5ub2Rlcy5sZW5ndGggPSAwOwogICAgICAgICAgICBpZiAoaGl0X3N0YWNrLmxlbmd0aCA9PT0gMCAmJiB0cmVlLm5vZGVzLmxlbmd0aCA8PSAxKSB7IC8vIFVuZGVyZmxvdy4ub24gcm9vdCEKICAgICAgICAgICAgICByZXRfb2JqLm5vZGVzID0gX3NlYXJjaF9zdWJ0cmVlKHRyZWUsIHRydWUsIHJldF9vYmoubm9kZXMsIHRyZWUpOwogICAgICAgICAgICAgIHRyZWUubm9kZXMubGVuZ3RoID0gMDsKICAgICAgICAgICAgICBoaXRfc3RhY2sucHVzaCh0cmVlKTsKICAgICAgICAgICAgICBjb3VudF9zdGFjay5wdXNoKDEpOwogICAgICAgICAgICB9IGVsc2UgaWYgKGhpdF9zdGFjay5sZW5ndGggPiAwICYmIHRyZWUubm9kZXMubGVuZ3RoIDwgX01pbl9XaWR0aCkgeyAvLyBVbmRlcmZsb3cuLkFHQUlOIQogICAgICAgICAgICAgIHJldF9vYmoubm9kZXMgPSBfc2VhcmNoX3N1YnRyZWUodHJlZSwgdHJ1ZSwgcmV0X29iai5ub2RlcywgdHJlZSk7CiAgICAgICAgICAgICAgdHJlZS5ub2Rlcy5sZW5ndGggPSAwOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGRlbGV0ZSByZXRfb2JqLm5vZGVzOyAvLyBKdXN0IHN0YXJ0IHJlc2l6aW5nCiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7IC8vIHdlIGFyZSBqdXN0IHJlc2l6aW5nCiAgICAgICAgICAgIFJUcmVlLlJlY3RhbmdsZS5tYWtlX01CUih0cmVlLm5vZGVzLCB0cmVlKTsKICAgICAgICAgIH0KICAgICAgICAgIGN1cnJlbnRfZGVwdGggLT0gMTsKICAgICAgICB9IHdoaWxlIChoaXRfc3RhY2subGVuZ3RoID4gMCk7CgogICAgICAgIHJldHVybiAocmV0X2FycmF5KTsKICAgICAgICB9OwoKICAgLyogY2hvb3NlIHRoZSBiZXN0IGRhbW4gbm9kZSBmb3IgcmVjdGFuZ2xlIHRvIGJlIGluc2VydGVkIGludG8KICAgICogWyBsZWFmIG5vZGUgcGFyZW50IF0gPSBfY2hvb3NlX2xlYWZfc3VidHJlZShyZWN0YW5nbGUsIHJvb3QgdG8gc3RhcnQgc2VhcmNoIGF0KQogICAgKiBAcHJpdmF0ZQogICAgKi8KICAgIHZhciBfY2hvb3NlX2xlYWZfc3VidHJlZSA9IGZ1bmN0aW9uKHJlY3QsIHJvb3QpIHsKICAgICAgICB2YXIgYmVzdF9jaG9pY2VfaW5kZXggPSAtMTsKICAgICAgICB2YXIgYmVzdF9jaG9pY2Vfc3RhY2sgPSBbXTsKICAgICAgICB2YXIgYmVzdF9jaG9pY2VfYXJlYTsKCiAgICAgICAgdmFyIGxvYWRfY2FsbGJhY2sgPSBmdW5jdGlvbihsb2NhbF90cmVlLCBsb2NhbF9ub2RlKSB7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihkYXRhKSB7CiAgICAgICAgICAgICAgbG9jYWxfdHJlZS5fYXR0YWNoX2RhdGEobG9jYWxfbm9kZSwgZGF0YSk7CiAgICAgICAgICAgIH07CiAgICAgICAgfTsKCiAgICAgICAgYmVzdF9jaG9pY2Vfc3RhY2sucHVzaChyb290KTsKICAgICAgICB2YXIgbm9kZXMgPSByb290Lm5vZGVzOwoKICAgICAgICBkbyB7CiAgICAgICAgICBpZiAoYmVzdF9jaG9pY2VfaW5kZXggIT09IC0xKSB7CiAgICAgICAgICAgIGJlc3RfY2hvaWNlX3N0YWNrLnB1c2gobm9kZXNbYmVzdF9jaG9pY2VfaW5kZXhdKTsKICAgICAgICAgICAgbm9kZXMgPSBub2Rlc1tiZXN0X2Nob2ljZV9pbmRleF0ubm9kZXM7CiAgICAgICAgICAgIGJlc3RfY2hvaWNlX2luZGV4ID0gLTE7CiAgICAgICAgICB9CgogICAgICAgICAgZm9yICh2YXIgaSA9IG5vZGVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgICAgIHZhciBsdHJlZSA9IG5vZGVzW2ldOwogICAgICAgICAgICBpZiAoImxlYWYiIGluIGx0cmVlKSB7CiAgICAgICAgICAgICAgLy8gQmFpbCBvdXQgb2YgZXZlcnl0aGluZyBhbmQgc3RhcnQgaW5zZXJ0aW5nCiAgICAgICAgICAgICAgYmVzdF9jaG9pY2VfaW5kZXggPSAtMTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gQXJlYSBvZiBuZXcgZW5sYXJnZWQgcmVjdGFuZ2xlCiAgICAgICAgICAgIHZhciBvbGRfbHJhdGlvID0gUlRyZWUuUmVjdGFuZ2xlLnNxdWFyaWZpZWRfcmF0aW8obHRyZWUudywgbHRyZWUuaCwgbHRyZWUubm9kZXMubGVuZ3RoICsgMSk7CgogICAgICAgICAgICAvLyBFbmxhcmdlIHJlY3RhbmdsZSB0byBmaXQgbmV3IHJlY3RhbmdsZQogICAgICAgICAgICB2YXIgbncgPSBNYXRoLm1heChsdHJlZS54ICsgbHRyZWUudywgcmVjdC54ICsgcmVjdC53KSAtIE1hdGgubWluKGx0cmVlLngsIHJlY3QueCk7CiAgICAgICAgICAgIHZhciBuaCA9IE1hdGgubWF4KGx0cmVlLnkgKyBsdHJlZS5oLCByZWN0LnkgKyByZWN0LmgpIC0gTWF0aC5taW4obHRyZWUueSwgcmVjdC55KTsKCiAgICAgICAgICAgIC8vIEFyZWEgb2YgbmV3IGVubGFyZ2VkIHJlY3RhbmdsZQogICAgICAgICAgICB2YXIgbHJhdGlvID0gUlRyZWUuUmVjdGFuZ2xlLnNxdWFyaWZpZWRfcmF0aW8obncsIG5oLCBsdHJlZS5ub2Rlcy5sZW5ndGggKyAyKTsKCiAgICAgICAgICAgIGlmIChiZXN0X2Nob2ljZV9pbmRleCA8IDAgfHwgTWF0aC5hYnMobHJhdGlvIC0gb2xkX2xyYXRpbykgPCBiZXN0X2Nob2ljZV9hcmVhKSB7CiAgICAgICAgICAgICAgYmVzdF9jaG9pY2VfYXJlYSA9IE1hdGguYWJzKGxyYXRpbyAtIG9sZF9scmF0aW8pOwogICAgICAgICAgICAgIGJlc3RfY2hvaWNlX2luZGV4ID0gaTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gd2hpbGUgKGJlc3RfY2hvaWNlX2luZGV4ICE9PSAtMSk7CgogICAgICAgIHJldHVybiAoYmVzdF9jaG9pY2Vfc3RhY2spOwogICAgICAgIH07CgogICAvKiBzcGxpdCBhIHNldCBvZiBub2RlcyBpbnRvIHR3byByb3VnaGx5IGVxdWFsbHktZmlsbGVkIG5vZGVzCiAgICAqIFsgYW4gYXJyYXkgb2YgdHdvIG5ldyBhcnJheXMgb2Ygbm9kZXMgXSA9IGxpbmVhcl9zcGxpdChhcnJheSBvZiBub2RlcykKICAgICogQHByaXZhdGUKICAgICovCiAgICB2YXIgX2xpbmVhcl9zcGxpdCA9IGZ1bmN0aW9uKG5vZGVzKSB7CiAgICAgICAgdmFyIG4gPSBfcGlja19saW5lYXIobm9kZXMpOwogICAgICAgIHdoaWxlIChub2Rlcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICBfcGlja19uZXh0KG5vZGVzLCBuWzBdLCBuWzFdKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIChuKTsKICAgICAgICB9OwoKICAgLyogaW5zZXJ0IHRoZSBiZXN0IHNvdXJjZSByZWN0YW5nbGUgaW50byB0aGUgYmVzdCBmaXR0aW5nIHBhcmVudCBub2RlOiBhIG9yIGIKICAgICogW10gPSBwaWNrX25leHQoYXJyYXkgb2Ygc291cmNlIG5vZGVzLCB0YXJnZXQgbm9kZSBhcnJheSBhLCB0YXJnZXQgbm9kZSBhcnJheSBiKQogICAgKiBAcHJpdmF0ZQogICAgKi8KICAgIHZhciBfcGlja19uZXh0ID0gZnVuY3Rpb24obm9kZXMsIGEsIGIpIHsKICAgICAgICAvLyBBcmVhIG9mIG5ldyBlbmxhcmdlZCByZWN0YW5nbGUKICAgICAgICB2YXIgYXJlYV9hID0gUlRyZWUuUmVjdGFuZ2xlLnNxdWFyaWZpZWRfcmF0aW8oYS53LCBhLmgsIGEubm9kZXMubGVuZ3RoICsgMSk7CiAgICAgICAgdmFyIGFyZWFfYiA9IFJUcmVlLlJlY3RhbmdsZS5zcXVhcmlmaWVkX3JhdGlvKGIudywgYi5oLCBiLm5vZGVzLmxlbmd0aCArIDEpOwogICAgICAgIHZhciBoaWdoX2FyZWFfZGVsdGE7CiAgICAgICAgdmFyIGhpZ2hfYXJlYV9ub2RlOwogICAgICAgIHZhciBsb3dlc3RfZ3Jvd3RoX2dyb3VwOwoKICAgICAgICBmb3IgKHZhciBpID0gbm9kZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgIHZhciBsID0gbm9kZXNbaV07CiAgICAgICAgICB2YXIgbmV3X2FyZWFfYSA9IHt9OwogICAgICAgICAgbmV3X2FyZWFfYS54ID0gTWF0aC5taW4oYS54LCBsLngpOwogICAgICAgICAgbmV3X2FyZWFfYS55ID0gTWF0aC5taW4oYS55LCBsLnkpOwogICAgICAgICAgbmV3X2FyZWFfYS53ID0gTWF0aC5tYXgoYS54ICsgYS53LCBsLnggKyBsLncpIC0gbmV3X2FyZWFfYS54OwogICAgICAgICAgbmV3X2FyZWFfYS5oID0gTWF0aC5tYXgoYS55ICsgYS5oLCBsLnkgKyBsLmgpIC0gbmV3X2FyZWFfYS55OwogICAgICAgICAgdmFyIGNoYW5nZV9uZXdfYXJlYV9hID0gTWF0aC5hYnMoUlRyZWUuUmVjdGFuZ2xlLnNxdWFyaWZpZWRfcmF0aW8obmV3X2FyZWFfYS53LCBuZXdfYXJlYV9hLmgsIGEubm9kZXMubGVuZ3RoICsgMikgLSBhcmVhX2EpOwoKICAgICAgICAgIHZhciBuZXdfYXJlYV9iID0ge307CiAgICAgICAgICBuZXdfYXJlYV9iLnggPSBNYXRoLm1pbihiLngsIGwueCk7CiAgICAgICAgICBuZXdfYXJlYV9iLnkgPSBNYXRoLm1pbihiLnksIGwueSk7CiAgICAgICAgICBuZXdfYXJlYV9iLncgPSBNYXRoLm1heChiLnggKyBiLncsIGwueCArIGwudykgLSBuZXdfYXJlYV9iLng7CiAgICAgICAgICBuZXdfYXJlYV9iLmggPSBNYXRoLm1heChiLnkgKyBiLmgsIGwueSArIGwuaCkgLSBuZXdfYXJlYV9iLnk7CiAgICAgICAgICB2YXIgY2hhbmdlX25ld19hcmVhX2IgPSBNYXRoLmFicyhSVHJlZS5SZWN0YW5nbGUuc3F1YXJpZmllZF9yYXRpbyhuZXdfYXJlYV9iLncsIG5ld19hcmVhX2IuaCwgYi5ub2Rlcy5sZW5ndGggKyAyKSAtIGFyZWFfYik7CgogICAgICAgICAgaWYgKCFoaWdoX2FyZWFfbm9kZSB8fCAhaGlnaF9hcmVhX2RlbHRhIHx8IE1hdGguYWJzKGNoYW5nZV9uZXdfYXJlYV9iIC0gY2hhbmdlX25ld19hcmVhX2EpIDwgaGlnaF9hcmVhX2RlbHRhKSB7CiAgICAgICAgICAgIGhpZ2hfYXJlYV9ub2RlID0gaTsKICAgICAgICAgICAgaGlnaF9hcmVhX2RlbHRhID0gTWF0aC5hYnMoY2hhbmdlX25ld19hcmVhX2IgLSBjaGFuZ2VfbmV3X2FyZWFfYSk7CiAgICAgICAgICAgIGxvd2VzdF9ncm93dGhfZ3JvdXAgPSBjaGFuZ2VfbmV3X2FyZWFfYiA8IGNoYW5nZV9uZXdfYXJlYV9hID8gYiA6IGE7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHZhciB0ZW1wX25vZGUgPSBub2Rlcy5zcGxpY2UoaGlnaF9hcmVhX25vZGUsIDEpWzBdOwogICAgICAgIGlmIChhLm5vZGVzLmxlbmd0aCArIG5vZGVzLmxlbmd0aCArIDEgPD0gX01pbl9XaWR0aCkgewogICAgICAgICAgYS5ub2Rlcy5wdXNoKHRlbXBfbm9kZSk7CiAgICAgICAgICBSVHJlZS5SZWN0YW5nbGUuZXhwYW5kX3JlY3RhbmdsZShhLCB0ZW1wX25vZGUpOwogICAgICAgIH0gZWxzZSBpZiAoYi5ub2Rlcy5sZW5ndGggKyBub2Rlcy5sZW5ndGggKyAxIDw9IF9NaW5fV2lkdGgpIHsKICAgICAgICAgIGIubm9kZXMucHVzaCh0ZW1wX25vZGUpOwogICAgICAgICAgUlRyZWUuUmVjdGFuZ2xlLmV4cGFuZF9yZWN0YW5nbGUoYiwgdGVtcF9ub2RlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbG93ZXN0X2dyb3d0aF9ncm91cC5ub2Rlcy5wdXNoKHRlbXBfbm9kZSk7CiAgICAgICAgICBSVHJlZS5SZWN0YW5nbGUuZXhwYW5kX3JlY3RhbmdsZShsb3dlc3RfZ3Jvd3RoX2dyb3VwLCB0ZW1wX25vZGUpOwogICAgICAgIH0KICAgICAgICB9OwoKICAgLyogcGljayB0aGUgImJlc3QiIHR3byBzdGFydGVyIG5vZGVzIHRvIHVzZSBhcyBzZWVkcyB1c2luZyB0aGUgImxpbmVhciIgY3JpdGVyaWEKICAgICogWyBhbiBhcnJheSBvZiB0d28gbmV3IGFycmF5cyBvZiBub2RlcyBdID0gcGlja19saW5lYXIoYXJyYXkgb2Ygc291cmNlIG5vZGVzKQogICAgKiBAcHJpdmF0ZQogICAgKi8KICAgIHZhciBfcGlja19saW5lYXIgPSBmdW5jdGlvbihub2RlcykgewogICAgICAgIHZhciBsb3dlc3RfaGlnaF94ID0gbm9kZXMubGVuZ3RoIC0gMTsKICAgICAgICB2YXIgaGlnaGVzdF9sb3dfeCA9IDA7CiAgICAgICAgdmFyIGxvd2VzdF9oaWdoX3kgPSBub2Rlcy5sZW5ndGggLSAxOwogICAgICAgIHZhciBoaWdoZXN0X2xvd195ID0gMDsKICAgICAgICB2YXIgdDEsIHQyOwoKICAgICAgICBmb3IgKHZhciBpID0gbm9kZXMubGVuZ3RoIC0gMjsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgIHZhciBsID0gbm9kZXNbaV07CiAgICAgICAgICBpZiAobC54ID4gbm9kZXNbaGlnaGVzdF9sb3dfeF0ueCkgewogICAgICAgICAgICBoaWdoZXN0X2xvd194ID0gaTsKICAgICAgICAgIH0gZWxzZSBpZiAobC54ICsgbC53IDwgbm9kZXNbbG93ZXN0X2hpZ2hfeF0ueCArIG5vZGVzW2xvd2VzdF9oaWdoX3hdLncpIHsKICAgICAgICAgICAgbG93ZXN0X2hpZ2hfeCA9IGk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAobC55ID4gbm9kZXNbaGlnaGVzdF9sb3dfeV0ueSkgewogICAgICAgICAgICBoaWdoZXN0X2xvd195ID0gaTsKICAgICAgICAgIH0gZWxzZSBpZiAobC55ICsgbC5oIDwgbm9kZXNbbG93ZXN0X2hpZ2hfeV0ueSArIG5vZGVzW2xvd2VzdF9oaWdoX3ldLmgpIHsKICAgICAgICAgICAgbG93ZXN0X2hpZ2hfeSA9IGk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHZhciBkeCA9IE1hdGguYWJzKChub2Rlc1tsb3dlc3RfaGlnaF94XS54ICsgbm9kZXNbbG93ZXN0X2hpZ2hfeF0udykgLSBub2Rlc1toaWdoZXN0X2xvd194XS54KTsKICAgICAgICB2YXIgZHkgPSBNYXRoLmFicygobm9kZXNbbG93ZXN0X2hpZ2hfeV0ueSArIG5vZGVzW2xvd2VzdF9oaWdoX3ldLmgpIC0gbm9kZXNbaGlnaGVzdF9sb3dfeV0ueSk7CiAgICAgICAgaWYgKGR4ID4gZHkpIHsKICAgICAgICAgIGlmIChsb3dlc3RfaGlnaF94ID4gaGlnaGVzdF9sb3dfeCkgewogICAgICAgICAgICB0MSA9IG5vZGVzLnNwbGljZShsb3dlc3RfaGlnaF94LCAxKVswXTsKICAgICAgICAgICAgdDIgPSBub2Rlcy5zcGxpY2UoaGlnaGVzdF9sb3dfeCwgMSlbMF07CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0MiA9IG5vZGVzLnNwbGljZShoaWdoZXN0X2xvd194LCAxKVswXTsKICAgICAgICAgICAgdDEgPSBub2Rlcy5zcGxpY2UobG93ZXN0X2hpZ2hfeCwgMSlbMF07CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmIChsb3dlc3RfaGlnaF95ID4gaGlnaGVzdF9sb3dfeSkgewogICAgICAgICAgICB0MSA9IG5vZGVzLnNwbGljZShsb3dlc3RfaGlnaF95LCAxKVswXTsKICAgICAgICAgICAgdDIgPSBub2Rlcy5zcGxpY2UoaGlnaGVzdF9sb3dfeSwgMSlbMF07CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0MiA9IG5vZGVzLnNwbGljZShoaWdoZXN0X2xvd195LCAxKVswXTsKICAgICAgICAgICAgdDEgPSBub2Rlcy5zcGxpY2UobG93ZXN0X2hpZ2hfeSwgMSlbMF07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAoW3sKICAgICAgICAgIHg6IHQxLngsCiAgICAgICAgICB5OiB0MS55LAogICAgICAgICAgdzogdDEudywKICAgICAgICAgIGg6IHQxLmgsCiAgICAgICAgICBub2RlczogW3QxXQogICAgICAgIH0sIHsKICAgICAgICAgIHg6IHQyLngsCiAgICAgICAgICB5OiB0Mi55LAogICAgICAgICAgdzogdDIudywKICAgICAgICAgIGg6IHQyLmgsCiAgICAgICAgICBub2RlczogW3QyXQogICAgICAgIH1dKTsKICAgICAgICB9OwoKICAgIHZhciBfYXR0YWNoX2RhdGEgPSBmdW5jdGlvbihub2RlLCBtb3JlX3RyZWUpIHsKICAgICAgICBub2RlLm5vZGVzID0gbW9yZV90cmVlLm5vZGVzOwogICAgICAgIG5vZGUueCA9IG1vcmVfdHJlZS54OwogICAgICAgIG5vZGUueSA9IG1vcmVfdHJlZS55OwogICAgICAgIG5vZGUudyA9IG1vcmVfdHJlZS53OwogICAgICAgIG5vZGUuaCA9IG1vcmVfdHJlZS5oOwogICAgICAgIHJldHVybiAobm9kZSk7CiAgICB9OwoKICAgLyogbm9uLXJlY3Vyc2l2ZSBpbnRlcm5hbCBzZWFyY2ggZnVuY3Rpb24KICAgICogWyBub2RlcyB8IG9iamVjdHMgXSA9IF9zZWFyY2hfc3VidHJlZShyZWN0YW5nbGUsIFtyZXR1cm4gbm9kZSBkYXRhXSwgW2FycmF5IHRvIGZpbGxdLCByb290IHRvIGJlZ2luIHNlYXJjaCBhdCkKICAgICogQHByaXZhdGUKICAgICovCiAgICB2YXIgX3NlYXJjaF9zdWJ0cmVlID0gZnVuY3Rpb24ocmVjdCwgcmV0dXJuX25vZGUsIHJldHVybl9hcnJheSwgcm9vdCkgewogICAgICB2YXIgaGl0X3N0YWNrID0gW107IC8vIENvbnRhaW5zIHRoZSBlbGVtZW50cyB0aGF0IG92ZXJsYXAKICAgICAgaWYgKCFSVHJlZS5SZWN0YW5nbGUub3ZlcmxhcF9yZWN0YW5nbGUocmVjdCwgcm9vdCkpIHsKICAgICAgICByZXR1cm4gcmV0dXJuX2FycmF5OwogICAgICB9CgogICAgICB2YXIgbG9hZF9jYWxsYmFjayA9IGZ1bmN0aW9uKGxvY2FsX3RyZWUsIGxvY2FsX25vZGUpIHsKICAgICAgICAgIHJldHVybiBmdW5jdGlvbihkYXRhKSB7CiAgICAgICAgICAgIGxvY2FsX3RyZWUuX2F0dGFjaF9kYXRhKGxvY2FsX25vZGUsIGRhdGEpOwogICAgICAgICAgfTsKICAgICAgfTsKCiAgICAgIGhpdF9zdGFjay5wdXNoKHJvb3Qubm9kZXMpOwoKICAgICAgZG8gewogICAgICAgIHZhciBub2RlcyA9IGhpdF9zdGFjay5wb3AoKTsKCiAgICAgICAgZm9yICh2YXIgaSA9IG5vZGVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgICB2YXIgbHRyZWUgPSBub2Rlc1tpXTsKICAgICAgICAgIGlmIChSVHJlZS5SZWN0YW5nbGUub3ZlcmxhcF9yZWN0YW5nbGUocmVjdCwgbHRyZWUpKSB7CiAgICAgICAgICAgIGlmICgibm9kZXMiIGluIGx0cmVlKSB7IC8vIE5vdCBhIExlYWYKICAgICAgICAgICAgICBoaXRfc3RhY2sucHVzaChsdHJlZS5ub2Rlcyk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoImxlYWYiIGluIGx0cmVlKSB7IC8vIEEgTGVhZiAhIQogICAgICAgICAgICAgIGlmICghcmV0dXJuX25vZGUpIHsKICAgICAgICAgICAgICAgIHJldHVybl9hcnJheS5wdXNoKGx0cmVlLmxlYWYpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm5fYXJyYXkucHVzaChsdHJlZSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IHdoaWxlIChoaXRfc3RhY2subGVuZ3RoID4gMCk7CgogICAgICByZXR1cm4gcmV0dXJuX2FycmF5OwogICAgfTsKCiAgICB2YXIgX3NlYXJjaF9zdWJ0cmVlX3JldmVyc2UgPSBmdW5jdGlvbihyZWN0LCByZXR1cm5fbm9kZSwgcmV0dXJuX2FycmF5LCByb290KSB7CiAgICAgIHZhciBoaXRfc3RhY2sgPSBbXTsgLy8gQ29udGFpbnMgdGhlIGVsZW1lbnRzIHRoYXQgb3ZlcmxhcAogICAgICBpZiAoIVJUcmVlLlJlY3RhbmdsZS5vdmVybGFwX3JlY3RhbmdsZShyb290LCByZWN0KSkgewogICAgICAgIHJldHVybiByZXR1cm5fYXJyYXk7CiAgICAgIH0KCiAgICAgIHZhciBsb2FkX2NhbGxiYWNrID0gZnVuY3Rpb24obG9jYWxfdHJlZSwgbG9jYWxfbm9kZSkgewogICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGRhdGEpIHsKICAgICAgICAgICAgbG9jYWxfdHJlZS5fYXR0YWNoX2RhdGEobG9jYWxfbm9kZSwgZGF0YSk7CiAgICAgICAgICB9OwogICAgICB9OwoKICAgICAgaGl0X3N0YWNrLnB1c2gocm9vdC5ub2Rlcyk7CgogICAgICBkbyB7CiAgICAgICAgdmFyIG5vZGVzID0gaGl0X3N0YWNrLnBvcCgpOwoKICAgICAgICBmb3IgKHZhciBpID0gbm9kZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgIHZhciBsdHJlZSA9IG5vZGVzW2ldOwogICAgICAgICAgaWYgKFJUcmVlLlJlY3RhbmdsZS5vdmVybGFwX3JlY3RhbmdsZShsdHJlZSwgcmVjdCkpIHsKICAgICAgICAgICAgaWYgKCJub2RlcyIgaW4gbHRyZWUpIHsgLy8gTm90IGEgTGVhZgogICAgICAgICAgICAgIGhpdF9zdGFjay5wdXNoKGx0cmVlLm5vZGVzKTsKICAgICAgICAgICAgfSBlbHNlIGlmICgibGVhZiIgaW4gbHRyZWUpIHsgLy8gQSBMZWFmICEhCiAgICAgICAgICAgICAgaWYgKCFyZXR1cm5fbm9kZSkgewogICAgICAgICAgICAgICAgcmV0dXJuX2FycmF5LnB1c2gobHRyZWUubGVhZik7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybl9hcnJheS5wdXNoKGx0cmVlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gd2hpbGUgKGhpdF9zdGFjay5sZW5ndGggPiAwKTsKCiAgICAgIHJldHVybiByZXR1cm5fYXJyYXk7CiAgICB9OwoKICAgLyogbm9uLXJlY3Vyc2l2ZSBpbnRlcm5hbCBpbnNlcnQgZnVuY3Rpb24KICAgICogW10gPSBfaW5zZXJ0X3N1YnRyZWUocmVjdGFuZ2xlLCBvYmplY3QgdG8gaW5zZXJ0LCByb290IHRvIGJlZ2luIGluc2VydGlvbiBhdCkKICAgICogQHByaXZhdGUKICAgICovCiAgICB2YXIgX2luc2VydF9zdWJ0cmVlID0gZnVuY3Rpb24obm9kZSwgcm9vdCkgewogICAgICB2YXIgYmM7IC8vIEJlc3QgQ3VycmVudCBub2RlCiAgICAgIC8vIEluaXRpYWwgaW5zZXJ0aW9uIGlzIHNwZWNpYWwgYmVjYXVzZSB3ZSByZXNpemUgdGhlIFRyZWUgYW5kIHdlIGRvbid0CiAgICAgIC8vIGNhcmUgYWJvdXQgYW55IG92ZXJmbG93IChzZXJpb3VzbHksIGhvdyBjYW4gdGhlIGZpcnN0IG9iamVjdCBvdmVyZmxvdz8pCiAgICAgIGlmIChyb290Lm5vZGVzLmxlbmd0aCA9PT0gMCkgewogICAgICAgIHJvb3QueCA9IG5vZGUueDsKICAgICAgICByb290LnkgPSBub2RlLnk7CiAgICAgICAgcm9vdC53ID0gbm9kZS53OwogICAgICAgIHJvb3QuaCA9IG5vZGUuaDsKICAgICAgICByb290Lm5vZGVzLnB1c2gobm9kZSk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICAvLyBGaW5kIHRoZSBiZXN0IGZpdHRpbmcgbGVhZiBub2RlCiAgICAgIC8vIGNob29zZV9sZWFmIHJldHVybnMgYW4gYXJyYXkgb2YgYWxsIHRyZWUgbGV2ZWxzIChpbmNsdWRpbmcgcm9vdCkKICAgICAgLy8gdGhhdCB3ZXJlIHRyYXZlcnNlZCB3aGlsZSB0cnlpbmcgdG8gZmluZCB0aGUgbGVhZgogICAgICB2YXIgdHJlZV9zdGFjayA9IF9jaG9vc2VfbGVhZl9zdWJ0cmVlKG5vZGUsIHJvb3QpOwogICAgICB2YXIgcmV0X29iaiA9IG5vZGU7IC8ve3g6cmVjdC54LHk6cmVjdC55LHc6cmVjdC53LGg6cmVjdC5oLCBsZWFmOm9ian07CiAgICAgIC8vIFdhbGsgYmFjayB1cCB0aGUgdHJlZSByZXNpemluZyBhbmQgaW5zZXJ0aW5nIGFzIG5lZWRlZAogICAgICBkbyB7CiAgICAgICAgLy9oYW5kbGUgdGhlIGNhc2Ugb2YgYW4gZW1wdHkgbm9kZSAoZnJvbSBhIHNwbGl0KQogICAgICAgIGlmIChiYyAmJiAibm9kZXMiIGluIGJjICYmIGJjLm5vZGVzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgdmFyIHBiYyA9IGJjOyAvLyBQYXN0IGJjCiAgICAgICAgICBiYyA9IHRyZWVfc3RhY2sucG9wKCk7CiAgICAgICAgICBmb3IgKHZhciB0ID0gMDsgdCA8IGJjLm5vZGVzLmxlbmd0aDsgdCsrKSB7CiAgICAgICAgICAgIGlmIChiYy5ub2Rlc1t0XSA9PT0gcGJjIHx8IGJjLm5vZGVzW3RdLm5vZGVzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgIGJjLm5vZGVzLnNwbGljZSh0LCAxKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBiYyA9IHRyZWVfc3RhY2sucG9wKCk7CiAgICAgICAgfQoKICAgICAgICAvLyBJZiB0aGVyZSBpcyBkYXRhIGF0dGFjaGVkIHRvIHRoaXMgcmV0X29iagogICAgICAgIGlmICgibGVhZiIgaW4gcmV0X29iaiB8fCAibm9kZXMiIGluIHJldF9vYmogfHwgaXNBcnJheShyZXRfb2JqKSkgewogICAgICAgICAgLy8gRG8gSW5zZXJ0CiAgICAgICAgICBpZiAoaXNBcnJheShyZXRfb2JqKSkgewogICAgICAgICAgICBmb3IgKHZhciBhaSA9IDA7IGFpIDwgcmV0X29iai5sZW5ndGg7IGFpKyspIHsKICAgICAgICAgICAgICBSVHJlZS5SZWN0YW5nbGUuZXhwYW5kX3JlY3RhbmdsZShiYywgcmV0X29ialthaV0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJjLm5vZGVzID0gYmMubm9kZXMuY29uY2F0KHJldF9vYmopOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgUlRyZWUuUmVjdGFuZ2xlLmV4cGFuZF9yZWN0YW5nbGUoYmMsIHJldF9vYmopOwogICAgICAgICAgICBiYy5ub2Rlcy5wdXNoKHJldF9vYmopOyAvLyBEbyBJbnNlcnQKICAgICAgICAgIH0KCiAgICAgICAgICBpZiAoYmMubm9kZXMubGVuZ3RoIDw9IF9NYXhfV2lkdGgpIHsgLy8gU3RhcnQgUmVzaXplaW5nIFVwIHRoZSBUcmVlCiAgICAgICAgICAgIHJldF9vYmogPSB7CiAgICAgICAgICAgICAgeDogYmMueCwKICAgICAgICAgICAgICB5OiBiYy55LAogICAgICAgICAgICAgIHc6IGJjLncsCiAgICAgICAgICAgICAgaDogYmMuaAogICAgICAgICAgICB9OwogICAgICAgICAgfSBlbHNlIHsgLy8gT3RoZXJ3aXNlIFNwbGl0IHRoaXMgTm9kZQogICAgICAgICAgICAvLyBsaW5lYXJfc3BsaXQoKSByZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgdHdvIG5ldyBub2RlcwogICAgICAgICAgICAvLyBmb3JtZWQgZnJvbSB0aGUgc3BsaXQgb2YgdGhlIHByZXZpb3VzIG5vZGUncyBvdmVyZmxvdwogICAgICAgICAgICB2YXIgYSA9IF9saW5lYXJfc3BsaXQoYmMubm9kZXMpOwogICAgICAgICAgICByZXRfb2JqID0gYTsgLy9bMV07CiAgICAgICAgICAgIGlmICh0cmVlX3N0YWNrLmxlbmd0aCA8IDEpIHsgLy8gSWYgYXJlIHNwbGl0dGluZyB0aGUgcm9vdC4uCiAgICAgICAgICAgICAgYmMubm9kZXMucHVzaChhWzBdKTsKICAgICAgICAgICAgICB0cmVlX3N0YWNrLnB1c2goYmMpOyAvLyBSZWNvbnNpZGVyIHRoZSByb290IGVsZW1lbnQKICAgICAgICAgICAgICByZXRfb2JqID0gYVsxXTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7IC8vIE90aGVyd2lzZSBEbyBSZXNpemUKICAgICAgICAgIC8vSnVzdCBrZWVwIGFwcGx5aW5nIHRoZSBuZXcgYm91bmRpbmcgcmVjdGFuZ2xlIHRvIHRoZSBwYXJlbnRzLi4KICAgICAgICAgIFJUcmVlLlJlY3RhbmdsZS5leHBhbmRfcmVjdGFuZ2xlKGJjLCByZXRfb2JqKTsKICAgICAgICAgIHJldF9vYmogPSB7CiAgICAgICAgICAgIHg6IGJjLngsCiAgICAgICAgICAgIHk6IGJjLnksCiAgICAgICAgICAgIHc6IGJjLncsCiAgICAgICAgICAgIGg6IGJjLmgKICAgICAgICAgIH07CiAgICAgICAgfQogICAgICB9IHdoaWxlICh0cmVlX3N0YWNrLmxlbmd0aCA+IDApOwogICAgfTsKCiAgIC8qIHJldHVybnMgYSBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0cmVlCiAgICAqIEBwdWJsaWMKICAgICovCiAgICB0aGlzLnNlcmlhbGl6ZSA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7CiAgICAgIGNhbGxiYWNrKG51bGwsIF9UKTsKICAgIH07CgogICAvKiBhY2NlcHRzIGEgSlNPTiByZXByZXNlbnRhdGlvbiBvZiB0aGUgdHJlZSBhbmQgaW5zZXJ0cyBpdAogICAgKiBAcHVibGljCiAgICAqLwogICAgdGhpcy5kZXNlcmlhbGl6ZSA9IGZ1bmN0aW9uKG5ld190cmVlLCB3aGVyZSwgY2FsbGJhY2spIHsKCiAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKCiAgICAgIHN3aXRjaCAoYXJncy5sZW5ndGgpIHsKICAgICAgY2FzZSAxOgogICAgICAgIHdoZXJlID0gX1Q7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgMjoKICAgICAgICBpZih0eXBlb2YgYXJnc1sxXSA9PT0gImZ1bmN0aW9uIil7CiAgICAgICAgICB3aGVyZSA9IF9UOwogICAgICAgICAgY2FsbGJhY2sgPSBhcmdzWzFdOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgfQoKICAgICAgdmFyIGRlc2VyaWFsaXplZCA9IF9hdHRhY2hfZGF0YSh3aGVyZSwgbmV3X3RyZWUpOwoKICAgICAgaWYoY2FsbGJhY2spewogICAgICAgIGNhbGxiYWNrKG51bGwsIGRlc2VyaWFsaXplZCk7CiAgICAgIH0KICAgIH07CgogICAvKiBub24tcmVjdXJzaXZlIHNlYXJjaCBmdW5jdGlvbgogICAgKiBbIG5vZGVzIHwgb2JqZWN0cyBdID0gUlRyZWUuc2VhcmNoKHJlY3RhbmdsZSwgW3JldHVybiBub2RlIGRhdGFdLCBbYXJyYXkgdG8gZmlsbF0pCiAgICAqIEBwdWJsaWMKICAgICovCgogICAgdGhpcy5zZWFyY2ggPSBmdW5jdGlvbihzaGFwZSwgY2FsbGJhY2spIHsKICAgICAgdmFyIHJlY3Q7CiAgICAgIGlmKHNoYXBlLnR5cGUpewogICAgICAgIHZhciBiID0gVGVycmFmb3JtZXIuVG9vbHMuY2FsY3VsYXRlQm91bmRzKHNoYXBlKTsKICAgICAgICByZWN0ID0gewogICAgICAgICAgeDogYlswXSwKICAgICAgICAgIHk6IGJbMV0sCiAgICAgICAgICB3OiBNYXRoLmFicyhiWzBdIC0gYlsyXSksCiAgICAgICAgICBoOiBNYXRoLmFicyhiWzFdIC0gYlszXSkKICAgICAgICB9OwogICAgICB9IGVsc2UgewogICAgICAgIHJlY3QgPSBzaGFwZTsKICAgICAgfQoKICAgICAgdmFyIGFyZ3MgPSBbIHJlY3QsIGZhbHNlLCBbIF0sIF9UIF07CgogICAgICBpZiAocmVjdCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgdGhyb3cgIldyb25nIG51bWJlciBvZiBhcmd1bWVudHMuIFJULlNlYXJjaCByZXF1aXJlcyBhdCBsZWFzdCBhIGJvdW5kaW5nIHJlY3RhbmdsZS4iOwogICAgICB9CgogICAgICB2YXIgcmVzdWx0cyA9IF9zZWFyY2hfc3VidHJlZS5hcHBseSh0aGlzLCBhcmdzKTsKCiAgICAgIGlmKGNhbGxiYWNrKXsKICAgICAgICBjYWxsYmFjayhudWxsLCByZXN1bHRzKTsKICAgICAgfQogICAgfTsKCiAgICB0aGlzLndpdGhpbiA9IGZ1bmN0aW9uKHNoYXBlLCBjYWxsYmFjaykgewogICAgICB2YXIgcmVjdDsKICAgICAgaWYoc2hhcGUudHlwZSl7CiAgICAgICAgdmFyIGIgPSBUZXJyYWZvcm1lci5Ub29scy5jYWxjdWxhdGVCb3VuZHMoc2hhcGUpOwogICAgICAgIHJlY3QgPSB7CiAgICAgICAgICB4OiBiWzBdLAogICAgICAgICAgeTogYlsxXSwKICAgICAgICAgIHc6IE1hdGguYWJzKGJbMF0gLSBiWzJdKSwKICAgICAgICAgIGg6IE1hdGguYWJzKGJbMV0gLSBiWzNdKQogICAgICAgIH07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmVjdCA9IHNoYXBlOwogICAgICB9CgogICAgICB2YXIgYXJncyA9IFsgcmVjdCwgZmFsc2UsIFsgXSwgX1QgXTsKCiAgICAgIGlmIChyZWN0ID09PSB1bmRlZmluZWQpIHsKICAgICAgICB0aHJvdyAiV3JvbmcgbnVtYmVyIG9mIGFyZ3VtZW50cy4gUlQuU2VhcmNoIHJlcXVpcmVzIGF0IGxlYXN0IGEgYm91bmRpbmcgcmVjdGFuZ2xlLiI7CiAgICAgIH0KCiAgICAgIHZhciBzZWFyY2ggPSBfc2VhcmNoX3N1YnRyZWVfcmV2ZXJzZS5hcHBseSh0aGlzLCBhcmdzKTsKCiAgICAgIGlmKGNhbGxiYWNrKXsKICAgICAgICBjYWxsYmFjayhudWxsLCBzZWFyY2gpOwogICAgICB9CiAgICB9OwoKCiAgIC8qIG5vbi1yZWN1cnNpdmUgZnVuY3Rpb24gdGhhdCBkZWxldGVzIGEgc3BlY2lmaWMKICAgICogWyBudW1iZXIgXSA9IFJUcmVlLnJlbW92ZShyZWN0YW5nbGUsIG9iaikKICAgICovCiAgICB0aGlzLnJlbW92ZSA9IGZ1bmN0aW9uKHNoYXBlLCBvYmosIGNhbGxiYWNrKSB7CiAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKCiAgICAgIC8vIHlvdSBvbmx5IHBhc3NlZCBzaGFwZQogICAgICBpZihhcmdzLmxlbmd0aCA9PT0gMSl7CiAgICAgICAgLy8gc28gbWFrZSB0aGUgYXJncyAoc2hhcGUsIGZhbHNlKQogICAgICAgIGFyZ3MucHVzaChmYWxzZSk7CiAgICAgIH0KCiAgICAgIC8vIHlvdSBwYXNzZWQgKHNoYXBlLCBvYmosIGNhbGxiYWNrKQogICAgICAvLyBwb3AgdGhlIGNhbGxiYWNrIG9mZiB0aGUgYXJncyBsaXN0CiAgICAgIGlmKGFyZ3MubGVuZ3RoID09PSAzKXsKICAgICAgICBjYWxsYmFjayA9IGFyZ3MucG9wKCk7CiAgICAgIH0KCiAgICAgIC8vIGNvbnZlcnQgc2hhcGUgKHRoZSBmaXJzdCBhcmcpIHRvIGEgYmJveCBpZiBpdHMgZ2VvanNvbgogICAgICBpZihhcmdzICYmIGFyZ3NbMF0gJiYgYXJnc1swXS50eXBlKXsKICAgICAgICB2YXIgYiA9IFRlcnJhZm9ybWVyLlRvb2xzLmNhbGN1bGF0ZUJvdW5kcyhhcmdzWzBdKTsKICAgICAgICBhcmdzWzBdID0gewogICAgICAgICAgeDogYlswXSwKICAgICAgICAgIHk6IGJbMV0sCiAgICAgICAgICB3OiBNYXRoLmFicyhiWzBdIC0gYlsyXSksCiAgICAgICAgICBoOiBNYXRoLmFicyhiWzFdIC0gYlszXSkKICAgICAgICB9OwogICAgICB9CgogICAgICAvLyBwdXNoIGEgbmV3IHJvb3Qgbm9kZSBvbnRvIHRoZSBhcmdzIHN0YWNrCiAgICAgIGFyZ3MucHVzaChfVCk7CgogICAgICBpZihvYmogPT09IGZhbHNlKSB7IC8vIERvIGFyZWEtd2lkZSBkZWxldGUKICAgICAgICB2YXIgbnVtYmVyZGVsZXRlZCA9IDA7CiAgICAgICAgdmFyIHJldF9hcnJheSA9IFtdOwogICAgICAgIGRvIHsKICAgICAgICAgIG51bWJlcmRlbGV0ZWQgPSByZXRfYXJyYXkubGVuZ3RoOwogICAgICAgICAgcmV0X2FycmF5ID0gcmV0X2FycmF5LmNvbmNhdChfcmVtb3ZlX3N1YnRyZWUuYXBwbHkodGhpcywgYXJncykpOwogICAgICAgIH0gd2hpbGUoIG51bWJlcmRlbGV0ZWQgIT09ICByZXRfYXJyYXkubGVuZ3RoKTsKICAgICAgICBpZihjYWxsYmFjayl7CiAgICAgICAgICBjYWxsYmFjayhudWxsLCByZXRfYXJyYXkpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsgLy8gRGVsZXRlIGEgc3BlY2lmaWMgaXRlbQogICAgICAgIHZhciByZW1vdmFsID0gX3JlbW92ZV9zdWJ0cmVlLmFwcGx5KHRoaXMsIGFyZ3MpOwogICAgICAgIGlmKGNhbGxiYWNrKXsKICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHJlbW92YWwpOwogICAgICAgIH0KICAgICAgfQogICAgfTsKCiAgIC8qIG5vbi1yZWN1cnNpdmUgaW5zZXJ0IGZ1bmN0aW9uCiAgICAqIFtdID0gUlRyZWUuaW5zZXJ0KHJlY3RhbmdsZSwgb2JqZWN0IHRvIGluc2VydCkKICAgICovCiAgICB0aGlzLmluc2VydCA9IGZ1bmN0aW9uKHNoYXBlLCBvYmosIGNhbGxiYWNrKSB7CiAgICAgIHZhciByZWN0OwogICAgICBpZihzaGFwZS50eXBlKXsKICAgICAgICB2YXIgYiA9IFRlcnJhZm9ybWVyLlRvb2xzLmNhbGN1bGF0ZUJvdW5kcyhzaGFwZSk7CiAgICAgICAgcmVjdCA9IHsKICAgICAgICAgIHg6IGJbMF0sCiAgICAgICAgICB5OiBiWzFdLAogICAgICAgICAgdzogTWF0aC5hYnMoYlswXSAtIGJbMl0pLAogICAgICAgICAgaDogTWF0aC5hYnMoYlsxXSAtIGJbM10pCiAgICAgICAgfTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZWN0ID0gc2hhcGU7CiAgICAgIH0KCiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgewogICAgICAgIHRocm93ICJXcm9uZyBudW1iZXIgb2YgYXJndW1lbnRzLiBSVC5JbnNlcnQgcmVxdWlyZXMgYXQgbGVhc3QgYSBib3VuZGluZyByZWN0YW5nbGUgb3IgR2VvSlNPTiBhbmQgYW4gb2JqZWN0LiI7CiAgICAgIH0KCiAgICAgIHZhciBpbnNlcnQgPSBfaW5zZXJ0X3N1YnRyZWUoewogICAgICAgIHg6IHJlY3QueCwKICAgICAgICB5OiByZWN0LnksCiAgICAgICAgdzogcmVjdC53LAogICAgICAgIGg6IHJlY3QuaCwKICAgICAgICBsZWFmOiBvYmoKICAgICAgfSwgX1QpOwoKICAgICAgaWYoY2FsbGJhY2spewogICAgICAgIGNhbGxiYWNrKG51bGwsIGluc2VydCk7CiAgICAgIH0KICAgIH07CgogICAvKiBub24tcmVjdXJzaXZlIGRlbGV0ZSBmdW5jdGlvbgogICAgKiBbZGVsZXRlZCBvYmplY3RdID0gUlRyZWUucmVtb3ZlKHJlY3RhbmdsZSwgW29iamVjdCB0byBkZWxldGVdKQogICAgKi8KCiAgICAvL0VuZCBvZiBSVHJlZQogIH07CgovKiBSZWN0YW5nbGUgLSBHZW5lcmljIHJlY3RhbmdsZSBvYmplY3QgLSBOb3QgeWV0IHVzZWQgKi8KUlRyZWUuUmVjdGFuZ2xlID0gZnVuY3Rpb24oaXgsIGl5LCBpdywgaWgpIHsgLy8gbmV3IFJlY3RhbmdsZShib3VuZHMpIG9yIG5ldyBSZWN0YW5nbGUoeCwgeSwgdywgaCkKICB2YXIgeCwgeDIsIHksIHkyLCB3LCBoOwoKICBpZiAoaXgueCkgewogICAgeCA9IGl4Lng7CiAgICB5ID0gaXgueTsKICAgIGlmIChpeC53ICE9PSAwICYmICFpeC53ICYmIGl4LngyKSB7CiAgICAgIHcgPSBpeC54MiAtIGl4Lng7CiAgICAgIGggPSBpeC55MiAtIGl4Lnk7CiAgICB9IGVsc2UgewogICAgICB3ID0gaXgudzsKICAgICAgaCA9IGl4Lmg7CiAgICB9CiAgICB4MiA9IHggKyB3OwogICAgeTIgPSB5ICsgaDsgLy8gRm9yIGV4dHJhIGZhc3RpdHVkZQogIH0gZWxzZSB7CiAgICB4ID0gaXg7CiAgICB5ID0gaXk7CiAgICB3ID0gaXc7CiAgICBoID0gaWg7CiAgICB4MiA9IHggKyB3OwogICAgeTIgPSB5ICsgaDsgLy8gRm9yIGV4dHJhIGZhc3RpdHVkZQogIH0KCiAgdGhpcy54MSA9IHRoaXMueCA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHg7CiAgfTsKICB0aGlzLnkxID0gdGhpcy55ID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4geTsKICB9OwogIHRoaXMueDIgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiB4MjsKICB9OwogIHRoaXMueTIgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiB5MjsKICB9OwogIHRoaXMudyA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHc7CiAgfTsKICB0aGlzLmggPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBoOwogIH07CgogIHRoaXMudG9KU09OID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gKCd7IngiOicgKyB4LnRvU3RyaW5nKCkgKyAnLCAieSI6JyArIHkudG9TdHJpbmcoKSArICcsICJ3IjonICsgdy50b1N0cmluZygpICsgJywgImgiOicgKyBoLnRvU3RyaW5nKCkgKyAnfScpOwogIH07CgogIHRoaXMub3ZlcmxhcCA9IGZ1bmN0aW9uKGEpIHsKICAgIHJldHVybiAodGhpcy54KCkgPCBhLngyKCkgJiYgdGhpcy54MigpID4gYS54KCkgJiYgdGhpcy55KCkgPCBhLnkyKCkgJiYgdGhpcy55MigpID4gYS55KCkpOwogIH07CgogIHRoaXMuZXhwYW5kID0gZnVuY3Rpb24oYSkgewogICAgdmFyIG54ID0gTWF0aC5taW4odGhpcy54KCksIGEueCgpKTsKICAgIHZhciBueSA9IE1hdGgubWluKHRoaXMueSgpLCBhLnkoKSk7CiAgICB3ID0gTWF0aC5tYXgodGhpcy54MigpLCBhLngyKCkpIC0gbng7CiAgICBoID0gTWF0aC5tYXgodGhpcy55MigpLCBhLnkyKCkpIC0gbnk7CiAgICB4ID0gbng7CiAgICB5ID0gbnk7CiAgICByZXR1cm4gKHRoaXMpOwogIH07CgogIHRoaXMuc2V0UmVjdCA9IGZ1bmN0aW9uKGl4LCBpeSwgaXcsIGloKSB7CiAgICB2YXIgeCwgeDIsIHksIHkyLCB3LCBoOwogICAgaWYgKGl4LngpIHsKICAgICAgeCA9IGl4Lng7CiAgICAgIHkgPSBpeC55OwogICAgICBpZiAoaXgudyAhPT0gMCAmJiAhaXgudyAmJiBpeC54MikgewogICAgICAgIHcgPSBpeC54MiAtIGl4Lng7CiAgICAgICAgaCA9IGl4LnkyIC0gaXgueTsKICAgICAgfSBlbHNlIHsKICAgICAgICB3ID0gaXgudzsKICAgICAgICBoID0gaXguaDsKICAgICAgfQogICAgICB4MiA9IHggKyB3OwogICAgICB5MiA9IHkgKyBoOyAvLyBGb3IgZXh0cmEgZmFzdGl0dWRlCiAgICB9IGVsc2UgewogICAgICB4ID0gaXg7CiAgICAgIHkgPSBpeTsKICAgICAgdyA9IGl3OwogICAgICBoID0gaWg7CiAgICAgIHgyID0geCArIHc7CiAgICAgIHkyID0geSArIGg7IC8vIEZvciBleHRyYSBmYXN0aXR1ZGUKICAgIH0KICB9OwogIC8vRW5kIG9mIFJUcmVlLlJlY3RhbmdsZQp9OwoKLyogcmV0dXJucyB0cnVlIGlmIHJlY3RhbmdsZSAxIG92ZXJsYXBzIHJlY3RhbmdsZSAyCiAqIFsgYm9vbGVhbiBdID0gb3ZlcmxhcF9yZWN0YW5nbGUocmVjdGFuZ2xlIGEsIHJlY3RhbmdsZSBiKQogKiBAc3RhdGljIGZ1bmN0aW9uCiAqLwpSVHJlZS5SZWN0YW5nbGUub3ZlcmxhcF9yZWN0YW5nbGUgPSBmdW5jdGlvbihhLCBiKSB7CiAgcmV0dXJuIChhLnggPCAoYi54ICsgYi53KSAmJiAoYS54ICsgYS53KSA+IGIueCAmJiBhLnkgPCAoYi55ICsgYi5oKSAmJiAoYS55ICsgYS5oKSA+IGIueSk7Cn07CgovKiByZXR1cm5zIHRydWUgaWYgcmVjdGFuZ2xlIGEgaXMgY29udGFpbmVkIGluIHJlY3RhbmdsZSBiCiAqIFsgYm9vbGVhbiBdID0gY29udGFpbnNfcmVjdGFuZ2xlKHJlY3RhbmdsZSBhLCByZWN0YW5nbGUgYikKICogQHN0YXRpYyBmdW5jdGlvbgogKi8KUlRyZWUuUmVjdGFuZ2xlLmNvbnRhaW5zX3JlY3RhbmdsZSA9IGZ1bmN0aW9uKGEsIGIpIHsKICByZXR1cm4gKChhLnggKyBhLncpIDw9IChiLnggKyBiLncpICYmIGEueCA+PSBiLnggJiYgKGEueSArIGEuaCkgPD0gKGIueSArIGIuaCkgJiYgYS55ID49IGIueSk7Cn07CgovKiBleHBhbmRzIHJlY3RhbmdsZSBBIHRvIGluY2x1ZGUgcmVjdGFuZ2xlIEIsIHJlY3RhbmdsZSBCIGlzIHVudG91Y2hlZAogKiBbIHJlY3RhbmdsZSBhIF0gPSBleHBhbmRfcmVjdGFuZ2xlKHJlY3RhbmdsZSBhLCByZWN0YW5nbGUgYikKICogQHN0YXRpYyBmdW5jdGlvbgogKi8KUlRyZWUuUmVjdGFuZ2xlLmV4cGFuZF9yZWN0YW5nbGUgPSBmdW5jdGlvbihhLCBiKSB7CiAgdmFyIG54LCBueTsKCiAgLy8gdW5pbnR1aXRpdmVseSwgdGhpcyBpcyB3YXkgd2F5IGZhc3RlciB0aGFuIG1heC9taW4KICBpZiAoYS54IDwgYi54KSB7CiAgICBueCA9IGEueDsKICB9IGVsc2UgewogICAgbnggPSBiLng7CiAgfQoKICBpZiAoYS55IDwgYi55KSB7CiAgICBueSA9IGEueTsKICB9IGVsc2UgewogICAgbnkgPSBiLnk7CiAgfQoKICBpZiAoYS54ICsgYS53ID4gYi54ICsgYi53KSB7CiAgICBhLncgPSAoYS54ICsgYS53KSAtIG54OwogIH0gZWxzZSB7CiAgICBhLncgPSAoYi54ICsgYi53KSAtIG54OwogIH0KCiAgaWYgKGEueSArIGEuaCA+IGIueSArIGIuaCkgewogICAgYS5oID0gKGEueSArIGEuaCkgLSBueTsKICB9IGVsc2UgewogICAgYS5oID0gKGIueSArIGIuaCkgLSBueTsKICB9CgogIGEueCA9IG54OwogIGEueSA9IG55OwoKICByZXR1cm4gKGEpOwp9OwoKLyogZ2VuZXJhdGVzIGEgbWluaW1hbGx5IGJvdW5kaW5nIHJlY3RhbmdsZSBmb3IgYWxsIHJlY3RhbmdsZXMgaW4KICogYXJyYXkgIm5vZGVzIi4gSWYgcmVjdCBpcyBzZXQsIGl0IGlzIG1vZGlmaWVkIGludG8gdGhlIE1CUi4gT3RoZXJ3aXNlLAogKiBhIG5ldyByZWN0YW5nbGUgaXMgZ2VuZXJhdGVkIGFuZCByZXR1cm5lZC4KICogWyByZWN0YW5nbGUgYSBdID0gbWFrZV9NQlIocmVjdGFuZ2xlIGFycmF5IG5vZGVzLCByZWN0YW5nbGUgcmVjdCkKICogQHN0YXRpYyBmdW5jdGlvbgogKi8KUlRyZWUuUmVjdGFuZ2xlLm1ha2VfTUJSID0gZnVuY3Rpb24obm9kZXMsIHJlY3QpIHsKICBpZiAobm9kZXMubGVuZ3RoIDwgMSkgewogICAgcmV0dXJuICh7CiAgICAgIHg6IDAsCiAgICAgIHk6IDAsCiAgICAgIHc6IDAsCiAgICAgIGg6IDAKICAgIH0pOwogIH0KICAvL3Rocm93ICJtYWtlX01CUjogbm9kZXMgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSByZWN0YW5nbGUhIjsKICBpZiAoIXJlY3QpIHsKICAgIHJlY3QgPSB7CiAgICAgIHg6IG5vZGVzWzBdLngsCiAgICAgIHk6IG5vZGVzWzBdLnksCiAgICAgIHc6IG5vZGVzWzBdLncsCiAgICAgIGg6IG5vZGVzWzBdLmgKICAgIH07CiAgfSBlbHNlIHsKICAgIHJlY3QueCA9IG5vZGVzWzBdLng7CiAgICByZWN0LnkgPSBub2Rlc1swXS55OwogICAgcmVjdC53ID0gbm9kZXNbMF0udzsKICAgIHJlY3QuaCA9IG5vZGVzWzBdLmg7CiAgfQoKICBmb3IgKHZhciBpID0gbm9kZXMubGVuZ3RoIC0gMTsgaSA+IDA7IGktLSkgewogICAgUlRyZWUuUmVjdGFuZ2xlLmV4cGFuZF9yZWN0YW5nbGUocmVjdCwgbm9kZXNbaV0pOwogIH0KCiAgcmV0dXJuIChyZWN0KTsKfTsKCgogIGV4cG9ydHMuUlRyZWUgPSBSVHJlZTsKCiAgcmV0dXJuIGV4cG9ydHM7Cn0pKTsKLyogZ2xvYmFscyBMICovCgpMLmVzcmkgPSB7CiAgX2NhbGxiYWNrOiB7fQp9OwoKLy8gTmFtZXNwYWNlIGZvciB2YXJpb3VzIHN1cHBvcnQgdmFyaWFibGVzIHdlIG5lZWQgdG8gdHJhY2sKTC5lc3JpLlN1cHBvcnQgPSB7CiAgLy8gZnJvbTogaHR0cHM6Ly9naXRodWIuY29tL01vZGVybml6ci9Nb2Rlcm5penIvYmxvYi9tYXN0ZXIvZmVhdHVyZS1kZXRlY3RzL2NvcnMuanMjTDIwCiAgQ09SUzogISEod2luZG93LlhNTEh0dHBSZXF1ZXN0ICYmICd3aXRoQ3JlZGVudGlhbHMnIGluIG5ldyBYTUxIdHRwUmVxdWVzdCgpKQp9OwoKLy8gQUpBWCBoYW5kbGVycyBmb3IgQ09SUyAobW9kZXJuIGJyb3dzZXJzKSBvciBKU09OUCAob2xkZXIgYnJvd3NlcnMpCkwuZXNyaS5SZXF1ZXN0SGFuZGxlcnMgPSB7CiAgQ09SUzogZnVuY3Rpb24odXJsLCBwYXJhbXMsIGNhbGxiYWNrLCBjb250ZXh0KXsKICAgIHZhciBodHRwUmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwoKICAgIHBhcmFtcy5mPSJqc29uIjsKCiAgICBodHRwUmVxdWVzdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpewogICAgICB2YXIgcmVzcG9uc2U7CiAgICAgIGlmIChodHRwUmVxdWVzdC5yZWFkeVN0YXRlID09PSA0KSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHJlc3BvbnNlID0gSlNPTi5wYXJzZShodHRwUmVxdWVzdC5yZXNwb25zZVRleHQpOwogICAgICAgIH0gY2F0Y2goZSkgewogICAgICAgICAgcmVzcG9uc2UgPSB7CiAgICAgICAgICAgIGVycm9yOiAiQ291bGQgbm90IHBhcnNlIHJlc3BvbnNlIGFzIEpTT04uIgogICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgaWYoY29udGV4dCl7CiAgICAgICAgICBjYWxsYmFjay5jYWxsKGNvbnRleHQsIHJlc3BvbnNlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY2FsbGJhY2socmVzcG9uc2UpOwogICAgICAgIH0KICAgICAgfQogICAgfTsKCiAgICBodHRwUmVxdWVzdC5vcGVuKCdHRVQnLCB1cmwgKyBMLmVzcmkuVXRpbC5zZXJpYWxpemUocGFyYW1zKSwgdHJ1ZSk7CiAgICBodHRwUmVxdWVzdC5zZW5kKG51bGwpOwogIH0sCiAgSlNPTlA6IGZ1bmN0aW9uKHVybCwgcGFyYW1zLCBjYWxsYmFjaywgY29udGV4dCl7CiAgICB2YXIgY2FsbGJhY2tJZCA9ICJjIisoTWF0aC5yYW5kb20oKSAqIDFlOSkudG9TdHJpbmcoMzYpLnJlcGxhY2UoIi4iLCAiXyIpOwoKICAgIHBhcmFtcy5mPSJqc29uIjsKICAgIHBhcmFtcy5jYWxsYmFjaz0iTC5lc3JpLl9jYWxsYmFjay4iK2NhbGxiYWNrSWQ7CgogICAgdmFyIHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpOwogICAgc2NyaXB0LnR5cGUgPSAndGV4dC9qYXZhc2NyaXB0JzsKICAgIHNjcmlwdC5zcmMgPSB1cmwgKyBMLmVzcmkuVXRpbC5zZXJpYWxpemUocGFyYW1zKTsKICAgIHNjcmlwdC5pZCA9IGNhbGxiYWNrSWQ7CgogICAgTC5lc3JpLl9jYWxsYmFja1tjYWxsYmFja0lkXSA9IGZ1bmN0aW9uKHJlc3BvbnNlKXsKICAgICAgaWYoY29udGV4dCl7CiAgICAgICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCByZXNwb25zZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY2FsbGJhY2socmVzcG9uc2UpOwogICAgICB9CiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoc2NyaXB0KTsKICAgICAgZGVsZXRlIEwuZXNyaS5fY2FsbGJhY2tbY2FsbGJhY2tJZF07CiAgICB9OwoKICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoc2NyaXB0KTsKICB9Cn07CgovLyBDaG9vc2UgdGhlIGNvcnJlY3QgQUpBWCBoYW5kbGVyIGRlcGVuZGluZyBvbiBDT1JTIHN1cHBvcnQKTC5lc3JpLmdldCA9IChMLmVzcmkuU3VwcG9ydC5DT1JTKSA/IEwuZXNyaS5SZXF1ZXN0SGFuZGxlcnMuQ09SUyA6IEwuZXNyaS5SZXF1ZXN0SGFuZGxlcnMuSlNPTlA7CgovLyBHZW5lcmFsIHV0aWxpdHkgbmFtZXNwYWNlCkwuZXNyaS5VdGlsID0gewogIC8vIG1ha2UgaXQgc28gdGhhdCBwYXNzZWQgYGZ1bmN0aW9uYCBuZXZlciBnZXRzIGNhbGxlZAogIC8vIHR3aWNlIHdpdGhpbiBgZGVsYXlgIG1pbGxpc2Vjb25kcy4gVXNlZCB0byB0aHJvdHRsZQogIC8vIGBtb3ZlYCBldmVudHMgb24gdGhlIGxheWVyLgogIC8vIGh0dHA6Ly9yZW15c2hhcnAuY29tLzIwMTAvMDcvMjEvdGhyb3R0bGluZy1mdW5jdGlvbi1jYWxscy8KICBkZWJvdW5jZTogZnVuY3Rpb24gKGZuLCBkZWxheSwgY29udGV4dCkgewogICAgdmFyIHRpbWVyID0gbnVsbDsKICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgdmFyIGNvbnRleHQgPSB0aGlzfHxjb250ZXh0LCBhcmdzID0gYXJndW1lbnRzOwogICAgICBjbGVhclRpbWVvdXQodGltZXIpOwogICAgICB0aW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgIGZuLmFwcGx5KGNvbnRleHQsIGFyZ3MpOwogICAgICB9LCBkZWxheSk7CiAgICB9OwogIH0sCiAgLy8gcm91bmQgYSBudW1iZXIgYXdheSBmcm9tIHplcm8gdXNlZCB0byBzbmFwCiAgLy8gcm93L2NvbHVtbnMgYXdheSBmcm9tIHRoZSBvcmlnaW4gb2YgdGhlIGdyaWQKICByb3VuZEF3YXlGcm9tWmVybzogZnVuY3Rpb24gKG51bSl7CiAgICByZXR1cm4gKG51bSA+IDApID8gTWF0aC5jZWlsKG51bSkgOiBNYXRoLmZsb29yKG51bSk7CiAgfSwKICB0cmltOiBmdW5jdGlvbihzdHIpIHsKICAgIHJldHVybiBzdHIucmVwbGFjZSgvXlxzXHMqLywgJycpLnJlcGxhY2UoL1xzXHMqJC8sICcnKTsKICB9LAogIGNsZWFuVXJsOiBmdW5jdGlvbih1cmwpewogICAgdXJsID0gTC5lc3JpLlV0aWwudHJpbSh1cmwpOwoKICAgIC8vYWRkIGEgdHJhaWxpbmcgc2xhc2ggdG8gdGhlIHVybCBpZiB0aGUgdXNlciBvbWl0dGVkIGl0CiAgICBpZih1cmxbdXJsLmxlbmd0aC0xXSAhPT0gIi8iKXsKICAgICAgdXJsICs9ICIvIjsKICAgIH0KCiAgICByZXR1cm4gdXJsOwogIH0sCiAgLy8gcXVpY2sgYW5kIGRpcnR5IHNlcmlhbGl6YXRpb24KICBzZXJpYWxpemU6IGZ1bmN0aW9uKHBhcmFtcyl7CiAgICB2YXIgcXM9Ij8iOwoKICAgIGZvcih2YXIgcGFyYW0gaW4gcGFyYW1zKXsKICAgICAgaWYocGFyYW1zLmhhc093blByb3BlcnR5KHBhcmFtKSl7CiAgICAgICAgdmFyIGtleSA9IHBhcmFtOwogICAgICAgIHZhciB2YWx1ZSA9IHBhcmFtc1twYXJhbV07CiAgICAgICAgcXMrPWVuY29kZVVSSUNvbXBvbmVudChrZXkpOwogICAgICAgIHFzKz0iPSI7CiAgICAgICAgcXMrPWVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSk7CiAgICAgICAgcXMrPSImIjsKICAgICAgfQogICAgfQoKICAgIHJldHVybiBxcy5zdWJzdHJpbmcoMCwgcXMubGVuZ3RoIC0gMSk7CiAgfSwKCiAgLy8gaW5kZXggb2YgcG9seWZpbGwsIG5lZWRlZCBmb3IgSUUgOAogIGluZGV4T2Y6IGZ1bmN0aW9uKGFyciwgb2JqLCBzdGFydCl7CiAgICBzdGFydCA9IHN0YXJ0IHx8IDA7CiAgICBpZihhcnIuaW5kZXhPZil7CiAgICAgIHJldHVybiBhcnIuaW5kZXhPZihvYmosIHN0YXJ0KTsKICAgIH0KICAgIGZvciAodmFyIGkgPSBzdGFydCwgaiA9IGFyci5sZW5ndGg7IGkgPCBqOyBpKyspIHsKICAgICAgaWYgKGFycltpXSA9PT0gb2JqKSB7IHJldHVybiBpOyB9CiAgICB9CiAgICByZXR1cm4gLTE7CiAgfSwKCiAgLy8gY29udmVydCBhbiBleHRlbnQgKEFyY0dJUykgdG8gTGF0TG5nQm91bmRzIChMZWFmbGV0KQogIGV4dGVudFRvQm91bmRzOiBmdW5jdGlvbihleHRlbnQpewogICAgdmFyIHNvdXRoV2VzdCA9IG5ldyBMLkxhdExuZyhleHRlbnQueW1pbiwgZXh0ZW50LnhtaW4pOwogICAgdmFyIG5vcnRoRWFzdCA9IG5ldyBMLkxhdExuZyhleHRlbnQueW1heCwgZXh0ZW50LnhtYXgpOwogICAgcmV0dXJuIG5ldyBMLkxhdExuZ0JvdW5kcyhzb3V0aFdlc3QsIG5vcnRoRWFzdCk7CiAgfSwKCiAgLy8gY29udmVydCBhbiBMYXRMbmdCb3VuZHMgKExlYWZsZXQpIHRvIGV4dGVudCAoQXJjR0lTKQogIGJvdW5kc1RvRXh0ZW50OiBmdW5jdGlvbihib3VuZHMpIHsKICAgIHJldHVybiB7CiAgICAgICJ4bWluIjogYm91bmRzLmdldFNvdXRoV2VzdCgpLmxuZywKICAgICAgInltaW4iOiBib3VuZHMuZ2V0U291dGhXZXN0KCkubGF0LAogICAgICAieG1heCI6IGJvdW5kcy5nZXROb3J0aEVhc3QoKS5sbmcsCiAgICAgICJ5bWF4IjogYm91bmRzLmdldE5vcnRoRWFzdCgpLmxhdCwKICAgICAgInNwYXRpYWxSZWZlcmVuY2UiOiB7CiAgICAgICAgIndraWQiIDogNDMyNgogICAgICB9CiAgICB9OwogIH0sCgogIC8vIGNvbnZlcnQgYSBMYXRMbmdCb3VuZHMgKExlYWZsZXQpIHRvIGEgRW52ZWxvcGUgKFRlcnJhZm9ybWVyLlJ0cmVlKQogIGJvdW5kc1RvRW52ZWxvcGU6IGZ1bmN0aW9uKGJvdW5kcyl7CiAgICB2YXIgZXh0ZW50ID0gTC5lc3JpLlV0aWwuYm91bmRzVG9FeHRlbnQoYm91bmRzKTsKICAgIHJldHVybiB7CiAgICAgIHg6IGV4dGVudC54bWluLAogICAgICB5OiBleHRlbnQueW1pbiwKICAgICAgdzogTWF0aC5hYnMoZXh0ZW50LnhtaW4gLSBleHRlbnQueG1heCksCiAgICAgIGg6IE1hdGguYWJzKGV4dGVudC55bWluIC0gZXh0ZW50LnltYXgpCiAgICB9OwogIH0KfTsKCkwuZXNyaS5NaXhpbnMgPSB7fTsKCkwuZXNyaS5NaXhpbnMuZmVhdHVyZUdyaWQgPSB7CiAgX2FjdGl2ZVJlcXVlc3RzOiAwLAogIF9pbml0aWFsaXplRmVhdHVyZUdyaWQ6IGZ1bmN0aW9uKG1hcCl7CiAgICB0aGlzLl9tYXAgPSBtYXA7CiAgICB0aGlzLl9wcmV2aW91c0NlbGxzID0gW107CiAgICB0aGlzLmNlbnRlciA9IHRoaXMuX21hcC5nZXRDZW50ZXIoKTsKICAgIHRoaXMub3JpZ2luID0gdGhpcy5fbWFwLnByb2plY3QodGhpcy5jZW50ZXIpOwoKICAgIHRoaXMuX21vdmVIYW5kbGVyID0gTC5lc3JpLlV0aWwuZGVib3VuY2UoZnVuY3Rpb24oZSl7CiAgICAgIGlmKGUudHlwZSA9PT0gInpvb21lbmQiKXsKICAgICAgICB0aGlzLm9yaWdpbiA9IHRoaXMuX21hcC5wcm9qZWN0KHRoaXMuY2VudGVyKTsKICAgICAgICB0aGlzLl9wcmV2aW91c0NlbGxzID0gW107CiAgICAgIH0KICAgICAgdGhpcy5fcmVxdWVzdEZlYXR1cmVzKGUudGFyZ2V0LmdldEJvdW5kcygpKTsKICAgIH0sIHRoaXMub3B0aW9ucy5kZWJvdW5jZSwgdGhpcyk7CgogICAgbWFwLm9uKCJ6b29tZW5kIHJlc2l6ZSBtb3ZlIiwgdGhpcy5fbW92ZUhhbmRsZXIsIHRoaXMpOwoKICAgIHRoaXMuX3JlcXVlc3RGZWF0dXJlcyhtYXAuZ2V0Qm91bmRzKCkpOwogIH0sCiAgX2Rlc3Ryb3lGZWF0dXJlR3JpZDogZnVuY3Rpb24obWFwKXsKICAgIG1hcC5vZmYoInpvb21lbmQgcmVzaXplIG1vdmUiLCB0aGlzLl9tb3ZlSGFuZGxlciwgdGhpcyk7CiAgfSwKICBfcmVxdWVzdEZlYXR1cmVzOiBmdW5jdGlvbihib3VuZHMpewogICAgdmFyIGNlbGxzID0gdGhpcy5fY2VsbHNXaXRoaW4oYm91bmRzKTsKCiAgICBpZihjZWxscykgewogICAgICB0aGlzLmZpcmUoImxvYWRpbmciLCB7IGJvdW5kczogYm91bmRzIH0pOwogICAgfQoKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2VsbHMubGVuZ3RoOyBpKyspIHsKICAgICAgdGhpcy5fbWFrZVJlcXVlc3QoY2VsbHNbaV0sIGNlbGxzLCBib3VuZHMpOwogICAgfQogIH0sCiAgX21ha2VSZXF1ZXN0OiBmdW5jdGlvbihjZWxsLCBjZWxscywgYm91bmRzKXsKICAgIHRoaXMuX2FjdGl2ZVJlcXVlc3RzKys7CgogICAgTC5lc3JpLmdldCh0aGlzLnVybCsicXVlcnkiLCB7CiAgICAgIGdlb21ldHJ5VHlwZTogImVzcmlHZW9tZXRyeUVudmVsb3BlIiwKICAgICAgZ2VvbWV0cnk6IEpTT04uc3RyaW5naWZ5KEwuZXNyaS5VdGlsLmJvdW5kc1RvRXh0ZW50KGNlbGwuYm91bmRzKSksCiAgICAgIG91dEZpZWxkczoiKiIsCiAgICAgIG91dFNyOiA0MzI2CiAgICB9LCBmdW5jdGlvbihyZXNwb25zZSl7CgogICAgICAvL2RlaW5jcmltZW50IHRoZSByZXF1ZXN0IGNvdW50ZXIKICAgICAgdGhpcy5fYWN0aXZlUmVxdWVzdHMtLTsKCiAgICAgIC8vIGlmIHRoZXJlIGFyZSBubyBtb3JlIGFjdGl2ZSByZXF1ZXN0cyBmaXJlIGEgbG9hZCBldmVudCBmb3IgdGhpcyB2aWV3CiAgICAgIGlmKHRoaXMuX2FjdGl2ZVJlcXVlc3RzIDw9IDApewogICAgICAgIHRoaXMuZmlyZSgibG9hZCIsIHsKICAgICAgICAgIGJvdW5kczogYm91bmRzLAogICAgICAgICAgY2VsbHM6IGNlbGxzCiAgICAgICAgfSk7CiAgICAgIH0KCiAgICAgIC8vIGNhbGwgdGhlIHJlbmRlciBtZXRob2QgdG8gcmVuZGVyIGZlYXR1cmVzCiAgICAgIHRoaXMuX3JlbmRlcihyZXNwb25zZSk7CiAgICB9LCB0aGlzKTsKICB9LAogIF9jZWxsc1dpdGhpbjogZnVuY3Rpb24obWFwQm91bmRzKXsKICAgIHZhciBzaXplID0gdGhpcy5fbWFwLmdldFNpemUoKTsKICAgIHZhciBvZmZzZXQgPSB0aGlzLl9tYXAucHJvamVjdCh0aGlzLl9tYXAuZ2V0Q2VudGVyKCkpOwogICAgdmFyIHBhZGRpbmcgPSBNYXRoLm1pbih0aGlzLm9wdGlvbnMuY2VsbFNpemUvc2l6ZS54LCB0aGlzLm9wdGlvbnMuY2VsbFNpemUvc2l6ZS55KTsKICAgIHZhciBib3VuZHMgPSBtYXBCb3VuZHMucGFkKDAuMSk7CiAgICB2YXIgY2VsbHMgPSBbXTsKCiAgICB2YXIgdG9wTGVmdFBvaW50ID0gdGhpcy5fbWFwLnByb2plY3QoYm91bmRzLmdldE5vcnRoV2VzdCgpKTsKICAgIHZhciBib3R0b21SaWdodFBvaW50ID0gdGhpcy5fbWFwLnByb2plY3QoYm91bmRzLmdldFNvdXRoRWFzdCgpKTsKCiAgICB2YXIgdG9wTGVmdCA9IHRvcExlZnRQb2ludC5zdWJ0cmFjdChvZmZzZXQpLmRpdmlkZUJ5KHRoaXMub3B0aW9ucy5jZWxsU2l6ZSk7CiAgICB2YXIgYm90dG9tUmlnaHQgPSBib3R0b21SaWdodFBvaW50LnN1YnRyYWN0KG9mZnNldCkuZGl2aWRlQnkodGhpcy5vcHRpb25zLmNlbGxTaXplKTsKCiAgICB2YXIgb2Zmc2V0Um93cyA9IE1hdGgucm91bmQoKHRoaXMub3JpZ2luLnggLSBvZmZzZXQueCkgLyB0aGlzLm9wdGlvbnMuY2VsbFNpemUpOwogICAgdmFyIG9mZnNldENvbHMgPSBNYXRoLnJvdW5kKCh0aGlzLm9yaWdpbi55IC0gb2Zmc2V0LnkpIC8gdGhpcy5vcHRpb25zLmNlbGxTaXplKTsKCiAgICB2YXIgbWluUm93ID0gTC5lc3JpLlV0aWwucm91bmRBd2F5RnJvbVplcm8odG9wTGVmdC54KS1vZmZzZXRSb3dzOwogICAgdmFyIG1heFJvdyA9IEwuZXNyaS5VdGlsLnJvdW5kQXdheUZyb21aZXJvKGJvdHRvbVJpZ2h0LngpLW9mZnNldFJvd3M7CiAgICB2YXIgbWluQ29sID0gTC5lc3JpLlV0aWwucm91bmRBd2F5RnJvbVplcm8odG9wTGVmdC55KS1vZmZzZXRDb2xzOwogICAgdmFyIG1heENvbCA9IEwuZXNyaS5VdGlsLnJvdW5kQXdheUZyb21aZXJvKGJvdHRvbVJpZ2h0LnkpLW9mZnNldENvbHM7CgogICAgZm9yICh2YXIgcm93ID0gbWluUm93OyByb3cgPCBtYXhSb3c7IHJvdysrKSB7CiAgICAgIGZvciAodmFyIGNvbCA9IG1pbkNvbDsgY29sIDwgbWF4Q29sOyBjb2wrKykgewogICAgICAgIHZhciBjZWxsSWQgPSAiY2VsbDoiK3JvdysiOiIrY29sOwogICAgICAgIHZhciBkdXBsaWNhdGUgPSBMLmVzcmkuVXRpbC5pbmRleE9mKHRoaXMuX3ByZXZpb3VzQ2VsbHMsIGNlbGxJZCkgPj0gMDsKCiAgICAgICAgaWYoIWR1cGxpY2F0ZSB8fCAhdGhpcy5vcHRpb25zLmRlZHVwbGljYXRlKXsKICAgICAgICAgIHZhciBjZWxsQm91bmRzID0gdGhpcy5fY2VsbEV4dGVudChyb3csIGNvbCk7CiAgICAgICAgICB2YXIgY2VsbENlbnRlciA9IGNlbGxCb3VuZHMuZ2V0Q2VudGVyKCk7CiAgICAgICAgICB2YXIgcmFkaXVzID0gY2VsbENlbnRlci5kaXN0YW5jZVRvKGNlbGxCb3VuZHMuZ2V0Tm9ydGhXZXN0KCkpOwogICAgICAgICAgdmFyIGRpc3RhbmNlID0gY2VsbENlbnRlci5kaXN0YW5jZVRvKHRoaXMuY2VudGVyKTsKICAgICAgICAgIHZhciBjZWxsID0gewogICAgICAgICAgICByb3c6IHJvdywKICAgICAgICAgICAgY29sOiBjb2wsCiAgICAgICAgICAgIGlkOiBjZWxsSWQsCiAgICAgICAgICAgIGNlbnRlcjogY2VsbENlbnRlciwKICAgICAgICAgICAgYm91bmRzOiBjZWxsQm91bmRzLAogICAgICAgICAgICBkaXN0YW5jZTpkaXN0YW5jZSwKICAgICAgICAgICAgcmFkaXVzOiByYWRpdXMKICAgICAgICAgIH07CiAgICAgICAgICBjZWxscy5wdXNoKGNlbGwpOwogICAgICAgICAgdGhpcy5fcHJldmlvdXNDZWxscy5wdXNoKGNlbGxJZCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgY2VsbHMuc29ydChmdW5jdGlvbiAoYSwgYikgewogICAgICByZXR1cm4gYS5kaXN0YW5jZSAtIGIuZGlzdGFuY2U7CiAgICB9KTsKCiAgICByZXR1cm4gY2VsbHM7CiAgfSwKICBfY2VsbEV4dGVudDogZnVuY3Rpb24ocm93LCBjb2wpewogICAgdmFyIHN3UG9pbnQgPSB0aGlzLl9jZWxsUG9pbnQocm93LCBjb2wpOwogICAgdmFyIG5lUG9pbnQgPSB0aGlzLl9jZWxsUG9pbnQocm93KzEsIGNvbCsxKTsKICAgIHZhciBzdyA9IHRoaXMuX21hcC51bnByb2plY3Qoc3dQb2ludCk7CiAgICB2YXIgbmUgPSB0aGlzLl9tYXAudW5wcm9qZWN0KG5lUG9pbnQpOwogICAgcmV0dXJuIEwubGF0TG5nQm91bmRzKHN3LCBuZSk7CiAgfSwKICBfY2VsbFBvaW50OmZ1bmN0aW9uKHJvdywgY29sKXsKICAgIHZhciB4ID0gdGhpcy5vcmlnaW4ueCArIChyb3cqdGhpcy5vcHRpb25zLmNlbGxTaXplKTsKICAgIHZhciB5ID0gdGhpcy5vcmlnaW4ueSArIChjb2wqdGhpcy5vcHRpb25zLmNlbGxTaXplKTsKICAgIHJldHVybiBbeCwgeV07CiAgfQp9OwoKTC5lc3JpLk1peGlucy5pZGVudGlmaWFibGVMYXllciA9IHsKICBpZGVudGlmeTpmdW5jdGlvbihsYXRMbmcsIG9wdGlvbnMsIGNhbGxiYWNrKXsKICAgIHZhciBkZWZhdWx0cyA9IHsKICAgICAgc3I6ICc0MjY1JywKICAgICAgbWFwRXh0ZW50OiBKU09OLnN0cmluZ2lmeShMLmVzcmkuVXRpbC5ib3VuZHNUb0V4dGVudCh0aGlzLl9tYXAuZ2V0Qm91bmRzKCkpKSwKICAgICAgdG9sZXJhbmNlOiAzLAogICAgICBnZW9tZXRyeVR5cGU6ICdlc3JpR2VvbWV0cnlQb2ludCcsCiAgICAgIGltYWdlRGlzcGxheTogJzgwMCw2MDAsOTYnLAogICAgICBnZW9tZXRyeTogSlNPTi5zdHJpbmdpZnkoewogICAgICAgIHg6IGxhdExuZy5sbmcsCiAgICAgICAgeTogbGF0TG5nLmxhdCwKICAgICAgICBzcGF0aWFsUmVmZXJlbmNlOiB7CiAgICAgICAgICB3a2lkOiA0MjY1CiAgICAgICAgfQogICAgICB9KQogICAgfTsKCiAgICB2YXIgcGFyYW1zOwoKICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgY2FsbGJhY2sgPT09ICd1bmRlZmluZWQnKSB7CiAgICAgIGNhbGxiYWNrID0gb3B0aW9uczsKICAgICAgcGFyYW1zID0gZGVmYXVsdHM7CiAgICB9IGVsc2UgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnb2JqZWN0JykgewogICAgICBpZiAob3B0aW9ucy5sYXllckRlZnMpIHsKICAgICAgICBvcHRpb25zLmxheWVyRGVmcyA9IHRoaXMucGFyc2VMYXllckRlZnMob3B0aW9ucy5sYXllckRlZnMpOwogICAgICB9CgogICAgICBwYXJhbXMgPSBMLlV0aWwuZXh0ZW5kKGRlZmF1bHRzLCBvcHRpb25zKTsKICAgIH0KCiAgICBMLmVzcmkuZ2V0KHRoaXMuX3VybCArICcvaWRlbnRpZnknLCBwYXJhbXMsIGNhbGxiYWNrKTsKICB9LAogIHBhcnNlTGF5ZXJEZWZzOiBmdW5jdGlvbiAobGF5ZXJEZWZzKSB7CiAgICBpZiAobGF5ZXJEZWZzIGluc3RhbmNlb2YgQXJyYXkpIHsKICAgICAgLy90aHJvdyAnbXVzdCBiZSBvYmplY3Qgb3Igc3RyaW5nJzsKICAgICAgcmV0dXJuICcnOwogICAgfQoKICAgIGlmICh0eXBlb2YgbGF5ZXJEZWZzID09PSAnb2JqZWN0JykgewogICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkobGF5ZXJEZWZzKTsKICAgIH0KCiAgICByZXR1cm4gbGF5ZXJEZWZzOwogIH0KfTsKCihmdW5jdGlvbihMKXsKCiAgdmFyIHRpbGVQcm90b2NvbCA9ICh3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wgIT09ICJodHRwczoiKSA/ICJodHRwOiIgOiAiaHR0cHM6IjsKICB2YXIgYXR0cmlidXRpb25TdHlsZXMgPSAibGluZS1oZWlnaHQ6OXB4OyB0ZXh0LW92ZXJmbG93OmVsbGlwc2lzOyB3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuOyBkaXNwbGF5OmlubGluZS1ibG9jazsiOwogIHZhciBsb2dvU3R5bGVzID0gInBvc2l0aW9uOmFic29sdXRlOyB0b3A6LTM4cHg7IHJpZ2h0OjJweDsiOwogIHZhciBhdHRyaWJ1dGlvbkxvZ28gPSAiPGltZyBzcmM9J2h0dHBzOi8vc2VydmVyYXBpLmFyY2dpc29ubGluZS5jb20vanNhcGkvYXJjZ2lzLzMuNS9qcy9lc3JpL2ltYWdlcy9tYXAvbG9nby1tZWQucG5nJyBhbHQ9J1Bvd2VyZWQgYnkgRXNyaScgY2xhc3M9J2VzcmktYXR0cmlidXRpb24tbG9nbycgc3R5bGU9JyIrbG9nb1N0eWxlcysiJz4iOwogIHZhciBmb3JtYXRUZXh0QXR0cmlidXRpb25zID0gZnVuY3Rpb24gZm9ybWF0VGV4dEF0dHJpYnV0aW9ucyh0ZXh0KXsKICAgIHJldHVybiAiPHNwYW4gY2xhc3M9J2VzcmktYXR0cmlidXRpb25zJyBzdHlsZT0nIithdHRyaWJ1dGlvblN0eWxlcysiJz4iICsgdGV4dCArICI8L3NwYW4+IjsKICB9OwoKICBMLmVzcmkuQmFzZW1hcExheWVyID0gTC5UaWxlTGF5ZXIuZXh0ZW5kKHsKICAgIHN0YXRpY3M6IHsKICAgICAgVElMRVM6IHsKICAgICAgICBTdHJlZXRzOiB7CiAgICAgICAgICB1cmxUZW1wbGF0ZTogdGlsZVByb3RvY29sICsgIi8ve3N9LmFyY2dpc29ubGluZS5jb20vQXJjR0lTL3Jlc3Qvc2VydmljZXMvV29ybGRfU3RyZWV0X01hcC9NYXBTZXJ2ZXIvdGlsZS97en0ve3l9L3t4fS8iLAogICAgICAgICAgYXR0cmlidXRpb25Vcmw6ICJodHRwczovL3N0YXRpYy5hcmNnaXMuY29tL2F0dHJpYnV0aW9uL1dvcmxkX1N0cmVldF9NYXA/Zj1qc29uIiwKICAgICAgICAgIG9wdGlvbnM6IHsKICAgICAgICAgICAgbWluWm9vbTogMSwKICAgICAgICAgICAgbWF4Wm9vbTogMTksCiAgICAgICAgICAgIHN1YmRvbWFpbnM6IFsic2VydmVyIiwgInNlcnZpY2VzIl0sCiAgICAgICAgICAgIGF0dHJpYnV0aW9uOiBmb3JtYXRUZXh0QXR0cmlidXRpb25zKCJFc3JpIikgKyBhdHRyaWJ1dGlvbkxvZ28KICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIFRvcG9ncmFwaGljOiB7CiAgICAgICAgICB1cmxUZW1wbGF0ZTogdGlsZVByb3RvY29sICsgIi8ve3N9LmFyY2dpc29ubGluZS5jb20vQXJjR0lTL3Jlc3Qvc2VydmljZXMvV29ybGRfVG9wb19NYXAvTWFwU2VydmVyL3RpbGUve3p9L3t5fS97eH0vIiwKICAgICAgICAgIGF0dHJpYnV0aW9uVXJsOiAiaHR0cHM6Ly9zdGF0aWMuYXJjZ2lzLmNvbS9hdHRyaWJ1dGlvbi9Xb3JsZF9Ub3BvX01hcD9mPWpzb24iLAogICAgICAgICAgb3B0aW9uczogewogICAgICAgICAgICBtaW5ab29tOiAxLAogICAgICAgICAgICBtYXhab29tOiAxOSwKICAgICAgICAgICAgc3ViZG9tYWluczogWyJzZXJ2ZXIiLCAic2VydmljZXMiXSwKICAgICAgICAgICAgYXR0cmlidXRpb246IGZvcm1hdFRleHRBdHRyaWJ1dGlvbnMoIkVzcmkiKSArIGF0dHJpYnV0aW9uTG9nbwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgT2NlYW5zOiB7CiAgICAgICAgICB1cmxUZW1wbGF0ZTogImh0dHBzOi8vc2VydmVyLmFyY2dpc29ubGluZS5jb20vQXJjR0lTL3Jlc3Qvc2VydmljZXMvT2NlYW5fQmFzZW1hcC9NYXBTZXJ2ZXIvdGlsZS97en0ve3l9L3t4fS8iLAogICAgICAgICAgYXR0cmlidXRpb25Vcmw6ICJodHRwczovL3N0YXRpYy5hcmNnaXMuY29tL2F0dHJpYnV0aW9uL09jZWFuX0Jhc2VtYXA/Zj1qc29uIiwKICAgICAgICAgIG9wdGlvbnM6IHsKICAgICAgICAgICAgbWluWm9vbTogMSwKICAgICAgICAgICAgbWF4Wm9vbTogMTYsCiAgICAgICAgICAgIHN1YmRvbWFpbnM6IFsic2VydmVyIiwgInNlcnZpY2VzIl0sCiAgICAgICAgICAgIGF0dHJpYnV0aW9uOiBmb3JtYXRUZXh0QXR0cmlidXRpb25zKCJFc3JpIikgKyBhdHRyaWJ1dGlvbkxvZ28KICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIE5hdGlvbmFsR2VvZ3JhcGhpYzogewogICAgICAgICAgdXJsVGVtcGxhdGU6ICJodHRwczovL3NlcnZlci5hcmNnaXNvbmxpbmUuY29tL0FyY0dJUy9yZXN0L3NlcnZpY2VzL05hdEdlb19Xb3JsZF9NYXAvTWFwU2VydmVyL3RpbGUve3p9L3t5fS97eH0vIiwKICAgICAgICAgIG9wdGlvbnM6IHsKICAgICAgICAgICAgbWluWm9vbTogMSwKICAgICAgICAgICAgbWF4Wm9vbTogMTYsCiAgICAgICAgICAgIHN1YmRvbWFpbnM6IFsic2VydmVyIiwgInNlcnZpY2VzIl0sCiAgICAgICAgICAgIGF0dHJpYnV0aW9uOiBmb3JtYXRUZXh0QXR0cmlidXRpb25zKCJFc3JpIikgKyBhdHRyaWJ1dGlvbkxvZ28KICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIEdyYXk6IHsKICAgICAgICAgIHVybFRlbXBsYXRlOiB0aWxlUHJvdG9jb2wgKyAiLy97c30uYXJjZ2lzb25saW5lLmNvbS9BcmNHSVMvcmVzdC9zZXJ2aWNlcy9DYW52YXMvV29ybGRfTGlnaHRfR3JheV9CYXNlL01hcFNlcnZlci90aWxlL3t6fS97eX0ve3h9LyIsCiAgICAgICAgICBvcHRpb25zOiB7CiAgICAgICAgICAgIG1pblpvb206IDEsCiAgICAgICAgICAgIG1heFpvb206IDE2LAogICAgICAgICAgICBzdWJkb21haW5zOiBbInNlcnZlciIsICJzZXJ2aWNlcyJdLAogICAgICAgICAgICBhdHRyaWJ1dGlvbjogZm9ybWF0VGV4dEF0dHJpYnV0aW9ucygiRXNyaSwgTkFWVEVRLCBEZUxvcm1lIikgKyBhdHRyaWJ1dGlvbkxvZ28KICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIEdyYXlMYWJlbHM6IHsKICAgICAgICAgIHVybFRlbXBsYXRlOiB0aWxlUHJvdG9jb2wgKyAiLy97c30uYXJjZ2lzb25saW5lLmNvbS9BcmNHSVMvcmVzdC9zZXJ2aWNlcy9DYW52YXMvV29ybGRfTGlnaHRfR3JheV9SZWZlcmVuY2UvTWFwU2VydmVyL3RpbGUve3p9L3t5fS97eH0vIiwKICAgICAgICAgIG9wdGlvbnM6IHsKICAgICAgICAgICAgbWluWm9vbTogMSwKICAgICAgICAgICAgbWF4Wm9vbTogMTYsCiAgICAgICAgICAgIHN1YmRvbWFpbnM6IFsic2VydmVyIiwgInNlcnZpY2VzIl0KICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIEltYWdlcnk6IHsKICAgICAgICAgIHVybFRlbXBsYXRlOiB0aWxlUHJvdG9jb2wgKyAiLy97c30uYXJjZ2lzb25saW5lLmNvbS9BcmNHSVMvcmVzdC9zZXJ2aWNlcy9Xb3JsZF9JbWFnZXJ5L01hcFNlcnZlci90aWxlL3t6fS97eX0ve3h9LyIsCiAgICAgICAgICBvcHRpb25zOiB7CiAgICAgICAgICAgIG1pblpvb206IDEsCiAgICAgICAgICAgIG1heFpvb206IDE5LAogICAgICAgICAgICBzdWJkb21haW5zOiBbInNlcnZlciIsICJzZXJ2aWNlcyJdLAogICAgICAgICAgICBhdHRyaWJ1dGlvbjogZm9ybWF0VGV4dEF0dHJpYnV0aW9ucygiRXNyaSwgRGlnaXRhbEdsb2JlLCBHZW9FeWUsIGktY3ViZWQsIFVTREEsIFVTR1MsIEFFWCwgR2V0bWFwcGluZywgQWVyb2dyaWQsIElHTiwgSUdQLCBzd2lzc3RvcG8sIGFuZCB0aGUgR0lTIFVzZXIgQ29tbXVuaXR5IikgKyBhdHRyaWJ1dGlvbkxvZ28KICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIEltYWdlcnlMYWJlbHM6IHsKICAgICAgICAgIHVybFRlbXBsYXRlOiB0aWxlUHJvdG9jb2wgKyAiLy97c30uYXJjZ2lzb25saW5lLmNvbS9BcmNHSVMvcmVzdC9zZXJ2aWNlcy9SZWZlcmVuY2UvV29ybGRfQm91bmRhcmllc19hbmRfUGxhY2VzL01hcFNlcnZlci90aWxlL3t6fS97eX0ve3h9LyIsCiAgICAgICAgICBvcHRpb25zOiB7CiAgICAgICAgICAgIG1pblpvb206IDEsCiAgICAgICAgICAgIG1heFpvb206IDE5LAogICAgICAgICAgICBzdWJkb21haW5zOiBbInNlcnZlciIsICJzZXJ2aWNlcyJdCiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBJbWFnZXJ5VHJhbnNwb3J0YXRpb246IHsKICAgICAgICAgIHVybFRlbXBsYXRlOiB0aWxlUHJvdG9jb2wgKyAiLy97c30uYXJjZ2lzb25saW5lLmNvbS9BcmNHSVMvcmVzdC9zZXJ2aWNlcy9SZWZlcmVuY2UvV29ybGRfVHJhbnNwb3J0YXRpb24vTWFwU2VydmVyL3RpbGUve3p9L3t5fS97eH0vIiwKICAgICAgICAgIG9wdGlvbnM6IHsKICAgICAgICAgICAgbWluWm9vbTogMSwKICAgICAgICAgICAgbWF4Wm9vbTogMTksCiAgICAgICAgICAgIHN1YmRvbWFpbnM6IFsic2VydmVyIiwgInNlcnZpY2VzIl0KICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIEltYWdlcnlBbHRlcm5hdGVMYWJlbHM6IHsKICAgICAgICAgIHVybFRlbXBsYXRlOiB0aWxlUHJvdG9jb2wgKyAiLy97c30uYXJjZ2lzb25saW5lLmNvbS9BcmNHSVMvcmVzdC9zZXJ2aWNlcy9SZWZlcmVuY2UvV29ybGRfQm91bmRhcmllc19hbmRfUGxhY2VzX0FsdGVybmF0ZS9NYXBTZXJ2ZXIvdGlsZS97en0ve3l9L3t4fS8iLAogICAgICAgICAgb3B0aW9uczogewogICAgICAgICAgICBtaW5ab29tOiAxLAogICAgICAgICAgICBtYXhab29tOiAxMiwKICAgICAgICAgICAgc3ViZG9tYWluczogWyJzZXJ2ZXIiLCAic2VydmljZXMiXQogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgU2hhZGVkUmVsaWVmOiB7CiAgICAgICAgICB1cmxUZW1wbGF0ZTogdGlsZVByb3RvY29sICsgIi8ve3N9LmFyY2dpc29ubGluZS5jb20vQXJjR0lTL3Jlc3Qvc2VydmljZXMvV29ybGRfU2hhZGVkX1JlbGllZi9NYXBTZXJ2ZXIvdGlsZS97en0ve3l9L3t4fS8iLAogICAgICAgICAgb3B0aW9uczogewogICAgICAgICAgICBtaW5ab29tOiAxLAogICAgICAgICAgICBtYXhab29tOiAxMywKICAgICAgICAgICAgc3ViZG9tYWluczogWyJzZXJ2ZXIiLCAic2VydmljZXMiXSwKICAgICAgICAgICAgYXR0cmlidXRpb246IGZvcm1hdFRleHRBdHRyaWJ1dGlvbnMoIkVTUkksIE5BVlRFUSwgRGVMb3JtZSIpICsgYXR0cmlidXRpb25Mb2dvCiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgfQogICAgfSwKICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uKGtleSwgb3B0aW9ucyl7CiAgICAgIHZhciBjb25maWc7CiAgICAgIC8vIHNldCB0aGUgY29uZmlnIHZhcmlhYmxlIHdpdGggdGhlIGFwcHJvcHJpYXRlIGNvbmZpZyBvYmplY3QKICAgICAgaWYgKHR5cGVvZiBrZXkgPT09ICJvYmplY3QiICYmIGtleS51cmxUZW1wbGF0ZSAmJiBrZXkub3B0aW9ucyl7CiAgICAgICAgY29uZmlnID0ga2V5OwogICAgICB9IGVsc2UgaWYodHlwZW9mIGtleSA9PT0gInN0cmluZyIgJiYgTC5lc3JpLkJhc2VtYXBMYXllci5USUxFU1trZXldKXsKICAgICAgICBjb25maWcgPSBMLmVzcmkuQmFzZW1hcExheWVyLlRJTEVTW2tleV07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJMLmVzcmkuQmFzZW1hcExheWVyOiBJbnZhbGlkIHBhcmFtZXRlci4gVXNlIG9uZSBvZiAnU3RyZWV0cycsICdUb3BvZ3JhcGhpYycsICdPY2VhbnMnLCAnTmF0aW9uYWxHZW9ncmFwaGljJywgJ0dyYXknLCAnR3JheUxhYmVscycsICdJbWFnZXJ5JywgJ0ltYWdlcnlMYWJlbHMnLCAnSW1hZ2VyeVRyYW5zcG9ydGF0aW9uJywgJ0ltYWdlcnlBbHRlcm5hdGVMYWJlbHMnIG9yICdTaGFkZWRSZWxpZWYnIik7CiAgICAgIH0KCiAgICAgIC8vIG1lcmdlIHBhc3NlZCBvcHRpb25zIGludG8gdGhlIGNvbmZpZyBvcHRpb25zCiAgICAgIHZhciBtZXJnZWRPcHRpb25zID0gTC5VdGlsLmV4dGVuZChjb25maWcub3B0aW9ucywgb3B0aW9ucyk7CgogICAgICAvLyBjbGVhbiB1cCBvdXIgaW5wdXQgdXJsCiAgICAgIHZhciB1cmwgPSBMLmVzcmkuVXRpbC5jbGVhblVybChjb25maWcudXJsVGVtcGxhdGUpOwoKICAgICAgLy8gY2FsbCB0aGUgaW5pdGlhbGl6ZSBtZXRob2Qgb24gTC5UaWxlTGF5ZXIgdG8gc2V0IGV2ZXJ5dGhpbmcgdXAKICAgICAgTC5UaWxlTGF5ZXIucHJvdG90eXBlLmluaXRpYWxpemUuY2FsbCh0aGlzLCB1cmwsIEwuVXRpbC5zZXRPcHRpb25zKHRoaXMsIG1lcmdlZE9wdGlvbnMpKTsKCiAgICAgIC8vIGlmIHRoaXMgYmFzZW1hcCByZXF1aXJlcyBkeW5hbWljIGF0dHJpYnV0aW9uIHNldCBpdCB1cAogICAgICBpZihjb25maWcuYXR0cmlidXRpb25VcmwpewogICAgICAgIHZhciBhdHRyaWJ1dGlvblVybCA9IEwuZXNyaS5VdGlsLmNsZWFuVXJsKGNvbmZpZy5hdHRyaWJ1dGlvblVybCk7CiAgICAgICAgdGhpcy5fZHluYW1pY0F0dHJpYnV0aW9uID0gdHJ1ZTsKICAgICAgICB0aGlzLl9nZXRBdHRyaWJ1dGlvbkRhdGEoYXR0cmlidXRpb25VcmwpOwogICAgICB9CiAgICB9LAogICAgX2R5bmFtaWNBdHRyaWJ1dGlvbjogZmFsc2UsCiAgICBib3VuZHM6IG51bGwsCiAgICB6b29tOiBudWxsLAogICAgb25BZGQ6IGZ1bmN0aW9uKG1hcCl7CiAgICAgIEwuVGlsZUxheWVyLnByb3RvdHlwZS5vbkFkZC5jYWxsKHRoaXMsIG1hcCk7CiAgICAgIGlmKHRoaXMuX2R5bmFtaWNBdHRyaWJ1dGlvbil7CiAgICAgICAgdGhpcy5vbigibG9hZCIsIHRoaXMuX2hhbmRsZVRpbGVVcGRhdGVzLCB0aGlzKTsKICAgICAgICB0aGlzLl9tYXAub24oInZpZXdyZXNldCB6b29tZW5kIGRyYWdlbmQiLCB0aGlzLl9oYW5kbGVUaWxlVXBkYXRlcywgdGhpcyk7CiAgICAgIH0KICAgICAgdGhpcy5fbWFwLm9uKCJyZXNpemUiLCB0aGlzLl9yZXNpemVBdHRyaWJ1dGlvbiwgdGhpcyk7CiAgICB9LAogICAgb25SZW1vdmU6IGZ1bmN0aW9uKG1hcCl7CiAgICAgIGlmKHRoaXMuX2R5bmFtaWNBdHRyaWJ1dGlvbil7CiAgICAgICAgdGhpcy5vZmYoImxvYWQiLCB0aGlzLl9oYW5kbGVUaWxlVXBkYXRlcywgdGhpcyk7CiAgICAgICAgdGhpcy5fbWFwLm9mZigidmlld3Jlc2V0IHpvb21lbmQgZHJhZ2VuZCIsIHRoaXMuX2hhbmRsZVRpbGVVcGRhdGVzLCB0aGlzKTsKICAgICAgfQogICAgICB0aGlzLl9tYXAub2ZmKCJyZXNpemUiLCB0aGlzLl9yZXNpemVBdHRyaWJ1dGlvbiwgdGhpcyk7CiAgICAgIEwuVGlsZUxheWVyLnByb3RvdHlwZS5vblJlbW92ZS5jYWxsKHRoaXMsIG1hcCk7CiAgICB9LAogICAgX2hhbmRsZVRpbGVVcGRhdGVzOiBmdW5jdGlvbihlKXsKICAgICAgdmFyIG5ld0JvdW5kczsKICAgICAgdmFyIG5ld1pvb207CgogICAgICBpZihlLnR5cGUgPT09ICJsb2FkIil7CiAgICAgICAgbmV3Qm91bmRzID0gdGhpcy5fbWFwLmdldEJvdW5kcygpOwogICAgICAgIG5ld1pvb20gPSB0aGlzLl9tYXAuZ2V0Wm9vbSgpOwogICAgICB9CgogICAgICBpZihlLnR5cGUgPT09ICJ2aWV3cmVzZXQiIHx8IGUudHlwZSA9PT0gImRyYWdlbmQiIHx8IGUudHlwZSA9PT0iem9vbWVuZCIpewogICAgICAgIG5ld0JvdW5kcyA9IGUudGFyZ2V0LmdldEJvdW5kcygpOwogICAgICAgIG5ld1pvb20gPSBlLnRhcmdldC5nZXRab29tKCk7CiAgICAgIH0KCiAgICAgIGlmKHRoaXMuYXR0cmlidXRpb25Cb3VuZGluZ0JveGVzICYmIG5ld0JvdW5kcyAmJiBuZXdab29tKXsKICAgICAgICBpZighbmV3Qm91bmRzLmVxdWFscyh0aGlzLmJvdW5kcykgfHwgbmV3Wm9vbSAhPT0gdGhpcy56b29tKXsKICAgICAgICAgIHRoaXMuYm91bmRzID0gbmV3Qm91bmRzOwogICAgICAgICAgdGhpcy56b29tID0gbmV3Wm9vbTsKICAgICAgICAgIHRoaXMuX3VwZGF0ZU1hcEF0dHJpYnV0aW9uKCk7CiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgX3Jlc2l6ZUF0dHJpYnV0aW9uOiBmdW5jdGlvbigpewogICAgICB2YXIgbWFwV2lkdGggPSB0aGlzLl9tYXAuZ2V0U2l6ZSgpLng7CiAgICAgIHRoaXMuX2dldEF0dHJpYnV0aW9uTG9nbygpLnN0eWxlLmRpc3BsYXkgPSAobWFwV2lkdGggPCA2MDApID8gIm5vbmUiOiJibG9jayI7CiAgICAgIHRoaXMuX2dldEF0dHJpYnV0aW9uU3BhbigpLnN0eWxlLm1heFdpZHRoID0gIChtYXBXaWR0aCogMC43NSkgKyAicHgiOwogICAgfSwKICAgIF9nZXRBdHRyaWJ1dGlvbkRhdGE6IGZ1bmN0aW9uKHVybCl7CiAgICAgIHRoaXMuYXR0cmlidXRpb25Cb3VuZGluZ0JveGVzID0gW107CiAgICAgIEwuZXNyaS5nZXQodXJsLCB7fSwgdGhpcy5fcHJvY2Vzc0F0dHJpYnV0aW9uRGF0YSwgdGhpcyk7CiAgICB9LAogICAgX3Byb2Nlc3NBdHRyaWJ1dGlvbkRhdGE6IGZ1bmN0aW9uKGF0dHJpYnV0aW9uRGF0YSl7CiAgICAgIGZvciAodmFyIGMgPSAwOyBjIDwgYXR0cmlidXRpb25EYXRhLmNvbnRyaWJ1dG9ycy5sZW5ndGg7IGMrKykgewogICAgICAgIHZhciBjb250cmlidXRvciA9IGF0dHJpYnV0aW9uRGF0YS5jb250cmlidXRvcnNbY107CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb250cmlidXRvci5jb3ZlcmFnZUFyZWFzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB2YXIgY292ZXJhZ2VBcmVhID0gY29udHJpYnV0b3IuY292ZXJhZ2VBcmVhc1tpXTsKICAgICAgICAgIHZhciBzb3V0aFdlc3QgPSBuZXcgTC5MYXRMbmcoY292ZXJhZ2VBcmVhLmJib3hbMF0sIGNvdmVyYWdlQXJlYS5iYm94WzFdKTsKICAgICAgICAgIHZhciBub3J0aEVhc3QgPSBuZXcgTC5MYXRMbmcoY292ZXJhZ2VBcmVhLmJib3hbMl0sIGNvdmVyYWdlQXJlYS5iYm94WzNdKTsKICAgICAgICAgIHRoaXMuYXR0cmlidXRpb25Cb3VuZGluZ0JveGVzLnB1c2goewogICAgICAgICAgICBhdHRyaWJ1dGlvbjogY29udHJpYnV0b3IuYXR0cmlidXRpb24sCiAgICAgICAgICAgIHNjb3JlOiBjb3ZlcmFnZUFyZWEuc2NvcmUsCiAgICAgICAgICAgIGJvdW5kczogbmV3IEwuTGF0TG5nQm91bmRzKHNvdXRoV2VzdCwgbm9ydGhFYXN0KSwKICAgICAgICAgICAgbWluWm9vbTogY292ZXJhZ2VBcmVhLnpvb21NaW4sCiAgICAgICAgICAgIG1heFpvb206IGNvdmVyYWdlQXJlYS56b29tTWF4CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGhpcy5hdHRyaWJ1dGlvbkJvdW5kaW5nQm94ZXMuc29ydChmdW5jdGlvbihhLGIpewogICAgICAgIGlmIChhLnNjb3JlIDwgYi5zY29yZSl7IHJldHVybiAtMTsgfQogICAgICAgIGlmIChhLnNjb3JlID4gYi5zY29yZSl7IHJldHVybiAxOyB9CiAgICAgICAgcmV0dXJuIDA7CiAgICAgIH0pOwogICAgICBpZih0aGlzLmJvdW5kcyl7CiAgICAgICAgdGhpcy5fdXBkYXRlTWFwQXR0cmlidXRpb24oKTsKICAgICAgfQogICAgfSwKICAgIF9nZXRBdHRyaWJ1dGlvblNwYW46ZnVuY3Rpb24oKXsKICAgICAgcmV0dXJuIHRoaXMuX21hcC5fY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJy5lc3JpLWF0dHJpYnV0aW9ucycpWzBdOwogICAgfSwKICAgIF9nZXRBdHRyaWJ1dGlvbkxvZ286ZnVuY3Rpb24oKXsKICAgICAgcmV0dXJuIHRoaXMuX21hcC5fY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJy5lc3JpLWF0dHJpYnV0aW9uLWxvZ28nKVswXTsKICAgIH0sCiAgICBfdXBkYXRlTWFwQXR0cmlidXRpb246IGZ1bmN0aW9uKCl7CiAgICAgIHZhciBuZXdBdHRyaWJ1dGlvbnMgPSAnJzsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmF0dHJpYnV0aW9uQm91bmRpbmdCb3hlcy5sZW5ndGg7IGkrKykgewogICAgICAgIHZhciBhdHRyID0gdGhpcy5hdHRyaWJ1dGlvbkJvdW5kaW5nQm94ZXNbaV07CiAgICAgICAgaWYodGhpcy5ib3VuZHMuaW50ZXJzZWN0cyhhdHRyLmJvdW5kcykgJiYgdGhpcy56b29tID49IGF0dHIubWluWm9vbSAmJiB0aGlzLnpvb20gPD0gYXR0ci5tYXhab29tKSB7CiAgICAgICAgICB2YXIgYXR0cmlidXRpb24gPSB0aGlzLmF0dHJpYnV0aW9uQm91bmRpbmdCb3hlc1tpXS5hdHRyaWJ1dGlvbjsKICAgICAgICAgIGlmKG5ld0F0dHJpYnV0aW9ucy5pbmRleE9mKGF0dHJpYnV0aW9uKSA9PT0gLTEpewogICAgICAgICAgICBpZihuZXdBdHRyaWJ1dGlvbnMubGVuZ3RoID4gMCl7CiAgICAgICAgICAgICAgbmV3QXR0cmlidXRpb25zICs9ICcsICc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbmV3QXR0cmlidXRpb25zICs9IGF0dHJpYnV0aW9uOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICB0aGlzLl9nZXRBdHRyaWJ1dGlvblNwYW4oKS5pbm5lckhUTUwgPSBuZXdBdHRyaWJ1dGlvbnM7CiAgICAgIHRoaXMuX3Jlc2l6ZUF0dHJpYnV0aW9uKCk7CiAgICB9CiAgfSk7CgogIEwuZXNyaS5iYXNlbWFwTGF5ZXIgPSBmdW5jdGlvbihrZXksIG9wdGlvbnMpewogICAgcmV0dXJuIG5ldyBMLmVzcmkuQmFzZW1hcExheWVyKGtleSwgb3B0aW9ucyk7CiAgfTsKCn0pKEwpOwovKiBnbG9iYWxzIFRlcnJhZm9ybWVyLCBMICovCihmdW5jdGlvbihMKXsKCiAgLy8gdG9nZ2xlcyB0aGUgdmlzaWJpbGl0eSBvZiBhIGxheWVyLiBVc2VkIHRvCiAgLy8gc2hvdyBvciBoaWRlIGxheWVycyB0aGF0IG1vdmUgaW4gb3Igb3V0IG9mCiAgLy8gdGhlIG1hcCBib3VuZHMKICBmdW5jdGlvbiBzZXRMYXllclZpc2liaWxpdHkobGF5ZXIsIHZpc2libGUpewogICAgdmFyIHN0eWxlID0gKHZpc2libGUpID8gImJsb2NrIiA6ICJub25lIjsKCiAgICBpZihsYXllci5faWNvbil7CiAgICAgIGxheWVyLl9pY29uLnN0eWxlLmRpc3BsYXkgPSBzdHlsZTsKICAgIH0KCiAgICBpZihsYXllci5fc2hhZG93KXsKICAgICAgbGF5ZXIuX3NoYWRvdy5zdHlsZS5kaXNwbGF5ID0gc3R5bGU7CiAgICB9CgogICAgaWYobGF5ZXIuX2xheWVycyl7CiAgICAgIGZvcih2YXIgbGF5ZXJpZCBpbiBsYXllci5fbGF5ZXJzKXsKICAgICAgICBpZihsYXllci5fbGF5ZXJzLmhhc093blByb3BlcnR5KGxheWVyaWQpKXsKICAgICAgICAgIGxheWVyLl9sYXllcnNbbGF5ZXJpZF0uX2NvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gc3R5bGU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICBMLmVzcmkuRmVhdHVyZUxheWVyID0gTC5HZW9KU09OLmV4dGVuZCh7CiAgICBpbmNsdWRlczogTC5lc3JpLk1peGlucy5mZWF0dXJlR3JpZCwKICAgIG9wdGlvbnM6IHsKICAgICAgY2VsbFNpemU6IDUxMiwKICAgICAgZGVib3VuY2U6IDEwMCwKICAgICAgZGVkdXBsaWNhdGU6IHRydWUKICAgIH0sCiAgICBpbml0aWFsaXplOiBmdW5jdGlvbih1cmwsIG9wdGlvbnMpewogICAgICB0aGlzLmluZGV4ID0gbmV3IFRlcnJhZm9ybWVyLlJUcmVlKCk7CiAgICAgIHRoaXMudXJsID0gTC5lc3JpLlV0aWwuY2xlYW5VcmwodXJsKTsKICAgICAgTC5VdGlsLnNldE9wdGlvbnModGhpcywgb3B0aW9ucyk7CgogICAgICBMLmVzcmkuZ2V0KHRoaXMudXJsLCB7fSwgZnVuY3Rpb24ocmVzcG9uc2UpewogICAgICAgIHRoaXMuZmlyZSgibWV0YWRhdGEiLCB7IG1ldGFkYXRhOiByZXNwb25zZSB9KTsKICAgICAgfSwgdGhpcyk7CgogICAgICBMLkdlb0pTT04ucHJvdG90eXBlLmluaXRpYWxpemUuY2FsbCh0aGlzLCBbXSwgb3B0aW9ucyk7CiAgICB9LAogICAgb25BZGQ6IGZ1bmN0aW9uKG1hcCl7CiAgICAgIEwuTGF5ZXJHcm91cC5wcm90b3R5cGUub25BZGQuY2FsbCh0aGlzLCBtYXApOwogICAgICBtYXAub24oInpvb21lbmQgcmVzaXplIG1vdmVFbmQiLCB0aGlzLl91cGRhdGUsIHRoaXMpOwogICAgICB0aGlzLl9pbml0aWFsaXplRmVhdHVyZUdyaWQobWFwKTsKICAgIH0sCiAgICBvblJlbW92ZTogZnVuY3Rpb24obWFwKXsKICAgICAgbWFwLm9mZigiem9vbWVuZCByZXNpemUgbW92ZUVuZCIsIHRoaXMuX3VwZGF0ZSwgdGhpcyk7CiAgICAgIEwuTGF5ZXJHcm91cC5wcm90b3R5cGUub25SZW1vdmUuY2FsbCh0aGlzLCBtYXApOwogICAgICB0aGlzLl9kZXN0cm95RmVhdHVyZUdyaWQobWFwKTsKICAgIH0sCiAgICBnZXRMYXllcklkOiBmdW5jdGlvbihsYXllcil7CiAgICAgIHJldHVybiBsYXllci5mZWF0dXJlLmlkOwogICAgfSwKICAgIF91cGRhdGU6IGZ1bmN0aW9uKGUpewogICAgICB2YXIgZW52ZWxvcGUgPSBMLmVzcmkuVXRpbC5ib3VuZHNUb0VudmVsb3BlKGUudGFyZ2V0LmdldEJvdW5kcygpKTsKICAgICAgdGhpcy5pbmRleC5zZWFyY2goZW52ZWxvcGUsIEwuVXRpbC5iaW5kKGZ1bmN0aW9uKGVycm9yLHJlc3VsdHMpewogICAgICAgIHRoaXMuZWFjaExheWVyKEwuVXRpbC5iaW5kKGZ1bmN0aW9uKGxheWVyKXsKICAgICAgICAgIHZhciBpZCA9IGxheWVyLmZlYXR1cmUuaWQ7CiAgICAgICAgICBzZXRMYXllclZpc2liaWxpdHkobGF5ZXIsIEwuZXNyaS5VdGlsLmluZGV4T2YocmVzdWx0cywgaWQpID49IDApOwogICAgICAgIH0sIHRoaXMpKTsKICAgICAgfSwgdGhpcykpOwogICAgfSwKICAgIF9yZW5kZXI6IGZ1bmN0aW9uKHJlc3BvbnNlKXsKICAgICAgaWYocmVzcG9uc2Uub2JqZWN0SWRGaWVsZE5hbWUgJiYgcmVzcG9uc2UuZmVhdHVyZXMubGVuZ3RoICYmICFyZXNwb25zZS5lcnJvcil7CiAgICAgICAgdmFyIGlkS2V5ID0gcmVzcG9uc2Uub2JqZWN0SWRGaWVsZE5hbWU7CiAgICAgICAgZm9yICh2YXIgaSA9IHJlc3BvbnNlLmZlYXR1cmVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgICB2YXIgZmVhdHVyZSA9IHJlc3BvbnNlLmZlYXR1cmVzW2ldOwogICAgICAgICAgdmFyIGlkID0gZmVhdHVyZS5hdHRyaWJ1dGVzW2lkS2V5XTsKICAgICAgICAgIGlmKCF0aGlzLl9sYXllcnNbaWRdKXsKICAgICAgICAgICAgdmFyIGdlb2pzb24gPSBUZXJyYWZvcm1lci5BcmNHSVMucGFyc2UoZmVhdHVyZSk7CiAgICAgICAgICAgIGdlb2pzb24uaWQgPSBpZDsKICAgICAgICAgICAgdGhpcy5pbmRleC5pbnNlcnQoZ2VvanNvbixpZCk7CiAgICAgICAgICAgIHRoaXMuYWRkRGF0YShnZW9qc29uKTsKICAgICAgICAgICAgdmFyIGxheWVyID0gdGhpcy5fbGF5ZXJzW2lkXTsKICAgICAgICAgICAgdGhpcy5maXJlKCJyZW5kZXIiLCB7CiAgICAgICAgICAgICAgZmVhdHVyZTogbGF5ZXIsCiAgICAgICAgICAgICAgZ2VvanNvbjogZ2VvanNvbgogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9KTsKCiAgTC5lc3JpLmZlYXR1cmVMYXllciA9IGZ1bmN0aW9uKHVybCwgb3B0aW9ucyl7CiAgICByZXR1cm4gbmV3IEwuZXNyaS5GZWF0dXJlTGF5ZXIodXJsLCBvcHRpb25zKTsKICB9OwoKfSkoTCk7Ci8qIGdsb2JhbHMgTCAqLwoKTC5lc3JpLlRpbGVkTWFwTGF5ZXIgPSBMLlRpbGVMYXllci5leHRlbmQoewogIGluY2x1ZGVzOiBMLmVzcmkuTWl4aW5zLmlkZW50aWZpYWJsZUxheWVyLAogIGluaXRpYWxpemU6IGZ1bmN0aW9uKHVybCwgb3B0aW9ucyl7CiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKCiAgICAvLyBzZXQgdGhlIHVybHMKICAgIHRoaXMuc2VydmljZVVybCA9IEwuZXNyaS5VdGlsLmNsZWFuVXJsKHVybCk7CiAgICB0aGlzLnRpbGVVcmwgPSB0aGlzLnNlcnZpY2VVcmwgKyAidGlsZS97en0ve3l9L3t4fSI7CgogICAgLy9pZiB0aGlzIGlzIGxvb2tpbmcgYXQgdGhlIEFHTyB0aWxlcyBzdWJkb21haW4gaW5zZXJ0IHRoZSBzdWJkb21haW4gcGxhY2Vob2xkZXIKICAgIGlmKHRoaXMudGlsZVVybC5tYXRjaCgiOi8vdGlsZXMuYXJjZ2lzLmNvbSIpKXsKICAgICAgdGhpcy50aWxlVXJsID0gdGhpcy50aWxlVXJsLnJlcGxhY2UoIjovL3RpbGVzLmFyY2dpcy5jb20iLCAiOi8vdGlsZXN7c30uYXJjZ2lzLmNvbSIpOwogICAgICBvcHRpb25zLnN1YmRvbWFpbnMgPSBbIjEiLCAiMiIsICIzIiwgIjQiXTsKICAgIH0KCiAgICBMLmVzcmkuZ2V0KHRoaXMuc2VydmljZVVybCwge30sIGZ1bmN0aW9uKHJlc3BvbnNlKXsKICAgICAgdGhpcy5maXJlKCJtZXRhZGF0YSIsIHsgbWV0YWRhdGE6IHJlc3BvbnNlIH0pOwogICAgfSwgdGhpcyk7CgogICAgLy8gaW5pdCBsYXllciBieSBjYWxsaW5nIFRpbGVMYXllcnMgaW5pdGlhbGl6ZSBtZXRob2QKICAgIEwuVGlsZUxheWVyLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcywgdGhpcy50aWxlVXJsLCBvcHRpb25zKTsKICB9Cn0pOwoKTC5lc3JpLnRpbGVkTWFwTGF5ZXIgPSBmdW5jdGlvbihrZXksIG9wdGlvbnMpewogIHJldHVybiBuZXcgTC5lc3JpLlRpbGVkTWFwTGF5ZXIoa2V5LCBvcHRpb25zKTsKfTsKLyogZ2xvYmFscyBMICovCgovKiEKICogVGhlIE1JVCBMaWNlbnNlIChNSVQpCiAqCiAqIENvcHlyaWdodCAoYykgMjAxMyBTYW5ib3JuIE1hcCBDb21wYW55LCBJbmMuCiAqCiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwogKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwogKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogKgogKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgogKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KICoKICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQogKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KICogVEhFIFNPRlRXQVJFLgogKi8KCkwuZXNyaS5EeW5hbWljTWFwTGF5ZXIgPSBMLkltYWdlT3ZlcmxheS5leHRlbmQoewogIGluY2x1ZGVzOiBMLmVzcmkuTWl4aW5zLmlkZW50aWZpYWJsZUxheWVyLAoKICBkZWZhdWx0UGFyYW1zOiB7CiAgICBmb3JtYXQ6ICdwbmc4JywKICAgIHRyYW5zcGFyZW50OiB0cnVlLAogICAgZjogJ2ltYWdlJywKICAgIGJib3hTUjogMTAyMTAwLAogICAgaW1hZ2VTUjogMTAyMTAwLAogICAgbGF5ZXJzOiAnJywKICAgIG9wYWNpdHk6IDEKICB9LAoKICBpbml0aWFsaXplOiBmdW5jdGlvbiAodXJsLCBvcHRpb25zKSB7CiAgICB0aGlzLl91cmwgPSBMLmVzcmkuVXRpbC5jbGVhblVybCh1cmwpOwogICAgdGhpcy5fbGF5ZXJQYXJhbXMgPSBMLlV0aWwuZXh0ZW5kKHt9LCB0aGlzLmRlZmF1bHRQYXJhbXMpOwoKICAgIGZvciAodmFyIG9wdCBpbiBvcHRpb25zKSB7CiAgICAgIGlmICghdGhpcy5vcHRpb25zLmhhc093blByb3BlcnR5KG9wdCkpIHsKICAgICAgICB0aGlzLl9sYXllclBhcmFtc1tvcHRdID0gb3B0aW9uc1tvcHRdOwogICAgICB9CiAgICB9CgogICAgZGVsZXRlIHRoaXMuX2xheWVyUGFyYW1zLnRva2VuOwoKICAgIHRoaXMuX3BhcnNlTGF5ZXJzKCk7CiAgICB0aGlzLl9wYXJzZUxheWVyRGVmcygpOwoKICAgIEwuZXNyaS5nZXQodGhpcy5fdXJsLCB7fSwgZnVuY3Rpb24ocmVzcG9uc2UpewogICAgICB0aGlzLmZpcmUoIm1ldGFkYXRhIiwgeyBtZXRhZGF0YTogcmVzcG9uc2UgfSk7CiAgICB9LCB0aGlzKTsKCiAgICBMLlV0aWwuc2V0T3B0aW9ucyh0aGlzLCBvcHRpb25zKTsKICB9LAoKICBvbkFkZDogZnVuY3Rpb24gKG1hcCkgewogICAgdGhpcy5fbWFwID0gbWFwOwoKICAgIGlmICghdGhpcy5faW1hZ2UpIHsKICAgICAgdGhpcy5faW5pdEltYWdlKCk7CiAgICB9CgogICAgbWFwLl9wYW5lcy5vdmVybGF5UGFuZS5hcHBlbmRDaGlsZCh0aGlzLl9pbWFnZSk7CgogICAgbWFwLm9uKHsKICAgICAgJ3ZpZXdyZXNldCc6IHRoaXMuX3Jlc2V0LAogICAgICAnbW92ZWVuZCc6IHRoaXMuX3VwZGF0ZSwKICAgICAgJ3pvb21lbmQnOiB0aGlzLl96b29tVXBkYXRlCiAgICB9LCB0aGlzKTsKCiAgICBpZiAobWFwLm9wdGlvbnMuem9vbUFuaW1hdGlvbiAmJiBMLkJyb3dzZXIuYW55M2QpIHsKICAgICAgbWFwLm9uKCd6b29tYW5pbScsIHRoaXMuX2FuaW1hdGVab29tLCB0aGlzKTsKICAgIH0KCiAgICBpZiAobWFwLm9wdGlvbnMuY3JzICYmIG1hcC5vcHRpb25zLmNycy5jb2RlKSB7CiAgICAgIHZhciBzciA9IG1hcC5vcHRpb25zLmNycy5jb2RlLnNwbGl0KCI6IilbMV07CiAgICAgIHRoaXMuX2xheWVyUGFyYW1zLmJib3hTUiA9IHNyOwogICAgICB0aGlzLl9sYXllclBhcmFtcy5pbWFnZVNSID0gc3I7CiAgICB9CgogICAgdGhpcy5fcmVzZXQoKTsKICAgIC8vdGhpcy5fdXBkYXRlKCk7CiAgfSwKCiAgb25SZW1vdmU6IGZ1bmN0aW9uIChtYXApIHsKICAgIG1hcC5nZXRQYW5lcygpLm92ZXJsYXlQYW5lLnJlbW92ZUNoaWxkKHRoaXMuX2ltYWdlKTsKCiAgICBtYXAub2ZmKHsKICAgICAgJ3ZpZXdyZXNldCc6IHRoaXMuX3Jlc2V0LAogICAgICAnbW92ZWVuZCc6IHRoaXMuX3VwZGF0ZQogICAgfSwgdGhpcyk7CgogICAgaWYgKG1hcC5vcHRpb25zLnpvb21BbmltYXRpb24pIHsKICAgICAgbWFwLm9mZignem9vbWFuaW0nLCB0aGlzLl9hbmltYXRlWm9vbSwgdGhpcyk7CiAgICB9CiAgfSwKCiAgX2FuaW1hdGVab29tOiBmdW5jdGlvbiAoZSkgewogICAgdmFyIG1hcCA9IHRoaXMuX21hcCwKICAgICAgICBpbWFnZSA9IHRoaXMuX2ltYWdlLAogICAgICAgIHNjYWxlID0gbWFwLmdldFpvb21TY2FsZShlLnpvb20pLAoKICAgICAgICBudyA9IHRoaXMuX21hcC5nZXRCb3VuZHMoKS5nZXROb3J0aFdlc3QoKSwKICAgICAgICBzZSA9IHRoaXMuX21hcC5nZXRCb3VuZHMoKS5nZXRTb3V0aEVhc3QoKSwKCiAgICAgICAgdG9wTGVmdCA9IG1hcC5fbGF0TG5nVG9OZXdMYXllclBvaW50KG53LCBlLnpvb20sIGUuY2VudGVyKSwKICAgICAgICBzaXplID0gbWFwLl9sYXRMbmdUb05ld0xheWVyUG9pbnQoc2UsIGUuem9vbSwgZS5jZW50ZXIpLl9zdWJ0cmFjdCh0b3BMZWZ0KSwKICAgICAgICBvcmlnaW4gPSB0b3BMZWZ0Ll9hZGQoc2l6ZS5fbXVsdGlwbHlCeSgoMSAvIDIpICogKDEgLSAxIC8gc2NhbGUpKSk7CgogICAgaW1hZ2Uuc3R5bGVbTC5Eb21VdGlsLlRSQU5TRk9STV0gPSBMLkRvbVV0aWwuZ2V0VHJhbnNsYXRlU3RyaW5nKG9yaWdpbikgKyAnIHNjYWxlKCcgKyBzY2FsZSArICcpICc7CiAgfSwKCiAgX3BhcnNlTGF5ZXJzOiBmdW5jdGlvbiAoKSB7CiAgICBpZiAodHlwZW9mIHRoaXMuX2xheWVyUGFyYW1zLmxheWVycyA9PT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgZGVsZXRlIHRoaXMuX2xheWVyUGFyYW1zLmxheWVyT3B0aW9uOwogICAgICByZXR1cm47CiAgICB9CgogICAgdmFyIGFjdGlvbiA9IHRoaXMuX2xheWVyUGFyYW1zLmxheWVyT3B0aW9uIHx8IG51bGwsCiAgICAgICAgbGF5ZXJzID0gdGhpcy5fbGF5ZXJQYXJhbXMubGF5ZXJzIHx8IG51bGwsCiAgICAgICAgdmVyYiA9ICdzaG93JywKICAgICAgICB2ZXJicyA9IFsnc2hvdycsICdoaWRlJywgJ2luY2x1ZGUnLCAnZXhjbHVkZSddOwoKICAgIGRlbGV0ZSB0aGlzLl9sYXllclBhcmFtcy5sYXllck9wdGlvbjsKCiAgICBpZiAoIWFjdGlvbikgewogICAgICBpZiAobGF5ZXJzIGluc3RhbmNlb2YgQXJyYXkpIHsKICAgICAgICB0aGlzLl9sYXllclBhcmFtcy5sYXllcnMgPSB2ZXJiICsgJzonICsgbGF5ZXJzLmpvaW4oJywnKTsKICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbGF5ZXJzID09PSAnc3RyaW5nJykgewogICAgICAgIHZhciBtYXRjaCA9IGxheWVycy5tYXRjaCgnOicpOwoKICAgICAgICBpZiAobWF0Y2gpIHsKICAgICAgICAgIGxheWVycyA9IGxheWVycy5zcGxpdChtYXRjaFswXSk7CiAgICAgICAgICBpZiAoTnVtYmVyKGxheWVyc1sxXS5zcGxpdCgnLCcpWzBdKSkgewogICAgICAgICAgICBpZiAodmVyYnMuaW5kZXhPZihsYXllcnNbMF0pICE9PSAtMSkgewogICAgICAgICAgICAgIHZlcmIgPSBsYXllcnNbMF07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxheWVycyA9IGxheWVyc1sxXTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdGhpcy5fbGF5ZXJQYXJhbXMubGF5ZXJzID0gdmVyYiArICc6JyArIGxheWVyczsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgaWYgKHZlcmJzLmluZGV4T2YoYWN0aW9uKSAhPT0gLTEpIHsKICAgICAgICB2ZXJiID0gYWN0aW9uOwogICAgICB9CgogICAgICB0aGlzLl9sYXllclBhcmFtcy5sYXllcnMgPSB2ZXJiICsgJzonICsgbGF5ZXJzOwogICAgfQogIH0sCgogIF9wYXJzZUxheWVyRGVmczogZnVuY3Rpb24gKCkgewogICAgaWYgKHR5cGVvZiB0aGlzLl9sYXllclBhcmFtcy5sYXllckRlZnMgPT09ICd1bmRlZmluZWQnKSB7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICB2YXIgbGF5ZXJEZWZzID0gdGhpcy5fbGF5ZXJQYXJhbXMubGF5ZXJEZWZzOwoKICAgIHZhciBkZWZzID0gW107CgogICAgaWYgKGxheWVyRGVmcyBpbnN0YW5jZW9mIEFycmF5KSB7CiAgICAgIHZhciBsZW4gPSBsYXllckRlZnMubGVuZ3RoOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgaWYgKGxheWVyRGVmc1tpXSkgewogICAgICAgICAgZGVmcy5wdXNoKGkgKyAnOicgKyBsYXllckRlZnNbaV0pOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIGlmICh0eXBlb2YgbGF5ZXJEZWZzID09PSAnb2JqZWN0JykgewogICAgICBmb3IgKHZhciBsYXllciBpbiBsYXllckRlZnMpIHsKICAgICAgICBpZihsYXllckRlZnMuaGFzT3duUHJvcGVydHkobGF5ZXIpKXsKICAgICAgICAgIGRlZnMucHVzaChsYXllciArICc6JyArIGxheWVyRGVmc1tsYXllcl0pOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgZGVsZXRlIHRoaXMuX2xheWVyUGFyYW1zLmxheWVyRGVmczsKICAgICAgcmV0dXJuOwogICAgfQogICAgdGhpcy5fbGF5ZXJQYXJhbXMubGF5ZXJEZWZzID0gZGVmcy5qb2luKCc7Jyk7CiAgfSwKCiAgX2luaXRJbWFnZTogZnVuY3Rpb24gKCkgewogICAgdGhpcy5faW1hZ2UgPSBMLkRvbVV0aWwuY3JlYXRlKCdpbWcnLCAnbGVhZmxldC1pbWFnZS1sYXllcicpOwoKICAgIGlmICh0aGlzLl9tYXAub3B0aW9ucy56b29tQW5pbWF0aW9uICYmIEwuQnJvd3Nlci5hbnkzZCkgewogICAgICBMLkRvbVV0aWwuYWRkQ2xhc3ModGhpcy5faW1hZ2UsICdsZWFmbGV0LXpvb20tYW5pbWF0ZWQnKTsKICAgIH0gZWxzZSB7CiAgICAgIEwuRG9tVXRpbC5hZGRDbGFzcyh0aGlzLl9pbWFnZSwgJ2xlYWZsZXQtem9vbS1oaWRlJyk7CiAgICB9CgogICAgdGhpcy5fdXBkYXRlT3BhY2l0eSgpOwoKICAgIEwuVXRpbC5leHRlbmQodGhpcy5faW1hZ2UsIHsKICAgICAgZ2FsbGVyeWltZzogJ25vJywKICAgICAgb25zZWxlY3RzdGFydDogTC5VdGlsLmZhbHNlRm4sCiAgICAgIG9ubW91c2Vtb3ZlOiBMLlV0aWwuZmFsc2VGbiwKICAgICAgb25sb2FkOiBMLlV0aWwuYmluZCh0aGlzLl9vbkltYWdlTG9hZCwgdGhpcyksCiAgICAgIHNyYzogdGhpcy5fZ2V0SW1hZ2VVcmwoKQogICAgfSk7CiAgfSwKCiAgX2dldEltYWdlVXJsOiBmdW5jdGlvbiAoKSB7CiAgICB2YXIgYm91bmRzID0gdGhpcy5fbWFwLmdldEJvdW5kcygpLAogICAgICAgIHNpemUgPSB0aGlzLl9tYXAuZ2V0U2l6ZSgpLAogICAgICAgIG5lID0gdGhpcy5fbWFwLm9wdGlvbnMuY3JzLnByb2plY3QoYm91bmRzLl9ub3J0aEVhc3QpLAogICAgICAgIHN3ID0gdGhpcy5fbWFwLm9wdGlvbnMuY3JzLnByb2plY3QoYm91bmRzLl9zb3V0aFdlc3QpOwoKICAgIHRoaXMuX2xheWVyUGFyYW1zLmJib3ggPSBbc3cueCwgc3cueSwgbmUueCwgbmUueV0uam9pbignLCcpOwogICAgdGhpcy5fbGF5ZXJQYXJhbXMuc2l6ZSA9IHNpemUueCArICcsJyArIHNpemUueTsKCiAgICB2YXIgdXJsID0gdGhpcy5fdXJsICsgJ2V4cG9ydCcgKyBMLlV0aWwuZ2V0UGFyYW1TdHJpbmcodGhpcy5fbGF5ZXJQYXJhbXMpOwoKICAgIGlmICh0eXBlb2YgdGhpcy5vcHRpb25zLnRva2VuICE9PSAndW5kZWZpbmVkJyl7CiAgICAgIHVybCA9IHVybCArICcmdG9rZW49JyArIHRoaXMub3B0aW9ucy50b2tlbjsKICAgIH0KCiAgICByZXR1cm4gdXJsOwogIH0sCgogIF91cGRhdGU6IGZ1bmN0aW9uIChlKSB7CiAgICBpZiAodGhpcy5fbWFwLl9wYW5UcmFuc2l0aW9uICYmIHRoaXMuX21hcC5fcGFuVHJhbnNpdGlvbi5faW5Qcm9ncmVzcykgewogICAgICByZXR1cm47CiAgICB9CgogICAgdmFyIHpvb20gPSB0aGlzLl9tYXAuZ2V0Wm9vbSgpOwogICAgaWYgKHpvb20gPiB0aGlzLm9wdGlvbnMubWF4Wm9vbSB8fCB6b29tIDwgdGhpcy5vcHRpb25zLm1pblpvb20pIHsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIHRoaXMuX25ld0ltYWdlID0gTC5Eb21VdGlsLmNyZWF0ZSgnaW1nJywgJ2xlYWZsZXQtaW1hZ2UtbGF5ZXInKTsKCiAgICBpZiAodGhpcy5fbWFwLm9wdGlvbnMuem9vbUFuaW1hdGlvbiAmJiBMLkJyb3dzZXIuYW55M2QpIHsKICAgICAgTC5Eb21VdGlsLmFkZENsYXNzKHRoaXMuX25ld0ltYWdlLCAnbGVhZmxldC16b29tLWFuaW1hdGVkJyk7CiAgICB9IGVsc2UgewogICAgICBMLkRvbVV0aWwuYWRkQ2xhc3ModGhpcy5fbmV3SW1hZ2UsICdsZWFmbGV0LXpvb20taGlkZScpOwogICAgfQoKICAgIHRoaXMuX3VwZGF0ZU9wYWNpdHkoKTsKCiAgICBMLlV0aWwuZXh0ZW5kKHRoaXMuX25ld0ltYWdlLCB7CiAgICAgIGdhbGxlcnlpbWc6ICdubycsCiAgICAgIG9uc2VsZWN0c3RhcnQ6IEwuVXRpbC5mYWxzZUZuLAogICAgICBvbm1vdXNlbW92ZTogTC5VdGlsLmZhbHNlRm4sCiAgICAgIG9ubG9hZDogTC5VdGlsLmJpbmQodGhpcy5fb25OZXdJbWFnZUxvYWQsIHRoaXMpLAogICAgICBzcmM6IHRoaXMuX2dldEltYWdlVXJsKCkKICAgIH0pOwogIH0sCgogIF91cGRhdGVPcGFjaXR5OiBmdW5jdGlvbigpewogICAgTC5Eb21VdGlsLnNldE9wYWNpdHkodGhpcy5faW1hZ2UsIHRoaXMub3B0aW9ucy5vcGFjaXR5KTsKICAgIGlmKHRoaXMuX25ld0ltYWdlKXsKICAgICAgTC5Eb21VdGlsLnNldE9wYWNpdHkodGhpcy5fbmV3SW1hZ2UsIHRoaXMub3B0aW9ucy5vcGFjaXR5KTsKICAgIH0KICB9LAoKICBfem9vbVVwZGF0ZTogZnVuY3Rpb24gKGUpIHsKICAgIC8vY29uc29sZS5sb2coZSk7CiAgICAvL2NvbnNvbGUubG9nKHRoaXMuX2ltYWdlKTsKICAgIC8vY29uc29sZS5sb2codGhpcy5fbmV3SW1hZ2UpOwogIH0sCgogIF9vbk5ld0ltYWdlTG9hZDogZnVuY3Rpb24gKCkgewogICAgdmFyIGJvdW5kcyA9IHRoaXMuX21hcC5nZXRCb3VuZHMoKSwKICAgICAgICBudyA9IEwubGF0TG5nKGJvdW5kcy5fbm9ydGhFYXN0LmxhdCwgYm91bmRzLl9zb3V0aFdlc3QubG5nKSwKICAgICAgICBzZSA9IEwubGF0TG5nKGJvdW5kcy5fc291dGhXZXN0LmxhdCwgYm91bmRzLl9ub3J0aEVhc3QubG5nKTsKCiAgICB2YXIgdG9wTGVmdCA9IHRoaXMuX21hcC5sYXRMbmdUb0xheWVyUG9pbnQobncpLAogICAgICAgIHNpemUgPSB0aGlzLl9tYXAubGF0TG5nVG9MYXllclBvaW50KHNlKS5fc3VidHJhY3QodG9wTGVmdCk7CiAgICBMLkRvbVV0aWwuc2V0UG9zaXRpb24odGhpcy5fbmV3SW1hZ2UsIHRvcExlZnQpOwogICAgdGhpcy5fbmV3SW1hZ2Uuc3R5bGUud2lkdGggPSBzaXplLnggKyAncHgnOwogICAgdGhpcy5fbmV3SW1hZ2Uuc3R5bGUuaGVpZ2h0ID0gc2l6ZS55ICsgJ3B4JzsKCiAgICAvLyB0aGlzLl9tYXAuX3BhbmVzLm92ZXJsYXlQYW5lLmFwcGVuZENoaWxkKHRoaXMuX25ld0ltYWdlKTsKICAgIC8vIHRoaXMuX21hcC5fcGFuZXMub3ZlcmxheVBhbmUucmVtb3ZlQ2hpbGQodGhpcy5faW1hZ2UpOwoKICAgIGlmICh0aGlzLl9pbWFnZSA9PSBudWxsKSB7CiAgICAgIHRoaXMuX21hcC5fcGFuZXMub3ZlcmxheVBhbmUuYXBwZW5kQ2hpbGQodGhpcy5fbmV3SW1hZ2UpOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5fbWFwLl9wYW5lcy5vdmVybGF5UGFuZS5pbnNlcnRCZWZvcmUodGhpcy5fbmV3SW1hZ2UsdGhpcy5faW1hZ2UpOwogICAgfQogICAgdGhpcy5fbWFwLl9wYW5lcy5vdmVybGF5UGFuZS5yZW1vdmVDaGlsZCh0aGlzLl9pbWFnZSk7CgogICAgdGhpcy5faW1hZ2UgPSB0aGlzLl9uZXdJbWFnZTsKICAgIHRoaXMuX25ld0ltYWdlID0gbnVsbDsKICB9LAoKICBfb25JbWFnZUxvYWQ6IGZ1bmN0aW9uICgpIHsKICAgIHRoaXMuZmlyZSgnbG9hZCcpOwogICAgICAvL2lmICh0aGlzLl9pbWFnZS5zdHlsZS5kaXNwbGF5ID09ICdub25lJykgewogICAgICAvLyAgdGhpcy5faW1hZ2Uuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7CiAgICAgIC8vfQogIH0sCgogIF9yZXNldDogZnVuY3Rpb24gKCkgewogICAgcmV0dXJuOwogIH0KfSk7CgpMLmVzcmkuZHluYW1pY01hcExheWVyID0gZnVuY3Rpb24gKHVybCwgb3B0aW9ucykgewogIHJldHVybiBuZXcgTC5lc3JpLkR5bmFtaWNNYXBMYXllcih1cmwsIG9wdGlvbnMpOwp9Ow==]]></data>
	</file>
	<file>
	  <filename>/lib/js/esri-leaflet/esri-leaflet.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohIEVzcmktTGVhZmxldCAtIHYwLjAuMSAtIDIwMTMtMDktMjYKKiAgIENvcHlyaWdodCAoYykgMjAxMyBFbnZpcm9ubWVudGFsIFN5c3RlbXMgUmVzZWFyY2ggSW5zdGl0dXRlLCBJbmMuCiogICBBcGFjaGUgTGljZW5zZSovCiFmdW5jdGlvbihhLGIpeyJvYmplY3QiPT10eXBlb2YgbW9kdWxlJiYib2JqZWN0Ij09dHlwZW9mIG1vZHVsZS5leHBvcnRzJiYoZXhwb3J0cz1tb2R1bGUuZXhwb3J0cz1iKCkpLCJvYmplY3QiPT10eXBlb2Ygd2luZG93JiYoYS5UZXJyYWZvcm1lcj1iKCkpfSh0aGlzLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3ZhciBhPUFycmF5LnByb3RvdHlwZS5zbGljZS5hcHBseShhcmd1bWVudHMpO3ZvaWQgMCE9PXR5cGVvZiBjb25zb2xlJiZjb25zb2xlLndhcm4mJmNvbnNvbGUud2Fybi5hcHBseShjb25zb2xlLGEpfWZ1bmN0aW9uIGIoYSxiKXtmb3IodmFyIGMgaW4gYiliLmhhc093blByb3BlcnR5KGMpJiYoYVtjXT1iW2NdKTtyZXR1cm4gYX1mdW5jdGlvbiBjKGEpe3N3aXRjaChhLnR5cGUpe2Nhc2UiUG9pbnQiOnJldHVyblthLmNvb3JkaW5hdGVzWzBdLGEuY29vcmRpbmF0ZXNbMV0sYS5jb29yZGluYXRlc1swXSxhLmNvb3JkaW5hdGVzWzFdXTtjYXNlIk11bHRpUG9pbnQiOnJldHVybiBmKGEuY29vcmRpbmF0ZXMpO2Nhc2UiTGluZVN0cmluZyI6cmV0dXJuIGYoYS5jb29yZGluYXRlcyk7Y2FzZSJNdWx0aUxpbmVTdHJpbmciOnJldHVybiBkKGEuY29vcmRpbmF0ZXMpO2Nhc2UiUG9seWdvbiI6cmV0dXJuIGQoYS5jb29yZGluYXRlcyk7Y2FzZSJNdWx0aVBvbHlnb24iOnJldHVybiBlKGEuY29vcmRpbmF0ZXMpO2Nhc2UiRmVhdHVyZSI6cmV0dXJuIGMoYS5nZW9tZXRyeSk7Y2FzZSJGZWF0dXJlQ29sbGVjdGlvbiI6cmV0dXJuIGcoYSk7Y2FzZSJHZW9tZXRyeUNvbGxlY3Rpb24iOnJldHVybiBoKGEpO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJVbmtub3duIHR5cGU6ICIrYS50eXBlKX19ZnVuY3Rpb24gZChhKXtmb3IodmFyIGI9bnVsbCxjPW51bGwsZD1udWxsLGU9bnVsbCxmPTA7ZjxhLmxlbmd0aDtmKyspZm9yKHZhciBnPWFbZl0saD0wO2g8Zy5sZW5ndGg7aCsrKXt2YXIgaT1nW2hdLGo9aVswXSxrPWlbMV07bnVsbD09PWI/Yj1qOmI+aiYmKGI9aiksbnVsbD09PWM/Yz1qOmo+YyYmKGM9aiksbnVsbD09PWQ/ZD1rOmQ+ayYmKGQ9ayksbnVsbD09PWU/ZT1rOms+ZSYmKGU9ayl9cmV0dXJuW2IsZCxjLGVdfWZ1bmN0aW9uIGUoYSl7Zm9yKHZhciBiPW51bGwsYz1udWxsLGQ9bnVsbCxlPW51bGwsZj0wO2Y8YS5sZW5ndGg7ZisrKWZvcih2YXIgZz1hW2ZdLGg9MDtoPGcubGVuZ3RoO2grKylmb3IodmFyIGk9Z1toXSxqPTA7ajxpLmxlbmd0aDtqKyspe3ZhciBrPWlbal0sbD1rWzBdLG09a1sxXTtudWxsPT09Yj9iPWw6Yj5sJiYoYj1sKSxudWxsPT09Yz9jPWw6bD5jJiYoYz1sKSxudWxsPT09ZD9kPW06ZD5tJiYoZD1tKSxudWxsPT09ZT9lPW06bT5lJiYoZT1tKX1yZXR1cm5bYixkLGMsZV19ZnVuY3Rpb24gZihhKXtmb3IodmFyIGI9bnVsbCxjPW51bGwsZD1udWxsLGU9bnVsbCxmPTA7ZjxhLmxlbmd0aDtmKyspe3ZhciBnPWFbZl0saD1nWzBdLGk9Z1sxXTtudWxsPT09Yj9iPWg6Yj5oJiYoYj1oKSxudWxsPT09Yz9jPWg6aD5jJiYoYz1oKSxudWxsPT09ZD9kPWk6ZD5pJiYoZD1pKSxudWxsPT09ZT9lPWk6aT5lJiYoZT1pKX1yZXR1cm5bYixkLGMsZV19ZnVuY3Rpb24gZyhhKXtmb3IodmFyIGIsZD1bXSxlPWEuZmVhdHVyZXMubGVuZ3RoLTE7ZT49MDtlLS0pYj1jKGEuZmVhdHVyZXNbZV0uZ2VvbWV0cnkpLGQucHVzaChbYlswXSxiWzFdXSksZC5wdXNoKFtiWzJdLGJbM11dKTtyZXR1cm4gZihkKX1mdW5jdGlvbiBoKGEpe2Zvcih2YXIgYixkPVtdLGU9YS5nZW9tZXRyaWVzLmxlbmd0aC0xO2U+PTA7ZS0tKWI9YyhhLmdlb21ldHJpZXNbZV0pLGQucHVzaChbYlswXSxiWzFdXSksZC5wdXNoKFtiWzJdLGJbM11dKTtyZXR1cm4gZihkKX1mdW5jdGlvbiBpKGEpe3ZhciBiPWMoYSk7cmV0dXJue3g6YlswXSx5OmJbMV0sdzpNYXRoLmFicyhiWzBdLWJbMl0pLGg6TWF0aC5hYnMoYlsxXS1iWzNdKX19ZnVuY3Rpb24gayhhKXtyZXR1cm4gYSpZfWZ1bmN0aW9uIGwoYSl7cmV0dXJuIGEqWn1mdW5jdGlvbiBtKGEsYil7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspIm51bWJlciI9PXR5cGVvZiBhW2NdWzBdJiYoYVtjXT1iKGFbY10pKSwib2JqZWN0Ij09dHlwZW9mIGFbY10mJihhW2NdPW0oYVtjXSxiKSk7cmV0dXJuIGF9ZnVuY3Rpb24gbihhKXt2YXIgYj1hWzBdLGM9YVsxXTtyZXR1cm5bayhiL1gpLTM2MCpNYXRoLmZsb29yKChrKGIvWCkrMTgwKS8zNjApLGsoTWF0aC5QSS8yLTIqTWF0aC5hdGFuKE1hdGguZXhwKC0xKmMvWCkpKV19ZnVuY3Rpb24gbyhhKXt2YXIgYj1hWzBdLGM9TWF0aC5tYXgoTWF0aC5taW4oYVsxXSw4OS45OTk5OSksLTg5Ljk5OTk5KTtyZXR1cm5bbChiKSpYLFgvMipNYXRoLmxvZygoMStNYXRoLnNpbihsKGMpKSkvKDEtTWF0aC5zaW4obChjKSkpKV19ZnVuY3Rpb24gcChhLGIsYyl7aWYoIlBvaW50Ij09PWEudHlwZSlhLmNvb3JkaW5hdGVzPWIoYS5jb29yZGluYXRlcyk7ZWxzZSBpZigiRmVhdHVyZSI9PT1hLnR5cGUpYS5nZW9tZXRyeT1wKGEuZ2VvbWV0cnksYiwhMCk7ZWxzZSBpZigiRmVhdHVyZUNvbGxlY3Rpb24iPT09YS50eXBlKWZvcih2YXIgZD0wO2Q8YS5mZWF0dXJlcy5sZW5ndGg7ZCsrKWEuZmVhdHVyZXNbZF09cChhLmZlYXR1cmVzW2RdLGIsITApO2Vsc2UgaWYoIkdlb21ldHJ5Q29sbGVjdGlvbiI9PT1hLnR5cGUpZm9yKHZhciBlPTA7ZTxhLmdlb21ldHJpZXMubGVuZ3RoO2UrKylhLmdlb21ldHJpZXNbZV09cChhLmdlb21ldHJpZXNbZV0sYiwhMCk7ZWxzZSBhLmNvb3JkaW5hdGVzPW0oYS5jb29yZGluYXRlcyxiKTtyZXR1cm4gY3x8Yj09PW8mJihhLmNycz0kKSxiPT09biYmZGVsZXRlIGEuY3JzLGF9ZnVuY3Rpb24gcShhKXtyZXR1cm4gcChhLG8pfWZ1bmN0aW9uIHIoYSl7cmV0dXJuIHAoYSxuKX1mdW5jdGlvbiBzKGEsYil7cmV0dXJuIGI+YT8tMTphPmI/MTowfWZ1bmN0aW9uIHQoYSxiKXtyZXR1cm4gYVswXS1iWzBdPmFbMV0tYlsxXT8xOmFbMF0tYlswXTxhWzFdLWJbMV0/LTE6MH1mdW5jdGlvbiB1KGEsYixjKXtyZXR1cm4gcygoYlswXS1hWzBdKSooY1sxXS1hWzFdKS0oY1swXS1hWzBdKSooYlsxXS1hWzFdKSwwKX1mdW5jdGlvbiB2KGEsYil7dmFyIGM9YlswXS1hWzBdLGQ9YlsxXS1hWzFdO3JldHVybiBjKmMrZCpkfWZ1bmN0aW9uIHcoYSxiKXt2YXIgYz1iO2Zvcih2YXIgZCBpbiBhKXt2YXIgZT11KGIsYyxhW2RdKTsoLTE9PT1lfHwwPT09ZSYmdihiLGFbZF0pPnYoYixjKSkmJihjPWFbZF0pfXJldHVybiBjfWZ1bmN0aW9uIHgoYSl7aWYoMD09PWEubGVuZ3RoKXJldHVybltdO2lmKDE9PT1hLmxlbmd0aClyZXR1cm4gYTtmb3IodmFyIGI9W2Euc29ydCh0KVswXV0sYz0wO2M8Yi5sZW5ndGg7YysrKXt2YXIgZD13KGEsYltjXSk7ZCE9PWJbMF0mJmIucHVzaChkKX1yZXR1cm4gYn1mdW5jdGlvbiB5KGEsYil7Zm9yKHZhciBjPSExLGQ9LTEsZT1hLmxlbmd0aCxmPWUtMTsrK2Q8ZTtmPWQpKGFbZF1bMV08PWJbMV0mJmJbMV08YVtmXVsxXXx8YVtmXVsxXTw9YlsxXSYmYlsxXTxhW2RdWzFdKSYmYlswXTwoYVtmXVswXS1hW2RdWzBdKSooYlsxXS1hW2RdWzFdKS8oYVtmXVsxXS1hW2RdWzFdKSthW2RdWzBdJiYoYz0hYyk7cmV0dXJuIGN9ZnVuY3Rpb24geihhLGIpe2lmKGEmJmEubGVuZ3RoKXtpZigxPT09YS5sZW5ndGgpcmV0dXJuIHkoYVswXSxiKTtpZih5KGFbMF0sYikpe2Zvcih2YXIgYz0xO2M8YS5sZW5ndGg7YysrKWlmKHkoYVtjXSxiKSlyZXR1cm4hMTtyZXR1cm4hMH1yZXR1cm4hMX1yZXR1cm4hMX1mdW5jdGlvbiBBKGEsYixjLGQpe3ZhciBlPShkWzBdLWNbMF0pKihhWzFdLWNbMV0pLShkWzFdLWNbMV0pKihhWzBdLWNbMF0pLGY9KGJbMF0tYVswXSkqKGFbMV0tY1sxXSktKGJbMV0tYVsxXSkqKGFbMF0tY1swXSksZz0oZFsxXS1jWzFdKSooYlswXS1hWzBdKS0oZFswXS1jWzBdKSooYlsxXS1hWzFdKTtpZigwIT09Zyl7dmFyIGg9ZS9nLGk9Zi9nO2lmKGg+PTAmJjE+PWgmJmk+PTAmJjE+PWkpcmV0dXJuITB9cmV0dXJuITF9ZnVuY3Rpb24gQihhLGIpe2Zvcih2YXIgYz0wO2M8YS5sZW5ndGgtMTtjKyspZm9yKHZhciBkPTA7ZDxiLmxlbmd0aC0xO2QrKylpZihBKGFbY10sYVtjKzFdLGJbZF0sYltkKzFdKSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBDKGEsYil7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspZm9yKHZhciBkPWJbY10sZT0wO2U8ZC5sZW5ndGgtMTtlKyspZm9yKHZhciBmPTA7ZjxhLmxlbmd0aC0xO2YrKylpZihBKGRbZV0sZFtlKzFdLGFbZl0sYVtmKzFdKSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBEKGEsYil7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspaWYoQyhhW2NdLGIpKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIEUoYSxiKXtmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKylyZXR1cm4gQyhhLGJbY10pPyEwOiExfWZ1bmN0aW9uIEYoYSxiKXtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylyZXR1cm4gRShhW2NdLGIpPyEwOiExfWZ1bmN0aW9uIEcoYSxiKXtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylyZXR1cm4gRihhW2NdLGIpPyEwOiExfWZ1bmN0aW9uIEgoYSl7Zm9yKHZhciBiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXS5zbGljZSgpO0koZFswXSxkW2QubGVuZ3RoLTFdKT09PSExJiZkLnB1c2goZFswXSksYi5wdXNoKGQpfXJldHVybiBifWZ1bmN0aW9uIEkoYSxiKXtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylmb3IodmFyIGQ9MDtkPGIubGVuZ3RoO2QrKylpZihhW2NdIT09YltkXSlyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiBKKGEsYil7aWYoYS5sZW5ndGghPT1iLmxlbmd0aClyZXR1cm4hMTtmb3IodmFyIGM9YS5zbGljZSgpLnNvcnQodCksZD1iLnNsaWNlKCkuc29ydCh0KSxlPTA7ZTxjLmxlbmd0aDtlKyspe2lmKGNbZV0ubGVuZ3RoIT09ZFtlXS5sZW5ndGgpcmV0dXJuITE7Zm9yKHZhciBmPTA7ZjxjLmxlbmd0aDtmKyspaWYoY1tlXVtmXSE9PWRbZV1bZl0pcmV0dXJuITF9cmV0dXJuITB9ZnVuY3Rpb24gSyhhKXtpZihhKXN3aXRjaChhLnR5cGUpe2Nhc2UiUG9pbnQiOnJldHVybiBuZXcgTChhKTtjYXNlIk11bHRpUG9pbnQiOnJldHVybiBuZXcgTShhKTtjYXNlIkxpbmVTdHJpbmciOnJldHVybiBuZXcgTihhKTtjYXNlIk11bHRpTGluZVN0cmluZyI6cmV0dXJuIG5ldyBPKGEpO2Nhc2UiUG9seWdvbiI6cmV0dXJuIG5ldyBQKGEpO2Nhc2UiTXVsdGlQb2x5Z29uIjpyZXR1cm4gbmV3IFEoYSk7Y2FzZSJGZWF0dXJlIjpyZXR1cm4gbmV3IFIoYSk7Y2FzZSJGZWF0dXJlQ29sbGVjdGlvbiI6cmV0dXJuIG5ldyBTKGEpO2Nhc2UiR2VvbWV0cnlDb2xsZWN0aW9uIjpyZXR1cm4gbmV3IFQoYSk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gdHlwZTogIithLnR5cGUpfX1mdW5jdGlvbiBMKGEpe3ZhciBjPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7aWYoYSYmIlBvaW50Ij09PWEudHlwZSYmYS5jb29yZGluYXRlcyliKHRoaXMsYSk7ZWxzZSBpZihhJiYiW29iamVjdCBBcnJheV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGEpKXRoaXMuY29vcmRpbmF0ZXM9YTtlbHNle2lmKCEoYy5sZW5ndGg+PTIpKXRocm93IlRlcnJhZm9ybWVyOiBpbnZhbGlkIGlucHV0IGZvciBUZXJyYWZvcm1lci5Qb2ludCI7dGhpcy5jb29yZGluYXRlcz1jfXRoaXMudHlwZT0iUG9pbnQifWZ1bmN0aW9uIE0oYSl7aWYoYSYmIk11bHRpUG9pbnQiPT09YS50eXBlJiZhLmNvb3JkaW5hdGVzKWIodGhpcyxhKTtlbHNle2lmKCFBcnJheS5pc0FycmF5KGEpKXRocm93IlRlcnJhZm9ybWVyOiBpbnZhbGlkIGlucHV0IGZvciBUZXJyYWZvcm1lci5NdWx0aVBvaW50Ijt0aGlzLmNvb3JkaW5hdGVzPWF9dGhpcy50eXBlPSJNdWx0aVBvaW50In1mdW5jdGlvbiBOKGEpe2lmKGEmJiJMaW5lU3RyaW5nIj09PWEudHlwZSYmYS5jb29yZGluYXRlcyliKHRoaXMsYSk7ZWxzZXtpZighQXJyYXkuaXNBcnJheShhKSl0aHJvdyJUZXJyYWZvcm1lcjogaW52YWxpZCBpbnB1dCBmb3IgVGVycmFmb3JtZXIuTGluZVN0cmluZyI7dGhpcy5jb29yZGluYXRlcz1hfXRoaXMudHlwZT0iTGluZVN0cmluZyJ9ZnVuY3Rpb24gTyhhKXtpZihhJiYiTXVsdGlMaW5lU3RyaW5nIj09PWEudHlwZSYmYS5jb29yZGluYXRlcyliKHRoaXMsYSk7ZWxzZXtpZighQXJyYXkuaXNBcnJheShhKSl0aHJvdyJUZXJyYWZvcm1lcjogaW52YWxpZCBpbnB1dCBmb3IgVGVycmFmb3JtZXIuTXVsdGlMaW5lU3RyaW5nIjt0aGlzLmNvb3JkaW5hdGVzPWF9dGhpcy50eXBlPSJNdWx0aUxpbmVTdHJpbmcifWZ1bmN0aW9uIFAoYSl7aWYoYSYmIlBvbHlnb24iPT09YS50eXBlJiZhLmNvb3JkaW5hdGVzKWIodGhpcyxhKTtlbHNle2lmKCFBcnJheS5pc0FycmF5KGEpKXRocm93IlRlcnJhZm9ybWVyOiBpbnZhbGlkIGlucHV0IGZvciBUZXJyYWZvcm1lci5Qb2x5Z29uIjt0aGlzLmNvb3JkaW5hdGVzPWF9dGhpcy50eXBlPSJQb2x5Z29uIn1mdW5jdGlvbiBRKGEpe2lmKGEmJiJNdWx0aVBvbHlnb24iPT09YS50eXBlJiZhLmNvb3JkaW5hdGVzKWIodGhpcyxhKTtlbHNle2lmKCFBcnJheS5pc0FycmF5KGEpKXRocm93IlRlcnJhZm9ybWVyOiBpbnZhbGlkIGlucHV0IGZvciBUZXJyYWZvcm1lci5NdWx0aVBvbHlnb24iO3RoaXMuY29vcmRpbmF0ZXM9YX10aGlzLnR5cGU9Ik11bHRpUG9seWdvbiJ9ZnVuY3Rpb24gUihhKXtpZihhJiYiRmVhdHVyZSI9PT1hLnR5cGUmJmEuZ2VvbWV0cnkpYih0aGlzLGEpO2Vsc2V7aWYoIShhJiZhLnR5cGUmJmEuY29vcmRpbmF0ZXMpKXRocm93IlRlcnJhZm9ybWVyOiBpbnZhbGlkIGlucHV0IGZvciBUZXJyYWZvcm1lci5GZWF0dXJlIjt0aGlzLmdlb21ldHJ5PWF9dGhpcy50eXBlPSJGZWF0dXJlIn1mdW5jdGlvbiBTKGEpe2lmKGEmJiJGZWF0dXJlQ29sbGVjdGlvbiI9PT1hLnR5cGUmJmEuZmVhdHVyZXMpYih0aGlzLGEpO2Vsc2V7aWYoIUFycmF5LmlzQXJyYXkoYSkpdGhyb3ciVGVycmFmb3JtZXI6IGludmFsaWQgaW5wdXQgZm9yIFRlcnJhZm9ybWVyLkZlYXR1cmVDb2xsZWN0aW9uIjt0aGlzLmZlYXR1cmVzPWF9dGhpcy50eXBlPSJGZWF0dXJlQ29sbGVjdGlvbiJ9ZnVuY3Rpb24gVChhKXtpZihhJiYiR2VvbWV0cnlDb2xsZWN0aW9uIj09PWEudHlwZSYmYS5nZW9tZXRyaWVzKWIodGhpcyxhKTtlbHNlIGlmKEFycmF5LmlzQXJyYXkoYSkpdGhpcy5nZW9tZXRyaWVzPWE7ZWxzZXtpZighYS5jb29yZGluYXRlc3x8IWEudHlwZSl0aHJvdyJUZXJyYWZvcm1lcjogaW52YWxpZCBpbnB1dCBmb3IgVGVycmFmb3JtZXIuR2VvbWV0cnlDb2xsZWN0aW9uIjt0aGlzLnR5cGU9Ikdlb21ldHJ5Q29sbGVjdGlvbiIsdGhpcy5nZW9tZXRyaWVzPVthXX10aGlzLnR5cGU9Ikdlb21ldHJ5Q29sbGVjdGlvbiJ9ZnVuY3Rpb24gVShhLGIsYyl7Zm9yKHZhciBkPW8oYSksZT1jfHw2NCxmPXt0eXBlOiJQb2x5Z29uIixjb29yZGluYXRlczpbW11dfSxnPTE7ZT49ZztnKyspe3ZhciBoPWcqKDM2MC9lKSpNYXRoLlBJLzE4MDtmLmNvb3JkaW5hdGVzWzBdLnB1c2goW2RbMF0rYipNYXRoLmNvcyhoKSxkWzFdK2IqTWF0aC5zaW4oaCldKX1yZXR1cm4gcihmKX1mdW5jdGlvbiBWKGEsYyxkKXt2YXIgZT1kfHw2NCxmPWN8fDI1MDtpZighYXx8YS5sZW5ndGg8Mnx8IWZ8fCFlKXRocm93IG5ldyBFcnJvcigiVGVycmFmb3JtZXI6IG1pc3NpbmcgcGFyYW1ldGVyIGZvciBUZXJyYWZvcm1lci5DaXJjbGUiKTtiKHRoaXMsbmV3IFIoe3R5cGU6IkZlYXR1cmUiLGdlb21ldHJ5OlUoYSxmLGUpLHByb3BlcnRpZXM6e3JhZGl1czpmLGNlbnRlcjphLHN0ZXBzOmV9fSkpfXZhciBXPXt9LFg9NjM3ODEzNyxZPTU3LjI5NTc3OTUxMzA4MjMyLFo9LjAxNzQ1MzI5MjUxOTk0MywkPXt0eXBlOiJsaW5rIixwcm9wZXJ0aWVzOntocmVmOiJodHRwOi8vc3BhdGlhbHJlZmVyZW5jZS5vcmcvcmVmL3NyLW9yZy82OTI4L29nY3drdC8iLHR5cGU6Im9nY3drdCJ9fSxfPXt0eXBlOiJsaW5rIixwcm9wZXJ0aWVzOntocmVmOiJodHRwOi8vc3BhdGlhbHJlZmVyZW5jZS5vcmcvcmVmL2Vwc2cvNDMyNi9vZ2N3a3QvIix0eXBlOiJvZ2N3a3QifX0sYWI9WyJsZW5ndGgiXTtyZXR1cm4gSy5wcm90b3R5cGUudG9NZXJjYXRvcj1mdW5jdGlvbigpe3JldHVybiBxKHRoaXMpfSxLLnByb3RvdHlwZS50b0dlb2dyYXBoaWM9ZnVuY3Rpb24oKXtyZXR1cm4gcih0aGlzKX0sSy5wcm90b3R5cGUuZW52ZWxvcGU9ZnVuY3Rpb24oKXtyZXR1cm4gaSh0aGlzKX0sSy5wcm90b3R5cGUuYmJveD1mdW5jdGlvbigpe3JldHVybiBjKHRoaXMpfSxLLnByb3RvdHlwZS5jb252ZXhIdWxsPWZ1bmN0aW9uKCl7dmFyIGEsYixjPVtdO2lmKCJQb2ludCI9PT10aGlzLnR5cGUpcmV0dXJuIHRoaXMuY29vcmRpbmF0ZXMmJnRoaXMuY29vcmRpbmF0ZXMubGVuZ3RoPjA/W3RoaXMuY29vcmRpbmF0ZXNdOltdO2lmKCJMaW5lU3RyaW5nIj09PXRoaXMudHlwZXx8Ik11bHRpUG9pbnQiPT09dGhpcy50eXBlKXtpZighKHRoaXMuY29vcmRpbmF0ZXMmJnRoaXMuY29vcmRpbmF0ZXMubGVuZ3RoPjApKXJldHVybltdO2M9dGhpcy5jb29yZGluYXRlc31lbHNlIGlmKCJQb2x5Z29uIj09PXRoaXMudHlwZXx8Ik11bHRpTGluZVN0cmluZyI9PT10aGlzLnR5cGUpe2lmKCEodGhpcy5jb29yZGluYXRlcyYmdGhpcy5jb29yZGluYXRlcy5sZW5ndGg+MCkpcmV0dXJuW107Zm9yKGE9MDthPHRoaXMuY29vcmRpbmF0ZXMubGVuZ3RoO2ErKyljPWMuY29uY2F0KHRoaXMuY29vcmRpbmF0ZXNbYV0pfWVsc2V7aWYoIk11bHRpUG9seWdvbiIhPT10aGlzLnR5cGUpdGhyb3cgbmV3IEVycm9yKCJVbmFibGUgdG8gZ2V0IGNvbnZleCBodWxsIG9mICIrdGhpcy50eXBlKTtpZighKHRoaXMuY29vcmRpbmF0ZXMmJnRoaXMuY29vcmRpbmF0ZXMubGVuZ3RoPjApKXJldHVybltdO2ZvcihhPTA7YTx0aGlzLmNvb3JkaW5hdGVzLmxlbmd0aDthKyspZm9yKGI9MDtiPHRoaXMuY29vcmRpbmF0ZXNbYV0ubGVuZ3RoO2IrKyljPWMuY29uY2F0KHRoaXMuY29vcmRpbmF0ZXNbYV1bYl0pfXJldHVybiB4KGMpfSxLLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXt2YXIgYT17fTtmb3IodmFyIGIgaW4gdGhpcyl0aGlzLmhhc093blByb3BlcnR5KGIpJiYtMT09PWFiLmluZGV4T2YoYikmJihhW2JdPXRoaXNbYl0pO3JldHVybiBhLmJib3g9Yyh0aGlzKSxhfSxLLnByb3RvdHlwZS53aXRoaW49ZnVuY3Rpb24oYSl7dmFyIGIsYyxkO2lmKCJQb2ludCI9PT1hLnR5cGUmJiJQb2ludCI9PT10aGlzLnR5cGUpcmV0dXJuIEkodGhpcy5jb29yZGluYXRlcyxhLmNvb3JkaW5hdGVzKTtpZigiTXVsdGlMaW5lU3RyaW5nIj09PWEudHlwZSYmIlBvaW50Ij09PXRoaXMudHlwZSlmb3IoYz0wO2M8YS5jb29yZGluYXRlcy5sZW5ndGg7YysrKXt2YXIgZT17dHlwZToiTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6YS5jb29yZGluYXRlc1tjXX07aWYodGhpcy53aXRoaW4oZSkpcmV0dXJuITB9aWYoKCJMaW5lU3RyaW5nIj09PWEudHlwZXx8Ik11bHRpUG9pbnQiPT09YS50eXBlKSYmIlBvaW50Ij09PXRoaXMudHlwZSlmb3IoYz0wO2M8YS5jb29yZGluYXRlcy5sZW5ndGg7YysrKXtpZih0aGlzLmNvb3JkaW5hdGVzLmxlbmd0aCE9PWEuY29vcmRpbmF0ZXNbY10ubGVuZ3RoKXJldHVybiExO2lmKEkodGhpcy5jb29yZGluYXRlcyxhLmNvb3JkaW5hdGVzW2NdKSlyZXR1cm4hMH1pZigiUG9seWdvbiI9PT1hLnR5cGUpe2lmKCJQb2x5Z29uIj09PXRoaXMudHlwZSl7aWYoYS5jb29yZGluYXRlcy5sZW5ndGg9PT10aGlzLmNvb3JkaW5hdGVzLmxlbmd0aClmb3IoYz0wO2M8dGhpcy5jb29yZGluYXRlcy5sZW5ndGg7YysrKWlmKEoodGhpcy5jb29yZGluYXRlc1tjXSxhLmNvb3JkaW5hdGVzW2NdKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5jb29yZGluYXRlcy5sZW5ndGgmJnooYS5jb29yZGluYXRlcyx0aGlzLmNvb3JkaW5hdGVzWzBdWzBdKT8hRChIKHRoaXMuY29vcmRpbmF0ZXMpLEgoYS5jb29yZGluYXRlcykpOiExfWlmKCJQb2ludCI9PT10aGlzLnR5cGUpcmV0dXJuIHooYS5jb29yZGluYXRlcyx0aGlzLmNvb3JkaW5hdGVzKTtpZigiTGluZVN0cmluZyI9PT10aGlzLnR5cGV8fCJNdWx0aVBvaW50Ij09PXRoaXMudHlwZSl7aWYoIXRoaXMuY29vcmRpbmF0ZXN8fDA9PT10aGlzLmNvb3JkaW5hdGVzLmxlbmd0aClyZXR1cm4hMTtmb3IoYz0wO2M8dGhpcy5jb29yZGluYXRlcy5sZW5ndGg7YysrKWlmKHooYS5jb29yZGluYXRlcyx0aGlzLmNvb3JkaW5hdGVzW2NdKT09PSExKXJldHVybiExO3JldHVybiEwfWlmKCJNdWx0aUxpbmVTdHJpbmciPT09dGhpcy50eXBlKXtmb3IoYz0wO2M8dGhpcy5jb29yZGluYXRlcy5sZW5ndGg7YysrKXt2YXIgZj1uZXcgTih0aGlzLmNvb3JkaW5hdGVzW2NdKTtpZihmLndpdGhpbihhKT09PSExKXJldHVybiBkKyssITF9cmV0dXJuITB9aWYoIk11bHRpUG9seWdvbiI9PT10aGlzLnR5cGUpe2ZvcihjPTA7Yzx0aGlzLmNvb3JkaW5hdGVzLmxlbmd0aDtjKyspe3ZhciBnPW5ldyBLKHt0eXBlOiJQb2x5Z29uIixjb29yZGluYXRlczp0aGlzLmNvb3JkaW5hdGVzW2NdfSk7aWYoZy53aXRoaW4oYSk9PT0hMSlyZXR1cm4hMX1yZXR1cm4hMH19aWYoIk11bHRpUG9seWdvbiI9PT1hLnR5cGUpe2lmKCJQb2ludCI9PT10aGlzLnR5cGUpe2lmKGEuY29vcmRpbmF0ZXMubGVuZ3RoKWZvcihjPTA7YzxhLmNvb3JkaW5hdGVzLmxlbmd0aDtjKyspaWYoYj1hLmNvb3JkaW5hdGVzW2NdLHooYix0aGlzLmNvb3JkaW5hdGVzKSYmRCh0aGlzLmNvb3JkaW5hdGVzLGEuY29vcmRpbmF0ZXMpPT09ITEpcmV0dXJuITA7cmV0dXJuITF9aWYoIlBvbHlnb24iPT09dGhpcy50eXBlKXtmb3IoYz0wO2M8dGhpcy5jb29yZGluYXRlcy5sZW5ndGg7YysrKWlmKGEuY29vcmRpbmF0ZXNbY10ubGVuZ3RoPT09dGhpcy5jb29yZGluYXRlcy5sZW5ndGgpZm9yKGo9MDtqPHRoaXMuY29vcmRpbmF0ZXMubGVuZ3RoO2orKylpZihKKHRoaXMuY29vcmRpbmF0ZXNbal0sYS5jb29yZGluYXRlc1tjXVtqXSkpcmV0dXJuITA7aWYoRih0aGlzLmNvb3JkaW5hdGVzLGEuY29vcmRpbmF0ZXMpPT09ITEmJmEuY29vcmRpbmF0ZXMubGVuZ3RoKXtmb3IoYz0wO2M8YS5jb29yZGluYXRlcy5sZW5ndGg7YysrKWI9YS5jb29yZGluYXRlc1tjXSxkPXooYix0aGlzLmNvb3JkaW5hdGVzWzBdWzBdKT09PSExPyExOiEwO3JldHVybiBkfX1lbHNlIGlmKCJMaW5lU3RyaW5nIj09PXRoaXMudHlwZXx8Ik11bHRpUG9pbnQiPT09dGhpcy50eXBlKWZvcihjPTA7YzxhLmNvb3JkaW5hdGVzLmxlbmd0aDtjKyspe3ZhciBoPXt0eXBlOiJQb2x5Z29uIixjb29yZGluYXRlczphLmNvb3JkaW5hdGVzW2NdfTtyZXR1cm4gdGhpcy53aXRoaW4oaCk/ITA6ITF9ZWxzZXtpZigiTXVsdGlMaW5lU3RyaW5nIj09PXRoaXMudHlwZSl7Zm9yKGM9MDtjPHRoaXMuY29vcmRpbmF0ZXMubGVuZ3RoO2MrKyl7dmFyIGk9bmV3IE4odGhpcy5jb29yZGluYXRlc1tjXSk7aWYoaS53aXRoaW4oYSk9PT0hMSlyZXR1cm4hMX1yZXR1cm4hMH1pZigiTXVsdGlQb2x5Z29uIj09PXRoaXMudHlwZSl7Zm9yKGM9MDtjPGEuY29vcmRpbmF0ZXMubGVuZ3RoO2MrKyl7dmFyIGs9e3R5cGU6IlBvbHlnb24iLGNvb3JkaW5hdGVzOmEuY29vcmRpbmF0ZXNbY119O2lmKHRoaXMud2l0aGluKGspPT09ITEpcmV0dXJuITF9cmV0dXJuITB9fX1yZXR1cm4hMX0sSy5wcm90b3R5cGUuaW50ZXJzZWN0cz1mdW5jdGlvbihiKXsiRmVhdHVyZSI9PT1iLnR5cGUmJihiPWIuZ2VvbWV0cnkpO3ZhciBjPW5ldyBLKGIpO2lmKHRoaXMud2l0aGluKGIpfHxjLndpdGhpbih0aGlzKSlyZXR1cm4hMDtpZigiTGluZVN0cmluZyI9PT10aGlzLnR5cGUpe2lmKCJMaW5lU3RyaW5nIj09PWIudHlwZSlyZXR1cm4gQih0aGlzLmNvb3JkaW5hdGVzLGIuY29vcmRpbmF0ZXMpO2lmKCJNdWx0aUxpbmVTdHJpbmciPT09Yi50eXBlKXJldHVybiBDKHRoaXMuY29vcmRpbmF0ZXMsYi5jb29yZGluYXRlcyk7aWYoIlBvbHlnb24iPT09Yi50eXBlKXJldHVybiBDKHRoaXMuY29vcmRpbmF0ZXMsSChiLmNvb3JkaW5hdGVzKSk7aWYoIk11bHRpUG9seWdvbiI9PT1iLnR5cGUpcmV0dXJuIEUodGhpcy5jb29yZGluYXRlcyxiLmNvb3JkaW5hdGVzKX1lbHNlIGlmKCJNdWx0aUxpbmVTdHJpbmciPT09dGhpcy50eXBlKXtpZigiTGluZVN0cmluZyI9PT1iLnR5cGUpcmV0dXJuIEMoYi5jb29yZGluYXRlcyx0aGlzLmNvb3JkaW5hdGVzKTtpZigiUG9seWdvbiI9PT1iLnR5cGV8fCJNdWx0aUxpbmVTdHJpbmciPT09Yi50eXBlKXJldHVybiBEKHRoaXMuY29vcmRpbmF0ZXMsYi5jb29yZGluYXRlcyk7aWYoIk11bHRpUG9seWdvbiI9PT1iLnR5cGUpcmV0dXJuIEYodGhpcy5jb29yZGluYXRlcyxiLmNvb3JkaW5hdGVzKX1lbHNlIGlmKCJQb2x5Z29uIj09PXRoaXMudHlwZSl7aWYoIkxpbmVTdHJpbmciPT09Yi50eXBlKXJldHVybiBDKGIuY29vcmRpbmF0ZXMsSCh0aGlzLmNvb3JkaW5hdGVzKSk7aWYoIk11bHRpTGluZVN0cmluZyI9PT1iLnR5cGUpcmV0dXJuIEQoSCh0aGlzLmNvb3JkaW5hdGVzKSxiLmNvb3JkaW5hdGVzKTtpZigiUG9seWdvbiI9PT1iLnR5cGUpcmV0dXJuIEQoSCh0aGlzLmNvb3JkaW5hdGVzKSxIKGIuY29vcmRpbmF0ZXMpKTtpZigiTXVsdGlQb2x5Z29uIj09PWIudHlwZSlyZXR1cm4gRihIKHRoaXMuY29vcmRpbmF0ZXMpLGIuY29vcmRpbmF0ZXMpfWVsc2UgaWYoIk11bHRpUG9seWdvbiI9PT10aGlzLnR5cGUpe2lmKCJMaW5lU3RyaW5nIj09PWIudHlwZSlyZXR1cm4gRShiLmNvb3JkaW5hdGVzLHRoaXMuY29vcmRpbmF0ZXMpO2lmKCJQb2x5Z29uIj09PWIudHlwZXx8Ik11bHRpTGluZVN0cmluZyI9PT1iLnR5cGUpcmV0dXJuIEYoSChiLmNvb3JkaW5hdGVzKSx0aGlzLmNvb3JkaW5hdGVzKTtpZigiTXVsdGlQb2x5Z29uIj09PWIudHlwZSlyZXR1cm4gRyh0aGlzLmNvb3JkaW5hdGVzLGIuY29vcmRpbmF0ZXMpfWVsc2UgaWYoIkZlYXR1cmUiPT09dGhpcy50eXBlKXt2YXIgZD1uZXcgSyh0aGlzLmdlb21ldHJ5KTtyZXR1cm4gZC5pbnRlcnNlY3RzKGIpfXJldHVybiBhKCJUeXBlICIrdGhpcy50eXBlKyIgdG8gIitiLnR5cGUrIiBpbnRlcnNlY3Rpb24gaXMgbm90IHN1cHBvcnRlZCBieSBpbnRlcnNlY3RzIiksITF9LEwucHJvdG90eXBlPW5ldyBLLEwucHJvdG90eXBlLmNvbnN0cnVjdG9yPUwsTS5wcm90b3R5cGU9bmV3IEssTS5wcm90b3R5cGUuY29uc3RydWN0b3I9TSxNLnByb3RvdHlwZS5mb3JFYWNoPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5jb29yZGluYXRlcy5sZW5ndGg7YisrKWEuYXBwbHkodGhpcyxbdGhpcy5jb29yZGluYXRlc1tiXSxiLHRoaXMuY29vcmRpbmF0ZXNdKTtyZXR1cm4gdGhpc30sTS5wcm90b3R5cGUuYWRkUG9pbnQ9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuY29vcmRpbmF0ZXMucHVzaChhKSx0aGlzfSxNLnByb3RvdHlwZS5pbnNlcnRQb2ludD1mdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmNvb3JkaW5hdGVzLnNwbGljZShiLDAsYSksdGhpc30sTS5wcm90b3R5cGUucmVtb3ZlUG9pbnQ9ZnVuY3Rpb24oYSl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiBhP3RoaXMuY29vcmRpbmF0ZXMuc3BsaWNlKGEsMSk6dGhpcy5jb29yZGluYXRlcy5zcGxpY2UodGhpcy5jb29yZGluYXRlcy5pbmRleE9mKGEpLDEpLHRoaXN9LE0ucHJvdG90eXBlLmdldD1mdW5jdGlvbihhKXtyZXR1cm4gbmV3IEwodGhpcy5jb29yZGluYXRlc1thXSl9LE4ucHJvdG90eXBlPW5ldyBLLE4ucHJvdG90eXBlLmNvbnN0cnVjdG9yPU4sTi5wcm90b3R5cGUuYWRkVmVydGV4PWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmNvb3JkaW5hdGVzLnB1c2goYSksdGhpc30sTi5wcm90b3R5cGUuaW5zZXJ0VmVydGV4PWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuY29vcmRpbmF0ZXMuc3BsaWNlKGIsMCxhKSx0aGlzfSxOLnByb3RvdHlwZS5yZW1vdmVWZXJ0ZXg9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuY29vcmRpbmF0ZXMuc3BsaWNlKGEsMSksdGhpc30sTy5wcm90b3R5cGU9bmV3IEssTy5wcm90b3R5cGUuY29uc3RydWN0b3I9TyxPLnByb3RvdHlwZS5mb3JFYWNoPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5jb29yZGluYXRlcy5sZW5ndGg7YisrKWEuYXBwbHkodGhpcyxbdGhpcy5jb29yZGluYXRlc1tiXSxiLHRoaXMuY29vcmRpbmF0ZXNdKX0sTy5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKGEpe3JldHVybiBuZXcgTih0aGlzLmNvb3JkaW5hdGVzW2FdKX0sUC5wcm90b3R5cGU9bmV3IEssUC5wcm90b3R5cGUuY29uc3RydWN0b3I9UCxQLnByb3RvdHlwZS5hZGRWZXJ0ZXg9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuY29vcmRpbmF0ZXNbMF0ucHVzaChhKSx0aGlzfSxQLnByb3RvdHlwZS5pbnNlcnRWZXJ0ZXg9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5jb29yZGluYXRlc1swXS5zcGxpY2UoYiwwLGEpLHRoaXN9LFAucHJvdG90eXBlLnJlbW92ZVZlcnRleD1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5jb29yZGluYXRlc1swXS5zcGxpY2UoYSwxKSx0aGlzfSxQLnByb3RvdHlwZS5jbG9zZT1mdW5jdGlvbigpe3RoaXMuY29vcmRpbmF0ZXM9SCh0aGlzLmNvb3JkaW5hdGVzKX0sUS5wcm90b3R5cGU9bmV3IEssUS5wcm90b3R5cGUuY29uc3RydWN0b3I9USxRLnByb3RvdHlwZS5mb3JFYWNoPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5jb29yZGluYXRlcy5sZW5ndGg7YisrKWEuYXBwbHkodGhpcyxbdGhpcy5jb29yZGluYXRlc1tiXSxiLHRoaXMuY29vcmRpbmF0ZXNdKX0sUS5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKGEpe3JldHVybiBuZXcgUCh0aGlzLmNvb3JkaW5hdGVzW2FdKX0sUi5wcm90b3R5cGU9bmV3IEssUi5wcm90b3R5cGUuY29uc3RydWN0b3I9UixTLnByb3RvdHlwZT1uZXcgSyxTLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1TLFMucHJvdG90eXBlLmZvckVhY2g9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPTA7Yjx0aGlzLmZlYXR1cmVzLmxlbmd0aDtiKyspYS5hcHBseSh0aGlzLFt0aGlzLmZlYXR1cmVzW2JdLGIsdGhpcy5mZWF0dXJlc10pfSxTLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24oYSl7dmFyIGI7cmV0dXJuIHRoaXMuZm9yRWFjaChmdW5jdGlvbihjKXtjLmlkPT09YSYmKGI9Yyl9KSxuZXcgUihiKX0sVC5wcm90b3R5cGU9bmV3IEssVC5wcm90b3R5cGUuY29uc3RydWN0b3I9VCxULnByb3RvdHlwZS5mb3JFYWNoPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5nZW9tZXRyaWVzLmxlbmd0aDtiKyspYS5hcHBseSh0aGlzLFt0aGlzLmdlb21ldHJpZXNbYl0sYix0aGlzLmdlb21ldHJpZXNdKX0sVC5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKGEpe3JldHVybiBuZXcgSyh0aGlzLmdlb21ldHJpZXNbYV0pfSxWLnByb3RvdHlwZT1uZXcgSyxWLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1WLFYucHJvdG90eXBlLnJlY2FsY3VsYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2VvbWV0cnk9VSh0aGlzLnByb3BlcnRpZXMuY2VudGVyLHRoaXMucHJvcGVydGllcy5yYWRpdXMsdGhpcy5wcm9wZXJ0aWVzLnN0ZXBzKSx0aGlzfSxWLnByb3RvdHlwZS5jZW50ZXI9ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJih0aGlzLnByb3BlcnRpZXMuY2VudGVyPWEsdGhpcy5yZWNhbGN1bGF0ZSgpKSx0aGlzLnByb3BlcnRpZXMuY2VudGVyfSxWLnByb3RvdHlwZS5yYWRpdXM9ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJih0aGlzLnByb3BlcnRpZXMucmFkaXVzPWEsdGhpcy5yZWNhbGN1bGF0ZSgpKSx0aGlzLnByb3BlcnRpZXMucmFkaXVzfSxWLnByb3RvdHlwZS5zdGVwcz1mdW5jdGlvbihhKXtyZXR1cm4gYSYmKHRoaXMucHJvcGVydGllcy5zdGVwcz1hLHRoaXMucmVjYWxjdWxhdGUoKSksdGhpcy5wcm9wZXJ0aWVzLnN0ZXBzfSxWLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXt2YXIgYT1LLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzKTtyZXR1cm4gYX0sVy5QcmltaXRpdmU9SyxXLlBvaW50PUwsVy5NdWx0aVBvaW50PU0sVy5MaW5lU3RyaW5nPU4sVy5NdWx0aUxpbmVTdHJpbmc9TyxXLlBvbHlnb249UCxXLk11bHRpUG9seWdvbj1RLFcuRmVhdHVyZT1SLFcuRmVhdHVyZUNvbGxlY3Rpb249UyxXLkdlb21ldHJ5Q29sbGVjdGlvbj1ULFcuQ2lyY2xlPVYsVy50b01lcmNhdG9yPXEsVy50b0dlb2dyYXBoaWM9cixXLlRvb2xzPXt9LFcuVG9vbHMucG9zaXRpb25Ub01lcmNhdG9yPW8sVy5Ub29scy5wb3NpdGlvblRvR2VvZ3JhcGhpYz1uLFcuVG9vbHMuYXBwbHlDb252ZXJ0ZXI9cCxXLlRvb2xzLnRvTWVyY2F0b3I9cSxXLlRvb2xzLnRvR2VvZ3JhcGhpYz1yLFcuVG9vbHMuY3JlYXRlQ2lyY2xlPVUsVy5Ub29scy5jYWxjdWxhdGVCb3VuZHM9YyxXLlRvb2xzLmNhbGN1bGF0ZUVudmVsb3BlPWksVy5Ub29scy5jb29yZGluYXRlc0NvbnRhaW5Qb2ludD15LFcuVG9vbHMucG9seWdvbkNvbnRhaW5zUG9pbnQ9eixXLlRvb2xzLmFycmF5SW50ZXJzZWN0c0FycmF5PUIsVy5Ub29scy5jb29yZGluYXRlc0NvbnRhaW5Qb2ludD15LFcuVG9vbHMuY29vcmRpbmF0ZXNFcXVhbD1KLFcuVG9vbHMuY29udmV4SHVsbD14LFcuTWVyY2F0b3JDUlM9JCxXLkdlb2dyYXBoaWNDUlM9XyxXfSksZnVuY3Rpb24oYSxiKXtpZigib2JqZWN0Ij09dHlwZW9mIG1vZHVsZSYmIm9iamVjdCI9PXR5cGVvZiBtb2R1bGUuZXhwb3J0cyYmKGV4cG9ydHM9bW9kdWxlLmV4cG9ydHM9YihyZXF1aXJlKCJ0ZXJyYWZvcm1lciIpKSksIm9iamVjdCI9PXR5cGVvZiBhLm5hdmlnYXRvcil7aWYoIWEuVGVycmFmb3JtZXIpdGhyb3cgbmV3IEVycm9yKCJUZXJyYWZvcm1lci5BcmNHSVMgcmVxdWlyZXMgdGhlIGNvcmUgVGVycmFmb3JtZXIgbGlicmFyeS4gaHR0cHM6Ly9naXRodWIuY29tL2VzcmkvVGVycmFmb3JtZXIiKTthLlRlcnJhZm9ybWVyLkFyY0dJUz1iKGEuVGVycmFmb3JtZXIpfX0odGhpcyxmdW5jdGlvbihUZXJyYWZvcm1lcil7ZnVuY3Rpb24gYShhKXt2YXIgYj17fTtmb3IodmFyIGMgaW4gYSlhLmhhc093blByb3BlcnR5KGMpJiYoYltjXT1hW2NdKTtyZXR1cm4gYn1mdW5jdGlvbiBiKGEpe3ZhciBiLGM9MCxkPTAsZT1hLmxlbmd0aCxmPWFbZF07Zm9yKGQ7ZS0xPmQ7ZCsrKWI9YVtkKzFdLGMrPShiWzBdLWZbMF0pKihiWzFdK2ZbMV0pLGY9YjtyZXR1cm4gYz49MH1mdW5jdGlvbiBjKGEpe3ZhciBjPVtdLGQ9YS5zbGljZSgwKSxlPWQuc2hpZnQoKS5zbGljZSgwKTtiKGUpfHxlLnJldmVyc2UoKSxjLnB1c2goZSk7Zm9yKHZhciBmPTA7ZjxkLmxlbmd0aDtmKyspe3ZhciBnPWRbZl0uc2xpY2UoMCk7YihnKSYmZy5yZXZlcnNlKCksYy5wdXNoKGcpfXJldHVybiBjfWZ1bmN0aW9uIGQoYSl7Zm9yKHZhciBiPVtdLGQ9MDtkPGEubGVuZ3RoO2QrKylmb3IodmFyIGU9YyhhW2RdKSxmPWUubGVuZ3RoLTE7Zj49MDtmLS0pe3ZhciBnPWVbZl0uc2xpY2UoMCk7Yi5wdXNoKGcpfXJldHVybiBifWZ1bmN0aW9uIGUoYSxiKXt2YXIgYz1UZXJyYWZvcm1lci5Ub29scy5hcnJheUludGVyc2VjdHNBcnJheShhLGIpLGQ9VGVycmFmb3JtZXIuVG9vbHMuY29vcmRpbmF0ZXNDb250YWluUG9pbnQoYSxiWzBdKTtyZXR1cm4hYyYmZD8hMDohMX1mdW5jdGlvbiBmKGEpe2Zvcih2YXIgYz1bXSxkPVtdLGY9MDtmPGEubGVuZ3RoO2YrKyl7dmFyIGc9YVtmXS5zbGljZSgwKTtpZihiKGcpKXt2YXIgaD1bZ107Yy5wdXNoKGgpfWVsc2UgZC5wdXNoKGcpfWZvcig7ZC5sZW5ndGg7KXtmb3IodmFyIGk9ZC5wb3AoKSxqPSExLGs9Yy5sZW5ndGgtMTtrPj0wO2stLSl7dmFyIGw9Y1trXVswXTtpZihlKGwsaSkpe2Nba10ucHVzaChpKSxqPSEwO2JyZWFrfX1qfHxjLnB1c2goW2kucmV2ZXJzZSgpXSl9cmV0dXJuIDE9PT1jLmxlbmd0aD97dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6Y1swXX06e3R5cGU6Ik11bHRpUG9seWdvbiIsY29vcmRpbmF0ZXM6Y319ZnVuY3Rpb24gZyhiKXt2YXIgYz17fTtiLngmJmIueSYmKGMudHlwZT0iUG9pbnQiLGMuY29vcmRpbmF0ZXM9W2IueCxiLnldKSxiLnBvaW50cyYmKGMudHlwZT0iTXVsdGlQb2ludCIsYy5jb29yZGluYXRlcz1iLnBvaW50cy5zbGljZSgwKSksYi5wYXRocyYmKDE9PT1iLnBhdGhzLmxlbmd0aD8oYy50eXBlPSJMaW5lU3RyaW5nIixjLmNvb3JkaW5hdGVzPWIucGF0aHNbMF0uc2xpY2UoMCkpOihjLnR5cGU9Ik11bHRpTGluZVN0cmluZyIsYy5jb29yZGluYXRlcz1iLnBhdGhzLnNsaWNlKDApKSksYi5yaW5ncyYmKGM9ZihiLnJpbmdzLnNsaWNlKDApKSksYi5nZW9tZXRyeSYmKGMudHlwZT0iRmVhdHVyZSIsYy5nZW9tZXRyeT1nKGIuZ2VvbWV0cnkpLGMucHJvcGVydGllcz1hKGIuYXR0cmlidXRlcyl8fHt9KTt2YXIgZD1iLmdlb21ldHJ5P2IuZ2VvbWV0cnkuc3BhdGlhbFJlZmVyZW5jZTpiLnNwYXRpYWxSZWZlcmVuY2U7cmV0dXJuIGQmJjEwMjEwMD09PWQud2tpZCYmKGM9VGVycmFmb3JtZXIudG9HZW9ncmFwaGljKGMpKSxuZXcgVGVycmFmb3JtZXIuUHJpbWl0aXZlKGMpfWZ1bmN0aW9uIGgoYixlKXt2YXIgZjtmPWU/ZTpiJiZiLmNycz09PVRlcnJhZm9ybWVyLk1lcmNhdG9yQ1JTP3t3a2lkOjEwMjEwMH06e3draWQ6NDMyNn07dmFyIGcsaT17fTtzd2l0Y2goYi50eXBlKXtjYXNlIlBvaW50IjppLng9Yi5jb29yZGluYXRlc1swXSxpLnk9Yi5jb29yZGluYXRlc1sxXSxpLnNwYXRpYWxSZWZlcmVuY2U9ZjticmVhaztjYXNlIk11bHRpUG9pbnQiOmkucG9pbnRzPWIuY29vcmRpbmF0ZXMuc2xpY2UoMCksaS5zcGF0aWFsUmVmZXJlbmNlPWY7YnJlYWs7Y2FzZSJMaW5lU3RyaW5nIjppLnBhdGhzPVtiLmNvb3JkaW5hdGVzLnNsaWNlKDApXSxpLnNwYXRpYWxSZWZlcmVuY2U9ZjticmVhaztjYXNlIk11bHRpTGluZVN0cmluZyI6aS5wYXRocz1iLmNvb3JkaW5hdGVzLnNsaWNlKDApLGkuc3BhdGlhbFJlZmVyZW5jZT1mO2JyZWFrO2Nhc2UiUG9seWdvbiI6aS5yaW5ncz1jKGIuY29vcmRpbmF0ZXMuc2xpY2UoMCkpLGkuc3BhdGlhbFJlZmVyZW5jZT1mO2JyZWFrO2Nhc2UiTXVsdGlQb2x5Z29uIjppLnJpbmdzPWQoYi5jb29yZGluYXRlcy5zbGljZSgwKSksaS5zcGF0aWFsUmVmZXJlbmNlPWY7YnJlYWs7Y2FzZSJGZWF0dXJlIjppLmdlb21ldHJ5PWgoYi5nZW9tZXRyeSksaS5hdHRyaWJ1dGVzPWEoYi5wcm9wZXJ0aWVzKTticmVhaztjYXNlIkZlYXR1cmVDb2xsZWN0aW9uIjpmb3IoaT1bXSxnPTA7ZzxiLmZlYXR1cmVzLmxlbmd0aDtnKyspaS5wdXNoKGgoYi5mZWF0dXJlc1tnXSkpO2JyZWFrO2Nhc2UiR2VvbWV0cnlDb2xsZWN0aW9uIjpmb3IoaT1bXSxnPTA7ZzxiLmdlb21ldHJpZXMubGVuZ3RoO2crKylpLnB1c2goaChiLmdlb21ldHJpZXNbZ10pKX1yZXR1cm4gaX12YXIgaT17fTtyZXR1cm4gaS5wYXJzZT1nLGkuY29udmVydD1oLGkudG9HZW9KU09OPWcsaS5mcm9tR2VvSlNPTj1oLGl9KSxmdW5jdGlvbihhLGIpe2lmKCJvYmplY3QiPT10eXBlb2YgbW9kdWxlJiYib2JqZWN0Ij09dHlwZW9mIG1vZHVsZS5leHBvcnRzJiYoZXhwb3J0cz1tb2R1bGUuZXhwb3J0cz1iKHJlcXVpcmUoInRlcnJhZm9ybWVyIikpKSwib2JqZWN0Ij09dHlwZW9mIGEubmF2aWdhdG9yKXtpZighYS5UZXJyYWZvcm1lcil0aHJvdyBuZXcgRXJyb3IoIlRlcnJhZm9ybWVyLlJUcmVlIHJlcXVpcmVzIHRoZSBjb3JlIFRlcnJhZm9ybWVyIGxpYnJhcnkuIGh0dHBzOi8vZ2l0aHViLmNvbS9lc3JpL1RlcnJhZm9ybWVyIik7YS5UZXJyYWZvcm1lci5SVHJlZT1iKGEuVGVycmFmb3JtZXIpLlJUcmVlfX0odGhpcyxmdW5jdGlvbihUZXJyYWZvcm1lcil7ZnVuY3Rpb24gYShhKXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGEpfXZhciBiPXt9LGM9ZnVuY3Rpb24oYil7dmFyIGQ9MyxlPTY7aXNOYU4oYil8fChkPU1hdGguZmxvb3IoYi8yKSxlPWIpLHRoaXMubWluX3dpZHRoPWQsdGhpcy5tYXhfd2lkdGg9ZTt2YXIgZj17eDowLHk6MCx3OjAsaDowLGlkOiJyb290Iixub2RlczpbXX07IWZ1bmN0aW9uKCl7dmFyIGE9e307cmV0dXJuIGZ1bmN0aW9uKGIpe3ZhciBjPTA7cmV0dXJuIGIgaW4gYT9jPWFbYl0rKzphW2JdPTAsYisiXyIrY319KCksYy5SZWN0YW5nbGUuc3F1YXJpZmllZF9yYXRpbz1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9KGErYikvMixlPWEqYixmPWUvKGQqZCk7cmV0dXJuIGUqYy9mfTt2YXIgZz1mdW5jdGlvbihhLGIsZSl7dmFyIGY9W10sZz1bXSxoPVtdLGk9MTtpZighYXx8IWMuUmVjdGFuZ2xlLm92ZXJsYXBfcmVjdGFuZ2xlKGEsZSkpcmV0dXJuIGg7dmFyIGo9e3g6YS54LHk6YS55LHc6YS53LGg6YS5oLHRhcmdldDpifTtnLnB1c2goZS5ub2Rlcy5sZW5ndGgpLGYucHVzaChlKTtkb3t2YXIgaz1mLnBvcCgpLGw9Zy5wb3AoKS0xO2lmKCJ0YXJnZXQiaW4gailmb3IoO2w+PTA7KXt2YXIgbj1rLm5vZGVzW2xdO2lmKGMuUmVjdGFuZ2xlLm92ZXJsYXBfcmVjdGFuZ2xlKGosbikpe2lmKGoudGFyZ2V0JiYibGVhZiJpbiBuJiZuLmxlYWY9PT1qLnRhcmdldHx8IWoudGFyZ2V0JiYoImxlYWYiaW4gbnx8Yy5SZWN0YW5nbGUuY29udGFpbnNfcmVjdGFuZ2xlKG4saikpKXsibm9kZXMiaW4gbj8oaD1tKG4sITAsW10sbiksay5ub2Rlcy5zcGxpY2UobCwxKSk6aD1rLm5vZGVzLnNwbGljZShsLDEpLGMuUmVjdGFuZ2xlLm1ha2VfTUJSKGsubm9kZXMsayksZGVsZXRlIGoudGFyZ2V0LGsubm9kZXMubGVuZ3RoPGQmJihqLm5vZGVzPW0oaywhMCxbXSxrKSk7YnJlYWt9Im5vZGVzImluIG4mJihpKz0xLGcucHVzaChsKSxmLnB1c2goayksaz1uLGw9bi5ub2Rlcy5sZW5ndGgpfWwtPTF9ZWxzZSBpZigibm9kZXMiaW4gail7ay5ub2Rlcy5zcGxpY2UobCsxLDEpLGsubm9kZXMubGVuZ3RoPjAmJmMuUmVjdGFuZ2xlLm1ha2VfTUJSKGsubm9kZXMsayk7Zm9yKHZhciBwPTA7cDxqLm5vZGVzLmxlbmd0aDtwKyspbyhqLm5vZGVzW3BdLGspO2oubm9kZXMubGVuZ3RoPTAsMD09PWYubGVuZ3RoJiZrLm5vZGVzLmxlbmd0aDw9MT8oai5ub2Rlcz1tKGssITAsai5ub2RlcyxrKSxrLm5vZGVzLmxlbmd0aD0wLGYucHVzaChrKSxnLnB1c2goMSkpOmYubGVuZ3RoPjAmJmsubm9kZXMubGVuZ3RoPGQ/KGoubm9kZXM9bShrLCEwLGoubm9kZXMsayksay5ub2Rlcy5sZW5ndGg9MCk6ZGVsZXRlIGoubm9kZXN9ZWxzZSBjLlJlY3RhbmdsZS5tYWtlX01CUihrLm5vZGVzLGspO2ktPTF9d2hpbGUoZi5sZW5ndGg+MCk7cmV0dXJuIGh9LGg9ZnVuY3Rpb24oYSxiKXt2YXIgZCxlPS0xLGY9W107Zi5wdXNoKGIpO3ZhciBnPWIubm9kZXM7ZG97LTEhPT1lJiYoZi5wdXNoKGdbZV0pLGc9Z1tlXS5ub2RlcyxlPS0xKTtmb3IodmFyIGg9Zy5sZW5ndGgtMTtoPj0wO2gtLSl7dmFyIGk9Z1toXTtpZigibGVhZiJpbiBpKXtlPS0xO2JyZWFrfXZhciBqPWMuUmVjdGFuZ2xlLnNxdWFyaWZpZWRfcmF0aW8oaS53LGkuaCxpLm5vZGVzLmxlbmd0aCsxKSxrPU1hdGgubWF4KGkueCtpLncsYS54K2EudyktTWF0aC5taW4oaS54LGEueCksbD1NYXRoLm1heChpLnkraS5oLGEueSthLmgpLU1hdGgubWluKGkueSxhLnkpLG09Yy5SZWN0YW5nbGUuc3F1YXJpZmllZF9yYXRpbyhrLGwsaS5ub2Rlcy5sZW5ndGgrMik7KDA+ZXx8TWF0aC5hYnMobS1qKTxkKSYmKGQ9TWF0aC5hYnMobS1qKSxlPWgpfX13aGlsZSgtMSE9PWUpO3JldHVybiBmfSxpPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1rKGEpO2EubGVuZ3RoPjA7KWooYSxiWzBdLGJbMV0pO3JldHVybiBifSxqPWZ1bmN0aW9uKGEsYixlKXtmb3IodmFyIGYsZyxoLGk9Yy5SZWN0YW5nbGUuc3F1YXJpZmllZF9yYXRpbyhiLncsYi5oLGIubm9kZXMubGVuZ3RoKzEpLGo9Yy5SZWN0YW5nbGUuc3F1YXJpZmllZF9yYXRpbyhlLncsZS5oLGUubm9kZXMubGVuZ3RoKzEpLGs9YS5sZW5ndGgtMTtrPj0wO2stLSl7dmFyIGw9YVtrXSxtPXt9O20ueD1NYXRoLm1pbihiLngsbC54KSxtLnk9TWF0aC5taW4oYi55LGwueSksbS53PU1hdGgubWF4KGIueCtiLncsbC54K2wudyktbS54LG0uaD1NYXRoLm1heChiLnkrYi5oLGwueStsLmgpLW0ueTt2YXIgbj1NYXRoLmFicyhjLlJlY3RhbmdsZS5zcXVhcmlmaWVkX3JhdGlvKG0udyxtLmgsYi5ub2Rlcy5sZW5ndGgrMiktaSksbz17fTtvLng9TWF0aC5taW4oZS54LGwueCksby55PU1hdGgubWluKGUueSxsLnkpLG8udz1NYXRoLm1heChlLngrZS53LGwueCtsLncpLW8ueCxvLmg9TWF0aC5tYXgoZS55K2UuaCxsLnkrbC5oKS1vLnk7dmFyIHA9TWF0aC5hYnMoYy5SZWN0YW5nbGUuc3F1YXJpZmllZF9yYXRpbyhvLncsby5oLGUubm9kZXMubGVuZ3RoKzIpLWopOyghZ3x8IWZ8fE1hdGguYWJzKHAtbik8ZikmJihnPWssZj1NYXRoLmFicyhwLW4pLGg9bj5wP2U6Yil9dmFyIHE9YS5zcGxpY2UoZywxKVswXTtiLm5vZGVzLmxlbmd0aCthLmxlbmd0aCsxPD1kPyhiLm5vZGVzLnB1c2gocSksYy5SZWN0YW5nbGUuZXhwYW5kX3JlY3RhbmdsZShiLHEpKTplLm5vZGVzLmxlbmd0aCthLmxlbmd0aCsxPD1kPyhlLm5vZGVzLnB1c2gocSksYy5SZWN0YW5nbGUuZXhwYW5kX3JlY3RhbmdsZShlLHEpKTooaC5ub2Rlcy5wdXNoKHEpLGMuUmVjdGFuZ2xlLmV4cGFuZF9yZWN0YW5nbGUoaCxxKSl9LGs9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiLGMsZD1hLmxlbmd0aC0xLGU9MCxmPWEubGVuZ3RoLTEsZz0wLGg9YS5sZW5ndGgtMjtoPj0wO2gtLSl7dmFyIGk9YVtoXTtpLng+YVtlXS54P2U9aDppLngraS53PGFbZF0ueCthW2RdLncmJihkPWgpLGkueT5hW2ddLnk/Zz1oOmkueStpLmg8YVtmXS55K2FbZl0uaCYmKGY9aCl9dmFyIGo9TWF0aC5hYnMoYVtkXS54K2FbZF0udy1hW2VdLngpLGs9TWF0aC5hYnMoYVtmXS55K2FbZl0uaC1hW2ddLnkpO3JldHVybiBqPms/ZD5lPyhiPWEuc3BsaWNlKGQsMSlbMF0sYz1hLnNwbGljZShlLDEpWzBdKTooYz1hLnNwbGljZShlLDEpWzBdLGI9YS5zcGxpY2UoZCwxKVswXSk6Zj5nPyhiPWEuc3BsaWNlKGYsMSlbMF0sYz1hLnNwbGljZShnLDEpWzBdKTooYz1hLnNwbGljZShnLDEpWzBdLGI9YS5zcGxpY2UoZiwxKVswXSksW3t4OmIueCx5OmIueSx3OmIudyxoOmIuaCxub2RlczpbYl19LHt4OmMueCx5OmMueSx3OmMudyxoOmMuaCxub2RlczpbY119XX0sbD1mdW5jdGlvbihhLGIpe3JldHVybiBhLm5vZGVzPWIubm9kZXMsYS54PWIueCxhLnk9Yi55LGEudz1iLncsYS5oPWIuaCxhfSxtPWZ1bmN0aW9uKGEsYixkLGUpe3ZhciBmPVtdO2lmKCFjLlJlY3RhbmdsZS5vdmVybGFwX3JlY3RhbmdsZShhLGUpKXJldHVybiBkO2YucHVzaChlLm5vZGVzKTtkbyBmb3IodmFyIGc9Zi5wb3AoKSxoPWcubGVuZ3RoLTE7aD49MDtoLS0pe3ZhciBpPWdbaF07Yy5SZWN0YW5nbGUub3ZlcmxhcF9yZWN0YW5nbGUoYSxpKSYmKCJub2RlcyJpbiBpP2YucHVzaChpLm5vZGVzKToibGVhZiJpbiBpJiYoYj9kLnB1c2goaSk6ZC5wdXNoKGkubGVhZikpKX13aGlsZShmLmxlbmd0aD4wKTtyZXR1cm4gZH0sbj1mdW5jdGlvbihhLGIsZCxlKXt2YXIgZj1bXTtpZighYy5SZWN0YW5nbGUub3ZlcmxhcF9yZWN0YW5nbGUoZSxhKSlyZXR1cm4gZDtmLnB1c2goZS5ub2Rlcyk7ZG8gZm9yKHZhciBnPWYucG9wKCksaD1nLmxlbmd0aC0xO2g+PTA7aC0tKXt2YXIgaT1nW2hdO2MuUmVjdGFuZ2xlLm92ZXJsYXBfcmVjdGFuZ2xlKGksYSkmJigibm9kZXMiaW4gaT9mLnB1c2goaS5ub2Rlcyk6ImxlYWYiaW4gaSYmKGI/ZC5wdXNoKGkpOmQucHVzaChpLmxlYWYpKSl9d2hpbGUoZi5sZW5ndGg+MCk7cmV0dXJuIGR9LG89ZnVuY3Rpb24oYixkKXt2YXIgZjtpZigwPT09ZC5ub2Rlcy5sZW5ndGgpcmV0dXJuIGQueD1iLngsZC55PWIueSxkLnc9Yi53LGQuaD1iLmgsZC5ub2Rlcy5wdXNoKGIpLHZvaWQgMDt2YXIgZz1oKGIsZCksaj1iO2Rve2lmKGYmJiJub2RlcyJpbiBmJiYwPT09Zi5ub2Rlcy5sZW5ndGgpe3ZhciBrPWY7Zj1nLnBvcCgpO2Zvcih2YXIgbD0wO2w8Zi5ub2Rlcy5sZW5ndGg7bCsrKWlmKGYubm9kZXNbbF09PT1rfHwwPT09Zi5ub2Rlc1tsXS5ub2Rlcy5sZW5ndGgpe2Yubm9kZXMuc3BsaWNlKGwsMSk7YnJlYWt9fWVsc2UgZj1nLnBvcCgpO2lmKCJsZWFmImluIGp8fCJub2RlcyJpbiBqfHxhKGopKXtpZihhKGopKXtmb3IodmFyIG09MDttPGoubGVuZ3RoO20rKyljLlJlY3RhbmdsZS5leHBhbmRfcmVjdGFuZ2xlKGYsalttXSk7Zi5ub2Rlcz1mLm5vZGVzLmNvbmNhdChqKX1lbHNlIGMuUmVjdGFuZ2xlLmV4cGFuZF9yZWN0YW5nbGUoZixqKSxmLm5vZGVzLnB1c2goaik7aWYoZi5ub2Rlcy5sZW5ndGg8PWUpaj17eDpmLngseTpmLnksdzpmLncsaDpmLmh9O2Vsc2V7dmFyIG49aShmLm5vZGVzKTtqPW4sZy5sZW5ndGg8MSYmKGYubm9kZXMucHVzaChuWzBdKSxnLnB1c2goZiksaj1uWzFdKX19ZWxzZSBjLlJlY3RhbmdsZS5leHBhbmRfcmVjdGFuZ2xlKGYsaiksaj17eDpmLngseTpmLnksdzpmLncsaDpmLmh9fXdoaWxlKGcubGVuZ3RoPjApfTt0aGlzLnNlcmlhbGl6ZT1mdW5jdGlvbihhKXthKG51bGwsZil9LHRoaXMuZGVzZXJpYWxpemU9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7c3dpdGNoKGQubGVuZ3RoKXtjYXNlIDE6Yj1mO2JyZWFrO2Nhc2UgMjoiZnVuY3Rpb24iPT10eXBlb2YgZFsxXSYmKGI9ZixjPWRbMV0pfXZhciBlPWwoYixhKTtjJiZjKG51bGwsZSl9LHRoaXMuc2VhcmNoPWZ1bmN0aW9uKGEsYil7dmFyIGM7aWYoYS50eXBlKXt2YXIgZD1UZXJyYWZvcm1lci5Ub29scy5jYWxjdWxhdGVCb3VuZHMoYSk7Yz17eDpkWzBdLHk6ZFsxXSx3Ok1hdGguYWJzKGRbMF0tZFsyXSksaDpNYXRoLmFicyhkWzFdLWRbM10pfX1lbHNlIGM9YTt2YXIgZT1bYywhMSxbXSxmXTtpZih2b2lkIDA9PT1jKXRocm93Ildyb25nIG51bWJlciBvZiBhcmd1bWVudHMuIFJULlNlYXJjaCByZXF1aXJlcyBhdCBsZWFzdCBhIGJvdW5kaW5nIHJlY3RhbmdsZS4iO3ZhciBnPW0uYXBwbHkodGhpcyxlKTtiJiZiKG51bGwsZyl9LHRoaXMud2l0aGluPWZ1bmN0aW9uKGEsYil7dmFyIGM7aWYoYS50eXBlKXt2YXIgZD1UZXJyYWZvcm1lci5Ub29scy5jYWxjdWxhdGVCb3VuZHMoYSk7Yz17eDpkWzBdLHk6ZFsxXSx3Ok1hdGguYWJzKGRbMF0tZFsyXSksaDpNYXRoLmFicyhkWzFdLWRbM10pfX1lbHNlIGM9YTt2YXIgZT1bYywhMSxbXSxmXTtpZih2b2lkIDA9PT1jKXRocm93Ildyb25nIG51bWJlciBvZiBhcmd1bWVudHMuIFJULlNlYXJjaCByZXF1aXJlcyBhdCBsZWFzdCBhIGJvdW5kaW5nIHJlY3RhbmdsZS4iO3ZhciBnPW4uYXBwbHkodGhpcyxlKTtiJiZiKG51bGwsZyl9LHRoaXMucmVtb3ZlPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO2lmKDE9PT1kLmxlbmd0aCYmZC5wdXNoKCExKSwzPT09ZC5sZW5ndGgmJihjPWQucG9wKCkpLGQmJmRbMF0mJmRbMF0udHlwZSl7dmFyIGU9VGVycmFmb3JtZXIuVG9vbHMuY2FsY3VsYXRlQm91bmRzKGRbMF0pO2RbMF09e3g6ZVswXSx5OmVbMV0sdzpNYXRoLmFicyhlWzBdLWVbMl0pLGg6TWF0aC5hYnMoZVsxXS1lWzNdKX19aWYoZC5wdXNoKGYpLGI9PT0hMSl7dmFyIGg9MCxpPVtdO2RvIGg9aS5sZW5ndGgsaT1pLmNvbmNhdChnLmFwcGx5KHRoaXMsZCkpO3doaWxlKGghPT1pLmxlbmd0aCk7YyYmYyhudWxsLGkpfWVsc2V7dmFyIGo9Zy5hcHBseSh0aGlzLGQpO2MmJmMobnVsbCxqKX19LHRoaXMuaW5zZXJ0PWZ1bmN0aW9uKGEsYixjKXt2YXIgZDtpZihhLnR5cGUpe3ZhciBlPVRlcnJhZm9ybWVyLlRvb2xzLmNhbGN1bGF0ZUJvdW5kcyhhKTtkPXt4OmVbMF0seTplWzFdLHc6TWF0aC5hYnMoZVswXS1lWzJdKSxoOk1hdGguYWJzKGVbMV0tZVszXSl9fWVsc2UgZD1hO2lmKGFyZ3VtZW50cy5sZW5ndGg8Mil0aHJvdyJXcm9uZyBudW1iZXIgb2YgYXJndW1lbnRzLiBSVC5JbnNlcnQgcmVxdWlyZXMgYXQgbGVhc3QgYSBib3VuZGluZyByZWN0YW5nbGUgb3IgR2VvSlNPTiBhbmQgYW4gb2JqZWN0LiI7dmFyIGc9byh7eDpkLngseTpkLnksdzpkLncsaDpkLmgsbGVhZjpifSxmKTtjJiZjKG51bGwsZyl9fTtyZXR1cm4gYy5SZWN0YW5nbGU9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGUsZixnLGgsaSxqO2EueD8oZT1hLngsZz1hLnksMCE9PWEudyYmIWEudyYmYS54Mj8oaT1hLngyLWEueCxqPWEueTItYS55KTooaT1hLncsaj1hLmgpLGY9ZStpLGg9ZytqKTooZT1hLGc9YixpPWMsaj1kLGY9ZStpLGg9ZytqKSx0aGlzLngxPXRoaXMueD1mdW5jdGlvbigpe3JldHVybiBlfSx0aGlzLnkxPXRoaXMueT1mdW5jdGlvbigpe3JldHVybiBnfSx0aGlzLngyPWZ1bmN0aW9uKCl7cmV0dXJuIGZ9LHRoaXMueTI9ZnVuY3Rpb24oKXtyZXR1cm4gaH0sdGhpcy53PWZ1bmN0aW9uKCl7cmV0dXJuIGl9LHRoaXMuaD1mdW5jdGlvbigpe3JldHVybiBqfSx0aGlzLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybid7IngiOicrZS50b1N0cmluZygpKycsICJ5IjonK2cudG9TdHJpbmcoKSsnLCAidyI6JytpLnRvU3RyaW5nKCkrJywgImgiOicrai50b1N0cmluZygpKyJ9In0sdGhpcy5vdmVybGFwPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLngoKTxhLngyKCkmJnRoaXMueDIoKT5hLngoKSYmdGhpcy55KCk8YS55MigpJiZ0aGlzLnkyKCk+YS55KCl9LHRoaXMuZXhwYW5kPWZ1bmN0aW9uKGEpe3ZhciBiPU1hdGgubWluKHRoaXMueCgpLGEueCgpKSxjPU1hdGgubWluKHRoaXMueSgpLGEueSgpKTtyZXR1cm4gaT1NYXRoLm1heCh0aGlzLngyKCksYS54MigpKS1iLGo9TWF0aC5tYXgodGhpcy55MigpLGEueTIoKSktYyxlPWIsZz1jLHRoaXN9LHRoaXMuc2V0UmVjdD1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZSxmLGcsaCxpLGo7YS54PyhlPWEueCxnPWEueSwwIT09YS53JiYhYS53JiZhLngyPyhpPWEueDItYS54LGo9YS55Mi1hLnkpOihpPWEudyxqPWEuaCksZj1lK2ksaD1nK2opOihlPWEsZz1iLGk9YyxqPWQsZj1lK2ksaD1nK2opfX0sYy5SZWN0YW5nbGUub3ZlcmxhcF9yZWN0YW5nbGU9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS54PGIueCtiLncmJmEueCthLnc+Yi54JiZhLnk8Yi55K2IuaCYmYS55K2EuaD5iLnl9LGMuUmVjdGFuZ2xlLmNvbnRhaW5zX3JlY3RhbmdsZT1mdW5jdGlvbihhLGIpe3JldHVybiBhLngrYS53PD1iLngrYi53JiZhLng+PWIueCYmYS55K2EuaDw9Yi55K2IuaCYmYS55Pj1iLnl9LGMuUmVjdGFuZ2xlLmV4cGFuZF9yZWN0YW5nbGU9ZnVuY3Rpb24oYSxiKXt2YXIgYyxkO3JldHVybiBjPWEueDxiLng/YS54OmIueCxkPWEueTxiLnk/YS55OmIueSxhLnc9YS54K2Eudz5iLngrYi53P2EueCthLnctYzpiLngrYi53LWMsYS5oPWEueSthLmg+Yi55K2IuaD9hLnkrYS5oLWQ6Yi55K2IuaC1kLGEueD1jLGEueT1kLGF9LGMuUmVjdGFuZ2xlLm1ha2VfTUJSPWZ1bmN0aW9uKGEsYil7aWYoYS5sZW5ndGg8MSlyZXR1cm57eDowLHk6MCx3OjAsaDowfTtiPyhiLng9YVswXS54LGIueT1hWzBdLnksYi53PWFbMF0udyxiLmg9YVswXS5oKTpiPXt4OmFbMF0ueCx5OmFbMF0ueSx3OmFbMF0udyxoOmFbMF0uaH07Zm9yKHZhciBkPWEubGVuZ3RoLTE7ZD4wO2QtLSljLlJlY3RhbmdsZS5leHBhbmRfcmVjdGFuZ2xlKGIsYVtkXSk7cmV0dXJuIGJ9LGIuUlRyZWU9YyxifSksTC5lc3JpPXtfY2FsbGJhY2s6e319LEwuZXNyaS5TdXBwb3J0PXtDT1JTOiEhKHdpbmRvdy5YTUxIdHRwUmVxdWVzdCYmIndpdGhDcmVkZW50aWFscyJpbiBuZXcgWE1MSHR0cFJlcXVlc3QpfSxMLmVzcmkuUmVxdWVzdEhhbmRsZXJzPXtDT1JTOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPW5ldyBYTUxIdHRwUmVxdWVzdDtiLmY9Impzb24iLGUub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7dmFyIGE7aWYoND09PWUucmVhZHlTdGF0ZSl7dHJ5e2E9SlNPTi5wYXJzZShlLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7YT17ZXJyb3I6IkNvdWxkIG5vdCBwYXJzZSByZXNwb25zZSBhcyBKU09OLiJ9fWQ/Yy5jYWxsKGQsYSk6YyhhKX19LGUub3BlbigiR0VUIixhK0wuZXNyaS5VdGlsLnNlcmlhbGl6ZShiKSwhMCksZS5zZW5kKG51bGwpfSxKU09OUDpmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT0iYyIrKDFlOSpNYXRoLnJhbmRvbSgpKS50b1N0cmluZygzNikucmVwbGFjZSgiLiIsIl8iKTtiLmY9Impzb24iLGIuY2FsbGJhY2s9IkwuZXNyaS5fY2FsbGJhY2suIitlO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2YudHlwZT0idGV4dC9qYXZhc2NyaXB0IixmLnNyYz1hK0wuZXNyaS5VdGlsLnNlcmlhbGl6ZShiKSxmLmlkPWUsTC5lc3JpLl9jYWxsYmFja1tlXT1mdW5jdGlvbihhKXtkP2MuY2FsbChkLGEpOmMoYSksZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKSxkZWxldGUgTC5lc3JpLl9jYWxsYmFja1tlXX0sZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKX19LEwuZXNyaS5nZXQ9TC5lc3JpLlN1cHBvcnQuQ09SUz9MLmVzcmkuUmVxdWVzdEhhbmRsZXJzLkNPUlM6TC5lc3JpLlJlcXVlc3RIYW5kbGVycy5KU09OUCxMLmVzcmkuVXRpbD17ZGVib3VuY2U6ZnVuY3Rpb24oYSxiKXt2YXIgYz1udWxsO3JldHVybiBmdW5jdGlvbigpe3ZhciBkPXRoaXN8fGQsZT1hcmd1bWVudHM7Y2xlYXJUaW1lb3V0KGMpLGM9c2V0VGltZW91dChmdW5jdGlvbigpe2EuYXBwbHkoZCxlKX0sYil9fSxyb3VuZEF3YXlGcm9tWmVybzpmdW5jdGlvbihhKXtyZXR1cm4gYT4wP01hdGguY2VpbChhKTpNYXRoLmZsb29yKGEpfSx0cmltOmZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UoL15cc1xzKi8sIiIpLnJlcGxhY2UoL1xzXHMqJC8sIiIpfSxjbGVhblVybDpmdW5jdGlvbihhKXtyZXR1cm4gYT1MLmVzcmkuVXRpbC50cmltKGEpLCIvIiE9PWFbYS5sZW5ndGgtMV0mJihhKz0iLyIpLGF9LHNlcmlhbGl6ZTpmdW5jdGlvbihhKXt2YXIgYj0iPyI7Zm9yKHZhciBjIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShjKSl7dmFyIGQ9YyxlPWFbY107Yis9ZW5jb2RlVVJJQ29tcG9uZW50KGQpLGIrPSI9IixiKz1lbmNvZGVVUklDb21wb25lbnQoZSksYis9IiYifXJldHVybiBiLnN1YnN0cmluZygwLGIubGVuZ3RoLTEpfSxpbmRleE9mOmZ1bmN0aW9uKGEsYixjKXtpZihjPWN8fDAsYS5pbmRleE9mKXJldHVybiBhLmluZGV4T2YoYixjKTtmb3IodmFyIGQ9YyxlPWEubGVuZ3RoO2U+ZDtkKyspaWYoYVtkXT09PWIpcmV0dXJuIGQ7cmV0dXJuLTF9LGV4dGVudFRvQm91bmRzOmZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBMLkxhdExuZyhhLnltaW4sYS54bWluKSxjPW5ldyBMLkxhdExuZyhhLnltYXgsYS54bWF4KTtyZXR1cm4gbmV3IEwuTGF0TG5nQm91bmRzKGIsYyl9LGJvdW5kc1RvRXh0ZW50OmZ1bmN0aW9uKGEpe3JldHVybnt4bWluOmEuZ2V0U291dGhXZXN0KCkubG5nLHltaW46YS5nZXRTb3V0aFdlc3QoKS5sYXQseG1heDphLmdldE5vcnRoRWFzdCgpLmxuZyx5bWF4OmEuZ2V0Tm9ydGhFYXN0KCkubGF0LHNwYXRpYWxSZWZlcmVuY2U6e3draWQ6NDMyNn19fSxib3VuZHNUb0VudmVsb3BlOmZ1bmN0aW9uKGEpe3ZhciBiPUwuZXNyaS5VdGlsLmJvdW5kc1RvRXh0ZW50KGEpO3JldHVybnt4OmIueG1pbix5OmIueW1pbix3Ok1hdGguYWJzKGIueG1pbi1iLnhtYXgpLGg6TWF0aC5hYnMoYi55bWluLWIueW1heCl9fX0sTC5lc3JpLk1peGlucz17fSxMLmVzcmkuTWl4aW5zLmZlYXR1cmVHcmlkPXtfYWN0aXZlUmVxdWVzdHM6MCxfaW5pdGlhbGl6ZUZlYXR1cmVHcmlkOmZ1bmN0aW9uKGEpe3RoaXMuX21hcD1hLHRoaXMuX3ByZXZpb3VzQ2VsbHM9W10sdGhpcy5jZW50ZXI9dGhpcy5fbWFwLmdldENlbnRlcigpLHRoaXMub3JpZ2luPXRoaXMuX21hcC5wcm9qZWN0KHRoaXMuY2VudGVyKSx0aGlzLl9tb3ZlSGFuZGxlcj1MLmVzcmkuVXRpbC5kZWJvdW5jZShmdW5jdGlvbihhKXsiem9vbWVuZCI9PT1hLnR5cGUmJih0aGlzLm9yaWdpbj10aGlzLl9tYXAucHJvamVjdCh0aGlzLmNlbnRlciksdGhpcy5fcHJldmlvdXNDZWxscz1bXSksdGhpcy5fcmVxdWVzdEZlYXR1cmVzKGEudGFyZ2V0LmdldEJvdW5kcygpKX0sdGhpcy5vcHRpb25zLmRlYm91bmNlLHRoaXMpLGEub24oInpvb21lbmQgcmVzaXplIG1vdmUiLHRoaXMuX21vdmVIYW5kbGVyLHRoaXMpLHRoaXMuX3JlcXVlc3RGZWF0dXJlcyhhLmdldEJvdW5kcygpKX0sX2Rlc3Ryb3lGZWF0dXJlR3JpZDpmdW5jdGlvbihhKXthLm9mZigiem9vbWVuZCByZXNpemUgbW92ZSIsdGhpcy5fbW92ZUhhbmRsZXIsdGhpcyl9LF9yZXF1ZXN0RmVhdHVyZXM6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5fY2VsbHNXaXRoaW4oYSk7YiYmdGhpcy5maXJlKCJsb2FkaW5nIix7Ym91bmRzOmF9KTtmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLl9tYWtlUmVxdWVzdChiW2NdLGIsYSl9LF9tYWtlUmVxdWVzdDpmdW5jdGlvbihhLGIsYyl7dGhpcy5fYWN0aXZlUmVxdWVzdHMrKyxMLmVzcmkuZ2V0KHRoaXMudXJsKyJxdWVyeSIse2dlb21ldHJ5VHlwZToiZXNyaUdlb21ldHJ5RW52ZWxvcGUiLGdlb21ldHJ5OkpTT04uc3RyaW5naWZ5KEwuZXNyaS5VdGlsLmJvdW5kc1RvRXh0ZW50KGEuYm91bmRzKSksb3V0RmllbGRzOiIqIixvdXRTcjo0MzI2fSxmdW5jdGlvbihhKXt0aGlzLl9hY3RpdmVSZXF1ZXN0cy0tLHRoaXMuX2FjdGl2ZVJlcXVlc3RzPD0wJiZ0aGlzLmZpcmUoImxvYWQiLHtib3VuZHM6YyxjZWxsczpifSksdGhpcy5fcmVuZGVyKGEpfSx0aGlzKX0sX2NlbGxzV2l0aGluOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuX21hcC5nZXRTaXplKCksYz10aGlzLl9tYXAucHJvamVjdCh0aGlzLl9tYXAuZ2V0Q2VudGVyKCkpO01hdGgubWluKHRoaXMub3B0aW9ucy5jZWxsU2l6ZS9iLngsdGhpcy5vcHRpb25zLmNlbGxTaXplL2IueSk7Zm9yKHZhciBkPWEucGFkKC4xKSxlPVtdLGY9dGhpcy5fbWFwLnByb2plY3QoZC5nZXROb3J0aFdlc3QoKSksZz10aGlzLl9tYXAucHJvamVjdChkLmdldFNvdXRoRWFzdCgpKSxoPWYuc3VidHJhY3QoYykuZGl2aWRlQnkodGhpcy5vcHRpb25zLmNlbGxTaXplKSxpPWcuc3VidHJhY3QoYykuZGl2aWRlQnkodGhpcy5vcHRpb25zLmNlbGxTaXplKSxqPU1hdGgucm91bmQoKHRoaXMub3JpZ2luLngtYy54KS90aGlzLm9wdGlvbnMuY2VsbFNpemUpLGs9TWF0aC5yb3VuZCgodGhpcy5vcmlnaW4ueS1jLnkpL3RoaXMub3B0aW9ucy5jZWxsU2l6ZSksbD1MLmVzcmkuVXRpbC5yb3VuZEF3YXlGcm9tWmVybyhoLngpLWosbT1MLmVzcmkuVXRpbC5yb3VuZEF3YXlGcm9tWmVybyhpLngpLWosbj1MLmVzcmkuVXRpbC5yb3VuZEF3YXlGcm9tWmVybyhoLnkpLWssbz1MLmVzcmkuVXRpbC5yb3VuZEF3YXlGcm9tWmVybyhpLnkpLWsscD1sO20+cDtwKyspZm9yKHZhciBxPW47bz5xO3ErKyl7dmFyIHI9ImNlbGw6IitwKyI6IitxLHM9TC5lc3JpLlV0aWwuaW5kZXhPZih0aGlzLl9wcmV2aW91c0NlbGxzLHIpPj0wO2lmKCFzfHwhdGhpcy5vcHRpb25zLmRlZHVwbGljYXRlKXt2YXIgdD10aGlzLl9jZWxsRXh0ZW50KHAscSksdT10LmdldENlbnRlcigpLHY9dS5kaXN0YW5jZVRvKHQuZ2V0Tm9ydGhXZXN0KCkpLHc9dS5kaXN0YW5jZVRvKHRoaXMuY2VudGVyKSx4PXtyb3c6cCxjb2w6cSxpZDpyLGNlbnRlcjp1LGJvdW5kczp0LGRpc3RhbmNlOncscmFkaXVzOnZ9O2UucHVzaCh4KSx0aGlzLl9wcmV2aW91c0NlbGxzLnB1c2gocil9fXJldHVybiBlLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5kaXN0YW5jZS1iLmRpc3RhbmNlfSksZX0sX2NlbGxFeHRlbnQ6ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLl9jZWxsUG9pbnQoYSxiKSxkPXRoaXMuX2NlbGxQb2ludChhKzEsYisxKSxlPXRoaXMuX21hcC51bnByb2plY3QoYyksZj10aGlzLl9tYXAudW5wcm9qZWN0KGQpO3JldHVybiBMLmxhdExuZ0JvdW5kcyhlLGYpfSxfY2VsbFBvaW50OmZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5vcmlnaW4ueCthKnRoaXMub3B0aW9ucy5jZWxsU2l6ZSxkPXRoaXMub3JpZ2luLnkrYip0aGlzLm9wdGlvbnMuY2VsbFNpemU7cmV0dXJuW2MsZF19fSxMLmVzcmkuTWl4aW5zLmlkZW50aWZpYWJsZUxheWVyPXtpZGVudGlmeTpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZT17c3I6IjQyNjUiLG1hcEV4dGVudDpKU09OLnN0cmluZ2lmeShMLmVzcmkuVXRpbC5ib3VuZHNUb0V4dGVudCh0aGlzLl9tYXAuZ2V0Qm91bmRzKCkpKSx0b2xlcmFuY2U6MyxnZW9tZXRyeVR5cGU6ImVzcmlHZW9tZXRyeVBvaW50IixpbWFnZURpc3BsYXk6IjgwMCw2MDAsOTYiLGdlb21ldHJ5OkpTT04uc3RyaW5naWZ5KHt4OmEubG5nLHk6YS5sYXQsc3BhdGlhbFJlZmVyZW5jZTp7d2tpZDo0MjY1fX0pfTsKImZ1bmN0aW9uIj09dHlwZW9mIGImJiJ1bmRlZmluZWQiPT10eXBlb2YgYz8oYz1iLGQ9ZSk6Im9iamVjdCI9PXR5cGVvZiBiJiYoYi5sYXllckRlZnMmJihiLmxheWVyRGVmcz10aGlzLnBhcnNlTGF5ZXJEZWZzKGIubGF5ZXJEZWZzKSksZD1MLlV0aWwuZXh0ZW5kKGUsYikpLEwuZXNyaS5nZXQodGhpcy5fdXJsKyIvaWRlbnRpZnkiLGQsYyl9LHBhcnNlTGF5ZXJEZWZzOmZ1bmN0aW9uKGEpe3JldHVybiBhIGluc3RhbmNlb2YgQXJyYXk/IiI6Im9iamVjdCI9PXR5cGVvZiBhP0pTT04uc3RyaW5naWZ5KGEpOmF9fSxmdW5jdGlvbihhKXt2YXIgYj0iaHR0cHM6IiE9PXdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbD8iaHR0cDoiOiJodHRwczoiLGM9ImxpbmUtaGVpZ2h0OjlweDsgdGV4dC1vdmVyZmxvdzplbGxpcHNpczsgd2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjsgZGlzcGxheTppbmxpbmUtYmxvY2s7IixkPSJwb3NpdGlvbjphYnNvbHV0ZTsgdG9wOi0zOHB4OyByaWdodDoycHg7IixlPSI8aW1nIHNyYz0naHR0cHM6Ly9zZXJ2ZXJhcGkuYXJjZ2lzb25saW5lLmNvbS9qc2FwaS9hcmNnaXMvMy41L2pzL2VzcmkvaW1hZ2VzL21hcC9sb2dvLW1lZC5wbmcnIGFsdD0nUG93ZXJlZCBieSBFc3JpJyBjbGFzcz0nZXNyaS1hdHRyaWJ1dGlvbi1sb2dvJyBzdHlsZT0nIitkKyInPiIsZj1mdW5jdGlvbihhKXtyZXR1cm4iPHNwYW4gY2xhc3M9J2VzcmktYXR0cmlidXRpb25zJyBzdHlsZT0nIitjKyInPiIrYSsiPC9zcGFuPiJ9O2EuZXNyaS5CYXNlbWFwTGF5ZXI9YS5UaWxlTGF5ZXIuZXh0ZW5kKHtzdGF0aWNzOntUSUxFUzp7U3RyZWV0czp7dXJsVGVtcGxhdGU6YisiLy97c30uYXJjZ2lzb25saW5lLmNvbS9BcmNHSVMvcmVzdC9zZXJ2aWNlcy9Xb3JsZF9TdHJlZXRfTWFwL01hcFNlcnZlci90aWxlL3t6fS97eX0ve3h9LyIsYXR0cmlidXRpb25Vcmw6Imh0dHBzOi8vc3RhdGljLmFyY2dpcy5jb20vYXR0cmlidXRpb24vV29ybGRfU3RyZWV0X01hcD9mPWpzb24iLG9wdGlvbnM6e21pblpvb206MSxtYXhab29tOjE5LHN1YmRvbWFpbnM6WyJzZXJ2ZXIiLCJzZXJ2aWNlcyJdLGF0dHJpYnV0aW9uOmYoIkVzcmkiKStlfX0sVG9wb2dyYXBoaWM6e3VybFRlbXBsYXRlOmIrIi8ve3N9LmFyY2dpc29ubGluZS5jb20vQXJjR0lTL3Jlc3Qvc2VydmljZXMvV29ybGRfVG9wb19NYXAvTWFwU2VydmVyL3RpbGUve3p9L3t5fS97eH0vIixhdHRyaWJ1dGlvblVybDoiaHR0cHM6Ly9zdGF0aWMuYXJjZ2lzLmNvbS9hdHRyaWJ1dGlvbi9Xb3JsZF9Ub3BvX01hcD9mPWpzb24iLG9wdGlvbnM6e21pblpvb206MSxtYXhab29tOjE5LHN1YmRvbWFpbnM6WyJzZXJ2ZXIiLCJzZXJ2aWNlcyJdLGF0dHJpYnV0aW9uOmYoIkVzcmkiKStlfX0sT2NlYW5zOnt1cmxUZW1wbGF0ZToiaHR0cHM6Ly9zZXJ2ZXIuYXJjZ2lzb25saW5lLmNvbS9BcmNHSVMvcmVzdC9zZXJ2aWNlcy9PY2Vhbl9CYXNlbWFwL01hcFNlcnZlci90aWxlL3t6fS97eX0ve3h9LyIsYXR0cmlidXRpb25Vcmw6Imh0dHBzOi8vc3RhdGljLmFyY2dpcy5jb20vYXR0cmlidXRpb24vT2NlYW5fQmFzZW1hcD9mPWpzb24iLG9wdGlvbnM6e21pblpvb206MSxtYXhab29tOjE2LHN1YmRvbWFpbnM6WyJzZXJ2ZXIiLCJzZXJ2aWNlcyJdLGF0dHJpYnV0aW9uOmYoIkVzcmkiKStlfX0sTmF0aW9uYWxHZW9ncmFwaGljOnt1cmxUZW1wbGF0ZToiaHR0cHM6Ly9zZXJ2ZXIuYXJjZ2lzb25saW5lLmNvbS9BcmNHSVMvcmVzdC9zZXJ2aWNlcy9OYXRHZW9fV29ybGRfTWFwL01hcFNlcnZlci90aWxlL3t6fS97eX0ve3h9LyIsb3B0aW9uczp7bWluWm9vbToxLG1heFpvb206MTYsc3ViZG9tYWluczpbInNlcnZlciIsInNlcnZpY2VzIl0sYXR0cmlidXRpb246ZigiRXNyaSIpK2V9fSxHcmF5Ont1cmxUZW1wbGF0ZTpiKyIvL3tzfS5hcmNnaXNvbmxpbmUuY29tL0FyY0dJUy9yZXN0L3NlcnZpY2VzL0NhbnZhcy9Xb3JsZF9MaWdodF9HcmF5X0Jhc2UvTWFwU2VydmVyL3RpbGUve3p9L3t5fS97eH0vIixvcHRpb25zOnttaW5ab29tOjEsbWF4Wm9vbToxNixzdWJkb21haW5zOlsic2VydmVyIiwic2VydmljZXMiXSxhdHRyaWJ1dGlvbjpmKCJFc3JpLCBOQVZURVEsIERlTG9ybWUiKStlfX0sR3JheUxhYmVsczp7dXJsVGVtcGxhdGU6YisiLy97c30uYXJjZ2lzb25saW5lLmNvbS9BcmNHSVMvcmVzdC9zZXJ2aWNlcy9DYW52YXMvV29ybGRfTGlnaHRfR3JheV9SZWZlcmVuY2UvTWFwU2VydmVyL3RpbGUve3p9L3t5fS97eH0vIixvcHRpb25zOnttaW5ab29tOjEsbWF4Wm9vbToxNixzdWJkb21haW5zOlsic2VydmVyIiwic2VydmljZXMiXX19LEltYWdlcnk6e3VybFRlbXBsYXRlOmIrIi8ve3N9LmFyY2dpc29ubGluZS5jb20vQXJjR0lTL3Jlc3Qvc2VydmljZXMvV29ybGRfSW1hZ2VyeS9NYXBTZXJ2ZXIvdGlsZS97en0ve3l9L3t4fS8iLG9wdGlvbnM6e21pblpvb206MSxtYXhab29tOjE5LHN1YmRvbWFpbnM6WyJzZXJ2ZXIiLCJzZXJ2aWNlcyJdLGF0dHJpYnV0aW9uOmYoIkVzcmksIERpZ2l0YWxHbG9iZSwgR2VvRXllLCBpLWN1YmVkLCBVU0RBLCBVU0dTLCBBRVgsIEdldG1hcHBpbmcsIEFlcm9ncmlkLCBJR04sIElHUCwgc3dpc3N0b3BvLCBhbmQgdGhlIEdJUyBVc2VyIENvbW11bml0eSIpK2V9fSxJbWFnZXJ5TGFiZWxzOnt1cmxUZW1wbGF0ZTpiKyIvL3tzfS5hcmNnaXNvbmxpbmUuY29tL0FyY0dJUy9yZXN0L3NlcnZpY2VzL1JlZmVyZW5jZS9Xb3JsZF9Cb3VuZGFyaWVzX2FuZF9QbGFjZXMvTWFwU2VydmVyL3RpbGUve3p9L3t5fS97eH0vIixvcHRpb25zOnttaW5ab29tOjEsbWF4Wm9vbToxOSxzdWJkb21haW5zOlsic2VydmVyIiwic2VydmljZXMiXX19LEltYWdlcnlUcmFuc3BvcnRhdGlvbjp7dXJsVGVtcGxhdGU6YisiLy97c30uYXJjZ2lzb25saW5lLmNvbS9BcmNHSVMvcmVzdC9zZXJ2aWNlcy9SZWZlcmVuY2UvV29ybGRfVHJhbnNwb3J0YXRpb24vTWFwU2VydmVyL3RpbGUve3p9L3t5fS97eH0vIixvcHRpb25zOnttaW5ab29tOjEsbWF4Wm9vbToxOSxzdWJkb21haW5zOlsic2VydmVyIiwic2VydmljZXMiXX19LEltYWdlcnlBbHRlcm5hdGVMYWJlbHM6e3VybFRlbXBsYXRlOmIrIi8ve3N9LmFyY2dpc29ubGluZS5jb20vQXJjR0lTL3Jlc3Qvc2VydmljZXMvUmVmZXJlbmNlL1dvcmxkX0JvdW5kYXJpZXNfYW5kX1BsYWNlc19BbHRlcm5hdGUvTWFwU2VydmVyL3RpbGUve3p9L3t5fS97eH0vIixvcHRpb25zOnttaW5ab29tOjEsbWF4Wm9vbToxMixzdWJkb21haW5zOlsic2VydmVyIiwic2VydmljZXMiXX19LFNoYWRlZFJlbGllZjp7dXJsVGVtcGxhdGU6YisiLy97c30uYXJjZ2lzb25saW5lLmNvbS9BcmNHSVMvcmVzdC9zZXJ2aWNlcy9Xb3JsZF9TaGFkZWRfUmVsaWVmL01hcFNlcnZlci90aWxlL3t6fS97eX0ve3h9LyIsb3B0aW9uczp7bWluWm9vbToxLG1heFpvb206MTMsc3ViZG9tYWluczpbInNlcnZlciIsInNlcnZpY2VzIl0sYXR0cmlidXRpb246ZigiRVNSSSwgTkFWVEVRLCBEZUxvcm1lIikrZX19fX0saW5pdGlhbGl6ZTpmdW5jdGlvbihiLGMpe3ZhciBkO2lmKCJvYmplY3QiPT10eXBlb2YgYiYmYi51cmxUZW1wbGF0ZSYmYi5vcHRpb25zKWQ9YjtlbHNle2lmKCJzdHJpbmciIT10eXBlb2YgYnx8IWEuZXNyaS5CYXNlbWFwTGF5ZXIuVElMRVNbYl0pdGhyb3cgbmV3IEVycm9yKCJMLmVzcmkuQmFzZW1hcExheWVyOiBJbnZhbGlkIHBhcmFtZXRlci4gVXNlIG9uZSBvZiAnU3RyZWV0cycsICdUb3BvZ3JhcGhpYycsICdPY2VhbnMnLCAnTmF0aW9uYWxHZW9ncmFwaGljJywgJ0dyYXknLCAnR3JheUxhYmVscycsICdJbWFnZXJ5JywgJ0ltYWdlcnlMYWJlbHMnLCAnSW1hZ2VyeVRyYW5zcG9ydGF0aW9uJywgJ0ltYWdlcnlBbHRlcm5hdGVMYWJlbHMnIG9yICdTaGFkZWRSZWxpZWYnIik7ZD1hLmVzcmkuQmFzZW1hcExheWVyLlRJTEVTW2JdfXZhciBlPWEuVXRpbC5leHRlbmQoZC5vcHRpb25zLGMpLGY9YS5lc3JpLlV0aWwuY2xlYW5VcmwoZC51cmxUZW1wbGF0ZSk7aWYoYS5UaWxlTGF5ZXIucHJvdG90eXBlLmluaXRpYWxpemUuY2FsbCh0aGlzLGYsYS5VdGlsLnNldE9wdGlvbnModGhpcyxlKSksZC5hdHRyaWJ1dGlvblVybCl7dmFyIGc9YS5lc3JpLlV0aWwuY2xlYW5VcmwoZC5hdHRyaWJ1dGlvblVybCk7dGhpcy5fZHluYW1pY0F0dHJpYnV0aW9uPSEwLHRoaXMuX2dldEF0dHJpYnV0aW9uRGF0YShnKX19LF9keW5hbWljQXR0cmlidXRpb246ITEsYm91bmRzOm51bGwsem9vbTpudWxsLG9uQWRkOmZ1bmN0aW9uKGIpe2EuVGlsZUxheWVyLnByb3RvdHlwZS5vbkFkZC5jYWxsKHRoaXMsYiksdGhpcy5fZHluYW1pY0F0dHJpYnV0aW9uJiYodGhpcy5vbigibG9hZCIsdGhpcy5faGFuZGxlVGlsZVVwZGF0ZXMsdGhpcyksdGhpcy5fbWFwLm9uKCJ2aWV3cmVzZXQgem9vbWVuZCBkcmFnZW5kIix0aGlzLl9oYW5kbGVUaWxlVXBkYXRlcyx0aGlzKSksdGhpcy5fbWFwLm9uKCJyZXNpemUiLHRoaXMuX3Jlc2l6ZUF0dHJpYnV0aW9uLHRoaXMpfSxvblJlbW92ZTpmdW5jdGlvbihiKXt0aGlzLl9keW5hbWljQXR0cmlidXRpb24mJih0aGlzLm9mZigibG9hZCIsdGhpcy5faGFuZGxlVGlsZVVwZGF0ZXMsdGhpcyksdGhpcy5fbWFwLm9mZigidmlld3Jlc2V0IHpvb21lbmQgZHJhZ2VuZCIsdGhpcy5faGFuZGxlVGlsZVVwZGF0ZXMsdGhpcykpLHRoaXMuX21hcC5vZmYoInJlc2l6ZSIsdGhpcy5fcmVzaXplQXR0cmlidXRpb24sdGhpcyksYS5UaWxlTGF5ZXIucHJvdG90eXBlLm9uUmVtb3ZlLmNhbGwodGhpcyxiKX0sX2hhbmRsZVRpbGVVcGRhdGVzOmZ1bmN0aW9uKGEpe3ZhciBiLGM7ImxvYWQiPT09YS50eXBlJiYoYj10aGlzLl9tYXAuZ2V0Qm91bmRzKCksYz10aGlzLl9tYXAuZ2V0Wm9vbSgpKSwoInZpZXdyZXNldCI9PT1hLnR5cGV8fCJkcmFnZW5kIj09PWEudHlwZXx8Inpvb21lbmQiPT09YS50eXBlKSYmKGI9YS50YXJnZXQuZ2V0Qm91bmRzKCksYz1hLnRhcmdldC5nZXRab29tKCkpLHRoaXMuYXR0cmlidXRpb25Cb3VuZGluZ0JveGVzJiZiJiZjJiYoYi5lcXVhbHModGhpcy5ib3VuZHMpJiZjPT09dGhpcy56b29tfHwodGhpcy5ib3VuZHM9Yix0aGlzLnpvb209Yyx0aGlzLl91cGRhdGVNYXBBdHRyaWJ1dGlvbigpKSl9LF9yZXNpemVBdHRyaWJ1dGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuX21hcC5nZXRTaXplKCkueDt0aGlzLl9nZXRBdHRyaWJ1dGlvbkxvZ28oKS5zdHlsZS5kaXNwbGF5PTYwMD5hPyJub25lIjoiYmxvY2siLHRoaXMuX2dldEF0dHJpYnV0aW9uU3BhbigpLnN0eWxlLm1heFdpZHRoPS43NSphKyJweCJ9LF9nZXRBdHRyaWJ1dGlvbkRhdGE6ZnVuY3Rpb24oYil7dGhpcy5hdHRyaWJ1dGlvbkJvdW5kaW5nQm94ZXM9W10sYS5lc3JpLmdldChiLHt9LHRoaXMuX3Byb2Nlc3NBdHRyaWJ1dGlvbkRhdGEsdGhpcyl9LF9wcm9jZXNzQXR0cmlidXRpb25EYXRhOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYz0wO2M8Yi5jb250cmlidXRvcnMubGVuZ3RoO2MrKylmb3IodmFyIGQ9Yi5jb250cmlidXRvcnNbY10sZT0wO2U8ZC5jb3ZlcmFnZUFyZWFzLmxlbmd0aDtlKyspe3ZhciBmPWQuY292ZXJhZ2VBcmVhc1tlXSxnPW5ldyBhLkxhdExuZyhmLmJib3hbMF0sZi5iYm94WzFdKSxoPW5ldyBhLkxhdExuZyhmLmJib3hbMl0sZi5iYm94WzNdKTt0aGlzLmF0dHJpYnV0aW9uQm91bmRpbmdCb3hlcy5wdXNoKHthdHRyaWJ1dGlvbjpkLmF0dHJpYnV0aW9uLHNjb3JlOmYuc2NvcmUsYm91bmRzOm5ldyBhLkxhdExuZ0JvdW5kcyhnLGgpLG1pblpvb206Zi56b29tTWluLG1heFpvb206Zi56b29tTWF4fSl9dGhpcy5hdHRyaWJ1dGlvbkJvdW5kaW5nQm94ZXMuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLnNjb3JlPGIuc2NvcmU/LTE6YS5zY29yZT5iLnNjb3JlPzE6MH0pLHRoaXMuYm91bmRzJiZ0aGlzLl91cGRhdGVNYXBBdHRyaWJ1dGlvbigpfSxfZ2V0QXR0cmlidXRpb25TcGFuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21hcC5fY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoIi5lc3JpLWF0dHJpYnV0aW9ucyIpWzBdfSxfZ2V0QXR0cmlidXRpb25Mb2dvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21hcC5fY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoIi5lc3JpLWF0dHJpYnV0aW9uLWxvZ28iKVswXX0sX3VwZGF0ZU1hcEF0dHJpYnV0aW9uOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSIiLGI9MDtiPHRoaXMuYXR0cmlidXRpb25Cb3VuZGluZ0JveGVzLmxlbmd0aDtiKyspe3ZhciBjPXRoaXMuYXR0cmlidXRpb25Cb3VuZGluZ0JveGVzW2JdO2lmKHRoaXMuYm91bmRzLmludGVyc2VjdHMoYy5ib3VuZHMpJiZ0aGlzLnpvb20+PWMubWluWm9vbSYmdGhpcy56b29tPD1jLm1heFpvb20pe3ZhciBkPXRoaXMuYXR0cmlidXRpb25Cb3VuZGluZ0JveGVzW2JdLmF0dHJpYnV0aW9uOy0xPT09YS5pbmRleE9mKGQpJiYoYS5sZW5ndGg+MCYmKGErPSIsICIpLGErPWQpfX10aGlzLl9nZXRBdHRyaWJ1dGlvblNwYW4oKS5pbm5lckhUTUw9YSx0aGlzLl9yZXNpemVBdHRyaWJ1dGlvbigpfX0pLGEuZXNyaS5iYXNlbWFwTGF5ZXI9ZnVuY3Rpb24oYixjKXtyZXR1cm4gbmV3IGEuZXNyaS5CYXNlbWFwTGF5ZXIoYixjKX19KEwpLGZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz1iPyJibG9jayI6Im5vbmUiO2lmKGEuX2ljb24mJihhLl9pY29uLnN0eWxlLmRpc3BsYXk9YyksYS5fc2hhZG93JiYoYS5fc2hhZG93LnN0eWxlLmRpc3BsYXk9YyksYS5fbGF5ZXJzKWZvcih2YXIgZCBpbiBhLl9sYXllcnMpYS5fbGF5ZXJzLmhhc093blByb3BlcnR5KGQpJiYoYS5fbGF5ZXJzW2RdLl9jb250YWluZXIuc3R5bGUuZGlzcGxheT1jKX1hLmVzcmkuRmVhdHVyZUxheWVyPWEuR2VvSlNPTi5leHRlbmQoe2luY2x1ZGVzOmEuZXNyaS5NaXhpbnMuZmVhdHVyZUdyaWQsb3B0aW9uczp7Y2VsbFNpemU6NTEyLGRlYm91bmNlOjEwMCxkZWR1cGxpY2F0ZTohMH0saW5pdGlhbGl6ZTpmdW5jdGlvbihiLGMpe3RoaXMuaW5kZXg9bmV3IFRlcnJhZm9ybWVyLlJUcmVlLHRoaXMudXJsPWEuZXNyaS5VdGlsLmNsZWFuVXJsKGIpLGEuVXRpbC5zZXRPcHRpb25zKHRoaXMsYyksYS5lc3JpLmdldCh0aGlzLnVybCx7fSxmdW5jdGlvbihhKXt0aGlzLmZpcmUoIm1ldGFkYXRhIix7bWV0YWRhdGE6YX0pfSx0aGlzKSxhLkdlb0pTT04ucHJvdG90eXBlLmluaXRpYWxpemUuY2FsbCh0aGlzLFtdLGMpfSxvbkFkZDpmdW5jdGlvbihiKXthLkxheWVyR3JvdXAucHJvdG90eXBlLm9uQWRkLmNhbGwodGhpcyxiKSxiLm9uKCJ6b29tZW5kIHJlc2l6ZSBtb3ZlRW5kIix0aGlzLl91cGRhdGUsdGhpcyksdGhpcy5faW5pdGlhbGl6ZUZlYXR1cmVHcmlkKGIpfSxvblJlbW92ZTpmdW5jdGlvbihiKXtiLm9mZigiem9vbWVuZCByZXNpemUgbW92ZUVuZCIsdGhpcy5fdXBkYXRlLHRoaXMpLGEuTGF5ZXJHcm91cC5wcm90b3R5cGUub25SZW1vdmUuY2FsbCh0aGlzLGIpLHRoaXMuX2Rlc3Ryb3lGZWF0dXJlR3JpZChiKX0sZ2V0TGF5ZXJJZDpmdW5jdGlvbihhKXtyZXR1cm4gYS5mZWF0dXJlLmlkfSxfdXBkYXRlOmZ1bmN0aW9uKGMpe3ZhciBkPWEuZXNyaS5VdGlsLmJvdW5kc1RvRW52ZWxvcGUoYy50YXJnZXQuZ2V0Qm91bmRzKCkpO3RoaXMuaW5kZXguc2VhcmNoKGQsYS5VdGlsLmJpbmQoZnVuY3Rpb24oYyxkKXt0aGlzLmVhY2hMYXllcihhLlV0aWwuYmluZChmdW5jdGlvbihjKXt2YXIgZT1jLmZlYXR1cmUuaWQ7YihjLGEuZXNyaS5VdGlsLmluZGV4T2YoZCxlKT49MCl9LHRoaXMpKX0sdGhpcykpfSxfcmVuZGVyOmZ1bmN0aW9uKGEpe2lmKGEub2JqZWN0SWRGaWVsZE5hbWUmJmEuZmVhdHVyZXMubGVuZ3RoJiYhYS5lcnJvcilmb3IodmFyIGI9YS5vYmplY3RJZEZpZWxkTmFtZSxjPWEuZmVhdHVyZXMubGVuZ3RoLTE7Yz49MDtjLS0pe3ZhciBkPWEuZmVhdHVyZXNbY10sZT1kLmF0dHJpYnV0ZXNbYl07aWYoIXRoaXMuX2xheWVyc1tlXSl7dmFyIGY9VGVycmFmb3JtZXIuQXJjR0lTLnBhcnNlKGQpO2YuaWQ9ZSx0aGlzLmluZGV4Lmluc2VydChmLGUpLHRoaXMuYWRkRGF0YShmKTt2YXIgZz10aGlzLl9sYXllcnNbZV07dGhpcy5maXJlKCJyZW5kZXIiLHtmZWF0dXJlOmcsZ2VvanNvbjpmfSl9fX19KSxhLmVzcmkuZmVhdHVyZUxheWVyPWZ1bmN0aW9uKGIsYyl7cmV0dXJuIG5ldyBhLmVzcmkuRmVhdHVyZUxheWVyKGIsYyl9fShMKSxMLmVzcmkuVGlsZWRNYXBMYXllcj1MLlRpbGVMYXllci5leHRlbmQoe2luY2x1ZGVzOkwuZXNyaS5NaXhpbnMuaWRlbnRpZmlhYmxlTGF5ZXIsaW5pdGlhbGl6ZTpmdW5jdGlvbihhLGIpe2I9Ynx8e30sdGhpcy5zZXJ2aWNlVXJsPUwuZXNyaS5VdGlsLmNsZWFuVXJsKGEpLHRoaXMudGlsZVVybD10aGlzLnNlcnZpY2VVcmwrInRpbGUve3p9L3t5fS97eH0iLHRoaXMudGlsZVVybC5tYXRjaCgiOi8vdGlsZXMuYXJjZ2lzLmNvbSIpJiYodGhpcy50aWxlVXJsPXRoaXMudGlsZVVybC5yZXBsYWNlKCI6Ly90aWxlcy5hcmNnaXMuY29tIiwiOi8vdGlsZXN7c30uYXJjZ2lzLmNvbSIpLGIuc3ViZG9tYWlucz1bIjEiLCIyIiwiMyIsIjQiXSksTC5lc3JpLmdldCh0aGlzLnNlcnZpY2VVcmwse30sZnVuY3Rpb24oYSl7dGhpcy5maXJlKCJtZXRhZGF0YSIse21ldGFkYXRhOmF9KX0sdGhpcyksTC5UaWxlTGF5ZXIucHJvdG90eXBlLmluaXRpYWxpemUuY2FsbCh0aGlzLHRoaXMudGlsZVVybCxiKX19KSxMLmVzcmkudGlsZWRNYXBMYXllcj1mdW5jdGlvbihhLGIpe3JldHVybiBuZXcgTC5lc3JpLlRpbGVkTWFwTGF5ZXIoYSxiKX0sLyohCiAqIFRoZSBNSVQgTGljZW5zZSAoTUlUKQogKgogKiBDb3B5cmlnaHQgKGMpIDIwMTMgU2FuYm9ybiBNYXAgQ29tcGFueSwgSW5jLgogKgogKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAogKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKICoKICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCiAqCiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAogKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgogKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAogKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCiAqIFRIRSBTT0ZUV0FSRS4KICovCkwuZXNyaS5EeW5hbWljTWFwTGF5ZXI9TC5JbWFnZU92ZXJsYXkuZXh0ZW5kKHtpbmNsdWRlczpMLmVzcmkuTWl4aW5zLmlkZW50aWZpYWJsZUxheWVyLGRlZmF1bHRQYXJhbXM6e2Zvcm1hdDoicG5nOCIsdHJhbnNwYXJlbnQ6ITAsZjoiaW1hZ2UiLGJib3hTUjoxMDIxMDAsaW1hZ2VTUjoxMDIxMDAsbGF5ZXJzOiIiLG9wYWNpdHk6MX0saW5pdGlhbGl6ZTpmdW5jdGlvbihhLGIpe3RoaXMuX3VybD1MLmVzcmkuVXRpbC5jbGVhblVybChhKSx0aGlzLl9sYXllclBhcmFtcz1MLlV0aWwuZXh0ZW5kKHt9LHRoaXMuZGVmYXVsdFBhcmFtcyk7Zm9yKHZhciBjIGluIGIpdGhpcy5vcHRpb25zLmhhc093blByb3BlcnR5KGMpfHwodGhpcy5fbGF5ZXJQYXJhbXNbY109YltjXSk7ZGVsZXRlIHRoaXMuX2xheWVyUGFyYW1zLnRva2VuLHRoaXMuX3BhcnNlTGF5ZXJzKCksdGhpcy5fcGFyc2VMYXllckRlZnMoKSxMLmVzcmkuZ2V0KHRoaXMuX3VybCx7fSxmdW5jdGlvbihhKXt0aGlzLmZpcmUoIm1ldGFkYXRhIix7bWV0YWRhdGE6YX0pfSx0aGlzKSxMLlV0aWwuc2V0T3B0aW9ucyh0aGlzLGIpfSxvbkFkZDpmdW5jdGlvbihhKXtpZih0aGlzLl9tYXA9YSx0aGlzLl9pbWFnZXx8dGhpcy5faW5pdEltYWdlKCksYS5fcGFuZXMub3ZlcmxheVBhbmUuYXBwZW5kQ2hpbGQodGhpcy5faW1hZ2UpLGEub24oe3ZpZXdyZXNldDp0aGlzLl9yZXNldCxtb3ZlZW5kOnRoaXMuX3VwZGF0ZSx6b29tZW5kOnRoaXMuX3pvb21VcGRhdGV9LHRoaXMpLGEub3B0aW9ucy56b29tQW5pbWF0aW9uJiZMLkJyb3dzZXIuYW55M2QmJmEub24oInpvb21hbmltIix0aGlzLl9hbmltYXRlWm9vbSx0aGlzKSxhLm9wdGlvbnMuY3JzJiZhLm9wdGlvbnMuY3JzLmNvZGUpe3ZhciBiPWEub3B0aW9ucy5jcnMuY29kZS5zcGxpdCgiOiIpWzFdO3RoaXMuX2xheWVyUGFyYW1zLmJib3hTUj1iLHRoaXMuX2xheWVyUGFyYW1zLmltYWdlU1I9Yn10aGlzLl9yZXNldCgpfSxvblJlbW92ZTpmdW5jdGlvbihhKXthLmdldFBhbmVzKCkub3ZlcmxheVBhbmUucmVtb3ZlQ2hpbGQodGhpcy5faW1hZ2UpLGEub2ZmKHt2aWV3cmVzZXQ6dGhpcy5fcmVzZXQsbW92ZWVuZDp0aGlzLl91cGRhdGV9LHRoaXMpLGEub3B0aW9ucy56b29tQW5pbWF0aW9uJiZhLm9mZigiem9vbWFuaW0iLHRoaXMuX2FuaW1hdGVab29tLHRoaXMpfSxfYW5pbWF0ZVpvb206ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5fbWFwLGM9dGhpcy5faW1hZ2UsZD1iLmdldFpvb21TY2FsZShhLnpvb20pLGU9dGhpcy5fbWFwLmdldEJvdW5kcygpLmdldE5vcnRoV2VzdCgpLGY9dGhpcy5fbWFwLmdldEJvdW5kcygpLmdldFNvdXRoRWFzdCgpLGc9Yi5fbGF0TG5nVG9OZXdMYXllclBvaW50KGUsYS56b29tLGEuY2VudGVyKSxoPWIuX2xhdExuZ1RvTmV3TGF5ZXJQb2ludChmLGEuem9vbSxhLmNlbnRlcikuX3N1YnRyYWN0KGcpLGk9Zy5fYWRkKGguX211bHRpcGx5QnkoLjUqKDEtMS9kKSkpO2Muc3R5bGVbTC5Eb21VdGlsLlRSQU5TRk9STV09TC5Eb21VdGlsLmdldFRyYW5zbGF0ZVN0cmluZyhpKSsiIHNjYWxlKCIrZCsiKSAifSxfcGFyc2VMYXllcnM6ZnVuY3Rpb24oKXtpZigidW5kZWZpbmVkIj09dHlwZW9mIHRoaXMuX2xheWVyUGFyYW1zLmxheWVycylyZXR1cm4gZGVsZXRlIHRoaXMuX2xheWVyUGFyYW1zLmxheWVyT3B0aW9uLHZvaWQgMDt2YXIgYT10aGlzLl9sYXllclBhcmFtcy5sYXllck9wdGlvbnx8bnVsbCxiPXRoaXMuX2xheWVyUGFyYW1zLmxheWVyc3x8bnVsbCxjPSJzaG93IixkPVsic2hvdyIsImhpZGUiLCJpbmNsdWRlIiwiZXhjbHVkZSJdO2lmKGRlbGV0ZSB0aGlzLl9sYXllclBhcmFtcy5sYXllck9wdGlvbixhKS0xIT09ZC5pbmRleE9mKGEpJiYoYz1hKSx0aGlzLl9sYXllclBhcmFtcy5sYXllcnM9YysiOiIrYjtlbHNlIGlmKGIgaW5zdGFuY2VvZiBBcnJheSl0aGlzLl9sYXllclBhcmFtcy5sYXllcnM9YysiOiIrYi5qb2luKCIsIik7ZWxzZSBpZigic3RyaW5nIj09dHlwZW9mIGIpe3ZhciBlPWIubWF0Y2goIjoiKTtlJiYoYj1iLnNwbGl0KGVbMF0pLE51bWJlcihiWzFdLnNwbGl0KCIsIilbMF0pJiYoLTEhPT1kLmluZGV4T2YoYlswXSkmJihjPWJbMF0pLGI9YlsxXSkpLHRoaXMuX2xheWVyUGFyYW1zLmxheWVycz1jKyI6IitifX0sX3BhcnNlTGF5ZXJEZWZzOmZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiB0aGlzLl9sYXllclBhcmFtcy5sYXllckRlZnMpe3ZhciBhPXRoaXMuX2xheWVyUGFyYW1zLmxheWVyRGVmcyxiPVtdO2lmKGEgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGM9YS5sZW5ndGgsZD0wO2M+ZDtkKyspYVtkXSYmYi5wdXNoKGQrIjoiK2FbZF0pO2Vsc2V7aWYoIm9iamVjdCIhPXR5cGVvZiBhKXJldHVybiBkZWxldGUgdGhpcy5fbGF5ZXJQYXJhbXMubGF5ZXJEZWZzLHZvaWQgMDtmb3IodmFyIGUgaW4gYSlhLmhhc093blByb3BlcnR5KGUpJiZiLnB1c2goZSsiOiIrYVtlXSl9dGhpcy5fbGF5ZXJQYXJhbXMubGF5ZXJEZWZzPWIuam9pbigiOyIpfX0sX2luaXRJbWFnZTpmdW5jdGlvbigpe3RoaXMuX2ltYWdlPUwuRG9tVXRpbC5jcmVhdGUoImltZyIsImxlYWZsZXQtaW1hZ2UtbGF5ZXIiKSx0aGlzLl9tYXAub3B0aW9ucy56b29tQW5pbWF0aW9uJiZMLkJyb3dzZXIuYW55M2Q/TC5Eb21VdGlsLmFkZENsYXNzKHRoaXMuX2ltYWdlLCJsZWFmbGV0LXpvb20tYW5pbWF0ZWQiKTpMLkRvbVV0aWwuYWRkQ2xhc3ModGhpcy5faW1hZ2UsImxlYWZsZXQtem9vbS1oaWRlIiksdGhpcy5fdXBkYXRlT3BhY2l0eSgpLEwuVXRpbC5leHRlbmQodGhpcy5faW1hZ2Use2dhbGxlcnlpbWc6Im5vIixvbnNlbGVjdHN0YXJ0OkwuVXRpbC5mYWxzZUZuLG9ubW91c2Vtb3ZlOkwuVXRpbC5mYWxzZUZuLG9ubG9hZDpMLlV0aWwuYmluZCh0aGlzLl9vbkltYWdlTG9hZCx0aGlzKSxzcmM6dGhpcy5fZ2V0SW1hZ2VVcmwoKX0pfSxfZ2V0SW1hZ2VVcmw6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLl9tYXAuZ2V0Qm91bmRzKCksYj10aGlzLl9tYXAuZ2V0U2l6ZSgpLGM9dGhpcy5fbWFwLm9wdGlvbnMuY3JzLnByb2plY3QoYS5fbm9ydGhFYXN0KSxkPXRoaXMuX21hcC5vcHRpb25zLmNycy5wcm9qZWN0KGEuX3NvdXRoV2VzdCk7dGhpcy5fbGF5ZXJQYXJhbXMuYmJveD1bZC54LGQueSxjLngsYy55XS5qb2luKCIsIiksdGhpcy5fbGF5ZXJQYXJhbXMuc2l6ZT1iLngrIiwiK2IueTt2YXIgZT10aGlzLl91cmwrImV4cG9ydCIrTC5VdGlsLmdldFBhcmFtU3RyaW5nKHRoaXMuX2xheWVyUGFyYW1zKTtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIHRoaXMub3B0aW9ucy50b2tlbiYmKGU9ZSsiJnRva2VuPSIrdGhpcy5vcHRpb25zLnRva2VuKSxlfSxfdXBkYXRlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuX21hcC5fcGFuVHJhbnNpdGlvbnx8IXRoaXMuX21hcC5fcGFuVHJhbnNpdGlvbi5faW5Qcm9ncmVzcyl7dmFyIGE9dGhpcy5fbWFwLmdldFpvb20oKTthPnRoaXMub3B0aW9ucy5tYXhab29tfHxhPHRoaXMub3B0aW9ucy5taW5ab29tfHwodGhpcy5fbmV3SW1hZ2U9TC5Eb21VdGlsLmNyZWF0ZSgiaW1nIiwibGVhZmxldC1pbWFnZS1sYXllciIpLHRoaXMuX21hcC5vcHRpb25zLnpvb21BbmltYXRpb24mJkwuQnJvd3Nlci5hbnkzZD9MLkRvbVV0aWwuYWRkQ2xhc3ModGhpcy5fbmV3SW1hZ2UsImxlYWZsZXQtem9vbS1hbmltYXRlZCIpOkwuRG9tVXRpbC5hZGRDbGFzcyh0aGlzLl9uZXdJbWFnZSwibGVhZmxldC16b29tLWhpZGUiKSx0aGlzLl91cGRhdGVPcGFjaXR5KCksTC5VdGlsLmV4dGVuZCh0aGlzLl9uZXdJbWFnZSx7Z2FsbGVyeWltZzoibm8iLG9uc2VsZWN0c3RhcnQ6TC5VdGlsLmZhbHNlRm4sb25tb3VzZW1vdmU6TC5VdGlsLmZhbHNlRm4sb25sb2FkOkwuVXRpbC5iaW5kKHRoaXMuX29uTmV3SW1hZ2VMb2FkLHRoaXMpLHNyYzp0aGlzLl9nZXRJbWFnZVVybCgpfSkpfX0sX3VwZGF0ZU9wYWNpdHk6ZnVuY3Rpb24oKXtMLkRvbVV0aWwuc2V0T3BhY2l0eSh0aGlzLl9pbWFnZSx0aGlzLm9wdGlvbnMub3BhY2l0eSksdGhpcy5fbmV3SW1hZ2UmJkwuRG9tVXRpbC5zZXRPcGFjaXR5KHRoaXMuX25ld0ltYWdlLHRoaXMub3B0aW9ucy5vcGFjaXR5KX0sX3pvb21VcGRhdGU6ZnVuY3Rpb24oKXt9LF9vbk5ld0ltYWdlTG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuX21hcC5nZXRCb3VuZHMoKSxiPUwubGF0TG5nKGEuX25vcnRoRWFzdC5sYXQsYS5fc291dGhXZXN0LmxuZyksYz1MLmxhdExuZyhhLl9zb3V0aFdlc3QubGF0LGEuX25vcnRoRWFzdC5sbmcpLGQ9dGhpcy5fbWFwLmxhdExuZ1RvTGF5ZXJQb2ludChiKSxlPXRoaXMuX21hcC5sYXRMbmdUb0xheWVyUG9pbnQoYykuX3N1YnRyYWN0KGQpO0wuRG9tVXRpbC5zZXRQb3NpdGlvbih0aGlzLl9uZXdJbWFnZSxkKSx0aGlzLl9uZXdJbWFnZS5zdHlsZS53aWR0aD1lLngrInB4Iix0aGlzLl9uZXdJbWFnZS5zdHlsZS5oZWlnaHQ9ZS55KyJweCIsbnVsbD09dGhpcy5faW1hZ2U/dGhpcy5fbWFwLl9wYW5lcy5vdmVybGF5UGFuZS5hcHBlbmRDaGlsZCh0aGlzLl9uZXdJbWFnZSk6dGhpcy5fbWFwLl9wYW5lcy5vdmVybGF5UGFuZS5pbnNlcnRCZWZvcmUodGhpcy5fbmV3SW1hZ2UsdGhpcy5faW1hZ2UpLHRoaXMuX21hcC5fcGFuZXMub3ZlcmxheVBhbmUucmVtb3ZlQ2hpbGQodGhpcy5faW1hZ2UpLHRoaXMuX2ltYWdlPXRoaXMuX25ld0ltYWdlLHRoaXMuX25ld0ltYWdlPW51bGx9LF9vbkltYWdlTG9hZDpmdW5jdGlvbigpe3RoaXMuZmlyZSgibG9hZCIpfSxfcmVzZXQ6ZnVuY3Rpb24oKXt9fSksTC5lc3JpLmR5bmFtaWNNYXBMYXllcj1mdW5jdGlvbihhLGIpe3JldHVybiBuZXcgTC5lc3JpLkR5bmFtaWNNYXBMYXllcihhLGIpfTs=]]></data>
	</file>
	<file>
	  <filename>/lib/js/esri-leaflet/extras/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/js/esri-leaflet/extras/clustered-feature-layer-src.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohIEVzcmktTGVhZmxldCAtIHYwLjAuMSAtIDIwMTMtMDktMjYKKiAgIENvcHlyaWdodCAoYykgMjAxMyBFbnZpcm9ubWVudGFsIFN5c3RlbXMgUmVzZWFyY2ggSW5zdGl0dXRlLCBJbmMuCiogICBBcGFjaGUgTGljZW5zZSovCi8qIGdsb2JhbHMgVGVycmFmb3JtZXIsIEwgKi8KKGZ1bmN0aW9uKEwsIFRlcnJhZm9ybWVyKXsKICBMLmVzcmkuQ2x1c3RlcmVkRmVhdHVyZUxheWVyID0gTC5DbGFzcy5leHRlbmQoewogICAgaW5jbHVkZXM6IEwuZXNyaS5NaXhpbnMuZmVhdHVyZUdyaWQsCiAgICBvcHRpb25zOiB7CiAgICAgIGNlbGxTaXplOiA1MTIsCiAgICAgIGRlYm91bmNlOiAxMDAsCiAgICAgIGRlZHVwbGljYXRlOiB0cnVlLAogICAgICBjcmVhdGVNYXJrZXI6IGZ1bmN0aW9uIChnZW9qc29uLCBsYXRsbmcpIHsKICAgICAgICByZXR1cm4gbmV3IEwubWFya2VyKGxhdGxuZyk7CiAgICAgIH0sCiAgICAgIG9uRWFjaE1hcmtlcjogdW5kZWZpbmVkCiAgICB9LAogICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24odXJsLCBvcHRpb25zKXsKICAgICAgTC5VdGlsLnNldE9wdGlvbnModGhpcywgb3B0aW9ucyk7CiAgICAgIHRoaXMudXJsID0gTC5lc3JpLlV0aWwuY2xlYW5VcmwodXJsKTsKCiAgICAgIEwuZXNyaS5nZXQodGhpcy51cmwsIHt9LCBmdW5jdGlvbihyZXNwb25zZSl7CiAgICAgICAgdGhpcy5maXJlKCJtZXRhZGF0YSIsIHsgbWV0YWRhdGE6IHJlc3BvbnNlIH0pOwogICAgICB9LCB0aGlzKTsKCiAgICAgIHRoaXMuX2xvYWRlZCA9IFtdOwogICAgICB0aGlzLmNsdXN0ZXIgPSB0aGlzLm9wdGlvbnMuY2x1c3RlciB8fCBuZXcgTC5NYXJrZXJDbHVzdGVyR3JvdXAoKTsKICAgIH0sCiAgICBvbkFkZDogZnVuY3Rpb24obWFwKXsKICAgICAgdGhpcy5jbHVzdGVyLmFkZFRvKG1hcCk7CiAgICAgIHRoaXMuX2luaXRpYWxpemVGZWF0dXJlR3JpZChtYXApOwogICAgfSwKICAgIG9uUmVtb3ZlOiBmdW5jdGlvbihtYXApewogICAgICBtYXAucmVtb3ZlTGF5ZXIodGhpcy5jbHVzdGVyKTsKICAgICAgdGhpcy5fZGVzdHJveUZlYXR1cmVHcmlkKG1hcCk7CiAgICB9LAogICAgYWRkVG86IGZ1bmN0aW9uIChtYXApIHsKICAgICAgbWFwLmFkZExheWVyKHRoaXMpOwogICAgICByZXR1cm4gdGhpczsKICAgIH0sCiAgICBfcmVuZGVyOiBmdW5jdGlvbihyZXNwb25zZSl7CiAgICAgIGlmKHJlc3BvbnNlLm9iamVjdElkRmllbGROYW1lICYmIHJlc3BvbnNlLmZlYXR1cmVzLmxlbmd0aCAmJiAhcmVzcG9uc2UuZXJyb3IpewogICAgICAgIHZhciBpZEtleSA9IHJlc3BvbnNlLm9iamVjdElkRmllbGROYW1lOwogICAgICAgIGZvciAodmFyIGkgPSByZXNwb25zZS5mZWF0dXJlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewogICAgICAgICAgdmFyIGZlYXR1cmUgPSByZXNwb25zZS5mZWF0dXJlc1tpXTsKICAgICAgICAgIHZhciBpZCA9IGZlYXR1cmUuYXR0cmlidXRlc1tpZEtleV07CiAgICAgICAgICBpZihMLmVzcmkuVXRpbC5pbmRleE9mKHRoaXMuX2xvYWRlZCwgaWQpIDwgMCl7CiAgICAgICAgICAgIHZhciBnZW9qc29uID0gVGVycmFmb3JtZXIuQXJjR0lTLnBhcnNlKGZlYXR1cmUpOwogICAgICAgICAgICBnZW9qc29uLmlkID0gaWQ7CiAgICAgICAgICAgIHZhciBtYXJrZXIgPSB0aGlzLm9wdGlvbnMuY3JlYXRlTWFya2VyKGdlb2pzb24sIFtnZW9qc29uLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzFdLCBnZW9qc29uLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdXSk7CgogICAgICAgICAgICBpZih0aGlzLm9wdGlvbnMub25FYWNoTWFya2VyKXsKICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMub25FYWNoTWFya2VyKGdlb2pzb24sIG1hcmtlcik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuY2x1c3Rlci5hZGRMYXllcihtYXJrZXIpOwogICAgICAgICAgICB0aGlzLl9sb2FkZWQucHVzaChpZCk7CgogICAgICAgICAgICB0aGlzLmZpcmUoInJlbmRlciIsIHsKICAgICAgICAgICAgICBmZWF0dXJlOiBtYXJrZXIsCiAgICAgICAgICAgICAgZ2VvanNvbjogZ2VvanNvbgogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9KTsKCiAgTC5lc3JpLkNsdXN0ZXJlZEZlYXR1cmVMYXllci5pbmNsdWRlKEwuTWl4aW4uRXZlbnRzKTsKCiAgTC5lc3JpLmNsdXN0ZXJlZEZlYXR1cmVMYXllciA9IGZ1bmN0aW9uKHVybCwgb3B0aW9ucyl7CiAgICByZXR1cm4gbmV3IEwuZXNyaS5DbHVzdGVyZWRGZWF0dXJlTGF5ZXIodXJsLCBvcHRpb25zKTsKICB9Owp9KShMLCBUZXJyYWZvcm1lcik7]]></data>
	</file>
	<file>
	  <filename>/lib/js/esri-leaflet/extras/clustered-feature-layer.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohIEVzcmktTGVhZmxldCAtIHYwLjAuMSAtIDIwMTMtMDktMjYKKiAgIENvcHlyaWdodCAoYykgMjAxMyBFbnZpcm9ubWVudGFsIFN5c3RlbXMgUmVzZWFyY2ggSW5zdGl0dXRlLCBJbmMuCiogICBBcGFjaGUgTGljZW5zZSovCiFmdW5jdGlvbihhLFRlcnJhZm9ybWVyKXthLmVzcmkuQ2x1c3RlcmVkRmVhdHVyZUxheWVyPWEuQ2xhc3MuZXh0ZW5kKHtpbmNsdWRlczphLmVzcmkuTWl4aW5zLmZlYXR1cmVHcmlkLG9wdGlvbnM6e2NlbGxTaXplOjUxMixkZWJvdW5jZToxMDAsZGVkdXBsaWNhdGU6ITAsY3JlYXRlTWFya2VyOmZ1bmN0aW9uKGIsYyl7cmV0dXJuIG5ldyBhLm1hcmtlcihjKX0sb25FYWNoTWFya2VyOnZvaWQgMH0saW5pdGlhbGl6ZTpmdW5jdGlvbihiLGMpe2EuVXRpbC5zZXRPcHRpb25zKHRoaXMsYyksdGhpcy51cmw9YS5lc3JpLlV0aWwuY2xlYW5VcmwoYiksYS5lc3JpLmdldCh0aGlzLnVybCx7fSxmdW5jdGlvbihhKXt0aGlzLmZpcmUoIm1ldGFkYXRhIix7bWV0YWRhdGE6YX0pfSx0aGlzKSx0aGlzLl9sb2FkZWQ9W10sdGhpcy5jbHVzdGVyPXRoaXMub3B0aW9ucy5jbHVzdGVyfHxuZXcgYS5NYXJrZXJDbHVzdGVyR3JvdXB9LG9uQWRkOmZ1bmN0aW9uKGEpe3RoaXMuY2x1c3Rlci5hZGRUbyhhKSx0aGlzLl9pbml0aWFsaXplRmVhdHVyZUdyaWQoYSl9LG9uUmVtb3ZlOmZ1bmN0aW9uKGEpe2EucmVtb3ZlTGF5ZXIodGhpcy5jbHVzdGVyKSx0aGlzLl9kZXN0cm95RmVhdHVyZUdyaWQoYSl9LGFkZFRvOmZ1bmN0aW9uKGEpe3JldHVybiBhLmFkZExheWVyKHRoaXMpLHRoaXN9LF9yZW5kZXI6ZnVuY3Rpb24oYil7aWYoYi5vYmplY3RJZEZpZWxkTmFtZSYmYi5mZWF0dXJlcy5sZW5ndGgmJiFiLmVycm9yKWZvcih2YXIgYz1iLm9iamVjdElkRmllbGROYW1lLGQ9Yi5mZWF0dXJlcy5sZW5ndGgtMTtkPj0wO2QtLSl7dmFyIGU9Yi5mZWF0dXJlc1tkXSxmPWUuYXR0cmlidXRlc1tjXTtpZihhLmVzcmkuVXRpbC5pbmRleE9mKHRoaXMuX2xvYWRlZCxmKTwwKXt2YXIgZz1UZXJyYWZvcm1lci5BcmNHSVMucGFyc2UoZSk7Zy5pZD1mO3ZhciBoPXRoaXMub3B0aW9ucy5jcmVhdGVNYXJrZXIoZyxbZy5nZW9tZXRyeS5jb29yZGluYXRlc1sxXSxnLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdXSk7dGhpcy5vcHRpb25zLm9uRWFjaE1hcmtlciYmdGhpcy5vcHRpb25zLm9uRWFjaE1hcmtlcihnLGgpLHRoaXMuY2x1c3Rlci5hZGRMYXllcihoKSx0aGlzLl9sb2FkZWQucHVzaChmKSx0aGlzLmZpcmUoInJlbmRlciIse2ZlYXR1cmU6aCxnZW9qc29uOmd9KX19fX0pLGEuZXNyaS5DbHVzdGVyZWRGZWF0dXJlTGF5ZXIuaW5jbHVkZShhLk1peGluLkV2ZW50cyksYS5lc3JpLmNsdXN0ZXJlZEZlYXR1cmVMYXllcj1mdW5jdGlvbihiLGMpe3JldHVybiBuZXcgYS5lc3JpLkNsdXN0ZXJlZEZlYXR1cmVMYXllcihiLGMpfX0oTCxUZXJyYWZvcm1lcik7]]></data>
	</file>
	<file>
	  <filename>/lib/js/esri-leaflet/extras/esri-basemaps-src.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohIEVzcmktTGVhZmxldCAtIHYwLjAuMSAtIDIwMTMtMDktMjYKKiAgIENvcHlyaWdodCAoYykgMjAxMyBFbnZpcm9ubWVudGFsIFN5c3RlbXMgUmVzZWFyY2ggSW5zdGl0dXRlLCBJbmMuCiogICBBcGFjaGUgTGljZW5zZSovCi8qIGdsb2JhbHMgTCAqLwoKTC5lc3JpID0gewogIF9jYWxsYmFjazoge30KfTsKCi8vIE5hbWVzcGFjZSBmb3IgdmFyaW91cyBzdXBwb3J0IHZhcmlhYmxlcyB3ZSBuZWVkIHRvIHRyYWNrCkwuZXNyaS5TdXBwb3J0ID0gewogIC8vIGZyb206IGh0dHBzOi8vZ2l0aHViLmNvbS9Nb2Rlcm5penIvTW9kZXJuaXpyL2Jsb2IvbWFzdGVyL2ZlYXR1cmUtZGV0ZWN0cy9jb3JzLmpzI0wyMAogIENPUlM6ICEhKHdpbmRvdy5YTUxIdHRwUmVxdWVzdCAmJiAnd2l0aENyZWRlbnRpYWxzJyBpbiBuZXcgWE1MSHR0cFJlcXVlc3QoKSkKfTsKCi8vIEFKQVggaGFuZGxlcnMgZm9yIENPUlMgKG1vZGVybiBicm93c2Vycykgb3IgSlNPTlAgKG9sZGVyIGJyb3dzZXJzKQpMLmVzcmkuUmVxdWVzdEhhbmRsZXJzID0gewogIENPUlM6IGZ1bmN0aW9uKHVybCwgcGFyYW1zLCBjYWxsYmFjaywgY29udGV4dCl7CiAgICB2YXIgaHR0cFJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKCiAgICBwYXJhbXMuZj0ianNvbiI7CgogICAgaHR0cFJlcXVlc3Qub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKXsKICAgICAgdmFyIHJlc3BvbnNlOwogICAgICBpZiAoaHR0cFJlcXVlc3QucmVhZHlTdGF0ZSA9PT0gNCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICByZXNwb25zZSA9IEpTT04ucGFyc2UoaHR0cFJlcXVlc3QucmVzcG9uc2VUZXh0KTsKICAgICAgICB9IGNhdGNoKGUpIHsKICAgICAgICAgIHJlc3BvbnNlID0gewogICAgICAgICAgICBlcnJvcjogIkNvdWxkIG5vdCBwYXJzZSByZXNwb25zZSBhcyBKU09OLiIKICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGlmKGNvbnRleHQpewogICAgICAgICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCByZXNwb25zZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNhbGxiYWNrKHJlc3BvbnNlKTsKICAgICAgICB9CiAgICAgIH0KICAgIH07CgogICAgaHR0cFJlcXVlc3Qub3BlbignR0VUJywgdXJsICsgTC5lc3JpLlV0aWwuc2VyaWFsaXplKHBhcmFtcyksIHRydWUpOwogICAgaHR0cFJlcXVlc3Quc2VuZChudWxsKTsKICB9LAogIEpTT05QOiBmdW5jdGlvbih1cmwsIHBhcmFtcywgY2FsbGJhY2ssIGNvbnRleHQpewogICAgdmFyIGNhbGxiYWNrSWQgPSAiYyIrKE1hdGgucmFuZG9tKCkgKiAxZTkpLnRvU3RyaW5nKDM2KS5yZXBsYWNlKCIuIiwgIl8iKTsKCiAgICBwYXJhbXMuZj0ianNvbiI7CiAgICBwYXJhbXMuY2FsbGJhY2s9IkwuZXNyaS5fY2FsbGJhY2suIitjYWxsYmFja0lkOwoKICAgIHZhciBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTsKICAgIHNjcmlwdC50eXBlID0gJ3RleHQvamF2YXNjcmlwdCc7CiAgICBzY3JpcHQuc3JjID0gdXJsICsgTC5lc3JpLlV0aWwuc2VyaWFsaXplKHBhcmFtcyk7CiAgICBzY3JpcHQuaWQgPSBjYWxsYmFja0lkOwoKICAgIEwuZXNyaS5fY2FsbGJhY2tbY2FsbGJhY2tJZF0gPSBmdW5jdGlvbihyZXNwb25zZSl7CiAgICAgIGlmKGNvbnRleHQpewogICAgICAgIGNhbGxiYWNrLmNhbGwoY29udGV4dCwgcmVzcG9uc2UpOwogICAgICB9IGVsc2UgewogICAgICAgIGNhbGxiYWNrKHJlc3BvbnNlKTsKICAgICAgfQogICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHNjcmlwdCk7CiAgICAgIGRlbGV0ZSBMLmVzcmkuX2NhbGxiYWNrW2NhbGxiYWNrSWRdOwogICAgfTsKCiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHNjcmlwdCk7CiAgfQp9OwoKLy8gQ2hvb3NlIHRoZSBjb3JyZWN0IEFKQVggaGFuZGxlciBkZXBlbmRpbmcgb24gQ09SUyBzdXBwb3J0CkwuZXNyaS5nZXQgPSAoTC5lc3JpLlN1cHBvcnQuQ09SUykgPyBMLmVzcmkuUmVxdWVzdEhhbmRsZXJzLkNPUlMgOiBMLmVzcmkuUmVxdWVzdEhhbmRsZXJzLkpTT05QOwoKLy8gR2VuZXJhbCB1dGlsaXR5IG5hbWVzcGFjZQpMLmVzcmkuVXRpbCA9IHsKICAvLyBtYWtlIGl0IHNvIHRoYXQgcGFzc2VkIGBmdW5jdGlvbmAgbmV2ZXIgZ2V0cyBjYWxsZWQKICAvLyB0d2ljZSB3aXRoaW4gYGRlbGF5YCBtaWxsaXNlY29uZHMuIFVzZWQgdG8gdGhyb3R0bGUKICAvLyBgbW92ZWAgZXZlbnRzIG9uIHRoZSBsYXllci4KICAvLyBodHRwOi8vcmVteXNoYXJwLmNvbS8yMDEwLzA3LzIxL3Rocm90dGxpbmctZnVuY3Rpb24tY2FsbHMvCiAgZGVib3VuY2U6IGZ1bmN0aW9uIChmbiwgZGVsYXksIGNvbnRleHQpIHsKICAgIHZhciB0aW1lciA9IG51bGw7CiAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgIHZhciBjb250ZXh0ID0gdGhpc3x8Y29udGV4dCwgYXJncyA9IGFyZ3VtZW50czsKICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTsKICAgICAgdGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICBmbi5hcHBseShjb250ZXh0LCBhcmdzKTsKICAgICAgfSwgZGVsYXkpOwogICAgfTsKICB9LAogIC8vIHJvdW5kIGEgbnVtYmVyIGF3YXkgZnJvbSB6ZXJvIHVzZWQgdG8gc25hcAogIC8vIHJvdy9jb2x1bW5zIGF3YXkgZnJvbSB0aGUgb3JpZ2luIG9mIHRoZSBncmlkCiAgcm91bmRBd2F5RnJvbVplcm86IGZ1bmN0aW9uIChudW0pewogICAgcmV0dXJuIChudW0gPiAwKSA/IE1hdGguY2VpbChudW0pIDogTWF0aC5mbG9vcihudW0pOwogIH0sCiAgdHJpbTogZnVuY3Rpb24oc3RyKSB7CiAgICByZXR1cm4gc3RyLnJlcGxhY2UoL15cc1xzKi8sICcnKS5yZXBsYWNlKC9cc1xzKiQvLCAnJyk7CiAgfSwKICBjbGVhblVybDogZnVuY3Rpb24odXJsKXsKICAgIHVybCA9IEwuZXNyaS5VdGlsLnRyaW0odXJsKTsKCiAgICAvL2FkZCBhIHRyYWlsaW5nIHNsYXNoIHRvIHRoZSB1cmwgaWYgdGhlIHVzZXIgb21pdHRlZCBpdAogICAgaWYodXJsW3VybC5sZW5ndGgtMV0gIT09ICIvIil7CiAgICAgIHVybCArPSAiLyI7CiAgICB9CgogICAgcmV0dXJuIHVybDsKICB9LAogIC8vIHF1aWNrIGFuZCBkaXJ0eSBzZXJpYWxpemF0aW9uCiAgc2VyaWFsaXplOiBmdW5jdGlvbihwYXJhbXMpewogICAgdmFyIHFzPSI/IjsKCiAgICBmb3IodmFyIHBhcmFtIGluIHBhcmFtcyl7CiAgICAgIGlmKHBhcmFtcy5oYXNPd25Qcm9wZXJ0eShwYXJhbSkpewogICAgICAgIHZhciBrZXkgPSBwYXJhbTsKICAgICAgICB2YXIgdmFsdWUgPSBwYXJhbXNbcGFyYW1dOwogICAgICAgIHFzKz1lbmNvZGVVUklDb21wb25lbnQoa2V5KTsKICAgICAgICBxcys9Ij0iOwogICAgICAgIHFzKz1lbmNvZGVVUklDb21wb25lbnQodmFsdWUpOwogICAgICAgIHFzKz0iJiI7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gcXMuc3Vic3RyaW5nKDAsIHFzLmxlbmd0aCAtIDEpOwogIH0sCgogIC8vIGluZGV4IG9mIHBvbHlmaWxsLCBuZWVkZWQgZm9yIElFIDgKICBpbmRleE9mOiBmdW5jdGlvbihhcnIsIG9iaiwgc3RhcnQpewogICAgc3RhcnQgPSBzdGFydCB8fCAwOwogICAgaWYoYXJyLmluZGV4T2YpewogICAgICByZXR1cm4gYXJyLmluZGV4T2Yob2JqLCBzdGFydCk7CiAgICB9CiAgICBmb3IgKHZhciBpID0gc3RhcnQsIGogPSBhcnIubGVuZ3RoOyBpIDwgajsgaSsrKSB7CiAgICAgIGlmIChhcnJbaV0gPT09IG9iaikgeyByZXR1cm4gaTsgfQogICAgfQogICAgcmV0dXJuIC0xOwogIH0sCgogIC8vIGNvbnZlcnQgYW4gZXh0ZW50IChBcmNHSVMpIHRvIExhdExuZ0JvdW5kcyAoTGVhZmxldCkKICBleHRlbnRUb0JvdW5kczogZnVuY3Rpb24oZXh0ZW50KXsKICAgIHZhciBzb3V0aFdlc3QgPSBuZXcgTC5MYXRMbmcoZXh0ZW50LnltaW4sIGV4dGVudC54bWluKTsKICAgIHZhciBub3J0aEVhc3QgPSBuZXcgTC5MYXRMbmcoZXh0ZW50LnltYXgsIGV4dGVudC54bWF4KTsKICAgIHJldHVybiBuZXcgTC5MYXRMbmdCb3VuZHMoc291dGhXZXN0LCBub3J0aEVhc3QpOwogIH0sCgogIC8vIGNvbnZlcnQgYW4gTGF0TG5nQm91bmRzIChMZWFmbGV0KSB0byBleHRlbnQgKEFyY0dJUykKICBib3VuZHNUb0V4dGVudDogZnVuY3Rpb24oYm91bmRzKSB7CiAgICByZXR1cm4gewogICAgICAieG1pbiI6IGJvdW5kcy5nZXRTb3V0aFdlc3QoKS5sbmcsCiAgICAgICJ5bWluIjogYm91bmRzLmdldFNvdXRoV2VzdCgpLmxhdCwKICAgICAgInhtYXgiOiBib3VuZHMuZ2V0Tm9ydGhFYXN0KCkubG5nLAogICAgICAieW1heCI6IGJvdW5kcy5nZXROb3J0aEVhc3QoKS5sYXQsCiAgICAgICJzcGF0aWFsUmVmZXJlbmNlIjogewogICAgICAgICJ3a2lkIiA6IDQzMjYKICAgICAgfQogICAgfTsKICB9LAoKICAvLyBjb252ZXJ0IGEgTGF0TG5nQm91bmRzIChMZWFmbGV0KSB0byBhIEVudmVsb3BlIChUZXJyYWZvcm1lci5SdHJlZSkKICBib3VuZHNUb0VudmVsb3BlOiBmdW5jdGlvbihib3VuZHMpewogICAgdmFyIGV4dGVudCA9IEwuZXNyaS5VdGlsLmJvdW5kc1RvRXh0ZW50KGJvdW5kcyk7CiAgICByZXR1cm4gewogICAgICB4OiBleHRlbnQueG1pbiwKICAgICAgeTogZXh0ZW50LnltaW4sCiAgICAgIHc6IE1hdGguYWJzKGV4dGVudC54bWluIC0gZXh0ZW50LnhtYXgpLAogICAgICBoOiBNYXRoLmFicyhleHRlbnQueW1pbiAtIGV4dGVudC55bWF4KQogICAgfTsKICB9Cn07CgpMLmVzcmkuTWl4aW5zID0ge307CgpMLmVzcmkuTWl4aW5zLmZlYXR1cmVHcmlkID0gewogIF9hY3RpdmVSZXF1ZXN0czogMCwKICBfaW5pdGlhbGl6ZUZlYXR1cmVHcmlkOiBmdW5jdGlvbihtYXApewogICAgdGhpcy5fbWFwID0gbWFwOwogICAgdGhpcy5fcHJldmlvdXNDZWxscyA9IFtdOwogICAgdGhpcy5jZW50ZXIgPSB0aGlzLl9tYXAuZ2V0Q2VudGVyKCk7CiAgICB0aGlzLm9yaWdpbiA9IHRoaXMuX21hcC5wcm9qZWN0KHRoaXMuY2VudGVyKTsKCiAgICB0aGlzLl9tb3ZlSGFuZGxlciA9IEwuZXNyaS5VdGlsLmRlYm91bmNlKGZ1bmN0aW9uKGUpewogICAgICBpZihlLnR5cGUgPT09ICJ6b29tZW5kIil7CiAgICAgICAgdGhpcy5vcmlnaW4gPSB0aGlzLl9tYXAucHJvamVjdCh0aGlzLmNlbnRlcik7CiAgICAgICAgdGhpcy5fcHJldmlvdXNDZWxscyA9IFtdOwogICAgICB9CiAgICAgIHRoaXMuX3JlcXVlc3RGZWF0dXJlcyhlLnRhcmdldC5nZXRCb3VuZHMoKSk7CiAgICB9LCB0aGlzLm9wdGlvbnMuZGVib3VuY2UsIHRoaXMpOwoKICAgIG1hcC5vbigiem9vbWVuZCByZXNpemUgbW92ZSIsIHRoaXMuX21vdmVIYW5kbGVyLCB0aGlzKTsKCiAgICB0aGlzLl9yZXF1ZXN0RmVhdHVyZXMobWFwLmdldEJvdW5kcygpKTsKICB9LAogIF9kZXN0cm95RmVhdHVyZUdyaWQ6IGZ1bmN0aW9uKG1hcCl7CiAgICBtYXAub2ZmKCJ6b29tZW5kIHJlc2l6ZSBtb3ZlIiwgdGhpcy5fbW92ZUhhbmRsZXIsIHRoaXMpOwogIH0sCiAgX3JlcXVlc3RGZWF0dXJlczogZnVuY3Rpb24oYm91bmRzKXsKICAgIHZhciBjZWxscyA9IHRoaXMuX2NlbGxzV2l0aGluKGJvdW5kcyk7CgogICAgaWYoY2VsbHMpIHsKICAgICAgdGhpcy5maXJlKCJsb2FkaW5nIiwgeyBib3VuZHM6IGJvdW5kcyB9KTsKICAgIH0KCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNlbGxzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHRoaXMuX21ha2VSZXF1ZXN0KGNlbGxzW2ldLCBjZWxscywgYm91bmRzKTsKICAgIH0KICB9LAogIF9tYWtlUmVxdWVzdDogZnVuY3Rpb24oY2VsbCwgY2VsbHMsIGJvdW5kcyl7CiAgICB0aGlzLl9hY3RpdmVSZXF1ZXN0cysrOwoKICAgIEwuZXNyaS5nZXQodGhpcy51cmwrInF1ZXJ5IiwgewogICAgICBnZW9tZXRyeVR5cGU6ICJlc3JpR2VvbWV0cnlFbnZlbG9wZSIsCiAgICAgIGdlb21ldHJ5OiBKU09OLnN0cmluZ2lmeShMLmVzcmkuVXRpbC5ib3VuZHNUb0V4dGVudChjZWxsLmJvdW5kcykpLAogICAgICBvdXRGaWVsZHM6IioiLAogICAgICBvdXRTcjogNDMyNgogICAgfSwgZnVuY3Rpb24ocmVzcG9uc2UpewoKICAgICAgLy9kZWluY3JpbWVudCB0aGUgcmVxdWVzdCBjb3VudGVyCiAgICAgIHRoaXMuX2FjdGl2ZVJlcXVlc3RzLS07CgogICAgICAvLyBpZiB0aGVyZSBhcmUgbm8gbW9yZSBhY3RpdmUgcmVxdWVzdHMgZmlyZSBhIGxvYWQgZXZlbnQgZm9yIHRoaXMgdmlldwogICAgICBpZih0aGlzLl9hY3RpdmVSZXF1ZXN0cyA8PSAwKXsKICAgICAgICB0aGlzLmZpcmUoImxvYWQiLCB7CiAgICAgICAgICBib3VuZHM6IGJvdW5kcywKICAgICAgICAgIGNlbGxzOiBjZWxscwogICAgICAgIH0pOwogICAgICB9CgogICAgICAvLyBjYWxsIHRoZSByZW5kZXIgbWV0aG9kIHRvIHJlbmRlciBmZWF0dXJlcwogICAgICB0aGlzLl9yZW5kZXIocmVzcG9uc2UpOwogICAgfSwgdGhpcyk7CiAgfSwKICBfY2VsbHNXaXRoaW46IGZ1bmN0aW9uKG1hcEJvdW5kcyl7CiAgICB2YXIgc2l6ZSA9IHRoaXMuX21hcC5nZXRTaXplKCk7CiAgICB2YXIgb2Zmc2V0ID0gdGhpcy5fbWFwLnByb2plY3QodGhpcy5fbWFwLmdldENlbnRlcigpKTsKICAgIHZhciBwYWRkaW5nID0gTWF0aC5taW4odGhpcy5vcHRpb25zLmNlbGxTaXplL3NpemUueCwgdGhpcy5vcHRpb25zLmNlbGxTaXplL3NpemUueSk7CiAgICB2YXIgYm91bmRzID0gbWFwQm91bmRzLnBhZCgwLjEpOwogICAgdmFyIGNlbGxzID0gW107CgogICAgdmFyIHRvcExlZnRQb2ludCA9IHRoaXMuX21hcC5wcm9qZWN0KGJvdW5kcy5nZXROb3J0aFdlc3QoKSk7CiAgICB2YXIgYm90dG9tUmlnaHRQb2ludCA9IHRoaXMuX21hcC5wcm9qZWN0KGJvdW5kcy5nZXRTb3V0aEVhc3QoKSk7CgogICAgdmFyIHRvcExlZnQgPSB0b3BMZWZ0UG9pbnQuc3VidHJhY3Qob2Zmc2V0KS5kaXZpZGVCeSh0aGlzLm9wdGlvbnMuY2VsbFNpemUpOwogICAgdmFyIGJvdHRvbVJpZ2h0ID0gYm90dG9tUmlnaHRQb2ludC5zdWJ0cmFjdChvZmZzZXQpLmRpdmlkZUJ5KHRoaXMub3B0aW9ucy5jZWxsU2l6ZSk7CgogICAgdmFyIG9mZnNldFJvd3MgPSBNYXRoLnJvdW5kKCh0aGlzLm9yaWdpbi54IC0gb2Zmc2V0LngpIC8gdGhpcy5vcHRpb25zLmNlbGxTaXplKTsKICAgIHZhciBvZmZzZXRDb2xzID0gTWF0aC5yb3VuZCgodGhpcy5vcmlnaW4ueSAtIG9mZnNldC55KSAvIHRoaXMub3B0aW9ucy5jZWxsU2l6ZSk7CgogICAgdmFyIG1pblJvdyA9IEwuZXNyaS5VdGlsLnJvdW5kQXdheUZyb21aZXJvKHRvcExlZnQueCktb2Zmc2V0Um93czsKICAgIHZhciBtYXhSb3cgPSBMLmVzcmkuVXRpbC5yb3VuZEF3YXlGcm9tWmVybyhib3R0b21SaWdodC54KS1vZmZzZXRSb3dzOwogICAgdmFyIG1pbkNvbCA9IEwuZXNyaS5VdGlsLnJvdW5kQXdheUZyb21aZXJvKHRvcExlZnQueSktb2Zmc2V0Q29sczsKICAgIHZhciBtYXhDb2wgPSBMLmVzcmkuVXRpbC5yb3VuZEF3YXlGcm9tWmVybyhib3R0b21SaWdodC55KS1vZmZzZXRDb2xzOwoKICAgIGZvciAodmFyIHJvdyA9IG1pblJvdzsgcm93IDwgbWF4Um93OyByb3crKykgewogICAgICBmb3IgKHZhciBjb2wgPSBtaW5Db2w7IGNvbCA8IG1heENvbDsgY29sKyspIHsKICAgICAgICB2YXIgY2VsbElkID0gImNlbGw6Iityb3crIjoiK2NvbDsKICAgICAgICB2YXIgZHVwbGljYXRlID0gTC5lc3JpLlV0aWwuaW5kZXhPZih0aGlzLl9wcmV2aW91c0NlbGxzLCBjZWxsSWQpID49IDA7CgogICAgICAgIGlmKCFkdXBsaWNhdGUgfHwgIXRoaXMub3B0aW9ucy5kZWR1cGxpY2F0ZSl7CiAgICAgICAgICB2YXIgY2VsbEJvdW5kcyA9IHRoaXMuX2NlbGxFeHRlbnQocm93LCBjb2wpOwogICAgICAgICAgdmFyIGNlbGxDZW50ZXIgPSBjZWxsQm91bmRzLmdldENlbnRlcigpOwogICAgICAgICAgdmFyIHJhZGl1cyA9IGNlbGxDZW50ZXIuZGlzdGFuY2VUbyhjZWxsQm91bmRzLmdldE5vcnRoV2VzdCgpKTsKICAgICAgICAgIHZhciBkaXN0YW5jZSA9IGNlbGxDZW50ZXIuZGlzdGFuY2VUbyh0aGlzLmNlbnRlcik7CiAgICAgICAgICB2YXIgY2VsbCA9IHsKICAgICAgICAgICAgcm93OiByb3csCiAgICAgICAgICAgIGNvbDogY29sLAogICAgICAgICAgICBpZDogY2VsbElkLAogICAgICAgICAgICBjZW50ZXI6IGNlbGxDZW50ZXIsCiAgICAgICAgICAgIGJvdW5kczogY2VsbEJvdW5kcywKICAgICAgICAgICAgZGlzdGFuY2U6ZGlzdGFuY2UsCiAgICAgICAgICAgIHJhZGl1czogcmFkaXVzCiAgICAgICAgICB9OwogICAgICAgICAgY2VsbHMucHVzaChjZWxsKTsKICAgICAgICAgIHRoaXMuX3ByZXZpb3VzQ2VsbHMucHVzaChjZWxsSWQpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIGNlbGxzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsKICAgICAgcmV0dXJuIGEuZGlzdGFuY2UgLSBiLmRpc3RhbmNlOwogICAgfSk7CgogICAgcmV0dXJuIGNlbGxzOwogIH0sCiAgX2NlbGxFeHRlbnQ6IGZ1bmN0aW9uKHJvdywgY29sKXsKICAgIHZhciBzd1BvaW50ID0gdGhpcy5fY2VsbFBvaW50KHJvdywgY29sKTsKICAgIHZhciBuZVBvaW50ID0gdGhpcy5fY2VsbFBvaW50KHJvdysxLCBjb2wrMSk7CiAgICB2YXIgc3cgPSB0aGlzLl9tYXAudW5wcm9qZWN0KHN3UG9pbnQpOwogICAgdmFyIG5lID0gdGhpcy5fbWFwLnVucHJvamVjdChuZVBvaW50KTsKICAgIHJldHVybiBMLmxhdExuZ0JvdW5kcyhzdywgbmUpOwogIH0sCiAgX2NlbGxQb2ludDpmdW5jdGlvbihyb3csIGNvbCl7CiAgICB2YXIgeCA9IHRoaXMub3JpZ2luLnggKyAocm93KnRoaXMub3B0aW9ucy5jZWxsU2l6ZSk7CiAgICB2YXIgeSA9IHRoaXMub3JpZ2luLnkgKyAoY29sKnRoaXMub3B0aW9ucy5jZWxsU2l6ZSk7CiAgICByZXR1cm4gW3gsIHldOwogIH0KfTsKCkwuZXNyaS5NaXhpbnMuaWRlbnRpZmlhYmxlTGF5ZXIgPSB7CiAgaWRlbnRpZnk6ZnVuY3Rpb24obGF0TG5nLCBvcHRpb25zLCBjYWxsYmFjayl7CiAgICB2YXIgZGVmYXVsdHMgPSB7CiAgICAgIHNyOiAnNDI2NScsCiAgICAgIG1hcEV4dGVudDogSlNPTi5zdHJpbmdpZnkoTC5lc3JpLlV0aWwuYm91bmRzVG9FeHRlbnQodGhpcy5fbWFwLmdldEJvdW5kcygpKSksCiAgICAgIHRvbGVyYW5jZTogMywKICAgICAgZ2VvbWV0cnlUeXBlOiAnZXNyaUdlb21ldHJ5UG9pbnQnLAogICAgICBpbWFnZURpc3BsYXk6ICc4MDAsNjAwLDk2JywKICAgICAgZ2VvbWV0cnk6IEpTT04uc3RyaW5naWZ5KHsKICAgICAgICB4OiBsYXRMbmcubG5nLAogICAgICAgIHk6IGxhdExuZy5sYXQsCiAgICAgICAgc3BhdGlhbFJlZmVyZW5jZTogewogICAgICAgICAgd2tpZDogNDI2NQogICAgICAgIH0KICAgICAgfSkKICAgIH07CgogICAgdmFyIHBhcmFtczsKCiAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGNhbGxiYWNrID09PSAndW5kZWZpbmVkJykgewogICAgICBjYWxsYmFjayA9IG9wdGlvbnM7CiAgICAgIHBhcmFtcyA9IGRlZmF1bHRzOwogICAgfSBlbHNlIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ29iamVjdCcpIHsKICAgICAgaWYgKG9wdGlvbnMubGF5ZXJEZWZzKSB7CiAgICAgICAgb3B0aW9ucy5sYXllckRlZnMgPSB0aGlzLnBhcnNlTGF5ZXJEZWZzKG9wdGlvbnMubGF5ZXJEZWZzKTsKICAgICAgfQoKICAgICAgcGFyYW1zID0gTC5VdGlsLmV4dGVuZChkZWZhdWx0cywgb3B0aW9ucyk7CiAgICB9CgogICAgTC5lc3JpLmdldCh0aGlzLl91cmwgKyAnL2lkZW50aWZ5JywgcGFyYW1zLCBjYWxsYmFjayk7CiAgfSwKICBwYXJzZUxheWVyRGVmczogZnVuY3Rpb24gKGxheWVyRGVmcykgewogICAgaWYgKGxheWVyRGVmcyBpbnN0YW5jZW9mIEFycmF5KSB7CiAgICAgIC8vdGhyb3cgJ211c3QgYmUgb2JqZWN0IG9yIHN0cmluZyc7CiAgICAgIHJldHVybiAnJzsKICAgIH0KCiAgICBpZiAodHlwZW9mIGxheWVyRGVmcyA9PT0gJ29iamVjdCcpIHsKICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGxheWVyRGVmcyk7CiAgICB9CgogICAgcmV0dXJuIGxheWVyRGVmczsKICB9Cn07CgooZnVuY3Rpb24oTCl7CgogIHZhciB0aWxlUHJvdG9jb2wgPSAod2luZG93LmxvY2F0aW9uLnByb3RvY29sICE9PSAiaHR0cHM6IikgPyAiaHR0cDoiIDogImh0dHBzOiI7CiAgdmFyIGF0dHJpYnV0aW9uU3R5bGVzID0gImxpbmUtaGVpZ2h0OjlweDsgdGV4dC1vdmVyZmxvdzplbGxpcHNpczsgd2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjsgZGlzcGxheTppbmxpbmUtYmxvY2s7IjsKICB2YXIgbG9nb1N0eWxlcyA9ICJwb3NpdGlvbjphYnNvbHV0ZTsgdG9wOi0zOHB4OyByaWdodDoycHg7IjsKICB2YXIgYXR0cmlidXRpb25Mb2dvID0gIjxpbWcgc3JjPSdodHRwczovL3NlcnZlcmFwaS5hcmNnaXNvbmxpbmUuY29tL2pzYXBpL2FyY2dpcy8zLjUvanMvZXNyaS9pbWFnZXMvbWFwL2xvZ28tbWVkLnBuZycgYWx0PSdQb3dlcmVkIGJ5IEVzcmknIGNsYXNzPSdlc3JpLWF0dHJpYnV0aW9uLWxvZ28nIHN0eWxlPSciK2xvZ29TdHlsZXMrIic+IjsKICB2YXIgZm9ybWF0VGV4dEF0dHJpYnV0aW9ucyA9IGZ1bmN0aW9uIGZvcm1hdFRleHRBdHRyaWJ1dGlvbnModGV4dCl7CiAgICByZXR1cm4gIjxzcGFuIGNsYXNzPSdlc3JpLWF0dHJpYnV0aW9ucycgc3R5bGU9JyIrYXR0cmlidXRpb25TdHlsZXMrIic+IiArIHRleHQgKyAiPC9zcGFuPiI7CiAgfTsKCiAgTC5lc3JpLkJhc2VtYXBMYXllciA9IEwuVGlsZUxheWVyLmV4dGVuZCh7CiAgICBzdGF0aWNzOiB7CiAgICAgIFRJTEVTOiB7CiAgICAgICAgU3RyZWV0czogewogICAgICAgICAgdXJsVGVtcGxhdGU6IHRpbGVQcm90b2NvbCArICIvL3tzfS5hcmNnaXNvbmxpbmUuY29tL0FyY0dJUy9yZXN0L3NlcnZpY2VzL1dvcmxkX1N0cmVldF9NYXAvTWFwU2VydmVyL3RpbGUve3p9L3t5fS97eH0vIiwKICAgICAgICAgIGF0dHJpYnV0aW9uVXJsOiAiaHR0cHM6Ly9zdGF0aWMuYXJjZ2lzLmNvbS9hdHRyaWJ1dGlvbi9Xb3JsZF9TdHJlZXRfTWFwP2Y9anNvbiIsCiAgICAgICAgICBvcHRpb25zOiB7CiAgICAgICAgICAgIG1pblpvb206IDEsCiAgICAgICAgICAgIG1heFpvb206IDE5LAogICAgICAgICAgICBzdWJkb21haW5zOiBbInNlcnZlciIsICJzZXJ2aWNlcyJdLAogICAgICAgICAgICBhdHRyaWJ1dGlvbjogZm9ybWF0VGV4dEF0dHJpYnV0aW9ucygiRXNyaSIpICsgYXR0cmlidXRpb25Mb2dvCiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBUb3BvZ3JhcGhpYzogewogICAgICAgICAgdXJsVGVtcGxhdGU6IHRpbGVQcm90b2NvbCArICIvL3tzfS5hcmNnaXNvbmxpbmUuY29tL0FyY0dJUy9yZXN0L3NlcnZpY2VzL1dvcmxkX1RvcG9fTWFwL01hcFNlcnZlci90aWxlL3t6fS97eX0ve3h9LyIsCiAgICAgICAgICBhdHRyaWJ1dGlvblVybDogImh0dHBzOi8vc3RhdGljLmFyY2dpcy5jb20vYXR0cmlidXRpb24vV29ybGRfVG9wb19NYXA/Zj1qc29uIiwKICAgICAgICAgIG9wdGlvbnM6IHsKICAgICAgICAgICAgbWluWm9vbTogMSwKICAgICAgICAgICAgbWF4Wm9vbTogMTksCiAgICAgICAgICAgIHN1YmRvbWFpbnM6IFsic2VydmVyIiwgInNlcnZpY2VzIl0sCiAgICAgICAgICAgIGF0dHJpYnV0aW9uOiBmb3JtYXRUZXh0QXR0cmlidXRpb25zKCJFc3JpIikgKyBhdHRyaWJ1dGlvbkxvZ28KICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIE9jZWFuczogewogICAgICAgICAgdXJsVGVtcGxhdGU6ICJodHRwczovL3NlcnZlci5hcmNnaXNvbmxpbmUuY29tL0FyY0dJUy9yZXN0L3NlcnZpY2VzL09jZWFuX0Jhc2VtYXAvTWFwU2VydmVyL3RpbGUve3p9L3t5fS97eH0vIiwKICAgICAgICAgIGF0dHJpYnV0aW9uVXJsOiAiaHR0cHM6Ly9zdGF0aWMuYXJjZ2lzLmNvbS9hdHRyaWJ1dGlvbi9PY2Vhbl9CYXNlbWFwP2Y9anNvbiIsCiAgICAgICAgICBvcHRpb25zOiB7CiAgICAgICAgICAgIG1pblpvb206IDEsCiAgICAgICAgICAgIG1heFpvb206IDE2LAogICAgICAgICAgICBzdWJkb21haW5zOiBbInNlcnZlciIsICJzZXJ2aWNlcyJdLAogICAgICAgICAgICBhdHRyaWJ1dGlvbjogZm9ybWF0VGV4dEF0dHJpYnV0aW9ucygiRXNyaSIpICsgYXR0cmlidXRpb25Mb2dvCiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBOYXRpb25hbEdlb2dyYXBoaWM6IHsKICAgICAgICAgIHVybFRlbXBsYXRlOiAiaHR0cHM6Ly9zZXJ2ZXIuYXJjZ2lzb25saW5lLmNvbS9BcmNHSVMvcmVzdC9zZXJ2aWNlcy9OYXRHZW9fV29ybGRfTWFwL01hcFNlcnZlci90aWxlL3t6fS97eX0ve3h9LyIsCiAgICAgICAgICBvcHRpb25zOiB7CiAgICAgICAgICAgIG1pblpvb206IDEsCiAgICAgICAgICAgIG1heFpvb206IDE2LAogICAgICAgICAgICBzdWJkb21haW5zOiBbInNlcnZlciIsICJzZXJ2aWNlcyJdLAogICAgICAgICAgICBhdHRyaWJ1dGlvbjogZm9ybWF0VGV4dEF0dHJpYnV0aW9ucygiRXNyaSIpICsgYXR0cmlidXRpb25Mb2dvCiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBHcmF5OiB7CiAgICAgICAgICB1cmxUZW1wbGF0ZTogdGlsZVByb3RvY29sICsgIi8ve3N9LmFyY2dpc29ubGluZS5jb20vQXJjR0lTL3Jlc3Qvc2VydmljZXMvQ2FudmFzL1dvcmxkX0xpZ2h0X0dyYXlfQmFzZS9NYXBTZXJ2ZXIvdGlsZS97en0ve3l9L3t4fS8iLAogICAgICAgICAgb3B0aW9uczogewogICAgICAgICAgICBtaW5ab29tOiAxLAogICAgICAgICAgICBtYXhab29tOiAxNiwKICAgICAgICAgICAgc3ViZG9tYWluczogWyJzZXJ2ZXIiLCAic2VydmljZXMiXSwKICAgICAgICAgICAgYXR0cmlidXRpb246IGZvcm1hdFRleHRBdHRyaWJ1dGlvbnMoIkVzcmksIE5BVlRFUSwgRGVMb3JtZSIpICsgYXR0cmlidXRpb25Mb2dvCiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBHcmF5TGFiZWxzOiB7CiAgICAgICAgICB1cmxUZW1wbGF0ZTogdGlsZVByb3RvY29sICsgIi8ve3N9LmFyY2dpc29ubGluZS5jb20vQXJjR0lTL3Jlc3Qvc2VydmljZXMvQ2FudmFzL1dvcmxkX0xpZ2h0X0dyYXlfUmVmZXJlbmNlL01hcFNlcnZlci90aWxlL3t6fS97eX0ve3h9LyIsCiAgICAgICAgICBvcHRpb25zOiB7CiAgICAgICAgICAgIG1pblpvb206IDEsCiAgICAgICAgICAgIG1heFpvb206IDE2LAogICAgICAgICAgICBzdWJkb21haW5zOiBbInNlcnZlciIsICJzZXJ2aWNlcyJdCiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBJbWFnZXJ5OiB7CiAgICAgICAgICB1cmxUZW1wbGF0ZTogdGlsZVByb3RvY29sICsgIi8ve3N9LmFyY2dpc29ubGluZS5jb20vQXJjR0lTL3Jlc3Qvc2VydmljZXMvV29ybGRfSW1hZ2VyeS9NYXBTZXJ2ZXIvdGlsZS97en0ve3l9L3t4fS8iLAogICAgICAgICAgb3B0aW9uczogewogICAgICAgICAgICBtaW5ab29tOiAxLAogICAgICAgICAgICBtYXhab29tOiAxOSwKICAgICAgICAgICAgc3ViZG9tYWluczogWyJzZXJ2ZXIiLCAic2VydmljZXMiXSwKICAgICAgICAgICAgYXR0cmlidXRpb246IGZvcm1hdFRleHRBdHRyaWJ1dGlvbnMoIkVzcmksIERpZ2l0YWxHbG9iZSwgR2VvRXllLCBpLWN1YmVkLCBVU0RBLCBVU0dTLCBBRVgsIEdldG1hcHBpbmcsIEFlcm9ncmlkLCBJR04sIElHUCwgc3dpc3N0b3BvLCBhbmQgdGhlIEdJUyBVc2VyIENvbW11bml0eSIpICsgYXR0cmlidXRpb25Mb2dvCiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBJbWFnZXJ5TGFiZWxzOiB7CiAgICAgICAgICB1cmxUZW1wbGF0ZTogdGlsZVByb3RvY29sICsgIi8ve3N9LmFyY2dpc29ubGluZS5jb20vQXJjR0lTL3Jlc3Qvc2VydmljZXMvUmVmZXJlbmNlL1dvcmxkX0JvdW5kYXJpZXNfYW5kX1BsYWNlcy9NYXBTZXJ2ZXIvdGlsZS97en0ve3l9L3t4fS8iLAogICAgICAgICAgb3B0aW9uczogewogICAgICAgICAgICBtaW5ab29tOiAxLAogICAgICAgICAgICBtYXhab29tOiAxOSwKICAgICAgICAgICAgc3ViZG9tYWluczogWyJzZXJ2ZXIiLCAic2VydmljZXMiXQogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgSW1hZ2VyeVRyYW5zcG9ydGF0aW9uOiB7CiAgICAgICAgICB1cmxUZW1wbGF0ZTogdGlsZVByb3RvY29sICsgIi8ve3N9LmFyY2dpc29ubGluZS5jb20vQXJjR0lTL3Jlc3Qvc2VydmljZXMvUmVmZXJlbmNlL1dvcmxkX1RyYW5zcG9ydGF0aW9uL01hcFNlcnZlci90aWxlL3t6fS97eX0ve3h9LyIsCiAgICAgICAgICBvcHRpb25zOiB7CiAgICAgICAgICAgIG1pblpvb206IDEsCiAgICAgICAgICAgIG1heFpvb206IDE5LAogICAgICAgICAgICBzdWJkb21haW5zOiBbInNlcnZlciIsICJzZXJ2aWNlcyJdCiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBJbWFnZXJ5QWx0ZXJuYXRlTGFiZWxzOiB7CiAgICAgICAgICB1cmxUZW1wbGF0ZTogdGlsZVByb3RvY29sICsgIi8ve3N9LmFyY2dpc29ubGluZS5jb20vQXJjR0lTL3Jlc3Qvc2VydmljZXMvUmVmZXJlbmNlL1dvcmxkX0JvdW5kYXJpZXNfYW5kX1BsYWNlc19BbHRlcm5hdGUvTWFwU2VydmVyL3RpbGUve3p9L3t5fS97eH0vIiwKICAgICAgICAgIG9wdGlvbnM6IHsKICAgICAgICAgICAgbWluWm9vbTogMSwKICAgICAgICAgICAgbWF4Wm9vbTogMTIsCiAgICAgICAgICAgIHN1YmRvbWFpbnM6IFsic2VydmVyIiwgInNlcnZpY2VzIl0KICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIFNoYWRlZFJlbGllZjogewogICAgICAgICAgdXJsVGVtcGxhdGU6IHRpbGVQcm90b2NvbCArICIvL3tzfS5hcmNnaXNvbmxpbmUuY29tL0FyY0dJUy9yZXN0L3NlcnZpY2VzL1dvcmxkX1NoYWRlZF9SZWxpZWYvTWFwU2VydmVyL3RpbGUve3p9L3t5fS97eH0vIiwKICAgICAgICAgIG9wdGlvbnM6IHsKICAgICAgICAgICAgbWluWm9vbTogMSwKICAgICAgICAgICAgbWF4Wm9vbTogMTMsCiAgICAgICAgICAgIHN1YmRvbWFpbnM6IFsic2VydmVyIiwgInNlcnZpY2VzIl0sCiAgICAgICAgICAgIGF0dHJpYnV0aW9uOiBmb3JtYXRUZXh0QXR0cmlidXRpb25zKCJFU1JJLCBOQVZURVEsIERlTG9ybWUiKSArIGF0dHJpYnV0aW9uTG9nbwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgIH0KICAgIH0sCiAgICBpbml0aWFsaXplOiBmdW5jdGlvbihrZXksIG9wdGlvbnMpewogICAgICB2YXIgY29uZmlnOwogICAgICAvLyBzZXQgdGhlIGNvbmZpZyB2YXJpYWJsZSB3aXRoIHRoZSBhcHByb3ByaWF0ZSBjb25maWcgb2JqZWN0CiAgICAgIGlmICh0eXBlb2Yga2V5ID09PSAib2JqZWN0IiAmJiBrZXkudXJsVGVtcGxhdGUgJiYga2V5Lm9wdGlvbnMpewogICAgICAgIGNvbmZpZyA9IGtleTsKICAgICAgfSBlbHNlIGlmKHR5cGVvZiBrZXkgPT09ICJzdHJpbmciICYmIEwuZXNyaS5CYXNlbWFwTGF5ZXIuVElMRVNba2V5XSl7CiAgICAgICAgY29uZmlnID0gTC5lc3JpLkJhc2VtYXBMYXllci5USUxFU1trZXldOwogICAgICB9IGVsc2UgewogICAgICAgIHRocm93IG5ldyBFcnJvcigiTC5lc3JpLkJhc2VtYXBMYXllcjogSW52YWxpZCBwYXJhbWV0ZXIuIFVzZSBvbmUgb2YgJ1N0cmVldHMnLCAnVG9wb2dyYXBoaWMnLCAnT2NlYW5zJywgJ05hdGlvbmFsR2VvZ3JhcGhpYycsICdHcmF5JywgJ0dyYXlMYWJlbHMnLCAnSW1hZ2VyeScsICdJbWFnZXJ5TGFiZWxzJywgJ0ltYWdlcnlUcmFuc3BvcnRhdGlvbicsICdJbWFnZXJ5QWx0ZXJuYXRlTGFiZWxzJyBvciAnU2hhZGVkUmVsaWVmJyIpOwogICAgICB9CgogICAgICAvLyBtZXJnZSBwYXNzZWQgb3B0aW9ucyBpbnRvIHRoZSBjb25maWcgb3B0aW9ucwogICAgICB2YXIgbWVyZ2VkT3B0aW9ucyA9IEwuVXRpbC5leHRlbmQoY29uZmlnLm9wdGlvbnMsIG9wdGlvbnMpOwoKICAgICAgLy8gY2xlYW4gdXAgb3VyIGlucHV0IHVybAogICAgICB2YXIgdXJsID0gTC5lc3JpLlV0aWwuY2xlYW5VcmwoY29uZmlnLnVybFRlbXBsYXRlKTsKCiAgICAgIC8vIGNhbGwgdGhlIGluaXRpYWxpemUgbWV0aG9kIG9uIEwuVGlsZUxheWVyIHRvIHNldCBldmVyeXRoaW5nIHVwCiAgICAgIEwuVGlsZUxheWVyLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcywgdXJsLCBMLlV0aWwuc2V0T3B0aW9ucyh0aGlzLCBtZXJnZWRPcHRpb25zKSk7CgogICAgICAvLyBpZiB0aGlzIGJhc2VtYXAgcmVxdWlyZXMgZHluYW1pYyBhdHRyaWJ1dGlvbiBzZXQgaXQgdXAKICAgICAgaWYoY29uZmlnLmF0dHJpYnV0aW9uVXJsKXsKICAgICAgICB2YXIgYXR0cmlidXRpb25VcmwgPSBMLmVzcmkuVXRpbC5jbGVhblVybChjb25maWcuYXR0cmlidXRpb25VcmwpOwogICAgICAgIHRoaXMuX2R5bmFtaWNBdHRyaWJ1dGlvbiA9IHRydWU7CiAgICAgICAgdGhpcy5fZ2V0QXR0cmlidXRpb25EYXRhKGF0dHJpYnV0aW9uVXJsKTsKICAgICAgfQogICAgfSwKICAgIF9keW5hbWljQXR0cmlidXRpb246IGZhbHNlLAogICAgYm91bmRzOiBudWxsLAogICAgem9vbTogbnVsbCwKICAgIG9uQWRkOiBmdW5jdGlvbihtYXApewogICAgICBMLlRpbGVMYXllci5wcm90b3R5cGUub25BZGQuY2FsbCh0aGlzLCBtYXApOwogICAgICBpZih0aGlzLl9keW5hbWljQXR0cmlidXRpb24pewogICAgICAgIHRoaXMub24oImxvYWQiLCB0aGlzLl9oYW5kbGVUaWxlVXBkYXRlcywgdGhpcyk7CiAgICAgICAgdGhpcy5fbWFwLm9uKCJ2aWV3cmVzZXQgem9vbWVuZCBkcmFnZW5kIiwgdGhpcy5faGFuZGxlVGlsZVVwZGF0ZXMsIHRoaXMpOwogICAgICB9CiAgICAgIHRoaXMuX21hcC5vbigicmVzaXplIiwgdGhpcy5fcmVzaXplQXR0cmlidXRpb24sIHRoaXMpOwogICAgfSwKICAgIG9uUmVtb3ZlOiBmdW5jdGlvbihtYXApewogICAgICBpZih0aGlzLl9keW5hbWljQXR0cmlidXRpb24pewogICAgICAgIHRoaXMub2ZmKCJsb2FkIiwgdGhpcy5faGFuZGxlVGlsZVVwZGF0ZXMsIHRoaXMpOwogICAgICAgIHRoaXMuX21hcC5vZmYoInZpZXdyZXNldCB6b29tZW5kIGRyYWdlbmQiLCB0aGlzLl9oYW5kbGVUaWxlVXBkYXRlcywgdGhpcyk7CiAgICAgIH0KICAgICAgdGhpcy5fbWFwLm9mZigicmVzaXplIiwgdGhpcy5fcmVzaXplQXR0cmlidXRpb24sIHRoaXMpOwogICAgICBMLlRpbGVMYXllci5wcm90b3R5cGUub25SZW1vdmUuY2FsbCh0aGlzLCBtYXApOwogICAgfSwKICAgIF9oYW5kbGVUaWxlVXBkYXRlczogZnVuY3Rpb24oZSl7CiAgICAgIHZhciBuZXdCb3VuZHM7CiAgICAgIHZhciBuZXdab29tOwoKICAgICAgaWYoZS50eXBlID09PSAibG9hZCIpewogICAgICAgIG5ld0JvdW5kcyA9IHRoaXMuX21hcC5nZXRCb3VuZHMoKTsKICAgICAgICBuZXdab29tID0gdGhpcy5fbWFwLmdldFpvb20oKTsKICAgICAgfQoKICAgICAgaWYoZS50eXBlID09PSAidmlld3Jlc2V0IiB8fCBlLnR5cGUgPT09ICJkcmFnZW5kIiB8fCBlLnR5cGUgPT09Inpvb21lbmQiKXsKICAgICAgICBuZXdCb3VuZHMgPSBlLnRhcmdldC5nZXRCb3VuZHMoKTsKICAgICAgICBuZXdab29tID0gZS50YXJnZXQuZ2V0Wm9vbSgpOwogICAgICB9CgogICAgICBpZih0aGlzLmF0dHJpYnV0aW9uQm91bmRpbmdCb3hlcyAmJiBuZXdCb3VuZHMgJiYgbmV3Wm9vbSl7CiAgICAgICAgaWYoIW5ld0JvdW5kcy5lcXVhbHModGhpcy5ib3VuZHMpIHx8IG5ld1pvb20gIT09IHRoaXMuem9vbSl7CiAgICAgICAgICB0aGlzLmJvdW5kcyA9IG5ld0JvdW5kczsKICAgICAgICAgIHRoaXMuem9vbSA9IG5ld1pvb207CiAgICAgICAgICB0aGlzLl91cGRhdGVNYXBBdHRyaWJ1dGlvbigpOwogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgIF9yZXNpemVBdHRyaWJ1dGlvbjogZnVuY3Rpb24oKXsKICAgICAgdmFyIG1hcFdpZHRoID0gdGhpcy5fbWFwLmdldFNpemUoKS54OwogICAgICB0aGlzLl9nZXRBdHRyaWJ1dGlvbkxvZ28oKS5zdHlsZS5kaXNwbGF5ID0gKG1hcFdpZHRoIDwgNjAwKSA/ICJub25lIjoiYmxvY2siOwogICAgICB0aGlzLl9nZXRBdHRyaWJ1dGlvblNwYW4oKS5zdHlsZS5tYXhXaWR0aCA9ICAobWFwV2lkdGgqIDAuNzUpICsgInB4IjsKICAgIH0sCiAgICBfZ2V0QXR0cmlidXRpb25EYXRhOiBmdW5jdGlvbih1cmwpewogICAgICB0aGlzLmF0dHJpYnV0aW9uQm91bmRpbmdCb3hlcyA9IFtdOwogICAgICBMLmVzcmkuZ2V0KHVybCwge30sIHRoaXMuX3Byb2Nlc3NBdHRyaWJ1dGlvbkRhdGEsIHRoaXMpOwogICAgfSwKICAgIF9wcm9jZXNzQXR0cmlidXRpb25EYXRhOiBmdW5jdGlvbihhdHRyaWJ1dGlvbkRhdGEpewogICAgICBmb3IgKHZhciBjID0gMDsgYyA8IGF0dHJpYnV0aW9uRGF0YS5jb250cmlidXRvcnMubGVuZ3RoOyBjKyspIHsKICAgICAgICB2YXIgY29udHJpYnV0b3IgPSBhdHRyaWJ1dGlvbkRhdGEuY29udHJpYnV0b3JzW2NdOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29udHJpYnV0b3IuY292ZXJhZ2VBcmVhcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgdmFyIGNvdmVyYWdlQXJlYSA9IGNvbnRyaWJ1dG9yLmNvdmVyYWdlQXJlYXNbaV07CiAgICAgICAgICB2YXIgc291dGhXZXN0ID0gbmV3IEwuTGF0TG5nKGNvdmVyYWdlQXJlYS5iYm94WzBdLCBjb3ZlcmFnZUFyZWEuYmJveFsxXSk7CiAgICAgICAgICB2YXIgbm9ydGhFYXN0ID0gbmV3IEwuTGF0TG5nKGNvdmVyYWdlQXJlYS5iYm94WzJdLCBjb3ZlcmFnZUFyZWEuYmJveFszXSk7CiAgICAgICAgICB0aGlzLmF0dHJpYnV0aW9uQm91bmRpbmdCb3hlcy5wdXNoKHsKICAgICAgICAgICAgYXR0cmlidXRpb246IGNvbnRyaWJ1dG9yLmF0dHJpYnV0aW9uLAogICAgICAgICAgICBzY29yZTogY292ZXJhZ2VBcmVhLnNjb3JlLAogICAgICAgICAgICBib3VuZHM6IG5ldyBMLkxhdExuZ0JvdW5kcyhzb3V0aFdlc3QsIG5vcnRoRWFzdCksCiAgICAgICAgICAgIG1pblpvb206IGNvdmVyYWdlQXJlYS56b29tTWluLAogICAgICAgICAgICBtYXhab29tOiBjb3ZlcmFnZUFyZWEuem9vbU1heAogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHRoaXMuYXR0cmlidXRpb25Cb3VuZGluZ0JveGVzLnNvcnQoZnVuY3Rpb24oYSxiKXsKICAgICAgICBpZiAoYS5zY29yZSA8IGIuc2NvcmUpeyByZXR1cm4gLTE7IH0KICAgICAgICBpZiAoYS5zY29yZSA+IGIuc2NvcmUpeyByZXR1cm4gMTsgfQogICAgICAgIHJldHVybiAwOwogICAgICB9KTsKICAgICAgaWYodGhpcy5ib3VuZHMpewogICAgICAgIHRoaXMuX3VwZGF0ZU1hcEF0dHJpYnV0aW9uKCk7CiAgICAgIH0KICAgIH0sCiAgICBfZ2V0QXR0cmlidXRpb25TcGFuOmZ1bmN0aW9uKCl7CiAgICAgIHJldHVybiB0aGlzLl9tYXAuX2NvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCcuZXNyaS1hdHRyaWJ1dGlvbnMnKVswXTsKICAgIH0sCiAgICBfZ2V0QXR0cmlidXRpb25Mb2dvOmZ1bmN0aW9uKCl7CiAgICAgIHJldHVybiB0aGlzLl9tYXAuX2NvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCcuZXNyaS1hdHRyaWJ1dGlvbi1sb2dvJylbMF07CiAgICB9LAogICAgX3VwZGF0ZU1hcEF0dHJpYnV0aW9uOiBmdW5jdGlvbigpewogICAgICB2YXIgbmV3QXR0cmlidXRpb25zID0gJyc7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5hdHRyaWJ1dGlvbkJvdW5kaW5nQm94ZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICB2YXIgYXR0ciA9IHRoaXMuYXR0cmlidXRpb25Cb3VuZGluZ0JveGVzW2ldOwogICAgICAgIGlmKHRoaXMuYm91bmRzLmludGVyc2VjdHMoYXR0ci5ib3VuZHMpICYmIHRoaXMuem9vbSA+PSBhdHRyLm1pblpvb20gJiYgdGhpcy56b29tIDw9IGF0dHIubWF4Wm9vbSkgewogICAgICAgICAgdmFyIGF0dHJpYnV0aW9uID0gdGhpcy5hdHRyaWJ1dGlvbkJvdW5kaW5nQm94ZXNbaV0uYXR0cmlidXRpb247CiAgICAgICAgICBpZihuZXdBdHRyaWJ1dGlvbnMuaW5kZXhPZihhdHRyaWJ1dGlvbikgPT09IC0xKXsKICAgICAgICAgICAgaWYobmV3QXR0cmlidXRpb25zLmxlbmd0aCA+IDApewogICAgICAgICAgICAgIG5ld0F0dHJpYnV0aW9ucyArPSAnLCAnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG5ld0F0dHJpYnV0aW9ucyArPSBhdHRyaWJ1dGlvbjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgdGhpcy5fZ2V0QXR0cmlidXRpb25TcGFuKCkuaW5uZXJIVE1MID0gbmV3QXR0cmlidXRpb25zOwogICAgICB0aGlzLl9yZXNpemVBdHRyaWJ1dGlvbigpOwogICAgfQogIH0pOwoKICBMLmVzcmkuYmFzZW1hcExheWVyID0gZnVuY3Rpb24oa2V5LCBvcHRpb25zKXsKICAgIHJldHVybiBuZXcgTC5lc3JpLkJhc2VtYXBMYXllcihrZXksIG9wdGlvbnMpOwogIH07Cgp9KShMKTs=]]></data>
	</file>
	<file>
	  <filename>/lib/js/esri-leaflet/extras/esri-basemaps.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohIEVzcmktTGVhZmxldCAtIHYwLjAuMSAtIDIwMTMtMDktMjYKKiAgIENvcHlyaWdodCAoYykgMjAxMyBFbnZpcm9ubWVudGFsIFN5c3RlbXMgUmVzZWFyY2ggSW5zdGl0dXRlLCBJbmMuCiogICBBcGFjaGUgTGljZW5zZSovCkwuZXNyaT17X2NhbGxiYWNrOnt9fSxMLmVzcmkuU3VwcG9ydD17Q09SUzohISh3aW5kb3cuWE1MSHR0cFJlcXVlc3QmJiJ3aXRoQ3JlZGVudGlhbHMiaW4gbmV3IFhNTEh0dHBSZXF1ZXN0KX0sTC5lc3JpLlJlcXVlc3RIYW5kbGVycz17Q09SUzpmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1uZXcgWE1MSHR0cFJlcXVlc3Q7Yi5mPSJqc29uIixlLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe3ZhciBhO2lmKDQ9PT1lLnJlYWR5U3RhdGUpe3RyeXthPUpTT04ucGFyc2UoZS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe2E9e2Vycm9yOiJDb3VsZCBub3QgcGFyc2UgcmVzcG9uc2UgYXMgSlNPTi4ifX1kP2MuY2FsbChkLGEpOmMoYSl9fSxlLm9wZW4oIkdFVCIsYStMLmVzcmkuVXRpbC5zZXJpYWxpemUoYiksITApLGUuc2VuZChudWxsKX0sSlNPTlA6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9ImMiKygxZTkqTWF0aC5yYW5kb20oKSkudG9TdHJpbmcoMzYpLnJlcGxhY2UoIi4iLCJfIik7Yi5mPSJqc29uIixiLmNhbGxiYWNrPSJMLmVzcmkuX2NhbGxiYWNrLiIrZTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtmLnR5cGU9InRleHQvamF2YXNjcmlwdCIsZi5zcmM9YStMLmVzcmkuVXRpbC5zZXJpYWxpemUoYiksZi5pZD1lLEwuZXNyaS5fY2FsbGJhY2tbZV09ZnVuY3Rpb24oYSl7ZD9jLmNhbGwoZCxhKTpjKGEpLGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZiksZGVsZXRlIEwuZXNyaS5fY2FsbGJhY2tbZV19LGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZil9fSxMLmVzcmkuZ2V0PUwuZXNyaS5TdXBwb3J0LkNPUlM/TC5lc3JpLlJlcXVlc3RIYW5kbGVycy5DT1JTOkwuZXNyaS5SZXF1ZXN0SGFuZGxlcnMuSlNPTlAsTC5lc3JpLlV0aWw9e2RlYm91bmNlOmZ1bmN0aW9uKGEsYil7dmFyIGM9bnVsbDtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZD10aGlzfHxkLGU9YXJndW1lbnRzO2NsZWFyVGltZW91dChjKSxjPXNldFRpbWVvdXQoZnVuY3Rpb24oKXthLmFwcGx5KGQsZSl9LGIpfX0scm91bmRBd2F5RnJvbVplcm86ZnVuY3Rpb24oYSl7cmV0dXJuIGE+MD9NYXRoLmNlaWwoYSk6TWF0aC5mbG9vcihhKX0sdHJpbTpmdW5jdGlvbihhKXtyZXR1cm4gYS5yZXBsYWNlKC9eXHNccyovLCIiKS5yZXBsYWNlKC9cc1xzKiQvLCIiKX0sY2xlYW5Vcmw6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9TC5lc3JpLlV0aWwudHJpbShhKSwiLyIhPT1hW2EubGVuZ3RoLTFdJiYoYSs9Ii8iKSxhfSxzZXJpYWxpemU6ZnVuY3Rpb24oYSl7dmFyIGI9Ij8iO2Zvcih2YXIgYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykpe3ZhciBkPWMsZT1hW2NdO2IrPWVuY29kZVVSSUNvbXBvbmVudChkKSxiKz0iPSIsYis9ZW5jb2RlVVJJQ29tcG9uZW50KGUpLGIrPSImIn1yZXR1cm4gYi5zdWJzdHJpbmcoMCxiLmxlbmd0aC0xKX0saW5kZXhPZjpmdW5jdGlvbihhLGIsYyl7aWYoYz1jfHwwLGEuaW5kZXhPZilyZXR1cm4gYS5pbmRleE9mKGIsYyk7Zm9yKHZhciBkPWMsZT1hLmxlbmd0aDtlPmQ7ZCsrKWlmKGFbZF09PT1iKXJldHVybiBkO3JldHVybi0xfSxleHRlbnRUb0JvdW5kczpmdW5jdGlvbihhKXt2YXIgYj1uZXcgTC5MYXRMbmcoYS55bWluLGEueG1pbiksYz1uZXcgTC5MYXRMbmcoYS55bWF4LGEueG1heCk7cmV0dXJuIG5ldyBMLkxhdExuZ0JvdW5kcyhiLGMpfSxib3VuZHNUb0V4dGVudDpmdW5jdGlvbihhKXtyZXR1cm57eG1pbjphLmdldFNvdXRoV2VzdCgpLmxuZyx5bWluOmEuZ2V0U291dGhXZXN0KCkubGF0LHhtYXg6YS5nZXROb3J0aEVhc3QoKS5sbmcseW1heDphLmdldE5vcnRoRWFzdCgpLmxhdCxzcGF0aWFsUmVmZXJlbmNlOnt3a2lkOjQzMjZ9fX0sYm91bmRzVG9FbnZlbG9wZTpmdW5jdGlvbihhKXt2YXIgYj1MLmVzcmkuVXRpbC5ib3VuZHNUb0V4dGVudChhKTtyZXR1cm57eDpiLnhtaW4seTpiLnltaW4sdzpNYXRoLmFicyhiLnhtaW4tYi54bWF4KSxoOk1hdGguYWJzKGIueW1pbi1iLnltYXgpfX19LEwuZXNyaS5NaXhpbnM9e30sTC5lc3JpLk1peGlucy5mZWF0dXJlR3JpZD17X2FjdGl2ZVJlcXVlc3RzOjAsX2luaXRpYWxpemVGZWF0dXJlR3JpZDpmdW5jdGlvbihhKXt0aGlzLl9tYXA9YSx0aGlzLl9wcmV2aW91c0NlbGxzPVtdLHRoaXMuY2VudGVyPXRoaXMuX21hcC5nZXRDZW50ZXIoKSx0aGlzLm9yaWdpbj10aGlzLl9tYXAucHJvamVjdCh0aGlzLmNlbnRlciksdGhpcy5fbW92ZUhhbmRsZXI9TC5lc3JpLlV0aWwuZGVib3VuY2UoZnVuY3Rpb24oYSl7Inpvb21lbmQiPT09YS50eXBlJiYodGhpcy5vcmlnaW49dGhpcy5fbWFwLnByb2plY3QodGhpcy5jZW50ZXIpLHRoaXMuX3ByZXZpb3VzQ2VsbHM9W10pLHRoaXMuX3JlcXVlc3RGZWF0dXJlcyhhLnRhcmdldC5nZXRCb3VuZHMoKSl9LHRoaXMub3B0aW9ucy5kZWJvdW5jZSx0aGlzKSxhLm9uKCJ6b29tZW5kIHJlc2l6ZSBtb3ZlIix0aGlzLl9tb3ZlSGFuZGxlcix0aGlzKSx0aGlzLl9yZXF1ZXN0RmVhdHVyZXMoYS5nZXRCb3VuZHMoKSl9LF9kZXN0cm95RmVhdHVyZUdyaWQ6ZnVuY3Rpb24oYSl7YS5vZmYoInpvb21lbmQgcmVzaXplIG1vdmUiLHRoaXMuX21vdmVIYW5kbGVyLHRoaXMpfSxfcmVxdWVzdEZlYXR1cmVzOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuX2NlbGxzV2l0aGluKGEpO2ImJnRoaXMuZmlyZSgibG9hZGluZyIse2JvdW5kczphfSk7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspdGhpcy5fbWFrZVJlcXVlc3QoYltjXSxiLGEpfSxfbWFrZVJlcXVlc3Q6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuX2FjdGl2ZVJlcXVlc3RzKyssTC5lc3JpLmdldCh0aGlzLnVybCsicXVlcnkiLHtnZW9tZXRyeVR5cGU6ImVzcmlHZW9tZXRyeUVudmVsb3BlIixnZW9tZXRyeTpKU09OLnN0cmluZ2lmeShMLmVzcmkuVXRpbC5ib3VuZHNUb0V4dGVudChhLmJvdW5kcykpLG91dEZpZWxkczoiKiIsb3V0U3I6NDMyNn0sZnVuY3Rpb24oYSl7dGhpcy5fYWN0aXZlUmVxdWVzdHMtLSx0aGlzLl9hY3RpdmVSZXF1ZXN0czw9MCYmdGhpcy5maXJlKCJsb2FkIix7Ym91bmRzOmMsY2VsbHM6Yn0pLHRoaXMuX3JlbmRlcihhKX0sdGhpcyl9LF9jZWxsc1dpdGhpbjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLl9tYXAuZ2V0U2l6ZSgpLGM9dGhpcy5fbWFwLnByb2plY3QodGhpcy5fbWFwLmdldENlbnRlcigpKTtNYXRoLm1pbih0aGlzLm9wdGlvbnMuY2VsbFNpemUvYi54LHRoaXMub3B0aW9ucy5jZWxsU2l6ZS9iLnkpO2Zvcih2YXIgZD1hLnBhZCguMSksZT1bXSxmPXRoaXMuX21hcC5wcm9qZWN0KGQuZ2V0Tm9ydGhXZXN0KCkpLGc9dGhpcy5fbWFwLnByb2plY3QoZC5nZXRTb3V0aEVhc3QoKSksaD1mLnN1YnRyYWN0KGMpLmRpdmlkZUJ5KHRoaXMub3B0aW9ucy5jZWxsU2l6ZSksaT1nLnN1YnRyYWN0KGMpLmRpdmlkZUJ5KHRoaXMub3B0aW9ucy5jZWxsU2l6ZSksaj1NYXRoLnJvdW5kKCh0aGlzLm9yaWdpbi54LWMueCkvdGhpcy5vcHRpb25zLmNlbGxTaXplKSxrPU1hdGgucm91bmQoKHRoaXMub3JpZ2luLnktYy55KS90aGlzLm9wdGlvbnMuY2VsbFNpemUpLGw9TC5lc3JpLlV0aWwucm91bmRBd2F5RnJvbVplcm8oaC54KS1qLG09TC5lc3JpLlV0aWwucm91bmRBd2F5RnJvbVplcm8oaS54KS1qLG49TC5lc3JpLlV0aWwucm91bmRBd2F5RnJvbVplcm8oaC55KS1rLG89TC5lc3JpLlV0aWwucm91bmRBd2F5RnJvbVplcm8oaS55KS1rLHA9bDttPnA7cCsrKWZvcih2YXIgcT1uO28+cTtxKyspe3ZhciByPSJjZWxsOiIrcCsiOiIrcSxzPUwuZXNyaS5VdGlsLmluZGV4T2YodGhpcy5fcHJldmlvdXNDZWxscyxyKT49MDtpZighc3x8IXRoaXMub3B0aW9ucy5kZWR1cGxpY2F0ZSl7dmFyIHQ9dGhpcy5fY2VsbEV4dGVudChwLHEpLHU9dC5nZXRDZW50ZXIoKSx2PXUuZGlzdGFuY2VUbyh0LmdldE5vcnRoV2VzdCgpKSx3PXUuZGlzdGFuY2VUbyh0aGlzLmNlbnRlcikseD17cm93OnAsY29sOnEsaWQ6cixjZW50ZXI6dSxib3VuZHM6dCxkaXN0YW5jZTp3LHJhZGl1czp2fTtlLnB1c2goeCksdGhpcy5fcHJldmlvdXNDZWxscy5wdXNoKHIpfX1yZXR1cm4gZS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZGlzdGFuY2UtYi5kaXN0YW5jZX0pLGV9LF9jZWxsRXh0ZW50OmZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5fY2VsbFBvaW50KGEsYiksZD10aGlzLl9jZWxsUG9pbnQoYSsxLGIrMSksZT10aGlzLl9tYXAudW5wcm9qZWN0KGMpLGY9dGhpcy5fbWFwLnVucHJvamVjdChkKTtyZXR1cm4gTC5sYXRMbmdCb3VuZHMoZSxmKX0sX2NlbGxQb2ludDpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMub3JpZ2luLngrYSp0aGlzLm9wdGlvbnMuY2VsbFNpemUsZD10aGlzLm9yaWdpbi55K2IqdGhpcy5vcHRpb25zLmNlbGxTaXplO3JldHVybltjLGRdfX0sTC5lc3JpLk1peGlucy5pZGVudGlmaWFibGVMYXllcj17aWRlbnRpZnk6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGU9e3NyOiI0MjY1IixtYXBFeHRlbnQ6SlNPTi5zdHJpbmdpZnkoTC5lc3JpLlV0aWwuYm91bmRzVG9FeHRlbnQodGhpcy5fbWFwLmdldEJvdW5kcygpKSksdG9sZXJhbmNlOjMsZ2VvbWV0cnlUeXBlOiJlc3JpR2VvbWV0cnlQb2ludCIsaW1hZ2VEaXNwbGF5OiI4MDAsNjAwLDk2IixnZW9tZXRyeTpKU09OLnN0cmluZ2lmeSh7eDphLmxuZyx5OmEubGF0LHNwYXRpYWxSZWZlcmVuY2U6e3draWQ6NDI2NX19KX07ImZ1bmN0aW9uIj09dHlwZW9mIGImJiJ1bmRlZmluZWQiPT10eXBlb2YgYz8oYz1iLGQ9ZSk6Im9iamVjdCI9PXR5cGVvZiBiJiYoYi5sYXllckRlZnMmJihiLmxheWVyRGVmcz10aGlzLnBhcnNlTGF5ZXJEZWZzKGIubGF5ZXJEZWZzKSksZD1MLlV0aWwuZXh0ZW5kKGUsYikpLEwuZXNyaS5nZXQodGhpcy5fdXJsKyIvaWRlbnRpZnkiLGQsYyl9LHBhcnNlTGF5ZXJEZWZzOmZ1bmN0aW9uKGEpe3JldHVybiBhIGluc3RhbmNlb2YgQXJyYXk/IiI6Im9iamVjdCI9PXR5cGVvZiBhP0pTT04uc3RyaW5naWZ5KGEpOmF9fSxmdW5jdGlvbihhKXt2YXIgYj0iaHR0cHM6IiE9PXdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbD8iaHR0cDoiOiJodHRwczoiLGM9ImxpbmUtaGVpZ2h0OjlweDsgdGV4dC1vdmVyZmxvdzplbGxpcHNpczsgd2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjsgZGlzcGxheTppbmxpbmUtYmxvY2s7IixkPSJwb3NpdGlvbjphYnNvbHV0ZTsgdG9wOi0zOHB4OyByaWdodDoycHg7IixlPSI8aW1nIHNyYz0naHR0cHM6Ly9zZXJ2ZXJhcGkuYXJjZ2lzb25saW5lLmNvbS9qc2FwaS9hcmNnaXMvMy41L2pzL2VzcmkvaW1hZ2VzL21hcC9sb2dvLW1lZC5wbmcnIGFsdD0nUG93ZXJlZCBieSBFc3JpJyBjbGFzcz0nZXNyaS1hdHRyaWJ1dGlvbi1sb2dvJyBzdHlsZT0nIitkKyInPiIsZj1mdW5jdGlvbihhKXtyZXR1cm4iPHNwYW4gY2xhc3M9J2VzcmktYXR0cmlidXRpb25zJyBzdHlsZT0nIitjKyInPiIrYSsiPC9zcGFuPiJ9O2EuZXNyaS5CYXNlbWFwTGF5ZXI9YS5UaWxlTGF5ZXIuZXh0ZW5kKHtzdGF0aWNzOntUSUxFUzp7U3RyZWV0czp7dXJsVGVtcGxhdGU6YisiLy97c30uYXJjZ2lzb25saW5lLmNvbS9BcmNHSVMvcmVzdC9zZXJ2aWNlcy9Xb3JsZF9TdHJlZXRfTWFwL01hcFNlcnZlci90aWxlL3t6fS97eX0ve3h9LyIsYXR0cmlidXRpb25Vcmw6Imh0dHBzOi8vc3RhdGljLmFyY2dpcy5jb20vYXR0cmlidXRpb24vV29ybGRfU3RyZWV0X01hcD9mPWpzb24iLG9wdGlvbnM6e21pblpvb206MSxtYXhab29tOjE5LHN1YmRvbWFpbnM6WyJzZXJ2ZXIiLCJzZXJ2aWNlcyJdLGF0dHJpYnV0aW9uOmYoIkVzcmkiKStlfX0sVG9wb2dyYXBoaWM6e3VybFRlbXBsYXRlOmIrIi8ve3N9LmFyY2dpc29ubGluZS5jb20vQXJjR0lTL3Jlc3Qvc2VydmljZXMvV29ybGRfVG9wb19NYXAvTWFwU2VydmVyL3RpbGUve3p9L3t5fS97eH0vIixhdHRyaWJ1dGlvblVybDoiaHR0cHM6Ly9zdGF0aWMuYXJjZ2lzLmNvbS9hdHRyaWJ1dGlvbi9Xb3JsZF9Ub3BvX01hcD9mPWpzb24iLG9wdGlvbnM6e21pblpvb206MSxtYXhab29tOjE5LHN1YmRvbWFpbnM6WyJzZXJ2ZXIiLCJzZXJ2aWNlcyJdLGF0dHJpYnV0aW9uOmYoIkVzcmkiKStlfX0sT2NlYW5zOnt1cmxUZW1wbGF0ZToiaHR0cHM6Ly9zZXJ2ZXIuYXJjZ2lzb25saW5lLmNvbS9BcmNHSVMvcmVzdC9zZXJ2aWNlcy9PY2Vhbl9CYXNlbWFwL01hcFNlcnZlci90aWxlL3t6fS97eX0ve3h9LyIsYXR0cmlidXRpb25Vcmw6Imh0dHBzOi8vc3RhdGljLmFyY2dpcy5jb20vYXR0cmlidXRpb24vT2NlYW5fQmFzZW1hcD9mPWpzb24iLG9wdGlvbnM6e21pblpvb206MSxtYXhab29tOjE2LHN1YmRvbWFpbnM6WyJzZXJ2ZXIiLCJzZXJ2aWNlcyJdLGF0dHJpYnV0aW9uOmYoIkVzcmkiKStlfX0sTmF0aW9uYWxHZW9ncmFwaGljOnt1cmxUZW1wbGF0ZToiaHR0cHM6Ly9zZXJ2ZXIuYXJjZ2lzb25saW5lLmNvbS9BcmNHSVMvcmVzdC9zZXJ2aWNlcy9OYXRHZW9fV29ybGRfTWFwL01hcFNlcnZlci90aWxlL3t6fS97eX0ve3h9LyIsb3B0aW9uczp7bWluWm9vbToxLG1heFpvb206MTYsc3ViZG9tYWluczpbInNlcnZlciIsInNlcnZpY2VzIl0sYXR0cmlidXRpb246ZigiRXNyaSIpK2V9fSxHcmF5Ont1cmxUZW1wbGF0ZTpiKyIvL3tzfS5hcmNnaXNvbmxpbmUuY29tL0FyY0dJUy9yZXN0L3NlcnZpY2VzL0NhbnZhcy9Xb3JsZF9MaWdodF9HcmF5X0Jhc2UvTWFwU2VydmVyL3RpbGUve3p9L3t5fS97eH0vIixvcHRpb25zOnttaW5ab29tOjEsbWF4Wm9vbToxNixzdWJkb21haW5zOlsic2VydmVyIiwic2VydmljZXMiXSxhdHRyaWJ1dGlvbjpmKCJFc3JpLCBOQVZURVEsIERlTG9ybWUiKStlfX0sR3JheUxhYmVsczp7dXJsVGVtcGxhdGU6YisiLy97c30uYXJjZ2lzb25saW5lLmNvbS9BcmNHSVMvcmVzdC9zZXJ2aWNlcy9DYW52YXMvV29ybGRfTGlnaHRfR3JheV9SZWZlcmVuY2UvTWFwU2VydmVyL3RpbGUve3p9L3t5fS97eH0vIixvcHRpb25zOnttaW5ab29tOjEsbWF4Wm9vbToxNixzdWJkb21haW5zOlsic2VydmVyIiwic2VydmljZXMiXX19LEltYWdlcnk6e3VybFRlbXBsYXRlOmIrIi8ve3N9LmFyY2dpc29ubGluZS5jb20vQXJjR0lTL3Jlc3Qvc2VydmljZXMvV29ybGRfSW1hZ2VyeS9NYXBTZXJ2ZXIvdGlsZS97en0ve3l9L3t4fS8iLG9wdGlvbnM6e21pblpvb206MSxtYXhab29tOjE5LHN1YmRvbWFpbnM6WyJzZXJ2ZXIiLCJzZXJ2aWNlcyJdLGF0dHJpYnV0aW9uOmYoIkVzcmksIERpZ2l0YWxHbG9iZSwgR2VvRXllLCBpLWN1YmVkLCBVU0RBLCBVU0dTLCBBRVgsIEdldG1hcHBpbmcsIEFlcm9ncmlkLCBJR04sIElHUCwgc3dpc3N0b3BvLCBhbmQgdGhlIEdJUyBVc2VyIENvbW11bml0eSIpK2V9fSxJbWFnZXJ5TGFiZWxzOnt1cmxUZW1wbGF0ZTpiKyIvL3tzfS5hcmNnaXNvbmxpbmUuY29tL0FyY0dJUy9yZXN0L3NlcnZpY2VzL1JlZmVyZW5jZS9Xb3JsZF9Cb3VuZGFyaWVzX2FuZF9QbGFjZXMvTWFwU2VydmVyL3RpbGUve3p9L3t5fS97eH0vIixvcHRpb25zOnttaW5ab29tOjEsbWF4Wm9vbToxOSxzdWJkb21haW5zOlsic2VydmVyIiwic2VydmljZXMiXX19LEltYWdlcnlUcmFuc3BvcnRhdGlvbjp7dXJsVGVtcGxhdGU6YisiLy97c30uYXJjZ2lzb25saW5lLmNvbS9BcmNHSVMvcmVzdC9zZXJ2aWNlcy9SZWZlcmVuY2UvV29ybGRfVHJhbnNwb3J0YXRpb24vTWFwU2VydmVyL3RpbGUve3p9L3t5fS97eH0vIixvcHRpb25zOnttaW5ab29tOjEsbWF4Wm9vbToxOSxzdWJkb21haW5zOlsic2VydmVyIiwic2VydmljZXMiXX19LEltYWdlcnlBbHRlcm5hdGVMYWJlbHM6e3VybFRlbXBsYXRlOmIrIi8ve3N9LmFyY2dpc29ubGluZS5jb20vQXJjR0lTL3Jlc3Qvc2VydmljZXMvUmVmZXJlbmNlL1dvcmxkX0JvdW5kYXJpZXNfYW5kX1BsYWNlc19BbHRlcm5hdGUvTWFwU2VydmVyL3RpbGUve3p9L3t5fS97eH0vIixvcHRpb25zOnttaW5ab29tOjEsbWF4Wm9vbToxMixzdWJkb21haW5zOlsic2VydmVyIiwic2VydmljZXMiXX19LFNoYWRlZFJlbGllZjp7dXJsVGVtcGxhdGU6YisiLy97c30uYXJjZ2lzb25saW5lLmNvbS9BcmNHSVMvcmVzdC9zZXJ2aWNlcy9Xb3JsZF9TaGFkZWRfUmVsaWVmL01hcFNlcnZlci90aWxlL3t6fS97eX0ve3h9LyIsb3B0aW9uczp7bWluWm9vbToxLG1heFpvb206MTMsc3ViZG9tYWluczpbInNlcnZlciIsInNlcnZpY2VzIl0sYXR0cmlidXRpb246ZigiRVNSSSwgTkFWVEVRLCBEZUxvcm1lIikrZX19fX0saW5pdGlhbGl6ZTpmdW5jdGlvbihiLGMpe3ZhciBkO2lmKCJvYmplY3QiPT10eXBlb2YgYiYmYi51cmxUZW1wbGF0ZSYmYi5vcHRpb25zKWQ9YjtlbHNle2lmKCJzdHJpbmciIT10eXBlb2YgYnx8IWEuZXNyaS5CYXNlbWFwTGF5ZXIuVElMRVNbYl0pdGhyb3cgbmV3IEVycm9yKCJMLmVzcmkuQmFzZW1hcExheWVyOiBJbnZhbGlkIHBhcmFtZXRlci4gVXNlIG9uZSBvZiAnU3RyZWV0cycsICdUb3BvZ3JhcGhpYycsICdPY2VhbnMnLCAnTmF0aW9uYWxHZW9ncmFwaGljJywgJ0dyYXknLCAnR3JheUxhYmVscycsICdJbWFnZXJ5JywgJ0ltYWdlcnlMYWJlbHMnLCAnSW1hZ2VyeVRyYW5zcG9ydGF0aW9uJywgJ0ltYWdlcnlBbHRlcm5hdGVMYWJlbHMnIG9yICdTaGFkZWRSZWxpZWYnIik7ZD1hLmVzcmkuQmFzZW1hcExheWVyLlRJTEVTW2JdfXZhciBlPWEuVXRpbC5leHRlbmQoZC5vcHRpb25zLGMpLGY9YS5lc3JpLlV0aWwuY2xlYW5VcmwoZC51cmxUZW1wbGF0ZSk7aWYoYS5UaWxlTGF5ZXIucHJvdG90eXBlLmluaXRpYWxpemUuY2FsbCh0aGlzLGYsYS5VdGlsLnNldE9wdGlvbnModGhpcyxlKSksZC5hdHRyaWJ1dGlvblVybCl7dmFyIGc9YS5lc3JpLlV0aWwuY2xlYW5VcmwoZC5hdHRyaWJ1dGlvblVybCk7dGhpcy5fZHluYW1pY0F0dHJpYnV0aW9uPSEwLHRoaXMuX2dldEF0dHJpYnV0aW9uRGF0YShnKX19LF9keW5hbWljQXR0cmlidXRpb246ITEsYm91bmRzOm51bGwsem9vbTpudWxsLG9uQWRkOmZ1bmN0aW9uKGIpe2EuVGlsZUxheWVyLnByb3RvdHlwZS5vbkFkZC5jYWxsKHRoaXMsYiksdGhpcy5fZHluYW1pY0F0dHJpYnV0aW9uJiYodGhpcy5vbigibG9hZCIsdGhpcy5faGFuZGxlVGlsZVVwZGF0ZXMsdGhpcyksdGhpcy5fbWFwLm9uKCJ2aWV3cmVzZXQgem9vbWVuZCBkcmFnZW5kIix0aGlzLl9oYW5kbGVUaWxlVXBkYXRlcyx0aGlzKSksdGhpcy5fbWFwLm9uKCJyZXNpemUiLHRoaXMuX3Jlc2l6ZUF0dHJpYnV0aW9uLHRoaXMpfSxvblJlbW92ZTpmdW5jdGlvbihiKXt0aGlzLl9keW5hbWljQXR0cmlidXRpb24mJih0aGlzLm9mZigibG9hZCIsdGhpcy5faGFuZGxlVGlsZVVwZGF0ZXMsdGhpcyksdGhpcy5fbWFwLm9mZigidmlld3Jlc2V0IHpvb21lbmQgZHJhZ2VuZCIsdGhpcy5faGFuZGxlVGlsZVVwZGF0ZXMsdGhpcykpLHRoaXMuX21hcC5vZmYoInJlc2l6ZSIsdGhpcy5fcmVzaXplQXR0cmlidXRpb24sdGhpcyksYS5UaWxlTGF5ZXIucHJvdG90eXBlLm9uUmVtb3ZlLmNhbGwodGhpcyxiKX0sX2hhbmRsZVRpbGVVcGRhdGVzOmZ1bmN0aW9uKGEpe3ZhciBiLGM7ImxvYWQiPT09YS50eXBlJiYoYj10aGlzLl9tYXAuZ2V0Qm91bmRzKCksYz10aGlzLl9tYXAuZ2V0Wm9vbSgpKSwoInZpZXdyZXNldCI9PT1hLnR5cGV8fCJkcmFnZW5kIj09PWEudHlwZXx8Inpvb21lbmQiPT09YS50eXBlKSYmKGI9YS50YXJnZXQuZ2V0Qm91bmRzKCksYz1hLnRhcmdldC5nZXRab29tKCkpLHRoaXMuYXR0cmlidXRpb25Cb3VuZGluZ0JveGVzJiZiJiZjJiYoYi5lcXVhbHModGhpcy5ib3VuZHMpJiZjPT09dGhpcy56b29tfHwodGhpcy5ib3VuZHM9Yix0aGlzLnpvb209Yyx0aGlzLl91cGRhdGVNYXBBdHRyaWJ1dGlvbigpKSl9LF9yZXNpemVBdHRyaWJ1dGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuX21hcC5nZXRTaXplKCkueDt0aGlzLl9nZXRBdHRyaWJ1dGlvbkxvZ28oKS5zdHlsZS5kaXNwbGF5PTYwMD5hPyJub25lIjoiYmxvY2siLHRoaXMuX2dldEF0dHJpYnV0aW9uU3BhbigpLnN0eWxlLm1heFdpZHRoPS43NSphKyJweCJ9LF9nZXRBdHRyaWJ1dGlvbkRhdGE6ZnVuY3Rpb24oYil7dGhpcy5hdHRyaWJ1dGlvbkJvdW5kaW5nQm94ZXM9W10sYS5lc3JpLmdldChiLHt9LHRoaXMuX3Byb2Nlc3NBdHRyaWJ1dGlvbkRhdGEsdGhpcyl9LF9wcm9jZXNzQXR0cmlidXRpb25EYXRhOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYz0wO2M8Yi5jb250cmlidXRvcnMubGVuZ3RoO2MrKylmb3IodmFyIGQ9Yi5jb250cmlidXRvcnNbY10sZT0wO2U8ZC5jb3ZlcmFnZUFyZWFzLmxlbmd0aDtlKyspe3ZhciBmPWQuY292ZXJhZ2VBcmVhc1tlXSxnPW5ldyBhLkxhdExuZyhmLmJib3hbMF0sZi5iYm94WzFdKSxoPW5ldyBhLkxhdExuZyhmLmJib3hbMl0sZi5iYm94WzNdKTt0aGlzLmF0dHJpYnV0aW9uQm91bmRpbmdCb3hlcy5wdXNoKHthdHRyaWJ1dGlvbjpkLmF0dHJpYnV0aW9uLHNjb3JlOmYuc2NvcmUsYm91bmRzOm5ldyBhLkxhdExuZ0JvdW5kcyhnLGgpLG1pblpvb206Zi56b29tTWluLG1heFpvb206Zi56b29tTWF4fSl9dGhpcy5hdHRyaWJ1dGlvbkJvdW5kaW5nQm94ZXMuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLnNjb3JlPGIuc2NvcmU/LTE6YS5zY29yZT5iLnNjb3JlPzE6MH0pLHRoaXMuYm91bmRzJiZ0aGlzLl91cGRhdGVNYXBBdHRyaWJ1dGlvbigpfSxfZ2V0QXR0cmlidXRpb25TcGFuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21hcC5fY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoIi5lc3JpLWF0dHJpYnV0aW9ucyIpWzBdfSxfZ2V0QXR0cmlidXRpb25Mb2dvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21hcC5fY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoIi5lc3JpLWF0dHJpYnV0aW9uLWxvZ28iKVswXX0sX3VwZGF0ZU1hcEF0dHJpYnV0aW9uOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSIiLGI9MDtiPHRoaXMuYXR0cmlidXRpb25Cb3VuZGluZ0JveGVzLmxlbmd0aDtiKyspe3ZhciBjPXRoaXMuYXR0cmlidXRpb25Cb3VuZGluZ0JveGVzW2JdO2lmKHRoaXMuYm91bmRzLmludGVyc2VjdHMoYy5ib3VuZHMpJiZ0aGlzLnpvb20+PWMubWluWm9vbSYmdGhpcy56b29tPD1jLm1heFpvb20pe3ZhciBkPXRoaXMuYXR0cmlidXRpb25Cb3VuZGluZ0JveGVzW2JdLmF0dHJpYnV0aW9uOy0xPT09YS5pbmRleE9mKGQpJiYoYS5sZW5ndGg+MCYmKGErPSIsICIpLGErPWQpfX10aGlzLl9nZXRBdHRyaWJ1dGlvblNwYW4oKS5pbm5lckhUTUw9YSx0aGlzLl9yZXNpemVBdHRyaWJ1dGlvbigpfX0pLGEuZXNyaS5iYXNlbWFwTGF5ZXI9ZnVuY3Rpb24oYixjKXtyZXR1cm4gbmV3IGEuZXNyaS5CYXNlbWFwTGF5ZXIoYixjKX19KEwpOw==]]></data>
	</file>
	<file>
	  <filename>/lib/js/leaflet-label/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/js/leaflet-label/leaflet.label.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LmxlYWZsZXQtbGFiZWwgewoJYmFja2dyb3VuZDogcmdiKDIzNSwgMjM1LCAyMzUpOwoJYmFja2dyb3VuZDogcmdiYSgyMzUsIDIzNSwgMjM1LCAwLjgxKTsKCWJhY2tncm91bmQtY2xpcDogcGFkZGluZy1ib3g7Cglib3JkZXItY29sb3I6ICM3Nzc7Cglib3JkZXItY29sb3I6IHJnYmEoMCwwLDAsMC4yNSk7Cglib3JkZXItcmFkaXVzOiA0cHg7Cglib3JkZXItc3R5bGU6IHNvbGlkOwoJYm9yZGVyLXdpZHRoOiA0cHg7Cgljb2xvcjogIzExMTsKCWRpc3BsYXk6IGJsb2NrOwoJZm9udDogMTJweC8yMHB4ICJIZWx2ZXRpY2EgTmV1ZSIsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Cglmb250LXdlaWdodDogYm9sZDsKCXBhZGRpbmc6IDFweCA2cHg7Cglwb3NpdGlvbjogYWJzb2x1dGU7Cgktd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwoJICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKCSAgICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7CgkgICAgICAgIHVzZXItc2VsZWN0OiBub25lOwoJd2hpdGUtc3BhY2U6IG5vd3JhcDsKCXotaW5kZXg6IDY7Cn0KCi5sZWFmbGV0LWxhYmVsLmxlYWZsZXQtY2xpY2thYmxlIHsKCWN1cnNvcjogcG9pbnRlcjsKfQoKLmxlYWZsZXQtbGFiZWw6YmVmb3JlLAoubGVhZmxldC1sYWJlbDphZnRlciB7Cglib3JkZXItdG9wOiA2cHggc29saWQgdHJhbnNwYXJlbnQ7Cglib3JkZXItYm90dG9tOiA2cHggc29saWQgdHJhbnNwYXJlbnQ7Cgljb250ZW50OiBub25lOwoJcG9zaXRpb246IGFic29sdXRlOwoJdG9wOiA1cHg7Cn0KCi5sZWFmbGV0LWxhYmVsOmJlZm9yZSB7Cglib3JkZXItcmlnaHQ6IDZweCBzb2xpZCBibGFjazsKCWJvcmRlci1yaWdodC1jb2xvcjogaW5oZXJpdDsKCWxlZnQ6IC0xMHB4Owp9CgoubGVhZmxldC1sYWJlbDphZnRlciB7Cglib3JkZXItbGVmdDogNnB4IHNvbGlkIGJsYWNrOwoJYm9yZGVyLWxlZnQtY29sb3I6IGluaGVyaXQ7CglyaWdodDogLTEwcHg7Cn0KCi5sZWFmbGV0LWxhYmVsLXJpZ2h0OmJlZm9yZSwKLmxlYWZsZXQtbGFiZWwtbGVmdDphZnRlciB7Cgljb250ZW50OiAiIjsKfQ==]]></data>
	</file>
	<file>
	  <filename>/lib/js/leaflet-label/leaflet.label.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKCUxlYWZsZXQubGFiZWwsIGEgcGx1Z2luIHRoYXQgYWRkcyBsYWJlbHMgdG8gbWFya2VycyBhbmQgdmVjdG9ycyBmb3IgTGVhZmxldCBwb3dlcmVkIG1hcHMuCgkoYykgMjAxMi0yMDEzLCBKYWNvYiBUb3llLCBTbWFydHJhawoKCWh0dHBzOi8vZ2l0aHViLmNvbS9MZWFmbGV0L0xlYWZsZXQubGFiZWwKCWh0dHA6Ly9sZWFmbGV0anMuY29tCglodHRwczovL2dpdGh1Yi5jb20vamFjb2J0b3llCiovCiFmdW5jdGlvbigpe0wubGFiZWxWZXJzaW9uPSIwLjIuMS1kZXYiLEwuTGFiZWw9TC5DbGFzcy5leHRlbmQoe2luY2x1ZGVzOkwuTWl4aW4uRXZlbnRzLG9wdGlvbnM6e2NsYXNzTmFtZToiIixjbGlja2FibGU6ITEsZGlyZWN0aW9uOiJyaWdodCIsbm9IaWRlOiExLG9mZnNldDpbMTIsLTE1XSxvcGFjaXR5OjEsem9vbUFuaW1hdGlvbjohMH0saW5pdGlhbGl6ZTpmdW5jdGlvbih0LGUpe0wuc2V0T3B0aW9ucyh0aGlzLHQpLHRoaXMuX3NvdXJjZT1lLHRoaXMuX2FuaW1hdGVkPUwuQnJvd3Nlci5hbnkzZCYmdGhpcy5vcHRpb25zLnpvb21BbmltYXRpb24sdGhpcy5faXNPcGVuPSExfSxvbkFkZDpmdW5jdGlvbih0KXt0aGlzLl9tYXA9dCx0aGlzLl9wYW5lPXRoaXMuX3NvdXJjZSBpbnN0YW5jZW9mIEwuTWFya2VyP3QuX3BhbmVzLm1hcmtlclBhbmU6dC5fcGFuZXMucG9wdXBQYW5lLHRoaXMuX2NvbnRhaW5lcnx8dGhpcy5faW5pdExheW91dCgpLHRoaXMuX3BhbmUuYXBwZW5kQ2hpbGQodGhpcy5fY29udGFpbmVyKSx0aGlzLl9pbml0SW50ZXJhY3Rpb24oKSx0aGlzLl91cGRhdGUoKSx0aGlzLnNldE9wYWNpdHkodGhpcy5vcHRpb25zLm9wYWNpdHkpLHQub24oIm1vdmVlbmQiLHRoaXMuX29uTW92ZUVuZCx0aGlzKS5vbigidmlld3Jlc2V0Iix0aGlzLl9vblZpZXdSZXNldCx0aGlzKSx0aGlzLl9hbmltYXRlZCYmdC5vbigiem9vbWFuaW0iLHRoaXMuX3pvb21BbmltYXRpb24sdGhpcyksTC5Ccm93c2VyLnRvdWNoJiYhdGhpcy5vcHRpb25zLm5vSGlkZSYmTC5Eb21FdmVudC5vbih0aGlzLl9jb250YWluZXIsImNsaWNrIix0aGlzLmNsb3NlLHRoaXMpfSxvblJlbW92ZTpmdW5jdGlvbih0KXt0aGlzLl9wYW5lLnJlbW92ZUNoaWxkKHRoaXMuX2NvbnRhaW5lciksdC5vZmYoe3pvb21hbmltOnRoaXMuX3pvb21BbmltYXRpb24sbW92ZWVuZDp0aGlzLl9vbk1vdmVFbmQsdmlld3Jlc2V0OnRoaXMuX29uVmlld1Jlc2V0fSx0aGlzKSx0aGlzLl9yZW1vdmVJbnRlcmFjdGlvbigpLHRoaXMuX21hcD1udWxsfSxzZXRMYXRMbmc6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2xhdGxuZz1MLmxhdExuZyh0KSx0aGlzLl9tYXAmJnRoaXMuX3VwZGF0ZVBvc2l0aW9uKCksdGhpc30sc2V0Q29udGVudDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcHJldmlvdXNDb250ZW50PXRoaXMuX2NvbnRlbnQsdGhpcy5fY29udGVudD10LHRoaXMuX3VwZGF0ZUNvbnRlbnQoKSx0aGlzfSxjbG9zZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX21hcDt0JiYoTC5Ccm93c2VyLnRvdWNoJiYhdGhpcy5vcHRpb25zLm5vSGlkZSYmTC5Eb21FdmVudC5vZmYodGhpcy5fY29udGFpbmVyLCJjbGljayIsdGhpcy5jbG9zZSksdC5yZW1vdmVMYXllcih0aGlzKSl9LHVwZGF0ZVpJbmRleDpmdW5jdGlvbih0KXt0aGlzLl96SW5kZXg9dCx0aGlzLl9jb250YWluZXImJnRoaXMuX3pJbmRleCYmKHRoaXMuX2NvbnRhaW5lci5zdHlsZS56SW5kZXg9dCl9LHNldE9wYWNpdHk6ZnVuY3Rpb24odCl7dGhpcy5vcHRpb25zLm9wYWNpdHk9dCx0aGlzLl9jb250YWluZXImJkwuRG9tVXRpbC5zZXRPcGFjaXR5KHRoaXMuX2NvbnRhaW5lcix0KX0sX2luaXRMYXlvdXQ6ZnVuY3Rpb24oKXt0aGlzLl9jb250YWluZXI9TC5Eb21VdGlsLmNyZWF0ZSgiZGl2IiwibGVhZmxldC1sYWJlbCAiK3RoaXMub3B0aW9ucy5jbGFzc05hbWUrIiBsZWFmbGV0LXpvb20tYW5pbWF0ZWQiKSx0aGlzLnVwZGF0ZVpJbmRleCh0aGlzLl96SW5kZXgpfSxfdXBkYXRlOmZ1bmN0aW9uKCl7dGhpcy5fbWFwJiYodGhpcy5fY29udGFpbmVyLnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiIsdGhpcy5fdXBkYXRlQ29udGVudCgpLHRoaXMuX3VwZGF0ZVBvc2l0aW9uKCksdGhpcy5fY29udGFpbmVyLnN0eWxlLnZpc2liaWxpdHk9IiIpfSxfdXBkYXRlQ29udGVudDpmdW5jdGlvbigpe3RoaXMuX2NvbnRlbnQmJnRoaXMuX21hcCYmdGhpcy5fcHJldkNvbnRlbnQhPT10aGlzLl9jb250ZW50JiYic3RyaW5nIj09dHlwZW9mIHRoaXMuX2NvbnRlbnQmJih0aGlzLl9jb250YWluZXIuaW5uZXJIVE1MPXRoaXMuX2NvbnRlbnQsdGhpcy5fcHJldkNvbnRlbnQ9dGhpcy5fY29udGVudCx0aGlzLl9sYWJlbFdpZHRoPXRoaXMuX2NvbnRhaW5lci5vZmZzZXRXaWR0aCl9LF91cGRhdGVQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX21hcC5sYXRMbmdUb0xheWVyUG9pbnQodGhpcy5fbGF0bG5nKTt0aGlzLl9zZXRQb3NpdGlvbih0KX0sX3NldFBvc2l0aW9uOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX21hcCxpPXRoaXMuX2NvbnRhaW5lcixuPWUubGF0TG5nVG9Db250YWluZXJQb2ludChlLmdldENlbnRlcigpKSxvPWUubGF5ZXJQb2ludFRvQ29udGFpbmVyUG9pbnQodCkscz10aGlzLm9wdGlvbnMuZGlyZWN0aW9uLGE9dGhpcy5fbGFiZWxXaWR0aCxsPUwucG9pbnQodGhpcy5vcHRpb25zLm9mZnNldCk7InJpZ2h0Ij09PXN8fCJhdXRvIj09PXMmJm8ueDxuLng/KEwuRG9tVXRpbC5hZGRDbGFzcyhpLCJsZWFmbGV0LWxhYmVsLXJpZ2h0IiksTC5Eb21VdGlsLnJlbW92ZUNsYXNzKGksImxlYWZsZXQtbGFiZWwtbGVmdCIpLHQ9dC5hZGQobCkpOihMLkRvbVV0aWwuYWRkQ2xhc3MoaSwibGVhZmxldC1sYWJlbC1sZWZ0IiksTC5Eb21VdGlsLnJlbW92ZUNsYXNzKGksImxlYWZsZXQtbGFiZWwtcmlnaHQiKSx0PXQuYWRkKEwucG9pbnQoLWwueC1hLGwueSkpKSxMLkRvbVV0aWwuc2V0UG9zaXRpb24oaSx0KX0sX3pvb21BbmltYXRpb246ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fbWFwLl9sYXRMbmdUb05ld0xheWVyUG9pbnQodGhpcy5fbGF0bG5nLHQuem9vbSx0LmNlbnRlcikucm91bmQoKTt0aGlzLl9zZXRQb3NpdGlvbihlKX0sX29uTW92ZUVuZDpmdW5jdGlvbigpe3RoaXMuX2FuaW1hdGVkJiYiYXV0byIhPT10aGlzLm9wdGlvbnMuZGlyZWN0aW9ufHx0aGlzLl91cGRhdGVQb3NpdGlvbigpfSxfb25WaWV3UmVzZXQ6ZnVuY3Rpb24odCl7dCYmdC5oYXJkJiZ0aGlzLl91cGRhdGUoKX0sX2luaXRJbnRlcmFjdGlvbjpmdW5jdGlvbigpe2lmKHRoaXMub3B0aW9ucy5jbGlja2FibGUpe3ZhciB0PXRoaXMuX2NvbnRhaW5lcixlPVsiZGJsY2xpY2siLCJtb3VzZWRvd24iLCJtb3VzZW92ZXIiLCJtb3VzZW91dCIsImNvbnRleHRtZW51Il07TC5Eb21VdGlsLmFkZENsYXNzKHQsImxlYWZsZXQtY2xpY2thYmxlIiksTC5Eb21FdmVudC5vbih0LCJjbGljayIsdGhpcy5fb25Nb3VzZUNsaWNrLHRoaXMpO2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7aSsrKUwuRG9tRXZlbnQub24odCxlW2ldLHRoaXMuX2ZpcmVNb3VzZUV2ZW50LHRoaXMpfX0sX3JlbW92ZUludGVyYWN0aW9uOmZ1bmN0aW9uKCl7aWYodGhpcy5vcHRpb25zLmNsaWNrYWJsZSl7dmFyIHQ9dGhpcy5fY29udGFpbmVyLGU9WyJkYmxjbGljayIsIm1vdXNlZG93biIsIm1vdXNlb3ZlciIsIm1vdXNlb3V0IiwiY29udGV4dG1lbnUiXTtMLkRvbVV0aWwucmVtb3ZlQ2xhc3ModCwibGVhZmxldC1jbGlja2FibGUiKSxMLkRvbUV2ZW50Lm9mZih0LCJjbGljayIsdGhpcy5fb25Nb3VzZUNsaWNrLHRoaXMpO2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7aSsrKUwuRG9tRXZlbnQub2ZmKHQsZVtpXSx0aGlzLl9maXJlTW91c2VFdmVudCx0aGlzKX19LF9vbk1vdXNlQ2xpY2s6ZnVuY3Rpb24odCl7dGhpcy5oYXNFdmVudExpc3RlbmVycyh0LnR5cGUpJiZMLkRvbUV2ZW50LnN0b3BQcm9wYWdhdGlvbih0KSx0aGlzLmZpcmUodC50eXBlLHtvcmlnaW5hbEV2ZW50OnR9KX0sX2ZpcmVNb3VzZUV2ZW50OmZ1bmN0aW9uKHQpe3RoaXMuZmlyZSh0LnR5cGUse29yaWdpbmFsRXZlbnQ6dH0pLCJjb250ZXh0bWVudSI9PT10LnR5cGUmJnRoaXMuaGFzRXZlbnRMaXN0ZW5lcnModC50eXBlKSYmTC5Eb21FdmVudC5wcmV2ZW50RGVmYXVsdCh0KSwibW91c2Vkb3duIiE9PXQudHlwZT9MLkRvbUV2ZW50LnN0b3BQcm9wYWdhdGlvbih0KTpMLkRvbUV2ZW50LnByZXZlbnREZWZhdWx0KHQpfX0pLEwuQmFzZU1hcmtlck1ldGhvZHM9e3Nob3dMYWJlbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxhYmVsJiZ0aGlzLl9tYXAmJih0aGlzLmxhYmVsLnNldExhdExuZyh0aGlzLl9sYXRsbmcpLHRoaXMuX21hcC5zaG93TGFiZWwodGhpcy5sYWJlbCkpLHRoaXN9LGhpZGVMYWJlbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxhYmVsJiZ0aGlzLmxhYmVsLmNsb3NlKCksdGhpc30sc2V0TGFiZWxOb0hpZGU6ZnVuY3Rpb24odCl7dGhpcy5fbGFiZWxOb0hpZGUhPT10JiYodGhpcy5fbGFiZWxOb0hpZGU9dCx0Pyh0aGlzLl9yZW1vdmVMYWJlbFJldmVhbEhhbmRsZXJzKCksdGhpcy5zaG93TGFiZWwoKSk6KHRoaXMuX2FkZExhYmVsUmV2ZWFsSGFuZGxlcnMoKSx0aGlzLmhpZGVMYWJlbCgpKSl9LGJpbmRMYWJlbDpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMub3B0aW9ucy5pY29uP3RoaXMub3B0aW9ucy5pY29uLm9wdGlvbnMubGFiZWxBbmNob3I6dGhpcy5vcHRpb25zLmxhYmVsQW5jaG9yLG49TC5wb2ludChpKXx8TC5wb2ludCgwLDApO3JldHVybiBuPW4uYWRkKEwuTGFiZWwucHJvdG90eXBlLm9wdGlvbnMub2Zmc2V0KSxlJiZlLm9mZnNldCYmKG49bi5hZGQoZS5vZmZzZXQpKSxlPUwuVXRpbC5leHRlbmQoe29mZnNldDpufSxlKSx0aGlzLl9sYWJlbE5vSGlkZT1lLm5vSGlkZSx0aGlzLmxhYmVsfHwodGhpcy5fbGFiZWxOb0hpZGV8fHRoaXMuX2FkZExhYmVsUmV2ZWFsSGFuZGxlcnMoKSx0aGlzLm9uKCJyZW1vdmUiLHRoaXMuaGlkZUxhYmVsLHRoaXMpLm9uKCJtb3ZlIix0aGlzLl9tb3ZlTGFiZWwsdGhpcykub24oImFkZCIsdGhpcy5fb25NYXJrZXJBZGQsdGhpcyksdGhpcy5faGFzTGFiZWxIYW5kbGVycz0hMCksdGhpcy5sYWJlbD1uZXcgTC5MYWJlbChlLHRoaXMpLnNldENvbnRlbnQodCksdGhpc30sdW5iaW5kTGFiZWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYWJlbCYmKHRoaXMuaGlkZUxhYmVsKCksdGhpcy5sYWJlbD1udWxsLHRoaXMuX2hhc0xhYmVsSGFuZGxlcnMmJih0aGlzLl9sYWJlbE5vSGlkZXx8dGhpcy5fcmVtb3ZlTGFiZWxSZXZlYWxIYW5kbGVycygpLHRoaXMub2ZmKCJyZW1vdmUiLHRoaXMuaGlkZUxhYmVsLHRoaXMpLm9mZigibW92ZSIsdGhpcy5fbW92ZUxhYmVsLHRoaXMpLm9mZigiYWRkIix0aGlzLl9vbk1hcmtlckFkZCx0aGlzKSksdGhpcy5faGFzTGFiZWxIYW5kbGVycz0hMSksdGhpc30sdXBkYXRlTGFiZWxDb250ZW50OmZ1bmN0aW9uKHQpe3RoaXMubGFiZWwmJnRoaXMubGFiZWwuc2V0Q29udGVudCh0KX0sZ2V0TGFiZWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYWJlbH0sX29uTWFya2VyQWRkOmZ1bmN0aW9uKCl7dGhpcy5fbGFiZWxOb0hpZGUmJnRoaXMuc2hvd0xhYmVsKCl9LF9hZGRMYWJlbFJldmVhbEhhbmRsZXJzOmZ1bmN0aW9uKCl7dGhpcy5vbigibW91c2VvdmVyIix0aGlzLnNob3dMYWJlbCx0aGlzKS5vbigibW91c2VvdXQiLHRoaXMuaGlkZUxhYmVsLHRoaXMpLEwuQnJvd3Nlci50b3VjaCYmdGhpcy5vbigiY2xpY2siLHRoaXMuc2hvd0xhYmVsLHRoaXMpfSxfcmVtb3ZlTGFiZWxSZXZlYWxIYW5kbGVyczpmdW5jdGlvbigpe3RoaXMub2ZmKCJtb3VzZW92ZXIiLHRoaXMuc2hvd0xhYmVsLHRoaXMpLm9mZigibW91c2VvdXQiLHRoaXMuaGlkZUxhYmVsLHRoaXMpLEwuQnJvd3Nlci50b3VjaCYmdGhpcy5vZmYoImNsaWNrIix0aGlzLnNob3dMYWJlbCx0aGlzKX0sX21vdmVMYWJlbDpmdW5jdGlvbih0KXt0aGlzLmxhYmVsLnNldExhdExuZyh0LmxhdGxuZyl9fSxMLkljb24uRGVmYXVsdC5tZXJnZU9wdGlvbnMoe2xhYmVsQW5jaG9yOm5ldyBMLlBvaW50KDksLTIwKX0pLEwuTWFya2VyLm1lcmdlT3B0aW9ucyh7aWNvbjpuZXcgTC5JY29uLkRlZmF1bHR9KSxMLk1hcmtlci5pbmNsdWRlKEwuQmFzZU1hcmtlck1ldGhvZHMpLEwuTWFya2VyLmluY2x1ZGUoe19vcmlnaW5hbFVwZGF0ZVpJbmRleDpMLk1hcmtlci5wcm90b3R5cGUuX3VwZGF0ZVpJbmRleCxfdXBkYXRlWkluZGV4OmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3pJbmRleCt0O3RoaXMuX29yaWdpbmFsVXBkYXRlWkluZGV4KHQpLHRoaXMubGFiZWwmJnRoaXMubGFiZWwudXBkYXRlWkluZGV4KGUpfSxfb3JpZ2luYWxTZXRPcGFjaXR5OkwuTWFya2VyLnByb3RvdHlwZS5zZXRPcGFjaXR5LHNldE9wYWNpdHk6ZnVuY3Rpb24odCxlKXt0aGlzLm9wdGlvbnMubGFiZWxIYXNTZW1pVHJhbnNwYXJlbmN5PWUsdGhpcy5fb3JpZ2luYWxTZXRPcGFjaXR5KHQpfSxfb3JpZ2luYWxVcGRhdGVPcGFjaXR5OkwuTWFya2VyLnByb3RvdHlwZS5fdXBkYXRlT3BhY2l0eSxfdXBkYXRlT3BhY2l0eTpmdW5jdGlvbigpe3ZhciB0PTA9PT10aGlzLm9wdGlvbnMub3BhY2l0eT8wOjE7dGhpcy5fb3JpZ2luYWxVcGRhdGVPcGFjaXR5KCksdGhpcy5sYWJlbCYmdGhpcy5sYWJlbC5zZXRPcGFjaXR5KHRoaXMub3B0aW9ucy5sYWJlbEhhc1NlbWlUcmFuc3BhcmVuY3k/dGhpcy5vcHRpb25zLm9wYWNpdHk6dCl9LF9vcmlnaW5hbFNldExhdExuZzpMLk1hcmtlci5wcm90b3R5cGUuc2V0TGF0TG5nLHNldExhdExuZzpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5sYWJlbCYmIXRoaXMuX2xhYmVsTm9IaWRlJiZ0aGlzLmhpZGVMYWJlbCgpLHRoaXMuX29yaWdpbmFsU2V0TGF0TG5nKHQpfX0pLEwuQ2lyY2xlTWFya2VyLm1lcmdlT3B0aW9ucyh7bGFiZWxBbmNob3I6bmV3IEwuUG9pbnQoMCwwKX0pLEwuQ2lyY2xlTWFya2VyLmluY2x1ZGUoTC5CYXNlTWFya2VyTWV0aG9kcyksTC5QYXRoLmluY2x1ZGUoe2JpbmRMYWJlbDpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmxhYmVsJiZ0aGlzLmxhYmVsLm9wdGlvbnM9PT1lfHwodGhpcy5sYWJlbD1uZXcgTC5MYWJlbChlLHRoaXMpKSx0aGlzLmxhYmVsLnNldENvbnRlbnQodCksdGhpcy5fc2hvd0xhYmVsQWRkZWR8fCh0aGlzLm9uKCJtb3VzZW92ZXIiLHRoaXMuX3Nob3dMYWJlbCx0aGlzKS5vbigibW91c2Vtb3ZlIix0aGlzLl9tb3ZlTGFiZWwsdGhpcykub24oIm1vdXNlb3V0IHJlbW92ZSIsdGhpcy5faGlkZUxhYmVsLHRoaXMpLEwuQnJvd3Nlci50b3VjaCYmdGhpcy5vbigiY2xpY2siLHRoaXMuX3Nob3dMYWJlbCx0aGlzKSx0aGlzLl9zaG93TGFiZWxBZGRlZD0hMCksdGhpc30sdW5iaW5kTGFiZWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYWJlbCYmKHRoaXMuX2hpZGVMYWJlbCgpLHRoaXMubGFiZWw9bnVsbCx0aGlzLl9zaG93TGFiZWxBZGRlZD0hMSx0aGlzLm9mZigibW91c2VvdmVyIix0aGlzLl9zaG93TGFiZWwsdGhpcykub2ZmKCJtb3VzZW1vdmUiLHRoaXMuX21vdmVMYWJlbCx0aGlzKS5vZmYoIm1vdXNlb3V0IHJlbW92ZSIsdGhpcy5faGlkZUxhYmVsLHRoaXMpKSx0aGlzfSx1cGRhdGVMYWJlbENvbnRlbnQ6ZnVuY3Rpb24odCl7dGhpcy5sYWJlbCYmdGhpcy5sYWJlbC5zZXRDb250ZW50KHQpfSxfc2hvd0xhYmVsOmZ1bmN0aW9uKHQpe3RoaXMubGFiZWwuc2V0TGF0TG5nKHQubGF0bG5nKSx0aGlzLl9tYXAuc2hvd0xhYmVsKHRoaXMubGFiZWwpfSxfbW92ZUxhYmVsOmZ1bmN0aW9uKHQpe3RoaXMubGFiZWwuc2V0TGF0TG5nKHQubGF0bG5nKX0sX2hpZGVMYWJlbDpmdW5jdGlvbigpe3RoaXMubGFiZWwuY2xvc2UoKX19KSxMLk1hcC5pbmNsdWRlKHtzaG93TGFiZWw6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuYWRkTGF5ZXIodCl9fSksTC5GZWF0dXJlR3JvdXAuaW5jbHVkZSh7Y2xlYXJMYXllcnM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51bmJpbmRMYWJlbCgpLHRoaXMuZWFjaExheWVyKHRoaXMucmVtb3ZlTGF5ZXIsdGhpcyksdGhpc30sYmluZExhYmVsOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuaW52b2tlKCJiaW5kTGFiZWwiLHQsZSl9LHVuYmluZExhYmVsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW52b2tlKCJ1bmJpbmRMYWJlbCIpfSx1cGRhdGVMYWJlbENvbnRlbnQ6ZnVuY3Rpb24odCl7dGhpcy5pbnZva2UoInVwZGF0ZUxhYmVsQ29udGVudCIsdCl9fSl9KHRoaXMsZG9jdW1lbnQpOw==]]></data>
	</file>
	<file>
	  <filename>/lib/js/leaflet-markercluster/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/js/leaflet-markercluster/leaflet.markercluster-src.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKIExlYWZsZXQubWFya2VyY2x1c3RlciwgUHJvdmlkZXMgQmVhdXRpZnVsIEFuaW1hdGVkIE1hcmtlciBDbHVzdGVyaW5nIGZ1bmN0aW9uYWxpdHkgZm9yIExlYWZsZXQsIGEgSlMgbGlicmFyeSBmb3IgaW50ZXJhY3RpdmUgbWFwcy4KIGh0dHBzOi8vZ2l0aHViLmNvbS9MZWFmbGV0L0xlYWZsZXQubWFya2VyY2x1c3RlcgogKGMpIDIwMTItMjAxMywgRGF2ZSBMZWF2ZXIsIHNtYXJ0cmFrCiovCihmdW5jdGlvbiAod2luZG93LCBkb2N1bWVudCwgdW5kZWZpbmVkKSB7Ci8qCiAqIEwuTWFya2VyQ2x1c3Rlckdyb3VwIGV4dGVuZHMgTC5GZWF0dXJlR3JvdXAgYnkgY2x1c3RlcmluZyB0aGUgbWFya2VycyBjb250YWluZWQgd2l0aGluCiAqLwoKTC5NYXJrZXJDbHVzdGVyR3JvdXAgPSBMLkZlYXR1cmVHcm91cC5leHRlbmQoewoKCW9wdGlvbnM6IHsKCQltYXhDbHVzdGVyUmFkaXVzOiA4MCwgLy9BIGNsdXN0ZXIgd2lsbCBjb3ZlciBhdCBtb3N0IHRoaXMgbWFueSBwaXhlbHMgZnJvbSBpdHMgY2VudGVyCgkJaWNvbkNyZWF0ZUZ1bmN0aW9uOiBudWxsLAoKCQlzcGlkZXJmeU9uTWF4Wm9vbTogdHJ1ZSwKCQlzaG93Q292ZXJhZ2VPbkhvdmVyOiB0cnVlLAoJCXpvb21Ub0JvdW5kc09uQ2xpY2s6IHRydWUsCgkJc2luZ2xlTWFya2VyTW9kZTogZmFsc2UsCgoJCWRpc2FibGVDbHVzdGVyaW5nQXRab29tOiBudWxsLAoKCQkvLyBTZXR0aW5nIHRoaXMgdG8gZmFsc2UgcHJldmVudHMgdGhlIHJlbW92YWwgb2YgYW55IGNsdXN0ZXJzIG91dHNpZGUgb2YgdGhlIHZpZXdwb2ludCwgd2hpY2gKCQkvLyBpcyB0aGUgZGVmYXVsdCBiZWhhdmlvdXIgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuCgkJcmVtb3ZlT3V0c2lkZVZpc2libGVCb3VuZHM6IHRydWUsCgoJCS8vV2hldGhlciB0byBhbmltYXRlIGFkZGluZyBtYXJrZXJzIGFmdGVyIGFkZGluZyB0aGUgTWFya2VyQ2x1c3Rlckdyb3VwIHRvIHRoZSBtYXAKCQkvLyBJZiB5b3UgYXJlIGFkZGluZyBpbmRpdmlkdWFsIG1hcmtlcnMgc2V0IHRvIHRydWUsIGlmIGFkZGluZyBidWxrIG1hcmtlcnMgbGVhdmUgZmFsc2UgZm9yIG1hc3NpdmUgcGVyZm9ybWFuY2UgZ2FpbnMuCgkJYW5pbWF0ZUFkZGluZ01hcmtlcnM6IGZhbHNlLAoKCQkvL0luY3JlYXNlIHRvIGluY3JlYXNlIHRoZSBkaXN0YW5jZSBhd2F5IHRoYXQgc3BpZGVyZmllZCBtYXJrZXJzIGFwcGVhciBmcm9tIHRoZSBjZW50ZXIKCQlzcGlkZXJmeURpc3RhbmNlTXVsdGlwbGllcjogMSwKCgkJLy9PcHRpb25zIHRvIHBhc3MgdG8gdGhlIEwuUG9seWdvbiBjb25zdHJ1Y3RvcgoJCXBvbHlnb25PcHRpb25zOiB7fQoJfSwKCglpbml0aWFsaXplOiBmdW5jdGlvbiAob3B0aW9ucykgewoJCUwuVXRpbC5zZXRPcHRpb25zKHRoaXMsIG9wdGlvbnMpOwoJCWlmICghdGhpcy5vcHRpb25zLmljb25DcmVhdGVGdW5jdGlvbikgewoJCQl0aGlzLm9wdGlvbnMuaWNvbkNyZWF0ZUZ1bmN0aW9uID0gdGhpcy5fZGVmYXVsdEljb25DcmVhdGVGdW5jdGlvbjsKCQl9CgoJCXRoaXMuX2ZlYXR1cmVHcm91cCA9IEwuZmVhdHVyZUdyb3VwKCk7CgkJdGhpcy5fZmVhdHVyZUdyb3VwLm9uKEwuRmVhdHVyZUdyb3VwLkVWRU5UUywgdGhpcy5fcHJvcGFnYXRlRXZlbnQsIHRoaXMpOwoKCQl0aGlzLl9ub25Qb2ludEdyb3VwID0gTC5mZWF0dXJlR3JvdXAoKTsKCQl0aGlzLl9ub25Qb2ludEdyb3VwLm9uKEwuRmVhdHVyZUdyb3VwLkVWRU5UUywgdGhpcy5fcHJvcGFnYXRlRXZlbnQsIHRoaXMpOwoKCQl0aGlzLl9pblpvb21BbmltYXRpb24gPSAwOwoJCXRoaXMuX25lZWRzQ2x1c3RlcmluZyA9IFtdOwoJCXRoaXMuX25lZWRzUmVtb3ZpbmcgPSBbXTsgLy9NYXJrZXJzIHJlbW92ZWQgd2hpbGUgd2UgYXJlbid0IG9uIHRoZSBtYXAgbmVlZCB0byBiZSBrZXB0IHRyYWNrIG9mCgkJLy9UaGUgYm91bmRzIG9mIHRoZSBjdXJyZW50bHkgc2hvd24gYXJlYSAoZnJvbSBfZ2V0RXhwYW5kZWRWaXNpYmxlQm91bmRzKSBVcGRhdGVkIG9uIHpvb20vbW92ZQoJCXRoaXMuX2N1cnJlbnRTaG93bkJvdW5kcyA9IG51bGw7CgoJCXRoaXMuX3F1ZXVlID0gW107Cgl9LAoKCWFkZExheWVyOiBmdW5jdGlvbiAobGF5ZXIpIHsKCgkJaWYgKGxheWVyIGluc3RhbmNlb2YgTC5MYXllckdyb3VwKSB7CgkJCXZhciBhcnJheSA9IFtdOwoJCQlmb3IgKHZhciBpIGluIGxheWVyLl9sYXllcnMpIHsKCQkJCWFycmF5LnB1c2gobGF5ZXIuX2xheWVyc1tpXSk7CgkJCX0KCQkJcmV0dXJuIHRoaXMuYWRkTGF5ZXJzKGFycmF5KTsKCQl9CgoJCS8vRG9uJ3QgY2x1c3RlciBub24gcG9pbnQgZGF0YQoJCWlmICghbGF5ZXIuZ2V0TGF0TG5nKSB7CgkJCXRoaXMuX25vblBvaW50R3JvdXAuYWRkTGF5ZXIobGF5ZXIpOwoJCQlyZXR1cm4gdGhpczsKCQl9CgoJCWlmICghdGhpcy5fbWFwKSB7CgkJCXRoaXMuX25lZWRzQ2x1c3RlcmluZy5wdXNoKGxheWVyKTsKCQkJcmV0dXJuIHRoaXM7CgkJfQoKCQlpZiAodGhpcy5oYXNMYXllcihsYXllcikpIHsKCQkJcmV0dXJuIHRoaXM7CgkJfQoKCgkJLy9JZiB3ZSBoYXZlIGFscmVhZHkgY2x1c3RlcmVkIHdlJ2xsIG5lZWQgdG8gYWRkIHRoaXMgb25lIHRvIGEgY2x1c3RlcgoKCQlpZiAodGhpcy5fdW5zcGlkZXJmeSkgewoJCQl0aGlzLl91bnNwaWRlcmZ5KCk7CgkJfQoKCQl0aGlzLl9hZGRMYXllcihsYXllciwgdGhpcy5fbWF4Wm9vbSk7CgoJCS8vV29yayBvdXQgd2hhdCBpcyB2aXNpYmxlCgkJdmFyIHZpc2libGVMYXllciA9IGxheWVyLAoJCQljdXJyZW50Wm9vbSA9IHRoaXMuX21hcC5nZXRab29tKCk7CgkJaWYgKGxheWVyLl9fcGFyZW50KSB7CgkJCXdoaWxlICh2aXNpYmxlTGF5ZXIuX19wYXJlbnQuX3pvb20gPj0gY3VycmVudFpvb20pIHsKCQkJCXZpc2libGVMYXllciA9IHZpc2libGVMYXllci5fX3BhcmVudDsKCQkJfQoJCX0KCgkJaWYgKHRoaXMuX2N1cnJlbnRTaG93bkJvdW5kcy5jb250YWlucyh2aXNpYmxlTGF5ZXIuZ2V0TGF0TG5nKCkpKSB7CgkJCWlmICh0aGlzLm9wdGlvbnMuYW5pbWF0ZUFkZGluZ01hcmtlcnMpIHsKCQkJCXRoaXMuX2FuaW1hdGlvbkFkZExheWVyKGxheWVyLCB2aXNpYmxlTGF5ZXIpOwoJCQl9IGVsc2UgewoJCQkJdGhpcy5fYW5pbWF0aW9uQWRkTGF5ZXJOb25BbmltYXRlZChsYXllciwgdmlzaWJsZUxheWVyKTsKCQkJfQoJCX0KCQlyZXR1cm4gdGhpczsKCX0sCgoJcmVtb3ZlTGF5ZXI6IGZ1bmN0aW9uIChsYXllcikgewoKCQlpZiAobGF5ZXIgaW5zdGFuY2VvZiBMLkxheWVyR3JvdXApCgkJewoJCQl2YXIgYXJyYXkgPSBbXTsKCQkJZm9yICh2YXIgaSBpbiBsYXllci5fbGF5ZXJzKSB7CgkJCQlhcnJheS5wdXNoKGxheWVyLl9sYXllcnNbaV0pOwoJCQl9CgkJCXJldHVybiB0aGlzLnJlbW92ZUxheWVycyhhcnJheSk7CgkJfQoKCQkvL05vbiBwb2ludCBsYXllcnMKCQlpZiAoIWxheWVyLmdldExhdExuZykgewoJCQl0aGlzLl9ub25Qb2ludEdyb3VwLnJlbW92ZUxheWVyKGxheWVyKTsKCQkJcmV0dXJuIHRoaXM7CgkJfQoKCQlpZiAoIXRoaXMuX21hcCkgewoJCQlpZiAoIXRoaXMuX2FycmF5U3BsaWNlKHRoaXMuX25lZWRzQ2x1c3RlcmluZywgbGF5ZXIpICYmIHRoaXMuaGFzTGF5ZXIobGF5ZXIpKSB7CgkJCQl0aGlzLl9uZWVkc1JlbW92aW5nLnB1c2gobGF5ZXIpOwoJCQl9CgkJCXJldHVybiB0aGlzOwoJCX0KCgkJaWYgKCFsYXllci5fX3BhcmVudCkgewoJCQlyZXR1cm4gdGhpczsKCQl9CgoJCWlmICh0aGlzLl91bnNwaWRlcmZ5KSB7CgkJCXRoaXMuX3Vuc3BpZGVyZnkoKTsKCQkJdGhpcy5fdW5zcGlkZXJmeUxheWVyKGxheWVyKTsKCQl9CgoJCS8vUmVtb3ZlIHRoZSBtYXJrZXIgZnJvbSBjbHVzdGVycwoJCXRoaXMuX3JlbW92ZUxheWVyKGxheWVyLCB0cnVlKTsKCgkJaWYgKHRoaXMuX2ZlYXR1cmVHcm91cC5oYXNMYXllcihsYXllcikpIHsKCQkJdGhpcy5fZmVhdHVyZUdyb3VwLnJlbW92ZUxheWVyKGxheWVyKTsKCQkJaWYgKGxheWVyLnNldE9wYWNpdHkpIHsKCQkJCWxheWVyLnNldE9wYWNpdHkoMSk7CgkJCX0KCQl9CgoJCXJldHVybiB0aGlzOwoJfSwKCgkvL1Rha2VzIGFuIGFycmF5IG9mIG1hcmtlcnMgYW5kIGFkZHMgdGhlbSBpbiBidWxrCglhZGRMYXllcnM6IGZ1bmN0aW9uIChsYXllcnNBcnJheSkgewoJCXZhciBpLCBsLCBtLAoJCQlvbk1hcCA9IHRoaXMuX21hcCwKCQkJZmcgPSB0aGlzLl9mZWF0dXJlR3JvdXAsCgkJCW5wZyA9IHRoaXMuX25vblBvaW50R3JvdXA7CgoJCWZvciAoaSA9IDAsIGwgPSBsYXllcnNBcnJheS5sZW5ndGg7IGkgPCBsOyBpKyspIHsKCQkJbSA9IGxheWVyc0FycmF5W2ldOwoKCQkJLy9Ob3QgcG9pbnQgZGF0YSwgY2FuJ3QgYmUgY2x1c3RlcmVkCgkJCWlmICghbS5nZXRMYXRMbmcpIHsKCQkJCW5wZy5hZGRMYXllcihtKTsKCQkJCWNvbnRpbnVlOwoJCQl9CgoJCQlpZiAodGhpcy5oYXNMYXllcihtKSkgewoJCQkJY29udGludWU7CgkJCX0KCgkJCWlmICghb25NYXApIHsKCQkJCXRoaXMuX25lZWRzQ2x1c3RlcmluZy5wdXNoKG0pOwoJCQkJY29udGludWU7CgkJCX0KCgkJCXRoaXMuX2FkZExheWVyKG0sIHRoaXMuX21heFpvb20pOwoKCQkJLy9JZiB3ZSBqdXN0IG1hZGUgYSBjbHVzdGVyIG9mIHNpemUgMiB0aGVuIHdlIG5lZWQgdG8gcmVtb3ZlIHRoZSBvdGhlciBtYXJrZXIgZnJvbSB0aGUgbWFwIChpZiBpdCBpcykgb3Igd2UgbmV2ZXIgd2lsbAoJCQlpZiAobS5fX3BhcmVudCkgewoJCQkJaWYgKG0uX19wYXJlbnQuZ2V0Q2hpbGRDb3VudCgpID09PSAyKSB7CgkJCQkJdmFyIG1hcmtlcnMgPSBtLl9fcGFyZW50LmdldEFsbENoaWxkTWFya2VycygpLAoJCQkJCQlvdGhlck1hcmtlciA9IG1hcmtlcnNbMF0gPT09IG0gPyBtYXJrZXJzWzFdIDogbWFya2Vyc1swXTsKCQkJCQlmZy5yZW1vdmVMYXllcihvdGhlck1hcmtlcik7CgkJCQl9CgkJCX0KCQl9CgoJCWlmIChvbk1hcCkgewoJCQkvL1VwZGF0ZSB0aGUgaWNvbnMgb2YgYWxsIHRob3NlIHZpc2libGUgY2x1c3RlcnMgdGhhdCB3ZXJlIGFmZmVjdGVkCgkJCWZnLmVhY2hMYXllcihmdW5jdGlvbiAoYykgewoJCQkJaWYgKGMgaW5zdGFuY2VvZiBMLk1hcmtlckNsdXN0ZXIgJiYgYy5faWNvbk5lZWRzVXBkYXRlKSB7CgkJCQkJYy5fdXBkYXRlSWNvbigpOwoJCQkJfQoJCQl9KTsKCgkJCXRoaXMuX3RvcENsdXN0ZXJMZXZlbC5fcmVjdXJzaXZlbHlBZGRDaGlsZHJlblRvTWFwKG51bGwsIHRoaXMuX3pvb20sIHRoaXMuX2N1cnJlbnRTaG93bkJvdW5kcyk7CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCgoJLy9UYWtlcyBhbiBhcnJheSBvZiBtYXJrZXJzIGFuZCByZW1vdmVzIHRoZW0gaW4gYnVsawoJcmVtb3ZlTGF5ZXJzOiBmdW5jdGlvbiAobGF5ZXJzQXJyYXkpIHsKCQl2YXIgaSwgbCwgbSwKCQkJZmcgPSB0aGlzLl9mZWF0dXJlR3JvdXAsCgkJCW5wZyA9IHRoaXMuX25vblBvaW50R3JvdXA7CgoJCWlmICghdGhpcy5fbWFwKSB7CgkJCWZvciAoaSA9IDAsIGwgPSBsYXllcnNBcnJheS5sZW5ndGg7IGkgPCBsOyBpKyspIHsKCQkJCW0gPSBsYXllcnNBcnJheVtpXTsKCQkJCXRoaXMuX2FycmF5U3BsaWNlKHRoaXMuX25lZWRzQ2x1c3RlcmluZywgbSk7CgkJCQlucGcucmVtb3ZlTGF5ZXIobSk7CgkJCX0KCQkJcmV0dXJuIHRoaXM7CgkJfQoKCQlmb3IgKGkgPSAwLCBsID0gbGF5ZXJzQXJyYXkubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CgkJCW0gPSBsYXllcnNBcnJheVtpXTsKCgkJCWlmICghbS5fX3BhcmVudCkgewoJCQkJbnBnLnJlbW92ZUxheWVyKG0pOwoJCQkJY29udGludWU7CgkJCX0KCgkJCXRoaXMuX3JlbW92ZUxheWVyKG0sIHRydWUsIHRydWUpOwoKCQkJaWYgKGZnLmhhc0xheWVyKG0pKSB7CgkJCQlmZy5yZW1vdmVMYXllcihtKTsKCQkJCWlmIChtLnNldE9wYWNpdHkpIHsKCQkJCQltLnNldE9wYWNpdHkoMSk7CgkJCQl9CgkJCX0KCQl9CgoJCS8vRml4IHVwIHRoZSBjbHVzdGVycyBhbmQgbWFya2VycyBvbiB0aGUgbWFwCgkJdGhpcy5fdG9wQ2x1c3RlckxldmVsLl9yZWN1cnNpdmVseUFkZENoaWxkcmVuVG9NYXAobnVsbCwgdGhpcy5fem9vbSwgdGhpcy5fY3VycmVudFNob3duQm91bmRzKTsKCgkJZmcuZWFjaExheWVyKGZ1bmN0aW9uIChjKSB7CgkJCWlmIChjIGluc3RhbmNlb2YgTC5NYXJrZXJDbHVzdGVyKSB7CgkJCQljLl91cGRhdGVJY29uKCk7CgkJCX0KCQl9KTsKCgkJcmV0dXJuIHRoaXM7Cgl9LAoKCS8vUmVtb3ZlcyBhbGwgbGF5ZXJzIGZyb20gdGhlIE1hcmtlckNsdXN0ZXJHcm91cAoJY2xlYXJMYXllcnM6IGZ1bmN0aW9uICgpIHsKCQkvL05lZWQgb3VyIG93biBzcGVjaWFsIGltcGxlbWVudGF0aW9uIGFzIHRoZSBMYXllckdyb3VwIG9uZSBkb2Vzbid0IHdvcmsgZm9yIHVzCgoJCS8vSWYgd2UgYXJlbid0IG9uIHRoZSBtYXAgKHlldCksIGJsb3cgYXdheSB0aGUgbWFya2VycyB3ZSBrbm93IG9mCgkJaWYgKCF0aGlzLl9tYXApIHsKCQkJdGhpcy5fbmVlZHNDbHVzdGVyaW5nID0gW107CgkJCWRlbGV0ZSB0aGlzLl9ncmlkQ2x1c3RlcnM7CgkJCWRlbGV0ZSB0aGlzLl9ncmlkVW5jbHVzdGVyZWQ7CgkJfQoKCQlpZiAodGhpcy5fbm9hbmltYXRpb25VbnNwaWRlcmZ5KSB7CgkJCXRoaXMuX25vYW5pbWF0aW9uVW5zcGlkZXJmeSgpOwoJCX0KCgkJLy9SZW1vdmUgYWxsIHRoZSB2aXNpYmxlIGxheWVycwoJCXRoaXMuX2ZlYXR1cmVHcm91cC5jbGVhckxheWVycygpOwoJCXRoaXMuX25vblBvaW50R3JvdXAuY2xlYXJMYXllcnMoKTsKCgkJdGhpcy5lYWNoTGF5ZXIoZnVuY3Rpb24gKG1hcmtlcikgewoJCQlkZWxldGUgbWFya2VyLl9fcGFyZW50OwoJCX0pOwoKCQlpZiAodGhpcy5fbWFwKSB7CgkJCS8vUmVzZXQgX3RvcENsdXN0ZXJMZXZlbCBhbmQgdGhlIERpc3RhbmNlR3JpZHMKCQkJdGhpcy5fZ2VuZXJhdGVJbml0aWFsQ2x1c3RlcnMoKTsKCQl9CgoJCXJldHVybiB0aGlzOwoJfSwKCgkvL092ZXJyaWRlIEZlYXR1cmVHcm91cC5nZXRCb3VuZHMgYXMgaXQgZG9lc24ndCB3b3JrCglnZXRCb3VuZHM6IGZ1bmN0aW9uICgpIHsKCQl2YXIgYm91bmRzID0gbmV3IEwuTGF0TG5nQm91bmRzKCk7CgkJaWYgKHRoaXMuX3RvcENsdXN0ZXJMZXZlbCkgewoJCQlib3VuZHMuZXh0ZW5kKHRoaXMuX3RvcENsdXN0ZXJMZXZlbC5fYm91bmRzKTsKCQl9IGVsc2UgewoJCQlmb3IgKHZhciBpID0gdGhpcy5fbmVlZHNDbHVzdGVyaW5nLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CgkJCQlib3VuZHMuZXh0ZW5kKHRoaXMuX25lZWRzQ2x1c3RlcmluZ1tpXS5nZXRMYXRMbmcoKSk7CgkJCX0KCQl9CgoJCWJvdW5kcy5leHRlbmQodGhpcy5fbm9uUG9pbnRHcm91cC5nZXRCb3VuZHMoKSk7CgoJCXJldHVybiBib3VuZHM7Cgl9LAoKCS8vT3ZlcnJpZGVzIExheWVyR3JvdXAuZWFjaExheWVyCgllYWNoTGF5ZXI6IGZ1bmN0aW9uIChtZXRob2QsIGNvbnRleHQpIHsKCQl2YXIgbWFya2VycyA9IHRoaXMuX25lZWRzQ2x1c3RlcmluZy5zbGljZSgpLAoJCSAgICBpOwoKCQlpZiAodGhpcy5fdG9wQ2x1c3RlckxldmVsKSB7CgkJCXRoaXMuX3RvcENsdXN0ZXJMZXZlbC5nZXRBbGxDaGlsZE1hcmtlcnMobWFya2Vycyk7CgkJfQoKCQlmb3IgKGkgPSBtYXJrZXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CgkJCW1ldGhvZC5jYWxsKGNvbnRleHQsIG1hcmtlcnNbaV0pOwoJCX0KCgkJdGhpcy5fbm9uUG9pbnRHcm91cC5lYWNoTGF5ZXIobWV0aG9kLCBjb250ZXh0KTsKCX0sCgoJLy9PdmVycmlkZXMgTGF5ZXJHcm91cC5nZXRMYXllcnMKCWdldExheWVyczogZnVuY3Rpb24gKCkgewoJCXZhciBsYXllcnMgPSBbXTsKCQl0aGlzLmVhY2hMYXllcihmdW5jdGlvbiAobCkgewoJCQlsYXllcnMucHVzaChsKTsKCQl9KTsKCQlyZXR1cm4gbGF5ZXJzOwoJfSwKCgkvL092ZXJyaWRlcyBMYXllckdyb3VwLmdldExheWVyLCBXQVJOSU5HOiBSZWFsbHkgYmFkIHBlcmZvcm1hbmNlCglnZXRMYXllcjogZnVuY3Rpb24gKGlkKSB7CgkJdmFyIHJlc3VsdCA9IG51bGw7CgoJCXRoaXMuZWFjaExheWVyKGZ1bmN0aW9uIChsKSB7CgkJCWlmIChMLnN0YW1wKGwpID09PSBpZCkgewoJCQkJcmVzdWx0ID0gbDsKCQkJfQoJCX0pOwoKCQlyZXR1cm4gcmVzdWx0OwoJfSwKCgkvL1JldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gbGF5ZXIgaXMgaW4gdGhpcyBNYXJrZXJDbHVzdGVyR3JvdXAKCWhhc0xheWVyOiBmdW5jdGlvbiAobGF5ZXIpIHsKCQlpZiAoIWxheWVyKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCXZhciBpLCBhbkFycmF5ID0gdGhpcy5fbmVlZHNDbHVzdGVyaW5nOwoKCQlmb3IgKGkgPSBhbkFycmF5Lmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CgkJCWlmIChhbkFycmF5W2ldID09PSBsYXllcikgewoJCQkJcmV0dXJuIHRydWU7CgkJCX0KCQl9CgoJCWFuQXJyYXkgPSB0aGlzLl9uZWVkc1JlbW92aW5nOwoJCWZvciAoaSA9IGFuQXJyYXkubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKCQkJaWYgKGFuQXJyYXlbaV0gPT09IGxheWVyKSB7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQl9CgoJCXJldHVybiAhIShsYXllci5fX3BhcmVudCAmJiBsYXllci5fX3BhcmVudC5fZ3JvdXAgPT09IHRoaXMpIHx8IHRoaXMuX25vblBvaW50R3JvdXAuaGFzTGF5ZXIobGF5ZXIpOwoJfSwKCgkvL1pvb20gZG93biB0byBzaG93IHRoZSBnaXZlbiBsYXllciAoc3BpZGVyZnlpbmcgaWYgbmVjZXNzYXJ5KSB0aGVuIGNhbGxzIHRoZSBjYWxsYmFjawoJem9vbVRvU2hvd0xheWVyOiBmdW5jdGlvbiAobGF5ZXIsIGNhbGxiYWNrKSB7CgoJCXZhciBzaG93TWFya2VyID0gZnVuY3Rpb24gKCkgewoJCQlpZiAoKGxheWVyLl9pY29uIHx8IGxheWVyLl9fcGFyZW50Ll9pY29uKSAmJiAhdGhpcy5faW5ab29tQW5pbWF0aW9uKSB7CgkJCQl0aGlzLl9tYXAub2ZmKCdtb3ZlZW5kJywgc2hvd01hcmtlciwgdGhpcyk7CgkJCQl0aGlzLm9mZignYW5pbWF0aW9uZW5kJywgc2hvd01hcmtlciwgdGhpcyk7CgoJCQkJaWYgKGxheWVyLl9pY29uKSB7CgkJCQkJY2FsbGJhY2soKTsKCQkJCX0gZWxzZSBpZiAobGF5ZXIuX19wYXJlbnQuX2ljb24pIHsKCQkJCQl2YXIgYWZ0ZXJTcGlkZXJmeSA9IGZ1bmN0aW9uICgpIHsKCQkJCQkJdGhpcy5vZmYoJ3NwaWRlcmZpZWQnLCBhZnRlclNwaWRlcmZ5LCB0aGlzKTsKCQkJCQkJY2FsbGJhY2soKTsKCQkJCQl9OwoKCQkJCQl0aGlzLm9uKCdzcGlkZXJmaWVkJywgYWZ0ZXJTcGlkZXJmeSwgdGhpcyk7CgkJCQkJbGF5ZXIuX19wYXJlbnQuc3BpZGVyZnkoKTsKCQkJCX0KCQkJfQoJCX07CgoJCWlmIChsYXllci5faWNvbiAmJiB0aGlzLl9tYXAuZ2V0Qm91bmRzKCkuY29udGFpbnMobGF5ZXIuZ2V0TGF0TG5nKCkpKSB7CgkJCWNhbGxiYWNrKCk7CgkJfSBlbHNlIGlmIChsYXllci5fX3BhcmVudC5fem9vbSA8IHRoaXMuX21hcC5nZXRab29tKCkpIHsKCQkJLy9MYXllciBzaG91bGQgYmUgdmlzaWJsZSBub3cgYnV0IGlzbid0IG9uIHNjcmVlbiwganVzdCBwYW4gb3ZlciB0byBpdAoJCQl0aGlzLl9tYXAub24oJ21vdmVlbmQnLCBzaG93TWFya2VyLCB0aGlzKTsKCQkJdGhpcy5fbWFwLnBhblRvKGxheWVyLmdldExhdExuZygpKTsKCQl9IGVsc2UgewoJCQl0aGlzLl9tYXAub24oJ21vdmVlbmQnLCBzaG93TWFya2VyLCB0aGlzKTsKCQkJdGhpcy5vbignYW5pbWF0aW9uZW5kJywgc2hvd01hcmtlciwgdGhpcyk7CgkJCXRoaXMuX21hcC5zZXRWaWV3KGxheWVyLmdldExhdExuZygpLCBsYXllci5fX3BhcmVudC5fem9vbSArIDEpOwoJCQlsYXllci5fX3BhcmVudC56b29tVG9Cb3VuZHMoKTsKCQl9Cgl9LAoKCS8vT3ZlcnJpZGVzIEZlYXR1cmVHcm91cC5vbkFkZAoJb25BZGQ6IGZ1bmN0aW9uIChtYXApIHsKCQl0aGlzLl9tYXAgPSBtYXA7CgkJdmFyIGksIGwsIGxheWVyOwoKCQlpZiAoIWlzRmluaXRlKHRoaXMuX21hcC5nZXRNYXhab29tKCkpKSB7CgkJCXRocm93ICJNYXAgaGFzIG5vIG1heFpvb20gc3BlY2lmaWVkIjsKCQl9CgoJCXRoaXMuX2ZlYXR1cmVHcm91cC5vbkFkZChtYXApOwoJCXRoaXMuX25vblBvaW50R3JvdXAub25BZGQobWFwKTsKCgkJaWYgKCF0aGlzLl9ncmlkQ2x1c3RlcnMpIHsKCQkJdGhpcy5fZ2VuZXJhdGVJbml0aWFsQ2x1c3RlcnMoKTsKCQl9CgoJCWZvciAoaSA9IDAsIGwgPSB0aGlzLl9uZWVkc1JlbW92aW5nLmxlbmd0aDsgaSA8IGw7IGkrKykgewoJCQlsYXllciA9IHRoaXMuX25lZWRzUmVtb3ZpbmdbaV07CgkJCXRoaXMuX3JlbW92ZUxheWVyKGxheWVyLCB0cnVlKTsKCQl9CgkJdGhpcy5fbmVlZHNSZW1vdmluZyA9IFtdOwoKCQlmb3IgKGkgPSAwLCBsID0gdGhpcy5fbmVlZHNDbHVzdGVyaW5nLmxlbmd0aDsgaSA8IGw7IGkrKykgewoJCQlsYXllciA9IHRoaXMuX25lZWRzQ2x1c3RlcmluZ1tpXTsKCgkJCS8vSWYgdGhlIGxheWVyIGRvZXNuJ3QgaGF2ZSBhIGdldExhdExuZyB0aGVuIHdlIGNhbid0IGNsdXN0ZXIgaXQsIHNvIGFkZCBpdCB0byBvdXIgY2hpbGQgZmVhdHVyZUdyb3VwCgkJCWlmICghbGF5ZXIuZ2V0TGF0TG5nKSB7CgkJCQl0aGlzLl9mZWF0dXJlR3JvdXAuYWRkTGF5ZXIobGF5ZXIpOwoJCQkJY29udGludWU7CgkJCX0KCgoJCQlpZiAobGF5ZXIuX19wYXJlbnQpIHsKCQkJCWNvbnRpbnVlOwoJCQl9CgkJCXRoaXMuX2FkZExheWVyKGxheWVyLCB0aGlzLl9tYXhab29tKTsKCQl9CgkJdGhpcy5fbmVlZHNDbHVzdGVyaW5nID0gW107CgoKCQl0aGlzLl9tYXAub24oJ3pvb21lbmQnLCB0aGlzLl96b29tRW5kLCB0aGlzKTsKCQl0aGlzLl9tYXAub24oJ21vdmVlbmQnLCB0aGlzLl9tb3ZlRW5kLCB0aGlzKTsKCgkJaWYgKHRoaXMuX3NwaWRlcmZpZXJPbkFkZCkgeyAvL1RPRE8gRklYTUU6IE5vdCBzdXJlIGhvdyB0byBoYXZlIHNwaWRlcmZpZXIgYWRkIHNvbWV0aGluZyBvbiBoZXJlIG5pY2VseQoJCQl0aGlzLl9zcGlkZXJmaWVyT25BZGQoKTsKCQl9CgoJCXRoaXMuX2JpbmRFdmVudHMoKTsKCgoJCS8vQWN0dWFsbHkgYWRkIG91ciBtYXJrZXJzIHRvIHRoZSBtYXA6CgoJCS8vUmVtZW1iZXIgdGhlIGN1cnJlbnQgem9vbSBsZXZlbCBhbmQgYm91bmRzCgkJdGhpcy5fem9vbSA9IHRoaXMuX21hcC5nZXRab29tKCk7CgkJdGhpcy5fY3VycmVudFNob3duQm91bmRzID0gdGhpcy5fZ2V0RXhwYW5kZWRWaXNpYmxlQm91bmRzKCk7CgoJCS8vTWFrZSB0aGluZ3MgYXBwZWFyIG9uIHRoZSBtYXAKCQl0aGlzLl90b3BDbHVzdGVyTGV2ZWwuX3JlY3Vyc2l2ZWx5QWRkQ2hpbGRyZW5Ub01hcChudWxsLCB0aGlzLl96b29tLCB0aGlzLl9jdXJyZW50U2hvd25Cb3VuZHMpOwoJfSwKCgkvL092ZXJyaWRlcyBGZWF0dXJlR3JvdXAub25SZW1vdmUKCW9uUmVtb3ZlOiBmdW5jdGlvbiAobWFwKSB7CgkJbWFwLm9mZignem9vbWVuZCcsIHRoaXMuX3pvb21FbmQsIHRoaXMpOwoJCW1hcC5vZmYoJ21vdmVlbmQnLCB0aGlzLl9tb3ZlRW5kLCB0aGlzKTsKCgkJdGhpcy5fdW5iaW5kRXZlbnRzKCk7CgoJCS8vSW4gY2FzZSB3ZSBhcmUgaW4gYSBjbHVzdGVyIGFuaW1hdGlvbgoJCXRoaXMuX21hcC5fbWFwUGFuZS5jbGFzc05hbWUgPSB0aGlzLl9tYXAuX21hcFBhbmUuY2xhc3NOYW1lLnJlcGxhY2UoJyBsZWFmbGV0LWNsdXN0ZXItYW5pbScsICcnKTsKCgkJaWYgKHRoaXMuX3NwaWRlcmZpZXJPblJlbW92ZSkgeyAvL1RPRE8gRklYTUU6IE5vdCBzdXJlIGhvdyB0byBoYXZlIHNwaWRlcmZpZXIgYWRkIHNvbWV0aGluZyBvbiBoZXJlIG5pY2VseQoJCQl0aGlzLl9zcGlkZXJmaWVyT25SZW1vdmUoKTsKCQl9CgoKCgkJLy9DbGVhbiB1cCBhbGwgdGhlIGxheWVycyB3ZSBhZGRlZCB0byB0aGUgbWFwCgkJdGhpcy5faGlkZUNvdmVyYWdlKCk7CgkJdGhpcy5fZmVhdHVyZUdyb3VwLm9uUmVtb3ZlKG1hcCk7CgkJdGhpcy5fbm9uUG9pbnRHcm91cC5vblJlbW92ZShtYXApOwoKCQl0aGlzLl9mZWF0dXJlR3JvdXAuY2xlYXJMYXllcnMoKTsKCgkJdGhpcy5fbWFwID0gbnVsbDsKCX0sCgoJZ2V0VmlzaWJsZVBhcmVudDogZnVuY3Rpb24gKG1hcmtlcikgewoJCXZhciB2TWFya2VyID0gbWFya2VyOwoJCXdoaWxlICh2TWFya2VyICYmICF2TWFya2VyLl9pY29uKSB7CgkJCXZNYXJrZXIgPSB2TWFya2VyLl9fcGFyZW50OwoJCX0KCQlyZXR1cm4gdk1hcmtlciB8fCBudWxsOwoJfSwKCgkvL1JlbW92ZSB0aGUgZ2l2ZW4gb2JqZWN0IGZyb20gdGhlIGdpdmVuIGFycmF5CglfYXJyYXlTcGxpY2U6IGZ1bmN0aW9uIChhbkFycmF5LCBvYmopIHsKCQlmb3IgKHZhciBpID0gYW5BcnJheS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewoJCQlpZiAoYW5BcnJheVtpXSA9PT0gb2JqKSB7CgkJCQlhbkFycmF5LnNwbGljZShpLCAxKTsKCQkJCXJldHVybiB0cnVlOwoJCQl9CgkJfQoJfSwKCgkvL0ludGVybmFsIGZ1bmN0aW9uIGZvciByZW1vdmluZyBhIG1hcmtlciBmcm9tIGV2ZXJ5dGhpbmcuCgkvL2RvbnRVcGRhdGVNYXA6IHNldCB0byB0cnVlIGlmIHlvdSB3aWxsIGhhbmRsZSB1cGRhdGluZyB0aGUgbWFwIG1hbnVhbGx5IChmb3IgYnVsayBmdW5jdGlvbnMpCglfcmVtb3ZlTGF5ZXI6IGZ1bmN0aW9uIChtYXJrZXIsIHJlbW92ZUZyb21EaXN0YW5jZUdyaWQsIGRvbnRVcGRhdGVNYXApIHsKCQl2YXIgZ3JpZENsdXN0ZXJzID0gdGhpcy5fZ3JpZENsdXN0ZXJzLAoJCQlncmlkVW5jbHVzdGVyZWQgPSB0aGlzLl9ncmlkVW5jbHVzdGVyZWQsCgkJCWZnID0gdGhpcy5fZmVhdHVyZUdyb3VwLAoJCQltYXAgPSB0aGlzLl9tYXA7CgoJCS8vUmVtb3ZlIHRoZSBtYXJrZXIgZnJvbSBkaXN0YW5jZSBjbHVzdGVycyBpdCBtaWdodCBiZSBpbgoJCWlmIChyZW1vdmVGcm9tRGlzdGFuY2VHcmlkKSB7CgkJCWZvciAodmFyIHogPSB0aGlzLl9tYXhab29tOyB6ID49IDA7IHotLSkgewoJCQkJaWYgKCFncmlkVW5jbHVzdGVyZWRbel0ucmVtb3ZlT2JqZWN0KG1hcmtlciwgbWFwLnByb2plY3QobWFya2VyLmdldExhdExuZygpLCB6KSkpIHsKCQkJCQlicmVhazsKCQkJCX0KCQkJfQoJCX0KCgkJLy9Xb3JrIG91ciB3YXkgdXAgdGhlIGNsdXN0ZXJzIHJlbW92aW5nIHRoZW0gYXMgd2UgZ28gaWYgcmVxdWlyZWQKCQl2YXIgY2x1c3RlciA9IG1hcmtlci5fX3BhcmVudCwKCQkJbWFya2VycyA9IGNsdXN0ZXIuX21hcmtlcnMsCgkJCW90aGVyTWFya2VyOwoKCQkvL1JlbW92ZSB0aGUgbWFya2VyIGZyb20gdGhlIGltbWVkaWF0ZSBwYXJlbnRzIG1hcmtlciBsaXN0CgkJdGhpcy5fYXJyYXlTcGxpY2UobWFya2VycywgbWFya2VyKTsKCgkJd2hpbGUgKGNsdXN0ZXIpIHsKCQkJY2x1c3Rlci5fY2hpbGRDb3VudC0tOwoKCQkJaWYgKGNsdXN0ZXIuX3pvb20gPCAwKSB7CgkJCQkvL1RvcCBsZXZlbCwgZG8gbm90aGluZwoJCQkJYnJlYWs7CgkJCX0gZWxzZSBpZiAocmVtb3ZlRnJvbURpc3RhbmNlR3JpZCAmJiBjbHVzdGVyLl9jaGlsZENvdW50IDw9IDEpIHsgLy9DbHVzdGVyIG5vIGxvbmdlciByZXF1aXJlZAoJCQkJLy9XZSBuZWVkIHRvIHB1c2ggdGhlIG90aGVyIG1hcmtlciB1cCB0byB0aGUgcGFyZW50CgkJCQlvdGhlck1hcmtlciA9IGNsdXN0ZXIuX21hcmtlcnNbMF0gPT09IG1hcmtlciA/IGNsdXN0ZXIuX21hcmtlcnNbMV0gOiBjbHVzdGVyLl9tYXJrZXJzWzBdOwoKCQkJCS8vVXBkYXRlIGRpc3RhbmNlIGdyaWQKCQkJCWdyaWRDbHVzdGVyc1tjbHVzdGVyLl96b29tXS5yZW1vdmVPYmplY3QoY2x1c3RlciwgbWFwLnByb2plY3QoY2x1c3Rlci5fY0xhdExuZywgY2x1c3Rlci5fem9vbSkpOwoJCQkJZ3JpZFVuY2x1c3RlcmVkW2NsdXN0ZXIuX3pvb21dLmFkZE9iamVjdChvdGhlck1hcmtlciwgbWFwLnByb2plY3Qob3RoZXJNYXJrZXIuZ2V0TGF0TG5nKCksIGNsdXN0ZXIuX3pvb20pKTsKCgkJCQkvL01vdmUgb3RoZXJNYXJrZXIgdXAgdG8gcGFyZW50CgkJCQl0aGlzLl9hcnJheVNwbGljZShjbHVzdGVyLl9fcGFyZW50Ll9jaGlsZENsdXN0ZXJzLCBjbHVzdGVyKTsKCQkJCWNsdXN0ZXIuX19wYXJlbnQuX21hcmtlcnMucHVzaChvdGhlck1hcmtlcik7CgkJCQlvdGhlck1hcmtlci5fX3BhcmVudCA9IGNsdXN0ZXIuX19wYXJlbnQ7CgoJCQkJaWYgKGNsdXN0ZXIuX2ljb24pIHsKCQkJCQkvL0NsdXN0ZXIgaXMgY3VycmVudGx5IG9uIHRoZSBtYXAsIG5lZWQgdG8gcHV0IHRoZSBtYXJrZXIgb24gdGhlIG1hcCBpbnN0ZWFkCgkJCQkJZmcucmVtb3ZlTGF5ZXIoY2x1c3Rlcik7CgkJCQkJaWYgKCFkb250VXBkYXRlTWFwKSB7CgkJCQkJCWZnLmFkZExheWVyKG90aGVyTWFya2VyKTsKCQkJCQl9CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQljbHVzdGVyLl9yZWNhbGN1bGF0ZUJvdW5kcygpOwoJCQkJaWYgKCFkb250VXBkYXRlTWFwIHx8ICFjbHVzdGVyLl9pY29uKSB7CgkJCQkJY2x1c3Rlci5fdXBkYXRlSWNvbigpOwoJCQkJfQoJCQl9CgoJCQljbHVzdGVyID0gY2x1c3Rlci5fX3BhcmVudDsKCQl9CgoJCWRlbGV0ZSBtYXJrZXIuX19wYXJlbnQ7Cgl9LAoKCV9pc09ySXNQYXJlbnQ6IGZ1bmN0aW9uIChlbCwgb2VsKSB7CgkJd2hpbGUgKG9lbCkgewoJCQlpZiAoZWwgPT09IG9lbCkgewoJCQkJcmV0dXJuIHRydWU7CgkJCX0KCQkJb2VsID0gb2VsLnBhcmVudE5vZGU7CgkJfQoJCXJldHVybiBmYWxzZTsKCX0sCgoJX3Byb3BhZ2F0ZUV2ZW50OiBmdW5jdGlvbiAoZSkgewoJCWlmIChlLmxheWVyIGluc3RhbmNlb2YgTC5NYXJrZXJDbHVzdGVyKSB7CgkJCS8vUHJldmVudCBtdWx0aXBsZSBjbHVzdGVybW91c2VvdmVyL29mZiBldmVudHMgaWYgdGhlIGljb24gaXMgbWFkZSB1cCBvZiBzdGFja2VkIGRpdnMgKERvZXNuJ3Qgd29yayBpbiBpZSA8PSA4LCBubyByZWxhdGVkVGFyZ2V0KQoJCQlpZiAoZS5vcmlnaW5hbEV2ZW50ICYmIHRoaXMuX2lzT3JJc1BhcmVudChlLmxheWVyLl9pY29uLCBlLm9yaWdpbmFsRXZlbnQucmVsYXRlZFRhcmdldCkpIHsKCQkJCXJldHVybjsKCQkJfQoJCQllLnR5cGUgPSAnY2x1c3RlcicgKyBlLnR5cGU7CgkJfQoKCQl0aGlzLmZpcmUoZS50eXBlLCBlKTsKCX0sCgoJLy9EZWZhdWx0IGZ1bmN0aW9uYWxpdHkKCV9kZWZhdWx0SWNvbkNyZWF0ZUZ1bmN0aW9uOiBmdW5jdGlvbiAoY2x1c3RlcikgewoJCXZhciBjaGlsZENvdW50ID0gY2x1c3Rlci5nZXRDaGlsZENvdW50KCk7CgoJCXZhciBjID0gJyBtYXJrZXItY2x1c3Rlci0nOwoJCWlmIChjaGlsZENvdW50IDwgMTApIHsKCQkJYyArPSAnc21hbGwnOwoJCX0gZWxzZSBpZiAoY2hpbGRDb3VudCA8IDEwMCkgewoJCQljICs9ICdtZWRpdW0nOwoJCX0gZWxzZSB7CgkJCWMgKz0gJ2xhcmdlJzsKCQl9CgoJCXJldHVybiBuZXcgTC5EaXZJY29uKHsgaHRtbDogJzxkaXY+PHNwYW4+JyArIGNoaWxkQ291bnQgKyAnPC9zcGFuPjwvZGl2PicsIGNsYXNzTmFtZTogJ21hcmtlci1jbHVzdGVyJyArIGMsIGljb25TaXplOiBuZXcgTC5Qb2ludCg0MCwgNDApIH0pOwoJfSwKCglfYmluZEV2ZW50czogZnVuY3Rpb24gKCkgewoJCXZhciBtYXAgPSB0aGlzLl9tYXAsCgkJICAgIHNwaWRlcmZ5T25NYXhab29tID0gdGhpcy5vcHRpb25zLnNwaWRlcmZ5T25NYXhab29tLAoJCSAgICBzaG93Q292ZXJhZ2VPbkhvdmVyID0gdGhpcy5vcHRpb25zLnNob3dDb3ZlcmFnZU9uSG92ZXIsCgkJICAgIHpvb21Ub0JvdW5kc09uQ2xpY2sgPSB0aGlzLm9wdGlvbnMuem9vbVRvQm91bmRzT25DbGljazsKCgkJLy9ab29tIG9uIGNsdXN0ZXIgY2xpY2sgb3Igc3BpZGVyZnkgaWYgd2UgYXJlIGF0IHRoZSBsb3dlc3QgbGV2ZWwKCQlpZiAoc3BpZGVyZnlPbk1heFpvb20gfHwgem9vbVRvQm91bmRzT25DbGljaykgewoJCQl0aGlzLm9uKCdjbHVzdGVyY2xpY2snLCB0aGlzLl96b29tT3JTcGlkZXJmeSwgdGhpcyk7CgkJfQoKCQkvL1Nob3cgY29udmV4IGh1bGwgKGJvdW5kYXJ5KSBwb2x5Z29uIG9uIG1vdXNlIG92ZXIKCQlpZiAoc2hvd0NvdmVyYWdlT25Ib3ZlcikgewoJCQl0aGlzLm9uKCdjbHVzdGVybW91c2VvdmVyJywgdGhpcy5fc2hvd0NvdmVyYWdlLCB0aGlzKTsKCQkJdGhpcy5vbignY2x1c3Rlcm1vdXNlb3V0JywgdGhpcy5faGlkZUNvdmVyYWdlLCB0aGlzKTsKCQkJbWFwLm9uKCd6b29tZW5kJywgdGhpcy5faGlkZUNvdmVyYWdlLCB0aGlzKTsKCQl9Cgl9LAoKCV96b29tT3JTcGlkZXJmeTogZnVuY3Rpb24gKGUpIHsKCQl2YXIgbWFwID0gdGhpcy5fbWFwOwoJCWlmIChtYXAuZ2V0TWF4Wm9vbSgpID09PSBtYXAuZ2V0Wm9vbSgpKSB7CgkJCWlmICh0aGlzLm9wdGlvbnMuc3BpZGVyZnlPbk1heFpvb20pIHsKCQkJCWUubGF5ZXIuc3BpZGVyZnkoKTsKCQkJfQoJCX0gZWxzZSBpZiAodGhpcy5vcHRpb25zLnpvb21Ub0JvdW5kc09uQ2xpY2spIHsKCQkJZS5sYXllci56b29tVG9Cb3VuZHMoKTsKCQl9CgogICAgLy8gRm9jdXMgdGhlIG1hcCBhZ2FpbiBmb3Iga2V5Ym9hcmQgdXNlcnMuCgkJaWYgKGUub3JpZ2luYWxFdmVudCAmJiBlLm9yaWdpbmFsRXZlbnQua2V5Q29kZSA9PT0gMTMpIHsKCQkJbWFwLl9jb250YWluZXIuZm9jdXMoKTsKCQl9Cgl9LAoKCV9zaG93Q292ZXJhZ2U6IGZ1bmN0aW9uIChlKSB7CgkJdmFyIG1hcCA9IHRoaXMuX21hcDsKCQlpZiAodGhpcy5faW5ab29tQW5pbWF0aW9uKSB7CgkJCXJldHVybjsKCQl9CgkJaWYgKHRoaXMuX3Nob3duUG9seWdvbikgewoJCQltYXAucmVtb3ZlTGF5ZXIodGhpcy5fc2hvd25Qb2x5Z29uKTsKCQl9CgkJaWYgKGUubGF5ZXIuZ2V0Q2hpbGRDb3VudCgpID4gMiAmJiBlLmxheWVyICE9PSB0aGlzLl9zcGlkZXJmaWVkKSB7CgkJCXRoaXMuX3Nob3duUG9seWdvbiA9IG5ldyBMLlBvbHlnb24oZS5sYXllci5nZXRDb252ZXhIdWxsKCksIHRoaXMub3B0aW9ucy5wb2x5Z29uT3B0aW9ucyk7CgkJCW1hcC5hZGRMYXllcih0aGlzLl9zaG93blBvbHlnb24pOwoJCX0KCX0sCgoJX2hpZGVDb3ZlcmFnZTogZnVuY3Rpb24gKCkgewoJCWlmICh0aGlzLl9zaG93blBvbHlnb24pIHsKCQkJdGhpcy5fbWFwLnJlbW92ZUxheWVyKHRoaXMuX3Nob3duUG9seWdvbik7CgkJCXRoaXMuX3Nob3duUG9seWdvbiA9IG51bGw7CgkJfQoJfSwKCglfdW5iaW5kRXZlbnRzOiBmdW5jdGlvbiAoKSB7CgkJdmFyIHNwaWRlcmZ5T25NYXhab29tID0gdGhpcy5vcHRpb25zLnNwaWRlcmZ5T25NYXhab29tLAoJCQlzaG93Q292ZXJhZ2VPbkhvdmVyID0gdGhpcy5vcHRpb25zLnNob3dDb3ZlcmFnZU9uSG92ZXIsCgkJCXpvb21Ub0JvdW5kc09uQ2xpY2sgPSB0aGlzLm9wdGlvbnMuem9vbVRvQm91bmRzT25DbGljaywKCQkJbWFwID0gdGhpcy5fbWFwOwoKCQlpZiAoc3BpZGVyZnlPbk1heFpvb20gfHwgem9vbVRvQm91bmRzT25DbGljaykgewoJCQl0aGlzLm9mZignY2x1c3RlcmNsaWNrJywgdGhpcy5fem9vbU9yU3BpZGVyZnksIHRoaXMpOwoJCX0KCQlpZiAoc2hvd0NvdmVyYWdlT25Ib3ZlcikgewoJCQl0aGlzLm9mZignY2x1c3Rlcm1vdXNlb3ZlcicsIHRoaXMuX3Nob3dDb3ZlcmFnZSwgdGhpcyk7CgkJCXRoaXMub2ZmKCdjbHVzdGVybW91c2VvdXQnLCB0aGlzLl9oaWRlQ292ZXJhZ2UsIHRoaXMpOwoJCQltYXAub2ZmKCd6b29tZW5kJywgdGhpcy5faGlkZUNvdmVyYWdlLCB0aGlzKTsKCQl9Cgl9LAoKCV96b29tRW5kOiBmdW5jdGlvbiAoKSB7CgkJaWYgKCF0aGlzLl9tYXApIHsgLy9NYXkgaGF2ZSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgbWFwIGJ5IGEgem9vbUVuZCBoYW5kbGVyCgkJCXJldHVybjsKCQl9CgkJdGhpcy5fbWVyZ2VTcGxpdENsdXN0ZXJzKCk7CgoJCXRoaXMuX3pvb20gPSB0aGlzLl9tYXAuX3pvb207CgkJdGhpcy5fY3VycmVudFNob3duQm91bmRzID0gdGhpcy5fZ2V0RXhwYW5kZWRWaXNpYmxlQm91bmRzKCk7Cgl9LAoKCV9tb3ZlRW5kOiBmdW5jdGlvbiAoKSB7CgkJaWYgKHRoaXMuX2luWm9vbUFuaW1hdGlvbikgewoJCQlyZXR1cm47CgkJfQoKCQl2YXIgbmV3Qm91bmRzID0gdGhpcy5fZ2V0RXhwYW5kZWRWaXNpYmxlQm91bmRzKCk7CgoJCXRoaXMuX3RvcENsdXN0ZXJMZXZlbC5fcmVjdXJzaXZlbHlSZW1vdmVDaGlsZHJlbkZyb21NYXAodGhpcy5fY3VycmVudFNob3duQm91bmRzLCB0aGlzLl96b29tLCBuZXdCb3VuZHMpOwoJCXRoaXMuX3RvcENsdXN0ZXJMZXZlbC5fcmVjdXJzaXZlbHlBZGRDaGlsZHJlblRvTWFwKG51bGwsIHRoaXMuX21hcC5fem9vbSwgbmV3Qm91bmRzKTsKCgkJdGhpcy5fY3VycmVudFNob3duQm91bmRzID0gbmV3Qm91bmRzOwoJCXJldHVybjsKCX0sCgoJX2dlbmVyYXRlSW5pdGlhbENsdXN0ZXJzOiBmdW5jdGlvbiAoKSB7CgkJdmFyIG1heFpvb20gPSB0aGlzLl9tYXAuZ2V0TWF4Wm9vbSgpLAoJCQlyYWRpdXMgPSB0aGlzLm9wdGlvbnMubWF4Q2x1c3RlclJhZGl1czsKCgkJaWYgKHRoaXMub3B0aW9ucy5kaXNhYmxlQ2x1c3RlcmluZ0F0Wm9vbSkgewoJCQltYXhab29tID0gdGhpcy5vcHRpb25zLmRpc2FibGVDbHVzdGVyaW5nQXRab29tIC0gMTsKCQl9CgkJdGhpcy5fbWF4Wm9vbSA9IG1heFpvb207CgkJdGhpcy5fZ3JpZENsdXN0ZXJzID0ge307CgkJdGhpcy5fZ3JpZFVuY2x1c3RlcmVkID0ge307CgoJCS8vU2V0IHVwIERpc3RhbmNlR3JpZHMgZm9yIGVhY2ggem9vbQoJCWZvciAodmFyIHpvb20gPSBtYXhab29tOyB6b29tID49IDA7IHpvb20tLSkgewoJCQl0aGlzLl9ncmlkQ2x1c3RlcnNbem9vbV0gPSBuZXcgTC5EaXN0YW5jZUdyaWQocmFkaXVzKTsKCQkJdGhpcy5fZ3JpZFVuY2x1c3RlcmVkW3pvb21dID0gbmV3IEwuRGlzdGFuY2VHcmlkKHJhZGl1cyk7CgkJfQoKCQl0aGlzLl90b3BDbHVzdGVyTGV2ZWwgPSBuZXcgTC5NYXJrZXJDbHVzdGVyKHRoaXMsIC0xKTsKCX0sCgoJLy9ab29tOiBab29tIHRvIHN0YXJ0IGFkZGluZyBhdCAoUGFzcyB0aGlzLl9tYXhab29tIHRvIHN0YXJ0IGF0IHRoZSBib3R0b20pCglfYWRkTGF5ZXI6IGZ1bmN0aW9uIChsYXllciwgem9vbSkgewoJCXZhciBncmlkQ2x1c3RlcnMgPSB0aGlzLl9ncmlkQ2x1c3RlcnMsCgkJICAgIGdyaWRVbmNsdXN0ZXJlZCA9IHRoaXMuX2dyaWRVbmNsdXN0ZXJlZCwKCQkgICAgbWFya2VyUG9pbnQsIHo7CgoJCWlmICh0aGlzLm9wdGlvbnMuc2luZ2xlTWFya2VyTW9kZSkgewoJCQlsYXllci5vcHRpb25zLmljb24gPSB0aGlzLm9wdGlvbnMuaWNvbkNyZWF0ZUZ1bmN0aW9uKHsKCQkJCWdldENoaWxkQ291bnQ6IGZ1bmN0aW9uICgpIHsKCQkJCQlyZXR1cm4gMTsKCQkJCX0sCgkJCQlnZXRBbGxDaGlsZE1hcmtlcnM6IGZ1bmN0aW9uICgpIHsKCQkJCQlyZXR1cm4gW2xheWVyXTsKCQkJCX0KCQkJfSk7CgkJfQoKCQkvL0ZpbmQgdGhlIGxvd2VzdCB6b29tIGxldmVsIHRvIHNsb3QgdGhpcyBvbmUgaW4KCQlmb3IgKDsgem9vbSA+PSAwOyB6b29tLS0pIHsKCQkJbWFya2VyUG9pbnQgPSB0aGlzLl9tYXAucHJvamVjdChsYXllci5nZXRMYXRMbmcoKSwgem9vbSk7IC8vIGNhbGN1bGF0ZSBwaXhlbCBwb3NpdGlvbgoKCQkJLy9UcnkgZmluZCBhIGNsdXN0ZXIgY2xvc2UgYnkKCQkJdmFyIGNsb3Nlc3QgPSBncmlkQ2x1c3RlcnNbem9vbV0uZ2V0TmVhck9iamVjdChtYXJrZXJQb2ludCk7CgkJCWlmIChjbG9zZXN0KSB7CgkJCQljbG9zZXN0Ll9hZGRDaGlsZChsYXllcik7CgkJCQlsYXllci5fX3BhcmVudCA9IGNsb3Nlc3Q7CgkJCQlyZXR1cm47CgkJCX0KCgkJCS8vVHJ5IGZpbmQgYSBtYXJrZXIgY2xvc2UgYnkgdG8gZm9ybSBhIG5ldyBjbHVzdGVyIHdpdGgKCQkJY2xvc2VzdCA9IGdyaWRVbmNsdXN0ZXJlZFt6b29tXS5nZXROZWFyT2JqZWN0KG1hcmtlclBvaW50KTsKCQkJaWYgKGNsb3Nlc3QpIHsKCQkJCXZhciBwYXJlbnQgPSBjbG9zZXN0Ll9fcGFyZW50OwoJCQkJaWYgKHBhcmVudCkgewoJCQkJCXRoaXMuX3JlbW92ZUxheWVyKGNsb3Nlc3QsIGZhbHNlKTsKCQkJCX0KCgkJCQkvL0NyZWF0ZSBuZXcgY2x1c3RlciB3aXRoIHRoZXNlIDIgaW4gaXQKCgkJCQl2YXIgbmV3Q2x1c3RlciA9IG5ldyBMLk1hcmtlckNsdXN0ZXIodGhpcywgem9vbSwgY2xvc2VzdCwgbGF5ZXIpOwoJCQkJZ3JpZENsdXN0ZXJzW3pvb21dLmFkZE9iamVjdChuZXdDbHVzdGVyLCB0aGlzLl9tYXAucHJvamVjdChuZXdDbHVzdGVyLl9jTGF0TG5nLCB6b29tKSk7CgkJCQljbG9zZXN0Ll9fcGFyZW50ID0gbmV3Q2x1c3RlcjsKCQkJCWxheWVyLl9fcGFyZW50ID0gbmV3Q2x1c3RlcjsKCgkJCQkvL0ZpcnN0IGNyZWF0ZSBhbnkgbmV3IGludGVybWVkaWF0ZSBwYXJlbnQgY2x1c3RlcnMgdGhhdCBkb24ndCBleGlzdAoJCQkJdmFyIGxhc3RQYXJlbnQgPSBuZXdDbHVzdGVyOwoJCQkJZm9yICh6ID0gem9vbSAtIDE7IHogPiBwYXJlbnQuX3pvb207IHotLSkgewoJCQkJCWxhc3RQYXJlbnQgPSBuZXcgTC5NYXJrZXJDbHVzdGVyKHRoaXMsIHosIGxhc3RQYXJlbnQpOwoJCQkJCWdyaWRDbHVzdGVyc1t6XS5hZGRPYmplY3QobGFzdFBhcmVudCwgdGhpcy5fbWFwLnByb2plY3QoY2xvc2VzdC5nZXRMYXRMbmcoKSwgeikpOwoJCQkJfQoJCQkJcGFyZW50Ll9hZGRDaGlsZChsYXN0UGFyZW50KTsKCgkJCQkvL1JlbW92ZSBjbG9zZXN0IGZyb20gdGhpcyB6b29tIGxldmVsIGFuZCBhbnkgYWJvdmUgdGhhdCBpdCBpcyBpbiwgcmVwbGFjZSB3aXRoIG5ld0NsdXN0ZXIKCQkJCWZvciAoeiA9IHpvb207IHogPj0gMDsgei0tKSB7CgkJCQkJaWYgKCFncmlkVW5jbHVzdGVyZWRbel0ucmVtb3ZlT2JqZWN0KGNsb3Nlc3QsIHRoaXMuX21hcC5wcm9qZWN0KGNsb3Nlc3QuZ2V0TGF0TG5nKCksIHopKSkgewoJCQkJCQlicmVhazsKCQkJCQl9CgkJCQl9CgoJCQkJcmV0dXJuOwoJCQl9CgoJCQkvL0RpZG4ndCBtYW5hZ2UgdG8gY2x1c3RlciBpbiBhdCB0aGlzIHpvb20sIHJlY29yZCB1cyBhcyBhIG1hcmtlciBoZXJlIGFuZCBjb250aW51ZSB1cHdhcmRzCgkJCWdyaWRVbmNsdXN0ZXJlZFt6b29tXS5hZGRPYmplY3QobGF5ZXIsIG1hcmtlclBvaW50KTsKCQl9CgoJCS8vRGlkbid0IGdldCBpbiBhbnl0aGluZywgYWRkIHVzIHRvIHRoZSB0b3AKCQl0aGlzLl90b3BDbHVzdGVyTGV2ZWwuX2FkZENoaWxkKGxheWVyKTsKCQlsYXllci5fX3BhcmVudCA9IHRoaXMuX3RvcENsdXN0ZXJMZXZlbDsKCQlyZXR1cm47Cgl9LAoKCS8vRW5xdWV1ZSBjb2RlIHRvIGZpcmUgYWZ0ZXIgdGhlIG1hcmtlciBleHBhbmQvY29udHJhY3QgaGFzIGhhcHBlbmVkCglfZW5xdWV1ZTogZnVuY3Rpb24gKGZuKSB7CgkJdGhpcy5fcXVldWUucHVzaChmbik7CgkJaWYgKCF0aGlzLl9xdWV1ZVRpbWVvdXQpIHsKCQkJdGhpcy5fcXVldWVUaW1lb3V0ID0gc2V0VGltZW91dChMLmJpbmQodGhpcy5fcHJvY2Vzc1F1ZXVlLCB0aGlzKSwgMzAwKTsKCQl9Cgl9LAoJX3Byb2Nlc3NRdWV1ZTogZnVuY3Rpb24gKCkgewoJCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fcXVldWUubGVuZ3RoOyBpKyspIHsKCQkJdGhpcy5fcXVldWVbaV0uY2FsbCh0aGlzKTsKCQl9CgkJdGhpcy5fcXVldWUubGVuZ3RoID0gMDsKCQljbGVhclRpbWVvdXQodGhpcy5fcXVldWVUaW1lb3V0KTsKCQl0aGlzLl9xdWV1ZVRpbWVvdXQgPSBudWxsOwoJfSwKCgkvL01lcmdlIGFuZCBzcGxpdCBhbnkgZXhpc3RpbmcgY2x1c3RlcnMgdGhhdCBhcmUgdG9vIGJpZyBvciBzbWFsbAoJX21lcmdlU3BsaXRDbHVzdGVyczogZnVuY3Rpb24gKCkgewoKCQkvL0luY2FzZSB3ZSBhcmUgc3RhcnRpbmcgdG8gc3BsaXQgYmVmb3JlIHRoZSBhbmltYXRpb24gZmluaXNoZWQKCQl0aGlzLl9wcm9jZXNzUXVldWUoKTsKCgkJaWYgKHRoaXMuX3pvb20gPCB0aGlzLl9tYXAuX3pvb20gJiYgdGhpcy5fY3VycmVudFNob3duQm91bmRzLmNvbnRhaW5zKHRoaXMuX2dldEV4cGFuZGVkVmlzaWJsZUJvdW5kcygpKSkgeyAvL1pvb20gaW4sIHNwbGl0CgkJCXRoaXMuX2FuaW1hdGlvblN0YXJ0KCk7CgkJCS8vUmVtb3ZlIGNsdXN0ZXJzIG5vdyBvZmYgc2NyZWVuCgkJCXRoaXMuX3RvcENsdXN0ZXJMZXZlbC5fcmVjdXJzaXZlbHlSZW1vdmVDaGlsZHJlbkZyb21NYXAodGhpcy5fY3VycmVudFNob3duQm91bmRzLCB0aGlzLl96b29tLCB0aGlzLl9nZXRFeHBhbmRlZFZpc2libGVCb3VuZHMoKSk7CgoJCQl0aGlzLl9hbmltYXRpb25ab29tSW4odGhpcy5fem9vbSwgdGhpcy5fbWFwLl96b29tKTsKCgkJfSBlbHNlIGlmICh0aGlzLl96b29tID4gdGhpcy5fbWFwLl96b29tKSB7IC8vWm9vbSBvdXQsIG1lcmdlCgkJCXRoaXMuX2FuaW1hdGlvblN0YXJ0KCk7CgoJCQl0aGlzLl9hbmltYXRpb25ab29tT3V0KHRoaXMuX3pvb20sIHRoaXMuX21hcC5fem9vbSk7CgkJfSBlbHNlIHsKCQkJdGhpcy5fbW92ZUVuZCgpOwoJCX0KCX0sCgoJLy9HZXRzIHRoZSBtYXBzIHZpc2libGUgYm91bmRzIGV4cGFuZGVkIGluIGVhY2ggZGlyZWN0aW9uIGJ5IHRoZSBzaXplIG9mIHRoZSBzY3JlZW4gKHNvIHRoZSB1c2VyIGNhbm5vdCBzZWUgYW4gYXJlYSB3ZSBkbyBub3QgY292ZXIgaW4gb25lIHBhbikKCV9nZXRFeHBhbmRlZFZpc2libGVCb3VuZHM6IGZ1bmN0aW9uICgpIHsKCQlpZiAoIXRoaXMub3B0aW9ucy5yZW1vdmVPdXRzaWRlVmlzaWJsZUJvdW5kcykgewoJCQlyZXR1cm4gdGhpcy5nZXRCb3VuZHMoKTsKCQl9CgoJCXZhciBtYXAgPSB0aGlzLl9tYXAsCgkJCWJvdW5kcyA9IG1hcC5nZXRCb3VuZHMoKSwKCQkJc3cgPSBib3VuZHMuX3NvdXRoV2VzdCwKCQkJbmUgPSBib3VuZHMuX25vcnRoRWFzdCwKCQkJbGF0RGlmZiA9IEwuQnJvd3Nlci5tb2JpbGUgPyAwIDogTWF0aC5hYnMoc3cubGF0IC0gbmUubGF0KSwKCQkJbG5nRGlmZiA9IEwuQnJvd3Nlci5tb2JpbGUgPyAwIDogTWF0aC5hYnMoc3cubG5nIC0gbmUubG5nKTsKCgkJcmV0dXJuIG5ldyBMLkxhdExuZ0JvdW5kcygKCQkJbmV3IEwuTGF0TG5nKHN3LmxhdCAtIGxhdERpZmYsIHN3LmxuZyAtIGxuZ0RpZmYsIHRydWUpLAoJCQluZXcgTC5MYXRMbmcobmUubGF0ICsgbGF0RGlmZiwgbmUubG5nICsgbG5nRGlmZiwgdHJ1ZSkpOwoJfSwKCgkvL1NoYXJlZCBhbmltYXRpb24gY29kZQoJX2FuaW1hdGlvbkFkZExheWVyTm9uQW5pbWF0ZWQ6IGZ1bmN0aW9uIChsYXllciwgbmV3Q2x1c3RlcikgewoJCWlmIChuZXdDbHVzdGVyID09PSBsYXllcikgewoJCQl0aGlzLl9mZWF0dXJlR3JvdXAuYWRkTGF5ZXIobGF5ZXIpOwoJCX0gZWxzZSBpZiAobmV3Q2x1c3Rlci5fY2hpbGRDb3VudCA9PT0gMikgewoJCQluZXdDbHVzdGVyLl9hZGRUb01hcCgpOwoKCQkJdmFyIG1hcmtlcnMgPSBuZXdDbHVzdGVyLmdldEFsbENoaWxkTWFya2VycygpOwoJCQl0aGlzLl9mZWF0dXJlR3JvdXAucmVtb3ZlTGF5ZXIobWFya2Vyc1swXSk7CgkJCXRoaXMuX2ZlYXR1cmVHcm91cC5yZW1vdmVMYXllcihtYXJrZXJzWzFdKTsKCQl9IGVsc2UgewoJCQluZXdDbHVzdGVyLl91cGRhdGVJY29uKCk7CgkJfQoJfQp9KTsKCkwuTWFya2VyQ2x1c3Rlckdyb3VwLmluY2x1ZGUoIUwuRG9tVXRpbC5UUkFOU0lUSU9OID8gewoKCS8vTm9uIEFuaW1hdGVkIHZlcnNpb25zIG9mIGV2ZXJ5dGhpbmcKCV9hbmltYXRpb25TdGFydDogZnVuY3Rpb24gKCkgewoJCS8vRG8gbm90aGluZy4uLgoJfSwKCV9hbmltYXRpb25ab29tSW46IGZ1bmN0aW9uIChwcmV2aW91c1pvb21MZXZlbCwgbmV3Wm9vbUxldmVsKSB7CgkJdGhpcy5fdG9wQ2x1c3RlckxldmVsLl9yZWN1cnNpdmVseVJlbW92ZUNoaWxkcmVuRnJvbU1hcCh0aGlzLl9jdXJyZW50U2hvd25Cb3VuZHMsIHByZXZpb3VzWm9vbUxldmVsKTsKCQl0aGlzLl90b3BDbHVzdGVyTGV2ZWwuX3JlY3Vyc2l2ZWx5QWRkQ2hpbGRyZW5Ub01hcChudWxsLCBuZXdab29tTGV2ZWwsIHRoaXMuX2dldEV4cGFuZGVkVmlzaWJsZUJvdW5kcygpKTsKCX0sCglfYW5pbWF0aW9uWm9vbU91dDogZnVuY3Rpb24gKHByZXZpb3VzWm9vbUxldmVsLCBuZXdab29tTGV2ZWwpIHsKCQl0aGlzLl90b3BDbHVzdGVyTGV2ZWwuX3JlY3Vyc2l2ZWx5UmVtb3ZlQ2hpbGRyZW5Gcm9tTWFwKHRoaXMuX2N1cnJlbnRTaG93bkJvdW5kcywgcHJldmlvdXNab29tTGV2ZWwpOwoJCXRoaXMuX3RvcENsdXN0ZXJMZXZlbC5fcmVjdXJzaXZlbHlBZGRDaGlsZHJlblRvTWFwKG51bGwsIG5ld1pvb21MZXZlbCwgdGhpcy5fZ2V0RXhwYW5kZWRWaXNpYmxlQm91bmRzKCkpOwoJfSwKCV9hbmltYXRpb25BZGRMYXllcjogZnVuY3Rpb24gKGxheWVyLCBuZXdDbHVzdGVyKSB7CgkJdGhpcy5fYW5pbWF0aW9uQWRkTGF5ZXJOb25BbmltYXRlZChsYXllciwgbmV3Q2x1c3Rlcik7Cgl9Cn0gOiB7CgoJLy9BbmltYXRlZCB2ZXJzaW9ucyBoZXJlCglfYW5pbWF0aW9uU3RhcnQ6IGZ1bmN0aW9uICgpIHsKCQl0aGlzLl9tYXAuX21hcFBhbmUuY2xhc3NOYW1lICs9ICcgbGVhZmxldC1jbHVzdGVyLWFuaW0nOwoJCXRoaXMuX2luWm9vbUFuaW1hdGlvbisrOwoJfSwKCV9hbmltYXRpb25FbmQ6IGZ1bmN0aW9uICgpIHsKCQlpZiAodGhpcy5fbWFwKSB7CgkJCXRoaXMuX21hcC5fbWFwUGFuZS5jbGFzc05hbWUgPSB0aGlzLl9tYXAuX21hcFBhbmUuY2xhc3NOYW1lLnJlcGxhY2UoJyBsZWFmbGV0LWNsdXN0ZXItYW5pbScsICcnKTsKCQl9CgkJdGhpcy5faW5ab29tQW5pbWF0aW9uLS07CgkJdGhpcy5maXJlKCdhbmltYXRpb25lbmQnKTsKCX0sCglfYW5pbWF0aW9uWm9vbUluOiBmdW5jdGlvbiAocHJldmlvdXNab29tTGV2ZWwsIG5ld1pvb21MZXZlbCkgewoJCXZhciBib3VuZHMgPSB0aGlzLl9nZXRFeHBhbmRlZFZpc2libGVCb3VuZHMoKSwKCQkgICAgZmcgPSB0aGlzLl9mZWF0dXJlR3JvdXAsCgkJICAgIGk7CgoJCS8vQWRkIGFsbCBjaGlsZHJlbiBvZiBjdXJyZW50IGNsdXN0ZXJzIHRvIG1hcCBhbmQgcmVtb3ZlIHRob3NlIGNsdXN0ZXJzIGZyb20gbWFwCgkJdGhpcy5fdG9wQ2x1c3RlckxldmVsLl9yZWN1cnNpdmVseShib3VuZHMsIHByZXZpb3VzWm9vbUxldmVsLCAwLCBmdW5jdGlvbiAoYykgewoJCQl2YXIgc3RhcnRQb3MgPSBjLl9sYXRsbmcsCgkJCQltYXJrZXJzID0gYy5fbWFya2VycywKCQkJCW07CgoJCQlpZiAoIWJvdW5kcy5jb250YWlucyhzdGFydFBvcykpIHsKCQkJCXN0YXJ0UG9zID0gbnVsbDsKCQkJfQoKCQkJaWYgKGMuX2lzU2luZ2xlUGFyZW50KCkgJiYgcHJldmlvdXNab29tTGV2ZWwgKyAxID09PSBuZXdab29tTGV2ZWwpIHsgLy9JbW1lZGlhdGVseSBhZGQgdGhlIG5ldyBjaGlsZCBhbmQgcmVtb3ZlIHVzCgkJCQlmZy5yZW1vdmVMYXllcihjKTsKCQkJCWMuX3JlY3Vyc2l2ZWx5QWRkQ2hpbGRyZW5Ub01hcChudWxsLCBuZXdab29tTGV2ZWwsIGJvdW5kcyk7CgkJCX0gZWxzZSB7CgkJCQkvL0ZhZGUgb3V0IG9sZCBjbHVzdGVyCgkJCQljLnNldE9wYWNpdHkoMCk7CgkJCQljLl9yZWN1cnNpdmVseUFkZENoaWxkcmVuVG9NYXAoc3RhcnRQb3MsIG5ld1pvb21MZXZlbCwgYm91bmRzKTsKCQkJfQoKCQkJLy9SZW1vdmUgYWxsIG1hcmtlcnMgdGhhdCBhcmVuJ3QgdmlzaWJsZSBhbnkgbW9yZQoJCQkvL1RPRE86IERvIHdlIGFjdHVhbGx5IG5lZWQgdG8gZG8gdGhpcyBvbiB0aGUgaGlnaGVyIGxldmVscyB0b28/CgkJCWZvciAoaSA9IG1hcmtlcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKCQkJCW0gPSBtYXJrZXJzW2ldOwoJCQkJaWYgKCFib3VuZHMuY29udGFpbnMobS5fbGF0bG5nKSkgewoJCQkJCWZnLnJlbW92ZUxheWVyKG0pOwoJCQkJfQoJCQl9CgoJCX0pOwoKCQl0aGlzLl9mb3JjZUxheW91dCgpOwoKCQkvL1VwZGF0ZSBvcGFjaXRpZXMKCQl0aGlzLl90b3BDbHVzdGVyTGV2ZWwuX3JlY3Vyc2l2ZWx5QmVjb21lVmlzaWJsZShib3VuZHMsIG5ld1pvb21MZXZlbCk7CgkJLy9UT0RPIE1heWJlPyBVcGRhdGUgbWFya2VycyBpbiBfcmVjdXJzaXZlbHlCZWNvbWVWaXNpYmxlCgkJZmcuZWFjaExheWVyKGZ1bmN0aW9uIChuKSB7CgkJCWlmICghKG4gaW5zdGFuY2VvZiBMLk1hcmtlckNsdXN0ZXIpICYmIG4uX2ljb24pIHsKCQkJCW4uc2V0T3BhY2l0eSgxKTsKCQkJfQoJCX0pOwoKCQkvL3VwZGF0ZSB0aGUgcG9zaXRpb25zIG9mIHRoZSBqdXN0IGFkZGVkIGNsdXN0ZXJzL21hcmtlcnMKCQl0aGlzLl90b3BDbHVzdGVyTGV2ZWwuX3JlY3Vyc2l2ZWx5KGJvdW5kcywgcHJldmlvdXNab29tTGV2ZWwsIG5ld1pvb21MZXZlbCwgZnVuY3Rpb24gKGMpIHsKCQkJYy5fcmVjdXJzaXZlbHlSZXN0b3JlQ2hpbGRQb3NpdGlvbnMobmV3Wm9vbUxldmVsKTsKCQl9KTsKCgkJLy9SZW1vdmUgdGhlIG9sZCBjbHVzdGVycyBhbmQgY2xvc2UgdGhlIHpvb20gYW5pbWF0aW9uCgkJdGhpcy5fZW5xdWV1ZShmdW5jdGlvbiAoKSB7CgkJCS8vdXBkYXRlIHRoZSBwb3NpdGlvbnMgb2YgdGhlIGp1c3QgYWRkZWQgY2x1c3RlcnMvbWFya2VycwoJCQl0aGlzLl90b3BDbHVzdGVyTGV2ZWwuX3JlY3Vyc2l2ZWx5KGJvdW5kcywgcHJldmlvdXNab29tTGV2ZWwsIDAsIGZ1bmN0aW9uIChjKSB7CgkJCQlmZy5yZW1vdmVMYXllcihjKTsKCQkJCWMuc2V0T3BhY2l0eSgxKTsKCQkJfSk7CgoJCQl0aGlzLl9hbmltYXRpb25FbmQoKTsKCQl9KTsKCX0sCgoJX2FuaW1hdGlvblpvb21PdXQ6IGZ1bmN0aW9uIChwcmV2aW91c1pvb21MZXZlbCwgbmV3Wm9vbUxldmVsKSB7CgkJdGhpcy5fYW5pbWF0aW9uWm9vbU91dFNpbmdsZSh0aGlzLl90b3BDbHVzdGVyTGV2ZWwsIHByZXZpb3VzWm9vbUxldmVsIC0gMSwgbmV3Wm9vbUxldmVsKTsKCgkJLy9OZWVkIHRvIGFkZCBtYXJrZXJzIGZvciB0aG9zZSB0aGF0IHdlcmVuJ3Qgb24gdGhlIG1hcCBiZWZvcmUgYnV0IGFyZSBub3cKCQl0aGlzLl90b3BDbHVzdGVyTGV2ZWwuX3JlY3Vyc2l2ZWx5QWRkQ2hpbGRyZW5Ub01hcChudWxsLCBuZXdab29tTGV2ZWwsIHRoaXMuX2dldEV4cGFuZGVkVmlzaWJsZUJvdW5kcygpKTsKCQkvL1JlbW92ZSBtYXJrZXJzIHRoYXQgd2VyZSBvbiB0aGUgbWFwIGJlZm9yZSBidXQgd29uJ3QgYmUgbm93CgkJdGhpcy5fdG9wQ2x1c3RlckxldmVsLl9yZWN1cnNpdmVseVJlbW92ZUNoaWxkcmVuRnJvbU1hcCh0aGlzLl9jdXJyZW50U2hvd25Cb3VuZHMsIHByZXZpb3VzWm9vbUxldmVsLCB0aGlzLl9nZXRFeHBhbmRlZFZpc2libGVCb3VuZHMoKSk7Cgl9LAoJX2FuaW1hdGlvblpvb21PdXRTaW5nbGU6IGZ1bmN0aW9uIChjbHVzdGVyLCBwcmV2aW91c1pvb21MZXZlbCwgbmV3Wm9vbUxldmVsKSB7CgkJdmFyIGJvdW5kcyA9IHRoaXMuX2dldEV4cGFuZGVkVmlzaWJsZUJvdW5kcygpOwoKCQkvL0FuaW1hdGUgYWxsIG9mIHRoZSBtYXJrZXJzIGluIHRoZSBjbHVzdGVycyB0byBtb3ZlIHRvIHRoZWlyIGNsdXN0ZXIgY2VudGVyIHBvaW50CgkJY2x1c3Rlci5fcmVjdXJzaXZlbHlBbmltYXRlQ2hpbGRyZW5JbkFuZEFkZFNlbGZUb01hcChib3VuZHMsIHByZXZpb3VzWm9vbUxldmVsICsgMSwgbmV3Wm9vbUxldmVsKTsKCgkJdmFyIG1lID0gdGhpczsKCgkJLy9VcGRhdGUgdGhlIG9wYWNpdHkgKElmIHdlIGltbWVkaWF0ZWx5IHNldCBpdCB0aGV5IHdvbid0IGFuaW1hdGUpCgkJdGhpcy5fZm9yY2VMYXlvdXQoKTsKCQljbHVzdGVyLl9yZWN1cnNpdmVseUJlY29tZVZpc2libGUoYm91bmRzLCBuZXdab29tTGV2ZWwpOwoKCQkvL1RPRE86IE1heWJlIHVzZSB0aGUgdHJhbnNpdGlvbiB0aW1pbmcgc3R1ZmYgdG8gbWFrZSB0aGlzIG1vcmUgcmVsaWFibGUKCQkvL1doZW4gdGhlIGFuaW1hdGlvbnMgYXJlIGRvbmUsIHRpZHkgdXAKCQl0aGlzLl9lbnF1ZXVlKGZ1bmN0aW9uICgpIHsKCgkJCS8vVGhpcyBjbHVzdGVyIHN0b3BwZWQgYmVpbmcgYSBjbHVzdGVyIGJlZm9yZSB0aGUgdGltZW91dCBmaXJlZAoJCQlpZiAoY2x1c3Rlci5fY2hpbGRDb3VudCA9PT0gMSkgewoJCQkJdmFyIG0gPSBjbHVzdGVyLl9tYXJrZXJzWzBdOwoJCQkJLy9JZiB3ZSB3ZXJlIGluIGEgY2x1c3RlciBhbmltYXRpb24gYXQgdGhlIHRpbWUgdGhlbiB0aGUgb3BhY2l0eSBhbmQgcG9zaXRpb24gb2Ygb3VyIGNoaWxkIGNvdWxkIGJlIHdyb25nIG5vdywgc28gZml4IGl0CgkJCQltLnNldExhdExuZyhtLmdldExhdExuZygpKTsKCQkJCWlmIChtLnNldE9wYWNpdHkpIHsKCQkJCQltLnNldE9wYWNpdHkoMSk7CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQljbHVzdGVyLl9yZWN1cnNpdmVseShib3VuZHMsIG5ld1pvb21MZXZlbCwgMCwgZnVuY3Rpb24gKGMpIHsKCQkJCQljLl9yZWN1cnNpdmVseVJlbW92ZUNoaWxkcmVuRnJvbU1hcChib3VuZHMsIHByZXZpb3VzWm9vbUxldmVsICsgMSk7CgkJCQl9KTsKCQkJfQoJCQltZS5fYW5pbWF0aW9uRW5kKCk7CgkJfSk7Cgl9LAoJX2FuaW1hdGlvbkFkZExheWVyOiBmdW5jdGlvbiAobGF5ZXIsIG5ld0NsdXN0ZXIpIHsKCQl2YXIgbWUgPSB0aGlzLAoJCQlmZyA9IHRoaXMuX2ZlYXR1cmVHcm91cDsKCgkJZmcuYWRkTGF5ZXIobGF5ZXIpOwoJCWlmIChuZXdDbHVzdGVyICE9PSBsYXllcikgewoJCQlpZiAobmV3Q2x1c3Rlci5fY2hpbGRDb3VudCA+IDIpIHsgLy9XYXMgYWxyZWFkeSBhIGNsdXN0ZXIKCgkJCQluZXdDbHVzdGVyLl91cGRhdGVJY29uKCk7CgkJCQl0aGlzLl9mb3JjZUxheW91dCgpOwoJCQkJdGhpcy5fYW5pbWF0aW9uU3RhcnQoKTsKCgkJCQlsYXllci5fc2V0UG9zKHRoaXMuX21hcC5sYXRMbmdUb0xheWVyUG9pbnQobmV3Q2x1c3Rlci5nZXRMYXRMbmcoKSkpOwoJCQkJbGF5ZXIuc2V0T3BhY2l0eSgwKTsKCgkJCQl0aGlzLl9lbnF1ZXVlKGZ1bmN0aW9uICgpIHsKCQkJCQlmZy5yZW1vdmVMYXllcihsYXllcik7CgkJCQkJbGF5ZXIuc2V0T3BhY2l0eSgxKTsKCgkJCQkJbWUuX2FuaW1hdGlvbkVuZCgpOwoJCQkJfSk7CgoJCQl9IGVsc2UgeyAvL0p1c3QgYmVjYW1lIGEgY2x1c3RlcgoJCQkJdGhpcy5fZm9yY2VMYXlvdXQoKTsKCgkJCQltZS5fYW5pbWF0aW9uU3RhcnQoKTsKCQkJCW1lLl9hbmltYXRpb25ab29tT3V0U2luZ2xlKG5ld0NsdXN0ZXIsIHRoaXMuX21hcC5nZXRNYXhab29tKCksIHRoaXMuX21hcC5nZXRab29tKCkpOwoJCQl9CgkJfQoJfSwKCgkvL0ZvcmNlIGEgYnJvd3NlciBsYXlvdXQgb2Ygc3R1ZmYgaW4gdGhlIG1hcAoJLy8gU2hvdWxkIGFwcGx5IHRoZSBjdXJyZW50IG9wYWNpdHkgYW5kIGxvY2F0aW9uIHRvIGFsbCBlbGVtZW50cyBzbyB3ZSBjYW4gdXBkYXRlIHRoZW0gYWdhaW4gZm9yIGFuIGFuaW1hdGlvbgoJX2ZvcmNlTGF5b3V0OiBmdW5jdGlvbiAoKSB7CgkJLy9JbiBteSB0ZXN0aW5nIHRoaXMgd29ya3MsIGluZmFjdCBvZmZzZXRXaWR0aCBvZiBhbnkgZWxlbWVudCBzZWVtcyB0byB3b3JrLgoJCS8vQ291bGQgbG9vcCBhbGwgdGhpcy5fbGF5ZXJzIGFuZCBkbyB0aGlzIGZvciBlYWNoIF9pY29uIGlmIGl0IHN0b3BzIHdvcmtpbmcKCgkJTC5VdGlsLmZhbHNlRm4oZG9jdW1lbnQuYm9keS5vZmZzZXRXaWR0aCk7Cgl9Cn0pOwoKTC5tYXJrZXJDbHVzdGVyR3JvdXAgPSBmdW5jdGlvbiAob3B0aW9ucykgewoJcmV0dXJuIG5ldyBMLk1hcmtlckNsdXN0ZXJHcm91cChvcHRpb25zKTsKfTsKCgpMLk1hcmtlckNsdXN0ZXIgPSBMLk1hcmtlci5leHRlbmQoewoJaW5pdGlhbGl6ZTogZnVuY3Rpb24gKGdyb3VwLCB6b29tLCBhLCBiKSB7CgoJCUwuTWFya2VyLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcywgYSA/IChhLl9jTGF0TG5nIHx8IGEuZ2V0TGF0TG5nKCkpIDogbmV3IEwuTGF0TG5nKDAsIDApLCB7IGljb246IHRoaXMgfSk7CgoKCQl0aGlzLl9ncm91cCA9IGdyb3VwOwoJCXRoaXMuX3pvb20gPSB6b29tOwoKCQl0aGlzLl9tYXJrZXJzID0gW107CgkJdGhpcy5fY2hpbGRDbHVzdGVycyA9IFtdOwoJCXRoaXMuX2NoaWxkQ291bnQgPSAwOwoJCXRoaXMuX2ljb25OZWVkc1VwZGF0ZSA9IHRydWU7CgoJCXRoaXMuX2JvdW5kcyA9IG5ldyBMLkxhdExuZ0JvdW5kcygpOwoKCQlpZiAoYSkgewoJCQl0aGlzLl9hZGRDaGlsZChhKTsKCQl9CgkJaWYgKGIpIHsKCQkJdGhpcy5fYWRkQ2hpbGQoYik7CgkJfQoJfSwKCgkvL1JlY3Vyc2l2ZWx5IHJldHJpZXZlIGFsbCBjaGlsZCBtYXJrZXJzIG9mIHRoaXMgY2x1c3RlcgoJZ2V0QWxsQ2hpbGRNYXJrZXJzOiBmdW5jdGlvbiAoc3RvcmFnZUFycmF5KSB7CgkJc3RvcmFnZUFycmF5ID0gc3RvcmFnZUFycmF5IHx8IFtdOwoKCQlmb3IgKHZhciBpID0gdGhpcy5fY2hpbGRDbHVzdGVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewoJCQl0aGlzLl9jaGlsZENsdXN0ZXJzW2ldLmdldEFsbENoaWxkTWFya2VycyhzdG9yYWdlQXJyYXkpOwoJCX0KCgkJZm9yICh2YXIgaiA9IHRoaXMuX21hcmtlcnMubGVuZ3RoIC0gMTsgaiA+PSAwOyBqLS0pIHsKCQkJc3RvcmFnZUFycmF5LnB1c2godGhpcy5fbWFya2Vyc1tqXSk7CgkJfQoKCQlyZXR1cm4gc3RvcmFnZUFycmF5OwoJfSwKCgkvL1JldHVybnMgdGhlIGNvdW50IG9mIGhvdyBtYW55IGNoaWxkIG1hcmtlcnMgd2UgaGF2ZQoJZ2V0Q2hpbGRDb3VudDogZnVuY3Rpb24gKCkgewoJCXJldHVybiB0aGlzLl9jaGlsZENvdW50OwoJfSwKCgkvL1pvb20gdG8gdGhlIG1pbmltdW0gb2Ygc2hvd2luZyBhbGwgb2YgdGhlIGNoaWxkIG1hcmtlcnMsIG9yIHRoZSBleHRlbnRzIG9mIHRoaXMgY2x1c3RlcgoJem9vbVRvQm91bmRzOiBmdW5jdGlvbiAoKSB7CgkJdmFyIGNoaWxkQ2x1c3RlcnMgPSB0aGlzLl9jaGlsZENsdXN0ZXJzLnNsaWNlKCksCgkJCW1hcCA9IHRoaXMuX2dyb3VwLl9tYXAsCgkJCWJvdW5kc1pvb20gPSBtYXAuZ2V0Qm91bmRzWm9vbSh0aGlzLl9ib3VuZHMpLAoJCQl6b29tID0gdGhpcy5fem9vbSArIDEsCgkJCW1hcFpvb20gPSBtYXAuZ2V0Wm9vbSgpLAoJCQlpOwoKCQkvL2NhbGN1bGF0ZSBob3cgZmFyZSB3ZSBuZWVkIHRvIHpvb20gZG93biB0byBzZWUgYWxsIG9mIHRoZSBtYXJrZXJzCgkJd2hpbGUgKGNoaWxkQ2x1c3RlcnMubGVuZ3RoID4gMCAmJiBib3VuZHNab29tID4gem9vbSkgewoJCQl6b29tKys7CgkJCXZhciBuZXdDbHVzdGVycyA9IFtdOwoJCQlmb3IgKGkgPSAwOyBpIDwgY2hpbGRDbHVzdGVycy5sZW5ndGg7IGkrKykgewoJCQkJbmV3Q2x1c3RlcnMgPSBuZXdDbHVzdGVycy5jb25jYXQoY2hpbGRDbHVzdGVyc1tpXS5fY2hpbGRDbHVzdGVycyk7CgkJCX0KCQkJY2hpbGRDbHVzdGVycyA9IG5ld0NsdXN0ZXJzOwoJCX0KCgkJaWYgKGJvdW5kc1pvb20gPiB6b29tKSB7CgkJCXRoaXMuX2dyb3VwLl9tYXAuc2V0Vmlldyh0aGlzLl9sYXRsbmcsIHpvb20pOwoJCX0gZWxzZSBpZiAoYm91bmRzWm9vbSA8PSBtYXBab29tKSB7IC8vSWYgZml0Qm91bmRzIHdvdWxkbid0IHpvb20gdXMgZG93biwgem9vbSB1cyBkb3duIGluc3RlYWQKCQkJdGhpcy5fZ3JvdXAuX21hcC5zZXRWaWV3KHRoaXMuX2xhdGxuZywgbWFwWm9vbSArIDEpOwoJCX0gZWxzZSB7CgkJCXRoaXMuX2dyb3VwLl9tYXAuZml0Qm91bmRzKHRoaXMuX2JvdW5kcyk7CgkJfQoJfSwKCglnZXRCb3VuZHM6IGZ1bmN0aW9uICgpIHsKCQl2YXIgYm91bmRzID0gbmV3IEwuTGF0TG5nQm91bmRzKCk7CgkJYm91bmRzLmV4dGVuZCh0aGlzLl9ib3VuZHMpOwoJCXJldHVybiBib3VuZHM7Cgl9LAoKCV91cGRhdGVJY29uOiBmdW5jdGlvbiAoKSB7CgkJdGhpcy5faWNvbk5lZWRzVXBkYXRlID0gdHJ1ZTsKCQlpZiAodGhpcy5faWNvbikgewoJCQl0aGlzLnNldEljb24odGhpcyk7CgkJfQoJfSwKCgkvL0NsdWRnZSBmb3IgSWNvbiwgd2UgcHJldGVuZCB0byBiZSBhbiBpY29uIGZvciBwZXJmb3JtYW5jZQoJY3JlYXRlSWNvbjogZnVuY3Rpb24gKCkgewoJCWlmICh0aGlzLl9pY29uTmVlZHNVcGRhdGUpIHsKCQkJdGhpcy5faWNvbk9iaiA9IHRoaXMuX2dyb3VwLm9wdGlvbnMuaWNvbkNyZWF0ZUZ1bmN0aW9uKHRoaXMpOwoJCQl0aGlzLl9pY29uTmVlZHNVcGRhdGUgPSBmYWxzZTsKCQl9CgkJcmV0dXJuIHRoaXMuX2ljb25PYmouY3JlYXRlSWNvbigpOwoJfSwKCWNyZWF0ZVNoYWRvdzogZnVuY3Rpb24gKCkgewoJCXJldHVybiB0aGlzLl9pY29uT2JqLmNyZWF0ZVNoYWRvdygpOwoJfSwKCgoJX2FkZENoaWxkOiBmdW5jdGlvbiAobmV3MSwgaXNOb3RpZmljYXRpb25Gcm9tQ2hpbGQpIHsKCgkJdGhpcy5faWNvbk5lZWRzVXBkYXRlID0gdHJ1ZTsKCQl0aGlzLl9leHBhbmRCb3VuZHMobmV3MSk7CgoJCWlmIChuZXcxIGluc3RhbmNlb2YgTC5NYXJrZXJDbHVzdGVyKSB7CgkJCWlmICghaXNOb3RpZmljYXRpb25Gcm9tQ2hpbGQpIHsKCQkJCXRoaXMuX2NoaWxkQ2x1c3RlcnMucHVzaChuZXcxKTsKCQkJCW5ldzEuX19wYXJlbnQgPSB0aGlzOwoJCQl9CgkJCXRoaXMuX2NoaWxkQ291bnQgKz0gbmV3MS5fY2hpbGRDb3VudDsKCQl9IGVsc2UgewoJCQlpZiAoIWlzTm90aWZpY2F0aW9uRnJvbUNoaWxkKSB7CgkJCQl0aGlzLl9tYXJrZXJzLnB1c2gobmV3MSk7CgkJCX0KCQkJdGhpcy5fY2hpbGRDb3VudCsrOwoJCX0KCgkJaWYgKHRoaXMuX19wYXJlbnQpIHsKCQkJdGhpcy5fX3BhcmVudC5fYWRkQ2hpbGQobmV3MSwgdHJ1ZSk7CgkJfQoJfSwKCgkvL0V4cGFuZCBvdXIgYm91bmRzIGFuZCB0ZWxsIG91ciBwYXJlbnQgdG8KCV9leHBhbmRCb3VuZHM6IGZ1bmN0aW9uIChtYXJrZXIpIHsKCQl2YXIgYWRkZWRDb3VudCwKCQkgICAgYWRkZWRMYXRMbmcgPSBtYXJrZXIuX3dMYXRMbmcgfHwgbWFya2VyLl9sYXRsbmc7CgoJCWlmIChtYXJrZXIgaW5zdGFuY2VvZiBMLk1hcmtlckNsdXN0ZXIpIHsKCQkJdGhpcy5fYm91bmRzLmV4dGVuZChtYXJrZXIuX2JvdW5kcyk7CgkJCWFkZGVkQ291bnQgPSBtYXJrZXIuX2NoaWxkQ291bnQ7CgkJfSBlbHNlIHsKCQkJdGhpcy5fYm91bmRzLmV4dGVuZChhZGRlZExhdExuZyk7CgkJCWFkZGVkQ291bnQgPSAxOwoJCX0KCgkJaWYgKCF0aGlzLl9jTGF0TG5nKSB7CgkJCS8vIHdoZW4gY2x1c3RlcmluZywgdGFrZSBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgcG9pbnQgYXMgdGhlIGNsdXN0ZXIgY2VudGVyCgkJCXRoaXMuX2NMYXRMbmcgPSBtYXJrZXIuX2NMYXRMbmcgfHwgYWRkZWRMYXRMbmc7CgkJfQoKCQkvLyB3aGVuIHNob3dpbmcgY2x1c3RlcnMsIHRha2Ugd2VpZ2h0ZWQgYXZlcmFnZSBvZiBhbGwgcG9pbnRzIGFzIGNsdXN0ZXIgY2VudGVyCgkJdmFyIHRvdGFsQ291bnQgPSB0aGlzLl9jaGlsZENvdW50ICsgYWRkZWRDb3VudDsKCgkJLy9DYWxjdWxhdGUgd2VpZ2h0ZWQgbGF0bG5nIGZvciBkaXNwbGF5CgkJaWYgKCF0aGlzLl93TGF0TG5nKSB7CgkJCXRoaXMuX2xhdGxuZyA9IHRoaXMuX3dMYXRMbmcgPSBuZXcgTC5MYXRMbmcoYWRkZWRMYXRMbmcubGF0LCBhZGRlZExhdExuZy5sbmcpOwoJCX0gZWxzZSB7CgkJCXRoaXMuX3dMYXRMbmcubGF0ID0gKGFkZGVkTGF0TG5nLmxhdCAqIGFkZGVkQ291bnQgKyB0aGlzLl93TGF0TG5nLmxhdCAqIHRoaXMuX2NoaWxkQ291bnQpIC8gdG90YWxDb3VudDsKCQkJdGhpcy5fd0xhdExuZy5sbmcgPSAoYWRkZWRMYXRMbmcubG5nICogYWRkZWRDb3VudCArIHRoaXMuX3dMYXRMbmcubG5nICogdGhpcy5fY2hpbGRDb3VudCkgLyB0b3RhbENvdW50OwoJCX0KCX0sCgoJLy9TZXQgb3VyIG1hcmtlcnMgcG9zaXRpb24gYXMgZ2l2ZW4gYW5kIGFkZCBpdCB0byB0aGUgbWFwCglfYWRkVG9NYXA6IGZ1bmN0aW9uIChzdGFydFBvcykgewoJCWlmIChzdGFydFBvcykgewoJCQl0aGlzLl9iYWNrdXBMYXRsbmcgPSB0aGlzLl9sYXRsbmc7CgkJCXRoaXMuc2V0TGF0TG5nKHN0YXJ0UG9zKTsKCQl9CgkJdGhpcy5fZ3JvdXAuX2ZlYXR1cmVHcm91cC5hZGRMYXllcih0aGlzKTsKCX0sCgoJX3JlY3Vyc2l2ZWx5QW5pbWF0ZUNoaWxkcmVuSW46IGZ1bmN0aW9uIChib3VuZHMsIGNlbnRlciwgbWF4Wm9vbSkgewoJCXRoaXMuX3JlY3Vyc2l2ZWx5KGJvdW5kcywgMCwgbWF4Wm9vbSAtIDEsCgkJCWZ1bmN0aW9uIChjKSB7CgkJCQl2YXIgbWFya2VycyA9IGMuX21hcmtlcnMsCgkJCQkJaSwgbTsKCQkJCWZvciAoaSA9IG1hcmtlcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKCQkJCQltID0gbWFya2Vyc1tpXTsKCgkJCQkJLy9Pbmx5IGRvIGl0IGlmIHRoZSBpY29uIGlzIHN0aWxsIG9uIHRoZSBtYXAKCQkJCQlpZiAobS5faWNvbikgewoJCQkJCQltLl9zZXRQb3MoY2VudGVyKTsKCQkJCQkJbS5zZXRPcGFjaXR5KDApOwoJCQkJCX0KCQkJCX0KCQkJfSwKCQkJZnVuY3Rpb24gKGMpIHsKCQkJCXZhciBjaGlsZENsdXN0ZXJzID0gYy5fY2hpbGRDbHVzdGVycywKCQkJCQlqLCBjbTsKCQkJCWZvciAoaiA9IGNoaWxkQ2x1c3RlcnMubGVuZ3RoIC0gMTsgaiA+PSAwOyBqLS0pIHsKCQkJCQljbSA9IGNoaWxkQ2x1c3RlcnNbal07CgkJCQkJaWYgKGNtLl9pY29uKSB7CgkJCQkJCWNtLl9zZXRQb3MoY2VudGVyKTsKCQkJCQkJY20uc2V0T3BhY2l0eSgwKTsKCQkJCQl9CgkJCQl9CgkJCX0KCQkpOwoJfSwKCglfcmVjdXJzaXZlbHlBbmltYXRlQ2hpbGRyZW5JbkFuZEFkZFNlbGZUb01hcDogZnVuY3Rpb24gKGJvdW5kcywgcHJldmlvdXNab29tTGV2ZWwsIG5ld1pvb21MZXZlbCkgewoJCXRoaXMuX3JlY3Vyc2l2ZWx5KGJvdW5kcywgbmV3Wm9vbUxldmVsLCAwLAoJCQlmdW5jdGlvbiAoYykgewoJCQkJYy5fcmVjdXJzaXZlbHlBbmltYXRlQ2hpbGRyZW5Jbihib3VuZHMsIGMuX2dyb3VwLl9tYXAubGF0TG5nVG9MYXllclBvaW50KGMuZ2V0TGF0TG5nKCkpLnJvdW5kKCksIHByZXZpb3VzWm9vbUxldmVsKTsKCgkJCQkvL1RPRE86IGRlcHRoVG9BbmltYXRlSW4gYWZmZWN0cyBfaXNTaW5nbGVQYXJlbnQsIGlmIHRoZXJlIGlzIGEgbXVsdGl6b29tIHdlIG1heS9tYXkgbm90IGJlLgoJCQkJLy9BcyBhIGhhY2sgd2Ugb25seSBkbyBhIGFuaW1hdGlvbiBmcmVlIHpvb20gb24gYSBzaW5nbGUgbGV2ZWwgem9vbSwgaWYgc29tZW9uZSBkb2VzIG11bHRpcGxlIGxldmVscyB0aGVuIHdlIGFsd2F5cyBhbmltYXRlCgkJCQlpZiAoYy5faXNTaW5nbGVQYXJlbnQoKSAmJiBwcmV2aW91c1pvb21MZXZlbCAtIDEgPT09IG5ld1pvb21MZXZlbCkgewoJCQkJCWMuc2V0T3BhY2l0eSgxKTsKCQkJCQljLl9yZWN1cnNpdmVseVJlbW92ZUNoaWxkcmVuRnJvbU1hcChib3VuZHMsIHByZXZpb3VzWm9vbUxldmVsKTsgLy9JbW1lZGlhdGVseSByZW1vdmUgb3VyIGNoaWxkcmVuIGFzIHdlIGFyZSByZXBsYWNpbmcgdGhlbS4gVE9ETyBwcmV2aW91c0JvdW5kcyBub3QgYm91bmRzCgkJCQl9IGVsc2UgewoJCQkJCWMuc2V0T3BhY2l0eSgwKTsKCQkJCX0KCgkJCQljLl9hZGRUb01hcCgpOwoJCQl9CgkJKTsKCX0sCgoJX3JlY3Vyc2l2ZWx5QmVjb21lVmlzaWJsZTogZnVuY3Rpb24gKGJvdW5kcywgem9vbUxldmVsKSB7CgkJdGhpcy5fcmVjdXJzaXZlbHkoYm91bmRzLCAwLCB6b29tTGV2ZWwsIG51bGwsIGZ1bmN0aW9uIChjKSB7CgkJCWMuc2V0T3BhY2l0eSgxKTsKCQl9KTsKCX0sCgoJX3JlY3Vyc2l2ZWx5QWRkQ2hpbGRyZW5Ub01hcDogZnVuY3Rpb24gKHN0YXJ0UG9zLCB6b29tTGV2ZWwsIGJvdW5kcykgewoJCXRoaXMuX3JlY3Vyc2l2ZWx5KGJvdW5kcywgLTEsIHpvb21MZXZlbCwKCQkJZnVuY3Rpb24gKGMpIHsKCQkJCWlmICh6b29tTGV2ZWwgPT09IGMuX3pvb20pIHsKCQkJCQlyZXR1cm47CgkJCQl9CgoJCQkJLy9BZGQgb3VyIGNoaWxkIG1hcmtlcnMgYXQgc3RhcnRQb3MgKHNvIHRoZXkgY2FuIGJlIGFuaW1hdGVkIG91dCkKCQkJCWZvciAodmFyIGkgPSBjLl9tYXJrZXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CgkJCQkJdmFyIG5tID0gYy5fbWFya2Vyc1tpXTsKCgkJCQkJaWYgKCFib3VuZHMuY29udGFpbnMobm0uX2xhdGxuZykpIHsKCQkJCQkJY29udGludWU7CgkJCQkJfQoKCQkJCQlpZiAoc3RhcnRQb3MpIHsKCQkJCQkJbm0uX2JhY2t1cExhdGxuZyA9IG5tLmdldExhdExuZygpOwoKCQkJCQkJbm0uc2V0TGF0TG5nKHN0YXJ0UG9zKTsKCQkJCQkJaWYgKG5tLnNldE9wYWNpdHkpIHsKCQkJCQkJCW5tLnNldE9wYWNpdHkoMCk7CgkJCQkJCX0KCQkJCQl9CgoJCQkJCWMuX2dyb3VwLl9mZWF0dXJlR3JvdXAuYWRkTGF5ZXIobm0pOwoJCQkJfQoJCQl9LAoJCQlmdW5jdGlvbiAoYykgewoJCQkJYy5fYWRkVG9NYXAoc3RhcnRQb3MpOwoJCQl9CgkJKTsKCX0sCgoJX3JlY3Vyc2l2ZWx5UmVzdG9yZUNoaWxkUG9zaXRpb25zOiBmdW5jdGlvbiAoem9vbUxldmVsKSB7CgkJLy9GaXggcG9zaXRpb25zIG9mIGNoaWxkIG1hcmtlcnMKCQlmb3IgKHZhciBpID0gdGhpcy5fbWFya2Vycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewoJCQl2YXIgbm0gPSB0aGlzLl9tYXJrZXJzW2ldOwoJCQlpZiAobm0uX2JhY2t1cExhdGxuZykgewoJCQkJbm0uc2V0TGF0TG5nKG5tLl9iYWNrdXBMYXRsbmcpOwoJCQkJZGVsZXRlIG5tLl9iYWNrdXBMYXRsbmc7CgkJCX0KCQl9CgoJCWlmICh6b29tTGV2ZWwgLSAxID09PSB0aGlzLl96b29tKSB7CgkJCS8vUmVwb3NpdGlvbiBjaGlsZCBjbHVzdGVycwoJCQlmb3IgKHZhciBqID0gdGhpcy5fY2hpbGRDbHVzdGVycy5sZW5ndGggLSAxOyBqID49IDA7IGotLSkgewoJCQkJdGhpcy5fY2hpbGRDbHVzdGVyc1tqXS5fcmVzdG9yZVBvc2l0aW9uKCk7CgkJCX0KCQl9IGVsc2UgewoJCQlmb3IgKHZhciBrID0gdGhpcy5fY2hpbGRDbHVzdGVycy5sZW5ndGggLSAxOyBrID49IDA7IGstLSkgewoJCQkJdGhpcy5fY2hpbGRDbHVzdGVyc1trXS5fcmVjdXJzaXZlbHlSZXN0b3JlQ2hpbGRQb3NpdGlvbnMoem9vbUxldmVsKTsKCQkJfQoJCX0KCX0sCgoJX3Jlc3RvcmVQb3NpdGlvbjogZnVuY3Rpb24gKCkgewoJCWlmICh0aGlzLl9iYWNrdXBMYXRsbmcpIHsKCQkJdGhpcy5zZXRMYXRMbmcodGhpcy5fYmFja3VwTGF0bG5nKTsKCQkJZGVsZXRlIHRoaXMuX2JhY2t1cExhdGxuZzsKCQl9Cgl9LAoKCS8vZXhjZXB0Qm91bmRzOiBJZiBzZXQsIGRvbid0IHJlbW92ZSBhbnkgbWFya2Vycy9jbHVzdGVycyBpbiBpdAoJX3JlY3Vyc2l2ZWx5UmVtb3ZlQ2hpbGRyZW5Gcm9tTWFwOiBmdW5jdGlvbiAocHJldmlvdXNCb3VuZHMsIHpvb21MZXZlbCwgZXhjZXB0Qm91bmRzKSB7CgkJdmFyIG0sIGk7CgkJdGhpcy5fcmVjdXJzaXZlbHkocHJldmlvdXNCb3VuZHMsIC0xLCB6b29tTGV2ZWwgLSAxLAoJCQlmdW5jdGlvbiAoYykgewoJCQkJLy9SZW1vdmUgbWFya2VycyBhdCBldmVyeSBsZXZlbAoJCQkJZm9yIChpID0gYy5fbWFya2Vycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewoJCQkJCW0gPSBjLl9tYXJrZXJzW2ldOwoJCQkJCWlmICghZXhjZXB0Qm91bmRzIHx8ICFleGNlcHRCb3VuZHMuY29udGFpbnMobS5fbGF0bG5nKSkgewoJCQkJCQljLl9ncm91cC5fZmVhdHVyZUdyb3VwLnJlbW92ZUxheWVyKG0pOwoJCQkJCQlpZiAobS5zZXRPcGFjaXR5KSB7CgkJCQkJCQltLnNldE9wYWNpdHkoMSk7CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCX0sCgkJCWZ1bmN0aW9uIChjKSB7CgkJCQkvL1JlbW92ZSBjaGlsZCBjbHVzdGVycyBhdCBqdXN0IHRoZSBib3R0b20gbGV2ZWwKCQkJCWZvciAoaSA9IGMuX2NoaWxkQ2x1c3RlcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKCQkJCQltID0gYy5fY2hpbGRDbHVzdGVyc1tpXTsKCQkJCQlpZiAoIWV4Y2VwdEJvdW5kcyB8fCAhZXhjZXB0Qm91bmRzLmNvbnRhaW5zKG0uX2xhdGxuZykpIHsKCQkJCQkJYy5fZ3JvdXAuX2ZlYXR1cmVHcm91cC5yZW1vdmVMYXllcihtKTsKCQkJCQkJaWYgKG0uc2V0T3BhY2l0eSkgewoJCQkJCQkJbS5zZXRPcGFjaXR5KDEpOwoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQl9CgkJKTsKCX0sCgoJLy9SdW4gdGhlIGdpdmVuIGZ1bmN0aW9ucyByZWN1cnNpdmVseSB0byB0aGlzIGFuZCBjaGlsZCBjbHVzdGVycwoJLy8gYm91bmRzVG9BcHBseVRvOiBhIEwuTGF0TG5nQm91bmRzIHJlcHJlc2VudGluZyB0aGUgYm91bmRzIG9mIHdoYXQgY2x1c3RlcnMgdG8gcmVjdXJzZSBpbiB0bwoJLy8gem9vbUxldmVsVG9TdGFydDogem9vbSBsZXZlbCB0byBzdGFydCBydW5uaW5nIGZ1bmN0aW9ucyAoaW5jbHVzaXZlKQoJLy8gem9vbUxldmVsVG9TdG9wOiB6b29tIGxldmVsIHRvIHN0b3AgcnVubmluZyBmdW5jdGlvbnMgKGluY2x1c2l2ZSkKCS8vIHJ1bkF0RXZlcnlMZXZlbDogZnVuY3Rpb24gdGhhdCB0YWtlcyBhbiBMLk1hcmtlckNsdXN0ZXIgYXMgYW4gYXJndW1lbnQgdGhhdCBzaG91bGQgYmUgYXBwbGllZCBvbiBldmVyeSBsZXZlbAoJLy8gcnVuQXRCb3R0b21MZXZlbDogZnVuY3Rpb24gdGhhdCB0YWtlcyBhbiBMLk1hcmtlckNsdXN0ZXIgYXMgYW4gYXJndW1lbnQgdGhhdCBzaG91bGQgYmUgYXBwbGllZCBhdCBvbmx5IHRoZSBib3R0b20gbGV2ZWwKCV9yZWN1cnNpdmVseTogZnVuY3Rpb24gKGJvdW5kc1RvQXBwbHlUbywgem9vbUxldmVsVG9TdGFydCwgem9vbUxldmVsVG9TdG9wLCBydW5BdEV2ZXJ5TGV2ZWwsIHJ1bkF0Qm90dG9tTGV2ZWwpIHsKCQl2YXIgY2hpbGRDbHVzdGVycyA9IHRoaXMuX2NoaWxkQ2x1c3RlcnMsCgkJICAgIHpvb20gPSB0aGlzLl96b29tLAoJCQlpLCBjOwoKCQlpZiAoem9vbUxldmVsVG9TdGFydCA+IHpvb20pIHsgLy9TdGlsbCBnb2luZyBkb3duIHRvIHJlcXVpcmVkIGRlcHRoLCBqdXN0IHJlY3Vyc2UgdG8gY2hpbGQgY2x1c3RlcnMKCQkJZm9yIChpID0gY2hpbGRDbHVzdGVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewoJCQkJYyA9IGNoaWxkQ2x1c3RlcnNbaV07CgkJCQlpZiAoYm91bmRzVG9BcHBseVRvLmludGVyc2VjdHMoYy5fYm91bmRzKSkgewoJCQkJCWMuX3JlY3Vyc2l2ZWx5KGJvdW5kc1RvQXBwbHlUbywgem9vbUxldmVsVG9TdGFydCwgem9vbUxldmVsVG9TdG9wLCBydW5BdEV2ZXJ5TGV2ZWwsIHJ1bkF0Qm90dG9tTGV2ZWwpOwoJCQkJfQoJCQl9CgkJfSBlbHNlIHsgLy9JbiByZXF1aXJlZCBkZXB0aAoKCQkJaWYgKHJ1bkF0RXZlcnlMZXZlbCkgewoJCQkJcnVuQXRFdmVyeUxldmVsKHRoaXMpOwoJCQl9CgkJCWlmIChydW5BdEJvdHRvbUxldmVsICYmIHRoaXMuX3pvb20gPT09IHpvb21MZXZlbFRvU3RvcCkgewoJCQkJcnVuQXRCb3R0b21MZXZlbCh0aGlzKTsKCQkJfQoKCQkJLy9UT0RPOiBUaGlzIGxvb3AgaXMgYWxtb3N0IHRoZSBzYW1lIGFzIGFib3ZlCgkJCWlmICh6b29tTGV2ZWxUb1N0b3AgPiB6b29tKSB7CgkJCQlmb3IgKGkgPSBjaGlsZENsdXN0ZXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CgkJCQkJYyA9IGNoaWxkQ2x1c3RlcnNbaV07CgkJCQkJaWYgKGJvdW5kc1RvQXBwbHlUby5pbnRlcnNlY3RzKGMuX2JvdW5kcykpIHsKCQkJCQkJYy5fcmVjdXJzaXZlbHkoYm91bmRzVG9BcHBseVRvLCB6b29tTGV2ZWxUb1N0YXJ0LCB6b29tTGV2ZWxUb1N0b3AsIHJ1bkF0RXZlcnlMZXZlbCwgcnVuQXRCb3R0b21MZXZlbCk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoJfSwKCglfcmVjYWxjdWxhdGVCb3VuZHM6IGZ1bmN0aW9uICgpIHsKCQl2YXIgbWFya2VycyA9IHRoaXMuX21hcmtlcnMsCgkJCWNoaWxkQ2x1c3RlcnMgPSB0aGlzLl9jaGlsZENsdXN0ZXJzLAoJCQlpOwoKCQl0aGlzLl9ib3VuZHMgPSBuZXcgTC5MYXRMbmdCb3VuZHMoKTsKCQlkZWxldGUgdGhpcy5fd0xhdExuZzsKCgkJZm9yIChpID0gbWFya2Vycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewoJCQl0aGlzLl9leHBhbmRCb3VuZHMobWFya2Vyc1tpXSk7CgkJfQoJCWZvciAoaSA9IGNoaWxkQ2x1c3RlcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKCQkJdGhpcy5fZXhwYW5kQm91bmRzKGNoaWxkQ2x1c3RlcnNbaV0pOwoJCX0KCX0sCgoKCS8vUmV0dXJucyB0cnVlIGlmIHdlIGFyZSB0aGUgcGFyZW50IG9mIG9ubHkgb25lIGNsdXN0ZXIgYW5kIHRoYXQgY2x1c3RlciBpcyB0aGUgc2FtZSBhcyB1cwoJX2lzU2luZ2xlUGFyZW50OiBmdW5jdGlvbiAoKSB7CgkJLy9Eb24ndCBuZWVkIHRvIGNoZWNrIHRoaXMuX21hcmtlcnMgYXMgdGhlIHJlc3Qgd29uJ3Qgd29yayBpZiB0aGVyZSBhcmUgYW55CgkJcmV0dXJuIHRoaXMuX2NoaWxkQ2x1c3RlcnMubGVuZ3RoID4gMCAmJiB0aGlzLl9jaGlsZENsdXN0ZXJzWzBdLl9jaGlsZENvdW50ID09PSB0aGlzLl9jaGlsZENvdW50OwoJfQp9KTsKCgoKTC5EaXN0YW5jZUdyaWQgPSBmdW5jdGlvbiAoY2VsbFNpemUpIHsKCXRoaXMuX2NlbGxTaXplID0gY2VsbFNpemU7Cgl0aGlzLl9zcUNlbGxTaXplID0gY2VsbFNpemUgKiBjZWxsU2l6ZTsKCXRoaXMuX2dyaWQgPSB7fTsKCXRoaXMuX29iamVjdFBvaW50ID0geyB9Owp9OwoKTC5EaXN0YW5jZUdyaWQucHJvdG90eXBlID0gewoKCWFkZE9iamVjdDogZnVuY3Rpb24gKG9iaiwgcG9pbnQpIHsKCQl2YXIgeCA9IHRoaXMuX2dldENvb3JkKHBvaW50LngpLAoJCSAgICB5ID0gdGhpcy5fZ2V0Q29vcmQocG9pbnQueSksCgkJICAgIGdyaWQgPSB0aGlzLl9ncmlkLAoJCSAgICByb3cgPSBncmlkW3ldID0gZ3JpZFt5XSB8fCB7fSwKCQkgICAgY2VsbCA9IHJvd1t4XSA9IHJvd1t4XSB8fCBbXSwKCQkgICAgc3RhbXAgPSBMLlV0aWwuc3RhbXAob2JqKTsKCgkJdGhpcy5fb2JqZWN0UG9pbnRbc3RhbXBdID0gcG9pbnQ7CgoJCWNlbGwucHVzaChvYmopOwoJfSwKCgl1cGRhdGVPYmplY3Q6IGZ1bmN0aW9uIChvYmosIHBvaW50KSB7CgkJdGhpcy5yZW1vdmVPYmplY3Qob2JqKTsKCQl0aGlzLmFkZE9iamVjdChvYmosIHBvaW50KTsKCX0sCgoJLy9SZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCB3YXMgZm91bmQKCXJlbW92ZU9iamVjdDogZnVuY3Rpb24gKG9iaiwgcG9pbnQpIHsKCQl2YXIgeCA9IHRoaXMuX2dldENvb3JkKHBvaW50LngpLAoJCSAgICB5ID0gdGhpcy5fZ2V0Q29vcmQocG9pbnQueSksCgkJICAgIGdyaWQgPSB0aGlzLl9ncmlkLAoJCSAgICByb3cgPSBncmlkW3ldID0gZ3JpZFt5XSB8fCB7fSwKCQkgICAgY2VsbCA9IHJvd1t4XSA9IHJvd1t4XSB8fCBbXSwKCQkgICAgaSwgbGVuOwoKCQlkZWxldGUgdGhpcy5fb2JqZWN0UG9pbnRbTC5VdGlsLnN0YW1wKG9iaildOwoKCQlmb3IgKGkgPSAwLCBsZW4gPSBjZWxsLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CgkJCWlmIChjZWxsW2ldID09PSBvYmopIHsKCgkJCQljZWxsLnNwbGljZShpLCAxKTsKCgkJCQlpZiAobGVuID09PSAxKSB7CgkJCQkJZGVsZXRlIHJvd1t4XTsKCQkJCX0KCgkJCQlyZXR1cm4gdHJ1ZTsKCQkJfQoJCX0KCgl9LAoKCWVhY2hPYmplY3Q6IGZ1bmN0aW9uIChmbiwgY29udGV4dCkgewoJCXZhciBpLCBqLCBrLCBsZW4sIHJvdywgY2VsbCwgcmVtb3ZlZCwKCQkgICAgZ3JpZCA9IHRoaXMuX2dyaWQ7CgoJCWZvciAoaSBpbiBncmlkKSB7CgkJCXJvdyA9IGdyaWRbaV07CgoJCQlmb3IgKGogaW4gcm93KSB7CgkJCQljZWxsID0gcm93W2pdOwoKCQkJCWZvciAoayA9IDAsIGxlbiA9IGNlbGwubGVuZ3RoOyBrIDwgbGVuOyBrKyspIHsKCQkJCQlyZW1vdmVkID0gZm4uY2FsbChjb250ZXh0LCBjZWxsW2tdKTsKCQkJCQlpZiAocmVtb3ZlZCkgewoJCQkJCQlrLS07CgkJCQkJCWxlbi0tOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCX0sCgoJZ2V0TmVhck9iamVjdDogZnVuY3Rpb24gKHBvaW50KSB7CgkJdmFyIHggPSB0aGlzLl9nZXRDb29yZChwb2ludC54KSwKCQkgICAgeSA9IHRoaXMuX2dldENvb3JkKHBvaW50LnkpLAoJCSAgICBpLCBqLCBrLCByb3csIGNlbGwsIGxlbiwgb2JqLCBkaXN0LAoJCSAgICBvYmplY3RQb2ludCA9IHRoaXMuX29iamVjdFBvaW50LAoJCSAgICBjbG9zZXN0RGlzdFNxID0gdGhpcy5fc3FDZWxsU2l6ZSwKCQkgICAgY2xvc2VzdCA9IG51bGw7CgoJCWZvciAoaSA9IHkgLSAxOyBpIDw9IHkgKyAxOyBpKyspIHsKCQkJcm93ID0gdGhpcy5fZ3JpZFtpXTsKCQkJaWYgKHJvdykgewoKCQkJCWZvciAoaiA9IHggLSAxOyBqIDw9IHggKyAxOyBqKyspIHsKCQkJCQljZWxsID0gcm93W2pdOwoJCQkJCWlmIChjZWxsKSB7CgoJCQkJCQlmb3IgKGsgPSAwLCBsZW4gPSBjZWxsLmxlbmd0aDsgayA8IGxlbjsgaysrKSB7CgkJCQkJCQlvYmogPSBjZWxsW2tdOwoJCQkJCQkJZGlzdCA9IHRoaXMuX3NxRGlzdChvYmplY3RQb2ludFtMLlV0aWwuc3RhbXAob2JqKV0sIHBvaW50KTsKCQkJCQkJCWlmIChkaXN0IDwgY2xvc2VzdERpc3RTcSkgewoJCQkJCQkJCWNsb3Nlc3REaXN0U3EgPSBkaXN0OwoJCQkJCQkJCWNsb3Nlc3QgPSBvYmo7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCX0KCQl9CgkJcmV0dXJuIGNsb3Nlc3Q7Cgl9LAoKCV9nZXRDb29yZDogZnVuY3Rpb24gKHgpIHsKCQlyZXR1cm4gTWF0aC5mbG9vcih4IC8gdGhpcy5fY2VsbFNpemUpOwoJfSwKCglfc3FEaXN0OiBmdW5jdGlvbiAocCwgcDIpIHsKCQl2YXIgZHggPSBwMi54IC0gcC54LAoJCSAgICBkeSA9IHAyLnkgLSBwLnk7CgkJcmV0dXJuIGR4ICogZHggKyBkeSAqIGR5OwoJfQp9OwoKCi8qIENvcHlyaWdodCAoYykgMjAxMiB0aGUgYXV0aG9ycyBsaXN0ZWQgYXQgdGhlIGZvbGxvd2luZyBVUkwsIGFuZC9vcgp0aGUgYXV0aG9ycyBvZiByZWZlcmVuY2VkIGFydGljbGVzIG9yIGluY29ycG9yYXRlZCBleHRlcm5hbCBjb2RlOgpodHRwOi8vZW4ubGl0ZXJhdGVwcm9ncmFtcy5vcmcvUXVpY2todWxsXyhKYXZhc2NyaXB0KT9hY3Rpb249aGlzdG9yeSZvZmZzZXQ9MjAxMjA0MTAxNzUyNTYKClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwphIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwp3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCmRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwpwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCk1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCgpSZXRyaWV2ZWQgZnJvbTogaHR0cDovL2VuLmxpdGVyYXRlcHJvZ3JhbXMub3JnL1F1aWNraHVsbF8oSmF2YXNjcmlwdCk/b2xkaWQ9MTg0MzQKKi8KCihmdW5jdGlvbiAoKSB7CglMLlF1aWNrSHVsbCA9IHsKCgkJLyoKCQkgKiBAcGFyYW0ge09iamVjdH0gY3B0IGEgcG9pbnQgdG8gYmUgbWVhc3VyZWQgZnJvbSB0aGUgYmFzZWxpbmUKCQkgKiBAcGFyYW0ge0FycmF5fSBibCB0aGUgYmFzZWxpbmUsIGFzIHJlcHJlc2VudGVkIGJ5IGEgdHdvLWVsZW1lbnQKCQkgKiAgIGFycmF5IG9mIGxhdGxuZyBvYmplY3RzLgoJCSAqIEByZXR1cm5zIHtOdW1iZXJ9IGFuIGFwcHJveGltYXRlIGRpc3RhbmNlIG1lYXN1cmUKCQkgKi8KCQlnZXREaXN0YW50OiBmdW5jdGlvbiAoY3B0LCBibCkgewoJCQl2YXIgdlkgPSBibFsxXS5sYXQgLSBibFswXS5sYXQsCgkJCQl2WCA9IGJsWzBdLmxuZyAtIGJsWzFdLmxuZzsKCQkJcmV0dXJuICh2WCAqIChjcHQubGF0IC0gYmxbMF0ubGF0KSArIHZZICogKGNwdC5sbmcgLSBibFswXS5sbmcpKTsKCQl9LAoKCQkvKgoJCSAqIEBwYXJhbSB7QXJyYXl9IGJhc2VMaW5lIGEgdHdvLWVsZW1lbnQgYXJyYXkgb2YgbGF0bG5nIG9iamVjdHMKCQkgKiAgIHJlcHJlc2VudGluZyB0aGUgYmFzZWxpbmUgdG8gcHJvamVjdCBmcm9tCgkJICogQHBhcmFtIHtBcnJheX0gbGF0TG5ncyBhbiBhcnJheSBvZiBsYXRsbmcgb2JqZWN0cwoJCSAqIEByZXR1cm5zIHtPYmplY3R9IHRoZSBtYXhpbXVtIHBvaW50IGFuZCBhbGwgbmV3IHBvaW50cyB0byBzdGF5CgkJICogICBpbiBjb25zaWRlcmF0aW9uIGZvciB0aGUgaHVsbC4KCQkgKi8KCQlmaW5kTW9zdERpc3RhbnRQb2ludEZyb21CYXNlTGluZTogZnVuY3Rpb24gKGJhc2VMaW5lLCBsYXRMbmdzKSB7CgkJCXZhciBtYXhEID0gMCwKCQkJCW1heFB0ID0gbnVsbCwKCQkJCW5ld1BvaW50cyA9IFtdLAoJCQkJaSwgcHQsIGQ7CgoJCQlmb3IgKGkgPSBsYXRMbmdzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CgkJCQlwdCA9IGxhdExuZ3NbaV07CgkJCQlkID0gdGhpcy5nZXREaXN0YW50KHB0LCBiYXNlTGluZSk7CgoJCQkJaWYgKGQgPiAwKSB7CgkJCQkJbmV3UG9pbnRzLnB1c2gocHQpOwoJCQkJfSBlbHNlIHsKCQkJCQljb250aW51ZTsKCQkJCX0KCgkJCQlpZiAoZCA+IG1heEQpIHsKCQkJCQltYXhEID0gZDsKCQkJCQltYXhQdCA9IHB0OwoJCQkJfQoJCQl9CgoJCQlyZXR1cm4geyBtYXhQb2ludDogbWF4UHQsIG5ld1BvaW50czogbmV3UG9pbnRzIH07CgkJfSwKCgoJCS8qCgkJICogR2l2ZW4gYSBiYXNlbGluZSwgY29tcHV0ZSB0aGUgY29udmV4IGh1bGwgb2YgbGF0TG5ncyBhcyBhbiBhcnJheQoJCSAqIG9mIGxhdExuZ3MuCgkJICoKCQkgKiBAcGFyYW0ge0FycmF5fSBsYXRMbmdzCgkJICogQHJldHVybnMge0FycmF5fQoJCSAqLwoJCWJ1aWxkQ29udmV4SHVsbDogZnVuY3Rpb24gKGJhc2VMaW5lLCBsYXRMbmdzKSB7CgkJCXZhciBjb252ZXhIdWxsQmFzZUxpbmVzID0gW10sCgkJCQl0ID0gdGhpcy5maW5kTW9zdERpc3RhbnRQb2ludEZyb21CYXNlTGluZShiYXNlTGluZSwgbGF0TG5ncyk7CgoJCQlpZiAodC5tYXhQb2ludCkgeyAvLyBpZiB0aGVyZSBpcyBzdGlsbCBhIHBvaW50ICJvdXRzaWRlIiB0aGUgYmFzZSBsaW5lCgkJCQljb252ZXhIdWxsQmFzZUxpbmVzID0KCQkJCQljb252ZXhIdWxsQmFzZUxpbmVzLmNvbmNhdCgKCQkJCQkJdGhpcy5idWlsZENvbnZleEh1bGwoW2Jhc2VMaW5lWzBdLCB0Lm1heFBvaW50XSwgdC5uZXdQb2ludHMpCgkJCQkJKTsKCQkJCWNvbnZleEh1bGxCYXNlTGluZXMgPQoJCQkJCWNvbnZleEh1bGxCYXNlTGluZXMuY29uY2F0KAoJCQkJCQl0aGlzLmJ1aWxkQ29udmV4SHVsbChbdC5tYXhQb2ludCwgYmFzZUxpbmVbMV1dLCB0Lm5ld1BvaW50cykKCQkJCQkpOwoJCQkJcmV0dXJuIGNvbnZleEh1bGxCYXNlTGluZXM7CgkJCX0gZWxzZSB7ICAvLyBpZiB0aGVyZSBpcyBubyBtb3JlIHBvaW50ICJvdXRzaWRlIiB0aGUgYmFzZSBsaW5lLCB0aGUgY3VycmVudCBiYXNlIGxpbmUgaXMgcGFydCBvZiB0aGUgY29udmV4IGh1bGwKCQkJCXJldHVybiBbYmFzZUxpbmVbMF1dOwoJCQl9CgkJfSwKCgkJLyoKCQkgKiBHaXZlbiBhbiBhcnJheSBvZiBsYXRsbmdzLCBjb21wdXRlIGEgY29udmV4IGh1bGwgYXMgYW4gYXJyYXkKCQkgKiBvZiBsYXRsbmdzCgkJICoKCQkgKiBAcGFyYW0ge0FycmF5fSBsYXRMbmdzCgkJICogQHJldHVybnMge0FycmF5fQoJCSAqLwoJCWdldENvbnZleEh1bGw6IGZ1bmN0aW9uIChsYXRMbmdzKSB7CgkJCS8vIGZpbmQgZmlyc3QgYmFzZWxpbmUKCQkJdmFyIG1heExhdCA9IGZhbHNlLCBtaW5MYXQgPSBmYWxzZSwKCQkJCW1heFB0ID0gbnVsbCwgbWluUHQgPSBudWxsLAoJCQkJaTsKCgkJCWZvciAoaSA9IGxhdExuZ3MubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKCQkJCXZhciBwdCA9IGxhdExuZ3NbaV07CgkJCQlpZiAobWF4TGF0ID09PSBmYWxzZSB8fCBwdC5sYXQgPiBtYXhMYXQpIHsKCQkJCQltYXhQdCA9IHB0OwoJCQkJCW1heExhdCA9IHB0LmxhdDsKCQkJCX0KCQkJCWlmIChtaW5MYXQgPT09IGZhbHNlIHx8IHB0LmxhdCA8IG1pbkxhdCkgewoJCQkJCW1pblB0ID0gcHQ7CgkJCQkJbWluTGF0ID0gcHQubGF0OwoJCQkJfQoJCQl9CgkJCXZhciBjaCA9IFtdLmNvbmNhdCh0aGlzLmJ1aWxkQ29udmV4SHVsbChbbWluUHQsIG1heFB0XSwgbGF0TG5ncyksCgkJCQkJCQkJdGhpcy5idWlsZENvbnZleEh1bGwoW21heFB0LCBtaW5QdF0sIGxhdExuZ3MpKTsKCQkJcmV0dXJuIGNoOwoJCX0KCX07Cn0oKSk7CgpMLk1hcmtlckNsdXN0ZXIuaW5jbHVkZSh7CglnZXRDb252ZXhIdWxsOiBmdW5jdGlvbiAoKSB7CgkJdmFyIGNoaWxkTWFya2VycyA9IHRoaXMuZ2V0QWxsQ2hpbGRNYXJrZXJzKCksCgkJCXBvaW50cyA9IFtdLAoJCQlwLCBpOwoKCQlmb3IgKGkgPSBjaGlsZE1hcmtlcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKCQkJcCA9IGNoaWxkTWFya2Vyc1tpXS5nZXRMYXRMbmcoKTsKCQkJcG9pbnRzLnB1c2gocCk7CgkJfQoKCQlyZXR1cm4gTC5RdWlja0h1bGwuZ2V0Q29udmV4SHVsbChwb2ludHMpOwoJfQp9KTsKCgovL1RoaXMgY29kZSBpcyAxMDAlIGJhc2VkIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9qYXdqL092ZXJsYXBwaW5nTWFya2VyU3BpZGVyZmllci1MZWFmbGV0Ci8vSHVnZSB0aGFua3MgdG8gamF3aiBmb3IgaW1wbGVtZW50aW5nIGl0IGZpcnN0IHRvIG1ha2UgbXkgam9iIGVhc3kgOi0pCgpMLk1hcmtlckNsdXN0ZXIuaW5jbHVkZSh7CgoJXzJQSTogTWF0aC5QSSAqIDIsCglfY2lyY2xlRm9vdFNlcGFyYXRpb246IDI1LCAvL3JlbGF0ZWQgdG8gY2lyY3VtZmVyZW5jZSBvZiBjaXJjbGUKCV9jaXJjbGVTdGFydEFuZ2xlOiBNYXRoLlBJIC8gNiwKCglfc3BpcmFsRm9vdFNlcGFyYXRpb246ICAyOCwgLy9yZWxhdGVkIHRvIHNpemUgb2Ygc3BpcmFsIChleHBlcmltZW50ISkKCV9zcGlyYWxMZW5ndGhTdGFydDogMTEsCglfc3BpcmFsTGVuZ3RoRmFjdG9yOiA1LAoKCV9jaXJjbGVTcGlyYWxTd2l0Y2hvdmVyOiA5LCAvL3Nob3cgc3BpcmFsIGluc3RlYWQgb2YgY2lyY2xlIGZyb20gdGhpcyBtYXJrZXIgY291bnQgdXB3YXJkcy4KCQkJCQkJCQkvLyAwIC0+IGFsd2F5cyBzcGlyYWw7IEluZmluaXR5IC0+IGFsd2F5cyBjaXJjbGUKCglzcGlkZXJmeTogZnVuY3Rpb24gKCkgewoJCWlmICh0aGlzLl9ncm91cC5fc3BpZGVyZmllZCA9PT0gdGhpcyB8fCB0aGlzLl9ncm91cC5faW5ab29tQW5pbWF0aW9uKSB7CgkJCXJldHVybjsKCQl9CgoJCXZhciBjaGlsZE1hcmtlcnMgPSB0aGlzLmdldEFsbENoaWxkTWFya2VycygpLAoJCQlncm91cCA9IHRoaXMuX2dyb3VwLAoJCQltYXAgPSBncm91cC5fbWFwLAoJCQljZW50ZXIgPSBtYXAubGF0TG5nVG9MYXllclBvaW50KHRoaXMuX2xhdGxuZyksCgkJCXBvc2l0aW9uczsKCgkJdGhpcy5fZ3JvdXAuX3Vuc3BpZGVyZnkoKTsKCQl0aGlzLl9ncm91cC5fc3BpZGVyZmllZCA9IHRoaXM7CgoJCS8vVE9ETyBNYXliZTogY2hpbGRNYXJrZXJzIG9yZGVyIGJ5IGRpc3RhbmNlIHRvIGNlbnRlcgoKCQlpZiAoY2hpbGRNYXJrZXJzLmxlbmd0aCA+PSB0aGlzLl9jaXJjbGVTcGlyYWxTd2l0Y2hvdmVyKSB7CgkJCXBvc2l0aW9ucyA9IHRoaXMuX2dlbmVyYXRlUG9pbnRzU3BpcmFsKGNoaWxkTWFya2Vycy5sZW5ndGgsIGNlbnRlcik7CgkJfSBlbHNlIHsKCQkJY2VudGVyLnkgKz0gMTA7IC8vT3RoZXJ3aXNlIGNpcmNsZXMgbG9vayB3cm9uZwoJCQlwb3NpdGlvbnMgPSB0aGlzLl9nZW5lcmF0ZVBvaW50c0NpcmNsZShjaGlsZE1hcmtlcnMubGVuZ3RoLCBjZW50ZXIpOwoJCX0KCgkJdGhpcy5fYW5pbWF0aW9uU3BpZGVyZnkoY2hpbGRNYXJrZXJzLCBwb3NpdGlvbnMpOwoJfSwKCgl1bnNwaWRlcmZ5OiBmdW5jdGlvbiAoem9vbURldGFpbHMpIHsKCQkvLy8gPHBhcmFtIE5hbWU9Inpvb21EZXRhaWxzIj5Bcmd1bWVudCBmcm9tIHpvb21hbmltIGlmIGJlaW5nIGNhbGxlZCBpbiBhIHpvb20gYW5pbWF0aW9uIG9yIG51bGwgb3RoZXJ3aXNlPC9wYXJhbT4KCQlpZiAodGhpcy5fZ3JvdXAuX2luWm9vbUFuaW1hdGlvbikgewoJCQlyZXR1cm47CgkJfQoJCXRoaXMuX2FuaW1hdGlvblVuc3BpZGVyZnkoem9vbURldGFpbHMpOwoKCQl0aGlzLl9ncm91cC5fc3BpZGVyZmllZCA9IG51bGw7Cgl9LAoKCV9nZW5lcmF0ZVBvaW50c0NpcmNsZTogZnVuY3Rpb24gKGNvdW50LCBjZW50ZXJQdCkgewoJCXZhciBjaXJjdW1mZXJlbmNlID0gdGhpcy5fZ3JvdXAub3B0aW9ucy5zcGlkZXJmeURpc3RhbmNlTXVsdGlwbGllciAqIHRoaXMuX2NpcmNsZUZvb3RTZXBhcmF0aW9uICogKDIgKyBjb3VudCksCgkJCWxlZ0xlbmd0aCA9IGNpcmN1bWZlcmVuY2UgLyB0aGlzLl8yUEksICAvL3JhZGl1cyBmcm9tIGNpcmN1bWZlcmVuY2UKCQkJYW5nbGVTdGVwID0gdGhpcy5fMlBJIC8gY291bnQsCgkJCXJlcyA9IFtdLAoJCQlpLCBhbmdsZTsKCgkJcmVzLmxlbmd0aCA9IGNvdW50OwoKCQlmb3IgKGkgPSBjb3VudCAtIDE7IGkgPj0gMDsgaS0tKSB7CgkJCWFuZ2xlID0gdGhpcy5fY2lyY2xlU3RhcnRBbmdsZSArIGkgKiBhbmdsZVN0ZXA7CgkJCXJlc1tpXSA9IG5ldyBMLlBvaW50KGNlbnRlclB0LnggKyBsZWdMZW5ndGggKiBNYXRoLmNvcyhhbmdsZSksIGNlbnRlclB0LnkgKyBsZWdMZW5ndGggKiBNYXRoLnNpbihhbmdsZSkpLl9yb3VuZCgpOwoJCX0KCgkJcmV0dXJuIHJlczsKCX0sCgoJX2dlbmVyYXRlUG9pbnRzU3BpcmFsOiBmdW5jdGlvbiAoY291bnQsIGNlbnRlclB0KSB7CgkJdmFyIGxlZ0xlbmd0aCA9IHRoaXMuX2dyb3VwLm9wdGlvbnMuc3BpZGVyZnlEaXN0YW5jZU11bHRpcGxpZXIgKiB0aGlzLl9zcGlyYWxMZW5ndGhTdGFydCwKCQkJc2VwYXJhdGlvbiA9IHRoaXMuX2dyb3VwLm9wdGlvbnMuc3BpZGVyZnlEaXN0YW5jZU11bHRpcGxpZXIgKiB0aGlzLl9zcGlyYWxGb290U2VwYXJhdGlvbiwKCQkJbGVuZ3RoRmFjdG9yID0gdGhpcy5fZ3JvdXAub3B0aW9ucy5zcGlkZXJmeURpc3RhbmNlTXVsdGlwbGllciAqIHRoaXMuX3NwaXJhbExlbmd0aEZhY3RvciwKCQkJYW5nbGUgPSAwLAoJCQlyZXMgPSBbXSwKCQkJaTsKCgkJcmVzLmxlbmd0aCA9IGNvdW50OwoKCQlmb3IgKGkgPSBjb3VudCAtIDE7IGkgPj0gMDsgaS0tKSB7CgkJCWFuZ2xlICs9IHNlcGFyYXRpb24gLyBsZWdMZW5ndGggKyBpICogMC4wMDA1OwoJCQlyZXNbaV0gPSBuZXcgTC5Qb2ludChjZW50ZXJQdC54ICsgbGVnTGVuZ3RoICogTWF0aC5jb3MoYW5nbGUpLCBjZW50ZXJQdC55ICsgbGVnTGVuZ3RoICogTWF0aC5zaW4oYW5nbGUpKS5fcm91bmQoKTsKCQkJbGVnTGVuZ3RoICs9IHRoaXMuXzJQSSAqIGxlbmd0aEZhY3RvciAvIGFuZ2xlOwoJCX0KCQlyZXR1cm4gcmVzOwoJfSwKCglfbm9hbmltYXRpb25VbnNwaWRlcmZ5OiBmdW5jdGlvbiAoKSB7CgkJdmFyIGdyb3VwID0gdGhpcy5fZ3JvdXAsCgkJCW1hcCA9IGdyb3VwLl9tYXAsCgkJCWZnID0gZ3JvdXAuX2ZlYXR1cmVHcm91cCwKCQkJY2hpbGRNYXJrZXJzID0gdGhpcy5nZXRBbGxDaGlsZE1hcmtlcnMoKSwKCQkJbSwgaTsKCgkJdGhpcy5zZXRPcGFjaXR5KDEpOwoJCWZvciAoaSA9IGNoaWxkTWFya2Vycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewoJCQltID0gY2hpbGRNYXJrZXJzW2ldOwoKCQkJZmcucmVtb3ZlTGF5ZXIobSk7CgoJCQlpZiAobS5fcHJlU3BpZGVyZnlMYXRsbmcpIHsKCQkJCW0uc2V0TGF0TG5nKG0uX3ByZVNwaWRlcmZ5TGF0bG5nKTsKCQkJCWRlbGV0ZSBtLl9wcmVTcGlkZXJmeUxhdGxuZzsKCQkJfQoJCQlpZiAobS5zZXRaSW5kZXhPZmZzZXQpIHsKCQkJCW0uc2V0WkluZGV4T2Zmc2V0KDApOwoJCQl9CgoJCQlpZiAobS5fc3BpZGVyTGVnKSB7CgkJCQltYXAucmVtb3ZlTGF5ZXIobS5fc3BpZGVyTGVnKTsKCQkJCWRlbGV0ZSBtLl9zcGlkZXJMZWc7CgkJCX0KCQl9CgoJCWdyb3VwLl9zcGlkZXJmaWVkID0gbnVsbDsKCX0KfSk7CgpMLk1hcmtlckNsdXN0ZXIuaW5jbHVkZSghTC5Eb21VdGlsLlRSQU5TSVRJT04gPyB7CgkvL05vbiBBbmltYXRlZCB2ZXJzaW9ucyBvZiBldmVyeXRoaW5nCglfYW5pbWF0aW9uU3BpZGVyZnk6IGZ1bmN0aW9uIChjaGlsZE1hcmtlcnMsIHBvc2l0aW9ucykgewoJCXZhciBncm91cCA9IHRoaXMuX2dyb3VwLAoJCQltYXAgPSBncm91cC5fbWFwLAoJCQlmZyA9IGdyb3VwLl9mZWF0dXJlR3JvdXAsCgkJCWksIG0sIGxlZywgbmV3UG9zOwoKCQlmb3IgKGkgPSBjaGlsZE1hcmtlcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKCQkJbmV3UG9zID0gbWFwLmxheWVyUG9pbnRUb0xhdExuZyhwb3NpdGlvbnNbaV0pOwoJCQltID0gY2hpbGRNYXJrZXJzW2ldOwoKCQkJbS5fcHJlU3BpZGVyZnlMYXRsbmcgPSBtLl9sYXRsbmc7CgkJCW0uc2V0TGF0TG5nKG5ld1Bvcyk7CgkJCWlmIChtLnNldFpJbmRleE9mZnNldCkgewoJCQkJbS5zZXRaSW5kZXhPZmZzZXQoMTAwMDAwMCk7IC8vTWFrZSB0aGVzZSBhcHBlYXIgb24gdG9wIG9mIEVWRVJZVEhJTkcKCQkJfQoKCQkJZmcuYWRkTGF5ZXIobSk7CgoKCQkJbGVnID0gbmV3IEwuUG9seWxpbmUoW3RoaXMuX2xhdGxuZywgbmV3UG9zXSwgeyB3ZWlnaHQ6IDEuNSwgY29sb3I6ICcjMjIyJyB9KTsKCQkJbWFwLmFkZExheWVyKGxlZyk7CgkJCW0uX3NwaWRlckxlZyA9IGxlZzsKCQl9CgkJdGhpcy5zZXRPcGFjaXR5KDAuMyk7CgkJZ3JvdXAuZmlyZSgnc3BpZGVyZmllZCcpOwoJfSwKCglfYW5pbWF0aW9uVW5zcGlkZXJmeTogZnVuY3Rpb24gKCkgewoJCXRoaXMuX25vYW5pbWF0aW9uVW5zcGlkZXJmeSgpOwoJfQp9IDogewoJLy9BbmltYXRlZCB2ZXJzaW9ucyBoZXJlCglTVkdfQU5JTUFUSU9OOiAoZnVuY3Rpb24gKCkgewoJCXJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ2FuaW1hdGUnKS50b1N0cmluZygpLmluZGV4T2YoJ1NWR0FuaW1hdGUnKSA+IC0xOwoJfSgpKSwKCglfYW5pbWF0aW9uU3BpZGVyZnk6IGZ1bmN0aW9uIChjaGlsZE1hcmtlcnMsIHBvc2l0aW9ucykgewoJCXZhciBtZSA9IHRoaXMsCgkJCWdyb3VwID0gdGhpcy5fZ3JvdXAsCgkJCW1hcCA9IGdyb3VwLl9tYXAsCgkJCWZnID0gZ3JvdXAuX2ZlYXR1cmVHcm91cCwKCQkJdGhpc0xheWVyUG9zID0gbWFwLmxhdExuZ1RvTGF5ZXJQb2ludCh0aGlzLl9sYXRsbmcpLAoJCQlpLCBtLCBsZWcsIG5ld1BvczsKCgkJLy9BZGQgbWFya2VycyB0byBtYXAgaGlkZGVuIGF0IG91ciBjZW50ZXIgcG9pbnQKCQlmb3IgKGkgPSBjaGlsZE1hcmtlcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKCQkJbSA9IGNoaWxkTWFya2Vyc1tpXTsKCgkJCS8vSWYgaXQgaXMgYSBtYXJrZXIsIGFkZCBpdCBub3cgYW5kIHdlJ2xsIGFuaW1hdGUgaXQgb3V0CgkJCWlmIChtLnNldE9wYWNpdHkpIHsKCQkJCW0uc2V0WkluZGV4T2Zmc2V0KDEwMDAwMDApOyAvL01ha2UgdGhlc2UgYXBwZWFyIG9uIHRvcCBvZiBFVkVSWVRISU5HCgkJCQltLnNldE9wYWNpdHkoMCk7CgkJCQoJCQkJZmcuYWRkTGF5ZXIobSk7CgoJCQkJbS5fc2V0UG9zKHRoaXNMYXllclBvcyk7CgkJCX0gZWxzZSB7CgkJCQkvL1ZlY3RvcnMganVzdCBnZXQgaW1tZWRpYXRlbHkgYWRkZWQKCQkJCWZnLmFkZExheWVyKG0pOwoJCQl9CgkJfQoKCQlncm91cC5fZm9yY2VMYXlvdXQoKTsKCQlncm91cC5fYW5pbWF0aW9uU3RhcnQoKTsKCgkJdmFyIGluaXRpYWxMZWdPcGFjaXR5ID0gTC5QYXRoLlNWRyA/IDAgOiAwLjMsCgkJCXhtbG5zID0gTC5QYXRoLlNWR19OUzsKCgoJCWZvciAoaSA9IGNoaWxkTWFya2Vycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewoJCQluZXdQb3MgPSBtYXAubGF5ZXJQb2ludFRvTGF0TG5nKHBvc2l0aW9uc1tpXSk7CgkJCW0gPSBjaGlsZE1hcmtlcnNbaV07CgoJCQkvL01vdmUgbWFya2VyIHRvIG5ldyBwb3NpdGlvbgoJCQltLl9wcmVTcGlkZXJmeUxhdGxuZyA9IG0uX2xhdGxuZzsKCQkJbS5zZXRMYXRMbmcobmV3UG9zKTsKCQkJCgkJCWlmIChtLnNldE9wYWNpdHkpIHsKCQkJCW0uc2V0T3BhY2l0eSgxKTsKCQkJfQoKCgkJCS8vQWRkIExlZ3MuCgkJCWxlZyA9IG5ldyBMLlBvbHlsaW5lKFttZS5fbGF0bG5nLCBuZXdQb3NdLCB7IHdlaWdodDogMS41LCBjb2xvcjogJyMyMjInLCBvcGFjaXR5OiBpbml0aWFsTGVnT3BhY2l0eSB9KTsKCQkJbWFwLmFkZExheWVyKGxlZyk7CgkJCW0uX3NwaWRlckxlZyA9IGxlZzsKCgkJCS8vRm9sbG93aW5nIGFuaW1hdGlvbnMgZG9uJ3Qgd29yayBmb3IgY2FudmFzCgkJCWlmICghTC5QYXRoLlNWRyB8fCAhdGhpcy5TVkdfQU5JTUFUSU9OKSB7CgkJCQljb250aW51ZTsKCQkJfQoKCQkJLy9Ib3cgdGhpcyB3b3JrczoKCQkJLy9odHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzU5MjQyMzgvaG93LWRvLXlvdS1hbmltYXRlLWFuLXN2Zy1wYXRoLWluLWlvcwoJCQkvL2h0dHA6Ly9kZXYub3BlcmEuY29tL2FydGljbGVzL3ZpZXcvYWR2YW5jZWQtc3ZnLWFuaW1hdGlvbi10ZWNobmlxdWVzLwoKCQkJLy9BbmltYXRlIGxlbmd0aAoJCQl2YXIgbGVuZ3RoID0gbGVnLl9wYXRoLmdldFRvdGFsTGVuZ3RoKCk7CgkJCWxlZy5fcGF0aC5zZXRBdHRyaWJ1dGUoInN0cm9rZS1kYXNoYXJyYXkiLCBsZW5ndGggKyAiLCIgKyBsZW5ndGgpOwoKCQkJdmFyIGFuaW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoeG1sbnMsICJhbmltYXRlIik7CgkJCWFuaW0uc2V0QXR0cmlidXRlKCJhdHRyaWJ1dGVOYW1lIiwgInN0cm9rZS1kYXNob2Zmc2V0Iik7CgkJCWFuaW0uc2V0QXR0cmlidXRlKCJiZWdpbiIsICJpbmRlZmluaXRlIik7CgkJCWFuaW0uc2V0QXR0cmlidXRlKCJmcm9tIiwgbGVuZ3RoKTsKCQkJYW5pbS5zZXRBdHRyaWJ1dGUoInRvIiwgMCk7CgkJCWFuaW0uc2V0QXR0cmlidXRlKCJkdXIiLCAwLjI1KTsKCQkJbGVnLl9wYXRoLmFwcGVuZENoaWxkKGFuaW0pOwoJCQlhbmltLmJlZ2luRWxlbWVudCgpOwoKCQkJLy9BbmltYXRlIG9wYWNpdHkKCQkJYW5pbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyh4bWxucywgImFuaW1hdGUiKTsKCQkJYW5pbS5zZXRBdHRyaWJ1dGUoImF0dHJpYnV0ZU5hbWUiLCAic3Ryb2tlLW9wYWNpdHkiKTsKCQkJYW5pbS5zZXRBdHRyaWJ1dGUoImF0dHJpYnV0ZU5hbWUiLCAic3Ryb2tlLW9wYWNpdHkiKTsKCQkJYW5pbS5zZXRBdHRyaWJ1dGUoImJlZ2luIiwgImluZGVmaW5pdGUiKTsKCQkJYW5pbS5zZXRBdHRyaWJ1dGUoImZyb20iLCAwKTsKCQkJYW5pbS5zZXRBdHRyaWJ1dGUoInRvIiwgMC41KTsKCQkJYW5pbS5zZXRBdHRyaWJ1dGUoImR1ciIsIDAuMjUpOwoJCQlsZWcuX3BhdGguYXBwZW5kQ2hpbGQoYW5pbSk7CgkJCWFuaW0uYmVnaW5FbGVtZW50KCk7CgkJfQoJCW1lLnNldE9wYWNpdHkoMC4zKTsKCgkJLy9TZXQgdGhlIG9wYWNpdHkgb2YgdGhlIHNwaWRlckxlZ3MgYmFjayB0byB0aGVpciBjb3JyZWN0IHZhbHVlCgkJLy8gVGhlIGFuaW1hdGlvbnMgYWJvdmUgb3ZlcnJpZGUgdGhpcyB1bnRpbCB0aGV5IGNvbXBsZXRlLgoJCS8vIElmIHRoZSBpbml0aWFsIG9wYWNpdHkgb2YgdGhlIHNwaWRlcmxlZ3MgaXNuJ3QgMCB0aGVuIHRoZXkgYXBwZWFyIGJlZm9yZSB0aGUgYW5pbWF0aW9uIHN0YXJ0cy4KCQlpZiAoTC5QYXRoLlNWRykgewoJCQl0aGlzLl9ncm91cC5fZm9yY2VMYXlvdXQoKTsKCgkJCWZvciAoaSA9IGNoaWxkTWFya2Vycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewoJCQkJbSA9IGNoaWxkTWFya2Vyc1tpXS5fc3BpZGVyTGVnOwoKCQkJCW0ub3B0aW9ucy5vcGFjaXR5ID0gMC41OwoJCQkJbS5fcGF0aC5zZXRBdHRyaWJ1dGUoJ3N0cm9rZS1vcGFjaXR5JywgMC41KTsKCQkJfQoJCX0KCgkJc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CgkJCWdyb3VwLl9hbmltYXRpb25FbmQoKTsKCQkJZ3JvdXAuZmlyZSgnc3BpZGVyZmllZCcpOwoJCX0sIDIwMCk7Cgl9LAoKCV9hbmltYXRpb25VbnNwaWRlcmZ5OiBmdW5jdGlvbiAoem9vbURldGFpbHMpIHsKCQl2YXIgZ3JvdXAgPSB0aGlzLl9ncm91cCwKCQkJbWFwID0gZ3JvdXAuX21hcCwKCQkJZmcgPSBncm91cC5fZmVhdHVyZUdyb3VwLAoJCQl0aGlzTGF5ZXJQb3MgPSB6b29tRGV0YWlscyA/IG1hcC5fbGF0TG5nVG9OZXdMYXllclBvaW50KHRoaXMuX2xhdGxuZywgem9vbURldGFpbHMuem9vbSwgem9vbURldGFpbHMuY2VudGVyKSA6IG1hcC5sYXRMbmdUb0xheWVyUG9pbnQodGhpcy5fbGF0bG5nKSwKCQkJY2hpbGRNYXJrZXJzID0gdGhpcy5nZXRBbGxDaGlsZE1hcmtlcnMoKSwKCQkJc3ZnID0gTC5QYXRoLlNWRyAmJiB0aGlzLlNWR19BTklNQVRJT04sCgkJCW0sIGksIGE7CgoJCWdyb3VwLl9hbmltYXRpb25TdGFydCgpOwoKCQkvL01ha2UgdXMgdmlzaWJsZSBhbmQgYnJpbmcgdGhlIGNoaWxkIG1hcmtlcnMgYmFjayBpbgoJCXRoaXMuc2V0T3BhY2l0eSgxKTsKCQlmb3IgKGkgPSBjaGlsZE1hcmtlcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKCQkJbSA9IGNoaWxkTWFya2Vyc1tpXTsKCgkJCS8vTWFya2VyIHdhcyBhZGRlZCB0byB1cyBhZnRlciB3ZSB3ZXJlIHNwaWRpZmllZAoJCQlpZiAoIW0uX3ByZVNwaWRlcmZ5TGF0bG5nKSB7CgkJCQljb250aW51ZTsKCQkJfQoKCQkJLy9GaXggdXAgdGhlIGxvY2F0aW9uIHRvIHRoZSByZWFsIG9uZQoJCQltLnNldExhdExuZyhtLl9wcmVTcGlkZXJmeUxhdGxuZyk7CgkJCWRlbGV0ZSBtLl9wcmVTcGlkZXJmeUxhdGxuZzsKCQkJLy9IYWNrIG92ZXJyaWRlIHRoZSBsb2NhdGlvbiB0byBiZSBvdXIgY2VudGVyCgkJCWlmIChtLnNldE9wYWNpdHkpIHsKCQkJCW0uX3NldFBvcyh0aGlzTGF5ZXJQb3MpOwoJCQkJbS5zZXRPcGFjaXR5KDApOwoJCQl9IGVsc2UgewoJCQkJZmcucmVtb3ZlTGF5ZXIobSk7CgkJCX0KCgkJCS8vQW5pbWF0ZSB0aGUgc3BpZGVyIGxlZ3MgYmFjayBpbgoJCQlpZiAoc3ZnKSB7CgkJCQlhID0gbS5fc3BpZGVyTGVnLl9wYXRoLmNoaWxkTm9kZXNbMF07CgkJCQlhLnNldEF0dHJpYnV0ZSgndG8nLCBhLmdldEF0dHJpYnV0ZSgnZnJvbScpKTsKCQkJCWEuc2V0QXR0cmlidXRlKCdmcm9tJywgMCk7CgkJCQlhLmJlZ2luRWxlbWVudCgpOwoKCQkJCWEgPSBtLl9zcGlkZXJMZWcuX3BhdGguY2hpbGROb2Rlc1sxXTsKCQkJCWEuc2V0QXR0cmlidXRlKCdmcm9tJywgMC41KTsKCQkJCWEuc2V0QXR0cmlidXRlKCd0bycsIDApOwoJCQkJYS5zZXRBdHRyaWJ1dGUoJ3N0cm9rZS1vcGFjaXR5JywgMCk7CgkJCQlhLmJlZ2luRWxlbWVudCgpOwoKCQkJCW0uX3NwaWRlckxlZy5fcGF0aC5zZXRBdHRyaWJ1dGUoJ3N0cm9rZS1vcGFjaXR5JywgMCk7CgkJCX0KCQl9CgoJCXNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewoJCQkvL0lmIHdlIGhhdmUgb25seSA8PSBvbmUgY2hpbGQgbGVmdCB0aGVuIHRoYXQgbWFya2VyIHdpbGwgYmUgc2hvd24gb24gdGhlIG1hcCBzbyBkb24ndCByZW1vdmUgaXQhCgkJCXZhciBzdGlsbFRoZXJlQ2hpbGRDb3VudCA9IDA7CgkJCWZvciAoaSA9IGNoaWxkTWFya2Vycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewoJCQkJbSA9IGNoaWxkTWFya2Vyc1tpXTsKCQkJCWlmIChtLl9zcGlkZXJMZWcpIHsKCQkJCQlzdGlsbFRoZXJlQ2hpbGRDb3VudCsrOwoJCQkJfQoJCQl9CgoKCQkJZm9yIChpID0gY2hpbGRNYXJrZXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CgkJCQltID0gY2hpbGRNYXJrZXJzW2ldOwoKCQkJCWlmICghbS5fc3BpZGVyTGVnKSB7IC8vSGFzIGFscmVhZHkgYmVlbiB1bnNwaWRlcmZpZWQKCQkJCQljb250aW51ZTsKCQkJCX0KCgoJCQkJaWYgKG0uc2V0T3BhY2l0eSkgewoJCQkJCW0uc2V0T3BhY2l0eSgxKTsKCQkJCQltLnNldFpJbmRleE9mZnNldCgwKTsKCQkJCX0KCgkJCQlpZiAoc3RpbGxUaGVyZUNoaWxkQ291bnQgPiAxKSB7CgkJCQkJZmcucmVtb3ZlTGF5ZXIobSk7CgkJCQl9CgoJCQkJbWFwLnJlbW92ZUxheWVyKG0uX3NwaWRlckxlZyk7CgkJCQlkZWxldGUgbS5fc3BpZGVyTGVnOwoJCQl9CgkJCWdyb3VwLl9hbmltYXRpb25FbmQoKTsKCQl9LCAyMDApOwoJfQp9KTsKCgpMLk1hcmtlckNsdXN0ZXJHcm91cC5pbmNsdWRlKHsKCS8vVGhlIE1hcmtlckNsdXN0ZXIgY3VycmVudGx5IHNwaWRlcmZpZWQgKGlmIGFueSkKCV9zcGlkZXJmaWVkOiBudWxsLAoKCV9zcGlkZXJmaWVyT25BZGQ6IGZ1bmN0aW9uICgpIHsKCQl0aGlzLl9tYXAub24oJ2NsaWNrJywgdGhpcy5fdW5zcGlkZXJmeVdyYXBwZXIsIHRoaXMpOwoKCQlpZiAodGhpcy5fbWFwLm9wdGlvbnMuem9vbUFuaW1hdGlvbikgewoJCQl0aGlzLl9tYXAub24oJ3pvb21zdGFydCcsIHRoaXMuX3Vuc3BpZGVyZnlab29tU3RhcnQsIHRoaXMpOwoJCX0KCQkvL0Jyb3dzZXJzIHdpdGhvdXQgem9vbUFuaW1hdGlvbiBvciBhIGJpZyB6b29tIGRvbid0IGZpcmUgem9vbXN0YXJ0CgkJdGhpcy5fbWFwLm9uKCd6b29tZW5kJywgdGhpcy5fbm9hbmltYXRpb25VbnNwaWRlcmZ5LCB0aGlzKTsKCgkJaWYgKEwuUGF0aC5TVkcgJiYgIUwuQnJvd3Nlci50b3VjaCkgewoJCQl0aGlzLl9tYXAuX2luaXRQYXRoUm9vdCgpOwoJCQkvL05lZWRzIHRvIGhhcHBlbiBpbiB0aGUgcGFnZWxvYWQsIG5vdCBhZnRlciwgb3IgYW5pbWF0aW9ucyBkb24ndCB3b3JrIGluIHdlYmtpdAoJCQkvLyAgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy84NDU1MjAwL3N2Zy1hbmltYXRlLXdpdGgtZHluYW1pY2FsbHktYWRkZWQtZWxlbWVudHMKCQkJLy9EaXNhYmxlIG9uIHRvdWNoIGJyb3dzZXJzIGFzIHRoZSBhbmltYXRpb24gbWVzc2VzIHVwIG9uIGEgdG91Y2ggem9vbSBhbmQgaXNuJ3QgdmVyeSBub3RpY2FibGUKCQl9Cgl9LAoKCV9zcGlkZXJmaWVyT25SZW1vdmU6IGZ1bmN0aW9uICgpIHsKCQl0aGlzLl9tYXAub2ZmKCdjbGljaycsIHRoaXMuX3Vuc3BpZGVyZnlXcmFwcGVyLCB0aGlzKTsKCQl0aGlzLl9tYXAub2ZmKCd6b29tc3RhcnQnLCB0aGlzLl91bnNwaWRlcmZ5Wm9vbVN0YXJ0LCB0aGlzKTsKCQl0aGlzLl9tYXAub2ZmKCd6b29tYW5pbScsIHRoaXMuX3Vuc3BpZGVyZnlab29tQW5pbSwgdGhpcyk7CgoJCXRoaXMuX3Vuc3BpZGVyZnkoKTsgLy9FbnN1cmUgdGhhdCBtYXJrZXJzIGFyZSBiYWNrIHdoZXJlIHRoZXkgc2hvdWxkIGJlCgl9LAoKCgkvL09uIHpvb20gc3RhcnQgd2UgYWRkIGEgem9vbWFuaW0gaGFuZGxlciBzbyB0aGF0IHdlIGFyZSBndWFyYW50ZWVkIHRvIGJlIGxhc3QgKGFmdGVyIG1hcmtlcnMgYXJlIGFuaW1hdGVkKQoJLy9UaGlzIG1lYW5zIHdlIGNhbiBkZWZpbmUgdGhlIGFuaW1hdGlvbiB0aGV5IGRvIHJhdGhlciB0aGFuIE1hcmtlcnMgZG9pbmcgYW4gYW5pbWF0aW9uIHRvIHRoZWlyIGFjdHVhbCBsb2NhdGlvbgoJX3Vuc3BpZGVyZnlab29tU3RhcnQ6IGZ1bmN0aW9uICgpIHsKCQlpZiAoIXRoaXMuX21hcCkgeyAvL01heSBoYXZlIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBtYXAgYnkgYSB6b29tRW5kIGhhbmRsZXIKCQkJcmV0dXJuOwoJCX0KCgkJdGhpcy5fbWFwLm9uKCd6b29tYW5pbScsIHRoaXMuX3Vuc3BpZGVyZnlab29tQW5pbSwgdGhpcyk7Cgl9LAoJX3Vuc3BpZGVyZnlab29tQW5pbTogZnVuY3Rpb24gKHpvb21EZXRhaWxzKSB7CgkJLy9XYWl0IHVudGlsIHRoZSBmaXJzdCB6b29tYW5pbSBhZnRlciB0aGUgdXNlciBoYXMgZmluaXNoZWQgdG91Y2gtem9vbWluZyBiZWZvcmUgcnVubmluZyB0aGUgYW5pbWF0aW9uCgkJaWYgKEwuRG9tVXRpbC5oYXNDbGFzcyh0aGlzLl9tYXAuX21hcFBhbmUsICdsZWFmbGV0LXRvdWNoaW5nJykpIHsKCQkJcmV0dXJuOwoJCX0KCgkJdGhpcy5fbWFwLm9mZignem9vbWFuaW0nLCB0aGlzLl91bnNwaWRlcmZ5Wm9vbUFuaW0sIHRoaXMpOwoJCXRoaXMuX3Vuc3BpZGVyZnkoem9vbURldGFpbHMpOwoJfSwKCgoJX3Vuc3BpZGVyZnlXcmFwcGVyOiBmdW5jdGlvbiAoKSB7CgkJLy8vIDxzdW1tYXJ5Pl91bnNwaWRlcmZ5IGJ1dCBwYXNzZXMgbm8gYXJndW1lbnRzPC9zdW1tYXJ5PgoJCXRoaXMuX3Vuc3BpZGVyZnkoKTsKCX0sCgoJX3Vuc3BpZGVyZnk6IGZ1bmN0aW9uICh6b29tRGV0YWlscykgewoJCWlmICh0aGlzLl9zcGlkZXJmaWVkKSB7CgkJCXRoaXMuX3NwaWRlcmZpZWQudW5zcGlkZXJmeSh6b29tRGV0YWlscyk7CgkJfQoJfSwKCglfbm9hbmltYXRpb25VbnNwaWRlcmZ5OiBmdW5jdGlvbiAoKSB7CgkJaWYgKHRoaXMuX3NwaWRlcmZpZWQpIHsKCQkJdGhpcy5fc3BpZGVyZmllZC5fbm9hbmltYXRpb25VbnNwaWRlcmZ5KCk7CgkJfQoJfSwKCgkvL0lmIHRoZSBnaXZlbiBsYXllciBpcyBjdXJyZW50bHkgYmVpbmcgc3BpZGVyZmllZCB0aGVuIHdlIHVuc3BpZGVyZnkgaXQgc28gaXQgaXNuJ3Qgb24gdGhlIG1hcCBhbnltb3JlIGV0YwoJX3Vuc3BpZGVyZnlMYXllcjogZnVuY3Rpb24gKGxheWVyKSB7CgkJaWYgKGxheWVyLl9zcGlkZXJMZWcpIHsKCQkJdGhpcy5fZmVhdHVyZUdyb3VwLnJlbW92ZUxheWVyKGxheWVyKTsKCgkJCWxheWVyLnNldE9wYWNpdHkoMSk7CgkJCS8vUG9zaXRpb24gd2lsbCBiZSBmaXhlZCB1cCBpbW1lZGlhdGVseSBpbiBfYW5pbWF0aW9uVW5zcGlkZXJmeQoJCQlsYXllci5zZXRaSW5kZXhPZmZzZXQoMCk7CgoJCQl0aGlzLl9tYXAucmVtb3ZlTGF5ZXIobGF5ZXIuX3NwaWRlckxlZyk7CgkJCWRlbGV0ZSBsYXllci5fc3BpZGVyTGVnOwoJCX0KCX0KfSk7CgoKfSh3aW5kb3csIGRvY3VtZW50KSk7]]></data>
	</file>
	<file>
	  <filename>/lib/js/leaflet-markercluster/leaflet.markercluster.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKIExlYWZsZXQubWFya2VyY2x1c3RlciwgUHJvdmlkZXMgQmVhdXRpZnVsIEFuaW1hdGVkIE1hcmtlciBDbHVzdGVyaW5nIGZ1bmN0aW9uYWxpdHkgZm9yIExlYWZsZXQsIGEgSlMgbGlicmFyeSBmb3IgaW50ZXJhY3RpdmUgbWFwcy4KIGh0dHBzOi8vZ2l0aHViLmNvbS9MZWFmbGV0L0xlYWZsZXQubWFya2VyY2x1c3RlcgogKGMpIDIwMTItMjAxMywgRGF2ZSBMZWF2ZXIsIHNtYXJ0cmFrCiovCiFmdW5jdGlvbih0LGUpe0wuTWFya2VyQ2x1c3Rlckdyb3VwPUwuRmVhdHVyZUdyb3VwLmV4dGVuZCh7b3B0aW9uczp7bWF4Q2x1c3RlclJhZGl1czo4MCxpY29uQ3JlYXRlRnVuY3Rpb246bnVsbCxzcGlkZXJmeU9uTWF4Wm9vbTohMCxzaG93Q292ZXJhZ2VPbkhvdmVyOiEwLHpvb21Ub0JvdW5kc09uQ2xpY2s6ITAsc2luZ2xlTWFya2VyTW9kZTohMSxkaXNhYmxlQ2x1c3RlcmluZ0F0Wm9vbTpudWxsLHJlbW92ZU91dHNpZGVWaXNpYmxlQm91bmRzOiEwLGFuaW1hdGVBZGRpbmdNYXJrZXJzOiExLHNwaWRlcmZ5RGlzdGFuY2VNdWx0aXBsaWVyOjEscG9seWdvbk9wdGlvbnM6e319LGluaXRpYWxpemU6ZnVuY3Rpb24odCl7TC5VdGlsLnNldE9wdGlvbnModGhpcyx0KSx0aGlzLm9wdGlvbnMuaWNvbkNyZWF0ZUZ1bmN0aW9ufHwodGhpcy5vcHRpb25zLmljb25DcmVhdGVGdW5jdGlvbj10aGlzLl9kZWZhdWx0SWNvbkNyZWF0ZUZ1bmN0aW9uKSx0aGlzLl9mZWF0dXJlR3JvdXA9TC5mZWF0dXJlR3JvdXAoKSx0aGlzLl9mZWF0dXJlR3JvdXAub24oTC5GZWF0dXJlR3JvdXAuRVZFTlRTLHRoaXMuX3Byb3BhZ2F0ZUV2ZW50LHRoaXMpLHRoaXMuX25vblBvaW50R3JvdXA9TC5mZWF0dXJlR3JvdXAoKSx0aGlzLl9ub25Qb2ludEdyb3VwLm9uKEwuRmVhdHVyZUdyb3VwLkVWRU5UUyx0aGlzLl9wcm9wYWdhdGVFdmVudCx0aGlzKSx0aGlzLl9pblpvb21BbmltYXRpb249MCx0aGlzLl9uZWVkc0NsdXN0ZXJpbmc9W10sdGhpcy5fbmVlZHNSZW1vdmluZz1bXSx0aGlzLl9jdXJyZW50U2hvd25Cb3VuZHM9bnVsbCx0aGlzLl9xdWV1ZT1bXX0sYWRkTGF5ZXI6ZnVuY3Rpb24odCl7aWYodCBpbnN0YW5jZW9mIEwuTGF5ZXJHcm91cCl7dmFyIGU9W107Zm9yKHZhciBpIGluIHQuX2xheWVycyllLnB1c2godC5fbGF5ZXJzW2ldKTtyZXR1cm4gdGhpcy5hZGRMYXllcnMoZSl9aWYoIXQuZ2V0TGF0TG5nKXJldHVybiB0aGlzLl9ub25Qb2ludEdyb3VwLmFkZExheWVyKHQpLHRoaXM7aWYoIXRoaXMuX21hcClyZXR1cm4gdGhpcy5fbmVlZHNDbHVzdGVyaW5nLnB1c2godCksdGhpcztpZih0aGlzLmhhc0xheWVyKHQpKXJldHVybiB0aGlzO3RoaXMuX3Vuc3BpZGVyZnkmJnRoaXMuX3Vuc3BpZGVyZnkoKSx0aGlzLl9hZGRMYXllcih0LHRoaXMuX21heFpvb20pO3ZhciBuPXQscz10aGlzLl9tYXAuZ2V0Wm9vbSgpO2lmKHQuX19wYXJlbnQpZm9yKDtuLl9fcGFyZW50Ll96b29tPj1zOyluPW4uX19wYXJlbnQ7cmV0dXJuIHRoaXMuX2N1cnJlbnRTaG93bkJvdW5kcy5jb250YWlucyhuLmdldExhdExuZygpKSYmKHRoaXMub3B0aW9ucy5hbmltYXRlQWRkaW5nTWFya2Vycz90aGlzLl9hbmltYXRpb25BZGRMYXllcih0LG4pOnRoaXMuX2FuaW1hdGlvbkFkZExheWVyTm9uQW5pbWF0ZWQodCxuKSksdGhpc30scmVtb3ZlTGF5ZXI6ZnVuY3Rpb24odCl7aWYodCBpbnN0YW5jZW9mIEwuTGF5ZXJHcm91cCl7dmFyIGU9W107Zm9yKHZhciBpIGluIHQuX2xheWVycyllLnB1c2godC5fbGF5ZXJzW2ldKTtyZXR1cm4gdGhpcy5yZW1vdmVMYXllcnMoZSl9cmV0dXJuIHQuZ2V0TGF0TG5nP3RoaXMuX21hcD90Ll9fcGFyZW50Pyh0aGlzLl91bnNwaWRlcmZ5JiYodGhpcy5fdW5zcGlkZXJmeSgpLHRoaXMuX3Vuc3BpZGVyZnlMYXllcih0KSksdGhpcy5fcmVtb3ZlTGF5ZXIodCwhMCksdGhpcy5fZmVhdHVyZUdyb3VwLmhhc0xheWVyKHQpJiYodGhpcy5fZmVhdHVyZUdyb3VwLnJlbW92ZUxheWVyKHQpLHQuc2V0T3BhY2l0eSYmdC5zZXRPcGFjaXR5KDEpKSx0aGlzKTp0aGlzOighdGhpcy5fYXJyYXlTcGxpY2UodGhpcy5fbmVlZHNDbHVzdGVyaW5nLHQpJiZ0aGlzLmhhc0xheWVyKHQpJiZ0aGlzLl9uZWVkc1JlbW92aW5nLnB1c2godCksdGhpcyk6KHRoaXMuX25vblBvaW50R3JvdXAucmVtb3ZlTGF5ZXIodCksdGhpcyl9LGFkZExheWVyczpmdW5jdGlvbih0KXt2YXIgZSxpLG4scz10aGlzLl9tYXAscj10aGlzLl9mZWF0dXJlR3JvdXAsbz10aGlzLl9ub25Qb2ludEdyb3VwO2ZvcihlPTAsaT10Lmxlbmd0aDtpPmU7ZSsrKWlmKG49dFtlXSxuLmdldExhdExuZyl7aWYoIXRoaXMuaGFzTGF5ZXIobikpaWYocyl7aWYodGhpcy5fYWRkTGF5ZXIobix0aGlzLl9tYXhab29tKSxuLl9fcGFyZW50JiYyPT09bi5fX3BhcmVudC5nZXRDaGlsZENvdW50KCkpe3ZhciBhPW4uX19wYXJlbnQuZ2V0QWxsQ2hpbGRNYXJrZXJzKCksaD1hWzBdPT09bj9hWzFdOmFbMF07ci5yZW1vdmVMYXllcihoKX19ZWxzZSB0aGlzLl9uZWVkc0NsdXN0ZXJpbmcucHVzaChuKX1lbHNlIG8uYWRkTGF5ZXIobik7cmV0dXJuIHMmJihyLmVhY2hMYXllcihmdW5jdGlvbih0KXt0IGluc3RhbmNlb2YgTC5NYXJrZXJDbHVzdGVyJiZ0Ll9pY29uTmVlZHNVcGRhdGUmJnQuX3VwZGF0ZUljb24oKX0pLHRoaXMuX3RvcENsdXN0ZXJMZXZlbC5fcmVjdXJzaXZlbHlBZGRDaGlsZHJlblRvTWFwKG51bGwsdGhpcy5fem9vbSx0aGlzLl9jdXJyZW50U2hvd25Cb3VuZHMpKSx0aGlzfSxyZW1vdmVMYXllcnM6ZnVuY3Rpb24odCl7dmFyIGUsaSxuLHM9dGhpcy5fZmVhdHVyZUdyb3VwLHI9dGhpcy5fbm9uUG9pbnRHcm91cDtpZighdGhpcy5fbWFwKXtmb3IoZT0wLGk9dC5sZW5ndGg7aT5lO2UrKyluPXRbZV0sdGhpcy5fYXJyYXlTcGxpY2UodGhpcy5fbmVlZHNDbHVzdGVyaW5nLG4pLHIucmVtb3ZlTGF5ZXIobik7cmV0dXJuIHRoaXN9Zm9yKGU9MCxpPXQubGVuZ3RoO2k+ZTtlKyspbj10W2VdLG4uX19wYXJlbnQ/KHRoaXMuX3JlbW92ZUxheWVyKG4sITAsITApLHMuaGFzTGF5ZXIobikmJihzLnJlbW92ZUxheWVyKG4pLG4uc2V0T3BhY2l0eSYmbi5zZXRPcGFjaXR5KDEpKSk6ci5yZW1vdmVMYXllcihuKTtyZXR1cm4gdGhpcy5fdG9wQ2x1c3RlckxldmVsLl9yZWN1cnNpdmVseUFkZENoaWxkcmVuVG9NYXAobnVsbCx0aGlzLl96b29tLHRoaXMuX2N1cnJlbnRTaG93bkJvdW5kcykscy5lYWNoTGF5ZXIoZnVuY3Rpb24odCl7dCBpbnN0YW5jZW9mIEwuTWFya2VyQ2x1c3RlciYmdC5fdXBkYXRlSWNvbigpfSksdGhpc30sY2xlYXJMYXllcnM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWFwfHwodGhpcy5fbmVlZHNDbHVzdGVyaW5nPVtdLGRlbGV0ZSB0aGlzLl9ncmlkQ2x1c3RlcnMsZGVsZXRlIHRoaXMuX2dyaWRVbmNsdXN0ZXJlZCksdGhpcy5fbm9hbmltYXRpb25VbnNwaWRlcmZ5JiZ0aGlzLl9ub2FuaW1hdGlvblVuc3BpZGVyZnkoKSx0aGlzLl9mZWF0dXJlR3JvdXAuY2xlYXJMYXllcnMoKSx0aGlzLl9ub25Qb2ludEdyb3VwLmNsZWFyTGF5ZXJzKCksdGhpcy5lYWNoTGF5ZXIoZnVuY3Rpb24odCl7ZGVsZXRlIHQuX19wYXJlbnR9KSx0aGlzLl9tYXAmJnRoaXMuX2dlbmVyYXRlSW5pdGlhbENsdXN0ZXJzKCksdGhpc30sZ2V0Qm91bmRzOmZ1bmN0aW9uKCl7dmFyIHQ9bmV3IEwuTGF0TG5nQm91bmRzO2lmKHRoaXMuX3RvcENsdXN0ZXJMZXZlbCl0LmV4dGVuZCh0aGlzLl90b3BDbHVzdGVyTGV2ZWwuX2JvdW5kcyk7ZWxzZSBmb3IodmFyIGU9dGhpcy5fbmVlZHNDbHVzdGVyaW5nLmxlbmd0aC0xO2U+PTA7ZS0tKXQuZXh0ZW5kKHRoaXMuX25lZWRzQ2x1c3RlcmluZ1tlXS5nZXRMYXRMbmcoKSk7cmV0dXJuIHQuZXh0ZW5kKHRoaXMuX25vblBvaW50R3JvdXAuZ2V0Qm91bmRzKCkpLHR9LGVhY2hMYXllcjpmdW5jdGlvbih0LGUpe3ZhciBpLG49dGhpcy5fbmVlZHNDbHVzdGVyaW5nLnNsaWNlKCk7Zm9yKHRoaXMuX3RvcENsdXN0ZXJMZXZlbCYmdGhpcy5fdG9wQ2x1c3RlckxldmVsLmdldEFsbENoaWxkTWFya2VycyhuKSxpPW4ubGVuZ3RoLTE7aT49MDtpLS0pdC5jYWxsKGUsbltpXSk7dGhpcy5fbm9uUG9pbnRHcm91cC5lYWNoTGF5ZXIodCxlKX0sZ2V0TGF5ZXJzOmZ1bmN0aW9uKCl7dmFyIHQ9W107cmV0dXJuIHRoaXMuZWFjaExheWVyKGZ1bmN0aW9uKGUpe3QucHVzaChlKX0pLHR9LGdldExheWVyOmZ1bmN0aW9uKHQpe3ZhciBlPW51bGw7cmV0dXJuIHRoaXMuZWFjaExheWVyKGZ1bmN0aW9uKGkpe0wuc3RhbXAoaSk9PT10JiYoZT1pKX0pLGV9LGhhc0xheWVyOmZ1bmN0aW9uKHQpe2lmKCF0KXJldHVybiExO3ZhciBlLGk9dGhpcy5fbmVlZHNDbHVzdGVyaW5nO2ZvcihlPWkubGVuZ3RoLTE7ZT49MDtlLS0paWYoaVtlXT09PXQpcmV0dXJuITA7Zm9yKGk9dGhpcy5fbmVlZHNSZW1vdmluZyxlPWkubGVuZ3RoLTE7ZT49MDtlLS0paWYoaVtlXT09PXQpcmV0dXJuITE7cmV0dXJuISghdC5fX3BhcmVudHx8dC5fX3BhcmVudC5fZ3JvdXAhPT10aGlzKXx8dGhpcy5fbm9uUG9pbnRHcm91cC5oYXNMYXllcih0KX0sem9vbVRvU2hvd0xheWVyOmZ1bmN0aW9uKHQsZSl7dmFyIGk9ZnVuY3Rpb24oKXtpZigodC5faWNvbnx8dC5fX3BhcmVudC5faWNvbikmJiF0aGlzLl9pblpvb21BbmltYXRpb24paWYodGhpcy5fbWFwLm9mZigibW92ZWVuZCIsaSx0aGlzKSx0aGlzLm9mZigiYW5pbWF0aW9uZW5kIixpLHRoaXMpLHQuX2ljb24pZSgpO2Vsc2UgaWYodC5fX3BhcmVudC5faWNvbil7dmFyIG49ZnVuY3Rpb24oKXt0aGlzLm9mZigic3BpZGVyZmllZCIsbix0aGlzKSxlKCl9O3RoaXMub24oInNwaWRlcmZpZWQiLG4sdGhpcyksdC5fX3BhcmVudC5zcGlkZXJmeSgpfX07dC5faWNvbiYmdGhpcy5fbWFwLmdldEJvdW5kcygpLmNvbnRhaW5zKHQuZ2V0TGF0TG5nKCkpP2UoKTp0Ll9fcGFyZW50Ll96b29tPHRoaXMuX21hcC5nZXRab29tKCk/KHRoaXMuX21hcC5vbigibW92ZWVuZCIsaSx0aGlzKSx0aGlzLl9tYXAucGFuVG8odC5nZXRMYXRMbmcoKSkpOih0aGlzLl9tYXAub24oIm1vdmVlbmQiLGksdGhpcyksdGhpcy5vbigiYW5pbWF0aW9uZW5kIixpLHRoaXMpLHRoaXMuX21hcC5zZXRWaWV3KHQuZ2V0TGF0TG5nKCksdC5fX3BhcmVudC5fem9vbSsxKSx0Ll9fcGFyZW50Lnpvb21Ub0JvdW5kcygpKX0sb25BZGQ6ZnVuY3Rpb24odCl7dGhpcy5fbWFwPXQ7dmFyIGUsaSxuO2lmKCFpc0Zpbml0ZSh0aGlzLl9tYXAuZ2V0TWF4Wm9vbSgpKSl0aHJvdyJNYXAgaGFzIG5vIG1heFpvb20gc3BlY2lmaWVkIjtmb3IodGhpcy5fZmVhdHVyZUdyb3VwLm9uQWRkKHQpLHRoaXMuX25vblBvaW50R3JvdXAub25BZGQodCksdGhpcy5fZ3JpZENsdXN0ZXJzfHx0aGlzLl9nZW5lcmF0ZUluaXRpYWxDbHVzdGVycygpLGU9MCxpPXRoaXMuX25lZWRzUmVtb3ZpbmcubGVuZ3RoO2k+ZTtlKyspbj10aGlzLl9uZWVkc1JlbW92aW5nW2VdLHRoaXMuX3JlbW92ZUxheWVyKG4sITApO2Zvcih0aGlzLl9uZWVkc1JlbW92aW5nPVtdLGU9MCxpPXRoaXMuX25lZWRzQ2x1c3RlcmluZy5sZW5ndGg7aT5lO2UrKyluPXRoaXMuX25lZWRzQ2x1c3RlcmluZ1tlXSxuLmdldExhdExuZz9uLl9fcGFyZW50fHx0aGlzLl9hZGRMYXllcihuLHRoaXMuX21heFpvb20pOnRoaXMuX2ZlYXR1cmVHcm91cC5hZGRMYXllcihuKTt0aGlzLl9uZWVkc0NsdXN0ZXJpbmc9W10sdGhpcy5fbWFwLm9uKCJ6b29tZW5kIix0aGlzLl96b29tRW5kLHRoaXMpLHRoaXMuX21hcC5vbigibW92ZWVuZCIsdGhpcy5fbW92ZUVuZCx0aGlzKSx0aGlzLl9zcGlkZXJmaWVyT25BZGQmJnRoaXMuX3NwaWRlcmZpZXJPbkFkZCgpLHRoaXMuX2JpbmRFdmVudHMoKSx0aGlzLl96b29tPXRoaXMuX21hcC5nZXRab29tKCksdGhpcy5fY3VycmVudFNob3duQm91bmRzPXRoaXMuX2dldEV4cGFuZGVkVmlzaWJsZUJvdW5kcygpLHRoaXMuX3RvcENsdXN0ZXJMZXZlbC5fcmVjdXJzaXZlbHlBZGRDaGlsZHJlblRvTWFwKG51bGwsdGhpcy5fem9vbSx0aGlzLl9jdXJyZW50U2hvd25Cb3VuZHMpfSxvblJlbW92ZTpmdW5jdGlvbih0KXt0Lm9mZigiem9vbWVuZCIsdGhpcy5fem9vbUVuZCx0aGlzKSx0Lm9mZigibW92ZWVuZCIsdGhpcy5fbW92ZUVuZCx0aGlzKSx0aGlzLl91bmJpbmRFdmVudHMoKSx0aGlzLl9tYXAuX21hcFBhbmUuY2xhc3NOYW1lPXRoaXMuX21hcC5fbWFwUGFuZS5jbGFzc05hbWUucmVwbGFjZSgiIGxlYWZsZXQtY2x1c3Rlci1hbmltIiwiIiksdGhpcy5fc3BpZGVyZmllck9uUmVtb3ZlJiZ0aGlzLl9zcGlkZXJmaWVyT25SZW1vdmUoKSx0aGlzLl9oaWRlQ292ZXJhZ2UoKSx0aGlzLl9mZWF0dXJlR3JvdXAub25SZW1vdmUodCksdGhpcy5fbm9uUG9pbnRHcm91cC5vblJlbW92ZSh0KSx0aGlzLl9mZWF0dXJlR3JvdXAuY2xlYXJMYXllcnMoKSx0aGlzLl9tYXA9bnVsbH0sZ2V0VmlzaWJsZVBhcmVudDpmdW5jdGlvbih0KXtmb3IodmFyIGU9dDtlJiYhZS5faWNvbjspZT1lLl9fcGFyZW50O3JldHVybiBlfHxudWxsfSxfYXJyYXlTcGxpY2U6ZnVuY3Rpb24odCxlKXtmb3IodmFyIGk9dC5sZW5ndGgtMTtpPj0wO2ktLSlpZih0W2ldPT09ZSlyZXR1cm4gdC5zcGxpY2UoaSwxKSwhMH0sX3JlbW92ZUxheWVyOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbj10aGlzLl9ncmlkQ2x1c3RlcnMscz10aGlzLl9ncmlkVW5jbHVzdGVyZWQscj10aGlzLl9mZWF0dXJlR3JvdXAsbz10aGlzLl9tYXA7aWYoZSlmb3IodmFyIGE9dGhpcy5fbWF4Wm9vbTthPj0wJiZzW2FdLnJlbW92ZU9iamVjdCh0LG8ucHJvamVjdCh0LmdldExhdExuZygpLGEpKTthLS0pO3ZhciBoLF89dC5fX3BhcmVudCx1PV8uX21hcmtlcnM7Zm9yKHRoaXMuX2FycmF5U3BsaWNlKHUsdCk7XyYmKF8uX2NoaWxkQ291bnQtLSwhKF8uX3pvb208MCkpOyllJiZfLl9jaGlsZENvdW50PD0xPyhoPV8uX21hcmtlcnNbMF09PT10P18uX21hcmtlcnNbMV06Xy5fbWFya2Vyc1swXSxuW18uX3pvb21dLnJlbW92ZU9iamVjdChfLG8ucHJvamVjdChfLl9jTGF0TG5nLF8uX3pvb20pKSxzW18uX3pvb21dLmFkZE9iamVjdChoLG8ucHJvamVjdChoLmdldExhdExuZygpLF8uX3pvb20pKSx0aGlzLl9hcnJheVNwbGljZShfLl9fcGFyZW50Ll9jaGlsZENsdXN0ZXJzLF8pLF8uX19wYXJlbnQuX21hcmtlcnMucHVzaChoKSxoLl9fcGFyZW50PV8uX19wYXJlbnQsXy5faWNvbiYmKHIucmVtb3ZlTGF5ZXIoXyksaXx8ci5hZGRMYXllcihoKSkpOihfLl9yZWNhbGN1bGF0ZUJvdW5kcygpLGkmJl8uX2ljb258fF8uX3VwZGF0ZUljb24oKSksXz1fLl9fcGFyZW50O2RlbGV0ZSB0Ll9fcGFyZW50fSxfaXNPcklzUGFyZW50OmZ1bmN0aW9uKHQsZSl7Zm9yKDtlOyl7aWYodD09PWUpcmV0dXJuITA7ZT1lLnBhcmVudE5vZGV9cmV0dXJuITF9LF9wcm9wYWdhdGVFdmVudDpmdW5jdGlvbih0KXtpZih0LmxheWVyIGluc3RhbmNlb2YgTC5NYXJrZXJDbHVzdGVyKXtpZih0Lm9yaWdpbmFsRXZlbnQmJnRoaXMuX2lzT3JJc1BhcmVudCh0LmxheWVyLl9pY29uLHQub3JpZ2luYWxFdmVudC5yZWxhdGVkVGFyZ2V0KSlyZXR1cm47dC50eXBlPSJjbHVzdGVyIit0LnR5cGV9dGhpcy5maXJlKHQudHlwZSx0KX0sX2RlZmF1bHRJY29uQ3JlYXRlRnVuY3Rpb246ZnVuY3Rpb24odCl7dmFyIGU9dC5nZXRDaGlsZENvdW50KCksaT0iIG1hcmtlci1jbHVzdGVyLSI7cmV0dXJuIGkrPTEwPmU/InNtYWxsIjoxMDA+ZT8ibWVkaXVtIjoibGFyZ2UiLG5ldyBMLkRpdkljb24oe2h0bWw6IjxkaXY+PHNwYW4+IitlKyI8L3NwYW4+PC9kaXY+IixjbGFzc05hbWU6Im1hcmtlci1jbHVzdGVyIitpLGljb25TaXplOm5ldyBMLlBvaW50KDQwLDQwKX0pfSxfYmluZEV2ZW50czpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX21hcCxlPXRoaXMub3B0aW9ucy5zcGlkZXJmeU9uTWF4Wm9vbSxpPXRoaXMub3B0aW9ucy5zaG93Q292ZXJhZ2VPbkhvdmVyLG49dGhpcy5vcHRpb25zLnpvb21Ub0JvdW5kc09uQ2xpY2s7KGV8fG4pJiZ0aGlzLm9uKCJjbHVzdGVyY2xpY2siLHRoaXMuX3pvb21PclNwaWRlcmZ5LHRoaXMpLGkmJih0aGlzLm9uKCJjbHVzdGVybW91c2VvdmVyIix0aGlzLl9zaG93Q292ZXJhZ2UsdGhpcyksdGhpcy5vbigiY2x1c3Rlcm1vdXNlb3V0Iix0aGlzLl9oaWRlQ292ZXJhZ2UsdGhpcyksdC5vbigiem9vbWVuZCIsdGhpcy5faGlkZUNvdmVyYWdlLHRoaXMpKX0sX3pvb21PclNwaWRlcmZ5OmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX21hcDtlLmdldE1heFpvb20oKT09PWUuZ2V0Wm9vbSgpP3RoaXMub3B0aW9ucy5zcGlkZXJmeU9uTWF4Wm9vbSYmdC5sYXllci5zcGlkZXJmeSgpOnRoaXMub3B0aW9ucy56b29tVG9Cb3VuZHNPbkNsaWNrJiZ0LmxheWVyLnpvb21Ub0JvdW5kcygpLHQub3JpZ2luYWxFdmVudCYmMTM9PT10Lm9yaWdpbmFsRXZlbnQua2V5Q29kZSYmZS5fY29udGFpbmVyLmZvY3VzKCl9LF9zaG93Q292ZXJhZ2U6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fbWFwO3RoaXMuX2luWm9vbUFuaW1hdGlvbnx8KHRoaXMuX3Nob3duUG9seWdvbiYmZS5yZW1vdmVMYXllcih0aGlzLl9zaG93blBvbHlnb24pLHQubGF5ZXIuZ2V0Q2hpbGRDb3VudCgpPjImJnQubGF5ZXIhPT10aGlzLl9zcGlkZXJmaWVkJiYodGhpcy5fc2hvd25Qb2x5Z29uPW5ldyBMLlBvbHlnb24odC5sYXllci5nZXRDb252ZXhIdWxsKCksdGhpcy5vcHRpb25zLnBvbHlnb25PcHRpb25zKSxlLmFkZExheWVyKHRoaXMuX3Nob3duUG9seWdvbikpKX0sX2hpZGVDb3ZlcmFnZTpmdW5jdGlvbigpe3RoaXMuX3Nob3duUG9seWdvbiYmKHRoaXMuX21hcC5yZW1vdmVMYXllcih0aGlzLl9zaG93blBvbHlnb24pLHRoaXMuX3Nob3duUG9seWdvbj1udWxsKX0sX3VuYmluZEV2ZW50czpmdW5jdGlvbigpe3ZhciB0PXRoaXMub3B0aW9ucy5zcGlkZXJmeU9uTWF4Wm9vbSxlPXRoaXMub3B0aW9ucy5zaG93Q292ZXJhZ2VPbkhvdmVyLGk9dGhpcy5vcHRpb25zLnpvb21Ub0JvdW5kc09uQ2xpY2ssbj10aGlzLl9tYXA7KHR8fGkpJiZ0aGlzLm9mZigiY2x1c3RlcmNsaWNrIix0aGlzLl96b29tT3JTcGlkZXJmeSx0aGlzKSxlJiYodGhpcy5vZmYoImNsdXN0ZXJtb3VzZW92ZXIiLHRoaXMuX3Nob3dDb3ZlcmFnZSx0aGlzKSx0aGlzLm9mZigiY2x1c3Rlcm1vdXNlb3V0Iix0aGlzLl9oaWRlQ292ZXJhZ2UsdGhpcyksbi5vZmYoInpvb21lbmQiLHRoaXMuX2hpZGVDb3ZlcmFnZSx0aGlzKSl9LF96b29tRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbWFwJiYodGhpcy5fbWVyZ2VTcGxpdENsdXN0ZXJzKCksdGhpcy5fem9vbT10aGlzLl9tYXAuX3pvb20sdGhpcy5fY3VycmVudFNob3duQm91bmRzPXRoaXMuX2dldEV4cGFuZGVkVmlzaWJsZUJvdW5kcygpKX0sX21vdmVFbmQ6ZnVuY3Rpb24oKXtpZighdGhpcy5faW5ab29tQW5pbWF0aW9uKXt2YXIgdD10aGlzLl9nZXRFeHBhbmRlZFZpc2libGVCb3VuZHMoKTt0aGlzLl90b3BDbHVzdGVyTGV2ZWwuX3JlY3Vyc2l2ZWx5UmVtb3ZlQ2hpbGRyZW5Gcm9tTWFwKHRoaXMuX2N1cnJlbnRTaG93bkJvdW5kcyx0aGlzLl96b29tLHQpLHRoaXMuX3RvcENsdXN0ZXJMZXZlbC5fcmVjdXJzaXZlbHlBZGRDaGlsZHJlblRvTWFwKG51bGwsdGhpcy5fbWFwLl96b29tLHQpLHRoaXMuX2N1cnJlbnRTaG93bkJvdW5kcz10fX0sX2dlbmVyYXRlSW5pdGlhbENsdXN0ZXJzOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fbWFwLmdldE1heFpvb20oKSxlPXRoaXMub3B0aW9ucy5tYXhDbHVzdGVyUmFkaXVzO3RoaXMub3B0aW9ucy5kaXNhYmxlQ2x1c3RlcmluZ0F0Wm9vbSYmKHQ9dGhpcy5vcHRpb25zLmRpc2FibGVDbHVzdGVyaW5nQXRab29tLTEpLHRoaXMuX21heFpvb209dCx0aGlzLl9ncmlkQ2x1c3RlcnM9e30sdGhpcy5fZ3JpZFVuY2x1c3RlcmVkPXt9O2Zvcih2YXIgaT10O2k+PTA7aS0tKXRoaXMuX2dyaWRDbHVzdGVyc1tpXT1uZXcgTC5EaXN0YW5jZUdyaWQoZSksdGhpcy5fZ3JpZFVuY2x1c3RlcmVkW2ldPW5ldyBMLkRpc3RhbmNlR3JpZChlKTt0aGlzLl90b3BDbHVzdGVyTGV2ZWw9bmV3IEwuTWFya2VyQ2x1c3Rlcih0aGlzLC0xKX0sX2FkZExheWVyOmZ1bmN0aW9uKHQsZSl7dmFyIGksbixzPXRoaXMuX2dyaWRDbHVzdGVycyxyPXRoaXMuX2dyaWRVbmNsdXN0ZXJlZDtmb3IodGhpcy5vcHRpb25zLnNpbmdsZU1hcmtlck1vZGUmJih0Lm9wdGlvbnMuaWNvbj10aGlzLm9wdGlvbnMuaWNvbkNyZWF0ZUZ1bmN0aW9uKHtnZXRDaGlsZENvdW50OmZ1bmN0aW9uKCl7cmV0dXJuIDF9LGdldEFsbENoaWxkTWFya2VyczpmdW5jdGlvbigpe3JldHVyblt0XX19KSk7ZT49MDtlLS0pe2k9dGhpcy5fbWFwLnByb2plY3QodC5nZXRMYXRMbmcoKSxlKTt2YXIgbz1zW2VdLmdldE5lYXJPYmplY3QoaSk7aWYobylyZXR1cm4gby5fYWRkQ2hpbGQodCksdC5fX3BhcmVudD1vLHZvaWQgMDtpZihvPXJbZV0uZ2V0TmVhck9iamVjdChpKSl7dmFyIGE9by5fX3BhcmVudDthJiZ0aGlzLl9yZW1vdmVMYXllcihvLCExKTt2YXIgaD1uZXcgTC5NYXJrZXJDbHVzdGVyKHRoaXMsZSxvLHQpO3NbZV0uYWRkT2JqZWN0KGgsdGhpcy5fbWFwLnByb2plY3QoaC5fY0xhdExuZyxlKSksby5fX3BhcmVudD1oLHQuX19wYXJlbnQ9aDt2YXIgXz1oO2ZvcihuPWUtMTtuPmEuX3pvb207bi0tKV89bmV3IEwuTWFya2VyQ2x1c3Rlcih0aGlzLG4sXyksc1tuXS5hZGRPYmplY3QoXyx0aGlzLl9tYXAucHJvamVjdChvLmdldExhdExuZygpLG4pKTtmb3IoYS5fYWRkQ2hpbGQoXyksbj1lO24+PTAmJnJbbl0ucmVtb3ZlT2JqZWN0KG8sdGhpcy5fbWFwLnByb2plY3Qoby5nZXRMYXRMbmcoKSxuKSk7bi0tKTtyZXR1cm59cltlXS5hZGRPYmplY3QodCxpKX10aGlzLl90b3BDbHVzdGVyTGV2ZWwuX2FkZENoaWxkKHQpLHQuX19wYXJlbnQ9dGhpcy5fdG9wQ2x1c3RlckxldmVsfSxfZW5xdWV1ZTpmdW5jdGlvbih0KXt0aGlzLl9xdWV1ZS5wdXNoKHQpLHRoaXMuX3F1ZXVlVGltZW91dHx8KHRoaXMuX3F1ZXVlVGltZW91dD1zZXRUaW1lb3V0KEwuYmluZCh0aGlzLl9wcm9jZXNzUXVldWUsdGhpcyksMzAwKSl9LF9wcm9jZXNzUXVldWU6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9MDt0PHRoaXMuX3F1ZXVlLmxlbmd0aDt0KyspdGhpcy5fcXVldWVbdF0uY2FsbCh0aGlzKTt0aGlzLl9xdWV1ZS5sZW5ndGg9MCxjbGVhclRpbWVvdXQodGhpcy5fcXVldWVUaW1lb3V0KSx0aGlzLl9xdWV1ZVRpbWVvdXQ9bnVsbH0sX21lcmdlU3BsaXRDbHVzdGVyczpmdW5jdGlvbigpe3RoaXMuX3Byb2Nlc3NRdWV1ZSgpLHRoaXMuX3pvb208dGhpcy5fbWFwLl96b29tJiZ0aGlzLl9jdXJyZW50U2hvd25Cb3VuZHMuY29udGFpbnModGhpcy5fZ2V0RXhwYW5kZWRWaXNpYmxlQm91bmRzKCkpPyh0aGlzLl9hbmltYXRpb25TdGFydCgpLHRoaXMuX3RvcENsdXN0ZXJMZXZlbC5fcmVjdXJzaXZlbHlSZW1vdmVDaGlsZHJlbkZyb21NYXAodGhpcy5fY3VycmVudFNob3duQm91bmRzLHRoaXMuX3pvb20sdGhpcy5fZ2V0RXhwYW5kZWRWaXNpYmxlQm91bmRzKCkpLHRoaXMuX2FuaW1hdGlvblpvb21Jbih0aGlzLl96b29tLHRoaXMuX21hcC5fem9vbSkpOnRoaXMuX3pvb20+dGhpcy5fbWFwLl96b29tPyh0aGlzLl9hbmltYXRpb25TdGFydCgpLHRoaXMuX2FuaW1hdGlvblpvb21PdXQodGhpcy5fem9vbSx0aGlzLl9tYXAuX3pvb20pKTp0aGlzLl9tb3ZlRW5kKCl9LF9nZXRFeHBhbmRlZFZpc2libGVCb3VuZHM6ZnVuY3Rpb24oKXtpZighdGhpcy5vcHRpb25zLnJlbW92ZU91dHNpZGVWaXNpYmxlQm91bmRzKXJldHVybiB0aGlzLmdldEJvdW5kcygpO3ZhciB0PXRoaXMuX21hcCxlPXQuZ2V0Qm91bmRzKCksaT1lLl9zb3V0aFdlc3Qsbj1lLl9ub3J0aEVhc3Qscz1MLkJyb3dzZXIubW9iaWxlPzA6TWF0aC5hYnMoaS5sYXQtbi5sYXQpLHI9TC5Ccm93c2VyLm1vYmlsZT8wOk1hdGguYWJzKGkubG5nLW4ubG5nKTtyZXR1cm4gbmV3IEwuTGF0TG5nQm91bmRzKG5ldyBMLkxhdExuZyhpLmxhdC1zLGkubG5nLXIsITApLG5ldyBMLkxhdExuZyhuLmxhdCtzLG4ubG5nK3IsITApKX0sX2FuaW1hdGlvbkFkZExheWVyTm9uQW5pbWF0ZWQ6ZnVuY3Rpb24odCxlKXtpZihlPT09dCl0aGlzLl9mZWF0dXJlR3JvdXAuYWRkTGF5ZXIodCk7ZWxzZSBpZigyPT09ZS5fY2hpbGRDb3VudCl7ZS5fYWRkVG9NYXAoKTt2YXIgaT1lLmdldEFsbENoaWxkTWFya2VycygpO3RoaXMuX2ZlYXR1cmVHcm91cC5yZW1vdmVMYXllcihpWzBdKSx0aGlzLl9mZWF0dXJlR3JvdXAucmVtb3ZlTGF5ZXIoaVsxXSl9ZWxzZSBlLl91cGRhdGVJY29uKCl9fSksTC5NYXJrZXJDbHVzdGVyR3JvdXAuaW5jbHVkZShMLkRvbVV0aWwuVFJBTlNJVElPTj97X2FuaW1hdGlvblN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbWFwLl9tYXBQYW5lLmNsYXNzTmFtZSs9IiBsZWFmbGV0LWNsdXN0ZXItYW5pbSIsdGhpcy5faW5ab29tQW5pbWF0aW9uKyt9LF9hbmltYXRpb25FbmQ6ZnVuY3Rpb24oKXt0aGlzLl9tYXAmJih0aGlzLl9tYXAuX21hcFBhbmUuY2xhc3NOYW1lPXRoaXMuX21hcC5fbWFwUGFuZS5jbGFzc05hbWUucmVwbGFjZSgiIGxlYWZsZXQtY2x1c3Rlci1hbmltIiwiIikpLHRoaXMuX2luWm9vbUFuaW1hdGlvbi0tLHRoaXMuZmlyZSgiYW5pbWF0aW9uZW5kIil9LF9hbmltYXRpb25ab29tSW46ZnVuY3Rpb24odCxlKXt2YXIgaSxuPXRoaXMuX2dldEV4cGFuZGVkVmlzaWJsZUJvdW5kcygpLHM9dGhpcy5fZmVhdHVyZUdyb3VwO3RoaXMuX3RvcENsdXN0ZXJMZXZlbC5fcmVjdXJzaXZlbHkobix0LDAsZnVuY3Rpb24ocil7dmFyIG8sYT1yLl9sYXRsbmcsaD1yLl9tYXJrZXJzO2ZvcihuLmNvbnRhaW5zKGEpfHwoYT1udWxsKSxyLl9pc1NpbmdsZVBhcmVudCgpJiZ0KzE9PT1lPyhzLnJlbW92ZUxheWVyKHIpLHIuX3JlY3Vyc2l2ZWx5QWRkQ2hpbGRyZW5Ub01hcChudWxsLGUsbikpOihyLnNldE9wYWNpdHkoMCksci5fcmVjdXJzaXZlbHlBZGRDaGlsZHJlblRvTWFwKGEsZSxuKSksaT1oLmxlbmd0aC0xO2k+PTA7aS0tKW89aFtpXSxuLmNvbnRhaW5zKG8uX2xhdGxuZyl8fHMucmVtb3ZlTGF5ZXIobyl9KSx0aGlzLl9mb3JjZUxheW91dCgpLHRoaXMuX3RvcENsdXN0ZXJMZXZlbC5fcmVjdXJzaXZlbHlCZWNvbWVWaXNpYmxlKG4sZSkscy5lYWNoTGF5ZXIoZnVuY3Rpb24odCl7dCBpbnN0YW5jZW9mIEwuTWFya2VyQ2x1c3Rlcnx8IXQuX2ljb258fHQuc2V0T3BhY2l0eSgxKX0pLHRoaXMuX3RvcENsdXN0ZXJMZXZlbC5fcmVjdXJzaXZlbHkobix0LGUsZnVuY3Rpb24odCl7dC5fcmVjdXJzaXZlbHlSZXN0b3JlQ2hpbGRQb3NpdGlvbnMoZSl9KSx0aGlzLl9lbnF1ZXVlKGZ1bmN0aW9uKCl7dGhpcy5fdG9wQ2x1c3RlckxldmVsLl9yZWN1cnNpdmVseShuLHQsMCxmdW5jdGlvbih0KXtzLnJlbW92ZUxheWVyKHQpLHQuc2V0T3BhY2l0eSgxKX0pLHRoaXMuX2FuaW1hdGlvbkVuZCgpfSl9LF9hbmltYXRpb25ab29tT3V0OmZ1bmN0aW9uKHQsZSl7dGhpcy5fYW5pbWF0aW9uWm9vbU91dFNpbmdsZSh0aGlzLl90b3BDbHVzdGVyTGV2ZWwsdC0xLGUpLHRoaXMuX3RvcENsdXN0ZXJMZXZlbC5fcmVjdXJzaXZlbHlBZGRDaGlsZHJlblRvTWFwKG51bGwsZSx0aGlzLl9nZXRFeHBhbmRlZFZpc2libGVCb3VuZHMoKSksdGhpcy5fdG9wQ2x1c3RlckxldmVsLl9yZWN1cnNpdmVseVJlbW92ZUNoaWxkcmVuRnJvbU1hcCh0aGlzLl9jdXJyZW50U2hvd25Cb3VuZHMsdCx0aGlzLl9nZXRFeHBhbmRlZFZpc2libGVCb3VuZHMoKSl9LF9hbmltYXRpb25ab29tT3V0U2luZ2xlOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbj10aGlzLl9nZXRFeHBhbmRlZFZpc2libGVCb3VuZHMoKTt0Ll9yZWN1cnNpdmVseUFuaW1hdGVDaGlsZHJlbkluQW5kQWRkU2VsZlRvTWFwKG4sZSsxLGkpO3ZhciBzPXRoaXM7dGhpcy5fZm9yY2VMYXlvdXQoKSx0Ll9yZWN1cnNpdmVseUJlY29tZVZpc2libGUobixpKSx0aGlzLl9lbnF1ZXVlKGZ1bmN0aW9uKCl7aWYoMT09PXQuX2NoaWxkQ291bnQpe3ZhciByPXQuX21hcmtlcnNbMF07ci5zZXRMYXRMbmcoci5nZXRMYXRMbmcoKSksci5zZXRPcGFjaXR5JiZyLnNldE9wYWNpdHkoMSl9ZWxzZSB0Ll9yZWN1cnNpdmVseShuLGksMCxmdW5jdGlvbih0KXt0Ll9yZWN1cnNpdmVseVJlbW92ZUNoaWxkcmVuRnJvbU1hcChuLGUrMSl9KTtzLl9hbmltYXRpb25FbmQoKX0pfSxfYW5pbWF0aW9uQWRkTGF5ZXI6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLG49dGhpcy5fZmVhdHVyZUdyb3VwO24uYWRkTGF5ZXIodCksZSE9PXQmJihlLl9jaGlsZENvdW50PjI/KGUuX3VwZGF0ZUljb24oKSx0aGlzLl9mb3JjZUxheW91dCgpLHRoaXMuX2FuaW1hdGlvblN0YXJ0KCksdC5fc2V0UG9zKHRoaXMuX21hcC5sYXRMbmdUb0xheWVyUG9pbnQoZS5nZXRMYXRMbmcoKSkpLHQuc2V0T3BhY2l0eSgwKSx0aGlzLl9lbnF1ZXVlKGZ1bmN0aW9uKCl7bi5yZW1vdmVMYXllcih0KSx0LnNldE9wYWNpdHkoMSksaS5fYW5pbWF0aW9uRW5kKCl9KSk6KHRoaXMuX2ZvcmNlTGF5b3V0KCksaS5fYW5pbWF0aW9uU3RhcnQoKSxpLl9hbmltYXRpb25ab29tT3V0U2luZ2xlKGUsdGhpcy5fbWFwLmdldE1heFpvb20oKSx0aGlzLl9tYXAuZ2V0Wm9vbSgpKSkpfSxfZm9yY2VMYXlvdXQ6ZnVuY3Rpb24oKXtMLlV0aWwuZmFsc2VGbihlLmJvZHkub2Zmc2V0V2lkdGgpfX06e19hbmltYXRpb25TdGFydDpmdW5jdGlvbigpe30sX2FuaW1hdGlvblpvb21JbjpmdW5jdGlvbih0LGUpe3RoaXMuX3RvcENsdXN0ZXJMZXZlbC5fcmVjdXJzaXZlbHlSZW1vdmVDaGlsZHJlbkZyb21NYXAodGhpcy5fY3VycmVudFNob3duQm91bmRzLHQpLHRoaXMuX3RvcENsdXN0ZXJMZXZlbC5fcmVjdXJzaXZlbHlBZGRDaGlsZHJlblRvTWFwKG51bGwsZSx0aGlzLl9nZXRFeHBhbmRlZFZpc2libGVCb3VuZHMoKSl9LF9hbmltYXRpb25ab29tT3V0OmZ1bmN0aW9uKHQsZSl7dGhpcy5fdG9wQ2x1c3RlckxldmVsLl9yZWN1cnNpdmVseVJlbW92ZUNoaWxkcmVuRnJvbU1hcCh0aGlzLl9jdXJyZW50U2hvd25Cb3VuZHMsdCksdGhpcy5fdG9wQ2x1c3RlckxldmVsLl9yZWN1cnNpdmVseUFkZENoaWxkcmVuVG9NYXAobnVsbCxlLHRoaXMuX2dldEV4cGFuZGVkVmlzaWJsZUJvdW5kcygpKX0sX2FuaW1hdGlvbkFkZExheWVyOmZ1bmN0aW9uKHQsZSl7dGhpcy5fYW5pbWF0aW9uQWRkTGF5ZXJOb25BbmltYXRlZCh0LGUpfX0pLEwubWFya2VyQ2x1c3Rlckdyb3VwPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgTC5NYXJrZXJDbHVzdGVyR3JvdXAodCl9LEwuTWFya2VyQ2x1c3Rlcj1MLk1hcmtlci5leHRlbmQoe2luaXRpYWxpemU6ZnVuY3Rpb24odCxlLGksbil7TC5NYXJrZXIucHJvdG90eXBlLmluaXRpYWxpemUuY2FsbCh0aGlzLGk/aS5fY0xhdExuZ3x8aS5nZXRMYXRMbmcoKTpuZXcgTC5MYXRMbmcoMCwwKSx7aWNvbjp0aGlzfSksdGhpcy5fZ3JvdXA9dCx0aGlzLl96b29tPWUsdGhpcy5fbWFya2Vycz1bXSx0aGlzLl9jaGlsZENsdXN0ZXJzPVtdLHRoaXMuX2NoaWxkQ291bnQ9MCx0aGlzLl9pY29uTmVlZHNVcGRhdGU9ITAsdGhpcy5fYm91bmRzPW5ldyBMLkxhdExuZ0JvdW5kcyxpJiZ0aGlzLl9hZGRDaGlsZChpKSxuJiZ0aGlzLl9hZGRDaGlsZChuKX0sZ2V0QWxsQ2hpbGRNYXJrZXJzOmZ1bmN0aW9uKHQpe3Q9dHx8W107Zm9yKHZhciBlPXRoaXMuX2NoaWxkQ2x1c3RlcnMubGVuZ3RoLTE7ZT49MDtlLS0pdGhpcy5fY2hpbGRDbHVzdGVyc1tlXS5nZXRBbGxDaGlsZE1hcmtlcnModCk7Zm9yKHZhciBpPXRoaXMuX21hcmtlcnMubGVuZ3RoLTE7aT49MDtpLS0pdC5wdXNoKHRoaXMuX21hcmtlcnNbaV0pO3JldHVybiB0fSxnZXRDaGlsZENvdW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NoaWxkQ291bnR9LHpvb21Ub0JvdW5kczpmdW5jdGlvbigpe2Zvcih2YXIgdCxlPXRoaXMuX2NoaWxkQ2x1c3RlcnMuc2xpY2UoKSxpPXRoaXMuX2dyb3VwLl9tYXAsbj1pLmdldEJvdW5kc1pvb20odGhpcy5fYm91bmRzKSxzPXRoaXMuX3pvb20rMSxyPWkuZ2V0Wm9vbSgpO2UubGVuZ3RoPjAmJm4+czspe3MrKzt2YXIgbz1bXTtmb3IodD0wO3Q8ZS5sZW5ndGg7dCsrKW89by5jb25jYXQoZVt0XS5fY2hpbGRDbHVzdGVycyk7ZT1vfW4+cz90aGlzLl9ncm91cC5fbWFwLnNldFZpZXcodGhpcy5fbGF0bG5nLHMpOnI+PW4/dGhpcy5fZ3JvdXAuX21hcC5zZXRWaWV3KHRoaXMuX2xhdGxuZyxyKzEpOnRoaXMuX2dyb3VwLl9tYXAuZml0Qm91bmRzKHRoaXMuX2JvdW5kcyl9LGdldEJvdW5kczpmdW5jdGlvbigpe3ZhciB0PW5ldyBMLkxhdExuZ0JvdW5kcztyZXR1cm4gdC5leHRlbmQodGhpcy5fYm91bmRzKSx0fSxfdXBkYXRlSWNvbjpmdW5jdGlvbigpe3RoaXMuX2ljb25OZWVkc1VwZGF0ZT0hMCx0aGlzLl9pY29uJiZ0aGlzLnNldEljb24odGhpcyl9LGNyZWF0ZUljb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faWNvbk5lZWRzVXBkYXRlJiYodGhpcy5faWNvbk9iaj10aGlzLl9ncm91cC5vcHRpb25zLmljb25DcmVhdGVGdW5jdGlvbih0aGlzKSx0aGlzLl9pY29uTmVlZHNVcGRhdGU9ITEpLHRoaXMuX2ljb25PYmouY3JlYXRlSWNvbigpfSxjcmVhdGVTaGFkb3c6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faWNvbk9iai5jcmVhdGVTaGFkb3coKX0sX2FkZENoaWxkOmZ1bmN0aW9uKHQsZSl7dGhpcy5faWNvbk5lZWRzVXBkYXRlPSEwLHRoaXMuX2V4cGFuZEJvdW5kcyh0KSx0IGluc3RhbmNlb2YgTC5NYXJrZXJDbHVzdGVyPyhlfHwodGhpcy5fY2hpbGRDbHVzdGVycy5wdXNoKHQpLHQuX19wYXJlbnQ9dGhpcyksdGhpcy5fY2hpbGRDb3VudCs9dC5fY2hpbGRDb3VudCk6KGV8fHRoaXMuX21hcmtlcnMucHVzaCh0KSx0aGlzLl9jaGlsZENvdW50KyspLHRoaXMuX19wYXJlbnQmJnRoaXMuX19wYXJlbnQuX2FkZENoaWxkKHQsITApfSxfZXhwYW5kQm91bmRzOmZ1bmN0aW9uKHQpe3ZhciBlLGk9dC5fd0xhdExuZ3x8dC5fbGF0bG5nO3QgaW5zdGFuY2VvZiBMLk1hcmtlckNsdXN0ZXI/KHRoaXMuX2JvdW5kcy5leHRlbmQodC5fYm91bmRzKSxlPXQuX2NoaWxkQ291bnQpOih0aGlzLl9ib3VuZHMuZXh0ZW5kKGkpLGU9MSksdGhpcy5fY0xhdExuZ3x8KHRoaXMuX2NMYXRMbmc9dC5fY0xhdExuZ3x8aSk7dmFyIG49dGhpcy5fY2hpbGRDb3VudCtlO3RoaXMuX3dMYXRMbmc/KHRoaXMuX3dMYXRMbmcubGF0PShpLmxhdCplK3RoaXMuX3dMYXRMbmcubGF0KnRoaXMuX2NoaWxkQ291bnQpL24sdGhpcy5fd0xhdExuZy5sbmc9KGkubG5nKmUrdGhpcy5fd0xhdExuZy5sbmcqdGhpcy5fY2hpbGRDb3VudCkvbik6dGhpcy5fbGF0bG5nPXRoaXMuX3dMYXRMbmc9bmV3IEwuTGF0TG5nKGkubGF0LGkubG5nKX0sX2FkZFRvTWFwOmZ1bmN0aW9uKHQpe3QmJih0aGlzLl9iYWNrdXBMYXRsbmc9dGhpcy5fbGF0bG5nLHRoaXMuc2V0TGF0TG5nKHQpKSx0aGlzLl9ncm91cC5fZmVhdHVyZUdyb3VwLmFkZExheWVyKHRoaXMpfSxfcmVjdXJzaXZlbHlBbmltYXRlQ2hpbGRyZW5JbjpmdW5jdGlvbih0LGUsaSl7dGhpcy5fcmVjdXJzaXZlbHkodCwwLGktMSxmdW5jdGlvbih0KXt2YXIgaSxuLHM9dC5fbWFya2Vycztmb3IoaT1zLmxlbmd0aC0xO2k+PTA7aS0tKW49c1tpXSxuLl9pY29uJiYobi5fc2V0UG9zKGUpLG4uc2V0T3BhY2l0eSgwKSl9LGZ1bmN0aW9uKHQpe3ZhciBpLG4scz10Ll9jaGlsZENsdXN0ZXJzO2ZvcihpPXMubGVuZ3RoLTE7aT49MDtpLS0pbj1zW2ldLG4uX2ljb24mJihuLl9zZXRQb3MoZSksbi5zZXRPcGFjaXR5KDApKX0pfSxfcmVjdXJzaXZlbHlBbmltYXRlQ2hpbGRyZW5JbkFuZEFkZFNlbGZUb01hcDpmdW5jdGlvbih0LGUsaSl7dGhpcy5fcmVjdXJzaXZlbHkodCxpLDAsZnVuY3Rpb24obil7bi5fcmVjdXJzaXZlbHlBbmltYXRlQ2hpbGRyZW5Jbih0LG4uX2dyb3VwLl9tYXAubGF0TG5nVG9MYXllclBvaW50KG4uZ2V0TGF0TG5nKCkpLnJvdW5kKCksZSksbi5faXNTaW5nbGVQYXJlbnQoKSYmZS0xPT09aT8obi5zZXRPcGFjaXR5KDEpLG4uX3JlY3Vyc2l2ZWx5UmVtb3ZlQ2hpbGRyZW5Gcm9tTWFwKHQsZSkpOm4uc2V0T3BhY2l0eSgwKSxuLl9hZGRUb01hcCgpfSl9LF9yZWN1cnNpdmVseUJlY29tZVZpc2libGU6ZnVuY3Rpb24odCxlKXt0aGlzLl9yZWN1cnNpdmVseSh0LDAsZSxudWxsLGZ1bmN0aW9uKHQpe3Quc2V0T3BhY2l0eSgxKX0pfSxfcmVjdXJzaXZlbHlBZGRDaGlsZHJlblRvTWFwOmZ1bmN0aW9uKHQsZSxpKXt0aGlzLl9yZWN1cnNpdmVseShpLC0xLGUsZnVuY3Rpb24obil7aWYoZSE9PW4uX3pvb20pZm9yKHZhciBzPW4uX21hcmtlcnMubGVuZ3RoLTE7cz49MDtzLS0pe3ZhciByPW4uX21hcmtlcnNbc107aS5jb250YWlucyhyLl9sYXRsbmcpJiYodCYmKHIuX2JhY2t1cExhdGxuZz1yLmdldExhdExuZygpLHIuc2V0TGF0TG5nKHQpLHIuc2V0T3BhY2l0eSYmci5zZXRPcGFjaXR5KDApKSxuLl9ncm91cC5fZmVhdHVyZUdyb3VwLmFkZExheWVyKHIpKX19LGZ1bmN0aW9uKGUpe2UuX2FkZFRvTWFwKHQpfSl9LF9yZWN1cnNpdmVseVJlc3RvcmVDaGlsZFBvc2l0aW9uczpmdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5fbWFya2Vycy5sZW5ndGgtMTtlPj0wO2UtLSl7dmFyIGk9dGhpcy5fbWFya2Vyc1tlXTtpLl9iYWNrdXBMYXRsbmcmJihpLnNldExhdExuZyhpLl9iYWNrdXBMYXRsbmcpLGRlbGV0ZSBpLl9iYWNrdXBMYXRsbmcpfWlmKHQtMT09PXRoaXMuX3pvb20pZm9yKHZhciBuPXRoaXMuX2NoaWxkQ2x1c3RlcnMubGVuZ3RoLTE7bj49MDtuLS0pdGhpcy5fY2hpbGRDbHVzdGVyc1tuXS5fcmVzdG9yZVBvc2l0aW9uKCk7ZWxzZSBmb3IodmFyIHM9dGhpcy5fY2hpbGRDbHVzdGVycy5sZW5ndGgtMTtzPj0wO3MtLSl0aGlzLl9jaGlsZENsdXN0ZXJzW3NdLl9yZWN1cnNpdmVseVJlc3RvcmVDaGlsZFBvc2l0aW9ucyh0KX0sX3Jlc3RvcmVQb3NpdGlvbjpmdW5jdGlvbigpe3RoaXMuX2JhY2t1cExhdGxuZyYmKHRoaXMuc2V0TGF0TG5nKHRoaXMuX2JhY2t1cExhdGxuZyksZGVsZXRlIHRoaXMuX2JhY2t1cExhdGxuZyl9LF9yZWN1cnNpdmVseVJlbW92ZUNoaWxkcmVuRnJvbU1hcDpmdW5jdGlvbih0LGUsaSl7dmFyIG4sczt0aGlzLl9yZWN1cnNpdmVseSh0LC0xLGUtMSxmdW5jdGlvbih0KXtmb3Iocz10Ll9tYXJrZXJzLmxlbmd0aC0xO3M+PTA7cy0tKW49dC5fbWFya2Vyc1tzXSxpJiZpLmNvbnRhaW5zKG4uX2xhdGxuZyl8fCh0Ll9ncm91cC5fZmVhdHVyZUdyb3VwLnJlbW92ZUxheWVyKG4pLG4uc2V0T3BhY2l0eSYmbi5zZXRPcGFjaXR5KDEpKX0sZnVuY3Rpb24odCl7Zm9yKHM9dC5fY2hpbGRDbHVzdGVycy5sZW5ndGgtMTtzPj0wO3MtLSluPXQuX2NoaWxkQ2x1c3RlcnNbc10saSYmaS5jb250YWlucyhuLl9sYXRsbmcpfHwodC5fZ3JvdXAuX2ZlYXR1cmVHcm91cC5yZW1vdmVMYXllcihuKSxuLnNldE9wYWNpdHkmJm4uc2V0T3BhY2l0eSgxKSl9KX0sX3JlY3Vyc2l2ZWx5OmZ1bmN0aW9uKHQsZSxpLG4scyl7dmFyIHIsbyxhPXRoaXMuX2NoaWxkQ2x1c3RlcnMsaD10aGlzLl96b29tO2lmKGU+aClmb3Iocj1hLmxlbmd0aC0xO3I+PTA7ci0tKW89YVtyXSx0LmludGVyc2VjdHMoby5fYm91bmRzKSYmby5fcmVjdXJzaXZlbHkodCxlLGksbixzKTtlbHNlIGlmKG4mJm4odGhpcykscyYmdGhpcy5fem9vbT09PWkmJnModGhpcyksaT5oKWZvcihyPWEubGVuZ3RoLTE7cj49MDtyLS0pbz1hW3JdLHQuaW50ZXJzZWN0cyhvLl9ib3VuZHMpJiZvLl9yZWN1cnNpdmVseSh0LGUsaSxuLHMpfSxfcmVjYWxjdWxhdGVCb3VuZHM6ZnVuY3Rpb24oKXt2YXIgdCxlPXRoaXMuX21hcmtlcnMsaT10aGlzLl9jaGlsZENsdXN0ZXJzO2Zvcih0aGlzLl9ib3VuZHM9bmV3IEwuTGF0TG5nQm91bmRzLGRlbGV0ZSB0aGlzLl93TGF0TG5nLHQ9ZS5sZW5ndGgtMTt0Pj0wO3QtLSl0aGlzLl9leHBhbmRCb3VuZHMoZVt0XSk7Zm9yKHQ9aS5sZW5ndGgtMTt0Pj0wO3QtLSl0aGlzLl9leHBhbmRCb3VuZHMoaVt0XSl9LF9pc1NpbmdsZVBhcmVudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jaGlsZENsdXN0ZXJzLmxlbmd0aD4wJiZ0aGlzLl9jaGlsZENsdXN0ZXJzWzBdLl9jaGlsZENvdW50PT09dGhpcy5fY2hpbGRDb3VudH19KSxMLkRpc3RhbmNlR3JpZD1mdW5jdGlvbih0KXt0aGlzLl9jZWxsU2l6ZT10LHRoaXMuX3NxQ2VsbFNpemU9dCp0LHRoaXMuX2dyaWQ9e30sdGhpcy5fb2JqZWN0UG9pbnQ9e319LEwuRGlzdGFuY2VHcmlkLnByb3RvdHlwZT17YWRkT2JqZWN0OmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5fZ2V0Q29vcmQoZS54KSxuPXRoaXMuX2dldENvb3JkKGUueSkscz10aGlzLl9ncmlkLHI9c1tuXT1zW25dfHx7fSxvPXJbaV09cltpXXx8W10sYT1MLlV0aWwuc3RhbXAodCk7dGhpcy5fb2JqZWN0UG9pbnRbYV09ZSxvLnB1c2godCl9LHVwZGF0ZU9iamVjdDpmdW5jdGlvbih0LGUpe3RoaXMucmVtb3ZlT2JqZWN0KHQpLHRoaXMuYWRkT2JqZWN0KHQsZSl9LHJlbW92ZU9iamVjdDpmdW5jdGlvbih0LGUpe3ZhciBpLG4scz10aGlzLl9nZXRDb29yZChlLngpLHI9dGhpcy5fZ2V0Q29vcmQoZS55KSxvPXRoaXMuX2dyaWQsYT1vW3JdPW9bcl18fHt9LGg9YVtzXT1hW3NdfHxbXTtmb3IoZGVsZXRlIHRoaXMuX29iamVjdFBvaW50W0wuVXRpbC5zdGFtcCh0KV0saT0wLG49aC5sZW5ndGg7bj5pO2krKylpZihoW2ldPT09dClyZXR1cm4gaC5zcGxpY2UoaSwxKSwxPT09biYmZGVsZXRlIGFbc10sITB9LGVhY2hPYmplY3Q6ZnVuY3Rpb24odCxlKXt2YXIgaSxuLHMscixvLGEsaCxfPXRoaXMuX2dyaWQ7Zm9yKGkgaW4gXyl7bz1fW2ldO2ZvcihuIGluIG8pZm9yKGE9b1tuXSxzPTAscj1hLmxlbmd0aDtyPnM7cysrKWg9dC5jYWxsKGUsYVtzXSksaCYmKHMtLSxyLS0pfX0sZ2V0TmVhck9iamVjdDpmdW5jdGlvbih0KXt2YXIgZSxpLG4scyxyLG8sYSxoLF89dGhpcy5fZ2V0Q29vcmQodC54KSx1PXRoaXMuX2dldENvb3JkKHQueSksbD10aGlzLl9vYmplY3RQb2ludCxkPXRoaXMuX3NxQ2VsbFNpemUscD1udWxsO2ZvcihlPXUtMTt1KzE+PWU7ZSsrKWlmKHM9dGhpcy5fZ3JpZFtlXSlmb3IoaT1fLTE7XysxPj1pO2krKylpZihyPXNbaV0pZm9yKG49MCxvPXIubGVuZ3RoO28+bjtuKyspYT1yW25dLGg9dGhpcy5fc3FEaXN0KGxbTC5VdGlsLnN0YW1wKGEpXSx0KSxkPmgmJihkPWgscD1hKTtyZXR1cm4gcH0sX2dldENvb3JkOmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLmZsb29yKHQvdGhpcy5fY2VsbFNpemUpfSxfc3FEaXN0OmZ1bmN0aW9uKHQsZSl7dmFyIGk9ZS54LXQueCxuPWUueS10Lnk7cmV0dXJuIGkqaStuKm59fSxmdW5jdGlvbigpe0wuUXVpY2tIdWxsPXtnZXREaXN0YW50OmZ1bmN0aW9uKHQsZSl7dmFyIGk9ZVsxXS5sYXQtZVswXS5sYXQsbj1lWzBdLmxuZy1lWzFdLmxuZztyZXR1cm4gbioodC5sYXQtZVswXS5sYXQpK2kqKHQubG5nLWVbMF0ubG5nKX0sZmluZE1vc3REaXN0YW50UG9pbnRGcm9tQmFzZUxpbmU6ZnVuY3Rpb24odCxlKXt2YXIgaSxuLHMscj0wLG89bnVsbCxhPVtdO2ZvcihpPWUubGVuZ3RoLTE7aT49MDtpLS0pbj1lW2ldLHM9dGhpcy5nZXREaXN0YW50KG4sdCkscz4wJiYoYS5wdXNoKG4pLHM+ciYmKHI9cyxvPW4pKTtyZXR1cm57bWF4UG9pbnQ6byxuZXdQb2ludHM6YX19LGJ1aWxkQ29udmV4SHVsbDpmdW5jdGlvbih0LGUpe3ZhciBpPVtdLG49dGhpcy5maW5kTW9zdERpc3RhbnRQb2ludEZyb21CYXNlTGluZSh0LGUpO3JldHVybiBuLm1heFBvaW50PyhpPWkuY29uY2F0KHRoaXMuYnVpbGRDb252ZXhIdWxsKFt0WzBdLG4ubWF4UG9pbnRdLG4ubmV3UG9pbnRzKSksaT1pLmNvbmNhdCh0aGlzLmJ1aWxkQ29udmV4SHVsbChbbi5tYXhQb2ludCx0WzFdXSxuLm5ld1BvaW50cykpKTpbdFswXV19LGdldENvbnZleEh1bGw6ZnVuY3Rpb24odCl7dmFyIGUsaT0hMSxuPSExLHM9bnVsbCxyPW51bGw7Zm9yKGU9dC5sZW5ndGgtMTtlPj0wO2UtLSl7dmFyIG89dFtlXTsoaT09PSExfHxvLmxhdD5pKSYmKHM9byxpPW8ubGF0KSwobj09PSExfHxvLmxhdDxuKSYmKHI9byxuPW8ubGF0KX12YXIgYT1bXS5jb25jYXQodGhpcy5idWlsZENvbnZleEh1bGwoW3Isc10sdCksdGhpcy5idWlsZENvbnZleEh1bGwoW3Mscl0sdCkpO3JldHVybiBhfX19KCksTC5NYXJrZXJDbHVzdGVyLmluY2x1ZGUoe2dldENvbnZleEh1bGw6ZnVuY3Rpb24oKXt2YXIgdCxlLGk9dGhpcy5nZXRBbGxDaGlsZE1hcmtlcnMoKSxuPVtdO2ZvcihlPWkubGVuZ3RoLTE7ZT49MDtlLS0pdD1pW2VdLmdldExhdExuZygpLG4ucHVzaCh0KTtyZXR1cm4gTC5RdWlja0h1bGwuZ2V0Q29udmV4SHVsbChuKX19KSxMLk1hcmtlckNsdXN0ZXIuaW5jbHVkZSh7XzJQSToyKk1hdGguUEksX2NpcmNsZUZvb3RTZXBhcmF0aW9uOjI1LF9jaXJjbGVTdGFydEFuZ2xlOk1hdGguUEkvNixfc3BpcmFsRm9vdFNlcGFyYXRpb246MjgsX3NwaXJhbExlbmd0aFN0YXJ0OjExLF9zcGlyYWxMZW5ndGhGYWN0b3I6NSxfY2lyY2xlU3BpcmFsU3dpdGNob3Zlcjo5LHNwaWRlcmZ5OmZ1bmN0aW9uKCl7aWYodGhpcy5fZ3JvdXAuX3NwaWRlcmZpZWQhPT10aGlzJiYhdGhpcy5fZ3JvdXAuX2luWm9vbUFuaW1hdGlvbil7dmFyIHQsZT10aGlzLmdldEFsbENoaWxkTWFya2VycygpLGk9dGhpcy5fZ3JvdXAsbj1pLl9tYXAscz1uLmxhdExuZ1RvTGF5ZXJQb2ludCh0aGlzLl9sYXRsbmcpO3RoaXMuX2dyb3VwLl91bnNwaWRlcmZ5KCksdGhpcy5fZ3JvdXAuX3NwaWRlcmZpZWQ9dGhpcyxlLmxlbmd0aD49dGhpcy5fY2lyY2xlU3BpcmFsU3dpdGNob3Zlcj90PXRoaXMuX2dlbmVyYXRlUG9pbnRzU3BpcmFsKGUubGVuZ3RoLHMpOihzLnkrPTEwLHQ9dGhpcy5fZ2VuZXJhdGVQb2ludHNDaXJjbGUoZS5sZW5ndGgscykpLHRoaXMuX2FuaW1hdGlvblNwaWRlcmZ5KGUsdCl9fSx1bnNwaWRlcmZ5OmZ1bmN0aW9uKHQpe3RoaXMuX2dyb3VwLl9pblpvb21BbmltYXRpb258fCh0aGlzLl9hbmltYXRpb25VbnNwaWRlcmZ5KHQpLHRoaXMuX2dyb3VwLl9zcGlkZXJmaWVkPW51bGwpfSxfZ2VuZXJhdGVQb2ludHNDaXJjbGU6ZnVuY3Rpb24odCxlKXt2YXIgaSxuLHM9dGhpcy5fZ3JvdXAub3B0aW9ucy5zcGlkZXJmeURpc3RhbmNlTXVsdGlwbGllcip0aGlzLl9jaXJjbGVGb290U2VwYXJhdGlvbiooMit0KSxyPXMvdGhpcy5fMlBJLG89dGhpcy5fMlBJL3QsYT1bXTtmb3IoYS5sZW5ndGg9dCxpPXQtMTtpPj0wO2ktLSluPXRoaXMuX2NpcmNsZVN0YXJ0QW5nbGUraSpvLGFbaV09bmV3IEwuUG9pbnQoZS54K3IqTWF0aC5jb3MobiksZS55K3IqTWF0aC5zaW4obikpLl9yb3VuZCgpO3JldHVybiBhfSxfZ2VuZXJhdGVQb2ludHNTcGlyYWw6ZnVuY3Rpb24odCxlKXt2YXIgaSxuPXRoaXMuX2dyb3VwLm9wdGlvbnMuc3BpZGVyZnlEaXN0YW5jZU11bHRpcGxpZXIqdGhpcy5fc3BpcmFsTGVuZ3RoU3RhcnQscz10aGlzLl9ncm91cC5vcHRpb25zLnNwaWRlcmZ5RGlzdGFuY2VNdWx0aXBsaWVyKnRoaXMuX3NwaXJhbEZvb3RTZXBhcmF0aW9uLHI9dGhpcy5fZ3JvdXAub3B0aW9ucy5zcGlkZXJmeURpc3RhbmNlTXVsdGlwbGllcip0aGlzLl9zcGlyYWxMZW5ndGhGYWN0b3Isbz0wLGE9W107Zm9yKGEubGVuZ3RoPXQsaT10LTE7aT49MDtpLS0pbys9cy9uKzVlLTQqaSxhW2ldPW5ldyBMLlBvaW50KGUueCtuKk1hdGguY29zKG8pLGUueStuKk1hdGguc2luKG8pKS5fcm91bmQoKSxuKz10aGlzLl8yUEkqci9vO3JldHVybiBhfSxfbm9hbmltYXRpb25VbnNwaWRlcmZ5OmZ1bmN0aW9uKCl7dmFyIHQsZSxpPXRoaXMuX2dyb3VwLG49aS5fbWFwLHM9aS5fZmVhdHVyZUdyb3VwLHI9dGhpcy5nZXRBbGxDaGlsZE1hcmtlcnMoKTtmb3IodGhpcy5zZXRPcGFjaXR5KDEpLGU9ci5sZW5ndGgtMTtlPj0wO2UtLSl0PXJbZV0scy5yZW1vdmVMYXllcih0KSx0Ll9wcmVTcGlkZXJmeUxhdGxuZyYmKHQuc2V0TGF0TG5nKHQuX3ByZVNwaWRlcmZ5TGF0bG5nKSxkZWxldGUgdC5fcHJlU3BpZGVyZnlMYXRsbmcpLHQuc2V0WkluZGV4T2Zmc2V0JiZ0LnNldFpJbmRleE9mZnNldCgwKSx0Ll9zcGlkZXJMZWcmJihuLnJlbW92ZUxheWVyKHQuX3NwaWRlckxlZyksZGVsZXRlIHQuX3NwaWRlckxlZyk7aS5fc3BpZGVyZmllZD1udWxsfX0pLEwuTWFya2VyQ2x1c3Rlci5pbmNsdWRlKEwuRG9tVXRpbC5UUkFOU0lUSU9OP3tTVkdfQU5JTUFUSU9OOmZ1bmN0aW9uKCl7cmV0dXJuIGUuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsImFuaW1hdGUiKS50b1N0cmluZygpLmluZGV4T2YoIlNWR0FuaW1hdGUiKT4tMX0oKSxfYW5pbWF0aW9uU3BpZGVyZnk6ZnVuY3Rpb24odCxpKXt2YXIgbixzLHIsbyxhPXRoaXMsaD10aGlzLl9ncm91cCxfPWguX21hcCx1PWguX2ZlYXR1cmVHcm91cCxsPV8ubGF0TG5nVG9MYXllclBvaW50KHRoaXMuX2xhdGxuZyk7Zm9yKG49dC5sZW5ndGgtMTtuPj0wO24tLSlzPXRbbl0scy5zZXRPcGFjaXR5PyhzLnNldFpJbmRleE9mZnNldCgxZTYpLHMuc2V0T3BhY2l0eSgwKSx1LmFkZExheWVyKHMpLHMuX3NldFBvcyhsKSk6dS5hZGRMYXllcihzKTtoLl9mb3JjZUxheW91dCgpLGguX2FuaW1hdGlvblN0YXJ0KCk7dmFyIGQ9TC5QYXRoLlNWRz8wOi4zLHA9TC5QYXRoLlNWR19OUztmb3Iobj10Lmxlbmd0aC0xO24+PTA7bi0tKWlmKG89Xy5sYXllclBvaW50VG9MYXRMbmcoaVtuXSkscz10W25dLHMuX3ByZVNwaWRlcmZ5TGF0bG5nPXMuX2xhdGxuZyxzLnNldExhdExuZyhvKSxzLnNldE9wYWNpdHkmJnMuc2V0T3BhY2l0eSgxKSxyPW5ldyBMLlBvbHlsaW5lKFthLl9sYXRsbmcsb10se3dlaWdodDoxLjUsY29sb3I6IiMyMjIiLG9wYWNpdHk6ZH0pLF8uYWRkTGF5ZXIocikscy5fc3BpZGVyTGVnPXIsTC5QYXRoLlNWRyYmdGhpcy5TVkdfQU5JTUFUSU9OKXt2YXIgYz1yLl9wYXRoLmdldFRvdGFsTGVuZ3RoKCk7ci5fcGF0aC5zZXRBdHRyaWJ1dGUoInN0cm9rZS1kYXNoYXJyYXkiLGMrIiwiK2MpO3ZhciBtPWUuY3JlYXRlRWxlbWVudE5TKHAsImFuaW1hdGUiKTttLnNldEF0dHJpYnV0ZSgiYXR0cmlidXRlTmFtZSIsInN0cm9rZS1kYXNob2Zmc2V0IiksbS5zZXRBdHRyaWJ1dGUoImJlZ2luIiwiaW5kZWZpbml0ZSIpLG0uc2V0QXR0cmlidXRlKCJmcm9tIixjKSxtLnNldEF0dHJpYnV0ZSgidG8iLDApLG0uc2V0QXR0cmlidXRlKCJkdXIiLC4yNSksci5fcGF0aC5hcHBlbmRDaGlsZChtKSxtLmJlZ2luRWxlbWVudCgpLG09ZS5jcmVhdGVFbGVtZW50TlMocCwiYW5pbWF0ZSIpLG0uc2V0QXR0cmlidXRlKCJhdHRyaWJ1dGVOYW1lIiwic3Ryb2tlLW9wYWNpdHkiKSxtLnNldEF0dHJpYnV0ZSgiYXR0cmlidXRlTmFtZSIsInN0cm9rZS1vcGFjaXR5IiksbS5zZXRBdHRyaWJ1dGUoImJlZ2luIiwiaW5kZWZpbml0ZSIpLG0uc2V0QXR0cmlidXRlKCJmcm9tIiwwKSxtLnNldEF0dHJpYnV0ZSgidG8iLC41KSxtLnNldEF0dHJpYnV0ZSgiZHVyIiwuMjUpLHIuX3BhdGguYXBwZW5kQ2hpbGQobSksbS5iZWdpbkVsZW1lbnQoKX1pZihhLnNldE9wYWNpdHkoLjMpLEwuUGF0aC5TVkcpZm9yKHRoaXMuX2dyb3VwLl9mb3JjZUxheW91dCgpLG49dC5sZW5ndGgtMTtuPj0wO24tLSlzPXRbbl0uX3NwaWRlckxlZyxzLm9wdGlvbnMub3BhY2l0eT0uNSxzLl9wYXRoLnNldEF0dHJpYnV0ZSgic3Ryb2tlLW9wYWNpdHkiLC41KTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aC5fYW5pbWF0aW9uRW5kKCksaC5maXJlKCJzcGlkZXJmaWVkIil9LDIwMCl9LF9hbmltYXRpb25VbnNwaWRlcmZ5OmZ1bmN0aW9uKHQpe3ZhciBlLGksbixzPXRoaXMuX2dyb3VwLHI9cy5fbWFwLG89cy5fZmVhdHVyZUdyb3VwLGE9dD9yLl9sYXRMbmdUb05ld0xheWVyUG9pbnQodGhpcy5fbGF0bG5nLHQuem9vbSx0LmNlbnRlcik6ci5sYXRMbmdUb0xheWVyUG9pbnQodGhpcy5fbGF0bG5nKSxoPXRoaXMuZ2V0QWxsQ2hpbGRNYXJrZXJzKCksXz1MLlBhdGguU1ZHJiZ0aGlzLlNWR19BTklNQVRJT047Zm9yKHMuX2FuaW1hdGlvblN0YXJ0KCksdGhpcy5zZXRPcGFjaXR5KDEpLGk9aC5sZW5ndGgtMTtpPj0wO2ktLSllPWhbaV0sZS5fcHJlU3BpZGVyZnlMYXRsbmcmJihlLnNldExhdExuZyhlLl9wcmVTcGlkZXJmeUxhdGxuZyksZGVsZXRlIGUuX3ByZVNwaWRlcmZ5TGF0bG5nLGUuc2V0T3BhY2l0eT8oZS5fc2V0UG9zKGEpLGUuc2V0T3BhY2l0eSgwKSk6by5yZW1vdmVMYXllcihlKSxfJiYobj1lLl9zcGlkZXJMZWcuX3BhdGguY2hpbGROb2Rlc1swXSxuLnNldEF0dHJpYnV0ZSgidG8iLG4uZ2V0QXR0cmlidXRlKCJmcm9tIikpLG4uc2V0QXR0cmlidXRlKCJmcm9tIiwwKSxuLmJlZ2luRWxlbWVudCgpLG49ZS5fc3BpZGVyTGVnLl9wYXRoLmNoaWxkTm9kZXNbMV0sbi5zZXRBdHRyaWJ1dGUoImZyb20iLC41KSxuLnNldEF0dHJpYnV0ZSgidG8iLDApLG4uc2V0QXR0cmlidXRlKCJzdHJva2Utb3BhY2l0eSIsMCksbi5iZWdpbkVsZW1lbnQoKSxlLl9zcGlkZXJMZWcuX3BhdGguc2V0QXR0cmlidXRlKCJzdHJva2Utb3BhY2l0eSIsMCkpKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIHQ9MDtmb3IoaT1oLmxlbmd0aC0xO2k+PTA7aS0tKWU9aFtpXSxlLl9zcGlkZXJMZWcmJnQrKztmb3IoaT1oLmxlbmd0aC0xO2k+PTA7aS0tKWU9aFtpXSxlLl9zcGlkZXJMZWcmJihlLnNldE9wYWNpdHkmJihlLnNldE9wYWNpdHkoMSksZS5zZXRaSW5kZXhPZmZzZXQoMCkpLHQ+MSYmby5yZW1vdmVMYXllcihlKSxyLnJlbW92ZUxheWVyKGUuX3NwaWRlckxlZyksZGVsZXRlIGUuX3NwaWRlckxlZyk7cy5fYW5pbWF0aW9uRW5kKCl9LDIwMCl9fTp7X2FuaW1hdGlvblNwaWRlcmZ5OmZ1bmN0aW9uKHQsZSl7dmFyIGksbixzLHIsbz10aGlzLl9ncm91cCxhPW8uX21hcCxoPW8uX2ZlYXR1cmVHcm91cDtmb3IoaT10Lmxlbmd0aC0xO2k+PTA7aS0tKXI9YS5sYXllclBvaW50VG9MYXRMbmcoZVtpXSksbj10W2ldLG4uX3ByZVNwaWRlcmZ5TGF0bG5nPW4uX2xhdGxuZyxuLnNldExhdExuZyhyKSxuLnNldFpJbmRleE9mZnNldCYmbi5zZXRaSW5kZXhPZmZzZXQoMWU2KSxoLmFkZExheWVyKG4pLHM9bmV3IEwuUG9seWxpbmUoW3RoaXMuX2xhdGxuZyxyXSx7d2VpZ2h0OjEuNSxjb2xvcjoiIzIyMiJ9KSxhLmFkZExheWVyKHMpLG4uX3NwaWRlckxlZz1zO3RoaXMuc2V0T3BhY2l0eSguMyksby5maXJlKCJzcGlkZXJmaWVkIil9LF9hbmltYXRpb25VbnNwaWRlcmZ5OmZ1bmN0aW9uKCl7dGhpcy5fbm9hbmltYXRpb25VbnNwaWRlcmZ5KCl9fSksTC5NYXJrZXJDbHVzdGVyR3JvdXAuaW5jbHVkZSh7X3NwaWRlcmZpZWQ6bnVsbCxfc3BpZGVyZmllck9uQWRkOmZ1bmN0aW9uKCl7dGhpcy5fbWFwLm9uKCJjbGljayIsdGhpcy5fdW5zcGlkZXJmeVdyYXBwZXIsdGhpcyksdGhpcy5fbWFwLm9wdGlvbnMuem9vbUFuaW1hdGlvbiYmdGhpcy5fbWFwLm9uKCJ6b29tc3RhcnQiLHRoaXMuX3Vuc3BpZGVyZnlab29tU3RhcnQsdGhpcyksdGhpcy5fbWFwLm9uKCJ6b29tZW5kIix0aGlzLl9ub2FuaW1hdGlvblVuc3BpZGVyZnksdGhpcyksTC5QYXRoLlNWRyYmIUwuQnJvd3Nlci50b3VjaCYmdGhpcy5fbWFwLl9pbml0UGF0aFJvb3QoKX0sX3NwaWRlcmZpZXJPblJlbW92ZTpmdW5jdGlvbigpe3RoaXMuX21hcC5vZmYoImNsaWNrIix0aGlzLl91bnNwaWRlcmZ5V3JhcHBlcix0aGlzKSx0aGlzLl9tYXAub2ZmKCJ6b29tc3RhcnQiLHRoaXMuX3Vuc3BpZGVyZnlab29tU3RhcnQsdGhpcyksdGhpcy5fbWFwLm9mZigiem9vbWFuaW0iLHRoaXMuX3Vuc3BpZGVyZnlab29tQW5pbSx0aGlzKSx0aGlzLl91bnNwaWRlcmZ5KCl9LF91bnNwaWRlcmZ5Wm9vbVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbWFwJiZ0aGlzLl9tYXAub24oInpvb21hbmltIix0aGlzLl91bnNwaWRlcmZ5Wm9vbUFuaW0sdGhpcyl9LF91bnNwaWRlcmZ5Wm9vbUFuaW06ZnVuY3Rpb24odCl7TC5Eb21VdGlsLmhhc0NsYXNzKHRoaXMuX21hcC5fbWFwUGFuZSwibGVhZmxldC10b3VjaGluZyIpfHwodGhpcy5fbWFwLm9mZigiem9vbWFuaW0iLHRoaXMuX3Vuc3BpZGVyZnlab29tQW5pbSx0aGlzKSx0aGlzLl91bnNwaWRlcmZ5KHQpKX0sX3Vuc3BpZGVyZnlXcmFwcGVyOmZ1bmN0aW9uKCl7dGhpcy5fdW5zcGlkZXJmeSgpfSxfdW5zcGlkZXJmeTpmdW5jdGlvbih0KXt0aGlzLl9zcGlkZXJmaWVkJiZ0aGlzLl9zcGlkZXJmaWVkLnVuc3BpZGVyZnkodCl9LF9ub2FuaW1hdGlvblVuc3BpZGVyZnk6ZnVuY3Rpb24oKXt0aGlzLl9zcGlkZXJmaWVkJiZ0aGlzLl9zcGlkZXJmaWVkLl9ub2FuaW1hdGlvblVuc3BpZGVyZnkoKX0sX3Vuc3BpZGVyZnlMYXllcjpmdW5jdGlvbih0KXt0Ll9zcGlkZXJMZWcmJih0aGlzLl9mZWF0dXJlR3JvdXAucmVtb3ZlTGF5ZXIodCksdC5zZXRPcGFjaXR5KDEpLHQuc2V0WkluZGV4T2Zmc2V0KDApLHRoaXMuX21hcC5yZW1vdmVMYXllcih0Ll9zcGlkZXJMZWcpLGRlbGV0ZSB0Ll9zcGlkZXJMZWcpfX0pfSh3aW5kb3csZG9jdW1lbnQpOw==]]></data>
	</file>
	<file>
	  <filename>/lib/js/leaflet-markercluster/MarkerCluster.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LmxlYWZsZXQtY2x1c3Rlci1hbmltIC5sZWFmbGV0LW1hcmtlci1pY29uLCAubGVhZmxldC1jbHVzdGVyLWFuaW0gLmxlYWZsZXQtbWFya2VyLXNoYWRvdyB7Cgktd2Via2l0LXRyYW5zaXRpb246IC13ZWJraXQtdHJhbnNmb3JtIDAuM3MgZWFzZS1vdXQsIG9wYWNpdHkgMC4zcyBlYXNlLWluOwoJLW1vei10cmFuc2l0aW9uOiAtbW96LXRyYW5zZm9ybSAwLjNzIGVhc2Utb3V0LCBvcGFjaXR5IDAuM3MgZWFzZS1pbjsKCS1vLXRyYW5zaXRpb246IC1vLXRyYW5zZm9ybSAwLjNzIGVhc2Utb3V0LCBvcGFjaXR5IDAuM3MgZWFzZS1pbjsKCXRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjNzIGVhc2Utb3V0LCBvcGFjaXR5IDAuM3MgZWFzZS1pbjsKCX0K]]></data>
	</file>
	<file>
	  <filename>/lib/js/leaflet-markercluster/MarkerCluster.Default.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Lm1hcmtlci1jbHVzdGVyLXNtYWxsIHsKCWJhY2tncm91bmQtY29sb3I6IHJnYmEoMTgxLCAyMjYsIDE0MCwgMC42KTsKCX0KLm1hcmtlci1jbHVzdGVyLXNtYWxsIGRpdiB7CgliYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDExMCwgMjA0LCA1NywgMC42KTsKCX0KCi5tYXJrZXItY2x1c3Rlci1tZWRpdW0gewoJYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNDEsIDIxMSwgODcsIDAuNik7Cgl9Ci5tYXJrZXItY2x1c3Rlci1tZWRpdW0gZGl2IHsKCWJhY2tncm91bmQtY29sb3I6IHJnYmEoMjQwLCAxOTQsIDEyLCAwLjYpOwoJfQoKLm1hcmtlci1jbHVzdGVyLWxhcmdlIHsKCWJhY2tncm91bmQtY29sb3I6IHJnYmEoMjUzLCAxNTYsIDExNSwgMC42KTsKCX0KLm1hcmtlci1jbHVzdGVyLWxhcmdlIGRpdiB7CgliYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI0MSwgMTI4LCAyMywgMC42KTsKCX0KCgkvKiBJRSA2LTggZmFsbGJhY2sgY29sb3JzICovCi5sZWFmbGV0LW9sZGllIC5tYXJrZXItY2x1c3Rlci1zbWFsbCB7CgliYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMTgxLCAyMjYsIDE0MCk7Cgl9Ci5sZWFmbGV0LW9sZGllIC5tYXJrZXItY2x1c3Rlci1zbWFsbCBkaXYgewoJYmFja2dyb3VuZC1jb2xvcjogcmdiKDExMCwgMjA0LCA1Nyk7Cgl9CgoubGVhZmxldC1vbGRpZSAubWFya2VyLWNsdXN0ZXItbWVkaXVtIHsKCWJhY2tncm91bmQtY29sb3I6IHJnYigyNDEsIDIxMSwgODcpOwoJfQoubGVhZmxldC1vbGRpZSAubWFya2VyLWNsdXN0ZXItbWVkaXVtIGRpdiB7CgliYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjQwLCAxOTQsIDEyKTsKCX0KCi5sZWFmbGV0LW9sZGllIC5tYXJrZXItY2x1c3Rlci1sYXJnZSB7CgliYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjUzLCAxNTYsIDExNSk7Cgl9Ci5sZWFmbGV0LW9sZGllIC5tYXJrZXItY2x1c3Rlci1sYXJnZSBkaXYgewoJYmFja2dyb3VuZC1jb2xvcjogcmdiKDI0MSwgMTI4LCAyMyk7Cn0KCi5tYXJrZXItY2x1c3RlciB7CgliYWNrZ3JvdW5kLWNsaXA6IHBhZGRpbmctYm94OwoJYm9yZGVyLXJhZGl1czogMjBweDsKCX0KLm1hcmtlci1jbHVzdGVyIGRpdiB7Cgl3aWR0aDogMzBweDsKCWhlaWdodDogMzBweDsKCW1hcmdpbi1sZWZ0OiA1cHg7CgltYXJnaW4tdG9wOiA1cHg7CgoJdGV4dC1hbGlnbjogY2VudGVyOwoJYm9yZGVyLXJhZGl1czogMTVweDsKCWZvbnQ6IDEycHggIkhlbHZldGljYSBOZXVlIiwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKCX0KLm1hcmtlci1jbHVzdGVyIHNwYW4gewoJbGluZS1oZWlnaHQ6IDMwcHg7Cgl9]]></data>
	</file>
	<file>
	  <filename>/method.install.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyogdmltOiBzZXQgZXhwYW5kdGFiIHRhYnN0b3A9NCBzaGlmdHdpZHRoPTQgc29mdHRhYnN0b3A9NDogKi8KCi8qKgogKiBNb2R1bGUgaW5zdGFsbGVyCiAqCiAqIGNvcHlyaWdodCAyMDEzLCBSZWdpb25hbCBEaXN0cmljdCBvZiBGcmFzZXItRm9ydCBHZW9yZ2UKICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQogKiBhbnkgbGF0ZXIgdmVyc2lvbi4KCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAogKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgogKiBtb3JlIGRldGFpbHMuICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQSBPcgogKiByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMCgoqKi8KCgppZiAoIWZ1bmN0aW9uX2V4aXN0cygnY21zbXMnKSkgZXhpdDsKCiR0aGlzLT5DcmVhdGVQZXJtaXNzaW9uKCdVc2UgUkQgTWFwJywnVXNlIFJEIE1hcCcpOwokdGhpcy0+Q3JlYXRlUGVybWlzc2lvbignU2V0IFJEIE1hcCBQcmVmcycsICdTZXQgUkQgTWFwIFByZWZzJyk7CgokZGIgPSBjbXNtcygpLT5HZXREYigpOwoKLy8gbXlzcWwtc3BlY2lmaWMsIGJ1dCBpZ25vcmVkIGJ5IG90aGVyIGRhdGFiYXNlCiR0YWJvcHRhcnJheSA9IGFycmF5KCAnbXlzcWwnID0+ICdFTkdJTkU9TXlJU0FNJyApOwoKJGRpY3QgPSBOZXdEYXRhRGljdGlvbmFyeSggJGRiICk7CgovLyB0YWJsZSBzY2hlbWEgZGVzY3JpcHRpb24KJGZsZHMgPSAiCiAgICBtYXBfaWQgSSBBVVRPIEtFWSwKCW5hbWUgQyg4MCkgTk9UTlVMTCwKCXRpdGxlIEMoMjU2KSwKICAgIGJhc2VtYXAgQygyNTYpIE5PVE5VTEwsCglvdmVybGF5IEMoMjU2KSwKICAgIG92ZXJsYXlfcGFyYW1ldGVycyBDKDI1NiksCiAgICBpbml0aWFsX2V4dGVudCBDKDY0KSwKCXRlbXBsYXRlX25hbWUgQyg4MCkgTk9UTlVMTAoiOwogICAgICAgICAgICAgICAgICAgICAgICAKLy8gY3JlYXRlIGl0LiBUaGlzIHNob3VsZCBkbyBlcnJvciBjaGVja2luZywgYnV0IEknbSBhIGxhenkgc29kLgokc3FsYXJyYXkgPSAkZGljdC0+Q3JlYXRlVGFibGVTUUwoIGNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX3JkbWFwIiwKICAgICAgICAkZmxkcywgCiAgICAgICAgJHRhYm9wdGFycmF5KTsKJGRpY3QtPkV4ZWN1dGVTUUxBcnJheSgkc3FsYXJyYXkpOwoKJHNxbGFycmF5ID0gJGRpY3QtPkNyZWF0ZUluZGV4U1FMKCdpX25hbWUnLCBjbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9yZG1hcCIsICduYW1lJyk7CiRyZXQgPSAkZGljdC0+RXhlY3V0ZVNRTEFycmF5KCRzcWxhcnJheSk7CmlmICgkcmV0ID09PSAwKSB7Cgl0aHJvdyBuZXcgRXhjZXB0aW9uKCJmYWlsZWQgdG8gY3JlYXRlIGluZGV4Iik7Cn0KCiR0aGlzLT5TZXRQcmVmZXJlbmNlKCdkZWZhdWx0X2Jhc2VtYXAnLCdodHRwOi8vc2VydmVyLmFyY2dpc29ubGluZS5jb20vQXJjR0lTL3Jlc3Qvc2VydmljZXMvV29ybGRfVG9wb19NYXAvTWFwU2VydmVyJyk7CiR0aGlzLT5TZXRQcmVmZXJlbmNlKCdpbml0aWFsX2V4dGVudCcsJzAvMC8yJyk7CiR0aGlzLT5DcmVhdGVFdmVudCgnT25SRE1hcFByZWZlcmVuY2VDaGFuZ2UnKTsKJHRoaXMtPkF1ZGl0KCAwLAoJJHRoaXMtPkxhbmcoJ2ZyaWVuZGx5bmFtZScpLAoJJHRoaXMtPkxhbmcoJ2luc3RhbGxlZCcpLCAkdGhpcy0+R2V0VmVyc2lvbigpKTsKCi8vIHJlZ2lzdGVyIGV2ZW50IGhhbmRsZXJzCiR0aGlzLT5BZGRFdmVudEhhbmRsZXIoJ0NvcmUnLCdDb250ZW50UG9zdFJlbmRlcicsZmFsc2UpOwo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/method.uninstall.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyogdmltOiBzZXQgZXhwYW5kdGFiIHRhYnN0b3A9NCBzaGlmdHdpZHRoPTQgc29mdHRhYnN0b3A9NDogKi8KCi8qKgogKiBNb2R1bGUgdW5pbnN0YWxsZXIKICoKICogY29weXJpZ2h0IDIwMTMsIFJlZ2lvbmFsIERpc3RyaWN0IG9mIEZyYXNlci1Gb3J0IEdlb3JnZQogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQogKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCiAqIGFueSBsYXRlciB2ZXJzaW9uLgoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgogKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCiAqIG1vcmUgZGV0YWlscy4gIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBIE9yCiAqIHJlYWQgaXQgb25saW5lOiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwKCioqLwoKCgovLyByZW1vdmUgdGhlIGRhdGFiYXNlIHRhYmxlCiRkYiAtICRnQ21zLT5HZXREYigpOwokZGljdCA9IE5ld0RhdGFEaWN0aW9uYXJ5KCAkZGIgKTsKJHNxbGFycmF5ID0gJGRpY3QtPkRyb3BUYWJsZVNRTCggY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfcmRtYXAiICk7CiRkaWN0LT5FeGVjdXRlU1FMQXJyYXkoJHNxbGFycmF5KTsKCiRkYi0+RHJvcFNlcXVlbmNlKCBjbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9yZG1hcF9zZXEiKTsKCi8vIHJlbW92ZSBldmVudCBoYW5kbGVycwokdGhpcy0+UmVtb3ZlRXZlbnRIYW5kbGVyKCdDb3JlJywnQ29udGVudFBvc3RSZW5kZXInLGZhbHNlKTsKJHRoaXMtPlJlbW92ZVByZWZlcmVuY2UoJ2Jhc2VtYXAnKTsKJHRoaXMtPlJlbW92ZVByZWZlcmVuY2UoJ2luaXRpYWxfZXh0ZW50Jyk7Cgo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/method.upgrade.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyogdmltOiBzZXQgZXhwYW5kdGFiIHRhYnN0b3A9NCBzaGlmdHdpZHRoPTQgc29mdHRhYnN0b3A9NDogKi8KCi8qKgogKiBNb2R1bGUgdXBncmFkZQogKgogKiBjb3B5cmlnaHQgMjAxMywgUmVnaW9uYWwgRGlzdHJpY3Qgb2YgRnJhc2VyLUZvcnQgR2VvcmdlCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCiAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKICogYW55IGxhdGVyIHZlcnNpb24uCgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKICogbW9yZSBkZXRhaWxzLiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EgT3IKICogcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAoKKiovCgoKCWlmICghaXNzZXQoJGdDbXMpKSBleGl0OwoKCSRjdXJyZW50X3ZlcnNpb24gPSAkb2xkdmVyc2lvbjsKCXN3aXRjaCgkY3VycmVudF92ZXJzaW9uKSB7CgkJY2FzZSAiMC4wLjEiOiB7CgkJCSRkYiA9IGNtc21zKCktPkdldERiKCk7CgkJCSR0YWJvcHRhcnJheSAgPWFycmF5KCdteXNxbCcgPT4gJ0VOR0lORT1NeUlTQU0nKTsKCQkJJGRpY3QgPSBOZXdEYXRhRGljdGlvbmFyeSgkZGIpOwoJCQkkZmxkcyA9ICJ0ZW1wbGF0ZV9pZCBJIEFVVE8gS0VZLAoJCQluYW1lIEMoODApIE5PVE5VTEwsCgkJCWNvZGUgWCBOT1ROVUxMCgkJCSI7CgkJCSRzcWxhcnJheSA9ICRkaWN0LT5DcmVhdGVUYWJsZVNRTChjbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9yZG1hcF90ZW1wbGF0ZXMiLCAkZmxkcywgJHRhYm9wdGFycmF5KTsKCQkJaWYgKCEkZGljdC0+RXhlY3V0ZVNRTEFycmF5KCRzcWxhcnJheSkpIHsKCQkJCSR0aGlzLT5BdWRpdCgxLCAkdGhpcy0+TGFuZygnZnJpZW5kbHluYW1lJyksICR0aGlzLT5MYW5nKCd1cGdyYWRlX2ZhaWxlZCcpKTsKCQkJCXJldHVybjsKCQkJfQoKCQkJJGZsZHMgPSAgIgoJCQkJdGVtcGxhdGVfaWQgSSBDT05TVFJBSU5UUyAnRk9SRUlHTiBLRVkgUkVGRVJFTkNFUyIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfcmRtYXBfdGVtcGxhdGVzJyI7CgoJCQkkc3FsYXJyYXkgPSAkZGljdC0+QWRkQ29sdW1uU1FMKGNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX3JkbWFwIiwgJGZsZHMpOwoJCQlpZiAoISRkaWN0LT5FeGVjdXRlU1FMQXJyYXkoJHNxbGFycmF5KSkgewoJCQkJJHRoaXMtPkF1ZGl0KDEsICR0aGlzLT5MYW5nKCdmcmllbmRseW5hbWUnKSwgJHRoaXMtTGFuZygndXBncmFkZV9mYWlsZWQnKSk7CgkJCQlyZXR1cm47CgkJCX0KCgkJCWJyZWFrOwoJCX0KCQljYXNlICIwLjAuMiI6IHsKCQkJJGRiID0gY21zbXMoKS0+R2V0RGIoKTsKCQkJJHRhYm9wdGFycmF5ICA9YXJyYXkoJ215c3FsJyA9PiAnRU5HSU5FPU15SVNBTScpOwoJCQkkZGljdCA9IE5ld0RhdGFEaWN0aW9uYXJ5KCRkYik7CgkJCSRxID0gJGRpY3QtPkRyb3BDb2x1bW5TUUwoY21zX2RiX3ByZWZpeCgpLidtb2R1bGVfcmRtYXAnLCAndGVtcGxhdGVfaWQnKTsKCQkJJGRpY3QtPkV4ZWN1dGVTUUxBcnJheSgkcSk7CgoJCQkkcSA9ICRkaWN0LT5Ecm9wVGFibGVTUUwoY21zX2RiX3ByZWZpeCgpLidtb2R1bGVfcmRtYXBfdGVtcGxhdGVzJyk7CgkJCSRkaWN0LT5FeGVjdXRlU1FMQXJyYXkoJHEpOwoKCQkJJHEgPSAkZGljdC0+QWRkQ29sdW1uU1FMKGNtc19kYl9wcmVmaXgoKS4nbW9kdWxlX3JkbWFwJywgInRlbXBsYXRlX25hbWUgQyg4MCkgTk9UTlVMTCIpOwoJCQkkZGljdC0+RXhlY3V0ZVNRTEFycmF5KCRxKTsKCQl9CiAgICAgICAgZGVmYXVsdDogewogICAgICAgICAgICAkZGIgPSBjbXNtcygpLT5HZXREYigpOwogICAgICAgICAgICAkc3FsID0gIlNFTEVDVCBDT1VOVCgqKSBhcyBjbnQgZnJvbSBpbmZvcm1hdGlvbl9zY2hlbWEuY29sdW1ucyB3aGVyZSB0YWJsZV9uYW1lID0gJ2Ntc19tb2R1bGVfcmRtYXAnIGFuZCBjb2x1bW5fbmFtZSA9ICdvdmVybGF5X3BhcmFtZXRlcnMiOwogICAgICAgICAgICAkcmVzdWx0ID0gJGRiLT5HZXRSb3coJHNxbCk7CiAgICAgICAgICAgIGlmICgkcmVzdWx0WydjbnQnXSA9PSAwKSB7CiAgICAgICAgICAgICAgICAvLyBtaXNzaW5nIHRoZSBvdmVybGF5X3BhcmFtZXRlcnMgZmllbGQKICAgICAgICAgICAgICAgICRkaWN0ID0gTmV3RGF0YURpY3Rpb25hcnkoJGRiKTsKICAgICAgICAgICAgICAgICR0YWJvcHRhcnJheSA9IGFycmF5KCdteXNxbCcgPT4gJ0VOR0lORT1NeUlTQU0nKTsKICAgICAgICAgICAgICAgICRmbGQgPSAib3ZlcmxheV9wYXJhbWV0ZXJzIEMoMjU2KSI7CiAgICAgICAgICAgICAgICAkcSA9ICRkaWN0LT5BZGRDb2x1bW5TUUwoY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfcmRtYXAiLCAkZmxkLCAkdGFib3B0YXJyYXkpOwogICAgICAgICAgICAgICAgaWYgKCEkZGljdC0+RXhlY3V0ZVNRTEFycmF5KCRxKSkgewogICAgICAgICAgICAgICAgICAgICR0aGlzLT5BdWRpdCgxLCAkdGhpcy0+TGFuZygnZnJpZW5kbHluYW1lJyksICR0aGlzLT5MYW5nKCd1cGdyYWRlX2ZhaWxlZCcpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCX0KCSR0aGlzLT5BdWRpdCggMCwgJHRoaXMtPkxhbmcoJ2ZyaWVuZGx5bmFtZScpLCAkdGhpcy0+TGFuZygndXBncmFkZWQnKSk7Cj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/moduleinfo.ini</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[W21vZHVsZV0KbmFtZSA9ICJSRE1hcCIKdmVyc2lvbiA9ICIwLjUuMyIKYXV0aG9yID0gIiIKYXV0aG9yZW1haWwgPSAiIgptaW5jbXN2ZXJzaW9uID0gMi4wCmxhenlsb2FkYWRtaW4gPSAwCmxhenlsb2FkZnJvbnRlbmQgPSAwCg==]]></data>
	</file>
	<file>
	  <filename>/RDMap.module.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyogdmltOiBzZXQgZXhwYW5kdGFiIHRhYnN0b3A9NCBzaGlmdHdpZHRoPTQgc29mdHRhYnN0b3A9NDogKi8KCi8qKgogKiBSRE1hcCBtb2R1bGU6IHBsYWNlIGEgY3VzdG9taXphYmxlIG1hcCBvbiBhIHBhZ2UuCiAqCiAqIGNvcHlyaWdodCAyMDEzLCBSZWdpb25hbCBEaXN0cmljdCBvZiBGcmFzZXItRm9ydCBHZW9yZ2UKICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQogKiBhbnkgbGF0ZXIgdmVyc2lvbi4KCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAogKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgogKiBtb3JlIGRldGFpbHMuICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQSBPcgogKiByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMCgoqKi8KCmNsYXNzIFJETWFwIGV4dGVuZHMgQ01TTW9kdWxlIHsKCWZ1bmN0aW9uIEdldE5hbWUoKSB7CgkJcmV0dXJuICdSRE1hcCc7Cgl9CgoJZnVuY3Rpb24gR2V0RnJpZW5kbHlOYW1lKCkgewoJCXJldHVybiAkdGhpcy0+TGFuZygnZnJpZW5kbHluYW1lJyk7Cgl9CgoJZnVuY3Rpb24gR2V0VmVyc2lvbigpIHsKCQlyZXR1cm4gJzAuNS4zJzsKCX0KCglmdW5jdGlvbiBHZXRIZWxwKCkgewoJCXJldHVybiAkdGhpcy0+TGFuZygnaGVscCcpOwoJfQoKCWZ1bmN0aW9uIElzUGx1Z2luTW9kdWxlKCkgewoJCXJldHVybiB0cnVlOwoJfQoKCWZ1bmN0aW9uIEhhc0FkbWluKCkgewoJCXJldHVybiB0cnVlOwoJfQoKCWZ1bmN0aW9uIEdldEFkbWluU2VjdGlvbigpIHsKCQlyZXR1cm4gJ2V4dGVuc2lvbnMnOwoJfQoKCWZ1bmN0aW9uIFZpc2libGVUb0FkbWluVXNlcigpIHsKCQlyZXR1cm4gJHRoaXMtPkNoZWNrUGVybWlzc2lvbignVXNlIFJEIE1hcCcpOwoJfQoKCWZ1bmN0aW9uIEdldERhc2hib2FyZE91dHB1dCgpIHsKCQlyZXR1cm4gJyc7Cgl9CgoJZnVuY3Rpb24gR2V0RGVwZW5kZW5jaWVzKCkgewoJCXJldHVybiBhcnJheSgpOwoJfQoKCWZ1bmN0aW9uIE1pbmltdW1DTVNWZXJzaW9uKCkgewoJCXJldHVybiAnMi4wJzsKCX0KCglmdW5jdGlvbiBNYXhpbXVtQ01TVmVyc2lvbigpIHsKCQlyZXR1cm4gJzMuMC4wJzsKCX0KCglmdW5jdGlvbiBTZXRQYXJhbWV0ZXJzKCkgewoJCSR0aGlzLT5SZWdpc3Rlck1vZHVsZVBsdWdpbigpOwoJCSR0aGlzLT5SZXN0cmljdFVua25vd25QYXJhbXMoKTsKCQkkdGhpcy0+Q3JlYXRlUGFyYW1ldGVyKCduYW1lJywgJycsICR0aGlzLT5MYW5nKCdoZWxwX25hbWUnKSk7CgkJJHRoaXMtPlNldFBhcmFtZXRlclR5cGUoJ25hbWUnLENMRUFOX1NUUklORyk7CgoJfQoKCWZ1bmN0aW9uIEdldEhlYWRlckhUTUwoKSB7CgkJJHRoaXMtPkZpcmVEZWJ1ZygnaW5mbycsJ0hlYWRlciB0ZXh0OiAnLiR0aGlzLT5fb3V0X2hlYWRlcl9odG1sKCkpOwoJCXJldHVybiAkdGhpcy0+X291dF9oZWFkZXJfaHRtbCgpOwoJfQoKCXByb3RlY3RlZCBmdW5jdGlvbiBfb3V0X2hlYWRlcl9odG1sKCkgewoJCSRvdXQgPSAnPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwOi8vY2RuLmxlYWZsZXRqcy5jb20vbGVhZmxldC0wLjYuNC9sZWFmbGV0LmNzcyIgLz4nOwoJCSRvdXQgLj0gJzxzY3JpcHQgc3JjPSJodHRwOi8vY2RuLmxlYWZsZXRqcy5jb20vbGVhZmxldC0wLjYuNC9sZWFmbGV0LmpzIj48L3NjcmlwdD4nOwoJCXJldHVybiAkb3V0OwoJfQoKCWZ1bmN0aW9uIEZpcmVEZWJ1ZygkY29tbWFuZCwgJG1lc3NhZ2UsICR2YXJpYWJsZXM9YXJyYXkoKSkgewoJCSRmaXJlcGhwbW9kdWxlPSR0aGlzLT5HZXRNb2R1bGVJbnN0YW5jZSgnRmlyZVBIUERlYnVnJyk7CgkJaWYoJGZpcmVwaHBtb2R1bGUpIHsKCQkJJGZpcmVwaHBtb2R1bGUtPlNldE1vZHVsZU5hbWUoJHRoaXMtPkdldE5hbWUoKSk7CgkJCSRmaXJlcGhwbW9kdWxlLT5Db21tYW5kKCRjb21tYW5kLCAkbWVzc2FnZSwgJHZhcmlhYmxlcyk7CgkJfQoJfQoKCWZ1bmN0aW9uIENyZWF0ZUltYWdlTGluaygkaWQsICRhY3Rpb24sICRyZXR1cm5pZCwgJHRpdGxlLCAkaW1hZ2VwYXRoLCAkYWRkdGV4dD0nJywgJHBhcmFtcyA9IG51bGwpIHsKCQlyZXR1cm4gJHRoaXMtPkNyZWF0ZUxpbmsoJGlkLCAkYWN0aW9uLCAkcmV0dXJuaWQsIENtc0FkbWluVGhlbWVCYXNlOjpHZXRUaGVtZU9iamVjdCgpLT5EaXNwbGF5SW1hZ2UoJGltYWdlcGF0aCkuJGFkZHRleHQsICRwYXJhbXMsICcnLCBmYWxzZSwgZmFsc2UsICd0aXRsZT0nLiR0aXRsZSk7Cgl9Cn0KPz4K]]></data>
	</file>
	<file>
	  <filename>/templates/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/templates/adminmaps.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PHRhYmxlIGNlbGxzcGFjaW5nPSIwIiBjbGFzcz0icGFnZXRhYmxlIj4KCTx0aGVhZD4KCQk8dHI+CgkJPHRoIHdpZHRoPSI1JSI+eyRtYXBfaWR9PC90aD4KCQk8dGg+eyRtYXBfbmFtZX08L3RoPgoJCTx0aCBjbGFzcz0icGFnZWljb24iPjwvdGg+CgkJPHRoIGNsYXNzPSJwYWdlaWNvbiI+Jm5ic3A7PC90aD4KCQk8dGggY2xhc3M9InBhZ2VpY29uIj4mbmJzcDs8L3RoPgoJPC90aGVhZD4KCTx0Ym9keT4KCXtmb3JlYWNoIGZyb209JG1hcGxpc3QgaXRlbT0nbWFwJ30KCQl7Y3ljbGUgdmFsdWVzPSdyb3cxLHJvdzInIGFzc2lnbj0ncm93Y2xhc3MnfQoJCTx0ciBjbGFzcz0ieyRyb3djbGFzc30iIG9ubW91c2VvdmVyPSJ0aGlzLmNsYXNzTmFtZT0neyRyb3djbGFzc31ob3Zlcic7IiBvbm1vdXNlb3V0PSJ0aGlzLmNsYXNzTmFtZT0neyRyb3djbGFzc30nOyI+CgkJCTx0ZD57JG1hcC0+bWFwX2lkfTwvdGQ+CgkJCTx0ZD57JG1hcC0+bWFwX2xpbmt9PC90ZD4KCQkJPHRkPntpZiBpc3NldCgkbWFwLT5lZGl0X2xpbmspfXskbWFwLT5lZGl0X2xpbmt9e2Vsc2V9Jm5ic3A7ey9pZn08L3RkPgoJCQk8dGQ+e2lmIGlzc2V0KCRtYXAtPmNvcHlfbGluayl9eyRtYXAtPmNvcHlfbGlua317ZWxzZX0mbmJzcDt7L2lmfTwvdGQ+CgkJCTx0ZD57aWYgaXNzZXQoJG1hcC0+ZGVsZXRlX2xpbmspfXskbWFwLT5kZWxldGVfbGlua317ZWxzZX0mbmJzcDt7L2lmfTwvdGQ+CgkJCTwhLS0gYWRkIHJlbWFpbmluZyBtYXAgYXR0cmlidXRlcyAtLT4KCQk8L3RyPgoJey9mb3JlYWNofQoJPC90Ym9keT4JCjwvdGFibGU+CnskYWRkX21hcH0KCg==]]></data>
	</file>
	<file>
	  <filename>/templates/adminpanel.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[eyR0YWJfaGVhZGVyc30KeyR0YWJzX3N0YXJ0fQoJeyRzdGFydF9nZW5lcmFsX3RhYn0KCQl7JHdlbGNvbWVfdGV4dH0KCXskc3RhcnRfcHJlZmVyZW5jZV90YWJ9CgkJe2lmICRzdGFydF9wcmVmZXJlbmNlX3RhYiAhPSAnJ30KCQkJeyRzdGFydF9mb3JtfQoJCQkJPGRpdiBjbGFzcz0icGFnZWNvbnRlbnQiPgoJCQkJCTxwIGNsYXNzPSJwYWdldGV4dCI+eyR0aXRsZV9iYXNlbWFwfTwvcD4KCQkJCQk8cCBjbGFzcz0icGFnZWlucHV0Ij57JGlucHV0X2Jhc2VtYXB9PC9wPgoJCQkJPC9kaXY+CgkJCQk8ZGl2IGNsYXNzPSJwYWdlY29udGVudCI+CgkJCQkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHRpdGxlX2V4dGVudH08L3A+CgkJCQkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dF9leHRlbnR9PC9wPgoJCQkJPC9kaXY+CgkJCQl7JHN1Ym1pdH0KCQkJPC9mb3JtPgoJCXsvaWZ9Cgl7JHN0YXJ0X21hcHNfdGFifQoJCXtpbmNsdWRlIGZpbGU9IiRtYXBzX3RlbXBsYXRlIn0KCXskc3RhcnRfdGVtcGxhdGVzX3RhYn0KCQl7aW5jbHVkZSBmaWxlPSIkdGVtcGxhdGVzX3RlbXBsYXRlIn0KeyR0YWJzX2VuZH0Ke2lmIGlzc2V0KCRlcnJvcl9tc2cpfQo8ZGl2IGlkPSJlcnJvcnMiIHN0eWxlPSJib3JkZXI6IDFweCBzb2xpZCByZWQ7IHBhZGRpbmc6IDNweDsgY29sb3I6cmVkOyI+CkVycm9yOiB7JGVycm9yX21zZ30KPC9kaXY+CnsvaWZ9Cg==]]></data>
	</file>
	<file>
	  <filename>/templates/admintemplates.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PHRhYmxlIGNlbGxzcGFjaW5nPSIwIiBjbGFzcz0icGFnZXRhYmxlIj4KCTx0aGVhZD4KCQk8dHI+CgkJPHRoPnskZmllbGRfdGVtcGxhdGVfbmFtZX08L3RoPgoJCTx0aCBjbGFzcz0icGFnZWljb24iPjwvdGg+CgkJPHRoIGNsYXNzPSJwYWdlaWNvbiI+PC90aD4KCQk8dGggY2xhc3M9InBhZ2VpY29uIj4mbmJzcDs8L3RoPgoJPC90aGVhZD4KCTx0Ym9keT4KCXtmb3JlYWNoIGZyb209JHRlbXBsYXRlbGlzdCBpdGVtPSd0ZW1wbGF0ZSd9CgkJe2N5Y2xlIHZhbHVlcz0ncm93MSxyb3cyJyBhc3NpZ249J3Jvd2NsYXNzJ30KCQk8dHIgY2xhc3M9Inskcm93Y2xhc3N9IiBvbm1vdXNlb3Zlcj0idGhpcy5jbGFzc05hbWU9J3skcm93Y2xhc3N9aG92ZXInOyIgb25tb3VzZW91dD0idGhpcy5jbGFzc05hbWU9J3skcm93Y2xhc3N9JzsiPgoJCQk8dGQ+e2lmIGlzc2V0KCR0ZW1wbGF0ZS0+ZWRpdF9saW5rKX17JHRlbXBsYXRlLT5lZGl0X2xpbmt9e2Vsc2V9Jm5ic3A7ey9pZn08L3RkPgoJCQk8dGQ+e2lmIGlzc2V0KCR0ZW1wbGF0ZS0+ZWRpdF9pbWFnZWxpbmspfXskdGVtcGxhdGUtPmVkaXRfaW1hZ2VsaW5rfXtlbHNlfSZuYnNwO3svaWZ9PC90ZD4KCQkJPHRkPntpZiBpc3NldCgkdGVtcGxhdGUtPmNvcHlfbGluayl9eyR0ZW1wbGF0ZS0+Y29weV9saW5rfXtlbHNlfSZuYnNwO3svaWZ9PC90ZD4KCQkJPHRkPntpZiBpc3NldCgkdGVtcGxhdGUtPmRlbGV0ZV9saW5rKX17JHRlbXBsYXRlLT5kZWxldGVfbGlua317ZWxzZX0mbmJzcDt7L2lmfTwvdGQ+CgkJCTwhLS0gYWRkIHJlbWFpbmluZyBtYXAgYXR0cmlidXRlcyAtLT4KCQk8L3RyPgoJey9mb3JlYWNofQoJPC90Ym9keT4JCjwvdGFibGU+CnskYWRkX3RlbXBsYXRlfQo=]]></data>
	</file>
	<file>
	  <filename>/templates/edit_map.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGgyPkVkaXQgTWFwPC9oMj4Ke2lmIGlzc2V0KCRlcnJvcil9CjxkaXYgaWQ9ImVycm9ycyIgc3R5bGU9ImJvcmRlcjogMXB4IHNvbGlkIHJlZDsgcGFkZGluZzogM3B4OyBjb2xvcjpyZWQ7Ij4KeyRlcnJvcn0KPC9kaXY+CnsvaWZ9Cnskc3RhcnRfZm9ybX0KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+Cgk8cCBjbGFzcz0icGFnZXRleHQiPnskdGl0bGVfbmFtZX08L3A+PHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRuYW1lfTwvcD48cD57JGhlbHBfbmFtZX08L3A+Cgk8L2Rpdj4KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+Cgk8cCBjbGFzcz0icGFnZXRleHQiPnskdGl0bGVfdGl0bGV9PC9wPjxwIGNsYXNzPSJwYWdlaW5wdXQiPnskdGl0bGV9PC9wPjxwPnskaGVscF90aXRsZX08L3A+Cgk8L2Rpdj4KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+Cgk8cCBjbGFzcz0icGFnZXRleHQiPnskdGl0bGVfYmFzZW1hcH08L3A+PHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRiYXNlbWFwfTwvcD48cD57JGhlbHBfYmFzZW1hcH08L3A+Cgk8L2Rpdj4KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+Cgk8cCBjbGFzcz0icGFnZXRleHQiPnskdGl0bGVfZXh0ZW50fTwvcD48cCBjbGFzcz0icGFnZWlucHV0Ij57JGluaXRpYWxfZXh0ZW50fTwvcD48cD57JGhlbHBfZXh0ZW50fTwvcD4KCTwvZGl2PgoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KCTxwIGNsYXNzPSJwYWdldGV4dCI+eyR0aXRsZV9vdmVybGF5fTwvcD48cCBjbGFzcz0icGFnZWlucHV0Ij57JG92ZXJsYXl9PC9wPjxwPnskaGVscF9vdmVybGF5fTwvcD4KCTwvZGl2PgoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KCTxwIGNsYXNzPSJwYWdldGV4dCI+eyR0aXRsZV9vdmVybGF5X3BhcmFtZXRlcnN9PC9wPjxwIGNsYXNzPSJwYWdlaW5wdXQiPnskb3ZlcmxheV9wYXJhbWV0ZXJzfTwvcD48cD57JGhlbHBfb3ZlcmxheV9wYXJhbWV0ZXJzfTwvcD4KCTwvZGl2PgoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KCTxwIGNsYXNzPSJwYWdldGV4dCI+eyR0aXRsZV90ZW1wbGF0ZV9uYW1lfTwvcD48cCBjbGFzcz0icGFnZWlucHV0Ij57JHRlbXBsYXRlc308L3A+Cgk8L2Rpdj4KCXskbWFwX2lkfQoJeyRzdWJtaXR9eyRjYW5jZWx9CjwvZm9ybT4K]]></data>
	</file>
	<file>
	  <filename>/templates/edit_template.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGgyPkVkaXQgVGVtcGxhdGU8L2gyPgp7aWYgaXNzZXQoJGVycm9yKX0KPGRpdiBzdHlsZT0iYm9yZGVyOiAxcHggc29saWQgcmVkOyBwYWRkaW5nOiAzcHg7IGNvbG9yOnJlZDsiPnskZXJyb3J9PC9kaXY+CnsvaWZ9Cnskc3RhcnRfZm9ybX0KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+Cgk8cCBjbGFzcz0icGFnZXRleHQiPnskdGl0bGVfbmFtZX08L3A+PHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRuYW1lfTwvcD48cD57JGhlbHBfbmFtZX08L3A+Cgk8L2Rpdj4KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+Cgk8cCBjbGFzcz0icGFnZXRleHQiPnskdGl0bGVfY29kZX08L3A+PHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRjb2RlfTwvcD48cD57JGhlbHBfY29kZX08L3A+Cgk8L2Rpdj4KCXskc3VibWl0fXskY2FuY2VsfQo8L2Zvcm0+Cg==]]></data>
	</file>
	<file>
	  <filename>/templates/error.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGRpdj4KCTxoMz5FcnJvcjwvaDM+Cgk8cD5UaGUgbWFwIGNvdWxkIG5vdCBiZSBkcmF3bi4gVGhlIGVycm9yIHJlcG9ydGVkIHdhczo8L3A+Cgk8dHQ+eyRlcnJvcn08L3R0Pgo8L2Rpdj4K]]></data>
	</file>
	<file>
	  <filename>/templates/map.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[e2lmIGlzc2V0KCRlcnJvcil9PHN0cm9uZz57JGVycm9yfTwvc3Ryb25nPnsvaWZ9CjxoMz57JHJkbWFwLT50aXRsZX08L2gzPgo8ZGl2IGlkPSJtYXB7JHJkbWFwLT5tYXBfaWR9IiBzdHlsZT0iaGVpZ2h0OiA0MDBweCI+CjwvZGl2Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CnZhciBiYXNlbWFwX3VybCA9ICJ7JHJkbWFwLT5iYXNlbWFwfSI7CnZhciBvdmVybGF5X3VybCA9ICJ7JHJkbWFwLT5vdmVybGF5fSI7CnZhciBpbml0aWFsX2V4dGVudCA9ICJ7JHJkbWFwLT5pbml0aWFsX2V4dGVudH0iOwp2YXIgb3ZlcmxheV9wYXJhbWV0ZXJzID0gInskcmRtYXAtPm92ZXJsYXlfcGFyYW1ldGVyc30iOwp7bGl0ZXJhbH0KZnVuY3Rpb24gY3JlYXRlUG9wdXAoZ2VvanNvbixsYXllcikgewoJaWYgKGdlb2pzb24ucHJvcGVydGllcykgewoJCXZhciBwb3B1cFRleHQgPSAiPGRpdiBzdHlsZT0nb3ZlcmZsb3cteTpzY3JvbGw7IG1heC1oZWlnaHQ6MjAwcHg7Jz4iOwoJCWZvciAocHJvcCBpbiBnZW9qc29uLnByb3BlcnRpZXMpIHsKCQkJdmFyIHZhbCA9IGdlb2pzb24ucHJvcGVydGllc1twcm9wXTsKCQkJaWYgKHZhbCAmJiBwcm9wICE9PSAiZ2xvYmFsaWQiICYmICFwcm9wLm1hdGNoKC9vYmplY3RpZF9cZCsvKSkgewoJCQkJcG9wdXBUZXh0ICs9ICI8Yj4iICsgcHJvcCArICI8L2I+OiIgKyB2YWwgKyAiPGJyLz4iOwoJCQl9CgkJfQoJCXBvcHVwVGV4dCArPSAiPC9kaXY+IjsKCQlsYXllci5iaW5kUG9wdXAocG9wdXBUZXh0KTsKCX0KfQoKZnVuY3Rpb24gcHJvY2Vzc1BhcmFtcyhvdmVybGF5X3BhcmFtcykgewoJdmFyIHRlcm1zID0gb3ZlcmxheV9wYXJhbXMuc3BsaXQoJzsnKTsKCXZhciBvdXRfdGVybXMgPSBuZXcgT2JqZWN0KCk7Cglmb3IoaT0wO2k8dGVybXMubGVuZ3RoO2krKykgewoJCXZhciB0ID0gdGVybXNbaV07CgkJdmFyIGtleSA9IHQuc2xpY2UoMCx0LmluZGV4T2YoJz0nKSk7CgkJdmFyIHZhbCA9IHQuc2xpY2UodC5pbmRleE9mKCc9JykgKyAxLHQubGVuZ3RoKTsKCQlvdXRfdGVybXNba2V5XSA9IHZhbDsKCX0KCXJldHVybiBvdXRfdGVybXM7Cn0KCnZhciB4ID0gaW5pdGlhbF9leHRlbnQuc3BsaXQoJy8nKVswXTsKdmFyIHkgPSBpbml0aWFsX2V4dGVudC5zcGxpdCgnLycpWzFdOwp2YXIgem9vbSA9IGluaXRpYWxfZXh0ZW50LnNwbGl0KCcvJylbMl07CnsvbGl0ZXJhbH0KdmFyIG1hcCA9IEwubWFwKCdtYXB7JHJkbWFwLT5tYXBfaWR9Jykuc2V0VmlldyhbeSx4XSx6b29tKTsKe2xpdGVyYWx9CkwudGlsZUxheWVyKGJhc2VtYXBfdXJsICsgJy90aWxlL3t6fS97eX0ve3h9JywgewoJbWF4em9vbTogMTkgfSkuYWRkVG8obWFwKTsKaWYgKG92ZXJsYXlfdXJsICE9PSBudWxsKSB7Cgl2YXIgZXNyaXBhcmFtcyA9IHsgb25FYWNoRmVhdHVyZTogY3JlYXRlUG9wdXAgfTsKCWlmIChvdmVybGF5X3BhcmFtZXRlcnMgIT09IG51bGwpIHsKCQl2YXIgcGFyYW1zID0gcHJvY2Vzc1BhcmFtcyhvdmVybGF5X3BhcmFtZXRlcnMpOwoJCWZvciAoa2V5IGluIHBhcmFtcykgewoJCQllc3JpcGFyYW1zW2tleV0gPSBwYXJhbXNba2V5XTsKCQl9Cgl9CglsYXllckZTID0gTC5lc3JpLmZlYXR1cmVMYXllcihvdmVybGF5X3VybCwgZXNyaXBhcmFtcykuYWRkVG8obWFwKTsKfQoKey9saXRlcmFsfQo8L3NjcmlwdD4K]]></data>
	</file>
</module>
