<?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>JQueryTools</name>
	<version>1.3.6</version>
  <mincmsversion>1.12</mincmsversion>
	<help><![CDATA[PGgzPldoYXQgaXMgdGhpcz88L2gzPgo8cD5UaGlzIG1vZHVsZSBhZGRzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIDxhIGhyZWY9Imh0dHA6Ly93d3cuanF1ZXJ5LmNvbSI+alF1ZXJ5PC9hPiBhbmQgdmFyaW91cyBhZGRvbiBsaWJyYXJpZXMgdG8gQ01TIE1hZGUgU2ltcGxlIHBhZ2UsIGFuZCBtb2R1bGVzIChldmVuIGluIHRoZSBhZG1pbiBzZWN0aW9uKSwgY29udmVuaWVudGx5IGFuZCBlYXNpbHkuICBJdCBwcm92aWRlcyBhIGNvbnZlbmllbnQgYW5kIHNpbXBsZSB3YXkgdG8gaW5jbHVkZSBqcXVlcnkgYW5kIGpxdWVyeSBkZXBlbmRlbnQgbGlicmFyaWVzIGludG8geW91ciBDTVNNUyBjb250ZW50IHBhZ2UuPC9wPgo8aDM+SG93IGRvIEkgdXNlIGl0PzwvaDM+CjxwPkVuYWJsaW5nIHRoaXMgZnVuY3Rpb25hbGl0eSBpcyBhIHR3byBzdGVwIHByb2Nlc3M6PC9wPgo8dWw+CiAgPGxpPjEuICBFbmFibGUgdGhlIGpxdWVyeSBsaWJyYXJpZXMgdGhhdCB5b3Ugd2FudCBieSBjYWxsaW5nIDxjb2RlPntKUXVlcnlUb29scyBhY3Rpb249cmVxdWlyZSBsaWI9Jmx0O2xpYnJhcnkgbmFtZSZndDsgbm9jYWNoZX08L2NvZGU+IGluIHlvdXIgcGFnZSBjb250ZW50LgogICAgPHA+VGhpcyB0YWcgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyB0byBlbmFibGUgbXVsdGlwbGUgbGlicmFyaWVzLiAgdGhlIGxpYiBhcmd1bWVudCBhbHNvIHN1cHBvcnRzIHBhc3NpbmcgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBsaWJyYXJ5IG5hbWVzLjwvcD4KICA8L2xpPgogIDxsaT4yLiAgQ2FsbCA8Y29kZT57SlFlcnlUb29scyBhY3Rpb249cGxhY2VtYXJrZXIgbm9jYWNoZX08L2NvZGU+IGluIHRoZSBhcHByb3ByaWF0ZSBwYXJ0IG9mIHlvdXIgcGFnZSB0ZW1wbGF0ZS4KICAgIDx1bD4KICAgICAgPGxpPlRvIGVuYWJsZSBKUXVlcnlUb29scyBmb3IgYSBzcGVjaWZpYyBwYWdlIGl0IGlzIG9mdGVuIHVzZWZ1bCB0byBwbGFjZSB0aGUgPGNvZGU+e0pRdWVyeVRvb2xzIGFjdGlvbj1wbGFjZW1hcmtlciBub2NhY2hlfTwvY29kZT4gdGFnIGluIHRoZSBwYWdlIHNwZWNpZmljIG1ldGFkYXRhIGZpZWxkIG9mIGVhY2ggY29udGVudCBwYWdlLjwvbGk+CiAgICAgIDxsaT5UbyBlbmFibGUgSlF1ZXJ5VG9vbHMgb24gYSBzaXRlIHdpZGUgYmFzaXMgdGhlIDxjb2RlPntKcXVlcnlUb29scyBhY3Rpb249cGxhY2VtYXJrZXIgbm9jYWNoZX08L2NvZGU+IHRhZyBjYW4gYmUgcGxhc2VkIGluIHRoZSBnbG9iYWwgbWV0YWRhdGEgZmllbGQgaW4gdGhlIGdsb2JhbCBzZXR0aW5ncy48L2xpPgogICAgICA8bGk+WW91IG1heSBhbHNvIHBsYWNlIHRoZSA8Y29kZT57SlF1ZXJ5VG9vbHMgYWN0aW9uPXBsYWNlbWFya2VyfTwvY29kZT4gdGFnIGluIGVhY2ggc3BlY2lmaWMgcGFnZSB0ZW1wbGF0ZSwgYXQgdGhlIGJvdG9vbSBvZiB0aGUgdGVtcGxhdGUgYWJvdmUgPC9ib2R5PiBvciBhbnl3aGVyZSBpbiB0aGhlIGhlYWQgc2VjdGlvbi48L2xpPgogICAgPC91bD4KICA8L2xpPgo8L3VsPgo8cD5UaGlzIG1vZHVsZSBkb2VzIG5vdCBwcm92aWRlIHNhbXBsZXMgYW5kIGluc3RydWN0aW9ucyBhcyB0byBob3cgdG8gdXNlIGpxdWVyeSBvciB0aGUgdmFyaW91cyBhZGRvbiBsaWJyYXJpZXMgdGhhdCB3ZSBpbmNsdWRlLiAgdG8gbGVhcm4gaG93IHRvIHVzZSB0aGVzZSBsaWJyYXJpZXMgeW91IHdpbGwgbmVlZCB0byByZWFkIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgcGx1Z2lucyBhdCB0aGVpciByZXNwZWN0aXZlIGhvbWUgcGFnZS48L3A+Cgo8aDM+V2hhdCBqcXVlcnkgdmVyc2lvbiBpcyBpbmNsdWRlZD88L2gzPgo8cD5DdXJyZW50bHkgSlF1ZXJ5VG9vbHMgdXNlcyBqcXVlcnkgMS44LjM8L3A+CjxoMz5XaGF0IEpRdWVyeSBwbHVnaW5zIGFyZSBpbmNsdWRlZDwvaDM+Cjx1bD4KICA8bGk+dGFibGVzb3J0ZXIgPGVtPihzZWUgPGEgaHJlZj0iaHR0cDovL3RhYmxlc29ydGVyLmNvbSI+aHR0cDovL3RhYmxlc29ydGVyLmNvbTwvYT4gZm9yIHVzYWdlIGluc3RydWN0aW9ucyk8L2VtPgo8cD4tLSBUbyBhbGxvdyBzb3J0aW5nIHlvdXIgdGFibGVzLCBnaXZlIHRoZSBmb2xsd2luZyBjbGFzc2VzIHRvIHRoZSB0YWJsZSBkZWZpbml0aW9uOiBjbXNfc29ydGFibGUgdGFibGVzb3J0ZXIuIGkuZTogPGNvZGU+Jmx0O3RhYmxlIGNsYXNzPSJjbXNfc29ydGFibGUgdGFibGVzb3J0ZXIiJmd0Oy4uLiZsdDsvdGFibGUmZ3Q7PC9jb2RlPjwvcD4KICA8L2xpPgogIDxsaT5qcXVlcnk8L2xpPgogIDxsaT5qcXVlcnkgdWkgLSBzbW9vdGhuZXNzIHRoZW1lLjwvbGk+CiAgPGxpPmNsdWV0aXAgPGVtPihzZWUgPGEgaHJlZj0iaHR0cDovL3BsdWdpbnMubGVhcm5pbmdqcXVlcnkuY29tL2NsdWV0aXAvIj5odHRwOi8vcGx1Z2lucy5sZWFybmluZ2pxdWVyeS5jb20vY2x1ZXRpcC88L2E+IGZvciB1c2FnZSBpbnN0cnVjdGlvbnMpPC9lbT48L2xpPgogIDxsaT5mb3JtIDxlbT4oc2VlIDxhIGhyZWY9Imh0dHA6Ly9tYWxzdXAuY29tL2pxdWVyeS9mb3JtLyI+aHR0cDovL21hbHN1cC5jb20vanF1ZXJ5L2Zvcm0vPC9hPiBmb3IgdXNhZ2UgaW5zdHJ1Y3Rpb25zKTwvZW0+PC9saT4KICA8bGk+ZmFuY3lib3ggPGVtPihzZWUgPGEgaHJlZj0iaHR0cDovL2ZhbmN5LmtsYWRlLmx2LyI+aHR0cDovL2ZhbmN5LmtsYWRlLmx2LzwvYT4gZm9yIHVzYWdlIGluc3RydWN0aW9ucyk8L2VtPjwvbGk+CiAgPGxpPmpzb248L2xpPgogIDxsaT5saWdodGJveDwvbGk+CiAgPGxpPmZpbGV1cGxvYWQgLSBUaGUgYmx1ZWltcCBqcXVlcnkgZmlsZSB1cGxvYWQgbGlicmFyeS48L2xpPgo8L3VsPgo8aDM+RXhhbXBsZTo8L2gzPgogPHA+U28geW91IGhhdmUgdXBsb2FkZWQgc29tZSBmaWxlcyB0byBhIGNhdGVnb3J5IGluIHRoZSB1cGxvYWRzIG1vZHVsZSwgYW5kIHlvdSB3YW50IHRvIHVzZSBmYW5jeWJveCB0byBwcmV2aWV3IHRoZSBpbWFnZXMgZnJvbSBhbiBVcGxvYWRzIG1vZHVsZSBzdW1tYXJ5IHZpZXcuIFRoaXMgaXMgYSBzaW1wbGUgMyBzdGVwIHByb2Nlc3M6PC9wPgo8b2w+CiAgIDxsaT5Nb2RpZnkgeW91ciB1cGxvYWRzIHN1bW1hcnkgdGVtcGxhdGUgdG8gc29tZXRoaW5nIHNpbWlsYXIgdG8gdGhpczoKPHByZT48Y29kZT48c3BhbiBzdHlsZT0iY29sb3I6IGJsdWU7Ij57SlF1ZXJ5VG9vbHMgYWN0aW9uPXJlcXVpcmUgbGliPWZhbmN5Ym94IG5vY2FjaGV9PC9zcGFuPgp7Zm9yZWFjaCBmcm9tPSRpdGVtcyBpdGVtPSdlbnRyeScgbmFtZT0ndXBsb2Fkcyd9CiAgJmx0O2RpdiBjbGFzcz0idXBsb2FkIiBzdHlsZT0iZmxvYXQ6IGxlZnQ7IHdpZHRoOiAzMyU7IiZndDsKICB7aWYgaXNzZXQoJGVudHJ5LT50aHVtYm5haWxfdXJsKX0KICAmbHQ7YSBjbGFzcz0iZmFuY3lib3giIGhyZWY9InskZW50cnktPm9yaWdmaWxlX3VybH0iIHRpdGxlPSJ7JGVudHJ5LT51cGxvYWRfbmFtZX0iJmd0OyZsdDtpbWcgc3JjPSJ7JGVudHJ5LT50aHVtYm5haWxfdXJsfSIgYWx0PSIiLyZndDsmbHQ7L2EmZ3Q7CiAgey9pZn0KICAmbHQ7L2RpdiZndDsKey9mb3JlYWNofQombHQ7ZGl2IHN0eWxlPSJjbGVhcjogYm90aDsiJmd0OyZndDsvZGl2Jmx0OzwvY29kZT48L3ByZT4KICAgPHA+Tm90ZSB0aGUgY2FsbCB0byBKUXVlcnlUb29scyB0byBpbmNsdWRlIHRoZSBmYW5jeWJveCBsaWJyYXJ5LiBBZGRpdGlvbmFsbHksIG5vdGUgdGhlIGNsYXNzIGdpdmVuIHRvIHRoZSA8ZW0+YTwvZW0+IHRhZy48L3A+CiAgPC9saT4KICA8bGk+Q2FsbCA8Y29kZT57SlF1ZXJ5VG9vbHMgYWN0aW9uPXBsYWNlbWFya2VyIG5vY2FjaGV9PC9jb2RlPgogICAgPHA+VGhlcmUgYXJlIGF0IGxlYXN0IGZvdXIgbG9jYXRpb25zIHdoZXJlIHRoaXMgdGFnIGNhbiBiZSBjYWxsZWQ6PC9wPgogICAgPHVsPgogICAgICA8bGk+SW4gdGhlIHBhZ2UgdGVtcGxhdGUgZGlyZWN0bHkgYmVmb3JlIHRoZSA8Y29kZT4mbHQ7L2JvZHkmZ3Q7PC9jb2RlPiB0YWcuPC9saT4KICAgICAgPGxpPkluIHRoZSBwYWdlIHRlbXBsYXRlIGRpcmVjdGx5IGJlZm9yZSB0aGUgPGNvZGU+Jmx0Oy9oZWFkJmd0OzwvY29kZT4gdGFnLjwvbGk+CiAgICAgIDxsaT5JbiB0aGUgcGFnZSBtZXRhZGF0YSBmaWVsZCB3aGVuIGVkaXRpbmcgY29udGVudC48L2xpPgogICAgICA8bGk+SW4gdGhlIGdsb2JhbCBtZXRhZGF0YSBmaWVsZCBpbiB0aGUgZ2xvYmFsIHNldHRpbmdzIHBhZ2UuPC9saT4KICAgIDwvdWw+CiAgPC9saT4KICA8bGk+Q2FsbCB0aGUgVXBsb2FkcyBtb2R1bGUgZnJvbSBhIHBhZ2UuICBpLmU6PGJyLz4KICAgIDxwcmU+PGNvZGU+e1VwbG9hZHMgY2F0ZWdvcnk9Y2F0ZWdvcnlfbmFtZX08L2NvZGU+PC9wcmU+CiAgPC9saT4KPC9vbD4KPGgzPkJ1aWx0IGluIFJlYWR5IFNjcmlwdHM8L2gzPgo8cD5UaGlzIG1vZHVsZSBzdXBwb3J0cyBzb21lIHNpbXBsZSByZWFkeSBzdGF0ZXMgdG8gZWFzZSBpbiBkZXZlbG9wbWVudC4gIEFsbCBvZiB0aGVzZSBjYW4gYmUgb3ZlcndyaXR0ZW4gaW4geW91ciBvd24gamF2YXNjcmlwdDo8L3A+Cjx1bD4KICAgIDxsaT5mYW5jeWJveCAtIGZhbmN5Ym94IHdpbGwgd29yayBvbiBhbnkgYSB0YWcgd2l0aCBhIGNsYXNzIG9mIGZhbmN5Ym94OiAgJCgnYS5mYW5jeWJveCcpLmZhbmN5Ym94KCkKICAgICAgPHByZT48Y29kZT4mbHQ7YSBjbGFzcz0mcXVvdDtmYW5jeWJveCZxdW90OyBocmVmPSZxdW90O2h0dHA6Ly93d3cubXlzaXRlLmNvbS91cGxvYWRzL2ltYWdlcy9pbWFnZS5qcGcmcXVvdDsmZ3Q7Jmx0O2ltZyBzcmM9JnF1b3Q7aHR0cDovL3d3dy5teXNpdGUuY29tL3VwbG9hZHMvaW1hZ2VzL3RodW1iX2ltYWdlLmpwZyZxdW90Oy8mZ3Q7Jmx0O2EmZ3Q7PC9jb2RlPjwvcHJlPgoJCSAgICA8cD48c3Ryb25nPkhpbnQ6PC9zdHJvbmc+IFVzZSBDR1NtYXJ0SW1hZ2UgdG8gYXZvaWQgaGF2aW5nIHRvIGNyZWF0ZSBhbmQgbWFuYWdlIHRodW1ibmFpbHMgPGVtPihyZXF1aXJlcyBkb3dubG9hZGluZyBhbmQgaW5zdGFsbGluZyB0aGUgQ0dTbWFydEltYWdlIG1vZHVsZSk8L2VtPjo8L3A+CgkJICAgIDxwcmU+PGNvZGU+Jmx0O2EgY2xhc3M9JnF1b3Q7ZmFuY3lib3gmcXVvdDsgaHJlZj0mcXVvdDt7Q0dTbWFydEltYWdlIHNyYz0naW1hZ2VzL2ltYWdlLmpwZycgbm9lbWJlZD0xfSZxdW90OyZndDt7Q0dTbWFydEltYWdlIHNyYz0naW1hZ2VzL2ltYWdlLmpwZycgd2lkdGg9MTAwIGhlaWdodD0xMDB9Jmx0O2EmZ3Q7PC9wcmU+PC9jb2RlPgogICAgPC9saT4KICAgIDxsaT5saWdodGJveCAtIGxpZ2h0Ym94IHdpbGwgd29yayBvbiBhbnkgYSB0YWcgd2l0aCBhIGNsYXNzIG9mIGxpZ2h0Ym94OiAgJCgnYS5saWdodGJveCcpLmxpZ2h0Ym94KCk8L2xpPgogICAgPGxpPmNsdWV0aXAgLSBjbHVldGlwIHdpbGwgd29yayBvbiBhbnkgYSB0YWcgd2l0aCBhIGNsYXNzIG9mIGNsdWV0aXA6ICAkKCdhLmNsdWV0aXAnKS5jbHVldGlwKCk8L2xpPgogICAgPGxpPnRhYmxlc29ydGVyIC0gdGFibGVzb3J0ZXIgd2lsbCB3b3JrIG9uIGFueSB0YWJsZSB0YWcgd2l0aCBhIGNsYXNzIG9mIGNtc19zb3J0YWJsZTogJCgndGFibGUuY21zX3NvcnRhYmxlJykudGFibGVTb3J0ZXIoKTwvbGk+CjwvdWw+CjxoMz5BYm91dCBzbWFydHkgY2FjaGluZzwvaDM+CjxwPlRoZSByZXF1aXJlLCBhbmQgcGxhY2VtYXJrZXIgYWN0aW9ucyBkbyBub3Qgc3VwcG9ydCBzbWFydHkgY2FjaGluZy4gIEl0IGlzIHRoZXJlZmVyZSBjcml0aWNhbCB0aGF0IHRoZSBub2NhY2hlIGF0dHJpYnV0ZSBiZSB1c2VkIG9uIGNhbGxzIHRvIHRoZSBKUXVlcnlUb29scyBtb2R1bGUuPC9wPgo8aDM+QWJvdXQgdGhlIHBsYWNlbWFya2VyIGFjdGlvbi48L2gzPgo8cD5UaGUgcGxhY2VtYXJrZXIgYWN0aW9uIGRvZXMgdGhlIGpvYiBvZiBnZW5lcmF0aW5nIHRoZSBodG1sIHRvIGluc2VydCB0aGUganF1ZXJ5IHNjcmlwdHMsIGFuZCB0aGUgdmFyaW91cyBhZGRvbiBsaWJyYXJpZXMgdGhhdCB3ZXJlIHJlcXVlc3RlZCB2aWEgdGhlIHJlcXVpcmUgYWN0aW9uLiAgVGhlcmVmb3JlIHRoZSBwbGFjZW1hcmtlciBhY3Rpb24gbXVzdCBiZSBjYWxsZWQgQUZURVIgYWxsIGNhbGxzIHRvIHRoZSByZXF1aXJlIGFjdGlvbi4gICBQbGVhc2Uga2VlcCBpbiBtaW5kIHRoYXQgQ01TTVMgZGl2aWRlcyBwYWdlIHRlbXBsYXRlcyBpbnRvIHRocmVlIHBvcnRpb25zIGFuZCBwcm9jZXNzZXMgdGhlbSBpbiB0aGlzIG9yZGVyOiAgVGhlIHRvcCBwb3J0aW9uIG9mIHRoZSBwYWdlIGJlZm9yZSB0aGUgJmx0O2h0bWwmZ3Q7IHRhZy4gIFRoZSBib2R5IHNlY3Rpb24sIGFuZCB0aGUgaGVhZCBzZWN0aW9uLjwvcD4KCjxoMz5TdXBwb3J0PC9oMz4KPHA+VGhlIG1vZHVsZSBhdXRob3IgaXMgaW4gbm8gd2F5IG9ibGlnYXRlZCB0byBwcml2aWRlIHN1cHBvcnQgZm9yIHRoaXMgY29kZSBpbiBhbnkgZmFzaGlvbi4gIEhvd2V2ZXIsIHRoZXJlIGFyZSBhIG51bWJlciBvZiByZXNvdXJjZXMgYXZhaWxhYmxlIHRvIGhlbHAgeW91IHdpdGggaXQ6PC9wPgo8dWw+CjxsaT5BIGJ1ZyB0cmFja2luZyBhbmQgZmVhdHVyZSByZXF1ZXN0IHN5c3RlbSBoYXMgYmVlbiBjcmVhdGVkIGZvciB0aGlzIG1vZHVsZSA8YSBocmVmPSJodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnL3Byb2plY3RzL2pxdWVyeXRvb2xzIj5oZXJlPC9hPi4gIFBsZWFzZSBiZSB2ZXJib3NlIGFuZCBkZXNjcmlwdGl2ZSB3aGVuIHN1Ym1pdHRpbmcgYnVnIHJlcG9ydHMgYW5kIGZlYXR1cmUgcmVxdWVzdHMsIGFuZCBmb3IgYnVnIHJlcG9ydHMgZW5zdXJlIHRoYXQgeW91IGhhdmUgcHJvdmlkZWQgc3VmZmljaWVudCBpbmZvcm1hdGlvbiB0byByZWxpYWJseSByZXByb2R1Y2UgdGhlIGlzc3VlLjwvbGk+CjxsaT5BZGRpdGlvbmFsIGRpc2N1c3Npb24gb2YgdGhpcyBtb2R1bGUgbWF5IGFsc28gYmUgZm91bmQgaW4gdGhlIDxhIGhyZWY9Imh0dHA6Ly9mb3J1bS5jbXNtYWRlc2ltcGxlLm9yZyI+Q01TIE1hZGUgU2ltcGxlIEZvcnVtczwvYT4uICBXaGVuIGRlc2NyaWJpbmcgYW4gaXNzdWUgcGxlYXNlIG1ha2UgYW4gZWZmb3J0IHRvIHByaXZpZGUgYWxsIHJlbGF2YW50IGluZm9ybWF0aW9uLCBhIHRob3JvdWdoIGRlc2NyaXB0aW9uIG9mIHlvdXIgaXNzdWUsIGFuZCBzdGVwcyB0byByZXByb2R1Y2UgaXQgb3IgeW91ciBkaXNjdXNzaW9uIG1heSBiZSBpZ25vcmVkLjwvbGk+CjxsaT5UaGUgYXV0aG9yLCBjYWxndXkxMDAwLCBjYW4gb2Z0ZW4gYmUgZm91bmQgaW4gdGhlIDxhIGhyZWY9ImlyYzovL2lyYy5mcmVlbm9kZS5uZXQvI2NtcyI+Q01TIElSQyBDaGFubmVsPC9hPi48L2xpPgo8bGk+TGFzdGx5LCB5b3UgbWF5IGhhdmUgc29tZSBzdWNjZXNzIGVtYWlsaW5nIHRoZSBhdXRob3IgZGlyZWN0bHkuICBIb3dldmVyLCBwbGVhc2UgdXNlIHRoaXMgYXMgYSBsYXN0IHJlc29ydCwgYW5kIGVuc3VyZSB0aGF0IHlvdSBoYXZlIGZvbGxvd2VkIGFsbCBhcHBsaWNhYmxlIGluc3RydWN0aW9ucyBvbiB0aGUgZm9yZ2UsIGluIHRoZSBmb3J1bXMsIGV0Yy48L2xpPgo8L3VsPgoKCjxoMz5Db3B5cmlnaHQgYW5kIExpY2Vuc2U8L2gzPgo8cD5Db3B5cmlnaHQgJmNvcHk7IDIwMTIsIFJvYmVydCBDYW1wYmVsIDxhIGhyZWY9Im1haWx0bzpjYWxndXkxMDAwQGNtc21hZGVzaW1wbGUub3JnIj4mbHQ7Y2FsZ3V5MTAwMEBjbXNtYWRlc2ltcGxlLm9yZyZndDs8L2E+LiBBbGwgUmlnaHRzIEFyZSBSZXNlcnZlZC48L3A+CjxwPlRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Cml0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CnRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCihhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uPC9wPgo8cD5Ib3dldmVyLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHUEwsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQKYXMgYW4gYWRkb24gbW9kdWxlIHRvIENNUyBNYWRlIFNpbXBsZS4gIFlvdSBtYXkgbm90IHVzZSB0aGlzIHNvZnR3YXJlCmluIGFueSBOb24gR1BMIHZlcnNpb24gb2YgQ01TIE1hZGUgc2ltcGxlLCBvciBpbiBhbnkgdmVyc2lvbiBvZiBDTVMKTWFkZSBzaW1wbGUgdGhhdCBkb2VzIG5vdCBpbmRpY2F0ZSBjbGVhcmx5IGFuZCBvYnZpb3VzbHkgaW4gaXRzIGFkbWluCnNlY3Rpb24gdGhhdCB0aGUgc2l0ZSB3YXMgYnVpbHQgd2l0aCBDTVMgTWFkZSBzaW1wbGUuPC9wPgo8cD5UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQpHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgpZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQphbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQpGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQpPciByZWFkIGl0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTCI+b25saW5lPC9hPjwvcD48aDM+RGVwZW5kZW5jaWVzPC9oMz48dWw+PGxpPkNHRXh0ZW5zaW9ucyA9Jmd0OyAxLjQ5LjM8L2xpPjwvdWw+PGgzPlBhcmFtZXRlcnM8L2gzPjx1bD48bGk+PGVtPihvcHRpb25hbCk8L2VtPiBsYW5nPSJlbl9VUyIgLSBQYXJhbWV0ZXIgaXMgdXNlZCB0byBzcGVjaWZ5IHdoYXQgbGFuZ3VhZ2UgdG8gdXNlIGZvciBkaXNwbGF5IG9uIHRoZSBmcm9udGVuZC4gTm90IGFsbCBtb2R1bGVzIHN1cHBvcnQgb3IgbmVlZCB0aGlzLjwvbGk+PGxpPjxlbT4ob3B0aW9uYWwpPC9lbT4gYWN0aW9uPSIiIC0gU3BlY2lmeSB0aGUgYWN0aW9uIHRvIGJlIGNhbGxlZC4gIFBvc3NpYmxlIHZhbHVlcyBhcmU6PHVsPjxsaT5yZXF1aXJlIC0gTWFya3MgdGhlIHNlbGVjdGVkIGxpYnJhcmllcyB0byBiZSBpbmNsdWRlZCBpbiB0aGUgcGFnZSBIVE1MLiAgU2VlIHRoZSBsaXN0IGFib3ZlIGZvciB0aGUgbGlzdCBvZiBhdmFpbGFibGUgbGlicmFyaWVzLjwvbGk+PGxpPnBsYWNlbWFya2VyIC0gSW5kaWNhdGVzIHRoZSBwbGFjZSBpbiB0aGUgSFRNTCBvdXRwdXQgd2hlcmUgdGhlIHNlbGVjdGVkIGxpYnJhcmllcyBzaG91bGQgYmUgaW5jbHVkZWQuPC9saT48bGk+aW5janMgLSA8ZW0+KGRlcHJlY2F0ZWQpPC9lbT4gSW5jbHVkZSByZXF1aXJlZCBqYXZhc2NyaXB0IGZpbGVzLjwvbGk+PGxpPnJlYWR5IC0gPGVtPihkZXByZWNhdGVkKTwvZW0+IE91dHB1dCBkZWZhdWx0IHJlYWR5IGZ1bmN0aW9uLjwvbGk+PC91bD48L2xpPjxsaT48ZW0+KG9wdGlvbmFsKTwvZW0+IGV4Y2x1ZGU9IiIgLSBBcHBsaWNhYmxlIG9ubHkgdG8gdGhlIHBsYWNlbWFya2VyIGFuZCBpbmNqcyBhY3Rpb25zLCB0aGlzIHBhcmFtZXRlciBhbGxvd3MgZXhjbHVkaW5nIGNlcnRhaW4ganF1ZXJ5IHBsdWdpbnMgZnJvbSB0aGUgb3V0cHV0IGdlbmVyYXRlZC4gIFBvc3NpYmxlIHZhbHVlcyBhcmU6IHRhYmxlc29ydGVyLGNsdWV0aXAsZm9ybS48L2xpPjxsaT48ZW0+KG9wdGlvbmFsKTwvZW0+IGxpYj0iIiAtIEFwcGxpY2FibGUgb25seSB0byB0aGUgcmVxdWlyZSBhY3Rpb24sIHRoaXMgcGFyYW1ldGVyIGFsbG93cyBzcGVjaWZ5aW5nIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YganF1ZXJ5IGxpYnJhcmllcyB0byBpbnN0YWxsLjwvbGk+PGxpPjxlbT4ob3B0aW9uYWwpPC9lbT4gbm9fY3NzPSIiIC0gQXBwbGljYWJsZSBvbmx5IHRvIHRoZSBwbGFjZW1hcmtlciBhbmQgaW5janMgYWN0aW9ucywgdGhpcyB3aWxsIGV4Y2x1ZGUgY3NzIHRhZ3MgZnJvbSBiZWluZyBvdXRwdXQ8L2xpPjxsaT48ZW0+KG9wdGlvbmFsKTwvZW0+IG5vX2Nkbj0iIiAtIEFwcGxpY2FibGUgb25seSB0byB0aGUgcGxhY2VtYXJrZXIgYW5kIGluY2pzIGFjdGlvbnMsIHRoaXMgd2lsbCBwcmV2ZW50IEpRdWVyeVRvb2xzIGZyb20gdXNpbmcgYSBDRE4gVVJMIGZvciB0aGUgamF2YXNjcmlwdCBsaWJyYXJpZXMsIGlmIG9uZSBpcyBhdmFpbGFibGUgKG5vdCBhbGwgbGlicmFyaWVzIGFyZSBhdmFpbGFibGUgYnkgYSBDRE48L2xpPjxsaT48ZW0+KG9wdGlvbmFsKTwvZW0+IG5vX2pzPSIiIC0gQXBwbGljYWJsZSBvbmx5IHRvIHRoZSBwbGFjZW1hcmtlciBhbmQgaW5janMgYWN0aW9ucywgdGhpcyB3aWxsIGV4Y2x1ZGUgc2NyaXB0IHRhZ3MgZnJvbSBiZWluZyBvdXRwdXQ8L2xpPjxsaT48ZW0+KG9wdGlvbmFsKTwvZW0+IG5vX2pxdWVyeT0iIiAtIEFwcGxpY2FibGUgb25seSB0byB0aGUgcGxhY2VtYXJrZXIgYW5kIGluY2pzIGFjdGlvbnMsIHRoaXMgd2lsbCBleGNsdWRlIGpxdWVyeSBmcm9tIGJlaW5nIGluY2x1ZGVkPC9saT48bGk+PGVtPihvcHRpb25hbCk8L2VtPiBub19yZWFkeT0iIiAtIEFwcGxpY2FibGUgb25seSB0byB0aGUgcGxhY2VtYXJrZXIgYWN0aW9ucywgdGhpcyB3aWxsIGV4Y2x1ZGUgYW55IHJlYWR5IGZ1bmN0aW9ucyBmcm9tIGJlaW5nIG91dHB1dC48L2xpPjwvdWw+]]></help>
	<about><![CDATA[PGJyIC8+QXV0aG9yOiBjYWxndXkxMDAwICZsdDtjYWxndXkxMDAwQGNtc21hZGVzaW1wbGUub3JnJmd0OzxiciAvPjxiciAvPlZlcnNpb246IDEuMy42PGJyIC8+PGJyIC8+Q2hhbmdlIEhpc3Rvcnk6PGJyIC8+PHVsPgogIDxsaT4xLjAuNCAtIE9jdG9iZXIgMjAwOQogICAgPHA+QWRkcyBqc29uIHN1cHBvcnQuPC9wPgogIDwvbGk+CiAgPGxpPjEuMC41IC0gTm92ZW1iZXIgMjAwOQogICAgPHA+QWRkcyBub19jc3MgYW5kIG5vX2pzIG9wdGlvbnMgdG8gdGhlIGluY2pzIGFjdGlvbi48L3A+CiAgPC9saT4KICA8bGk+MS4wLjYgLSBBcHJpbCAyMDEwCiAgICA8cD5BZGRzIGNhbGd1eXMgZGF0ZSB1dGlscyBwbHVnaW4uPC9wPgogIDwvbGk+CiAgPGxpPjEuMC45IC0gU2VwdGVtYmVyIDIwMTAKICAgIDxwPkFkZHMgbm9fanF1ZXJ5IG9wdGlvbiB0byB0aGUgaW5janMgYWN0aW9uLjwvcD4KICAgIDxQPkRvIG5vdCBvdXRwdXQganF1ZXJ5IHRhZ3MgZm9yIGFueSBtb2R1bGUgYWN0aW9ucyBvciBhZG1pbiBhY3Rpb25zIGlmIENNUyBWZXJzaW9uIGlzID49IENNUyAxLjktYmV0YTE8L3A+CiAgPC9saT4KICA8bGk+MS4wLjEwIC0KICAgIDxwPk1pbm9yIGZpeGVzLjwvcD4KICA8L2xpPgogIDxsaT4xLjAuMTEgLSBKdW5lIDIwMTEKICAgIDx1bD4KICAgICAgPGxpPk1pbm9yIEZpeGVzLjwvbGk+CiAgICAgIDxsaT5Nb3ZlcyBDaGFuZ2Vsb2cgRXh0ZXJuYWwuPC9saT4KICAgICAgPGxpPk1pbm9yIGNoYW5nZSBmb3IgMS4xMCBjb21wYXRpYmlsaXR5LjwvbGk+CiAgICAgIDxsaT5VcGRhdGUgZGVwZW5kZW5jaWVzLjwvbGk+CiAgICA8L3VsPgogIDwvbGk+CiAgPGxpPjEuMSAtIEp1bHkgMjAxMgogICA8dWw+CiAgICAgPGxpPk1vdmUgaGVscCBleHRlcm5hbC48L2xpPgogICAgIDxsaT5VcGdyYWRlIGpxdWVyeSBhbmQgZmFuY3lib3guPC9saT4KICAgPHVsPgogIDwvbGk+CiAgPGxpPjEuMiAtIEphbnVhcnkgMjAxMwogICAgPHVsPgogICAgICA8bGk+QWRkcyB0aGUgcmVxdWlyZSBhbmQgcGxhY2VtYXJrZXIgYWN0aW9ucy48L2xpPgogICAgICA8bGk+VXBncmFkZXMgYWxsIGxpYnJhcmllcyBhbmQgcmVmb3JtYXRzIHRoZW0gaW50byBhIGRpZmZlcmVudCBzdHJ1Y3R1cmUuPC9saT4KICAgICAgPGxpPkFkZHMganF1ZXJ5IHVpLCAgYW5kIENETiBzdXBwb3J0LjwvbGk+CiAgICA8L3VsPgogIDwvbGk+CiAgPGxpPnYxLjMgLSBKdW5lIDIwMTQKICAgICAgPHVsPgogICAgICAgIDxsaT5BZGRzIHN1cHBvcnQgZm9yIHRoZSBjZ2pzX3JlcXVpcmUgc3R1ZmYgaW4gQ0dFeHRlbnNpb25zLjwvbGk+Cgk8bGk+QWRkcyBhIG5ldyBjb21ib2JveCBwbHVnaW4uPC9saT4KCTxsaT5BZGRzIGpzdmlld3MgcGx1Z2luLjwvbGk+CiAgICAgIDwvdWw+CiAgICA8L3VsPgogIDwvbGk+CiAgPGxpPnYxLjMsNQogICAgICA8dWw+CiAgICAgICAgPGxpPk1pbm9yIGltcHJvdmVtZW50cy48L2xpPgogICAgICA8L3VsPgogICAgPC91bD4KICA8L2xpPgogIDxsaT52MS4zLjYKICAgIDx1bD4KICAgICAgPGxpPk5vdyBmbGFnIGRpZmZlcmVudCBtaW5pZmljYXRpb25zIGZvciBkaWZmZXJlbnQgbGlicmFyaWVzICh3aGVuIHVzaW5nIGNnanNfcmVuZGVyKTwvbGk+CiAgICAgIDxsaT5VcGdyYWRlIGpxdWVyeSB0byAxLjExLjM8L2xpPgogICAgICA8bGk+VXBncmFkZSBqcXVlcnktdWkgdG8gMS4xMS40PC9saT4KICAgIDwvdWw+CiAgPC9saT4KPC91bD4KPGJyIC8+]]></about>
	<description><![CDATA[A toolbox of Jquery utilities to aide in creating dynamic and fancy CMS Made Simple modules and websites]]></description>
	<requires>
	  <requiredname>CGExtensions</requiredname>
	  <requiredversion>1.49.3</requiredversion>
	</requires>
	<file>
	  <filename>/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/action.incjs.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKI0JFR0lOX0xJQ0VOU0UKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IEpRdWVyeVRvb2xzIChjKSAyMDA4IGJ5IFJvYmVydCBDYW1wYmVsbCAKIyAgICAgICAgIChjYWxndXkxMDAwQGNtc21hZGVzaW1wbGUub3JnKQojICBBIHRvb2xib3ggb2YgY29udmVuaWVuY2VzIHRvIHByb3ZpZGUgZHluYW1pYyBqYXZhc2NyaXB0eSBmdW5jdGlvbmFsaXR5CiMgIGZvciBDTVMgbW9kdWxlcyBhbmQgd2Vic2l0ZSBkZXNpZ25lcnMuCiMgCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykKIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZwojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMKIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgSG93ZXZlciwgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR1BMLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkCiMgYXMgYW4gYWRkb24gbW9kdWxlIHRvIENNUyBNYWRlIFNpbXBsZS4gIFlvdSBtYXkgbm90IHVzZSB0aGlzIHNvZnR3YXJlCiMgaW4gYW55IE5vbiBHUEwgdmVyc2lvbiBvZiBDTVMgTWFkZSBzaW1wbGUsIG9yIGluIGFueSB2ZXJzaW9uIG9mIENNUwojIE1hZGUgc2ltcGxlIHRoYXQgZG9lcyBub3QgaW5kaWNhdGUgY2xlYXJseSBhbmQgb2J2aW91c2x5IGluIGl0cyBhZG1pbiAKIyBzZWN0aW9uIHRoYXQgdGhlIHNpdGUgd2FzIGJ1aWx0IHdpdGggQ01TIE1hZGUgc2ltcGxlLgojCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKIyBPciByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KI0VORF9MSUNFTlNFCmlmKCAhaXNzZXQoJGdDbXMpICkgZXhpdDsKCiRjb25maWcgPSBjbXNtcygpLT5HZXRDb25maWcoKTsKJGJhc2VkaXIgPSAkdGhpcy0+R2V0TW9kdWxlUGF0aCgpLicvbGliJzsKJGRpcnMgPSBnbG9iKCRiYXNlZGlyLicvKi5saWInKTsKCiRsaWJyYXJpZXMgPSBhcnJheSgpOwppZiggaXNfYXJyYXkoJGRpcnMpICYmIGNvdW50KCRkaXJzKSApIHsKICBmb3JlYWNoKCAkZGlycyBhcyAkb25lICkgewogICAgaWYoICFpc19kaXIoJG9uZSkgKSBjb250aW51ZTsKICAgIGlmKCAhZmlsZV9leGlzdHMoJG9uZS4nL2luZm8uZGF0JykgKSBjb250aW51ZTsKICAgICRibiA9IGJhc2VuYW1lKCRvbmUpOwogICAgJG5hbWUgPSBzdWJzdHIoJGJuLDAsLTQpOwogICAgaW5jbHVkZV9vbmNlKCRvbmUuJy9pbmZvLmRhdCcpOwoKICAgICRpbmZvWydiYXNlX2RpciddID0gJG9uZTsKICAgICRpbmZvWydiYXNlX3VybCddID0gJHRoaXMtPkdldE1vZHVsZVVSTFBhdGgoKS4iL2xpYi8kYm4iOwogICAgJGxpYnJhcmllc1skbmFtZV0gPSAkaW5mbzsKCiAgICB1bnNldCgkaW5mbyk7CiAgfQp9CgovLyBsb29wIHRocm91Z2ggdGhlIGxpYnJhcmllcwovLyBmaW5kIHRoZSBvbmVzIHdpdGggbm8gZGVwZW5kZW5jaWVzCgokYmFzZXVybCA9ICRjb25maWctPnNtYXJ0X3Jvb3RfdXJsKCkuJy9tb2R1bGVzLycuJHRoaXMtPkdldE5hbWUoKS4nL2xpYi8nOwokZm10ID0gJzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9IiVzIj48L3NjcmlwdD4nLiJcbiI7CiRkb19jc3MgPSAxOwokZG9fanMgPSAxOwokZXhjbHVkZXMgPSBhcnJheSgpOwokZG9fanF1ZXJ5ID0gMTsKCmlmKCAhY21zbXMoKS0+aXNfZnJvbnRlbmRfcmVxdWVzdCgpICkgewogICRleGNsdWRlc1tdID0gJ2pxdWVyeSc7CiAgJGV4Y2x1ZGVzW10gPSAndWknOwogICRleGNsdWRlc1tdID0gJ2ZpbGV1cGxvYWQnOyAvLyB0aGlzIG1heSBiZSBpbmNsdWRlZCBpbiBzb21lIGFkbWluIHRoZW1lcy4KfQppZiggaXNzZXQoJHBhcmFtc1snbm9fanF1ZXJ5J10pICkgewogICRleGNsdWRlc1tdID0gJ2pxdWVyeSc7Cn0KaWYoIGlzc2V0KCRwYXJhbXNbJ25vX2NzcyddKSApIHsKICAkZG9fY3NzID0gMDsKfQppZiggaXNzZXQoJHBhcmFtc1snbm9fanMnXSkgKSB7CiAgJGRvX2pzID0gMDsKfQoKaWYoIGlzc2V0KCRwYXJhbXNbJ2V4Y2x1ZGUnXSkgKSB7CiAgJGV4Y2x1ZGUgPSBleHBsb2RlKCcsJywkcGFyYW1zWydleGNsdWRlJ10pOwogICRleGNsdWRlcyA9IGFycmF5X21lcmdlKCRleGNsdWRlcywkZXhjbHVkZSk7Cn0KJGV4Y2x1ZGVzID0gYXJyYXlfdW5pcXVlKCRleGNsdWRlcyk7CgovLyBhc3NlbWJsZSB0aGUgbGlzdCBvZiBsaWJyYXJpZXMgYW5kIGNzcyBmaWxlcy4KJGxpYnMgPSBhcnJheSgpOwokY3NzID0gYXJyYXkoKTsKaWYoICFmdW5jdGlvbl9leGlzdHMoJ2pxdWVyeXRvb2xzX2luY2pzJykgKSB7CiAgZnVuY3Rpb24ganF1ZXJ5dG9vbHNfaW5janMoJG5hbWUsJiRsaWJyYXJpZXMsJGV4Y2x1ZGVzLCYkbGlicywmJGNzcywkZG9fanMsJGRvX2NzcykgewogICAgaWYoICFpc3NldCgkbGlicmFyaWVzWyRuYW1lXSkgKSByZXR1cm47CiAgICBpZiggaW5fYXJyYXkoJG5hbWUsJGV4Y2x1ZGVzKSApIHJldHVybjsKCiAgICAkaW5mbyA9JiAkbGlicmFyaWVzWyRuYW1lXTsKICAgIGlmKCBpc3NldCgkaW5mb1snaGFuZGxlZCddKSAmJiAkaW5mb1snaGFuZGxlZCddID09IDEgKSByZXR1cm47CgogICAgLy8gZG8gZGVwZW5kZW5jaWVzIGZpcnN0CiAgICBpZiggaXNzZXQoJGluZm9bJ2RlcGVuZHMnXSkgJiYgJGluZm9bJ2RlcGVuZHMnXSApIHsKICAgICAgaWYoICFpc19hcnJheSgkaW5mb1snZGVwZW5kcyddKSApICRpbmZvWydkZXBlbmRzJ10gPSBleHBsb2RlKCcsJywkaW5mb1snZGVwZW5kcyddKTsKCiAgICAgIGZvcmVhY2goICRpbmZvWydkZXBlbmRzJ10gYXMgJGRlcGVuZGVuY3kgKSB7CglqcXVlcnl0b29sc19pbmNqcygkZGVwZW5kZW5jeSwkbGlicmFyaWVzLCRleGNsdWRlcywkbGlicywkY3NzLCRkb19qcywkZG9fY3NzKTsKICAgICAgfQogICAgfQogICAgCiAgICAvLyB0aGVuIHRoaXMgbGlicmFyeQogICAgaWYoICRkb19qcyAmJiBpc3NldCgkaW5mb1snanMnXSkgJiYgJGluZm9bJ2pzJ10gKSB7CiAgICAgIGlmKCAhaXNfYXJyYXkoJGluZm9bJ2pzJ10pICkgJGluZm9bJ2pzJ10gPSBleHBsb2RlKCcsJywkaW5mb1snanMnXSk7CgogICAgICBpZiggaXNzZXQoJGluZm9bJ2NkbiddKSAmJiBjbXNtcygpLT5pc19mcm9udGVuZF9yZXF1ZXN0KCkgKSB7CgkvLyBhc3N1bWUgb25seSBvbmUgcmVjb3JkLgoJJGJuID0gYmFzZW5hbWUoJGluZm9bJ2NkbiddKTsKCWlmKCBpc3NldCgkbGlic1skYm5dKSApIGNvbnRpbnVlOwoJJGxpYnNbJGJuXSA9ICRpbmZvWydjZG4nXTsKICAgICAgfQogICAgICBlbHNlIHsKCWZvcmVhY2goICRpbmZvWydqcyddIGFzICRvbmVfanMgKSB7CgkgICRibiA9IGJhc2VuYW1lKCRvbmVfanMpOwoJICBpZiggaXNzZXQoJGxpYnNbJGJuXSkgKSBjb250aW51ZTsKCgkgICR1cmwgPSAkaW5mb1snYmFzZV91cmwnXS4nLycuJG9uZV9qczsKCSAgJGxpYnNbJGJuXSA9ICR1cmw7Cgl9CiAgICAgIH0KICAgIH0KCiAgICBpZiggJGRvX2NzcyAmJiBpc3NldCgkaW5mb1snY3NzJ10pICYmICRpbmZvWydjc3MnXSApIHsKICAgICAgaWYoICFpc19hcnJheSgkaW5mb1snY3NzJ10pICkgJGluZm9bJ2NzcyddID0gZXhwbG9kZSgnLCcsJGluZm9bJ2NzcyddKTsKCiAgICAgIGZvcmVhY2goICRpbmZvWydjc3MnXSBhcyAkb25lX2NzcyApIHsKCSRibiA9IGJhc2VuYW1lKCRvbmVfY3NzKTsKCWlmKCBpc3NldCgkY3NzWyRibl0pICkgY29udGludWU7CgoJJHVybCA9ICRpbmZvWydiYXNlX3VybCddLicvJy4kb25lX2NzczsKCSRjc3NbJGJuXSA9ICR1cmw7CiAgICAgIH0KICAgIH0KCiAgICAkaW5mb1snaGFuZGxlZCddID0gMTsKICB9Cn0KCiR0aGlzLT5fbGlicyA9IGFycmF5X2tleXMoJGxpYnJhcmllcyk7CmZvcmVhY2goICR0aGlzLT5fbGlicyBhcyAkb25lICkgewogIGpxdWVyeXRvb2xzX2luY2pzKCRvbmUsJGxpYnJhcmllcywkZXhjbHVkZXMsJGxpYnMsJGNzcywkZG9fanMsJGRvX2Nzcyk7Cn0KCiRsaWJzID0gYXJyYXlfdW5pcXVlKCRsaWJzKTsKJGNzcyA9IGFycmF5X3VuaXF1ZSgkY3NzKTsKCmlmKCBjb3VudCgkbGlicykgJiYgJGRvX2pzICkgewogICRzbWFydHktPmFzc2lnbignbGlicycsJGxpYnMpOwp9CmlmKCBjb3VudCgkY3NzKSAmJiAkZG9fY3NzICkgewogICRzbWFydHktPmFzc2lnbignY3NzJywkY3NzKTsKfQoKaWYoIGNvdW50KCRjc3MpIHx8IGNvdW50KCRsaWJzKSApIHsKICBlY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUoJ2luY2pzLnRwbCcpOwp9CgojCiMgRU9GCiMKPz4K]]></data>
	</file>
	<file>
	  <filename>/action.placemarker.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKI0JFR0lOX0xJQ0VOU0UKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IEpRdWVyeVRvb2xzIChjKSAyMDA4IGJ5IFJvYmVydCBDYW1wYmVsbAojICAgICAgICAgKGNhbGd1eTEwMDBAY21zbWFkZXNpbXBsZS5vcmcpCiMgIEEgdG9vbGJveCBvZiBjb252ZW5pZW5jZXMgdG8gcHJvdmlkZSBkeW5hbWljIGphdmFzY3JpcHR5IGZ1bmN0aW9uYWxpdHkKIyAgZm9yIENNUyBtb2R1bGVzIGFuZCB3ZWJzaXRlIGRlc2lnbmVycy4KIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIENNUyAtIENNUyBNYWRlIFNpbXBsZSBpcyAoYykgMjAwNSBieSBUZWQgS3VscCAod2lzaHlAY21zbWFkZXNpbXBsZS5vcmcpCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIwojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgojIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBIb3dldmVyLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHUEwsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQKIyBhcyBhbiBhZGRvbiBtb2R1bGUgdG8gQ01TIE1hZGUgU2ltcGxlLiAgWW91IG1heSBub3QgdXNlIHRoaXMgc29mdHdhcmUKIyBpbiBhbnkgTm9uIEdQTCB2ZXJzaW9uIG9mIENNUyBNYWRlIHNpbXBsZSwgb3IgaW4gYW55IHZlcnNpb24gb2YgQ01TCiMgTWFkZSBzaW1wbGUgdGhhdCBkb2VzIG5vdCBpbmRpY2F0ZSBjbGVhcmx5IGFuZCBvYnZpb3VzbHkgaW4gaXRzIGFkbWluCiMgc2VjdGlvbiB0aGF0IHRoZSBzaXRlIHdhcyBidWlsdCB3aXRoIENNUyBNYWRlIHNpbXBsZS4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiNFTkRfTElDRU5TRQppZiggIWlzc2V0KCRnQ21zKSApIGV4aXQ7CgovLyBjaGVjayBpZiB0aGVyZSBpcyBhbnl0aGluZyB0byBkby4KaWYoICghaXNfYXJyYXkoJHRoaXMtPl9saWJzKSB8fCBjb3VudCgkdGhpcy0+X2xpYnMpID09IDApICkgcmV0dXJuOwoKJGNvbmZpZyA9IGNtc21zKCktPkdldENvbmZpZygpOwoKLy8gbG9hZCBhbGwgdGhlIGxpYnJhcmllcy4KJGJhc2VkaXIgPSAkdGhpcy0+R2V0TW9kdWxlUGF0aCgpLicvbGliJzsKJGRpcnMgPSBnbG9iKCRiYXNlZGlyLicvKi5saWInKTsKJGxpYnJhcmllcyA9IGFycmF5KCk7CmlmKCBpc19hcnJheSgkZGlycykgJiYgY291bnQoJGRpcnMpICkgewogICAgZm9yZWFjaCggJGRpcnMgYXMgJG9uZSApIHsKICAgICAgICBpZiggIWlzX2Rpcigkb25lKSApIGNvbnRpbnVlOwogICAgICAgIGlmKCAhZmlsZV9leGlzdHMoJG9uZS4nL2luZm8uZGF0JykgKSBjb250aW51ZTsKICAgICAgICAkYm4gPSBiYXNlbmFtZSgkb25lKTsKICAgICAgICAkbmFtZSA9IHN1YnN0cigkYm4sMCwtNCk7CiAgICAgICAgaW5jbHVkZV9vbmNlKCRvbmUuJy9pbmZvLmRhdCcpOwoKICAgICAgICAkaW5mb1snYmFzZV9kaXInXSA9ICRvbmU7CiAgICAgICAgJGluZm9bJ2Jhc2VfdXJsJ10gPSAkdGhpcy0+R2V0TW9kdWxlVVJMUGF0aCgpLiIvbGliLyRibiI7CiAgICAgICAgJGxpYnJhcmllc1skbmFtZV0gPSAkaW5mbzsKCiAgICAgICAgdW5zZXQoJGluZm8pOwogICAgfQp9CgovLyBsb29wIHRocm91Z2ggdGhlIGxpYnJhcmllcwovLyBmaW5kIHRoZSBvbmVzIHdpdGggbm8gZGVwZW5kZW5jaWVzCgokYmFzZXVybCA9ICRjb25maWctPnNtYXJ0X3Jvb3RfdXJsKCkuJy9tb2R1bGVzLycuJHRoaXMtPkdldE5hbWUoKS4nL2xpYi8nOwokZm10ID0gJzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9IiVzIj48L3NjcmlwdD4nLiJcbiI7CiRkb19jc3MgPSAxOwokZG9fY2RuID0gMTsKJGRvX2pzID0gMTsKJGV4Y2x1ZGVzID0gYXJyYXkoKTsKJGRvX2pxdWVyeSA9IDE7CgppZiggIWNtc21zKCktPmlzX2Zyb250ZW5kX3JlcXVlc3QoKSApIHsKICAgICRleGNsdWRlc1tdID0gJ2pxdWVyeSc7CiAgICAkZXhjbHVkZXNbXSA9ICd1aSc7CiAgICAkZXhjbHVkZXNbXSA9ICdmaWxldXBsb2FkJzsKfQppZiggaXNzZXQoJHBhcmFtc1snbm9fanF1ZXJ5J10pICkgJGV4Y2x1ZGVzW10gPSAnanF1ZXJ5JzsKaWYoIGlzc2V0KCRwYXJhbXNbJ25vX2NzcyddKSApICRkb19jc3MgPSAwOwppZiggaXNzZXQoJHBhcmFtc1snbm9fanMnXSkgKSAkZG9fanMgPSAwOwppZiggaXNzZXQoJHBhcmFtc1snbm9fY2RuJ10pICkgJGRvX2NkbiA9IDA7CgppZiggaXNzZXQoJHBhcmFtc1snZXhjbHVkZSddKSApIHsKICAgICRleGNsdWRlID0gZXhwbG9kZSgnLCcsJHBhcmFtc1snZXhjbHVkZSddKTsKICAgICRleGNsdWRlcyA9IGFycmF5X21lcmdlKCRleGNsdWRlcywkZXhjbHVkZSk7Cn0KJGV4Y2x1ZGVzID0gYXJyYXlfdW5pcXVlKCRleGNsdWRlcyk7CgovLyBhc3NlbWJsZSB0aGUgbGlzdCBvZiBsaWJyYXJpZXMgYW5kIGNzcyBmaWxlcy4KJGxpYnMgPSBhcnJheSgpOwokY3NzID0gYXJyYXkoKTsKaWYoICFmdW5jdGlvbl9leGlzdHMoJ2pxdWVyeXRvb2xzX2luY2pzJykgKSB7CiAgICBmdW5jdGlvbiBqcXVlcnl0b29sc19pbmNqcygkbmFtZSwmJGxpYnJhcmllcywkZXhjbHVkZXMsJiRsaWJzLCYkY3NzLCRkb19qcywkZG9fY3NzLCRkb19jZG4pIHsKICAgICAgICBpZiggIWlzc2V0KCRsaWJyYXJpZXNbJG5hbWVdKSApIHJldHVybjsKICAgICAgICBpZiggaW5fYXJyYXkoJG5hbWUsJGV4Y2x1ZGVzKSApIHJldHVybjsKCiAgICAgICAgJGluZm8gPSYgJGxpYnJhcmllc1skbmFtZV07CiAgICAgICAgaWYoIGlzc2V0KCRpbmZvWydoYW5kbGVkJ10pICYmICRpbmZvWydoYW5kbGVkJ10gPT0gMSApIHJldHVybjsKCiAgICAgICAgLy8gZG8gZGVwZW5kZW5jaWVzIGZpcnN0CiAgICAgICAgaWYoIGlzc2V0KCRpbmZvWydkZXBlbmRzJ10pICYmICRpbmZvWydkZXBlbmRzJ10gKSB7CiAgICAgICAgICAgIGlmKCAhaXNfYXJyYXkoJGluZm9bJ2RlcGVuZHMnXSkgKSAkaW5mb1snZGVwZW5kcyddID0gZXhwbG9kZSgnLCcsJGluZm9bJ2RlcGVuZHMnXSk7CgogICAgICAgICAgICBmb3JlYWNoKCAkaW5mb1snZGVwZW5kcyddIGFzICRkZXBlbmRlbmN5ICkgewogICAgICAgICAgICAgICAganF1ZXJ5dG9vbHNfaW5janMoJGRlcGVuZGVuY3ksJGxpYnJhcmllcywkZXhjbHVkZXMsJGxpYnMsJGNzcywkZG9fanMsJGRvX2NzcywkZG9fY2RuKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gdGhlbiB0aGlzIGxpYnJhcnkKICAgICAgICBpZiggJGRvX2pzICYmIGlzc2V0KCRpbmZvWydqcyddKSAmJiAkaW5mb1snanMnXSApIHsKICAgICAgICAgICAgaWYoICFpc19hcnJheSgkaW5mb1snanMnXSkgKSAkaW5mb1snanMnXSA9IGV4cGxvZGUoJywnLCRpbmZvWydqcyddKTsKCiAgICAgICAgICAgIGlmKCBpc3NldCgkaW5mb1snY2RuJ10pICYmIGNtc21zKCktPmlzX2Zyb250ZW5kX3JlcXVlc3QoKSAmJiAkZG9fY2RuICkgewogICAgICAgICAgICAgICAgLy8gYXNzdW1lIG9ubHkgb25lIHJlY29yZC4KICAgICAgICAgICAgICAgICRibiA9IGJhc2VuYW1lKCRpbmZvWydjZG4nXSk7CiAgICAgICAgICAgICAgICBpZiggaXNzZXQoJGxpYnNbJGJuXSkgKSBjb250aW51ZTsKICAgICAgICAgICAgICAgICRsaWJzWyRibl0gPSAkaW5mb1snY2RuJ107CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBmb3JlYWNoKCAkaW5mb1snanMnXSBhcyAkb25lX2pzICkgewogICAgICAgICAgICAgICAgICAgICRibiA9IGJhc2VuYW1lKCRvbmVfanMpOwogICAgICAgICAgICAgICAgICAgIGlmKCBpc3NldCgkbGlic1skYm5dKSApIGNvbnRpbnVlOwoKICAgICAgICAgICAgICAgICAgICAkdXJsID0gJGluZm9bJ2Jhc2VfdXJsJ10uJy8nLiRvbmVfanM7CiAgICAgICAgICAgICAgICAgICAgJGxpYnNbJGJuXSA9ICR1cmw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmKCAkZG9fY3NzICYmIGlzc2V0KCRpbmZvWydjc3MnXSkgJiYgJGluZm9bJ2NzcyddICkgewogICAgICAgICAgICBpZiggIWlzX2FycmF5KCRpbmZvWydjc3MnXSkgKSAkaW5mb1snY3NzJ10gPSBleHBsb2RlKCcsJywkaW5mb1snY3NzJ10pOwoKICAgICAgICAgICAgZm9yZWFjaCggJGluZm9bJ2NzcyddIGFzICRvbmVfY3NzICkgewogICAgICAgICAgICAgICAgJGJuID0gYmFzZW5hbWUoJG9uZV9jc3MpOwogICAgICAgICAgICAgICAgaWYoIGlzc2V0KCRjc3NbJGJuXSkgKSBjb250aW51ZTsKCiAgICAgICAgICAgICAgICAkdXJsID0gJGluZm9bJ2Jhc2VfdXJsJ10uJy8nLiRvbmVfY3NzOwogICAgICAgICAgICAgICAgJGNzc1skYm5dID0gJHVybDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJGluZm9bJ2hhbmRsZWQnXSA9IDE7CiAgICB9Cn0KCmlmKCAhaXNfYXJyYXkoJHRoaXMtPl9saWJzKSApICR0aGlzLT5fbGlicyA9IGFycmF5X2tleXMoJGxpYnJhcmllcyk7Cgpmb3JlYWNoKCAkdGhpcy0+X2xpYnMgYXMgJG9uZSApIHsKICAgIGpxdWVyeXRvb2xzX2luY2pzKCRvbmUsJGxpYnJhcmllcywkZXhjbHVkZXMsJGxpYnMsJGNzcywkZG9fanMsJGRvX2NzcywkZG9fY2RuKTsKfQoKJGxpYnMgPSBhcnJheV91bmlxdWUoJGxpYnMpOwokY3NzID0gYXJyYXlfdW5pcXVlKCRjc3MpOwoKaWYoIGNvdW50KCRsaWJzKSAmJiAkZG9fanMgKSAkc21hcnR5LT5hc3NpZ24oJ2xpYnMnLCRsaWJzKTsKaWYoIGNvdW50KCRjc3MpICYmICRkb19jc3MgKSAkc21hcnR5LT5hc3NpZ24oJ2NzcycsJGNzcyk7CgppZiggY291bnQoJGNzcykgfHwgY291bnQoJGxpYnMpICkgewogICAgZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCdpbmNqcy50cGwnKTsKICAgICRyZWFkeSA9IFRSVUU7CiAgICBpZiggaXNzZXQoJHBhcmFtc1snbm9fcmVhZHknXSkgKSAkcmVhZHkgPSAhY21zX3RvX2Jvb2woJHBhcmFtc1snbm9fcmVhZHknXSk7CiAgICBpZiggJHJlYWR5ICkgJHRoaXMtPkRvQWN0aW9uKCdyZWFkeScsJ2pxdHInLGFycmF5KCkpOwp9CgojCiMgRU9GCiMKPz4=]]></data>
	</file>
	<file>
	  <filename>/action.ready.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKI0JFR0lOX0xJQ0VOU0UKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IEpRdWVyeVRvb2xzIChjKSAyMDA4IGJ5IFJvYmVydCBDYW1wYmVsbCAKIyAgICAgICAgIChjYWxndXkxMDAwQGNtc21hZGVzaW1wbGUub3JnKQojICBBIHRvb2xib3ggb2YgY29udmVuaWVuY2VzIHRvIHByb3ZpZGUgZHluYW1pYyBqYXZhc2NyaXB0eSBmdW5jdGlvbmFsaXR5CiMgIGZvciBDTVMgbW9kdWxlcyBhbmQgd2Vic2l0ZSBkZXNpZ25lcnMuCiMgCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykKIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZwojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMKIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgSG93ZXZlciwgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR1BMLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkCiMgYXMgYW4gYWRkb24gbW9kdWxlIHRvIENNUyBNYWRlIFNpbXBsZS4gIFlvdSBtYXkgbm90IHVzZSB0aGlzIHNvZnR3YXJlCiMgaW4gYW55IE5vbiBHUEwgdmVyc2lvbiBvZiBDTVMgTWFkZSBzaW1wbGUsIG9yIGluIGFueSB2ZXJzaW9uIG9mIENNUwojIE1hZGUgc2ltcGxlIHRoYXQgZG9lcyBub3QgaW5kaWNhdGUgY2xlYXJseSBhbmQgb2J2aW91c2x5IGluIGl0cyBhZG1pbiAKIyBzZWN0aW9uIHRoYXQgdGhlIHNpdGUgd2FzIGJ1aWx0IHdpdGggQ01TIE1hZGUgc2ltcGxlLgojCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKIyBPciByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KI0VORF9MSUNFTlNFCmlmKCAhaXNzZXQoJGdDbXMpICkgZXhpdDsKCiR0X2xpYnMgPSBhcnJheSgpOwppZiggaXNfYXJyYXkoJHRoaXMtPl9saWJzKSApIHsKICBmb3JlYWNoKCR0aGlzLT5fbGlicyBhcyAkb25lKSB7CiAgICAkdF9saWJzWyRvbmVdID0gMTsKICB9Cn0KaWYoIGNvdW50KCR0X2xpYnMpICkgewogICRzbWFydHktPmFzc2lnbignanF1ZXJ5X2xpYnMnLCR0X2xpYnMpOwogIGVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZSgncmVhZHkudHBsJyk7Cn0KCiMKIyBFT0YKIwo/Pg==]]></data>
	</file>
	<file>
	  <filename>/action.require.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKI0JFR0lOX0xJQ0VOU0UKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IEpRdWVyeVRvb2xzIChjKSAyMDA4IGJ5IFJvYmVydCBDYW1wYmVsbCAKIyAgICAgICAgIChjYWxndXkxMDAwQGNtc21hZGVzaW1wbGUub3JnKQojICBBIHRvb2xib3ggb2YgY29udmVuaWVuY2VzIHRvIHByb3ZpZGUgZHluYW1pYyBqYXZhc2NyaXB0eSBmdW5jdGlvbmFsaXR5CiMgIGZvciBDTVMgbW9kdWxlcyBhbmQgd2Vic2l0ZSBkZXNpZ25lcnMuCiMgCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykKIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZwojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMKIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgSG93ZXZlciwgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR1BMLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkCiMgYXMgYW4gYWRkb24gbW9kdWxlIHRvIENNUyBNYWRlIFNpbXBsZS4gIFlvdSBtYXkgbm90IHVzZSB0aGlzIHNvZnR3YXJlCiMgaW4gYW55IE5vbiBHUEwgdmVyc2lvbiBvZiBDTVMgTWFkZSBzaW1wbGUsIG9yIGluIGFueSB2ZXJzaW9uIG9mIENNUwojIE1hZGUgc2ltcGxlIHRoYXQgZG9lcyBub3QgaW5kaWNhdGUgY2xlYXJseSBhbmQgb2J2aW91c2x5IGluIGl0cyBhZG1pbiAKIyBzZWN0aW9uIHRoYXQgdGhlIHNpdGUgd2FzIGJ1aWx0IHdpdGggQ01TIE1hZGUgc2ltcGxlLgojCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKIyBPciByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KI0VORF9MSUNFTlNFCmlmKCAhaXNzZXQoJGdDbXMpICkgZXhpdDsKaWYoICFpc3NldCgkcGFyYW1zWydsaWInXSkgfHwgJHBhcmFtc1snbGliJ10gPT0gJycgKSByZXR1cm47CgppZiggIWlzX2FycmF5KCR0aGlzLT5fbGlicykgKSAkdGhpcy0+X2xpYnMgPSBhcnJheSgpOwokbGlicyA9IGV4cGxvZGUoJywnLCRwYXJhbXNbJ2xpYiddKTsKZm9yZWFjaCggJGxpYnMgYXMgJGxpYiApIHsKICAkdGhpcy0+X2xpYnNbXSA9IHN0cnRvbG93ZXIodHJpbSgkbGliKSk7Cn0KCi8vIHRoYXQncyBpdCwgbm90aGluZyBtb3JlLgovLyByZW1lbWJlciB0byBjYWxsIHRoaXMgd2l0aCBub2NhY2hlIGF0dHJpYnV0ZS4KCiMKIyBFT0YKIwo/Pg==]]></data>
	</file>
	<file>
	  <filename>/changelog.inc</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PHVsPgogIDxsaT4xLjAuNCAtIE9jdG9iZXIgMjAwOQogICAgPHA+QWRkcyBqc29uIHN1cHBvcnQuPC9wPgogIDwvbGk+CiAgPGxpPjEuMC41IC0gTm92ZW1iZXIgMjAwOQogICAgPHA+QWRkcyBub19jc3MgYW5kIG5vX2pzIG9wdGlvbnMgdG8gdGhlIGluY2pzIGFjdGlvbi48L3A+CiAgPC9saT4KICA8bGk+MS4wLjYgLSBBcHJpbCAyMDEwCiAgICA8cD5BZGRzIGNhbGd1eXMgZGF0ZSB1dGlscyBwbHVnaW4uPC9wPgogIDwvbGk+CiAgPGxpPjEuMC45IC0gU2VwdGVtYmVyIDIwMTAKICAgIDxwPkFkZHMgbm9fanF1ZXJ5IG9wdGlvbiB0byB0aGUgaW5janMgYWN0aW9uLjwvcD4KICAgIDxQPkRvIG5vdCBvdXRwdXQganF1ZXJ5IHRhZ3MgZm9yIGFueSBtb2R1bGUgYWN0aW9ucyBvciBhZG1pbiBhY3Rpb25zIGlmIENNUyBWZXJzaW9uIGlzID49IENNUyAxLjktYmV0YTE8L3A+CiAgPC9saT4KICA8bGk+MS4wLjEwIC0KICAgIDxwPk1pbm9yIGZpeGVzLjwvcD4KICA8L2xpPgogIDxsaT4xLjAuMTEgLSBKdW5lIDIwMTEKICAgIDx1bD4KICAgICAgPGxpPk1pbm9yIEZpeGVzLjwvbGk+CiAgICAgIDxsaT5Nb3ZlcyBDaGFuZ2Vsb2cgRXh0ZXJuYWwuPC9saT4KICAgICAgPGxpPk1pbm9yIGNoYW5nZSBmb3IgMS4xMCBjb21wYXRpYmlsaXR5LjwvbGk+CiAgICAgIDxsaT5VcGRhdGUgZGVwZW5kZW5jaWVzLjwvbGk+CiAgICA8L3VsPgogIDwvbGk+CiAgPGxpPjEuMSAtIEp1bHkgMjAxMgogICA8dWw+CiAgICAgPGxpPk1vdmUgaGVscCBleHRlcm5hbC48L2xpPgogICAgIDxsaT5VcGdyYWRlIGpxdWVyeSBhbmQgZmFuY3lib3guPC9saT4KICAgPHVsPgogIDwvbGk+CiAgPGxpPjEuMiAtIEphbnVhcnkgMjAxMwogICAgPHVsPgogICAgICA8bGk+QWRkcyB0aGUgcmVxdWlyZSBhbmQgcGxhY2VtYXJrZXIgYWN0aW9ucy48L2xpPgogICAgICA8bGk+VXBncmFkZXMgYWxsIGxpYnJhcmllcyBhbmQgcmVmb3JtYXRzIHRoZW0gaW50byBhIGRpZmZlcmVudCBzdHJ1Y3R1cmUuPC9saT4KICAgICAgPGxpPkFkZHMganF1ZXJ5IHVpLCAgYW5kIENETiBzdXBwb3J0LjwvbGk+CiAgICA8L3VsPgogIDwvbGk+CiAgPGxpPnYxLjMgLSBKdW5lIDIwMTQKICAgICAgPHVsPgogICAgICAgIDxsaT5BZGRzIHN1cHBvcnQgZm9yIHRoZSBjZ2pzX3JlcXVpcmUgc3R1ZmYgaW4gQ0dFeHRlbnNpb25zLjwvbGk+Cgk8bGk+QWRkcyBhIG5ldyBjb21ib2JveCBwbHVnaW4uPC9saT4KCTxsaT5BZGRzIGpzdmlld3MgcGx1Z2luLjwvbGk+CiAgICAgIDwvdWw+CiAgICA8L3VsPgogIDwvbGk+CiAgPGxpPnYxLjMsNQogICAgICA8dWw+CiAgICAgICAgPGxpPk1pbm9yIGltcHJvdmVtZW50cy48L2xpPgogICAgICA8L3VsPgogICAgPC91bD4KICA8L2xpPgogIDxsaT52MS4zLjYKICAgIDx1bD4KICAgICAgPGxpPk5vdyBmbGFnIGRpZmZlcmVudCBtaW5pZmljYXRpb25zIGZvciBkaWZmZXJlbnQgbGlicmFyaWVzICh3aGVuIHVzaW5nIGNnanNfcmVuZGVyKTwvbGk+CiAgICAgIDxsaT5VcGdyYWRlIGpxdWVyeSB0byAxLjExLjM8L2xpPgogICAgICA8bGk+VXBncmFkZSBqcXVlcnktdWkgdG8gMS4xMS40PC9saT4KICAgIDwvdWw+CiAgPC9saT4KPC91bD4K]]></data>
	</file>
	<file>
	  <filename>/help.inc</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGgzPldoYXQgaXMgdGhpcz88L2gzPgo8cD5UaGlzIG1vZHVsZSBhZGRzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIDxhIGhyZWY9Imh0dHA6Ly93d3cuanF1ZXJ5LmNvbSI+alF1ZXJ5PC9hPiBhbmQgdmFyaW91cyBhZGRvbiBsaWJyYXJpZXMgdG8gQ01TIE1hZGUgU2ltcGxlIHBhZ2UsIGFuZCBtb2R1bGVzIChldmVuIGluIHRoZSBhZG1pbiBzZWN0aW9uKSwgY29udmVuaWVudGx5IGFuZCBlYXNpbHkuICBJdCBwcm92aWRlcyBhIGNvbnZlbmllbnQgYW5kIHNpbXBsZSB3YXkgdG8gaW5jbHVkZSBqcXVlcnkgYW5kIGpxdWVyeSBkZXBlbmRlbnQgbGlicmFyaWVzIGludG8geW91ciBDTVNNUyBjb250ZW50IHBhZ2UuPC9wPgo8aDM+SG93IGRvIEkgdXNlIGl0PzwvaDM+CjxwPkVuYWJsaW5nIHRoaXMgZnVuY3Rpb25hbGl0eSBpcyBhIHR3byBzdGVwIHByb2Nlc3M6PC9wPgo8dWw+CiAgPGxpPjEuICBFbmFibGUgdGhlIGpxdWVyeSBsaWJyYXJpZXMgdGhhdCB5b3Ugd2FudCBieSBjYWxsaW5nIDxjb2RlPntKUXVlcnlUb29scyBhY3Rpb249cmVxdWlyZSBsaWI9Jmx0O2xpYnJhcnkgbmFtZSZndDsgbm9jYWNoZX08L2NvZGU+IGluIHlvdXIgcGFnZSBjb250ZW50LgogICAgPHA+VGhpcyB0YWcgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyB0byBlbmFibGUgbXVsdGlwbGUgbGlicmFyaWVzLiAgdGhlIGxpYiBhcmd1bWVudCBhbHNvIHN1cHBvcnRzIHBhc3NpbmcgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBsaWJyYXJ5IG5hbWVzLjwvcD4KICA8L2xpPgogIDxsaT4yLiAgQ2FsbCA8Y29kZT57SlFlcnlUb29scyBhY3Rpb249cGxhY2VtYXJrZXIgbm9jYWNoZX08L2NvZGU+IGluIHRoZSBhcHByb3ByaWF0ZSBwYXJ0IG9mIHlvdXIgcGFnZSB0ZW1wbGF0ZS4KICAgIDx1bD4KICAgICAgPGxpPlRvIGVuYWJsZSBKUXVlcnlUb29scyBmb3IgYSBzcGVjaWZpYyBwYWdlIGl0IGlzIG9mdGVuIHVzZWZ1bCB0byBwbGFjZSB0aGUgPGNvZGU+e0pRdWVyeVRvb2xzIGFjdGlvbj1wbGFjZW1hcmtlciBub2NhY2hlfTwvY29kZT4gdGFnIGluIHRoZSBwYWdlIHNwZWNpZmljIG1ldGFkYXRhIGZpZWxkIG9mIGVhY2ggY29udGVudCBwYWdlLjwvbGk+CiAgICAgIDxsaT5UbyBlbmFibGUgSlF1ZXJ5VG9vbHMgb24gYSBzaXRlIHdpZGUgYmFzaXMgdGhlIDxjb2RlPntKcXVlcnlUb29scyBhY3Rpb249cGxhY2VtYXJrZXIgbm9jYWNoZX08L2NvZGU+IHRhZyBjYW4gYmUgcGxhc2VkIGluIHRoZSBnbG9iYWwgbWV0YWRhdGEgZmllbGQgaW4gdGhlIGdsb2JhbCBzZXR0aW5ncy48L2xpPgogICAgICA8bGk+WW91IG1heSBhbHNvIHBsYWNlIHRoZSA8Y29kZT57SlF1ZXJ5VG9vbHMgYWN0aW9uPXBsYWNlbWFya2VyfTwvY29kZT4gdGFnIGluIGVhY2ggc3BlY2lmaWMgcGFnZSB0ZW1wbGF0ZSwgYXQgdGhlIGJvdG9vbSBvZiB0aGUgdGVtcGxhdGUgYWJvdmUgPC9ib2R5PiBvciBhbnl3aGVyZSBpbiB0aGhlIGhlYWQgc2VjdGlvbi48L2xpPgogICAgPC91bD4KICA8L2xpPgo8L3VsPgo8cD5UaGlzIG1vZHVsZSBkb2VzIG5vdCBwcm92aWRlIHNhbXBsZXMgYW5kIGluc3RydWN0aW9ucyBhcyB0byBob3cgdG8gdXNlIGpxdWVyeSBvciB0aGUgdmFyaW91cyBhZGRvbiBsaWJyYXJpZXMgdGhhdCB3ZSBpbmNsdWRlLiAgdG8gbGVhcm4gaG93IHRvIHVzZSB0aGVzZSBsaWJyYXJpZXMgeW91IHdpbGwgbmVlZCB0byByZWFkIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgcGx1Z2lucyBhdCB0aGVpciByZXNwZWN0aXZlIGhvbWUgcGFnZS48L3A+Cgo8aDM+V2hhdCBqcXVlcnkgdmVyc2lvbiBpcyBpbmNsdWRlZD88L2gzPgo8cD5DdXJyZW50bHkgSlF1ZXJ5VG9vbHMgdXNlcyBqcXVlcnkgMS44LjM8L3A+CjxoMz5XaGF0IEpRdWVyeSBwbHVnaW5zIGFyZSBpbmNsdWRlZDwvaDM+Cjx1bD4KICA8bGk+dGFibGVzb3J0ZXIgPGVtPihzZWUgPGEgaHJlZj0iaHR0cDovL3RhYmxlc29ydGVyLmNvbSI+aHR0cDovL3RhYmxlc29ydGVyLmNvbTwvYT4gZm9yIHVzYWdlIGluc3RydWN0aW9ucyk8L2VtPgo8cD4tLSBUbyBhbGxvdyBzb3J0aW5nIHlvdXIgdGFibGVzLCBnaXZlIHRoZSBmb2xsd2luZyBjbGFzc2VzIHRvIHRoZSB0YWJsZSBkZWZpbml0aW9uOiBjbXNfc29ydGFibGUgdGFibGVzb3J0ZXIuIGkuZTogPGNvZGU+Jmx0O3RhYmxlIGNsYXNzPSJjbXNfc29ydGFibGUgdGFibGVzb3J0ZXIiJmd0Oy4uLiZsdDsvdGFibGUmZ3Q7PC9jb2RlPjwvcD4KICA8L2xpPgogIDxsaT5qcXVlcnk8L2xpPgogIDxsaT5qcXVlcnkgdWkgLSBzbW9vdGhuZXNzIHRoZW1lLjwvbGk+CiAgPGxpPmNsdWV0aXAgPGVtPihzZWUgPGEgaHJlZj0iaHR0cDovL3BsdWdpbnMubGVhcm5pbmdqcXVlcnkuY29tL2NsdWV0aXAvIj5odHRwOi8vcGx1Z2lucy5sZWFybmluZ2pxdWVyeS5jb20vY2x1ZXRpcC88L2E+IGZvciB1c2FnZSBpbnN0cnVjdGlvbnMpPC9lbT48L2xpPgogIDxsaT5mb3JtIDxlbT4oc2VlIDxhIGhyZWY9Imh0dHA6Ly9tYWxzdXAuY29tL2pxdWVyeS9mb3JtLyI+aHR0cDovL21hbHN1cC5jb20vanF1ZXJ5L2Zvcm0vPC9hPiBmb3IgdXNhZ2UgaW5zdHJ1Y3Rpb25zKTwvZW0+PC9saT4KICA8bGk+ZmFuY3lib3ggPGVtPihzZWUgPGEgaHJlZj0iaHR0cDovL2ZhbmN5LmtsYWRlLmx2LyI+aHR0cDovL2ZhbmN5LmtsYWRlLmx2LzwvYT4gZm9yIHVzYWdlIGluc3RydWN0aW9ucyk8L2VtPjwvbGk+CiAgPGxpPmpzb248L2xpPgogIDxsaT5saWdodGJveDwvbGk+CiAgPGxpPmZpbGV1cGxvYWQgLSBUaGUgYmx1ZWltcCBqcXVlcnkgZmlsZSB1cGxvYWQgbGlicmFyeS48L2xpPgo8L3VsPgo8aDM+RXhhbXBsZTo8L2gzPgogPHA+U28geW91IGhhdmUgdXBsb2FkZWQgc29tZSBmaWxlcyB0byBhIGNhdGVnb3J5IGluIHRoZSB1cGxvYWRzIG1vZHVsZSwgYW5kIHlvdSB3YW50IHRvIHVzZSBmYW5jeWJveCB0byBwcmV2aWV3IHRoZSBpbWFnZXMgZnJvbSBhbiBVcGxvYWRzIG1vZHVsZSBzdW1tYXJ5IHZpZXcuIFRoaXMgaXMgYSBzaW1wbGUgMyBzdGVwIHByb2Nlc3M6PC9wPgo8b2w+CiAgIDxsaT5Nb2RpZnkgeW91ciB1cGxvYWRzIHN1bW1hcnkgdGVtcGxhdGUgdG8gc29tZXRoaW5nIHNpbWlsYXIgdG8gdGhpczoKPHByZT48Y29kZT48c3BhbiBzdHlsZT0iY29sb3I6IGJsdWU7Ij57SlF1ZXJ5VG9vbHMgYWN0aW9uPXJlcXVpcmUgbGliPWZhbmN5Ym94IG5vY2FjaGV9PC9zcGFuPgp7Zm9yZWFjaCBmcm9tPSRpdGVtcyBpdGVtPSdlbnRyeScgbmFtZT0ndXBsb2Fkcyd9CiAgJmx0O2RpdiBjbGFzcz0idXBsb2FkIiBzdHlsZT0iZmxvYXQ6IGxlZnQ7IHdpZHRoOiAzMyU7IiZndDsKICB7aWYgaXNzZXQoJGVudHJ5LT50aHVtYm5haWxfdXJsKX0KICAmbHQ7YSBjbGFzcz0iZmFuY3lib3giIGhyZWY9InskZW50cnktPm9yaWdmaWxlX3VybH0iIHRpdGxlPSJ7JGVudHJ5LT51cGxvYWRfbmFtZX0iJmd0OyZsdDtpbWcgc3JjPSJ7JGVudHJ5LT50aHVtYm5haWxfdXJsfSIgYWx0PSIiLyZndDsmbHQ7L2EmZ3Q7CiAgey9pZn0KICAmbHQ7L2RpdiZndDsKey9mb3JlYWNofQombHQ7ZGl2IHN0eWxlPSJjbGVhcjogYm90aDsiJmd0OyZndDsvZGl2Jmx0OzwvY29kZT48L3ByZT4KICAgPHA+Tm90ZSB0aGUgY2FsbCB0byBKUXVlcnlUb29scyB0byBpbmNsdWRlIHRoZSBmYW5jeWJveCBsaWJyYXJ5LiBBZGRpdGlvbmFsbHksIG5vdGUgdGhlIGNsYXNzIGdpdmVuIHRvIHRoZSA8ZW0+YTwvZW0+IHRhZy48L3A+CiAgPC9saT4KICA8bGk+Q2FsbCA8Y29kZT57SlF1ZXJ5VG9vbHMgYWN0aW9uPXBsYWNlbWFya2VyIG5vY2FjaGV9PC9jb2RlPgogICAgPHA+VGhlcmUgYXJlIGF0IGxlYXN0IGZvdXIgbG9jYXRpb25zIHdoZXJlIHRoaXMgdGFnIGNhbiBiZSBjYWxsZWQ6PC9wPgogICAgPHVsPgogICAgICA8bGk+SW4gdGhlIHBhZ2UgdGVtcGxhdGUgZGlyZWN0bHkgYmVmb3JlIHRoZSA8Y29kZT4mbHQ7L2JvZHkmZ3Q7PC9jb2RlPiB0YWcuPC9saT4KICAgICAgPGxpPkluIHRoZSBwYWdlIHRlbXBsYXRlIGRpcmVjdGx5IGJlZm9yZSB0aGUgPGNvZGU+Jmx0Oy9oZWFkJmd0OzwvY29kZT4gdGFnLjwvbGk+CiAgICAgIDxsaT5JbiB0aGUgcGFnZSBtZXRhZGF0YSBmaWVsZCB3aGVuIGVkaXRpbmcgY29udGVudC48L2xpPgogICAgICA8bGk+SW4gdGhlIGdsb2JhbCBtZXRhZGF0YSBmaWVsZCBpbiB0aGUgZ2xvYmFsIHNldHRpbmdzIHBhZ2UuPC9saT4KICAgIDwvdWw+CiAgPC9saT4KICA8bGk+Q2FsbCB0aGUgVXBsb2FkcyBtb2R1bGUgZnJvbSBhIHBhZ2UuICBpLmU6PGJyLz4KICAgIDxwcmU+PGNvZGU+e1VwbG9hZHMgY2F0ZWdvcnk9Y2F0ZWdvcnlfbmFtZX08L2NvZGU+PC9wcmU+CiAgPC9saT4KPC9vbD4KPGgzPkJ1aWx0IGluIFJlYWR5IFNjcmlwdHM8L2gzPgo8cD5UaGlzIG1vZHVsZSBzdXBwb3J0cyBzb21lIHNpbXBsZSByZWFkeSBzdGF0ZXMgdG8gZWFzZSBpbiBkZXZlbG9wbWVudC4gIEFsbCBvZiB0aGVzZSBjYW4gYmUgb3ZlcndyaXR0ZW4gaW4geW91ciBvd24gamF2YXNjcmlwdDo8L3A+Cjx1bD4KICAgIDxsaT5mYW5jeWJveCAtIGZhbmN5Ym94IHdpbGwgd29yayBvbiBhbnkgYSB0YWcgd2l0aCBhIGNsYXNzIG9mIGZhbmN5Ym94OiAgJCgnYS5mYW5jeWJveCcpLmZhbmN5Ym94KCkKICAgICAgPHByZT48Y29kZT4mbHQ7YSBjbGFzcz0mcXVvdDtmYW5jeWJveCZxdW90OyBocmVmPSZxdW90O2h0dHA6Ly93d3cubXlzaXRlLmNvbS91cGxvYWRzL2ltYWdlcy9pbWFnZS5qcGcmcXVvdDsmZ3Q7Jmx0O2ltZyBzcmM9JnF1b3Q7aHR0cDovL3d3dy5teXNpdGUuY29tL3VwbG9hZHMvaW1hZ2VzL3RodW1iX2ltYWdlLmpwZyZxdW90Oy8mZ3Q7Jmx0O2EmZ3Q7PC9jb2RlPjwvcHJlPgoJCSAgICA8cD48c3Ryb25nPkhpbnQ6PC9zdHJvbmc+IFVzZSBDR1NtYXJ0SW1hZ2UgdG8gYXZvaWQgaGF2aW5nIHRvIGNyZWF0ZSBhbmQgbWFuYWdlIHRodW1ibmFpbHMgPGVtPihyZXF1aXJlcyBkb3dubG9hZGluZyBhbmQgaW5zdGFsbGluZyB0aGUgQ0dTbWFydEltYWdlIG1vZHVsZSk8L2VtPjo8L3A+CgkJICAgIDxwcmU+PGNvZGU+Jmx0O2EgY2xhc3M9JnF1b3Q7ZmFuY3lib3gmcXVvdDsgaHJlZj0mcXVvdDt7Q0dTbWFydEltYWdlIHNyYz0naW1hZ2VzL2ltYWdlLmpwZycgbm9lbWJlZD0xfSZxdW90OyZndDt7Q0dTbWFydEltYWdlIHNyYz0naW1hZ2VzL2ltYWdlLmpwZycgd2lkdGg9MTAwIGhlaWdodD0xMDB9Jmx0O2EmZ3Q7PC9wcmU+PC9jb2RlPgogICAgPC9saT4KICAgIDxsaT5saWdodGJveCAtIGxpZ2h0Ym94IHdpbGwgd29yayBvbiBhbnkgYSB0YWcgd2l0aCBhIGNsYXNzIG9mIGxpZ2h0Ym94OiAgJCgnYS5saWdodGJveCcpLmxpZ2h0Ym94KCk8L2xpPgogICAgPGxpPmNsdWV0aXAgLSBjbHVldGlwIHdpbGwgd29yayBvbiBhbnkgYSB0YWcgd2l0aCBhIGNsYXNzIG9mIGNsdWV0aXA6ICAkKCdhLmNsdWV0aXAnKS5jbHVldGlwKCk8L2xpPgogICAgPGxpPnRhYmxlc29ydGVyIC0gdGFibGVzb3J0ZXIgd2lsbCB3b3JrIG9uIGFueSB0YWJsZSB0YWcgd2l0aCBhIGNsYXNzIG9mIGNtc19zb3J0YWJsZTogJCgndGFibGUuY21zX3NvcnRhYmxlJykudGFibGVTb3J0ZXIoKTwvbGk+CjwvdWw+CjxoMz5BYm91dCBzbWFydHkgY2FjaGluZzwvaDM+CjxwPlRoZSByZXF1aXJlLCBhbmQgcGxhY2VtYXJrZXIgYWN0aW9ucyBkbyBub3Qgc3VwcG9ydCBzbWFydHkgY2FjaGluZy4gIEl0IGlzIHRoZXJlZmVyZSBjcml0aWNhbCB0aGF0IHRoZSBub2NhY2hlIGF0dHJpYnV0ZSBiZSB1c2VkIG9uIGNhbGxzIHRvIHRoZSBKUXVlcnlUb29scyBtb2R1bGUuPC9wPgo8aDM+QWJvdXQgdGhlIHBsYWNlbWFya2VyIGFjdGlvbi48L2gzPgo8cD5UaGUgcGxhY2VtYXJrZXIgYWN0aW9uIGRvZXMgdGhlIGpvYiBvZiBnZW5lcmF0aW5nIHRoZSBodG1sIHRvIGluc2VydCB0aGUganF1ZXJ5IHNjcmlwdHMsIGFuZCB0aGUgdmFyaW91cyBhZGRvbiBsaWJyYXJpZXMgdGhhdCB3ZXJlIHJlcXVlc3RlZCB2aWEgdGhlIHJlcXVpcmUgYWN0aW9uLiAgVGhlcmVmb3JlIHRoZSBwbGFjZW1hcmtlciBhY3Rpb24gbXVzdCBiZSBjYWxsZWQgQUZURVIgYWxsIGNhbGxzIHRvIHRoZSByZXF1aXJlIGFjdGlvbi4gICBQbGVhc2Uga2VlcCBpbiBtaW5kIHRoYXQgQ01TTVMgZGl2aWRlcyBwYWdlIHRlbXBsYXRlcyBpbnRvIHRocmVlIHBvcnRpb25zIGFuZCBwcm9jZXNzZXMgdGhlbSBpbiB0aGlzIG9yZGVyOiAgVGhlIHRvcCBwb3J0aW9uIG9mIHRoZSBwYWdlIGJlZm9yZSB0aGUgJmx0O2h0bWwmZ3Q7IHRhZy4gIFRoZSBib2R5IHNlY3Rpb24sIGFuZCB0aGUgaGVhZCBzZWN0aW9uLjwvcD4KCjxoMz5TdXBwb3J0PC9oMz4KPHA+VGhlIG1vZHVsZSBhdXRob3IgaXMgaW4gbm8gd2F5IG9ibGlnYXRlZCB0byBwcml2aWRlIHN1cHBvcnQgZm9yIHRoaXMgY29kZSBpbiBhbnkgZmFzaGlvbi4gIEhvd2V2ZXIsIHRoZXJlIGFyZSBhIG51bWJlciBvZiByZXNvdXJjZXMgYXZhaWxhYmxlIHRvIGhlbHAgeW91IHdpdGggaXQ6PC9wPgo8dWw+CjxsaT5BIGJ1ZyB0cmFja2luZyBhbmQgZmVhdHVyZSByZXF1ZXN0IHN5c3RlbSBoYXMgYmVlbiBjcmVhdGVkIGZvciB0aGlzIG1vZHVsZSA8YSBocmVmPSJodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnL3Byb2plY3RzL2pxdWVyeXRvb2xzIj5oZXJlPC9hPi4gIFBsZWFzZSBiZSB2ZXJib3NlIGFuZCBkZXNjcmlwdGl2ZSB3aGVuIHN1Ym1pdHRpbmcgYnVnIHJlcG9ydHMgYW5kIGZlYXR1cmUgcmVxdWVzdHMsIGFuZCBmb3IgYnVnIHJlcG9ydHMgZW5zdXJlIHRoYXQgeW91IGhhdmUgcHJvdmlkZWQgc3VmZmljaWVudCBpbmZvcm1hdGlvbiB0byByZWxpYWJseSByZXByb2R1Y2UgdGhlIGlzc3VlLjwvbGk+CjxsaT5BZGRpdGlvbmFsIGRpc2N1c3Npb24gb2YgdGhpcyBtb2R1bGUgbWF5IGFsc28gYmUgZm91bmQgaW4gdGhlIDxhIGhyZWY9Imh0dHA6Ly9mb3J1bS5jbXNtYWRlc2ltcGxlLm9yZyI+Q01TIE1hZGUgU2ltcGxlIEZvcnVtczwvYT4uICBXaGVuIGRlc2NyaWJpbmcgYW4gaXNzdWUgcGxlYXNlIG1ha2UgYW4gZWZmb3J0IHRvIHByaXZpZGUgYWxsIHJlbGF2YW50IGluZm9ybWF0aW9uLCBhIHRob3JvdWdoIGRlc2NyaXB0aW9uIG9mIHlvdXIgaXNzdWUsIGFuZCBzdGVwcyB0byByZXByb2R1Y2UgaXQgb3IgeW91ciBkaXNjdXNzaW9uIG1heSBiZSBpZ25vcmVkLjwvbGk+CjxsaT5UaGUgYXV0aG9yLCBjYWxndXkxMDAwLCBjYW4gb2Z0ZW4gYmUgZm91bmQgaW4gdGhlIDxhIGhyZWY9ImlyYzovL2lyYy5mcmVlbm9kZS5uZXQvI2NtcyI+Q01TIElSQyBDaGFubmVsPC9hPi48L2xpPgo8bGk+TGFzdGx5LCB5b3UgbWF5IGhhdmUgc29tZSBzdWNjZXNzIGVtYWlsaW5nIHRoZSBhdXRob3IgZGlyZWN0bHkuICBIb3dldmVyLCBwbGVhc2UgdXNlIHRoaXMgYXMgYSBsYXN0IHJlc29ydCwgYW5kIGVuc3VyZSB0aGF0IHlvdSBoYXZlIGZvbGxvd2VkIGFsbCBhcHBsaWNhYmxlIGluc3RydWN0aW9ucyBvbiB0aGUgZm9yZ2UsIGluIHRoZSBmb3J1bXMsIGV0Yy48L2xpPgo8L3VsPgoKCjxoMz5Db3B5cmlnaHQgYW5kIExpY2Vuc2U8L2gzPgo8cD5Db3B5cmlnaHQgJmNvcHk7IDIwMTIsIFJvYmVydCBDYW1wYmVsIDxhIGhyZWY9Im1haWx0bzpjYWxndXkxMDAwQGNtc21hZGVzaW1wbGUub3JnIj4mbHQ7Y2FsZ3V5MTAwMEBjbXNtYWRlc2ltcGxlLm9yZyZndDs8L2E+LiBBbGwgUmlnaHRzIEFyZSBSZXNlcnZlZC48L3A+CjxwPlRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Cml0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CnRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCihhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uPC9wPgo8cD5Ib3dldmVyLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHUEwsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQKYXMgYW4gYWRkb24gbW9kdWxlIHRvIENNUyBNYWRlIFNpbXBsZS4gIFlvdSBtYXkgbm90IHVzZSB0aGlzIHNvZnR3YXJlCmluIGFueSBOb24gR1BMIHZlcnNpb24gb2YgQ01TIE1hZGUgc2ltcGxlLCBvciBpbiBhbnkgdmVyc2lvbiBvZiBDTVMKTWFkZSBzaW1wbGUgdGhhdCBkb2VzIG5vdCBpbmRpY2F0ZSBjbGVhcmx5IGFuZCBvYnZpb3VzbHkgaW4gaXRzIGFkbWluCnNlY3Rpb24gdGhhdCB0aGUgc2l0ZSB3YXMgYnVpbHQgd2l0aCBDTVMgTWFkZSBzaW1wbGUuPC9wPgo8cD5UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQpHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgpZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQphbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQpGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQpPciByZWFkIGl0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTCI+b25saW5lPC9hPjwvcD4=]]></data>
	</file>
	<file>
	  <filename>/JQueryTools.module.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKI0JFR0lOX0xJQ0VOU0UKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IEpRdWVyeVRvb2xzIChjKSAyMDA2IGJ5IFJvYmVydCBDYW1wYmVsbAojICAgICAgICAgKGNhbGd1eTEwMDBAY21zbWFkZXNpbXBsZS5vcmcpCiMgIEEgdG9vbGJveCBvZiBjb252ZW5pZW5jZXMgdG8gcHJvdmlkZSBkeW5hbWljIGphdmFzY3JpcHR5IGZ1bmN0aW9uYWxpdHkKIyAgZm9yIENNUyBtb2R1bGVzIGFuZCB3ZWJzaXRlIGRlc2lnbmVycy4KIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIENNUyAtIENNUyBNYWRlIFNpbXBsZSBpcyAoYykgMjAwNSBieSBUZWQgS3VscCAod2lzaHlAY21zbWFkZXNpbXBsZS5vcmcpCiMgVGhpcyBwcm9qZWN0cyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZwojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMKIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgSG93ZXZlciwgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR1BMLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkCiMgYXMgYW4gYWRkb24gbW9kdWxlIHRvIENNUyBNYWRlIFNpbXBsZS4gIFlvdSBtYXkgbm90IHVzZSB0aGlzIHNvZnR3YXJlCiMgaW4gYW55IE5vbiBHUEwgdmVyc2lvbiBvZiBDTVMgTWFkZSBzaW1wbGUsIG9yIGluIGFueSB2ZXJzaW9uIG9mIENNUwojIE1hZGUgc2ltcGxlIHRoYXQgZG9lcyBub3QgaW5kaWNhdGUgY2xlYXJseSBhbmQgb2J2aW91c2x5IGluIGl0cyBhZG1pbgojIHNlY3Rpb24gdGhhdCB0aGUgc2l0ZSB3YXMgYnVpbHQgd2l0aCBDTVMgTWFkZSBzaW1wbGUuCiMKIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQojIE9yIHJlYWQgaXQgb25saW5lOiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwKIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojRU5EX0xJQ0VOU0UKCi8qCmlmKCAhY2xhc3NfZXhpc3RzKCdDR0V4dGVuc2lvbnMnKSApIHsKICAkY2dleHRlbnNpb25zID0gY21zX2pvaW5fcGF0aChjbXNtcygpLT5jb25maWdbJ3Jvb3RfcGF0aCddLCdtb2R1bGVzJywnQ0dFeHRlbnNpb25zJywnQ0dFeHRlbnNpb25zLm1vZHVsZS5waHAnKTsKICBpZiggIWlzX3JlYWRhYmxlKCAkY2dleHRlbnNpb25zICkgKSB7CiAgICBlY2hvICc8aDE+PGZvbnQgY29sb3I9InJlZCI+RVJST1I6IFRoZSBDR0V4dGVuc2lvbnMgbW9kdWxlIGNvdWxkIG5vdCBiZSBmb3VuZCA1LjwvZm9udD48L2gxPic7CiAgICByZXR1cm47CiAgfQogIHJlcXVpcmVfb25jZSgkY2dleHRlbnNpb25zKTsKfQoqLwoKY2xhc3MgSlF1ZXJ5VG9vbHMgZXh0ZW5kcyBDR0V4dGVuc2lvbnMKewogIHByaXZhdGUgJF9yZXF1aXJlZF9saWJzOwoKICBmdW5jdGlvbiBHZXROYW1lKCkgeyByZXR1cm4gJ0pRdWVyeVRvb2xzJzsgfQogIGZ1bmN0aW9uIEdldEZyaWVuZGx5TmFtZSgpIHsgcmV0dXJuICR0aGlzLT5MYW5nKCdmcmllbmRseW5hbWUnKTsgfQogIGZ1bmN0aW9uIEdldFZlcnNpb24oKSB7IHJldHVybiAnMS4zLjYnOyB9CiAgZnVuY3Rpb24gR2V0SGVscCgpIHsgcmV0dXJuIGZpbGVfZ2V0X2NvbnRlbnRzKF9fRElSX18uJy9oZWxwLmluYycpOyB9CiAgZnVuY3Rpb24gR2V0QXV0aG9yKCkgeyByZXR1cm4gJ2NhbGd1eTEwMDAnOyB9CiAgZnVuY3Rpb24gR2V0QXV0aG9yRW1haWwoKSB7IHJldHVybiAnY2FsZ3V5MTAwMEBjbXNtYWRlc2ltcGxlLm9yZyc7IH0KICBmdW5jdGlvbiBHZXRDaGFuZ2VMb2coKSB7IHJldHVybiBAZmlsZV9nZXRfY29udGVudHMoX19ESVJfXy4nL2NoYW5nZWxvZy5pbmMnKTsgfQogIGZ1bmN0aW9uIElzUGx1Z2luTW9kdWxlKCkgeyByZXR1cm4gdHJ1ZTsgfQogIGZ1bmN0aW9uIEhhc0FkbWluKCkgeyByZXR1cm4gZmFsc2U7IH0KICBmdW5jdGlvbiBHZXRBZG1pblNlY3Rpb24oKSB7IHJldHVybiAnZXh0ZW5zaW9ucyc7IH0KICBmdW5jdGlvbiBHZXRBZG1pbkRlc2NyaXB0aW9uKCkgeyByZXR1cm4gJHRoaXMtPkxhbmcoJ21vZGRlc2NyaXB0aW9uJyk7IH0KICBmdW5jdGlvbiBWaXNpYmxlVG9BZG1pblVzZXIoKSB7IHJldHVybiBmYWxzZTsgfQogIGZ1bmN0aW9uIEdldERlcGVuZGVuY2llcygpIHsgcmV0dXJuIGFycmF5KCdDR0V4dGVuc2lvbnMnPT4nMS40OS4zJyk7IH0KICBmdW5jdGlvbiBNaW5pbXVtQ01TVmVyc2lvbigpIHsgcmV0dXJuICIxLjEyIjsgfQogIGZ1bmN0aW9uIEluc3RhbGxQb3N0TWVzc2FnZSgpIHsgcmV0dXJuICR0aGlzLT5MYW5nKCdwb3N0aW5zdGFsbCcpOyB9CiAgZnVuY3Rpb24gVW5pbnN0YWxsUG9zdE1lc3NhZ2UoKSB7IHJldHVybiAkdGhpcy0+TGFuZygncG9zdHVuaW5zdGFsbCcpOyB9CiAgZnVuY3Rpb24gVW5pbnN0YWxsUHJlTWVzc2FnZSgpIHsgcmV0dXJuICR0aGlzLT5MYW5nKCdwcmV1bmluc3RhbGwnKTsgfQogIGZ1bmN0aW9uIEFsbG93QXV0b0luc3RhbGwoKSB7IHJldHVybiBGQUxTRTsgfQogIGZ1bmN0aW9uIEFsbG93QXV0b1VwZ3JhZGUoKSB7IHJldHVybiBGQUxTRTsgfQoKICBmdW5jdGlvbiBJbml0aWFsaXplRnJvbnRlbmQoKQogIHsKICAgICR0aGlzLT5SZXN0cmljdFVua25vd25QYXJhbXMoKTsKICAgICR0aGlzLT5SZWdpc3Rlck1vZHVsZVBsdWdpbigpOwogICAgJHRoaXMtPlNldFBhcmFtZXRlclR5cGUoJ2V4Y2x1ZGUnLENMRUFOX1NUUklORyk7CiAgICAkdGhpcy0+U2V0UGFyYW1ldGVyVHlwZSgnbm9fY3NzJyxDTEVBTl9JTlQpOwogICAgJHRoaXMtPlNldFBhcmFtZXRlclR5cGUoJ25vX2NkbicsQ0xFQU5fSU5UKTsKICAgICR0aGlzLT5TZXRQYXJhbWV0ZXJUeXBlKCdub19qcycsQ0xFQU5fSU5UKTsKICAgICR0aGlzLT5TZXRQYXJhbWV0ZXJUeXBlKCdub19qcXVlcnknLENMRUFOX0lOVCk7CiAgICAkdGhpcy0+U2V0UGFyYW1ldGVyVHlwZSgnbm9fcmVhZHknLENMRUFOX0lOVCk7CiAgICAkdGhpcy0+U2V0UGFyYW1ldGVyVHlwZSgnbGliJyxDTEVBTl9TVFJJTkcpOwogIH0KCiAgZnVuY3Rpb24gSW5pdGlhbGl6ZUFkbWluKCkKICB7CiAgICAkdGhpcy0+UmVnaXN0ZXJNb2R1bGVQbHVnaW4oKTsKICAgICR0aGlzLT5DcmVhdGVQYXJhbWV0ZXIoJ2FjdGlvbicsbnVsbCwkdGhpcy0+TGFuZygncGFyYW1fYWN0aW9uJykpOwogICAgJHRoaXMtPkNyZWF0ZVBhcmFtZXRlcignZXhjbHVkZScsbnVsbCwkdGhpcy0+TGFuZygncGFyYW1fZXhjbHVkZScpKTsKICAgICR0aGlzLT5DcmVhdGVQYXJhbWV0ZXIoJ2xpYicsbnVsbCwkdGhpcy0+TGFuZygncGFyYW1fbGliJykpOwogICAgJHRoaXMtPkNyZWF0ZVBhcmFtZXRlcignbm9fY3NzJyxudWxsLCR0aGlzLT5MYW5nKCdwYXJhbV9ub19jc3MnKSk7CiAgICAkdGhpcy0+Q3JlYXRlUGFyYW1ldGVyKCdub19jZG4nLG51bGwsJHRoaXMtPkxhbmcoJ3BhcmFtX25vX2NkbicpKTsKICAgICR0aGlzLT5DcmVhdGVQYXJhbWV0ZXIoJ25vX2pzJyxudWxsLCR0aGlzLT5MYW5nKCdwYXJhbV9ub19qcycpKTsKICAgICR0aGlzLT5DcmVhdGVQYXJhbWV0ZXIoJ25vX2pxdWVyeScsbnVsbCwkdGhpcy0+TGFuZygncGFyYW1fbm9fanF1ZXJ5JykpOwogICAgJHRoaXMtPkNyZWF0ZVBhcmFtZXRlcignbm9fcmVhZHknLG51bGwsJHRoaXMtPkxhbmcoJ3BhcmFtX25vX3JlYWR5JykpOwogIH0KCiAgcHJvdGVjdGVkIGZ1bmN0aW9uIFJlZ2lzdGVyTGlicmFyaWVzKCRmb3JjZSA9IGZhbHNlKQogIHsKICAgICAgJF9mdWxscGF0aCA9IGZ1bmN0aW9uKCRkaXIsJGluKSB7CiAgICAgICAgICBpZiggIWlzX2FycmF5KCRpbikgKSAkaW4gPSBhcnJheSgkaW4pOwogICAgICAgICAgJF9vd2Q9Z2V0Y3dkKCk7CiAgICAgICAgICBjaGRpcigkZGlyKTsKICAgICAgICAgICRvdXQgPSBhcnJheSgpOwogICAgICAgICAgZm9yZWFjaCggJGluIGFzICRvbmUgKSB7CiAgICAgICAgICAgICAgaWYoIGlzX2ZpbGUoJG9uZSkgKSAkb3V0W10gPSAiJGRpci8kb25lIjsKICAgICAgICAgIH0KICAgICAgICAgIGNoZGlyKCRfb3dkKTsKICAgICAgICAgIHJldHVybiAkb3V0OwogICAgICB9OwoKICAgICAgLy8gY29udmVydCBhIHZlcmlmaWVkIGZpeCBwYXRoIHRvIGEgc21hcnR5IHRlbXBsYXRlIHdpdGggeyRyb290X3BhdGh9CiAgICAgIC8vIHRvIGhhbmRsZSBzaXRlIG1vdmVzIGFuZCBjcnVmdC4KICAgICAgJF90b3JlbHBhdGggPSBmdW5jdGlvbigkZm4pIHsKICAgICAgICAgIGlmKCAhaXNfYXJyYXkoJGZuKSApICRpbiA9IGFycmF5KCRmbik7CiAgICAgICAgICAkY29uZmlnID0gY21zX2NvbmZpZzo6Z2V0X2luc3RhbmNlKCk7CiAgICAgICAgICAkb3V0ID0gYXJyYXkoKTsKICAgICAgICAgIGZvcmVhY2goICRmbiBhcyAkb25lICkgewogICAgICAgICAgICAgIGlmKCBzdGFydHN3aXRoKCRjb25maWdbJ3Jvb3RfcGF0aCddLCRvbmUpICkgJG91dFtdID0gc3RyX3JlcGxhY2UoJGNvbmZpZ1sncm9vdF9wYXRoJ10sJ3skcm9vdF9wYXRofScsJG9uZSk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gJGZuOwogICAgICB9OwoKICAgICAgJGJhc2VkaXIgPSAkdGhpcy0+R2V0TW9kdWxlUGF0aCgpLicvbGliJzsKICAgICAgJGRpcnMgPSBnbG9iKCRiYXNlZGlyLicvKi5saWInKTsKICAgICAgJGxpYnJhcmllcyA9IGFycmF5KCk7CiAgICAgIGlmKCBpc19hcnJheSgkZGlycykgJiYgY291bnQoJGRpcnMpICkgewogICAgICAgICAgZm9yZWFjaCggJGRpcnMgYXMgJGRpciApIHsKICAgICAgICAgICAgICBpZiggIWlzX2RpcigkZGlyKSApIGNvbnRpbnVlOwogICAgICAgICAgICAgIGlmKCAhaXNfZmlsZSgkZGlyLicvaW5mby5kYXQnKSApIGNvbnRpbnVlOwogICAgICAgICAgICAgICRibiA9IGJhc2VuYW1lKCRkaXIpOwogICAgICAgICAgICAgICRuYW1lID0gc3RydG9sb3dlcihzdWJzdHIoJGJuLDAsLTQpKTsKICAgICAgICAgICAgICBpbmNsdWRlKCRkaXIuJy9pbmZvLmRhdCcpOwoKICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAkbG9hZGVyID0gbmV3IFxDR0V4dGVuc2lvbnNcanNsb2FkZXJcbGliZGVmbigkbmFtZSk7CiAgICAgICAgICAgICAgICAgICRsb2FkZXItPm1vZHVsZSA9ICR0aGlzLT5HZXROYW1lKCk7CiAgICAgICAgICAgICAgICAgIGlmKCBpc3NldCgkaW5mb1snanNfbm9taW5pZnknXSkgJiYgJGluZm9bJ2pzX25vbWluaWZ5J10gKSAkbG9hZGVyLT5qc19ub21pbmlmeSA9IDE7CiAgICAgICAgICAgICAgICAgIGlmKCBpc3NldCgkaW5mb1snY3NzX25vbWluaWZ5J10pICYmICRpbmZvWydjc3Nfbm9taW5pZnknXSApICRsb2FkZXItPmNzc19ub21pbmlmeSA9IDE7CiAgICAgICAgICAgICAgICAgIGlmKCBpc3NldCgkaW5mb1snanMnXSkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAkdG1wID0gJF9mdWxscGF0aCgkZGlyLCRpbmZvWydqcyddKTsKICAgICAgICAgICAgICAgICAgICAgICR0bXAgPSAkX3RvcmVscGF0aCgkdG1wKTsKICAgICAgICAgICAgICAgICAgICAgICRsb2FkZXItPmpzZmlsZSA9ICRfdG9yZWxwYXRoKCR0bXApOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGlmKCBpc3NldCgkaW5mb1snY3NzJ10pICkgewogICAgICAgICAgICAgICAgICAgICAgJHRtcCA9ICRfZnVsbHBhdGgoJGRpciwkaW5mb1snY3NzJ10pOwogICAgICAgICAgICAgICAgICAgICAgJGxvYWRlci0+Y3NzZmlsZSA9ICRfdG9yZWxwYXRoKCR0bXApOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGlmKCBpc3NldCgkaW5mb1snZGVwZW5kcyddKSApICRsb2FkZXItPmRlcGVuZHMgPSAkaW5mb1snZGVwZW5kcyddOwogICAgICAgICAgICAgICAgICBcQ0dFeHRlbnNpb25zXGpzbG9hZGVyXGpzbG9hZGVyOjpyZWdpc3RlcigkbG9hZGVyLCRmb3JjZSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGNhdGNoKCBcRXhjZXB0aW9uICRlICkgewogICAgICAgICAgICAgICAgICBkZWJ1Z19kaXNwbGF5KCRlLT5HZXRNZXNzYWdlKCkpOwogICAgICAgICAgICAgICAgICBkZWJ1Z190b19sb2coJGUtPkdldE1lc3NhZ2UoKSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHVuc2V0KCRpbmZvKTsKICAgICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gbm93IG1hbnVhbGx5IHJlZ2lzdGVyIHNvbWUgbGlicmFyaWVzLgogICAgICAkbG9hZGVyID0gbmV3IFxDR0V4dGVuc2lvbnNcanNsb2FkZXJcbGliZGVmbignY2dfZGF0ZXBpY2tlcicpOwogICAgICAkbG9hZGVyLT5jYWxsYmFjayA9ICdcSlF1ZXJ5VG9vbHNcZGF0ZXBpY2tlcl9wbHVnaW46OmxvYWQnOwogICAgICBcQ0dFeHRlbnNpb25zXGpzbG9hZGVyXGpzbG9hZGVyOjpyZWdpc3RlcigkbG9hZGVyLCRmb3JjZSk7CiAgfQp9IC8vIGNsYXNzCgo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lang/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lang/en_US.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKI0EKCgojQgoKCiNDCgojRAokbGFuZ1snZHBfdG9kYXknXSA9ICdUb2RheSc7CiRsYW5nWydkcF9jbG9zZSddID0gJ0Nsb3NlJzsKJGxhbmdbJ2RwX2Nob29zZSddID0gJ0Nob29zZSc7CiRsYW5nWydkcF9uZXh0J10gPSAnTmV4dCc7CiRsYW5nWydkcF9wcmV2J10gPSAnUHJldic7CgojRQoKCiNGCiRsYW5nWydmcmllbmRseW5hbWUnXSA9ICdKUXVlcnkgVG9vbGJveCc7CgoKI0cKCgojSAoKCiNJCgoKI0oKCgojSwoKCiNMCgoKI00KJGxhbmdbJ21vZGRlc2NyaXB0aW9uJ10gPSAnQSB0b29sYm94IG9mIEpxdWVyeSB1dGlsaXRpZXMgdG8gYWlkZSBpbiBjcmVhdGluZyBkeW5hbWljIGFuZCBmYW5jeSBDTVMgTWFkZSBTaW1wbGUgbW9kdWxlcyBhbmQgd2Vic2l0ZXMnOwoKI04KCgojTwoKCiNQCiRsYW5nWydwYXJhbV9hY3Rpb24nXSA9ICdTcGVjaWZ5IHRoZSBhY3Rpb24gdG8gYmUgY2FsbGVkLiAgUG9zc2libGUgdmFsdWVzIGFyZTo8dWw+PGxpPnJlcXVpcmUgLSBNYXJrcyB0aGUgc2VsZWN0ZWQgbGlicmFyaWVzIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBwYWdlIEhUTUwuICBTZWUgdGhlIGxpc3QgYWJvdmUgZm9yIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBsaWJyYXJpZXMuPC9saT48bGk+cGxhY2VtYXJrZXIgLSBJbmRpY2F0ZXMgdGhlIHBsYWNlIGluIHRoZSBIVE1MIG91dHB1dCB3aGVyZSB0aGUgc2VsZWN0ZWQgbGlicmFyaWVzIHNob3VsZCBiZSBpbmNsdWRlZC48L2xpPjxsaT5pbmNqcyAtIDxlbT4oZGVwcmVjYXRlZCk8L2VtPiBJbmNsdWRlIHJlcXVpcmVkIGphdmFzY3JpcHQgZmlsZXMuPC9saT48bGk+cmVhZHkgLSA8ZW0+KGRlcHJlY2F0ZWQpPC9lbT4gT3V0cHV0IGRlZmF1bHQgcmVhZHkgZnVuY3Rpb24uPC9saT48L3VsPic7CiRsYW5nWydwYXJhbV9leGNsdWRlJ10gPSAnQXBwbGljYWJsZSBvbmx5IHRvIHRoZSBwbGFjZW1hcmtlciBhbmQgaW5janMgYWN0aW9ucywgdGhpcyBwYXJhbWV0ZXIgYWxsb3dzIGV4Y2x1ZGluZyBjZXJ0YWluIGpxdWVyeSBwbHVnaW5zIGZyb20gdGhlIG91dHB1dCBnZW5lcmF0ZWQuICBQb3NzaWJsZSB2YWx1ZXMgYXJlOiB0YWJsZXNvcnRlcixjbHVldGlwLGZvcm0uJzsKJGxhbmdbJ3BhcmFtX2xpYiddID0gJ0FwcGxpY2FibGUgb25seSB0byB0aGUgcmVxdWlyZSBhY3Rpb24sIHRoaXMgcGFyYW1ldGVyIGFsbG93cyBzcGVjaWZ5aW5nIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YganF1ZXJ5IGxpYnJhcmllcyB0byBpbnN0YWxsLic7CiRsYW5nWydwYXJhbV9ub19jc3MnXSA9ICdBcHBsaWNhYmxlIG9ubHkgdG8gdGhlIHBsYWNlbWFya2VyIGFuZCBpbmNqcyBhY3Rpb25zLCB0aGlzIHdpbGwgZXhjbHVkZSBjc3MgdGFncyBmcm9tIGJlaW5nIG91dHB1dCc7CiRsYW5nWydwYXJhbV9ub19jZG4nXSA9ICdBcHBsaWNhYmxlIG9ubHkgdG8gdGhlIHBsYWNlbWFya2VyIGFuZCBpbmNqcyBhY3Rpb25zLCB0aGlzIHdpbGwgcHJldmVudCBKUXVlcnlUb29scyBmcm9tIHVzaW5nIGEgQ0ROIFVSTCBmb3IgdGhlIGphdmFzY3JpcHQgbGlicmFyaWVzLCBpZiBvbmUgaXMgYXZhaWxhYmxlIChub3QgYWxsIGxpYnJhcmllcyBhcmUgYXZhaWxhYmxlIGJ5IGEgQ0ROJzsKJGxhbmdbJ3BhcmFtX25vX2pzJ10gPSAnQXBwbGljYWJsZSBvbmx5IHRvIHRoZSBwbGFjZW1hcmtlciBhbmQgaW5janMgYWN0aW9ucywgdGhpcyB3aWxsIGV4Y2x1ZGUgc2NyaXB0IHRhZ3MgZnJvbSBiZWluZyBvdXRwdXQnOwokbGFuZ1sncGFyYW1fbm9fanF1ZXJ5J10gPSAnQXBwbGljYWJsZSBvbmx5IHRvIHRoZSBwbGFjZW1hcmtlciBhbmQgaW5janMgYWN0aW9ucywgdGhpcyB3aWxsIGV4Y2x1ZGUganF1ZXJ5IGZyb20gYmVpbmcgaW5jbHVkZWQnOwokbGFuZ1sncGFyYW1fbm9fcmVhZHknXSA9ICdBcHBsaWNhYmxlIG9ubHkgdG8gdGhlIHBsYWNlbWFya2VyIGFjdGlvbnMsIHRoaXMgd2lsbCBleGNsdWRlIGFueSByZWFkeSBmdW5jdGlvbnMgZnJvbSBiZWluZyBvdXRwdXQuJzsKJGxhbmdbJ3Bvc3RpbnN0YWxsJ10gPSAnVGhlIEpRdWVyeVRvb2xzIG1vZHVsZSBoYXMgYmVlbiBpbnN0YWxsZWQuLi4uIGdldCBjcmFja2luJzsKJGxhbmdbJ3Bvc3R1bmluc3RhbGwnXSA9ICdUaGUgSlF1ZXJ5VG9vbHMgbW9kdWxlIGhhcyBiZWVuIHVuaW5zdGFsbGVkJzsKJGxhbmdbJ3ByZXVuaW5zdGFsbCddID0gJ1JlbW92aW5nIHRoaXMgbW9kdWxlIGNvdWxkIGRhbWFnZSB0aGUgYXBwZWFyYW5jZSBhbmQgZnVuY3Rpb25hbGl0eSBvZiB5b3VyIHdlYnNpdGUuICBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gY29udGludWU/JzsKCiNRCgoKI1IKCgojUwoKCiNUCgoKI1UKCgojVgoKCiNXCgoKI1gKCgojWQoKCiNaCgoKPz4K]]></data>
	</file>
	<file>
	  <filename>/lang/ext/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lang/ext/de_DE.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0pRdWVyeS1Ub29sYm94JzsKJGxhbmdbJ3BhcmFtX2V4Y2x1ZGUnXSA9ICdLYW5uIG51ciBtaXQgZGVyIEFrdGlvbiAmcXVvdDtpbmNqcyZxdW90OyB2ZXJ3ZW5kZXQgd2VyZGVuLiBEYW1pdCBrJm91bWw7bm5lbiBiZXN0aW1tdGUgalF1ZXJ5LVBsdWdpbnMgdm9uIGRlciBBdXNnYWJlIGF1c2dlc2NobG9zc2VuIHdlcmRlbi4gTSZvdW1sO2dsaWNoZSBXZXJ0ZSBzaW5kOiB0YWJsZXNvcnRlciwgY2x1ZXRpcCwgZm9ybS4nOwokbGFuZ1sncGFyYW1faW5jbHVkZSddID0gJ0thbm4gbnVyIG1pdCBkZXIgQWt0aW9uICZxdW90O2luY2pzJnF1b3Q7IHZlcndlbmRldCB3ZXJkZW4uIERhbWl0IGsmb3VtbDtubmVuIGJlc3RpbW10ZSBqUXVlcnktUGx1Z2lucyBlaW5nZXNjaGxvc3NlbiB3ZXJkZW4sIHcmYXVtbDtocmVuZGRlc3NlbiBhbGxlIGFuZGVyZW4gYXVzZ2VzY2hsb3NzZW4gc2luZC4gV2lyZCBkaWVzZXIgUGFyYW1ldGVyIGFuZ2VnZWJlbiwgd2lyZCBkZXIgZXhjbHVkZS1QYXJhbWV0ZXIgaWdub3JpZXJ0LiBNJm91bWw7Z2xpY2hlIFdlcnRlIHNpbmQ6IHRhYmxlc29ydGVyLCBjbHVldGlwLCBmb3JtLic7CiRsYW5nWydwYXJhbV9ub19jc3MnXSA9ICdLYW5uIG51ciBtaXQgZGVyIEFrdGlvbiAmcXVvdDtpbmNqcyZxdW90OyB2ZXJ3ZW5kZXQgd2VyZGVuLiBEYW1pdCB3ZXJkZW4gZGllIENTUy1UYWdzIHZvbiBkZXIgQXVzZ2FiZSBhdXNnZXNjaGxvc3Nlbi4nOwokbGFuZ1sncGFyYW1fbm9fanMnXSA9ICdLYW5uIG51ciBtaXQgZGVyIEFrdGlvbiAmcXVvdDtpbmNqcyZxdW90OyB2ZXJ3ZW5kZXQgd2VyZGVuLiBEYW1pdCB3ZXJkZW4gZGllIHNjcmlwdC1UYWdzIHZvbiBkZXIgQXVzZ2FiZSBhdXNnZXNjaGxvc3Nlbi4nOwokbGFuZ1sncGFyYW1fbm9fcXVlcnknXSA9ICdLYW5uIG51ciBtaXQgZGVyIEFrdGlvbiAmcXVvdDtpbmNqcyZxdW90OyB2ZXJ3ZW5kZXQgd2VyZGVuLiBEYW1pdCB3aXJkIGpRdWVyeSB2b20gTGFkZW4gYXVzZ2VzY2hsb3NzZW4uJzsKJGxhbmdbJ3Bvc3RpbnN0YWxsJ10gPSAnRGllIGpRdWVyeS1Ub29scyB3dXJkZW4gaW5zdGFsbGllcnQgLi4uIGxvcyBnZWh0JiMwMzk7cyEnOwokbGFuZ1sncG9zdHVuaW5zdGFsbCddID0gJ0RpZSBqUXVlcnktVG9vbHMgd3VyZGVuIGRlaW5zdGFsbGllcnQuJzsKJGxhbmdbJ3ByZXVuaW5zdGFsbCddID0gJ0RpZSBFbnRmZXJudW5nIGRpZXNlcyBNb2R1bHMga2FubiBkYXMgRXJzY2hlaW51bmdzYmlsZCB1bmQgZGllIEZ1bmt0aW9uYWxpdCZhdW1sO3QgSWhyZXIgV2Vic2VpdGUgZXJoZWJsaWNoIGJlZWludHImYXVtbDtjaHRpZ2VuLiBXb2xsZW4gU2llIGRhcyB3aXJrbGljaD8nOwo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lang/ext/fa_FA.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0pRdWVyeSDYrNi52KjZhyDYp9io2LLYp9ixJzsKJGxhbmdbJ21vZGRlc2NyaXB0aW9uJ10gPSAnQSB0b29sYm94IG9mIEpxdWVyeSB1dGlsaXRpZXMgdG8gYWlkZSBpbiBjcmVhdGluZyBkeW5hbWljIGFuZCBmYW5jeSBDTVMgTWFkZSBTaW1wbGUgbW9kdWxlcyBhbmQgd2Vic2l0ZXMnOwokbGFuZ1sncGFyYW1fYWN0aW9uJ10gPSAnU3BlY2lmeSB0aGUgYWN0aW9uIHRvIGJlIGNhbGxlZC4gIFBvc3NpYmxlIHZhbHVlcyBhcmU6PHVsPjxsaT5pbmNqcyAtIEluY2x1ZGUgcmVxdWlyZWQgamF2YXNjcmlwdCBmaWxlcy48L2xpPjxsaT5yZWFkeSAtIE91dHB1dCBkZWZhdWx0IHJlYWR5IGZ1bmN0aW9uLjwvbGk+PC91bD4nOwokbGFuZ1sncGFyYW1fZXhjbHVkZSddID0gJ0FwcGxpY2FibGUgb25seSB0byB0aGUgaW5janMgYWN0aW9uLCB0aGlzIHBhcmFtZXRlciBhbGxvd3MgZXhjbHVkaW5nIGNlcnRhaW4ganF1ZXJ5IHBsdWdpbnMgZnJvbSB0aGUgb3V0cHV0IGdlbmVyYXRlZC4gIFBvc3NpYmxlIHZhbHVlcyBhcmU6IHRhYmxlc29ydGVyLGNsdWV0aXAsZm9ybS4nOwokbGFuZ1sncGFyYW1faW5jbHVkZSddID0gJ0FwcGxpY2FibGUgb25seSB0byB0aGUgaW5janMgYWN0aW9uLCB0aGlzIHBhcmFtZXRlciBhbGxvd3MgZXhwbGljaXRseSBpbmNsdWRpbmcgY2VydGFpbiBqcXVlcnkgcGx1Z2lucyB3aGlsc3QgZXhjbHVkaW5nIGFsbCBvdGhlcnMuICBJZiB0aGlzIHBhcmFtZXRlciBpcyBzcGVjaWZpZWQsIHRoZSBleGNsdWRlIHBhcmFtZXRlciB3aWxsIGJlIGlnbm9yZWQuICBQb3NzaWJsZSB2YWx1ZXMgYXJlIHRhYmxlc29ydGVyLGNsdWV0aXAsZm9ybS4nOwokbGFuZ1sncGFyYW1fbm9fY3NzJ10gPSAnQXBwbGljYWJsZSBvbmx5IHRvIHRoZSBpbmNqcyBhY3Rpb24sIHRoaXMgd2lsbCBleGNsdWRlIGNzcyB0YWdzIGZyb20gYmVpbmcgb3V0cHV0JzsKJGxhbmdbJ3BhcmFtX25vX2pzJ10gPSAnQXBwbGljYWJsZSBvbmx5IHRvIHRoZSBpbmNqcyBhY3Rpb24sIHRoaXMgd2lsbCBleGNsdWRlIHNjcmlwdCB0YWdzIGZyb20gYmVpbmcgb3V0cHV0JzsKJGxhbmdbJ3BhcmFtX25vX3F1ZXJ5J10gPSAnQXBwbGljYWJsZSBvbmx5IHRvIHRoZSBpbmNqcyBhY3Rpb24sIHRoaXMgd2lsbCBleGNsdWRlIGpxdWVyeSBmcm9tIGJlaW5nIGluY2x1ZGVkJzsKJGxhbmdbJ3Bvc3RpbnN0YWxsJ10gPSAnVGhlIEpRdWVyeVRvb2xzIG1vZHVsZSBoYXMgYmVlbiBpbnN0YWxsZWQuLi4uIGdldCBjcmFja2luJzsKJGxhbmdbJ3Bvc3R1bmluc3RhbGwnXSA9ICdUaGUgSlF1ZXJ5VG9vbHMgbW9kdWxlIGhhcyBiZWVuIHVuaW5zdGFsbGVkJzsKJGxhbmdbJ3ByZXVuaW5zdGFsbCddID0gJ1JlbW92aW5nIHRoaXMgbW9kdWxlIGNvdWxkIGRhbWFnZSB0aGUgYXBwZWFyYW5jZSBhbmQgZnVuY3Rpb25hbGl0eSBvZiB5b3VyIHdlYnNpdGUuICBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gY29udGludWU/JzsKPz4K]]></data>
	</file>
	<file>
	  <filename>/lang/ext/fr_FR.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0JvJmljaXJjO3RlICZhZ3JhdmU7IG91dGlscyBKUXVlcnknOwokbGFuZ1snbW9kZGVzY3JpcHRpb24nXSA9ICdVbmUgYm8maWNpcmM7dGUgJmFncmF2ZTsgb3V0aWxzIGRlcyB1dGlsaXRhaXJlcyBKcXVlcnkgcG91ciBhaWRlciAmYWdyYXZlOyBsYSBjciZlYWN1dGU7YXRpb24gZGUgbW9kdWxlcyBldCBkZSBzaXRlcyB3ZWIgZHluYW1pcXVlcyBldCBzb3BoaXN0aXF1JmVhY3V0ZTtzIENNUyBNYWRlIFNpbXBsZSc7CiRsYW5nWydwYXJhbV9hY3Rpb24nXSA9ICdTcCZlYWN1dGU7Y2lmaWVyIGwmIzAzOTthY3Rpb24gJmFncmF2ZTsgcyZlYWN1dGU7bGVjdGlvbm5lci4gIExlcyB2YWxldXJzIHBvc3NpYmxlcyBzb250IDo8dWw+PGxpPmluY2pzIC0gSW5jbHV0IGxlcyBmaWNoaWVycyBqYXZhc2NyaXB0IHJlcXVpcy48L2xpPjxsaT5yZWFkeSAtIGZvbmN0aW9uIEpRdWVyeSAmIzAzOTtyZWFkeSYjMDM5OyBwYXIgZCZlYWN1dGU7ZmF1dC48L2xpPjwvdWw+JzsKJGxhbmdbJ3BhcmFtX2V4Y2x1ZGUnXSA9ICdWYWxhYmxlIHNldWxlbWVudCBwb3VyIGwmIzAzOTthY3Rpb24gaW5janMsIGNlIHBhcmFtJmVncmF2ZTt0cmUgcGVybWV0IGwmIzAzOTtleGNsdXNpb24gZGUgY2VydGFpbnMgcGx1Z2ljaWVscyBqcXVlcnkgZHUgY29udGVudSBnJmVhY3V0ZTtuJmVhY3V0ZTtyJmVhY3V0ZTsuICBMZXMgdmFsZXVycyBwb3NzaWJsZXMgc29udCA6IHRhYmxlc29ydGVyLCBjbHVldGlwLCBmb3JtLic7CiRsYW5nWydwYXJhbV9pbmNsdWRlJ10gPSAnVmFsYWJsZSBzZXVsZW1lbnQgcG91ciBsJiMwMzk7YWN0aW9uIGluY2pzLCBjZSBwYXJhbSZlZ3JhdmU7dHJlIHBlcm1ldCBsJiMwMzk7aW5jbHVzaW9uIGV4cGxpY2l0ZSBkZSBjZXJ0YWlucyBwbHVnaWNpZWxzIGpxdWVyeSB0b3V0IGVuIGV4Y2x1YW50IHRvdXMgbGVzIGF1dHJlcy4gU2kgY2UgcGFyYW0mZWdyYXZlO3RyZSBlc3QgciZlYWN1dGU7ZiZlYWN1dGU7cmVuYyZlYWN1dGU7LCBsZSBwYXJhbSZlZ3JhdmU7dHJlIGQmIzAzOTtleGNsdXNpb24gc2VyYSBpZ25vciZlYWN1dGU7LiAgTGVzIHZhbGV1cnMgcG9zc2libGVzIHNvbnQgdGFibGVzb3J0ZXIsIGNsdWV0aXAsIGZvcm0uJzsKJGxhbmdbJ3BhcmFtX25vX2NzcyddID0gJ1ZhbGFibGUgc2V1bGVtZW50IHBvdXIgbCYjMDM5O2FjdGlvbiBpbmNqcywgY2VjaSBlbXAmZWNpcmM7Y2hlIGxlcyBiYWxpc2VzIGNzcyBkJiMwMzk7JmVjaXJjO3RyZSBnJmVhY3V0ZTtuJmVhY3V0ZTtyJmVhY3V0ZTtlcyc7CiRsYW5nWydwYXJhbV9ub19qcyddID0gJ1ZhbGFibGUgc2V1bGVtZW50IHBvdXIgbCYjMDM5O2FjdGlvbiBpbmNqcywgY2VjaSBlbXAmZWNpcmM7Y2hlIGxlcyBiYWxpc2VzIHNjcmlwdHMgZCYjMDM5OyZlY2lyYzt0cmUgZyZlYWN1dGU7biZlYWN1dGU7ciZlYWN1dGU7ZXMnOwokbGFuZ1sncGFyYW1fbm9fcXVlcnknXSA9ICdWYWxhYmxlIHNldWxlbWVudCBwb3VyIGwmIzAzOTthY3Rpb24gaW5janMsIGNlY2kgZW1wJmVjaXJjO2NoZSBKcXVlcnkgZCYjMDM5OyZlY2lyYzt0cmUgaW5jbHV0JzsKJGxhbmdbJ3Bvc3RpbnN0YWxsJ10gPSAnTGUgbW9kdWxlIEpRdWVyeVRvb2xzIGEgJmVhY3V0ZTt0JmVhY3V0ZTsgaW5zdGFsbCZlYWN1dGU7Li4uLiBwYXNzZXogJmFncmF2ZTsgbCYjMDM5O2FjdGlvbic7CiRsYW5nWydwb3N0dW5pbnN0YWxsJ10gPSAnTGUgbW9kdWxlIEpRdWVyeVRvb2xzIGEgJmVhY3V0ZTt0JmVhY3V0ZTsgZCZlYWN1dGU7c2ludGFsbCZlYWN1dGU7JzsKJGxhbmdbJ3ByZXVuaW5zdGFsbCddID0gJ1N1cHByaW1lciBjZSBtb2R1bGUgcG91cnJhaXQgZW5kb21tYWdlciBsJiMwMzk7YXBwYXJlbmNlIGV0IGxhIGZvbmN0aW9ubmFsaXQmZWFjdXRlOyBkZSB2b3RyZSBzaXRlIHdlYi4gICZFY2lyYzt0ZXMtdm91cyBjZXJ0YWluZSBkZSB2b3Vsb2lyIHBvdXJzdWl2cmU/JzsKPz4K]]></data>
	</file>
	<file>
	  <filename>/lang/ext/hu_HU.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0pRdWVyeSBFc3prJm91bWw7enQmYWFjdXRlO3InOwokbGFuZ1snbW9kZGVzY3JpcHRpb24nXSA9ICdKcXVlcnkgZXN6ayZvdW1sO3omb3VtbDtrIHQmYWFjdXRlO3JoJmFhY3V0ZTt6YSwgYW1pIHNlZyZpYWN1dGU7dCB2b256Jm9hY3V0ZTsgJmVhY3V0ZTtzIGRpbmFtaWt1cyBDTVMgTWFkZSBTaW1wbGUgbW9kdWxvayAmZWFjdXRlO3Mgc2l0ZS1vayBrJmVhY3V0ZTtzeiZpYWN1dGU7dCZlYWN1dGU7cyZlYWN1dGU7YmVuLic7CiRsYW5nWydwYXJhbV9hY3Rpb24nXSA9ICdBZGQgbWVnIGEgbWVnaCZpYWN1dGU7dmFuZCZvYWN1dGU7IGFrY2kmb2FjdXRlO3QuIExlaGV0cyZlYWN1dGU7Z2VzICZlYWN1dGU7cnQmZWFjdXRlO2tlazo8dWw+PGxpPmluY2pzIC0gU3omdXVtbDtrcyZlYWN1dGU7Z2VzIGphdmFzY3JpcHQgZiZhYWN1dGU7amxvayBpbmNsdWRlLW9sJmFhY3V0ZTtzYS48L2xpPjxsaT5yZWFkeSAtIEFsYXAmZWFjdXRlO3J0ZWxtZXpldHQgcmVhZHkgZiZ1dW1sO2dndiZlYWN1dGU7bnkgdiZlYWN1dGU7Z3JlaGFqdCZhYWN1dGU7c2EuPC9saT48L3VsPic7CiRsYW5nWydwYXJhbV9leGNsdWRlJ10gPSAnQXBwbGljYWJsZSBvbmx5IHRvIHRoZSBpbmNqcyBhY3Rpb24sIHRoaXMgcGFyYW1ldGVyIGFsbG93cyBleGNsdWRpbmcgY2VydGFpbiBqcXVlcnkgcGx1Z2lucyBmcm9tIHRoZSBvdXRwdXQgZ2VuZXJhdGVkLiAgUG9zc2libGUgdmFsdWVzIGFyZTogdGFibGVzb3J0ZXIsY2x1ZXRpcCxmb3JtLic7CiRsYW5nWydwYXJhbV9pbmNsdWRlJ10gPSAnQXBwbGljYWJsZSBvbmx5IHRvIHRoZSBpbmNqcyBhY3Rpb24sIHRoaXMgcGFyYW1ldGVyIGFsbG93cyBleHBsaWNpdGx5IGluY2x1ZGluZyBjZXJ0YWluIGpxdWVyeSBwbHVnaW5zIHdoaWxzdCBleGNsdWRpbmcgYWxsIG90aGVycy4gIElmIHRoaXMgcGFyYW1ldGVyIGlzIHNwZWNpZmllZCwgdGhlIGV4Y2x1ZGUgcGFyYW1ldGVyIHdpbGwgYmUgaWdub3JlZC4gIFBvc3NpYmxlIHZhbHVlcyBhcmUgdGFibGVzb3J0ZXIsY2x1ZXRpcCxmb3JtLic7CiRsYW5nWydwb3N0aW5zdGFsbCddID0gJ0EgSlF1ZXJ5VG9vbHMgbW9kdWx0IHNpa2VyZXNlbiB0ZWxlcCZpYWN1dGU7dGV0dCZ1dW1sO2suLi4ga2V6ZMWRZGhldCBhIGNyYWNrLWVsJmVhY3V0ZTtzISc7CiRsYW5nWydwb3N0dW5pbnN0YWxsJ10gPSAnQSBKUXVlcnlUb29scyBtb2R1bHQgc2lrZXJlc2VuIGVsdCZhYWN1dGU7dm9sJmlhY3V0ZTt0b3R0dWsnOwokbGFuZ1sncHJldW5pbnN0YWxsJ10gPSAnRW5uZWsgYSBtb2R1bG5hayBheiBlbHQmYWFjdXRlO3ZvbCZpYWN1dGU7dCZhYWN1dGU7c2EgdCZvdW1sO25rcmV0ZWhldGkgYSBzaXRlIG1lZ2plbGVuJmVhY3V0ZTtzJmVhY3V0ZTt0IC8gZnVua2Npb25hbGl0JmFhY3V0ZTtzJmFhY3V0ZTt0LiBCaXp0b3MgZm9seXRhdG9kPyc7Cj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/lang/ext/it_IT.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0pRdWVyeSBUb29sYm94JzsKJGxhbmdbJ21vZGRlc2NyaXB0aW9uJ10gPSAnVW4ga2l0IGRpIHV0aWxpdCZhZ3JhdmU7IEpxdWVyeSBwZXIgYWl1dGFyZSBuZWxsYSBjcmVhemlvbmUgZGkgc2l0aSBlIG1vZHVsaSBDTVMgTWFkZSBTaW1wbGUgZGluYW1pY2kgZSBhY2NhdHRpdmFudGknOwokbGFuZ1sncGFyYW1fYWN0aW9uJ10gPSAnU3BlY2lmaWNhdGUgbCYjMDM5O2F6aW9uZSBkYSByaWNoaWFtYXJlLiBWYWxvcmkgcG9zc2liaWxpIHNvbm86PHVsPjxsaT5yZXF1aXJlIC0gQ29udHJhc3NlZ25hIGxlIGxpYnJlcmllIHNlbGV6aW9uYXJlIHBlciBsJiMwMzk7aW5jbHVzaW9uZSBuZWxsYSBwYWdpbmEgSFRNTC4gRmF0ZSByaWZlcmltZW50byBhbGxhIGxpc3RhIHNvdnJhc3RhbnRlIHBlciBsJiMwMzk7ZWxlbmNvIGRpIGxpYnJlcmllIGRpc3BvbmliaWxpLjwvbGk+IDxsaT5wbGFjZW1ha2VyIC0gSW5kaWNhIGxhIHBvc2l6aW9uZSBpbiBjdWkgdmVycmFubm8gaW5zZXJpdGUgbGUgbGlicmVyaWUgc2VsZXppb25hdGUgbmVsbCYjMDM5O291dHB1dCBIVE1MLjwvbGk+PGxpPmluY2pzIC0gPGVtPihkZXByZWNhdG8pPC9lbT4gSW5jbHVkZSBpIGZpbGUgamF2YXNjcmlwdCBuZWNlc3NhcmkuPC9saT48bGk+cmVhZHkgLSA8ZW0+KGRlcHJlY2F0byk8L2VtPiBJbnNlcmlzY2UgbGEgZnVuemlvbmUgcmVhZHkgcHJlZGVmaW5pdGEuPC9saT48L3VsPic7CiRsYW5nWydwYXJhbV9leGNsdWRlJ10gPSAnQXBwbGljYWJpbGUgc29sbyBhbGwmIzAzOTthemlvbmUgcGxhY2VtYXJrZXIgZSBpbmNqcywgcXVlc3RvIHBhcmFtZXRybyBwZXJtZXR0ZSBsJiMwMzk7ZXNjbHVzaW9uZSBkaSBhbGN1bmkgcGx1Z2luIGpxdWVyeSBkYWxsJiMwMzk7b3V0cHV0IGdlbmVyYXRvLiBWYWxvcmkgcG9zc2liaWxpIHNvbm86IHRhYmxlc29ydGVyLCBjbHVldGlwLCBmb3JtLic7CiRsYW5nWydwYXJhbV9saWInXSA9ICdBcHBsaWNhYmlsZSBzb2xvIGFsbCYjMDM5O2F6aW9uZSByZXF1aXJlLCBwZXJtZXR0ZSBkaSBzcGVjaWZpY2FyZSB1biYjMDM5O2VsZW5jbyBkaSBsaWJyZXJpZSBqcXVlcnkgc2VwYXJhdGUgZGEgdmlyZ29sYSBkYSBpbnN0YWxsYXJlLic7CiRsYW5nWydwYXJhbV9ub19jc3MnXSA9ICdBcHBsaWNhYmlsZSBzb2xvIGFsbCYjMDM5O2F6aW9uZSBwbGFjZW1hcmtlciBlIGluY2pzLCBlc2NsdWRlciZhZ3JhdmU7IGkgdGFnIGNzcyBkYWxsJiMwMzk7ZXNzZXJlIGVsYWJvcmF0aSBuZWxsJiMwMzk7b3V0cHV0JzsKJGxhbmdbJ3BhcmFtX25vX2NkbiddID0gJ0FwcGxpY2FiaWxlIHNvbG8gYWxsJiMwMzk7YXppb25lIHBsYWNlbWFya2VyIGUgaW5janMsIGltcGVkaXImYWdyYXZlOyBjaGUgSlF1ZXJ5VG9vbHMgdXRpbGl6emkgdW4gVVJMIENETiBwZXIgbGUgbGlicmVyaWUgamF2YXNjcmlwdCwgc2UgdmUgbmUgJmVncmF2ZTsgdW5hIGRpc3BvbmliaWxlIChub24gdHV0dGUgbGUgbGlicmVyaWUgc29ubyBkaXNwb25pYmlsaSB0cmFtaXRlIHVuIENETiknOwokbGFuZ1sncGFyYW1fbm9fanMnXSA9ICdBcHBsaWNhYmlsZSBzb2xvIGFsbCYjMDM5O2F6aW9uZSBwbGFjZW1hcmtlciBlIGluY2pzLCBlc2NsdWRlciZhZ3JhdmU7IGkgdGFnIHNjcmlwdCBkYWxsJiMwMzk7ZXNzZXJlIGVsYWJvcmF0aSBuZWxsJiMwMzk7b3V0cHV0JzsKJGxhbmdbJ3BhcmFtX25vX2pxdWVyeSddID0gJ0FwcGxpY2FiaWxlIHNvbG8gYWxsJiMwMzk7YXppb25lIHBsYWNlbWFya2VyIGUgaW5janMsIHNlcnZlIHBlciB0cmFsYXNjaWFyZSBsJiMwMzk7aW5jbHVzaW9uZSBkaSBqcXVlcnknOwokbGFuZ1sncGFyYW1fbm9fcmVhZHknXSA9ICdBcHBsaWNhYmlsZSBzb2xvIGFsbCYjMDM5O2F6aW9uZSBwbGFjZW1hcmtlciwgZXNjbHVkZXImYWdyYXZlOyBsJiMwMzk7ZXNlY3V6aW9uZSBkaSBxdWFsc2lhc2kgYXppb25lIHJlYWR5IG5lbGwmIzAzOTtvdXRwdXQuJzsKJGxhbmdbJ3Bvc3RpbnN0YWxsJ10gPSAnSWwgbW9kdWxvIEpRdWVyeVRvb2xzICZlZ3JhdmU7IHN0YXRvIGluc3RhbGxhdG8nOwokbGFuZ1sncG9zdHVuaW5zdGFsbCddID0gJ0lsIG1vZHVsbyBKUXVlcnlUb29scyAmZWdyYXZlOyBzdGF0byBkaXNpbnN0YWxsYXRvJzsKJGxhbmdbJ3ByZXVuaW5zdGFsbCddID0gJ1JpbXVvdmVyZSBxdWVzdG8gbW9kdWxvIHBvdHJlYmJlIGRhbm5lZ2dpYXJlIGwmIzAzOTthc3BldHRvIGUgbGUgZnVuemlvbmFsaXQmYWdyYXZlOyBkZWwgdm9zdHJvIHNpdG8uIFNpZXRlIGNlcnRpIGRpIHZvbGVyZSBjb250aW51YXJlPyc7Cj8+]]></data>
	</file>
	<file>
	  <filename>/lang/ext/nb_NO.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0pRdWVyeSBUb29sYm94ICc7CiRsYW5nWydtb2RkZXNjcmlwdGlvbiddID0gJ0VuIHZlcmt0Jm9zbGFzaDt5a2Fzc2UgbWVkIEpxdWVyeSB2ZXJrdCZvc2xhc2g7eSBzb20gYmlzdCZhcmluZztyIGkgb3BwcmV0dGVsc2UgYXYgZHluYW1pc2tlIG9nIGZhbmN5IENNUyBNYWRlIFNpbXBsZSBtb2R1bGVyIGdvIG5ldHRzdGVkZXInOwokbGFuZ1sncGFyYW1fYWN0aW9uJ10gPSAnU3Blc2lmaXNlciBoYW5kbGluZ2VuIHNvbSBza2FsIGthbGxlcy4gTXVsaWdlIHZlcmRpZXIgZXI6PHVsPjxsaT5pbmNqcyAtIEluY2x1ZGUgcmVxdWlyZWQgamF2YXNjcmlwdCBmaWxlcy48L2xpPjxsaT5yZWFkeSAtIE91dHB1dCBkZWZhdWx0IHJlYWR5IGZ1bmN0aW9uLjwvbGk+PC91bD4nOwokbGFuZ1sncGFyYW1fZXhjbHVkZSddID0gJ0t1biBneWxkaWcgdGlsIGluY2pzIGhhbmRsaW5nZW4uIERlbm5lIHBhcmFtZXRlcmVuIHRpbGxhdGVyICZhcmluZzsgdXRlbHVra2UgYmVzdGVtdGUganF1ZXJ5IHByb2dyYW10aWxsZWdnIGZyYSB2aXNuaW5nZW4gc29tIGdlbmVyZXJlcy4gTXVsaWdlIHZlcmRpZXIgZXI6IHRhYmxlc29ydGVyLGNsdWV0aXAsZm9ybS4nOwokbGFuZ1sncGFyYW1faW5jbHVkZSddID0gJ0t1biBneWxkaWcgdGlsIGluY2pzIGhhbmRsaW5nZW4uIERlbm5lIHBhcmFtZXRlcmVuIHRpbGFsdGVyICZhcmluZzsgZWtzcGxpc2l0dCBpbmtsdWRlcmUgYmVzdGVtdGUganF1ZXJ5IHByb2dyYW10aWxsZWdnIG9nIHV0ZWx1a2tlIGFsbGUgYW5kcmUuIE9tIGRlbm5lIHBhcmFtZXRlcmVuIGVyIHNwZXNpZmlzZXJ0LCB2aWwgZWtzbHVkZXIgcGFyYW1ldGVyZW4gYmxpIGlnbm9yZXJ0LiAgTXVsaWdlIHZlcmRpZXIgZXIgdGFibGVzb3J0ZXIsY2x1ZXRpcCxmb3JtLic7CiRsYW5nWydwYXJhbV9ub19jc3MnXSA9ICdHamVsZGVyIGt1biB0aWwgaW5janMgaGFuZGxpbmdlbiwgZGV0dGUgdmlsIGVrc2tsdWRlcmUgY3NzIGtvZGVyIGZyYSAmYXJpbmc7IGJsaSBzZW5kdCB1dCc7CiRsYW5nWydwYXJhbV9ub19qcyddID0gJ0dqZWxkZXIga3VuIHRpbCBpbmNqcyBoYW5kbGluZ2VuLCBkZXR0ZSB2aWwgZWtza2x1ZGVyZSBzY3JpcHQta29kZXIgZnJhICZhcmluZzsgYmxpIHNlbmR0IHV0JzsKJGxhbmdbJ3BhcmFtX25vX3F1ZXJ5J10gPSAnR2plbGRlciBrdW4gdGlsIGluY2pzIGhhbmRsaW5nZW4sIGRldHRlIHZpbCBla3NrbHVkZXJlIGpxdWVyeSBmcmEgJmFyaW5nOyBibGkgaW5rbHVkZXJ0JzsKJGxhbmdbJ3Bvc3RpbnN0YWxsJ10gPSAnSlF1ZXJ5VG9vbHMgbW9kdWxlbiBhaHIgYmxpdHQgaW5zdGFsbGVydC4uLi4gcHImb3NsYXNoO3YgZGVuJzsKJGxhbmdbJ3Bvc3R1bmluc3RhbGwnXSA9ICdKUXVlcnlUb29scyBtb2R1bGVuIGhhciBibGl0dCBhdmluc3RhbGxlcnQnOwokbGFuZ1sncHJldW5pbnN0YWxsJ10gPSAnJkFyaW5nOyBmamVybmUgZGVubmUgbW9kdWxlbiBrYW4gc2thZGUgb3BwZiZvc2xhc2g7cnNlbGVuIG9nIGZ1bmtzam9uYWxpdGV0ZW4gcCZhcmluZzsgZGl0dCBuZXR0c3RlZC4gRXIgZHUgc2lra2VyIHAmYXJpbmc7IGF0IGR1IHZpbCBmb3J0c2V0dGUgYXZpbnN0YWxsYXNqb25lbj8nOwo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lang/ext/nl_NL.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0pRdWVyeSBUb29sYm94ICc7CiRsYW5nWydtb2RkZXNjcmlwdGlvbiddID0gJ0VlbiB2ZXJ6YW1lbGluZyB2YW4gSnF1ZXJ5IHRvb2xzLCBhbHMgaHVscCBiaWogaGV0IGNyZSZldW1sO3JlbiB2YW4gZHluYW1pc2NoZSBlbiBkZWNvcmF0aWV2ZSBDTVMgTWFkZSBTaW1wbGUgbW9kdWxlcyBlbiB3ZWJzaXRlcyc7CiRsYW5nWydwYXJhbV9hY3Rpb24nXSA9ICdHZWVmIGRlIGJld2Vya2luZyBvcCBkaWUgbW9ldCB3b3JkZW4gYWFuZ2Vyb2VwZW4uICBNb2dlbGlqa2Ugd2FhcmRlbiB6aWpuOjx1bD48bGk+aW5janMgLSBWb2VnIGRlIGJlbm9kaWdkZSBqYXZhc2NyaXB0IGJlc3RhbmRlbiB0b2UuPC9saT48bGk+cmVhZHkgLSBVaXRnYW5nIHN0YW5kYWFyZCBnZXJlZWQgZnVuY3RpZS48L2xpPjwvdWw+JzsKJGxhbmdbJ3BhcmFtX2V4Y2x1ZGUnXSA9ICdVaXRzbHVpdGVuZCB2YW4gdG9lcGFzc2luZyBvcCBkZSBpbmNqcyBiZXdlcmtpbmcsIERlemUgcGFyYW1ldGVyIG1hYWt0IGhldCBtb2dlbGlqayBtZXQgdWl0em9uZGVyaW5nIHZhbiBiZXBhYWxkZSBqcXVlcnkgcGx1Z2lucyB1aXQgdGUgc2x1aXRlbi4gTW9nZWxpamtlIHdhYXJkZW4gemlqbjogdGFibGVzb3J0ZXIsY2x1ZXRpcCxmb3JtLic7CiRsYW5nWydwYXJhbV9pbmNsdWRlJ10gPSAnVWl0c2x1aXRlbmQgdmFuIHRvZXBhc3Npbmcgb3AgZGUgaW5janMgYmV3ZXJraW5nLCBEZXplIHBhcmFtZXRlciBtYWFrdCBoZXQgbW9nZWxpamsgbWV0IHVpdHpvbmRlcmluZyB2YW4gYmVwYWFsZGUganF1ZXJ5IHBsdWdpbnMgaW4gdGUgc2x1aXRlbiBlbiBkYWFybWVlIGFsbGUgYW5kZXJlIHBhcmFtZXRlcnMgdWl0IHRlIHNsdWl0ZW4gYWxzIGRlemUgemlqbiBvcGdlZ2V2ZW4uIE1vZ2VsaWprZSB3YWFyZGVuIHppam46IHRhYmxlc29ydGVyLGNsdWV0aXAsZm9ybS4nOwokbGFuZ1sncGFyYW1fbm9fY3NzJ10gPSAnQWxsZWVuIHRvZSB0ZSBwYXNzZW4gaW4gZGUgaW5janMgYmV3ZXJraW5nLCBkZXplIHphbCBkZSBjc3MgdGFncyB1aXRzbHVpdGVuJzsKJGxhbmdbJ3BhcmFtX25vX2pzJ10gPSAnQWxsZWVuIHRvZSB0ZSBwYXNzZW4gaW4gZGUgaW5janMgYmV3ZXJraW5nLCBkZXplIHphbCBkZSBzY3JpcHQgdGFncyB1aXRzbHVpdGVuJzsKJGxhbmdbJ3BhcmFtX25vX3F1ZXJ5J10gPSAnQWxsZWVuIHRvZSB0ZSBwYXNzZW4gaW4gZGUgaW5janMgYmV3ZXJraW5nLCBkaXQgemFsIGpxdWVyeSB1aXRzbHVpdGVuIHZhbiBpbnRlZ3JhdGllJzsKJGxhbmdbJ3Bvc3RpbnN0YWxsJ10gPSAnRGUgSlF1ZXJ5VG9vbHMgbW9kdWxlIGlzIGdlJml1bWw7bnN0YWxsZWVyZCc7CiRsYW5nWydwb3N0dW5pbnN0YWxsJ10gPSAnRGUgSlF1ZXJ5VG9vbHMgbW9kdWxlIGlzIGdlZGUmaXVtbDtuc3RhbGxlZXJkJzsKJGxhbmdbJ3ByZXVuaW5zdGFsbCddID0gJ0hldCB2ZXJ3aWpkZXJlbiB2YW4gZGV6ZSBtb2R1bGUga2FuIGRlIHZlcnRvbmluZyBlbiBkZSBmdW5jdGlvbmFsaXRlaXQgdmFuIHV3IHdlYnNpdGUgc2NoYWRlIHRvZSBicmVuZ2VuLiBXaWx0IHUgemVrZXIgZGF0IHUgd2lsdCBkb29yZ2Fhbj8nOwo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lang/ext/ro_RO.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ1Rvb2xib3ggSlF1ZXJ5JzsKJGxhbmdbJ3BhcmFtX2V4Y2x1ZGUnXSA9ICdBcGxpY2FiaWwgbnVtYWkgYWN0aXVuaWkgaW5janMsIGFjZXN0IHBhcmFtZXRydSBwZXJtaXRlIGV4Y2x1ZGVyZWEgdW5vciBwbHVnaW4tdXJpIGpxdWVyeSBkZSBsYSBvdXRwdXQtdWwgZ2VuZXJhdC4gVmFsb3JpIHBvc2liaWxlIHN1bnQ6IHRhYmxlc29ydGVyLGNsdWV0aXAsZm9ybS4nOwokbGFuZ1sncGFyYW1faW5jbHVkZSddID0gJ0FwbGljYWJpbCBudW1haSBhY3RpdW5paSBpbmNqcywgYWNlc3QgcGFyYW1ldHJ1IHBlcm1pdGUgaW5jbHVkZXJlYSBleHBsaWNpdGEgYSB1bm9yIHBsdWdpbi11cmkganF1ZXJ5IGluIHRpbXAgY2UgdG9hdGUgY2VsZWxhbHRlIHN1bnQgZXhjbHVzZS4gRGFjYSBhY2VzdCBwYXJhbWV0cnUgZXN0ZSBzcGVjaWZpY2F0LCBwYXJhbWV0cnVsIGV4Y2x1ZGUgdmEgZmkgaWdub3JhdC4gIFZhbG9yaSBwb3NpYmlsZSBzdW50OiB0YWJsZXNvcnRlcixjbHVldGlwLGZvcm0uJzsKJGxhbmdbJ3BhcmFtX25vX2NzcyddID0gJ1NlIGFwbGljYSBudW1haSBhY3RpdW5paSBpbmNqcywgdmEgZXhjbHVkZSBhZmlzYXJlYSB0YWd1cmlsb3IgY3NzJzsKJGxhbmdbJ3BhcmFtX25vX2pzJ10gPSAnU2UgYXBsaWNhIG51bWFpIGFjdGl1bmlpIGluY2pzLCB2YSBleGNsdWRlIGFmaXNhcmVhIHRhZ3VyaWxvciBzY3JvW3QnOwokbGFuZ1sncGFyYW1fbm9fcXVlcnknXSA9ICdTZSBhcGxpY2EgbnVtYWkgYWN0aXVuaWkgaW5janMsIHZhIGV4Y2x1ZGUgaW5jbHVkZXJlYSBsaWJyYXJpZWkganF1ZXJ5JzsKJGxhbmdbJ3Bvc3RpbnN0YWxsJ10gPSAnTW9kdWx1bCBKUXVlcnlUb29scyBhIGZvc3QgaW5zdGFsYXQuLi4uIGxhIHRyZWFiYSEnOwokbGFuZ1sncG9zdHVuaW5zdGFsbCddID0gJ01vZHVsdWwgSlF1ZXJ5VG9vbHMgYSBmb3N0IGRlemluc3RhbGF0JzsKJGxhbmdbJ3ByZXVuaW5zdGFsbCddID0gJ0RhY2EgaW5sYXR1cmF0aSBhY2VzdCBtb2R1bCBwdXRldGkgc3RyaWNhIGZ1bmN0aW9uYWxpdGF0ZSBzYXUgYXNwZWN0IGxlZ2F0ZSBkZSBzaXRlLiBTaWd1ciBkb3JpdGkgc2EgY29udGludWF0aT8nOwo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lang/ext/ru_RU.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ9CY0L3RgdGC0YDRg9C80LXQvdGC0LDRgNC40LkgSlF1ZXJ5JzsKJGxhbmdbJ21vZGRlc2NyaXB0aW9uJ10gPSAn0JjQvdGB0YLRgNGD0LzQtdC90YLQsNGA0LjQuSDRg9GC0LjQu9C40YLRiyBKUXVlcnkg0L/QvtC80L7QttC10YIg0LIg0YHQvtC30LTQsNC90LjQuCDQtNC40L3QsNC80LjRh9C90YvRhSDQuCDQv9GA0LjRh9GD0LTQu9C40LLRi9GFIENNUyBNYWRlIFNpbXBsZSDQvNC+0LTRg9C70LXQuSDQuCDQstC10LEg0YHQsNC50YLQvtCyJzsKJGxhbmdbJ3BhcmFtX2FjdGlvbiddID0gJ9Cj0LrQsNC20LjRgtC1INC00LXQudGB0YLQstC40LUsINC60L7RgtC+0YDQvtC1INCx0YPQtNC10YIg0LLRi9C30LLQsNC90L4uICDQktC+0LfQvNC+0LbQvdGL0LUg0LfQvdCw0YfQtdC90LjRjzo8dWw+PGxpPmluY2pzIC0g0J/QvtC00LrQu9GO0YfQsNC10Lwg0L3QtdC+0LHRhdC+0LTQuNC80YvQtSBqYXZhc2NyaXB0INGE0LDQudC70YsuPC9saT48bGk+cmVhZHkgLSBPdXRwdXQgZGVmYXVsdCByZWFkeSBmdW5jdGlvbi48L2xpPjwvdWw+JzsKJGxhbmdbJ3BhcmFtX2V4Y2x1ZGUnXSA9ICfQn9GA0LjQvNC10L3Rj9C10YLRgdGPINGC0L7Qu9GM0LrQviDQuiDQtNC10LnRgdGC0LLQuNGOIGluY2pzLCDRjdGC0L7RgiDQv9Cw0YDQsNC80LXRgtGAINC/0L7Qt9Cy0L7Qu9GP0LXRgiDQuNGB0LrQu9GO0YfQuNGC0Ywg0L3QtdC60L7RgtC+0YDRi9C1INC/0LvQsNCz0LjQvdGLIGpxdWVyeSDQs9C10L3QtdGA0LjRgNGD0LXQvNGL0LUg0L3QsCDQstGL0YXQvtC00LUuICDQktC+0LfQvNC+0LbQvdGL0LUg0LfQvdCw0YfQtdC90LjRjzogdGFibGVzb3J0ZXIsY2x1ZXRpcCxmb3JtLic7CiRsYW5nWydwYXJhbV9saWInXSA9ICfQn9GA0LjQvNC10L3Rj9C10YLRgdGPINGC0L7Qu9GM0LrQviDQuiDRgtGA0LXQsdGD0LXQvNC+0LzRgyDQtNC10LnRgdGC0LLQuNGOLCDRjdGC0L7RgiDQv9Cw0YDQsNC80LXRgtGAINC/0L7Qt9Cy0L7Qu9GP0LXRgiDQt9Cw0LTQsNGC0Ywg0YHQv9C40YHQvtC6INGA0LDQt9C00LXQu9C10L3QvdGL0YUg0LfQsNC/0Y/RgtGL0LzQuCBKUXVlcnkg0LHQuNCx0LvQuNC+0YLQtdC6INC00LvRjyDRg9GB0YLQsNC90L7QstC60LguJzsKJGxhbmdbJ3BhcmFtX25vX2NzcyddID0gJ9Cf0YDQuNC80LXQvdGP0LXRgtGB0Y8g0YLQvtC70YzQutC+INC6INC00LXQudGB0YLQstC40Y4gaW5janMsINC40YHQutC70Y7Rh9Cw0LXRgiBjc3Mg0YLQtdCz0Lgg0LjQtyDQstGL0YXQvtC00LAnOwokbGFuZ1sncGFyYW1fbm9fY2RuJ10gPSAnQXBwbGljYWJsZSBvbmx5IHRvIHRoZSBwbGFjZW1hcmtlciBhbmQgaW5janMgYWN0aW9ucywgdGhpcyB3aWxsIHByZXZlbnQgSlF1ZXJ5VG9vbHMgZnJvbSB1c2luZyBhIENETiBVUkwgZm9yIHRoZSBqYXZhc2NyaXB0IGxpYnJhcmllcywgaWYgb25lIGlzIGF2YWlsYWJsZSAobm90IGFsbCBsaWJyYXJpZXMgYXJlIGF2YWlsYWJsZSBieSBhIENETic7CiRsYW5nWydwYXJhbV9ub19qcyddID0gJ9Cf0YDQuNC80LXQvdGP0LXRgtGB0Y8g0YLQvtC70YzQutC+INC6INC00LXQudGB0YLQstC40Y4gaW5janMsINC40YHQutC70Y7Rh9Cw0LXRgiBzY3JpcHQg0YLQtdCz0Lgg0LjQtyDQstGL0YXQvtC00LAnOwokbGFuZ1sncGFyYW1fbm9fanF1ZXJ5J10gPSAnQXBwbGljYWJsZSBvbmx5IHRvIHRoZSBwbGFjZW1hcmtlciBhbmQgaW5janMgYWN0aW9ucywgdGhpcyB3aWxsIGV4Y2x1ZGUganF1ZXJ5IGZyb20gYmVpbmcgaW5jbHVkZWQnOwokbGFuZ1sncG9zdGluc3RhbGwnXSA9ICfQnNC+0LTRg9C70YwgSlF1ZXJ5VG9vbHMg0LHRi9C7INGD0YHRgtCw0L3QvtCy0LvQtdC9JzsKJGxhbmdbJ3Bvc3R1bmluc3RhbGwnXSA9ICfQnNC+0LTRg9C70YwgSlF1ZXJ5VG9vbHMg0LHRi9C7INGD0LTQsNC70LXQvSc7CiRsYW5nWydwcmV1bmluc3RhbGwnXSA9ICfQo9C00LDQu9C10L3QuNC1INC80L7QtNGD0LvRjyDQvNC+0LbQtdGCINC/0L7QstGA0LXQtNC40YLRjCDQstC90LXRiNC90LjQuSDQstC40LQg0Lgg0YTRg9C90LrRhtC40L7QvdCw0LvRjNC90L7RgdGC0Ywg0LLQsNGI0LXQs9C+INGB0LDQudGC0LAuINCS0Ysg0YPQstC10YDQtdC90YssINGH0YLQviDRhdC+0YLQuNGC0LUg0L/RgNC+0LTQvtC70LbQuNGC0Yw/JzsKJGxhbmdbJ3V0bXonXSA9ICcxNTY4NjEzNTMuMTM1NzY5NTM1Mi4xLjEudXRtY2NuPShkaXJlY3QpfHV0bWNzcj0oZGlyZWN0KXx1dG1jbWQ9KG5vbmUpJzsKJGxhbmdbJ3V0bWEnXSA9ICcxNTY4NjEzNTMuMjExMDAxNDgyMC4xMzU3Njk1MzUyLjEzNTc3MzAyMzIuMTM1Nzc1MjQyNC41JzsKJGxhbmdbJ3V0bWMnXSA9ICcxNTY4NjEzNTMnOwokbGFuZ1sndXRtYiddID0gJzE1Njg2MTM1Myc7Cj8+]]></data>
	</file>
	<file>
	  <filename>/lang/ext/sr_YU.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0pRdWVyeSBhbGF0aSc7CiRsYW5nWydtb2RkZXNjcmlwdGlvbiddID0gJ1NrdXAgcG9tb8SHbmloIGpRdWVyeSBhbGF0YSBrb2ppIHRyZWJhIGRhIHByaXBvbW9nbnUga3JlaXJhbmplIGRpbmFtacSNbmloIGkgbW9kZXJuaWggQ01TIE1hZGUgU2ltcGxlIG1vZHVsYSBpIHNhanRvdmEnOwokbGFuZ1sncGFyYW1fYWN0aW9uJ10gPSAnU3BlY2lmeSB0aGUgYWN0aW9uIHRvIGJlIGNhbGxlZC4gIFBvc3NpYmxlIHZhbHVlcyBhcmU6PHVsPjxsaT5pbmNqcyAtIEluY2x1ZGUgcmVxdWlyZWQgamF2YXNjcmlwdCBmaWxlcy48L2xpPjxsaT5yZWFkeSAtIE91dHB1dCBkZWZhdWx0IHJlYWR5IGZ1bmN0aW9uLjwvbGk+PC91bD4nOwokbGFuZ1sncGFyYW1fZXhjbHVkZSddID0gJ0FwcGxpY2FibGUgb25seSB0byB0aGUgaW5janMgYWN0aW9uLCB0aGlzIHBhcmFtZXRlciBhbGxvd3MgZXhjbHVkaW5nIGNlcnRhaW4ganF1ZXJ5IHBsdWdpbnMgZnJvbSB0aGUgb3V0cHV0IGdlbmVyYXRlZC4gIFBvc3NpYmxlIHZhbHVlcyBhcmU6IHRhYmxlc29ydGVyLGNsdWV0aXAsZm9ybS4nOwokbGFuZ1sncGFyYW1faW5jbHVkZSddID0gJ0FwcGxpY2FibGUgb25seSB0byB0aGUgaW5janMgYWN0aW9uLCB0aGlzIHBhcmFtZXRlciBhbGxvd3MgZXhwbGljaXRseSBpbmNsdWRpbmcgY2VydGFpbiBqcXVlcnkgcGx1Z2lucyB3aGlsc3QgZXhjbHVkaW5nIGFsbCBvdGhlcnMuICBJZiB0aGlzIHBhcmFtZXRlciBpcyBzcGVjaWZpZWQsIHRoZSBleGNsdWRlIHBhcmFtZXRlciB3aWxsIGJlIGlnbm9yZWQuICBQb3NzaWJsZSB2YWx1ZXMgYXJlIHRhYmxlc29ydGVyLGNsdWV0aXAsZm9ybS4nOwokbGFuZ1sncGFyYW1fbm9fY3NzJ10gPSAnQXBwbGljYWJsZSBvbmx5IHRvIHRoZSBpbmNqcyBhY3Rpb24sIHRoaXMgd2lsbCBleGNsdWRlIGNzcyB0YWdzIGZyb20gYmVpbmcgb3V0cHV0JzsKJGxhbmdbJ3BhcmFtX25vX2pzJ10gPSAnQXBwbGljYWJsZSBvbmx5IHRvIHRoZSBpbmNqcyBhY3Rpb24sIHRoaXMgd2lsbCBleGNsdWRlIHNjcmlwdCB0YWdzIGZyb20gYmVpbmcgb3V0cHV0JzsKJGxhbmdbJ3BhcmFtX25vX3F1ZXJ5J10gPSAnQXBwbGljYWJsZSBvbmx5IHRvIHRoZSBpbmNqcyBhY3Rpb24sIHRoaXMgd2lsbCBleGNsdWRlIGpxdWVyeSBmcm9tIGJlaW5nIGluY2x1ZGVkJzsKJGxhbmdbJ3Bvc3RpbnN0YWxsJ10gPSAnSlF1ZXJ5VG9vbHMgbW9kdWwgamUgaW5zdGFsaXJhbic7CiRsYW5nWydwb3N0dW5pbnN0YWxsJ10gPSAnSlF1ZXJ5VG9vbHMgbW9kdWwgamUgZGVpbnN0YWxpcmFuJzsKJGxhbmdbJ3ByZXVuaW5zdGFsbCddID0gJ0JyaXNhbmplIG92b2cgbW9kdWxhIG1vxb5lIG5hJnNjYXJvbjtrb2RpdGkgaXpnbGVkdSBpIGZ1bmtjaW9uYWxub3N0aSBWYSZzY2Fyb247ZWcgc2FqdGEuIERhIGxpIHN0ZSBzaWd1cm5pIGRhIMW+ZWxpdGUgbmFzdGF2aXRpPyc7Cj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/lang/ext/sv_SE.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0pRdWVyeS1Ub29sYm94JzsKJGxhbmdbJ21vZGRlc2NyaXB0aW9uJ10gPSAnRW4gdmVya3R5Z3NsJmFyaW5nO2RhIHRpbGwgSnF1ZXJ5IGYmb3VtbDtyIGF0dCBza2FwYSBkeW5hbWlza2Egb2NoIHZhY2tyYSBDTVMgTWFkZSBTaW1wbGUgbW9kdWxlciBvY2ggd2ViYnBsYXRzZXInOwokbGFuZ1sncGFyYW1fYWN0aW9uJ10gPSAnQW5nZSB2aWxrYSAmYXJpbmc7dGcmYXVtbDtyZGVyIHNvbSBza2FsbCBrYWxsYXMuIE0mb3VtbDtqbGlnYSB2JmF1bWw7cmRlbiAmYXVtbDtyOiA8dWw+IDxsaT4gaW5janMgLSBJbmtsdWRlcmluZyBrciZhdW1sO3ZzIGYmb3VtbDtyIGphdmFzY3JpcHQgZmlsZXIuIDwvIExpPiA8bGk+IHJlZG8gLSBSZXN1bHRhdHN0YW5kYXJkcyBmdW5rdGlvbi4gPC8gTGk+IDwvIHVsPic7CiRsYW5nWydwYXJhbV9leGNsdWRlJ10gPSAnQXBwbGljYWJsZSBvbmx5IHRvIHRoZSBpbmNqcyBhY3Rpb24sIHRoaXMgcGFyYW1ldGVyIGFsbG93cyBleGNsdWRpbmcgY2VydGFpbiBqcXVlcnkgcGx1Z2lucyBmcm9tIHRoZSBvdXRwdXQgZ2VuZXJhdGVkLiAgUG9zc2libGUgdmFsdWVzIGFyZTogdGFibGVzb3J0ZXIsY2x1ZXRpcCxmb3JtLic7CiRsYW5nWydwYXJhbV9pbmNsdWRlJ10gPSAnQXBwbGljYWJsZSBvbmx5IHRvIHRoZSBpbmNqcyBhY3Rpb24sIHRoaXMgcGFyYW1ldGVyIGFsbG93cyBleHBsaWNpdGx5IGluY2x1ZGluZyBjZXJ0YWluIGpxdWVyeSBwbHVnaW5zIHdoaWxzdCBleGNsdWRpbmcgYWxsIG90aGVycy4gIElmIHRoaXMgcGFyYW1ldGVyIGlzIHNwZWNpZmllZCwgdGhlIGV4Y2x1ZGUgcGFyYW1ldGVyIHdpbGwgYmUgaWdub3JlZC4gIFBvc3NpYmxlIHZhbHVlcyBhcmUgdGFibGVzb3J0ZXIsY2x1ZXRpcCxmb3JtLic7CiRsYW5nWydwb3N0aW5zdGFsbCddID0gJ0pRdWVyeVRvb2xzIG1vZHVsZW4gJmF1bWw7ciBudSBpbnN0YWxsZXJhZCEnOwokbGFuZ1sncG9zdHVuaW5zdGFsbCddID0gJ0pRdWVyeVRvb2xzIG1vZHVsZW4gJmF1bWw7ciBudSBhdmluc3RhbGxlcmFkISc7CiRsYW5nWydwcmV1bmluc3RhbGwnXSA9ICdCb3J0dGFnbmluZyBhdiBkZW4gaCZhdW1sO3IgbW9kdWxlbiBrYW4gc2thZGEgdXRzZWVuZGV0IG9jaCBmdW5rdGlvbmFsaXRldGVuIHAmYXJpbmc7IGRpbiB3ZWJicGxhdHMuICZBdW1sO3IgZHUgcyZhdW1sO2tlciBwJmFyaW5nOyBhdHQgZHUgdmlsbCBmb3J0cyZhdW1sO3R0YT8nOwo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/cgform.lib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/cgform.lib/info.dat</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGluZm9bJ2pzJ10gPSAnanF1ZXJ5LmNnZm9ybS5qcyc7CiRpbmZvWydkZXBlbmRzJ10gPSAnanF1ZXJ5JzsKPz4K]]></data>
	</file>
	<file>
	  <filename>/lib/cgform.lib/jquery.cgform.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKCQpewogICQuZm4ucGFyc2Vfc2VyaWFsaXplZCA9IGZ1bmN0aW9uKGRhdGEpICB7CiAgICB2YXIgcGFybXM9ZGF0YS5yZXBsYWNlKC9hbXA7L2csJycpOwogICAgaWYoIGRhdGEubWF0Y2goL1w/KC4rKSQvKSApIHsKICAgICAgcGFybXMgPSBSZWdFeHAuJDE7CiAgICB9CiAgICB2YXIgcEFyciA9IHBhcm1zLnNwbGl0KCcmJyk7CiAgICB2YXIgcEhhc2ggPSB7fTsKICAgIGZvciggdmFyIGkgPSAwOyBpIDwgcEFyci5sZW5ndGg7IGkrKyApIHsKICAgICAgdmFyIHRtcCA9IHBBcnJbaV0uc3BsaXQoJz0nKTsKICAgICAgcEhhc2hbdG1wWzBdXSA9IHVuZXNjYXBlKHRtcFsxXSk7CiAgICB9CiAgICByZXR1cm4gcEhhc2g7CiAgfQoKCiAgJC5mbi5mb3JtX3BvcHVsYXRlID0gZnVuY3Rpb24oZGF0YSkgewogICAgdmFyIGNvbnRhaW5lciA9ICQodGhpcyk7CiAgICAkLmVhY2goZGF0YSwgZnVuY3Rpb24obmFtZSx2YWx1ZSkgewogICAgICB2YXIgZXhwciA9ICI6aW5wdXRbbmFtZT0nIituYW1lKyInXTpub3QoOmJ1dHRvbiw6cmVzZXQsOnN1Ym1pdCw6aW1hZ2UpIjsKICAgICAgdmFyIGlucHV0ID0gY29udGFpbmVyLmZpbmQoZXhwcik7CiAgICAgIGlucHV0LnZhbCggKCEkLmlzQXJyYXkodmFsdWUpICYmIChpbnB1dC5pcygnOmNoZWNrYm94OicpIHx8IGlucHV0LmlzKCc6cmFkaW8nKSkpID8gW3ZhbHVlXSA6IHZhbHVlICk7CiAgICB9KTsKICB9OwoKCiAgJC5mbi5mb3JtX3BvcHVsYXRlX3NlcmlhbGl6ZWQgPSBmdW5jdGlvbihkYXRhKSB7CiAgICB2YXIgdG1wID0gJCh0aGlzKS5wYXJzZV9zZXJpYWxpemVkKGRhdGEpOwogICAgJCh0aGlzKS5mb3JtX3BvcHVsYXRlKHRtcCk7CiAgfTsKCgogICQuZm4uc2VyaWFsaXplQW55dGhpbmcgPSBmdW5jdGlvbigpIHsKICAgIHZhciB0b1JldHVybiAgICA9IFtdOwogICAgdmFyIGVscyAgICAgICAgID0gJCh0aGlzKS5maW5kKCc6aW5wdXQnKS5nZXQoKTsKICAgICQuZWFjaChlbHMsIGZ1bmN0aW9uKCkgewogICAgICBpZiAodGhpcy5uYW1lICYmICF0aGlzLmRpc2FibGVkICYmICh0aGlzLmNoZWNrZWQgfHwgL3NlbGVjdHx0ZXh0YXJlYS9pLnRlc3QodGhpcy5ub2RlTmFtZSkgfHwgL3RleHR8aGlkZGVufHBhc3N3b3JkL2kudGVzdCh0aGlzLnR5cGUpKSkgewogICAgICAgIHZhciB2YWwgPSAkKHRoaXMpLnZhbCgpOwogICAgICAgIHRvUmV0dXJuLnB1c2goIGVuY29kZVVSSUNvbXBvbmVudCh0aGlzLm5hbWUpICsgIj0iICsgZW5jb2RlVVJJQ29tcG9uZW50KCB2YWwgKSApOwogICAgICB9CiAgICB9KTsKICAgIHJldHVybiB0b1JldHVybi5qb2luKCImIikucmVwbGFjZSgvJTIwL2csICIgIik7CiAgfTsKCgogICQuZm4uZm9ybV9nZXRfZGF0ZXRpbWUgPSBmdW5jdGlvbihwcmVmaXgsZG9fdGltZSkgewogICAgZG9fdGltZSA9IHR5cGVvZihkb190aW1lKSAhPSAndW5kZWZpbmVkJyA/IGRvX3RpbWUgOiAwOwogICAgCiAgICB2YXIga2V5ID0gIjppbnB1dFtuYW1lPSciK3ByZWZpeCsiWWVhciddIjsKICAgIHZhciB5ZWFyID0gdGhpcy5maW5kKGtleSkudmFsKCk7CiAgICB2YXIgbW9udGggPSB0aGlzLmZpbmQoIjppbnB1dFtuYW1lPSciK3ByZWZpeCsiTW9udGgnXSIpLnZhbCgpOwogICAgdmFyIGRheSA9IHRoaXMuZmluZCgiOmlucHV0W25hbWU9JyIrcHJlZml4KyJEYXknXSIpLnZhbCgpOwogICAgdmFyIHN0ciA9IG1vbnRoKycvJytkYXkrJy8nK3llYXI7CiAgICB2YXIgaG91ciA9IDA7CiAgICB2YXIgbWludXRlID0gMDsKICAgCiAgICBpZiggZG9fdGltZSApCiAgICAgIHsKCXZhciBob3VyID0gdGhpcy5maW5kKCI6aW5wdXRbbmFtZT0nIitwcmVmaXgrIkhvdXInXSIpLnZhbCgpOwoJdmFyIG1pbnV0ZSA9IHRoaXMuZmluZCgiOmlucHV0W25hbWU9JyIrcHJlZml4KyJNaW51dGUnXSIpLnZhbCgpOwogICAgICAgIHN0ciArPSAnICcraG91cisnOicrbWludXRlKyc6MDAnOwogICAgICB9CiAgICByZXR1cm4gc3RyOwogIH07CgoKICAkLmZuLmZvcm1fc2V0X2RhdGV0aW1lID0gZnVuY3Rpb24oaW5fZGF0ZSxwcmVmaXgsZG9fdGltZSkgewogICAgZG9fdGltZSA9IHR5cGVvZihkb190aW1lKSAhPSAndW5kZWZpbmVkJyA/IGRvX3RpbWUgOiAwOwogCiAgICB2YXIgemVyb3BhZCA9IGZ1bmN0aW9uKG51bSxsZW4pCiAgICB7CiAgICAgIHZhciByZXMgPSBudW0udG9TdHJpbmcoKTsKICAgICAgd2hpbGUoIHJlcy5sZW5ndGggPCBsZW4gKQoJewoJICByZXMgPSAnMCcrcmVzOwoJfQogICAgICByZXR1cm4gcmVzOwogICAgfQoKICAgIHZhciBkYXRlID0gJyc7CiAgICB2YXIgdG1wID0gcGFyc2VJbnQoaW5fZGF0ZSk7CiAgICBpZiggdG1wID4gMCApCiAgICAgIHsKICAgICAgICBkYXRlID0gbmV3IERhdGUodG1wICogMTAwMCk7CiAgICAgIH0KICAgIGVsc2UKICAgICAgewogICAgICAgIGRhdGUgPSBuZXcgRGF0ZShpbl9kYXRlKTsKICAgICAgfQoKICAgIHRoaXMuZmluZCgiOmlucHV0W25hbWU9JyIrcHJlZml4KyJZZWFyJ10iKS52YWwoZGF0ZS5nZXRGdWxsWWVhcigpKTsKICAgIHRoaXMuZmluZCgiOmlucHV0W25hbWU9JyIrcHJlZml4KyJNb250aCddIikudmFsKHplcm9wYWQoZGF0ZS5nZXRNb250aCgpKzEsMikpOwogICAgdGhpcy5maW5kKCI6aW5wdXRbbmFtZT0nIitwcmVmaXgrIkRheSddIikudmFsKGRhdGUuZ2V0RGF0ZSgpKTsKICAgIGlmKCBkb190aW1lICkKICAgIHsKICAgICAgdGhpcy5maW5kKCI6aW5wdXRbbmFtZT0nIitwcmVmaXgrIkhvdXInXSIpLnZhbChkYXRlLmdldEhvdXJzKCkpOwogICAgICB0aGlzLmZpbmQoIjppbnB1dFtuYW1lPSciK3ByZWZpeCsiTWludXRlJ10iKS52YWwoZGF0ZS5nZXRNaW51dGVzKCkpOwogICAgfQoKICB9Owp9KShqUXVlcnkpCg==]]></data>
	</file>
	<file>
	  <filename>/lib/class.datepicker_plugin.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCm5hbWVzcGFjZSBKUXVlcnlUb29sczsKCmZpbmFsIGNsYXNzIGRhdGVwaWNrZXJfcGx1Z2luCnsKICAgIHByaXZhdGUgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKSB7fQoKICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIF9nZXRfbG9jYWxlSW5mbygpCiAgICB7CiAgICAgICAgJG91dCA9IGFycmF5KCk7CiAgICAgICAgJG91dCA9IGFycmF5KCk7CiAgICAgICAgJG91dFsnbW9udGhOYW1lcyddID0gYXJyYXkoKTsKICAgICAgICAkb3V0Wydtb250aE5hbWVzU2hvcnQnXSA9IGFycmF5KCk7CiAgICAgICAgZm9yKCAkaSA9IDA7ICRpIDwgMTI7ICRpKysgKSB7CiAgICAgICAgICAgICRvdXRbJ21vbnRoTmFtZXMnXVtdID0gc3RyZnRpbWUoJyVCJyxta3RpbWUoMSwwLDAsJGkrMSwxLDIwMDApKTsKICAgICAgICAgICAgJG91dFsnbW9udGhOYW1lc1Nob3J0J11bXSA9IHN0cmZ0aW1lKCclYicsbWt0aW1lKDEsMCwwLCRpKzEsMSwyMDAwKSk7CiAgICAgICAgfQoKICAgICAgICAkZm10ID0gJ2xhc3Qgc3VuZGF5ICsgJWQgZGF5cyc7CiAgICAgICAgJG91dFsnZGF5TmFtZXMnXSA9IGFycmF5KCk7CiAgICAgICAgJG91dFsnZGF5TmFtZXNTaG9ydCddID0gYXJyYXkoKTsKICAgICAgICAkY3VyZGF5ID0gKGludClkYXRlKCd3Jyk7CiAgICAgICAgZm9yKCAkaSA9IDA7ICRpIDwgNzsgJGkrKyApIHsKICAgICAgICAgICAgJG91dFsnZGF5TmFtZXMnXVtdID0gc3RyZnRpbWUoJyVBJyxzdHJ0b3RpbWUoc3ByaW50ZigkZm10LCRpKSkpOwogICAgICAgICAgICAkb3V0WydkYXlOYW1lc1Nob3J0J11bXSA9IHN0cmZ0aW1lKCclYScsc3RydG90aW1lKHNwcmludGYoJGZtdCwkaSkpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRvdXQ7CiAgICB9CgogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBsb2FkKCRsaWJuYW1lKQogICAgewogICAgICAgIGlmKCAkbGlibmFtZSAhPSAnY2dfZGF0ZXBpY2tlcicgKSByZXR1cm47CgogICAgICAgIC8vIGdvdHRhIHJldHVybiBjb2RlCiAgICAgICAgJG1vZCA9IFxjbXNfdXRpbHM6OmdldF9tb2R1bGUoJ0pRdWVyeVRvb2xzJyk7CiAgICAgICAgJGNvbmZpZyA9IGNtc21zKCktPkdldENvbmZpZygpOwogICAgICAgICRzbWFydHkgPSBjbXNtcygpLT5HZXRTbWFydHkoKTsKICAgICAgICAkc21hcnR5LT5hc3NpZ24oJ21vZCcsJG1vZCk7CiAgICAgICAgJHNtYXJ0eS0+YXNzaWduKCdjb25maWcnLCRjb25maWcpOwogICAgICAgICRzbWFydHktPmFzc2lnbignbG9jYWxlSW5mbycsc2VsZjo6X2dldF9sb2NhbGVJbmZvKCkpOwogICAgICAgICRkYXRlZm9ybWF0ID0gJ2RkL21tL3l5JzsKICAgICAgICBpZiggXENtc05sc09wZXJhdGlvbnM6OmdldF9jdXJyZW50X2xhbmd1YWdlKCkgPT0gJ2VuX1VTJyApIHsKICAgICAgICAgICAgJGRhdGVmb3JtYXQgPSAnbW0vZGQveXknOwogICAgICAgIH0KICAgICAgICAkc21hcnR5LT5hc3NpZ24oJ2RhdGVmb3JtYXQnLCRkYXRlZm9ybWF0KTsKICAgICAgICAkY29kZSA9ICRtb2QtPlByb2Nlc3NUZW1wbGF0ZSgnZGF0ZXBpY2tlcl9wbHVnaW4uanMnKTsKICAgICAgICAkb2JqID0gbmV3IFxTdGRDbGFzczsKICAgICAgICAkb2JqLT5jb2RlID0gJGNvZGU7CiAgICAgICAgcmV0dXJuICRvYmo7CiAgICB9Cn0KPz4=]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/changelog.md</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[CjEuMi4yIC8gMjAxMS0wOS0wMQo9PT09PT09PT09PT09PT09PT0KCiAgKiBmaXggdHlwbyB3aGVuIGNoZWNraW5nIGluZGV4T2Y7IHJlbW92ZSBib3gtc2hhZG93IGlubGluZSBzdHlsZSB3aGVuIGRyb3BTaGFkb3cgb3B0aW9uIGlzIGZhbHNlIG9yIGRyb3BTaGFkb3dTdGVwcyBpcyAwLgogICogb25seSBzaGlmdCBvZmYgaGVhZGluZyBvZiB0aXBQYXJ0cyBpZiBvcHRzLnNob3dUaXRsZSBpcyB0cnVlLiBmaXhlcyAjNTUKICAqIHRyaXZpYWwgY2xlYW51cAo=]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/images/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/images/arrowdown.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhFgALAIABAMzMzP///yH5BAEAAAEALAAAAAAWAAsAAAIchI+pEOsZ4nuxTlXzPbnvDk7g6IwmZp5cmhpsAQA7]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/images/arrowleft.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhCwAWAIABAMzMzP///yH5BAEAAAEALAAAAAALABYAAAIjjI+AC7rWHIsvtmmTvXBzT4HiKAZkBx6l6mGUK2lcNdNPUgAAOw==]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/images/arrowright.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhCwAWAIABAMzMzP///yH5BAEAAAEALAAAAAALABYAAAIkRI4JlrqN1oNyutqqvDrqHXyYSJZkeKKf17Ggy3CQOqN1eAcFADs=]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/images/arrowup.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhFgALAPcBAMzMzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAEALAAAAAAWAAsAAAgyAAMIHEgQAACCCBMWNHhQocMADBk+TBgx4sSBFStezJjxIUeOCj9+RChSJMaSJlGiDAgAOw==]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/images/bl.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhzwPJA/eVAKzG16zI2qm3vaa7xqa2vq3J26nBzazI2avE06/K27XO3ejv8rnR38TY4rHM3L7V4KS3wMnb46zJ2qW3wMrc5K3I2b/V4bLN3K/L26vD07rS38TZ4rjQ3rbP3qq4vazF067K27XP3cXZ46rBzbDL3LLM3Ke7x+jv8ePp666/yLTL2fT296zI2K/J2rrM1LXHz8HV3rjL1bPGz6i3vrLCyPj5+rHL2rLJ1aq5v8jZ4MrW2q28w8fW3LbN2bXDyK/I2Ke3vrfQ3qq3vb7Q19bc3rrGy8rb4rHJ2LPN3crb4a+7wPP19qvBzrDH1efu8ai8x7S/w7nO2qW4wK7I2bHFz6y/yKa4wai/zMXQ1Ke5wbXK1sTY4avF1rzP2LvT37DAyP7+/qi5wam4vsDT3LnQ3LzM0q7Dzsvc5L3L0MbY4fX4+K3CzrTO3aa3vr3S3bbO26a6xqW2vbnHzcDJzarD0q3F067H16i6wrTM28PU2+rv8ay6wK3K263F1Kq+x63H17rGysDQ1sDW4bK/xK67wOft8MXX38XT2bvS3+bt773T3s3V2MHW4au4vau7w/Hz9LfHzqi9x6nAza++xKvI2v///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAJUALAAAAADPA8kDAAj/ABecEWFBQ4cLGAoEoMSwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmTKFOqXMmypcuXMGPKnEmzZscFFDZYYBCiRIICNoMKHUq0qNGjSJMqXcq0qdOnUKN+xNngAQMFDn5K3cq1q9evYMOKHUu2rNmzERdEqHo1K1C0cOPKnUu3rt27ePOaVcsWq1a9gAMLHky4sOHDiI3yter3beLHkCNLnky5suWli9v+vcy5s+fPoEOLBpy58ejTqFOrXs26NcnSbl3Lnk27tu3bg2Fvxs27t+/fwIPH1O1YuPHjyJMr9018ufPn0KNLh9x8uvXr2LNrl1p9u/fv4MOL/x/Zfbz58+jTay+vvr379/Bts49Pv779+5Ln49/Pv7//s/r9J+CABBZYVIAGJqjgggyGhGCDEEYoIYQPTmjhhRjeV2GGHHboIXgbfijiiCQmF2KJKKaoomwnrujiizBe1mKMNNZoY2Az3qjjjjySlWOPQAYpJGZrMRbbkEgmqSSRfR255JNQRgnTj1JWaeWVEFGJ5ZZcLqlll2CGueOXYpZp5opknqnmmh2myeabcDboZpx01vnfnHbmqWd8eO7p55/j9QnooIReJ2ihiCZqYpGaFafoo5B6d2iklFba2qSWZqopaJhu6umn+TFqGqiklupap6amqmpdqK7q6qs+iv/qJKy01lpYq7bmqmtSuO7q66819QrssMSuJGyxyCbroKy7Kevss0MdC+201DokbbXYPnttttwWu2234Pr6bbjk1jpuueiuem667JK6brvwavpuvPRGOm+9+CJ6b778/rlvvwDb+W/ABL85cMEIm3lwwgx3uXDDEFv5cMQUPzlxxRgPeXHGHPO4cccg1/hxyCS7OHLJKJd4csose7hyyzBf+HLMNFPIrKM15yzmzDr3PCDPPgfNH9BCF10f0UYn7R7SSjd9HtNORw3izVJX7THVVmctMtZad20y116HrTLYYpftMtlmpy0z2mq3bXOTzbot94JQz203a3Xfrfdpee//7fdnff8tuGWBD254ZIUfrvhhiS/uuGCNPy45XpFPbvlclV+uOYBsb+75cpl/LrpXoY9uelSln646U6mv7vpRrb8uu1Cxz277TLXfrrtLue/ue0q9/y78a50Pb3yocON8/PLUFc/884QFD/30E0lP/fXWOo/99nJZzz313n8PffjiM09++cefj/7w6q//e/vu7w5//LfPT//s9t//ev76r85//6f7HwBHJ8ABfq6ABtwcAhN4uQUycHIOfODjIijBxVGwgoe7IAYHp8EN/q2DHtwbCEN4txGScG4mPKHbUqhCtbGwhWZ7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t67Zt2cauCSDuNg1uIQ7m4ZLpooLMpG7XYzbuLqpt5bLFZPLMZvrXZWbuVv2uF/auRhDuuH1uaDrZZibulBhuhTjuuSFuqyrnKLLpbALMbd7XrI7u9G5urxLpLv7u/fqu8LrpMFbvM1DvMhLpce7vAqrvM6rpc0bve4JvdT7bbWbpbnLMNurXtN7vR//a73gi6biO75rWr7m66bZa6XdizDtK2Iplr6hi77yG2/rO6XvSzD5W2LxW7/Feb9QShXf6791cQI5wRg+0WEELBknEAEEoQEhgBAKscCc4QRG0AAFcRAJsRAUbBmFkARbIAheEARIQAJ8IAEdbBmJkANpwAiIwAFs4AAgMMEpPBl6wAOGAAOKwAEKcAEkMMMSEMQSEABEXMRGfMRInMRKvMRM3MRO/MRQHMVSPMVUXMVWfMVYnMVavMVc3MVe/MVgHMZiPMZkXMZmfMZonMZqvMZs3MZNLMRqcAh5MAZuQAZvgAc20AJTUAF8fAB+/MeAHMiCPMiEXMiGfMiInMiK/7zIjNzIjvzIkBzJkjzJlFzJlnzJmJzJmrzJnNzJnvzJoBzKojzKpFzKpnzKiVwBLFAJOhAIQ9AFUdADKnAEP2AHfwAAuJzLurzLvNzLvvzLwBzMwjzMxFzMxnzMyJzMyrzMzNzMzvzM0BzN0jzN1FzN1nzN2JzN2rzN3NzN3vzN4BzOxswFlYACaFAGLhADWnADTdAHdfABH4AA8jzP9FzP9nzP+JzP+rzP/NzP/vzPAB3QAj3QBF3QBn3QCJ3QCr3QDN3QDv3QEB3REj3RFF3RFn3RGJ3RGr3R/JwBHk0HlQAGWCAHkPACMkAFZrAGTDACI2AALv3SMB3TMj3TNP9d0zZ90zid0zq90zzd0z7900Ad1EI91ERd1EZ91Eid1Eq91Ezd1E791FAd1VI91VRd1VZ91TotCVdQCZWwAkXgAzTwBSlQBX4QCU9gAiYwAGq91mzd1m791nAd13I913Rd13Z913id13q913zd137914Ad2II92IRd2IZ92Iid2Iq92Izd2I792JAd2ZI92XYNB1xdCY8ACIMwCTvgCHcQBllgBRMw2hMAAaZ92qid2qq92qzd2q792rAd27I927Rd27Z927id27q927zd277928Ad3MI93MRd3MZ93Mid3Mq93Mzd3M793KtN2hMgBZddCTWwCEpACHuAA2IwA0Ca0AYEEN7iPd7kXd7mfd7ond7qvd7s3d7u/d7wHd/yPd/0Xd/2fd/4nd/6vd/83d/+/d8AHuACPuAEXuAGfuAInuAKzt5xQADVzdVLQARzAAWN4AEeIAAYnuEavuEc3uEe/uEgHuIiPuIkXuImfuIonuIqvuIs3uIu/uIwHuMyPuM0XuM2fuM4nuM6vuM83uM+/uNAHuQlLgQBAQA7]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/images/bl.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAA88AAAPJCAMAAAAbDOrsAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAcJQTFRFrMbXrMjaqbe9prvGpra+rcnbqcHNrMjZq8TTr8rbtc7d6O/yudHfxNjisczcvtXgpLfAydvjrMnapbfAytzkrcjZv9Xhss3cr8vbq8PTutLfxNniuNDets/eqri9rMXTrsrbtc/dxdnjqsHNsMvcsszcp7vH6O/x4+nrrr/ItMvZ9Pb3rMjYr8nauszUtcfPwdXeuMvVs8bPqLe+ssLI+Pn6scvassnVqrm/yNngytbarbzDx9bcts3ZtcPIr8jYp7e+t9Deqre9vtDX1tzeusbLytviscnYs83dytvhr7vA8/X2q8HOsMfV5+7xqLzHtL/Duc7apbjArsjZscXPrL/IprjBqL/MxdDUp7nBtcrWxNjhq8XWvM/Yu9PfsMDI/v7+qLnBqbi+wNPcudDcvMzSrsPOy9zkvcvQxtjh9fj4rcLOtM7dpre+vdLdts7bprrGpba9ucfNwMnNqsPSrcXTrsfXqLrCtMzbw9Tb6u/xrLrArcrbrcXUqr7HrcfXusbKwNDWwNbhsr/ErrvA5+3wxdffxdPZu9Lf5u3vvdPezdXYwdbhq7i9q7vD8fP0t8fOqL3HqcDNr77Eq8ja////LL4G4QAAAJZ0Uk5T//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AaRLOegAACStJREFUeNrs1QVyFFEARdEeyCAxSBjJTFxxd3d3d5fg7i7BXf5+6bAKftc5S3hVt15SN9hTqraXW/K5P0DckrpCa6m+u39s3haQgZ4bxtXXNuoZstBzk55Bz4CeAT0DegY9A3oG9AzoGdAz6BnQM6BnQM+gZ0DPgJ4BPQN6Bj0Degb0DOgZ9Kxn0DOgZ0DPgJ5Bz4CeAT0Degb0DHoG9AzoGdAz6BnQM6BnQM+AnkHPgJ4BPQN6BvQMegb0DOgZ0DPoGdAzoGdAz4Ce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]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/images/br.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[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]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/images/br.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAAwAAAPJCAMAAAARZjlPAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAYNQTFRFrMnaq77Hq7i8p7a9qri9rsnZrsbUrsrbpLa/rsPPq8jZpbW9qre8qbe9q7m//v7+rMbXqsTTpbfApba/qrvCpbnDpra+qsPRpbnFrcnarMLOprzIrMPQvMbKp7nDqsPSqr3GrsfXrsXTqb/LprzHqLnBrMfXprjArbvArcXSqcLRqbe8sMfUsLvAqsHPydHU4ebnrMTTprrEp77MpbjAo7a/qri8pbW+rsfVrMfZq8bVrMLNqr3HrLm/pbnEpLjBuMPGqLi/q7vD1tzf4ubopbjCtsHFrMjYrcjYq7i9u8XJpra9qbnAqL3IqLe9rcfWq8jYp7a80NfaqMDNprvHqsDNqcHPqsXVp73JrMHNqr/L8fP0rL/I4+fpqbm/q8HOqL7LrcfXp73KrMbUq8XU/f39q8PRqbvFrbq+rLm+qLrDrMjZqL/Np7e+sMnYqLa8prW8qbi+qLvGxs/Sqb7Ip73Iqr7HrcPOr8fUrLrArMjarcrbqrrCr8jYr8naq8ja////7sj6uQAAAIF0Uk5T//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AksjjTwAAAQtJREFUeNrs28VaQgEYhOGfcwBJ6bC7u1vs7u7u7kD0nEsXgYU71z7PN6t5N3MHI5qmSdrXTbV1a6Bckvh8sxr87wl8xPFqiCUQ/QMvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4nzD//giYM1OQFNKTjwNTQWFXtz+JDNNsxXp+rCeF9uyN06nzxMDYfsPu08XOuGhR22Xp4UnRQ8l9jdg65txHoeXp3H5jn4y6Vz2VV8+NZdfGOun05K00ZfU2B2eUegnVLh4sBbw+1ThyLHtrxeFIS5vqVIZ0CQeGLRb7nVNZ0HXxWnz2yXnH2aArjqCq3lYpOZt6POJoVSYet10/Xf8WYACiIq1QmLEJbAAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/images/darrowdown.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhFgALAIABAIeHav///yH5BAEAAAEALAAAAAAWAAsAAAIchI+pEOsZ4nuxTlXzPbnvDk7g6IwmZp5cmhpsAQA7]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/images/darrowleft.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhCwAWAIABAIeHav///yH5BAEAAAEALAAAAAALABYAAAIjjI+AC7rWHIsvtmmTvXBzT4HiKAZkBx6l6mGUK2lcNdNPUgAAOw==]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/images/darrowright.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhCwAWAIABAIeHav///yH5BAEAAAEALAAAAAALABYAAAIkRI4JlrqN1oNyutqqvDrqHXyYSJZkeKKf17Ggy3CQOqN1eAcFADs=]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/images/darrowup.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhFgALAIABAIeHav///yH5BAEAAAEALAAAAAAWAAsAAAIcjI8AyJ26nAwQzlbrPTnv3k0g6IwjY5pcqrJsAQA7]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/images/itunes.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[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]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/images/rarrowdown.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhFgALAMQeAM/f5q7K28jb5NDg5rnR377V4MPY4rTO3cXZ47jQ3rfQ3sHW4bLM3KzI2tHh56/L29Lh58fb473U4LPN3bbP3q3J27XO3bvT37DL3MTY4r/V4c7f5sze5dTj6P///wAAACH5BAEAAB4ALAAAAAAWAAsAAAVuYCd2zsadaLo5Y+eJgGAsWm3XiyEAoud3G0SBoKBYjhaKglBAbFw+HyRSSEwwj0DggZkkChFIdLzJXA6YSqNRwRwumc14Xj5jtG64fE43WxgMFnp8hAAIEgQEEggAhI4DMjoDjpQdAwNQlI49lCEAOw==]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/images/rarrowleft.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhCwAWAMQeAM/f5q7K28jb5NDg5rnR377V4MPY4rTO3cXZ47jQ3rfQ3sHW4bLM3KzI2tHh56/L29Lh58fb473U4LPN3bbP3q3J27XO3bvT37DL3MTY4r/V4c7f5sze5dTj6P///wAAACH5BAEAAB4ALAAAAAALABYAAAVooCeOZEeenXmKqXpCG+COW4QIzrllRWFspN0lQVhwRoDM5TBRaI6eAWKJwVCeno5AYsFUHpZnZ2AgMAKNQJgzLp/T6+y2+41Hp4fqFepJLptYNEpERjo8PkA6NjgrHjAyjVkpkZKUWSEAOw==]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/images/rarrowright.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhCwAWAMQeAM/f5q7K28jb5NDg5rnR377V4MPY4rTO3cXZ47jQ3rfQ3sHW4bLM3KzI2tHh56/L29Lh58fb473U4LPN3bbP3q3J27XO3bvT37DL3MTY4r/V4c7f5sze5dTj6P///wAAACH5BAEAAB4ALAAAAAALABYAAAVlYOeNZNmJpXmmZAdsEOs5AhJt7GYURYaXnAUhcfEBNYrJoQggcTQUDGaJGIyelkcFY5EIRNhAI8AgGAad8Lh8Tmuy2+7X84xOL9UrUsl0ColGJDo8gSQ0Nj8mLzEsJyiNj40yJCEAOw==]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/images/rarrowup.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhFgALAMQeAM/f5q7K28jb5NDg5rnR377V4MPY4rTO3cXZ47jQ3rfQ3sHW4bLM3KzI2tHh56/L29Lh58fb473U4LPN3bbP3q3J27XO3bvT37DL3MTY4r/V4c7f5sze5dTj6P///wAAACH5BAEAAB4ALAAAAAAWAAsAAAVuoCeOZNeRaFoOw6m+3iAYhjDAKYBIBCEhANxok7lYGAzLJbMREi8HTCCAOSybr2e00mhUqlcVJFJITDCP6QMzSRQiEFRngygQFBSL3kJREAoIGy4eJgAzCxqJiokLNQAmhCYdDhsclpeYGw6SHSEAOw==]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/images/tl.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhzwMMAOZCAMXZ47/V4a/L27bP3rPN3brS373U4LLN3KzI2s7f5qzJ2sHW4bXP3bfQ3sbZ463K27HM3LvS37DL3NLh59Dg5sjb5NHh58LX4q7K28rc5MPY4sDW4ejv8szd5c/f5s3e5cnb5Mfa49Pi6LzT4P3+/vL298ba47vT3+Pt8NPh58vd5NTi6Pn7/Ozy9P7+/vj6+8ze5fH2+Ozy9eHr7+Ls8Orx9M7f5enw88TZ4r7V4LXO3a/K27LM3LnR363J28vd5e3z9avI2v///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAEIALAAAAADPAwwAAAf/gEKCg0IuMUCIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnp+goaKjpKWmp6ipqqusra6vsLGZMoRCLDQrExQJHzAdP8DBwsPExcbHyMnKy8zNzs/Q0dLT1NXW19jZ2tvc3d7f4OHi4+Tl5ufo6cwdhDciFgk/ICEmAPY4+Pn6+/z9/v8AAwocSLCgwYMIEypcyLChw4cQI0qcSLGixYsYM2rcyLGjx48gQwq0NwjFBA8/KgDQsGBDgJc5YsqcSbOmzZs4c+rcybOnz59AgwodSrSo0aNIkypdyrSp06dQo0qdSrWq1atYs2rd+VJQjQkJMji4EMDAiAgFCvRYy7at27dw/+PKnUu3rt27ePPq3cu3r9+/gAMLHky4sOHDiBMrXsy4sePHkCNLnkzZblohL0R4yABggYEIPRoMGM2AgY7TqFOrXs26tevXsGPLnk27tu3buHPr3s27t+/fwIMLH068uPHjyJMrX868ufPn0F+XHiBkhoUfDjyH1kGAwIEDPMKLH0++vPnz6NOrX8++vfv38OPLn0+/vv37+PPr38+/v///AAYo4IAEFmjggQgmqGB7B5CQQgIVXGBADwMQAIEEEgggwA4cdujhhyCGKOKIJJZo4okopqjiiiy26OKLMMYo44w01mjjjTjmqOOOPPbo449ABinkkEQWeaKGJVDwA8wAAUTQgIUCYPCAD1RWaeWVWGap5ZZcdunll2CGKeaYZJZp5plopqnmmmy26eabcMYp55x01mnnnXjmqeeefPY5Zgs2gKDBhDpAIMADCiiAAAJBNOroo5BGKumklFZq6aWYZqrpppx26umnoIYq6qiklmrqqaimquqqrLbq6quwxirrrLTWaiumi3LwQQgLnPCkBBgocOuwxBZr7LHIJqvsssw26+yz0EYr7bSfcqCCAxsUMMABhwpL7bfghivuuOSWa+656Kar7rqQBgIAOw==]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/images/tl.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAA88AAAAMCAMAAABrwX92AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAMlQTFRFxdnjv9Xhr8vbts/es83dutLfvdTgss3crMjazt/mrMnawdbhtc/dt9Dextnjrcrbsczcu9LfsMvc0uHn0ODmyNvk0eHnwtfirsrbytzkw9jiwNbh6O/yzN3lz9/mzd7lydvkx9rj0+LovNPg/f7+8vb3xtrju9Pf4+3w0+Hny93k1OLo+fv87PL0/v7++Pr7zN7l8fb47PL14evv4uzw6vH0zt/l6fDzxNnivtXgtc7dr8rbsszcudHfrcnby93l7fP1q8ja////pkJuwAAAAEN0Uk5T////////////////////////////////////////////////////////////////////////////////////////AEFiBO8AAADcSURBVHja7NUHTsNAFITht9XdcUnvCZ0UejMsC77/obDCKZ403xFG+jXU/js+/AAAb490qnn/vKv70ep+4QGArcWp57ftMPLrzSURvQMAU13AXc7X9dIPaJrMhBAfAMCUEF3PL3U0yUfCnpXGOADgyhhq77bLCSW2dJlSKk0bAGApTRW1T0OfJ9ZljdZB8AUAbAV0fhMNRtYpXVSVlJ8AwJWUdNH3JMpMF3Lc+wYAzujwup5a1xSyF8dh+AsAXIUhzVeb5CrT1TjGHADM0fw2nxkVdPeMMQCY+xNgAGxG2LimrQDhAAAAAElFTkSuQmCC]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/images/tr.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhDAAyAOZsAK7K26zJ2qu+x7DL3LLN3K3J26+8wbrS37bP3rjQ3rDJ2K7Dz8DW4bHJ2LrR3cjb5MXY4Mnb48nb4bjK0rDFz7TAxb3S3rHCyrbI0bvT37zT4LfO3LHM3LrO17fO2rC/xbfM1rvS38ze5bTK1c3d5LfQ3rTH0bLG0L7N0sDR2MHO1MnZ37TO3bbFy7LL28DV4LHK2q/AybPJ1a/Ez6u7w8nX3ay/yKq7wrDI1LvQ3LXM2sTY4b7S3K27wL7V4L3Q17O/xa2/yMLU3c/e5LTM27vM0q67wK/K28PX4bPN3bDK2q6+xLjFyr3Kz7XO3bPDysTU26/L26y8w83c4rjGy8fa48LR1628w66/yMHV3rLK2bHI1cLX4rPAxcbV2rDH1MbZ48zd5Kq+x63Dzqq6wq3K26y6wKzI2q/I2K/H1K/J2qvI2gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAGwALAAAAAAMADIAAAf9gGyCg4SCImEkQ1M1hWxgVQ8REiteKoQMDFxIOxBQVk2DBxkaPi9ZQikoTIIIJQkHIRY8P0VUQGwESSwICQ45HRMtFWxRAxwEThseIBhPXWwFAAADBEQ6IyYXHwZnAdEDLloyJzFLBmtrZwVHMA1bFFhX5+gBAEoKODNBUkboa/VqFHxZYINGD38A0aRZIOCGGYRl1CgcI4DMQ3RnIk6seDGdxjQULfrLKBGkGJEYP4452ZHkRJYjVcJMWXIlSo81Z+J8edOlyZ4ygeYUyrNlUKNDkRaNmZTpUppPd/5UOtVpVahXpdqkutVqV6xfter0GZbs2KNezzYFq7ZoIAA7]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/images/tr.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAAwAAAAyCAMAAABf28oIAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAUdQTFRFrsrbrMnaq77HsMvcss3crcnbr7zButLfts/euNDesMnYrsPPwNbhscnYutHdyNvkxdjgydvjydvhuMrSsMXPtMDFvdLescLKtsjRu9PfvNPgt87csczcus7Xt87asL/Ft8zWu9LfzN7ltMrVzd3kt9DetMfRssbQvs3SwNHYwc7UydnftM7dtsXLssvbwNXgscrar8DJs8nVr8TPq7vDydfdrL/IqrvCsMjUu9DctczaxNjhvtLcrbvAvtXgvdDXs7/Frb/IwtTdz97ktMzbu8zSrrvAr8rbw9fhs83dsMrarr7EuMXKvcrPtc7ds8PKxNTbr8vbrLzDzdziuMbLx9rjwtHXrbzDrr/IwdXessrZscjVwtfis8DFxtXasMfUxtnjzN3kqr7HrcPOqrrCrcrbrLrArMjar8jYr8fUr8naq8jaAAAAZmJJ4wAAAG10Uk5T////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AC221EsAAACxSURBVHjaYshBAgxKiSrOwaZQTkIov6CQdpwWmMPDE+NhLRAQ5gvisEtK2elHOmlq+AA5HKqc7IpiNvauIQ45DCyeOhycfJaywrqiOQyBzDIsftJyChL+sTkMrAwMzCwuVspq4vJsDOmMrAzMelFG6obebAzZ2ems7ga80SIR4SBONiODF5eFsWOQG4STxRXPbWZiC+VkZHIzmaeBOalATjJTCpiTToCTNMoZ7ByAAAMAMXnTwpvpjk4AAAAASUVORK5CYII=]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/images/wait.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhKwALAPEAADc8QP///5ianP///yH/C05FVFNDQVBFMi4wAwEAAAAh/h1CdWlsdCB3aXRoIEdJRiBNb3ZpZSBHZWFyIDQuMAAh/hVNYWRlIGJ5IEFqYXhMb2FkLmluZm8AIfkECQoAAAAsAAAAACsACwAAAjKEjgjLltnYg/PFChveVvPLheA2hlhZoWYnfd6avqcMZy1J14fKLvrEs/k+uKAgMkwVAAAh+QQJCgAAACwAAAAAKwALAAACPcSOCMsgD2FjsZqEx6x885hh3veMZJiYn8qhSkNKcCy4B2vNsa3pJA6yAWUUGm9Y8n2Oyk7T4posYlLHrwAAIfkECQoAAAAsAAAAACsACwAAAj2EjgjLMA9hY6maalvcb+IPChO3eeF5jKTUoKi6DqYLwutMYzaJ58nO6flSmpisNcwwjEfK6fKZLGJSqK4AACH5BAkKAAAALAAAAAArAAsAAAJAhI4Iy5bZ2JiUugcbfrH6uWVMqDSfRx5RKnQnxa6p+w6xNpu1nY/9suORZENd7eYrSnbIRRMQvGAizhAV+gIUAAA7AAAAAAAAAAAA]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/info.dat</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGluZm9bJ2pzJ10gPSBhcnJheSgnbGliL2pxdWVyeS5ob3ZlckludGVudC5qcycsJ2xpYi9qcXVlcnkuYmdpZnJhbWUubWluLmpzJywnanF1ZXJ5LmNsdWV0aXAubWluLmpzJyk7CiRpbmZvWydjc3MnXSA9ICdqcXVlcnkuY2x1ZXRpcC5jc3MnOwokaW5mb1snZGVwZW5kcyddID0gJ2pxdWVyeSc7CiRpbmZvWydqc19ub21pbmlmeSddID0gMTsKPz4K]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/jquery.cluetip.all.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohCiAqIGpRdWVyeSBjbHVlVGlwIHBsdWdpbiB2MS4yLjcKICoKICogRGF0ZTogU2F0IE9jdCAxMyAxNzoxNzo0NyAyMDEyIEVEVAogKiBSZXF1aXJlczogalF1ZXJ5IHYxLjMrCiAqCiAqIENvcHlyaWdodCAyMDEyLCBLYXJsIFN3ZWRiZXJnCiAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgR1BMIGxpY2Vuc2VzOgogKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocAogKiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLmh0bWwKICoKICoKICogRXhhbXBsZXMgY2FuIGJlIGZvdW5kIGF0IGh0dHA6Ly9wbHVnaW5zLmxlYXJuaW5nanF1ZXJ5LmNvbS9jbHVldGlwL2RlbW8vCiAqCiovCgooZnVuY3Rpb24oJCkgewoKICAkLmNsdWV0aXAgPSB7CiAgICB2ZXJzaW9uOiAnMS4yLjcnLAoKICAgIC8vIHRoZSBIVE1MIHRoYXQgd2lsbCBiZSB1c2VkIGZvciB0aGUgdG9vbHRpcAogICAgdGVtcGxhdGU6IFsnPGRpdj4nLAogICAgICAnPGRpdiBjbGFzcz0iY2x1ZXRpcC1vdXRlciI+JywKICAgICAgICAnPGgzIGNsYXNzPSJjbHVldGlwLXRpdGxlIHVpLXdpZGdldC1oZWFkZXIgdWktY2x1ZXRpcC1oZWFkZXIiPjwvaDM+JywKICAgICAgICAnPGRpdiBjbGFzcz0iY2x1ZXRpcC1pbm5lciB1aS13aWRnZXQtY29udGVudCB1aS1jbHVldGlwLWNvbnRlbnQiPjwvZGl2PicsCiAgICAgICc8L2Rpdj4nLAogICAgICAnPGRpdiBjbGFzcz0iY2x1ZXRpcC1leHRyYSI+PC9kaXY+JywKICAgICc8L2Rpdj4nXS5qb2luKCcnKSwKCiAgICAvKiBjbHVlVGlwIHNldHVwCiAgICAgKiAgdGhlIHNldHVwIG9wdGlvbnMgYXJlIGFwcGxpZWQgZWFjaCB0aW1lIC5jbHVldGlwKCkgaXMgY2FsbGVkLAogICAgICogIEJVVCBvbmx5IGlmIDxkaXYgaWQ9ImNsdWV0aXAiPiBpcyBub3QgYWxyZWFkeSBpbiB0aGUgZG9jdW1lbnQKICAgICovCiAgICBzZXR1cDogewogICAgICAvLyBtZXRob2QgdG8gYmUgdXNlZCBmb3IgaW5zZXJ0aW5nIHRoZSBjbHVlVGlwIGludG8gdGhlIERPTS4KICAgICAgLy8gUGVybWl0dGVkIHZhbHVlcyBhcmUgJ2FwcGVuZFRvJywgJ3ByZXBlbmRUbycsICdpbnNlcnRCZWZvcmUnLCBhbmQgJ2luc2VydEFmdGVyJwogICAgICBpbnNlcnRpb25UeXBlOiAnYXBwZW5kVG8nLAogICAgICAvLyBlbGVtZW50IGluIHRoZSBET00gdGhlIHBsdWdpbiB3aWxsIHJlZmVyZW5jZSB3aGVuIGluc2VydGluZyB0aGUgY2x1ZVRpcC4KICAgICAgaW5zZXJ0aW9uRWxlbWVudDogJ2JvZHknCiAgICB9LAoKICAgIC8qCiAgICAgKiBjbHVlVGlwIG9wdGlvbnMKICAgICAqCiAgICAgKiBlYWNoIG9uZSBjYW4gYmUgZXhwbGljaXRseSBvdmVycmlkZGVuIGJ5IGNoYW5naW5nIGl0cyB2YWx1ZS4KICAgICAqIGZvciBleGFtcGxlOiAkLmNsdWV0aXAuZGVmYXVsdHMud2lkdGggPSAyMDA7CiAgICAgKiAgICAgICAgIG9yOiAkLmZuLmNsdWV0aXAuZGVmYXVsdHMud2lkdGggPSAyMDA7IC8vIGZvciBjb21wYXRpYmlsaXR5IHdpdGggcHJldmlvdXMgY2x1ZVRpcCB2ZXJzaW9ucwogICAgICogd291bGQgY2hhbmdlIHRoZSBkZWZhdWx0IHdpZHRoIGZvciBhbGwgY2x1ZVRpcHMgdG8gMjAwLgogICAgICoKICAgICAqIGVhY2ggb25lIGNhbiBhbHNvIGJlIG92ZXJyaWRkZW4gYnkgcGFzc2luZyBhbiBvcHRpb25zIG1hcCB0byB0aGUgY2x1ZXRpcCBtZXRob2QuCiAgICAgKiBmb3IgZXhhbXBsZTogJCgnYS5leGFtcGxlJykuY2x1ZXRpcCh7d2lkdGg6IDIwMH0pOwogICAgICogd291bGQgY2hhbmdlIHRoZSBkZWZhdWx0IHdpZHRoIHRvIDIwMCBmb3IgY2x1ZVRpcHMgaW52b2tlZCBieSBhIGxpbmsgd2l0aCBjbGFzcyBvZiAiZXhhbXBsZSIKICAgICAqCiAgICAqLwogICAgZGVmYXVsdHM6IHsKICAgICAgbXVsdGlwbGU6ICAgICAgICAgZmFsc2UsICAgIC8vIEFsbG93IGEgbmV3IHRvb2x0aXAgdG8gYmUgY3JlYXRlZCBmb3IgZWFjaCAuY2x1ZXRpcCgpIGNhbGwKICAgICAgd2lkdGg6ICAgICAgICAgICAgMjc1LCAgICAgIC8vIFRoZSB3aWR0aCBvZiB0aGUgY2x1ZVRpcAogICAgICBoZWlnaHQ6ICAgICAgICAgICAnYXV0bycsICAgLy8gVGhlIGhlaWdodCBvZiB0aGUgY2x1ZVRpcAogICAgICBjbHVlekluZGV4OiAgICAgICA5NywgICAgICAgLy8gU2V0cyB0aGUgei1pbmRleCBzdHlsZSBwcm9wZXJ0eSBvZiB0aGUgY2x1ZVRpcAogICAgICBwb3NpdGlvbkJ5OiAgICAgICAnYXV0bycsICAgLy8gU2V0cyB0aGUgdHlwZSBvZiBwb3NpdGlvbmluZzogJ2F1dG8nLCAnbW91c2UnLCdib3R0b21Ub3AnLCAndG9wQm90dG9tJywgZml4ZWQnCiAgICAgIHRvcE9mZnNldDogICAgICAgIDE1LCAgICAgICAvLyBOdW1iZXIgb2YgcHggdG8gb2Zmc2V0IGNsdWVUaXAgZnJvbSB0b3Agb2YgaW52b2tpbmcgZWxlbWVudAogICAgICBsZWZ0T2Zmc2V0OiAgICAgICAxNSwgICAgICAgLy8gTnVtYmVyIG9mIHB4IHRvIG9mZnNldCBjbHVlVGlwIGZyb20gbGVmdCBvZiBpbnZva2luZyBlbGVtZW50CiAgICAgIHNuYXBUb0VkZ2U6ICAgICAgIGZhbHNlLCAgICAvLyBGb3IgYm90dG9tVG9wIGFuZCB0b3BCb3R0b20sIHNuYXAgdG8gdGhlIHRvcCBvciBib3R0b20gb2YgdGhlIGVsZW1lbnQuCiAgICAgIGxvY2FsOiAgICAgICAgICAgIGZhbHNlLCAgICAvLyBXaGV0aGVyIHRvIHVzZSBjb250ZW50IGZyb20gdGhlIHNhbWUgcGFnZSBmb3IgdGhlIGNsdWVUaXAncyBib2R5CiAgICAgIGxvY2FsUHJlZml4OiAgICAgIG51bGwsICAgICAvLyBzdHJpbmcgdG8gYmUgcHJlcGVuZGVkIHRvIHRoZSB0aXAgYXR0cmlidXRlIGlmIGxvY2FsIGlzIHRydWUKICAgICAgbG9jYWxJZFN1ZmZpeDogICAgbnVsbCwgICAgIC8vIHN0cmluZyB0byBiZSBhcHBlbmRlZCB0byB0aGUgY2x1ZXRpcCBjb250ZW50IGVsZW1lbnQncyBpZCBpZiBsb2NhbCBpcyB0cnVlCiAgICAgIGhpZGVMb2NhbDogICAgICAgIHRydWUsICAgICAvLyBJZiBsb2NhbCBvcHRpb24gaXMgc2V0IHRvIHRydWUsIHRoaXMgZGV0ZXJtaW5lcyB3aGV0aGVyIGxvY2FsIGNvbnRlbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGJlIHNob3duIGluIGNsdWVUaXAgc2hvdWxkIGJlIGhpZGRlbiBhdCBpdHMgb3JpZ2luYWwgbG9jYXRpb24KICAgICAgYXR0cmlidXRlOiAgICAgICAgJ3JlbCcsICAgIC8vIHRoZSBhdHRyaWJ1dGUgdG8gYmUgdXNlZCBmb3IgZmV0Y2hpbmcgdGhlIGNsdWVUaXAncyBib2R5IGNvbnRlbnQKICAgICAgdGl0bGVBdHRyaWJ1dGU6ICAgJ3RpdGxlJywgIC8vIHRoZSBhdHRyaWJ1dGUgdG8gYmUgdXNlZCBmb3IgZmV0Y2hpbmcgdGhlIGNsdWVUaXAncyB0aXRsZQogICAgICBzcGxpdFRpdGxlOiAgICAgICAnJywgICAgICAgLy8gQSBjaGFyYWN0ZXIgdXNlZCB0byBzcGxpdCB0aGUgdGl0bGUgYXR0cmlidXRlIGludG8gdGhlIGNsdWVUaXAgdGl0bGUgYW5kIGRpdnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpdGhpbiB0aGUgY2x1ZVRpcCBib2R5LiBtb3JlIGluZm8gYmVsb3cgWzZdCiAgICAgIGVzY2FwZVRpdGxlOiAgICAgIGZhbHNlLCAgICAvLyB3aGV0aGVyIHRvIGh0bWwgZXNjYXBlIHRoZSB0aXRsZSBhdHRyaWJ1dGUKICAgICAgc2hvd1RpdGxlOiAgICAgICAgdHJ1ZSwgICAgIC8vIHNob3cgdGl0bGUgYmFyIG9mIHRoZSBjbHVlVGlwLCBldmVuIGlmIHRpdGxlIGF0dHJpYnV0ZSBub3Qgc2V0CiAgICAgIGNsdWV0aXBDbGFzczogICAgICdkZWZhdWx0JywvLyBjbGFzcyBhZGRlZCB0byBvdXRlcm1vc3QgY2x1ZVRpcCBkaXYgaW4gdGhlIGZvcm0gb2YgJ2NsdWV0aXAtJyArIGNsdWVUaXBDbGFzcy4KICAgICAgaG92ZXJDbGFzczogICAgICAgJycsICAgICAgIC8vIGNsYXNzIGFwcGxpZWQgdG8gdGhlIGludm9raW5nIGVsZW1lbnQgb25tb3VzZW92ZXIgYW5kIHJlbW92ZWQgb25tb3VzZW91dAogICAgICB3YWl0SW1hZ2U6ICAgICAgICB0cnVlLCAgICAgLy8gd2hldGhlciB0byBzaG93IGEgImxvYWRpbmciIGltZywgd2hpY2ggaXMgc2V0IGluIGpxdWVyeS5jbHVldGlwLmNzcwogICAgICBjdXJzb3I6ICAgICAgICAgICAnaGVscCcsCiAgICAgIGFycm93czogICAgICAgICAgIGZhbHNlLCAgICAvLyBpZiB0cnVlLCBkaXNwbGF5cyBhcnJvdyBvbiBhcHByb3ByaWF0ZSBzaWRlIG9mIGNsdWVUaXAKICAgICAgZHJvcFNoYWRvdzogICAgICAgdHJ1ZSwgICAgIC8vIHNldCB0byBmYWxzZSBpZiB5b3UgZG9uJ3Qgd2FudCB0aGUgZHJvcC1zaGFkb3cgZWZmZWN0IG9uIHRoZSBjbHVlVGlwCiAgICAgIGRyb3BTaGFkb3dTdGVwczogIDYsICAgICAgICAvLyBhZGp1c3RzIHRoZSBzaXplIG9mIHRoZSBkcm9wIHNoYWRvdwogICAgICBzdGlja3k6ICAgICAgICAgICBmYWxzZSwgICAgLy8ga2VlcCB2aXNpYmxlIHVudGlsIG1hbnVhbGx5IGNsb3NlZAogICAgICBtb3VzZU91dENsb3NlOiAgICBmYWxzZSwgICAgLy8gY2xvc2Ugd2hlbiBjbHVlVGlwIGlzIG1vdXNlZCBvdXQ6IGZhbHNlLCAnY2x1ZXRpcCcsICdsaW5rJywgJ2JvdGgnCiAgICAgIGRlbGF5ZWRDbG9zZTogICAgIDUwLCAgICAgICAgLy8gY2xvc2UgY2x1ZVRpcCBvbiBhIHRpbWVkIGRlbGF5CiAgICAgIGFjdGl2YXRpb246ICAgICAgICdob3ZlcicsICAvLyBzZXQgdG8gJ2NsaWNrJyB0byBmb3JjZSB1c2VyIHRvIGNsaWNrIHRvIHNob3cgY2x1ZVRpcAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHRvICdmb2N1cycgdG8gc2hvdyBvbiBmb2N1cyBvZiBhIGZvcm0gZWxlbWVudCBhbmQgaGlkZSBvbiBibHVyCiAgICAgIGNsaWNrVGhyb3VnaDogICAgIHRydWUsICAgIC8vIGlmIHRydWUsIGFuZCBhY3RpdmF0aW9uIGlzIG5vdCAnY2xpY2snLCB0aGVuIGNsaWNraW5nIG9uIGxpbmsgd2lsbCB0YWtlIHVzZXIgdG8gdGhlIGxpbmsncyBocmVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbiBpZiBocmVmIGFuZCB0aXBBdHRyaWJ1dGUgYXJlIGVxdWFsCiAgICAgIHRyYWNraW5nOiAgICAgICAgIGZhbHNlLCAgICAvLyBpZiB0cnVlLCBjbHVlVGlwIHdpbGwgdHJhY2sgbW91c2UgbW92ZW1lbnQgKGV4cGVyaW1lbnRhbCkKICAgICAgY2xvc2VQb3NpdGlvbjogICAgJ3RvcCcsICAgIC8vIGxvY2F0aW9uIG9mIGNsb3NlIHRleHQgZm9yIHN0aWNreSBjbHVldGlwczsgY2FuIGJlICd0b3AnLCAnYm90dG9tJywgJ3RpdGxlJyBvciAnbm9uZScKICAgICAgY2xvc2VUZXh0OiAgICAgICAgJ0Nsb3NlJywgIC8vIHRleHQgKG9yIEhUTUwpIHRvIHRvIGJlIGNsaWNrZWQgdG8gY2xvc2Ugc3RpY2t5IGNsdWVUaXBzCiAgICAgIHRydW5jYXRlOiAgICAgICAgIDAsICAgICAgICAvLyBudW1iZXIgb2YgY2hhcmFjdGVycyB0byB0cnVuY2F0ZSBjbHVlVGlwJ3MgY29udGVudHMuIGlmIDAsIG5vIHRydW5jYXRpb24gb2NjdXJzCgogICAgICAvLyBlZmZlY3QgYW5kIHNwZWVkIGZvciBvcGVuaW5nIGNsdWVUaXBzCiAgICAgIGZ4OiB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW46ICAgICAgICdzaG93JywgLy8gY2FuIGJlICdzaG93JyBvciAnc2xpZGVEb3duJyBvciAnZmFkZUluJwogICAgICAgICAgICAgICAgICAgICAgICBvcGVuU3BlZWQ6ICAnJwogICAgICB9LAoKICAgICAgLy8gc2V0dGluZ3MgZm9yIHdoZW4gaG92ZXJJbnRlbnQgcGx1Z2luIGlzIHVzZWQKICAgICAgaG92ZXJJbnRlbnQ6IHsKICAgICAgICAgICAgICAgICAgICAgICAgc2Vuc2l0aXZpdHk6ICAzLAogICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnZhbDogICAgIDUwLAogICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0OiAgICAgIDAKICAgICAgfSwKCiAgICAgIC8vIHNob3J0LWNpcmN1aXQgZnVuY3Rpb24gdG8gcnVuIGp1c3QgYmVmb3JlIGNsdWVUaXAgaXMgc2hvd24uCiAgICAgIG9uQWN0aXZhdGU6ICAgICAgIGZ1bmN0aW9uKGUpIHtyZXR1cm4gdHJ1ZTt9LAogICAgICAvLyBmdW5jdGlvbiB0byBydW4ganVzdCBhZnRlciBjbHVlVGlwIGlzIHNob3duLgogICAgICBvblNob3c6ICAgICAgICAgICBmdW5jdGlvbihjdCwgY2kpe30sCiAgICAgIC8vIGZ1bmN0aW9uIHRvIHJ1biBqdXN0IGFmdGVyIGNsdWVUaXAgaXMgaGlkZGVuLgogICAgICBvbkhpZGU6ICAgICAgICAgICBmdW5jdGlvbihjdCwgY2kpe30sCiAgICAgIC8vIHdoZXRoZXIgdG8gY2FjaGUgcmVzdWx0cyBvZiBhamF4IHJlcXVlc3QgdG8gYXZvaWQgdW5uZWNlc3NhcnkgaGl0cyB0byBzZXJ2ZXIKICAgICAgYWpheENhY2hlOiAgICAgICAgdHJ1ZSwKCiAgICAgIC8vIHByb2Nlc3MgZGF0YSByZXRyaWV2ZWQgdmlhIHhociBiZWZvcmUgaXQncyBkaXNwbGF5ZWQKICAgICAgYWpheFByb2Nlc3M6ICAgICAgZnVuY3Rpb24oZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLnJlcGxhY2UoLzwoc2NyaXB0fHN0eWxlfHRpdGxlKVtePF0rPFwvKHNjcmlwdHxzdHlsZXx0aXRsZSk+L2dtLCAnJykucmVwbGFjZSgvPChsaW5rfG1ldGEpW14+XSs+L2csJycpOwogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRhOwogICAgICB9LAoKICAgICAgLy8gY2FuIHBhc3MgaW4gc3RhbmRhcmQgJC5hamF4KCkgcGFyYW1ldGVycy4gQ2FsbGJhY2sgZnVuY3Rpb25zLCBzdWNoIGFzIGJlZm9yZVNlbmQsCiAgICAgIC8vIHdpbGwgYmUgcXVldWVkIGZpcnN0IHdpdGhpbiB0aGUgZGVmYXVsdCBjYWxsYmFja3MuCiAgICAgIC8vIFRoZSBvbmx5IGV4Y2VwdGlvbiBpcyBlcnJvciwgd2hpY2ggb3ZlcnJpZGVzIHRoZSBkZWZhdWx0CiAgICAgIGFqYXhTZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAvLyBlcnJvcjogZnVuY3Rpb24oY3QsIGNpKSB7IC8qIG92ZXJyaWRlIGRlZmF1bHQgZXJyb3IgY2FsbGJhY2sgKi8gfSwKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVmb3JlU2VuZDogZnVuY3Rpb24oY3QsIGNpKSB7IC8qIGNhbGxlZCBmaXJzdCB3aXRoaW4gZGVmYXVsdCBiZWZvcmVTZW5kIGNhbGxiYWNrICovIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiAnaHRtbCcKICAgICAgfSwKICAgICAgZGVidWc6IGZhbHNlCgogICAgfQogIH07CiAgdmFyICRjbHVldGlwV2FpdCwKICAgICAgc3RhbmRhcmRDbGFzc2VzID0gJ2NsdWV0aXAgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWNsdWV0aXAnLAogICAgICBjYWNoZXMgPSB7fSwKICAgICAgY291bnRlciA9IDAsCiAgICAgIGltZ0NvdW50ID0gMDsKCiAgLy8gdXNlICQuZm4ucHJvcCgpIGlmIGF2YWlsYWJsZSAoalF1ZXJ5IDEuNispOyBvdGhlcndpc2UsICQuZm4uYXR0cigpCiAgJC5mbi5hdHRyUHJvcCA9ICQuZm4ucHJvcCB8fCAkLmZuLmF0dHI7CgogIC8vIC5jbHVldGlwKCkgbWV0aG9kCiAgJC5mbi5jbHVldGlwID0gZnVuY3Rpb24oanMsIG9wdGlvbnMpIHsKICAgIHZhciAkY2x1ZXRpcCwgJGNsdWV0aXBJbm5lciwgJGNsdWV0aXBPdXRlciwgJGNsdWV0aXBUaXRsZSwgJGNsdWV0aXBBcnJvd3MsICRkcm9wU2hhZG93OwogICAgaWYgKHR5cGVvZiBqcyA9PSAnb2JqZWN0JykgewogICAgICBvcHRpb25zID0ganM7CiAgICAgIGpzID0gbnVsbDsKICAgIH0KICAgIGlmIChqcyA9PSAnZGVzdHJveScpIHsKICAgICAgdmFyIGRhdGEgPSB0aGlzLmRhdGEoJ2NsdWV0aXAnKTsKICAgICAgaWYgKCBkYXRhICkgewogICAgICAgICQoZGF0YS5zZWxlY3RvcikucmVtb3ZlKCk7CiAgICAgICAgJC5yZW1vdmVEYXRhKHRoaXMsICd0aXRsZScpOwogICAgICAgICQucmVtb3ZlRGF0YSh0aGlzLCAnY2x1ZXRpcCcpOwogICAgICAgICQucmVtb3ZlRGF0YSh0aGlzLCAnY2x1ZXRpcE1vYycpOwogICAgICB9CiAgICAgICQoZG9jdW1lbnQpLnVuYmluZCgnLmNsdWV0aXAnKTsKICAgICAgcmV0dXJuIHRoaXMudW5iaW5kKCcuY2x1ZXRpcCcpOwogICAgfQoKICAgIC8vIG1lcmdlIHBlci1jYWxsIG9wdGlvbnMgd2l0aCBkZWZhdWx0cwogICAgb3B0aW9ucyA9ICQuZXh0ZW5kKHRydWUsIHt9LCAkLmNsdWV0aXAuZGVmYXVsdHMsIG9wdGlvbnMgfHwge30pOwoKICAgIC8qKiA9Y3JlYXRlIGNsdWV0aXAgZGl2cyAqKi8KICAgIGNvdW50ZXIrKzsKICAgIHZhciBjbHVlekluZGV4LAogICAgICAgIGNsdWV0aXBJZCA9ICQuY2x1ZXRpcC5iYWNrQ29tcGF0IHx8ICFvcHRpb25zLm11bHRpcGxlID8gJ2NsdWV0aXAnIDogJ2NsdWV0aXAtJyArIGNvdW50ZXIsCiAgICAgICAgY2x1ZXRpcFNlbGVjdG9yID0gJyMnICsgY2x1ZXRpcElkLAogICAgICAgIHByZWZpeCA9ICQuY2x1ZXRpcC5iYWNrQ29tcGF0ID8gJyMnIDogJy4nLAogICAgICAgIGluc2VydGlvblR5cGUgPSAkLmNsdWV0aXAuc2V0dXAuaW5zZXJ0aW9uVHlwZSwKICAgICAgICBpbnNlcnRpb25FbGVtZW50ID0gJC5jbHVldGlwLnNldHVwLmluc2VydGlvbkVsZW1lbnQgfHwgJ2JvZHknOwoKICAgIGluc2VydGlvblR5cGUgPSAoL2FwcGVuZFRvfHByZXBlbmRUb3xpbnNlcnRCZWZvcmV8aW5zZXJ0QWZ0ZXIvKS50ZXN0KGluc2VydGlvblR5cGUpID8gaW5zZXJ0aW9uVHlwZSA6ICdhcHBlbmRUbyc7CiAgICAkY2x1ZXRpcCA9ICQoY2x1ZXRpcFNlbGVjdG9yKTsKICAgIGlmICghJGNsdWV0aXAubGVuZ3RoKSB7CgogICAgICAkY2x1ZXRpcCA9ICQoJC5jbHVldGlwLnRlbXBsYXRlKQogICAgICBbaW5zZXJ0aW9uVHlwZV0oaW5zZXJ0aW9uRWxlbWVudCkKICAgICAgLmF0dHIoJ2lkJywgY2x1ZXRpcElkKQogICAgICAuY3NzKHtwb3NpdGlvbjogJ2Fic29sdXRlJywgZGlzcGxheTogJ25vbmUnfSk7CgogICAgICBjbHVlekluZGV4ID0gK29wdGlvbnMuY2x1ZXpJbmRleDsKICAgICAgJGNsdWV0aXBPdXRlciA9ICRjbHVldGlwLmZpbmQocHJlZml4ICsgJ2NsdWV0aXAtb3V0ZXInKS5jc3Moe3Bvc2l0aW9uOiAncmVsYXRpdmUnLCB6SW5kZXg6IGNsdWV6SW5kZXh9KTsKICAgICAgJGNsdWV0aXBJbm5lciA9ICRjbHVldGlwLmZpbmQocHJlZml4ICsgJ2NsdWV0aXAtaW5uZXInKTsKICAgICAgJGNsdWV0aXBUaXRsZSA9ICRjbHVldGlwLmZpbmQocHJlZml4ICsgJ2NsdWV0aXAtdGl0bGUnKTsKCiAgICAgICRjbHVldGlwLmJpbmQoJ21vdXNlZW50ZXIgbW91c2VsZWF2ZScsIGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgICAgJCh0aGlzKS5kYXRhKCdlbnRlcmVkJywgZXZlbnQudHlwZSA9PT0gJ21vdXNlZW50ZXInKTsKICAgICAgfSk7CiAgICB9CgogICAgJGNsdWV0aXBXYWl0ID0gJCgnI2NsdWV0aXAtd2FpdGltYWdlJyk7CiAgICBpZiAoISRjbHVldGlwV2FpdC5sZW5ndGggJiYgb3B0aW9ucy53YWl0SW1hZ2UpIHsKICAgICAgJGNsdWV0aXBXYWl0ID0gJCgnPGRpdj48L2Rpdj4nKS5hdHRyKCdpZCcsICdjbHVldGlwLXdhaXRpbWFnZScpLmNzcyh7cG9zaXRpb246ICdhYnNvbHV0ZSd9KTsKICAgICAgJGNsdWV0aXBXYWl0Lmluc2VydEJlZm9yZSgkY2x1ZXRpcCkuaGlkZSgpOwogICAgfQoKCiAgICB2YXIgY2x1ZXRpcFBhZGRpbmcgPSAocGFyc2VJbnQoJGNsdWV0aXAuY3NzKCdwYWRkaW5nTGVmdCcpLCAxMCkgfHwgMCkgKyAocGFyc2VJbnQoJGNsdWV0aXAuY3NzKCdwYWRkaW5nUmlnaHQnKSwgMTApIHx8IDApOwoKCiAgICB0aGlzLmVhY2goZnVuY3Rpb24oaW5kZXgpIHsKICAgICAgdmFyIGxpbmsgPSB0aGlzLAogICAgICAgICAgJGxpbmsgPSAkKHRoaXMpLAogICAgICAgICAgLy8gc3VwcG9ydCBtZXRhZGF0YSBwbHVnaW4gKHYxLjAgYW5kIDIuMCkKICAgICAgICAgIG9wdHMgPSAkLmV4dGVuZCh0cnVlLCB7fSwgb3B0aW9ucywgJC5tZXRhZGF0YSA/ICRsaW5rLm1ldGFkYXRhKCkgOiAkLm1ldGEgPyAkbGluay5kYXRhKCkgOiAkbGluay5kYXRhKCdjbHVldGlwJykgfHwge30pLAogICAgICAgICAgLy8gc3RhcnQgb3V0IHdpdGggbm8gY29udGVudHMgKGZvciBhamF4IGFjdGl2YXRpb24pCiAgICAgICAgICBjbHVldGlwQ29udGVudHMgPSBmYWxzZSwKICAgICAgICAgIGlzQWN0aXZlID0gZmFsc2UsCiAgICAgICAgICBjbG9zZU9uRGVsYXkgPSBudWxsLAogICAgICAgICAgdGlwQXR0cmlidXRlID0gb3B0c1tvcHRzLmF0dHJpYnV0ZV0gfHwKICAgICAgICAgICAgKCBvcHRzLmF0dHJpYnV0ZSA9PSAnaHJlZicgPyAkbGluay5hdHRyKG9wdHMuYXR0cmlidXRlKSA6ICRsaW5rLmF0dHJQcm9wKG9wdHMuYXR0cmlidXRlKSB8fCAkbGluay5hdHRyKG9wdHMuYXR0cmlidXRlKSApLAogICAgICAgICAgY3RDbGFzcyA9IG9wdHMuY2x1ZXRpcENsYXNzOwoKICAgICAgY2x1ZXpJbmRleCA9ICtvcHRzLmNsdWV6SW5kZXg7CiAgICAgICRsaW5rLmRhdGEoJ2NsdWV0aXAnLCB7dGl0bGU6IGxpbmsudGl0bGUsIHpJbmRleDogY2x1ZXpJbmRleCwgc2VsZWN0b3I6IGNsdWV0aXBTZWxlY3Rvcn0pOwoKICAgICAgaWYgKG9wdHMuYXJyb3dzICYmICEkY2x1ZXRpcC5maW5kKCcuY2x1ZXRpcC1hcnJvd3MnKS5sZW5ndGgpIHsKICAgICAgICAkY2x1ZXRpcC5hcHBlbmQoJzxkaXYgY2xhc3M9ImNsdWV0aXAtYXJyb3dzIHVpLXN0YXRlLWRlZmF1bHQiPjwvZGl2PicpOwogICAgICB9CgogICAgICBpZiAoIXRpcEF0dHJpYnV0ZSAmJiAhb3B0cy5zcGxpdFRpdGxlICYmICFqcykgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIC8vIGlmIGhpZGVMb2NhbCBpcyBzZXQgdG8gdHJ1ZSwgb24gRE9NIHJlYWR5IGhpZGUgdGhlIGxvY2FsIGNvbnRlbnQgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCBpbiB0aGUgY2x1ZVRpcAogICAgICBpZiAob3B0cy5sb2NhbCAmJiBvcHRzLmxvY2FsUHJlZml4KSB7dGlwQXR0cmlidXRlID0gb3B0cy5sb2NhbFByZWZpeCArIHRpcEF0dHJpYnV0ZTt9CiAgICAgIGlmIChvcHRzLmxvY2FsICYmIG9wdHMuaGlkZUxvY2FsICYmIHRpcEF0dHJpYnV0ZSkgeyAkKHRpcEF0dHJpYnV0ZSArICc6Zmlyc3QnKS5oaWRlKCk7IH0KCiAgICAgIHZhciB0T2Zmc2V0ID0gcGFyc2VJbnQob3B0cy50b3BPZmZzZXQsIDEwKSwgbE9mZnNldCA9IHBhcnNlSW50KG9wdHMubGVmdE9mZnNldCwgMTApOwogICAgICAvLyB2ZXJ0aWNhbCBtZWFzdXJlbWVudCB2YXJpYWJsZXMKICAgICAgdmFyIHRpcEhlaWdodCwgd0hlaWdodCwKICAgICAgICAgIGRlZkhlaWdodCA9IGlzTmFOKHBhcnNlSW50KG9wdHMuaGVpZ2h0LCAxMCkpID8gJ2F1dG8nIDogKC9cRC9nKS50ZXN0KG9wdHMuaGVpZ2h0KSA/IG9wdHMuaGVpZ2h0IDogb3B0cy5oZWlnaHQgKyAncHgnOwogICAgICB2YXIgc1RvcCwgbGlua1RvcCwgbGlua0JvdHRvbSwgcG9zWSwgdGlwWSwgbW91c2VZLCBiYXNlbGluZTsKICAgICAgLy8gaG9yaXpvbnRhbCBtZWFzdXJlbWVudCB2YXJpYWJsZXMKICAgICAgdmFyIHRpcElubmVyV2lkdGggPSBwYXJzZUludChvcHRzLndpZHRoLCAxMCkgfHwgMjc1LAogICAgICAgICAgdGlwV2lkdGggPSB0aXBJbm5lcldpZHRoICsgY2x1ZXRpcFBhZGRpbmcgKyBvcHRzLmRyb3BTaGFkb3dTdGVwcywKICAgICAgICAgIGxpbmtXaWR0aCA9IHRoaXMub2Zmc2V0V2lkdGgsCiAgICAgICAgICBsaW5rTGVmdCwgcG9zWCwgdGlwWCwgbW91c2VYLCB3aW5XaWR0aDsKCiAgICAgIC8vIHBhcnNlIHRoZSB0aXRsZQogICAgICB2YXIgdGlwUGFydHM7CiAgICAgIHZhciB0aXBUaXRsZSA9IChvcHRzLmF0dHJpYnV0ZSAhPSAndGl0bGUnKSA/ICRsaW5rLmF0dHIob3B0cy50aXRsZUF0dHJpYnV0ZSkgfHwgJycgOiAnJzsKICAgICAgaWYgKG9wdHMuc3BsaXRUaXRsZSkgewogICAgICAgIHRpcFBhcnRzID0gdGlwVGl0bGUuc3BsaXQob3B0cy5zcGxpdFRpdGxlKTsKICAgICAgICB0aXBUaXRsZSA9IG9wdHMuc2hvd1RpdGxlIHx8IHRpcFBhcnRzWzBdID09PSAnJyA/IHRpcFBhcnRzLnNoaWZ0KCkgOiAnJzsKICAgICAgfQogICAgICBpZiAob3B0cy5lc2NhcGVUaXRsZSkgewogICAgICAgIHRpcFRpdGxlID0gdGlwVGl0bGUucmVwbGFjZSgvJi9nLCcmYW1wOycpLnJlcGxhY2UoLz4vZywnJmd0OycpLnJlcGxhY2UoLzwvZywnJmx0OycpOwogICAgICB9CgogICAgICB2YXIgbG9jYWxDb250ZW50OwogICAgICBmdW5jdGlvbiByZXR1cm5GYWxzZSgpIHsgcmV0dXJuIGZhbHNlOyB9CgogICAgICAvLyBLZWVwIHRyYWNrIG9mIG1vdXNlIGVudGVyZWQgc3RhdGUgb24gbGluawogICAgICAkbGluay5iaW5kKCdtb3VzZWVudGVyIG1vdXNlbGVhdmUnLCBmdW5jdGlvbihldmVudCkgewogICAgICAgIHZhciBkYXRhID0gJGxpbmsuZGF0YSgnY2x1ZXRpcCcpOwogICAgICAgIGRhdGEuZW50ZXJlZCA9IGV2ZW50LnR5cGUgPT09ICdlbnRlcmVkJzsKICAgICAgICAkbGluay5kYXRhKCdjbHVldGlwJywgZGF0YSk7CiAgICAgIH0pOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIEFDVElWQVRJT04KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8vYWN0aXZhdGUgY2x1ZVRpcAogICAgdmFyIGFjdGl2YXRlID0gZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgdmFyIHBZLCBhamF4TWVyZ2VkU2V0dGluZ3MsIGNhY2hlS2V5LAogICAgICAgICAgY29udGludWVPbiA9IG9wdHMub25BY3RpdmF0ZS5jYWxsKGxpbmssIGV2ZW50KTsKCiAgICAgIGlmIChjb250aW51ZU9uID09PSBmYWxzZSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQoKICAgICAgaXNBY3RpdmUgPSB0cnVlOwoKICAgICAgLy8gYWN0aXZhdGUgZnVuY3Rpb24gbWF5IGdldCBjYWxsZWQgYWZ0ZXIgYW4gaW5pdGlhbGl6YXRpb24gb2YgYQogICAgICAvLyBkaWZmZXJlbnQgdGFyZ2V0IHNvIG5lZWQgdG8gcmUtZ2V0IHRoZSBDb3JyZWN0IENsdWV0aXAgb2JqZWN0IGhlcmUKICAgICAgJGNsdWV0aXAgPSAkKGNsdWV0aXBTZWxlY3RvcikuY3NzKHtwb3NpdGlvbjogJ2Fic29sdXRlJ30pOwogICAgICAkY2x1ZXRpcE91dGVyID0gJGNsdWV0aXAuZmluZChwcmVmaXggKyAnY2x1ZXRpcC1vdXRlcicpOwogICAgICAkY2x1ZXRpcElubmVyID0gJGNsdWV0aXAuZmluZChwcmVmaXggKyAnY2x1ZXRpcC1pbm5lcicpOwogICAgICAkY2x1ZXRpcFRpdGxlID0gJGNsdWV0aXAuZmluZChwcmVmaXggKyAnY2x1ZXRpcC10aXRsZScpOwogICAgICAkY2x1ZXRpcEFycm93cyA9ICRjbHVldGlwLmZpbmQocHJlZml4ICsgJ2NsdWV0aXAtYXJyb3dzJyk7CiAgICAgICRjbHVldGlwLnJlbW92ZUNsYXNzKCkuY3NzKHt3aWR0aDogdGlwSW5uZXJXaWR0aH0pOwogICAgICBpZiAodGlwQXR0cmlidXRlID09ICRsaW5rLmF0dHIoJ2hyZWYnKSkgewogICAgICAgICRsaW5rLmNzcygnY3Vyc29yJywgb3B0cy5jdXJzb3IpOwogICAgICB9CiAgICAgIGlmIChvcHRzLmhvdmVyQ2xhc3MpIHsKICAgICAgICAkbGluay5hZGRDbGFzcyhvcHRzLmhvdmVyQ2xhc3MpOwogICAgICB9CiAgICAgIGxpbmtUb3AgPSBwb3NZID0gJGxpbmsub2Zmc2V0KCkudG9wOwogICAgICBsaW5rQm90dG9tID0gbGlua1RvcCArICRsaW5rLmlubmVySGVpZ2h0KCk7CiAgICAgIGxpbmtMZWZ0ID0gJGxpbmsub2Zmc2V0KCkubGVmdDsKCiAgICAgIC8vIEZJWDogKGJ1ZyA0NDEyKQogICAgICBsaW5rV2lkdGggPSAkbGluay5pbm5lcldpZHRoKCk7CiAgICAgIGlmICggZXZlbnQudHlwZSA9PSBmb2N1cyApIHsKICAgICAgICAvLyBpbiBmb2N1cyBldmVudCwgbm8gbW91c2UgcG9zaXRpb24gaXMgYXZhaWxhYmxlOyB0aGlzIGlzIG5lZWRlZCB3aXRoIGJvdHRvbVRvcDoKICAgICAgICBtb3VzZVggPSBsaW5rTGVmdCArICAoIGxpbmtXaWR0aCAvIDIgKSArIGxPZmZzZXQ7CiAgICAgICAgJGNsdWV0aXAuY3NzKHtsZWZ0OiBwb3NYfSk7CiAgICAgICAgbW91c2VZID0gcG9zWSArIHRPZmZzZXQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbW91c2VYID0gZXZlbnQucGFnZVg7CiAgICAgICAgbW91c2VZID0gZXZlbnQucGFnZVk7CiAgICAgIH0KICAgICAgLy9FTkQgT0YgRklYCgogICAgICBpZiAobGluay50YWdOYW1lLnRvTG93ZXJDYXNlKCkgIT0gJ2FyZWEnKSB7CiAgICAgICAgc1RvcCA9ICQoZG9jdW1lbnQpLnNjcm9sbFRvcCgpOwogICAgICAgIHdpbldpZHRoID0gJCh3aW5kb3cpLndpZHRoKCk7CiAgICAgIH0KLy8gcG9zaXRpb24gY2x1ZVRpcCBob3Jpem9udGFsbHkKICAgICAgaWYgKG9wdHMucG9zaXRpb25CeSA9PSAnZml4ZWQnKSB7CiAgICAgICAgcG9zWCA9IGxpbmtXaWR0aCArIGxpbmtMZWZ0ICsgbE9mZnNldDsKICAgICAgICAkY2x1ZXRpcC5jc3Moe2xlZnQ6IHBvc1h9KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBwb3NYID0gKGxpbmtXaWR0aCA+IGxpbmtMZWZ0ICYmIGxpbmtMZWZ0ID4gdGlwV2lkdGgpIHx8CiAgICAgICAgICBsaW5rTGVmdCArIGxpbmtXaWR0aCArIHRpcFdpZHRoICsgbE9mZnNldCA+IHdpbldpZHRoID8KICAgICAgICAgIGxpbmtMZWZ0IC0gdGlwV2lkdGggLSBsT2Zmc2V0IDoKICAgICAgICAgIGxpbmtXaWR0aCArIGxpbmtMZWZ0ICsgbE9mZnNldDsKICAgICAgICBpZiAobGluay50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT0gJ2FyZWEnIHx8IG9wdHMucG9zaXRpb25CeSA9PSAnbW91c2UnIHx8IGxpbmtXaWR0aCArIHRpcFdpZHRoID4gd2luV2lkdGgpIHsgLy8gcG9zaXRpb24gYnkgbW91c2UKICAgICAgICAgIGlmIChtb3VzZVggKyAyMCArIHRpcFdpZHRoID4gd2luV2lkdGgpIHsKICAgICAgICAgICAgJGNsdWV0aXAuYWRkQ2xhc3MoJ2NsdWV0aXAtJyArIGN0Q2xhc3MpOwogICAgICAgICAgICBwb3NYID0gKG1vdXNlWCAtIHRpcFdpZHRoIC0gbE9mZnNldCkgPj0gMCA/IG1vdXNlWCAtIHRpcFdpZHRoIC0gbE9mZnNldCAtIHBhcnNlSW50KCRjbHVldGlwLmNzcygnbWFyZ2luTGVmdCcpLDEwKSArIHBhcnNlSW50KCRjbHVldGlwSW5uZXIuY3NzKCdtYXJnaW5SaWdodCcpLDEwKSA6ICBtb3VzZVggLSAodGlwV2lkdGgvMik7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBwb3NYID0gbW91c2VYICsgbE9mZnNldDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcFkgPSBwb3NYIDwgMCA/IGV2ZW50LnBhZ2VZICsgdE9mZnNldCA6IGV2ZW50LnBhZ2VZOwogICAgICAgIGlmIChwb3NYIDwgMCB8fCBvcHRzLnBvc2l0aW9uQnkgPT0gJ2JvdHRvbVRvcCcgIHx8IG9wdHMucG9zaXRpb25CeSA9PSAndG9wQm90dG9tJykgewogICAgICAgICAgcG9zWCA9IChtb3VzZVggKyAodGlwV2lkdGgvMikgPiB3aW5XaWR0aCkgPyB3aW5XaWR0aC8yIC0gdGlwV2lkdGgvMiA6IE1hdGgubWF4KG1vdXNlWCAtICh0aXBXaWR0aC8yKSwwKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgICRjbHVldGlwQXJyb3dzLmNzcyh7ekluZGV4OiAkbGluay5kYXRhKCdjbHVldGlwJykuekluZGV4KzF9KTsKICAgICAgJGNsdWV0aXAuY3NzKHsKICAgICAgICBsZWZ0OiBwb3NYLAogICAgICAgIHpJbmRleDogJGxpbmsuZGF0YSgnY2x1ZXRpcCcpLnpJbmRleAogICAgICB9KTsKICAgICAgd0hlaWdodCA9ICQod2luZG93KS5oZWlnaHQoKTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBsb2FkIGEgc3RyaW5nIGZyb20gY2x1ZXRpcCBtZXRob2QncyBmaXJzdCBhcmd1bWVudAoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgICAgIGlmIChqcykgewogICAgICAgIGlmICh0eXBlb2YganMgPT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAganMgPSBqcy5jYWxsKGxpbmspOwogICAgICAgIH0KICAgICAgICAkY2x1ZXRpcElubmVyLmh0bWwoanMpOwogICAgICAgIGNsdWV0aXBTaG93KHBZKTsKICAgICAgfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogbG9hZCB0aGUgdGl0bGUgYXR0cmlidXRlIG9ubHkgKG9yIHVzZXItc2VsZWN0ZWQgYXR0cmlidXRlKS4KKiBjbHVlVGlwIHRpdGxlIGlzIHRoZSBzdHJpbmcgYmVmb3JlIHRoZSBmaXJzdCBkZWxpbWl0ZXIKKiBzdWJzZXF1ZW50IGRlbGltaXRlcnMgcGxhY2UgY2x1ZVRpcCBib2R5IHRleHQgb24gc2VwYXJhdGUgbGluZXMKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKICAgICAgZWxzZSBpZiAodGlwUGFydHMpIHsKICAgICAgICB2YXIgdHBsID0gdGlwUGFydHMubGVuZ3RoOwogICAgICAgICRjbHVldGlwSW5uZXIuaHRtbCh0cGwgPyB0aXBQYXJ0c1swXSA6ICcnKTsKICAgICAgICBpZiAodHBsID4gMSkgewogICAgICAgICAgZm9yICh2YXIgaT0xOyBpIDwgdHBsOyBpKyspewogICAgICAgICAgICAkY2x1ZXRpcElubmVyLmFwcGVuZCgnPGRpdiBjbGFzcz0ic3BsaXQtYm9keSI+JyArIHRpcFBhcnRzW2ldICsgJzwvZGl2PicpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjbHVldGlwU2hvdyhwWSk7CiAgICAgIH0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGxvYWQgZXh0ZXJuYWwgZmlsZSB2aWEgYWpheAoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgogICAgICBlbHNlIGlmICggIW9wdHMubG9jYWwgJiYgdGlwQXR0cmlidXRlLmluZGV4T2YoJyMnKSAhPT0gMCApIHsKICAgICAgICBpZiAoL1wuKGpwZT9nfHRpZmY/fGdpZnxwbmcpKD86XD8uKik/JC9pLnRlc3QodGlwQXR0cmlidXRlKSkgewogICAgICAgICAgJGNsdWV0aXBJbm5lci5odG1sKCc8aW1nIHNyYz0iJyArIHRpcEF0dHJpYnV0ZSArICciIGFsdD0iJyArIHRpcFRpdGxlICsgJyIgLz4nKTsKICAgICAgICAgIGNsdWV0aXBTaG93KHBZKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdmFyIG9wdGlvbkJlZm9yZVNlbmQgPSBvcHRzLmFqYXhTZXR0aW5ncy5iZWZvcmVTZW5kLAogICAgICAgICAgICAgIG9wdGlvbkVycm9yID0gb3B0cy5hamF4U2V0dGluZ3MuZXJyb3IsCiAgICAgICAgICAgICAgb3B0aW9uU3VjY2VzcyA9IG9wdHMuYWpheFNldHRpbmdzLnN1Y2Nlc3MsCiAgICAgICAgICAgICAgb3B0aW9uQ29tcGxldGUgPSBvcHRzLmFqYXhTZXR0aW5ncy5jb21wbGV0ZTsKCiAgICAgICAgICBjYWNoZUtleSA9IGdldENhY2hlS2V5KHRpcEF0dHJpYnV0ZSwgb3B0cy5hamF4U2V0dGluZ3MuZGF0YSk7CgogICAgICAgICAgdmFyIGFqYXhTZXR0aW5ncyA9IHsKICAgICAgICAgICAgY2FjaGU6IG9wdHMuYWpheENhY2hlLCAvLyBmb3JjZSByZXF1ZXN0ZWQgcGFnZSBub3QgdG8gYmUgY2FjaGVkIGJ5IGJyb3dzZXIKICAgICAgICAgICAgdXJsOiB0aXBBdHRyaWJ1dGUsCiAgICAgICAgICAgIGJlZm9yZVNlbmQ6IGZ1bmN0aW9uKHhociwgc2V0dGluZ3MpIHsKICAgICAgICAgICAgICBpZiAob3B0aW9uQmVmb3JlU2VuZCkge29wdGlvbkJlZm9yZVNlbmQuY2FsbChsaW5rLCB4aHIsICRjbHVldGlwLCAkY2x1ZXRpcElubmVyLCBzZXR0aW5ncyk7fQogICAgICAgICAgICAgICRjbHVldGlwT3V0ZXIuY2hpbGRyZW4oKS5lbXB0eSgpOwogICAgICAgICAgICAgIGlmIChvcHRzLndhaXRJbWFnZSkgewogICAgICAgICAgICAgICAgJGNsdWV0aXBXYWl0CiAgICAgICAgICAgICAgICAuY3NzKHt0b3A6IG1vdXNlWSsyMCwgbGVmdDogbW91c2VYKzIwLCB6SW5kZXg6ICRsaW5rLmRhdGEoJ2NsdWV0aXAnKS56SW5kZXgtMX0pCiAgICAgICAgICAgICAgICAuc2hvdygpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgZXJyb3I6IGZ1bmN0aW9uKHhociwgdGV4dFN0YXR1cykgewogICAgICAgICAgICAgIGlmICggb3B0aW9ucy5hamF4Q2FjaGUgJiYgIWNhY2hlc1tjYWNoZUtleV0gKSB7CiAgICAgICAgICAgICAgICBjYWNoZXNbY2FjaGVLZXldID0ge3N0YXR1czogJ2Vycm9yJywgdGV4dFN0YXR1czogdGV4dFN0YXR1cywgeGhyOiB4aHJ9OwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgaWYgKGlzQWN0aXZlKSB7CiAgICAgICAgICAgICAgICBpZiAob3B0aW9uRXJyb3IpIHsKICAgICAgICAgICAgICAgICAgb3B0aW9uRXJyb3IuY2FsbChsaW5rLCB4aHIsIHRleHRTdGF0dXMsICRjbHVldGlwLCAkY2x1ZXRpcElubmVyKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICRjbHVldGlwSW5uZXIuaHRtbCgnPGk+c29ycnksIHRoZSBjb250ZW50cyBjb3VsZCBub3QgYmUgbG9hZGVkPC9pPicpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24oZGF0YSwgdGV4dFN0YXR1cywgeGhyKSB7CiAgICAgICAgICAgICAgaWYgKCBvcHRpb25zLmFqYXhDYWNoZSAmJiAhY2FjaGVzW2NhY2hlS2V5XSApIHsKICAgICAgICAgICAgICAgIGNhY2hlc1tjYWNoZUtleV0gPSB7c3RhdHVzOiAnc3VjY2VzcycsIGRhdGE6IGRhdGEsIHRleHRTdGF0dXM6IHRleHRTdGF0dXMsIHhocjogeGhyfTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIGNsdWV0aXBDb250ZW50cyA9IG9wdHMuYWpheFByb2Nlc3MuY2FsbChsaW5rLCBkYXRhKTsKCiAgICAgICAgICAgICAgLy8gYWxsb3cgZm9yIGNoYW5naW5nIHRoZSB0aXRsZSBiYXNlZCBvbiBkYXRhIHJldHVybmVkIGJ5IHhocgogICAgICAgICAgICAgIGlmICggdHlwZW9mIGNsdWV0aXBDb250ZW50cyA9PSAnb2JqZWN0JyAmJiBjbHVldGlwQ29udGVudHMgIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICB0aXBUaXRsZSA9IGNsdWV0aXBDb250ZW50cy50aXRsZTsKICAgICAgICAgICAgICAgIGNsdWV0aXBDb250ZW50cyA9IGNsdWV0aXBDb250ZW50cy5jb250ZW50OwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgaWYgKGlzQWN0aXZlKSB7CiAgICAgICAgICAgICAgICBpZiAob3B0aW9uU3VjY2VzcykgewogICAgICAgICAgICAgICAgICBvcHRpb25TdWNjZXNzLmNhbGwobGluaywgZGF0YSwgdGV4dFN0YXR1cywgJGNsdWV0aXAsICRjbHVldGlwSW5uZXIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJGNsdWV0aXBJbm5lci5odG1sKGNsdWV0aXBDb250ZW50cyk7CgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgY29tcGxldGU6IGZ1bmN0aW9uKHhociwgdGV4dFN0YXR1cykgewogICAgICAgICAgICAgIGlmIChvcHRpb25Db21wbGV0ZSkgewogICAgICAgICAgICAgICAgb3B0aW9uQ29tcGxldGUuY2FsbChsaW5rLCB4aHIsIHRleHRTdGF0dXMsICRjbHVldGlwLCAkY2x1ZXRpcElubmVyKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgdmFyIGltZ3MgPSAkY2x1ZXRpcElubmVyWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpbWcnKTsKICAgICAgICAgICAgICBpbWdDb3VudCA9IGltZ3MubGVuZ3RoOwogICAgICAgICAgICAgIGZvciAodmFyIGk9MCwgbCA9IGltZ3MubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgICAgICAgICAgICBpZiAoaW1nc1tpXS5jb21wbGV0ZSkgewogICAgICAgICAgICAgICAgICBpbWdDb3VudC0tOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAoaW1nQ291bnQgJiYgISQuYnJvd3Nlci5vcGVyYSkgewogICAgICAgICAgICAgICAgJChpbWdzKS5iaW5kKCdsb2FkLmN0IGVycm9yLmN0JywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgIGltZ0NvdW50LS07CiAgICAgICAgICAgICAgICAgIGlmIChpbWdDb3VudCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICRjbHVldGlwV2FpdC5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgJChpbWdzKS51bmJpbmQoJy5jdCcpOwogICAgICAgICAgICAgICAgICAgIGlmIChpc0FjdGl2ZSkgeyBjbHVldGlwU2hvdyhwWSk7IH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRjbHVldGlwV2FpdC5oaWRlKCk7CiAgICAgICAgICAgICAgICBpZiAoaXNBY3RpdmUpIHsgY2x1ZXRpcFNob3cocFkpOyB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9OwoKICAgICAgICAgIGFqYXhNZXJnZWRTZXR0aW5ncyA9ICQuZXh0ZW5kKHRydWUsIHt9LCBvcHRzLmFqYXhTZXR0aW5ncywgYWpheFNldHRpbmdzKTsKCiAgICAgICAgICBpZiAoIGNhY2hlc1tjYWNoZUtleV0gKSB7CiAgICAgICAgICAgIGNhY2hlZEFqYXgoIGNhY2hlc1tjYWNoZUtleV0sIGFqYXhNZXJnZWRTZXR0aW5ncyApOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJC5hamF4KGFqYXhNZXJnZWRTZXR0aW5ncyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBsb2FkIGFuIGVsZW1lbnQgZnJvbSB0aGUgc2FtZSBwYWdlCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAgICAgZWxzZSBpZiAob3B0cy5sb2NhbCkgewogICAgICAgIHZhciAkbG9jYWxDb250ZW50ID0gJCh0aXBBdHRyaWJ1dGUgKyAoL14jXFMrJC8udGVzdCh0aXBBdHRyaWJ1dGUpID8gJycgOiAnOmVxKCcgKyBpbmRleCArICcpJykpLmNsb25lKHRydWUpLnNob3coKTsKICAgICAgICBpZiAob3B0cy5sb2NhbElkU3VmZml4KSB7CiAgICAgICAgICAkbG9jYWxDb250ZW50LmF0dHIoJ2lkJywgJGxvY2FsQ29udGVudFswXS5pZCArIG9wdHMubG9jYWxJZFN1ZmZpeCk7CiAgICAgICAgfQogICAgICAgICRjbHVldGlwSW5uZXIuaHRtbCgkbG9jYWxDb250ZW50KTsKICAgICAgICBjbHVldGlwU2hvdyhwWSk7CiAgICAgIH0KICAgIH07CgovLyBnZXQgZGltZW5zaW9ucyBhbmQgb3B0aW9ucyBmb3IgY2x1ZXRpcCBhbmQgcHJlcGFyZSBpdCB0byBiZSBzaG93bgogICAgdmFyIGNsdWV0aXBTaG93ID0gZnVuY3Rpb24oYnBZKSB7CiAgICAgIHZhciAkY2xvc2VMaW5rLCBkeW5hbWljQ2xhc3NlcywgaGVpZ2h0RGlmZiwKICAgICAgICAgIHRpdGxlSFRNTCA9IHRpcFRpdGxlIHx8IG9wdHMuc2hvd1RpdGxlICYmICcmbmJzcDsnLAogICAgICAgICAgYmdZID0gJycsIGRpcmVjdGlvbiA9ICcnLCBpbnN1ZmZpY2llbnRYID0gZmFsc2U7CiAgICAgIHZhciBzdGlja3lDbG9zZSA9IHsKICAgICAgICBib3R0b206IGZ1bmN0aW9uKCRjTGluaykgewogICAgICAgICAgJGNMaW5rLmFwcGVuZFRvKCRjbHVldGlwSW5uZXIpOwogICAgICAgIH0sCiAgICAgICAgdG9wOiBmdW5jdGlvbigkY0xpbmspIHsKICAgICAgICAgICRjTGluay5wcmVwZW5kVG8oJGNsdWV0aXBJbm5lcik7CiAgICAgICAgfSwKICAgICAgICB0aXRsZTogZnVuY3Rpb24oJGNMaW5rKSB7CiAgICAgICAgICAkY0xpbmsucHJlcGVuZFRvKCRjbHVldGlwVGl0bGUpOwogICAgICAgIH0KICAgICAgfTsKCiAgICAgICRjbHVldGlwLmFkZENsYXNzKCdjbHVldGlwLScgKyBjdENsYXNzKTsKICAgICAgaWYgKG9wdHMudHJ1bmNhdGUpIHsKICAgICAgICB2YXIgJHRydW5jbG9hZGVkID0gJGNsdWV0aXBJbm5lci50ZXh0KCkuc2xpY2UoMCxvcHRzLnRydW5jYXRlKSArICcuLi4nOwogICAgICAgICRjbHVldGlwSW5uZXIuaHRtbCgkdHJ1bmNsb2FkZWQpOwogICAgICB9CgogICAgICBpZiAodGl0bGVIVE1MKSB7CiAgICAgICAgJGNsdWV0aXBUaXRsZS5zaG93KCkuaHRtbCh0aXRsZUhUTUwpOwogICAgICB9IGVsc2UgewogICAgICAgICRjbHVldGlwVGl0bGUuaGlkZSgpOwogICAgICB9CgogICAgICBpZiAob3B0cy5zdGlja3kpIHsKICAgICAgICBpZiAoc3RpY2t5Q2xvc2Vbb3B0cy5jbG9zZVBvc2l0aW9uXSkgewogICAgICAgICAgJGNsb3NlTGluayA9ICQoJzxkaXYgY2xhc3M9ImNsdWV0aXAtY2xvc2UiPjxhIGhyZWY9IiMiPicgKyBvcHRzLmNsb3NlVGV4dCArICc8L2E+PC9kaXY+Jyk7CiAgICAgICAgICBzdGlja3lDbG9zZVtvcHRzLmNsb3NlUG9zaXRpb25dKCAkY2xvc2VMaW5rICk7CiAgICAgICAgICAkY2xvc2VMaW5rLmJpbmQoJ2NsaWNrLmNsdWV0aXAnLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgY2x1ZXRpcENsb3NlKCk7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBpZiAob3B0cy5tb3VzZU91dENsb3NlKSB7CiAgICAgICAgICAkbGluay51bmJpbmQoJ21vdXNlbGVhdmUuY2x1ZXRpcE1vYycpOwogICAgICAgICAgJGNsdWV0aXAudW5iaW5kKCdtb3VzZWxlYXZlLmNsdWV0aXBNb2MnKTsKICAgICAgICAgIGlmIChvcHRzLm1vdXNlT3V0Q2xvc2UgPT0gJ2JvdGgnIHx8IG9wdHMubW91c2VPdXRDbG9zZSA9PSAnY2x1ZXRpcCcgfHwgb3B0cy5tb3VzZU91dENsb3NlID09PSB0cnVlKSB7IC8vIHRydWUgaW1wbGllcyAnY2x1ZXRpcCcgZm9yIGJhY2t3YXJkcyBjb21wYXRhYmlsaXR5CiAgICAgICAgICAgICRjbHVldGlwLmJpbmQoJ21vdXNlbGVhdmUuY2x1ZXRpcE1vYycsIG1vdXNlT3V0Q2xvc2UpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKG9wdHMubW91c2VPdXRDbG9zZSA9PSAnYm90aCcgfHwgb3B0cy5tb3VzZU91dENsb3NlID09ICdsaW5rJykgewogICAgICAgICAgICAkbGluay5iaW5kKCdtb3VzZWxlYXZlLmNsdWV0aXBNb2MnLCBtb3VzZU91dENsb3NlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCi8vIG5vdyB0aGF0IGNvbnRlbnQgaXMgbG9hZGVkLCBmaW5pc2ggdGhlIHBvc2l0aW9uaW5nCiAgICAgICRjbHVldGlwT3V0ZXIuY3NzKHt6SW5kZXg6ICRsaW5rLmRhdGEoJ2NsdWV0aXAnKS56SW5kZXgsIG92ZXJmbG93OiBkZWZIZWlnaHQgPT0gJ2F1dG8nID8gJ3Zpc2libGUnIDogJ2F1dG8nLCBoZWlnaHQ6IGRlZkhlaWdodH0pOwogICAgICB0aXBIZWlnaHQgPSBkZWZIZWlnaHQgPT0gJ2F1dG8nID8gTWF0aC5tYXgoJGNsdWV0aXAub3V0ZXJIZWlnaHQoKSwkY2x1ZXRpcC5oZWlnaHQoKSkgOiBwYXJzZUludChkZWZIZWlnaHQsMTApOwogICAgICB0aXBZID0gcG9zWTsKICAgICAgYmFzZWxpbmUgPSBzVG9wICsgd0hlaWdodDsKICAgICAgaW5zdWZmaWNpZW50WCA9IChwb3NYIDwgbW91c2VYICYmIChNYXRoLm1heChwb3NYLCAwKSArIHRpcFdpZHRoID4gbW91c2VYKSk7CiAgICAgIGlmIChvcHRzLnBvc2l0aW9uQnkgPT0gJ2ZpeGVkJykgewogICAgICAgIHRpcFkgPSBwb3NZIC0gb3B0cy5kcm9wU2hhZG93U3RlcHMgKyB0T2Zmc2V0OwogICAgICB9IGVsc2UgaWYgKG9wdHMucG9zaXRpb25CeSA9PSAndG9wQm90dG9tJyB8fCBvcHRzLnBvc2l0aW9uQnkgPT0gJ2JvdHRvbVRvcCcgfHwgaW5zdWZmaWNpZW50WCkgewogICAgICAgIGlmIChvcHRzLnBvc2l0aW9uQnkgPT0gJ3RvcEJvdHRvbScpIHsKICAgICAgICAgIGlmIChwb3NZICsgdGlwSGVpZ2h0ICsgdE9mZnNldCA8IGJhc2VsaW5lICYmIG1vdXNlWSAtIHNUb3AgPCB0aXBIZWlnaHQgKyB0T2Zmc2V0KSB7CiAgICAgICAgICAgIGRpcmVjdGlvbiA9ICdib3R0b20nOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZGlyZWN0aW9uID0gJ3RvcCc7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChvcHRzLnBvc2l0aW9uQnkgPT0gJ2JvdHRvbVRvcCcgfHwgaW5zdWZmaWNpZW50WCkgewogICAgICAgICAgaWYgKHBvc1kgKyB0aXBIZWlnaHQgKyB0T2Zmc2V0ID4gYmFzZWxpbmUgJiYgbW91c2VZIC0gc1RvcCA+IHRpcEhlaWdodCArIHRPZmZzZXQpIHsKICAgICAgICAgICAgZGlyZWN0aW9uID0gJ3RvcCc7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBkaXJlY3Rpb24gPSAnYm90dG9tJzsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gV2Ugc2hvdWxkIG5vdyBoYXZlIGEgZGlyZWN0aW9uLiBDb21wdXRlIHRpcFkKICAgICAgICBpZiAob3B0cy5zbmFwVG9FZGdlKSB7CiAgICAgICAgICBpZiAoZGlyZWN0aW9uID09ICd0b3AnKSB7CiAgICAgICAgICAgIHRpcFkgPSBsaW5rVG9wIC0gdGlwSGVpZ2h0IC0gdE9mZnNldDsKICAgICAgICAgIH0gZWxzZSBpZiAoZGlyZWN0aW9uID09ICdib3R0b20nKSB7CiAgICAgICAgICAgIHRpcFkgPSBsaW5rQm90dG9tICsgdE9mZnNldDsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSAndG9wJykgewogICAgICAgICAgICB0aXBZID0gbW91c2VZIC0gdGlwSGVpZ2h0IC0gdE9mZnNldDsKICAgICAgICAgIH0gZWxzZSBpZiAoZGlyZWN0aW9uID09ICdib3R0b20nKSB7CiAgICAgICAgICAgIHRpcFkgPSBtb3VzZVkgKyB0T2Zmc2V0OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIGlmICggcG9zWSArIHRpcEhlaWdodCArIHRPZmZzZXQgPiBiYXNlbGluZSApIHsKICAgICAgICB0aXBZID0gKHRpcEhlaWdodCA+PSB3SGVpZ2h0KSA/IHNUb3AgOiBiYXNlbGluZSAtIHRpcEhlaWdodCAtIHRPZmZzZXQ7CiAgICAgIH0gZWxzZSBpZiAoJGxpbmsuY3NzKCdkaXNwbGF5JykgPT0gJ2Jsb2NrJyB8fCBsaW5rLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PSAnYXJlYScgfHwgb3B0cy5wb3NpdGlvbkJ5ID09ICJtb3VzZSIpIHsKICAgICAgICB0aXBZID0gYnBZIC0gdE9mZnNldDsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aXBZID0gcG9zWSAtIG9wdHMuZHJvcFNoYWRvd1N0ZXBzOwogICAgICB9CiAgICAgIGlmIChkaXJlY3Rpb24gPT09ICcnKSB7CiAgICAgICAgZGlyZWN0aW9uID0gcG9zWCA8IGxpbmtMZWZ0ID8gJ2xlZnQnIDogICdyaWdodCc7CiAgICAgIH0KICAgICAgLy8gYWRkIGNsYXNzZXMKICAgICAgZHluYW1pY0NsYXNzZXMgPSAnIGNsdWUtJyArIGRpcmVjdGlvbiArICctJyArIGN0Q2xhc3MgKyAnIGNsdWV0aXAtJyArIGN0Q2xhc3M7CiAgICAgIGlmIChjdENsYXNzID09ICdyb3VuZGVkJykgewogICAgICAgIGR5bmFtaWNDbGFzc2VzICs9ICcgdWktY29ybmVyLWFsbCc7CiAgICAgIH0KICAgICAgJGNsdWV0aXAuY3NzKHt0b3A6IHRpcFkgKyAncHgnfSkuYXR0clByb3AoeydjbGFzc05hbWUnOiBzdGFuZGFyZENsYXNzZXMgKyBkeW5hbWljQ2xhc3Nlc30pOwogICAgICAvLyBzZXQgdXAgYXJyb3cgcG9zaXRpb25pbmcgdG8gYWxpZ24gd2l0aCBlbGVtZW50CiAgICAgIGlmIChvcHRzLmFycm93cykgewogICAgICAgIGlmICggLyhsZWZ0fHJpZ2h0KS8udGVzdChkaXJlY3Rpb24pICkgewogICAgICAgICAgaGVpZ2h0RGlmZiA9ICRjbHVldGlwLmhlaWdodCgpIC0gJGNsdWV0aXBBcnJvd3MuaGVpZ2h0KCk7CiAgICAgICAgICBiZ1kgPSBwb3NYID49IDAgJiYgYnBZID4gMCA/IChwb3NZIC0gdGlwWSAtIG9wdHMuZHJvcFNoYWRvd1N0ZXBzKSA6IDA7CiAgICAgICAgICBiZ1kgPSBoZWlnaHREaWZmID4gYmdZID8gYmdZIDogaGVpZ2h0RGlmZjsKICAgICAgICAgIGJnWSArPSAncHgnOwogICAgICAgIH0KICAgICAgICAkY2x1ZXRpcEFycm93cy5jc3Moe3RvcDogYmdZfSkuc2hvdygpOwogICAgICB9IGVsc2UgewogICAgICAgICRjbHVldGlwQXJyb3dzLmhpZGUoKTsKICAgICAgfQoKLy8gKGZpcnN0IGhpZGUsIHRoZW4pICoqKlNIT1cgVEhFIENMVUVUSVAqKioKICAgICAgLy8gaGFuZGxlIGRyb3BzaGFkb3cgZGl2cyBmaXJzdAogICAgICAkZHJvcFNoYWRvdyA9IGNyZWF0ZURyb3BTaGFkb3dzKCRjbHVldGlwLCBvcHRzKTsKICAgICAgaWYgKCRkcm9wU2hhZG93ICYmICRkcm9wU2hhZG93Lmxlbmd0aCkgewogICAgICAgICRkcm9wU2hhZG93LmhpZGUoKS5jc3Moe2hlaWdodDogdGlwSGVpZ2h0LCB3aWR0aDogdGlwSW5uZXJXaWR0aCwgekluZGV4OiAkbGluay5kYXRhKCdjbHVldGlwJykuekluZGV4LTF9KS5zaG93KCk7CiAgICAgIH0KCiAgICAgIGlmICghY2xvc2VPbkRlbGF5KSB7CiAgICAgICAgJGNsdWV0aXAuaGlkZSgpOwogICAgICB9CiAgICAgIGNsZWFyVGltZW91dChjbG9zZU9uRGVsYXkpOwogICAgICBjbG9zZU9uRGVsYXkgPSBudWxsOwoKICAgICAgLy8gc2hvdyB0aGUgY2x1ZXRpcAogICAgICAkY2x1ZXRpcFtvcHRzLmZ4Lm9wZW5dKG9wdHMuZngub3BlblNwZWVkIHx8IDApOwoKICAgICAgaWYgKCQuZm4uYmdpZnJhbWUpIHsgJGNsdWV0aXAuYmdpZnJhbWUoKTsgfQoKICAgICAgLy8gdHJpZ2dlciB0aGUgb3B0aW9uYWwgb25TaG93IGZ1bmN0aW9uCiAgICAgIG9wdHMub25TaG93LmNhbGwobGluaywgJGNsdWV0aXAsICRjbHVldGlwSW5uZXIpOwogICAgfTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgPUlOQUNUSVZBVElPTgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogICAgdmFyIGluYWN0aXZhdGUgPSBmdW5jdGlvbihldmVudCkgewogICAgICBpc0FjdGl2ZSA9IGZhbHNlOwogICAgICAkY2x1ZXRpcFdhaXQuaGlkZSgpOwogICAgICBpZiAoIW9wdHMuc3RpY2t5IHx8ICgvY2xpY2t8dG9nZ2xlLykudGVzdChvcHRzLmFjdGl2YXRpb24pICkgewogICAgICAgIC8vIGRlbGF5ZWQgY2xvc2UgKG5vdCBmdWxseSB0ZXN0ZWQpCiAgICAgICAgaWYgKG9wdHMuZGVsYXllZENsb3NlID4gMCkgewogICAgICAgICAgY2xlYXJUaW1lb3V0KGNsb3NlT25EZWxheSk7CiAgICAgICAgICBjbG9zZU9uRGVsYXkgPSBudWxsOwogICAgICAgICAgY2xvc2VPbkRlbGF5ID0gc2V0VGltZW91dChjbHVldGlwQ2xvc2UsIG9wdHMuZGVsYXllZENsb3NlKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGlmIChvcHRzLmhvdmVyQ2xhc3MpIHsKICAgICAgICAkbGluay5yZW1vdmVDbGFzcyhvcHRzLmhvdmVyQ2xhc3MpOwogICAgICB9CiAgICB9OwoKICAgIC8vIGNsb3NlIGNsdWV0aXAgYW5kIHJlc2V0IHNvbWUgdGhpbmdzCiAgICB2YXIgY2x1ZXRpcENsb3NlID0gZnVuY3Rpb24oZWwpIHsKICAgICAgdmFyICRjbG9zZXIgPSBlbCAmJiBlbC5kYXRhKCdjbHVldGlwJykgPyBlbCA6ICRsaW5rLAogICAgICAgICAgY3QgPSAkY2xvc2VyLmRhdGEoJ2NsdWV0aXAnKSAmJiAkY2xvc2VyLmRhdGEoJ2NsdWV0aXAnKS5zZWxlY3RvciwKICAgICAgICAgIGN0U2VsZWN0b3IgPSBjdCB8fCAnZGl2LmNsdWV0aXAnLAogICAgICAgICAgJGNsdWV0aXAgPSAkKGN0U2VsZWN0b3IpLAogICAgICAgICAgJGNsdWV0aXBJbm5lciA9ICRjbHVldGlwLmZpbmQocHJlZml4ICsgJ2NsdWV0aXAtaW5uZXInKSwKICAgICAgICAgICRjbHVldGlwQXJyb3dzID0gJGNsdWV0aXAuZmluZChwcmVmaXggKyAnY2x1ZXRpcC1hcnJvd3MnKTsKCiAgICAgICRjbHVldGlwLmhpZGUoKS5yZW1vdmVDbGFzcygpOwogICAgICBvcHRzLm9uSGlkZS5jYWxsKCRjbG9zZXJbMF0sICRjbHVldGlwLCAkY2x1ZXRpcElubmVyKTsKCiAgICAgIGlmIChjdCkgewogICAgICAgICRjbG9zZXIucmVtb3ZlQ2xhc3MoJ2NsdWV0aXAtY2xpY2tlZCcpOwogICAgICAgICRjbG9zZXIuY3NzKCdjdXJzb3InLCcnKTsKICAgICAgfQogICAgICBpZiAoY3QgJiYgdGlwVGl0bGUpIHsKICAgICAgICAkY2xvc2VyLmF0dHJQcm9wKG9wdHMudGl0bGVBdHRyaWJ1dGUsIHRpcFRpdGxlKTsKICAgICAgfQoKICAgICAgaWYgKG9wdHMuYXJyb3dzKSB7CiAgICAgICAgJGNsdWV0aXBBcnJvd3MuY3NzKHt0b3A6ICcnfSk7CiAgICAgIH0KICAgIH07CgogICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHdlIHNob3VsZCBiZSBjbG9zaW5nIGJ5IGNoZWNraW5nIHdoZXJlIHRoZSB1c2VyIGlzIGhvdmVyaW5nLgogICAgLy8gV2UgZG8gYSBzaG9ydCA1MG1zIGRlbGF5IGZvciB0d28gcmVhc29uczogdG8gcHJldmVudCBmbGlja2VyLCBhbmQgdG8gYWxsb3cgdGhlIHVzZXIgdGltZSB0byBob3ZlciBvbiBvdGhlciBlbGVtZW50CiAgICB2YXIgbW91c2VPdXRDbG9zZSA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgZWwgPSB0aGlzOwogICAgICBjbGVhclRpbWVvdXQoY2xvc2VPbkRlbGF5KTsKICAgICAgY2xvc2VPbkRlbGF5ID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICB2YXIgbGlua092ZXIgPSAkbGluay5kYXRhKCdjbHVldGlwJykuZW50ZXJlZCwKICAgICAgICAgICAgY2x1ZXRpcE92ZXIgPSAkY2x1ZXRpcC5kYXRhKCdlbnRlcmVkJyksCiAgICAgICAgICAgIGVudGVyZWQgPSBmYWxzZTsKCiAgICAgICAgaWYgKCBvcHRzLm1vdXNlT3V0Q2xvc2UgPT0gJ2JvdGgnICYmIChsaW5rT3ZlciB8fCBjbHVldGlwT3ZlcikgKSB7CiAgICAgICAgICBlbnRlcmVkID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgLy8gdHJ1ZSBpbXBsaWVzICdjbHVldGlwJyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKICAgICAgICBlbHNlIGlmICggKG9wdHMubW91c2VPdXRDbG9zZSA9PT0gdHJ1ZSB8fCBvcHRzLm1vdXNlT3V0Q2xvc2UgPT0gJ2NsdWV0aXAnKSAmJiBjbHVldGlwT3ZlcikgewogICAgICAgICAgZW50ZXJlZCA9IHRydWU7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKG9wdHMubW91c2VPdXRDbG9zZSA9PSAnbGluaycgJiYgbGlua092ZXIpIHsKICAgICAgICAgIGVudGVyZWQgPSB0cnVlOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAhZW50ZXJlZCApIHsKICAgICAgICAgIC8vIEFsbCBjaGVja3MgcGFzcywgY2xvc2UgdGhlIGNsdWV0aXAKICAgICAgICAgIGNsdWV0aXBDbG9zZS5jYWxsKGVsKTsKICAgICAgICB9CgogICAgICB9LCBvcHRzLmRlbGF5ZWRDbG9zZSk7CiAgICB9OwoKICAgICQoZG9jdW1lbnQpLnVuYmluZCgnaGlkZUNsdWV0aXAuY2x1ZXRpcCcpLmJpbmQoJ2hpZGVDbHVldGlwLmNsdWV0aXAnLCBmdW5jdGlvbihlKSB7CiAgICAgIGNsdWV0aXBDbG9zZSggJChlLnRhcmdldCkgKTsKICAgIH0pOwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgID1CSU5EIEVWRU5UUwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogIC8vIGFjdGl2YXRlIGJ5IGNsaWNrCiAgICAgIGlmICggKC9jbGlja3x0b2dnbGUvKS50ZXN0KG9wdHMuYWN0aXZhdGlvbikgKSB7CiAgICAgICAgJGxpbmsuYmluZCgnY2xpY2suY2x1ZXRpcCcsIGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgICAgICBpZiAoJGNsdWV0aXAuaXMoJzpoaWRkZW4nKSB8fCAhJGxpbmsuaXMoJy5jbHVldGlwLWNsaWNrZWQnKSkgewogICAgICAgICAgICBhY3RpdmF0ZShldmVudCk7CiAgICAgICAgICAgICQoJy5jbHVldGlwLWNsaWNrZWQnKS5yZW1vdmVDbGFzcygnY2x1ZXRpcC1jbGlja2VkJyk7CiAgICAgICAgICAgICRsaW5rLmFkZENsYXNzKCdjbHVldGlwLWNsaWNrZWQnKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGluYWN0aXZhdGUoZXZlbnQpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0pOwogIC8vIGFjdGl2YXRlIGJ5IGZvY3VzOyBpbmFjdGl2YXRlIGJ5IGJsdXIKICAgICAgfSBlbHNlIGlmIChvcHRzLmFjdGl2YXRpb24gPT0gJ2ZvY3VzJykgewogICAgICAgICRsaW5rLmJpbmQoJ2ZvY3VzLmNsdWV0aXAnLCBmdW5jdGlvbihldmVudCkgewogICAgICAgICAgJGxpbmsuYXR0clByb3AoJ3RpdGxlJywnJyk7CiAgICAgICAgICBhY3RpdmF0ZShldmVudCk7CiAgICAgICAgfSk7CiAgICAgICAgJGxpbmsuYmluZCgnYmx1ci5jbHVldGlwJywgZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICAgICRsaW5rLmF0dHJQcm9wKCd0aXRsZScsICRsaW5rLmRhdGEoJ2NsdWV0aXAnKS50aXRsZSk7CiAgICAgICAgICBpbmFjdGl2YXRlKGV2ZW50KTsKICAgICAgICB9KTsKICAvLyBhY3RpdmF0ZSBieSBob3ZlcgogICAgICB9IGVsc2UgewoKICAgICAgICAvLyBjbGlja2luZyBpcyByZXR1cm5lZCBmYWxzZSBpZiBjbGlja1Rocm91Z2ggb3B0aW9uIGlzIHNldCB0byBmYWxzZQogICAgICAgICRsaW5rW29wdHMuY2xpY2tUaHJvdWdoID8gJ3VuYmluZCcgOiAnYmluZCddKCdjbGljay5jbHVldGlwJywgcmV0dXJuRmFsc2UpOwoKICAgICAgICAvL3NldCB1cCBtb3VzZSB0cmFja2luZwogICAgICAgIHZhciBtb3VzZVRyYWNrcyA9IGZ1bmN0aW9uKGV2dCkgewogICAgICAgICAgaWYgKG9wdHMudHJhY2tpbmcpIHsKICAgICAgICAgICAgdmFyIHRyYWNrWCA9IHBvc1ggLSBldnQucGFnZVg7CiAgICAgICAgICAgIHZhciB0cmFja1kgPSB0aXBZID8gdGlwWSAtIGV2dC5wYWdlWSA6IHBvc1kgLSBldnQucGFnZVk7CiAgICAgICAgICAgICRsaW5rLmJpbmQoJ21vdXNlbW92ZS5jbHVldGlwJywgZnVuY3Rpb24oZXZ0KSB7CiAgICAgICAgICAgICAgJGNsdWV0aXAuY3NzKHtsZWZ0OiBldnQucGFnZVggKyB0cmFja1gsIHRvcDogZXZ0LnBhZ2VZICsgdHJhY2tZIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBpZiAoJC5mbi5ob3ZlckludGVudCAmJiBvcHRzLmhvdmVySW50ZW50KSB7CiAgICAgICAgICAkbGluay5ob3ZlckludGVudCh7CiAgICAgICAgICAgIHNlbnNpdGl2aXR5OiBvcHRzLmhvdmVySW50ZW50LnNlbnNpdGl2aXR5LAogICAgICAgICAgICBpbnRlcnZhbDogb3B0cy5ob3ZlckludGVudC5pbnRlcnZhbCwKICAgICAgICAgICAgb3ZlcjogZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICAgICAgICBhY3RpdmF0ZShldmVudCk7CiAgICAgICAgICAgICAgbW91c2VUcmFja3MoZXZlbnQpOwogICAgICAgICAgICB9LAogICAgICAgICAgICB0aW1lb3V0OiBvcHRzLmhvdmVySW50ZW50LnRpbWVvdXQsCiAgICAgICAgICAgIG91dDogZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICAgICAgICBpbmFjdGl2YXRlKGV2ZW50KTsKICAgICAgICAgICAgICAkbGluay51bmJpbmQoJ21vdXNlbW92ZS5jbHVldGlwJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAkbGluay5iaW5kKCdtb3VzZWVudGVyLmNsdWV0aXAnLCBmdW5jdGlvbihldmVudCkgewogICAgICAgICAgICBhY3RpdmF0ZShldmVudCk7CiAgICAgICAgICAgIG1vdXNlVHJhY2tzKGV2ZW50KTsKICAgICAgICAgIH0pCiAgICAgICAgICAuYmluZCgnbW91c2VsZWF2ZS5jbHVldGlwJywgZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICAgICAgaW5hY3RpdmF0ZShldmVudCk7CiAgICAgICAgICAgICRsaW5rLnVuYmluZCgnbW91c2Vtb3ZlLmNsdWV0aXAnKTsKICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgJGxpbmsuYmluZCgnbW91c2VvdmVyLmNsdWV0aXAnLCBmdW5jdGlvbihldmVudCkgewogICAgICAgICAgJGxpbmsuYXR0clByb3AoJ3RpdGxlJywnJyk7CiAgICAgICAgfSkuYmluZCgnbW91c2VsZWF2ZS5jbHVldGlwJywgZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICAgICRsaW5rLmF0dHJQcm9wKCd0aXRsZScsICRsaW5rLmRhdGEoJ2NsdWV0aXAnKS50aXRsZSk7CiAgICAgICAgfSk7CiAgICAgIH0KCiAgICAgIC8vIHRyaWdnZXIgYSBjYWNoZWQgQWpheCByZXNwb25zZQogICAgICBmdW5jdGlvbiBjYWNoZWRBamF4KGluZm8sIHNldHRpbmdzKSB7CiAgICAgICAgdmFyIHN0YXR1cyA9IGluZm8uc3RhdHVzOwogICAgICAgIHNldHRpbmdzLmJlZm9yZVNlbmQoaW5mby54aHIsIHNldHRpbmdzKTsKICAgICAgICBpZiAoIHN0YXR1cyA9PSAnZXJyb3InICkgewogICAgICAgICAgc2V0dGluZ3Nbc3RhdHVzXShpbmZvLnhociwgaW5mby50ZXh0U3RhdHVzKTsKICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PSAnc3VjY2VzcycpIHsKICAgICAgICAgIHNldHRpbmdzW3N0YXR1c10oaW5mby5kYXRhLCBpbmZvLnRleHRTdGF0dXMsIGluZm8ueGhyKTsKICAgICAgICB9CiAgICAgICAgc2V0dGluZ3MuY29tcGxldGUoaW5mby54aHIsIHNldHRpbmdzLnRleHRTdGF0dXMpOwogICAgICB9CgogICAgfSk7IC8vIGVuZCB0aGlzLmVhY2gKCiAgICAvKiogPXByaXZhdGUgZnVuY3Rpb25zCiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgICAvL2VtcHR5IGZ1bmN0aW9uCiAgICBmdW5jdGlvbiBkb05vdGhpbmcoKSB7fQoKICAgIC8vIGNyZWF0ZSBhIHN0cmluZyB0byBiZSB1c2VkIGFzIGFuIGlkZW50aWZpZXIgZm9yIGFqYXggY2FjaGVzCiAgICBmdW5jdGlvbiBnZXRDYWNoZUtleSh1cmwsIGRhdGEpIHsKICAgICAgdmFyIGNhY2hlS2V5ID0gdXJsIHx8ICcnOwogICAgICBkYXRhID0gZGF0YSB8fCAnJzsKCiAgICAgIGlmICh0eXBlb2YgZGF0YSA9PSAnb2JqZWN0JykgewogICAgICAgICQuZWFjaChkYXRhLCBmdW5jdGlvbihrZXksIHZhbCkgewogICAgICAgICAgY2FjaGVLZXkgKz0gJy0nICsga2V5ICsgJy0nICsgdmFsOwogICAgICAgIH0pOwogICAgICB9IGVsc2UgaWYgKHR5cGVvZiBkYXRhID09ICdzdHJpbmcnKSB7CiAgICAgICAgY2FjaGVLZXkgKz0gZGF0YTsKICAgICAgfQoKICAgICAgcmV0dXJuIGNhY2hlS2V5OwogICAgfQoKICAgIC8qKiA9Y3JlYXRlIGRyb3BzaGFkb3cgZGl2cyAqKi8KCiAgICBmdW5jdGlvbiBjcmVhdGVEcm9wU2hhZG93cygkY2x1ZXRpcCwgb3B0aW9ucywgbmV3RHJvcFNoYWRvdykgewogICAgICB2YXIgZHNTdHlsZSA9ICcnLAogICAgICAgICAgZHJvcFNoYWRvd1N0ZXBzID0gKG9wdGlvbnMuZHJvcFNoYWRvdyAmJiBvcHRpb25zLmRyb3BTaGFkb3dTdGVwcykgPyArb3B0aW9ucy5kcm9wU2hhZG93U3RlcHMgOiAwOwoKICAgICAgaWYgKCQuc3VwcG9ydC5ib3hTaGFkb3cpIHsKICAgICAgICBpZiAoIGRyb3BTaGFkb3dTdGVwcyApIHsKICAgICAgICAgIGRzU3R5bGUgPSAnMXB4IDFweCAnICsgZHJvcFNoYWRvd1N0ZXBzICsgJ3B4IHJnYmEoMCwwLDAsMC41KSc7CiAgICAgICAgfQogICAgICAgIHZhciBkc09mZnNldHMgPSBkcm9wU2hhZG93U3RlcHMgPT09IDAgPyAnMCAwICcgOiAnMXB4IDFweCAnOwogICAgICAgICRjbHVldGlwLmNzcygkLnN1cHBvcnQuYm94U2hhZG93LCBkc1N0eWxlKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgdmFyIG9sZERyb3BTaGFkb3cgPSAkY2x1ZXRpcC5maW5kKCcuY2x1ZXRpcC1kcm9wLXNoYWRvdycpOwogICAgICBpZiAoZHJvcFNoYWRvd1N0ZXBzID09IG9sZERyb3BTaGFkb3cubGVuZ3RoKSB7CiAgICAgICAgcmV0dXJuIG9sZERyb3BTaGFkb3c7CiAgICAgIH0KICAgICAgb2xkRHJvcFNoYWRvdy5yZW1vdmUoKTsKICAgICAgdmFyIGRyb3BTaGFkb3dzID0gW107CiAgICAgIGZvciAodmFyIGk9MDsgaSA8IGRyb3BTaGFkb3dTdGVwczspIHsKICAgICAgICBkcm9wU2hhZG93c1tpKytdID0gJzxkaXYgc3R5bGU9InRvcDonICsgaSArICdweDtsZWZ0OicgKyBpICsgJ3B4OyI+PC9kaXY+JzsKICAgICAgfQoKICAgICAgbmV3RHJvcFNoYWRvdyA9ICQoZHJvcFNoYWRvd3Muam9pbignJykpCiAgICAgIC5jc3MoewogICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLAogICAgICAgIGJhY2tncm91bmRDb2xvcjogJyMwMDAnLAogICAgICAgIHpJbmRleDogY2x1ZXpJbmRleCAtMSwKICAgICAgICBvcGFjaXR5OiAwLjEKICAgICAgfSkKICAgICAgLmFkZENsYXNzKCdjbHVldGlwLWRyb3Atc2hhZG93JykKICAgICAgLnByZXBlbmRUbygkY2x1ZXRpcCk7CiAgICAgIHJldHVybiBuZXdEcm9wU2hhZG93OwoKICAgIH0KCiAgICByZXR1cm4gdGhpczsKICB9OwoKICAoZnVuY3Rpb24oKSB7CiAgICAkLnN1cHBvcnQgPSAkLnN1cHBvcnQgfHwge307CiAgICAvLyBjaGVjayBzdXBwb3J0IGZvciBDU1MzIHByb3BlcnRpZXMgKGN1cnJlbnRseSBvbmx5IGJveFNoYWRvdykKICAgIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSwKICAgICAgICBkaXZTdHlsZSA9IGRpdi5zdHlsZSwKICAgICAgICBzdHlsZVByb3BzID0gWydib3hTaGFkb3cnXSwKICAgICAgICBwcmVmaXhlcyA9IFsnbW96JywgJ01veicsICd3ZWJraXQnLCAnbyddOwoKICAgIGZvciAodmFyIGk9MCwgc2wgPSBzdHlsZVByb3BzLmxlbmd0aDsgaSA8IHNsOyBpKyspIHsKICAgICAgdmFyIHByb3AgPSBzdHlsZVByb3BzW2ldLAogICAgICAgICAgdVByb3AgPSBwcm9wLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgcHJvcC5zbGljZSgxKTsKCiAgICAgIGlmICggdHlwZW9mIGRpdlN0eWxlWyBwcm9wIF0gIT09ICd1bmRlZmluZWQnICkgewogICAgICAgICQuc3VwcG9ydFsgcHJvcCBdID0gcHJvcDsKICAgICAgfSBlbHNlIHsKICAgICAgICBmb3IgKHZhciBqPTAsIHBsID0gcHJlZml4ZXMubGVuZ3RoOyBqIDwgcGw7IGorKykgewoKICAgICAgICAgIGlmICh0eXBlb2YgZGl2U3R5bGVbIHByZWZpeGVzW2pdICsgdVByb3AgXSAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgJC5zdXBwb3J0WyBwcm9wIF0gPSBwcmVmaXhlc1tqXSArIHVQcm9wOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGRpdiA9IG51bGw7CiAgfSkoKTsKCiAgJC5mbi5jbHVldGlwLmRlZmF1bHRzID0gJC5jbHVldGlwLmRlZmF1bHRzOwoKfSkoalF1ZXJ5KTsKKGZ1bmN0aW9uKCQpIHsKICAvLyBCYWNrLWNvbXBhdCBmaWxlIGZvciBjbHVlVGlwIDEuMgogIC8vIFRoaXMgbW9kaWZpZXMgdGhlICQuZm4uY2x1ZXRpcCBvYmplY3QgdG8gbWFrZSB0aGUgcGx1Z2luIHdvcmsgdGhlIHdheSBpdCBkaWQgYmVmb3JlIGNsdWVUaXAgdmVyc2lvbiAxLjIKICAkLmV4dGVuZCh0cnVlLCAkLmZuLmNsdWV0aXAsIHsKICAgIGJhY2tDb21wYXQ6IHRydWUsCiAgICB0ZW1wbGF0ZTogWyc8ZGl2IGlkPSJjbHVldGlwIj4nLAogICAgICAnPGRpdiBpZD0iY2x1ZXRpcC1vdXRlciIgY2xhc3M9ImNsdWV0aXAtb3V0ZXIiPicsCiAgICAgICAgJzxoMyBpZD0iY2x1ZXRpcC10aXRsZSIgY2xhc3M9ImNsdWV0aXAtdGl0bGUgdWktd2lkZ2V0LWhlYWRlciB1aS1jbHVldGlwLWhlYWRlciI+PC9oMz4nLAogICAgICAgICc8ZGl2IGlkPSJjbHVldGlwLWlubmVyIiBjbGFzcz0iY2x1ZXRpcC1pbm5lciB1aS13aWRnZXQtY29udGVudCB1aS1jbHVldGlwLWNvbnRlbnQiPjwvZGl2PicsCiAgICAgICc8L2Rpdj4nLAogICAgICAnPGRpdiBpZD0iY2x1ZXRpcC1leHRyYSI+PC9kaXY+JywKICAgICAgJzxkaXYgaWQ9ImNsdWV0aXAtYXJyb3dzIiBjbGFzcz0iY2x1ZXRpcC1hcnJvd3MiPjwvZGl2PicsCiAgICAnPC9kaXY+J10uam9pbignJykKICB9KTsKfSkoalF1ZXJ5KTsK]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/jquery.cluetip.all.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohCiAqIGpRdWVyeSBjbHVlVGlwIHBsdWdpbiB2MS4yLjcKICoKICogRGF0ZTogU2F0IE9jdCAxMyAxNzoxNzo0NyAyMDEyIEVEVAogKiBSZXF1aXJlczogalF1ZXJ5IHYxLjMrCiAqCiAqIENvcHlyaWdodCAyMDEyLCBLYXJsIFN3ZWRiZXJnCiAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgR1BMIGxpY2Vuc2VzOgogKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocAogKiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLmh0bWwKICoKICoKICogRXhhbXBsZXMgY2FuIGJlIGZvdW5kIGF0IGh0dHA6Ly9wbHVnaW5zLmxlYXJuaW5nanF1ZXJ5LmNvbS9jbHVldGlwL2RlbW8vCiAqCiovCihmdW5jdGlvbihjKXtjLmNsdWV0aXA9e3ZlcnNpb246IjEuMi43Iix0ZW1wbGF0ZTonPGRpdj48ZGl2IGNsYXNzPSJjbHVldGlwLW91dGVyIj48aDMgY2xhc3M9ImNsdWV0aXAtdGl0bGUgdWktd2lkZ2V0LWhlYWRlciB1aS1jbHVldGlwLWhlYWRlciI+PC9oMz48ZGl2IGNsYXNzPSJjbHVldGlwLWlubmVyIHVpLXdpZGdldC1jb250ZW50IHVpLWNsdWV0aXAtY29udGVudCI+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0iY2x1ZXRpcC1leHRyYSI+PC9kaXY+PC9kaXY+JyxzZXR1cDp7aW5zZXJ0aW9uVHlwZToiYXBwZW5kVG8iLGluc2VydGlvbkVsZW1lbnQ6ImJvZHkifSxkZWZhdWx0czp7bXVsdGlwbGU6ZmFsc2Usd2lkdGg6Mjc1LGhlaWdodDoiYXV0byIsY2x1ZXpJbmRleDo5Nyxwb3NpdGlvbkJ5OiJhdXRvIix0b3BPZmZzZXQ6MTUsbGVmdE9mZnNldDoxNSxzbmFwVG9FZGdlOmZhbHNlLGxvY2FsOmZhbHNlLGxvY2FsUHJlZml4Om51bGwsbG9jYWxJZFN1ZmZpeDpudWxsLGhpZGVMb2NhbDp0cnVlLAphdHRyaWJ1dGU6InJlbCIsdGl0bGVBdHRyaWJ1dGU6InRpdGxlIixzcGxpdFRpdGxlOiIiLGVzY2FwZVRpdGxlOmZhbHNlLHNob3dUaXRsZTp0cnVlLGNsdWV0aXBDbGFzczoiZGVmYXVsdCIsaG92ZXJDbGFzczoiIix3YWl0SW1hZ2U6dHJ1ZSxjdXJzb3I6ImhlbHAiLGFycm93czpmYWxzZSxkcm9wU2hhZG93OnRydWUsZHJvcFNoYWRvd1N0ZXBzOjYsc3RpY2t5OmZhbHNlLG1vdXNlT3V0Q2xvc2U6ZmFsc2UsZGVsYXllZENsb3NlOjUwLGFjdGl2YXRpb246ImhvdmVyIixjbGlja1Rocm91Z2g6dHJ1ZSx0cmFja2luZzpmYWxzZSxjbG9zZVBvc2l0aW9uOiJ0b3AiLGNsb3NlVGV4dDoiQ2xvc2UiLHRydW5jYXRlOjAsZng6e29wZW46InNob3ciLG9wZW5TcGVlZDoiIn0saG92ZXJJbnRlbnQ6e3NlbnNpdGl2aXR5OjMsaW50ZXJ2YWw6NTAsdGltZW91dDowfSxvbkFjdGl2YXRlOmZ1bmN0aW9uKCl7cmV0dXJuIHRydWV9LG9uU2hvdzpmdW5jdGlvbigpe30sb25IaWRlOmZ1bmN0aW9uKCl7fSwKYWpheENhY2hlOnRydWUsYWpheFByb2Nlc3M6ZnVuY3Rpb24obSl7cmV0dXJuIG09bS5yZXBsYWNlKC88KHNjcmlwdHxzdHlsZXx0aXRsZSlbXjxdKzxcLyhzY3JpcHR8c3R5bGV8dGl0bGUpPi9nbSwiIikucmVwbGFjZSgvPChsaW5rfG1ldGEpW14+XSs+L2csIiIpfSxhamF4U2V0dGluZ3M6e2RhdGFUeXBlOiJodG1sIn0sZGVidWc6ZmFsc2V9fTt2YXIgRSxQPXt9LG1hPTAsVD0wO2MuZm4uYXR0clByb3A9Yy5mbi5wcm9wfHxjLmZuLmF0dHI7Yy5mbi5jbHVldGlwPWZ1bmN0aW9uKG0scSl7ZnVuY3Rpb24gVSh6LGspe3ZhciBsPXp8fCIiO2s9a3x8IiI7aWYodHlwZW9mIGs9PSJvYmplY3QiKWMuZWFjaChrLGZ1bmN0aW9uKGosZCl7bCs9Ii0iK2orIi0iK2R9KTtlbHNlIGlmKHR5cGVvZiBrPT0ic3RyaW5nIilsKz1rO3JldHVybiBsfWZ1bmN0aW9uIFYoeixrLGwpe2w9IiI7az1rLmRyb3BTaGFkb3cmJmsuZHJvcFNoYWRvd1N0ZXBzPytrLmRyb3BTaGFkb3dTdGVwczowO2lmKGMuc3VwcG9ydC5ib3hTaGFkb3cpe2lmKGspbD0KIjFweCAxcHggIitrKyJweCByZ2JhKDAsMCwwLDAuNSkiO3ouY3NzKGMuc3VwcG9ydC5ib3hTaGFkb3csbCk7cmV0dXJuIGZhbHNlfWw9ei5maW5kKCIuY2x1ZXRpcC1kcm9wLXNoYWRvdyIpO2lmKGs9PWwubGVuZ3RoKXJldHVybiBsO2wucmVtb3ZlKCk7bD1bXTtmb3IodmFyIGo9MDtqPGs7KWxbaisrXT0nPGRpdiBzdHlsZT0idG9wOicraisicHg7bGVmdDoiK2orJ3B4OyI+PC9kaXY+JztyZXR1cm4gbD1jKGwuam9pbigiIikpLmNzcyh7cG9zaXRpb246ImFic29sdXRlIixiYWNrZ3JvdW5kQ29sb3I6IiMwMDAiLHpJbmRleDpXLTEsb3BhY2l0eTowLjF9KS5hZGRDbGFzcygiY2x1ZXRpcC1kcm9wLXNoYWRvdyIpLnByZXBlbmRUbyh6KX12YXIgZSxoLEksdyxKLGdhO2lmKHR5cGVvZiBtPT0ib2JqZWN0Iil7cT1tO209bnVsbH1pZihtPT0iZGVzdHJveSIpe3ZhciBYPXRoaXMuZGF0YSgiY2x1ZXRpcCIpO2lmKFgpe2MoWC5zZWxlY3RvcikucmVtb3ZlKCk7Yy5yZW1vdmVEYXRhKHRoaXMsCiJ0aXRsZSIpO2MucmVtb3ZlRGF0YSh0aGlzLCJjbHVldGlwIik7Yy5yZW1vdmVEYXRhKHRoaXMsImNsdWV0aXBNb2MiKX1jKGRvY3VtZW50KS51bmJpbmQoIi5jbHVldGlwIik7cmV0dXJuIHRoaXMudW5iaW5kKCIuY2x1ZXRpcCIpfXE9Yy5leHRlbmQodHJ1ZSx7fSxjLmNsdWV0aXAuZGVmYXVsdHMscXx8e30pO21hKys7dmFyIFc7WD1jLmNsdWV0aXAuYmFja0NvbXBhdHx8IXEubXVsdGlwbGU/ImNsdWV0aXAiOiJjbHVldGlwLSIrbWE7dmFyIGhhPSIjIitYLEE9Yy5jbHVldGlwLmJhY2tDb21wYXQ/IiMiOiIuIixhYT1jLmNsdWV0aXAuc2V0dXAuaW5zZXJ0aW9uVHlwZSxyYT1jLmNsdWV0aXAuc2V0dXAuaW5zZXJ0aW9uRWxlbWVudHx8ImJvZHkiO2FhPS9hcHBlbmRUb3xwcmVwZW5kVG98aW5zZXJ0QmVmb3JlfGluc2VydEFmdGVyLy50ZXN0KGFhKT9hYToiYXBwZW5kVG8iO2U9YyhoYSk7aWYoIWUubGVuZ3RoKXtlPWMoYy5jbHVldGlwLnRlbXBsYXRlKVthYV0ocmEpLmF0dHIoImlkIiwKWCkuY3NzKHtwb3NpdGlvbjoiYWJzb2x1dGUiLGRpc3BsYXk6Im5vbmUifSk7Vz0rcS5jbHVlekluZGV4O0k9ZS5maW5kKEErImNsdWV0aXAtb3V0ZXIiKS5jc3Moe3Bvc2l0aW9uOiJyZWxhdGl2ZSIsekluZGV4Old9KTtoPWUuZmluZChBKyJjbHVldGlwLWlubmVyIik7dz1lLmZpbmQoQSsiY2x1ZXRpcC10aXRsZSIpO2UuYmluZCgibW91c2VlbnRlciBtb3VzZWxlYXZlIixmdW5jdGlvbih6KXtjKHRoaXMpLmRhdGEoImVudGVyZWQiLHoudHlwZT09PSJtb3VzZWVudGVyIil9KX1FPWMoIiNjbHVldGlwLXdhaXRpbWFnZSIpO2lmKCFFLmxlbmd0aCYmcS53YWl0SW1hZ2Upe0U9YygiPGRpdj48L2Rpdj4iKS5hdHRyKCJpZCIsImNsdWV0aXAtd2FpdGltYWdlIikuY3NzKHtwb3NpdGlvbjoiYWJzb2x1dGUifSk7RS5pbnNlcnRCZWZvcmUoZSkuaGlkZSgpfXZhciBzYT0ocGFyc2VJbnQoZS5jc3MoInBhZGRpbmdMZWZ0IiksMTApfHwwKSsocGFyc2VJbnQoZS5jc3MoInBhZGRpbmdSaWdodCIpLAoxMCl8fDApO3RoaXMuZWFjaChmdW5jdGlvbih6KXtmdW5jdGlvbiBrKCl7cmV0dXJuIGZhbHNlfWZ1bmN0aW9uIGwoYixnKXt2YXIgZj1iLnN0YXR1cztnLmJlZm9yZVNlbmQoYi54aHIsZyk7aWYoZj09ImVycm9yIilnW2ZdKGIueGhyLGIudGV4dFN0YXR1cyk7ZWxzZSBmPT0ic3VjY2VzcyImJmdbZl0oYi5kYXRhLGIudGV4dFN0YXR1cyxiLnhocik7Zy5jb21wbGV0ZShiLnhocixnLnRleHRTdGF0dXMpfXZhciBqPXRoaXMsZD1jKHRoaXMpLGE9Yy5leHRlbmQodHJ1ZSx7fSxxLGMubWV0YWRhdGE/ZC5tZXRhZGF0YSgpOmMubWV0YT9kLmRhdGEoKTpkLmRhdGEoImNsdWV0aXAiKXx8e30pLEs9ZmFsc2UsUT1mYWxzZSxGPW51bGwscD1hW2EuYXR0cmlidXRlXXx8KGEuYXR0cmlidXRlPT0iaHJlZiI/ZC5hdHRyKGEuYXR0cmlidXRlKTpkLmF0dHJQcm9wKGEuYXR0cmlidXRlKXx8ZC5hdHRyKGEuYXR0cmlidXRlKSksWT1hLmNsdWV0aXBDbGFzcztXPSthLmNsdWV6SW5kZXg7ZC5kYXRhKCJjbHVldGlwIiwKe3RpdGxlOmoudGl0bGUsekluZGV4Olcsc2VsZWN0b3I6aGF9KTthLmFycm93cyYmIWUuZmluZCgiLmNsdWV0aXAtYXJyb3dzIikubGVuZ3RoJiZlLmFwcGVuZCgnPGRpdiBjbGFzcz0iY2x1ZXRpcC1hcnJvd3MgdWktc3RhdGUtZGVmYXVsdCI+PC9kaXY+Jyk7aWYoIXAmJiFhLnNwbGl0VGl0bGUmJiFtKXJldHVybiB0cnVlO2lmKGEubG9jYWwmJmEubG9jYWxQcmVmaXgpcD1hLmxvY2FsUHJlZml4K3A7YS5sb2NhbCYmYS5oaWRlTG9jYWwmJnAmJmMocCsiOmZpcnN0IikuaGlkZSgpO3ZhciBvPXBhcnNlSW50KGEudG9wT2Zmc2V0LDEwKSxHPXBhcnNlSW50KGEubGVmdE9mZnNldCwxMCksdCxpYSxiYT1pc05hTihwYXJzZUludChhLmhlaWdodCwxMCkpPyJhdXRvIjovXEQvZy50ZXN0KGEuaGVpZ2h0KT9hLmhlaWdodDphLmhlaWdodCsicHgiLFosamEsbmEseCx1LEwsJCxrYT1wYXJzZUludChhLndpZHRoLDEwKXx8Mjc1LHI9a2Erc2ErYS5kcm9wU2hhZG93U3RlcHMsTT10aGlzLm9mZnNldFdpZHRoLApCLG4scyxSLE4sQz1hLmF0dHJpYnV0ZSE9InRpdGxlIj9kLmF0dHIoYS50aXRsZUF0dHJpYnV0ZSl8fCIiOiIiO2lmKGEuc3BsaXRUaXRsZSl7Tj1DLnNwbGl0KGEuc3BsaXRUaXRsZSk7Qz1hLnNob3dUaXRsZXx8TlswXT09PSIiP04uc2hpZnQoKToiIn1pZihhLmVzY2FwZVRpdGxlKUM9Qy5yZXBsYWNlKC8mL2csIiZhbXA7IikucmVwbGFjZSgvPi9nLCImZ3Q7IikucmVwbGFjZSgvPC9nLCImbHQ7Iik7ZC5iaW5kKCJtb3VzZWVudGVyIG1vdXNlbGVhdmUiLGZ1bmN0aW9uKGIpe3ZhciBnPWQuZGF0YSgiY2x1ZXRpcCIpO2cuZW50ZXJlZD1iLnR5cGU9PT0iZW50ZXJlZCI7ZC5kYXRhKCJjbHVldGlwIixnKX0pO3ZhciBkYT1mdW5jdGlvbihiKXt2YXIgZyxmO2lmKGEub25BY3RpdmF0ZS5jYWxsKGosYik9PT1mYWxzZSlyZXR1cm4gZmFsc2U7UT10cnVlO2U9YyhoYSkuY3NzKHtwb3NpdGlvbjoiYWJzb2x1dGUifSk7ST1lLmZpbmQoQSsiY2x1ZXRpcC1vdXRlciIpO2g9ZS5maW5kKEErCiJjbHVldGlwLWlubmVyIik7dz1lLmZpbmQoQSsiY2x1ZXRpcC10aXRsZSIpO0o9ZS5maW5kKEErImNsdWV0aXAtYXJyb3dzIik7ZS5yZW1vdmVDbGFzcygpLmNzcyh7d2lkdGg6a2F9KTtwPT1kLmF0dHIoImhyZWYiKSYmZC5jc3MoImN1cnNvciIsYS5jdXJzb3IpO2EuaG92ZXJDbGFzcyYmZC5hZGRDbGFzcyhhLmhvdmVyQ2xhc3MpO2phPXg9ZC5vZmZzZXQoKS50b3A7bmE9amErZC5pbm5lckhlaWdodCgpO0I9ZC5vZmZzZXQoKS5sZWZ0O009ZC5pbm5lcldpZHRoKCk7aWYoYi50eXBlPT1mb2N1cyl7cz1CK00vMitHO2UuY3NzKHtsZWZ0Om59KTtMPXgrb31lbHNle3M9Yi5wYWdlWDtMPWIucGFnZVl9aWYoai50YWdOYW1lLnRvTG93ZXJDYXNlKCkhPSJhcmVhIil7Wj1jKGRvY3VtZW50KS5zY3JvbGxUb3AoKTtSPWMod2luZG93KS53aWR0aCgpfWlmKGEucG9zaXRpb25CeT09ImZpeGVkIil7bj1NK0IrRztlLmNzcyh7bGVmdDpufSl9ZWxzZXtuPU0+QiYmQj5yfHxCK00rcitHPlI/Qi0Kci1HOk0rQitHO2lmKGoudGFnTmFtZS50b0xvd2VyQ2FzZSgpPT0iYXJlYSJ8fGEucG9zaXRpb25CeT09Im1vdXNlInx8TStyPlIpaWYocysyMCtyPlIpe2UuYWRkQ2xhc3MoImNsdWV0aXAtIitZKTtuPXMtci1HPj0wP3Mtci1HLXBhcnNlSW50KGUuY3NzKCJtYXJnaW5MZWZ0IiksMTApK3BhcnNlSW50KGguY3NzKCJtYXJnaW5SaWdodCIpLDEwKTpzLXIvMn1lbHNlIG49cytHO2c9bjwwP2IucGFnZVkrbzpiLnBhZ2VZO2lmKG48MHx8YS5wb3NpdGlvbkJ5PT0iYm90dG9tVG9wInx8YS5wb3NpdGlvbkJ5PT0idG9wQm90dG9tIiluPXMrci8yPlI/Ui8yLXIvMjpNYXRoLm1heChzLXIvMiwwKX1KLmNzcyh7ekluZGV4OmQuZGF0YSgiY2x1ZXRpcCIpLnpJbmRleCsxfSk7ZS5jc3Moe2xlZnQ6bix6SW5kZXg6ZC5kYXRhKCJjbHVldGlwIikuekluZGV4fSk7aWE9Yyh3aW5kb3cpLmhlaWdodCgpO2lmKG0pe2lmKHR5cGVvZiBtPT0iZnVuY3Rpb24iKW09bS5jYWxsKGopO2guaHRtbChtKTtTKGcpfWVsc2UgaWYoTil7Yj0KTi5sZW5ndGg7aC5odG1sKGI/TlswXToiIik7aWYoYj4xKWZvcih2YXIgaT0xO2k8YjtpKyspaC5hcHBlbmQoJzxkaXYgY2xhc3M9InNwbGl0LWJvZHkiPicrTltpXSsiPC9kaXY+Iik7UyhnKX1lbHNlIGlmKCFhLmxvY2FsJiZwLmluZGV4T2YoIiMiKSE9PTApaWYoL1wuKGpwZT9nfHRpZmY/fGdpZnxwbmcpKD86XD8uKik/JC9pLnRlc3QocCkpe2guaHRtbCgnPGltZyBzcmM9IicrcCsnIiBhbHQ9IicrQysnIiAvPicpO1MoZyl9ZWxzZXt2YXIgdj1hLmFqYXhTZXR0aW5ncy5iZWZvcmVTZW5kLGNhPWEuYWpheFNldHRpbmdzLmVycm9yLEg9YS5hamF4U2V0dGluZ3Muc3VjY2VzcyxvYT1hLmFqYXhTZXR0aW5ncy5jb21wbGV0ZTtmPVUocCxhLmFqYXhTZXR0aW5ncy5kYXRhKTtiPWMuZXh0ZW5kKHRydWUse30sYS5hamF4U2V0dGluZ3Mse2NhY2hlOmEuYWpheENhY2hlLHVybDpwLGJlZm9yZVNlbmQ6ZnVuY3Rpb24oeSxEKXt2JiZ2LmNhbGwoaix5LGUsaCxEKTtJLmNoaWxkcmVuKCkuZW1wdHkoKTsKYS53YWl0SW1hZ2UmJkUuY3NzKHt0b3A6TCsyMCxsZWZ0OnMrMjAsekluZGV4OmQuZGF0YSgiY2x1ZXRpcCIpLnpJbmRleC0xfSkuc2hvdygpfSxlcnJvcjpmdW5jdGlvbih5LEQpe2lmKHEuYWpheENhY2hlJiYhUFtmXSlQW2ZdPXtzdGF0dXM6ImVycm9yIix0ZXh0U3RhdHVzOkQseGhyOnl9O2lmKFEpY2E/Y2EuY2FsbChqLHksRCxlLGgpOmguaHRtbCgiPGk+c29ycnksIHRoZSBjb250ZW50cyBjb3VsZCBub3QgYmUgbG9hZGVkPC9pPiIpfSxzdWNjZXNzOmZ1bmN0aW9uKHksRCxPKXtpZihxLmFqYXhDYWNoZSYmIVBbZl0pUFtmXT17c3RhdHVzOiJzdWNjZXNzIixkYXRhOnksdGV4dFN0YXR1czpELHhocjpPfTtLPWEuYWpheFByb2Nlc3MuY2FsbChqLHkpO2lmKHR5cGVvZiBLPT0ib2JqZWN0IiYmSyE9PW51bGwpe0M9Sy50aXRsZTtLPUsuY29udGVudH1pZihRKXtIJiZILmNhbGwoaix5LEQsZSxoKTtoLmh0bWwoSyl9fSxjb21wbGV0ZTpmdW5jdGlvbih5LEQpe29hJiZvYS5jYWxsKGosCnksRCxlLGgpO3ZhciBPPWhbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoImltZyIpO1Q9Ty5sZW5ndGg7Zm9yKHZhciBsYT0wLHRhPU8ubGVuZ3RoO2xhPHRhO2xhKyspT1tsYV0uY29tcGxldGUmJlQtLTtpZihUJiYhYy5icm93c2VyLm9wZXJhKWMoTykuYmluZCgibG9hZC5jdCBlcnJvci5jdCIsZnVuY3Rpb24oKXtULS07aWYoVD09PTApe0UuaGlkZSgpO2MoTykudW5iaW5kKCIuY3QiKTtRJiZTKGcpfX0pO2Vsc2V7RS5oaWRlKCk7USYmUyhnKX19fSk7UFtmXT9sKFBbZl0sYik6Yy5hamF4KGIpfWVsc2UgaWYoYS5sb2NhbCl7Yj1jKHArKC9eI1xTKyQvLnRlc3QocCk/IiI6IjplcSgiK3orIikiKSkuY2xvbmUodHJ1ZSkuc2hvdygpO2EubG9jYWxJZFN1ZmZpeCYmYi5hdHRyKCJpZCIsYlswXS5pZCthLmxvY2FsSWRTdWZmaXgpO2guaHRtbChiKTtTKGcpfX0sUz1mdW5jdGlvbihiKXt2YXIgZyxmO2c9Q3x8YS5zaG93VGl0bGUmJiImbmJzcDsiO3ZhciBpPSIiO2Y9IiI7dmFyIHY9ZmFsc2U7CnY9e2JvdHRvbTpmdW5jdGlvbihIKXtILmFwcGVuZFRvKGgpfSx0b3A6ZnVuY3Rpb24oSCl7SC5wcmVwZW5kVG8oaCl9LHRpdGxlOmZ1bmN0aW9uKEgpe0gucHJlcGVuZFRvKHcpfX07ZS5hZGRDbGFzcygiY2x1ZXRpcC0iK1kpO2lmKGEudHJ1bmNhdGUpe3ZhciBjYT1oLnRleHQoKS5zbGljZSgwLGEudHJ1bmNhdGUpKyIuLi4iO2guaHRtbChjYSl9Zz93LnNob3coKS5odG1sKGcpOncuaGlkZSgpO2lmKGEuc3RpY2t5KXtpZih2W2EuY2xvc2VQb3NpdGlvbl0pe2c9YygnPGRpdiBjbGFzcz0iY2x1ZXRpcC1jbG9zZSI+PGEgaHJlZj0iIyI+JythLmNsb3NlVGV4dCsiPC9hPjwvZGl2PiIpO3ZbYS5jbG9zZVBvc2l0aW9uXShnKTtnLmJpbmQoImNsaWNrLmNsdWV0aXAiLGZ1bmN0aW9uKCl7ZWEoKTtyZXR1cm4gZmFsc2V9KX1pZihhLm1vdXNlT3V0Q2xvc2Upe2QudW5iaW5kKCJtb3VzZWxlYXZlLmNsdWV0aXBNb2MiKTtlLnVuYmluZCgibW91c2VsZWF2ZS5jbHVldGlwTW9jIik7aWYoYS5tb3VzZU91dENsb3NlPT0KImJvdGgifHxhLm1vdXNlT3V0Q2xvc2U9PSJjbHVldGlwInx8YS5tb3VzZU91dENsb3NlPT09dHJ1ZSllLmJpbmQoIm1vdXNlbGVhdmUuY2x1ZXRpcE1vYyIscGEpO2lmKGEubW91c2VPdXRDbG9zZT09ImJvdGgifHxhLm1vdXNlT3V0Q2xvc2U9PSJsaW5rIilkLmJpbmQoIm1vdXNlbGVhdmUuY2x1ZXRpcE1vYyIscGEpfX1JLmNzcyh7ekluZGV4OmQuZGF0YSgiY2x1ZXRpcCIpLnpJbmRleCxvdmVyZmxvdzpiYT09ImF1dG8iPyJ2aXNpYmxlIjoiYXV0byIsaGVpZ2h0OmJhfSk7dD1iYT09ImF1dG8iP01hdGgubWF4KGUub3V0ZXJIZWlnaHQoKSxlLmhlaWdodCgpKTpwYXJzZUludChiYSwxMCk7dT14OyQ9WitpYTt2PW48cyYmTWF0aC5tYXgobiwwKStyPnM7aWYoYS5wb3NpdGlvbkJ5PT0iZml4ZWQiKXU9eC1hLmRyb3BTaGFkb3dTdGVwcytvO2Vsc2UgaWYoYS5wb3NpdGlvbkJ5PT0idG9wQm90dG9tInx8YS5wb3NpdGlvbkJ5PT0iYm90dG9tVG9wInx8dil7aWYoYS5wb3NpdGlvbkJ5PT0KInRvcEJvdHRvbSIpZj14K3QrbzwkJiZMLVo8dCtvPyJib3R0b20iOiJ0b3AiO2Vsc2UgaWYoYS5wb3NpdGlvbkJ5PT0iYm90dG9tVG9wInx8dilmPXgrdCtvPiQmJkwtWj50K28/InRvcCI6ImJvdHRvbSI7aWYoYS5zbmFwVG9FZGdlKWlmKGY9PSJ0b3AiKXU9amEtdC1vO2Vsc2V7aWYoZj09ImJvdHRvbSIpdT1uYStvfWVsc2UgaWYoZj09InRvcCIpdT1MLXQtbztlbHNlIGlmKGY9PSJib3R0b20iKXU9TCtvfWVsc2UgdT14K3Qrbz4kP3Q+PWlhP1o6JC10LW86ZC5jc3MoImRpc3BsYXkiKT09ImJsb2NrInx8ai50YWdOYW1lLnRvTG93ZXJDYXNlKCk9PSJhcmVhInx8YS5wb3NpdGlvbkJ5PT0ibW91c2UiP2Itbzp4LWEuZHJvcFNoYWRvd1N0ZXBzO2lmKGY9PT0iIilmPW48Qj8ibGVmdCI6InJpZ2h0IjtnPSIgY2x1ZS0iK2YrIi0iK1krIiBjbHVldGlwLSIrWTtpZihZPT0icm91bmRlZCIpZys9IiB1aS1jb3JuZXItYWxsIjtlLmNzcyh7dG9wOnUrInB4In0pLmF0dHJQcm9wKHtjbGFzc05hbWU6ImNsdWV0aXAgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWNsdWV0aXAiKwpnfSk7aWYoYS5hcnJvd3Mpe2lmKC8obGVmdHxyaWdodCkvLnRlc3QoZikpe2Y9ZS5oZWlnaHQoKS1KLmhlaWdodCgpO2k9bj49MCYmYj4wP3gtdS1hLmRyb3BTaGFkb3dTdGVwczowO2k9Zj5pP2k6ZjtpKz0icHgifUouY3NzKHt0b3A6aX0pLnNob3coKX1lbHNlIEouaGlkZSgpOyhnYT1WKGUsYSkpJiZnYS5sZW5ndGgmJmdhLmhpZGUoKS5jc3Moe2hlaWdodDp0LHdpZHRoOmthLHpJbmRleDpkLmRhdGEoImNsdWV0aXAiKS56SW5kZXgtMX0pLnNob3coKTtGfHxlLmhpZGUoKTtjbGVhclRpbWVvdXQoRik7Rj1udWxsO2VbYS5meC5vcGVuXShhLmZ4Lm9wZW5TcGVlZHx8MCk7Yy5mbi5iZ2lmcmFtZSYmZS5iZ2lmcmFtZSgpO2Eub25TaG93LmNhbGwoaixlLGgpfSxmYT1mdW5jdGlvbigpe1E9ZmFsc2U7RS5oaWRlKCk7aWYoIWEuc3RpY2t5fHwvY2xpY2t8dG9nZ2xlLy50ZXN0KGEuYWN0aXZhdGlvbikpaWYoYS5kZWxheWVkQ2xvc2U+MCl7Y2xlYXJUaW1lb3V0KEYpO0Y9bnVsbDtGPXNldFRpbWVvdXQoZWEsCmEuZGVsYXllZENsb3NlKX1hLmhvdmVyQ2xhc3MmJmQucmVtb3ZlQ2xhc3MoYS5ob3ZlckNsYXNzKX0sZWE9ZnVuY3Rpb24oYil7Yj1iJiZiLmRhdGEoImNsdWV0aXAiKT9iOmQ7dmFyIGc9Yi5kYXRhKCJjbHVldGlwIikmJmIuZGF0YSgiY2x1ZXRpcCIpLnNlbGVjdG9yLGY9YyhnfHwiZGl2LmNsdWV0aXAiKSxpPWYuZmluZChBKyJjbHVldGlwLWlubmVyIiksdj1mLmZpbmQoQSsiY2x1ZXRpcC1hcnJvd3MiKTtmLmhpZGUoKS5yZW1vdmVDbGFzcygpO2Eub25IaWRlLmNhbGwoYlswXSxmLGkpO2lmKGcpe2IucmVtb3ZlQ2xhc3MoImNsdWV0aXAtY2xpY2tlZCIpO2IuY3NzKCJjdXJzb3IiLCIiKX1nJiZDJiZiLmF0dHJQcm9wKGEudGl0bGVBdHRyaWJ1dGUsQyk7YS5hcnJvd3MmJnYuY3NzKHt0b3A6IiJ9KX0scGE9ZnVuY3Rpb24oKXt2YXIgYj10aGlzO2NsZWFyVGltZW91dChGKTtGPXNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgZz1kLmRhdGEoImNsdWV0aXAiKS5lbnRlcmVkLGY9ZS5kYXRhKCJlbnRlcmVkIiksCmk9ZmFsc2U7aWYoYS5tb3VzZU91dENsb3NlPT0iYm90aCImJihnfHxmKSlpPXRydWU7ZWxzZSBpZigoYS5tb3VzZU91dENsb3NlPT09dHJ1ZXx8YS5tb3VzZU91dENsb3NlPT0iY2x1ZXRpcCIpJiZmKWk9dHJ1ZTtlbHNlIGlmKGEubW91c2VPdXRDbG9zZT09ImxpbmsiJiZnKWk9dHJ1ZTtpfHxlYS5jYWxsKGIpfSxhLmRlbGF5ZWRDbG9zZSl9O2MoZG9jdW1lbnQpLnVuYmluZCgiaGlkZUNsdWV0aXAuY2x1ZXRpcCIpLmJpbmQoImhpZGVDbHVldGlwLmNsdWV0aXAiLGZ1bmN0aW9uKGIpe2VhKGMoYi50YXJnZXQpKX0pO2lmKC9jbGlja3x0b2dnbGUvLnRlc3QoYS5hY3RpdmF0aW9uKSlkLmJpbmQoImNsaWNrLmNsdWV0aXAiLGZ1bmN0aW9uKGIpe2lmKGUuaXMoIjpoaWRkZW4iKXx8IWQuaXMoIi5jbHVldGlwLWNsaWNrZWQiKSl7ZGEoYik7YygiLmNsdWV0aXAtY2xpY2tlZCIpLnJlbW92ZUNsYXNzKCJjbHVldGlwLWNsaWNrZWQiKTtkLmFkZENsYXNzKCJjbHVldGlwLWNsaWNrZWQiKX1lbHNlIGZhKGIpOwpyZXR1cm4gZmFsc2V9KTtlbHNlIGlmKGEuYWN0aXZhdGlvbj09ImZvY3VzIil7ZC5iaW5kKCJmb2N1cy5jbHVldGlwIixmdW5jdGlvbihiKXtkLmF0dHJQcm9wKCJ0aXRsZSIsIiIpO2RhKGIpfSk7ZC5iaW5kKCJibHVyLmNsdWV0aXAiLGZ1bmN0aW9uKGIpe2QuYXR0clByb3AoInRpdGxlIixkLmRhdGEoImNsdWV0aXAiKS50aXRsZSk7ZmEoYil9KX1lbHNle2RbYS5jbGlja1Rocm91Z2g/InVuYmluZCI6ImJpbmQiXSgiY2xpY2suY2x1ZXRpcCIsayk7dmFyIHFhPWZ1bmN0aW9uKGIpe2lmKGEudHJhY2tpbmcpe3ZhciBnPW4tYi5wYWdlWCxmPXU/dS1iLnBhZ2VZOngtYi5wYWdlWTtkLmJpbmQoIm1vdXNlbW92ZS5jbHVldGlwIixmdW5jdGlvbihpKXtlLmNzcyh7bGVmdDppLnBhZ2VYK2csdG9wOmkucGFnZVkrZn0pfSl9fTtjLmZuLmhvdmVySW50ZW50JiZhLmhvdmVySW50ZW50P2QuaG92ZXJJbnRlbnQoe3NlbnNpdGl2aXR5OmEuaG92ZXJJbnRlbnQuc2Vuc2l0aXZpdHksaW50ZXJ2YWw6YS5ob3ZlckludGVudC5pbnRlcnZhbCwKb3ZlcjpmdW5jdGlvbihiKXtkYShiKTtxYShiKX0sdGltZW91dDphLmhvdmVySW50ZW50LnRpbWVvdXQsb3V0OmZ1bmN0aW9uKGIpe2ZhKGIpO2QudW5iaW5kKCJtb3VzZW1vdmUuY2x1ZXRpcCIpfX0pOmQuYmluZCgibW91c2VlbnRlci5jbHVldGlwIixmdW5jdGlvbihiKXtkYShiKTtxYShiKX0pLmJpbmQoIm1vdXNlbGVhdmUuY2x1ZXRpcCIsZnVuY3Rpb24oYil7ZmEoYik7ZC51bmJpbmQoIm1vdXNlbW92ZS5jbHVldGlwIil9KTtkLmJpbmQoIm1vdXNlb3Zlci5jbHVldGlwIixmdW5jdGlvbigpe2QuYXR0clByb3AoInRpdGxlIiwiIil9KS5iaW5kKCJtb3VzZWxlYXZlLmNsdWV0aXAiLGZ1bmN0aW9uKCl7ZC5hdHRyUHJvcCgidGl0bGUiLGQuZGF0YSgiY2x1ZXRpcCIpLnRpdGxlKX0pfX0pO3JldHVybiB0aGlzfTsoZnVuY3Rpb24oKXtjLnN1cHBvcnQ9Yy5zdXBwb3J0fHx7fTtmb3IodmFyIG09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iikuc3R5bGUscT1bImJveFNoYWRvdyJdLApVPVsibW96IiwiTW96Iiwid2Via2l0IiwibyJdLFY9MCxlPXEubGVuZ3RoO1Y8ZTtWKyspe3ZhciBoPXFbVl0sST1oLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2guc2xpY2UoMSk7aWYodHlwZW9mIG1baF0hPT0idW5kZWZpbmVkIiljLnN1cHBvcnRbaF09aDtlbHNlIGZvcih2YXIgdz0wLEo9VS5sZW5ndGg7dzxKO3crKylpZih0eXBlb2YgbVtVW3ddK0ldIT09InVuZGVmaW5lZCIpe2Muc3VwcG9ydFtoXT1VW3ddK0k7YnJlYWt9fX0pKCk7Yy5mbi5jbHVldGlwLmRlZmF1bHRzPWMuY2x1ZXRpcC5kZWZhdWx0c30pKGpRdWVyeSk7KGZ1bmN0aW9uKGMpe2MuZXh0ZW5kKHRydWUsYy5mbi5jbHVldGlwLHtiYWNrQ29tcGF0OnRydWUsdGVtcGxhdGU6JzxkaXYgaWQ9ImNsdWV0aXAiPjxkaXYgaWQ9ImNsdWV0aXAtb3V0ZXIiIGNsYXNzPSJjbHVldGlwLW91dGVyIj48aDMgaWQ9ImNsdWV0aXAtdGl0bGUiIGNsYXNzPSJjbHVldGlwLXRpdGxlIHVpLXdpZGdldC1oZWFkZXIgdWktY2x1ZXRpcC1oZWFkZXIiPjwvaDM+PGRpdiBpZD0iY2x1ZXRpcC1pbm5lciIgY2xhc3M9ImNsdWV0aXAtaW5uZXIgdWktd2lkZ2V0LWNvbnRlbnQgdWktY2x1ZXRpcC1jb250ZW50Ij48L2Rpdj48L2Rpdj48ZGl2IGlkPSJjbHVldGlwLWV4dHJhIj48L2Rpdj48ZGl2IGlkPSJjbHVldGlwLWFycm93cyIgY2xhc3M9ImNsdWV0aXAtYXJyb3dzIj48L2Rpdj48L2Rpdj4nfSl9KShqUXVlcnkpOwo=]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/jquery.cluetip.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogZ2xvYmFsICovCmRpdi51aS1jbHVldGlwIHsKICBmb250LXNpemU6IDFlbTsKfQoudWktY2x1ZXRpcC1oZWFkZXIsCi51aS1jbHVldGlwLWNvbnRlbnQgewogIHBhZGRpbmc6IDEycHg7Cn0KLnVpLWNsdWV0aXAtaGVhZGVyIHsKICBmb250LXNpemU6IDFlbTsKICBtYXJnaW46IDA7CiAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLmNsdWV0aXAtdGl0bGUgLmNsdWV0aXAtY2xvc2UgewogIGZsb2F0OiByaWdodDsKICBwb3NpdGlvbjogcmVsYXRpdmU7Cn0KLmNsdWV0aXAtY2xvc2UgaW1nIHsKICBib3JkZXI6IDA7Cn0KCiNjbHVldGlwLXdhaXRpbWFnZSB7CiAgd2lkdGg6IDQzcHg7CiAgaGVpZ2h0OiAxMXB4OwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoaW1hZ2VzL3dhaXQuZ2lmKTsKfQouY2x1ZXRpcC1hcnJvd3MgewogIGRpc3BsYXk6IG5vbmU7CiAgcG9zaXRpb246IGFic29sdXRlOwogIHRvcDogMDsKICBsZWZ0OiAtMTFweDsKICB3aWR0aDogMTFweDsKICBoZWlnaHQ6IDIycHg7CiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsKICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIDA7CiAgYm9yZGVyLXdpZHRoOiAwOwp9Ci5jbHVldGlwLWV4dHJhIHsKICBkaXNwbGF5OiBub25lOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgID1jbHVldGlwQ2xhc3M6ICdkZWZhdWx0JwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLmNsdWV0aXAtZGVmYXVsdCwKLmNsdWV0aXAtZGVmYXVsdCAuY2x1ZXRpcC1vdXRlciB7CiAgYmFja2dyb3VuZC1jb2xvcjogI2Q5ZDljMjsKfQouY2x1ZXRpcC1kZWZhdWx0IC51aS1jbHVldGlwLWhlYWRlciB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzg3ODc2YTsKfQoKCi8qCi5jbHVldGlwLWRlZmF1bHQgI2NsdWV0aXAtb3V0ZXIgewogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICBtYXJnaW46IDA7CiAgYmFja2dyb3VuZC1jb2xvcjogI2Q5ZDljMjsKfQouY2x1ZXRpcC1kZWZhdWx0IGgzI2NsdWV0aXAtdGl0bGUgewogIG1hcmdpbjogMCAwIDVweDsKICBwYWRkaW5nOiA4cHggMTBweCA0cHg7CiAgZm9udC1zaXplOiAxLjFlbTsKICBmb250LXdlaWdodDogbm9ybWFsOwogIGJhY2tncm91bmQtY29sb3I6ICM4Nzg3NmE7CiAgY29sb3I6ICNmZmY7Cn0KLmNsdWV0aXAtZGVmYXVsdCAjY2x1ZXRpcC10aXRsZSBhIHsKICBjb2xvcjogI2Q5ZDljMjsKICBmb250LXNpemU6IDAuOTVlbTsKfQouY2x1ZXRpcC1kZWZhdWx0ICNjbHVldGlwLWlubmVyIHsKICBwYWRkaW5nOiAxMHB4Owp9Ci5jbHVldGlwLWRlZmF1bHQgZGl2I2NsdWV0aXAtY2xvc2UgewogIHRleHQtYWxpZ246IHJpZ2h0OwogIG1hcmdpbjogMCA1cHggNXB4OwogIGNvbG9yOiAjOTAwOwp9CiovCi8qIGRlZmF1bHQgYXJyb3dzICovCmRpdi5jbHVldGlwLWRlZmF1bHQgLmNsdWV0aXAtYXJyb3dzIHsKICBib3JkZXItd2lkdGg6IDA7CiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgbm9uZTsKfQpkaXYuY2x1ZS1yaWdodC1kZWZhdWx0IC5jbHVldGlwLWFycm93cyB7CiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGltYWdlcy9kYXJyb3dsZWZ0LmdpZik7Cn0KZGl2LmNsdWUtbGVmdC1kZWZhdWx0IC5jbHVldGlwLWFycm93cyB7CiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGltYWdlcy9kYXJyb3dyaWdodC5naWYpOwogIGxlZnQ6IDEwMCU7CiAgbWFyZ2luLXJpZ2h0OiAtMTFweDsKfQpkaXYuY2x1ZS10b3AtZGVmYXVsdCAuY2x1ZXRpcC1hcnJvd3MgewogIGJhY2tncm91bmQtaW1hZ2U6IHVybChpbWFnZXMvZGFycm93ZG93bi5naWYpOwogIHRvcDogMTAwJTsKICBsZWZ0OiA1MCU7CiAgbWFyZ2luLWxlZnQ6IC0xMXB4OwogIHdpZHRoOiAyMnB4OwogIGhlaWdodDogMTFweDsKfQpkaXYuY2x1ZS1ib3R0b20tZGVmYXVsdCAuY2x1ZXRpcC1hcnJvd3MgewogIGJhY2tncm91bmQtaW1hZ2U6IHVybChpbWFnZXMvZGFycm93dXAuZ2lmKTsKICB0b3A6IC0xMXB4OwogIGxlZnQ6IDUwJTsKICBtYXJnaW4tbGVmdDogLTExcHg7CiAgd2lkdGg6IDIycHg7CiAgaGVpZ2h0OiAxMXB4Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgID1jbHVldGlwQ2xhc3M6ICdqdGlwJwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwouY2x1ZXRpcC1qdGlwIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOwp9Ci5jbHVldGlwLWp0aXAgLmNsdWV0aXAtb3V0ZXIgewogIGJvcmRlcjogMnB4IHNvbGlkICNjY2M7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIGJhY2tncm91bmQtY29sb3I6ICNmZmY7Cn0KCi5jbHVldGlwLWp0aXAgLmNsdWV0aXAtaW5uZXIgewogIHBhZGRpbmc6IDVweDsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KLmNsdWV0aXAtanRpcCBkaXYuY2x1ZXRpcC1jbG9zZSB7CiAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgbWFyZ2luOiAwIDVweCAwOwogIGNvbG9yOiAjOTAwOwp9CgouY2x1ZXRpcC1qdGlwIC51aS1jbHVldGlwLWhlYWRlciB7CiAgYmFja2dyb3VuZC1jb2xvcjogI2NjYzsKICBwYWRkaW5nOiA2cHg7Ci8qICBtYXJnaW4tYm90dG9tOiAxZW07Ki8KfQoKLyoganRpcCBhcnJvd3MgKi8KZGl2LmNsdWV0aXAtanRpcCAuY2x1ZXRpcC1hcnJvd3MgewogIGJvcmRlci13aWR0aDogMDsKICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudCBub25lOwp9CmRpdi5jbHVlLXJpZ2h0LWp0aXAgLmNsdWV0aXAtYXJyb3dzIHsKICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoaW1hZ2VzL2Fycm93bGVmdC5naWYpOwp9CmRpdi5jbHVlLWxlZnQtanRpcCAuY2x1ZXRpcC1hcnJvd3MgewogIGJhY2tncm91bmQtaW1hZ2U6IHVybChpbWFnZXMvYXJyb3dyaWdodC5naWYpOwogIGxlZnQ6IDEwMCU7CiAgbWFyZ2luLXJpZ2h0OiAtMTFweDsKfQpkaXYuY2x1ZS10b3AtanRpcCAuY2x1ZXRpcC1hcnJvd3MgewogIGJhY2tncm91bmQtaW1hZ2U6IHVybChpbWFnZXMvYXJyb3dkb3duLmdpZik7CiAgdG9wOiAxMDAlOwogIGxlZnQ6IDUwJTsKICB3aWR0aDogMjJweDsKICBoZWlnaHQ6IDExcHg7CiAgbWFyZ2luLWxlZnQ6IC0xMXB4Owp9CmRpdi5jbHVlLWJvdHRvbS1qdGlwIC5jbHVldGlwLWFycm93cyB7CiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGltYWdlcy9hcnJvd3VwLmdpZik7CiAgdG9wOiAtMTFweDsKICBsZWZ0OiA1MCU7CiAgd2lkdGg6IDIycHg7CiAgaGVpZ2h0OiAxMXB4OwogIG1hcmdpbi1sZWZ0OiAtMTFweDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICA9Y2x1ZXRpcENsYXNzOiAncm91bmRlZCcKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLmNsdWV0aXAtcm91bmRlZCB7CiAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA2cHg7CiAgLW1vei1ib3JkZXItcmFkaXVzOiA2cHg7CiAgYm9yZGVyLXJhZGl1czogNnB4OwogIGJhY2tncm91bmQtY29sb3I6ICNmZmY7CiAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKfQoKLmNsdWV0aXAtcm91bmRlZCAuY2x1ZXRpcC1vdXRlciB7CiAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA2cHg7CiAgLW1vei1ib3JkZXItcmFkaXVzOiA2cHg7CiAgYm9yZGVyLXJhZGl1czogNnB4OwogIGJhY2tncm91bmQtY29sb3I6ICNmZmY7Cn0KCi5jbHVldGlwLXJvdW5kZWQgIC5jbHVldGlwLWFycm93cyB7CiAgYm9yZGVyLWNvbG9yOiAjY2NjOwp9CgovKiBuZWVkIHRvIGJlIG1vcmUgc3BlY2lmaWMgaGVyZSB0byBvdmVycmlkZSBUaGVtZVJvbGxlciBkZWZhdWx0cyAqLwpkaXYuY2x1ZXRpcC1yb3VuZGVkICAuY2x1ZXRpcC1hcnJvd3MgewogIGZvbnQtc2l6ZTogMDsKICBsaW5lLWhlaWdodDogMCU7CiAgd2lkdGg6IDA7CiAgaGVpZ2h0OiAwOwogIGJvcmRlci1zdHlsZTogc29saWQ7CiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgbm9uZTsKfQpkaXYuY2x1ZS1yaWdodC1yb3VuZGVkIC5jbHVldGlwLWFycm93cyB7CiAgYm9yZGVyLXdpZHRoOiAxMXB4IDExcHggMTFweCAwOwogIGJvcmRlci10b3AtY29sb3I6IHRyYW5zcGFyZW50OwogIGJvcmRlci1ib3R0b20tY29sb3I6IHRyYW5zcGFyZW50OwogIGJvcmRlci1sZWZ0LWNvbG9yOiB0cmFuc3BhcmVudDsKfQpkaXYuY2x1ZS1sZWZ0LXJvdW5kZWQgLmNsdWV0aXAtYXJyb3dzIHsKICBsZWZ0OiAxMDAlOwogIG1hcmdpbi1yaWdodDogLTExcHg7CiAgYm9yZGVyLXdpZHRoOiAxMXB4IDAgMTFweCAxMXB4OwogIGJvcmRlci10b3AtY29sb3I6IHRyYW5zcGFyZW50OwogIGJvcmRlci1yaWdodC1jb2xvcjogdHJhbnNwYXJlbnQ7CiAgYm9yZGVyLWJvdHRvbS1jb2xvcjogdHJhbnNwYXJlbnQ7Cgp9CmRpdi5jbHVlLXRvcC1yb3VuZGVkIC5jbHVldGlwLWFycm93cyB7CiAgdG9wOiAxMDAlOwogIGxlZnQ6IDUwJTsKICBib3JkZXItd2lkdGg6IDExcHggMTFweCAwIDExcHg7CiAgYm9yZGVyLXJpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsKICBib3JkZXItYm90dG9tLWNvbG9yOiB0cmFuc3BhcmVudDsKICBib3JkZXItbGVmdC1jb2xvcjogdHJhbnNwYXJlbnQ7Cn0KLmNsdWUtYm90dG9tLXJvdW5kZWQgLmNsdWV0aXAtYXJyb3dzIHsKICB0b3A6IC0xMXB4OwogIGxlZnQ6IDUwJTsKICBib3JkZXItd2lkdGg6IDAgMTFweCAxMXB4IDExcHg7CiAgYm9yZGVyLXRvcC1jb2xvcjogdHJhbnNwYXJlbnQ7CiAgYm9yZGVyLXJpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsKICBib3JkZXItbGVmdC1jb2xvcjogdHJhbnNwYXJlbnQ7Cgp9Ci8qIHN0dXBpZCBJRTYgSGFzTGF5b3V0IGhhY2sgKi8KLmNsdWV0aXAtcm91bmRlZCAuY2x1ZXRpcC10aXRsZSwKLmNsdWV0aXAtcm91bmRlZCAuY2x1ZXRpcC1pbm5lciB7CiAgem9vbTogMTsKfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/jquery.cluetip.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohCiAqIGpRdWVyeSBjbHVlVGlwIHBsdWdpbiB2MS4yLjcKICoKICogRGF0ZTogU2F0IE9jdCAxMyAxNzoxNzo0NyAyMDEyIEVEVAogKiBSZXF1aXJlczogalF1ZXJ5IHYxLjMrCiAqCiAqIENvcHlyaWdodCAyMDEyLCBLYXJsIFN3ZWRiZXJnCiAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgR1BMIGxpY2Vuc2VzOgogKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocAogKiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLmh0bWwKICoKICoKICogRXhhbXBsZXMgY2FuIGJlIGZvdW5kIGF0IGh0dHA6Ly9wbHVnaW5zLmxlYXJuaW5nanF1ZXJ5LmNvbS9jbHVldGlwL2RlbW8vCiAqCiovCgooZnVuY3Rpb24oJCkgewoKICAkLmNsdWV0aXAgPSB7CiAgICB2ZXJzaW9uOiAnMS4yLjcnLAoKICAgIC8vIHRoZSBIVE1MIHRoYXQgd2lsbCBiZSB1c2VkIGZvciB0aGUgdG9vbHRpcAogICAgdGVtcGxhdGU6IFsnPGRpdj4nLAogICAgICAnPGRpdiBjbGFzcz0iY2x1ZXRpcC1vdXRlciI+JywKICAgICAgICAnPGgzIGNsYXNzPSJjbHVldGlwLXRpdGxlIHVpLXdpZGdldC1oZWFkZXIgdWktY2x1ZXRpcC1oZWFkZXIiPjwvaDM+JywKICAgICAgICAnPGRpdiBjbGFzcz0iY2x1ZXRpcC1pbm5lciB1aS13aWRnZXQtY29udGVudCB1aS1jbHVldGlwLWNvbnRlbnQiPjwvZGl2PicsCiAgICAgICc8L2Rpdj4nLAogICAgICAnPGRpdiBjbGFzcz0iY2x1ZXRpcC1leHRyYSI+PC9kaXY+JywKICAgICc8L2Rpdj4nXS5qb2luKCcnKSwKCiAgICAvKiBjbHVlVGlwIHNldHVwCiAgICAgKiAgdGhlIHNldHVwIG9wdGlvbnMgYXJlIGFwcGxpZWQgZWFjaCB0aW1lIC5jbHVldGlwKCkgaXMgY2FsbGVkLAogICAgICogIEJVVCBvbmx5IGlmIDxkaXYgaWQ9ImNsdWV0aXAiPiBpcyBub3QgYWxyZWFkeSBpbiB0aGUgZG9jdW1lbnQKICAgICovCiAgICBzZXR1cDogewogICAgICAvLyBtZXRob2QgdG8gYmUgdXNlZCBmb3IgaW5zZXJ0aW5nIHRoZSBjbHVlVGlwIGludG8gdGhlIERPTS4KICAgICAgLy8gUGVybWl0dGVkIHZhbHVlcyBhcmUgJ2FwcGVuZFRvJywgJ3ByZXBlbmRUbycsICdpbnNlcnRCZWZvcmUnLCBhbmQgJ2luc2VydEFmdGVyJwogICAgICBpbnNlcnRpb25UeXBlOiAnYXBwZW5kVG8nLAogICAgICAvLyBlbGVtZW50IGluIHRoZSBET00gdGhlIHBsdWdpbiB3aWxsIHJlZmVyZW5jZSB3aGVuIGluc2VydGluZyB0aGUgY2x1ZVRpcC4KICAgICAgaW5zZXJ0aW9uRWxlbWVudDogJ2JvZHknCiAgICB9LAoKICAgIC8qCiAgICAgKiBjbHVlVGlwIG9wdGlvbnMKICAgICAqCiAgICAgKiBlYWNoIG9uZSBjYW4gYmUgZXhwbGljaXRseSBvdmVycmlkZGVuIGJ5IGNoYW5naW5nIGl0cyB2YWx1ZS4KICAgICAqIGZvciBleGFtcGxlOiAkLmNsdWV0aXAuZGVmYXVsdHMud2lkdGggPSAyMDA7CiAgICAgKiAgICAgICAgIG9yOiAkLmZuLmNsdWV0aXAuZGVmYXVsdHMud2lkdGggPSAyMDA7IC8vIGZvciBjb21wYXRpYmlsaXR5IHdpdGggcHJldmlvdXMgY2x1ZVRpcCB2ZXJzaW9ucwogICAgICogd291bGQgY2hhbmdlIHRoZSBkZWZhdWx0IHdpZHRoIGZvciBhbGwgY2x1ZVRpcHMgdG8gMjAwLgogICAgICoKICAgICAqIGVhY2ggb25lIGNhbiBhbHNvIGJlIG92ZXJyaWRkZW4gYnkgcGFzc2luZyBhbiBvcHRpb25zIG1hcCB0byB0aGUgY2x1ZXRpcCBtZXRob2QuCiAgICAgKiBmb3IgZXhhbXBsZTogJCgnYS5leGFtcGxlJykuY2x1ZXRpcCh7d2lkdGg6IDIwMH0pOwogICAgICogd291bGQgY2hhbmdlIHRoZSBkZWZhdWx0IHdpZHRoIHRvIDIwMCBmb3IgY2x1ZVRpcHMgaW52b2tlZCBieSBhIGxpbmsgd2l0aCBjbGFzcyBvZiAiZXhhbXBsZSIKICAgICAqCiAgICAqLwogICAgZGVmYXVsdHM6IHsKICAgICAgbXVsdGlwbGU6ICAgICAgICAgZmFsc2UsICAgIC8vIEFsbG93IGEgbmV3IHRvb2x0aXAgdG8gYmUgY3JlYXRlZCBmb3IgZWFjaCAuY2x1ZXRpcCgpIGNhbGwKICAgICAgd2lkdGg6ICAgICAgICAgICAgMjc1LCAgICAgIC8vIFRoZSB3aWR0aCBvZiB0aGUgY2x1ZVRpcAogICAgICBoZWlnaHQ6ICAgICAgICAgICAnYXV0bycsICAgLy8gVGhlIGhlaWdodCBvZiB0aGUgY2x1ZVRpcAogICAgICBjbHVlekluZGV4OiAgICAgICA5NywgICAgICAgLy8gU2V0cyB0aGUgei1pbmRleCBzdHlsZSBwcm9wZXJ0eSBvZiB0aGUgY2x1ZVRpcAogICAgICBwb3NpdGlvbkJ5OiAgICAgICAnYXV0bycsICAgLy8gU2V0cyB0aGUgdHlwZSBvZiBwb3NpdGlvbmluZzogJ2F1dG8nLCAnbW91c2UnLCdib3R0b21Ub3AnLCAndG9wQm90dG9tJywgZml4ZWQnCiAgICAgIHRvcE9mZnNldDogICAgICAgIDE1LCAgICAgICAvLyBOdW1iZXIgb2YgcHggdG8gb2Zmc2V0IGNsdWVUaXAgZnJvbSB0b3Agb2YgaW52b2tpbmcgZWxlbWVudAogICAgICBsZWZ0T2Zmc2V0OiAgICAgICAxNSwgICAgICAgLy8gTnVtYmVyIG9mIHB4IHRvIG9mZnNldCBjbHVlVGlwIGZyb20gbGVmdCBvZiBpbnZva2luZyBlbGVtZW50CiAgICAgIHNuYXBUb0VkZ2U6ICAgICAgIGZhbHNlLCAgICAvLyBGb3IgYm90dG9tVG9wIGFuZCB0b3BCb3R0b20sIHNuYXAgdG8gdGhlIHRvcCBvciBib3R0b20gb2YgdGhlIGVsZW1lbnQuCiAgICAgIGxvY2FsOiAgICAgICAgICAgIGZhbHNlLCAgICAvLyBXaGV0aGVyIHRvIHVzZSBjb250ZW50IGZyb20gdGhlIHNhbWUgcGFnZSBmb3IgdGhlIGNsdWVUaXAncyBib2R5CiAgICAgIGxvY2FsUHJlZml4OiAgICAgIG51bGwsICAgICAvLyBzdHJpbmcgdG8gYmUgcHJlcGVuZGVkIHRvIHRoZSB0aXAgYXR0cmlidXRlIGlmIGxvY2FsIGlzIHRydWUKICAgICAgbG9jYWxJZFN1ZmZpeDogICAgbnVsbCwgICAgIC8vIHN0cmluZyB0byBiZSBhcHBlbmRlZCB0byB0aGUgY2x1ZXRpcCBjb250ZW50IGVsZW1lbnQncyBpZCBpZiBsb2NhbCBpcyB0cnVlCiAgICAgIGhpZGVMb2NhbDogICAgICAgIHRydWUsICAgICAvLyBJZiBsb2NhbCBvcHRpb24gaXMgc2V0IHRvIHRydWUsIHRoaXMgZGV0ZXJtaW5lcyB3aGV0aGVyIGxvY2FsIGNvbnRlbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGJlIHNob3duIGluIGNsdWVUaXAgc2hvdWxkIGJlIGhpZGRlbiBhdCBpdHMgb3JpZ2luYWwgbG9jYXRpb24KICAgICAgYXR0cmlidXRlOiAgICAgICAgJ3JlbCcsICAgIC8vIHRoZSBhdHRyaWJ1dGUgdG8gYmUgdXNlZCBmb3IgZmV0Y2hpbmcgdGhlIGNsdWVUaXAncyBib2R5IGNvbnRlbnQKICAgICAgdGl0bGVBdHRyaWJ1dGU6ICAgJ3RpdGxlJywgIC8vIHRoZSBhdHRyaWJ1dGUgdG8gYmUgdXNlZCBmb3IgZmV0Y2hpbmcgdGhlIGNsdWVUaXAncyB0aXRsZQogICAgICBzcGxpdFRpdGxlOiAgICAgICAnJywgICAgICAgLy8gQSBjaGFyYWN0ZXIgdXNlZCB0byBzcGxpdCB0aGUgdGl0bGUgYXR0cmlidXRlIGludG8gdGhlIGNsdWVUaXAgdGl0bGUgYW5kIGRpdnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpdGhpbiB0aGUgY2x1ZVRpcCBib2R5LiBtb3JlIGluZm8gYmVsb3cgWzZdCiAgICAgIGVzY2FwZVRpdGxlOiAgICAgIGZhbHNlLCAgICAvLyB3aGV0aGVyIHRvIGh0bWwgZXNjYXBlIHRoZSB0aXRsZSBhdHRyaWJ1dGUKICAgICAgc2hvd1RpdGxlOiAgICAgICAgdHJ1ZSwgICAgIC8vIHNob3cgdGl0bGUgYmFyIG9mIHRoZSBjbHVlVGlwLCBldmVuIGlmIHRpdGxlIGF0dHJpYnV0ZSBub3Qgc2V0CiAgICAgIGNsdWV0aXBDbGFzczogICAgICdkZWZhdWx0JywvLyBjbGFzcyBhZGRlZCB0byBvdXRlcm1vc3QgY2x1ZVRpcCBkaXYgaW4gdGhlIGZvcm0gb2YgJ2NsdWV0aXAtJyArIGNsdWVUaXBDbGFzcy4KICAgICAgaG92ZXJDbGFzczogICAgICAgJycsICAgICAgIC8vIGNsYXNzIGFwcGxpZWQgdG8gdGhlIGludm9raW5nIGVsZW1lbnQgb25tb3VzZW92ZXIgYW5kIHJlbW92ZWQgb25tb3VzZW91dAogICAgICB3YWl0SW1hZ2U6ICAgICAgICB0cnVlLCAgICAgLy8gd2hldGhlciB0byBzaG93IGEgImxvYWRpbmciIGltZywgd2hpY2ggaXMgc2V0IGluIGpxdWVyeS5jbHVldGlwLmNzcwogICAgICBjdXJzb3I6ICAgICAgICAgICAnaGVscCcsCiAgICAgIGFycm93czogICAgICAgICAgIGZhbHNlLCAgICAvLyBpZiB0cnVlLCBkaXNwbGF5cyBhcnJvdyBvbiBhcHByb3ByaWF0ZSBzaWRlIG9mIGNsdWVUaXAKICAgICAgZHJvcFNoYWRvdzogICAgICAgdHJ1ZSwgICAgIC8vIHNldCB0byBmYWxzZSBpZiB5b3UgZG9uJ3Qgd2FudCB0aGUgZHJvcC1zaGFkb3cgZWZmZWN0IG9uIHRoZSBjbHVlVGlwCiAgICAgIGRyb3BTaGFkb3dTdGVwczogIDYsICAgICAgICAvLyBhZGp1c3RzIHRoZSBzaXplIG9mIHRoZSBkcm9wIHNoYWRvdwogICAgICBzdGlja3k6ICAgICAgICAgICBmYWxzZSwgICAgLy8ga2VlcCB2aXNpYmxlIHVudGlsIG1hbnVhbGx5IGNsb3NlZAogICAgICBtb3VzZU91dENsb3NlOiAgICBmYWxzZSwgICAgLy8gY2xvc2Ugd2hlbiBjbHVlVGlwIGlzIG1vdXNlZCBvdXQ6IGZhbHNlLCAnY2x1ZXRpcCcsICdsaW5rJywgJ2JvdGgnCiAgICAgIGRlbGF5ZWRDbG9zZTogICAgIDUwLCAgICAgICAgLy8gY2xvc2UgY2x1ZVRpcCBvbiBhIHRpbWVkIGRlbGF5CiAgICAgIGFjdGl2YXRpb246ICAgICAgICdob3ZlcicsICAvLyBzZXQgdG8gJ2NsaWNrJyB0byBmb3JjZSB1c2VyIHRvIGNsaWNrIHRvIHNob3cgY2x1ZVRpcAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHRvICdmb2N1cycgdG8gc2hvdyBvbiBmb2N1cyBvZiBhIGZvcm0gZWxlbWVudCBhbmQgaGlkZSBvbiBibHVyCiAgICAgIGNsaWNrVGhyb3VnaDogICAgIHRydWUsICAgIC8vIGlmIHRydWUsIGFuZCBhY3RpdmF0aW9uIGlzIG5vdCAnY2xpY2snLCB0aGVuIGNsaWNraW5nIG9uIGxpbmsgd2lsbCB0YWtlIHVzZXIgdG8gdGhlIGxpbmsncyBocmVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbiBpZiBocmVmIGFuZCB0aXBBdHRyaWJ1dGUgYXJlIGVxdWFsCiAgICAgIHRyYWNraW5nOiAgICAgICAgIGZhbHNlLCAgICAvLyBpZiB0cnVlLCBjbHVlVGlwIHdpbGwgdHJhY2sgbW91c2UgbW92ZW1lbnQgKGV4cGVyaW1lbnRhbCkKICAgICAgY2xvc2VQb3NpdGlvbjogICAgJ3RvcCcsICAgIC8vIGxvY2F0aW9uIG9mIGNsb3NlIHRleHQgZm9yIHN0aWNreSBjbHVldGlwczsgY2FuIGJlICd0b3AnLCAnYm90dG9tJywgJ3RpdGxlJyBvciAnbm9uZScKICAgICAgY2xvc2VUZXh0OiAgICAgICAgJ0Nsb3NlJywgIC8vIHRleHQgKG9yIEhUTUwpIHRvIHRvIGJlIGNsaWNrZWQgdG8gY2xvc2Ugc3RpY2t5IGNsdWVUaXBzCiAgICAgIHRydW5jYXRlOiAgICAgICAgIDAsICAgICAgICAvLyBudW1iZXIgb2YgY2hhcmFjdGVycyB0byB0cnVuY2F0ZSBjbHVlVGlwJ3MgY29udGVudHMuIGlmIDAsIG5vIHRydW5jYXRpb24gb2NjdXJzCgogICAgICAvLyBlZmZlY3QgYW5kIHNwZWVkIGZvciBvcGVuaW5nIGNsdWVUaXBzCiAgICAgIGZ4OiB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW46ICAgICAgICdzaG93JywgLy8gY2FuIGJlICdzaG93JyBvciAnc2xpZGVEb3duJyBvciAnZmFkZUluJwogICAgICAgICAgICAgICAgICAgICAgICBvcGVuU3BlZWQ6ICAnJwogICAgICB9LAoKICAgICAgLy8gc2V0dGluZ3MgZm9yIHdoZW4gaG92ZXJJbnRlbnQgcGx1Z2luIGlzIHVzZWQKICAgICAgaG92ZXJJbnRlbnQ6IHsKICAgICAgICAgICAgICAgICAgICAgICAgc2Vuc2l0aXZpdHk6ICAzLAogICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnZhbDogICAgIDUwLAogICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0OiAgICAgIDAKICAgICAgfSwKCiAgICAgIC8vIHNob3J0LWNpcmN1aXQgZnVuY3Rpb24gdG8gcnVuIGp1c3QgYmVmb3JlIGNsdWVUaXAgaXMgc2hvd24uCiAgICAgIG9uQWN0aXZhdGU6ICAgICAgIGZ1bmN0aW9uKGUpIHtyZXR1cm4gdHJ1ZTt9LAogICAgICAvLyBmdW5jdGlvbiB0byBydW4ganVzdCBhZnRlciBjbHVlVGlwIGlzIHNob3duLgogICAgICBvblNob3c6ICAgICAgICAgICBmdW5jdGlvbihjdCwgY2kpe30sCiAgICAgIC8vIGZ1bmN0aW9uIHRvIHJ1biBqdXN0IGFmdGVyIGNsdWVUaXAgaXMgaGlkZGVuLgogICAgICBvbkhpZGU6ICAgICAgICAgICBmdW5jdGlvbihjdCwgY2kpe30sCiAgICAgIC8vIHdoZXRoZXIgdG8gY2FjaGUgcmVzdWx0cyBvZiBhamF4IHJlcXVlc3QgdG8gYXZvaWQgdW5uZWNlc3NhcnkgaGl0cyB0byBzZXJ2ZXIKICAgICAgYWpheENhY2hlOiAgICAgICAgdHJ1ZSwKCiAgICAgIC8vIHByb2Nlc3MgZGF0YSByZXRyaWV2ZWQgdmlhIHhociBiZWZvcmUgaXQncyBkaXNwbGF5ZWQKICAgICAgYWpheFByb2Nlc3M6ICAgICAgZnVuY3Rpb24oZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLnJlcGxhY2UoLzwoc2NyaXB0fHN0eWxlfHRpdGxlKVtePF0rPFwvKHNjcmlwdHxzdHlsZXx0aXRsZSk+L2dtLCAnJykucmVwbGFjZSgvPChsaW5rfG1ldGEpW14+XSs+L2csJycpOwogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRhOwogICAgICB9LAoKICAgICAgLy8gY2FuIHBhc3MgaW4gc3RhbmRhcmQgJC5hamF4KCkgcGFyYW1ldGVycy4gQ2FsbGJhY2sgZnVuY3Rpb25zLCBzdWNoIGFzIGJlZm9yZVNlbmQsCiAgICAgIC8vIHdpbGwgYmUgcXVldWVkIGZpcnN0IHdpdGhpbiB0aGUgZGVmYXVsdCBjYWxsYmFja3MuCiAgICAgIC8vIFRoZSBvbmx5IGV4Y2VwdGlvbiBpcyBlcnJvciwgd2hpY2ggb3ZlcnJpZGVzIHRoZSBkZWZhdWx0CiAgICAgIGFqYXhTZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAvLyBlcnJvcjogZnVuY3Rpb24oY3QsIGNpKSB7IC8qIG92ZXJyaWRlIGRlZmF1bHQgZXJyb3IgY2FsbGJhY2sgKi8gfSwKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVmb3JlU2VuZDogZnVuY3Rpb24oY3QsIGNpKSB7IC8qIGNhbGxlZCBmaXJzdCB3aXRoaW4gZGVmYXVsdCBiZWZvcmVTZW5kIGNhbGxiYWNrICovIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiAnaHRtbCcKICAgICAgfSwKICAgICAgZGVidWc6IGZhbHNlCgogICAgfQogIH07CiAgdmFyICRjbHVldGlwV2FpdCwKICAgICAgc3RhbmRhcmRDbGFzc2VzID0gJ2NsdWV0aXAgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWNsdWV0aXAnLAogICAgICBjYWNoZXMgPSB7fSwKICAgICAgY291bnRlciA9IDAsCiAgICAgIGltZ0NvdW50ID0gMDsKCiAgLy8gdXNlICQuZm4ucHJvcCgpIGlmIGF2YWlsYWJsZSAoalF1ZXJ5IDEuNispOyBvdGhlcndpc2UsICQuZm4uYXR0cigpCiAgJC5mbi5hdHRyUHJvcCA9ICQuZm4ucHJvcCB8fCAkLmZuLmF0dHI7CgogIC8vIC5jbHVldGlwKCkgbWV0aG9kCiAgJC5mbi5jbHVldGlwID0gZnVuY3Rpb24oanMsIG9wdGlvbnMpIHsKICAgIHZhciAkY2x1ZXRpcCwgJGNsdWV0aXBJbm5lciwgJGNsdWV0aXBPdXRlciwgJGNsdWV0aXBUaXRsZSwgJGNsdWV0aXBBcnJvd3MsICRkcm9wU2hhZG93OwogICAgaWYgKHR5cGVvZiBqcyA9PSAnb2JqZWN0JykgewogICAgICBvcHRpb25zID0ganM7CiAgICAgIGpzID0gbnVsbDsKICAgIH0KICAgIGlmIChqcyA9PSAnZGVzdHJveScpIHsKICAgICAgdmFyIGRhdGEgPSB0aGlzLmRhdGEoJ2NsdWV0aXAnKTsKICAgICAgaWYgKCBkYXRhICkgewogICAgICAgICQoZGF0YS5zZWxlY3RvcikucmVtb3ZlKCk7CiAgICAgICAgJC5yZW1vdmVEYXRhKHRoaXMsICd0aXRsZScpOwogICAgICAgICQucmVtb3ZlRGF0YSh0aGlzLCAnY2x1ZXRpcCcpOwogICAgICAgICQucmVtb3ZlRGF0YSh0aGlzLCAnY2x1ZXRpcE1vYycpOwogICAgICB9CiAgICAgICQoZG9jdW1lbnQpLnVuYmluZCgnLmNsdWV0aXAnKTsKICAgICAgcmV0dXJuIHRoaXMudW5iaW5kKCcuY2x1ZXRpcCcpOwogICAgfQoKICAgIC8vIG1lcmdlIHBlci1jYWxsIG9wdGlvbnMgd2l0aCBkZWZhdWx0cwogICAgb3B0aW9ucyA9ICQuZXh0ZW5kKHRydWUsIHt9LCAkLmNsdWV0aXAuZGVmYXVsdHMsIG9wdGlvbnMgfHwge30pOwoKICAgIC8qKiA9Y3JlYXRlIGNsdWV0aXAgZGl2cyAqKi8KICAgIGNvdW50ZXIrKzsKICAgIHZhciBjbHVlekluZGV4LAogICAgICAgIGNsdWV0aXBJZCA9ICQuY2x1ZXRpcC5iYWNrQ29tcGF0IHx8ICFvcHRpb25zLm11bHRpcGxlID8gJ2NsdWV0aXAnIDogJ2NsdWV0aXAtJyArIGNvdW50ZXIsCiAgICAgICAgY2x1ZXRpcFNlbGVjdG9yID0gJyMnICsgY2x1ZXRpcElkLAogICAgICAgIHByZWZpeCA9ICQuY2x1ZXRpcC5iYWNrQ29tcGF0ID8gJyMnIDogJy4nLAogICAgICAgIGluc2VydGlvblR5cGUgPSAkLmNsdWV0aXAuc2V0dXAuaW5zZXJ0aW9uVHlwZSwKICAgICAgICBpbnNlcnRpb25FbGVtZW50ID0gJC5jbHVldGlwLnNldHVwLmluc2VydGlvbkVsZW1lbnQgfHwgJ2JvZHknOwoKICAgIGluc2VydGlvblR5cGUgPSAoL2FwcGVuZFRvfHByZXBlbmRUb3xpbnNlcnRCZWZvcmV8aW5zZXJ0QWZ0ZXIvKS50ZXN0KGluc2VydGlvblR5cGUpID8gaW5zZXJ0aW9uVHlwZSA6ICdhcHBlbmRUbyc7CiAgICAkY2x1ZXRpcCA9ICQoY2x1ZXRpcFNlbGVjdG9yKTsKICAgIGlmICghJGNsdWV0aXAubGVuZ3RoKSB7CgogICAgICAkY2x1ZXRpcCA9ICQoJC5jbHVldGlwLnRlbXBsYXRlKQogICAgICBbaW5zZXJ0aW9uVHlwZV0oaW5zZXJ0aW9uRWxlbWVudCkKICAgICAgLmF0dHIoJ2lkJywgY2x1ZXRpcElkKQogICAgICAuY3NzKHtwb3NpdGlvbjogJ2Fic29sdXRlJywgZGlzcGxheTogJ25vbmUnfSk7CgogICAgICBjbHVlekluZGV4ID0gK29wdGlvbnMuY2x1ZXpJbmRleDsKICAgICAgJGNsdWV0aXBPdXRlciA9ICRjbHVldGlwLmZpbmQocHJlZml4ICsgJ2NsdWV0aXAtb3V0ZXInKS5jc3Moe3Bvc2l0aW9uOiAncmVsYXRpdmUnLCB6SW5kZXg6IGNsdWV6SW5kZXh9KTsKICAgICAgJGNsdWV0aXBJbm5lciA9ICRjbHVldGlwLmZpbmQocHJlZml4ICsgJ2NsdWV0aXAtaW5uZXInKTsKICAgICAgJGNsdWV0aXBUaXRsZSA9ICRjbHVldGlwLmZpbmQocHJlZml4ICsgJ2NsdWV0aXAtdGl0bGUnKTsKCiAgICAgICRjbHVldGlwLmJpbmQoJ21vdXNlZW50ZXIgbW91c2VsZWF2ZScsIGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgICAgJCh0aGlzKS5kYXRhKCdlbnRlcmVkJywgZXZlbnQudHlwZSA9PT0gJ21vdXNlZW50ZXInKTsKICAgICAgfSk7CiAgICB9CgogICAgJGNsdWV0aXBXYWl0ID0gJCgnI2NsdWV0aXAtd2FpdGltYWdlJyk7CiAgICBpZiAoISRjbHVldGlwV2FpdC5sZW5ndGggJiYgb3B0aW9ucy53YWl0SW1hZ2UpIHsKICAgICAgJGNsdWV0aXBXYWl0ID0gJCgnPGRpdj48L2Rpdj4nKS5hdHRyKCdpZCcsICdjbHVldGlwLXdhaXRpbWFnZScpLmNzcyh7cG9zaXRpb246ICdhYnNvbHV0ZSd9KTsKICAgICAgJGNsdWV0aXBXYWl0Lmluc2VydEJlZm9yZSgkY2x1ZXRpcCkuaGlkZSgpOwogICAgfQoKCiAgICB2YXIgY2x1ZXRpcFBhZGRpbmcgPSAocGFyc2VJbnQoJGNsdWV0aXAuY3NzKCdwYWRkaW5nTGVmdCcpLCAxMCkgfHwgMCkgKyAocGFyc2VJbnQoJGNsdWV0aXAuY3NzKCdwYWRkaW5nUmlnaHQnKSwgMTApIHx8IDApOwoKCiAgICB0aGlzLmVhY2goZnVuY3Rpb24oaW5kZXgpIHsKICAgICAgdmFyIGxpbmsgPSB0aGlzLAogICAgICAgICAgJGxpbmsgPSAkKHRoaXMpLAogICAgICAgICAgLy8gc3VwcG9ydCBtZXRhZGF0YSBwbHVnaW4gKHYxLjAgYW5kIDIuMCkKICAgICAgICAgIG9wdHMgPSAkLmV4dGVuZCh0cnVlLCB7fSwgb3B0aW9ucywgJC5tZXRhZGF0YSA/ICRsaW5rLm1ldGFkYXRhKCkgOiAkLm1ldGEgPyAkbGluay5kYXRhKCkgOiAkbGluay5kYXRhKCdjbHVldGlwJykgfHwge30pLAogICAgICAgICAgLy8gc3RhcnQgb3V0IHdpdGggbm8gY29udGVudHMgKGZvciBhamF4IGFjdGl2YXRpb24pCiAgICAgICAgICBjbHVldGlwQ29udGVudHMgPSBmYWxzZSwKICAgICAgICAgIGlzQWN0aXZlID0gZmFsc2UsCiAgICAgICAgICBjbG9zZU9uRGVsYXkgPSBudWxsLAogICAgICAgICAgdGlwQXR0cmlidXRlID0gb3B0c1tvcHRzLmF0dHJpYnV0ZV0gfHwKICAgICAgICAgICAgKCBvcHRzLmF0dHJpYnV0ZSA9PSAnaHJlZicgPyAkbGluay5hdHRyKG9wdHMuYXR0cmlidXRlKSA6ICRsaW5rLmF0dHJQcm9wKG9wdHMuYXR0cmlidXRlKSB8fCAkbGluay5hdHRyKG9wdHMuYXR0cmlidXRlKSApLAogICAgICAgICAgY3RDbGFzcyA9IG9wdHMuY2x1ZXRpcENsYXNzOwoKICAgICAgY2x1ZXpJbmRleCA9ICtvcHRzLmNsdWV6SW5kZXg7CiAgICAgICRsaW5rLmRhdGEoJ2NsdWV0aXAnLCB7dGl0bGU6IGxpbmsudGl0bGUsIHpJbmRleDogY2x1ZXpJbmRleCwgc2VsZWN0b3I6IGNsdWV0aXBTZWxlY3Rvcn0pOwoKICAgICAgaWYgKG9wdHMuYXJyb3dzICYmICEkY2x1ZXRpcC5maW5kKCcuY2x1ZXRpcC1hcnJvd3MnKS5sZW5ndGgpIHsKICAgICAgICAkY2x1ZXRpcC5hcHBlbmQoJzxkaXYgY2xhc3M9ImNsdWV0aXAtYXJyb3dzIHVpLXN0YXRlLWRlZmF1bHQiPjwvZGl2PicpOwogICAgICB9CgogICAgICBpZiAoIXRpcEF0dHJpYnV0ZSAmJiAhb3B0cy5zcGxpdFRpdGxlICYmICFqcykgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIC8vIGlmIGhpZGVMb2NhbCBpcyBzZXQgdG8gdHJ1ZSwgb24gRE9NIHJlYWR5IGhpZGUgdGhlIGxvY2FsIGNvbnRlbnQgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCBpbiB0aGUgY2x1ZVRpcAogICAgICBpZiAob3B0cy5sb2NhbCAmJiBvcHRzLmxvY2FsUHJlZml4KSB7dGlwQXR0cmlidXRlID0gb3B0cy5sb2NhbFByZWZpeCArIHRpcEF0dHJpYnV0ZTt9CiAgICAgIGlmIChvcHRzLmxvY2FsICYmIG9wdHMuaGlkZUxvY2FsICYmIHRpcEF0dHJpYnV0ZSkgeyAkKHRpcEF0dHJpYnV0ZSArICc6Zmlyc3QnKS5oaWRlKCk7IH0KCiAgICAgIHZhciB0T2Zmc2V0ID0gcGFyc2VJbnQob3B0cy50b3BPZmZzZXQsIDEwKSwgbE9mZnNldCA9IHBhcnNlSW50KG9wdHMubGVmdE9mZnNldCwgMTApOwogICAgICAvLyB2ZXJ0aWNhbCBtZWFzdXJlbWVudCB2YXJpYWJsZXMKICAgICAgdmFyIHRpcEhlaWdodCwgd0hlaWdodCwKICAgICAgICAgIGRlZkhlaWdodCA9IGlzTmFOKHBhcnNlSW50KG9wdHMuaGVpZ2h0LCAxMCkpID8gJ2F1dG8nIDogKC9cRC9nKS50ZXN0KG9wdHMuaGVpZ2h0KSA/IG9wdHMuaGVpZ2h0IDogb3B0cy5oZWlnaHQgKyAncHgnOwogICAgICB2YXIgc1RvcCwgbGlua1RvcCwgbGlua0JvdHRvbSwgcG9zWSwgdGlwWSwgbW91c2VZLCBiYXNlbGluZTsKICAgICAgLy8gaG9yaXpvbnRhbCBtZWFzdXJlbWVudCB2YXJpYWJsZXMKICAgICAgdmFyIHRpcElubmVyV2lkdGggPSBwYXJzZUludChvcHRzLndpZHRoLCAxMCkgfHwgMjc1LAogICAgICAgICAgdGlwV2lkdGggPSB0aXBJbm5lcldpZHRoICsgY2x1ZXRpcFBhZGRpbmcgKyBvcHRzLmRyb3BTaGFkb3dTdGVwcywKICAgICAgICAgIGxpbmtXaWR0aCA9IHRoaXMub2Zmc2V0V2lkdGgsCiAgICAgICAgICBsaW5rTGVmdCwgcG9zWCwgdGlwWCwgbW91c2VYLCB3aW5XaWR0aDsKCiAgICAgIC8vIHBhcnNlIHRoZSB0aXRsZQogICAgICB2YXIgdGlwUGFydHM7CiAgICAgIHZhciB0aXBUaXRsZSA9IChvcHRzLmF0dHJpYnV0ZSAhPSAndGl0bGUnKSA/ICRsaW5rLmF0dHIob3B0cy50aXRsZUF0dHJpYnV0ZSkgfHwgJycgOiAnJzsKICAgICAgaWYgKG9wdHMuc3BsaXRUaXRsZSkgewogICAgICAgIHRpcFBhcnRzID0gdGlwVGl0bGUuc3BsaXQob3B0cy5zcGxpdFRpdGxlKTsKICAgICAgICB0aXBUaXRsZSA9IG9wdHMuc2hvd1RpdGxlIHx8IHRpcFBhcnRzWzBdID09PSAnJyA/IHRpcFBhcnRzLnNoaWZ0KCkgOiAnJzsKICAgICAgfQogICAgICBpZiAob3B0cy5lc2NhcGVUaXRsZSkgewogICAgICAgIHRpcFRpdGxlID0gdGlwVGl0bGUucmVwbGFjZSgvJi9nLCcmYW1wOycpLnJlcGxhY2UoLz4vZywnJmd0OycpLnJlcGxhY2UoLzwvZywnJmx0OycpOwogICAgICB9CgogICAgICB2YXIgbG9jYWxDb250ZW50OwogICAgICBmdW5jdGlvbiByZXR1cm5GYWxzZSgpIHsgcmV0dXJuIGZhbHNlOyB9CgogICAgICAvLyBLZWVwIHRyYWNrIG9mIG1vdXNlIGVudGVyZWQgc3RhdGUgb24gbGluawogICAgICAkbGluay5iaW5kKCdtb3VzZWVudGVyIG1vdXNlbGVhdmUnLCBmdW5jdGlvbihldmVudCkgewogICAgICAgIHZhciBkYXRhID0gJGxpbmsuZGF0YSgnY2x1ZXRpcCcpOwogICAgICAgIGRhdGEuZW50ZXJlZCA9IGV2ZW50LnR5cGUgPT09ICdlbnRlcmVkJzsKICAgICAgICAkbGluay5kYXRhKCdjbHVldGlwJywgZGF0YSk7CiAgICAgIH0pOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIEFDVElWQVRJT04KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8vYWN0aXZhdGUgY2x1ZVRpcAogICAgdmFyIGFjdGl2YXRlID0gZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgdmFyIHBZLCBhamF4TWVyZ2VkU2V0dGluZ3MsIGNhY2hlS2V5LAogICAgICAgICAgY29udGludWVPbiA9IG9wdHMub25BY3RpdmF0ZS5jYWxsKGxpbmssIGV2ZW50KTsKCiAgICAgIGlmIChjb250aW51ZU9uID09PSBmYWxzZSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQoKICAgICAgaXNBY3RpdmUgPSB0cnVlOwoKICAgICAgLy8gYWN0aXZhdGUgZnVuY3Rpb24gbWF5IGdldCBjYWxsZWQgYWZ0ZXIgYW4gaW5pdGlhbGl6YXRpb24gb2YgYQogICAgICAvLyBkaWZmZXJlbnQgdGFyZ2V0IHNvIG5lZWQgdG8gcmUtZ2V0IHRoZSBDb3JyZWN0IENsdWV0aXAgb2JqZWN0IGhlcmUKICAgICAgJGNsdWV0aXAgPSAkKGNsdWV0aXBTZWxlY3RvcikuY3NzKHtwb3NpdGlvbjogJ2Fic29sdXRlJ30pOwogICAgICAkY2x1ZXRpcE91dGVyID0gJGNsdWV0aXAuZmluZChwcmVmaXggKyAnY2x1ZXRpcC1vdXRlcicpOwogICAgICAkY2x1ZXRpcElubmVyID0gJGNsdWV0aXAuZmluZChwcmVmaXggKyAnY2x1ZXRpcC1pbm5lcicpOwogICAgICAkY2x1ZXRpcFRpdGxlID0gJGNsdWV0aXAuZmluZChwcmVmaXggKyAnY2x1ZXRpcC10aXRsZScpOwogICAgICAkY2x1ZXRpcEFycm93cyA9ICRjbHVldGlwLmZpbmQocHJlZml4ICsgJ2NsdWV0aXAtYXJyb3dzJyk7CiAgICAgICRjbHVldGlwLnJlbW92ZUNsYXNzKCkuY3NzKHt3aWR0aDogdGlwSW5uZXJXaWR0aH0pOwogICAgICBpZiAodGlwQXR0cmlidXRlID09ICRsaW5rLmF0dHIoJ2hyZWYnKSkgewogICAgICAgICRsaW5rLmNzcygnY3Vyc29yJywgb3B0cy5jdXJzb3IpOwogICAgICB9CiAgICAgIGlmIChvcHRzLmhvdmVyQ2xhc3MpIHsKICAgICAgICAkbGluay5hZGRDbGFzcyhvcHRzLmhvdmVyQ2xhc3MpOwogICAgICB9CiAgICAgIGxpbmtUb3AgPSBwb3NZID0gJGxpbmsub2Zmc2V0KCkudG9wOwogICAgICBsaW5rQm90dG9tID0gbGlua1RvcCArICRsaW5rLmlubmVySGVpZ2h0KCk7CiAgICAgIGxpbmtMZWZ0ID0gJGxpbmsub2Zmc2V0KCkubGVmdDsKCiAgICAgIC8vIEZJWDogKGJ1ZyA0NDEyKQogICAgICBsaW5rV2lkdGggPSAkbGluay5pbm5lcldpZHRoKCk7CiAgICAgIGlmICggZXZlbnQudHlwZSA9PSBmb2N1cyApIHsKICAgICAgICAvLyBpbiBmb2N1cyBldmVudCwgbm8gbW91c2UgcG9zaXRpb24gaXMgYXZhaWxhYmxlOyB0aGlzIGlzIG5lZWRlZCB3aXRoIGJvdHRvbVRvcDoKICAgICAgICBtb3VzZVggPSBsaW5rTGVmdCArICAoIGxpbmtXaWR0aCAvIDIgKSArIGxPZmZzZXQ7CiAgICAgICAgJGNsdWV0aXAuY3NzKHtsZWZ0OiBwb3NYfSk7CiAgICAgICAgbW91c2VZID0gcG9zWSArIHRPZmZzZXQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbW91c2VYID0gZXZlbnQucGFnZVg7CiAgICAgICAgbW91c2VZID0gZXZlbnQucGFnZVk7CiAgICAgIH0KICAgICAgLy9FTkQgT0YgRklYCgogICAgICBpZiAobGluay50YWdOYW1lLnRvTG93ZXJDYXNlKCkgIT0gJ2FyZWEnKSB7CiAgICAgICAgc1RvcCA9ICQoZG9jdW1lbnQpLnNjcm9sbFRvcCgpOwogICAgICAgIHdpbldpZHRoID0gJCh3aW5kb3cpLndpZHRoKCk7CiAgICAgIH0KLy8gcG9zaXRpb24gY2x1ZVRpcCBob3Jpem9udGFsbHkKICAgICAgaWYgKG9wdHMucG9zaXRpb25CeSA9PSAnZml4ZWQnKSB7CiAgICAgICAgcG9zWCA9IGxpbmtXaWR0aCArIGxpbmtMZWZ0ICsgbE9mZnNldDsKICAgICAgICAkY2x1ZXRpcC5jc3Moe2xlZnQ6IHBvc1h9KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBwb3NYID0gKGxpbmtXaWR0aCA+IGxpbmtMZWZ0ICYmIGxpbmtMZWZ0ID4gdGlwV2lkdGgpIHx8CiAgICAgICAgICBsaW5rTGVmdCArIGxpbmtXaWR0aCArIHRpcFdpZHRoICsgbE9mZnNldCA+IHdpbldpZHRoID8KICAgICAgICAgIGxpbmtMZWZ0IC0gdGlwV2lkdGggLSBsT2Zmc2V0IDoKICAgICAgICAgIGxpbmtXaWR0aCArIGxpbmtMZWZ0ICsgbE9mZnNldDsKICAgICAgICBpZiAobGluay50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT0gJ2FyZWEnIHx8IG9wdHMucG9zaXRpb25CeSA9PSAnbW91c2UnIHx8IGxpbmtXaWR0aCArIHRpcFdpZHRoID4gd2luV2lkdGgpIHsgLy8gcG9zaXRpb24gYnkgbW91c2UKICAgICAgICAgIGlmIChtb3VzZVggKyAyMCArIHRpcFdpZHRoID4gd2luV2lkdGgpIHsKICAgICAgICAgICAgJGNsdWV0aXAuYWRkQ2xhc3MoJ2NsdWV0aXAtJyArIGN0Q2xhc3MpOwogICAgICAgICAgICBwb3NYID0gKG1vdXNlWCAtIHRpcFdpZHRoIC0gbE9mZnNldCkgPj0gMCA/IG1vdXNlWCAtIHRpcFdpZHRoIC0gbE9mZnNldCAtIHBhcnNlSW50KCRjbHVldGlwLmNzcygnbWFyZ2luTGVmdCcpLDEwKSArIHBhcnNlSW50KCRjbHVldGlwSW5uZXIuY3NzKCdtYXJnaW5SaWdodCcpLDEwKSA6ICBtb3VzZVggLSAodGlwV2lkdGgvMik7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBwb3NYID0gbW91c2VYICsgbE9mZnNldDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcFkgPSBwb3NYIDwgMCA/IGV2ZW50LnBhZ2VZICsgdE9mZnNldCA6IGV2ZW50LnBhZ2VZOwogICAgICAgIGlmIChwb3NYIDwgMCB8fCBvcHRzLnBvc2l0aW9uQnkgPT0gJ2JvdHRvbVRvcCcgIHx8IG9wdHMucG9zaXRpb25CeSA9PSAndG9wQm90dG9tJykgewogICAgICAgICAgcG9zWCA9IChtb3VzZVggKyAodGlwV2lkdGgvMikgPiB3aW5XaWR0aCkgPyB3aW5XaWR0aC8yIC0gdGlwV2lkdGgvMiA6IE1hdGgubWF4KG1vdXNlWCAtICh0aXBXaWR0aC8yKSwwKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgICRjbHVldGlwQXJyb3dzLmNzcyh7ekluZGV4OiAkbGluay5kYXRhKCdjbHVldGlwJykuekluZGV4KzF9KTsKICAgICAgJGNsdWV0aXAuY3NzKHsKICAgICAgICBsZWZ0OiBwb3NYLAogICAgICAgIHpJbmRleDogJGxpbmsuZGF0YSgnY2x1ZXRpcCcpLnpJbmRleAogICAgICB9KTsKICAgICAgd0hlaWdodCA9ICQod2luZG93KS5oZWlnaHQoKTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBsb2FkIGEgc3RyaW5nIGZyb20gY2x1ZXRpcCBtZXRob2QncyBmaXJzdCBhcmd1bWVudAoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgICAgIGlmIChqcykgewogICAgICAgIGlmICh0eXBlb2YganMgPT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAganMgPSBqcy5jYWxsKGxpbmspOwogICAgICAgIH0KICAgICAgICAkY2x1ZXRpcElubmVyLmh0bWwoanMpOwogICAgICAgIGNsdWV0aXBTaG93KHBZKTsKICAgICAgfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogbG9hZCB0aGUgdGl0bGUgYXR0cmlidXRlIG9ubHkgKG9yIHVzZXItc2VsZWN0ZWQgYXR0cmlidXRlKS4KKiBjbHVlVGlwIHRpdGxlIGlzIHRoZSBzdHJpbmcgYmVmb3JlIHRoZSBmaXJzdCBkZWxpbWl0ZXIKKiBzdWJzZXF1ZW50IGRlbGltaXRlcnMgcGxhY2UgY2x1ZVRpcCBib2R5IHRleHQgb24gc2VwYXJhdGUgbGluZXMKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKICAgICAgZWxzZSBpZiAodGlwUGFydHMpIHsKICAgICAgICB2YXIgdHBsID0gdGlwUGFydHMubGVuZ3RoOwogICAgICAgICRjbHVldGlwSW5uZXIuaHRtbCh0cGwgPyB0aXBQYXJ0c1swXSA6ICcnKTsKICAgICAgICBpZiAodHBsID4gMSkgewogICAgICAgICAgZm9yICh2YXIgaT0xOyBpIDwgdHBsOyBpKyspewogICAgICAgICAgICAkY2x1ZXRpcElubmVyLmFwcGVuZCgnPGRpdiBjbGFzcz0ic3BsaXQtYm9keSI+JyArIHRpcFBhcnRzW2ldICsgJzwvZGl2PicpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjbHVldGlwU2hvdyhwWSk7CiAgICAgIH0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGxvYWQgZXh0ZXJuYWwgZmlsZSB2aWEgYWpheAoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgogICAgICBlbHNlIGlmICggIW9wdHMubG9jYWwgJiYgdGlwQXR0cmlidXRlLmluZGV4T2YoJyMnKSAhPT0gMCApIHsKICAgICAgICBpZiAoL1wuKGpwZT9nfHRpZmY/fGdpZnxwbmcpKD86XD8uKik/JC9pLnRlc3QodGlwQXR0cmlidXRlKSkgewogICAgICAgICAgJGNsdWV0aXBJbm5lci5odG1sKCc8aW1nIHNyYz0iJyArIHRpcEF0dHJpYnV0ZSArICciIGFsdD0iJyArIHRpcFRpdGxlICsgJyIgLz4nKTsKICAgICAgICAgIGNsdWV0aXBTaG93KHBZKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdmFyIG9wdGlvbkJlZm9yZVNlbmQgPSBvcHRzLmFqYXhTZXR0aW5ncy5iZWZvcmVTZW5kLAogICAgICAgICAgICAgIG9wdGlvbkVycm9yID0gb3B0cy5hamF4U2V0dGluZ3MuZXJyb3IsCiAgICAgICAgICAgICAgb3B0aW9uU3VjY2VzcyA9IG9wdHMuYWpheFNldHRpbmdzLnN1Y2Nlc3MsCiAgICAgICAgICAgICAgb3B0aW9uQ29tcGxldGUgPSBvcHRzLmFqYXhTZXR0aW5ncy5jb21wbGV0ZTsKCiAgICAgICAgICBjYWNoZUtleSA9IGdldENhY2hlS2V5KHRpcEF0dHJpYnV0ZSwgb3B0cy5hamF4U2V0dGluZ3MuZGF0YSk7CgogICAgICAgICAgdmFyIGFqYXhTZXR0aW5ncyA9IHsKICAgICAgICAgICAgY2FjaGU6IG9wdHMuYWpheENhY2hlLCAvLyBmb3JjZSByZXF1ZXN0ZWQgcGFnZSBub3QgdG8gYmUgY2FjaGVkIGJ5IGJyb3dzZXIKICAgICAgICAgICAgdXJsOiB0aXBBdHRyaWJ1dGUsCiAgICAgICAgICAgIGJlZm9yZVNlbmQ6IGZ1bmN0aW9uKHhociwgc2V0dGluZ3MpIHsKICAgICAgICAgICAgICBpZiAob3B0aW9uQmVmb3JlU2VuZCkge29wdGlvbkJlZm9yZVNlbmQuY2FsbChsaW5rLCB4aHIsICRjbHVldGlwLCAkY2x1ZXRpcElubmVyLCBzZXR0aW5ncyk7fQogICAgICAgICAgICAgICRjbHVldGlwT3V0ZXIuY2hpbGRyZW4oKS5lbXB0eSgpOwogICAgICAgICAgICAgIGlmIChvcHRzLndhaXRJbWFnZSkgewogICAgICAgICAgICAgICAgJGNsdWV0aXBXYWl0CiAgICAgICAgICAgICAgICAuY3NzKHt0b3A6IG1vdXNlWSsyMCwgbGVmdDogbW91c2VYKzIwLCB6SW5kZXg6ICRsaW5rLmRhdGEoJ2NsdWV0aXAnKS56SW5kZXgtMX0pCiAgICAgICAgICAgICAgICAuc2hvdygpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgZXJyb3I6IGZ1bmN0aW9uKHhociwgdGV4dFN0YXR1cykgewogICAgICAgICAgICAgIGlmICggb3B0aW9ucy5hamF4Q2FjaGUgJiYgIWNhY2hlc1tjYWNoZUtleV0gKSB7CiAgICAgICAgICAgICAgICBjYWNoZXNbY2FjaGVLZXldID0ge3N0YXR1czogJ2Vycm9yJywgdGV4dFN0YXR1czogdGV4dFN0YXR1cywgeGhyOiB4aHJ9OwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgaWYgKGlzQWN0aXZlKSB7CiAgICAgICAgICAgICAgICBpZiAob3B0aW9uRXJyb3IpIHsKICAgICAgICAgICAgICAgICAgb3B0aW9uRXJyb3IuY2FsbChsaW5rLCB4aHIsIHRleHRTdGF0dXMsICRjbHVldGlwLCAkY2x1ZXRpcElubmVyKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICRjbHVldGlwSW5uZXIuaHRtbCgnPGk+c29ycnksIHRoZSBjb250ZW50cyBjb3VsZCBub3QgYmUgbG9hZGVkPC9pPicpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24oZGF0YSwgdGV4dFN0YXR1cywgeGhyKSB7CiAgICAgICAgICAgICAgaWYgKCBvcHRpb25zLmFqYXhDYWNoZSAmJiAhY2FjaGVzW2NhY2hlS2V5XSApIHsKICAgICAgICAgICAgICAgIGNhY2hlc1tjYWNoZUtleV0gPSB7c3RhdHVzOiAnc3VjY2VzcycsIGRhdGE6IGRhdGEsIHRleHRTdGF0dXM6IHRleHRTdGF0dXMsIHhocjogeGhyfTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIGNsdWV0aXBDb250ZW50cyA9IG9wdHMuYWpheFByb2Nlc3MuY2FsbChsaW5rLCBkYXRhKTsKCiAgICAgICAgICAgICAgLy8gYWxsb3cgZm9yIGNoYW5naW5nIHRoZSB0aXRsZSBiYXNlZCBvbiBkYXRhIHJldHVybmVkIGJ5IHhocgogICAgICAgICAgICAgIGlmICggdHlwZW9mIGNsdWV0aXBDb250ZW50cyA9PSAnb2JqZWN0JyAmJiBjbHVldGlwQ29udGVudHMgIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICB0aXBUaXRsZSA9IGNsdWV0aXBDb250ZW50cy50aXRsZTsKICAgICAgICAgICAgICAgIGNsdWV0aXBDb250ZW50cyA9IGNsdWV0aXBDb250ZW50cy5jb250ZW50OwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgaWYgKGlzQWN0aXZlKSB7CiAgICAgICAgICAgICAgICBpZiAob3B0aW9uU3VjY2VzcykgewogICAgICAgICAgICAgICAgICBvcHRpb25TdWNjZXNzLmNhbGwobGluaywgZGF0YSwgdGV4dFN0YXR1cywgJGNsdWV0aXAsICRjbHVldGlwSW5uZXIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJGNsdWV0aXBJbm5lci5odG1sKGNsdWV0aXBDb250ZW50cyk7CgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgY29tcGxldGU6IGZ1bmN0aW9uKHhociwgdGV4dFN0YXR1cykgewogICAgICAgICAgICAgIGlmIChvcHRpb25Db21wbGV0ZSkgewogICAgICAgICAgICAgICAgb3B0aW9uQ29tcGxldGUuY2FsbChsaW5rLCB4aHIsIHRleHRTdGF0dXMsICRjbHVldGlwLCAkY2x1ZXRpcElubmVyKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgdmFyIGltZ3MgPSAkY2x1ZXRpcElubmVyWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpbWcnKTsKICAgICAgICAgICAgICBpbWdDb3VudCA9IGltZ3MubGVuZ3RoOwogICAgICAgICAgICAgIGZvciAodmFyIGk9MCwgbCA9IGltZ3MubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgICAgICAgICAgICBpZiAoaW1nc1tpXS5jb21wbGV0ZSkgewogICAgICAgICAgICAgICAgICBpbWdDb3VudC0tOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAoaW1nQ291bnQgJiYgISQuYnJvd3Nlci5vcGVyYSkgewogICAgICAgICAgICAgICAgJChpbWdzKS5iaW5kKCdsb2FkLmN0IGVycm9yLmN0JywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgIGltZ0NvdW50LS07CiAgICAgICAgICAgICAgICAgIGlmIChpbWdDb3VudCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICRjbHVldGlwV2FpdC5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgJChpbWdzKS51bmJpbmQoJy5jdCcpOwogICAgICAgICAgICAgICAgICAgIGlmIChpc0FjdGl2ZSkgeyBjbHVldGlwU2hvdyhwWSk7IH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRjbHVldGlwV2FpdC5oaWRlKCk7CiAgICAgICAgICAgICAgICBpZiAoaXNBY3RpdmUpIHsgY2x1ZXRpcFNob3cocFkpOyB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9OwoKICAgICAgICAgIGFqYXhNZXJnZWRTZXR0aW5ncyA9ICQuZXh0ZW5kKHRydWUsIHt9LCBvcHRzLmFqYXhTZXR0aW5ncywgYWpheFNldHRpbmdzKTsKCiAgICAgICAgICBpZiAoIGNhY2hlc1tjYWNoZUtleV0gKSB7CiAgICAgICAgICAgIGNhY2hlZEFqYXgoIGNhY2hlc1tjYWNoZUtleV0sIGFqYXhNZXJnZWRTZXR0aW5ncyApOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJC5hamF4KGFqYXhNZXJnZWRTZXR0aW5ncyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBsb2FkIGFuIGVsZW1lbnQgZnJvbSB0aGUgc2FtZSBwYWdlCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAgICAgZWxzZSBpZiAob3B0cy5sb2NhbCkgewogICAgICAgIHZhciAkbG9jYWxDb250ZW50ID0gJCh0aXBBdHRyaWJ1dGUgKyAoL14jXFMrJC8udGVzdCh0aXBBdHRyaWJ1dGUpID8gJycgOiAnOmVxKCcgKyBpbmRleCArICcpJykpLmNsb25lKHRydWUpLnNob3coKTsKICAgICAgICBpZiAob3B0cy5sb2NhbElkU3VmZml4KSB7CiAgICAgICAgICAkbG9jYWxDb250ZW50LmF0dHIoJ2lkJywgJGxvY2FsQ29udGVudFswXS5pZCArIG9wdHMubG9jYWxJZFN1ZmZpeCk7CiAgICAgICAgfQogICAgICAgICRjbHVldGlwSW5uZXIuaHRtbCgkbG9jYWxDb250ZW50KTsKICAgICAgICBjbHVldGlwU2hvdyhwWSk7CiAgICAgIH0KICAgIH07CgovLyBnZXQgZGltZW5zaW9ucyBhbmQgb3B0aW9ucyBmb3IgY2x1ZXRpcCBhbmQgcHJlcGFyZSBpdCB0byBiZSBzaG93bgogICAgdmFyIGNsdWV0aXBTaG93ID0gZnVuY3Rpb24oYnBZKSB7CiAgICAgIHZhciAkY2xvc2VMaW5rLCBkeW5hbWljQ2xhc3NlcywgaGVpZ2h0RGlmZiwKICAgICAgICAgIHRpdGxlSFRNTCA9IHRpcFRpdGxlIHx8IG9wdHMuc2hvd1RpdGxlICYmICcmbmJzcDsnLAogICAgICAgICAgYmdZID0gJycsIGRpcmVjdGlvbiA9ICcnLCBpbnN1ZmZpY2llbnRYID0gZmFsc2U7CiAgICAgIHZhciBzdGlja3lDbG9zZSA9IHsKICAgICAgICBib3R0b206IGZ1bmN0aW9uKCRjTGluaykgewogICAgICAgICAgJGNMaW5rLmFwcGVuZFRvKCRjbHVldGlwSW5uZXIpOwogICAgICAgIH0sCiAgICAgICAgdG9wOiBmdW5jdGlvbigkY0xpbmspIHsKICAgICAgICAgICRjTGluay5wcmVwZW5kVG8oJGNsdWV0aXBJbm5lcik7CiAgICAgICAgfSwKICAgICAgICB0aXRsZTogZnVuY3Rpb24oJGNMaW5rKSB7CiAgICAgICAgICAkY0xpbmsucHJlcGVuZFRvKCRjbHVldGlwVGl0bGUpOwogICAgICAgIH0KICAgICAgfTsKCiAgICAgICRjbHVldGlwLmFkZENsYXNzKCdjbHVldGlwLScgKyBjdENsYXNzKTsKICAgICAgaWYgKG9wdHMudHJ1bmNhdGUpIHsKICAgICAgICB2YXIgJHRydW5jbG9hZGVkID0gJGNsdWV0aXBJbm5lci50ZXh0KCkuc2xpY2UoMCxvcHRzLnRydW5jYXRlKSArICcuLi4nOwogICAgICAgICRjbHVldGlwSW5uZXIuaHRtbCgkdHJ1bmNsb2FkZWQpOwogICAgICB9CgogICAgICBpZiAodGl0bGVIVE1MKSB7CiAgICAgICAgJGNsdWV0aXBUaXRsZS5zaG93KCkuaHRtbCh0aXRsZUhUTUwpOwogICAgICB9IGVsc2UgewogICAgICAgICRjbHVldGlwVGl0bGUuaGlkZSgpOwogICAgICB9CgogICAgICBpZiAob3B0cy5zdGlja3kpIHsKICAgICAgICBpZiAoc3RpY2t5Q2xvc2Vbb3B0cy5jbG9zZVBvc2l0aW9uXSkgewogICAgICAgICAgJGNsb3NlTGluayA9ICQoJzxkaXYgY2xhc3M9ImNsdWV0aXAtY2xvc2UiPjxhIGhyZWY9IiMiPicgKyBvcHRzLmNsb3NlVGV4dCArICc8L2E+PC9kaXY+Jyk7CiAgICAgICAgICBzdGlja3lDbG9zZVtvcHRzLmNsb3NlUG9zaXRpb25dKCAkY2xvc2VMaW5rICk7CiAgICAgICAgICAkY2xvc2VMaW5rLmJpbmQoJ2NsaWNrLmNsdWV0aXAnLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgY2x1ZXRpcENsb3NlKCk7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBpZiAob3B0cy5tb3VzZU91dENsb3NlKSB7CiAgICAgICAgICAkbGluay51bmJpbmQoJ21vdXNlbGVhdmUuY2x1ZXRpcE1vYycpOwogICAgICAgICAgJGNsdWV0aXAudW5iaW5kKCdtb3VzZWxlYXZlLmNsdWV0aXBNb2MnKTsKICAgICAgICAgIGlmIChvcHRzLm1vdXNlT3V0Q2xvc2UgPT0gJ2JvdGgnIHx8IG9wdHMubW91c2VPdXRDbG9zZSA9PSAnY2x1ZXRpcCcgfHwgb3B0cy5tb3VzZU91dENsb3NlID09PSB0cnVlKSB7IC8vIHRydWUgaW1wbGllcyAnY2x1ZXRpcCcgZm9yIGJhY2t3YXJkcyBjb21wYXRhYmlsaXR5CiAgICAgICAgICAgICRjbHVldGlwLmJpbmQoJ21vdXNlbGVhdmUuY2x1ZXRpcE1vYycsIG1vdXNlT3V0Q2xvc2UpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKG9wdHMubW91c2VPdXRDbG9zZSA9PSAnYm90aCcgfHwgb3B0cy5tb3VzZU91dENsb3NlID09ICdsaW5rJykgewogICAgICAgICAgICAkbGluay5iaW5kKCdtb3VzZWxlYXZlLmNsdWV0aXBNb2MnLCBtb3VzZU91dENsb3NlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCi8vIG5vdyB0aGF0IGNvbnRlbnQgaXMgbG9hZGVkLCBmaW5pc2ggdGhlIHBvc2l0aW9uaW5nCiAgICAgICRjbHVldGlwT3V0ZXIuY3NzKHt6SW5kZXg6ICRsaW5rLmRhdGEoJ2NsdWV0aXAnKS56SW5kZXgsIG92ZXJmbG93OiBkZWZIZWlnaHQgPT0gJ2F1dG8nID8gJ3Zpc2libGUnIDogJ2F1dG8nLCBoZWlnaHQ6IGRlZkhlaWdodH0pOwogICAgICB0aXBIZWlnaHQgPSBkZWZIZWlnaHQgPT0gJ2F1dG8nID8gTWF0aC5tYXgoJGNsdWV0aXAub3V0ZXJIZWlnaHQoKSwkY2x1ZXRpcC5oZWlnaHQoKSkgOiBwYXJzZUludChkZWZIZWlnaHQsMTApOwogICAgICB0aXBZID0gcG9zWTsKICAgICAgYmFzZWxpbmUgPSBzVG9wICsgd0hlaWdodDsKICAgICAgaW5zdWZmaWNpZW50WCA9IChwb3NYIDwgbW91c2VYICYmIChNYXRoLm1heChwb3NYLCAwKSArIHRpcFdpZHRoID4gbW91c2VYKSk7CiAgICAgIGlmIChvcHRzLnBvc2l0aW9uQnkgPT0gJ2ZpeGVkJykgewogICAgICAgIHRpcFkgPSBwb3NZIC0gb3B0cy5kcm9wU2hhZG93U3RlcHMgKyB0T2Zmc2V0OwogICAgICB9IGVsc2UgaWYgKG9wdHMucG9zaXRpb25CeSA9PSAndG9wQm90dG9tJyB8fCBvcHRzLnBvc2l0aW9uQnkgPT0gJ2JvdHRvbVRvcCcgfHwgaW5zdWZmaWNpZW50WCkgewogICAgICAgIGlmIChvcHRzLnBvc2l0aW9uQnkgPT0gJ3RvcEJvdHRvbScpIHsKICAgICAgICAgIGlmIChwb3NZICsgdGlwSGVpZ2h0ICsgdE9mZnNldCA8IGJhc2VsaW5lICYmIG1vdXNlWSAtIHNUb3AgPCB0aXBIZWlnaHQgKyB0T2Zmc2V0KSB7CiAgICAgICAgICAgIGRpcmVjdGlvbiA9ICdib3R0b20nOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZGlyZWN0aW9uID0gJ3RvcCc7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChvcHRzLnBvc2l0aW9uQnkgPT0gJ2JvdHRvbVRvcCcgfHwgaW5zdWZmaWNpZW50WCkgewogICAgICAgICAgaWYgKHBvc1kgKyB0aXBIZWlnaHQgKyB0T2Zmc2V0ID4gYmFzZWxpbmUgJiYgbW91c2VZIC0gc1RvcCA+IHRpcEhlaWdodCArIHRPZmZzZXQpIHsKICAgICAgICAgICAgZGlyZWN0aW9uID0gJ3RvcCc7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBkaXJlY3Rpb24gPSAnYm90dG9tJzsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gV2Ugc2hvdWxkIG5vdyBoYXZlIGEgZGlyZWN0aW9uLiBDb21wdXRlIHRpcFkKICAgICAgICBpZiAob3B0cy5zbmFwVG9FZGdlKSB7CiAgICAgICAgICBpZiAoZGlyZWN0aW9uID09ICd0b3AnKSB7CiAgICAgICAgICAgIHRpcFkgPSBsaW5rVG9wIC0gdGlwSGVpZ2h0IC0gdE9mZnNldDsKICAgICAgICAgIH0gZWxzZSBpZiAoZGlyZWN0aW9uID09ICdib3R0b20nKSB7CiAgICAgICAgICAgIHRpcFkgPSBsaW5rQm90dG9tICsgdE9mZnNldDsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSAndG9wJykgewogICAgICAgICAgICB0aXBZID0gbW91c2VZIC0gdGlwSGVpZ2h0IC0gdE9mZnNldDsKICAgICAgICAgIH0gZWxzZSBpZiAoZGlyZWN0aW9uID09ICdib3R0b20nKSB7CiAgICAgICAgICAgIHRpcFkgPSBtb3VzZVkgKyB0T2Zmc2V0OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIGlmICggcG9zWSArIHRpcEhlaWdodCArIHRPZmZzZXQgPiBiYXNlbGluZSApIHsKICAgICAgICB0aXBZID0gKHRpcEhlaWdodCA+PSB3SGVpZ2h0KSA/IHNUb3AgOiBiYXNlbGluZSAtIHRpcEhlaWdodCAtIHRPZmZzZXQ7CiAgICAgIH0gZWxzZSBpZiAoJGxpbmsuY3NzKCdkaXNwbGF5JykgPT0gJ2Jsb2NrJyB8fCBsaW5rLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PSAnYXJlYScgfHwgb3B0cy5wb3NpdGlvbkJ5ID09ICJtb3VzZSIpIHsKICAgICAgICB0aXBZID0gYnBZIC0gdE9mZnNldDsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aXBZID0gcG9zWSAtIG9wdHMuZHJvcFNoYWRvd1N0ZXBzOwogICAgICB9CiAgICAgIGlmIChkaXJlY3Rpb24gPT09ICcnKSB7CiAgICAgICAgZGlyZWN0aW9uID0gcG9zWCA8IGxpbmtMZWZ0ID8gJ2xlZnQnIDogICdyaWdodCc7CiAgICAgIH0KICAgICAgLy8gYWRkIGNsYXNzZXMKICAgICAgZHluYW1pY0NsYXNzZXMgPSAnIGNsdWUtJyArIGRpcmVjdGlvbiArICctJyArIGN0Q2xhc3MgKyAnIGNsdWV0aXAtJyArIGN0Q2xhc3M7CiAgICAgIGlmIChjdENsYXNzID09ICdyb3VuZGVkJykgewogICAgICAgIGR5bmFtaWNDbGFzc2VzICs9ICcgdWktY29ybmVyLWFsbCc7CiAgICAgIH0KICAgICAgJGNsdWV0aXAuY3NzKHt0b3A6IHRpcFkgKyAncHgnfSkuYXR0clByb3AoeydjbGFzc05hbWUnOiBzdGFuZGFyZENsYXNzZXMgKyBkeW5hbWljQ2xhc3Nlc30pOwogICAgICAvLyBzZXQgdXAgYXJyb3cgcG9zaXRpb25pbmcgdG8gYWxpZ24gd2l0aCBlbGVtZW50CiAgICAgIGlmIChvcHRzLmFycm93cykgewogICAgICAgIGlmICggLyhsZWZ0fHJpZ2h0KS8udGVzdChkaXJlY3Rpb24pICkgewogICAgICAgICAgaGVpZ2h0RGlmZiA9ICRjbHVldGlwLmhlaWdodCgpIC0gJGNsdWV0aXBBcnJvd3MuaGVpZ2h0KCk7CiAgICAgICAgICBiZ1kgPSBwb3NYID49IDAgJiYgYnBZID4gMCA/IChwb3NZIC0gdGlwWSAtIG9wdHMuZHJvcFNoYWRvd1N0ZXBzKSA6IDA7CiAgICAgICAgICBiZ1kgPSBoZWlnaHREaWZmID4gYmdZID8gYmdZIDogaGVpZ2h0RGlmZjsKICAgICAgICAgIGJnWSArPSAncHgnOwogICAgICAgIH0KICAgICAgICAkY2x1ZXRpcEFycm93cy5jc3Moe3RvcDogYmdZfSkuc2hvdygpOwogICAgICB9IGVsc2UgewogICAgICAgICRjbHVldGlwQXJyb3dzLmhpZGUoKTsKICAgICAgfQoKLy8gKGZpcnN0IGhpZGUsIHRoZW4pICoqKlNIT1cgVEhFIENMVUVUSVAqKioKICAgICAgLy8gaGFuZGxlIGRyb3BzaGFkb3cgZGl2cyBmaXJzdAogICAgICAkZHJvcFNoYWRvdyA9IGNyZWF0ZURyb3BTaGFkb3dzKCRjbHVldGlwLCBvcHRzKTsKICAgICAgaWYgKCRkcm9wU2hhZG93ICYmICRkcm9wU2hhZG93Lmxlbmd0aCkgewogICAgICAgICRkcm9wU2hhZG93LmhpZGUoKS5jc3Moe2hlaWdodDogdGlwSGVpZ2h0LCB3aWR0aDogdGlwSW5uZXJXaWR0aCwgekluZGV4OiAkbGluay5kYXRhKCdjbHVldGlwJykuekluZGV4LTF9KS5zaG93KCk7CiAgICAgIH0KCiAgICAgIGlmICghY2xvc2VPbkRlbGF5KSB7CiAgICAgICAgJGNsdWV0aXAuaGlkZSgpOwogICAgICB9CiAgICAgIGNsZWFyVGltZW91dChjbG9zZU9uRGVsYXkpOwogICAgICBjbG9zZU9uRGVsYXkgPSBudWxsOwoKICAgICAgLy8gc2hvdyB0aGUgY2x1ZXRpcAogICAgICAkY2x1ZXRpcFtvcHRzLmZ4Lm9wZW5dKG9wdHMuZngub3BlblNwZWVkIHx8IDApOwoKICAgICAgaWYgKCQuZm4uYmdpZnJhbWUpIHsgJGNsdWV0aXAuYmdpZnJhbWUoKTsgfQoKICAgICAgLy8gdHJpZ2dlciB0aGUgb3B0aW9uYWwgb25TaG93IGZ1bmN0aW9uCiAgICAgIG9wdHMub25TaG93LmNhbGwobGluaywgJGNsdWV0aXAsICRjbHVldGlwSW5uZXIpOwogICAgfTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgPUlOQUNUSVZBVElPTgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogICAgdmFyIGluYWN0aXZhdGUgPSBmdW5jdGlvbihldmVudCkgewogICAgICBpc0FjdGl2ZSA9IGZhbHNlOwogICAgICAkY2x1ZXRpcFdhaXQuaGlkZSgpOwogICAgICBpZiAoIW9wdHMuc3RpY2t5IHx8ICgvY2xpY2t8dG9nZ2xlLykudGVzdChvcHRzLmFjdGl2YXRpb24pICkgewogICAgICAgIC8vIGRlbGF5ZWQgY2xvc2UgKG5vdCBmdWxseSB0ZXN0ZWQpCiAgICAgICAgaWYgKG9wdHMuZGVsYXllZENsb3NlID4gMCkgewogICAgICAgICAgY2xlYXJUaW1lb3V0KGNsb3NlT25EZWxheSk7CiAgICAgICAgICBjbG9zZU9uRGVsYXkgPSBudWxsOwogICAgICAgICAgY2xvc2VPbkRlbGF5ID0gc2V0VGltZW91dChjbHVldGlwQ2xvc2UsIG9wdHMuZGVsYXllZENsb3NlKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGlmIChvcHRzLmhvdmVyQ2xhc3MpIHsKICAgICAgICAkbGluay5yZW1vdmVDbGFzcyhvcHRzLmhvdmVyQ2xhc3MpOwogICAgICB9CiAgICB9OwoKICAgIC8vIGNsb3NlIGNsdWV0aXAgYW5kIHJlc2V0IHNvbWUgdGhpbmdzCiAgICB2YXIgY2x1ZXRpcENsb3NlID0gZnVuY3Rpb24oZWwpIHsKICAgICAgdmFyICRjbG9zZXIgPSBlbCAmJiBlbC5kYXRhKCdjbHVldGlwJykgPyBlbCA6ICRsaW5rLAogICAgICAgICAgY3QgPSAkY2xvc2VyLmRhdGEoJ2NsdWV0aXAnKSAmJiAkY2xvc2VyLmRhdGEoJ2NsdWV0aXAnKS5zZWxlY3RvciwKICAgICAgICAgIGN0U2VsZWN0b3IgPSBjdCB8fCAnZGl2LmNsdWV0aXAnLAogICAgICAgICAgJGNsdWV0aXAgPSAkKGN0U2VsZWN0b3IpLAogICAgICAgICAgJGNsdWV0aXBJbm5lciA9ICRjbHVldGlwLmZpbmQocHJlZml4ICsgJ2NsdWV0aXAtaW5uZXInKSwKICAgICAgICAgICRjbHVldGlwQXJyb3dzID0gJGNsdWV0aXAuZmluZChwcmVmaXggKyAnY2x1ZXRpcC1hcnJvd3MnKTsKCiAgICAgICRjbHVldGlwLmhpZGUoKS5yZW1vdmVDbGFzcygpOwogICAgICBvcHRzLm9uSGlkZS5jYWxsKCRjbG9zZXJbMF0sICRjbHVldGlwLCAkY2x1ZXRpcElubmVyKTsKCiAgICAgIGlmIChjdCkgewogICAgICAgICRjbG9zZXIucmVtb3ZlQ2xhc3MoJ2NsdWV0aXAtY2xpY2tlZCcpOwogICAgICAgICRjbG9zZXIuY3NzKCdjdXJzb3InLCcnKTsKICAgICAgfQogICAgICBpZiAoY3QgJiYgdGlwVGl0bGUpIHsKICAgICAgICAkY2xvc2VyLmF0dHJQcm9wKG9wdHMudGl0bGVBdHRyaWJ1dGUsIHRpcFRpdGxlKTsKICAgICAgfQoKICAgICAgaWYgKG9wdHMuYXJyb3dzKSB7CiAgICAgICAgJGNsdWV0aXBBcnJvd3MuY3NzKHt0b3A6ICcnfSk7CiAgICAgIH0KICAgIH07CgogICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHdlIHNob3VsZCBiZSBjbG9zaW5nIGJ5IGNoZWNraW5nIHdoZXJlIHRoZSB1c2VyIGlzIGhvdmVyaW5nLgogICAgLy8gV2UgZG8gYSBzaG9ydCA1MG1zIGRlbGF5IGZvciB0d28gcmVhc29uczogdG8gcHJldmVudCBmbGlja2VyLCBhbmQgdG8gYWxsb3cgdGhlIHVzZXIgdGltZSB0byBob3ZlciBvbiBvdGhlciBlbGVtZW50CiAgICB2YXIgbW91c2VPdXRDbG9zZSA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgZWwgPSB0aGlzOwogICAgICBjbGVhclRpbWVvdXQoY2xvc2VPbkRlbGF5KTsKICAgICAgY2xvc2VPbkRlbGF5ID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICB2YXIgbGlua092ZXIgPSAkbGluay5kYXRhKCdjbHVldGlwJykuZW50ZXJlZCwKICAgICAgICAgICAgY2x1ZXRpcE92ZXIgPSAkY2x1ZXRpcC5kYXRhKCdlbnRlcmVkJyksCiAgICAgICAgICAgIGVudGVyZWQgPSBmYWxzZTsKCiAgICAgICAgaWYgKCBvcHRzLm1vdXNlT3V0Q2xvc2UgPT0gJ2JvdGgnICYmIChsaW5rT3ZlciB8fCBjbHVldGlwT3ZlcikgKSB7CiAgICAgICAgICBlbnRlcmVkID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgLy8gdHJ1ZSBpbXBsaWVzICdjbHVldGlwJyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKICAgICAgICBlbHNlIGlmICggKG9wdHMubW91c2VPdXRDbG9zZSA9PT0gdHJ1ZSB8fCBvcHRzLm1vdXNlT3V0Q2xvc2UgPT0gJ2NsdWV0aXAnKSAmJiBjbHVldGlwT3ZlcikgewogICAgICAgICAgZW50ZXJlZCA9IHRydWU7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKG9wdHMubW91c2VPdXRDbG9zZSA9PSAnbGluaycgJiYgbGlua092ZXIpIHsKICAgICAgICAgIGVudGVyZWQgPSB0cnVlOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAhZW50ZXJlZCApIHsKICAgICAgICAgIC8vIEFsbCBjaGVja3MgcGFzcywgY2xvc2UgdGhlIGNsdWV0aXAKICAgICAgICAgIGNsdWV0aXBDbG9zZS5jYWxsKGVsKTsKICAgICAgICB9CgogICAgICB9LCBvcHRzLmRlbGF5ZWRDbG9zZSk7CiAgICB9OwoKICAgICQoZG9jdW1lbnQpLnVuYmluZCgnaGlkZUNsdWV0aXAuY2x1ZXRpcCcpLmJpbmQoJ2hpZGVDbHVldGlwLmNsdWV0aXAnLCBmdW5jdGlvbihlKSB7CiAgICAgIGNsdWV0aXBDbG9zZSggJChlLnRhcmdldCkgKTsKICAgIH0pOwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgID1CSU5EIEVWRU5UUwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogIC8vIGFjdGl2YXRlIGJ5IGNsaWNrCiAgICAgIGlmICggKC9jbGlja3x0b2dnbGUvKS50ZXN0KG9wdHMuYWN0aXZhdGlvbikgKSB7CiAgICAgICAgJGxpbmsuYmluZCgnY2xpY2suY2x1ZXRpcCcsIGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgICAgICBpZiAoJGNsdWV0aXAuaXMoJzpoaWRkZW4nKSB8fCAhJGxpbmsuaXMoJy5jbHVldGlwLWNsaWNrZWQnKSkgewogICAgICAgICAgICBhY3RpdmF0ZShldmVudCk7CiAgICAgICAgICAgICQoJy5jbHVldGlwLWNsaWNrZWQnKS5yZW1vdmVDbGFzcygnY2x1ZXRpcC1jbGlja2VkJyk7CiAgICAgICAgICAgICRsaW5rLmFkZENsYXNzKCdjbHVldGlwLWNsaWNrZWQnKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGluYWN0aXZhdGUoZXZlbnQpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0pOwogIC8vIGFjdGl2YXRlIGJ5IGZvY3VzOyBpbmFjdGl2YXRlIGJ5IGJsdXIKICAgICAgfSBlbHNlIGlmIChvcHRzLmFjdGl2YXRpb24gPT0gJ2ZvY3VzJykgewogICAgICAgICRsaW5rLmJpbmQoJ2ZvY3VzLmNsdWV0aXAnLCBmdW5jdGlvbihldmVudCkgewogICAgICAgICAgJGxpbmsuYXR0clByb3AoJ3RpdGxlJywnJyk7CiAgICAgICAgICBhY3RpdmF0ZShldmVudCk7CiAgICAgICAgfSk7CiAgICAgICAgJGxpbmsuYmluZCgnYmx1ci5jbHVldGlwJywgZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICAgICRsaW5rLmF0dHJQcm9wKCd0aXRsZScsICRsaW5rLmRhdGEoJ2NsdWV0aXAnKS50aXRsZSk7CiAgICAgICAgICBpbmFjdGl2YXRlKGV2ZW50KTsKICAgICAgICB9KTsKICAvLyBhY3RpdmF0ZSBieSBob3ZlcgogICAgICB9IGVsc2UgewoKICAgICAgICAvLyBjbGlja2luZyBpcyByZXR1cm5lZCBmYWxzZSBpZiBjbGlja1Rocm91Z2ggb3B0aW9uIGlzIHNldCB0byBmYWxzZQogICAgICAgICRsaW5rW29wdHMuY2xpY2tUaHJvdWdoID8gJ3VuYmluZCcgOiAnYmluZCddKCdjbGljay5jbHVldGlwJywgcmV0dXJuRmFsc2UpOwoKICAgICAgICAvL3NldCB1cCBtb3VzZSB0cmFja2luZwogICAgICAgIHZhciBtb3VzZVRyYWNrcyA9IGZ1bmN0aW9uKGV2dCkgewogICAgICAgICAgaWYgKG9wdHMudHJhY2tpbmcpIHsKICAgICAgICAgICAgdmFyIHRyYWNrWCA9IHBvc1ggLSBldnQucGFnZVg7CiAgICAgICAgICAgIHZhciB0cmFja1kgPSB0aXBZID8gdGlwWSAtIGV2dC5wYWdlWSA6IHBvc1kgLSBldnQucGFnZVk7CiAgICAgICAgICAgICRsaW5rLmJpbmQoJ21vdXNlbW92ZS5jbHVldGlwJywgZnVuY3Rpb24oZXZ0KSB7CiAgICAgICAgICAgICAgJGNsdWV0aXAuY3NzKHtsZWZ0OiBldnQucGFnZVggKyB0cmFja1gsIHRvcDogZXZ0LnBhZ2VZICsgdHJhY2tZIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBpZiAoJC5mbi5ob3ZlckludGVudCAmJiBvcHRzLmhvdmVySW50ZW50KSB7CiAgICAgICAgICAkbGluay5ob3ZlckludGVudCh7CiAgICAgICAgICAgIHNlbnNpdGl2aXR5OiBvcHRzLmhvdmVySW50ZW50LnNlbnNpdGl2aXR5LAogICAgICAgICAgICBpbnRlcnZhbDogb3B0cy5ob3ZlckludGVudC5pbnRlcnZhbCwKICAgICAgICAgICAgb3ZlcjogZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICAgICAgICBhY3RpdmF0ZShldmVudCk7CiAgICAgICAgICAgICAgbW91c2VUcmFja3MoZXZlbnQpOwogICAgICAgICAgICB9LAogICAgICAgICAgICB0aW1lb3V0OiBvcHRzLmhvdmVySW50ZW50LnRpbWVvdXQsCiAgICAgICAgICAgIG91dDogZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICAgICAgICBpbmFjdGl2YXRlKGV2ZW50KTsKICAgICAgICAgICAgICAkbGluay51bmJpbmQoJ21vdXNlbW92ZS5jbHVldGlwJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAkbGluay5iaW5kKCdtb3VzZWVudGVyLmNsdWV0aXAnLCBmdW5jdGlvbihldmVudCkgewogICAgICAgICAgICBhY3RpdmF0ZShldmVudCk7CiAgICAgICAgICAgIG1vdXNlVHJhY2tzKGV2ZW50KTsKICAgICAgICAgIH0pCiAgICAgICAgICAuYmluZCgnbW91c2VsZWF2ZS5jbHVldGlwJywgZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICAgICAgaW5hY3RpdmF0ZShldmVudCk7CiAgICAgICAgICAgICRsaW5rLnVuYmluZCgnbW91c2Vtb3ZlLmNsdWV0aXAnKTsKICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgJGxpbmsuYmluZCgnbW91c2VvdmVyLmNsdWV0aXAnLCBmdW5jdGlvbihldmVudCkgewogICAgICAgICAgJGxpbmsuYXR0clByb3AoJ3RpdGxlJywnJyk7CiAgICAgICAgfSkuYmluZCgnbW91c2VsZWF2ZS5jbHVldGlwJywgZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICAgICRsaW5rLmF0dHJQcm9wKCd0aXRsZScsICRsaW5rLmRhdGEoJ2NsdWV0aXAnKS50aXRsZSk7CiAgICAgICAgfSk7CiAgICAgIH0KCiAgICAgIC8vIHRyaWdnZXIgYSBjYWNoZWQgQWpheCByZXNwb25zZQogICAgICBmdW5jdGlvbiBjYWNoZWRBamF4KGluZm8sIHNldHRpbmdzKSB7CiAgICAgICAgdmFyIHN0YXR1cyA9IGluZm8uc3RhdHVzOwogICAgICAgIHNldHRpbmdzLmJlZm9yZVNlbmQoaW5mby54aHIsIHNldHRpbmdzKTsKICAgICAgICBpZiAoIHN0YXR1cyA9PSAnZXJyb3InICkgewogICAgICAgICAgc2V0dGluZ3Nbc3RhdHVzXShpbmZvLnhociwgaW5mby50ZXh0U3RhdHVzKTsKICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PSAnc3VjY2VzcycpIHsKICAgICAgICAgIHNldHRpbmdzW3N0YXR1c10oaW5mby5kYXRhLCBpbmZvLnRleHRTdGF0dXMsIGluZm8ueGhyKTsKICAgICAgICB9CiAgICAgICAgc2V0dGluZ3MuY29tcGxldGUoaW5mby54aHIsIHNldHRpbmdzLnRleHRTdGF0dXMpOwogICAgICB9CgogICAgfSk7IC8vIGVuZCB0aGlzLmVhY2gKCiAgICAvKiogPXByaXZhdGUgZnVuY3Rpb25zCiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgICAvL2VtcHR5IGZ1bmN0aW9uCiAgICBmdW5jdGlvbiBkb05vdGhpbmcoKSB7fQoKICAgIC8vIGNyZWF0ZSBhIHN0cmluZyB0byBiZSB1c2VkIGFzIGFuIGlkZW50aWZpZXIgZm9yIGFqYXggY2FjaGVzCiAgICBmdW5jdGlvbiBnZXRDYWNoZUtleSh1cmwsIGRhdGEpIHsKICAgICAgdmFyIGNhY2hlS2V5ID0gdXJsIHx8ICcnOwogICAgICBkYXRhID0gZGF0YSB8fCAnJzsKCiAgICAgIGlmICh0eXBlb2YgZGF0YSA9PSAnb2JqZWN0JykgewogICAgICAgICQuZWFjaChkYXRhLCBmdW5jdGlvbihrZXksIHZhbCkgewogICAgICAgICAgY2FjaGVLZXkgKz0gJy0nICsga2V5ICsgJy0nICsgdmFsOwogICAgICAgIH0pOwogICAgICB9IGVsc2UgaWYgKHR5cGVvZiBkYXRhID09ICdzdHJpbmcnKSB7CiAgICAgICAgY2FjaGVLZXkgKz0gZGF0YTsKICAgICAgfQoKICAgICAgcmV0dXJuIGNhY2hlS2V5OwogICAgfQoKICAgIC8qKiA9Y3JlYXRlIGRyb3BzaGFkb3cgZGl2cyAqKi8KCiAgICBmdW5jdGlvbiBjcmVhdGVEcm9wU2hhZG93cygkY2x1ZXRpcCwgb3B0aW9ucywgbmV3RHJvcFNoYWRvdykgewogICAgICB2YXIgZHNTdHlsZSA9ICcnLAogICAgICAgICAgZHJvcFNoYWRvd1N0ZXBzID0gKG9wdGlvbnMuZHJvcFNoYWRvdyAmJiBvcHRpb25zLmRyb3BTaGFkb3dTdGVwcykgPyArb3B0aW9ucy5kcm9wU2hhZG93U3RlcHMgOiAwOwoKICAgICAgaWYgKCQuc3VwcG9ydC5ib3hTaGFkb3cpIHsKICAgICAgICBpZiAoIGRyb3BTaGFkb3dTdGVwcyApIHsKICAgICAgICAgIGRzU3R5bGUgPSAnMXB4IDFweCAnICsgZHJvcFNoYWRvd1N0ZXBzICsgJ3B4IHJnYmEoMCwwLDAsMC41KSc7CiAgICAgICAgfQogICAgICAgIHZhciBkc09mZnNldHMgPSBkcm9wU2hhZG93U3RlcHMgPT09IDAgPyAnMCAwICcgOiAnMXB4IDFweCAnOwogICAgICAgICRjbHVldGlwLmNzcygkLnN1cHBvcnQuYm94U2hhZG93LCBkc1N0eWxlKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgdmFyIG9sZERyb3BTaGFkb3cgPSAkY2x1ZXRpcC5maW5kKCcuY2x1ZXRpcC1kcm9wLXNoYWRvdycpOwogICAgICBpZiAoZHJvcFNoYWRvd1N0ZXBzID09IG9sZERyb3BTaGFkb3cubGVuZ3RoKSB7CiAgICAgICAgcmV0dXJuIG9sZERyb3BTaGFkb3c7CiAgICAgIH0KICAgICAgb2xkRHJvcFNoYWRvdy5yZW1vdmUoKTsKICAgICAgdmFyIGRyb3BTaGFkb3dzID0gW107CiAgICAgIGZvciAodmFyIGk9MDsgaSA8IGRyb3BTaGFkb3dTdGVwczspIHsKICAgICAgICBkcm9wU2hhZG93c1tpKytdID0gJzxkaXYgc3R5bGU9InRvcDonICsgaSArICdweDtsZWZ0OicgKyBpICsgJ3B4OyI+PC9kaXY+JzsKICAgICAgfQoKICAgICAgbmV3RHJvcFNoYWRvdyA9ICQoZHJvcFNoYWRvd3Muam9pbignJykpCiAgICAgIC5jc3MoewogICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLAogICAgICAgIGJhY2tncm91bmRDb2xvcjogJyMwMDAnLAogICAgICAgIHpJbmRleDogY2x1ZXpJbmRleCAtMSwKICAgICAgICBvcGFjaXR5OiAwLjEKICAgICAgfSkKICAgICAgLmFkZENsYXNzKCdjbHVldGlwLWRyb3Atc2hhZG93JykKICAgICAgLnByZXBlbmRUbygkY2x1ZXRpcCk7CiAgICAgIHJldHVybiBuZXdEcm9wU2hhZG93OwoKICAgIH0KCiAgICByZXR1cm4gdGhpczsKICB9OwoKICAoZnVuY3Rpb24oKSB7CiAgICAkLnN1cHBvcnQgPSAkLnN1cHBvcnQgfHwge307CiAgICAvLyBjaGVjayBzdXBwb3J0IGZvciBDU1MzIHByb3BlcnRpZXMgKGN1cnJlbnRseSBvbmx5IGJveFNoYWRvdykKICAgIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSwKICAgICAgICBkaXZTdHlsZSA9IGRpdi5zdHlsZSwKICAgICAgICBzdHlsZVByb3BzID0gWydib3hTaGFkb3cnXSwKICAgICAgICBwcmVmaXhlcyA9IFsnbW96JywgJ01veicsICd3ZWJraXQnLCAnbyddOwoKICAgIGZvciAodmFyIGk9MCwgc2wgPSBzdHlsZVByb3BzLmxlbmd0aDsgaSA8IHNsOyBpKyspIHsKICAgICAgdmFyIHByb3AgPSBzdHlsZVByb3BzW2ldLAogICAgICAgICAgdVByb3AgPSBwcm9wLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgcHJvcC5zbGljZSgxKTsKCiAgICAgIGlmICggdHlwZW9mIGRpdlN0eWxlWyBwcm9wIF0gIT09ICd1bmRlZmluZWQnICkgewogICAgICAgICQuc3VwcG9ydFsgcHJvcCBdID0gcHJvcDsKICAgICAgfSBlbHNlIHsKICAgICAgICBmb3IgKHZhciBqPTAsIHBsID0gcHJlZml4ZXMubGVuZ3RoOyBqIDwgcGw7IGorKykgewoKICAgICAgICAgIGlmICh0eXBlb2YgZGl2U3R5bGVbIHByZWZpeGVzW2pdICsgdVByb3AgXSAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgJC5zdXBwb3J0WyBwcm9wIF0gPSBwcmVmaXhlc1tqXSArIHVQcm9wOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGRpdiA9IG51bGw7CiAgfSkoKTsKCiAgJC5mbi5jbHVldGlwLmRlZmF1bHRzID0gJC5jbHVldGlwLmRlZmF1bHRzOwoKfSkoalF1ZXJ5KTsK]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/jquery.cluetip.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohCiAqIGpRdWVyeSBjbHVlVGlwIHBsdWdpbiB2MS4yLjcKICoKICogRGF0ZTogU2F0IE9jdCAxMyAxNzoxNzo0NyAyMDEyIEVEVAogKiBSZXF1aXJlczogalF1ZXJ5IHYxLjMrCiAqCiAqIENvcHlyaWdodCAyMDEyLCBLYXJsIFN3ZWRiZXJnCiAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgR1BMIGxpY2Vuc2VzOgogKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocAogKiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLmh0bWwKICoKICoKICogRXhhbXBsZXMgY2FuIGJlIGZvdW5kIGF0IGh0dHA6Ly9wbHVnaW5zLmxlYXJuaW5nanF1ZXJ5LmNvbS9jbHVldGlwL2RlbW8vCiAqCiovCihmdW5jdGlvbihjKXtjLmNsdWV0aXA9e3ZlcnNpb246IjEuMi43Iix0ZW1wbGF0ZTonPGRpdj48ZGl2IGNsYXNzPSJjbHVldGlwLW91dGVyIj48aDMgY2xhc3M9ImNsdWV0aXAtdGl0bGUgdWktd2lkZ2V0LWhlYWRlciB1aS1jbHVldGlwLWhlYWRlciI+PC9oMz48ZGl2IGNsYXNzPSJjbHVldGlwLWlubmVyIHVpLXdpZGdldC1jb250ZW50IHVpLWNsdWV0aXAtY29udGVudCI+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0iY2x1ZXRpcC1leHRyYSI+PC9kaXY+PC9kaXY+JyxzZXR1cDp7aW5zZXJ0aW9uVHlwZToiYXBwZW5kVG8iLGluc2VydGlvbkVsZW1lbnQ6ImJvZHkifSxkZWZhdWx0czp7bXVsdGlwbGU6ZmFsc2Usd2lkdGg6Mjc1LGhlaWdodDoiYXV0byIsY2x1ZXpJbmRleDo5Nyxwb3NpdGlvbkJ5OiJhdXRvIix0b3BPZmZzZXQ6MTUsbGVmdE9mZnNldDoxNSxzbmFwVG9FZGdlOmZhbHNlLGxvY2FsOmZhbHNlLGxvY2FsUHJlZml4Om51bGwsbG9jYWxJZFN1ZmZpeDpudWxsLGhpZGVMb2NhbDp0cnVlLAphdHRyaWJ1dGU6InJlbCIsdGl0bGVBdHRyaWJ1dGU6InRpdGxlIixzcGxpdFRpdGxlOiIiLGVzY2FwZVRpdGxlOmZhbHNlLHNob3dUaXRsZTp0cnVlLGNsdWV0aXBDbGFzczoiZGVmYXVsdCIsaG92ZXJDbGFzczoiIix3YWl0SW1hZ2U6dHJ1ZSxjdXJzb3I6ImhlbHAiLGFycm93czpmYWxzZSxkcm9wU2hhZG93OnRydWUsZHJvcFNoYWRvd1N0ZXBzOjYsc3RpY2t5OmZhbHNlLG1vdXNlT3V0Q2xvc2U6ZmFsc2UsZGVsYXllZENsb3NlOjUwLGFjdGl2YXRpb246ImhvdmVyIixjbGlja1Rocm91Z2g6dHJ1ZSx0cmFja2luZzpmYWxzZSxjbG9zZVBvc2l0aW9uOiJ0b3AiLGNsb3NlVGV4dDoiQ2xvc2UiLHRydW5jYXRlOjAsZng6e29wZW46InNob3ciLG9wZW5TcGVlZDoiIn0saG92ZXJJbnRlbnQ6e3NlbnNpdGl2aXR5OjMsaW50ZXJ2YWw6NTAsdGltZW91dDowfSxvbkFjdGl2YXRlOmZ1bmN0aW9uKCl7cmV0dXJuIHRydWV9LG9uU2hvdzpmdW5jdGlvbigpe30sb25IaWRlOmZ1bmN0aW9uKCl7fSwKYWpheENhY2hlOnRydWUsYWpheFByb2Nlc3M6ZnVuY3Rpb24obSl7cmV0dXJuIG09bS5yZXBsYWNlKC88KHNjcmlwdHxzdHlsZXx0aXRsZSlbXjxdKzxcLyhzY3JpcHR8c3R5bGV8dGl0bGUpPi9nbSwiIikucmVwbGFjZSgvPChsaW5rfG1ldGEpW14+XSs+L2csIiIpfSxhamF4U2V0dGluZ3M6e2RhdGFUeXBlOiJodG1sIn0sZGVidWc6ZmFsc2V9fTt2YXIgRSxQPXt9LG1hPTAsVD0wO2MuZm4uYXR0clByb3A9Yy5mbi5wcm9wfHxjLmZuLmF0dHI7Yy5mbi5jbHVldGlwPWZ1bmN0aW9uKG0scSl7ZnVuY3Rpb24gVSh6LGspe3ZhciBsPXp8fCIiO2s9a3x8IiI7aWYodHlwZW9mIGs9PSJvYmplY3QiKWMuZWFjaChrLGZ1bmN0aW9uKGosZCl7bCs9Ii0iK2orIi0iK2R9KTtlbHNlIGlmKHR5cGVvZiBrPT0ic3RyaW5nIilsKz1rO3JldHVybiBsfWZ1bmN0aW9uIFYoeixrLGwpe2w9IiI7az1rLmRyb3BTaGFkb3cmJmsuZHJvcFNoYWRvd1N0ZXBzPytrLmRyb3BTaGFkb3dTdGVwczowO2lmKGMuc3VwcG9ydC5ib3hTaGFkb3cpe2lmKGspbD0KIjFweCAxcHggIitrKyJweCByZ2JhKDAsMCwwLDAuNSkiO3ouY3NzKGMuc3VwcG9ydC5ib3hTaGFkb3csbCk7cmV0dXJuIGZhbHNlfWw9ei5maW5kKCIuY2x1ZXRpcC1kcm9wLXNoYWRvdyIpO2lmKGs9PWwubGVuZ3RoKXJldHVybiBsO2wucmVtb3ZlKCk7bD1bXTtmb3IodmFyIGo9MDtqPGs7KWxbaisrXT0nPGRpdiBzdHlsZT0idG9wOicraisicHg7bGVmdDoiK2orJ3B4OyI+PC9kaXY+JztyZXR1cm4gbD1jKGwuam9pbigiIikpLmNzcyh7cG9zaXRpb246ImFic29sdXRlIixiYWNrZ3JvdW5kQ29sb3I6IiMwMDAiLHpJbmRleDpXLTEsb3BhY2l0eTowLjF9KS5hZGRDbGFzcygiY2x1ZXRpcC1kcm9wLXNoYWRvdyIpLnByZXBlbmRUbyh6KX12YXIgZSxoLEksdyxKLGdhO2lmKHR5cGVvZiBtPT0ib2JqZWN0Iil7cT1tO209bnVsbH1pZihtPT0iZGVzdHJveSIpe3ZhciBYPXRoaXMuZGF0YSgiY2x1ZXRpcCIpO2lmKFgpe2MoWC5zZWxlY3RvcikucmVtb3ZlKCk7Yy5yZW1vdmVEYXRhKHRoaXMsCiJ0aXRsZSIpO2MucmVtb3ZlRGF0YSh0aGlzLCJjbHVldGlwIik7Yy5yZW1vdmVEYXRhKHRoaXMsImNsdWV0aXBNb2MiKX1jKGRvY3VtZW50KS51bmJpbmQoIi5jbHVldGlwIik7cmV0dXJuIHRoaXMudW5iaW5kKCIuY2x1ZXRpcCIpfXE9Yy5leHRlbmQodHJ1ZSx7fSxjLmNsdWV0aXAuZGVmYXVsdHMscXx8e30pO21hKys7dmFyIFc7WD1jLmNsdWV0aXAuYmFja0NvbXBhdHx8IXEubXVsdGlwbGU/ImNsdWV0aXAiOiJjbHVldGlwLSIrbWE7dmFyIGhhPSIjIitYLEE9Yy5jbHVldGlwLmJhY2tDb21wYXQ/IiMiOiIuIixhYT1jLmNsdWV0aXAuc2V0dXAuaW5zZXJ0aW9uVHlwZSxyYT1jLmNsdWV0aXAuc2V0dXAuaW5zZXJ0aW9uRWxlbWVudHx8ImJvZHkiO2FhPS9hcHBlbmRUb3xwcmVwZW5kVG98aW5zZXJ0QmVmb3JlfGluc2VydEFmdGVyLy50ZXN0KGFhKT9hYToiYXBwZW5kVG8iO2U9YyhoYSk7aWYoIWUubGVuZ3RoKXtlPWMoYy5jbHVldGlwLnRlbXBsYXRlKVthYV0ocmEpLmF0dHIoImlkIiwKWCkuY3NzKHtwb3NpdGlvbjoiYWJzb2x1dGUiLGRpc3BsYXk6Im5vbmUifSk7Vz0rcS5jbHVlekluZGV4O0k9ZS5maW5kKEErImNsdWV0aXAtb3V0ZXIiKS5jc3Moe3Bvc2l0aW9uOiJyZWxhdGl2ZSIsekluZGV4Old9KTtoPWUuZmluZChBKyJjbHVldGlwLWlubmVyIik7dz1lLmZpbmQoQSsiY2x1ZXRpcC10aXRsZSIpO2UuYmluZCgibW91c2VlbnRlciBtb3VzZWxlYXZlIixmdW5jdGlvbih6KXtjKHRoaXMpLmRhdGEoImVudGVyZWQiLHoudHlwZT09PSJtb3VzZWVudGVyIil9KX1FPWMoIiNjbHVldGlwLXdhaXRpbWFnZSIpO2lmKCFFLmxlbmd0aCYmcS53YWl0SW1hZ2Upe0U9YygiPGRpdj48L2Rpdj4iKS5hdHRyKCJpZCIsImNsdWV0aXAtd2FpdGltYWdlIikuY3NzKHtwb3NpdGlvbjoiYWJzb2x1dGUifSk7RS5pbnNlcnRCZWZvcmUoZSkuaGlkZSgpfXZhciBzYT0ocGFyc2VJbnQoZS5jc3MoInBhZGRpbmdMZWZ0IiksMTApfHwwKSsocGFyc2VJbnQoZS5jc3MoInBhZGRpbmdSaWdodCIpLAoxMCl8fDApO3RoaXMuZWFjaChmdW5jdGlvbih6KXtmdW5jdGlvbiBrKCl7cmV0dXJuIGZhbHNlfWZ1bmN0aW9uIGwoYixnKXt2YXIgZj1iLnN0YXR1cztnLmJlZm9yZVNlbmQoYi54aHIsZyk7aWYoZj09ImVycm9yIilnW2ZdKGIueGhyLGIudGV4dFN0YXR1cyk7ZWxzZSBmPT0ic3VjY2VzcyImJmdbZl0oYi5kYXRhLGIudGV4dFN0YXR1cyxiLnhocik7Zy5jb21wbGV0ZShiLnhocixnLnRleHRTdGF0dXMpfXZhciBqPXRoaXMsZD1jKHRoaXMpLGE9Yy5leHRlbmQodHJ1ZSx7fSxxLGMubWV0YWRhdGE/ZC5tZXRhZGF0YSgpOmMubWV0YT9kLmRhdGEoKTpkLmRhdGEoImNsdWV0aXAiKXx8e30pLEs9ZmFsc2UsUT1mYWxzZSxGPW51bGwscD1hW2EuYXR0cmlidXRlXXx8KGEuYXR0cmlidXRlPT0iaHJlZiI/ZC5hdHRyKGEuYXR0cmlidXRlKTpkLmF0dHJQcm9wKGEuYXR0cmlidXRlKXx8ZC5hdHRyKGEuYXR0cmlidXRlKSksWT1hLmNsdWV0aXBDbGFzcztXPSthLmNsdWV6SW5kZXg7ZC5kYXRhKCJjbHVldGlwIiwKe3RpdGxlOmoudGl0bGUsekluZGV4Olcsc2VsZWN0b3I6aGF9KTthLmFycm93cyYmIWUuZmluZCgiLmNsdWV0aXAtYXJyb3dzIikubGVuZ3RoJiZlLmFwcGVuZCgnPGRpdiBjbGFzcz0iY2x1ZXRpcC1hcnJvd3MgdWktc3RhdGUtZGVmYXVsdCI+PC9kaXY+Jyk7aWYoIXAmJiFhLnNwbGl0VGl0bGUmJiFtKXJldHVybiB0cnVlO2lmKGEubG9jYWwmJmEubG9jYWxQcmVmaXgpcD1hLmxvY2FsUHJlZml4K3A7YS5sb2NhbCYmYS5oaWRlTG9jYWwmJnAmJmMocCsiOmZpcnN0IikuaGlkZSgpO3ZhciBvPXBhcnNlSW50KGEudG9wT2Zmc2V0LDEwKSxHPXBhcnNlSW50KGEubGVmdE9mZnNldCwxMCksdCxpYSxiYT1pc05hTihwYXJzZUludChhLmhlaWdodCwxMCkpPyJhdXRvIjovXEQvZy50ZXN0KGEuaGVpZ2h0KT9hLmhlaWdodDphLmhlaWdodCsicHgiLFosamEsbmEseCx1LEwsJCxrYT1wYXJzZUludChhLndpZHRoLDEwKXx8Mjc1LHI9a2Erc2ErYS5kcm9wU2hhZG93U3RlcHMsTT10aGlzLm9mZnNldFdpZHRoLApCLG4scyxSLE4sQz1hLmF0dHJpYnV0ZSE9InRpdGxlIj9kLmF0dHIoYS50aXRsZUF0dHJpYnV0ZSl8fCIiOiIiO2lmKGEuc3BsaXRUaXRsZSl7Tj1DLnNwbGl0KGEuc3BsaXRUaXRsZSk7Qz1hLnNob3dUaXRsZXx8TlswXT09PSIiP04uc2hpZnQoKToiIn1pZihhLmVzY2FwZVRpdGxlKUM9Qy5yZXBsYWNlKC8mL2csIiZhbXA7IikucmVwbGFjZSgvPi9nLCImZ3Q7IikucmVwbGFjZSgvPC9nLCImbHQ7Iik7ZC5iaW5kKCJtb3VzZWVudGVyIG1vdXNlbGVhdmUiLGZ1bmN0aW9uKGIpe3ZhciBnPWQuZGF0YSgiY2x1ZXRpcCIpO2cuZW50ZXJlZD1iLnR5cGU9PT0iZW50ZXJlZCI7ZC5kYXRhKCJjbHVldGlwIixnKX0pO3ZhciBkYT1mdW5jdGlvbihiKXt2YXIgZyxmO2lmKGEub25BY3RpdmF0ZS5jYWxsKGosYik9PT1mYWxzZSlyZXR1cm4gZmFsc2U7UT10cnVlO2U9YyhoYSkuY3NzKHtwb3NpdGlvbjoiYWJzb2x1dGUifSk7ST1lLmZpbmQoQSsiY2x1ZXRpcC1vdXRlciIpO2g9ZS5maW5kKEErCiJjbHVldGlwLWlubmVyIik7dz1lLmZpbmQoQSsiY2x1ZXRpcC10aXRsZSIpO0o9ZS5maW5kKEErImNsdWV0aXAtYXJyb3dzIik7ZS5yZW1vdmVDbGFzcygpLmNzcyh7d2lkdGg6a2F9KTtwPT1kLmF0dHIoImhyZWYiKSYmZC5jc3MoImN1cnNvciIsYS5jdXJzb3IpO2EuaG92ZXJDbGFzcyYmZC5hZGRDbGFzcyhhLmhvdmVyQ2xhc3MpO2phPXg9ZC5vZmZzZXQoKS50b3A7bmE9amErZC5pbm5lckhlaWdodCgpO0I9ZC5vZmZzZXQoKS5sZWZ0O009ZC5pbm5lcldpZHRoKCk7aWYoYi50eXBlPT1mb2N1cyl7cz1CK00vMitHO2UuY3NzKHtsZWZ0Om59KTtMPXgrb31lbHNle3M9Yi5wYWdlWDtMPWIucGFnZVl9aWYoai50YWdOYW1lLnRvTG93ZXJDYXNlKCkhPSJhcmVhIil7Wj1jKGRvY3VtZW50KS5zY3JvbGxUb3AoKTtSPWMod2luZG93KS53aWR0aCgpfWlmKGEucG9zaXRpb25CeT09ImZpeGVkIil7bj1NK0IrRztlLmNzcyh7bGVmdDpufSl9ZWxzZXtuPU0+QiYmQj5yfHxCK00rcitHPlI/Qi0Kci1HOk0rQitHO2lmKGoudGFnTmFtZS50b0xvd2VyQ2FzZSgpPT0iYXJlYSJ8fGEucG9zaXRpb25CeT09Im1vdXNlInx8TStyPlIpaWYocysyMCtyPlIpe2UuYWRkQ2xhc3MoImNsdWV0aXAtIitZKTtuPXMtci1HPj0wP3Mtci1HLXBhcnNlSW50KGUuY3NzKCJtYXJnaW5MZWZ0IiksMTApK3BhcnNlSW50KGguY3NzKCJtYXJnaW5SaWdodCIpLDEwKTpzLXIvMn1lbHNlIG49cytHO2c9bjwwP2IucGFnZVkrbzpiLnBhZ2VZO2lmKG48MHx8YS5wb3NpdGlvbkJ5PT0iYm90dG9tVG9wInx8YS5wb3NpdGlvbkJ5PT0idG9wQm90dG9tIiluPXMrci8yPlI/Ui8yLXIvMjpNYXRoLm1heChzLXIvMiwwKX1KLmNzcyh7ekluZGV4OmQuZGF0YSgiY2x1ZXRpcCIpLnpJbmRleCsxfSk7ZS5jc3Moe2xlZnQ6bix6SW5kZXg6ZC5kYXRhKCJjbHVldGlwIikuekluZGV4fSk7aWE9Yyh3aW5kb3cpLmhlaWdodCgpO2lmKG0pe2lmKHR5cGVvZiBtPT0iZnVuY3Rpb24iKW09bS5jYWxsKGopO2guaHRtbChtKTtTKGcpfWVsc2UgaWYoTil7Yj0KTi5sZW5ndGg7aC5odG1sKGI/TlswXToiIik7aWYoYj4xKWZvcih2YXIgaT0xO2k8YjtpKyspaC5hcHBlbmQoJzxkaXYgY2xhc3M9InNwbGl0LWJvZHkiPicrTltpXSsiPC9kaXY+Iik7UyhnKX1lbHNlIGlmKCFhLmxvY2FsJiZwLmluZGV4T2YoIiMiKSE9PTApaWYoL1wuKGpwZT9nfHRpZmY/fGdpZnxwbmcpKD86XD8uKik/JC9pLnRlc3QocCkpe2guaHRtbCgnPGltZyBzcmM9IicrcCsnIiBhbHQ9IicrQysnIiAvPicpO1MoZyl9ZWxzZXt2YXIgdj1hLmFqYXhTZXR0aW5ncy5iZWZvcmVTZW5kLGNhPWEuYWpheFNldHRpbmdzLmVycm9yLEg9YS5hamF4U2V0dGluZ3Muc3VjY2VzcyxvYT1hLmFqYXhTZXR0aW5ncy5jb21wbGV0ZTtmPVUocCxhLmFqYXhTZXR0aW5ncy5kYXRhKTtiPWMuZXh0ZW5kKHRydWUse30sYS5hamF4U2V0dGluZ3Mse2NhY2hlOmEuYWpheENhY2hlLHVybDpwLGJlZm9yZVNlbmQ6ZnVuY3Rpb24oeSxEKXt2JiZ2LmNhbGwoaix5LGUsaCxEKTtJLmNoaWxkcmVuKCkuZW1wdHkoKTsKYS53YWl0SW1hZ2UmJkUuY3NzKHt0b3A6TCsyMCxsZWZ0OnMrMjAsekluZGV4OmQuZGF0YSgiY2x1ZXRpcCIpLnpJbmRleC0xfSkuc2hvdygpfSxlcnJvcjpmdW5jdGlvbih5LEQpe2lmKHEuYWpheENhY2hlJiYhUFtmXSlQW2ZdPXtzdGF0dXM6ImVycm9yIix0ZXh0U3RhdHVzOkQseGhyOnl9O2lmKFEpY2E/Y2EuY2FsbChqLHksRCxlLGgpOmguaHRtbCgiPGk+c29ycnksIHRoZSBjb250ZW50cyBjb3VsZCBub3QgYmUgbG9hZGVkPC9pPiIpfSxzdWNjZXNzOmZ1bmN0aW9uKHksRCxPKXtpZihxLmFqYXhDYWNoZSYmIVBbZl0pUFtmXT17c3RhdHVzOiJzdWNjZXNzIixkYXRhOnksdGV4dFN0YXR1czpELHhocjpPfTtLPWEuYWpheFByb2Nlc3MuY2FsbChqLHkpO2lmKHR5cGVvZiBLPT0ib2JqZWN0IiYmSyE9PW51bGwpe0M9Sy50aXRsZTtLPUsuY29udGVudH1pZihRKXtIJiZILmNhbGwoaix5LEQsZSxoKTtoLmh0bWwoSyl9fSxjb21wbGV0ZTpmdW5jdGlvbih5LEQpe29hJiZvYS5jYWxsKGosCnksRCxlLGgpO3ZhciBPPWhbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoImltZyIpO1Q9Ty5sZW5ndGg7Zm9yKHZhciBsYT0wLHRhPU8ubGVuZ3RoO2xhPHRhO2xhKyspT1tsYV0uY29tcGxldGUmJlQtLTtpZihUJiYhYy5icm93c2VyLm9wZXJhKWMoTykuYmluZCgibG9hZC5jdCBlcnJvci5jdCIsZnVuY3Rpb24oKXtULS07aWYoVD09PTApe0UuaGlkZSgpO2MoTykudW5iaW5kKCIuY3QiKTtRJiZTKGcpfX0pO2Vsc2V7RS5oaWRlKCk7USYmUyhnKX19fSk7UFtmXT9sKFBbZl0sYik6Yy5hamF4KGIpfWVsc2UgaWYoYS5sb2NhbCl7Yj1jKHArKC9eI1xTKyQvLnRlc3QocCk/IiI6IjplcSgiK3orIikiKSkuY2xvbmUodHJ1ZSkuc2hvdygpO2EubG9jYWxJZFN1ZmZpeCYmYi5hdHRyKCJpZCIsYlswXS5pZCthLmxvY2FsSWRTdWZmaXgpO2guaHRtbChiKTtTKGcpfX0sUz1mdW5jdGlvbihiKXt2YXIgZyxmO2c9Q3x8YS5zaG93VGl0bGUmJiImbmJzcDsiO3ZhciBpPSIiO2Y9IiI7dmFyIHY9ZmFsc2U7CnY9e2JvdHRvbTpmdW5jdGlvbihIKXtILmFwcGVuZFRvKGgpfSx0b3A6ZnVuY3Rpb24oSCl7SC5wcmVwZW5kVG8oaCl9LHRpdGxlOmZ1bmN0aW9uKEgpe0gucHJlcGVuZFRvKHcpfX07ZS5hZGRDbGFzcygiY2x1ZXRpcC0iK1kpO2lmKGEudHJ1bmNhdGUpe3ZhciBjYT1oLnRleHQoKS5zbGljZSgwLGEudHJ1bmNhdGUpKyIuLi4iO2guaHRtbChjYSl9Zz93LnNob3coKS5odG1sKGcpOncuaGlkZSgpO2lmKGEuc3RpY2t5KXtpZih2W2EuY2xvc2VQb3NpdGlvbl0pe2c9YygnPGRpdiBjbGFzcz0iY2x1ZXRpcC1jbG9zZSI+PGEgaHJlZj0iIyI+JythLmNsb3NlVGV4dCsiPC9hPjwvZGl2PiIpO3ZbYS5jbG9zZVBvc2l0aW9uXShnKTtnLmJpbmQoImNsaWNrLmNsdWV0aXAiLGZ1bmN0aW9uKCl7ZWEoKTtyZXR1cm4gZmFsc2V9KX1pZihhLm1vdXNlT3V0Q2xvc2Upe2QudW5iaW5kKCJtb3VzZWxlYXZlLmNsdWV0aXBNb2MiKTtlLnVuYmluZCgibW91c2VsZWF2ZS5jbHVldGlwTW9jIik7aWYoYS5tb3VzZU91dENsb3NlPT0KImJvdGgifHxhLm1vdXNlT3V0Q2xvc2U9PSJjbHVldGlwInx8YS5tb3VzZU91dENsb3NlPT09dHJ1ZSllLmJpbmQoIm1vdXNlbGVhdmUuY2x1ZXRpcE1vYyIscGEpO2lmKGEubW91c2VPdXRDbG9zZT09ImJvdGgifHxhLm1vdXNlT3V0Q2xvc2U9PSJsaW5rIilkLmJpbmQoIm1vdXNlbGVhdmUuY2x1ZXRpcE1vYyIscGEpfX1JLmNzcyh7ekluZGV4OmQuZGF0YSgiY2x1ZXRpcCIpLnpJbmRleCxvdmVyZmxvdzpiYT09ImF1dG8iPyJ2aXNpYmxlIjoiYXV0byIsaGVpZ2h0OmJhfSk7dD1iYT09ImF1dG8iP01hdGgubWF4KGUub3V0ZXJIZWlnaHQoKSxlLmhlaWdodCgpKTpwYXJzZUludChiYSwxMCk7dT14OyQ9WitpYTt2PW48cyYmTWF0aC5tYXgobiwwKStyPnM7aWYoYS5wb3NpdGlvbkJ5PT0iZml4ZWQiKXU9eC1hLmRyb3BTaGFkb3dTdGVwcytvO2Vsc2UgaWYoYS5wb3NpdGlvbkJ5PT0idG9wQm90dG9tInx8YS5wb3NpdGlvbkJ5PT0iYm90dG9tVG9wInx8dil7aWYoYS5wb3NpdGlvbkJ5PT0KInRvcEJvdHRvbSIpZj14K3QrbzwkJiZMLVo8dCtvPyJib3R0b20iOiJ0b3AiO2Vsc2UgaWYoYS5wb3NpdGlvbkJ5PT0iYm90dG9tVG9wInx8dilmPXgrdCtvPiQmJkwtWj50K28/InRvcCI6ImJvdHRvbSI7aWYoYS5zbmFwVG9FZGdlKWlmKGY9PSJ0b3AiKXU9amEtdC1vO2Vsc2V7aWYoZj09ImJvdHRvbSIpdT1uYStvfWVsc2UgaWYoZj09InRvcCIpdT1MLXQtbztlbHNlIGlmKGY9PSJib3R0b20iKXU9TCtvfWVsc2UgdT14K3Qrbz4kP3Q+PWlhP1o6JC10LW86ZC5jc3MoImRpc3BsYXkiKT09ImJsb2NrInx8ai50YWdOYW1lLnRvTG93ZXJDYXNlKCk9PSJhcmVhInx8YS5wb3NpdGlvbkJ5PT0ibW91c2UiP2Itbzp4LWEuZHJvcFNoYWRvd1N0ZXBzO2lmKGY9PT0iIilmPW48Qj8ibGVmdCI6InJpZ2h0IjtnPSIgY2x1ZS0iK2YrIi0iK1krIiBjbHVldGlwLSIrWTtpZihZPT0icm91bmRlZCIpZys9IiB1aS1jb3JuZXItYWxsIjtlLmNzcyh7dG9wOnUrInB4In0pLmF0dHJQcm9wKHtjbGFzc05hbWU6ImNsdWV0aXAgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWNsdWV0aXAiKwpnfSk7aWYoYS5hcnJvd3Mpe2lmKC8obGVmdHxyaWdodCkvLnRlc3QoZikpe2Y9ZS5oZWlnaHQoKS1KLmhlaWdodCgpO2k9bj49MCYmYj4wP3gtdS1hLmRyb3BTaGFkb3dTdGVwczowO2k9Zj5pP2k6ZjtpKz0icHgifUouY3NzKHt0b3A6aX0pLnNob3coKX1lbHNlIEouaGlkZSgpOyhnYT1WKGUsYSkpJiZnYS5sZW5ndGgmJmdhLmhpZGUoKS5jc3Moe2hlaWdodDp0LHdpZHRoOmthLHpJbmRleDpkLmRhdGEoImNsdWV0aXAiKS56SW5kZXgtMX0pLnNob3coKTtGfHxlLmhpZGUoKTtjbGVhclRpbWVvdXQoRik7Rj1udWxsO2VbYS5meC5vcGVuXShhLmZ4Lm9wZW5TcGVlZHx8MCk7Yy5mbi5iZ2lmcmFtZSYmZS5iZ2lmcmFtZSgpO2Eub25TaG93LmNhbGwoaixlLGgpfSxmYT1mdW5jdGlvbigpe1E9ZmFsc2U7RS5oaWRlKCk7aWYoIWEuc3RpY2t5fHwvY2xpY2t8dG9nZ2xlLy50ZXN0KGEuYWN0aXZhdGlvbikpaWYoYS5kZWxheWVkQ2xvc2U+MCl7Y2xlYXJUaW1lb3V0KEYpO0Y9bnVsbDtGPXNldFRpbWVvdXQoZWEsCmEuZGVsYXllZENsb3NlKX1hLmhvdmVyQ2xhc3MmJmQucmVtb3ZlQ2xhc3MoYS5ob3ZlckNsYXNzKX0sZWE9ZnVuY3Rpb24oYil7Yj1iJiZiLmRhdGEoImNsdWV0aXAiKT9iOmQ7dmFyIGc9Yi5kYXRhKCJjbHVldGlwIikmJmIuZGF0YSgiY2x1ZXRpcCIpLnNlbGVjdG9yLGY9YyhnfHwiZGl2LmNsdWV0aXAiKSxpPWYuZmluZChBKyJjbHVldGlwLWlubmVyIiksdj1mLmZpbmQoQSsiY2x1ZXRpcC1hcnJvd3MiKTtmLmhpZGUoKS5yZW1vdmVDbGFzcygpO2Eub25IaWRlLmNhbGwoYlswXSxmLGkpO2lmKGcpe2IucmVtb3ZlQ2xhc3MoImNsdWV0aXAtY2xpY2tlZCIpO2IuY3NzKCJjdXJzb3IiLCIiKX1nJiZDJiZiLmF0dHJQcm9wKGEudGl0bGVBdHRyaWJ1dGUsQyk7YS5hcnJvd3MmJnYuY3NzKHt0b3A6IiJ9KX0scGE9ZnVuY3Rpb24oKXt2YXIgYj10aGlzO2NsZWFyVGltZW91dChGKTtGPXNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgZz1kLmRhdGEoImNsdWV0aXAiKS5lbnRlcmVkLGY9ZS5kYXRhKCJlbnRlcmVkIiksCmk9ZmFsc2U7aWYoYS5tb3VzZU91dENsb3NlPT0iYm90aCImJihnfHxmKSlpPXRydWU7ZWxzZSBpZigoYS5tb3VzZU91dENsb3NlPT09dHJ1ZXx8YS5tb3VzZU91dENsb3NlPT0iY2x1ZXRpcCIpJiZmKWk9dHJ1ZTtlbHNlIGlmKGEubW91c2VPdXRDbG9zZT09ImxpbmsiJiZnKWk9dHJ1ZTtpfHxlYS5jYWxsKGIpfSxhLmRlbGF5ZWRDbG9zZSl9O2MoZG9jdW1lbnQpLnVuYmluZCgiaGlkZUNsdWV0aXAuY2x1ZXRpcCIpLmJpbmQoImhpZGVDbHVldGlwLmNsdWV0aXAiLGZ1bmN0aW9uKGIpe2VhKGMoYi50YXJnZXQpKX0pO2lmKC9jbGlja3x0b2dnbGUvLnRlc3QoYS5hY3RpdmF0aW9uKSlkLmJpbmQoImNsaWNrLmNsdWV0aXAiLGZ1bmN0aW9uKGIpe2lmKGUuaXMoIjpoaWRkZW4iKXx8IWQuaXMoIi5jbHVldGlwLWNsaWNrZWQiKSl7ZGEoYik7YygiLmNsdWV0aXAtY2xpY2tlZCIpLnJlbW92ZUNsYXNzKCJjbHVldGlwLWNsaWNrZWQiKTtkLmFkZENsYXNzKCJjbHVldGlwLWNsaWNrZWQiKX1lbHNlIGZhKGIpOwpyZXR1cm4gZmFsc2V9KTtlbHNlIGlmKGEuYWN0aXZhdGlvbj09ImZvY3VzIil7ZC5iaW5kKCJmb2N1cy5jbHVldGlwIixmdW5jdGlvbihiKXtkLmF0dHJQcm9wKCJ0aXRsZSIsIiIpO2RhKGIpfSk7ZC5iaW5kKCJibHVyLmNsdWV0aXAiLGZ1bmN0aW9uKGIpe2QuYXR0clByb3AoInRpdGxlIixkLmRhdGEoImNsdWV0aXAiKS50aXRsZSk7ZmEoYil9KX1lbHNle2RbYS5jbGlja1Rocm91Z2g/InVuYmluZCI6ImJpbmQiXSgiY2xpY2suY2x1ZXRpcCIsayk7dmFyIHFhPWZ1bmN0aW9uKGIpe2lmKGEudHJhY2tpbmcpe3ZhciBnPW4tYi5wYWdlWCxmPXU/dS1iLnBhZ2VZOngtYi5wYWdlWTtkLmJpbmQoIm1vdXNlbW92ZS5jbHVldGlwIixmdW5jdGlvbihpKXtlLmNzcyh7bGVmdDppLnBhZ2VYK2csdG9wOmkucGFnZVkrZn0pfSl9fTtjLmZuLmhvdmVySW50ZW50JiZhLmhvdmVySW50ZW50P2QuaG92ZXJJbnRlbnQoe3NlbnNpdGl2aXR5OmEuaG92ZXJJbnRlbnQuc2Vuc2l0aXZpdHksaW50ZXJ2YWw6YS5ob3ZlckludGVudC5pbnRlcnZhbCwKb3ZlcjpmdW5jdGlvbihiKXtkYShiKTtxYShiKX0sdGltZW91dDphLmhvdmVySW50ZW50LnRpbWVvdXQsb3V0OmZ1bmN0aW9uKGIpe2ZhKGIpO2QudW5iaW5kKCJtb3VzZW1vdmUuY2x1ZXRpcCIpfX0pOmQuYmluZCgibW91c2VlbnRlci5jbHVldGlwIixmdW5jdGlvbihiKXtkYShiKTtxYShiKX0pLmJpbmQoIm1vdXNlbGVhdmUuY2x1ZXRpcCIsZnVuY3Rpb24oYil7ZmEoYik7ZC51bmJpbmQoIm1vdXNlbW92ZS5jbHVldGlwIil9KTtkLmJpbmQoIm1vdXNlb3Zlci5jbHVldGlwIixmdW5jdGlvbigpe2QuYXR0clByb3AoInRpdGxlIiwiIil9KS5iaW5kKCJtb3VzZWxlYXZlLmNsdWV0aXAiLGZ1bmN0aW9uKCl7ZC5hdHRyUHJvcCgidGl0bGUiLGQuZGF0YSgiY2x1ZXRpcCIpLnRpdGxlKX0pfX0pO3JldHVybiB0aGlzfTsoZnVuY3Rpb24oKXtjLnN1cHBvcnQ9Yy5zdXBwb3J0fHx7fTtmb3IodmFyIG09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iikuc3R5bGUscT1bImJveFNoYWRvdyJdLApVPVsibW96IiwiTW96Iiwid2Via2l0IiwibyJdLFY9MCxlPXEubGVuZ3RoO1Y8ZTtWKyspe3ZhciBoPXFbVl0sST1oLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2guc2xpY2UoMSk7aWYodHlwZW9mIG1baF0hPT0idW5kZWZpbmVkIiljLnN1cHBvcnRbaF09aDtlbHNlIGZvcih2YXIgdz0wLEo9VS5sZW5ndGg7dzxKO3crKylpZih0eXBlb2YgbVtVW3ddK0ldIT09InVuZGVmaW5lZCIpe2Muc3VwcG9ydFtoXT1VW3ddK0k7YnJlYWt9fX0pKCk7Yy5mbi5jbHVldGlwLmRlZmF1bHRzPWMuY2x1ZXRpcC5kZWZhdWx0c30pKGpRdWVyeSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/jquery.compat.cluetip.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqID1iYWNrLWNvbXBhdCBjc3MgZmlsZQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKVXNlIHRoaXMgaW5zdGVhZCBvZiBqcXVlcnkuY2x1ZXRpcC5jc3MgaWYgYWxzbyB1c2luZyB0aGUKYmFjay1jb21wYXQganMgZmlsZSAtLSBqcXVlcnkuY29tcGF0LmNsdWV0aXAuanMKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyogZ2xvYmFsICovCmRpdi51aS1jbHVldGlwIHsKICBmb250LXNpemU6IDFlbTsKfQoudWktY2x1ZXRpcC1oZWFkZXIsCi51aS1jbHVldGlwLWNvbnRlbnQgewogIHBhZGRpbmc6IDEycHg7Cn0KLnVpLWNsdWV0aXAtaGVhZGVyIHsKICBmb250LXNpemU6IDFlbTsKICBtYXJnaW46IDA7CiAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKI2NsdWV0aXAtdGl0bGUgI2NsdWV0aXAtY2xvc2UgewogIGZsb2F0OiByaWdodDsKICBwb3NpdGlvbjogcmVsYXRpdmU7Cn0KI2NsdWV0aXAtY2xvc2UgaW1nIHsKICBib3JkZXI6IDA7Cn0KCiNjbHVldGlwLXdhaXRpbWFnZSB7CiAgd2lkdGg6IDQzcHg7CiAgaGVpZ2h0OiAxMXB4OwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoaW1hZ2VzL3dhaXQuZ2lmKTsKfQouY2x1ZXRpcC1hcnJvd3MgewogIGRpc3BsYXk6IG5vbmU7CiAgcG9zaXRpb246IGFic29sdXRlOwogIHRvcDogMDsKICBsZWZ0OiAtMTFweDsKICB3aWR0aDogMTFweDsKICBoZWlnaHQ6IDIycHg7CiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsKICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIDA7CiAgYm9yZGVyLXdpZHRoOiAwOwp9CiNjbHVldGlwLWV4dHJhIHsKICBkaXNwbGF5OiBub25lOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgID1jbHVldGlwQ2xhc3M6ICdkZWZhdWx0JwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLmNsdWV0aXAtZGVmYXVsdCB7CiAgYmFja2dyb3VuZC1jb2xvcjogI2Q5ZDljMjsKfQouY2x1ZXRpcC1kZWZhdWx0IC51aS1jbHVldGlwLWhlYWRlciB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzg3ODc2YTsKfQoKCi8qCi5jbHVldGlwLWRlZmF1bHQgI2NsdWV0aXAtb3V0ZXIgewogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICBtYXJnaW46IDA7CiAgYmFja2dyb3VuZC1jb2xvcjogI2Q5ZDljMjsKfQouY2x1ZXRpcC1kZWZhdWx0IGgzI2NsdWV0aXAtdGl0bGUgewogIG1hcmdpbjogMCAwIDVweDsKICBwYWRkaW5nOiA4cHggMTBweCA0cHg7CiAgZm9udC1zaXplOiAxLjFlbTsKICBmb250LXdlaWdodDogbm9ybWFsOwogIGJhY2tncm91bmQtY29sb3I6ICM4Nzg3NmE7CiAgY29sb3I6ICNmZmY7Cn0KLmNsdWV0aXAtZGVmYXVsdCAjY2x1ZXRpcC10aXRsZSBhIHsKICBjb2xvcjogI2Q5ZDljMjsKICBmb250LXNpemU6IDAuOTVlbTsKfQouY2x1ZXRpcC1kZWZhdWx0ICNjbHVldGlwLWlubmVyIHsKICBwYWRkaW5nOiAxMHB4Owp9Ci5jbHVldGlwLWRlZmF1bHQgZGl2I2NsdWV0aXAtY2xvc2UgewogIHRleHQtYWxpZ246IHJpZ2h0OwogIG1hcmdpbjogMCA1cHggNXB4OwogIGNvbG9yOiAjOTAwOwp9CiovCi8qIGRlZmF1bHQgYXJyb3dzICovCmRpdi5jbHVldGlwLWRlZmF1bHQgLmNsdWV0aXAtYXJyb3dzIHsKICBib3JkZXItd2lkdGg6IDA7CiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgbm9uZTsKfQpkaXYuY2x1ZS1yaWdodC1kZWZhdWx0IC5jbHVldGlwLWFycm93cyB7CiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGltYWdlcy9kYXJyb3dsZWZ0LmdpZik7Cn0KZGl2LmNsdWUtbGVmdC1kZWZhdWx0IC5jbHVldGlwLWFycm93cyB7CiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGltYWdlcy9kYXJyb3dyaWdodC5naWYpOwogIGxlZnQ6IDEwMCU7CiAgbWFyZ2luLXJpZ2h0OiAtMTFweDsKfQpkaXYuY2x1ZS10b3AtZGVmYXVsdCAuY2x1ZXRpcC1hcnJvd3MgewogIGJhY2tncm91bmQtaW1hZ2U6IHVybChpbWFnZXMvZGFycm93ZG93bi5naWYpOwogIHRvcDogMTAwJTsKICBsZWZ0OiA1MCU7CiAgbWFyZ2luLWxlZnQ6IC0xMXB4OwogIHdpZHRoOiAyMnB4OwogIGhlaWdodDogMTFweDsKfQpkaXYuY2x1ZS1ib3R0b20tZGVmYXVsdCAuY2x1ZXRpcC1hcnJvd3MgewogIGJhY2tncm91bmQtaW1hZ2U6IHVybChpbWFnZXMvZGFycm93dXAuZ2lmKTsKICB0b3A6IC0xMXB4OwogIGxlZnQ6IDUwJTsKICBtYXJnaW4tbGVmdDogLTExcHg7CiAgd2lkdGg6IDIycHg7CiAgaGVpZ2h0OiAxMXB4Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgID1jbHVldGlwQ2xhc3M6ICdqdGlwJwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwouY2x1ZXRpcC1qdGlwIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOwp9Ci5jbHVldGlwLWp0aXAgI2NsdWV0aXAtb3V0ZXIgewogIGJvcmRlcjogMnB4IHNvbGlkICNjY2M7CiAgcG9zaXRpb246IHJlbGF0aXZlOwp9CgouY2x1ZXRpcC1qdGlwICNjbHVldGlwLWlubmVyIHsKICBwYWRkaW5nOiA1cHg7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwp9Ci5jbHVldGlwLWp0aXAgZGl2I2NsdWV0aXAtY2xvc2UgewogIHRleHQtYWxpZ246IHJpZ2h0OwogIG1hcmdpbjogMCA1cHggMDsKICBjb2xvcjogIzkwMDsKfQoKLmNsdWV0aXAtanRpcCAudWktY2x1ZXRpcC1oZWFkZXIgewogIGJhY2tncm91bmQtY29sb3I6ICNjY2M7CiAgcGFkZGluZzogNnB4OwovKiAgbWFyZ2luLWJvdHRvbTogMWVtOyovCn0KCi8qIGp0aXAgYXJyb3dzICovCmRpdi5jbHVldGlwLWp0aXAgLmNsdWV0aXAtYXJyb3dzIHsKICBib3JkZXItd2lkdGg6IDA7CiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgbm9uZTsKfQpkaXYuY2x1ZS1yaWdodC1qdGlwIC5jbHVldGlwLWFycm93cyB7CiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGltYWdlcy9hcnJvd2xlZnQuZ2lmKTsKfQpkaXYuY2x1ZS1sZWZ0LWp0aXAgLmNsdWV0aXAtYXJyb3dzIHsKICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoaW1hZ2VzL2Fycm93cmlnaHQuZ2lmKTsKICBsZWZ0OiAxMDAlOwogIG1hcmdpbi1yaWdodDogLTExcHg7Cn0KZGl2LmNsdWUtdG9wLWp0aXAgLmNsdWV0aXAtYXJyb3dzIHsKICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoaW1hZ2VzL2Fycm93ZG93bi5naWYpOwogIHRvcDogMTAwJTsKICBsZWZ0OiA1MCU7CiAgd2lkdGg6IDIycHg7CiAgaGVpZ2h0OiAxMXB4OwogIG1hcmdpbi1sZWZ0OiAtMTFweDsKfQpkaXYuY2x1ZS1ib3R0b20tanRpcCAuY2x1ZXRpcC1hcnJvd3MgewogIGJhY2tncm91bmQtaW1hZ2U6IHVybChpbWFnZXMvYXJyb3d1cC5naWYpOwogIHRvcDogLTExcHg7CiAgbGVmdDogNTAlOwogIHdpZHRoOiAyMnB4OwogIGhlaWdodDogMTFweDsKICBtYXJnaW4tbGVmdDogLTExcHg7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgPWNsdWV0aXBDbGFzczogJ3JvdW5kZWQnCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi5jbHVldGlwLXJvdW5kZWQgewogIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNnB4OwogIC1tb3otYm9yZGVyLXJhZGl1czogNnB4OwogIGJvcmRlci1yYWRpdXM6IDZweDsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOwogIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7Cn0KLmNsdWV0aXAtcm91bmRlZCAgLmNsdWV0aXAtYXJyb3dzIHsKICBib3JkZXItY29sb3I6ICNjY2M7Cn0KCi8qIG5lZWQgdG8gYmUgbW9yZSBzcGVjaWZpYyBoZXJlIHRvIG92ZXJyaWRlIFRoZW1lUm9sbGVyIGRlZmF1bHRzICovCmRpdi5jbHVldGlwLXJvdW5kZWQgIC5jbHVldGlwLWFycm93cyB7CiAgZm9udC1zaXplOiAwOwogIGxpbmUtaGVpZ2h0OiAwJTsKICB3aWR0aDogMDsKICBoZWlnaHQ6IDA7CiAgYm9yZGVyLXN0eWxlOiBzb2xpZDsKICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudCBub25lOwp9CmRpdi5jbHVlLXJpZ2h0LXJvdW5kZWQgLmNsdWV0aXAtYXJyb3dzIHsKICBib3JkZXItd2lkdGg6IDExcHggMTFweCAxMXB4IDA7CiAgYm9yZGVyLXRvcC1jb2xvcjogdHJhbnNwYXJlbnQ7CiAgYm9yZGVyLWJvdHRvbS1jb2xvcjogdHJhbnNwYXJlbnQ7CiAgYm9yZGVyLWxlZnQtY29sb3I6IHRyYW5zcGFyZW50Owp9CmRpdi5jbHVlLWxlZnQtcm91bmRlZCAuY2x1ZXRpcC1hcnJvd3MgewogIGxlZnQ6IDEwMCU7CiAgbWFyZ2luLXJpZ2h0OiAtMTFweDsKICBib3JkZXItd2lkdGg6IDExcHggMCAxMXB4IDExcHg7CiAgYm9yZGVyLXRvcC1jb2xvcjogdHJhbnNwYXJlbnQ7CiAgYm9yZGVyLXJpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsKICBib3JkZXItYm90dG9tLWNvbG9yOiB0cmFuc3BhcmVudDsKCn0KZGl2LmNsdWUtdG9wLXJvdW5kZWQgLmNsdWV0aXAtYXJyb3dzIHsKICB0b3A6IDEwMCU7CiAgbGVmdDogNTAlOwogIGJvcmRlci13aWR0aDogMTFweCAxMXB4IDAgMTFweDsKICBib3JkZXItcmlnaHQtY29sb3I6IHRyYW5zcGFyZW50OwogIGJvcmRlci1ib3R0b20tY29sb3I6IHRyYW5zcGFyZW50OwogIGJvcmRlci1sZWZ0LWNvbG9yOiB0cmFuc3BhcmVudDsKfQouY2x1ZS1ib3R0b20tcm91bmRlZCAuY2x1ZXRpcC1hcnJvd3MgewogIHRvcDogLTExcHg7CiAgbGVmdDogNTAlOwogIGJvcmRlci13aWR0aDogMCAxMXB4IDExcHggMTFweDsKICBib3JkZXItdG9wLWNvbG9yOiB0cmFuc3BhcmVudDsKICBib3JkZXItcmlnaHQtY29sb3I6IHRyYW5zcGFyZW50OwogIGJvcmRlci1sZWZ0LWNvbG9yOiB0cmFuc3BhcmVudDsKCn0KLyogc3R1cGlkIElFNiBIYXNMYXlvdXQgaGFjayAqLwouY2x1ZXRpcC1yb3VuZGVkICNjbHVldGlwLXRpdGxlLAouY2x1ZXRpcC1yb3VuZGVkICNjbHVldGlwLWlubmVyIHsKICB6b29tOiAxOwp9]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/jquery.compat.cluetip.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKCQpIHsKICAvLyBCYWNrLWNvbXBhdCBmaWxlIGZvciBjbHVlVGlwIDEuMgogIC8vIFRoaXMgbW9kaWZpZXMgdGhlICQuZm4uY2x1ZXRpcCBvYmplY3QgdG8gbWFrZSB0aGUgcGx1Z2luIHdvcmsgdGhlIHdheSBpdCBkaWQgYmVmb3JlIGNsdWVUaXAgdmVyc2lvbiAxLjIKICAkLmV4dGVuZCh0cnVlLCAkLmZuLmNsdWV0aXAsIHsKICAgIGJhY2tDb21wYXQ6IHRydWUsCiAgICB0ZW1wbGF0ZTogWyc8ZGl2IGlkPSJjbHVldGlwIj4nLAogICAgICAnPGRpdiBpZD0iY2x1ZXRpcC1vdXRlciIgY2xhc3M9ImNsdWV0aXAtb3V0ZXIiPicsCiAgICAgICAgJzxoMyBpZD0iY2x1ZXRpcC10aXRsZSIgY2xhc3M9ImNsdWV0aXAtdGl0bGUgdWktd2lkZ2V0LWhlYWRlciB1aS1jbHVldGlwLWhlYWRlciI+PC9oMz4nLAogICAgICAgICc8ZGl2IGlkPSJjbHVldGlwLWlubmVyIiBjbGFzcz0iY2x1ZXRpcC1pbm5lciB1aS13aWRnZXQtY29udGVudCB1aS1jbHVldGlwLWNvbnRlbnQiPjwvZGl2PicsCiAgICAgICc8L2Rpdj4nLAogICAgICAnPGRpdiBpZD0iY2x1ZXRpcC1leHRyYSI+PC9kaXY+JywKICAgICAgJzxkaXYgaWQ9ImNsdWV0aXAtYXJyb3dzIiBjbGFzcz0iY2x1ZXRpcC1hcnJvd3MiPjwvZGl2PicsCiAgICAnPC9kaXY+J10uam9pbignJykKICB9KTsKfSkoalF1ZXJ5KTsK]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/jquery.compat.cluetip.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKGEpe2EuZXh0ZW5kKHRydWUsYS5mbi5jbHVldGlwLHtiYWNrQ29tcGF0OnRydWUsdGVtcGxhdGU6JzxkaXYgaWQ9ImNsdWV0aXAiPjxkaXYgaWQ9ImNsdWV0aXAtb3V0ZXIiIGNsYXNzPSJjbHVldGlwLW91dGVyIj48aDMgaWQ9ImNsdWV0aXAtdGl0bGUiIGNsYXNzPSJjbHVldGlwLXRpdGxlIHVpLXdpZGdldC1oZWFkZXIgdWktY2x1ZXRpcC1oZWFkZXIiPjwvaDM+PGRpdiBpZD0iY2x1ZXRpcC1pbm5lciIgY2xhc3M9ImNsdWV0aXAtaW5uZXIgdWktd2lkZ2V0LWNvbnRlbnQgdWktY2x1ZXRpcC1jb250ZW50Ij48L2Rpdj48L2Rpdj48ZGl2IGlkPSJjbHVldGlwLWV4dHJhIj48L2Rpdj48ZGl2IGlkPSJjbHVldGlwLWFycm93cyIgY2xhc3M9ImNsdWV0aXAtYXJyb3dzIj48L2Rpdj48L2Rpdj4nfSl9KShqUXVlcnkpOwo=]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/lib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/lib/jquery-1.3.2.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohCiAqIGpRdWVyeSBKYXZhU2NyaXB0IExpYnJhcnkgdjEuMy4zcHJlCiAqIGh0dHA6Ly9qcXVlcnkuY29tLwogKgogKiBDb3B5cmlnaHQgKGMpIDIwMDkgSm9obiBSZXNpZwogKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIEdQTCBsaWNlbnNlcy4KICogaHR0cDovL2RvY3MuanF1ZXJ5LmNvbS9MaWNlbnNlCiAqCiAqIERhdGU6IDIwMDktMDYtMDQgMTM6MzY6MjMgLTA0MDAgKFRodSwgMDQgSnVuIDIwMDkpCiAqIFJldmlzaW9uOiA2MzcyCiAqLwooZnVuY3Rpb24od2luZG93LCB1bmRlZmluZWQpewoKLy8gRGVmaW5lIGEgbG9jYWwgY29weSBvZiBqUXVlcnkKdmFyIGpRdWVyeSA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCApIHsKCQkvLyBUaGUgalF1ZXJ5IG9iamVjdCBpcyBhY3R1YWxseSBqdXN0IHRoZSBpbml0IGNvbnN0cnVjdG9yICdlbmhhbmNlZCcKCQlyZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMCA/CgkJCXJvb3RqUXVlcnkgOgoJCQluZXcgalF1ZXJ5LmZuLmluaXQoIHNlbGVjdG9yLCBjb250ZXh0ICk7Cgl9LAoKCS8vIE1hcCBvdmVyIGpRdWVyeSBpbiBjYXNlIG9mIG92ZXJ3cml0ZQoJX2pRdWVyeSA9IHdpbmRvdy5qUXVlcnksCgoJLy8gTWFwIG92ZXIgdGhlICQgaW4gY2FzZSBvZiBvdmVyd3JpdGUKCV8kID0gd2luZG93LiQsCgoJLy8gQSBjZW50cmFsIHJlZmVyZW5jZSB0byB0aGUgcm9vdCBqUXVlcnkoZG9jdW1lbnQpCglyb290alF1ZXJ5LAoKCS8vIEEgc2ltcGxlIHdheSB0byBjaGVjayBmb3IgSFRNTCBzdHJpbmdzIG9yIElEIHN0cmluZ3MKCS8vIChib3RoIG9mIHdoaWNoIHdlIG9wdGltaXplIGZvcikKCXF1aWNrRXhwciA9IC9eW148XSooPCgufFxzKSs+KVtePl0qJHxeIyhbXHctXSspJC8sCgoJLy8gSXMgaXQgYSBzaW1wbGUgc2VsZWN0b3IKCWlzU2ltcGxlID0gL14uW146I1xbXC4sXSokLywKCgkvLyBLZWVwIGEgVXNlckFnZW50IHN0cmluZyBmb3IgdXNlIHdpdGggalF1ZXJ5LmJyb3dzZXIKCXVzZXJBZ2VudCA9IG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKSwKCgkvLyBTYXZlIGEgcmVmZXJlbmNlIHRvIHRoZSBjb3JlIHRvU3RyaW5nIG1ldGhvZAoJdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nOwoKLy8gRXhwb3NlIGpRdWVyeSB0byB0aGUgZ2xvYmFsIG9iamVjdAp3aW5kb3cualF1ZXJ5ID0gd2luZG93LiQgPSBqUXVlcnk7CgpqUXVlcnkuZm4gPSBqUXVlcnkucHJvdG90eXBlID0gewoJaW5pdDogZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0ICkgewoJCXZhciBtYXRjaCwgZWxlbSwgcmV0OwoKCQkvLyBIYW5kbGUgJCgiIiksICQobnVsbCksIG9yICQodW5kZWZpbmVkKQoJCWlmICggIXNlbGVjdG9yICkgewoJCQl0aGlzLmxlbmd0aCA9IDA7CgkJCXJldHVybiB0aGlzOwoJCX0KCgkJLy8gSGFuZGxlICQoRE9NRWxlbWVudCkKCQlpZiAoIHNlbGVjdG9yLm5vZGVUeXBlICkgewoJCQl0aGlzWzBdID0gc2VsZWN0b3I7CgkJCXRoaXMubGVuZ3RoID0gMTsKCQkJdGhpcy5jb250ZXh0ID0gc2VsZWN0b3I7CgkJCXJldHVybiB0aGlzOwoJCX0KCgkJLy8gSGFuZGxlIEhUTUwgc3RyaW5ncwoJCWlmICggdHlwZW9mIHNlbGVjdG9yID09PSAic3RyaW5nIiApIHsKCQkJLy8gQXJlIHdlIGRlYWxpbmcgd2l0aCBIVE1MIHN0cmluZyBvciBhbiBJRD8KCQkJbWF0Y2ggPSBxdWlja0V4cHIuZXhlYyggc2VsZWN0b3IgKTsKCgkJCS8vIFZlcmlmeSBhIG1hdGNoLCBhbmQgdGhhdCBubyBjb250ZXh0IHdhcyBzcGVjaWZpZWQgZm9yICNpZAoJCQlpZiAoIG1hdGNoICYmIChtYXRjaFsxXSB8fCAhY29udGV4dCkgKSB7CgoJCQkJLy8gSEFORExFOiAkKGh0bWwpIC0+ICQoYXJyYXkpCgkJCQlpZiAoIG1hdGNoWzFdICkgewoJCQkJCXNlbGVjdG9yID0galF1ZXJ5LmNsZWFuKCBbIG1hdGNoWzFdIF0sIGNvbnRleHQgKTsKCgkJCQkvLyBIQU5ETEU6ICQoIiNpZCIpCgkJCQl9IGVsc2UgewoJCQkJCWVsZW0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggbWF0Y2hbM10gKTsKCgkJCQkJLy8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIElFIGFuZCBPcGVyYSByZXR1cm4gaXRlbXMKCQkJCQkvLyBieSBuYW1lIGluc3RlYWQgb2YgSUQKCQkJCQlpZiAoIGVsZW0gJiYgZWxlbS5pZCAhPT0gbWF0Y2hbM10gKSB7CgkJCQkJCXJldHVybiByb290alF1ZXJ5LmZpbmQoIHNlbGVjdG9yICk7CgkJCQkJfQoKCQkJCQkvLyBPdGhlcndpc2UsIHdlIGluamVjdCB0aGUgZWxlbWVudCBkaXJlY3RseSBpbnRvIHRoZSBqUXVlcnkgb2JqZWN0CgkJCQkJcmV0ID0galF1ZXJ5KCBlbGVtIHx8IG51bGwgKTsKCQkJCQlyZXQuY29udGV4dCA9IGRvY3VtZW50OwoJCQkJCXJldC5zZWxlY3RvciA9IHNlbGVjdG9yOwoJCQkJCXJldHVybiByZXQ7CgkJCQl9CgoJCQkvLyBIQU5ETEU6ICQoZXhwciwgJCguLi4pKQoJCQl9IGVsc2UgaWYgKCAhY29udGV4dCB8fCBjb250ZXh0LmpxdWVyeSApIHsKCQkJCXJldHVybiAoY29udGV4dCB8fCByb290alF1ZXJ5KS5maW5kKCBzZWxlY3RvciApOwoKCQkJLy8gSEFORExFOiAkKGV4cHIsIGNvbnRleHQpCgkJCS8vICh3aGljaCBpcyBqdXN0IGVxdWl2YWxlbnQgdG86ICQoY29udGV4dCkuZmluZChleHByKQoJCQl9IGVsc2UgewoJCQkJcmV0dXJuIGpRdWVyeSggY29udGV4dCApLmZpbmQoIHNlbGVjdG9yICk7CgkJCX0KCgkJLy8gSEFORExFOiAkKGZ1bmN0aW9uKQoJCS8vIFNob3J0Y3V0IGZvciBkb2N1bWVudCByZWFkeQoJCX0gZWxzZSBpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBzZWxlY3RvciApICkgewoJCQlyZXR1cm4gcm9vdGpRdWVyeS5yZWFkeSggc2VsZWN0b3IgKTsKCQl9CgoJCS8vIE1ha2Ugc3VyZSB0aGF0IG9sZCBzZWxlY3RvciBzdGF0ZSBpcyBwYXNzZWQgYWxvbmcKCQlpZiAoIHNlbGVjdG9yLnNlbGVjdG9yICYmIHNlbGVjdG9yLmNvbnRleHQgKSB7CgkJCXRoaXMuc2VsZWN0b3IgPSBzZWxlY3Rvci5zZWxlY3RvcjsKCQkJdGhpcy5jb250ZXh0ID0gc2VsZWN0b3IuY29udGV4dDsKCQl9CgoJCXJldHVybiB0aGlzLnNldEFycmF5KGpRdWVyeS5pc0FycmF5KCBzZWxlY3RvciApID8KCQkJc2VsZWN0b3IgOgoJCQlqUXVlcnkubWFrZUFycmF5KHNlbGVjdG9yKSk7Cgl9LAoKCS8vIFN0YXJ0IHdpdGggYW4gZW1wdHkgc2VsZWN0b3IKCXNlbGVjdG9yOiAiIiwKCgkvLyBUaGUgY3VycmVudCB2ZXJzaW9uIG9mIGpRdWVyeSBiZWluZyB1c2VkCglqcXVlcnk6ICIxLjMuM3ByZSIsCgoJLy8gVGhlIG51bWJlciBvZiBlbGVtZW50cyBjb250YWluZWQgaW4gdGhlIG1hdGNoZWQgZWxlbWVudCBzZXQKCXNpemU6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLmxlbmd0aDsKCX0sCgoJLy8gR2V0IHRoZSBOdGggZWxlbWVudCBpbiB0aGUgbWF0Y2hlZCBlbGVtZW50IHNldCBPUgoJLy8gR2V0IHRoZSB3aG9sZSBtYXRjaGVkIGVsZW1lbnQgc2V0IGFzIGEgY2xlYW4gYXJyYXkKCWdldDogZnVuY3Rpb24oIG51bSApIHsKCQlyZXR1cm4gbnVtID09IG51bGwgPwoKCQkJLy8gUmV0dXJuIGEgJ2NsZWFuJyBhcnJheQoJCQlBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggdGhpcyApIDoKCgkJCS8vIFJldHVybiBqdXN0IHRoZSBvYmplY3QKCQkJdGhpc1sgbnVtIF07Cgl9LAoKCS8vIFRha2UgYW4gYXJyYXkgb2YgZWxlbWVudHMgYW5kIHB1c2ggaXQgb250byB0aGUgc3RhY2sKCS8vIChyZXR1cm5pbmcgdGhlIG5ldyBtYXRjaGVkIGVsZW1lbnQgc2V0KQoJcHVzaFN0YWNrOiBmdW5jdGlvbiggZWxlbXMsIG5hbWUsIHNlbGVjdG9yICkgewoJCS8vIEJ1aWxkIGEgbmV3IGpRdWVyeSBtYXRjaGVkIGVsZW1lbnQgc2V0CgkJdmFyIHJldCA9IGpRdWVyeSggZWxlbXMgfHwgbnVsbCApOwoKCQkvLyBBZGQgdGhlIG9sZCBvYmplY3Qgb250byB0aGUgc3RhY2sgKGFzIGEgcmVmZXJlbmNlKQoJCXJldC5wcmV2T2JqZWN0ID0gdGhpczsKCgkJcmV0LmNvbnRleHQgPSB0aGlzLmNvbnRleHQ7CgoJCWlmICggbmFtZSA9PT0gImZpbmQiICkgewoJCQlyZXQuc2VsZWN0b3IgPSB0aGlzLnNlbGVjdG9yICsgKHRoaXMuc2VsZWN0b3IgPyAiICIgOiAiIikgKyBzZWxlY3RvcjsKCQl9IGVsc2UgaWYgKCBuYW1lICkgewoJCQlyZXQuc2VsZWN0b3IgPSB0aGlzLnNlbGVjdG9yICsgIi4iICsgbmFtZSArICIoIiArIHNlbGVjdG9yICsgIikiOwoJCX0KCgkJLy8gUmV0dXJuIHRoZSBuZXdseS1mb3JtZWQgZWxlbWVudCBzZXQKCQlyZXR1cm4gcmV0OwoJfSwKCgkvLyBGb3JjZSB0aGUgY3VycmVudCBtYXRjaGVkIHNldCBvZiBlbGVtZW50cyB0byBiZWNvbWUKCS8vIHRoZSBzcGVjaWZpZWQgYXJyYXkgb2YgZWxlbWVudHMgKGRlc3Ryb3lpbmcgdGhlIHN0YWNrIGluIHRoZSBwcm9jZXNzKQoJLy8gWW91IHNob3VsZCB1c2UgcHVzaFN0YWNrKCkgaW4gb3JkZXIgdG8gZG8gdGhpcywgYnV0IG1haW50YWluIHRoZSBzdGFjawoJc2V0QXJyYXk6IGZ1bmN0aW9uKCBlbGVtcyApIHsKCQkvLyBSZXNldHRpbmcgdGhlIGxlbmd0aCB0byAwLCB0aGVuIHVzaW5nIHRoZSBuYXRpdmUgQXJyYXkgcHVzaAoJCS8vIGlzIGEgc3VwZXItZmFzdCB3YXkgdG8gcG9wdWxhdGUgYW4gb2JqZWN0IHdpdGggYXJyYXktbGlrZSBwcm9wZXJ0aWVzCgkJdGhpcy5sZW5ndGggPSAwOwoJCUFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KCB0aGlzLCBlbGVtcyApOwoKCQlyZXR1cm4gdGhpczsKCX0sCgoJLy8gRXhlY3V0ZSBhIGNhbGxiYWNrIGZvciBldmVyeSBlbGVtZW50IGluIHRoZSBtYXRjaGVkIHNldC4KCS8vIChZb3UgY2FuIHNlZWQgdGhlIGFyZ3VtZW50cyB3aXRoIGFuIGFycmF5IG9mIGFyZ3MsIGJ1dCB0aGlzIGlzCgkvLyBvbmx5IHVzZWQgaW50ZXJuYWxseS4pCgllYWNoOiBmdW5jdGlvbiggY2FsbGJhY2ssIGFyZ3MgKSB7CgkJcmV0dXJuIGpRdWVyeS5lYWNoKCB0aGlzLCBjYWxsYmFjaywgYXJncyApOwoJfSwKCgkvLyBEZXRlcm1pbmUgdGhlIHBvc2l0aW9uIG9mIGFuIGVsZW1lbnQgd2l0aGluCgkvLyB0aGUgbWF0Y2hlZCBzZXQgb2YgZWxlbWVudHMKCWluZGV4OiBmdW5jdGlvbiggZWxlbSApIHsKCQlpZiAoICFlbGVtIHx8IHR5cGVvZiBlbGVtID09PSAic3RyaW5nIiApIHsKCQkJcmV0dXJuIGpRdWVyeS5pbkFycmF5KCB0aGlzWzBdLAoJCQkJLy8gSWYgaXQgcmVjZWl2ZXMgYSBzdHJpbmcsIHRoZSBzZWxlY3RvciBpcyB1c2VkCgkJCQkvLyBJZiBpdCByZWNlaXZlcyBub3RoaW5nLCB0aGUgc2libGluZ3MgYXJlIHVzZWQKCQkJCWVsZW0gPyBqUXVlcnkoIGVsZW0gKSA6IHRoaXMucGFyZW50KCkuY2hpbGRyZW4oKSApOwoJCX0KCQkvLyBMb2NhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBkZXNpcmVkIGVsZW1lbnQKCQlyZXR1cm4galF1ZXJ5LmluQXJyYXkoCgkJCS8vIElmIGl0IHJlY2VpdmVzIGEgalF1ZXJ5IG9iamVjdCwgdGhlIGZpcnN0IGVsZW1lbnQgaXMgdXNlZAoJCQllbGVtLmpxdWVyeSA/IGVsZW1bMF0gOiBlbGVtLCB0aGlzICk7Cgl9LAoKCWlzOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJcmV0dXJuICEhc2VsZWN0b3IgJiYgalF1ZXJ5Lm11bHRpRmlsdGVyKCBzZWxlY3RvciwgdGhpcyApLmxlbmd0aCA+IDA7Cgl9LAoKCS8vIEZvciBpbnRlcm5hbCB1c2Ugb25seS4KCS8vIEJlaGF2ZXMgbGlrZSBhbiBBcnJheSdzIG1ldGhvZCwgbm90IGxpa2UgYSBqUXVlcnkgbWV0aG9kLgoJcHVzaDogW10ucHVzaCwKCXNvcnQ6IFtdLnNvcnQsCglzcGxpY2U6IFtdLnNwbGljZQp9OwoKLy8gR2l2ZSB0aGUgaW5pdCBmdW5jdGlvbiB0aGUgalF1ZXJ5IHByb3RvdHlwZSBmb3IgbGF0ZXIgaW5zdGFudGlhdGlvbgpqUXVlcnkuZm4uaW5pdC5wcm90b3R5cGUgPSBqUXVlcnkuZm47CgpqUXVlcnkuZXh0ZW5kID0galF1ZXJ5LmZuLmV4dGVuZCA9IGZ1bmN0aW9uKCkgewoJLy8gY29weSByZWZlcmVuY2UgdG8gdGFyZ2V0IG9iamVjdAoJdmFyIHRhcmdldCA9IGFyZ3VtZW50c1swXSB8fCB7fSwgaSA9IDEsIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGgsIGRlZXAgPSBmYWxzZSwgb3B0aW9ucywgbmFtZSwgc3JjLCBjb3B5OwoKCS8vIEhhbmRsZSBhIGRlZXAgY29weSBzaXR1YXRpb24KCWlmICggdHlwZW9mIHRhcmdldCA9PT0gImJvb2xlYW4iICkgewoJCWRlZXAgPSB0YXJnZXQ7CgkJdGFyZ2V0ID0gYXJndW1lbnRzWzFdIHx8IHt9OwoJCS8vIHNraXAgdGhlIGJvb2xlYW4gYW5kIHRoZSB0YXJnZXQKCQlpID0gMjsKCX0KCgkvLyBIYW5kbGUgY2FzZSB3aGVuIHRhcmdldCBpcyBhIHN0cmluZyBvciBzb21ldGhpbmcgKHBvc3NpYmxlIGluIGRlZXAgY29weSkKCWlmICggdHlwZW9mIHRhcmdldCAhPT0gIm9iamVjdCIgJiYgIWpRdWVyeS5pc0Z1bmN0aW9uKHRhcmdldCkgKSB7CgkJdGFyZ2V0ID0ge307Cgl9CgoJLy8gZXh0ZW5kIGpRdWVyeSBpdHNlbGYgaWYgb25seSBvbmUgYXJndW1lbnQgaXMgcGFzc2VkCglpZiAoIGxlbmd0aCA9PT0gaSApIHsKCQl0YXJnZXQgPSB0aGlzOwoJCS0taTsKCX0KCglmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHsKCQkvLyBPbmx5IGRlYWwgd2l0aCBub24tbnVsbC91bmRlZmluZWQgdmFsdWVzCgkJaWYgKCAob3B0aW9ucyA9IGFyZ3VtZW50c1sgaSBdKSAhPSBudWxsICkgewoJCQkvLyBFeHRlbmQgdGhlIGJhc2Ugb2JqZWN0CgkJCWZvciAoIG5hbWUgaW4gb3B0aW9ucyApIHsKCQkJCXNyYyA9IHRhcmdldFsgbmFtZSBdOwoJCQkJY29weSA9IG9wdGlvbnNbIG5hbWUgXTsKCgkJCQkvLyBQcmV2ZW50IG5ldmVyLWVuZGluZyBsb29wCgkJCQlpZiAoIHRhcmdldCA9PT0gY29weSApIHsKCQkJCQljb250aW51ZTsKCQkJCX0KCgkJCQkvLyBSZWN1cnNlIGlmIHdlJ3JlIG1lcmdpbmcgb2JqZWN0IHZhbHVlcwoJCQkJaWYgKCBkZWVwICYmIGNvcHkgJiYgdHlwZW9mIGNvcHkgPT09ICJvYmplY3QiICYmICFjb3B5Lm5vZGVUeXBlICkgewoJCQkJCXRhcmdldFsgbmFtZSBdID0galF1ZXJ5LmV4dGVuZCggZGVlcCwKCQkJCQkJLy8gTmV2ZXIgbW92ZSBvcmlnaW5hbCBvYmplY3RzLCBjbG9uZSB0aGVtCgkJCQkJCXNyYyB8fCAoIGNvcHkubGVuZ3RoICE9IG51bGwgPyBbIF0gOiB7IH0gKSwgY29weSApOwoKCQkJCS8vIERvbid0IGJyaW5nIGluIHVuZGVmaW5lZCB2YWx1ZXMKCQkJCX0gZWxzZSBpZiAoIGNvcHkgIT09IHVuZGVmaW5lZCApIHsKCQkJCQl0YXJnZXRbIG5hbWUgXSA9IGNvcHk7CgkJCQl9CgkJCX0KCQl9Cgl9CgoJLy8gUmV0dXJuIHRoZSBtb2RpZmllZCBvYmplY3QKCXJldHVybiB0YXJnZXQ7Cn07CgpqUXVlcnkuZXh0ZW5kKHsKCW5vQ29uZmxpY3Q6IGZ1bmN0aW9uKCBkZWVwICkgewoJCXdpbmRvdy4kID0gXyQ7CgoJCWlmICggZGVlcCApIHsKCQkJd2luZG93LmpRdWVyeSA9IF9qUXVlcnk7CgkJfQoKCQlyZXR1cm4galF1ZXJ5OwoJfSwKCgkvLyBTZWUgdGVzdC91bml0L2NvcmUuanMgZm9yIGRldGFpbHMgY29uY2VybmluZyBpc0Z1bmN0aW9uLgoJLy8gU2luY2UgdmVyc2lvbiAxLjMsIERPTSBtZXRob2RzIGFuZCBmdW5jdGlvbnMgbGlrZSBhbGVydAoJLy8gYXJlbid0IHN1cHBvcnRlZC4gVGhleSByZXR1cm4gZmFsc2Ugb24gSUUgKCMyOTY4KS4KCWlzRnVuY3Rpb246IGZ1bmN0aW9uKCBvYmogKSB7CgkJcmV0dXJuIHRvU3RyaW5nLmNhbGwob2JqKSA9PT0gIltvYmplY3QgRnVuY3Rpb25dIjsKCX0sCgoJaXNBcnJheTogZnVuY3Rpb24oIG9iaiApIHsKCQlyZXR1cm4gdG9TdHJpbmcuY2FsbChvYmopID09PSAiW29iamVjdCBBcnJheV0iOwoJfSwKCgkvLyBjaGVjayBpZiBhbiBlbGVtZW50IGlzIGluIGEgKG9yIGlzIGFuKSBYTUwgZG9jdW1lbnQKCWlzWE1MRG9jOiBmdW5jdGlvbiggZWxlbSApIHsKCQlyZXR1cm4gZWxlbS5ub2RlVHlwZSA9PT0gOSAmJiBlbGVtLmRvY3VtZW50RWxlbWVudC5ub2RlTmFtZSAhPT0gIkhUTUwiIHx8CgkJCSEhZWxlbS5vd25lckRvY3VtZW50ICYmIGVsZW0ub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQubm9kZU5hbWUgIT09ICJIVE1MIjsKCX0sCgoJLy8gRXZhbHVsYXRlcyBhIHNjcmlwdCBpbiBhIGdsb2JhbCBjb250ZXh0CglnbG9iYWxFdmFsOiBmdW5jdGlvbiggZGF0YSApIHsKCQlpZiAoIGRhdGEgJiYgL1xTLy50ZXN0KGRhdGEpICkgewoJCQkvLyBJbnNwaXJlZCBieSBjb2RlIGJ5IEFuZHJlYSBHaWFtbWFyY2hpCgkJCS8vIGh0dHA6Ly93ZWJyZWZsZWN0aW9uLmJsb2dzcG90LmNvbS8yMDA3LzA4L2dsb2JhbC1zY29wZS1ldmFsdWF0aW9uLWFuZC1kb20uaHRtbAoJCQl2YXIgaGVhZCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF0gfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LAoJCQkJc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7CgoJCQlzY3JpcHQudHlwZSA9ICJ0ZXh0L2phdmFzY3JpcHQiOwoJCQlpZiAoIGpRdWVyeS5zdXBwb3J0LnNjcmlwdEV2YWwgKSB7CgkJCQlzY3JpcHQuYXBwZW5kQ2hpbGQoIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCBkYXRhICkgKTsKCQkJfSBlbHNlIHsKCQkJCXNjcmlwdC50ZXh0ID0gZGF0YTsKCQkJfQoKCQkJLy8gVXNlIGluc2VydEJlZm9yZSBpbnN0ZWFkIG9mIGFwcGVuZENoaWxkICB0byBjaXJjdW12ZW50IGFuIElFNiBidWcuCgkJCS8vIFRoaXMgYXJpc2VzIHdoZW4gYSBiYXNlIG5vZGUgaXMgdXNlZCAoIzI3MDkpLgoJCQloZWFkLmluc2VydEJlZm9yZSggc2NyaXB0LCBoZWFkLmZpcnN0Q2hpbGQgKTsKCQkJaGVhZC5yZW1vdmVDaGlsZCggc2NyaXB0ICk7CgkJfQoJfSwKCglub2RlTmFtZTogZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7CgkJcmV0dXJuIGVsZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBuYW1lLnRvVXBwZXJDYXNlKCk7Cgl9LAoKCS8vIGFyZ3MgaXMgZm9yIGludGVybmFsIHVzYWdlIG9ubHkKCWVhY2g6IGZ1bmN0aW9uKCBvYmplY3QsIGNhbGxiYWNrLCBhcmdzICkgewoJCXZhciBuYW1lLCBpID0gMCwgbGVuZ3RoID0gb2JqZWN0Lmxlbmd0aDsKCgkJaWYgKCBhcmdzICkgewoJCQlpZiAoIGxlbmd0aCA9PT0gdW5kZWZpbmVkICkgewoJCQkJZm9yICggbmFtZSBpbiBvYmplY3QgKSB7CgkJCQkJaWYgKCBjYWxsYmFjay5hcHBseSggb2JqZWN0WyBuYW1lIF0sIGFyZ3MgKSA9PT0gZmFsc2UgKSB7CgkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCX0KCQkJfSBlbHNlIHsKCQkJCWZvciAoIDsgaSA8IGxlbmd0aDsgKSB7CgkJCQkJaWYgKCBjYWxsYmFjay5hcHBseSggb2JqZWN0WyBpKysgXSwgYXJncyApID09PSBmYWxzZSApIHsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJfQoJCQl9CgoJCS8vIEEgc3BlY2lhbCwgZmFzdCwgY2FzZSBmb3IgdGhlIG1vc3QgY29tbW9uIHVzZSBvZiBlYWNoCgkJfSBlbHNlIHsKCQkJaWYgKCBsZW5ndGggPT09IHVuZGVmaW5lZCApIHsKCQkJCWZvciAoIG5hbWUgaW4gb2JqZWN0ICkgewoJCQkJCWlmICggY2FsbGJhY2suY2FsbCggb2JqZWN0WyBuYW1lIF0sIG5hbWUsIG9iamVjdFsgbmFtZSBdICkgPT09IGZhbHNlICkgewoJCQkJCQlicmVhazsKCQkJCQl9CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQlmb3IgKCB2YXIgdmFsdWUgPSBvYmplY3RbMF07CgkJCQkJaSA8IGxlbmd0aCAmJiBjYWxsYmFjay5jYWxsKCB2YWx1ZSwgaSwgdmFsdWUgKSAhPT0gZmFsc2U7IHZhbHVlID0gb2JqZWN0WysraV0gKSB7fQoJCQl9CgkJfQoKCQlyZXR1cm4gb2JqZWN0OwoJfSwKCgl0cmltOiBmdW5jdGlvbiggdGV4dCApIHsKCQlyZXR1cm4gKHRleHQgfHwgIiIpLnJlcGxhY2UoIC9eXHMrfFxzKyQvZywgIiIgKTsKCX0sCgoJbWFrZUFycmF5OiBmdW5jdGlvbiggYXJyYXkgKSB7CgkJdmFyIHJldCA9IFtdLCBpOwoKCQlpZiAoIGFycmF5ICE9IG51bGwgKSB7CgkJCWkgPSBhcnJheS5sZW5ndGg7CgoJCQkvLyBUaGUgd2luZG93LCBzdHJpbmdzIChhbmQgZnVuY3Rpb25zKSBhbHNvIGhhdmUgJ2xlbmd0aCcKCQkJaWYgKCBpID09IG51bGwgfHwgdHlwZW9mIGFycmF5ID09PSAic3RyaW5nIiB8fCBqUXVlcnkuaXNGdW5jdGlvbihhcnJheSkgfHwgYXJyYXkuc2V0SW50ZXJ2YWwgKSB7CgkJCQlyZXRbMF0gPSBhcnJheTsKCQkJfSBlbHNlIHsKCQkJCXdoaWxlICggaSApIHsKCQkJCQlyZXRbLS1pXSA9IGFycmF5W2ldOwoJCQkJfQoJCQl9CgkJfQoKCQlyZXR1cm4gcmV0OwoJfSwKCglpbkFycmF5OiBmdW5jdGlvbiggZWxlbSwgYXJyYXkgKSB7CgkJZm9yICggdmFyIGkgPSAwLCBsZW5ndGggPSBhcnJheS5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKyApIHsKCQkJaWYgKCBhcnJheVsgaSBdID09PSBlbGVtICkgewoJCQkJcmV0dXJuIGk7CgkJCX0KCQl9CgoJCXJldHVybiAtMTsKCX0sCgoJbWVyZ2U6IGZ1bmN0aW9uKCBmaXJzdCwgc2Vjb25kICkgewoJCS8vIFdlIGhhdmUgdG8gbG9vcCB0aGlzIHdheSBiZWNhdXNlIElFICYgT3BlcmEgb3ZlcndyaXRlIHRoZSBsZW5ndGgKCQkvLyBleHBhbmRvIG9mIGdldEVsZW1lbnRzQnlUYWdOYW1lCgkJdmFyIGkgPSAwLCBlbGVtLCBwb3MgPSBmaXJzdC5sZW5ndGg7CgoJCS8vIEFsc28sIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGNvcnJlY3QgZWxlbWVudHMgYXJlIGJlaW5nIHJldHVybmVkCgkJLy8gKElFIHJldHVybnMgY29tbWVudCBub2RlcyBpbiBhICcqJyBxdWVyeSkKCQlpZiAoICFqUXVlcnkuc3VwcG9ydC5nZXRBbGwgKSB7CgkJCXdoaWxlICggKGVsZW0gPSBzZWNvbmRbIGkrKyBdKSAhPSBudWxsICkgewoJCQkJaWYgKCBlbGVtLm5vZGVUeXBlICE9PSA4ICkgewoJCQkJCWZpcnN0WyBwb3MrKyBdID0gZWxlbTsKCQkJCX0KCQkJfQoKCQl9IGVsc2UgewoJCQl3aGlsZSAoIChlbGVtID0gc2Vjb25kWyBpKysgXSkgIT0gbnVsbCApIHsKCQkJCWZpcnN0WyBwb3MrKyBdID0gZWxlbTsKCQkJfQoJCX0KCgkJcmV0dXJuIGZpcnN0OwoJfSwKCgl1bmlxdWU6IGZ1bmN0aW9uKCBhcnJheSApIHsKCQl2YXIgcmV0ID0gW10sIGRvbmUgPSB7fSwgaWQ7CgoJCXRyeSB7CgkJCWZvciAoIHZhciBpID0gMCwgbGVuZ3RoID0gYXJyYXkubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKysgKSB7CgkJCQlpZCA9IGpRdWVyeS5kYXRhKCBhcnJheVsgaSBdICk7CgoJCQkJaWYgKCAhZG9uZVsgaWQgXSApIHsKCQkJCQlkb25lWyBpZCBdID0gdHJ1ZTsKCQkJCQlyZXQucHVzaCggYXJyYXlbIGkgXSApOwoJCQkJfQoJCQl9CgkJfSBjYXRjaCggZSApIHsKCQkJcmV0ID0gYXJyYXk7CgkJfQoKCQlyZXR1cm4gcmV0OwoJfSwKCglncmVwOiBmdW5jdGlvbiggZWxlbXMsIGNhbGxiYWNrLCBpbnYgKSB7CgkJdmFyIHJldCA9IFtdOwoKCQkvLyBHbyB0aHJvdWdoIHRoZSBhcnJheSwgb25seSBzYXZpbmcgdGhlIGl0ZW1zCgkJLy8gdGhhdCBwYXNzIHRoZSB2YWxpZGF0b3IgZnVuY3Rpb24KCQlmb3IgKCB2YXIgaSA9IDAsIGxlbmd0aCA9IGVsZW1zLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrICkgewoJCQlpZiAoICFpbnYgIT09ICFjYWxsYmFjayggZWxlbXNbIGkgXSwgaSApICkgewoJCQkJcmV0LnB1c2goIGVsZW1zWyBpIF0gKTsKCQkJfQoJCX0KCgkJcmV0dXJuIHJldDsKCX0sCgoJbWFwOiBmdW5jdGlvbiggZWxlbXMsIGNhbGxiYWNrICkgewoJCXZhciByZXQgPSBbXSwgdmFsdWU7CgoJCS8vIEdvIHRocm91Z2ggdGhlIGFycmF5LCB0cmFuc2xhdGluZyBlYWNoIG9mIHRoZSBpdGVtcyB0byB0aGVpcgoJCS8vIG5ldyB2YWx1ZSAob3IgdmFsdWVzKS4KCQlmb3IgKCB2YXIgaSA9IDAsIGxlbmd0aCA9IGVsZW1zLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrICkgewoJCQl2YWx1ZSA9IGNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpICk7CgoJCQlpZiAoIHZhbHVlICE9IG51bGwgKSB7CgkJCQlyZXRbIHJldC5sZW5ndGggXSA9IHZhbHVlOwoJCQl9CgkJfQoKCQlyZXR1cm4gcmV0LmNvbmNhdC5hcHBseSggW10sIHJldCApOwoJfSwKCgkvLyBVc2Ugb2YgalF1ZXJ5LmJyb3dzZXIgaXMgZGVwcmVjYXRlZC4KCS8vIEl0J3MgaW5jbHVkZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGFuZCBwbHVnaW5zLAoJLy8gYWx0aG91Z2ggdGhleSBzaG91bGQgd29yayB0byBtaWdyYXRlIGF3YXkuCglicm93c2VyOiB7CgkJdmVyc2lvbjogKHVzZXJBZ2VudC5tYXRjaCggLy4rKD86cnZ8aXR8cmF8aWUpW1wvOiBdKFtcZC5dKykvICkgfHwgWzAsJzAnXSlbMV0sCgkJc2FmYXJpOiAvd2Via2l0Ly50ZXN0KCB1c2VyQWdlbnQgKSwKCQlvcGVyYTogL29wZXJhLy50ZXN0KCB1c2VyQWdlbnQgKSwKCQltc2llOiAvbXNpZS8udGVzdCggdXNlckFnZW50ICkgJiYgIS9vcGVyYS8udGVzdCggdXNlckFnZW50ICksCgkJbW96aWxsYTogL21vemlsbGEvLnRlc3QoIHVzZXJBZ2VudCApICYmICEvKGNvbXBhdGlibGV8d2Via2l0KS8udGVzdCggdXNlckFnZW50ICkKCX0KfSk7CgovLyBBbGwgalF1ZXJ5IG9iamVjdHMgc2hvdWxkIHBvaW50IGJhY2sgdG8gdGhlc2UKcm9vdGpRdWVyeSA9IGpRdWVyeShkb2N1bWVudCk7CgpmdW5jdGlvbiBldmFsU2NyaXB0KCBpLCBlbGVtICkgewoJaWYgKCBlbGVtLnNyYyApIHsKCQlqUXVlcnkuYWpheCh7CgkJCXVybDogZWxlbS5zcmMsCgkJCWFzeW5jOiBmYWxzZSwKCQkJZGF0YVR5cGU6ICJzY3JpcHQiCgkJfSk7Cgl9IGVsc2UgewoJCWpRdWVyeS5nbG9iYWxFdmFsKCBlbGVtLnRleHQgfHwgZWxlbS50ZXh0Q29udGVudCB8fCBlbGVtLmlubmVySFRNTCB8fCAiIiApOwoJfQoKCWlmICggZWxlbS5wYXJlbnROb2RlICkgewoJCWVsZW0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggZWxlbSApOwoJfQp9CgpmdW5jdGlvbiBub3coKSB7CglyZXR1cm4gKG5ldyBEYXRlKS5nZXRUaW1lKCk7Cn0KdmFyIGV4cGFuZG8gPSAialF1ZXJ5IiArIG5vdygpLCB1dWlkID0gMCwgd2luZG93RGF0YSA9IHt9OwoKalF1ZXJ5LmV4dGVuZCh7CgljYWNoZToge30sCgoJZGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGRhdGEgKSB7CgkJZWxlbSA9IGVsZW0gPT0gd2luZG93ID8KCQkJd2luZG93RGF0YSA6CgkJCWVsZW07CgoJCXZhciBpZCA9IGVsZW1bIGV4cGFuZG8gXTsKCgkJLy8gQ29tcHV0ZSBhIHVuaXF1ZSBJRCBmb3IgdGhlIGVsZW1lbnQKCQlpZiAoICFpZCApCgkJCWlkID0gZWxlbVsgZXhwYW5kbyBdID0gKyt1dWlkOwoKCQkvLyBPbmx5IGdlbmVyYXRlIHRoZSBkYXRhIGNhY2hlIGlmIHdlJ3JlCgkJLy8gdHJ5aW5nIHRvIGFjY2VzcyBvciBtYW5pcHVsYXRlIGl0CgkJaWYgKCBuYW1lICYmICFqUXVlcnkuY2FjaGVbIGlkIF0gKQoJCQlqUXVlcnkuY2FjaGVbIGlkIF0gPSB7fTsKCgkJLy8gUHJldmVudCBvdmVycmlkaW5nIHRoZSBuYW1lZCBjYWNoZSB3aXRoIHVuZGVmaW5lZCB2YWx1ZXMKCQlpZiAoIGRhdGEgIT09IHVuZGVmaW5lZCApCgkJCWpRdWVyeS5jYWNoZVsgaWQgXVsgbmFtZSBdID0gZGF0YTsKCgkJLy8gUmV0dXJuIHRoZSBuYW1lZCBjYWNoZSBkYXRhLCBvciB0aGUgSUQgZm9yIHRoZSBlbGVtZW50CgkJcmV0dXJuIG5hbWUgPwoJCQlqUXVlcnkuY2FjaGVbIGlkIF1bIG5hbWUgXSA6CgkJCWlkOwoJfSwKCglyZW1vdmVEYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHsKCQllbGVtID0gZWxlbSA9PSB3aW5kb3cgPwoJCQl3aW5kb3dEYXRhIDoKCQkJZWxlbTsKCgkJdmFyIGlkID0gZWxlbVsgZXhwYW5kbyBdOwoKCQkvLyBJZiB3ZSB3YW50IHRvIHJlbW92ZSBhIHNwZWNpZmljIHNlY3Rpb24gb2YgdGhlIGVsZW1lbnQncyBkYXRhCgkJaWYgKCBuYW1lICkgewoJCQlpZiAoIGpRdWVyeS5jYWNoZVsgaWQgXSApIHsKCQkJCS8vIFJlbW92ZSB0aGUgc2VjdGlvbiBvZiBjYWNoZSBkYXRhCgkJCQlkZWxldGUgalF1ZXJ5LmNhY2hlWyBpZCBdWyBuYW1lIF07CgoJCQkJLy8gSWYgd2UndmUgcmVtb3ZlZCBhbGwgdGhlIGRhdGEsIHJlbW92ZSB0aGUgZWxlbWVudCdzIGNhY2hlCgkJCQluYW1lID0gIiI7CgoJCQkJZm9yICggbmFtZSBpbiBqUXVlcnkuY2FjaGVbIGlkIF0gKQoJCQkJCWJyZWFrOwoKCQkJCWlmICggIW5hbWUgKQoJCQkJCWpRdWVyeS5yZW1vdmVEYXRhKCBlbGVtICk7CgkJCX0KCgkJLy8gT3RoZXJ3aXNlLCB3ZSB3YW50IHRvIHJlbW92ZSBhbGwgb2YgdGhlIGVsZW1lbnQncyBkYXRhCgkJfSBlbHNlIHsKCQkJLy8gQ2xlYW4gdXAgdGhlIGVsZW1lbnQgZXhwYW5kbwoJCQl0cnkgewoJCQkJZGVsZXRlIGVsZW1bIGV4cGFuZG8gXTsKCQkJfSBjYXRjaChlKXsKCQkJCS8vIElFIGhhcyB0cm91YmxlIGRpcmVjdGx5IHJlbW92aW5nIHRoZSBleHBhbmRvCgkJCQkvLyBidXQgaXQncyBvayB3aXRoIHVzaW5nIHJlbW92ZUF0dHJpYnV0ZQoJCQkJaWYgKCBlbGVtLnJlbW92ZUF0dHJpYnV0ZSApCgkJCQkJZWxlbS5yZW1vdmVBdHRyaWJ1dGUoIGV4cGFuZG8gKTsKCQkJfQoKCQkJLy8gQ29tcGxldGVseSByZW1vdmUgdGhlIGRhdGEgY2FjaGUKCQkJZGVsZXRlIGpRdWVyeS5jYWNoZVsgaWQgXTsKCQl9Cgl9LAoJcXVldWU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCBkYXRhICkgewoJCWlmICggZWxlbSApewoKCQkJdHlwZSA9ICh0eXBlIHx8ICJmeCIpICsgInF1ZXVlIjsKCgkJCXZhciBxID0galF1ZXJ5LmRhdGEoIGVsZW0sIHR5cGUgKTsKCgkJCWlmICggIXEgfHwgalF1ZXJ5LmlzQXJyYXkoZGF0YSkgKQoJCQkJcSA9IGpRdWVyeS5kYXRhKCBlbGVtLCB0eXBlLCBqUXVlcnkubWFrZUFycmF5KGRhdGEpICk7CgkJCWVsc2UgaWYoIGRhdGEgKQoJCQkJcS5wdXNoKCBkYXRhICk7CgoJCX0KCQlyZXR1cm4gcTsKCX0sCgoJZGVxdWV1ZTogZnVuY3Rpb24oIGVsZW0sIHR5cGUgKXsKCQl2YXIgcXVldWUgPSBqUXVlcnkucXVldWUoIGVsZW0sIHR5cGUgKSwKCQkJZm4gPSBxdWV1ZS5zaGlmdCgpOwoKCQlpZiggIXR5cGUgfHwgdHlwZSA9PT0gImZ4IiApCgkJCWZuID0gcXVldWVbMF07CgoJCWlmKCBmbiAhPT0gdW5kZWZpbmVkICkKCQkJZm4uY2FsbChlbGVtKTsKCX0KfSk7CgpqUXVlcnkuZm4uZXh0ZW5kKHsKCWRhdGE6IGZ1bmN0aW9uKCBrZXksIHZhbHVlICl7CgkJdmFyIHBhcnRzID0ga2V5LnNwbGl0KCIuIik7CgkJcGFydHNbMV0gPSBwYXJ0c1sxXSA/ICIuIiArIHBhcnRzWzFdIDogIiI7CgoJCWlmICggdmFsdWUgPT09IHVuZGVmaW5lZCApIHsKCQkJdmFyIGRhdGEgPSB0aGlzLnRyaWdnZXJIYW5kbGVyKCJnZXREYXRhIiArIHBhcnRzWzFdICsgIiEiLCBbcGFydHNbMF1dKTsKCgkJCWlmICggZGF0YSA9PT0gdW5kZWZpbmVkICYmIHRoaXMubGVuZ3RoICkKCQkJCWRhdGEgPSBqUXVlcnkuZGF0YSggdGhpc1swXSwga2V5ICk7CgoJCQlyZXR1cm4gZGF0YSA9PT0gdW5kZWZpbmVkICYmIHBhcnRzWzFdID8KCQkJCXRoaXMuZGF0YSggcGFydHNbMF0gKSA6CgkJCQlkYXRhOwoJCX0gZWxzZQoJCQlyZXR1cm4gdGhpcy50cmlnZ2VyKCJzZXREYXRhIiArIHBhcnRzWzFdICsgIiEiLCBbcGFydHNbMF0sIHZhbHVlXSkuZWFjaChmdW5jdGlvbigpewoJCQkJalF1ZXJ5LmRhdGEoIHRoaXMsIGtleSwgdmFsdWUgKTsKCQkJfSk7Cgl9LAoKCXJlbW92ZURhdGE6IGZ1bmN0aW9uKCBrZXkgKXsKCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7CgkJCWpRdWVyeS5yZW1vdmVEYXRhKCB0aGlzLCBrZXkgKTsKCQl9KTsKCX0sCglxdWV1ZTogZnVuY3Rpb24odHlwZSwgZGF0YSl7CgkJaWYgKCB0eXBlb2YgdHlwZSAhPT0gInN0cmluZyIgKSB7CgkJCWRhdGEgPSB0eXBlOwoJCQl0eXBlID0gImZ4IjsKCQl9CgoJCWlmICggZGF0YSA9PT0gdW5kZWZpbmVkICkKCQkJcmV0dXJuIGpRdWVyeS5xdWV1ZSggdGhpc1swXSwgdHlwZSApOwoKCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7CgkJCXZhciBxdWV1ZSA9IGpRdWVyeS5xdWV1ZSggdGhpcywgdHlwZSwgZGF0YSApOwoKCQkJIGlmKCB0eXBlID09ICJmeCIgJiYgcXVldWUubGVuZ3RoID09IDEgKQoJCQkJcXVldWVbMF0uY2FsbCh0aGlzKTsKCQl9KTsKCX0sCglkZXF1ZXVlOiBmdW5jdGlvbih0eXBlKXsKCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7CgkJCWpRdWVyeS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7CgkJfSk7Cgl9Cn0pOy8qIQogKiBTaXp6bGUgQ1NTIFNlbGVjdG9yIEVuZ2luZSAtIHYxLjAKICogIENvcHlyaWdodCAyMDA5LCBUaGUgRG9qbyBGb3VuZGF0aW9uCiAqICBSZWxlYXNlZCB1bmRlciB0aGUgTUlULCBCU0QsIGFuZCBHUEwgTGljZW5zZXMuCiAqICBNb3JlIGluZm9ybWF0aW9uOiBodHRwOi8vc2l6emxlanMuY29tLwogKi8KKGZ1bmN0aW9uKCl7Cgp2YXIgY2h1bmtlciA9IC8oKD86XCgoPzpcKFteKCldK1wpfFteKCldKykrXCl8XFsoPzpcW1teW1xdXSpcXXxbJyJdW14nIl0qWyciXXxbXltcXSciXSspK1xdfFxcLnxbXiA+K34sKFxbXFxdKykrfFs+K35dKShccyosXHMqKT8vZywKCWRvbmUgPSAwLAoJdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLAoJaGFzRHVwbGljYXRlID0gZmFsc2U7Cgp2YXIgU2l6emxlID0gZnVuY3Rpb24oc2VsZWN0b3IsIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQpIHsKCXJlc3VsdHMgPSByZXN1bHRzIHx8IFtdOwoJdmFyIG9yaWdDb250ZXh0ID0gY29udGV4dCA9IGNvbnRleHQgfHwgZG9jdW1lbnQ7CgoJaWYgKCBjb250ZXh0Lm5vZGVUeXBlICE9PSAxICYmIGNvbnRleHQubm9kZVR5cGUgIT09IDkgKSB7CgkJcmV0dXJuIFtdOwoJfQoJCglpZiAoICFzZWxlY3RvciB8fCB0eXBlb2Ygc2VsZWN0b3IgIT09ICJzdHJpbmciICkgewoJCXJldHVybiByZXN1bHRzOwoJfQoKCXZhciBwYXJ0cyA9IFtdLCBtLCBzZXQsIGNoZWNrU2V0LCBjaGVjaywgbW9kZSwgZXh0cmEsIHBydW5lID0gdHJ1ZSwgY29udGV4dFhNTCA9IGlzWE1MKGNvbnRleHQpOwoJCgkvLyBSZXNldCB0aGUgcG9zaXRpb24gb2YgdGhlIGNodW5rZXIgcmVnZXhwIChzdGFydCBmcm9tIGhlYWQpCgljaHVua2VyLmxhc3RJbmRleCA9IDA7CgkKCXdoaWxlICggKG0gPSBjaHVua2VyLmV4ZWMoc2VsZWN0b3IpKSAhPT0gbnVsbCApIHsKCQlwYXJ0cy5wdXNoKCBtWzFdICk7CgkJCgkJaWYgKCBtWzJdICkgewoJCQlleHRyYSA9IFJlZ0V4cC5yaWdodENvbnRleHQ7CgkJCWJyZWFrOwoJCX0KCX0KCglpZiAoIHBhcnRzLmxlbmd0aCA+IDEgJiYgb3JpZ1BPUy5leGVjKCBzZWxlY3RvciApICkgewoJCWlmICggcGFydHMubGVuZ3RoID09PSAyICYmIEV4cHIucmVsYXRpdmVbIHBhcnRzWzBdIF0gKSB7CgkJCXNldCA9IHBvc1Byb2Nlc3MoIHBhcnRzWzBdICsgcGFydHNbMV0sIGNvbnRleHQgKTsKCQl9IGVsc2UgewoJCQlzZXQgPSBFeHByLnJlbGF0aXZlWyBwYXJ0c1swXSBdID8KCQkJCVsgY29udGV4dCBdIDoKCQkJCVNpenpsZSggcGFydHMuc2hpZnQoKSwgY29udGV4dCApOwoKCQkJd2hpbGUgKCBwYXJ0cy5sZW5ndGggKSB7CgkJCQlzZWxlY3RvciA9IHBhcnRzLnNoaWZ0KCk7CgoJCQkJaWYgKCBFeHByLnJlbGF0aXZlWyBzZWxlY3RvciBdICkKCQkJCQlzZWxlY3RvciArPSBwYXJ0cy5zaGlmdCgpOwoKCQkJCXNldCA9IHBvc1Byb2Nlc3MoIHNlbGVjdG9yLCBzZXQgKTsKCQkJfQoJCX0KCX0gZWxzZSB7CgkJLy8gVGFrZSBhIHNob3J0Y3V0IGFuZCBzZXQgdGhlIGNvbnRleHQgaWYgdGhlIHJvb3Qgc2VsZWN0b3IgaXMgYW4gSUQKCQkvLyAoYnV0IG5vdCBpZiBpdCdsbCBiZSBmYXN0ZXIgaWYgdGhlIGlubmVyIHNlbGVjdG9yIGlzIGFuIElEKQoJCWlmICggIXNlZWQgJiYgcGFydHMubGVuZ3RoID4gMSAmJiBjb250ZXh0Lm5vZGVUeXBlID09PSA5ICYmICFjb250ZXh0WE1MICYmCgkJCQlFeHByLm1hdGNoLklELnRlc3QocGFydHNbMF0pICYmICFFeHByLm1hdGNoLklELnRlc3QocGFydHNbcGFydHMubGVuZ3RoIC0gMV0pICkgewoJCQl2YXIgcmV0ID0gU2l6emxlLmZpbmQoIHBhcnRzLnNoaWZ0KCksIGNvbnRleHQsIGNvbnRleHRYTUwgKTsKCQkJY29udGV4dCA9IHJldC5leHByID8gU2l6emxlLmZpbHRlciggcmV0LmV4cHIsIHJldC5zZXQgKVswXSA6IHJldC5zZXRbMF07CgkJfQoKCQlpZiAoIGNvbnRleHQgKSB7CgkJCXZhciByZXQgPSBzZWVkID8KCQkJCXsgZXhwcjogcGFydHMucG9wKCksIHNldDogbWFrZUFycmF5KHNlZWQpIH0gOgoJCQkJU2l6emxlLmZpbmQoIHBhcnRzLnBvcCgpLCBwYXJ0cy5sZW5ndGggPT09IDEgJiYgKHBhcnRzWzBdID09PSAifiIgfHwgcGFydHNbMF0gPT09ICIrIikgJiYgY29udGV4dC5wYXJlbnROb2RlID8gY29udGV4dC5wYXJlbnROb2RlIDogY29udGV4dCwgY29udGV4dFhNTCApOwoJCQlzZXQgPSByZXQuZXhwciA/IFNpenpsZS5maWx0ZXIoIHJldC5leHByLCByZXQuc2V0ICkgOiByZXQuc2V0OwoKCQkJaWYgKCBwYXJ0cy5sZW5ndGggPiAwICkgewoJCQkJY2hlY2tTZXQgPSBtYWtlQXJyYXkoc2V0KTsKCQkJfSBlbHNlIHsKCQkJCXBydW5lID0gZmFsc2U7CgkJCX0KCgkJCXdoaWxlICggcGFydHMubGVuZ3RoICkgewoJCQkJdmFyIGN1ciA9IHBhcnRzLnBvcCgpLCBwb3AgPSBjdXI7CgoJCQkJaWYgKCAhRXhwci5yZWxhdGl2ZVsgY3VyIF0gKSB7CgkJCQkJY3VyID0gIiI7CgkJCQl9IGVsc2UgewoJCQkJCXBvcCA9IHBhcnRzLnBvcCgpOwoJCQkJfQoKCQkJCWlmICggcG9wID09IG51bGwgKSB7CgkJCQkJcG9wID0gY29udGV4dDsKCQkJCX0KCgkJCQlFeHByLnJlbGF0aXZlWyBjdXIgXSggY2hlY2tTZXQsIHBvcCwgY29udGV4dFhNTCApOwoJCQl9CgkJfSBlbHNlIHsKCQkJY2hlY2tTZXQgPSBwYXJ0cyA9IFtdOwoJCX0KCX0KCglpZiAoICFjaGVja1NldCApIHsKCQljaGVja1NldCA9IHNldDsKCX0KCglpZiAoICFjaGVja1NldCApIHsKCQl0aHJvdyAiU3ludGF4IGVycm9yLCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbjogIiArIChjdXIgfHwgc2VsZWN0b3IpOwoJfQoKCWlmICggdG9TdHJpbmcuY2FsbChjaGVja1NldCkgPT09ICJbb2JqZWN0IEFycmF5XSIgKSB7CgkJaWYgKCAhcHJ1bmUgKSB7CgkJCXJlc3VsdHMucHVzaC5hcHBseSggcmVzdWx0cywgY2hlY2tTZXQgKTsKCQl9IGVsc2UgaWYgKCBjb250ZXh0ICYmIGNvbnRleHQubm9kZVR5cGUgPT09IDEgKSB7CgkJCWZvciAoIHZhciBpID0gMDsgY2hlY2tTZXRbaV0gIT0gbnVsbDsgaSsrICkgewoJCQkJaWYgKCBjaGVja1NldFtpXSAmJiAoY2hlY2tTZXRbaV0gPT09IHRydWUgfHwgY2hlY2tTZXRbaV0ubm9kZVR5cGUgPT09IDEgJiYgY29udGFpbnMoY29udGV4dCwgY2hlY2tTZXRbaV0pKSApIHsKCQkJCQlyZXN1bHRzLnB1c2goIHNldFtpXSApOwoJCQkJfQoJCQl9CgkJfSBlbHNlIHsKCQkJZm9yICggdmFyIGkgPSAwOyBjaGVja1NldFtpXSAhPSBudWxsOyBpKysgKSB7CgkJCQlpZiAoIGNoZWNrU2V0W2ldICYmIGNoZWNrU2V0W2ldLm5vZGVUeXBlID09PSAxICkgewoJCQkJCXJlc3VsdHMucHVzaCggc2V0W2ldICk7CgkJCQl9CgkJCX0KCQl9Cgl9IGVsc2UgewoJCW1ha2VBcnJheSggY2hlY2tTZXQsIHJlc3VsdHMgKTsKCX0KCglpZiAoIGV4dHJhICkgewoJCVNpenpsZSggZXh0cmEsIG9yaWdDb250ZXh0LCByZXN1bHRzLCBzZWVkICk7CgkJU2l6emxlLnVuaXF1ZVNvcnQoIHJlc3VsdHMgKTsKCX0KCglyZXR1cm4gcmVzdWx0czsKfTsKClNpenpsZS51bmlxdWVTb3J0ID0gZnVuY3Rpb24ocmVzdWx0cyl7CglpZiAoIHNvcnRPcmRlciApIHsKCQloYXNEdXBsaWNhdGUgPSBmYWxzZTsKCQlyZXN1bHRzLnNvcnQoc29ydE9yZGVyKTsKCgkJaWYgKCBoYXNEdXBsaWNhdGUgKSB7CgkJCWZvciAoIHZhciBpID0gMTsgaSA8IHJlc3VsdHMubGVuZ3RoOyBpKysgKSB7CgkJCQlpZiAoIHJlc3VsdHNbaV0gPT09IHJlc3VsdHNbaS0xXSApIHsKCQkJCQlyZXN1bHRzLnNwbGljZShpLS0sIDEpOwoJCQkJfQoJCQl9CgkJfQoJfQp9OwoKU2l6emxlLm1hdGNoZXMgPSBmdW5jdGlvbihleHByLCBzZXQpewoJcmV0dXJuIFNpenpsZShleHByLCBudWxsLCBudWxsLCBzZXQpOwp9OwoKU2l6emxlLmZpbmQgPSBmdW5jdGlvbihleHByLCBjb250ZXh0LCBpc1hNTCl7Cgl2YXIgc2V0LCBtYXRjaDsKCglpZiAoICFleHByICkgewoJCXJldHVybiBbXTsKCX0KCglmb3IgKCB2YXIgaSA9IDAsIGwgPSBFeHByLm9yZGVyLmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKCQl2YXIgdHlwZSA9IEV4cHIub3JkZXJbaV0sIG1hdGNoOwoJCQoJCWlmICggKG1hdGNoID0gRXhwci5tYXRjaFsgdHlwZSBdLmV4ZWMoIGV4cHIgKSkgKSB7CgkJCXZhciBsZWZ0ID0gUmVnRXhwLmxlZnRDb250ZXh0OwoKCQkJaWYgKCBsZWZ0LnN1YnN0ciggbGVmdC5sZW5ndGggLSAxICkgIT09ICJcXCIgKSB7CgkJCQltYXRjaFsxXSA9IChtYXRjaFsxXSB8fCAiIikucmVwbGFjZSgvXFwvZywgIiIpOwoJCQkJc2V0ID0gRXhwci5maW5kWyB0eXBlIF0oIG1hdGNoLCBjb250ZXh0LCBpc1hNTCApOwoJCQkJaWYgKCBzZXQgIT0gbnVsbCApIHsKCQkJCQlleHByID0gZXhwci5yZXBsYWNlKCBFeHByLm1hdGNoWyB0eXBlIF0sICIiICk7CgkJCQkJYnJlYWs7CgkJCQl9CgkJCX0KCQl9Cgl9CgoJaWYgKCAhc2V0ICkgewoJCXNldCA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKTsKCX0KCglyZXR1cm4ge3NldDogc2V0LCBleHByOiBleHByfTsKfTsKClNpenpsZS5maWx0ZXIgPSBmdW5jdGlvbihleHByLCBzZXQsIGlucGxhY2UsIG5vdCl7Cgl2YXIgb2xkID0gZXhwciwgcmVzdWx0ID0gW10sIGN1ckxvb3AgPSBzZXQsIG1hdGNoLCBhbnlGb3VuZCwKCQlpc1hNTEZpbHRlciA9IHNldCAmJiBzZXRbMF0gJiYgaXNYTUwoc2V0WzBdKTsKCgl3aGlsZSAoIGV4cHIgJiYgc2V0Lmxlbmd0aCApIHsKCQlmb3IgKCB2YXIgdHlwZSBpbiBFeHByLmZpbHRlciApIHsKCQkJaWYgKCAobWF0Y2ggPSBFeHByLm1hdGNoWyB0eXBlIF0uZXhlYyggZXhwciApKSAhPSBudWxsICkgewoJCQkJdmFyIGZpbHRlciA9IEV4cHIuZmlsdGVyWyB0eXBlIF0sIGZvdW5kLCBpdGVtOwoJCQkJYW55Rm91bmQgPSBmYWxzZTsKCgkJCQlpZiAoIGN1ckxvb3AgPT0gcmVzdWx0ICkgewoJCQkJCXJlc3VsdCA9IFtdOwoJCQkJfQoKCQkJCWlmICggRXhwci5wcmVGaWx0ZXJbIHR5cGUgXSApIHsKCQkJCQltYXRjaCA9IEV4cHIucHJlRmlsdGVyWyB0eXBlIF0oIG1hdGNoLCBjdXJMb29wLCBpbnBsYWNlLCByZXN1bHQsIG5vdCwgaXNYTUxGaWx0ZXIgKTsKCgkJCQkJaWYgKCAhbWF0Y2ggKSB7CgkJCQkJCWFueUZvdW5kID0gZm91bmQgPSB0cnVlOwoJCQkJCX0gZWxzZSBpZiAoIG1hdGNoID09PSB0cnVlICkgewoJCQkJCQljb250aW51ZTsKCQkJCQl9CgkJCQl9CgoJCQkJaWYgKCBtYXRjaCApIHsKCQkJCQlmb3IgKCB2YXIgaSA9IDA7IChpdGVtID0gY3VyTG9vcFtpXSkgIT0gbnVsbDsgaSsrICkgewoJCQkJCQlpZiAoIGl0ZW0gKSB7CgkJCQkJCQlmb3VuZCA9IGZpbHRlciggaXRlbSwgbWF0Y2gsIGksIGN1ckxvb3AgKTsKCQkJCQkJCXZhciBwYXNzID0gbm90IF4gISFmb3VuZDsKCgkJCQkJCQlpZiAoIGlucGxhY2UgJiYgZm91bmQgIT0gbnVsbCApIHsKCQkJCQkJCQlpZiAoIHBhc3MgKSB7CgkJCQkJCQkJCWFueUZvdW5kID0gdHJ1ZTsKCQkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCQljdXJMb29wW2ldID0gZmFsc2U7CgkJCQkJCQkJfQoJCQkJCQkJfSBlbHNlIGlmICggcGFzcyApIHsKCQkJCQkJCQlyZXN1bHQucHVzaCggaXRlbSApOwoJCQkJCQkJCWFueUZvdW5kID0gdHJ1ZTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0KCQkJCX0KCgkJCQlpZiAoIGZvdW5kICE9PSB1bmRlZmluZWQgKSB7CgkJCQkJaWYgKCAhaW5wbGFjZSApIHsKCQkJCQkJY3VyTG9vcCA9IHJlc3VsdDsKCQkJCQl9CgoJCQkJCWV4cHIgPSBleHByLnJlcGxhY2UoIEV4cHIubWF0Y2hbIHR5cGUgXSwgIiIgKTsKCgkJCQkJaWYgKCAhYW55Rm91bmQgKSB7CgkJCQkJCXJldHVybiBbXTsKCQkJCQl9CgoJCQkJCWJyZWFrOwoJCQkJfQoJCQl9CgkJfQoKCQkvLyBJbXByb3BlciBleHByZXNzaW9uCgkJaWYgKCBleHByID09IG9sZCApIHsKCQkJaWYgKCBhbnlGb3VuZCA9PSBudWxsICkgewoJCQkJdGhyb3cgIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIgKyBleHByOwoJCQl9IGVsc2UgewoJCQkJYnJlYWs7CgkJCX0KCQl9CgoJCW9sZCA9IGV4cHI7Cgl9CgoJcmV0dXJuIGN1ckxvb3A7Cn07Cgp2YXIgRXhwciA9IFNpenpsZS5zZWxlY3RvcnMgPSB7CglvcmRlcjogWyAiSUQiLCAiTkFNRSIsICJUQUciIF0sCgltYXRjaDogewoJCUlEOiAvIygoPzpbXHdcdTAwYzAtXHVGRkZGXy1dfFxcLikrKS8sCgkJQ0xBU1M6IC9cLigoPzpbXHdcdTAwYzAtXHVGRkZGXy1dfFxcLikrKS8sCgkJTkFNRTogL1xbbmFtZT1bJyJdKigoPzpbXHdcdTAwYzAtXHVGRkZGXy1dfFxcLikrKVsnIl0qXF0vLAoJCUFUVFI6IC9cW1xzKigoPzpbXHdcdTAwYzAtXHVGRkZGXy1dfFxcLikrKVxzKig/OihcUz89KVxzKihbJyJdKikoLio/KVwzfClccypcXS8sCgkJVEFHOiAvXigoPzpbXHdcdTAwYzAtXHVGRkZGXCpfLV18XFwuKSspLywKCQlDSElMRDogLzoob25seXxudGh8bGFzdHxmaXJzdCktY2hpbGQoPzpcKChldmVufG9kZHxbXGRuKy1dKilcKSk/LywKCQlQT1M6IC86KG50aHxlcXxndHxsdHxmaXJzdHxsYXN0fGV2ZW58b2RkKSg/OlwoKFxkKilcKSk/KD89W14tXXwkKS8sCgkJUFNFVURPOiAvOigoPzpbXHdcdTAwYzAtXHVGRkZGXy1dfFxcLikrKSg/OlwoKFsnIl0qKSgoPzpcKFteXCldK1wpfFteXDJcKFwpXSopKylcMlwpKT8vCgl9LAoJYXR0ck1hcDogewoJCSJjbGFzcyI6ICJjbGFzc05hbWUiLAoJCSJmb3IiOiAiaHRtbEZvciIKCX0sCglhdHRySGFuZGxlOiB7CgkJaHJlZjogZnVuY3Rpb24oZWxlbSl7CgkJCXJldHVybiBlbGVtLmdldEF0dHJpYnV0ZSgiaHJlZiIpOwoJCX0KCX0sCglyZWxhdGl2ZTogewoJCSIrIjogZnVuY3Rpb24oY2hlY2tTZXQsIHBhcnQsIGlzWE1MKXsKCQkJdmFyIGlzUGFydFN0ciA9IHR5cGVvZiBwYXJ0ID09PSAic3RyaW5nIiwKCQkJCWlzVGFnID0gaXNQYXJ0U3RyICYmICEvXFcvLnRlc3QocGFydCksCgkJCQlpc1BhcnRTdHJOb3RUYWcgPSBpc1BhcnRTdHIgJiYgIWlzVGFnOwoKCQkJaWYgKCBpc1RhZyAmJiAhaXNYTUwgKSB7CgkJCQlwYXJ0ID0gcGFydC50b1VwcGVyQ2FzZSgpOwoJCQl9CgoJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBjaGVja1NldC5sZW5ndGgsIGVsZW07IGkgPCBsOyBpKysgKSB7CgkJCQlpZiAoIChlbGVtID0gY2hlY2tTZXRbaV0pICkgewoJCQkJCXdoaWxlICggKGVsZW0gPSBlbGVtLnByZXZpb3VzU2libGluZykgJiYgZWxlbS5ub2RlVHlwZSAhPT0gMSApIHt9CgoJCQkJCWNoZWNrU2V0W2ldID0gaXNQYXJ0U3RyTm90VGFnIHx8IGVsZW0gJiYgZWxlbS5ub2RlTmFtZSA9PT0gcGFydCA/CgkJCQkJCWVsZW0gfHwgZmFsc2UgOgoJCQkJCQllbGVtID09PSBwYXJ0OwoJCQkJfQoJCQl9CgoJCQlpZiAoIGlzUGFydFN0ck5vdFRhZyApIHsKCQkJCVNpenpsZS5maWx0ZXIoIHBhcnQsIGNoZWNrU2V0LCB0cnVlICk7CgkJCX0KCQl9LAoJCSI+IjogZnVuY3Rpb24oY2hlY2tTZXQsIHBhcnQsIGlzWE1MKXsKCQkJdmFyIGlzUGFydFN0ciA9IHR5cGVvZiBwYXJ0ID09PSAic3RyaW5nIjsKCgkJCWlmICggaXNQYXJ0U3RyICYmICEvXFcvLnRlc3QocGFydCkgKSB7CgkJCQlwYXJ0ID0gaXNYTUwgPyBwYXJ0IDogcGFydC50b1VwcGVyQ2FzZSgpOwoKCQkJCWZvciAoIHZhciBpID0gMCwgbCA9IGNoZWNrU2V0Lmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKCQkJCQl2YXIgZWxlbSA9IGNoZWNrU2V0W2ldOwoJCQkJCWlmICggZWxlbSApIHsKCQkJCQkJdmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTsKCQkJCQkJY2hlY2tTZXRbaV0gPSBwYXJlbnQubm9kZU5hbWUgPT09IHBhcnQgPyBwYXJlbnQgOiBmYWxzZTsKCQkJCQl9CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBjaGVja1NldC5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CgkJCQkJdmFyIGVsZW0gPSBjaGVja1NldFtpXTsKCQkJCQlpZiAoIGVsZW0gKSB7CgkJCQkJCWNoZWNrU2V0W2ldID0gaXNQYXJ0U3RyID8KCQkJCQkJCWVsZW0ucGFyZW50Tm9kZSA6CgkJCQkJCQllbGVtLnBhcmVudE5vZGUgPT09IHBhcnQ7CgkJCQkJfQoJCQkJfQoKCQkJCWlmICggaXNQYXJ0U3RyICkgewoJCQkJCVNpenpsZS5maWx0ZXIoIHBhcnQsIGNoZWNrU2V0LCB0cnVlICk7CgkJCQl9CgkJCX0KCQl9LAoJCSIiOiBmdW5jdGlvbihjaGVja1NldCwgcGFydCwgaXNYTUwpewoJCQl2YXIgZG9uZU5hbWUgPSBkb25lKyssIGNoZWNrRm4gPSBkaXJDaGVjazsKCgkJCWlmICggIXBhcnQubWF0Y2goL1xXLykgKSB7CgkJCQl2YXIgbm9kZUNoZWNrID0gcGFydCA9IGlzWE1MID8gcGFydCA6IHBhcnQudG9VcHBlckNhc2UoKTsKCQkJCWNoZWNrRm4gPSBkaXJOb2RlQ2hlY2s7CgkJCX0KCgkJCWNoZWNrRm4oInBhcmVudE5vZGUiLCBwYXJ0LCBkb25lTmFtZSwgY2hlY2tTZXQsIG5vZGVDaGVjaywgaXNYTUwpOwoJCX0sCgkJIn4iOiBmdW5jdGlvbihjaGVja1NldCwgcGFydCwgaXNYTUwpewoJCQl2YXIgZG9uZU5hbWUgPSBkb25lKyssIGNoZWNrRm4gPSBkaXJDaGVjazsKCgkJCWlmICggdHlwZW9mIHBhcnQgPT09ICJzdHJpbmciICYmICFwYXJ0Lm1hdGNoKC9cVy8pICkgewoJCQkJdmFyIG5vZGVDaGVjayA9IHBhcnQgPSBpc1hNTCA/IHBhcnQgOiBwYXJ0LnRvVXBwZXJDYXNlKCk7CgkJCQljaGVja0ZuID0gZGlyTm9kZUNoZWNrOwoJCQl9CgoJCQljaGVja0ZuKCJwcmV2aW91c1NpYmxpbmciLCBwYXJ0LCBkb25lTmFtZSwgY2hlY2tTZXQsIG5vZGVDaGVjaywgaXNYTUwpOwoJCX0KCX0sCglmaW5kOiB7CgkJSUQ6IGZ1bmN0aW9uKG1hdGNoLCBjb250ZXh0LCBpc1hNTCl7CgkJCWlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQgIT09ICJ1bmRlZmluZWQiICYmICFpc1hNTCApIHsKCQkJCXZhciBtID0gY29udGV4dC5nZXRFbGVtZW50QnlJZChtYXRjaFsxXSk7CgkJCQlyZXR1cm4gbSA/IFttXSA6IFtdOwoJCQl9CgkJfSwKCQlOQU1FOiBmdW5jdGlvbihtYXRjaCwgY29udGV4dCwgaXNYTUwpewoJCQlpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRzQnlOYW1lICE9PSAidW5kZWZpbmVkIiApIHsKCQkJCXZhciByZXQgPSBbXSwgcmVzdWx0cyA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeU5hbWUobWF0Y2hbMV0pOwoKCQkJCWZvciAoIHZhciBpID0gMCwgbCA9IHJlc3VsdHMubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCQkJCWlmICggcmVzdWx0c1tpXS5nZXRBdHRyaWJ1dGUoIm5hbWUiKSA9PT0gbWF0Y2hbMV0gKSB7CgkJCQkJCXJldC5wdXNoKCByZXN1bHRzW2ldICk7CgkJCQkJfQoJCQkJfQoKCQkJCXJldHVybiByZXQubGVuZ3RoID09PSAwID8gbnVsbCA6IHJldDsKCQkJfQoJCX0sCgkJVEFHOiBmdW5jdGlvbihtYXRjaCwgY29udGV4dCl7CgkJCXJldHVybiBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKG1hdGNoWzFdKTsKCQl9Cgl9LAoJcHJlRmlsdGVyOiB7CgkJQ0xBU1M6IGZ1bmN0aW9uKG1hdGNoLCBjdXJMb29wLCBpbnBsYWNlLCByZXN1bHQsIG5vdCwgaXNYTUwpewoJCQltYXRjaCA9ICIgIiArIG1hdGNoWzFdLnJlcGxhY2UoL1xcL2csICIiKSArICIgIjsKCgkJCWlmICggaXNYTUwgKSB7CgkJCQlyZXR1cm4gbWF0Y2g7CgkJCX0KCgkJCWZvciAoIHZhciBpID0gMCwgZWxlbTsgKGVsZW0gPSBjdXJMb29wW2ldKSAhPSBudWxsOyBpKysgKSB7CgkJCQlpZiAoIGVsZW0gKSB7CgkJCQkJaWYgKCBub3QgXiAoZWxlbS5jbGFzc05hbWUgJiYgKCIgIiArIGVsZW0uY2xhc3NOYW1lICsgIiAiKS5pbmRleE9mKG1hdGNoKSA+PSAwKSApIHsKCQkJCQkJaWYgKCAhaW5wbGFjZSApCgkJCQkJCQlyZXN1bHQucHVzaCggZWxlbSApOwoJCQkJCX0gZWxzZSBpZiAoIGlucGxhY2UgKSB7CgkJCQkJCWN1ckxvb3BbaV0gPSBmYWxzZTsKCQkJCQl9CgkJCQl9CgkJCX0KCgkJCXJldHVybiBmYWxzZTsKCQl9LAoJCUlEOiBmdW5jdGlvbihtYXRjaCl7CgkJCXJldHVybiBtYXRjaFsxXS5yZXBsYWNlKC9cXC9nLCAiIik7CgkJfSwKCQlUQUc6IGZ1bmN0aW9uKG1hdGNoLCBjdXJMb29wKXsKCQkJZm9yICggdmFyIGkgPSAwOyBjdXJMb29wW2ldID09PSBmYWxzZTsgaSsrICl7fQoJCQlyZXR1cm4gY3VyTG9vcFtpXSAmJiBpc1hNTChjdXJMb29wW2ldKSA/IG1hdGNoWzFdIDogbWF0Y2hbMV0udG9VcHBlckNhc2UoKTsKCQl9LAoJCUNISUxEOiBmdW5jdGlvbihtYXRjaCl7CgkJCWlmICggbWF0Y2hbMV0gPT0gIm50aCIgKSB7CgkJCQkvLyBwYXJzZSBlcXVhdGlvbnMgbGlrZSAnZXZlbicsICdvZGQnLCAnNScsICcybicsICczbisyJywgJzRuLTEnLCAnLW4rNicKCQkJCXZhciB0ZXN0ID0gLygtPykoXGQqKW4oKD86XCt8LSk/XGQqKS8uZXhlYygKCQkJCQltYXRjaFsyXSA9PSAiZXZlbiIgJiYgIjJuIiB8fCBtYXRjaFsyXSA9PSAib2RkIiAmJiAiMm4rMSIgfHwKCQkJCQkhL1xELy50ZXN0KCBtYXRjaFsyXSApICYmICIwbisiICsgbWF0Y2hbMl0gfHwgbWF0Y2hbMl0pOwoKCQkJCS8vIGNhbGN1bGF0ZSB0aGUgbnVtYmVycyAoZmlyc3QpbisobGFzdCkgaW5jbHVkaW5nIGlmIHRoZXkgYXJlIG5lZ2F0aXZlCgkJCQltYXRjaFsyXSA9ICh0ZXN0WzFdICsgKHRlc3RbMl0gfHwgMSkpIC0gMDsKCQkJCW1hdGNoWzNdID0gdGVzdFszXSAtIDA7CgkJCX0KCgkJCS8vIFRPRE86IE1vdmUgdG8gbm9ybWFsIGNhY2hpbmcgc3lzdGVtCgkJCW1hdGNoWzBdID0gZG9uZSsrOwoKCQkJcmV0dXJuIG1hdGNoOwoJCX0sCgkJQVRUUjogZnVuY3Rpb24obWF0Y2gsIGN1ckxvb3AsIGlucGxhY2UsIHJlc3VsdCwgbm90LCBpc1hNTCl7CgkJCXZhciBuYW1lID0gbWF0Y2hbMV0ucmVwbGFjZSgvXFwvZywgIiIpOwoJCQkKCQkJaWYgKCAhaXNYTUwgJiYgRXhwci5hdHRyTWFwW25hbWVdICkgewoJCQkJbWF0Y2hbMV0gPSBFeHByLmF0dHJNYXBbbmFtZV07CgkJCX0KCgkJCWlmICggbWF0Y2hbMl0gPT09ICJ+PSIgKSB7CgkJCQltYXRjaFs0XSA9ICIgIiArIG1hdGNoWzRdICsgIiAiOwoJCQl9CgoJCQlyZXR1cm4gbWF0Y2g7CgkJfSwKCQlQU0VVRE86IGZ1bmN0aW9uKG1hdGNoLCBjdXJMb29wLCBpbnBsYWNlLCByZXN1bHQsIG5vdCl7CgkJCWlmICggbWF0Y2hbMV0gPT09ICJub3QiICkgewoJCQkJLy8gSWYgd2UncmUgZGVhbGluZyB3aXRoIGEgY29tcGxleCBleHByZXNzaW9uLCBvciBhIHNpbXBsZSBvbmUKCQkJCWlmICggbWF0Y2hbM10ubWF0Y2goY2h1bmtlcikubGVuZ3RoID4gMSB8fCAvXlx3Ly50ZXN0KG1hdGNoWzNdKSApIHsKCQkJCQltYXRjaFszXSA9IFNpenpsZShtYXRjaFszXSwgbnVsbCwgbnVsbCwgY3VyTG9vcCk7CgkJCQl9IGVsc2UgewoJCQkJCXZhciByZXQgPSBTaXp6bGUuZmlsdGVyKG1hdGNoWzNdLCBjdXJMb29wLCBpbnBsYWNlLCB0cnVlIF4gbm90KTsKCQkJCQlpZiAoICFpbnBsYWNlICkgewoJCQkJCQlyZXN1bHQucHVzaC5hcHBseSggcmVzdWx0LCByZXQgKTsKCQkJCQl9CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9IGVsc2UgaWYgKCBFeHByLm1hdGNoLlBPUy50ZXN0KCBtYXRjaFswXSApIHx8IEV4cHIubWF0Y2guQ0hJTEQudGVzdCggbWF0Y2hbMF0gKSApIHsKCQkJCXJldHVybiB0cnVlOwoJCQl9CgkJCQoJCQlyZXR1cm4gbWF0Y2g7CgkJfSwKCQlQT1M6IGZ1bmN0aW9uKG1hdGNoKXsKCQkJbWF0Y2gudW5zaGlmdCggdHJ1ZSApOwoJCQlyZXR1cm4gbWF0Y2g7CgkJfQoJfSwKCWZpbHRlcnM6IHsKCQllbmFibGVkOiBmdW5jdGlvbihlbGVtKXsKCQkJcmV0dXJuIGVsZW0uZGlzYWJsZWQgPT09IGZhbHNlICYmIGVsZW0udHlwZSAhPT0gImhpZGRlbiI7CgkJfSwKCQlkaXNhYmxlZDogZnVuY3Rpb24oZWxlbSl7CgkJCXJldHVybiBlbGVtLmRpc2FibGVkID09PSB0cnVlOwoJCX0sCgkJY2hlY2tlZDogZnVuY3Rpb24oZWxlbSl7CgkJCXJldHVybiBlbGVtLmNoZWNrZWQgPT09IHRydWU7CgkJfSwKCQlzZWxlY3RlZDogZnVuY3Rpb24oZWxlbSl7CgkJCS8vIEFjY2Vzc2luZyB0aGlzIHByb3BlcnR5IG1ha2VzIHNlbGVjdGVkLWJ5LWRlZmF1bHQKCQkJLy8gb3B0aW9ucyBpbiBTYWZhcmkgd29yayBwcm9wZXJseQoJCQllbGVtLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDsKCQkJcmV0dXJuIGVsZW0uc2VsZWN0ZWQgPT09IHRydWU7CgkJfSwKCQlwYXJlbnQ6IGZ1bmN0aW9uKGVsZW0pewoJCQlyZXR1cm4gISFlbGVtLmZpcnN0Q2hpbGQ7CgkJfSwKCQllbXB0eTogZnVuY3Rpb24oZWxlbSl7CgkJCXJldHVybiAhZWxlbS5maXJzdENoaWxkOwoJCX0sCgkJaGFzOiBmdW5jdGlvbihlbGVtLCBpLCBtYXRjaCl7CgkJCXJldHVybiAhIVNpenpsZSggbWF0Y2hbM10sIGVsZW0gKS5sZW5ndGg7CgkJfSwKCQloZWFkZXI6IGZ1bmN0aW9uKGVsZW0pewoJCQlyZXR1cm4gL2hcZC9pLnRlc3QoIGVsZW0ubm9kZU5hbWUgKTsKCQl9LAoJCXRleHQ6IGZ1bmN0aW9uKGVsZW0pewoJCQlyZXR1cm4gInRleHQiID09PSBlbGVtLnR5cGU7CgkJfSwKCQlyYWRpbzogZnVuY3Rpb24oZWxlbSl7CgkJCXJldHVybiAicmFkaW8iID09PSBlbGVtLnR5cGU7CgkJfSwKCQljaGVja2JveDogZnVuY3Rpb24oZWxlbSl7CgkJCXJldHVybiAiY2hlY2tib3giID09PSBlbGVtLnR5cGU7CgkJfSwKCQlmaWxlOiBmdW5jdGlvbihlbGVtKXsKCQkJcmV0dXJuICJmaWxlIiA9PT0gZWxlbS50eXBlOwoJCX0sCgkJcGFzc3dvcmQ6IGZ1bmN0aW9uKGVsZW0pewoJCQlyZXR1cm4gInBhc3N3b3JkIiA9PT0gZWxlbS50eXBlOwoJCX0sCgkJc3VibWl0OiBmdW5jdGlvbihlbGVtKXsKCQkJcmV0dXJuICJzdWJtaXQiID09PSBlbGVtLnR5cGU7CgkJfSwKCQlpbWFnZTogZnVuY3Rpb24oZWxlbSl7CgkJCXJldHVybiAiaW1hZ2UiID09PSBlbGVtLnR5cGU7CgkJfSwKCQlyZXNldDogZnVuY3Rpb24oZWxlbSl7CgkJCXJldHVybiAicmVzZXQiID09PSBlbGVtLnR5cGU7CgkJfSwKCQlidXR0b246IGZ1bmN0aW9uKGVsZW0pewoJCQlyZXR1cm4gImJ1dHRvbiIgPT09IGVsZW0udHlwZSB8fCBlbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09ICJCVVRUT04iOwoJCX0sCgkJaW5wdXQ6IGZ1bmN0aW9uKGVsZW0pewoJCQlyZXR1cm4gL2lucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24vaS50ZXN0KGVsZW0ubm9kZU5hbWUpOwoJCX0KCX0sCglzZXRGaWx0ZXJzOiB7CgkJZmlyc3Q6IGZ1bmN0aW9uKGVsZW0sIGkpewoJCQlyZXR1cm4gaSA9PT0gMDsKCQl9LAoJCWxhc3Q6IGZ1bmN0aW9uKGVsZW0sIGksIG1hdGNoLCBhcnJheSl7CgkJCXJldHVybiBpID09PSBhcnJheS5sZW5ndGggLSAxOwoJCX0sCgkJZXZlbjogZnVuY3Rpb24oZWxlbSwgaSl7CgkJCXJldHVybiBpICUgMiA9PT0gMDsKCQl9LAoJCW9kZDogZnVuY3Rpb24oZWxlbSwgaSl7CgkJCXJldHVybiBpICUgMiA9PT0gMTsKCQl9LAoJCWx0OiBmdW5jdGlvbihlbGVtLCBpLCBtYXRjaCl7CgkJCXJldHVybiBpIDwgbWF0Y2hbM10gLSAwOwoJCX0sCgkJZ3Q6IGZ1bmN0aW9uKGVsZW0sIGksIG1hdGNoKXsKCQkJcmV0dXJuIGkgPiBtYXRjaFszXSAtIDA7CgkJfSwKCQludGg6IGZ1bmN0aW9uKGVsZW0sIGksIG1hdGNoKXsKCQkJcmV0dXJuIG1hdGNoWzNdIC0gMCA9PSBpOwoJCX0sCgkJZXE6IGZ1bmN0aW9uKGVsZW0sIGksIG1hdGNoKXsKCQkJcmV0dXJuIG1hdGNoWzNdIC0gMCA9PSBpOwoJCX0KCX0sCglmaWx0ZXI6IHsKCQlQU0VVRE86IGZ1bmN0aW9uKGVsZW0sIG1hdGNoLCBpLCBhcnJheSl7CgkJCXZhciBuYW1lID0gbWF0Y2hbMV0sIGZpbHRlciA9IEV4cHIuZmlsdGVyc1sgbmFtZSBdOwoKCQkJaWYgKCBmaWx0ZXIgKSB7CgkJCQlyZXR1cm4gZmlsdGVyKCBlbGVtLCBpLCBtYXRjaCwgYXJyYXkgKTsKCQkJfSBlbHNlIGlmICggbmFtZSA9PT0gImNvbnRhaW5zIiApIHsKCQkJCXJldHVybiAoZWxlbS50ZXh0Q29udGVudCB8fCBlbGVtLmlubmVyVGV4dCB8fCAiIikuaW5kZXhPZihtYXRjaFszXSkgPj0gMDsKCQkJfSBlbHNlIGlmICggbmFtZSA9PT0gIm5vdCIgKSB7CgkJCQl2YXIgbm90ID0gbWF0Y2hbM107CgoJCQkJZm9yICggaSA9IDAsIGwgPSBub3QubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCQkJCWlmICggbm90W2ldID09PSBlbGVtICkgewoJCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQkJfQoJCQkJfQoKCQkJCXJldHVybiB0cnVlOwoJCQl9CgkJfSwKCQlDSElMRDogZnVuY3Rpb24oZWxlbSwgbWF0Y2gpewoJCQl2YXIgdHlwZSA9IG1hdGNoWzFdLCBub2RlID0gZWxlbTsKCQkJc3dpdGNoICh0eXBlKSB7CgkJCQljYXNlICdvbmx5JzoKCQkJCWNhc2UgJ2ZpcnN0JzoKCQkJCQl3aGlsZSAoIChub2RlID0gbm9kZS5wcmV2aW91c1NpYmxpbmcpICkgIHsKCQkJCQkJaWYgKCBub2RlLm5vZGVUeXBlID09PSAxICkgcmV0dXJuIGZhbHNlOwoJCQkJCX0KCQkJCQlpZiAoIHR5cGUgPT0gJ2ZpcnN0JykgcmV0dXJuIHRydWU7CgkJCQkJbm9kZSA9IGVsZW07CgkJCQljYXNlICdsYXN0JzoKCQkJCQl3aGlsZSAoIChub2RlID0gbm9kZS5uZXh0U2libGluZykgKSAgewoJCQkJCQlpZiAoIG5vZGUubm9kZVR5cGUgPT09IDEgKSByZXR1cm4gZmFsc2U7CgkJCQkJfQoJCQkJCXJldHVybiB0cnVlOwoJCQkJY2FzZSAnbnRoJzoKCQkJCQl2YXIgZmlyc3QgPSBtYXRjaFsyXSwgbGFzdCA9IG1hdGNoWzNdOwoKCQkJCQlpZiAoIGZpcnN0ID09IDEgJiYgbGFzdCA9PSAwICkgewoJCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCQl9CgkJCQkJCgkJCQkJdmFyIGRvbmVOYW1lID0gbWF0Y2hbMF0sCgkJCQkJCXBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTsKCQoJCQkJCWlmICggcGFyZW50ICYmIChwYXJlbnQuc2l6Y2FjaGUgIT09IGRvbmVOYW1lIHx8ICFlbGVtLm5vZGVJbmRleCkgKSB7CgkJCQkJCXZhciBjb3VudCA9IDA7CgkJCQkJCWZvciAoIG5vZGUgPSBwYXJlbnQuZmlyc3RDaGlsZDsgbm9kZTsgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmcgKSB7CgkJCQkJCQlpZiAoIG5vZGUubm9kZVR5cGUgPT09IDEgKSB7CgkJCQkJCQkJbm9kZS5ub2RlSW5kZXggPSArK2NvdW50OwoJCQkJCQkJfQoJCQkJCQl9IAoJCQkJCQlwYXJlbnQuc2l6Y2FjaGUgPSBkb25lTmFtZTsKCQkJCQl9CgkJCQkJCgkJCQkJdmFyIGRpZmYgPSBlbGVtLm5vZGVJbmRleCAtIGxhc3Q7CgkJCQkJaWYgKCBmaXJzdCA9PSAwICkgewoJCQkJCQlyZXR1cm4gZGlmZiA9PSAwOwoJCQkJCX0gZWxzZSB7CgkJCQkJCXJldHVybiAoIGRpZmYgJSBmaXJzdCA9PSAwICYmIGRpZmYgLyBmaXJzdCA+PSAwICk7CgkJCQkJfQoJCQl9CgkJfSwKCQlJRDogZnVuY3Rpb24oZWxlbSwgbWF0Y2gpewoJCQlyZXR1cm4gZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiBlbGVtLmdldEF0dHJpYnV0ZSgiaWQiKSA9PT0gbWF0Y2g7CgkJfSwKCQlUQUc6IGZ1bmN0aW9uKGVsZW0sIG1hdGNoKXsKCQkJcmV0dXJuIChtYXRjaCA9PT0gIioiICYmIGVsZW0ubm9kZVR5cGUgPT09IDEpIHx8IGVsZW0ubm9kZU5hbWUgPT09IG1hdGNoOwoJCX0sCgkJQ0xBU1M6IGZ1bmN0aW9uKGVsZW0sIG1hdGNoKXsKCQkJcmV0dXJuICgiICIgKyAoZWxlbS5jbGFzc05hbWUgfHwgZWxlbS5nZXRBdHRyaWJ1dGUoImNsYXNzIikpICsgIiAiKQoJCQkJLmluZGV4T2YoIG1hdGNoICkgPiAtMTsKCQl9LAoJCUFUVFI6IGZ1bmN0aW9uKGVsZW0sIG1hdGNoKXsKCQkJdmFyIG5hbWUgPSBtYXRjaFsxXSwKCQkJCXJlc3VsdCA9IEV4cHIuYXR0ckhhbmRsZVsgbmFtZSBdID8KCQkJCQlFeHByLmF0dHJIYW5kbGVbIG5hbWUgXSggZWxlbSApIDoKCQkJCQllbGVtWyBuYW1lIF0gIT0gbnVsbCA/CgkJCQkJCWVsZW1bIG5hbWUgXSA6CgkJCQkJCWVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lICksCgkJCQl2YWx1ZSA9IHJlc3VsdCArICIiLAoJCQkJdHlwZSA9IG1hdGNoWzJdLAoJCQkJY2hlY2sgPSBtYXRjaFs0XTsKCgkJCXJldHVybiByZXN1bHQgPT0gbnVsbCA/CgkJCQl0eXBlID09PSAiIT0iIDoKCQkJCXR5cGUgPT09ICI9IiA/CgkJCQl2YWx1ZSA9PT0gY2hlY2sgOgoJCQkJdHlwZSA9PT0gIio9IiA/CgkJCQl2YWx1ZS5pbmRleE9mKGNoZWNrKSA+PSAwIDoKCQkJCXR5cGUgPT09ICJ+PSIgPwoJCQkJKCIgIiArIHZhbHVlICsgIiAiKS5pbmRleE9mKGNoZWNrKSA+PSAwIDoKCQkJCSFjaGVjayA/CgkJCQl2YWx1ZSAmJiByZXN1bHQgIT09IGZhbHNlIDoKCQkJCXR5cGUgPT09ICIhPSIgPwoJCQkJdmFsdWUgIT0gY2hlY2sgOgoJCQkJdHlwZSA9PT0gIl49IiA/CgkJCQl2YWx1ZS5pbmRleE9mKGNoZWNrKSA9PT0gMCA6CgkJCQl0eXBlID09PSAiJD0iID8KCQkJCXZhbHVlLnN1YnN0cih2YWx1ZS5sZW5ndGggLSBjaGVjay5sZW5ndGgpID09PSBjaGVjayA6CgkJCQl0eXBlID09PSAifD0iID8KCQkJCXZhbHVlID09PSBjaGVjayB8fCB2YWx1ZS5zdWJzdHIoMCwgY2hlY2subGVuZ3RoICsgMSkgPT09IGNoZWNrICsgIi0iIDoKCQkJCWZhbHNlOwoJCX0sCgkJUE9TOiBmdW5jdGlvbihlbGVtLCBtYXRjaCwgaSwgYXJyYXkpewoJCQl2YXIgbmFtZSA9IG1hdGNoWzJdLCBmaWx0ZXIgPSBFeHByLnNldEZpbHRlcnNbIG5hbWUgXTsKCgkJCWlmICggZmlsdGVyICkgewoJCQkJcmV0dXJuIGZpbHRlciggZWxlbSwgaSwgbWF0Y2gsIGFycmF5ICk7CgkJCX0KCQl9Cgl9Cn07Cgp2YXIgb3JpZ1BPUyA9IEV4cHIubWF0Y2guUE9TOwoKZm9yICggdmFyIHR5cGUgaW4gRXhwci5tYXRjaCApIHsKCUV4cHIubWF0Y2hbIHR5cGUgXSA9IG5ldyBSZWdFeHAoIEV4cHIubWF0Y2hbIHR5cGUgXS5zb3VyY2UgKyAvKD8hW15cW10qXF0pKD8hW15cKF0qXCkpLy5zb3VyY2UgKTsKfQoKdmFyIG1ha2VBcnJheSA9IGZ1bmN0aW9uKGFycmF5LCByZXN1bHRzKSB7CglhcnJheSA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCBhcnJheSApOwoKCWlmICggcmVzdWx0cyApIHsKCQlyZXN1bHRzLnB1c2guYXBwbHkoIHJlc3VsdHMsIGFycmF5ICk7CgkJcmV0dXJuIHJlc3VsdHM7Cgl9CgkKCXJldHVybiBhcnJheTsKfTsKCi8vIFBlcmZvcm0gYSBzaW1wbGUgY2hlY2sgdG8gZGV0ZXJtaW5lIGlmIHRoZSBicm93c2VyIGlzIGNhcGFibGUgb2YKLy8gY29udmVydGluZyBhIE5vZGVMaXN0IHRvIGFuIGFycmF5IHVzaW5nIGJ1aWx0aW4gbWV0aG9kcy4KdHJ5IHsKCUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2hpbGROb2RlcyApOwoKLy8gUHJvdmlkZSBhIGZhbGxiYWNrIG1ldGhvZCBpZiBpdCBkb2VzIG5vdCB3b3JrCn0gY2F0Y2goZSl7CgltYWtlQXJyYXkgPSBmdW5jdGlvbihhcnJheSwgcmVzdWx0cykgewoJCXZhciByZXQgPSByZXN1bHRzIHx8IFtdOwoKCQlpZiAoIHRvU3RyaW5nLmNhbGwoYXJyYXkpID09PSAiW29iamVjdCBBcnJheV0iICkgewoJCQlBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseSggcmV0LCBhcnJheSApOwoJCX0gZWxzZSB7CgkJCWlmICggdHlwZW9mIGFycmF5Lmxlbmd0aCA9PT0gIm51bWJlciIgKSB7CgkJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CgkJCQkJcmV0LnB1c2goIGFycmF5W2ldICk7CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQlmb3IgKCB2YXIgaSA9IDA7IGFycmF5W2ldOyBpKysgKSB7CgkJCQkJcmV0LnB1c2goIGFycmF5W2ldICk7CgkJCQl9CgkJCX0KCQl9CgoJCXJldHVybiByZXQ7Cgl9Owp9Cgp2YXIgc29ydE9yZGVyOwoKaWYgKCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY29tcGFyZURvY3VtZW50UG9zaXRpb24gKSB7Cglzb3J0T3JkZXIgPSBmdW5jdGlvbiggYSwgYiApIHsKCQl2YXIgcmV0ID0gYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSAmIDQgPyAtMSA6IGEgPT09IGIgPyAwIDogMTsKCQlpZiAoIHJldCA9PT0gMCApIHsKCQkJaGFzRHVwbGljYXRlID0gdHJ1ZTsKCQl9CgkJcmV0dXJuIHJldDsKCX07Cn0gZWxzZSBpZiAoICJzb3VyY2VJbmRleCIgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICkgewoJc29ydE9yZGVyID0gZnVuY3Rpb24oIGEsIGIgKSB7CgkJdmFyIHJldCA9IGEuc291cmNlSW5kZXggLSBiLnNvdXJjZUluZGV4OwoJCWlmICggcmV0ID09PSAwICkgewoJCQloYXNEdXBsaWNhdGUgPSB0cnVlOwoJCX0KCQlyZXR1cm4gcmV0OwoJfTsKfSBlbHNlIGlmICggZG9jdW1lbnQuY3JlYXRlUmFuZ2UgKSB7Cglzb3J0T3JkZXIgPSBmdW5jdGlvbiggYSwgYiApIHsKCQl2YXIgYVJhbmdlID0gYS5vd25lckRvY3VtZW50LmNyZWF0ZVJhbmdlKCksIGJSYW5nZSA9IGIub3duZXJEb2N1bWVudC5jcmVhdGVSYW5nZSgpOwoJCWFSYW5nZS5zZWxlY3ROb2RlKGEpOwoJCWFSYW5nZS5jb2xsYXBzZSh0cnVlKTsKCQliUmFuZ2Uuc2VsZWN0Tm9kZShiKTsKCQliUmFuZ2UuY29sbGFwc2UodHJ1ZSk7CgkJdmFyIHJldCA9IGFSYW5nZS5jb21wYXJlQm91bmRhcnlQb2ludHMoUmFuZ2UuU1RBUlRfVE9fRU5ELCBiUmFuZ2UpOwoJCWlmICggcmV0ID09PSAwICkgewoJCQloYXNEdXBsaWNhdGUgPSB0cnVlOwoJCX0KCQlyZXR1cm4gcmV0OwoJfTsKfQoKLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBicm93c2VyIHJldHVybnMgZWxlbWVudHMgYnkgbmFtZSB3aGVuCi8vIHF1ZXJ5aW5nIGJ5IGdldEVsZW1lbnRCeUlkIChhbmQgcHJvdmlkZSBhIHdvcmthcm91bmQpCihmdW5jdGlvbigpewoJLy8gV2UncmUgZ29pbmcgdG8gaW5qZWN0IGEgZmFrZSBpbnB1dCBlbGVtZW50IHdpdGggYSBzcGVjaWZpZWQgbmFtZQoJdmFyIGZvcm0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSwKCQlpZCA9ICJzY3JpcHQiICsgKG5ldyBEYXRlKS5nZXRUaW1lKCk7Cglmb3JtLmlubmVySFRNTCA9ICI8YSBuYW1lPSciICsgaWQgKyAiJy8+IjsKCgkvLyBJbmplY3QgaXQgaW50byB0aGUgcm9vdCBlbGVtZW50LCBjaGVjayBpdHMgc3RhdHVzLCBhbmQgcmVtb3ZlIGl0IHF1aWNrbHkKCXZhciByb290ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50OwoJcm9vdC5pbnNlcnRCZWZvcmUoIGZvcm0sIHJvb3QuZmlyc3RDaGlsZCApOwoKCS8vIFRoZSB3b3JrYXJvdW5kIGhhcyB0byBkbyBhZGRpdGlvbmFsIGNoZWNrcyBhZnRlciBhIGdldEVsZW1lbnRCeUlkCgkvLyBXaGljaCBzbG93cyB0aGluZ3MgZG93biBmb3Igb3RoZXIgYnJvd3NlcnMgKGhlbmNlIHRoZSBicmFuY2hpbmcpCglpZiAoICEhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIGlkICkgKSB7CgkJRXhwci5maW5kLklEID0gZnVuY3Rpb24obWF0Y2gsIGNvbnRleHQsIGlzWE1MKXsKCQkJaWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50QnlJZCAhPT0gInVuZGVmaW5lZCIgJiYgIWlzWE1MICkgewoJCQkJdmFyIG0gPSBjb250ZXh0LmdldEVsZW1lbnRCeUlkKG1hdGNoWzFdKTsKCQkJCXJldHVybiBtID8gbS5pZCA9PT0gbWF0Y2hbMV0gfHwgdHlwZW9mIG0uZ2V0QXR0cmlidXRlTm9kZSAhPT0gInVuZGVmaW5lZCIgJiYgbS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpLm5vZGVWYWx1ZSA9PT0gbWF0Y2hbMV0gPyBbbV0gOiB1bmRlZmluZWQgOiBbXTsKCQkJfQoJCX07CgoJCUV4cHIuZmlsdGVyLklEID0gZnVuY3Rpb24oZWxlbSwgbWF0Y2gpewoJCQl2YXIgbm9kZSA9IHR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZU5vZGUgIT09ICJ1bmRlZmluZWQiICYmIGVsZW0uZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTsKCQkJcmV0dXJuIGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgbm9kZSAmJiBub2RlLm5vZGVWYWx1ZSA9PT0gbWF0Y2g7CgkJfTsKCX0KCglyb290LnJlbW92ZUNoaWxkKCBmb3JtICk7Cglyb290ID0gZm9ybSA9IG51bGw7IC8vIHJlbGVhc2UgbWVtb3J5IGluIElFCn0pKCk7CgooZnVuY3Rpb24oKXsKCS8vIENoZWNrIHRvIHNlZSBpZiB0aGUgYnJvd3NlciByZXR1cm5zIG9ubHkgZWxlbWVudHMKCS8vIHdoZW4gZG9pbmcgZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKQoKCS8vIENyZWF0ZSBhIGZha2UgZWxlbWVudAoJdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwoJZGl2LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVDb21tZW50KCIiKSApOwoKCS8vIE1ha2Ugc3VyZSBubyBjb21tZW50cyBhcmUgZm91bmQKCWlmICggZGl2LmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikubGVuZ3RoID4gMCApIHsKCQlFeHByLmZpbmQuVEFHID0gZnVuY3Rpb24obWF0Y2gsIGNvbnRleHQpewoJCQl2YXIgcmVzdWx0cyA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUobWF0Y2hbMV0pOwoKCQkJLy8gRmlsdGVyIG91dCBwb3NzaWJsZSBjb21tZW50cwoJCQlpZiAoIG1hdGNoWzFdID09PSAiKiIgKSB7CgkJCQl2YXIgdG1wID0gW107CgoJCQkJZm9yICggdmFyIGkgPSAwOyByZXN1bHRzW2ldOyBpKysgKSB7CgkJCQkJaWYgKCByZXN1bHRzW2ldLm5vZGVUeXBlID09PSAxICkgewoJCQkJCQl0bXAucHVzaCggcmVzdWx0c1tpXSApOwoJCQkJCX0KCQkJCX0KCgkJCQlyZXN1bHRzID0gdG1wOwoJCQl9CgoJCQlyZXR1cm4gcmVzdWx0czsKCQl9OwoJfQoKCS8vIENoZWNrIHRvIHNlZSBpZiBhbiBhdHRyaWJ1dGUgcmV0dXJucyBub3JtYWxpemVkIGhyZWYgYXR0cmlidXRlcwoJZGl2LmlubmVySFRNTCA9ICI8YSBocmVmPScjJz48L2E+IjsKCWlmICggZGl2LmZpcnN0Q2hpbGQgJiYgdHlwZW9mIGRpdi5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSAhPT0gInVuZGVmaW5lZCIgJiYKCQkJZGl2LmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIikgIT09ICIjIiApIHsKCQlFeHByLmF0dHJIYW5kbGUuaHJlZiA9IGZ1bmN0aW9uKGVsZW0pewoJCQlyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoImhyZWYiLCAyKTsKCQl9OwoJfQoKCWRpdiA9IG51bGw7IC8vIHJlbGVhc2UgbWVtb3J5IGluIElFCn0pKCk7CgppZiAoIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwgKSAoZnVuY3Rpb24oKXsKCXZhciBvbGRTaXp6bGUgPSBTaXp6bGUsIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwoJZGl2LmlubmVySFRNTCA9ICI8cCBjbGFzcz0nVEVTVCc+PC9wPiI7CgoJLy8gU2FmYXJpIGNhbid0IGhhbmRsZSB1cHBlcmNhc2Ugb3IgdW5pY29kZSBjaGFyYWN0ZXJzIHdoZW4KCS8vIGluIHF1aXJrcyBtb2RlLgoJaWYgKCBkaXYucXVlcnlTZWxlY3RvckFsbCAmJiBkaXYucXVlcnlTZWxlY3RvckFsbCgiLlRFU1QiKS5sZW5ndGggPT09IDAgKSB7CgkJcmV0dXJuOwoJfQoJCglTaXp6bGUgPSBmdW5jdGlvbihxdWVyeSwgY29udGV4dCwgZXh0cmEsIHNlZWQpewoJCWNvbnRleHQgPSBjb250ZXh0IHx8IGRvY3VtZW50OwoKCQkvLyBPbmx5IHVzZSBxdWVyeVNlbGVjdG9yQWxsIG9uIG5vbi1YTUwgZG9jdW1lbnRzCgkJLy8gKElEIHNlbGVjdG9ycyBkb24ndCB3b3JrIGluIG5vbi1IVE1MIGRvY3VtZW50cykKCQlpZiAoICFzZWVkICYmIGNvbnRleHQubm9kZVR5cGUgPT09IDkgJiYgIWlzWE1MKGNvbnRleHQpICkgewoJCQl0cnkgewoJCQkJcmV0dXJuIG1ha2VBcnJheSggY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKHF1ZXJ5KSwgZXh0cmEgKTsKCQkJfSBjYXRjaChlKXt9CgkJfQoJCQoJCXJldHVybiBvbGRTaXp6bGUocXVlcnksIGNvbnRleHQsIGV4dHJhLCBzZWVkKTsKCX07CgoJZm9yICggdmFyIHByb3AgaW4gb2xkU2l6emxlICkgewoJCVNpenpsZVsgcHJvcCBdID0gb2xkU2l6emxlWyBwcm9wIF07Cgl9CgoJZGl2ID0gbnVsbDsgLy8gcmVsZWFzZSBtZW1vcnkgaW4gSUUKfSkoKTsKCmlmICggZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSApIChmdW5jdGlvbigpewoJdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwoJZGl2LmlubmVySFRNTCA9ICI8ZGl2IGNsYXNzPSd0ZXN0IGUnPjwvZGl2PjxkaXYgY2xhc3M9J3Rlc3QnPjwvZGl2PiI7CgoJLy8gT3BlcmEgY2FuJ3QgZmluZCBhIHNlY29uZCBjbGFzc25hbWUgKGluIDkuNikKCWlmICggZGl2LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImUiKS5sZW5ndGggPT09IDAgKQoJCXJldHVybjsKCgkvLyBTYWZhcmkgY2FjaGVzIGNsYXNzIGF0dHJpYnV0ZXMsIGRvZXNuJ3QgY2F0Y2ggY2hhbmdlcyAoaW4gMy4yKQoJZGl2Lmxhc3RDaGlsZC5jbGFzc05hbWUgPSAiZSI7CgoJaWYgKCBkaXYuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiZSIpLmxlbmd0aCA9PT0gMSApCgkJcmV0dXJuOwoKCUV4cHIub3JkZXIuc3BsaWNlKDEsIDAsICJDTEFTUyIpOwoJRXhwci5maW5kLkNMQVNTID0gZnVuY3Rpb24obWF0Y2gsIGNvbnRleHQsIGlzWE1MKSB7CgkJaWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICE9PSAidW5kZWZpbmVkIiAmJiAhaXNYTUwgKSB7CgkJCXJldHVybiBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUobWF0Y2hbMV0pOwoJCX0KCX07CgoJZGl2ID0gbnVsbDsgLy8gcmVsZWFzZSBtZW1vcnkgaW4gSUUKfSkoKTsKCmZ1bmN0aW9uIGRpck5vZGVDaGVjayggZGlyLCBjdXIsIGRvbmVOYW1lLCBjaGVja1NldCwgbm9kZUNoZWNrLCBpc1hNTCApIHsKCXZhciBzaWJEaXIgPSBkaXIgPT0gInByZXZpb3VzU2libGluZyIgJiYgIWlzWE1MOwoJZm9yICggdmFyIGkgPSAwLCBsID0gY2hlY2tTZXQubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCXZhciBlbGVtID0gY2hlY2tTZXRbaV07CgkJaWYgKCBlbGVtICkgewoJCQlpZiAoIHNpYkRpciAmJiBlbGVtLm5vZGVUeXBlID09PSAxICl7CgkJCQllbGVtLnNpemNhY2hlID0gZG9uZU5hbWU7CgkJCQllbGVtLnNpenNldCA9IGk7CgkJCX0KCQkJZWxlbSA9IGVsZW1bZGlyXTsKCQkJdmFyIG1hdGNoID0gZmFsc2U7CgoJCQl3aGlsZSAoIGVsZW0gKSB7CgkJCQlpZiAoIGVsZW0uc2l6Y2FjaGUgPT09IGRvbmVOYW1lICkgewoJCQkJCW1hdGNoID0gY2hlY2tTZXRbZWxlbS5zaXpzZXRdOwoJCQkJCWJyZWFrOwoJCQkJfQoKCQkJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiAhaXNYTUwgKXsKCQkJCQllbGVtLnNpemNhY2hlID0gZG9uZU5hbWU7CgkJCQkJZWxlbS5zaXpzZXQgPSBpOwoJCQkJfQoKCQkJCWlmICggZWxlbS5ub2RlTmFtZSA9PT0gY3VyICkgewoJCQkJCW1hdGNoID0gZWxlbTsKCQkJCQlicmVhazsKCQkJCX0KCgkJCQllbGVtID0gZWxlbVtkaXJdOwoJCQl9CgoJCQljaGVja1NldFtpXSA9IG1hdGNoOwoJCX0KCX0KfQoKZnVuY3Rpb24gZGlyQ2hlY2soIGRpciwgY3VyLCBkb25lTmFtZSwgY2hlY2tTZXQsIG5vZGVDaGVjaywgaXNYTUwgKSB7Cgl2YXIgc2liRGlyID0gZGlyID09ICJwcmV2aW91c1NpYmxpbmciICYmICFpc1hNTDsKCWZvciAoIHZhciBpID0gMCwgbCA9IGNoZWNrU2V0Lmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKCQl2YXIgZWxlbSA9IGNoZWNrU2V0W2ldOwoJCWlmICggZWxlbSApIHsKCQkJaWYgKCBzaWJEaXIgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHsKCQkJCWVsZW0uc2l6Y2FjaGUgPSBkb25lTmFtZTsKCQkJCWVsZW0uc2l6c2V0ID0gaTsKCQkJfQoJCQllbGVtID0gZWxlbVtkaXJdOwoJCQl2YXIgbWF0Y2ggPSBmYWxzZTsKCgkJCXdoaWxlICggZWxlbSApIHsKCQkJCWlmICggZWxlbS5zaXpjYWNoZSA9PT0gZG9uZU5hbWUgKSB7CgkJCQkJbWF0Y2ggPSBjaGVja1NldFtlbGVtLnNpenNldF07CgkJCQkJYnJlYWs7CgkJCQl9CgoJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkgewoJCQkJCWlmICggIWlzWE1MICkgewoJCQkJCQllbGVtLnNpemNhY2hlID0gZG9uZU5hbWU7CgkJCQkJCWVsZW0uc2l6c2V0ID0gaTsKCQkJCQl9CgkJCQkJaWYgKCB0eXBlb2YgY3VyICE9PSAic3RyaW5nIiApIHsKCQkJCQkJaWYgKCBlbGVtID09PSBjdXIgKSB7CgkJCQkJCQltYXRjaCA9IHRydWU7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoKCQkJCQl9IGVsc2UgaWYgKCBTaXp6bGUuZmlsdGVyKCBjdXIsIFtlbGVtXSApLmxlbmd0aCA+IDAgKSB7CgkJCQkJCW1hdGNoID0gZWxlbTsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJfQoKCQkJCWVsZW0gPSBlbGVtW2Rpcl07CgkJCX0KCgkJCWNoZWNrU2V0W2ldID0gbWF0Y2g7CgkJfQoJfQp9Cgp2YXIgY29udGFpbnMgPSBkb2N1bWVudC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiA/ICBmdW5jdGlvbihhLCBiKXsKCXJldHVybiBhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGIpICYgMTY7Cn0gOiBmdW5jdGlvbihhLCBiKXsKCXJldHVybiBhICE9PSBiICYmIChhLmNvbnRhaW5zID8gYS5jb250YWlucyhiKSA6IHRydWUpOwp9OwoKdmFyIGlzWE1MID0gZnVuY3Rpb24oZWxlbSl7CglyZXR1cm4gZWxlbS5ub2RlVHlwZSA9PT0gOSAmJiBlbGVtLmRvY3VtZW50RWxlbWVudC5ub2RlTmFtZSAhPT0gIkhUTUwiIHx8CgkJISFlbGVtLm93bmVyRG9jdW1lbnQgJiYgZWxlbS5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5ub2RlTmFtZSAhPT0gIkhUTUwiOwp9OwoKdmFyIHBvc1Byb2Nlc3MgPSBmdW5jdGlvbihzZWxlY3RvciwgY29udGV4dCl7Cgl2YXIgdG1wU2V0ID0gW10sIGxhdGVyID0gIiIsIG1hdGNoLAoJCXJvb3QgPSBjb250ZXh0Lm5vZGVUeXBlID8gW2NvbnRleHRdIDogY29udGV4dDsKCgkvLyBQb3NpdGlvbiBzZWxlY3RvcnMgbXVzdCBiZSBkb25lIGFmdGVyIHRoZSBmaWx0ZXIKCS8vIEFuZCBzbyBtdXN0IDpub3QocG9zaXRpb25hbCkgc28gd2UgbW92ZSBhbGwgUFNFVURPcyB0byB0aGUgZW5kCgl3aGlsZSAoIChtYXRjaCA9IEV4cHIubWF0Y2guUFNFVURPLmV4ZWMoIHNlbGVjdG9yICkpICkgewoJCWxhdGVyICs9IG1hdGNoWzBdOwoJCXNlbGVjdG9yID0gc2VsZWN0b3IucmVwbGFjZSggRXhwci5tYXRjaC5QU0VVRE8sICIiICk7Cgl9CgoJc2VsZWN0b3IgPSBFeHByLnJlbGF0aXZlW3NlbGVjdG9yXSA/IHNlbGVjdG9yICsgIioiIDogc2VsZWN0b3I7CgoJZm9yICggdmFyIGkgPSAwLCBsID0gcm9vdC5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CgkJU2l6emxlKCBzZWxlY3Rvciwgcm9vdFtpXSwgdG1wU2V0ICk7Cgl9CgoJcmV0dXJuIFNpenpsZS5maWx0ZXIoIGxhdGVyLCB0bXBTZXQgKTsKfTsKCi8vIEVYUE9TRQpqUXVlcnkuZmluZCA9IFNpenpsZTsKalF1ZXJ5LmV4cHIgPSBTaXp6bGUuc2VsZWN0b3JzOwpqUXVlcnkuZXhwclsiOiJdID0galF1ZXJ5LmV4cHIuZmlsdGVyczsKClNpenpsZS5zZWxlY3RvcnMuZmlsdGVycy5oaWRkZW4gPSBmdW5jdGlvbihlbGVtKXsKCXZhciB3aWR0aCA9IGVsZW0ub2Zmc2V0V2lkdGgsIGhlaWdodCA9IGVsZW0ub2Zmc2V0SGVpZ2h0OwoJcmV0dXJuICggd2lkdGggPT09IDAgJiYgaGVpZ2h0ID09PSAwICkgPwoJCXRydWUgOgoJCSggd2lkdGggIT09IDAgJiYgaGVpZ2h0ICE9PSAwICkgPwoJCQlmYWxzZSA6CgkJCSEhKCBqUXVlcnkuY3VyQ1NTKGVsZW0sICJkaXNwbGF5IikgPT09ICJub25lIiApOwp9OwoKU2l6emxlLnNlbGVjdG9ycy5maWx0ZXJzLnZpc2libGUgPSBmdW5jdGlvbihlbGVtKXsKCXZhciB3aWR0aCA9IGVsZW0ub2Zmc2V0V2lkdGgsIGhlaWdodCA9IGVsZW0ub2Zmc2V0SGVpZ2h0OwoJcmV0dXJuICggd2lkdGggPT09IDAgJiYgaGVpZ2h0ID09PSAwICkgPwoJCWZhbHNlIDoKCQkoIHdpZHRoID4gMCAmJiBoZWlnaHQgPiAwICkgPwoJCQl0cnVlIDoKCQkJISEoIGpRdWVyeS5jdXJDU1MoZWxlbSwgImRpc3BsYXkiKSAhPT0gIm5vbmUiICk7Cn07CgpTaXp6bGUuc2VsZWN0b3JzLmZpbHRlcnMuYW5pbWF0ZWQgPSBmdW5jdGlvbihlbGVtKXsKCXJldHVybiBqUXVlcnkuZ3JlcChqUXVlcnkudGltZXJzLCBmdW5jdGlvbihmbil7CgkJcmV0dXJuIGVsZW0gPT09IGZuLmVsZW07Cgl9KS5sZW5ndGg7Cn07CgpqUXVlcnkuZmlsdGVyID0galF1ZXJ5Lm11bHRpRmlsdGVyID0gZnVuY3Rpb24oIGV4cHIsIGVsZW1zLCBub3QgKSB7CglpZiAoIG5vdCApIHsKCQlleHByID0gIjpub3QoIiArIGV4cHIgKyAiKSI7Cgl9CgoJcmV0dXJuIFNpenpsZS5tYXRjaGVzKGV4cHIsIGVsZW1zKTsKfTsKCmpRdWVyeS5kaXIgPSBmdW5jdGlvbiggZWxlbSwgZGlyICl7Cgl2YXIgbWF0Y2hlZCA9IFtdLCBjdXIgPSBlbGVtW2Rpcl07Cgl3aGlsZSAoIGN1ciAmJiBjdXIgIT0gZG9jdW1lbnQgKSB7CgkJaWYgKCBjdXIubm9kZVR5cGUgPT0gMSApCgkJCW1hdGNoZWQucHVzaCggY3VyICk7CgkJY3VyID0gY3VyW2Rpcl07Cgl9CglyZXR1cm4gbWF0Y2hlZDsKfTsKCmpRdWVyeS5udGggPSBmdW5jdGlvbihjdXIsIHJlc3VsdCwgZGlyLCBlbGVtKXsKCXJlc3VsdCA9IHJlc3VsdCB8fCAxOwoJdmFyIG51bSA9IDA7CgoJZm9yICggOyBjdXI7IGN1ciA9IGN1cltkaXJdICkKCQlpZiAoIGN1ci5ub2RlVHlwZSA9PSAxICYmICsrbnVtID09IHJlc3VsdCApCgkJCWJyZWFrOwoKCXJldHVybiBjdXI7Cn07CgpqUXVlcnkuc2libGluZyA9IGZ1bmN0aW9uKG4sIGVsZW0pewoJdmFyIHIgPSBbXTsKCglmb3IgKCA7IG47IG4gPSBuLm5leHRTaWJsaW5nICkgewoJCWlmICggbi5ub2RlVHlwZSA9PSAxICYmIG4gIT0gZWxlbSApCgkJCXIucHVzaCggbiApOwoJfQoKCXJldHVybiByOwp9OwoKcmV0dXJuOwoKd2luZG93LlNpenpsZSA9IFNpenpsZTsKCn0pKCk7CmpRdWVyeS5mbi5leHRlbmQoewoJZmluZDogZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXZhciByZXQgPSB0aGlzLnB1c2hTdGFjayggIiIsICJmaW5kIiwgc2VsZWN0b3IgKSwgbGVuZ3RoID0gMDsKCgkJZm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CgkJCWxlbmd0aCA9IHJldC5sZW5ndGg7CgkJCWpRdWVyeS5maW5kKCBzZWxlY3RvciwgdGhpc1tpXSwgcmV0ICk7CgoJCQlpZiAoIGkgPiAwICkgewoJCQkJLy8gTWFrZSBzdXJlIHRoYXQgdGhlIHJlc3VsdHMgYXJlIHVuaXF1ZQoJCQkJZm9yICggdmFyIG4gPSBsZW5ndGg7IG4gPCByZXQubGVuZ3RoOyBuKysgKSB7CgkJCQkJZm9yICggdmFyIHIgPSAwOyByIDwgbGVuZ3RoOyByKysgKSB7CgkJCQkJCWlmICggcmV0W3JdID09PSByZXRbbl0gKSB7CgkJCQkJCQlyZXQuc3BsaWNlKG4tLSwgMSk7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCgkJcmV0dXJuIHJldDsKCX0sCgoJZmlsdGVyOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKAoJCQlqUXVlcnkuaXNGdW5jdGlvbiggc2VsZWN0b3IgKSAmJgoJCQlqUXVlcnkuZ3JlcCh0aGlzLCBmdW5jdGlvbihlbGVtLCBpKXsKCQkJCXJldHVybiBzZWxlY3Rvci5jYWxsKCBlbGVtLCBpICk7CgkJCX0pIHx8CgoJCQlqUXVlcnkubXVsdGlGaWx0ZXIoIHNlbGVjdG9yLCBqUXVlcnkuZ3JlcCh0aGlzLCBmdW5jdGlvbihlbGVtKXsKCQkJCXJldHVybiBlbGVtLm5vZGVUeXBlID09PSAxOwoJCQl9KSApLCAiZmlsdGVyIiwgc2VsZWN0b3IgKTsKCX0sCgoJY2xvc2VzdDogZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXZhciBwb3MgPSBqUXVlcnkuZXhwci5tYXRjaC5QT1MudGVzdCggc2VsZWN0b3IgKSA/IGpRdWVyeShzZWxlY3RvcikgOiBudWxsLAoJCQljbG9zZXIgPSAwOwoKCQlyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXsKCQkJdmFyIGN1ciA9IHRoaXM7CgkJCXdoaWxlICggY3VyICYmIGN1ci5vd25lckRvY3VtZW50ICkgewoJCQkJaWYgKCBwb3MgPyBwb3MuaW5kZXgoY3VyKSA+IC0xIDogalF1ZXJ5KGN1cikuaXMoc2VsZWN0b3IpICkgewoJCQkJCWpRdWVyeS5kYXRhKGN1ciwgImNsb3Nlc3QiLCBjbG9zZXIpOwoJCQkJCXJldHVybiBjdXI7CgkJCQl9CgkJCQljdXIgPSBjdXIucGFyZW50Tm9kZTsKCQkJCWNsb3NlcisrOwoJCQl9CgkJfSk7Cgl9LAoKCW5vdDogZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCWlmICggdHlwZW9mIHNlbGVjdG9yID09PSAic3RyaW5nIiApCgkJCS8vIHRlc3Qgc3BlY2lhbCBjYXNlIHdoZXJlIGp1c3Qgb25lIHNlbGVjdG9yIGlzIHBhc3NlZCBpbgoJCQlpZiAoIGlzU2ltcGxlLnRlc3QoIHNlbGVjdG9yICkgKQoJCQkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqUXVlcnkubXVsdGlGaWx0ZXIoIHNlbGVjdG9yLCB0aGlzLCB0cnVlICksICJub3QiLCBzZWxlY3RvciApOwoJCQllbHNlCgkJCQlzZWxlY3RvciA9IGpRdWVyeS5tdWx0aUZpbHRlciggc2VsZWN0b3IsIHRoaXMgKTsKCgkJdmFyIGlzQXJyYXlMaWtlID0gc2VsZWN0b3IubGVuZ3RoICYmIHNlbGVjdG9yW3NlbGVjdG9yLmxlbmd0aCAtIDFdICE9PSB1bmRlZmluZWQgJiYgIXNlbGVjdG9yLm5vZGVUeXBlOwoJCXJldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpIHsKCQkJcmV0dXJuIGlzQXJyYXlMaWtlID8galF1ZXJ5LmluQXJyYXkoIHRoaXMsIHNlbGVjdG9yICkgPCAwIDogdGhpcyAhPSBzZWxlY3RvcjsKCQl9KTsKCX0sCgoJYWRkOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqUXVlcnkudW5pcXVlKCBqUXVlcnkubWVyZ2UoCgkJCXRoaXMuZ2V0KCksCgkJCXR5cGVvZiBzZWxlY3RvciA9PT0gInN0cmluZyIgPwoJCQkJalF1ZXJ5KCBzZWxlY3RvciApIDoKCQkJCWpRdWVyeS5tYWtlQXJyYXkoIHNlbGVjdG9yICkKCQkpKSk7Cgl9LAoKCWVxOiBmdW5jdGlvbiggaSApIHsKCQlyZXR1cm4gdGhpcy5zbGljZSggaSwgK2kgKyAxICk7Cgl9LAoKCXNsaWNlOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIEFycmF5LnByb3RvdHlwZS5zbGljZS5hcHBseSggdGhpcywgYXJndW1lbnRzICksCgkJCSJzbGljZSIsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cykuam9pbigiLCIpICk7Cgl9LAoKCW1hcDogZnVuY3Rpb24oIGNhbGxiYWNrICkgewoJCXJldHVybiB0aGlzLnB1c2hTdGFjayggalF1ZXJ5Lm1hcCh0aGlzLCBmdW5jdGlvbihlbGVtLCBpKXsKCQkJcmV0dXJuIGNhbGxiYWNrLmNhbGwoIGVsZW0sIGksIGVsZW0gKTsKCQl9KSk7Cgl9LAoKCWFuZFNlbGY6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLmFkZCggdGhpcy5wcmV2T2JqZWN0ICk7Cgl9LAoKCWVuZDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMucHJldk9iamVjdCB8fCBqUXVlcnkobnVsbCk7Cgl9Cn0pOwoKalF1ZXJ5LmVhY2goewoJcGFyZW50OiBmdW5jdGlvbihlbGVtKXtyZXR1cm4gZWxlbS5wYXJlbnROb2RlO30sCglwYXJlbnRzOiBmdW5jdGlvbihlbGVtKXtyZXR1cm4galF1ZXJ5LmRpcihlbGVtLCJwYXJlbnROb2RlIik7fSwKCW5leHQ6IGZ1bmN0aW9uKGVsZW0pe3JldHVybiBqUXVlcnkubnRoKGVsZW0sMiwibmV4dFNpYmxpbmciKTt9LAoJcHJldjogZnVuY3Rpb24oZWxlbSl7cmV0dXJuIGpRdWVyeS5udGgoZWxlbSwyLCJwcmV2aW91c1NpYmxpbmciKTt9LAoJbmV4dEFsbDogZnVuY3Rpb24oZWxlbSl7cmV0dXJuIGpRdWVyeS5kaXIoZWxlbSwibmV4dFNpYmxpbmciKTt9LAoJcHJldkFsbDogZnVuY3Rpb24oZWxlbSl7cmV0dXJuIGpRdWVyeS5kaXIoZWxlbSwicHJldmlvdXNTaWJsaW5nIik7fSwKCXNpYmxpbmdzOiBmdW5jdGlvbihlbGVtKXtyZXR1cm4galF1ZXJ5LnNpYmxpbmcoZWxlbS5wYXJlbnROb2RlLmZpcnN0Q2hpbGQsZWxlbSk7fSwKCWNoaWxkcmVuOiBmdW5jdGlvbihlbGVtKXtyZXR1cm4galF1ZXJ5LnNpYmxpbmcoZWxlbS5maXJzdENoaWxkKTt9LAoJY29udGVudHM6IGZ1bmN0aW9uKGVsZW0pe3JldHVybiBqUXVlcnkubm9kZU5hbWUoZWxlbSwiaWZyYW1lIik/ZWxlbS5jb250ZW50RG9jdW1lbnR8fGVsZW0uY29udGVudFdpbmRvdy5kb2N1bWVudDpqUXVlcnkubWFrZUFycmF5KGVsZW0uY2hpbGROb2Rlcyk7fQp9LCBmdW5jdGlvbihuYW1lLCBmbil7CglqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKCQl2YXIgcmV0ID0galF1ZXJ5Lm1hcCggdGhpcywgZm4gKTsKCgkJaWYgKCBzZWxlY3RvciAmJiB0eXBlb2Ygc2VsZWN0b3IgPT0gInN0cmluZyIgKQoJCQlyZXQgPSBqUXVlcnkubXVsdGlGaWx0ZXIoIHNlbGVjdG9yLCByZXQgKTsKCgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqUXVlcnkudW5pcXVlKCByZXQgKSwgbmFtZSwgc2VsZWN0b3IgKTsKCX07Cn0pO2pRdWVyeS5mbi5leHRlbmQoewoJYXR0cjogZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkgewoJCXZhciBvcHRpb25zID0gbmFtZSwgaXNGdW5jdGlvbiA9IGpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApOwoKCQlpZiAoIHR5cGVvZiBuYW1lID09PSAic3RyaW5nIiApIHsKCQkJLy8gQXJlIHdlIHNldHRpbmcgdGhlIGF0dHJpYnV0ZT8KCQkJaWYgKCB2YWx1ZSA9PT0gdW5kZWZpbmVkICkgewoJCQkJcmV0dXJuIHRoaXMubGVuZ3RoID8KCQkJCQlqUXVlcnkuYXR0ciggdGhpc1swXSwgbmFtZSApIDoKCQkJCQludWxsOwoKCQkJLy8gQ29udmVydCBuYW1lLCB2YWx1ZSBwYXJhbXMgdG8gb3B0aW9ucyBoYXNoIGZvcm1hdAoJCQl9IGVsc2UgewoJCQkJb3B0aW9ucyA9IHt9OwoJCQkJb3B0aW9uc1sgbmFtZSBdID0gdmFsdWU7CgkJCX0KCQl9CgoJCS8vIEZvciBlYWNoIGVsZW1lbnQuLi4KCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKCQkJdmFyIGVsZW0gPSB0aGlzW2ldOwoKCQkJLy8gU2V0IGFsbCB0aGUgYXR0cmlidXRlcwoJCQlmb3IgKCB2YXIgcHJvcCBpbiBvcHRpb25zICkgewoJCQkJdmFsdWUgPSBvcHRpb25zW3Byb3BdOwoKCQkJCWlmICggaXNGdW5jdGlvbiApIHsKCQkJCQl2YWx1ZSA9IHZhbHVlLmNhbGwoIGVsZW0sIGkgKTsKCQkJCX0KCgkJCQlqUXVlcnkuYXR0ciggZWxlbSwgcHJvcCwgdmFsdWUgKTsKCQkJfQoJCX0KCgkJcmV0dXJuIHRoaXM7Cgl9LAoKCWhhc0NsYXNzOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJcmV0dXJuICEhc2VsZWN0b3IgJiYgdGhpcy5pcyggIi4iICsgc2VsZWN0b3IgKTsKCX0sCgoJdmFsOiBmdW5jdGlvbiggdmFsdWUgKSB7CgkJaWYgKCB2YWx1ZSA9PT0gdW5kZWZpbmVkICkgewoJCQl2YXIgZWxlbSA9IHRoaXNbMF07CgoJCQlpZiAoIGVsZW0gKSB7CgkJCQlpZiggalF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCAnb3B0aW9uJyApICkKCQkJCQlyZXR1cm4gKGVsZW0uYXR0cmlidXRlcy52YWx1ZSB8fCB7fSkuc3BlY2lmaWVkID8gZWxlbS52YWx1ZSA6IGVsZW0udGV4dDsKCgkJCQkvLyBXZSBuZWVkIHRvIGhhbmRsZSBzZWxlY3QgYm94ZXMgc3BlY2lhbAoJCQkJaWYgKCBqUXVlcnkubm9kZU5hbWUoIGVsZW0sICJzZWxlY3QiICkgKSB7CgkJCQkJdmFyIGluZGV4ID0gZWxlbS5zZWxlY3RlZEluZGV4LAoJCQkJCQl2YWx1ZXMgPSBbXSwKCQkJCQkJb3B0aW9ucyA9IGVsZW0ub3B0aW9ucywKCQkJCQkJb25lID0gZWxlbS50eXBlID09ICJzZWxlY3Qtb25lIjsKCgkJCQkJLy8gTm90aGluZyB3YXMgc2VsZWN0ZWQKCQkJCQlpZiAoIGluZGV4IDwgMCApCgkJCQkJCXJldHVybiBudWxsOwoKCQkJCQkvLyBMb29wIHRocm91Z2ggYWxsIHRoZSBzZWxlY3RlZCBvcHRpb25zCgkJCQkJZm9yICggdmFyIGkgPSBvbmUgPyBpbmRleCA6IDAsIG1heCA9IG9uZSA/IGluZGV4ICsgMSA6IG9wdGlvbnMubGVuZ3RoOyBpIDwgbWF4OyBpKysgKSB7CgkJCQkJCXZhciBvcHRpb24gPSBvcHRpb25zWyBpIF07CgoJCQkJCQlpZiAoIG9wdGlvbi5zZWxlY3RlZCApIHsKCQkJCQkJCS8vIEdldCB0aGUgc3BlY2lmYyB2YWx1ZSBmb3IgdGhlIG9wdGlvbgoJCQkJCQkJdmFsdWUgPSBqUXVlcnkob3B0aW9uKS52YWwoKTsKCgkJCQkJCQkvLyBXZSBkb24ndCBuZWVkIGFuIGFycmF5IGZvciBvbmUgc2VsZWN0cwoJCQkJCQkJaWYgKCBvbmUgKQoJCQkJCQkJCXJldHVybiB2YWx1ZTsKCgkJCQkJCQkvLyBNdWx0aS1TZWxlY3RzIHJldHVybiBhbiBhcnJheQoJCQkJCQkJdmFsdWVzLnB1c2goIHZhbHVlICk7CgkJCQkJCX0KCQkJCQl9CgoJCQkJCXJldHVybiB2YWx1ZXM7CgkJCQl9CgoJCQkJLy8gRXZlcnl0aGluZyBlbHNlLCB3ZSBqdXN0IGdyYWIgdGhlIHZhbHVlCgkJCQlyZXR1cm4gKGVsZW0udmFsdWUgfHwgIiIpLnJlcGxhY2UoL1xyL2csICIiKTsKCgkJCX0KCgkJCXJldHVybiB1bmRlZmluZWQ7CgkJfQoKCQlpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gIm51bWJlciIgKQoJCQl2YWx1ZSArPSAnJzsKCgkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpewoJCQlpZiAoIHRoaXMubm9kZVR5cGUgIT0gMSApCgkJCQlyZXR1cm47CgoJCQlpZiAoIGpRdWVyeS5pc0FycmF5KHZhbHVlKSAmJiAvcmFkaW98Y2hlY2tib3gvLnRlc3QoIHRoaXMudHlwZSApICkKCQkJCXRoaXMuY2hlY2tlZCA9IChqUXVlcnkuaW5BcnJheSh0aGlzLnZhbHVlLCB2YWx1ZSkgPj0gMCB8fAoJCQkJCWpRdWVyeS5pbkFycmF5KHRoaXMubmFtZSwgdmFsdWUpID49IDApOwoKCQkJZWxzZSBpZiAoIGpRdWVyeS5ub2RlTmFtZSggdGhpcywgInNlbGVjdCIgKSApIHsKCQkJCXZhciB2YWx1ZXMgPSBqUXVlcnkubWFrZUFycmF5KHZhbHVlKTsKCgkJCQlqUXVlcnkoICJvcHRpb24iLCB0aGlzICkuZWFjaChmdW5jdGlvbigpewoJCQkJCXRoaXMuc2VsZWN0ZWQgPSAoalF1ZXJ5LmluQXJyYXkoIHRoaXMudmFsdWUsIHZhbHVlcyApID49IDAgfHwKCQkJCQkJalF1ZXJ5LmluQXJyYXkoIHRoaXMudGV4dCwgdmFsdWVzICkgPj0gMCk7CgkJCQl9KTsKCgkJCQlpZiAoICF2YWx1ZXMubGVuZ3RoICkKCQkJCQl0aGlzLnNlbGVjdGVkSW5kZXggPSAtMTsKCgkJCX0gZWxzZQoJCQkJdGhpcy52YWx1ZSA9IHZhbHVlOwoJCX0pOwoJfQp9KTsKCmpRdWVyeS5lYWNoKHsKCXJlbW92ZUF0dHI6IGZ1bmN0aW9uKCBuYW1lICkgewoJCWpRdWVyeS5hdHRyKCB0aGlzLCBuYW1lLCAiIiApOwoJCWlmICh0aGlzLm5vZGVUeXBlID09IDEpCgkJCXRoaXMucmVtb3ZlQXR0cmlidXRlKCBuYW1lICk7Cgl9LAoKCWFkZENsYXNzOiBmdW5jdGlvbiggY2xhc3NOYW1lcyApIHsKCQlqUXVlcnkuY2xhc3NOYW1lLmFkZCggdGhpcywgY2xhc3NOYW1lcyApOwoJfSwKCglyZW1vdmVDbGFzczogZnVuY3Rpb24oIGNsYXNzTmFtZXMgKSB7CgkJalF1ZXJ5LmNsYXNzTmFtZS5yZW1vdmUoIHRoaXMsIGNsYXNzTmFtZXMgKTsKCX0sCgoJdG9nZ2xlQ2xhc3M6IGZ1bmN0aW9uKCBjbGFzc05hbWVzLCBzdGF0ZSApIHsKCQl2YXIgdHlwZSA9IHR5cGVvZiBjbGFzc05hbWVzOwoJCWlmICggdHlwZSA9PT0gInN0cmluZyIgKSB7CgkJCS8vIHRvZ2dsZSBpbmRpdmlkdWFsIGNsYXNzIG5hbWVzCgkJCXZhciBpc0Jvb2wgPSB0eXBlb2Ygc3RhdGUgPT09ICJib29sZWFuIiwgY2xhc3NOYW1lLCBpID0gMCwKCQkJCWNsYXNzTmFtZXMgPSBjbGFzc05hbWVzLnNwbGl0KCAvXHMrLyApOwoJCQl3aGlsZSAoIChjbGFzc05hbWUgPSBjbGFzc05hbWVzWyBpKysgXSkgKSB7CgkJCQkvLyBjaGVjayBlYWNoIGNsYXNzTmFtZSBnaXZlbiwgc3BhY2Ugc2VwZXJhdGVkIGxpc3QKCQkJCXN0YXRlID0gaXNCb29sID8gc3RhdGUgOiAhalF1ZXJ5LmNsYXNzTmFtZS5oYXMoIHRoaXMsIGNsYXNzTmFtZSApOwoJCQkJalF1ZXJ5LmNsYXNzTmFtZVsgc3RhdGUgPyAiYWRkIiA6ICJyZW1vdmUiIF0oIHRoaXMsIGNsYXNzTmFtZSApOwoJCQl9CgkJfSBlbHNlIGlmICggdHlwZSA9PT0gInVuZGVmaW5lZCIgfHwgdHlwZSA9PT0gImJvb2xlYW4iICkgewoJCQlpZiAoIHRoaXMuY2xhc3NOYW1lICkgewoJCQkJLy8gc3RvcmUgY2xhc3NOYW1lIGlmIHNldAoJCQkJalF1ZXJ5LmRhdGEoIHRoaXMsICJfX2NsYXNzTmFtZV9fIiwgdGhpcy5jbGFzc05hbWUgKTsKCQkJfQoJCQkvLyB0b2dnbGUgd2hvbGUgY2xhc3NOYW1lCgkJCXRoaXMuY2xhc3NOYW1lID0gdGhpcy5jbGFzc05hbWUgfHwgY2xhc3NOYW1lcyA9PT0gZmFsc2UgPyAiIiA6IGpRdWVyeS5kYXRhKCB0aGlzLCAiX19jbGFzc05hbWVfXyIgKSB8fCAiIjsKCQl9Cgl9Cn0sIGZ1bmN0aW9uKG5hbWUsIGZuKXsKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oKXsKCQlyZXR1cm4gdGhpcy5lYWNoKCBmbiwgYXJndW1lbnRzICk7Cgl9Owp9KTsKCmpRdWVyeS5leHRlbmQoewoJY2xhc3NOYW1lOiB7CgkJLy8gaW50ZXJuYWwgb25seSwgdXNlIGFkZENsYXNzKCJjbGFzcyIpCgkJYWRkOiBmdW5jdGlvbiggZWxlbSwgY2xhc3NOYW1lcyApIHsKCQkJalF1ZXJ5LmVhY2goKGNsYXNzTmFtZXMgfHwgIiIpLnNwbGl0KC9ccysvKSwgZnVuY3Rpb24oaSwgY2xhc3NOYW1lKXsKCQkJCWlmICggZWxlbS5ub2RlVHlwZSA9PSAxICYmICFqUXVlcnkuY2xhc3NOYW1lLmhhcyggZWxlbS5jbGFzc05hbWUsIGNsYXNzTmFtZSApICkKCQkJCQllbGVtLmNsYXNzTmFtZSArPSAoZWxlbS5jbGFzc05hbWUgPyAiICIgOiAiIikgKyBjbGFzc05hbWU7CgkJCX0pOwoJCX0sCgoJCS8vIGludGVybmFsIG9ubHksIHVzZSByZW1vdmVDbGFzcygiY2xhc3MiKQoJCXJlbW92ZTogZnVuY3Rpb24oIGVsZW0sIGNsYXNzTmFtZXMgKSB7CgkJCWlmIChlbGVtLm5vZGVUeXBlID09IDEpCgkJCQllbGVtLmNsYXNzTmFtZSA9IGNsYXNzTmFtZXMgIT09IHVuZGVmaW5lZCA/CgkJCQkJalF1ZXJ5LmdyZXAoZWxlbS5jbGFzc05hbWUuc3BsaXQoL1xzKy8pLCBmdW5jdGlvbihjbGFzc05hbWUpewoJCQkJCQlyZXR1cm4gIWpRdWVyeS5jbGFzc05hbWUuaGFzKCBjbGFzc05hbWVzLCBjbGFzc05hbWUgKTsKCQkJCQl9KS5qb2luKCIgIikgOgoJCQkJCSIiOwoJCX0sCgoJCS8vIGludGVybmFsIG9ubHksIHVzZSBoYXNDbGFzcygiY2xhc3MiKQoJCWhhczogZnVuY3Rpb24oIGVsZW0sIGNsYXNzTmFtZSApIHsKCQkJcmV0dXJuIGVsZW0gJiYgalF1ZXJ5LmluQXJyYXkoIGNsYXNzTmFtZSwgKGVsZW0uY2xhc3NOYW1lIHx8IGVsZW0pLnRvU3RyaW5nKCkuc3BsaXQoL1xzKy8pICkgPiAtMTsKCQl9Cgl9LAoKCWF0dHI6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCB2YWx1ZSApIHsKCQkvLyBkb24ndCBzZXQgYXR0cmlidXRlcyBvbiB0ZXh0IGFuZCBjb21tZW50IG5vZGVzCgkJaWYgKCFlbGVtIHx8IGVsZW0ubm9kZVR5cGUgPT0gMyB8fCBlbGVtLm5vZGVUeXBlID09IDgpCgkJCXJldHVybiB1bmRlZmluZWQ7CgoJCXZhciBub3R4bWwgPSAhZWxlbS50YWdOYW1lIHx8ICFqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKSwKCQkJLy8gV2hldGhlciB3ZSBhcmUgc2V0dGluZyAob3IgZ2V0dGluZykKCQkJc2V0ID0gdmFsdWUgIT09IHVuZGVmaW5lZDsKCgkJLy8gVHJ5IHRvIG5vcm1hbGl6ZS9maXggdGhlIG5hbWUKCQluYW1lID0gbm90eG1sICYmIGpRdWVyeS5wcm9wc1sgbmFtZSBdIHx8IG5hbWU7CgoJCS8vIE9ubHkgZG8gYWxsIHRoZSBmb2xsb3dpbmcgaWYgdGhpcyBpcyBhIG5vZGUgKGZhc3RlciBmb3Igc3R5bGUpCgkJaWYgKCBlbGVtLnRhZ05hbWUgKSB7CgoJCQkvLyBUaGVzZSBhdHRyaWJ1dGVzIHJlcXVpcmUgc3BlY2lhbCB0cmVhdG1lbnQKCQkJdmFyIHNwZWNpYWwgPSAvaHJlZnxzcmN8c3R5bGUvLnRlc3QoIG5hbWUgKTsKCgkJCS8vIFNhZmFyaSBtaXMtcmVwb3J0cyB0aGUgZGVmYXVsdCBzZWxlY3RlZCBwcm9wZXJ0eSBvZiBhIGhpZGRlbiBvcHRpb24KCQkJLy8gQWNjZXNzaW5nIHRoZSBwYXJlbnQncyBzZWxlY3RlZEluZGV4IHByb3BlcnR5IGZpeGVzIGl0CgkJCWlmICggbmFtZSA9PSAic2VsZWN0ZWQiICYmIGVsZW0ucGFyZW50Tm9kZSApCgkJCQllbGVtLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDsKCgkJCS8vIElmIGFwcGxpY2FibGUsIGFjY2VzcyB0aGUgYXR0cmlidXRlIHZpYSB0aGUgRE9NIDAgd2F5CgkJCWlmICggbmFtZSBpbiBlbGVtICYmIG5vdHhtbCAmJiAhc3BlY2lhbCApIHsKCQkJCWlmICggc2V0ICl7CgkJCQkJLy8gV2UgY2FuJ3QgYWxsb3cgdGhlIHR5cGUgcHJvcGVydHkgdG8gYmUgY2hhbmdlZCAoc2luY2UgaXQgY2F1c2VzIHByb2JsZW1zIGluIElFKQoJCQkJCWlmICggbmFtZSA9PSAidHlwZSIgJiYgZWxlbS5ub2RlTmFtZS5tYXRjaCgvKGJ1dHRvbnxpbnB1dCkvaSkgJiYgZWxlbS5wYXJlbnROb2RlICkKCQkJCQkJdGhyb3cgInR5cGUgcHJvcGVydHkgY2FuJ3QgYmUgY2hhbmdlZCI7CgoJCQkJCWVsZW1bIG5hbWUgXSA9IHZhbHVlOwoJCQkJfQoKCQkJCS8vIGJyb3dzZXJzIGluZGV4IGVsZW1lbnRzIGJ5IGlkL25hbWUgb24gZm9ybXMsIGdpdmUgcHJpb3JpdHkgdG8gYXR0cmlidXRlcy4KCQkJCWlmKCBqUXVlcnkubm9kZU5hbWUoIGVsZW0sICJmb3JtIiApICYmIGVsZW0uZ2V0QXR0cmlidXRlTm9kZShuYW1lKSApCgkJCQkJcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlTm9kZSggbmFtZSApLm5vZGVWYWx1ZTsKCgkJCQkvLyBlbGVtLnRhYkluZGV4IGRvZXNuJ3QgYWx3YXlzIHJldHVybiB0aGUgY29ycmVjdCB2YWx1ZSB3aGVuIGl0IGhhc24ndCBiZWVuIGV4cGxpY2l0bHkgc2V0CgkJCQkvLyBodHRwOi8vZmx1aWRwcm9qZWN0Lm9yZy9ibG9nLzIwMDgvMDEvMDkvZ2V0dGluZy1zZXR0aW5nLWFuZC1yZW1vdmluZy10YWJpbmRleC12YWx1ZXMtd2l0aC1qYXZhc2NyaXB0LwoJCQkJaWYgKCBuYW1lID09ICJ0YWJJbmRleCIgKSB7CgkJCQkJdmFyIGF0dHJpYnV0ZU5vZGUgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoICJ0YWJJbmRleCIgKTsKCQkJCQlyZXR1cm4gYXR0cmlidXRlTm9kZSAmJiBhdHRyaWJ1dGVOb2RlLnNwZWNpZmllZAoJCQkJCQk/IGF0dHJpYnV0ZU5vZGUudmFsdWUKCQkJCQkJOiBlbGVtLm5vZGVOYW1lLm1hdGNoKC8oYnV0dG9ufGlucHV0fG9iamVjdHxzZWxlY3R8dGV4dGFyZWEpL2kpCgkJCQkJCQk/IDAKCQkJCQkJCTogZWxlbS5ub2RlTmFtZS5tYXRjaCgvXihhfGFyZWEpJC9pKSAmJiBlbGVtLmhyZWYKCQkJCQkJCQk/IDAKCQkJCQkJCQk6IHVuZGVmaW5lZDsKCQkJCX0KCgkJCQlyZXR1cm4gZWxlbVsgbmFtZSBdOwoJCQl9CgoJCQlpZiAoICFqUXVlcnkuc3VwcG9ydC5zdHlsZSAmJiBub3R4bWwgJiYgbmFtZSA9PSAic3R5bGUiICkgewoJCQkJaWYgKCBzZXQgKQoJCQkJCWVsZW0uc3R5bGUuY3NzVGV4dCA9ICIiICsgdmFsdWU7CgoJCQkJcmV0dXJuIGVsZW0uc3R5bGUuY3NzVGV4dDsKCQkJfQoKCQkJaWYgKCBzZXQgKQoJCQkJLy8gY29udmVydCB0aGUgdmFsdWUgdG8gYSBzdHJpbmcgKGFsbCBicm93c2VycyBkbyB0aGlzIGJ1dCBJRSkgc2VlICMxMDcwCgkJCQllbGVtLnNldEF0dHJpYnV0ZSggbmFtZSwgIiIgKyB2YWx1ZSApOwoKCQkJdmFyIGF0dHIgPSAhalF1ZXJ5LnN1cHBvcnQuaHJlZk5vcm1hbGl6ZWQgJiYgbm90eG1sICYmIHNwZWNpYWwKCQkJCQkvLyBTb21lIGF0dHJpYnV0ZXMgcmVxdWlyZSBhIHNwZWNpYWwgY2FsbCBvbiBJRQoJCQkJCT8gZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUsIDIgKQoJCQkJCTogZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUgKTsKCgkJCS8vIE5vbi1leGlzdGVudCBhdHRyaWJ1dGVzIHJldHVybiBudWxsLCB3ZSBub3JtYWxpemUgdG8gdW5kZWZpbmVkCgkJCXJldHVybiBhdHRyID09PSBudWxsID8gdW5kZWZpbmVkIDogYXR0cjsKCQl9CgoJCS8vIGVsZW0gaXMgYWN0dWFsbHkgZWxlbS5zdHlsZSAuLi4gc2V0IHRoZSBzdHlsZQoJCS8vIFVzaW5nIGF0dHIgZm9yIHNwZWNpZmljIHN0eWxlIGluZm9ybWF0aW9uIGlzIG5vdyBkZXByZWNhdGVkLiBVc2Ugc3R5bGUgaW5zZWFkLgoJCXJldHVybiBqUXVlcnkuc3R5bGUoZWxlbSwgbmFtZSwgdmFsdWUpOwoJfQp9KTtqUXVlcnkuZm4uZXh0ZW5kKHsKCXRleHQ6IGZ1bmN0aW9uKCB0ZXh0ICkgewoJCWlmICggdHlwZW9mIHRleHQgIT09ICJvYmplY3QiICYmIHRleHQgIT0gbnVsbCApCgkJCXJldHVybiB0aGlzLmVtcHR5KCkuYXBwZW5kKCAodGhpc1swXSAmJiB0aGlzWzBdLm93bmVyRG9jdW1lbnQgfHwgZG9jdW1lbnQpLmNyZWF0ZVRleHROb2RlKCB0ZXh0ICkgKTsKCgkJdmFyIHJldCA9ICIiOwoKCQlqUXVlcnkuZWFjaCggdGV4dCB8fCB0aGlzLCBmdW5jdGlvbigpewoJCQlqUXVlcnkuZWFjaCggdGhpcy5jaGlsZE5vZGVzLCBmdW5jdGlvbigpewoJCQkJaWYgKCB0aGlzLm5vZGVUeXBlICE9IDggKQoJCQkJCXJldCArPSB0aGlzLm5vZGVUeXBlICE9IDEgPwoJCQkJCQl0aGlzLm5vZGVWYWx1ZSA6CgkJCQkJCWpRdWVyeS5mbi50ZXh0KCBbIHRoaXMgXSApOwoJCQl9KTsKCQl9KTsKCgkJcmV0dXJuIHJldDsKCX0sCgoJd3JhcEFsbDogZnVuY3Rpb24oIGh0bWwgKSB7CgkJaWYgKCB0aGlzWzBdICkgewoJCQkvLyBUaGUgZWxlbWVudHMgdG8gd3JhcCB0aGUgdGFyZ2V0IGFyb3VuZAoJCQl2YXIgd3JhcCA9IGpRdWVyeSggaHRtbCwgdGhpc1swXS5vd25lckRvY3VtZW50ICkuY2xvbmUoKTsKCgkJCWlmICggdGhpc1swXS5wYXJlbnROb2RlICkKCQkJCXdyYXAuaW5zZXJ0QmVmb3JlKCB0aGlzWzBdICk7CgoJCQl3cmFwLm1hcChmdW5jdGlvbigpewoJCQkJdmFyIGVsZW0gPSB0aGlzOwoKCQkJCXdoaWxlICggZWxlbS5maXJzdENoaWxkICkKCQkJCQllbGVtID0gZWxlbS5maXJzdENoaWxkOwoKCQkJCXJldHVybiBlbGVtOwoJCQl9KS5hcHBlbmQodGhpcyk7CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCgoJd3JhcElubmVyOiBmdW5jdGlvbiggaHRtbCApIHsKCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7CgkJCWpRdWVyeSggdGhpcyApLmNvbnRlbnRzKCkud3JhcEFsbCggaHRtbCApOwoJCX0pOwoJfSwKCgl3cmFwOiBmdW5jdGlvbiggaHRtbCApIHsKCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7CgkJCWpRdWVyeSggdGhpcyApLndyYXBBbGwoIGh0bWwgKTsKCQl9KTsKCX0sCgoJYXBwZW5kOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsIHRydWUsIGZ1bmN0aW9uKGVsZW0pewoJCQlpZiAodGhpcy5ub2RlVHlwZSA9PSAxKQoJCQkJdGhpcy5hcHBlbmRDaGlsZCggZWxlbSApOwoJCX0pOwoJfSwKCglwcmVwZW5kOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsIHRydWUsIGZ1bmN0aW9uKGVsZW0pewoJCQlpZiAodGhpcy5ub2RlVHlwZSA9PSAxKQoJCQkJdGhpcy5pbnNlcnRCZWZvcmUoIGVsZW0sIHRoaXMuZmlyc3RDaGlsZCApOwoJCX0pOwoJfSwKCgliZWZvcmU6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cywgZmFsc2UsIGZ1bmN0aW9uKGVsZW0pewoJCQl0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKCBlbGVtLCB0aGlzICk7CgkJfSk7Cgl9LAoKCWFmdGVyOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsIGZhbHNlLCBmdW5jdGlvbihlbGVtKXsKCQkJdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSggZWxlbSwgdGhpcy5uZXh0U2libGluZyApOwoJCX0pOwoJfSwKCgljbG9uZTogZnVuY3Rpb24oIGV2ZW50cyApIHsKCQkvLyBEbyB0aGUgY2xvbmUKCQl2YXIgcmV0ID0gdGhpcy5tYXAoZnVuY3Rpb24oKXsKCQkJaWYgKCAhalF1ZXJ5LnN1cHBvcnQubm9DbG9uZUV2ZW50ICYmICFqUXVlcnkuaXNYTUxEb2ModGhpcykgKSB7CgkJCQkvLyBJRSBjb3BpZXMgZXZlbnRzIGJvdW5kIHZpYSBhdHRhY2hFdmVudCB3aGVuCgkJCQkvLyB1c2luZyBjbG9uZU5vZGUuIENhbGxpbmcgZGV0YWNoRXZlbnQgb24gdGhlCgkJCQkvLyBjbG9uZSB3aWxsIGFsc28gcmVtb3ZlIHRoZSBldmVudHMgZnJvbSB0aGUgb3JpZ25hbAoJCQkJLy8gSW4gb3JkZXIgdG8gZ2V0IGFyb3VuZCB0aGlzLCB3ZSB1c2UgaW5uZXJIVE1MLgoJCQkJLy8gVW5mb3J0dW5hdGVseSwgdGhpcyBtZWFucyBzb21lIG1vZGlmaWNhdGlvbnMgdG8KCQkJCS8vIGF0dHJpYnV0ZXMgaW4gSUUgdGhhdCBhcmUgYWN0dWFsbHkgb25seSBzdG9yZWQKCQkJCS8vIGFzIHByb3BlcnRpZXMgd2lsbCBub3QgYmUgY29waWVkIChzdWNoIGFzIHRoZQoJCQkJLy8gdGhlIG5hbWUgYXR0cmlidXRlIG9uIGFuIGlucHV0KS4KCQkJCXZhciBodG1sID0gdGhpcy5vdXRlckhUTUwsIG93bmVyRG9jdW1lbnQgPSB0aGlzLm93bmVyRG9jdW1lbnQ7CgkJCQlpZiAoICFodG1sICkgewoJCQkJCXZhciBkaXYgPSBvd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwoJCQkJCWRpdi5hcHBlbmRDaGlsZCggdGhpcy5jbG9uZU5vZGUodHJ1ZSkgKTsKCQkJCQlodG1sID0gZGl2LmlubmVySFRNTDsKCQkJCX0KCgkJCQlyZXR1cm4galF1ZXJ5LmNsZWFuKFtodG1sLnJlcGxhY2UoLyBqUXVlcnlcZCs9Iig/OlxkK3xudWxsKSIvZywgIiIpLnJlcGxhY2UoL15ccyovLCAiIildLCBvd25lckRvY3VtZW50KVswXTsKCQkJfSBlbHNlCgkJCQlyZXR1cm4gdGhpcy5jbG9uZU5vZGUodHJ1ZSk7CgkJfSk7CgoJCS8vIENvcHkgdGhlIGV2ZW50cyBmcm9tIHRoZSBvcmlnaW5hbCB0byB0aGUgY2xvbmUKCQlpZiAoIGV2ZW50cyA9PT0gdHJ1ZSApIHsKCQkJdmFyIG9yaWcgPSB0aGlzLmZpbmQoIioiKS5hbmRTZWxmKCksIGkgPSAwOwoKCQkJcmV0LmZpbmQoIioiKS5hbmRTZWxmKCkuZWFjaChmdW5jdGlvbigpewoJCQkJaWYgKCB0aGlzLm5vZGVOYW1lICE9PSBvcmlnW2ldLm5vZGVOYW1lICkKCQkJCQlyZXR1cm47CgoJCQkJdmFyIGV2ZW50cyA9IGpRdWVyeS5kYXRhKCBvcmlnW2ldLCAiZXZlbnRzIiApOwoKCQkJCWZvciAoIHZhciB0eXBlIGluIGV2ZW50cyApIHsKCQkJCQlmb3IgKCB2YXIgaGFuZGxlciBpbiBldmVudHNbIHR5cGUgXSApIHsKCQkJCQkJalF1ZXJ5LmV2ZW50LmFkZCggdGhpcywgdHlwZSwgZXZlbnRzWyB0eXBlIF1bIGhhbmRsZXIgXSwgZXZlbnRzWyB0eXBlIF1bIGhhbmRsZXIgXS5kYXRhICk7CgkJCQkJfQoJCQkJfQoKCQkJCWkrKzsKCQkJfSk7CgkJfQoKCQkvLyBSZXR1cm4gdGhlIGNsb25lZCBzZXQKCQlyZXR1cm4gcmV0OwoJfSwKCglodG1sOiBmdW5jdGlvbiggdmFsdWUgKSB7CgkJcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgPwoJCQkodGhpc1swXSA/CgkJCQl0aGlzWzBdLmlubmVySFRNTC5yZXBsYWNlKC8galF1ZXJ5XGQrPSIoPzpcZCt8bnVsbCkiL2csICIiKSA6CgkJCQludWxsKSA6CgkJCXRoaXMuZW1wdHkoKS5hcHBlbmQoIHZhbHVlICk7Cgl9LAoKCXJlcGxhY2VXaXRoOiBmdW5jdGlvbiggdmFsdWUgKSB7CgkJcmV0dXJuIHRoaXMuYWZ0ZXIoIHZhbHVlICkucmVtb3ZlKCk7Cgl9LAoKCWRvbU1hbmlwOiBmdW5jdGlvbiggYXJncywgdGFibGUsIGNhbGxiYWNrICkgewoJCWlmICggdGhpc1swXSApIHsKCQkJdmFyIGZyYWdtZW50ID0gKHRoaXNbMF0ub3duZXJEb2N1bWVudCB8fCB0aGlzWzBdKS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksCgkJCQlzY3JpcHRzID0galF1ZXJ5LmNsZWFuKCBhcmdzLCAodGhpc1swXS5vd25lckRvY3VtZW50IHx8IHRoaXNbMF0pLCBmcmFnbWVudCApLAoJCQkJZmlyc3QgPSBmcmFnbWVudC5maXJzdENoaWxkOwoKCQkJaWYgKCBmaXJzdCApCgkJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLmxlbmd0aDsgaSA8IGw7IGkrKyApCgkJCQkJY2FsbGJhY2suY2FsbCggcm9vdCh0aGlzW2ldLCBmaXJzdCksIHRoaXMubGVuZ3RoID4gMSB8fCBpID4gMCA/CgkJCQkJCQlmcmFnbWVudC5jbG9uZU5vZGUodHJ1ZSkgOiBmcmFnbWVudCApOwoKCQkJaWYgKCBzY3JpcHRzICkKCQkJCWpRdWVyeS5lYWNoKCBzY3JpcHRzLCBldmFsU2NyaXB0ICk7CgkJfQoKCQlyZXR1cm4gdGhpczsKCgkJZnVuY3Rpb24gcm9vdCggZWxlbSwgY3VyICkgewoJCQlyZXR1cm4gdGFibGUgJiYgalF1ZXJ5Lm5vZGVOYW1lKGVsZW0sICJ0YWJsZSIpICYmIGpRdWVyeS5ub2RlTmFtZShjdXIsICJ0ciIpID8KCQkJCShlbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0Ym9keSIpWzBdIHx8CgkJCQllbGVtLmFwcGVuZENoaWxkKGVsZW0ub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0Ym9keSIpKSkgOgoJCQkJZWxlbTsKCQl9Cgl9Cn0pOwoKalF1ZXJ5LmVhY2goewoJYXBwZW5kVG86ICJhcHBlbmQiLAoJcHJlcGVuZFRvOiAicHJlcGVuZCIsCglpbnNlcnRCZWZvcmU6ICJiZWZvcmUiLAoJaW5zZXJ0QWZ0ZXI6ICJhZnRlciIsCglyZXBsYWNlQWxsOiAicmVwbGFjZVdpdGgiCn0sIGZ1bmN0aW9uKG5hbWUsIG9yaWdpbmFsKXsKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXZhciByZXQgPSBbXSwgaW5zZXJ0ID0galF1ZXJ5KCBzZWxlY3RvciApOwoKCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBpbnNlcnQubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCQl2YXIgZWxlbXMgPSAoaSA+IDAgPyB0aGlzLmNsb25lKHRydWUpIDogdGhpcykuZ2V0KCk7CgkJCWpRdWVyeS5mblsgb3JpZ2luYWwgXS5hcHBseSggalF1ZXJ5KGluc2VydFtpXSksIGVsZW1zICk7CgkJCXJldCA9IHJldC5jb25jYXQoIGVsZW1zICk7CgkJfQoKCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHJldCwgbmFtZSwgc2VsZWN0b3IgKTsKCX07Cn0pOwoKalF1ZXJ5LmVhY2goewoJcmVtb3ZlOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJaWYgKCAhc2VsZWN0b3IgfHwgalF1ZXJ5Lm11bHRpRmlsdGVyKCBzZWxlY3RvciwgWyB0aGlzIF0gKS5sZW5ndGggKSB7CgkJCWlmICggdGhpcy5ub2RlVHlwZSA9PT0gMSApIHsKCQkJCWNsZWFuRGF0YSggalF1ZXJ5KCIqIiwgdGhpcykuYWRkKHRoaXMpICk7CgkJCX0KCgkJCWlmICggdGhpcy5wYXJlbnROb2RlICkgewoJCQkJdGhpcy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCB0aGlzICk7CgkJCX0KCQl9Cgl9LAoKCWVtcHR5OiBmdW5jdGlvbigpIHsKCQkvLyBSZW1vdmUgZWxlbWVudCBub2RlcyBhbmQgcHJldmVudCBtZW1vcnkgbGVha3MKCQlpZiAoIHRoaXMubm9kZVR5cGUgPT09IDEgKSB7CgkJCWNsZWFuRGF0YSggalF1ZXJ5KCIqIiwgdGhpcykgKTsKCQl9CgoJCS8vIFJlbW92ZSBhbnkgcmVtYWluaW5nIG5vZGVzCgkJd2hpbGUgKCB0aGlzLmZpcnN0Q2hpbGQgKSB7CgkJCXRoaXMucmVtb3ZlQ2hpbGQoIHRoaXMuZmlyc3RDaGlsZCApOwoJCX0KCX0KfSwgZnVuY3Rpb24obmFtZSwgZm4pewoJalF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbigpewoJCXJldHVybiB0aGlzLmVhY2goIGZuLCBhcmd1bWVudHMgKTsKCX07Cn0pOwoKalF1ZXJ5LmV4dGVuZCh7CgljbGVhbjogZnVuY3Rpb24oIGVsZW1zLCBjb250ZXh0LCBmcmFnbWVudCApIHsKCQljb250ZXh0ID0gY29udGV4dCB8fCBkb2N1bWVudDsKCgkJLy8gIWNvbnRleHQuY3JlYXRlRWxlbWVudCBmYWlscyBpbiBJRSB3aXRoIGFuIGVycm9yIGJ1dCByZXR1cm5zIHR5cGVvZiAnb2JqZWN0JwoJCWlmICggdHlwZW9mIGNvbnRleHQuY3JlYXRlRWxlbWVudCA9PT0gInVuZGVmaW5lZCIgKQoJCQljb250ZXh0ID0gY29udGV4dC5vd25lckRvY3VtZW50IHx8IGNvbnRleHRbMF0gJiYgY29udGV4dFswXS5vd25lckRvY3VtZW50IHx8IGRvY3VtZW50OwoKCQkvLyBJZiBhIHNpbmdsZSBzdHJpbmcgaXMgcGFzc2VkIGluIGFuZCBpdCdzIGEgc2luZ2xlIHRhZwoJCS8vIGp1c3QgZG8gYSBjcmVhdGVFbGVtZW50IGFuZCBza2lwIHRoZSByZXN0CgkJaWYgKCAhZnJhZ21lbnQgJiYgZWxlbXMubGVuZ3RoID09PSAxICYmIHR5cGVvZiBlbGVtc1swXSA9PT0gInN0cmluZyIgKSB7CgkJCXZhciBtYXRjaCA9IC9ePChcdyspXHMqXC8/PiQvLmV4ZWMoZWxlbXNbMF0pOwoJCQlpZiAoIG1hdGNoICkKCQkJCXJldHVybiBbIGNvbnRleHQuY3JlYXRlRWxlbWVudCggbWF0Y2hbMV0gKSBdOwoJCX0KCgkJdmFyIHJldCA9IFtdLCBzY3JpcHRzID0gW10sIGRpdiA9IGNvbnRleHQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CgoJCWpRdWVyeS5lYWNoKGVsZW1zLCBmdW5jdGlvbihpLCBlbGVtKXsKCQkJaWYgKCB0eXBlb2YgZWxlbSA9PT0gIm51bWJlciIgKQoJCQkJZWxlbSArPSAnJzsKCgkJCWlmICggIWVsZW0gKQoJCQkJcmV0dXJuOwoKCQkJLy8gQ29udmVydCBodG1sIHN0cmluZyBpbnRvIERPTSBub2RlcwoJCQlpZiAoIHR5cGVvZiBlbGVtID09PSAic3RyaW5nIiApIHsKCQkJCS8vIEZpeCAiWEhUTUwiLXN0eWxlIHRhZ3MgaW4gYWxsIGJyb3dzZXJzCgkJCQllbGVtID0gZWxlbS5yZXBsYWNlKC8oPChcdyspW14+XSo/KVwvPi9nLCBmdW5jdGlvbihhbGwsIGZyb250LCB0YWcpewoJCQkJCXJldHVybiB0YWcubWF0Y2goL14oYWJicnxicnxjb2x8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJhbXxocnxhcmVhfGVtYmVkKSQvaSkgPwoJCQkJCQlhbGwgOgoJCQkJCQlmcm9udCArICI+PC8iICsgdGFnICsgIj4iOwoJCQkJfSk7CgoJCQkJLy8gVHJpbSB3aGl0ZXNwYWNlLCBvdGhlcndpc2UgaW5kZXhPZiB3b24ndCB3b3JrIGFzIGV4cGVjdGVkCgkJCQl2YXIgdGFncyA9IGVsZW0ucmVwbGFjZSgvXlxzKy8sICIiKS5zdWJzdHJpbmcoMCwgMTApLnRvTG93ZXJDYXNlKCk7CgoJCQkJdmFyIHdyYXAgPQoJCQkJCS8vIG9wdGlvbiBvciBvcHRncm91cAoJCQkJCSF0YWdzLmluZGV4T2YoIjxvcHQiKSAmJgoJCQkJCVsgMSwgIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz4iLCAiPC9zZWxlY3Q+IiBdIHx8CgoJCQkJCSF0YWdzLmluZGV4T2YoIjxsZWciKSAmJgoJCQkJCVsgMSwgIjxmaWVsZHNldD4iLCAiPC9maWVsZHNldD4iIF0gfHwKCgkJCQkJdGFncy5tYXRjaCgvXjwodGhlYWR8dGJvZHl8dGZvb3R8Y29sZ3xjYXApLykgJiYKCQkJCQlbIDEsICI8dGFibGU+IiwgIjwvdGFibGU+IiBdIHx8CgoJCQkJCSF0YWdzLmluZGV4T2YoIjx0ciIpICYmCgkJCQkJWyAyLCAiPHRhYmxlPjx0Ym9keT4iLCAiPC90Ym9keT48L3RhYmxlPiIgXSB8fAoKCQkJCSAJLy8gPHRoZWFkPiBtYXRjaGVkIGFib3ZlCgkJCQkJKCF0YWdzLmluZGV4T2YoIjx0ZCIpIHx8ICF0YWdzLmluZGV4T2YoIjx0aCIpKSAmJgoJCQkJCVsgMywgIjx0YWJsZT48dGJvZHk+PHRyPiIsICI8L3RyPjwvdGJvZHk+PC90YWJsZT4iIF0gfHwKCgkJCQkJIXRhZ3MuaW5kZXhPZigiPGNvbCIpICYmCgkJCQkJWyAyLCAiPHRhYmxlPjx0Ym9keT48L3Rib2R5Pjxjb2xncm91cD4iLCAiPC9jb2xncm91cD48L3RhYmxlPiIgXSB8fAoKCQkJCQkvLyBJRSBjYW4ndCBzZXJpYWxpemUgPGxpbms+IGFuZCA8c2NyaXB0PiB0YWdzIG5vcm1hbGx5CgkJCQkJIWpRdWVyeS5zdXBwb3J0Lmh0bWxTZXJpYWxpemUgJiYKCQkJCQlbIDEsICJkaXY8ZGl2PiIsICI8L2Rpdj4iIF0gfHwKCgkJCQkJWyAwLCAiIiwgIiIgXTsKCgkJCQkvLyBHbyB0byBodG1sIGFuZCBiYWNrLCB0aGVuIHBlZWwgb2ZmIGV4dHJhIHdyYXBwZXJzCgkJCQlkaXYuaW5uZXJIVE1MID0gd3JhcFsxXSArIGVsZW0gKyB3cmFwWzJdOwoKCQkJCS8vIE1vdmUgdG8gdGhlIHJpZ2h0IGRlcHRoCgkJCQl3aGlsZSAoIHdyYXBbMF0tLSApCgkJCQkJZGl2ID0gZGl2Lmxhc3RDaGlsZDsKCgkJCQkvLyBSZW1vdmUgSUUncyBhdXRvaW5zZXJ0ZWQgPHRib2R5PiBmcm9tIHRhYmxlIGZyYWdtZW50cwoJCQkJaWYgKCAhalF1ZXJ5LnN1cHBvcnQudGJvZHkgKSB7CgoJCQkJCS8vIFN0cmluZyB3YXMgYSA8dGFibGU+LCAqbWF5KiBoYXZlIHNwdXJpb3VzIDx0Ym9keT4KCQkJCQl2YXIgaGFzQm9keSA9IC88dGJvZHkvaS50ZXN0KGVsZW0pLAoJCQkJCQl0Ym9keSA9ICF0YWdzLmluZGV4T2YoIjx0YWJsZSIpICYmICFoYXNCb2R5ID8KCQkJCQkJCWRpdi5maXJzdENoaWxkICYmIGRpdi5maXJzdENoaWxkLmNoaWxkTm9kZXMgOgoKCQkJCQkJLy8gU3RyaW5nIHdhcyBhIGJhcmUgPHRoZWFkPiBvciA8dGZvb3Q+CgkJCQkJCXdyYXBbMV0gPT0gIjx0YWJsZT4iICYmICFoYXNCb2R5ID8KCQkJCQkJCWRpdi5jaGlsZE5vZGVzIDoKCQkJCQkJCVtdOwoKCQkJCQlmb3IgKCB2YXIgaiA9IHRib2R5Lmxlbmd0aCAtIDE7IGogPj0gMCA7IC0taiApCgkJCQkJCWlmICggalF1ZXJ5Lm5vZGVOYW1lKCB0Ym9keVsgaiBdLCAidGJvZHkiICkgJiYgIXRib2R5WyBqIF0uY2hpbGROb2Rlcy5sZW5ndGggKQoJCQkJCQkJdGJvZHlbIGogXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCB0Ym9keVsgaiBdICk7CgoJCQkJCX0KCgkJCQkvLyBJRSBjb21wbGV0ZWx5IGtpbGxzIGxlYWRpbmcgd2hpdGVzcGFjZSB3aGVuIGlubmVySFRNTCBpcyB1c2VkCgkJCQlpZiAoICFqUXVlcnkuc3VwcG9ydC5sZWFkaW5nV2hpdGVzcGFjZSAmJiAvXlxzLy50ZXN0KCBlbGVtICkgKQoJCQkJCWRpdi5pbnNlcnRCZWZvcmUoIGNvbnRleHQuY3JlYXRlVGV4dE5vZGUoIGVsZW0ubWF0Y2goL15ccyovKVswXSApLCBkaXYuZmlyc3RDaGlsZCApOwoKCQkJCWVsZW0gPSBqUXVlcnkubWFrZUFycmF5KCBkaXYuY2hpbGROb2RlcyApOwoJCQl9CgoJCQlpZiAoIGVsZW0ubm9kZVR5cGUgKQoJCQkJcmV0LnB1c2goIGVsZW0gKTsKCQkJZWxzZQoJCQkJcmV0ID0galF1ZXJ5Lm1lcmdlKCByZXQsIGVsZW0gKTsKCgkJfSk7CgoJCWlmICggZnJhZ21lbnQgKSB7CgkJCWZvciAoIHZhciBpID0gMDsgcmV0W2ldOyBpKysgKSB7CgkJCQlpZiAoIGpRdWVyeS5ub2RlTmFtZSggcmV0W2ldLCAic2NyaXB0IiApICYmICghcmV0W2ldLnR5cGUgfHwgcmV0W2ldLnR5cGUudG9Mb3dlckNhc2UoKSA9PT0gInRleHQvamF2YXNjcmlwdCIpICkgewoJCQkJCXNjcmlwdHMucHVzaCggcmV0W2ldLnBhcmVudE5vZGUgPyByZXRbaV0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggcmV0W2ldICkgOiByZXRbaV0gKTsKCQkJCX0gZWxzZSB7CgkJCQkJaWYgKCByZXRbaV0ubm9kZVR5cGUgPT09IDEgKQoJCQkJCQlyZXQuc3BsaWNlLmFwcGx5KCByZXQsIFtpICsgMSwgMF0uY29uY2F0KGpRdWVyeS5tYWtlQXJyYXkocmV0W2ldLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKSkpICk7CgkJCQkJZnJhZ21lbnQuYXBwZW5kQ2hpbGQoIHJldFtpXSApOwoJCQkJfQoJCQl9CgoJCQlyZXR1cm4gc2NyaXB0czsKCQl9CgoJCXJldHVybiByZXQ7Cgl9Cn0pOwoKZnVuY3Rpb24gY2xlYW5EYXRhKCBlbGVtcyApIHsKCWZvciAoIHZhciBpID0gMCwgbCA9IGVsZW1zLmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKCQl2YXIgaWQgPSBlbGVtc1tpXVtleHBhbmRvXTsKCQlpZiAoIGlkICkgewoJCQlkZWxldGUgalF1ZXJ5LmNhY2hlWyBpZCBdOwoJCX0KCX0KfQovKgogKiBBIG51bWJlciBvZiBoZWxwZXIgZnVuY3Rpb25zIHVzZWQgZm9yIG1hbmFnaW5nIGV2ZW50cy4KICogTWFueSBvZiB0aGUgaWRlYXMgYmVoaW5kIHRoaXMgY29kZSBvcmlnaW5hdGVkIGZyb20KICogRGVhbiBFZHdhcmRzJyBhZGRFdmVudCBsaWJyYXJ5LgogKi8KalF1ZXJ5LmV2ZW50ID0gewoKCS8vIEJpbmQgYW4gZXZlbnQgdG8gYW4gZWxlbWVudAoJLy8gT3JpZ2luYWwgYnkgRGVhbiBFZHdhcmRzCglhZGQ6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlcywgaGFuZGxlciwgZGF0YSApIHsKCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PT0gOCApIHsKCQkJcmV0dXJuOwoJCX0KCgkJLy8gRm9yIHdoYXRldmVyIHJlYXNvbiwgSUUgaGFzIHRyb3VibGUgcGFzc2luZyB0aGUgd2luZG93IG9iamVjdAoJCS8vIGFyb3VuZCwgY2F1c2luZyBpdCB0byBiZSBjbG9uZWQgaW4gdGhlIHByb2Nlc3MKCQlpZiAoIGVsZW0uc2V0SW50ZXJ2YWwgJiYgKCBlbGVtICE9PSB3aW5kb3cgJiYgIWVsZW0uZnJhbWVFbGVtZW50ICkgKSB7CgkJCWVsZW0gPSB3aW5kb3c7CgkJfQoKCQkvLyBNYWtlIHN1cmUgdGhhdCB0aGUgZnVuY3Rpb24gYmVpbmcgZXhlY3V0ZWQgaGFzIGEgdW5pcXVlIElECgkJaWYgKCAhaGFuZGxlci5ndWlkICkgewoJCQloYW5kbGVyLmd1aWQgPSB0aGlzLmd1aWQrKzsKCQl9CgoJCS8vIGlmIGRhdGEgaXMgcGFzc2VkLCBiaW5kIHRvIGhhbmRsZXIKCQlpZiAoIGRhdGEgIT09IHVuZGVmaW5lZCApIHsKCQkJLy8gQ3JlYXRlIHRlbXBvcmFyeSBmdW5jdGlvbiBwb2ludGVyIHRvIG9yaWdpbmFsIGhhbmRsZXIKCQkJdmFyIGZuID0gaGFuZGxlcjsKCgkJCS8vIENyZWF0ZSB1bmlxdWUgaGFuZGxlciBmdW5jdGlvbiwgd3JhcHBlZCBhcm91bmQgb3JpZ2luYWwgaGFuZGxlcgoJCQloYW5kbGVyID0gdGhpcy5wcm94eSggZm4gKTsKCgkJCS8vIFN0b3JlIGRhdGEgaW4gdW5pcXVlIGhhbmRsZXIKCQkJaGFuZGxlci5kYXRhID0gZGF0YTsKCQl9CgoJCS8vIEluaXQgdGhlIGVsZW1lbnQncyBldmVudCBzdHJ1Y3R1cmUKCQl2YXIgZXZlbnRzID0galF1ZXJ5LmRhdGEoIGVsZW0sICJldmVudHMiICkgfHwgalF1ZXJ5LmRhdGEoIGVsZW0sICJldmVudHMiLCB7fSApLAoJCQloYW5kbGUgPSBqUXVlcnkuZGF0YSggZWxlbSwgImhhbmRsZSIgKSB8fCBqUXVlcnkuZGF0YSggZWxlbSwgImhhbmRsZSIsIGZ1bmN0aW9uKCkgewoJCQkJLy8gSGFuZGxlIHRoZSBzZWNvbmQgZXZlbnQgb2YgYSB0cmlnZ2VyIGFuZCB3aGVuCgkJCQkvLyBhbiBldmVudCBpcyBjYWxsZWQgYWZ0ZXIgYSBwYWdlIGhhcyB1bmxvYWRlZAoJCQkJcmV0dXJuIHR5cGVvZiBqUXVlcnkgIT09ICJ1bmRlZmluZWQiICYmICFqUXVlcnkuZXZlbnQudHJpZ2dlcmVkID8KCQkJCQlqUXVlcnkuZXZlbnQuaGFuZGxlLmFwcGx5KCBhcmd1bWVudHMuY2FsbGVlLmVsZW0sIGFyZ3VtZW50cyApIDoKCQkJCQl1bmRlZmluZWQ7CgkJCX0pOwoJCS8vIEFkZCBlbGVtIGFzIGEgcHJvcGVydHkgb2YgdGhlIGhhbmRsZSBmdW5jdGlvbgoJCS8vIFRoaXMgaXMgdG8gcHJldmVudCBhIG1lbW9yeSBsZWFrIHdpdGggbm9uLW5hdGl2ZQoJCS8vIGV2ZW50IGluIElFLgoJCWhhbmRsZS5lbGVtID0gZWxlbTsKCgkJLy8gSGFuZGxlIG11bHRpcGxlIGV2ZW50cyBzZXBhcmF0ZWQgYnkgYSBzcGFjZQoJCS8vIGpRdWVyeSguLi4pLmJpbmQoIm1vdXNlb3ZlciBtb3VzZW91dCIsIGZuKTsKCQl0eXBlcyA9IHR5cGVzLnNwbGl0KCAvXHMrLyApOwoJCXZhciB0eXBlLCBpPTA7CgkJd2hpbGUgKCAodHlwZSA9IHR5cGVzWyBpKysgXSkgKSB7CgkJCS8vIE5hbWVzcGFjZWQgZXZlbnQgaGFuZGxlcnMKCQkJdmFyIG5hbWVzcGFjZXMgPSB0eXBlLnNwbGl0KCIuIik7CgkJCXR5cGUgPSBuYW1lc3BhY2VzLnNoaWZ0KCk7CgkJCWhhbmRsZXIudHlwZSA9IG5hbWVzcGFjZXMuc2xpY2UoKS5zb3J0KCkuam9pbigiLiIpOwoKCQkJLy8gR2V0IHRoZSBjdXJyZW50IGxpc3Qgb2YgZnVuY3Rpb25zIGJvdW5kIHRvIHRoaXMgZXZlbnQKCQkJdmFyIGhhbmRsZXJzID0gZXZlbnRzWyB0eXBlIF0sCgkJCQlzcGVjaWFsID0gdGhpcy5zcGVjaWFsWyB0eXBlIF0gfHwge307CgoJCQlpZiAoIHNwZWNpYWwuYWRkICkgewoJCQkJdmFyIG1vZGlmaWVkSGFuZGxlciA9IHNwZWNpYWwuYWRkLmNhbGwoIGVsZW0sIGhhbmRsZXIsIGRhdGEsIG5hbWVzcGFjZXMgKTsKCQkJCWlmICggbW9kaWZpZWRIYW5kbGVyICYmIGpRdWVyeS5pc0Z1bmN0aW9uKCBtb2RpZmllZEhhbmRsZXIgKSApIHsKCQkJCQltb2RpZmllZEhhbmRsZXIuZ3VpZCA9IG1vZGlmaWVkSGFuZGxlci5ndWlkIHx8IGhhbmRsZXIuZ3VpZDsKCQkJCQloYW5kbGVyID0gbW9kaWZpZWRIYW5kbGVyOwoJCQkJfQoJCQl9CgoJCQkvLyBJbml0IHRoZSBldmVudCBoYW5kbGVyIHF1ZXVlCgkJCWlmICggIWhhbmRsZXJzICkgewoJCQkJaGFuZGxlcnMgPSBldmVudHNbIHR5cGUgXSA9IHt9OwoKCQkJCS8vIENoZWNrIGZvciBhIHNwZWNpYWwgZXZlbnQgaGFuZGxlcgoJCQkJLy8gT25seSB1c2UgYWRkRXZlbnRMaXN0ZW5lci9hdHRhY2hFdmVudCBpZiB0aGUgc3BlY2lhbAoJCQkJLy8gZXZlbnRzIGhhbmRsZXIgcmV0dXJucyBmYWxzZQoJCQkJaWYgKCAhc3BlY2lhbC5zZXR1cCB8fCBzcGVjaWFsLnNldHVwLmNhbGwoIGVsZW0sIGRhdGEsIG5hbWVzcGFjZXMgKSA9PT0gZmFsc2UgKSB7CgkJCQkJLy8gQmluZCB0aGUgZ2xvYmFsIGV2ZW50IGhhbmRsZXIgdG8gdGhlIGVsZW1lbnQKCQkJCQlpZiAoIGVsZW0uYWRkRXZlbnRMaXN0ZW5lciApIHsKCQkJCQkJZWxlbS5hZGRFdmVudExpc3RlbmVyKCB0eXBlLCBoYW5kbGUsIGZhbHNlICk7CgkJCQkJfSBlbHNlIGlmICggZWxlbS5hdHRhY2hFdmVudCApIHsKCQkJCQkJZWxlbS5hdHRhY2hFdmVudCggIm9uIiArIHR5cGUsIGhhbmRsZSApOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJLy8gQWRkIHRoZSBmdW5jdGlvbiB0byB0aGUgZWxlbWVudCdzIGhhbmRsZXIgbGlzdAoJCQloYW5kbGVyc1sgaGFuZGxlci5ndWlkIF0gPSBoYW5kbGVyOwoKCQkJLy8gS2VlcCB0cmFjayBvZiB3aGljaCBldmVudHMgaGF2ZSBiZWVuIHVzZWQsIGZvciBnbG9iYWwgdHJpZ2dlcmluZwoJCQl0aGlzLmdsb2JhbFsgdHlwZSBdID0gdHJ1ZTsKCQl9CgoJCS8vIE51bGxpZnkgZWxlbSB0byBwcmV2ZW50IG1lbW9yeSBsZWFrcyBpbiBJRQoJCWVsZW0gPSBudWxsOwoJfSwKCglndWlkOiAxLAoJZ2xvYmFsOiB7fSwKCgkvLyBEZXRhY2ggYW4gZXZlbnQgb3Igc2V0IG9mIGV2ZW50cyBmcm9tIGFuIGVsZW1lbnQKCXJlbW92ZTogZnVuY3Rpb24oIGVsZW0sIHR5cGVzLCBoYW5kbGVyICkgewoJCS8vIGRvbid0IGRvIGV2ZW50cyBvbiB0ZXh0IGFuZCBjb21tZW50IG5vZGVzCgkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAzIHx8IGVsZW0ubm9kZVR5cGUgPT09IDggKSB7CgkJCXJldHVybjsKCQl9CgoJCXZhciBldmVudHMgPSBqUXVlcnkuZGF0YSggZWxlbSwgImV2ZW50cyIgKSwgcmV0LCB0eXBlOwoKCQlpZiAoIGV2ZW50cyApIHsKCQkJLy8gVW5iaW5kIGFsbCBldmVudHMgZm9yIHRoZSBlbGVtZW50CgkJCWlmICggdHlwZXMgPT09IHVuZGVmaW5lZCB8fCAodHlwZW9mIHR5cGVzID09PSAic3RyaW5nIiAmJiB0eXBlcy5jaGFyQXQoMCkgPT09ICIuIikgKSB7CgkJCQlmb3IgKCB0eXBlIGluIGV2ZW50cyApIHsKCQkJCQl0aGlzLnJlbW92ZSggZWxlbSwgdHlwZSArICh0eXBlcyB8fCAiIikgKTsKCQkJCX0KCQkJfSBlbHNlIHsKCQkJCS8vIHR5cGVzIGlzIGFjdHVhbGx5IGFuIGV2ZW50IG9iamVjdCBoZXJlCgkJCQlpZiAoIHR5cGVzLnR5cGUgKSB7CgkJCQkJaGFuZGxlciA9IHR5cGVzLmhhbmRsZXI7CgkJCQkJdHlwZXMgPSB0eXBlcy50eXBlOwoJCQkJfQoKCQkJCS8vIEhhbmRsZSBtdWx0aXBsZSBldmVudHMgc2VwZXJhdGVkIGJ5IGEgc3BhY2UKCQkJCS8vIGpRdWVyeSguLi4pLnVuYmluZCgibW91c2VvdmVyIG1vdXNlb3V0IiwgZm4pOwoJCQkJdHlwZXMgPSB0eXBlcy5zcGxpdCgvXHMrLyk7CgkJCQl2YXIgaSA9IDA7CgkJCQl3aGlsZSAoICh0eXBlID0gdHlwZXNbIGkrKyBdKSApIHsKCQkJCQkvLyBOYW1lc3BhY2VkIGV2ZW50IGhhbmRsZXJzCgkJCQkJdmFyIG5hbWVzcGFjZXMgPSB0eXBlLnNwbGl0KCIuIik7CgkJCQkJdHlwZSA9IG5hbWVzcGFjZXMuc2hpZnQoKTsKCQkJCQl2YXIgYWxsID0gIW5hbWVzcGFjZXMubGVuZ3RoLAoJCQkJCQluYW1lc3BhY2UgPSBuZXcgUmVnRXhwKCIoXnxcXC4pIiArIG5hbWVzcGFjZXMuc2xpY2UoKS5zb3J0KCkuam9pbigiLipcXC4iKSArICIoXFwufCQpIiksCgkJCQkJCXNwZWNpYWwgPSB0aGlzLnNwZWNpYWxbIHR5cGUgXSB8fCB7fTsKCgkJCQkJaWYgKCBldmVudHNbIHR5cGUgXSApIHsKCQkJCQkJLy8gcmVtb3ZlIHRoZSBnaXZlbiBoYW5kbGVyIGZvciB0aGUgZ2l2ZW4gdHlwZQoJCQkJCQlpZiAoIGhhbmRsZXIgKSB7CgkJCQkJCQlkZWxldGUgZXZlbnRzWyB0eXBlIF1bIGhhbmRsZXIuZ3VpZCBdOwoKCQkJCQkJLy8gcmVtb3ZlIGFsbCBoYW5kbGVycyBmb3IgdGhlIGdpdmVuIHR5cGUKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCWZvciAoIHZhciBoYW5kbGUgaW4gZXZlbnRzWyB0eXBlIF0gKSB7CgkJCQkJCQkJLy8gSGFuZGxlIHRoZSByZW1vdmFsIG9mIG5hbWVzcGFjZWQgZXZlbnRzCgkJCQkJCQkJaWYgKCBhbGwgfHwgbmFtZXNwYWNlLnRlc3QoIGV2ZW50c1sgdHlwZSBdWyBoYW5kbGUgXS50eXBlICkgKSB7CgkJCQkJCQkJCWRlbGV0ZSBldmVudHNbIHR5cGUgXVsgaGFuZGxlIF07CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQl9CgoJCQkJCQlpZiAoIHNwZWNpYWwucmVtb3ZlICkgewoJCQkJCQkJc3BlY2lhbC5yZW1vdmUuY2FsbCggZWxlbSwgbmFtZXNwYWNlcyApOwoJCQkJCQl9CgoJCQkJCQkvLyByZW1vdmUgZ2VuZXJpYyBldmVudCBoYW5kbGVyIGlmIG5vIG1vcmUgaGFuZGxlcnMgZXhpc3QKCQkJCQkJZm9yICggcmV0IGluIGV2ZW50c1sgdHlwZSBdICkgewoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQkJaWYgKCAhcmV0ICkgewoJCQkJCQkJaWYgKCAhc3BlY2lhbC50ZWFyZG93biB8fCBzcGVjaWFsLnRlYXJkb3duLmNhbGwoIGVsZW0sIG5hbWVzcGFjZXMgKSA9PT0gZmFsc2UgKSB7CgkJCQkJCQkJaWYgKCBlbGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIgKSB7CgkJCQkJCQkJCWVsZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lciggdHlwZSwgalF1ZXJ5LmRhdGEoIGVsZW0sICJoYW5kbGUiICksIGZhbHNlICk7CgkJCQkJCQkJfSBlbHNlIGlmICggZWxlbS5kZXRhY2hFdmVudCApIHsKCQkJCQkJCQkJZWxlbS5kZXRhY2hFdmVudCggIm9uIiArIHR5cGUsIGpRdWVyeS5kYXRhKCBlbGVtLCAiaGFuZGxlIiApICk7CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQkJcmV0ID0gbnVsbDsKCQkJCQkJCWRlbGV0ZSBldmVudHNbIHR5cGUgXTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJLy8gUmVtb3ZlIHRoZSBleHBhbmRvIGlmIGl0J3Mgbm8gbG9uZ2VyIHVzZWQKCQkJZm9yICggcmV0IGluIGV2ZW50cyApIHsKCQkJCWJyZWFrOwoJCQl9CgkJCWlmICggIXJldCApIHsKCQkJCXZhciBoYW5kbGUgPSBqUXVlcnkuZGF0YSggZWxlbSwgImhhbmRsZSIgKTsKCQkJCWlmICggaGFuZGxlICkgewoJCQkJCWhhbmRsZS5lbGVtID0gbnVsbDsKCQkJCX0KCQkJCWpRdWVyeS5yZW1vdmVEYXRhKCBlbGVtLCAiZXZlbnRzIiApOwoJCQkJalF1ZXJ5LnJlbW92ZURhdGEoIGVsZW0sICJoYW5kbGUiICk7CgkJCX0KCQl9Cgl9LAoKCS8vIGJ1YmJsaW5nIGlzIGludGVybmFsCgl0cmlnZ2VyOiBmdW5jdGlvbiggZXZlbnQsIGRhdGEsIGVsZW0gLyosIGJ1YmJsaW5nICovICkgewoJCS8vIEV2ZW50IG9iamVjdCBvciBldmVudCB0eXBlCgkJdmFyIHR5cGUgPSBldmVudC50eXBlIHx8IGV2ZW50LAoJCQlidWJibGluZyA9IGFyZ3VtZW50c1szXTsKCgkJaWYgKCAhYnViYmxpbmcgKSB7CgkJCWV2ZW50ID0gdHlwZW9mIGV2ZW50ID09PSAib2JqZWN0IiA/CgkJCQkvLyBqUXVlcnkuRXZlbnQgb2JqZWN0CgkJCQlldmVudFtleHBhbmRvXSA/IGV2ZW50IDoKCQkJCS8vIE9iamVjdCBsaXRlcmFsCgkJCQlqUXVlcnkuZXh0ZW5kKCBqUXVlcnkuRXZlbnQodHlwZSksIGV2ZW50ICkgOgoJCQkJLy8gSnVzdCB0aGUgZXZlbnQgdHlwZSAoc3RyaW5nKQoJCQkJalF1ZXJ5LkV2ZW50KHR5cGUpOwoKCQkJaWYgKCB0eXBlLmluZGV4T2YoIiEiKSA+PSAwICkgewoJCQkJZXZlbnQudHlwZSA9IHR5cGUgPSB0eXBlLnNsaWNlKDAsIC0xKTsKCQkJCWV2ZW50LmV4Y2x1c2l2ZSA9IHRydWU7CgkJCX0KCgkJCS8vIEhhbmRsZSBhIGdsb2JhbCB0cmlnZ2VyCgkJCWlmICggIWVsZW0gKSB7CgkJCQkvLyBEb24ndCBidWJibGUgY3VzdG9tIGV2ZW50cyB3aGVuIGdsb2JhbCAodG8gYXZvaWQgdG9vIG11Y2ggb3ZlcmhlYWQpCgkJCQlldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKCQkJCS8vIE9ubHkgdHJpZ2dlciBpZiB3ZSd2ZSBldmVyIGJvdW5kIGFuIGV2ZW50IGZvciBpdAoJCQkJaWYgKCB0aGlzLmdsb2JhbFsgdHlwZSBdICkgewoJCQkJCWpRdWVyeS5lYWNoKCBqUXVlcnkuY2FjaGUsIGZ1bmN0aW9uKCkgewoJCQkJCQlpZiAoIHRoaXMuZXZlbnRzICYmIHRoaXMuZXZlbnRzW3R5cGVdICkgewoJCQkJCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoIGV2ZW50LCBkYXRhLCB0aGlzLmhhbmRsZS5lbGVtICk7CgkJCQkJCX0KCQkJCQl9KTsKCQkJCX0KCQkJfQoKCQkJLy8gSGFuZGxlIHRyaWdnZXJpbmcgYSBzaW5nbGUgZWxlbWVudAoKCQkJLy8gZG9uJ3QgZG8gZXZlbnRzIG9uIHRleHQgYW5kIGNvbW1lbnQgbm9kZXMKCQkJaWYgKCAhZWxlbSB8fCBlbGVtLm5vZGVUeXBlID09PSAzIHx8IGVsZW0ubm9kZVR5cGUgPT09IDggKSB7CgkJCQlyZXR1cm4gdW5kZWZpbmVkOwoJCQl9CgoJCQkvLyBDbGVhbiB1cCBpbiBjYXNlIGl0IGlzIHJldXNlZAoJCQlldmVudC5yZXN1bHQgPSB1bmRlZmluZWQ7CgkJCWV2ZW50LnRhcmdldCA9IGVsZW07CgoJCQkvLyBDbG9uZSB0aGUgaW5jb21pbmcgZGF0YSwgaWYgYW55CgkJCWRhdGEgPSBqUXVlcnkubWFrZUFycmF5KCBkYXRhICk7CgkJCWRhdGEudW5zaGlmdCggZXZlbnQgKTsKCQl9CgoJCWV2ZW50LmN1cnJlbnRUYXJnZXQgPSBlbGVtOwoKCQkvLyBUcmlnZ2VyIHRoZSBldmVudCwgaXQgaXMgYXNzdW1lZCB0aGF0ICJoYW5kbGUiIGlzIGEgZnVuY3Rpb24KCQl2YXIgaGFuZGxlID0galF1ZXJ5LmRhdGEoIGVsZW0sICJoYW5kbGUiICk7CgkJaWYgKCBoYW5kbGUgKSB7CgkJCWhhbmRsZS5hcHBseSggZWxlbSwgZGF0YSApOwoJCX0KCgkJLy8gSGFuZGxlIHRyaWdnZXJpbmcgbmF0aXZlIC5vbmZvbyBoYW5kbGVycyAoYW5kIG9uIGxpbmtzIHNpbmNlIHdlIGRvbid0IGNhbGwgLmNsaWNrKCkgZm9yIGxpbmtzKQoJCWlmICggKCFlbGVtWyB0eXBlIF0gfHwgKGpRdWVyeS5ub2RlTmFtZShlbGVtLCAnYScpICYmIHR5cGUgPT09ICJjbGljayIpKSAmJiBlbGVtWyJvbiIrdHlwZV0gJiYgZWxlbVsib24iK3R5cGVdLmFwcGx5KCBlbGVtLCBkYXRhICkgPT09IGZhbHNlICkgewoJCQlldmVudC5yZXN1bHQgPSBmYWxzZTsKCQl9CgoJCS8vIFRyaWdnZXIgdGhlIG5hdGl2ZSBldmVudHMgKGV4Y2VwdCBmb3IgY2xpY2tzIG9uIGxpbmtzKQoJCWlmICggIWJ1YmJsaW5nICYmIGVsZW1bIHR5cGUgXSAmJiAhZXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkgJiYgIShqUXVlcnkubm9kZU5hbWUoZWxlbSwgJ2EnKSAmJiB0eXBlID09PSAiY2xpY2siKSApIHsKCQkJdGhpcy50cmlnZ2VyZWQgPSB0cnVlOwoJCQl0cnkgewoJCQkJZWxlbVsgdHlwZSBdKCk7CgkJCS8vIHByZXZlbnQgSUUgZnJvbSB0aHJvd2luZyBhbiBlcnJvciBmb3Igc29tZSBoaWRkZW4gZWxlbWVudHMKCQkJfSBjYXRjaCAoZSkge30KCQl9CgoJCXRoaXMudHJpZ2dlcmVkID0gZmFsc2U7CgoJCWlmICggIWV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7CgkJCXZhciBwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGUgfHwgZWxlbS5vd25lckRvY3VtZW50OwoJCQlpZiAoIHBhcmVudCApIHsKCQkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCBldmVudCwgZGF0YSwgcGFyZW50LCB0cnVlICk7CgkJCX0KCQl9Cgl9LAoKCWhhbmRsZTogZnVuY3Rpb24oIGV2ZW50ICkgewoJCS8vIHJldHVybmVkIHVuZGVmaW5lZCBvciBmYWxzZQoJCXZhciBhbGwsIGhhbmRsZXJzOwoKCQlldmVudCA9IGFyZ3VtZW50c1swXSA9IGpRdWVyeS5ldmVudC5maXgoIGV2ZW50IHx8IHdpbmRvdy5ldmVudCApOwoJCWV2ZW50LmN1cnJlbnRUYXJnZXQgPSB0aGlzOwoKCQkvLyBOYW1lc3BhY2VkIGV2ZW50IGhhbmRsZXJzCgkJdmFyIG5hbWVzcGFjZXMgPSBldmVudC50eXBlLnNwbGl0KCIuIik7CgkJZXZlbnQudHlwZSA9IG5hbWVzcGFjZXMuc2hpZnQoKTsKCgkJLy8gQ2FjaGUgdGhpcyBub3csIGFsbCA9IHRydWUgbWVhbnMsIGFueSBoYW5kbGVyCgkJYWxsID0gIW5hbWVzcGFjZXMubGVuZ3RoICYmICFldmVudC5leGNsdXNpdmU7CgoJCXZhciBuYW1lc3BhY2UgPSBuZXcgUmVnRXhwKCIoXnxcXC4pIiArIG5hbWVzcGFjZXMuc2xpY2UoKS5zb3J0KCkuam9pbigiLipcXC4iKSArICIoXFwufCQpIik7CgoJCWhhbmRsZXJzID0gKCBqUXVlcnkuZGF0YSh0aGlzLCAiZXZlbnRzIikgfHwge30gKVsgZXZlbnQudHlwZSBdOwoKCQlmb3IgKCB2YXIgaiBpbiBoYW5kbGVycyApIHsKCQkJdmFyIGhhbmRsZXIgPSBoYW5kbGVyc1sgaiBdOwoKCQkJLy8gRmlsdGVyIHRoZSBmdW5jdGlvbnMgYnkgY2xhc3MKCQkJaWYgKCBhbGwgfHwgbmFtZXNwYWNlLnRlc3QoaGFuZGxlci50eXBlKSApIHsKCQkJCS8vIFBhc3MgaW4gYSByZWZlcmVuY2UgdG8gdGhlIGhhbmRsZXIgZnVuY3Rpb24gaXRzZWxmCgkJCQkvLyBTbyB0aGF0IHdlIGNhbiBsYXRlciByZW1vdmUgaXQKCQkJCWV2ZW50LmhhbmRsZXIgPSBoYW5kbGVyOwoJCQkJZXZlbnQuZGF0YSA9IGhhbmRsZXIuZGF0YTsKCgkJCQl2YXIgcmV0ID0gaGFuZGxlci5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgoJCQkJaWYgKCByZXQgIT09IHVuZGVmaW5lZCApIHsKCQkJCQlldmVudC5yZXN1bHQgPSByZXQ7CgkJCQkJaWYgKCByZXQgPT09IGZhbHNlICkgewoJCQkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoJCQkJCQlldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKCQkJCQl9CgkJCQl9CgoJCQkJaWYgKCBldmVudC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpICkgewoJCQkJCWJyZWFrOwoJCQkJfQoKCQkJfQoJCX0KCX0sCgoJcHJvcHM6ICJhbHRLZXkgYXR0ckNoYW5nZSBhdHRyTmFtZSBidWJibGVzIGJ1dHRvbiBjYW5jZWxhYmxlIGNoYXJDb2RlIGNsaWVudFggY2xpZW50WSBjdHJsS2V5IGN1cnJlbnRUYXJnZXQgZGF0YSBkZXRhaWwgZXZlbnRQaGFzZSBmcm9tRWxlbWVudCBoYW5kbGVyIGtleUNvZGUgbGF5ZXJYIGxheWVyWSBtZXRhS2V5IG5ld1ZhbHVlIG9mZnNldFggb2Zmc2V0WSBvcmlnaW5hbFRhcmdldCBwYWdlWCBwYWdlWSBwcmV2VmFsdWUgcmVsYXRlZE5vZGUgcmVsYXRlZFRhcmdldCBzY3JlZW5YIHNjcmVlblkgc2hpZnRLZXkgc3JjRWxlbWVudCB0YXJnZXQgdG9FbGVtZW50IHZpZXcgd2hlZWxEZWx0YSB3aGljaCIuc3BsaXQoIiAiKSwKCglmaXg6IGZ1bmN0aW9uKCBldmVudCApIHsKCQlpZiAoIGV2ZW50WyBleHBhbmRvIF0gKSB7CgkJCXJldHVybiBldmVudDsKCQl9CgoJCS8vIHN0b3JlIGEgY29weSBvZiB0aGUgb3JpZ2luYWwgZXZlbnQgb2JqZWN0CgkJLy8gYW5kICJjbG9uZSIgdG8gc2V0IHJlYWQtb25seSBwcm9wZXJ0aWVzCgkJdmFyIG9yaWdpbmFsRXZlbnQgPSBldmVudDsKCQlldmVudCA9IGpRdWVyeS5FdmVudCggb3JpZ2luYWxFdmVudCApOwoKCQlmb3IgKCB2YXIgaSA9IHRoaXMucHJvcHMubGVuZ3RoLCBwcm9wOyBpOyApIHsKCQkJcHJvcCA9IHRoaXMucHJvcHNbIC0taSBdOwoJCQlldmVudFsgcHJvcCBdID0gb3JpZ2luYWxFdmVudFsgcHJvcCBdOwoJCX0KCgkJLy8gRml4IHRhcmdldCBwcm9wZXJ0eSwgaWYgbmVjZXNzYXJ5CgkJaWYgKCAhZXZlbnQudGFyZ2V0ICkgewoJCQlldmVudC50YXJnZXQgPSBldmVudC5zcmNFbGVtZW50IHx8IGRvY3VtZW50OyAvLyBGaXhlcyAjMTkyNSB3aGVyZSBzcmNFbGVtZW50IG1pZ2h0IG5vdCBiZSBkZWZpbmVkIGVpdGhlcgoJCX0KCgkJLy8gY2hlY2sgaWYgdGFyZ2V0IGlzIGEgdGV4dG5vZGUgKHNhZmFyaSkKCQlpZiAoIGV2ZW50LnRhcmdldC5ub2RlVHlwZSA9PT0gMyApIHsKCQkJZXZlbnQudGFyZ2V0ID0gZXZlbnQudGFyZ2V0LnBhcmVudE5vZGU7CgkJfQoKCQkvLyBBZGQgcmVsYXRlZFRhcmdldCwgaWYgbmVjZXNzYXJ5CgkJaWYgKCAhZXZlbnQucmVsYXRlZFRhcmdldCAmJiBldmVudC5mcm9tRWxlbWVudCApIHsKCQkJZXZlbnQucmVsYXRlZFRhcmdldCA9IGV2ZW50LmZyb21FbGVtZW50ID09PSBldmVudC50YXJnZXQgPyBldmVudC50b0VsZW1lbnQgOiBldmVudC5mcm9tRWxlbWVudDsKCQl9CgoJCS8vIENhbGN1bGF0ZSBwYWdlWC9ZIGlmIG1pc3NpbmcgYW5kIGNsaWVudFgvWSBhdmFpbGFibGUKCQlpZiAoIGV2ZW50LnBhZ2VYID09IG51bGwgJiYgZXZlbnQuY2xpZW50WCAhPSBudWxsICkgewoJCQl2YXIgZG9jID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCBib2R5ID0gZG9jdW1lbnQuYm9keTsKCQkJZXZlbnQucGFnZVggPSBldmVudC5jbGllbnRYICsgKGRvYyAmJiBkb2Muc2Nyb2xsTGVmdCB8fCBib2R5ICYmIGJvZHkuc2Nyb2xsTGVmdCB8fCAwKSAtIChkb2MgJiYgZG9jLmNsaWVudExlZnQgfHwgYm9keSAmJiBib2R5LmNsaWVudExlZnQgfHwgMCk7CgkJCWV2ZW50LnBhZ2VZID0gZXZlbnQuY2xpZW50WSArIChkb2MgJiYgZG9jLnNjcm9sbFRvcCAgfHwgYm9keSAmJiBib2R5LnNjcm9sbFRvcCAgfHwgMCkgLSAoZG9jICYmIGRvYy5jbGllbnRUb3AgIHx8IGJvZHkgJiYgYm9keS5jbGllbnRUb3AgIHx8IDApOwoJCX0KCgkJLy8gQWRkIHdoaWNoIGZvciBrZXkgZXZlbnRzCgkJaWYgKCAhZXZlbnQud2hpY2ggJiYgKChldmVudC5jaGFyQ29kZSB8fCBldmVudC5jaGFyQ29kZSA9PT0gMCkgPyBldmVudC5jaGFyQ29kZSA6IGV2ZW50LmtleUNvZGUpICkgewoJCQlldmVudC53aGljaCA9IGV2ZW50LmNoYXJDb2RlIHx8IGV2ZW50LmtleUNvZGU7CgkJfQoKCQkvLyBBZGQgbWV0YUtleSB0byBub24tTWFjIGJyb3dzZXJzICh1c2UgY3RybCBmb3IgUEMncyBhbmQgTWV0YSBmb3IgTWFjcykKCQlpZiAoICFldmVudC5tZXRhS2V5ICYmIGV2ZW50LmN0cmxLZXkgKSB7CgkJCWV2ZW50Lm1ldGFLZXkgPSBldmVudC5jdHJsS2V5OwoJCX0KCgkJLy8gQWRkIHdoaWNoIGZvciBjbGljazogMSA9PSBsZWZ0OyAyID09IG1pZGRsZTsgMyA9PSByaWdodAoJCS8vIE5vdGU6IGJ1dHRvbiBpcyBub3Qgbm9ybWFsaXplZCwgc28gZG9uJ3QgdXNlIGl0CgkJaWYgKCAhZXZlbnQud2hpY2ggJiYgZXZlbnQuYnV0dG9uICkgewoJCQlldmVudC53aGljaCA9IChldmVudC5idXR0b24gJiAxID8gMSA6ICggZXZlbnQuYnV0dG9uICYgMiA/IDMgOiAoIGV2ZW50LmJ1dHRvbiAmIDQgPyAyIDogMCApICkpOwoJCX0KCgkJcmV0dXJuIGV2ZW50OwoJfSwKCglwcm94eTogZnVuY3Rpb24oIGZuLCBwcm94eSwgdGhpc09iamVjdCApIHsKCQlpZiAoIHByb3h5ICE9PSB1bmRlZmluZWQgJiYgIWpRdWVyeS5pc0Z1bmN0aW9uKCBwcm94eSApICkgewoJCQl0aGlzT2JqZWN0ID0gcHJveHk7CgkJCXByb3h5ID0gdW5kZWZpbmVkOwoJCX0KCQkvLyBGSVhNRTogU2hvdWxkIHByb3h5IGJlIHJlZGVmaW5lZCB0byBiZSBhcHBsaWVkIHdpdGggdGhpc09iamVjdCBpZiBkZWZpbmVkPwoJCXByb3h5ID0gcHJveHkgfHwgZnVuY3Rpb24oKSB7IHJldHVybiBmbi5hcHBseSggdGhpc09iamVjdCAhPT0gdW5kZWZpbmVkID8gdGhpc09iamVjdCA6IHRoaXMsIGFyZ3VtZW50cyApOyB9OwoJCS8vIFNldCB0aGUgZ3VpZCBvZiB1bmlxdWUgaGFuZGxlciB0byB0aGUgc2FtZSBvZiBvcmlnaW5hbCBoYW5kbGVyLCBzbyBpdCBjYW4gYmUgcmVtb3ZlZAoJCXByb3h5Lmd1aWQgPSBmbi5ndWlkID0gZm4uZ3VpZCB8fCBwcm94eS5ndWlkIHx8IHRoaXMuZ3VpZCsrOwoJCS8vIFNvIHByb3h5IGNhbiBiZSBkZWNsYXJlZCBhcyBhbiBhcmd1bWVudAoJCXJldHVybiBwcm94eTsKCX0sCgoJc3BlY2lhbDogewoJCXJlYWR5OiB7CgkJCS8vIE1ha2Ugc3VyZSB0aGUgcmVhZHkgZXZlbnQgaXMgc2V0dXAKCQkJc2V0dXA6IGJpbmRSZWFkeSwKCQkJdGVhcmRvd246IGZ1bmN0aW9uKCkge30KCQl9LAoKCQlsaXZlOiB7CgkJCWFkZDogZnVuY3Rpb24oIHByb3h5LCBkYXRhLCBuYW1lc3BhY2VzICkgewoJCQkJalF1ZXJ5LmV4dGVuZCggcHJveHksIGRhdGEgfHwge30gKTsKCQkJCXByb3h5Lmd1aWQgKz0gZGF0YS5zZWxlY3RvciArIGRhdGEubGl2ZTsKCQkJCWpRdWVyeS5ldmVudC5hZGQoIHRoaXMsIGRhdGEubGl2ZSwgbGl2ZUhhbmRsZXIgKTsKCQkJfSwKCgkJCXJlbW92ZTogZnVuY3Rpb24oIG5hbWVzcGFjZXMgKSB7CgkJCQlpZiAoIG5hbWVzcGFjZXMubGVuZ3RoICkgewoJCQkJCXZhciByZW1vdmUgPSAwLCBuYW1lID0gbmV3IFJlZ0V4cCgiKF58XFwuKSIgKyBuYW1lc3BhY2VzWzBdICsgIihcXC58JCkiKTsKCgkJCQkJalF1ZXJ5LmVhY2goIChqUXVlcnkuZGF0YSh0aGlzLCAiZXZlbnRzIikubGl2ZSB8fCB7fSksIGZ1bmN0aW9uKCkgewoJCQkJCQlpZiAoIG5hbWUudGVzdCh0aGlzLnR5cGUpICkgewoJCQkJCQkJcmVtb3ZlKys7CgkJCQkJCX0KCQkJCQl9KTsKCgkJCQkJaWYgKCByZW1vdmUgPCAxICkgewoJCQkJCQlqUXVlcnkuZXZlbnQucmVtb3ZlKCB0aGlzLCBuYW1lc3BhY2VzWzBdLCBsaXZlSGFuZGxlciApOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCX0KfTsKCmpRdWVyeS5FdmVudCA9IGZ1bmN0aW9uKCBzcmMgKXsKCS8vIEFsbG93IGluc3RhbnRpYXRpb24gd2l0aG91dCB0aGUgJ25ldycga2V5d29yZAoJaWYgKCAhdGhpcy5wcmV2ZW50RGVmYXVsdCApIHsKCQlyZXR1cm4gbmV3IGpRdWVyeS5FdmVudCggc3JjICk7Cgl9CgoJLy8gRXZlbnQgb2JqZWN0CglpZiAoIHNyYyAmJiBzcmMudHlwZSApIHsKCQl0aGlzLm9yaWdpbmFsRXZlbnQgPSBzcmM7CgkJdGhpcy50eXBlID0gc3JjLnR5cGU7CgkvLyBFdmVudCB0eXBlCgl9IGVsc2UgewoJCXRoaXMudHlwZSA9IHNyYzsKCX0KCgkvLyB0aW1lU3RhbXAgaXMgYnVnZ3kgZm9yIHNvbWUgZXZlbnRzIG9uIEZpcmVmb3goIzM4NDMpCgkvLyBTbyB3ZSB3b24ndCByZWx5IG9uIHRoZSBuYXRpdmUgdmFsdWUKCXRoaXMudGltZVN0YW1wID0gbm93KCk7CgoJLy8gTWFyayBpdCBhcyBmaXhlZAoJdGhpc1sgZXhwYW5kbyBdID0gdHJ1ZTsKfTsKCmZ1bmN0aW9uIHJldHVybkZhbHNlKCkgewoJcmV0dXJuIGZhbHNlOwp9CmZ1bmN0aW9uIHJldHVyblRydWUoKSB7CglyZXR1cm4gdHJ1ZTsKfQoKLy8galF1ZXJ5LkV2ZW50IGlzIGJhc2VkIG9uIERPTTMgRXZlbnRzIGFzIHNwZWNpZmllZCBieSB0aGUgRUNNQVNjcmlwdCBMYW5ndWFnZSBCaW5kaW5nCi8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDMvV0QtRE9NLUxldmVsLTMtRXZlbnRzLTIwMDMwMzMxL2VjbWEtc2NyaXB0LWJpbmRpbmcuaHRtbApqUXVlcnkuRXZlbnQucHJvdG90eXBlID0gewoJcHJldmVudERlZmF1bHQ6IGZ1bmN0aW9uKCkgewoJCXRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gcmV0dXJuVHJ1ZTsKCgkJdmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7CgkJaWYgKCAhZSApIHsKCQkJcmV0dXJuOwoJCX0KCQkvLyBpZiBwcmV2ZW50RGVmYXVsdCBleGlzdHMgcnVuIGl0IG9uIHRoZSBvcmlnaW5hbCBldmVudAoJCWlmICggZS5wcmV2ZW50RGVmYXVsdCApIHsKCQkJZS5wcmV2ZW50RGVmYXVsdCgpOwoJCX0KCQkvLyBvdGhlcndpc2Ugc2V0IHRoZSByZXR1cm5WYWx1ZSBwcm9wZXJ0eSBvZiB0aGUgb3JpZ2luYWwgZXZlbnQgdG8gZmFsc2UgKElFKQoJCWUucmV0dXJuVmFsdWUgPSBmYWxzZTsKCX0sCglzdG9wUHJvcGFnYXRpb246IGZ1bmN0aW9uKCkgewoJCXRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5UcnVlOwoKCQl2YXIgZSA9IHRoaXMub3JpZ2luYWxFdmVudDsKCQlpZiAoICFlICkgewoJCQlyZXR1cm47CgkJfQoJCS8vIGlmIHN0b3BQcm9wYWdhdGlvbiBleGlzdHMgcnVuIGl0IG9uIHRoZSBvcmlnaW5hbCBldmVudAoJCWlmICggZS5zdG9wUHJvcGFnYXRpb24gKSB7CgkJCWUuc3RvcFByb3BhZ2F0aW9uKCk7CgkJfQoJCS8vIG90aGVyd2lzZSBzZXQgdGhlIGNhbmNlbEJ1YmJsZSBwcm9wZXJ0eSBvZiB0aGUgb3JpZ2luYWwgZXZlbnQgdG8gdHJ1ZSAoSUUpCgkJZS5jYW5jZWxCdWJibGUgPSB0cnVlOwoJfSwKCXN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjogZnVuY3Rpb24oKXsKCQl0aGlzLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkID0gcmV0dXJuVHJ1ZTsKCQl0aGlzLnN0b3BQcm9wYWdhdGlvbigpOwoJfSwKCWlzRGVmYXVsdFByZXZlbnRlZDogcmV0dXJuRmFsc2UsCglpc1Byb3BhZ2F0aW9uU3RvcHBlZDogcmV0dXJuRmFsc2UsCglpc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZDogcmV0dXJuRmFsc2UKfTsKLy8gQ2hlY2tzIGlmIGFuIGV2ZW50IGhhcHBlbmVkIG9uIGFuIGVsZW1lbnQgd2l0aGluIGFub3RoZXIgZWxlbWVudAovLyBVc2VkIGluIGpRdWVyeS5ldmVudC5zcGVjaWFsLm1vdXNlZW50ZXIgYW5kIG1vdXNlbGVhdmUgaGFuZGxlcnMKdmFyIHdpdGhpbkVsZW1lbnQgPSBmdW5jdGlvbiggZXZlbnQgKSB7CgkvLyBDaGVjayBpZiBtb3VzZShvdmVyfG91dCkgYXJlIHN0aWxsIHdpdGhpbiB0aGUgc2FtZSBwYXJlbnQgZWxlbWVudAoJdmFyIHBhcmVudCA9IGV2ZW50LnJlbGF0ZWRUYXJnZXQ7CgkvLyBUcmF2ZXJzZSB1cCB0aGUgdHJlZQoJd2hpbGUgKCBwYXJlbnQgJiYgcGFyZW50ICE9IHRoaXMgKSB7CgkJLy8gRmlyZWZveCBzb21ldGltZXMgYXNzaWducyByZWxhdGVkVGFyZ2V0IGEgWFVMIGVsZW1lbnQKCQkvLyB3aGljaCB3ZSBjYW5ub3QgYWNjZXNzIHRoZSBwYXJlbnROb2RlIHByb3BlcnR5IG9mCgkJdHJ5IHsgcGFyZW50ID0gcGFyZW50LnBhcmVudE5vZGU7IH0KCQkvLyBhc3N1bWluZyB3ZSd2ZSBsZWZ0IHRoZSBlbGVtZW50IHNpbmNlIHdlIG1vc3QgbGlrZWx5IG1vdXNlZG92ZXIgYSB4dWwgZWxlbWVudAoJCWNhdGNoKGUpIHsgYnJlYWs7IH0KCX0KCglpZiAoIHBhcmVudCAhPSB0aGlzICkgewoJCS8vIHNldCB0aGUgY29ycmVjdCBldmVudCB0eXBlCgkJZXZlbnQudHlwZSA9IGV2ZW50LmRhdGE7CgkJLy8gaGFuZGxlIGV2ZW50IGlmIHdlIGFjdHVhbGx5IGp1c3QgbW91c2VkIG9uIHRvIGEgbm9uIHN1Yi1lbGVtZW50CgkJalF1ZXJ5LmV2ZW50LmhhbmRsZS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7Cgl9Cn07CgpqUXVlcnkuZWFjaCh7Cgltb3VzZW92ZXI6ICdtb3VzZWVudGVyJywKCW1vdXNlb3V0OiAnbW91c2VsZWF2ZScKfSwgZnVuY3Rpb24oIG9yaWcsIGZpeCApIHsKCWpRdWVyeS5ldmVudC5zcGVjaWFsWyBmaXggXSA9IHsKCQlzZXR1cDogZnVuY3Rpb24oKXsKCQkJalF1ZXJ5LmV2ZW50LmFkZCggdGhpcywgb3JpZywgd2l0aGluRWxlbWVudCwgZml4ICk7CgkJfSwKCQl0ZWFyZG93bjogZnVuY3Rpb24oKXsKCQkJalF1ZXJ5LmV2ZW50LnJlbW92ZSggdGhpcywgb3JpZywgd2l0aGluRWxlbWVudCApOwoJCX0KCX07Cn0pOwoKalF1ZXJ5LmZuLmV4dGVuZCh7CgliaW5kOiBmdW5jdGlvbiggdHlwZSwgZGF0YSwgZm4sIHRoaXNPYmplY3QgKSB7CgkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggZGF0YSApICkgewoJCQlpZiAoIGZuICE9PSB1bmRlZmluZWQgKSB7CgkJCQl0aGlzT2JqZWN0ID0gZm47CgkJCX0KCQkJZm4gPSBkYXRhOwoJCQlkYXRhID0gdW5kZWZpbmVkOwoJCX0KCQlmbiA9IHRoaXNPYmplY3QgPT09IHVuZGVmaW5lZCA/IGZuIDogalF1ZXJ5LmV2ZW50LnByb3h5KCBmbiwgdGhpc09iamVjdCApOwoJCXJldHVybiB0eXBlID09PSAidW5sb2FkIiA/IHRoaXMub25lKHR5cGUsIGRhdGEsIGZuLCB0aGlzT2JqZWN0KSA6IHRoaXMuZWFjaChmdW5jdGlvbigpIHsKCQkJalF1ZXJ5LmV2ZW50LmFkZCggdGhpcywgdHlwZSwgZm4sIGRhdGEgKTsKCQl9KTsKCX0sCgoJb25lOiBmdW5jdGlvbiggdHlwZSwgZGF0YSwgZm4sIHRoaXNPYmplY3QgKSB7CgkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggZGF0YSApICkgewoJCQlpZiAoIGZuICE9PSB1bmRlZmluZWQgKSB7CgkJCQl0aGlzT2JqZWN0ID0gZm47CgkJCX0KCQkJZm4gPSBkYXRhOwoJCQlkYXRhID0gdW5kZWZpbmVkOwoJCX0KCQlmbiA9IHRoaXNPYmplY3QgPT09IHVuZGVmaW5lZCA/IGZuIDogalF1ZXJ5LmV2ZW50LnByb3h5KCBmbiwgdGhpc09iamVjdCApOwoJCXZhciBvbmUgPSBqUXVlcnkuZXZlbnQucHJveHkoIGZuLCBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCWpRdWVyeSggdGhpcyApLnVuYmluZCggZXZlbnQsIG9uZSApOwoJCQlyZXR1cm4gZm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwoJCX0pOwoJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CgkJCWpRdWVyeS5ldmVudC5hZGQoIHRoaXMsIHR5cGUsIG9uZSwgZGF0YSApOwoJCX0pOwoJfSwKCgl1bmJpbmQ6IGZ1bmN0aW9uKCB0eXBlLCBmbiApIHsKCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQlqUXVlcnkuZXZlbnQucmVtb3ZlKCB0aGlzLCB0eXBlLCBmbiApOwoJCX0pOwoJfSwKCgl0cmlnZ2VyOiBmdW5jdGlvbiggdHlwZSwgZGF0YSApIHsKCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQlqUXVlcnkuZXZlbnQudHJpZ2dlciggdHlwZSwgZGF0YSwgdGhpcyApOwoJCX0pOwoJfSwKCgl0cmlnZ2VySGFuZGxlcjogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7CgkJaWYgKCB0aGlzWzBdICkgewoJCQl2YXIgZXZlbnQgPSBqUXVlcnkuRXZlbnQoIHR5cGUgKTsKCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKCQkJZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CgkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCBldmVudCwgZGF0YSwgdGhpc1swXSApOwoJCQlyZXR1cm4gZXZlbnQucmVzdWx0OwoJCX0KCX0sCgoJdG9nZ2xlOiBmdW5jdGlvbiggZm4gKSB7CgkJLy8gU2F2ZSByZWZlcmVuY2UgdG8gYXJndW1lbnRzIGZvciBhY2Nlc3MgaW4gY2xvc3VyZQoJCXZhciBhcmdzID0gYXJndW1lbnRzLCBpID0gMTsKCgkJLy8gbGluayBhbGwgdGhlIGZ1bmN0aW9ucywgc28gYW55IG9mIHRoZW0gY2FuIHVuYmluZCB0aGlzIGNsaWNrIGhhbmRsZXIKCQl3aGlsZSggaSA8IGFyZ3MubGVuZ3RoICkgewoJCQlqUXVlcnkuZXZlbnQucHJveHkoIGZuLCBhcmdzWyBpKysgXSApOwoJCX0KCgkJcmV0dXJuIHRoaXMuY2xpY2soIGpRdWVyeS5ldmVudC5wcm94eSggZm4sIGZ1bmN0aW9uKCBldmVudCApIHsKCQkJLy8gRmlndXJlIG91dCB3aGljaCBmdW5jdGlvbiB0byBleGVjdXRlCgkJCXRoaXMubGFzdFRvZ2dsZSA9ICggdGhpcy5sYXN0VG9nZ2xlIHx8IDAgKSAlIGk7CgoJCQkvLyBNYWtlIHN1cmUgdGhhdCBjbGlja3Mgc3RvcAoJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoKCQkJLy8gYW5kIGV4ZWN1dGUgdGhlIGZ1bmN0aW9uCgkJCXJldHVybiBhcmdzWyB0aGlzLmxhc3RUb2dnbGUrKyBdLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKSB8fCBmYWxzZTsKCQl9KSk7Cgl9LAoKCWhvdmVyOiBmdW5jdGlvbiggZm5PdmVyLCBmbk91dCApIHsKCQlyZXR1cm4gdGhpcy5tb3VzZWVudGVyKCBmbk92ZXIgKS5tb3VzZWxlYXZlKCBmbk91dCB8fCBmbk92ZXIgKTsKCX0sCgoJcmVhZHk6IGZ1bmN0aW9uKCBmbiApIHsKCQkvLyBBdHRhY2ggdGhlIGxpc3RlbmVycwoJCWJpbmRSZWFkeSgpOwoKCQkvLyBJZiB0aGUgRE9NIGlzIGFscmVhZHkgcmVhZHkKCQlpZiAoIGpRdWVyeS5pc1JlYWR5ICkgewoJCQkvLyBFeGVjdXRlIHRoZSBmdW5jdGlvbiBpbW1lZGlhdGVseQoJCQlmbi5jYWxsKCBkb2N1bWVudCwgalF1ZXJ5ICk7CgoJCS8vIE90aGVyd2lzZSwgcmVtZW1iZXIgdGhlIGZ1bmN0aW9uIGZvciBsYXRlcgoJCX0gZWxzZSB7CgkJCS8vIEFkZCB0aGUgZnVuY3Rpb24gdG8gdGhlIHdhaXQgbGlzdAoJCQlqUXVlcnkucmVhZHlMaXN0LnB1c2goIGZuICk7CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCgoJbGl2ZTogZnVuY3Rpb24oIHR5cGUsIGRhdGEsIGZuLCB0aGlzT2JqZWN0ICkgewoJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGRhdGEgKSApIHsKCQkJaWYgKCBmbiAhPT0gdW5kZWZpbmVkICkgewoJCQkJdGhpc09iamVjdCA9IGZuOwoJCQl9CgkJCWZuID0gZGF0YTsKCQkJZGF0YSA9IHVuZGVmaW5lZDsKCQl9CgkJalF1ZXJ5KCB0aGlzLmNvbnRleHQgKS5iaW5kKCBsaXZlQ29udmVydCggdHlwZSwgdGhpcy5zZWxlY3RvciApLCB7CgkJCWRhdGE6IGRhdGEsIHNlbGVjdG9yOiB0aGlzLnNlbGVjdG9yLCBsaXZlOiB0eXBlCgkJfSwgZm4sIHRoaXNPYmplY3QgKTsKCQlyZXR1cm4gdGhpczsKCX0sCgoJZGllOiBmdW5jdGlvbiggdHlwZSwgZm4gKSB7CgkJalF1ZXJ5KCB0aGlzLmNvbnRleHQgKS51bmJpbmQoIGxpdmVDb252ZXJ0KCB0eXBlLCB0aGlzLnNlbGVjdG9yICksIGZuID8geyBndWlkOiBmbi5ndWlkICsgdGhpcy5zZWxlY3RvciArIHR5cGUgfSA6IG51bGwgKTsKCQlyZXR1cm4gdGhpczsKCX0KfSk7CgpmdW5jdGlvbiBsaXZlSGFuZGxlciggZXZlbnQgKSB7Cgl2YXIgc3RvcCA9IHRydWUsIGVsZW1zID0gW10sIGFyZ3MgPSBhcmd1bWVudHM7CgoJalF1ZXJ5LmVhY2goIGpRdWVyeS5kYXRhKCB0aGlzLCAiZXZlbnRzIiApLmxpdmUgfHwgW10sIGZ1bmN0aW9uKCBpLCBmbiApIHsKCQlpZiAoIGZuLmxpdmUgPT09IGV2ZW50LnR5cGUgKSB7CgkJCXZhciBlbGVtID0galF1ZXJ5KCBldmVudC50YXJnZXQgKS5jbG9zZXN0KCBmbi5zZWxlY3RvciApWzBdOwoJCQlpZiAoIGVsZW0gKSB7CgkJCQllbGVtcy5wdXNoKHsgZWxlbTogZWxlbSwgZm46IGZuIH0pOwoJCQl9CgkJfQoJfSk7CgoJZWxlbXMuc29ydChmdW5jdGlvbiggYSwgYiApIHsKCQlyZXR1cm4galF1ZXJ5LmRhdGEoIGEuZWxlbSwgImNsb3Nlc3QiICkgLSBqUXVlcnkuZGF0YSggYi5lbGVtLCAiY2xvc2VzdCIgKTsKCX0pOwoKCWpRdWVyeS5lYWNoKGVsZW1zLCBmdW5jdGlvbigpIHsKCQlldmVudC5jdXJyZW50VGFyZ2V0ID0gdGhpcy5lbGVtOwoJCWV2ZW50LmRhdGEgPSB0aGlzLmZuLmRhdGE7CgkJaWYgKCB0aGlzLmZuLmFwcGx5KCB0aGlzLmVsZW0sIGFyZ3MgKSA9PT0gZmFsc2UgKSB7CgkJCXJldHVybiAoc3RvcCA9IGZhbHNlKTsKCQl9Cgl9KTsKCglyZXR1cm4gc3RvcDsKfQoKZnVuY3Rpb24gbGl2ZUNvbnZlcnQoIHR5cGUsIHNlbGVjdG9yICkgewoJcmV0dXJuIFsibGl2ZSIsIHR5cGUsIHNlbGVjdG9yLnJlcGxhY2UoL1wuL2csICJgIikucmVwbGFjZSgvIC9nLCAifCIpXS5qb2luKCIuIik7Cn0KCmpRdWVyeS5leHRlbmQoewoJaXNSZWFkeTogZmFsc2UsCglyZWFkeUxpc3Q6IFtdLAoJLy8gSGFuZGxlIHdoZW4gdGhlIERPTSBpcyByZWFkeQoJcmVhZHk6IGZ1bmN0aW9uKCkgewoJCS8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBET00gaXMgbm90IGFscmVhZHkgbG9hZGVkCgkJaWYgKCAhalF1ZXJ5LmlzUmVhZHkgKSB7CgkJCS8vIFJlbWVtYmVyIHRoYXQgdGhlIERPTSBpcyByZWFkeQoJCQlqUXVlcnkuaXNSZWFkeSA9IHRydWU7CgoJCQkvLyBJZiB0aGVyZSBhcmUgZnVuY3Rpb25zIGJvdW5kLCB0byBleGVjdXRlCgkJCWlmICggalF1ZXJ5LnJlYWR5TGlzdCApIHsKCQkJCS8vIEV4ZWN1dGUgYWxsIG9mIHRoZW0KCQkJCXZhciBmbiwgaSA9IDA7CgkJCQl3aGlsZSAoIChmbiA9IGpRdWVyeS5yZWFkeUxpc3RbIGkrKyBdKSApIHsKCQkJCQlmbi5jYWxsKCBkb2N1bWVudCwgalF1ZXJ5ICk7CgkJCQl9CgoJCQkJLy8gUmVzZXQgdGhlIGxpc3Qgb2YgZnVuY3Rpb25zCgkJCQlqUXVlcnkucmVhZHlMaXN0ID0gbnVsbDsKCQkJfQoKCQkJLy8gVHJpZ2dlciBhbnkgYm91bmQgcmVhZHkgZXZlbnRzCgkJCWpRdWVyeSggZG9jdW1lbnQgKS50cmlnZ2VySGFuZGxlciggInJlYWR5IiApOwoJCX0KCX0KfSk7Cgp2YXIgcmVhZHlCb3VuZCA9IGZhbHNlOwoKZnVuY3Rpb24gYmluZFJlYWR5KCkgewoJaWYgKCByZWFkeUJvdW5kICkgcmV0dXJuOwoJcmVhZHlCb3VuZCA9IHRydWU7CgoJLy8gTW96aWxsYSwgT3BlcmEgYW5kIHdlYmtpdCBuaWdodGxpZXMgY3VycmVudGx5IHN1cHBvcnQgdGhpcyBldmVudAoJaWYgKCBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyICkgewoJCS8vIFVzZSB0aGUgaGFuZHkgZXZlbnQgY2FsbGJhY2sKCQlkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCAiRE9NQ29udGVudExvYWRlZCIsIGZ1bmN0aW9uKCkgewoJCQlkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCAiRE9NQ29udGVudExvYWRlZCIsIGFyZ3VtZW50cy5jYWxsZWUsIGZhbHNlICk7CgkJCWpRdWVyeS5yZWFkeSgpOwoJCX0sIGZhbHNlICk7CgoJLy8gSWYgSUUgZXZlbnQgbW9kZWwgaXMgdXNlZAoJfSBlbHNlIGlmICggZG9jdW1lbnQuYXR0YWNoRXZlbnQgKSB7CgkJLy8gZW5zdXJlIGZpcmluZyBiZWZvcmUgb25sb2FkLAoJCS8vIG1heWJlIGxhdGUgYnV0IHNhZmUgYWxzbyBmb3IgaWZyYW1lcwoJCWRvY3VtZW50LmF0dGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCBmdW5jdGlvbigpIHsKCQkJaWYgKCBkb2N1bWVudC5yZWFkeVN0YXRlID09PSAiY29tcGxldGUiICkgewoJCQkJZG9jdW1lbnQuZGV0YWNoRXZlbnQoICJvbnJlYWR5c3RhdGVjaGFuZ2UiLCBhcmd1bWVudHMuY2FsbGVlICk7CgkJCQlqUXVlcnkucmVhZHkoKTsKCQkJfQoJCX0pOwoKCQkvLyBJZiBJRSBhbmQgbm90IGFuIGlmcmFtZQoJCS8vIGNvbnRpbnVhbGx5IGNoZWNrIHRvIHNlZSBpZiB0aGUgZG9jdW1lbnQgaXMgcmVhZHkKCQlpZiAoIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCAmJiB3aW5kb3cgPT09IHdpbmRvdy50b3AgKSAoZnVuY3Rpb24oKSB7CgkJCWlmICggalF1ZXJ5LmlzUmVhZHkgKSB7CgkJCQlyZXR1cm47CgkJCX0KCgkJCXRyeSB7CgkJCQkvLyBJZiBJRSBpcyB1c2VkLCB1c2UgdGhlIHRyaWNrIGJ5IERpZWdvIFBlcmluaQoJCQkJLy8gaHR0cDovL2phdmFzY3JpcHQubndib3guY29tL0lFQ29udGVudExvYWRlZC8KCQkJCWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCgibGVmdCIpOwoJCQl9IGNhdGNoKCBlcnJvciApIHsKCQkJCXNldFRpbWVvdXQoIGFyZ3VtZW50cy5jYWxsZWUsIDAgKTsKCQkJCXJldHVybjsKCQkJfQoKCQkJLy8gYW5kIGV4ZWN1dGUgYW55IHdhaXRpbmcgZnVuY3Rpb25zCgkJCWpRdWVyeS5yZWFkeSgpOwoJCX0pKCk7Cgl9CgoJLy8gQSBmYWxsYmFjayB0byB3aW5kb3cub25sb2FkLCB0aGF0IHdpbGwgYWx3YXlzIHdvcmsKCWpRdWVyeS5ldmVudC5hZGQoIHdpbmRvdywgImxvYWQiLCBqUXVlcnkucmVhZHkgKTsKfQoKalF1ZXJ5LmVhY2goICgiYmx1cixmb2N1cyxsb2FkLHJlc2l6ZSxzY3JvbGwsdW5sb2FkLGNsaWNrLGRibGNsaWNrLCIgKwoJIm1vdXNlZG93bixtb3VzZXVwLG1vdXNlbW92ZSxtb3VzZW92ZXIsbW91c2VvdXQsbW91c2VlbnRlcixtb3VzZWxlYXZlLCIgKwoJImNoYW5nZSxzZWxlY3Qsc3VibWl0LGtleWRvd24sa2V5cHJlc3Msa2V5dXAsZXJyb3IiKS5zcGxpdCgiLCIpLCBmdW5jdGlvbiggaSwgbmFtZSApIHsKCgkvLyBIYW5kbGUgZXZlbnQgYmluZGluZwoJalF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggZm4gKSB7CgkJcmV0dXJuIGZuID8gdGhpcy5iaW5kKCBuYW1lLCBmbiApIDogdGhpcy50cmlnZ2VyKCBuYW1lICk7Cgl9Owp9KTsKCi8vIFByZXZlbnQgbWVtb3J5IGxlYWtzIGluIElFCi8vIEFuZCBwcmV2ZW50IGVycm9ycyBvbiByZWZyZXNoIHdpdGggZXZlbnRzIGxpa2UgbW91c2VvdmVyIGluIG90aGVyIGJyb3dzZXJzCi8vIFdpbmRvdyBpc24ndCBpbmNsdWRlZCBzbyBhcyBub3QgdG8gdW5iaW5kIGV4aXN0aW5nIHVubG9hZCBldmVudHMKLy8gTW9yZSBpbmZvOgovLyAgLSBodHRwOi8vaXNhYWNzY2hsdWV0ZXIuY29tLzIwMDYvMTAvbXNpZS1tZW1vcnktbGVha3MvCi8vICAtIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTI1MjU0MgpqUXVlcnkoIHdpbmRvdyApLmJpbmQoICd1bmxvYWQnLCBmdW5jdGlvbigpIHsKCWZvciAoIHZhciBpZCBpbiBqUXVlcnkuY2FjaGUgKSB7CgkJLy8gU2tpcCB0aGUgd2luZG93CgkJaWYgKCBpZCAhPSAxICYmIGpRdWVyeS5jYWNoZVsgaWQgXS5oYW5kbGUgKSB7CgkJCWpRdWVyeS5ldmVudC5yZW1vdmUoIGpRdWVyeS5jYWNoZVsgaWQgXS5oYW5kbGUuZWxlbSApOwoJCX0KCX0KfSk7CihmdW5jdGlvbigpewoKCWpRdWVyeS5zdXBwb3J0ID0ge307CgoJdmFyIHJvb3QgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsCgkJc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0IiksCgkJZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksCgkJaWQgPSAic2NyaXB0IiArIChuZXcgRGF0ZSkuZ2V0VGltZSgpOwoKCWRpdi5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwoJZGl2LmlubmVySFRNTCA9ICcgICA8bGluay8+PHRhYmxlPjwvdGFibGU+PGEgaHJlZj0iL2EiIHN0eWxlPSJjb2xvcjpyZWQ7ZmxvYXQ6bGVmdDtvcGFjaXR5Oi41OyI+YTwvYT48c2VsZWN0PjxvcHRpb24+dGV4dDwvb3B0aW9uPjwvc2VsZWN0Pic7CgoJdmFyIGFsbCA9IGRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLAoJCWEgPSBkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKVswXTsKCgkvLyBDYW4ndCBnZXQgYmFzaWMgdGVzdCBzdXBwb3J0CglpZiAoICFhbGwgfHwgIWFsbC5sZW5ndGggfHwgIWEgKSB7CgkJcmV0dXJuOwoJfQoKCWpRdWVyeS5zdXBwb3J0ID0gewoJCS8vIElFIHN0cmlwcyBsZWFkaW5nIHdoaXRlc3BhY2Ugd2hlbiAuaW5uZXJIVE1MIGlzIHVzZWQKCQlsZWFkaW5nV2hpdGVzcGFjZTogZGl2LmZpcnN0Q2hpbGQubm9kZVR5cGUgPT0gMywKCgkJLy8gTWFrZSBzdXJlIHRoYXQgdGJvZHkgZWxlbWVudHMgYXJlbid0IGF1dG9tYXRpY2FsbHkgaW5zZXJ0ZWQKCQkvLyBJRSB3aWxsIGluc2VydCB0aGVtIGludG8gZW1wdHkgdGFibGVzCgkJdGJvZHk6ICFkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRib2R5IikubGVuZ3RoLAoKCQkvLyBNYWtlIHN1cmUgdGhhdCBsaW5rIGVsZW1lbnRzIGdldCBzZXJpYWxpemVkIGNvcnJlY3RseSBieSBpbm5lckhUTUwKCQkvLyBUaGlzIHJlcXVpcmVzIGEgd3JhcHBlciBlbGVtZW50IGluIElFCgkJaHRtbFNlcmlhbGl6ZTogISFkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImxpbmsiKS5sZW5ndGgsCgoJCS8vIEdldCB0aGUgc3R5bGUgaW5mb3JtYXRpb24gZnJvbSBnZXRBdHRyaWJ1dGUKCQkvLyAoSUUgdXNlcyAuY3NzVGV4dCBpbnN0ZWQpCgkJc3R5bGU6IC9yZWQvLnRlc3QoIGEuZ2V0QXR0cmlidXRlKCJzdHlsZSIpICksCgoJCS8vIE1ha2Ugc3VyZSB0aGF0IFVSTHMgYXJlbid0IG1hbmlwdWxhdGVkCgkJLy8gKElFIG5vcm1hbGl6ZXMgaXQgYnkgZGVmYXVsdCkKCQlocmVmTm9ybWFsaXplZDogYS5nZXRBdHRyaWJ1dGUoImhyZWYiKSA9PT0gIi9hIiwKCgkJLy8gTWFrZSBzdXJlIHRoYXQgZWxlbWVudCBvcGFjaXR5IGV4aXN0cwoJCS8vIChJRSB1c2VzIGZpbHRlciBpbnN0ZWFkKQoJCW9wYWNpdHk6IGEuc3R5bGUub3BhY2l0eSA9PT0gIjAuNSIsCgoJCS8vIFZlcmlmeSBzdHlsZSBmbG9hdCBleGlzdGVuY2UKCQkvLyAoSUUgdXNlcyBzdHlsZUZsb2F0IGluc3RlYWQgb2YgY3NzRmxvYXQpCgkJY3NzRmxvYXQ6ICEhYS5zdHlsZS5jc3NGbG9hdCwKCgkJLy8gV2lsbCBiZSBkZWZpbmVkIGxhdGVyCgkJc2NyaXB0RXZhbDogZmFsc2UsCgkJbm9DbG9uZUV2ZW50OiB0cnVlLAoJCWJveE1vZGVsOiBudWxsCgl9OwoKCXNjcmlwdC50eXBlID0gInRleHQvamF2YXNjcmlwdCI7Cgl0cnkgewoJCXNjcmlwdC5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoICJ3aW5kb3cuIiArIGlkICsgIj0xOyIgKSApOwoJfSBjYXRjaChlKXt9CgoJcm9vdC5pbnNlcnRCZWZvcmUoIHNjcmlwdCwgcm9vdC5maXJzdENoaWxkICk7CgoJLy8gTWFrZSBzdXJlIHRoYXQgdGhlIGV4ZWN1dGlvbiBvZiBjb2RlIHdvcmtzIGJ5IGluamVjdGluZyBhIHNjcmlwdAoJLy8gdGFnIHdpdGggYXBwZW5kQ2hpbGQvY3JlYXRlVGV4dE5vZGUKCS8vIChJRSBkb2Vzbid0IHN1cHBvcnQgdGhpcywgZmFpbHMsIGFuZCB1c2VzIC50ZXh0IGluc3RlYWQpCglpZiAoIHdpbmRvd1sgaWQgXSApIHsKCQlqUXVlcnkuc3VwcG9ydC5zY3JpcHRFdmFsID0gdHJ1ZTsKCQlkZWxldGUgd2luZG93WyBpZCBdOwoJfQoKCXJvb3QucmVtb3ZlQ2hpbGQoIHNjcmlwdCApOwoKCWlmICggZGl2LmF0dGFjaEV2ZW50ICYmIGRpdi5maXJlRXZlbnQgKSB7CgkJZGl2LmF0dGFjaEV2ZW50KCJvbmNsaWNrIiwgZnVuY3Rpb24gY2xpY2soKXsKCQkJLy8gQ2xvbmluZyBhIG5vZGUgc2hvdWxkbid0IGNvcHkgb3ZlciBhbnkKCQkJLy8gYm91bmQgZXZlbnQgaGFuZGxlcnMgKElFIGRvZXMgdGhpcykKCQkJalF1ZXJ5LnN1cHBvcnQubm9DbG9uZUV2ZW50ID0gZmFsc2U7CgkJCWRpdi5kZXRhY2hFdmVudCgib25jbGljayIsIGNsaWNrKTsKCQl9KTsKCQlkaXYuY2xvbmVOb2RlKHRydWUpLmZpcmVFdmVudCgib25jbGljayIpOwoJfQoKCS8vIEZpZ3VyZSBvdXQgaWYgdGhlIFczQyBib3ggbW9kZWwgd29ya3MgYXMgZXhwZWN0ZWQKCS8vIGRvY3VtZW50LmJvZHkgbXVzdCBleGlzdCBiZWZvcmUgd2UgY2FuIGRvIHRoaXMKCWpRdWVyeShmdW5jdGlvbigpewoJCXZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKCQlkaXYuc3R5bGUud2lkdGggPSBkaXYuc3R5bGUucGFkZGluZ0xlZnQgPSAiMXB4IjsKCgkJZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCggZGl2ICk7CgkJalF1ZXJ5LmJveE1vZGVsID0galF1ZXJ5LnN1cHBvcnQuYm94TW9kZWwgPSBkaXYub2Zmc2V0V2lkdGggPT09IDI7CgkJZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCggZGl2ICkuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKCQlkaXYgPSBudWxsOwoJfSk7CgoJLy8gcmVsZWFzZSBtZW1vcnkgaW4gSUUKCXJvb3QgPSBzY3JpcHQgPSBkaXYgPSBhbGwgPSBhID0gbnVsbDsKfSkoKTsKCmpRdWVyeS5wcm9wcyA9IHsKCSJmb3IiOiAiaHRtbEZvciIsCgkiY2xhc3MiOiAiY2xhc3NOYW1lIiwKCXJlYWRvbmx5OiAicmVhZE9ubHkiLAoJbWF4bGVuZ3RoOiAibWF4TGVuZ3RoIiwKCWNlbGxzcGFjaW5nOiAiY2VsbFNwYWNpbmciLAoJcm93c3BhbjogInJvd1NwYW4iLAoJY29sc3BhbjogImNvbFNwYW4iLAoJdGFiaW5kZXg6ICJ0YWJJbmRleCIKfTsKLy8gZXhjbHVkZSB0aGUgZm9sbG93aW5nIGNzcyBwcm9wZXJ0aWVzIHRvIGFkZCBweAp2YXIgZXhjbHVkZSA9IC96LT9pbmRleHxmb250LT93ZWlnaHR8b3BhY2l0eXx6b29tfGxpbmUtP2hlaWdodC9pLAoJLy8gY2FjaGUgY2hlY2sgZm9yIGRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUKCWdldENvbXB1dGVkU3R5bGUgPSBkb2N1bWVudC5kZWZhdWx0VmlldyAmJiBkb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlLAoJLy8gbm9ybWFsaXplIGZsb2F0IGNzcyBwcm9wZXJ0eQoJc3R5bGVGbG9hdCA9IGpRdWVyeS5zdXBwb3J0LmNzc0Zsb2F0ID8gImNzc0Zsb2F0IiA6ICJzdHlsZUZsb2F0IjsKCmpRdWVyeS5mbi5jc3MgPSBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7Cgl2YXIgb3B0aW9ucyA9IG5hbWUsIGlzRnVuY3Rpb24gPSBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKTsKCglpZiAoIHR5cGVvZiBuYW1lID09PSAic3RyaW5nIiApIHsKCQkvLyBBcmUgd2Ugc2V0dGluZyB0aGUgc3R5bGU/CgkJaWYgKCB2YWx1ZSA9PT0gdW5kZWZpbmVkICkgewoJCQlyZXR1cm4gdGhpcy5sZW5ndGggPwoJCQkJalF1ZXJ5LmNzcyggdGhpc1swXSwgbmFtZSApIDoKCQkJCW51bGw7CgoJCS8vIENvbnZlcnQgbmFtZSwgdmFsdWUgcGFyYW1zIHRvIG9wdGlvbnMgaGFzaCBmb3JtYXQKCQl9IGVsc2UgewoJCQlvcHRpb25zID0ge307CgkJCW9wdGlvbnNbIG5hbWUgXSA9IHZhbHVlOwoJCX0KCX0KCgkvLyBGb3IgZWFjaCBlbGVtZW50Li4uCglmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKCQl2YXIgZWxlbSA9IHRoaXNbaV07CgoJCS8vIFNldCBhbGwgdGhlIHN0eWxlcwoJCWZvciAoIHZhciBwcm9wIGluIG9wdGlvbnMgKSB7CgkJCXZhbHVlID0gb3B0aW9uc1twcm9wXTsKCgkJCWlmICggaXNGdW5jdGlvbiApIHsKCQkJCXZhbHVlID0gdmFsdWUuY2FsbCggZWxlbSwgaSApOwoJCQl9CgoJCQlpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gIm51bWJlciIgJiYgIWV4Y2x1ZGUudGVzdChwcm9wKSApIHsKCQkJCXZhbHVlID0gdmFsdWUgKyAicHgiOwoJCQl9CgoJCQlqUXVlcnkuc3R5bGUoIGVsZW0sIHByb3AsIHZhbHVlICk7CgkJfQoJfQoKCXJldHVybiB0aGlzOwp9OwoKalF1ZXJ5LmV4dGVuZCh7CglzdHlsZTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlICkgewoJCS8vIGRvbid0IHNldCBzdHlsZXMgb24gdGV4dCBhbmQgY29tbWVudCBub2RlcwoJCWlmICghZWxlbSB8fCBlbGVtLm5vZGVUeXBlID09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PSA4KQoJCQlyZXR1cm4gdW5kZWZpbmVkOwoKCQkvLyBpZ25vcmUgbmVnYXRpdmUgd2lkdGggYW5kIGhlaWdodCB2YWx1ZXMgIzE1OTkKCQlpZiAoIChuYW1lID09ICd3aWR0aCcgfHwgbmFtZSA9PSAnaGVpZ2h0JykgJiYgcGFyc2VGbG9hdCh2YWx1ZSkgPCAwICkKCQkJdmFsdWUgPSB1bmRlZmluZWQ7CgoJCXZhciBzdHlsZSA9IGVsZW0uc3R5bGUgfHwgZWxlbSwgc2V0ID0gdmFsdWUgIT09IHVuZGVmaW5lZDsKCgkJLy8gSUUgdXNlcyBmaWx0ZXJzIGZvciBvcGFjaXR5CgkJaWYgKCAhalF1ZXJ5LnN1cHBvcnQub3BhY2l0eSAmJiBuYW1lID09ICJvcGFjaXR5IiApIHsKCQkJaWYgKCBzZXQgKSB7CgkJCQkvLyBJRSBoYXMgdHJvdWJsZSB3aXRoIG9wYWNpdHkgaWYgaXQgZG9lcyBub3QgaGF2ZSBsYXlvdXQKCQkJCS8vIEZvcmNlIGl0IGJ5IHNldHRpbmcgdGhlIHpvb20gbGV2ZWwKCQkJCXN0eWxlLnpvb20gPSAxOwoKCQkJCS8vIFNldCB0aGUgYWxwaGEgZmlsdGVyIHRvIHNldCB0aGUgb3BhY2l0eQoJCQkJc3R5bGUuZmlsdGVyID0gKHN0eWxlLmZpbHRlciB8fCAiIikucmVwbGFjZSggL2FscGhhXChbXildKlwpLywgIiIgKSArCgkJCQkJKHBhcnNlSW50KCB2YWx1ZSApICsgJycgPT0gIk5hTiIgPyAiIiA6ICJhbHBoYShvcGFjaXR5PSIgKyB2YWx1ZSAqIDEwMCArICIpIik7CgkJCX0KCgkJCXJldHVybiBzdHlsZS5maWx0ZXIgJiYgc3R5bGUuZmlsdGVyLmluZGV4T2YoIm9wYWNpdHk9IikgPj0gMCA/CgkJCQkocGFyc2VGbG9hdCggc3R5bGUuZmlsdGVyLm1hdGNoKC9vcGFjaXR5PShbXildKikvKVsxXSApIC8gMTAwKSArICcnOgoJCQkJIiI7CgkJfQoKCQkvLyBNYWtlIHN1cmUgd2UncmUgdXNpbmcgdGhlIHJpZ2h0IG5hbWUgZm9yIGdldHRpbmcgdGhlIGZsb2F0IHZhbHVlCgkJaWYgKCAvZmxvYXQvaS50ZXN0KCBuYW1lICkgKQoJCQluYW1lID0gc3R5bGVGbG9hdDsKCgkJbmFtZSA9IG5hbWUucmVwbGFjZSgvLShbYS16XSkvaWcsIGZ1bmN0aW9uKGFsbCwgbGV0dGVyKXsKCQkJcmV0dXJuIGxldHRlci50b1VwcGVyQ2FzZSgpOwoJCX0pOwoKCQlpZiAoIHNldCApCgkJCXN0eWxlWyBuYW1lIF0gPSB2YWx1ZTsKCgkJcmV0dXJuIHN0eWxlWyBuYW1lIF07Cgl9LAoKCWNzczogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGZvcmNlLCBleHRyYSApIHsKCQlpZiAoIG5hbWUgPT0gIndpZHRoIiB8fCBuYW1lID09ICJoZWlnaHQiICkgewoJCQl2YXIgdmFsLCBwcm9wcyA9IHsgcG9zaXRpb246ICJhYnNvbHV0ZSIsIHZpc2liaWxpdHk6ICJoaWRkZW4iLCBkaXNwbGF5OiJibG9jayIgfSwgd2hpY2ggPSBuYW1lID09ICJ3aWR0aCIgPyBbICJMZWZ0IiwgIlJpZ2h0IiBdIDogWyAiVG9wIiwgIkJvdHRvbSIgXTsKCgkJCWZ1bmN0aW9uIGdldFdIKCkgewoJCQkJdmFsID0gbmFtZSA9PSAid2lkdGgiID8gZWxlbS5vZmZzZXRXaWR0aCA6IGVsZW0ub2Zmc2V0SGVpZ2h0OwoKCQkJCWlmICggZXh0cmEgPT09ICJib3JkZXIiICkKCQkJCQlyZXR1cm47CgoJCQkJalF1ZXJ5LmVhY2goIHdoaWNoLCBmdW5jdGlvbigpIHsKCQkJCQlpZiAoICFleHRyYSApCgkJCQkJCXZhbCAtPSBwYXJzZUZsb2F0KGpRdWVyeS5jdXJDU1MoIGVsZW0sICJwYWRkaW5nIiArIHRoaXMsIHRydWUpKSB8fCAwOwoJCQkJCWlmICggZXh0cmEgPT09ICJtYXJnaW4iICkKCQkJCQkJdmFsICs9IHBhcnNlRmxvYXQoalF1ZXJ5LmN1ckNTUyggZWxlbSwgIm1hcmdpbiIgKyB0aGlzLCB0cnVlKSkgfHwgMDsKCQkJCQllbHNlCgkJCQkJCXZhbCAtPSBwYXJzZUZsb2F0KGpRdWVyeS5jdXJDU1MoIGVsZW0sICJib3JkZXIiICsgdGhpcyArICJXaWR0aCIsIHRydWUpKSB8fCAwOwoJCQkJfSk7CgkJCX0KCgkJCWlmICggZWxlbS5vZmZzZXRXaWR0aCAhPT0gMCApCgkJCQlnZXRXSCgpOwoJCQllbHNlCgkJCQlqUXVlcnkuc3dhcCggZWxlbSwgcHJvcHMsIGdldFdIICk7CgoJCQlyZXR1cm4gTWF0aC5tYXgoMCwgTWF0aC5yb3VuZCh2YWwpKTsKCQl9CgoJCXJldHVybiBqUXVlcnkuY3VyQ1NTKCBlbGVtLCBuYW1lLCBmb3JjZSApOwoJfSwKCgljdXJDU1M6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBmb3JjZSApIHsKCQl2YXIgcmV0LCBzdHlsZSA9IGVsZW0uc3R5bGUsIGZpbHRlcjsKCgkJLy8gSUUgdXNlcyBmaWx0ZXJzIGZvciBvcGFjaXR5CgkJaWYgKCAhalF1ZXJ5LnN1cHBvcnQub3BhY2l0eSAmJiBuYW1lID09PSAib3BhY2l0eSIgJiYgZWxlbS5jdXJyZW50U3R5bGUgKSB7CgkJCXJldCA9IChlbGVtLmN1cnJlbnRTdHlsZS5maWx0ZXIgfHwgIiIpLm1hdGNoKC9vcGFjaXR5PShbXildKikvKSA/CgkJCQkocGFyc2VGbG9hdChSZWdFeHAuJDEpIC8gMTAwKSArICIiIDoKCQkJCSIiOwoKCQkJcmV0dXJuIHJldCA9PT0gIiIgPwoJCQkJIjEiIDoKCQkJCXJldDsKCQl9CgoJCS8vIE1ha2Ugc3VyZSB3ZSdyZSB1c2luZyB0aGUgcmlnaHQgbmFtZSBmb3IgZ2V0dGluZyB0aGUgZmxvYXQgdmFsdWUKCQlpZiAoIC9mbG9hdC9pLnRlc3QoIG5hbWUgKSApCgkJCW5hbWUgPSBzdHlsZUZsb2F0OwoKCQlpZiAoICFmb3JjZSAmJiBzdHlsZSAmJiBzdHlsZVsgbmFtZSBdICkgewoJCQlyZXQgPSBzdHlsZVsgbmFtZSBdOwoKCQl9IGVsc2UgaWYgKCBnZXRDb21wdXRlZFN0eWxlICkgewoKCQkJLy8gT25seSAiZmxvYXQiIGlzIG5lZWRlZCBoZXJlCgkJCWlmICggL2Zsb2F0L2kudGVzdCggbmFtZSApICkKCQkJCW5hbWUgPSAiZmxvYXQiOwoKCQkJbmFtZSA9IG5hbWUucmVwbGFjZSggLyhbQS1aXSkvZywgIi0kMSIgKS50b0xvd2VyQ2FzZSgpOwoKCQkJdmFyIGNvbXB1dGVkU3R5bGUgPSBlbGVtLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSggZWxlbSwgbnVsbCApOwoKCQkJaWYgKCBjb21wdXRlZFN0eWxlICkKCQkJCXJldCA9IGNvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSggbmFtZSApOwoKCQkJLy8gV2Ugc2hvdWxkIGFsd2F5cyBnZXQgYSBudW1iZXIgYmFjayBmcm9tIG9wYWNpdHkKCQkJaWYgKCBuYW1lID09ICJvcGFjaXR5IiAmJiByZXQgPT0gIiIgKQoJCQkJcmV0ID0gIjEiOwoKCQl9IGVsc2UgaWYgKCBlbGVtLmN1cnJlbnRTdHlsZSApIHsKCQkJdmFyIGNhbWVsQ2FzZSA9IG5hbWUucmVwbGFjZSgvXC0oXHcpL2csIGZ1bmN0aW9uKGFsbCwgbGV0dGVyKXsKCQkJCXJldHVybiBsZXR0ZXIudG9VcHBlckNhc2UoKTsKCQkJfSk7CgoJCQlyZXQgPSBlbGVtLmN1cnJlbnRTdHlsZVsgbmFtZSBdIHx8IGVsZW0uY3VycmVudFN0eWxlWyBjYW1lbENhc2UgXTsKCgkJCS8vIEZyb20gdGhlIGF3ZXNvbWUgaGFjayBieSBEZWFuIEVkd2FyZHMKCQkJLy8gaHR0cDovL2VyaWsuZWFlLm5ldC9hcmNoaXZlcy8yMDA3LzA3LzI3LzE4LjU0LjE1LyNjb21tZW50LTEwMjI5MQoKCQkJLy8gSWYgd2UncmUgbm90IGRlYWxpbmcgd2l0aCBhIHJlZ3VsYXIgcGl4ZWwgbnVtYmVyCgkJCS8vIGJ1dCBhIG51bWJlciB0aGF0IGhhcyBhIHdlaXJkIGVuZGluZywgd2UgbmVlZCB0byBjb252ZXJ0IGl0IHRvIHBpeGVscwoJCQlpZiAoICEvXlxkKyhweCk/JC9pLnRlc3QoIHJldCApICYmIC9eXGQvLnRlc3QoIHJldCApICkgewoJCQkJLy8gUmVtZW1iZXIgdGhlIG9yaWdpbmFsIHZhbHVlcwoJCQkJdmFyIGxlZnQgPSBzdHlsZS5sZWZ0LCByc0xlZnQgPSBlbGVtLnJ1bnRpbWVTdHlsZS5sZWZ0OwoKCQkJCS8vIFB1dCBpbiB0aGUgbmV3IHZhbHVlcyB0byBnZXQgYSBjb21wdXRlZCB2YWx1ZSBvdXQKCQkJCWVsZW0ucnVudGltZVN0eWxlLmxlZnQgPSBlbGVtLmN1cnJlbnRTdHlsZS5sZWZ0OwoJCQkJc3R5bGUubGVmdCA9IHJldCB8fCAwOwoJCQkJcmV0ID0gc3R5bGUucGl4ZWxMZWZ0ICsgInB4IjsKCgkJCQkvLyBSZXZlcnQgdGhlIGNoYW5nZWQgdmFsdWVzCgkJCQlzdHlsZS5sZWZ0ID0gbGVmdDsKCQkJCWVsZW0ucnVudGltZVN0eWxlLmxlZnQgPSByc0xlZnQ7CgkJCX0KCQl9CgoJCXJldHVybiByZXQ7Cgl9LAoKCS8vIEEgbWV0aG9kIGZvciBxdWlja2x5IHN3YXBwaW5nIGluL291dCBDU1MgcHJvcGVydGllcyB0byBnZXQgY29ycmVjdCBjYWxjdWxhdGlvbnMKCXN3YXA6IGZ1bmN0aW9uKCBlbGVtLCBvcHRpb25zLCBjYWxsYmFjayApIHsKCQl2YXIgb2xkID0ge307CgkJLy8gUmVtZW1iZXIgdGhlIG9sZCB2YWx1ZXMsIGFuZCBpbnNlcnQgdGhlIG5ldyBvbmVzCgkJZm9yICggdmFyIG5hbWUgaW4gb3B0aW9ucyApIHsKCQkJb2xkWyBuYW1lIF0gPSBlbGVtLnN0eWxlWyBuYW1lIF07CgkJCWVsZW0uc3R5bGVbIG5hbWUgXSA9IG9wdGlvbnNbIG5hbWUgXTsKCQl9CgoJCWNhbGxiYWNrLmNhbGwoIGVsZW0gKTsKCgkJLy8gUmV2ZXJ0IHRoZSBvbGQgdmFsdWVzCgkJZm9yICggdmFyIG5hbWUgaW4gb3B0aW9ucyApCgkJCWVsZW0uc3R5bGVbIG5hbWUgXSA9IG9sZFsgbmFtZSBdOwoJfQp9KTtqUXVlcnkuZm4uZXh0ZW5kKHsKCS8vIEtlZXAgYSBjb3B5IG9mIHRoZSBvbGQgbG9hZAoJX2xvYWQ6IGpRdWVyeS5mbi5sb2FkLAoKCWxvYWQ6IGZ1bmN0aW9uKCB1cmwsIHBhcmFtcywgY2FsbGJhY2sgKSB7CgkJaWYgKCB0eXBlb2YgdXJsICE9PSAic3RyaW5nIiApCgkJCXJldHVybiB0aGlzLl9sb2FkKCB1cmwgKTsKCgkJdmFyIG9mZiA9IHVybC5pbmRleE9mKCIgIik7CgkJaWYgKCBvZmYgPj0gMCApIHsKCQkJdmFyIHNlbGVjdG9yID0gdXJsLnNsaWNlKG9mZiwgdXJsLmxlbmd0aCk7CgkJCXVybCA9IHVybC5zbGljZSgwLCBvZmYpOwoJCX0KCgkJLy8gRGVmYXVsdCB0byBhIEdFVCByZXF1ZXN0CgkJdmFyIHR5cGUgPSAiR0VUIjsKCgkJLy8gSWYgdGhlIHNlY29uZCBwYXJhbWV0ZXIgd2FzIHByb3ZpZGVkCgkJaWYgKCBwYXJhbXMgKQoJCQkvLyBJZiBpdCdzIGEgZnVuY3Rpb24KCQkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggcGFyYW1zICkgKSB7CgkJCQkvLyBXZSBhc3N1bWUgdGhhdCBpdCdzIHRoZSBjYWxsYmFjawoJCQkJY2FsbGJhY2sgPSBwYXJhbXM7CgkJCQlwYXJhbXMgPSBudWxsOwoKCQkJLy8gT3RoZXJ3aXNlLCBidWlsZCBhIHBhcmFtIHN0cmluZwoJCQl9IGVsc2UgaWYoIHR5cGVvZiBwYXJhbXMgPT09ICJvYmplY3QiICkgewoJCQkJcGFyYW1zID0galF1ZXJ5LnBhcmFtKCBwYXJhbXMgKTsKCQkJCXR5cGUgPSAiUE9TVCI7CgkJCX0KCgkJdmFyIHNlbGYgPSB0aGlzOwoKCQkvLyBSZXF1ZXN0IHRoZSByZW1vdGUgZG9jdW1lbnQKCQlqUXVlcnkuYWpheCh7CgkJCXVybDogdXJsLAoJCQl0eXBlOiB0eXBlLAoJCQlkYXRhVHlwZTogImh0bWwiLAoJCQlkYXRhOiBwYXJhbXMsCgkJCWNvbXBsZXRlOiBmdW5jdGlvbihyZXMsIHN0YXR1cyl7CgkJCQkvLyBJZiBzdWNjZXNzZnVsLCBpbmplY3QgdGhlIEhUTUwgaW50byBhbGwgdGhlIG1hdGNoZWQgZWxlbWVudHMKCQkJCWlmICggc3RhdHVzID09ICJzdWNjZXNzIiB8fCBzdGF0dXMgPT0gIm5vdG1vZGlmaWVkIiApCgkJCQkJLy8gU2VlIGlmIGEgc2VsZWN0b3Igd2FzIHNwZWNpZmllZAoJCQkJCXNlbGYuaHRtbCggc2VsZWN0b3IgPwoJCQkJCQkvLyBDcmVhdGUgYSBkdW1teSBkaXYgdG8gaG9sZCB0aGUgcmVzdWx0cwoJCQkJCQlqUXVlcnkoIjxkaXYvPiIpCgkJCQkJCQkvLyBpbmplY3QgdGhlIGNvbnRlbnRzIG9mIHRoZSBkb2N1bWVudCBpbiwgcmVtb3ZpbmcgdGhlIHNjcmlwdHMKCQkJCQkJCS8vIHRvIGF2b2lkIGFueSAnUGVybWlzc2lvbiBEZW5pZWQnIGVycm9ycyBpbiBJRQoJCQkJCQkJLmFwcGVuZChyZXMucmVzcG9uc2VUZXh0LnJlcGxhY2UoLzxzY3JpcHQoLnxccykqP1wvc2NyaXB0Pi9nLCAiIikpCgoJCQkJCQkJLy8gTG9jYXRlIHRoZSBzcGVjaWZpZWQgZWxlbWVudHMKCQkJCQkJCS5maW5kKHNlbGVjdG9yKSA6CgoJCQkJCQkvLyBJZiBub3QsIGp1c3QgaW5qZWN0IHRoZSBmdWxsIHJlc3VsdAoJCQkJCQlyZXMucmVzcG9uc2VUZXh0ICk7CgoJCQkJaWYoIGNhbGxiYWNrICkKCQkJCQlzZWxmLmVhY2goIGNhbGxiYWNrLCBbcmVzLnJlc3BvbnNlVGV4dCwgc3RhdHVzLCByZXNdICk7CgkJCX0KCQl9KTsKCQlyZXR1cm4gdGhpczsKCX0sCgoJc2VyaWFsaXplOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4galF1ZXJ5LnBhcmFtKHRoaXMuc2VyaWFsaXplQXJyYXkoKSk7Cgl9LAoJc2VyaWFsaXplQXJyYXk6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLm1hcChmdW5jdGlvbigpewoJCQlyZXR1cm4gdGhpcy5lbGVtZW50cyA/IGpRdWVyeS5tYWtlQXJyYXkodGhpcy5lbGVtZW50cykgOiB0aGlzOwoJCX0pCgkJLmZpbHRlcihmdW5jdGlvbigpewoJCQlyZXR1cm4gdGhpcy5uYW1lICYmICF0aGlzLmRpc2FibGVkICYmCgkJCQkodGhpcy5jaGVja2VkIHx8IC9zZWxlY3R8dGV4dGFyZWEvaS50ZXN0KHRoaXMubm9kZU5hbWUpIHx8CgkJCQkJL3RleHR8aGlkZGVufHBhc3N3b3JkfHNlYXJjaC9pLnRlc3QodGhpcy50eXBlKSk7CgkJfSkKCQkubWFwKGZ1bmN0aW9uKGksIGVsZW0pewoJCQl2YXIgdmFsID0galF1ZXJ5KHRoaXMpLnZhbCgpOwoJCQlyZXR1cm4gdmFsID09IG51bGwgPyBudWxsIDoKCQkJCWpRdWVyeS5pc0FycmF5KHZhbCkgPwoJCQkJCWpRdWVyeS5tYXAoIHZhbCwgZnVuY3Rpb24odmFsLCBpKXsKCQkJCQkJcmV0dXJuIHtuYW1lOiBlbGVtLm5hbWUsIHZhbHVlOiB2YWx9OwoJCQkJCX0pIDoKCQkJCQl7bmFtZTogZWxlbS5uYW1lLCB2YWx1ZTogdmFsfTsKCQl9KS5nZXQoKTsKCX0KfSk7CgovLyBBdHRhY2ggYSBidW5jaCBvZiBmdW5jdGlvbnMgZm9yIGhhbmRsaW5nIGNvbW1vbiBBSkFYIGV2ZW50cwpqUXVlcnkuZWFjaCggImFqYXhTdGFydCxhamF4U3RvcCxhamF4Q29tcGxldGUsYWpheEVycm9yLGFqYXhTdWNjZXNzLGFqYXhTZW5kIi5zcGxpdCgiLCIpLCBmdW5jdGlvbihpLG8pewoJalF1ZXJ5LmZuW29dID0gZnVuY3Rpb24oZil7CgkJcmV0dXJuIHRoaXMuYmluZChvLCBmKTsKCX07Cn0pOwoKdmFyIGpzYyA9IG5vdygpOwoKalF1ZXJ5LmV4dGVuZCh7CgoJZ2V0OiBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjaywgdHlwZSApIHsKCQkvLyBzaGlmdCBhcmd1bWVudHMgaWYgZGF0YSBhcmd1bWVudCB3YXMgb21taXRlZAoJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGRhdGEgKSApIHsKCQkJY2FsbGJhY2sgPSBkYXRhOwoJCQlkYXRhID0gbnVsbDsKCQl9CgoJCXJldHVybiBqUXVlcnkuYWpheCh7CgkJCXR5cGU6ICJHRVQiLAoJCQl1cmw6IHVybCwKCQkJZGF0YTogZGF0YSwKCQkJc3VjY2VzczogY2FsbGJhY2ssCgkJCWRhdGFUeXBlOiB0eXBlCgkJfSk7Cgl9LAoKCWdldFNjcmlwdDogZnVuY3Rpb24oIHVybCwgY2FsbGJhY2sgKSB7CgkJcmV0dXJuIGpRdWVyeS5nZXQodXJsLCBudWxsLCBjYWxsYmFjaywgInNjcmlwdCIpOwoJfSwKCglnZXRKU09OOiBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjayApIHsKCQlyZXR1cm4galF1ZXJ5LmdldCh1cmwsIGRhdGEsIGNhbGxiYWNrLCAianNvbiIpOwoJfSwKCglwb3N0OiBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjaywgdHlwZSApIHsKCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBkYXRhICkgKSB7CgkJCWNhbGxiYWNrID0gZGF0YTsKCQkJZGF0YSA9IHt9OwoJCX0KCgkJcmV0dXJuIGpRdWVyeS5hamF4KHsKCQkJdHlwZTogIlBPU1QiLAoJCQl1cmw6IHVybCwKCQkJZGF0YTogZGF0YSwKCQkJc3VjY2VzczogY2FsbGJhY2ssCgkJCWRhdGFUeXBlOiB0eXBlCgkJfSk7Cgl9LAoKCWFqYXhTZXR1cDogZnVuY3Rpb24oIHNldHRpbmdzICkgewoJCWpRdWVyeS5leHRlbmQoIGpRdWVyeS5hamF4U2V0dGluZ3MsIHNldHRpbmdzICk7Cgl9LAoKCWFqYXhTZXR0aW5nczogewoJCXVybDogbG9jYXRpb24uaHJlZiwKCQlnbG9iYWw6IHRydWUsCgkJdHlwZTogIkdFVCIsCgkJY29udGVudFR5cGU6ICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiLAoJCXByb2Nlc3NEYXRhOiB0cnVlLAoJCWFzeW5jOiB0cnVlLAoJCS8qCgkJdGltZW91dDogMCwKCQlkYXRhOiBudWxsLAoJCXVzZXJuYW1lOiBudWxsLAoJCXBhc3N3b3JkOiBudWxsLAoJCSovCgkJLy8gQ3JlYXRlIHRoZSByZXF1ZXN0IG9iamVjdDsgTWljcm9zb2Z0IGZhaWxlZCB0byBwcm9wZXJseQoJCS8vIGltcGxlbWVudCB0aGUgWE1MSHR0cFJlcXVlc3QgaW4gSUU3LCBzbyB3ZSB1c2UgdGhlIEFjdGl2ZVhPYmplY3Qgd2hlbiBpdCBpcyBhdmFpbGFibGUKCQkvLyBUaGlzIGZ1bmN0aW9uIGNhbiBiZSBvdmVycmlkZW4gYnkgY2FsbGluZyBqUXVlcnkuYWpheFNldHVwCgkJeGhyOmZ1bmN0aW9uKCl7CgkJCXJldHVybiB3aW5kb3cuQWN0aXZlWE9iamVjdCA/IG5ldyBBY3RpdmVYT2JqZWN0KCJNaWNyb3NvZnQuWE1MSFRUUCIpIDogbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CgkJfSwKCQlhY2NlcHRzOiB7CgkJCXhtbDogImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLAoJCQlodG1sOiAidGV4dC9odG1sIiwKCQkJc2NyaXB0OiAidGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0IiwKCQkJanNvbjogImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCIsCgkJCXRleHQ6ICJ0ZXh0L3BsYWluIiwKCQkJX2RlZmF1bHQ6ICIqLyoiCgkJfQoJfSwKCgkvLyBMYXN0LU1vZGlmaWVkIGhlYWRlciBjYWNoZSBmb3IgbmV4dCByZXF1ZXN0CglsYXN0TW9kaWZpZWQ6IHt9LAoKCWFqYXg6IGZ1bmN0aW9uKCBzICkgewoJCS8vIEV4dGVuZCB0aGUgc2V0dGluZ3MsIGJ1dCByZS1leHRlbmQgJ3MnIHNvIHRoYXQgaXQgY2FuIGJlCgkJLy8gY2hlY2tlZCBhZ2FpbiBsYXRlciAoaW4gdGhlIHRlc3Qgc3VpdGUsIHNwZWNpZmljYWxseSkKCQlzID0galF1ZXJ5LmV4dGVuZCh0cnVlLCBzLCBqUXVlcnkuZXh0ZW5kKHRydWUsIHt9LCBqUXVlcnkuYWpheFNldHRpbmdzLCBzKSk7CgoJCXZhciBqc29ucCwganNyZSA9IC89XD8oJnwkKS9nLCBzdGF0dXMsIGRhdGEsCgkJCXR5cGUgPSBzLnR5cGUudG9VcHBlckNhc2UoKTsKCgkJLy8gY29udmVydCBkYXRhIGlmIG5vdCBhbHJlYWR5IGEgc3RyaW5nCgkJaWYgKCBzLmRhdGEgJiYgcy5wcm9jZXNzRGF0YSAmJiB0eXBlb2Ygcy5kYXRhICE9PSAic3RyaW5nIiApCgkJCXMuZGF0YSA9IGpRdWVyeS5wYXJhbShzLmRhdGEpOwoKCQkvLyBIYW5kbGUgSlNPTlAgUGFyYW1ldGVyIENhbGxiYWNrcwoJCWlmICggcy5kYXRhVHlwZSA9PSAianNvbnAiICkgewoJCQlpZiAoIHR5cGUgPT0gIkdFVCIgKSB7CgkJCQlpZiAoICFzLnVybC5tYXRjaChqc3JlKSApCgkJCQkJcy51cmwgKz0gKHMudXJsLm1hdGNoKC9cPy8pID8gIiYiIDogIj8iKSArIChzLmpzb25wIHx8ICJjYWxsYmFjayIpICsgIj0/IjsKCQkJfSBlbHNlIGlmICggIXMuZGF0YSB8fCAhcy5kYXRhLm1hdGNoKGpzcmUpICkKCQkJCXMuZGF0YSA9IChzLmRhdGEgPyBzLmRhdGEgKyAiJiIgOiAiIikgKyAocy5qc29ucCB8fCAiY2FsbGJhY2siKSArICI9PyI7CgkJCXMuZGF0YVR5cGUgPSAianNvbiI7CgkJfQoKCQkvLyBCdWlsZCB0ZW1wb3JhcnkgSlNPTlAgZnVuY3Rpb24KCQlpZiAoIHMuZGF0YVR5cGUgPT0gImpzb24iICYmIChzLmRhdGEgJiYgcy5kYXRhLm1hdGNoKGpzcmUpIHx8IHMudXJsLm1hdGNoKGpzcmUpKSApIHsKCQkJanNvbnAgPSAianNvbnAiICsganNjKys7CgoJCQkvLyBSZXBsYWNlIHRoZSA9PyBzZXF1ZW5jZSBib3RoIGluIHRoZSBxdWVyeSBzdHJpbmcgYW5kIHRoZSBkYXRhCgkJCWlmICggcy5kYXRhICkKCQkJCXMuZGF0YSA9IChzLmRhdGEgKyAiIikucmVwbGFjZShqc3JlLCAiPSIgKyBqc29ucCArICIkMSIpOwoJCQlzLnVybCA9IHMudXJsLnJlcGxhY2UoanNyZSwgIj0iICsganNvbnAgKyAiJDEiKTsKCgkJCS8vIFdlIG5lZWQgdG8gbWFrZSBzdXJlCgkJCS8vIHRoYXQgYSBKU09OUCBzdHlsZSByZXNwb25zZSBpcyBleGVjdXRlZCBwcm9wZXJseQoJCQlzLmRhdGFUeXBlID0gInNjcmlwdCI7CgoJCQkvLyBIYW5kbGUgSlNPTlAtc3R5bGUgbG9hZGluZwoJCQl3aW5kb3dbIGpzb25wIF0gPSBmdW5jdGlvbih0bXApewoJCQkJZGF0YSA9IHRtcDsKCQkJCXN1Y2Nlc3MoKTsKCQkJCWNvbXBsZXRlKCk7CgkJCQkvLyBHYXJiYWdlIGNvbGxlY3QKCQkJCXdpbmRvd1sganNvbnAgXSA9IHVuZGVmaW5lZDsKCQkJCXRyeXsgZGVsZXRlIHdpbmRvd1sganNvbnAgXTsgfSBjYXRjaChlKXt9CgkJCQlpZiAoIGhlYWQgKQoJCQkJCWhlYWQucmVtb3ZlQ2hpbGQoIHNjcmlwdCApOwoJCQl9OwoJCX0KCgkJaWYgKCBzLmRhdGFUeXBlID09ICJzY3JpcHQiICYmIHMuY2FjaGUgPT0gbnVsbCApCgkJCXMuY2FjaGUgPSBmYWxzZTsKCgkJaWYgKCBzLmNhY2hlID09PSBmYWxzZSAmJiB0eXBlID09ICJHRVQiICkgewoJCQl2YXIgdHMgPSBub3coKTsKCQkJLy8gdHJ5IHJlcGxhY2luZyBfPSBpZiBpdCBpcyB0aGVyZQoJCQl2YXIgcmV0ID0gcy51cmwucmVwbGFjZSgvKFw/fCYpXz0uKj8oJnwkKS8sICIkMV89IiArIHRzICsgIiQyIik7CgkJCS8vIGlmIG5vdGhpbmcgd2FzIHJlcGxhY2VkLCBhZGQgdGltZXN0YW1wIHRvIHRoZSBlbmQKCQkJcy51cmwgPSByZXQgKyAoKHJldCA9PSBzLnVybCkgPyAocy51cmwubWF0Y2goL1w/LykgPyAiJiIgOiAiPyIpICsgIl89IiArIHRzIDogIiIpOwoJCX0KCgkJLy8gSWYgZGF0YSBpcyBhdmFpbGFibGUsIGFwcGVuZCBkYXRhIHRvIHVybCBmb3IgZ2V0IHJlcXVlc3RzCgkJaWYgKCBzLmRhdGEgJiYgdHlwZSA9PSAiR0VUIiApIHsKCQkJcy51cmwgKz0gKHMudXJsLm1hdGNoKC9cPy8pID8gIiYiIDogIj8iKSArIHMuZGF0YTsKCQl9CgoJCS8vIFdhdGNoIGZvciBhIG5ldyBzZXQgb2YgcmVxdWVzdHMKCQlpZiAoIHMuZ2xvYmFsICYmICEgalF1ZXJ5LmFjdGl2ZSsrICkKCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoICJhamF4U3RhcnQiICk7CgoJCS8vIE1hdGNoZXMgYW4gYWJzb2x1dGUgVVJMLCBhbmQgc2F2ZXMgdGhlIGRvbWFpbgoJCXZhciBwYXJ0cyA9IC9eKFx3KzopP1wvXC8oW15cLz8jXSspLy5leGVjKCBzLnVybCApOwoKCQkvLyBJZiB3ZSdyZSByZXF1ZXN0aW5nIGEgcmVtb3RlIGRvY3VtZW50CgkJLy8gYW5kIHRyeWluZyB0byBsb2FkIEpTT04gb3IgU2NyaXB0IHdpdGggYSBHRVQKCQlpZiAoIHMuZGF0YVR5cGUgPT0gInNjcmlwdCIgJiYgdHlwZSA9PSAiR0VUIiAmJiBwYXJ0cwoJCQkmJiAoIHBhcnRzWzFdICYmIHBhcnRzWzFdICE9IGxvY2F0aW9uLnByb3RvY29sIHx8IHBhcnRzWzJdICE9IGxvY2F0aW9uLmhvc3QgKSl7CgoJCQl2YXIgaGVhZCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF07CgkJCXZhciBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTsKCQkJc2NyaXB0LnNyYyA9IHMudXJsOwoJCQlpZiAocy5zY3JpcHRDaGFyc2V0KQoJCQkJc2NyaXB0LmNoYXJzZXQgPSBzLnNjcmlwdENoYXJzZXQ7CgoJCQkvLyBIYW5kbGUgU2NyaXB0IGxvYWRpbmcKCQkJaWYgKCAhanNvbnAgKSB7CgkJCQl2YXIgZG9uZSA9IGZhbHNlOwoKCQkJCS8vIEF0dGFjaCBoYW5kbGVycyBmb3IgYWxsIGJyb3dzZXJzCgkJCQlzY3JpcHQub25sb2FkID0gc2NyaXB0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCl7CgkJCQkJaWYgKCAhZG9uZSAmJiAoIXRoaXMucmVhZHlTdGF0ZSB8fAoJCQkJCQkJdGhpcy5yZWFkeVN0YXRlID09ICJsb2FkZWQiIHx8IHRoaXMucmVhZHlTdGF0ZSA9PSAiY29tcGxldGUiKSApIHsKCQkJCQkJZG9uZSA9IHRydWU7CgkJCQkJCXN1Y2Nlc3MoKTsKCQkJCQkJY29tcGxldGUoKTsKCgkJCQkJCS8vIEhhbmRsZSBtZW1vcnkgbGVhayBpbiBJRQoJCQkJCQlzY3JpcHQub25sb2FkID0gc2NyaXB0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGw7CgkJCQkJCWhlYWQucmVtb3ZlQ2hpbGQoIHNjcmlwdCApOwoJCQkJCX0KCQkJCX07CgkJCX0KCgkJCS8vIFVzZSBpbnNlcnRCZWZvcmUgaW5zdGVhZCBvZiBhcHBlbmRDaGlsZCAgdG8gY2lyY3VtdmVudCBhbiBJRTYgYnVnLgoJCQkvLyBUaGlzIGFyaXNlcyB3aGVuIGEgYmFzZSBub2RlIGlzIHVzZWQgKCMyNzA5IGFuZCAjNDM3OCkuCgkJCWhlYWQuaW5zZXJ0QmVmb3JlKCBzY3JpcHQsIGhlYWQuZmlyc3RDaGlsZCApOwoKCQkJLy8gV2UgaGFuZGxlIGV2ZXJ5dGhpbmcgdXNpbmcgdGhlIHNjcmlwdCBlbGVtZW50IGluamVjdGlvbgoJCQlyZXR1cm4gdW5kZWZpbmVkOwoJCX0KCgkJdmFyIHJlcXVlc3REb25lID0gZmFsc2U7CgoJCS8vIENyZWF0ZSB0aGUgcmVxdWVzdCBvYmplY3QKCQl2YXIgeGhyID0gcy54aHIoKTsKCgkJLy8gT3BlbiB0aGUgc29ja2V0CgkJLy8gUGFzc2luZyBudWxsIHVzZXJuYW1lLCBnZW5lcmF0ZXMgYSBsb2dpbiBwb3B1cCBvbiBPcGVyYSAoIzI4NjUpCgkJaWYoIHMudXNlcm5hbWUgKQoJCQl4aHIub3Blbih0eXBlLCBzLnVybCwgcy5hc3luYywgcy51c2VybmFtZSwgcy5wYXNzd29yZCk7CgkJZWxzZQoJCQl4aHIub3Blbih0eXBlLCBzLnVybCwgcy5hc3luYyk7CgoJCS8vIE5lZWQgYW4gZXh0cmEgdHJ5L2NhdGNoIGZvciBjcm9zcyBkb21haW4gcmVxdWVzdHMgaW4gRmlyZWZveCAzCgkJdHJ5IHsKCQkJLy8gU2V0IHRoZSBjb3JyZWN0IGhlYWRlciwgaWYgZGF0YSBpcyBiZWluZyBzZW50CgkJCWlmICggcy5kYXRhICkKCQkJCXhoci5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLCBzLmNvbnRlbnRUeXBlKTsKCgkJCS8vIFNldCB0aGUgSWYtTW9kaWZpZWQtU2luY2UgaGVhZGVyLCBpZiBpZk1vZGlmaWVkIG1vZGUuCgkJCWlmICggcy5pZk1vZGlmaWVkICkKCQkJCXhoci5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Nb2RpZmllZC1TaW5jZSIsCgkJCQkJalF1ZXJ5Lmxhc3RNb2RpZmllZFtzLnVybF0gfHwgIlRodSwgMDEgSmFuIDE5NzAgMDA6MDA6MDAgR01UIiApOwoKCQkJLy8gU2V0IGhlYWRlciBzbyB0aGUgY2FsbGVkIHNjcmlwdCBrbm93cyB0aGF0IGl0J3MgYW4gWE1MSHR0cFJlcXVlc3QKCQkJeGhyLnNldFJlcXVlc3RIZWFkZXIoIlgtUmVxdWVzdGVkLVdpdGgiLCAiWE1MSHR0cFJlcXVlc3QiKTsKCgkJCS8vIFNldCB0aGUgQWNjZXB0cyBoZWFkZXIgZm9yIHRoZSBzZXJ2ZXIsIGRlcGVuZGluZyBvbiB0aGUgZGF0YVR5cGUKCQkJeGhyLnNldFJlcXVlc3RIZWFkZXIoIkFjY2VwdCIsIHMuZGF0YVR5cGUgJiYgcy5hY2NlcHRzWyBzLmRhdGFUeXBlIF0gPwoJCQkJcy5hY2NlcHRzWyBzLmRhdGFUeXBlIF0gKyAiLCAqLyoiIDoKCQkJCXMuYWNjZXB0cy5fZGVmYXVsdCApOwoJCX0gY2F0Y2goZSl7fQoKCQkvLyBBbGxvdyBjdXN0b20gaGVhZGVycy9taW1ldHlwZXMgYW5kIGVhcmx5IGFib3J0CgkJaWYgKCBzLmJlZm9yZVNlbmQgJiYgcy5iZWZvcmVTZW5kKHhociwgcykgPT09IGZhbHNlICkgewoJCQkvLyBIYW5kbGUgdGhlIGdsb2JhbCBBSkFYIGNvdW50ZXIKCQkJaWYgKCBzLmdsb2JhbCAmJiAhIC0talF1ZXJ5LmFjdGl2ZSApCgkJCQlqUXVlcnkuZXZlbnQudHJpZ2dlciggImFqYXhTdG9wIiApOwoJCQkvLyBjbG9zZSBvcGVuZGVkIHNvY2tldAoJCQl4aHIuYWJvcnQoKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJaWYgKCBzLmdsb2JhbCApCgkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCJhamF4U2VuZCIsIFt4aHIsIHNdKTsKCgkJLy8gV2FpdCBmb3IgYSByZXNwb25zZSB0byBjb21lIGJhY2sKCQl2YXIgb25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oaXNUaW1lb3V0KXsKCQkJLy8gVGhlIHJlcXVlc3Qgd2FzIGFib3J0ZWQsIGNsZWFyIHRoZSBpbnRlcnZhbCBhbmQgZGVjcmVtZW50IGpRdWVyeS5hY3RpdmUKCQkJaWYgKHhoci5yZWFkeVN0YXRlID09IDApIHsKCQkJCWlmIChpdmFsKSB7CgkJCQkJLy8gY2xlYXIgcG9sbCBpbnRlcnZhbAoJCQkJCWNsZWFySW50ZXJ2YWwoaXZhbCk7CgkJCQkJaXZhbCA9IG51bGw7CgkJCQkJLy8gSGFuZGxlIHRoZSBnbG9iYWwgQUpBWCBjb3VudGVyCgkJCQkJaWYgKCBzLmdsb2JhbCAmJiAhIC0talF1ZXJ5LmFjdGl2ZSApCgkJCQkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCAiYWpheFN0b3AiICk7CgkJCQl9CgkJCS8vIFRoZSB0cmFuc2ZlciBpcyBjb21wbGV0ZSBhbmQgdGhlIGRhdGEgaXMgYXZhaWxhYmxlLCBvciB0aGUgcmVxdWVzdCB0aW1lZCBvdXQKCQkJfSBlbHNlIGlmICggIXJlcXVlc3REb25lICYmIHhociAmJiAoeGhyLnJlYWR5U3RhdGUgPT0gNCB8fCBpc1RpbWVvdXQgPT0gInRpbWVvdXQiKSApIHsKCQkJCXJlcXVlc3REb25lID0gdHJ1ZTsKCgkJCQkvLyBjbGVhciBwb2xsIGludGVydmFsCgkJCQlpZiAoaXZhbCkgewoJCQkJCWNsZWFySW50ZXJ2YWwoaXZhbCk7CgkJCQkJaXZhbCA9IG51bGw7CgkJCQl9CgoJCQkJc3RhdHVzID0gaXNUaW1lb3V0ID09ICJ0aW1lb3V0IiA/ICJ0aW1lb3V0IiA6CgkJCQkJIWpRdWVyeS5odHRwU3VjY2VzcyggeGhyICkgPyAiZXJyb3IiIDoKCQkJCQlzLmlmTW9kaWZpZWQgJiYgalF1ZXJ5Lmh0dHBOb3RNb2RpZmllZCggeGhyLCBzLnVybCApID8gIm5vdG1vZGlmaWVkIiA6CgkJCQkJInN1Y2Nlc3MiOwoKCQkJCWlmICggc3RhdHVzID09ICJzdWNjZXNzIiApIHsKCQkJCQkvLyBXYXRjaCBmb3IsIGFuZCBjYXRjaCwgWE1MIGRvY3VtZW50IHBhcnNlIGVycm9ycwoJCQkJCXRyeSB7CgkJCQkJCS8vIHByb2Nlc3MgdGhlIGRhdGEgKHJ1bnMgdGhlIHhtbCB0aHJvdWdoIGh0dHBEYXRhIHJlZ2FyZGxlc3Mgb2YgY2FsbGJhY2spCgkJCQkJCWRhdGEgPSBqUXVlcnkuaHR0cERhdGEoIHhociwgcy5kYXRhVHlwZSwgcyApOwoJCQkJCX0gY2F0Y2goZSkgewoJCQkJCQlzdGF0dXMgPSAicGFyc2VyZXJyb3IiOwoJCQkJCX0KCQkJCX0KCgkJCQkvLyBNYWtlIHN1cmUgdGhhdCB0aGUgcmVxdWVzdCB3YXMgc3VjY2Vzc2Z1bCBvciBub3Rtb2RpZmllZAoJCQkJaWYgKCBzdGF0dXMgPT0gInN1Y2Nlc3MiICkgewoJCQkJCS8vIENhY2hlIExhc3QtTW9kaWZpZWQgaGVhZGVyLCBpZiBpZk1vZGlmaWVkIG1vZGUuCgkJCQkJdmFyIG1vZFJlczsKCQkJCQl0cnkgewoJCQkJCQltb2RSZXMgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoIkxhc3QtTW9kaWZpZWQiKTsKCQkJCQl9IGNhdGNoKGUpIHt9IC8vIHN3YWxsb3cgZXhjZXB0aW9uIHRocm93biBieSBGRiBpZiBoZWFkZXIgaXMgbm90IGF2YWlsYWJsZQoKCQkJCQlpZiAoIHMuaWZNb2RpZmllZCAmJiBtb2RSZXMgKQoJCQkJCQlqUXVlcnkubGFzdE1vZGlmaWVkW3MudXJsXSA9IG1vZFJlczsKCgkJCQkJLy8gSlNPTlAgaGFuZGxlcyBpdHMgb3duIHN1Y2Nlc3MgY2FsbGJhY2sKCQkJCQlpZiAoICFqc29ucCApCgkJCQkJCXN1Y2Nlc3MoKTsKCQkJCX0gZWxzZQoJCQkJCWpRdWVyeS5oYW5kbGVFcnJvcihzLCB4aHIsIHN0YXR1cyk7CgoJCQkJLy8gRmlyZSB0aGUgY29tcGxldGUgaGFuZGxlcnMKCQkJCWNvbXBsZXRlKCk7CgoJCQkJaWYgKCBpc1RpbWVvdXQgKQoJCQkJCXhoci5hYm9ydCgpOwoKCQkJCS8vIFN0b3AgbWVtb3J5IGxlYWtzCgkJCQlpZiAoIHMuYXN5bmMgKQoJCQkJCXhociA9IG51bGw7CgkJCX0KCQl9OwoKCQlpZiAoIHMuYXN5bmMgKSB7CgkJCS8vIGRvbid0IGF0dGFjaCB0aGUgaGFuZGxlciB0byB0aGUgcmVxdWVzdCwganVzdCBwb2xsIGl0IGluc3RlYWQKCQkJdmFyIGl2YWwgPSBzZXRJbnRlcnZhbChvbnJlYWR5c3RhdGVjaGFuZ2UsIDEzKTsKCgkJCS8vIFRpbWVvdXQgY2hlY2tlcgoJCQlpZiAoIHMudGltZW91dCA+IDAgKQoJCQkJc2V0VGltZW91dChmdW5jdGlvbigpewoJCQkJCS8vIENoZWNrIHRvIHNlZSBpZiB0aGUgcmVxdWVzdCBpcyBzdGlsbCBoYXBwZW5pbmcKCQkJCQlpZiAoIHhociAmJiAhcmVxdWVzdERvbmUgKQoJCQkJCQlvbnJlYWR5c3RhdGVjaGFuZ2UoICJ0aW1lb3V0IiApOwoJCQkJfSwgcy50aW1lb3V0KTsKCQl9CgoJCS8vIFNlbmQgdGhlIGRhdGEKCQl0cnkgewoJCQl4aHIuc2VuZCggdHlwZSA9PT0gIlBPU1QiID8gcy5kYXRhIDogbnVsbCApOwoJCX0gY2F0Y2goZSkgewoJCQlqUXVlcnkuaGFuZGxlRXJyb3IocywgeGhyLCBudWxsLCBlKTsKCQl9CgoJCS8vIGZpcmVmb3ggMS41IGRvZXNuJ3QgZmlyZSBzdGF0ZWNoYW5nZSBmb3Igc3luYyByZXF1ZXN0cwoJCWlmICggIXMuYXN5bmMgKQoJCQlvbnJlYWR5c3RhdGVjaGFuZ2UoKTsKCgkJZnVuY3Rpb24gc3VjY2VzcygpewoJCQkvLyBJZiBhIGxvY2FsIGNhbGxiYWNrIHdhcyBzcGVjaWZpZWQsIGZpcmUgaXQgYW5kIHBhc3MgaXQgdGhlIGRhdGEKCQkJaWYgKCBzLnN1Y2Nlc3MgKQoJCQkJcy5zdWNjZXNzKCBkYXRhLCBzdGF0dXMgKTsKCgkJCS8vIEZpcmUgdGhlIGdsb2JhbCBjYWxsYmFjawoJCQlpZiAoIHMuZ2xvYmFsICkKCQkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCAiYWpheFN1Y2Nlc3MiLCBbeGhyLCBzXSApOwoJCX0KCgkJZnVuY3Rpb24gY29tcGxldGUoKXsKCQkJLy8gUHJvY2VzcyByZXN1bHQKCQkJaWYgKCBzLmNvbXBsZXRlICkKCQkJCXMuY29tcGxldGUoeGhyLCBzdGF0dXMpOwoKCQkJLy8gVGhlIHJlcXVlc3Qgd2FzIGNvbXBsZXRlZAoJCQlpZiAoIHMuZ2xvYmFsICkKCQkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCAiYWpheENvbXBsZXRlIiwgW3hociwgc10gKTsKCgkJCS8vIEhhbmRsZSB0aGUgZ2xvYmFsIEFKQVggY291bnRlcgoJCQlpZiAoIHMuZ2xvYmFsICYmICEgLS1qUXVlcnkuYWN0aXZlICkKCQkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCAiYWpheFN0b3AiICk7CgkJfQoKCQkvLyByZXR1cm4gWE1MSHR0cFJlcXVlc3QgdG8gYWxsb3cgYWJvcnRpbmcgdGhlIHJlcXVlc3QgZXRjLgoJCXJldHVybiB4aHI7Cgl9LAoKCWhhbmRsZUVycm9yOiBmdW5jdGlvbiggcywgeGhyLCBzdGF0dXMsIGUgKSB7CgkJLy8gSWYgYSBsb2NhbCBjYWxsYmFjayB3YXMgc3BlY2lmaWVkLCBmaXJlIGl0CgkJaWYgKCBzLmVycm9yICkgcy5lcnJvciggeGhyLCBzdGF0dXMsIGUgKTsKCgkJLy8gRmlyZSB0aGUgZ2xvYmFsIGNhbGxiYWNrCgkJaWYgKCBzLmdsb2JhbCApCgkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCAiYWpheEVycm9yIiwgW3hociwgcywgZV0gKTsKCX0sCgoJLy8gQ291bnRlciBmb3IgaG9sZGluZyB0aGUgbnVtYmVyIG9mIGFjdGl2ZSBxdWVyaWVzCglhY3RpdmU6IDAsCgoJLy8gRGV0ZXJtaW5lcyBpZiBhbiBYTUxIdHRwUmVxdWVzdCB3YXMgc3VjY2Vzc2Z1bCBvciBub3QKCWh0dHBTdWNjZXNzOiBmdW5jdGlvbiggeGhyICkgewoJCXRyeSB7CgkJCS8vIElFIGVycm9yIHNvbWV0aW1lcyByZXR1cm5zIDEyMjMgd2hlbiBpdCBzaG91bGQgYmUgMjA0IHNvIHRyZWF0IGl0IGFzIHN1Y2Nlc3MsIHNlZSAjMTQ1MAoJCQlyZXR1cm4gIXhoci5zdGF0dXMgJiYgbG9jYXRpb24ucHJvdG9jb2wgPT0gImZpbGU6IiB8fAoJCQkJKCB4aHIuc3RhdHVzID49IDIwMCAmJiB4aHIuc3RhdHVzIDwgMzAwICkgfHwgeGhyLnN0YXR1cyA9PSAzMDQgfHwgeGhyLnN0YXR1cyA9PSAxMjIzOwoJCX0gY2F0Y2goZSl7fQoJCXJldHVybiBmYWxzZTsKCX0sCgoJLy8gRGV0ZXJtaW5lcyBpZiBhbiBYTUxIdHRwUmVxdWVzdCByZXR1cm5zIE5vdE1vZGlmaWVkCglodHRwTm90TW9kaWZpZWQ6IGZ1bmN0aW9uKCB4aHIsIHVybCApIHsKCQl0cnkgewoJCQl2YXIgeGhyUmVzID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCJMYXN0LU1vZGlmaWVkIik7CgoJCQkvLyBGaXJlZm94IGFsd2F5cyByZXR1cm5zIDIwMC4gY2hlY2sgTGFzdC1Nb2RpZmllZCBkYXRlCgkJCXJldHVybiB4aHIuc3RhdHVzID09IDMwNCB8fCB4aHJSZXMgPT0galF1ZXJ5Lmxhc3RNb2RpZmllZFt1cmxdOwoJCX0gY2F0Y2goZSl7fQoJCXJldHVybiBmYWxzZTsKCX0sCgoJaHR0cERhdGE6IGZ1bmN0aW9uKCB4aHIsIHR5cGUsIHMgKSB7CgkJdmFyIGN0ID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCJjb250ZW50LXR5cGUiKSwKCQkJeG1sID0gdHlwZSA9PSAieG1sIiB8fCAhdHlwZSAmJiBjdCAmJiBjdC5pbmRleE9mKCJ4bWwiKSA+PSAwLAoJCQlkYXRhID0geG1sID8geGhyLnJlc3BvbnNlWE1MIDogeGhyLnJlc3BvbnNlVGV4dDsKCgkJaWYgKCB4bWwgJiYgZGF0YS5kb2N1bWVudEVsZW1lbnQudGFnTmFtZSA9PSAicGFyc2VyZXJyb3IiICkgewoJCQl0aHJvdyAicGFyc2VyZXJyb3IiOwoJCX0KCgkJLy8gQWxsb3cgYSBwcmUtZmlsdGVyaW5nIGZ1bmN0aW9uIHRvIHNhbml0aXplIHRoZSByZXNwb25zZQoJCS8vIHMgIT0gbnVsbCBpcyBjaGVja2VkIHRvIGtlZXAgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKCQlpZiAoIHMgJiYgcy5kYXRhRmlsdGVyICkgewoJCQlkYXRhID0gcy5kYXRhRmlsdGVyKCBkYXRhLCB0eXBlICk7CgkJfQoKCQkvLyBUaGUgZmlsdGVyIGNhbiBhY3R1YWxseSBwYXJzZSB0aGUgcmVzcG9uc2UKCQlpZiAoIHR5cGVvZiBkYXRhID09PSAic3RyaW5nIiApIHsKCgkJCS8vIElmIHRoZSB0eXBlIGlzICJzY3JpcHQiLCBldmFsIGl0IGluIGdsb2JhbCBjb250ZXh0CgkJCWlmICggdHlwZSA9PT0gInNjcmlwdCIgKSB7CgkJCQlqUXVlcnkuZ2xvYmFsRXZhbCggZGF0YSApOwoJCQl9CgoJCQkvLyBHZXQgdGhlIEphdmFTY3JpcHQgb2JqZWN0LCBpZiBKU09OIGlzIHVzZWQuCgkJCWlmICggdHlwZSA9PSAianNvbiIgKSB7CgkJCQlpZiAoIHR5cGVvZiBKU09OID09PSAib2JqZWN0IiAmJiBKU09OLnBhcnNlICkgewoJCQkJCWRhdGEgPSBKU09OLnBhcnNlKCBkYXRhICk7CgkJCQl9IGVsc2UgewoJCQkJCWRhdGEgPSAobmV3IEZ1bmN0aW9uKCJyZXR1cm4gIiArIGRhdGEpKSgpOwoJCQkJfQoJCQl9CgkJfQoKCQlyZXR1cm4gZGF0YTsKCX0sCgoJLy8gU2VyaWFsaXplIGFuIGFycmF5IG9mIGZvcm0gZWxlbWVudHMgb3IgYSBzZXQgb2YKCS8vIGtleS92YWx1ZXMgaW50byBhIHF1ZXJ5IHN0cmluZwoJcGFyYW06IGZ1bmN0aW9uKCBhICkgewoJCXZhciBzID0gWyBdOwoKCQlmdW5jdGlvbiBhZGQoIGtleSwgdmFsdWUgKXsKCQkJc1sgcy5sZW5ndGggXSA9IGVuY29kZVVSSUNvbXBvbmVudChrZXkpICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKTsKCQl9OwoKCQkvLyBJZiBhbiBhcnJheSB3YXMgcGFzc2VkIGluLCBhc3N1bWUgdGhhdCBpdCBpcyBhbiBhcnJheQoJCS8vIG9mIGZvcm0gZWxlbWVudHMKCQlpZiAoIGpRdWVyeS5pc0FycmF5KGEpIHx8IGEuanF1ZXJ5ICkKCQkJLy8gU2VyaWFsaXplIHRoZSBmb3JtIGVsZW1lbnRzCgkJCWpRdWVyeS5lYWNoKCBhLCBmdW5jdGlvbigpewoJCQkJYWRkKCB0aGlzLm5hbWUsIHRoaXMudmFsdWUgKTsKCQkJfSk7CgoJCS8vIE90aGVyd2lzZSwgYXNzdW1lIHRoYXQgaXQncyBhbiBvYmplY3Qgb2Yga2V5L3ZhbHVlIHBhaXJzCgkJZWxzZQoJCQkvLyBTZXJpYWxpemUgdGhlIGtleS92YWx1ZXMKCQkJZm9yICggdmFyIGogaW4gYSApCgkJCQkvLyBJZiB0aGUgdmFsdWUgaXMgYW4gYXJyYXkgdGhlbiB0aGUga2V5IG5hbWVzIG5lZWQgdG8gYmUgcmVwZWF0ZWQKCQkJCWlmICggalF1ZXJ5LmlzQXJyYXkoYVtqXSkgKQoJCQkJCWpRdWVyeS5lYWNoKCBhW2pdLCBmdW5jdGlvbigpewoJCQkJCQlhZGQoIGosIHRoaXMgKTsKCQkJCQl9KTsKCQkJCWVsc2UKCQkJCQlhZGQoIGosIGpRdWVyeS5pc0Z1bmN0aW9uKGFbal0pID8gYVtqXSgpIDogYVtqXSApOwoKCQkvLyBSZXR1cm4gdGhlIHJlc3VsdGluZyBzZXJpYWxpemF0aW9uCgkJcmV0dXJuIHMuam9pbigiJiIpLnJlcGxhY2UoLyUyMC9nLCAiKyIpOwoJfQoKfSk7CnZhciBlbGVtZGlzcGxheSA9IHt9LAoJdGltZXJJZCwKCWZ4QXR0cnMgPSBbCgkJLy8gaGVpZ2h0IGFuaW1hdGlvbnMKCQlbICJoZWlnaHQiLCAibWFyZ2luVG9wIiwgIm1hcmdpbkJvdHRvbSIsICJwYWRkaW5nVG9wIiwgInBhZGRpbmdCb3R0b20iIF0sCgkJLy8gd2lkdGggYW5pbWF0aW9ucwoJCVsgIndpZHRoIiwgIm1hcmdpbkxlZnQiLCAibWFyZ2luUmlnaHQiLCAicGFkZGluZ0xlZnQiLCAicGFkZGluZ1JpZ2h0IiBdLAoJCS8vIG9wYWNpdHkgYW5pbWF0aW9ucwoJCVsgIm9wYWNpdHkiIF0KCV07CgpmdW5jdGlvbiBnZW5GeCggdHlwZSwgbnVtICl7Cgl2YXIgb2JqID0ge307CglqUXVlcnkuZWFjaCggZnhBdHRycy5jb25jYXQuYXBwbHkoW10sIGZ4QXR0cnMuc2xpY2UoMCxudW0pKSwgZnVuY3Rpb24oKXsKCQlvYmpbIHRoaXMgXSA9IHR5cGU7Cgl9KTsKCXJldHVybiBvYmo7Cn0KCmpRdWVyeS5mbi5leHRlbmQoewoJc2hvdzogZnVuY3Rpb24oc3BlZWQsY2FsbGJhY2spewoJCWlmICggc3BlZWQgKSB7CgkJCXJldHVybiB0aGlzLmFuaW1hdGUoIGdlbkZ4KCJzaG93IiwgMyksIHNwZWVkLCBjYWxsYmFjayk7CgkJfSBlbHNlIHsKCQkJZm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKysgKXsKCQkJCXZhciBvbGQgPSBqUXVlcnkuZGF0YSh0aGlzW2ldLCAib2xkZGlzcGxheSIpOwoKCQkJCXRoaXNbaV0uc3R5bGUuZGlzcGxheSA9IG9sZCB8fCAiIjsKCgkJCQlpZiAoIGpRdWVyeS5jc3ModGhpc1tpXSwgImRpc3BsYXkiKSA9PT0gIm5vbmUiICkgewoJCQkJCXZhciB0YWdOYW1lID0gdGhpc1tpXS50YWdOYW1lLCBkaXNwbGF5OwoKCQkJCQlpZiAoIGVsZW1kaXNwbGF5WyB0YWdOYW1lIF0gKSB7CgkJCQkJCWRpc3BsYXkgPSBlbGVtZGlzcGxheVsgdGFnTmFtZSBdOwoJCQkJCX0gZWxzZSB7CgkJCQkJCXZhciBlbGVtID0galF1ZXJ5KCI8IiArIHRhZ05hbWUgKyAiIC8+IikuYXBwZW5kVG8oImJvZHkiKTsKCgkJCQkJCWRpc3BsYXkgPSBlbGVtLmNzcygiZGlzcGxheSIpOwoJCQkJCQlpZiAoIGRpc3BsYXkgPT09ICJub25lIiApCgkJCQkJCQlkaXNwbGF5ID0gImJsb2NrIjsKCgkJCQkJCWVsZW0ucmVtb3ZlKCk7CgoJCQkJCQllbGVtZGlzcGxheVsgdGFnTmFtZSBdID0gZGlzcGxheTsKCQkJCQl9CgoJCQkJCWpRdWVyeS5kYXRhKHRoaXNbaV0sICJvbGRkaXNwbGF5IiwgZGlzcGxheSk7CgkJCQl9CgkJCX0KCgkJCS8vIFNldCB0aGUgZGlzcGxheSBvZiB0aGUgZWxlbWVudHMgaW4gYSBzZWNvbmQgbG9vcAoJCQkvLyB0byBhdm9pZCB0aGUgY29uc3RhbnQgcmVmbG93CgkJCWZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMubGVuZ3RoOyBpIDwgbDsgaSsrICl7CgkJCQl0aGlzW2ldLnN0eWxlLmRpc3BsYXkgPSBqUXVlcnkuZGF0YSh0aGlzW2ldLCAib2xkZGlzcGxheSIpIHx8ICIiOwoJCQl9CgoJCQlyZXR1cm4gdGhpczsKCQl9Cgl9LAoKCWhpZGU6IGZ1bmN0aW9uKHNwZWVkLGNhbGxiYWNrKXsKCQlpZiAoIHNwZWVkICkgewoJCQlyZXR1cm4gdGhpcy5hbmltYXRlKCBnZW5GeCgiaGlkZSIsIDMpLCBzcGVlZCwgY2FsbGJhY2spOwoJCX0gZWxzZSB7CgkJCWZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMubGVuZ3RoOyBpIDwgbDsgaSsrICl7CgkJCQl2YXIgb2xkID0galF1ZXJ5LmRhdGEodGhpc1tpXSwgIm9sZGRpc3BsYXkiKTsKCQkJCWlmICggIW9sZCAmJiBvbGQgIT09ICJub25lIiApCgkJCQkJalF1ZXJ5LmRhdGEodGhpc1tpXSwgIm9sZGRpc3BsYXkiLCBqUXVlcnkuY3NzKHRoaXNbaV0sICJkaXNwbGF5IikpOwoJCQl9CgoJCQkvLyBTZXQgdGhlIGRpc3BsYXkgb2YgdGhlIGVsZW1lbnRzIGluIGEgc2Vjb25kIGxvb3AKCQkJLy8gdG8gYXZvaWQgdGhlIGNvbnN0YW50IHJlZmxvdwoJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLmxlbmd0aDsgaSA8IGw7IGkrKyApewoJCQkJdGhpc1tpXS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwoJCQl9CgoJCQlyZXR1cm4gdGhpczsKCQl9Cgl9LAoKCS8vIFNhdmUgdGhlIG9sZCB0b2dnbGUgZnVuY3Rpb24KCV90b2dnbGU6IGpRdWVyeS5mbi50b2dnbGUsCgoJdG9nZ2xlOiBmdW5jdGlvbiggZm4sIGZuMiApewoJCXZhciBib29sID0gdHlwZW9mIGZuID09PSAiYm9vbGVhbiI7CgoJCXJldHVybiBqUXVlcnkuaXNGdW5jdGlvbihmbikgJiYgalF1ZXJ5LmlzRnVuY3Rpb24oZm4yKSA/CgkJCXRoaXMuX3RvZ2dsZS5hcHBseSggdGhpcywgYXJndW1lbnRzICkgOgoJCQlmbiA9PSBudWxsIHx8IGJvb2wgPwoJCQkJdGhpcy5lYWNoKGZ1bmN0aW9uKCl7CgkJCQkJdmFyIHN0YXRlID0gYm9vbCA/IGZuIDogalF1ZXJ5KHRoaXMpLmlzKCI6aGlkZGVuIik7CgkJCQkJalF1ZXJ5KHRoaXMpWyBzdGF0ZSA/ICJzaG93IiA6ICJoaWRlIiBdKCk7CgkJCQl9KSA6CgkJCQl0aGlzLmFuaW1hdGUoZ2VuRngoInRvZ2dsZSIsIDMpLCBmbiwgZm4yKTsKCX0sCgoJZmFkZVRvOiBmdW5jdGlvbihzcGVlZCx0byxjYWxsYmFjayl7CgkJcmV0dXJuIHRoaXMuZmlsdGVyKCI6aGlkZGVuIikuY3NzKCdvcGFjaXR5JywgMCkuc2hvdygpLmVuZCgpCgkJCQkJLmFuaW1hdGUoe29wYWNpdHk6IHRvfSwgc3BlZWQsIGNhbGxiYWNrKTsKCX0sCgoJYW5pbWF0ZTogZnVuY3Rpb24oIHByb3AsIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkgewoJCXZhciBvcHRhbGwgPSBqUXVlcnkuc3BlZWQoc3BlZWQsIGVhc2luZywgY2FsbGJhY2spOwoKCQlyZXR1cm4gdGhpc1sgb3B0YWxsLnF1ZXVlID09PSBmYWxzZSA/ICJlYWNoIiA6ICJxdWV1ZSIgXShmdW5jdGlvbigpewoKCQkJdmFyIG9wdCA9IGpRdWVyeS5leHRlbmQoe30sIG9wdGFsbCksIHAsCgkJCQloaWRkZW4gPSB0aGlzLm5vZGVUeXBlID09IDEgJiYgalF1ZXJ5KHRoaXMpLmlzKCI6aGlkZGVuIiksCgkJCQlzZWxmID0gdGhpczsKCgkJCWZvciAoIHAgaW4gcHJvcCApIHsKCQkJCWlmICggcHJvcFtwXSA9PSAiaGlkZSIgJiYgaGlkZGVuIHx8IHByb3BbcF0gPT0gInNob3ciICYmICFoaWRkZW4gKQoJCQkJCXJldHVybiBvcHQuY29tcGxldGUuY2FsbCh0aGlzKTsKCgkJCQlpZiAoICggcCA9PSAiaGVpZ2h0IiB8fCBwID09ICJ3aWR0aCIgKSAmJiB0aGlzLnN0eWxlICkgewoJCQkJCS8vIFN0b3JlIGRpc3BsYXkgcHJvcGVydHkKCQkJCQlvcHQuZGlzcGxheSA9IGpRdWVyeS5jc3ModGhpcywgImRpc3BsYXkiKTsKCgkJCQkJLy8gTWFrZSBzdXJlIHRoYXQgbm90aGluZyBzbmVha3Mgb3V0CgkJCQkJb3B0Lm92ZXJmbG93ID0gdGhpcy5zdHlsZS5vdmVyZmxvdzsKCQkJCX0KCQkJfQoKCQkJaWYgKCBvcHQub3ZlcmZsb3cgIT0gbnVsbCApCgkJCQl0aGlzLnN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiI7CgoJCQlvcHQuY3VyQW5pbSA9IGpRdWVyeS5leHRlbmQoe30sIHByb3ApOwoKCQkJalF1ZXJ5LmVhY2goIHByb3AsIGZ1bmN0aW9uKG5hbWUsIHZhbCl7CgkJCQl2YXIgZSA9IG5ldyBqUXVlcnkuZngoIHNlbGYsIG9wdCwgbmFtZSApOwoKCQkJCWlmICggL3RvZ2dsZXxzaG93fGhpZGUvLnRlc3QodmFsKSApCgkJCQkJZVsgdmFsID09ICJ0b2dnbGUiID8gaGlkZGVuID8gInNob3ciIDogImhpZGUiIDogdmFsIF0oIHByb3AgKTsKCQkJCWVsc2UgewoJCQkJCXZhciBwYXJ0cyA9IHZhbC50b1N0cmluZygpLm1hdGNoKC9eKFsrLV09KT8oW1xkKy0uXSspKC4qKSQvKSwKCQkJCQkJc3RhcnQgPSBlLmN1cih0cnVlKSB8fCAwOwoKCQkJCQlpZiAoIHBhcnRzICkgewoJCQkJCQl2YXIgZW5kID0gcGFyc2VGbG9hdChwYXJ0c1syXSksCgkJCQkJCQl1bml0ID0gcGFydHNbM10gfHwgInB4IjsKCgkJCQkJCS8vIFdlIG5lZWQgdG8gY29tcHV0ZSBzdGFydGluZyB2YWx1ZQoJCQkJCQlpZiAoIHVuaXQgIT0gInB4IiApIHsKCQkJCQkJCXNlbGYuc3R5bGVbIG5hbWUgXSA9IChlbmQgfHwgMSkgKyB1bml0OwoJCQkJCQkJc3RhcnQgPSAoKGVuZCB8fCAxKSAvIGUuY3VyKHRydWUpKSAqIHN0YXJ0OwoJCQkJCQkJc2VsZi5zdHlsZVsgbmFtZSBdID0gc3RhcnQgKyB1bml0OwoJCQkJCQl9CgoJCQkJCQkvLyBJZiBhICs9Ly09IHRva2VuIHdhcyBwcm92aWRlZCwgd2UncmUgZG9pbmcgYSByZWxhdGl2ZSBhbmltYXRpb24KCQkJCQkJaWYgKCBwYXJ0c1sxXSApCgkJCQkJCQllbmQgPSAoKHBhcnRzWzFdID09ICItPSIgPyAtMSA6IDEpICogZW5kKSArIHN0YXJ0OwoKCQkJCQkJZS5jdXN0b20oIHN0YXJ0LCBlbmQsIHVuaXQgKTsKCQkJCQl9IGVsc2UKCQkJCQkJZS5jdXN0b20oIHN0YXJ0LCB2YWwsICIiICk7CgkJCQl9CgkJCX0pOwoKCQkJLy8gRm9yIEpTIHN0cmljdCBjb21wbGlhbmNlCgkJCXJldHVybiB0cnVlOwoJCX0pOwoJfSwKCglzdG9wOiBmdW5jdGlvbihjbGVhclF1ZXVlLCBnb3RvRW5kKXsKCQl2YXIgdGltZXJzID0galF1ZXJ5LnRpbWVyczsKCgkJaWYgKGNsZWFyUXVldWUpCgkJCXRoaXMucXVldWUoW10pOwoKCQl0aGlzLmVhY2goZnVuY3Rpb24oKXsKCQkJLy8gZ28gaW4gcmV2ZXJzZSBvcmRlciBzbyBhbnl0aGluZyBhZGRlZCB0byB0aGUgcXVldWUgZHVyaW5nIHRoZSBsb29wIGlzIGlnbm9yZWQKCQkJZm9yICggdmFyIGkgPSB0aW1lcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0gKQoJCQkJaWYgKCB0aW1lcnNbaV0uZWxlbSA9PSB0aGlzICkgewoJCQkJCWlmIChnb3RvRW5kKQoJCQkJCQkvLyBmb3JjZSB0aGUgbmV4dCBzdGVwIHRvIGJlIHRoZSBsYXN0CgkJCQkJCXRpbWVyc1tpXSh0cnVlKTsKCQkJCQl0aW1lcnMuc3BsaWNlKGksIDEpOwoJCQkJfQoJCX0pOwoKCQkvLyBzdGFydCB0aGUgbmV4dCBpbiB0aGUgcXVldWUgaWYgdGhlIGxhc3Qgc3RlcCB3YXNuJ3QgZm9yY2VkCgkJaWYgKCFnb3RvRW5kKQoJCQl0aGlzLmRlcXVldWUoKTsKCgkJcmV0dXJuIHRoaXM7Cgl9Cgp9KTsKCi8vIEdlbmVyYXRlIHNob3J0Y3V0cyBmb3IgY3VzdG9tIGFuaW1hdGlvbnMKalF1ZXJ5LmVhY2goewoJc2xpZGVEb3duOiBnZW5GeCgic2hvdyIsIDEpLAoJc2xpZGVVcDogZ2VuRngoImhpZGUiLCAxKSwKCXNsaWRlVG9nZ2xlOiBnZW5GeCgidG9nZ2xlIiwgMSksCglmYWRlSW46IHsgb3BhY2l0eTogInNob3ciIH0sCglmYWRlT3V0OiB7IG9wYWNpdHk6ICJoaWRlIiB9Cn0sIGZ1bmN0aW9uKCBuYW1lLCBwcm9wcyApewoJalF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggc3BlZWQsIGNhbGxiYWNrICl7CgkJcmV0dXJuIHRoaXMuYW5pbWF0ZSggcHJvcHMsIHNwZWVkLCBjYWxsYmFjayApOwoJfTsKfSk7CgpqUXVlcnkuZXh0ZW5kKHsKCglzcGVlZDogZnVuY3Rpb24oc3BlZWQsIGVhc2luZywgZm4pIHsKCQl2YXIgb3B0ID0gdHlwZW9mIHNwZWVkID09PSAib2JqZWN0IiA/IHNwZWVkIDogewoJCQljb21wbGV0ZTogZm4gfHwgIWZuICYmIGVhc2luZyB8fAoJCQkJalF1ZXJ5LmlzRnVuY3Rpb24oIHNwZWVkICkgJiYgc3BlZWQsCgkJCWR1cmF0aW9uOiBzcGVlZCwKCQkJZWFzaW5nOiBmbiAmJiBlYXNpbmcgfHwgZWFzaW5nICYmICFqUXVlcnkuaXNGdW5jdGlvbihlYXNpbmcpICYmIGVhc2luZwoJCX07CgoJCW9wdC5kdXJhdGlvbiA9IGpRdWVyeS5meC5vZmYgPyAwIDogdHlwZW9mIG9wdC5kdXJhdGlvbiA9PT0gIm51bWJlciIgPyBvcHQuZHVyYXRpb24gOgoJCQlqUXVlcnkuZnguc3BlZWRzW29wdC5kdXJhdGlvbl0gfHwgalF1ZXJ5LmZ4LnNwZWVkcy5fZGVmYXVsdDsKCgkJLy8gUXVldWVpbmcKCQlvcHQub2xkID0gb3B0LmNvbXBsZXRlOwoJCW9wdC5jb21wbGV0ZSA9IGZ1bmN0aW9uKCl7CgkJCWlmICggb3B0LnF1ZXVlICE9PSBmYWxzZSApCgkJCQlqUXVlcnkodGhpcykuZGVxdWV1ZSgpOwoJCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBvcHQub2xkICkgKQoJCQkJb3B0Lm9sZC5jYWxsKCB0aGlzICk7CgkJfTsKCgkJcmV0dXJuIG9wdDsKCX0sCgoJZWFzaW5nOiB7CgkJbGluZWFyOiBmdW5jdGlvbiggcCwgbiwgZmlyc3ROdW0sIGRpZmYgKSB7CgkJCXJldHVybiBmaXJzdE51bSArIGRpZmYgKiBwOwoJCX0sCgkJc3dpbmc6IGZ1bmN0aW9uKCBwLCBuLCBmaXJzdE51bSwgZGlmZiApIHsKCQkJcmV0dXJuICgoLU1hdGguY29zKHAqTWF0aC5QSSkvMikgKyAwLjUpICogZGlmZiArIGZpcnN0TnVtOwoJCX0KCX0sCgoJdGltZXJzOiBbXSwKCglmeDogZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIHByb3AgKXsKCQl0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwoJCXRoaXMuZWxlbSA9IGVsZW07CgkJdGhpcy5wcm9wID0gcHJvcDsKCgkJaWYgKCAhb3B0aW9ucy5vcmlnICkKCQkJb3B0aW9ucy5vcmlnID0ge307Cgl9Cgp9KTsKCmpRdWVyeS5meC5wcm90b3R5cGUgPSB7CgoJLy8gU2ltcGxlIGZ1bmN0aW9uIGZvciBzZXR0aW5nIGEgc3R5bGUgdmFsdWUKCXVwZGF0ZTogZnVuY3Rpb24oKXsKCQlpZiAoIHRoaXMub3B0aW9ucy5zdGVwICkKCQkJdGhpcy5vcHRpb25zLnN0ZXAuY2FsbCggdGhpcy5lbGVtLCB0aGlzLm5vdywgdGhpcyApOwoKCQkoalF1ZXJ5LmZ4LnN0ZXBbdGhpcy5wcm9wXSB8fCBqUXVlcnkuZnguc3RlcC5fZGVmYXVsdCkoIHRoaXMgKTsKCgkJLy8gU2V0IGRpc3BsYXkgcHJvcGVydHkgdG8gYmxvY2sgZm9yIGhlaWdodC93aWR0aCBhbmltYXRpb25zCgkJaWYgKCAoIHRoaXMucHJvcCA9PSAiaGVpZ2h0IiB8fCB0aGlzLnByb3AgPT0gIndpZHRoIiApICYmIHRoaXMuZWxlbS5zdHlsZSApCgkJCXRoaXMuZWxlbS5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIjsKCX0sCgoJLy8gR2V0IHRoZSBjdXJyZW50IHNpemUKCWN1cjogZnVuY3Rpb24oZm9yY2UpewoJCWlmICggdGhpcy5lbGVtW3RoaXMucHJvcF0gIT0gbnVsbCAmJiAoIXRoaXMuZWxlbS5zdHlsZSB8fCB0aGlzLmVsZW0uc3R5bGVbdGhpcy5wcm9wXSA9PSBudWxsKSApCgkJCXJldHVybiB0aGlzLmVsZW1bIHRoaXMucHJvcCBdOwoKCQl2YXIgciA9IHBhcnNlRmxvYXQoalF1ZXJ5LmNzcyh0aGlzLmVsZW0sIHRoaXMucHJvcCwgZm9yY2UpKTsKCQlyZXR1cm4gciAmJiByID4gLTEwMDAwID8gciA6IHBhcnNlRmxvYXQoalF1ZXJ5LmN1ckNTUyh0aGlzLmVsZW0sIHRoaXMucHJvcCkpIHx8IDA7Cgl9LAoKCS8vIFN0YXJ0IGFuIGFuaW1hdGlvbiBmcm9tIG9uZSBudW1iZXIgdG8gYW5vdGhlcgoJY3VzdG9tOiBmdW5jdGlvbihmcm9tLCB0bywgdW5pdCl7CgkJdGhpcy5zdGFydFRpbWUgPSBub3coKTsKCQl0aGlzLnN0YXJ0ID0gZnJvbTsKCQl0aGlzLmVuZCA9IHRvOwoJCXRoaXMudW5pdCA9IHVuaXQgfHwgdGhpcy51bml0IHx8ICJweCI7CgkJdGhpcy5ub3cgPSB0aGlzLnN0YXJ0OwoJCXRoaXMucG9zID0gdGhpcy5zdGF0ZSA9IDA7CgoJCXZhciBzZWxmID0gdGhpczsKCQlmdW5jdGlvbiB0KGdvdG9FbmQpewoJCQlyZXR1cm4gc2VsZi5zdGVwKGdvdG9FbmQpOwoJCX0KCgkJdC5lbGVtID0gdGhpcy5lbGVtOwoKCQlpZiAoIHQoKSAmJiBqUXVlcnkudGltZXJzLnB1c2godCkgJiYgIXRpbWVySWQgKQoJCQl0aW1lcklkID0gc2V0SW50ZXJ2YWwoalF1ZXJ5LmZ4LnRpY2ssIDEzKTsKCX0sCgoJLy8gU2ltcGxlICdzaG93JyBmdW5jdGlvbgoJc2hvdzogZnVuY3Rpb24oKXsKCQkvLyBSZW1lbWJlciB3aGVyZSB3ZSBzdGFydGVkLCBzbyB0aGF0IHdlIGNhbiBnbyBiYWNrIHRvIGl0IGxhdGVyCgkJdGhpcy5vcHRpb25zLm9yaWdbdGhpcy5wcm9wXSA9IGpRdWVyeS5zdHlsZSggdGhpcy5lbGVtLCB0aGlzLnByb3AgKTsKCQl0aGlzLm9wdGlvbnMuc2hvdyA9IHRydWU7CgoJCS8vIEJlZ2luIHRoZSBhbmltYXRpb24KCQkvLyBNYWtlIHN1cmUgdGhhdCB3ZSBzdGFydCBhdCBhIHNtYWxsIHdpZHRoL2hlaWdodCB0byBhdm9pZCBhbnkKCQkvLyBmbGFzaCBvZiBjb250ZW50CgkJdGhpcy5jdXN0b20odGhpcy5wcm9wID09ICJ3aWR0aCIgfHwgdGhpcy5wcm9wID09ICJoZWlnaHQiID8gMSA6IDAsIHRoaXMuY3VyKCkpOwoKCQkvLyBTdGFydCBieSBzaG93aW5nIHRoZSBlbGVtZW50CgkJalF1ZXJ5KHRoaXMuZWxlbSkuc2hvdygpOwoJfSwKCgkvLyBTaW1wbGUgJ2hpZGUnIGZ1bmN0aW9uCgloaWRlOiBmdW5jdGlvbigpewoJCS8vIFJlbWVtYmVyIHdoZXJlIHdlIHN0YXJ0ZWQsIHNvIHRoYXQgd2UgY2FuIGdvIGJhY2sgdG8gaXQgbGF0ZXIKCQl0aGlzLm9wdGlvbnMub3JpZ1t0aGlzLnByb3BdID0galF1ZXJ5LnN0eWxlKCB0aGlzLmVsZW0sIHRoaXMucHJvcCApOwoJCXRoaXMub3B0aW9ucy5oaWRlID0gdHJ1ZTsKCgkJLy8gQmVnaW4gdGhlIGFuaW1hdGlvbgoJCXRoaXMuY3VzdG9tKHRoaXMuY3VyKCksIDApOwoJfSwKCgkvLyBFYWNoIHN0ZXAgb2YgYW4gYW5pbWF0aW9uCglzdGVwOiBmdW5jdGlvbihnb3RvRW5kKXsKCQl2YXIgdCA9IG5vdygpOwoKCQlpZiAoIGdvdG9FbmQgfHwgdCA+PSB0aGlzLm9wdGlvbnMuZHVyYXRpb24gKyB0aGlzLnN0YXJ0VGltZSApIHsKCQkJdGhpcy5ub3cgPSB0aGlzLmVuZDsKCQkJdGhpcy5wb3MgPSB0aGlzLnN0YXRlID0gMTsKCQkJdGhpcy51cGRhdGUoKTsKCgkJCXRoaXMub3B0aW9ucy5jdXJBbmltWyB0aGlzLnByb3AgXSA9IHRydWU7CgoJCQl2YXIgZG9uZSA9IHRydWU7CgkJCWZvciAoIHZhciBpIGluIHRoaXMub3B0aW9ucy5jdXJBbmltICkKCQkJCWlmICggdGhpcy5vcHRpb25zLmN1ckFuaW1baV0gIT09IHRydWUgKQoJCQkJCWRvbmUgPSBmYWxzZTsKCgkJCWlmICggZG9uZSApIHsKCQkJCWlmICggdGhpcy5vcHRpb25zLmRpc3BsYXkgIT0gbnVsbCApIHsKCQkJCQkvLyBSZXNldCB0aGUgb3ZlcmZsb3cKCQkJCQl0aGlzLmVsZW0uc3R5bGUub3ZlcmZsb3cgPSB0aGlzLm9wdGlvbnMub3ZlcmZsb3c7CgoJCQkJCS8vIFJlc2V0IHRoZSBkaXNwbGF5CgkJCQkJdGhpcy5lbGVtLnN0eWxlLmRpc3BsYXkgPSB0aGlzLm9wdGlvbnMuZGlzcGxheTsKCQkJCQlpZiAoIGpRdWVyeS5jc3ModGhpcy5lbGVtLCAiZGlzcGxheSIpID09ICJub25lIiApCgkJCQkJCXRoaXMuZWxlbS5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIjsKCQkJCX0KCgkJCQkvLyBIaWRlIHRoZSBlbGVtZW50IGlmIHRoZSAiaGlkZSIgb3BlcmF0aW9uIHdhcyBkb25lCgkJCQlpZiAoIHRoaXMub3B0aW9ucy5oaWRlICkKCQkJCQlqUXVlcnkodGhpcy5lbGVtKS5oaWRlKCk7CgoJCQkJLy8gUmVzZXQgdGhlIHByb3BlcnRpZXMsIGlmIHRoZSBpdGVtIGhhcyBiZWVuIGhpZGRlbiBvciBzaG93bgoJCQkJaWYgKCB0aGlzLm9wdGlvbnMuaGlkZSB8fCB0aGlzLm9wdGlvbnMuc2hvdyApCgkJCQkJZm9yICggdmFyIHAgaW4gdGhpcy5vcHRpb25zLmN1ckFuaW0gKQoJCQkJCQlqUXVlcnkuc3R5bGUodGhpcy5lbGVtLCBwLCB0aGlzLm9wdGlvbnMub3JpZ1twXSk7CgoJCQkJLy8gRXhlY3V0ZSB0aGUgY29tcGxldGUgZnVuY3Rpb24KCQkJCXRoaXMub3B0aW9ucy5jb21wbGV0ZS5jYWxsKCB0aGlzLmVsZW0gKTsKCQkJfQoKCQkJcmV0dXJuIGZhbHNlOwoJCX0gZWxzZSB7CgkJCXZhciBuID0gdCAtIHRoaXMuc3RhcnRUaW1lOwoJCQl0aGlzLnN0YXRlID0gbiAvIHRoaXMub3B0aW9ucy5kdXJhdGlvbjsKCgkJCS8vIFBlcmZvcm0gdGhlIGVhc2luZyBmdW5jdGlvbiwgZGVmYXVsdHMgdG8gc3dpbmcKCQkJdGhpcy5wb3MgPSBqUXVlcnkuZWFzaW5nW3RoaXMub3B0aW9ucy5lYXNpbmcgfHwgKGpRdWVyeS5lYXNpbmcuc3dpbmcgPyAic3dpbmciIDogImxpbmVhciIpXSh0aGlzLnN0YXRlLCBuLCAwLCAxLCB0aGlzLm9wdGlvbnMuZHVyYXRpb24pOwoJCQl0aGlzLm5vdyA9IHRoaXMuc3RhcnQgKyAoKHRoaXMuZW5kIC0gdGhpcy5zdGFydCkgKiB0aGlzLnBvcyk7CgoJCQkvLyBQZXJmb3JtIHRoZSBuZXh0IHN0ZXAgb2YgdGhlIGFuaW1hdGlvbgoJCQl0aGlzLnVwZGF0ZSgpOwoJCX0KCgkJcmV0dXJuIHRydWU7Cgl9Cgp9OwoKalF1ZXJ5LmV4dGVuZCggalF1ZXJ5LmZ4LCB7CgoJdGljazpmdW5jdGlvbigpewoJCXZhciB0aW1lcnMgPSBqUXVlcnkudGltZXJzOwoKCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCB0aW1lcnMubGVuZ3RoOyBpKysgKQoJCQlpZiAoICF0aW1lcnNbaV0oKSApCgkJCQl0aW1lcnMuc3BsaWNlKGktLSwgMSk7CgoJCWlmICggIXRpbWVycy5sZW5ndGggKQoJCQlqUXVlcnkuZnguc3RvcCgpOwoJfSwKCQkKCXN0b3A6ZnVuY3Rpb24oKXsKCQljbGVhckludGVydmFsKCB0aW1lcklkICk7CgkJdGltZXJJZCA9IG51bGw7Cgl9LAoJCglzcGVlZHM6ewoJCXNsb3c6IDYwMCwKIAkJZmFzdDogMjAwLAogCQkvLyBEZWZhdWx0IHNwZWVkCiAJCV9kZWZhdWx0OiA0MDAKCX0sCgoJc3RlcDogewoKCQlvcGFjaXR5OiBmdW5jdGlvbihmeCl7CgkJCWpRdWVyeS5zdHlsZShmeC5lbGVtLCAib3BhY2l0eSIsIGZ4Lm5vdyk7CgkJfSwKCgkJX2RlZmF1bHQ6IGZ1bmN0aW9uKGZ4KXsKCQkJaWYgKCBmeC5lbGVtLnN0eWxlICYmIGZ4LmVsZW0uc3R5bGVbIGZ4LnByb3AgXSAhPSBudWxsICkKCQkJCWZ4LmVsZW0uc3R5bGVbIGZ4LnByb3AgXSA9IGZ4Lm5vdyArIGZ4LnVuaXQ7CgkJCWVsc2UKCQkJCWZ4LmVsZW1bIGZ4LnByb3AgXSA9IGZ4Lm5vdzsKCQl9Cgl9Cn0pOwppZiAoICJnZXRCb3VuZGluZ0NsaWVudFJlY3QiIGluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCApCglqUXVlcnkuZm4ub2Zmc2V0ID0gZnVuY3Rpb24oKSB7CgkJdmFyIGVsZW0gPSB0aGlzWzBdOwoJCWlmICggIWVsZW0gfHwgIWVsZW0ub3duZXJEb2N1bWVudCApIHJldHVybiBudWxsOwoJCWlmICggZWxlbSA9PT0gZWxlbS5vd25lckRvY3VtZW50LmJvZHkgKSByZXR1cm4galF1ZXJ5Lm9mZnNldC5ib2R5T2Zmc2V0KCBlbGVtICk7CgkJdmFyIGJveCA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIGRvYyA9IGVsZW0ub3duZXJEb2N1bWVudCwgYm9keSA9IGRvYy5ib2R5LCBkb2NFbGVtID0gZG9jLmRvY3VtZW50RWxlbWVudCwKCQkJY2xpZW50VG9wID0gZG9jRWxlbS5jbGllbnRUb3AgfHwgYm9keS5jbGllbnRUb3AgfHwgMCwgY2xpZW50TGVmdCA9IGRvY0VsZW0uY2xpZW50TGVmdCB8fCBib2R5LmNsaWVudExlZnQgfHwgMCwKCQkJdG9wICA9IGJveC50b3AgICsgKHNlbGYucGFnZVlPZmZzZXQgfHwgalF1ZXJ5LnN1cHBvcnQuYm94TW9kZWwgJiYgZG9jRWxlbS5zY3JvbGxUb3AgIHx8IGJvZHkuc2Nyb2xsVG9wICkgLSBjbGllbnRUb3AsCgkJCWxlZnQgPSBib3gubGVmdCArIChzZWxmLnBhZ2VYT2Zmc2V0IHx8IGpRdWVyeS5zdXBwb3J0LmJveE1vZGVsICYmIGRvY0VsZW0uc2Nyb2xsTGVmdCB8fCBib2R5LnNjcm9sbExlZnQpIC0gY2xpZW50TGVmdDsKCQlyZXR1cm4geyB0b3A6IHRvcCwgbGVmdDogbGVmdCB9OwoJfTsKZWxzZQoJalF1ZXJ5LmZuLm9mZnNldCA9IGZ1bmN0aW9uKCkgewoJCXZhciBlbGVtID0gdGhpc1swXTsKCQlpZiAoICFlbGVtIHx8ICFlbGVtLm93bmVyRG9jdW1lbnQgKSByZXR1cm4gbnVsbDsKCQlpZiAoIGVsZW0gPT09IGVsZW0ub3duZXJEb2N1bWVudC5ib2R5ICkgcmV0dXJuIGpRdWVyeS5vZmZzZXQuYm9keU9mZnNldCggZWxlbSApOwoJCWpRdWVyeS5vZmZzZXQuaW5pdGlhbGl6ZSgpOwoKCQl2YXIgb2Zmc2V0UGFyZW50ID0gZWxlbS5vZmZzZXRQYXJlbnQsIHByZXZPZmZzZXRQYXJlbnQgPSBlbGVtLAoJCQlkb2MgPSBlbGVtLm93bmVyRG9jdW1lbnQsIGNvbXB1dGVkU3R5bGUsIGRvY0VsZW0gPSBkb2MuZG9jdW1lbnRFbGVtZW50LAoJCQlib2R5ID0gZG9jLmJvZHksIGRlZmF1bHRWaWV3ID0gZG9jLmRlZmF1bHRWaWV3LAoJCQlwcmV2Q29tcHV0ZWRTdHlsZSA9IGRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoZWxlbSwgbnVsbCksCgkJCXRvcCA9IGVsZW0ub2Zmc2V0VG9wLCBsZWZ0ID0gZWxlbS5vZmZzZXRMZWZ0OwoKCQl3aGlsZSAoIChlbGVtID0gZWxlbS5wYXJlbnROb2RlKSAmJiBlbGVtICE9PSBib2R5ICYmIGVsZW0gIT09IGRvY0VsZW0gKSB7CgkJCWlmICggalF1ZXJ5Lm9mZnNldC5zdXBwb3J0c0ZpeGVkUG9zaXRpb24gJiYgcHJldkNvbXB1dGVkU3R5bGUucG9zaXRpb24gPT09ICJmaXhlZCIgKSBicmVhazsKCQkJY29tcHV0ZWRTdHlsZSA9IGRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoZWxlbSwgbnVsbCk7CgkJCXRvcCAtPSBlbGVtLnNjcm9sbFRvcCwgbGVmdCAtPSBlbGVtLnNjcm9sbExlZnQ7CgkJCWlmICggZWxlbSA9PT0gb2Zmc2V0UGFyZW50ICkgewoJCQkJdG9wICs9IGVsZW0ub2Zmc2V0VG9wLCBsZWZ0ICs9IGVsZW0ub2Zmc2V0TGVmdDsKCQkJCWlmICggalF1ZXJ5Lm9mZnNldC5kb2VzTm90QWRkQm9yZGVyICYmICEoalF1ZXJ5Lm9mZnNldC5kb2VzQWRkQm9yZGVyRm9yVGFibGVBbmRDZWxscyAmJiAvXnQoYWJsZXxkfGgpJC9pLnRlc3QoZWxlbS50YWdOYW1lKSkgKQoJCQkJCXRvcCAgKz0gcGFyc2VGbG9hdCggY29tcHV0ZWRTdHlsZS5ib3JkZXJUb3BXaWR0aCAgKSB8fCAwLAoJCQkJCWxlZnQgKz0gcGFyc2VGbG9hdCggY29tcHV0ZWRTdHlsZS5ib3JkZXJMZWZ0V2lkdGggKSB8fCAwOwoJCQkJcHJldk9mZnNldFBhcmVudCA9IG9mZnNldFBhcmVudCwgb2Zmc2V0UGFyZW50ID0gZWxlbS5vZmZzZXRQYXJlbnQ7CgkJCX0KCQkJaWYgKCBqUXVlcnkub2Zmc2V0LnN1YnRyYWN0c0JvcmRlckZvck92ZXJmbG93Tm90VmlzaWJsZSAmJiBjb21wdXRlZFN0eWxlLm92ZXJmbG93ICE9PSAidmlzaWJsZSIgKQoJCQkJdG9wICArPSBwYXJzZUZsb2F0KCBjb21wdXRlZFN0eWxlLmJvcmRlclRvcFdpZHRoICApIHx8IDAsCgkJCQlsZWZ0ICs9IHBhcnNlRmxvYXQoIGNvbXB1dGVkU3R5bGUuYm9yZGVyTGVmdFdpZHRoICkgfHwgMDsKCQkJcHJldkNvbXB1dGVkU3R5bGUgPSBjb21wdXRlZFN0eWxlOwoJCX0KCgkJaWYgKCBwcmV2Q29tcHV0ZWRTdHlsZS5wb3NpdGlvbiA9PT0gInJlbGF0aXZlIiB8fCBwcmV2Q29tcHV0ZWRTdHlsZS5wb3NpdGlvbiA9PT0gInN0YXRpYyIgKQoJCQl0b3AgICs9IGJvZHkub2Zmc2V0VG9wLAoJCQlsZWZ0ICs9IGJvZHkub2Zmc2V0TGVmdDsKCgkJaWYgKCBqUXVlcnkub2Zmc2V0LnN1cHBvcnRzRml4ZWRQb3NpdGlvbiAmJiBwcmV2Q29tcHV0ZWRTdHlsZS5wb3NpdGlvbiA9PT0gImZpeGVkIiApCgkJCXRvcCAgKz0gTWF0aC5tYXgoIGRvY0VsZW0uc2Nyb2xsVG9wLCBib2R5LnNjcm9sbFRvcCApLAoJCQlsZWZ0ICs9IE1hdGgubWF4KCBkb2NFbGVtLnNjcm9sbExlZnQsIGJvZHkuc2Nyb2xsTGVmdCApOwoKCQlyZXR1cm4geyB0b3A6IHRvcCwgbGVmdDogbGVmdCB9OwoJfTsKCmpRdWVyeS5vZmZzZXQgPSB7Cglpbml0aWFsaXplOiBmdW5jdGlvbigpIHsKCQl2YXIgYm9keSA9IGRvY3VtZW50LmJvZHksIGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpLCBpbm5lckRpdiwgY2hlY2tEaXYsIHRhYmxlLCB0ZCwgYm9keU1hcmdpblRvcCA9IHBhcnNlRmxvYXQoIGpRdWVyeS5jdXJDU1MoYm9keSwgJ21hcmdpblRvcCcsIHRydWUpICkgfHwgMCwKCQkJaHRtbCA9ICc8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjA7bWFyZ2luOjA7Ym9yZGVyOjVweCBzb2xpZCAjMDAwO3BhZGRpbmc6MDt3aWR0aDoxcHg7aGVpZ2h0OjFweDsiPjxkaXY+PC9kaXY+PC9kaXY+PHRhYmxlIHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjA7bWFyZ2luOjA7Ym9yZGVyOjVweCBzb2xpZCAjMDAwO3BhZGRpbmc6MDt3aWR0aDoxcHg7aGVpZ2h0OjFweDsiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+PHRyPjx0ZD48L3RkPjwvdHI+PC90YWJsZT4nOwoKCQlqUXVlcnkuZXh0ZW5kKCBjb250YWluZXIuc3R5bGUsIHsgcG9zaXRpb246ICdhYnNvbHV0ZScsIHRvcDogMCwgbGVmdDogMCwgbWFyZ2luOiAwLCBib3JkZXI6IDAsIHdpZHRoOiAnMXB4JywgaGVpZ2h0OiAnMXB4JywgdmlzaWJpbGl0eTogJ2hpZGRlbicgfSApOwoKCQljb250YWluZXIuaW5uZXJIVE1MID0gaHRtbDsKCQlib2R5Lmluc2VydEJlZm9yZSggY29udGFpbmVyLCBib2R5LmZpcnN0Q2hpbGQgKTsKCQlpbm5lckRpdiA9IGNvbnRhaW5lci5maXJzdENoaWxkLCBjaGVja0RpdiA9IGlubmVyRGl2LmZpcnN0Q2hpbGQsIHRkID0gaW5uZXJEaXYubmV4dFNpYmxpbmcuZmlyc3RDaGlsZC5maXJzdENoaWxkOwoKCQl0aGlzLmRvZXNOb3RBZGRCb3JkZXIgPSAoY2hlY2tEaXYub2Zmc2V0VG9wICE9PSA1KTsKCQl0aGlzLmRvZXNBZGRCb3JkZXJGb3JUYWJsZUFuZENlbGxzID0gKHRkLm9mZnNldFRvcCA9PT0gNSk7CgoJCWNoZWNrRGl2LnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJywgY2hlY2tEaXYuc3R5bGUudG9wID0gJzIwcHgnOwoJCXRoaXMuc3VwcG9ydHNGaXhlZFBvc2l0aW9uID0gKGNoZWNrRGl2Lm9mZnNldFRvcCA9PT0gMjAgfHwgY2hlY2tEaXYub2Zmc2V0VG9wID09PSAxNSk7IC8vIHNhZmFyaSBzdWJ0cmFjdHMgcGFyZW50IGJvcmRlciB3aWR0aCBoZXJlIHdoaWNoIGlzIDVweAoJCWNoZWNrRGl2LnN0eWxlLnBvc2l0aW9uID0gJycsIGNoZWNrRGl2LnN0eWxlLnRvcCA9ICcnOwoKCQlpbm5lckRpdi5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nLCBpbm5lckRpdi5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7CgkJdGhpcy5zdWJ0cmFjdHNCb3JkZXJGb3JPdmVyZmxvd05vdFZpc2libGUgPSAoY2hlY2tEaXYub2Zmc2V0VG9wID09PSAtNSk7CgoJCXRoaXMuZG9lc05vdEluY2x1ZGVNYXJnaW5JbkJvZHlPZmZzZXQgPSAoYm9keS5vZmZzZXRUb3AgIT09IGJvZHlNYXJnaW5Ub3ApOwoKCQlib2R5LnJlbW92ZUNoaWxkKCBjb250YWluZXIgKTsKCQlqUXVlcnkub2Zmc2V0LmluaXRpYWxpemUgPSBmdW5jdGlvbigpe307CgkJCgkJYm9keSA9IGNvbnRhaW5lciA9IGlubmVyRGl2ID0gY2hlY2tEaXYgPSB0YWJsZSA9IHRkID0gbnVsbDsKCX0sCgoJYm9keU9mZnNldDogZnVuY3Rpb24oYm9keSkgewoJCWpRdWVyeS5vZmZzZXQuaW5pdGlhbGl6ZSgpOwoJCXZhciB0b3AgPSBib2R5Lm9mZnNldFRvcCwgbGVmdCA9IGJvZHkub2Zmc2V0TGVmdDsKCQlpZiAoIGpRdWVyeS5vZmZzZXQuZG9lc05vdEluY2x1ZGVNYXJnaW5JbkJvZHlPZmZzZXQgKQoJCQl0b3AgICs9IHBhcnNlRmxvYXQoIGpRdWVyeS5jdXJDU1MoYm9keSwgJ21hcmdpblRvcCcsICB0cnVlKSApIHx8IDAsCgkJCWxlZnQgKz0gcGFyc2VGbG9hdCggalF1ZXJ5LmN1ckNTUyhib2R5LCAnbWFyZ2luTGVmdCcsIHRydWUpICkgfHwgMDsKCQlyZXR1cm4geyB0b3A6IHRvcCwgbGVmdDogbGVmdCB9OwoJfQp9OwoKCmpRdWVyeS5mbi5leHRlbmQoewoJcG9zaXRpb246IGZ1bmN0aW9uKCkgewoJCWlmICggIXRoaXNbMF0gKSByZXR1cm4gbnVsbDsKCgkJdmFyIGVsZW0gPSB0aGlzWzBdLAoKCQkvLyBHZXQgKnJlYWwqIG9mZnNldFBhcmVudAoJCW9mZnNldFBhcmVudCA9IHRoaXMub2Zmc2V0UGFyZW50KCksCgoJCS8vIEdldCBjb3JyZWN0IG9mZnNldHMKCQlvZmZzZXQgICAgICAgPSB0aGlzLm9mZnNldCgpLAoJCXBhcmVudE9mZnNldCA9IC9eYm9keXxodG1sJC9pLnRlc3Qob2Zmc2V0UGFyZW50WzBdLnRhZ05hbWUpID8geyB0b3A6IDAsIGxlZnQ6IDAgfSA6IG9mZnNldFBhcmVudC5vZmZzZXQoKTsKCgkJLy8gU3VidHJhY3QgZWxlbWVudCBtYXJnaW5zCgkJLy8gbm90ZTogd2hlbiBhbiBlbGVtZW50IGhhcyBtYXJnaW46IGF1dG8gdGhlIG9mZnNldExlZnQgYW5kIG1hcmdpbkxlZnQKCQkvLyBhcmUgdGhlIHNhbWUgaW4gU2FmYXJpIGNhdXNpbmcgb2Zmc2V0LmxlZnQgdG8gaW5jb3JyZWN0bHkgYmUgMAoJCW9mZnNldC50b3AgIC09IHBhcnNlRmxvYXQoIGpRdWVyeS5jdXJDU1MoZWxlbSwgJ21hcmdpblRvcCcsICB0cnVlKSApIHx8IDA7CgkJb2Zmc2V0LmxlZnQgLT0gcGFyc2VGbG9hdCggalF1ZXJ5LmN1ckNTUyhlbGVtLCAnbWFyZ2luTGVmdCcsIHRydWUpICkgfHwgMDsKCgkJLy8gQWRkIG9mZnNldFBhcmVudCBib3JkZXJzCgkJcGFyZW50T2Zmc2V0LnRvcCAgKz0gcGFyc2VGbG9hdCggalF1ZXJ5LmN1ckNTUyhvZmZzZXRQYXJlbnRbMF0sICdib3JkZXJUb3BXaWR0aCcsICB0cnVlKSApIHx8IDA7CgkJcGFyZW50T2Zmc2V0LmxlZnQgKz0gcGFyc2VGbG9hdCggalF1ZXJ5LmN1ckNTUyhvZmZzZXRQYXJlbnRbMF0sICdib3JkZXJMZWZ0V2lkdGgnLCB0cnVlKSApIHx8IDA7CgoJCS8vIFN1YnRyYWN0IHRoZSB0d28gb2Zmc2V0cwoJCXJldHVybiB7CgkJCXRvcDogIG9mZnNldC50b3AgIC0gcGFyZW50T2Zmc2V0LnRvcCwKCQkJbGVmdDogb2Zmc2V0LmxlZnQgLSBwYXJlbnRPZmZzZXQubGVmdAoJCX07Cgl9LAoKCW9mZnNldFBhcmVudDogZnVuY3Rpb24oKSB7CgkJdmFyIG9mZnNldFBhcmVudCA9IHRoaXNbMF0ub2Zmc2V0UGFyZW50IHx8IGRvY3VtZW50LmJvZHk7CgkJd2hpbGUgKCBvZmZzZXRQYXJlbnQgJiYgKCEvXmJvZHl8aHRtbCQvaS50ZXN0KG9mZnNldFBhcmVudC50YWdOYW1lKSAmJiBqUXVlcnkuY3NzKG9mZnNldFBhcmVudCwgJ3Bvc2l0aW9uJykgPT09ICdzdGF0aWMnKSApCgkJCW9mZnNldFBhcmVudCA9IG9mZnNldFBhcmVudC5vZmZzZXRQYXJlbnQ7CgkJcmV0dXJuIGpRdWVyeSggb2Zmc2V0UGFyZW50ICk7Cgl9Cn0pOwoKCi8vIENyZWF0ZSBzY3JvbGxMZWZ0IGFuZCBzY3JvbGxUb3AgbWV0aG9kcwpqUXVlcnkuZWFjaCggWydMZWZ0JywgJ1RvcCddLCBmdW5jdGlvbihpLCBuYW1lKSB7Cgl2YXIgbWV0aG9kID0gJ3Njcm9sbCcgKyBuYW1lOwoKCWpRdWVyeS5mblsgbWV0aG9kIF0gPSBmdW5jdGlvbih2YWwpIHsKCQlpZiAoICF0aGlzWzBdICkgcmV0dXJuIG51bGw7CgkJCgkJdmFyIGVsZW0gPSB0aGlzWzBdLCB3aW4gPSAoInNjcm9sbFRvIiBpbiBlbGVtICYmIGVsZW0uZG9jdW1lbnQpID8gZWxlbSA6CgkJCShlbGVtLm5vZGVOYW1lID09PSAiI2RvY3VtZW50IikgPyBlbGVtLmRlZmF1bHRWaWV3IHx8IGVsZW0ucGFyZW50V2luZG93IDoKCQkJCWZhbHNlOwoKCQlyZXR1cm4gdmFsICE9PSB1bmRlZmluZWQgPwoKCQkJLy8gU2V0IHRoZSBzY3JvbGwgb2Zmc2V0CgkJCXRoaXMuZWFjaChmdW5jdGlvbigpIHsKCQkJCXdpbiA9ICgic2Nyb2xsVG8iIGluIHRoaXMgJiYgdGhpcy5kb2N1bWVudCkgPyB0aGlzIDogCgkJCQkJKHRoaXMubm9kZU5hbWUgPT09ICIjZG9jdW1lbnQiKSA/IHRoaXMuZGVmYXVsdFZpZXcgfHwgdGhpcy5wYXJlbnRXaW5kb3cgOgoJCQkJCQlmYWxzZTsKCQkJCQoJCQkJd2luID8KCQkJCQl3aW4uc2Nyb2xsVG8oCgkJCQkJCSFpID8gdmFsIDogalF1ZXJ5KHdpbikuc2Nyb2xsTGVmdCgpLAoJCQkJCQkgaSA/IHZhbCA6IGpRdWVyeSh3aW4pLnNjcm9sbFRvcCgpCgkJCQkJKSA6CgkJCQkJdGhpc1sgbWV0aG9kIF0gPSB2YWw7CgkJCX0pIDoKCgkJCS8vIFJldHVybiB0aGUgc2Nyb2xsIG9mZnNldAoJCQl3aW4gPwoJCQkJd2luWyBpID8gJ3BhZ2VZT2Zmc2V0JyA6ICdwYWdlWE9mZnNldCcgXSB8fAoJCQkJCWpRdWVyeS5zdXBwb3J0LmJveE1vZGVsICYmIHdpbi5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbIG1ldGhvZCBdIHx8CgkJCQkJd2luLmRvY3VtZW50LmJvZHlbIG1ldGhvZCBdIDoKCQkJCWVsZW1bIG1ldGhvZCBdOwoJfTsKfSk7Ci8vIENyZWF0ZSBpbm5lckhlaWdodCwgaW5uZXJXaWR0aCwgb3V0ZXJIZWlnaHQgYW5kIG91dGVyV2lkdGggbWV0aG9kcwpqUXVlcnkuZWFjaChbICJIZWlnaHQiLCAiV2lkdGgiIF0sIGZ1bmN0aW9uKGksIG5hbWUpewoKCXZhciB0eXBlID0gbmFtZS50b0xvd2VyQ2FzZSgpOwoKCS8vIGlubmVySGVpZ2h0IGFuZCBpbm5lcldpZHRoCglqUXVlcnkuZm5bImlubmVyIiArIG5hbWVdID0gZnVuY3Rpb24oKXsKCQlyZXR1cm4gdGhpc1swXSA/CgkJCWpRdWVyeS5jc3MoIHRoaXNbMF0sIHR5cGUsIGZhbHNlLCAicGFkZGluZyIgKSA6CgkJCW51bGw7Cgl9OwoKCS8vIG91dGVySGVpZ2h0IGFuZCBvdXRlcldpZHRoCglqUXVlcnkuZm5bIm91dGVyIiArIG5hbWVdID0gZnVuY3Rpb24obWFyZ2luKSB7CgkJcmV0dXJuIHRoaXNbMF0gPwoJCQlqUXVlcnkuY3NzKCB0aGlzWzBdLCB0eXBlLCBmYWxzZSwgbWFyZ2luID8gIm1hcmdpbiIgOiAiYm9yZGVyIiApIDoKCQkJbnVsbDsKCX07CgoJalF1ZXJ5LmZuWyB0eXBlIF0gPSBmdW5jdGlvbiggc2l6ZSApIHsKCQkvLyBHZXQgd2luZG93IHdpZHRoIG9yIGhlaWdodAoJCXZhciBlbGVtID0gdGhpc1swXTsKCQlpZiAoICFlbGVtICkgcmV0dXJuIG51bGw7CgkJcmV0dXJuICgic2Nyb2xsVG8iIGluIGVsZW0gJiYgZWxlbS5kb2N1bWVudCkgPyAvLyBkb2VzIGl0IHdhbGsgYW5kIHF1YWNrIGxpa2UgYSB3aW5kb3c/CgkJCS8vIEV2ZXJ5b25lIGVsc2UgdXNlIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCBvciBkb2N1bWVudC5ib2R5IGRlcGVuZGluZyBvbiBRdWlya3MgdnMgU3RhbmRhcmRzIG1vZGUKCQkJZWxlbS5kb2N1bWVudC5jb21wYXRNb2RlID09PSAiQ1NTMUNvbXBhdCIgJiYgZWxlbS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbICJjbGllbnQiICsgbmFtZSBdIHx8CgkJCWVsZW0uZG9jdW1lbnQuYm9keVsgImNsaWVudCIgKyBuYW1lIF0gOgoKCQkJLy8gR2V0IGRvY3VtZW50IHdpZHRoIG9yIGhlaWdodAoJCQkoZWxlbS5ub2RlTmFtZSA9PT0gIiNkb2N1bWVudCIpID8gLy8gaXMgaXQgYSBkb2N1bWVudAoJCQkJLy8gRWl0aGVyIHNjcm9sbFtXaWR0aC9IZWlnaHRdIG9yIG9mZnNldFtXaWR0aC9IZWlnaHRdLCB3aGljaGV2ZXIgaXMgZ3JlYXRlcgoJCQkJTWF0aC5tYXgoCgkJCQkJZWxlbS5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIgKyBuYW1lXSwKCQkJCQllbGVtLmJvZHlbInNjcm9sbCIgKyBuYW1lXSwgZWxlbS5kb2N1bWVudEVsZW1lbnRbInNjcm9sbCIgKyBuYW1lXSwKCQkJCQllbGVtLmJvZHlbIm9mZnNldCIgKyBuYW1lXSwgZWxlbS5kb2N1bWVudEVsZW1lbnRbIm9mZnNldCIgKyBuYW1lXQoJCQkJKSA6CgoJCQkJLy8gR2V0IG9yIHNldCB3aWR0aCBvciBoZWlnaHQgb24gdGhlIGVsZW1lbnQKCQkJCXNpemUgPT09IHVuZGVmaW5lZCA/CgkJCQkJLy8gR2V0IHdpZHRoIG9yIGhlaWdodCBvbiB0aGUgZWxlbWVudAoJCQkJCWpRdWVyeS5jc3MoIGVsZW0sIHR5cGUgKSA6CgoJCQkJCS8vIFNldCB0aGUgd2lkdGggb3IgaGVpZ2h0IG9uIHRoZSBlbGVtZW50IChkZWZhdWx0IHRvIHBpeGVscyBpZiB2YWx1ZSBpcyB1bml0bGVzcykKCQkJCQl0aGlzLmNzcyggdHlwZSwgdHlwZW9mIHNpemUgPT09ICJzdHJpbmciID8gc2l6ZSA6IHNpemUgKyAicHgiICk7Cgl9OwoKfSk7Cn0pKHdpbmRvdyk7Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/lib/jquery-1.7.1.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohIGpRdWVyeSB2MS43LjEganF1ZXJ5LmNvbSB8IGpxdWVyeS5vcmcvbGljZW5zZSAqLwooZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjeShhKXtyZXR1cm4gZi5pc1dpbmRvdyhhKT9hOmEubm9kZVR5cGU9PT05P2EuZGVmYXVsdFZpZXd8fGEucGFyZW50V2luZG93OiExfWZ1bmN0aW9uIGN2KGEpe2lmKCFja1thXSl7dmFyIGI9Yy5ib2R5LGQ9ZigiPCIrYSsiPiIpLmFwcGVuZFRvKGIpLGU9ZC5jc3MoImRpc3BsYXkiKTtkLnJlbW92ZSgpO2lmKGU9PT0ibm9uZSJ8fGU9PT0iIil7Y2x8fChjbD1jLmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpLGNsLmZyYW1lQm9yZGVyPWNsLndpZHRoPWNsLmhlaWdodD0wKSxiLmFwcGVuZENoaWxkKGNsKTtpZighY218fCFjbC5jcmVhdGVFbGVtZW50KWNtPShjbC5jb250ZW50V2luZG93fHxjbC5jb250ZW50RG9jdW1lbnQpLmRvY3VtZW50LGNtLndyaXRlKChjLmNvbXBhdE1vZGU9PT0iQ1NTMUNvbXBhdCI/IjwhZG9jdHlwZSBodG1sPiI6IiIpKyI8aHRtbD48Ym9keT4iKSxjbS5jbG9zZSgpO2Q9Y20uY3JlYXRlRWxlbWVudChhKSxjbS5ib2R5LmFwcGVuZENoaWxkKGQpLGU9Zi5jc3MoZCwiZGlzcGxheSIpLGIucmVtb3ZlQ2hpbGQoY2wpfWNrW2FdPWV9cmV0dXJuIGNrW2FdfWZ1bmN0aW9uIGN1KGEsYil7dmFyIGM9e307Zi5lYWNoKGNxLmNvbmNhdC5hcHBseShbXSxjcS5zbGljZSgwLGIpKSxmdW5jdGlvbigpe2NbdGhpc109YX0pO3JldHVybiBjfWZ1bmN0aW9uIGN0KCl7Y3I9Yn1mdW5jdGlvbiBjcygpe3NldFRpbWVvdXQoY3QsMCk7cmV0dXJuIGNyPWYubm93KCl9ZnVuY3Rpb24gY2ooKXt0cnl7cmV0dXJuIG5ldyBhLkFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxIVFRQIil9Y2F0Y2goYil7fX1mdW5jdGlvbiBjaSgpe3RyeXtyZXR1cm4gbmV3IGEuWE1MSHR0cFJlcXVlc3R9Y2F0Y2goYil7fX1mdW5jdGlvbiBjYyhhLGMpe2EuZGF0YUZpbHRlciYmKGM9YS5kYXRhRmlsdGVyKGMsYS5kYXRhVHlwZSkpO3ZhciBkPWEuZGF0YVR5cGVzLGU9e30sZyxoLGk9ZC5sZW5ndGgsaixrPWRbMF0sbCxtLG4sbyxwO2ZvcihnPTE7ZzxpO2crKyl7aWYoZz09PTEpZm9yKGggaW4gYS5jb252ZXJ0ZXJzKXR5cGVvZiBoPT0ic3RyaW5nIiYmKGVbaC50b0xvd2VyQ2FzZSgpXT1hLmNvbnZlcnRlcnNbaF0pO2w9ayxrPWRbZ107aWYoaz09PSIqIilrPWw7ZWxzZSBpZihsIT09IioiJiZsIT09ayl7bT1sKyIgIitrLG49ZVttXXx8ZVsiKiAiK2tdO2lmKCFuKXtwPWI7Zm9yKG8gaW4gZSl7aj1vLnNwbGl0KCIgIik7aWYoalswXT09PWx8fGpbMF09PT0iKiIpe3A9ZVtqWzFdKyIgIitrXTtpZihwKXtvPWVbb10sbz09PSEwP249cDpwPT09ITAmJihuPW8pO2JyZWFrfX19fSFuJiYhcCYmZi5lcnJvcigiTm8gY29udmVyc2lvbiBmcm9tICIrbS5yZXBsYWNlKCIgIiwiIHRvICIpKSxuIT09ITAmJihjPW4/bihjKTpwKG8oYykpKX19cmV0dXJuIGN9ZnVuY3Rpb24gY2IoYSxjLGQpe3ZhciBlPWEuY29udGVudHMsZj1hLmRhdGFUeXBlcyxnPWEucmVzcG9uc2VGaWVsZHMsaCxpLGosaztmb3IoaSBpbiBnKWkgaW4gZCYmKGNbZ1tpXV09ZFtpXSk7d2hpbGUoZlswXT09PSIqIilmLnNoaWZ0KCksaD09PWImJihoPWEubWltZVR5cGV8fGMuZ2V0UmVzcG9uc2VIZWFkZXIoImNvbnRlbnQtdHlwZSIpKTtpZihoKWZvcihpIGluIGUpaWYoZVtpXSYmZVtpXS50ZXN0KGgpKXtmLnVuc2hpZnQoaSk7YnJlYWt9aWYoZlswXWluIGQpaj1mWzBdO2Vsc2V7Zm9yKGkgaW4gZCl7aWYoIWZbMF18fGEuY29udmVydGVyc1tpKyIgIitmWzBdXSl7aj1pO2JyZWFrfWt8fChrPWkpfWo9anx8a31pZihqKXtqIT09ZlswXSYmZi51bnNoaWZ0KGopO3JldHVybiBkW2pdfX1mdW5jdGlvbiBjYShhLGIsYyxkKXtpZihmLmlzQXJyYXkoYikpZi5lYWNoKGIsZnVuY3Rpb24oYixlKXtjfHxiRS50ZXN0KGEpP2QoYSxlKTpjYShhKyJbIisodHlwZW9mIGU9PSJvYmplY3QifHxmLmlzQXJyYXkoZSk/YjoiIikrIl0iLGUsYyxkKX0pO2Vsc2UgaWYoIWMmJmIhPW51bGwmJnR5cGVvZiBiPT0ib2JqZWN0Iilmb3IodmFyIGUgaW4gYiljYShhKyJbIitlKyJdIixiW2VdLGMsZCk7ZWxzZSBkKGEsYil9ZnVuY3Rpb24gYl8oYSxjKXt2YXIgZCxlLGc9Zi5hamF4U2V0dGluZ3MuZmxhdE9wdGlvbnN8fHt9O2ZvcihkIGluIGMpY1tkXSE9PWImJigoZ1tkXT9hOmV8fChlPXt9KSlbZF09Y1tkXSk7ZSYmZi5leHRlbmQoITAsYSxlKX1mdW5jdGlvbiBiJChhLGMsZCxlLGYsZyl7Zj1mfHxjLmRhdGFUeXBlc1swXSxnPWd8fHt9LGdbZl09ITA7dmFyIGg9YVtmXSxpPTAsaj1oP2gubGVuZ3RoOjAsaz1hPT09YlQsbDtmb3IoO2k8aiYmKGt8fCFsKTtpKyspbD1oW2ldKGMsZCxlKSx0eXBlb2YgbD09InN0cmluZyImJigha3x8Z1tsXT9sPWI6KGMuZGF0YVR5cGVzLnVuc2hpZnQobCksbD1iJChhLGMsZCxlLGwsZykpKTsoa3x8IWwpJiYhZ1siKiJdJiYobD1iJChhLGMsZCxlLCIqIixnKSk7cmV0dXJuIGx9ZnVuY3Rpb24gYlooYSl7cmV0dXJuIGZ1bmN0aW9uKGIsYyl7dHlwZW9mIGIhPSJzdHJpbmciJiYoYz1iLGI9IioiKTtpZihmLmlzRnVuY3Rpb24oYykpe3ZhciBkPWIudG9Mb3dlckNhc2UoKS5zcGxpdChiUCksZT0wLGc9ZC5sZW5ndGgsaCxpLGo7Zm9yKDtlPGc7ZSsrKWg9ZFtlXSxqPS9eXCsvLnRlc3QoaCksaiYmKGg9aC5zdWJzdHIoMSl8fCIqIiksaT1hW2hdPWFbaF18fFtdLGlbaj8idW5zaGlmdCI6InB1c2giXShjKX19fWZ1bmN0aW9uIGJDKGEsYixjKXt2YXIgZD1iPT09IndpZHRoIj9hLm9mZnNldFdpZHRoOmEub2Zmc2V0SGVpZ2h0LGU9Yj09PSJ3aWR0aCI/Yng6YnksZz0wLGg9ZS5sZW5ndGg7aWYoZD4wKXtpZihjIT09ImJvcmRlciIpZm9yKDtnPGg7ZysrKWN8fChkLT1wYXJzZUZsb2F0KGYuY3NzKGEsInBhZGRpbmciK2VbZ10pKXx8MCksYz09PSJtYXJnaW4iP2QrPXBhcnNlRmxvYXQoZi5jc3MoYSxjK2VbZ10pKXx8MDpkLT1wYXJzZUZsb2F0KGYuY3NzKGEsImJvcmRlciIrZVtnXSsiV2lkdGgiKSl8fDA7cmV0dXJuIGQrInB4In1kPWJ6KGEsYixiKTtpZihkPDB8fGQ9PW51bGwpZD1hLnN0eWxlW2JdfHwwO2Q9cGFyc2VGbG9hdChkKXx8MDtpZihjKWZvcig7ZzxoO2crKylkKz1wYXJzZUZsb2F0KGYuY3NzKGEsInBhZGRpbmciK2VbZ10pKXx8MCxjIT09InBhZGRpbmciJiYoZCs9cGFyc2VGbG9hdChmLmNzcyhhLCJib3JkZXIiK2VbZ10rIldpZHRoIikpfHwwKSxjPT09Im1hcmdpbiImJihkKz1wYXJzZUZsb2F0KGYuY3NzKGEsYytlW2ddKSl8fDApO3JldHVybiBkKyJweCJ9ZnVuY3Rpb24gYnAoYSxiKXtiLnNyYz9mLmFqYXgoe3VybDpiLnNyYyxhc3luYzohMSxkYXRhVHlwZToic2NyaXB0In0pOmYuZ2xvYmFsRXZhbCgoYi50ZXh0fHxiLnRleHRDb250ZW50fHxiLmlubmVySFRNTHx8IiIpLnJlcGxhY2UoYmYsIi8qJDAqLyIpKSxiLnBhcmVudE5vZGUmJmIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKX1mdW5jdGlvbiBibyhhKXt2YXIgYj1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpO2JoLmFwcGVuZENoaWxkKGIpLGIuaW5uZXJIVE1MPWEub3V0ZXJIVE1MO3JldHVybiBiLmZpcnN0Q2hpbGR9ZnVuY3Rpb24gYm4oYSl7dmFyIGI9KGEubm9kZU5hbWV8fCIiKS50b0xvd2VyQ2FzZSgpO2I9PT0iaW5wdXQiP2JtKGEpOmIhPT0ic2NyaXB0IiYmdHlwZW9mIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUhPSJ1bmRlZmluZWQiJiZmLmdyZXAoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKSxibSl9ZnVuY3Rpb24gYm0oYSl7aWYoYS50eXBlPT09ImNoZWNrYm94Inx8YS50eXBlPT09InJhZGlvIilhLmRlZmF1bHRDaGVja2VkPWEuY2hlY2tlZH1mdW5jdGlvbiBibChhKXtyZXR1cm4gdHlwZW9mIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUhPSJ1bmRlZmluZWQiP2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKTp0eXBlb2YgYS5xdWVyeVNlbGVjdG9yQWxsIT0idW5kZWZpbmVkIj9hLnF1ZXJ5U2VsZWN0b3JBbGwoIioiKTpbXX1mdW5jdGlvbiBiayhhLGIpe3ZhciBjO2lmKGIubm9kZVR5cGU9PT0xKXtiLmNsZWFyQXR0cmlidXRlcyYmYi5jbGVhckF0dHJpYnV0ZXMoKSxiLm1lcmdlQXR0cmlidXRlcyYmYi5tZXJnZUF0dHJpYnV0ZXMoYSksYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7aWYoYz09PSJvYmplY3QiKWIub3V0ZXJIVE1MPWEub3V0ZXJIVE1MO2Vsc2UgaWYoYyE9PSJpbnB1dCJ8fGEudHlwZSE9PSJjaGVja2JveCImJmEudHlwZSE9PSJyYWRpbyIpe2lmKGM9PT0ib3B0aW9uIiliLnNlbGVjdGVkPWEuZGVmYXVsdFNlbGVjdGVkO2Vsc2UgaWYoYz09PSJpbnB1dCJ8fGM9PT0idGV4dGFyZWEiKWIuZGVmYXVsdFZhbHVlPWEuZGVmYXVsdFZhbHVlfWVsc2UgYS5jaGVja2VkJiYoYi5kZWZhdWx0Q2hlY2tlZD1iLmNoZWNrZWQ9YS5jaGVja2VkKSxiLnZhbHVlIT09YS52YWx1ZSYmKGIudmFsdWU9YS52YWx1ZSk7Yi5yZW1vdmVBdHRyaWJ1dGUoZi5leHBhbmRvKX19ZnVuY3Rpb24gYmooYSxiKXtpZihiLm5vZGVUeXBlPT09MSYmISFmLmhhc0RhdGEoYSkpe3ZhciBjLGQsZSxnPWYuX2RhdGEoYSksaD1mLl9kYXRhKGIsZyksaT1nLmV2ZW50cztpZihpKXtkZWxldGUgaC5oYW5kbGUsaC5ldmVudHM9e307Zm9yKGMgaW4gaSlmb3IoZD0wLGU9aVtjXS5sZW5ndGg7ZDxlO2QrKylmLmV2ZW50LmFkZChiLGMrKGlbY11bZF0ubmFtZXNwYWNlPyIuIjoiIikraVtjXVtkXS5uYW1lc3BhY2UsaVtjXVtkXSxpW2NdW2RdLmRhdGEpfWguZGF0YSYmKGguZGF0YT1mLmV4dGVuZCh7fSxoLmRhdGEpKX19ZnVuY3Rpb24gYmkoYSxiKXtyZXR1cm4gZi5ub2RlTmFtZShhLCJ0YWJsZSIpP2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRib2R5IilbMF18fGEuYXBwZW5kQ2hpbGQoYS5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRib2R5IikpOmF9ZnVuY3Rpb24gVShhKXt2YXIgYj1WLnNwbGl0KCJ8IiksYz1hLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtpZihjLmNyZWF0ZUVsZW1lbnQpd2hpbGUoYi5sZW5ndGgpYy5jcmVhdGVFbGVtZW50KGIucG9wKCkpO3JldHVybiBjfWZ1bmN0aW9uIFQoYSxiLGMpe2I9Ynx8MDtpZihmLmlzRnVuY3Rpb24oYikpcmV0dXJuIGYuZ3JlcChhLGZ1bmN0aW9uKGEsZCl7dmFyIGU9ISFiLmNhbGwoYSxkLGEpO3JldHVybiBlPT09Y30pO2lmKGIubm9kZVR5cGUpcmV0dXJuIGYuZ3JlcChhLGZ1bmN0aW9uKGEsZCl7cmV0dXJuIGE9PT1iPT09Y30pO2lmKHR5cGVvZiBiPT0ic3RyaW5nIil7dmFyIGQ9Zi5ncmVwKGEsZnVuY3Rpb24oYSl7cmV0dXJuIGEubm9kZVR5cGU9PT0xfSk7aWYoTy50ZXN0KGIpKXJldHVybiBmLmZpbHRlcihiLGQsIWMpO2I9Zi5maWx0ZXIoYixkKX1yZXR1cm4gZi5ncmVwKGEsZnVuY3Rpb24oYSxkKXtyZXR1cm4gZi5pbkFycmF5KGEsYik+PTA9PT1jfSl9ZnVuY3Rpb24gUyhhKXtyZXR1cm4hYXx8IWEucGFyZW50Tm9kZXx8YS5wYXJlbnROb2RlLm5vZGVUeXBlPT09MTF9ZnVuY3Rpb24gSygpe3JldHVybiEwfWZ1bmN0aW9uIEooKXtyZXR1cm4hMX1mdW5jdGlvbiBuKGEsYixjKXt2YXIgZD1iKyJkZWZlciIsZT1iKyJxdWV1ZSIsZz1iKyJtYXJrIixoPWYuX2RhdGEoYSxkKTtoJiYoYz09PSJxdWV1ZSJ8fCFmLl9kYXRhKGEsZSkpJiYoYz09PSJtYXJrInx8IWYuX2RhdGEoYSxnKSkmJnNldFRpbWVvdXQoZnVuY3Rpb24oKXshZi5fZGF0YShhLGUpJiYhZi5fZGF0YShhLGcpJiYoZi5yZW1vdmVEYXRhKGEsZCwhMCksaC5maXJlKCkpfSwwKX1mdW5jdGlvbiBtKGEpe2Zvcih2YXIgYiBpbiBhKXtpZihiPT09ImRhdGEiJiZmLmlzRW1wdHlPYmplY3QoYVtiXSkpY29udGludWU7aWYoYiE9PSJ0b0pTT04iKXJldHVybiExfXJldHVybiEwfWZ1bmN0aW9uIGwoYSxjLGQpe2lmKGQ9PT1iJiZhLm5vZGVUeXBlPT09MSl7dmFyIGU9ImRhdGEtIitjLnJlcGxhY2UoaywiLSQxIikudG9Mb3dlckNhc2UoKTtkPWEuZ2V0QXR0cmlidXRlKGUpO2lmKHR5cGVvZiBkPT0ic3RyaW5nIil7dHJ5e2Q9ZD09PSJ0cnVlIj8hMDpkPT09ImZhbHNlIj8hMTpkPT09Im51bGwiP251bGw6Zi5pc051bWVyaWMoZCk/cGFyc2VGbG9hdChkKTpqLnRlc3QoZCk/Zi5wYXJzZUpTT04oZCk6ZH1jYXRjaChnKXt9Zi5kYXRhKGEsYyxkKX1lbHNlIGQ9Yn1yZXR1cm4gZH1mdW5jdGlvbiBoKGEpe3ZhciBiPWdbYV09e30sYyxkO2E9YS5zcGxpdCgvXHMrLyk7Zm9yKGM9MCxkPWEubGVuZ3RoO2M8ZDtjKyspYlthW2NdXT0hMDtyZXR1cm4gYn12YXIgYz1hLmRvY3VtZW50LGQ9YS5uYXZpZ2F0b3IsZT1hLmxvY2F0aW9uLGY9ZnVuY3Rpb24oKXtmdW5jdGlvbiBKKCl7aWYoIWUuaXNSZWFkeSl7dHJ5e2MuZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsKCJsZWZ0Iil9Y2F0Y2goYSl7c2V0VGltZW91dChKLDEpO3JldHVybn1lLnJlYWR5KCl9fXZhciBlPWZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBlLmZuLmluaXQoYSxiLGgpfSxmPWEualF1ZXJ5LGc9YS4kLGgsaT0vXig/OlteIzxdKig8W1x3XFddKz4pW14+XSokfCMoW1x3XC1dKikkKS8saj0vXFMvLGs9L15ccysvLGw9L1xzKyQvLG09L148KFx3KylccypcLz8+KD86PFwvXDE+KT8kLyxuPS9eW1xdLDp7fVxzXSokLyxvPS9cXCg/OlsiXFxcL2JmbnJ0XXx1WzAtOWEtZkEtRl17NH0pL2cscD0vIlteIlxcXG5ccl0qInx0cnVlfGZhbHNlfG51bGx8LT9cZCsoPzpcLlxkKik/KD86W2VFXVsrXC1dP1xkKyk/L2cscT0vKD86Xnw6fCwpKD86XHMqXFspKy9nLHI9Lyh3ZWJraXQpWyBcL10oW1x3Ll0rKS8scz0vKG9wZXJhKSg/Oi4qdmVyc2lvbik/WyBcL10oW1x3Ll0rKS8sdD0vKG1zaWUpIChbXHcuXSspLyx1PS8obW96aWxsYSkoPzouKj8gcnY6KFtcdy5dKykpPy8sdj0vLShbYS16XXxbMC05XSkvaWcsdz0vXi1tcy0vLHg9ZnVuY3Rpb24oYSxiKXtyZXR1cm4oYisiIikudG9VcHBlckNhc2UoKX0seT1kLnVzZXJBZ2VudCx6LEEsQixDPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsRD1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LEU9QXJyYXkucHJvdG90eXBlLnB1c2gsRj1BcnJheS5wcm90b3R5cGUuc2xpY2UsRz1TdHJpbmcucHJvdG90eXBlLnRyaW0sSD1BcnJheS5wcm90b3R5cGUuaW5kZXhPZixJPXt9O2UuZm49ZS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmUsaW5pdDpmdW5jdGlvbihhLGQsZil7dmFyIGcsaCxqLGs7aWYoIWEpcmV0dXJuIHRoaXM7aWYoYS5ub2RlVHlwZSl7dGhpcy5jb250ZXh0PXRoaXNbMF09YSx0aGlzLmxlbmd0aD0xO3JldHVybiB0aGlzfWlmKGE9PT0iYm9keSImJiFkJiZjLmJvZHkpe3RoaXMuY29udGV4dD1jLHRoaXNbMF09Yy5ib2R5LHRoaXMuc2VsZWN0b3I9YSx0aGlzLmxlbmd0aD0xO3JldHVybiB0aGlzfWlmKHR5cGVvZiBhPT0ic3RyaW5nIil7YS5jaGFyQXQoMCkhPT0iPCJ8fGEuY2hhckF0KGEubGVuZ3RoLTEpIT09Ij4ifHxhLmxlbmd0aDwzP2c9aS5leGVjKGEpOmc9W251bGwsYSxudWxsXTtpZihnJiYoZ1sxXXx8IWQpKXtpZihnWzFdKXtkPWQgaW5zdGFuY2VvZiBlP2RbMF06ZCxrPWQ/ZC5vd25lckRvY3VtZW50fHxkOmMsaj1tLmV4ZWMoYSksaj9lLmlzUGxhaW5PYmplY3QoZCk/KGE9W2MuY3JlYXRlRWxlbWVudChqWzFdKV0sZS5mbi5hdHRyLmNhbGwoYSxkLCEwKSk6YT1bay5jcmVhdGVFbGVtZW50KGpbMV0pXTooaj1lLmJ1aWxkRnJhZ21lbnQoW2dbMV1dLFtrXSksYT0oai5jYWNoZWFibGU/ZS5jbG9uZShqLmZyYWdtZW50KTpqLmZyYWdtZW50KS5jaGlsZE5vZGVzKTtyZXR1cm4gZS5tZXJnZSh0aGlzLGEpfWg9Yy5nZXRFbGVtZW50QnlJZChnWzJdKTtpZihoJiZoLnBhcmVudE5vZGUpe2lmKGguaWQhPT1nWzJdKXJldHVybiBmLmZpbmQoYSk7dGhpcy5sZW5ndGg9MSx0aGlzWzBdPWh9dGhpcy5jb250ZXh0PWMsdGhpcy5zZWxlY3Rvcj1hO3JldHVybiB0aGlzfXJldHVybiFkfHxkLmpxdWVyeT8oZHx8ZikuZmluZChhKTp0aGlzLmNvbnN0cnVjdG9yKGQpLmZpbmQoYSl9aWYoZS5pc0Z1bmN0aW9uKGEpKXJldHVybiBmLnJlYWR5KGEpO2Euc2VsZWN0b3IhPT1iJiYodGhpcy5zZWxlY3Rvcj1hLnNlbGVjdG9yLHRoaXMuY29udGV4dD1hLmNvbnRleHQpO3JldHVybiBlLm1ha2VBcnJheShhLHRoaXMpfSxzZWxlY3RvcjoiIixqcXVlcnk6IjEuNy4xIixsZW5ndGg6MCxzaXplOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGVuZ3RofSx0b0FycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIEYuY2FsbCh0aGlzLDApfSxnZXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PW51bGw/dGhpcy50b0FycmF5KCk6YTwwP3RoaXNbdGhpcy5sZW5ndGgrYV06dGhpc1thXX0scHVzaFN0YWNrOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aGlzLmNvbnN0cnVjdG9yKCk7ZS5pc0FycmF5KGEpP0UuYXBwbHkoZCxhKTplLm1lcmdlKGQsYSksZC5wcmV2T2JqZWN0PXRoaXMsZC5jb250ZXh0PXRoaXMuY29udGV4dCxiPT09ImZpbmQiP2Quc2VsZWN0b3I9dGhpcy5zZWxlY3RvcisodGhpcy5zZWxlY3Rvcj8iICI6IiIpK2M6YiYmKGQuc2VsZWN0b3I9dGhpcy5zZWxlY3RvcisiLiIrYisiKCIrYysiKSIpO3JldHVybiBkfSxlYWNoOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGUuZWFjaCh0aGlzLGEsYil9LHJlYWR5OmZ1bmN0aW9uKGEpe2UuYmluZFJlYWR5KCksQS5hZGQoYSk7cmV0dXJuIHRoaXN9LGVxOmZ1bmN0aW9uKGEpe2E9K2E7cmV0dXJuIGE9PT0tMT90aGlzLnNsaWNlKGEpOnRoaXMuc2xpY2UoYSxhKzEpfSxmaXJzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKDApfSxsYXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoLTEpfSxzbGljZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnB1c2hTdGFjayhGLmFwcGx5KHRoaXMsYXJndW1lbnRzKSwic2xpY2UiLEYuY2FsbChhcmd1bWVudHMpLmpvaW4oIiwiKSl9LG1hcDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soZS5tYXAodGhpcyxmdW5jdGlvbihiLGMpe3JldHVybiBhLmNhbGwoYixjLGIpfSkpfSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcmV2T2JqZWN0fHx0aGlzLmNvbnN0cnVjdG9yKG51bGwpfSxwdXNoOkUsc29ydDpbXS5zb3J0LHNwbGljZTpbXS5zcGxpY2V9LGUuZm4uaW5pdC5wcm90b3R5cGU9ZS5mbixlLmV4dGVuZD1lLmZuLmV4dGVuZD1mdW5jdGlvbigpe3ZhciBhLGMsZCxmLGcsaCxpPWFyZ3VtZW50c1swXXx8e30saj0xLGs9YXJndW1lbnRzLmxlbmd0aCxsPSExO3R5cGVvZiBpPT0iYm9vbGVhbiImJihsPWksaT1hcmd1bWVudHNbMV18fHt9LGo9MiksdHlwZW9mIGkhPSJvYmplY3QiJiYhZS5pc0Z1bmN0aW9uKGkpJiYoaT17fSksaz09PWomJihpPXRoaXMsLS1qKTtmb3IoO2o8aztqKyspaWYoKGE9YXJndW1lbnRzW2pdKSE9bnVsbClmb3IoYyBpbiBhKXtkPWlbY10sZj1hW2NdO2lmKGk9PT1mKWNvbnRpbnVlO2wmJmYmJihlLmlzUGxhaW5PYmplY3QoZil8fChnPWUuaXNBcnJheShmKSkpPyhnPyhnPSExLGg9ZCYmZS5pc0FycmF5KGQpP2Q6W10pOmg9ZCYmZS5pc1BsYWluT2JqZWN0KGQpP2Q6e30saVtjXT1lLmV4dGVuZChsLGgsZikpOmYhPT1iJiYoaVtjXT1mKX1yZXR1cm4gaX0sZS5leHRlbmQoe25vQ29uZmxpY3Q6ZnVuY3Rpb24oYil7YS4kPT09ZSYmKGEuJD1nKSxiJiZhLmpRdWVyeT09PWUmJihhLmpRdWVyeT1mKTtyZXR1cm4gZX0saXNSZWFkeTohMSxyZWFkeVdhaXQ6MSxob2xkUmVhZHk6ZnVuY3Rpb24oYSl7YT9lLnJlYWR5V2FpdCsrOmUucmVhZHkoITApfSxyZWFkeTpmdW5jdGlvbihhKXtpZihhPT09ITAmJiEtLWUucmVhZHlXYWl0fHxhIT09ITAmJiFlLmlzUmVhZHkpe2lmKCFjLmJvZHkpcmV0dXJuIHNldFRpbWVvdXQoZS5yZWFkeSwxKTtlLmlzUmVhZHk9ITA7aWYoYSE9PSEwJiYtLWUucmVhZHlXYWl0PjApcmV0dXJuO0EuZmlyZVdpdGgoYyxbZV0pLGUuZm4udHJpZ2dlciYmZShjKS50cmlnZ2VyKCJyZWFkeSIpLm9mZigicmVhZHkiKX19LGJpbmRSZWFkeTpmdW5jdGlvbigpe2lmKCFBKXtBPWUuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpO2lmKGMucmVhZHlTdGF0ZT09PSJjb21wbGV0ZSIpcmV0dXJuIHNldFRpbWVvdXQoZS5yZWFkeSwxKTtpZihjLmFkZEV2ZW50TGlzdGVuZXIpYy5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixCLCExKSxhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLGUucmVhZHksITEpO2Vsc2UgaWYoYy5hdHRhY2hFdmVudCl7Yy5hdHRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIixCKSxhLmF0dGFjaEV2ZW50KCJvbmxvYWQiLGUucmVhZHkpO3ZhciBiPSExO3RyeXtiPWEuZnJhbWVFbGVtZW50PT1udWxsfWNhdGNoKGQpe31jLmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCYmYiYmSigpfX19LGlzRnVuY3Rpb246ZnVuY3Rpb24oYSl7cmV0dXJuIGUudHlwZShhKT09PSJmdW5jdGlvbiJ9LGlzQXJyYXk6QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24oYSl7cmV0dXJuIGUudHlwZShhKT09PSJhcnJheSJ9LGlzV2luZG93OmZ1bmN0aW9uKGEpe3JldHVybiBhJiZ0eXBlb2YgYT09Im9iamVjdCImJiJzZXRJbnRlcnZhbCJpbiBhfSxpc051bWVyaWM6ZnVuY3Rpb24oYSl7cmV0dXJuIWlzTmFOKHBhcnNlRmxvYXQoYSkpJiZpc0Zpbml0ZShhKX0sdHlwZTpmdW5jdGlvbihhKXtyZXR1cm4gYT09bnVsbD9TdHJpbmcoYSk6SVtDLmNhbGwoYSldfHwib2JqZWN0In0saXNQbGFpbk9iamVjdDpmdW5jdGlvbihhKXtpZighYXx8ZS50eXBlKGEpIT09Im9iamVjdCJ8fGEubm9kZVR5cGV8fGUuaXNXaW5kb3coYSkpcmV0dXJuITE7dHJ5e2lmKGEuY29uc3RydWN0b3ImJiFELmNhbGwoYSwiY29uc3RydWN0b3IiKSYmIUQuY2FsbChhLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwiaXNQcm90b3R5cGVPZiIpKXJldHVybiExfWNhdGNoKGMpe3JldHVybiExfXZhciBkO2ZvcihkIGluIGEpO3JldHVybiBkPT09Ynx8RC5jYWxsKGEsZCl9LGlzRW1wdHlPYmplY3Q6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiIGluIGEpcmV0dXJuITE7cmV0dXJuITB9LGVycm9yOmZ1bmN0aW9uKGEpe3Rocm93IG5ldyBFcnJvcihhKX0scGFyc2VKU09OOmZ1bmN0aW9uKGIpe2lmKHR5cGVvZiBiIT0ic3RyaW5nInx8IWIpcmV0dXJuIG51bGw7Yj1lLnRyaW0oYik7aWYoYS5KU09OJiZhLkpTT04ucGFyc2UpcmV0dXJuIGEuSlNPTi5wYXJzZShiKTtpZihuLnRlc3QoYi5yZXBsYWNlKG8sIkAiKS5yZXBsYWNlKHAsIl0iKS5yZXBsYWNlKHEsIiIpKSlyZXR1cm4obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiKSkoKTtlLmVycm9yKCJJbnZhbGlkIEpTT046ICIrYil9LHBhcnNlWE1MOmZ1bmN0aW9uKGMpe3ZhciBkLGY7dHJ5e2EuRE9NUGFyc2VyPyhmPW5ldyBET01QYXJzZXIsZD1mLnBhcnNlRnJvbVN0cmluZyhjLCJ0ZXh0L3htbCIpKTooZD1uZXcgQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhNTERPTSIpLGQuYXN5bmM9ImZhbHNlIixkLmxvYWRYTUwoYykpfWNhdGNoKGcpe2Q9Yn0oIWR8fCFkLmRvY3VtZW50RWxlbWVudHx8ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgicGFyc2VyZXJyb3IiKS5sZW5ndGgpJiZlLmVycm9yKCJJbnZhbGlkIFhNTDogIitjKTtyZXR1cm4gZH0sbm9vcDpmdW5jdGlvbigpe30sZ2xvYmFsRXZhbDpmdW5jdGlvbihiKXtiJiZqLnRlc3QoYikmJihhLmV4ZWNTY3JpcHR8fGZ1bmN0aW9uKGIpe2EuZXZhbC5jYWxsKGEsYil9KShiKX0sY2FtZWxDYXNlOmZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UodywibXMtIikucmVwbGFjZSh2LHgpfSxub2RlTmFtZTpmdW5jdGlvbihhLGIpe3JldHVybiBhLm5vZGVOYW1lJiZhLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCk9PT1iLnRvVXBwZXJDYXNlKCl9LGVhY2g6ZnVuY3Rpb24oYSxjLGQpe3ZhciBmLGc9MCxoPWEubGVuZ3RoLGk9aD09PWJ8fGUuaXNGdW5jdGlvbihhKTtpZihkKXtpZihpKXtmb3IoZiBpbiBhKWlmKGMuYXBwbHkoYVtmXSxkKT09PSExKWJyZWFrfWVsc2UgZm9yKDtnPGg7KWlmKGMuYXBwbHkoYVtnKytdLGQpPT09ITEpYnJlYWt9ZWxzZSBpZihpKXtmb3IoZiBpbiBhKWlmKGMuY2FsbChhW2ZdLGYsYVtmXSk9PT0hMSlicmVha31lbHNlIGZvcig7ZzxoOylpZihjLmNhbGwoYVtnXSxnLGFbZysrXSk9PT0hMSlicmVhaztyZXR1cm4gYX0sdHJpbTpHP2Z1bmN0aW9uKGEpe3JldHVybiBhPT1udWxsPyIiOkcuY2FsbChhKX06ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PW51bGw/IiI6KGErIiIpLnJlcGxhY2UoaywiIikucmVwbGFjZShsLCIiKX0sbWFrZUFycmF5OmZ1bmN0aW9uKGEsYil7dmFyIGM9Ynx8W107aWYoYSE9bnVsbCl7dmFyIGQ9ZS50eXBlKGEpO2EubGVuZ3RoPT1udWxsfHxkPT09InN0cmluZyJ8fGQ9PT0iZnVuY3Rpb24ifHxkPT09InJlZ2V4cCJ8fGUuaXNXaW5kb3coYSk/RS5jYWxsKGMsYSk6ZS5tZXJnZShjLGEpfXJldHVybiBjfSxpbkFycmF5OmZ1bmN0aW9uKGEsYixjKXt2YXIgZDtpZihiKXtpZihIKXJldHVybiBILmNhbGwoYixhLGMpO2Q9Yi5sZW5ndGgsYz1jP2M8MD9NYXRoLm1heCgwLGQrYyk6YzowO2Zvcig7YzxkO2MrKylpZihjIGluIGImJmJbY109PT1hKXJldHVybiBjfXJldHVybi0xfSxtZXJnZTpmdW5jdGlvbihhLGMpe3ZhciBkPWEubGVuZ3RoLGU9MDtpZih0eXBlb2YgYy5sZW5ndGg9PSJudW1iZXIiKWZvcih2YXIgZj1jLmxlbmd0aDtlPGY7ZSsrKWFbZCsrXT1jW2VdO2Vsc2Ugd2hpbGUoY1tlXSE9PWIpYVtkKytdPWNbZSsrXTthLmxlbmd0aD1kO3JldHVybiBhfSxncmVwOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1bXSxlO2M9ISFjO2Zvcih2YXIgZj0wLGc9YS5sZW5ndGg7ZjxnO2YrKyllPSEhYihhW2ZdLGYpLGMhPT1lJiZkLnB1c2goYVtmXSk7cmV0dXJuIGR9LG1hcDpmdW5jdGlvbihhLGMsZCl7dmFyIGYsZyxoPVtdLGk9MCxqPWEubGVuZ3RoLGs9YSBpbnN0YW5jZW9mIGV8fGohPT1iJiZ0eXBlb2Ygaj09Im51bWJlciImJihqPjAmJmFbMF0mJmFbai0xXXx8aj09PTB8fGUuaXNBcnJheShhKSk7aWYoaylmb3IoO2k8ajtpKyspZj1jKGFbaV0saSxkKSxmIT1udWxsJiYoaFtoLmxlbmd0aF09Zik7ZWxzZSBmb3IoZyBpbiBhKWY9YyhhW2ddLGcsZCksZiE9bnVsbCYmKGhbaC5sZW5ndGhdPWYpO3JldHVybiBoLmNvbmNhdC5hcHBseShbXSxoKX0sZ3VpZDoxLHByb3h5OmZ1bmN0aW9uKGEsYyl7aWYodHlwZW9mIGM9PSJzdHJpbmciKXt2YXIgZD1hW2NdO2M9YSxhPWR9aWYoIWUuaXNGdW5jdGlvbihhKSlyZXR1cm4gYjt2YXIgZj1GLmNhbGwoYXJndW1lbnRzLDIpLGc9ZnVuY3Rpb24oKXtyZXR1cm4gYS5hcHBseShjLGYuY29uY2F0KEYuY2FsbChhcmd1bWVudHMpKSl9O2cuZ3VpZD1hLmd1aWQ9YS5ndWlkfHxnLmd1aWR8fGUuZ3VpZCsrO3JldHVybiBnfSxhY2Nlc3M6ZnVuY3Rpb24oYSxjLGQsZixnLGgpe3ZhciBpPWEubGVuZ3RoO2lmKHR5cGVvZiBjPT0ib2JqZWN0Iil7Zm9yKHZhciBqIGluIGMpZS5hY2Nlc3MoYSxqLGNbal0sZixnLGQpO3JldHVybiBhfWlmKGQhPT1iKXtmPSFoJiZmJiZlLmlzRnVuY3Rpb24oZCk7Zm9yKHZhciBrPTA7azxpO2srKylnKGFba10sYyxmP2QuY2FsbChhW2tdLGssZyhhW2tdLGMpKTpkLGgpO3JldHVybiBhfXJldHVybiBpP2coYVswXSxjKTpifSxub3c6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IERhdGUpLmdldFRpbWUoKX0sdWFNYXRjaDpmdW5jdGlvbihhKXthPWEudG9Mb3dlckNhc2UoKTt2YXIgYj1yLmV4ZWMoYSl8fHMuZXhlYyhhKXx8dC5leGVjKGEpfHxhLmluZGV4T2YoImNvbXBhdGlibGUiKTwwJiZ1LmV4ZWMoYSl8fFtdO3JldHVybnticm93c2VyOmJbMV18fCIiLHZlcnNpb246YlsyXXx8IjAifX0sc3ViOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiLGMpe3JldHVybiBuZXcgYS5mbi5pbml0KGIsYyl9ZS5leHRlbmQoITAsYSx0aGlzKSxhLnN1cGVyY2xhc3M9dGhpcyxhLmZuPWEucHJvdG90eXBlPXRoaXMoKSxhLmZuLmNvbnN0cnVjdG9yPWEsYS5zdWI9dGhpcy5zdWIsYS5mbi5pbml0PWZ1bmN0aW9uKGQsZil7ZiYmZiBpbnN0YW5jZW9mIGUmJiEoZiBpbnN0YW5jZW9mIGEpJiYoZj1hKGYpKTtyZXR1cm4gZS5mbi5pbml0LmNhbGwodGhpcyxkLGYsYil9LGEuZm4uaW5pdC5wcm90b3R5cGU9YS5mbjt2YXIgYj1hKGMpO3JldHVybiBhfSxicm93c2VyOnt9fSksZS5lYWNoKCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0Ii5zcGxpdCgiICIpLGZ1bmN0aW9uKGEsYil7SVsiW29iamVjdCAiK2IrIl0iXT1iLnRvTG93ZXJDYXNlKCl9KSx6PWUudWFNYXRjaCh5KSx6LmJyb3dzZXImJihlLmJyb3dzZXJbei5icm93c2VyXT0hMCxlLmJyb3dzZXIudmVyc2lvbj16LnZlcnNpb24pLGUuYnJvd3Nlci53ZWJraXQmJihlLmJyb3dzZXIuc2FmYXJpPSEwKSxqLnRlc3QoIiAiKSYmKGs9L15bXHNceEEwXSsvLGw9L1tcc1x4QTBdKyQvKSxoPWUoYyksYy5hZGRFdmVudExpc3RlbmVyP0I9ZnVuY3Rpb24oKXtjLnJlbW92ZUV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLEIsITEpLGUucmVhZHkoKX06Yy5hdHRhY2hFdmVudCYmKEI9ZnVuY3Rpb24oKXtjLnJlYWR5U3RhdGU9PT0iY29tcGxldGUiJiYoYy5kZXRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIixCKSxlLnJlYWR5KCkpfSk7cmV0dXJuIGV9KCksZz17fTtmLkNhbGxiYWNrcz1mdW5jdGlvbihhKXthPWE/Z1thXXx8aChhKTp7fTt2YXIgYz1bXSxkPVtdLGUsaSxqLGssbCxtPWZ1bmN0aW9uKGIpe3ZhciBkLGUsZyxoLGk7Zm9yKGQ9MCxlPWIubGVuZ3RoO2Q8ZTtkKyspZz1iW2RdLGg9Zi50eXBlKGcpLGg9PT0iYXJyYXkiP20oZyk6aD09PSJmdW5jdGlvbiImJighYS51bmlxdWV8fCFvLmhhcyhnKSkmJmMucHVzaChnKX0sbj1mdW5jdGlvbihiLGYpe2Y9Znx8W10sZT0hYS5tZW1vcnl8fFtiLGZdLGk9ITAsbD1qfHwwLGo9MCxrPWMubGVuZ3RoO2Zvcig7YyYmbDxrO2wrKylpZihjW2xdLmFwcGx5KGIsZik9PT0hMSYmYS5zdG9wT25GYWxzZSl7ZT0hMDticmVha31pPSExLGMmJihhLm9uY2U/ZT09PSEwP28uZGlzYWJsZSgpOmM9W106ZCYmZC5sZW5ndGgmJihlPWQuc2hpZnQoKSxvLmZpcmVXaXRoKGVbMF0sZVsxXSkpKX0sbz17YWRkOmZ1bmN0aW9uKCl7aWYoYyl7dmFyIGE9Yy5sZW5ndGg7bShhcmd1bWVudHMpLGk/az1jLmxlbmd0aDplJiZlIT09ITAmJihqPWEsbihlWzBdLGVbMV0pKX1yZXR1cm4gdGhpc30scmVtb3ZlOmZ1bmN0aW9uKCl7aWYoYyl7dmFyIGI9YXJndW1lbnRzLGQ9MCxlPWIubGVuZ3RoO2Zvcig7ZDxlO2QrKylmb3IodmFyIGY9MDtmPGMubGVuZ3RoO2YrKylpZihiW2RdPT09Y1tmXSl7aSYmZjw9ayYmKGstLSxmPD1sJiZsLS0pLGMuc3BsaWNlKGYtLSwxKTtpZihhLnVuaXF1ZSlicmVha319cmV0dXJuIHRoaXN9LGhhczpmdW5jdGlvbihhKXtpZihjKXt2YXIgYj0wLGQ9Yy5sZW5ndGg7Zm9yKDtiPGQ7YisrKWlmKGE9PT1jW2JdKXJldHVybiEwfXJldHVybiExfSxlbXB0eTpmdW5jdGlvbigpe2M9W107cmV0dXJuIHRoaXN9LGRpc2FibGU6ZnVuY3Rpb24oKXtjPWQ9ZT1iO3JldHVybiB0aGlzfSxkaXNhYmxlZDpmdW5jdGlvbigpe3JldHVybiFjfSxsb2NrOmZ1bmN0aW9uKCl7ZD1iLCghZXx8ZT09PSEwKSYmby5kaXNhYmxlKCk7cmV0dXJuIHRoaXN9LGxvY2tlZDpmdW5jdGlvbigpe3JldHVybiFkfSxmaXJlV2l0aDpmdW5jdGlvbihiLGMpe2QmJihpP2Eub25jZXx8ZC5wdXNoKFtiLGNdKTooIWEub25jZXx8IWUpJiZuKGIsYykpO3JldHVybiB0aGlzfSxmaXJlOmZ1bmN0aW9uKCl7by5maXJlV2l0aCh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIHRoaXN9LGZpcmVkOmZ1bmN0aW9uKCl7cmV0dXJuISFlfX07cmV0dXJuIG99O3ZhciBpPVtdLnNsaWNlO2YuZXh0ZW5kKHtEZWZlcnJlZDpmdW5jdGlvbihhKXt2YXIgYj1mLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSxjPWYuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLGQ9Zi5DYWxsYmFja3MoIm1lbW9yeSIpLGU9InBlbmRpbmciLGc9e3Jlc29sdmU6YixyZWplY3Q6Yyxub3RpZnk6ZH0saD17ZG9uZTpiLmFkZCxmYWlsOmMuYWRkLHByb2dyZXNzOmQuYWRkLHN0YXRlOmZ1bmN0aW9uKCl7cmV0dXJuIGV9LGlzUmVzb2x2ZWQ6Yi5maXJlZCxpc1JlamVjdGVkOmMuZmlyZWQsdGhlbjpmdW5jdGlvbihhLGIsYyl7aS5kb25lKGEpLmZhaWwoYikucHJvZ3Jlc3MoYyk7cmV0dXJuIHRoaXN9LGFsd2F5czpmdW5jdGlvbigpe2kuZG9uZS5hcHBseShpLGFyZ3VtZW50cykuZmFpbC5hcHBseShpLGFyZ3VtZW50cyk7cmV0dXJuIHRoaXN9LHBpcGU6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBmLkRlZmVycmVkKGZ1bmN0aW9uKGQpe2YuZWFjaCh7ZG9uZTpbYSwicmVzb2x2ZSJdLGZhaWw6W2IsInJlamVjdCJdLHByb2dyZXNzOltjLCJub3RpZnkiXX0sZnVuY3Rpb24oYSxiKXt2YXIgYz1iWzBdLGU9YlsxXSxnO2YuaXNGdW5jdGlvbihjKT9pW2FdKGZ1bmN0aW9uKCl7Zz1jLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxnJiZmLmlzRnVuY3Rpb24oZy5wcm9taXNlKT9nLnByb21pc2UoKS50aGVuKGQucmVzb2x2ZSxkLnJlamVjdCxkLm5vdGlmeSk6ZFtlKyJXaXRoIl0odGhpcz09PWk/ZDp0aGlzLFtnXSl9KTppW2FdKGRbZV0pfSl9KS5wcm9taXNlKCl9LHByb21pc2U6ZnVuY3Rpb24oYSl7aWYoYT09bnVsbClhPWg7ZWxzZSBmb3IodmFyIGIgaW4gaClhW2JdPWhbYl07cmV0dXJuIGF9fSxpPWgucHJvbWlzZSh7fSksajtmb3IoaiBpbiBnKWlbal09Z1tqXS5maXJlLGlbaisiV2l0aCJdPWdbal0uZmlyZVdpdGg7aS5kb25lKGZ1bmN0aW9uKCl7ZT0icmVzb2x2ZWQifSxjLmRpc2FibGUsZC5sb2NrKS5mYWlsKGZ1bmN0aW9uKCl7ZT0icmVqZWN0ZWQifSxiLmRpc2FibGUsZC5sb2NrKSxhJiZhLmNhbGwoaSxpKTtyZXR1cm4gaX0sd2hlbjpmdW5jdGlvbihhKXtmdW5jdGlvbiBtKGEpe3JldHVybiBmdW5jdGlvbihiKXtlW2FdPWFyZ3VtZW50cy5sZW5ndGg+MT9pLmNhbGwoYXJndW1lbnRzLDApOmIsai5ub3RpZnlXaXRoKGssZSl9fWZ1bmN0aW9uIGwoYSl7cmV0dXJuIGZ1bmN0aW9uKGMpe2JbYV09YXJndW1lbnRzLmxlbmd0aD4xP2kuY2FsbChhcmd1bWVudHMsMCk6YywtLWd8fGoucmVzb2x2ZVdpdGgoaixiKX19dmFyIGI9aS5jYWxsKGFyZ3VtZW50cywwKSxjPTAsZD1iLmxlbmd0aCxlPUFycmF5KGQpLGc9ZCxoPWQsaj1kPD0xJiZhJiZmLmlzRnVuY3Rpb24oYS5wcm9taXNlKT9hOmYuRGVmZXJyZWQoKSxrPWoucHJvbWlzZSgpO2lmKGQ+MSl7Zm9yKDtjPGQ7YysrKWJbY10mJmJbY10ucHJvbWlzZSYmZi5pc0Z1bmN0aW9uKGJbY10ucHJvbWlzZSk/YltjXS5wcm9taXNlKCkudGhlbihsKGMpLGoucmVqZWN0LG0oYykpOi0tZztnfHxqLnJlc29sdmVXaXRoKGosYil9ZWxzZSBqIT09YSYmai5yZXNvbHZlV2l0aChqLGQ/W2FdOltdKTtyZXR1cm4ga319KSxmLnN1cHBvcnQ9ZnVuY3Rpb24oKXt2YXIgYixkLGUsZyxoLGksaixrLGwsbSxuLG8scCxxPWMuY3JlYXRlRWxlbWVudCgiZGl2Iikscj1jLmRvY3VtZW50RWxlbWVudDtxLnNldEF0dHJpYnV0ZSgiY2xhc3NOYW1lIiwidCIpLHEuaW5uZXJIVE1MPSIgICA8bGluay8+PHRhYmxlPjwvdGFibGU+PGEgaHJlZj0nL2EnIHN0eWxlPSd0b3A6MXB4O2Zsb2F0OmxlZnQ7b3BhY2l0eTouNTU7Jz5hPC9hPjxpbnB1dCB0eXBlPSdjaGVja2JveCcvPiIsZD1xLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIiksZT1xLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhIilbMF07aWYoIWR8fCFkLmxlbmd0aHx8IWUpcmV0dXJue307Zz1jLmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpLGg9Zy5hcHBlbmRDaGlsZChjLmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpKSxpPXEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0IilbMF0sYj17bGVhZGluZ1doaXRlc3BhY2U6cS5maXJzdENoaWxkLm5vZGVUeXBlPT09Myx0Ym9keTohcS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKS5sZW5ndGgsaHRtbFNlcmlhbGl6ZTohIXEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImxpbmsiKS5sZW5ndGgsc3R5bGU6L3RvcC8udGVzdChlLmdldEF0dHJpYnV0ZSgic3R5bGUiKSksaHJlZk5vcm1hbGl6ZWQ6ZS5nZXRBdHRyaWJ1dGUoImhyZWYiKT09PSIvYSIsb3BhY2l0eTovXjAuNTUvLnRlc3QoZS5zdHlsZS5vcGFjaXR5KSxjc3NGbG9hdDohIWUuc3R5bGUuY3NzRmxvYXQsY2hlY2tPbjppLnZhbHVlPT09Im9uIixvcHRTZWxlY3RlZDpoLnNlbGVjdGVkLGdldFNldEF0dHJpYnV0ZTpxLmNsYXNzTmFtZSE9PSJ0IixlbmN0eXBlOiEhYy5jcmVhdGVFbGVtZW50KCJmb3JtIikuZW5jdHlwZSxodG1sNUNsb25lOmMuY3JlYXRlRWxlbWVudCgibmF2IikuY2xvbmVOb2RlKCEwKS5vdXRlckhUTUwhPT0iPDpuYXY+PC86bmF2PiIsc3VibWl0QnViYmxlczohMCxjaGFuZ2VCdWJibGVzOiEwLGZvY3VzaW5CdWJibGVzOiExLGRlbGV0ZUV4cGFuZG86ITAsbm9DbG9uZUV2ZW50OiEwLGlubGluZUJsb2NrTmVlZHNMYXlvdXQ6ITEsc2hyaW5rV3JhcEJsb2NrczohMSxyZWxpYWJsZU1hcmdpblJpZ2h0OiEwfSxpLmNoZWNrZWQ9ITAsYi5ub0Nsb25lQ2hlY2tlZD1pLmNsb25lTm9kZSghMCkuY2hlY2tlZCxnLmRpc2FibGVkPSEwLGIub3B0RGlzYWJsZWQ9IWguZGlzYWJsZWQ7dHJ5e2RlbGV0ZSBxLnRlc3R9Y2F0Y2gocyl7Yi5kZWxldGVFeHBhbmRvPSExfSFxLmFkZEV2ZW50TGlzdGVuZXImJnEuYXR0YWNoRXZlbnQmJnEuZmlyZUV2ZW50JiYocS5hdHRhY2hFdmVudCgib25jbGljayIsZnVuY3Rpb24oKXtiLm5vQ2xvbmVFdmVudD0hMX0pLHEuY2xvbmVOb2RlKCEwKS5maXJlRXZlbnQoIm9uY2xpY2siKSksaT1jLmNyZWF0ZUVsZW1lbnQoImlucHV0IiksaS52YWx1ZT0idCIsaS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJyYWRpbyIpLGIucmFkaW9WYWx1ZT1pLnZhbHVlPT09InQiLGkuc2V0QXR0cmlidXRlKCJjaGVja2VkIiwiY2hlY2tlZCIpLHEuYXBwZW5kQ2hpbGQoaSksaz1jLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxrLmFwcGVuZENoaWxkKHEubGFzdENoaWxkKSxiLmNoZWNrQ2xvbmU9ay5jbG9uZU5vZGUoITApLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmNoZWNrZWQsYi5hcHBlbmRDaGVja2VkPWkuY2hlY2tlZCxrLnJlbW92ZUNoaWxkKGkpLGsuYXBwZW5kQ2hpbGQocSkscS5pbm5lckhUTUw9IiIsYS5nZXRDb21wdXRlZFN0eWxlJiYoaj1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGouc3R5bGUud2lkdGg9IjAiLGouc3R5bGUubWFyZ2luUmlnaHQ9IjAiLHEuc3R5bGUud2lkdGg9IjJweCIscS5hcHBlbmRDaGlsZChqKSxiLnJlbGlhYmxlTWFyZ2luUmlnaHQ9KHBhcnNlSW50KChhLmdldENvbXB1dGVkU3R5bGUoaixudWxsKXx8e21hcmdpblJpZ2h0OjB9KS5tYXJnaW5SaWdodCwxMCl8fDApPT09MCk7aWYocS5hdHRhY2hFdmVudClmb3IobyBpbntzdWJtaXQ6MSxjaGFuZ2U6MSxmb2N1c2luOjF9KW49Im9uIitvLHA9biBpbiBxLHB8fChxLnNldEF0dHJpYnV0ZShuLCJyZXR1cm47IikscD10eXBlb2YgcVtuXT09ImZ1bmN0aW9uIiksYltvKyJCdWJibGVzIl09cDtrLnJlbW92ZUNoaWxkKHEpLGs9Zz1oPWo9cT1pPW51bGwsZihmdW5jdGlvbigpe3ZhciBhLGQsZSxnLGgsaSxqLGssbSxuLG8scj1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF07IXJ8fChqPTEsaz0icG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO3dpZHRoOjFweDtoZWlnaHQ6MXB4O21hcmdpbjowOyIsbT0idmlzaWJpbGl0eTpoaWRkZW47Ym9yZGVyOjA7IixuPSJzdHlsZT0nIitrKyJib3JkZXI6NXB4IHNvbGlkICMwMDA7cGFkZGluZzowOyciLG89IjxkaXYgIituKyI+PGRpdj48L2Rpdj48L2Rpdj4iKyI8dGFibGUgIituKyIgY2VsbHBhZGRpbmc9JzAnIGNlbGxzcGFjaW5nPScwJz4iKyI8dHI+PHRkPjwvdGQ+PC90cj48L3RhYmxlPiIsYT1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGEuc3R5bGUuY3NzVGV4dD1tKyJ3aWR0aDowO2hlaWdodDowO3Bvc2l0aW9uOnN0YXRpYzt0b3A6MDttYXJnaW4tdG9wOiIraisicHgiLHIuaW5zZXJ0QmVmb3JlKGEsci5maXJzdENoaWxkKSxxPWMuY3JlYXRlRWxlbWVudCgiZGl2IiksYS5hcHBlbmRDaGlsZChxKSxxLmlubmVySFRNTD0iPHRhYmxlPjx0cj48dGQgc3R5bGU9J3BhZGRpbmc6MDtib3JkZXI6MDtkaXNwbGF5Om5vbmUnPjwvdGQ+PHRkPnQ8L3RkPjwvdHI+PC90YWJsZT4iLGw9cS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGQiKSxwPWxbMF0ub2Zmc2V0SGVpZ2h0PT09MCxsWzBdLnN0eWxlLmRpc3BsYXk9IiIsbFsxXS5zdHlsZS5kaXNwbGF5PSJub25lIixiLnJlbGlhYmxlSGlkZGVuT2Zmc2V0cz1wJiZsWzBdLm9mZnNldEhlaWdodD09PTAscS5pbm5lckhUTUw9IiIscS5zdHlsZS53aWR0aD1xLnN0eWxlLnBhZGRpbmdMZWZ0PSIxcHgiLGYuYm94TW9kZWw9Yi5ib3hNb2RlbD1xLm9mZnNldFdpZHRoPT09Mix0eXBlb2YgcS5zdHlsZS56b29tIT0idW5kZWZpbmVkIiYmKHEuc3R5bGUuZGlzcGxheT0iaW5saW5lIixxLnN0eWxlLnpvb209MSxiLmlubGluZUJsb2NrTmVlZHNMYXlvdXQ9cS5vZmZzZXRXaWR0aD09PTIscS5zdHlsZS5kaXNwbGF5PSIiLHEuaW5uZXJIVE1MPSI8ZGl2IHN0eWxlPSd3aWR0aDo0cHg7Jz48L2Rpdj4iLGIuc2hyaW5rV3JhcEJsb2Nrcz1xLm9mZnNldFdpZHRoIT09MikscS5zdHlsZS5jc3NUZXh0PWsrbSxxLmlubmVySFRNTD1vLGQ9cS5maXJzdENoaWxkLGU9ZC5maXJzdENoaWxkLGg9ZC5uZXh0U2libGluZy5maXJzdENoaWxkLmZpcnN0Q2hpbGQsaT17ZG9lc05vdEFkZEJvcmRlcjplLm9mZnNldFRvcCE9PTUsZG9lc0FkZEJvcmRlckZvclRhYmxlQW5kQ2VsbHM6aC5vZmZzZXRUb3A9PT01fSxlLnN0eWxlLnBvc2l0aW9uPSJmaXhlZCIsZS5zdHlsZS50b3A9IjIwcHgiLGkuZml4ZWRQb3NpdGlvbj1lLm9mZnNldFRvcD09PTIwfHxlLm9mZnNldFRvcD09PTE1LGUuc3R5bGUucG9zaXRpb249ZS5zdHlsZS50b3A9IiIsZC5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIixkLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsaS5zdWJ0cmFjdHNCb3JkZXJGb3JPdmVyZmxvd05vdFZpc2libGU9ZS5vZmZzZXRUb3A9PT0tNSxpLmRvZXNOb3RJbmNsdWRlTWFyZ2luSW5Cb2R5T2Zmc2V0PXIub2Zmc2V0VG9wIT09aixyLnJlbW92ZUNoaWxkKGEpLHE9YT1udWxsLGYuZXh0ZW5kKGIsaSkpfSk7cmV0dXJuIGJ9KCk7dmFyIGo9L14oPzpcey4qXH18XFsuKlxdKSQvLGs9LyhbQS1aXSkvZztmLmV4dGVuZCh7Y2FjaGU6e30sdXVpZDowLGV4cGFuZG86ImpRdWVyeSIrKGYuZm4uanF1ZXJ5K01hdGgucmFuZG9tKCkpLnJlcGxhY2UoL1xEL2csIiIpLG5vRGF0YTp7ZW1iZWQ6ITAsb2JqZWN0OiJjbHNpZDpEMjdDREI2RS1BRTZELTExY2YtOTZCOC00NDQ1NTM1NDAwMDAiLGFwcGxldDohMH0saGFzRGF0YTpmdW5jdGlvbihhKXthPWEubm9kZVR5cGU/Zi5jYWNoZVthW2YuZXhwYW5kb11dOmFbZi5leHBhbmRvXTtyZXR1cm4hIWEmJiFtKGEpfSxkYXRhOmZ1bmN0aW9uKGEsYyxkLGUpe2lmKCEhZi5hY2NlcHREYXRhKGEpKXt2YXIgZyxoLGksaj1mLmV4cGFuZG8saz10eXBlb2YgYz09InN0cmluZyIsbD1hLm5vZGVUeXBlLG09bD9mLmNhY2hlOmEsbj1sP2Fbal06YVtqXSYmaixvPWM9PT0iZXZlbnRzIjtpZigoIW58fCFtW25dfHwhbyYmIWUmJiFtW25dLmRhdGEpJiZrJiZkPT09YilyZXR1cm47bnx8KGw/YVtqXT1uPSsrZi51dWlkOm49aiksbVtuXXx8KG1bbl09e30sbHx8KG1bbl0udG9KU09OPWYubm9vcCkpO2lmKHR5cGVvZiBjPT0ib2JqZWN0Inx8dHlwZW9mIGM9PSJmdW5jdGlvbiIpZT9tW25dPWYuZXh0ZW5kKG1bbl0sYyk6bVtuXS5kYXRhPWYuZXh0ZW5kKG1bbl0uZGF0YSxjKTtnPWg9bVtuXSxlfHwoaC5kYXRhfHwoaC5kYXRhPXt9KSxoPWguZGF0YSksZCE9PWImJihoW2YuY2FtZWxDYXNlKGMpXT1kKTtpZihvJiYhaFtjXSlyZXR1cm4gZy5ldmVudHM7az8oaT1oW2NdLGk9PW51bGwmJihpPWhbZi5jYW1lbENhc2UoYyldKSk6aT1oO3JldHVybiBpfX0scmVtb3ZlRGF0YTpmdW5jdGlvbihhLGIsYyl7aWYoISFmLmFjY2VwdERhdGEoYSkpe3ZhciBkLGUsZyxoPWYuZXhwYW5kbyxpPWEubm9kZVR5cGUsaj1pP2YuY2FjaGU6YSxrPWk/YVtoXTpoO2lmKCFqW2tdKXJldHVybjtpZihiKXtkPWM/altrXTpqW2tdLmRhdGE7aWYoZCl7Zi5pc0FycmF5KGIpfHwoYiBpbiBkP2I9W2JdOihiPWYuY2FtZWxDYXNlKGIpLGIgaW4gZD9iPVtiXTpiPWIuc3BsaXQoIiAiKSkpO2ZvcihlPTAsZz1iLmxlbmd0aDtlPGc7ZSsrKWRlbGV0ZSBkW2JbZV1dO2lmKCEoYz9tOmYuaXNFbXB0eU9iamVjdCkoZCkpcmV0dXJufX1pZighYyl7ZGVsZXRlIGpba10uZGF0YTtpZighbShqW2tdKSlyZXR1cm59Zi5zdXBwb3J0LmRlbGV0ZUV4cGFuZG98fCFqLnNldEludGVydmFsP2RlbGV0ZSBqW2tdOmpba109bnVsbCxpJiYoZi5zdXBwb3J0LmRlbGV0ZUV4cGFuZG8/ZGVsZXRlIGFbaF06YS5yZW1vdmVBdHRyaWJ1dGU/YS5yZW1vdmVBdHRyaWJ1dGUoaCk6YVtoXT1udWxsKX19LF9kYXRhOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gZi5kYXRhKGEsYixjLCEwKX0sYWNjZXB0RGF0YTpmdW5jdGlvbihhKXtpZihhLm5vZGVOYW1lKXt2YXIgYj1mLm5vRGF0YVthLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldO2lmKGIpcmV0dXJuIGIhPT0hMCYmYS5nZXRBdHRyaWJ1dGUoImNsYXNzaWQiKT09PWJ9cmV0dXJuITB9fSksZi5mbi5leHRlbmQoe2RhdGE6ZnVuY3Rpb24oYSxjKXt2YXIgZCxlLGcsaD1udWxsO2lmKHR5cGVvZiBhPT0idW5kZWZpbmVkIil7aWYodGhpcy5sZW5ndGgpe2g9Zi5kYXRhKHRoaXNbMF0pO2lmKHRoaXNbMF0ubm9kZVR5cGU9PT0xJiYhZi5fZGF0YSh0aGlzWzBdLCJwYXJzZWRBdHRycyIpKXtlPXRoaXNbMF0uYXR0cmlidXRlcztmb3IodmFyIGk9MCxqPWUubGVuZ3RoO2k8ajtpKyspZz1lW2ldLm5hbWUsZy5pbmRleE9mKCJkYXRhLSIpPT09MCYmKGc9Zi5jYW1lbENhc2UoZy5zdWJzdHJpbmcoNSkpLGwodGhpc1swXSxnLGhbZ10pKTtmLl9kYXRhKHRoaXNbMF0sInBhcnNlZEF0dHJzIiwhMCl9fXJldHVybiBofWlmKHR5cGVvZiBhPT0ib2JqZWN0IilyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zi5kYXRhKHRoaXMsYSl9KTtkPWEuc3BsaXQoIi4iKSxkWzFdPWRbMV0/Ii4iK2RbMV06IiI7aWYoYz09PWIpe2g9dGhpcy50cmlnZ2VySGFuZGxlcigiZ2V0RGF0YSIrZFsxXSsiISIsW2RbMF1dKSxoPT09YiYmdGhpcy5sZW5ndGgmJihoPWYuZGF0YSh0aGlzWzBdLGEpLGg9bCh0aGlzWzBdLGEsaCkpO3JldHVybiBoPT09YiYmZFsxXT90aGlzLmRhdGEoZFswXSk6aH1yZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9Zih0aGlzKSxlPVtkWzBdLGNdO2IudHJpZ2dlckhhbmRsZXIoInNldERhdGEiK2RbMV0rIiEiLGUpLGYuZGF0YSh0aGlzLGEsYyksYi50cmlnZ2VySGFuZGxlcigiY2hhbmdlRGF0YSIrZFsxXSsiISIsZSl9KX0scmVtb3ZlRGF0YTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zi5yZW1vdmVEYXRhKHRoaXMsYSl9KX19KSxmLmV4dGVuZCh7X21hcms6ZnVuY3Rpb24oYSxiKXthJiYoYj0oYnx8ImZ4IikrIm1hcmsiLGYuX2RhdGEoYSxiLChmLl9kYXRhKGEsYil8fDApKzEpKX0sX3VubWFyazpmdW5jdGlvbihhLGIsYyl7YSE9PSEwJiYoYz1iLGI9YSxhPSExKTtpZihiKXtjPWN8fCJmeCI7dmFyIGQ9YysibWFyayIsZT1hPzA6KGYuX2RhdGEoYixkKXx8MSktMTtlP2YuX2RhdGEoYixkLGUpOihmLnJlbW92ZURhdGEoYixkLCEwKSxuKGIsYywibWFyayIpKX19LHF1ZXVlOmZ1bmN0aW9uKGEsYixjKXt2YXIgZDtpZihhKXtiPShifHwiZngiKSsicXVldWUiLGQ9Zi5fZGF0YShhLGIpLGMmJighZHx8Zi5pc0FycmF5KGMpP2Q9Zi5fZGF0YShhLGIsZi5tYWtlQXJyYXkoYykpOmQucHVzaChjKSk7cmV0dXJuIGR8fFtdfX0sZGVxdWV1ZTpmdW5jdGlvbihhLGIpe2I9Ynx8ImZ4Ijt2YXIgYz1mLnF1ZXVlKGEsYiksZD1jLnNoaWZ0KCksZT17fTtkPT09ImlucHJvZ3Jlc3MiJiYoZD1jLnNoaWZ0KCkpLGQmJihiPT09ImZ4IiYmYy51bnNoaWZ0KCJpbnByb2dyZXNzIiksZi5fZGF0YShhLGIrIi5ydW4iLGUpLGQuY2FsbChhLGZ1bmN0aW9uKCl7Zi5kZXF1ZXVlKGEsYil9LGUpKSxjLmxlbmd0aHx8KGYucmVtb3ZlRGF0YShhLGIrInF1ZXVlICIrYisiLnJ1biIsITApLG4oYSxiLCJxdWV1ZSIpKX19KSxmLmZuLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24oYSxjKXt0eXBlb2YgYSE9InN0cmluZyImJihjPWEsYT0iZngiKTtpZihjPT09YilyZXR1cm4gZi5xdWV1ZSh0aGlzWzBdLGEpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYj1mLnF1ZXVlKHRoaXMsYSxjKTthPT09ImZ4IiYmYlswXSE9PSJpbnByb2dyZXNzIiYmZi5kZXF1ZXVlKHRoaXMsYSl9KX0sZGVxdWV1ZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zi5kZXF1ZXVlKHRoaXMsYSl9KX0sZGVsYXk6ZnVuY3Rpb24oYSxiKXthPWYuZng/Zi5meC5zcGVlZHNbYV18fGE6YSxiPWJ8fCJmeCI7cmV0dXJuIHRoaXMucXVldWUoYixmdW5jdGlvbihiLGMpe3ZhciBkPXNldFRpbWVvdXQoYixhKTtjLnN0b3A9ZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQoZCl9fSl9LGNsZWFyUXVldWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucXVldWUoYXx8ImZ4IixbXSl9LHByb21pc2U6ZnVuY3Rpb24oYSxjKXtmdW5jdGlvbiBtKCl7LS1ofHxkLnJlc29sdmVXaXRoKGUsW2VdKX10eXBlb2YgYSE9InN0cmluZyImJihjPWEsYT1iKSxhPWF8fCJmeCI7dmFyIGQ9Zi5EZWZlcnJlZCgpLGU9dGhpcyxnPWUubGVuZ3RoLGg9MSxpPWErImRlZmVyIixqPWErInF1ZXVlIixrPWErIm1hcmsiLGw7d2hpbGUoZy0tKWlmKGw9Zi5kYXRhKGVbZ10saSxiLCEwKXx8KGYuZGF0YShlW2ddLGosYiwhMCl8fGYuZGF0YShlW2ddLGssYiwhMCkpJiZmLmRhdGEoZVtnXSxpLGYuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLCEwKSloKyssbC5hZGQobSk7bSgpO3JldHVybiBkLnByb21pc2UoKX19KTt2YXIgbz0vW1xuXHRccl0vZyxwPS9ccysvLHE9L1xyL2cscj0vXig/OmJ1dHRvbnxpbnB1dCkkL2kscz0vXig/OmJ1dHRvbnxpbnB1dHxvYmplY3R8c2VsZWN0fHRleHRhcmVhKSQvaSx0PS9eYSg/OnJlYSk/JC9pLHU9L14oPzphdXRvZm9jdXN8YXV0b3BsYXl8YXN5bmN8Y2hlY2tlZHxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZHxzZWxlY3RlZCkkL2ksdj1mLnN1cHBvcnQuZ2V0U2V0QXR0cmlidXRlLHcseCx5O2YuZm4uZXh0ZW5kKHthdHRyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGYuYWNjZXNzKHRoaXMsYSxiLCEwLGYuYXR0cil9LHJlbW92ZUF0dHI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2YucmVtb3ZlQXR0cih0aGlzLGEpfSl9LHByb3A6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZi5hY2Nlc3ModGhpcyxhLGIsITAsZi5wcm9wKX0scmVtb3ZlUHJvcDpmdW5jdGlvbihhKXthPWYucHJvcEZpeFthXXx8YTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dHJ5e3RoaXNbYV09YixkZWxldGUgdGhpc1thXX1jYXRjaChjKXt9fSl9LGFkZENsYXNzOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlLGcsaCxpO2lmKGYuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe2YodGhpcykuYWRkQ2xhc3MoYS5jYWxsKHRoaXMsYix0aGlzLmNsYXNzTmFtZSkpfSk7aWYoYSYmdHlwZW9mIGE9PSJzdHJpbmciKXtiPWEuc3BsaXQocCk7Zm9yKGM9MCxkPXRoaXMubGVuZ3RoO2M8ZDtjKyspe2U9dGhpc1tjXTtpZihlLm5vZGVUeXBlPT09MSlpZighZS5jbGFzc05hbWUmJmIubGVuZ3RoPT09MSllLmNsYXNzTmFtZT1hO2Vsc2V7Zz0iICIrZS5jbGFzc05hbWUrIiAiO2ZvcihoPTAsaT1iLmxlbmd0aDtoPGk7aCsrKX5nLmluZGV4T2YoIiAiK2JbaF0rIiAiKXx8KGcrPWJbaF0rIiAiKTtlLmNsYXNzTmFtZT1mLnRyaW0oZyl9fX1yZXR1cm4gdGhpc30scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24oYSl7dmFyIGMsZCxlLGcsaCxpLGo7aWYoZi5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7Zih0aGlzKS5yZW1vdmVDbGFzcyhhLmNhbGwodGhpcyxiLHRoaXMuY2xhc3NOYW1lKSl9KTtpZihhJiZ0eXBlb2YgYT09InN0cmluZyJ8fGE9PT1iKXtjPShhfHwiIikuc3BsaXQocCk7Zm9yKGQ9MCxlPXRoaXMubGVuZ3RoO2Q8ZTtkKyspe2c9dGhpc1tkXTtpZihnLm5vZGVUeXBlPT09MSYmZy5jbGFzc05hbWUpaWYoYSl7aD0oIiAiK2cuY2xhc3NOYW1lKyIgIikucmVwbGFjZShvLCIgIik7Zm9yKGk9MCxqPWMubGVuZ3RoO2k8ajtpKyspaD1oLnJlcGxhY2UoIiAiK2NbaV0rIiAiLCIgIik7Zy5jbGFzc05hbWU9Zi50cmltKGgpfWVsc2UgZy5jbGFzc05hbWU9IiJ9fXJldHVybiB0aGlzfSx0b2dnbGVDbGFzczpmdW5jdGlvbihhLGIpe3ZhciBjPXR5cGVvZiBhLGQ9dHlwZW9mIGI9PSJib29sZWFuIjtpZihmLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihjKXtmKHRoaXMpLnRvZ2dsZUNsYXNzKGEuY2FsbCh0aGlzLGMsdGhpcy5jbGFzc05hbWUsYiksYil9KTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7aWYoYz09PSJzdHJpbmciKXt2YXIgZSxnPTAsaD1mKHRoaXMpLGk9YixqPWEuc3BsaXQocCk7d2hpbGUoZT1qW2crK10paT1kP2k6IWguaGFzQ2xhc3MoZSksaFtpPyJhZGRDbGFzcyI6InJlbW92ZUNsYXNzIl0oZSl9ZWxzZSBpZihjPT09InVuZGVmaW5lZCJ8fGM9PT0iYm9vbGVhbiIpdGhpcy5jbGFzc05hbWUmJmYuX2RhdGEodGhpcywiX19jbGFzc05hbWVfXyIsdGhpcy5jbGFzc05hbWUpLHRoaXMuY2xhc3NOYW1lPXRoaXMuY2xhc3NOYW1lfHxhPT09ITE/IiI6Zi5fZGF0YSh0aGlzLCJfX2NsYXNzTmFtZV9fIil8fCIifSl9LGhhc0NsYXNzOmZ1bmN0aW9uKGEpe3ZhciBiPSIgIithKyIgIixjPTAsZD10aGlzLmxlbmd0aDtmb3IoO2M8ZDtjKyspaWYodGhpc1tjXS5ub2RlVHlwZT09PTEmJigiICIrdGhpc1tjXS5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKG8sIiAiKS5pbmRleE9mKGIpPi0xKXJldHVybiEwO3JldHVybiExfSx2YWw6ZnVuY3Rpb24oYSl7dmFyIGMsZCxlLGc9dGhpc1swXTt7aWYoISFhcmd1bWVudHMubGVuZ3RoKXtlPWYuaXNGdW5jdGlvbihhKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGQpe3ZhciBnPWYodGhpcyksaDtpZih0aGlzLm5vZGVUeXBlPT09MSl7ZT9oPWEuY2FsbCh0aGlzLGQsZy52YWwoKSk6aD1hLGg9PW51bGw/aD0iIjp0eXBlb2YgaD09Im51bWJlciI/aCs9IiI6Zi5pc0FycmF5KGgpJiYoaD1mLm1hcChoLGZ1bmN0aW9uKGEpe3JldHVybiBhPT1udWxsPyIiOmErIiJ9KSksYz1mLnZhbEhvb2tzW3RoaXMubm9kZU5hbWUudG9Mb3dlckNhc2UoKV18fGYudmFsSG9va3NbdGhpcy50eXBlXTtpZighY3x8ISgic2V0ImluIGMpfHxjLnNldCh0aGlzLGgsInZhbHVlIik9PT1iKXRoaXMudmFsdWU9aH19KX1pZihnKXtjPWYudmFsSG9va3NbZy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXXx8Zi52YWxIb29rc1tnLnR5cGVdO2lmKGMmJiJnZXQiaW4gYyYmKGQ9Yy5nZXQoZywidmFsdWUiKSkhPT1iKXJldHVybiBkO2Q9Zy52YWx1ZTtyZXR1cm4gdHlwZW9mIGQ9PSJzdHJpbmciP2QucmVwbGFjZShxLCIiKTpkPT1udWxsPyIiOmR9fX19KSxmLmV4dGVuZCh7dmFsSG9va3M6e29wdGlvbjp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBiPWEuYXR0cmlidXRlcy52YWx1ZTtyZXR1cm4hYnx8Yi5zcGVjaWZpZWQ/YS52YWx1ZTphLnRleHR9fSxzZWxlY3Q6e2dldDpmdW5jdGlvbihhKXt2YXIgYixjLGQsZSxnPWEuc2VsZWN0ZWRJbmRleCxoPVtdLGk9YS5vcHRpb25zLGo9YS50eXBlPT09InNlbGVjdC1vbmUiO2lmKGc8MClyZXR1cm4gbnVsbDtjPWo/ZzowLGQ9aj9nKzE6aS5sZW5ndGg7Zm9yKDtjPGQ7YysrKXtlPWlbY107aWYoZS5zZWxlY3RlZCYmKGYuc3VwcG9ydC5vcHREaXNhYmxlZD8hZS5kaXNhYmxlZDplLmdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKT09PW51bGwpJiYoIWUucGFyZW50Tm9kZS5kaXNhYmxlZHx8IWYubm9kZU5hbWUoZS5wYXJlbnROb2RlLCJvcHRncm91cCIpKSl7Yj1mKGUpLnZhbCgpO2lmKGopcmV0dXJuIGI7aC5wdXNoKGIpfX1pZihqJiYhaC5sZW5ndGgmJmkubGVuZ3RoKXJldHVybiBmKGlbZ10pLnZhbCgpO3JldHVybiBofSxzZXQ6ZnVuY3Rpb24oYSxiKXt2YXIgYz1mLm1ha2VBcnJheShiKTtmKGEpLmZpbmQoIm9wdGlvbiIpLmVhY2goZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGVkPWYuaW5BcnJheShmKHRoaXMpLnZhbCgpLGMpPj0wfSksYy5sZW5ndGh8fChhLnNlbGVjdGVkSW5kZXg9LTEpO3JldHVybiBjfX19LGF0dHJGbjp7dmFsOiEwLGNzczohMCxodG1sOiEwLHRleHQ6ITAsZGF0YTohMCx3aWR0aDohMCxoZWlnaHQ6ITAsb2Zmc2V0OiEwfSxhdHRyOmZ1bmN0aW9uKGEsYyxkLGUpe3ZhciBnLGgsaSxqPWEubm9kZVR5cGU7aWYoISFhJiZqIT09MyYmaiE9PTgmJmohPT0yKXtpZihlJiZjIGluIGYuYXR0ckZuKXJldHVybiBmKGEpW2NdKGQpO2lmKHR5cGVvZiBhLmdldEF0dHJpYnV0ZT09InVuZGVmaW5lZCIpcmV0dXJuIGYucHJvcChhLGMsZCk7aT1qIT09MXx8IWYuaXNYTUxEb2MoYSksaSYmKGM9Yy50b0xvd2VyQ2FzZSgpLGg9Zi5hdHRySG9va3NbY118fCh1LnRlc3QoYyk/eDp3KSk7aWYoZCE9PWIpe2lmKGQ9PT1udWxsKXtmLnJlbW92ZUF0dHIoYSxjKTtyZXR1cm59aWYoaCYmInNldCJpbiBoJiZpJiYoZz1oLnNldChhLGQsYykpIT09YilyZXR1cm4gZzthLnNldEF0dHJpYnV0ZShjLCIiK2QpO3JldHVybiBkfWlmKGgmJiJnZXQiaW4gaCYmaSYmKGc9aC5nZXQoYSxjKSkhPT1udWxsKXJldHVybiBnO2c9YS5nZXRBdHRyaWJ1dGUoYyk7cmV0dXJuIGc9PT1udWxsP2I6Z319LHJlbW92ZUF0dHI6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGUsZyxoPTA7aWYoYiYmYS5ub2RlVHlwZT09PTEpe2Q9Yi50b0xvd2VyQ2FzZSgpLnNwbGl0KHApLGc9ZC5sZW5ndGg7Zm9yKDtoPGc7aCsrKWU9ZFtoXSxlJiYoYz1mLnByb3BGaXhbZV18fGUsZi5hdHRyKGEsZSwiIiksYS5yZW1vdmVBdHRyaWJ1dGUodj9lOmMpLHUudGVzdChlKSYmYyBpbiBhJiYoYVtjXT0hMSkpfX0sYXR0ckhvb2tzOnt0eXBlOntzZXQ6ZnVuY3Rpb24oYSxiKXtpZihyLnRlc3QoYS5ub2RlTmFtZSkmJmEucGFyZW50Tm9kZSlmLmVycm9yKCJ0eXBlIHByb3BlcnR5IGNhbid0IGJlIGNoYW5nZWQiKTtlbHNlIGlmKCFmLnN1cHBvcnQucmFkaW9WYWx1ZSYmYj09PSJyYWRpbyImJmYubm9kZU5hbWUoYSwiaW5wdXQiKSl7dmFyIGM9YS52YWx1ZTthLnNldEF0dHJpYnV0ZSgidHlwZSIsYiksYyYmKGEudmFsdWU9Yyk7cmV0dXJuIGJ9fX0sdmFsdWU6e2dldDpmdW5jdGlvbihhLGIpe2lmKHcmJmYubm9kZU5hbWUoYSwiYnV0dG9uIikpcmV0dXJuIHcuZ2V0KGEsYik7cmV0dXJuIGIgaW4gYT9hLnZhbHVlOm51bGx9LHNldDpmdW5jdGlvbihhLGIsYyl7aWYodyYmZi5ub2RlTmFtZShhLCJidXR0b24iKSlyZXR1cm4gdy5zZXQoYSxiLGMpO2EudmFsdWU9Yn19fSxwcm9wRml4Ont0YWJpbmRleDoidGFiSW5kZXgiLHJlYWRvbmx5OiJyZWFkT25seSIsImZvciI6Imh0bWxGb3IiLCJjbGFzcyI6ImNsYXNzTmFtZSIsbWF4bGVuZ3RoOiJtYXhMZW5ndGgiLGNlbGxzcGFjaW5nOiJjZWxsU3BhY2luZyIsY2VsbHBhZGRpbmc6ImNlbGxQYWRkaW5nIixyb3dzcGFuOiJyb3dTcGFuIixjb2xzcGFuOiJjb2xTcGFuIix1c2VtYXA6InVzZU1hcCIsZnJhbWVib3JkZXI6ImZyYW1lQm9yZGVyIixjb250ZW50ZWRpdGFibGU6ImNvbnRlbnRFZGl0YWJsZSJ9LHByb3A6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlLGcsaCxpPWEubm9kZVR5cGU7aWYoISFhJiZpIT09MyYmaSE9PTgmJmkhPT0yKXtoPWkhPT0xfHwhZi5pc1hNTERvYyhhKSxoJiYoYz1mLnByb3BGaXhbY118fGMsZz1mLnByb3BIb29rc1tjXSk7cmV0dXJuIGQhPT1iP2cmJiJzZXQiaW4gZyYmKGU9Zy5zZXQoYSxkLGMpKSE9PWI/ZTphW2NdPWQ6ZyYmImdldCJpbiBnJiYoZT1nLmdldChhLGMpKSE9PW51bGw/ZTphW2NdfX0scHJvcEhvb2tzOnt0YWJJbmRleDp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBjPWEuZ2V0QXR0cmlidXRlTm9kZSgidGFiaW5kZXgiKTtyZXR1cm4gYyYmYy5zcGVjaWZpZWQ/cGFyc2VJbnQoYy52YWx1ZSwxMCk6cy50ZXN0KGEubm9kZU5hbWUpfHx0LnRlc3QoYS5ub2RlTmFtZSkmJmEuaHJlZj8wOmJ9fX19KSxmLmF0dHJIb29rcy50YWJpbmRleD1mLnByb3BIb29rcy50YWJJbmRleCx4PXtnZXQ6ZnVuY3Rpb24oYSxjKXt2YXIgZCxlPWYucHJvcChhLGMpO3JldHVybiBlPT09ITB8fHR5cGVvZiBlIT0iYm9vbGVhbiImJihkPWEuZ2V0QXR0cmlidXRlTm9kZShjKSkmJmQubm9kZVZhbHVlIT09ITE/Yy50b0xvd2VyQ2FzZSgpOmJ9LHNldDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ7Yj09PSExP2YucmVtb3ZlQXR0cihhLGMpOihkPWYucHJvcEZpeFtjXXx8YyxkIGluIGEmJihhW2RdPSEwKSxhLnNldEF0dHJpYnV0ZShjLGMudG9Mb3dlckNhc2UoKSkpO3JldHVybiBjfX0sdnx8KHk9e25hbWU6ITAsaWQ6ITB9LHc9Zi52YWxIb29rcy5idXR0b249e2dldDpmdW5jdGlvbihhLGMpe3ZhciBkO2Q9YS5nZXRBdHRyaWJ1dGVOb2RlKGMpO3JldHVybiBkJiYoeVtjXT9kLm5vZGVWYWx1ZSE9PSIiOmQuc3BlY2lmaWVkKT9kLm5vZGVWYWx1ZTpifSxzZXQ6ZnVuY3Rpb24oYSxiLGQpe3ZhciBlPWEuZ2V0QXR0cmlidXRlTm9kZShkKTtlfHwoZT1jLmNyZWF0ZUF0dHJpYnV0ZShkKSxhLnNldEF0dHJpYnV0ZU5vZGUoZSkpO3JldHVybiBlLm5vZGVWYWx1ZT1iKyIifX0sZi5hdHRySG9va3MudGFiaW5kZXguc2V0PXcuc2V0LGYuZWFjaChbIndpZHRoIiwiaGVpZ2h0Il0sZnVuY3Rpb24oYSxiKXtmLmF0dHJIb29rc1tiXT1mLmV4dGVuZChmLmF0dHJIb29rc1tiXSx7c2V0OmZ1bmN0aW9uKGEsYyl7aWYoYz09PSIiKXthLnNldEF0dHJpYnV0ZShiLCJhdXRvIik7cmV0dXJuIGN9fX0pfSksZi5hdHRySG9va3MuY29udGVudGVkaXRhYmxlPXtnZXQ6dy5nZXQsc2V0OmZ1bmN0aW9uKGEsYixjKXtiPT09IiImJihiPSJmYWxzZSIpLHcuc2V0KGEsYixjKX19KSxmLnN1cHBvcnQuaHJlZk5vcm1hbGl6ZWR8fGYuZWFjaChbImhyZWYiLCJzcmMiLCJ3aWR0aCIsImhlaWdodCJdLGZ1bmN0aW9uKGEsYyl7Zi5hdHRySG9va3NbY109Zi5leHRlbmQoZi5hdHRySG9va3NbY10se2dldDpmdW5jdGlvbihhKXt2YXIgZD1hLmdldEF0dHJpYnV0ZShjLDIpO3JldHVybiBkPT09bnVsbD9iOmR9fSl9KSxmLnN1cHBvcnQuc3R5bGV8fChmLmF0dHJIb29rcy5zdHlsZT17Z2V0OmZ1bmN0aW9uKGEpe3JldHVybiBhLnN0eWxlLmNzc1RleHQudG9Mb3dlckNhc2UoKXx8Yn0sc2V0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuc3R5bGUuY3NzVGV4dD0iIitifX0pLGYuc3VwcG9ydC5vcHRTZWxlY3RlZHx8KGYucHJvcEhvb2tzLnNlbGVjdGVkPWYuZXh0ZW5kKGYucHJvcEhvb2tzLnNlbGVjdGVkLHtnZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5wYXJlbnROb2RlO2ImJihiLnNlbGVjdGVkSW5kZXgsYi5wYXJlbnROb2RlJiZiLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCk7cmV0dXJuIG51bGx9fSkpLGYuc3VwcG9ydC5lbmN0eXBlfHwoZi5wcm9wRml4LmVuY3R5cGU9ImVuY29kaW5nIiksZi5zdXBwb3J0LmNoZWNrT258fGYuZWFjaChbInJhZGlvIiwiY2hlY2tib3giXSxmdW5jdGlvbigpe2YudmFsSG9va3NbdGhpc109e2dldDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInZhbHVlIik9PT1udWxsPyJvbiI6YS52YWx1ZX19fSksZi5lYWNoKFsicmFkaW8iLCJjaGVja2JveCJdLGZ1bmN0aW9uKCl7Zi52YWxIb29rc1t0aGlzXT1mLmV4dGVuZChmLnZhbEhvb2tzW3RoaXNdLHtzZXQ6ZnVuY3Rpb24oYSxiKXtpZihmLmlzQXJyYXkoYikpcmV0dXJuIGEuY2hlY2tlZD1mLmluQXJyYXkoZihhKS52YWwoKSxiKT49MH19KX0pO3ZhciB6PS9eKD86dGV4dGFyZWF8aW5wdXR8c2VsZWN0KSQvaSxBPS9eKFteXC5dKik/KD86XC4oLispKT8kLyxCPS9cYmhvdmVyKFwuXFMrKT9cYi8sQz0vXmtleS8sRD0vXig/Om1vdXNlfGNvbnRleHRtZW51KXxjbGljay8sRT0vXig/OmZvY3VzaW5mb2N1c3xmb2N1c291dGJsdXIpJC8sRj0vXihcdyopKD86IyhbXHdcLV0rKSk/KD86XC4oW1x3XC1dKykpPyQvLEc9ZnVuY3Rpb24oYSl7dmFyIGI9Ri5leGVjKGEpO2ImJihiWzFdPShiWzFdfHwiIikudG9Mb3dlckNhc2UoKSxiWzNdPWJbM10mJm5ldyBSZWdFeHAoIig/Ol58XFxzKSIrYlszXSsiKD86XFxzfCQpIikpO3JldHVybiBifSxIPWZ1bmN0aW9uKGEsYil7dmFyIGM9YS5hdHRyaWJ1dGVzfHx7fTtyZXR1cm4oIWJbMV18fGEubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWJbMV0pJiYoIWJbMl18fChjLmlkfHx7fSkudmFsdWU9PT1iWzJdKSYmKCFiWzNdfHxiWzNdLnRlc3QoKGNbImNsYXNzIl18fHt9KS52YWx1ZSkpfSxJPWZ1bmN0aW9uKGEpe3JldHVybiBmLmV2ZW50LnNwZWNpYWwuaG92ZXI/YTphLnJlcGxhY2UoQiwibW91c2VlbnRlciQxIG1vdXNlbGVhdmUkMSIpfTsKZi5ldmVudD17YWRkOmZ1bmN0aW9uKGEsYyxkLGUsZyl7dmFyIGgsaSxqLGssbCxtLG4sbyxwLHEscixzO2lmKCEoYS5ub2RlVHlwZT09PTN8fGEubm9kZVR5cGU9PT04fHwhY3x8IWR8fCEoaD1mLl9kYXRhKGEpKSkpe2QuaGFuZGxlciYmKHA9ZCxkPXAuaGFuZGxlciksZC5ndWlkfHwoZC5ndWlkPWYuZ3VpZCsrKSxqPWguZXZlbnRzLGp8fChoLmV2ZW50cz1qPXt9KSxpPWguaGFuZGxlLGl8fChoLmhhbmRsZT1pPWZ1bmN0aW9uKGEpe3JldHVybiB0eXBlb2YgZiE9InVuZGVmaW5lZCImJighYXx8Zi5ldmVudC50cmlnZ2VyZWQhPT1hLnR5cGUpP2YuZXZlbnQuZGlzcGF0Y2guYXBwbHkoaS5lbGVtLGFyZ3VtZW50cyk6Yn0saS5lbGVtPWEpLGM9Zi50cmltKEkoYykpLnNwbGl0KCIgIik7Zm9yKGs9MDtrPGMubGVuZ3RoO2srKyl7bD1BLmV4ZWMoY1trXSl8fFtdLG09bFsxXSxuPShsWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCkscz1mLmV2ZW50LnNwZWNpYWxbbV18fHt9LG09KGc/cy5kZWxlZ2F0ZVR5cGU6cy5iaW5kVHlwZSl8fG0scz1mLmV2ZW50LnNwZWNpYWxbbV18fHt9LG89Zi5leHRlbmQoe3R5cGU6bSxvcmlnVHlwZTpsWzFdLGRhdGE6ZSxoYW5kbGVyOmQsZ3VpZDpkLmd1aWQsc2VsZWN0b3I6ZyxxdWljazpHKGcpLG5hbWVzcGFjZTpuLmpvaW4oIi4iKX0scCkscj1qW21dO2lmKCFyKXtyPWpbbV09W10sci5kZWxlZ2F0ZUNvdW50PTA7aWYoIXMuc2V0dXB8fHMuc2V0dXAuY2FsbChhLGUsbixpKT09PSExKWEuYWRkRXZlbnRMaXN0ZW5lcj9hLmFkZEV2ZW50TGlzdGVuZXIobSxpLCExKTphLmF0dGFjaEV2ZW50JiZhLmF0dGFjaEV2ZW50KCJvbiIrbSxpKX1zLmFkZCYmKHMuYWRkLmNhbGwoYSxvKSxvLmhhbmRsZXIuZ3VpZHx8KG8uaGFuZGxlci5ndWlkPWQuZ3VpZCkpLGc/ci5zcGxpY2Uoci5kZWxlZ2F0ZUNvdW50KyssMCxvKTpyLnB1c2gobyksZi5ldmVudC5nbG9iYWxbbV09ITB9YT1udWxsfX0sZ2xvYmFsOnt9LHJlbW92ZTpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBnPWYuaGFzRGF0YShhKSYmZi5fZGF0YShhKSxoLGksaixrLGwsbSxuLG8scCxxLHIscztpZighIWcmJiEhKG89Zy5ldmVudHMpKXtiPWYudHJpbShJKGJ8fCIiKSkuc3BsaXQoIiAiKTtmb3IoaD0wO2g8Yi5sZW5ndGg7aCsrKXtpPUEuZXhlYyhiW2hdKXx8W10saj1rPWlbMV0sbD1pWzJdO2lmKCFqKXtmb3IoaiBpbiBvKWYuZXZlbnQucmVtb3ZlKGEsaitiW2hdLGMsZCwhMCk7Y29udGludWV9cD1mLmV2ZW50LnNwZWNpYWxbal18fHt9LGo9KGQ/cC5kZWxlZ2F0ZVR5cGU6cC5iaW5kVHlwZSl8fGoscj1vW2pdfHxbXSxtPXIubGVuZ3RoLGw9bD9uZXcgUmVnRXhwKCIoXnxcXC4pIitsLnNwbGl0KCIuIikuc29ydCgpLmpvaW4oIlxcLig/Oi4qXFwuKT8iKSsiKFxcLnwkKSIpOm51bGw7Zm9yKG49MDtuPHIubGVuZ3RoO24rKylzPXJbbl0sKGV8fGs9PT1zLm9yaWdUeXBlKSYmKCFjfHxjLmd1aWQ9PT1zLmd1aWQpJiYoIWx8fGwudGVzdChzLm5hbWVzcGFjZSkpJiYoIWR8fGQ9PT1zLnNlbGVjdG9yfHxkPT09IioqIiYmcy5zZWxlY3RvcikmJihyLnNwbGljZShuLS0sMSkscy5zZWxlY3RvciYmci5kZWxlZ2F0ZUNvdW50LS0scC5yZW1vdmUmJnAucmVtb3ZlLmNhbGwoYSxzKSk7ci5sZW5ndGg9PT0wJiZtIT09ci5sZW5ndGgmJigoIXAudGVhcmRvd258fHAudGVhcmRvd24uY2FsbChhLGwpPT09ITEpJiZmLnJlbW92ZUV2ZW50KGEsaixnLmhhbmRsZSksZGVsZXRlIG9bal0pfWYuaXNFbXB0eU9iamVjdChvKSYmKHE9Zy5oYW5kbGUscSYmKHEuZWxlbT1udWxsKSxmLnJlbW92ZURhdGEoYSxbImV2ZW50cyIsImhhbmRsZSJdLCEwKSl9fSxjdXN0b21FdmVudDp7Z2V0RGF0YTohMCxzZXREYXRhOiEwLGNoYW5nZURhdGE6ITB9LHRyaWdnZXI6ZnVuY3Rpb24oYyxkLGUsZyl7aWYoIWV8fGUubm9kZVR5cGUhPT0zJiZlLm5vZGVUeXBlIT09OCl7dmFyIGg9Yy50eXBlfHxjLGk9W10saixrLGwsbSxuLG8scCxxLHIscztpZihFLnRlc3QoaCtmLmV2ZW50LnRyaWdnZXJlZCkpcmV0dXJuO2guaW5kZXhPZigiISIpPj0wJiYoaD1oLnNsaWNlKDAsLTEpLGs9ITApLGguaW5kZXhPZigiLiIpPj0wJiYoaT1oLnNwbGl0KCIuIiksaD1pLnNoaWZ0KCksaS5zb3J0KCkpO2lmKCghZXx8Zi5ldmVudC5jdXN0b21FdmVudFtoXSkmJiFmLmV2ZW50Lmdsb2JhbFtoXSlyZXR1cm47Yz10eXBlb2YgYz09Im9iamVjdCI/Y1tmLmV4cGFuZG9dP2M6bmV3IGYuRXZlbnQoaCxjKTpuZXcgZi5FdmVudChoKSxjLnR5cGU9aCxjLmlzVHJpZ2dlcj0hMCxjLmV4Y2x1c2l2ZT1rLGMubmFtZXNwYWNlPWkuam9pbigiLiIpLGMubmFtZXNwYWNlX3JlPWMubmFtZXNwYWNlP25ldyBSZWdFeHAoIihefFxcLikiK2kuam9pbigiXFwuKD86LipcXC4pPyIpKyIoXFwufCQpIik6bnVsbCxvPWguaW5kZXhPZigiOiIpPDA/Im9uIitoOiIiO2lmKCFlKXtqPWYuY2FjaGU7Zm9yKGwgaW4gailqW2xdLmV2ZW50cyYmaltsXS5ldmVudHNbaF0mJmYuZXZlbnQudHJpZ2dlcihjLGQsaltsXS5oYW5kbGUuZWxlbSwhMCk7cmV0dXJufWMucmVzdWx0PWIsYy50YXJnZXR8fChjLnRhcmdldD1lKSxkPWQhPW51bGw/Zi5tYWtlQXJyYXkoZCk6W10sZC51bnNoaWZ0KGMpLHA9Zi5ldmVudC5zcGVjaWFsW2hdfHx7fTtpZihwLnRyaWdnZXImJnAudHJpZ2dlci5hcHBseShlLGQpPT09ITEpcmV0dXJuO3I9W1tlLHAuYmluZFR5cGV8fGhdXTtpZighZyYmIXAubm9CdWJibGUmJiFmLmlzV2luZG93KGUpKXtzPXAuZGVsZWdhdGVUeXBlfHxoLG09RS50ZXN0KHMraCk/ZTplLnBhcmVudE5vZGUsbj1udWxsO2Zvcig7bTttPW0ucGFyZW50Tm9kZSlyLnB1c2goW20sc10pLG49bTtuJiZuPT09ZS5vd25lckRvY3VtZW50JiZyLnB1c2goW24uZGVmYXVsdFZpZXd8fG4ucGFyZW50V2luZG93fHxhLHNdKX1mb3IobD0wO2w8ci5sZW5ndGgmJiFjLmlzUHJvcGFnYXRpb25TdG9wcGVkKCk7bCsrKW09cltsXVswXSxjLnR5cGU9cltsXVsxXSxxPShmLl9kYXRhKG0sImV2ZW50cyIpfHx7fSlbYy50eXBlXSYmZi5fZGF0YShtLCJoYW5kbGUiKSxxJiZxLmFwcGx5KG0sZCkscT1vJiZtW29dLHEmJmYuYWNjZXB0RGF0YShtKSYmcS5hcHBseShtLGQpPT09ITEmJmMucHJldmVudERlZmF1bHQoKTtjLnR5cGU9aCwhZyYmIWMuaXNEZWZhdWx0UHJldmVudGVkKCkmJighcC5fZGVmYXVsdHx8cC5fZGVmYXVsdC5hcHBseShlLm93bmVyRG9jdW1lbnQsZCk9PT0hMSkmJihoIT09ImNsaWNrInx8IWYubm9kZU5hbWUoZSwiYSIpKSYmZi5hY2NlcHREYXRhKGUpJiZvJiZlW2hdJiYoaCE9PSJmb2N1cyImJmghPT0iYmx1ciJ8fGMudGFyZ2V0Lm9mZnNldFdpZHRoIT09MCkmJiFmLmlzV2luZG93KGUpJiYobj1lW29dLG4mJihlW29dPW51bGwpLGYuZXZlbnQudHJpZ2dlcmVkPWgsZVtoXSgpLGYuZXZlbnQudHJpZ2dlcmVkPWIsbiYmKGVbb109bikpO3JldHVybiBjLnJlc3VsdH19LGRpc3BhdGNoOmZ1bmN0aW9uKGMpe2M9Zi5ldmVudC5maXgoY3x8YS5ldmVudCk7dmFyIGQ9KGYuX2RhdGEodGhpcywiZXZlbnRzIil8fHt9KVtjLnR5cGVdfHxbXSxlPWQuZGVsZWdhdGVDb3VudCxnPVtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLDApLGg9IWMuZXhjbHVzaXZlJiYhYy5uYW1lc3BhY2UsaT1bXSxqLGssbCxtLG4sbyxwLHEscixzLHQ7Z1swXT1jLGMuZGVsZWdhdGVUYXJnZXQ9dGhpcztpZihlJiYhYy50YXJnZXQuZGlzYWJsZWQmJighYy5idXR0b258fGMudHlwZSE9PSJjbGljayIpKXttPWYodGhpcyksbS5jb250ZXh0PXRoaXMub3duZXJEb2N1bWVudHx8dGhpcztmb3IobD1jLnRhcmdldDtsIT10aGlzO2w9bC5wYXJlbnROb2RlfHx0aGlzKXtvPXt9LHE9W10sbVswXT1sO2ZvcihqPTA7ajxlO2orKylyPWRbal0scz1yLnNlbGVjdG9yLG9bc109PT1iJiYob1tzXT1yLnF1aWNrP0gobCxyLnF1aWNrKTptLmlzKHMpKSxvW3NdJiZxLnB1c2gocik7cS5sZW5ndGgmJmkucHVzaCh7ZWxlbTpsLG1hdGNoZXM6cX0pfX1kLmxlbmd0aD5lJiZpLnB1c2goe2VsZW06dGhpcyxtYXRjaGVzOmQuc2xpY2UoZSl9KTtmb3Ioaj0wO2o8aS5sZW5ndGgmJiFjLmlzUHJvcGFnYXRpb25TdG9wcGVkKCk7aisrKXtwPWlbal0sYy5jdXJyZW50VGFyZ2V0PXAuZWxlbTtmb3Ioaz0wO2s8cC5tYXRjaGVzLmxlbmd0aCYmIWMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKTtrKyspe3I9cC5tYXRjaGVzW2tdO2lmKGh8fCFjLm5hbWVzcGFjZSYmIXIubmFtZXNwYWNlfHxjLm5hbWVzcGFjZV9yZSYmYy5uYW1lc3BhY2VfcmUudGVzdChyLm5hbWVzcGFjZSkpYy5kYXRhPXIuZGF0YSxjLmhhbmRsZU9iaj1yLG49KChmLmV2ZW50LnNwZWNpYWxbci5vcmlnVHlwZV18fHt9KS5oYW5kbGV8fHIuaGFuZGxlcikuYXBwbHkocC5lbGVtLGcpLG4hPT1iJiYoYy5yZXN1bHQ9bixuPT09ITEmJihjLnByZXZlbnREZWZhdWx0KCksYy5zdG9wUHJvcGFnYXRpb24oKSkpfX1yZXR1cm4gYy5yZXN1bHR9LHByb3BzOiJhdHRyQ2hhbmdlIGF0dHJOYW1lIHJlbGF0ZWROb2RlIHNyY0VsZW1lbnQgYWx0S2V5IGJ1YmJsZXMgY2FuY2VsYWJsZSBjdHJsS2V5IGN1cnJlbnRUYXJnZXQgZXZlbnRQaGFzZSBtZXRhS2V5IHJlbGF0ZWRUYXJnZXQgc2hpZnRLZXkgdGFyZ2V0IHRpbWVTdGFtcCB2aWV3IHdoaWNoIi5zcGxpdCgiICIpLGZpeEhvb2tzOnt9LGtleUhvb2tzOntwcm9wczoiY2hhciBjaGFyQ29kZSBrZXkga2V5Q29kZSIuc3BsaXQoIiAiKSxmaWx0ZXI6ZnVuY3Rpb24oYSxiKXthLndoaWNoPT1udWxsJiYoYS53aGljaD1iLmNoYXJDb2RlIT1udWxsP2IuY2hhckNvZGU6Yi5rZXlDb2RlKTtyZXR1cm4gYX19LG1vdXNlSG9va3M6e3Byb3BzOiJidXR0b24gYnV0dG9ucyBjbGllbnRYIGNsaWVudFkgZnJvbUVsZW1lbnQgb2Zmc2V0WCBvZmZzZXRZIHBhZ2VYIHBhZ2VZIHNjcmVlblggc2NyZWVuWSB0b0VsZW1lbnQiLnNwbGl0KCIgIiksZmlsdGVyOmZ1bmN0aW9uKGEsZCl7dmFyIGUsZixnLGg9ZC5idXR0b24saT1kLmZyb21FbGVtZW50O2EucGFnZVg9PW51bGwmJmQuY2xpZW50WCE9bnVsbCYmKGU9YS50YXJnZXQub3duZXJEb2N1bWVudHx8YyxmPWUuZG9jdW1lbnRFbGVtZW50LGc9ZS5ib2R5LGEucGFnZVg9ZC5jbGllbnRYKyhmJiZmLnNjcm9sbExlZnR8fGcmJmcuc2Nyb2xsTGVmdHx8MCktKGYmJmYuY2xpZW50TGVmdHx8ZyYmZy5jbGllbnRMZWZ0fHwwKSxhLnBhZ2VZPWQuY2xpZW50WSsoZiYmZi5zY3JvbGxUb3B8fGcmJmcuc2Nyb2xsVG9wfHwwKS0oZiYmZi5jbGllbnRUb3B8fGcmJmcuY2xpZW50VG9wfHwwKSksIWEucmVsYXRlZFRhcmdldCYmaSYmKGEucmVsYXRlZFRhcmdldD1pPT09YS50YXJnZXQ/ZC50b0VsZW1lbnQ6aSksIWEud2hpY2gmJmghPT1iJiYoYS53aGljaD1oJjE/MTpoJjI/MzpoJjQ/MjowKTtyZXR1cm4gYX19LGZpeDpmdW5jdGlvbihhKXtpZihhW2YuZXhwYW5kb10pcmV0dXJuIGE7dmFyIGQsZSxnPWEsaD1mLmV2ZW50LmZpeEhvb2tzW2EudHlwZV18fHt9LGk9aC5wcm9wcz90aGlzLnByb3BzLmNvbmNhdChoLnByb3BzKTp0aGlzLnByb3BzO2E9Zi5FdmVudChnKTtmb3IoZD1pLmxlbmd0aDtkOyllPWlbLS1kXSxhW2VdPWdbZV07YS50YXJnZXR8fChhLnRhcmdldD1nLnNyY0VsZW1lbnR8fGMpLGEudGFyZ2V0Lm5vZGVUeXBlPT09MyYmKGEudGFyZ2V0PWEudGFyZ2V0LnBhcmVudE5vZGUpLGEubWV0YUtleT09PWImJihhLm1ldGFLZXk9YS5jdHJsS2V5KTtyZXR1cm4gaC5maWx0ZXI/aC5maWx0ZXIoYSxnKTphfSxzcGVjaWFsOntyZWFkeTp7c2V0dXA6Zi5iaW5kUmVhZHl9LGxvYWQ6e25vQnViYmxlOiEwfSxmb2N1czp7ZGVsZWdhdGVUeXBlOiJmb2N1c2luIn0sYmx1cjp7ZGVsZWdhdGVUeXBlOiJmb2N1c291dCJ9LGJlZm9yZXVubG9hZDp7c2V0dXA6ZnVuY3Rpb24oYSxiLGMpe2YuaXNXaW5kb3codGhpcykmJih0aGlzLm9uYmVmb3JldW5sb2FkPWMpfSx0ZWFyZG93bjpmdW5jdGlvbihhLGIpe3RoaXMub25iZWZvcmV1bmxvYWQ9PT1iJiYodGhpcy5vbmJlZm9yZXVubG9hZD1udWxsKX19fSxzaW11bGF0ZTpmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1mLmV4dGVuZChuZXcgZi5FdmVudCxjLHt0eXBlOmEsaXNTaW11bGF0ZWQ6ITAsb3JpZ2luYWxFdmVudDp7fX0pO2Q/Zi5ldmVudC50cmlnZ2VyKGUsbnVsbCxiKTpmLmV2ZW50LmRpc3BhdGNoLmNhbGwoYixlKSxlLmlzRGVmYXVsdFByZXZlbnRlZCgpJiZjLnByZXZlbnREZWZhdWx0KCl9fSxmLmV2ZW50LmhhbmRsZT1mLmV2ZW50LmRpc3BhdGNoLGYucmVtb3ZlRXZlbnQ9Yy5yZW1vdmVFdmVudExpc3RlbmVyP2Z1bmN0aW9uKGEsYixjKXthLnJlbW92ZUV2ZW50TGlzdGVuZXImJmEucmVtb3ZlRXZlbnRMaXN0ZW5lcihiLGMsITEpfTpmdW5jdGlvbihhLGIsYyl7YS5kZXRhY2hFdmVudCYmYS5kZXRhY2hFdmVudCgib24iK2IsYyl9LGYuRXZlbnQ9ZnVuY3Rpb24oYSxiKXtpZighKHRoaXMgaW5zdGFuY2VvZiBmLkV2ZW50KSlyZXR1cm4gbmV3IGYuRXZlbnQoYSxiKTthJiZhLnR5cGU/KHRoaXMub3JpZ2luYWxFdmVudD1hLHRoaXMudHlwZT1hLnR5cGUsdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9YS5kZWZhdWx0UHJldmVudGVkfHxhLnJldHVyblZhbHVlPT09ITF8fGEuZ2V0UHJldmVudERlZmF1bHQmJmEuZ2V0UHJldmVudERlZmF1bHQoKT9LOkopOnRoaXMudHlwZT1hLGImJmYuZXh0ZW5kKHRoaXMsYiksdGhpcy50aW1lU3RhbXA9YSYmYS50aW1lU3RhbXB8fGYubm93KCksdGhpc1tmLmV4cGFuZG9dPSEwfSxmLkV2ZW50LnByb3RvdHlwZT17cHJldmVudERlZmF1bHQ6ZnVuY3Rpb24oKXt0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1LO3ZhciBhPXRoaXMub3JpZ2luYWxFdmVudDshYXx8KGEucHJldmVudERlZmF1bHQ/YS5wcmV2ZW50RGVmYXVsdCgpOmEucmV0dXJuVmFsdWU9ITEpfSxzdG9wUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPUs7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50OyFhfHwoYS5zdG9wUHJvcGFnYXRpb24mJmEuc3RvcFByb3BhZ2F0aW9uKCksYS5jYW5jZWxCdWJibGU9ITApfSxzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt0aGlzLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkPUssdGhpcy5zdG9wUHJvcGFnYXRpb24oKX0saXNEZWZhdWx0UHJldmVudGVkOkosaXNQcm9wYWdhdGlvblN0b3BwZWQ6Sixpc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZDpKfSxmLmVhY2goe21vdXNlZW50ZXI6Im1vdXNlb3ZlciIsbW91c2VsZWF2ZToibW91c2VvdXQifSxmdW5jdGlvbihhLGIpe2YuZXZlbnQuc3BlY2lhbFthXT17ZGVsZWdhdGVUeXBlOmIsYmluZFR5cGU6YixoYW5kbGU6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcyxkPWEucmVsYXRlZFRhcmdldCxlPWEuaGFuZGxlT2JqLGc9ZS5zZWxlY3RvcixoO2lmKCFkfHxkIT09YyYmIWYuY29udGFpbnMoYyxkKSlhLnR5cGU9ZS5vcmlnVHlwZSxoPWUuaGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyksYS50eXBlPWI7cmV0dXJuIGh9fX0pLGYuc3VwcG9ydC5zdWJtaXRCdWJibGVzfHwoZi5ldmVudC5zcGVjaWFsLnN1Ym1pdD17c2V0dXA6ZnVuY3Rpb24oKXtpZihmLm5vZGVOYW1lKHRoaXMsImZvcm0iKSlyZXR1cm4hMTtmLmV2ZW50LmFkZCh0aGlzLCJjbGljay5fc3VibWl0IGtleXByZXNzLl9zdWJtaXQiLGZ1bmN0aW9uKGEpe3ZhciBjPWEudGFyZ2V0LGQ9Zi5ub2RlTmFtZShjLCJpbnB1dCIpfHxmLm5vZGVOYW1lKGMsImJ1dHRvbiIpP2MuZm9ybTpiO2QmJiFkLl9zdWJtaXRfYXR0YWNoZWQmJihmLmV2ZW50LmFkZChkLCJzdWJtaXQuX3N1Ym1pdCIsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlJiYhYS5pc1RyaWdnZXImJmYuZXZlbnQuc2ltdWxhdGUoInN1Ym1pdCIsdGhpcy5wYXJlbnROb2RlLGEsITApfSksZC5fc3VibWl0X2F0dGFjaGVkPSEwKX0pfSx0ZWFyZG93bjpmdW5jdGlvbigpe2lmKGYubm9kZU5hbWUodGhpcywiZm9ybSIpKXJldHVybiExO2YuZXZlbnQucmVtb3ZlKHRoaXMsIi5fc3VibWl0Iil9fSksZi5zdXBwb3J0LmNoYW5nZUJ1YmJsZXN8fChmLmV2ZW50LnNwZWNpYWwuY2hhbmdlPXtzZXR1cDpmdW5jdGlvbigpe2lmKHoudGVzdCh0aGlzLm5vZGVOYW1lKSl7aWYodGhpcy50eXBlPT09ImNoZWNrYm94Inx8dGhpcy50eXBlPT09InJhZGlvIilmLmV2ZW50LmFkZCh0aGlzLCJwcm9wZXJ0eWNoYW5nZS5fY2hhbmdlIixmdW5jdGlvbihhKXthLm9yaWdpbmFsRXZlbnQucHJvcGVydHlOYW1lPT09ImNoZWNrZWQiJiYodGhpcy5fanVzdF9jaGFuZ2VkPSEwKX0pLGYuZXZlbnQuYWRkKHRoaXMsImNsaWNrLl9jaGFuZ2UiLGZ1bmN0aW9uKGEpe3RoaXMuX2p1c3RfY2hhbmdlZCYmIWEuaXNUcmlnZ2VyJiYodGhpcy5fanVzdF9jaGFuZ2VkPSExLGYuZXZlbnQuc2ltdWxhdGUoImNoYW5nZSIsdGhpcyxhLCEwKSl9KTtyZXR1cm4hMX1mLmV2ZW50LmFkZCh0aGlzLCJiZWZvcmVhY3RpdmF0ZS5fY2hhbmdlIixmdW5jdGlvbihhKXt2YXIgYj1hLnRhcmdldDt6LnRlc3QoYi5ub2RlTmFtZSkmJiFiLl9jaGFuZ2VfYXR0YWNoZWQmJihmLmV2ZW50LmFkZChiLCJjaGFuZ2UuX2NoYW5nZSIsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlJiYhYS5pc1NpbXVsYXRlZCYmIWEuaXNUcmlnZ2VyJiZmLmV2ZW50LnNpbXVsYXRlKCJjaGFuZ2UiLHRoaXMucGFyZW50Tm9kZSxhLCEwKX0pLGIuX2NoYW5nZV9hdHRhY2hlZD0hMCl9KX0saGFuZGxlOmZ1bmN0aW9uKGEpe3ZhciBiPWEudGFyZ2V0O2lmKHRoaXMhPT1ifHxhLmlzU2ltdWxhdGVkfHxhLmlzVHJpZ2dlcnx8Yi50eXBlIT09InJhZGlvIiYmYi50eXBlIT09ImNoZWNrYm94IilyZXR1cm4gYS5oYW5kbGVPYmouaGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LHRlYXJkb3duOmZ1bmN0aW9uKCl7Zi5ldmVudC5yZW1vdmUodGhpcywiLl9jaGFuZ2UiKTtyZXR1cm4gei50ZXN0KHRoaXMubm9kZU5hbWUpfX0pLGYuc3VwcG9ydC5mb2N1c2luQnViYmxlc3x8Zi5lYWNoKHtmb2N1czoiZm9jdXNpbiIsYmx1cjoiZm9jdXNvdXQifSxmdW5jdGlvbihhLGIpe3ZhciBkPTAsZT1mdW5jdGlvbihhKXtmLmV2ZW50LnNpbXVsYXRlKGIsYS50YXJnZXQsZi5ldmVudC5maXgoYSksITApfTtmLmV2ZW50LnNwZWNpYWxbYl09e3NldHVwOmZ1bmN0aW9uKCl7ZCsrPT09MCYmYy5hZGRFdmVudExpc3RlbmVyKGEsZSwhMCl9LHRlYXJkb3duOmZ1bmN0aW9uKCl7LS1kPT09MCYmYy5yZW1vdmVFdmVudExpc3RlbmVyKGEsZSwhMCl9fX0pLGYuZm4uZXh0ZW5kKHtvbjpmdW5jdGlvbihhLGMsZCxlLGcpe3ZhciBoLGk7aWYodHlwZW9mIGE9PSJvYmplY3QiKXt0eXBlb2YgYyE9InN0cmluZyImJihkPWMsYz1iKTtmb3IoaSBpbiBhKXRoaXMub24oaSxjLGQsYVtpXSxnKTtyZXR1cm4gdGhpc31kPT1udWxsJiZlPT1udWxsPyhlPWMsZD1jPWIpOmU9PW51bGwmJih0eXBlb2YgYz09InN0cmluZyI/KGU9ZCxkPWIpOihlPWQsZD1jLGM9YikpO2lmKGU9PT0hMSllPUo7ZWxzZSBpZighZSlyZXR1cm4gdGhpcztnPT09MSYmKGg9ZSxlPWZ1bmN0aW9uKGEpe2YoKS5vZmYoYSk7cmV0dXJuIGguYXBwbHkodGhpcyxhcmd1bWVudHMpfSxlLmd1aWQ9aC5ndWlkfHwoaC5ndWlkPWYuZ3VpZCsrKSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2YuZXZlbnQuYWRkKHRoaXMsYSxlLGQsYyl9KX0sb25lOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLm9uLmNhbGwodGhpcyxhLGIsYyxkLDEpfSxvZmY6ZnVuY3Rpb24oYSxjLGQpe2lmKGEmJmEucHJldmVudERlZmF1bHQmJmEuaGFuZGxlT2JqKXt2YXIgZT1hLmhhbmRsZU9iajtmKGEuZGVsZWdhdGVUYXJnZXQpLm9mZihlLm5hbWVzcGFjZT9lLnR5cGUrIi4iK2UubmFtZXNwYWNlOmUudHlwZSxlLnNlbGVjdG9yLGUuaGFuZGxlcik7cmV0dXJuIHRoaXN9aWYodHlwZW9mIGE9PSJvYmplY3QiKXtmb3IodmFyIGcgaW4gYSl0aGlzLm9mZihnLGMsYVtnXSk7cmV0dXJuIHRoaXN9aWYoYz09PSExfHx0eXBlb2YgYz09ImZ1bmN0aW9uIilkPWMsYz1iO2Q9PT0hMSYmKGQ9Sik7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2YuZXZlbnQucmVtb3ZlKHRoaXMsYSxkLGMpfSl9LGJpbmQ6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLm9uKGEsbnVsbCxiLGMpfSx1bmJpbmQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5vZmYoYSxudWxsLGIpfSxsaXZlOmZ1bmN0aW9uKGEsYixjKXtmKHRoaXMuY29udGV4dCkub24oYSx0aGlzLnNlbGVjdG9yLGIsYyk7cmV0dXJuIHRoaXN9LGRpZTpmdW5jdGlvbihhLGIpe2YodGhpcy5jb250ZXh0KS5vZmYoYSx0aGlzLnNlbGVjdG9yfHwiKioiLGIpO3JldHVybiB0aGlzfSxkZWxlZ2F0ZTpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gdGhpcy5vbihiLGEsYyxkKX0sdW5kZWxlZ2F0ZTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg9PTE/dGhpcy5vZmYoYSwiKioiKTp0aGlzLm9mZihiLGEsYyl9LHRyaWdnZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zi5ldmVudC50cmlnZ2VyKGEsYix0aGlzKX0pfSx0cmlnZ2VySGFuZGxlcjpmdW5jdGlvbihhLGIpe2lmKHRoaXNbMF0pcmV0dXJuIGYuZXZlbnQudHJpZ2dlcihhLGIsdGhpc1swXSwhMCl9LHRvZ2dsZTpmdW5jdGlvbihhKXt2YXIgYj1hcmd1bWVudHMsYz1hLmd1aWR8fGYuZ3VpZCsrLGQ9MCxlPWZ1bmN0aW9uKGMpe3ZhciBlPShmLl9kYXRhKHRoaXMsImxhc3RUb2dnbGUiK2EuZ3VpZCl8fDApJWQ7Zi5fZGF0YSh0aGlzLCJsYXN0VG9nZ2xlIithLmd1aWQsZSsxKSxjLnByZXZlbnREZWZhdWx0KCk7cmV0dXJuIGJbZV0uYXBwbHkodGhpcyxhcmd1bWVudHMpfHwhMX07ZS5ndWlkPWM7d2hpbGUoZDxiLmxlbmd0aCliW2QrK10uZ3VpZD1jO3JldHVybiB0aGlzLmNsaWNrKGUpfSxob3ZlcjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLm1vdXNlZW50ZXIoYSkubW91c2VsZWF2ZShifHxhKX19KSxmLmVhY2goImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCBsb2FkIHJlc2l6ZSBzY3JvbGwgdW5sb2FkIGNsaWNrIGRibGNsaWNrIG1vdXNlZG93biBtb3VzZXVwIG1vdXNlbW92ZSBtb3VzZW92ZXIgbW91c2VvdXQgbW91c2VlbnRlciBtb3VzZWxlYXZlIGNoYW5nZSBzZWxlY3Qgc3VibWl0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgZXJyb3IgY29udGV4dG1lbnUiLnNwbGl0KCIgIiksZnVuY3Rpb24oYSxiKXtmLmZuW2JdPWZ1bmN0aW9uKGEsYyl7Yz09bnVsbCYmKGM9YSxhPW51bGwpO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPjA/dGhpcy5vbihiLG51bGwsYSxjKTp0aGlzLnRyaWdnZXIoYil9LGYuYXR0ckZuJiYoZi5hdHRyRm5bYl09ITApLEMudGVzdChiKSYmKGYuZXZlbnQuZml4SG9va3NbYl09Zi5ldmVudC5rZXlIb29rcyksRC50ZXN0KGIpJiYoZi5ldmVudC5maXhIb29rc1tiXT1mLmV2ZW50Lm1vdXNlSG9va3MpfSksZnVuY3Rpb24oKXtmdW5jdGlvbiB4KGEsYixjLGUsZixnKXtmb3IodmFyIGg9MCxpPWUubGVuZ3RoO2g8aTtoKyspe3ZhciBqPWVbaF07aWYoail7dmFyIGs9ITE7aj1qW2FdO3doaWxlKGope2lmKGpbZF09PT1jKXtrPWVbai5zaXpzZXRdO2JyZWFrfWlmKGoubm9kZVR5cGU9PT0xKXtnfHwoaltkXT1jLGouc2l6c2V0PWgpO2lmKHR5cGVvZiBiIT0ic3RyaW5nIil7aWYoaj09PWIpe2s9ITA7YnJlYWt9fWVsc2UgaWYobS5maWx0ZXIoYixbal0pLmxlbmd0aD4wKXtrPWo7YnJlYWt9fWo9althXX1lW2hdPWt9fX1mdW5jdGlvbiB3KGEsYixjLGUsZixnKXtmb3IodmFyIGg9MCxpPWUubGVuZ3RoO2g8aTtoKyspe3ZhciBqPWVbaF07aWYoail7dmFyIGs9ITE7aj1qW2FdO3doaWxlKGope2lmKGpbZF09PT1jKXtrPWVbai5zaXpzZXRdO2JyZWFrfWoubm9kZVR5cGU9PT0xJiYhZyYmKGpbZF09YyxqLnNpenNldD1oKTtpZihqLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1iKXtrPWo7YnJlYWt9aj1qW2FdfWVbaF09a319fXZhciBhPS8oKD86XCgoPzpcKFteKCldK1wpfFteKCldKykrXCl8XFsoPzpcW1teXFtcXV0qXF18WyciXVteJyJdKlsnIl18W15cW1xdJyJdKykrXF18XFwufFteID4rfiwoXFtcXF0rKSt8Wz4rfl0pKFxzKixccyopPygoPzoufFxyfFxuKSopL2csZD0ic2l6Y2FjaGUiKyhNYXRoLnJhbmRvbSgpKyIiKS5yZXBsYWNlKCIuIiwiIiksZT0wLGc9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxoPSExLGk9ITAsaj0vXFwvZyxrPS9cclxuL2csbD0vXFcvO1swLDBdLnNvcnQoZnVuY3Rpb24oKXtpPSExO3JldHVybiAwfSk7dmFyIG09ZnVuY3Rpb24oYixkLGUsZil7ZT1lfHxbXSxkPWR8fGM7dmFyIGg9ZDtpZihkLm5vZGVUeXBlIT09MSYmZC5ub2RlVHlwZSE9PTkpcmV0dXJuW107aWYoIWJ8fHR5cGVvZiBiIT0ic3RyaW5nIilyZXR1cm4gZTt2YXIgaSxqLGssbCxuLHEscix0LHU9ITAsdj1tLmlzWE1MKGQpLHc9W10seD1iO2Rve2EuZXhlYygiIiksaT1hLmV4ZWMoeCk7aWYoaSl7eD1pWzNdLHcucHVzaChpWzFdKTtpZihpWzJdKXtsPWlbM107YnJlYWt9fX13aGlsZShpKTtpZih3Lmxlbmd0aD4xJiZwLmV4ZWMoYikpaWYody5sZW5ndGg9PT0yJiZvLnJlbGF0aXZlW3dbMF1dKWo9eSh3WzBdK3dbMV0sZCxmKTtlbHNle2o9by5yZWxhdGl2ZVt3WzBdXT9bZF06bSh3LnNoaWZ0KCksZCk7d2hpbGUody5sZW5ndGgpYj13LnNoaWZ0KCksby5yZWxhdGl2ZVtiXSYmKGIrPXcuc2hpZnQoKSksaj15KGIsaixmKX1lbHNleyFmJiZ3Lmxlbmd0aD4xJiZkLm5vZGVUeXBlPT09OSYmIXYmJm8ubWF0Y2guSUQudGVzdCh3WzBdKSYmIW8ubWF0Y2guSUQudGVzdCh3W3cubGVuZ3RoLTFdKSYmKG49bS5maW5kKHcuc2hpZnQoKSxkLHYpLGQ9bi5leHByP20uZmlsdGVyKG4uZXhwcixuLnNldClbMF06bi5zZXRbMF0pO2lmKGQpe249Zj97ZXhwcjp3LnBvcCgpLHNldDpzKGYpfTptLmZpbmQody5wb3AoKSx3Lmxlbmd0aD09PTEmJih3WzBdPT09In4ifHx3WzBdPT09IisiKSYmZC5wYXJlbnROb2RlP2QucGFyZW50Tm9kZTpkLHYpLGo9bi5leHByP20uZmlsdGVyKG4uZXhwcixuLnNldCk6bi5zZXQsdy5sZW5ndGg+MD9rPXMoaik6dT0hMTt3aGlsZSh3Lmxlbmd0aClxPXcucG9wKCkscj1xLG8ucmVsYXRpdmVbcV0/cj13LnBvcCgpOnE9IiIscj09bnVsbCYmKHI9ZCksby5yZWxhdGl2ZVtxXShrLHIsdil9ZWxzZSBrPXc9W119a3x8KGs9aiksa3x8bS5lcnJvcihxfHxiKTtpZihnLmNhbGwoayk9PT0iW29iamVjdCBBcnJheV0iKWlmKCF1KWUucHVzaC5hcHBseShlLGspO2Vsc2UgaWYoZCYmZC5ub2RlVHlwZT09PTEpZm9yKHQ9MDtrW3RdIT1udWxsO3QrKylrW3RdJiYoa1t0XT09PSEwfHxrW3RdLm5vZGVUeXBlPT09MSYmbS5jb250YWlucyhkLGtbdF0pKSYmZS5wdXNoKGpbdF0pO2Vsc2UgZm9yKHQ9MDtrW3RdIT1udWxsO3QrKylrW3RdJiZrW3RdLm5vZGVUeXBlPT09MSYmZS5wdXNoKGpbdF0pO2Vsc2UgcyhrLGUpO2wmJihtKGwsaCxlLGYpLG0udW5pcXVlU29ydChlKSk7cmV0dXJuIGV9O20udW5pcXVlU29ydD1mdW5jdGlvbihhKXtpZih1KXtoPWksYS5zb3J0KHUpO2lmKGgpZm9yKHZhciBiPTE7YjxhLmxlbmd0aDtiKyspYVtiXT09PWFbYi0xXSYmYS5zcGxpY2UoYi0tLDEpfXJldHVybiBhfSxtLm1hdGNoZXM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbShhLG51bGwsbnVsbCxiKX0sbS5tYXRjaGVzU2VsZWN0b3I9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbShiLG51bGwsbnVsbCxbYV0pLmxlbmd0aD4wfSxtLmZpbmQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZixnLGgsaTtpZighYSlyZXR1cm5bXTtmb3IoZT0wLGY9by5vcmRlci5sZW5ndGg7ZTxmO2UrKyl7aD1vLm9yZGVyW2VdO2lmKGc9by5sZWZ0TWF0Y2hbaF0uZXhlYyhhKSl7aT1nWzFdLGcuc3BsaWNlKDEsMSk7aWYoaS5zdWJzdHIoaS5sZW5ndGgtMSkhPT0iXFwiKXtnWzFdPShnWzFdfHwiIikucmVwbGFjZShqLCIiKSxkPW8uZmluZFtoXShnLGIsYyk7aWYoZCE9bnVsbCl7YT1hLnJlcGxhY2Uoby5tYXRjaFtoXSwiIik7YnJlYWt9fX19ZHx8KGQ9dHlwZW9mIGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUhPSJ1bmRlZmluZWQiP2IuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKTpbXSk7cmV0dXJue3NldDpkLGV4cHI6YX19LG0uZmlsdGVyPWZ1bmN0aW9uKGEsYyxkLGUpe3ZhciBmLGcsaCxpLGosayxsLG4scCxxPWEscj1bXSxzPWMsdD1jJiZjWzBdJiZtLmlzWE1MKGNbMF0pO3doaWxlKGEmJmMubGVuZ3RoKXtmb3IoaCBpbiBvLmZpbHRlcilpZigoZj1vLmxlZnRNYXRjaFtoXS5leGVjKGEpKSE9bnVsbCYmZlsyXSl7az1vLmZpbHRlcltoXSxsPWZbMV0sZz0hMSxmLnNwbGljZSgxLDEpO2lmKGwuc3Vic3RyKGwubGVuZ3RoLTEpPT09IlxcIiljb250aW51ZTtzPT09ciYmKHI9W10pO2lmKG8ucHJlRmlsdGVyW2hdKXtmPW8ucHJlRmlsdGVyW2hdKGYscyxkLHIsZSx0KTtpZighZilnPWk9ITA7ZWxzZSBpZihmPT09ITApY29udGludWV9aWYoZilmb3Iobj0wOyhqPXNbbl0pIT1udWxsO24rKylqJiYoaT1rKGosZixuLHMpLHA9ZV5pLGQmJmkhPW51bGw/cD9nPSEwOnNbbl09ITE6cCYmKHIucHVzaChqKSxnPSEwKSk7aWYoaSE9PWIpe2R8fChzPXIpLGE9YS5yZXBsYWNlKG8ubWF0Y2hbaF0sIiIpO2lmKCFnKXJldHVybltdO2JyZWFrfX1pZihhPT09cSlpZihnPT1udWxsKW0uZXJyb3IoYSk7ZWxzZSBicmVhaztxPWF9cmV0dXJuIHN9LG0uZXJyb3I9ZnVuY3Rpb24oYSl7dGhyb3cgbmV3IEVycm9yKCJTeW50YXggZXJyb3IsIHVucmVjb2duaXplZCBleHByZXNzaW9uOiAiK2EpfTt2YXIgbj1tLmdldFRleHQ9ZnVuY3Rpb24oYSl7dmFyIGIsYyxkPWEubm9kZVR5cGUsZT0iIjtpZihkKXtpZihkPT09MXx8ZD09PTkpe2lmKHR5cGVvZiBhLnRleHRDb250ZW50PT0ic3RyaW5nIilyZXR1cm4gYS50ZXh0Q29udGVudDtpZih0eXBlb2YgYS5pbm5lclRleHQ9PSJzdHJpbmciKXJldHVybiBhLmlubmVyVGV4dC5yZXBsYWNlKGssIiIpO2ZvcihhPWEuZmlyc3RDaGlsZDthO2E9YS5uZXh0U2libGluZyllKz1uKGEpfWVsc2UgaWYoZD09PTN8fGQ9PT00KXJldHVybiBhLm5vZGVWYWx1ZX1lbHNlIGZvcihiPTA7Yz1hW2JdO2IrKyljLm5vZGVUeXBlIT09OCYmKGUrPW4oYykpO3JldHVybiBlfSxvPW0uc2VsZWN0b3JzPXtvcmRlcjpbIklEIiwiTkFNRSIsIlRBRyJdLG1hdGNoOntJRDovIygoPzpbXHdcdTAwYzAtXHVGRkZGXC1dfFxcLikrKS8sQ0xBU1M6L1wuKCg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSspLyxOQU1FOi9cW25hbWU9WyciXSooKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKylbJyJdKlxdLyxBVFRSOi9cW1xzKigoPzpbXHdcdTAwYzAtXHVGRkZGXC1dfFxcLikrKVxzKig/OihcUz89KVxzKig/OihbJyJdKSguKj8pXDN8KCM/KD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKil8KXwpXHMqXF0vLFRBRzovXigoPzpbXHdcdTAwYzAtXHVGRkZGXCpcLV18XFwuKSspLyxDSElMRDovOihvbmx5fG50aHxsYXN0fGZpcnN0KS1jaGlsZCg/OlwoXHMqKGV2ZW58b2RkfCg/OlsrXC1dP1xkK3woPzpbK1wtXT9cZCopP25ccyooPzpbK1wtXVxzKlxkKyk/KSlccypcKSk/LyxQT1M6LzoobnRofGVxfGd0fGx0fGZpcnN0fGxhc3R8ZXZlbnxvZGQpKD86XCgoXGQqKVwpKT8oPz1bXlwtXXwkKS8sUFNFVURPOi86KCg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSspKD86XCgoWyciXT8pKCg/OlwoW15cKV0rXCl8W15cKFwpXSopKylcMlwpKT8vfSxsZWZ0TWF0Y2g6e30sYXR0ck1hcDp7ImNsYXNzIjoiY2xhc3NOYW1lIiwiZm9yIjoiaHRtbEZvciJ9LGF0dHJIYW5kbGU6e2hyZWY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJocmVmIil9LHR5cGU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJ0eXBlIil9fSxyZWxhdGl2ZTp7IisiOmZ1bmN0aW9uKGEsYil7dmFyIGM9dHlwZW9mIGI9PSJzdHJpbmciLGQ9YyYmIWwudGVzdChiKSxlPWMmJiFkO2QmJihiPWIudG9Mb3dlckNhc2UoKSk7Zm9yKHZhciBmPTAsZz1hLmxlbmd0aCxoO2Y8ZztmKyspaWYoaD1hW2ZdKXt3aGlsZSgoaD1oLnByZXZpb3VzU2libGluZykmJmgubm9kZVR5cGUhPT0xKTthW2ZdPWV8fGgmJmgubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWI/aHx8ITE6aD09PWJ9ZSYmbS5maWx0ZXIoYixhLCEwKX0sIj4iOmZ1bmN0aW9uKGEsYil7dmFyIGMsZD10eXBlb2YgYj09InN0cmluZyIsZT0wLGY9YS5sZW5ndGg7aWYoZCYmIWwudGVzdChiKSl7Yj1iLnRvTG93ZXJDYXNlKCk7Zm9yKDtlPGY7ZSsrKXtjPWFbZV07aWYoYyl7dmFyIGc9Yy5wYXJlbnROb2RlO2FbZV09Zy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09Yj9nOiExfX19ZWxzZXtmb3IoO2U8ZjtlKyspYz1hW2VdLGMmJihhW2VdPWQ/Yy5wYXJlbnROb2RlOmMucGFyZW50Tm9kZT09PWIpO2QmJm0uZmlsdGVyKGIsYSwhMCl9fSwiIjpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZj1lKyssZz14O3R5cGVvZiBiPT0ic3RyaW5nIiYmIWwudGVzdChiKSYmKGI9Yi50b0xvd2VyQ2FzZSgpLGQ9YixnPXcpLGcoInBhcmVudE5vZGUiLGIsZixhLGQsYyl9LCJ+IjpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZj1lKyssZz14O3R5cGVvZiBiPT0ic3RyaW5nIiYmIWwudGVzdChiKSYmKGI9Yi50b0xvd2VyQ2FzZSgpLGQ9YixnPXcpLGcoInByZXZpb3VzU2libGluZyIsYixmLGEsZCxjKX19LGZpbmQ6e0lEOmZ1bmN0aW9uKGEsYixjKXtpZih0eXBlb2YgYi5nZXRFbGVtZW50QnlJZCE9InVuZGVmaW5lZCImJiFjKXt2YXIgZD1iLmdldEVsZW1lbnRCeUlkKGFbMV0pO3JldHVybiBkJiZkLnBhcmVudE5vZGU/W2RdOltdfX0sTkFNRTpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBiLmdldEVsZW1lbnRzQnlOYW1lIT0idW5kZWZpbmVkIil7dmFyIGM9W10sZD1iLmdldEVsZW1lbnRzQnlOYW1lKGFbMV0pO2Zvcih2YXIgZT0wLGY9ZC5sZW5ndGg7ZTxmO2UrKylkW2VdLmdldEF0dHJpYnV0ZSgibmFtZSIpPT09YVsxXSYmYy5wdXNoKGRbZV0pO3JldHVybiBjLmxlbmd0aD09PTA/bnVsbDpjfX0sVEFHOmZ1bmN0aW9uKGEsYil7aWYodHlwZW9mIGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUhPSJ1bmRlZmluZWQiKXJldHVybiBiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGFbMV0pfX0scHJlRmlsdGVyOntDTEFTUzpmdW5jdGlvbihhLGIsYyxkLGUsZil7YT0iICIrYVsxXS5yZXBsYWNlKGosIiIpKyIgIjtpZihmKXJldHVybiBhO2Zvcih2YXIgZz0wLGg7KGg9YltnXSkhPW51bGw7ZysrKWgmJihlXihoLmNsYXNzTmFtZSYmKCIgIitoLmNsYXNzTmFtZSsiICIpLnJlcGxhY2UoL1tcdFxuXHJdL2csIiAiKS5pbmRleE9mKGEpPj0wKT9jfHxkLnB1c2goaCk6YyYmKGJbZ109ITEpKTtyZXR1cm4hMX0sSUQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGFbMV0ucmVwbGFjZShqLCIiKX0sVEFHOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGFbMV0ucmVwbGFjZShqLCIiKS50b0xvd2VyQ2FzZSgpfSxDSElMRDpmdW5jdGlvbihhKXtpZihhWzFdPT09Im50aCIpe2FbMl18fG0uZXJyb3IoYVswXSksYVsyXT1hWzJdLnJlcGxhY2UoL15cK3xccyovZywiIik7dmFyIGI9LygtPykoXGQqKSg/Om4oWytcLV0/XGQqKSk/Ly5leGVjKGFbMl09PT0iZXZlbiImJiIybiJ8fGFbMl09PT0ib2RkIiYmIjJuKzEifHwhL1xELy50ZXN0KGFbMl0pJiYiMG4rIithWzJdfHxhWzJdKTthWzJdPWJbMV0rKGJbMl18fDEpLTAsYVszXT1iWzNdLTB9ZWxzZSBhWzJdJiZtLmVycm9yKGFbMF0pO2FbMF09ZSsrO3JldHVybiBhfSxBVFRSOmZ1bmN0aW9uKGEsYixjLGQsZSxmKXt2YXIgZz1hWzFdPWFbMV0ucmVwbGFjZShqLCIiKTshZiYmby5hdHRyTWFwW2ddJiYoYVsxXT1vLmF0dHJNYXBbZ10pLGFbNF09KGFbNF18fGFbNV18fCIiKS5yZXBsYWNlKGosIiIpLGFbMl09PT0ifj0iJiYoYVs0XT0iICIrYVs0XSsiICIpO3JldHVybiBhfSxQU0VVRE86ZnVuY3Rpb24oYixjLGQsZSxmKXtpZihiWzFdPT09Im5vdCIpaWYoKGEuZXhlYyhiWzNdKXx8IiIpLmxlbmd0aD4xfHwvXlx3Ly50ZXN0KGJbM10pKWJbM109bShiWzNdLG51bGwsbnVsbCxjKTtlbHNle3ZhciBnPW0uZmlsdGVyKGJbM10sYyxkLCEwXmYpO2R8fGUucHVzaC5hcHBseShlLGcpO3JldHVybiExfWVsc2UgaWYoby5tYXRjaC5QT1MudGVzdChiWzBdKXx8by5tYXRjaC5DSElMRC50ZXN0KGJbMF0pKXJldHVybiEwO3JldHVybiBifSxQT1M6ZnVuY3Rpb24oYSl7YS51bnNoaWZ0KCEwKTtyZXR1cm4gYX19LGZpbHRlcnM6e2VuYWJsZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZGlzYWJsZWQ9PT0hMSYmYS50eXBlIT09ImhpZGRlbiJ9LGRpc2FibGVkOmZ1bmN0aW9uKGEpe3JldHVybiBhLmRpc2FibGVkPT09ITB9LGNoZWNrZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuY2hlY2tlZD09PSEwfSxzZWxlY3RlZDpmdW5jdGlvbihhKXthLnBhcmVudE5vZGUmJmEucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4O3JldHVybiBhLnNlbGVjdGVkPT09ITB9LHBhcmVudDpmdW5jdGlvbihhKXtyZXR1cm4hIWEuZmlyc3RDaGlsZH0sZW1wdHk6ZnVuY3Rpb24oYSl7cmV0dXJuIWEuZmlyc3RDaGlsZH0saGFzOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4hIW0oY1szXSxhKS5sZW5ndGh9LGhlYWRlcjpmdW5jdGlvbihhKXtyZXR1cm4vaFxkL2kudGVzdChhLm5vZGVOYW1lKX0sdGV4dDpmdW5jdGlvbihhKXt2YXIgYj1hLmdldEF0dHJpYnV0ZSgidHlwZSIpLGM9YS50eXBlO3JldHVybiBhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0iaW5wdXQiJiYidGV4dCI9PT1jJiYoYj09PWN8fGI9PT1udWxsKX0scmFkaW86ZnVuY3Rpb24oYSl7cmV0dXJuIGEubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJpbnB1dCImJiJyYWRpbyI9PT1hLnR5cGV9LGNoZWNrYm94OmZ1bmN0aW9uKGEpe3JldHVybiBhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0iaW5wdXQiJiYiY2hlY2tib3giPT09YS50eXBlfSxmaWxlOmZ1bmN0aW9uKGEpe3JldHVybiBhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0iaW5wdXQiJiYiZmlsZSI9PT1hLnR5cGV9LHBhc3N3b3JkOmZ1bmN0aW9uKGEpe3JldHVybiBhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0iaW5wdXQiJiYicGFzc3dvcmQiPT09YS50eXBlfSxzdWJtaXQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybihiPT09ImlucHV0Inx8Yj09PSJidXR0b24iKSYmInN1Ym1pdCI9PT1hLnR5cGV9LGltYWdlOmZ1bmN0aW9uKGEpe3JldHVybiBhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0iaW5wdXQiJiYiaW1hZ2UiPT09YS50eXBlfSxyZXNldDpmdW5jdGlvbihhKXt2YXIgYj1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuKGI9PT0iaW5wdXQifHxiPT09ImJ1dHRvbiIpJiYicmVzZXQiPT09YS50eXBlfSxidXR0b246ZnVuY3Rpb24oYSl7dmFyIGI9YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiBiPT09ImlucHV0IiYmImJ1dHRvbiI9PT1hLnR5cGV8fGI9PT0iYnV0dG9uIn0saW5wdXQ6ZnVuY3Rpb24oYSl7cmV0dXJuL2lucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24vaS50ZXN0KGEubm9kZU5hbWUpfSxmb2N1czpmdW5jdGlvbihhKXtyZXR1cm4gYT09PWEub3duZXJEb2N1bWVudC5hY3RpdmVFbGVtZW50fX0sc2V0RmlsdGVyczp7Zmlyc3Q6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYj09PTB9LGxhc3Q6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIGI9PT1kLmxlbmd0aC0xfSxldmVuOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGIlMj09PTB9LG9kZDpmdW5jdGlvbihhLGIpe3JldHVybiBiJTI9PT0xfSxsdDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGI8Y1szXS0wfSxndDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGI+Y1szXS0wfSxudGg6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBjWzNdLTA9PT1ifSxlcTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGNbM10tMD09PWJ9fSxmaWx0ZXI6e1BTRVVETzpmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1iWzFdLGY9by5maWx0ZXJzW2VdO2lmKGYpcmV0dXJuIGYoYSxjLGIsZCk7aWYoZT09PSJjb250YWlucyIpcmV0dXJuKGEudGV4dENvbnRlbnR8fGEuaW5uZXJUZXh0fHxuKFthXSl8fCIiKS5pbmRleE9mKGJbM10pPj0wO2lmKGU9PT0ibm90Iil7dmFyIGc9YlszXTtmb3IodmFyIGg9MCxpPWcubGVuZ3RoO2g8aTtoKyspaWYoZ1toXT09PWEpcmV0dXJuITE7cmV0dXJuITB9bS5lcnJvcihlKX0sQ0hJTEQ6ZnVuY3Rpb24oYSxiKXt2YXIgYyxlLGYsZyxoLGksaixrPWJbMV0sbD1hO3N3aXRjaChrKXtjYXNlIm9ubHkiOmNhc2UiZmlyc3QiOndoaWxlKGw9bC5wcmV2aW91c1NpYmxpbmcpaWYobC5ub2RlVHlwZT09PTEpcmV0dXJuITE7aWYoaz09PSJmaXJzdCIpcmV0dXJuITA7bD1hO2Nhc2UibGFzdCI6d2hpbGUobD1sLm5leHRTaWJsaW5nKWlmKGwubm9kZVR5cGU9PT0xKXJldHVybiExO3JldHVybiEwO2Nhc2UibnRoIjpjPWJbMl0sZT1iWzNdO2lmKGM9PT0xJiZlPT09MClyZXR1cm4hMDtmPWJbMF0sZz1hLnBhcmVudE5vZGU7aWYoZyYmKGdbZF0hPT1mfHwhYS5ub2RlSW5kZXgpKXtpPTA7Zm9yKGw9Zy5maXJzdENoaWxkO2w7bD1sLm5leHRTaWJsaW5nKWwubm9kZVR5cGU9PT0xJiYobC5ub2RlSW5kZXg9KytpKTtnW2RdPWZ9aj1hLm5vZGVJbmRleC1lO3JldHVybiBjPT09MD9qPT09MDpqJWM9PT0wJiZqL2M+PTB9fSxJRDpmdW5jdGlvbihhLGIpe3JldHVybiBhLm5vZGVUeXBlPT09MSYmYS5nZXRBdHRyaWJ1dGUoImlkIik9PT1ifSxUQUc6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYj09PSIqIiYmYS5ub2RlVHlwZT09PTF8fCEhYS5ub2RlTmFtZSYmYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09Yn0sQ0xBU1M6ZnVuY3Rpb24oYSxiKXtyZXR1cm4oIiAiKyhhLmNsYXNzTmFtZXx8YS5nZXRBdHRyaWJ1dGUoImNsYXNzIikpKyIgIikuaW5kZXhPZihiKT4tMX0sQVRUUjpmdW5jdGlvbihhLGIpe3ZhciBjPWJbMV0sZD1tLmF0dHI/bS5hdHRyKGEsYyk6by5hdHRySGFuZGxlW2NdP28uYXR0ckhhbmRsZVtjXShhKTphW2NdIT1udWxsP2FbY106YS5nZXRBdHRyaWJ1dGUoYyksZT1kKyIiLGY9YlsyXSxnPWJbNF07cmV0dXJuIGQ9PW51bGw/Zj09PSIhPSI6IWYmJm0uYXR0cj9kIT1udWxsOmY9PT0iPSI/ZT09PWc6Zj09PSIqPSI/ZS5pbmRleE9mKGcpPj0wOmY9PT0ifj0iPygiICIrZSsiICIpLmluZGV4T2YoZyk+PTA6Zz9mPT09IiE9Ij9lIT09ZzpmPT09Il49Ij9lLmluZGV4T2YoZyk9PT0wOmY9PT0iJD0iP2Uuc3Vic3RyKGUubGVuZ3RoLWcubGVuZ3RoKT09PWc6Zj09PSJ8PSI/ZT09PWd8fGUuc3Vic3RyKDAsZy5sZW5ndGgrMSk9PT1nKyItIjohMTplJiZkIT09ITF9LFBPUzpmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1iWzJdLGY9by5zZXRGaWx0ZXJzW2VdO2lmKGYpcmV0dXJuIGYoYSxjLGIsZCl9fX0scD1vLm1hdGNoLlBPUyxxPWZ1bmN0aW9uKGEsYil7cmV0dXJuIlxcIisoYi0wKzEpfTtmb3IodmFyIHIgaW4gby5tYXRjaClvLm1hdGNoW3JdPW5ldyBSZWdFeHAoby5tYXRjaFtyXS5zb3VyY2UrLyg/IVteXFtdKlxdKSg/IVteXChdKlwpKS8uc291cmNlKSxvLmxlZnRNYXRjaFtyXT1uZXcgUmVnRXhwKC8oXig/Oi58XHJ8XG4pKj8pLy5zb3VyY2Urby5tYXRjaFtyXS5zb3VyY2UucmVwbGFjZSgvXFwoXGQrKS9nLHEpKTt2YXIgcz1mdW5jdGlvbihhLGIpe2E9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSwwKTtpZihiKXtiLnB1c2guYXBwbHkoYixhKTtyZXR1cm4gYn1yZXR1cm4gYX07dHJ5e0FycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGMuZG9jdW1lbnRFbGVtZW50LmNoaWxkTm9kZXMsMClbMF0ubm9kZVR5cGV9Y2F0Y2godCl7cz1mdW5jdGlvbihhLGIpe3ZhciBjPTAsZD1ifHxbXTtpZihnLmNhbGwoYSk9PT0iW29iamVjdCBBcnJheV0iKUFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KGQsYSk7ZWxzZSBpZih0eXBlb2YgYS5sZW5ndGg9PSJudW1iZXIiKWZvcih2YXIgZT1hLmxlbmd0aDtjPGU7YysrKWQucHVzaChhW2NdKTtlbHNlIGZvcig7YVtjXTtjKyspZC5wdXNoKGFbY10pO3JldHVybiBkfX12YXIgdSx2O2MuZG9jdW1lbnRFbGVtZW50LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uP3U9ZnVuY3Rpb24oYSxiKXtpZihhPT09Yil7aD0hMDtyZXR1cm4gMH1pZighYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbnx8IWIuY29tcGFyZURvY3VtZW50UG9zaXRpb24pcmV0dXJuIGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24/LTE6MTtyZXR1cm4gYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSY0Py0xOjF9Oih1PWZ1bmN0aW9uKGEsYil7aWYoYT09PWIpe2g9ITA7cmV0dXJuIDB9aWYoYS5zb3VyY2VJbmRleCYmYi5zb3VyY2VJbmRleClyZXR1cm4gYS5zb3VyY2VJbmRleC1iLnNvdXJjZUluZGV4O3ZhciBjLGQsZT1bXSxmPVtdLGc9YS5wYXJlbnROb2RlLGk9Yi5wYXJlbnROb2RlLGo9ZztpZihnPT09aSlyZXR1cm4gdihhLGIpO2lmKCFnKXJldHVybi0xO2lmKCFpKXJldHVybiAxO3doaWxlKGopZS51bnNoaWZ0KGopLGo9ai5wYXJlbnROb2RlO2o9aTt3aGlsZShqKWYudW5zaGlmdChqKSxqPWoucGFyZW50Tm9kZTtjPWUubGVuZ3RoLGQ9Zi5sZW5ndGg7Zm9yKHZhciBrPTA7azxjJiZrPGQ7aysrKWlmKGVba10hPT1mW2tdKXJldHVybiB2KGVba10sZltrXSk7cmV0dXJuIGs9PT1jP3YoYSxmW2tdLC0xKTp2KGVba10sYiwxKX0sdj1mdW5jdGlvbihhLGIsYyl7aWYoYT09PWIpcmV0dXJuIGM7dmFyIGQ9YS5uZXh0U2libGluZzt3aGlsZShkKXtpZihkPT09YilyZXR1cm4tMTtkPWQubmV4dFNpYmxpbmd9cmV0dXJuIDF9KSxmdW5jdGlvbigpe3ZhciBhPWMuY3JlYXRlRWxlbWVudCgiZGl2IiksZD0ic2NyaXB0IisobmV3IERhdGUpLmdldFRpbWUoKSxlPWMuZG9jdW1lbnRFbGVtZW50O2EuaW5uZXJIVE1MPSI8YSBuYW1lPSciK2QrIicvPiIsZS5pbnNlcnRCZWZvcmUoYSxlLmZpcnN0Q2hpbGQpLGMuZ2V0RWxlbWVudEJ5SWQoZCkmJihvLmZpbmQuSUQ9ZnVuY3Rpb24oYSxjLGQpe2lmKHR5cGVvZiBjLmdldEVsZW1lbnRCeUlkIT0idW5kZWZpbmVkIiYmIWQpe3ZhciBlPWMuZ2V0RWxlbWVudEJ5SWQoYVsxXSk7cmV0dXJuIGU/ZS5pZD09PWFbMV18fHR5cGVvZiBlLmdldEF0dHJpYnV0ZU5vZGUhPSJ1bmRlZmluZWQiJiZlLmdldEF0dHJpYnV0ZU5vZGUoImlkIikubm9kZVZhbHVlPT09YVsxXT9bZV06YjpbXX19LG8uZmlsdGVyLklEPWZ1bmN0aW9uKGEsYil7dmFyIGM9dHlwZW9mIGEuZ2V0QXR0cmlidXRlTm9kZSE9InVuZGVmaW5lZCImJmEuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTtyZXR1cm4gYS5ub2RlVHlwZT09PTEmJmMmJmMubm9kZVZhbHVlPT09Yn0pLGUucmVtb3ZlQ2hpbGQoYSksZT1hPW51bGx9KCksZnVuY3Rpb24oKXt2YXIgYT1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpO2EuYXBwZW5kQ2hpbGQoYy5jcmVhdGVDb21tZW50KCIiKSksYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLmxlbmd0aD4wJiYoby5maW5kLlRBRz1mdW5jdGlvbihhLGIpe3ZhciBjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYVsxXSk7aWYoYVsxXT09PSIqIil7dmFyIGQ9W107Zm9yKHZhciBlPTA7Y1tlXTtlKyspY1tlXS5ub2RlVHlwZT09PTEmJmQucHVzaChjW2VdKTtjPWR9cmV0dXJuIGN9KSxhLmlubmVySFRNTD0iPGEgaHJlZj0nIyc+PC9hPiIsYS5maXJzdENoaWxkJiZ0eXBlb2YgYS5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSE9InVuZGVmaW5lZCImJmEuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoImhyZWYiKSE9PSIjIiYmKG8uYXR0ckhhbmRsZS5ocmVmPWZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgiaHJlZiIsMil9KSxhPW51bGx9KCksYy5xdWVyeVNlbGVjdG9yQWxsJiZmdW5jdGlvbigpe3ZhciBhPW0sYj1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGQ9Il9fc2l6emxlX18iO2IuaW5uZXJIVE1MPSI8cCBjbGFzcz0nVEVTVCc+PC9wPiI7aWYoIWIucXVlcnlTZWxlY3RvckFsbHx8Yi5xdWVyeVNlbGVjdG9yQWxsKCIuVEVTVCIpLmxlbmd0aCE9PTApe209ZnVuY3Rpb24oYixlLGYsZyl7ZT1lfHxjO2lmKCFnJiYhbS5pc1hNTChlKSl7dmFyIGg9L14oXHcrJCl8XlwuKFtcd1wtXSskKXxeIyhbXHdcLV0rJCkvLmV4ZWMoYik7aWYoaCYmKGUubm9kZVR5cGU9PT0xfHxlLm5vZGVUeXBlPT09OSkpe2lmKGhbMV0pcmV0dXJuIHMoZS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKSxmKTtpZihoWzJdJiZvLmZpbmQuQ0xBU1MmJmUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSlyZXR1cm4gcyhlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoaFsyXSksZil9aWYoZS5ub2RlVHlwZT09PTkpe2lmKGI9PT0iYm9keSImJmUuYm9keSlyZXR1cm4gcyhbZS5ib2R5XSxmKTtpZihoJiZoWzNdKXt2YXIgaT1lLmdldEVsZW1lbnRCeUlkKGhbM10pO2lmKCFpfHwhaS5wYXJlbnROb2RlKXJldHVybiBzKFtdLGYpO2lmKGkuaWQ9PT1oWzNdKXJldHVybiBzKFtpXSxmKX10cnl7cmV0dXJuIHMoZS5xdWVyeVNlbGVjdG9yQWxsKGIpLGYpfWNhdGNoKGope319ZWxzZSBpZihlLm5vZGVUeXBlPT09MSYmZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIT09Im9iamVjdCIpe3ZhciBrPWUsbD1lLmdldEF0dHJpYnV0ZSgiaWQiKSxuPWx8fGQscD1lLnBhcmVudE5vZGUscT0vXlxzKlsrfl0vLnRlc3QoYik7bD9uPW4ucmVwbGFjZSgvJy9nLCJcXCQmIik6ZS5zZXRBdHRyaWJ1dGUoImlkIixuKSxxJiZwJiYoZT1lLnBhcmVudE5vZGUpO3RyeXtpZighcXx8cClyZXR1cm4gcyhlLnF1ZXJ5U2VsZWN0b3JBbGwoIltpZD0nIituKyInXSAiK2IpLGYpfWNhdGNoKHIpe31maW5hbGx5e2x8fGsucmVtb3ZlQXR0cmlidXRlKCJpZCIpfX19cmV0dXJuIGEoYixlLGYsZyl9O2Zvcih2YXIgZSBpbiBhKW1bZV09YVtlXTtiPW51bGx9fSgpLGZ1bmN0aW9uKCl7dmFyIGE9Yy5kb2N1bWVudEVsZW1lbnQsYj1hLm1hdGNoZXNTZWxlY3Rvcnx8YS5tb3pNYXRjaGVzU2VsZWN0b3J8fGEud2Via2l0TWF0Y2hlc1NlbGVjdG9yfHxhLm1zTWF0Y2hlc1NlbGVjdG9yO2lmKGIpe3ZhciBkPSFiLmNhbGwoYy5jcmVhdGVFbGVtZW50KCJkaXYiKSwiZGl2IiksZT0hMTt0cnl7Yi5jYWxsKGMuZG9jdW1lbnRFbGVtZW50LCJbdGVzdCE9JyddOnNpenpsZSIpfWNhdGNoKGYpe2U9ITB9bS5tYXRjaGVzU2VsZWN0b3I9ZnVuY3Rpb24oYSxjKXtjPWMucmVwbGFjZSgvXD1ccyooW14nIlxdXSopXHMqXF0vZywiPSckMSddIik7aWYoIW0uaXNYTUwoYSkpdHJ5e2lmKGV8fCFvLm1hdGNoLlBTRVVETy50ZXN0KGMpJiYhLyE9Ly50ZXN0KGMpKXt2YXIgZj1iLmNhbGwoYSxjKTtpZihmfHwhZHx8YS5kb2N1bWVudCYmYS5kb2N1bWVudC5ub2RlVHlwZSE9PTExKXJldHVybiBmfX1jYXRjaChnKXt9cmV0dXJuIG0oYyxudWxsLG51bGwsW2FdKS5sZW5ndGg+MH19fSgpLGZ1bmN0aW9uKCl7dmFyIGE9Yy5jcmVhdGVFbGVtZW50KCJkaXYiKTthLmlubmVySFRNTD0iPGRpdiBjbGFzcz0ndGVzdCBlJz48L2Rpdj48ZGl2IGNsYXNzPSd0ZXN0Jz48L2Rpdj4iO2lmKCEhYS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiZhLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImUiKS5sZW5ndGghPT0wKXthLmxhc3RDaGlsZC5jbGFzc05hbWU9ImUiO2lmKGEuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiZSIpLmxlbmd0aD09PTEpcmV0dXJuO28ub3JkZXIuc3BsaWNlKDEsMCwiQ0xBU1MiKSxvLmZpbmQuQ0xBU1M9ZnVuY3Rpb24oYSxiLGMpe2lmKHR5cGVvZiBiLmdldEVsZW1lbnRzQnlDbGFzc05hbWUhPSJ1bmRlZmluZWQiJiYhYylyZXR1cm4gYi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGFbMV0pfSxhPW51bGx9fSgpLGMuZG9jdW1lbnRFbGVtZW50LmNvbnRhaW5zP20uY29udGFpbnM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSE9PWImJihhLmNvbnRhaW5zP2EuY29udGFpbnMoYik6ITApfTpjLmRvY3VtZW50RWxlbWVudC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbj9tLmNvbnRhaW5zPWZ1bmN0aW9uKGEsYil7cmV0dXJuISEoYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSYxNil9Om0uY29udGFpbnM9ZnVuY3Rpb24oKXtyZXR1cm4hMX0sbS5pc1hNTD1mdW5jdGlvbihhKXt2YXIgYj0oYT9hLm93bmVyRG9jdW1lbnR8fGE6MCkuZG9jdW1lbnRFbGVtZW50O3JldHVybiBiP2Iubm9kZU5hbWUhPT0iSFRNTCI6ITF9O3ZhciB5PWZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlPVtdLGY9IiIsZz1iLm5vZGVUeXBlP1tiXTpiO3doaWxlKGQ9by5tYXRjaC5QU0VVRE8uZXhlYyhhKSlmKz1kWzBdLGE9YS5yZXBsYWNlKG8ubWF0Y2guUFNFVURPLCIiKTthPW8ucmVsYXRpdmVbYV0/YSsiKiI6YTtmb3IodmFyIGg9MCxpPWcubGVuZ3RoO2g8aTtoKyspbShhLGdbaF0sZSxjKTtyZXR1cm4gbS5maWx0ZXIoZixlKX07bS5hdHRyPWYuYXR0cixtLnNlbGVjdG9ycy5hdHRyTWFwPXt9LGYuZmluZD1tLGYuZXhwcj1tLnNlbGVjdG9ycyxmLmV4cHJbIjoiXT1mLmV4cHIuZmlsdGVycyxmLnVuaXF1ZT1tLnVuaXF1ZVNvcnQsZi50ZXh0PW0uZ2V0VGV4dCxmLmlzWE1MRG9jPW0uaXNYTUwsZi5jb250YWlucz1tLmNvbnRhaW5zfSgpO3ZhciBMPS9VbnRpbCQvLE09L14oPzpwYXJlbnRzfHByZXZVbnRpbHxwcmV2QWxsKS8sTj0vLC8sTz0vXi5bXjojXFtcLixdKiQvLFA9QXJyYXkucHJvdG90eXBlLnNsaWNlLFE9Zi5leHByLm1hdGNoLlBPUyxSPXtjaGlsZHJlbjohMCxjb250ZW50czohMCxuZXh0OiEwLHByZXY6ITB9O2YuZm4uZXh0ZW5kKHtmaW5kOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMsYyxkO2lmKHR5cGVvZiBhIT0ic3RyaW5nIilyZXR1cm4gZihhKS5maWx0ZXIoZnVuY3Rpb24oKXtmb3IoYz0wLGQ9Yi5sZW5ndGg7YzxkO2MrKylpZihmLmNvbnRhaW5zKGJbY10sdGhpcykpcmV0dXJuITB9KTt2YXIgZT10aGlzLnB1c2hTdGFjaygiIiwiZmluZCIsYSksZyxoLGk7Zm9yKGM9MCxkPXRoaXMubGVuZ3RoO2M8ZDtjKyspe2c9ZS5sZW5ndGgsZi5maW5kKGEsdGhpc1tjXSxlKTtpZihjPjApZm9yKGg9ZztoPGUubGVuZ3RoO2grKylmb3IoaT0wO2k8ZztpKyspaWYoZVtpXT09PWVbaF0pe2Uuc3BsaWNlKGgtLSwxKTticmVha319cmV0dXJuIGV9LGhhczpmdW5jdGlvbihhKXt2YXIgYj1mKGEpO3JldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpe2Zvcih2YXIgYT0wLGM9Yi5sZW5ndGg7YTxjO2ErKylpZihmLmNvbnRhaW5zKHRoaXMsYlthXSkpcmV0dXJuITB9KX0sbm90OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnB1c2hTdGFjayhUKHRoaXMsYSwhMSksIm5vdCIsYSl9LGZpbHRlcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soVCh0aGlzLGEsITApLCJmaWx0ZXIiLGEpfSxpczpmdW5jdGlvbihhKXtyZXR1cm4hIWEmJih0eXBlb2YgYT09InN0cmluZyI/US50ZXN0KGEpP2YoYSx0aGlzLmNvbnRleHQpLmluZGV4KHRoaXNbMF0pPj0wOmYuZmlsdGVyKGEsdGhpcykubGVuZ3RoPjA6dGhpcy5maWx0ZXIoYSkubGVuZ3RoPjApfSxjbG9zZXN0OmZ1bmN0aW9uKGEsYil7dmFyIGM9W10sZCxlLGc9dGhpc1swXTtpZihmLmlzQXJyYXkoYSkpe3ZhciBoPTE7d2hpbGUoZyYmZy5vd25lckRvY3VtZW50JiZnIT09Yil7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmKGcpLmlzKGFbZF0pJiZjLnB1c2goe3NlbGVjdG9yOmFbZF0sZWxlbTpnLGxldmVsOmh9KTtnPWcucGFyZW50Tm9kZSxoKyt9cmV0dXJuIGN9dmFyIGk9US50ZXN0KGEpfHx0eXBlb2YgYSE9InN0cmluZyI/ZihhLGJ8fHRoaXMuY29udGV4dCk6MDtmb3IoZD0wLGU9dGhpcy5sZW5ndGg7ZDxlO2QrKyl7Zz10aGlzW2RdO3doaWxlKGcpe2lmKGk/aS5pbmRleChnKT4tMTpmLmZpbmQubWF0Y2hlc1NlbGVjdG9yKGcsYSkpe2MucHVzaChnKTticmVha31nPWcucGFyZW50Tm9kZTtpZighZ3x8IWcub3duZXJEb2N1bWVudHx8Zz09PWJ8fGcubm9kZVR5cGU9PT0xMSlicmVha319Yz1jLmxlbmd0aD4xP2YudW5pcXVlKGMpOmM7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGMsImNsb3Nlc3QiLGEpfSxpbmRleDpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4gdGhpc1swXSYmdGhpc1swXS5wYXJlbnROb2RlP3RoaXMucHJldkFsbCgpLmxlbmd0aDotMTtpZih0eXBlb2YgYT09InN0cmluZyIpcmV0dXJuIGYuaW5BcnJheSh0aGlzWzBdLGYoYSkpO3JldHVybiBmLmluQXJyYXkoYS5qcXVlcnk/YVswXTphLHRoaXMpfSxhZGQ6ZnVuY3Rpb24oYSxiKXt2YXIgYz10eXBlb2YgYT09InN0cmluZyI/ZihhLGIpOmYubWFrZUFycmF5KGEmJmEubm9kZVR5cGU/W2FdOmEpLGQ9Zi5tZXJnZSh0aGlzLmdldCgpLGMpO3JldHVybiB0aGlzLnB1c2hTdGFjayhTKGNbMF0pfHxTKGRbMF0pP2Q6Zi51bmlxdWUoZCkpfSxhbmRTZWxmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYWRkKHRoaXMucHJldk9iamVjdCl9fSksZi5lYWNoKHtwYXJlbnQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5wYXJlbnROb2RlO3JldHVybiBiJiZiLm5vZGVUeXBlIT09MTE/YjpudWxsfSxwYXJlbnRzOmZ1bmN0aW9uKGEpe3JldHVybiBmLmRpcihhLCJwYXJlbnROb2RlIil9LHBhcmVudHNVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGYuZGlyKGEsInBhcmVudE5vZGUiLGMpfSxuZXh0OmZ1bmN0aW9uKGEpe3JldHVybiBmLm50aChhLDIsIm5leHRTaWJsaW5nIil9LHByZXY6ZnVuY3Rpb24oYSl7cmV0dXJuIGYubnRoKGEsMiwicHJldmlvdXNTaWJsaW5nIil9LG5leHRBbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIGYuZGlyKGEsIm5leHRTaWJsaW5nIil9LHByZXZBbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIGYuZGlyKGEsInByZXZpb3VzU2libGluZyIpfSxuZXh0VW50aWw6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBmLmRpcihhLCJuZXh0U2libGluZyIsYyl9LHByZXZVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGYuZGlyKGEsInByZXZpb3VzU2libGluZyIsYyl9LHNpYmxpbmdzOmZ1bmN0aW9uKGEpe3JldHVybiBmLnNpYmxpbmcoYS5wYXJlbnROb2RlLmZpcnN0Q2hpbGQsYSl9LGNoaWxkcmVuOmZ1bmN0aW9uKGEpe3JldHVybiBmLnNpYmxpbmcoYS5maXJzdENoaWxkKX0sY29udGVudHM6ZnVuY3Rpb24oYSl7cmV0dXJuIGYubm9kZU5hbWUoYSwiaWZyYW1lIik/YS5jb250ZW50RG9jdW1lbnR8fGEuY29udGVudFdpbmRvdy5kb2N1bWVudDpmLm1ha2VBcnJheShhLmNoaWxkTm9kZXMpfX0sZnVuY3Rpb24oYSxiKXtmLmZuW2FdPWZ1bmN0aW9uKGMsZCl7dmFyIGU9Zi5tYXAodGhpcyxiLGMpO0wudGVzdChhKXx8KGQ9YyksZCYmdHlwZW9mIGQ9PSJzdHJpbmciJiYoZT1mLmZpbHRlcihkLGUpKSxlPXRoaXMubGVuZ3RoPjEmJiFSW2FdP2YudW5pcXVlKGUpOmUsKHRoaXMubGVuZ3RoPjF8fE4udGVzdChkKSkmJk0udGVzdChhKSYmKGU9ZS5yZXZlcnNlKCkpO3JldHVybiB0aGlzLnB1c2hTdGFjayhlLGEsUC5jYWxsKGFyZ3VtZW50cykuam9pbigiLCIpKX19KSxmLmV4dGVuZCh7ZmlsdGVyOmZ1bmN0aW9uKGEsYixjKXtjJiYoYT0iOm5vdCgiK2ErIikiKTtyZXR1cm4gYi5sZW5ndGg9PT0xP2YuZmluZC5tYXRjaGVzU2VsZWN0b3IoYlswXSxhKT9bYlswXV06W106Zi5maW5kLm1hdGNoZXMoYSxiKX0sZGlyOmZ1bmN0aW9uKGEsYyxkKXt2YXIgZT1bXSxnPWFbY107d2hpbGUoZyYmZy5ub2RlVHlwZSE9PTkmJihkPT09Ynx8Zy5ub2RlVHlwZSE9PTF8fCFmKGcpLmlzKGQpKSlnLm5vZGVUeXBlPT09MSYmZS5wdXNoKGcpLGc9Z1tjXTtyZXR1cm4gZX0sbnRoOmZ1bmN0aW9uKGEsYixjLGQpe2I9Ynx8MTt2YXIgZT0wO2Zvcig7YTthPWFbY10paWYoYS5ub2RlVHlwZT09PTEmJisrZT09PWIpYnJlYWs7cmV0dXJuIGF9LHNpYmxpbmc6ZnVuY3Rpb24oYSxiKXt2YXIgYz1bXTtmb3IoO2E7YT1hLm5leHRTaWJsaW5nKWEubm9kZVR5cGU9PT0xJiZhIT09YiYmYy5wdXNoKGEpO3JldHVybiBjfX0pO3ZhciBWPSJhYmJyfGFydGljbGV8YXNpZGV8YXVkaW98Y2FudmFzfGRhdGFsaXN0fGRldGFpbHN8ZmlnY2FwdGlvbnxmaWd1cmV8Zm9vdGVyfGhlYWRlcnxoZ3JvdXB8bWFya3xtZXRlcnxuYXZ8b3V0cHV0fHByb2dyZXNzfHNlY3Rpb258c3VtbWFyeXx0aW1lfHZpZGVvIixXPS8galF1ZXJ5XGQrPSIoPzpcZCt8bnVsbCkiL2csWD0vXlxzKy8sWT0vPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbXHc6XSspW14+XSopXC8+L2lnLFo9LzwoW1x3Ol0rKS8sJD0vPHRib2R5L2ksXz0vPHwmIz9cdys7LyxiYT0vPCg/OnNjcmlwdHxzdHlsZSkvaSxiYj0vPCg/OnNjcmlwdHxvYmplY3R8ZW1iZWR8b3B0aW9ufHN0eWxlKS9pLGJjPW5ldyBSZWdFeHAoIjwoPzoiK1YrIikiLCJpIiksYmQ9L2NoZWNrZWRccyooPzpbXj1dfD1ccyouY2hlY2tlZC4pL2ksYmU9L1wvKGphdmF8ZWNtYSlzY3JpcHQvaSxiZj0vXlxzKjwhKD86XFtDREFUQVxbfFwtXC0pLyxiZz17b3B0aW9uOlsxLCI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+IiwiPC9zZWxlY3Q+Il0sbGVnZW5kOlsxLCI8ZmllbGRzZXQ+IiwiPC9maWVsZHNldD4iXSx0aGVhZDpbMSwiPHRhYmxlPiIsIjwvdGFibGU+Il0sdHI6WzIsIjx0YWJsZT48dGJvZHk+IiwiPC90Ym9keT48L3RhYmxlPiJdLHRkOlszLCI8dGFibGU+PHRib2R5Pjx0cj4iLCI8L3RyPjwvdGJvZHk+PC90YWJsZT4iXSxjb2w6WzIsIjx0YWJsZT48dGJvZHk+PC90Ym9keT48Y29sZ3JvdXA+IiwiPC9jb2xncm91cD48L3RhYmxlPiJdLGFyZWE6WzEsIjxtYXA+IiwiPC9tYXA+Il0sX2RlZmF1bHQ6WzAsIiIsIiJdfSxiaD1VKGMpO2JnLm9wdGdyb3VwPWJnLm9wdGlvbixiZy50Ym9keT1iZy50Zm9vdD1iZy5jb2xncm91cD1iZy5jYXB0aW9uPWJnLnRoZWFkLGJnLnRoPWJnLnRkLGYuc3VwcG9ydC5odG1sU2VyaWFsaXplfHwoYmcuX2RlZmF1bHQ9WzEsImRpdjxkaXY+IiwiPC9kaXY+Il0pLGYuZm4uZXh0ZW5kKHt0ZXh0OmZ1bmN0aW9uKGEpe2lmKGYuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe3ZhciBjPWYodGhpcyk7Yy50ZXh0KGEuY2FsbCh0aGlzLGIsYy50ZXh0KCkpKX0pO2lmKHR5cGVvZiBhIT0ib2JqZWN0IiYmYSE9PWIpcmV0dXJuIHRoaXMuZW1wdHkoKS5hcHBlbmQoKHRoaXNbMF0mJnRoaXNbMF0ub3duZXJEb2N1bWVudHx8YykuY3JlYXRlVGV4dE5vZGUoYSkpO3JldHVybiBmLnRleHQodGhpcyl9LHdyYXBBbGw6ZnVuY3Rpb24oYSl7aWYoZi5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7Zih0aGlzKS53cmFwQWxsKGEuY2FsbCh0aGlzLGIpKX0pO2lmKHRoaXNbMF0pe3ZhciBiPWYoYSx0aGlzWzBdLm93bmVyRG9jdW1lbnQpLmVxKDApLmNsb25lKCEwKTt0aGlzWzBdLnBhcmVudE5vZGUmJmIuaW5zZXJ0QmVmb3JlKHRoaXNbMF0pLGIubWFwKGZ1bmN0aW9uKCl7dmFyIGE9dGhpczt3aGlsZShhLmZpcnN0Q2hpbGQmJmEuZmlyc3RDaGlsZC5ub2RlVHlwZT09PTEpYT1hLmZpcnN0Q2hpbGQ7cmV0dXJuIGF9KS5hcHBlbmQodGhpcyl9cmV0dXJuIHRoaXN9LHdyYXBJbm5lcjpmdW5jdGlvbihhKXtpZihmLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXtmKHRoaXMpLndyYXBJbm5lcihhLmNhbGwodGhpcyxiKSl9KTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9Zih0aGlzKSxjPWIuY29udGVudHMoKTtjLmxlbmd0aD9jLndyYXBBbGwoYSk6Yi5hcHBlbmQoYSl9KX0sd3JhcDpmdW5jdGlvbihhKXt2YXIgYj1mLmlzRnVuY3Rpb24oYSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihjKXtmKHRoaXMpLndyYXBBbGwoYj9hLmNhbGwodGhpcyxjKTphKX0pfSx1bndyYXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYXJlbnQoKS5lYWNoKGZ1bmN0aW9uKCl7Zi5ub2RlTmFtZSh0aGlzLCJib2R5Iil8fGYodGhpcykucmVwbGFjZVdpdGgodGhpcy5jaGlsZE5vZGVzKX0pLmVuZCgpfSxhcHBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsITAsZnVuY3Rpb24oYSl7dGhpcy5ub2RlVHlwZT09PTEmJnRoaXMuYXBwZW5kQ2hpbGQoYSl9KX0scHJlcGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cywhMCxmdW5jdGlvbihhKXt0aGlzLm5vZGVUeXBlPT09MSYmdGhpcy5pbnNlcnRCZWZvcmUoYSx0aGlzLmZpcnN0Q2hpbGQpfSl9LGJlZm9yZTpmdW5jdGlvbigpe2lmKHRoaXNbMF0mJnRoaXNbMF0ucGFyZW50Tm9kZSlyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsITEsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShhLHRoaXMpfSk7aWYoYXJndW1lbnRzLmxlbmd0aCl7dmFyIGE9Zi5jbGVhbihhcmd1bWVudHMpO2EucHVzaC5hcHBseShhLHRoaXMudG9BcnJheSgpKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soYSwiYmVmb3JlIixhcmd1bWVudHMpfX0sYWZ0ZXI6ZnVuY3Rpb24oKXtpZih0aGlzWzBdJiZ0aGlzWzBdLnBhcmVudE5vZGUpcmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLCExLGZ1bmN0aW9uKGEpe3RoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYSx0aGlzLm5leHRTaWJsaW5nKX0pO2lmKGFyZ3VtZW50cy5sZW5ndGgpe3ZhciBhPXRoaXMucHVzaFN0YWNrKHRoaXMsImFmdGVyIixhcmd1bWVudHMpO2EucHVzaC5hcHBseShhLGYuY2xlYW4oYXJndW1lbnRzKSk7cmV0dXJuIGF9fSxyZW1vdmU6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9MCxkOyhkPXRoaXNbY10pIT1udWxsO2MrKylpZighYXx8Zi5maWx0ZXIoYSxbZF0pLmxlbmd0aCkhYiYmZC5ub2RlVHlwZT09PTEmJihmLmNsZWFuRGF0YShkLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikpLGYuY2xlYW5EYXRhKFtkXSkpLGQucGFyZW50Tm9kZSYmZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGQpO3JldHVybiB0aGlzfSxlbXB0eTpmdW5jdGlvbigpCntmb3IodmFyIGE9MCxiOyhiPXRoaXNbYV0pIT1udWxsO2ErKyl7Yi5ub2RlVHlwZT09PTEmJmYuY2xlYW5EYXRhKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSk7d2hpbGUoYi5maXJzdENoaWxkKWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKX1yZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oYSxiKXthPWE9PW51bGw/ITE6YSxiPWI9PW51bGw/YTpiO3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3JldHVybiBmLmNsb25lKHRoaXMsYSxiKX0pfSxodG1sOmZ1bmN0aW9uKGEpe2lmKGE9PT1iKXJldHVybiB0aGlzWzBdJiZ0aGlzWzBdLm5vZGVUeXBlPT09MT90aGlzWzBdLmlubmVySFRNTC5yZXBsYWNlKFcsIiIpOm51bGw7aWYodHlwZW9mIGE9PSJzdHJpbmciJiYhYmEudGVzdChhKSYmKGYuc3VwcG9ydC5sZWFkaW5nV2hpdGVzcGFjZXx8IVgudGVzdChhKSkmJiFiZ1soWi5leGVjKGEpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpXSl7YT1hLnJlcGxhY2UoWSwiPCQxPjwvJDI+Iik7dHJ5e2Zvcih2YXIgYz0wLGQ9dGhpcy5sZW5ndGg7YzxkO2MrKyl0aGlzW2NdLm5vZGVUeXBlPT09MSYmKGYuY2xlYW5EYXRhKHRoaXNbY10uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSksdGhpc1tjXS5pbm5lckhUTUw9YSl9Y2F0Y2goZSl7dGhpcy5lbXB0eSgpLmFwcGVuZChhKX19ZWxzZSBmLmlzRnVuY3Rpb24oYSk/dGhpcy5lYWNoKGZ1bmN0aW9uKGIpe3ZhciBjPWYodGhpcyk7Yy5odG1sKGEuY2FsbCh0aGlzLGIsYy5odG1sKCkpKX0pOnRoaXMuZW1wdHkoKS5hcHBlbmQoYSk7cmV0dXJuIHRoaXN9LHJlcGxhY2VXaXRoOmZ1bmN0aW9uKGEpe2lmKHRoaXNbMF0mJnRoaXNbMF0ucGFyZW50Tm9kZSl7aWYoZi5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7dmFyIGM9Zih0aGlzKSxkPWMuaHRtbCgpO2MucmVwbGFjZVdpdGgoYS5jYWxsKHRoaXMsYixkKSl9KTt0eXBlb2YgYSE9InN0cmluZyImJihhPWYoYSkuZGV0YWNoKCkpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYj10aGlzLm5leHRTaWJsaW5nLGM9dGhpcy5wYXJlbnROb2RlO2YodGhpcykucmVtb3ZlKCksYj9mKGIpLmJlZm9yZShhKTpmKGMpLmFwcGVuZChhKX0pfXJldHVybiB0aGlzLmxlbmd0aD90aGlzLnB1c2hTdGFjayhmKGYuaXNGdW5jdGlvbihhKT9hKCk6YSksInJlcGxhY2VXaXRoIixhKTp0aGlzfSxkZXRhY2g6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucmVtb3ZlKGEsITApfSxkb21NYW5pcDpmdW5jdGlvbihhLGMsZCl7dmFyIGUsZyxoLGksaj1hWzBdLGs9W107aWYoIWYuc3VwcG9ydC5jaGVja0Nsb25lJiZhcmd1bWVudHMubGVuZ3RoPT09MyYmdHlwZW9mIGo9PSJzdHJpbmciJiZiZC50ZXN0KGopKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtmKHRoaXMpLmRvbU1hbmlwKGEsYyxkLCEwKX0pO2lmKGYuaXNGdW5jdGlvbihqKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGUpe3ZhciBnPWYodGhpcyk7YVswXT1qLmNhbGwodGhpcyxlLGM/Zy5odG1sKCk6YiksZy5kb21NYW5pcChhLGMsZCl9KTtpZih0aGlzWzBdKXtpPWomJmoucGFyZW50Tm9kZSxmLnN1cHBvcnQucGFyZW50Tm9kZSYmaSYmaS5ub2RlVHlwZT09PTExJiZpLmNoaWxkTm9kZXMubGVuZ3RoPT09dGhpcy5sZW5ndGg/ZT17ZnJhZ21lbnQ6aX06ZT1mLmJ1aWxkRnJhZ21lbnQoYSx0aGlzLGspLGg9ZS5mcmFnbWVudCxoLmNoaWxkTm9kZXMubGVuZ3RoPT09MT9nPWg9aC5maXJzdENoaWxkOmc9aC5maXJzdENoaWxkO2lmKGcpe2M9YyYmZi5ub2RlTmFtZShnLCJ0ciIpO2Zvcih2YXIgbD0wLG09dGhpcy5sZW5ndGgsbj1tLTE7bDxtO2wrKylkLmNhbGwoYz9iaSh0aGlzW2xdLGcpOnRoaXNbbF0sZS5jYWNoZWFibGV8fG0+MSYmbDxuP2YuY2xvbmUoaCwhMCwhMCk6aCl9ay5sZW5ndGgmJmYuZWFjaChrLGJwKX1yZXR1cm4gdGhpc319KSxmLmJ1aWxkRnJhZ21lbnQ9ZnVuY3Rpb24oYSxiLGQpe3ZhciBlLGcsaCxpLGo9YVswXTtiJiZiWzBdJiYoaT1iWzBdLm93bmVyRG9jdW1lbnR8fGJbMF0pLGkuY3JlYXRlRG9jdW1lbnRGcmFnbWVudHx8KGk9YyksYS5sZW5ndGg9PT0xJiZ0eXBlb2Ygaj09InN0cmluZyImJmoubGVuZ3RoPDUxMiYmaT09PWMmJmouY2hhckF0KDApPT09IjwiJiYhYmIudGVzdChqKSYmKGYuc3VwcG9ydC5jaGVja0Nsb25lfHwhYmQudGVzdChqKSkmJihmLnN1cHBvcnQuaHRtbDVDbG9uZXx8IWJjLnRlc3QoaikpJiYoZz0hMCxoPWYuZnJhZ21lbnRzW2pdLGgmJmghPT0xJiYoZT1oKSksZXx8KGU9aS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksZi5jbGVhbihhLGksZSxkKSksZyYmKGYuZnJhZ21lbnRzW2pdPWg/ZToxKTtyZXR1cm57ZnJhZ21lbnQ6ZSxjYWNoZWFibGU6Z319LGYuZnJhZ21lbnRzPXt9LGYuZWFjaCh7YXBwZW5kVG86ImFwcGVuZCIscHJlcGVuZFRvOiJwcmVwZW5kIixpbnNlcnRCZWZvcmU6ImJlZm9yZSIsaW5zZXJ0QWZ0ZXI6ImFmdGVyIixyZXBsYWNlQWxsOiJyZXBsYWNlV2l0aCJ9LGZ1bmN0aW9uKGEsYil7Zi5mblthXT1mdW5jdGlvbihjKXt2YXIgZD1bXSxlPWYoYyksZz10aGlzLmxlbmd0aD09PTEmJnRoaXNbMF0ucGFyZW50Tm9kZTtpZihnJiZnLm5vZGVUeXBlPT09MTEmJmcuY2hpbGROb2Rlcy5sZW5ndGg9PT0xJiZlLmxlbmd0aD09PTEpe2VbYl0odGhpc1swXSk7cmV0dXJuIHRoaXN9Zm9yKHZhciBoPTAsaT1lLmxlbmd0aDtoPGk7aCsrKXt2YXIgaj0oaD4wP3RoaXMuY2xvbmUoITApOnRoaXMpLmdldCgpO2YoZVtoXSlbYl0oaiksZD1kLmNvbmNhdChqKX1yZXR1cm4gdGhpcy5wdXNoU3RhY2soZCxhLGUuc2VsZWN0b3IpfX0pLGYuZXh0ZW5kKHtjbG9uZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxnLGg9Zi5zdXBwb3J0Lmh0bWw1Q2xvbmV8fCFiYy50ZXN0KCI8IithLm5vZGVOYW1lKT9hLmNsb25lTm9kZSghMCk6Ym8oYSk7aWYoKCFmLnN1cHBvcnQubm9DbG9uZUV2ZW50fHwhZi5zdXBwb3J0Lm5vQ2xvbmVDaGVja2VkKSYmKGEubm9kZVR5cGU9PT0xfHxhLm5vZGVUeXBlPT09MTEpJiYhZi5pc1hNTERvYyhhKSl7YmsoYSxoKSxkPWJsKGEpLGU9YmwoaCk7Zm9yKGc9MDtkW2ddOysrZyllW2ddJiZiayhkW2ddLGVbZ10pfWlmKGIpe2JqKGEsaCk7aWYoYyl7ZD1ibChhKSxlPWJsKGgpO2ZvcihnPTA7ZFtnXTsrK2cpYmooZFtnXSxlW2ddKX19ZD1lPW51bGw7cmV0dXJuIGh9LGNsZWFuOmZ1bmN0aW9uKGEsYixkLGUpe3ZhciBnO2I9Ynx8Yyx0eXBlb2YgYi5jcmVhdGVFbGVtZW50PT0idW5kZWZpbmVkIiYmKGI9Yi5vd25lckRvY3VtZW50fHxiWzBdJiZiWzBdLm93bmVyRG9jdW1lbnR8fGMpO3ZhciBoPVtdLGk7Zm9yKHZhciBqPTAsazsoaz1hW2pdKSE9bnVsbDtqKyspe3R5cGVvZiBrPT0ibnVtYmVyIiYmKGsrPSIiKTtpZighayljb250aW51ZTtpZih0eXBlb2Ygaz09InN0cmluZyIpaWYoIV8udGVzdChrKSlrPWIuY3JlYXRlVGV4dE5vZGUoayk7ZWxzZXtrPWsucmVwbGFjZShZLCI8JDE+PC8kMj4iKTt2YXIgbD0oWi5leGVjKGspfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpLG09YmdbbF18fGJnLl9kZWZhdWx0LG49bVswXSxvPWIuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yj09PWM/YmguYXBwZW5kQ2hpbGQobyk6VShiKS5hcHBlbmRDaGlsZChvKSxvLmlubmVySFRNTD1tWzFdK2srbVsyXTt3aGlsZShuLS0pbz1vLmxhc3RDaGlsZDtpZighZi5zdXBwb3J0LnRib2R5KXt2YXIgcD0kLnRlc3QoaykscT1sPT09InRhYmxlIiYmIXA/by5maXJzdENoaWxkJiZvLmZpcnN0Q2hpbGQuY2hpbGROb2RlczptWzFdPT09Ijx0YWJsZT4iJiYhcD9vLmNoaWxkTm9kZXM6W107Zm9yKGk9cS5sZW5ndGgtMTtpPj0wOy0taSlmLm5vZGVOYW1lKHFbaV0sInRib2R5IikmJiFxW2ldLmNoaWxkTm9kZXMubGVuZ3RoJiZxW2ldLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocVtpXSl9IWYuc3VwcG9ydC5sZWFkaW5nV2hpdGVzcGFjZSYmWC50ZXN0KGspJiZvLmluc2VydEJlZm9yZShiLmNyZWF0ZVRleHROb2RlKFguZXhlYyhrKVswXSksby5maXJzdENoaWxkKSxrPW8uY2hpbGROb2Rlc312YXIgcjtpZighZi5zdXBwb3J0LmFwcGVuZENoZWNrZWQpaWYoa1swXSYmdHlwZW9mIChyPWsubGVuZ3RoKT09Im51bWJlciIpZm9yKGk9MDtpPHI7aSsrKWJuKGtbaV0pO2Vsc2UgYm4oayk7ay5ub2RlVHlwZT9oLnB1c2goayk6aD1mLm1lcmdlKGgsayl9aWYoZCl7Zz1mdW5jdGlvbihhKXtyZXR1cm4hYS50eXBlfHxiZS50ZXN0KGEudHlwZSl9O2ZvcihqPTA7aFtqXTtqKyspaWYoZSYmZi5ub2RlTmFtZShoW2pdLCJzY3JpcHQiKSYmKCFoW2pdLnR5cGV8fGhbal0udHlwZS50b0xvd2VyQ2FzZSgpPT09InRleHQvamF2YXNjcmlwdCIpKWUucHVzaChoW2pdLnBhcmVudE5vZGU/aFtqXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGhbal0pOmhbal0pO2Vsc2V7aWYoaFtqXS5ub2RlVHlwZT09PTEpe3ZhciBzPWYuZ3JlcChoW2pdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKSxnKTtoLnNwbGljZS5hcHBseShoLFtqKzEsMF0uY29uY2F0KHMpKX1kLmFwcGVuZENoaWxkKGhbal0pfX1yZXR1cm4gaH0sY2xlYW5EYXRhOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZD1mLmNhY2hlLGU9Zi5ldmVudC5zcGVjaWFsLGc9Zi5zdXBwb3J0LmRlbGV0ZUV4cGFuZG87Zm9yKHZhciBoPTAsaTsoaT1hW2hdKSE9bnVsbDtoKyspe2lmKGkubm9kZU5hbWUmJmYubm9EYXRhW2kubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pY29udGludWU7Yz1pW2YuZXhwYW5kb107aWYoYyl7Yj1kW2NdO2lmKGImJmIuZXZlbnRzKXtmb3IodmFyIGogaW4gYi5ldmVudHMpZVtqXT9mLmV2ZW50LnJlbW92ZShpLGopOmYucmVtb3ZlRXZlbnQoaSxqLGIuaGFuZGxlKTtiLmhhbmRsZSYmKGIuaGFuZGxlLmVsZW09bnVsbCl9Zz9kZWxldGUgaVtmLmV4cGFuZG9dOmkucmVtb3ZlQXR0cmlidXRlJiZpLnJlbW92ZUF0dHJpYnV0ZShmLmV4cGFuZG8pLGRlbGV0ZSBkW2NdfX19fSk7dmFyIGJxPS9hbHBoYVwoW14pXSpcKS9pLGJyPS9vcGFjaXR5PShbXildKikvLGJzPS8oW0EtWl18Xm1zKS9nLGJ0PS9eLT9cZCsoPzpweCk/JC9pLGJ1PS9eLT9cZC8sYnY9L14oW1wtK10pPShbXC0rLlxkZV0rKS8sYnc9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdmlzaWJpbGl0eToiaGlkZGVuIixkaXNwbGF5OiJibG9jayJ9LGJ4PVsiTGVmdCIsIlJpZ2h0Il0sYnk9WyJUb3AiLCJCb3R0b20iXSxieixiQSxiQjtmLmZuLmNzcz1mdW5jdGlvbihhLGMpe2lmKGFyZ3VtZW50cy5sZW5ndGg9PT0yJiZjPT09YilyZXR1cm4gdGhpcztyZXR1cm4gZi5hY2Nlc3ModGhpcyxhLGMsITAsZnVuY3Rpb24oYSxjLGQpe3JldHVybiBkIT09Yj9mLnN0eWxlKGEsYyxkKTpmLmNzcyhhLGMpfSl9LGYuZXh0ZW5kKHtjc3NIb29rczp7b3BhY2l0eTp7Z2V0OmZ1bmN0aW9uKGEsYil7aWYoYil7dmFyIGM9YnooYSwib3BhY2l0eSIsIm9wYWNpdHkiKTtyZXR1cm4gYz09PSIiPyIxIjpjfXJldHVybiBhLnN0eWxlLm9wYWNpdHl9fX0sY3NzTnVtYmVyOntmaWxsT3BhY2l0eTohMCxmb250V2VpZ2h0OiEwLGxpbmVIZWlnaHQ6ITAsb3BhY2l0eTohMCxvcnBoYW5zOiEwLHdpZG93czohMCx6SW5kZXg6ITAsem9vbTohMH0sY3NzUHJvcHM6eyJmbG9hdCI6Zi5zdXBwb3J0LmNzc0Zsb2F0PyJjc3NGbG9hdCI6InN0eWxlRmxvYXQifSxzdHlsZTpmdW5jdGlvbihhLGMsZCxlKXtpZighIWEmJmEubm9kZVR5cGUhPT0zJiZhLm5vZGVUeXBlIT09OCYmISFhLnN0eWxlKXt2YXIgZyxoLGk9Zi5jYW1lbENhc2UoYyksaj1hLnN0eWxlLGs9Zi5jc3NIb29rc1tpXTtjPWYuY3NzUHJvcHNbaV18fGk7aWYoZD09PWIpe2lmKGsmJiJnZXQiaW4gayYmKGc9ay5nZXQoYSwhMSxlKSkhPT1iKXJldHVybiBnO3JldHVybiBqW2NdfWg9dHlwZW9mIGQsaD09PSJzdHJpbmciJiYoZz1idi5leGVjKGQpKSYmKGQ9KyhnWzFdKzEpKitnWzJdK3BhcnNlRmxvYXQoZi5jc3MoYSxjKSksaD0ibnVtYmVyIik7aWYoZD09bnVsbHx8aD09PSJudW1iZXIiJiZpc05hTihkKSlyZXR1cm47aD09PSJudW1iZXIiJiYhZi5jc3NOdW1iZXJbaV0mJihkKz0icHgiKTtpZigha3x8ISgic2V0ImluIGspfHwoZD1rLnNldChhLGQpKSE9PWIpdHJ5e2pbY109ZH1jYXRjaChsKXt9fX0sY3NzOmZ1bmN0aW9uKGEsYyxkKXt2YXIgZSxnO2M9Zi5jYW1lbENhc2UoYyksZz1mLmNzc0hvb2tzW2NdLGM9Zi5jc3NQcm9wc1tjXXx8YyxjPT09ImNzc0Zsb2F0IiYmKGM9ImZsb2F0Iik7aWYoZyYmImdldCJpbiBnJiYoZT1nLmdldChhLCEwLGQpKSE9PWIpcmV0dXJuIGU7aWYoYnopcmV0dXJuIGJ6KGEsYyl9LHN3YXA6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXt9O2Zvcih2YXIgZSBpbiBiKWRbZV09YS5zdHlsZVtlXSxhLnN0eWxlW2VdPWJbZV07Yy5jYWxsKGEpO2ZvcihlIGluIGIpYS5zdHlsZVtlXT1kW2VdfX0pLGYuY3VyQ1NTPWYuY3NzLGYuZWFjaChbImhlaWdodCIsIndpZHRoIl0sZnVuY3Rpb24oYSxiKXtmLmNzc0hvb2tzW2JdPXtnZXQ6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlO2lmKGMpe2lmKGEub2Zmc2V0V2lkdGghPT0wKXJldHVybiBiQyhhLGIsZCk7Zi5zd2FwKGEsYncsZnVuY3Rpb24oKXtlPWJDKGEsYixkKX0pO3JldHVybiBlfX0sc2V0OmZ1bmN0aW9uKGEsYil7aWYoIWJ0LnRlc3QoYikpcmV0dXJuIGI7Yj1wYXJzZUZsb2F0KGIpO2lmKGI+PTApcmV0dXJuIGIrInB4In19fSksZi5zdXBwb3J0Lm9wYWNpdHl8fChmLmNzc0hvb2tzLm9wYWNpdHk9e2dldDpmdW5jdGlvbihhLGIpe3JldHVybiBici50ZXN0KChiJiZhLmN1cnJlbnRTdHlsZT9hLmN1cnJlbnRTdHlsZS5maWx0ZXI6YS5zdHlsZS5maWx0ZXIpfHwiIik/cGFyc2VGbG9hdChSZWdFeHAuJDEpLzEwMCsiIjpiPyIxIjoiIn0sc2V0OmZ1bmN0aW9uKGEsYil7dmFyIGM9YS5zdHlsZSxkPWEuY3VycmVudFN0eWxlLGU9Zi5pc051bWVyaWMoYik/ImFscGhhKG9wYWNpdHk9IitiKjEwMCsiKSI6IiIsZz1kJiZkLmZpbHRlcnx8Yy5maWx0ZXJ8fCIiO2Muem9vbT0xO2lmKGI+PTEmJmYudHJpbShnLnJlcGxhY2UoYnEsIiIpKT09PSIiKXtjLnJlbW92ZUF0dHJpYnV0ZSgiZmlsdGVyIik7aWYoZCYmIWQuZmlsdGVyKXJldHVybn1jLmZpbHRlcj1icS50ZXN0KGcpP2cucmVwbGFjZShicSxlKTpnKyIgIitlfX0pLGYoZnVuY3Rpb24oKXtmLnN1cHBvcnQucmVsaWFibGVNYXJnaW5SaWdodHx8KGYuY3NzSG9va3MubWFyZ2luUmlnaHQ9e2dldDpmdW5jdGlvbihhLGIpe3ZhciBjO2Yuc3dhcChhLHtkaXNwbGF5OiJpbmxpbmUtYmxvY2sifSxmdW5jdGlvbigpe2I/Yz1ieihhLCJtYXJnaW4tcmlnaHQiLCJtYXJnaW5SaWdodCIpOmM9YS5zdHlsZS5tYXJnaW5SaWdodH0pO3JldHVybiBjfX0pfSksYy5kZWZhdWx0VmlldyYmYy5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlJiYoYkE9ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGU7Yj1iLnJlcGxhY2UoYnMsIi0kMSIpLnRvTG93ZXJDYXNlKCksKGQ9YS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3KSYmKGU9ZC5nZXRDb21wdXRlZFN0eWxlKGEsbnVsbCkpJiYoYz1lLmdldFByb3BlcnR5VmFsdWUoYiksYz09PSIiJiYhZi5jb250YWlucyhhLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGEpJiYoYz1mLnN0eWxlKGEsYikpKTtyZXR1cm4gY30pLGMuZG9jdW1lbnRFbGVtZW50LmN1cnJlbnRTdHlsZSYmKGJCPWZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGY9YS5jdXJyZW50U3R5bGUmJmEuY3VycmVudFN0eWxlW2JdLGc9YS5zdHlsZTtmPT09bnVsbCYmZyYmKGU9Z1tiXSkmJihmPWUpLCFidC50ZXN0KGYpJiZidS50ZXN0KGYpJiYoYz1nLmxlZnQsZD1hLnJ1bnRpbWVTdHlsZSYmYS5ydW50aW1lU3R5bGUubGVmdCxkJiYoYS5ydW50aW1lU3R5bGUubGVmdD1hLmN1cnJlbnRTdHlsZS5sZWZ0KSxnLmxlZnQ9Yj09PSJmb250U2l6ZSI/IjFlbSI6Znx8MCxmPWcucGl4ZWxMZWZ0KyJweCIsZy5sZWZ0PWMsZCYmKGEucnVudGltZVN0eWxlLmxlZnQ9ZCkpO3JldHVybiBmPT09IiI/ImF1dG8iOmZ9KSxiej1iQXx8YkIsZi5leHByJiZmLmV4cHIuZmlsdGVycyYmKGYuZXhwci5maWx0ZXJzLmhpZGRlbj1mdW5jdGlvbihhKXt2YXIgYj1hLm9mZnNldFdpZHRoLGM9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGI9PT0wJiZjPT09MHx8IWYuc3VwcG9ydC5yZWxpYWJsZUhpZGRlbk9mZnNldHMmJihhLnN0eWxlJiZhLnN0eWxlLmRpc3BsYXl8fGYuY3NzKGEsImRpc3BsYXkiKSk9PT0ibm9uZSJ9LGYuZXhwci5maWx0ZXJzLnZpc2libGU9ZnVuY3Rpb24oYSl7cmV0dXJuIWYuZXhwci5maWx0ZXJzLmhpZGRlbihhKX0pO3ZhciBiRD0vJTIwL2csYkU9L1xbXF0kLyxiRj0vXHI/XG4vZyxiRz0vIy4qJC8sYkg9L14oLio/KTpbIFx0XSooW15cclxuXSopXHI/JC9tZyxiST0vXig/OmNvbG9yfGRhdGV8ZGF0ZXRpbWV8ZGF0ZXRpbWUtbG9jYWx8ZW1haWx8aGlkZGVufG1vbnRofG51bWJlcnxwYXNzd29yZHxyYW5nZXxzZWFyY2h8dGVsfHRleHR8dGltZXx1cmx8d2VlaykkL2ksYko9L14oPzphYm91dHxhcHB8YXBwXC1zdG9yYWdlfC4rXC1leHRlbnNpb258ZmlsZXxyZXN8d2lkZ2V0KTokLyxiSz0vXig/OkdFVHxIRUFEKSQvLGJMPS9eXC9cLy8sYk09L1w/LyxiTj0vPHNjcmlwdFxiW148XSooPzooPyE8XC9zY3JpcHQ+KTxbXjxdKikqPFwvc2NyaXB0Pi9naSxiTz0vXig/OnNlbGVjdHx0ZXh0YXJlYSkvaSxiUD0vXHMrLyxiUT0vKFs/Jl0pXz1bXiZdKi8sYlI9L14oW1x3XCtcLlwtXSs6KSg/OlwvXC8oW15cLz8jOl0qKSg/OjooXGQrKSk/KT8vLGJTPWYuZm4ubG9hZCxiVD17fSxiVT17fSxiVixiVyxiWD1bIiovIl0rWyIqIl07dHJ5e2JWPWUuaHJlZn1jYXRjaChiWSl7YlY9Yy5jcmVhdGVFbGVtZW50KCJhIiksYlYuaHJlZj0iIixiVj1iVi5ocmVmfWJXPWJSLmV4ZWMoYlYudG9Mb3dlckNhc2UoKSl8fFtdLGYuZm4uZXh0ZW5kKHtsb2FkOmZ1bmN0aW9uKGEsYyxkKXtpZih0eXBlb2YgYSE9InN0cmluZyImJmJTKXJldHVybiBiUy5hcHBseSh0aGlzLGFyZ3VtZW50cyk7aWYoIXRoaXMubGVuZ3RoKXJldHVybiB0aGlzO3ZhciBlPWEuaW5kZXhPZigiICIpO2lmKGU+PTApe3ZhciBnPWEuc2xpY2UoZSxhLmxlbmd0aCk7YT1hLnNsaWNlKDAsZSl9dmFyIGg9IkdFVCI7YyYmKGYuaXNGdW5jdGlvbihjKT8oZD1jLGM9Yik6dHlwZW9mIGM9PSJvYmplY3QiJiYoYz1mLnBhcmFtKGMsZi5hamF4U2V0dGluZ3MudHJhZGl0aW9uYWwpLGg9IlBPU1QiKSk7dmFyIGk9dGhpcztmLmFqYXgoe3VybDphLHR5cGU6aCxkYXRhVHlwZToiaHRtbCIsZGF0YTpjLGNvbXBsZXRlOmZ1bmN0aW9uKGEsYixjKXtjPWEucmVzcG9uc2VUZXh0LGEuaXNSZXNvbHZlZCgpJiYoYS5kb25lKGZ1bmN0aW9uKGEpe2M9YX0pLGkuaHRtbChnP2YoIjxkaXY+IikuYXBwZW5kKGMucmVwbGFjZShiTiwiIikpLmZpbmQoZyk6YykpLGQmJmkuZWFjaChkLFtjLGIsYV0pfX0pO3JldHVybiB0aGlzfSxzZXJpYWxpemU6ZnVuY3Rpb24oKXtyZXR1cm4gZi5wYXJhbSh0aGlzLnNlcmlhbGl6ZUFycmF5KCkpfSxzZXJpYWxpemVBcnJheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3JldHVybiB0aGlzLmVsZW1lbnRzP2YubWFrZUFycmF5KHRoaXMuZWxlbWVudHMpOnRoaXN9KS5maWx0ZXIoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5uYW1lJiYhdGhpcy5kaXNhYmxlZCYmKHRoaXMuY2hlY2tlZHx8Yk8udGVzdCh0aGlzLm5vZGVOYW1lKXx8YkkudGVzdCh0aGlzLnR5cGUpKX0pLm1hcChmdW5jdGlvbihhLGIpe3ZhciBjPWYodGhpcykudmFsKCk7cmV0dXJuIGM9PW51bGw/bnVsbDpmLmlzQXJyYXkoYyk/Zi5tYXAoYyxmdW5jdGlvbihhLGMpe3JldHVybntuYW1lOmIubmFtZSx2YWx1ZTphLnJlcGxhY2UoYkYsIlxyXG4iKX19KTp7bmFtZTpiLm5hbWUsdmFsdWU6Yy5yZXBsYWNlKGJGLCJcclxuIil9fSkuZ2V0KCl9fSksZi5lYWNoKCJhamF4U3RhcnQgYWpheFN0b3AgYWpheENvbXBsZXRlIGFqYXhFcnJvciBhamF4U3VjY2VzcyBhamF4U2VuZCIuc3BsaXQoIiAiKSxmdW5jdGlvbihhLGIpe2YuZm5bYl09ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMub24oYixhKX19KSxmLmVhY2goWyJnZXQiLCJwb3N0Il0sZnVuY3Rpb24oYSxjKXtmW2NdPWZ1bmN0aW9uKGEsZCxlLGcpe2YuaXNGdW5jdGlvbihkKSYmKGc9Z3x8ZSxlPWQsZD1iKTtyZXR1cm4gZi5hamF4KHt0eXBlOmMsdXJsOmEsZGF0YTpkLHN1Y2Nlc3M6ZSxkYXRhVHlwZTpnfSl9fSksZi5leHRlbmQoe2dldFNjcmlwdDpmdW5jdGlvbihhLGMpe3JldHVybiBmLmdldChhLGIsYywic2NyaXB0Iil9LGdldEpTT046ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBmLmdldChhLGIsYywianNvbiIpfSxhamF4U2V0dXA6ZnVuY3Rpb24oYSxiKXtiP2JfKGEsZi5hamF4U2V0dGluZ3MpOihiPWEsYT1mLmFqYXhTZXR0aW5ncyksYl8oYSxiKTtyZXR1cm4gYX0sYWpheFNldHRpbmdzOnt1cmw6YlYsaXNMb2NhbDpiSi50ZXN0KGJXWzFdKSxnbG9iYWw6ITAsdHlwZToiR0VUIixjb250ZW50VHlwZToiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIixwcm9jZXNzRGF0YTohMCxhc3luYzohMCxhY2NlcHRzOnt4bWw6ImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLGh0bWw6InRleHQvaHRtbCIsdGV4dDoidGV4dC9wbGFpbiIsanNvbjoiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0IiwiKiI6Ylh9LGNvbnRlbnRzOnt4bWw6L3htbC8saHRtbDovaHRtbC8sanNvbjovanNvbi99LHJlc3BvbnNlRmllbGRzOnt4bWw6InJlc3BvbnNlWE1MIix0ZXh0OiJyZXNwb25zZVRleHQifSxjb252ZXJ0ZXJzOnsiKiB0ZXh0IjphLlN0cmluZywidGV4dCBodG1sIjohMCwidGV4dCBqc29uIjpmLnBhcnNlSlNPTiwidGV4dCB4bWwiOmYucGFyc2VYTUx9LGZsYXRPcHRpb25zOntjb250ZXh0OiEwLHVybDohMH19LGFqYXhQcmVmaWx0ZXI6YlooYlQpLGFqYXhUcmFuc3BvcnQ6YlooYlUpLGFqYXg6ZnVuY3Rpb24oYSxjKXtmdW5jdGlvbiB3KGEsYyxsLG0pe2lmKHMhPT0yKXtzPTIscSYmY2xlYXJUaW1lb3V0KHEpLHA9YixuPW18fCIiLHYucmVhZHlTdGF0ZT1hPjA/NDowO3ZhciBvLHIsdSx3PWMseD1sP2NiKGQsdixsKTpiLHksejtpZihhPj0yMDAmJmE8MzAwfHxhPT09MzA0KXtpZihkLmlmTW9kaWZpZWQpe2lmKHk9di5nZXRSZXNwb25zZUhlYWRlcigiTGFzdC1Nb2RpZmllZCIpKWYubGFzdE1vZGlmaWVkW2tdPXk7aWYoej12LmdldFJlc3BvbnNlSGVhZGVyKCJFdGFnIikpZi5ldGFnW2tdPXp9aWYoYT09PTMwNCl3PSJub3Rtb2RpZmllZCIsbz0hMDtlbHNlIHRyeXtyPWNjKGQseCksdz0ic3VjY2VzcyIsbz0hMH1jYXRjaChBKXt3PSJwYXJzZXJlcnJvciIsdT1BfX1lbHNle3U9dztpZighd3x8YSl3PSJlcnJvciIsYTwwJiYoYT0wKX12LnN0YXR1cz1hLHYuc3RhdHVzVGV4dD0iIisoY3x8dyksbz9oLnJlc29sdmVXaXRoKGUsW3Isdyx2XSk6aC5yZWplY3RXaXRoKGUsW3Ysdyx1XSksdi5zdGF0dXNDb2RlKGopLGo9Yix0JiZnLnRyaWdnZXIoImFqYXgiKyhvPyJTdWNjZXNzIjoiRXJyb3IiKSxbdixkLG8/cjp1XSksaS5maXJlV2l0aChlLFt2LHddKSx0JiYoZy50cmlnZ2VyKCJhamF4Q29tcGxldGUiLFt2LGRdKSwtLWYuYWN0aXZlfHxmLmV2ZW50LnRyaWdnZXIoImFqYXhTdG9wIikpfX10eXBlb2YgYT09Im9iamVjdCImJihjPWEsYT1iKSxjPWN8fHt9O3ZhciBkPWYuYWpheFNldHVwKHt9LGMpLGU9ZC5jb250ZXh0fHxkLGc9ZSE9PWQmJihlLm5vZGVUeXBlfHxlIGluc3RhbmNlb2YgZik/ZihlKTpmLmV2ZW50LGg9Zi5EZWZlcnJlZCgpLGk9Zi5DYWxsYmFja3MoIm9uY2UgbWVtb3J5Iiksaj1kLnN0YXR1c0NvZGV8fHt9LGssbD17fSxtPXt9LG4sbyxwLHEscixzPTAsdCx1LHY9e3JlYWR5U3RhdGU6MCxzZXRSZXF1ZXN0SGVhZGVyOmZ1bmN0aW9uKGEsYil7aWYoIXMpe3ZhciBjPWEudG9Mb3dlckNhc2UoKTthPW1bY109bVtjXXx8YSxsW2FdPWJ9cmV0dXJuIHRoaXN9LGdldEFsbFJlc3BvbnNlSGVhZGVyczpmdW5jdGlvbigpe3JldHVybiBzPT09Mj9uOm51bGx9LGdldFJlc3BvbnNlSGVhZGVyOmZ1bmN0aW9uKGEpe3ZhciBjO2lmKHM9PT0yKXtpZighbyl7bz17fTt3aGlsZShjPWJILmV4ZWMobikpb1tjWzFdLnRvTG93ZXJDYXNlKCldPWNbMl19Yz1vW2EudG9Mb3dlckNhc2UoKV19cmV0dXJuIGM9PT1iP251bGw6Y30sb3ZlcnJpZGVNaW1lVHlwZTpmdW5jdGlvbihhKXtzfHwoZC5taW1lVHlwZT1hKTtyZXR1cm4gdGhpc30sYWJvcnQ6ZnVuY3Rpb24oYSl7YT1hfHwiYWJvcnQiLHAmJnAuYWJvcnQoYSksdygwLGEpO3JldHVybiB0aGlzfX07aC5wcm9taXNlKHYpLHYuc3VjY2Vzcz12LmRvbmUsdi5lcnJvcj12LmZhaWwsdi5jb21wbGV0ZT1pLmFkZCx2LnN0YXR1c0NvZGU9ZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGI7aWYoczwyKWZvcihiIGluIGEpaltiXT1baltiXSxhW2JdXTtlbHNlIGI9YVt2LnN0YXR1c10sdi50aGVuKGIsYil9cmV0dXJuIHRoaXN9LGQudXJsPSgoYXx8ZC51cmwpKyIiKS5yZXBsYWNlKGJHLCIiKS5yZXBsYWNlKGJMLGJXWzFdKyIvLyIpLGQuZGF0YVR5cGVzPWYudHJpbShkLmRhdGFUeXBlfHwiKiIpLnRvTG93ZXJDYXNlKCkuc3BsaXQoYlApLGQuY3Jvc3NEb21haW49PW51bGwmJihyPWJSLmV4ZWMoZC51cmwudG9Mb3dlckNhc2UoKSksZC5jcm9zc0RvbWFpbj0hKCFyfHxyWzFdPT1iV1sxXSYmclsyXT09YldbMl0mJihyWzNdfHwoclsxXT09PSJodHRwOiI/ODA6NDQzKSk9PShiV1szXXx8KGJXWzFdPT09Imh0dHA6Ij84MDo0NDMpKSkpLGQuZGF0YSYmZC5wcm9jZXNzRGF0YSYmdHlwZW9mIGQuZGF0YSE9InN0cmluZyImJihkLmRhdGE9Zi5wYXJhbShkLmRhdGEsZC50cmFkaXRpb25hbCkpLGIkKGJULGQsYyx2KTtpZihzPT09MilyZXR1cm4hMTt0PWQuZ2xvYmFsLGQudHlwZT1kLnR5cGUudG9VcHBlckNhc2UoKSxkLmhhc0NvbnRlbnQ9IWJLLnRlc3QoZC50eXBlKSx0JiZmLmFjdGl2ZSsrPT09MCYmZi5ldmVudC50cmlnZ2VyKCJhamF4U3RhcnQiKTtpZighZC5oYXNDb250ZW50KXtkLmRhdGEmJihkLnVybCs9KGJNLnRlc3QoZC51cmwpPyImIjoiPyIpK2QuZGF0YSxkZWxldGUgZC5kYXRhKSxrPWQudXJsO2lmKGQuY2FjaGU9PT0hMSl7dmFyIHg9Zi5ub3coKSx5PWQudXJsLnJlcGxhY2UoYlEsIiQxXz0iK3gpO2QudXJsPXkrKHk9PT1kLnVybD8oYk0udGVzdChkLnVybCk/IiYiOiI/IikrIl89Iit4OiIiKX19KGQuZGF0YSYmZC5oYXNDb250ZW50JiZkLmNvbnRlbnRUeXBlIT09ITF8fGMuY29udGVudFR5cGUpJiZ2LnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsZC5jb250ZW50VHlwZSksZC5pZk1vZGlmaWVkJiYoaz1rfHxkLnVybCxmLmxhc3RNb2RpZmllZFtrXSYmdi5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Nb2RpZmllZC1TaW5jZSIsZi5sYXN0TW9kaWZpZWRba10pLGYuZXRhZ1trXSYmdi5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Ob25lLU1hdGNoIixmLmV0YWdba10pKSx2LnNldFJlcXVlc3RIZWFkZXIoIkFjY2VwdCIsZC5kYXRhVHlwZXNbMF0mJmQuYWNjZXB0c1tkLmRhdGFUeXBlc1swXV0/ZC5hY2NlcHRzW2QuZGF0YVR5cGVzWzBdXSsoZC5kYXRhVHlwZXNbMF0hPT0iKiI/IiwgIitiWCsiOyBxPTAuMDEiOiIiKTpkLmFjY2VwdHNbIioiXSk7Zm9yKHUgaW4gZC5oZWFkZXJzKXYuc2V0UmVxdWVzdEhlYWRlcih1LGQuaGVhZGVyc1t1XSk7aWYoZC5iZWZvcmVTZW5kJiYoZC5iZWZvcmVTZW5kLmNhbGwoZSx2LGQpPT09ITF8fHM9PT0yKSl7di5hYm9ydCgpO3JldHVybiExfWZvcih1IGlue3N1Y2Nlc3M6MSxlcnJvcjoxLGNvbXBsZXRlOjF9KXZbdV0oZFt1XSk7cD1iJChiVSxkLGMsdik7aWYoIXApdygtMSwiTm8gVHJhbnNwb3J0Iik7ZWxzZXt2LnJlYWR5U3RhdGU9MSx0JiZnLnRyaWdnZXIoImFqYXhTZW5kIixbdixkXSksZC5hc3luYyYmZC50aW1lb3V0PjAmJihxPXNldFRpbWVvdXQoZnVuY3Rpb24oKXt2LmFib3J0KCJ0aW1lb3V0Iil9LGQudGltZW91dCkpO3RyeXtzPTEscC5zZW5kKGwsdyl9Y2F0Y2goeil7aWYoczwyKXcoLTEseik7ZWxzZSB0aHJvdyB6fX1yZXR1cm4gdn0scGFyYW06ZnVuY3Rpb24oYSxjKXt2YXIgZD1bXSxlPWZ1bmN0aW9uKGEsYil7Yj1mLmlzRnVuY3Rpb24oYik/YigpOmIsZFtkLmxlbmd0aF09ZW5jb2RlVVJJQ29tcG9uZW50KGEpKyI9IitlbmNvZGVVUklDb21wb25lbnQoYil9O2M9PT1iJiYoYz1mLmFqYXhTZXR0aW5ncy50cmFkaXRpb25hbCk7aWYoZi5pc0FycmF5KGEpfHxhLmpxdWVyeSYmIWYuaXNQbGFpbk9iamVjdChhKSlmLmVhY2goYSxmdW5jdGlvbigpe2UodGhpcy5uYW1lLHRoaXMudmFsdWUpfSk7ZWxzZSBmb3IodmFyIGcgaW4gYSljYShnLGFbZ10sYyxlKTtyZXR1cm4gZC5qb2luKCImIikucmVwbGFjZShiRCwiKyIpfX0pLGYuZXh0ZW5kKHthY3RpdmU6MCxsYXN0TW9kaWZpZWQ6e30sZXRhZzp7fX0pO3ZhciBjZD1mLm5vdygpLGNlPS8oXD0pXD8oJnwkKXxcP1w/L2k7Zi5hamF4U2V0dXAoe2pzb25wOiJjYWxsYmFjayIsanNvbnBDYWxsYmFjazpmdW5jdGlvbigpe3JldHVybiBmLmV4cGFuZG8rIl8iK2NkKyt9fSksZi5hamF4UHJlZmlsdGVyKCJqc29uIGpzb25wIixmdW5jdGlvbihiLGMsZCl7dmFyIGU9Yi5jb250ZW50VHlwZT09PSJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiJiZ0eXBlb2YgYi5kYXRhPT0ic3RyaW5nIjtpZihiLmRhdGFUeXBlc1swXT09PSJqc29ucCJ8fGIuanNvbnAhPT0hMSYmKGNlLnRlc3QoYi51cmwpfHxlJiZjZS50ZXN0KGIuZGF0YSkpKXt2YXIgZyxoPWIuanNvbnBDYWxsYmFjaz1mLmlzRnVuY3Rpb24oYi5qc29ucENhbGxiYWNrKT9iLmpzb25wQ2FsbGJhY2soKTpiLmpzb25wQ2FsbGJhY2ssaT1hW2hdLGo9Yi51cmwsaz1iLmRhdGEsbD0iJDEiK2grIiQyIjtiLmpzb25wIT09ITEmJihqPWoucmVwbGFjZShjZSxsKSxiLnVybD09PWomJihlJiYoaz1rLnJlcGxhY2UoY2UsbCkpLGIuZGF0YT09PWsmJihqKz0oL1w/Ly50ZXN0KGopPyImIjoiPyIpK2IuanNvbnArIj0iK2gpKSksYi51cmw9aixiLmRhdGE9ayxhW2hdPWZ1bmN0aW9uKGEpe2c9W2FdfSxkLmFsd2F5cyhmdW5jdGlvbigpe2FbaF09aSxnJiZmLmlzRnVuY3Rpb24oaSkmJmFbaF0oZ1swXSl9KSxiLmNvbnZlcnRlcnNbInNjcmlwdCBqc29uIl09ZnVuY3Rpb24oKXtnfHxmLmVycm9yKGgrIiB3YXMgbm90IGNhbGxlZCIpO3JldHVybiBnWzBdfSxiLmRhdGFUeXBlc1swXT0ianNvbiI7cmV0dXJuInNjcmlwdCJ9fSksZi5hamF4U2V0dXAoe2FjY2VwdHM6e3NjcmlwdDoidGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9lY21hc2NyaXB0LCBhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQifSxjb250ZW50czp7c2NyaXB0Oi9qYXZhc2NyaXB0fGVjbWFzY3JpcHQvfSxjb252ZXJ0ZXJzOnsidGV4dCBzY3JpcHQiOmZ1bmN0aW9uKGEpe2YuZ2xvYmFsRXZhbChhKTtyZXR1cm4gYX19fSksZi5hamF4UHJlZmlsdGVyKCJzY3JpcHQiLGZ1bmN0aW9uKGEpe2EuY2FjaGU9PT1iJiYoYS5jYWNoZT0hMSksYS5jcm9zc0RvbWFpbiYmKGEudHlwZT0iR0VUIixhLmdsb2JhbD0hMSl9KSxmLmFqYXhUcmFuc3BvcnQoInNjcmlwdCIsZnVuY3Rpb24oYSl7aWYoYS5jcm9zc0RvbWFpbil7dmFyIGQsZT1jLmhlYWR8fGMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXXx8Yy5kb2N1bWVudEVsZW1lbnQ7cmV0dXJue3NlbmQ6ZnVuY3Rpb24oZixnKXtkPWMuY3JlYXRlRWxlbWVudCgic2NyaXB0IiksZC5hc3luYz0iYXN5bmMiLGEuc2NyaXB0Q2hhcnNldCYmKGQuY2hhcnNldD1hLnNjcmlwdENoYXJzZXQpLGQuc3JjPWEudXJsLGQub25sb2FkPWQub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKGEsYyl7aWYoY3x8IWQucmVhZHlTdGF0ZXx8L2xvYWRlZHxjb21wbGV0ZS8udGVzdChkLnJlYWR5U3RhdGUpKWQub25sb2FkPWQub25yZWFkeXN0YXRlY2hhbmdlPW51bGwsZSYmZC5wYXJlbnROb2RlJiZlLnJlbW92ZUNoaWxkKGQpLGQ9YixjfHxnKDIwMCwic3VjY2VzcyIpfSxlLmluc2VydEJlZm9yZShkLGUuZmlyc3RDaGlsZCl9LGFib3J0OmZ1bmN0aW9uKCl7ZCYmZC5vbmxvYWQoMCwxKX19fX0pO3ZhciBjZj1hLkFjdGl2ZVhPYmplY3Q/ZnVuY3Rpb24oKXtmb3IodmFyIGEgaW4gY2gpY2hbYV0oMCwxKX06ITEsY2c9MCxjaDtmLmFqYXhTZXR0aW5ncy54aHI9YS5BY3RpdmVYT2JqZWN0P2Z1bmN0aW9uKCl7cmV0dXJuIXRoaXMuaXNMb2NhbCYmY2koKXx8Y2ooKX06Y2ksZnVuY3Rpb24oYSl7Zi5leHRlbmQoZi5zdXBwb3J0LHthamF4OiEhYSxjb3JzOiEhYSYmIndpdGhDcmVkZW50aWFscyJpbiBhfSl9KGYuYWpheFNldHRpbmdzLnhocigpKSxmLnN1cHBvcnQuYWpheCYmZi5hamF4VHJhbnNwb3J0KGZ1bmN0aW9uKGMpe2lmKCFjLmNyb3NzRG9tYWlufHxmLnN1cHBvcnQuY29ycyl7dmFyIGQ7cmV0dXJue3NlbmQ6ZnVuY3Rpb24oZSxnKXt2YXIgaD1jLnhocigpLGksajtjLnVzZXJuYW1lP2gub3BlbihjLnR5cGUsYy51cmwsYy5hc3luYyxjLnVzZXJuYW1lLGMucGFzc3dvcmQpOmgub3BlbihjLnR5cGUsYy51cmwsYy5hc3luYyk7aWYoYy54aHJGaWVsZHMpZm9yKGogaW4gYy54aHJGaWVsZHMpaFtqXT1jLnhockZpZWxkc1tqXTtjLm1pbWVUeXBlJiZoLm92ZXJyaWRlTWltZVR5cGUmJmgub3ZlcnJpZGVNaW1lVHlwZShjLm1pbWVUeXBlKSwhYy5jcm9zc0RvbWFpbiYmIWVbIlgtUmVxdWVzdGVkLVdpdGgiXSYmKGVbIlgtUmVxdWVzdGVkLVdpdGgiXT0iWE1MSHR0cFJlcXVlc3QiKTt0cnl7Zm9yKGogaW4gZSloLnNldFJlcXVlc3RIZWFkZXIoaixlW2pdKX1jYXRjaChrKXt9aC5zZW5kKGMuaGFzQ29udGVudCYmYy5kYXRhfHxudWxsKSxkPWZ1bmN0aW9uKGEsZSl7dmFyIGosayxsLG0sbjt0cnl7aWYoZCYmKGV8fGgucmVhZHlTdGF0ZT09PTQpKXtkPWIsaSYmKGgub25yZWFkeXN0YXRlY2hhbmdlPWYubm9vcCxjZiYmZGVsZXRlIGNoW2ldKTtpZihlKWgucmVhZHlTdGF0ZSE9PTQmJmguYWJvcnQoKTtlbHNle2o9aC5zdGF0dXMsbD1oLmdldEFsbFJlc3BvbnNlSGVhZGVycygpLG09e30sbj1oLnJlc3BvbnNlWE1MLG4mJm4uZG9jdW1lbnRFbGVtZW50JiYobS54bWw9biksbS50ZXh0PWgucmVzcG9uc2VUZXh0O3RyeXtrPWguc3RhdHVzVGV4dH1jYXRjaChvKXtrPSIifSFqJiZjLmlzTG9jYWwmJiFjLmNyb3NzRG9tYWluP2o9bS50ZXh0PzIwMDo0MDQ6aj09PTEyMjMmJihqPTIwNCl9fX1jYXRjaChwKXtlfHxnKC0xLHApfW0mJmcoaixrLG0sbCl9LCFjLmFzeW5jfHxoLnJlYWR5U3RhdGU9PT00P2QoKTooaT0rK2NnLGNmJiYoY2h8fChjaD17fSxmKGEpLnVubG9hZChjZikpLGNoW2ldPWQpLGgub25yZWFkeXN0YXRlY2hhbmdlPWQpfSxhYm9ydDpmdW5jdGlvbigpe2QmJmQoMCwxKX19fX0pO3ZhciBjaz17fSxjbCxjbSxjbj0vXig/OnRvZ2dsZXxzaG93fGhpZGUpJC8sY289L14oWytcLV09KT8oW1xkKy5cLV0rKShbYS16JV0qKSQvaSxjcCxjcT1bWyJoZWlnaHQiLCJtYXJnaW5Ub3AiLCJtYXJnaW5Cb3R0b20iLCJwYWRkaW5nVG9wIiwicGFkZGluZ0JvdHRvbSJdLFsid2lkdGgiLCJtYXJnaW5MZWZ0IiwibWFyZ2luUmlnaHQiLCJwYWRkaW5nTGVmdCIsInBhZGRpbmdSaWdodCJdLFsib3BhY2l0eSJdXSxjcjtmLmZuLmV4dGVuZCh7c2hvdzpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZTtpZihhfHxhPT09MClyZXR1cm4gdGhpcy5hbmltYXRlKGN1KCJzaG93IiwzKSxhLGIsYyk7Zm9yKHZhciBnPTAsaD10aGlzLmxlbmd0aDtnPGg7ZysrKWQ9dGhpc1tnXSxkLnN0eWxlJiYoZT1kLnN0eWxlLmRpc3BsYXksIWYuX2RhdGEoZCwib2xkZGlzcGxheSIpJiZlPT09Im5vbmUiJiYoZT1kLnN0eWxlLmRpc3BsYXk9IiIpLGU9PT0iIiYmZi5jc3MoZCwiZGlzcGxheSIpPT09Im5vbmUiJiZmLl9kYXRhKGQsIm9sZGRpc3BsYXkiLGN2KGQubm9kZU5hbWUpKSk7Zm9yKGc9MDtnPGg7ZysrKXtkPXRoaXNbZ107aWYoZC5zdHlsZSl7ZT1kLnN0eWxlLmRpc3BsYXk7aWYoZT09PSIifHxlPT09Im5vbmUiKWQuc3R5bGUuZGlzcGxheT1mLl9kYXRhKGQsIm9sZGRpc3BsYXkiKXx8IiJ9fXJldHVybiB0aGlzfSxoaWRlOmZ1bmN0aW9uKGEsYixjKXtpZihhfHxhPT09MClyZXR1cm4gdGhpcy5hbmltYXRlKGN1KCJoaWRlIiwzKSxhLGIsYyk7dmFyIGQsZSxnPTAsaD10aGlzLmxlbmd0aDtmb3IoO2c8aDtnKyspZD10aGlzW2ddLGQuc3R5bGUmJihlPWYuY3NzKGQsImRpc3BsYXkiKSxlIT09Im5vbmUiJiYhZi5fZGF0YShkLCJvbGRkaXNwbGF5IikmJmYuX2RhdGEoZCwib2xkZGlzcGxheSIsZSkpO2ZvcihnPTA7ZzxoO2crKyl0aGlzW2ddLnN0eWxlJiYodGhpc1tnXS5zdHlsZS5kaXNwbGF5PSJub25lIik7cmV0dXJuIHRoaXN9LF90b2dnbGU6Zi5mbi50b2dnbGUsdG9nZ2xlOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD10eXBlb2YgYT09ImJvb2xlYW4iO2YuaXNGdW5jdGlvbihhKSYmZi5pc0Z1bmN0aW9uKGIpP3RoaXMuX3RvZ2dsZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6YT09bnVsbHx8ZD90aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYj1kP2E6Zih0aGlzKS5pcygiOmhpZGRlbiIpO2YodGhpcylbYj8ic2hvdyI6ImhpZGUiXSgpfSk6dGhpcy5hbmltYXRlKGN1KCJ0b2dnbGUiLDMpLGEsYixjKTtyZXR1cm4gdGhpc30sZmFkZVRvOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLmZpbHRlcigiOmhpZGRlbiIpLmNzcygib3BhY2l0eSIsMCkuc2hvdygpLmVuZCgpLmFuaW1hdGUoe29wYWNpdHk6Yn0sYSxjLGQpfSxhbmltYXRlOmZ1bmN0aW9uKGEsYixjLGQpe2Z1bmN0aW9uIGcoKXtlLnF1ZXVlPT09ITEmJmYuX21hcmsodGhpcyk7dmFyIGI9Zi5leHRlbmQoe30sZSksYz10aGlzLm5vZGVUeXBlPT09MSxkPWMmJmYodGhpcykuaXMoIjpoaWRkZW4iKSxnLGgsaSxqLGssbCxtLG4sbztiLmFuaW1hdGVkUHJvcGVydGllcz17fTtmb3IoaSBpbiBhKXtnPWYuY2FtZWxDYXNlKGkpLGkhPT1nJiYoYVtnXT1hW2ldLGRlbGV0ZSBhW2ldKSxoPWFbZ10sZi5pc0FycmF5KGgpPyhiLmFuaW1hdGVkUHJvcGVydGllc1tnXT1oWzFdLGg9YVtnXT1oWzBdKTpiLmFuaW1hdGVkUHJvcGVydGllc1tnXT1iLnNwZWNpYWxFYXNpbmcmJmIuc3BlY2lhbEVhc2luZ1tnXXx8Yi5lYXNpbmd8fCJzd2luZyI7aWYoaD09PSJoaWRlIiYmZHx8aD09PSJzaG93IiYmIWQpcmV0dXJuIGIuY29tcGxldGUuY2FsbCh0aGlzKTtjJiYoZz09PSJoZWlnaHQifHxnPT09IndpZHRoIikmJihiLm92ZXJmbG93PVt0aGlzLnN0eWxlLm92ZXJmbG93LHRoaXMuc3R5bGUub3ZlcmZsb3dYLHRoaXMuc3R5bGUub3ZlcmZsb3dZXSxmLmNzcyh0aGlzLCJkaXNwbGF5Iik9PT0iaW5saW5lIiYmZi5jc3ModGhpcywiZmxvYXQiKT09PSJub25lIiYmKCFmLnN1cHBvcnQuaW5saW5lQmxvY2tOZWVkc0xheW91dHx8Y3YodGhpcy5ub2RlTmFtZSk9PT0iaW5saW5lIj90aGlzLnN0eWxlLmRpc3BsYXk9ImlubGluZS1ibG9jayI6dGhpcy5zdHlsZS56b29tPTEpKX1iLm92ZXJmbG93IT1udWxsJiYodGhpcy5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIik7Zm9yKGkgaW4gYSlqPW5ldyBmLmZ4KHRoaXMsYixpKSxoPWFbaV0sY24udGVzdChoKT8obz1mLl9kYXRhKHRoaXMsInRvZ2dsZSIraSl8fChoPT09InRvZ2dsZSI/ZD8ic2hvdyI6ImhpZGUiOjApLG8/KGYuX2RhdGEodGhpcywidG9nZ2xlIitpLG89PT0ic2hvdyI/ImhpZGUiOiJzaG93IiksaltvXSgpKTpqW2hdKCkpOihrPWNvLmV4ZWMoaCksbD1qLmN1cigpLGs/KG09cGFyc2VGbG9hdChrWzJdKSxuPWtbM118fChmLmNzc051bWJlcltpXT8iIjoicHgiKSxuIT09InB4IiYmKGYuc3R5bGUodGhpcyxpLChtfHwxKStuKSxsPShtfHwxKS9qLmN1cigpKmwsZi5zdHlsZSh0aGlzLGksbCtuKSksa1sxXSYmKG09KGtbMV09PT0iLT0iPy0xOjEpKm0rbCksai5jdXN0b20obCxtLG4pKTpqLmN1c3RvbShsLGgsIiIpKTtyZXR1cm4hMH12YXIgZT1mLnNwZWVkKGIsYyxkKTtpZihmLmlzRW1wdHlPYmplY3QoYSkpcmV0dXJuIHRoaXMuZWFjaChlLmNvbXBsZXRlLFshMV0pO2E9Zi5leHRlbmQoe30sYSk7cmV0dXJuIGUucXVldWU9PT0hMT90aGlzLmVhY2goZyk6dGhpcy5xdWV1ZShlLnF1ZXVlLGcpfSxzdG9wOmZ1bmN0aW9uKGEsYyxkKXt0eXBlb2YgYSE9InN0cmluZyImJihkPWMsYz1hLGE9YiksYyYmYSE9PSExJiZ0aGlzLnF1ZXVlKGF8fCJmeCIsW10pO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtmdW5jdGlvbiBoKGEsYixjKXt2YXIgZT1iW2NdO2YucmVtb3ZlRGF0YShhLGMsITApLGUuc3RvcChkKX12YXIgYixjPSExLGU9Zi50aW1lcnMsZz1mLl9kYXRhKHRoaXMpO2R8fGYuX3VubWFyayghMCx0aGlzKTtpZihhPT1udWxsKWZvcihiIGluIGcpZ1tiXSYmZ1tiXS5zdG9wJiZiLmluZGV4T2YoIi5ydW4iKT09PWIubGVuZ3RoLTQmJmgodGhpcyxnLGIpO2Vsc2UgZ1tiPWErIi5ydW4iXSYmZ1tiXS5zdG9wJiZoKHRoaXMsZyxiKTtmb3IoYj1lLmxlbmd0aDtiLS07KWVbYl0uZWxlbT09PXRoaXMmJihhPT1udWxsfHxlW2JdLnF1ZXVlPT09YSkmJihkP2VbYl0oITApOmVbYl0uc2F2ZVN0YXRlKCksYz0hMCxlLnNwbGljZShiLDEpKTsoIWR8fCFjKSYmZi5kZXF1ZXVlKHRoaXMsYSl9KX19KSxmLmVhY2goe3NsaWRlRG93bjpjdSgic2hvdyIsMSksc2xpZGVVcDpjdSgiaGlkZSIsMSksc2xpZGVUb2dnbGU6Y3UoInRvZ2dsZSIsMSksZmFkZUluOntvcGFjaXR5OiJzaG93In0sZmFkZU91dDp7b3BhY2l0eToiaGlkZSJ9LGZhZGVUb2dnbGU6e29wYWNpdHk6InRvZ2dsZSJ9fSxmdW5jdGlvbihhLGIpe2YuZm5bYV09ZnVuY3Rpb24oYSxjLGQpe3JldHVybiB0aGlzLmFuaW1hdGUoYixhLGMsZCl9fSksZi5leHRlbmQoe3NwZWVkOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hJiZ0eXBlb2YgYT09Im9iamVjdCI/Zi5leHRlbmQoe30sYSk6e2NvbXBsZXRlOmN8fCFjJiZifHxmLmlzRnVuY3Rpb24oYSkmJmEsZHVyYXRpb246YSxlYXNpbmc6YyYmYnx8YiYmIWYuaXNGdW5jdGlvbihiKSYmYn07ZC5kdXJhdGlvbj1mLmZ4Lm9mZj8wOnR5cGVvZiBkLmR1cmF0aW9uPT0ibnVtYmVyIj9kLmR1cmF0aW9uOmQuZHVyYXRpb24gaW4gZi5meC5zcGVlZHM/Zi5meC5zcGVlZHNbZC5kdXJhdGlvbl06Zi5meC5zcGVlZHMuX2RlZmF1bHQ7aWYoZC5xdWV1ZT09bnVsbHx8ZC5xdWV1ZT09PSEwKWQucXVldWU9ImZ4IjtkLm9sZD1kLmNvbXBsZXRlLGQuY29tcGxldGU9ZnVuY3Rpb24oYSl7Zi5pc0Z1bmN0aW9uKGQub2xkKSYmZC5vbGQuY2FsbCh0aGlzKSxkLnF1ZXVlP2YuZGVxdWV1ZSh0aGlzLGQucXVldWUpOmEhPT0hMSYmZi5fdW5tYXJrKHRoaXMpfTtyZXR1cm4gZH0sZWFzaW5nOntsaW5lYXI6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIGMrZCphfSxzd2luZzpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4oLU1hdGguY29zKGEqTWF0aC5QSSkvMisuNSkqZCtjfX0sdGltZXJzOltdLGZ4OmZ1bmN0aW9uKGEsYixjKXt0aGlzLm9wdGlvbnM9Yix0aGlzLmVsZW09YSx0aGlzLnByb3A9YyxiLm9yaWc9Yi5vcmlnfHx7fX19KSxmLmZ4LnByb3RvdHlwZT17dXBkYXRlOmZ1bmN0aW9uKCl7dGhpcy5vcHRpb25zLnN0ZXAmJnRoaXMub3B0aW9ucy5zdGVwLmNhbGwodGhpcy5lbGVtLHRoaXMubm93LHRoaXMpLChmLmZ4LnN0ZXBbdGhpcy5wcm9wXXx8Zi5meC5zdGVwLl9kZWZhdWx0KSh0aGlzKX0sY3VyOmZ1bmN0aW9uKCl7aWYodGhpcy5lbGVtW3RoaXMucHJvcF0hPW51bGwmJighdGhpcy5lbGVtLnN0eWxlfHx0aGlzLmVsZW0uc3R5bGVbdGhpcy5wcm9wXT09bnVsbCkpcmV0dXJuIHRoaXMuZWxlbVt0aGlzLnByb3BdO3ZhciBhLGI9Zi5jc3ModGhpcy5lbGVtLHRoaXMucHJvcCk7cmV0dXJuIGlzTmFOKGE9cGFyc2VGbG9hdChiKSk/IWJ8fGI9PT0iYXV0byI/MDpiOmF9LGN1c3RvbTpmdW5jdGlvbihhLGMsZCl7ZnVuY3Rpb24gaChhKXtyZXR1cm4gZS5zdGVwKGEpfXZhciBlPXRoaXMsZz1mLmZ4O3RoaXMuc3RhcnRUaW1lPWNyfHxjcygpLHRoaXMuZW5kPWMsdGhpcy5ub3c9dGhpcy5zdGFydD1hLHRoaXMucG9zPXRoaXMuc3RhdGU9MCx0aGlzLnVuaXQ9ZHx8dGhpcy51bml0fHwoZi5jc3NOdW1iZXJbdGhpcy5wcm9wXT8iIjoicHgiKSxoLnF1ZXVlPXRoaXMub3B0aW9ucy5xdWV1ZSxoLmVsZW09dGhpcy5lbGVtLGguc2F2ZVN0YXRlPWZ1bmN0aW9uKCl7ZS5vcHRpb25zLmhpZGUmJmYuX2RhdGEoZS5lbGVtLCJmeHNob3ciK2UucHJvcCk9PT1iJiZmLl9kYXRhKGUuZWxlbSwiZnhzaG93IitlLnByb3AsZS5zdGFydCl9LGgoKSYmZi50aW1lcnMucHVzaChoKSYmIWNwJiYoY3A9c2V0SW50ZXJ2YWwoZy50aWNrLGcuaW50ZXJ2YWwpKX0sc2hvdzpmdW5jdGlvbigpe3ZhciBhPWYuX2RhdGEodGhpcy5lbGVtLCJmeHNob3ciK3RoaXMucHJvcCk7dGhpcy5vcHRpb25zLm9yaWdbdGhpcy5wcm9wXT1hfHxmLnN0eWxlKHRoaXMuZWxlbSx0aGlzLnByb3ApLHRoaXMub3B0aW9ucy5zaG93PSEwLGEhPT1iP3RoaXMuY3VzdG9tKHRoaXMuY3VyKCksYSk6dGhpcy5jdXN0b20odGhpcy5wcm9wPT09IndpZHRoInx8dGhpcy5wcm9wPT09ImhlaWdodCI/MTowLHRoaXMuY3VyKCkpLGYodGhpcy5lbGVtKS5zaG93KCl9LGhpZGU6ZnVuY3Rpb24oKXt0aGlzLm9wdGlvbnMub3JpZ1t0aGlzLnByb3BdPWYuX2RhdGEodGhpcy5lbGVtLCJmeHNob3ciK3RoaXMucHJvcCl8fGYuc3R5bGUodGhpcy5lbGVtLHRoaXMucHJvcCksdGhpcy5vcHRpb25zLmhpZGU9ITAsdGhpcy5jdXN0b20odGhpcy5jdXIoKSwwKX0sc3RlcDpmdW5jdGlvbihhKXt2YXIgYixjLGQsZT1jcnx8Y3MoKSxnPSEwLGg9dGhpcy5lbGVtLGk9dGhpcy5vcHRpb25zO2lmKGF8fGU+PWkuZHVyYXRpb24rdGhpcy5zdGFydFRpbWUpe3RoaXMubm93PXRoaXMuZW5kLHRoaXMucG9zPXRoaXMuc3RhdGU9MSx0aGlzLnVwZGF0ZSgpLGkuYW5pbWF0ZWRQcm9wZXJ0aWVzW3RoaXMucHJvcF09ITA7Zm9yKGIgaW4gaS5hbmltYXRlZFByb3BlcnRpZXMpaS5hbmltYXRlZFByb3BlcnRpZXNbYl0hPT0hMCYmKGc9ITEpO2lmKGcpe2kub3ZlcmZsb3chPW51bGwmJiFmLnN1cHBvcnQuc2hyaW5rV3JhcEJsb2NrcyYmZi5lYWNoKFsiIiwiWCIsIlkiXSxmdW5jdGlvbihhLGIpe2guc3R5bGVbIm92ZXJmbG93IitiXT1pLm92ZXJmbG93W2FdfSksaS5oaWRlJiZmKGgpLmhpZGUoKTtpZihpLmhpZGV8fGkuc2hvdylmb3IoYiBpbiBpLmFuaW1hdGVkUHJvcGVydGllcylmLnN0eWxlKGgsYixpLm9yaWdbYl0pLGYucmVtb3ZlRGF0YShoLCJmeHNob3ciK2IsITApLGYucmVtb3ZlRGF0YShoLCJ0b2dnbGUiK2IsITApO2Q9aS5jb21wbGV0ZSxkJiYoaS5jb21wbGV0ZT0hMSxkLmNhbGwoaCkpfXJldHVybiExfWkuZHVyYXRpb249PUluZmluaXR5P3RoaXMubm93PWU6KGM9ZS10aGlzLnN0YXJ0VGltZSx0aGlzLnN0YXRlPWMvaS5kdXJhdGlvbix0aGlzLnBvcz1mLmVhc2luZ1tpLmFuaW1hdGVkUHJvcGVydGllc1t0aGlzLnByb3BdXSh0aGlzLnN0YXRlLGMsMCwxLGkuZHVyYXRpb24pLHRoaXMubm93PXRoaXMuc3RhcnQrKHRoaXMuZW5kLXRoaXMuc3RhcnQpKnRoaXMucG9zKSx0aGlzLnVwZGF0ZSgpO3JldHVybiEwfX0sZi5leHRlbmQoZi5meCx7dGljazpmdW5jdGlvbigpe3ZhciBhLGI9Zi50aW1lcnMsYz0wO2Zvcig7YzxiLmxlbmd0aDtjKyspYT1iW2NdLCFhKCkmJmJbY109PT1hJiZiLnNwbGljZShjLS0sMSk7Yi5sZW5ndGh8fGYuZnguc3RvcCgpfSxpbnRlcnZhbDoxMyxzdG9wOmZ1bmN0aW9uKCl7Y2xlYXJJbnRlcnZhbChjcCksY3A9bnVsbH0sc3BlZWRzOntzbG93OjYwMCxmYXN0OjIwMCxfZGVmYXVsdDo0MDB9LHN0ZXA6e29wYWNpdHk6ZnVuY3Rpb24oYSl7Zi5zdHlsZShhLmVsZW0sIm9wYWNpdHkiLGEubm93KX0sX2RlZmF1bHQ6ZnVuY3Rpb24oYSl7YS5lbGVtLnN0eWxlJiZhLmVsZW0uc3R5bGVbYS5wcm9wXSE9bnVsbD9hLmVsZW0uc3R5bGVbYS5wcm9wXT1hLm5vdythLnVuaXQ6YS5lbGVtW2EucHJvcF09YS5ub3d9fX0pLGYuZWFjaChbIndpZHRoIiwiaGVpZ2h0Il0sZnVuY3Rpb24oYSxiKXtmLmZ4LnN0ZXBbYl09ZnVuY3Rpb24oYSl7Zi5zdHlsZShhLmVsZW0sYixNYXRoLm1heCgwLGEubm93KSthLnVuaXQpfX0pLGYuZXhwciYmZi5leHByLmZpbHRlcnMmJihmLmV4cHIuZmlsdGVycy5hbmltYXRlZD1mdW5jdGlvbihhKXtyZXR1cm4gZi5ncmVwKGYudGltZXJzLGZ1bmN0aW9uKGIpe3JldHVybiBhPT09Yi5lbGVtfSkubGVuZ3RofSk7dmFyIGN3PS9edCg/OmFibGV8ZHxoKSQvaSxjeD0vXig/OmJvZHl8aHRtbCkkL2k7ImdldEJvdW5kaW5nQ2xpZW50UmVjdCJpbiBjLmRvY3VtZW50RWxlbWVudD9mLmZuLm9mZnNldD1mdW5jdGlvbihhKXt2YXIgYj10aGlzWzBdLGM7aWYoYSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe2Yub2Zmc2V0LnNldE9mZnNldCh0aGlzLGEsYil9KTtpZighYnx8IWIub3duZXJEb2N1bWVudClyZXR1cm4gbnVsbDtpZihiPT09Yi5vd25lckRvY3VtZW50LmJvZHkpcmV0dXJuIGYub2Zmc2V0LmJvZHlPZmZzZXQoYik7dHJ5e2M9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKX1jYXRjaChkKXt9dmFyIGU9Yi5vd25lckRvY3VtZW50LGc9ZS5kb2N1bWVudEVsZW1lbnQ7aWYoIWN8fCFmLmNvbnRhaW5zKGcsYikpcmV0dXJuIGM/e3RvcDpjLnRvcCxsZWZ0OmMubGVmdH06e3RvcDowLGxlZnQ6MH07dmFyIGg9ZS5ib2R5LGk9Y3koZSksaj1nLmNsaWVudFRvcHx8aC5jbGllbnRUb3B8fDAsaz1nLmNsaWVudExlZnR8fGguY2xpZW50TGVmdHx8MCxsPWkucGFnZVlPZmZzZXR8fGYuc3VwcG9ydC5ib3hNb2RlbCYmZy5zY3JvbGxUb3B8fGguc2Nyb2xsVG9wLG09aS5wYWdlWE9mZnNldHx8Zi5zdXBwb3J0LmJveE1vZGVsJiZnLnNjcm9sbExlZnR8fGguc2Nyb2xsTGVmdCxuPWMudG9wK2wtaixvPWMubGVmdCttLWs7cmV0dXJue3RvcDpuLGxlZnQ6b319OmYuZm4ub2Zmc2V0PWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXNbMF07aWYoYSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe2Yub2Zmc2V0LnNldE9mZnNldCh0aGlzLGEsYil9KTtpZighYnx8IWIub3duZXJEb2N1bWVudClyZXR1cm4gbnVsbDtpZihiPT09Yi5vd25lckRvY3VtZW50LmJvZHkpcmV0dXJuIGYub2Zmc2V0LmJvZHlPZmZzZXQoYik7dmFyIGMsZD1iLm9mZnNldFBhcmVudCxlPWIsZz1iLm93bmVyRG9jdW1lbnQsaD1nLmRvY3VtZW50RWxlbWVudCxpPWcuYm9keSxqPWcuZGVmYXVsdFZpZXcsaz1qP2ouZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpOmIuY3VycmVudFN0eWxlLGw9Yi5vZmZzZXRUb3AsbT1iLm9mZnNldExlZnQ7d2hpbGUoKGI9Yi5wYXJlbnROb2RlKSYmYiE9PWkmJmIhPT1oKXtpZihmLnN1cHBvcnQuZml4ZWRQb3NpdGlvbiYmay5wb3NpdGlvbj09PSJmaXhlZCIpYnJlYWs7Yz1qP2ouZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpOmIuY3VycmVudFN0eWxlLGwtPWIuc2Nyb2xsVG9wLG0tPWIuc2Nyb2xsTGVmdCxiPT09ZCYmKGwrPWIub2Zmc2V0VG9wLG0rPWIub2Zmc2V0TGVmdCxmLnN1cHBvcnQuZG9lc05vdEFkZEJvcmRlciYmKCFmLnN1cHBvcnQuZG9lc0FkZEJvcmRlckZvclRhYmxlQW5kQ2VsbHN8fCFjdy50ZXN0KGIubm9kZU5hbWUpKSYmKGwrPXBhcnNlRmxvYXQoYy5ib3JkZXJUb3BXaWR0aCl8fDAsbSs9cGFyc2VGbG9hdChjLmJvcmRlckxlZnRXaWR0aCl8fDApLGU9ZCxkPWIub2Zmc2V0UGFyZW50KSxmLnN1cHBvcnQuc3VidHJhY3RzQm9yZGVyRm9yT3ZlcmZsb3dOb3RWaXNpYmxlJiZjLm92ZXJmbG93IT09InZpc2libGUiJiYobCs9cGFyc2VGbG9hdChjLmJvcmRlclRvcFdpZHRoKXx8MCxtKz1wYXJzZUZsb2F0KGMuYm9yZGVyTGVmdFdpZHRoKXx8MCksaz1jfWlmKGsucG9zaXRpb249PT0icmVsYXRpdmUifHxrLnBvc2l0aW9uPT09InN0YXRpYyIpbCs9aS5vZmZzZXRUb3AsbSs9aS5vZmZzZXRMZWZ0O2Yuc3VwcG9ydC5maXhlZFBvc2l0aW9uJiZrLnBvc2l0aW9uPT09ImZpeGVkIiYmKGwrPU1hdGgubWF4KGguc2Nyb2xsVG9wLGkuc2Nyb2xsVG9wKSxtKz1NYXRoLm1heChoLnNjcm9sbExlZnQsaS5zY3JvbGxMZWZ0KSk7cmV0dXJue3RvcDpsLGxlZnQ6bX19LGYub2Zmc2V0PXtib2R5T2Zmc2V0OmZ1bmN0aW9uKGEpe3ZhciBiPWEub2Zmc2V0VG9wLGM9YS5vZmZzZXRMZWZ0O2Yuc3VwcG9ydC5kb2VzTm90SW5jbHVkZU1hcmdpbkluQm9keU9mZnNldCYmKGIrPXBhcnNlRmxvYXQoZi5jc3MoYSwibWFyZ2luVG9wIikpfHwwLGMrPXBhcnNlRmxvYXQoZi5jc3MoYSwibWFyZ2luTGVmdCIpKXx8MCk7cmV0dXJue3RvcDpiLGxlZnQ6Y319LHNldE9mZnNldDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9Zi5jc3MoYSwicG9zaXRpb24iKTtkPT09InN0YXRpYyImJihhLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIpO3ZhciBlPWYoYSksZz1lLm9mZnNldCgpLGg9Zi5jc3MoYSwidG9wIiksaT1mLmNzcyhhLCJsZWZ0Iiksaj0oZD09PSJhYnNvbHV0ZSJ8fGQ9PT0iZml4ZWQiKSYmZi5pbkFycmF5KCJhdXRvIixbaCxpXSk+LTEsaz17fSxsPXt9LG0sbjtqPyhsPWUucG9zaXRpb24oKSxtPWwudG9wLG49bC5sZWZ0KToobT1wYXJzZUZsb2F0KGgpfHwwLG49cGFyc2VGbG9hdChpKXx8MCksZi5pc0Z1bmN0aW9uKGIpJiYoYj1iLmNhbGwoYSxjLGcpKSxiLnRvcCE9bnVsbCYmKGsudG9wPWIudG9wLWcudG9wK20pLGIubGVmdCE9bnVsbCYmKGsubGVmdD1iLmxlZnQtZy5sZWZ0K24pLCJ1c2luZyJpbiBiP2IudXNpbmcuY2FsbChhLGspOmUuY3NzKGspfX0sZi5mbi5leHRlbmQoe3Bvc2l0aW9uOmZ1bmN0aW9uKCl7aWYoIXRoaXNbMF0pcmV0dXJuIG51bGw7dmFyIGE9dGhpc1swXSxiPXRoaXMub2Zmc2V0UGFyZW50KCksYz10aGlzLm9mZnNldCgpLGQ9Y3gudGVzdChiWzBdLm5vZGVOYW1lKT97dG9wOjAsbGVmdDowfTpiLm9mZnNldCgpO2MudG9wLT1wYXJzZUZsb2F0KGYuY3NzKGEsIm1hcmdpblRvcCIpKXx8MCxjLmxlZnQtPXBhcnNlRmxvYXQoZi5jc3MoYSwibWFyZ2luTGVmdCIpKXx8MCxkLnRvcCs9cGFyc2VGbG9hdChmLmNzcyhiWzBdLCJib3JkZXJUb3BXaWR0aCIpKXx8MCxkLmxlZnQrPXBhcnNlRmxvYXQoZi5jc3MoYlswXSwiYm9yZGVyTGVmdFdpZHRoIikpfHwwO3JldHVybnt0b3A6Yy50b3AtZC50b3AsbGVmdDpjLmxlZnQtZC5sZWZ0fX0sb2Zmc2V0UGFyZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vZmZzZXRQYXJlbnR8fGMuYm9keTt3aGlsZShhJiYhY3gudGVzdChhLm5vZGVOYW1lKSYmZi5jc3MoYSwicG9zaXRpb24iKT09PSJzdGF0aWMiKWE9YS5vZmZzZXRQYXJlbnQ7cmV0dXJuIGF9KX19KSxmLmVhY2goWyJMZWZ0IiwiVG9wIl0sZnVuY3Rpb24oYSxjKXt2YXIgZD0ic2Nyb2xsIitjO2YuZm5bZF09ZnVuY3Rpb24oYyl7dmFyIGUsZztpZihjPT09Yil7ZT10aGlzWzBdO2lmKCFlKXJldHVybiBudWxsO2c9Y3koZSk7cmV0dXJuIGc/InBhZ2VYT2Zmc2V0ImluIGc/Z1thPyJwYWdlWU9mZnNldCI6InBhZ2VYT2Zmc2V0Il06Zi5zdXBwb3J0LmJveE1vZGVsJiZnLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFtkXXx8Zy5kb2N1bWVudC5ib2R5W2RdOmVbZF19cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2c9Y3kodGhpcyksZz9nLnNjcm9sbFRvKGE/ZihnKS5zY3JvbGxMZWZ0KCk6YyxhP2M6ZihnKS5zY3JvbGxUb3AoKSk6dGhpc1tkXT1jfSl9fSksZi5lYWNoKFsiSGVpZ2h0IiwiV2lkdGgiXSxmdW5jdGlvbihhLGMpe3ZhciBkPWMudG9Mb3dlckNhc2UoKTtmLmZuWyJpbm5lciIrY109ZnVuY3Rpb24oKXt2YXIgYT10aGlzWzBdO3JldHVybiBhP2Euc3R5bGU/cGFyc2VGbG9hdChmLmNzcyhhLGQsInBhZGRpbmciKSk6dGhpc1tkXSgpOm51bGx9LGYuZm5bIm91dGVyIitjXT1mdW5jdGlvbihhKXt2YXIgYj10aGlzWzBdO3JldHVybiBiP2Iuc3R5bGU/cGFyc2VGbG9hdChmLmNzcyhiLGQsYT8ibWFyZ2luIjoiYm9yZGVyIikpOnRoaXNbZF0oKTpudWxsfSxmLmZuW2RdPWZ1bmN0aW9uKGEpe3ZhciBlPXRoaXNbMF07aWYoIWUpcmV0dXJuIGE9PW51bGw/bnVsbDp0aGlzO2lmKGYuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe3ZhciBjPWYodGhpcyk7Y1tkXShhLmNhbGwodGhpcyxiLGNbZF0oKSkpfSk7aWYoZi5pc1dpbmRvdyhlKSl7dmFyIGc9ZS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIrY10saD1lLmRvY3VtZW50LmJvZHk7cmV0dXJuIGUuZG9jdW1lbnQuY29tcGF0TW9kZT09PSJDU1MxQ29tcGF0IiYmZ3x8aCYmaFsiY2xpZW50IitjXXx8Z31pZihlLm5vZGVUeXBlPT09OSlyZXR1cm4gTWF0aC5tYXgoZS5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIrY10sZS5ib2R5WyJzY3JvbGwiK2NdLGUuZG9jdW1lbnRFbGVtZW50WyJzY3JvbGwiK2NdLGUuYm9keVsib2Zmc2V0IitjXSxlLmRvY3VtZW50RWxlbWVudFsib2Zmc2V0IitjXSk7aWYoYT09PWIpe3ZhciBpPWYuY3NzKGUsZCksaj1wYXJzZUZsb2F0KGkpO3JldHVybiBmLmlzTnVtZXJpYyhqKT9qOml9cmV0dXJuIHRoaXMuY3NzKGQsdHlwZW9mIGE9PSJzdHJpbmciP2E6YSsicHgiKX19KSxhLmpRdWVyeT1hLiQ9Zix0eXBlb2YgZGVmaW5lPT0iZnVuY3Rpb24iJiZkZWZpbmUuYW1kJiZkZWZpbmUuYW1kLmpRdWVyeSYmZGVmaW5lKCJqcXVlcnkiLFtdLGZ1bmN0aW9uKCl7cmV0dXJuIGZ9KX0pKHdpbmRvdyk7]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/lib/jquery.bgiframe.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohIENvcHlyaWdodCAoYykgMjAxMCBCcmFuZG9uIEFhcm9uIChodHRwOi8vYnJhbmRvbmFhcm9uLm5ldCkKICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlIChMSUNFTlNFLnR4dCkuCiAqCiAqIFZlcnNpb24gMi4xLjMtcHJlCiAqLwoKKGZ1bmN0aW9uKCQpewoKJC5mbi5iZ2lmcmFtZSA9ICgkLmJyb3dzZXIubXNpZSAmJiAvbXNpZSA2XC4wL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSA/IGZ1bmN0aW9uKHMpIHsKICAgIHMgPSAkLmV4dGVuZCh7CiAgICAgICAgdG9wICAgICA6ICdhdXRvJywgLy8gYXV0byA9PSAuY3VycmVudFN0eWxlLmJvcmRlclRvcFdpZHRoCiAgICAgICAgbGVmdCAgICA6ICdhdXRvJywgLy8gYXV0byA9PSAuY3VycmVudFN0eWxlLmJvcmRlckxlZnRXaWR0aAogICAgICAgIHdpZHRoICAgOiAnYXV0bycsIC8vIGF1dG8gPT0gb2Zmc2V0V2lkdGgKICAgICAgICBoZWlnaHQgIDogJ2F1dG8nLCAvLyBhdXRvID09IG9mZnNldEhlaWdodAogICAgICAgIG9wYWNpdHkgOiB0cnVlLAogICAgICAgIHNyYyAgICAgOiAnamF2YXNjcmlwdDpmYWxzZTsnCiAgICB9LCBzKTsKICAgIHZhciBodG1sID0gJzxpZnJhbWUgY2xhc3M9ImJnaWZyYW1lImZyYW1lYm9yZGVyPSIwInRhYmluZGV4PSItMSJzcmM9Iicrcy5zcmMrJyInKwogICAgICAgICAgICAgICAgICAgJ3N0eWxlPSJkaXNwbGF5OmJsb2NrO3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6LTE7JysKICAgICAgICAgICAgICAgICAgICAgICAocy5vcGFjaXR5ICE9PSBmYWxzZT8nZmlsdGVyOkFscGhhKE9wYWNpdHk9XCcwXCcpOyc6JycpKwogICAgICAgICAgICAgICAgICAgICAgICd0b3A6Jysocy50b3A9PSdhdXRvJz8nZXhwcmVzc2lvbigoKHBhcnNlSW50KHRoaXMucGFyZW50Tm9kZS5jdXJyZW50U3R5bGUuYm9yZGVyVG9wV2lkdGgpfHwwKSotMSkrXCdweFwnKSc6cHJvcChzLnRvcCkpKyc7JysKICAgICAgICAgICAgICAgICAgICAgICAnbGVmdDonKyhzLmxlZnQ9PSdhdXRvJz8nZXhwcmVzc2lvbigoKHBhcnNlSW50KHRoaXMucGFyZW50Tm9kZS5jdXJyZW50U3R5bGUuYm9yZGVyTGVmdFdpZHRoKXx8MCkqLTEpK1wncHhcJyknOnByb3Aocy5sZWZ0KSkrJzsnKwogICAgICAgICAgICAgICAgICAgICAgICd3aWR0aDonKyhzLndpZHRoPT0nYXV0byc/J2V4cHJlc3Npb24odGhpcy5wYXJlbnROb2RlLm9mZnNldFdpZHRoK1wncHhcJyknOnByb3Aocy53aWR0aCkpKyc7JysKICAgICAgICAgICAgICAgICAgICAgICAnaGVpZ2h0OicrKHMuaGVpZ2h0PT0nYXV0byc/J2V4cHJlc3Npb24odGhpcy5wYXJlbnROb2RlLm9mZnNldEhlaWdodCtcJ3B4XCcpJzpwcm9wKHMuaGVpZ2h0KSkrJzsnKwogICAgICAgICAgICAgICAgJyIvPic7CiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgIGlmICggJCh0aGlzKS5jaGlsZHJlbignaWZyYW1lLmJnaWZyYW1lJykubGVuZ3RoID09PSAwICkKICAgICAgICAgICAgdGhpcy5pbnNlcnRCZWZvcmUoIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoaHRtbCksIHRoaXMuZmlyc3RDaGlsZCApOwogICAgfSk7Cn0gOiBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pOwoKLy8gb2xkIGFsaWFzCiQuZm4uYmdJZnJhbWUgPSAkLmZuLmJnaWZyYW1lOwoKZnVuY3Rpb24gcHJvcChuKSB7CiAgICByZXR1cm4gbiAmJiBuLmNvbnN0cnVjdG9yID09PSBOdW1iZXIgPyBuICsgJ3B4JyA6IG47Cn0KCn0pKGpRdWVyeSk7]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/lib/jquery.bgiframe.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohIENvcHlyaWdodCAoYykgMjAxMCBCcmFuZG9uIEFhcm9uIChodHRwOi8vYnJhbmRvbmFhcm9uLm5ldCkKICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlIChMSUNFTlNFLnR4dCkuCiAqCiAqIFZlcnNpb24gMi4xLjMtcHJlCiAqLwooZnVuY3Rpb24oJCl7JC5mbi5iZ2lmcmFtZT0oJC5icm93c2VyLm1zaWUmJi9tc2llIDZcLjAvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpP2Z1bmN0aW9uKHMpe3M9JC5leHRlbmQoe3RvcDonYXV0bycsbGVmdDonYXV0bycsd2lkdGg6J2F1dG8nLGhlaWdodDonYXV0bycsb3BhY2l0eTp0cnVlLHNyYzonamF2YXNjcmlwdDpmYWxzZTsnfSxzKTt2YXIgaHRtbD0nPGlmcmFtZSBjbGFzcz0iYmdpZnJhbWUiZnJhbWVib3JkZXI9IjAidGFiaW5kZXg9Ii0xInNyYz0iJytzLnNyYysnIicrJ3N0eWxlPSJkaXNwbGF5OmJsb2NrO3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6LTE7JysKKHMub3BhY2l0eSE9PWZhbHNlPydmaWx0ZXI6QWxwaGEoT3BhY2l0eT1cJzBcJyk7JzonJykrJ3RvcDonKyhzLnRvcD09J2F1dG8nPydleHByZXNzaW9uKCgocGFyc2VJbnQodGhpcy5wYXJlbnROb2RlLmN1cnJlbnRTdHlsZS5ib3JkZXJUb3BXaWR0aCl8fDApKi0xKStcJ3B4XCcpJzpwcm9wKHMudG9wKSkrJzsnKydsZWZ0OicrKHMubGVmdD09J2F1dG8nPydleHByZXNzaW9uKCgocGFyc2VJbnQodGhpcy5wYXJlbnROb2RlLmN1cnJlbnRTdHlsZS5ib3JkZXJMZWZ0V2lkdGgpfHwwKSotMSkrXCdweFwnKSc6cHJvcChzLmxlZnQpKSsnOycrJ3dpZHRoOicrKHMud2lkdGg9PSdhdXRvJz8nZXhwcmVzc2lvbih0aGlzLnBhcmVudE5vZGUub2Zmc2V0V2lkdGgrXCdweFwnKSc6cHJvcChzLndpZHRoKSkrJzsnKydoZWlnaHQ6Jysocy5oZWlnaHQ9PSdhdXRvJz8nZXhwcmVzc2lvbih0aGlzLnBhcmVudE5vZGUub2Zmc2V0SGVpZ2h0K1wncHhcJyknOnByb3Aocy5oZWlnaHQpKSsnOycrJyIvPic7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2lmKCQodGhpcykuY2hpbGRyZW4oJ2lmcmFtZS5iZ2lmcmFtZScpLmxlbmd0aD09PTApCnRoaXMuaW5zZXJ0QmVmb3JlKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoaHRtbCksdGhpcy5maXJzdENoaWxkKTt9KTt9OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXM7fSk7JC5mbi5iZ0lmcmFtZT0kLmZuLmJnaWZyYW1lO2Z1bmN0aW9uIHByb3Aobil7cmV0dXJuIG4mJm4uY29uc3RydWN0b3I9PT1OdW1iZXI/bisncHgnOm47fX0pKGpRdWVyeSk7]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/lib/jquery.hoverIntent.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[77u/LyoqCiogaG92ZXJJbnRlbnQgaXMgc2ltaWxhciB0byBqUXVlcnkncyBidWlsdC1pbiAiaG92ZXIiIGZ1bmN0aW9uIGV4Y2VwdCB0aGF0CiogaW5zdGVhZCBvZiBmaXJpbmcgdGhlIG9uTW91c2VPdmVyIGV2ZW50IGltbWVkaWF0ZWx5LCBob3ZlckludGVudCBjaGVja3MKKiB0byBzZWUgaWYgdGhlIHVzZXIncyBtb3VzZSBoYXMgc2xvd2VkIGRvd24gKGJlbmVhdGggdGhlIHNlbnNpdGl2aXR5CiogdGhyZXNob2xkKSBiZWZvcmUgZmlyaW5nIHRoZSBvbk1vdXNlT3ZlciBldmVudC4KKiAKKiBob3ZlckludGVudCByNSAvLyAyMDA3LjAzLjI3IC8vIGpRdWVyeSAxLjEuMgoqIDxodHRwOi8vY2hlcm5lLm5ldC9icmlhbi9yZXNvdXJjZXMvanF1ZXJ5LmhvdmVySW50ZW50Lmh0bWw+CiogCiogaG92ZXJJbnRlbnQgaXMgY3VycmVudGx5IGF2YWlsYWJsZSBmb3IgdXNlIGluIGFsbCBwZXJzb25hbCBvciBjb21tZXJjaWFsIAoqIHByb2plY3RzIHVuZGVyIGJvdGggTUlUIGFuZCBHUEwgbGljZW5zZXMuIFRoaXMgbWVhbnMgdGhhdCB5b3UgY2FuIGNob29zZSAKKiB0aGUgbGljZW5zZSB0aGF0IGJlc3Qgc3VpdHMgeW91ciBwcm9qZWN0LCBhbmQgdXNlIGl0IGFjY29yZGluZ2x5LgoqIAoqIC8vIGJhc2ljIHVzYWdlIChqdXN0IGxpa2UgLmhvdmVyKSByZWNlaXZlcyBvbk1vdXNlT3ZlciBhbmQgb25Nb3VzZU91dCBmdW5jdGlvbnMKKiAkKCJ1bCBsaSIpLmhvdmVySW50ZW50KCBzaG93TmF2ICwgaGlkZU5hdiApOwoqIAoqIC8vIGFkdmFuY2VkIHVzYWdlIHJlY2VpdmVzIGNvbmZpZ3VyYXRpb24gb2JqZWN0IG9ubHkKKiAkKCJ1bCBsaSIpLmhvdmVySW50ZW50KHsKKglzZW5zaXRpdml0eTogMiwgLy8gbnVtYmVyID0gc2Vuc2l0aXZpdHkgdGhyZXNob2xkIChtdXN0IGJlIDEgb3IgaGlnaGVyKQoqCWludGVydmFsOiA1MCwgICAvLyBudW1iZXIgPSBtaWxsaXNlY29uZHMgb2YgcG9sbGluZyBpbnRlcnZhbAoqCW92ZXI6IHNob3dOYXYsICAvLyBmdW5jdGlvbiA9IG9uTW91c2VPdmVyIGNhbGxiYWNrIChyZXF1aXJlZCkKKgl0aW1lb3V0OiAxMDAsICAgLy8gbnVtYmVyID0gbWlsbGlzZWNvbmRzIGRlbGF5IGJlZm9yZSBvbk1vdXNlT3V0IGZ1bmN0aW9uIGNhbGwKKglvdXQ6IGhpZGVOYXYgICAgLy8gZnVuY3Rpb24gPSBvbk1vdXNlT3V0IGNhbGxiYWNrIChyZXF1aXJlZCkKKiB9KTsKKiAKKiBAcGFyYW0gIGYgIG9uTW91c2VPdmVyIGZ1bmN0aW9uIHx8IEFuIG9iamVjdCB3aXRoIGNvbmZpZ3VyYXRpb24gb3B0aW9ucwoqIEBwYXJhbSAgZyAgb25Nb3VzZU91dCBmdW5jdGlvbiAgfHwgTm90aGluZyAodXNlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBvYmplY3QpCiogQHJldHVybiAgICBUaGUgb2JqZWN0IChha2EgInRoaXMiKSB0aGF0IGNhbGxlZCBob3ZlckludGVudCwgYW5kIHRoZSBldmVudCBvYmplY3QKKiBAYXV0aG9yICAgIEJyaWFuIENoZXJuZSA8YnJpYW5AY2hlcm5lLm5ldD4KKiAKKiBtb2RpZmllZCBieSBLYXJsIFN3ZWRiZXJnLiBOYW1lc3BhY2VkIGV2ZW50cyBpbiBvcmRlciB0byB3b3JrIGJldHRlciB3aXRoIGNsdWVUaXAgcGx1Z2luCiovCihmdW5jdGlvbigkKSB7CgkkLmZuLmhvdmVySW50ZW50ID0gZnVuY3Rpb24oZixnKSB7CgkJLy8gZGVmYXVsdCBjb25maWd1cmF0aW9uIG9wdGlvbnMKCQl2YXIgY2ZnID0gewoJCQlzZW5zaXRpdml0eTogNywKCQkJaW50ZXJ2YWw6IDEwMCwKCQkJdGltZW91dDogMAoJCX07CgkJLy8gb3ZlcnJpZGUgY29uZmlndXJhdGlvbiBvcHRpb25zIHdpdGggdXNlciBzdXBwbGllZCBvYmplY3QKCQljZmcgPSAkLmV4dGVuZChjZmcsIGcgPyB7IG92ZXI6IGYsIG91dDogZyB9IDogZiApOwoKCQkvLyBpbnN0YW50aWF0ZSB2YXJpYWJsZXMKCQkvLyBjWCwgY1kgPSBjdXJyZW50IFggYW5kIFkgcG9zaXRpb24gb2YgbW91c2UsIHVwZGF0ZWQgYnkgbW91c2Vtb3ZlIGV2ZW50CgkJLy8gcFgsIHBZID0gcHJldmlvdXMgWCBhbmQgWSBwb3NpdGlvbiBvZiBtb3VzZSwgc2V0IGJ5IG1vdXNlb3ZlciBhbmQgcG9sbGluZyBpbnRlcnZhbAoJCXZhciBjWCwgY1ksIHBYLCBwWTsKCgkJLy8gQSBwcml2YXRlIGZ1bmN0aW9uIGZvciBnZXR0aW5nIG1vdXNlIHBvc2l0aW9uCgkJdmFyIHRyYWNrID0gZnVuY3Rpb24oZXYpIHsKCQkJY1ggPSBldi5wYWdlWDsKCQkJY1kgPSBldi5wYWdlWTsKCQl9OwoKCQkvLyBBIHByaXZhdGUgZnVuY3Rpb24gZm9yIGNvbXBhcmluZyBjdXJyZW50IGFuZCBwcmV2aW91cyBtb3VzZSBwb3NpdGlvbgoJCXZhciBjb21wYXJlID0gZnVuY3Rpb24oZXYsb2IpIHsKCQkJb2IuaG92ZXJJbnRlbnRfdCA9IGNsZWFyVGltZW91dChvYi5ob3ZlckludGVudF90KTsKCQkJLy8gY29tcGFyZSBtb3VzZSBwb3NpdGlvbnMgdG8gc2VlIGlmIHRoZXkndmUgY3Jvc3NlZCB0aGUgdGhyZXNob2xkCgkJCWlmICggKCBNYXRoLmFicyhwWC1jWCkgKyBNYXRoLmFicyhwWS1jWSkgKSA8IGNmZy5zZW5zaXRpdml0eSApIHsKCQkJCSQob2IpLnVuYmluZCgibW91c2Vtb3ZlIix0cmFjayk7CgkJCQkvLyBzZXQgaG92ZXJJbnRlbnQgc3RhdGUgdG8gdHJ1ZSAoc28gbW91c2VPdXQgY2FuIGJlIGNhbGxlZCkKCQkJCW9iLmhvdmVySW50ZW50X3MgPSAxOwoJCQkJcmV0dXJuIGNmZy5vdmVyLmFwcGx5KG9iLFtldl0pOwoJCQl9IGVsc2UgewoJCQkJLy8gc2V0IHByZXZpb3VzIGNvb3JkaW5hdGVzIGZvciBuZXh0IHRpbWUKCQkJCXBYID0gY1g7IHBZID0gY1k7CgkJCQkvLyB1c2Ugc2VsZi1jYWxsaW5nIHRpbWVvdXQsIGd1YXJhbnRlZXMgaW50ZXJ2YWxzIGFyZSBzcGFjZWQgb3V0IHByb3Blcmx5IChhdm9pZHMgSmF2YVNjcmlwdCB0aW1lciBidWdzKQoJCQkJb2IuaG92ZXJJbnRlbnRfdCA9IHNldFRpbWVvdXQoIGZ1bmN0aW9uKCl7Y29tcGFyZShldiwgb2IpO30gLCBjZmcuaW50ZXJ2YWwgKTsKCQkJfQoJCX07CgoJCS8vIEEgcHJpdmF0ZSBmdW5jdGlvbiBmb3IgZGVsYXlpbmcgdGhlIG1vdXNlT3V0IGZ1bmN0aW9uCgkJdmFyIGRlbGF5ID0gZnVuY3Rpb24oZXYsb2IpIHsKCQkJb2IuaG92ZXJJbnRlbnRfdCA9IGNsZWFyVGltZW91dChvYi5ob3ZlckludGVudF90KTsKCQkJb2IuaG92ZXJJbnRlbnRfcyA9IDA7CgkJCXJldHVybiBjZmcub3V0LmFwcGx5KG9iLFtldl0pOwoJCX07CgoJCS8vIEEgcHJpdmF0ZSBmdW5jdGlvbiBmb3IgaGFuZGxpbmcgbW91c2UgJ2hvdmVyaW5nJwoJCXZhciBoYW5kbGVIb3ZlciA9IGZ1bmN0aW9uKGUpIHsKCQkJLy8gbmV4dCB0aHJlZSBsaW5lcyBjb3BpZWQgZnJvbSBqUXVlcnkuaG92ZXIsIGlnbm9yZSBjaGlsZHJlbiBvbk1vdXNlT3Zlci9vbk1vdXNlT3V0CgkJCXZhciBwID0gKGUudHlwZSA9PSAibW91c2VvdmVyIiA/IGUuZnJvbUVsZW1lbnQgOiBlLnRvRWxlbWVudCkgfHwgZS5yZWxhdGVkVGFyZ2V0OwoJCQl3aGlsZSAoIHAgJiYgcCAhPSB0aGlzICkgeyB0cnkgeyBwID0gcC5wYXJlbnROb2RlOyB9IGNhdGNoKGUpIHsgcCA9IHRoaXM7IH0gfQoJCQlpZiAoIHAgPT0gdGhpcyApIHsgcmV0dXJuIGZhbHNlOyB9CgoJCQkvLyBjb3B5IG9iamVjdHMgdG8gYmUgcGFzc2VkIGludG8gdCAocmVxdWlyZWQgZm9yIGV2ZW50IG9iamVjdCB0byBiZSBwYXNzZWQgaW4gSUUpCgkJCXZhciBldiA9IGpRdWVyeS5leHRlbmQoe30sZSk7CgkJCXZhciBvYiA9IHRoaXM7CgoJCQkvLyBjYW5jZWwgaG92ZXJJbnRlbnQgdGltZXIgaWYgaXQgZXhpc3RzCgkJCWlmIChvYi5ob3ZlckludGVudF90KSB7IG9iLmhvdmVySW50ZW50X3QgPSBjbGVhclRpbWVvdXQob2IuaG92ZXJJbnRlbnRfdCk7IH0KCgkJCS8vIGVsc2UgZS50eXBlID09ICJvbm1vdXNlb3ZlciIKCQkJaWYgKGUudHlwZSA9PSAibW91c2VvdmVyIikgewoJCQkJLy8gc2V0ICJwcmV2aW91cyIgWCBhbmQgWSBwb3NpdGlvbiBiYXNlZCBvbiBpbml0aWFsIGVudHJ5IHBvaW50CgkJCQlwWCA9IGV2LnBhZ2VYOyBwWSA9IGV2LnBhZ2VZOwoJCQkJLy8gdXBkYXRlICJjdXJyZW50IiBYIGFuZCBZIHBvc2l0aW9uIGJhc2VkIG9uIG1vdXNlbW92ZQoJCQkJJChvYikuYmluZCgibW91c2Vtb3ZlLmNsdWV0aXAiLHRyYWNrKTsKCQkJCS8vIHN0YXJ0IHBvbGxpbmcgaW50ZXJ2YWwgKHNlbGYtY2FsbGluZyB0aW1lb3V0KSB0byBjb21wYXJlIG1vdXNlIGNvb3JkaW5hdGVzIG92ZXIgdGltZQoJCQkJaWYgKG9iLmhvdmVySW50ZW50X3MgIT0gMSkgeyBvYi5ob3ZlckludGVudF90ID0gc2V0VGltZW91dCggZnVuY3Rpb24oKXtjb21wYXJlKGV2LG9iKTt9ICwgY2ZnLmludGVydmFsICk7fQoKCQkJLy8gZWxzZSBlLnR5cGUgPT0gIm9ubW91c2VvdXQiCgkJCX0gZWxzZSB7CgkJCQkvLyB1bmJpbmQgZXhwZW5zaXZlIG1vdXNlbW92ZSBldmVudAoJCQkJJChvYikudW5iaW5kKCJtb3VzZW1vdmUuY2x1ZXRpcCIsdHJhY2spOwoJCQkJLy8gaWYgaG92ZXJJbnRlbnQgc3RhdGUgaXMgdHJ1ZSwgdGhlbiBjYWxsIHRoZSBtb3VzZU91dCBmdW5jdGlvbiBhZnRlciB0aGUgc3BlY2lmaWVkIGRlbGF5CgkJCQlpZiAob2IuaG92ZXJJbnRlbnRfcyA9PSAxKSB7IG9iLmhvdmVySW50ZW50X3QgPSBzZXRUaW1lb3V0KCBmdW5jdGlvbigpe2RlbGF5KGV2LG9iKTt9ICwgY2ZnLnRpbWVvdXQgKTt9CgkJCX0KCQl9OwoKCQkvLyBiaW5kIHRoZSBmdW5jdGlvbiB0byB0aGUgdHdvIGV2ZW50IGxpc3RlbmVycwoJCXJldHVybiB0aGlzLmJpbmQoJ21vdXNlb3Zlci5jbHVldGlwJywgaGFuZGxlSG92ZXIpLmJpbmQoJ21vdXNlb3V0LmNsdWV0aXAnLCBoYW5kbGVIb3Zlcik7Cgl9Owp9KShqUXVlcnkpOw==]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/lib/jquery.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohCiAqIGpRdWVyeSBKYXZhU2NyaXB0IExpYnJhcnkgdjEuNi4zCiAqIGh0dHA6Ly9qcXVlcnkuY29tLwogKgogKiBDb3B5cmlnaHQgMjAxMSwgSm9obiBSZXNpZwogKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgb3IgR1BMIFZlcnNpb24gMiBsaWNlbnNlcy4KICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBJbmNsdWRlcyBTaXp6bGUuanMKICogaHR0cDovL3NpenpsZWpzLmNvbS8KICogQ29weXJpZ2h0IDIwMTEsIFRoZSBEb2pvIEZvdW5kYXRpb24KICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCwgQlNELCBhbmQgR1BMIExpY2Vuc2VzLgogKgogKiBEYXRlOiBXZWQgQXVnIDMxIDEwOjUwOjMzIDIwMTEgLTA0MDAKICovCihmdW5jdGlvbiggd2luZG93LCB1bmRlZmluZWQgKSB7CgovLyBVc2UgdGhlIGNvcnJlY3QgZG9jdW1lbnQgYWNjb3JkaW5nbHkgd2l0aCB3aW5kb3cgYXJndW1lbnQgKHNhbmRib3gpCnZhciBkb2N1bWVudCA9IHdpbmRvdy5kb2N1bWVudCwKCW5hdmlnYXRvciA9IHdpbmRvdy5uYXZpZ2F0b3IsCglsb2NhdGlvbiA9IHdpbmRvdy5sb2NhdGlvbjsKdmFyIGpRdWVyeSA9IChmdW5jdGlvbigpIHsKCi8vIERlZmluZSBhIGxvY2FsIGNvcHkgb2YgalF1ZXJ5CnZhciBqUXVlcnkgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQgKSB7CgkJLy8gVGhlIGpRdWVyeSBvYmplY3QgaXMgYWN0dWFsbHkganVzdCB0aGUgaW5pdCBjb25zdHJ1Y3RvciAnZW5oYW5jZWQnCgkJcmV0dXJuIG5ldyBqUXVlcnkuZm4uaW5pdCggc2VsZWN0b3IsIGNvbnRleHQsIHJvb3RqUXVlcnkgKTsKCX0sCgoJLy8gTWFwIG92ZXIgalF1ZXJ5IGluIGNhc2Ugb2Ygb3ZlcndyaXRlCglfalF1ZXJ5ID0gd2luZG93LmpRdWVyeSwKCgkvLyBNYXAgb3ZlciB0aGUgJCBpbiBjYXNlIG9mIG92ZXJ3cml0ZQoJXyQgPSB3aW5kb3cuJCwKCgkvLyBBIGNlbnRyYWwgcmVmZXJlbmNlIHRvIHRoZSByb290IGpRdWVyeShkb2N1bWVudCkKCXJvb3RqUXVlcnksCgoJLy8gQSBzaW1wbGUgd2F5IHRvIGNoZWNrIGZvciBIVE1MIHN0cmluZ3Mgb3IgSUQgc3RyaW5ncwoJLy8gUHJpb3JpdGl6ZSAjaWQgb3ZlciA8dGFnPiB0byBhdm9pZCBYU1MgdmlhIGxvY2F0aW9uLmhhc2ggKCM5NTIxKQoJcXVpY2tFeHByID0gL14oPzpbXiM8XSooPFtcd1xXXSs+KVtePl0qJHwjKFtcd1wtXSopJCkvLAoKCS8vIENoZWNrIGlmIGEgc3RyaW5nIGhhcyBhIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlciBpbiBpdAoJcm5vdHdoaXRlID0gL1xTLywKCgkvLyBVc2VkIGZvciB0cmltbWluZyB3aGl0ZXNwYWNlCgl0cmltTGVmdCA9IC9eXHMrLywKCXRyaW1SaWdodCA9IC9ccyskLywKCgkvLyBDaGVjayBmb3IgZGlnaXRzCglyZGlnaXQgPSAvXGQvLAoKCS8vIE1hdGNoIGEgc3RhbmRhbG9uZSB0YWcKCXJzaW5nbGVUYWcgPSAvXjwoXHcrKVxzKlwvPz4oPzo8XC9cMT4pPyQvLAoKCS8vIEpTT04gUmVnRXhwCglydmFsaWRjaGFycyA9IC9eW1xdLDp7fVxzXSokLywKCXJ2YWxpZGVzY2FwZSA9IC9cXCg/OlsiXFxcL2JmbnJ0XXx1WzAtOWEtZkEtRl17NH0pL2csCglydmFsaWR0b2tlbnMgPSAvIlteIlxcXG5ccl0qInx0cnVlfGZhbHNlfG51bGx8LT9cZCsoPzpcLlxkKik/KD86W2VFXVsrXC1dP1xkKyk/L2csCglydmFsaWRicmFjZXMgPSAvKD86Xnw6fCwpKD86XHMqXFspKy9nLAoKCS8vIFVzZXJhZ2VudCBSZWdFeHAKCXJ3ZWJraXQgPSAvKHdlYmtpdClbIFwvXShbXHcuXSspLywKCXJvcGVyYSA9IC8ob3BlcmEpKD86Lip2ZXJzaW9uKT9bIFwvXShbXHcuXSspLywKCXJtc2llID0gLyhtc2llKSAoW1x3Ll0rKS8sCglybW96aWxsYSA9IC8obW96aWxsYSkoPzouKj8gcnY6KFtcdy5dKykpPy8sCgoJLy8gTWF0Y2hlcyBkYXNoZWQgc3RyaW5nIGZvciBjYW1lbGl6aW5nCglyZGFzaEFscGhhID0gLy0oW2Etel18WzAtOV0pL2lnLAoJcm1zUHJlZml4ID0gL14tbXMtLywKCgkvLyBVc2VkIGJ5IGpRdWVyeS5jYW1lbENhc2UgYXMgY2FsbGJhY2sgdG8gcmVwbGFjZSgpCglmY2FtZWxDYXNlID0gZnVuY3Rpb24oIGFsbCwgbGV0dGVyICkgewoJCXJldHVybiAoIGxldHRlciArICIiICkudG9VcHBlckNhc2UoKTsKCX0sCgoJLy8gS2VlcCBhIFVzZXJBZ2VudCBzdHJpbmcgZm9yIHVzZSB3aXRoIGpRdWVyeS5icm93c2VyCgl1c2VyQWdlbnQgPSBuYXZpZ2F0b3IudXNlckFnZW50LAoKCS8vIEZvciBtYXRjaGluZyB0aGUgZW5naW5lIGFuZCB2ZXJzaW9uIG9mIHRoZSBicm93c2VyCglicm93c2VyTWF0Y2gsCgoJLy8gVGhlIGRlZmVycmVkIHVzZWQgb24gRE9NIHJlYWR5CglyZWFkeUxpc3QsCgoJLy8gVGhlIHJlYWR5IGV2ZW50IGhhbmRsZXIKCURPTUNvbnRlbnRMb2FkZWQsCgoJLy8gU2F2ZSBhIHJlZmVyZW5jZSB0byBzb21lIGNvcmUgbWV0aG9kcwoJdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLAoJaGFzT3duID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSwKCXB1c2ggPSBBcnJheS5wcm90b3R5cGUucHVzaCwKCXNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLAoJdHJpbSA9IFN0cmluZy5wcm90b3R5cGUudHJpbSwKCWluZGV4T2YgPSBBcnJheS5wcm90b3R5cGUuaW5kZXhPZiwKCgkvLyBbW0NsYXNzXV0gLT4gdHlwZSBwYWlycwoJY2xhc3MydHlwZSA9IHt9OwoKalF1ZXJ5LmZuID0galF1ZXJ5LnByb3RvdHlwZSA9IHsKCWNvbnN0cnVjdG9yOiBqUXVlcnksCglpbml0OiBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQsIHJvb3RqUXVlcnkgKSB7CgkJdmFyIG1hdGNoLCBlbGVtLCByZXQsIGRvYzsKCgkJLy8gSGFuZGxlICQoIiIpLCAkKG51bGwpLCBvciAkKHVuZGVmaW5lZCkKCQlpZiAoICFzZWxlY3RvciApIHsKCQkJcmV0dXJuIHRoaXM7CgkJfQoKCQkvLyBIYW5kbGUgJChET01FbGVtZW50KQoJCWlmICggc2VsZWN0b3Iubm9kZVR5cGUgKSB7CgkJCXRoaXMuY29udGV4dCA9IHRoaXNbMF0gPSBzZWxlY3RvcjsKCQkJdGhpcy5sZW5ndGggPSAxOwoJCQlyZXR1cm4gdGhpczsKCQl9CgoJCS8vIFRoZSBib2R5IGVsZW1lbnQgb25seSBleGlzdHMgb25jZSwgb3B0aW1pemUgZmluZGluZyBpdAoJCWlmICggc2VsZWN0b3IgPT09ICJib2R5IiAmJiAhY29udGV4dCAmJiBkb2N1bWVudC5ib2R5ICkgewoJCQl0aGlzLmNvbnRleHQgPSBkb2N1bWVudDsKCQkJdGhpc1swXSA9IGRvY3VtZW50LmJvZHk7CgkJCXRoaXMuc2VsZWN0b3IgPSBzZWxlY3RvcjsKCQkJdGhpcy5sZW5ndGggPSAxOwoJCQlyZXR1cm4gdGhpczsKCQl9CgoJCS8vIEhhbmRsZSBIVE1MIHN0cmluZ3MKCQlpZiAoIHR5cGVvZiBzZWxlY3RvciA9PT0gInN0cmluZyIgKSB7CgkJCS8vIEFyZSB3ZSBkZWFsaW5nIHdpdGggSFRNTCBzdHJpbmcgb3IgYW4gSUQ/CgkJCWlmICggc2VsZWN0b3IuY2hhckF0KDApID09PSAiPCIgJiYgc2VsZWN0b3IuY2hhckF0KCBzZWxlY3Rvci5sZW5ndGggLSAxICkgPT09ICI+IiAmJiBzZWxlY3Rvci5sZW5ndGggPj0gMyApIHsKCQkJCS8vIEFzc3VtZSB0aGF0IHN0cmluZ3MgdGhhdCBzdGFydCBhbmQgZW5kIHdpdGggPD4gYXJlIEhUTUwgYW5kIHNraXAgdGhlIHJlZ2V4IGNoZWNrCgkJCQltYXRjaCA9IFsgbnVsbCwgc2VsZWN0b3IsIG51bGwgXTsKCgkJCX0gZWxzZSB7CgkJCQltYXRjaCA9IHF1aWNrRXhwci5leGVjKCBzZWxlY3RvciApOwoJCQl9CgoJCQkvLyBWZXJpZnkgYSBtYXRjaCwgYW5kIHRoYXQgbm8gY29udGV4dCB3YXMgc3BlY2lmaWVkIGZvciAjaWQKCQkJaWYgKCBtYXRjaCAmJiAobWF0Y2hbMV0gfHwgIWNvbnRleHQpICkgewoKCQkJCS8vIEhBTkRMRTogJChodG1sKSAtPiAkKGFycmF5KQoJCQkJaWYgKCBtYXRjaFsxXSApIHsKCQkJCQljb250ZXh0ID0gY29udGV4dCBpbnN0YW5jZW9mIGpRdWVyeSA/IGNvbnRleHRbMF0gOiBjb250ZXh0OwoJCQkJCWRvYyA9IChjb250ZXh0ID8gY29udGV4dC5vd25lckRvY3VtZW50IHx8IGNvbnRleHQgOiBkb2N1bWVudCk7CgoJCQkJCS8vIElmIGEgc2luZ2xlIHN0cmluZyBpcyBwYXNzZWQgaW4gYW5kIGl0J3MgYSBzaW5nbGUgdGFnCgkJCQkJLy8ganVzdCBkbyBhIGNyZWF0ZUVsZW1lbnQgYW5kIHNraXAgdGhlIHJlc3QKCQkJCQlyZXQgPSByc2luZ2xlVGFnLmV4ZWMoIHNlbGVjdG9yICk7CgoJCQkJCWlmICggcmV0ICkgewoJCQkJCQlpZiAoIGpRdWVyeS5pc1BsYWluT2JqZWN0KCBjb250ZXh0ICkgKSB7CgkJCQkJCQlzZWxlY3RvciA9IFsgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggcmV0WzFdICkgXTsKCQkJCQkJCWpRdWVyeS5mbi5hdHRyLmNhbGwoIHNlbGVjdG9yLCBjb250ZXh0LCB0cnVlICk7CgoJCQkJCQl9IGVsc2UgewoJCQkJCQkJc2VsZWN0b3IgPSBbIGRvYy5jcmVhdGVFbGVtZW50KCByZXRbMV0gKSBdOwoJCQkJCQl9CgoJCQkJCX0gZWxzZSB7CgkJCQkJCXJldCA9IGpRdWVyeS5idWlsZEZyYWdtZW50KCBbIG1hdGNoWzFdIF0sIFsgZG9jIF0gKTsKCQkJCQkJc2VsZWN0b3IgPSAocmV0LmNhY2hlYWJsZSA/IGpRdWVyeS5jbG9uZShyZXQuZnJhZ21lbnQpIDogcmV0LmZyYWdtZW50KS5jaGlsZE5vZGVzOwoJCQkJCX0KCgkJCQkJcmV0dXJuIGpRdWVyeS5tZXJnZSggdGhpcywgc2VsZWN0b3IgKTsKCgkJCQkvLyBIQU5ETEU6ICQoIiNpZCIpCgkJCQl9IGVsc2UgewoJCQkJCWVsZW0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggbWF0Y2hbMl0gKTsKCgkJCQkJLy8gQ2hlY2sgcGFyZW50Tm9kZSB0byBjYXRjaCB3aGVuIEJsYWNrYmVycnkgNC42IHJldHVybnMKCQkJCQkvLyBub2RlcyB0aGF0IGFyZSBubyBsb25nZXIgaW4gdGhlIGRvY3VtZW50ICM2OTYzCgkJCQkJaWYgKCBlbGVtICYmIGVsZW0ucGFyZW50Tm9kZSApIHsKCQkJCQkJLy8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIElFIGFuZCBPcGVyYSByZXR1cm4gaXRlbXMKCQkJCQkJLy8gYnkgbmFtZSBpbnN0ZWFkIG9mIElECgkJCQkJCWlmICggZWxlbS5pZCAhPT0gbWF0Y2hbMl0gKSB7CgkJCQkJCQlyZXR1cm4gcm9vdGpRdWVyeS5maW5kKCBzZWxlY3RvciApOwoJCQkJCQl9CgoJCQkJCQkvLyBPdGhlcndpc2UsIHdlIGluamVjdCB0aGUgZWxlbWVudCBkaXJlY3RseSBpbnRvIHRoZSBqUXVlcnkgb2JqZWN0CgkJCQkJCXRoaXMubGVuZ3RoID0gMTsKCQkJCQkJdGhpc1swXSA9IGVsZW07CgkJCQkJfQoKCQkJCQl0aGlzLmNvbnRleHQgPSBkb2N1bWVudDsKCQkJCQl0aGlzLnNlbGVjdG9yID0gc2VsZWN0b3I7CgkJCQkJcmV0dXJuIHRoaXM7CgkJCQl9CgoJCQkvLyBIQU5ETEU6ICQoZXhwciwgJCguLi4pKQoJCQl9IGVsc2UgaWYgKCAhY29udGV4dCB8fCBjb250ZXh0LmpxdWVyeSApIHsKCQkJCXJldHVybiAoY29udGV4dCB8fCByb290alF1ZXJ5KS5maW5kKCBzZWxlY3RvciApOwoKCQkJLy8gSEFORExFOiAkKGV4cHIsIGNvbnRleHQpCgkJCS8vICh3aGljaCBpcyBqdXN0IGVxdWl2YWxlbnQgdG86ICQoY29udGV4dCkuZmluZChleHByKQoJCQl9IGVsc2UgewoJCQkJcmV0dXJuIHRoaXMuY29uc3RydWN0b3IoIGNvbnRleHQgKS5maW5kKCBzZWxlY3RvciApOwoJCQl9CgoJCS8vIEhBTkRMRTogJChmdW5jdGlvbikKCQkvLyBTaG9ydGN1dCBmb3IgZG9jdW1lbnQgcmVhZHkKCQl9IGVsc2UgaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggc2VsZWN0b3IgKSApIHsKCQkJcmV0dXJuIHJvb3RqUXVlcnkucmVhZHkoIHNlbGVjdG9yICk7CgkJfQoKCQlpZiAoc2VsZWN0b3Iuc2VsZWN0b3IgIT09IHVuZGVmaW5lZCkgewoJCQl0aGlzLnNlbGVjdG9yID0gc2VsZWN0b3Iuc2VsZWN0b3I7CgkJCXRoaXMuY29udGV4dCA9IHNlbGVjdG9yLmNvbnRleHQ7CgkJfQoKCQlyZXR1cm4galF1ZXJ5Lm1ha2VBcnJheSggc2VsZWN0b3IsIHRoaXMgKTsKCX0sCgoJLy8gU3RhcnQgd2l0aCBhbiBlbXB0eSBzZWxlY3RvcgoJc2VsZWN0b3I6ICIiLAoKCS8vIFRoZSBjdXJyZW50IHZlcnNpb24gb2YgalF1ZXJ5IGJlaW5nIHVzZWQKCWpxdWVyeTogIjEuNi4zIiwKCgkvLyBUaGUgZGVmYXVsdCBsZW5ndGggb2YgYSBqUXVlcnkgb2JqZWN0IGlzIDAKCWxlbmd0aDogMCwKCgkvLyBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGNvbnRhaW5lZCBpbiB0aGUgbWF0Y2hlZCBlbGVtZW50IHNldAoJc2l6ZTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMubGVuZ3RoOwoJfSwKCgl0b0FycmF5OiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gc2xpY2UuY2FsbCggdGhpcywgMCApOwoJfSwKCgkvLyBHZXQgdGhlIE50aCBlbGVtZW50IGluIHRoZSBtYXRjaGVkIGVsZW1lbnQgc2V0IE9SCgkvLyBHZXQgdGhlIHdob2xlIG1hdGNoZWQgZWxlbWVudCBzZXQgYXMgYSBjbGVhbiBhcnJheQoJZ2V0OiBmdW5jdGlvbiggbnVtICkgewoJCXJldHVybiBudW0gPT0gbnVsbCA/CgoJCQkvLyBSZXR1cm4gYSAnY2xlYW4nIGFycmF5CgkJCXRoaXMudG9BcnJheSgpIDoKCgkJCS8vIFJldHVybiBqdXN0IHRoZSBvYmplY3QKCQkJKCBudW0gPCAwID8gdGhpc1sgdGhpcy5sZW5ndGggKyBudW0gXSA6IHRoaXNbIG51bSBdICk7Cgl9LAoKCS8vIFRha2UgYW4gYXJyYXkgb2YgZWxlbWVudHMgYW5kIHB1c2ggaXQgb250byB0aGUgc3RhY2sKCS8vIChyZXR1cm5pbmcgdGhlIG5ldyBtYXRjaGVkIGVsZW1lbnQgc2V0KQoJcHVzaFN0YWNrOiBmdW5jdGlvbiggZWxlbXMsIG5hbWUsIHNlbGVjdG9yICkgewoJCS8vIEJ1aWxkIGEgbmV3IGpRdWVyeSBtYXRjaGVkIGVsZW1lbnQgc2V0CgkJdmFyIHJldCA9IHRoaXMuY29uc3RydWN0b3IoKTsKCgkJaWYgKCBqUXVlcnkuaXNBcnJheSggZWxlbXMgKSApIHsKCQkJcHVzaC5hcHBseSggcmV0LCBlbGVtcyApOwoKCQl9IGVsc2UgewoJCQlqUXVlcnkubWVyZ2UoIHJldCwgZWxlbXMgKTsKCQl9CgoJCS8vIEFkZCB0aGUgb2xkIG9iamVjdCBvbnRvIHRoZSBzdGFjayAoYXMgYSByZWZlcmVuY2UpCgkJcmV0LnByZXZPYmplY3QgPSB0aGlzOwoKCQlyZXQuY29udGV4dCA9IHRoaXMuY29udGV4dDsKCgkJaWYgKCBuYW1lID09PSAiZmluZCIgKSB7CgkJCXJldC5zZWxlY3RvciA9IHRoaXMuc2VsZWN0b3IgKyAodGhpcy5zZWxlY3RvciA/ICIgIiA6ICIiKSArIHNlbGVjdG9yOwoJCX0gZWxzZSBpZiAoIG5hbWUgKSB7CgkJCXJldC5zZWxlY3RvciA9IHRoaXMuc2VsZWN0b3IgKyAiLiIgKyBuYW1lICsgIigiICsgc2VsZWN0b3IgKyAiKSI7CgkJfQoKCQkvLyBSZXR1cm4gdGhlIG5ld2x5LWZvcm1lZCBlbGVtZW50IHNldAoJCXJldHVybiByZXQ7Cgl9LAoKCS8vIEV4ZWN1dGUgYSBjYWxsYmFjayBmb3IgZXZlcnkgZWxlbWVudCBpbiB0aGUgbWF0Y2hlZCBzZXQuCgkvLyAoWW91IGNhbiBzZWVkIHRoZSBhcmd1bWVudHMgd2l0aCBhbiBhcnJheSBvZiBhcmdzLCBidXQgdGhpcyBpcwoJLy8gb25seSB1c2VkIGludGVybmFsbHkuKQoJZWFjaDogZnVuY3Rpb24oIGNhbGxiYWNrLCBhcmdzICkgewoJCXJldHVybiBqUXVlcnkuZWFjaCggdGhpcywgY2FsbGJhY2ssIGFyZ3MgKTsKCX0sCgoJcmVhZHk6IGZ1bmN0aW9uKCBmbiApIHsKCQkvLyBBdHRhY2ggdGhlIGxpc3RlbmVycwoJCWpRdWVyeS5iaW5kUmVhZHkoKTsKCgkJLy8gQWRkIHRoZSBjYWxsYmFjawoJCXJlYWR5TGlzdC5kb25lKCBmbiApOwoKCQlyZXR1cm4gdGhpczsKCX0sCgoJZXE6IGZ1bmN0aW9uKCBpICkgewoJCXJldHVybiBpID09PSAtMSA/CgkJCXRoaXMuc2xpY2UoIGkgKSA6CgkJCXRoaXMuc2xpY2UoIGksICtpICsgMSApOwoJfSwKCglmaXJzdDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuZXEoIDAgKTsKCX0sCgoJbGFzdDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuZXEoIC0xICk7Cgl9LAoKCXNsaWNlOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHNsaWNlLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKSwKCQkJInNsaWNlIiwgc2xpY2UuY2FsbChhcmd1bWVudHMpLmpvaW4oIiwiKSApOwoJfSwKCgltYXA6IGZ1bmN0aW9uKCBjYWxsYmFjayApIHsKCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeS5tYXAodGhpcywgZnVuY3Rpb24oIGVsZW0sIGkgKSB7CgkJCXJldHVybiBjYWxsYmFjay5jYWxsKCBlbGVtLCBpLCBlbGVtICk7CgkJfSkpOwoJfSwKCgllbmQ6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLnByZXZPYmplY3QgfHwgdGhpcy5jb25zdHJ1Y3RvcihudWxsKTsKCX0sCgoJLy8gRm9yIGludGVybmFsIHVzZSBvbmx5LgoJLy8gQmVoYXZlcyBsaWtlIGFuIEFycmF5J3MgbWV0aG9kLCBub3QgbGlrZSBhIGpRdWVyeSBtZXRob2QuCglwdXNoOiBwdXNoLAoJc29ydDogW10uc29ydCwKCXNwbGljZTogW10uc3BsaWNlCn07CgovLyBHaXZlIHRoZSBpbml0IGZ1bmN0aW9uIHRoZSBqUXVlcnkgcHJvdG90eXBlIGZvciBsYXRlciBpbnN0YW50aWF0aW9uCmpRdWVyeS5mbi5pbml0LnByb3RvdHlwZSA9IGpRdWVyeS5mbjsKCmpRdWVyeS5leHRlbmQgPSBqUXVlcnkuZm4uZXh0ZW5kID0gZnVuY3Rpb24oKSB7Cgl2YXIgb3B0aW9ucywgbmFtZSwgc3JjLCBjb3B5LCBjb3B5SXNBcnJheSwgY2xvbmUsCgkJdGFyZ2V0ID0gYXJndW1lbnRzWzBdIHx8IHt9LAoJCWkgPSAxLAoJCWxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGgsCgkJZGVlcCA9IGZhbHNlOwoKCS8vIEhhbmRsZSBhIGRlZXAgY29weSBzaXR1YXRpb24KCWlmICggdHlwZW9mIHRhcmdldCA9PT0gImJvb2xlYW4iICkgewoJCWRlZXAgPSB0YXJnZXQ7CgkJdGFyZ2V0ID0gYXJndW1lbnRzWzFdIHx8IHt9OwoJCS8vIHNraXAgdGhlIGJvb2xlYW4gYW5kIHRoZSB0YXJnZXQKCQlpID0gMjsKCX0KCgkvLyBIYW5kbGUgY2FzZSB3aGVuIHRhcmdldCBpcyBhIHN0cmluZyBvciBzb21ldGhpbmcgKHBvc3NpYmxlIGluIGRlZXAgY29weSkKCWlmICggdHlwZW9mIHRhcmdldCAhPT0gIm9iamVjdCIgJiYgIWpRdWVyeS5pc0Z1bmN0aW9uKHRhcmdldCkgKSB7CgkJdGFyZ2V0ID0ge307Cgl9CgoJLy8gZXh0ZW5kIGpRdWVyeSBpdHNlbGYgaWYgb25seSBvbmUgYXJndW1lbnQgaXMgcGFzc2VkCglpZiAoIGxlbmd0aCA9PT0gaSApIHsKCQl0YXJnZXQgPSB0aGlzOwoJCS0taTsKCX0KCglmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHsKCQkvLyBPbmx5IGRlYWwgd2l0aCBub24tbnVsbC91bmRlZmluZWQgdmFsdWVzCgkJaWYgKCAob3B0aW9ucyA9IGFyZ3VtZW50c1sgaSBdKSAhPSBudWxsICkgewoJCQkvLyBFeHRlbmQgdGhlIGJhc2Ugb2JqZWN0CgkJCWZvciAoIG5hbWUgaW4gb3B0aW9ucyApIHsKCQkJCXNyYyA9IHRhcmdldFsgbmFtZSBdOwoJCQkJY29weSA9IG9wdGlvbnNbIG5hbWUgXTsKCgkJCQkvLyBQcmV2ZW50IG5ldmVyLWVuZGluZyBsb29wCgkJCQlpZiAoIHRhcmdldCA9PT0gY29weSApIHsKCQkJCQljb250aW51ZTsKCQkJCX0KCgkJCQkvLyBSZWN1cnNlIGlmIHdlJ3JlIG1lcmdpbmcgcGxhaW4gb2JqZWN0cyBvciBhcnJheXMKCQkJCWlmICggZGVlcCAmJiBjb3B5ICYmICggalF1ZXJ5LmlzUGxhaW5PYmplY3QoY29weSkgfHwgKGNvcHlJc0FycmF5ID0galF1ZXJ5LmlzQXJyYXkoY29weSkpICkgKSB7CgkJCQkJaWYgKCBjb3B5SXNBcnJheSApIHsKCQkJCQkJY29weUlzQXJyYXkgPSBmYWxzZTsKCQkJCQkJY2xvbmUgPSBzcmMgJiYgalF1ZXJ5LmlzQXJyYXkoc3JjKSA/IHNyYyA6IFtdOwoKCQkJCQl9IGVsc2UgewoJCQkJCQljbG9uZSA9IHNyYyAmJiBqUXVlcnkuaXNQbGFpbk9iamVjdChzcmMpID8gc3JjIDoge307CgkJCQkJfQoKCQkJCQkvLyBOZXZlciBtb3ZlIG9yaWdpbmFsIG9iamVjdHMsIGNsb25lIHRoZW0KCQkJCQl0YXJnZXRbIG5hbWUgXSA9IGpRdWVyeS5leHRlbmQoIGRlZXAsIGNsb25lLCBjb3B5ICk7CgoJCQkJLy8gRG9uJ3QgYnJpbmcgaW4gdW5kZWZpbmVkIHZhbHVlcwoJCQkJfSBlbHNlIGlmICggY29weSAhPT0gdW5kZWZpbmVkICkgewoJCQkJCXRhcmdldFsgbmFtZSBdID0gY29weTsKCQkJCX0KCQkJfQoJCX0KCX0KCgkvLyBSZXR1cm4gdGhlIG1vZGlmaWVkIG9iamVjdAoJcmV0dXJuIHRhcmdldDsKfTsKCmpRdWVyeS5leHRlbmQoewoJbm9Db25mbGljdDogZnVuY3Rpb24oIGRlZXAgKSB7CgkJaWYgKCB3aW5kb3cuJCA9PT0galF1ZXJ5ICkgewoJCQl3aW5kb3cuJCA9IF8kOwoJCX0KCgkJaWYgKCBkZWVwICYmIHdpbmRvdy5qUXVlcnkgPT09IGpRdWVyeSApIHsKCQkJd2luZG93LmpRdWVyeSA9IF9qUXVlcnk7CgkJfQoKCQlyZXR1cm4galF1ZXJ5OwoJfSwKCgkvLyBJcyB0aGUgRE9NIHJlYWR5IHRvIGJlIHVzZWQ/IFNldCB0byB0cnVlIG9uY2UgaXQgb2NjdXJzLgoJaXNSZWFkeTogZmFsc2UsCgoJLy8gQSBjb3VudGVyIHRvIHRyYWNrIGhvdyBtYW55IGl0ZW1zIHRvIHdhaXQgZm9yIGJlZm9yZQoJLy8gdGhlIHJlYWR5IGV2ZW50IGZpcmVzLiBTZWUgIzY3ODEKCXJlYWR5V2FpdDogMSwKCgkvLyBIb2xkIChvciByZWxlYXNlKSB0aGUgcmVhZHkgZXZlbnQKCWhvbGRSZWFkeTogZnVuY3Rpb24oIGhvbGQgKSB7CgkJaWYgKCBob2xkICkgewoJCQlqUXVlcnkucmVhZHlXYWl0Kys7CgkJfSBlbHNlIHsKCQkJalF1ZXJ5LnJlYWR5KCB0cnVlICk7CgkJfQoJfSwKCgkvLyBIYW5kbGUgd2hlbiB0aGUgRE9NIGlzIHJlYWR5CglyZWFkeTogZnVuY3Rpb24oIHdhaXQgKSB7CgkJLy8gRWl0aGVyIGEgcmVsZWFzZWQgaG9sZCBvciBhbiBET01yZWFkeS9sb2FkIGV2ZW50IGFuZCBub3QgeWV0IHJlYWR5CgkJaWYgKCAod2FpdCA9PT0gdHJ1ZSAmJiAhLS1qUXVlcnkucmVhZHlXYWl0KSB8fCAod2FpdCAhPT0gdHJ1ZSAmJiAhalF1ZXJ5LmlzUmVhZHkpICkgewoJCQkvLyBNYWtlIHN1cmUgYm9keSBleGlzdHMsIGF0IGxlYXN0LCBpbiBjYXNlIElFIGdldHMgYSBsaXR0bGUgb3ZlcnplYWxvdXMgKHRpY2tldCAjNTQ0MykuCgkJCWlmICggIWRvY3VtZW50LmJvZHkgKSB7CgkJCQlyZXR1cm4gc2V0VGltZW91dCggalF1ZXJ5LnJlYWR5LCAxICk7CgkJCX0KCgkJCS8vIFJlbWVtYmVyIHRoYXQgdGhlIERPTSBpcyByZWFkeQoJCQlqUXVlcnkuaXNSZWFkeSA9IHRydWU7CgoJCQkvLyBJZiBhIG5vcm1hbCBET00gUmVhZHkgZXZlbnQgZmlyZWQsIGRlY3JlbWVudCwgYW5kIHdhaXQgaWYgbmVlZCBiZQoJCQlpZiAoIHdhaXQgIT09IHRydWUgJiYgLS1qUXVlcnkucmVhZHlXYWl0ID4gMCApIHsKCQkJCXJldHVybjsKCQkJfQoKCQkJLy8gSWYgdGhlcmUgYXJlIGZ1bmN0aW9ucyBib3VuZCwgdG8gZXhlY3V0ZQoJCQlyZWFkeUxpc3QucmVzb2x2ZVdpdGgoIGRvY3VtZW50LCBbIGpRdWVyeSBdICk7CgoJCQkvLyBUcmlnZ2VyIGFueSBib3VuZCByZWFkeSBldmVudHMKCQkJaWYgKCBqUXVlcnkuZm4udHJpZ2dlciApIHsKCQkJCWpRdWVyeSggZG9jdW1lbnQgKS50cmlnZ2VyKCAicmVhZHkiICkudW5iaW5kKCAicmVhZHkiICk7CgkJCX0KCQl9Cgl9LAoKCWJpbmRSZWFkeTogZnVuY3Rpb24oKSB7CgkJaWYgKCByZWFkeUxpc3QgKSB7CgkJCXJldHVybjsKCQl9CgoJCXJlYWR5TGlzdCA9IGpRdWVyeS5fRGVmZXJyZWQoKTsKCgkJLy8gQ2F0Y2ggY2FzZXMgd2hlcmUgJChkb2N1bWVudCkucmVhZHkoKSBpcyBjYWxsZWQgYWZ0ZXIgdGhlCgkJLy8gYnJvd3NlciBldmVudCBoYXMgYWxyZWFkeSBvY2N1cnJlZC4KCQlpZiAoIGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICJjb21wbGV0ZSIgKSB7CgkJCS8vIEhhbmRsZSBpdCBhc3luY2hyb25vdXNseSB0byBhbGxvdyBzY3JpcHRzIHRoZSBvcHBvcnR1bml0eSB0byBkZWxheSByZWFkeQoJCQlyZXR1cm4gc2V0VGltZW91dCggalF1ZXJ5LnJlYWR5LCAxICk7CgkJfQoKCQkvLyBNb3ppbGxhLCBPcGVyYSBhbmQgd2Via2l0IG5pZ2h0bGllcyBjdXJyZW50bHkgc3VwcG9ydCB0aGlzIGV2ZW50CgkJaWYgKCBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyICkgewoJCQkvLyBVc2UgdGhlIGhhbmR5IGV2ZW50IGNhbGxiYWNrCgkJCWRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoICJET01Db250ZW50TG9hZGVkIiwgRE9NQ29udGVudExvYWRlZCwgZmFsc2UgKTsKCgkJCS8vIEEgZmFsbGJhY2sgdG8gd2luZG93Lm9ubG9hZCwgdGhhdCB3aWxsIGFsd2F5cyB3b3JrCgkJCXdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCAibG9hZCIsIGpRdWVyeS5yZWFkeSwgZmFsc2UgKTsKCgkJLy8gSWYgSUUgZXZlbnQgbW9kZWwgaXMgdXNlZAoJCX0gZWxzZSBpZiAoIGRvY3VtZW50LmF0dGFjaEV2ZW50ICkgewoJCQkvLyBlbnN1cmUgZmlyaW5nIGJlZm9yZSBvbmxvYWQsCgkJCS8vIG1heWJlIGxhdGUgYnV0IHNhZmUgYWxzbyBmb3IgaWZyYW1lcwoJCQlkb2N1bWVudC5hdHRhY2hFdmVudCggIm9ucmVhZHlzdGF0ZWNoYW5nZSIsIERPTUNvbnRlbnRMb2FkZWQgKTsKCgkJCS8vIEEgZmFsbGJhY2sgdG8gd2luZG93Lm9ubG9hZCwgdGhhdCB3aWxsIGFsd2F5cyB3b3JrCgkJCXdpbmRvdy5hdHRhY2hFdmVudCggIm9ubG9hZCIsIGpRdWVyeS5yZWFkeSApOwoKCQkJLy8gSWYgSUUgYW5kIG5vdCBhIGZyYW1lCgkJCS8vIGNvbnRpbnVhbGx5IGNoZWNrIHRvIHNlZSBpZiB0aGUgZG9jdW1lbnQgaXMgcmVhZHkKCQkJdmFyIHRvcGxldmVsID0gZmFsc2U7CgoJCQl0cnkgewoJCQkJdG9wbGV2ZWwgPSB3aW5kb3cuZnJhbWVFbGVtZW50ID09IG51bGw7CgkJCX0gY2F0Y2goZSkge30KCgkJCWlmICggZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsICYmIHRvcGxldmVsICkgewoJCQkJZG9TY3JvbGxDaGVjaygpOwoJCQl9CgkJfQoJfSwKCgkvLyBTZWUgdGVzdC91bml0L2NvcmUuanMgZm9yIGRldGFpbHMgY29uY2VybmluZyBpc0Z1bmN0aW9uLgoJLy8gU2luY2UgdmVyc2lvbiAxLjMsIERPTSBtZXRob2RzIGFuZCBmdW5jdGlvbnMgbGlrZSBhbGVydAoJLy8gYXJlbid0IHN1cHBvcnRlZC4gVGhleSByZXR1cm4gZmFsc2Ugb24gSUUgKCMyOTY4KS4KCWlzRnVuY3Rpb246IGZ1bmN0aW9uKCBvYmogKSB7CgkJcmV0dXJuIGpRdWVyeS50eXBlKG9iaikgPT09ICJmdW5jdGlvbiI7Cgl9LAoKCWlzQXJyYXk6IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24oIG9iaiApIHsKCQlyZXR1cm4galF1ZXJ5LnR5cGUob2JqKSA9PT0gImFycmF5IjsKCX0sCgoJLy8gQSBjcnVkZSB3YXkgb2YgZGV0ZXJtaW5pbmcgaWYgYW4gb2JqZWN0IGlzIGEgd2luZG93Cglpc1dpbmRvdzogZnVuY3Rpb24oIG9iaiApIHsKCQlyZXR1cm4gb2JqICYmIHR5cGVvZiBvYmogPT09ICJvYmplY3QiICYmICJzZXRJbnRlcnZhbCIgaW4gb2JqOwoJfSwKCglpc05hTjogZnVuY3Rpb24oIG9iaiApIHsKCQlyZXR1cm4gb2JqID09IG51bGwgfHwgIXJkaWdpdC50ZXN0KCBvYmogKSB8fCBpc05hTiggb2JqICk7Cgl9LAoKCXR5cGU6IGZ1bmN0aW9uKCBvYmogKSB7CgkJcmV0dXJuIG9iaiA9PSBudWxsID8KCQkJU3RyaW5nKCBvYmogKSA6CgkJCWNsYXNzMnR5cGVbIHRvU3RyaW5nLmNhbGwob2JqKSBdIHx8ICJvYmplY3QiOwoJfSwKCglpc1BsYWluT2JqZWN0OiBmdW5jdGlvbiggb2JqICkgewoJCS8vIE11c3QgYmUgYW4gT2JqZWN0LgoJCS8vIEJlY2F1c2Ugb2YgSUUsIHdlIGFsc28gaGF2ZSB0byBjaGVjayB0aGUgcHJlc2VuY2Ugb2YgdGhlIGNvbnN0cnVjdG9yIHByb3BlcnR5LgoJCS8vIE1ha2Ugc3VyZSB0aGF0IERPTSBub2RlcyBhbmQgd2luZG93IG9iamVjdHMgZG9uJ3QgcGFzcyB0aHJvdWdoLCBhcyB3ZWxsCgkJaWYgKCAhb2JqIHx8IGpRdWVyeS50eXBlKG9iaikgIT09ICJvYmplY3QiIHx8IG9iai5ub2RlVHlwZSB8fCBqUXVlcnkuaXNXaW5kb3coIG9iaiApICkgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCQl0cnkgewoJCQkvLyBOb3Qgb3duIGNvbnN0cnVjdG9yIHByb3BlcnR5IG11c3QgYmUgT2JqZWN0CgkJCWlmICggb2JqLmNvbnN0cnVjdG9yICYmCgkJCQkhaGFzT3duLmNhbGwob2JqLCAiY29uc3RydWN0b3IiKSAmJgoJCQkJIWhhc093bi5jYWxsKG9iai5jb25zdHJ1Y3Rvci5wcm90b3R5cGUsICJpc1Byb3RvdHlwZU9mIikgKSB7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQl9IGNhdGNoICggZSApIHsKCQkJLy8gSUU4LDkgV2lsbCB0aHJvdyBleGNlcHRpb25zIG9uIGNlcnRhaW4gaG9zdCBvYmplY3RzICM5ODk3CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCS8vIE93biBwcm9wZXJ0aWVzIGFyZSBlbnVtZXJhdGVkIGZpcnN0bHksIHNvIHRvIHNwZWVkIHVwLAoJCS8vIGlmIGxhc3Qgb25lIGlzIG93biwgdGhlbiBhbGwgcHJvcGVydGllcyBhcmUgb3duLgoKCQl2YXIga2V5OwoJCWZvciAoIGtleSBpbiBvYmogKSB7fQoKCQlyZXR1cm4ga2V5ID09PSB1bmRlZmluZWQgfHwgaGFzT3duLmNhbGwoIG9iaiwga2V5ICk7Cgl9LAoKCWlzRW1wdHlPYmplY3Q6IGZ1bmN0aW9uKCBvYmogKSB7CgkJZm9yICggdmFyIG5hbWUgaW4gb2JqICkgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCXJldHVybiB0cnVlOwoJfSwKCgllcnJvcjogZnVuY3Rpb24oIG1zZyApIHsKCQl0aHJvdyBtc2c7Cgl9LAoKCXBhcnNlSlNPTjogZnVuY3Rpb24oIGRhdGEgKSB7CgkJaWYgKCB0eXBlb2YgZGF0YSAhPT0gInN0cmluZyIgfHwgIWRhdGEgKSB7CgkJCXJldHVybiBudWxsOwoJCX0KCgkJLy8gTWFrZSBzdXJlIGxlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZSBpcyByZW1vdmVkIChJRSBjYW4ndCBoYW5kbGUgaXQpCgkJZGF0YSA9IGpRdWVyeS50cmltKCBkYXRhICk7CgoJCS8vIEF0dGVtcHQgdG8gcGFyc2UgdXNpbmcgdGhlIG5hdGl2ZSBKU09OIHBhcnNlciBmaXJzdAoJCWlmICggd2luZG93LkpTT04gJiYgd2luZG93LkpTT04ucGFyc2UgKSB7CgkJCXJldHVybiB3aW5kb3cuSlNPTi5wYXJzZSggZGF0YSApOwoJCX0KCgkJLy8gTWFrZSBzdXJlIHRoZSBpbmNvbWluZyBkYXRhIGlzIGFjdHVhbCBKU09OCgkJLy8gTG9naWMgYm9ycm93ZWQgZnJvbSBodHRwOi8vanNvbi5vcmcvanNvbjIuanMKCQlpZiAoIHJ2YWxpZGNoYXJzLnRlc3QoIGRhdGEucmVwbGFjZSggcnZhbGlkZXNjYXBlLCAiQCIgKQoJCQkucmVwbGFjZSggcnZhbGlkdG9rZW5zLCAiXSIgKQoJCQkucmVwbGFjZSggcnZhbGlkYnJhY2VzLCAiIikpICkgewoKCQkJcmV0dXJuIChuZXcgRnVuY3Rpb24oICJyZXR1cm4gIiArIGRhdGEgKSkoKTsKCgkJfQoJCWpRdWVyeS5lcnJvciggIkludmFsaWQgSlNPTjogIiArIGRhdGEgKTsKCX0sCgoJLy8gQ3Jvc3MtYnJvd3NlciB4bWwgcGFyc2luZwoJcGFyc2VYTUw6IGZ1bmN0aW9uKCBkYXRhICkgewoJCXZhciB4bWwsIHRtcDsKCQl0cnkgewoJCQlpZiAoIHdpbmRvdy5ET01QYXJzZXIgKSB7IC8vIFN0YW5kYXJkCgkJCQl0bXAgPSBuZXcgRE9NUGFyc2VyKCk7CgkJCQl4bWwgPSB0bXAucGFyc2VGcm9tU3RyaW5nKCBkYXRhICwgInRleHQveG1sIiApOwoJCQl9IGVsc2UgeyAvLyBJRQoJCQkJeG1sID0gbmV3IEFjdGl2ZVhPYmplY3QoICJNaWNyb3NvZnQuWE1MRE9NIiApOwoJCQkJeG1sLmFzeW5jID0gImZhbHNlIjsKCQkJCXhtbC5sb2FkWE1MKCBkYXRhICk7CgkJCX0KCQl9IGNhdGNoKCBlICkgewoJCQl4bWwgPSB1bmRlZmluZWQ7CgkJfQoJCWlmICggIXhtbCB8fCAheG1sLmRvY3VtZW50RWxlbWVudCB8fCB4bWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoICJwYXJzZXJlcnJvciIgKS5sZW5ndGggKSB7CgkJCWpRdWVyeS5lcnJvciggIkludmFsaWQgWE1MOiAiICsgZGF0YSApOwoJCX0KCQlyZXR1cm4geG1sOwoJfSwKCglub29wOiBmdW5jdGlvbigpIHt9LAoKCS8vIEV2YWx1YXRlcyBhIHNjcmlwdCBpbiBhIGdsb2JhbCBjb250ZXh0CgkvLyBXb3JrYXJvdW5kcyBiYXNlZCBvbiBmaW5kaW5ncyBieSBKaW0gRHJpc2NvbGwKCS8vIGh0dHA6Ly93ZWJsb2dzLmphdmEubmV0L2Jsb2cvZHJpc2NvbGwvYXJjaGl2ZS8yMDA5LzA5LzA4L2V2YWwtamF2YXNjcmlwdC1nbG9iYWwtY29udGV4dAoJZ2xvYmFsRXZhbDogZnVuY3Rpb24oIGRhdGEgKSB7CgkJaWYgKCBkYXRhICYmIHJub3R3aGl0ZS50ZXN0KCBkYXRhICkgKSB7CgkJCS8vIFdlIHVzZSBleGVjU2NyaXB0IG9uIEludGVybmV0IEV4cGxvcmVyCgkJCS8vIFdlIHVzZSBhbiBhbm9ueW1vdXMgZnVuY3Rpb24gc28gdGhhdCBjb250ZXh0IGlzIHdpbmRvdwoJCQkvLyByYXRoZXIgdGhhbiBqUXVlcnkgaW4gRmlyZWZveAoJCQkoIHdpbmRvdy5leGVjU2NyaXB0IHx8IGZ1bmN0aW9uKCBkYXRhICkgewoJCQkJd2luZG93WyAiZXZhbCIgXS5jYWxsKCB3aW5kb3csIGRhdGEgKTsKCQkJfSApKCBkYXRhICk7CgkJfQoJfSwKCgkvLyBDb252ZXJ0IGRhc2hlZCB0byBjYW1lbENhc2U7IHVzZWQgYnkgdGhlIGNzcyBhbmQgZGF0YSBtb2R1bGVzCgkvLyBNaWNyb3NvZnQgZm9yZ290IHRvIGh1bXAgdGhlaXIgdmVuZG9yIHByZWZpeCAoIzk1NzIpCgljYW1lbENhc2U6IGZ1bmN0aW9uKCBzdHJpbmcgKSB7CgkJcmV0dXJuIHN0cmluZy5yZXBsYWNlKCBybXNQcmVmaXgsICJtcy0iICkucmVwbGFjZSggcmRhc2hBbHBoYSwgZmNhbWVsQ2FzZSApOwoJfSwKCglub2RlTmFtZTogZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7CgkJcmV0dXJuIGVsZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBuYW1lLnRvVXBwZXJDYXNlKCk7Cgl9LAoKCS8vIGFyZ3MgaXMgZm9yIGludGVybmFsIHVzYWdlIG9ubHkKCWVhY2g6IGZ1bmN0aW9uKCBvYmplY3QsIGNhbGxiYWNrLCBhcmdzICkgewoJCXZhciBuYW1lLCBpID0gMCwKCQkJbGVuZ3RoID0gb2JqZWN0Lmxlbmd0aCwKCQkJaXNPYmogPSBsZW5ndGggPT09IHVuZGVmaW5lZCB8fCBqUXVlcnkuaXNGdW5jdGlvbiggb2JqZWN0ICk7CgoJCWlmICggYXJncyApIHsKCQkJaWYgKCBpc09iaiApIHsKCQkJCWZvciAoIG5hbWUgaW4gb2JqZWN0ICkgewoJCQkJCWlmICggY2FsbGJhY2suYXBwbHkoIG9iamVjdFsgbmFtZSBdLCBhcmdzICkgPT09IGZhbHNlICkgewoJCQkJCQlicmVhazsKCQkJCQl9CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQlmb3IgKCA7IGkgPCBsZW5ndGg7ICkgewoJCQkJCWlmICggY2FsbGJhY2suYXBwbHkoIG9iamVjdFsgaSsrIF0sIGFyZ3MgKSA9PT0gZmFsc2UgKSB7CgkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkvLyBBIHNwZWNpYWwsIGZhc3QsIGNhc2UgZm9yIHRoZSBtb3N0IGNvbW1vbiB1c2Ugb2YgZWFjaAoJCX0gZWxzZSB7CgkJCWlmICggaXNPYmogKSB7CgkJCQlmb3IgKCBuYW1lIGluIG9iamVjdCApIHsKCQkJCQlpZiAoIGNhbGxiYWNrLmNhbGwoIG9iamVjdFsgbmFtZSBdLCBuYW1lLCBvYmplY3RbIG5hbWUgXSApID09PSBmYWxzZSApIHsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJfQoJCQl9IGVsc2UgewoJCQkJZm9yICggOyBpIDwgbGVuZ3RoOyApIHsKCQkJCQlpZiAoIGNhbGxiYWNrLmNhbGwoIG9iamVjdFsgaSBdLCBpLCBvYmplY3RbIGkrKyBdICkgPT09IGZhbHNlICkgewoJCQkJCQlicmVhazsKCQkJCQl9CgkJCQl9CgkJCX0KCQl9CgoJCXJldHVybiBvYmplY3Q7Cgl9LAoKCS8vIFVzZSBuYXRpdmUgU3RyaW5nLnRyaW0gZnVuY3Rpb24gd2hlcmV2ZXIgcG9zc2libGUKCXRyaW06IHRyaW0gPwoJCWZ1bmN0aW9uKCB0ZXh0ICkgewoJCQlyZXR1cm4gdGV4dCA9PSBudWxsID8KCQkJCSIiIDoKCQkJCXRyaW0uY2FsbCggdGV4dCApOwoJCX0gOgoKCQkvLyBPdGhlcndpc2UgdXNlIG91ciBvd24gdHJpbW1pbmcgZnVuY3Rpb25hbGl0eQoJCWZ1bmN0aW9uKCB0ZXh0ICkgewoJCQlyZXR1cm4gdGV4dCA9PSBudWxsID8KCQkJCSIiIDoKCQkJCXRleHQudG9TdHJpbmcoKS5yZXBsYWNlKCB0cmltTGVmdCwgIiIgKS5yZXBsYWNlKCB0cmltUmlnaHQsICIiICk7CgkJfSwKCgkvLyByZXN1bHRzIGlzIGZvciBpbnRlcm5hbCB1c2FnZSBvbmx5CgltYWtlQXJyYXk6IGZ1bmN0aW9uKCBhcnJheSwgcmVzdWx0cyApIHsKCQl2YXIgcmV0ID0gcmVzdWx0cyB8fCBbXTsKCgkJaWYgKCBhcnJheSAhPSBudWxsICkgewoJCQkvLyBUaGUgd2luZG93LCBzdHJpbmdzIChhbmQgZnVuY3Rpb25zKSBhbHNvIGhhdmUgJ2xlbmd0aCcKCQkJLy8gVGhlIGV4dHJhIHR5cGVvZiBmdW5jdGlvbiBjaGVjayBpcyB0byBwcmV2ZW50IGNyYXNoZXMKCQkJLy8gaW4gU2FmYXJpIDIgKFNlZTogIzMwMzkpCgkJCS8vIFR3ZWFrZWQgbG9naWMgc2xpZ2h0bHkgdG8gaGFuZGxlIEJsYWNrYmVycnkgNC43IFJlZ0V4cCBpc3N1ZXMgIzY5MzAKCQkJdmFyIHR5cGUgPSBqUXVlcnkudHlwZSggYXJyYXkgKTsKCgkJCWlmICggYXJyYXkubGVuZ3RoID09IG51bGwgfHwgdHlwZSA9PT0gInN0cmluZyIgfHwgdHlwZSA9PT0gImZ1bmN0aW9uIiB8fCB0eXBlID09PSAicmVnZXhwIiB8fCBqUXVlcnkuaXNXaW5kb3coIGFycmF5ICkgKSB7CgkJCQlwdXNoLmNhbGwoIHJldCwgYXJyYXkgKTsKCQkJfSBlbHNlIHsKCQkJCWpRdWVyeS5tZXJnZSggcmV0LCBhcnJheSApOwoJCQl9CgkJfQoKCQlyZXR1cm4gcmV0OwoJfSwKCglpbkFycmF5OiBmdW5jdGlvbiggZWxlbSwgYXJyYXkgKSB7CgkJaWYgKCAhYXJyYXkgKSB7CgkJCXJldHVybiAtMTsKCQl9CgoJCWlmICggaW5kZXhPZiApIHsKCQkJcmV0dXJuIGluZGV4T2YuY2FsbCggYXJyYXksIGVsZW0gKTsKCQl9CgoJCWZvciAoIHZhciBpID0gMCwgbGVuZ3RoID0gYXJyYXkubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKysgKSB7CgkJCWlmICggYXJyYXlbIGkgXSA9PT0gZWxlbSApIHsKCQkJCXJldHVybiBpOwoJCQl9CgkJfQoKCQlyZXR1cm4gLTE7Cgl9LAoKCW1lcmdlOiBmdW5jdGlvbiggZmlyc3QsIHNlY29uZCApIHsKCQl2YXIgaSA9IGZpcnN0Lmxlbmd0aCwKCQkJaiA9IDA7CgoJCWlmICggdHlwZW9mIHNlY29uZC5sZW5ndGggPT09ICJudW1iZXIiICkgewoJCQlmb3IgKCB2YXIgbCA9IHNlY29uZC5sZW5ndGg7IGogPCBsOyBqKysgKSB7CgkJCQlmaXJzdFsgaSsrIF0gPSBzZWNvbmRbIGogXTsKCQkJfQoKCQl9IGVsc2UgewoJCQl3aGlsZSAoIHNlY29uZFtqXSAhPT0gdW5kZWZpbmVkICkgewoJCQkJZmlyc3RbIGkrKyBdID0gc2Vjb25kWyBqKysgXTsKCQkJfQoJCX0KCgkJZmlyc3QubGVuZ3RoID0gaTsKCgkJcmV0dXJuIGZpcnN0OwoJfSwKCglncmVwOiBmdW5jdGlvbiggZWxlbXMsIGNhbGxiYWNrLCBpbnYgKSB7CgkJdmFyIHJldCA9IFtdLCByZXRWYWw7CgkJaW52ID0gISFpbnY7CgoJCS8vIEdvIHRocm91Z2ggdGhlIGFycmF5LCBvbmx5IHNhdmluZyB0aGUgaXRlbXMKCQkvLyB0aGF0IHBhc3MgdGhlIHZhbGlkYXRvciBmdW5jdGlvbgoJCWZvciAoIHZhciBpID0gMCwgbGVuZ3RoID0gZWxlbXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKysgKSB7CgkJCXJldFZhbCA9ICEhY2FsbGJhY2soIGVsZW1zWyBpIF0sIGkgKTsKCQkJaWYgKCBpbnYgIT09IHJldFZhbCApIHsKCQkJCXJldC5wdXNoKCBlbGVtc1sgaSBdICk7CgkJCX0KCQl9CgoJCXJldHVybiByZXQ7Cgl9LAoKCS8vIGFyZyBpcyBmb3IgaW50ZXJuYWwgdXNhZ2Ugb25seQoJbWFwOiBmdW5jdGlvbiggZWxlbXMsIGNhbGxiYWNrLCBhcmcgKSB7CgkJdmFyIHZhbHVlLCBrZXksIHJldCA9IFtdLAoJCQlpID0gMCwKCQkJbGVuZ3RoID0gZWxlbXMubGVuZ3RoLAoJCQkvLyBqcXVlcnkgb2JqZWN0cyBhcmUgdHJlYXRlZCBhcyBhcnJheXMKCQkJaXNBcnJheSA9IGVsZW1zIGluc3RhbmNlb2YgalF1ZXJ5IHx8IGxlbmd0aCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBsZW5ndGggPT09ICJudW1iZXIiICYmICggKCBsZW5ndGggPiAwICYmIGVsZW1zWyAwIF0gJiYgZWxlbXNbIGxlbmd0aCAtMSBdICkgfHwgbGVuZ3RoID09PSAwIHx8IGpRdWVyeS5pc0FycmF5KCBlbGVtcyApICkgOwoKCQkvLyBHbyB0aHJvdWdoIHRoZSBhcnJheSwgdHJhbnNsYXRpbmcgZWFjaCBvZiB0aGUgaXRlbXMgdG8gdGhlaXIKCQlpZiAoIGlzQXJyYXkgKSB7CgkJCWZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkgewoJCQkJdmFsdWUgPSBjYWxsYmFjayggZWxlbXNbIGkgXSwgaSwgYXJnICk7CgoJCQkJaWYgKCB2YWx1ZSAhPSBudWxsICkgewoJCQkJCXJldFsgcmV0Lmxlbmd0aCBdID0gdmFsdWU7CgkJCQl9CgkJCX0KCgkJLy8gR28gdGhyb3VnaCBldmVyeSBrZXkgb24gdGhlIG9iamVjdCwKCQl9IGVsc2UgewoJCQlmb3IgKCBrZXkgaW4gZWxlbXMgKSB7CgkJCQl2YWx1ZSA9IGNhbGxiYWNrKCBlbGVtc1sga2V5IF0sIGtleSwgYXJnICk7CgoJCQkJaWYgKCB2YWx1ZSAhPSBudWxsICkgewoJCQkJCXJldFsgcmV0Lmxlbmd0aCBdID0gdmFsdWU7CgkJCQl9CgkJCX0KCQl9CgoJCS8vIEZsYXR0ZW4gYW55IG5lc3RlZCBhcnJheXMKCQlyZXR1cm4gcmV0LmNvbmNhdC5hcHBseSggW10sIHJldCApOwoJfSwKCgkvLyBBIGdsb2JhbCBHVUlEIGNvdW50ZXIgZm9yIG9iamVjdHMKCWd1aWQ6IDEsCgoJLy8gQmluZCBhIGZ1bmN0aW9uIHRvIGEgY29udGV4dCwgb3B0aW9uYWxseSBwYXJ0aWFsbHkgYXBwbHlpbmcgYW55CgkvLyBhcmd1bWVudHMuCglwcm94eTogZnVuY3Rpb24oIGZuLCBjb250ZXh0ICkgewoJCWlmICggdHlwZW9mIGNvbnRleHQgPT09ICJzdHJpbmciICkgewoJCQl2YXIgdG1wID0gZm5bIGNvbnRleHQgXTsKCQkJY29udGV4dCA9IGZuOwoJCQlmbiA9IHRtcDsKCQl9CgoJCS8vIFF1aWNrIGNoZWNrIHRvIGRldGVybWluZSBpZiB0YXJnZXQgaXMgY2FsbGFibGUsIGluIHRoZSBzcGVjCgkJLy8gdGhpcyB0aHJvd3MgYSBUeXBlRXJyb3IsIGJ1dCB3ZSB3aWxsIGp1c3QgcmV0dXJuIHVuZGVmaW5lZC4KCQlpZiAoICFqUXVlcnkuaXNGdW5jdGlvbiggZm4gKSApIHsKCQkJcmV0dXJuIHVuZGVmaW5lZDsKCQl9CgoJCS8vIFNpbXVsYXRlZCBiaW5kCgkJdmFyIGFyZ3MgPSBzbGljZS5jYWxsKCBhcmd1bWVudHMsIDIgKSwKCQkJcHJveHkgPSBmdW5jdGlvbigpIHsKCQkJCXJldHVybiBmbi5hcHBseSggY29udGV4dCwgYXJncy5jb25jYXQoIHNsaWNlLmNhbGwoIGFyZ3VtZW50cyApICkgKTsKCQkJfTsKCgkJLy8gU2V0IHRoZSBndWlkIG9mIHVuaXF1ZSBoYW5kbGVyIHRvIHRoZSBzYW1lIG9mIG9yaWdpbmFsIGhhbmRsZXIsIHNvIGl0IGNhbiBiZSByZW1vdmVkCgkJcHJveHkuZ3VpZCA9IGZuLmd1aWQgPSBmbi5ndWlkIHx8IHByb3h5Lmd1aWQgfHwgalF1ZXJ5Lmd1aWQrKzsKCgkJcmV0dXJuIHByb3h5OwoJfSwKCgkvLyBNdXRpZnVuY3Rpb25hbCBtZXRob2QgdG8gZ2V0IGFuZCBzZXQgdmFsdWVzIHRvIGEgY29sbGVjdGlvbgoJLy8gVGhlIHZhbHVlL3MgY2FuIG9wdGlvbmFsbHkgYmUgZXhlY3V0ZWQgaWYgaXQncyBhIGZ1bmN0aW9uCglhY2Nlc3M6IGZ1bmN0aW9uKCBlbGVtcywga2V5LCB2YWx1ZSwgZXhlYywgZm4sIHBhc3MgKSB7CgkJdmFyIGxlbmd0aCA9IGVsZW1zLmxlbmd0aDsKCgkJLy8gU2V0dGluZyBtYW55IGF0dHJpYnV0ZXMKCQlpZiAoIHR5cGVvZiBrZXkgPT09ICJvYmplY3QiICkgewoJCQlmb3IgKCB2YXIgayBpbiBrZXkgKSB7CgkJCQlqUXVlcnkuYWNjZXNzKCBlbGVtcywgaywga2V5W2tdLCBleGVjLCBmbiwgdmFsdWUgKTsKCQkJfQoJCQlyZXR1cm4gZWxlbXM7CgkJfQoKCQkvLyBTZXR0aW5nIG9uZSBhdHRyaWJ1dGUKCQlpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7CgkJCS8vIE9wdGlvbmFsbHksIGZ1bmN0aW9uIHZhbHVlcyBnZXQgZXhlY3V0ZWQgaWYgZXhlYyBpcyB0cnVlCgkJCWV4ZWMgPSAhcGFzcyAmJiBleGVjICYmIGpRdWVyeS5pc0Z1bmN0aW9uKHZhbHVlKTsKCgkJCWZvciAoIHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrICkgewoJCQkJZm4oIGVsZW1zW2ldLCBrZXksIGV4ZWMgPyB2YWx1ZS5jYWxsKCBlbGVtc1tpXSwgaSwgZm4oIGVsZW1zW2ldLCBrZXkgKSApIDogdmFsdWUsIHBhc3MgKTsKCQkJfQoKCQkJcmV0dXJuIGVsZW1zOwoJCX0KCgkJLy8gR2V0dGluZyBhbiBhdHRyaWJ1dGUKCQlyZXR1cm4gbGVuZ3RoID8gZm4oIGVsZW1zWzBdLCBrZXkgKSA6IHVuZGVmaW5lZDsKCX0sCgoJbm93OiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gKG5ldyBEYXRlKCkpLmdldFRpbWUoKTsKCX0sCgoJLy8gVXNlIG9mIGpRdWVyeS5icm93c2VyIGlzIGZyb3duZWQgdXBvbi4KCS8vIE1vcmUgZGV0YWlsczogaHR0cDovL2RvY3MuanF1ZXJ5LmNvbS9VdGlsaXRpZXMvalF1ZXJ5LmJyb3dzZXIKCXVhTWF0Y2g6IGZ1bmN0aW9uKCB1YSApIHsKCQl1YSA9IHVhLnRvTG93ZXJDYXNlKCk7CgoJCXZhciBtYXRjaCA9IHJ3ZWJraXQuZXhlYyggdWEgKSB8fAoJCQlyb3BlcmEuZXhlYyggdWEgKSB8fAoJCQlybXNpZS5leGVjKCB1YSApIHx8CgkJCXVhLmluZGV4T2YoImNvbXBhdGlibGUiKSA8IDAgJiYgcm1vemlsbGEuZXhlYyggdWEgKSB8fAoJCQlbXTsKCgkJcmV0dXJuIHsgYnJvd3NlcjogbWF0Y2hbMV0gfHwgIiIsIHZlcnNpb246IG1hdGNoWzJdIHx8ICIwIiB9OwoJfSwKCglzdWI6IGZ1bmN0aW9uKCkgewoJCWZ1bmN0aW9uIGpRdWVyeVN1Yiggc2VsZWN0b3IsIGNvbnRleHQgKSB7CgkJCXJldHVybiBuZXcgalF1ZXJ5U3ViLmZuLmluaXQoIHNlbGVjdG9yLCBjb250ZXh0ICk7CgkJfQoJCWpRdWVyeS5leHRlbmQoIHRydWUsIGpRdWVyeVN1YiwgdGhpcyApOwoJCWpRdWVyeVN1Yi5zdXBlcmNsYXNzID0gdGhpczsKCQlqUXVlcnlTdWIuZm4gPSBqUXVlcnlTdWIucHJvdG90eXBlID0gdGhpcygpOwoJCWpRdWVyeVN1Yi5mbi5jb25zdHJ1Y3RvciA9IGpRdWVyeVN1YjsKCQlqUXVlcnlTdWIuc3ViID0gdGhpcy5zdWI7CgkJalF1ZXJ5U3ViLmZuLmluaXQgPSBmdW5jdGlvbiBpbml0KCBzZWxlY3RvciwgY29udGV4dCApIHsKCQkJaWYgKCBjb250ZXh0ICYmIGNvbnRleHQgaW5zdGFuY2VvZiBqUXVlcnkgJiYgIShjb250ZXh0IGluc3RhbmNlb2YgalF1ZXJ5U3ViKSApIHsKCQkJCWNvbnRleHQgPSBqUXVlcnlTdWIoIGNvbnRleHQgKTsKCQkJfQoKCQkJcmV0dXJuIGpRdWVyeS5mbi5pbml0LmNhbGwoIHRoaXMsIHNlbGVjdG9yLCBjb250ZXh0LCByb290alF1ZXJ5U3ViICk7CgkJfTsKCQlqUXVlcnlTdWIuZm4uaW5pdC5wcm90b3R5cGUgPSBqUXVlcnlTdWIuZm47CgkJdmFyIHJvb3RqUXVlcnlTdWIgPSBqUXVlcnlTdWIoZG9jdW1lbnQpOwoJCXJldHVybiBqUXVlcnlTdWI7Cgl9LAoKCWJyb3dzZXI6IHt9Cn0pOwoKLy8gUG9wdWxhdGUgdGhlIGNsYXNzMnR5cGUgbWFwCmpRdWVyeS5lYWNoKCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0Ii5zcGxpdCgiICIpLCBmdW5jdGlvbihpLCBuYW1lKSB7CgljbGFzczJ0eXBlWyAiW29iamVjdCAiICsgbmFtZSArICJdIiBdID0gbmFtZS50b0xvd2VyQ2FzZSgpOwp9KTsKCmJyb3dzZXJNYXRjaCA9IGpRdWVyeS51YU1hdGNoKCB1c2VyQWdlbnQgKTsKaWYgKCBicm93c2VyTWF0Y2guYnJvd3NlciApIHsKCWpRdWVyeS5icm93c2VyWyBicm93c2VyTWF0Y2guYnJvd3NlciBdID0gdHJ1ZTsKCWpRdWVyeS5icm93c2VyLnZlcnNpb24gPSBicm93c2VyTWF0Y2gudmVyc2lvbjsKfQoKLy8gRGVwcmVjYXRlZCwgdXNlIGpRdWVyeS5icm93c2VyLndlYmtpdCBpbnN0ZWFkCmlmICggalF1ZXJ5LmJyb3dzZXIud2Via2l0ICkgewoJalF1ZXJ5LmJyb3dzZXIuc2FmYXJpID0gdHJ1ZTsKfQoKLy8gSUUgZG9lc24ndCBtYXRjaCBub24tYnJlYWtpbmcgc3BhY2VzIHdpdGggXHMKaWYgKCBybm90d2hpdGUudGVzdCggIlx4QTAiICkgKSB7Cgl0cmltTGVmdCA9IC9eW1xzXHhBMF0rLzsKCXRyaW1SaWdodCA9IC9bXHNceEEwXSskLzsKfQoKLy8gQWxsIGpRdWVyeSBvYmplY3RzIHNob3VsZCBwb2ludCBiYWNrIHRvIHRoZXNlCnJvb3RqUXVlcnkgPSBqUXVlcnkoZG9jdW1lbnQpOwoKLy8gQ2xlYW51cCBmdW5jdGlvbnMgZm9yIHRoZSBkb2N1bWVudCByZWFkeSBtZXRob2QKaWYgKCBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyICkgewoJRE9NQ29udGVudExvYWRlZCA9IGZ1bmN0aW9uKCkgewoJCWRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoICJET01Db250ZW50TG9hZGVkIiwgRE9NQ29udGVudExvYWRlZCwgZmFsc2UgKTsKCQlqUXVlcnkucmVhZHkoKTsKCX07Cgp9IGVsc2UgaWYgKCBkb2N1bWVudC5hdHRhY2hFdmVudCApIHsKCURPTUNvbnRlbnRMb2FkZWQgPSBmdW5jdGlvbigpIHsKCQkvLyBNYWtlIHN1cmUgYm9keSBleGlzdHMsIGF0IGxlYXN0LCBpbiBjYXNlIElFIGdldHMgYSBsaXR0bGUgb3ZlcnplYWxvdXMgKHRpY2tldCAjNTQ0MykuCgkJaWYgKCBkb2N1bWVudC5yZWFkeVN0YXRlID09PSAiY29tcGxldGUiICkgewoJCQlkb2N1bWVudC5kZXRhY2hFdmVudCggIm9ucmVhZHlzdGF0ZWNoYW5nZSIsIERPTUNvbnRlbnRMb2FkZWQgKTsKCQkJalF1ZXJ5LnJlYWR5KCk7CgkJfQoJfTsKfQoKLy8gVGhlIERPTSByZWFkeSBjaGVjayBmb3IgSW50ZXJuZXQgRXhwbG9yZXIKZnVuY3Rpb24gZG9TY3JvbGxDaGVjaygpIHsKCWlmICggalF1ZXJ5LmlzUmVhZHkgKSB7CgkJcmV0dXJuOwoJfQoKCXRyeSB7CgkJLy8gSWYgSUUgaXMgdXNlZCwgdXNlIHRoZSB0cmljayBieSBEaWVnbyBQZXJpbmkKCQkvLyBodHRwOi8vamF2YXNjcmlwdC5ud2JveC5jb20vSUVDb250ZW50TG9hZGVkLwoJCWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCgibGVmdCIpOwoJfSBjYXRjaChlKSB7CgkJc2V0VGltZW91dCggZG9TY3JvbGxDaGVjaywgMSApOwoJCXJldHVybjsKCX0KCgkvLyBhbmQgZXhlY3V0ZSBhbnkgd2FpdGluZyBmdW5jdGlvbnMKCWpRdWVyeS5yZWFkeSgpOwp9CgpyZXR1cm4galF1ZXJ5OwoKfSkoKTsKCgp2YXIgLy8gUHJvbWlzZSBtZXRob2RzCglwcm9taXNlTWV0aG9kcyA9ICJkb25lIGZhaWwgaXNSZXNvbHZlZCBpc1JlamVjdGVkIHByb21pc2UgdGhlbiBhbHdheXMgcGlwZSIuc3BsaXQoICIgIiApLAoJLy8gU3RhdGljIHJlZmVyZW5jZSB0byBzbGljZQoJc2xpY2VEZWZlcnJlZCA9IFtdLnNsaWNlOwoKalF1ZXJ5LmV4dGVuZCh7CgkvLyBDcmVhdGUgYSBzaW1wbGUgZGVmZXJyZWQgKG9uZSBjYWxsYmFja3MgbGlzdCkKCV9EZWZlcnJlZDogZnVuY3Rpb24oKSB7CgkJdmFyIC8vIGNhbGxiYWNrcyBsaXN0CgkJCWNhbGxiYWNrcyA9IFtdLAoJCQkvLyBzdG9yZWQgWyBjb250ZXh0ICwgYXJncyBdCgkJCWZpcmVkLAoJCQkvLyB0byBhdm9pZCBmaXJpbmcgd2hlbiBhbHJlYWR5IGRvaW5nIHNvCgkJCWZpcmluZywKCQkJLy8gZmxhZyB0byBrbm93IGlmIHRoZSBkZWZlcnJlZCBoYXMgYmVlbiBjYW5jZWxsZWQKCQkJY2FuY2VsbGVkLAoJCQkvLyB0aGUgZGVmZXJyZWQgaXRzZWxmCgkJCWRlZmVycmVkICA9IHsKCgkJCQkvLyBkb25lKCBmMSwgZjIsIC4uLikKCQkJCWRvbmU6IGZ1bmN0aW9uKCkgewoJCQkJCWlmICggIWNhbmNlbGxlZCApIHsKCQkJCQkJdmFyIGFyZ3MgPSBhcmd1bWVudHMsCgkJCQkJCQlpLAoJCQkJCQkJbGVuZ3RoLAoJCQkJCQkJZWxlbSwKCQkJCQkJCXR5cGUsCgkJCQkJCQlfZmlyZWQ7CgkJCQkJCWlmICggZmlyZWQgKSB7CgkJCQkJCQlfZmlyZWQgPSBmaXJlZDsKCQkJCQkJCWZpcmVkID0gMDsKCQkJCQkJfQoJCQkJCQlmb3IgKCBpID0gMCwgbGVuZ3RoID0gYXJncy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKyApIHsKCQkJCQkJCWVsZW0gPSBhcmdzWyBpIF07CgkJCQkJCQl0eXBlID0galF1ZXJ5LnR5cGUoIGVsZW0gKTsKCQkJCQkJCWlmICggdHlwZSA9PT0gImFycmF5IiApIHsKCQkJCQkJCQlkZWZlcnJlZC5kb25lLmFwcGx5KCBkZWZlcnJlZCwgZWxlbSApOwoJCQkJCQkJfSBlbHNlIGlmICggdHlwZSA9PT0gImZ1bmN0aW9uIiApIHsKCQkJCQkJCQljYWxsYmFja3MucHVzaCggZWxlbSApOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCWlmICggX2ZpcmVkICkgewoJCQkJCQkJZGVmZXJyZWQucmVzb2x2ZVdpdGgoIF9maXJlZFsgMCBdLCBfZmlyZWRbIDEgXSApOwoJCQkJCQl9CgkJCQkJfQoJCQkJCXJldHVybiB0aGlzOwoJCQkJfSwKCgkJCQkvLyByZXNvbHZlIHdpdGggZ2l2ZW4gY29udGV4dCBhbmQgYXJncwoJCQkJcmVzb2x2ZVdpdGg6IGZ1bmN0aW9uKCBjb250ZXh0LCBhcmdzICkgewoJCQkJCWlmICggIWNhbmNlbGxlZCAmJiAhZmlyZWQgJiYgIWZpcmluZyApIHsKCQkJCQkJLy8gbWFrZSBzdXJlIGFyZ3MgYXJlIGF2YWlsYWJsZSAoIzg0MjEpCgkJCQkJCWFyZ3MgPSBhcmdzIHx8IFtdOwoJCQkJCQlmaXJpbmcgPSAxOwoJCQkJCQl0cnkgewoJCQkJCQkJd2hpbGUoIGNhbGxiYWNrc1sgMCBdICkgewoJCQkJCQkJCWNhbGxiYWNrcy5zaGlmdCgpLmFwcGx5KCBjb250ZXh0LCBhcmdzICk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQkJZmluYWxseSB7CgkJCQkJCQlmaXJlZCA9IFsgY29udGV4dCwgYXJncyBdOwoJCQkJCQkJZmlyaW5nID0gMDsKCQkJCQkJfQoJCQkJCX0KCQkJCQlyZXR1cm4gdGhpczsKCQkJCX0sCgoJCQkJLy8gcmVzb2x2ZSB3aXRoIHRoaXMgYXMgY29udGV4dCBhbmQgZ2l2ZW4gYXJndW1lbnRzCgkJCQlyZXNvbHZlOiBmdW5jdGlvbigpIHsKCQkJCQlkZWZlcnJlZC5yZXNvbHZlV2l0aCggdGhpcywgYXJndW1lbnRzICk7CgkJCQkJcmV0dXJuIHRoaXM7CgkJCQl9LAoKCQkJCS8vIEhhcyB0aGlzIGRlZmVycmVkIGJlZW4gcmVzb2x2ZWQ/CgkJCQlpc1Jlc29sdmVkOiBmdW5jdGlvbigpIHsKCQkJCQlyZXR1cm4gISEoIGZpcmluZyB8fCBmaXJlZCApOwoJCQkJfSwKCgkJCQkvLyBDYW5jZWwKCQkJCWNhbmNlbDogZnVuY3Rpb24oKSB7CgkJCQkJY2FuY2VsbGVkID0gMTsKCQkJCQljYWxsYmFja3MgPSBbXTsKCQkJCQlyZXR1cm4gdGhpczsKCQkJCX0KCQkJfTsKCgkJcmV0dXJuIGRlZmVycmVkOwoJfSwKCgkvLyBGdWxsIGZsZWRnZWQgZGVmZXJyZWQgKHR3byBjYWxsYmFja3MgbGlzdCkKCURlZmVycmVkOiBmdW5jdGlvbiggZnVuYyApIHsKCQl2YXIgZGVmZXJyZWQgPSBqUXVlcnkuX0RlZmVycmVkKCksCgkJCWZhaWxEZWZlcnJlZCA9IGpRdWVyeS5fRGVmZXJyZWQoKSwKCQkJcHJvbWlzZTsKCQkvLyBBZGQgZXJyb3JEZWZlcnJlZCBtZXRob2RzLCB0aGVuIGFuZCBwcm9taXNlCgkJalF1ZXJ5LmV4dGVuZCggZGVmZXJyZWQsIHsKCQkJdGhlbjogZnVuY3Rpb24oIGRvbmVDYWxsYmFja3MsIGZhaWxDYWxsYmFja3MgKSB7CgkJCQlkZWZlcnJlZC5kb25lKCBkb25lQ2FsbGJhY2tzICkuZmFpbCggZmFpbENhbGxiYWNrcyApOwoJCQkJcmV0dXJuIHRoaXM7CgkJCX0sCgkJCWFsd2F5czogZnVuY3Rpb24oKSB7CgkJCQlyZXR1cm4gZGVmZXJyZWQuZG9uZS5hcHBseSggZGVmZXJyZWQsIGFyZ3VtZW50cyApLmZhaWwuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwoJCQl9LAoJCQlmYWlsOiBmYWlsRGVmZXJyZWQuZG9uZSwKCQkJcmVqZWN0V2l0aDogZmFpbERlZmVycmVkLnJlc29sdmVXaXRoLAoJCQlyZWplY3Q6IGZhaWxEZWZlcnJlZC5yZXNvbHZlLAoJCQlpc1JlamVjdGVkOiBmYWlsRGVmZXJyZWQuaXNSZXNvbHZlZCwKCQkJcGlwZTogZnVuY3Rpb24oIGZuRG9uZSwgZm5GYWlsICkgewoJCQkJcmV0dXJuIGpRdWVyeS5EZWZlcnJlZChmdW5jdGlvbiggbmV3RGVmZXIgKSB7CgkJCQkJalF1ZXJ5LmVhY2goIHsKCQkJCQkJZG9uZTogWyBmbkRvbmUsICJyZXNvbHZlIiBdLAoJCQkJCQlmYWlsOiBbIGZuRmFpbCwgInJlamVjdCIgXQoJCQkJCX0sIGZ1bmN0aW9uKCBoYW5kbGVyLCBkYXRhICkgewoJCQkJCQl2YXIgZm4gPSBkYXRhWyAwIF0sCgkJCQkJCQlhY3Rpb24gPSBkYXRhWyAxIF0sCgkJCQkJCQlyZXR1cm5lZDsKCQkJCQkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggZm4gKSApIHsKCQkJCQkJCWRlZmVycmVkWyBoYW5kbGVyIF0oZnVuY3Rpb24oKSB7CgkJCQkJCQkJcmV0dXJuZWQgPSBmbi5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgkJCQkJCQkJaWYgKCByZXR1cm5lZCAmJiBqUXVlcnkuaXNGdW5jdGlvbiggcmV0dXJuZWQucHJvbWlzZSApICkgewoJCQkJCQkJCQlyZXR1cm5lZC5wcm9taXNlKCkudGhlbiggbmV3RGVmZXIucmVzb2x2ZSwgbmV3RGVmZXIucmVqZWN0ICk7CgkJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQkJbmV3RGVmZXJbIGFjdGlvbiArICJXaXRoIiBdKCB0aGlzID09PSBkZWZlcnJlZCA/IG5ld0RlZmVyIDogdGhpcywgWyByZXR1cm5lZCBdICk7CgkJCQkJCQkJfQoJCQkJCQkJfSk7CgkJCQkJCX0gZWxzZSB7CgkJCQkJCQlkZWZlcnJlZFsgaGFuZGxlciBdKCBuZXdEZWZlclsgYWN0aW9uIF0gKTsKCQkJCQkJfQoJCQkJCX0pOwoJCQkJfSkucHJvbWlzZSgpOwoJCQl9LAoJCQkvLyBHZXQgYSBwcm9taXNlIGZvciB0aGlzIGRlZmVycmVkCgkJCS8vIElmIG9iaiBpcyBwcm92aWRlZCwgdGhlIHByb21pc2UgYXNwZWN0IGlzIGFkZGVkIHRvIHRoZSBvYmplY3QKCQkJcHJvbWlzZTogZnVuY3Rpb24oIG9iaiApIHsKCQkJCWlmICggb2JqID09IG51bGwgKSB7CgkJCQkJaWYgKCBwcm9taXNlICkgewoJCQkJCQlyZXR1cm4gcHJvbWlzZTsKCQkJCQl9CgkJCQkJcHJvbWlzZSA9IG9iaiA9IHt9OwoJCQkJfQoJCQkJdmFyIGkgPSBwcm9taXNlTWV0aG9kcy5sZW5ndGg7CgkJCQl3aGlsZSggaS0tICkgewoJCQkJCW9ialsgcHJvbWlzZU1ldGhvZHNbaV0gXSA9IGRlZmVycmVkWyBwcm9taXNlTWV0aG9kc1tpXSBdOwoJCQkJfQoJCQkJcmV0dXJuIG9iajsKCQkJfQoJCX0pOwoJCS8vIE1ha2Ugc3VyZSBvbmx5IG9uZSBjYWxsYmFjayBsaXN0IHdpbGwgYmUgdXNlZAoJCWRlZmVycmVkLmRvbmUoIGZhaWxEZWZlcnJlZC5jYW5jZWwgKS5mYWlsKCBkZWZlcnJlZC5jYW5jZWwgKTsKCQkvLyBVbmV4cG9zZSBjYW5jZWwKCQlkZWxldGUgZGVmZXJyZWQuY2FuY2VsOwoJCS8vIENhbGwgZ2l2ZW4gZnVuYyBpZiBhbnkKCQlpZiAoIGZ1bmMgKSB7CgkJCWZ1bmMuY2FsbCggZGVmZXJyZWQsIGRlZmVycmVkICk7CgkJfQoJCXJldHVybiBkZWZlcnJlZDsKCX0sCgoJLy8gRGVmZXJyZWQgaGVscGVyCgl3aGVuOiBmdW5jdGlvbiggZmlyc3RQYXJhbSApIHsKCQl2YXIgYXJncyA9IGFyZ3VtZW50cywKCQkJaSA9IDAsCgkJCWxlbmd0aCA9IGFyZ3MubGVuZ3RoLAoJCQljb3VudCA9IGxlbmd0aCwKCQkJZGVmZXJyZWQgPSBsZW5ndGggPD0gMSAmJiBmaXJzdFBhcmFtICYmIGpRdWVyeS5pc0Z1bmN0aW9uKCBmaXJzdFBhcmFtLnByb21pc2UgKSA/CgkJCQlmaXJzdFBhcmFtIDoKCQkJCWpRdWVyeS5EZWZlcnJlZCgpOwoJCWZ1bmN0aW9uIHJlc29sdmVGdW5jKCBpICkgewoJCQlyZXR1cm4gZnVuY3Rpb24oIHZhbHVlICkgewoJCQkJYXJnc1sgaSBdID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBzbGljZURlZmVycmVkLmNhbGwoIGFyZ3VtZW50cywgMCApIDogdmFsdWU7CgkJCQlpZiAoICEoIC0tY291bnQgKSApIHsKCQkJCQkvLyBTdHJhbmdlIGJ1ZyBpbiBGRjQ6CgkJCQkJLy8gVmFsdWVzIGNoYW5nZWQgb250byB0aGUgYXJndW1lbnRzIG9iamVjdCBzb21ldGltZXMgZW5kIHVwIGFzIHVuZGVmaW5lZCB2YWx1ZXMKCQkJCQkvLyBvdXRzaWRlIHRoZSAkLndoZW4gbWV0aG9kLiBDbG9uaW5nIHRoZSBvYmplY3QgaW50byBhIGZyZXNoIGFycmF5IHNvbHZlcyB0aGUgaXNzdWUKCQkJCQlkZWZlcnJlZC5yZXNvbHZlV2l0aCggZGVmZXJyZWQsIHNsaWNlRGVmZXJyZWQuY2FsbCggYXJncywgMCApICk7CgkJCQl9CgkJCX07CgkJfQoJCWlmICggbGVuZ3RoID4gMSApIHsKCQkJZm9yKCA7IGkgPCBsZW5ndGg7IGkrKyApIHsKCQkJCWlmICggYXJnc1sgaSBdICYmIGpRdWVyeS5pc0Z1bmN0aW9uKCBhcmdzWyBpIF0ucHJvbWlzZSApICkgewoJCQkJCWFyZ3NbIGkgXS5wcm9taXNlKCkudGhlbiggcmVzb2x2ZUZ1bmMoaSksIGRlZmVycmVkLnJlamVjdCApOwoJCQkJfSBlbHNlIHsKCQkJCQktLWNvdW50OwoJCQkJfQoJCQl9CgkJCWlmICggIWNvdW50ICkgewoJCQkJZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGRlZmVycmVkLCBhcmdzICk7CgkJCX0KCQl9IGVsc2UgaWYgKCBkZWZlcnJlZCAhPT0gZmlyc3RQYXJhbSApIHsKCQkJZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGRlZmVycmVkLCBsZW5ndGggPyBbIGZpcnN0UGFyYW0gXSA6IFtdICk7CgkJfQoJCXJldHVybiBkZWZlcnJlZC5wcm9taXNlKCk7Cgl9Cn0pOwoKCgpqUXVlcnkuc3VwcG9ydCA9IChmdW5jdGlvbigpIHsKCgl2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImRpdiIgKSwKCQlkb2N1bWVudEVsZW1lbnQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsCgkJYWxsLAoJCWEsCgkJc2VsZWN0LAoJCW9wdCwKCQlpbnB1dCwKCQltYXJnaW5EaXYsCgkJc3VwcG9ydCwKCQlmcmFnbWVudCwKCQlib2R5LAoJCXRlc3RFbGVtZW50UGFyZW50LAoJCXRlc3RFbGVtZW50LAoJCXRlc3RFbGVtZW50U3R5bGUsCgkJdGRzLAoJCWV2ZW50cywKCQlldmVudE5hbWUsCgkJaSwKCQlpc1N1cHBvcnRlZDsKCgkvLyBQcmVsaW1pbmFyeSB0ZXN0cwoJZGl2LnNldEF0dHJpYnV0ZSgiY2xhc3NOYW1lIiwgInQiKTsKCWRpdi5pbm5lckhUTUwgPSAiICAgPGxpbms+PHRhYmxlPjwvdGFibGU+PGEgaHJlZj0nL2EnIHN0eWxlPSd0b3A6MXB4O2Zsb2F0OmxlZnQ7b3BhY2l0eTouNTU7Jz5hPC9hPjxpbnB1dCB0eXBlPWNoZWNrYm94PiI7CgoKCWFsbCA9IGRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSggIioiICk7CglhID0gZGl2LmdldEVsZW1lbnRzQnlUYWdOYW1lKCAiYSIgKVsgMCBdOwoKCS8vIENhbid0IGdldCBiYXNpYyB0ZXN0IHN1cHBvcnQKCWlmICggIWFsbCB8fCAhYWxsLmxlbmd0aCB8fCAhYSApIHsKCQlyZXR1cm4ge307Cgl9CgoJLy8gRmlyc3QgYmF0Y2ggb2Ygc3VwcG9ydHMgdGVzdHMKCXNlbGVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJzZWxlY3QiICk7CglvcHQgPSBzZWxlY3QuYXBwZW5kQ2hpbGQoIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpICk7CglpbnB1dCA9IGRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSggImlucHV0IiApWyAwIF07CgoJc3VwcG9ydCA9IHsKCQkvLyBJRSBzdHJpcHMgbGVhZGluZyB3aGl0ZXNwYWNlIHdoZW4gLmlubmVySFRNTCBpcyB1c2VkCgkJbGVhZGluZ1doaXRlc3BhY2U6ICggZGl2LmZpcnN0Q2hpbGQubm9kZVR5cGUgPT09IDMgKSwKCgkJLy8gTWFrZSBzdXJlIHRoYXQgdGJvZHkgZWxlbWVudHMgYXJlbid0IGF1dG9tYXRpY2FsbHkgaW5zZXJ0ZWQKCQkvLyBJRSB3aWxsIGluc2VydCB0aGVtIGludG8gZW1wdHkgdGFibGVzCgkJdGJvZHk6ICFkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoICJ0Ym9keSIgKS5sZW5ndGgsCgoJCS8vIE1ha2Ugc3VyZSB0aGF0IGxpbmsgZWxlbWVudHMgZ2V0IHNlcmlhbGl6ZWQgY29ycmVjdGx5IGJ5IGlubmVySFRNTAoJCS8vIFRoaXMgcmVxdWlyZXMgYSB3cmFwcGVyIGVsZW1lbnQgaW4gSUUKCQlodG1sU2VyaWFsaXplOiAhIWRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSggImxpbmsiICkubGVuZ3RoLAoKCQkvLyBHZXQgdGhlIHN0eWxlIGluZm9ybWF0aW9uIGZyb20gZ2V0QXR0cmlidXRlCgkJLy8gKElFIHVzZXMgLmNzc1RleHQgaW5zdGVhZCkKCQlzdHlsZTogL3RvcC8udGVzdCggYS5nZXRBdHRyaWJ1dGUoInN0eWxlIikgKSwKCgkJLy8gTWFrZSBzdXJlIHRoYXQgVVJMcyBhcmVuJ3QgbWFuaXB1bGF0ZWQKCQkvLyAoSUUgbm9ybWFsaXplcyBpdCBieSBkZWZhdWx0KQoJCWhyZWZOb3JtYWxpemVkOiAoIGEuZ2V0QXR0cmlidXRlKCAiaHJlZiIgKSA9PT0gIi9hIiApLAoKCQkvLyBNYWtlIHN1cmUgdGhhdCBlbGVtZW50IG9wYWNpdHkgZXhpc3RzCgkJLy8gKElFIHVzZXMgZmlsdGVyIGluc3RlYWQpCgkJLy8gVXNlIGEgcmVnZXggdG8gd29yayBhcm91bmQgYSBXZWJLaXQgaXNzdWUuIFNlZSAjNTE0NQoJCW9wYWNpdHk6IC9eMC41NSQvLnRlc3QoIGEuc3R5bGUub3BhY2l0eSApLAoKCQkvLyBWZXJpZnkgc3R5bGUgZmxvYXQgZXhpc3RlbmNlCgkJLy8gKElFIHVzZXMgc3R5bGVGbG9hdCBpbnN0ZWFkIG9mIGNzc0Zsb2F0KQoJCWNzc0Zsb2F0OiAhIWEuc3R5bGUuY3NzRmxvYXQsCgoJCS8vIE1ha2Ugc3VyZSB0aGF0IGlmIG5vIHZhbHVlIGlzIHNwZWNpZmllZCBmb3IgYSBjaGVja2JveAoJCS8vIHRoYXQgaXQgZGVmYXVsdHMgdG8gIm9uIi4KCQkvLyAoV2ViS2l0IGRlZmF1bHRzIHRvICIiIGluc3RlYWQpCgkJY2hlY2tPbjogKCBpbnB1dC52YWx1ZSA9PT0gIm9uIiApLAoKCQkvLyBNYWtlIHN1cmUgdGhhdCBhIHNlbGVjdGVkLWJ5LWRlZmF1bHQgb3B0aW9uIGhhcyBhIHdvcmtpbmcgc2VsZWN0ZWQgcHJvcGVydHkuCgkJLy8gKFdlYktpdCBkZWZhdWx0cyB0byBmYWxzZSBpbnN0ZWFkIG9mIHRydWUsIElFIHRvbywgaWYgaXQncyBpbiBhbiBvcHRncm91cCkKCQlvcHRTZWxlY3RlZDogb3B0LnNlbGVjdGVkLAoKCQkvLyBUZXN0IHNldEF0dHJpYnV0ZSBvbiBjYW1lbENhc2UgY2xhc3MuIElmIGl0IHdvcmtzLCB3ZSBuZWVkIGF0dHJGaXhlcyB3aGVuIGRvaW5nIGdldC9zZXRBdHRyaWJ1dGUgKGllNi83KQoJCWdldFNldEF0dHJpYnV0ZTogZGl2LmNsYXNzTmFtZSAhPT0gInQiLAoKCQkvLyBXaWxsIGJlIGRlZmluZWQgbGF0ZXIKCQlzdWJtaXRCdWJibGVzOiB0cnVlLAoJCWNoYW5nZUJ1YmJsZXM6IHRydWUsCgkJZm9jdXNpbkJ1YmJsZXM6IGZhbHNlLAoJCWRlbGV0ZUV4cGFuZG86IHRydWUsCgkJbm9DbG9uZUV2ZW50OiB0cnVlLAoJCWlubGluZUJsb2NrTmVlZHNMYXlvdXQ6IGZhbHNlLAoJCXNocmlua1dyYXBCbG9ja3M6IGZhbHNlLAoJCXJlbGlhYmxlTWFyZ2luUmlnaHQ6IHRydWUKCX07CgoJLy8gTWFrZSBzdXJlIGNoZWNrZWQgc3RhdHVzIGlzIHByb3Blcmx5IGNsb25lZAoJaW5wdXQuY2hlY2tlZCA9IHRydWU7CglzdXBwb3J0Lm5vQ2xvbmVDaGVja2VkID0gaW5wdXQuY2xvbmVOb2RlKCB0cnVlICkuY2hlY2tlZDsKCgkvLyBNYWtlIHN1cmUgdGhhdCB0aGUgb3B0aW9ucyBpbnNpZGUgZGlzYWJsZWQgc2VsZWN0cyBhcmVuJ3QgbWFya2VkIGFzIGRpc2FibGVkCgkvLyAoV2ViS2l0IG1hcmtzIHRoZW0gYXMgZGlzYWJsZWQpCglzZWxlY3QuZGlzYWJsZWQgPSB0cnVlOwoJc3VwcG9ydC5vcHREaXNhYmxlZCA9ICFvcHQuZGlzYWJsZWQ7CgoJLy8gVGVzdCB0byBzZWUgaWYgaXQncyBwb3NzaWJsZSB0byBkZWxldGUgYW4gZXhwYW5kbyBmcm9tIGFuIGVsZW1lbnQKCS8vIEZhaWxzIGluIEludGVybmV0IEV4cGxvcmVyCgl0cnkgewoJCWRlbGV0ZSBkaXYudGVzdDsKCX0gY2F0Y2goIGUgKSB7CgkJc3VwcG9ydC5kZWxldGVFeHBhbmRvID0gZmFsc2U7Cgl9CgoJaWYgKCAhZGl2LmFkZEV2ZW50TGlzdGVuZXIgJiYgZGl2LmF0dGFjaEV2ZW50ICYmIGRpdi5maXJlRXZlbnQgKSB7CgkJZGl2LmF0dGFjaEV2ZW50KCAib25jbGljayIsIGZ1bmN0aW9uKCkgewoJCQkvLyBDbG9uaW5nIGEgbm9kZSBzaG91bGRuJ3QgY29weSBvdmVyIGFueQoJCQkvLyBib3VuZCBldmVudCBoYW5kbGVycyAoSUUgZG9lcyB0aGlzKQoJCQlzdXBwb3J0Lm5vQ2xvbmVFdmVudCA9IGZhbHNlOwoJCX0pOwoJCWRpdi5jbG9uZU5vZGUoIHRydWUgKS5maXJlRXZlbnQoICJvbmNsaWNrIiApOwoJfQoKCS8vIENoZWNrIGlmIGEgcmFkaW8gbWFpbnRhaW5zIGl0J3MgdmFsdWUKCS8vIGFmdGVyIGJlaW5nIGFwcGVuZGVkIHRvIHRoZSBET00KCWlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTsKCWlucHV0LnZhbHVlID0gInQiOwoJaW5wdXQuc2V0QXR0cmlidXRlKCJ0eXBlIiwgInJhZGlvIik7CglzdXBwb3J0LnJhZGlvVmFsdWUgPSBpbnB1dC52YWx1ZSA9PT0gInQiOwoKCWlucHV0LnNldEF0dHJpYnV0ZSgiY2hlY2tlZCIsICJjaGVja2VkIik7CglkaXYuYXBwZW5kQ2hpbGQoIGlucHV0ICk7CglmcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsKCWZyYWdtZW50LmFwcGVuZENoaWxkKCBkaXYuZmlyc3RDaGlsZCApOwoKCS8vIFdlYktpdCBkb2Vzbid0IGNsb25lIGNoZWNrZWQgc3RhdGUgY29ycmVjdGx5IGluIGZyYWdtZW50cwoJc3VwcG9ydC5jaGVja0Nsb25lID0gZnJhZ21lbnQuY2xvbmVOb2RlKCB0cnVlICkuY2xvbmVOb2RlKCB0cnVlICkubGFzdENoaWxkLmNoZWNrZWQ7CgoJZGl2LmlubmVySFRNTCA9ICIiOwoKCS8vIEZpZ3VyZSBvdXQgaWYgdGhlIFczQyBib3ggbW9kZWwgd29ya3MgYXMgZXhwZWN0ZWQKCWRpdi5zdHlsZS53aWR0aCA9IGRpdi5zdHlsZS5wYWRkaW5nTGVmdCA9ICIxcHgiOwoKCWJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSggImJvZHkiIClbIDAgXTsKCS8vIFdlIHVzZSBvdXIgb3duLCBpbnZpc2libGUsIGJvZHkgdW5sZXNzIHRoZSBib2R5IGlzIGFscmVhZHkgcHJlc2VudAoJLy8gaW4gd2hpY2ggY2FzZSB3ZSB1c2UgYSBkaXYgKCM5MjM5KQoJdGVzdEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBib2R5ID8gImRpdiIgOiAiYm9keSIgKTsKCXRlc3RFbGVtZW50U3R5bGUgPSB7CgkJdmlzaWJpbGl0eTogImhpZGRlbiIsCgkJd2lkdGg6IDAsCgkJaGVpZ2h0OiAwLAoJCWJvcmRlcjogMCwKCQltYXJnaW46IDAsCgkJYmFja2dyb3VuZDogIm5vbmUiCgl9OwoJaWYgKCBib2R5ICkgewoJCWpRdWVyeS5leHRlbmQoIHRlc3RFbGVtZW50U3R5bGUsIHsKCQkJcG9zaXRpb246ICJhYnNvbHV0ZSIsCgkJCWxlZnQ6ICItMTAwMHB4IiwKCQkJdG9wOiAiLTEwMDBweCIKCQl9KTsKCX0KCWZvciAoIGkgaW4gdGVzdEVsZW1lbnRTdHlsZSApIHsKCQl0ZXN0RWxlbWVudC5zdHlsZVsgaSBdID0gdGVzdEVsZW1lbnRTdHlsZVsgaSBdOwoJfQoJdGVzdEVsZW1lbnQuYXBwZW5kQ2hpbGQoIGRpdiApOwoJdGVzdEVsZW1lbnRQYXJlbnQgPSBib2R5IHx8IGRvY3VtZW50RWxlbWVudDsKCXRlc3RFbGVtZW50UGFyZW50Lmluc2VydEJlZm9yZSggdGVzdEVsZW1lbnQsIHRlc3RFbGVtZW50UGFyZW50LmZpcnN0Q2hpbGQgKTsKCgkvLyBDaGVjayBpZiBhIGRpc2Nvbm5lY3RlZCBjaGVja2JveCB3aWxsIHJldGFpbiBpdHMgY2hlY2tlZAoJLy8gdmFsdWUgb2YgdHJ1ZSBhZnRlciBhcHBlbmRlZCB0byB0aGUgRE9NIChJRTYvNykKCXN1cHBvcnQuYXBwZW5kQ2hlY2tlZCA9IGlucHV0LmNoZWNrZWQ7CgoJc3VwcG9ydC5ib3hNb2RlbCA9IGRpdi5vZmZzZXRXaWR0aCA9PT0gMjsKCglpZiAoICJ6b29tIiBpbiBkaXYuc3R5bGUgKSB7CgkJLy8gQ2hlY2sgaWYgbmF0aXZlbHkgYmxvY2stbGV2ZWwgZWxlbWVudHMgYWN0IGxpa2UgaW5saW5lLWJsb2NrCgkJLy8gZWxlbWVudHMgd2hlbiBzZXR0aW5nIHRoZWlyIGRpc3BsYXkgdG8gJ2lubGluZScgYW5kIGdpdmluZwoJCS8vIHRoZW0gbGF5b3V0CgkJLy8gKElFIDwgOCBkb2VzIHRoaXMpCgkJZGl2LnN0eWxlLmRpc3BsYXkgPSAiaW5saW5lIjsKCQlkaXYuc3R5bGUuem9vbSA9IDE7CgkJc3VwcG9ydC5pbmxpbmVCbG9ja05lZWRzTGF5b3V0ID0gKCBkaXYub2Zmc2V0V2lkdGggPT09IDIgKTsKCgkJLy8gQ2hlY2sgaWYgZWxlbWVudHMgd2l0aCBsYXlvdXQgc2hyaW5rLXdyYXAgdGhlaXIgY2hpbGRyZW4KCQkvLyAoSUUgNiBkb2VzIHRoaXMpCgkJZGl2LnN0eWxlLmRpc3BsYXkgPSAiIjsKCQlkaXYuaW5uZXJIVE1MID0gIjxkaXYgc3R5bGU9J3dpZHRoOjRweDsnPjwvZGl2PiI7CgkJc3VwcG9ydC5zaHJpbmtXcmFwQmxvY2tzID0gKCBkaXYub2Zmc2V0V2lkdGggIT09IDIgKTsKCX0KCglkaXYuaW5uZXJIVE1MID0gIjx0YWJsZT48dHI+PHRkIHN0eWxlPSdwYWRkaW5nOjA7Ym9yZGVyOjA7ZGlzcGxheTpub25lJz48L3RkPjx0ZD50PC90ZD48L3RyPjwvdGFibGU+IjsKCXRkcyA9IGRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSggInRkIiApOwoKCS8vIENoZWNrIGlmIHRhYmxlIGNlbGxzIHN0aWxsIGhhdmUgb2Zmc2V0V2lkdGgvSGVpZ2h0IHdoZW4gdGhleSBhcmUgc2V0CgkvLyB0byBkaXNwbGF5Om5vbmUgYW5kIHRoZXJlIGFyZSBzdGlsbCBvdGhlciB2aXNpYmxlIHRhYmxlIGNlbGxzIGluIGEKCS8vIHRhYmxlIHJvdzsgaWYgc28sIG9mZnNldFdpZHRoL0hlaWdodCBhcmUgbm90IHJlbGlhYmxlIGZvciB1c2Ugd2hlbgoJLy8gZGV0ZXJtaW5pbmcgaWYgYW4gZWxlbWVudCBoYXMgYmVlbiBoaWRkZW4gZGlyZWN0bHkgdXNpbmcKCS8vIGRpc3BsYXk6bm9uZSAoaXQgaXMgc3RpbGwgc2FmZSB0byB1c2Ugb2Zmc2V0cyBpZiBhIHBhcmVudCBlbGVtZW50IGlzCgkvLyBoaWRkZW47IGRvbiBzYWZldHkgZ29nZ2xlcyBhbmQgc2VlIGJ1ZyAjNDUxMiBmb3IgbW9yZSBpbmZvcm1hdGlvbikuCgkvLyAob25seSBJRSA4IGZhaWxzIHRoaXMgdGVzdCkKCWlzU3VwcG9ydGVkID0gKCB0ZHNbIDAgXS5vZmZzZXRIZWlnaHQgPT09IDAgKTsKCgl0ZHNbIDAgXS5zdHlsZS5kaXNwbGF5ID0gIiI7Cgl0ZHNbIDEgXS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwoKCS8vIENoZWNrIGlmIGVtcHR5IHRhYmxlIGNlbGxzIHN0aWxsIGhhdmUgb2Zmc2V0V2lkdGgvSGVpZ2h0CgkvLyAoSUUgPCA4IGZhaWwgdGhpcyB0ZXN0KQoJc3VwcG9ydC5yZWxpYWJsZUhpZGRlbk9mZnNldHMgPSBpc1N1cHBvcnRlZCAmJiAoIHRkc1sgMCBdLm9mZnNldEhlaWdodCA9PT0gMCApOwoJZGl2LmlubmVySFRNTCA9ICIiOwoKCS8vIENoZWNrIGlmIGRpdiB3aXRoIGV4cGxpY2l0IHdpZHRoIGFuZCBubyBtYXJnaW4tcmlnaHQgaW5jb3JyZWN0bHkKCS8vIGdldHMgY29tcHV0ZWQgbWFyZ2luLXJpZ2h0IGJhc2VkIG9uIHdpZHRoIG9mIGNvbnRhaW5lci4gRm9yIG1vcmUKCS8vIGluZm8gc2VlIGJ1ZyAjMzMzMwoJLy8gRmFpbHMgaW4gV2ViS2l0IGJlZm9yZSBGZWIgMjAxMSBuaWdodGxpZXMKCS8vIFdlYktpdCBCdWcgMTMzNDMgLSBnZXRDb21wdXRlZFN0eWxlIHJldHVybnMgd3JvbmcgdmFsdWUgZm9yIG1hcmdpbi1yaWdodAoJaWYgKCBkb2N1bWVudC5kZWZhdWx0VmlldyAmJiBkb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlICkgewoJCW1hcmdpbkRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJkaXYiICk7CgkJbWFyZ2luRGl2LnN0eWxlLndpZHRoID0gIjAiOwoJCW1hcmdpbkRpdi5zdHlsZS5tYXJnaW5SaWdodCA9ICIwIjsKCQlkaXYuYXBwZW5kQ2hpbGQoIG1hcmdpbkRpdiApOwoJCXN1cHBvcnQucmVsaWFibGVNYXJnaW5SaWdodCA9CgkJCSggcGFyc2VJbnQoICggZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSggbWFyZ2luRGl2LCBudWxsICkgfHwgeyBtYXJnaW5SaWdodDogMCB9ICkubWFyZ2luUmlnaHQsIDEwICkgfHwgMCApID09PSAwOwoJfQoKCS8vIFJlbW92ZSB0aGUgYm9keSBlbGVtZW50IHdlIGFkZGVkCgl0ZXN0RWxlbWVudC5pbm5lckhUTUwgPSAiIjsKCXRlc3RFbGVtZW50UGFyZW50LnJlbW92ZUNoaWxkKCB0ZXN0RWxlbWVudCApOwoKCS8vIFRlY2huaXF1ZSBmcm9tIEp1cml5IFpheXRzZXYKCS8vIGh0dHA6Ly90aGlua3dlYjIuY29tL3Byb2plY3RzL3Byb3RvdHlwZS9kZXRlY3RpbmctZXZlbnQtc3VwcG9ydC13aXRob3V0LWJyb3dzZXItc25pZmZpbmcvCgkvLyBXZSBvbmx5IGNhcmUgYWJvdXQgdGhlIGNhc2Ugd2hlcmUgbm9uLXN0YW5kYXJkIGV2ZW50IHN5c3RlbXMKCS8vIGFyZSB1c2VkLCBuYW1lbHkgaW4gSUUuIFNob3J0LWNpcmN1aXRpbmcgaGVyZSBoZWxwcyB1cyB0bwoJLy8gYXZvaWQgYW4gZXZhbCBjYWxsIChpbiBzZXRBdHRyaWJ1dGUpIHdoaWNoIGNhbiBjYXVzZSBDU1AKCS8vIHRvIGdvIGhheXdpcmUuIFNlZTogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vU2VjdXJpdHkvQ1NQCglpZiAoIGRpdi5hdHRhY2hFdmVudCApIHsKCQlmb3IoIGkgaW4gewoJCQlzdWJtaXQ6IDEsCgkJCWNoYW5nZTogMSwKCQkJZm9jdXNpbjogMQoJCX0gKSB7CgkJCWV2ZW50TmFtZSA9ICJvbiIgKyBpOwoJCQlpc1N1cHBvcnRlZCA9ICggZXZlbnROYW1lIGluIGRpdiApOwoJCQlpZiAoICFpc1N1cHBvcnRlZCApIHsKCQkJCWRpdi5zZXRBdHRyaWJ1dGUoIGV2ZW50TmFtZSwgInJldHVybjsiICk7CgkJCQlpc1N1cHBvcnRlZCA9ICggdHlwZW9mIGRpdlsgZXZlbnROYW1lIF0gPT09ICJmdW5jdGlvbiIgKTsKCQkJfQoJCQlzdXBwb3J0WyBpICsgIkJ1YmJsZXMiIF0gPSBpc1N1cHBvcnRlZDsKCQl9Cgl9CgoJLy8gTnVsbCBjb25uZWN0ZWQgZWxlbWVudHMgdG8gYXZvaWQgbGVha3MgaW4gSUUKCXRlc3RFbGVtZW50ID0gZnJhZ21lbnQgPSBzZWxlY3QgPSBvcHQgPSBib2R5ID0gbWFyZ2luRGl2ID0gZGl2ID0gaW5wdXQgPSBudWxsOwoKCXJldHVybiBzdXBwb3J0Owp9KSgpOwoKLy8gS2VlcCB0cmFjayBvZiBib3hNb2RlbApqUXVlcnkuYm94TW9kZWwgPSBqUXVlcnkuc3VwcG9ydC5ib3hNb2RlbDsKCgoKCnZhciByYnJhY2UgPSAvXig/Olx7LipcfXxcWy4qXF0pJC8sCglybXVsdGlEYXNoID0gLyhbYS16XSkoW0EtWl0pL2c7CgpqUXVlcnkuZXh0ZW5kKHsKCWNhY2hlOiB7fSwKCgkvLyBQbGVhc2UgdXNlIHdpdGggY2F1dGlvbgoJdXVpZDogMCwKCgkvLyBVbmlxdWUgZm9yIGVhY2ggY29weSBvZiBqUXVlcnkgb24gdGhlIHBhZ2UKCS8vIE5vbi1kaWdpdHMgcmVtb3ZlZCB0byBtYXRjaCByaW5saW5lalF1ZXJ5CglleHBhbmRvOiAialF1ZXJ5IiArICggalF1ZXJ5LmZuLmpxdWVyeSArIE1hdGgucmFuZG9tKCkgKS5yZXBsYWNlKCAvXEQvZywgIiIgKSwKCgkvLyBUaGUgZm9sbG93aW5nIGVsZW1lbnRzIHRocm93IHVuY2F0Y2hhYmxlIGV4Y2VwdGlvbnMgaWYgeW91CgkvLyBhdHRlbXB0IHRvIGFkZCBleHBhbmRvIHByb3BlcnRpZXMgdG8gdGhlbS4KCW5vRGF0YTogewoJCSJlbWJlZCI6IHRydWUsCgkJLy8gQmFuIGFsbCBvYmplY3RzIGV4Y2VwdCBmb3IgRmxhc2ggKHdoaWNoIGhhbmRsZSBleHBhbmRvcykKCQkib2JqZWN0IjogImNsc2lkOkQyN0NEQjZFLUFFNkQtMTFjZi05NkI4LTQ0NDU1MzU0MDAwMCIsCgkJImFwcGxldCI6IHRydWUKCX0sCgoJaGFzRGF0YTogZnVuY3Rpb24oIGVsZW0gKSB7CgkJZWxlbSA9IGVsZW0ubm9kZVR5cGUgPyBqUXVlcnkuY2FjaGVbIGVsZW1balF1ZXJ5LmV4cGFuZG9dIF0gOiBlbGVtWyBqUXVlcnkuZXhwYW5kbyBdOwoKCQlyZXR1cm4gISFlbGVtICYmICFpc0VtcHR5RGF0YU9iamVjdCggZWxlbSApOwoJfSwKCglkYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgZGF0YSwgcHZ0IC8qIEludGVybmFsIFVzZSBPbmx5ICovICkgewoJCWlmICggIWpRdWVyeS5hY2NlcHREYXRhKCBlbGVtICkgKSB7CgkJCXJldHVybjsKCQl9CgoJCXZhciB0aGlzQ2FjaGUsIHJldCwKCQkJaW50ZXJuYWxLZXkgPSBqUXVlcnkuZXhwYW5kbywKCQkJZ2V0QnlOYW1lID0gdHlwZW9mIG5hbWUgPT09ICJzdHJpbmciLAoKCQkJLy8gV2UgaGF2ZSB0byBoYW5kbGUgRE9NIG5vZGVzIGFuZCBKUyBvYmplY3RzIGRpZmZlcmVudGx5IGJlY2F1c2UgSUU2LTcKCQkJLy8gY2FuJ3QgR0Mgb2JqZWN0IHJlZmVyZW5jZXMgcHJvcGVybHkgYWNyb3NzIHRoZSBET00tSlMgYm91bmRhcnkKCQkJaXNOb2RlID0gZWxlbS5ub2RlVHlwZSwKCgkJCS8vIE9ubHkgRE9NIG5vZGVzIG5lZWQgdGhlIGdsb2JhbCBqUXVlcnkgY2FjaGU7IEpTIG9iamVjdCBkYXRhIGlzCgkJCS8vIGF0dGFjaGVkIGRpcmVjdGx5IHRvIHRoZSBvYmplY3Qgc28gR0MgY2FuIG9jY3VyIGF1dG9tYXRpY2FsbHkKCQkJY2FjaGUgPSBpc05vZGUgPyBqUXVlcnkuY2FjaGUgOiBlbGVtLAoKCQkJLy8gT25seSBkZWZpbmluZyBhbiBJRCBmb3IgSlMgb2JqZWN0cyBpZiBpdHMgY2FjaGUgYWxyZWFkeSBleGlzdHMgYWxsb3dzCgkJCS8vIHRoZSBjb2RlIHRvIHNob3J0Y3V0IG9uIHRoZSBzYW1lIHBhdGggYXMgYSBET00gbm9kZSB3aXRoIG5vIGNhY2hlCgkJCWlkID0gaXNOb2RlID8gZWxlbVsgalF1ZXJ5LmV4cGFuZG8gXSA6IGVsZW1bIGpRdWVyeS5leHBhbmRvIF0gJiYgalF1ZXJ5LmV4cGFuZG87CgoJCS8vIEF2b2lkIGRvaW5nIGFueSBtb3JlIHdvcmsgdGhhbiB3ZSBuZWVkIHRvIHdoZW4gdHJ5aW5nIHRvIGdldCBkYXRhIG9uIGFuCgkJLy8gb2JqZWN0IHRoYXQgaGFzIG5vIGRhdGEgYXQgYWxsCgkJaWYgKCAoIWlkIHx8IChwdnQgJiYgaWQgJiYgKGNhY2hlWyBpZCBdICYmICFjYWNoZVsgaWQgXVsgaW50ZXJuYWxLZXkgXSkpKSAmJiBnZXRCeU5hbWUgJiYgZGF0YSA9PT0gdW5kZWZpbmVkICkgewoJCQlyZXR1cm47CgkJfQoKCQlpZiAoICFpZCApIHsKCQkJLy8gT25seSBET00gbm9kZXMgbmVlZCBhIG5ldyB1bmlxdWUgSUQgZm9yIGVhY2ggZWxlbWVudCBzaW5jZSB0aGVpciBkYXRhCgkJCS8vIGVuZHMgdXAgaW4gdGhlIGdsb2JhbCBjYWNoZQoJCQlpZiAoIGlzTm9kZSApIHsKCQkJCWVsZW1bIGpRdWVyeS5leHBhbmRvIF0gPSBpZCA9ICsralF1ZXJ5LnV1aWQ7CgkJCX0gZWxzZSB7CgkJCQlpZCA9IGpRdWVyeS5leHBhbmRvOwoJCQl9CgkJfQoKCQlpZiAoICFjYWNoZVsgaWQgXSApIHsKCQkJY2FjaGVbIGlkIF0gPSB7fTsKCgkJCS8vIFRPRE86IFRoaXMgaXMgYSBoYWNrIGZvciAxLjUgT05MWS4gQXZvaWRzIGV4cG9zaW5nIGpRdWVyeQoJCQkvLyBtZXRhZGF0YSBvbiBwbGFpbiBKUyBvYmplY3RzIHdoZW4gdGhlIG9iamVjdCBpcyBzZXJpYWxpemVkIHVzaW5nCgkJCS8vIEpTT04uc3RyaW5naWZ5CgkJCWlmICggIWlzTm9kZSApIHsKCQkJCWNhY2hlWyBpZCBdLnRvSlNPTiA9IGpRdWVyeS5ub29wOwoJCQl9CgkJfQoKCQkvLyBBbiBvYmplY3QgY2FuIGJlIHBhc3NlZCB0byBqUXVlcnkuZGF0YSBpbnN0ZWFkIG9mIGEga2V5L3ZhbHVlIHBhaXI7IHRoaXMgZ2V0cwoJCS8vIHNoYWxsb3cgY29waWVkIG92ZXIgb250byB0aGUgZXhpc3RpbmcgY2FjaGUKCQlpZiAoIHR5cGVvZiBuYW1lID09PSAib2JqZWN0IiB8fCB0eXBlb2YgbmFtZSA9PT0gImZ1bmN0aW9uIiApIHsKCQkJaWYgKCBwdnQgKSB7CgkJCQljYWNoZVsgaWQgXVsgaW50ZXJuYWxLZXkgXSA9IGpRdWVyeS5leHRlbmQoY2FjaGVbIGlkIF1bIGludGVybmFsS2V5IF0sIG5hbWUpOwoJCQl9IGVsc2UgewoJCQkJY2FjaGVbIGlkIF0gPSBqUXVlcnkuZXh0ZW5kKGNhY2hlWyBpZCBdLCBuYW1lKTsKCQkJfQoJCX0KCgkJdGhpc0NhY2hlID0gY2FjaGVbIGlkIF07CgoJCS8vIEludGVybmFsIGpRdWVyeSBkYXRhIGlzIHN0b3JlZCBpbiBhIHNlcGFyYXRlIG9iamVjdCBpbnNpZGUgdGhlIG9iamVjdCdzIGRhdGEKCQkvLyBjYWNoZSBpbiBvcmRlciB0byBhdm9pZCBrZXkgY29sbGlzaW9ucyBiZXR3ZWVuIGludGVybmFsIGRhdGEgYW5kIHVzZXItZGVmaW5lZAoJCS8vIGRhdGEKCQlpZiAoIHB2dCApIHsKCQkJaWYgKCAhdGhpc0NhY2hlWyBpbnRlcm5hbEtleSBdICkgewoJCQkJdGhpc0NhY2hlWyBpbnRlcm5hbEtleSBdID0ge307CgkJCX0KCgkJCXRoaXNDYWNoZSA9IHRoaXNDYWNoZVsgaW50ZXJuYWxLZXkgXTsKCQl9CgoJCWlmICggZGF0YSAhPT0gdW5kZWZpbmVkICkgewoJCQl0aGlzQ2FjaGVbIGpRdWVyeS5jYW1lbENhc2UoIG5hbWUgKSBdID0gZGF0YTsKCQl9CgoJCS8vIFRPRE86IFRoaXMgaXMgYSBoYWNrIGZvciAxLjUgT05MWS4gSXQgd2lsbCBiZSByZW1vdmVkIGluIDEuNi4gVXNlcnMgc2hvdWxkCgkJLy8gbm90IGF0dGVtcHQgdG8gaW5zcGVjdCB0aGUgaW50ZXJuYWwgZXZlbnRzIG9iamVjdCB1c2luZyBqUXVlcnkuZGF0YSwgYXMgdGhpcwoJCS8vIGludGVybmFsIGRhdGEgb2JqZWN0IGlzIHVuZG9jdW1lbnRlZCBhbmQgc3ViamVjdCB0byBjaGFuZ2UuCgkJaWYgKCBuYW1lID09PSAiZXZlbnRzIiAmJiAhdGhpc0NhY2hlW25hbWVdICkgewoJCQlyZXR1cm4gdGhpc0NhY2hlWyBpbnRlcm5hbEtleSBdICYmIHRoaXNDYWNoZVsgaW50ZXJuYWxLZXkgXS5ldmVudHM7CgkJfQoKCQkvLyBDaGVjayBmb3IgYm90aCBjb252ZXJ0ZWQtdG8tY2FtZWwgYW5kIG5vbi1jb252ZXJ0ZWQgZGF0YSBwcm9wZXJ0eSBuYW1lcwoJCS8vIElmIGEgZGF0YSBwcm9wZXJ0eSB3YXMgc3BlY2lmaWVkCgkJaWYgKCBnZXRCeU5hbWUgKSB7CgoJCQkvLyBGaXJzdCBUcnkgdG8gZmluZCBhcy1pcyBwcm9wZXJ0eSBkYXRhCgkJCXJldCA9IHRoaXNDYWNoZVsgbmFtZSBdOwoKCQkJLy8gVGVzdCBmb3IgbnVsbHx1bmRlZmluZWQgcHJvcGVydHkgZGF0YQoJCQlpZiAoIHJldCA9PSBudWxsICkgewoKCQkJCS8vIFRyeSB0byBmaW5kIHRoZSBjYW1lbENhc2VkIHByb3BlcnR5CgkJCQlyZXQgPSB0aGlzQ2FjaGVbIGpRdWVyeS5jYW1lbENhc2UoIG5hbWUgKSBdOwoJCQl9CgkJfSBlbHNlIHsKCQkJcmV0ID0gdGhpc0NhY2hlOwoJCX0KCgkJcmV0dXJuIHJldDsKCX0sCgoJcmVtb3ZlRGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHB2dCAvKiBJbnRlcm5hbCBVc2UgT25seSAqLyApIHsKCQlpZiAoICFqUXVlcnkuYWNjZXB0RGF0YSggZWxlbSApICkgewoJCQlyZXR1cm47CgkJfQoKCQl2YXIgdGhpc0NhY2hlLAoKCQkJLy8gUmVmZXJlbmNlIHRvIGludGVybmFsIGRhdGEgY2FjaGUga2V5CgkJCWludGVybmFsS2V5ID0galF1ZXJ5LmV4cGFuZG8sCgoJCQlpc05vZGUgPSBlbGVtLm5vZGVUeXBlLAoKCQkJLy8gU2VlIGpRdWVyeS5kYXRhIGZvciBtb3JlIGluZm9ybWF0aW9uCgkJCWNhY2hlID0gaXNOb2RlID8galF1ZXJ5LmNhY2hlIDogZWxlbSwKCgkJCS8vIFNlZSBqUXVlcnkuZGF0YSBmb3IgbW9yZSBpbmZvcm1hdGlvbgoJCQlpZCA9IGlzTm9kZSA/IGVsZW1bIGpRdWVyeS5leHBhbmRvIF0gOiBqUXVlcnkuZXhwYW5kbzsKCgkJLy8gSWYgdGhlcmUgaXMgYWxyZWFkeSBubyBjYWNoZSBlbnRyeSBmb3IgdGhpcyBvYmplY3QsIHRoZXJlIGlzIG5vCgkJLy8gcHVycG9zZSBpbiBjb250aW51aW5nCgkJaWYgKCAhY2FjaGVbIGlkIF0gKSB7CgkJCXJldHVybjsKCQl9CgoJCWlmICggbmFtZSApIHsKCgkJCXRoaXNDYWNoZSA9IHB2dCA/IGNhY2hlWyBpZCBdWyBpbnRlcm5hbEtleSBdIDogY2FjaGVbIGlkIF07CgoJCQlpZiAoIHRoaXNDYWNoZSApIHsKCgkJCQkvLyBTdXBwb3J0IGludGVyb3BlcmFibGUgcmVtb3ZhbCBvZiBoeXBoZW5hdGVkIG9yIGNhbWVsY2FzZWQga2V5cwoJCQkJaWYgKCAhdGhpc0NhY2hlWyBuYW1lIF0gKSB7CgkJCQkJbmFtZSA9IGpRdWVyeS5jYW1lbENhc2UoIG5hbWUgKTsKCQkJCX0KCgkJCQlkZWxldGUgdGhpc0NhY2hlWyBuYW1lIF07CgoJCQkJLy8gSWYgdGhlcmUgaXMgbm8gZGF0YSBsZWZ0IGluIHRoZSBjYWNoZSwgd2Ugd2FudCB0byBjb250aW51ZQoJCQkJLy8gYW5kIGxldCB0aGUgY2FjaGUgb2JqZWN0IGl0c2VsZiBnZXQgZGVzdHJveWVkCgkJCQlpZiAoICFpc0VtcHR5RGF0YU9iamVjdCh0aGlzQ2FjaGUpICkgewoJCQkJCXJldHVybjsKCQkJCX0KCQkJfQoJCX0KCgkJLy8gU2VlIGpRdWVyeS5kYXRhIGZvciBtb3JlIGluZm9ybWF0aW9uCgkJaWYgKCBwdnQgKSB7CgkJCWRlbGV0ZSBjYWNoZVsgaWQgXVsgaW50ZXJuYWxLZXkgXTsKCgkJCS8vIERvbid0IGRlc3Ryb3kgdGhlIHBhcmVudCBjYWNoZSB1bmxlc3MgdGhlIGludGVybmFsIGRhdGEgb2JqZWN0CgkJCS8vIGhhZCBiZWVuIHRoZSBvbmx5IHRoaW5nIGxlZnQgaW4gaXQKCQkJaWYgKCAhaXNFbXB0eURhdGFPYmplY3QoY2FjaGVbIGlkIF0pICkgewoJCQkJcmV0dXJuOwoJCQl9CgkJfQoKCQl2YXIgaW50ZXJuYWxDYWNoZSA9IGNhY2hlWyBpZCBdWyBpbnRlcm5hbEtleSBdOwoKCQkvLyBCcm93c2VycyB0aGF0IGZhaWwgZXhwYW5kbyBkZWxldGlvbiBhbHNvIHJlZnVzZSB0byBkZWxldGUgZXhwYW5kb3Mgb24KCQkvLyB0aGUgd2luZG93LCBidXQgaXQgd2lsbCBhbGxvdyBpdCBvbiBhbGwgb3RoZXIgSlMgb2JqZWN0czsgb3RoZXIgYnJvd3NlcnMKCQkvLyBkb24ndCBjYXJlCgkJLy8gRW5zdXJlIHRoYXQgYGNhY2hlYCBpcyBub3QgYSB3aW5kb3cgb2JqZWN0ICMxMDA4MAoJCWlmICggalF1ZXJ5LnN1cHBvcnQuZGVsZXRlRXhwYW5kbyB8fCAhY2FjaGUuc2V0SW50ZXJ2YWwgKSB7CgkJCWRlbGV0ZSBjYWNoZVsgaWQgXTsKCQl9IGVsc2UgewoJCQljYWNoZVsgaWQgXSA9IG51bGw7CgkJfQoKCQkvLyBXZSBkZXN0cm95ZWQgdGhlIGVudGlyZSB1c2VyIGNhY2hlIGF0IG9uY2UgYmVjYXVzZSBpdCdzIGZhc3RlciB0aGFuCgkJLy8gaXRlcmF0aW5nIHRocm91Z2ggZWFjaCBrZXksIGJ1dCB3ZSBuZWVkIHRvIGNvbnRpbnVlIHRvIHBlcnNpc3QgaW50ZXJuYWwKCQkvLyBkYXRhIGlmIGl0IGV4aXN0ZWQKCQlpZiAoIGludGVybmFsQ2FjaGUgKSB7CgkJCWNhY2hlWyBpZCBdID0ge307CgkJCS8vIFRPRE86IFRoaXMgaXMgYSBoYWNrIGZvciAxLjUgT05MWS4gQXZvaWRzIGV4cG9zaW5nIGpRdWVyeQoJCQkvLyBtZXRhZGF0YSBvbiBwbGFpbiBKUyBvYmplY3RzIHdoZW4gdGhlIG9iamVjdCBpcyBzZXJpYWxpemVkIHVzaW5nCgkJCS8vIEpTT04uc3RyaW5naWZ5CgkJCWlmICggIWlzTm9kZSApIHsKCQkJCWNhY2hlWyBpZCBdLnRvSlNPTiA9IGpRdWVyeS5ub29wOwoJCQl9CgoJCQljYWNoZVsgaWQgXVsgaW50ZXJuYWxLZXkgXSA9IGludGVybmFsQ2FjaGU7CgoJCS8vIE90aGVyd2lzZSwgd2UgbmVlZCB0byBlbGltaW5hdGUgdGhlIGV4cGFuZG8gb24gdGhlIG5vZGUgdG8gYXZvaWQKCQkvLyBmYWxzZSBsb29rdXBzIGluIHRoZSBjYWNoZSBmb3IgZW50cmllcyB0aGF0IG5vIGxvbmdlciBleGlzdAoJCX0gZWxzZSBpZiAoIGlzTm9kZSApIHsKCQkJLy8gSUUgZG9lcyBub3QgYWxsb3cgdXMgdG8gZGVsZXRlIGV4cGFuZG8gcHJvcGVydGllcyBmcm9tIG5vZGVzLAoJCQkvLyBub3IgZG9lcyBpdCBoYXZlIGEgcmVtb3ZlQXR0cmlidXRlIGZ1bmN0aW9uIG9uIERvY3VtZW50IG5vZGVzOwoJCQkvLyB3ZSBtdXN0IGhhbmRsZSBhbGwgb2YgdGhlc2UgY2FzZXMKCQkJaWYgKCBqUXVlcnkuc3VwcG9ydC5kZWxldGVFeHBhbmRvICkgewoJCQkJZGVsZXRlIGVsZW1bIGpRdWVyeS5leHBhbmRvIF07CgkJCX0gZWxzZSBpZiAoIGVsZW0ucmVtb3ZlQXR0cmlidXRlICkgewoJCQkJZWxlbS5yZW1vdmVBdHRyaWJ1dGUoIGpRdWVyeS5leHBhbmRvICk7CgkJCX0gZWxzZSB7CgkJCQllbGVtWyBqUXVlcnkuZXhwYW5kbyBdID0gbnVsbDsKCQkJfQoJCX0KCX0sCgoJLy8gRm9yIGludGVybmFsIHVzZSBvbmx5LgoJX2RhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBkYXRhICkgewoJCXJldHVybiBqUXVlcnkuZGF0YSggZWxlbSwgbmFtZSwgZGF0YSwgdHJ1ZSApOwoJfSwKCgkvLyBBIG1ldGhvZCBmb3IgZGV0ZXJtaW5pbmcgaWYgYSBET00gbm9kZSBjYW4gaGFuZGxlIHRoZSBkYXRhIGV4cGFuZG8KCWFjY2VwdERhdGE6IGZ1bmN0aW9uKCBlbGVtICkgewoJCWlmICggZWxlbS5ub2RlTmFtZSApIHsKCQkJdmFyIG1hdGNoID0galF1ZXJ5Lm5vRGF0YVsgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIF07CgoJCQlpZiAoIG1hdGNoICkgewoJCQkJcmV0dXJuICEobWF0Y2ggPT09IHRydWUgfHwgZWxlbS5nZXRBdHRyaWJ1dGUoImNsYXNzaWQiKSAhPT0gbWF0Y2gpOwoJCQl9CgkJfQoKCQlyZXR1cm4gdHJ1ZTsKCX0KfSk7CgpqUXVlcnkuZm4uZXh0ZW5kKHsKCWRhdGE6IGZ1bmN0aW9uKCBrZXksIHZhbHVlICkgewoJCXZhciBkYXRhID0gbnVsbDsKCgkJaWYgKCB0eXBlb2Yga2V5ID09PSAidW5kZWZpbmVkIiApIHsKCQkJaWYgKCB0aGlzLmxlbmd0aCApIHsKCQkJCWRhdGEgPSBqUXVlcnkuZGF0YSggdGhpc1swXSApOwoKCQkJCWlmICggdGhpc1swXS5ub2RlVHlwZSA9PT0gMSApIHsKCQkJICAgIHZhciBhdHRyID0gdGhpc1swXS5hdHRyaWJ1dGVzLCBuYW1lOwoJCQkJCWZvciAoIHZhciBpID0gMCwgbCA9IGF0dHIubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCQkJCQluYW1lID0gYXR0cltpXS5uYW1lOwoKCQkJCQkJaWYgKCBuYW1lLmluZGV4T2YoICJkYXRhLSIgKSA9PT0gMCApIHsKCQkJCQkJCW5hbWUgPSBqUXVlcnkuY2FtZWxDYXNlKCBuYW1lLnN1YnN0cmluZyg1KSApOwoKCQkJCQkJCWRhdGFBdHRyKCB0aGlzWzBdLCBuYW1lLCBkYXRhWyBuYW1lIF0gKTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJcmV0dXJuIGRhdGE7CgoJCX0gZWxzZSBpZiAoIHR5cGVvZiBrZXkgPT09ICJvYmplY3QiICkgewoJCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJalF1ZXJ5LmRhdGEoIHRoaXMsIGtleSApOwoJCQl9KTsKCQl9CgoJCXZhciBwYXJ0cyA9IGtleS5zcGxpdCgiLiIpOwoJCXBhcnRzWzFdID0gcGFydHNbMV0gPyAiLiIgKyBwYXJ0c1sxXSA6ICIiOwoKCQlpZiAoIHZhbHVlID09PSB1bmRlZmluZWQgKSB7CgkJCWRhdGEgPSB0aGlzLnRyaWdnZXJIYW5kbGVyKCJnZXREYXRhIiArIHBhcnRzWzFdICsgIiEiLCBbcGFydHNbMF1dKTsKCgkJCS8vIFRyeSB0byBmZXRjaCBhbnkgaW50ZXJuYWxseSBzdG9yZWQgZGF0YSBmaXJzdAoJCQlpZiAoIGRhdGEgPT09IHVuZGVmaW5lZCAmJiB0aGlzLmxlbmd0aCApIHsKCQkJCWRhdGEgPSBqUXVlcnkuZGF0YSggdGhpc1swXSwga2V5ICk7CgkJCQlkYXRhID0gZGF0YUF0dHIoIHRoaXNbMF0sIGtleSwgZGF0YSApOwoJCQl9CgoJCQlyZXR1cm4gZGF0YSA9PT0gdW5kZWZpbmVkICYmIHBhcnRzWzFdID8KCQkJCXRoaXMuZGF0YSggcGFydHNbMF0gKSA6CgkJCQlkYXRhOwoKCQl9IGVsc2UgewoJCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJdmFyICR0aGlzID0galF1ZXJ5KCB0aGlzICksCgkJCQkJYXJncyA9IFsgcGFydHNbMF0sIHZhbHVlIF07CgoJCQkJJHRoaXMudHJpZ2dlckhhbmRsZXIoICJzZXREYXRhIiArIHBhcnRzWzFdICsgIiEiLCBhcmdzICk7CgkJCQlqUXVlcnkuZGF0YSggdGhpcywga2V5LCB2YWx1ZSApOwoJCQkJJHRoaXMudHJpZ2dlckhhbmRsZXIoICJjaGFuZ2VEYXRhIiArIHBhcnRzWzFdICsgIiEiLCBhcmdzICk7CgkJCX0pOwoJCX0KCX0sCgoJcmVtb3ZlRGF0YTogZnVuY3Rpb24oIGtleSApIHsKCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQlqUXVlcnkucmVtb3ZlRGF0YSggdGhpcywga2V5ICk7CgkJfSk7Cgl9Cn0pOwoKZnVuY3Rpb24gZGF0YUF0dHIoIGVsZW0sIGtleSwgZGF0YSApIHsKCS8vIElmIG5vdGhpbmcgd2FzIGZvdW5kIGludGVybmFsbHksIHRyeSB0byBmZXRjaCBhbnkKCS8vIGRhdGEgZnJvbSB0aGUgSFRNTDUgZGF0YS0qIGF0dHJpYnV0ZQoJaWYgKCBkYXRhID09PSB1bmRlZmluZWQgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHsKCQl2YXIgbmFtZSA9ICJkYXRhLSIgKyBrZXkucmVwbGFjZSggcm11bHRpRGFzaCwgIiQxLSQyIiApLnRvTG93ZXJDYXNlKCk7CgoJCWRhdGEgPSBlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApOwoKCQlpZiAoIHR5cGVvZiBkYXRhID09PSAic3RyaW5nIiApIHsKCQkJdHJ5IHsKCQkJCWRhdGEgPSBkYXRhID09PSAidHJ1ZSIgPyB0cnVlIDoKCQkJCWRhdGEgPT09ICJmYWxzZSIgPyBmYWxzZSA6CgkJCQlkYXRhID09PSAibnVsbCIgPyBudWxsIDoKCQkJCSFqUXVlcnkuaXNOYU4oIGRhdGEgKSA/IHBhcnNlRmxvYXQoIGRhdGEgKSA6CgkJCQkJcmJyYWNlLnRlc3QoIGRhdGEgKSA/IGpRdWVyeS5wYXJzZUpTT04oIGRhdGEgKSA6CgkJCQkJZGF0YTsKCQkJfSBjYXRjaCggZSApIHt9CgoJCQkvLyBNYWtlIHN1cmUgd2Ugc2V0IHRoZSBkYXRhIHNvIGl0IGlzbid0IGNoYW5nZWQgbGF0ZXIKCQkJalF1ZXJ5LmRhdGEoIGVsZW0sIGtleSwgZGF0YSApOwoKCQl9IGVsc2UgewoJCQlkYXRhID0gdW5kZWZpbmVkOwoJCX0KCX0KCglyZXR1cm4gZGF0YTsKfQoKLy8gVE9ETzogVGhpcyBpcyBhIGhhY2sgZm9yIDEuNSBPTkxZIHRvIGFsbG93IG9iamVjdHMgd2l0aCBhIHNpbmdsZSB0b0pTT04KLy8gcHJvcGVydHkgdG8gYmUgY29uc2lkZXJlZCBlbXB0eSBvYmplY3RzOyB0aGlzIHByb3BlcnR5IGFsd2F5cyBleGlzdHMgaW4KLy8gb3JkZXIgdG8gbWFrZSBzdXJlIEpTT04uc3RyaW5naWZ5IGRvZXMgbm90IGV4cG9zZSBpbnRlcm5hbCBtZXRhZGF0YQpmdW5jdGlvbiBpc0VtcHR5RGF0YU9iamVjdCggb2JqICkgewoJZm9yICggdmFyIG5hbWUgaW4gb2JqICkgewoJCWlmICggbmFtZSAhPT0gInRvSlNPTiIgKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9Cgl9CgoJcmV0dXJuIHRydWU7Cn0KCgoKCmZ1bmN0aW9uIGhhbmRsZVF1ZXVlTWFya0RlZmVyKCBlbGVtLCB0eXBlLCBzcmMgKSB7Cgl2YXIgZGVmZXJEYXRhS2V5ID0gdHlwZSArICJkZWZlciIsCgkJcXVldWVEYXRhS2V5ID0gdHlwZSArICJxdWV1ZSIsCgkJbWFya0RhdGFLZXkgPSB0eXBlICsgIm1hcmsiLAoJCWRlZmVyID0galF1ZXJ5LmRhdGEoIGVsZW0sIGRlZmVyRGF0YUtleSwgdW5kZWZpbmVkLCB0cnVlICk7CglpZiAoIGRlZmVyICYmCgkJKCBzcmMgPT09ICJxdWV1ZSIgfHwgIWpRdWVyeS5kYXRhKCBlbGVtLCBxdWV1ZURhdGFLZXksIHVuZGVmaW5lZCwgdHJ1ZSApICkgJiYKCQkoIHNyYyA9PT0gIm1hcmsiIHx8ICFqUXVlcnkuZGF0YSggZWxlbSwgbWFya0RhdGFLZXksIHVuZGVmaW5lZCwgdHJ1ZSApICkgKSB7CgkJLy8gR2l2ZSByb29tIGZvciBoYXJkLWNvZGVkIGNhbGxiYWNrcyB0byBmaXJlIGZpcnN0CgkJLy8gYW5kIGV2ZW50dWFsbHkgbWFyay9xdWV1ZSBzb21ldGhpbmcgZWxzZSBvbiB0aGUgZWxlbWVudAoJCXNldFRpbWVvdXQoIGZ1bmN0aW9uKCkgewoJCQlpZiAoICFqUXVlcnkuZGF0YSggZWxlbSwgcXVldWVEYXRhS2V5LCB1bmRlZmluZWQsIHRydWUgKSAmJgoJCQkJIWpRdWVyeS5kYXRhKCBlbGVtLCBtYXJrRGF0YUtleSwgdW5kZWZpbmVkLCB0cnVlICkgKSB7CgkJCQlqUXVlcnkucmVtb3ZlRGF0YSggZWxlbSwgZGVmZXJEYXRhS2V5LCB0cnVlICk7CgkJCQlkZWZlci5yZXNvbHZlKCk7CgkJCX0KCQl9LCAwICk7Cgl9Cn0KCmpRdWVyeS5leHRlbmQoewoKCV9tYXJrOiBmdW5jdGlvbiggZWxlbSwgdHlwZSApIHsKCQlpZiAoIGVsZW0gKSB7CgkJCXR5cGUgPSAodHlwZSB8fCAiZngiKSArICJtYXJrIjsKCQkJalF1ZXJ5LmRhdGEoIGVsZW0sIHR5cGUsIChqUXVlcnkuZGF0YShlbGVtLHR5cGUsdW5kZWZpbmVkLHRydWUpIHx8IDApICsgMSwgdHJ1ZSApOwoJCX0KCX0sCgoJX3VubWFyazogZnVuY3Rpb24oIGZvcmNlLCBlbGVtLCB0eXBlICkgewoJCWlmICggZm9yY2UgIT09IHRydWUgKSB7CgkJCXR5cGUgPSBlbGVtOwoJCQllbGVtID0gZm9yY2U7CgkJCWZvcmNlID0gZmFsc2U7CgkJfQoJCWlmICggZWxlbSApIHsKCQkJdHlwZSA9IHR5cGUgfHwgImZ4IjsKCQkJdmFyIGtleSA9IHR5cGUgKyAibWFyayIsCgkJCQljb3VudCA9IGZvcmNlID8gMCA6ICggKGpRdWVyeS5kYXRhKCBlbGVtLCBrZXksIHVuZGVmaW5lZCwgdHJ1ZSkgfHwgMSApIC0gMSApOwoJCQlpZiAoIGNvdW50ICkgewoJCQkJalF1ZXJ5LmRhdGEoIGVsZW0sIGtleSwgY291bnQsIHRydWUgKTsKCQkJfSBlbHNlIHsKCQkJCWpRdWVyeS5yZW1vdmVEYXRhKCBlbGVtLCBrZXksIHRydWUgKTsKCQkJCWhhbmRsZVF1ZXVlTWFya0RlZmVyKCBlbGVtLCB0eXBlLCAibWFyayIgKTsKCQkJfQoJCX0KCX0sCgoJcXVldWU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCBkYXRhICkgewoJCWlmICggZWxlbSApIHsKCQkJdHlwZSA9ICh0eXBlIHx8ICJmeCIpICsgInF1ZXVlIjsKCQkJdmFyIHEgPSBqUXVlcnkuZGF0YSggZWxlbSwgdHlwZSwgdW5kZWZpbmVkLCB0cnVlICk7CgkJCS8vIFNwZWVkIHVwIGRlcXVldWUgYnkgZ2V0dGluZyBvdXQgcXVpY2tseSBpZiB0aGlzIGlzIGp1c3QgYSBsb29rdXAKCQkJaWYgKCBkYXRhICkgewoJCQkJaWYgKCAhcSB8fCBqUXVlcnkuaXNBcnJheShkYXRhKSApIHsKCQkJCQlxID0galF1ZXJ5LmRhdGEoIGVsZW0sIHR5cGUsIGpRdWVyeS5tYWtlQXJyYXkoZGF0YSksIHRydWUgKTsKCQkJCX0gZWxzZSB7CgkJCQkJcS5wdXNoKCBkYXRhICk7CgkJCQl9CgkJCX0KCQkJcmV0dXJuIHEgfHwgW107CgkJfQoJfSwKCglkZXF1ZXVlOiBmdW5jdGlvbiggZWxlbSwgdHlwZSApIHsKCQl0eXBlID0gdHlwZSB8fCAiZngiOwoKCQl2YXIgcXVldWUgPSBqUXVlcnkucXVldWUoIGVsZW0sIHR5cGUgKSwKCQkJZm4gPSBxdWV1ZS5zaGlmdCgpLAoJCQlkZWZlcjsKCgkJLy8gSWYgdGhlIGZ4IHF1ZXVlIGlzIGRlcXVldWVkLCBhbHdheXMgcmVtb3ZlIHRoZSBwcm9ncmVzcyBzZW50aW5lbAoJCWlmICggZm4gPT09ICJpbnByb2dyZXNzIiApIHsKCQkJZm4gPSBxdWV1ZS5zaGlmdCgpOwoJCX0KCgkJaWYgKCBmbiApIHsKCQkJLy8gQWRkIGEgcHJvZ3Jlc3Mgc2VudGluZWwgdG8gcHJldmVudCB0aGUgZnggcXVldWUgZnJvbSBiZWluZwoJCQkvLyBhdXRvbWF0aWNhbGx5IGRlcXVldWVkCgkJCWlmICggdHlwZSA9PT0gImZ4IiApIHsKCQkJCXF1ZXVlLnVuc2hpZnQoImlucHJvZ3Jlc3MiKTsKCQkJfQoKCQkJZm4uY2FsbChlbGVtLCBmdW5jdGlvbigpIHsKCQkJCWpRdWVyeS5kZXF1ZXVlKGVsZW0sIHR5cGUpOwoJCQl9KTsKCQl9CgoJCWlmICggIXF1ZXVlLmxlbmd0aCApIHsKCQkJalF1ZXJ5LnJlbW92ZURhdGEoIGVsZW0sIHR5cGUgKyAicXVldWUiLCB0cnVlICk7CgkJCWhhbmRsZVF1ZXVlTWFya0RlZmVyKCBlbGVtLCB0eXBlLCAicXVldWUiICk7CgkJfQoJfQp9KTsKCmpRdWVyeS5mbi5leHRlbmQoewoJcXVldWU6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkgewoJCWlmICggdHlwZW9mIHR5cGUgIT09ICJzdHJpbmciICkgewoJCQlkYXRhID0gdHlwZTsKCQkJdHlwZSA9ICJmeCI7CgkJfQoKCQlpZiAoIGRhdGEgPT09IHVuZGVmaW5lZCApIHsKCQkJcmV0dXJuIGpRdWVyeS5xdWV1ZSggdGhpc1swXSwgdHlwZSApOwoJCX0KCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQl2YXIgcXVldWUgPSBqUXVlcnkucXVldWUoIHRoaXMsIHR5cGUsIGRhdGEgKTsKCgkJCWlmICggdHlwZSA9PT0gImZ4IiAmJiBxdWV1ZVswXSAhPT0gImlucHJvZ3Jlc3MiICkgewoJCQkJalF1ZXJ5LmRlcXVldWUoIHRoaXMsIHR5cGUgKTsKCQkJfQoJCX0pOwoJfSwKCWRlcXVldWU6IGZ1bmN0aW9uKCB0eXBlICkgewoJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CgkJCWpRdWVyeS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7CgkJfSk7Cgl9LAoJLy8gQmFzZWQgb2ZmIG9mIHRoZSBwbHVnaW4gYnkgQ2xpbnQgSGVsZmVycywgd2l0aCBwZXJtaXNzaW9uLgoJLy8gaHR0cDovL2JsaW5kc2lnbmFscy5jb20vaW5kZXgucGhwLzIwMDkvMDcvanF1ZXJ5LWRlbGF5LwoJZGVsYXk6IGZ1bmN0aW9uKCB0aW1lLCB0eXBlICkgewoJCXRpbWUgPSBqUXVlcnkuZnggPyBqUXVlcnkuZnguc3BlZWRzW3RpbWVdIHx8IHRpbWUgOiB0aW1lOwoJCXR5cGUgPSB0eXBlIHx8ICJmeCI7CgoJCXJldHVybiB0aGlzLnF1ZXVlKCB0eXBlLCBmdW5jdGlvbigpIHsKCQkJdmFyIGVsZW0gPSB0aGlzOwoJCQlzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewoJCQkJalF1ZXJ5LmRlcXVldWUoIGVsZW0sIHR5cGUgKTsKCQkJfSwgdGltZSApOwoJCX0pOwoJfSwKCWNsZWFyUXVldWU6IGZ1bmN0aW9uKCB0eXBlICkgewoJCXJldHVybiB0aGlzLnF1ZXVlKCB0eXBlIHx8ICJmeCIsIFtdICk7Cgl9LAoJLy8gR2V0IGEgcHJvbWlzZSByZXNvbHZlZCB3aGVuIHF1ZXVlcyBvZiBhIGNlcnRhaW4gdHlwZQoJLy8gYXJlIGVtcHRpZWQgKGZ4IGlzIHRoZSB0eXBlIGJ5IGRlZmF1bHQpCglwcm9taXNlOiBmdW5jdGlvbiggdHlwZSwgb2JqZWN0ICkgewoJCWlmICggdHlwZW9mIHR5cGUgIT09ICJzdHJpbmciICkgewoJCQlvYmplY3QgPSB0eXBlOwoJCQl0eXBlID0gdW5kZWZpbmVkOwoJCX0KCQl0eXBlID0gdHlwZSB8fCAiZngiOwoJCXZhciBkZWZlciA9IGpRdWVyeS5EZWZlcnJlZCgpLAoJCQllbGVtZW50cyA9IHRoaXMsCgkJCWkgPSBlbGVtZW50cy5sZW5ndGgsCgkJCWNvdW50ID0gMSwKCQkJZGVmZXJEYXRhS2V5ID0gdHlwZSArICJkZWZlciIsCgkJCXF1ZXVlRGF0YUtleSA9IHR5cGUgKyAicXVldWUiLAoJCQltYXJrRGF0YUtleSA9IHR5cGUgKyAibWFyayIsCgkJCXRtcDsKCQlmdW5jdGlvbiByZXNvbHZlKCkgewoJCQlpZiAoICEoIC0tY291bnQgKSApIHsKCQkJCWRlZmVyLnJlc29sdmVXaXRoKCBlbGVtZW50cywgWyBlbGVtZW50cyBdICk7CgkJCX0KCQl9CgkJd2hpbGUoIGktLSApIHsKCQkJaWYgKCggdG1wID0galF1ZXJ5LmRhdGEoIGVsZW1lbnRzWyBpIF0sIGRlZmVyRGF0YUtleSwgdW5kZWZpbmVkLCB0cnVlICkgfHwKCQkJCQkoIGpRdWVyeS5kYXRhKCBlbGVtZW50c1sgaSBdLCBxdWV1ZURhdGFLZXksIHVuZGVmaW5lZCwgdHJ1ZSApIHx8CgkJCQkJCWpRdWVyeS5kYXRhKCBlbGVtZW50c1sgaSBdLCBtYXJrRGF0YUtleSwgdW5kZWZpbmVkLCB0cnVlICkgKSAmJgoJCQkJCWpRdWVyeS5kYXRhKCBlbGVtZW50c1sgaSBdLCBkZWZlckRhdGFLZXksIGpRdWVyeS5fRGVmZXJyZWQoKSwgdHJ1ZSApICkpIHsKCQkJCWNvdW50Kys7CgkJCQl0bXAuZG9uZSggcmVzb2x2ZSApOwoJCQl9CgkJfQoJCXJlc29sdmUoKTsKCQlyZXR1cm4gZGVmZXIucHJvbWlzZSgpOwoJfQp9KTsKCgoKCnZhciByY2xhc3MgPSAvW1xuXHRccl0vZywKCXJzcGFjZSA9IC9ccysvLAoJcnJldHVybiA9IC9cci9nLAoJcnR5cGUgPSAvXig/OmJ1dHRvbnxpbnB1dCkkL2ksCglyZm9jdXNhYmxlID0gL14oPzpidXR0b258aW5wdXR8b2JqZWN0fHNlbGVjdHx0ZXh0YXJlYSkkL2ksCglyY2xpY2thYmxlID0gL15hKD86cmVhKT8kL2ksCglyYm9vbGVhbiA9IC9eKD86YXV0b2ZvY3VzfGF1dG9wbGF5fGFzeW5jfGNoZWNrZWR8Y29udHJvbHN8ZGVmZXJ8ZGlzYWJsZWR8aGlkZGVufGxvb3B8bXVsdGlwbGV8b3BlbnxyZWFkb25seXxyZXF1aXJlZHxzY29wZWR8c2VsZWN0ZWQpJC9pLAoJbm9kZUhvb2ssIGJvb2xIb29rOwoKalF1ZXJ5LmZuLmV4dGVuZCh7CglhdHRyOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7CgkJcmV0dXJuIGpRdWVyeS5hY2Nlc3MoIHRoaXMsIG5hbWUsIHZhbHVlLCB0cnVlLCBqUXVlcnkuYXR0ciApOwoJfSwKCglyZW1vdmVBdHRyOiBmdW5jdGlvbiggbmFtZSApIHsKCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQlqUXVlcnkucmVtb3ZlQXR0ciggdGhpcywgbmFtZSApOwoJCX0pOwoJfSwKCQoJcHJvcDogZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkgewoJCXJldHVybiBqUXVlcnkuYWNjZXNzKCB0aGlzLCBuYW1lLCB2YWx1ZSwgdHJ1ZSwgalF1ZXJ5LnByb3AgKTsKCX0sCgkKCXJlbW92ZVByb3A6IGZ1bmN0aW9uKCBuYW1lICkgewoJCW5hbWUgPSBqUXVlcnkucHJvcEZpeFsgbmFtZSBdIHx8IG5hbWU7CgkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKCQkJLy8gdHJ5L2NhdGNoIGhhbmRsZXMgY2FzZXMgd2hlcmUgSUUgYmFsa3MgKHN1Y2ggYXMgcmVtb3ZpbmcgYSBwcm9wZXJ0eSBvbiB3aW5kb3cpCgkJCXRyeSB7CgkJCQl0aGlzWyBuYW1lIF0gPSB1bmRlZmluZWQ7CgkJCQlkZWxldGUgdGhpc1sgbmFtZSBdOwoJCQl9IGNhdGNoKCBlICkge30KCQl9KTsKCX0sCgoJYWRkQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQl2YXIgY2xhc3NOYW1lcywgaSwgbCwgZWxlbSwKCQkJc2V0Q2xhc3MsIGMsIGNsOwoKCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApICkgewoJCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCBqICkgewoJCQkJalF1ZXJ5KCB0aGlzICkuYWRkQ2xhc3MoIHZhbHVlLmNhbGwodGhpcywgaiwgdGhpcy5jbGFzc05hbWUpICk7CgkJCX0pOwoJCX0KCgkJaWYgKCB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICJzdHJpbmciICkgewoJCQljbGFzc05hbWVzID0gdmFsdWUuc3BsaXQoIHJzcGFjZSApOwoKCQkJZm9yICggaSA9IDAsIGwgPSB0aGlzLmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKCQkJCWVsZW0gPSB0aGlzWyBpIF07CgoJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkgewoJCQkJCWlmICggIWVsZW0uY2xhc3NOYW1lICYmIGNsYXNzTmFtZXMubGVuZ3RoID09PSAxICkgewoJCQkJCQllbGVtLmNsYXNzTmFtZSA9IHZhbHVlOwoKCQkJCQl9IGVsc2UgewoJCQkJCQlzZXRDbGFzcyA9ICIgIiArIGVsZW0uY2xhc3NOYW1lICsgIiAiOwoKCQkJCQkJZm9yICggYyA9IDAsIGNsID0gY2xhc3NOYW1lcy5sZW5ndGg7IGMgPCBjbDsgYysrICkgewoJCQkJCQkJaWYgKCAhfnNldENsYXNzLmluZGV4T2YoICIgIiArIGNsYXNzTmFtZXNbIGMgXSArICIgIiApICkgewoJCQkJCQkJCXNldENsYXNzICs9IGNsYXNzTmFtZXNbIGMgXSArICIgIjsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQllbGVtLmNsYXNzTmFtZSA9IGpRdWVyeS50cmltKCBzZXRDbGFzcyApOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCgkJcmV0dXJuIHRoaXM7Cgl9LAoKCXJlbW92ZUNsYXNzOiBmdW5jdGlvbiggdmFsdWUgKSB7CgkJdmFyIGNsYXNzTmFtZXMsIGksIGwsIGVsZW0sIGNsYXNzTmFtZSwgYywgY2w7CgoJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgKSB7CgkJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oIGogKSB7CgkJCQlqUXVlcnkoIHRoaXMgKS5yZW1vdmVDbGFzcyggdmFsdWUuY2FsbCh0aGlzLCBqLCB0aGlzLmNsYXNzTmFtZSkgKTsKCQkJfSk7CgkJfQoKCQlpZiAoICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICJzdHJpbmciKSB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkICkgewoJCQljbGFzc05hbWVzID0gKHZhbHVlIHx8ICIiKS5zcGxpdCggcnNwYWNlICk7CgoJCQlmb3IgKCBpID0gMCwgbCA9IHRoaXMubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCQkJZWxlbSA9IHRoaXNbIGkgXTsKCgkJCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgZWxlbS5jbGFzc05hbWUgKSB7CgkJCQkJaWYgKCB2YWx1ZSApIHsKCQkJCQkJY2xhc3NOYW1lID0gKCIgIiArIGVsZW0uY2xhc3NOYW1lICsgIiAiKS5yZXBsYWNlKCByY2xhc3MsICIgIiApOwoJCQkJCQlmb3IgKCBjID0gMCwgY2wgPSBjbGFzc05hbWVzLmxlbmd0aDsgYyA8IGNsOyBjKysgKSB7CgkJCQkJCQljbGFzc05hbWUgPSBjbGFzc05hbWUucmVwbGFjZSgiICIgKyBjbGFzc05hbWVzWyBjIF0gKyAiICIsICIgIik7CgkJCQkJCX0KCQkJCQkJZWxlbS5jbGFzc05hbWUgPSBqUXVlcnkudHJpbSggY2xhc3NOYW1lICk7CgoJCQkJCX0gZWxzZSB7CgkJCQkJCWVsZW0uY2xhc3NOYW1lID0gIiI7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCgoJdG9nZ2xlQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSwgc3RhdGVWYWwgKSB7CgkJdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWUsCgkJCWlzQm9vbCA9IHR5cGVvZiBzdGF0ZVZhbCA9PT0gImJvb2xlYW4iOwoKCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApICkgewoJCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCBpICkgewoJCQkJalF1ZXJ5KCB0aGlzICkudG9nZ2xlQ2xhc3MoIHZhbHVlLmNhbGwodGhpcywgaSwgdGhpcy5jbGFzc05hbWUsIHN0YXRlVmFsKSwgc3RhdGVWYWwgKTsKCQkJfSk7CgkJfQoKCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQlpZiAoIHR5cGUgPT09ICJzdHJpbmciICkgewoJCQkJLy8gdG9nZ2xlIGluZGl2aWR1YWwgY2xhc3MgbmFtZXMKCQkJCXZhciBjbGFzc05hbWUsCgkJCQkJaSA9IDAsCgkJCQkJc2VsZiA9IGpRdWVyeSggdGhpcyApLAoJCQkJCXN0YXRlID0gc3RhdGVWYWwsCgkJCQkJY2xhc3NOYW1lcyA9IHZhbHVlLnNwbGl0KCByc3BhY2UgKTsKCgkJCQl3aGlsZSAoIChjbGFzc05hbWUgPSBjbGFzc05hbWVzWyBpKysgXSkgKSB7CgkJCQkJLy8gY2hlY2sgZWFjaCBjbGFzc05hbWUgZ2l2ZW4sIHNwYWNlIHNlcGVyYXRlZCBsaXN0CgkJCQkJc3RhdGUgPSBpc0Jvb2wgPyBzdGF0ZSA6ICFzZWxmLmhhc0NsYXNzKCBjbGFzc05hbWUgKTsKCQkJCQlzZWxmWyBzdGF0ZSA/ICJhZGRDbGFzcyIgOiAicmVtb3ZlQ2xhc3MiIF0oIGNsYXNzTmFtZSApOwoJCQkJfQoKCQkJfSBlbHNlIGlmICggdHlwZSA9PT0gInVuZGVmaW5lZCIgfHwgdHlwZSA9PT0gImJvb2xlYW4iICkgewoJCQkJaWYgKCB0aGlzLmNsYXNzTmFtZSApIHsKCQkJCQkvLyBzdG9yZSBjbGFzc05hbWUgaWYgc2V0CgkJCQkJalF1ZXJ5Ll9kYXRhKCB0aGlzLCAiX19jbGFzc05hbWVfXyIsIHRoaXMuY2xhc3NOYW1lICk7CgkJCQl9CgoJCQkJLy8gdG9nZ2xlIHdob2xlIGNsYXNzTmFtZQoJCQkJdGhpcy5jbGFzc05hbWUgPSB0aGlzLmNsYXNzTmFtZSB8fCB2YWx1ZSA9PT0gZmFsc2UgPyAiIiA6IGpRdWVyeS5fZGF0YSggdGhpcywgIl9fY2xhc3NOYW1lX18iICkgfHwgIiI7CgkJCX0KCQl9KTsKCX0sCgoJaGFzQ2xhc3M6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKCQl2YXIgY2xhc3NOYW1lID0gIiAiICsgc2VsZWN0b3IgKyAiICI7CgkJZm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CgkJCWlmICggdGhpc1tpXS5ub2RlVHlwZSA9PT0gMSAmJiAoIiAiICsgdGhpc1tpXS5jbGFzc05hbWUgKyAiICIpLnJlcGxhY2UocmNsYXNzLCAiICIpLmluZGV4T2YoIGNsYXNzTmFtZSApID4gLTEgKSB7CgkJCQlyZXR1cm4gdHJ1ZTsKCQkJfQoJCX0KCgkJcmV0dXJuIGZhbHNlOwoJfSwKCgl2YWw6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQl2YXIgaG9va3MsIHJldCwKCQkJZWxlbSA9IHRoaXNbMF07CgkJCgkJaWYgKCAhYXJndW1lbnRzLmxlbmd0aCApIHsKCQkJaWYgKCBlbGVtICkgewoJCQkJaG9va3MgPSBqUXVlcnkudmFsSG9va3NbIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSBdIHx8IGpRdWVyeS52YWxIb29rc1sgZWxlbS50eXBlIF07CgoJCQkJaWYgKCBob29rcyAmJiAiZ2V0IiBpbiBob29rcyAmJiAocmV0ID0gaG9va3MuZ2V0KCBlbGVtLCAidmFsdWUiICkpICE9PSB1bmRlZmluZWQgKSB7CgkJCQkJcmV0dXJuIHJldDsKCQkJCX0KCgkJCQlyZXQgPSBlbGVtLnZhbHVlOwoKCQkJCXJldHVybiB0eXBlb2YgcmV0ID09PSAic3RyaW5nIiA/IAoJCQkJCS8vIGhhbmRsZSBtb3N0IGNvbW1vbiBzdHJpbmcgY2FzZXMKCQkJCQlyZXQucmVwbGFjZShycmV0dXJuLCAiIikgOiAKCQkJCQkvLyBoYW5kbGUgY2FzZXMgd2hlcmUgdmFsdWUgaXMgbnVsbC91bmRlZiBvciBudW1iZXIKCQkJCQlyZXQgPT0gbnVsbCA/ICIiIDogcmV0OwoJCQl9CgoJCQlyZXR1cm4gdW5kZWZpbmVkOwoJCX0KCgkJdmFyIGlzRnVuY3Rpb24gPSBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKTsKCgkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiggaSApIHsKCQkJdmFyIHNlbGYgPSBqUXVlcnkodGhpcyksIHZhbDsKCgkJCWlmICggdGhpcy5ub2RlVHlwZSAhPT0gMSApIHsKCQkJCXJldHVybjsKCQkJfQoKCQkJaWYgKCBpc0Z1bmN0aW9uICkgewoJCQkJdmFsID0gdmFsdWUuY2FsbCggdGhpcywgaSwgc2VsZi52YWwoKSApOwoJCQl9IGVsc2UgewoJCQkJdmFsID0gdmFsdWU7CgkJCX0KCgkJCS8vIFRyZWF0IG51bGwvdW5kZWZpbmVkIGFzICIiOyBjb252ZXJ0IG51bWJlcnMgdG8gc3RyaW5nCgkJCWlmICggdmFsID09IG51bGwgKSB7CgkJCQl2YWwgPSAiIjsKCQkJfSBlbHNlIGlmICggdHlwZW9mIHZhbCA9PT0gIm51bWJlciIgKSB7CgkJCQl2YWwgKz0gIiI7CgkJCX0gZWxzZSBpZiAoIGpRdWVyeS5pc0FycmF5KCB2YWwgKSApIHsKCQkJCXZhbCA9IGpRdWVyeS5tYXAodmFsLCBmdW5jdGlvbiAoIHZhbHVlICkgewoJCQkJCXJldHVybiB2YWx1ZSA9PSBudWxsID8gIiIgOiB2YWx1ZSArICIiOwoJCQkJfSk7CgkJCX0KCgkJCWhvb2tzID0galF1ZXJ5LnZhbEhvb2tzWyB0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgXSB8fCBqUXVlcnkudmFsSG9va3NbIHRoaXMudHlwZSBdOwoKCQkJLy8gSWYgc2V0IHJldHVybnMgdW5kZWZpbmVkLCBmYWxsIGJhY2sgdG8gbm9ybWFsIHNldHRpbmcKCQkJaWYgKCAhaG9va3MgfHwgISgic2V0IiBpbiBob29rcykgfHwgaG9va3Muc2V0KCB0aGlzLCB2YWwsICJ2YWx1ZSIgKSA9PT0gdW5kZWZpbmVkICkgewoJCQkJdGhpcy52YWx1ZSA9IHZhbDsKCQkJfQoJCX0pOwoJfQp9KTsKCmpRdWVyeS5leHRlbmQoewoJdmFsSG9va3M6IHsKCQlvcHRpb246IHsKCQkJZ2V0OiBmdW5jdGlvbiggZWxlbSApIHsKCQkJCS8vIGF0dHJpYnV0ZXMudmFsdWUgaXMgdW5kZWZpbmVkIGluIEJsYWNrYmVycnkgNC43IGJ1dAoJCQkJLy8gdXNlcyAudmFsdWUuIFNlZSAjNjkzMgoJCQkJdmFyIHZhbCA9IGVsZW0uYXR0cmlidXRlcy52YWx1ZTsKCQkJCXJldHVybiAhdmFsIHx8IHZhbC5zcGVjaWZpZWQgPyBlbGVtLnZhbHVlIDogZWxlbS50ZXh0OwoJCQl9CgkJfSwKCQlzZWxlY3Q6IHsKCQkJZ2V0OiBmdW5jdGlvbiggZWxlbSApIHsKCQkJCXZhciB2YWx1ZSwKCQkJCQlpbmRleCA9IGVsZW0uc2VsZWN0ZWRJbmRleCwKCQkJCQl2YWx1ZXMgPSBbXSwKCQkJCQlvcHRpb25zID0gZWxlbS5vcHRpb25zLAoJCQkJCW9uZSA9IGVsZW0udHlwZSA9PT0gInNlbGVjdC1vbmUiOwoKCQkJCS8vIE5vdGhpbmcgd2FzIHNlbGVjdGVkCgkJCQlpZiAoIGluZGV4IDwgMCApIHsKCQkJCQlyZXR1cm4gbnVsbDsKCQkJCX0KCgkJCQkvLyBMb29wIHRocm91Z2ggYWxsIHRoZSBzZWxlY3RlZCBvcHRpb25zCgkJCQlmb3IgKCB2YXIgaSA9IG9uZSA/IGluZGV4IDogMCwgbWF4ID0gb25lID8gaW5kZXggKyAxIDogb3B0aW9ucy5sZW5ndGg7IGkgPCBtYXg7IGkrKyApIHsKCQkJCQl2YXIgb3B0aW9uID0gb3B0aW9uc1sgaSBdOwoKCQkJCQkvLyBEb24ndCByZXR1cm4gb3B0aW9ucyB0aGF0IGFyZSBkaXNhYmxlZCBvciBpbiBhIGRpc2FibGVkIG9wdGdyb3VwCgkJCQkJaWYgKCBvcHRpb24uc2VsZWN0ZWQgJiYgKGpRdWVyeS5zdXBwb3J0Lm9wdERpc2FibGVkID8gIW9wdGlvbi5kaXNhYmxlZCA6IG9wdGlvbi5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIikgPT09IG51bGwpICYmCgkJCQkJCQkoIW9wdGlvbi5wYXJlbnROb2RlLmRpc2FibGVkIHx8ICFqUXVlcnkubm9kZU5hbWUoIG9wdGlvbi5wYXJlbnROb2RlLCAib3B0Z3JvdXAiICkpICkgewoKCQkJCQkJLy8gR2V0IHRoZSBzcGVjaWZpYyB2YWx1ZSBmb3IgdGhlIG9wdGlvbgoJCQkJCQl2YWx1ZSA9IGpRdWVyeSggb3B0aW9uICkudmFsKCk7CgoJCQkJCQkvLyBXZSBkb24ndCBuZWVkIGFuIGFycmF5IGZvciBvbmUgc2VsZWN0cwoJCQkJCQlpZiAoIG9uZSApIHsKCQkJCQkJCXJldHVybiB2YWx1ZTsKCQkJCQkJfQoKCQkJCQkJLy8gTXVsdGktU2VsZWN0cyByZXR1cm4gYW4gYXJyYXkKCQkJCQkJdmFsdWVzLnB1c2goIHZhbHVlICk7CgkJCQkJfQoJCQkJfQoKCQkJCS8vIEZpeGVzIEJ1ZyAjMjU1MSAtLSBzZWxlY3QudmFsKCkgYnJva2VuIGluIElFIGFmdGVyIGZvcm0ucmVzZXQoKQoJCQkJaWYgKCBvbmUgJiYgIXZhbHVlcy5sZW5ndGggJiYgb3B0aW9ucy5sZW5ndGggKSB7CgkJCQkJcmV0dXJuIGpRdWVyeSggb3B0aW9uc1sgaW5kZXggXSApLnZhbCgpOwoJCQkJfQoKCQkJCXJldHVybiB2YWx1ZXM7CgkJCX0sCgoJCQlzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHsKCQkJCXZhciB2YWx1ZXMgPSBqUXVlcnkubWFrZUFycmF5KCB2YWx1ZSApOwoKCQkJCWpRdWVyeShlbGVtKS5maW5kKCJvcHRpb24iKS5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJCXRoaXMuc2VsZWN0ZWQgPSBqUXVlcnkuaW5BcnJheSggalF1ZXJ5KHRoaXMpLnZhbCgpLCB2YWx1ZXMgKSA+PSAwOwoJCQkJfSk7CgoJCQkJaWYgKCAhdmFsdWVzLmxlbmd0aCApIHsKCQkJCQllbGVtLnNlbGVjdGVkSW5kZXggPSAtMTsKCQkJCX0KCQkJCXJldHVybiB2YWx1ZXM7CgkJCX0KCQl9Cgl9LAoKCWF0dHJGbjogewoJCXZhbDogdHJ1ZSwKCQljc3M6IHRydWUsCgkJaHRtbDogdHJ1ZSwKCQl0ZXh0OiB0cnVlLAoJCWRhdGE6IHRydWUsCgkJd2lkdGg6IHRydWUsCgkJaGVpZ2h0OiB0cnVlLAoJCW9mZnNldDogdHJ1ZQoJfSwKCQoJYXR0ckZpeDogewoJCS8vIEFsd2F5cyBub3JtYWxpemUgdG8gZW5zdXJlIGhvb2sgdXNhZ2UKCQl0YWJpbmRleDogInRhYkluZGV4IgoJfSwKCQoJYXR0cjogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlLCBwYXNzICkgewoJCXZhciBuVHlwZSA9IGVsZW0ubm9kZVR5cGU7CgkJCgkJLy8gZG9uJ3QgZ2V0L3NldCBhdHRyaWJ1dGVzIG9uIHRleHQsIGNvbW1lbnQgYW5kIGF0dHJpYnV0ZSBub2RlcwoJCWlmICggIWVsZW0gfHwgblR5cGUgPT09IDMgfHwgblR5cGUgPT09IDggfHwgblR5cGUgPT09IDIgKSB7CgkJCXJldHVybiB1bmRlZmluZWQ7CgkJfQoKCQlpZiAoIHBhc3MgJiYgbmFtZSBpbiBqUXVlcnkuYXR0ckZuICkgewoJCQlyZXR1cm4galF1ZXJ5KCBlbGVtIClbIG5hbWUgXSggdmFsdWUgKTsKCQl9CgoJCS8vIEZhbGxiYWNrIHRvIHByb3Agd2hlbiBhdHRyaWJ1dGVzIGFyZSBub3Qgc3VwcG9ydGVkCgkJaWYgKCAhKCJnZXRBdHRyaWJ1dGUiIGluIGVsZW0pICkgewoJCQlyZXR1cm4galF1ZXJ5LnByb3AoIGVsZW0sIG5hbWUsIHZhbHVlICk7CgkJfQoKCQl2YXIgcmV0LCBob29rcywKCQkJbm90eG1sID0gblR5cGUgIT09IDEgfHwgIWpRdWVyeS5pc1hNTERvYyggZWxlbSApOwoKCQkvLyBOb3JtYWxpemUgdGhlIG5hbWUgaWYgbmVlZGVkCgkJaWYgKCBub3R4bWwgKSB7CgkJCW5hbWUgPSBqUXVlcnkuYXR0ckZpeFsgbmFtZSBdIHx8IG5hbWU7CgoJCQlob29rcyA9IGpRdWVyeS5hdHRySG9va3NbIG5hbWUgXTsKCgkJCWlmICggIWhvb2tzICkgewoJCQkJLy8gVXNlIGJvb2xIb29rIGZvciBib29sZWFuIGF0dHJpYnV0ZXMKCQkJCWlmICggcmJvb2xlYW4udGVzdCggbmFtZSApICkgewoJCQkJCWhvb2tzID0gYm9vbEhvb2s7CgoJCQkJLy8gVXNlIG5vZGVIb29rIGlmIGF2YWlsYWJsZSggSUU2LzcgKQoJCQkJfSBlbHNlIGlmICggbm9kZUhvb2sgKSB7CgkJCQkJaG9va3MgPSBub2RlSG9vazsKCQkJCX0KCQkJfQoJCX0KCgkJaWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkgewoKCQkJaWYgKCB2YWx1ZSA9PT0gbnVsbCApIHsKCQkJCWpRdWVyeS5yZW1vdmVBdHRyKCBlbGVtLCBuYW1lICk7CgkJCQlyZXR1cm4gdW5kZWZpbmVkOwoKCQkJfSBlbHNlIGlmICggaG9va3MgJiYgInNldCIgaW4gaG9va3MgJiYgbm90eG1sICYmIChyZXQgPSBob29rcy5zZXQoIGVsZW0sIHZhbHVlLCBuYW1lICkpICE9PSB1bmRlZmluZWQgKSB7CgkJCQlyZXR1cm4gcmV0OwoKCQkJfSBlbHNlIHsKCQkJCWVsZW0uc2V0QXR0cmlidXRlKCBuYW1lLCAiIiArIHZhbHVlICk7CgkJCQlyZXR1cm4gdmFsdWU7CgkJCX0KCgkJfSBlbHNlIGlmICggaG9va3MgJiYgImdldCIgaW4gaG9va3MgJiYgbm90eG1sICYmIChyZXQgPSBob29rcy5nZXQoIGVsZW0sIG5hbWUgKSkgIT09IG51bGwgKSB7CgkJCXJldHVybiByZXQ7CgoJCX0gZWxzZSB7CgoJCQlyZXQgPSBlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApOwoKCQkJLy8gTm9uLWV4aXN0ZW50IGF0dHJpYnV0ZXMgcmV0dXJuIG51bGwsIHdlIG5vcm1hbGl6ZSB0byB1bmRlZmluZWQKCQkJcmV0dXJuIHJldCA9PT0gbnVsbCA/CgkJCQl1bmRlZmluZWQgOgoJCQkJcmV0OwoJCX0KCX0sCgoJcmVtb3ZlQXR0cjogZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7CgkJdmFyIHByb3BOYW1lOwoJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHsKCQkJbmFtZSA9IGpRdWVyeS5hdHRyRml4WyBuYW1lIF0gfHwgbmFtZTsKCgkJCWpRdWVyeS5hdHRyKCBlbGVtLCBuYW1lLCAiIiApOwoJCQllbGVtLnJlbW92ZUF0dHJpYnV0ZSggbmFtZSApOwoKCQkJLy8gU2V0IGNvcnJlc3BvbmRpbmcgcHJvcGVydHkgdG8gZmFsc2UgZm9yIGJvb2xlYW4gYXR0cmlidXRlcwoJCQlpZiAoIHJib29sZWFuLnRlc3QoIG5hbWUgKSAmJiAocHJvcE5hbWUgPSBqUXVlcnkucHJvcEZpeFsgbmFtZSBdIHx8IG5hbWUpIGluIGVsZW0gKSB7CgkJCQllbGVtWyBwcm9wTmFtZSBdID0gZmFsc2U7CgkJCX0KCQl9Cgl9LAoKCWF0dHJIb29rczogewoJCXR5cGU6IHsKCQkJc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7CgkJCQkvLyBXZSBjYW4ndCBhbGxvdyB0aGUgdHlwZSBwcm9wZXJ0eSB0byBiZSBjaGFuZ2VkIChzaW5jZSBpdCBjYXVzZXMgcHJvYmxlbXMgaW4gSUUpCgkJCQlpZiAoIHJ0eXBlLnRlc3QoIGVsZW0ubm9kZU5hbWUgKSAmJiBlbGVtLnBhcmVudE5vZGUgKSB7CgkJCQkJalF1ZXJ5LmVycm9yKCAidHlwZSBwcm9wZXJ0eSBjYW4ndCBiZSBjaGFuZ2VkIiApOwoJCQkJfSBlbHNlIGlmICggIWpRdWVyeS5zdXBwb3J0LnJhZGlvVmFsdWUgJiYgdmFsdWUgPT09ICJyYWRpbyIgJiYgalF1ZXJ5Lm5vZGVOYW1lKGVsZW0sICJpbnB1dCIpICkgewoJCQkJCS8vIFNldHRpbmcgdGhlIHR5cGUgb24gYSByYWRpbyBidXR0b24gYWZ0ZXIgdGhlIHZhbHVlIHJlc2V0cyB0aGUgdmFsdWUgaW4gSUU2LTkKCQkJCQkvLyBSZXNldCB2YWx1ZSB0byBpdCdzIGRlZmF1bHQgaW4gY2FzZSB0eXBlIGlzIHNldCBhZnRlciB2YWx1ZQoJCQkJCS8vIFRoaXMgaXMgZm9yIGVsZW1lbnQgY3JlYXRpb24KCQkJCQl2YXIgdmFsID0gZWxlbS52YWx1ZTsKCQkJCQllbGVtLnNldEF0dHJpYnV0ZSggInR5cGUiLCB2YWx1ZSApOwoJCQkJCWlmICggdmFsICkgewoJCQkJCQllbGVtLnZhbHVlID0gdmFsOwoJCQkJCX0KCQkJCQlyZXR1cm4gdmFsdWU7CgkJCQl9CgkJCX0KCQl9LAoJCS8vIFVzZSB0aGUgdmFsdWUgcHJvcGVydHkgZm9yIGJhY2sgY29tcGF0CgkJLy8gVXNlIHRoZSBub2RlSG9vayBmb3IgYnV0dG9uIGVsZW1lbnRzIGluIElFNi83ICgjMTk1NCkKCQl2YWx1ZTogewoJCQlnZXQ6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkgewoJCQkJaWYgKCBub2RlSG9vayAmJiBqUXVlcnkubm9kZU5hbWUoIGVsZW0sICJidXR0b24iICkgKSB7CgkJCQkJcmV0dXJuIG5vZGVIb29rLmdldCggZWxlbSwgbmFtZSApOwoJCQkJfQoJCQkJcmV0dXJuIG5hbWUgaW4gZWxlbSA/CgkJCQkJZWxlbS52YWx1ZSA6CgkJCQkJbnVsbDsKCQkJfSwKCQkJc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUsIG5hbWUgKSB7CgkJCQlpZiAoIG5vZGVIb29rICYmIGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgImJ1dHRvbiIgKSApIHsKCQkJCQlyZXR1cm4gbm9kZUhvb2suc2V0KCBlbGVtLCB2YWx1ZSwgbmFtZSApOwoJCQkJfQoJCQkJLy8gRG9lcyBub3QgcmV0dXJuIHNvIHRoYXQgc2V0QXR0cmlidXRlIGlzIGFsc28gdXNlZAoJCQkJZWxlbS52YWx1ZSA9IHZhbHVlOwoJCQl9CgkJfQoJfSwKCglwcm9wRml4OiB7CgkJdGFiaW5kZXg6ICJ0YWJJbmRleCIsCgkJcmVhZG9ubHk6ICJyZWFkT25seSIsCgkJImZvciI6ICJodG1sRm9yIiwKCQkiY2xhc3MiOiAiY2xhc3NOYW1lIiwKCQltYXhsZW5ndGg6ICJtYXhMZW5ndGgiLAoJCWNlbGxzcGFjaW5nOiAiY2VsbFNwYWNpbmciLAoJCWNlbGxwYWRkaW5nOiAiY2VsbFBhZGRpbmciLAoJCXJvd3NwYW46ICJyb3dTcGFuIiwKCQljb2xzcGFuOiAiY29sU3BhbiIsCgkJdXNlbWFwOiAidXNlTWFwIiwKCQlmcmFtZWJvcmRlcjogImZyYW1lQm9yZGVyIiwKCQljb250ZW50ZWRpdGFibGU6ICJjb250ZW50RWRpdGFibGUiCgl9LAoJCglwcm9wOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUgKSB7CgkJdmFyIG5UeXBlID0gZWxlbS5ub2RlVHlwZTsKCgkJLy8gZG9uJ3QgZ2V0L3NldCBwcm9wZXJ0aWVzIG9uIHRleHQsIGNvbW1lbnQgYW5kIGF0dHJpYnV0ZSBub2RlcwoJCWlmICggIWVsZW0gfHwgblR5cGUgPT09IDMgfHwgblR5cGUgPT09IDggfHwgblR5cGUgPT09IDIgKSB7CgkJCXJldHVybiB1bmRlZmluZWQ7CgkJfQoKCQl2YXIgcmV0LCBob29rcywKCQkJbm90eG1sID0gblR5cGUgIT09IDEgfHwgIWpRdWVyeS5pc1hNTERvYyggZWxlbSApOwoKCQlpZiAoIG5vdHhtbCApIHsKCQkJLy8gRml4IG5hbWUgYW5kIGF0dGFjaCBob29rcwoJCQluYW1lID0galF1ZXJ5LnByb3BGaXhbIG5hbWUgXSB8fCBuYW1lOwoJCQlob29rcyA9IGpRdWVyeS5wcm9wSG9va3NbIG5hbWUgXTsKCQl9CgoJCWlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHsKCQkJaWYgKCBob29rcyAmJiAic2V0IiBpbiBob29rcyAmJiAocmV0ID0gaG9va3Muc2V0KCBlbGVtLCB2YWx1ZSwgbmFtZSApKSAhPT0gdW5kZWZpbmVkICkgewoJCQkJcmV0dXJuIHJldDsKCgkJCX0gZWxzZSB7CgkJCQlyZXR1cm4gKGVsZW1bIG5hbWUgXSA9IHZhbHVlKTsKCQkJfQoKCQl9IGVsc2UgewoJCQlpZiAoIGhvb2tzICYmICJnZXQiIGluIGhvb2tzICYmIChyZXQgPSBob29rcy5nZXQoIGVsZW0sIG5hbWUgKSkgIT09IG51bGwgKSB7CgkJCQlyZXR1cm4gcmV0OwoKCQkJfSBlbHNlIHsKCQkJCXJldHVybiBlbGVtWyBuYW1lIF07CgkJCX0KCQl9Cgl9LAoJCglwcm9wSG9va3M6IHsKCQl0YWJJbmRleDogewoJCQlnZXQ6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQkJLy8gZWxlbS50YWJJbmRleCBkb2Vzbid0IGFsd2F5cyByZXR1cm4gdGhlIGNvcnJlY3QgdmFsdWUgd2hlbiBpdCBoYXNuJ3QgYmVlbiBleHBsaWNpdGx5IHNldAoJCQkJLy8gaHR0cDovL2ZsdWlkcHJvamVjdC5vcmcvYmxvZy8yMDA4LzAxLzA5L2dldHRpbmctc2V0dGluZy1hbmQtcmVtb3ZpbmctdGFiaW5kZXgtdmFsdWVzLXdpdGgtamF2YXNjcmlwdC8KCQkJCXZhciBhdHRyaWJ1dGVOb2RlID0gZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCJ0YWJpbmRleCIpOwoKCQkJCXJldHVybiBhdHRyaWJ1dGVOb2RlICYmIGF0dHJpYnV0ZU5vZGUuc3BlY2lmaWVkID8KCQkJCQlwYXJzZUludCggYXR0cmlidXRlTm9kZS52YWx1ZSwgMTAgKSA6CgkJCQkJcmZvY3VzYWJsZS50ZXN0KCBlbGVtLm5vZGVOYW1lICkgfHwgcmNsaWNrYWJsZS50ZXN0KCBlbGVtLm5vZGVOYW1lICkgJiYgZWxlbS5ocmVmID8KCQkJCQkJMCA6CgkJCQkJCXVuZGVmaW5lZDsKCQkJfQoJCX0KCX0KfSk7CgovLyBBZGQgdGhlIHRhYmluZGV4IHByb3BIb29rIHRvIGF0dHJIb29rcyBmb3IgYmFjay1jb21wYXQKalF1ZXJ5LmF0dHJIb29rcy50YWJJbmRleCA9IGpRdWVyeS5wcm9wSG9va3MudGFiSW5kZXg7CgovLyBIb29rIGZvciBib29sZWFuIGF0dHJpYnV0ZXMKYm9vbEhvb2sgPSB7CglnZXQ6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkgewoJCS8vIEFsaWduIGJvb2xlYW4gYXR0cmlidXRlcyB3aXRoIGNvcnJlc3BvbmRpbmcgcHJvcGVydGllcwoJCS8vIEZhbGwgYmFjayB0byBhdHRyaWJ1dGUgcHJlc2VuY2Ugd2hlcmUgc29tZSBib29sZWFucyBhcmUgbm90IHN1cHBvcnRlZAoJCXZhciBhdHRyTm9kZTsKCQlyZXR1cm4galF1ZXJ5LnByb3AoIGVsZW0sIG5hbWUgKSA9PT0gdHJ1ZSB8fCAoIGF0dHJOb2RlID0gZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCBuYW1lICkgKSAmJiBhdHRyTm9kZS5ub2RlVmFsdWUgIT09IGZhbHNlID8KCQkJbmFtZS50b0xvd2VyQ2FzZSgpIDoKCQkJdW5kZWZpbmVkOwoJfSwKCXNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlLCBuYW1lICkgewoJCXZhciBwcm9wTmFtZTsKCQlpZiAoIHZhbHVlID09PSBmYWxzZSApIHsKCQkJLy8gUmVtb3ZlIGJvb2xlYW4gYXR0cmlidXRlcyB3aGVuIHNldCB0byBmYWxzZQoJCQlqUXVlcnkucmVtb3ZlQXR0ciggZWxlbSwgbmFtZSApOwoJCX0gZWxzZSB7CgkJCS8vIHZhbHVlIGlzIHRydWUgc2luY2Ugd2Uga25vdyBhdCB0aGlzIHBvaW50IGl0J3MgdHlwZSBib29sZWFuIGFuZCBub3QgZmFsc2UKCQkJLy8gU2V0IGJvb2xlYW4gYXR0cmlidXRlcyB0byB0aGUgc2FtZSBuYW1lIGFuZCBzZXQgdGhlIERPTSBwcm9wZXJ0eQoJCQlwcm9wTmFtZSA9IGpRdWVyeS5wcm9wRml4WyBuYW1lIF0gfHwgbmFtZTsKCQkJaWYgKCBwcm9wTmFtZSBpbiBlbGVtICkgewoJCQkJLy8gT25seSBzZXQgdGhlIElETCBzcGVjaWZpY2FsbHkgaWYgaXQgYWxyZWFkeSBleGlzdHMgb24gdGhlIGVsZW1lbnQKCQkJCWVsZW1bIHByb3BOYW1lIF0gPSB0cnVlOwoJCQl9CgoJCQllbGVtLnNldEF0dHJpYnV0ZSggbmFtZSwgbmFtZS50b0xvd2VyQ2FzZSgpICk7CgkJfQoJCXJldHVybiBuYW1lOwoJfQp9OwoKLy8gSUU2LzcgZG8gbm90IHN1cHBvcnQgZ2V0dGluZy9zZXR0aW5nIHNvbWUgYXR0cmlidXRlcyB3aXRoIGdldC9zZXRBdHRyaWJ1dGUKaWYgKCAhalF1ZXJ5LnN1cHBvcnQuZ2V0U2V0QXR0cmlidXRlICkgewoJCgkvLyBVc2UgdGhpcyBmb3IgYW55IGF0dHJpYnV0ZSBpbiBJRTYvNwoJLy8gVGhpcyBmaXhlcyBhbG1vc3QgZXZlcnkgSUU2LzcgaXNzdWUKCW5vZGVIb29rID0galF1ZXJ5LnZhbEhvb2tzLmJ1dHRvbiA9IHsKCQlnZXQ6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkgewoJCQl2YXIgcmV0OwoJCQlyZXQgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoIG5hbWUgKTsKCQkJLy8gUmV0dXJuIHVuZGVmaW5lZCBpZiBub2RlVmFsdWUgaXMgZW1wdHkgc3RyaW5nCgkJCXJldHVybiByZXQgJiYgcmV0Lm5vZGVWYWx1ZSAhPT0gIiIgPwoJCQkJcmV0Lm5vZGVWYWx1ZSA6CgkJCQl1bmRlZmluZWQ7CgkJfSwKCQlzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSwgbmFtZSApIHsKCQkJLy8gU2V0IHRoZSBleGlzdGluZyBvciBjcmVhdGUgYSBuZXcgYXR0cmlidXRlIG5vZGUKCQkJdmFyIHJldCA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZSggbmFtZSApOwoJCQlpZiAoICFyZXQgKSB7CgkJCQlyZXQgPSBkb2N1bWVudC5jcmVhdGVBdHRyaWJ1dGUoIG5hbWUgKTsKCQkJCWVsZW0uc2V0QXR0cmlidXRlTm9kZSggcmV0ICk7CgkJCX0KCQkJcmV0dXJuIChyZXQubm9kZVZhbHVlID0gdmFsdWUgKyAiIik7CgkJfQoJfTsKCgkvLyBTZXQgd2lkdGggYW5kIGhlaWdodCB0byBhdXRvIGluc3RlYWQgb2YgMCBvbiBlbXB0eSBzdHJpbmcoIEJ1ZyAjODE1MCApCgkvLyBUaGlzIGlzIGZvciByZW1vdmFscwoJalF1ZXJ5LmVhY2goWyAid2lkdGgiLCAiaGVpZ2h0IiBdLCBmdW5jdGlvbiggaSwgbmFtZSApIHsKCQlqUXVlcnkuYXR0ckhvb2tzWyBuYW1lIF0gPSBqUXVlcnkuZXh0ZW5kKCBqUXVlcnkuYXR0ckhvb2tzWyBuYW1lIF0sIHsKCQkJc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7CgkJCQlpZiAoIHZhbHVlID09PSAiIiApIHsKCQkJCQllbGVtLnNldEF0dHJpYnV0ZSggbmFtZSwgImF1dG8iICk7CgkJCQkJcmV0dXJuIHZhbHVlOwoJCQkJfQoJCQl9CgkJfSk7Cgl9KTsKfQoKCi8vIFNvbWUgYXR0cmlidXRlcyByZXF1aXJlIGEgc3BlY2lhbCBjYWxsIG9uIElFCmlmICggIWpRdWVyeS5zdXBwb3J0LmhyZWZOb3JtYWxpemVkICkgewoJalF1ZXJ5LmVhY2goWyAiaHJlZiIsICJzcmMiLCAid2lkdGgiLCAiaGVpZ2h0IiBdLCBmdW5jdGlvbiggaSwgbmFtZSApIHsKCQlqUXVlcnkuYXR0ckhvb2tzWyBuYW1lIF0gPSBqUXVlcnkuZXh0ZW5kKCBqUXVlcnkuYXR0ckhvb2tzWyBuYW1lIF0sIHsKCQkJZ2V0OiBmdW5jdGlvbiggZWxlbSApIHsKCQkJCXZhciByZXQgPSBlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSwgMiApOwoJCQkJcmV0dXJuIHJldCA9PT0gbnVsbCA/IHVuZGVmaW5lZCA6IHJldDsKCQkJfQoJCX0pOwoJfSk7Cn0KCmlmICggIWpRdWVyeS5zdXBwb3J0LnN0eWxlICkgewoJalF1ZXJ5LmF0dHJIb29rcy5zdHlsZSA9IHsKCQlnZXQ6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQkvLyBSZXR1cm4gdW5kZWZpbmVkIGluIHRoZSBjYXNlIG9mIGVtcHR5IHN0cmluZwoJCQkvLyBOb3JtYWxpemUgdG8gbG93ZXJjYXNlIHNpbmNlIElFIHVwcGVyY2FzZXMgY3NzIHByb3BlcnR5IG5hbWVzCgkJCXJldHVybiBlbGVtLnN0eWxlLmNzc1RleHQudG9Mb3dlckNhc2UoKSB8fCB1bmRlZmluZWQ7CgkJfSwKCQlzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHsKCQkJcmV0dXJuIChlbGVtLnN0eWxlLmNzc1RleHQgPSAiIiArIHZhbHVlKTsKCQl9Cgl9Owp9CgovLyBTYWZhcmkgbWlzLXJlcG9ydHMgdGhlIGRlZmF1bHQgc2VsZWN0ZWQgcHJvcGVydHkgb2YgYW4gb3B0aW9uCi8vIEFjY2Vzc2luZyB0aGUgcGFyZW50J3Mgc2VsZWN0ZWRJbmRleCBwcm9wZXJ0eSBmaXhlcyBpdAppZiAoICFqUXVlcnkuc3VwcG9ydC5vcHRTZWxlY3RlZCApIHsKCWpRdWVyeS5wcm9wSG9va3Muc2VsZWN0ZWQgPSBqUXVlcnkuZXh0ZW5kKCBqUXVlcnkucHJvcEhvb2tzLnNlbGVjdGVkLCB7CgkJZ2V0OiBmdW5jdGlvbiggZWxlbSApIHsKCQkJdmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTsKCgkJCWlmICggcGFyZW50ICkgewoJCQkJcGFyZW50LnNlbGVjdGVkSW5kZXg7CgoJCQkJLy8gTWFrZSBzdXJlIHRoYXQgaXQgYWxzbyB3b3JrcyB3aXRoIG9wdGdyb3Vwcywgc2VlICM1NzAxCgkJCQlpZiAoIHBhcmVudC5wYXJlbnROb2RlICkgewoJCQkJCXBhcmVudC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7CgkJCQl9CgkJCX0KCQkJcmV0dXJuIG51bGw7CgkJfQoJfSk7Cn0KCi8vIFJhZGlvcyBhbmQgY2hlY2tib3hlcyBnZXR0ZXIvc2V0dGVyCmlmICggIWpRdWVyeS5zdXBwb3J0LmNoZWNrT24gKSB7CglqUXVlcnkuZWFjaChbICJyYWRpbyIsICJjaGVja2JveCIgXSwgZnVuY3Rpb24oKSB7CgkJalF1ZXJ5LnZhbEhvb2tzWyB0aGlzIF0gPSB7CgkJCWdldDogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQkvLyBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgaW4gV2Via2l0ICIiIGlzIHJldHVybmVkIGluc3RlYWQgb2YgIm9uIiBpZiBhIHZhbHVlIGlzbid0IHNwZWNpZmllZAoJCQkJcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpID09PSBudWxsID8gIm9uIiA6IGVsZW0udmFsdWU7CgkJCX0KCQl9OwoJfSk7Cn0KalF1ZXJ5LmVhY2goWyAicmFkaW8iLCAiY2hlY2tib3giIF0sIGZ1bmN0aW9uKCkgewoJalF1ZXJ5LnZhbEhvb2tzWyB0aGlzIF0gPSBqUXVlcnkuZXh0ZW5kKCBqUXVlcnkudmFsSG9va3NbIHRoaXMgXSwgewoJCXNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkgewoJCQlpZiAoIGpRdWVyeS5pc0FycmF5KCB2YWx1ZSApICkgewoJCQkJcmV0dXJuIChlbGVtLmNoZWNrZWQgPSBqUXVlcnkuaW5BcnJheSggalF1ZXJ5KGVsZW0pLnZhbCgpLCB2YWx1ZSApID49IDApOwoJCQl9CgkJfQoJfSk7Cn0pOwoKCgoKdmFyIHJuYW1lc3BhY2VzID0gL1wuKC4qKSQvLAoJcmZvcm1FbGVtcyA9IC9eKD86dGV4dGFyZWF8aW5wdXR8c2VsZWN0KSQvaSwKCXJwZXJpb2QgPSAvXC4vZywKCXJzcGFjZXMgPSAvIC9nLAoJcmVzY2FwZSA9IC9bXlx3XHMufGBdL2csCglmY2xlYW51cCA9IGZ1bmN0aW9uKCBubSApIHsKCQlyZXR1cm4gbm0ucmVwbGFjZShyZXNjYXBlLCAiXFwkJiIpOwoJfTsKCi8qCiAqIEEgbnVtYmVyIG9mIGhlbHBlciBmdW5jdGlvbnMgdXNlZCBmb3IgbWFuYWdpbmcgZXZlbnRzLgogKiBNYW55IG9mIHRoZSBpZGVhcyBiZWhpbmQgdGhpcyBjb2RlIG9yaWdpbmF0ZWQgZnJvbQogKiBEZWFuIEVkd2FyZHMnIGFkZEV2ZW50IGxpYnJhcnkuCiAqLwpqUXVlcnkuZXZlbnQgPSB7CgoJLy8gQmluZCBhbiBldmVudCB0byBhbiBlbGVtZW50CgkvLyBPcmlnaW5hbCBieSBEZWFuIEVkd2FyZHMKCWFkZDogZnVuY3Rpb24oIGVsZW0sIHR5cGVzLCBoYW5kbGVyLCBkYXRhICkgewoJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMyB8fCBlbGVtLm5vZGVUeXBlID09PSA4ICkgewoJCQlyZXR1cm47CgkJfQoKCQlpZiAoIGhhbmRsZXIgPT09IGZhbHNlICkgewoJCQloYW5kbGVyID0gcmV0dXJuRmFsc2U7CgkJfSBlbHNlIGlmICggIWhhbmRsZXIgKSB7CgkJCS8vIEZpeGVzIGJ1ZyAjNzIyOS4gRml4IHJlY29tbWVuZGVkIGJ5IGpkYWx0b24KCQkJcmV0dXJuOwoJCX0KCgkJdmFyIGhhbmRsZU9iakluLCBoYW5kbGVPYmo7CgoJCWlmICggaGFuZGxlci5oYW5kbGVyICkgewoJCQloYW5kbGVPYmpJbiA9IGhhbmRsZXI7CgkJCWhhbmRsZXIgPSBoYW5kbGVPYmpJbi5oYW5kbGVyOwoJCX0KCgkJLy8gTWFrZSBzdXJlIHRoYXQgdGhlIGZ1bmN0aW9uIGJlaW5nIGV4ZWN1dGVkIGhhcyBhIHVuaXF1ZSBJRAoJCWlmICggIWhhbmRsZXIuZ3VpZCApIHsKCQkJaGFuZGxlci5ndWlkID0galF1ZXJ5Lmd1aWQrKzsKCQl9CgoJCS8vIEluaXQgdGhlIGVsZW1lbnQncyBldmVudCBzdHJ1Y3R1cmUKCQl2YXIgZWxlbURhdGEgPSBqUXVlcnkuX2RhdGEoIGVsZW0gKTsKCgkJLy8gSWYgbm8gZWxlbURhdGEgaXMgZm91bmQgdGhlbiB3ZSBtdXN0IGJlIHRyeWluZyB0byBiaW5kIHRvIG9uZSBvZiB0aGUKCQkvLyBiYW5uZWQgbm9EYXRhIGVsZW1lbnRzCgkJaWYgKCAhZWxlbURhdGEgKSB7CgkJCXJldHVybjsKCQl9CgoJCXZhciBldmVudHMgPSBlbGVtRGF0YS5ldmVudHMsCgkJCWV2ZW50SGFuZGxlID0gZWxlbURhdGEuaGFuZGxlOwoKCQlpZiAoICFldmVudHMgKSB7CgkJCWVsZW1EYXRhLmV2ZW50cyA9IGV2ZW50cyA9IHt9OwoJCX0KCgkJaWYgKCAhZXZlbnRIYW5kbGUgKSB7CgkJCWVsZW1EYXRhLmhhbmRsZSA9IGV2ZW50SGFuZGxlID0gZnVuY3Rpb24oIGUgKSB7CgkJCQkvLyBEaXNjYXJkIHRoZSBzZWNvbmQgZXZlbnQgb2YgYSBqUXVlcnkuZXZlbnQudHJpZ2dlcigpIGFuZAoJCQkJLy8gd2hlbiBhbiBldmVudCBpcyBjYWxsZWQgYWZ0ZXIgYSBwYWdlIGhhcyB1bmxvYWRlZAoJCQkJcmV0dXJuIHR5cGVvZiBqUXVlcnkgIT09ICJ1bmRlZmluZWQiICYmICghZSB8fCBqUXVlcnkuZXZlbnQudHJpZ2dlcmVkICE9PSBlLnR5cGUpID8KCQkJCQlqUXVlcnkuZXZlbnQuaGFuZGxlLmFwcGx5KCBldmVudEhhbmRsZS5lbGVtLCBhcmd1bWVudHMgKSA6CgkJCQkJdW5kZWZpbmVkOwoJCQl9OwoJCX0KCgkJLy8gQWRkIGVsZW0gYXMgYSBwcm9wZXJ0eSBvZiB0aGUgaGFuZGxlIGZ1bmN0aW9uCgkJLy8gVGhpcyBpcyB0byBwcmV2ZW50IGEgbWVtb3J5IGxlYWsgd2l0aCBub24tbmF0aXZlIGV2ZW50cyBpbiBJRS4KCQlldmVudEhhbmRsZS5lbGVtID0gZWxlbTsKCgkJLy8gSGFuZGxlIG11bHRpcGxlIGV2ZW50cyBzZXBhcmF0ZWQgYnkgYSBzcGFjZQoJCS8vIGpRdWVyeSguLi4pLmJpbmQoIm1vdXNlb3ZlciBtb3VzZW91dCIsIGZuKTsKCQl0eXBlcyA9IHR5cGVzLnNwbGl0KCIgIik7CgoJCXZhciB0eXBlLCBpID0gMCwgbmFtZXNwYWNlczsKCgkJd2hpbGUgKCAodHlwZSA9IHR5cGVzWyBpKysgXSkgKSB7CgkJCWhhbmRsZU9iaiA9IGhhbmRsZU9iakluID8KCQkJCWpRdWVyeS5leHRlbmQoe30sIGhhbmRsZU9iakluKSA6CgkJCQl7IGhhbmRsZXI6IGhhbmRsZXIsIGRhdGE6IGRhdGEgfTsKCgkJCS8vIE5hbWVzcGFjZWQgZXZlbnQgaGFuZGxlcnMKCQkJaWYgKCB0eXBlLmluZGV4T2YoIi4iKSA+IC0xICkgewoJCQkJbmFtZXNwYWNlcyA9IHR5cGUuc3BsaXQoIi4iKTsKCQkJCXR5cGUgPSBuYW1lc3BhY2VzLnNoaWZ0KCk7CgkJCQloYW5kbGVPYmoubmFtZXNwYWNlID0gbmFtZXNwYWNlcy5zbGljZSgwKS5zb3J0KCkuam9pbigiLiIpOwoKCQkJfSBlbHNlIHsKCQkJCW5hbWVzcGFjZXMgPSBbXTsKCQkJCWhhbmRsZU9iai5uYW1lc3BhY2UgPSAiIjsKCQkJfQoKCQkJaGFuZGxlT2JqLnR5cGUgPSB0eXBlOwoJCQlpZiAoICFoYW5kbGVPYmouZ3VpZCApIHsKCQkJCWhhbmRsZU9iai5ndWlkID0gaGFuZGxlci5ndWlkOwoJCQl9CgoJCQkvLyBHZXQgdGhlIGN1cnJlbnQgbGlzdCBvZiBmdW5jdGlvbnMgYm91bmQgdG8gdGhpcyBldmVudAoJCQl2YXIgaGFuZGxlcnMgPSBldmVudHNbIHR5cGUgXSwKCQkJCXNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9OwoKCQkJLy8gSW5pdCB0aGUgZXZlbnQgaGFuZGxlciBxdWV1ZQoJCQlpZiAoICFoYW5kbGVycyApIHsKCQkJCWhhbmRsZXJzID0gZXZlbnRzWyB0eXBlIF0gPSBbXTsKCgkJCQkvLyBDaGVjayBmb3IgYSBzcGVjaWFsIGV2ZW50IGhhbmRsZXIKCQkJCS8vIE9ubHkgdXNlIGFkZEV2ZW50TGlzdGVuZXIvYXR0YWNoRXZlbnQgaWYgdGhlIHNwZWNpYWwKCQkJCS8vIGV2ZW50cyBoYW5kbGVyIHJldHVybnMgZmFsc2UKCQkJCWlmICggIXNwZWNpYWwuc2V0dXAgfHwgc3BlY2lhbC5zZXR1cC5jYWxsKCBlbGVtLCBkYXRhLCBuYW1lc3BhY2VzLCBldmVudEhhbmRsZSApID09PSBmYWxzZSApIHsKCQkJCQkvLyBCaW5kIHRoZSBnbG9iYWwgZXZlbnQgaGFuZGxlciB0byB0aGUgZWxlbWVudAoJCQkJCWlmICggZWxlbS5hZGRFdmVudExpc3RlbmVyICkgewoJCQkJCQllbGVtLmFkZEV2ZW50TGlzdGVuZXIoIHR5cGUsIGV2ZW50SGFuZGxlLCBmYWxzZSApOwoKCQkJCQl9IGVsc2UgaWYgKCBlbGVtLmF0dGFjaEV2ZW50ICkgewoJCQkJCQllbGVtLmF0dGFjaEV2ZW50KCAib24iICsgdHlwZSwgZXZlbnRIYW5kbGUgKTsKCQkJCQl9CgkJCQl9CgkJCX0KCgkJCWlmICggc3BlY2lhbC5hZGQgKSB7CgkJCQlzcGVjaWFsLmFkZC5jYWxsKCBlbGVtLCBoYW5kbGVPYmogKTsKCgkJCQlpZiAoICFoYW5kbGVPYmouaGFuZGxlci5ndWlkICkgewoJCQkJCWhhbmRsZU9iai5oYW5kbGVyLmd1aWQgPSBoYW5kbGVyLmd1aWQ7CgkJCQl9CgkJCX0KCgkJCS8vIEFkZCB0aGUgZnVuY3Rpb24gdG8gdGhlIGVsZW1lbnQncyBoYW5kbGVyIGxpc3QKCQkJaGFuZGxlcnMucHVzaCggaGFuZGxlT2JqICk7CgoJCQkvLyBLZWVwIHRyYWNrIG9mIHdoaWNoIGV2ZW50cyBoYXZlIGJlZW4gdXNlZCwgZm9yIGV2ZW50IG9wdGltaXphdGlvbgoJCQlqUXVlcnkuZXZlbnQuZ2xvYmFsWyB0eXBlIF0gPSB0cnVlOwoJCX0KCgkJLy8gTnVsbGlmeSBlbGVtIHRvIHByZXZlbnQgbWVtb3J5IGxlYWtzIGluIElFCgkJZWxlbSA9IG51bGw7Cgl9LAoKCWdsb2JhbDoge30sCgoJLy8gRGV0YWNoIGFuIGV2ZW50IG9yIHNldCBvZiBldmVudHMgZnJvbSBhbiBlbGVtZW50CglyZW1vdmU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlcywgaGFuZGxlciwgcG9zICkgewoJCS8vIGRvbid0IGRvIGV2ZW50cyBvbiB0ZXh0IGFuZCBjb21tZW50IG5vZGVzCgkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAzIHx8IGVsZW0ubm9kZVR5cGUgPT09IDggKSB7CgkJCXJldHVybjsKCQl9CgoJCWlmICggaGFuZGxlciA9PT0gZmFsc2UgKSB7CgkJCWhhbmRsZXIgPSByZXR1cm5GYWxzZTsKCQl9CgoJCXZhciByZXQsIHR5cGUsIGZuLCBqLCBpID0gMCwgYWxsLCBuYW1lc3BhY2VzLCBuYW1lc3BhY2UsIHNwZWNpYWwsIGV2ZW50VHlwZSwgaGFuZGxlT2JqLCBvcmlnVHlwZSwKCQkJZWxlbURhdGEgPSBqUXVlcnkuaGFzRGF0YSggZWxlbSApICYmIGpRdWVyeS5fZGF0YSggZWxlbSApLAoJCQlldmVudHMgPSBlbGVtRGF0YSAmJiBlbGVtRGF0YS5ldmVudHM7CgoJCWlmICggIWVsZW1EYXRhIHx8ICFldmVudHMgKSB7CgkJCXJldHVybjsKCQl9CgoJCS8vIHR5cGVzIGlzIGFjdHVhbGx5IGFuIGV2ZW50IG9iamVjdCBoZXJlCgkJaWYgKCB0eXBlcyAmJiB0eXBlcy50eXBlICkgewoJCQloYW5kbGVyID0gdHlwZXMuaGFuZGxlcjsKCQkJdHlwZXMgPSB0eXBlcy50eXBlOwoJCX0KCgkJLy8gVW5iaW5kIGFsbCBldmVudHMgZm9yIHRoZSBlbGVtZW50CgkJaWYgKCAhdHlwZXMgfHwgdHlwZW9mIHR5cGVzID09PSAic3RyaW5nIiAmJiB0eXBlcy5jaGFyQXQoMCkgPT09ICIuIiApIHsKCQkJdHlwZXMgPSB0eXBlcyB8fCAiIjsKCgkJCWZvciAoIHR5cGUgaW4gZXZlbnRzICkgewoJCQkJalF1ZXJ5LmV2ZW50LnJlbW92ZSggZWxlbSwgdHlwZSArIHR5cGVzICk7CgkJCX0KCgkJCXJldHVybjsKCQl9CgoJCS8vIEhhbmRsZSBtdWx0aXBsZSBldmVudHMgc2VwYXJhdGVkIGJ5IGEgc3BhY2UKCQkvLyBqUXVlcnkoLi4uKS51bmJpbmQoIm1vdXNlb3ZlciBtb3VzZW91dCIsIGZuKTsKCQl0eXBlcyA9IHR5cGVzLnNwbGl0KCIgIik7CgoJCXdoaWxlICggKHR5cGUgPSB0eXBlc1sgaSsrIF0pICkgewoJCQlvcmlnVHlwZSA9IHR5cGU7CgkJCWhhbmRsZU9iaiA9IG51bGw7CgkJCWFsbCA9IHR5cGUuaW5kZXhPZigiLiIpIDwgMDsKCQkJbmFtZXNwYWNlcyA9IFtdOwoKCQkJaWYgKCAhYWxsICkgewoJCQkJLy8gTmFtZXNwYWNlZCBldmVudCBoYW5kbGVycwoJCQkJbmFtZXNwYWNlcyA9IHR5cGUuc3BsaXQoIi4iKTsKCQkJCXR5cGUgPSBuYW1lc3BhY2VzLnNoaWZ0KCk7CgoJCQkJbmFtZXNwYWNlID0gbmV3IFJlZ0V4cCgiKF58XFwuKSIgKwoJCQkJCWpRdWVyeS5tYXAoIG5hbWVzcGFjZXMuc2xpY2UoMCkuc29ydCgpLCBmY2xlYW51cCApLmpvaW4oIlxcLig/Oi4qXFwuKT8iKSArICIoXFwufCQpIik7CgkJCX0KCgkJCWV2ZW50VHlwZSA9IGV2ZW50c1sgdHlwZSBdOwoKCQkJaWYgKCAhZXZlbnRUeXBlICkgewoJCQkJY29udGludWU7CgkJCX0KCgkJCWlmICggIWhhbmRsZXIgKSB7CgkJCQlmb3IgKCBqID0gMDsgaiA8IGV2ZW50VHlwZS5sZW5ndGg7IGorKyApIHsKCQkJCQloYW5kbGVPYmogPSBldmVudFR5cGVbIGogXTsKCgkJCQkJaWYgKCBhbGwgfHwgbmFtZXNwYWNlLnRlc3QoIGhhbmRsZU9iai5uYW1lc3BhY2UgKSApIHsKCQkJCQkJalF1ZXJ5LmV2ZW50LnJlbW92ZSggZWxlbSwgb3JpZ1R5cGUsIGhhbmRsZU9iai5oYW5kbGVyLCBqICk7CgkJCQkJCWV2ZW50VHlwZS5zcGxpY2UoIGotLSwgMSApOwoJCQkJCX0KCQkJCX0KCgkJCQljb250aW51ZTsKCQkJfQoKCQkJc3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307CgoJCQlmb3IgKCBqID0gcG9zIHx8IDA7IGogPCBldmVudFR5cGUubGVuZ3RoOyBqKysgKSB7CgkJCQloYW5kbGVPYmogPSBldmVudFR5cGVbIGogXTsKCgkJCQlpZiAoIGhhbmRsZXIuZ3VpZCA9PT0gaGFuZGxlT2JqLmd1aWQgKSB7CgkJCQkJLy8gcmVtb3ZlIHRoZSBnaXZlbiBoYW5kbGVyIGZvciB0aGUgZ2l2ZW4gdHlwZQoJCQkJCWlmICggYWxsIHx8IG5hbWVzcGFjZS50ZXN0KCBoYW5kbGVPYmoubmFtZXNwYWNlICkgKSB7CgkJCQkJCWlmICggcG9zID09IG51bGwgKSB7CgkJCQkJCQlldmVudFR5cGUuc3BsaWNlKCBqLS0sIDEgKTsKCQkJCQkJfQoKCQkJCQkJaWYgKCBzcGVjaWFsLnJlbW92ZSApIHsKCQkJCQkJCXNwZWNpYWwucmVtb3ZlLmNhbGwoIGVsZW0sIGhhbmRsZU9iaiApOwoJCQkJCQl9CgkJCQkJfQoKCQkJCQlpZiAoIHBvcyAhPSBudWxsICkgewoJCQkJCQlicmVhazsKCQkJCQl9CgkJCQl9CgkJCX0KCgkJCS8vIHJlbW92ZSBnZW5lcmljIGV2ZW50IGhhbmRsZXIgaWYgbm8gbW9yZSBoYW5kbGVycyBleGlzdAoJCQlpZiAoIGV2ZW50VHlwZS5sZW5ndGggPT09IDAgfHwgcG9zICE9IG51bGwgJiYgZXZlbnRUeXBlLmxlbmd0aCA9PT0gMSApIHsKCQkJCWlmICggIXNwZWNpYWwudGVhcmRvd24gfHwgc3BlY2lhbC50ZWFyZG93bi5jYWxsKCBlbGVtLCBuYW1lc3BhY2VzICkgPT09IGZhbHNlICkgewoJCQkJCWpRdWVyeS5yZW1vdmVFdmVudCggZWxlbSwgdHlwZSwgZWxlbURhdGEuaGFuZGxlICk7CgkJCQl9CgoJCQkJcmV0ID0gbnVsbDsKCQkJCWRlbGV0ZSBldmVudHNbIHR5cGUgXTsKCQkJfQoJCX0KCgkJLy8gUmVtb3ZlIHRoZSBleHBhbmRvIGlmIGl0J3Mgbm8gbG9uZ2VyIHVzZWQKCQlpZiAoIGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBldmVudHMgKSApIHsKCQkJdmFyIGhhbmRsZSA9IGVsZW1EYXRhLmhhbmRsZTsKCQkJaWYgKCBoYW5kbGUgKSB7CgkJCQloYW5kbGUuZWxlbSA9IG51bGw7CgkJCX0KCgkJCWRlbGV0ZSBlbGVtRGF0YS5ldmVudHM7CgkJCWRlbGV0ZSBlbGVtRGF0YS5oYW5kbGU7CgoJCQlpZiAoIGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBlbGVtRGF0YSApICkgewoJCQkJalF1ZXJ5LnJlbW92ZURhdGEoIGVsZW0sIHVuZGVmaW5lZCwgdHJ1ZSApOwoJCQl9CgkJfQoJfSwKCQoJLy8gRXZlbnRzIHRoYXQgYXJlIHNhZmUgdG8gc2hvcnQtY2lyY3VpdCBpZiBubyBoYW5kbGVycyBhcmUgYXR0YWNoZWQuCgkvLyBOYXRpdmUgRE9NIGV2ZW50cyBzaG91bGQgbm90IGJlIGFkZGVkLCB0aGV5IG1heSBoYXZlIGlubGluZSBoYW5kbGVycy4KCWN1c3RvbUV2ZW50OiB7CgkJImdldERhdGEiOiB0cnVlLAoJCSJzZXREYXRhIjogdHJ1ZSwKCQkiY2hhbmdlRGF0YSI6IHRydWUKCX0sCgoJdHJpZ2dlcjogZnVuY3Rpb24oIGV2ZW50LCBkYXRhLCBlbGVtLCBvbmx5SGFuZGxlcnMgKSB7CgkJLy8gRXZlbnQgb2JqZWN0IG9yIGV2ZW50IHR5cGUKCQl2YXIgdHlwZSA9IGV2ZW50LnR5cGUgfHwgZXZlbnQsCgkJCW5hbWVzcGFjZXMgPSBbXSwKCQkJZXhjbHVzaXZlOwoKCQlpZiAoIHR5cGUuaW5kZXhPZigiISIpID49IDAgKSB7CgkJCS8vIEV4Y2x1c2l2ZSBldmVudHMgdHJpZ2dlciBvbmx5IGZvciB0aGUgZXhhY3QgZXZlbnQgKG5vIG5hbWVzcGFjZXMpCgkJCXR5cGUgPSB0eXBlLnNsaWNlKDAsIC0xKTsKCQkJZXhjbHVzaXZlID0gdHJ1ZTsKCQl9CgoJCWlmICggdHlwZS5pbmRleE9mKCIuIikgPj0gMCApIHsKCQkJLy8gTmFtZXNwYWNlZCB0cmlnZ2VyOyBjcmVhdGUgYSByZWdleHAgdG8gbWF0Y2ggZXZlbnQgdHlwZSBpbiBoYW5kbGUoKQoJCQluYW1lc3BhY2VzID0gdHlwZS5zcGxpdCgiLiIpOwoJCQl0eXBlID0gbmFtZXNwYWNlcy5zaGlmdCgpOwoJCQluYW1lc3BhY2VzLnNvcnQoKTsKCQl9CgoJCWlmICggKCFlbGVtIHx8IGpRdWVyeS5ldmVudC5jdXN0b21FdmVudFsgdHlwZSBdKSAmJiAhalF1ZXJ5LmV2ZW50Lmdsb2JhbFsgdHlwZSBdICkgewoJCQkvLyBObyBqUXVlcnkgaGFuZGxlcnMgZm9yIHRoaXMgZXZlbnQgdHlwZSwgYW5kIGl0IGNhbid0IGhhdmUgaW5saW5lIGhhbmRsZXJzCgkJCXJldHVybjsKCQl9CgoJCS8vIENhbGxlciBjYW4gcGFzcyBpbiBhbiBFdmVudCwgT2JqZWN0LCBvciBqdXN0IGFuIGV2ZW50IHR5cGUgc3RyaW5nCgkJZXZlbnQgPSB0eXBlb2YgZXZlbnQgPT09ICJvYmplY3QiID8KCQkJLy8galF1ZXJ5LkV2ZW50IG9iamVjdAoJCQlldmVudFsgalF1ZXJ5LmV4cGFuZG8gXSA/IGV2ZW50IDoKCQkJLy8gT2JqZWN0IGxpdGVyYWwKCQkJbmV3IGpRdWVyeS5FdmVudCggdHlwZSwgZXZlbnQgKSA6CgkJCS8vIEp1c3QgdGhlIGV2ZW50IHR5cGUgKHN0cmluZykKCQkJbmV3IGpRdWVyeS5FdmVudCggdHlwZSApOwoKCQlldmVudC50eXBlID0gdHlwZTsKCQlldmVudC5leGNsdXNpdmUgPSBleGNsdXNpdmU7CgkJZXZlbnQubmFtZXNwYWNlID0gbmFtZXNwYWNlcy5qb2luKCIuIik7CgkJZXZlbnQubmFtZXNwYWNlX3JlID0gbmV3IFJlZ0V4cCgiKF58XFwuKSIgKyBuYW1lc3BhY2VzLmpvaW4oIlxcLig/Oi4qXFwuKT8iKSArICIoXFwufCQpIik7CgkJCgkJLy8gdHJpZ2dlckhhbmRsZXIoKSBhbmQgZ2xvYmFsIGV2ZW50cyBkb24ndCBidWJibGUgb3IgcnVuIHRoZSBkZWZhdWx0IGFjdGlvbgoJCWlmICggb25seUhhbmRsZXJzIHx8ICFlbGVtICkgewoJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoJCQlldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKCQl9CgoJCS8vIEhhbmRsZSBhIGdsb2JhbCB0cmlnZ2VyCgkJaWYgKCAhZWxlbSApIHsKCQkJLy8gVE9ETzogU3RvcCB0YXVudGluZyB0aGUgZGF0YSBjYWNoZTsgcmVtb3ZlIGdsb2JhbCBldmVudHMgYW5kIGFsd2F5cyBhdHRhY2ggdG8gZG9jdW1lbnQKCQkJalF1ZXJ5LmVhY2goIGpRdWVyeS5jYWNoZSwgZnVuY3Rpb24oKSB7CgkJCQkvLyBpbnRlcm5hbEtleSB2YXJpYWJsZSBpcyBqdXN0IHVzZWQgdG8gbWFrZSBpdCBlYXNpZXIgdG8gZmluZAoJCQkJLy8gYW5kIHBvdGVudGlhbGx5IGNoYW5nZSB0aGlzIHN0dWZmIGxhdGVyOyBjdXJyZW50bHkgaXQganVzdAoJCQkJLy8gcG9pbnRzIHRvIGpRdWVyeS5leHBhbmRvCgkJCQl2YXIgaW50ZXJuYWxLZXkgPSBqUXVlcnkuZXhwYW5kbywKCQkJCQlpbnRlcm5hbENhY2hlID0gdGhpc1sgaW50ZXJuYWxLZXkgXTsKCQkJCWlmICggaW50ZXJuYWxDYWNoZSAmJiBpbnRlcm5hbENhY2hlLmV2ZW50cyAmJiBpbnRlcm5hbENhY2hlLmV2ZW50c1sgdHlwZSBdICkgewoJCQkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCBldmVudCwgZGF0YSwgaW50ZXJuYWxDYWNoZS5oYW5kbGUuZWxlbSApOwoJCQkJfQoJCQl9KTsKCQkJcmV0dXJuOwoJCX0KCgkJLy8gRG9uJ3QgZG8gZXZlbnRzIG9uIHRleHQgYW5kIGNvbW1lbnQgbm9kZXMKCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PT0gOCApIHsKCQkJcmV0dXJuOwoJCX0KCgkJLy8gQ2xlYW4gdXAgdGhlIGV2ZW50IGluIGNhc2UgaXQgaXMgYmVpbmcgcmV1c2VkCgkJZXZlbnQucmVzdWx0ID0gdW5kZWZpbmVkOwoJCWV2ZW50LnRhcmdldCA9IGVsZW07CgoJCS8vIENsb25lIGFueSBpbmNvbWluZyBkYXRhIGFuZCBwcmVwZW5kIHRoZSBldmVudCwgY3JlYXRpbmcgdGhlIGhhbmRsZXIgYXJnIGxpc3QKCQlkYXRhID0gZGF0YSAhPSBudWxsID8galF1ZXJ5Lm1ha2VBcnJheSggZGF0YSApIDogW107CgkJZGF0YS51bnNoaWZ0KCBldmVudCApOwoKCQl2YXIgY3VyID0gZWxlbSwKCQkJLy8gSUUgZG9lc24ndCBsaWtlIG1ldGhvZCBuYW1lcyB3aXRoIGEgY29sb24gKCMzNTMzLCAjODI3MikKCQkJb250eXBlID0gdHlwZS5pbmRleE9mKCI6IikgPCAwID8gIm9uIiArIHR5cGUgOiAiIjsKCgkJLy8gRmlyZSBldmVudCBvbiB0aGUgY3VycmVudCBlbGVtZW50LCB0aGVuIGJ1YmJsZSB1cCB0aGUgRE9NIHRyZWUKCQlkbyB7CgkJCXZhciBoYW5kbGUgPSBqUXVlcnkuX2RhdGEoIGN1ciwgImhhbmRsZSIgKTsKCgkJCWV2ZW50LmN1cnJlbnRUYXJnZXQgPSBjdXI7CgkJCWlmICggaGFuZGxlICkgewoJCQkJaGFuZGxlLmFwcGx5KCBjdXIsIGRhdGEgKTsKCQkJfQoKCQkJLy8gVHJpZ2dlciBhbiBpbmxpbmUgYm91bmQgc2NyaXB0CgkJCWlmICggb250eXBlICYmIGpRdWVyeS5hY2NlcHREYXRhKCBjdXIgKSAmJiBjdXJbIG9udHlwZSBdICYmIGN1clsgb250eXBlIF0uYXBwbHkoIGN1ciwgZGF0YSApID09PSBmYWxzZSApIHsKCQkJCWV2ZW50LnJlc3VsdCA9IGZhbHNlOwoJCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKCQkJfQoKCQkJLy8gQnViYmxlIHVwIHRvIGRvY3VtZW50LCB0aGVuIHRvIHdpbmRvdwoJCQljdXIgPSBjdXIucGFyZW50Tm9kZSB8fCBjdXIub3duZXJEb2N1bWVudCB8fCBjdXIgPT09IGV2ZW50LnRhcmdldC5vd25lckRvY3VtZW50ICYmIHdpbmRvdzsKCQl9IHdoaWxlICggY3VyICYmICFldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpICk7CgoJCS8vIElmIG5vYm9keSBwcmV2ZW50ZWQgdGhlIGRlZmF1bHQgYWN0aW9uLCBkbyBpdCBub3cKCQlpZiAoICFldmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSApIHsKCQkJdmFyIG9sZCwKCQkJCXNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9OwoKCQkJaWYgKCAoIXNwZWNpYWwuX2RlZmF1bHQgfHwgc3BlY2lhbC5fZGVmYXVsdC5jYWxsKCBlbGVtLm93bmVyRG9jdW1lbnQsIGV2ZW50ICkgPT09IGZhbHNlKSAmJgoJCQkJISh0eXBlID09PSAiY2xpY2siICYmIGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgImEiICkpICYmIGpRdWVyeS5hY2NlcHREYXRhKCBlbGVtICkgKSB7CgoJCQkJLy8gQ2FsbCBhIG5hdGl2ZSBET00gbWV0aG9kIG9uIHRoZSB0YXJnZXQgd2l0aCB0aGUgc2FtZSBuYW1lIG5hbWUgYXMgdGhlIGV2ZW50LgoJCQkJLy8gQ2FuJ3QgdXNlIGFuIC5pc0Z1bmN0aW9uKSgpIGNoZWNrIGhlcmUgYmVjYXVzZSBJRTYvNyBmYWlscyB0aGF0IHRlc3QuCgkJCQkvLyBJRTw5IGRpZXMgb24gZm9jdXMgdG8gaGlkZGVuIGVsZW1lbnQgKCMxNDg2KSwgbWF5IHdhbnQgdG8gcmV2aXNpdCBhIHRyeS9jYXRjaC4KCQkJCXRyeSB7CgkJCQkJaWYgKCBvbnR5cGUgJiYgZWxlbVsgdHlwZSBdICkgewoJCQkJCQkvLyBEb24ndCByZS10cmlnZ2VyIGFuIG9uRk9PIGV2ZW50IHdoZW4gd2UgY2FsbCBpdHMgRk9PKCkgbWV0aG9kCgkJCQkJCW9sZCA9IGVsZW1bIG9udHlwZSBdOwoKCQkJCQkJaWYgKCBvbGQgKSB7CgkJCQkJCQllbGVtWyBvbnR5cGUgXSA9IG51bGw7CgkJCQkJCX0KCgkJCQkJCWpRdWVyeS5ldmVudC50cmlnZ2VyZWQgPSB0eXBlOwoJCQkJCQllbGVtWyB0eXBlIF0oKTsKCQkJCQl9CgkJCQl9IGNhdGNoICggaWVFcnJvciApIHt9CgoJCQkJaWYgKCBvbGQgKSB7CgkJCQkJZWxlbVsgb250eXBlIF0gPSBvbGQ7CgkJCQl9CgoJCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXJlZCA9IHVuZGVmaW5lZDsKCQkJfQoJCX0KCQkKCQlyZXR1cm4gZXZlbnQucmVzdWx0OwoJfSwKCgloYW5kbGU6IGZ1bmN0aW9uKCBldmVudCApIHsKCQlldmVudCA9IGpRdWVyeS5ldmVudC5maXgoIGV2ZW50IHx8IHdpbmRvdy5ldmVudCApOwoJCS8vIFNuYXBzaG90IHRoZSBoYW5kbGVycyBsaXN0IHNpbmNlIGEgY2FsbGVkIGhhbmRsZXIgbWF5IGFkZC9yZW1vdmUgZXZlbnRzLgoJCXZhciBoYW5kbGVycyA9ICgoalF1ZXJ5Ll9kYXRhKCB0aGlzLCAiZXZlbnRzIiApIHx8IHt9KVsgZXZlbnQudHlwZSBdIHx8IFtdKS5zbGljZSgwKSwKCQkJcnVuX2FsbCA9ICFldmVudC5leGNsdXNpdmUgJiYgIWV2ZW50Lm5hbWVzcGFjZSwKCQkJYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCBhcmd1bWVudHMsIDAgKTsKCgkJLy8gVXNlIHRoZSBmaXgtZWQgRXZlbnQgcmF0aGVyIHRoYW4gdGhlIChyZWFkLW9ubHkpIG5hdGl2ZSBldmVudAoJCWFyZ3NbMF0gPSBldmVudDsKCQlldmVudC5jdXJyZW50VGFyZ2V0ID0gdGhpczsKCgkJZm9yICggdmFyIGogPSAwLCBsID0gaGFuZGxlcnMubGVuZ3RoOyBqIDwgbDsgaisrICkgewoJCQl2YXIgaGFuZGxlT2JqID0gaGFuZGxlcnNbIGogXTsKCgkJCS8vIFRyaWdnZXJlZCBldmVudCBtdXN0IDEpIGJlIG5vbi1leGNsdXNpdmUgYW5kIGhhdmUgbm8gbmFtZXNwYWNlLCBvcgoJCQkvLyAyKSBoYXZlIG5hbWVzcGFjZShzKSBhIHN1YnNldCBvciBlcXVhbCB0byB0aG9zZSBpbiB0aGUgYm91bmQgZXZlbnQuCgkJCWlmICggcnVuX2FsbCB8fCBldmVudC5uYW1lc3BhY2VfcmUudGVzdCggaGFuZGxlT2JqLm5hbWVzcGFjZSApICkgewoJCQkJLy8gUGFzcyBpbiBhIHJlZmVyZW5jZSB0byB0aGUgaGFuZGxlciBmdW5jdGlvbiBpdHNlbGYKCQkJCS8vIFNvIHRoYXQgd2UgY2FuIGxhdGVyIHJlbW92ZSBpdAoJCQkJZXZlbnQuaGFuZGxlciA9IGhhbmRsZU9iai5oYW5kbGVyOwoJCQkJZXZlbnQuZGF0YSA9IGhhbmRsZU9iai5kYXRhOwoJCQkJZXZlbnQuaGFuZGxlT2JqID0gaGFuZGxlT2JqOwoKCQkJCXZhciByZXQgPSBoYW5kbGVPYmouaGFuZGxlci5hcHBseSggdGhpcywgYXJncyApOwoKCQkJCWlmICggcmV0ICE9PSB1bmRlZmluZWQgKSB7CgkJCQkJZXZlbnQucmVzdWx0ID0gcmV0OwoJCQkJCWlmICggcmV0ID09PSBmYWxzZSApIHsKCQkJCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKCQkJCQkJZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CgkJCQkJfQoJCQkJfQoKCQkJCWlmICggZXZlbnQuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKSApIHsKCQkJCQlicmVhazsKCQkJCX0KCQkJfQoJCX0KCQlyZXR1cm4gZXZlbnQucmVzdWx0OwoJfSwKCglwcm9wczogImFsdEtleSBhdHRyQ2hhbmdlIGF0dHJOYW1lIGJ1YmJsZXMgYnV0dG9uIGNhbmNlbGFibGUgY2hhckNvZGUgY2xpZW50WCBjbGllbnRZIGN0cmxLZXkgY3VycmVudFRhcmdldCBkYXRhIGRldGFpbCBldmVudFBoYXNlIGZyb21FbGVtZW50IGhhbmRsZXIga2V5Q29kZSBsYXllclggbGF5ZXJZIG1ldGFLZXkgbmV3VmFsdWUgb2Zmc2V0WCBvZmZzZXRZIHBhZ2VYIHBhZ2VZIHByZXZWYWx1ZSByZWxhdGVkTm9kZSByZWxhdGVkVGFyZ2V0IHNjcmVlblggc2NyZWVuWSBzaGlmdEtleSBzcmNFbGVtZW50IHRhcmdldCB0b0VsZW1lbnQgdmlldyB3aGVlbERlbHRhIHdoaWNoIi5zcGxpdCgiICIpLAoKCWZpeDogZnVuY3Rpb24oIGV2ZW50ICkgewoJCWlmICggZXZlbnRbIGpRdWVyeS5leHBhbmRvIF0gKSB7CgkJCXJldHVybiBldmVudDsKCQl9CgoJCS8vIHN0b3JlIGEgY29weSBvZiB0aGUgb3JpZ2luYWwgZXZlbnQgb2JqZWN0CgkJLy8gYW5kICJjbG9uZSIgdG8gc2V0IHJlYWQtb25seSBwcm9wZXJ0aWVzCgkJdmFyIG9yaWdpbmFsRXZlbnQgPSBldmVudDsKCQlldmVudCA9IGpRdWVyeS5FdmVudCggb3JpZ2luYWxFdmVudCApOwoKCQlmb3IgKCB2YXIgaSA9IHRoaXMucHJvcHMubGVuZ3RoLCBwcm9wOyBpOyApIHsKCQkJcHJvcCA9IHRoaXMucHJvcHNbIC0taSBdOwoJCQlldmVudFsgcHJvcCBdID0gb3JpZ2luYWxFdmVudFsgcHJvcCBdOwoJCX0KCgkJLy8gRml4IHRhcmdldCBwcm9wZXJ0eSwgaWYgbmVjZXNzYXJ5CgkJaWYgKCAhZXZlbnQudGFyZ2V0ICkgewoJCQkvLyBGaXhlcyAjMTkyNSB3aGVyZSBzcmNFbGVtZW50IG1pZ2h0IG5vdCBiZSBkZWZpbmVkIGVpdGhlcgoJCQlldmVudC50YXJnZXQgPSBldmVudC5zcmNFbGVtZW50IHx8IGRvY3VtZW50OwoJCX0KCgkJLy8gY2hlY2sgaWYgdGFyZ2V0IGlzIGEgdGV4dG5vZGUgKHNhZmFyaSkKCQlpZiAoIGV2ZW50LnRhcmdldC5ub2RlVHlwZSA9PT0gMyApIHsKCQkJZXZlbnQudGFyZ2V0ID0gZXZlbnQudGFyZ2V0LnBhcmVudE5vZGU7CgkJfQoKCQkvLyBBZGQgcmVsYXRlZFRhcmdldCwgaWYgbmVjZXNzYXJ5CgkJaWYgKCAhZXZlbnQucmVsYXRlZFRhcmdldCAmJiBldmVudC5mcm9tRWxlbWVudCApIHsKCQkJZXZlbnQucmVsYXRlZFRhcmdldCA9IGV2ZW50LmZyb21FbGVtZW50ID09PSBldmVudC50YXJnZXQgPyBldmVudC50b0VsZW1lbnQgOiBldmVudC5mcm9tRWxlbWVudDsKCQl9CgoJCS8vIENhbGN1bGF0ZSBwYWdlWC9ZIGlmIG1pc3NpbmcgYW5kIGNsaWVudFgvWSBhdmFpbGFibGUKCQlpZiAoIGV2ZW50LnBhZ2VYID09IG51bGwgJiYgZXZlbnQuY2xpZW50WCAhPSBudWxsICkgewoJCQl2YXIgZXZlbnREb2N1bWVudCA9IGV2ZW50LnRhcmdldC5vd25lckRvY3VtZW50IHx8IGRvY3VtZW50LAoJCQkJZG9jID0gZXZlbnREb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsCgkJCQlib2R5ID0gZXZlbnREb2N1bWVudC5ib2R5OwoKCQkJZXZlbnQucGFnZVggPSBldmVudC5jbGllbnRYICsgKGRvYyAmJiBkb2Muc2Nyb2xsTGVmdCB8fCBib2R5ICYmIGJvZHkuc2Nyb2xsTGVmdCB8fCAwKSAtIChkb2MgJiYgZG9jLmNsaWVudExlZnQgfHwgYm9keSAmJiBib2R5LmNsaWVudExlZnQgfHwgMCk7CgkJCWV2ZW50LnBhZ2VZID0gZXZlbnQuY2xpZW50WSArIChkb2MgJiYgZG9jLnNjcm9sbFRvcCAgfHwgYm9keSAmJiBib2R5LnNjcm9sbFRvcCAgfHwgMCkgLSAoZG9jICYmIGRvYy5jbGllbnRUb3AgIHx8IGJvZHkgJiYgYm9keS5jbGllbnRUb3AgIHx8IDApOwoJCX0KCgkJLy8gQWRkIHdoaWNoIGZvciBrZXkgZXZlbnRzCgkJaWYgKCBldmVudC53aGljaCA9PSBudWxsICYmIChldmVudC5jaGFyQ29kZSAhPSBudWxsIHx8IGV2ZW50LmtleUNvZGUgIT0gbnVsbCkgKSB7CgkJCWV2ZW50LndoaWNoID0gZXZlbnQuY2hhckNvZGUgIT0gbnVsbCA/IGV2ZW50LmNoYXJDb2RlIDogZXZlbnQua2V5Q29kZTsKCQl9CgoJCS8vIEFkZCBtZXRhS2V5IHRvIG5vbi1NYWMgYnJvd3NlcnMgKHVzZSBjdHJsIGZvciBQQydzIGFuZCBNZXRhIGZvciBNYWNzKQoJCWlmICggIWV2ZW50Lm1ldGFLZXkgJiYgZXZlbnQuY3RybEtleSApIHsKCQkJZXZlbnQubWV0YUtleSA9IGV2ZW50LmN0cmxLZXk7CgkJfQoKCQkvLyBBZGQgd2hpY2ggZm9yIGNsaWNrOiAxID09PSBsZWZ0OyAyID09PSBtaWRkbGU7IDMgPT09IHJpZ2h0CgkJLy8gTm90ZTogYnV0dG9uIGlzIG5vdCBub3JtYWxpemVkLCBzbyBkb24ndCB1c2UgaXQKCQlpZiAoICFldmVudC53aGljaCAmJiBldmVudC5idXR0b24gIT09IHVuZGVmaW5lZCApIHsKCQkJZXZlbnQud2hpY2ggPSAoZXZlbnQuYnV0dG9uICYgMSA/IDEgOiAoIGV2ZW50LmJ1dHRvbiAmIDIgPyAzIDogKCBldmVudC5idXR0b24gJiA0ID8gMiA6IDAgKSApKTsKCQl9CgoJCXJldHVybiBldmVudDsKCX0sCgoJLy8gRGVwcmVjYXRlZCwgdXNlIGpRdWVyeS5ndWlkIGluc3RlYWQKCWd1aWQ6IDFFOCwKCgkvLyBEZXByZWNhdGVkLCB1c2UgalF1ZXJ5LnByb3h5IGluc3RlYWQKCXByb3h5OiBqUXVlcnkucHJveHksCgoJc3BlY2lhbDogewoJCXJlYWR5OiB7CgkJCS8vIE1ha2Ugc3VyZSB0aGUgcmVhZHkgZXZlbnQgaXMgc2V0dXAKCQkJc2V0dXA6IGpRdWVyeS5iaW5kUmVhZHksCgkJCXRlYXJkb3duOiBqUXVlcnkubm9vcAoJCX0sCgoJCWxpdmU6IHsKCQkJYWRkOiBmdW5jdGlvbiggaGFuZGxlT2JqICkgewoJCQkJalF1ZXJ5LmV2ZW50LmFkZCggdGhpcywKCQkJCQlsaXZlQ29udmVydCggaGFuZGxlT2JqLm9yaWdUeXBlLCBoYW5kbGVPYmouc2VsZWN0b3IgKSwKCQkJCQlqUXVlcnkuZXh0ZW5kKHt9LCBoYW5kbGVPYmosIHtoYW5kbGVyOiBsaXZlSGFuZGxlciwgZ3VpZDogaGFuZGxlT2JqLmhhbmRsZXIuZ3VpZH0pICk7CgkJCX0sCgoJCQlyZW1vdmU6IGZ1bmN0aW9uKCBoYW5kbGVPYmogKSB7CgkJCQlqUXVlcnkuZXZlbnQucmVtb3ZlKCB0aGlzLCBsaXZlQ29udmVydCggaGFuZGxlT2JqLm9yaWdUeXBlLCBoYW5kbGVPYmouc2VsZWN0b3IgKSwgaGFuZGxlT2JqICk7CgkJCX0KCQl9LAoKCQliZWZvcmV1bmxvYWQ6IHsKCQkJc2V0dXA6IGZ1bmN0aW9uKCBkYXRhLCBuYW1lc3BhY2VzLCBldmVudEhhbmRsZSApIHsKCQkJCS8vIFdlIG9ubHkgd2FudCB0byBkbyB0aGlzIHNwZWNpYWwgY2FzZSBvbiB3aW5kb3dzCgkJCQlpZiAoIGpRdWVyeS5pc1dpbmRvdyggdGhpcyApICkgewoJCQkJCXRoaXMub25iZWZvcmV1bmxvYWQgPSBldmVudEhhbmRsZTsKCQkJCX0KCQkJfSwKCgkJCXRlYXJkb3duOiBmdW5jdGlvbiggbmFtZXNwYWNlcywgZXZlbnRIYW5kbGUgKSB7CgkJCQlpZiAoIHRoaXMub25iZWZvcmV1bmxvYWQgPT09IGV2ZW50SGFuZGxlICkgewoJCQkJCXRoaXMub25iZWZvcmV1bmxvYWQgPSBudWxsOwoJCQkJfQoJCQl9CgkJfQoJfQp9OwoKalF1ZXJ5LnJlbW92ZUV2ZW50ID0gZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciA/CglmdW5jdGlvbiggZWxlbSwgdHlwZSwgaGFuZGxlICkgewoJCWlmICggZWxlbS5yZW1vdmVFdmVudExpc3RlbmVyICkgewoJCQllbGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIoIHR5cGUsIGhhbmRsZSwgZmFsc2UgKTsKCQl9Cgl9IDoKCWZ1bmN0aW9uKCBlbGVtLCB0eXBlLCBoYW5kbGUgKSB7CgkJaWYgKCBlbGVtLmRldGFjaEV2ZW50ICkgewoJCQllbGVtLmRldGFjaEV2ZW50KCAib24iICsgdHlwZSwgaGFuZGxlICk7CgkJfQoJfTsKCmpRdWVyeS5FdmVudCA9IGZ1bmN0aW9uKCBzcmMsIHByb3BzICkgewoJLy8gQWxsb3cgaW5zdGFudGlhdGlvbiB3aXRob3V0IHRoZSAnbmV3JyBrZXl3b3JkCglpZiAoICF0aGlzLnByZXZlbnREZWZhdWx0ICkgewoJCXJldHVybiBuZXcgalF1ZXJ5LkV2ZW50KCBzcmMsIHByb3BzICk7Cgl9CgoJLy8gRXZlbnQgb2JqZWN0CglpZiAoIHNyYyAmJiBzcmMudHlwZSApIHsKCQl0aGlzLm9yaWdpbmFsRXZlbnQgPSBzcmM7CgkJdGhpcy50eXBlID0gc3JjLnR5cGU7CgoJCS8vIEV2ZW50cyBidWJibGluZyB1cCB0aGUgZG9jdW1lbnQgbWF5IGhhdmUgYmVlbiBtYXJrZWQgYXMgcHJldmVudGVkCgkJLy8gYnkgYSBoYW5kbGVyIGxvd2VyIGRvd24gdGhlIHRyZWU7IHJlZmxlY3QgdGhlIGNvcnJlY3QgdmFsdWUuCgkJdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQgPSAoc3JjLmRlZmF1bHRQcmV2ZW50ZWQgfHwgc3JjLnJldHVyblZhbHVlID09PSBmYWxzZSB8fAoJCQlzcmMuZ2V0UHJldmVudERlZmF1bHQgJiYgc3JjLmdldFByZXZlbnREZWZhdWx0KCkpID8gcmV0dXJuVHJ1ZSA6IHJldHVybkZhbHNlOwoKCS8vIEV2ZW50IHR5cGUKCX0gZWxzZSB7CgkJdGhpcy50eXBlID0gc3JjOwoJfQoKCS8vIFB1dCBleHBsaWNpdGx5IHByb3ZpZGVkIHByb3BlcnRpZXMgb250byB0aGUgZXZlbnQgb2JqZWN0CglpZiAoIHByb3BzICkgewoJCWpRdWVyeS5leHRlbmQoIHRoaXMsIHByb3BzICk7Cgl9CgoJLy8gdGltZVN0YW1wIGlzIGJ1Z2d5IGZvciBzb21lIGV2ZW50cyBvbiBGaXJlZm94KCMzODQzKQoJLy8gU28gd2Ugd29uJ3QgcmVseSBvbiB0aGUgbmF0aXZlIHZhbHVlCgl0aGlzLnRpbWVTdGFtcCA9IGpRdWVyeS5ub3coKTsKCgkvLyBNYXJrIGl0IGFzIGZpeGVkCgl0aGlzWyBqUXVlcnkuZXhwYW5kbyBdID0gdHJ1ZTsKfTsKCmZ1bmN0aW9uIHJldHVybkZhbHNlKCkgewoJcmV0dXJuIGZhbHNlOwp9CmZ1bmN0aW9uIHJldHVyblRydWUoKSB7CglyZXR1cm4gdHJ1ZTsKfQoKLy8galF1ZXJ5LkV2ZW50IGlzIGJhc2VkIG9uIERPTTMgRXZlbnRzIGFzIHNwZWNpZmllZCBieSB0aGUgRUNNQVNjcmlwdCBMYW5ndWFnZSBCaW5kaW5nCi8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDMvV0QtRE9NLUxldmVsLTMtRXZlbnRzLTIwMDMwMzMxL2VjbWEtc2NyaXB0LWJpbmRpbmcuaHRtbApqUXVlcnkuRXZlbnQucHJvdG90eXBlID0gewoJcHJldmVudERlZmF1bHQ6IGZ1bmN0aW9uKCkgewoJCXRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gcmV0dXJuVHJ1ZTsKCgkJdmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7CgkJaWYgKCAhZSApIHsKCQkJcmV0dXJuOwoJCX0KCgkJLy8gaWYgcHJldmVudERlZmF1bHQgZXhpc3RzIHJ1biBpdCBvbiB0aGUgb3JpZ2luYWwgZXZlbnQKCQlpZiAoIGUucHJldmVudERlZmF1bHQgKSB7CgkJCWUucHJldmVudERlZmF1bHQoKTsKCgkJLy8gb3RoZXJ3aXNlIHNldCB0aGUgcmV0dXJuVmFsdWUgcHJvcGVydHkgb2YgdGhlIG9yaWdpbmFsIGV2ZW50IHRvIGZhbHNlIChJRSkKCQl9IGVsc2UgewoJCQllLnJldHVyblZhbHVlID0gZmFsc2U7CgkJfQoJfSwKCXN0b3BQcm9wYWdhdGlvbjogZnVuY3Rpb24oKSB7CgkJdGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZCA9IHJldHVyblRydWU7CgoJCXZhciBlID0gdGhpcy5vcmlnaW5hbEV2ZW50OwoJCWlmICggIWUgKSB7CgkJCXJldHVybjsKCQl9CgkJLy8gaWYgc3RvcFByb3BhZ2F0aW9uIGV4aXN0cyBydW4gaXQgb24gdGhlIG9yaWdpbmFsIGV2ZW50CgkJaWYgKCBlLnN0b3BQcm9wYWdhdGlvbiApIHsKCQkJZS5zdG9wUHJvcGFnYXRpb24oKTsKCQl9CgkJLy8gb3RoZXJ3aXNlIHNldCB0aGUgY2FuY2VsQnViYmxlIHByb3BlcnR5IG9mIHRoZSBvcmlnaW5hbCBldmVudCB0byB0cnVlIChJRSkKCQllLmNhbmNlbEJ1YmJsZSA9IHRydWU7Cgl9LAoJc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOiBmdW5jdGlvbigpIHsKCQl0aGlzLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkID0gcmV0dXJuVHJ1ZTsKCQl0aGlzLnN0b3BQcm9wYWdhdGlvbigpOwoJfSwKCWlzRGVmYXVsdFByZXZlbnRlZDogcmV0dXJuRmFsc2UsCglpc1Byb3BhZ2F0aW9uU3RvcHBlZDogcmV0dXJuRmFsc2UsCglpc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZDogcmV0dXJuRmFsc2UKfTsKCi8vIENoZWNrcyBpZiBhbiBldmVudCBoYXBwZW5lZCBvbiBhbiBlbGVtZW50IHdpdGhpbiBhbm90aGVyIGVsZW1lbnQKLy8gVXNlZCBpbiBqUXVlcnkuZXZlbnQuc3BlY2lhbC5tb3VzZWVudGVyIGFuZCBtb3VzZWxlYXZlIGhhbmRsZXJzCnZhciB3aXRoaW5FbGVtZW50ID0gZnVuY3Rpb24oIGV2ZW50ICkgewoKCS8vIENoZWNrIGlmIG1vdXNlKG92ZXJ8b3V0KSBhcmUgc3RpbGwgd2l0aGluIHRoZSBzYW1lIHBhcmVudCBlbGVtZW50Cgl2YXIgcmVsYXRlZCA9IGV2ZW50LnJlbGF0ZWRUYXJnZXQsCgkJaW5zaWRlID0gZmFsc2UsCgkJZXZlbnRUeXBlID0gZXZlbnQudHlwZTsKCglldmVudC50eXBlID0gZXZlbnQuZGF0YTsKCglpZiAoIHJlbGF0ZWQgIT09IHRoaXMgKSB7CgoJCWlmICggcmVsYXRlZCApIHsKCQkJaW5zaWRlID0galF1ZXJ5LmNvbnRhaW5zKCB0aGlzLCByZWxhdGVkICk7CgkJfQoKCQlpZiAoICFpbnNpZGUgKSB7CgoJCQlqUXVlcnkuZXZlbnQuaGFuZGxlLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKCgkJCWV2ZW50LnR5cGUgPSBldmVudFR5cGU7CgkJfQoJfQp9LAoKLy8gSW4gY2FzZSBvZiBldmVudCBkZWxlZ2F0aW9uLCB3ZSBvbmx5IG5lZWQgdG8gcmVuYW1lIHRoZSBldmVudC50eXBlLAovLyBsaXZlSGFuZGxlciB3aWxsIHRha2UgY2FyZSBvZiB0aGUgcmVzdC4KZGVsZWdhdGUgPSBmdW5jdGlvbiggZXZlbnQgKSB7CglldmVudC50eXBlID0gZXZlbnQuZGF0YTsKCWpRdWVyeS5ldmVudC5oYW5kbGUuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwp9OwoKLy8gQ3JlYXRlIG1vdXNlZW50ZXIgYW5kIG1vdXNlbGVhdmUgZXZlbnRzCmpRdWVyeS5lYWNoKHsKCW1vdXNlZW50ZXI6ICJtb3VzZW92ZXIiLAoJbW91c2VsZWF2ZTogIm1vdXNlb3V0Igp9LCBmdW5jdGlvbiggb3JpZywgZml4ICkgewoJalF1ZXJ5LmV2ZW50LnNwZWNpYWxbIG9yaWcgXSA9IHsKCQlzZXR1cDogZnVuY3Rpb24oIGRhdGEgKSB7CgkJCWpRdWVyeS5ldmVudC5hZGQoIHRoaXMsIGZpeCwgZGF0YSAmJiBkYXRhLnNlbGVjdG9yID8gZGVsZWdhdGUgOiB3aXRoaW5FbGVtZW50LCBvcmlnICk7CgkJfSwKCQl0ZWFyZG93bjogZnVuY3Rpb24oIGRhdGEgKSB7CgkJCWpRdWVyeS5ldmVudC5yZW1vdmUoIHRoaXMsIGZpeCwgZGF0YSAmJiBkYXRhLnNlbGVjdG9yID8gZGVsZWdhdGUgOiB3aXRoaW5FbGVtZW50ICk7CgkJfQoJfTsKfSk7CgovLyBzdWJtaXQgZGVsZWdhdGlvbgppZiAoICFqUXVlcnkuc3VwcG9ydC5zdWJtaXRCdWJibGVzICkgewoKCWpRdWVyeS5ldmVudC5zcGVjaWFsLnN1Ym1pdCA9IHsKCQlzZXR1cDogZnVuY3Rpb24oIGRhdGEsIG5hbWVzcGFjZXMgKSB7CgkJCWlmICggIWpRdWVyeS5ub2RlTmFtZSggdGhpcywgImZvcm0iICkgKSB7CgkJCQlqUXVlcnkuZXZlbnQuYWRkKHRoaXMsICJjbGljay5zcGVjaWFsU3VibWl0IiwgZnVuY3Rpb24oIGUgKSB7CgkJCQkJdmFyIGVsZW0gPSBlLnRhcmdldCwKCQkJCQkJdHlwZSA9IGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgImlucHV0IiApID8gZWxlbS50eXBlIDogIiI7CgoJCQkJCWlmICggKHR5cGUgPT09ICJzdWJtaXQiIHx8IHR5cGUgPT09ICJpbWFnZSIpICYmIGpRdWVyeSggZWxlbSApLmNsb3Nlc3QoImZvcm0iKS5sZW5ndGggKSB7CgkJCQkJCXRyaWdnZXIoICJzdWJtaXQiLCB0aGlzLCBhcmd1bWVudHMgKTsKCQkJCQl9CgkJCQl9KTsKCgkJCQlqUXVlcnkuZXZlbnQuYWRkKHRoaXMsICJrZXlwcmVzcy5zcGVjaWFsU3VibWl0IiwgZnVuY3Rpb24oIGUgKSB7CgkJCQkJdmFyIGVsZW0gPSBlLnRhcmdldCwKCQkJCQkJdHlwZSA9IGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgImlucHV0IiApID8gZWxlbS50eXBlIDogIiI7CgoJCQkJCWlmICggKHR5cGUgPT09ICJ0ZXh0IiB8fCB0eXBlID09PSAicGFzc3dvcmQiKSAmJiBqUXVlcnkoIGVsZW0gKS5jbG9zZXN0KCJmb3JtIikubGVuZ3RoICYmIGUua2V5Q29kZSA9PT0gMTMgKSB7CgkJCQkJCXRyaWdnZXIoICJzdWJtaXQiLCB0aGlzLCBhcmd1bWVudHMgKTsKCQkJCQl9CgkJCQl9KTsKCgkJCX0gZWxzZSB7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQl9LAoKCQl0ZWFyZG93bjogZnVuY3Rpb24oIG5hbWVzcGFjZXMgKSB7CgkJCWpRdWVyeS5ldmVudC5yZW1vdmUoIHRoaXMsICIuc3BlY2lhbFN1Ym1pdCIgKTsKCQl9Cgl9OwoKfQoKLy8gY2hhbmdlIGRlbGVnYXRpb24sIGhhcHBlbnMgaGVyZSBzbyB3ZSBoYXZlIGJpbmQuCmlmICggIWpRdWVyeS5zdXBwb3J0LmNoYW5nZUJ1YmJsZXMgKSB7CgoJdmFyIGNoYW5nZUZpbHRlcnMsCgoJZ2V0VmFsID0gZnVuY3Rpb24oIGVsZW0gKSB7CgkJdmFyIHR5cGUgPSBqUXVlcnkubm9kZU5hbWUoIGVsZW0sICJpbnB1dCIgKSA/IGVsZW0udHlwZSA6ICIiLAoJCQl2YWwgPSBlbGVtLnZhbHVlOwoKCQlpZiAoIHR5cGUgPT09ICJyYWRpbyIgfHwgdHlwZSA9PT0gImNoZWNrYm94IiApIHsKCQkJdmFsID0gZWxlbS5jaGVja2VkOwoKCQl9IGVsc2UgaWYgKCB0eXBlID09PSAic2VsZWN0LW11bHRpcGxlIiApIHsKCQkJdmFsID0gZWxlbS5zZWxlY3RlZEluZGV4ID4gLTEgPwoJCQkJalF1ZXJ5Lm1hcCggZWxlbS5vcHRpb25zLCBmdW5jdGlvbiggZWxlbSApIHsKCQkJCQlyZXR1cm4gZWxlbS5zZWxlY3RlZDsKCQkJCX0pLmpvaW4oIi0iKSA6CgkJCQkiIjsKCgkJfSBlbHNlIGlmICggalF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCAic2VsZWN0IiApICkgewoJCQl2YWwgPSBlbGVtLnNlbGVjdGVkSW5kZXg7CgkJfQoKCQlyZXR1cm4gdmFsOwoJfSwKCgl0ZXN0Q2hhbmdlID0gZnVuY3Rpb24gdGVzdENoYW5nZSggZSApIHsKCQl2YXIgZWxlbSA9IGUudGFyZ2V0LCBkYXRhLCB2YWw7CgoJCWlmICggIXJmb3JtRWxlbXMudGVzdCggZWxlbS5ub2RlTmFtZSApIHx8IGVsZW0ucmVhZE9ubHkgKSB7CgkJCXJldHVybjsKCQl9CgoJCWRhdGEgPSBqUXVlcnkuX2RhdGEoIGVsZW0sICJfY2hhbmdlX2RhdGEiICk7CgkJdmFsID0gZ2V0VmFsKGVsZW0pOwoKCQkvLyB0aGUgY3VycmVudCBkYXRhIHdpbGwgYmUgYWxzbyByZXRyaWV2ZWQgYnkgYmVmb3JlYWN0aXZhdGUKCQlpZiAoIGUudHlwZSAhPT0gImZvY3Vzb3V0IiB8fCBlbGVtLnR5cGUgIT09ICJyYWRpbyIgKSB7CgkJCWpRdWVyeS5fZGF0YSggZWxlbSwgIl9jaGFuZ2VfZGF0YSIsIHZhbCApOwoJCX0KCgkJaWYgKCBkYXRhID09PSB1bmRlZmluZWQgfHwgdmFsID09PSBkYXRhICkgewoJCQlyZXR1cm47CgkJfQoKCQlpZiAoIGRhdGEgIT0gbnVsbCB8fCB2YWwgKSB7CgkJCWUudHlwZSA9ICJjaGFuZ2UiOwoJCQllLmxpdmVGaXJlZCA9IHVuZGVmaW5lZDsKCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoIGUsIGFyZ3VtZW50c1sxXSwgZWxlbSApOwoJCX0KCX07CgoJalF1ZXJ5LmV2ZW50LnNwZWNpYWwuY2hhbmdlID0gewoJCWZpbHRlcnM6IHsKCQkJZm9jdXNvdXQ6IHRlc3RDaGFuZ2UsCgoJCQliZWZvcmVkZWFjdGl2YXRlOiB0ZXN0Q2hhbmdlLAoKCQkJY2xpY2s6IGZ1bmN0aW9uKCBlICkgewoJCQkJdmFyIGVsZW0gPSBlLnRhcmdldCwgdHlwZSA9IGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgImlucHV0IiApID8gZWxlbS50eXBlIDogIiI7CgoJCQkJaWYgKCB0eXBlID09PSAicmFkaW8iIHx8IHR5cGUgPT09ICJjaGVja2JveCIgfHwgalF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCAic2VsZWN0IiApICkgewoJCQkJCXRlc3RDaGFuZ2UuY2FsbCggdGhpcywgZSApOwoJCQkJfQoJCQl9LAoKCQkJLy8gQ2hhbmdlIGhhcyB0byBiZSBjYWxsZWQgYmVmb3JlIHN1Ym1pdAoJCQkvLyBLZXlkb3duIHdpbGwgYmUgY2FsbGVkIGJlZm9yZSBrZXlwcmVzcywgd2hpY2ggaXMgdXNlZCBpbiBzdWJtaXQtZXZlbnQgZGVsZWdhdGlvbgoJCQlrZXlkb3duOiBmdW5jdGlvbiggZSApIHsKCQkJCXZhciBlbGVtID0gZS50YXJnZXQsIHR5cGUgPSBqUXVlcnkubm9kZU5hbWUoIGVsZW0sICJpbnB1dCIgKSA/IGVsZW0udHlwZSA6ICIiOwoKCQkJCWlmICggKGUua2V5Q29kZSA9PT0gMTMgJiYgIWpRdWVyeS5ub2RlTmFtZSggZWxlbSwgInRleHRhcmVhIiApICkgfHwKCQkJCQkoZS5rZXlDb2RlID09PSAzMiAmJiAodHlwZSA9PT0gImNoZWNrYm94IiB8fCB0eXBlID09PSAicmFkaW8iKSkgfHwKCQkJCQl0eXBlID09PSAic2VsZWN0LW11bHRpcGxlIiApIHsKCQkJCQl0ZXN0Q2hhbmdlLmNhbGwoIHRoaXMsIGUgKTsKCQkJCX0KCQkJfSwKCgkJCS8vIEJlZm9yZWFjdGl2YXRlIGhhcHBlbnMgYWxzbyBiZWZvcmUgdGhlIHByZXZpb3VzIGVsZW1lbnQgaXMgYmx1cnJlZAoJCQkvLyB3aXRoIHRoaXMgZXZlbnQgeW91IGNhbid0IHRyaWdnZXIgYSBjaGFuZ2UgZXZlbnQsIGJ1dCB5b3UgY2FuIHN0b3JlCgkJCS8vIGluZm9ybWF0aW9uCgkJCWJlZm9yZWFjdGl2YXRlOiBmdW5jdGlvbiggZSApIHsKCQkJCXZhciBlbGVtID0gZS50YXJnZXQ7CgkJCQlqUXVlcnkuX2RhdGEoIGVsZW0sICJfY2hhbmdlX2RhdGEiLCBnZXRWYWwoZWxlbSkgKTsKCQkJfQoJCX0sCgoJCXNldHVwOiBmdW5jdGlvbiggZGF0YSwgbmFtZXNwYWNlcyApIHsKCQkJaWYgKCB0aGlzLnR5cGUgPT09ICJmaWxlIiApIHsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoKCQkJZm9yICggdmFyIHR5cGUgaW4gY2hhbmdlRmlsdGVycyApIHsKCQkJCWpRdWVyeS5ldmVudC5hZGQoIHRoaXMsIHR5cGUgKyAiLnNwZWNpYWxDaGFuZ2UiLCBjaGFuZ2VGaWx0ZXJzW3R5cGVdICk7CgkJCX0KCgkJCXJldHVybiByZm9ybUVsZW1zLnRlc3QoIHRoaXMubm9kZU5hbWUgKTsKCQl9LAoKCQl0ZWFyZG93bjogZnVuY3Rpb24oIG5hbWVzcGFjZXMgKSB7CgkJCWpRdWVyeS5ldmVudC5yZW1vdmUoIHRoaXMsICIuc3BlY2lhbENoYW5nZSIgKTsKCgkJCXJldHVybiByZm9ybUVsZW1zLnRlc3QoIHRoaXMubm9kZU5hbWUgKTsKCQl9Cgl9OwoKCWNoYW5nZUZpbHRlcnMgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbC5jaGFuZ2UuZmlsdGVyczsKCgkvLyBIYW5kbGUgd2hlbiB0aGUgaW5wdXQgaXMgLmZvY3VzKCknZAoJY2hhbmdlRmlsdGVycy5mb2N1cyA9IGNoYW5nZUZpbHRlcnMuYmVmb3JlYWN0aXZhdGU7Cn0KCmZ1bmN0aW9uIHRyaWdnZXIoIHR5cGUsIGVsZW0sIGFyZ3MgKSB7CgkvLyBQaWdneWJhY2sgb24gYSBkb25vciBldmVudCB0byBzaW11bGF0ZSBhIGRpZmZlcmVudCBvbmUuCgkvLyBGYWtlIG9yaWdpbmFsRXZlbnQgdG8gYXZvaWQgZG9ub3IncyBzdG9wUHJvcGFnYXRpb24sIGJ1dCBpZiB0aGUKCS8vIHNpbXVsYXRlZCBldmVudCBwcmV2ZW50cyBkZWZhdWx0IHRoZW4gd2UgZG8gdGhlIHNhbWUgb24gdGhlIGRvbm9yLgoJLy8gRG9uJ3QgcGFzcyBhcmdzIG9yIHJlbWVtYmVyIGxpdmVGaXJlZDsgdGhleSBhcHBseSB0byB0aGUgZG9ub3IgZXZlbnQuCgl2YXIgZXZlbnQgPSBqUXVlcnkuZXh0ZW5kKCB7fSwgYXJnc1sgMCBdICk7CglldmVudC50eXBlID0gdHlwZTsKCWV2ZW50Lm9yaWdpbmFsRXZlbnQgPSB7fTsKCWV2ZW50LmxpdmVGaXJlZCA9IHVuZGVmaW5lZDsKCWpRdWVyeS5ldmVudC5oYW5kbGUuY2FsbCggZWxlbSwgZXZlbnQgKTsKCWlmICggZXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkgKSB7CgkJYXJnc1sgMCBdLnByZXZlbnREZWZhdWx0KCk7Cgl9Cn0KCi8vIENyZWF0ZSAiYnViYmxpbmciIGZvY3VzIGFuZCBibHVyIGV2ZW50cwppZiAoICFqUXVlcnkuc3VwcG9ydC5mb2N1c2luQnViYmxlcyApIHsKCWpRdWVyeS5lYWNoKHsgZm9jdXM6ICJmb2N1c2luIiwgYmx1cjogImZvY3Vzb3V0IiB9LCBmdW5jdGlvbiggb3JpZywgZml4ICkgewoKCQkvLyBBdHRhY2ggYSBzaW5nbGUgY2FwdHVyaW5nIGhhbmRsZXIgd2hpbGUgc29tZW9uZSB3YW50cyBmb2N1c2luL2ZvY3Vzb3V0CgkJdmFyIGF0dGFjaGVzID0gMDsKCgkJalF1ZXJ5LmV2ZW50LnNwZWNpYWxbIGZpeCBdID0gewoJCQlzZXR1cDogZnVuY3Rpb24oKSB7CgkJCQlpZiAoIGF0dGFjaGVzKysgPT09IDAgKSB7CgkJCQkJZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggb3JpZywgaGFuZGxlciwgdHJ1ZSApOwoJCQkJfQoJCQl9LAoJCQl0ZWFyZG93bjogZnVuY3Rpb24oKSB7CgkJCQlpZiAoIC0tYXR0YWNoZXMgPT09IDAgKSB7CgkJCQkJZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggb3JpZywgaGFuZGxlciwgdHJ1ZSApOwoJCQkJfQoJCQl9CgkJfTsKCgkJZnVuY3Rpb24gaGFuZGxlciggZG9ub3IgKSB7CgkJCS8vIERvbm9yIGV2ZW50IGlzIGFsd2F5cyBhIG5hdGl2ZSBvbmU7IGZpeCBpdCBhbmQgc3dpdGNoIGl0cyB0eXBlLgoJCQkvLyBMZXQgZm9jdXNpbi9vdXQgaGFuZGxlciBjYW5jZWwgdGhlIGRvbm9yIGZvY3VzL2JsdXIgZXZlbnQuCgkJCXZhciBlID0galF1ZXJ5LmV2ZW50LmZpeCggZG9ub3IgKTsKCQkJZS50eXBlID0gZml4OwoJCQllLm9yaWdpbmFsRXZlbnQgPSB7fTsKCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoIGUsIG51bGwsIGUudGFyZ2V0ICk7CgkJCWlmICggZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSApIHsKCQkJCWRvbm9yLnByZXZlbnREZWZhdWx0KCk7CgkJCX0KCQl9Cgl9KTsKfQoKalF1ZXJ5LmVhY2goWyJiaW5kIiwgIm9uZSJdLCBmdW5jdGlvbiggaSwgbmFtZSApIHsKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHR5cGUsIGRhdGEsIGZuICkgewoJCXZhciBoYW5kbGVyOwoKCQkvLyBIYW5kbGUgb2JqZWN0IGxpdGVyYWxzCgkJaWYgKCB0eXBlb2YgdHlwZSA9PT0gIm9iamVjdCIgKSB7CgkJCWZvciAoIHZhciBrZXkgaW4gdHlwZSApIHsKCQkJCXRoaXNbIG5hbWUgXShrZXksIGRhdGEsIHR5cGVba2V5XSwgZm4pOwoJCQl9CgkJCXJldHVybiB0aGlzOwoJCX0KCgkJaWYgKCBhcmd1bWVudHMubGVuZ3RoID09PSAyIHx8IGRhdGEgPT09IGZhbHNlICkgewoJCQlmbiA9IGRhdGE7CgkJCWRhdGEgPSB1bmRlZmluZWQ7CgkJfQoKCQlpZiAoIG5hbWUgPT09ICJvbmUiICkgewoJCQloYW5kbGVyID0gZnVuY3Rpb24oIGV2ZW50ICkgewoJCQkJalF1ZXJ5KCB0aGlzICkudW5iaW5kKCBldmVudCwgaGFuZGxlciApOwoJCQkJcmV0dXJuIGZuLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKCQkJfTsKCQkJaGFuZGxlci5ndWlkID0gZm4uZ3VpZCB8fCBqUXVlcnkuZ3VpZCsrOwoJCX0gZWxzZSB7CgkJCWhhbmRsZXIgPSBmbjsKCQl9CgoJCWlmICggdHlwZSA9PT0gInVubG9hZCIgJiYgbmFtZSAhPT0gIm9uZSIgKSB7CgkJCXRoaXMub25lKCB0eXBlLCBkYXRhLCBmbiApOwoKCQl9IGVsc2UgewoJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKCQkJCWpRdWVyeS5ldmVudC5hZGQoIHRoaXNbaV0sIHR5cGUsIGhhbmRsZXIsIGRhdGEgKTsKCQkJfQoJCX0KCgkJcmV0dXJuIHRoaXM7Cgl9Owp9KTsKCmpRdWVyeS5mbi5leHRlbmQoewoJdW5iaW5kOiBmdW5jdGlvbiggdHlwZSwgZm4gKSB7CgkJLy8gSGFuZGxlIG9iamVjdCBsaXRlcmFscwoJCWlmICggdHlwZW9mIHR5cGUgPT09ICJvYmplY3QiICYmICF0eXBlLnByZXZlbnREZWZhdWx0ICkgewoJCQlmb3IgKCB2YXIga2V5IGluIHR5cGUgKSB7CgkJCQl0aGlzLnVuYmluZChrZXksIHR5cGVba2V5XSk7CgkJCX0KCgkJfSBlbHNlIHsKCQkJZm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CgkJCQlqUXVlcnkuZXZlbnQucmVtb3ZlKCB0aGlzW2ldLCB0eXBlLCBmbiApOwoJCQl9CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCgoJZGVsZWdhdGU6IGZ1bmN0aW9uKCBzZWxlY3RvciwgdHlwZXMsIGRhdGEsIGZuICkgewoJCXJldHVybiB0aGlzLmxpdmUoIHR5cGVzLCBkYXRhLCBmbiwgc2VsZWN0b3IgKTsKCX0sCgoJdW5kZWxlZ2F0ZTogZnVuY3Rpb24oIHNlbGVjdG9yLCB0eXBlcywgZm4gKSB7CgkJaWYgKCBhcmd1bWVudHMubGVuZ3RoID09PSAwICkgewoJCQlyZXR1cm4gdGhpcy51bmJpbmQoICJsaXZlIiApOwoKCQl9IGVsc2UgewoJCQlyZXR1cm4gdGhpcy5kaWUoIHR5cGVzLCBudWxsLCBmbiwgc2VsZWN0b3IgKTsKCQl9Cgl9LAoKCXRyaWdnZXI6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkgewoJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CgkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCB0eXBlLCBkYXRhLCB0aGlzICk7CgkJfSk7Cgl9LAoKCXRyaWdnZXJIYW5kbGVyOiBmdW5jdGlvbiggdHlwZSwgZGF0YSApIHsKCQlpZiAoIHRoaXNbMF0gKSB7CgkJCXJldHVybiBqUXVlcnkuZXZlbnQudHJpZ2dlciggdHlwZSwgZGF0YSwgdGhpc1swXSwgdHJ1ZSApOwoJCX0KCX0sCgoJdG9nZ2xlOiBmdW5jdGlvbiggZm4gKSB7CgkJLy8gU2F2ZSByZWZlcmVuY2UgdG8gYXJndW1lbnRzIGZvciBhY2Nlc3MgaW4gY2xvc3VyZQoJCXZhciBhcmdzID0gYXJndW1lbnRzLAoJCQlndWlkID0gZm4uZ3VpZCB8fCBqUXVlcnkuZ3VpZCsrLAoJCQlpID0gMCwKCQkJdG9nZ2xlciA9IGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCS8vIEZpZ3VyZSBvdXQgd2hpY2ggZnVuY3Rpb24gdG8gZXhlY3V0ZQoJCQkJdmFyIGxhc3RUb2dnbGUgPSAoIGpRdWVyeS5kYXRhKCB0aGlzLCAibGFzdFRvZ2dsZSIgKyBmbi5ndWlkICkgfHwgMCApICUgaTsKCQkJCWpRdWVyeS5kYXRhKCB0aGlzLCAibGFzdFRvZ2dsZSIgKyBmbi5ndWlkLCBsYXN0VG9nZ2xlICsgMSApOwoKCQkJCS8vIE1ha2Ugc3VyZSB0aGF0IGNsaWNrcyBzdG9wCgkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoKCQkJCS8vIGFuZCBleGVjdXRlIHRoZSBmdW5jdGlvbgoJCQkJcmV0dXJuIGFyZ3NbIGxhc3RUb2dnbGUgXS5hcHBseSggdGhpcywgYXJndW1lbnRzICkgfHwgZmFsc2U7CgkJCX07CgoJCS8vIGxpbmsgYWxsIHRoZSBmdW5jdGlvbnMsIHNvIGFueSBvZiB0aGVtIGNhbiB1bmJpbmQgdGhpcyBjbGljayBoYW5kbGVyCgkJdG9nZ2xlci5ndWlkID0gZ3VpZDsKCQl3aGlsZSAoIGkgPCBhcmdzLmxlbmd0aCApIHsKCQkJYXJnc1sgaSsrIF0uZ3VpZCA9IGd1aWQ7CgkJfQoKCQlyZXR1cm4gdGhpcy5jbGljayggdG9nZ2xlciApOwoJfSwKCglob3ZlcjogZnVuY3Rpb24oIGZuT3ZlciwgZm5PdXQgKSB7CgkJcmV0dXJuIHRoaXMubW91c2VlbnRlciggZm5PdmVyICkubW91c2VsZWF2ZSggZm5PdXQgfHwgZm5PdmVyICk7Cgl9Cn0pOwoKdmFyIGxpdmVNYXAgPSB7Cglmb2N1czogImZvY3VzaW4iLAoJYmx1cjogImZvY3Vzb3V0IiwKCW1vdXNlZW50ZXI6ICJtb3VzZW92ZXIiLAoJbW91c2VsZWF2ZTogIm1vdXNlb3V0Igp9OwoKalF1ZXJ5LmVhY2goWyJsaXZlIiwgImRpZSJdLCBmdW5jdGlvbiggaSwgbmFtZSApIHsKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHR5cGVzLCBkYXRhLCBmbiwgb3JpZ1NlbGVjdG9yIC8qIEludGVybmFsIFVzZSBPbmx5ICovICkgewoJCXZhciB0eXBlLCBpID0gMCwgbWF0Y2gsIG5hbWVzcGFjZXMsIHByZVR5cGUsCgkJCXNlbGVjdG9yID0gb3JpZ1NlbGVjdG9yIHx8IHRoaXMuc2VsZWN0b3IsCgkJCWNvbnRleHQgPSBvcmlnU2VsZWN0b3IgPyB0aGlzIDogalF1ZXJ5KCB0aGlzLmNvbnRleHQgKTsKCgkJaWYgKCB0eXBlb2YgdHlwZXMgPT09ICJvYmplY3QiICYmICF0eXBlcy5wcmV2ZW50RGVmYXVsdCApIHsKCQkJZm9yICggdmFyIGtleSBpbiB0eXBlcyApIHsKCQkJCWNvbnRleHRbIG5hbWUgXSgga2V5LCBkYXRhLCB0eXBlc1trZXldLCBzZWxlY3RvciApOwoJCQl9CgoJCQlyZXR1cm4gdGhpczsKCQl9CgoJCWlmICggbmFtZSA9PT0gImRpZSIgJiYgIXR5cGVzICYmCgkJCQkJb3JpZ1NlbGVjdG9yICYmIG9yaWdTZWxlY3Rvci5jaGFyQXQoMCkgPT09ICIuIiApIHsKCgkJCWNvbnRleHQudW5iaW5kKCBvcmlnU2VsZWN0b3IgKTsKCgkJCXJldHVybiB0aGlzOwoJCX0KCgkJaWYgKCBkYXRhID09PSBmYWxzZSB8fCBqUXVlcnkuaXNGdW5jdGlvbiggZGF0YSApICkgewoJCQlmbiA9IGRhdGEgfHwgcmV0dXJuRmFsc2U7CgkJCWRhdGEgPSB1bmRlZmluZWQ7CgkJfQoKCQl0eXBlcyA9ICh0eXBlcyB8fCAiIikuc3BsaXQoIiAiKTsKCgkJd2hpbGUgKCAodHlwZSA9IHR5cGVzWyBpKysgXSkgIT0gbnVsbCApIHsKCQkJbWF0Y2ggPSBybmFtZXNwYWNlcy5leGVjKCB0eXBlICk7CgkJCW5hbWVzcGFjZXMgPSAiIjsKCgkJCWlmICggbWF0Y2ggKSAgewoJCQkJbmFtZXNwYWNlcyA9IG1hdGNoWzBdOwoJCQkJdHlwZSA9IHR5cGUucmVwbGFjZSggcm5hbWVzcGFjZXMsICIiICk7CgkJCX0KCgkJCWlmICggdHlwZSA9PT0gImhvdmVyIiApIHsKCQkJCXR5cGVzLnB1c2goICJtb3VzZWVudGVyIiArIG5hbWVzcGFjZXMsICJtb3VzZWxlYXZlIiArIG5hbWVzcGFjZXMgKTsKCQkJCWNvbnRpbnVlOwoJCQl9CgoJCQlwcmVUeXBlID0gdHlwZTsKCgkJCWlmICggbGl2ZU1hcFsgdHlwZSBdICkgewoJCQkJdHlwZXMucHVzaCggbGl2ZU1hcFsgdHlwZSBdICsgbmFtZXNwYWNlcyApOwoJCQkJdHlwZSA9IHR5cGUgKyBuYW1lc3BhY2VzOwoKCQkJfSBlbHNlIHsKCQkJCXR5cGUgPSAobGl2ZU1hcFsgdHlwZSBdIHx8IHR5cGUpICsgbmFtZXNwYWNlczsKCQkJfQoKCQkJaWYgKCBuYW1lID09PSAibGl2ZSIgKSB7CgkJCQkvLyBiaW5kIGxpdmUgaGFuZGxlcgoJCQkJZm9yICggdmFyIGogPSAwLCBsID0gY29udGV4dC5sZW5ndGg7IGogPCBsOyBqKysgKSB7CgkJCQkJalF1ZXJ5LmV2ZW50LmFkZCggY29udGV4dFtqXSwgImxpdmUuIiArIGxpdmVDb252ZXJ0KCB0eXBlLCBzZWxlY3RvciApLAoJCQkJCQl7IGRhdGE6IGRhdGEsIHNlbGVjdG9yOiBzZWxlY3RvciwgaGFuZGxlcjogZm4sIG9yaWdUeXBlOiB0eXBlLCBvcmlnSGFuZGxlcjogZm4sIHByZVR5cGU6IHByZVR5cGUgfSApOwoJCQkJfQoKCQkJfSBlbHNlIHsKCQkJCS8vIHVuYmluZCBsaXZlIGhhbmRsZXIKCQkJCWNvbnRleHQudW5iaW5kKCAibGl2ZS4iICsgbGl2ZUNvbnZlcnQoIHR5cGUsIHNlbGVjdG9yICksIGZuICk7CgkJCX0KCQl9CgoJCXJldHVybiB0aGlzOwoJfTsKfSk7CgpmdW5jdGlvbiBsaXZlSGFuZGxlciggZXZlbnQgKSB7Cgl2YXIgc3RvcCwgbWF4TGV2ZWwsIHJlbGF0ZWQsIG1hdGNoLCBoYW5kbGVPYmosIGVsZW0sIGosIGksIGwsIGRhdGEsIGNsb3NlLCBuYW1lc3BhY2UsIHJldCwKCQllbGVtcyA9IFtdLAoJCXNlbGVjdG9ycyA9IFtdLAoJCWV2ZW50cyA9IGpRdWVyeS5fZGF0YSggdGhpcywgImV2ZW50cyIgKTsKCgkvLyBNYWtlIHN1cmUgd2UgYXZvaWQgbm9uLWxlZnQtY2xpY2sgYnViYmxpbmcgaW4gRmlyZWZveCAoIzM4NjEpIGFuZCBkaXNhYmxlZCBlbGVtZW50cyBpbiBJRSAoIzY5MTEpCglpZiAoIGV2ZW50LmxpdmVGaXJlZCA9PT0gdGhpcyB8fCAhZXZlbnRzIHx8ICFldmVudHMubGl2ZSB8fCBldmVudC50YXJnZXQuZGlzYWJsZWQgfHwgZXZlbnQuYnV0dG9uICYmIGV2ZW50LnR5cGUgPT09ICJjbGljayIgKSB7CgkJcmV0dXJuOwoJfQoKCWlmICggZXZlbnQubmFtZXNwYWNlICkgewoJCW5hbWVzcGFjZSA9IG5ldyBSZWdFeHAoIihefFxcLikiICsgZXZlbnQubmFtZXNwYWNlLnNwbGl0KCIuIikuam9pbigiXFwuKD86LipcXC4pPyIpICsgIihcXC58JCkiKTsKCX0KCglldmVudC5saXZlRmlyZWQgPSB0aGlzOwoKCXZhciBsaXZlID0gZXZlbnRzLmxpdmUuc2xpY2UoMCk7CgoJZm9yICggaiA9IDA7IGogPCBsaXZlLmxlbmd0aDsgaisrICkgewoJCWhhbmRsZU9iaiA9IGxpdmVbal07CgoJCWlmICggaGFuZGxlT2JqLm9yaWdUeXBlLnJlcGxhY2UoIHJuYW1lc3BhY2VzLCAiIiApID09PSBldmVudC50eXBlICkgewoJCQlzZWxlY3RvcnMucHVzaCggaGFuZGxlT2JqLnNlbGVjdG9yICk7CgoJCX0gZWxzZSB7CgkJCWxpdmUuc3BsaWNlKCBqLS0sIDEgKTsKCQl9Cgl9CgoJbWF0Y2ggPSBqUXVlcnkoIGV2ZW50LnRhcmdldCApLmNsb3Nlc3QoIHNlbGVjdG9ycywgZXZlbnQuY3VycmVudFRhcmdldCApOwoKCWZvciAoIGkgPSAwLCBsID0gbWF0Y2gubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCWNsb3NlID0gbWF0Y2hbaV07CgoJCWZvciAoIGogPSAwOyBqIDwgbGl2ZS5sZW5ndGg7IGorKyApIHsKCQkJaGFuZGxlT2JqID0gbGl2ZVtqXTsKCgkJCWlmICggY2xvc2Uuc2VsZWN0b3IgPT09IGhhbmRsZU9iai5zZWxlY3RvciAmJiAoIW5hbWVzcGFjZSB8fCBuYW1lc3BhY2UudGVzdCggaGFuZGxlT2JqLm5hbWVzcGFjZSApKSAmJiAhY2xvc2UuZWxlbS5kaXNhYmxlZCApIHsKCQkJCWVsZW0gPSBjbG9zZS5lbGVtOwoJCQkJcmVsYXRlZCA9IG51bGw7CgoJCQkJLy8gVGhvc2UgdHdvIGV2ZW50cyByZXF1aXJlIGFkZGl0aW9uYWwgY2hlY2tpbmcKCQkJCWlmICggaGFuZGxlT2JqLnByZVR5cGUgPT09ICJtb3VzZWVudGVyIiB8fCBoYW5kbGVPYmoucHJlVHlwZSA9PT0gIm1vdXNlbGVhdmUiICkgewoJCQkJCWV2ZW50LnR5cGUgPSBoYW5kbGVPYmoucHJlVHlwZTsKCQkJCQlyZWxhdGVkID0galF1ZXJ5KCBldmVudC5yZWxhdGVkVGFyZ2V0ICkuY2xvc2VzdCggaGFuZGxlT2JqLnNlbGVjdG9yIClbMF07CgoJCQkJCS8vIE1ha2Ugc3VyZSBub3QgdG8gYWNjaWRlbnRhbGx5IG1hdGNoIGEgY2hpbGQgZWxlbWVudCB3aXRoIHRoZSBzYW1lIHNlbGVjdG9yCgkJCQkJaWYgKCByZWxhdGVkICYmIGpRdWVyeS5jb250YWlucyggZWxlbSwgcmVsYXRlZCApICkgewoJCQkJCQlyZWxhdGVkID0gZWxlbTsKCQkJCQl9CgkJCQl9CgoJCQkJaWYgKCAhcmVsYXRlZCB8fCByZWxhdGVkICE9PSBlbGVtICkgewoJCQkJCWVsZW1zLnB1c2goeyBlbGVtOiBlbGVtLCBoYW5kbGVPYmo6IGhhbmRsZU9iaiwgbGV2ZWw6IGNsb3NlLmxldmVsIH0pOwoJCQkJfQoJCQl9CgkJfQoJfQoKCWZvciAoIGkgPSAwLCBsID0gZWxlbXMubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCW1hdGNoID0gZWxlbXNbaV07CgoJCWlmICggbWF4TGV2ZWwgJiYgbWF0Y2gubGV2ZWwgPiBtYXhMZXZlbCApIHsKCQkJYnJlYWs7CgkJfQoKCQlldmVudC5jdXJyZW50VGFyZ2V0ID0gbWF0Y2guZWxlbTsKCQlldmVudC5kYXRhID0gbWF0Y2guaGFuZGxlT2JqLmRhdGE7CgkJZXZlbnQuaGFuZGxlT2JqID0gbWF0Y2guaGFuZGxlT2JqOwoKCQlyZXQgPSBtYXRjaC5oYW5kbGVPYmoub3JpZ0hhbmRsZXIuYXBwbHkoIG1hdGNoLmVsZW0sIGFyZ3VtZW50cyApOwoKCQlpZiAoIHJldCA9PT0gZmFsc2UgfHwgZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSApIHsKCQkJbWF4TGV2ZWwgPSBtYXRjaC5sZXZlbDsKCgkJCWlmICggcmV0ID09PSBmYWxzZSApIHsKCQkJCXN0b3AgPSBmYWxzZTsKCQkJfQoJCQlpZiAoIGV2ZW50LmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7CgkJCQlicmVhazsKCQkJfQoJCX0KCX0KCglyZXR1cm4gc3RvcDsKfQoKZnVuY3Rpb24gbGl2ZUNvbnZlcnQoIHR5cGUsIHNlbGVjdG9yICkgewoJcmV0dXJuICh0eXBlICYmIHR5cGUgIT09ICIqIiA/IHR5cGUgKyAiLiIgOiAiIikgKyBzZWxlY3Rvci5yZXBsYWNlKHJwZXJpb2QsICJgIikucmVwbGFjZShyc3BhY2VzLCAiJiIpOwp9CgpqUXVlcnkuZWFjaCggKCJibHVyIGZvY3VzIGZvY3VzaW4gZm9jdXNvdXQgbG9hZCByZXNpemUgc2Nyb2xsIHVubG9hZCBjbGljayBkYmxjbGljayAiICsKCSJtb3VzZWRvd24gbW91c2V1cCBtb3VzZW1vdmUgbW91c2VvdmVyIG1vdXNlb3V0IG1vdXNlZW50ZXIgbW91c2VsZWF2ZSAiICsKCSJjaGFuZ2Ugc2VsZWN0IHN1Ym1pdCBrZXlkb3duIGtleXByZXNzIGtleXVwIGVycm9yIikuc3BsaXQoIiAiKSwgZnVuY3Rpb24oIGksIG5hbWUgKSB7CgoJLy8gSGFuZGxlIGV2ZW50IGJpbmRpbmcKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIGRhdGEsIGZuICkgewoJCWlmICggZm4gPT0gbnVsbCApIHsKCQkJZm4gPSBkYXRhOwoJCQlkYXRhID0gbnVsbDsKCQl9CgoJCXJldHVybiBhcmd1bWVudHMubGVuZ3RoID4gMCA/CgkJCXRoaXMuYmluZCggbmFtZSwgZGF0YSwgZm4gKSA6CgkJCXRoaXMudHJpZ2dlciggbmFtZSApOwoJfTsKCglpZiAoIGpRdWVyeS5hdHRyRm4gKSB7CgkJalF1ZXJ5LmF0dHJGblsgbmFtZSBdID0gdHJ1ZTsKCX0KfSk7CgoKCi8qIQogKiBTaXp6bGUgQ1NTIFNlbGVjdG9yIEVuZ2luZQogKiAgQ29weXJpZ2h0IDIwMTEsIFRoZSBEb2pvIEZvdW5kYXRpb24KICogIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQsIEJTRCwgYW5kIEdQTCBMaWNlbnNlcy4KICogIE1vcmUgaW5mb3JtYXRpb246IGh0dHA6Ly9zaXp6bGVqcy5jb20vCiAqLwooZnVuY3Rpb24oKXsKCnZhciBjaHVua2VyID0gLygoPzpcKCg/OlwoW14oKV0rXCl8W14oKV0rKStcKXxcWyg/OlxbW15cW1xdXSpcXXxbJyJdW14nIl0qWyciXXxbXlxbXF0nIl0rKStcXXxcXC58W14gPit+LChcW1xcXSspK3xbPit+XSkoXHMqLFxzKik/KCg/Oi58XHJ8XG4pKikvZywKCWRvbmUgPSAwLAoJdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLAoJaGFzRHVwbGljYXRlID0gZmFsc2UsCgliYXNlSGFzRHVwbGljYXRlID0gdHJ1ZSwKCXJCYWNrc2xhc2ggPSAvXFwvZywKCXJOb25Xb3JkID0gL1xXLzsKCi8vIEhlcmUgd2UgY2hlY2sgaWYgdGhlIEphdmFTY3JpcHQgZW5naW5lIGlzIHVzaW5nIHNvbWUgc29ydCBvZgovLyBvcHRpbWl6YXRpb24gd2hlcmUgaXQgZG9lcyBub3QgYWx3YXlzIGNhbGwgb3VyIGNvbXBhcmlzaW9uCi8vIGZ1bmN0aW9uLiBJZiB0aGF0IGlzIHRoZSBjYXNlLCBkaXNjYXJkIHRoZSBoYXNEdXBsaWNhdGUgdmFsdWUuCi8vICAgVGh1cyBmYXIgdGhhdCBpbmNsdWRlcyBHb29nbGUgQ2hyb21lLgpbMCwgMF0uc29ydChmdW5jdGlvbigpIHsKCWJhc2VIYXNEdXBsaWNhdGUgPSBmYWxzZTsKCXJldHVybiAwOwp9KTsKCnZhciBTaXp6bGUgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKSB7CglyZXN1bHRzID0gcmVzdWx0cyB8fCBbXTsKCWNvbnRleHQgPSBjb250ZXh0IHx8IGRvY3VtZW50OwoKCXZhciBvcmlnQ29udGV4dCA9IGNvbnRleHQ7CgoJaWYgKCBjb250ZXh0Lm5vZGVUeXBlICE9PSAxICYmIGNvbnRleHQubm9kZVR5cGUgIT09IDkgKSB7CgkJcmV0dXJuIFtdOwoJfQoJCglpZiAoICFzZWxlY3RvciB8fCB0eXBlb2Ygc2VsZWN0b3IgIT09ICJzdHJpbmciICkgewoJCXJldHVybiByZXN1bHRzOwoJfQoKCXZhciBtLCBzZXQsIGNoZWNrU2V0LCBleHRyYSwgcmV0LCBjdXIsIHBvcCwgaSwKCQlwcnVuZSA9IHRydWUsCgkJY29udGV4dFhNTCA9IFNpenpsZS5pc1hNTCggY29udGV4dCApLAoJCXBhcnRzID0gW10sCgkJc29GYXIgPSBzZWxlY3RvcjsKCQoJLy8gUmVzZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBjaHVua2VyIHJlZ2V4cCAoc3RhcnQgZnJvbSBoZWFkKQoJZG8gewoJCWNodW5rZXIuZXhlYyggIiIgKTsKCQltID0gY2h1bmtlci5leGVjKCBzb0ZhciApOwoKCQlpZiAoIG0gKSB7CgkJCXNvRmFyID0gbVszXTsKCQkKCQkJcGFydHMucHVzaCggbVsxXSApOwoJCQoJCQlpZiAoIG1bMl0gKSB7CgkJCQlleHRyYSA9IG1bM107CgkJCQlicmVhazsKCQkJfQoJCX0KCX0gd2hpbGUgKCBtICk7CgoJaWYgKCBwYXJ0cy5sZW5ndGggPiAxICYmIG9yaWdQT1MuZXhlYyggc2VsZWN0b3IgKSApIHsKCgkJaWYgKCBwYXJ0cy5sZW5ndGggPT09IDIgJiYgRXhwci5yZWxhdGl2ZVsgcGFydHNbMF0gXSApIHsKCQkJc2V0ID0gcG9zUHJvY2VzcyggcGFydHNbMF0gKyBwYXJ0c1sxXSwgY29udGV4dCApOwoKCQl9IGVsc2UgewoJCQlzZXQgPSBFeHByLnJlbGF0aXZlWyBwYXJ0c1swXSBdID8KCQkJCVsgY29udGV4dCBdIDoKCQkJCVNpenpsZSggcGFydHMuc2hpZnQoKSwgY29udGV4dCApOwoKCQkJd2hpbGUgKCBwYXJ0cy5sZW5ndGggKSB7CgkJCQlzZWxlY3RvciA9IHBhcnRzLnNoaWZ0KCk7CgoJCQkJaWYgKCBFeHByLnJlbGF0aXZlWyBzZWxlY3RvciBdICkgewoJCQkJCXNlbGVjdG9yICs9IHBhcnRzLnNoaWZ0KCk7CgkJCQl9CgkJCQkKCQkJCXNldCA9IHBvc1Byb2Nlc3MoIHNlbGVjdG9yLCBzZXQgKTsKCQkJfQoJCX0KCgl9IGVsc2UgewoJCS8vIFRha2UgYSBzaG9ydGN1dCBhbmQgc2V0IHRoZSBjb250ZXh0IGlmIHRoZSByb290IHNlbGVjdG9yIGlzIGFuIElECgkJLy8gKGJ1dCBub3QgaWYgaXQnbGwgYmUgZmFzdGVyIGlmIHRoZSBpbm5lciBzZWxlY3RvciBpcyBhbiBJRCkKCQlpZiAoICFzZWVkICYmIHBhcnRzLmxlbmd0aCA+IDEgJiYgY29udGV4dC5ub2RlVHlwZSA9PT0gOSAmJiAhY29udGV4dFhNTCAmJgoJCQkJRXhwci5tYXRjaC5JRC50ZXN0KHBhcnRzWzBdKSAmJiAhRXhwci5tYXRjaC5JRC50ZXN0KHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdKSApIHsKCgkJCXJldCA9IFNpenpsZS5maW5kKCBwYXJ0cy5zaGlmdCgpLCBjb250ZXh0LCBjb250ZXh0WE1MICk7CgkJCWNvbnRleHQgPSByZXQuZXhwciA/CgkJCQlTaXp6bGUuZmlsdGVyKCByZXQuZXhwciwgcmV0LnNldCApWzBdIDoKCQkJCXJldC5zZXRbMF07CgkJfQoKCQlpZiAoIGNvbnRleHQgKSB7CgkJCXJldCA9IHNlZWQgPwoJCQkJeyBleHByOiBwYXJ0cy5wb3AoKSwgc2V0OiBtYWtlQXJyYXkoc2VlZCkgfSA6CgkJCQlTaXp6bGUuZmluZCggcGFydHMucG9wKCksIHBhcnRzLmxlbmd0aCA9PT0gMSAmJiAocGFydHNbMF0gPT09ICJ+IiB8fCBwYXJ0c1swXSA9PT0gIisiKSAmJiBjb250ZXh0LnBhcmVudE5vZGUgPyBjb250ZXh0LnBhcmVudE5vZGUgOiBjb250ZXh0LCBjb250ZXh0WE1MICk7CgoJCQlzZXQgPSByZXQuZXhwciA/CgkJCQlTaXp6bGUuZmlsdGVyKCByZXQuZXhwciwgcmV0LnNldCApIDoKCQkJCXJldC5zZXQ7CgoJCQlpZiAoIHBhcnRzLmxlbmd0aCA+IDAgKSB7CgkJCQljaGVja1NldCA9IG1ha2VBcnJheSggc2V0ICk7CgoJCQl9IGVsc2UgewoJCQkJcHJ1bmUgPSBmYWxzZTsKCQkJfQoKCQkJd2hpbGUgKCBwYXJ0cy5sZW5ndGggKSB7CgkJCQljdXIgPSBwYXJ0cy5wb3AoKTsKCQkJCXBvcCA9IGN1cjsKCgkJCQlpZiAoICFFeHByLnJlbGF0aXZlWyBjdXIgXSApIHsKCQkJCQljdXIgPSAiIjsKCQkJCX0gZWxzZSB7CgkJCQkJcG9wID0gcGFydHMucG9wKCk7CgkJCQl9CgoJCQkJaWYgKCBwb3AgPT0gbnVsbCApIHsKCQkJCQlwb3AgPSBjb250ZXh0OwoJCQkJfQoKCQkJCUV4cHIucmVsYXRpdmVbIGN1ciBdKCBjaGVja1NldCwgcG9wLCBjb250ZXh0WE1MICk7CgkJCX0KCgkJfSBlbHNlIHsKCQkJY2hlY2tTZXQgPSBwYXJ0cyA9IFtdOwoJCX0KCX0KCglpZiAoICFjaGVja1NldCApIHsKCQljaGVja1NldCA9IHNldDsKCX0KCglpZiAoICFjaGVja1NldCApIHsKCQlTaXp6bGUuZXJyb3IoIGN1ciB8fCBzZWxlY3RvciApOwoJfQoKCWlmICggdG9TdHJpbmcuY2FsbChjaGVja1NldCkgPT09ICJbb2JqZWN0IEFycmF5XSIgKSB7CgkJaWYgKCAhcHJ1bmUgKSB7CgkJCXJlc3VsdHMucHVzaC5hcHBseSggcmVzdWx0cywgY2hlY2tTZXQgKTsKCgkJfSBlbHNlIGlmICggY29udGV4dCAmJiBjb250ZXh0Lm5vZGVUeXBlID09PSAxICkgewoJCQlmb3IgKCBpID0gMDsgY2hlY2tTZXRbaV0gIT0gbnVsbDsgaSsrICkgewoJCQkJaWYgKCBjaGVja1NldFtpXSAmJiAoY2hlY2tTZXRbaV0gPT09IHRydWUgfHwgY2hlY2tTZXRbaV0ubm9kZVR5cGUgPT09IDEgJiYgU2l6emxlLmNvbnRhaW5zKGNvbnRleHQsIGNoZWNrU2V0W2ldKSkgKSB7CgkJCQkJcmVzdWx0cy5wdXNoKCBzZXRbaV0gKTsKCQkJCX0KCQkJfQoKCQl9IGVsc2UgewoJCQlmb3IgKCBpID0gMDsgY2hlY2tTZXRbaV0gIT0gbnVsbDsgaSsrICkgewoJCQkJaWYgKCBjaGVja1NldFtpXSAmJiBjaGVja1NldFtpXS5ub2RlVHlwZSA9PT0gMSApIHsKCQkJCQlyZXN1bHRzLnB1c2goIHNldFtpXSApOwoJCQkJfQoJCQl9CgkJfQoKCX0gZWxzZSB7CgkJbWFrZUFycmF5KCBjaGVja1NldCwgcmVzdWx0cyApOwoJfQoKCWlmICggZXh0cmEgKSB7CgkJU2l6emxlKCBleHRyYSwgb3JpZ0NvbnRleHQsIHJlc3VsdHMsIHNlZWQgKTsKCQlTaXp6bGUudW5pcXVlU29ydCggcmVzdWx0cyApOwoJfQoKCXJldHVybiByZXN1bHRzOwp9OwoKU2l6emxlLnVuaXF1ZVNvcnQgPSBmdW5jdGlvbiggcmVzdWx0cyApIHsKCWlmICggc29ydE9yZGVyICkgewoJCWhhc0R1cGxpY2F0ZSA9IGJhc2VIYXNEdXBsaWNhdGU7CgkJcmVzdWx0cy5zb3J0KCBzb3J0T3JkZXIgKTsKCgkJaWYgKCBoYXNEdXBsaWNhdGUgKSB7CgkJCWZvciAoIHZhciBpID0gMTsgaSA8IHJlc3VsdHMubGVuZ3RoOyBpKysgKSB7CgkJCQlpZiAoIHJlc3VsdHNbaV0gPT09IHJlc3VsdHNbIGkgLSAxIF0gKSB7CgkJCQkJcmVzdWx0cy5zcGxpY2UoIGktLSwgMSApOwoJCQkJfQoJCQl9CgkJfQoJfQoKCXJldHVybiByZXN1bHRzOwp9OwoKU2l6emxlLm1hdGNoZXMgPSBmdW5jdGlvbiggZXhwciwgc2V0ICkgewoJcmV0dXJuIFNpenpsZSggZXhwciwgbnVsbCwgbnVsbCwgc2V0ICk7Cn07CgpTaXp6bGUubWF0Y2hlc1NlbGVjdG9yID0gZnVuY3Rpb24oIG5vZGUsIGV4cHIgKSB7CglyZXR1cm4gU2l6emxlKCBleHByLCBudWxsLCBudWxsLCBbbm9kZV0gKS5sZW5ndGggPiAwOwp9OwoKU2l6emxlLmZpbmQgPSBmdW5jdGlvbiggZXhwciwgY29udGV4dCwgaXNYTUwgKSB7Cgl2YXIgc2V0OwoKCWlmICggIWV4cHIgKSB7CgkJcmV0dXJuIFtdOwoJfQoKCWZvciAoIHZhciBpID0gMCwgbCA9IEV4cHIub3JkZXIubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCXZhciBtYXRjaCwKCQkJdHlwZSA9IEV4cHIub3JkZXJbaV07CgkJCgkJaWYgKCAobWF0Y2ggPSBFeHByLmxlZnRNYXRjaFsgdHlwZSBdLmV4ZWMoIGV4cHIgKSkgKSB7CgkJCXZhciBsZWZ0ID0gbWF0Y2hbMV07CgkJCW1hdGNoLnNwbGljZSggMSwgMSApOwoKCQkJaWYgKCBsZWZ0LnN1YnN0ciggbGVmdC5sZW5ndGggLSAxICkgIT09ICJcXCIgKSB7CgkJCQltYXRjaFsxXSA9IChtYXRjaFsxXSB8fCAiIikucmVwbGFjZSggckJhY2tzbGFzaCwgIiIgKTsKCQkJCXNldCA9IEV4cHIuZmluZFsgdHlwZSBdKCBtYXRjaCwgY29udGV4dCwgaXNYTUwgKTsKCgkJCQlpZiAoIHNldCAhPSBudWxsICkgewoJCQkJCWV4cHIgPSBleHByLnJlcGxhY2UoIEV4cHIubWF0Y2hbIHR5cGUgXSwgIiIgKTsKCQkJCQlicmVhazsKCQkJCX0KCQkJfQoJCX0KCX0KCglpZiAoICFzZXQgKSB7CgkJc2V0ID0gdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09ICJ1bmRlZmluZWQiID8KCQkJY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggIioiICkgOgoJCQlbXTsKCX0KCglyZXR1cm4geyBzZXQ6IHNldCwgZXhwcjogZXhwciB9Owp9OwoKU2l6emxlLmZpbHRlciA9IGZ1bmN0aW9uKCBleHByLCBzZXQsIGlucGxhY2UsIG5vdCApIHsKCXZhciBtYXRjaCwgYW55Rm91bmQsCgkJb2xkID0gZXhwciwKCQlyZXN1bHQgPSBbXSwKCQljdXJMb29wID0gc2V0LAoJCWlzWE1MRmlsdGVyID0gc2V0ICYmIHNldFswXSAmJiBTaXp6bGUuaXNYTUwoIHNldFswXSApOwoKCXdoaWxlICggZXhwciAmJiBzZXQubGVuZ3RoICkgewoJCWZvciAoIHZhciB0eXBlIGluIEV4cHIuZmlsdGVyICkgewoJCQlpZiAoIChtYXRjaCA9IEV4cHIubGVmdE1hdGNoWyB0eXBlIF0uZXhlYyggZXhwciApKSAhPSBudWxsICYmIG1hdGNoWzJdICkgewoJCQkJdmFyIGZvdW5kLCBpdGVtLAoJCQkJCWZpbHRlciA9IEV4cHIuZmlsdGVyWyB0eXBlIF0sCgkJCQkJbGVmdCA9IG1hdGNoWzFdOwoKCQkJCWFueUZvdW5kID0gZmFsc2U7CgoJCQkJbWF0Y2guc3BsaWNlKDEsMSk7CgoJCQkJaWYgKCBsZWZ0LnN1YnN0ciggbGVmdC5sZW5ndGggLSAxICkgPT09ICJcXCIgKSB7CgkJCQkJY29udGludWU7CgkJCQl9CgoJCQkJaWYgKCBjdXJMb29wID09PSByZXN1bHQgKSB7CgkJCQkJcmVzdWx0ID0gW107CgkJCQl9CgoJCQkJaWYgKCBFeHByLnByZUZpbHRlclsgdHlwZSBdICkgewoJCQkJCW1hdGNoID0gRXhwci5wcmVGaWx0ZXJbIHR5cGUgXSggbWF0Y2gsIGN1ckxvb3AsIGlucGxhY2UsIHJlc3VsdCwgbm90LCBpc1hNTEZpbHRlciApOwoKCQkJCQlpZiAoICFtYXRjaCApIHsKCQkJCQkJYW55Rm91bmQgPSBmb3VuZCA9IHRydWU7CgoJCQkJCX0gZWxzZSBpZiAoIG1hdGNoID09PSB0cnVlICkgewoJCQkJCQljb250aW51ZTsKCQkJCQl9CgkJCQl9CgoJCQkJaWYgKCBtYXRjaCApIHsKCQkJCQlmb3IgKCB2YXIgaSA9IDA7IChpdGVtID0gY3VyTG9vcFtpXSkgIT0gbnVsbDsgaSsrICkgewoJCQkJCQlpZiAoIGl0ZW0gKSB7CgkJCQkJCQlmb3VuZCA9IGZpbHRlciggaXRlbSwgbWF0Y2gsIGksIGN1ckxvb3AgKTsKCQkJCQkJCXZhciBwYXNzID0gbm90IF4gISFmb3VuZDsKCgkJCQkJCQlpZiAoIGlucGxhY2UgJiYgZm91bmQgIT0gbnVsbCApIHsKCQkJCQkJCQlpZiAoIHBhc3MgKSB7CgkJCQkJCQkJCWFueUZvdW5kID0gdHJ1ZTsKCgkJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQkJY3VyTG9vcFtpXSA9IGZhbHNlOwoJCQkJCQkJCX0KCgkJCQkJCQl9IGVsc2UgaWYgKCBwYXNzICkgewoJCQkJCQkJCXJlc3VsdC5wdXNoKCBpdGVtICk7CgkJCQkJCQkJYW55Rm91bmQgPSB0cnVlOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoJCQkJfQoKCQkJCWlmICggZm91bmQgIT09IHVuZGVmaW5lZCApIHsKCQkJCQlpZiAoICFpbnBsYWNlICkgewoJCQkJCQljdXJMb29wID0gcmVzdWx0OwoJCQkJCX0KCgkJCQkJZXhwciA9IGV4cHIucmVwbGFjZSggRXhwci5tYXRjaFsgdHlwZSBdLCAiIiApOwoKCQkJCQlpZiAoICFhbnlGb3VuZCApIHsKCQkJCQkJcmV0dXJuIFtdOwoJCQkJCX0KCgkJCQkJYnJlYWs7CgkJCQl9CgkJCX0KCQl9CgoJCS8vIEltcHJvcGVyIGV4cHJlc3Npb24KCQlpZiAoIGV4cHIgPT09IG9sZCApIHsKCQkJaWYgKCBhbnlGb3VuZCA9PSBudWxsICkgewoJCQkJU2l6emxlLmVycm9yKCBleHByICk7CgoJCQl9IGVsc2UgewoJCQkJYnJlYWs7CgkJCX0KCQl9CgoJCW9sZCA9IGV4cHI7Cgl9CgoJcmV0dXJuIGN1ckxvb3A7Cn07CgpTaXp6bGUuZXJyb3IgPSBmdW5jdGlvbiggbXNnICkgewoJdGhyb3cgIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIgKyBtc2c7Cn07Cgp2YXIgRXhwciA9IFNpenpsZS5zZWxlY3RvcnMgPSB7CglvcmRlcjogWyAiSUQiLCAiTkFNRSIsICJUQUciIF0sCgoJbWF0Y2g6IHsKCQlJRDogLyMoKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKykvLAoJCUNMQVNTOiAvXC4oKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKykvLAoJCU5BTUU6IC9cW25hbWU9WyciXSooKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKylbJyJdKlxdLywKCQlBVFRSOiAvXFtccyooKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKylccyooPzooXFM/PSlccyooPzooWyciXSkoLio/KVwzfCgjPyg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSopfCl8KVxzKlxdLywKCQlUQUc6IC9eKCg/Oltcd1x1MDBjMC1cdUZGRkZcKlwtXXxcXC4pKykvLAoJCUNISUxEOiAvOihvbmx5fG50aHxsYXN0fGZpcnN0KS1jaGlsZCg/OlwoXHMqKGV2ZW58b2RkfCg/OlsrXC1dP1xkK3woPzpbK1wtXT9cZCopP25ccyooPzpbK1wtXVxzKlxkKyk/KSlccypcKSk/LywKCQlQT1M6IC86KG50aHxlcXxndHxsdHxmaXJzdHxsYXN0fGV2ZW58b2RkKSg/OlwoKFxkKilcKSk/KD89W15cLV18JCkvLAoJCVBTRVVETzogLzooKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKykoPzpcKChbJyJdPykoKD86XChbXlwpXStcKXxbXlwoXCldKikrKVwyXCkpPy8KCX0sCgoJbGVmdE1hdGNoOiB7fSwKCglhdHRyTWFwOiB7CgkJImNsYXNzIjogImNsYXNzTmFtZSIsCgkJImZvciI6ICJodG1sRm9yIgoJfSwKCglhdHRySGFuZGxlOiB7CgkJaHJlZjogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXJldHVybiBlbGVtLmdldEF0dHJpYnV0ZSggImhyZWYiICk7CgkJfSwKCQl0eXBlOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCAidHlwZSIgKTsKCQl9Cgl9LAoKCXJlbGF0aXZlOiB7CgkJIisiOiBmdW5jdGlvbihjaGVja1NldCwgcGFydCl7CgkJCXZhciBpc1BhcnRTdHIgPSB0eXBlb2YgcGFydCA9PT0gInN0cmluZyIsCgkJCQlpc1RhZyA9IGlzUGFydFN0ciAmJiAhck5vbldvcmQudGVzdCggcGFydCApLAoJCQkJaXNQYXJ0U3RyTm90VGFnID0gaXNQYXJ0U3RyICYmICFpc1RhZzsKCgkJCWlmICggaXNUYWcgKSB7CgkJCQlwYXJ0ID0gcGFydC50b0xvd2VyQ2FzZSgpOwoJCQl9CgoJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBjaGVja1NldC5sZW5ndGgsIGVsZW07IGkgPCBsOyBpKysgKSB7CgkJCQlpZiAoIChlbGVtID0gY2hlY2tTZXRbaV0pICkgewoJCQkJCXdoaWxlICggKGVsZW0gPSBlbGVtLnByZXZpb3VzU2libGluZykgJiYgZWxlbS5ub2RlVHlwZSAhPT0gMSApIHt9CgoJCQkJCWNoZWNrU2V0W2ldID0gaXNQYXJ0U3RyTm90VGFnIHx8IGVsZW0gJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBwYXJ0ID8KCQkJCQkJZWxlbSB8fCBmYWxzZSA6CgkJCQkJCWVsZW0gPT09IHBhcnQ7CgkJCQl9CgkJCX0KCgkJCWlmICggaXNQYXJ0U3RyTm90VGFnICkgewoJCQkJU2l6emxlLmZpbHRlciggcGFydCwgY2hlY2tTZXQsIHRydWUgKTsKCQkJfQoJCX0sCgoJCSI+IjogZnVuY3Rpb24oIGNoZWNrU2V0LCBwYXJ0ICkgewoJCQl2YXIgZWxlbSwKCQkJCWlzUGFydFN0ciA9IHR5cGVvZiBwYXJ0ID09PSAic3RyaW5nIiwKCQkJCWkgPSAwLAoJCQkJbCA9IGNoZWNrU2V0Lmxlbmd0aDsKCgkJCWlmICggaXNQYXJ0U3RyICYmICFyTm9uV29yZC50ZXN0KCBwYXJ0ICkgKSB7CgkJCQlwYXJ0ID0gcGFydC50b0xvd2VyQ2FzZSgpOwoKCQkJCWZvciAoIDsgaSA8IGw7IGkrKyApIHsKCQkJCQllbGVtID0gY2hlY2tTZXRbaV07CgoJCQkJCWlmICggZWxlbSApIHsKCQkJCQkJdmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTsKCQkJCQkJY2hlY2tTZXRbaV0gPSBwYXJlbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gcGFydCA/IHBhcmVudCA6IGZhbHNlOwoJCQkJCX0KCQkJCX0KCgkJCX0gZWxzZSB7CgkJCQlmb3IgKCA7IGkgPCBsOyBpKysgKSB7CgkJCQkJZWxlbSA9IGNoZWNrU2V0W2ldOwoKCQkJCQlpZiAoIGVsZW0gKSB7CgkJCQkJCWNoZWNrU2V0W2ldID0gaXNQYXJ0U3RyID8KCQkJCQkJCWVsZW0ucGFyZW50Tm9kZSA6CgkJCQkJCQllbGVtLnBhcmVudE5vZGUgPT09IHBhcnQ7CgkJCQkJfQoJCQkJfQoKCQkJCWlmICggaXNQYXJ0U3RyICkgewoJCQkJCVNpenpsZS5maWx0ZXIoIHBhcnQsIGNoZWNrU2V0LCB0cnVlICk7CgkJCQl9CgkJCX0KCQl9LAoKCQkiIjogZnVuY3Rpb24oY2hlY2tTZXQsIHBhcnQsIGlzWE1MKXsKCQkJdmFyIG5vZGVDaGVjaywKCQkJCWRvbmVOYW1lID0gZG9uZSsrLAoJCQkJY2hlY2tGbiA9IGRpckNoZWNrOwoKCQkJaWYgKCB0eXBlb2YgcGFydCA9PT0gInN0cmluZyIgJiYgIXJOb25Xb3JkLnRlc3QoIHBhcnQgKSApIHsKCQkJCXBhcnQgPSBwYXJ0LnRvTG93ZXJDYXNlKCk7CgkJCQlub2RlQ2hlY2sgPSBwYXJ0OwoJCQkJY2hlY2tGbiA9IGRpck5vZGVDaGVjazsKCQkJfQoKCQkJY2hlY2tGbiggInBhcmVudE5vZGUiLCBwYXJ0LCBkb25lTmFtZSwgY2hlY2tTZXQsIG5vZGVDaGVjaywgaXNYTUwgKTsKCQl9LAoKCQkifiI6IGZ1bmN0aW9uKCBjaGVja1NldCwgcGFydCwgaXNYTUwgKSB7CgkJCXZhciBub2RlQ2hlY2ssCgkJCQlkb25lTmFtZSA9IGRvbmUrKywKCQkJCWNoZWNrRm4gPSBkaXJDaGVjazsKCgkJCWlmICggdHlwZW9mIHBhcnQgPT09ICJzdHJpbmciICYmICFyTm9uV29yZC50ZXN0KCBwYXJ0ICkgKSB7CgkJCQlwYXJ0ID0gcGFydC50b0xvd2VyQ2FzZSgpOwoJCQkJbm9kZUNoZWNrID0gcGFydDsKCQkJCWNoZWNrRm4gPSBkaXJOb2RlQ2hlY2s7CgkJCX0KCgkJCWNoZWNrRm4oICJwcmV2aW91c1NpYmxpbmciLCBwYXJ0LCBkb25lTmFtZSwgY2hlY2tTZXQsIG5vZGVDaGVjaywgaXNYTUwgKTsKCQl9Cgl9LAoKCWZpbmQ6IHsKCQlJRDogZnVuY3Rpb24oIG1hdGNoLCBjb250ZXh0LCBpc1hNTCApIHsKCQkJaWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50QnlJZCAhPT0gInVuZGVmaW5lZCIgJiYgIWlzWE1MICkgewoJCQkJdmFyIG0gPSBjb250ZXh0LmdldEVsZW1lbnRCeUlkKG1hdGNoWzFdKTsKCQkJCS8vIENoZWNrIHBhcmVudE5vZGUgdG8gY2F0Y2ggd2hlbiBCbGFja2JlcnJ5IDQuNiByZXR1cm5zCgkJCQkvLyBub2RlcyB0aGF0IGFyZSBubyBsb25nZXIgaW4gdGhlIGRvY3VtZW50ICM2OTYzCgkJCQlyZXR1cm4gbSAmJiBtLnBhcmVudE5vZGUgPyBbbV0gOiBbXTsKCQkJfQoJCX0sCgoJCU5BTUU6IGZ1bmN0aW9uKCBtYXRjaCwgY29udGV4dCApIHsKCQkJaWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5TmFtZSAhPT0gInVuZGVmaW5lZCIgKSB7CgkJCQl2YXIgcmV0ID0gW10sCgkJCQkJcmVzdWx0cyA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeU5hbWUoIG1hdGNoWzFdICk7CgoJCQkJZm9yICggdmFyIGkgPSAwLCBsID0gcmVzdWx0cy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CgkJCQkJaWYgKCByZXN1bHRzW2ldLmdldEF0dHJpYnV0ZSgibmFtZSIpID09PSBtYXRjaFsxXSApIHsKCQkJCQkJcmV0LnB1c2goIHJlc3VsdHNbaV0gKTsKCQkJCQl9CgkJCQl9CgoJCQkJcmV0dXJuIHJldC5sZW5ndGggPT09IDAgPyBudWxsIDogcmV0OwoJCQl9CgkJfSwKCgkJVEFHOiBmdW5jdGlvbiggbWF0Y2gsIGNvbnRleHQgKSB7CgkJCWlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09ICJ1bmRlZmluZWQiICkgewoJCQkJcmV0dXJuIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIG1hdGNoWzFdICk7CgkJCX0KCQl9Cgl9LAoJcHJlRmlsdGVyOiB7CgkJQ0xBU1M6IGZ1bmN0aW9uKCBtYXRjaCwgY3VyTG9vcCwgaW5wbGFjZSwgcmVzdWx0LCBub3QsIGlzWE1MICkgewoJCQltYXRjaCA9ICIgIiArIG1hdGNoWzFdLnJlcGxhY2UoIHJCYWNrc2xhc2gsICIiICkgKyAiICI7CgoJCQlpZiAoIGlzWE1MICkgewoJCQkJcmV0dXJuIG1hdGNoOwoJCQl9CgoJCQlmb3IgKCB2YXIgaSA9IDAsIGVsZW07IChlbGVtID0gY3VyTG9vcFtpXSkgIT0gbnVsbDsgaSsrICkgewoJCQkJaWYgKCBlbGVtICkgewoJCQkJCWlmICggbm90IF4gKGVsZW0uY2xhc3NOYW1lICYmICgiICIgKyBlbGVtLmNsYXNzTmFtZSArICIgIikucmVwbGFjZSgvW1x0XG5ccl0vZywgIiAiKS5pbmRleE9mKG1hdGNoKSA+PSAwKSApIHsKCQkJCQkJaWYgKCAhaW5wbGFjZSApIHsKCQkJCQkJCXJlc3VsdC5wdXNoKCBlbGVtICk7CgkJCQkJCX0KCgkJCQkJfSBlbHNlIGlmICggaW5wbGFjZSApIHsKCQkJCQkJY3VyTG9vcFtpXSA9IGZhbHNlOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJcmV0dXJuIGZhbHNlOwoJCX0sCgoJCUlEOiBmdW5jdGlvbiggbWF0Y2ggKSB7CgkJCXJldHVybiBtYXRjaFsxXS5yZXBsYWNlKCByQmFja3NsYXNoLCAiIiApOwoJCX0sCgoJCVRBRzogZnVuY3Rpb24oIG1hdGNoLCBjdXJMb29wICkgewoJCQlyZXR1cm4gbWF0Y2hbMV0ucmVwbGFjZSggckJhY2tzbGFzaCwgIiIgKS50b0xvd2VyQ2FzZSgpOwoJCX0sCgoJCUNISUxEOiBmdW5jdGlvbiggbWF0Y2ggKSB7CgkJCWlmICggbWF0Y2hbMV0gPT09ICJudGgiICkgewoJCQkJaWYgKCAhbWF0Y2hbMl0gKSB7CgkJCQkJU2l6emxlLmVycm9yKCBtYXRjaFswXSApOwoJCQkJfQoKCQkJCW1hdGNoWzJdID0gbWF0Y2hbMl0ucmVwbGFjZSgvXlwrfFxzKi9nLCAnJyk7CgoJCQkJLy8gcGFyc2UgZXF1YXRpb25zIGxpa2UgJ2V2ZW4nLCAnb2RkJywgJzUnLCAnMm4nLCAnM24rMicsICc0bi0xJywgJy1uKzYnCgkJCQl2YXIgdGVzdCA9IC8oLT8pKFxkKikoPzpuKFsrXC1dP1xkKikpPy8uZXhlYygKCQkJCQltYXRjaFsyXSA9PT0gImV2ZW4iICYmICIybiIgfHwgbWF0Y2hbMl0gPT09ICJvZGQiICYmICIybisxIiB8fAoJCQkJCSEvXEQvLnRlc3QoIG1hdGNoWzJdICkgJiYgIjBuKyIgKyBtYXRjaFsyXSB8fCBtYXRjaFsyXSk7CgoJCQkJLy8gY2FsY3VsYXRlIHRoZSBudW1iZXJzIChmaXJzdCluKyhsYXN0KSBpbmNsdWRpbmcgaWYgdGhleSBhcmUgbmVnYXRpdmUKCQkJCW1hdGNoWzJdID0gKHRlc3RbMV0gKyAodGVzdFsyXSB8fCAxKSkgLSAwOwoJCQkJbWF0Y2hbM10gPSB0ZXN0WzNdIC0gMDsKCQkJfQoJCQllbHNlIGlmICggbWF0Y2hbMl0gKSB7CgkJCQlTaXp6bGUuZXJyb3IoIG1hdGNoWzBdICk7CgkJCX0KCgkJCS8vIFRPRE86IE1vdmUgdG8gbm9ybWFsIGNhY2hpbmcgc3lzdGVtCgkJCW1hdGNoWzBdID0gZG9uZSsrOwoKCQkJcmV0dXJuIG1hdGNoOwoJCX0sCgoJCUFUVFI6IGZ1bmN0aW9uKCBtYXRjaCwgY3VyTG9vcCwgaW5wbGFjZSwgcmVzdWx0LCBub3QsIGlzWE1MICkgewoJCQl2YXIgbmFtZSA9IG1hdGNoWzFdID0gbWF0Y2hbMV0ucmVwbGFjZSggckJhY2tzbGFzaCwgIiIgKTsKCQkJCgkJCWlmICggIWlzWE1MICYmIEV4cHIuYXR0ck1hcFtuYW1lXSApIHsKCQkJCW1hdGNoWzFdID0gRXhwci5hdHRyTWFwW25hbWVdOwoJCQl9CgoJCQkvLyBIYW5kbGUgaWYgYW4gdW4tcXVvdGVkIHZhbHVlIHdhcyB1c2VkCgkJCW1hdGNoWzRdID0gKCBtYXRjaFs0XSB8fCBtYXRjaFs1XSB8fCAiIiApLnJlcGxhY2UoIHJCYWNrc2xhc2gsICIiICk7CgoJCQlpZiAoIG1hdGNoWzJdID09PSAifj0iICkgewoJCQkJbWF0Y2hbNF0gPSAiICIgKyBtYXRjaFs0XSArICIgIjsKCQkJfQoKCQkJcmV0dXJuIG1hdGNoOwoJCX0sCgoJCVBTRVVETzogZnVuY3Rpb24oIG1hdGNoLCBjdXJMb29wLCBpbnBsYWNlLCByZXN1bHQsIG5vdCApIHsKCQkJaWYgKCBtYXRjaFsxXSA9PT0gIm5vdCIgKSB7CgkJCQkvLyBJZiB3ZSdyZSBkZWFsaW5nIHdpdGggYSBjb21wbGV4IGV4cHJlc3Npb24sIG9yIGEgc2ltcGxlIG9uZQoJCQkJaWYgKCAoIGNodW5rZXIuZXhlYyhtYXRjaFszXSkgfHwgIiIgKS5sZW5ndGggPiAxIHx8IC9eXHcvLnRlc3QobWF0Y2hbM10pICkgewoJCQkJCW1hdGNoWzNdID0gU2l6emxlKG1hdGNoWzNdLCBudWxsLCBudWxsLCBjdXJMb29wKTsKCgkJCQl9IGVsc2UgewoJCQkJCXZhciByZXQgPSBTaXp6bGUuZmlsdGVyKG1hdGNoWzNdLCBjdXJMb29wLCBpbnBsYWNlLCB0cnVlIF4gbm90KTsKCgkJCQkJaWYgKCAhaW5wbGFjZSApIHsKCQkJCQkJcmVzdWx0LnB1c2guYXBwbHkoIHJlc3VsdCwgcmV0ICk7CgkJCQkJfQoKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9CgoJCQl9IGVsc2UgaWYgKCBFeHByLm1hdGNoLlBPUy50ZXN0KCBtYXRjaFswXSApIHx8IEV4cHIubWF0Y2guQ0hJTEQudGVzdCggbWF0Y2hbMF0gKSApIHsKCQkJCXJldHVybiB0cnVlOwoJCQl9CgkJCQoJCQlyZXR1cm4gbWF0Y2g7CgkJfSwKCgkJUE9TOiBmdW5jdGlvbiggbWF0Y2ggKSB7CgkJCW1hdGNoLnVuc2hpZnQoIHRydWUgKTsKCgkJCXJldHVybiBtYXRjaDsKCQl9Cgl9LAoJCglmaWx0ZXJzOiB7CgkJZW5hYmxlZDogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXJldHVybiBlbGVtLmRpc2FibGVkID09PSBmYWxzZSAmJiBlbGVtLnR5cGUgIT09ICJoaWRkZW4iOwoJCX0sCgoJCWRpc2FibGVkOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJcmV0dXJuIGVsZW0uZGlzYWJsZWQgPT09IHRydWU7CgkJfSwKCgkJY2hlY2tlZDogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXJldHVybiBlbGVtLmNoZWNrZWQgPT09IHRydWU7CgkJfSwKCQkKCQlzZWxlY3RlZDogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCS8vIEFjY2Vzc2luZyB0aGlzIHByb3BlcnR5IG1ha2VzIHNlbGVjdGVkLWJ5LWRlZmF1bHQKCQkJLy8gb3B0aW9ucyBpbiBTYWZhcmkgd29yayBwcm9wZXJseQoJCQlpZiAoIGVsZW0ucGFyZW50Tm9kZSApIHsKCQkJCWVsZW0ucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4OwoJCQl9CgkJCQoJCQlyZXR1cm4gZWxlbS5zZWxlY3RlZCA9PT0gdHJ1ZTsKCQl9LAoKCQlwYXJlbnQ6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQlyZXR1cm4gISFlbGVtLmZpcnN0Q2hpbGQ7CgkJfSwKCgkJZW1wdHk6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQlyZXR1cm4gIWVsZW0uZmlyc3RDaGlsZDsKCQl9LAoKCQloYXM6IGZ1bmN0aW9uKCBlbGVtLCBpLCBtYXRjaCApIHsKCQkJcmV0dXJuICEhU2l6emxlKCBtYXRjaFszXSwgZWxlbSApLmxlbmd0aDsKCQl9LAoKCQloZWFkZXI6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQlyZXR1cm4gKC9oXGQvaSkudGVzdCggZWxlbS5ub2RlTmFtZSApOwoJCX0sCgoJCXRleHQ6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQl2YXIgYXR0ciA9IGVsZW0uZ2V0QXR0cmlidXRlKCAidHlwZSIgKSwgdHlwZSA9IGVsZW0udHlwZTsKCQkJLy8gSUU2IGFuZCA3IHdpbGwgbWFwIGVsZW0udHlwZSB0byAndGV4dCcgZm9yIG5ldyBIVE1MNSB0eXBlcyAoc2VhcmNoLCBldGMpIAoJCQkvLyB1c2UgZ2V0QXR0cmlidXRlIGluc3RlYWQgdG8gdGVzdCB0aGlzIGNhc2UKCQkJcmV0dXJuIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gImlucHV0IiAmJiAidGV4dCIgPT09IHR5cGUgJiYgKCBhdHRyID09PSB0eXBlIHx8IGF0dHIgPT09IG51bGwgKTsKCQl9LAoKCQlyYWRpbzogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXJldHVybiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICJpbnB1dCIgJiYgInJhZGlvIiA9PT0gZWxlbS50eXBlOwoJCX0sCgoJCWNoZWNrYm94OiBmdW5jdGlvbiggZWxlbSApIHsKCQkJcmV0dXJuIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gImlucHV0IiAmJiAiY2hlY2tib3giID09PSBlbGVtLnR5cGU7CgkJfSwKCgkJZmlsZTogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXJldHVybiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICJpbnB1dCIgJiYgImZpbGUiID09PSBlbGVtLnR5cGU7CgkJfSwKCgkJcGFzc3dvcmQ6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQlyZXR1cm4gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAiaW5wdXQiICYmICJwYXNzd29yZCIgPT09IGVsZW0udHlwZTsKCQl9LAoKCQlzdWJtaXQ6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQl2YXIgbmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKCQkJcmV0dXJuIChuYW1lID09PSAiaW5wdXQiIHx8IG5hbWUgPT09ICJidXR0b24iKSAmJiAic3VibWl0IiA9PT0gZWxlbS50eXBlOwoJCX0sCgoJCWltYWdlOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJcmV0dXJuIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gImlucHV0IiAmJiAiaW1hZ2UiID09PSBlbGVtLnR5cGU7CgkJfSwKCgkJcmVzZXQ6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQl2YXIgbmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKCQkJcmV0dXJuIChuYW1lID09PSAiaW5wdXQiIHx8IG5hbWUgPT09ICJidXR0b24iKSAmJiAicmVzZXQiID09PSBlbGVtLnR5cGU7CgkJfSwKCgkJYnV0dG9uOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJdmFyIG5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7CgkJCXJldHVybiBuYW1lID09PSAiaW5wdXQiICYmICJidXR0b24iID09PSBlbGVtLnR5cGUgfHwgbmFtZSA9PT0gImJ1dHRvbiI7CgkJfSwKCgkJaW5wdXQ6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQlyZXR1cm4gKC9pbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uL2kpLnRlc3QoIGVsZW0ubm9kZU5hbWUgKTsKCQl9LAoKCQlmb2N1czogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXJldHVybiBlbGVtID09PSBlbGVtLm93bmVyRG9jdW1lbnQuYWN0aXZlRWxlbWVudDsKCQl9Cgl9LAoJc2V0RmlsdGVyczogewoJCWZpcnN0OiBmdW5jdGlvbiggZWxlbSwgaSApIHsKCQkJcmV0dXJuIGkgPT09IDA7CgkJfSwKCgkJbGFzdDogZnVuY3Rpb24oIGVsZW0sIGksIG1hdGNoLCBhcnJheSApIHsKCQkJcmV0dXJuIGkgPT09IGFycmF5Lmxlbmd0aCAtIDE7CgkJfSwKCgkJZXZlbjogZnVuY3Rpb24oIGVsZW0sIGkgKSB7CgkJCXJldHVybiBpICUgMiA9PT0gMDsKCQl9LAoKCQlvZGQ6IGZ1bmN0aW9uKCBlbGVtLCBpICkgewoJCQlyZXR1cm4gaSAlIDIgPT09IDE7CgkJfSwKCgkJbHQ6IGZ1bmN0aW9uKCBlbGVtLCBpLCBtYXRjaCApIHsKCQkJcmV0dXJuIGkgPCBtYXRjaFszXSAtIDA7CgkJfSwKCgkJZ3Q6IGZ1bmN0aW9uKCBlbGVtLCBpLCBtYXRjaCApIHsKCQkJcmV0dXJuIGkgPiBtYXRjaFszXSAtIDA7CgkJfSwKCgkJbnRoOiBmdW5jdGlvbiggZWxlbSwgaSwgbWF0Y2ggKSB7CgkJCXJldHVybiBtYXRjaFszXSAtIDAgPT09IGk7CgkJfSwKCgkJZXE6IGZ1bmN0aW9uKCBlbGVtLCBpLCBtYXRjaCApIHsKCQkJcmV0dXJuIG1hdGNoWzNdIC0gMCA9PT0gaTsKCQl9Cgl9LAoJZmlsdGVyOiB7CgkJUFNFVURPOiBmdW5jdGlvbiggZWxlbSwgbWF0Y2gsIGksIGFycmF5ICkgewoJCQl2YXIgbmFtZSA9IG1hdGNoWzFdLAoJCQkJZmlsdGVyID0gRXhwci5maWx0ZXJzWyBuYW1lIF07CgoJCQlpZiAoIGZpbHRlciApIHsKCQkJCXJldHVybiBmaWx0ZXIoIGVsZW0sIGksIG1hdGNoLCBhcnJheSApOwoKCQkJfSBlbHNlIGlmICggbmFtZSA9PT0gImNvbnRhaW5zIiApIHsKCQkJCXJldHVybiAoZWxlbS50ZXh0Q29udGVudCB8fCBlbGVtLmlubmVyVGV4dCB8fCBTaXp6bGUuZ2V0VGV4dChbIGVsZW0gXSkgfHwgIiIpLmluZGV4T2YobWF0Y2hbM10pID49IDA7CgoJCQl9IGVsc2UgaWYgKCBuYW1lID09PSAibm90IiApIHsKCQkJCXZhciBub3QgPSBtYXRjaFszXTsKCgkJCQlmb3IgKCB2YXIgaiA9IDAsIGwgPSBub3QubGVuZ3RoOyBqIDwgbDsgaisrICkgewoJCQkJCWlmICggbm90W2pdID09PSBlbGVtICkgewoJCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQkJfQoJCQkJfQoKCQkJCXJldHVybiB0cnVlOwoKCQkJfSBlbHNlIHsKCQkJCVNpenpsZS5lcnJvciggbmFtZSApOwoJCQl9CgkJfSwKCgkJQ0hJTEQ6IGZ1bmN0aW9uKCBlbGVtLCBtYXRjaCApIHsKCQkJdmFyIHR5cGUgPSBtYXRjaFsxXSwKCQkJCW5vZGUgPSBlbGVtOwoKCQkJc3dpdGNoICggdHlwZSApIHsKCQkJCWNhc2UgIm9ubHkiOgoJCQkJY2FzZSAiZmlyc3QiOgoJCQkJCXdoaWxlICggKG5vZGUgPSBub2RlLnByZXZpb3VzU2libGluZykgKQkgewoJCQkJCQlpZiAoIG5vZGUubm9kZVR5cGUgPT09IDEgKSB7IAoJCQkJCQkJcmV0dXJuIGZhbHNlOyAKCQkJCQkJfQoJCQkJCX0KCgkJCQkJaWYgKCB0eXBlID09PSAiZmlyc3QiICkgeyAKCQkJCQkJcmV0dXJuIHRydWU7IAoJCQkJCX0KCgkJCQkJbm9kZSA9IGVsZW07CgoJCQkJY2FzZSAibGFzdCI6CgkJCQkJd2hpbGUgKCAobm9kZSA9IG5vZGUubmV4dFNpYmxpbmcpICkJIHsKCQkJCQkJaWYgKCBub2RlLm5vZGVUeXBlID09PSAxICkgeyAKCQkJCQkJCXJldHVybiBmYWxzZTsgCgkJCQkJCX0KCQkJCQl9CgoJCQkJCXJldHVybiB0cnVlOwoKCQkJCWNhc2UgIm50aCI6CgkJCQkJdmFyIGZpcnN0ID0gbWF0Y2hbMl0sCgkJCQkJCWxhc3QgPSBtYXRjaFszXTsKCgkJCQkJaWYgKCBmaXJzdCA9PT0gMSAmJiBsYXN0ID09PSAwICkgewoJCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCQl9CgkJCQkJCgkJCQkJdmFyIGRvbmVOYW1lID0gbWF0Y2hbMF0sCgkJCQkJCXBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTsKCQoJCQkJCWlmICggcGFyZW50ICYmIChwYXJlbnQuc2l6Y2FjaGUgIT09IGRvbmVOYW1lIHx8ICFlbGVtLm5vZGVJbmRleCkgKSB7CgkJCQkJCXZhciBjb3VudCA9IDA7CgkJCQkJCQoJCQkJCQlmb3IgKCBub2RlID0gcGFyZW50LmZpcnN0Q2hpbGQ7IG5vZGU7IG5vZGUgPSBub2RlLm5leHRTaWJsaW5nICkgewoJCQkJCQkJaWYgKCBub2RlLm5vZGVUeXBlID09PSAxICkgewoJCQkJCQkJCW5vZGUubm9kZUluZGV4ID0gKytjb3VudDsKCQkJCQkJCX0KCQkJCQkJfSAKCgkJCQkJCXBhcmVudC5zaXpjYWNoZSA9IGRvbmVOYW1lOwoJCQkJCX0KCQkJCQkKCQkJCQl2YXIgZGlmZiA9IGVsZW0ubm9kZUluZGV4IC0gbGFzdDsKCgkJCQkJaWYgKCBmaXJzdCA9PT0gMCApIHsKCQkJCQkJcmV0dXJuIGRpZmYgPT09IDA7CgoJCQkJCX0gZWxzZSB7CgkJCQkJCXJldHVybiAoIGRpZmYgJSBmaXJzdCA9PT0gMCAmJiBkaWZmIC8gZmlyc3QgPj0gMCApOwoJCQkJCX0KCQkJfQoJCX0sCgoJCUlEOiBmdW5jdGlvbiggZWxlbSwgbWF0Y2ggKSB7CgkJCXJldHVybiBlbGVtLm5vZGVUeXBlID09PSAxICYmIGVsZW0uZ2V0QXR0cmlidXRlKCJpZCIpID09PSBtYXRjaDsKCQl9LAoKCQlUQUc6IGZ1bmN0aW9uKCBlbGVtLCBtYXRjaCApIHsKCQkJcmV0dXJuIChtYXRjaCA9PT0gIioiICYmIGVsZW0ubm9kZVR5cGUgPT09IDEpIHx8IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbWF0Y2g7CgkJfSwKCQkKCQlDTEFTUzogZnVuY3Rpb24oIGVsZW0sIG1hdGNoICkgewoJCQlyZXR1cm4gKCIgIiArIChlbGVtLmNsYXNzTmFtZSB8fCBlbGVtLmdldEF0dHJpYnV0ZSgiY2xhc3MiKSkgKyAiICIpCgkJCQkuaW5kZXhPZiggbWF0Y2ggKSA+IC0xOwoJCX0sCgoJCUFUVFI6IGZ1bmN0aW9uKCBlbGVtLCBtYXRjaCApIHsKCQkJdmFyIG5hbWUgPSBtYXRjaFsxXSwKCQkJCXJlc3VsdCA9IEV4cHIuYXR0ckhhbmRsZVsgbmFtZSBdID8KCQkJCQlFeHByLmF0dHJIYW5kbGVbIG5hbWUgXSggZWxlbSApIDoKCQkJCQllbGVtWyBuYW1lIF0gIT0gbnVsbCA/CgkJCQkJCWVsZW1bIG5hbWUgXSA6CgkJCQkJCWVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lICksCgkJCQl2YWx1ZSA9IHJlc3VsdCArICIiLAoJCQkJdHlwZSA9IG1hdGNoWzJdLAoJCQkJY2hlY2sgPSBtYXRjaFs0XTsKCgkJCXJldHVybiByZXN1bHQgPT0gbnVsbCA/CgkJCQl0eXBlID09PSAiIT0iIDoKCQkJCXR5cGUgPT09ICI9IiA/CgkJCQl2YWx1ZSA9PT0gY2hlY2sgOgoJCQkJdHlwZSA9PT0gIio9IiA/CgkJCQl2YWx1ZS5pbmRleE9mKGNoZWNrKSA+PSAwIDoKCQkJCXR5cGUgPT09ICJ+PSIgPwoJCQkJKCIgIiArIHZhbHVlICsgIiAiKS5pbmRleE9mKGNoZWNrKSA+PSAwIDoKCQkJCSFjaGVjayA/CgkJCQl2YWx1ZSAmJiByZXN1bHQgIT09IGZhbHNlIDoKCQkJCXR5cGUgPT09ICIhPSIgPwoJCQkJdmFsdWUgIT09IGNoZWNrIDoKCQkJCXR5cGUgPT09ICJePSIgPwoJCQkJdmFsdWUuaW5kZXhPZihjaGVjaykgPT09IDAgOgoJCQkJdHlwZSA9PT0gIiQ9IiA/CgkJCQl2YWx1ZS5zdWJzdHIodmFsdWUubGVuZ3RoIC0gY2hlY2subGVuZ3RoKSA9PT0gY2hlY2sgOgoJCQkJdHlwZSA9PT0gInw9IiA/CgkJCQl2YWx1ZSA9PT0gY2hlY2sgfHwgdmFsdWUuc3Vic3RyKDAsIGNoZWNrLmxlbmd0aCArIDEpID09PSBjaGVjayArICItIiA6CgkJCQlmYWxzZTsKCQl9LAoKCQlQT1M6IGZ1bmN0aW9uKCBlbGVtLCBtYXRjaCwgaSwgYXJyYXkgKSB7CgkJCXZhciBuYW1lID0gbWF0Y2hbMl0sCgkJCQlmaWx0ZXIgPSBFeHByLnNldEZpbHRlcnNbIG5hbWUgXTsKCgkJCWlmICggZmlsdGVyICkgewoJCQkJcmV0dXJuIGZpbHRlciggZWxlbSwgaSwgbWF0Y2gsIGFycmF5ICk7CgkJCX0KCQl9Cgl9Cn07Cgp2YXIgb3JpZ1BPUyA9IEV4cHIubWF0Y2guUE9TLAoJZmVzY2FwZSA9IGZ1bmN0aW9uKGFsbCwgbnVtKXsKCQlyZXR1cm4gIlxcIiArIChudW0gLSAwICsgMSk7Cgl9OwoKZm9yICggdmFyIHR5cGUgaW4gRXhwci5tYXRjaCApIHsKCUV4cHIubWF0Y2hbIHR5cGUgXSA9IG5ldyBSZWdFeHAoIEV4cHIubWF0Y2hbIHR5cGUgXS5zb3VyY2UgKyAoLyg/IVteXFtdKlxdKSg/IVteXChdKlwpKS8uc291cmNlKSApOwoJRXhwci5sZWZ0TWF0Y2hbIHR5cGUgXSA9IG5ldyBSZWdFeHAoIC8oXig/Oi58XHJ8XG4pKj8pLy5zb3VyY2UgKyBFeHByLm1hdGNoWyB0eXBlIF0uc291cmNlLnJlcGxhY2UoL1xcKFxkKykvZywgZmVzY2FwZSkgKTsKfQoKdmFyIG1ha2VBcnJheSA9IGZ1bmN0aW9uKCBhcnJheSwgcmVzdWx0cyApIHsKCWFycmF5ID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoIGFycmF5LCAwICk7CgoJaWYgKCByZXN1bHRzICkgewoJCXJlc3VsdHMucHVzaC5hcHBseSggcmVzdWx0cywgYXJyYXkgKTsKCQlyZXR1cm4gcmVzdWx0czsKCX0KCQoJcmV0dXJuIGFycmF5Owp9OwoKLy8gUGVyZm9ybSBhIHNpbXBsZSBjaGVjayB0byBkZXRlcm1pbmUgaWYgdGhlIGJyb3dzZXIgaXMgY2FwYWJsZSBvZgovLyBjb252ZXJ0aW5nIGEgTm9kZUxpc3QgdG8gYW4gYXJyYXkgdXNpbmcgYnVpbHRpbiBtZXRob2RzLgovLyBBbHNvIHZlcmlmaWVzIHRoYXQgdGhlIHJldHVybmVkIGFycmF5IGhvbGRzIERPTSBub2RlcwovLyAod2hpY2ggaXMgbm90IHRoZSBjYXNlIGluIHRoZSBCbGFja2JlcnJ5IGJyb3dzZXIpCnRyeSB7CglBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNoaWxkTm9kZXMsIDAgKVswXS5ub2RlVHlwZTsKCi8vIFByb3ZpZGUgYSBmYWxsYmFjayBtZXRob2QgaWYgaXQgZG9lcyBub3Qgd29yawp9IGNhdGNoKCBlICkgewoJbWFrZUFycmF5ID0gZnVuY3Rpb24oIGFycmF5LCByZXN1bHRzICkgewoJCXZhciBpID0gMCwKCQkJcmV0ID0gcmVzdWx0cyB8fCBbXTsKCgkJaWYgKCB0b1N0cmluZy5jYWxsKGFycmF5KSA9PT0gIltvYmplY3QgQXJyYXldIiApIHsKCQkJQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkoIHJldCwgYXJyYXkgKTsKCgkJfSBlbHNlIHsKCQkJaWYgKCB0eXBlb2YgYXJyYXkubGVuZ3RoID09PSAibnVtYmVyIiApIHsKCQkJCWZvciAoIHZhciBsID0gYXJyYXkubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCQkJCXJldC5wdXNoKCBhcnJheVtpXSApOwoJCQkJfQoKCQkJfSBlbHNlIHsKCQkJCWZvciAoIDsgYXJyYXlbaV07IGkrKyApIHsKCQkJCQlyZXQucHVzaCggYXJyYXlbaV0gKTsKCQkJCX0KCQkJfQoJCX0KCgkJcmV0dXJuIHJldDsKCX07Cn0KCnZhciBzb3J0T3JkZXIsIHNpYmxpbmdDaGVjazsKCmlmICggZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uICkgewoJc29ydE9yZGVyID0gZnVuY3Rpb24oIGEsIGIgKSB7CgkJaWYgKCBhID09PSBiICkgewoJCQloYXNEdXBsaWNhdGUgPSB0cnVlOwoJCQlyZXR1cm4gMDsKCQl9CgoJCWlmICggIWEuY29tcGFyZURvY3VtZW50UG9zaXRpb24gfHwgIWIuY29tcGFyZURvY3VtZW50UG9zaXRpb24gKSB7CgkJCXJldHVybiBhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uID8gLTEgOiAxOwoJCX0KCgkJcmV0dXJuIGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikgJiA0ID8gLTEgOiAxOwoJfTsKCn0gZWxzZSB7Cglzb3J0T3JkZXIgPSBmdW5jdGlvbiggYSwgYiApIHsKCQkvLyBUaGUgbm9kZXMgYXJlIGlkZW50aWNhbCwgd2UgY2FuIGV4aXQgZWFybHkKCQlpZiAoIGEgPT09IGIgKSB7CgkJCWhhc0R1cGxpY2F0ZSA9IHRydWU7CgkJCXJldHVybiAwOwoKCQkvLyBGYWxsYmFjayB0byB1c2luZyBzb3VyY2VJbmRleCAoaW4gSUUpIGlmIGl0J3MgYXZhaWxhYmxlIG9uIGJvdGggbm9kZXMKCQl9IGVsc2UgaWYgKCBhLnNvdXJjZUluZGV4ICYmIGIuc291cmNlSW5kZXggKSB7CgkJCXJldHVybiBhLnNvdXJjZUluZGV4IC0gYi5zb3VyY2VJbmRleDsKCQl9CgoJCXZhciBhbCwgYmwsCgkJCWFwID0gW10sCgkJCWJwID0gW10sCgkJCWF1cCA9IGEucGFyZW50Tm9kZSwKCQkJYnVwID0gYi5wYXJlbnROb2RlLAoJCQljdXIgPSBhdXA7CgoJCS8vIElmIHRoZSBub2RlcyBhcmUgc2libGluZ3MgKG9yIGlkZW50aWNhbCkgd2UgY2FuIGRvIGEgcXVpY2sgY2hlY2sKCQlpZiAoIGF1cCA9PT0gYnVwICkgewoJCQlyZXR1cm4gc2libGluZ0NoZWNrKCBhLCBiICk7CgoJCS8vIElmIG5vIHBhcmVudHMgd2VyZSBmb3VuZCB0aGVuIHRoZSBub2RlcyBhcmUgZGlzY29ubmVjdGVkCgkJfSBlbHNlIGlmICggIWF1cCApIHsKCQkJcmV0dXJuIC0xOwoKCQl9IGVsc2UgaWYgKCAhYnVwICkgewoJCQlyZXR1cm4gMTsKCQl9CgoJCS8vIE90aGVyd2lzZSB0aGV5J3JlIHNvbWV3aGVyZSBlbHNlIGluIHRoZSB0cmVlIHNvIHdlIG5lZWQKCQkvLyB0byBidWlsZCB1cCBhIGZ1bGwgbGlzdCBvZiB0aGUgcGFyZW50Tm9kZXMgZm9yIGNvbXBhcmlzb24KCQl3aGlsZSAoIGN1ciApIHsKCQkJYXAudW5zaGlmdCggY3VyICk7CgkJCWN1ciA9IGN1ci5wYXJlbnROb2RlOwoJCX0KCgkJY3VyID0gYnVwOwoKCQl3aGlsZSAoIGN1ciApIHsKCQkJYnAudW5zaGlmdCggY3VyICk7CgkJCWN1ciA9IGN1ci5wYXJlbnROb2RlOwoJCX0KCgkJYWwgPSBhcC5sZW5ndGg7CgkJYmwgPSBicC5sZW5ndGg7CgoJCS8vIFN0YXJ0IHdhbGtpbmcgZG93biB0aGUgdHJlZSBsb29raW5nIGZvciBhIGRpc2NyZXBhbmN5CgkJZm9yICggdmFyIGkgPSAwOyBpIDwgYWwgJiYgaSA8IGJsOyBpKysgKSB7CgkJCWlmICggYXBbaV0gIT09IGJwW2ldICkgewoJCQkJcmV0dXJuIHNpYmxpbmdDaGVjayggYXBbaV0sIGJwW2ldICk7CgkJCX0KCQl9CgoJCS8vIFdlIGVuZGVkIHNvbWVwbGFjZSB1cCB0aGUgdHJlZSBzbyBkbyBhIHNpYmxpbmcgY2hlY2sKCQlyZXR1cm4gaSA9PT0gYWwgPwoJCQlzaWJsaW5nQ2hlY2soIGEsIGJwW2ldLCAtMSApIDoKCQkJc2libGluZ0NoZWNrKCBhcFtpXSwgYiwgMSApOwoJfTsKCglzaWJsaW5nQ2hlY2sgPSBmdW5jdGlvbiggYSwgYiwgcmV0ICkgewoJCWlmICggYSA9PT0gYiApIHsKCQkJcmV0dXJuIHJldDsKCQl9CgoJCXZhciBjdXIgPSBhLm5leHRTaWJsaW5nOwoKCQl3aGlsZSAoIGN1ciApIHsKCQkJaWYgKCBjdXIgPT09IGIgKSB7CgkJCQlyZXR1cm4gLTE7CgkJCX0KCgkJCWN1ciA9IGN1ci5uZXh0U2libGluZzsKCQl9CgoJCXJldHVybiAxOwoJfTsKfQoKLy8gVXRpbGl0eSBmdW5jdGlvbiBmb3IgcmV0cmVpdmluZyB0aGUgdGV4dCB2YWx1ZSBvZiBhbiBhcnJheSBvZiBET00gbm9kZXMKU2l6emxlLmdldFRleHQgPSBmdW5jdGlvbiggZWxlbXMgKSB7Cgl2YXIgcmV0ID0gIiIsIGVsZW07CgoJZm9yICggdmFyIGkgPSAwOyBlbGVtc1tpXTsgaSsrICkgewoJCWVsZW0gPSBlbGVtc1tpXTsKCgkJLy8gR2V0IHRoZSB0ZXh0IGZyb20gdGV4dCBub2RlcyBhbmQgQ0RBVEEgbm9kZXMKCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PT0gNCApIHsKCQkJcmV0ICs9IGVsZW0ubm9kZVZhbHVlOwoKCQkvLyBUcmF2ZXJzZSBldmVyeXRoaW5nIGVsc2UsIGV4Y2VwdCBjb21tZW50IG5vZGVzCgkJfSBlbHNlIGlmICggZWxlbS5ub2RlVHlwZSAhPT0gOCApIHsKCQkJcmV0ICs9IFNpenpsZS5nZXRUZXh0KCBlbGVtLmNoaWxkTm9kZXMgKTsKCQl9Cgl9CgoJcmV0dXJuIHJldDsKfTsKCi8vIENoZWNrIHRvIHNlZSBpZiB0aGUgYnJvd3NlciByZXR1cm5zIGVsZW1lbnRzIGJ5IG5hbWUgd2hlbgovLyBxdWVyeWluZyBieSBnZXRFbGVtZW50QnlJZCAoYW5kIHByb3ZpZGUgYSB3b3JrYXJvdW5kKQooZnVuY3Rpb24oKXsKCS8vIFdlJ3JlIGdvaW5nIHRvIGluamVjdCBhIGZha2UgaW5wdXQgZWxlbWVudCB3aXRoIGEgc3BlY2lmaWVkIG5hbWUKCXZhciBmb3JtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksCgkJaWQgPSAic2NyaXB0IiArIChuZXcgRGF0ZSgpKS5nZXRUaW1lKCksCgkJcm9vdCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsKCglmb3JtLmlubmVySFRNTCA9ICI8YSBuYW1lPSciICsgaWQgKyAiJy8+IjsKCgkvLyBJbmplY3QgaXQgaW50byB0aGUgcm9vdCBlbGVtZW50LCBjaGVjayBpdHMgc3RhdHVzLCBhbmQgcmVtb3ZlIGl0IHF1aWNrbHkKCXJvb3QuaW5zZXJ0QmVmb3JlKCBmb3JtLCByb290LmZpcnN0Q2hpbGQgKTsKCgkvLyBUaGUgd29ya2Fyb3VuZCBoYXMgdG8gZG8gYWRkaXRpb25hbCBjaGVja3MgYWZ0ZXIgYSBnZXRFbGVtZW50QnlJZAoJLy8gV2hpY2ggc2xvd3MgdGhpbmdzIGRvd24gZm9yIG90aGVyIGJyb3dzZXJzIChoZW5jZSB0aGUgYnJhbmNoaW5nKQoJaWYgKCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggaWQgKSApIHsKCQlFeHByLmZpbmQuSUQgPSBmdW5jdGlvbiggbWF0Y2gsIGNvbnRleHQsIGlzWE1MICkgewoJCQlpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRCeUlkICE9PSAidW5kZWZpbmVkIiAmJiAhaXNYTUwgKSB7CgkJCQl2YXIgbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQobWF0Y2hbMV0pOwoKCQkJCXJldHVybiBtID8KCQkJCQltLmlkID09PSBtYXRjaFsxXSB8fCB0eXBlb2YgbS5nZXRBdHRyaWJ1dGVOb2RlICE9PSAidW5kZWZpbmVkIiAmJiBtLmdldEF0dHJpYnV0ZU5vZGUoImlkIikubm9kZVZhbHVlID09PSBtYXRjaFsxXSA/CgkJCQkJCVttXSA6CgkJCQkJCXVuZGVmaW5lZCA6CgkJCQkJW107CgkJCX0KCQl9OwoKCQlFeHByLmZpbHRlci5JRCA9IGZ1bmN0aW9uKCBlbGVtLCBtYXRjaCApIHsKCQkJdmFyIG5vZGUgPSB0eXBlb2YgZWxlbS5nZXRBdHRyaWJ1dGVOb2RlICE9PSAidW5kZWZpbmVkIiAmJiBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoImlkIik7CgoJCQlyZXR1cm4gZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiBub2RlICYmIG5vZGUubm9kZVZhbHVlID09PSBtYXRjaDsKCQl9OwoJfQoKCXJvb3QucmVtb3ZlQ2hpbGQoIGZvcm0gKTsKCgkvLyByZWxlYXNlIG1lbW9yeSBpbiBJRQoJcm9vdCA9IGZvcm0gPSBudWxsOwp9KSgpOwoKKGZ1bmN0aW9uKCl7CgkvLyBDaGVjayB0byBzZWUgaWYgdGhlIGJyb3dzZXIgcmV0dXJucyBvbmx5IGVsZW1lbnRzCgkvLyB3aGVuIGRvaW5nIGdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikKCgkvLyBDcmVhdGUgYSBmYWtlIGVsZW1lbnQKCXZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKCWRpdi5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlQ29tbWVudCgiIikgKTsKCgkvLyBNYWtlIHN1cmUgbm8gY29tbWVudHMgYXJlIGZvdW5kCglpZiAoIGRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLmxlbmd0aCA+IDAgKSB7CgkJRXhwci5maW5kLlRBRyA9IGZ1bmN0aW9uKCBtYXRjaCwgY29udGV4dCApIHsKCQkJdmFyIHJlc3VsdHMgPSBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCBtYXRjaFsxXSApOwoKCQkJLy8gRmlsdGVyIG91dCBwb3NzaWJsZSBjb21tZW50cwoJCQlpZiAoIG1hdGNoWzFdID09PSAiKiIgKSB7CgkJCQl2YXIgdG1wID0gW107CgoJCQkJZm9yICggdmFyIGkgPSAwOyByZXN1bHRzW2ldOyBpKysgKSB7CgkJCQkJaWYgKCByZXN1bHRzW2ldLm5vZGVUeXBlID09PSAxICkgewoJCQkJCQl0bXAucHVzaCggcmVzdWx0c1tpXSApOwoJCQkJCX0KCQkJCX0KCgkJCQlyZXN1bHRzID0gdG1wOwoJCQl9CgoJCQlyZXR1cm4gcmVzdWx0czsKCQl9OwoJfQoKCS8vIENoZWNrIHRvIHNlZSBpZiBhbiBhdHRyaWJ1dGUgcmV0dXJucyBub3JtYWxpemVkIGhyZWYgYXR0cmlidXRlcwoJZGl2LmlubmVySFRNTCA9ICI8YSBocmVmPScjJz48L2E+IjsKCglpZiAoIGRpdi5maXJzdENoaWxkICYmIHR5cGVvZiBkaXYuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUgIT09ICJ1bmRlZmluZWQiICYmCgkJCWRpdi5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSgiaHJlZiIpICE9PSAiIyIgKSB7CgoJCUV4cHIuYXR0ckhhbmRsZS5ocmVmID0gZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXJldHVybiBlbGVtLmdldEF0dHJpYnV0ZSggImhyZWYiLCAyICk7CgkJfTsKCX0KCgkvLyByZWxlYXNlIG1lbW9yeSBpbiBJRQoJZGl2ID0gbnVsbDsKfSkoKTsKCmlmICggZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCApIHsKCShmdW5jdGlvbigpewoJCXZhciBvbGRTaXp6bGUgPSBTaXp6bGUsCgkJCWRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLAoJCQlpZCA9ICJfX3NpenpsZV9fIjsKCgkJZGl2LmlubmVySFRNTCA9ICI8cCBjbGFzcz0nVEVTVCc+PC9wPiI7CgoJCS8vIFNhZmFyaSBjYW4ndCBoYW5kbGUgdXBwZXJjYXNlIG9yIHVuaWNvZGUgY2hhcmFjdGVycyB3aGVuCgkJLy8gaW4gcXVpcmtzIG1vZGUuCgkJaWYgKCBkaXYucXVlcnlTZWxlY3RvckFsbCAmJiBkaXYucXVlcnlTZWxlY3RvckFsbCgiLlRFU1QiKS5sZW5ndGggPT09IDAgKSB7CgkJCXJldHVybjsKCQl9CgkKCQlTaXp6bGUgPSBmdW5jdGlvbiggcXVlcnksIGNvbnRleHQsIGV4dHJhLCBzZWVkICkgewoJCQljb250ZXh0ID0gY29udGV4dCB8fCBkb2N1bWVudDsKCgkJCS8vIE9ubHkgdXNlIHF1ZXJ5U2VsZWN0b3JBbGwgb24gbm9uLVhNTCBkb2N1bWVudHMKCQkJLy8gKElEIHNlbGVjdG9ycyBkb24ndCB3b3JrIGluIG5vbi1IVE1MIGRvY3VtZW50cykKCQkJaWYgKCAhc2VlZCAmJiAhU2l6emxlLmlzWE1MKGNvbnRleHQpICkgewoJCQkJLy8gU2VlIGlmIHdlIGZpbmQgYSBzZWxlY3RvciB0byBzcGVlZCB1cAoJCQkJdmFyIG1hdGNoID0gL14oXHcrJCl8XlwuKFtcd1wtXSskKXxeIyhbXHdcLV0rJCkvLmV4ZWMoIHF1ZXJ5ICk7CgkJCQkKCQkJCWlmICggbWF0Y2ggJiYgKGNvbnRleHQubm9kZVR5cGUgPT09IDEgfHwgY29udGV4dC5ub2RlVHlwZSA9PT0gOSkgKSB7CgkJCQkJLy8gU3BlZWQtdXA6IFNpenpsZSgiVEFHIikKCQkJCQlpZiAoIG1hdGNoWzFdICkgewoJCQkJCQlyZXR1cm4gbWFrZUFycmF5KCBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCBxdWVyeSApLCBleHRyYSApOwoJCQkJCQoJCQkJCS8vIFNwZWVkLXVwOiBTaXp6bGUoIi5DTEFTUyIpCgkJCQkJfSBlbHNlIGlmICggbWF0Y2hbMl0gJiYgRXhwci5maW5kLkNMQVNTICYmIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSApIHsKCQkJCQkJcmV0dXJuIG1ha2VBcnJheSggY29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCBtYXRjaFsyXSApLCBleHRyYSApOwoJCQkJCX0KCQkJCX0KCQkJCQoJCQkJaWYgKCBjb250ZXh0Lm5vZGVUeXBlID09PSA5ICkgewoJCQkJCS8vIFNwZWVkLXVwOiBTaXp6bGUoImJvZHkiKQoJCQkJCS8vIFRoZSBib2R5IGVsZW1lbnQgb25seSBleGlzdHMgb25jZSwgb3B0aW1pemUgZmluZGluZyBpdAoJCQkJCWlmICggcXVlcnkgPT09ICJib2R5IiAmJiBjb250ZXh0LmJvZHkgKSB7CgkJCQkJCXJldHVybiBtYWtlQXJyYXkoIFsgY29udGV4dC5ib2R5IF0sIGV4dHJhICk7CgkJCQkJCQoJCQkJCS8vIFNwZWVkLXVwOiBTaXp6bGUoIiNJRCIpCgkJCQkJfSBlbHNlIGlmICggbWF0Y2ggJiYgbWF0Y2hbM10gKSB7CgkJCQkJCXZhciBlbGVtID0gY29udGV4dC5nZXRFbGVtZW50QnlJZCggbWF0Y2hbM10gKTsKCgkJCQkJCS8vIENoZWNrIHBhcmVudE5vZGUgdG8gY2F0Y2ggd2hlbiBCbGFja2JlcnJ5IDQuNiByZXR1cm5zCgkJCQkJCS8vIG5vZGVzIHRoYXQgYXJlIG5vIGxvbmdlciBpbiB0aGUgZG9jdW1lbnQgIzY5NjMKCQkJCQkJaWYgKCBlbGVtICYmIGVsZW0ucGFyZW50Tm9kZSApIHsKCQkJCQkJCS8vIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSBJRSBhbmQgT3BlcmEgcmV0dXJuIGl0ZW1zCgkJCQkJCQkvLyBieSBuYW1lIGluc3RlYWQgb2YgSUQKCQkJCQkJCWlmICggZWxlbS5pZCA9PT0gbWF0Y2hbM10gKSB7CgkJCQkJCQkJcmV0dXJuIG1ha2VBcnJheSggWyBlbGVtIF0sIGV4dHJhICk7CgkJCQkJCQl9CgkJCQkJCQkKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCXJldHVybiBtYWtlQXJyYXkoIFtdLCBleHRyYSApOwoJCQkJCQl9CgkJCQkJfQoJCQkJCQoJCQkJCXRyeSB7CgkJCQkJCXJldHVybiBtYWtlQXJyYXkoIGNvbnRleHQucXVlcnlTZWxlY3RvckFsbChxdWVyeSksIGV4dHJhICk7CgkJCQkJfSBjYXRjaChxc2FFcnJvcikge30KCgkJCQkvLyBxU0Egd29ya3Mgc3RyYW5nZWx5IG9uIEVsZW1lbnQtcm9vdGVkIHF1ZXJpZXMKCQkJCS8vIFdlIGNhbiB3b3JrIGFyb3VuZCB0aGlzIGJ5IHNwZWNpZnlpbmcgYW4gZXh0cmEgSUQgb24gdGhlIHJvb3QKCQkJCS8vIGFuZCB3b3JraW5nIHVwIGZyb20gdGhlcmUgKFRoYW5rcyB0byBBbmRyZXcgRHVwb250IGZvciB0aGUgdGVjaG5pcXVlKQoJCQkJLy8gSUUgOCBkb2Vzbid0IHdvcmsgb24gb2JqZWN0IGVsZW1lbnRzCgkJCQl9IGVsc2UgaWYgKCBjb250ZXh0Lm5vZGVUeXBlID09PSAxICYmIGNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gIm9iamVjdCIgKSB7CgkJCQkJdmFyIG9sZENvbnRleHQgPSBjb250ZXh0LAoJCQkJCQlvbGQgPSBjb250ZXh0LmdldEF0dHJpYnV0ZSggImlkIiApLAoJCQkJCQluaWQgPSBvbGQgfHwgaWQsCgkJCQkJCWhhc1BhcmVudCA9IGNvbnRleHQucGFyZW50Tm9kZSwKCQkJCQkJcmVsYXRpdmVIaWVyYXJjaHlTZWxlY3RvciA9IC9eXHMqWyt+XS8udGVzdCggcXVlcnkgKTsKCgkJCQkJaWYgKCAhb2xkICkgewoJCQkJCQljb250ZXh0LnNldEF0dHJpYnV0ZSggImlkIiwgbmlkICk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJbmlkID0gbmlkLnJlcGxhY2UoIC8nL2csICJcXCQmIiApOwoJCQkJCX0KCQkJCQlpZiAoIHJlbGF0aXZlSGllcmFyY2h5U2VsZWN0b3IgJiYgaGFzUGFyZW50ICkgewoJCQkJCQljb250ZXh0ID0gY29udGV4dC5wYXJlbnROb2RlOwoJCQkJCX0KCgkJCQkJdHJ5IHsKCQkJCQkJaWYgKCAhcmVsYXRpdmVIaWVyYXJjaHlTZWxlY3RvciB8fCBoYXNQYXJlbnQgKSB7CgkJCQkJCQlyZXR1cm4gbWFrZUFycmF5KCBjb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwoICJbaWQ9JyIgKyBuaWQgKyAiJ10gIiArIHF1ZXJ5ICksIGV4dHJhICk7CgkJCQkJCX0KCgkJCQkJfSBjYXRjaChwc2V1ZG9FcnJvcikgewoJCQkJCX0gZmluYWxseSB7CgkJCQkJCWlmICggIW9sZCApIHsKCQkJCQkJCW9sZENvbnRleHQucmVtb3ZlQXR0cmlidXRlKCAiaWQiICk7CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCX0KCQkKCQkJcmV0dXJuIG9sZFNpenpsZShxdWVyeSwgY29udGV4dCwgZXh0cmEsIHNlZWQpOwoJCX07CgoJCWZvciAoIHZhciBwcm9wIGluIG9sZFNpenpsZSApIHsKCQkJU2l6emxlWyBwcm9wIF0gPSBvbGRTaXp6bGVbIHByb3AgXTsKCQl9CgoJCS8vIHJlbGVhc2UgbWVtb3J5IGluIElFCgkJZGl2ID0gbnVsbDsKCX0pKCk7Cn0KCihmdW5jdGlvbigpewoJdmFyIGh0bWwgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsCgkJbWF0Y2hlcyA9IGh0bWwubWF0Y2hlc1NlbGVjdG9yIHx8IGh0bWwubW96TWF0Y2hlc1NlbGVjdG9yIHx8IGh0bWwud2Via2l0TWF0Y2hlc1NlbGVjdG9yIHx8IGh0bWwubXNNYXRjaGVzU2VsZWN0b3I7CgoJaWYgKCBtYXRjaGVzICkgewoJCS8vIENoZWNrIHRvIHNlZSBpZiBpdCdzIHBvc3NpYmxlIHRvIGRvIG1hdGNoZXNTZWxlY3RvcgoJCS8vIG9uIGEgZGlzY29ubmVjdGVkIG5vZGUgKElFIDkgZmFpbHMgdGhpcykKCQl2YXIgZGlzY29ubmVjdGVkTWF0Y2ggPSAhbWF0Y2hlcy5jYWxsKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAiZGl2IiApLCAiZGl2IiApLAoJCQlwc2V1ZG9Xb3JrcyA9IGZhbHNlOwoKCQl0cnkgewoJCQkvLyBUaGlzIHNob3VsZCBmYWlsIHdpdGggYW4gZXhjZXB0aW9uCgkJCS8vIEdlY2tvIGRvZXMgbm90IGVycm9yLCByZXR1cm5zIGZhbHNlIGluc3RlYWQKCQkJbWF0Y2hlcy5jYWxsKCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsICJbdGVzdCE9JyddOnNpenpsZSIgKTsKCQoJCX0gY2F0Y2goIHBzZXVkb0Vycm9yICkgewoJCQlwc2V1ZG9Xb3JrcyA9IHRydWU7CgkJfQoKCQlTaXp6bGUubWF0Y2hlc1NlbGVjdG9yID0gZnVuY3Rpb24oIG5vZGUsIGV4cHIgKSB7CgkJCS8vIE1ha2Ugc3VyZSB0aGF0IGF0dHJpYnV0ZSBzZWxlY3RvcnMgYXJlIHF1b3RlZAoJCQlleHByID0gZXhwci5yZXBsYWNlKC9cPVxzKihbXiciXF1dKilccypcXS9nLCAiPSckMSddIik7CgoJCQlpZiAoICFTaXp6bGUuaXNYTUwoIG5vZGUgKSApIHsKCQkJCXRyeSB7IAoJCQkJCWlmICggcHNldWRvV29ya3MgfHwgIUV4cHIubWF0Y2guUFNFVURPLnRlc3QoIGV4cHIgKSAmJiAhLyE9Ly50ZXN0KCBleHByICkgKSB7CgkJCQkJCXZhciByZXQgPSBtYXRjaGVzLmNhbGwoIG5vZGUsIGV4cHIgKTsKCgkJCQkJCS8vIElFIDkncyBtYXRjaGVzU2VsZWN0b3IgcmV0dXJucyBmYWxzZSBvbiBkaXNjb25uZWN0ZWQgbm9kZXMKCQkJCQkJaWYgKCByZXQgfHwgIWRpc2Nvbm5lY3RlZE1hdGNoIHx8CgkJCQkJCQkJLy8gQXMgd2VsbCwgZGlzY29ubmVjdGVkIG5vZGVzIGFyZSBzYWlkIHRvIGJlIGluIGEgZG9jdW1lbnQKCQkJCQkJCQkvLyBmcmFnbWVudCBpbiBJRSA5LCBzbyBjaGVjayBmb3IgdGhhdAoJCQkJCQkJCW5vZGUuZG9jdW1lbnQgJiYgbm9kZS5kb2N1bWVudC5ub2RlVHlwZSAhPT0gMTEgKSB7CgkJCQkJCQlyZXR1cm4gcmV0OwoJCQkJCQl9CgkJCQkJfQoJCQkJfSBjYXRjaChlKSB7fQoJCQl9CgoJCQlyZXR1cm4gU2l6emxlKGV4cHIsIG51bGwsIG51bGwsIFtub2RlXSkubGVuZ3RoID4gMDsKCQl9OwoJfQp9KSgpOwoKKGZ1bmN0aW9uKCl7Cgl2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CgoJZGl2LmlubmVySFRNTCA9ICI8ZGl2IGNsYXNzPSd0ZXN0IGUnPjwvZGl2PjxkaXYgY2xhc3M9J3Rlc3QnPjwvZGl2PiI7CgoJLy8gT3BlcmEgY2FuJ3QgZmluZCBhIHNlY29uZCBjbGFzc25hbWUgKGluIDkuNikKCS8vIEFsc28sIG1ha2Ugc3VyZSB0aGF0IGdldEVsZW1lbnRzQnlDbGFzc05hbWUgYWN0dWFsbHkgZXhpc3RzCglpZiAoICFkaXYuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSB8fCBkaXYuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiZSIpLmxlbmd0aCA9PT0gMCApIHsKCQlyZXR1cm47Cgl9CgoJLy8gU2FmYXJpIGNhY2hlcyBjbGFzcyBhdHRyaWJ1dGVzLCBkb2Vzbid0IGNhdGNoIGNoYW5nZXMgKGluIDMuMikKCWRpdi5sYXN0Q2hpbGQuY2xhc3NOYW1lID0gImUiOwoKCWlmICggZGl2LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImUiKS5sZW5ndGggPT09IDEgKSB7CgkJcmV0dXJuOwoJfQoJCglFeHByLm9yZGVyLnNwbGljZSgxLCAwLCAiQ0xBU1MiKTsKCUV4cHIuZmluZC5DTEFTUyA9IGZ1bmN0aW9uKCBtYXRjaCwgY29udGV4dCwgaXNYTUwgKSB7CgkJaWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICE9PSAidW5kZWZpbmVkIiAmJiAhaXNYTUwgKSB7CgkJCXJldHVybiBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUobWF0Y2hbMV0pOwoJCX0KCX07CgoJLy8gcmVsZWFzZSBtZW1vcnkgaW4gSUUKCWRpdiA9IG51bGw7Cn0pKCk7CgpmdW5jdGlvbiBkaXJOb2RlQ2hlY2soIGRpciwgY3VyLCBkb25lTmFtZSwgY2hlY2tTZXQsIG5vZGVDaGVjaywgaXNYTUwgKSB7Cglmb3IgKCB2YXIgaSA9IDAsIGwgPSBjaGVja1NldC5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CgkJdmFyIGVsZW0gPSBjaGVja1NldFtpXTsKCgkJaWYgKCBlbGVtICkgewoJCQl2YXIgbWF0Y2ggPSBmYWxzZTsKCgkJCWVsZW0gPSBlbGVtW2Rpcl07CgoJCQl3aGlsZSAoIGVsZW0gKSB7CgkJCQlpZiAoIGVsZW0uc2l6Y2FjaGUgPT09IGRvbmVOYW1lICkgewoJCQkJCW1hdGNoID0gY2hlY2tTZXRbZWxlbS5zaXpzZXRdOwoJCQkJCWJyZWFrOwoJCQkJfQoKCQkJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiAhaXNYTUwgKXsKCQkJCQllbGVtLnNpemNhY2hlID0gZG9uZU5hbWU7CgkJCQkJZWxlbS5zaXpzZXQgPSBpOwoJCQkJfQoKCQkJCWlmICggZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBjdXIgKSB7CgkJCQkJbWF0Y2ggPSBlbGVtOwoJCQkJCWJyZWFrOwoJCQkJfQoKCQkJCWVsZW0gPSBlbGVtW2Rpcl07CgkJCX0KCgkJCWNoZWNrU2V0W2ldID0gbWF0Y2g7CgkJfQoJfQp9CgpmdW5jdGlvbiBkaXJDaGVjayggZGlyLCBjdXIsIGRvbmVOYW1lLCBjaGVja1NldCwgbm9kZUNoZWNrLCBpc1hNTCApIHsKCWZvciAoIHZhciBpID0gMCwgbCA9IGNoZWNrU2V0Lmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKCQl2YXIgZWxlbSA9IGNoZWNrU2V0W2ldOwoKCQlpZiAoIGVsZW0gKSB7CgkJCXZhciBtYXRjaCA9IGZhbHNlOwoJCQkKCQkJZWxlbSA9IGVsZW1bZGlyXTsKCgkJCXdoaWxlICggZWxlbSApIHsKCQkJCWlmICggZWxlbS5zaXpjYWNoZSA9PT0gZG9uZU5hbWUgKSB7CgkJCQkJbWF0Y2ggPSBjaGVja1NldFtlbGVtLnNpenNldF07CgkJCQkJYnJlYWs7CgkJCQl9CgoJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkgewoJCQkJCWlmICggIWlzWE1MICkgewoJCQkJCQllbGVtLnNpemNhY2hlID0gZG9uZU5hbWU7CgkJCQkJCWVsZW0uc2l6c2V0ID0gaTsKCQkJCQl9CgoJCQkJCWlmICggdHlwZW9mIGN1ciAhPT0gInN0cmluZyIgKSB7CgkJCQkJCWlmICggZWxlbSA9PT0gY3VyICkgewoJCQkJCQkJbWF0Y2ggPSB0cnVlOwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCgkJCQkJfSBlbHNlIGlmICggU2l6emxlLmZpbHRlciggY3VyLCBbZWxlbV0gKS5sZW5ndGggPiAwICkgewoJCQkJCQltYXRjaCA9IGVsZW07CgkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCX0KCgkJCQllbGVtID0gZWxlbVtkaXJdOwoJCQl9CgoJCQljaGVja1NldFtpXSA9IG1hdGNoOwoJCX0KCX0KfQoKaWYgKCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY29udGFpbnMgKSB7CglTaXp6bGUuY29udGFpbnMgPSBmdW5jdGlvbiggYSwgYiApIHsKCQlyZXR1cm4gYSAhPT0gYiAmJiAoYS5jb250YWlucyA/IGEuY29udGFpbnMoYikgOiB0cnVlKTsKCX07Cgp9IGVsc2UgaWYgKCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY29tcGFyZURvY3VtZW50UG9zaXRpb24gKSB7CglTaXp6bGUuY29udGFpbnMgPSBmdW5jdGlvbiggYSwgYiApIHsKCQlyZXR1cm4gISEoYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSAmIDE2KTsKCX07Cgp9IGVsc2UgewoJU2l6emxlLmNvbnRhaW5zID0gZnVuY3Rpb24oKSB7CgkJcmV0dXJuIGZhbHNlOwoJfTsKfQoKU2l6emxlLmlzWE1MID0gZnVuY3Rpb24oIGVsZW0gKSB7CgkvLyBkb2N1bWVudEVsZW1lbnQgaXMgdmVyaWZpZWQgZm9yIGNhc2VzIHdoZXJlIGl0IGRvZXNuJ3QgeWV0IGV4aXN0CgkvLyAoc3VjaCBhcyBsb2FkaW5nIGlmcmFtZXMgaW4gSUUgLSAjNDgzMykgCgl2YXIgZG9jdW1lbnRFbGVtZW50ID0gKGVsZW0gPyBlbGVtLm93bmVyRG9jdW1lbnQgfHwgZWxlbSA6IDApLmRvY3VtZW50RWxlbWVudDsKCglyZXR1cm4gZG9jdW1lbnRFbGVtZW50ID8gZG9jdW1lbnRFbGVtZW50Lm5vZGVOYW1lICE9PSAiSFRNTCIgOiBmYWxzZTsKfTsKCnZhciBwb3NQcm9jZXNzID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0ICkgewoJdmFyIG1hdGNoLAoJCXRtcFNldCA9IFtdLAoJCWxhdGVyID0gIiIsCgkJcm9vdCA9IGNvbnRleHQubm9kZVR5cGUgPyBbY29udGV4dF0gOiBjb250ZXh0OwoKCS8vIFBvc2l0aW9uIHNlbGVjdG9ycyBtdXN0IGJlIGRvbmUgYWZ0ZXIgdGhlIGZpbHRlcgoJLy8gQW5kIHNvIG11c3QgOm5vdChwb3NpdGlvbmFsKSBzbyB3ZSBtb3ZlIGFsbCBQU0VVRE9zIHRvIHRoZSBlbmQKCXdoaWxlICggKG1hdGNoID0gRXhwci5tYXRjaC5QU0VVRE8uZXhlYyggc2VsZWN0b3IgKSkgKSB7CgkJbGF0ZXIgKz0gbWF0Y2hbMF07CgkJc2VsZWN0b3IgPSBzZWxlY3Rvci5yZXBsYWNlKCBFeHByLm1hdGNoLlBTRVVETywgIiIgKTsKCX0KCglzZWxlY3RvciA9IEV4cHIucmVsYXRpdmVbc2VsZWN0b3JdID8gc2VsZWN0b3IgKyAiKiIgOiBzZWxlY3RvcjsKCglmb3IgKCB2YXIgaSA9IDAsIGwgPSByb290Lmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKCQlTaXp6bGUoIHNlbGVjdG9yLCByb290W2ldLCB0bXBTZXQgKTsKCX0KCglyZXR1cm4gU2l6emxlLmZpbHRlciggbGF0ZXIsIHRtcFNldCApOwp9OwoKLy8gRVhQT1NFCmpRdWVyeS5maW5kID0gU2l6emxlOwpqUXVlcnkuZXhwciA9IFNpenpsZS5zZWxlY3RvcnM7CmpRdWVyeS5leHByWyI6Il0gPSBqUXVlcnkuZXhwci5maWx0ZXJzOwpqUXVlcnkudW5pcXVlID0gU2l6emxlLnVuaXF1ZVNvcnQ7CmpRdWVyeS50ZXh0ID0gU2l6emxlLmdldFRleHQ7CmpRdWVyeS5pc1hNTERvYyA9IFNpenpsZS5pc1hNTDsKalF1ZXJ5LmNvbnRhaW5zID0gU2l6emxlLmNvbnRhaW5zOwoKCn0pKCk7CgoKdmFyIHJ1bnRpbCA9IC9VbnRpbCQvLAoJcnBhcmVudHNwcmV2ID0gL14oPzpwYXJlbnRzfHByZXZVbnRpbHxwcmV2QWxsKS8sCgkvLyBOb3RlOiBUaGlzIFJlZ0V4cCBzaG91bGQgYmUgaW1wcm92ZWQsIG9yIGxpa2VseSBwdWxsZWQgZnJvbSBTaXp6bGUKCXJtdWx0aXNlbGVjdG9yID0gLywvLAoJaXNTaW1wbGUgPSAvXi5bXjojXFtcLixdKiQvLAoJc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UsCglQT1MgPSBqUXVlcnkuZXhwci5tYXRjaC5QT1MsCgkvLyBtZXRob2RzIGd1YXJhbnRlZWQgdG8gcHJvZHVjZSBhIHVuaXF1ZSBzZXQgd2hlbiBzdGFydGluZyBmcm9tIGEgdW5pcXVlIHNldAoJZ3VhcmFudGVlZFVuaXF1ZSA9IHsKCQljaGlsZHJlbjogdHJ1ZSwKCQljb250ZW50czogdHJ1ZSwKCQluZXh0OiB0cnVlLAoJCXByZXY6IHRydWUKCX07CgpqUXVlcnkuZm4uZXh0ZW5kKHsKCWZpbmQ6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKCQl2YXIgc2VsZiA9IHRoaXMsCgkJCWksIGw7CgoJCWlmICggdHlwZW9mIHNlbGVjdG9yICE9PSAic3RyaW5nIiApIHsKCQkJcmV0dXJuIGpRdWVyeSggc2VsZWN0b3IgKS5maWx0ZXIoZnVuY3Rpb24oKSB7CgkJCQlmb3IgKCBpID0gMCwgbCA9IHNlbGYubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCQkJCWlmICggalF1ZXJ5LmNvbnRhaW5zKCBzZWxmWyBpIF0sIHRoaXMgKSApIHsKCQkJCQkJcmV0dXJuIHRydWU7CgkJCQkJfQoJCQkJfQoJCQl9KTsKCQl9CgoJCXZhciByZXQgPSB0aGlzLnB1c2hTdGFjayggIiIsICJmaW5kIiwgc2VsZWN0b3IgKSwKCQkJbGVuZ3RoLCBuLCByOwoKCQlmb3IgKCBpID0gMCwgbCA9IHRoaXMubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCQlsZW5ndGggPSByZXQubGVuZ3RoOwoJCQlqUXVlcnkuZmluZCggc2VsZWN0b3IsIHRoaXNbaV0sIHJldCApOwoKCQkJaWYgKCBpID4gMCApIHsKCQkJCS8vIE1ha2Ugc3VyZSB0aGF0IHRoZSByZXN1bHRzIGFyZSB1bmlxdWUKCQkJCWZvciAoIG4gPSBsZW5ndGg7IG4gPCByZXQubGVuZ3RoOyBuKysgKSB7CgkJCQkJZm9yICggciA9IDA7IHIgPCBsZW5ndGg7IHIrKyApIHsKCQkJCQkJaWYgKCByZXRbcl0gPT09IHJldFtuXSApIHsKCQkJCQkJCXJldC5zcGxpY2Uobi0tLCAxKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoKCQlyZXR1cm4gcmV0OwoJfSwKCgloYXM6IGZ1bmN0aW9uKCB0YXJnZXQgKSB7CgkJdmFyIHRhcmdldHMgPSBqUXVlcnkoIHRhcmdldCApOwoJCXJldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpIHsKCQkJZm9yICggdmFyIGkgPSAwLCBsID0gdGFyZ2V0cy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CgkJCQlpZiAoIGpRdWVyeS5jb250YWlucyggdGhpcywgdGFyZ2V0c1tpXSApICkgewoJCQkJCXJldHVybiB0cnVlOwoJCQkJfQoJCQl9CgkJfSk7Cgl9LAoKCW5vdDogZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXJldHVybiB0aGlzLnB1c2hTdGFjayggd2lubm93KHRoaXMsIHNlbGVjdG9yLCBmYWxzZSksICJub3QiLCBzZWxlY3Rvcik7Cgl9LAoKCWZpbHRlcjogZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXJldHVybiB0aGlzLnB1c2hTdGFjayggd2lubm93KHRoaXMsIHNlbGVjdG9yLCB0cnVlKSwgImZpbHRlciIsIHNlbGVjdG9yICk7Cgl9LAoKCWlzOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJcmV0dXJuICEhc2VsZWN0b3IgJiYgKCB0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciID8KCQkJalF1ZXJ5LmZpbHRlciggc2VsZWN0b3IsIHRoaXMgKS5sZW5ndGggPiAwIDoKCQkJdGhpcy5maWx0ZXIoIHNlbGVjdG9yICkubGVuZ3RoID4gMCApOwoJfSwKCgljbG9zZXN0OiBmdW5jdGlvbiggc2VsZWN0b3JzLCBjb250ZXh0ICkgewoJCXZhciByZXQgPSBbXSwgaSwgbCwgY3VyID0gdGhpc1swXTsKCQkKCQkvLyBBcnJheQoJCWlmICggalF1ZXJ5LmlzQXJyYXkoIHNlbGVjdG9ycyApICkgewoJCQl2YXIgbWF0Y2gsIHNlbGVjdG9yLAoJCQkJbWF0Y2hlcyA9IHt9LAoJCQkJbGV2ZWwgPSAxOwoKCQkJaWYgKCBjdXIgJiYgc2VsZWN0b3JzLmxlbmd0aCApIHsKCQkJCWZvciAoIGkgPSAwLCBsID0gc2VsZWN0b3JzLmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKCQkJCQlzZWxlY3RvciA9IHNlbGVjdG9yc1tpXTsKCgkJCQkJaWYgKCAhbWF0Y2hlc1sgc2VsZWN0b3IgXSApIHsKCQkJCQkJbWF0Y2hlc1sgc2VsZWN0b3IgXSA9IFBPUy50ZXN0KCBzZWxlY3RvciApID8KCQkJCQkJCWpRdWVyeSggc2VsZWN0b3IsIGNvbnRleHQgfHwgdGhpcy5jb250ZXh0ICkgOgoJCQkJCQkJc2VsZWN0b3I7CgkJCQkJfQoJCQkJfQoKCQkJCXdoaWxlICggY3VyICYmIGN1ci5vd25lckRvY3VtZW50ICYmIGN1ciAhPT0gY29udGV4dCApIHsKCQkJCQlmb3IgKCBzZWxlY3RvciBpbiBtYXRjaGVzICkgewoJCQkJCQltYXRjaCA9IG1hdGNoZXNbIHNlbGVjdG9yIF07CgoJCQkJCQlpZiAoIG1hdGNoLmpxdWVyeSA/IG1hdGNoLmluZGV4KCBjdXIgKSA+IC0xIDogalF1ZXJ5KCBjdXIgKS5pcyggbWF0Y2ggKSApIHsKCQkJCQkJCXJldC5wdXNoKHsgc2VsZWN0b3I6IHNlbGVjdG9yLCBlbGVtOiBjdXIsIGxldmVsOiBsZXZlbCB9KTsKCQkJCQkJfQoJCQkJCX0KCgkJCQkJY3VyID0gY3VyLnBhcmVudE5vZGU7CgkJCQkJbGV2ZWwrKzsKCQkJCX0KCQkJfQoKCQkJcmV0dXJuIHJldDsKCQl9CgoJCS8vIFN0cmluZwoJCXZhciBwb3MgPSBQT1MudGVzdCggc2VsZWN0b3JzICkgfHwgdHlwZW9mIHNlbGVjdG9ycyAhPT0gInN0cmluZyIgPwoJCQkJalF1ZXJ5KCBzZWxlY3RvcnMsIGNvbnRleHQgfHwgdGhpcy5jb250ZXh0ICkgOgoJCQkJMDsKCgkJZm9yICggaSA9IDAsIGwgPSB0aGlzLmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKCQkJY3VyID0gdGhpc1tpXTsKCgkJCXdoaWxlICggY3VyICkgewoJCQkJaWYgKCBwb3MgPyBwb3MuaW5kZXgoY3VyKSA+IC0xIDogalF1ZXJ5LmZpbmQubWF0Y2hlc1NlbGVjdG9yKGN1ciwgc2VsZWN0b3JzKSApIHsKCQkJCQlyZXQucHVzaCggY3VyICk7CgkJCQkJYnJlYWs7CgoJCQkJfSBlbHNlIHsKCQkJCQljdXIgPSBjdXIucGFyZW50Tm9kZTsKCQkJCQlpZiAoICFjdXIgfHwgIWN1ci5vd25lckRvY3VtZW50IHx8IGN1ciA9PT0gY29udGV4dCB8fCBjdXIubm9kZVR5cGUgPT09IDExICkgewoJCQkJCQlicmVhazsKCQkJCQl9CgkJCQl9CgkJCX0KCQl9CgoJCXJldCA9IHJldC5sZW5ndGggPiAxID8galF1ZXJ5LnVuaXF1ZSggcmV0ICkgOiByZXQ7CgoJCXJldHVybiB0aGlzLnB1c2hTdGFjayggcmV0LCAiY2xvc2VzdCIsIHNlbGVjdG9ycyApOwoJfSwKCgkvLyBEZXRlcm1pbmUgdGhlIHBvc2l0aW9uIG9mIGFuIGVsZW1lbnQgd2l0aGluCgkvLyB0aGUgbWF0Y2hlZCBzZXQgb2YgZWxlbWVudHMKCWluZGV4OiBmdW5jdGlvbiggZWxlbSApIHsKCgkJLy8gTm8gYXJndW1lbnQsIHJldHVybiBpbmRleCBpbiBwYXJlbnQKCQlpZiAoICFlbGVtICkgewoJCQlyZXR1cm4gKCB0aGlzWzBdICYmIHRoaXNbMF0ucGFyZW50Tm9kZSApID8gdGhpcy5wcmV2QWxsKCkubGVuZ3RoIDogLTE7CgkJfQoKCQkvLyBpbmRleCBpbiBzZWxlY3RvcgoJCWlmICggdHlwZW9mIGVsZW0gPT09ICJzdHJpbmciICkgewoJCQlyZXR1cm4galF1ZXJ5LmluQXJyYXkoIHRoaXNbMF0sIGpRdWVyeSggZWxlbSApICk7CgkJfQoKCQkvLyBMb2NhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBkZXNpcmVkIGVsZW1lbnQKCQlyZXR1cm4galF1ZXJ5LmluQXJyYXkoCgkJCS8vIElmIGl0IHJlY2VpdmVzIGEgalF1ZXJ5IG9iamVjdCwgdGhlIGZpcnN0IGVsZW1lbnQgaXMgdXNlZAoJCQllbGVtLmpxdWVyeSA/IGVsZW1bMF0gOiBlbGVtLCB0aGlzICk7Cgl9LAoKCWFkZDogZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0ICkgewoJCXZhciBzZXQgPSB0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciID8KCQkJCWpRdWVyeSggc2VsZWN0b3IsIGNvbnRleHQgKSA6CgkJCQlqUXVlcnkubWFrZUFycmF5KCBzZWxlY3RvciAmJiBzZWxlY3Rvci5ub2RlVHlwZSA/IFsgc2VsZWN0b3IgXSA6IHNlbGVjdG9yICksCgkJCWFsbCA9IGpRdWVyeS5tZXJnZSggdGhpcy5nZXQoKSwgc2V0ICk7CgoJCXJldHVybiB0aGlzLnB1c2hTdGFjayggaXNEaXNjb25uZWN0ZWQoIHNldFswXSApIHx8IGlzRGlzY29ubmVjdGVkKCBhbGxbMF0gKSA/CgkJCWFsbCA6CgkJCWpRdWVyeS51bmlxdWUoIGFsbCApICk7Cgl9LAoKCWFuZFNlbGY6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLmFkZCggdGhpcy5wcmV2T2JqZWN0ICk7Cgl9Cn0pOwoKLy8gQSBwYWluZnVsbHkgc2ltcGxlIGNoZWNrIHRvIHNlZSBpZiBhbiBlbGVtZW50IGlzIGRpc2Nvbm5lY3RlZAovLyBmcm9tIGEgZG9jdW1lbnQgKHNob3VsZCBiZSBpbXByb3ZlZCwgd2hlcmUgZmVhc2libGUpLgpmdW5jdGlvbiBpc0Rpc2Nvbm5lY3RlZCggbm9kZSApIHsKCXJldHVybiAhbm9kZSB8fCAhbm9kZS5wYXJlbnROb2RlIHx8IG5vZGUucGFyZW50Tm9kZS5ub2RlVHlwZSA9PT0gMTE7Cn0KCmpRdWVyeS5lYWNoKHsKCXBhcmVudDogZnVuY3Rpb24oIGVsZW0gKSB7CgkJdmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTsKCQlyZXR1cm4gcGFyZW50ICYmIHBhcmVudC5ub2RlVHlwZSAhPT0gMTEgPyBwYXJlbnQgOiBudWxsOwoJfSwKCXBhcmVudHM6IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBqUXVlcnkuZGlyKCBlbGVtLCAicGFyZW50Tm9kZSIgKTsKCX0sCglwYXJlbnRzVW50aWw6IGZ1bmN0aW9uKCBlbGVtLCBpLCB1bnRpbCApIHsKCQlyZXR1cm4galF1ZXJ5LmRpciggZWxlbSwgInBhcmVudE5vZGUiLCB1bnRpbCApOwoJfSwKCW5leHQ6IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBqUXVlcnkubnRoKCBlbGVtLCAyLCAibmV4dFNpYmxpbmciICk7Cgl9LAoJcHJldjogZnVuY3Rpb24oIGVsZW0gKSB7CgkJcmV0dXJuIGpRdWVyeS5udGgoIGVsZW0sIDIsICJwcmV2aW91c1NpYmxpbmciICk7Cgl9LAoJbmV4dEFsbDogZnVuY3Rpb24oIGVsZW0gKSB7CgkJcmV0dXJuIGpRdWVyeS5kaXIoIGVsZW0sICJuZXh0U2libGluZyIgKTsKCX0sCglwcmV2QWxsOiBmdW5jdGlvbiggZWxlbSApIHsKCQlyZXR1cm4galF1ZXJ5LmRpciggZWxlbSwgInByZXZpb3VzU2libGluZyIgKTsKCX0sCgluZXh0VW50aWw6IGZ1bmN0aW9uKCBlbGVtLCBpLCB1bnRpbCApIHsKCQlyZXR1cm4galF1ZXJ5LmRpciggZWxlbSwgIm5leHRTaWJsaW5nIiwgdW50aWwgKTsKCX0sCglwcmV2VW50aWw6IGZ1bmN0aW9uKCBlbGVtLCBpLCB1bnRpbCApIHsKCQlyZXR1cm4galF1ZXJ5LmRpciggZWxlbSwgInByZXZpb3VzU2libGluZyIsIHVudGlsICk7Cgl9LAoJc2libGluZ3M6IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBqUXVlcnkuc2libGluZyggZWxlbS5wYXJlbnROb2RlLmZpcnN0Q2hpbGQsIGVsZW0gKTsKCX0sCgljaGlsZHJlbjogZnVuY3Rpb24oIGVsZW0gKSB7CgkJcmV0dXJuIGpRdWVyeS5zaWJsaW5nKCBlbGVtLmZpcnN0Q2hpbGQgKTsKCX0sCgljb250ZW50czogZnVuY3Rpb24oIGVsZW0gKSB7CgkJcmV0dXJuIGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgImlmcmFtZSIgKSA/CgkJCWVsZW0uY29udGVudERvY3VtZW50IHx8IGVsZW0uY29udGVudFdpbmRvdy5kb2N1bWVudCA6CgkJCWpRdWVyeS5tYWtlQXJyYXkoIGVsZW0uY2hpbGROb2RlcyApOwoJfQp9LCBmdW5jdGlvbiggbmFtZSwgZm4gKSB7CglqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCB1bnRpbCwgc2VsZWN0b3IgKSB7CgkJdmFyIHJldCA9IGpRdWVyeS5tYXAoIHRoaXMsIGZuLCB1bnRpbCApLAoJCQkvLyBUaGUgdmFyaWFibGUgJ2FyZ3MnIHdhcyBpbnRyb2R1Y2VkIGluCgkJCS8vIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvanF1ZXJ5L2NvbW1pdC81MmEwMjM4CgkJCS8vIHRvIHdvcmsgYXJvdW5kIGEgYnVnIGluIENocm9tZSAxMCAoRGV2KSBhbmQgc2hvdWxkIGJlIHJlbW92ZWQgd2hlbiB0aGUgYnVnIGlzIGZpeGVkLgoJCQkvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0xMDUwCgkJCWFyZ3MgPSBzbGljZS5jYWxsKGFyZ3VtZW50cyk7CgoJCWlmICggIXJ1bnRpbC50ZXN0KCBuYW1lICkgKSB7CgkJCXNlbGVjdG9yID0gdW50aWw7CgkJfQoKCQlpZiAoIHNlbGVjdG9yICYmIHR5cGVvZiBzZWxlY3RvciA9PT0gInN0cmluZyIgKSB7CgkJCXJldCA9IGpRdWVyeS5maWx0ZXIoIHNlbGVjdG9yLCByZXQgKTsKCQl9CgoJCXJldCA9IHRoaXMubGVuZ3RoID4gMSAmJiAhZ3VhcmFudGVlZFVuaXF1ZVsgbmFtZSBdID8galF1ZXJ5LnVuaXF1ZSggcmV0ICkgOiByZXQ7CgoJCWlmICggKHRoaXMubGVuZ3RoID4gMSB8fCBybXVsdGlzZWxlY3Rvci50ZXN0KCBzZWxlY3RvciApKSAmJiBycGFyZW50c3ByZXYudGVzdCggbmFtZSApICkgewoJCQlyZXQgPSByZXQucmV2ZXJzZSgpOwoJCX0KCgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCByZXQsIG5hbWUsIGFyZ3Muam9pbigiLCIpICk7Cgl9Owp9KTsKCmpRdWVyeS5leHRlbmQoewoJZmlsdGVyOiBmdW5jdGlvbiggZXhwciwgZWxlbXMsIG5vdCApIHsKCQlpZiAoIG5vdCApIHsKCQkJZXhwciA9ICI6bm90KCIgKyBleHByICsgIikiOwoJCX0KCgkJcmV0dXJuIGVsZW1zLmxlbmd0aCA9PT0gMSA/CgkJCWpRdWVyeS5maW5kLm1hdGNoZXNTZWxlY3RvcihlbGVtc1swXSwgZXhwcikgPyBbIGVsZW1zWzBdIF0gOiBbXSA6CgkJCWpRdWVyeS5maW5kLm1hdGNoZXMoZXhwciwgZWxlbXMpOwoJfSwKCglkaXI6IGZ1bmN0aW9uKCBlbGVtLCBkaXIsIHVudGlsICkgewoJCXZhciBtYXRjaGVkID0gW10sCgkJCWN1ciA9IGVsZW1bIGRpciBdOwoKCQl3aGlsZSAoIGN1ciAmJiBjdXIubm9kZVR5cGUgIT09IDkgJiYgKHVudGlsID09PSB1bmRlZmluZWQgfHwgY3VyLm5vZGVUeXBlICE9PSAxIHx8ICFqUXVlcnkoIGN1ciApLmlzKCB1bnRpbCApKSApIHsKCQkJaWYgKCBjdXIubm9kZVR5cGUgPT09IDEgKSB7CgkJCQltYXRjaGVkLnB1c2goIGN1ciApOwoJCQl9CgkJCWN1ciA9IGN1cltkaXJdOwoJCX0KCQlyZXR1cm4gbWF0Y2hlZDsKCX0sCgoJbnRoOiBmdW5jdGlvbiggY3VyLCByZXN1bHQsIGRpciwgZWxlbSApIHsKCQlyZXN1bHQgPSByZXN1bHQgfHwgMTsKCQl2YXIgbnVtID0gMDsKCgkJZm9yICggOyBjdXI7IGN1ciA9IGN1cltkaXJdICkgewoJCQlpZiAoIGN1ci5ub2RlVHlwZSA9PT0gMSAmJiArK251bSA9PT0gcmVzdWx0ICkgewoJCQkJYnJlYWs7CgkJCX0KCQl9CgoJCXJldHVybiBjdXI7Cgl9LAoKCXNpYmxpbmc6IGZ1bmN0aW9uKCBuLCBlbGVtICkgewoJCXZhciByID0gW107CgoJCWZvciAoIDsgbjsgbiA9IG4ubmV4dFNpYmxpbmcgKSB7CgkJCWlmICggbi5ub2RlVHlwZSA9PT0gMSAmJiBuICE9PSBlbGVtICkgewoJCQkJci5wdXNoKCBuICk7CgkJCX0KCQl9CgoJCXJldHVybiByOwoJfQp9KTsKCi8vIEltcGxlbWVudCB0aGUgaWRlbnRpY2FsIGZ1bmN0aW9uYWxpdHkgZm9yIGZpbHRlciBhbmQgbm90CmZ1bmN0aW9uIHdpbm5vdyggZWxlbWVudHMsIHF1YWxpZmllciwga2VlcCApIHsKCgkvLyBDYW4ndCBwYXNzIG51bGwgb3IgdW5kZWZpbmVkIHRvIGluZGV4T2YgaW4gRmlyZWZveCA0CgkvLyBTZXQgdG8gMCB0byBza2lwIHN0cmluZyBjaGVjawoJcXVhbGlmaWVyID0gcXVhbGlmaWVyIHx8IDA7CgoJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggcXVhbGlmaWVyICkgKSB7CgkJcmV0dXJuIGpRdWVyeS5ncmVwKGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSwgaSApIHsKCQkJdmFyIHJldFZhbCA9ICEhcXVhbGlmaWVyLmNhbGwoIGVsZW0sIGksIGVsZW0gKTsKCQkJcmV0dXJuIHJldFZhbCA9PT0ga2VlcDsKCQl9KTsKCgl9IGVsc2UgaWYgKCBxdWFsaWZpZXIubm9kZVR5cGUgKSB7CgkJcmV0dXJuIGpRdWVyeS5ncmVwKGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSwgaSApIHsKCQkJcmV0dXJuIChlbGVtID09PSBxdWFsaWZpZXIpID09PSBrZWVwOwoJCX0pOwoKCX0gZWxzZSBpZiAoIHR5cGVvZiBxdWFsaWZpZXIgPT09ICJzdHJpbmciICkgewoJCXZhciBmaWx0ZXJlZCA9IGpRdWVyeS5ncmVwKGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHsKCQkJcmV0dXJuIGVsZW0ubm9kZVR5cGUgPT09IDE7CgkJfSk7CgoJCWlmICggaXNTaW1wbGUudGVzdCggcXVhbGlmaWVyICkgKSB7CgkJCXJldHVybiBqUXVlcnkuZmlsdGVyKHF1YWxpZmllciwgZmlsdGVyZWQsICFrZWVwKTsKCQl9IGVsc2UgewoJCQlxdWFsaWZpZXIgPSBqUXVlcnkuZmlsdGVyKCBxdWFsaWZpZXIsIGZpbHRlcmVkICk7CgkJfQoJfQoKCXJldHVybiBqUXVlcnkuZ3JlcChlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0sIGkgKSB7CgkJcmV0dXJuIChqUXVlcnkuaW5BcnJheSggZWxlbSwgcXVhbGlmaWVyICkgPj0gMCkgPT09IGtlZXA7Cgl9KTsKfQoKCgoKdmFyIHJpbmxpbmVqUXVlcnkgPSAvIGpRdWVyeVxkKz0iKD86XGQrfG51bGwpIi9nLAoJcmxlYWRpbmdXaGl0ZXNwYWNlID0gL15ccysvLAoJcnhodG1sVGFnID0gLzwoPyFhcmVhfGJyfGNvbHxlbWJlZHxocnxpbWd8aW5wdXR8bGlua3xtZXRhfHBhcmFtKSgoW1x3Ol0rKVtePl0qKVwvPi9pZywKCXJ0YWdOYW1lID0gLzwoW1x3Ol0rKS8sCglydGJvZHkgPSAvPHRib2R5L2ksCglyaHRtbCA9IC88fCYjP1x3KzsvLAoJcm5vY2FjaGUgPSAvPCg/OnNjcmlwdHxvYmplY3R8ZW1iZWR8b3B0aW9ufHN0eWxlKS9pLAoJLy8gY2hlY2tlZD0iY2hlY2tlZCIgb3IgY2hlY2tlZAoJcmNoZWNrZWQgPSAvY2hlY2tlZFxzKig/OltePV18PVxzKi5jaGVja2VkLikvaSwKCXJzY3JpcHRUeXBlID0gL1wvKGphdmF8ZWNtYSlzY3JpcHQvaSwKCXJjbGVhblNjcmlwdCA9IC9eXHMqPCEoPzpcW0NEQVRBXFt8XC1cLSkvLAoJd3JhcE1hcCA9IHsKCQlvcHRpb246IFsgMSwgIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz4iLCAiPC9zZWxlY3Q+IiBdLAoJCWxlZ2VuZDogWyAxLCAiPGZpZWxkc2V0PiIsICI8L2ZpZWxkc2V0PiIgXSwKCQl0aGVhZDogWyAxLCAiPHRhYmxlPiIsICI8L3RhYmxlPiIgXSwKCQl0cjogWyAyLCAiPHRhYmxlPjx0Ym9keT4iLCAiPC90Ym9keT48L3RhYmxlPiIgXSwKCQl0ZDogWyAzLCAiPHRhYmxlPjx0Ym9keT48dHI+IiwgIjwvdHI+PC90Ym9keT48L3RhYmxlPiIgXSwKCQljb2w6IFsgMiwgIjx0YWJsZT48dGJvZHk+PC90Ym9keT48Y29sZ3JvdXA+IiwgIjwvY29sZ3JvdXA+PC90YWJsZT4iIF0sCgkJYXJlYTogWyAxLCAiPG1hcD4iLCAiPC9tYXA+IiBdLAoJCV9kZWZhdWx0OiBbIDAsICIiLCAiIiBdCgl9OwoKd3JhcE1hcC5vcHRncm91cCA9IHdyYXBNYXAub3B0aW9uOwp3cmFwTWFwLnRib2R5ID0gd3JhcE1hcC50Zm9vdCA9IHdyYXBNYXAuY29sZ3JvdXAgPSB3cmFwTWFwLmNhcHRpb24gPSB3cmFwTWFwLnRoZWFkOwp3cmFwTWFwLnRoID0gd3JhcE1hcC50ZDsKCi8vIElFIGNhbid0IHNlcmlhbGl6ZSA8bGluaz4gYW5kIDxzY3JpcHQ+IHRhZ3Mgbm9ybWFsbHkKaWYgKCAhalF1ZXJ5LnN1cHBvcnQuaHRtbFNlcmlhbGl6ZSApIHsKCXdyYXBNYXAuX2RlZmF1bHQgPSBbIDEsICJkaXY8ZGl2PiIsICI8L2Rpdj4iIF07Cn0KCmpRdWVyeS5mbi5leHRlbmQoewoJdGV4dDogZnVuY3Rpb24oIHRleHQgKSB7CgkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbih0ZXh0KSApIHsKCQkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihpKSB7CgkJCQl2YXIgc2VsZiA9IGpRdWVyeSggdGhpcyApOwoKCQkJCXNlbGYudGV4dCggdGV4dC5jYWxsKHRoaXMsIGksIHNlbGYudGV4dCgpKSApOwoJCQl9KTsKCQl9CgoJCWlmICggdHlwZW9mIHRleHQgIT09ICJvYmplY3QiICYmIHRleHQgIT09IHVuZGVmaW5lZCApIHsKCQkJcmV0dXJuIHRoaXMuZW1wdHkoKS5hcHBlbmQoICh0aGlzWzBdICYmIHRoaXNbMF0ub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudCkuY3JlYXRlVGV4dE5vZGUoIHRleHQgKSApOwoJCX0KCgkJcmV0dXJuIGpRdWVyeS50ZXh0KCB0aGlzICk7Cgl9LAoKCXdyYXBBbGw6IGZ1bmN0aW9uKCBodG1sICkgewoJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGh0bWwgKSApIHsKCQkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihpKSB7CgkJCQlqUXVlcnkodGhpcykud3JhcEFsbCggaHRtbC5jYWxsKHRoaXMsIGkpICk7CgkJCX0pOwoJCX0KCgkJaWYgKCB0aGlzWzBdICkgewoJCQkvLyBUaGUgZWxlbWVudHMgdG8gd3JhcCB0aGUgdGFyZ2V0IGFyb3VuZAoJCQl2YXIgd3JhcCA9IGpRdWVyeSggaHRtbCwgdGhpc1swXS5vd25lckRvY3VtZW50ICkuZXEoMCkuY2xvbmUodHJ1ZSk7CgoJCQlpZiAoIHRoaXNbMF0ucGFyZW50Tm9kZSApIHsKCQkJCXdyYXAuaW5zZXJ0QmVmb3JlKCB0aGlzWzBdICk7CgkJCX0KCgkJCXdyYXAubWFwKGZ1bmN0aW9uKCkgewoJCQkJdmFyIGVsZW0gPSB0aGlzOwoKCQkJCXdoaWxlICggZWxlbS5maXJzdENoaWxkICYmIGVsZW0uZmlyc3RDaGlsZC5ub2RlVHlwZSA9PT0gMSApIHsKCQkJCQllbGVtID0gZWxlbS5maXJzdENoaWxkOwoJCQkJfQoKCQkJCXJldHVybiBlbGVtOwoJCQl9KS5hcHBlbmQoIHRoaXMgKTsKCQl9CgoJCXJldHVybiB0aGlzOwoJfSwKCgl3cmFwSW5uZXI6IGZ1bmN0aW9uKCBodG1sICkgewoJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGh0bWwgKSApIHsKCQkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihpKSB7CgkJCQlqUXVlcnkodGhpcykud3JhcElubmVyKCBodG1sLmNhbGwodGhpcywgaSkgKTsKCQkJfSk7CgkJfQoKCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQl2YXIgc2VsZiA9IGpRdWVyeSggdGhpcyApLAoJCQkJY29udGVudHMgPSBzZWxmLmNvbnRlbnRzKCk7CgoJCQlpZiAoIGNvbnRlbnRzLmxlbmd0aCApIHsKCQkJCWNvbnRlbnRzLndyYXBBbGwoIGh0bWwgKTsKCgkJCX0gZWxzZSB7CgkJCQlzZWxmLmFwcGVuZCggaHRtbCApOwoJCQl9CgkJfSk7Cgl9LAoKCXdyYXA6IGZ1bmN0aW9uKCBodG1sICkgewoJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CgkJCWpRdWVyeSggdGhpcyApLndyYXBBbGwoIGh0bWwgKTsKCQl9KTsKCX0sCgoJdW53cmFwOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5wYXJlbnQoKS5lYWNoKGZ1bmN0aW9uKCkgewoJCQlpZiAoICFqUXVlcnkubm9kZU5hbWUoIHRoaXMsICJib2R5IiApICkgewoJCQkJalF1ZXJ5KCB0aGlzICkucmVwbGFjZVdpdGgoIHRoaXMuY2hpbGROb2RlcyApOwoJCQl9CgkJfSkuZW5kKCk7Cgl9LAoKCWFwcGVuZDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLCB0cnVlLCBmdW5jdGlvbiggZWxlbSApIHsKCQkJaWYgKCB0aGlzLm5vZGVUeXBlID09PSAxICkgewoJCQkJdGhpcy5hcHBlbmRDaGlsZCggZWxlbSApOwoJCQl9CgkJfSk7Cgl9LAoKCXByZXBlbmQ6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cywgdHJ1ZSwgZnVuY3Rpb24oIGVsZW0gKSB7CgkJCWlmICggdGhpcy5ub2RlVHlwZSA9PT0gMSApIHsKCQkJCXRoaXMuaW5zZXJ0QmVmb3JlKCBlbGVtLCB0aGlzLmZpcnN0Q2hpbGQgKTsKCQkJfQoJCX0pOwoJfSwKCgliZWZvcmU6IGZ1bmN0aW9uKCkgewoJCWlmICggdGhpc1swXSAmJiB0aGlzWzBdLnBhcmVudE5vZGUgKSB7CgkJCXJldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cywgZmFsc2UsIGZ1bmN0aW9uKCBlbGVtICkgewoJCQkJdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSggZWxlbSwgdGhpcyApOwoJCQl9KTsKCQl9IGVsc2UgaWYgKCBhcmd1bWVudHMubGVuZ3RoICkgewoJCQl2YXIgc2V0ID0galF1ZXJ5KGFyZ3VtZW50c1swXSk7CgkJCXNldC5wdXNoLmFwcGx5KCBzZXQsIHRoaXMudG9BcnJheSgpICk7CgkJCXJldHVybiB0aGlzLnB1c2hTdGFjayggc2V0LCAiYmVmb3JlIiwgYXJndW1lbnRzICk7CgkJfQoJfSwKCglhZnRlcjogZnVuY3Rpb24oKSB7CgkJaWYgKCB0aGlzWzBdICYmIHRoaXNbMF0ucGFyZW50Tm9kZSApIHsKCQkJcmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLCBmYWxzZSwgZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQl0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKCBlbGVtLCB0aGlzLm5leHRTaWJsaW5nICk7CgkJCX0pOwoJCX0gZWxzZSBpZiAoIGFyZ3VtZW50cy5sZW5ndGggKSB7CgkJCXZhciBzZXQgPSB0aGlzLnB1c2hTdGFjayggdGhpcywgImFmdGVyIiwgYXJndW1lbnRzICk7CgkJCXNldC5wdXNoLmFwcGx5KCBzZXQsIGpRdWVyeShhcmd1bWVudHNbMF0pLnRvQXJyYXkoKSApOwoJCQlyZXR1cm4gc2V0OwoJCX0KCX0sCgoJLy8ga2VlcERhdGEgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5LS1kbyBub3QgZG9jdW1lbnQKCXJlbW92ZTogZnVuY3Rpb24oIHNlbGVjdG9yLCBrZWVwRGF0YSApIHsKCQlmb3IgKCB2YXIgaSA9IDAsIGVsZW07IChlbGVtID0gdGhpc1tpXSkgIT0gbnVsbDsgaSsrICkgewoJCQlpZiAoICFzZWxlY3RvciB8fCBqUXVlcnkuZmlsdGVyKCBzZWxlY3RvciwgWyBlbGVtIF0gKS5sZW5ndGggKSB7CgkJCQlpZiAoICFrZWVwRGF0YSAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkgewoJCQkJCWpRdWVyeS5jbGVhbkRhdGEoIGVsZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSApOwoJCQkJCWpRdWVyeS5jbGVhbkRhdGEoIFsgZWxlbSBdICk7CgkJCQl9CgoJCQkJaWYgKCBlbGVtLnBhcmVudE5vZGUgKSB7CgkJCQkJZWxlbS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBlbGVtICk7CgkJCQl9CgkJCX0KCQl9CgoJCXJldHVybiB0aGlzOwoJfSwKCgllbXB0eTogZnVuY3Rpb24oKSB7CgkJZm9yICggdmFyIGkgPSAwLCBlbGVtOyAoZWxlbSA9IHRoaXNbaV0pICE9IG51bGw7IGkrKyApIHsKCQkJLy8gUmVtb3ZlIGVsZW1lbnQgbm9kZXMgYW5kIHByZXZlbnQgbWVtb3J5IGxlYWtzCgkJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHsKCQkJCWpRdWVyeS5jbGVhbkRhdGEoIGVsZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSApOwoJCQl9CgoJCQkvLyBSZW1vdmUgYW55IHJlbWFpbmluZyBub2RlcwoJCQl3aGlsZSAoIGVsZW0uZmlyc3RDaGlsZCApIHsKCQkJCWVsZW0ucmVtb3ZlQ2hpbGQoIGVsZW0uZmlyc3RDaGlsZCApOwoJCQl9CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCgoJY2xvbmU6IGZ1bmN0aW9uKCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApIHsKCQlkYXRhQW5kRXZlbnRzID0gZGF0YUFuZEV2ZW50cyA9PSBudWxsID8gZmFsc2UgOiBkYXRhQW5kRXZlbnRzOwoJCWRlZXBEYXRhQW5kRXZlbnRzID0gZGVlcERhdGFBbmRFdmVudHMgPT0gbnVsbCA/IGRhdGFBbmRFdmVudHMgOiBkZWVwRGF0YUFuZEV2ZW50czsKCgkJcmV0dXJuIHRoaXMubWFwKCBmdW5jdGlvbiAoKSB7CgkJCXJldHVybiBqUXVlcnkuY2xvbmUoIHRoaXMsIGRhdGFBbmRFdmVudHMsIGRlZXBEYXRhQW5kRXZlbnRzICk7CgkJfSk7Cgl9LAoKCWh0bWw6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQlpZiAoIHZhbHVlID09PSB1bmRlZmluZWQgKSB7CgkJCXJldHVybiB0aGlzWzBdICYmIHRoaXNbMF0ubm9kZVR5cGUgPT09IDEgPwoJCQkJdGhpc1swXS5pbm5lckhUTUwucmVwbGFjZShyaW5saW5lalF1ZXJ5LCAiIikgOgoJCQkJbnVsbDsKCgkJLy8gU2VlIGlmIHdlIGNhbiB0YWtlIGEgc2hvcnRjdXQgYW5kIGp1c3QgdXNlIGlubmVySFRNTAoJCX0gZWxzZSBpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gInN0cmluZyIgJiYgIXJub2NhY2hlLnRlc3QoIHZhbHVlICkgJiYKCQkJKGpRdWVyeS5zdXBwb3J0LmxlYWRpbmdXaGl0ZXNwYWNlIHx8ICFybGVhZGluZ1doaXRlc3BhY2UudGVzdCggdmFsdWUgKSkgJiYKCQkJIXdyYXBNYXBbIChydGFnTmFtZS5leGVjKCB2YWx1ZSApIHx8IFsiIiwgIiJdKVsxXS50b0xvd2VyQ2FzZSgpIF0gKSB7CgoJCQl2YWx1ZSA9IHZhbHVlLnJlcGxhY2UocnhodG1sVGFnLCAiPCQxPjwvJDI+Iik7CgoJCQl0cnkgewoJCQkJZm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CgkJCQkJLy8gUmVtb3ZlIGVsZW1lbnQgbm9kZXMgYW5kIHByZXZlbnQgbWVtb3J5IGxlYWtzCgkJCQkJaWYgKCB0aGlzW2ldLm5vZGVUeXBlID09PSAxICkgewoJCQkJCQlqUXVlcnkuY2xlYW5EYXRhKCB0aGlzW2ldLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikgKTsKCQkJCQkJdGhpc1tpXS5pbm5lckhUTUwgPSB2YWx1ZTsKCQkJCQl9CgkJCQl9CgoJCQkvLyBJZiB1c2luZyBpbm5lckhUTUwgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgdXNlIHRoZSBmYWxsYmFjayBtZXRob2QKCQkJfSBjYXRjaChlKSB7CgkJCQl0aGlzLmVtcHR5KCkuYXBwZW5kKCB2YWx1ZSApOwoJCQl9CgoJCX0gZWxzZSBpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApICkgewoJCQl0aGlzLmVhY2goZnVuY3Rpb24oaSl7CgkJCQl2YXIgc2VsZiA9IGpRdWVyeSggdGhpcyApOwoKCQkJCXNlbGYuaHRtbCggdmFsdWUuY2FsbCh0aGlzLCBpLCBzZWxmLmh0bWwoKSkgKTsKCQkJfSk7CgoJCX0gZWxzZSB7CgkJCXRoaXMuZW1wdHkoKS5hcHBlbmQoIHZhbHVlICk7CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCgoJcmVwbGFjZVdpdGg6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQlpZiAoIHRoaXNbMF0gJiYgdGhpc1swXS5wYXJlbnROb2RlICkgewoJCQkvLyBNYWtlIHN1cmUgdGhhdCB0aGUgZWxlbWVudHMgYXJlIHJlbW92ZWQgZnJvbSB0aGUgRE9NIGJlZm9yZSB0aGV5IGFyZSBpbnNlcnRlZAoJCQkvLyB0aGlzIGNhbiBoZWxwIGZpeCByZXBsYWNpbmcgYSBwYXJlbnQgd2l0aCBjaGlsZCBlbGVtZW50cwoJCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApICkgewoJCQkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihpKSB7CgkJCQkJdmFyIHNlbGYgPSBqUXVlcnkodGhpcyksIG9sZCA9IHNlbGYuaHRtbCgpOwoJCQkJCXNlbGYucmVwbGFjZVdpdGgoIHZhbHVlLmNhbGwoIHRoaXMsIGksIG9sZCApICk7CgkJCQl9KTsKCQkJfQoKCQkJaWYgKCB0eXBlb2YgdmFsdWUgIT09ICJzdHJpbmciICkgewoJCQkJdmFsdWUgPSBqUXVlcnkoIHZhbHVlICkuZGV0YWNoKCk7CgkJCX0KCgkJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CgkJCQl2YXIgbmV4dCA9IHRoaXMubmV4dFNpYmxpbmcsCgkJCQkJcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlOwoKCQkJCWpRdWVyeSggdGhpcyApLnJlbW92ZSgpOwoKCQkJCWlmICggbmV4dCApIHsKCQkJCQlqUXVlcnkobmV4dCkuYmVmb3JlKCB2YWx1ZSApOwoJCQkJfSBlbHNlIHsKCQkJCQlqUXVlcnkocGFyZW50KS5hcHBlbmQoIHZhbHVlICk7CgkJCQl9CgkJCX0pOwoJCX0gZWxzZSB7CgkJCXJldHVybiB0aGlzLmxlbmd0aCA/CgkJCQl0aGlzLnB1c2hTdGFjayggalF1ZXJ5KGpRdWVyeS5pc0Z1bmN0aW9uKHZhbHVlKSA/IHZhbHVlKCkgOiB2YWx1ZSksICJyZXBsYWNlV2l0aCIsIHZhbHVlICkgOgoJCQkJdGhpczsKCQl9Cgl9LAoKCWRldGFjaDogZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXJldHVybiB0aGlzLnJlbW92ZSggc2VsZWN0b3IsIHRydWUgKTsKCX0sCgoJZG9tTWFuaXA6IGZ1bmN0aW9uKCBhcmdzLCB0YWJsZSwgY2FsbGJhY2sgKSB7CgkJdmFyIHJlc3VsdHMsIGZpcnN0LCBmcmFnbWVudCwgcGFyZW50LAoJCQl2YWx1ZSA9IGFyZ3NbMF0sCgkJCXNjcmlwdHMgPSBbXTsKCgkJLy8gV2UgY2FuJ3QgY2xvbmVOb2RlIGZyYWdtZW50cyB0aGF0IGNvbnRhaW4gY2hlY2tlZCwgaW4gV2ViS2l0CgkJaWYgKCAhalF1ZXJ5LnN1cHBvcnQuY2hlY2tDbG9uZSAmJiBhcmd1bWVudHMubGVuZ3RoID09PSAzICYmIHR5cGVvZiB2YWx1ZSA9PT0gInN0cmluZyIgJiYgcmNoZWNrZWQudGVzdCggdmFsdWUgKSApIHsKCQkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKCQkJCWpRdWVyeSh0aGlzKS5kb21NYW5pcCggYXJncywgdGFibGUsIGNhbGxiYWNrLCB0cnVlICk7CgkJCX0pOwoJCX0KCgkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbih2YWx1ZSkgKSB7CgkJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oaSkgewoJCQkJdmFyIHNlbGYgPSBqUXVlcnkodGhpcyk7CgkJCQlhcmdzWzBdID0gdmFsdWUuY2FsbCh0aGlzLCBpLCB0YWJsZSA/IHNlbGYuaHRtbCgpIDogdW5kZWZpbmVkKTsKCQkJCXNlbGYuZG9tTWFuaXAoIGFyZ3MsIHRhYmxlLCBjYWxsYmFjayApOwoJCQl9KTsKCQl9CgoJCWlmICggdGhpc1swXSApIHsKCQkJcGFyZW50ID0gdmFsdWUgJiYgdmFsdWUucGFyZW50Tm9kZTsKCgkJCS8vIElmIHdlJ3JlIGluIGEgZnJhZ21lbnQsIGp1c3QgdXNlIHRoYXQgaW5zdGVhZCBvZiBidWlsZGluZyBhIG5ldyBvbmUKCQkJaWYgKCBqUXVlcnkuc3VwcG9ydC5wYXJlbnROb2RlICYmIHBhcmVudCAmJiBwYXJlbnQubm9kZVR5cGUgPT09IDExICYmIHBhcmVudC5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gdGhpcy5sZW5ndGggKSB7CgkJCQlyZXN1bHRzID0geyBmcmFnbWVudDogcGFyZW50IH07CgoJCQl9IGVsc2UgewoJCQkJcmVzdWx0cyA9IGpRdWVyeS5idWlsZEZyYWdtZW50KCBhcmdzLCB0aGlzLCBzY3JpcHRzICk7CgkJCX0KCgkJCWZyYWdtZW50ID0gcmVzdWx0cy5mcmFnbWVudDsKCgkJCWlmICggZnJhZ21lbnQuY2hpbGROb2Rlcy5sZW5ndGggPT09IDEgKSB7CgkJCQlmaXJzdCA9IGZyYWdtZW50ID0gZnJhZ21lbnQuZmlyc3RDaGlsZDsKCQkJfSBlbHNlIHsKCQkJCWZpcnN0ID0gZnJhZ21lbnQuZmlyc3RDaGlsZDsKCQkJfQoKCQkJaWYgKCBmaXJzdCApIHsKCQkJCXRhYmxlID0gdGFibGUgJiYgalF1ZXJ5Lm5vZGVOYW1lKCBmaXJzdCwgInRyIiApOwoKCQkJCWZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMubGVuZ3RoLCBsYXN0SW5kZXggPSBsIC0gMTsgaSA8IGw7IGkrKyApIHsKCQkJCQljYWxsYmFjay5jYWxsKAoJCQkJCQl0YWJsZSA/CgkJCQkJCQlyb290KHRoaXNbaV0sIGZpcnN0KSA6CgkJCQkJCQl0aGlzW2ldLAoJCQkJCQkvLyBNYWtlIHN1cmUgdGhhdCB3ZSBkbyBub3QgbGVhayBtZW1vcnkgYnkgaW5hZHZlcnRlbnRseSBkaXNjYXJkaW5nCgkJCQkJCS8vIHRoZSBvcmlnaW5hbCBmcmFnbWVudCAod2hpY2ggbWlnaHQgaGF2ZSBhdHRhY2hlZCBkYXRhKSBpbnN0ZWFkIG9mCgkJCQkJCS8vIHVzaW5nIGl0OyBpbiBhZGRpdGlvbiwgdXNlIHRoZSBvcmlnaW5hbCBmcmFnbWVudCBvYmplY3QgZm9yIHRoZSBsYXN0CgkJCQkJCS8vIGl0ZW0gaW5zdGVhZCBvZiBmaXJzdCBiZWNhdXNlIGl0IGNhbiBlbmQgdXAgYmVpbmcgZW1wdGllZCBpbmNvcnJlY3RseQoJCQkJCQkvLyBpbiBjZXJ0YWluIHNpdHVhdGlvbnMgKEJ1ZyAjODA3MCkuCgkJCQkJCS8vIEZyYWdtZW50cyBmcm9tIHRoZSBmcmFnbWVudCBjYWNoZSBtdXN0IGFsd2F5cyBiZSBjbG9uZWQgYW5kIG5ldmVyIHVzZWQKCQkJCQkJLy8gaW4gcGxhY2UuCgkJCQkJCXJlc3VsdHMuY2FjaGVhYmxlIHx8IChsID4gMSAmJiBpIDwgbGFzdEluZGV4KSA/CgkJCQkJCQlqUXVlcnkuY2xvbmUoIGZyYWdtZW50LCB0cnVlLCB0cnVlICkgOgoJCQkJCQkJZnJhZ21lbnQKCQkJCQkpOwoJCQkJfQoJCQl9CgoJCQlpZiAoIHNjcmlwdHMubGVuZ3RoICkgewoJCQkJalF1ZXJ5LmVhY2goIHNjcmlwdHMsIGV2YWxTY3JpcHQgKTsKCQkJfQoJCX0KCgkJcmV0dXJuIHRoaXM7Cgl9Cn0pOwoKZnVuY3Rpb24gcm9vdCggZWxlbSwgY3VyICkgewoJcmV0dXJuIGpRdWVyeS5ub2RlTmFtZShlbGVtLCAidGFibGUiKSA/CgkJKGVsZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRib2R5IilbMF0gfHwKCQllbGVtLmFwcGVuZENoaWxkKGVsZW0ub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0Ym9keSIpKSkgOgoJCWVsZW07Cn0KCmZ1bmN0aW9uIGNsb25lQ29weUV2ZW50KCBzcmMsIGRlc3QgKSB7CgoJaWYgKCBkZXN0Lm5vZGVUeXBlICE9PSAxIHx8ICFqUXVlcnkuaGFzRGF0YSggc3JjICkgKSB7CgkJcmV0dXJuOwoJfQoKCXZhciBpbnRlcm5hbEtleSA9IGpRdWVyeS5leHBhbmRvLAoJCW9sZERhdGEgPSBqUXVlcnkuZGF0YSggc3JjICksCgkJY3VyRGF0YSA9IGpRdWVyeS5kYXRhKCBkZXN0LCBvbGREYXRhICk7CgoJLy8gU3dpdGNoIHRvIHVzZSB0aGUgaW50ZXJuYWwgZGF0YSBvYmplY3QsIGlmIGl0IGV4aXN0cywgZm9yIHRoZSBuZXh0CgkvLyBzdGFnZSBvZiBkYXRhIGNvcHlpbmcKCWlmICggKG9sZERhdGEgPSBvbGREYXRhWyBpbnRlcm5hbEtleSBdKSApIHsKCQl2YXIgZXZlbnRzID0gb2xkRGF0YS5ldmVudHM7CgkJCQljdXJEYXRhID0gY3VyRGF0YVsgaW50ZXJuYWxLZXkgXSA9IGpRdWVyeS5leHRlbmQoe30sIG9sZERhdGEpOwoKCQlpZiAoIGV2ZW50cyApIHsKCQkJZGVsZXRlIGN1ckRhdGEuaGFuZGxlOwoJCQljdXJEYXRhLmV2ZW50cyA9IHt9OwoKCQkJZm9yICggdmFyIHR5cGUgaW4gZXZlbnRzICkgewoJCQkJZm9yICggdmFyIGkgPSAwLCBsID0gZXZlbnRzWyB0eXBlIF0ubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCQkJCWpRdWVyeS5ldmVudC5hZGQoIGRlc3QsIHR5cGUgKyAoIGV2ZW50c1sgdHlwZSBdWyBpIF0ubmFtZXNwYWNlID8gIi4iIDogIiIgKSArIGV2ZW50c1sgdHlwZSBdWyBpIF0ubmFtZXNwYWNlLCBldmVudHNbIHR5cGUgXVsgaSBdLCBldmVudHNbIHR5cGUgXVsgaSBdLmRhdGEgKTsKCQkJCX0KCQkJfQoJCX0KCX0KfQoKZnVuY3Rpb24gY2xvbmVGaXhBdHRyaWJ1dGVzKCBzcmMsIGRlc3QgKSB7Cgl2YXIgbm9kZU5hbWU7CgoJLy8gV2UgZG8gbm90IG5lZWQgdG8gZG8gYW55dGhpbmcgZm9yIG5vbi1FbGVtZW50cwoJaWYgKCBkZXN0Lm5vZGVUeXBlICE9PSAxICkgewoJCXJldHVybjsKCX0KCgkvLyBjbGVhckF0dHJpYnV0ZXMgcmVtb3ZlcyB0aGUgYXR0cmlidXRlcywgd2hpY2ggd2UgZG9uJ3Qgd2FudCwKCS8vIGJ1dCBhbHNvIHJlbW92ZXMgdGhlIGF0dGFjaEV2ZW50IGV2ZW50cywgd2hpY2ggd2UgKmRvKiB3YW50CglpZiAoIGRlc3QuY2xlYXJBdHRyaWJ1dGVzICkgewoJCWRlc3QuY2xlYXJBdHRyaWJ1dGVzKCk7Cgl9CgoJLy8gbWVyZ2VBdHRyaWJ1dGVzLCBpbiBjb250cmFzdCwgb25seSBtZXJnZXMgYmFjayBvbiB0aGUKCS8vIG9yaWdpbmFsIGF0dHJpYnV0ZXMsIG5vdCB0aGUgZXZlbnRzCglpZiAoIGRlc3QubWVyZ2VBdHRyaWJ1dGVzICkgewoJCWRlc3QubWVyZ2VBdHRyaWJ1dGVzKCBzcmMgKTsKCX0KCglub2RlTmFtZSA9IGRlc3Qubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKCgkvLyBJRTYtOCBmYWlsIHRvIGNsb25lIGNoaWxkcmVuIGluc2lkZSBvYmplY3QgZWxlbWVudHMgdGhhdCB1c2UKCS8vIHRoZSBwcm9wcmlldGFyeSBjbGFzc2lkIGF0dHJpYnV0ZSB2YWx1ZSAocmF0aGVyIHRoYW4gdGhlIHR5cGUKCS8vIGF0dHJpYnV0ZSkgdG8gaWRlbnRpZnkgdGhlIHR5cGUgb2YgY29udGVudCB0byBkaXNwbGF5CglpZiAoIG5vZGVOYW1lID09PSAib2JqZWN0IiApIHsKCQlkZXN0Lm91dGVySFRNTCA9IHNyYy5vdXRlckhUTUw7CgoJfSBlbHNlIGlmICggbm9kZU5hbWUgPT09ICJpbnB1dCIgJiYgKHNyYy50eXBlID09PSAiY2hlY2tib3giIHx8IHNyYy50eXBlID09PSAicmFkaW8iKSApIHsKCQkvLyBJRTYtOCBmYWlscyB0byBwZXJzaXN0IHRoZSBjaGVja2VkIHN0YXRlIG9mIGEgY2xvbmVkIGNoZWNrYm94CgkJLy8gb3IgcmFkaW8gYnV0dG9uLiBXb3JzZSwgSUU2LTcgZmFpbCB0byBnaXZlIHRoZSBjbG9uZWQgZWxlbWVudAoJCS8vIGEgY2hlY2tlZCBhcHBlYXJhbmNlIGlmIHRoZSBkZWZhdWx0Q2hlY2tlZCB2YWx1ZSBpc24ndCBhbHNvIHNldAoJCWlmICggc3JjLmNoZWNrZWQgKSB7CgkJCWRlc3QuZGVmYXVsdENoZWNrZWQgPSBkZXN0LmNoZWNrZWQgPSBzcmMuY2hlY2tlZDsKCQl9CgoJCS8vIElFNi03IGdldCBjb25mdXNlZCBhbmQgZW5kIHVwIHNldHRpbmcgdGhlIHZhbHVlIG9mIGEgY2xvbmVkCgkJLy8gY2hlY2tib3gvcmFkaW8gYnV0dG9uIHRvIGFuIGVtcHR5IHN0cmluZyBpbnN0ZWFkIG9mICJvbiIKCQlpZiAoIGRlc3QudmFsdWUgIT09IHNyYy52YWx1ZSApIHsKCQkJZGVzdC52YWx1ZSA9IHNyYy52YWx1ZTsKCQl9CgoJLy8gSUU2LTggZmFpbHMgdG8gcmV0dXJuIHRoZSBzZWxlY3RlZCBvcHRpb24gdG8gdGhlIGRlZmF1bHQgc2VsZWN0ZWQKCS8vIHN0YXRlIHdoZW4gY2xvbmluZyBvcHRpb25zCgl9IGVsc2UgaWYgKCBub2RlTmFtZSA9PT0gIm9wdGlvbiIgKSB7CgkJZGVzdC5zZWxlY3RlZCA9IHNyYy5kZWZhdWx0U2VsZWN0ZWQ7CgoJLy8gSUU2LTggZmFpbHMgdG8gc2V0IHRoZSBkZWZhdWx0VmFsdWUgdG8gdGhlIGNvcnJlY3QgdmFsdWUgd2hlbgoJLy8gY2xvbmluZyBvdGhlciB0eXBlcyBvZiBpbnB1dCBmaWVsZHMKCX0gZWxzZSBpZiAoIG5vZGVOYW1lID09PSAiaW5wdXQiIHx8IG5vZGVOYW1lID09PSAidGV4dGFyZWEiICkgewoJCWRlc3QuZGVmYXVsdFZhbHVlID0gc3JjLmRlZmF1bHRWYWx1ZTsKCX0KCgkvLyBFdmVudCBkYXRhIGdldHMgcmVmZXJlbmNlZCBpbnN0ZWFkIG9mIGNvcGllZCBpZiB0aGUgZXhwYW5kbwoJLy8gZ2V0cyBjb3BpZWQgdG9vCglkZXN0LnJlbW92ZUF0dHJpYnV0ZSggalF1ZXJ5LmV4cGFuZG8gKTsKfQoKalF1ZXJ5LmJ1aWxkRnJhZ21lbnQgPSBmdW5jdGlvbiggYXJncywgbm9kZXMsIHNjcmlwdHMgKSB7Cgl2YXIgZnJhZ21lbnQsIGNhY2hlYWJsZSwgY2FjaGVyZXN1bHRzLCBkb2M7CgogIC8vIG5vZGVzIG1heSBjb250YWluIGVpdGhlciBhbiBleHBsaWNpdCBkb2N1bWVudCBvYmplY3QsCiAgLy8gYSBqUXVlcnkgY29sbGVjdGlvbiBvciBjb250ZXh0IG9iamVjdC4KICAvLyBJZiBub2Rlc1swXSBjb250YWlucyBhIHZhbGlkIG9iamVjdCB0byBhc3NpZ24gdG8gZG9jCiAgaWYgKCBub2RlcyAmJiBub2Rlc1swXSApIHsKICAgIGRvYyA9IG5vZGVzWzBdLm93bmVyRG9jdW1lbnQgfHwgbm9kZXNbMF07CiAgfQoKICAvLyBFbnN1cmUgdGhhdCBhbiBhdHRyIG9iamVjdCBkb2Vzbid0IGluY29ycmVjdGx5IHN0YW5kIGluIGFzIGEgZG9jdW1lbnQgb2JqZWN0CgkvLyBDaHJvbWUgYW5kIEZpcmVmb3ggc2VlbSB0byBhbGxvdyB0aGlzIHRvIG9jY3VyIGFuZCB3aWxsIHRocm93IGV4Y2VwdGlvbgoJLy8gRml4ZXMgIzg5NTAKCWlmICggIWRvYy5jcmVhdGVEb2N1bWVudEZyYWdtZW50ICkgewoJCWRvYyA9IGRvY3VtZW50OwoJfQoKCS8vIE9ubHkgY2FjaGUgInNtYWxsIiAoMS8yIEtCKSBIVE1MIHN0cmluZ3MgdGhhdCBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBtYWluIGRvY3VtZW50CgkvLyBDbG9uaW5nIG9wdGlvbnMgbG9zZXMgdGhlIHNlbGVjdGVkIHN0YXRlLCBzbyBkb24ndCBjYWNoZSB0aGVtCgkvLyBJRSA2IGRvZXNuJ3QgbGlrZSBpdCB3aGVuIHlvdSBwdXQgPG9iamVjdD4gb3IgPGVtYmVkPiBlbGVtZW50cyBpbiBhIGZyYWdtZW50CgkvLyBBbHNvLCBXZWJLaXQgZG9lcyBub3QgY2xvbmUgJ2NoZWNrZWQnIGF0dHJpYnV0ZXMgb24gY2xvbmVOb2RlLCBzbyBkb24ndCBjYWNoZQoJaWYgKCBhcmdzLmxlbmd0aCA9PT0gMSAmJiB0eXBlb2YgYXJnc1swXSA9PT0gInN0cmluZyIgJiYgYXJnc1swXS5sZW5ndGggPCA1MTIgJiYgZG9jID09PSBkb2N1bWVudCAmJgoJCWFyZ3NbMF0uY2hhckF0KDApID09PSAiPCIgJiYgIXJub2NhY2hlLnRlc3QoIGFyZ3NbMF0gKSAmJiAoalF1ZXJ5LnN1cHBvcnQuY2hlY2tDbG9uZSB8fCAhcmNoZWNrZWQudGVzdCggYXJnc1swXSApKSApIHsKCgkJY2FjaGVhYmxlID0gdHJ1ZTsKCgkJY2FjaGVyZXN1bHRzID0galF1ZXJ5LmZyYWdtZW50c1sgYXJnc1swXSBdOwoJCWlmICggY2FjaGVyZXN1bHRzICYmIGNhY2hlcmVzdWx0cyAhPT0gMSApIHsKCQkJZnJhZ21lbnQgPSBjYWNoZXJlc3VsdHM7CgkJfQoJfQoKCWlmICggIWZyYWdtZW50ICkgewoJCWZyYWdtZW50ID0gZG9jLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsKCQlqUXVlcnkuY2xlYW4oIGFyZ3MsIGRvYywgZnJhZ21lbnQsIHNjcmlwdHMgKTsKCX0KCglpZiAoIGNhY2hlYWJsZSApIHsKCQlqUXVlcnkuZnJhZ21lbnRzWyBhcmdzWzBdIF0gPSBjYWNoZXJlc3VsdHMgPyBmcmFnbWVudCA6IDE7Cgl9CgoJcmV0dXJuIHsgZnJhZ21lbnQ6IGZyYWdtZW50LCBjYWNoZWFibGU6IGNhY2hlYWJsZSB9Owp9OwoKalF1ZXJ5LmZyYWdtZW50cyA9IHt9OwoKalF1ZXJ5LmVhY2goewoJYXBwZW5kVG86ICJhcHBlbmQiLAoJcHJlcGVuZFRvOiAicHJlcGVuZCIsCglpbnNlcnRCZWZvcmU6ICJiZWZvcmUiLAoJaW5zZXJ0QWZ0ZXI6ICJhZnRlciIsCglyZXBsYWNlQWxsOiAicmVwbGFjZVdpdGgiCn0sIGZ1bmN0aW9uKCBuYW1lLCBvcmlnaW5hbCApIHsKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXZhciByZXQgPSBbXSwKCQkJaW5zZXJ0ID0galF1ZXJ5KCBzZWxlY3RvciApLAoJCQlwYXJlbnQgPSB0aGlzLmxlbmd0aCA9PT0gMSAmJiB0aGlzWzBdLnBhcmVudE5vZGU7CgoJCWlmICggcGFyZW50ICYmIHBhcmVudC5ub2RlVHlwZSA9PT0gMTEgJiYgcGFyZW50LmNoaWxkTm9kZXMubGVuZ3RoID09PSAxICYmIGluc2VydC5sZW5ndGggPT09IDEgKSB7CgkJCWluc2VydFsgb3JpZ2luYWwgXSggdGhpc1swXSApOwoJCQlyZXR1cm4gdGhpczsKCgkJfSBlbHNlIHsKCQkJZm9yICggdmFyIGkgPSAwLCBsID0gaW5zZXJ0Lmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKCQkJCXZhciBlbGVtcyA9IChpID4gMCA/IHRoaXMuY2xvbmUodHJ1ZSkgOiB0aGlzKS5nZXQoKTsKCQkJCWpRdWVyeSggaW5zZXJ0W2ldIClbIG9yaWdpbmFsIF0oIGVsZW1zICk7CgkJCQlyZXQgPSByZXQuY29uY2F0KCBlbGVtcyApOwoJCQl9CgoJCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHJldCwgbmFtZSwgaW5zZXJ0LnNlbGVjdG9yICk7CgkJfQoJfTsKfSk7CgpmdW5jdGlvbiBnZXRBbGwoIGVsZW0gKSB7CglpZiAoICJnZXRFbGVtZW50c0J5VGFnTmFtZSIgaW4gZWxlbSApIHsKCQlyZXR1cm4gZWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZSggIioiICk7CgoJfSBlbHNlIGlmICggInF1ZXJ5U2VsZWN0b3JBbGwiIGluIGVsZW0gKSB7CgkJcmV0dXJuIGVsZW0ucXVlcnlTZWxlY3RvckFsbCggIioiICk7CgoJfSBlbHNlIHsKCQlyZXR1cm4gW107Cgl9Cn0KCi8vIFVzZWQgaW4gY2xlYW4sIGZpeGVzIHRoZSBkZWZhdWx0Q2hlY2tlZCBwcm9wZXJ0eQpmdW5jdGlvbiBmaXhEZWZhdWx0Q2hlY2tlZCggZWxlbSApIHsKCWlmICggZWxlbS50eXBlID09PSAiY2hlY2tib3giIHx8IGVsZW0udHlwZSA9PT0gInJhZGlvIiApIHsKCQllbGVtLmRlZmF1bHRDaGVja2VkID0gZWxlbS5jaGVja2VkOwoJfQp9Ci8vIEZpbmRzIGFsbCBpbnB1dHMgYW5kIHBhc3NlcyB0aGVtIHRvIGZpeERlZmF1bHRDaGVja2VkCmZ1bmN0aW9uIGZpbmRJbnB1dHMoIGVsZW0gKSB7CglpZiAoIGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgImlucHV0IiApICkgewoJCWZpeERlZmF1bHRDaGVja2VkKCBlbGVtICk7Cgl9IGVsc2UgaWYgKCAiZ2V0RWxlbWVudHNCeVRhZ05hbWUiIGluIGVsZW0gKSB7CgkJalF1ZXJ5LmdyZXAoIGVsZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0IiksIGZpeERlZmF1bHRDaGVja2VkICk7Cgl9Cn0KCmpRdWVyeS5leHRlbmQoewoJY2xvbmU6IGZ1bmN0aW9uKCBlbGVtLCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApIHsKCQl2YXIgY2xvbmUgPSBlbGVtLmNsb25lTm9kZSh0cnVlKSwKCQkJCXNyY0VsZW1lbnRzLAoJCQkJZGVzdEVsZW1lbnRzLAoJCQkJaTsKCgkJaWYgKCAoIWpRdWVyeS5zdXBwb3J0Lm5vQ2xvbmVFdmVudCB8fCAhalF1ZXJ5LnN1cHBvcnQubm9DbG9uZUNoZWNrZWQpICYmCgkJCQkoZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBlbGVtLm5vZGVUeXBlID09PSAxMSkgJiYgIWpRdWVyeS5pc1hNTERvYyhlbGVtKSApIHsKCQkJLy8gSUUgY29waWVzIGV2ZW50cyBib3VuZCB2aWEgYXR0YWNoRXZlbnQgd2hlbiB1c2luZyBjbG9uZU5vZGUuCgkJCS8vIENhbGxpbmcgZGV0YWNoRXZlbnQgb24gdGhlIGNsb25lIHdpbGwgYWxzbyByZW1vdmUgdGhlIGV2ZW50cwoJCQkvLyBmcm9tIHRoZSBvcmlnaW5hbC4gSW4gb3JkZXIgdG8gZ2V0IGFyb3VuZCB0aGlzLCB3ZSB1c2Ugc29tZQoJCQkvLyBwcm9wcmlldGFyeSBtZXRob2RzIHRvIGNsZWFyIHRoZSBldmVudHMuIFRoYW5rcyB0byBNb29Ub29scwoJCQkvLyBndXlzIGZvciB0aGlzIGhvdG5lc3MuCgoJCQljbG9uZUZpeEF0dHJpYnV0ZXMoIGVsZW0sIGNsb25lICk7CgoJCQkvLyBVc2luZyBTaXp6bGUgaGVyZSBpcyBjcmF6eSBzbG93LCBzbyB3ZSB1c2UgZ2V0RWxlbWVudHNCeVRhZ05hbWUKCQkJLy8gaW5zdGVhZAoJCQlzcmNFbGVtZW50cyA9IGdldEFsbCggZWxlbSApOwoJCQlkZXN0RWxlbWVudHMgPSBnZXRBbGwoIGNsb25lICk7CgoJCQkvLyBXZWlyZCBpdGVyYXRpb24gYmVjYXVzZSBJRSB3aWxsIHJlcGxhY2UgdGhlIGxlbmd0aCBwcm9wZXJ0eQoJCQkvLyB3aXRoIGFuIGVsZW1lbnQgaWYgeW91IGFyZSBjbG9uaW5nIHRoZSBib2R5IGFuZCBvbmUgb2YgdGhlCgkJCS8vIGVsZW1lbnRzIG9uIHRoZSBwYWdlIGhhcyBhIG5hbWUgb3IgaWQgb2YgImxlbmd0aCIKCQkJZm9yICggaSA9IDA7IHNyY0VsZW1lbnRzW2ldOyArK2kgKSB7CgkJCQkvLyBFbnN1cmUgdGhhdCB0aGUgZGVzdGluYXRpb24gbm9kZSBpcyBub3QgbnVsbDsgRml4ZXMgIzk1ODcKCQkJCWlmICggZGVzdEVsZW1lbnRzW2ldICkgewoJCQkJCWNsb25lRml4QXR0cmlidXRlcyggc3JjRWxlbWVudHNbaV0sIGRlc3RFbGVtZW50c1tpXSApOwoJCQkJfQoJCQl9CgkJfQoKCQkvLyBDb3B5IHRoZSBldmVudHMgZnJvbSB0aGUgb3JpZ2luYWwgdG8gdGhlIGNsb25lCgkJaWYgKCBkYXRhQW5kRXZlbnRzICkgewoJCQljbG9uZUNvcHlFdmVudCggZWxlbSwgY2xvbmUgKTsKCgkJCWlmICggZGVlcERhdGFBbmRFdmVudHMgKSB7CgkJCQlzcmNFbGVtZW50cyA9IGdldEFsbCggZWxlbSApOwoJCQkJZGVzdEVsZW1lbnRzID0gZ2V0QWxsKCBjbG9uZSApOwoKCQkJCWZvciAoIGkgPSAwOyBzcmNFbGVtZW50c1tpXTsgKytpICkgewoJCQkJCWNsb25lQ29weUV2ZW50KCBzcmNFbGVtZW50c1tpXSwgZGVzdEVsZW1lbnRzW2ldICk7CgkJCQl9CgkJCX0KCQl9CgoJCXNyY0VsZW1lbnRzID0gZGVzdEVsZW1lbnRzID0gbnVsbDsKCgkJLy8gUmV0dXJuIHRoZSBjbG9uZWQgc2V0CgkJcmV0dXJuIGNsb25lOwoJfSwKCgljbGVhbjogZnVuY3Rpb24oIGVsZW1zLCBjb250ZXh0LCBmcmFnbWVudCwgc2NyaXB0cyApIHsKCQl2YXIgY2hlY2tTY3JpcHRUeXBlOwoKCQljb250ZXh0ID0gY29udGV4dCB8fCBkb2N1bWVudDsKCgkJLy8gIWNvbnRleHQuY3JlYXRlRWxlbWVudCBmYWlscyBpbiBJRSB3aXRoIGFuIGVycm9yIGJ1dCByZXR1cm5zIHR5cGVvZiAnb2JqZWN0JwoJCWlmICggdHlwZW9mIGNvbnRleHQuY3JlYXRlRWxlbWVudCA9PT0gInVuZGVmaW5lZCIgKSB7CgkJCWNvbnRleHQgPSBjb250ZXh0Lm93bmVyRG9jdW1lbnQgfHwgY29udGV4dFswXSAmJiBjb250ZXh0WzBdLm93bmVyRG9jdW1lbnQgfHwgZG9jdW1lbnQ7CgkJfQoKCQl2YXIgcmV0ID0gW10sIGo7CgoJCWZvciAoIHZhciBpID0gMCwgZWxlbTsgKGVsZW0gPSBlbGVtc1tpXSkgIT0gbnVsbDsgaSsrICkgewoJCQlpZiAoIHR5cGVvZiBlbGVtID09PSAibnVtYmVyIiApIHsKCQkJCWVsZW0gKz0gIiI7CgkJCX0KCgkJCWlmICggIWVsZW0gKSB7CgkJCQljb250aW51ZTsKCQkJfQoKCQkJLy8gQ29udmVydCBodG1sIHN0cmluZyBpbnRvIERPTSBub2RlcwoJCQlpZiAoIHR5cGVvZiBlbGVtID09PSAic3RyaW5nIiApIHsKCQkJCWlmICggIXJodG1sLnRlc3QoIGVsZW0gKSApIHsKCQkJCQllbGVtID0gY29udGV4dC5jcmVhdGVUZXh0Tm9kZSggZWxlbSApOwoJCQkJfSBlbHNlIHsKCQkJCQkvLyBGaXggIlhIVE1MIi1zdHlsZSB0YWdzIGluIGFsbCBicm93c2VycwoJCQkJCWVsZW0gPSBlbGVtLnJlcGxhY2UocnhodG1sVGFnLCAiPCQxPjwvJDI+Iik7CgoJCQkJCS8vIFRyaW0gd2hpdGVzcGFjZSwgb3RoZXJ3aXNlIGluZGV4T2Ygd29uJ3Qgd29yayBhcyBleHBlY3RlZAoJCQkJCXZhciB0YWcgPSAocnRhZ05hbWUuZXhlYyggZWxlbSApIHx8IFsiIiwgIiJdKVsxXS50b0xvd2VyQ2FzZSgpLAoJCQkJCQl3cmFwID0gd3JhcE1hcFsgdGFnIF0gfHwgd3JhcE1hcC5fZGVmYXVsdCwKCQkJCQkJZGVwdGggPSB3cmFwWzBdLAoJCQkJCQlkaXYgPSBjb250ZXh0LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwoKCQkJCQkvLyBHbyB0byBodG1sIGFuZCBiYWNrLCB0aGVuIHBlZWwgb2ZmIGV4dHJhIHdyYXBwZXJzCgkJCQkJZGl2LmlubmVySFRNTCA9IHdyYXBbMV0gKyBlbGVtICsgd3JhcFsyXTsKCgkJCQkJLy8gTW92ZSB0byB0aGUgcmlnaHQgZGVwdGgKCQkJCQl3aGlsZSAoIGRlcHRoLS0gKSB7CgkJCQkJCWRpdiA9IGRpdi5sYXN0Q2hpbGQ7CgkJCQkJfQoKCQkJCQkvLyBSZW1vdmUgSUUncyBhdXRvaW5zZXJ0ZWQgPHRib2R5PiBmcm9tIHRhYmxlIGZyYWdtZW50cwoJCQkJCWlmICggIWpRdWVyeS5zdXBwb3J0LnRib2R5ICkgewoKCQkJCQkJLy8gU3RyaW5nIHdhcyBhIDx0YWJsZT4sICptYXkqIGhhdmUgc3B1cmlvdXMgPHRib2R5PgoJCQkJCQl2YXIgaGFzQm9keSA9IHJ0Ym9keS50ZXN0KGVsZW0pLAoJCQkJCQkJdGJvZHkgPSB0YWcgPT09ICJ0YWJsZSIgJiYgIWhhc0JvZHkgPwoJCQkJCQkJCWRpdi5maXJzdENoaWxkICYmIGRpdi5maXJzdENoaWxkLmNoaWxkTm9kZXMgOgoKCQkJCQkJCQkvLyBTdHJpbmcgd2FzIGEgYmFyZSA8dGhlYWQ+IG9yIDx0Zm9vdD4KCQkJCQkJCQl3cmFwWzFdID09PSAiPHRhYmxlPiIgJiYgIWhhc0JvZHkgPwoJCQkJCQkJCQlkaXYuY2hpbGROb2RlcyA6CgkJCQkJCQkJCVtdOwoKCQkJCQkJZm9yICggaiA9IHRib2R5Lmxlbmd0aCAtIDE7IGogPj0gMCA7IC0taiApIHsKCQkJCQkJCWlmICggalF1ZXJ5Lm5vZGVOYW1lKCB0Ym9keVsgaiBdLCAidGJvZHkiICkgJiYgIXRib2R5WyBqIF0uY2hpbGROb2Rlcy5sZW5ndGggKSB7CgkJCQkJCQkJdGJvZHlbIGogXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCB0Ym9keVsgaiBdICk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9CgoJCQkJCS8vIElFIGNvbXBsZXRlbHkga2lsbHMgbGVhZGluZyB3aGl0ZXNwYWNlIHdoZW4gaW5uZXJIVE1MIGlzIHVzZWQKCQkJCQlpZiAoICFqUXVlcnkuc3VwcG9ydC5sZWFkaW5nV2hpdGVzcGFjZSAmJiBybGVhZGluZ1doaXRlc3BhY2UudGVzdCggZWxlbSApICkgewoJCQkJCQlkaXYuaW5zZXJ0QmVmb3JlKCBjb250ZXh0LmNyZWF0ZVRleHROb2RlKCBybGVhZGluZ1doaXRlc3BhY2UuZXhlYyhlbGVtKVswXSApLCBkaXYuZmlyc3RDaGlsZCApOwoJCQkJCX0KCgkJCQkJZWxlbSA9IGRpdi5jaGlsZE5vZGVzOwoJCQkJfQoJCQl9CgoJCQkvLyBSZXNldHMgZGVmYXVsdENoZWNrZWQgZm9yIGFueSByYWRpb3MgYW5kIGNoZWNrYm94ZXMKCQkJLy8gYWJvdXQgdG8gYmUgYXBwZW5kZWQgdG8gdGhlIERPTSBpbiBJRSA2LzcgKCM4MDYwKQoJCQl2YXIgbGVuOwoJCQlpZiAoICFqUXVlcnkuc3VwcG9ydC5hcHBlbmRDaGVja2VkICkgewoJCQkJaWYgKCBlbGVtWzBdICYmIHR5cGVvZiAobGVuID0gZWxlbS5sZW5ndGgpID09PSAibnVtYmVyIiApIHsKCQkJCQlmb3IgKCBqID0gMDsgaiA8IGxlbjsgaisrICkgewoJCQkJCQlmaW5kSW5wdXRzKCBlbGVtW2pdICk7CgkJCQkJfQoJCQkJfSBlbHNlIHsKCQkJCQlmaW5kSW5wdXRzKCBlbGVtICk7CgkJCQl9CgkJCX0KCgkJCWlmICggZWxlbS5ub2RlVHlwZSApIHsKCQkJCXJldC5wdXNoKCBlbGVtICk7CgkJCX0gZWxzZSB7CgkJCQlyZXQgPSBqUXVlcnkubWVyZ2UoIHJldCwgZWxlbSApOwoJCQl9CgkJfQoKCQlpZiAoIGZyYWdtZW50ICkgewoJCQljaGVja1NjcmlwdFR5cGUgPSBmdW5jdGlvbiggZWxlbSApIHsKCQkJCXJldHVybiAhZWxlbS50eXBlIHx8IHJzY3JpcHRUeXBlLnRlc3QoIGVsZW0udHlwZSApOwoJCQl9OwoJCQlmb3IgKCBpID0gMDsgcmV0W2ldOyBpKysgKSB7CgkJCQlpZiAoIHNjcmlwdHMgJiYgalF1ZXJ5Lm5vZGVOYW1lKCByZXRbaV0sICJzY3JpcHQiICkgJiYgKCFyZXRbaV0udHlwZSB8fCByZXRbaV0udHlwZS50b0xvd2VyQ2FzZSgpID09PSAidGV4dC9qYXZhc2NyaXB0IikgKSB7CgkJCQkJc2NyaXB0cy5wdXNoKCByZXRbaV0ucGFyZW50Tm9kZSA/IHJldFtpXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCByZXRbaV0gKSA6IHJldFtpXSApOwoKCQkJCX0gZWxzZSB7CgkJCQkJaWYgKCByZXRbaV0ubm9kZVR5cGUgPT09IDEgKSB7CgkJCQkJCXZhciBqc1RhZ3MgPSBqUXVlcnkuZ3JlcCggcmV0W2ldLmdldEVsZW1lbnRzQnlUYWdOYW1lKCAic2NyaXB0IiApLCBjaGVja1NjcmlwdFR5cGUgKTsKCgkJCQkJCXJldC5zcGxpY2UuYXBwbHkoIHJldCwgW2kgKyAxLCAwXS5jb25jYXQoIGpzVGFncyApICk7CgkJCQkJfQoJCQkJCWZyYWdtZW50LmFwcGVuZENoaWxkKCByZXRbaV0gKTsKCQkJCX0KCQkJfQoJCX0KCgkJcmV0dXJuIHJldDsKCX0sCgoJY2xlYW5EYXRhOiBmdW5jdGlvbiggZWxlbXMgKSB7CgkJdmFyIGRhdGEsIGlkLCBjYWNoZSA9IGpRdWVyeS5jYWNoZSwgaW50ZXJuYWxLZXkgPSBqUXVlcnkuZXhwYW5kbywgc3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsLAoJCQlkZWxldGVFeHBhbmRvID0galF1ZXJ5LnN1cHBvcnQuZGVsZXRlRXhwYW5kbzsKCgkJZm9yICggdmFyIGkgPSAwLCBlbGVtOyAoZWxlbSA9IGVsZW1zW2ldKSAhPSBudWxsOyBpKysgKSB7CgkJCWlmICggZWxlbS5ub2RlTmFtZSAmJiBqUXVlcnkubm9EYXRhW2VsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0gKSB7CgkJCQljb250aW51ZTsKCQkJfQoKCQkJaWQgPSBlbGVtWyBqUXVlcnkuZXhwYW5kbyBdOwoKCQkJaWYgKCBpZCApIHsKCQkJCWRhdGEgPSBjYWNoZVsgaWQgXSAmJiBjYWNoZVsgaWQgXVsgaW50ZXJuYWxLZXkgXTsKCgkJCQlpZiAoIGRhdGEgJiYgZGF0YS5ldmVudHMgKSB7CgkJCQkJZm9yICggdmFyIHR5cGUgaW4gZGF0YS5ldmVudHMgKSB7CgkJCQkJCWlmICggc3BlY2lhbFsgdHlwZSBdICkgewoJCQkJCQkJalF1ZXJ5LmV2ZW50LnJlbW92ZSggZWxlbSwgdHlwZSApOwoKCQkJCQkJLy8gVGhpcyBpcyBhIHNob3J0Y3V0IHRvIGF2b2lkIGpRdWVyeS5ldmVudC5yZW1vdmUncyBvdmVyaGVhZAoJCQkJCQl9IGVsc2UgewoJCQkJCQkJalF1ZXJ5LnJlbW92ZUV2ZW50KCBlbGVtLCB0eXBlLCBkYXRhLmhhbmRsZSApOwoJCQkJCQl9CgkJCQkJfQoKCQkJCQkvLyBOdWxsIHRoZSBET00gcmVmZXJlbmNlIHRvIGF2b2lkIElFNi83LzggbGVhayAoIzcwNTQpCgkJCQkJaWYgKCBkYXRhLmhhbmRsZSApIHsKCQkJCQkJZGF0YS5oYW5kbGUuZWxlbSA9IG51bGw7CgkJCQkJfQoJCQkJfQoKCQkJCWlmICggZGVsZXRlRXhwYW5kbyApIHsKCQkJCQlkZWxldGUgZWxlbVsgalF1ZXJ5LmV4cGFuZG8gXTsKCgkJCQl9IGVsc2UgaWYgKCBlbGVtLnJlbW92ZUF0dHJpYnV0ZSApIHsKCQkJCQllbGVtLnJlbW92ZUF0dHJpYnV0ZSggalF1ZXJ5LmV4cGFuZG8gKTsKCQkJCX0KCgkJCQlkZWxldGUgY2FjaGVbIGlkIF07CgkJCX0KCQl9Cgl9Cn0pOwoKZnVuY3Rpb24gZXZhbFNjcmlwdCggaSwgZWxlbSApIHsKCWlmICggZWxlbS5zcmMgKSB7CgkJalF1ZXJ5LmFqYXgoewoJCQl1cmw6IGVsZW0uc3JjLAoJCQlhc3luYzogZmFsc2UsCgkJCWRhdGFUeXBlOiAic2NyaXB0IgoJCX0pOwoJfSBlbHNlIHsKCQlqUXVlcnkuZ2xvYmFsRXZhbCggKCBlbGVtLnRleHQgfHwgZWxlbS50ZXh0Q29udGVudCB8fCBlbGVtLmlubmVySFRNTCB8fCAiIiApLnJlcGxhY2UoIHJjbGVhblNjcmlwdCwgIi8qJDAqLyIgKSApOwoJfQoKCWlmICggZWxlbS5wYXJlbnROb2RlICkgewoJCWVsZW0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggZWxlbSApOwoJfQp9CgoKCgp2YXIgcmFscGhhID0gL2FscGhhXChbXildKlwpL2ksCglyb3BhY2l0eSA9IC9vcGFjaXR5PShbXildKikvLAoJLy8gZml4ZWQgZm9yIElFOSwgc2VlICM4MzQ2CglydXBwZXIgPSAvKFtBLVpdfF5tcykvZywKCXJudW1weCA9IC9eLT9cZCsoPzpweCk/JC9pLAoJcm51bSA9IC9eLT9cZC8sCglycmVsTnVtID0gL14oW1wtK10pPShbXC0rLlxkZV0rKS8sCgoJY3NzU2hvdyA9IHsgcG9zaXRpb246ICJhYnNvbHV0ZSIsIHZpc2liaWxpdHk6ICJoaWRkZW4iLCBkaXNwbGF5OiAiYmxvY2siIH0sCgljc3NXaWR0aCA9IFsgIkxlZnQiLCAiUmlnaHQiIF0sCgljc3NIZWlnaHQgPSBbICJUb3AiLCAiQm90dG9tIiBdLAoJY3VyQ1NTLAoKCWdldENvbXB1dGVkU3R5bGUsCgljdXJyZW50U3R5bGU7CgpqUXVlcnkuZm4uY3NzID0gZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkgewoJLy8gU2V0dGluZyAndW5kZWZpbmVkJyBpcyBhIG5vLW9wCglpZiAoIGFyZ3VtZW50cy5sZW5ndGggPT09IDIgJiYgdmFsdWUgPT09IHVuZGVmaW5lZCApIHsKCQlyZXR1cm4gdGhpczsKCX0KCglyZXR1cm4galF1ZXJ5LmFjY2VzcyggdGhpcywgbmFtZSwgdmFsdWUsIHRydWUsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCB2YWx1ZSApIHsKCQlyZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCA/CgkJCWpRdWVyeS5zdHlsZSggZWxlbSwgbmFtZSwgdmFsdWUgKSA6CgkJCWpRdWVyeS5jc3MoIGVsZW0sIG5hbWUgKTsKCX0pOwp9OwoKalF1ZXJ5LmV4dGVuZCh7CgkvLyBBZGQgaW4gc3R5bGUgcHJvcGVydHkgaG9va3MgZm9yIG92ZXJyaWRpbmcgdGhlIGRlZmF1bHQKCS8vIGJlaGF2aW9yIG9mIGdldHRpbmcgYW5kIHNldHRpbmcgYSBzdHlsZSBwcm9wZXJ0eQoJY3NzSG9va3M6IHsKCQlvcGFjaXR5OiB7CgkJCWdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkgewoJCQkJaWYgKCBjb21wdXRlZCApIHsKCQkJCQkvLyBXZSBzaG91bGQgYWx3YXlzIGdldCBhIG51bWJlciBiYWNrIGZyb20gb3BhY2l0eQoJCQkJCXZhciByZXQgPSBjdXJDU1MoIGVsZW0sICJvcGFjaXR5IiwgIm9wYWNpdHkiICk7CgkJCQkJcmV0dXJuIHJldCA9PT0gIiIgPyAiMSIgOiByZXQ7CgoJCQkJfSBlbHNlIHsKCQkJCQlyZXR1cm4gZWxlbS5zdHlsZS5vcGFjaXR5OwoJCQkJfQoJCQl9CgkJfQoJfSwKCgkvLyBFeGNsdWRlIHRoZSBmb2xsb3dpbmcgY3NzIHByb3BlcnRpZXMgdG8gYWRkIHB4Cgljc3NOdW1iZXI6IHsKCQkiZmlsbE9wYWNpdHkiOiB0cnVlLAoJCSJmb250V2VpZ2h0IjogdHJ1ZSwKCQkibGluZUhlaWdodCI6IHRydWUsCgkJIm9wYWNpdHkiOiB0cnVlLAoJCSJvcnBoYW5zIjogdHJ1ZSwKCQkid2lkb3dzIjogdHJ1ZSwKCQkiekluZGV4IjogdHJ1ZSwKCQkiem9vbSI6IHRydWUKCX0sCgoJLy8gQWRkIGluIHByb3BlcnRpZXMgd2hvc2UgbmFtZXMgeW91IHdpc2ggdG8gZml4IGJlZm9yZQoJLy8gc2V0dGluZyBvciBnZXR0aW5nIHRoZSB2YWx1ZQoJY3NzUHJvcHM6IHsKCQkvLyBub3JtYWxpemUgZmxvYXQgY3NzIHByb3BlcnR5CgkJImZsb2F0IjogalF1ZXJ5LnN1cHBvcnQuY3NzRmxvYXQgPyAiY3NzRmxvYXQiIDogInN0eWxlRmxvYXQiCgl9LAoKCS8vIEdldCBhbmQgc2V0IHRoZSBzdHlsZSBwcm9wZXJ0eSBvbiBhIERPTSBOb2RlCglzdHlsZTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlLCBleHRyYSApIHsKCQkvLyBEb24ndCBzZXQgc3R5bGVzIG9uIHRleHQgYW5kIGNvbW1lbnQgbm9kZXMKCQlpZiAoICFlbGVtIHx8IGVsZW0ubm9kZVR5cGUgPT09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PT0gOCB8fCAhZWxlbS5zdHlsZSApIHsKCQkJcmV0dXJuOwoJCX0KCgkJLy8gTWFrZSBzdXJlIHRoYXQgd2UncmUgd29ya2luZyB3aXRoIHRoZSByaWdodCBuYW1lCgkJdmFyIHJldCwgdHlwZSwgb3JpZ05hbWUgPSBqUXVlcnkuY2FtZWxDYXNlKCBuYW1lICksCgkJCXN0eWxlID0gZWxlbS5zdHlsZSwgaG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG9yaWdOYW1lIF07CgoJCW5hbWUgPSBqUXVlcnkuY3NzUHJvcHNbIG9yaWdOYW1lIF0gfHwgb3JpZ05hbWU7CgoJCS8vIENoZWNrIGlmIHdlJ3JlIHNldHRpbmcgYSB2YWx1ZQoJCWlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHsKCQkJdHlwZSA9IHR5cGVvZiB2YWx1ZTsKCgkJCS8vIGNvbnZlcnQgcmVsYXRpdmUgbnVtYmVyIHN0cmluZ3MgKCs9IG9yIC09KSB0byByZWxhdGl2ZSBudW1iZXJzLiAjNzM0NQoJCQlpZiAoIHR5cGUgPT09ICJzdHJpbmciICYmIChyZXQgPSBycmVsTnVtLmV4ZWMoIHZhbHVlICkpICkgewoJCQkJdmFsdWUgPSAoICsoIHJldFsxXSArIDEpICogK3JldFsyXSApICsgcGFyc2VGbG9hdCggalF1ZXJ5LmNzcyggZWxlbSwgbmFtZSApICk7CgkJCQkvLyBGaXhlcyBidWcgIzkyMzcKCQkJCXR5cGUgPSAibnVtYmVyIjsKCQkJfQoKCQkJLy8gTWFrZSBzdXJlIHRoYXQgTmFOIGFuZCBudWxsIHZhbHVlcyBhcmVuJ3Qgc2V0LiBTZWU6ICM3MTE2CgkJCWlmICggdmFsdWUgPT0gbnVsbCB8fCB0eXBlID09PSAibnVtYmVyIiAmJiBpc05hTiggdmFsdWUgKSApIHsKCQkJCXJldHVybjsKCQkJfQoKCQkJLy8gSWYgYSBudW1iZXIgd2FzIHBhc3NlZCBpbiwgYWRkICdweCcgdG8gdGhlIChleGNlcHQgZm9yIGNlcnRhaW4gQ1NTIHByb3BlcnRpZXMpCgkJCWlmICggdHlwZSA9PT0gIm51bWJlciIgJiYgIWpRdWVyeS5jc3NOdW1iZXJbIG9yaWdOYW1lIF0gKSB7CgkJCQl2YWx1ZSArPSAicHgiOwoJCQl9CgoJCQkvLyBJZiBhIGhvb2sgd2FzIHByb3ZpZGVkLCB1c2UgdGhhdCB2YWx1ZSwgb3RoZXJ3aXNlIGp1c3Qgc2V0IHRoZSBzcGVjaWZpZWQgdmFsdWUKCQkJaWYgKCAhaG9va3MgfHwgISgic2V0IiBpbiBob29rcykgfHwgKHZhbHVlID0gaG9va3Muc2V0KCBlbGVtLCB2YWx1ZSApKSAhPT0gdW5kZWZpbmVkICkgewoJCQkJLy8gV3JhcHBlZCB0byBwcmV2ZW50IElFIGZyb20gdGhyb3dpbmcgZXJyb3JzIHdoZW4gJ2ludmFsaWQnIHZhbHVlcyBhcmUgcHJvdmlkZWQKCQkJCS8vIEZpeGVzIGJ1ZyAjNTUwOQoJCQkJdHJ5IHsKCQkJCQlzdHlsZVsgbmFtZSBdID0gdmFsdWU7CgkJCQl9IGNhdGNoKGUpIHt9CgkJCX0KCgkJfSBlbHNlIHsKCQkJLy8gSWYgYSBob29rIHdhcyBwcm92aWRlZCBnZXQgdGhlIG5vbi1jb21wdXRlZCB2YWx1ZSBmcm9tIHRoZXJlCgkJCWlmICggaG9va3MgJiYgImdldCIgaW4gaG9va3MgJiYgKHJldCA9IGhvb2tzLmdldCggZWxlbSwgZmFsc2UsIGV4dHJhICkpICE9PSB1bmRlZmluZWQgKSB7CgkJCQlyZXR1cm4gcmV0OwoJCQl9CgoJCQkvLyBPdGhlcndpc2UganVzdCBnZXQgdGhlIHZhbHVlIGZyb20gdGhlIHN0eWxlIG9iamVjdAoJCQlyZXR1cm4gc3R5bGVbIG5hbWUgXTsKCQl9Cgl9LAoKCWNzczogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGV4dHJhICkgewoJCXZhciByZXQsIGhvb2tzOwoKCQkvLyBNYWtlIHN1cmUgdGhhdCB3ZSdyZSB3b3JraW5nIHdpdGggdGhlIHJpZ2h0IG5hbWUKCQluYW1lID0galF1ZXJ5LmNhbWVsQ2FzZSggbmFtZSApOwoJCWhvb2tzID0galF1ZXJ5LmNzc0hvb2tzWyBuYW1lIF07CgkJbmFtZSA9IGpRdWVyeS5jc3NQcm9wc1sgbmFtZSBdIHx8IG5hbWU7CgoJCS8vIGNzc0Zsb2F0IG5lZWRzIGEgc3BlY2lhbCB0cmVhdG1lbnQKCQlpZiAoIG5hbWUgPT09ICJjc3NGbG9hdCIgKSB7CgkJCW5hbWUgPSAiZmxvYXQiOwoJCX0KCgkJLy8gSWYgYSBob29rIHdhcyBwcm92aWRlZCBnZXQgdGhlIGNvbXB1dGVkIHZhbHVlIGZyb20gdGhlcmUKCQlpZiAoIGhvb2tzICYmICJnZXQiIGluIGhvb2tzICYmIChyZXQgPSBob29rcy5nZXQoIGVsZW0sIHRydWUsIGV4dHJhICkpICE9PSB1bmRlZmluZWQgKSB7CgkJCXJldHVybiByZXQ7CgoJCS8vIE90aGVyd2lzZSwgaWYgYSB3YXkgdG8gZ2V0IHRoZSBjb21wdXRlZCB2YWx1ZSBleGlzdHMsIHVzZSB0aGF0CgkJfSBlbHNlIGlmICggY3VyQ1NTICkgewoJCQlyZXR1cm4gY3VyQ1NTKCBlbGVtLCBuYW1lICk7CgkJfQoJfSwKCgkvLyBBIG1ldGhvZCBmb3IgcXVpY2tseSBzd2FwcGluZyBpbi9vdXQgQ1NTIHByb3BlcnRpZXMgdG8gZ2V0IGNvcnJlY3QgY2FsY3VsYXRpb25zCglzd2FwOiBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgY2FsbGJhY2sgKSB7CgkJdmFyIG9sZCA9IHt9OwoKCQkvLyBSZW1lbWJlciB0aGUgb2xkIHZhbHVlcywgYW5kIGluc2VydCB0aGUgbmV3IG9uZXMKCQlmb3IgKCB2YXIgbmFtZSBpbiBvcHRpb25zICkgewoJCQlvbGRbIG5hbWUgXSA9IGVsZW0uc3R5bGVbIG5hbWUgXTsKCQkJZWxlbS5zdHlsZVsgbmFtZSBdID0gb3B0aW9uc1sgbmFtZSBdOwoJCX0KCgkJY2FsbGJhY2suY2FsbCggZWxlbSApOwoKCQkvLyBSZXZlcnQgdGhlIG9sZCB2YWx1ZXMKCQlmb3IgKCBuYW1lIGluIG9wdGlvbnMgKSB7CgkJCWVsZW0uc3R5bGVbIG5hbWUgXSA9IG9sZFsgbmFtZSBdOwoJCX0KCX0KfSk7CgovLyBERVBSRUNBVEVELCBVc2UgalF1ZXJ5LmNzcygpIGluc3RlYWQKalF1ZXJ5LmN1ckNTUyA9IGpRdWVyeS5jc3M7CgpqUXVlcnkuZWFjaChbImhlaWdodCIsICJ3aWR0aCJdLCBmdW5jdGlvbiggaSwgbmFtZSApIHsKCWpRdWVyeS5jc3NIb29rc1sgbmFtZSBdID0gewoJCWdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkLCBleHRyYSApIHsKCQkJdmFyIHZhbDsKCgkJCWlmICggY29tcHV0ZWQgKSB7CgkJCQlpZiAoIGVsZW0ub2Zmc2V0V2lkdGggIT09IDAgKSB7CgkJCQkJcmV0dXJuIGdldFdIKCBlbGVtLCBuYW1lLCBleHRyYSApOwoJCQkJfSBlbHNlIHsKCQkJCQlqUXVlcnkuc3dhcCggZWxlbSwgY3NzU2hvdywgZnVuY3Rpb24oKSB7CgkJCQkJCXZhbCA9IGdldFdIKCBlbGVtLCBuYW1lLCBleHRyYSApOwoJCQkJCX0pOwoJCQkJfQoKCQkJCXJldHVybiB2YWw7CgkJCX0KCQl9LAoKCQlzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHsKCQkJaWYgKCBybnVtcHgudGVzdCggdmFsdWUgKSApIHsKCQkJCS8vIGlnbm9yZSBuZWdhdGl2ZSB3aWR0aCBhbmQgaGVpZ2h0IHZhbHVlcyAjMTU5OQoJCQkJdmFsdWUgPSBwYXJzZUZsb2F0KCB2YWx1ZSApOwoKCQkJCWlmICggdmFsdWUgPj0gMCApIHsKCQkJCQlyZXR1cm4gdmFsdWUgKyAicHgiOwoJCQkJfQoKCQkJfSBlbHNlIHsKCQkJCXJldHVybiB2YWx1ZTsKCQkJfQoJCX0KCX07Cn0pOwoKaWYgKCAhalF1ZXJ5LnN1cHBvcnQub3BhY2l0eSApIHsKCWpRdWVyeS5jc3NIb29rcy5vcGFjaXR5ID0gewoJCWdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkgewoJCQkvLyBJRSB1c2VzIGZpbHRlcnMgZm9yIG9wYWNpdHkKCQkJcmV0dXJuIHJvcGFjaXR5LnRlc3QoIChjb21wdXRlZCAmJiBlbGVtLmN1cnJlbnRTdHlsZSA/IGVsZW0uY3VycmVudFN0eWxlLmZpbHRlciA6IGVsZW0uc3R5bGUuZmlsdGVyKSB8fCAiIiApID8KCQkJCSggcGFyc2VGbG9hdCggUmVnRXhwLiQxICkgLyAxMDAgKSArICIiIDoKCQkJCWNvbXB1dGVkID8gIjEiIDogIiI7CgkJfSwKCgkJc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7CgkJCXZhciBzdHlsZSA9IGVsZW0uc3R5bGUsCgkJCQljdXJyZW50U3R5bGUgPSBlbGVtLmN1cnJlbnRTdHlsZSwKCQkJCW9wYWNpdHkgPSBqUXVlcnkuaXNOYU4oIHZhbHVlICkgPyAiIiA6ICJhbHBoYShvcGFjaXR5PSIgKyB2YWx1ZSAqIDEwMCArICIpIiwKCQkJCWZpbHRlciA9IGN1cnJlbnRTdHlsZSAmJiBjdXJyZW50U3R5bGUuZmlsdGVyIHx8IHN0eWxlLmZpbHRlciB8fCAiIjsKCgkJCS8vIElFIGhhcyB0cm91YmxlIHdpdGggb3BhY2l0eSBpZiBpdCBkb2VzIG5vdCBoYXZlIGxheW91dAoJCQkvLyBGb3JjZSBpdCBieSBzZXR0aW5nIHRoZSB6b29tIGxldmVsCgkJCXN0eWxlLnpvb20gPSAxOwoKCQkJLy8gaWYgc2V0dGluZyBvcGFjaXR5IHRvIDEsIGFuZCBubyBvdGhlciBmaWx0ZXJzIGV4aXN0IC0gYXR0ZW1wdCB0byByZW1vdmUgZmlsdGVyIGF0dHJpYnV0ZSAjNjY1MgoJCQlpZiAoIHZhbHVlID49IDEgJiYgalF1ZXJ5LnRyaW0oIGZpbHRlci5yZXBsYWNlKCByYWxwaGEsICIiICkgKSA9PT0gIiIgKSB7CgoJCQkJLy8gU2V0dGluZyBzdHlsZS5maWx0ZXIgdG8gbnVsbCwgIiIgJiAiICIgc3RpbGwgbGVhdmUgImZpbHRlcjoiIGluIHRoZSBjc3NUZXh0CgkJCQkvLyBpZiAiZmlsdGVyOiIgaXMgcHJlc2VudCBhdCBhbGwsIGNsZWFyVHlwZSBpcyBkaXNhYmxlZCwgd2Ugd2FudCB0byBhdm9pZCB0aGlzCgkJCQkvLyBzdHlsZS5yZW1vdmVBdHRyaWJ1dGUgaXMgSUUgT25seSwgYnV0IHNvIGFwcGFyZW50bHkgaXMgdGhpcyBjb2RlIHBhdGguLi4KCQkJCXN0eWxlLnJlbW92ZUF0dHJpYnV0ZSggImZpbHRlciIgKTsKCgkJCQkvLyBpZiB0aGVyZSB0aGVyZSBpcyBubyBmaWx0ZXIgc3R5bGUgYXBwbGllZCBpbiBhIGNzcyBydWxlLCB3ZSBhcmUgZG9uZQoJCQkJaWYgKCBjdXJyZW50U3R5bGUgJiYgIWN1cnJlbnRTdHlsZS5maWx0ZXIgKSB7CgkJCQkJcmV0dXJuOwoJCQkJfQoJCQl9CgoJCQkvLyBvdGhlcndpc2UsIHNldCBuZXcgZmlsdGVyIHZhbHVlcwoJCQlzdHlsZS5maWx0ZXIgPSByYWxwaGEudGVzdCggZmlsdGVyICkgPwoJCQkJZmlsdGVyLnJlcGxhY2UoIHJhbHBoYSwgb3BhY2l0eSApIDoKCQkJCWZpbHRlciArICIgIiArIG9wYWNpdHk7CgkJfQoJfTsKfQoKalF1ZXJ5KGZ1bmN0aW9uKCkgewoJLy8gVGhpcyBob29rIGNhbm5vdCBiZSBhZGRlZCB1bnRpbCBET00gcmVhZHkgYmVjYXVzZSB0aGUgc3VwcG9ydCB0ZXN0CgkvLyBmb3IgaXQgaXMgbm90IHJ1biB1bnRpbCBhZnRlciBET00gcmVhZHkKCWlmICggIWpRdWVyeS5zdXBwb3J0LnJlbGlhYmxlTWFyZ2luUmlnaHQgKSB7CgkJalF1ZXJ5LmNzc0hvb2tzLm1hcmdpblJpZ2h0ID0gewoJCQlnZXQ6IGZ1bmN0aW9uKCBlbGVtLCBjb21wdXRlZCApIHsKCQkJCS8vIFdlYktpdCBCdWcgMTMzNDMgLSBnZXRDb21wdXRlZFN0eWxlIHJldHVybnMgd3JvbmcgdmFsdWUgZm9yIG1hcmdpbi1yaWdodAoJCQkJLy8gV29yayBhcm91bmQgYnkgdGVtcG9yYXJpbHkgc2V0dGluZyBlbGVtZW50IGRpc3BsYXkgdG8gaW5saW5lLWJsb2NrCgkJCQl2YXIgcmV0OwoJCQkJalF1ZXJ5LnN3YXAoIGVsZW0sIHsgImRpc3BsYXkiOiAiaW5saW5lLWJsb2NrIiB9LCBmdW5jdGlvbigpIHsKCQkJCQlpZiAoIGNvbXB1dGVkICkgewoJCQkJCQlyZXQgPSBjdXJDU1MoIGVsZW0sICJtYXJnaW4tcmlnaHQiLCAibWFyZ2luUmlnaHQiICk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJcmV0ID0gZWxlbS5zdHlsZS5tYXJnaW5SaWdodDsKCQkJCQl9CgkJCQl9KTsKCQkJCXJldHVybiByZXQ7CgkJCX0KCQl9OwoJfQp9KTsKCmlmICggZG9jdW1lbnQuZGVmYXVsdFZpZXcgJiYgZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSApIHsKCWdldENvbXB1dGVkU3R5bGUgPSBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHsKCQl2YXIgcmV0LCBkZWZhdWx0VmlldywgY29tcHV0ZWRTdHlsZTsKCgkJbmFtZSA9IG5hbWUucmVwbGFjZSggcnVwcGVyLCAiLSQxIiApLnRvTG93ZXJDYXNlKCk7CgoJCWlmICggIShkZWZhdWx0VmlldyA9IGVsZW0ub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldykgKSB7CgkJCXJldHVybiB1bmRlZmluZWQ7CgkJfQoKCQlpZiAoIChjb21wdXRlZFN0eWxlID0gZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSggZWxlbSwgbnVsbCApKSApIHsKCQkJcmV0ID0gY29tcHV0ZWRTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCBuYW1lICk7CgkJCWlmICggcmV0ID09PSAiIiAmJiAhalF1ZXJ5LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCBlbGVtICkgKSB7CgkJCQlyZXQgPSBqUXVlcnkuc3R5bGUoIGVsZW0sIG5hbWUgKTsKCQkJfQoJCX0KCgkJcmV0dXJuIHJldDsKCX07Cn0KCmlmICggZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmN1cnJlbnRTdHlsZSApIHsKCWN1cnJlbnRTdHlsZSA9IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkgewoJCXZhciBsZWZ0LAoJCQlyZXQgPSBlbGVtLmN1cnJlbnRTdHlsZSAmJiBlbGVtLmN1cnJlbnRTdHlsZVsgbmFtZSBdLAoJCQlyc0xlZnQgPSBlbGVtLnJ1bnRpbWVTdHlsZSAmJiBlbGVtLnJ1bnRpbWVTdHlsZVsgbmFtZSBdLAoJCQlzdHlsZSA9IGVsZW0uc3R5bGU7CgoJCS8vIEZyb20gdGhlIGF3ZXNvbWUgaGFjayBieSBEZWFuIEVkd2FyZHMKCQkvLyBodHRwOi8vZXJpay5lYWUubmV0L2FyY2hpdmVzLzIwMDcvMDcvMjcvMTguNTQuMTUvI2NvbW1lbnQtMTAyMjkxCgoJCS8vIElmIHdlJ3JlIG5vdCBkZWFsaW5nIHdpdGggYSByZWd1bGFyIHBpeGVsIG51bWJlcgoJCS8vIGJ1dCBhIG51bWJlciB0aGF0IGhhcyBhIHdlaXJkIGVuZGluZywgd2UgbmVlZCB0byBjb252ZXJ0IGl0IHRvIHBpeGVscwoJCWlmICggIXJudW1weC50ZXN0KCByZXQgKSAmJiBybnVtLnRlc3QoIHJldCApICkgewoJCQkvLyBSZW1lbWJlciB0aGUgb3JpZ2luYWwgdmFsdWVzCgkJCWxlZnQgPSBzdHlsZS5sZWZ0OwoKCQkJLy8gUHV0IGluIHRoZSBuZXcgdmFsdWVzIHRvIGdldCBhIGNvbXB1dGVkIHZhbHVlIG91dAoJCQlpZiAoIHJzTGVmdCApIHsKCQkJCWVsZW0ucnVudGltZVN0eWxlLmxlZnQgPSBlbGVtLmN1cnJlbnRTdHlsZS5sZWZ0OwoJCQl9CgkJCXN0eWxlLmxlZnQgPSBuYW1lID09PSAiZm9udFNpemUiID8gIjFlbSIgOiAocmV0IHx8IDApOwoJCQlyZXQgPSBzdHlsZS5waXhlbExlZnQgKyAicHgiOwoKCQkJLy8gUmV2ZXJ0IHRoZSBjaGFuZ2VkIHZhbHVlcwoJCQlzdHlsZS5sZWZ0ID0gbGVmdDsKCQkJaWYgKCByc0xlZnQgKSB7CgkJCQllbGVtLnJ1bnRpbWVTdHlsZS5sZWZ0ID0gcnNMZWZ0OwoJCQl9CgkJfQoKCQlyZXR1cm4gcmV0ID09PSAiIiA/ICJhdXRvIiA6IHJldDsKCX07Cn0KCmN1ckNTUyA9IGdldENvbXB1dGVkU3R5bGUgfHwgY3VycmVudFN0eWxlOwoKZnVuY3Rpb24gZ2V0V0goIGVsZW0sIG5hbWUsIGV4dHJhICkgewoKCS8vIFN0YXJ0IHdpdGggb2Zmc2V0IHByb3BlcnR5Cgl2YXIgdmFsID0gbmFtZSA9PT0gIndpZHRoIiA/IGVsZW0ub2Zmc2V0V2lkdGggOiBlbGVtLm9mZnNldEhlaWdodCwKCQl3aGljaCA9IG5hbWUgPT09ICJ3aWR0aCIgPyBjc3NXaWR0aCA6IGNzc0hlaWdodDsKCglpZiAoIHZhbCA+IDAgKSB7CgkJaWYgKCBleHRyYSAhPT0gImJvcmRlciIgKSB7CgkJCWpRdWVyeS5lYWNoKCB3aGljaCwgZnVuY3Rpb24oKSB7CgkJCQlpZiAoICFleHRyYSApIHsKCQkJCQl2YWwgLT0gcGFyc2VGbG9hdCggalF1ZXJ5LmNzcyggZWxlbSwgInBhZGRpbmciICsgdGhpcyApICkgfHwgMDsKCQkJCX0KCQkJCWlmICggZXh0cmEgPT09ICJtYXJnaW4iICkgewoJCQkJCXZhbCArPSBwYXJzZUZsb2F0KCBqUXVlcnkuY3NzKCBlbGVtLCBleHRyYSArIHRoaXMgKSApIHx8IDA7CgkJCQl9IGVsc2UgewoJCQkJCXZhbCAtPSBwYXJzZUZsb2F0KCBqUXVlcnkuY3NzKCBlbGVtLCAiYm9yZGVyIiArIHRoaXMgKyAiV2lkdGgiICkgKSB8fCAwOwoJCQkJfQoJCQl9KTsKCQl9CgoJCXJldHVybiB2YWwgKyAicHgiOwoJfQoKCS8vIEZhbGwgYmFjayB0byBjb21wdXRlZCB0aGVuIHVuY29tcHV0ZWQgY3NzIGlmIG5lY2Vzc2FyeQoJdmFsID0gY3VyQ1NTKCBlbGVtLCBuYW1lLCBuYW1lICk7CglpZiAoIHZhbCA8IDAgfHwgdmFsID09IG51bGwgKSB7CgkJdmFsID0gZWxlbS5zdHlsZVsgbmFtZSBdIHx8IDA7Cgl9CgkvLyBOb3JtYWxpemUgIiIsIGF1dG8sIGFuZCBwcmVwYXJlIGZvciBleHRyYQoJdmFsID0gcGFyc2VGbG9hdCggdmFsICkgfHwgMDsKCgkvLyBBZGQgcGFkZGluZywgYm9yZGVyLCBtYXJnaW4KCWlmICggZXh0cmEgKSB7CgkJalF1ZXJ5LmVhY2goIHdoaWNoLCBmdW5jdGlvbigpIHsKCQkJdmFsICs9IHBhcnNlRmxvYXQoIGpRdWVyeS5jc3MoIGVsZW0sICJwYWRkaW5nIiArIHRoaXMgKSApIHx8IDA7CgkJCWlmICggZXh0cmEgIT09ICJwYWRkaW5nIiApIHsKCQkJCXZhbCArPSBwYXJzZUZsb2F0KCBqUXVlcnkuY3NzKCBlbGVtLCAiYm9yZGVyIiArIHRoaXMgKyAiV2lkdGgiICkgKSB8fCAwOwoJCQl9CgkJCWlmICggZXh0cmEgPT09ICJtYXJnaW4iICkgewoJCQkJdmFsICs9IHBhcnNlRmxvYXQoIGpRdWVyeS5jc3MoIGVsZW0sIGV4dHJhICsgdGhpcyApICkgfHwgMDsKCQkJfQoJCX0pOwoJfQoKCXJldHVybiB2YWwgKyAicHgiOwp9CgppZiAoIGpRdWVyeS5leHByICYmIGpRdWVyeS5leHByLmZpbHRlcnMgKSB7CglqUXVlcnkuZXhwci5maWx0ZXJzLmhpZGRlbiA9IGZ1bmN0aW9uKCBlbGVtICkgewoJCXZhciB3aWR0aCA9IGVsZW0ub2Zmc2V0V2lkdGgsCgkJCWhlaWdodCA9IGVsZW0ub2Zmc2V0SGVpZ2h0OwoKCQlyZXR1cm4gKHdpZHRoID09PSAwICYmIGhlaWdodCA9PT0gMCkgfHwgKCFqUXVlcnkuc3VwcG9ydC5yZWxpYWJsZUhpZGRlbk9mZnNldHMgJiYgKGVsZW0uc3R5bGUuZGlzcGxheSB8fCBqUXVlcnkuY3NzKCBlbGVtLCAiZGlzcGxheSIgKSkgPT09ICJub25lIik7Cgl9OwoKCWpRdWVyeS5leHByLmZpbHRlcnMudmlzaWJsZSA9IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiAhalF1ZXJ5LmV4cHIuZmlsdGVycy5oaWRkZW4oIGVsZW0gKTsKCX07Cn0KCgoKCnZhciByMjAgPSAvJTIwL2csCglyYnJhY2tldCA9IC9cW1xdJC8sCglyQ1JMRiA9IC9ccj9cbi9nLAoJcmhhc2ggPSAvIy4qJC8sCglyaGVhZGVycyA9IC9eKC4qPyk6WyBcdF0qKFteXHJcbl0qKVxyPyQvbWcsIC8vIElFIGxlYXZlcyBhbiBcciBjaGFyYWN0ZXIgYXQgRU9MCglyaW5wdXQgPSAvXig/OmNvbG9yfGRhdGV8ZGF0ZXRpbWV8ZGF0ZXRpbWUtbG9jYWx8ZW1haWx8aGlkZGVufG1vbnRofG51bWJlcnxwYXNzd29yZHxyYW5nZXxzZWFyY2h8dGVsfHRleHR8dGltZXx1cmx8d2VlaykkL2ksCgkvLyAjNzY1MywgIzgxMjUsICM4MTUyOiBsb2NhbCBwcm90b2NvbCBkZXRlY3Rpb24KCXJsb2NhbFByb3RvY29sID0gL14oPzphYm91dHxhcHB8YXBwXC1zdG9yYWdlfC4rXC1leHRlbnNpb258ZmlsZXxyZXN8d2lkZ2V0KTokLywKCXJub0NvbnRlbnQgPSAvXig/OkdFVHxIRUFEKSQvLAoJcnByb3RvY29sID0gL15cL1wvLywKCXJxdWVyeSA9IC9cPy8sCglyc2NyaXB0ID0gLzxzY3JpcHRcYltePF0qKD86KD8hPFwvc2NyaXB0Pik8W148XSopKjxcL3NjcmlwdD4vZ2ksCglyc2VsZWN0VGV4dGFyZWEgPSAvXig/OnNlbGVjdHx0ZXh0YXJlYSkvaSwKCXJzcGFjZXNBamF4ID0gL1xzKy8sCglydHMgPSAvKFs/Jl0pXz1bXiZdKi8sCglydXJsID0gL14oW1x3XCtcLlwtXSs6KSg/OlwvXC8oW15cLz8jOl0qKSg/OjooXGQrKSk/KT8vLAoKCS8vIEtlZXAgYSBjb3B5IG9mIHRoZSBvbGQgbG9hZCBtZXRob2QKCV9sb2FkID0galF1ZXJ5LmZuLmxvYWQsCgoJLyogUHJlZmlsdGVycwoJICogMSkgVGhleSBhcmUgdXNlZnVsIHRvIGludHJvZHVjZSBjdXN0b20gZGF0YVR5cGVzIChzZWUgYWpheC9qc29ucC5qcyBmb3IgYW4gZXhhbXBsZSkKCSAqIDIpIFRoZXNlIGFyZSBjYWxsZWQ6CgkgKiAgICAtIEJFRk9SRSBhc2tpbmcgZm9yIGEgdHJhbnNwb3J0CgkgKiAgICAtIEFGVEVSIHBhcmFtIHNlcmlhbGl6YXRpb24gKHMuZGF0YSBpcyBhIHN0cmluZyBpZiBzLnByb2Nlc3NEYXRhIGlzIHRydWUpCgkgKiAzKSBrZXkgaXMgdGhlIGRhdGFUeXBlCgkgKiA0KSB0aGUgY2F0Y2hhbGwgc3ltYm9sICIqIiBjYW4gYmUgdXNlZAoJICogNSkgZXhlY3V0aW9uIHdpbGwgc3RhcnQgd2l0aCB0cmFuc3BvcnQgZGF0YVR5cGUgYW5kIFRIRU4gY29udGludWUgZG93biB0byAiKiIgaWYgbmVlZGVkCgkgKi8KCXByZWZpbHRlcnMgPSB7fSwKCgkvKiBUcmFuc3BvcnRzIGJpbmRpbmdzCgkgKiAxKSBrZXkgaXMgdGhlIGRhdGFUeXBlCgkgKiAyKSB0aGUgY2F0Y2hhbGwgc3ltYm9sICIqIiBjYW4gYmUgdXNlZAoJICogMykgc2VsZWN0aW9uIHdpbGwgc3RhcnQgd2l0aCB0cmFuc3BvcnQgZGF0YVR5cGUgYW5kIFRIRU4gZ28gdG8gIioiIGlmIG5lZWRlZAoJICovCgl0cmFuc3BvcnRzID0ge30sCgoJLy8gRG9jdW1lbnQgbG9jYXRpb24KCWFqYXhMb2NhdGlvbiwKCgkvLyBEb2N1bWVudCBsb2NhdGlvbiBzZWdtZW50cwoJYWpheExvY1BhcnRzLAoJCgkvLyBBdm9pZCBjb21tZW50LXByb2xvZyBjaGFyIHNlcXVlbmNlICgjMTAwOTgpOyBtdXN0IGFwcGVhc2UgbGludCBhbmQgZXZhZGUgY29tcHJlc3Npb24KCWFsbFR5cGVzID0gWyIqLyJdICsgWyIqIl07CgovLyAjODEzOCwgSUUgbWF5IHRocm93IGFuIGV4Y2VwdGlvbiB3aGVuIGFjY2Vzc2luZwovLyBhIGZpZWxkIGZyb20gd2luZG93LmxvY2F0aW9uIGlmIGRvY3VtZW50LmRvbWFpbiBoYXMgYmVlbiBzZXQKdHJ5IHsKCWFqYXhMb2NhdGlvbiA9IGxvY2F0aW9uLmhyZWY7Cn0gY2F0Y2goIGUgKSB7CgkvLyBVc2UgdGhlIGhyZWYgYXR0cmlidXRlIG9mIGFuIEEgZWxlbWVudAoJLy8gc2luY2UgSUUgd2lsbCBtb2RpZnkgaXQgZ2l2ZW4gZG9jdW1lbnQubG9jYXRpb24KCWFqYXhMb2NhdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJhIiApOwoJYWpheExvY2F0aW9uLmhyZWYgPSAiIjsKCWFqYXhMb2NhdGlvbiA9IGFqYXhMb2NhdGlvbi5ocmVmOwp9CgovLyBTZWdtZW50IGxvY2F0aW9uIGludG8gcGFydHMKYWpheExvY1BhcnRzID0gcnVybC5leGVjKCBhamF4TG9jYXRpb24udG9Mb3dlckNhc2UoKSApIHx8IFtdOwoKLy8gQmFzZSAiY29uc3RydWN0b3IiIGZvciBqUXVlcnkuYWpheFByZWZpbHRlciBhbmQgalF1ZXJ5LmFqYXhUcmFuc3BvcnQKZnVuY3Rpb24gYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBzdHJ1Y3R1cmUgKSB7CgoJLy8gZGF0YVR5cGVFeHByZXNzaW9uIGlzIG9wdGlvbmFsIGFuZCBkZWZhdWx0cyB0byAiKiIKCXJldHVybiBmdW5jdGlvbiggZGF0YVR5cGVFeHByZXNzaW9uLCBmdW5jICkgewoKCQlpZiAoIHR5cGVvZiBkYXRhVHlwZUV4cHJlc3Npb24gIT09ICJzdHJpbmciICkgewoJCQlmdW5jID0gZGF0YVR5cGVFeHByZXNzaW9uOwoJCQlkYXRhVHlwZUV4cHJlc3Npb24gPSAiKiI7CgkJfQoKCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBmdW5jICkgKSB7CgkJCXZhciBkYXRhVHlwZXMgPSBkYXRhVHlwZUV4cHJlc3Npb24udG9Mb3dlckNhc2UoKS5zcGxpdCggcnNwYWNlc0FqYXggKSwKCQkJCWkgPSAwLAoJCQkJbGVuZ3RoID0gZGF0YVR5cGVzLmxlbmd0aCwKCQkJCWRhdGFUeXBlLAoJCQkJbGlzdCwKCQkJCXBsYWNlQmVmb3JlOwoKCQkJLy8gRm9yIGVhY2ggZGF0YVR5cGUgaW4gdGhlIGRhdGFUeXBlRXhwcmVzc2lvbgoJCQlmb3IoOyBpIDwgbGVuZ3RoOyBpKysgKSB7CgkJCQlkYXRhVHlwZSA9IGRhdGFUeXBlc1sgaSBdOwoJCQkJLy8gV2UgY29udHJvbCBpZiB3ZSdyZSBhc2tlZCB0byBhZGQgYmVmb3JlCgkJCQkvLyBhbnkgZXhpc3RpbmcgZWxlbWVudAoJCQkJcGxhY2VCZWZvcmUgPSAvXlwrLy50ZXN0KCBkYXRhVHlwZSApOwoJCQkJaWYgKCBwbGFjZUJlZm9yZSApIHsKCQkJCQlkYXRhVHlwZSA9IGRhdGFUeXBlLnN1YnN0ciggMSApIHx8ICIqIjsKCQkJCX0KCQkJCWxpc3QgPSBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gPSBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gfHwgW107CgkJCQkvLyB0aGVuIHdlIGFkZCB0byB0aGUgc3RydWN0dXJlIGFjY29yZGluZ2x5CgkJCQlsaXN0WyBwbGFjZUJlZm9yZSA/ICJ1bnNoaWZ0IiA6ICJwdXNoIiBdKCBmdW5jICk7CgkJCX0KCQl9Cgl9Owp9CgovLyBCYXNlIGluc3BlY3Rpb24gZnVuY3Rpb24gZm9yIHByZWZpbHRlcnMgYW5kIHRyYW5zcG9ydHMKZnVuY3Rpb24gaW5zcGVjdFByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHN0cnVjdHVyZSwgb3B0aW9ucywgb3JpZ2luYWxPcHRpb25zLCBqcVhIUiwKCQlkYXRhVHlwZSAvKiBpbnRlcm5hbCAqLywgaW5zcGVjdGVkIC8qIGludGVybmFsICovICkgewoKCWRhdGFUeXBlID0gZGF0YVR5cGUgfHwgb3B0aW9ucy5kYXRhVHlwZXNbIDAgXTsKCWluc3BlY3RlZCA9IGluc3BlY3RlZCB8fCB7fTsKCglpbnNwZWN0ZWRbIGRhdGFUeXBlIF0gPSB0cnVlOwoKCXZhciBsaXN0ID0gc3RydWN0dXJlWyBkYXRhVHlwZSBdLAoJCWkgPSAwLAoJCWxlbmd0aCA9IGxpc3QgPyBsaXN0Lmxlbmd0aCA6IDAsCgkJZXhlY3V0ZU9ubHkgPSAoIHN0cnVjdHVyZSA9PT0gcHJlZmlsdGVycyApLAoJCXNlbGVjdGlvbjsKCglmb3IoOyBpIDwgbGVuZ3RoICYmICggZXhlY3V0ZU9ubHkgfHwgIXNlbGVjdGlvbiApOyBpKysgKSB7CgkJc2VsZWN0aW9uID0gbGlzdFsgaSBdKCBvcHRpb25zLCBvcmlnaW5hbE9wdGlvbnMsIGpxWEhSICk7CgkJLy8gSWYgd2UgZ290IHJlZGlyZWN0ZWQgdG8gYW5vdGhlciBkYXRhVHlwZQoJCS8vIHdlIHRyeSB0aGVyZSBpZiBleGVjdXRpbmcgb25seSBhbmQgbm90IGRvbmUgYWxyZWFkeQoJCWlmICggdHlwZW9mIHNlbGVjdGlvbiA9PT0gInN0cmluZyIgKSB7CgkJCWlmICggIWV4ZWN1dGVPbmx5IHx8IGluc3BlY3RlZFsgc2VsZWN0aW9uIF0gKSB7CgkJCQlzZWxlY3Rpb24gPSB1bmRlZmluZWQ7CgkJCX0gZWxzZSB7CgkJCQlvcHRpb25zLmRhdGFUeXBlcy51bnNoaWZ0KCBzZWxlY3Rpb24gKTsKCQkJCXNlbGVjdGlvbiA9IGluc3BlY3RQcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKAoJCQkJCQlzdHJ1Y3R1cmUsIG9wdGlvbnMsIG9yaWdpbmFsT3B0aW9ucywganFYSFIsIHNlbGVjdGlvbiwgaW5zcGVjdGVkICk7CgkJCX0KCQl9Cgl9CgkvLyBJZiB3ZSdyZSBvbmx5IGV4ZWN1dGluZyBvciBub3RoaW5nIHdhcyBzZWxlY3RlZAoJLy8gd2UgdHJ5IHRoZSBjYXRjaGFsbCBkYXRhVHlwZSBpZiBub3QgZG9uZSBhbHJlYWR5CglpZiAoICggZXhlY3V0ZU9ubHkgfHwgIXNlbGVjdGlvbiApICYmICFpbnNwZWN0ZWRbICIqIiBdICkgewoJCXNlbGVjdGlvbiA9IGluc3BlY3RQcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKAoJCQkJc3RydWN0dXJlLCBvcHRpb25zLCBvcmlnaW5hbE9wdGlvbnMsIGpxWEhSLCAiKiIsIGluc3BlY3RlZCApOwoJfQoJLy8gdW5uZWNlc3Nhcnkgd2hlbiBvbmx5IGV4ZWN1dGluZyAocHJlZmlsdGVycykKCS8vIGJ1dCBpdCdsbCBiZSBpZ25vcmVkIGJ5IHRoZSBjYWxsZXIgaW4gdGhhdCBjYXNlCglyZXR1cm4gc2VsZWN0aW9uOwp9CgovLyBBIHNwZWNpYWwgZXh0ZW5kIGZvciBhamF4IG9wdGlvbnMKLy8gdGhhdCB0YWtlcyAiZmxhdCIgb3B0aW9ucyAobm90IHRvIGJlIGRlZXAgZXh0ZW5kZWQpCi8vIEZpeGVzICM5ODg3CmZ1bmN0aW9uIGFqYXhFeHRlbmQoIHRhcmdldCwgc3JjICkgewoJdmFyIGtleSwgZGVlcCwKCQlmbGF0T3B0aW9ucyA9IGpRdWVyeS5hamF4U2V0dGluZ3MuZmxhdE9wdGlvbnMgfHwge307Cglmb3IoIGtleSBpbiBzcmMgKSB7CgkJaWYgKCBzcmNbIGtleSBdICE9PSB1bmRlZmluZWQgKSB7CgkJCSggZmxhdE9wdGlvbnNbIGtleSBdID8gdGFyZ2V0IDogKCBkZWVwIHx8ICggZGVlcCA9IHt9ICkgKSApWyBrZXkgXSA9IHNyY1sga2V5IF07CgkJfQoJfQoJaWYgKCBkZWVwICkgewoJCWpRdWVyeS5leHRlbmQoIHRydWUsIHRhcmdldCwgZGVlcCApOwoJfQp9CgpqUXVlcnkuZm4uZXh0ZW5kKHsKCWxvYWQ6IGZ1bmN0aW9uKCB1cmwsIHBhcmFtcywgY2FsbGJhY2sgKSB7CgkJaWYgKCB0eXBlb2YgdXJsICE9PSAic3RyaW5nIiAmJiBfbG9hZCApIHsKCQkJcmV0dXJuIF9sb2FkLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKCgkJLy8gRG9uJ3QgZG8gYSByZXF1ZXN0IGlmIG5vIGVsZW1lbnRzIGFyZSBiZWluZyByZXF1ZXN0ZWQKCQl9IGVsc2UgaWYgKCAhdGhpcy5sZW5ndGggKSB7CgkJCXJldHVybiB0aGlzOwoJCX0KCgkJdmFyIG9mZiA9IHVybC5pbmRleE9mKCAiICIgKTsKCQlpZiAoIG9mZiA+PSAwICkgewoJCQl2YXIgc2VsZWN0b3IgPSB1cmwuc2xpY2UoIG9mZiwgdXJsLmxlbmd0aCApOwoJCQl1cmwgPSB1cmwuc2xpY2UoIDAsIG9mZiApOwoJCX0KCgkJLy8gRGVmYXVsdCB0byBhIEdFVCByZXF1ZXN0CgkJdmFyIHR5cGUgPSAiR0VUIjsKCgkJLy8gSWYgdGhlIHNlY29uZCBwYXJhbWV0ZXIgd2FzIHByb3ZpZGVkCgkJaWYgKCBwYXJhbXMgKSB7CgkJCS8vIElmIGl0J3MgYSBmdW5jdGlvbgoJCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBwYXJhbXMgKSApIHsKCQkJCS8vIFdlIGFzc3VtZSB0aGF0IGl0J3MgdGhlIGNhbGxiYWNrCgkJCQljYWxsYmFjayA9IHBhcmFtczsKCQkJCXBhcmFtcyA9IHVuZGVmaW5lZDsKCgkJCS8vIE90aGVyd2lzZSwgYnVpbGQgYSBwYXJhbSBzdHJpbmcKCQkJfSBlbHNlIGlmICggdHlwZW9mIHBhcmFtcyA9PT0gIm9iamVjdCIgKSB7CgkJCQlwYXJhbXMgPSBqUXVlcnkucGFyYW0oIHBhcmFtcywgalF1ZXJ5LmFqYXhTZXR0aW5ncy50cmFkaXRpb25hbCApOwoJCQkJdHlwZSA9ICJQT1NUIjsKCQkJfQoJCX0KCgkJdmFyIHNlbGYgPSB0aGlzOwoKCQkvLyBSZXF1ZXN0IHRoZSByZW1vdGUgZG9jdW1lbnQKCQlqUXVlcnkuYWpheCh7CgkJCXVybDogdXJsLAoJCQl0eXBlOiB0eXBlLAoJCQlkYXRhVHlwZTogImh0bWwiLAoJCQlkYXRhOiBwYXJhbXMsCgkJCS8vIENvbXBsZXRlIGNhbGxiYWNrIChyZXNwb25zZVRleHQgaXMgdXNlZCBpbnRlcm5hbGx5KQoJCQljb21wbGV0ZTogZnVuY3Rpb24oIGpxWEhSLCBzdGF0dXMsIHJlc3BvbnNlVGV4dCApIHsKCQkJCS8vIFN0b3JlIHRoZSByZXNwb25zZSBhcyBzcGVjaWZpZWQgYnkgdGhlIGpxWEhSIG9iamVjdAoJCQkJcmVzcG9uc2VUZXh0ID0ganFYSFIucmVzcG9uc2VUZXh0OwoJCQkJLy8gSWYgc3VjY2Vzc2Z1bCwgaW5qZWN0IHRoZSBIVE1MIGludG8gYWxsIHRoZSBtYXRjaGVkIGVsZW1lbnRzCgkJCQlpZiAoIGpxWEhSLmlzUmVzb2x2ZWQoKSApIHsKCQkJCQkvLyAjNDgyNTogR2V0IHRoZSBhY3R1YWwgcmVzcG9uc2UgaW4gY2FzZQoJCQkJCS8vIGEgZGF0YUZpbHRlciBpcyBwcmVzZW50IGluIGFqYXhTZXR0aW5ncwoJCQkJCWpxWEhSLmRvbmUoZnVuY3Rpb24oIHIgKSB7CgkJCQkJCXJlc3BvbnNlVGV4dCA9IHI7CgkJCQkJfSk7CgkJCQkJLy8gU2VlIGlmIGEgc2VsZWN0b3Igd2FzIHNwZWNpZmllZAoJCQkJCXNlbGYuaHRtbCggc2VsZWN0b3IgPwoJCQkJCQkvLyBDcmVhdGUgYSBkdW1teSBkaXYgdG8gaG9sZCB0aGUgcmVzdWx0cwoJCQkJCQlqUXVlcnkoIjxkaXY+IikKCQkJCQkJCS8vIGluamVjdCB0aGUgY29udGVudHMgb2YgdGhlIGRvY3VtZW50IGluLCByZW1vdmluZyB0aGUgc2NyaXB0cwoJCQkJCQkJLy8gdG8gYXZvaWQgYW55ICdQZXJtaXNzaW9uIERlbmllZCcgZXJyb3JzIGluIElFCgkJCQkJCQkuYXBwZW5kKHJlc3BvbnNlVGV4dC5yZXBsYWNlKHJzY3JpcHQsICIiKSkKCgkJCQkJCQkvLyBMb2NhdGUgdGhlIHNwZWNpZmllZCBlbGVtZW50cwoJCQkJCQkJLmZpbmQoc2VsZWN0b3IpIDoKCgkJCQkJCS8vIElmIG5vdCwganVzdCBpbmplY3QgdGhlIGZ1bGwgcmVzdWx0CgkJCQkJCXJlc3BvbnNlVGV4dCApOwoJCQkJfQoKCQkJCWlmICggY2FsbGJhY2sgKSB7CgkJCQkJc2VsZi5lYWNoKCBjYWxsYmFjaywgWyByZXNwb25zZVRleHQsIHN0YXR1cywganFYSFIgXSApOwoJCQkJfQoJCQl9CgkJfSk7CgoJCXJldHVybiB0aGlzOwoJfSwKCglzZXJpYWxpemU6IGZ1bmN0aW9uKCkgewoJCXJldHVybiBqUXVlcnkucGFyYW0oIHRoaXMuc2VyaWFsaXplQXJyYXkoKSApOwoJfSwKCglzZXJpYWxpemVBcnJheTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7CgkJCXJldHVybiB0aGlzLmVsZW1lbnRzID8galF1ZXJ5Lm1ha2VBcnJheSggdGhpcy5lbGVtZW50cyApIDogdGhpczsKCQl9KQoJCS5maWx0ZXIoZnVuY3Rpb24oKXsKCQkJcmV0dXJuIHRoaXMubmFtZSAmJiAhdGhpcy5kaXNhYmxlZCAmJgoJCQkJKCB0aGlzLmNoZWNrZWQgfHwgcnNlbGVjdFRleHRhcmVhLnRlc3QoIHRoaXMubm9kZU5hbWUgKSB8fAoJCQkJCXJpbnB1dC50ZXN0KCB0aGlzLnR5cGUgKSApOwoJCX0pCgkJLm1hcChmdW5jdGlvbiggaSwgZWxlbSApewoJCQl2YXIgdmFsID0galF1ZXJ5KCB0aGlzICkudmFsKCk7CgoJCQlyZXR1cm4gdmFsID09IG51bGwgPwoJCQkJbnVsbCA6CgkJCQlqUXVlcnkuaXNBcnJheSggdmFsICkgPwoJCQkJCWpRdWVyeS5tYXAoIHZhbCwgZnVuY3Rpb24oIHZhbCwgaSApewoJCQkJCQlyZXR1cm4geyBuYW1lOiBlbGVtLm5hbWUsIHZhbHVlOiB2YWwucmVwbGFjZSggckNSTEYsICJcclxuIiApIH07CgkJCQkJfSkgOgoJCQkJCXsgbmFtZTogZWxlbS5uYW1lLCB2YWx1ZTogdmFsLnJlcGxhY2UoIHJDUkxGLCAiXHJcbiIgKSB9OwoJCX0pLmdldCgpOwoJfQp9KTsKCi8vIEF0dGFjaCBhIGJ1bmNoIG9mIGZ1bmN0aW9ucyBmb3IgaGFuZGxpbmcgY29tbW9uIEFKQVggZXZlbnRzCmpRdWVyeS5lYWNoKCAiYWpheFN0YXJ0IGFqYXhTdG9wIGFqYXhDb21wbGV0ZSBhamF4RXJyb3IgYWpheFN1Y2Nlc3MgYWpheFNlbmQiLnNwbGl0KCAiICIgKSwgZnVuY3Rpb24oIGksIG8gKXsKCWpRdWVyeS5mblsgbyBdID0gZnVuY3Rpb24oIGYgKXsKCQlyZXR1cm4gdGhpcy5iaW5kKCBvLCBmICk7Cgl9Owp9KTsKCmpRdWVyeS5lYWNoKCBbICJnZXQiLCAicG9zdCIgXSwgZnVuY3Rpb24oIGksIG1ldGhvZCApIHsKCWpRdWVyeVsgbWV0aG9kIF0gPSBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjaywgdHlwZSApIHsKCQkvLyBzaGlmdCBhcmd1bWVudHMgaWYgZGF0YSBhcmd1bWVudCB3YXMgb21pdHRlZAoJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGRhdGEgKSApIHsKCQkJdHlwZSA9IHR5cGUgfHwgY2FsbGJhY2s7CgkJCWNhbGxiYWNrID0gZGF0YTsKCQkJZGF0YSA9IHVuZGVmaW5lZDsKCQl9CgoJCXJldHVybiBqUXVlcnkuYWpheCh7CgkJCXR5cGU6IG1ldGhvZCwKCQkJdXJsOiB1cmwsCgkJCWRhdGE6IGRhdGEsCgkJCXN1Y2Nlc3M6IGNhbGxiYWNrLAoJCQlkYXRhVHlwZTogdHlwZQoJCX0pOwoJfTsKfSk7CgpqUXVlcnkuZXh0ZW5kKHsKCglnZXRTY3JpcHQ6IGZ1bmN0aW9uKCB1cmwsIGNhbGxiYWNrICkgewoJCXJldHVybiBqUXVlcnkuZ2V0KCB1cmwsIHVuZGVmaW5lZCwgY2FsbGJhY2ssICJzY3JpcHQiICk7Cgl9LAoKCWdldEpTT046IGZ1bmN0aW9uKCB1cmwsIGRhdGEsIGNhbGxiYWNrICkgewoJCXJldHVybiBqUXVlcnkuZ2V0KCB1cmwsIGRhdGEsIGNhbGxiYWNrLCAianNvbiIgKTsKCX0sCgoJLy8gQ3JlYXRlcyBhIGZ1bGwgZmxlZGdlZCBzZXR0aW5ncyBvYmplY3QgaW50byB0YXJnZXQKCS8vIHdpdGggYm90aCBhamF4U2V0dGluZ3MgYW5kIHNldHRpbmdzIGZpZWxkcy4KCS8vIElmIHRhcmdldCBpcyBvbWl0dGVkLCB3cml0ZXMgaW50byBhamF4U2V0dGluZ3MuCglhamF4U2V0dXA6IGZ1bmN0aW9uKCB0YXJnZXQsIHNldHRpbmdzICkgewoJCWlmICggc2V0dGluZ3MgKSB7CgkJCS8vIEJ1aWxkaW5nIGEgc2V0dGluZ3Mgb2JqZWN0CgkJCWFqYXhFeHRlbmQoIHRhcmdldCwgalF1ZXJ5LmFqYXhTZXR0aW5ncyApOwoJCX0gZWxzZSB7CgkJCS8vIEV4dGVuZGluZyBhamF4U2V0dGluZ3MKCQkJc2V0dGluZ3MgPSB0YXJnZXQ7CgkJCXRhcmdldCA9IGpRdWVyeS5hamF4U2V0dGluZ3M7CgkJfQoJCWFqYXhFeHRlbmQoIHRhcmdldCwgc2V0dGluZ3MgKTsKCQlyZXR1cm4gdGFyZ2V0OwoJfSwKCglhamF4U2V0dGluZ3M6IHsKCQl1cmw6IGFqYXhMb2NhdGlvbiwKCQlpc0xvY2FsOiBybG9jYWxQcm90b2NvbC50ZXN0KCBhamF4TG9jUGFydHNbIDEgXSApLAoJCWdsb2JhbDogdHJ1ZSwKCQl0eXBlOiAiR0VUIiwKCQljb250ZW50VHlwZTogImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIsCgkJcHJvY2Vzc0RhdGE6IHRydWUsCgkJYXN5bmM6IHRydWUsCgkJLyoKCQl0aW1lb3V0OiAwLAoJCWRhdGE6IG51bGwsCgkJZGF0YVR5cGU6IG51bGwsCgkJdXNlcm5hbWU6IG51bGwsCgkJcGFzc3dvcmQ6IG51bGwsCgkJY2FjaGU6IG51bGwsCgkJdHJhZGl0aW9uYWw6IGZhbHNlLAoJCWhlYWRlcnM6IHt9LAoJCSovCgoJCWFjY2VwdHM6IHsKCQkJeG1sOiAiYXBwbGljYXRpb24veG1sLCB0ZXh0L3htbCIsCgkJCWh0bWw6ICJ0ZXh0L2h0bWwiLAoJCQl0ZXh0OiAidGV4dC9wbGFpbiIsCgkJCWpzb246ICJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHQiLAoJCQkiKiI6IGFsbFR5cGVzCgkJfSwKCgkJY29udGVudHM6IHsKCQkJeG1sOiAveG1sLywKCQkJaHRtbDogL2h0bWwvLAoJCQlqc29uOiAvanNvbi8KCQl9LAoKCQlyZXNwb25zZUZpZWxkczogewoJCQl4bWw6ICJyZXNwb25zZVhNTCIsCgkJCXRleHQ6ICJyZXNwb25zZVRleHQiCgkJfSwKCgkJLy8gTGlzdCBvZiBkYXRhIGNvbnZlcnRlcnMKCQkvLyAxKSBrZXkgZm9ybWF0IGlzICJzb3VyY2VfdHlwZSBkZXN0aW5hdGlvbl90eXBlIiAoYSBzaW5nbGUgc3BhY2UgaW4tYmV0d2VlbikKCQkvLyAyKSB0aGUgY2F0Y2hhbGwgc3ltYm9sICIqIiBjYW4gYmUgdXNlZCBmb3Igc291cmNlX3R5cGUKCQljb252ZXJ0ZXJzOiB7CgoJCQkvLyBDb252ZXJ0IGFueXRoaW5nIHRvIHRleHQKCQkJIiogdGV4dCI6IHdpbmRvdy5TdHJpbmcsCgoJCQkvLyBUZXh0IHRvIGh0bWwgKHRydWUgPSBubyB0cmFuc2Zvcm1hdGlvbikKCQkJInRleHQgaHRtbCI6IHRydWUsCgoJCQkvLyBFdmFsdWF0ZSB0ZXh0IGFzIGEganNvbiBleHByZXNzaW9uCgkJCSJ0ZXh0IGpzb24iOiBqUXVlcnkucGFyc2VKU09OLAoKCQkJLy8gUGFyc2UgdGV4dCBhcyB4bWwKCQkJInRleHQgeG1sIjogalF1ZXJ5LnBhcnNlWE1MCgkJfSwKCgkJLy8gRm9yIG9wdGlvbnMgdGhhdCBzaG91bGRuJ3QgYmUgZGVlcCBleHRlbmRlZDoKCQkvLyB5b3UgY2FuIGFkZCB5b3VyIG93biBjdXN0b20gb3B0aW9ucyBoZXJlIGlmCgkJLy8gYW5kIHdoZW4geW91IGNyZWF0ZSBvbmUgdGhhdCBzaG91bGRuJ3QgYmUKCQkvLyBkZWVwIGV4dGVuZGVkIChzZWUgYWpheEV4dGVuZCkKCQlmbGF0T3B0aW9uczogewoJCQljb250ZXh0OiB0cnVlLAoJCQl1cmw6IHRydWUKCQl9Cgl9LAoKCWFqYXhQcmVmaWx0ZXI6IGFkZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cyggcHJlZmlsdGVycyApLAoJYWpheFRyYW5zcG9ydDogYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCB0cmFuc3BvcnRzICksCgoJLy8gTWFpbiBtZXRob2QKCWFqYXg6IGZ1bmN0aW9uKCB1cmwsIG9wdGlvbnMgKSB7CgoJCS8vIElmIHVybCBpcyBhbiBvYmplY3QsIHNpbXVsYXRlIHByZS0xLjUgc2lnbmF0dXJlCgkJaWYgKCB0eXBlb2YgdXJsID09PSAib2JqZWN0IiApIHsKCQkJb3B0aW9ucyA9IHVybDsKCQkJdXJsID0gdW5kZWZpbmVkOwoJCX0KCgkJLy8gRm9yY2Ugb3B0aW9ucyB0byBiZSBhbiBvYmplY3QKCQlvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKCgkJdmFyIC8vIENyZWF0ZSB0aGUgZmluYWwgb3B0aW9ucyBvYmplY3QKCQkJcyA9IGpRdWVyeS5hamF4U2V0dXAoIHt9LCBvcHRpb25zICksCgkJCS8vIENhbGxiYWNrcyBjb250ZXh0CgkJCWNhbGxiYWNrQ29udGV4dCA9IHMuY29udGV4dCB8fCBzLAoJCQkvLyBDb250ZXh0IGZvciBnbG9iYWwgZXZlbnRzCgkJCS8vIEl0J3MgdGhlIGNhbGxiYWNrQ29udGV4dCBpZiBvbmUgd2FzIHByb3ZpZGVkIGluIHRoZSBvcHRpb25zCgkJCS8vIGFuZCBpZiBpdCdzIGEgRE9NIG5vZGUgb3IgYSBqUXVlcnkgY29sbGVjdGlvbgoJCQlnbG9iYWxFdmVudENvbnRleHQgPSBjYWxsYmFja0NvbnRleHQgIT09IHMgJiYKCQkJCSggY2FsbGJhY2tDb250ZXh0Lm5vZGVUeXBlIHx8IGNhbGxiYWNrQ29udGV4dCBpbnN0YW5jZW9mIGpRdWVyeSApID8KCQkJCQkJalF1ZXJ5KCBjYWxsYmFja0NvbnRleHQgKSA6IGpRdWVyeS5ldmVudCwKCQkJLy8gRGVmZXJyZWRzCgkJCWRlZmVycmVkID0galF1ZXJ5LkRlZmVycmVkKCksCgkJCWNvbXBsZXRlRGVmZXJyZWQgPSBqUXVlcnkuX0RlZmVycmVkKCksCgkJCS8vIFN0YXR1cy1kZXBlbmRlbnQgY2FsbGJhY2tzCgkJCXN0YXR1c0NvZGUgPSBzLnN0YXR1c0NvZGUgfHwge30sCgkJCS8vIGlmTW9kaWZpZWQga2V5CgkJCWlmTW9kaWZpZWRLZXksCgkJCS8vIEhlYWRlcnMgKHRoZXkgYXJlIHNlbnQgYWxsIGF0IG9uY2UpCgkJCXJlcXVlc3RIZWFkZXJzID0ge30sCgkJCXJlcXVlc3RIZWFkZXJzTmFtZXMgPSB7fSwKCQkJLy8gUmVzcG9uc2UgaGVhZGVycwoJCQlyZXNwb25zZUhlYWRlcnNTdHJpbmcsCgkJCXJlc3BvbnNlSGVhZGVycywKCQkJLy8gdHJhbnNwb3J0CgkJCXRyYW5zcG9ydCwKCQkJLy8gdGltZW91dCBoYW5kbGUKCQkJdGltZW91dFRpbWVyLAoJCQkvLyBDcm9zcy1kb21haW4gZGV0ZWN0aW9uIHZhcnMKCQkJcGFydHMsCgkJCS8vIFRoZSBqcVhIUiBzdGF0ZQoJCQlzdGF0ZSA9IDAsCgkJCS8vIFRvIGtub3cgaWYgZ2xvYmFsIGV2ZW50cyBhcmUgdG8gYmUgZGlzcGF0Y2hlZAoJCQlmaXJlR2xvYmFscywKCQkJLy8gTG9vcCB2YXJpYWJsZQoJCQlpLAoJCQkvLyBGYWtlIHhocgoJCQlqcVhIUiA9IHsKCgkJCQlyZWFkeVN0YXRlOiAwLAoKCQkJCS8vIENhY2hlcyB0aGUgaGVhZGVyCgkJCQlzZXRSZXF1ZXN0SGVhZGVyOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7CgkJCQkJaWYgKCAhc3RhdGUgKSB7CgkJCQkJCXZhciBsbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTsKCQkJCQkJbmFtZSA9IHJlcXVlc3RIZWFkZXJzTmFtZXNbIGxuYW1lIF0gPSByZXF1ZXN0SGVhZGVyc05hbWVzWyBsbmFtZSBdIHx8IG5hbWU7CgkJCQkJCXJlcXVlc3RIZWFkZXJzWyBuYW1lIF0gPSB2YWx1ZTsKCQkJCQl9CgkJCQkJcmV0dXJuIHRoaXM7CgkJCQl9LAoKCQkJCS8vIFJhdyBzdHJpbmcKCQkJCWdldEFsbFJlc3BvbnNlSGVhZGVyczogZnVuY3Rpb24oKSB7CgkJCQkJcmV0dXJuIHN0YXRlID09PSAyID8gcmVzcG9uc2VIZWFkZXJzU3RyaW5nIDogbnVsbDsKCQkJCX0sCgoJCQkJLy8gQnVpbGRzIGhlYWRlcnMgaGFzaHRhYmxlIGlmIG5lZWRlZAoJCQkJZ2V0UmVzcG9uc2VIZWFkZXI6IGZ1bmN0aW9uKCBrZXkgKSB7CgkJCQkJdmFyIG1hdGNoOwoJCQkJCWlmICggc3RhdGUgPT09IDIgKSB7CgkJCQkJCWlmICggIXJlc3BvbnNlSGVhZGVycyApIHsKCQkJCQkJCXJlc3BvbnNlSGVhZGVycyA9IHt9OwoJCQkJCQkJd2hpbGUoICggbWF0Y2ggPSByaGVhZGVycy5leGVjKCByZXNwb25zZUhlYWRlcnNTdHJpbmcgKSApICkgewoJCQkJCQkJCXJlc3BvbnNlSGVhZGVyc1sgbWF0Y2hbMV0udG9Mb3dlckNhc2UoKSBdID0gbWF0Y2hbIDIgXTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQltYXRjaCA9IHJlc3BvbnNlSGVhZGVyc1sga2V5LnRvTG93ZXJDYXNlKCkgXTsKCQkJCQl9CgkJCQkJcmV0dXJuIG1hdGNoID09PSB1bmRlZmluZWQgPyBudWxsIDogbWF0Y2g7CgkJCQl9LAoKCQkJCS8vIE92ZXJyaWRlcyByZXNwb25zZSBjb250ZW50LXR5cGUgaGVhZGVyCgkJCQlvdmVycmlkZU1pbWVUeXBlOiBmdW5jdGlvbiggdHlwZSApIHsKCQkJCQlpZiAoICFzdGF0ZSApIHsKCQkJCQkJcy5taW1lVHlwZSA9IHR5cGU7CgkJCQkJfQoJCQkJCXJldHVybiB0aGlzOwoJCQkJfSwKCgkJCQkvLyBDYW5jZWwgdGhlIHJlcXVlc3QKCQkJCWFib3J0OiBmdW5jdGlvbiggc3RhdHVzVGV4dCApIHsKCQkJCQlzdGF0dXNUZXh0ID0gc3RhdHVzVGV4dCB8fCAiYWJvcnQiOwoJCQkJCWlmICggdHJhbnNwb3J0ICkgewoJCQkJCQl0cmFuc3BvcnQuYWJvcnQoIHN0YXR1c1RleHQgKTsKCQkJCQl9CgkJCQkJZG9uZSggMCwgc3RhdHVzVGV4dCApOwoJCQkJCXJldHVybiB0aGlzOwoJCQkJfQoJCQl9OwoKCQkvLyBDYWxsYmFjayBmb3Igd2hlbiBldmVyeXRoaW5nIGlzIGRvbmUKCQkvLyBJdCBpcyBkZWZpbmVkIGhlcmUgYmVjYXVzZSBqc2xpbnQgY29tcGxhaW5zIGlmIGl0IGlzIGRlY2xhcmVkCgkJLy8gYXQgdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24gKHdoaWNoIHdvdWxkIGJlIG1vcmUgbG9naWNhbCBhbmQgcmVhZGFibGUpCgkJZnVuY3Rpb24gZG9uZSggc3RhdHVzLCBuYXRpdmVTdGF0dXNUZXh0LCByZXNwb25zZXMsIGhlYWRlcnMgKSB7CgoJCQkvLyBDYWxsZWQgb25jZQoJCQlpZiAoIHN0YXRlID09PSAyICkgewoJCQkJcmV0dXJuOwoJCQl9CgoJCQkvLyBTdGF0ZSBpcyAiZG9uZSIgbm93CgkJCXN0YXRlID0gMjsKCgkJCS8vIENsZWFyIHRpbWVvdXQgaWYgaXQgZXhpc3RzCgkJCWlmICggdGltZW91dFRpbWVyICkgewoJCQkJY2xlYXJUaW1lb3V0KCB0aW1lb3V0VGltZXIgKTsKCQkJfQoKCQkJLy8gRGVyZWZlcmVuY2UgdHJhbnNwb3J0IGZvciBlYXJseSBnYXJiYWdlIGNvbGxlY3Rpb24KCQkJLy8gKG5vIG1hdHRlciBob3cgbG9uZyB0aGUganFYSFIgb2JqZWN0IHdpbGwgYmUgdXNlZCkKCQkJdHJhbnNwb3J0ID0gdW5kZWZpbmVkOwoKCQkJLy8gQ2FjaGUgcmVzcG9uc2UgaGVhZGVycwoJCQlyZXNwb25zZUhlYWRlcnNTdHJpbmcgPSBoZWFkZXJzIHx8ICIiOwoKCQkJLy8gU2V0IHJlYWR5U3RhdGUKCQkJanFYSFIucmVhZHlTdGF0ZSA9IHN0YXR1cyA+IDAgPyA0IDogMDsKCgkJCXZhciBpc1N1Y2Nlc3MsCgkJCQlzdWNjZXNzLAoJCQkJZXJyb3IsCgkJCQlzdGF0dXNUZXh0ID0gbmF0aXZlU3RhdHVzVGV4dCwKCQkJCXJlc3BvbnNlID0gcmVzcG9uc2VzID8gYWpheEhhbmRsZVJlc3BvbnNlcyggcywganFYSFIsIHJlc3BvbnNlcyApIDogdW5kZWZpbmVkLAoJCQkJbGFzdE1vZGlmaWVkLAoJCQkJZXRhZzsKCgkJCS8vIElmIHN1Y2Nlc3NmdWwsIGhhbmRsZSB0eXBlIGNoYWluaW5nCgkJCWlmICggc3RhdHVzID49IDIwMCAmJiBzdGF0dXMgPCAzMDAgfHwgc3RhdHVzID09PSAzMDQgKSB7CgoJCQkJLy8gU2V0IHRoZSBJZi1Nb2RpZmllZC1TaW5jZSBhbmQvb3IgSWYtTm9uZS1NYXRjaCBoZWFkZXIsIGlmIGluIGlmTW9kaWZpZWQgbW9kZS4KCQkJCWlmICggcy5pZk1vZGlmaWVkICkgewoKCQkJCQlpZiAoICggbGFzdE1vZGlmaWVkID0ganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoICJMYXN0LU1vZGlmaWVkIiApICkgKSB7CgkJCQkJCWpRdWVyeS5sYXN0TW9kaWZpZWRbIGlmTW9kaWZpZWRLZXkgXSA9IGxhc3RNb2RpZmllZDsKCQkJCQl9CgkJCQkJaWYgKCAoIGV0YWcgPSBqcVhIUi5nZXRSZXNwb25zZUhlYWRlciggIkV0YWciICkgKSApIHsKCQkJCQkJalF1ZXJ5LmV0YWdbIGlmTW9kaWZpZWRLZXkgXSA9IGV0YWc7CgkJCQkJfQoJCQkJfQoKCQkJCS8vIElmIG5vdCBtb2RpZmllZAoJCQkJaWYgKCBzdGF0dXMgPT09IDMwNCApIHsKCgkJCQkJc3RhdHVzVGV4dCA9ICJub3Rtb2RpZmllZCI7CgkJCQkJaXNTdWNjZXNzID0gdHJ1ZTsKCgkJCQkvLyBJZiB3ZSBoYXZlIGRhdGEKCQkJCX0gZWxzZSB7CgoJCQkJCXRyeSB7CgkJCQkJCXN1Y2Nlc3MgPSBhamF4Q29udmVydCggcywgcmVzcG9uc2UgKTsKCQkJCQkJc3RhdHVzVGV4dCA9ICJzdWNjZXNzIjsKCQkJCQkJaXNTdWNjZXNzID0gdHJ1ZTsKCQkJCQl9IGNhdGNoKGUpIHsKCQkJCQkJLy8gV2UgaGF2ZSBhIHBhcnNlcmVycm9yCgkJCQkJCXN0YXR1c1RleHQgPSAicGFyc2VyZXJyb3IiOwoJCQkJCQllcnJvciA9IGU7CgkJCQkJfQoJCQkJfQoJCQl9IGVsc2UgewoJCQkJLy8gV2UgZXh0cmFjdCBlcnJvciBmcm9tIHN0YXR1c1RleHQKCQkJCS8vIHRoZW4gbm9ybWFsaXplIHN0YXR1c1RleHQgYW5kIHN0YXR1cyBmb3Igbm9uLWFib3J0cwoJCQkJZXJyb3IgPSBzdGF0dXNUZXh0OwoJCQkJaWYoICFzdGF0dXNUZXh0IHx8IHN0YXR1cyApIHsKCQkJCQlzdGF0dXNUZXh0ID0gImVycm9yIjsKCQkJCQlpZiAoIHN0YXR1cyA8IDAgKSB7CgkJCQkJCXN0YXR1cyA9IDA7CgkJCQkJfQoJCQkJfQoJCQl9CgoJCQkvLyBTZXQgZGF0YSBmb3IgdGhlIGZha2UgeGhyIG9iamVjdAoJCQlqcVhIUi5zdGF0dXMgPSBzdGF0dXM7CgkJCWpxWEhSLnN0YXR1c1RleHQgPSAiIiArICggbmF0aXZlU3RhdHVzVGV4dCB8fCBzdGF0dXNUZXh0ICk7CgoJCQkvLyBTdWNjZXNzL0Vycm9yCgkJCWlmICggaXNTdWNjZXNzICkgewoJCQkJZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGNhbGxiYWNrQ29udGV4dCwgWyBzdWNjZXNzLCBzdGF0dXNUZXh0LCBqcVhIUiBdICk7CgkJCX0gZWxzZSB7CgkJCQlkZWZlcnJlZC5yZWplY3RXaXRoKCBjYWxsYmFja0NvbnRleHQsIFsganFYSFIsIHN0YXR1c1RleHQsIGVycm9yIF0gKTsKCQkJfQoKCQkJLy8gU3RhdHVzLWRlcGVuZGVudCBjYWxsYmFja3MKCQkJanFYSFIuc3RhdHVzQ29kZSggc3RhdHVzQ29kZSApOwoJCQlzdGF0dXNDb2RlID0gdW5kZWZpbmVkOwoKCQkJaWYgKCBmaXJlR2xvYmFscyApIHsKCQkJCWdsb2JhbEV2ZW50Q29udGV4dC50cmlnZ2VyKCAiYWpheCIgKyAoIGlzU3VjY2VzcyA/ICJTdWNjZXNzIiA6ICJFcnJvciIgKSwKCQkJCQkJWyBqcVhIUiwgcywgaXNTdWNjZXNzID8gc3VjY2VzcyA6IGVycm9yIF0gKTsKCQkJfQoKCQkJLy8gQ29tcGxldGUKCQkJY29tcGxldGVEZWZlcnJlZC5yZXNvbHZlV2l0aCggY2FsbGJhY2tDb250ZXh0LCBbIGpxWEhSLCBzdGF0dXNUZXh0IF0gKTsKCgkJCWlmICggZmlyZUdsb2JhbHMgKSB7CgkJCQlnbG9iYWxFdmVudENvbnRleHQudHJpZ2dlciggImFqYXhDb21wbGV0ZSIsIFsganFYSFIsIHMgXSApOwoJCQkJLy8gSGFuZGxlIHRoZSBnbG9iYWwgQUpBWCBjb3VudGVyCgkJCQlpZiAoICEoIC0talF1ZXJ5LmFjdGl2ZSApICkgewoJCQkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCAiYWpheFN0b3AiICk7CgkJCQl9CgkJCX0KCQl9CgoJCS8vIEF0dGFjaCBkZWZlcnJlZHMKCQlkZWZlcnJlZC5wcm9taXNlKCBqcVhIUiApOwoJCWpxWEhSLnN1Y2Nlc3MgPSBqcVhIUi5kb25lOwoJCWpxWEhSLmVycm9yID0ganFYSFIuZmFpbDsKCQlqcVhIUi5jb21wbGV0ZSA9IGNvbXBsZXRlRGVmZXJyZWQuZG9uZTsKCgkJLy8gU3RhdHVzLWRlcGVuZGVudCBjYWxsYmFja3MKCQlqcVhIUi5zdGF0dXNDb2RlID0gZnVuY3Rpb24oIG1hcCApIHsKCQkJaWYgKCBtYXAgKSB7CgkJCQl2YXIgdG1wOwoJCQkJaWYgKCBzdGF0ZSA8IDIgKSB7CgkJCQkJZm9yKCB0bXAgaW4gbWFwICkgewoJCQkJCQlzdGF0dXNDb2RlWyB0bXAgXSA9IFsgc3RhdHVzQ29kZVt0bXBdLCBtYXBbdG1wXSBdOwoJCQkJCX0KCQkJCX0gZWxzZSB7CgkJCQkJdG1wID0gbWFwWyBqcVhIUi5zdGF0dXMgXTsKCQkJCQlqcVhIUi50aGVuKCB0bXAsIHRtcCApOwoJCQkJfQoJCQl9CgkJCXJldHVybiB0aGlzOwoJCX07CgoJCS8vIFJlbW92ZSBoYXNoIGNoYXJhY3RlciAoIzc1MzE6IGFuZCBzdHJpbmcgcHJvbW90aW9uKQoJCS8vIEFkZCBwcm90b2NvbCBpZiBub3QgcHJvdmlkZWQgKCM1ODY2OiBJRTcgaXNzdWUgd2l0aCBwcm90b2NvbC1sZXNzIHVybHMpCgkJLy8gV2UgYWxzbyB1c2UgdGhlIHVybCBwYXJhbWV0ZXIgaWYgYXZhaWxhYmxlCgkJcy51cmwgPSAoICggdXJsIHx8IHMudXJsICkgKyAiIiApLnJlcGxhY2UoIHJoYXNoLCAiIiApLnJlcGxhY2UoIHJwcm90b2NvbCwgYWpheExvY1BhcnRzWyAxIF0gKyAiLy8iICk7CgoJCS8vIEV4dHJhY3QgZGF0YVR5cGVzIGxpc3QKCQlzLmRhdGFUeXBlcyA9IGpRdWVyeS50cmltKCBzLmRhdGFUeXBlIHx8ICIqIiApLnRvTG93ZXJDYXNlKCkuc3BsaXQoIHJzcGFjZXNBamF4ICk7CgoJCS8vIERldGVybWluZSBpZiBhIGNyb3NzLWRvbWFpbiByZXF1ZXN0IGlzIGluIG9yZGVyCgkJaWYgKCBzLmNyb3NzRG9tYWluID09IG51bGwgKSB7CgkJCXBhcnRzID0gcnVybC5leGVjKCBzLnVybC50b0xvd2VyQ2FzZSgpICk7CgkJCXMuY3Jvc3NEb21haW4gPSAhISggcGFydHMgJiYKCQkJCSggcGFydHNbIDEgXSAhPSBhamF4TG9jUGFydHNbIDEgXSB8fCBwYXJ0c1sgMiBdICE9IGFqYXhMb2NQYXJ0c1sgMiBdIHx8CgkJCQkJKCBwYXJ0c1sgMyBdIHx8ICggcGFydHNbIDEgXSA9PT0gImh0dHA6IiA/IDgwIDogNDQzICkgKSAhPQoJCQkJCQkoIGFqYXhMb2NQYXJ0c1sgMyBdIHx8ICggYWpheExvY1BhcnRzWyAxIF0gPT09ICJodHRwOiIgPyA4MCA6IDQ0MyApICkgKQoJCQkpOwoJCX0KCgkJLy8gQ29udmVydCBkYXRhIGlmIG5vdCBhbHJlYWR5IGEgc3RyaW5nCgkJaWYgKCBzLmRhdGEgJiYgcy5wcm9jZXNzRGF0YSAmJiB0eXBlb2Ygcy5kYXRhICE9PSAic3RyaW5nIiApIHsKCQkJcy5kYXRhID0galF1ZXJ5LnBhcmFtKCBzLmRhdGEsIHMudHJhZGl0aW9uYWwgKTsKCQl9CgoJCS8vIEFwcGx5IHByZWZpbHRlcnMKCQlpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyggcHJlZmlsdGVycywgcywgb3B0aW9ucywganFYSFIgKTsKCgkJLy8gSWYgcmVxdWVzdCB3YXMgYWJvcnRlZCBpbnNpZGUgYSBwcmVmaWxlciwgc3RvcCB0aGVyZQoJCWlmICggc3RhdGUgPT09IDIgKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCS8vIFdlIGNhbiBmaXJlIGdsb2JhbCBldmVudHMgYXMgb2Ygbm93IGlmIGFza2VkIHRvCgkJZmlyZUdsb2JhbHMgPSBzLmdsb2JhbDsKCgkJLy8gVXBwZXJjYXNlIHRoZSB0eXBlCgkJcy50eXBlID0gcy50eXBlLnRvVXBwZXJDYXNlKCk7CgoJCS8vIERldGVybWluZSBpZiByZXF1ZXN0IGhhcyBjb250ZW50CgkJcy5oYXNDb250ZW50ID0gIXJub0NvbnRlbnQudGVzdCggcy50eXBlICk7CgoJCS8vIFdhdGNoIGZvciBhIG5ldyBzZXQgb2YgcmVxdWVzdHMKCQlpZiAoIGZpcmVHbG9iYWxzICYmIGpRdWVyeS5hY3RpdmUrKyA9PT0gMCApIHsKCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoICJhamF4U3RhcnQiICk7CgkJfQoKCQkvLyBNb3JlIG9wdGlvbnMgaGFuZGxpbmcgZm9yIHJlcXVlc3RzIHdpdGggbm8gY29udGVudAoJCWlmICggIXMuaGFzQ29udGVudCApIHsKCgkJCS8vIElmIGRhdGEgaXMgYXZhaWxhYmxlLCBhcHBlbmQgZGF0YSB0byB1cmwKCQkJaWYgKCBzLmRhdGEgKSB7CgkJCQlzLnVybCArPSAoIHJxdWVyeS50ZXN0KCBzLnVybCApID8gIiYiIDogIj8iICkgKyBzLmRhdGE7CgkJCQkvLyAjOTY4MjogcmVtb3ZlIGRhdGEgc28gdGhhdCBpdCdzIG5vdCB1c2VkIGluIGFuIGV2ZW50dWFsIHJldHJ5CgkJCQlkZWxldGUgcy5kYXRhOwoJCQl9CgoJCQkvLyBHZXQgaWZNb2RpZmllZEtleSBiZWZvcmUgYWRkaW5nIHRoZSBhbnRpLWNhY2hlIHBhcmFtZXRlcgoJCQlpZk1vZGlmaWVkS2V5ID0gcy51cmw7CgoJCQkvLyBBZGQgYW50aS1jYWNoZSBpbiB1cmwgaWYgbmVlZGVkCgkJCWlmICggcy5jYWNoZSA9PT0gZmFsc2UgKSB7CgoJCQkJdmFyIHRzID0galF1ZXJ5Lm5vdygpLAoJCQkJCS8vIHRyeSByZXBsYWNpbmcgXz0gaWYgaXQgaXMgdGhlcmUKCQkJCQlyZXQgPSBzLnVybC5yZXBsYWNlKCBydHMsICIkMV89IiArIHRzICk7CgoJCQkJLy8gaWYgbm90aGluZyB3YXMgcmVwbGFjZWQsIGFkZCB0aW1lc3RhbXAgdG8gdGhlIGVuZAoJCQkJcy51cmwgPSByZXQgKyAoIChyZXQgPT09IHMudXJsICkgPyAoIHJxdWVyeS50ZXN0KCBzLnVybCApID8gIiYiIDogIj8iICkgKyAiXz0iICsgdHMgOiAiIiApOwoJCQl9CgkJfQoKCQkvLyBTZXQgdGhlIGNvcnJlY3QgaGVhZGVyLCBpZiBkYXRhIGlzIGJlaW5nIHNlbnQKCQlpZiAoIHMuZGF0YSAmJiBzLmhhc0NvbnRlbnQgJiYgcy5jb250ZW50VHlwZSAhPT0gZmFsc2UgfHwgb3B0aW9ucy5jb250ZW50VHlwZSApIHsKCQkJanFYSFIuc2V0UmVxdWVzdEhlYWRlciggIkNvbnRlbnQtVHlwZSIsIHMuY29udGVudFR5cGUgKTsKCQl9CgoJCS8vIFNldCB0aGUgSWYtTW9kaWZpZWQtU2luY2UgYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyLCBpZiBpbiBpZk1vZGlmaWVkIG1vZGUuCgkJaWYgKCBzLmlmTW9kaWZpZWQgKSB7CgkJCWlmTW9kaWZpZWRLZXkgPSBpZk1vZGlmaWVkS2V5IHx8IHMudXJsOwoJCQlpZiAoIGpRdWVyeS5sYXN0TW9kaWZpZWRbIGlmTW9kaWZpZWRLZXkgXSApIHsKCQkJCWpxWEhSLnNldFJlcXVlc3RIZWFkZXIoICJJZi1Nb2RpZmllZC1TaW5jZSIsIGpRdWVyeS5sYXN0TW9kaWZpZWRbIGlmTW9kaWZpZWRLZXkgXSApOwoJCQl9CgkJCWlmICggalF1ZXJ5LmV0YWdbIGlmTW9kaWZpZWRLZXkgXSApIHsKCQkJCWpxWEhSLnNldFJlcXVlc3RIZWFkZXIoICJJZi1Ob25lLU1hdGNoIiwgalF1ZXJ5LmV0YWdbIGlmTW9kaWZpZWRLZXkgXSApOwoJCQl9CgkJfQoKCQkvLyBTZXQgdGhlIEFjY2VwdHMgaGVhZGVyIGZvciB0aGUgc2VydmVyLCBkZXBlbmRpbmcgb24gdGhlIGRhdGFUeXBlCgkJanFYSFIuc2V0UmVxdWVzdEhlYWRlcigKCQkJIkFjY2VwdCIsCgkJCXMuZGF0YVR5cGVzWyAwIF0gJiYgcy5hY2NlcHRzWyBzLmRhdGFUeXBlc1swXSBdID8KCQkJCXMuYWNjZXB0c1sgcy5kYXRhVHlwZXNbMF0gXSArICggcy5kYXRhVHlwZXNbIDAgXSAhPT0gIioiID8gIiwgIiArIGFsbFR5cGVzICsgIjsgcT0wLjAxIiA6ICIiICkgOgoJCQkJcy5hY2NlcHRzWyAiKiIgXQoJCSk7CgoJCS8vIENoZWNrIGZvciBoZWFkZXJzIG9wdGlvbgoJCWZvciAoIGkgaW4gcy5oZWFkZXJzICkgewoJCQlqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKCBpLCBzLmhlYWRlcnNbIGkgXSApOwoJCX0KCgkJLy8gQWxsb3cgY3VzdG9tIGhlYWRlcnMvbWltZXR5cGVzIGFuZCBlYXJseSBhYm9ydAoJCWlmICggcy5iZWZvcmVTZW5kICYmICggcy5iZWZvcmVTZW5kLmNhbGwoIGNhbGxiYWNrQ29udGV4dCwganFYSFIsIHMgKSA9PT0gZmFsc2UgfHwgc3RhdGUgPT09IDIgKSApIHsKCQkJCS8vIEFib3J0IGlmIG5vdCBkb25lIGFscmVhZHkKCQkJCWpxWEhSLmFib3J0KCk7CgkJCQlyZXR1cm4gZmFsc2U7CgoJCX0KCgkJLy8gSW5zdGFsbCBjYWxsYmFja3Mgb24gZGVmZXJyZWRzCgkJZm9yICggaSBpbiB7IHN1Y2Nlc3M6IDEsIGVycm9yOiAxLCBjb21wbGV0ZTogMSB9ICkgewoJCQlqcVhIUlsgaSBdKCBzWyBpIF0gKTsKCQl9CgoJCS8vIEdldCB0cmFuc3BvcnQKCQl0cmFuc3BvcnQgPSBpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyggdHJhbnNwb3J0cywgcywgb3B0aW9ucywganFYSFIgKTsKCgkJLy8gSWYgbm8gdHJhbnNwb3J0LCB3ZSBhdXRvLWFib3J0CgkJaWYgKCAhdHJhbnNwb3J0ICkgewoJCQlkb25lKCAtMSwgIk5vIFRyYW5zcG9ydCIgKTsKCQl9IGVsc2UgewoJCQlqcVhIUi5yZWFkeVN0YXRlID0gMTsKCQkJLy8gU2VuZCBnbG9iYWwgZXZlbnQKCQkJaWYgKCBmaXJlR2xvYmFscyApIHsKCQkJCWdsb2JhbEV2ZW50Q29udGV4dC50cmlnZ2VyKCAiYWpheFNlbmQiLCBbIGpxWEhSLCBzIF0gKTsKCQkJfQoJCQkvLyBUaW1lb3V0CgkJCWlmICggcy5hc3luYyAmJiBzLnRpbWVvdXQgPiAwICkgewoJCQkJdGltZW91dFRpbWVyID0gc2V0VGltZW91dCggZnVuY3Rpb24oKXsKCQkJCQlqcVhIUi5hYm9ydCggInRpbWVvdXQiICk7CgkJCQl9LCBzLnRpbWVvdXQgKTsKCQkJfQoKCQkJdHJ5IHsKCQkJCXN0YXRlID0gMTsKCQkJCXRyYW5zcG9ydC5zZW5kKCByZXF1ZXN0SGVhZGVycywgZG9uZSApOwoJCQl9IGNhdGNoIChlKSB7CgkJCQkvLyBQcm9wYWdhdGUgZXhjZXB0aW9uIGFzIGVycm9yIGlmIG5vdCBkb25lCgkJCQlpZiAoIHN0YXRlIDwgMiApIHsKCQkJCQlkb25lKCAtMSwgZSApOwoJCQkJLy8gU2ltcGx5IHJldGhyb3cgb3RoZXJ3aXNlCgkJCQl9IGVsc2UgewoJCQkJCWpRdWVyeS5lcnJvciggZSApOwoJCQkJfQoJCQl9CgkJfQoKCQlyZXR1cm4ganFYSFI7Cgl9LAoKCS8vIFNlcmlhbGl6ZSBhbiBhcnJheSBvZiBmb3JtIGVsZW1lbnRzIG9yIGEgc2V0IG9mCgkvLyBrZXkvdmFsdWVzIGludG8gYSBxdWVyeSBzdHJpbmcKCXBhcmFtOiBmdW5jdGlvbiggYSwgdHJhZGl0aW9uYWwgKSB7CgkJdmFyIHMgPSBbXSwKCQkJYWRkID0gZnVuY3Rpb24oIGtleSwgdmFsdWUgKSB7CgkJCQkvLyBJZiB2YWx1ZSBpcyBhIGZ1bmN0aW9uLCBpbnZva2UgaXQgYW5kIHJldHVybiBpdHMgdmFsdWUKCQkJCXZhbHVlID0galF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgPyB2YWx1ZSgpIDogdmFsdWU7CgkJCQlzWyBzLmxlbmd0aCBdID0gZW5jb2RlVVJJQ29tcG9uZW50KCBrZXkgKSArICI9IiArIGVuY29kZVVSSUNvbXBvbmVudCggdmFsdWUgKTsKCQkJfTsKCgkJLy8gU2V0IHRyYWRpdGlvbmFsIHRvIHRydWUgZm9yIGpRdWVyeSA8PSAxLjMuMiBiZWhhdmlvci4KCQlpZiAoIHRyYWRpdGlvbmFsID09PSB1bmRlZmluZWQgKSB7CgkJCXRyYWRpdGlvbmFsID0galF1ZXJ5LmFqYXhTZXR0aW5ncy50cmFkaXRpb25hbDsKCQl9CgoJCS8vIElmIGFuIGFycmF5IHdhcyBwYXNzZWQgaW4sIGFzc3VtZSB0aGF0IGl0IGlzIGFuIGFycmF5IG9mIGZvcm0gZWxlbWVudHMuCgkJaWYgKCBqUXVlcnkuaXNBcnJheSggYSApIHx8ICggYS5qcXVlcnkgJiYgIWpRdWVyeS5pc1BsYWluT2JqZWN0KCBhICkgKSApIHsKCQkJLy8gU2VyaWFsaXplIHRoZSBmb3JtIGVsZW1lbnRzCgkJCWpRdWVyeS5lYWNoKCBhLCBmdW5jdGlvbigpIHsKCQkJCWFkZCggdGhpcy5uYW1lLCB0aGlzLnZhbHVlICk7CgkJCX0pOwoKCQl9IGVsc2UgewoJCQkvLyBJZiB0cmFkaXRpb25hbCwgZW5jb2RlIHRoZSAib2xkIiB3YXkgKHRoZSB3YXkgMS4zLjIgb3Igb2xkZXIKCQkJLy8gZGlkIGl0KSwgb3RoZXJ3aXNlIGVuY29kZSBwYXJhbXMgcmVjdXJzaXZlbHkuCgkJCWZvciAoIHZhciBwcmVmaXggaW4gYSApIHsKCQkJCWJ1aWxkUGFyYW1zKCBwcmVmaXgsIGFbIHByZWZpeCBdLCB0cmFkaXRpb25hbCwgYWRkICk7CgkJCX0KCQl9CgoJCS8vIFJldHVybiB0aGUgcmVzdWx0aW5nIHNlcmlhbGl6YXRpb24KCQlyZXR1cm4gcy5qb2luKCAiJiIgKS5yZXBsYWNlKCByMjAsICIrIiApOwoJfQp9KTsKCmZ1bmN0aW9uIGJ1aWxkUGFyYW1zKCBwcmVmaXgsIG9iaiwgdHJhZGl0aW9uYWwsIGFkZCApIHsKCWlmICggalF1ZXJ5LmlzQXJyYXkoIG9iaiApICkgewoJCS8vIFNlcmlhbGl6ZSBhcnJheSBpdGVtLgoJCWpRdWVyeS5lYWNoKCBvYmosIGZ1bmN0aW9uKCBpLCB2ICkgewoJCQlpZiAoIHRyYWRpdGlvbmFsIHx8IHJicmFja2V0LnRlc3QoIHByZWZpeCApICkgewoJCQkJLy8gVHJlYXQgZWFjaCBhcnJheSBpdGVtIGFzIGEgc2NhbGFyLgoJCQkJYWRkKCBwcmVmaXgsIHYgKTsKCgkJCX0gZWxzZSB7CgkJCQkvLyBJZiBhcnJheSBpdGVtIGlzIG5vbi1zY2FsYXIgKGFycmF5IG9yIG9iamVjdCksIGVuY29kZSBpdHMKCQkJCS8vIG51bWVyaWMgaW5kZXggdG8gcmVzb2x2ZSBkZXNlcmlhbGl6YXRpb24gYW1iaWd1aXR5IGlzc3Vlcy4KCQkJCS8vIE5vdGUgdGhhdCByYWNrIChhcyBvZiAxLjAuMCkgY2FuJ3QgY3VycmVudGx5IGRlc2VyaWFsaXplCgkJCQkvLyBuZXN0ZWQgYXJyYXlzIHByb3Blcmx5LCBhbmQgYXR0ZW1wdGluZyB0byBkbyBzbyBtYXkgY2F1c2UKCQkJCS8vIGEgc2VydmVyIGVycm9yLiBQb3NzaWJsZSBmaXhlcyBhcmUgdG8gbW9kaWZ5IHJhY2sncwoJCQkJLy8gZGVzZXJpYWxpemF0aW9uIGFsZ29yaXRobSBvciB0byBwcm92aWRlIGFuIG9wdGlvbiBvciBmbGFnCgkJCQkvLyB0byBmb3JjZSBhcnJheSBzZXJpYWxpemF0aW9uIHRvIGJlIHNoYWxsb3cuCgkJCQlidWlsZFBhcmFtcyggcHJlZml4ICsgIlsiICsgKCB0eXBlb2YgdiA9PT0gIm9iamVjdCIgfHwgalF1ZXJ5LmlzQXJyYXkodikgPyBpIDogIiIgKSArICJdIiwgdiwgdHJhZGl0aW9uYWwsIGFkZCApOwoJCQl9CgkJfSk7CgoJfSBlbHNlIGlmICggIXRyYWRpdGlvbmFsICYmIG9iaiAhPSBudWxsICYmIHR5cGVvZiBvYmogPT09ICJvYmplY3QiICkgewoJCS8vIFNlcmlhbGl6ZSBvYmplY3QgaXRlbS4KCQlmb3IgKCB2YXIgbmFtZSBpbiBvYmogKSB7CgkJCWJ1aWxkUGFyYW1zKCBwcmVmaXggKyAiWyIgKyBuYW1lICsgIl0iLCBvYmpbIG5hbWUgXSwgdHJhZGl0aW9uYWwsIGFkZCApOwoJCX0KCgl9IGVsc2UgewoJCS8vIFNlcmlhbGl6ZSBzY2FsYXIgaXRlbS4KCQlhZGQoIHByZWZpeCwgb2JqICk7Cgl9Cn0KCi8vIFRoaXMgaXMgc3RpbGwgb24gdGhlIGpRdWVyeSBvYmplY3QuLi4gZm9yIG5vdwovLyBXYW50IHRvIG1vdmUgdGhpcyB0byBqUXVlcnkuYWpheCBzb21lIGRheQpqUXVlcnkuZXh0ZW5kKHsKCgkvLyBDb3VudGVyIGZvciBob2xkaW5nIHRoZSBudW1iZXIgb2YgYWN0aXZlIHF1ZXJpZXMKCWFjdGl2ZTogMCwKCgkvLyBMYXN0LU1vZGlmaWVkIGhlYWRlciBjYWNoZSBmb3IgbmV4dCByZXF1ZXN0CglsYXN0TW9kaWZpZWQ6IHt9LAoJZXRhZzoge30KCn0pOwoKLyogSGFuZGxlcyByZXNwb25zZXMgdG8gYW4gYWpheCByZXF1ZXN0OgogKiAtIHNldHMgYWxsIHJlc3BvbnNlWFhYIGZpZWxkcyBhY2NvcmRpbmdseQogKiAtIGZpbmRzIHRoZSByaWdodCBkYXRhVHlwZSAobWVkaWF0ZXMgYmV0d2VlbiBjb250ZW50LXR5cGUgYW5kIGV4cGVjdGVkIGRhdGFUeXBlKQogKiAtIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgcmVzcG9uc2UKICovCmZ1bmN0aW9uIGFqYXhIYW5kbGVSZXNwb25zZXMoIHMsIGpxWEhSLCByZXNwb25zZXMgKSB7CgoJdmFyIGNvbnRlbnRzID0gcy5jb250ZW50cywKCQlkYXRhVHlwZXMgPSBzLmRhdGFUeXBlcywKCQlyZXNwb25zZUZpZWxkcyA9IHMucmVzcG9uc2VGaWVsZHMsCgkJY3QsCgkJdHlwZSwKCQlmaW5hbERhdGFUeXBlLAoJCWZpcnN0RGF0YVR5cGU7CgoJLy8gRmlsbCByZXNwb25zZVhYWCBmaWVsZHMKCWZvciggdHlwZSBpbiByZXNwb25zZUZpZWxkcyApIHsKCQlpZiAoIHR5cGUgaW4gcmVzcG9uc2VzICkgewoJCQlqcVhIUlsgcmVzcG9uc2VGaWVsZHNbdHlwZV0gXSA9IHJlc3BvbnNlc1sgdHlwZSBdOwoJCX0KCX0KCgkvLyBSZW1vdmUgYXV0byBkYXRhVHlwZSBhbmQgZ2V0IGNvbnRlbnQtdHlwZSBpbiB0aGUgcHJvY2VzcwoJd2hpbGUoIGRhdGFUeXBlc1sgMCBdID09PSAiKiIgKSB7CgkJZGF0YVR5cGVzLnNoaWZ0KCk7CgkJaWYgKCBjdCA9PT0gdW5kZWZpbmVkICkgewoJCQljdCA9IHMubWltZVR5cGUgfHwganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoICJjb250ZW50LXR5cGUiICk7CgkJfQoJfQoKCS8vIENoZWNrIGlmIHdlJ3JlIGRlYWxpbmcgd2l0aCBhIGtub3duIGNvbnRlbnQtdHlwZQoJaWYgKCBjdCApIHsKCQlmb3IgKCB0eXBlIGluIGNvbnRlbnRzICkgewoJCQlpZiAoIGNvbnRlbnRzWyB0eXBlIF0gJiYgY29udGVudHNbIHR5cGUgXS50ZXN0KCBjdCApICkgewoJCQkJZGF0YVR5cGVzLnVuc2hpZnQoIHR5cGUgKTsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJfQoKCS8vIENoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGEgcmVzcG9uc2UgZm9yIHRoZSBleHBlY3RlZCBkYXRhVHlwZQoJaWYgKCBkYXRhVHlwZXNbIDAgXSBpbiByZXNwb25zZXMgKSB7CgkJZmluYWxEYXRhVHlwZSA9IGRhdGFUeXBlc1sgMCBdOwoJfSBlbHNlIHsKCQkvLyBUcnkgY29udmVydGlibGUgZGF0YVR5cGVzCgkJZm9yICggdHlwZSBpbiByZXNwb25zZXMgKSB7CgkJCWlmICggIWRhdGFUeXBlc1sgMCBdIHx8IHMuY29udmVydGVyc1sgdHlwZSArICIgIiArIGRhdGFUeXBlc1swXSBdICkgewoJCQkJZmluYWxEYXRhVHlwZSA9IHR5cGU7CgkJCQlicmVhazsKCQkJfQoJCQlpZiAoICFmaXJzdERhdGFUeXBlICkgewoJCQkJZmlyc3REYXRhVHlwZSA9IHR5cGU7CgkJCX0KCQl9CgkJLy8gT3IganVzdCB1c2UgZmlyc3Qgb25lCgkJZmluYWxEYXRhVHlwZSA9IGZpbmFsRGF0YVR5cGUgfHwgZmlyc3REYXRhVHlwZTsKCX0KCgkvLyBJZiB3ZSBmb3VuZCBhIGRhdGFUeXBlCgkvLyBXZSBhZGQgdGhlIGRhdGFUeXBlIHRvIHRoZSBsaXN0IGlmIG5lZWRlZAoJLy8gYW5kIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyByZXNwb25zZQoJaWYgKCBmaW5hbERhdGFUeXBlICkgewoJCWlmICggZmluYWxEYXRhVHlwZSAhPT0gZGF0YVR5cGVzWyAwIF0gKSB7CgkJCWRhdGFUeXBlcy51bnNoaWZ0KCBmaW5hbERhdGFUeXBlICk7CgkJfQoJCXJldHVybiByZXNwb25zZXNbIGZpbmFsRGF0YVR5cGUgXTsKCX0KfQoKLy8gQ2hhaW4gY29udmVyc2lvbnMgZ2l2ZW4gdGhlIHJlcXVlc3QgYW5kIHRoZSBvcmlnaW5hbCByZXNwb25zZQpmdW5jdGlvbiBhamF4Q29udmVydCggcywgcmVzcG9uc2UgKSB7CgoJLy8gQXBwbHkgdGhlIGRhdGFGaWx0ZXIgaWYgcHJvdmlkZWQKCWlmICggcy5kYXRhRmlsdGVyICkgewoJCXJlc3BvbnNlID0gcy5kYXRhRmlsdGVyKCByZXNwb25zZSwgcy5kYXRhVHlwZSApOwoJfQoKCXZhciBkYXRhVHlwZXMgPSBzLmRhdGFUeXBlcywKCQljb252ZXJ0ZXJzID0ge30sCgkJaSwKCQlrZXksCgkJbGVuZ3RoID0gZGF0YVR5cGVzLmxlbmd0aCwKCQl0bXAsCgkJLy8gQ3VycmVudCBhbmQgcHJldmlvdXMgZGF0YVR5cGVzCgkJY3VycmVudCA9IGRhdGFUeXBlc1sgMCBdLAoJCXByZXYsCgkJLy8gQ29udmVyc2lvbiBleHByZXNzaW9uCgkJY29udmVyc2lvbiwKCQkvLyBDb252ZXJzaW9uIGZ1bmN0aW9uCgkJY29udiwKCQkvLyBDb252ZXJzaW9uIGZ1bmN0aW9ucyAodHJhbnNpdGl2ZSBjb252ZXJzaW9uKQoJCWNvbnYxLAoJCWNvbnYyOwoKCS8vIEZvciBlYWNoIGRhdGFUeXBlIGluIHRoZSBjaGFpbgoJZm9yKCBpID0gMTsgaSA8IGxlbmd0aDsgaSsrICkgewoKCQkvLyBDcmVhdGUgY29udmVydGVycyBtYXAKCQkvLyB3aXRoIGxvd2VyY2FzZWQga2V5cwoJCWlmICggaSA9PT0gMSApIHsKCQkJZm9yKCBrZXkgaW4gcy5jb252ZXJ0ZXJzICkgewoJCQkJaWYoIHR5cGVvZiBrZXkgPT09ICJzdHJpbmciICkgewoJCQkJCWNvbnZlcnRlcnNbIGtleS50b0xvd2VyQ2FzZSgpIF0gPSBzLmNvbnZlcnRlcnNbIGtleSBdOwoJCQkJfQoJCQl9CgkJfQoKCQkvLyBHZXQgdGhlIGRhdGFUeXBlcwoJCXByZXYgPSBjdXJyZW50OwoJCWN1cnJlbnQgPSBkYXRhVHlwZXNbIGkgXTsKCgkJLy8gSWYgY3VycmVudCBpcyBhdXRvIGRhdGFUeXBlLCB1cGRhdGUgaXQgdG8gcHJldgoJCWlmKCBjdXJyZW50ID09PSAiKiIgKSB7CgkJCWN1cnJlbnQgPSBwcmV2OwoJCS8vIElmIG5vIGF1dG8gYW5kIGRhdGFUeXBlcyBhcmUgYWN0dWFsbHkgZGlmZmVyZW50CgkJfSBlbHNlIGlmICggcHJldiAhPT0gIioiICYmIHByZXYgIT09IGN1cnJlbnQgKSB7CgoJCQkvLyBHZXQgdGhlIGNvbnZlcnRlcgoJCQljb252ZXJzaW9uID0gcHJldiArICIgIiArIGN1cnJlbnQ7CgkJCWNvbnYgPSBjb252ZXJ0ZXJzWyBjb252ZXJzaW9uIF0gfHwgY29udmVydGVyc1sgIiogIiArIGN1cnJlbnQgXTsKCgkJCS8vIElmIHRoZXJlIGlzIG5vIGRpcmVjdCBjb252ZXJ0ZXIsIHNlYXJjaCB0cmFuc2l0aXZlbHkKCQkJaWYgKCAhY29udiApIHsKCQkJCWNvbnYyID0gdW5kZWZpbmVkOwoJCQkJZm9yKCBjb252MSBpbiBjb252ZXJ0ZXJzICkgewoJCQkJCXRtcCA9IGNvbnYxLnNwbGl0KCAiICIgKTsKCQkJCQlpZiAoIHRtcFsgMCBdID09PSBwcmV2IHx8IHRtcFsgMCBdID09PSAiKiIgKSB7CgkJCQkJCWNvbnYyID0gY29udmVydGVyc1sgdG1wWzFdICsgIiAiICsgY3VycmVudCBdOwoJCQkJCQlpZiAoIGNvbnYyICkgewoJCQkJCQkJY29udjEgPSBjb252ZXJ0ZXJzWyBjb252MSBdOwoJCQkJCQkJaWYgKCBjb252MSA9PT0gdHJ1ZSApIHsKCQkJCQkJCQljb252ID0gY29udjI7CgkJCQkJCQl9IGVsc2UgaWYgKCBjb252MiA9PT0gdHJ1ZSApIHsKCQkJCQkJCQljb252ID0gY29udjE7CgkJCQkJCQl9CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoJCQkvLyBJZiB3ZSBmb3VuZCBubyBjb252ZXJ0ZXIsIGRpc3BhdGNoIGFuIGVycm9yCgkJCWlmICggISggY29udiB8fCBjb252MiApICkgewoJCQkJalF1ZXJ5LmVycm9yKCAiTm8gY29udmVyc2lvbiBmcm9tICIgKyBjb252ZXJzaW9uLnJlcGxhY2UoIiAiLCIgdG8gIikgKTsKCQkJfQoJCQkvLyBJZiBmb3VuZCBjb252ZXJ0ZXIgaXMgbm90IGFuIGVxdWl2YWxlbmNlCgkJCWlmICggY29udiAhPT0gdHJ1ZSApIHsKCQkJCS8vIENvbnZlcnQgd2l0aCAxIG9yIDIgY29udmVydGVycyBhY2NvcmRpbmdseQoJCQkJcmVzcG9uc2UgPSBjb252ID8gY29udiggcmVzcG9uc2UgKSA6IGNvbnYyKCBjb252MShyZXNwb25zZSkgKTsKCQkJfQoJCX0KCX0KCXJldHVybiByZXNwb25zZTsKfQoKCgoKdmFyIGpzYyA9IGpRdWVyeS5ub3coKSwKCWpzcmUgPSAvKFw9KVw/KCZ8JCl8XD9cPy9pOwoKLy8gRGVmYXVsdCBqc29ucCBzZXR0aW5ncwpqUXVlcnkuYWpheFNldHVwKHsKCWpzb25wOiAiY2FsbGJhY2siLAoJanNvbnBDYWxsYmFjazogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIGpRdWVyeS5leHBhbmRvICsgIl8iICsgKCBqc2MrKyApOwoJfQp9KTsKCi8vIERldGVjdCwgbm9ybWFsaXplIG9wdGlvbnMgYW5kIGluc3RhbGwgY2FsbGJhY2tzIGZvciBqc29ucCByZXF1ZXN0cwpqUXVlcnkuYWpheFByZWZpbHRlciggImpzb24ganNvbnAiLCBmdW5jdGlvbiggcywgb3JpZ2luYWxTZXR0aW5ncywganFYSFIgKSB7CgoJdmFyIGluc3BlY3REYXRhID0gcy5jb250ZW50VHlwZSA9PT0gImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIgJiYKCQkoIHR5cGVvZiBzLmRhdGEgPT09ICJzdHJpbmciICk7CgoJaWYgKCBzLmRhdGFUeXBlc1sgMCBdID09PSAianNvbnAiIHx8CgkJcy5qc29ucCAhPT0gZmFsc2UgJiYgKCBqc3JlLnRlc3QoIHMudXJsICkgfHwKCQkJCWluc3BlY3REYXRhICYmIGpzcmUudGVzdCggcy5kYXRhICkgKSApIHsKCgkJdmFyIHJlc3BvbnNlQ29udGFpbmVyLAoJCQlqc29ucENhbGxiYWNrID0gcy5qc29ucENhbGxiYWNrID0KCQkJCWpRdWVyeS5pc0Z1bmN0aW9uKCBzLmpzb25wQ2FsbGJhY2sgKSA/IHMuanNvbnBDYWxsYmFjaygpIDogcy5qc29ucENhbGxiYWNrLAoJCQlwcmV2aW91cyA9IHdpbmRvd1sganNvbnBDYWxsYmFjayBdLAoJCQl1cmwgPSBzLnVybCwKCQkJZGF0YSA9IHMuZGF0YSwKCQkJcmVwbGFjZSA9ICIkMSIgKyBqc29ucENhbGxiYWNrICsgIiQyIjsKCgkJaWYgKCBzLmpzb25wICE9PSBmYWxzZSApIHsKCQkJdXJsID0gdXJsLnJlcGxhY2UoIGpzcmUsIHJlcGxhY2UgKTsKCQkJaWYgKCBzLnVybCA9PT0gdXJsICkgewoJCQkJaWYgKCBpbnNwZWN0RGF0YSApIHsKCQkJCQlkYXRhID0gZGF0YS5yZXBsYWNlKCBqc3JlLCByZXBsYWNlICk7CgkJCQl9CgkJCQlpZiAoIHMuZGF0YSA9PT0gZGF0YSApIHsKCQkJCQkvLyBBZGQgY2FsbGJhY2sgbWFudWFsbHkKCQkJCQl1cmwgKz0gKC9cPy8udGVzdCggdXJsICkgPyAiJiIgOiAiPyIpICsgcy5qc29ucCArICI9IiArIGpzb25wQ2FsbGJhY2s7CgkJCQl9CgkJCX0KCQl9CgoJCXMudXJsID0gdXJsOwoJCXMuZGF0YSA9IGRhdGE7CgoJCS8vIEluc3RhbGwgY2FsbGJhY2sKCQl3aW5kb3dbIGpzb25wQ2FsbGJhY2sgXSA9IGZ1bmN0aW9uKCByZXNwb25zZSApIHsKCQkJcmVzcG9uc2VDb250YWluZXIgPSBbIHJlc3BvbnNlIF07CgkJfTsKCgkJLy8gQ2xlYW4tdXAgZnVuY3Rpb24KCQlqcVhIUi5hbHdheXMoZnVuY3Rpb24oKSB7CgkJCS8vIFNldCBjYWxsYmFjayBiYWNrIHRvIHByZXZpb3VzIHZhbHVlCgkJCXdpbmRvd1sganNvbnBDYWxsYmFjayBdID0gcHJldmlvdXM7CgkJCS8vIENhbGwgaWYgaXQgd2FzIGEgZnVuY3Rpb24gYW5kIHdlIGhhdmUgYSByZXNwb25zZQoJCQlpZiAoIHJlc3BvbnNlQ29udGFpbmVyICYmIGpRdWVyeS5pc0Z1bmN0aW9uKCBwcmV2aW91cyApICkgewoJCQkJd2luZG93WyBqc29ucENhbGxiYWNrIF0oIHJlc3BvbnNlQ29udGFpbmVyWyAwIF0gKTsKCQkJfQoJCX0pOwoKCQkvLyBVc2UgZGF0YSBjb252ZXJ0ZXIgdG8gcmV0cmlldmUganNvbiBhZnRlciBzY3JpcHQgZXhlY3V0aW9uCgkJcy5jb252ZXJ0ZXJzWyJzY3JpcHQganNvbiJdID0gZnVuY3Rpb24oKSB7CgkJCWlmICggIXJlc3BvbnNlQ29udGFpbmVyICkgewoJCQkJalF1ZXJ5LmVycm9yKCBqc29ucENhbGxiYWNrICsgIiB3YXMgbm90IGNhbGxlZCIgKTsKCQkJfQoJCQlyZXR1cm4gcmVzcG9uc2VDb250YWluZXJbIDAgXTsKCQl9OwoKCQkvLyBmb3JjZSBqc29uIGRhdGFUeXBlCgkJcy5kYXRhVHlwZXNbIDAgXSA9ICJqc29uIjsKCgkJLy8gRGVsZWdhdGUgdG8gc2NyaXB0CgkJcmV0dXJuICJzY3JpcHQiOwoJfQp9KTsKCgoKCi8vIEluc3RhbGwgc2NyaXB0IGRhdGFUeXBlCmpRdWVyeS5hamF4U2V0dXAoewoJYWNjZXB0czogewoJCXNjcmlwdDogInRleHQvamF2YXNjcmlwdCwgYXBwbGljYXRpb24vamF2YXNjcmlwdCwgYXBwbGljYXRpb24vZWNtYXNjcmlwdCwgYXBwbGljYXRpb24veC1lY21hc2NyaXB0IgoJfSwKCWNvbnRlbnRzOiB7CgkJc2NyaXB0OiAvamF2YXNjcmlwdHxlY21hc2NyaXB0LwoJfSwKCWNvbnZlcnRlcnM6IHsKCQkidGV4dCBzY3JpcHQiOiBmdW5jdGlvbiggdGV4dCApIHsKCQkJalF1ZXJ5Lmdsb2JhbEV2YWwoIHRleHQgKTsKCQkJcmV0dXJuIHRleHQ7CgkJfQoJfQp9KTsKCi8vIEhhbmRsZSBjYWNoZSdzIHNwZWNpYWwgY2FzZSBhbmQgZ2xvYmFsCmpRdWVyeS5hamF4UHJlZmlsdGVyKCAic2NyaXB0IiwgZnVuY3Rpb24oIHMgKSB7CglpZiAoIHMuY2FjaGUgPT09IHVuZGVmaW5lZCApIHsKCQlzLmNhY2hlID0gZmFsc2U7Cgl9CglpZiAoIHMuY3Jvc3NEb21haW4gKSB7CgkJcy50eXBlID0gIkdFVCI7CgkJcy5nbG9iYWwgPSBmYWxzZTsKCX0KfSk7CgovLyBCaW5kIHNjcmlwdCB0YWcgaGFjayB0cmFuc3BvcnQKalF1ZXJ5LmFqYXhUcmFuc3BvcnQoICJzY3JpcHQiLCBmdW5jdGlvbihzKSB7CgoJLy8gVGhpcyB0cmFuc3BvcnQgb25seSBkZWFscyB3aXRoIGNyb3NzIGRvbWFpbiByZXF1ZXN0cwoJaWYgKCBzLmNyb3NzRG9tYWluICkgewoKCQl2YXIgc2NyaXB0LAoJCQloZWFkID0gZG9jdW1lbnQuaGVhZCB8fCBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSggImhlYWQiIClbMF0gfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50OwoKCQlyZXR1cm4gewoKCQkJc2VuZDogZnVuY3Rpb24oIF8sIGNhbGxiYWNrICkgewoKCQkJCXNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJzY3JpcHQiICk7CgoJCQkJc2NyaXB0LmFzeW5jID0gImFzeW5jIjsKCgkJCQlpZiAoIHMuc2NyaXB0Q2hhcnNldCApIHsKCQkJCQlzY3JpcHQuY2hhcnNldCA9IHMuc2NyaXB0Q2hhcnNldDsKCQkJCX0KCgkJCQlzY3JpcHQuc3JjID0gcy51cmw7CgoJCQkJLy8gQXR0YWNoIGhhbmRsZXJzIGZvciBhbGwgYnJvd3NlcnMKCQkJCXNjcmlwdC5vbmxvYWQgPSBzY3JpcHQub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oIF8sIGlzQWJvcnQgKSB7CgoJCQkJCWlmICggaXNBYm9ydCB8fCAhc2NyaXB0LnJlYWR5U3RhdGUgfHwgL2xvYWRlZHxjb21wbGV0ZS8udGVzdCggc2NyaXB0LnJlYWR5U3RhdGUgKSApIHsKCgkJCQkJCS8vIEhhbmRsZSBtZW1vcnkgbGVhayBpbiBJRQoJCQkJCQlzY3JpcHQub25sb2FkID0gc2NyaXB0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGw7CgoJCQkJCQkvLyBSZW1vdmUgdGhlIHNjcmlwdAoJCQkJCQlpZiAoIGhlYWQgJiYgc2NyaXB0LnBhcmVudE5vZGUgKSB7CgkJCQkJCQloZWFkLnJlbW92ZUNoaWxkKCBzY3JpcHQgKTsKCQkJCQkJfQoKCQkJCQkJLy8gRGVyZWZlcmVuY2UgdGhlIHNjcmlwdAoJCQkJCQlzY3JpcHQgPSB1bmRlZmluZWQ7CgoJCQkJCQkvLyBDYWxsYmFjayBpZiBub3QgYWJvcnQKCQkJCQkJaWYgKCAhaXNBYm9ydCApIHsKCQkJCQkJCWNhbGxiYWNrKCAyMDAsICJzdWNjZXNzIiApOwoJCQkJCQl9CgkJCQkJfQoJCQkJfTsKCQkJCS8vIFVzZSBpbnNlcnRCZWZvcmUgaW5zdGVhZCBvZiBhcHBlbmRDaGlsZCAgdG8gY2lyY3VtdmVudCBhbiBJRTYgYnVnLgoJCQkJLy8gVGhpcyBhcmlzZXMgd2hlbiBhIGJhc2Ugbm9kZSBpcyB1c2VkICgjMjcwOSBhbmQgIzQzNzgpLgoJCQkJaGVhZC5pbnNlcnRCZWZvcmUoIHNjcmlwdCwgaGVhZC5maXJzdENoaWxkICk7CgkJCX0sCgoJCQlhYm9ydDogZnVuY3Rpb24oKSB7CgkJCQlpZiAoIHNjcmlwdCApIHsKCQkJCQlzY3JpcHQub25sb2FkKCAwLCAxICk7CgkJCQl9CgkJCX0KCQl9OwoJfQp9KTsKCgoKCnZhciAvLyAjNTI4MDogSW50ZXJuZXQgRXhwbG9yZXIgd2lsbCBrZWVwIGNvbm5lY3Rpb25zIGFsaXZlIGlmIHdlIGRvbid0IGFib3J0IG9uIHVubG9hZAoJeGhyT25VbmxvYWRBYm9ydCA9IHdpbmRvdy5BY3RpdmVYT2JqZWN0ID8gZnVuY3Rpb24oKSB7CgkJLy8gQWJvcnQgYWxsIHBlbmRpbmcgcmVxdWVzdHMKCQlmb3IgKCB2YXIga2V5IGluIHhockNhbGxiYWNrcyApIHsKCQkJeGhyQ2FsbGJhY2tzWyBrZXkgXSggMCwgMSApOwoJCX0KCX0gOiBmYWxzZSwKCXhocklkID0gMCwKCXhockNhbGxiYWNrczsKCi8vIEZ1bmN0aW9ucyB0byBjcmVhdGUgeGhycwpmdW5jdGlvbiBjcmVhdGVTdGFuZGFyZFhIUigpIHsKCXRyeSB7CgkJcmV0dXJuIG5ldyB3aW5kb3cuWE1MSHR0cFJlcXVlc3QoKTsKCX0gY2F0Y2goIGUgKSB7fQp9CgpmdW5jdGlvbiBjcmVhdGVBY3RpdmVYSFIoKSB7Cgl0cnkgewoJCXJldHVybiBuZXcgd2luZG93LkFjdGl2ZVhPYmplY3QoICJNaWNyb3NvZnQuWE1MSFRUUCIgKTsKCX0gY2F0Y2goIGUgKSB7fQp9CgovLyBDcmVhdGUgdGhlIHJlcXVlc3Qgb2JqZWN0Ci8vIChUaGlzIGlzIHN0aWxsIGF0dGFjaGVkIHRvIGFqYXhTZXR0aW5ncyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSkKalF1ZXJ5LmFqYXhTZXR0aW5ncy54aHIgPSB3aW5kb3cuQWN0aXZlWE9iamVjdCA/CgkvKiBNaWNyb3NvZnQgZmFpbGVkIHRvIHByb3Blcmx5CgkgKiBpbXBsZW1lbnQgdGhlIFhNTEh0dHBSZXF1ZXN0IGluIElFNyAoY2FuJ3QgcmVxdWVzdCBsb2NhbCBmaWxlcyksCgkgKiBzbyB3ZSB1c2UgdGhlIEFjdGl2ZVhPYmplY3Qgd2hlbiBpdCBpcyBhdmFpbGFibGUKCSAqIEFkZGl0aW9uYWxseSBYTUxIdHRwUmVxdWVzdCBjYW4gYmUgZGlzYWJsZWQgaW4gSUU3L0lFOCBzbwoJICogd2UgbmVlZCBhIGZhbGxiYWNrLgoJICovCglmdW5jdGlvbigpIHsKCQlyZXR1cm4gIXRoaXMuaXNMb2NhbCAmJiBjcmVhdGVTdGFuZGFyZFhIUigpIHx8IGNyZWF0ZUFjdGl2ZVhIUigpOwoJfSA6CgkvLyBGb3IgYWxsIG90aGVyIGJyb3dzZXJzLCB1c2UgdGhlIHN0YW5kYXJkIFhNTEh0dHBSZXF1ZXN0IG9iamVjdAoJY3JlYXRlU3RhbmRhcmRYSFI7CgovLyBEZXRlcm1pbmUgc3VwcG9ydCBwcm9wZXJ0aWVzCihmdW5jdGlvbiggeGhyICkgewoJalF1ZXJ5LmV4dGVuZCggalF1ZXJ5LnN1cHBvcnQsIHsKCQlhamF4OiAhIXhociwKCQljb3JzOiAhIXhociAmJiAoICJ3aXRoQ3JlZGVudGlhbHMiIGluIHhociApCgl9KTsKfSkoIGpRdWVyeS5hamF4U2V0dGluZ3MueGhyKCkgKTsKCi8vIENyZWF0ZSB0cmFuc3BvcnQgaWYgdGhlIGJyb3dzZXIgY2FuIHByb3ZpZGUgYW4geGhyCmlmICggalF1ZXJ5LnN1cHBvcnQuYWpheCApIHsKCglqUXVlcnkuYWpheFRyYW5zcG9ydChmdW5jdGlvbiggcyApIHsKCQkvLyBDcm9zcyBkb21haW4gb25seSBhbGxvd2VkIGlmIHN1cHBvcnRlZCB0aHJvdWdoIFhNTEh0dHBSZXF1ZXN0CgkJaWYgKCAhcy5jcm9zc0RvbWFpbiB8fCBqUXVlcnkuc3VwcG9ydC5jb3JzICkgewoKCQkJdmFyIGNhbGxiYWNrOwoKCQkJcmV0dXJuIHsKCQkJCXNlbmQ6IGZ1bmN0aW9uKCBoZWFkZXJzLCBjb21wbGV0ZSApIHsKCgkJCQkJLy8gR2V0IGEgbmV3IHhocgoJCQkJCXZhciB4aHIgPSBzLnhocigpLAoJCQkJCQloYW5kbGUsCgkJCQkJCWk7CgoJCQkJCS8vIE9wZW4gdGhlIHNvY2tldAoJCQkJCS8vIFBhc3NpbmcgbnVsbCB1c2VybmFtZSwgZ2VuZXJhdGVzIGEgbG9naW4gcG9wdXAgb24gT3BlcmEgKCMyODY1KQoJCQkJCWlmICggcy51c2VybmFtZSApIHsKCQkJCQkJeGhyLm9wZW4oIHMudHlwZSwgcy51cmwsIHMuYXN5bmMsIHMudXNlcm5hbWUsIHMucGFzc3dvcmQgKTsKCQkJCQl9IGVsc2UgewoJCQkJCQl4aHIub3Blbiggcy50eXBlLCBzLnVybCwgcy5hc3luYyApOwoJCQkJCX0KCgkJCQkJLy8gQXBwbHkgY3VzdG9tIGZpZWxkcyBpZiBwcm92aWRlZAoJCQkJCWlmICggcy54aHJGaWVsZHMgKSB7CgkJCQkJCWZvciAoIGkgaW4gcy54aHJGaWVsZHMgKSB7CgkJCQkJCQl4aHJbIGkgXSA9IHMueGhyRmllbGRzWyBpIF07CgkJCQkJCX0KCQkJCQl9CgoJCQkJCS8vIE92ZXJyaWRlIG1pbWUgdHlwZSBpZiBuZWVkZWQKCQkJCQlpZiAoIHMubWltZVR5cGUgJiYgeGhyLm92ZXJyaWRlTWltZVR5cGUgKSB7CgkJCQkJCXhoci5vdmVycmlkZU1pbWVUeXBlKCBzLm1pbWVUeXBlICk7CgkJCQkJfQoKCQkJCQkvLyBYLVJlcXVlc3RlZC1XaXRoIGhlYWRlcgoJCQkJCS8vIEZvciBjcm9zcy1kb21haW4gcmVxdWVzdHMsIHNlZWluZyBhcyBjb25kaXRpb25zIGZvciBhIHByZWZsaWdodCBhcmUKCQkJCQkvLyBha2luIHRvIGEgamlnc2F3IHB1enpsZSwgd2Ugc2ltcGx5IG5ldmVyIHNldCBpdCB0byBiZSBzdXJlLgoJCQkJCS8vIChpdCBjYW4gYWx3YXlzIGJlIHNldCBvbiBhIHBlci1yZXF1ZXN0IGJhc2lzIG9yIGV2ZW4gdXNpbmcgYWpheFNldHVwKQoJCQkJCS8vIEZvciBzYW1lLWRvbWFpbiByZXF1ZXN0cywgd29uJ3QgY2hhbmdlIGhlYWRlciBpZiBhbHJlYWR5IHByb3ZpZGVkLgoJCQkJCWlmICggIXMuY3Jvc3NEb21haW4gJiYgIWhlYWRlcnNbIlgtUmVxdWVzdGVkLVdpdGgiXSApIHsKCQkJCQkJaGVhZGVyc1sgIlgtUmVxdWVzdGVkLVdpdGgiIF0gPSAiWE1MSHR0cFJlcXVlc3QiOwoJCQkJCX0KCgkJCQkJLy8gTmVlZCBhbiBleHRyYSB0cnkvY2F0Y2ggZm9yIGNyb3NzIGRvbWFpbiByZXF1ZXN0cyBpbiBGaXJlZm94IDMKCQkJCQl0cnkgewoJCQkJCQlmb3IgKCBpIGluIGhlYWRlcnMgKSB7CgkJCQkJCQl4aHIuc2V0UmVxdWVzdEhlYWRlciggaSwgaGVhZGVyc1sgaSBdICk7CgkJCQkJCX0KCQkJCQl9IGNhdGNoKCBfICkge30KCgkJCQkJLy8gRG8gc2VuZCB0aGUgcmVxdWVzdAoJCQkJCS8vIFRoaXMgbWF5IHJhaXNlIGFuIGV4Y2VwdGlvbiB3aGljaCBpcyBhY3R1YWxseQoJCQkJCS8vIGhhbmRsZWQgaW4galF1ZXJ5LmFqYXggKHNvIG5vIHRyeS9jYXRjaCBoZXJlKQoJCQkJCXhoci5zZW5kKCAoIHMuaGFzQ29udGVudCAmJiBzLmRhdGEgKSB8fCBudWxsICk7CgoJCQkJCS8vIExpc3RlbmVyCgkJCQkJY2FsbGJhY2sgPSBmdW5jdGlvbiggXywgaXNBYm9ydCApIHsKCgkJCQkJCXZhciBzdGF0dXMsCgkJCQkJCQlzdGF0dXNUZXh0LAoJCQkJCQkJcmVzcG9uc2VIZWFkZXJzLAoJCQkJCQkJcmVzcG9uc2VzLAoJCQkJCQkJeG1sOwoKCQkJCQkJLy8gRmlyZWZveCB0aHJvd3MgZXhjZXB0aW9ucyB3aGVuIGFjY2Vzc2luZyBwcm9wZXJ0aWVzCgkJCQkJCS8vIG9mIGFuIHhociB3aGVuIGEgbmV0d29yayBlcnJvciBvY2N1cmVkCgkJCQkJCS8vIGh0dHA6Ly9oZWxwZnVsLmtub2JzLWRpYWxzLmNvbS9pbmRleC5waHAvQ29tcG9uZW50X3JldHVybmVkX2ZhaWx1cmVfY29kZTpfMHg4MDA0MDExMV8oTlNfRVJST1JfTk9UX0FWQUlMQUJMRSkKCQkJCQkJdHJ5IHsKCgkJCQkJCQkvLyBXYXMgbmV2ZXIgY2FsbGVkIGFuZCBpcyBhYm9ydGVkIG9yIGNvbXBsZXRlCgkJCQkJCQlpZiAoIGNhbGxiYWNrICYmICggaXNBYm9ydCB8fCB4aHIucmVhZHlTdGF0ZSA9PT0gNCApICkgewoKCQkJCQkJCQkvLyBPbmx5IGNhbGxlZCBvbmNlCgkJCQkJCQkJY2FsbGJhY2sgPSB1bmRlZmluZWQ7CgoJCQkJCQkJCS8vIERvIG5vdCBrZWVwIGFzIGFjdGl2ZSBhbnltb3JlCgkJCQkJCQkJaWYgKCBoYW5kbGUgKSB7CgkJCQkJCQkJCXhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBqUXVlcnkubm9vcDsKCQkJCQkJCQkJaWYgKCB4aHJPblVubG9hZEFib3J0ICkgewoJCQkJCQkJCQkJZGVsZXRlIHhockNhbGxiYWNrc1sgaGFuZGxlIF07CgkJCQkJCQkJCX0KCQkJCQkJCQl9CgoJCQkJCQkJCS8vIElmIGl0J3MgYW4gYWJvcnQKCQkJCQkJCQlpZiAoIGlzQWJvcnQgKSB7CgkJCQkJCQkJCS8vIEFib3J0IGl0IG1hbnVhbGx5IGlmIG5lZWRlZAoJCQkJCQkJCQlpZiAoIHhoci5yZWFkeVN0YXRlICE9PSA0ICkgewoJCQkJCQkJCQkJeGhyLmFib3J0KCk7CgkJCQkJCQkJCX0KCQkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCQlzdGF0dXMgPSB4aHIuc3RhdHVzOwoJCQkJCQkJCQlyZXNwb25zZUhlYWRlcnMgPSB4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCk7CgkJCQkJCQkJCXJlc3BvbnNlcyA9IHt9OwoJCQkJCQkJCQl4bWwgPSB4aHIucmVzcG9uc2VYTUw7CgoJCQkJCQkJCQkvLyBDb25zdHJ1Y3QgcmVzcG9uc2UgbGlzdAoJCQkJCQkJCQlpZiAoIHhtbCAmJiB4bWwuZG9jdW1lbnRFbGVtZW50IC8qICM0OTU4ICovICkgewoJCQkJCQkJCQkJcmVzcG9uc2VzLnhtbCA9IHhtbDsKCQkJCQkJCQkJfQoJCQkJCQkJCQlyZXNwb25zZXMudGV4dCA9IHhoci5yZXNwb25zZVRleHQ7CgoJCQkJCQkJCQkvLyBGaXJlZm94IHRocm93cyBhbiBleGNlcHRpb24gd2hlbiBhY2Nlc3NpbmcKCQkJCQkJCQkJLy8gc3RhdHVzVGV4dCBmb3IgZmF1bHR5IGNyb3NzLWRvbWFpbiByZXF1ZXN0cwoJCQkJCQkJCQl0cnkgewoJCQkJCQkJCQkJc3RhdHVzVGV4dCA9IHhoci5zdGF0dXNUZXh0OwoJCQkJCQkJCQl9IGNhdGNoKCBlICkgewoJCQkJCQkJCQkJLy8gV2Ugbm9ybWFsaXplIHdpdGggV2Via2l0IGdpdmluZyBhbiBlbXB0eSBzdGF0dXNUZXh0CgkJCQkJCQkJCQlzdGF0dXNUZXh0ID0gIiI7CgkJCQkJCQkJCX0KCgkJCQkJCQkJCS8vIEZpbHRlciBzdGF0dXMgZm9yIG5vbiBzdGFuZGFyZCBiZWhhdmlvcnMKCgkJCQkJCQkJCS8vIElmIHRoZSByZXF1ZXN0IGlzIGxvY2FsIGFuZCB3ZSBoYXZlIGRhdGE6IGFzc3VtZSBhIHN1Y2Nlc3MKCQkJCQkJCQkJLy8gKHN1Y2Nlc3Mgd2l0aCBubyBkYXRhIHdvbid0IGdldCBub3RpZmllZCwgdGhhdCdzIHRoZSBiZXN0IHdlCgkJCQkJCQkJCS8vIGNhbiBkbyBnaXZlbiBjdXJyZW50IGltcGxlbWVudGF0aW9ucykKCQkJCQkJCQkJaWYgKCAhc3RhdHVzICYmIHMuaXNMb2NhbCAmJiAhcy5jcm9zc0RvbWFpbiApIHsKCQkJCQkJCQkJCXN0YXR1cyA9IHJlc3BvbnNlcy50ZXh0ID8gMjAwIDogNDA0OwoJCQkJCQkJCQkvLyBJRSAtICMxNDUwOiBzb21ldGltZXMgcmV0dXJucyAxMjIzIHdoZW4gaXQgc2hvdWxkIGJlIDIwNAoJCQkJCQkJCQl9IGVsc2UgaWYgKCBzdGF0dXMgPT09IDEyMjMgKSB7CgkJCQkJCQkJCQlzdGF0dXMgPSAyMDQ7CgkJCQkJCQkJCX0KCQkJCQkJCQl9CgkJCQkJCQl9CgkJCQkJCX0gY2F0Y2goIGZpcmVmb3hBY2Nlc3NFeGNlcHRpb24gKSB7CgkJCQkJCQlpZiAoICFpc0Fib3J0ICkgewoJCQkJCQkJCWNvbXBsZXRlKCAtMSwgZmlyZWZveEFjY2Vzc0V4Y2VwdGlvbiApOwoJCQkJCQkJfQoJCQkJCQl9CgoJCQkJCQkvLyBDYWxsIGNvbXBsZXRlIGlmIG5lZWRlZAoJCQkJCQlpZiAoIHJlc3BvbnNlcyApIHsKCQkJCQkJCWNvbXBsZXRlKCBzdGF0dXMsIHN0YXR1c1RleHQsIHJlc3BvbnNlcywgcmVzcG9uc2VIZWFkZXJzICk7CgkJCQkJCX0KCQkJCQl9OwoKCQkJCQkvLyBpZiB3ZSdyZSBpbiBzeW5jIG1vZGUgb3IgaXQncyBpbiBjYWNoZQoJCQkJCS8vIGFuZCBoYXMgYmVlbiByZXRyaWV2ZWQgZGlyZWN0bHkgKElFNiAmIElFNykKCQkJCQkvLyB3ZSBuZWVkIHRvIG1hbnVhbGx5IGZpcmUgdGhlIGNhbGxiYWNrCgkJCQkJaWYgKCAhcy5hc3luYyB8fCB4aHIucmVhZHlTdGF0ZSA9PT0gNCApIHsKCQkJCQkJY2FsbGJhY2soKTsKCQkJCQl9IGVsc2UgewoJCQkJCQloYW5kbGUgPSArK3hocklkOwoJCQkJCQlpZiAoIHhock9uVW5sb2FkQWJvcnQgKSB7CgkJCQkJCQkvLyBDcmVhdGUgdGhlIGFjdGl2ZSB4aHJzIGNhbGxiYWNrcyBsaXN0IGlmIG5lZWRlZAoJCQkJCQkJLy8gYW5kIGF0dGFjaCB0aGUgdW5sb2FkIGhhbmRsZXIKCQkJCQkJCWlmICggIXhockNhbGxiYWNrcyApIHsKCQkJCQkJCQl4aHJDYWxsYmFja3MgPSB7fTsKCQkJCQkJCQlqUXVlcnkoIHdpbmRvdyApLnVubG9hZCggeGhyT25VbmxvYWRBYm9ydCApOwoJCQkJCQkJfQoJCQkJCQkJLy8gQWRkIHRvIGxpc3Qgb2YgYWN0aXZlIHhocnMgY2FsbGJhY2tzCgkJCQkJCQl4aHJDYWxsYmFja3NbIGhhbmRsZSBdID0gY2FsbGJhY2s7CgkJCQkJCX0KCQkJCQkJeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGNhbGxiYWNrOwoJCQkJCX0KCQkJCX0sCgoJCQkJYWJvcnQ6IGZ1bmN0aW9uKCkgewoJCQkJCWlmICggY2FsbGJhY2sgKSB7CgkJCQkJCWNhbGxiYWNrKDAsMSk7CgkJCQkJfQoJCQkJfQoJCQl9OwoJCX0KCX0pOwp9CgoKCgp2YXIgZWxlbWRpc3BsYXkgPSB7fSwKCWlmcmFtZSwgaWZyYW1lRG9jLAoJcmZ4dHlwZXMgPSAvXig/OnRvZ2dsZXxzaG93fGhpZGUpJC8sCglyZnhudW0gPSAvXihbK1wtXT0pPyhbXGQrLlwtXSspKFthLXolXSopJC9pLAoJdGltZXJJZCwKCWZ4QXR0cnMgPSBbCgkJLy8gaGVpZ2h0IGFuaW1hdGlvbnMKCQlbICJoZWlnaHQiLCAibWFyZ2luVG9wIiwgIm1hcmdpbkJvdHRvbSIsICJwYWRkaW5nVG9wIiwgInBhZGRpbmdCb3R0b20iIF0sCgkJLy8gd2lkdGggYW5pbWF0aW9ucwoJCVsgIndpZHRoIiwgIm1hcmdpbkxlZnQiLCAibWFyZ2luUmlnaHQiLCAicGFkZGluZ0xlZnQiLCAicGFkZGluZ1JpZ2h0IiBdLAoJCS8vIG9wYWNpdHkgYW5pbWF0aW9ucwoJCVsgIm9wYWNpdHkiIF0KCV0sCglmeE5vdzsKCmpRdWVyeS5mbi5leHRlbmQoewoJc2hvdzogZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkgewoJCXZhciBlbGVtLCBkaXNwbGF5OwoKCQlpZiAoIHNwZWVkIHx8IHNwZWVkID09PSAwICkgewoJCQlyZXR1cm4gdGhpcy5hbmltYXRlKCBnZW5GeCgic2hvdyIsIDMpLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayk7CgoJCX0gZWxzZSB7CgkJCWZvciAoIHZhciBpID0gMCwgaiA9IHRoaXMubGVuZ3RoOyBpIDwgajsgaSsrICkgewoJCQkJZWxlbSA9IHRoaXNbaV07CgoJCQkJaWYgKCBlbGVtLnN0eWxlICkgewoJCQkJCWRpc3BsYXkgPSBlbGVtLnN0eWxlLmRpc3BsYXk7CgoJCQkJCS8vIFJlc2V0IHRoZSBpbmxpbmUgZGlzcGxheSBvZiB0aGlzIGVsZW1lbnQgdG8gbGVhcm4gaWYgaXQgaXMKCQkJCQkvLyBiZWluZyBoaWRkZW4gYnkgY2FzY2FkZWQgcnVsZXMgb3Igbm90CgkJCQkJaWYgKCAhalF1ZXJ5Ll9kYXRhKGVsZW0sICJvbGRkaXNwbGF5IikgJiYgZGlzcGxheSA9PT0gIm5vbmUiICkgewoJCQkJCQlkaXNwbGF5ID0gZWxlbS5zdHlsZS5kaXNwbGF5ID0gIiI7CgkJCQkJfQoKCQkJCQkvLyBTZXQgZWxlbWVudHMgd2hpY2ggaGF2ZSBiZWVuIG92ZXJyaWRkZW4gd2l0aCBkaXNwbGF5OiBub25lCgkJCQkJLy8gaW4gYSBzdHlsZXNoZWV0IHRvIHdoYXRldmVyIHRoZSBkZWZhdWx0IGJyb3dzZXIgc3R5bGUgaXMKCQkJCQkvLyBmb3Igc3VjaCBhbiBlbGVtZW50CgkJCQkJaWYgKCBkaXNwbGF5ID09PSAiIiAmJiBqUXVlcnkuY3NzKCBlbGVtLCAiZGlzcGxheSIgKSA9PT0gIm5vbmUiICkgewoJCQkJCQlqUXVlcnkuX2RhdGEoZWxlbSwgIm9sZGRpc3BsYXkiLCBkZWZhdWx0RGlzcGxheShlbGVtLm5vZGVOYW1lKSk7CgkJCQkJfQoJCQkJfQoJCQl9CgoJCQkvLyBTZXQgdGhlIGRpc3BsYXkgb2YgbW9zdCBvZiB0aGUgZWxlbWVudHMgaW4gYSBzZWNvbmQgbG9vcAoJCQkvLyB0byBhdm9pZCB0aGUgY29uc3RhbnQgcmVmbG93CgkJCWZvciAoIGkgPSAwOyBpIDwgajsgaSsrICkgewoJCQkJZWxlbSA9IHRoaXNbaV07CgoJCQkJaWYgKCBlbGVtLnN0eWxlICkgewoJCQkJCWRpc3BsYXkgPSBlbGVtLnN0eWxlLmRpc3BsYXk7CgoJCQkJCWlmICggZGlzcGxheSA9PT0gIiIgfHwgZGlzcGxheSA9PT0gIm5vbmUiICkgewoJCQkJCQllbGVtLnN0eWxlLmRpc3BsYXkgPSBqUXVlcnkuX2RhdGEoZWxlbSwgIm9sZGRpc3BsYXkiKSB8fCAiIjsKCQkJCQl9CgkJCQl9CgkJCX0KCgkJCXJldHVybiB0aGlzOwoJCX0KCX0sCgoJaGlkZTogZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkgewoJCWlmICggc3BlZWQgfHwgc3BlZWQgPT09IDAgKSB7CgkJCXJldHVybiB0aGlzLmFuaW1hdGUoIGdlbkZ4KCJoaWRlIiwgMyksIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrKTsKCgkJfSBlbHNlIHsKCQkJZm9yICggdmFyIGkgPSAwLCBqID0gdGhpcy5sZW5ndGg7IGkgPCBqOyBpKysgKSB7CgkJCQlpZiAoIHRoaXNbaV0uc3R5bGUgKSB7CgkJCQkJdmFyIGRpc3BsYXkgPSBqUXVlcnkuY3NzKCB0aGlzW2ldLCAiZGlzcGxheSIgKTsKCgkJCQkJaWYgKCBkaXNwbGF5ICE9PSAibm9uZSIgJiYgIWpRdWVyeS5fZGF0YSggdGhpc1tpXSwgIm9sZGRpc3BsYXkiICkgKSB7CgkJCQkJCWpRdWVyeS5fZGF0YSggdGhpc1tpXSwgIm9sZGRpc3BsYXkiLCBkaXNwbGF5ICk7CgkJCQkJfQoJCQkJfQoJCQl9CgoJCQkvLyBTZXQgdGhlIGRpc3BsYXkgb2YgdGhlIGVsZW1lbnRzIGluIGEgc2Vjb25kIGxvb3AKCQkJLy8gdG8gYXZvaWQgdGhlIGNvbnN0YW50IHJlZmxvdwoJCQlmb3IgKCBpID0gMDsgaSA8IGo7IGkrKyApIHsKCQkJCWlmICggdGhpc1tpXS5zdHlsZSApIHsKCQkJCQl0aGlzW2ldLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CgkJCQl9CgkJCX0KCgkJCXJldHVybiB0aGlzOwoJCX0KCX0sCgoJLy8gU2F2ZSB0aGUgb2xkIHRvZ2dsZSBmdW5jdGlvbgoJX3RvZ2dsZTogalF1ZXJ5LmZuLnRvZ2dsZSwKCgl0b2dnbGU6IGZ1bmN0aW9uKCBmbiwgZm4yLCBjYWxsYmFjayApIHsKCQl2YXIgYm9vbCA9IHR5cGVvZiBmbiA9PT0gImJvb2xlYW4iOwoKCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKGZuKSAmJiBqUXVlcnkuaXNGdW5jdGlvbihmbjIpICkgewoJCQl0aGlzLl90b2dnbGUuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwoKCQl9IGVsc2UgaWYgKCBmbiA9PSBudWxsIHx8IGJvb2wgKSB7CgkJCXRoaXMuZWFjaChmdW5jdGlvbigpIHsKCQkJCXZhciBzdGF0ZSA9IGJvb2wgPyBmbiA6IGpRdWVyeSh0aGlzKS5pcygiOmhpZGRlbiIpOwoJCQkJalF1ZXJ5KHRoaXMpWyBzdGF0ZSA/ICJzaG93IiA6ICJoaWRlIiBdKCk7CgkJCX0pOwoKCQl9IGVsc2UgewoJCQl0aGlzLmFuaW1hdGUoZ2VuRngoInRvZ2dsZSIsIDMpLCBmbiwgZm4yLCBjYWxsYmFjayk7CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCgoJZmFkZVRvOiBmdW5jdGlvbiggc3BlZWQsIHRvLCBlYXNpbmcsIGNhbGxiYWNrICkgewoJCXJldHVybiB0aGlzLmZpbHRlcigiOmhpZGRlbiIpLmNzcygib3BhY2l0eSIsIDApLnNob3coKS5lbmQoKQoJCQkJCS5hbmltYXRlKHtvcGFjaXR5OiB0b30sIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrKTsKCX0sCgoJYW5pbWF0ZTogZnVuY3Rpb24oIHByb3AsIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkgewoJCXZhciBvcHRhbGwgPSBqUXVlcnkuc3BlZWQoc3BlZWQsIGVhc2luZywgY2FsbGJhY2spOwoKCQlpZiAoIGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBwcm9wICkgKSB7CgkJCXJldHVybiB0aGlzLmVhY2goIG9wdGFsbC5jb21wbGV0ZSwgWyBmYWxzZSBdICk7CgkJfQoKCQkvLyBEbyBub3QgY2hhbmdlIHJlZmVyZW5jZWQgcHJvcGVydGllcyBhcyBwZXItcHJvcGVydHkgZWFzaW5nIHdpbGwgYmUgbG9zdAoJCXByb3AgPSBqUXVlcnkuZXh0ZW5kKCB7fSwgcHJvcCApOwoKCQlyZXR1cm4gdGhpc1sgb3B0YWxsLnF1ZXVlID09PSBmYWxzZSA/ICJlYWNoIiA6ICJxdWV1ZSIgXShmdW5jdGlvbigpIHsKCQkJLy8gWFhYICd0aGlzJyBkb2VzIG5vdCBhbHdheXMgaGF2ZSBhIG5vZGVOYW1lIHdoZW4gcnVubmluZyB0aGUKCQkJLy8gdGVzdCBzdWl0ZQoKCQkJaWYgKCBvcHRhbGwucXVldWUgPT09IGZhbHNlICkgewoJCQkJalF1ZXJ5Ll9tYXJrKCB0aGlzICk7CgkJCX0KCgkJCXZhciBvcHQgPSBqUXVlcnkuZXh0ZW5kKCB7fSwgb3B0YWxsICksCgkJCQlpc0VsZW1lbnQgPSB0aGlzLm5vZGVUeXBlID09PSAxLAoJCQkJaGlkZGVuID0gaXNFbGVtZW50ICYmIGpRdWVyeSh0aGlzKS5pcygiOmhpZGRlbiIpLAoJCQkJbmFtZSwgdmFsLCBwLAoJCQkJZGlzcGxheSwgZSwKCQkJCXBhcnRzLCBzdGFydCwgZW5kLCB1bml0OwoKCQkJLy8gd2lsbCBzdG9yZSBwZXIgcHJvcGVydHkgZWFzaW5nIGFuZCBiZSB1c2VkIHRvIGRldGVybWluZSB3aGVuIGFuIGFuaW1hdGlvbiBpcyBjb21wbGV0ZQoJCQlvcHQuYW5pbWF0ZWRQcm9wZXJ0aWVzID0ge307CgoJCQlmb3IgKCBwIGluIHByb3AgKSB7CgoJCQkJLy8gcHJvcGVydHkgbmFtZSBub3JtYWxpemF0aW9uCgkJCQluYW1lID0galF1ZXJ5LmNhbWVsQ2FzZSggcCApOwoJCQkJaWYgKCBwICE9PSBuYW1lICkgewoJCQkJCXByb3BbIG5hbWUgXSA9IHByb3BbIHAgXTsKCQkJCQlkZWxldGUgcHJvcFsgcCBdOwoJCQkJfQoKCQkJCXZhbCA9IHByb3BbIG5hbWUgXTsKCgkJCQkvLyBlYXNpbmcgcmVzb2x1dGlvbjogcGVyIHByb3BlcnR5ID4gb3B0LnNwZWNpYWxFYXNpbmcgPiBvcHQuZWFzaW5nID4gJ3N3aW5nJyAoZGVmYXVsdCkKCQkJCWlmICggalF1ZXJ5LmlzQXJyYXkoIHZhbCApICkgewoJCQkJCW9wdC5hbmltYXRlZFByb3BlcnRpZXNbIG5hbWUgXSA9IHZhbFsgMSBdOwoJCQkJCXZhbCA9IHByb3BbIG5hbWUgXSA9IHZhbFsgMCBdOwoJCQkJfSBlbHNlIHsKCQkJCQlvcHQuYW5pbWF0ZWRQcm9wZXJ0aWVzWyBuYW1lIF0gPSBvcHQuc3BlY2lhbEVhc2luZyAmJiBvcHQuc3BlY2lhbEVhc2luZ1sgbmFtZSBdIHx8IG9wdC5lYXNpbmcgfHwgJ3N3aW5nJzsKCQkJCX0KCgkJCQlpZiAoIHZhbCA9PT0gImhpZGUiICYmIGhpZGRlbiB8fCB2YWwgPT09ICJzaG93IiAmJiAhaGlkZGVuICkgewoJCQkJCXJldHVybiBvcHQuY29tcGxldGUuY2FsbCggdGhpcyApOwoJCQkJfQoKCQkJCWlmICggaXNFbGVtZW50ICYmICggbmFtZSA9PT0gImhlaWdodCIgfHwgbmFtZSA9PT0gIndpZHRoIiApICkgewoJCQkJCS8vIE1ha2Ugc3VyZSB0aGF0IG5vdGhpbmcgc25lYWtzIG91dAoJCQkJCS8vIFJlY29yZCBhbGwgMyBvdmVyZmxvdyBhdHRyaWJ1dGVzIGJlY2F1c2UgSUUgZG9lcyBub3QKCQkJCQkvLyBjaGFuZ2UgdGhlIG92ZXJmbG93IGF0dHJpYnV0ZSB3aGVuIG92ZXJmbG93WCBhbmQKCQkJCQkvLyBvdmVyZmxvd1kgYXJlIHNldCB0byB0aGUgc2FtZSB2YWx1ZQoJCQkJCW9wdC5vdmVyZmxvdyA9IFsgdGhpcy5zdHlsZS5vdmVyZmxvdywgdGhpcy5zdHlsZS5vdmVyZmxvd1gsIHRoaXMuc3R5bGUub3ZlcmZsb3dZIF07CgoJCQkJCS8vIFNldCBkaXNwbGF5IHByb3BlcnR5IHRvIGlubGluZS1ibG9jayBmb3IgaGVpZ2h0L3dpZHRoCgkJCQkJLy8gYW5pbWF0aW9ucyBvbiBpbmxpbmUgZWxlbWVudHMgdGhhdCBhcmUgaGF2aW5nIHdpZHRoL2hlaWdodAoJCQkJCS8vIGFuaW1hdGVkCgkJCQkJaWYgKCBqUXVlcnkuY3NzKCB0aGlzLCAiZGlzcGxheSIgKSA9PT0gImlubGluZSIgJiYKCQkJCQkJCWpRdWVyeS5jc3MoIHRoaXMsICJmbG9hdCIgKSA9PT0gIm5vbmUiICkgewoJCQkJCQlpZiAoICFqUXVlcnkuc3VwcG9ydC5pbmxpbmVCbG9ja05lZWRzTGF5b3V0ICkgewoJCQkJCQkJdGhpcy5zdHlsZS5kaXNwbGF5ID0gImlubGluZS1ibG9jayI7CgoJCQkJCQl9IGVsc2UgewoJCQkJCQkJZGlzcGxheSA9IGRlZmF1bHREaXNwbGF5KCB0aGlzLm5vZGVOYW1lICk7CgoJCQkJCQkJLy8gaW5saW5lLWxldmVsIGVsZW1lbnRzIGFjY2VwdCBpbmxpbmUtYmxvY2s7CgkJCQkJCQkvLyBibG9jay1sZXZlbCBlbGVtZW50cyBuZWVkIHRvIGJlIGlubGluZSB3aXRoIGxheW91dAoJCQkJCQkJaWYgKCBkaXNwbGF5ID09PSAiaW5saW5lIiApIHsKCQkJCQkJCQl0aGlzLnN0eWxlLmRpc3BsYXkgPSAiaW5saW5lLWJsb2NrIjsKCgkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCXRoaXMuc3R5bGUuZGlzcGxheSA9ICJpbmxpbmUiOwoJCQkJCQkJCXRoaXMuc3R5bGUuem9vbSA9IDE7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCX0KCgkJCWlmICggb3B0Lm92ZXJmbG93ICE9IG51bGwgKSB7CgkJCQl0aGlzLnN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiI7CgkJCX0KCgkJCWZvciAoIHAgaW4gcHJvcCApIHsKCQkJCWUgPSBuZXcgalF1ZXJ5LmZ4KCB0aGlzLCBvcHQsIHAgKTsKCQkJCXZhbCA9IHByb3BbIHAgXTsKCgkJCQlpZiAoIHJmeHR5cGVzLnRlc3QodmFsKSApIHsKCQkJCQllWyB2YWwgPT09ICJ0b2dnbGUiID8gaGlkZGVuID8gInNob3ciIDogImhpZGUiIDogdmFsIF0oKTsKCgkJCQl9IGVsc2UgewoJCQkJCXBhcnRzID0gcmZ4bnVtLmV4ZWMoIHZhbCApOwoJCQkJCXN0YXJ0ID0gZS5jdXIoKTsKCgkJCQkJaWYgKCBwYXJ0cyApIHsKCQkJCQkJZW5kID0gcGFyc2VGbG9hdCggcGFydHNbMl0gKTsKCQkJCQkJdW5pdCA9IHBhcnRzWzNdIHx8ICggalF1ZXJ5LmNzc051bWJlclsgcCBdID8gIiIgOiAicHgiICk7CgoJCQkJCQkvLyBXZSBuZWVkIHRvIGNvbXB1dGUgc3RhcnRpbmcgdmFsdWUKCQkJCQkJaWYgKCB1bml0ICE9PSAicHgiICkgewoJCQkJCQkJalF1ZXJ5LnN0eWxlKCB0aGlzLCBwLCAoZW5kIHx8IDEpICsgdW5pdCk7CgkJCQkJCQlzdGFydCA9ICgoZW5kIHx8IDEpIC8gZS5jdXIoKSkgKiBzdGFydDsKCQkJCQkJCWpRdWVyeS5zdHlsZSggdGhpcywgcCwgc3RhcnQgKyB1bml0KTsKCQkJCQkJfQoKCQkJCQkJLy8gSWYgYSArPS8tPSB0b2tlbiB3YXMgcHJvdmlkZWQsIHdlJ3JlIGRvaW5nIGEgcmVsYXRpdmUgYW5pbWF0aW9uCgkJCQkJCWlmICggcGFydHNbMV0gKSB7CgkJCQkJCQllbmQgPSAoIChwYXJ0c1sgMSBdID09PSAiLT0iID8gLTEgOiAxKSAqIGVuZCApICsgc3RhcnQ7CgkJCQkJCX0KCgkJCQkJCWUuY3VzdG9tKCBzdGFydCwgZW5kLCB1bml0ICk7CgoJCQkJCX0gZWxzZSB7CgkJCQkJCWUuY3VzdG9tKCBzdGFydCwgdmFsLCAiIiApOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJLy8gRm9yIEpTIHN0cmljdCBjb21wbGlhbmNlCgkJCXJldHVybiB0cnVlOwoJCX0pOwoJfSwKCglzdG9wOiBmdW5jdGlvbiggY2xlYXJRdWV1ZSwgZ290b0VuZCApIHsKCQlpZiAoIGNsZWFyUXVldWUgKSB7CgkJCXRoaXMucXVldWUoW10pOwoJCX0KCgkJdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQl2YXIgdGltZXJzID0galF1ZXJ5LnRpbWVycywKCQkJCWkgPSB0aW1lcnMubGVuZ3RoOwoJCQkvLyBjbGVhciBtYXJrZXIgY291bnRlcnMgaWYgd2Uga25vdyB0aGV5IHdvbid0IGJlCgkJCWlmICggIWdvdG9FbmQgKSB7CgkJCQlqUXVlcnkuX3VubWFyayggdHJ1ZSwgdGhpcyApOwoJCQl9CgkJCXdoaWxlICggaS0tICkgewoJCQkJaWYgKCB0aW1lcnNbaV0uZWxlbSA9PT0gdGhpcyApIHsKCQkJCQlpZiAoZ290b0VuZCkgewoJCQkJCQkvLyBmb3JjZSB0aGUgbmV4dCBzdGVwIHRvIGJlIHRoZSBsYXN0CgkJCQkJCXRpbWVyc1tpXSh0cnVlKTsKCQkJCQl9CgoJCQkJCXRpbWVycy5zcGxpY2UoaSwgMSk7CgkJCQl9CgkJCX0KCQl9KTsKCgkJLy8gc3RhcnQgdGhlIG5leHQgaW4gdGhlIHF1ZXVlIGlmIHRoZSBsYXN0IHN0ZXAgd2Fzbid0IGZvcmNlZAoJCWlmICggIWdvdG9FbmQgKSB7CgkJCXRoaXMuZGVxdWV1ZSgpOwoJCX0KCgkJcmV0dXJuIHRoaXM7Cgl9Cgp9KTsKCi8vIEFuaW1hdGlvbnMgY3JlYXRlZCBzeW5jaHJvbm91c2x5IHdpbGwgcnVuIHN5bmNocm9ub3VzbHkKZnVuY3Rpb24gY3JlYXRlRnhOb3coKSB7CglzZXRUaW1lb3V0KCBjbGVhckZ4Tm93LCAwICk7CglyZXR1cm4gKCBmeE5vdyA9IGpRdWVyeS5ub3coKSApOwp9CgpmdW5jdGlvbiBjbGVhckZ4Tm93KCkgewoJZnhOb3cgPSB1bmRlZmluZWQ7Cn0KCi8vIEdlbmVyYXRlIHBhcmFtZXRlcnMgdG8gY3JlYXRlIGEgc3RhbmRhcmQgYW5pbWF0aW9uCmZ1bmN0aW9uIGdlbkZ4KCB0eXBlLCBudW0gKSB7Cgl2YXIgb2JqID0ge307CgoJalF1ZXJ5LmVhY2goIGZ4QXR0cnMuY29uY2F0LmFwcGx5KFtdLCBmeEF0dHJzLnNsaWNlKDAsbnVtKSksIGZ1bmN0aW9uKCkgewoJCW9ialsgdGhpcyBdID0gdHlwZTsKCX0pOwoKCXJldHVybiBvYmo7Cn0KCi8vIEdlbmVyYXRlIHNob3J0Y3V0cyBmb3IgY3VzdG9tIGFuaW1hdGlvbnMKalF1ZXJ5LmVhY2goewoJc2xpZGVEb3duOiBnZW5GeCgic2hvdyIsIDEpLAoJc2xpZGVVcDogZ2VuRngoImhpZGUiLCAxKSwKCXNsaWRlVG9nZ2xlOiBnZW5GeCgidG9nZ2xlIiwgMSksCglmYWRlSW46IHsgb3BhY2l0eTogInNob3ciIH0sCglmYWRlT3V0OiB7IG9wYWNpdHk6ICJoaWRlIiB9LAoJZmFkZVRvZ2dsZTogeyBvcGFjaXR5OiAidG9nZ2xlIiB9Cn0sIGZ1bmN0aW9uKCBuYW1lLCBwcm9wcyApIHsKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkgewoJCXJldHVybiB0aGlzLmFuaW1hdGUoIHByb3BzLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApOwoJfTsKfSk7CgpqUXVlcnkuZXh0ZW5kKHsKCXNwZWVkOiBmdW5jdGlvbiggc3BlZWQsIGVhc2luZywgZm4gKSB7CgkJdmFyIG9wdCA9IHNwZWVkICYmIHR5cGVvZiBzcGVlZCA9PT0gIm9iamVjdCIgPyBqUXVlcnkuZXh0ZW5kKHt9LCBzcGVlZCkgOiB7CgkJCWNvbXBsZXRlOiBmbiB8fCAhZm4gJiYgZWFzaW5nIHx8CgkJCQlqUXVlcnkuaXNGdW5jdGlvbiggc3BlZWQgKSAmJiBzcGVlZCwKCQkJZHVyYXRpb246IHNwZWVkLAoJCQllYXNpbmc6IGZuICYmIGVhc2luZyB8fCBlYXNpbmcgJiYgIWpRdWVyeS5pc0Z1bmN0aW9uKGVhc2luZykgJiYgZWFzaW5nCgkJfTsKCgkJb3B0LmR1cmF0aW9uID0galF1ZXJ5LmZ4Lm9mZiA/IDAgOiB0eXBlb2Ygb3B0LmR1cmF0aW9uID09PSAibnVtYmVyIiA/IG9wdC5kdXJhdGlvbiA6CgkJCW9wdC5kdXJhdGlvbiBpbiBqUXVlcnkuZnguc3BlZWRzID8galF1ZXJ5LmZ4LnNwZWVkc1tvcHQuZHVyYXRpb25dIDogalF1ZXJ5LmZ4LnNwZWVkcy5fZGVmYXVsdDsKCgkJLy8gUXVldWVpbmcKCQlvcHQub2xkID0gb3B0LmNvbXBsZXRlOwoJCW9wdC5jb21wbGV0ZSA9IGZ1bmN0aW9uKCBub1VubWFyayApIHsKCQkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggb3B0Lm9sZCApICkgewoJCQkJb3B0Lm9sZC5jYWxsKCB0aGlzICk7CgkJCX0KCgkJCWlmICggb3B0LnF1ZXVlICE9PSBmYWxzZSApIHsKCQkJCWpRdWVyeS5kZXF1ZXVlKCB0aGlzICk7CgkJCX0gZWxzZSBpZiAoIG5vVW5tYXJrICE9PSBmYWxzZSApIHsKCQkJCWpRdWVyeS5fdW5tYXJrKCB0aGlzICk7CgkJCX0KCQl9OwoKCQlyZXR1cm4gb3B0OwoJfSwKCgllYXNpbmc6IHsKCQlsaW5lYXI6IGZ1bmN0aW9uKCBwLCBuLCBmaXJzdE51bSwgZGlmZiApIHsKCQkJcmV0dXJuIGZpcnN0TnVtICsgZGlmZiAqIHA7CgkJfSwKCQlzd2luZzogZnVuY3Rpb24oIHAsIG4sIGZpcnN0TnVtLCBkaWZmICkgewoJCQlyZXR1cm4gKCgtTWF0aC5jb3MocCpNYXRoLlBJKS8yKSArIDAuNSkgKiBkaWZmICsgZmlyc3ROdW07CgkJfQoJfSwKCgl0aW1lcnM6IFtdLAoKCWZ4OiBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgcHJvcCApIHsKCQl0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwoJCXRoaXMuZWxlbSA9IGVsZW07CgkJdGhpcy5wcm9wID0gcHJvcDsKCgkJb3B0aW9ucy5vcmlnID0gb3B0aW9ucy5vcmlnIHx8IHt9OwoJfQoKfSk7CgpqUXVlcnkuZngucHJvdG90eXBlID0gewoJLy8gU2ltcGxlIGZ1bmN0aW9uIGZvciBzZXR0aW5nIGEgc3R5bGUgdmFsdWUKCXVwZGF0ZTogZnVuY3Rpb24oKSB7CgkJaWYgKCB0aGlzLm9wdGlvbnMuc3RlcCApIHsKCQkJdGhpcy5vcHRpb25zLnN0ZXAuY2FsbCggdGhpcy5lbGVtLCB0aGlzLm5vdywgdGhpcyApOwoJCX0KCgkJKGpRdWVyeS5meC5zdGVwW3RoaXMucHJvcF0gfHwgalF1ZXJ5LmZ4LnN0ZXAuX2RlZmF1bHQpKCB0aGlzICk7Cgl9LAoKCS8vIEdldCB0aGUgY3VycmVudCBzaXplCgljdXI6IGZ1bmN0aW9uKCkgewoJCWlmICggdGhpcy5lbGVtW3RoaXMucHJvcF0gIT0gbnVsbCAmJiAoIXRoaXMuZWxlbS5zdHlsZSB8fCB0aGlzLmVsZW0uc3R5bGVbdGhpcy5wcm9wXSA9PSBudWxsKSApIHsKCQkJcmV0dXJuIHRoaXMuZWxlbVsgdGhpcy5wcm9wIF07CgkJfQoKCQl2YXIgcGFyc2VkLAoJCQlyID0galF1ZXJ5LmNzcyggdGhpcy5lbGVtLCB0aGlzLnByb3AgKTsKCQkvLyBFbXB0eSBzdHJpbmdzLCBudWxsLCB1bmRlZmluZWQgYW5kICJhdXRvIiBhcmUgY29udmVydGVkIHRvIDAsCgkJLy8gY29tcGxleCB2YWx1ZXMgc3VjaCBhcyAicm90YXRlKDFyYWQpIiBhcmUgcmV0dXJuZWQgYXMgaXMsCgkJLy8gc2ltcGxlIHZhbHVlcyBzdWNoIGFzICIxMHB4IiBhcmUgcGFyc2VkIHRvIEZsb2F0LgoJCXJldHVybiBpc05hTiggcGFyc2VkID0gcGFyc2VGbG9hdCggciApICkgPyAhciB8fCByID09PSAiYXV0byIgPyAwIDogciA6IHBhcnNlZDsKCX0sCgoJLy8gU3RhcnQgYW4gYW5pbWF0aW9uIGZyb20gb25lIG51bWJlciB0byBhbm90aGVyCgljdXN0b206IGZ1bmN0aW9uKCBmcm9tLCB0bywgdW5pdCApIHsKCQl2YXIgc2VsZiA9IHRoaXMsCgkJCWZ4ID0galF1ZXJ5LmZ4OwoKCQl0aGlzLnN0YXJ0VGltZSA9IGZ4Tm93IHx8IGNyZWF0ZUZ4Tm93KCk7CgkJdGhpcy5zdGFydCA9IGZyb207CgkJdGhpcy5lbmQgPSB0bzsKCQl0aGlzLnVuaXQgPSB1bml0IHx8IHRoaXMudW5pdCB8fCAoIGpRdWVyeS5jc3NOdW1iZXJbIHRoaXMucHJvcCBdID8gIiIgOiAicHgiICk7CgkJdGhpcy5ub3cgPSB0aGlzLnN0YXJ0OwoJCXRoaXMucG9zID0gdGhpcy5zdGF0ZSA9IDA7CgoJCWZ1bmN0aW9uIHQoIGdvdG9FbmQgKSB7CgkJCXJldHVybiBzZWxmLnN0ZXAoZ290b0VuZCk7CgkJfQoKCQl0LmVsZW0gPSB0aGlzLmVsZW07CgoJCWlmICggdCgpICYmIGpRdWVyeS50aW1lcnMucHVzaCh0KSAmJiAhdGltZXJJZCApIHsKCQkJdGltZXJJZCA9IHNldEludGVydmFsKCBmeC50aWNrLCBmeC5pbnRlcnZhbCApOwoJCX0KCX0sCgoJLy8gU2ltcGxlICdzaG93JyBmdW5jdGlvbgoJc2hvdzogZnVuY3Rpb24oKSB7CgkJLy8gUmVtZW1iZXIgd2hlcmUgd2Ugc3RhcnRlZCwgc28gdGhhdCB3ZSBjYW4gZ28gYmFjayB0byBpdCBsYXRlcgoJCXRoaXMub3B0aW9ucy5vcmlnW3RoaXMucHJvcF0gPSBqUXVlcnkuc3R5bGUoIHRoaXMuZWxlbSwgdGhpcy5wcm9wICk7CgkJdGhpcy5vcHRpb25zLnNob3cgPSB0cnVlOwoKCQkvLyBCZWdpbiB0aGUgYW5pbWF0aW9uCgkJLy8gTWFrZSBzdXJlIHRoYXQgd2Ugc3RhcnQgYXQgYSBzbWFsbCB3aWR0aC9oZWlnaHQgdG8gYXZvaWQgYW55CgkJLy8gZmxhc2ggb2YgY29udGVudAoJCXRoaXMuY3VzdG9tKHRoaXMucHJvcCA9PT0gIndpZHRoIiB8fCB0aGlzLnByb3AgPT09ICJoZWlnaHQiID8gMSA6IDAsIHRoaXMuY3VyKCkpOwoKCQkvLyBTdGFydCBieSBzaG93aW5nIHRoZSBlbGVtZW50CgkJalF1ZXJ5KCB0aGlzLmVsZW0gKS5zaG93KCk7Cgl9LAoKCS8vIFNpbXBsZSAnaGlkZScgZnVuY3Rpb24KCWhpZGU6IGZ1bmN0aW9uKCkgewoJCS8vIFJlbWVtYmVyIHdoZXJlIHdlIHN0YXJ0ZWQsIHNvIHRoYXQgd2UgY2FuIGdvIGJhY2sgdG8gaXQgbGF0ZXIKCQl0aGlzLm9wdGlvbnMub3JpZ1t0aGlzLnByb3BdID0galF1ZXJ5LnN0eWxlKCB0aGlzLmVsZW0sIHRoaXMucHJvcCApOwoJCXRoaXMub3B0aW9ucy5oaWRlID0gdHJ1ZTsKCgkJLy8gQmVnaW4gdGhlIGFuaW1hdGlvbgoJCXRoaXMuY3VzdG9tKHRoaXMuY3VyKCksIDApOwoJfSwKCgkvLyBFYWNoIHN0ZXAgb2YgYW4gYW5pbWF0aW9uCglzdGVwOiBmdW5jdGlvbiggZ290b0VuZCApIHsKCQl2YXIgdCA9IGZ4Tm93IHx8IGNyZWF0ZUZ4Tm93KCksCgkJCWRvbmUgPSB0cnVlLAoJCQllbGVtID0gdGhpcy5lbGVtLAoJCQlvcHRpb25zID0gdGhpcy5vcHRpb25zLAoJCQlpLCBuOwoKCQlpZiAoIGdvdG9FbmQgfHwgdCA+PSBvcHRpb25zLmR1cmF0aW9uICsgdGhpcy5zdGFydFRpbWUgKSB7CgkJCXRoaXMubm93ID0gdGhpcy5lbmQ7CgkJCXRoaXMucG9zID0gdGhpcy5zdGF0ZSA9IDE7CgkJCXRoaXMudXBkYXRlKCk7CgoJCQlvcHRpb25zLmFuaW1hdGVkUHJvcGVydGllc1sgdGhpcy5wcm9wIF0gPSB0cnVlOwoKCQkJZm9yICggaSBpbiBvcHRpb25zLmFuaW1hdGVkUHJvcGVydGllcyApIHsKCQkJCWlmICggb3B0aW9ucy5hbmltYXRlZFByb3BlcnRpZXNbaV0gIT09IHRydWUgKSB7CgkJCQkJZG9uZSA9IGZhbHNlOwoJCQkJfQoJCQl9CgoJCQlpZiAoIGRvbmUgKSB7CgkJCQkvLyBSZXNldCB0aGUgb3ZlcmZsb3cKCQkJCWlmICggb3B0aW9ucy5vdmVyZmxvdyAhPSBudWxsICYmICFqUXVlcnkuc3VwcG9ydC5zaHJpbmtXcmFwQmxvY2tzICkgewoKCQkJCQlqUXVlcnkuZWFjaCggWyAiIiwgIlgiLCAiWSIgXSwgZnVuY3Rpb24gKGluZGV4LCB2YWx1ZSkgewoJCQkJCQllbGVtLnN0eWxlWyAib3ZlcmZsb3ciICsgdmFsdWUgXSA9IG9wdGlvbnMub3ZlcmZsb3dbaW5kZXhdOwoJCQkJCX0pOwoJCQkJfQoKCQkJCS8vIEhpZGUgdGhlIGVsZW1lbnQgaWYgdGhlICJoaWRlIiBvcGVyYXRpb24gd2FzIGRvbmUKCQkJCWlmICggb3B0aW9ucy5oaWRlICkgewoJCQkJCWpRdWVyeShlbGVtKS5oaWRlKCk7CgkJCQl9CgoJCQkJLy8gUmVzZXQgdGhlIHByb3BlcnRpZXMsIGlmIHRoZSBpdGVtIGhhcyBiZWVuIGhpZGRlbiBvciBzaG93bgoJCQkJaWYgKCBvcHRpb25zLmhpZGUgfHwgb3B0aW9ucy5zaG93ICkgewoJCQkJCWZvciAoIHZhciBwIGluIG9wdGlvbnMuYW5pbWF0ZWRQcm9wZXJ0aWVzICkgewoJCQkJCQlqUXVlcnkuc3R5bGUoIGVsZW0sIHAsIG9wdGlvbnMub3JpZ1twXSApOwoJCQkJCX0KCQkJCX0KCgkJCQkvLyBFeGVjdXRlIHRoZSBjb21wbGV0ZSBmdW5jdGlvbgoJCQkJb3B0aW9ucy5jb21wbGV0ZS5jYWxsKCBlbGVtICk7CgkJCX0KCgkJCXJldHVybiBmYWxzZTsKCgkJfSBlbHNlIHsKCQkJLy8gY2xhc3NpY2FsIGVhc2luZyBjYW5ub3QgYmUgdXNlZCB3aXRoIGFuIEluZmluaXR5IGR1cmF0aW9uCgkJCWlmICggb3B0aW9ucy5kdXJhdGlvbiA9PSBJbmZpbml0eSApIHsKCQkJCXRoaXMubm93ID0gdDsKCQkJfSBlbHNlIHsKCQkJCW4gPSB0IC0gdGhpcy5zdGFydFRpbWU7CgkJCQl0aGlzLnN0YXRlID0gbiAvIG9wdGlvbnMuZHVyYXRpb247CgoJCQkJLy8gUGVyZm9ybSB0aGUgZWFzaW5nIGZ1bmN0aW9uLCBkZWZhdWx0cyB0byBzd2luZwoJCQkJdGhpcy5wb3MgPSBqUXVlcnkuZWFzaW5nWyBvcHRpb25zLmFuaW1hdGVkUHJvcGVydGllc1sgdGhpcy5wcm9wIF0gXSggdGhpcy5zdGF0ZSwgbiwgMCwgMSwgb3B0aW9ucy5kdXJhdGlvbiApOwoJCQkJdGhpcy5ub3cgPSB0aGlzLnN0YXJ0ICsgKCh0aGlzLmVuZCAtIHRoaXMuc3RhcnQpICogdGhpcy5wb3MpOwoJCQl9CgkJCS8vIFBlcmZvcm0gdGhlIG5leHQgc3RlcCBvZiB0aGUgYW5pbWF0aW9uCgkJCXRoaXMudXBkYXRlKCk7CgkJfQoKCQlyZXR1cm4gdHJ1ZTsKCX0KfTsKCmpRdWVyeS5leHRlbmQoIGpRdWVyeS5meCwgewoJdGljazogZnVuY3Rpb24oKSB7CgkJZm9yICggdmFyIHRpbWVycyA9IGpRdWVyeS50aW1lcnMsIGkgPSAwIDsgaSA8IHRpbWVycy5sZW5ndGggOyArK2kgKSB7CgkJCWlmICggIXRpbWVyc1tpXSgpICkgewoJCQkJdGltZXJzLnNwbGljZShpLS0sIDEpOwoJCQl9CgkJfQoKCQlpZiAoICF0aW1lcnMubGVuZ3RoICkgewoJCQlqUXVlcnkuZnguc3RvcCgpOwoJCX0KCX0sCgoJaW50ZXJ2YWw6IDEzLAoKCXN0b3A6IGZ1bmN0aW9uKCkgewoJCWNsZWFySW50ZXJ2YWwoIHRpbWVySWQgKTsKCQl0aW1lcklkID0gbnVsbDsKCX0sCgoJc3BlZWRzOiB7CgkJc2xvdzogNjAwLAoJCWZhc3Q6IDIwMCwKCQkvLyBEZWZhdWx0IHNwZWVkCgkJX2RlZmF1bHQ6IDQwMAoJfSwKCglzdGVwOiB7CgkJb3BhY2l0eTogZnVuY3Rpb24oIGZ4ICkgewoJCQlqUXVlcnkuc3R5bGUoIGZ4LmVsZW0sICJvcGFjaXR5IiwgZngubm93ICk7CgkJfSwKCgkJX2RlZmF1bHQ6IGZ1bmN0aW9uKCBmeCApIHsKCQkJaWYgKCBmeC5lbGVtLnN0eWxlICYmIGZ4LmVsZW0uc3R5bGVbIGZ4LnByb3AgXSAhPSBudWxsICkgewoJCQkJZnguZWxlbS5zdHlsZVsgZngucHJvcCBdID0gKGZ4LnByb3AgPT09ICJ3aWR0aCIgfHwgZngucHJvcCA9PT0gImhlaWdodCIgPyBNYXRoLm1heCgwLCBmeC5ub3cpIDogZngubm93KSArIGZ4LnVuaXQ7CgkJCX0gZWxzZSB7CgkJCQlmeC5lbGVtWyBmeC5wcm9wIF0gPSBmeC5ub3c7CgkJCX0KCQl9Cgl9Cn0pOwoKaWYgKCBqUXVlcnkuZXhwciAmJiBqUXVlcnkuZXhwci5maWx0ZXJzICkgewoJalF1ZXJ5LmV4cHIuZmlsdGVycy5hbmltYXRlZCA9IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBqUXVlcnkuZ3JlcChqUXVlcnkudGltZXJzLCBmdW5jdGlvbiggZm4gKSB7CgkJCXJldHVybiBlbGVtID09PSBmbi5lbGVtOwoJCX0pLmxlbmd0aDsKCX07Cn0KCi8vIFRyeSB0byByZXN0b3JlIHRoZSBkZWZhdWx0IGRpc3BsYXkgdmFsdWUgb2YgYW4gZWxlbWVudApmdW5jdGlvbiBkZWZhdWx0RGlzcGxheSggbm9kZU5hbWUgKSB7CgoJaWYgKCAhZWxlbWRpc3BsYXlbIG5vZGVOYW1lIF0gKSB7CgoJCXZhciBib2R5ID0gZG9jdW1lbnQuYm9keSwKCQkJZWxlbSA9IGpRdWVyeSggIjwiICsgbm9kZU5hbWUgKyAiPiIgKS5hcHBlbmRUbyggYm9keSApLAoJCQlkaXNwbGF5ID0gZWxlbS5jc3MoICJkaXNwbGF5IiApOwoKCQllbGVtLnJlbW92ZSgpOwoKCQkvLyBJZiB0aGUgc2ltcGxlIHdheSBmYWlscywKCQkvLyBnZXQgZWxlbWVudCdzIHJlYWwgZGVmYXVsdCBkaXNwbGF5IGJ5IGF0dGFjaGluZyBpdCB0byBhIHRlbXAgaWZyYW1lCgkJaWYgKCBkaXNwbGF5ID09PSAibm9uZSIgfHwgZGlzcGxheSA9PT0gIiIgKSB7CgkJCS8vIE5vIGlmcmFtZSB0byB1c2UgeWV0LCBzbyBjcmVhdGUgaXQKCQkJaWYgKCAhaWZyYW1lICkgewoJCQkJaWZyYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImlmcmFtZSIgKTsKCQkJCWlmcmFtZS5mcmFtZUJvcmRlciA9IGlmcmFtZS53aWR0aCA9IGlmcmFtZS5oZWlnaHQgPSAwOwoJCQl9CgoJCQlib2R5LmFwcGVuZENoaWxkKCBpZnJhbWUgKTsKCgkJCS8vIENyZWF0ZSBhIGNhY2hlYWJsZSBjb3B5IG9mIHRoZSBpZnJhbWUgZG9jdW1lbnQgb24gZmlyc3QgY2FsbC4KCQkJLy8gSUUgYW5kIE9wZXJhIHdpbGwgYWxsb3cgdXMgdG8gcmV1c2UgdGhlIGlmcmFtZURvYyB3aXRob3V0IHJlLXdyaXRpbmcgdGhlIGZha2UgSFRNTAoJCQkvLyBkb2N1bWVudCB0byBpdDsgV2ViS2l0ICYgRmlyZWZveCB3b24ndCBhbGxvdyByZXVzaW5nIHRoZSBpZnJhbWUgZG9jdW1lbnQuCgkJCWlmICggIWlmcmFtZURvYyB8fCAhaWZyYW1lLmNyZWF0ZUVsZW1lbnQgKSB7CgkJCQlpZnJhbWVEb2MgPSAoIGlmcmFtZS5jb250ZW50V2luZG93IHx8IGlmcmFtZS5jb250ZW50RG9jdW1lbnQgKS5kb2N1bWVudDsKCQkJCWlmcmFtZURvYy53cml0ZSggKCBkb2N1bWVudC5jb21wYXRNb2RlID09PSAiQ1NTMUNvbXBhdCIgPyAiPCFkb2N0eXBlIGh0bWw+IiA6ICIiICkgKyAiPGh0bWw+PGJvZHk+IiApOwoJCQkJaWZyYW1lRG9jLmNsb3NlKCk7CgkJCX0KCgkJCWVsZW0gPSBpZnJhbWVEb2MuY3JlYXRlRWxlbWVudCggbm9kZU5hbWUgKTsKCgkJCWlmcmFtZURvYy5ib2R5LmFwcGVuZENoaWxkKCBlbGVtICk7CgoJCQlkaXNwbGF5ID0galF1ZXJ5LmNzcyggZWxlbSwgImRpc3BsYXkiICk7CgoJCQlib2R5LnJlbW92ZUNoaWxkKCBpZnJhbWUgKTsKCQl9CgoJCS8vIFN0b3JlIHRoZSBjb3JyZWN0IGRlZmF1bHQgZGlzcGxheQoJCWVsZW1kaXNwbGF5WyBub2RlTmFtZSBdID0gZGlzcGxheTsKCX0KCglyZXR1cm4gZWxlbWRpc3BsYXlbIG5vZGVOYW1lIF07Cn0KCgoKCnZhciBydGFibGUgPSAvXnQoPzphYmxlfGR8aCkkL2ksCglycm9vdCA9IC9eKD86Ym9keXxodG1sKSQvaTsKCmlmICggImdldEJvdW5kaW5nQ2xpZW50UmVjdCIgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICkgewoJalF1ZXJ5LmZuLm9mZnNldCA9IGZ1bmN0aW9uKCBvcHRpb25zICkgewoJCXZhciBlbGVtID0gdGhpc1swXSwgYm94OwoKCQlpZiAoIG9wdGlvbnMgKSB7CgkJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oIGkgKSB7CgkJCQlqUXVlcnkub2Zmc2V0LnNldE9mZnNldCggdGhpcywgb3B0aW9ucywgaSApOwoJCQl9KTsKCQl9CgoJCWlmICggIWVsZW0gfHwgIWVsZW0ub3duZXJEb2N1bWVudCApIHsKCQkJcmV0dXJuIG51bGw7CgkJfQoKCQlpZiAoIGVsZW0gPT09IGVsZW0ub3duZXJEb2N1bWVudC5ib2R5ICkgewoJCQlyZXR1cm4galF1ZXJ5Lm9mZnNldC5ib2R5T2Zmc2V0KCBlbGVtICk7CgkJfQoKCQl0cnkgewoJCQlib3ggPSBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwoJCX0gY2F0Y2goZSkge30KCgkJdmFyIGRvYyA9IGVsZW0ub3duZXJEb2N1bWVudCwKCQkJZG9jRWxlbSA9IGRvYy5kb2N1bWVudEVsZW1lbnQ7CgoJCS8vIE1ha2Ugc3VyZSB3ZSdyZSBub3QgZGVhbGluZyB3aXRoIGEgZGlzY29ubmVjdGVkIERPTSBub2RlCgkJaWYgKCAhYm94IHx8ICFqUXVlcnkuY29udGFpbnMoIGRvY0VsZW0sIGVsZW0gKSApIHsKCQkJcmV0dXJuIGJveCA/IHsgdG9wOiBib3gudG9wLCBsZWZ0OiBib3gubGVmdCB9IDogeyB0b3A6IDAsIGxlZnQ6IDAgfTsKCQl9CgoJCXZhciBib2R5ID0gZG9jLmJvZHksCgkJCXdpbiA9IGdldFdpbmRvdyhkb2MpLAoJCQljbGllbnRUb3AgID0gZG9jRWxlbS5jbGllbnRUb3AgIHx8IGJvZHkuY2xpZW50VG9wICB8fCAwLAoJCQljbGllbnRMZWZ0ID0gZG9jRWxlbS5jbGllbnRMZWZ0IHx8IGJvZHkuY2xpZW50TGVmdCB8fCAwLAoJCQlzY3JvbGxUb3AgID0gd2luLnBhZ2VZT2Zmc2V0IHx8IGpRdWVyeS5zdXBwb3J0LmJveE1vZGVsICYmIGRvY0VsZW0uc2Nyb2xsVG9wICB8fCBib2R5LnNjcm9sbFRvcCwKCQkJc2Nyb2xsTGVmdCA9IHdpbi5wYWdlWE9mZnNldCB8fCBqUXVlcnkuc3VwcG9ydC5ib3hNb2RlbCAmJiBkb2NFbGVtLnNjcm9sbExlZnQgfHwgYm9keS5zY3JvbGxMZWZ0LAoJCQl0b3AgID0gYm94LnRvcCAgKyBzY3JvbGxUb3AgIC0gY2xpZW50VG9wLAoJCQlsZWZ0ID0gYm94LmxlZnQgKyBzY3JvbGxMZWZ0IC0gY2xpZW50TGVmdDsKCgkJcmV0dXJuIHsgdG9wOiB0b3AsIGxlZnQ6IGxlZnQgfTsKCX07Cgp9IGVsc2UgewoJalF1ZXJ5LmZuLm9mZnNldCA9IGZ1bmN0aW9uKCBvcHRpb25zICkgewoJCXZhciBlbGVtID0gdGhpc1swXTsKCgkJaWYgKCBvcHRpb25zICkgewoJCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCBpICkgewoJCQkJalF1ZXJ5Lm9mZnNldC5zZXRPZmZzZXQoIHRoaXMsIG9wdGlvbnMsIGkgKTsKCQkJfSk7CgkJfQoKCQlpZiAoICFlbGVtIHx8ICFlbGVtLm93bmVyRG9jdW1lbnQgKSB7CgkJCXJldHVybiBudWxsOwoJCX0KCgkJaWYgKCBlbGVtID09PSBlbGVtLm93bmVyRG9jdW1lbnQuYm9keSApIHsKCQkJcmV0dXJuIGpRdWVyeS5vZmZzZXQuYm9keU9mZnNldCggZWxlbSApOwoJCX0KCgkJalF1ZXJ5Lm9mZnNldC5pbml0aWFsaXplKCk7CgoJCXZhciBjb21wdXRlZFN0eWxlLAoJCQlvZmZzZXRQYXJlbnQgPSBlbGVtLm9mZnNldFBhcmVudCwKCQkJcHJldk9mZnNldFBhcmVudCA9IGVsZW0sCgkJCWRvYyA9IGVsZW0ub3duZXJEb2N1bWVudCwKCQkJZG9jRWxlbSA9IGRvYy5kb2N1bWVudEVsZW1lbnQsCgkJCWJvZHkgPSBkb2MuYm9keSwKCQkJZGVmYXVsdFZpZXcgPSBkb2MuZGVmYXVsdFZpZXcsCgkJCXByZXZDb21wdXRlZFN0eWxlID0gZGVmYXVsdFZpZXcgPyBkZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKCBlbGVtLCBudWxsICkgOiBlbGVtLmN1cnJlbnRTdHlsZSwKCQkJdG9wID0gZWxlbS5vZmZzZXRUb3AsCgkJCWxlZnQgPSBlbGVtLm9mZnNldExlZnQ7CgoJCXdoaWxlICggKGVsZW0gPSBlbGVtLnBhcmVudE5vZGUpICYmIGVsZW0gIT09IGJvZHkgJiYgZWxlbSAhPT0gZG9jRWxlbSApIHsKCQkJaWYgKCBqUXVlcnkub2Zmc2V0LnN1cHBvcnRzRml4ZWRQb3NpdGlvbiAmJiBwcmV2Q29tcHV0ZWRTdHlsZS5wb3NpdGlvbiA9PT0gImZpeGVkIiApIHsKCQkJCWJyZWFrOwoJCQl9CgoJCQljb21wdXRlZFN0eWxlID0gZGVmYXVsdFZpZXcgPyBkZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGVsZW0sIG51bGwpIDogZWxlbS5jdXJyZW50U3R5bGU7CgkJCXRvcCAgLT0gZWxlbS5zY3JvbGxUb3A7CgkJCWxlZnQgLT0gZWxlbS5zY3JvbGxMZWZ0OwoKCQkJaWYgKCBlbGVtID09PSBvZmZzZXRQYXJlbnQgKSB7CgkJCQl0b3AgICs9IGVsZW0ub2Zmc2V0VG9wOwoJCQkJbGVmdCArPSBlbGVtLm9mZnNldExlZnQ7CgoJCQkJaWYgKCBqUXVlcnkub2Zmc2V0LmRvZXNOb3RBZGRCb3JkZXIgJiYgIShqUXVlcnkub2Zmc2V0LmRvZXNBZGRCb3JkZXJGb3JUYWJsZUFuZENlbGxzICYmIHJ0YWJsZS50ZXN0KGVsZW0ubm9kZU5hbWUpKSApIHsKCQkJCQl0b3AgICs9IHBhcnNlRmxvYXQoIGNvbXB1dGVkU3R5bGUuYm9yZGVyVG9wV2lkdGggICkgfHwgMDsKCQkJCQlsZWZ0ICs9IHBhcnNlRmxvYXQoIGNvbXB1dGVkU3R5bGUuYm9yZGVyTGVmdFdpZHRoICkgfHwgMDsKCQkJCX0KCgkJCQlwcmV2T2Zmc2V0UGFyZW50ID0gb2Zmc2V0UGFyZW50OwoJCQkJb2Zmc2V0UGFyZW50ID0gZWxlbS5vZmZzZXRQYXJlbnQ7CgkJCX0KCgkJCWlmICggalF1ZXJ5Lm9mZnNldC5zdWJ0cmFjdHNCb3JkZXJGb3JPdmVyZmxvd05vdFZpc2libGUgJiYgY29tcHV0ZWRTdHlsZS5vdmVyZmxvdyAhPT0gInZpc2libGUiICkgewoJCQkJdG9wICArPSBwYXJzZUZsb2F0KCBjb21wdXRlZFN0eWxlLmJvcmRlclRvcFdpZHRoICApIHx8IDA7CgkJCQlsZWZ0ICs9IHBhcnNlRmxvYXQoIGNvbXB1dGVkU3R5bGUuYm9yZGVyTGVmdFdpZHRoICkgfHwgMDsKCQkJfQoKCQkJcHJldkNvbXB1dGVkU3R5bGUgPSBjb21wdXRlZFN0eWxlOwoJCX0KCgkJaWYgKCBwcmV2Q29tcHV0ZWRTdHlsZS5wb3NpdGlvbiA9PT0gInJlbGF0aXZlIiB8fCBwcmV2Q29tcHV0ZWRTdHlsZS5wb3NpdGlvbiA9PT0gInN0YXRpYyIgKSB7CgkJCXRvcCAgKz0gYm9keS5vZmZzZXRUb3A7CgkJCWxlZnQgKz0gYm9keS5vZmZzZXRMZWZ0OwoJCX0KCgkJaWYgKCBqUXVlcnkub2Zmc2V0LnN1cHBvcnRzRml4ZWRQb3NpdGlvbiAmJiBwcmV2Q29tcHV0ZWRTdHlsZS5wb3NpdGlvbiA9PT0gImZpeGVkIiApIHsKCQkJdG9wICArPSBNYXRoLm1heCggZG9jRWxlbS5zY3JvbGxUb3AsIGJvZHkuc2Nyb2xsVG9wICk7CgkJCWxlZnQgKz0gTWF0aC5tYXgoIGRvY0VsZW0uc2Nyb2xsTGVmdCwgYm9keS5zY3JvbGxMZWZ0ICk7CgkJfQoKCQlyZXR1cm4geyB0b3A6IHRvcCwgbGVmdDogbGVmdCB9OwoJfTsKfQoKalF1ZXJ5Lm9mZnNldCA9IHsKCWluaXRpYWxpemU6IGZ1bmN0aW9uKCkgewoJCXZhciBib2R5ID0gZG9jdW1lbnQuYm9keSwgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksIGlubmVyRGl2LCBjaGVja0RpdiwgdGFibGUsIHRkLCBib2R5TWFyZ2luVG9wID0gcGFyc2VGbG9hdCggalF1ZXJ5LmNzcyhib2R5LCAibWFyZ2luVG9wIikgKSB8fCAwLAoJCQlodG1sID0gIjxkaXYgc3R5bGU9J3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDttYXJnaW46MDtib3JkZXI6NXB4IHNvbGlkICMwMDA7cGFkZGluZzowO3dpZHRoOjFweDtoZWlnaHQ6MXB4Oyc+PGRpdj48L2Rpdj48L2Rpdj48dGFibGUgc3R5bGU9J3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDttYXJnaW46MDtib3JkZXI6NXB4IHNvbGlkICMwMDA7cGFkZGluZzowO3dpZHRoOjFweDtoZWlnaHQ6MXB4OycgY2VsbHBhZGRpbmc9JzAnIGNlbGxzcGFjaW5nPScwJz48dHI+PHRkPjwvdGQ+PC90cj48L3RhYmxlPiI7CgoJCWpRdWVyeS5leHRlbmQoIGNvbnRhaW5lci5zdHlsZSwgeyBwb3NpdGlvbjogImFic29sdXRlIiwgdG9wOiAwLCBsZWZ0OiAwLCBtYXJnaW46IDAsIGJvcmRlcjogMCwgd2lkdGg6ICIxcHgiLCBoZWlnaHQ6ICIxcHgiLCB2aXNpYmlsaXR5OiAiaGlkZGVuIiB9ICk7CgoJCWNvbnRhaW5lci5pbm5lckhUTUwgPSBodG1sOwoJCWJvZHkuaW5zZXJ0QmVmb3JlKCBjb250YWluZXIsIGJvZHkuZmlyc3RDaGlsZCApOwoJCWlubmVyRGl2ID0gY29udGFpbmVyLmZpcnN0Q2hpbGQ7CgkJY2hlY2tEaXYgPSBpbm5lckRpdi5maXJzdENoaWxkOwoJCXRkID0gaW5uZXJEaXYubmV4dFNpYmxpbmcuZmlyc3RDaGlsZC5maXJzdENoaWxkOwoKCQl0aGlzLmRvZXNOb3RBZGRCb3JkZXIgPSAoY2hlY2tEaXYub2Zmc2V0VG9wICE9PSA1KTsKCQl0aGlzLmRvZXNBZGRCb3JkZXJGb3JUYWJsZUFuZENlbGxzID0gKHRkLm9mZnNldFRvcCA9PT0gNSk7CgoJCWNoZWNrRGl2LnN0eWxlLnBvc2l0aW9uID0gImZpeGVkIjsKCQljaGVja0Rpdi5zdHlsZS50b3AgPSAiMjBweCI7CgoJCS8vIHNhZmFyaSBzdWJ0cmFjdHMgcGFyZW50IGJvcmRlciB3aWR0aCBoZXJlIHdoaWNoIGlzIDVweAoJCXRoaXMuc3VwcG9ydHNGaXhlZFBvc2l0aW9uID0gKGNoZWNrRGl2Lm9mZnNldFRvcCA9PT0gMjAgfHwgY2hlY2tEaXYub2Zmc2V0VG9wID09PSAxNSk7CgkJY2hlY2tEaXYuc3R5bGUucG9zaXRpb24gPSBjaGVja0Rpdi5zdHlsZS50b3AgPSAiIjsKCgkJaW5uZXJEaXYuc3R5bGUub3ZlcmZsb3cgPSAiaGlkZGVuIjsKCQlpbm5lckRpdi5zdHlsZS5wb3NpdGlvbiA9ICJyZWxhdGl2ZSI7CgoJCXRoaXMuc3VidHJhY3RzQm9yZGVyRm9yT3ZlcmZsb3dOb3RWaXNpYmxlID0gKGNoZWNrRGl2Lm9mZnNldFRvcCA9PT0gLTUpOwoKCQl0aGlzLmRvZXNOb3RJbmNsdWRlTWFyZ2luSW5Cb2R5T2Zmc2V0ID0gKGJvZHkub2Zmc2V0VG9wICE9PSBib2R5TWFyZ2luVG9wKTsKCgkJYm9keS5yZW1vdmVDaGlsZCggY29udGFpbmVyICk7CgkJalF1ZXJ5Lm9mZnNldC5pbml0aWFsaXplID0galF1ZXJ5Lm5vb3A7Cgl9LAoKCWJvZHlPZmZzZXQ6IGZ1bmN0aW9uKCBib2R5ICkgewoJCXZhciB0b3AgPSBib2R5Lm9mZnNldFRvcCwKCQkJbGVmdCA9IGJvZHkub2Zmc2V0TGVmdDsKCgkJalF1ZXJ5Lm9mZnNldC5pbml0aWFsaXplKCk7CgoJCWlmICggalF1ZXJ5Lm9mZnNldC5kb2VzTm90SW5jbHVkZU1hcmdpbkluQm9keU9mZnNldCApIHsKCQkJdG9wICArPSBwYXJzZUZsb2F0KCBqUXVlcnkuY3NzKGJvZHksICJtYXJnaW5Ub3AiKSApIHx8IDA7CgkJCWxlZnQgKz0gcGFyc2VGbG9hdCggalF1ZXJ5LmNzcyhib2R5LCAibWFyZ2luTGVmdCIpICkgfHwgMDsKCQl9CgoJCXJldHVybiB7IHRvcDogdG9wLCBsZWZ0OiBsZWZ0IH07Cgl9LAoKCXNldE9mZnNldDogZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIGkgKSB7CgkJdmFyIHBvc2l0aW9uID0galF1ZXJ5LmNzcyggZWxlbSwgInBvc2l0aW9uIiApOwoKCQkvLyBzZXQgcG9zaXRpb24gZmlyc3QsIGluLWNhc2UgdG9wL2xlZnQgYXJlIHNldCBldmVuIG9uIHN0YXRpYyBlbGVtCgkJaWYgKCBwb3NpdGlvbiA9PT0gInN0YXRpYyIgKSB7CgkJCWVsZW0uc3R5bGUucG9zaXRpb24gPSAicmVsYXRpdmUiOwoJCX0KCgkJdmFyIGN1ckVsZW0gPSBqUXVlcnkoIGVsZW0gKSwKCQkJY3VyT2Zmc2V0ID0gY3VyRWxlbS5vZmZzZXQoKSwKCQkJY3VyQ1NTVG9wID0galF1ZXJ5LmNzcyggZWxlbSwgInRvcCIgKSwKCQkJY3VyQ1NTTGVmdCA9IGpRdWVyeS5jc3MoIGVsZW0sICJsZWZ0IiApLAoJCQljYWxjdWxhdGVQb3NpdGlvbiA9IChwb3NpdGlvbiA9PT0gImFic29sdXRlIiB8fCBwb3NpdGlvbiA9PT0gImZpeGVkIikgJiYgalF1ZXJ5LmluQXJyYXkoImF1dG8iLCBbY3VyQ1NTVG9wLCBjdXJDU1NMZWZ0XSkgPiAtMSwKCQkJcHJvcHMgPSB7fSwgY3VyUG9zaXRpb24gPSB7fSwgY3VyVG9wLCBjdXJMZWZ0OwoKCQkvLyBuZWVkIHRvIGJlIGFibGUgdG8gY2FsY3VsYXRlIHBvc2l0aW9uIGlmIGVpdGhlciB0b3Agb3IgbGVmdCBpcyBhdXRvIGFuZCBwb3NpdGlvbiBpcyBlaXRoZXIgYWJzb2x1dGUgb3IgZml4ZWQKCQlpZiAoIGNhbGN1bGF0ZVBvc2l0aW9uICkgewoJCQljdXJQb3NpdGlvbiA9IGN1ckVsZW0ucG9zaXRpb24oKTsKCQkJY3VyVG9wID0gY3VyUG9zaXRpb24udG9wOwoJCQljdXJMZWZ0ID0gY3VyUG9zaXRpb24ubGVmdDsKCQl9IGVsc2UgewoJCQljdXJUb3AgPSBwYXJzZUZsb2F0KCBjdXJDU1NUb3AgKSB8fCAwOwoJCQljdXJMZWZ0ID0gcGFyc2VGbG9hdCggY3VyQ1NTTGVmdCApIHx8IDA7CgkJfQoKCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBvcHRpb25zICkgKSB7CgkJCW9wdGlvbnMgPSBvcHRpb25zLmNhbGwoIGVsZW0sIGksIGN1ck9mZnNldCApOwoJCX0KCgkJaWYgKG9wdGlvbnMudG9wICE9IG51bGwpIHsKCQkJcHJvcHMudG9wID0gKG9wdGlvbnMudG9wIC0gY3VyT2Zmc2V0LnRvcCkgKyBjdXJUb3A7CgkJfQoJCWlmIChvcHRpb25zLmxlZnQgIT0gbnVsbCkgewoJCQlwcm9wcy5sZWZ0ID0gKG9wdGlvbnMubGVmdCAtIGN1ck9mZnNldC5sZWZ0KSArIGN1ckxlZnQ7CgkJfQoKCQlpZiAoICJ1c2luZyIgaW4gb3B0aW9ucyApIHsKCQkJb3B0aW9ucy51c2luZy5jYWxsKCBlbGVtLCBwcm9wcyApOwoJCX0gZWxzZSB7CgkJCWN1ckVsZW0uY3NzKCBwcm9wcyApOwoJCX0KCX0KfTsKCgpqUXVlcnkuZm4uZXh0ZW5kKHsKCXBvc2l0aW9uOiBmdW5jdGlvbigpIHsKCQlpZiAoICF0aGlzWzBdICkgewoJCQlyZXR1cm4gbnVsbDsKCQl9CgoJCXZhciBlbGVtID0gdGhpc1swXSwKCgkJLy8gR2V0ICpyZWFsKiBvZmZzZXRQYXJlbnQKCQlvZmZzZXRQYXJlbnQgPSB0aGlzLm9mZnNldFBhcmVudCgpLAoKCQkvLyBHZXQgY29ycmVjdCBvZmZzZXRzCgkJb2Zmc2V0ICAgICAgID0gdGhpcy5vZmZzZXQoKSwKCQlwYXJlbnRPZmZzZXQgPSBycm9vdC50ZXN0KG9mZnNldFBhcmVudFswXS5ub2RlTmFtZSkgPyB7IHRvcDogMCwgbGVmdDogMCB9IDogb2Zmc2V0UGFyZW50Lm9mZnNldCgpOwoKCQkvLyBTdWJ0cmFjdCBlbGVtZW50IG1hcmdpbnMKCQkvLyBub3RlOiB3aGVuIGFuIGVsZW1lbnQgaGFzIG1hcmdpbjogYXV0byB0aGUgb2Zmc2V0TGVmdCBhbmQgbWFyZ2luTGVmdAoJCS8vIGFyZSB0aGUgc2FtZSBpbiBTYWZhcmkgY2F1c2luZyBvZmZzZXQubGVmdCB0byBpbmNvcnJlY3RseSBiZSAwCgkJb2Zmc2V0LnRvcCAgLT0gcGFyc2VGbG9hdCggalF1ZXJ5LmNzcyhlbGVtLCAibWFyZ2luVG9wIikgKSB8fCAwOwoJCW9mZnNldC5sZWZ0IC09IHBhcnNlRmxvYXQoIGpRdWVyeS5jc3MoZWxlbSwgIm1hcmdpbkxlZnQiKSApIHx8IDA7CgoJCS8vIEFkZCBvZmZzZXRQYXJlbnQgYm9yZGVycwoJCXBhcmVudE9mZnNldC50b3AgICs9IHBhcnNlRmxvYXQoIGpRdWVyeS5jc3Mob2Zmc2V0UGFyZW50WzBdLCAiYm9yZGVyVG9wV2lkdGgiKSApIHx8IDA7CgkJcGFyZW50T2Zmc2V0LmxlZnQgKz0gcGFyc2VGbG9hdCggalF1ZXJ5LmNzcyhvZmZzZXRQYXJlbnRbMF0sICJib3JkZXJMZWZ0V2lkdGgiKSApIHx8IDA7CgoJCS8vIFN1YnRyYWN0IHRoZSB0d28gb2Zmc2V0cwoJCXJldHVybiB7CgkJCXRvcDogIG9mZnNldC50b3AgIC0gcGFyZW50T2Zmc2V0LnRvcCwKCQkJbGVmdDogb2Zmc2V0LmxlZnQgLSBwYXJlbnRPZmZzZXQubGVmdAoJCX07Cgl9LAoKCW9mZnNldFBhcmVudDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCkgewoJCQl2YXIgb2Zmc2V0UGFyZW50ID0gdGhpcy5vZmZzZXRQYXJlbnQgfHwgZG9jdW1lbnQuYm9keTsKCQkJd2hpbGUgKCBvZmZzZXRQYXJlbnQgJiYgKCFycm9vdC50ZXN0KG9mZnNldFBhcmVudC5ub2RlTmFtZSkgJiYgalF1ZXJ5LmNzcyhvZmZzZXRQYXJlbnQsICJwb3NpdGlvbiIpID09PSAic3RhdGljIikgKSB7CgkJCQlvZmZzZXRQYXJlbnQgPSBvZmZzZXRQYXJlbnQub2Zmc2V0UGFyZW50OwoJCQl9CgkJCXJldHVybiBvZmZzZXRQYXJlbnQ7CgkJfSk7Cgl9Cn0pOwoKCi8vIENyZWF0ZSBzY3JvbGxMZWZ0IGFuZCBzY3JvbGxUb3AgbWV0aG9kcwpqUXVlcnkuZWFjaCggWyJMZWZ0IiwgIlRvcCJdLCBmdW5jdGlvbiggaSwgbmFtZSApIHsKCXZhciBtZXRob2QgPSAic2Nyb2xsIiArIG5hbWU7CgoJalF1ZXJ5LmZuWyBtZXRob2QgXSA9IGZ1bmN0aW9uKCB2YWwgKSB7CgkJdmFyIGVsZW0sIHdpbjsKCgkJaWYgKCB2YWwgPT09IHVuZGVmaW5lZCApIHsKCQkJZWxlbSA9IHRoaXNbIDAgXTsKCgkJCWlmICggIWVsZW0gKSB7CgkJCQlyZXR1cm4gbnVsbDsKCQkJfQoKCQkJd2luID0gZ2V0V2luZG93KCBlbGVtICk7CgoJCQkvLyBSZXR1cm4gdGhlIHNjcm9sbCBvZmZzZXQKCQkJcmV0dXJuIHdpbiA/ICgicGFnZVhPZmZzZXQiIGluIHdpbikgPyB3aW5bIGkgPyAicGFnZVlPZmZzZXQiIDogInBhZ2VYT2Zmc2V0IiBdIDoKCQkJCWpRdWVyeS5zdXBwb3J0LmJveE1vZGVsICYmIHdpbi5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbIG1ldGhvZCBdIHx8CgkJCQkJd2luLmRvY3VtZW50LmJvZHlbIG1ldGhvZCBdIDoKCQkJCWVsZW1bIG1ldGhvZCBdOwoJCX0KCgkJLy8gU2V0IHRoZSBzY3JvbGwgb2Zmc2V0CgkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKCQkJd2luID0gZ2V0V2luZG93KCB0aGlzICk7CgoJCQlpZiAoIHdpbiApIHsKCQkJCXdpbi5zY3JvbGxUbygKCQkJCQkhaSA/IHZhbCA6IGpRdWVyeSggd2luICkuc2Nyb2xsTGVmdCgpLAoJCQkJCSBpID8gdmFsIDogalF1ZXJ5KCB3aW4gKS5zY3JvbGxUb3AoKQoJCQkJKTsKCgkJCX0gZWxzZSB7CgkJCQl0aGlzWyBtZXRob2QgXSA9IHZhbDsKCQkJfQoJCX0pOwoJfTsKfSk7CgpmdW5jdGlvbiBnZXRXaW5kb3coIGVsZW0gKSB7CglyZXR1cm4galF1ZXJ5LmlzV2luZG93KCBlbGVtICkgPwoJCWVsZW0gOgoJCWVsZW0ubm9kZVR5cGUgPT09IDkgPwoJCQllbGVtLmRlZmF1bHRWaWV3IHx8IGVsZW0ucGFyZW50V2luZG93IDoKCQkJZmFsc2U7Cn0KCgoKCi8vIENyZWF0ZSB3aWR0aCwgaGVpZ2h0LCBpbm5lckhlaWdodCwgaW5uZXJXaWR0aCwgb3V0ZXJIZWlnaHQgYW5kIG91dGVyV2lkdGggbWV0aG9kcwpqUXVlcnkuZWFjaChbICJIZWlnaHQiLCAiV2lkdGgiIF0sIGZ1bmN0aW9uKCBpLCBuYW1lICkgewoKCXZhciB0eXBlID0gbmFtZS50b0xvd2VyQ2FzZSgpOwoKCS8vIGlubmVySGVpZ2h0IGFuZCBpbm5lcldpZHRoCglqUXVlcnkuZm5bICJpbm5lciIgKyBuYW1lIF0gPSBmdW5jdGlvbigpIHsKCQl2YXIgZWxlbSA9IHRoaXNbMF07CgkJcmV0dXJuIGVsZW0gJiYgZWxlbS5zdHlsZSA/CgkJCXBhcnNlRmxvYXQoIGpRdWVyeS5jc3MoIGVsZW0sIHR5cGUsICJwYWRkaW5nIiApICkgOgoJCQludWxsOwoJfTsKCgkvLyBvdXRlckhlaWdodCBhbmQgb3V0ZXJXaWR0aAoJalF1ZXJ5LmZuWyAib3V0ZXIiICsgbmFtZSBdID0gZnVuY3Rpb24oIG1hcmdpbiApIHsKCQl2YXIgZWxlbSA9IHRoaXNbMF07CgkJcmV0dXJuIGVsZW0gJiYgZWxlbS5zdHlsZSA/CgkJCXBhcnNlRmxvYXQoIGpRdWVyeS5jc3MoIGVsZW0sIHR5cGUsIG1hcmdpbiA/ICJtYXJnaW4iIDogImJvcmRlciIgKSApIDoKCQkJbnVsbDsKCX07CgoJalF1ZXJ5LmZuWyB0eXBlIF0gPSBmdW5jdGlvbiggc2l6ZSApIHsKCQkvLyBHZXQgd2luZG93IHdpZHRoIG9yIGhlaWdodAoJCXZhciBlbGVtID0gdGhpc1swXTsKCQlpZiAoICFlbGVtICkgewoJCQlyZXR1cm4gc2l6ZSA9PSBudWxsID8gbnVsbCA6IHRoaXM7CgkJfQoKCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBzaXplICkgKSB7CgkJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oIGkgKSB7CgkJCQl2YXIgc2VsZiA9IGpRdWVyeSggdGhpcyApOwoJCQkJc2VsZlsgdHlwZSBdKCBzaXplLmNhbGwoIHRoaXMsIGksIHNlbGZbIHR5cGUgXSgpICkgKTsKCQkJfSk7CgkJfQoKCQlpZiAoIGpRdWVyeS5pc1dpbmRvdyggZWxlbSApICkgewoJCQkvLyBFdmVyeW9uZSBlbHNlIHVzZSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgb3IgZG9jdW1lbnQuYm9keSBkZXBlbmRpbmcgb24gUXVpcmtzIHZzIFN0YW5kYXJkcyBtb2RlCgkJCS8vIDNyZCBjb25kaXRpb24gYWxsb3dzIE5va2lhIHN1cHBvcnQsIGFzIGl0IHN1cHBvcnRzIHRoZSBkb2NFbGVtIHByb3AgYnV0IG5vdCBDU1MxQ29tcGF0CgkJCXZhciBkb2NFbGVtUHJvcCA9IGVsZW0uZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50WyAiY2xpZW50IiArIG5hbWUgXSwKCQkJCWJvZHkgPSBlbGVtLmRvY3VtZW50LmJvZHk7CgkJCXJldHVybiBlbGVtLmRvY3VtZW50LmNvbXBhdE1vZGUgPT09ICJDU1MxQ29tcGF0IiAmJiBkb2NFbGVtUHJvcCB8fAoJCQkJYm9keSAmJiBib2R5WyAiY2xpZW50IiArIG5hbWUgXSB8fCBkb2NFbGVtUHJvcDsKCgkJLy8gR2V0IGRvY3VtZW50IHdpZHRoIG9yIGhlaWdodAoJCX0gZWxzZSBpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDkgKSB7CgkJCS8vIEVpdGhlciBzY3JvbGxbV2lkdGgvSGVpZ2h0XSBvciBvZmZzZXRbV2lkdGgvSGVpZ2h0XSwgd2hpY2hldmVyIGlzIGdyZWF0ZXIKCQkJcmV0dXJuIE1hdGgubWF4KAoJCQkJZWxlbS5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIgKyBuYW1lXSwKCQkJCWVsZW0uYm9keVsic2Nyb2xsIiArIG5hbWVdLCBlbGVtLmRvY3VtZW50RWxlbWVudFsic2Nyb2xsIiArIG5hbWVdLAoJCQkJZWxlbS5ib2R5WyJvZmZzZXQiICsgbmFtZV0sIGVsZW0uZG9jdW1lbnRFbGVtZW50WyJvZmZzZXQiICsgbmFtZV0KCQkJKTsKCgkJLy8gR2V0IG9yIHNldCB3aWR0aCBvciBoZWlnaHQgb24gdGhlIGVsZW1lbnQKCQl9IGVsc2UgaWYgKCBzaXplID09PSB1bmRlZmluZWQgKSB7CgkJCXZhciBvcmlnID0galF1ZXJ5LmNzcyggZWxlbSwgdHlwZSApLAoJCQkJcmV0ID0gcGFyc2VGbG9hdCggb3JpZyApOwoKCQkJcmV0dXJuIGpRdWVyeS5pc05hTiggcmV0ICkgPyBvcmlnIDogcmV0OwoKCQkvLyBTZXQgdGhlIHdpZHRoIG9yIGhlaWdodCBvbiB0aGUgZWxlbWVudCAoZGVmYXVsdCB0byBwaXhlbHMgaWYgdmFsdWUgaXMgdW5pdGxlc3MpCgkJfSBlbHNlIHsKCQkJcmV0dXJuIHRoaXMuY3NzKCB0eXBlLCB0eXBlb2Ygc2l6ZSA9PT0gInN0cmluZyIgPyBzaXplIDogc2l6ZSArICJweCIgKTsKCQl9Cgl9OwoKfSk7CgoKLy8gRXhwb3NlIGpRdWVyeSB0byB0aGUgZ2xvYmFsIG9iamVjdAp3aW5kb3cualF1ZXJ5ID0gd2luZG93LiQgPSBqUXVlcnk7Cn0pKHdpbmRvdyk7Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/lib/themeswitchertool.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogalF1ZXJ5IHBsdWdpbiB0aGVtZXN3aXRjaGVyCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiQuZm4udGhlbWVzd2l0Y2hlciA9IGZ1bmN0aW9uKHNldHRpbmdzKXsKCXZhciBvcHRpb25zID0galF1ZXJ5LmV4dGVuZCh7CgkJbG9hZFRoZW1lOiBudWxsLAoJCWluaXRpYWxUZXh0OiAnU3dpdGNoIFRoZW1lJywKCQl3aWR0aDogMTUwLAoJCWhlaWdodDogMjAwLAoJCWJ1dHRvblByZVRleHQ6ICdUaGVtZTogJywKCQljbG9zZU9uU2VsZWN0OiB0cnVlLAoJCWJ1dHRvbkhlaWdodDogMTQsCgkJY29va2llTmFtZTogJ2pxdWVyeS11aS10aGVtZScsCgkJb25PcGVuOiBmdW5jdGlvbigpe30sCgkJb25DbG9zZTogZnVuY3Rpb24oKXt9LAoJCW9uU2VsZWN0OiBmdW5jdGlvbigpe30KCX0sIHNldHRpbmdzKTsKCgkvL21hcmt1cCAKCXZhciBidXR0b24gPSAkKCc8YSBocmVmPSIjIiBjbGFzcz0ianF1ZXJ5LXVpLXRoZW1lc3dpdGNoZXItdHJpZ2dlciI+PHNwYW4gY2xhc3M9ImpxdWVyeS11aS10aGVtZXN3aXRjaGVyLWljb24iPjwvc3Bhbj48c3BhbiBjbGFzcz0ianF1ZXJ5LXVpLXRoZW1lc3dpdGNoZXItdGl0bGUiPicrIG9wdGlvbnMuaW5pdGlhbFRleHQgKyc8L3NwYW4+PC9hPicpOwoJdmFyIHN3aXRjaGVycGFuZSA9ICQoJzxkaXYgY2xhc3M9ImpxdWVyeS11aS10aGVtZXN3aXRjaGVyIj48ZGl2IGlkPSJ0aGVtZUdhbGxlcnkiPgk8dWw+CQk8bGk+PGEgaHJlZj0iaHR0cDovL2pxdWVyeXVpLmNvbS90aGVtZXJvbGxlci9jc3MvcGFyc2VUaGVtZS5jc3MucGhwP2ZmRGVmYXVsdD1UcmVidWNoZXQrTVMsK1RhaG9tYSwrVmVyZGFuYSwrQXJpYWwsK3NhbnMtc2VyaWYmYW1wO2Z3RGVmYXVsdD1ib2xkJmFtcDtmc0RlZmF1bHQ9MS4xZW0mYW1wO2Nvcm5lclJhZGl1cz00cHgmYW1wO2JnQ29sb3JIZWFkZXI9ZjZhODI4JmFtcDtiZ1RleHR1cmVIZWFkZXI9MTJfZ2xvc3Nfd2F2ZS5wbmcmYW1wO2JnSW1nT3BhY2l0eUhlYWRlcj0zNSZhbXA7Ym9yZGVyQ29sb3JIZWFkZXI9ZTc4ZjA4JmFtcDtmY0hlYWRlcj1mZmZmZmYmYW1wO2ljb25Db2xvckhlYWRlcj1mZmZmZmYmYW1wO2JnQ29sb3JDb250ZW50PWVlZWVlZSZhbXA7YmdUZXh0dXJlQ29udGVudD0wM19oaWdobGlnaHRfc29mdC5wbmcmYW1wO2JnSW1nT3BhY2l0eUNvbnRlbnQ9MTAwJmFtcDtib3JkZXJDb2xvckNvbnRlbnQ9ZGRkZGRkJmFtcDtmY0NvbnRlbnQ9MzMzMzMzJmFtcDtpY29uQ29sb3JDb250ZW50PTIyMjIyMiZhbXA7YmdDb2xvckRlZmF1bHQ9ZjZmNmY2JmFtcDtiZ1RleHR1cmVEZWZhdWx0PTAyX2dsYXNzLnBuZyZhbXA7YmdJbWdPcGFjaXR5RGVmYXVsdD0xMDAmYW1wO2JvcmRlckNvbG9yRGVmYXVsdD1jY2NjY2MmYW1wO2ZjRGVmYXVsdD0xYzk0YzQmYW1wO2ljb25Db2xvckRlZmF1bHQ9ZWY4YzA4JmFtcDtiZ0NvbG9ySG92ZXI9ZmRmNWNlJmFtcDtiZ1RleHR1cmVIb3Zlcj0wMl9nbGFzcy5wbmcmYW1wO2JnSW1nT3BhY2l0eUhvdmVyPTEwMCZhbXA7Ym9yZGVyQ29sb3JIb3Zlcj1mYmNiMDkmYW1wO2ZjSG92ZXI9Yzc3NDA1JmFtcDtpY29uQ29sb3JIb3Zlcj1lZjhjMDgmYW1wO2JnQ29sb3JBY3RpdmU9ZmZmZmZmJmFtcDtiZ1RleHR1cmVBY3RpdmU9MDJfZ2xhc3MucG5nJmFtcDtiZ0ltZ09wYWNpdHlBY3RpdmU9NjUmYW1wO2JvcmRlckNvbG9yQWN0aXZlPWZiZDg1MCZhbXA7ZmNBY3RpdmU9ZWI4ZjAwJmFtcDtpY29uQ29sb3JBY3RpdmU9ZWY4YzA4JmFtcDtiZ0NvbG9ySGlnaGxpZ2h0PWZmZTQ1YyZhbXA7YmdUZXh0dXJlSGlnaGxpZ2h0PTAzX2hpZ2hsaWdodF9zb2Z0LnBuZyZhbXA7YmdJbWdPcGFjaXR5SGlnaGxpZ2h0PTc1JmFtcDtib3JkZXJDb2xvckhpZ2hsaWdodD1mZWQyMmYmYW1wO2ZjSGlnaGxpZ2h0PTM2MzYzNiZhbXA7aWNvbkNvbG9ySGlnaGxpZ2h0PTIyOGVmMSZhbXA7YmdDb2xvckVycm9yPWI4MTkwMCZhbXA7YmdUZXh0dXJlRXJyb3I9MDhfZGlhZ29uYWxzX3RoaWNrLnBuZyZhbXA7YmdJbWdPcGFjaXR5RXJyb3I9MTgmYW1wO2JvcmRlckNvbG9yRXJyb3I9Y2QwYTBhJmFtcDtmY0Vycm9yPWZmZmZmZiZhbXA7aWNvbkNvbG9yRXJyb3I9ZmZkMjdhJmFtcDtiZ0NvbG9yT3ZlcmxheT02NjY2NjYmYW1wO2JnVGV4dHVyZU92ZXJsYXk9MDhfZGlhZ29uYWxzX3RoaWNrLnBuZyZhbXA7YmdJbWdPcGFjaXR5T3ZlcmxheT0yMCZhbXA7b3BhY2l0eU92ZXJsYXk9NTAmYW1wO2JnQ29sb3JTaGFkb3c9MDAwMDAwJmFtcDtiZ1RleHR1cmVTaGFkb3c9MDFfZmxhdC5wbmcmYW1wO2JnSW1nT3BhY2l0eVNoYWRvdz0xMCZhbXA7b3BhY2l0eVNoYWRvdz0yMCZhbXA7dGhpY2tuZXNzU2hhZG93PTVweCZhbXA7b2Zmc2V0VG9wU2hhZG93PS01cHgmYW1wO29mZnNldExlZnRTaGFkb3c9LTVweCZhbXA7Y29ybmVyUmFkaXVzU2hhZG93PTVweCI+CQkJPGltZyBzcmM9Imh0dHA6Ly9sZWFybmluZ2pxdWVyeS5rc3dlZGJlcmcubmV0ZG5hLWNkbi5jb20vd3AtY29udGVudC91cGxvYWRzL3RoZW1lcm9sbGVyL3RoZW1lXzkwX3VpX2xpZ2h0LnBuZyIgYWx0PSJVSSBMaWdodG5lc3MiIHRpdGxlPSJVSSBMaWdodG5lc3MiIC8+CQkJPHNwYW4gY2xhc3M9InRoZW1lTmFtZSI+VUkgbGlnaHRuZXNzPC9zcGFuPgkJPC9hPjwvbGk+CQkJCTxsaT48YSBocmVmPSJodHRwOi8vanF1ZXJ5dWkuY29tL3RoZW1lcm9sbGVyL2Nzcy9wYXJzZVRoZW1lLmNzcy5waHA/ZmZEZWZhdWx0PVNlZ29lK1VJJTJDK0FyaWFsJTJDK3NhbnMtc2VyaWYmYW1wO2Z3RGVmYXVsdD1ib2xkJmFtcDtmc0RlZmF1bHQ9MS4xZW0mYW1wO2Nvcm5lclJhZGl1cz02cHgmYW1wO2JnQ29sb3JIZWFkZXI9MzMzMzMzJmFtcDtiZ1RleHR1cmVIZWFkZXI9MTJfZ2xvc3Nfd2F2ZS5wbmcmYW1wO2JnSW1nT3BhY2l0eUhlYWRlcj0yNSZhbXA7Ym9yZGVyQ29sb3JIZWFkZXI9MzMzMzMzJmFtcDtmY0hlYWRlcj1mZmZmZmYmYW1wO2ljb25Db2xvckhlYWRlcj1mZmZmZmYmYW1wO2JnQ29sb3JDb250ZW50PTAwMDAwMCZhbXA7YmdUZXh0dXJlQ29udGVudD0wNV9pbnNldF9zb2Z0LnBuZyZhbXA7YmdJbWdPcGFjaXR5Q29udGVudD0yNSZhbXA7Ym9yZGVyQ29sb3JDb250ZW50PTY2NjY2NiZhbXA7ZmNDb250ZW50PWZmZmZmZiZhbXA7aWNvbkNvbG9yQ29udGVudD1jY2NjY2MmYW1wO2JnQ29sb3JEZWZhdWx0PTU1NTU1NSZhbXA7YmdUZXh0dXJlRGVmYXVsdD0wMl9nbGFzcy5wbmcmYW1wO2JnSW1nT3BhY2l0eURlZmF1bHQ9MjAmYW1wO2JvcmRlckNvbG9yRGVmYXVsdD02NjY2NjYmYW1wO2ZjRGVmYXVsdD1lZWVlZWUmYW1wO2ljb25Db2xvckRlZmF1bHQ9Y2NjY2NjJmFtcDtiZ0NvbG9ySG92ZXI9MDA3OGEzJmFtcDtiZ1RleHR1cmVIb3Zlcj0wMl9nbGFzcy5wbmcmYW1wO2JnSW1nT3BhY2l0eUhvdmVyPTQwJmFtcDtib3JkZXJDb2xvckhvdmVyPTU5YjRkNCZhbXA7ZmNIb3Zlcj1mZmZmZmYmYW1wO2ljb25Db2xvckhvdmVyPWZmZmZmZiZhbXA7YmdDb2xvckFjdGl2ZT1mNTg0MDAmYW1wO2JnVGV4dHVyZUFjdGl2ZT0wNV9pbnNldF9zb2Z0LnBuZyZhbXA7YmdJbWdPcGFjaXR5QWN0aXZlPTMwJmFtcDtib3JkZXJDb2xvckFjdGl2ZT1mZmFmMGYmYW1wO2ZjQWN0aXZlPWZmZmZmZiZhbXA7aWNvbkNvbG9yQWN0aXZlPTIyMjIyMiZhbXA7YmdDb2xvckhpZ2hsaWdodD1lZWVlZWUmYW1wO2JnVGV4dHVyZUhpZ2hsaWdodD0wM19oaWdobGlnaHRfc29mdC5wbmcmYW1wO2JnSW1nT3BhY2l0eUhpZ2hsaWdodD04MCZhbXA7Ym9yZGVyQ29sb3JIaWdobGlnaHQ9Y2NjY2NjJmFtcDtmY0hpZ2hsaWdodD0yZTdkYjImYW1wO2ljb25Db2xvckhpZ2hsaWdodD00YjhlMGImYW1wO2JnQ29sb3JFcnJvcj1mZmM3M2QmYW1wO2JnVGV4dHVyZUVycm9yPTAyX2dsYXNzLnBuZyZhbXA7YmdJbWdPcGFjaXR5RXJyb3I9NDAmYW1wO2JvcmRlckNvbG9yRXJyb3I9ZmZiNzNkJmFtcDtmY0Vycm9yPTExMTExMSZhbXA7aWNvbkNvbG9yRXJyb3I9YTgzMzAwJmFtcDtiZ0NvbG9yT3ZlcmxheT01YzVjNWMmYW1wO2JnVGV4dHVyZU92ZXJsYXk9MDFfZmxhdC5wbmcmYW1wO2JnSW1nT3BhY2l0eU92ZXJsYXk9NTAmYW1wO29wYWNpdHlPdmVybGF5PTgwJmFtcDtiZ0NvbG9yU2hhZG93PWNjY2NjYyZhbXA7YmdUZXh0dXJlU2hhZG93PTAxX2ZsYXQucG5nJmFtcDtiZ0ltZ09wYWNpdHlTaGFkb3c9MzAmYW1wO29wYWNpdHlTaGFkb3c9NjAmYW1wO3RoaWNrbmVzc1NoYWRvdz03cHgmYW1wO29mZnNldFRvcFNoYWRvdz0tN3B4JmFtcDtvZmZzZXRMZWZ0U2hhZG93PS03cHgmYW1wO2Nvcm5lclJhZGl1c1NoYWRvdz04cHgiPgkJCTxpbWcgc3JjPSJodHRwOi8vbGVhcm5pbmdqcXVlcnkua3N3ZWRiZXJnLm5ldGRuYS1jZG4uY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy90aGVtZXJvbGxlci90aGVtZV85MF91aV9kYXJrLnBuZyIgYWx0PSJVSSBEYXJrbmVzcyIgdGl0bGU9IlVJIERhcmtuZXNzIiAvPgkJCTxzcGFuIGNsYXNzPSJ0aGVtZU5hbWUiPlVJIGRhcmtuZXNzPC9zcGFuPgkJPC9hPjwvbGk+CQkJPGxpPjxhIGhyZWY9Imh0dHA6Ly9qcXVlcnl1aS5jb20vdGhlbWVyb2xsZXIvY3NzL3BhcnNlVGhlbWUuY3NzLnBocD9mZkRlZmF1bHQ9VmVyZGFuYSxBcmlhbCxzYW5zLXNlcmlmJmFtcDtmd0RlZmF1bHQ9bm9ybWFsJmFtcDtmc0RlZmF1bHQ9MS4xZW0mYW1wO2Nvcm5lclJhZGl1cz00cHgmYW1wO2JnQ29sb3JIZWFkZXI9Y2NjY2NjJmFtcDtiZ1RleHR1cmVIZWFkZXI9MDNfaGlnaGxpZ2h0X3NvZnQucG5nJmFtcDtiZ0ltZ09wYWNpdHlIZWFkZXI9NzUmYW1wO2JvcmRlckNvbG9ySGVhZGVyPWFhYWFhYSZhbXA7ZmNIZWFkZXI9MjIyMjIyJmFtcDtpY29uQ29sb3JIZWFkZXI9MjIyMjIyJmFtcDtiZ0NvbG9yQ29udGVudD1mZmZmZmYmYW1wO2JnVGV4dHVyZUNvbnRlbnQ9MDFfZmxhdC5wbmcmYW1wO2JnSW1nT3BhY2l0eUNvbnRlbnQ9NzUmYW1wO2JvcmRlckNvbG9yQ29udGVudD1hYWFhYWEmYW1wO2ZjQ29udGVudD0yMjIyMjImYW1wO2ljb25Db2xvckNvbnRlbnQ9MjIyMjIyJmFtcDtiZ0NvbG9yRGVmYXVsdD1lNmU2ZTYmYW1wO2JnVGV4dHVyZURlZmF1bHQ9MDJfZ2xhc3MucG5nJmFtcDtiZ0ltZ09wYWNpdHlEZWZhdWx0PTc1JmFtcDtib3JkZXJDb2xvckRlZmF1bHQ9ZDNkM2QzJmFtcDtmY0RlZmF1bHQ9NTU1NTU1JmFtcDtpY29uQ29sb3JEZWZhdWx0PTg4ODg4OCZhbXA7YmdDb2xvckhvdmVyPWRhZGFkYSZhbXA7YmdUZXh0dXJlSG92ZXI9MDJfZ2xhc3MucG5nJmFtcDtiZ0ltZ09wYWNpdHlIb3Zlcj03NSZhbXA7Ym9yZGVyQ29sb3JIb3Zlcj05OTk5OTkmYW1wO2ZjSG92ZXI9MjEyMTIxJmFtcDtpY29uQ29sb3JIb3Zlcj00NTQ1NDUmYW1wO2JnQ29sb3JBY3RpdmU9ZmZmZmZmJmFtcDtiZ1RleHR1cmVBY3RpdmU9MDJfZ2xhc3MucG5nJmFtcDtiZ0ltZ09wYWNpdHlBY3RpdmU9NjUmYW1wO2JvcmRlckNvbG9yQWN0aXZlPWFhYWFhYSZhbXA7ZmNBY3RpdmU9MjEyMTIxJmFtcDtpY29uQ29sb3JBY3RpdmU9NDU0NTQ1JmFtcDtiZ0NvbG9ySGlnaGxpZ2h0PWZiZjllZSZhbXA7YmdUZXh0dXJlSGlnaGxpZ2h0PTAyX2dsYXNzLnBuZyZhbXA7YmdJbWdPcGFjaXR5SGlnaGxpZ2h0PTU1JmFtcDtib3JkZXJDb2xvckhpZ2hsaWdodD1mY2VmYTEmYW1wO2ZjSGlnaGxpZ2h0PTM2MzYzNiZhbXA7aWNvbkNvbG9ySGlnaGxpZ2h0PTJlODNmZiZhbXA7YmdDb2xvckVycm9yPWZlZjFlYyZhbXA7YmdUZXh0dXJlRXJyb3I9MDJfZ2xhc3MucG5nJmFtcDtiZ0ltZ09wYWNpdHlFcnJvcj05NSZhbXA7Ym9yZGVyQ29sb3JFcnJvcj1jZDBhMGEmYW1wO2ZjRXJyb3I9Y2QwYTBhJmFtcDtpY29uQ29sb3JFcnJvcj1jZDBhMGEmYW1wO2JnQ29sb3JPdmVybGF5PWFhYWFhYSZhbXA7YmdUZXh0dXJlT3ZlcmxheT0wMV9mbGF0LnBuZyZhbXA7YmdJbWdPcGFjaXR5T3ZlcmxheT0wJmFtcDtvcGFjaXR5T3ZlcmxheT0zMCZhbXA7YmdDb2xvclNoYWRvdz1hYWFhYWEmYW1wO2JnVGV4dHVyZVNoYWRvdz0wMV9mbGF0LnBuZyZhbXA7YmdJbWdPcGFjaXR5U2hhZG93PTAmYW1wO29wYWNpdHlTaGFkb3c9MzAmYW1wO3RoaWNrbmVzc1NoYWRvdz04cHgmYW1wO29mZnNldFRvcFNoYWRvdz0tOHB4JmFtcDtvZmZzZXRMZWZ0U2hhZG93PS04cHgmYW1wO2Nvcm5lclJhZGl1c1NoYWRvdz04cHgiPgkJCTxpbWcgc3JjPSJodHRwOi8vbGVhcm5pbmdqcXVlcnkua3N3ZWRiZXJnLm5ldGRuYS1jZG4uY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy90aGVtZXJvbGxlci90aGVtZV85MF9zbW9vdGhuZXNzLnBuZyIgYWx0PSJTbW9vdGhuZXNzIiB0aXRsZT0iU21vb3RobmVzcyIgLz4JCQk8c3BhbiBjbGFzcz0idGhlbWVOYW1lIj5TbW9vdGhuZXNzPC9zcGFuPgkJPC9hPjwvbGk+CQkJCQkJCTxsaT48YSBocmVmPSJodHRwOi8vanF1ZXJ5dWkuY29tL3RoZW1lcm9sbGVyL2Nzcy9wYXJzZVRoZW1lLmNzcy5waHA/ZmZEZWZhdWx0PVZlcmRhbmElMkNBcmlhbCUyQ3NhbnMtc2VyaWYmYW1wO2Z3RGVmYXVsdD1ub3JtYWwmYW1wO2ZzRGVmYXVsdD0xLjFlbSZhbXA7Y29ybmVyUmFkaXVzPTVweCZhbXA7YmdDb2xvckhlYWRlcj0yMTkxYzAmYW1wO2JnVGV4dHVyZUhlYWRlcj0xMl9nbG9zc193YXZlLnBuZyZhbXA7YmdJbWdPcGFjaXR5SGVhZGVyPTc1JmFtcDtib3JkZXJDb2xvckhlYWRlcj00Mjk3ZDcmYW1wO2ZjSGVhZGVyPWVhZjVmNyZhbXA7aWNvbkNvbG9ySGVhZGVyPWQ4ZTdmMyZhbXA7YmdDb2xvckNvbnRlbnQ9ZmNmZGZkJmFtcDtiZ1RleHR1cmVDb250ZW50PTA2X2luc2V0X2hhcmQucG5nJmFtcDtiZ0ltZ09wYWNpdHlDb250ZW50PTEwMCZhbXA7Ym9yZGVyQ29sb3JDb250ZW50PWE2YzllMiZhbXA7ZmNDb250ZW50PTIyMjIyMiZhbXA7aWNvbkNvbG9yQ29udGVudD0wMDc4YWUmYW1wO2JnQ29sb3JEZWZhdWx0PTAwNzhhZSZhbXA7YmdUZXh0dXJlRGVmYXVsdD0wMl9nbGFzcy5wbmcmYW1wO2JnSW1nT3BhY2l0eURlZmF1bHQ9NDUmYW1wO2JvcmRlckNvbG9yRGVmYXVsdD03N2Q1ZjcmYW1wO2ZjRGVmYXVsdD1mZmZmZmYmYW1wO2ljb25Db2xvckRlZmF1bHQ9ZTBmZGZmJmFtcDtiZ0NvbG9ySG92ZXI9NzljOWVjJmFtcDtiZ1RleHR1cmVIb3Zlcj0wMl9nbGFzcy5wbmcmYW1wO2JnSW1nT3BhY2l0eUhvdmVyPTc1JmFtcDtib3JkZXJDb2xvckhvdmVyPTQ0OGRhZSZhbXA7ZmNIb3Zlcj0wMjY4OTAmYW1wO2ljb25Db2xvckhvdmVyPTA1NmI5MyZhbXA7YmdDb2xvckFjdGl2ZT02ZWFjMmMmYW1wO2JnVGV4dHVyZUFjdGl2ZT0xMl9nbG9zc193YXZlLnBuZyZhbXA7YmdJbWdPcGFjaXR5QWN0aXZlPTUwJmFtcDtib3JkZXJDb2xvckFjdGl2ZT1hY2RkNGEmYW1wO2ZjQWN0aXZlPWZmZmZmZiZhbXA7aWNvbkNvbG9yQWN0aXZlPWY1ZTE3NSZhbXA7YmdDb2xvckhpZ2hsaWdodD1mOGRhNGUmYW1wO2JnVGV4dHVyZUhpZ2hsaWdodD0wMl9nbGFzcy5wbmcmYW1wO2JnSW1nT3BhY2l0eUhpZ2hsaWdodD01NSZhbXA7Ym9yZGVyQ29sb3JIaWdobGlnaHQ9ZmNkMTEzJmFtcDtmY0hpZ2hsaWdodD05MTU2MDgmYW1wO2ljb25Db2xvckhpZ2hsaWdodD1mN2E1MGQmYW1wO2JnQ29sb3JFcnJvcj1lMTRmMWMmYW1wO2JnVGV4dHVyZUVycm9yPTEyX2dsb3NzX3dhdmUucG5nJmFtcDtiZ0ltZ09wYWNpdHlFcnJvcj00NSZhbXA7Ym9yZGVyQ29sb3JFcnJvcj1jZDBhMGEmYW1wO2ZjRXJyb3I9ZmZmZmZmJmFtcDtpY29uQ29sb3JFcnJvcj1mY2QxMTMmYW1wO2JnQ29sb3JPdmVybGF5PWFhYWFhYSZhbXA7YmdUZXh0dXJlT3ZlcmxheT0wMV9mbGF0LnBuZyZhbXA7YmdJbWdPcGFjaXR5T3ZlcmxheT03NSZhbXA7b3BhY2l0eU92ZXJsYXk9MzAmYW1wO2JnQ29sb3JTaGFkb3c9OTk5OTk5JmFtcDtiZ1RleHR1cmVTaGFkb3c9MDFfZmxhdC5wbmcmYW1wO2JnSW1nT3BhY2l0eVNoYWRvdz01NSZhbXA7b3BhY2l0eVNoYWRvdz00NSZhbXA7dGhpY2tuZXNzU2hhZG93PTBweCZhbXA7b2Zmc2V0VG9wU2hhZG93PTVweCZhbXA7b2Zmc2V0TGVmdFNoYWRvdz01cHgmYW1wO2Nvcm5lclJhZGl1c1NoYWRvdz01cHgiPgkJCTxpbWcgc3JjPSJodHRwOi8vbGVhcm5pbmdqcXVlcnkua3N3ZWRiZXJnLm5ldGRuYS1jZG4uY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy90aGVtZXJvbGxlci90aGVtZV85MF9zdGFydF9tZW51LnBuZyIgYWx0PSJTdGFydCIgdGl0bGU9IlN0YXJ0IiAvPgkJCTxzcGFuIGNsYXNzPSJ0aGVtZU5hbWUiPlN0YXJ0PC9zcGFuPgkJPC9hPjwvbGk+CQkJCTxsaT48YSBocmVmPSJodHRwOi8vanF1ZXJ5dWkuY29tL3RoZW1lcm9sbGVyL2Nzcy9wYXJzZVRoZW1lLmNzcy5waHA/ZmZEZWZhdWx0PUx1Y2lkYStHcmFuZGUsK0x1Y2lkYStTYW5zLCtBcmlhbCwrc2Fucy1zZXJpZiZhbXA7ZndEZWZhdWx0PWJvbGQmYW1wO2ZzRGVmYXVsdD0xLjFlbSZhbXA7Y29ybmVyUmFkaXVzPTVweCZhbXA7YmdDb2xvckhlYWRlcj01YzljY2MmYW1wO2JnVGV4dHVyZUhlYWRlcj0xMl9nbG9zc193YXZlLnBuZyZhbXA7YmdJbWdPcGFjaXR5SGVhZGVyPTU1JmFtcDtib3JkZXJDb2xvckhlYWRlcj00Mjk3ZDcmYW1wO2ZjSGVhZGVyPWZmZmZmZiZhbXA7aWNvbkNvbG9ySGVhZGVyPWQ4ZTdmMyZhbXA7YmdDb2xvckNvbnRlbnQ9ZmNmZGZkJmFtcDtiZ1RleHR1cmVDb250ZW50PTA2X2luc2V0X2hhcmQucG5nJmFtcDtiZ0ltZ09wYWNpdHlDb250ZW50PTEwMCZhbXA7Ym9yZGVyQ29sb3JDb250ZW50PWE2YzllMiZhbXA7ZmNDb250ZW50PTIyMjIyMiZhbXA7aWNvbkNvbG9yQ29udGVudD00NjliZGQmYW1wO2JnQ29sb3JEZWZhdWx0PWRmZWZmYyZhbXA7YmdUZXh0dXJlRGVmYXVsdD0wMl9nbGFzcy5wbmcmYW1wO2JnSW1nT3BhY2l0eURlZmF1bHQ9ODUmYW1wO2JvcmRlckNvbG9yRGVmYXVsdD1jNWRiZWMmYW1wO2ZjRGVmYXVsdD0yZTZlOWUmYW1wO2ljb25Db2xvckRlZmF1bHQ9NmRhOGQ1JmFtcDtiZ0NvbG9ySG92ZXI9ZDBlNWY1JmFtcDtiZ1RleHR1cmVIb3Zlcj0wMl9nbGFzcy5wbmcmYW1wO2JnSW1nT3BhY2l0eUhvdmVyPTc1JmFtcDtib3JkZXJDb2xvckhvdmVyPTc5YjdlNyZhbXA7ZmNIb3Zlcj0xZDU5ODcmYW1wO2ljb25Db2xvckhvdmVyPTIxN2JjMCZhbXA7YmdDb2xvckFjdGl2ZT1mNWY4ZjkmYW1wO2JnVGV4dHVyZUFjdGl2ZT0wNl9pbnNldF9oYXJkLnBuZyZhbXA7YmdJbWdPcGFjaXR5QWN0aXZlPTEwMCZhbXA7Ym9yZGVyQ29sb3JBY3RpdmU9NzliN2U3JmFtcDtmY0FjdGl2ZT1lMTcwMDkmYW1wO2ljb25Db2xvckFjdGl2ZT1mOWJkMDEmYW1wO2JnQ29sb3JIaWdobGlnaHQ9ZmJlYzg4JmFtcDtiZ1RleHR1cmVIaWdobGlnaHQ9MDFfZmxhdC5wbmcmYW1wO2JnSW1nT3BhY2l0eUhpZ2hsaWdodD01NSZhbXA7Ym9yZGVyQ29sb3JIaWdobGlnaHQ9ZmFkNDJlJmFtcDtmY0hpZ2hsaWdodD0zNjM2MzYmYW1wO2ljb25Db2xvckhpZ2hsaWdodD0yZTgzZmYmYW1wO2JnQ29sb3JFcnJvcj1mZWYxZWMmYW1wO2JnVGV4dHVyZUVycm9yPTAyX2dsYXNzLnBuZyZhbXA7YmdJbWdPcGFjaXR5RXJyb3I9OTUmYW1wO2JvcmRlckNvbG9yRXJyb3I9Y2QwYTBhJmFtcDtmY0Vycm9yPWNkMGEwYSZhbXA7aWNvbkNvbG9yRXJyb3I9Y2QwYTBhJmFtcDtiZ0NvbG9yT3ZlcmxheT1hYWFhYWEmYW1wO2JnVGV4dHVyZU92ZXJsYXk9MDFfZmxhdC5wbmcmYW1wO2JnSW1nT3BhY2l0eU92ZXJsYXk9MCZhbXA7b3BhY2l0eU92ZXJsYXk9MzAmYW1wO2JnQ29sb3JTaGFkb3c9YWFhYWFhJmFtcDtiZ1RleHR1cmVTaGFkb3c9MDFfZmxhdC5wbmcmYW1wO2JnSW1nT3BhY2l0eVNoYWRvdz0wJmFtcDtvcGFjaXR5U2hhZG93PTMwJmFtcDt0aGlja25lc3NTaGFkb3c9OHB4JmFtcDtvZmZzZXRUb3BTaGFkb3c9LThweCZhbXA7b2Zmc2V0TGVmdFNoYWRvdz0tOHB4JmFtcDtjb3JuZXJSYWRpdXNTaGFkb3c9OHB4Ij4JCQk8aW1nIHNyYz0iaHR0cDovL2xlYXJuaW5nanF1ZXJ5Lmtzd2VkYmVyZy5uZXRkbmEtY2RuLmNvbS93cC1jb250ZW50L3VwbG9hZHMvdGhlbWVyb2xsZXIvdGhlbWVfOTBfd2luZG96ZS5wbmciIGFsdD0iUmVkbW9uZCIgdGl0bGU9IlJlZG1vbmQiIC8+CQkJPHNwYW4gY2xhc3M9InRoZW1lTmFtZSI+UmVkbW9uZDwvc3Bhbj4JCTwvYT48L2xpPgkJCQkJCTxsaT48YSBocmVmPSJodHRwOi8vanF1ZXJ5dWkuY29tL3RoZW1lcm9sbGVyL2Nzcy9wYXJzZVRoZW1lLmNzcy5waHA/ZmZEZWZhdWx0PVNlZ29lK1VJJTJDK0FyaWFsJTJDK3NhbnMtc2VyaWYmZndEZWZhdWx0PWJvbGQmZnNEZWZhdWx0PTEuMWVtJmNvcm5lclJhZGl1cz04cHgmYmdDb2xvckhlYWRlcj04MTc4NjUmYmdUZXh0dXJlSGVhZGVyPTEyX2dsb3NzX3dhdmUucG5nJmJnSW1nT3BhY2l0eUhlYWRlcj00NSZib3JkZXJDb2xvckhlYWRlcj00OTQ0MzcmZmNIZWFkZXI9ZmZmZmZmJmljb25Db2xvckhlYWRlcj1mYWRjN2EmYmdDb2xvckNvbnRlbnQ9ZmVlZWJkJmJnVGV4dHVyZUNvbnRlbnQ9MDNfaGlnaGxpZ2h0X3NvZnQucG5nJmJnSW1nT3BhY2l0eUNvbnRlbnQ9MTAwJmJvcmRlckNvbG9yQ29udGVudD04ZTg0NmImZmNDb250ZW50PTM4MzgzOCZpY29uQ29sb3JDb250ZW50PWQxOTQwNSZiZ0NvbG9yRGVmYXVsdD1mZWNlMmYmYmdUZXh0dXJlRGVmYXVsdD0xMl9nbG9zc193YXZlLnBuZyZiZ0ltZ09wYWNpdHlEZWZhdWx0PTYwJmJvcmRlckNvbG9yRGVmYXVsdD1kMTk0MDUmZmNEZWZhdWx0PTRjMzAwMCZpY29uQ29sb3JEZWZhdWx0PTNkM2QzZCZiZ0NvbG9ySG92ZXI9ZmZkZDU3JmJnVGV4dHVyZUhvdmVyPTEyX2dsb3NzX3dhdmUucG5nJmJnSW1nT3BhY2l0eUhvdmVyPTcwJmJvcmRlckNvbG9ySG92ZXI9YTQ1YjEzJmZjSG92ZXI9MzgxZjAwJmljb25Db2xvckhvdmVyPWJkN2IwMCZiZ0NvbG9yQWN0aXZlPWZmZmZmZiZiZ1RleHR1cmVBY3RpdmU9MDVfaW5zZXRfc29mdC5wbmcmYmdJbWdPcGFjaXR5QWN0aXZlPTMwJmJvcmRlckNvbG9yQWN0aXZlPTY1NWU0ZSZmY0FjdGl2ZT0wMDc0YzcmaWNvbkNvbG9yQWN0aXZlPWViOTkwZiZiZ0NvbG9ySGlnaGxpZ2h0PWZmZjllNSZiZ1RleHR1cmVIaWdobGlnaHQ9MTJfZ2xvc3Nfd2F2ZS5wbmcmYmdJbWdPcGFjaXR5SGlnaGxpZ2h0PTkwJmJvcmRlckNvbG9ySGlnaGxpZ2h0PWVlYjQyMCZmY0hpZ2hsaWdodD0xZjFmMWYmaWNvbkNvbG9ySGlnaGxpZ2h0PWVkOWYyNiZiZ0NvbG9yRXJyb3I9ZDM0ZDE3JmJnVGV4dHVyZUVycm9yPTA3X2RpYWdvbmFsc19tZWRpdW0ucG5nJmJnSW1nT3BhY2l0eUVycm9yPTIwJmJvcmRlckNvbG9yRXJyb3I9ZmZiNzNkJmZjRXJyb3I9ZmZmZmZmJmljb25Db2xvckVycm9yPWZmZTE4MCZiZ0NvbG9yT3ZlcmxheT01YzVjNWMmYmdUZXh0dXJlT3ZlcmxheT0wMV9mbGF0LnBuZyZiZ0ltZ09wYWNpdHlPdmVybGF5PTUwJm9wYWNpdHlPdmVybGF5PTgwJmJnQ29sb3JTaGFkb3c9Y2NjY2NjJmJnVGV4dHVyZVNoYWRvdz0wMV9mbGF0LnBuZyZiZ0ltZ09wYWNpdHlTaGFkb3c9MzAmb3BhY2l0eVNoYWRvdz02MCZ0aGlja25lc3NTaGFkb3c9N3B4Jm9mZnNldFRvcFNoYWRvdz0tN3B4Jm9mZnNldExlZnRTaGFkb3c9LTdweCZjb3JuZXJSYWRpdXNTaGFkb3c9OHB4Ij4JCQk8aW1nIHNyYz0iaHR0cDovL2xlYXJuaW5nanF1ZXJ5Lmtzd2VkYmVyZy5uZXRkbmEtY2RuLmNvbS93cC1jb250ZW50L3VwbG9hZHMvdGhlbWVyb2xsZXIvdGhlbWVfOTBfc3VubnkucG5nIiBhbHQ9IlN1bm55IiB0aXRsZT0iU3VubnkiIC8+CQkJPHNwYW4gY2xhc3M9InRoZW1lTmFtZSI+U3Vubnk8L3NwYW4+CQk8L2E+PC9saT4JCQkJCQk8bGk+PGEgaHJlZj0iaHR0cDovL2pxdWVyeXVpLmNvbS90aGVtZXJvbGxlci9jc3MvcGFyc2VUaGVtZS5jc3MucGhwP2ZmRGVmYXVsdD1UcmVidWNoZXQrTVMlMkMrSGVsdmV0aWNhJTJDK0FyaWFsJTJDK3NhbnMtc2VyaWYmZndEZWZhdWx0PWJvbGQmZnNEZWZhdWx0PTEuMWVtJmNvcm5lclJhZGl1cz02cHgmYmdDb2xvckhlYWRlcj1kZGRkZGQmYmdUZXh0dXJlSGVhZGVyPTAyX2dsYXNzLnBuZyZiZ0ltZ09wYWNpdHlIZWFkZXI9MzUmYm9yZGVyQ29sb3JIZWFkZXI9YmJiYmJiJmZjSGVhZGVyPTQ0NDQ0NCZpY29uQ29sb3JIZWFkZXI9OTk5OTk5JmJnQ29sb3JDb250ZW50PWM5YzljOSZiZ1RleHR1cmVDb250ZW50PTA1X2luc2V0X3NvZnQucG5nJmJnSW1nT3BhY2l0eUNvbnRlbnQ9NTAmYm9yZGVyQ29sb3JDb250ZW50PWFhYWFhYSZmY0NvbnRlbnQ9MzMzMzMzJmljb25Db2xvckNvbnRlbnQ9OTk5OTk5JmJnQ29sb3JEZWZhdWx0PWVlZWVlZSZiZ1RleHR1cmVEZWZhdWx0PTAyX2dsYXNzLnBuZyZiZ0ltZ09wYWNpdHlEZWZhdWx0PTYwJmJvcmRlckNvbG9yRGVmYXVsdD1jY2NjY2MmZmNEZWZhdWx0PTMzODNiYiZpY29uQ29sb3JEZWZhdWx0PTcwYjJlMSZiZ0NvbG9ySG92ZXI9ZjhmOGY4JmJnVGV4dHVyZUhvdmVyPTAyX2dsYXNzLnBuZyZiZ0ltZ09wYWNpdHlIb3Zlcj0xMDAmYm9yZGVyQ29sb3JIb3Zlcj1iYmJiYmImZmNIb3Zlcj01OTlmY2YmaWNvbkNvbG9ySG92ZXI9MzM4M2JiJmJnQ29sb3JBY3RpdmU9OTk5OTk5JmJnVGV4dHVyZUFjdGl2ZT0wNl9pbnNldF9oYXJkLnBuZyZiZ0ltZ09wYWNpdHlBY3RpdmU9NzUmYm9yZGVyQ29sb3JBY3RpdmU9OTk5OTk5JmZjQWN0aXZlPWZmZmZmZiZpY29uQ29sb3JBY3RpdmU9NDU0NTQ1JmJnQ29sb3JIaWdobGlnaHQ9ZWVlZWVlJmJnVGV4dHVyZUhpZ2hsaWdodD0wMV9mbGF0LnBuZyZiZ0ltZ09wYWNpdHlIaWdobGlnaHQ9NTUmYm9yZGVyQ29sb3JIaWdobGlnaHQ9ZmZmZmZmJmZjSGlnaGxpZ2h0PTQ0NDQ0NCZpY29uQ29sb3JIaWdobGlnaHQ9MzM4M2JiJmJnQ29sb3JFcnJvcj1jMDQwMmEmYmdUZXh0dXJlRXJyb3I9MDFfZmxhdC5wbmcmYmdJbWdPcGFjaXR5RXJyb3I9NTUmYm9yZGVyQ29sb3JFcnJvcj1jMDQwMmEmZmNFcnJvcj1mZmZmZmYmaWNvbkNvbG9yRXJyb3I9ZmJjODU2JmJnQ29sb3JPdmVybGF5PWVlZWVlZSZiZ1RleHR1cmVPdmVybGF5PTAxX2ZsYXQucG5nJmJnSW1nT3BhY2l0eU92ZXJsYXk9MCZvcGFjaXR5T3ZlcmxheT04MCZiZ0NvbG9yU2hhZG93PWFhYWFhYSZiZ1RleHR1cmVTaGFkb3c9MDFfZmxhdC5wbmcmYmdJbWdPcGFjaXR5U2hhZG93PTAmb3BhY2l0eVNoYWRvdz02MCZ0aGlja25lc3NTaGFkb3c9NHB4Jm9mZnNldFRvcFNoYWRvdz0tNHB4Jm9mZnNldExlZnRTaGFkb3c9LTRweCZjb3JuZXJSYWRpdXNTaGFkb3c9MHB4ZG93JTNEMHB4Ij4JCQk8aW1nIHNyYz0iaHR0cDovL2xlYXJuaW5nanF1ZXJ5Lmtzd2VkYmVyZy5uZXRkbmEtY2RuLmNvbS93cC1jb250ZW50L3VwbG9hZHMvdGhlbWVyb2xsZXIvdGhlbWVfOTBfb3ZlcmNhc3QucG5nIiBhbHQ9Ik92ZXJjYXN0IiB0aXRsZT0iT3ZlcmNhc3QiIC8+CQkJPHNwYW4gY2xhc3M9InRoZW1lTmFtZSI+T3ZlcmNhc3Q8L3NwYW4+CQkJCTwvYT48L2xpPgkJCQkJCTxsaT48YSBocmVmPSJodHRwOi8vanF1ZXJ5dWkuY29tL3RoZW1lcm9sbGVyL2Nzcy9wYXJzZVRoZW1lLmNzcy5waHA/ZmZEZWZhdWx0PUx1Y2lkYStHcmFuZGUlMkMrTHVjaWRhK1NhbnMlMkMrQXJpYWwlMkMrc2Fucy1zZXJpZiZmd0RlZmF1bHQ9bm9ybWFsJmZzRGVmYXVsdD0xLjFlbSZjb3JuZXJSYWRpdXM9MTBweCZiZ0NvbG9ySGVhZGVyPTNhODEwNCZiZ1RleHR1cmVIZWFkZXI9MDNfaGlnaGxpZ2h0X3NvZnQucG5nJmJnSW1nT3BhY2l0eUhlYWRlcj0zMyZib3JkZXJDb2xvckhlYWRlcj0zZjc1MDYmZmNIZWFkZXI9ZmZmZmZmJmljb25Db2xvckhlYWRlcj1mZmZmZmYmYmdDb2xvckNvbnRlbnQ9Mjg1YzAwJmJnVGV4dHVyZUNvbnRlbnQ9MDVfaW5zZXRfc29mdC5wbmcmYmdJbWdPcGFjaXR5Q29udGVudD0xMCZib3JkZXJDb2xvckNvbnRlbnQ9NzJiNDJkJmZjQ29udGVudD1mZmZmZmYmaWNvbkNvbG9yQ29udGVudD03MmI0MmQmYmdDb2xvckRlZmF1bHQ9NGNhMjBiJmJnVGV4dHVyZURlZmF1bHQ9MDNfaGlnaGxpZ2h0X3NvZnQucG5nJmJnSW1nT3BhY2l0eURlZmF1bHQ9NjAmYm9yZGVyQ29sb3JEZWZhdWx0PTQ1OTMwYiZmY0RlZmF1bHQ9ZmZmZmZmJmljb25Db2xvckRlZmF1bHQ9ZmZmZmZmJmJnQ29sb3JIb3Zlcj00ZWIzMDUmYmdUZXh0dXJlSG92ZXI9MDNfaGlnaGxpZ2h0X3NvZnQucG5nJmJnSW1nT3BhY2l0eUhvdmVyPTUwJmJvcmRlckNvbG9ySG92ZXI9OGJkODNiJmZjSG92ZXI9ZmZmZmZmJmljb25Db2xvckhvdmVyPWZmZmZmZiZiZ0NvbG9yQWN0aXZlPTI4NWMwMCZiZ1RleHR1cmVBY3RpdmU9MDRfaGlnaGxpZ2h0X2hhcmQucG5nJmJnSW1nT3BhY2l0eUFjdGl2ZT0zMCZib3JkZXJDb2xvckFjdGl2ZT03MmI0MmQmZmNBY3RpdmU9ZmZmZmZmJmljb25Db2xvckFjdGl2ZT1mZmZmZmYmYmdDb2xvckhpZ2hsaWdodD1mYmY1ZDAmYmdUZXh0dXJlSGlnaGxpZ2h0PTAyX2dsYXNzLnBuZyZiZ0ltZ09wYWNpdHlIaWdobGlnaHQ9NTUmYm9yZGVyQ29sb3JIaWdobGlnaHQ9ZjlkZDM0JmZjSGlnaGxpZ2h0PTM2MzYzNiZpY29uQ29sb3JIaWdobGlnaHQ9NGViMzA1JmJnQ29sb3JFcnJvcj1mZmRjMmUmYmdUZXh0dXJlRXJyb3I9MDhfZGlhZ29uYWxzX3RoaWNrLnBuZyZiZ0ltZ09wYWNpdHlFcnJvcj05NSZib3JkZXJDb2xvckVycm9yPWZhZDAwMCZmY0Vycm9yPTJiMmIyYiZpY29uQ29sb3JFcnJvcj1jZDBhMGEmYmdDb2xvck92ZXJsYXk9NDQ0NDQ0JmJnVGV4dHVyZU92ZXJsYXk9MDhfZGlhZ29uYWxzX3RoaWNrLnBuZyZiZ0ltZ09wYWNpdHlPdmVybGF5PTE1Jm9wYWNpdHlPdmVybGF5PTMwJmJnQ29sb3JTaGFkb3c9YWFhYWFhJmJnVGV4dHVyZVNoYWRvdz0wN19kaWFnb25hbHNfc21hbGwucG5nJmJnSW1nT3BhY2l0eVNoYWRvdz0wJm9wYWNpdHlTaGFkb3c9MzAmdGhpY2tuZXNzU2hhZG93PTBweCZvZmZzZXRUb3BTaGFkb3c9NHB4Jm9mZnNldExlZnRTaGFkb3c9NHB4JmNvcm5lclJhZGl1c1NoYWRvdz00cHgiPgkJCTxpbWcgc3JjPSJodHRwOi8vbGVhcm5pbmdqcXVlcnkua3N3ZWRiZXJnLm5ldGRuYS1jZG4uY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy90aGVtZXJvbGxlci90aGVtZV85MF9sZV9mcm9nLnBuZyIgYWx0PSJMZSBGcm9nIiB0aXRsZT0iTGUgRnJvZyIgLz4JCQk8c3BhbiBjbGFzcz0idGhlbWVOYW1lIj5MZSBGcm9nPC9zcGFuPgkJPC9hPjwvbGk+CQkJCQkJCQk8bGk+PGEgaHJlZj0iaHR0cDovL2pxdWVyeXVpLmNvbS90aGVtZXJvbGxlci9jc3MvcGFyc2VUaGVtZS5jc3MucGhwP2ZmRGVmYXVsdD1IZWx2ZXRpY2ElMkMrQXJpYWwlMkMrc2Fucy1zZXJpZiZmd0RlZmF1bHQ9Ym9sZCZmc0RlZmF1bHQ9MS4xZW0mY29ybmVyUmFkaXVzPTJweCZiZ0NvbG9ySGVhZGVyPWRkZGRkZCZiZ1RleHR1cmVIZWFkZXI9MDNfaGlnaGxpZ2h0X3NvZnQucG5nJmJnSW1nT3BhY2l0eUhlYWRlcj01MCZib3JkZXJDb2xvckhlYWRlcj1kZGRkZGQmZmNIZWFkZXI9NDQ0NDQ0Jmljb25Db2xvckhlYWRlcj0wMDczZWEmYmdDb2xvckNvbnRlbnQ9ZmZmZmZmJmJnVGV4dHVyZUNvbnRlbnQ9MDFfZmxhdC5wbmcmYmdJbWdPcGFjaXR5Q29udGVudD03NSZib3JkZXJDb2xvckNvbnRlbnQ9ZGRkZGRkJmZjQ29udGVudD00NDQ0NDQmaWNvbkNvbG9yQ29udGVudD1mZjAwODQmYmdDb2xvckRlZmF1bHQ9ZjZmNmY2JmJnVGV4dHVyZURlZmF1bHQ9MDNfaGlnaGxpZ2h0X3NvZnQucG5nJmJnSW1nT3BhY2l0eURlZmF1bHQ9MTAwJmJvcmRlckNvbG9yRGVmYXVsdD1kZGRkZGQmZmNEZWZhdWx0PTAwNzNlYSZpY29uQ29sb3JEZWZhdWx0PTY2NjY2NiZiZ0NvbG9ySG92ZXI9MDA3M2VhJmJnVGV4dHVyZUhvdmVyPTAzX2hpZ2hsaWdodF9zb2Z0LnBuZyZiZ0ltZ09wYWNpdHlIb3Zlcj0yNSZib3JkZXJDb2xvckhvdmVyPTAwNzNlYSZmY0hvdmVyPWZmZmZmZiZpY29uQ29sb3JIb3Zlcj1mZmZmZmYmYmdDb2xvckFjdGl2ZT1mZmZmZmYmYmdUZXh0dXJlQWN0aXZlPTAyX2dsYXNzLnBuZyZiZ0ltZ09wYWNpdHlBY3RpdmU9NjUmYm9yZGVyQ29sb3JBY3RpdmU9ZGRkZGRkJmZjQWN0aXZlPWZmMDA4NCZpY29uQ29sb3JBY3RpdmU9NDU0NTQ1JmJnQ29sb3JIaWdobGlnaHQ9ZmZmZmZmJmJnVGV4dHVyZUhpZ2hsaWdodD0wMV9mbGF0LnBuZyZiZ0ltZ09wYWNpdHlIaWdobGlnaHQ9NTUmYm9yZGVyQ29sb3JIaWdobGlnaHQ9Y2NjY2NjJmZjSGlnaGxpZ2h0PTQ0NDQ0NCZpY29uQ29sb3JIaWdobGlnaHQ9MDA3M2VhJmJnQ29sb3JFcnJvcj1mZmZmZmYmYmdUZXh0dXJlRXJyb3I9MDFfZmxhdC5wbmcmYmdJbWdPcGFjaXR5RXJyb3I9NTUmYm9yZGVyQ29sb3JFcnJvcj1mZjAwODQmZmNFcnJvcj0yMjIyMjImaWNvbkNvbG9yRXJyb3I9ZmYwMDg0JmJnQ29sb3JPdmVybGF5PWVlZWVlZSZiZ1RleHR1cmVPdmVybGF5PTAxX2ZsYXQucG5nJmJnSW1nT3BhY2l0eU92ZXJsYXk9MCZvcGFjaXR5T3ZlcmxheT04MCZiZ0NvbG9yU2hhZG93PWFhYWFhYSZiZ1RleHR1cmVTaGFkb3c9MDFfZmxhdC5wbmcmYmdJbWdPcGFjaXR5U2hhZG93PTAmb3BhY2l0eVNoYWRvdz02MCZ0aGlja25lc3NTaGFkb3c9NHB4Jm9mZnNldFRvcFNoYWRvdz0tNHB4Jm9mZnNldExlZnRTaGFkb3c9LTRweCZjb3JuZXJSYWRpdXNTaGFkb3c9MHB4Ij4JCQk8aW1nIHNyYz0iaHR0cDovL2xlYXJuaW5nanF1ZXJ5Lmtzd2VkYmVyZy5uZXRkbmEtY2RuLmNvbS93cC1jb250ZW50L3VwbG9hZHMvdGhlbWVyb2xsZXIvdGhlbWVfOTBfZmxpY2sucG5nIiBhbHQ9IkZsaWNrIiB0aXRsZT0iRmxpY2siIC8+CQkJPHNwYW4gY2xhc3M9InRoZW1lTmFtZSI+RmxpY2s8L3NwYW4+CQkJCTwvYT48L2xpPgkJCQk8bGk+PGEgaHJlZj0iaHR0cDovL2pxdWVyeXVpLmNvbS90aGVtZXJvbGxlci9jc3MvcGFyc2VUaGVtZS5jc3MucGhwP2ZmRGVmYXVsdD1UcmVidWNoZXQrTVMlMkMrVGFob21hJTJDK1ZlcmRhbmElMkMrQXJpYWwlMkMrc2Fucy1zZXJpZiZmd0RlZmF1bHQ9Ym9sZCZmc0RlZmF1bHQ9MS4xZW0mY29ybmVyUmFkaXVzPTZweCZiZ0NvbG9ySGVhZGVyPWZmZmZmZiZiZ1RleHR1cmVIZWFkZXI9MjNfZmluZV9ncmFpbi5wbmcmYmdJbWdPcGFjaXR5SGVhZGVyPTE1JmJvcmRlckNvbG9ySGVhZGVyPWQ0ZDFiZiZmY0hlYWRlcj00NTM4MjEmaWNvbkNvbG9ySGVhZGVyPWI4MzQwMCZiZ0NvbG9yQ29udGVudD1lY2VhZGYmYmdUZXh0dXJlQ29udGVudD0yM19maW5lX2dyYWluLnBuZyZiZ0ltZ09wYWNpdHlDb250ZW50PTEwJmJvcmRlckNvbG9yQ29udGVudD1kOWQ2YzQmZmNDb250ZW50PTFmMWYxZiZpY29uQ29sb3JDb250ZW50PTIyMjIyMiZiZ0NvbG9yRGVmYXVsdD1mOGY3ZjYmYmdUZXh0dXJlRGVmYXVsdD0yM19maW5lX2dyYWluLnBuZyZiZ0ltZ09wYWNpdHlEZWZhdWx0PTEwJmJvcmRlckNvbG9yRGVmYXVsdD1jYmM3YmQmZmNEZWZhdWx0PTY1NGIyNCZpY29uQ29sb3JEZWZhdWx0PWI4MzQwMCZiZ0NvbG9ySG92ZXI9NjU0YjI0JmJnVGV4dHVyZUhvdmVyPTIzX2ZpbmVfZ3JhaW4ucG5nJmJnSW1nT3BhY2l0eUhvdmVyPTY1JmJvcmRlckNvbG9ySG92ZXI9NjU0YjI0JmZjSG92ZXI9ZmZmZmZmJmljb25Db2xvckhvdmVyPWZmZmZmZiZiZ0NvbG9yQWN0aXZlPWVjZWFkZiZiZ1RleHR1cmVBY3RpdmU9MjNfZmluZV9ncmFpbi5wbmcmYmdJbWdPcGFjaXR5QWN0aXZlPTE1JmJvcmRlckNvbG9yQWN0aXZlPWQ5ZDZjNCZmY0FjdGl2ZT0xNDBmMDYmaWNvbkNvbG9yQWN0aXZlPThjMjkxZCZiZ0NvbG9ySGlnaGxpZ2h0PWY3ZjNkZSZiZ1RleHR1cmVIaWdobGlnaHQ9MjNfZmluZV9ncmFpbi5wbmcmYmdJbWdPcGFjaXR5SGlnaGxpZ2h0PTE1JmJvcmRlckNvbG9ySGlnaGxpZ2h0PWIyYTI2NiZmY0hpZ2hsaWdodD0zYTM0MjcmaWNvbkNvbG9ySGlnaGxpZ2h0PTM1NzJhYyZiZ0NvbG9yRXJyb3I9YjgzNDAwJmJnVGV4dHVyZUVycm9yPTIzX2ZpbmVfZ3JhaW4ucG5nJmJnSW1nT3BhY2l0eUVycm9yPTY4JmJvcmRlckNvbG9yRXJyb3I9NjgxODE4JmZjRXJyb3I9ZmZmZmZmJmljb25Db2xvckVycm9yPWZiZGI5MyZiZ0NvbG9yT3ZlcmxheT02ZTRmMWMmYmdUZXh0dXJlT3ZlcmxheT0xNl9kaWFnb25hbF9tYXplLnBuZyZiZ0ltZ09wYWNpdHlPdmVybGF5PTIwJm9wYWNpdHlPdmVybGF5PTYwJmJnQ29sb3JTaGFkb3c9MDAwMDAwJmJnVGV4dHVyZVNoYWRvdz0xNl9kaWFnb25hbF9tYXplLnBuZyZiZ0ltZ09wYWNpdHlTaGFkb3c9NDAmb3BhY2l0eVNoYWRvdz02MCZ0aGlja25lc3NTaGFkb3c9NXB4Jm9mZnNldFRvcFNoYWRvdz0wJm9mZnNldExlZnRTaGFkb3c9LTEwcHgmY29ybmVyUmFkaXVzU2hhZG93PTE4cHgiPgkJCTxpbWcgc3JjPSJodHRwOi8vbGVhcm5pbmdqcXVlcnkua3N3ZWRiZXJnLm5ldGRuYS1jZG4uY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy90aGVtZXJvbGxlci90aGVtZV85MF9wZXBwZXJfZ3JpbmRlci5wbmciIGFsdD0iUGVwcGVyIEdyaW5kZXIiIHRpdGxlPSJQZXBwZXIgR3JpbmRlciIgLz4JCQk8c3BhbiBjbGFzcz0idGhlbWVOYW1lIj5QZXBwZXIgR3JpbmRlcjwvc3Bhbj4JCQkJPC9hPjwvbGk+CQkJCQkJCQk8bGk+PGEgaHJlZj0iaHR0cDovL2pxdWVyeXVpLmNvbS90aGVtZXJvbGxlci9jc3MvcGFyc2VUaGVtZS5jc3MucGhwP2ZmRGVmYXVsdD1MdWNpZGErR3JhbmRlJTJDK0x1Y2lkYStTYW5zJTJDK0FyaWFsJTJDK3NhbnMtc2VyaWYmZndEZWZhdWx0PWJvbGQmZnNEZWZhdWx0PTEuMWVtJmNvcm5lclJhZGl1cz02cHgmYmdDb2xvckhlYWRlcj0zMDI3M2EmYmdUZXh0dXJlSGVhZGVyPTAzX2hpZ2hsaWdodF9zb2Z0LnBuZyZiZ0ltZ09wYWNpdHlIZWFkZXI9MjUmYm9yZGVyQ29sb3JIZWFkZXI9MjMxZDJiJmZjSGVhZGVyPWZmZmZmZiZpY29uQ29sb3JIZWFkZXI9YThhM2FlJmJnQ29sb3JDb250ZW50PTNkMzY0NCZiZ1RleHR1cmVDb250ZW50PTEyX2dsb3NzX3dhdmUucG5nJmJnSW1nT3BhY2l0eUNvbnRlbnQ9MzAmYm9yZGVyQ29sb3JDb250ZW50PTdlNzc4MyZmY0NvbnRlbnQ9ZmZmZmZmJmljb25Db2xvckNvbnRlbnQ9ZmZmZmZmJmJnQ29sb3JEZWZhdWx0PWRjZDlkZSZiZ1RleHR1cmVEZWZhdWx0PTAzX2hpZ2hsaWdodF9zb2Z0LnBuZyZiZ0ltZ09wYWNpdHlEZWZhdWx0PTEwMCZib3JkZXJDb2xvckRlZmF1bHQ9ZGNkOWRlJmZjRGVmYXVsdD02NjU4NzQmaWNvbkNvbG9yRGVmYXVsdD04ZDc4YTUmYmdDb2xvckhvdmVyPWVhZTZlYSZiZ1RleHR1cmVIb3Zlcj0wM19oaWdobGlnaHRfc29mdC5wbmcmYmdJbWdPcGFjaXR5SG92ZXI9MTAwJmJvcmRlckNvbG9ySG92ZXI9ZDFjNWQ4JmZjSG92ZXI9NzM0ZDk5Jmljb25Db2xvckhvdmVyPTczNGQ5OSZiZ0NvbG9yQWN0aXZlPTVmNTk2NCZiZ1RleHR1cmVBY3RpdmU9MDNfaGlnaGxpZ2h0X3NvZnQucG5nJmJnSW1nT3BhY2l0eUFjdGl2ZT00NSZib3JkZXJDb2xvckFjdGl2ZT03ZTc3ODMmZmNBY3RpdmU9ZmZmZmZmJmljb25Db2xvckFjdGl2ZT00NTQ1NDUmYmdDb2xvckhpZ2hsaWdodD1mYWZhZmEmYmdUZXh0dXJlSGlnaGxpZ2h0PTAxX2ZsYXQucG5nJmJnSW1nT3BhY2l0eUhpZ2hsaWdodD01NSZib3JkZXJDb2xvckhpZ2hsaWdodD1mZmRiMWYmZmNIaWdobGlnaHQ9MzMzMzMzJmljb25Db2xvckhpZ2hsaWdodD04ZDc4YTUmYmdDb2xvckVycm9yPTk5NGQ1MyZiZ1RleHR1cmVFcnJvcj0wMV9mbGF0LnBuZyZiZ0ltZ09wYWNpdHlFcnJvcj01NSZib3JkZXJDb2xvckVycm9yPTk5NGQ1MyZmY0Vycm9yPWZmZmZmZiZpY29uQ29sb3JFcnJvcj1lYmNjY2UmYmdDb2xvck92ZXJsYXk9ZWVlZWVlJmJnVGV4dHVyZU92ZXJsYXk9MDFfZmxhdC5wbmcmYmdJbWdPcGFjaXR5T3ZlcmxheT0wJm9wYWNpdHlPdmVybGF5PTgwJmJnQ29sb3JTaGFkb3c9YWFhYWFhJmJnVGV4dHVyZVNoYWRvdz0wMV9mbGF0LnBuZyZiZ0ltZ09wYWNpdHlTaGFkb3c9MCZvcGFjaXR5U2hhZG93PTYwJnRoaWNrbmVzc1NoYWRvdz00cHgmb2Zmc2V0VG9wU2hhZG93PS00cHgmb2Zmc2V0TGVmdFNoYWRvdz0tNHB4JmNvcm5lclJhZGl1c1NoYWRvdz0wcHgiPgkJCTxpbWcgc3JjPSJodHRwOi8vbGVhcm5pbmdqcXVlcnkua3N3ZWRiZXJnLm5ldGRuYS1jZG4uY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy90aGVtZXJvbGxlci90aGVtZV85MF9lZ2dwbGFudC5wbmciIGFsdD0iRWdncGxhbnQiIHRpdGxlPSJFZ2dwbGFudCIgLz4JCQk8c3BhbiBjbGFzcz0idGhlbWVOYW1lIj5FZ2dwbGFudDwvc3Bhbj4JCQkJPC9hPjwvbGk+CQkJCQkJCQk8bGk+PGEgaHJlZj0iaHR0cDovL2pxdWVyeXVpLmNvbS90aGVtZXJvbGxlci9jc3MvcGFyc2VUaGVtZS5jc3MucGhwP2ZmRGVmYXVsdD1WZXJkYW5hJTJDK0FyaWFsJTJDK3NhbnMtc2VyaWYmZndEZWZhdWx0PW5vcm1hbCZmc0RlZmF1bHQ9MS4xZW0mY29ybmVyUmFkaXVzPTZweCZiZ0NvbG9ySGVhZGVyPTQ0NDQ0NCZiZ1RleHR1cmVIZWFkZXI9MDNfaGlnaGxpZ2h0X3NvZnQucG5nJmJnSW1nT3BhY2l0eUhlYWRlcj00NCZib3JkZXJDb2xvckhlYWRlcj0zMzMzMzMmZmNIZWFkZXI9ZmZmZmZmJmljb25Db2xvckhlYWRlcj1mZmZmZmYmYmdDb2xvckNvbnRlbnQ9MDAwMDAwJmJnVGV4dHVyZUNvbnRlbnQ9MTRfbG9vcC5wbmcmYmdJbWdPcGFjaXR5Q29udGVudD0yNSZib3JkZXJDb2xvckNvbnRlbnQ9NTU1NTU1JmZjQ29udGVudD1mZmZmZmYmaWNvbkNvbG9yQ29udGVudD1jY2NjY2MmYmdDb2xvckRlZmF1bHQ9MjIyMjIyJmJnVGV4dHVyZURlZmF1bHQ9MDNfaGlnaGxpZ2h0X3NvZnQucG5nJmJnSW1nT3BhY2l0eURlZmF1bHQ9MzUmYm9yZGVyQ29sb3JEZWZhdWx0PTQ0NDQ0NCZmY0RlZmF1bHQ9ZWVlZWVlJmljb25Db2xvckRlZmF1bHQ9Y2NjY2NjJmJnQ29sb3JIb3Zlcj0wMDMxNDcmYmdUZXh0dXJlSG92ZXI9MDNfaGlnaGxpZ2h0X3NvZnQucG5nJmJnSW1nT3BhY2l0eUhvdmVyPTMzJmJvcmRlckNvbG9ySG92ZXI9MGI5M2Q1JmZjSG92ZXI9ZmZmZmZmJmljb25Db2xvckhvdmVyPWZmZmZmZiZiZ0NvbG9yQWN0aXZlPTA5NzJhNSZiZ1RleHR1cmVBY3RpdmU9MDRfaGlnaGxpZ2h0X2hhcmQucG5nJmJnSW1nT3BhY2l0eUFjdGl2ZT0yMCZib3JkZXJDb2xvckFjdGl2ZT0yNmIzZjcmZmNBY3RpdmU9ZmZmZmZmJmljb25Db2xvckFjdGl2ZT0yMjIyMjImYmdDb2xvckhpZ2hsaWdodD1lZWVlZWUmYmdUZXh0dXJlSGlnaGxpZ2h0PTAzX2hpZ2hsaWdodF9zb2Z0LnBuZyZiZ0ltZ09wYWNpdHlIaWdobGlnaHQ9ODAmYm9yZGVyQ29sb3JIaWdobGlnaHQ9Y2NjY2NjJmZjSGlnaGxpZ2h0PTJlN2RiMiZpY29uQ29sb3JIaWdobGlnaHQ9NGI4ZTBiJmJnQ29sb3JFcnJvcj1mZmM3M2QmYmdUZXh0dXJlRXJyb3I9MDJfZ2xhc3MucG5nJmJnSW1nT3BhY2l0eUVycm9yPTQwJmJvcmRlckNvbG9yRXJyb3I9ZmZiNzNkJmZjRXJyb3I9MTExMTExJmljb25Db2xvckVycm9yPWE4MzMwMCZiZ0NvbG9yT3ZlcmxheT01YzVjNWMmYmdUZXh0dXJlT3ZlcmxheT0wMV9mbGF0LnBuZyZiZ0ltZ09wYWNpdHlPdmVybGF5PTUwJm9wYWNpdHlPdmVybGF5PTgwJmJnQ29sb3JTaGFkb3c9Y2NjY2NjJmJnVGV4dHVyZVNoYWRvdz0wMV9mbGF0LnBuZyZiZ0ltZ09wYWNpdHlTaGFkb3c9MzAmb3BhY2l0eVNoYWRvdz02MCZ0aGlja25lc3NTaGFkb3c9N3B4Jm9mZnNldFRvcFNoYWRvdz0tN3B4Jm9mZnNldExlZnRTaGFkb3c9LTdweCZjb3JuZXJSYWRpdXNTaGFkb3c9OHB4Ij4JCQk8aW1nIHNyYz0iaHR0cDovL2xlYXJuaW5nanF1ZXJ5Lmtzd2VkYmVyZy5uZXRkbmEtY2RuLmNvbS93cC1jb250ZW50L3VwbG9hZHMvdGhlbWVyb2xsZXIvdGhlbWVfOTBfZGFya19oaXZlLnBuZyIgYWx0PSJEYXJrIEhpdmUiIHRpdGxlPSJEYXJrIEhpdmUiIC8+CQkJPHNwYW4gY2xhc3M9InRoZW1lTmFtZSI+RGFyayBIaXZlPC9zcGFuPgkJPC9hPjwvbGk+CQkJCQkJCQkJCTxsaT48YSBocmVmPSJodHRwOi8vanF1ZXJ5dWkuY29tL3RoZW1lcm9sbGVyL2Nzcy9wYXJzZVRoZW1lLmNzcy5waHA/ZmZEZWZhdWx0PUx1Y2lkYStHcmFuZGUlMkMrTHVjaWRhK1NhbnMlMkMrQXJpYWwlMkMrc2Fucy1zZXJpZiZmd0RlZmF1bHQ9Ym9sZCZmc0RlZmF1bHQ9MS4xZW0mY29ybmVyUmFkaXVzPTZweCZiZ0NvbG9ySGVhZGVyPWRlZWRmNyZiZ1RleHR1cmVIZWFkZXI9MDNfaGlnaGxpZ2h0X3NvZnQucG5nJmJnSW1nT3BhY2l0eUhlYWRlcj0xMDAmYm9yZGVyQ29sb3JIZWFkZXI9YWVkMGVhJmZjSGVhZGVyPTIyMjIyMiZpY29uQ29sb3JIZWFkZXI9NzJhN2NmJmJnQ29sb3JDb250ZW50PWYyZjVmNyZiZ1RleHR1cmVDb250ZW50PTA0X2hpZ2hsaWdodF9oYXJkLnBuZyZiZ0ltZ09wYWNpdHlDb250ZW50PTEwMCZib3JkZXJDb2xvckNvbnRlbnQ9ZGRkZGRkJmZjQ29udGVudD0zNjJiMzYmaWNvbkNvbG9yQ29udGVudD03MmE3Y2YmYmdDb2xvckRlZmF1bHQ9ZDdlYmY5JmJnVGV4dHVyZURlZmF1bHQ9MDJfZ2xhc3MucG5nJmJnSW1nT3BhY2l0eURlZmF1bHQ9ODAmYm9yZGVyQ29sb3JEZWZhdWx0PWFlZDBlYSZmY0RlZmF1bHQ9Mjc3OWFhJmljb25Db2xvckRlZmF1bHQ9M2Q4MGIzJmJnQ29sb3JIb3Zlcj1lNGYxZmImYmdUZXh0dXJlSG92ZXI9MDJfZ2xhc3MucG5nJmJnSW1nT3BhY2l0eUhvdmVyPTEwMCZib3JkZXJDb2xvckhvdmVyPTc0YjJlMiZmY0hvdmVyPTAwNzBhMyZpY29uQ29sb3JIb3Zlcj0yNjk0ZTgmYmdDb2xvckFjdGl2ZT0zYmFhZTMmYmdUZXh0dXJlQWN0aXZlPTAyX2dsYXNzLnBuZyZiZ0ltZ09wYWNpdHlBY3RpdmU9NTAmYm9yZGVyQ29sb3JBY3RpdmU9MjY5NGU4JmZjQWN0aXZlPWZmZmZmZiZpY29uQ29sb3JBY3RpdmU9ZmZmZmZmJmJnQ29sb3JIaWdobGlnaHQ9ZmZlZjhmJmJnVGV4dHVyZUhpZ2hsaWdodD0wM19oaWdobGlnaHRfc29mdC5wbmcmYmdJbWdPcGFjaXR5SGlnaGxpZ2h0PTI1JmJvcmRlckNvbG9ySGlnaGxpZ2h0PWY5ZGQzNCZmY0hpZ2hsaWdodD0zNjM2MzYmaWNvbkNvbG9ySGlnaGxpZ2h0PTJlODNmZiZiZ0NvbG9yRXJyb3I9Y2QwYTBhJmJnVGV4dHVyZUVycm9yPTAxX2ZsYXQucG5nJmJnSW1nT3BhY2l0eUVycm9yPTE1JmJvcmRlckNvbG9yRXJyb3I9Y2QwYTBhJmZjRXJyb3I9ZmZmZmZmJmljb25Db2xvckVycm9yPWZmZmZmZiZiZ0NvbG9yT3ZlcmxheT1lZWVlZWUmYmdUZXh0dXJlT3ZlcmxheT0wOF9kaWFnb25hbHNfdGhpY2sucG5nJmJnSW1nT3BhY2l0eU92ZXJsYXk9OTAmb3BhY2l0eU92ZXJsYXk9ODAmYmdDb2xvclNoYWRvdz0wMDAwMDAmYmdUZXh0dXJlU2hhZG93PTA0X2hpZ2hsaWdodF9oYXJkLnBuZyZiZ0ltZ09wYWNpdHlTaGFkb3c9NzAmb3BhY2l0eVNoYWRvdz0zMCZ0aGlja25lc3NTaGFkb3c9N3B4Jm9mZnNldFRvcFNoYWRvdz0tN3B4Jm9mZnNldExlZnRTaGFkb3c9LTdweCZjb3JuZXJSYWRpdXNTaGFkb3c9OHB4Ij4JCQk8aW1nIHNyYz0iaHR0cDovL2xlYXJuaW5nanF1ZXJ5Lmtzd2VkYmVyZy5uZXRkbmEtY2RuLmNvbS93cC1jb250ZW50L3VwbG9hZHMvdGhlbWVyb2xsZXIvdGhlbWVfOTBfY3VwZXJ0aW5vLnBuZyIgYWx0PSJDdXBlcnRpbm8iIHRpdGxlPSJDdXBlcnRpbm8iIC8+CQkJPHNwYW4gY2xhc3M9InRoZW1lTmFtZSI+Q3VwZXJ0aW5vPC9zcGFuPgkJCQk8L2E+PC9saT4JCQkJPGxpPjxhIGhyZWY9Imh0dHA6Ly9qcXVlcnl1aS5jb20vdGhlbWVyb2xsZXIvY3NzL3BhcnNlVGhlbWUuY3NzLnBocD9mZkRlZmF1bHQ9c2Vnb2UrdWklMkMrQXJpYWwlMkMrc2Fucy1zZXJpZiZmd0RlZmF1bHQ9Ym9sZCZmc0RlZmF1bHQ9MS4xZW0mY29ybmVyUmFkaXVzPTZweCZiZ0NvbG9ySGVhZGVyPWVjZThkYSZiZ1RleHR1cmVIZWFkZXI9MTJfZ2xvc3Nfd2F2ZS5wbmcmYmdJbWdPcGFjaXR5SGVhZGVyPTEwMCZib3JkZXJDb2xvckhlYWRlcj1kNGNjYjAmZmNIZWFkZXI9NDMzZjM4Jmljb25Db2xvckhlYWRlcj04NDdlNzEmYmdDb2xvckNvbnRlbnQ9ZjVmM2U1JmJnVGV4dHVyZUNvbnRlbnQ9MDRfaGlnaGxpZ2h0X2hhcmQucG5nJmJnSW1nT3BhY2l0eUNvbnRlbnQ9MTAwJmJvcmRlckNvbG9yQ29udGVudD1kZmQ5YzMmZmNDb250ZW50PTMxMmUyNSZpY29uQ29sb3JDb250ZW50PTgwODA4MCZiZ0NvbG9yRGVmYXVsdD00NTllMDAmYmdUZXh0dXJlRGVmYXVsdD0wNF9oaWdobGlnaHRfaGFyZC5wbmcmYmdJbWdPcGFjaXR5RGVmYXVsdD0xNSZib3JkZXJDb2xvckRlZmF1bHQ9MzI3RTA0JmZjRGVmYXVsdD1mZmZmZmYmaWNvbkNvbG9yRGVmYXVsdD1lZWVlZWUmYmdDb2xvckhvdmVyPTY3YjAyMSZiZ1RleHR1cmVIb3Zlcj0wM19oaWdobGlnaHRfc29mdC5wbmcmYmdJbWdPcGFjaXR5SG92ZXI9MjUmYm9yZGVyQ29sb3JIb3Zlcj0zMjdFMDQmZmNIb3Zlcj1mZmZmZmYmaWNvbkNvbG9ySG92ZXI9ZmZmZmZmJmJnQ29sb3JBY3RpdmU9ZmFmYWY0JmJnVGV4dHVyZUFjdGl2ZT0wNF9oaWdobGlnaHRfaGFyZC5wbmcmYmdJbWdPcGFjaXR5QWN0aXZlPTEwMCZib3JkZXJDb2xvckFjdGl2ZT1kNGNjYjAmZmNBY3RpdmU9NDU5ZTAwJmljb25Db2xvckFjdGl2ZT04REMyNjImYmdDb2xvckhpZ2hsaWdodD1mY2YwYmEmYmdUZXh0dXJlSGlnaGxpZ2h0PTAyX2dsYXNzLnBuZyZiZ0ltZ09wYWNpdHlIaWdobGlnaHQ9NTUmYm9yZGVyQ29sb3JIaWdobGlnaHQ9ZThlMWI1JmZjSGlnaGxpZ2h0PTM2MzYzNiZpY29uQ29sb3JIaWdobGlnaHQ9OERDMjYyJmJnQ29sb3JFcnJvcj1mZmVkYWQmYmdUZXh0dXJlRXJyb3I9MDNfaGlnaGxpZ2h0X3NvZnQucG5nJmJnSW1nT3BhY2l0eUVycm9yPTk1JmJvcmRlckNvbG9yRXJyb3I9ZTNhMzQ1JmZjRXJyb3I9Y2Q1YzBhJmljb25Db2xvckVycm9yPWNkMGEwYSZiZ0NvbG9yT3ZlcmxheT0yYjI5MjImYmdUZXh0dXJlT3ZlcmxheT0wNV9pbnNldF9zb2Z0LnBuZyZiZ0ltZ09wYWNpdHlPdmVybGF5PTE1Jm9wYWNpdHlPdmVybGF5PTkwJmJnQ29sb3JTaGFkb3c9Y2NjY2NjJmJnVGV4dHVyZVNoYWRvdz0wNF9oaWdobGlnaHRfaGFyZC5wbmcmYmdJbWdPcGFjaXR5U2hhZG93PTk1Jm9wYWNpdHlTaGFkb3c9MjAmdGhpY2tuZXNzU2hhZG93PTEycHgmb2Zmc2V0VG9wU2hhZG93PS0xMnB4Jm9mZnNldExlZnRTaGFkb3c9LTEycHgmY29ybmVyUmFkaXVzU2hhZG93PTEwcHgiPgkJCTxpbWcgc3JjPSJodHRwOi8vbGVhcm5pbmdqcXVlcnkua3N3ZWRiZXJnLm5ldGRuYS1jZG4uY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy90aGVtZXJvbGxlci90aGVtZV85MF9zb3V0aF9zdHJlZXQucG5nIiBhbHQ9IlNvdXRoIFN0IiB0aXRsZT0iU291dGggU3QiIC8+CQkJPHNwYW4gY2xhc3M9InRoZW1lTmFtZSI+U291dGggU3RyZWV0PC9zcGFuPgkJCQk8L2E+PC9saT4JCTxsaT48YSBocmVmPSJodHRwOi8vanF1ZXJ5dWkuY29tL3RoZW1lcm9sbGVyL2Nzcy9wYXJzZVRoZW1lLmNzcy5waHA/ZmZEZWZhdWx0PUFyaWFsLHNhbnMtc2VyaWYmZndEZWZhdWx0PWJvbGQmZnNEZWZhdWx0PTEuMWVtJmNvcm5lclJhZGl1cz02cHgmYmdDb2xvckhlYWRlcj1jYzAwMDAmYmdUZXh0dXJlSGVhZGVyPTAzX2hpZ2hsaWdodF9zb2Z0LnBuZyZiZ0ltZ09wYWNpdHlIZWFkZXI9MTUmYm9yZGVyQ29sb3JIZWFkZXI9ZTNhMWExJmZjSGVhZGVyPWZmZmZmZiZpY29uQ29sb3JIZWFkZXI9ZmZmZmZmJmJnQ29sb3JDb250ZW50PWZmZmZmZiZiZ1RleHR1cmVDb250ZW50PTAxX2ZsYXQucG5nJmJnSW1nT3BhY2l0eUNvbnRlbnQ9NzUmYm9yZGVyQ29sb3JDb250ZW50PWVlZWVlZSZmY0NvbnRlbnQ9MzMzMzMzJmljb25Db2xvckNvbnRlbnQ9Y2MwMDAwJmJnQ29sb3JEZWZhdWx0PWVlZWVlZSZiZ1RleHR1cmVEZWZhdWx0PTA0X2hpZ2hsaWdodF9oYXJkLnBuZyZiZ0ltZ09wYWNpdHlEZWZhdWx0PTEwMCZib3JkZXJDb2xvckRlZmF1bHQ9ZDhkY2RmJmZjRGVmYXVsdD0wMDQyNzYmaWNvbkNvbG9yRGVmYXVsdD1jYzAwMDAmYmdDb2xvckhvdmVyPWY2ZjZmNiZiZ1RleHR1cmVIb3Zlcj0wNF9oaWdobGlnaHRfaGFyZC5wbmcmYmdJbWdPcGFjaXR5SG92ZXI9MTAwJmJvcmRlckNvbG9ySG92ZXI9Y2RkNWRhJmZjSG92ZXI9MTExMTExJmljb25Db2xvckhvdmVyPWNjMDAwMCZiZ0NvbG9yQWN0aXZlPWZmZmZmZiZiZ1RleHR1cmVBY3RpdmU9MDFfZmxhdC5wbmcmYmdJbWdPcGFjaXR5QWN0aXZlPTY1JmJvcmRlckNvbG9yQWN0aXZlPWVlZWVlZSZmY0FjdGl2ZT1jYzAwMDAmaWNvbkNvbG9yQWN0aXZlPWNjMDAwMCZiZ0NvbG9ySGlnaGxpZ2h0PWZiZjhlZSZiZ1RleHR1cmVIaWdobGlnaHQ9MDJfZ2xhc3MucG5nJmJnSW1nT3BhY2l0eUhpZ2hsaWdodD01NSZib3JkZXJDb2xvckhpZ2hsaWdodD1mY2QzYTEmZmNIaWdobGlnaHQ9NDQ0NDQ0Jmljb25Db2xvckhpZ2hsaWdodD0wMDQyNzYmYmdDb2xvckVycm9yPWYzZDhkOCZiZ1RleHR1cmVFcnJvcj0wOF9kaWFnb25hbHNfdGhpY2sucG5nJmJnSW1nT3BhY2l0eUVycm9yPTc1JmJvcmRlckNvbG9yRXJyb3I9Y2MwMDAwJmZjRXJyb3I9MmUyZTJlJmljb25Db2xvckVycm9yPWNjMDAwMCZiZ0NvbG9yT3ZlcmxheT1hNmE2YTYmYmdUZXh0dXJlT3ZlcmxheT0wOV9kb3RzX3NtYWxsLnBuZyZiZ0ltZ09wYWNpdHlPdmVybGF5PTY1Jm9wYWNpdHlPdmVybGF5PTQwJmJnQ29sb3JTaGFkb3c9MzMzMzMzJmJnVGV4dHVyZVNoYWRvdz0wMV9mbGF0LnBuZyZiZ0ltZ09wYWNpdHlTaGFkb3c9MCZvcGFjaXR5U2hhZG93PTEwJnRoaWNrbmVzc1NoYWRvdz04cHgmb2Zmc2V0VG9wU2hhZG93PS04cHgmb2Zmc2V0TGVmdFNoYWRvdz0tOHB4JmNvcm5lclJhZGl1c1NoYWRvdz04cHgiPgkJCTxpbWcgc3JjPSJodHRwOi8vbGVhcm5pbmdqcXVlcnkua3N3ZWRiZXJnLm5ldGRuYS1jZG4uY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy90aGVtZXJvbGxlci90aGVtZV85MF9ibGl0emVyLnBuZyIgYWx0PSJCbGl0emVyIiB0aXRsZT0iQmxpdHplciIgLz4JCQk8c3BhbiBjbGFzcz0idGhlbWVOYW1lIj5CbGl0emVyPC9zcGFuPgkJPC9hPjwvbGk+CQkJPGxpPjxhIGhyZWY9Imh0dHA6Ly9qcXVlcnl1aS5jb20vdGhlbWVyb2xsZXIvY3NzL3BhcnNlVGhlbWUuY3NzLnBocD90cj1mZkRlZmF1bHQ9SGVsdmV0aWNhLEFyaWFsLHNhbnMtc2VyaWYmYW1wO2Z3RGVmYXVsdD1ub3JtYWwmYW1wO2ZzRGVmYXVsdD0xLjFlbSZhbXA7Y29ybmVyUmFkaXVzPTZweCZhbXA7YmdDb2xvckhlYWRlcj1jYjg0MmUmYW1wO2JnVGV4dHVyZUhlYWRlcj0wMl9nbGFzcy5wbmcmYW1wO2JnSW1nT3BhY2l0eUhlYWRlcj0yNSZhbXA7Ym9yZGVyQ29sb3JIZWFkZXI9ZDQ5NzY4JmFtcDtmY0hlYWRlcj1mZmZmZmYmYW1wO2ljb25Db2xvckhlYWRlcj1mZmZmZmYmYW1wO2JnQ29sb3JDb250ZW50PWY0ZjBlYyZhbXA7YmdUZXh0dXJlQ29udGVudD0wNV9pbnNldF9zb2Z0LnBuZyZhbXA7YmdJbWdPcGFjaXR5Q29udGVudD0xMDAmYW1wO2JvcmRlckNvbG9yQ29udGVudD1lMGNmYzImYW1wO2ZjQ29udGVudD0xZTFiMWQmYW1wO2ljb25Db2xvckNvbnRlbnQ9YzQ3YTIzJmFtcDtiZ0NvbG9yRGVmYXVsdD1lZGU0ZDQmYW1wO2JnVGV4dHVyZURlZmF1bHQ9MDJfZ2xhc3MucG5nJmFtcDtiZ0ltZ09wYWNpdHlEZWZhdWx0PTcwJmFtcDtib3JkZXJDb2xvckRlZmF1bHQ9Y2RjM2I3JmFtcDtmY0RlZmF1bHQ9M2YzNzMxJmFtcDtpY29uQ29sb3JEZWZhdWx0PWYwODAwMCZhbXA7YmdDb2xvckhvdmVyPWY1ZjBlNSZhbXA7YmdUZXh0dXJlSG92ZXI9MDJfZ2xhc3MucG5nJmFtcDtiZ0ltZ09wYWNpdHlIb3Zlcj0xMDAmYW1wO2JvcmRlckNvbG9ySG92ZXI9ZjVhZDY2JmFtcDtmY0hvdmVyPWE0NjMxMyZhbXA7aWNvbkNvbG9ySG92ZXI9ZjA4MDAwJmFtcDtiZ0NvbG9yQWN0aXZlPWY0ZjBlYyZhbXA7YmdUZXh0dXJlQWN0aXZlPTA0X2hpZ2hsaWdodF9oYXJkLnBuZyZhbXA7YmdJbWdPcGFjaXR5QWN0aXZlPTEwMCZhbXA7Ym9yZGVyQ29sb3JBY3RpdmU9ZTBjZmMyJmFtcDtmY0FjdGl2ZT1iODU3MDAmYW1wO2ljb25Db2xvckFjdGl2ZT1mMzVmMDcmYW1wO2JnQ29sb3JIaWdobGlnaHQ9ZjVmNWI1JmFtcDtiZ1RleHR1cmVIaWdobGlnaHQ9MDRfaGlnaGxpZ2h0X2hhcmQucG5nJmFtcDtiZ0ltZ09wYWNpdHlIaWdobGlnaHQ9NzUmYW1wO2JvcmRlckNvbG9ySGlnaGxpZ2h0PWQ5YmI3MyZhbXA7ZmNIaWdobGlnaHQ9MDYwMjAwJmFtcDtpY29uQ29sb3JIaWdobGlnaHQ9Y2I2NzJiJmFtcDtiZ0NvbG9yRXJyb3I9ZmVlNGJkJmFtcDtiZ1RleHR1cmVFcnJvcj0wNF9oaWdobGlnaHRfaGFyZC5wbmcmYW1wO2JnSW1nT3BhY2l0eUVycm9yPTY1JmFtcDtib3JkZXJDb2xvckVycm9yPWY4ODkzZiZhbXA7ZmNFcnJvcj01OTIwMDMmYW1wO2ljb25Db2xvckVycm9yPWZmNzUxOSZhbXA7YmdDb2xvck92ZXJsYXk9YWFhYWFhJmFtcDtiZ1RleHR1cmVPdmVybGF5PTAxX2ZsYXQucG5nJmFtcDtiZ0ltZ09wYWNpdHlPdmVybGF5PTc1JmFtcDtvcGFjaXR5T3ZlcmxheT0zMCZhbXA7YmdDb2xvclNoYWRvdz1hYWFhYWEmYW1wO2JnVGV4dHVyZVNoYWRvdz0wMV9mbGF0LnBuZyZhbXA7YmdJbWdPcGFjaXR5U2hhZG93PTc1JmFtcDtvcGFjaXR5U2hhZG93PTMwJmFtcDt0aGlja25lc3NTaGFkb3c9OHB4JmFtcDtvZmZzZXRUb3BTaGFkb3c9LThweCZhbXA7b2Zmc2V0TGVmdFNoYWRvdz0tOHB4JmFtcDtjb3JuZXJSYWRpdXNTaGFkb3c9OHB4Ij4JCQk8aW1nIHNyYz0iaHR0cDovL2xlYXJuaW5nanF1ZXJ5Lmtzd2VkYmVyZy5uZXRkbmEtY2RuLmNvbS93cC1jb250ZW50L3VwbG9hZHMvdGhlbWVyb2xsZXIvdGhlbWVfOTBfaHVtYW5pdHkucG5nIiBhbHQ9Ikh1bWFuaXR5IiB0aXRsZT0iSHVtYW5pdHkiIC8+CQkJPHNwYW4gY2xhc3M9InRoZW1lTmFtZSI+SHVtYW5pdHk8L3NwYW4+CQk8L2E+PC9saT4JCQk8bGk+PGEgaHJlZj0iaHR0cDovL2pxdWVyeXVpLmNvbS90aGVtZXJvbGxlci9jc3MvcGFyc2VUaGVtZS5jc3MucGhwP2ZmRGVmYXVsdD1HaWxsK1NhbnMsQXJpYWwsc2Fucy1zZXJpZiZhbXA7ZndEZWZhdWx0PWJvbGQmYW1wO2ZzRGVmYXVsdD0xLjJlbSZhbXA7Y29ybmVyUmFkaXVzPTRweCZhbXA7YmdDb2xvckhlYWRlcj0zNTQxNGYmYW1wO2JnVGV4dHVyZUhlYWRlcj0wOV9kb3RzX3NtYWxsLnBuZyZhbXA7YmdJbWdPcGFjaXR5SGVhZGVyPTM1JmFtcDtib3JkZXJDb2xvckhlYWRlcj0yYzQzNTkmYW1wO2ZjSGVhZGVyPWUxZTQ2MyZhbXA7aWNvbkNvbG9ySGVhZGVyPWUxZTQ2MyZhbXA7YmdDb2xvckNvbnRlbnQ9ZmZmZmZmJmFtcDtiZ1RleHR1cmVDb250ZW50PTAxX2ZsYXQucG5nJmFtcDtiZ0ltZ09wYWNpdHlDb250ZW50PTc1JmFtcDtib3JkZXJDb2xvckNvbnRlbnQ9YWFhYWFhJmFtcDtmY0NvbnRlbnQ9MmM0MzU5JmFtcDtpY29uQ29sb3JDb250ZW50PWMwMjY2OSZhbXA7YmdDb2xvckRlZmF1bHQ9OTNjM2NkJmFtcDtiZ1RleHR1cmVEZWZhdWx0PTA3X2RpYWdvbmFsc19zbWFsbC5wbmcmYW1wO2JnSW1nT3BhY2l0eURlZmF1bHQ9NTAmYW1wO2JvcmRlckNvbG9yRGVmYXVsdD05M2MzY2QmYW1wO2ZjRGVmYXVsdD0zMzMzMzMmYW1wO2ljb25Db2xvckRlZmF1bHQ9ZmZmZmZmJmFtcDtiZ0NvbG9ySG92ZXI9Y2NkMjMyJmFtcDtiZ1RleHR1cmVIb3Zlcj0wN19kaWFnb25hbHNfc21hbGwucG5nJmFtcDtiZ0ltZ09wYWNpdHlIb3Zlcj03NSZhbXA7Ym9yZGVyQ29sb3JIb3Zlcj05OTk5OTkmYW1wO2ZjSG92ZXI9MjEyMTIxJmFtcDtpY29uQ29sb3JIb3Zlcj00NTQ1NDUmYW1wO2JnQ29sb3JBY3RpdmU9ZGI0ODY1JmFtcDtiZ1RleHR1cmVBY3RpdmU9MDdfZGlhZ29uYWxzX3NtYWxsLnBuZyZhbXA7YmdJbWdPcGFjaXR5QWN0aXZlPTQwJmFtcDtib3JkZXJDb2xvckFjdGl2ZT1mZjZiN2YmYW1wO2ZjQWN0aXZlPWZmZmZmZiZhbXA7aWNvbkNvbG9yQWN0aXZlPWZmZmZmZiZhbXA7YmdDb2xvckhpZ2hsaWdodD1mZmZmMzgmYW1wO2JnVGV4dHVyZUhpZ2hsaWdodD0xMF9kb3RzX21lZGl1bS5wbmcmYW1wO2JnSW1nT3BhY2l0eUhpZ2hsaWdodD04MCZhbXA7Ym9yZGVyQ29sb3JIaWdobGlnaHQ9YjRkMTAwJmFtcDtmY0hpZ2hsaWdodD0zNjM2MzYmYW1wO2ljb25Db2xvckhpZ2hsaWdodD04OGEyMDYmYW1wO2JnQ29sb3JFcnJvcj1mZjM4NTMmYW1wO2JnVGV4dHVyZUVycm9yPTA3X2RpYWdvbmFsc19zbWFsbC5wbmcmYW1wO2JnSW1nT3BhY2l0eUVycm9yPTUwJmFtcDtib3JkZXJDb2xvckVycm9yPWZmNmI3ZiZhbXA7ZmNFcnJvcj1mZmZmZmYmYW1wO2ljb25Db2xvckVycm9yPWZmZWIzMyZhbXA7YmdDb2xvck92ZXJsYXk9ZjdmN2JhJmFtcDtiZ1RleHR1cmVPdmVybGF5PTExX3doaXRlX2xpbmVzLnBuZyZhbXA7YmdJbWdPcGFjaXR5T3ZlcmxheT04NSZhbXA7b3BhY2l0eU92ZXJsYXk9ODAmYW1wO2JnQ29sb3JTaGFkb3c9YmE5MjE3JmFtcDtiZ1RleHR1cmVTaGFkb3c9MDFfZmxhdC5wbmcmYW1wO2JnSW1nT3BhY2l0eVNoYWRvdz03NSZhbXA7b3BhY2l0eVNoYWRvdz0yMCZhbXA7dGhpY2tuZXNzU2hhZG93PTEwcHgmYW1wO29mZnNldFRvcFNoYWRvdz04cHgmYW1wO29mZnNldExlZnRTaGFkb3c9OHB4JmFtcDtjb3JuZXJSYWRpdXNTaGFkb3c9NXB4Ij4JCTxpbWcgc3JjPSJodHRwOi8vbGVhcm5pbmdqcXVlcnkua3N3ZWRiZXJnLm5ldGRuYS1jZG4uY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy90aGVtZXJvbGxlci90aGVtZV85MF9ob3Rfc25lYWtzLnBuZyIgYWx0PSJIb3QgU25lYWtzIiB0aXRsZT0iSG90IFNuZWFrcyIgLz4JCQk8c3BhbiBjbGFzcz0idGhlbWVOYW1lIj5Ib3Qgc25lYWtzPC9zcGFuPgkJPC9hPjwvbGk+CQkJPGxpPjxhIGhyZWY9Imh0dHA6Ly9qcXVlcnl1aS5jb20vdGhlbWVyb2xsZXIvY3NzL3BhcnNlVGhlbWUuY3NzLnBocD9mZkRlZmF1bHQ9c2Vnb2UrdWksK0FyaWFsLCtzYW5zLXNlcmlmJmFtcDtmd0RlZmF1bHQ9Ym9sZCZhbXA7ZnNEZWZhdWx0PTEuMWVtJmFtcDtjb3JuZXJSYWRpdXM9M3B4JmFtcDtiZ0NvbG9ySGVhZGVyPWY5ZjlmOSZhbXA7YmdUZXh0dXJlSGVhZGVyPTAzX2hpZ2hsaWdodF9zb2Z0LnBuZyZhbXA7YmdJbWdPcGFjaXR5SGVhZGVyPTEwMCZhbXA7Ym9yZGVyQ29sb3JIZWFkZXI9Y2NjY2NjJmFtcDtmY0hlYWRlcj1lNjk3MDAmYW1wO2ljb25Db2xvckhlYWRlcj01ZmE1ZTMmYW1wO2JnQ29sb3JDb250ZW50PWVlZWVlZSZhbXA7YmdUZXh0dXJlQ29udGVudD0wNl9pbnNldF9oYXJkLnBuZyZhbXA7YmdJbWdPcGFjaXR5Q29udGVudD0xMDAmYW1wO2JvcmRlckNvbG9yQ29udGVudD1hYWFhYWEmYW1wO2ZjQ29udGVudD0yMjIyMjImYW1wO2ljb25Db2xvckNvbnRlbnQ9MGE4MmViJmFtcDtiZ0NvbG9yRGVmYXVsdD0xNDg0ZTYmYW1wO2JnVGV4dHVyZURlZmF1bHQ9MDhfZGlhZ29uYWxzX3RoaWNrLnBuZyZhbXA7YmdJbWdPcGFjaXR5RGVmYXVsdD0yMiZhbXA7Ym9yZGVyQ29sb3JEZWZhdWx0PWZmZmZmZiZhbXA7ZmNEZWZhdWx0PWZmZmZmZiZhbXA7aWNvbkNvbG9yRGVmYXVsdD1mY2RkNGEmYW1wO2JnQ29sb3JIb3Zlcj0yMjkzZjcmYW1wO2JnVGV4dHVyZUhvdmVyPTA4X2RpYWdvbmFsc190aGljay5wbmcmYW1wO2JnSW1nT3BhY2l0eUhvdmVyPTI2JmFtcDtib3JkZXJDb2xvckhvdmVyPTIyOTNmNyZhbXA7ZmNIb3Zlcj1mZmZmZmYmYW1wO2ljb25Db2xvckhvdmVyPWZmZmZmZiZhbXA7YmdDb2xvckFjdGl2ZT1lNjk3MDAmYW1wO2JnVGV4dHVyZUFjdGl2ZT0wOF9kaWFnb25hbHNfdGhpY2sucG5nJmFtcDtiZ0ltZ09wYWNpdHlBY3RpdmU9MjAmYW1wO2JvcmRlckNvbG9yQWN0aXZlPWU2OTcwMCZhbXA7ZmNBY3RpdmU9ZmZmZmZmJmFtcDtpY29uQ29sb3JBY3RpdmU9ZmZmZmZmJmFtcDtiZ0NvbG9ySGlnaGxpZ2h0PWM1ZGRmYyZhbXA7YmdUZXh0dXJlSGlnaGxpZ2h0PTA3X2RpYWdvbmFsc19zbWFsbC5wbmcmYW1wO2JnSW1nT3BhY2l0eUhpZ2hsaWdodD0yNSZhbXA7Ym9yZGVyQ29sb3JIaWdobGlnaHQ9ZmZmZmZmJmFtcDtmY0hpZ2hsaWdodD0zMzMzMzMmYW1wO2ljb25Db2xvckhpZ2hsaWdodD0wYjU0ZDUmYW1wO2JnQ29sb3JFcnJvcj1lNjk3MDAmYW1wO2JnVGV4dHVyZUVycm9yPTA4X2RpYWdvbmFsc190aGljay5wbmcmYW1wO2JnSW1nT3BhY2l0eUVycm9yPTIwJmFtcDtib3JkZXJDb2xvckVycm9yPWU2OTcwMCZhbXA7ZmNFcnJvcj1mZmZmZmYmYW1wO2ljb25Db2xvckVycm9yPWZmZmZmZiZhbXA7YmdDb2xvck92ZXJsYXk9ZTZiOTAwJmFtcDtiZ1RleHR1cmVPdmVybGF5PTAxX2ZsYXQucG5nJmFtcDtiZ0ltZ09wYWNpdHlPdmVybGF5PTAmYW1wO29wYWNpdHlPdmVybGF5PTMwJmFtcDtiZ0NvbG9yU2hhZG93PWU2OTcwMCZhbXA7YmdUZXh0dXJlU2hhZG93PTAxX2ZsYXQucG5nJmFtcDtiZ0ltZ09wYWNpdHlTaGFkb3c9MCZhbXA7b3BhY2l0eVNoYWRvdz0yMCZhbXA7dGhpY2tuZXNzU2hhZG93PTBweCZhbXA7b2Zmc2V0VG9wU2hhZG93PTZweCZhbXA7b2Zmc2V0TGVmdFNoYWRvdz02cHgmYW1wO2Nvcm5lclJhZGl1c1NoYWRvdz0zcHgiPgkJCTxpbWcgc3JjPSJodHRwOi8vbGVhcm5pbmdqcXVlcnkua3N3ZWRiZXJnLm5ldGRuYS1jZG4uY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy90aGVtZXJvbGxlci90aGVtZV85MF9leGNpdGVfYmlrZS5wbmciIGFsdD0iRXhjaXRlIEJpa2UiIHRpdGxlPSJFeGNpdGUgQmlrZSIgLz4JCQk8c3BhbiBjbGFzcz0idGhlbWVOYW1lIj5FeGNpdGUgQmlrZTwvc3Bhbj4JCQk8L2E+PC9saT4JCTxsaT48YSBocmVmPSJodHRwOi8vanF1ZXJ5dWkuY29tL3RoZW1lcm9sbGVyL2Nzcy9wYXJzZVRoZW1lLmNzcy5waHA/dHImYW1wO2ZmRGVmYXVsdD1IZWx2ZXRpY2EsK0FyaWFsLCtzYW5zLXNlcmlmJmFtcDtmd0RlZmF1bHQ9bm9ybWFsJmFtcDtmc0RlZmF1bHQ9MS4xJmFtcDtmc0RlZmF1bHRVbml0PWVtJmFtcDtjb3JuZXJSYWRpdXM9NSZhbXA7Y29ybmVyUmFkaXVzVW5pdD1weCZhbXA7YmdDb2xvckhlYWRlcj04ODg4ODgmYW1wO2JnVGV4dHVyZUhlYWRlcj0wNF9oaWdobGlnaHRfaGFyZC5wbmcmYW1wO2JnSW1nT3BhY2l0eUhlYWRlcj0xNSZhbXA7Ym9yZGVyQ29sb3JIZWFkZXI9NDA0MDQwJmFtcDtmY0hlYWRlcj1mZmZmZmYmYW1wO2ljb25Db2xvckhlYWRlcj1jY2NjY2MmYW1wO2JnQ29sb3JDb250ZW50PTEyMTIxMiZhbXA7YmdUZXh0dXJlQ29udGVudD0xMl9nbG9zc193YXZlLnBuZyZhbXA7YmdJbWdPcGFjaXR5Q29udGVudD0xNiZhbXA7Ym9yZGVyQ29sb3JDb250ZW50PTQwNDA0MCZhbXA7ZmNDb250ZW50PWVlZWVlZSZhbXA7aWNvbkNvbG9yQ29udGVudD1iYmJiYmImYW1wO2JnQ29sb3JEZWZhdWx0PWFkYWRhZCZhbXA7YmdUZXh0dXJlRGVmYXVsdD0wM19oaWdobGlnaHRfc29mdC5wbmcmYW1wO2JnSW1nT3BhY2l0eURlZmF1bHQ9MzUmYW1wO2JvcmRlckNvbG9yRGVmYXVsdD1jY2NjY2MmYW1wO2ZjRGVmYXVsdD0zMzMzMzMmYW1wO2ljb25Db2xvckRlZmF1bHQ9NjY2NjY2JmFtcDtiZ0NvbG9ySG92ZXI9ZGRkZGRkJmFtcDtiZ1RleHR1cmVIb3Zlcj0wM19oaWdobGlnaHRfc29mdC5wbmcmYW1wO2JnSW1nT3BhY2l0eUhvdmVyPTYwJmFtcDtib3JkZXJDb2xvckhvdmVyPWRkZGRkZCZhbXA7ZmNIb3Zlcj0wMDAwMDAmYW1wO2ljb25Db2xvckhvdmVyPWM5ODAwMCZhbXA7YmdDb2xvckFjdGl2ZT0xMjEyMTImYW1wO2JnVGV4dHVyZUFjdGl2ZT0wNV9pbnNldF9zb2Z0LnBuZyZhbXA7YmdJbWdPcGFjaXR5QWN0aXZlPTE1JmFtcDtib3JkZXJDb2xvckFjdGl2ZT0wMDAwMDAmYW1wO2ZjQWN0aXZlPWZmZmZmZiZhbXA7aWNvbkNvbG9yQWN0aXZlPWYyOWEwMCZhbXA7YmdDb2xvckhpZ2hsaWdodD01NTU1NTUmYW1wO2JnVGV4dHVyZUhpZ2hsaWdodD0wNF9oaWdobGlnaHRfaGFyZC5wbmcmYW1wO2JnSW1nT3BhY2l0eUhpZ2hsaWdodD01NSZhbXA7Ym9yZGVyQ29sb3JIaWdobGlnaHQ9NDA0MDQwJmFtcDtmY0hpZ2hsaWdodD1jY2NjY2MmYW1wO2ljb25Db2xvckhpZ2hsaWdodD1hYWFhYWEmYW1wO2JnQ29sb3JFcnJvcj1mZWYxZWMmYW1wO2JnVGV4dHVyZUVycm9yPTAyX2dsYXNzLnBuZyZhbXA7YmdJbWdPcGFjaXR5RXJyb3I9OTUmYW1wO2JvcmRlckNvbG9yRXJyb3I9Y2QwYTBhJmFtcDtmY0Vycm9yPWNkMGEwYSZhbXA7aWNvbkNvbG9yRXJyb3I9Y2QwYTBhIj4JCQk8aW1nIHNyYz0iaHR0cDovL2xlYXJuaW5nanF1ZXJ5Lmtzd2VkYmVyZy5uZXRkbmEtY2RuLmNvbS93cC1jb250ZW50L3VwbG9hZHMvdGhlbWVyb2xsZXIvdGhlbWVfOTBfYmxhY2tfbWF0dGUucG5nIiBhbHQ9IlZhZGVyIiB0aXRsZT0iVmFkZXIiIC8+CQkJPHNwYW4gY2xhc3M9InRoZW1lTmFtZSI+VmFkZXI8L3NwYW4+CQkJPC9hPjwvbGk+CQkJCTxsaT48YSBocmVmPSJodHRwOi8vanF1ZXJ5dWkuY29tL3RoZW1lcm9sbGVyL2Nzcy9wYXJzZVRoZW1lLmNzcy5waHA/ZmZEZWZhdWx0PUFyaWFsLCtzYW5zLXNlcmlmJmFtcDtmd0RlZmF1bHQ9Ym9sZCZhbXA7ZnNEZWZhdWx0PTEuM2VtJmFtcDtjb3JuZXJSYWRpdXM9NHB4JmFtcDtiZ0NvbG9ySGVhZGVyPTBiM2U2ZiZhbXA7YmdUZXh0dXJlSGVhZGVyPTA4X2RpYWdvbmFsc190aGljay5wbmcmYW1wO2JnSW1nT3BhY2l0eUhlYWRlcj0xNSZhbXA7Ym9yZGVyQ29sb3JIZWFkZXI9MGIzZTZmJmFtcDtmY0hlYWRlcj1mNmY2ZjYmYW1wO2ljb25Db2xvckhlYWRlcj05OGQyZmImYW1wO2JnQ29sb3JDb250ZW50PTExMTExMSZhbXA7YmdUZXh0dXJlQ29udGVudD0xMl9nbG9zc193YXZlLnBuZyZhbXA7YmdJbWdPcGFjaXR5Q29udGVudD0yMCZhbXA7Ym9yZGVyQ29sb3JDb250ZW50PTAwMDAwMCZhbXA7ZmNDb250ZW50PWQ5ZDlkOSZhbXA7aWNvbkNvbG9yQ29udGVudD05Y2NkZmMmYW1wO2JnQ29sb3JEZWZhdWx0PTMzMzMzMyZhbXA7YmdUZXh0dXJlRGVmYXVsdD0wOV9kb3RzX3NtYWxsLnBuZyZhbXA7YmdJbWdPcGFjaXR5RGVmYXVsdD0yMCZhbXA7Ym9yZGVyQ29sb3JEZWZhdWx0PTMzMzMzMyZhbXA7ZmNEZWZhdWx0PWZmZmZmZiZhbXA7aWNvbkNvbG9yRGVmYXVsdD05Y2NkZmMmYW1wO2JnQ29sb3JIb3Zlcj0wMDQ5OGYmYW1wO2JnVGV4dHVyZUhvdmVyPTA5X2RvdHNfc21hbGwucG5nJmFtcDtiZ0ltZ09wYWNpdHlIb3Zlcj00MCZhbXA7Ym9yZGVyQ29sb3JIb3Zlcj0yMjIyMjImYW1wO2ZjSG92ZXI9ZmZmZmZmJmFtcDtpY29uQ29sb3JIb3Zlcj1mZmZmZmYmYW1wO2JnQ29sb3JBY3RpdmU9MjkyOTI5JmFtcDtiZ1RleHR1cmVBY3RpdmU9MDFfZmxhdC5wbmcmYW1wO2JnSW1nT3BhY2l0eUFjdGl2ZT00MCZhbXA7Ym9yZGVyQ29sb3JBY3RpdmU9MDk2YWM4JmFtcDtmY0FjdGl2ZT03NWFiZmYmYW1wO2ljb25Db2xvckFjdGl2ZT0wMDQ5OGYmYW1wO2JnQ29sb3JIaWdobGlnaHQ9MGI1OGEyJmFtcDtiZ1RleHR1cmVIaWdobGlnaHQ9MTBfZG90c19tZWRpdW0ucG5nJmFtcDtiZ0ltZ09wYWNpdHlIaWdobGlnaHQ9MzAmYW1wO2JvcmRlckNvbG9ySGlnaGxpZ2h0PTA1MmY1NyZhbXA7ZmNIaWdobGlnaHQ9ZmZmZmZmJmFtcDtpY29uQ29sb3JIaWdobGlnaHQ9ZmZmZmZmJmFtcDtiZ0NvbG9yRXJyb3I9YTMyZDAwJmFtcDtiZ1RleHR1cmVFcnJvcj0wOV9kb3RzX3NtYWxsLnBuZyZhbXA7YmdJbWdPcGFjaXR5RXJyb3I9MzAmYW1wO2JvcmRlckNvbG9yRXJyb3I9Y2QwYTBhJmFtcDtmY0Vycm9yPWZmZmZmZiZhbXA7aWNvbkNvbG9yRXJyb3I9ZmZmZmZmJmFtcDtiZ0NvbG9yT3ZlcmxheT1hYWFhYWEmYW1wO2JnVGV4dHVyZU92ZXJsYXk9MDFfZmxhdC5wbmcmYW1wO2JnSW1nT3BhY2l0eU92ZXJsYXk9MCZhbXA7b3BhY2l0eU92ZXJsYXk9MzAmYW1wO2JnQ29sb3JTaGFkb3c9YWFhYWFhJmFtcDtiZ1RleHR1cmVTaGFkb3c9MDFfZmxhdC5wbmcmYW1wO2JnSW1nT3BhY2l0eVNoYWRvdz0wJmFtcDtvcGFjaXR5U2hhZG93PTMwJmFtcDt0aGlja25lc3NTaGFkb3c9OHB4JmFtcDtvZmZzZXRUb3BTaGFkb3c9LThweCZhbXA7b2Zmc2V0TGVmdFNoYWRvdz0tOHB4JmFtcDtjb3JuZXJSYWRpdXNTaGFkb3c9OHB4Ij4JCQk8aW1nIHNyYz0iaHR0cDovL2xlYXJuaW5nanF1ZXJ5Lmtzd2VkYmVyZy5uZXRkbmEtY2RuLmNvbS93cC1jb250ZW50L3VwbG9hZHMvdGhlbWVyb2xsZXIvdGhlbWVfOTBfZG90X2x1di5wbmciIGFsdD0iRG90IEx1diIgdGl0bGU9IkRvdCBMdXYiIC8+CQkJPHNwYW4gY2xhc3M9InRoZW1lTmFtZSI+RG90IEx1djwvc3Bhbj4JCQk8L2E+PC9saT4JCQk8bGk+PGEgaHJlZj0iaHR0cDovL2pxdWVyeXVpLmNvbS90aGVtZXJvbGxlci9jc3MvcGFyc2VUaGVtZS5jc3MucGhwP2ZmRGVmYXVsdD1TZWdvZStVSSUyQytIZWx2ZXRpY2ElMkMrQXJpYWwlMkMrc2Fucy1zZXJpZiZmd0RlZmF1bHQ9Ym9sZCZmc0RlZmF1bHQ9MS4xZW0mY29ybmVyUmFkaXVzPTRweCZiZ0NvbG9ySGVhZGVyPTQ1MzMyNiZiZ1RleHR1cmVIZWFkZXI9MTJfZ2xvc3Nfd2F2ZS5wbmcmYmdJbWdPcGFjaXR5SGVhZGVyPTI1JmJvcmRlckNvbG9ySGVhZGVyPTY5NTY0OSZmY0hlYWRlcj1lM2RkYzkmaWNvbkNvbG9ySGVhZGVyPWUzZGRjOSZiZ0NvbG9yQ29udGVudD0yMDE5MTMmYmdUZXh0dXJlQ29udGVudD0wNV9pbnNldF9zb2Z0LnBuZyZiZ0ltZ09wYWNpdHlDb250ZW50PTEwJmJvcmRlckNvbG9yQ29udGVudD05Yzk0N2MmZmNDb250ZW50PWZmZmZmZiZpY29uQ29sb3JDb250ZW50PTIyMjIyMiZiZ0NvbG9yRGVmYXVsdD0xYzE2MGQmYmdUZXh0dXJlRGVmYXVsdD0xMl9nbG9zc193YXZlLnBuZyZiZ0ltZ09wYWNpdHlEZWZhdWx0PTIwJmJvcmRlckNvbG9yRGVmYXVsdD02OTU0NDQmZmNEZWZhdWx0PTliY2M2MCZpY29uQ29sb3JEZWZhdWx0PTliY2M2MCZiZ0NvbG9ySG92ZXI9NDQzNzJjJmJnVGV4dHVyZUhvdmVyPTEyX2dsb3NzX3dhdmUucG5nJmJnSW1nT3BhY2l0eUhvdmVyPTMwJmJvcmRlckNvbG9ySG92ZXI9OWM5NDdjJmZjSG92ZXI9YmFlYzdlJmljb25Db2xvckhvdmVyPWFkZDk3OCZiZ0NvbG9yQWN0aXZlPTIwMTkxMyZiZ1RleHR1cmVBY3RpdmU9MDNfaGlnaGxpZ2h0X3NvZnQucG5nJmJnSW1nT3BhY2l0eUFjdGl2ZT0yMCZib3JkZXJDb2xvckFjdGl2ZT05Yzk0N2MmZmNBY3RpdmU9ZTNkZGM5Jmljb25Db2xvckFjdGl2ZT1lM2RkYzkmYmdDb2xvckhpZ2hsaWdodD02MTkyMjYmYmdUZXh0dXJlSGlnaGxpZ2h0PTAzX2hpZ2hsaWdodF9zb2Z0LnBuZyZiZ0ltZ09wYWNpdHlIaWdobGlnaHQ9MjAmYm9yZGVyQ29sb3JIaWdobGlnaHQ9YWRkOTc4JmZjSGlnaGxpZ2h0PWZmZmZmZiZpY29uQ29sb3JIaWdobGlnaHQ9ZmZmZmZmJmJnQ29sb3JFcnJvcj01ZjM5MWImYmdUZXh0dXJlRXJyb3I9MDJfZ2xhc3MucG5nJmJnSW1nT3BhY2l0eUVycm9yPTE1JmJvcmRlckNvbG9yRXJyb3I9NWYzOTFiJmZjRXJyb3I9ZmZmZmZmJmljb25Db2xvckVycm9yPWYxZmQ4NiZiZ0NvbG9yT3ZlcmxheT1hYWFhYWEmYmdUZXh0dXJlT3ZlcmxheT0wMV9mbGF0LnBuZyZiZ0ltZ09wYWNpdHlPdmVybGF5PTAmb3BhY2l0eU92ZXJsYXk9MzAmYmdDb2xvclNoYWRvdz1hYWFhYWEmYmdUZXh0dXJlU2hhZG93PTAxX2ZsYXQucG5nJmJnSW1nT3BhY2l0eVNoYWRvdz0wJm9wYWNpdHlTaGFkb3c9MzAmdGhpY2tuZXNzU2hhZG93PThweCZvZmZzZXRUb3BTaGFkb3c9LThweCZvZmZzZXRMZWZ0U2hhZG93PS04cHgmY29ybmVyUmFkaXVzU2hhZG93PThweCI+CQkJPGltZyBzcmM9Imh0dHA6Ly9sZWFybmluZ2pxdWVyeS5rc3dlZGJlcmcubmV0ZG5hLWNkbi5jb20vd3AtY29udGVudC91cGxvYWRzL3RoZW1lcm9sbGVyL3RoZW1lXzkwX21pbnRfY2hvY28ucG5nIiBhbHQ9Ik1pbnQgQ2hvYyIgdGl0bGU9Ik1pbnQgQ2hvYyIgLz4JCQk8c3BhbiBjbGFzcz0idGhlbWVOYW1lIj5NaW50IENob2M8L3NwYW4+CQk8L2E+PC9saT4JCTxsaT48YSBocmVmPSJodHRwOi8vanF1ZXJ5dWkuY29tL3RoZW1lcm9sbGVyL2Nzcy9wYXJzZVRoZW1lLmNzcy5waHA/ZmZEZWZhdWx0PVZlcmRhbmEsK0FyaWFsLCtzYW5zLXNlcmlmJmFtcDtmd0RlZmF1bHQ9bm9ybWFsJmFtcDtmc0RlZmF1bHQ9MS4xZW0mYW1wO2Nvcm5lclJhZGl1cz00cHgmYW1wO2JnQ29sb3JIZWFkZXI9MzMzMzMzJmFtcDtiZ1RleHR1cmVIZWFkZXI9MDhfZGlhZ29uYWxzX3RoaWNrLnBuZyZhbXA7YmdJbWdPcGFjaXR5SGVhZGVyPTgmYW1wO2JvcmRlckNvbG9ySGVhZGVyPWEzYTNhMyZhbXA7ZmNIZWFkZXI9ZWVlZWVlJmFtcDtpY29uQ29sb3JIZWFkZXI9YmJiYmJiJmFtcDtiZ0NvbG9yQ29udGVudD1mOWY5ZjkmYW1wO2JnVGV4dHVyZUNvbnRlbnQ9MDRfaGlnaGxpZ2h0X2hhcmQucG5nJmFtcDtiZ0ltZ09wYWNpdHlDb250ZW50PTEwMCZhbXA7Ym9yZGVyQ29sb3JDb250ZW50PWNjY2NjYyZhbXA7ZmNDb250ZW50PTIyMjIyMiZhbXA7aWNvbkNvbG9yQ29udGVudD0yMjIyMjImYW1wO2JnQ29sb3JEZWZhdWx0PTExMTExMSZhbXA7YmdUZXh0dXJlRGVmYXVsdD0wMl9nbGFzcy5wbmcmYW1wO2JnSW1nT3BhY2l0eURlZmF1bHQ9NDAmYW1wO2JvcmRlckNvbG9yRGVmYXVsdD03Nzc3NzcmYW1wO2ZjRGVmYXVsdD1lM2UzZTMmYW1wO2ljb25Db2xvckRlZmF1bHQ9ZWRlZGVkJmFtcDtiZ0NvbG9ySG92ZXI9MWMxYzFjJmFtcDtiZ1RleHR1cmVIb3Zlcj0wMl9nbGFzcy5wbmcmYW1wO2JnSW1nT3BhY2l0eUhvdmVyPTU1JmFtcDtib3JkZXJDb2xvckhvdmVyPTAwMDAwMCZhbXA7ZmNIb3Zlcj1mZmZmZmYmYW1wO2ljb25Db2xvckhvdmVyPWZmZmZmZiZhbXA7YmdDb2xvckFjdGl2ZT1mZmZmZmYmYW1wO2JnVGV4dHVyZUFjdGl2ZT0wMV9mbGF0LnBuZyZhbXA7YmdJbWdPcGFjaXR5QWN0aXZlPTY1JmFtcDtib3JkZXJDb2xvckFjdGl2ZT1jY2NjY2MmYW1wO2ZjQWN0aXZlPTIyMjIyMiZhbXA7aWNvbkNvbG9yQWN0aXZlPTIyMjIyMiZhbXA7YmdDb2xvckhpZ2hsaWdodD1mZmViODAmYW1wO2JnVGV4dHVyZUhpZ2hsaWdodD0wNl9pbnNldF9oYXJkLnBuZyZhbXA7YmdJbWdPcGFjaXR5SGlnaGxpZ2h0PTU1JmFtcDtib3JkZXJDb2xvckhpZ2hsaWdodD1mZmRlMmUmYW1wO2ZjSGlnaGxpZ2h0PTM2MzYzNiZhbXA7aWNvbkNvbG9ySGlnaGxpZ2h0PTRjYTMwMCZhbXA7YmdDb2xvckVycm9yPWNkMGEwYSZhbXA7YmdUZXh0dXJlRXJyb3I9MDZfaW5zZXRfaGFyZC5wbmcmYW1wO2JnSW1nT3BhY2l0eUVycm9yPTQ1JmFtcDtib3JkZXJDb2xvckVycm9yPTllMDUwNSZhbXA7ZmNFcnJvcj1mZmZmZmYmYW1wO2ljb25Db2xvckVycm9yPWZmY2YyOSZhbXA7YmdDb2xvck92ZXJsYXk9YWFhYWFhJmFtcDtiZ1RleHR1cmVPdmVybGF5PTA0X2hpZ2hsaWdodF9oYXJkLnBuZyZhbXA7YmdJbWdPcGFjaXR5T3ZlcmxheT00MCZhbXA7b3BhY2l0eU92ZXJsYXk9MzAmYW1wO2JnQ29sb3JTaGFkb3c9YWFhYWFhJmFtcDtiZ1RleHR1cmVTaGFkb3c9MDNfaGlnaGxpZ2h0X3NvZnQucG5nJmFtcDtiZ0ltZ09wYWNpdHlTaGFkb3c9NTAmYW1wO29wYWNpdHlTaGFkb3c9MjAmYW1wO3RoaWNrbmVzc1NoYWRvdz04cHgmYW1wO29mZnNldFRvcFNoYWRvdz0tOHB4JmFtcDtvZmZzZXRMZWZ0U2hhZG93PS04cHgmYW1wO2Nvcm5lclJhZGl1c1NoYWRvdz04cHgiPgkJCTxpbWcgc3JjPSJodHRwOi8vbGVhcm5pbmdqcXVlcnkua3N3ZWRiZXJnLm5ldGRuYS1jZG4uY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy90aGVtZXJvbGxlci90aGVtZV85MF9ibGFja190aWUucG5nIiBhbHQ9IkJsYWNrIFRpZSIgdGl0bGU9IkJsYWNrIFRpZSIgLz4JCQk8c3BhbiBjbGFzcz0idGhlbWVOYW1lIj5CbGFjayBUaWU8L3NwYW4+CQk8L2E+PC9saT4JCTxsaT48YSBocmVmPSJodHRwOi8vanF1ZXJ5dWkuY29tL3RoZW1lcm9sbGVyL2Nzcy9wYXJzZVRoZW1lLmNzcy5waHA/ZmZEZWZhdWx0PVNlZ29lK1VJLCtIZWx2ZXRpY2EsK0FyaWFsLCtzYW5zLXNlcmlmJmFtcDtmd0RlZmF1bHQ9Ym9sZCZhbXA7ZnNEZWZhdWx0PTEuMWVtJmFtcDtjb3JuZXJSYWRpdXM9NnB4JmFtcDtiZ0NvbG9ySGVhZGVyPTlmZGE1OCZhbXA7YmdUZXh0dXJlSGVhZGVyPTEyX2dsb3NzX3dhdmUucG5nJmFtcDtiZ0ltZ09wYWNpdHlIZWFkZXI9ODUmYW1wO2JvcmRlckNvbG9ySGVhZGVyPTAwMDAwMCZhbXA7ZmNIZWFkZXI9MjIyMjIyJmFtcDtpY29uQ29sb3JIZWFkZXI9MWYxZjFmJmFtcDtiZ0NvbG9yQ29udGVudD0wMDAwMDAmYW1wO2JnVGV4dHVyZUNvbnRlbnQ9MTJfZ2xvc3Nfd2F2ZS5wbmcmYW1wO2JnSW1nT3BhY2l0eUNvbnRlbnQ9NTUmYW1wO2JvcmRlckNvbG9yQ29udGVudD00YTRhNGEmYW1wO2ZjQ29udGVudD1mZmZmZmYmYW1wO2ljb25Db2xvckNvbnRlbnQ9OWZkYTU4JmFtcDtiZ0NvbG9yRGVmYXVsdD0wYTBhMGEmYW1wO2JnVGV4dHVyZURlZmF1bHQ9MDJfZ2xhc3MucG5nJmFtcDtiZ0ltZ09wYWNpdHlEZWZhdWx0PTQwJmFtcDtib3JkZXJDb2xvckRlZmF1bHQ9MWIxNjEzJmFtcDtmY0RlZmF1bHQ9YjhlYzc5JmFtcDtpY29uQ29sb3JEZWZhdWx0PWI4ZWM3OSZhbXA7YmdDb2xvckhvdmVyPTAwMDAwMCZhbXA7YmdUZXh0dXJlSG92ZXI9MDJfZ2xhc3MucG5nJmFtcDtiZ0ltZ09wYWNpdHlIb3Zlcj02MCZhbXA7Ym9yZGVyQ29sb3JIb3Zlcj0wMDAwMDAmYW1wO2ZjSG92ZXI9OTZmMjI2JmFtcDtpY29uQ29sb3JIb3Zlcj1iOGVjNzkmYW1wO2JnQ29sb3JBY3RpdmU9NGM0YzRjJmFtcDtiZ1RleHR1cmVBY3RpdmU9MDFfZmxhdC5wbmcmYW1wO2JnSW1nT3BhY2l0eUFjdGl2ZT0wJmFtcDtib3JkZXJDb2xvckFjdGl2ZT02OTY5NjkmYW1wO2ZjQWN0aXZlPWZmZmZmZiZhbXA7aWNvbkNvbG9yQWN0aXZlPWZmZmZmZiZhbXA7YmdDb2xvckhpZ2hsaWdodD1mMWZiZTUmYW1wO2JnVGV4dHVyZUhpZ2hsaWdodD0wMl9nbGFzcy5wbmcmYW1wO2JnSW1nT3BhY2l0eUhpZ2hsaWdodD01NSZhbXA7Ym9yZGVyQ29sb3JIaWdobGlnaHQ9OGNjZTNiJmFtcDtmY0hpZ2hsaWdodD0wMzAzMDMmYW1wO2ljb25Db2xvckhpZ2hsaWdodD0wMDAwMDAmYW1wO2JnQ29sb3JFcnJvcj1mNmVjZDUmYW1wO2JnVGV4dHVyZUVycm9yPTEyX2dsb3NzX3dhdmUucG5nJmFtcDtiZ0ltZ09wYWNpdHlFcnJvcj05NSZhbXA7Ym9yZGVyQ29sb3JFcnJvcj1mMWFjODgmYW1wO2ZjRXJyb3I9NzQ3MzZkJmFtcDtpY29uQ29sb3JFcnJvcj1jZDBhMGEmYW1wO2JnQ29sb3JPdmVybGF5PTI2MjYyNiZhbXA7YmdUZXh0dXJlT3ZlcmxheT0wN19kaWFnb25hbHNfc21hbGwucG5nJmFtcDtiZ0ltZ09wYWNpdHlPdmVybGF5PTUwJmFtcDtvcGFjaXR5T3ZlcmxheT0zMCZhbXA7YmdDb2xvclNoYWRvdz0zMDMwMzAmYW1wO2JnVGV4dHVyZVNoYWRvdz0wMV9mbGF0LnBuZyZhbXA7YmdJbWdPcGFjaXR5U2hhZG93PTAmYW1wO29wYWNpdHlTaGFkb3c9NTAmYW1wO3RoaWNrbmVzc1NoYWRvdz02cHgmYW1wO29mZnNldFRvcFNoYWRvdz0tNnB4JmFtcDtvZmZzZXRMZWZ0U2hhZG93PS02cHgmYW1wO2Nvcm5lclJhZGl1c1NoYWRvdz0xMnB4Ij4JCQk8aW1nIHNyYz0iaHR0cDovL2xlYXJuaW5nanF1ZXJ5Lmtzd2VkYmVyZy5uZXRkbmEtY2RuLmNvbS93cC1jb250ZW50L3VwbG9hZHMvdGhlbWVyb2xsZXIvdGhlbWVfOTBfdHJvbnRhc3RpYy5wbmciIGFsdD0iVHJvbnRhc3RpYyIgdGl0bGU9IlRyb250YXN0aWMiIC8+CQkJPHNwYW4gY2xhc3M9InRoZW1lTmFtZSI+VHJvbnRhc3RpYzwvc3Bhbj4JCQk8L2E+PC9saT4JCQk8bGk+PGEgaHJlZj0iaHR0cDovL2pxdWVyeXVpLmNvbS90aGVtZXJvbGxlci9jc3MvcGFyc2VUaGVtZS5jc3MucGhwP2ZmRGVmYXVsdD1HZW9yZ2lhJTJDK1ZlcmRhbmElMkNBcmlhbCUyQ3NhbnMtc2VyaWYmYW1wO2Z3RGVmYXVsdD1ib2xkJmFtcDtmc0RlZmF1bHQ9MS4yZW0mYW1wO2Nvcm5lclJhZGl1cz01cHgmYW1wO2JnQ29sb3JIZWFkZXI9MjYxODAzJmFtcDtiZ1RleHR1cmVIZWFkZXI9MTNfZGlhbW9uZC5wbmcmYW1wO2JnSW1nT3BhY2l0eUhlYWRlcj04JmFtcDtib3JkZXJDb2xvckhlYWRlcj1iYWFhNWEmYW1wO2ZjSGVhZGVyPWVhY2Q4NiZhbXA7aWNvbkNvbG9ySGVhZGVyPWU5Y2Q4NiZhbXA7YmdDb2xvckNvbnRlbnQ9NDQzMTEzJmFtcDtiZ1RleHR1cmVDb250ZW50PTEzX2RpYW1vbmQucG5nJmFtcDtiZ0ltZ09wYWNpdHlDb250ZW50PTgmYW1wO2JvcmRlckNvbG9yQ29udGVudD1lZmVjOWYmYW1wO2ZjQ29udGVudD1lZmVjOWYmYW1wO2ljb25Db2xvckNvbnRlbnQ9ZWZlYzlmJmFtcDtiZ0NvbG9yRGVmYXVsdD00ZjQyMjEmYW1wO2JnVGV4dHVyZURlZmF1bHQ9MTNfZGlhbW9uZC5wbmcmYW1wO2JnSW1nT3BhY2l0eURlZmF1bHQ9MTAmYW1wO2JvcmRlckNvbG9yRGVmYXVsdD0zNjI5MTcmYW1wO2ZjRGVmYXVsdD1mOGVlYzkmYW1wO2ljb25Db2xvckRlZmF1bHQ9ZThlMmI1JmFtcDtiZ0NvbG9ySG92ZXI9Njc1NDIzJmFtcDtiZ1RleHR1cmVIb3Zlcj0xM19kaWFtb25kLnBuZyZhbXA7YmdJbWdPcGFjaXR5SG92ZXI9MjUmYW1wO2JvcmRlckNvbG9ySG92ZXI9MzYyOTE3JmFtcDtmY0hvdmVyPWY4ZWVjOSZhbXA7aWNvbkNvbG9ySG92ZXI9ZjJlYzY0JmFtcDtiZ0NvbG9yQWN0aXZlPTQ0MzExMyZhbXA7YmdUZXh0dXJlQWN0aXZlPTEzX2RpYW1vbmQucG5nJmFtcDtiZ0ltZ09wYWNpdHlBY3RpdmU9OCZhbXA7Ym9yZGVyQ29sb3JBY3RpdmU9ZWZlYzlmJmFtcDtmY0FjdGl2ZT1mOWYyYmQmYW1wO2ljb25Db2xvckFjdGl2ZT1mOWYyYmQmYW1wO2JnQ29sb3JIaWdobGlnaHQ9ZDVhYzVkJmFtcDtiZ1RleHR1cmVIaWdobGlnaHQ9MTNfZGlhbW9uZC5wbmcmYW1wO2JnSW1nT3BhY2l0eUhpZ2hsaWdodD0yNSZhbXA7Ym9yZGVyQ29sb3JIaWdobGlnaHQ9MzYyOTE3JmFtcDtmY0hpZ2hsaWdodD0wNjAyMDAmYW1wO2ljb25Db2xvckhpZ2hsaWdodD0wNzA2MDMmYW1wO2JnQ29sb3JFcnJvcj1mZWU0YmQmYW1wO2JnVGV4dHVyZUVycm9yPTA0X2hpZ2hsaWdodF9oYXJkLnBuZyZhbXA7YmdJbWdPcGFjaXR5RXJyb3I9NjUmYW1wO2JvcmRlckNvbG9yRXJyb3I9YzI2NjI5JmFtcDtmY0Vycm9yPTgwM2YxZSZhbXA7aWNvbkNvbG9yRXJyb3I9ZmY3NTE5JmFtcDtiZ0NvbG9yT3ZlcmxheT0zNzI4MDYmYW1wO2JnVGV4dHVyZU92ZXJsYXk9MTNfZGlhbW9uZC5wbmcmYW1wO2JnSW1nT3BhY2l0eU92ZXJsYXk9MjAmYW1wO29wYWNpdHlPdmVybGF5PTgwJmFtcDtiZ0NvbG9yU2hhZG93PWRkZDRiMCZhbXA7YmdUZXh0dXJlU2hhZG93PTAxX2ZsYXQucG5nJmFtcDtiZ0ltZ09wYWNpdHlTaGFkb3c9NzUmYW1wO29wYWNpdHlTaGFkb3c9MzAmYW1wO3RoaWNrbmVzc1NoYWRvdz04cHgmYW1wO29mZnNldFRvcFNoYWRvdz0tOHB4JmFtcDtvZmZzZXRMZWZ0U2hhZG93PS04cHgmYW1wO2Nvcm5lclJhZGl1c1NoYWRvdz0xMnB4Ij4JCQk8aW1nIHNyYz0iaHR0cDovL2xlYXJuaW5nanF1ZXJ5Lmtzd2VkYmVyZy5uZXRkbmEtY2RuLmNvbS93cC1jb250ZW50L3VwbG9hZHMvdGhlbWVyb2xsZXIvdGhlbWVfOTBfc3dhbmt5X3B1cnNlLnBuZyIgYWx0PSJTd2Fua3kgUHVyc2UiIHRpdGxlPSJTd2Fua3kgUHVyc2UiIC8+CQkJPHNwYW4gY2xhc3M9InRoZW1lTmFtZSI+U3dhbmt5IFB1cnNlPC9zcGFuPgkJCTwvYT48L2xpPgk8L3VsPjwvZGl2PjwvZGl2PicpLmZpbmQoJ2RpdicpLnJlbW92ZUF0dHIoJ2lkJyk7CgkKCS8vYnV0dG9uIGV2ZW50cwoJYnV0dG9uLmNsaWNrKAoJCWZ1bmN0aW9uKCl7CgkJCWlmKHN3aXRjaGVycGFuZS5pcygnOnZpc2libGUnKSl7IHN3aXRjaGVycGFuZS5zcEhpZGUoKTsgfQoJCQllbHNleyBzd2l0Y2hlcnBhbmUuc3BTaG93KCk7IH0KCQkJCQlyZXR1cm4gZmFsc2U7CgkJfQoJKTsKCQoJLy9tZW51IGV2ZW50cyAobW91c2VvdXQgZGlkbid0IHdvcmsuLi4pCglzd2l0Y2hlcnBhbmUuaG92ZXIoCgkJZnVuY3Rpb24oKXt9LAoJCWZ1bmN0aW9uKCl7aWYoc3dpdGNoZXJwYW5lLmlzKCc6dmlzaWJsZScpKXskKHRoaXMpLnNwSGlkZSgpO319CgkpOwoKCS8vc2hvdy9oaWRlIHBhbmVsIGZ1bmN0aW9ucwoJJC5mbi5zcFNob3cgPSBmdW5jdGlvbigpeyAkKHRoaXMpLmNzcyh7dG9wOiBidXR0b24ub2Zmc2V0KCkudG9wICsgb3B0aW9ucy5idXR0b25IZWlnaHQgKyA2LCBsZWZ0OiBidXR0b24ub2Zmc2V0KCkubGVmdH0pLnNsaWRlRG93big1MCk7IGJ1dHRvbi5jc3MoYnV0dG9uX2FjdGl2ZSk7IG9wdGlvbnMub25PcGVuKCk7IH0KCSQuZm4uc3BIaWRlID0gZnVuY3Rpb24oKXsgJCh0aGlzKS5zbGlkZVVwKDUwLCBmdW5jdGlvbigpe29wdGlvbnMub25DbG9zZSgpO30pOyBidXR0b24uY3NzKGJ1dHRvbl9kZWZhdWx0KTsgfQoJCgkJCgkvKiBUaGVtZSBMb2FkaW5nCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoJc3dpdGNoZXJwYW5lLmZpbmQoJ2EnKS5jbGljayhmdW5jdGlvbigpewoJCXVwZGF0ZUNTUyggJCh0aGlzKS5hdHRyKCdocmVmJykgKTsKCQl2YXIgdGhlbWVOYW1lID0gJCh0aGlzKS5maW5kKCdzcGFuJykudGV4dCgpOwoJCWJ1dHRvbi5maW5kKCcuanF1ZXJ5LXVpLXRoZW1lc3dpdGNoZXItdGl0bGUnKS50ZXh0KCBvcHRpb25zLmJ1dHRvblByZVRleHQgKyB0aGVtZU5hbWUgKTsKCQkkLmNvb2tpZShvcHRpb25zLmNvb2tpZU5hbWUsIHRoZW1lTmFtZSk7CgkJb3B0aW9ucy5vblNlbGVjdCgpOwoJCWlmKG9wdGlvbnMuY2xvc2VPblNlbGVjdCAmJiBzd2l0Y2hlcnBhbmUuaXMoJzp2aXNpYmxlJykpeyBzd2l0Y2hlcnBhbmUuc3BIaWRlKCk7IH0KCQlyZXR1cm4gZmFsc2U7Cgl9KTsKCQoJLy9mdW5jdGlvbiB0byBhcHBlbmQgYSBuZXcgdGhlbWUgc3R5bGVzaGVldCB3aXRoIHRoZSBuZXcgc3R5bGUgY2hhbmdlcwoJZnVuY3Rpb24gdXBkYXRlQ1NTKGxvY1N0cil7CgkJdmFyIGNzc0xpbmsgPSAkKCc8bGluayBocmVmPSInK2xvY1N0cisnIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJTdHlsZXNoZWV0IiBjbGFzcz0idWktdGhlbWUiIC8+Jyk7CgkJJCgiaGVhZCIpLmFwcGVuZChjc3NMaW5rKTsKCQkKCQkKCQlpZiggJCgibGluay51aS10aGVtZSIpLnNpemUoKSA+IDMpewoJCQkkKCJsaW5rLnVpLXRoZW1lOmZpcnN0IikucmVtb3ZlKCk7CgkJfQkKCX0JCgkKCS8qIElubGluZSBDU1MgCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoJdmFyIGJ1dHRvbl9kZWZhdWx0ID0gewoJCWZvbnRGYW1pbHk6ICdUcmVidWNoZXQgTVMsIFZlcmRhbmEsIHNhbnMtc2VyaWYnLAoJCWZvbnRTaXplOiAnMTFweCcsCgkJY29sb3I6ICcjNjY2JywKCQliYWNrZ3JvdW5kOiAnI2VlZSB1cmwoaHR0cDovL2xlYXJuaW5nanF1ZXJ5Lmtzd2VkYmVyZy5uZXRkbmEtY2RuLmNvbS93cC1jb250ZW50L3VwbG9hZHMvdGhlbWVyb2xsZXIvYnV0dG9uYmcucG5nKSA1MCUgNTAlIHJlcGVhdC14JywKCQlib3JkZXI6ICcxcHggc29saWQgI2NjYycsCgkJJy1tb3otYm9yZGVyLXJhZGl1cyc6ICc2cHgnLAoJCSctd2Via2l0LWJvcmRlci1yYWRpdXMnOiAnNnB4JywKCQl0ZXh0RGVjb3JhdGlvbjogJ25vbmUnLAoJCXBhZGRpbmc6ICczcHggM3B4IDNweCA4cHgnLAoJCXdpZHRoOiBvcHRpb25zLndpZHRoIC0gMTEsLy9taW51cyBtdXN0IG1hdGNoIGxlZnQgYW5kIHJpZ2h0IHBhZGRpbmcgCgkJZGlzcGxheTogJ2Jsb2NrJywKCQloZWlnaHQ6IG9wdGlvbnMuYnV0dG9uSGVpZ2h0LAoJCW91dGxpbmU6ICcwJwoJfTsKCXZhciBidXR0b25faG92ZXIgPSB7CgkJJ2JvcmRlckNvbG9yJzonI2JiYicsCgkJJ2JhY2tncm91bmQnOiAnI2YwZjBmMCcsCgkJY3Vyc29yOiAncG9pbnRlcicsCgkJY29sb3I6ICcjNDQ0JwoJfTsKCXZhciBidXR0b25fYWN0aXZlID0gewoJCWNvbG9yOiAnI2FhYScsCgkJYmFja2dyb3VuZDogJyMwMDAnLAoJCWJvcmRlcjogJzFweCBzb2xpZCAjY2NjJywKCQlib3JkZXJCb3R0b206IDAsCgkJJy1tb3otYm9yZGVyLXJhZGl1cy1ib3R0b21sZWZ0JzogMCwKCQknLXdlYmtpdC1ib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzJzogMCwKCQknLW1vei1ib3JkZXItcmFkaXVzLWJvdHRvbXJpZ2h0JzogMCwKCQknLXdlYmtpdC1ib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1cyc6IDAsCgkJb3V0bGluZTogJzAnCgl9OwoJCgkKCQoJLy9idXR0b24gY3NzCglidXR0b24uY3NzKGJ1dHRvbl9kZWZhdWx0KQoJLmhvdmVyKAoJCWZ1bmN0aW9uKCl7IAoJCQkkKHRoaXMpLmNzcyhidXR0b25faG92ZXIpOyAKCQl9LAoJCWZ1bmN0aW9uKCl7IAoJCSBpZiggIXN3aXRjaGVycGFuZS5pcygnOmFuaW1hdGVkJykgJiYgc3dpdGNoZXJwYW5lLmlzKCc6aGlkZGVuJykgKXsJJCh0aGlzKS5jc3MoYnV0dG9uX2RlZmF1bHQpOyAgfQoJCX0JCgkpCgkuZmluZCgnLmpxdWVyeS11aS10aGVtZXN3aXRjaGVyLWljb24nKS5jc3MoewoJCSdmbG9hdCc6ICdyaWdodCcsCgkJd2lkdGg6ICcxNnB4JywKCQloZWlnaHQ6ICcxNnB4JywKCQliYWNrZ3JvdW5kOiAndXJsKGh0dHA6Ly9sZWFybmluZ2pxdWVyeS5rc3dlZGJlcmcubmV0ZG5hLWNkbi5jb20vd3AtY29udGVudC91cGxvYWRzL3RoZW1lcm9sbGVyL2ljb25fY29sb3JfYXJyb3cuZ2lmKSA1MCUgNTAlIG5vLXJlcGVhdCcKCX0pOwkKCS8vcGFuZSBjc3MKCXN3aXRjaGVycGFuZS5jc3MoewoJCXBvc2l0aW9uOiAnYWJzb2x1dGUnLAoJCSdmbG9hdCc6ICdsZWZ0JywKCQlmb250RmFtaWx5OiAnVHJlYnVjaGV0IE1TLCBWZXJkYW5hLCBzYW5zLXNlcmlmJywKCQlmb250U2l6ZTogJzEycHgnLAoJCWJhY2tncm91bmQ6ICcjMDAwJywKCQljb2xvcjogJyNmZmYnLAoJCXBhZGRpbmc6ICc4cHggM3B4IDNweCcsCgkJYm9yZGVyOiAnMXB4IHNvbGlkICNjY2MnLAoJCSctbW96LWJvcmRlci1yYWRpdXMtYm90dG9tbGVmdCc6ICc2cHgnLAoJCSctd2Via2l0LWJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXMnOiAnNnB4JywKCQknLW1vei1ib3JkZXItcmFkaXVzLWJvdHRvbXJpZ2h0JzogJzZweCcsCgkJJy13ZWJraXQtYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXMnOiAnNnB4JywKCQlib3JkZXJUb3A6IDAsCgkJekluZGV4OiA5OTk5OTksCgkJd2lkdGg6IG9wdGlvbnMud2lkdGgtNi8vbWludXMgbXVzdCBtYXRjaCBsZWZ0IGFuZCByaWdodCBwYWRkaW5nCgl9KQoJLmZpbmQoJ3VsJykuY3NzKHsKCQlsaXN0U3R5bGU6ICdub25lJywKCQltYXJnaW46ICcwJywKCQlwYWRkaW5nOiAnMCcsCgkJb3ZlcmZsb3c6ICdhdXRvJywKCQloZWlnaHQ6IG9wdGlvbnMuaGVpZ2h0Cgl9KS5lbmQoKQoJLmZpbmQoJ2xpJykuaG92ZXIoCgkJZnVuY3Rpb24oKXsgCgkJCSQodGhpcykuY3NzKHsKCQkJCSdib3JkZXJDb2xvcic6JyM1NTUnLAoJCQkJJ2JhY2tncm91bmQnOiAndXJsKGh0dHA6Ly9sZWFybmluZ2pxdWVyeS5rc3dlZGJlcmcubmV0ZG5hLWNkbi5jb20vd3AtY29udGVudC91cGxvYWRzL3RoZW1lcm9sbGVyL21lbnVob3ZlcmJnLnBuZykgNTAlIDUwJSByZXBlYXQteCcsCgkJCQljdXJzb3I6ICdwb2ludGVyJwoJCQl9KTsgCgkJfSwKCQlmdW5jdGlvbigpeyAKCQkJJCh0aGlzKS5jc3MoewoJCQkJJ2JvcmRlckNvbG9yJzonIzExMScsCgkJCQknYmFja2dyb3VuZCc6ICcjMDAwJywKCQkJCWN1cnNvcjogJ2F1dG8nCgkJCX0pOyAKCQl9CgkpLmNzcyh7CgkJd2lkdGg6IG9wdGlvbnMud2lkdGgtMzAsCgkJaGVpZ2h0OiAnJywKCQlwYWRkaW5nOiAnMnB4JywKCQltYXJnaW46ICcxcHgnLAoJCWJvcmRlcjogJzFweCBzb2xpZCAjMTExJywKCQknLW1vei1ib3JkZXItcmFkaXVzJzogJzRweCcsCgkJY2xlYXI6ICdsZWZ0JywKCQknZmxvYXQnOiAnbGVmdCcKCX0pLmVuZCgpCgkuZmluZCgnYScpLmNzcyh7CgkJY29sb3I6ICcjYWFhJywKCQl0ZXh0RGVjb3JhdGlvbjogJ25vbmUnLAoJCSdmbG9hdCc6ICdsZWZ0JywKCQl3aWR0aDogJzEwMCUnLAoJCW91dGxpbmU6ICcwJwoJfSkuZW5kKCkKCS5maW5kKCdpbWcnKS5jc3MoewoJCSdmbG9hdCc6ICdsZWZ0JywKCQlib3JkZXI6ICcxcHggc29saWQgIzMzMycsCgkJbWFyZ2luOiAnMCAycHgnCgl9KS5lbmQoKQoJLmZpbmQoJy50aGVtZU5hbWUnKS5jc3MoewoJCSdmbG9hdCc6ICdsZWZ0JywKCQltYXJnaW46ICczcHggMCcKCX0pLmVuZCgpOwoJCgoKCSQodGhpcykuYXBwZW5kKGJ1dHRvbik7CgkkKCdib2R5JykuYXBwZW5kKHN3aXRjaGVycGFuZSk7Cglzd2l0Y2hlcnBhbmUuaGlkZSgpOwoJaWYoICQuY29va2llKG9wdGlvbnMuY29va2llTmFtZSkgfHwgb3B0aW9ucy5sb2FkVGhlbWUgKXsKCQl2YXIgdGhlbWVOYW1lID0gJC5jb29raWUob3B0aW9ucy5jb29raWVOYW1lKSB8fCBvcHRpb25zLmxvYWRUaGVtZTsKCQlzd2l0Y2hlcnBhbmUuZmluZCgnYTpjb250YWlucygnKyB0aGVtZU5hbWUgKycpJykudHJpZ2dlcignY2xpY2snKTsKCX0KCglyZXR1cm4gdGhpczsKfTsKCgoKCi8qKgogKiBDb29raWUgcGx1Z2luCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiBLbGF1cyBIYXJ0bCAoc3RpbGJ1ZXJvLmRlKQogKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIEdQTCBsaWNlbnNlczoKICogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHAKICogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC5odG1sCiAqCiAqLwpqUXVlcnkuY29va2llID0gZnVuY3Rpb24obmFtZSwgdmFsdWUsIG9wdGlvbnMpIHsKICAgIGlmICh0eXBlb2YgdmFsdWUgIT0gJ3VuZGVmaW5lZCcpIHsgLy8gbmFtZSBhbmQgdmFsdWUgZ2l2ZW4sIHNldCBjb29raWUKICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKICAgICAgICBpZiAodmFsdWUgPT09IG51bGwpIHsKICAgICAgICAgICAgdmFsdWUgPSAnJzsKICAgICAgICAgICAgb3B0aW9ucy5leHBpcmVzID0gLTE7CiAgICAgICAgfQogICAgICAgIHZhciBleHBpcmVzID0gJyc7CiAgICAgICAgaWYgKG9wdGlvbnMuZXhwaXJlcyAmJiAodHlwZW9mIG9wdGlvbnMuZXhwaXJlcyA9PSAnbnVtYmVyJyB8fCBvcHRpb25zLmV4cGlyZXMudG9VVENTdHJpbmcpKSB7CiAgICAgICAgICAgIHZhciBkYXRlOwogICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuZXhwaXJlcyA9PSAnbnVtYmVyJykgewogICAgICAgICAgICAgICAgZGF0ZSA9IG5ldyBEYXRlKCk7CiAgICAgICAgICAgICAgICBkYXRlLnNldFRpbWUoZGF0ZS5nZXRUaW1lKCkgKyAob3B0aW9ucy5leHBpcmVzICogMjQgKiA2MCAqIDYwICogMTAwMCkpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZGF0ZSA9IG9wdGlvbnMuZXhwaXJlczsKICAgICAgICAgICAgfQogICAgICAgICAgICBleHBpcmVzID0gJzsgZXhwaXJlcz0nICsgZGF0ZS50b1VUQ1N0cmluZygpOyAvLyB1c2UgZXhwaXJlcyBhdHRyaWJ1dGUsIG1heC1hZ2UgaXMgbm90IHN1cHBvcnRlZCBieSBJRQogICAgICAgIH0KICAgICAgICAvLyBDQVVUSU9OOiBOZWVkZWQgdG8gcGFyZW50aGVzaXplIG9wdGlvbnMucGF0aCBhbmQgb3B0aW9ucy5kb21haW4KICAgICAgICAvLyBpbiB0aGUgZm9sbG93aW5nIGV4cHJlc3Npb25zLCBvdGhlcndpc2UgdGhleSBldmFsdWF0ZSB0byB1bmRlZmluZWQKICAgICAgICAvLyBpbiB0aGUgcGFja2VkIHZlcnNpb24gZm9yIHNvbWUgcmVhc29uLi4uCiAgICAgICAgdmFyIHBhdGggPSBvcHRpb25zLnBhdGggPyAnOyBwYXRoPScgKyAob3B0aW9ucy5wYXRoKSA6ICcnOwogICAgICAgIHZhciBkb21haW4gPSBvcHRpb25zLmRvbWFpbiA/ICc7IGRvbWFpbj0nICsgKG9wdGlvbnMuZG9tYWluKSA6ICcnOwogICAgICAgIHZhciBzZWN1cmUgPSBvcHRpb25zLnNlY3VyZSA/ICc7IHNlY3VyZScgOiAnJzsKICAgICAgICBkb2N1bWVudC5jb29raWUgPSBbbmFtZSwgJz0nLCBlbmNvZGVVUklDb21wb25lbnQodmFsdWUpLCBleHBpcmVzLCBwYXRoLCBkb21haW4sIHNlY3VyZV0uam9pbignJyk7CiAgICB9IGVsc2UgeyAvLyBvbmx5IG5hbWUgZ2l2ZW4sIGdldCBjb29raWUKICAgICAgICB2YXIgY29va2llVmFsdWUgPSBudWxsOwogICAgICAgIGlmIChkb2N1bWVudC5jb29raWUgJiYgZG9jdW1lbnQuY29va2llICE9ICcnKSB7CiAgICAgICAgICAgIHZhciBjb29raWVzID0gZG9jdW1lbnQuY29va2llLnNwbGl0KCc7Jyk7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29va2llcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgdmFyIGNvb2tpZSA9IGpRdWVyeS50cmltKGNvb2tpZXNbaV0pOwogICAgICAgICAgICAgICAgLy8gRG9lcyB0aGlzIGNvb2tpZSBzdHJpbmcgYmVnaW4gd2l0aCB0aGUgbmFtZSB3ZSB3YW50PwogICAgICAgICAgICAgICAgaWYgKGNvb2tpZS5zdWJzdHJpbmcoMCwgbmFtZS5sZW5ndGggKyAxKSA9PSAobmFtZSArICc9JykpIHsKICAgICAgICAgICAgICAgICAgICBjb29raWVWYWx1ZSA9IGRlY29kZVVSSUNvbXBvbmVudChjb29raWUuc3Vic3RyaW5nKG5hbWUubGVuZ3RoICsgMSkpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBjb29raWVWYWx1ZTsKICAgIH0KfTsK]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/readme.md</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[IyBqUXVlcnkgY2x1ZVRpcCBQbHVnaW4KCiMjIExpY2Vuc2UKCkR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgR1BMIGxpY2Vuc2VzOgoKKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocAoqIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwuaHRtbAoKQ29weXJpZ2h0IEthcmwgU3dlZGJlcmcKCiMjIFJlcXVpcmVtZW50cwoKKiBqUXVlcnkgdjEuMysKCiMjIERlc2NyaXB0aW9uCgpEaXNwbGF5cyBhIGhpZ2hseSBjdXN0b21pemFibGUgdG9vbHRpcCB3aGVuIHRoZSB1c2VyIGludGVyYWN0cyB3aXRoIHRoZSBtYXRjaGVkIGVsZW1lbnQuIEFzIG9mIGNsdWVUaXAgdmVyc2lvbiAxLjEsIHRoaXMgcGx1Z2luIGlzIFtUaGVtZVJvbGxlciBSZWFkeV1bMV0uCgoqICoqRnVsbCBkb2N1bWVudGF0aW9uKio6IFtodHRwOi8vcGx1Z2lucy5sZWFybmluZ2pxdWVyeS5jb20vY2x1ZXRpcC9dCiogKipEZW1vcyoqOiBbaHR0cDovL3BsdWdpbnMubGVhcm5pbmdqcXVlcnkuY29tL2NsdWV0aXAvZGVtby9dCgojIyBLbm93biBJc3N1ZXMKCiogV2hlbiBgLmNsdWV0aXAoKWAgaXMgaW52b2tlZCBmcm9tIGFuIGltYWdlIG1hcCBgPGFyZWE+YCBlbGVtZW50LCB0aGUgcGx1Z2luIGlnbm9yZXMgdGhlIGBwb3N0aW9uQnlgIG9wdGlvbi4gUG9zaXRpb25pbmcgdGhlIHRvb2x0aXAgYnkgdGhlIGBjb29yZHNgIGlzIGJleW9uZCB0aGUgc2NvcGUgb2YgdGhlIHBsdWdpbiwgc28gaXQgaW5zdGVhZCBmYWxscyBiYWNrIHRvIHBvc2l0aW9uaW5nIGFjY29yZGluZyB0byB0aGUgbW91c2UncyBwb3NpdGlvbiAoYGV2ZW50LnBhZ2VYYCBhbmQgYGV2ZW50LnBhZ2VZYCkgd2hlbiBpdCBlbnRlcnMgdGhlIGA8YXJlYT5gLgoKIyMgSW1wb3J0YW50IGNsdWVUaXAgMS4yIENoYW5nZQoKVmVyc2lvbiAxLjIgb2YgdGhlIGNsdWVUaXAgcGx1Z2luIGNoYW5nZXMgdGhlIEhUTUwgc3RydWN0dXJlIG9mIHRoZSB0b29sdGlwLiBJdCB1c2VzIGNsYXNzZXMgaW5zdGVhZCBvZiBJRHMgZm9yIHRoZSBlbGVtZW50cyB3aXRoaW4gdGhlIGNsdWVUaXAuIFRoaXMgYWxsb3dzIG11bHRpcGxlIHRvb2x0aXBzIHRvIGJlIHZpc2libGUgYXQgdGhlIHNhbWUgdGltZSAob25lIHBlciBjYWxsIHRvIHRoZSAuY2x1ZXRpcCgpIG1ldGhvZCkgaWYgdGhlIGBtdWx0aXBsZWAgb3B0aW9uIGlzIHNldCB0byBgdHJ1ZWAuCgpUaGUgcGx1Z2luIG1heSBub3Qgd29yayBhcyBleHBlY3RlZCBpZiB5b3UgdXBkYXRlIGpxdWVyeS5jbHVldGlwLmpzIHRvIHZlcnNpb24gMS4yKyBhbmQgeW91IGRvbid0IGFsc28gdXBkYXRlIHRoZSBqcXVlcnkuY2x1ZXRpcC5jc3Mgc3R5bGVzaGVldC4KCklmIHlvdSBoYXZlIGEgbG90IGludmVzdGVkIGluIHRoZSBvbGQgY2x1ZVRpcCdzIHN0cnVjdHVyZSB3aXRoIHRoZSBJRHMsIHlvdSBjYW4gZ2V0IGl0IGJhY2sgYnk6CgoxLiBhZGRpbmcgdGhlIGpxdWVyeS5jb21wYXQuY2x1ZXRpcC5qcyBmaWxlIGltbWVkaWF0ZWx5IGFmdGVyIGpxdWVyeS5jbHVldGlwLmpzLCBBTkQKMi4gcmVwbGFjaW5nIGpxdWVyeS5jbHVldGlwLmNzcyB3aXRoIGpxdWVyeS5jb21wYXQuY2x1ZXRpcC5jc3MuCgojIyBGZWF0dXJlcwoKIyMjIE9wdGlvbnMKClRoZSBjbHVlVGlwIHBsdWdpbiBhbGxvd3MgZm9yICh0b28/KSBtYW55IG9wdGlvbnMuIEZvciBhIGNvbXBsZXRlIGxpc3QsIGNoZWNrIG91dCB0aGUgW3BsdWdpbidzIGhvbWVwYWdlXVsyXQoKIyMjIENvbnRlbnQgdmlhIGFqYXgKCkJ5IGRlZmF1bHQsIHRoZSBjbHVlVGlwIHBsdWdpbiBsb2FkcyBhIHBhZ2UgaW5kaWNhdGVkIGJ5IHRoZSAicmVsIiBhdHRyaWJ1dGUgdmlhIGFqYXggYW5kIGRpc3BsYXlzIGl0cyBjb250ZW50cy4gSG93ZXZlciwgKnRoZSBhdHRyaWJ1dGUgdG8gYmUgdXNlZCBmb3IgYm90aCB0aGUgYm9keSBhbmQgdGhlIGhlYWRpbmcgb2YgdGhlIGNsdWVUaXAgaXMgdXNlci1jb25maWd1cmFibGUqLgpJZiBhICJ0aXRsZSIgYXR0cmlidXRlIGlzIHNwZWNpZmllZCwgaXRzIHZhbHVlIGlzIHVzZWQgYXMgdGhlIGNsdWVUaXAncyBoZWFkaW5nLgoKIyMjIENvbnRlbnQgZnJvbSBIVE1MIGVsZW1lbnQKCk9wdGlvbmFsbHksIHRoZSBjbHVlVGlwJ3MgYm9keSBjYW4gZGlzcGxheSBjb250ZW50IGZyb20gYW4gZWxlbWVudCBvbiB0aGUgc2FtZSBwYWdlLgoKSnVzdCBpbmRpY2F0ZSB0aGUgZWxlbWVudCdzIGlkIChlLmcuICIjc29tZS1pZCIpIGluIHRoZSByZWwgYXR0cmlidXRlLgoKIyMjIENvbnRlbnQgZnJvbSB0aXRsZSBhdHRyaWJ1dGUKCk9wdGlvbmFsbHksIHRoZSBjbHVlVGlwJ3MgYm9keSBjYW4gZGlzcGxheSBjb250ZW50IGZyb20gdGhlIHRpdGxlIGF0dHJpYnV0ZSwgd2hlbiBhIGRlbGltaXRlciBpcyBpbmRpY2F0ZWQuCgoqIFRoZSBzdHJpbmcgYmVmb3JlIHRoZSBmaXJzdCBpbnN0YW5jZSBvZiB0aGUgZGVsaW1pdGVyIGlzIHNldCBhcyB0aGUgY2x1ZVRpcCdzIGhlYWRpbmcuCiogQWxsIHN1YnNlcXVlbnQgc3RyaW5ncyBhcmUgd3JhcHBlZCBpbiBzZXBhcmF0ZSBESVZzIGFuZCBwbGFjZWQgaW4gdGhlIGNsdWVUaXAncyBib2R5LgoKIyMgRXhhbXBsZXMKCiMjIyBCYXNpYwoKVGhpcyBpcyB0aGUgbW9zdCBiYXNpYyBjbHVlVGlwLiBJdCBkaXNwbGF5cyBhIDI3NXB4LXdpZGUgY2x1ZVRpcCBvbiBtb3VzZW92ZXIgb2YgdGhlIGVsZW1lbnQgd2l0aCBhbiBJRCBvZiAidGlwLiIgT24gbW91c2VvdXQgb2YgdGhlIGVsZW1lbnQsIHRoZSBjbHVlVGlwIGlzIGhpZGRlbi4KCmBgYGphdmFzY3JpcHQKJCgnI3RpcCkuY2x1ZXRpcCgpOwpgYGAKCiMjIyBTZXR0aW5nIE11bHRpcGxlIE9wdGlvbnMKVGhlIGZvbGxvd2luZyBkaXNwbGF5cyBhIGNsdWVUaXAgb24gbW91c2VvdmVyIG9mIGFsbCBgPGE+YCBlbGVtZW50cyB3aXRoIGNsYXNzPSJjbHVlIi4gVGhlIGhvdmVyZWQgZWxlbWVudCBnZXRzIGEgY2xhc3Mgb2YgImhpZ2hsaWdodCIgYWRkZWQgdG8gaXQgKHNvIHRoYXQgaXQgY2FuIGJlIHN0eWxlZCBhcHByb3ByaWF0ZWx5LiBUaGlzIG1heSBiZSB1c2VmdWwgZm9yIG5vbi1hbmNob3IgZWxlbWVudHMgaW4gb2xkZXIgYnJvd3NlcnMgc3VjaCBhcyBJRTYuKS4gVGhlIGNsdWVUaXAgaXMgInN0aWNreSwiIHdoaWNoIG1lYW5zIHRoYXQgaXQgd2lsbCBub3QgYmUgaGlkZGVuIHVudGlsIHRoZSB1c2VyIGVpdGhlciBjbGlja3Mgb24gaXRzICJjbG9zZSIgdGV4dC9ncmFwaGljIG9yIGRpc3BsYXlzIGFub3RoZXIgY2x1ZVRpcC4gVGhlICJjbG9zZSIgdGV4dC9ncmFwaGljIGlzIHNldCB0byBkaXNwbGF5IGF0IHRoZSBib3R0b20gb2YgdGhlIGNsdWVUaXAgKGRlZmF1bHQgaXMgdG9wKSBhbmQgZGlzcGxheSBhbiBpbWFnZSByYXRoZXIgdGhhbiB0aGUgZGVmYXVsdCAiQ2xvc2UiIHRleHQuIE1vcmVvdmVyLCB0aGUgYm9keSBvZiB0aGUgY2x1ZVRpcCBpcyB0cnVuY2F0ZWQgdG8gdGhlIGZpcnN0IDYwIGNoYXJhY3RlcnMsIHdoaWNoIGFyZSBmb2xsb3dlZCBieSBhbiBlbGxpcHNpcyAoLi4uKS4gRmluYWxseSwgdGhlIGNsdWVUaXAgcmV0cmlldmVzIHRoZSBjb250ZW50IHdpdGggYSBgUE9TVGAgcmVxdWVzdCByYXRoZXIgdGhhbiB0aGUgZGVmYXVsdCBgR0VUYC4KCmBgYGphdmFzY3JpcHQKJCgnYS5jbHVlJykuY2x1ZXRpcCh7CiAgaG92ZXJDbGFzczogJ2hpZ2hsaWdodCcsCiAgc3RpY2t5OiB0cnVlLAogIGNsb3NlUG9zaXRpb246ICdib3R0b20nLAogIGNsb3NlVGV4dDogJzxpbWcgc3JjPSJjcm9zcy5wbmciIGFsdD0iY2xvc2UiIC8+JywKICB0cnVuY2F0ZTogNjAsCiAgYWpheFNldHRpbmdzOiB7CiAgICB0eXBlOiAnUE9TVCcKICB9Cn0pOwpgYGAKCiMjIyBUcmlnZ2VyaW5nIHRoZSBgaGlkZUNsdWV0aXBgIGV2ZW50ICh1c2VmdWwgZm9yIHRvdWNoIGRldmljZXMpCgpZb3UgY2FuIHByb2dyYW1tYXRpY2FsbHkgaGlkZSAoY2xvc2UpIGEgY2x1ZVRpcCBieSB0cmlnZ2VyaW5nIHRoZSAiaGlkZUNsdWV0aXAiIGN1c3RvbSBldmVudC4gT24gYSB0b3VjaC1lbmFibGVkIGRldmljZSwgZm9yIGV4YW1wbGUsIHlvdSBjb3VsZCBoaWRlIGFueSB2aXNpYmxlIGNsdWVUaXBzIHdoZW4gdGhlIHVzZXIgdG91Y2hlcyBhbnl3aGVyZSBpbiB0aGUgYm9keSBleGNlcHQgb24gYSBsaW5rIG9yIG9uIHRoZSBjbHVlVGlwIGl0c2VsZjoKCmBgYGphdmFzY3JpcHQKJCgnYm9keScpLmJpbmQoJ3RvdWNoc3RhcnQnLCBmdW5jdGlvbihldmVudCkgewogZXZlbnQgPSBldmVudC5vcmlnaW5hbEV2ZW50OwogdmFyIHRndCA9IGV2ZW50LnRvdWNoZXNbMF0gJiYgZXZlbnQudG91Y2hlc1swXS50YXJnZXQsCiAgICAgJHRndCA9ICQodGd0KTsKCiBpZiAodGd0Lm5vZGVOYW1lICE9PSAnQScgJiYgISR0Z3QuY2xvc2VzdCgnZGl2LmNsdWV0aXAnKS5sZW5ndGggKSB7CiAgICQoZG9jdW1lbnQpLnRyaWdnZXIoJ2hpZGVDbHVldGlwJyk7CiB9Cn0pOwpgYGAKCk1vcmUgZXhhbXBsZXMgY2FuIGJlIGZvdW5kIGF0IFtodHRwOi8vcGx1Z2lucy5sZWFybmluZ2pxdWVyeS5jb20vY2x1ZXRpcC9kZW1vL10oaHR0cDovL3BsdWdpbnMubGVhcm5pbmdqcXVlcnkuY29tL2NsdWV0aXAvZGVtby8pCgoKIyMgQ3JlZGl0cwoKKiBPcmlnaW5hbGx5IGluc3BpcmVkIGJ5IENvZHkgTGluZGxleSdzIGpUaXAgKGh0dHA6Ly93d3cuY29keWxpbmRsZXkuY29tKQoqIEh1Z2UgdGhhbmtzIHRvIEpvbmF0aGFuIENoYWZmZXIsIEdsZW4gTGlwa2EsIFNoZWxhbmUgRW5vcywgSGVjdG9yIFNhbnRvcywgVG9yYmVuIFNjaHJlaXRlciwgRGFuIEcuIFN3aXR6ZXIsIErDtnJuIFphZWZmZXJlciwgYW5kIHRoZSBtYW55IG90aGVycyB3aG8gaGVscGVkIHJlcG9ydCBhbmQgZml4IGJ1Z3MgYW5kIHN1Z2dlc3QgZmVhdHVyZXMuCgpbMV06IGh0dHA6Ly9qcXVlcnl1aS5jb20vdGhlbWVyb2xsZXIvClsyXTogaHR0cDovL3BsdWdpbnMubGVhcm5pbmdqcXVlcnkuY29tL2NsdWV0aXAvCg==]]></data>
	</file>
	<file>
	  <filename>/lib/combobox.lib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/combobox.lib/info.dat</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGluZm9bJ2pzJ10gPSAnanF1ZXJ5LmN1c3RvbS1jb21ib2JveC5qcyc7CiRpbmZvWydkZXBlbmRzJ10gPSAndWknOwo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lib/combobox.lib/jquery.custom-combobox.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKCAkICkgewogICAgJC53aWRnZXQoICJjdXN0b20uY29tYm9ib3giLCB7CglvcHRpb25zOiB7CgkgICAgYXV0b0FkZDogZmFsc2UKCX0sCgoJX2NyZWF0ZTogZnVuY3Rpb24oKSB7CgkgICAgdGhpcy53cmFwcGVyID0gJCggIjxzcGFuPiIgKQoJCS5hZGRDbGFzcyggImN1c3RvbS1jb21ib2JveCIgKQoJCS5pbnNlcnRBZnRlciggdGhpcy5lbGVtZW50ICk7CgoJICAgIHRoaXMuZWxlbWVudC5oaWRlKCk7CgkgICAgdGhpcy5fY3JlYXRlQXV0b2NvbXBsZXRlKCk7CgkgICAgdGhpcy5fY3JlYXRlU2hvd0FsbEJ1dHRvbigpOwoJfSwKCglfY3JlYXRlQXV0b2NvbXBsZXRlOiBmdW5jdGlvbigpIHsKCSAgICB2YXIgc2VsZWN0ZWQgPSB0aGlzLmVsZW1lbnQuY2hpbGRyZW4oICI6c2VsZWN0ZWQiICksCgkJdmFsdWUgPSBzZWxlY3RlZC52YWwoKSA/IHNlbGVjdGVkLnRleHQoKSA6ICIiOwoKCSAgICB0aGlzLmlucHV0ID0gJCggIjxpbnB1dD4iICkKCQkuYXBwZW5kVG8oIHRoaXMud3JhcHBlciApCgkJLnZhbCggdmFsdWUgKQoJCS5hdHRyKCAidGl0bGUiLCAiIiApCgkJLmFkZENsYXNzKCAiY3VzdG9tLWNvbWJvYm94LWlucHV0IHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1zdGF0ZS1kZWZhdWx0IHVpLWNvcm5lci1sZWZ0IiApCgkJLmF1dG9jb21wbGV0ZSh7CgkJICAgIGRlbGF5OiAwLAoJCSAgICBtaW5MZW5ndGg6IDAsCgkJICAgIHNvdXJjZTogJC5wcm94eSggdGhpcywgIl9zb3VyY2UiICkKCQl9KQoJCS50b29sdGlwKHsKCQkgICAgdG9vbHRpcENsYXNzOiAidWktc3RhdGUtaGlnaGxpZ2h0IgoJCX0pOwoKCSAgICB0aGlzLl9vbiggdGhpcy5pbnB1dCwgewoJCWF1dG9jb21wbGV0ZXNlbGVjdDogZnVuY3Rpb24oIGV2ZW50LCB1aSApIHsKCQkgICAgdWkuaXRlbS5vcHRpb24uc2VsZWN0ZWQgPSB0cnVlOwoJCSAgICB0aGlzLl90cmlnZ2VyKCAic2VsZWN0IiwgZXZlbnQsIHsKCQkJaXRlbTogdWkuaXRlbS5vcHRpb24KCQkgICAgfSk7CgkJfSwKCgkJYXV0b2NvbXBsZXRlY2hhbmdlOiAiX3JlbW92ZUlmSW52YWxpZCIKCSAgICB9KTsKCX0sCgoJX2NyZWF0ZVNob3dBbGxCdXR0b246IGZ1bmN0aW9uKCkgewoJICAgIHZhciBpbnB1dCA9IHRoaXMuaW5wdXQsCgkJd2FzT3BlbiA9IGZhbHNlOwoKCSAgICAkKCAiPGE+IiApCgkJLmF0dHIoICJ0YWJJbmRleCIsIC0xICkKCQkuYXR0ciggInRpdGxlIiwgIlNob3cgQWxsIEl0ZW1zIiApCgkJLnRvb2x0aXAoKQoJCS5hcHBlbmRUbyggdGhpcy53cmFwcGVyICkKCQkuYnV0dG9uKHsKCQkgICAgaWNvbnM6IHsKCQkJcHJpbWFyeTogInVpLWljb24tdHJpYW5nbGUtMS1zIgoJCSAgICB9LAoJCSAgICB0ZXh0OiBmYWxzZQoJCX0pCgkJLnJlbW92ZUNsYXNzKCAidWktY29ybmVyLWFsbCIgKQoJCS5hZGRDbGFzcyggImN1c3RvbS1jb21ib2JveC10b2dnbGUgdWktY29ybmVyLXJpZ2h0IiApCgkJLm1vdXNlZG93bihmdW5jdGlvbigpIHsKCQkgICAgd2FzT3BlbiA9IGlucHV0LmF1dG9jb21wbGV0ZSggIndpZGdldCIgKS5pcyggIjp2aXNpYmxlIiApOwoJCX0pCgkJLmNsaWNrKGZ1bmN0aW9uKCkgewoJCSAgICBpbnB1dC5mb2N1cygpOwoKCQkgICAgLy8gQ2xvc2UgaWYgYWxyZWFkeSB2aXNpYmxlCgkJICAgIGlmICggd2FzT3BlbiApIHsKCQkJcmV0dXJuOwoJCSAgICB9CgoJCSAgICAvLyBQYXNzIGVtcHR5IHN0cmluZyBhcyB2YWx1ZSB0byBzZWFyY2ggZm9yLCBkaXNwbGF5aW5nIGFsbCByZXN1bHRzCgkJICAgIGlucHV0LmF1dG9jb21wbGV0ZSggInNlYXJjaCIsICIiICk7CgkJfSk7Cgl9LAoKCV9zb3VyY2U6IGZ1bmN0aW9uKCByZXF1ZXN0LCByZXNwb25zZSApIHsKCSAgICB2YXIgbWF0Y2hlciA9IG5ldyBSZWdFeHAoICQudWkuYXV0b2NvbXBsZXRlLmVzY2FwZVJlZ2V4KHJlcXVlc3QudGVybSksICJpIiApOwoJICAgIHJlc3BvbnNlKCB0aGlzLmVsZW1lbnQuY2hpbGRyZW4oICJvcHRpb24iICkubWFwKGZ1bmN0aW9uKCkgewoJCXZhciB0ZXh0ID0gJCggdGhpcyApLnRleHQoKTsKCQlpZiAoIHRoaXMudmFsdWUgJiYgKCAhcmVxdWVzdC50ZXJtIHx8IG1hdGNoZXIudGVzdCh0ZXh0KSApICkKCQkgICAgcmV0dXJuIHsKCQkJbGFiZWw6IHRleHQsCgkJCXZhbHVlOiB0ZXh0LAoJCQlvcHRpb246IHRoaXMKCQkgICAgfTsKCSAgICB9KSApOwoJfSwKCglfcmVtb3ZlSWZJbnZhbGlkOiBmdW5jdGlvbiggZXZlbnQsIHVpICkgewoKCSAgICAvLyBTZWxlY3RlZCBhbiBpdGVtLCBub3RoaW5nIHRvIGRvCgkgICAgaWYgKCB1aS5pdGVtICkgewoJCXJldHVybjsKCSAgICB9CgoJICAgIC8vIFNlYXJjaCBmb3IgYSBtYXRjaCAoY2FzZS1pbnNlbnNpdGl2ZSkKCSAgICB2YXIgdmFsdWUgPSB0aGlzLmlucHV0LnZhbCgpLAoJCXZhbHVlTG93ZXJDYXNlID0gdmFsdWUudG9Mb3dlckNhc2UoKSwKCQl2YWxpZCA9IGZhbHNlOwoJICAgIHRoaXMuZWxlbWVudC5jaGlsZHJlbiggIm9wdGlvbiIgKS5lYWNoKGZ1bmN0aW9uKCkgewoJCWlmICggJCggdGhpcyApLnRleHQoKS50b0xvd2VyQ2FzZSgpID09PSB2YWx1ZUxvd2VyQ2FzZSApIHsKCQkgICAgdGhpcy5zZWxlY3RlZCA9IHZhbGlkID0gdHJ1ZTsKCQkgICAgcmV0dXJuIGZhbHNlOwoJCX0KCSAgICB9KTsKCgkgICAgLy8gRm91bmQgYSBtYXRjaCwgbm90aGluZyB0byBkbwoJICAgIGlmICggdmFsaWQgKSB7CgkJdGhpcy5lbGVtZW50LnZhbCh2YWx1ZSk7CgkJdGhpcy5lbGVtZW50LnRyaWdnZXIoJ2NoYW5nZScsZXZlbnQsdWkpCgkJcmV0dXJuOwoJICAgIH0KCgkgICAgaWYoIHRoaXMub3B0aW9ucy5hdXRvQWRkICkgewoJCS8vIGF1dG8gYWRkIHRoaXMgdGhpbmcgdG8gdGhlIGxpc3Q/CgkJdmFyIHIgPSB0cnVlOwoJCWlmKCAkLmlzRnVuY3Rpb24odGhpcy5vcHRpb25zLmF1dG9BZGQgKSApIHsKCQkgICAgciA9IHRoaXMub3B0aW9ucy5hdXRvQWRkKHZhbCk7CgkJfQoJCXZhciB2ID0gJCgnPG9wdGlvbi8+JykudmFsKHZhbHVlKS5odG1sKHZhbHVlKTsKCQl0aGlzLmVsZW1lbnQuYXBwZW5kKHYpOwoJCXRoaXMuZWxlbWVudC52YWwodmFsdWUpOwoJCXRoaXMuX3RyaWdnZXIoJ2FmdGVyYWRkJyxldmVudCx1aSk7CgkgICAgfQoJICAgIGVsc2UgewoJCS8vIFJlbW92ZSBpbnZhbGlkIHZhbHVlCgkJdGhpcy5pbnB1dAoJCSAgICAudmFsKCAiIiApCgkJICAgIC5hdHRyKCAidGl0bGUiLCB2YWx1ZSArICIgZGlkbid0IG1hdGNoIGFueSBpdGVtIiApCgkJICAgIC50b29sdGlwKCAib3BlbiIgKTsKCQl0aGlzLmVsZW1lbnQudmFsKCAiIiApOwoJCXRoaXMuX2RlbGF5KGZ1bmN0aW9uKCkgewoJCSAgICB0aGlzLmlucHV0LnRvb2x0aXAoICJjbG9zZSIgKS5hdHRyKCAidGl0bGUiLCAiIiApOwoJCX0sIDI1MDAgKTsKCQl0aGlzLmlucHV0LmRhdGEoICJ1aS1hdXRvY29tcGxldGUiICkudGVybSA9ICIiOwoJICAgIH0KCX0sCgoJX2Rlc3Ryb3k6IGZ1bmN0aW9uKCkgewoJICAgIHRoaXMud3JhcHBlci5yZW1vdmUoKTsKCSAgICB0aGlzLmVsZW1lbnQuc2hvdygpOwoJfSwKCglyZW1vdmVJdGVtczogZnVuY3Rpb24oKSB7CgkgICAgdGhpcy5lbGVtZW50LmNoaWxkcmVuKCdvcHRpb24nKS5yZW1vdmUoKTsKCX0sCgoJYWRkSXRlbTogZnVuY3Rpb24obykgewogICAgICAgICAgICB2YXIgdiA9ICQoJzxvcHRpb24vPicpLnZhbChvLnZhbCkuaHRtbChvLnRleHQpOwoJICAgIHRoaXMuZWxlbWVudC5hcHBlbmQodik7CgkgICAgdGhpcy5lbGVtZW50LnZhbChvLnZhbCk7CgkgICAgdGhpcy5pbnB1dC52YWwoby50ZXh0KTsKCX0sCgoJc2VsZWN0OiBmdW5jdGlvbih2KSB7CgkgICAgLyogZmluZCB0aGUgb3B0aW9uLCBnZXQgaXRzIHRleHQgKi8KCSAgICB2YXIgc2VsZiA9IHRoaXM7CgkgICAgdGhpcy5lbGVtZW50LmNoaWxkcmVuKCdvcHRpb24nKS5lYWNoKGZ1bmN0aW9uKCl7CgkJaWYoICQodGhpcykudmFsKCkgPT0gdiApIHsKCQkgICAgdGhpcy5zZWxlY3RlZCA9IHRydWU7CgkJICAgIHNlbGYuaW5wdXQudmFsKHRoaXMuaHRtbCgpKQoJCX0KCSAgICB9KQoJfQogICAgfSk7Cn0pKCBqUXVlcnkgKTsK]]></data>
	</file>
	<file>
	  <filename>/lib/fancybox.lib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/fancybox.lib/blank.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==]]></data>
	</file>
	<file>
	  <filename>/lib/fancybox.lib/fancybox_loading.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[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]]></data>
	</file>
	<file>
	  <filename>/lib/fancybox.lib/fancybox_overlay.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpCMEM4NDgzQjlDRTNFMTExODE4NUVDOTdFQ0I0RDgxRSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpGREU5OEVCQzAzMjYxMUUyOTg5OURDMDlDRTJDMTc0RSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpGREU5OEVCQjAzMjYxMUUyOTg5OURDMDlDRTJDMTc0RSIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkIxQzg0ODNCOUNFM0UxMTE4MTg1RUM5N0VDQjREODFFIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkIwQzg0ODNCOUNFM0UxMTE4MTg1RUM5N0VDQjREODFFIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+s3YRAQAAABtJREFUeNpiFODh2cBABGBiIBKMKqSOQoAAAwBokQDs5F/8FAAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/lib/fancybox.lib/fancybox_sprite.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAACwAAACYCAMAAACoAftQAAAAvVBMVEUAAAAAAAAAAAAODg4AAAAAAAAAAADNzc0BAQHZ2dkDAwMHBwcAAADf398CAgI/Pz8BAQEAAACCgoIcHBzl5eUAAAC/v7/x8fEGBgZnZ2cAAADs7OwGBgb4+Pg/Pz/Jycmenp5nZ2f39/eDg4MAAADQ0ND4+Piurq7a2tr8/Pzs7OwAAAD5+fn9/f3e3t4AAAD///9OTk7BwcE1NTWsrKyNjY2cnJx6enpdXV1oaGgsLCy6uroiIiLOzs5BQUFt3PCNAAAAL3RSTlMAAQMIDRIZHSMnLTpESFNVXWlpbG15en+HiZCWoaGssrO2vsDFydPU3uL4+fr9/Ywv6xsAAAQVSURBVHhe7JZbc6JMGIQXAUOQEMi3uMYkrmopZgqs5ujZ//+zvpdNzMsMlli1N3uRvtCbpzo9I+nmhyqN9OO6GNQ6Ha1SG0mcrhskXe90rvKE6kbX7r9MF4vp2887nfBrqPW0xJemD4w32e7jHIj2602SbNZ7Qfgd0zJLtgKi2B0+tSsE3h8u0RX7HGGfHWrK9oiIbrK69SiQHxTliO5VWtP0rrNEemhoj6muaYqx2XuGyJrwbgUKohhb3hIFM6wCC7Zm4+M5Zs5fpKNiTYndEOUHDFRYCeADLvGiy7DtL7E5/12gJPacalPlqEc2eoFAdmCa2UOGyOhoUuQgwo7PxCwJMGXYGcQMlyCVX3DchCkGs3V6h0iFgyUSZsuS6QQLGaYDhueUHxhf3RpzOqB8dRMcz84lf5FS9A1Ngi2PQm8PF7RBZOnEyqFnSC/BKX6bHQmucpB13mRzCJtTsPUowlpl14if2JifUXcwgeqdA2OLn1C+PdsbzCKkW0a3KeKxbbAxF4FJ9EgAaXGqyFORAuLZNrkMZNoNKnNS9PE5dpltFofjB4PJXIAk5rP/HMu4Ukmm7XjEkwLfc2yT66tJk7lp2T2H1LMtk2wVVsWpcE0SlW4DbeLE/xG3eRvfQv7Fptw4KvpDNRKLt1/3rZty/xbjrPef1+5D018ITYttkiTrfAUsrmzK3RTIT/woHxH3DaZl9h2rRH2aX0ydaYb1BVK1zNdA32RvNn7DkVmmoyeVJvYBMcdl5Vg2/lW0zpSbUNIKT12KLV8wVjsmNvGW63feU3qj86veGQmAA1e5qzbStNZdmVTlRzzbSjG+4+t4u1iqjxxjR6pczaiNBCCVXoGx25X7mUNGgJBHM/QsXWp+dk4U5xJjX4EXSM7ACcCxnnnm2zI8rxVoFgMr/lUwUpyNPvYVx/eRfaUSQzkzLWxEOVhiwynCAd2GvCm/2bquBPEo+LxnDv0YXdyfFOHQP+8EV/kY0enSorxyitoLxxwiabDRqDImWF2JJVBIeVNEk2HgsDGn7vkhcPy67lMOiBGF4AGS3tX8yYqAfb5eF/kRiMPX4cDjEDLd8wezJT4lwtHrMHBtbg6V9oLhYDYLw3A2eSVbn0elSdMCecFg+Ee0Kq7dlftLXSCrRxNE8lzH7hp0Nu3qpHQty7Ztq2sabHvtpb/SLauisVTye1O+N2Ubbxhu2xSAq6x1UwoAWfum8P3Gu5ZNYaUA2jaFJYCofVPYOWnZFD4TcLpxU1ZAnN24KRnfxQ2bshEE/Vub8r0p35vi/t9eHRoBDMNQDJUvMLkOkDMM+8D7b9cR+kOKLPy4juojnQeAkWWVAyLLLINVdovj44N8LOqi/3Djxo0bN5ZvdbWJuwHhrw2ILYdqBwDT2fEEXtrZFmVcCWLiAAAAAElFTkSuQmCC]]></data>
	</file>
	<file>
	  <filename>/lib/fancybox.lib/helpers/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/fancybox.lib/helpers/fancybox_buttons.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAFoAAABaCAMAAAAPdrEwAAAAvVBMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACoqKgAAABhYWEAAACKiooAAAAAAADj4+MAAADExMQAAABlZWWAgIAAAAAzMzMAAADg4OArKysAAADk5OR0dHRXV1dgYGCtra3u7u7Hx8eoqKjDw8P4+Pjv7++wsLD4+PjZ2dm/v7/Gxsb39/f5+fn5+fno6Oj6+vrb29vh4eHq6ur7+/vw8PD4+Pj29vb7+/v8/Pz////5+fn09PTy8vLw8PARO2GBAAAANnRSTlMAAQMFBwsOERUXHB8gJiguNzg9Pz8/Q0hLT1VWYGVoeH2IkaKkpKmxsrjExc3T1djc4uPw8vVWxhKTAAAC9ElEQVR4Xu2WXXeaQBCGgQUWiGCsibExiWk+bA0xNlZnP8D8/5/VQUp7FMYc95iLtjw3czHs45zx5bDWv05LS/gc7hewb5/txoOzR7bpP86aDeFMx/ZeNX+WTe7wResJutlE65ew2azPnb3qYK5V3e2iuXAXZnS7TWalb09LbEqttLrabfIpAKAbzQAw5Q3mLNcV38PtFeuKTNTdfi8VQiitFZa059fWheb1ep3nuRCg1NbSudKAp7CHT9TdLOqn2NqcTvsR21nXs1bYRHJEgNxaeiSh8P56gHAXvZoZ8e/w8G/zO2pYnTNrxz1VRU9Na2bL694LkVdyAXC2pc4Bqn1g98dNZ1c90aVaT2pqJ+ihW+TpU8l9ZFt/CB5ef7HKBZoTz941a5FvdkW5AW4G/Q1df2td3WHJ6BUIM4j86SkXQLkhOwv4Bs/Z6vlBSTLP6mbLn2cSRDocpgJkNvetRve7b2PNjPCLBQBmA3MCsLjgVpP7NrL3qx9qZsTtXC7QzBi6F5cdt0Hg8Mjfr/Y7ncJcd/d7RepY1OujuQmbOdZeHJc1/rbLfVZU5nM0/y20tLS0sNmpTXfDGAmrciBc6y8O2Y01ElflQCKp9Qs5eCyVknFZDNSg6MFjmWXoLIqBGoTIycHjDCCLy2KixlsKlIMfXb1GysGPr357Q3e58Q9RA8Cd9yELEfli3D26Ot9cgb8OE370hQgUL8a9yD323ygBRDny0V8ZKUU58vFfdBDUyEiMyxJxWQ5Xz8mRkZMYOanKgfAuOTLiBlEUuFU5EObjyP8jLS0tLexRF7hUl9mnyyvHSO0m00wqGVA35cmnpV56ZlNH11pKGTV3I6W1Wl1zI7X9aSkBSLWUMhsnZlN7y2w1ToFUK6mn3DZS89vVuDeYUuriiw4TZjZ1t5/wKCG2GQxGo9EgcY3Ujsc9m7mM/LAjnOga5JXIOgGRV4OsE9B5pbNOY5JXOus0dF7prNOY5JXOOg2dVzrrNCZ5pbNuTkvLT1EJqK9sfkCLAAAAAElFTkSuQmCC]]></data>
	</file>
	<file>
	  <filename>/lib/fancybox.lib/helpers/jquery.fancybox-buttons.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[I2ZhbmN5Ym94LWJ1dHRvbnMgewoJcG9zaXRpb246IGZpeGVkOwoJbGVmdDogMDsKCXdpZHRoOiAxMDAlOwoJei1pbmRleDogODA1MDsKfQoKI2ZhbmN5Ym94LWJ1dHRvbnMudG9wIHsKCXRvcDogMTBweDsKfQoKI2ZhbmN5Ym94LWJ1dHRvbnMuYm90dG9tIHsKCWJvdHRvbTogMTBweDsKfQoKI2ZhbmN5Ym94LWJ1dHRvbnMgdWwgewoJZGlzcGxheTogYmxvY2s7Cgl3aWR0aDogMTY2cHg7CgloZWlnaHQ6IDMwcHg7CgltYXJnaW46IDAgYXV0bzsKCXBhZGRpbmc6IDA7CglsaXN0LXN0eWxlOiBub25lOwoJYm9yZGVyOiAxcHggc29saWQgIzExMTsKCWJvcmRlci1yYWRpdXM6IDNweDsKCS13ZWJraXQtYm94LXNoYWRvdzogaW5zZXQgMCAwIDAgMXB4IHJnYmEoMjU1LDI1NSwyNTUsLjA1KTsKCSAgIC1tb3otYm94LXNoYWRvdzogaW5zZXQgMCAwIDAgMXB4IHJnYmEoMjU1LDI1NSwyNTUsLjA1KTsKCSAgICAgICAgYm94LXNoYWRvdzogaW5zZXQgMCAwIDAgMXB4IHJnYmEoMjU1LDI1NSwyNTUsLjA1KTsKCWJhY2tncm91bmQ6IHJnYig1MCw1MCw1MCk7CgliYWNrZ3JvdW5kOiAtbW96LWxpbmVhci1ncmFkaWVudCh0b3AsIHJnYig2OCw2OCw2OCkgMCUsIHJnYig1Miw1Miw1MikgNTAlLCByZ2IoNDEsNDEsNDEpIDUwJSwgcmdiKDUxLDUxLDUxKSAxMDAlKTsKCWJhY2tncm91bmQ6IC13ZWJraXQtZ3JhZGllbnQobGluZWFyLCBsZWZ0IHRvcCwgbGVmdCBib3R0b20sIGNvbG9yLXN0b3AoMCUscmdiKDY4LDY4LDY4KSksIGNvbG9yLXN0b3AoNTAlLHJnYig1Miw1Miw1MikpLCBjb2xvci1zdG9wKDUwJSxyZ2IoNDEsNDEsNDEpKSwgY29sb3Itc3RvcCgxMDAlLHJnYig1MSw1MSw1MSkpKTsKCWJhY2tncm91bmQ6IC13ZWJraXQtbGluZWFyLWdyYWRpZW50KHRvcCwgcmdiKDY4LDY4LDY4KSAwJSxyZ2IoNTIsNTIsNTIpIDUwJSxyZ2IoNDEsNDEsNDEpIDUwJSxyZ2IoNTEsNTEsNTEpIDEwMCUpOwoJYmFja2dyb3VuZDogLW8tbGluZWFyLWdyYWRpZW50KHRvcCwgcmdiKDY4LDY4LDY4KSAwJSxyZ2IoNTIsNTIsNTIpIDUwJSxyZ2IoNDEsNDEsNDEpIDUwJSxyZ2IoNTEsNTEsNTEpIDEwMCUpOwoJYmFja2dyb3VuZDogLW1zLWxpbmVhci1ncmFkaWVudCh0b3AsIHJnYig2OCw2OCw2OCkgMCUscmdiKDUyLDUyLDUyKSA1MCUscmdiKDQxLDQxLDQxKSA1MCUscmdiKDUxLDUxLDUxKSAxMDAlKTsKCWJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh0b3AsIHJnYig2OCw2OCw2OCkgMCUscmdiKDUyLDUyLDUyKSA1MCUscmdiKDQxLDQxLDQxKSA1MCUscmdiKDUxLDUxLDUxKSAxMDAlKTsKCWZpbHRlcjogcHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LmdyYWRpZW50KCBzdGFydENvbG9yc3RyPScjNDQ0NDQ0JywgZW5kQ29sb3JzdHI9JyMyMjIyMjInLEdyYWRpZW50VHlwZT0wICk7Cn0KCiNmYW5jeWJveC1idXR0b25zIHVsIGxpIHsKCWZsb2F0OiBsZWZ0OwoJbWFyZ2luOiAwOwoJcGFkZGluZzogMDsKfQoKI2ZhbmN5Ym94LWJ1dHRvbnMgYSB7CglkaXNwbGF5OiBibG9jazsKCXdpZHRoOiAzMHB4OwoJaGVpZ2h0OiAzMHB4OwoJdGV4dC1pbmRlbnQ6IC05OTk5cHg7CgliYWNrZ3JvdW5kLWltYWdlOiB1cmwoJ2ZhbmN5Ym94X2J1dHRvbnMucG5nJyk7CgliYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OwoJb3V0bGluZTogbm9uZTsKCW9wYWNpdHk6IDAuODsKfQoKI2ZhbmN5Ym94LWJ1dHRvbnMgYTpob3ZlciB7CglvcGFjaXR5OiAxOwp9CgojZmFuY3lib3gtYnV0dG9ucyBhLmJ0blByZXYgewoJYmFja2dyb3VuZC1wb3NpdGlvbjogNXB4IDA7Cn0KCiNmYW5jeWJveC1idXR0b25zIGEuYnRuTmV4dCB7CgliYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzNweCAwOwoJYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgIzNlM2UzZTsKfQoKI2ZhbmN5Ym94LWJ1dHRvbnMgYS5idG5QbGF5IHsKCWJhY2tncm91bmQtcG9zaXRpb246IDAgLTMwcHg7Cn0KCiNmYW5jeWJveC1idXR0b25zIGEuYnRuUGxheU9uIHsKCWJhY2tncm91bmQtcG9zaXRpb246IC0zMHB4IC0zMHB4Owp9CgojZmFuY3lib3gtYnV0dG9ucyBhLmJ0blRvZ2dsZSB7CgliYWNrZ3JvdW5kLXBvc2l0aW9uOiAzcHggLTYwcHg7Cglib3JkZXItbGVmdDogMXB4IHNvbGlkICMxMTE7Cglib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjM2UzZTNlOwoJd2lkdGg6IDM1cHgKfQoKI2ZhbmN5Ym94LWJ1dHRvbnMgYS5idG5Ub2dnbGVPbiB7CgliYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjdweCAtNjBweDsKfQoKI2ZhbmN5Ym94LWJ1dHRvbnMgYS5idG5DbG9zZSB7Cglib3JkZXItbGVmdDogMXB4IHNvbGlkICMxMTE7Cgl3aWR0aDogMzVweDsKCWJhY2tncm91bmQtcG9zaXRpb246IC01NnB4IDBweDsKfQoKI2ZhbmN5Ym94LWJ1dHRvbnMgYS5idG5EaXNhYmxlZCB7CglvcGFjaXR5IDogMC40OwoJY3Vyc29yOiBkZWZhdWx0Owp9]]></data>
	</file>
	<file>
	  <filename>/lib/fancybox.lib/helpers/jquery.fancybox-buttons.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[IC8qIQogKiBCdXR0b25zIGhlbHBlciBmb3IgZmFuY3lCb3gKICogdmVyc2lvbjogMS4wLjUgKE1vbiwgMTUgT2N0IDIwMTIpCiAqIEByZXF1aXJlcyBmYW5jeUJveCB2Mi4wIG9yIGxhdGVyCiAqCiAqIFVzYWdlOgogKiAgICAgJCgiLmZhbmN5Ym94IikuZmFuY3lib3goewogKiAgICAgICAgIGhlbHBlcnMgOiB7CiAqICAgICAgICAgICAgIGJ1dHRvbnM6IHsKICogICAgICAgICAgICAgICAgIHBvc2l0aW9uIDogJ3RvcCcKICogICAgICAgICAgICAgfQogKiAgICAgICAgIH0KICogICAgIH0pOwogKgogKi8KKGZ1bmN0aW9uICgkKSB7CgkvL1Nob3J0Y3V0IGZvciBmYW5jeUJveCBvYmplY3QKCXZhciBGID0gJC5mYW5jeWJveDsKCgkvL0FkZCBoZWxwZXIgb2JqZWN0CglGLmhlbHBlcnMuYnV0dG9ucyA9IHsKCQlkZWZhdWx0cyA6IHsKCQkJc2tpcFNpbmdsZSA6IGZhbHNlLCAvLyBkaXNhYmxlcyBpZiBnYWxsZXJ5IGNvbnRhaW5zIHNpbmdsZSBpbWFnZQoJCQlwb3NpdGlvbiAgIDogJ3RvcCcsIC8vICd0b3AnIG9yICdib3R0b20nCgkJCXRwbCAgICAgICAgOiAnPGRpdiBpZD0iZmFuY3lib3gtYnV0dG9ucyI+PHVsPjxsaT48YSBjbGFzcz0iYnRuUHJldiIgdGl0bGU9IlByZXZpb3VzIiBocmVmPSJqYXZhc2NyaXB0OjsiPjwvYT48L2xpPjxsaT48YSBjbGFzcz0iYnRuUGxheSIgdGl0bGU9IlN0YXJ0IHNsaWRlc2hvdyIgaHJlZj0iamF2YXNjcmlwdDo7Ij48L2E+PC9saT48bGk+PGEgY2xhc3M9ImJ0bk5leHQiIHRpdGxlPSJOZXh0IiBocmVmPSJqYXZhc2NyaXB0OjsiPjwvYT48L2xpPjxsaT48YSBjbGFzcz0iYnRuVG9nZ2xlIiB0aXRsZT0iVG9nZ2xlIHNpemUiIGhyZWY9ImphdmFzY3JpcHQ6OyI+PC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJidG5DbG9zZSIgdGl0bGU9IkNsb3NlIiBocmVmPSJqYXZhc2NyaXB0OmpRdWVyeS5mYW5jeWJveC5jbG9zZSgpOyI+PC9hPjwvbGk+PC91bD48L2Rpdj4nCgkJfSwKCgkJbGlzdCA6IG51bGwsCgkJYnV0dG9uczogbnVsbCwKCgkJYmVmb3JlTG9hZDogZnVuY3Rpb24gKG9wdHMsIG9iaikgewoJCQkvL1JlbW92ZSBzZWxmIGlmIGdhbGxlcnkgZG8gbm90IGhhdmUgYXQgbGVhc3QgdHdvIGl0ZW1zCgoJCQlpZiAob3B0cy5za2lwU2luZ2xlICYmIG9iai5ncm91cC5sZW5ndGggPCAyKSB7CgkJCQlvYmouaGVscGVycy5idXR0b25zID0gZmFsc2U7CgkJCQlvYmouY2xvc2VCdG4gPSB0cnVlOwoKCQkJCXJldHVybjsKCQkJfQoKCQkJLy9JbmNyZWFzZSB0b3AgbWFyZ2luIHRvIGdpdmUgc3BhY2UgZm9yIGJ1dHRvbnMKCQkJb2JqLm1hcmdpblsgb3B0cy5wb3NpdGlvbiA9PT0gJ2JvdHRvbScgPyAyIDogMCBdICs9IDMwOwoJCX0sCgoJCW9uUGxheVN0YXJ0OiBmdW5jdGlvbiAoKSB7CgkJCWlmICh0aGlzLmJ1dHRvbnMpIHsKCQkJCXRoaXMuYnV0dG9ucy5wbGF5LmF0dHIoJ3RpdGxlJywgJ1BhdXNlIHNsaWRlc2hvdycpLmFkZENsYXNzKCdidG5QbGF5T24nKTsKCQkJfQoJCX0sCgoJCW9uUGxheUVuZDogZnVuY3Rpb24gKCkgewoJCQlpZiAodGhpcy5idXR0b25zKSB7CgkJCQl0aGlzLmJ1dHRvbnMucGxheS5hdHRyKCd0aXRsZScsICdTdGFydCBzbGlkZXNob3cnKS5yZW1vdmVDbGFzcygnYnRuUGxheU9uJyk7CgkJCX0KCQl9LAoKCQlhZnRlclNob3c6IGZ1bmN0aW9uIChvcHRzLCBvYmopIHsKCQkJdmFyIGJ1dHRvbnMgPSB0aGlzLmJ1dHRvbnM7CgoJCQlpZiAoIWJ1dHRvbnMpIHsKCQkJCXRoaXMubGlzdCA9ICQob3B0cy50cGwpLmFkZENsYXNzKG9wdHMucG9zaXRpb24pLmFwcGVuZFRvKCdib2R5Jyk7CgoJCQkJYnV0dG9ucyA9IHsKCQkJCQlwcmV2ICAgOiB0aGlzLmxpc3QuZmluZCgnLmJ0blByZXYnKS5jbGljayggRi5wcmV2ICksCgkJCQkJbmV4dCAgIDogdGhpcy5saXN0LmZpbmQoJy5idG5OZXh0JykuY2xpY2soIEYubmV4dCApLAoJCQkJCXBsYXkgICA6IHRoaXMubGlzdC5maW5kKCcuYnRuUGxheScpLmNsaWNrKCBGLnBsYXkgKSwKCQkJCQl0b2dnbGUgOiB0aGlzLmxpc3QuZmluZCgnLmJ0blRvZ2dsZScpLmNsaWNrKCBGLnRvZ2dsZSApCgkJCQl9CgkJCX0KCgkJCS8vUHJldgoJCQlpZiAob2JqLmluZGV4ID4gMCB8fCBvYmoubG9vcCkgewoJCQkJYnV0dG9ucy5wcmV2LnJlbW92ZUNsYXNzKCdidG5EaXNhYmxlZCcpOwoJCQl9IGVsc2UgewoJCQkJYnV0dG9ucy5wcmV2LmFkZENsYXNzKCdidG5EaXNhYmxlZCcpOwoJCQl9CgoJCQkvL05leHQgLyBQbGF5CgkJCWlmIChvYmoubG9vcCB8fCBvYmouaW5kZXggPCBvYmouZ3JvdXAubGVuZ3RoIC0gMSkgewoJCQkJYnV0dG9ucy5uZXh0LnJlbW92ZUNsYXNzKCdidG5EaXNhYmxlZCcpOwoJCQkJYnV0dG9ucy5wbGF5LnJlbW92ZUNsYXNzKCdidG5EaXNhYmxlZCcpOwoKCQkJfSBlbHNlIHsKCQkJCWJ1dHRvbnMubmV4dC5hZGRDbGFzcygnYnRuRGlzYWJsZWQnKTsKCQkJCWJ1dHRvbnMucGxheS5hZGRDbGFzcygnYnRuRGlzYWJsZWQnKTsKCQkJfQoKCQkJdGhpcy5idXR0b25zID0gYnV0dG9uczsKCgkJCXRoaXMub25VcGRhdGUob3B0cywgb2JqKTsKCQl9LAoKCQlvblVwZGF0ZTogZnVuY3Rpb24gKG9wdHMsIG9iaikgewoJCQl2YXIgdG9nZ2xlOwoKCQkJaWYgKCF0aGlzLmJ1dHRvbnMpIHsKCQkJCXJldHVybjsKCQkJfQoKCQkJdG9nZ2xlID0gdGhpcy5idXR0b25zLnRvZ2dsZS5yZW1vdmVDbGFzcygnYnRuRGlzYWJsZWQgYnRuVG9nZ2xlT24nKTsKCgkJCS8vU2l6ZSB0b2dnbGUgYnV0dG9uCgkJCWlmIChvYmouY2FuU2hyaW5rKSB7CgkJCQl0b2dnbGUuYWRkQ2xhc3MoJ2J0blRvZ2dsZU9uJyk7CgoJCQl9IGVsc2UgaWYgKCFvYmouY2FuRXhwYW5kKSB7CgkJCQl0b2dnbGUuYWRkQ2xhc3MoJ2J0bkRpc2FibGVkJyk7CgkJCX0KCQl9LAoKCQliZWZvcmVDbG9zZTogZnVuY3Rpb24gKCkgewoJCQlpZiAodGhpcy5saXN0KSB7CgkJCQl0aGlzLmxpc3QucmVtb3ZlKCk7CgkJCX0KCgkJCXRoaXMubGlzdCAgICA9IG51bGw7CgkJCXRoaXMuYnV0dG9ucyA9IG51bGw7CgkJfQoJfTsKCn0oalF1ZXJ5KSk7]]></data>
	</file>
	<file>
	  <filename>/lib/fancybox.lib/helpers/jquery.fancybox-media.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohCiAqIE1lZGlhIGhlbHBlciBmb3IgZmFuY3lCb3gKICogdmVyc2lvbjogMS4wLjUgKFR1ZSwgMjMgT2N0IDIwMTIpCiAqIEByZXF1aXJlcyBmYW5jeUJveCB2Mi4wIG9yIGxhdGVyCiAqCiAqIFVzYWdlOgogKiAgICAgJCgiLmZhbmN5Ym94IikuZmFuY3lib3goewogKiAgICAgICAgIGhlbHBlcnMgOiB7CiAqICAgICAgICAgICAgIG1lZGlhOiB0cnVlCiAqICAgICAgICAgfQogKiAgICAgfSk7CiAqCiAqIFNldCBjdXN0b20gVVJMIHBhcmFtZXRlcnM6CiAqICAgICAkKCIuZmFuY3lib3giKS5mYW5jeWJveCh7CiAqICAgICAgICAgaGVscGVycyA6IHsKICogICAgICAgICAgICAgbWVkaWE6IHsKICogICAgICAgICAgICAgICAgIHlvdXR1YmUgOiB7CiAqICAgICAgICAgICAgICAgICAgICAgcGFyYW1zIDogewogKiAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvcGxheSA6IDAKICogICAgICAgICAgICAgICAgICAgICB9CiAqICAgICAgICAgICAgICAgICB9CiAqICAgICAgICAgICAgIH0KICogICAgICAgICB9CiAqICAgICB9KTsKICoKICogT3I6CiAqICAgICAkKCIuZmFuY3lib3giKS5mYW5jeWJveCh7LAogKgkgICAgICAgaGVscGVycyA6IHsKICogICAgICAgICAgICAgbWVkaWE6IHRydWUKICogICAgICAgICB9LAogKiAgICAgICAgIHlvdXR1YmUgOiB7CiAqICAgICAgICAgICAgIGF1dG9wbGF5OiAwCiAqICAgICAgICAgfQogKiAgICAgfSk7CiAqCiAqICBTdXBwb3J0czoKICoKICogICAgICBZb3V0dWJlCiAqICAgICAgICAgIGh0dHA6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj1vcGoyNEtuenJXbwogKiAgICAgICAgICBodHRwOi8vd3d3LnlvdXR1YmUuY29tL2VtYmVkL29wajI0S256cldvCiAqICAgICAgICAgIGh0dHA6Ly95b3V0dS5iZS9vcGoyNEtuenJXbwogKiAgICAgIFZpbWVvCiAqICAgICAgICAgIGh0dHA6Ly92aW1lby5jb20vNDA2NDgxNjkKICogICAgICAgICAgaHR0cDovL3ZpbWVvLmNvbS9jaGFubmVscy9zdGFmZnBpY2tzLzM4ODQzNjI4CiAqICAgICAgICAgIGh0dHA6Ly92aW1lby5jb20vZ3JvdXBzL3N1cnJlYWxpc20vdmlkZW9zLzM2NTE2Mzg0CiAqICAgICAgICAgIGh0dHA6Ly9wbGF5ZXIudmltZW8uY29tL3ZpZGVvLzQ1MDc0MzAzCiAqICAgICAgTWV0YWNhZmUKICogICAgICAgICAgaHR0cDovL3d3dy5tZXRhY2FmZS5jb20vd2F0Y2gvNzYzNTk2NC9kcl9zZXVzc190aGVfbG9yYXhfbW92aWVfdHJhaWxlci8KICogICAgICAgICAgaHR0cDovL3d3dy5tZXRhY2FmZS5jb20vd2F0Y2gvNzYzNTk2NC8KICogICAgICBEYWlseW1vdGlvbgogKiAgICAgICAgICBodHRwOi8vd3d3LmRhaWx5bW90aW9uLmNvbS92aWRlby94b3l0cWhfZHItc2V1c3MtdGhlLWxvcmF4LXByZW1pZXJlX3Blb3BsZQogKiAgICAgIFR3aXR2aWQKICogICAgICAgICAgaHR0cDovL3R3aXR2aWQuY29tL1FZN01ECiAqICAgICAgVHdpdHBpYwogKiAgICAgICAgICBodHRwOi8vdHdpdHBpYy5jb20vN3A5M3N0CiAqICAgICAgSW5zdGFncmFtCiAqICAgICAgICAgIGh0dHA6Ly9pbnN0YWdyLmFtL3AvSWVqa3VVR3hRbi8KICogICAgICAgICAgaHR0cDovL2luc3RhZ3JhbS5jb20vcC9JZWprdVVHeFFuLwogKiAgICAgIEdvb2dsZSBtYXBzCiAqICAgICAgICAgIGh0dHA6Ly9tYXBzLmdvb2dsZS5jb20vbWFwcz9xPUVpZmZlbCtUb3dlciwrQXZlbnVlK0d1c3RhdmUrRWlmZmVsLCtQYXJpcywrRnJhbmNlJnQ9aCZ6PTE3CiAqICAgICAgICAgIGh0dHA6Ly9tYXBzLmdvb2dsZS5jb20vP2xsPTQ4Ljg1Nzk5NSwyLjI5NDI5NyZzcG49MC4wMDc2NjYsMC4wMjExMzYmdD1tJno9MTYKICogICAgICAgICAgaHR0cDovL21hcHMuZ29vZ2xlLmNvbS8/bGw9NDguODU5NDYzLDIuMjkyNjI2JnNwbj0wLjAwMDk2NSwwLjAwMjY0MiZ0PW0mej0xOSZsYXllcj1jJmNibGw9NDguODU5NTI0LDIuMjkyNTMyJnBhbm9pZD1ZSjBscTI4T095M1ZUMklxSXVWWTBnJmNicD0xMiwxNTEuNTgsLDAsLTE1LjU2CiAqLwooZnVuY3Rpb24gKCQpIHsKCSJ1c2Ugc3RyaWN0IjsKCgkvL1Nob3J0Y3V0IGZvciBmYW5jeUJveCBvYmplY3QKCXZhciBGID0gJC5mYW5jeWJveCwKCQlmb3JtYXQgPSBmdW5jdGlvbiggdXJsLCByZXosIHBhcmFtcyApIHsKCQkJcGFyYW1zID0gcGFyYW1zIHx8ICcnOwoKCQkJaWYgKCAkLnR5cGUoIHBhcmFtcyApID09PSAib2JqZWN0IiApIHsKCQkJCXBhcmFtcyA9ICQucGFyYW0ocGFyYW1zLCB0cnVlKTsKCQkJfQoKCQkJJC5lYWNoKHJleiwgZnVuY3Rpb24oa2V5LCB2YWx1ZSkgewoJCQkJdXJsID0gdXJsLnJlcGxhY2UoICckJyArIGtleSwgdmFsdWUgfHwgJycgKTsKCQkJfSk7CgoJCQlpZiAocGFyYW1zLmxlbmd0aCkgewoJCQkJdXJsICs9ICggdXJsLmluZGV4T2YoJz8nKSA+IDAgPyAnJicgOiAnPycgKSArIHBhcmFtczsKCQkJfQoKCQkJcmV0dXJuIHVybDsKCQl9OwoKCS8vQWRkIGhlbHBlciBvYmplY3QKCUYuaGVscGVycy5tZWRpYSA9IHsKCQlkZWZhdWx0cyA6IHsKCQkJeW91dHViZSA6IHsKCQkJCW1hdGNoZXIgOiAvKHlvdXR1YmVcLmNvbXx5b3V0dVwuYmUpXC8od2F0Y2hcP3Y9fHZcL3x1XC98ZW1iZWRcLz8pPyh2aWRlb3Nlcmllc1w/bGlzdD0oLiopfFtcdy1dezExfXxcP2xpc3RUeXBlPSguKikmbGlzdD0oLiopKS4qL2ksCgkJCQlwYXJhbXMgIDogewoJCQkJCWF1dG9wbGF5ICAgIDogMSwKCQkJCQlhdXRvaGlkZSAgICA6IDEsCgkJCQkJZnMgICAgICAgICAgOiAxLAoJCQkJCXJlbCAgICAgICAgIDogMCwKCQkJCQloZCAgICAgICAgICA6IDEsCgkJCQkJd21vZGUgICAgICAgOiAnb3BhcXVlJywKCQkJCQllbmFibGVqc2FwaSA6IDEKCQkJCX0sCgkJCQl0eXBlIDogJ2lmcmFtZScsCgkJCQl1cmwgIDogJy8vd3d3LnlvdXR1YmUuY29tL2VtYmVkLyQzJwoJCQl9LAoJCQl2aW1lbyA6IHsKCQkJCW1hdGNoZXIgOiAvKD86dmltZW8oPzpwcm8pPy5jb20pXC8oPzpbXlxkXSspPyhcZCspKD86LiopLywKCQkJCXBhcmFtcyAgOiB7CgkJCQkJYXV0b3BsYXkgICAgICA6IDEsCgkJCQkJaGQgICAgICAgICAgICA6IDEsCgkJCQkJc2hvd190aXRsZSAgICA6IDEsCgkJCQkJc2hvd19ieWxpbmUgICA6IDEsCgkJCQkJc2hvd19wb3J0cmFpdCA6IDAsCgkJCQkJZnVsbHNjcmVlbiAgICA6IDEKCQkJCX0sCgkJCQl0eXBlIDogJ2lmcmFtZScsCgkJCQl1cmwgIDogJy8vcGxheWVyLnZpbWVvLmNvbS92aWRlby8kMScKCQkJfSwKCQkJbWV0YWNhZmUgOiB7CgkJCQltYXRjaGVyIDogL21ldGFjYWZlLmNvbVwvKD86d2F0Y2h8ZnBsYXllcilcLyhbXHdcLV17MSwxMH0pLywKCQkJCXBhcmFtcyAgOiB7CgkJCQkJYXV0b1BsYXkgOiAneWVzJwoJCQkJfSwKCQkJCXR5cGUgOiAnc3dmJywKCQkJCXVybCAgOiBmdW5jdGlvbiggcmV6LCBwYXJhbXMsIG9iaiApIHsKCQkJCQlvYmouc3dmLmZsYXNoVmFycyA9ICdwbGF5ZXJWYXJzPScgKyAkLnBhcmFtKCBwYXJhbXMsIHRydWUgKTsKCgkJCQkJcmV0dXJuICcvL3d3dy5tZXRhY2FmZS5jb20vZnBsYXllci8nICsgcmV6WzFdICsgJy8uc3dmJzsKCQkJCX0KCQkJfSwKCQkJZGFpbHltb3Rpb24gOiB7CgkJCQltYXRjaGVyIDogL2RhaWx5bW90aW9uLmNvbVwvdmlkZW9cLyguKilcLz8oLiopLywKCQkJCXBhcmFtcyAgOiB7CgkJCQkJYWRkaXRpb25hbEluZm9zIDogMCwKCQkJCQlhdXRvU3RhcnQgOiAxCgkJCQl9LAoJCQkJdHlwZSA6ICdzd2YnLAoJCQkJdXJsICA6ICcvL3d3dy5kYWlseW1vdGlvbi5jb20vc3dmL3ZpZGVvLyQxJwoJCQl9LAoJCQl0d2l0dmlkIDogewoJCQkJbWF0Y2hlciA6IC90d2l0dmlkXC5jb21cLyhbYS16QS1aMC05X1wtXD9cPV0rKS9pLAoJCQkJcGFyYW1zICA6IHsKCQkJCQlhdXRvcGxheSA6IDAKCQkJCX0sCgkJCQl0eXBlIDogJ2lmcmFtZScsCgkJCQl1cmwgIDogJy8vd3d3LnR3aXR2aWQuY29tL2VtYmVkLnBocD9ndWlkPSQxJwoJCQl9LAoJCQl0d2l0cGljIDogewoJCQkJbWF0Y2hlciA6IC90d2l0cGljXC5jb21cLyg/ISg/OnBsYWNlfHBob3Rvc3xldmVudHMpXC8pKFthLXpBLVowLTlcP1w9XC1dKykvaSwKCQkJCXR5cGUgOiAnaW1hZ2UnLAoJCQkJdXJsICA6ICcvL3R3aXRwaWMuY29tL3Nob3cvZnVsbC8kMS8nCgkJCX0sCgkJCWluc3RhZ3JhbSA6IHsKCQkJCW1hdGNoZXIgOiAvKGluc3RhZ3JcLmFtfGluc3RhZ3JhbVwuY29tKVwvcFwvKFthLXpBLVowLTlfXC1dKylcLz8vaSwKCQkJCXR5cGUgOiAnaW1hZ2UnLAoJCQkJdXJsICA6ICcvLyQxL3AvJDIvbWVkaWEvJwoJCQl9LAoJCQlnb29nbGVfbWFwcyA6IHsKCQkJCW1hdGNoZXIgOiAvbWFwc1wuZ29vZ2xlXC4oW2Etel17MiwzfShcLlthLXpdezJ9KT8pXC8oXD9sbD18bWFwc1w/KSguKikvaSwKCQkJCXR5cGUgOiAnaWZyYW1lJywKCQkJCXVybCAgOiBmdW5jdGlvbiggcmV6ICkgewoJCQkJCXJldHVybiAnLy9tYXBzLmdvb2dsZS4nICsgcmV6WzFdICsgJy8nICsgcmV6WzNdICsgJycgKyByZXpbNF0gKyAnJm91dHB1dD0nICsgKHJlels0XS5pbmRleE9mKCdsYXllcj1jJykgPiAwID8gJ3N2ZW1iZWQnIDogJ2VtYmVkJyk7CgkJCQl9CgkJCX0KCQl9LAoKCQliZWZvcmVMb2FkIDogZnVuY3Rpb24ob3B0cywgb2JqKSB7CgkJCXZhciB1cmwgICA9IG9iai5ocmVmIHx8ICcnLAoJCQkJdHlwZSAgPSBmYWxzZSwKCQkJCXdoYXQsCgkJCQlpdGVtLAoJCQkJcmV6LAoJCQkJcGFyYW1zOwoKCQkJZm9yICh3aGF0IGluIG9wdHMpIHsKCQkJCWl0ZW0gPSBvcHRzWyB3aGF0IF07CgkJCQlyZXogID0gdXJsLm1hdGNoKCBpdGVtLm1hdGNoZXIgKTsKCgkJCQlpZiAocmV6KSB7CgkJCQkJdHlwZSAgID0gaXRlbS50eXBlOwoJCQkJCXBhcmFtcyA9ICQuZXh0ZW5kKHRydWUsIHt9LCBpdGVtLnBhcmFtcywgb2JqWyB3aGF0IF0gfHwgKCQuaXNQbGFpbk9iamVjdChvcHRzWyB3aGF0IF0pID8gb3B0c1sgd2hhdCBdLnBhcmFtcyA6IG51bGwpKTsKCgkJCQkJdXJsID0gJC50eXBlKCBpdGVtLnVybCApID09PSAiZnVuY3Rpb24iID8gaXRlbS51cmwuY2FsbCggdGhpcywgcmV6LCBwYXJhbXMsIG9iaiApIDogZm9ybWF0KCBpdGVtLnVybCwgcmV6LCBwYXJhbXMgKTsKCgkJCQkJYnJlYWs7CgkJCQl9CgkJCX0KCgkJCWlmICh0eXBlKSB7CgkJCQlvYmouaHJlZiA9IHVybDsKCQkJCW9iai50eXBlID0gdHlwZTsKCgkJCQlvYmouYXV0b0hlaWdodCA9IGZhbHNlOwoJCQl9CgkJfQoJfTsKCn0oalF1ZXJ5KSk7]]></data>
	</file>
	<file>
	  <filename>/lib/fancybox.lib/helpers/jquery.fancybox-thumbs.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[I2ZhbmN5Ym94LXRodW1icyB7Cglwb3NpdGlvbjogZml4ZWQ7CglsZWZ0OiAwOwoJd2lkdGg6IDEwMCU7CglvdmVyZmxvdzogaGlkZGVuOwoJei1pbmRleDogODA1MDsKfQoKI2ZhbmN5Ym94LXRodW1icy5ib3R0b20gewoJYm90dG9tOiAycHg7Cn0KCiNmYW5jeWJveC10aHVtYnMudG9wIHsKCXRvcDogMnB4Owp9CgojZmFuY3lib3gtdGh1bWJzIHVsIHsKCXBvc2l0aW9uOiByZWxhdGl2ZTsKCWxpc3Qtc3R5bGU6IG5vbmU7CgltYXJnaW46IDA7CglwYWRkaW5nOiAwOwp9CgojZmFuY3lib3gtdGh1bWJzIHVsIGxpIHsKCWZsb2F0OiBsZWZ0OwoJcGFkZGluZzogMXB4OwoJb3BhY2l0eTogMC41Owp9CgojZmFuY3lib3gtdGh1bWJzIHVsIGxpLmFjdGl2ZSB7CglvcGFjaXR5OiAwLjc1OwoJcGFkZGluZzogMDsKCWJvcmRlcjogMXB4IHNvbGlkICNmZmY7Cn0KCiNmYW5jeWJveC10aHVtYnMgdWwgbGk6aG92ZXIgewoJb3BhY2l0eTogMTsKfQoKI2ZhbmN5Ym94LXRodW1icyB1bCBsaSBhIHsKCWRpc3BsYXk6IGJsb2NrOwoJcG9zaXRpb246IHJlbGF0aXZlOwoJb3ZlcmZsb3c6IGhpZGRlbjsKCWJvcmRlcjogMXB4IHNvbGlkICMyMjI7CgliYWNrZ3JvdW5kOiAjMTExOwoJb3V0bGluZTogbm9uZTsKfQoKI2ZhbmN5Ym94LXRodW1icyB1bCBsaSBpbWcgewoJZGlzcGxheTogYmxvY2s7Cglwb3NpdGlvbjogcmVsYXRpdmU7Cglib3JkZXI6IDA7CglwYWRkaW5nOiAwOwp9]]></data>
	</file>
	<file>
	  <filename>/lib/fancybox.lib/helpers/jquery.fancybox-thumbs.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[IC8qIQogKiBUaHVtYm5haWwgaGVscGVyIGZvciBmYW5jeUJveAogKiB2ZXJzaW9uOiAxLjAuNyAoTW9uLCAwMSBPY3QgMjAxMikKICogQHJlcXVpcmVzIGZhbmN5Qm94IHYyLjAgb3IgbGF0ZXIKICoKICogVXNhZ2U6CiAqICAgICAkKCIuZmFuY3lib3giKS5mYW5jeWJveCh7CiAqICAgICAgICAgaGVscGVycyA6IHsKICogICAgICAgICAgICAgdGh1bWJzOiB7CiAqICAgICAgICAgICAgICAgICB3aWR0aCAgOiA1MCwKICogICAgICAgICAgICAgICAgIGhlaWdodCA6IDUwCiAqICAgICAgICAgICAgIH0KICogICAgICAgICB9CiAqICAgICB9KTsKICoKICovCihmdW5jdGlvbiAoJCkgewoJLy9TaG9ydGN1dCBmb3IgZmFuY3lCb3ggb2JqZWN0Cgl2YXIgRiA9ICQuZmFuY3lib3g7CgoJLy9BZGQgaGVscGVyIG9iamVjdAoJRi5oZWxwZXJzLnRodW1icyA9IHsKCQlkZWZhdWx0cyA6IHsKCQkJd2lkdGggICAgOiA1MCwgICAgICAgLy8gdGh1bWJuYWlsIHdpZHRoCgkJCWhlaWdodCAgIDogNTAsICAgICAgIC8vIHRodW1ibmFpbCBoZWlnaHQKCQkJcG9zaXRpb24gOiAnYm90dG9tJywgLy8gJ3RvcCcgb3IgJ2JvdHRvbScKCQkJc291cmNlICAgOiBmdW5jdGlvbiAoIGl0ZW0gKSB7ICAvLyBmdW5jdGlvbiB0byBvYnRhaW4gdGhlIFVSTCBvZiB0aGUgdGh1bWJuYWlsIGltYWdlCgkJCQl2YXIgaHJlZjsKCgkJCQlpZiAoaXRlbS5lbGVtZW50KSB7CgkJCQkJaHJlZiA9ICQoaXRlbS5lbGVtZW50KS5maW5kKCdpbWcnKS5hdHRyKCdzcmMnKTsKCQkJCX0KCgkJCQlpZiAoIWhyZWYgJiYgaXRlbS50eXBlID09PSAnaW1hZ2UnICYmIGl0ZW0uaHJlZikgewoJCQkJCWhyZWYgPSBpdGVtLmhyZWY7CgkJCQl9CgoJCQkJcmV0dXJuIGhyZWY7CgkJCX0KCQl9LAoKCQl3cmFwICA6IG51bGwsCgkJbGlzdCAgOiBudWxsLAoJCXdpZHRoIDogMCwKCgkJaW5pdDogZnVuY3Rpb24gKG9wdHMsIG9iaikgewoJCQl2YXIgdGhhdCA9IHRoaXMsCgkJCQlsaXN0LAoJCQkJdGh1bWJXaWR0aCAgPSBvcHRzLndpZHRoLAoJCQkJdGh1bWJIZWlnaHQgPSBvcHRzLmhlaWdodCwKCQkJCXRodW1iU291cmNlID0gb3B0cy5zb3VyY2U7CgoJCQkvL0J1aWxkIGxpc3Qgc3RydWN0dXJlCgkJCWxpc3QgPSAnJzsKCgkJCWZvciAodmFyIG4gPSAwOyBuIDwgb2JqLmdyb3VwLmxlbmd0aDsgbisrKSB7CgkJCQlsaXN0ICs9ICc8bGk+PGEgc3R5bGU9IndpZHRoOicgKyB0aHVtYldpZHRoICsgJ3B4O2hlaWdodDonICsgdGh1bWJIZWlnaHQgKyAncHg7IiBocmVmPSJqYXZhc2NyaXB0OmpRdWVyeS5mYW5jeWJveC5qdW1wdG8oJyArIG4gKyAnKTsiPjwvYT48L2xpPic7CgkJCX0KCgkJCXRoaXMud3JhcCA9ICQoJzxkaXYgaWQ9ImZhbmN5Ym94LXRodW1icyI+PC9kaXY+JykuYWRkQ2xhc3Mob3B0cy5wb3NpdGlvbikuYXBwZW5kVG8oJ2JvZHknKTsKCQkJdGhpcy5saXN0ID0gJCgnPHVsPicgKyBsaXN0ICsgJzwvdWw+JykuYXBwZW5kVG8odGhpcy53cmFwKTsKCgkJCS8vTG9hZCBlYWNoIHRodW1ibmFpbAoJCQkkLmVhY2gob2JqLmdyb3VwLCBmdW5jdGlvbiAoaSkgewoJCQkJdmFyIGhyZWYgPSB0aHVtYlNvdXJjZSggb2JqLmdyb3VwWyBpIF0gKTsKCgkJCQlpZiAoIWhyZWYpIHsKCQkJCQlyZXR1cm47CgkJCQl9CgoJCQkJJCgiPGltZyAvPiIpLmxvYWQoZnVuY3Rpb24gKCkgewoJCQkJCXZhciB3aWR0aCAgPSB0aGlzLndpZHRoLAoJCQkJCQloZWlnaHQgPSB0aGlzLmhlaWdodCwKCQkJCQkJd2lkdGhSYXRpbywgaGVpZ2h0UmF0aW8sIHBhcmVudDsKCgkJCQkJaWYgKCF0aGF0Lmxpc3QgfHwgIXdpZHRoIHx8ICFoZWlnaHQpIHsKCQkJCQkJcmV0dXJuOwoJCQkJCX0KCgkJCQkJLy9DYWxjdWxhdGUgdGh1bWJuYWlsIHdpZHRoL2hlaWdodCBhbmQgY2VudGVyIGl0CgkJCQkJd2lkdGhSYXRpbyAgPSB3aWR0aCAvIHRodW1iV2lkdGg7CgkJCQkJaGVpZ2h0UmF0aW8gPSBoZWlnaHQgLyB0aHVtYkhlaWdodDsKCgkJCQkJcGFyZW50ID0gdGhhdC5saXN0LmNoaWxkcmVuKCkuZXEoaSkuZmluZCgnYScpOwoKCQkJCQlpZiAod2lkdGhSYXRpbyA+PSAxICYmIGhlaWdodFJhdGlvID49IDEpIHsKCQkJCQkJaWYgKHdpZHRoUmF0aW8gPiBoZWlnaHRSYXRpbykgewoJCQkJCQkJd2lkdGggID0gTWF0aC5mbG9vcih3aWR0aCAvIGhlaWdodFJhdGlvKTsKCQkJCQkJCWhlaWdodCA9IHRodW1iSGVpZ2h0OwoKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCXdpZHRoICA9IHRodW1iV2lkdGg7CgkJCQkJCQloZWlnaHQgPSBNYXRoLmZsb29yKGhlaWdodCAvIHdpZHRoUmF0aW8pOwoJCQkJCQl9CgkJCQkJfQoKCQkJCQkkKHRoaXMpLmNzcyh7CgkJCQkJCXdpZHRoICA6IHdpZHRoLAoJCQkJCQloZWlnaHQgOiBoZWlnaHQsCgkJCQkJCXRvcCAgICA6IE1hdGguZmxvb3IodGh1bWJIZWlnaHQgLyAyIC0gaGVpZ2h0IC8gMiksCgkJCQkJCWxlZnQgICA6IE1hdGguZmxvb3IodGh1bWJXaWR0aCAvIDIgLSB3aWR0aCAvIDIpCgkJCQkJfSk7CgoJCQkJCXBhcmVudC53aWR0aCh0aHVtYldpZHRoKS5oZWlnaHQodGh1bWJIZWlnaHQpOwoKCQkJCQkkKHRoaXMpLmhpZGUoKS5hcHBlbmRUbyhwYXJlbnQpLmZhZGVJbigzMDApOwoKCQkJCX0pLmF0dHIoJ3NyYycsIGhyZWYpOwoJCQl9KTsKCgkJCS8vU2V0IGluaXRpYWwgd2lkdGgKCQkJdGhpcy53aWR0aCA9IHRoaXMubGlzdC5jaGlsZHJlbigpLmVxKDApLm91dGVyV2lkdGgodHJ1ZSk7CgoJCQl0aGlzLmxpc3Qud2lkdGgodGhpcy53aWR0aCAqIChvYmouZ3JvdXAubGVuZ3RoICsgMSkpLmNzcygnbGVmdCcsIE1hdGguZmxvb3IoJCh3aW5kb3cpLndpZHRoKCkgKiAwLjUgLSAob2JqLmluZGV4ICogdGhpcy53aWR0aCArIHRoaXMud2lkdGggKiAwLjUpKSk7CgkJfSwKCgkJYmVmb3JlTG9hZDogZnVuY3Rpb24gKG9wdHMsIG9iaikgewoJCQkvL1JlbW92ZSBzZWxmIGlmIGdhbGxlcnkgZG8gbm90IGhhdmUgYXQgbGVhc3QgdHdvIGl0ZW1zCgkJCWlmIChvYmouZ3JvdXAubGVuZ3RoIDwgMikgewoJCQkJb2JqLmhlbHBlcnMudGh1bWJzID0gZmFsc2U7CgoJCQkJcmV0dXJuOwoJCQl9CgoJCQkvL0luY3JlYXNlIGJvdHRvbSBtYXJnaW4gdG8gZ2l2ZSBzcGFjZSBmb3IgdGh1bWJzCgkJCW9iai5tYXJnaW5bIG9wdHMucG9zaXRpb24gPT09ICd0b3AnID8gMCA6IDIgXSArPSAoKG9wdHMuaGVpZ2h0KSArIDE1KTsKCQl9LAoKCQlhZnRlclNob3c6IGZ1bmN0aW9uIChvcHRzLCBvYmopIHsKCQkJLy9DaGVjayBpZiBleGlzdHMgYW5kIGNyZWF0ZSBvciB1cGRhdGUgbGlzdAoJCQlpZiAodGhpcy5saXN0KSB7CgkJCQl0aGlzLm9uVXBkYXRlKG9wdHMsIG9iaik7CgoJCQl9IGVsc2UgewoJCQkJdGhpcy5pbml0KG9wdHMsIG9iaik7CgkJCX0KCgkJCS8vU2V0IGFjdGl2ZSBlbGVtZW50CgkJCXRoaXMubGlzdC5jaGlsZHJlbigpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKS5lcShvYmouaW5kZXgpLmFkZENsYXNzKCdhY3RpdmUnKTsKCQl9LAoKCQkvL0NlbnRlciBsaXN0CgkJb25VcGRhdGU6IGZ1bmN0aW9uIChvcHRzLCBvYmopIHsKCQkJaWYgKHRoaXMubGlzdCkgewoJCQkJdGhpcy5saXN0LnN0b3AodHJ1ZSkuYW5pbWF0ZSh7CgkJCQkJJ2xlZnQnOiBNYXRoLmZsb29yKCQod2luZG93KS53aWR0aCgpICogMC41IC0gKG9iai5pbmRleCAqIHRoaXMud2lkdGggKyB0aGlzLndpZHRoICogMC41KSkKCQkJCX0sIDE1MCk7CgkJCX0KCQl9LAoKCQliZWZvcmVDbG9zZTogZnVuY3Rpb24gKCkgewoJCQlpZiAodGhpcy53cmFwKSB7CgkJCQl0aGlzLndyYXAucmVtb3ZlKCk7CgkJCX0KCgkJCXRoaXMud3JhcCAgPSBudWxsOwoJCQl0aGlzLmxpc3QgID0gbnVsbDsKCQkJdGhpcy53aWR0aCA9IDA7CgkJfQoJfQoKfShqUXVlcnkpKTs=]]></data>
	</file>
	<file>
	  <filename>/lib/fancybox.lib/info.dat</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGluZm9bJ2pzJ10gPSBhcnJheSgnanF1ZXJ5LmZhbmN5Ym94LnBhY2suanMnLCdqcXVlcnkubW91c2V3aGVlbC0zLjAuNi5wYWNrLmpzJyk7CiRpbmZvWydkZXBlbmRzJ10gPSAnanF1ZXJ5JzsKJGluZm9bJ2NzcyddID0gJ2pxdWVyeS5mYW5jeWJveC5jc3MnOwokaW5mb1snanNfbm9taW5pZnknXSA9IDE7Cj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/fancybox.lib/jquery.fancybox.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohIGZhbmN5Qm94IHYyLjEuMyBmYW5jeWFwcHMuY29tIHwgZmFuY3lhcHBzLmNvbS9mYW5jeWJveC8jbGljZW5zZSAqLwouZmFuY3lib3gtd3JhcCwKLmZhbmN5Ym94LXNraW4sCi5mYW5jeWJveC1vdXRlciwKLmZhbmN5Ym94LWlubmVyLAouZmFuY3lib3gtaW1hZ2UsCi5mYW5jeWJveC13cmFwIGlmcmFtZSwKLmZhbmN5Ym94LXdyYXAgb2JqZWN0LAouZmFuY3lib3gtbmF2LAouZmFuY3lib3gtbmF2IHNwYW4sCi5mYW5jeWJveC10bXAKewoJcGFkZGluZzogMDsKCW1hcmdpbjogMDsKCWJvcmRlcjogMDsKCW91dGxpbmU6IG5vbmU7Cgl2ZXJ0aWNhbC1hbGlnbjogdG9wOwp9CgouZmFuY3lib3gtd3JhcCB7Cglwb3NpdGlvbjogYWJzb2x1dGU7Cgl0b3A6IDA7CglsZWZ0OiAwOwoJei1pbmRleDogODAyMDsKfQoKLmZhbmN5Ym94LXNraW4gewoJcG9zaXRpb246IHJlbGF0aXZlOwoJYmFja2dyb3VuZDogI2Y5ZjlmOTsKCWNvbG9yOiAjNDQ0OwoJdGV4dC1zaGFkb3c6IG5vbmU7Cgktd2Via2l0LWJvcmRlci1yYWRpdXM6IDRweDsKCSAgIC1tb3otYm9yZGVyLXJhZGl1czogNHB4OwoJICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7Cn0KCi5mYW5jeWJveC1vcGVuZWQgewoJei1pbmRleDogODAzMDsKfQoKLmZhbmN5Ym94LW9wZW5lZCAuZmFuY3lib3gtc2tpbiB7Cgktd2Via2l0LWJveC1zaGFkb3c6IDAgMTBweCAyNXB4IHJnYmEoMCwgMCwgMCwgMC41KTsKCSAgIC1tb3otYm94LXNoYWRvdzogMCAxMHB4IDI1cHggcmdiYSgwLCAwLCAwLCAwLjUpOwoJICAgICAgICBib3gtc2hhZG93OiAwIDEwcHggMjVweCByZ2JhKDAsIDAsIDAsIDAuNSk7Cn0KCi5mYW5jeWJveC1vdXRlciwgLmZhbmN5Ym94LWlubmVyIHsKCXBvc2l0aW9uOiByZWxhdGl2ZTsKfQoKLmZhbmN5Ym94LWlubmVyIHsKCW92ZXJmbG93OiBoaWRkZW47Cn0KCi5mYW5jeWJveC10eXBlLWlmcmFtZSAuZmFuY3lib3gtaW5uZXIgewoJLXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6IHRvdWNoOwp9CgouZmFuY3lib3gtZXJyb3IgewoJY29sb3I6ICM0NDQ7Cglmb250OiAxNHB4LzIwcHggIkhlbHZldGljYSBOZXVlIixIZWx2ZXRpY2EsQXJpYWwsc2Fucy1zZXJpZjsKCW1hcmdpbjogMDsKCXBhZGRpbmc6IDE1cHg7Cgl3aGl0ZS1zcGFjZTogbm93cmFwOwp9CgouZmFuY3lib3gtaW1hZ2UsIC5mYW5jeWJveC1pZnJhbWUgewoJZGlzcGxheTogYmxvY2s7Cgl3aWR0aDogMTAwJTsKCWhlaWdodDogMTAwJTsKfQoKLmZhbmN5Ym94LWltYWdlIHsKCW1heC13aWR0aDogMTAwJTsKCW1heC1oZWlnaHQ6IDEwMCU7Cn0KCiNmYW5jeWJveC1sb2FkaW5nLCAuZmFuY3lib3gtY2xvc2UsIC5mYW5jeWJveC1wcmV2IHNwYW4sIC5mYW5jeWJveC1uZXh0IHNwYW4gewoJYmFja2dyb3VuZC1pbWFnZTogdXJsKCdmYW5jeWJveF9zcHJpdGUucG5nJyk7Cn0KCiNmYW5jeWJveC1sb2FkaW5nIHsKCXBvc2l0aW9uOiBmaXhlZDsKCXRvcDogNTAlOwoJbGVmdDogNTAlOwoJbWFyZ2luLXRvcDogLTIycHg7CgltYXJnaW4tbGVmdDogLTIycHg7CgliYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIC0xMDhweDsKCW9wYWNpdHk6IDAuODsKCWN1cnNvcjogcG9pbnRlcjsKCXotaW5kZXg6IDgwNjA7Cn0KCiNmYW5jeWJveC1sb2FkaW5nIGRpdiB7Cgl3aWR0aDogNDRweDsKCWhlaWdodDogNDRweDsKCWJhY2tncm91bmQ6IHVybCgnZmFuY3lib3hfbG9hZGluZy5naWYnKSBjZW50ZXIgY2VudGVyIG5vLXJlcGVhdDsKfQoKLmZhbmN5Ym94LWNsb3NlIHsKCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCXRvcDogLTE4cHg7CglyaWdodDogLTE4cHg7Cgl3aWR0aDogMzZweDsKCWhlaWdodDogMzZweDsKCWN1cnNvcjogcG9pbnRlcjsKCXotaW5kZXg6IDgwNDA7Cn0KCi5mYW5jeWJveC1uYXYgewoJcG9zaXRpb246IGFic29sdXRlOwoJdG9wOiAwOwoJd2lkdGg6IDQwJTsKCWhlaWdodDogMTAwJTsKCWN1cnNvcjogcG9pbnRlcjsKCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKCWJhY2tncm91bmQ6IHRyYW5zcGFyZW50IHVybCgnYmxhbmsuZ2lmJyk7IC8qIGhlbHBzIElFICovCgktd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHJnYmEoMCwwLDAsMCk7Cgl6LWluZGV4OiA4MDQwOwp9CgouZmFuY3lib3gtcHJldiB7CglsZWZ0OiAwOwp9CgouZmFuY3lib3gtbmV4dCB7CglyaWdodDogMDsKfQoKLmZhbmN5Ym94LW5hdiBzcGFuIHsKCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCXRvcDogNTAlOwoJd2lkdGg6IDM2cHg7CgloZWlnaHQ6IDM0cHg7CgltYXJnaW4tdG9wOiAtMThweDsKCWN1cnNvcjogcG9pbnRlcjsKCXotaW5kZXg6IDgwNDA7Cgl2aXNpYmlsaXR5OiBoaWRkZW47Cn0KCi5mYW5jeWJveC1wcmV2IHNwYW4gewoJbGVmdDogMTBweDsKCWJhY2tncm91bmQtcG9zaXRpb246IDAgLTM2cHg7Cn0KCi5mYW5jeWJveC1uZXh0IHNwYW4gewoJcmlnaHQ6IDEwcHg7CgliYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIC03MnB4Owp9CgouZmFuY3lib3gtbmF2OmhvdmVyIHNwYW4gewoJdmlzaWJpbGl0eTogdmlzaWJsZTsKfQoKLmZhbmN5Ym94LXRtcCB7Cglwb3NpdGlvbjogYWJzb2x1dGU7Cgl0b3A6IC05OTk5OXB4OwoJbGVmdDogLTk5OTk5cHg7Cgl2aXNpYmlsaXR5OiBoaWRkZW47CgltYXgtd2lkdGg6IDk5OTk5cHg7CgltYXgtaGVpZ2h0OiA5OTk5OXB4OwoJb3ZlcmZsb3c6IHZpc2libGUgIWltcG9ydGFudDsKfQoKLyogT3ZlcmxheSBoZWxwZXIgKi8KCi5mYW5jeWJveC1sb2NrIHsKCW92ZXJmbG93OiBoaWRkZW47Cn0KCi5mYW5jeWJveC1vdmVybGF5IHsKCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCXRvcDogMDsKCWxlZnQ6IDA7CglvdmVyZmxvdzogaGlkZGVuOwoJZGlzcGxheTogbm9uZTsKCXotaW5kZXg6IDgwMTA7CgliYWNrZ3JvdW5kOiB1cmwoJ2ZhbmN5Ym94X292ZXJsYXkucG5nJyk7Cn0KCi5mYW5jeWJveC1vdmVybGF5LWZpeGVkIHsKCXBvc2l0aW9uOiBmaXhlZDsKCWJvdHRvbTogMDsKCXJpZ2h0OiAwOwp9CgouZmFuY3lib3gtbG9jayAuZmFuY3lib3gtb3ZlcmxheSB7CglvdmVyZmxvdzogYXV0bzsKCW92ZXJmbG93LXk6IHNjcm9sbDsKfQoKLyogVGl0bGUgaGVscGVyICovCgouZmFuY3lib3gtdGl0bGUgewoJdmlzaWJpbGl0eTogaGlkZGVuOwoJZm9udDogbm9ybWFsIDEzcHgvMjBweCAiSGVsdmV0aWNhIE5ldWUiLEhlbHZldGljYSxBcmlhbCxzYW5zLXNlcmlmOwoJcG9zaXRpb246IHJlbGF0aXZlOwoJdGV4dC1zaGFkb3c6IG5vbmU7Cgl6LWluZGV4OiA4MDUwOwp9CgouZmFuY3lib3gtb3BlbmVkIC5mYW5jeWJveC10aXRsZSB7Cgl2aXNpYmlsaXR5OiB2aXNpYmxlOwp9CgouZmFuY3lib3gtdGl0bGUtZmxvYXQtd3JhcCB7Cglwb3NpdGlvbjogYWJzb2x1dGU7Cglib3R0b206IDA7CglyaWdodDogNTAlOwoJbWFyZ2luLWJvdHRvbTogLTM1cHg7Cgl6LWluZGV4OiA4MDUwOwoJdGV4dC1hbGlnbjogY2VudGVyOwp9CgouZmFuY3lib3gtdGl0bGUtZmxvYXQtd3JhcCAuY2hpbGQgewoJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJbWFyZ2luLXJpZ2h0OiAtMTAwJTsKCXBhZGRpbmc6IDJweCAyMHB4OwoJYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7IC8qIEZhbGxiYWNrIGZvciB3ZWIgYnJvd3NlcnMgdGhhdCBkb2Vzbid0IHN1cHBvcnQgUkdCYSAqLwoJYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjgpOwoJLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAxNXB4OwoJICAgLW1vei1ib3JkZXItcmFkaXVzOiAxNXB4OwoJICAgICAgICBib3JkZXItcmFkaXVzOiAxNXB4OwoJdGV4dC1zaGFkb3c6IDAgMXB4IDJweCAjMjIyOwoJY29sb3I6ICNGRkY7Cglmb250LXdlaWdodDogYm9sZDsKCWxpbmUtaGVpZ2h0OiAyNHB4OwoJd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLmZhbmN5Ym94LXRpdGxlLW91dHNpZGUtd3JhcCB7Cglwb3NpdGlvbjogcmVsYXRpdmU7CgltYXJnaW4tdG9wOiAxMHB4OwoJY29sb3I6ICNmZmY7Cn0KCi5mYW5jeWJveC10aXRsZS1pbnNpZGUtd3JhcCB7CglwYWRkaW5nLXRvcDogMTBweDsKfQoKLmZhbmN5Ym94LXRpdGxlLW92ZXItd3JhcCB7Cglwb3NpdGlvbjogYWJzb2x1dGU7Cglib3R0b206IDA7CglsZWZ0OiAwOwoJY29sb3I6ICNmZmY7CglwYWRkaW5nOiAxMHB4OwoJYmFja2dyb3VuZDogIzAwMDsKCWJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgLjgpOwp9]]></data>
	</file>
	<file>
	  <filename>/lib/fancybox.lib/jquery.fancybox.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohCiAqIGZhbmN5Qm94IC0galF1ZXJ5IFBsdWdpbgogKiB2ZXJzaW9uOiAyLjEuMyAoVHVlLCAyMyBPY3QgMjAxMikKICogQHJlcXVpcmVzIGpRdWVyeSB2MS42IG9yIGxhdGVyCiAqCiAqIEV4YW1wbGVzIGF0IGh0dHA6Ly9mYW5jeWFwcHMuY29tL2ZhbmN5Ym94LwogKiBMaWNlbnNlOiB3d3cuZmFuY3lhcHBzLmNvbS9mYW5jeWJveC8jbGljZW5zZQogKgogKiBDb3B5cmlnaHQgMjAxMiBKYW5pcyBTa2FybmVsaXMgLSBqYW5pc0BmYW5jeWFwcHMuY29tCiAqCiAqLwoKKGZ1bmN0aW9uICh3aW5kb3csIGRvY3VtZW50LCAkLCB1bmRlZmluZWQpIHsKCSJ1c2Ugc3RyaWN0IjsKCgl2YXIgVyA9ICQod2luZG93KSwKCQlEID0gJChkb2N1bWVudCksCgkJRiA9ICQuZmFuY3lib3ggPSBmdW5jdGlvbiAoKSB7CgkJCUYub3Blbi5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgkJfSwKCQlkaWRVcGRhdGUgPSBudWxsLAoJCWlzVG91Y2gJICA9IGRvY3VtZW50LmNyZWF0ZVRvdWNoICE9PSB1bmRlZmluZWQsCgoJCWlzUXVlcnkJPSBmdW5jdGlvbihvYmopIHsKCQkJcmV0dXJuIG9iaiAmJiBvYmouaGFzT3duUHJvcGVydHkgJiYgb2JqIGluc3RhbmNlb2YgJDsKCQl9LAoJCWlzU3RyaW5nID0gZnVuY3Rpb24oc3RyKSB7CgkJCXJldHVybiBzdHIgJiYgJC50eXBlKHN0cikgPT09ICJzdHJpbmciOwoJCX0sCgkJaXNQZXJjZW50YWdlID0gZnVuY3Rpb24oc3RyKSB7CgkJCXJldHVybiBpc1N0cmluZyhzdHIpICYmIHN0ci5pbmRleE9mKCclJykgPiAwOwoJCX0sCgkJaXNTY3JvbGxhYmxlID0gZnVuY3Rpb24oZWwpIHsKCQkJcmV0dXJuIChlbCAmJiAhKGVsLnN0eWxlLm92ZXJmbG93ICYmIGVsLnN0eWxlLm92ZXJmbG93ID09PSAnaGlkZGVuJykgJiYgKChlbC5jbGllbnRXaWR0aCAmJiBlbC5zY3JvbGxXaWR0aCA+IGVsLmNsaWVudFdpZHRoKSB8fCAoZWwuY2xpZW50SGVpZ2h0ICYmIGVsLnNjcm9sbEhlaWdodCA+IGVsLmNsaWVudEhlaWdodCkpKTsKCQl9LAoJCWdldFNjYWxhciA9IGZ1bmN0aW9uKG9yaWcsIGRpbSkgewoJCQl2YXIgdmFsdWUgPSBwYXJzZUludChvcmlnLCAxMCkgfHwgMDsKCgkJCWlmIChkaW0gJiYgaXNQZXJjZW50YWdlKG9yaWcpKSB7CgkJCQl2YWx1ZSA9IEYuZ2V0Vmlld3BvcnQoKVsgZGltIF0gLyAxMDAgKiB2YWx1ZTsKCQkJfQoKCQkJcmV0dXJuIE1hdGguY2VpbCh2YWx1ZSk7CgkJfSwKCQlnZXRWYWx1ZSA9IGZ1bmN0aW9uKHZhbHVlLCBkaW0pIHsKCQkJcmV0dXJuIGdldFNjYWxhcih2YWx1ZSwgZGltKSArICdweCc7CgkJfTsKCgkkLmV4dGVuZChGLCB7CgkJLy8gVGhlIGN1cnJlbnQgdmVyc2lvbiBvZiBmYW5jeUJveAoJCXZlcnNpb246ICcyLjEuMycsCgoJCWRlZmF1bHRzOiB7CgkJCXBhZGRpbmcgOiAxNSwKCQkJbWFyZ2luICA6IDIwLAoKCQkJd2lkdGggICAgIDogODAwLAoJCQloZWlnaHQgICAgOiA2MDAsCgkJCW1pbldpZHRoICA6IDEwMCwKCQkJbWluSGVpZ2h0IDogMTAwLAoJCQltYXhXaWR0aCAgOiA5OTk5LAoJCQltYXhIZWlnaHQgOiA5OTk5LAoKCQkJYXV0b1NpemUgICA6IHRydWUsCgkJCWF1dG9IZWlnaHQgOiBmYWxzZSwKCQkJYXV0b1dpZHRoICA6IGZhbHNlLAoKCQkJYXV0b1Jlc2l6ZSAgOiB0cnVlLAoJCQlhdXRvQ2VudGVyICA6ICFpc1RvdWNoLAoJCQlmaXRUb1ZpZXcgICA6IHRydWUsCgkJCWFzcGVjdFJhdGlvIDogZmFsc2UsCgkJCXRvcFJhdGlvICAgIDogMC41LAoJCQlsZWZ0UmF0aW8gICA6IDAuNSwKCgkJCXNjcm9sbGluZyA6ICdhdXRvJywgLy8gJ2F1dG8nLCAneWVzJyBvciAnbm8nCgkJCXdyYXBDU1MgICA6ICcnLAoKCQkJYXJyb3dzICAgICA6IHRydWUsCgkJCWNsb3NlQnRuICAgOiB0cnVlLAoJCQljbG9zZUNsaWNrIDogZmFsc2UsCgkJCW5leHRDbGljayAgOiBmYWxzZSwKCQkJbW91c2VXaGVlbCA6IHRydWUsCgkJCWF1dG9QbGF5ICAgOiBmYWxzZSwKCQkJcGxheVNwZWVkICA6IDMwMDAsCgkJCXByZWxvYWQgICAgOiAzLAoJCQltb2RhbCAgICAgIDogZmFsc2UsCgkJCWxvb3AgICAgICAgOiB0cnVlLAoKCQkJYWpheCAgOiB7CgkJCQlkYXRhVHlwZSA6ICdodG1sJywKCQkJCWhlYWRlcnMgIDogeyAnWC1mYW5jeUJveCc6IHRydWUgfQoJCQl9LAoJCQlpZnJhbWUgOiB7CgkJCQlzY3JvbGxpbmcgOiAnYXV0bycsCgkJCQlwcmVsb2FkICAgOiB0cnVlCgkJCX0sCgkJCXN3ZiA6IHsKCQkJCXdtb2RlOiAndHJhbnNwYXJlbnQnLAoJCQkJYWxsb3dmdWxsc2NyZWVuICAgOiAndHJ1ZScsCgkJCQlhbGxvd3NjcmlwdGFjY2VzcyA6ICdhbHdheXMnCgkJCX0sCgoJCQlrZXlzICA6IHsKCQkJCW5leHQgOiB7CgkJCQkJMTMgOiAnbGVmdCcsIC8vIGVudGVyCgkJCQkJMzQgOiAndXAnLCAgIC8vIHBhZ2UgZG93bgoJCQkJCTM5IDogJ2xlZnQnLCAvLyByaWdodCBhcnJvdwoJCQkJCTQwIDogJ3VwJyAgICAvLyBkb3duIGFycm93CgkJCQl9LAoJCQkJcHJldiA6IHsKCQkJCQk4ICA6ICdyaWdodCcsICAvLyBiYWNrc3BhY2UKCQkJCQkzMyA6ICdkb3duJywgICAvLyBwYWdlIHVwCgkJCQkJMzcgOiAncmlnaHQnLCAgLy8gbGVmdCBhcnJvdwoJCQkJCTM4IDogJ2Rvd24nICAgIC8vIHVwIGFycm93CgkJCQl9LAoJCQkJY2xvc2UgIDogWzI3XSwgLy8gZXNjYXBlIGtleQoJCQkJcGxheSAgIDogWzMyXSwgLy8gc3BhY2UgLSBzdGFydC9zdG9wIHNsaWRlc2hvdwoJCQkJdG9nZ2xlIDogWzcwXSAgLy8gbGV0dGVyICJmIiAtIHRvZ2dsZSBmdWxsc2NyZWVuCgkJCX0sCgoJCQlkaXJlY3Rpb24gOiB7CgkJCQluZXh0IDogJ2xlZnQnLAoJCQkJcHJldiA6ICdyaWdodCcKCQkJfSwKCgkJCXNjcm9sbE91dHNpZGUgIDogdHJ1ZSwKCgkJCS8vIE92ZXJyaWRlIHNvbWUgcHJvcGVydGllcwoJCQlpbmRleCAgIDogMCwKCQkJdHlwZSAgICA6IG51bGwsCgkJCWhyZWYgICAgOiBudWxsLAoJCQljb250ZW50IDogbnVsbCwKCQkJdGl0bGUgICA6IG51bGwsCgoJCQkvLyBIVE1MIHRlbXBsYXRlcwoJCQl0cGw6IHsKCQkJCXdyYXAgICAgIDogJzxkaXYgY2xhc3M9ImZhbmN5Ym94LXdyYXAiIHRhYkluZGV4PSItMSI+PGRpdiBjbGFzcz0iZmFuY3lib3gtc2tpbiI+PGRpdiBjbGFzcz0iZmFuY3lib3gtb3V0ZXIiPjxkaXYgY2xhc3M9ImZhbmN5Ym94LWlubmVyIj48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj4nLAoJCQkJaW1hZ2UgICAgOiAnPGltZyBjbGFzcz0iZmFuY3lib3gtaW1hZ2UiIHNyYz0ie2hyZWZ9IiBhbHQ9IiIgLz4nLAoJCQkJaWZyYW1lICAgOiAnPGlmcmFtZSBpZD0iZmFuY3lib3gtZnJhbWV7cm5kfSIgbmFtZT0iZmFuY3lib3gtZnJhbWV7cm5kfSIgY2xhc3M9ImZhbmN5Ym94LWlmcmFtZSIgZnJhbWVib3JkZXI9IjAiIHZzcGFjZT0iMCIgaHNwYWNlPSIwIiB3ZWJraXRBbGxvd0Z1bGxTY3JlZW4gbW96YWxsb3dmdWxsc2NyZWVuIGFsbG93RnVsbFNjcmVlbicgKyAoJC5icm93c2VyLm1zaWUgPyAnIGFsbG93dHJhbnNwYXJlbmN5PSJ0cnVlIicgOiAnJykgKyAnPjwvaWZyYW1lPicsCgkJCQllcnJvciAgICA6ICc8cCBjbGFzcz0iZmFuY3lib3gtZXJyb3IiPlRoZSByZXF1ZXN0ZWQgY29udGVudCBjYW5ub3QgYmUgbG9hZGVkLjxici8+UGxlYXNlIHRyeSBhZ2FpbiBsYXRlci48L3A+JywKCQkJCWNsb3NlQnRuIDogJzxhIHRpdGxlPSJDbG9zZSIgY2xhc3M9ImZhbmN5Ym94LWl0ZW0gZmFuY3lib3gtY2xvc2UiIGhyZWY9ImphdmFzY3JpcHQ6OyI+PC9hPicsCgkJCQluZXh0ICAgICA6ICc8YSB0aXRsZT0iTmV4dCIgY2xhc3M9ImZhbmN5Ym94LW5hdiBmYW5jeWJveC1uZXh0IiBocmVmPSJqYXZhc2NyaXB0OjsiPjxzcGFuPjwvc3Bhbj48L2E+JywKCQkJCXByZXYgICAgIDogJzxhIHRpdGxlPSJQcmV2aW91cyIgY2xhc3M9ImZhbmN5Ym94LW5hdiBmYW5jeWJveC1wcmV2IiBocmVmPSJqYXZhc2NyaXB0OjsiPjxzcGFuPjwvc3Bhbj48L2E+JwoJCQl9LAoKCQkJLy8gUHJvcGVydGllcyBmb3IgZWFjaCBhbmltYXRpb24gdHlwZQoJCQkvLyBPcGVuaW5nIGZhbmN5Qm94CgkJCW9wZW5FZmZlY3QgIDogJ2ZhZGUnLCAvLyAnZWxhc3RpYycsICdmYWRlJyBvciAnbm9uZScKCQkJb3BlblNwZWVkICAgOiAyNTAsCgkJCW9wZW5FYXNpbmcgIDogJ3N3aW5nJywKCQkJb3Blbk9wYWNpdHkgOiB0cnVlLAoJCQlvcGVuTWV0aG9kICA6ICd6b29tSW4nLAoKCQkJLy8gQ2xvc2luZyBmYW5jeUJveAoJCQljbG9zZUVmZmVjdCAgOiAnZmFkZScsIC8vICdlbGFzdGljJywgJ2ZhZGUnIG9yICdub25lJwoJCQljbG9zZVNwZWVkICAgOiAyNTAsCgkJCWNsb3NlRWFzaW5nICA6ICdzd2luZycsCgkJCWNsb3NlT3BhY2l0eSA6IHRydWUsCgkJCWNsb3NlTWV0aG9kICA6ICd6b29tT3V0JywKCgkJCS8vIENoYW5naW5nIG5leHQgZ2FsbGVyeSBpdGVtCgkJCW5leHRFZmZlY3QgOiAnZWxhc3RpYycsIC8vICdlbGFzdGljJywgJ2ZhZGUnIG9yICdub25lJwoJCQluZXh0U3BlZWQgIDogMjUwLAoJCQluZXh0RWFzaW5nIDogJ3N3aW5nJywKCQkJbmV4dE1ldGhvZCA6ICdjaGFuZ2VJbicsCgoJCQkvLyBDaGFuZ2luZyBwcmV2aW91cyBnYWxsZXJ5IGl0ZW0KCQkJcHJldkVmZmVjdCA6ICdlbGFzdGljJywgLy8gJ2VsYXN0aWMnLCAnZmFkZScgb3IgJ25vbmUnCgkJCXByZXZTcGVlZCAgOiAyNTAsCgkJCXByZXZFYXNpbmcgOiAnc3dpbmcnLAoJCQlwcmV2TWV0aG9kIDogJ2NoYW5nZU91dCcsCgoJCQkvLyBFbmFibGUgZGVmYXVsdCBoZWxwZXJzCgkJCWhlbHBlcnMgOiB7CgkJCQlvdmVybGF5IDogdHJ1ZSwKCQkJCXRpdGxlICAgOiB0cnVlCgkJCX0sCgoJCQkvLyBDYWxsYmFja3MKCQkJb25DYW5jZWwgICAgIDogJC5ub29wLCAvLyBJZiBjYW5jZWxpbmcKCQkJYmVmb3JlTG9hZCAgIDogJC5ub29wLCAvLyBCZWZvcmUgbG9hZGluZwoJCQlhZnRlckxvYWQgICAgOiAkLm5vb3AsIC8vIEFmdGVyIGxvYWRpbmcKCQkJYmVmb3JlU2hvdyAgIDogJC5ub29wLCAvLyBCZWZvcmUgY2hhbmdpbmcgaW4gY3VycmVudCBpdGVtCgkJCWFmdGVyU2hvdyAgICA6ICQubm9vcCwgLy8gQWZ0ZXIgb3BlbmluZwoJCQliZWZvcmVDaGFuZ2UgOiAkLm5vb3AsIC8vIEJlZm9yZSBjaGFuZ2luZyBnYWxsZXJ5IGl0ZW0KCQkJYmVmb3JlQ2xvc2UgIDogJC5ub29wLCAvLyBCZWZvcmUgY2xvc2luZwoJCQlhZnRlckNsb3NlICAgOiAkLm5vb3AgIC8vIEFmdGVyIGNsb3NpbmcKCQl9LAoKCQkvL0N1cnJlbnQgc3RhdGUKCQlncm91cCAgICA6IHt9LCAvLyBTZWxlY3RlZCBncm91cAoJCW9wdHMgICAgIDoge30sIC8vIEdyb3VwIG9wdGlvbnMKCQlwcmV2aW91cyA6IG51bGwsICAvLyBQcmV2aW91cyBlbGVtZW50CgkJY29taW5nICAgOiBudWxsLCAgLy8gRWxlbWVudCBiZWluZyBsb2FkZWQKCQljdXJyZW50ICA6IG51bGwsICAvLyBDdXJyZW50bHkgbG9hZGVkIGVsZW1lbnQKCQlpc0FjdGl2ZSA6IGZhbHNlLCAvLyBJcyBhY3RpdmF0ZWQKCQlpc09wZW4gICA6IGZhbHNlLCAvLyBJcyBjdXJyZW50bHkgb3BlbgoJCWlzT3BlbmVkIDogZmFsc2UsIC8vIEhhdmUgYmVlbiBmdWxseSBvcGVuZWQgYXQgbGVhc3Qgb25jZQoKCQl3cmFwICA6IG51bGwsCgkJc2tpbiAgOiBudWxsLAoJCW91dGVyIDogbnVsbCwKCQlpbm5lciA6IG51bGwsCgoJCXBsYXllciA6IHsKCQkJdGltZXIgICAgOiBudWxsLAoJCQlpc0FjdGl2ZSA6IGZhbHNlCgkJfSwKCgkJLy8gTG9hZGVycwoJCWFqYXhMb2FkICAgOiBudWxsLAoJCWltZ1ByZWxvYWQgOiBudWxsLAoKCQkvLyBTb21lIGNvbGxlY3Rpb25zCgkJdHJhbnNpdGlvbnMgOiB7fSwKCQloZWxwZXJzICAgICA6IHt9LAoKCQkvKgoJCSAqCVN0YXRpYyBtZXRob2RzCgkJICovCgoJCW9wZW46IGZ1bmN0aW9uIChncm91cCwgb3B0cykgewoJCQlpZiAoIWdyb3VwKSB7CgkJCQlyZXR1cm47CgkJCX0KCgkJCWlmICghJC5pc1BsYWluT2JqZWN0KG9wdHMpKSB7CgkJCQlvcHRzID0ge307CgkJCX0KCgkJCS8vIENsb3NlIGlmIGFscmVhZHkgYWN0aXZlCgkJCWlmIChmYWxzZSA9PT0gRi5jbG9zZSh0cnVlKSkgewoJCQkJcmV0dXJuOwoJCQl9CgoJCQkvLyBOb3JtYWxpemUgZ3JvdXAKCQkJaWYgKCEkLmlzQXJyYXkoZ3JvdXApKSB7CgkJCQlncm91cCA9IGlzUXVlcnkoZ3JvdXApID8gJChncm91cCkuZ2V0KCkgOiBbZ3JvdXBdOwoJCQl9CgoJCQkvLyBSZWNoZWNrIGlmIHRoZSB0eXBlIG9mIGVhY2ggZWxlbWVudCBpcyBgb2JqZWN0YCBhbmQgc2V0IGNvbnRlbnQgdHlwZSAoaW1hZ2UsIGFqYXgsIGV0YykKCQkJJC5lYWNoKGdyb3VwLCBmdW5jdGlvbihpLCBlbGVtZW50KSB7CgkJCQl2YXIgb2JqID0ge30sCgkJCQkJaHJlZiwKCQkJCQl0aXRsZSwKCQkJCQljb250ZW50LAoJCQkJCXR5cGUsCgkJCQkJcmV6LAoJCQkJCWhyZWZQYXJ0cywKCQkJCQlzZWxlY3RvcjsKCgkJCQlpZiAoJC50eXBlKGVsZW1lbnQpID09PSAib2JqZWN0IikgewoJCQkJCS8vIENoZWNrIGlmIGlzIERPTSBlbGVtZW50CgkJCQkJaWYgKGVsZW1lbnQubm9kZVR5cGUpIHsKCQkJCQkJZWxlbWVudCA9ICQoZWxlbWVudCk7CgkJCQkJfQoKCQkJCQlpZiAoaXNRdWVyeShlbGVtZW50KSkgewoJCQkJCQlvYmogPSB7CgkJCQkJCQlocmVmICAgIDogZWxlbWVudC5kYXRhKCdmYW5jeWJveC1ocmVmJykgfHwgZWxlbWVudC5hdHRyKCdocmVmJyksCgkJCQkJCQl0aXRsZSAgIDogZWxlbWVudC5kYXRhKCdmYW5jeWJveC10aXRsZScpIHx8IGVsZW1lbnQuYXR0cigndGl0bGUnKSwKCQkJCQkJCWlzRG9tICAgOiB0cnVlLAoJCQkJCQkJZWxlbWVudCA6IGVsZW1lbnQKCQkJCQkJfTsKCgkJCQkJCWlmICgkLm1ldGFkYXRhKSB7CgkJCQkJCQkkLmV4dGVuZCh0cnVlLCBvYmosIGVsZW1lbnQubWV0YWRhdGEoKSk7CgkJCQkJCX0KCgkJCQkJfSBlbHNlIHsKCQkJCQkJb2JqID0gZWxlbWVudDsKCQkJCQl9CgkJCQl9CgoJCQkJaHJlZiAgPSBvcHRzLmhyZWYgIHx8IG9iai5ocmVmIHx8IChpc1N0cmluZyhlbGVtZW50KSA/IGVsZW1lbnQgOiBudWxsKTsKCQkJCXRpdGxlID0gb3B0cy50aXRsZSAhPT0gdW5kZWZpbmVkID8gb3B0cy50aXRsZSA6IG9iai50aXRsZSB8fCAnJzsKCgkJCQljb250ZW50ID0gb3B0cy5jb250ZW50IHx8IG9iai5jb250ZW50OwoJCQkJdHlwZSAgICA9IGNvbnRlbnQgPyAnaHRtbCcgOiAob3B0cy50eXBlICB8fCBvYmoudHlwZSk7CgoJCQkJaWYgKCF0eXBlICYmIG9iai5pc0RvbSkgewoJCQkJCXR5cGUgPSBlbGVtZW50LmRhdGEoJ2ZhbmN5Ym94LXR5cGUnKTsKCgkJCQkJaWYgKCF0eXBlKSB7CgkJCQkJCXJleiAgPSBlbGVtZW50LnByb3AoJ2NsYXNzJykubWF0Y2goL2ZhbmN5Ym94XC4oXHcrKS8pOwoJCQkJCQl0eXBlID0gcmV6ID8gcmV6WzFdIDogbnVsbDsKCQkJCQl9CgkJCQl9CgoJCQkJaWYgKGlzU3RyaW5nKGhyZWYpKSB7CgkJCQkJLy8gVHJ5IHRvIGd1ZXNzIHRoZSBjb250ZW50IHR5cGUKCQkJCQlpZiAoIXR5cGUpIHsKCQkJCQkJaWYgKEYuaXNJbWFnZShocmVmKSkgewoJCQkJCQkJdHlwZSA9ICdpbWFnZSc7CgoJCQkJCQl9IGVsc2UgaWYgKEYuaXNTV0YoaHJlZikpIHsKCQkJCQkJCXR5cGUgPSAnc3dmJzsKCgkJCQkJCX0gZWxzZSBpZiAoaHJlZi5jaGFyQXQoMCkgPT09ICcjJykgewoJCQkJCQkJdHlwZSA9ICdpbmxpbmUnOwoKCQkJCQkJfSBlbHNlIGlmIChpc1N0cmluZyhlbGVtZW50KSkgewoJCQkJCQkJdHlwZSAgICA9ICdodG1sJzsKCQkJCQkJCWNvbnRlbnQgPSBlbGVtZW50OwoJCQkJCQl9CgkJCQkJfQoKCQkJCQkvLyBTcGxpdCB1cmwgaW50byB0d28gcGllY2VzIHdpdGggc291cmNlIHVybCBhbmQgY29udGVudCBzZWxlY3RvciwgZS5nLAoJCQkJCS8vICIvbXlwYWdlLmh0bWwgI215X2lkIiB3aWxsIGxvYWQgIi9teXBhZ2UuaHRtbCIgYW5kIGRpc3BsYXkgZWxlbWVudCBoYXZpbmcgaWQgIm15X2lkIgoJCQkJCWlmICh0eXBlID09PSAnYWpheCcpIHsKCQkJCQkJaHJlZlBhcnRzID0gaHJlZi5zcGxpdCgvXHMrLywgMik7CgkJCQkJCWhyZWYgICAgICA9IGhyZWZQYXJ0cy5zaGlmdCgpOwoJCQkJCQlzZWxlY3RvciAgPSBocmVmUGFydHMuc2hpZnQoKTsKCQkJCQl9CgkJCQl9CgoJCQkJaWYgKCFjb250ZW50KSB7CgkJCQkJaWYgKHR5cGUgPT09ICdpbmxpbmUnKSB7CgkJCQkJCWlmIChocmVmKSB7CgkJCQkJCQljb250ZW50ID0gJCggaXNTdHJpbmcoaHJlZikgPyBocmVmLnJlcGxhY2UoLy4qKD89I1teXHNdKyQpLywgJycpIDogaHJlZiApOyAvL3N0cmlwIGZvciBpZTcKCgkJCQkJCX0gZWxzZSBpZiAob2JqLmlzRG9tKSB7CgkJCQkJCQljb250ZW50ID0gZWxlbWVudDsKCQkJCQkJfQoKCQkJCQl9IGVsc2UgaWYgKHR5cGUgPT09ICdodG1sJykgewoJCQkJCQljb250ZW50ID0gaHJlZjsKCgkJCQkJfSBlbHNlIGlmICghdHlwZSAmJiAhaHJlZiAmJiBvYmouaXNEb20pIHsKCQkJCQkJdHlwZSAgICA9ICdpbmxpbmUnOwoJCQkJCQljb250ZW50ID0gZWxlbWVudDsKCQkJCQl9CgkJCQl9CgoJCQkJJC5leHRlbmQob2JqLCB7CgkJCQkJaHJlZiAgICAgOiBocmVmLAoJCQkJCXR5cGUgICAgIDogdHlwZSwKCQkJCQljb250ZW50ICA6IGNvbnRlbnQsCgkJCQkJdGl0bGUgICAgOiB0aXRsZSwKCQkJCQlzZWxlY3RvciA6IHNlbGVjdG9yCgkJCQl9KTsKCgkJCQlncm91cFsgaSBdID0gb2JqOwoJCQl9KTsKCgkJCS8vIEV4dGVuZCB0aGUgZGVmYXVsdHMKCQkJRi5vcHRzID0gJC5leHRlbmQodHJ1ZSwge30sIEYuZGVmYXVsdHMsIG9wdHMpOwoKCQkJLy8gQWxsIG9wdGlvbnMgYXJlIG1lcmdlZCByZWN1cnNpdmUgZXhjZXB0IGtleXMKCQkJaWYgKG9wdHMua2V5cyAhPT0gdW5kZWZpbmVkKSB7CgkJCQlGLm9wdHMua2V5cyA9IG9wdHMua2V5cyA/ICQuZXh0ZW5kKHt9LCBGLmRlZmF1bHRzLmtleXMsIG9wdHMua2V5cykgOiBmYWxzZTsKCQkJfQoKCQkJRi5ncm91cCA9IGdyb3VwOwoKCQkJcmV0dXJuIEYuX3N0YXJ0KEYub3B0cy5pbmRleCk7CgkJfSwKCgkJLy8gQ2FuY2VsIGltYWdlIGxvYWRpbmcgb3IgYWJvcnQgYWpheCByZXF1ZXN0CgkJY2FuY2VsOiBmdW5jdGlvbiAoKSB7CgkJCXZhciBjb21pbmcgPSBGLmNvbWluZzsKCgkJCWlmICghY29taW5nIHx8IGZhbHNlID09PSBGLnRyaWdnZXIoJ29uQ2FuY2VsJykpIHsKCQkJCXJldHVybjsKCQkJfQoKCQkJRi5oaWRlTG9hZGluZygpOwoKCQkJaWYgKEYuYWpheExvYWQpIHsKCQkJCUYuYWpheExvYWQuYWJvcnQoKTsKCQkJfQoKCQkJRi5hamF4TG9hZCA9IG51bGw7CgoJCQlpZiAoRi5pbWdQcmVsb2FkKSB7CgkJCQlGLmltZ1ByZWxvYWQub25sb2FkID0gRi5pbWdQcmVsb2FkLm9uZXJyb3IgPSBudWxsOwoJCQl9CgoJCQlpZiAoY29taW5nLndyYXApIHsKCQkJCWNvbWluZy53cmFwLnN0b3AodHJ1ZSwgdHJ1ZSkudHJpZ2dlcignb25SZXNldCcpLnJlbW92ZSgpOwoJCQl9CgoJCQlGLmNvbWluZyA9IG51bGw7CgoJCQkvLyBJZiB0aGUgZmlyc3QgaXRlbSBoYXMgYmVlbiBjYW5jZWxlZCwgdGhlbiBjbGVhciBldmVyeXRoaW5nCgkJCWlmICghRi5jdXJyZW50KSB7CgkJCQlGLl9hZnRlclpvb21PdXQoIGNvbWluZyApOwoJCQl9CgkJfSwKCgkJLy8gU3RhcnQgY2xvc2luZyBhbmltYXRpb24gaWYgaXMgb3BlbjsgcmVtb3ZlIGltbWVkaWF0ZWx5IGlmIG9wZW5pbmcvY2xvc2luZwoJCWNsb3NlOiBmdW5jdGlvbiAoZXZlbnQpIHsKCQkJRi5jYW5jZWwoKTsKCgkJCWlmIChmYWxzZSA9PT0gRi50cmlnZ2VyKCdiZWZvcmVDbG9zZScpKSB7CgkJCQlyZXR1cm47CgkJCX0KCgkJCUYudW5iaW5kRXZlbnRzKCk7CgoJCQlpZiAoIUYuaXNBY3RpdmUpIHsKCQkJCXJldHVybjsKCQkJfQoKCQkJaWYgKCFGLmlzT3BlbiB8fCBldmVudCA9PT0gdHJ1ZSkgewoJCQkJJCgnLmZhbmN5Ym94LXdyYXAnKS5zdG9wKHRydWUpLnRyaWdnZXIoJ29uUmVzZXQnKS5yZW1vdmUoKTsKCgkJCQlGLl9hZnRlclpvb21PdXQoKTsKCgkJCX0gZWxzZSB7CgkJCQlGLmlzT3BlbiA9IEYuaXNPcGVuZWQgPSBmYWxzZTsKCQkJCUYuaXNDbG9zaW5nID0gdHJ1ZTsKCgkJCQkkKCcuZmFuY3lib3gtaXRlbSwgLmZhbmN5Ym94LW5hdicpLnJlbW92ZSgpOwoKCQkJCUYud3JhcC5zdG9wKHRydWUsIHRydWUpLnJlbW92ZUNsYXNzKCdmYW5jeWJveC1vcGVuZWQnKTsKCgkJCQlGLnRyYW5zaXRpb25zWyBGLmN1cnJlbnQuY2xvc2VNZXRob2QgXSgpOwoJCQl9CgkJfSwKCgkJLy8gTWFuYWdlIHNsaWRlc2hvdzoKCQkvLyAgICQuZmFuY3lib3gucGxheSgpOyAtIHRvZ2dsZSBzbGlkZXNob3cKCQkvLyAgICQuZmFuY3lib3gucGxheSggdHJ1ZSApOyAtIHN0YXJ0CgkJLy8gICAkLmZhbmN5Ym94LnBsYXkoIGZhbHNlICk7IC0gc3RvcAoJCXBsYXk6IGZ1bmN0aW9uICggYWN0aW9uICkgewoJCQl2YXIgY2xlYXIgPSBmdW5jdGlvbiAoKSB7CgkJCQkJY2xlYXJUaW1lb3V0KEYucGxheWVyLnRpbWVyKTsKCQkJCX0sCgkJCQlzZXQgPSBmdW5jdGlvbiAoKSB7CgkJCQkJY2xlYXIoKTsKCgkJCQkJaWYgKEYuY3VycmVudCAmJiBGLnBsYXllci5pc0FjdGl2ZSkgewoJCQkJCQlGLnBsYXllci50aW1lciA9IHNldFRpbWVvdXQoRi5uZXh0LCBGLmN1cnJlbnQucGxheVNwZWVkKTsKCQkJCQl9CgkJCQl9LAoJCQkJc3RvcCA9IGZ1bmN0aW9uICgpIHsKCQkJCQljbGVhcigpOwoKCQkJCQkkKCdib2R5JykudW5iaW5kKCcucGxheWVyJyk7CgoJCQkJCUYucGxheWVyLmlzQWN0aXZlID0gZmFsc2U7CgoJCQkJCUYudHJpZ2dlcignb25QbGF5RW5kJyk7CgkJCQl9LAoJCQkJc3RhcnQgPSBmdW5jdGlvbiAoKSB7CgkJCQkJaWYgKEYuY3VycmVudCAmJiAoRi5jdXJyZW50Lmxvb3AgfHwgRi5jdXJyZW50LmluZGV4IDwgRi5ncm91cC5sZW5ndGggLSAxKSkgewoJCQkJCQlGLnBsYXllci5pc0FjdGl2ZSA9IHRydWU7CgoJCQkJCQkkKCdib2R5JykuYmluZCh7CgkJCQkJCQknYWZ0ZXJTaG93LnBsYXllciBvblVwZGF0ZS5wbGF5ZXInICAgOiBzZXQsCgkJCQkJCQknb25DYW5jZWwucGxheWVyIGJlZm9yZUNsb3NlLnBsYXllcicgOiBzdG9wLAoJCQkJCQkJJ2JlZm9yZUxvYWQucGxheWVyJyA6IGNsZWFyCgkJCQkJCX0pOwoKCQkJCQkJc2V0KCk7CgoJCQkJCQlGLnRyaWdnZXIoJ29uUGxheVN0YXJ0Jyk7CgkJCQkJfQoJCQkJfTsKCgkJCWlmIChhY3Rpb24gPT09IHRydWUgfHwgKCFGLnBsYXllci5pc0FjdGl2ZSAmJiBhY3Rpb24gIT09IGZhbHNlKSkgewoJCQkJc3RhcnQoKTsKCQkJfSBlbHNlIHsKCQkJCXN0b3AoKTsKCQkJfQoJCX0sCgoJCS8vIE5hdmlnYXRlIHRvIG5leHQgZ2FsbGVyeSBpdGVtCgkJbmV4dDogZnVuY3Rpb24gKCBkaXJlY3Rpb24gKSB7CgkJCXZhciBjdXJyZW50ID0gRi5jdXJyZW50OwoKCQkJaWYgKGN1cnJlbnQpIHsKCQkJCWlmICghaXNTdHJpbmcoZGlyZWN0aW9uKSkgewoJCQkJCWRpcmVjdGlvbiA9IGN1cnJlbnQuZGlyZWN0aW9uLm5leHQ7CgkJCQl9CgoJCQkJRi5qdW1wdG8oY3VycmVudC5pbmRleCArIDEsIGRpcmVjdGlvbiwgJ25leHQnKTsKCQkJfQoJCX0sCgoJCS8vIE5hdmlnYXRlIHRvIHByZXZpb3VzIGdhbGxlcnkgaXRlbQoJCXByZXY6IGZ1bmN0aW9uICggZGlyZWN0aW9uICkgewoJCQl2YXIgY3VycmVudCA9IEYuY3VycmVudDsKCgkJCWlmIChjdXJyZW50KSB7CgkJCQlpZiAoIWlzU3RyaW5nKGRpcmVjdGlvbikpIHsKCQkJCQlkaXJlY3Rpb24gPSBjdXJyZW50LmRpcmVjdGlvbi5wcmV2OwoJCQkJfQoKCQkJCUYuanVtcHRvKGN1cnJlbnQuaW5kZXggLSAxLCBkaXJlY3Rpb24sICdwcmV2Jyk7CgkJCX0KCQl9LAoKCQkvLyBOYXZpZ2F0ZSB0byBnYWxsZXJ5IGl0ZW0gYnkgaW5kZXgKCQlqdW1wdG86IGZ1bmN0aW9uICggaW5kZXgsIGRpcmVjdGlvbiwgcm91dGVyICkgewoJCQl2YXIgY3VycmVudCA9IEYuY3VycmVudDsKCgkJCWlmICghY3VycmVudCkgewoJCQkJcmV0dXJuOwoJCQl9CgoJCQlpbmRleCA9IGdldFNjYWxhcihpbmRleCk7CgoJCQlGLmRpcmVjdGlvbiA9IGRpcmVjdGlvbiB8fCBjdXJyZW50LmRpcmVjdGlvblsgKGluZGV4ID49IGN1cnJlbnQuaW5kZXggPyAnbmV4dCcgOiAncHJldicpIF07CgkJCUYucm91dGVyICAgID0gcm91dGVyIHx8ICdqdW1wdG8nOwoKCQkJaWYgKGN1cnJlbnQubG9vcCkgewoJCQkJaWYgKGluZGV4IDwgMCkgewoJCQkJCWluZGV4ID0gY3VycmVudC5ncm91cC5sZW5ndGggKyAoaW5kZXggJSBjdXJyZW50Lmdyb3VwLmxlbmd0aCk7CgkJCQl9CgoJCQkJaW5kZXggPSBpbmRleCAlIGN1cnJlbnQuZ3JvdXAubGVuZ3RoOwoJCQl9CgoJCQlpZiAoY3VycmVudC5ncm91cFsgaW5kZXggXSAhPT0gdW5kZWZpbmVkKSB7CgkJCQlGLmNhbmNlbCgpOwoKCQkJCUYuX3N0YXJ0KGluZGV4KTsKCQkJfQoJCX0sCgoJCS8vIENlbnRlciBpbnNpZGUgdmlld3BvcnQgYW5kIHRvZ2dsZSBwb3NpdGlvbiB0eXBlIHRvIGZpeGVkIG9yIGFic29sdXRlIGlmIG5lZWRlZAoJCXJlcG9zaXRpb246IGZ1bmN0aW9uIChlLCBvbmx5QWJzb2x1dGUpIHsKCQkJdmFyIGN1cnJlbnQgPSBGLmN1cnJlbnQsCgkJCQl3cmFwICAgID0gY3VycmVudCA/IGN1cnJlbnQud3JhcCA6IG51bGwsCgkJCQlwb3M7CgoJCQlpZiAod3JhcCkgewoJCQkJcG9zID0gRi5fZ2V0UG9zaXRpb24ob25seUFic29sdXRlKTsKCgkJCQlpZiAoZSAmJiBlLnR5cGUgPT09ICdzY3JvbGwnKSB7CgkJCQkJZGVsZXRlIHBvcy5wb3NpdGlvbjsKCgkJCQkJd3JhcC5zdG9wKHRydWUsIHRydWUpLmFuaW1hdGUocG9zLCAyMDApOwoKCQkJCX0gZWxzZSB7CgkJCQkJd3JhcC5jc3MocG9zKTsKCgkJCQkJY3VycmVudC5wb3MgPSAkLmV4dGVuZCh7fSwgY3VycmVudC5kaW0sIHBvcyk7CgkJCQl9CgkJCX0KCQl9LAoKCQl1cGRhdGU6IGZ1bmN0aW9uIChlKSB7CgkJCXZhciB0eXBlID0gKGUgJiYgZS50eXBlKSwKCQkJCWFueXdheSA9ICF0eXBlIHx8IHR5cGUgPT09ICdvcmllbnRhdGlvbmNoYW5nZSc7CgoJCQlpZiAoYW55d2F5KSB7CgkJCQljbGVhclRpbWVvdXQoZGlkVXBkYXRlKTsKCgkJCQlkaWRVcGRhdGUgPSBudWxsOwoJCQl9CgoJCQlpZiAoIUYuaXNPcGVuIHx8IGRpZFVwZGF0ZSkgewoJCQkJcmV0dXJuOwoJCQl9CgoJCQlkaWRVcGRhdGUgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewoJCQkJdmFyIGN1cnJlbnQgPSBGLmN1cnJlbnQ7CgoJCQkJaWYgKCFjdXJyZW50IHx8IEYuaXNDbG9zaW5nKSB7CgkJCQkJcmV0dXJuOwoJCQkJfQoKCQkJCUYud3JhcC5yZW1vdmVDbGFzcygnZmFuY3lib3gtdG1wJyk7CgoJCQkJaWYgKGFueXdheSB8fCB0eXBlID09PSAnbG9hZCcgfHwgKHR5cGUgPT09ICdyZXNpemUnICYmIGN1cnJlbnQuYXV0b1Jlc2l6ZSkpIHsKCQkJCQlGLl9zZXREaW1lbnNpb24oKTsKCQkJCX0KCgkJCQlpZiAoISh0eXBlID09PSAnc2Nyb2xsJyAmJiBjdXJyZW50LmNhblNocmluaykpIHsKCQkJCQlGLnJlcG9zaXRpb24oZSk7CgkJCQl9CgoJCQkJRi50cmlnZ2VyKCdvblVwZGF0ZScpOwoKCQkJCWRpZFVwZGF0ZSA9IG51bGw7CgoJCQl9LCAoYW55d2F5ICYmICFpc1RvdWNoID8gMCA6IDMwMCkpOwoJCX0sCgoJCS8vIFNocmluayBjb250ZW50IHRvIGZpdCBpbnNpZGUgdmlld3BvcnQgb3IgcmVzdG9yZSBpZiByZXNpemVkCgkJdG9nZ2xlOiBmdW5jdGlvbiAoIGFjdGlvbiApIHsKCQkJaWYgKEYuaXNPcGVuKSB7CgkJCQlGLmN1cnJlbnQuZml0VG9WaWV3ID0gJC50eXBlKGFjdGlvbikgPT09ICJib29sZWFuIiA/IGFjdGlvbiA6ICFGLmN1cnJlbnQuZml0VG9WaWV3OwoKCQkJCS8vIEhlbHAgYnJvd3NlciB0byByZXN0b3JlIGRvY3VtZW50IGRpbWVuc2lvbnMKCQkJCWlmIChpc1RvdWNoKSB7CgkJCQkJRi53cmFwLnJlbW92ZUF0dHIoJ3N0eWxlJykuYWRkQ2xhc3MoJ2ZhbmN5Ym94LXRtcCcpOwoKCQkJCQlGLnRyaWdnZXIoJ29uVXBkYXRlJyk7CgkJCQl9CgoJCQkJRi51cGRhdGUoKTsKCQkJfQoJCX0sCgoJCWhpZGVMb2FkaW5nOiBmdW5jdGlvbiAoKSB7CgkJCUQudW5iaW5kKCcubG9hZGluZycpOwoKCQkJJCgnI2ZhbmN5Ym94LWxvYWRpbmcnKS5yZW1vdmUoKTsKCQl9LAoKCQlzaG93TG9hZGluZzogZnVuY3Rpb24gKCkgewoJCQl2YXIgZWwsIHZpZXdwb3J0OwoKCQkJRi5oaWRlTG9hZGluZygpOwoKCQkJZWwgPSAkKCc8ZGl2IGlkPSJmYW5jeWJveC1sb2FkaW5nIj48ZGl2PjwvZGl2PjwvZGl2PicpLmNsaWNrKEYuY2FuY2VsKS5hcHBlbmRUbygnYm9keScpOwoKCQkJLy8gSWYgdXNlciB3aWxsIHByZXNzIHRoZSBlc2NhcGUtYnV0dG9uLCB0aGUgcmVxdWVzdCB3aWxsIGJlIGNhbmNlbGVkCgkJCUQuYmluZCgna2V5ZG93bi5sb2FkaW5nJywgZnVuY3Rpb24oZSkgewoJCQkJaWYgKChlLndoaWNoIHx8IGUua2V5Q29kZSkgPT09IDI3KSB7CgkJCQkJZS5wcmV2ZW50RGVmYXVsdCgpOwoKCQkJCQlGLmNhbmNlbCgpOwoJCQkJfQoJCQl9KTsKCgkJCWlmICghRi5kZWZhdWx0cy5maXhlZCkgewoJCQkJdmlld3BvcnQgPSBGLmdldFZpZXdwb3J0KCk7CgoJCQkJZWwuY3NzKHsKCQkJCQlwb3NpdGlvbiA6ICdhYnNvbHV0ZScsCgkJCQkJdG9wICA6ICh2aWV3cG9ydC5oICogMC41KSArIHZpZXdwb3J0LnksCgkJCQkJbGVmdCA6ICh2aWV3cG9ydC53ICogMC41KSArIHZpZXdwb3J0LngKCQkJCX0pOwoJCQl9CgkJfSwKCgkJZ2V0Vmlld3BvcnQ6IGZ1bmN0aW9uICgpIHsKCQkJdmFyIGxvY2tlZCA9IChGLmN1cnJlbnQgJiYgRi5jdXJyZW50LmxvY2tlZCkgfHwgZmFsc2UsCgkJCQlyZXogICAgPSB7CgkJCQkJeDogVy5zY3JvbGxMZWZ0KCksCgkJCQkJeTogVy5zY3JvbGxUb3AoKQoJCQkJfTsKCgkJCWlmIChsb2NrZWQpIHsKCQkJCXJlei53ID0gbG9ja2VkWzBdLmNsaWVudFdpZHRoOwoJCQkJcmV6LmggPSBsb2NrZWRbMF0uY2xpZW50SGVpZ2h0OwoKCQkJfSBlbHNlIHsKCQkJCS8vIFNlZSBodHRwOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC82NzI0CgkJCQlyZXoudyA9IGlzVG91Y2ggJiYgd2luZG93LmlubmVyV2lkdGggID8gd2luZG93LmlubmVyV2lkdGggIDogVy53aWR0aCgpOwoJCQkJcmV6LmggPSBpc1RvdWNoICYmIHdpbmRvdy5pbm5lckhlaWdodCA/IHdpbmRvdy5pbm5lckhlaWdodCA6IFcuaGVpZ2h0KCk7CgkJCX0KCgkJCXJldHVybiByZXo7CgkJfSwKCgkJLy8gVW5iaW5kIHRoZSBrZXlib2FyZCAvIGNsaWNraW5nIGFjdGlvbnMKCQl1bmJpbmRFdmVudHM6IGZ1bmN0aW9uICgpIHsKCQkJaWYgKEYud3JhcCAmJiBpc1F1ZXJ5KEYud3JhcCkpIHsKCQkJCUYud3JhcC51bmJpbmQoJy5mYicpOwoJCQl9CgoJCQlELnVuYmluZCgnLmZiJyk7CgkJCVcudW5iaW5kKCcuZmInKTsKCQl9LAoKCQliaW5kRXZlbnRzOiBmdW5jdGlvbiAoKSB7CgkJCXZhciBjdXJyZW50ID0gRi5jdXJyZW50LAoJCQkJa2V5czsKCgkJCWlmICghY3VycmVudCkgewoJCQkJcmV0dXJuOwoJCQl9CgoJCQkvLyBDaGFuZ2luZyBkb2N1bWVudCBoZWlnaHQgb24gaU9TIGRldmljZXMgdHJpZ2dlcnMgYSAncmVzaXplJyBldmVudCwKCQkJLy8gdGhhdCBjYW4gY2hhbmdlIGRvY3VtZW50IGhlaWdodC4uLiByZXBlYXRpbmcgaW5maW5pdGVseQoJCQlXLmJpbmQoJ29yaWVudGF0aW9uY2hhbmdlLmZiJyArIChpc1RvdWNoID8gJycgOiAnIHJlc2l6ZS5mYicpICsgKGN1cnJlbnQuYXV0b0NlbnRlciAmJiAhY3VycmVudC5sb2NrZWQgPyAnIHNjcm9sbC5mYicgOiAnJyksIEYudXBkYXRlKTsKCgkJCWtleXMgPSBjdXJyZW50LmtleXM7CgoJCQlpZiAoa2V5cykgewoJCQkJRC5iaW5kKCdrZXlkb3duLmZiJywgZnVuY3Rpb24gKGUpIHsKCQkJCQl2YXIgY29kZSAgID0gZS53aGljaCB8fCBlLmtleUNvZGUsCgkJCQkJCXRhcmdldCA9IGUudGFyZ2V0IHx8IGUuc3JjRWxlbWVudDsKCgkJCQkJLy8gU2tpcCBlc2Mga2V5IGlmIGxvYWRpbmcsIGJlY2F1c2Ugc2hvd0xvYWRpbmcgd2lsbCBjYW5jZWwgcHJlbG9hZGluZwoJCQkJCWlmIChjb2RlID09PSAyNyAmJiBGLmNvbWluZykgewoJCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQkJfQoKCQkJCQkvLyBJZ25vcmUga2V5IGNvbWJpbmF0aW9ucyBhbmQga2V5IGV2ZW50cyB3aXRoaW4gZm9ybSBlbGVtZW50cwoJCQkJCWlmICghZS5jdHJsS2V5ICYmICFlLmFsdEtleSAmJiAhZS5zaGlmdEtleSAmJiAhZS5tZXRhS2V5ICYmICEodGFyZ2V0ICYmICh0YXJnZXQudHlwZSB8fCAkKHRhcmdldCkuaXMoJ1tjb250ZW50ZWRpdGFibGVdJykpKSkgewoJCQkJCQkkLmVhY2goa2V5cywgZnVuY3Rpb24oaSwgdmFsKSB7CgkJCQkJCQlpZiAoY3VycmVudC5ncm91cC5sZW5ndGggPiAxICYmIHZhbFsgY29kZSBdICE9PSB1bmRlZmluZWQpIHsKCQkJCQkJCQlGWyBpIF0oIHZhbFsgY29kZSBdICk7CgoJCQkJCQkJCWUucHJldmVudERlZmF1bHQoKTsKCQkJCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQkJCQl9CgoJCQkJCQkJaWYgKCQuaW5BcnJheShjb2RlLCB2YWwpID4gLTEpIHsKCQkJCQkJCQlGWyBpIF0gKCk7CgoJCQkJCQkJCWUucHJldmVudERlZmF1bHQoKTsKCQkJCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQkJCQl9CgkJCQkJCX0pOwoJCQkJCX0KCQkJCX0pOwoJCQl9CgoJCQlpZiAoJC5mbi5tb3VzZXdoZWVsICYmIGN1cnJlbnQubW91c2VXaGVlbCkgewoJCQkJRi53cmFwLmJpbmQoJ21vdXNld2hlZWwuZmInLCBmdW5jdGlvbiAoZSwgZGVsdGEsIGRlbHRhWCwgZGVsdGFZKSB7CgkJCQkJdmFyIHRhcmdldCA9IGUudGFyZ2V0IHx8IG51bGwsCgkJCQkJCXBhcmVudCA9ICQodGFyZ2V0KSwKCQkJCQkJY2FuU2Nyb2xsID0gZmFsc2U7CgoJCQkJCXdoaWxlIChwYXJlbnQubGVuZ3RoKSB7CgkJCQkJCWlmIChjYW5TY3JvbGwgfHwgcGFyZW50LmlzKCcuZmFuY3lib3gtc2tpbicpIHx8IHBhcmVudC5pcygnLmZhbmN5Ym94LXdyYXAnKSkgewoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCgkJCQkJCWNhblNjcm9sbCA9IGlzU2Nyb2xsYWJsZSggcGFyZW50WzBdICk7CgkJCQkJCXBhcmVudCAgICA9ICQocGFyZW50KS5wYXJlbnQoKTsKCQkJCQl9CgoJCQkJCWlmIChkZWx0YSAhPT0gMCAmJiAhY2FuU2Nyb2xsKSB7CgkJCQkJCWlmIChGLmdyb3VwLmxlbmd0aCA+IDEgJiYgIWN1cnJlbnQuY2FuU2hyaW5rKSB7CgkJCQkJCQlpZiAoZGVsdGFZID4gMCB8fCBkZWx0YVggPiAwKSB7CgkJCQkJCQkJRi5wcmV2KCBkZWx0YVkgPiAwID8gJ2Rvd24nIDogJ2xlZnQnICk7CgoJCQkJCQkJfSBlbHNlIGlmIChkZWx0YVkgPCAwIHx8IGRlbHRhWCA8IDApIHsKCQkJCQkJCQlGLm5leHQoIGRlbHRhWSA8IDAgPyAndXAnIDogJ3JpZ2h0JyApOwoJCQkJCQkJfQoKCQkJCQkJCWUucHJldmVudERlZmF1bHQoKTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0pOwoJCQl9CgkJfSwKCgkJdHJpZ2dlcjogZnVuY3Rpb24gKGV2ZW50LCBvKSB7CgkJCXZhciByZXQsIG9iaiA9IG8gfHwgRi5jb21pbmcgfHwgRi5jdXJyZW50OwoKCQkJaWYgKCFvYmopIHsKCQkJCXJldHVybjsKCQkJfQoKCQkJaWYgKCQuaXNGdW5jdGlvbiggb2JqW2V2ZW50XSApKSB7CgkJCQlyZXQgPSBvYmpbZXZlbnRdLmFwcGx5KG9iaiwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSk7CgkJCX0KCgkJCWlmIChyZXQgPT09IGZhbHNlKSB7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCgkJCWlmIChvYmouaGVscGVycykgewoJCQkJJC5lYWNoKG9iai5oZWxwZXJzLCBmdW5jdGlvbiAoaGVscGVyLCBvcHRzKSB7CgkJCQkJaWYgKG9wdHMgJiYgRi5oZWxwZXJzW2hlbHBlcl0gJiYgJC5pc0Z1bmN0aW9uKEYuaGVscGVyc1toZWxwZXJdW2V2ZW50XSkpIHsKCQkJCQkJb3B0cyA9ICQuZXh0ZW5kKHRydWUsIHt9LCBGLmhlbHBlcnNbaGVscGVyXS5kZWZhdWx0cywgb3B0cyk7CgoJCQkJCQlGLmhlbHBlcnNbaGVscGVyXVtldmVudF0ob3B0cywgb2JqKTsKCQkJCQl9CgkJCQl9KTsKCQkJfQoKCQkJJC5ldmVudC50cmlnZ2VyKGV2ZW50ICsgJy5mYicpOwoJCX0sCgoJCWlzSW1hZ2U6IGZ1bmN0aW9uIChzdHIpIHsKCQkJcmV0dXJuIGlzU3RyaW5nKHN0cikgJiYgc3RyLm1hdGNoKC8oXmRhdGE6aW1hZ2VcLy4qLCl8KFwuKGpwKGV8Z3xlZyl8Z2lmfHBuZ3xibXB8d2VicCkoKFw/fCMpLiopPyQpL2kpOwoJCX0sCgoJCWlzU1dGOiBmdW5jdGlvbiAoc3RyKSB7CgkJCXJldHVybiBpc1N0cmluZyhzdHIpICYmIHN0ci5tYXRjaCgvXC4oc3dmKSgoXD98IykuKik/JC9pKTsKCQl9LAoKCQlfc3RhcnQ6IGZ1bmN0aW9uIChpbmRleCkgewoJCQl2YXIgY29taW5nID0ge30sCgkJCQlvYmosCgkJCQlocmVmLAoJCQkJdHlwZSwKCQkJCW1hcmdpbiwKCQkJCXBhZGRpbmc7CgoJCQlpbmRleCA9IGdldFNjYWxhciggaW5kZXggKTsKCQkJb2JqICAgPSBGLmdyb3VwWyBpbmRleCBdIHx8IG51bGw7CgoJCQlpZiAoIW9iaikgewoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgoJCQljb21pbmcgPSAkLmV4dGVuZCh0cnVlLCB7fSwgRi5vcHRzLCBvYmopOwoKCQkJLy8gQ29udmVydCBtYXJnaW4gYW5kIHBhZGRpbmcgcHJvcGVydGllcyB0byBhcnJheSAtIHRvcCwgcmlnaHQsIGJvdHRvbSwgbGVmdAoJCQltYXJnaW4gID0gY29taW5nLm1hcmdpbjsKCQkJcGFkZGluZyA9IGNvbWluZy5wYWRkaW5nOwoKCQkJaWYgKCQudHlwZShtYXJnaW4pID09PSAnbnVtYmVyJykgewoJCQkJY29taW5nLm1hcmdpbiA9IFttYXJnaW4sIG1hcmdpbiwgbWFyZ2luLCBtYXJnaW5dOwoJCQl9CgoJCQlpZiAoJC50eXBlKHBhZGRpbmcpID09PSAnbnVtYmVyJykgewoJCQkJY29taW5nLnBhZGRpbmcgPSBbcGFkZGluZywgcGFkZGluZywgcGFkZGluZywgcGFkZGluZ107CgkJCX0KCgkJCS8vICdtb2RhbCcgcHJvcGVyeSBpcyBqdXN0IGEgc2hvcnRjdXQKCQkJaWYgKGNvbWluZy5tb2RhbCkgewoJCQkJJC5leHRlbmQodHJ1ZSwgY29taW5nLCB7CgkJCQkJY2xvc2VCdG4gICA6IGZhbHNlLAoJCQkJCWNsb3NlQ2xpY2sgOiBmYWxzZSwKCQkJCQluZXh0Q2xpY2sgIDogZmFsc2UsCgkJCQkJYXJyb3dzICAgICA6IGZhbHNlLAoJCQkJCW1vdXNlV2hlZWwgOiBmYWxzZSwKCQkJCQlrZXlzICAgICAgIDogbnVsbCwKCQkJCQloZWxwZXJzOiB7CgkJCQkJCW92ZXJsYXkgOiB7CgkJCQkJCQljbG9zZUNsaWNrIDogZmFsc2UKCQkJCQkJfQoJCQkJCX0KCQkJCX0pOwoJCQl9CgoJCQkvLyAnYXV0b1NpemUnIHByb3BlcnR5IGlzIGEgc2hvcnRjdXQsIHRvbwoJCQlpZiAoY29taW5nLmF1dG9TaXplKSB7CgkJCQljb21pbmcuYXV0b1dpZHRoID0gY29taW5nLmF1dG9IZWlnaHQgPSB0cnVlOwoJCQl9CgoJCQlpZiAoY29taW5nLndpZHRoID09PSAnYXV0bycpIHsKCQkJCWNvbWluZy5hdXRvV2lkdGggPSB0cnVlOwoJCQl9CgoJCQlpZiAoY29taW5nLmhlaWdodCA9PT0gJ2F1dG8nKSB7CgkJCQljb21pbmcuYXV0b0hlaWdodCA9IHRydWU7CgkJCX0KCgkJCS8qCgkJCSAqIEFkZCByZWZlcmVuY2UgdG8gdGhlIGdyb3VwLCBzbyBpdGBzIHBvc3NpYmxlIHRvIGFjY2VzcyBmcm9tIGNhbGxiYWNrcywgZXhhbXBsZToKCQkJICogYWZ0ZXJMb2FkIDogZnVuY3Rpb24oKSB7CgkJCSAqICAgICB0aGlzLnRpdGxlID0gJ0ltYWdlICcgKyAodGhpcy5pbmRleCArIDEpICsgJyBvZiAnICsgdGhpcy5ncm91cC5sZW5ndGggKyAodGhpcy50aXRsZSA/ICcgLSAnICsgdGhpcy50aXRsZSA6ICcnKTsKCQkJICogfQoJCQkgKi8KCgkJCWNvbWluZy5ncm91cCAgPSBGLmdyb3VwOwoJCQljb21pbmcuaW5kZXggID0gaW5kZXg7CgoJCQkvLyBHaXZlIGEgY2hhbmNlIGZvciBjYWxsYmFjayBvciBoZWxwZXJzIHRvIHVwZGF0ZSBjb21pbmcgaXRlbSAodHlwZSwgdGl0bGUsIGV0YykKCQkJRi5jb21pbmcgPSBjb21pbmc7CgoJCQlpZiAoZmFsc2UgPT09IEYudHJpZ2dlcignYmVmb3JlTG9hZCcpKSB7CgkJCQlGLmNvbWluZyA9IG51bGw7CgoJCQkJcmV0dXJuOwoJCQl9CgoJCQl0eXBlID0gY29taW5nLnR5cGU7CgkJCWhyZWYgPSBjb21pbmcuaHJlZjsKCgkJCWlmICghdHlwZSkgewoJCQkJRi5jb21pbmcgPSBudWxsOwoKCQkJCS8vSWYgd2UgY2FuIG5vdCBkZXRlcm1pbmUgY29udGVudCB0eXBlIHRoZW4gZHJvcCBzaWxlbnRseSBvciBkaXNwbGF5IG5leHQvcHJldiBpdGVtIGlmIGxvb3BpbmcgdGhyb3VnaCBnYWxsZXJ5CgkJCQlpZiAoRi5jdXJyZW50ICYmIEYucm91dGVyICYmIEYucm91dGVyICE9PSAnanVtcHRvJykgewoJCQkJCUYuY3VycmVudC5pbmRleCA9IGluZGV4OwoKCQkJCQlyZXR1cm4gRlsgRi5yb3V0ZXIgXSggRi5kaXJlY3Rpb24gKTsKCQkJCX0KCgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCgkJCUYuaXNBY3RpdmUgPSB0cnVlOwoKCQkJaWYgKHR5cGUgPT09ICdpbWFnZScgfHwgdHlwZSA9PT0gJ3N3ZicpIHsKCQkJCWNvbWluZy5hdXRvSGVpZ2h0ID0gY29taW5nLmF1dG9XaWR0aCA9IGZhbHNlOwoJCQkJY29taW5nLnNjcm9sbGluZyAgPSAndmlzaWJsZSc7CgkJCX0KCgkJCWlmICh0eXBlID09PSAnaW1hZ2UnKSB7CgkJCQljb21pbmcuYXNwZWN0UmF0aW8gPSB0cnVlOwoJCQl9CgoJCQlpZiAodHlwZSA9PT0gJ2lmcmFtZScgJiYgaXNUb3VjaCkgewoJCQkJY29taW5nLnNjcm9sbGluZyA9ICdzY3JvbGwnOwoJCQl9CgoJCQkvLyBCdWlsZCB0aGUgbmVjY2Vzc2FyeSBtYXJrdXAKCQkJY29taW5nLndyYXAgPSAkKGNvbWluZy50cGwud3JhcCkuYWRkQ2xhc3MoJ2ZhbmN5Ym94LScgKyAoaXNUb3VjaCA/ICdtb2JpbGUnIDogJ2Rlc2t0b3AnKSArICcgZmFuY3lib3gtdHlwZS0nICsgdHlwZSArICcgZmFuY3lib3gtdG1wICcgKyBjb21pbmcud3JhcENTUykuYXBwZW5kVG8oIGNvbWluZy5wYXJlbnQgfHwgJ2JvZHknICk7CgoJCQkkLmV4dGVuZChjb21pbmcsIHsKCQkJCXNraW4gIDogJCgnLmZhbmN5Ym94LXNraW4nLCAgY29taW5nLndyYXApLAoJCQkJb3V0ZXIgOiAkKCcuZmFuY3lib3gtb3V0ZXInLCBjb21pbmcud3JhcCksCgkJCQlpbm5lciA6ICQoJy5mYW5jeWJveC1pbm5lcicsIGNvbWluZy53cmFwKQoJCQl9KTsKCgkJCSQuZWFjaChbIlRvcCIsICJSaWdodCIsICJCb3R0b20iLCAiTGVmdCJdLCBmdW5jdGlvbihpLCB2KSB7CgkJCQljb21pbmcuc2tpbi5jc3MoJ3BhZGRpbmcnICsgdiwgZ2V0VmFsdWUoY29taW5nLnBhZGRpbmdbIGkgXSkpOwoJCQl9KTsKCgkJCUYudHJpZ2dlcignb25SZWFkeScpOwoKCQkJLy8gQ2hlY2sgYmVmb3JlIHRyeSB0byBsb2FkOyAnaW5saW5lJyBhbmQgJ2h0bWwnIHR5cGVzIG5lZWQgY29udGVudCwgb3RoZXJzIC0gaHJlZgoJCQlpZiAodHlwZSA9PT0gJ2lubGluZScgfHwgdHlwZSA9PT0gJ2h0bWwnKSB7CgkJCQlpZiAoIWNvbWluZy5jb250ZW50IHx8ICFjb21pbmcuY29udGVudC5sZW5ndGgpIHsKCQkJCQlyZXR1cm4gRi5fZXJyb3IoICdjb250ZW50JyApOwoJCQkJfQoKCQkJfSBlbHNlIGlmICghaHJlZikgewoJCQkJcmV0dXJuIEYuX2Vycm9yKCAnaHJlZicgKTsKCQkJfQoKCQkJaWYgKHR5cGUgPT09ICdpbWFnZScpIHsKCQkJCUYuX2xvYWRJbWFnZSgpOwoKCQkJfSBlbHNlIGlmICh0eXBlID09PSAnYWpheCcpIHsKCQkJCUYuX2xvYWRBamF4KCk7CgoJCQl9IGVsc2UgaWYgKHR5cGUgPT09ICdpZnJhbWUnKSB7CgkJCQlGLl9sb2FkSWZyYW1lKCk7CgoJCQl9IGVsc2UgewoJCQkJRi5fYWZ0ZXJMb2FkKCk7CgkJCX0KCQl9LAoKCQlfZXJyb3I6IGZ1bmN0aW9uICggdHlwZSApIHsKCQkJJC5leHRlbmQoRi5jb21pbmcsIHsKCQkJCXR5cGUgICAgICAgOiAnaHRtbCcsCgkJCQlhdXRvV2lkdGggIDogdHJ1ZSwKCQkJCWF1dG9IZWlnaHQgOiB0cnVlLAoJCQkJbWluV2lkdGggICA6IDAsCgkJCQltaW5IZWlnaHQgIDogMCwKCQkJCXNjcm9sbGluZyAgOiAnbm8nLAoJCQkJaGFzRXJyb3IgICA6IHR5cGUsCgkJCQljb250ZW50ICAgIDogRi5jb21pbmcudHBsLmVycm9yCgkJCX0pOwoKCQkJRi5fYWZ0ZXJMb2FkKCk7CgkJfSwKCgkJX2xvYWRJbWFnZTogZnVuY3Rpb24gKCkgewoJCQkvLyBSZXNldCBwcmVsb2FkIGltYWdlIHNvIGl0IGlzIGxhdGVyIHBvc3NpYmxlIHRvIGNoZWNrICJjb21wbGV0ZSIgcHJvcGVydHkKCQkJdmFyIGltZyA9IEYuaW1nUHJlbG9hZCA9IG5ldyBJbWFnZSgpOwoKCQkJaW1nLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHsKCQkJCXRoaXMub25sb2FkID0gdGhpcy5vbmVycm9yID0gbnVsbDsKCgkJCQlGLmNvbWluZy53aWR0aCAgPSB0aGlzLndpZHRoOwoJCQkJRi5jb21pbmcuaGVpZ2h0ID0gdGhpcy5oZWlnaHQ7CgoJCQkJRi5fYWZ0ZXJMb2FkKCk7CgkJCX07CgoJCQlpbWcub25lcnJvciA9IGZ1bmN0aW9uICgpIHsKCQkJCXRoaXMub25sb2FkID0gdGhpcy5vbmVycm9yID0gbnVsbDsKCgkJCQlGLl9lcnJvciggJ2ltYWdlJyApOwoJCQl9OwoKCQkJaW1nLnNyYyA9IEYuY29taW5nLmhyZWY7CgoJCQlpZiAoaW1nLmNvbXBsZXRlICE9PSB0cnVlKSB7CgkJCQlGLnNob3dMb2FkaW5nKCk7CgkJCX0KCQl9LAoKCQlfbG9hZEFqYXg6IGZ1bmN0aW9uICgpIHsKCQkJdmFyIGNvbWluZyA9IEYuY29taW5nOwoKCQkJRi5zaG93TG9hZGluZygpOwoKCQkJRi5hamF4TG9hZCA9ICQuYWpheCgkLmV4dGVuZCh7fSwgY29taW5nLmFqYXgsIHsKCQkJCXVybDogY29taW5nLmhyZWYsCgkJCQllcnJvcjogZnVuY3Rpb24gKGpxWEhSLCB0ZXh0U3RhdHVzKSB7CgkJCQkJaWYgKEYuY29taW5nICYmIHRleHRTdGF0dXMgIT09ICdhYm9ydCcpIHsKCQkJCQkJRi5fZXJyb3IoICdhamF4JywganFYSFIgKTsKCgkJCQkJfSBlbHNlIHsKCQkJCQkJRi5oaWRlTG9hZGluZygpOwoJCQkJCX0KCQkJCX0sCgkJCQlzdWNjZXNzOiBmdW5jdGlvbiAoZGF0YSwgdGV4dFN0YXR1cykgewoJCQkJCWlmICh0ZXh0U3RhdHVzID09PSAnc3VjY2VzcycpIHsKCQkJCQkJY29taW5nLmNvbnRlbnQgPSBkYXRhOwoKCQkJCQkJRi5fYWZ0ZXJMb2FkKCk7CgkJCQkJfQoJCQkJfQoJCQl9KSk7CgkJfSwKCgkJX2xvYWRJZnJhbWU6IGZ1bmN0aW9uKCkgewoJCQl2YXIgY29taW5nID0gRi5jb21pbmcsCgkJCQlpZnJhbWUgPSAkKGNvbWluZy50cGwuaWZyYW1lLnJlcGxhY2UoL1x7cm5kXH0vZywgbmV3IERhdGUoKS5nZXRUaW1lKCkpKQoJCQkJCS5hdHRyKCdzY3JvbGxpbmcnLCBpc1RvdWNoID8gJ2F1dG8nIDogY29taW5nLmlmcmFtZS5zY3JvbGxpbmcpCgkJCQkJLmF0dHIoJ3NyYycsIGNvbWluZy5ocmVmKTsKCgkJCS8vIFRoaXMgaGVscHMgSUUKCQkJJChjb21pbmcud3JhcCkuYmluZCgnb25SZXNldCcsIGZ1bmN0aW9uICgpIHsKCQkJCXRyeSB7CgkJCQkJJCh0aGlzKS5maW5kKCdpZnJhbWUnKS5oaWRlKCkuYXR0cignc3JjJywgJy8vYWJvdXQ6YmxhbmsnKS5lbmQoKS5lbXB0eSgpOwoJCQkJfSBjYXRjaCAoZSkge30KCQkJfSk7CgoJCQlpZiAoY29taW5nLmlmcmFtZS5wcmVsb2FkKSB7CgkJCQlGLnNob3dMb2FkaW5nKCk7CgoJCQkJaWZyYW1lLm9uZSgnbG9hZCcsIGZ1bmN0aW9uKCkgewoJCQkJCSQodGhpcykuZGF0YSgncmVhZHknLCAxKTsKCgkJCQkJLy8gaU9TIHdpbGwgbG9zZSBzY3JvbGxpbmcgaWYgd2UgcmVzaXplCgkJCQkJaWYgKCFpc1RvdWNoKSB7CgkJCQkJCSQodGhpcykuYmluZCgnbG9hZC5mYicsIEYudXBkYXRlKTsKCQkJCQl9CgoJCQkJCS8vIFdpdGhvdXQgdGhpcyB0cmljazoKCQkJCQkvLyAgIC0gaWZyYW1lIHdvbid0IHNjcm9sbCBvbiBpT1MgZGV2aWNlcwoJCQkJCS8vICAgLSBJRTcgc29tZXRpbWVzIGRpc3BsYXlzIGVtcHR5IGlmcmFtZQoJCQkJCSQodGhpcykucGFyZW50cygnLmZhbmN5Ym94LXdyYXAnKS53aWR0aCgnMTAwJScpLnJlbW92ZUNsYXNzKCdmYW5jeWJveC10bXAnKS5zaG93KCk7CgoJCQkJCUYuX2FmdGVyTG9hZCgpOwoJCQkJfSk7CgkJCX0KCgkJCWNvbWluZy5jb250ZW50ID0gaWZyYW1lLmFwcGVuZFRvKCBjb21pbmcuaW5uZXIgKTsKCgkJCWlmICghY29taW5nLmlmcmFtZS5wcmVsb2FkKSB7CgkJCQlGLl9hZnRlckxvYWQoKTsKCQkJfQoJCX0sCgoJCV9wcmVsb2FkSW1hZ2VzOiBmdW5jdGlvbigpIHsKCQkJdmFyIGdyb3VwICAgPSBGLmdyb3VwLAoJCQkJY3VycmVudCA9IEYuY3VycmVudCwKCQkJCWxlbiAgICAgPSBncm91cC5sZW5ndGgsCgkJCQljbnQgICAgID0gY3VycmVudC5wcmVsb2FkID8gTWF0aC5taW4oY3VycmVudC5wcmVsb2FkLCBsZW4gLSAxKSA6IDAsCgkJCQlpdGVtLAoJCQkJaTsKCgkJCWZvciAoaSA9IDE7IGkgPD0gY250OyBpICs9IDEpIHsKCQkJCWl0ZW0gPSBncm91cFsgKGN1cnJlbnQuaW5kZXggKyBpICkgJSBsZW4gXTsKCgkJCQlpZiAoaXRlbS50eXBlID09PSAnaW1hZ2UnICYmIGl0ZW0uaHJlZikgewoJCQkJCW5ldyBJbWFnZSgpLnNyYyA9IGl0ZW0uaHJlZjsKCQkJCX0KCQkJfQoJCX0sCgoJCV9hZnRlckxvYWQ6IGZ1bmN0aW9uICgpIHsKCQkJdmFyIGNvbWluZyAgID0gRi5jb21pbmcsCgkJCQlwcmV2aW91cyA9IEYuY3VycmVudCwKCQkJCXBsYWNlaG9sZGVyID0gJ2ZhbmN5Ym94LXBsYWNlaG9sZGVyJywKCQkJCWN1cnJlbnQsCgkJCQljb250ZW50LAoJCQkJdHlwZSwKCQkJCXNjcm9sbGluZywKCQkJCWhyZWYsCgkJCQllbWJlZDsKCgkJCUYuaGlkZUxvYWRpbmcoKTsKCgkJCWlmICghY29taW5nIHx8IEYuaXNBY3RpdmUgPT09IGZhbHNlKSB7CgkJCQlyZXR1cm47CgkJCX0KCgkJCWlmIChmYWxzZSA9PT0gRi50cmlnZ2VyKCdhZnRlckxvYWQnLCBjb21pbmcsIHByZXZpb3VzKSkgewoJCQkJY29taW5nLndyYXAuc3RvcCh0cnVlKS50cmlnZ2VyKCdvblJlc2V0JykucmVtb3ZlKCk7CgoJCQkJRi5jb21pbmcgPSBudWxsOwoKCQkJCXJldHVybjsKCQkJfQoKCQkJaWYgKHByZXZpb3VzKSB7CgkJCQlGLnRyaWdnZXIoJ2JlZm9yZUNoYW5nZScsIHByZXZpb3VzKTsKCgkJCQlwcmV2aW91cy53cmFwLnN0b3AodHJ1ZSkucmVtb3ZlQ2xhc3MoJ2ZhbmN5Ym94LW9wZW5lZCcpCgkJCQkJLmZpbmQoJy5mYW5jeWJveC1pdGVtLCAuZmFuY3lib3gtbmF2JykKCQkJCQkucmVtb3ZlKCk7CgkJCX0KCgkJCUYudW5iaW5kRXZlbnRzKCk7CgoJCQljdXJyZW50ICAgPSBjb21pbmc7CgkJCWNvbnRlbnQgICA9IGNvbWluZy5jb250ZW50OwoJCQl0eXBlICAgICAgPSBjb21pbmcudHlwZTsKCQkJc2Nyb2xsaW5nID0gY29taW5nLnNjcm9sbGluZzsKCgkJCSQuZXh0ZW5kKEYsIHsKCQkJCXdyYXAgIDogY3VycmVudC53cmFwLAoJCQkJc2tpbiAgOiBjdXJyZW50LnNraW4sCgkJCQlvdXRlciA6IGN1cnJlbnQub3V0ZXIsCgkJCQlpbm5lciA6IGN1cnJlbnQuaW5uZXIsCgkJCQljdXJyZW50ICA6IGN1cnJlbnQsCgkJCQlwcmV2aW91cyA6IHByZXZpb3VzCgkJCX0pOwoKCQkJaHJlZiA9IGN1cnJlbnQuaHJlZjsKCgkJCXN3aXRjaCAodHlwZSkgewoJCQkJY2FzZSAnaW5saW5lJzoKCQkJCWNhc2UgJ2FqYXgnOgoJCQkJY2FzZSAnaHRtbCc6CgkJCQkJaWYgKGN1cnJlbnQuc2VsZWN0b3IpIHsKCQkJCQkJY29udGVudCA9ICQoJzxkaXY+JykuaHRtbChjb250ZW50KS5maW5kKGN1cnJlbnQuc2VsZWN0b3IpOwoKCQkJCQl9IGVsc2UgaWYgKGlzUXVlcnkoY29udGVudCkpIHsKCQkJCQkJaWYgKCFjb250ZW50LmRhdGEocGxhY2Vob2xkZXIpKSB7CgkJCQkJCQljb250ZW50LmRhdGEocGxhY2Vob2xkZXIsICQoJzxkaXYgY2xhc3M9IicgKyBwbGFjZWhvbGRlciArICciPjwvZGl2PicpLmluc2VydEFmdGVyKCBjb250ZW50ICkuaGlkZSgpICk7CgkJCQkJCX0KCgkJCQkJCWNvbnRlbnQgPSBjb250ZW50LnNob3coKS5kZXRhY2goKTsKCgkJCQkJCWN1cnJlbnQud3JhcC5iaW5kKCdvblJlc2V0JywgZnVuY3Rpb24gKCkgewoJCQkJCQkJaWYgKCQodGhpcykuZmluZChjb250ZW50KS5sZW5ndGgpIHsKCQkJCQkJCQljb250ZW50LmhpZGUoKS5yZXBsYWNlQWxsKCBjb250ZW50LmRhdGEocGxhY2Vob2xkZXIpICkuZGF0YShwbGFjZWhvbGRlciwgZmFsc2UpOwoJCQkJCQkJfQoJCQkJCQl9KTsKCQkJCQl9CgkJCQlicmVhazsKCgkJCQljYXNlICdpbWFnZSc6CgkJCQkJY29udGVudCA9IGN1cnJlbnQudHBsLmltYWdlLnJlcGxhY2UoJ3tocmVmfScsIGhyZWYpOwoJCQkJYnJlYWs7CgoJCQkJY2FzZSAnc3dmJzoKCQkJCQljb250ZW50ID0gJzxvYmplY3QgaWQ9ImZhbmN5Ym94LXN3ZiIgY2xhc3NpZD0iY2xzaWQ6RDI3Q0RCNkUtQUU2RC0xMWNmLTk2QjgtNDQ0NTUzNTQwMDAwIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIj48cGFyYW0gbmFtZT0ibW92aWUiIHZhbHVlPSInICsgaHJlZiArICciPjwvcGFyYW0+JzsKCQkJCQllbWJlZCAgID0gJyc7CgoJCQkJCSQuZWFjaChjdXJyZW50LnN3ZiwgZnVuY3Rpb24obmFtZSwgdmFsKSB7CgkJCQkJCWNvbnRlbnQgKz0gJzxwYXJhbSBuYW1lPSInICsgbmFtZSArICciIHZhbHVlPSInICsgdmFsICsgJyI+PC9wYXJhbT4nOwoJCQkJCQllbWJlZCAgICs9ICcgJyArIG5hbWUgKyAnPSInICsgdmFsICsgJyInOwoJCQkJCX0pOwoKCQkJCQljb250ZW50ICs9ICc8ZW1iZWQgc3JjPSInICsgaHJlZiArICciIHR5cGU9ImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIicgKyBlbWJlZCArICc+PC9lbWJlZD48L29iamVjdD4nOwoJCQkJYnJlYWs7CgkJCX0KCgkJCWlmICghKGlzUXVlcnkoY29udGVudCkgJiYgY29udGVudC5wYXJlbnQoKS5pcyhjdXJyZW50LmlubmVyKSkpIHsKCQkJCWN1cnJlbnQuaW5uZXIuYXBwZW5kKCBjb250ZW50ICk7CgkJCX0KCgkJCS8vIEdpdmUgYSBjaGFuY2UgZm9yIGhlbHBlcnMgb3IgY2FsbGJhY2tzIHRvIHVwZGF0ZSBlbGVtZW50cwoJCQlGLnRyaWdnZXIoJ2JlZm9yZVNob3cnKTsKCgkJCS8vIFNldCBzY3JvbGxpbmcgYmVmb3JlIGNhbGN1bGF0aW5nIGRpbWVuc2lvbnMKCQkJY3VycmVudC5pbm5lci5jc3MoJ292ZXJmbG93Jywgc2Nyb2xsaW5nID09PSAneWVzJyA/ICdzY3JvbGwnIDogKHNjcm9sbGluZyA9PT0gJ25vJyA/ICdoaWRkZW4nIDogc2Nyb2xsaW5nKSk7CgoJCQkvLyBTZXQgaW5pdGlhbCBkaW1lbnNpb25zIGFuZCBzdGFydCBwb3NpdGlvbgoJCQlGLl9zZXREaW1lbnNpb24oKTsKCgkJCUYucmVwb3NpdGlvbigpOwoKCQkJRi5pc09wZW4gPSBmYWxzZTsKCQkJRi5jb21pbmcgPSBudWxsOwoKCQkJRi5iaW5kRXZlbnRzKCk7CgoJCQlpZiAoIUYuaXNPcGVuZWQpIHsKCQkJCSQoJy5mYW5jeWJveC13cmFwJykubm90KCBjdXJyZW50LndyYXAgKS5zdG9wKHRydWUpLnRyaWdnZXIoJ29uUmVzZXQnKS5yZW1vdmUoKTsKCgkJCX0gZWxzZSBpZiAocHJldmlvdXMucHJldk1ldGhvZCkgewoJCQkJRi50cmFuc2l0aW9uc1sgcHJldmlvdXMucHJldk1ldGhvZCBdKCk7CgkJCX0KCgkJCUYudHJhbnNpdGlvbnNbIEYuaXNPcGVuZWQgPyBjdXJyZW50Lm5leHRNZXRob2QgOiBjdXJyZW50Lm9wZW5NZXRob2QgXSgpOwoKCQkJRi5fcHJlbG9hZEltYWdlcygpOwoJCX0sCgoJCV9zZXREaW1lbnNpb246IGZ1bmN0aW9uICgpIHsKCQkJdmFyIHZpZXdwb3J0ICAgPSBGLmdldFZpZXdwb3J0KCksCgkJCQlzdGVwcyAgICAgID0gMCwKCQkJCWNhblNocmluayAgPSBmYWxzZSwKCQkJCWNhbkV4cGFuZCAgPSBmYWxzZSwKCQkJCXdyYXAgICAgICAgPSBGLndyYXAsCgkJCQlza2luICAgICAgID0gRi5za2luLAoJCQkJaW5uZXIgICAgICA9IEYuaW5uZXIsCgkJCQljdXJyZW50ICAgID0gRi5jdXJyZW50LAoJCQkJd2lkdGggICAgICA9IGN1cnJlbnQud2lkdGgsCgkJCQloZWlnaHQgICAgID0gY3VycmVudC5oZWlnaHQsCgkJCQltaW5XaWR0aCAgID0gY3VycmVudC5taW5XaWR0aCwKCQkJCW1pbkhlaWdodCAgPSBjdXJyZW50Lm1pbkhlaWdodCwKCQkJCW1heFdpZHRoICAgPSBjdXJyZW50Lm1heFdpZHRoLAoJCQkJbWF4SGVpZ2h0ICA9IGN1cnJlbnQubWF4SGVpZ2h0LAoJCQkJc2Nyb2xsaW5nICA9IGN1cnJlbnQuc2Nyb2xsaW5nLAoJCQkJc2Nyb2xsT3V0ICA9IGN1cnJlbnQuc2Nyb2xsT3V0c2lkZSA/IGN1cnJlbnQuc2Nyb2xsYmFyV2lkdGggOiAwLAoJCQkJbWFyZ2luICAgICA9IGN1cnJlbnQubWFyZ2luLAoJCQkJd01hcmdpbiAgICA9IGdldFNjYWxhcihtYXJnaW5bMV0gKyBtYXJnaW5bM10pLAoJCQkJaE1hcmdpbiAgICA9IGdldFNjYWxhcihtYXJnaW5bMF0gKyBtYXJnaW5bMl0pLAoJCQkJd1BhZGRpbmcsCgkJCQloUGFkZGluZywKCQkJCXdTcGFjZSwKCQkJCWhTcGFjZSwKCQkJCW9yaWdXaWR0aCwKCQkJCW9yaWdIZWlnaHQsCgkJCQlvcmlnTWF4V2lkdGgsCgkJCQlvcmlnTWF4SGVpZ2h0LAoJCQkJcmF0aW8sCgkJCQl3aWR0aF8sCgkJCQloZWlnaHRfLAoJCQkJbWF4V2lkdGhfLAoJCQkJbWF4SGVpZ2h0XywKCQkJCWlmcmFtZSwKCQkJCWJvZHk7CgoJCQkvLyBSZXNldCBkaW1lbnNpb25zIHNvIHdlIGNvdWxkIHJlLWNoZWNrIGFjdHVhbCBzaXplCgkJCXdyYXAuYWRkKHNraW4pLmFkZChpbm5lcikud2lkdGgoJ2F1dG8nKS5oZWlnaHQoJ2F1dG8nKS5yZW1vdmVDbGFzcygnZmFuY3lib3gtdG1wJyk7CgoJCQl3UGFkZGluZyA9IGdldFNjYWxhcihza2luLm91dGVyV2lkdGgodHJ1ZSkgIC0gc2tpbi53aWR0aCgpKTsKCQkJaFBhZGRpbmcgPSBnZXRTY2FsYXIoc2tpbi5vdXRlckhlaWdodCh0cnVlKSAtIHNraW4uaGVpZ2h0KCkpOwoKCQkJLy8gQW55IHNwYWNlIGJldHdlZW4gY29udGVudCBhbmQgdmlld3BvcnQgKG1hcmdpbiwgcGFkZGluZywgYm9yZGVyLCB0aXRsZSkKCQkJd1NwYWNlID0gd01hcmdpbiArIHdQYWRkaW5nOwoJCQloU3BhY2UgPSBoTWFyZ2luICsgaFBhZGRpbmc7CgoJCQlvcmlnV2lkdGggID0gaXNQZXJjZW50YWdlKHdpZHRoKSAgPyAodmlld3BvcnQudyAtIHdTcGFjZSkgKiBnZXRTY2FsYXIod2lkdGgpICAvIDEwMCA6IHdpZHRoOwoJCQlvcmlnSGVpZ2h0ID0gaXNQZXJjZW50YWdlKGhlaWdodCkgPyAodmlld3BvcnQuaCAtIGhTcGFjZSkgKiBnZXRTY2FsYXIoaGVpZ2h0KSAvIDEwMCA6IGhlaWdodDsKCgkJCWlmIChjdXJyZW50LnR5cGUgPT09ICdpZnJhbWUnKSB7CgkJCQlpZnJhbWUgPSBjdXJyZW50LmNvbnRlbnQ7CgoJCQkJaWYgKGN1cnJlbnQuYXV0b0hlaWdodCAmJiBpZnJhbWUuZGF0YSgncmVhZHknKSA9PT0gMSkgewoJCQkJCXRyeSB7CgkJCQkJCWlmIChpZnJhbWVbMF0uY29udGVudFdpbmRvdy5kb2N1bWVudC5sb2NhdGlvbikgewoJCQkJCQkJaW5uZXIud2lkdGgoIG9yaWdXaWR0aCApLmhlaWdodCg5OTk5KTsKCgkJCQkJCQlib2R5ID0gaWZyYW1lLmNvbnRlbnRzKCkuZmluZCgnYm9keScpOwoKCQkJCQkJCWlmIChzY3JvbGxPdXQpIHsKCQkJCQkJCQlib2R5LmNzcygnb3ZlcmZsb3cteCcsICdoaWRkZW4nKTsKCQkJCQkJCX0KCgkJCQkJCQlvcmlnSGVpZ2h0ID0gYm9keS5oZWlnaHQoKTsKCQkJCQkJfQoKCQkJCQl9IGNhdGNoIChlKSB7fQoJCQkJfQoKCQkJfSBlbHNlIGlmIChjdXJyZW50LmF1dG9XaWR0aCB8fCBjdXJyZW50LmF1dG9IZWlnaHQpIHsKCQkJCWlubmVyLmFkZENsYXNzKCAnZmFuY3lib3gtdG1wJyApOwoKCQkJCS8vIFNldCB3aWR0aCBvciBoZWlnaHQgaW4gY2FzZSB3ZSBuZWVkIHRvIGNhbGN1bGF0ZSBvbmx5IG9uZSBkaW1lbnNpb24KCQkJCWlmICghY3VycmVudC5hdXRvV2lkdGgpIHsKCQkJCQlpbm5lci53aWR0aCggb3JpZ1dpZHRoICk7CgkJCQl9CgoJCQkJaWYgKCFjdXJyZW50LmF1dG9IZWlnaHQpIHsKCQkJCQlpbm5lci5oZWlnaHQoIG9yaWdIZWlnaHQgKTsKCQkJCX0KCgkJCQlpZiAoY3VycmVudC5hdXRvV2lkdGgpIHsKCQkJCQlvcmlnV2lkdGggPSBpbm5lci53aWR0aCgpOwoJCQkJfQoKCQkJCWlmIChjdXJyZW50LmF1dG9IZWlnaHQpIHsKCQkJCQlvcmlnSGVpZ2h0ID0gaW5uZXIuaGVpZ2h0KCk7CgkJCQl9CgoJCQkJaW5uZXIucmVtb3ZlQ2xhc3MoICdmYW5jeWJveC10bXAnICk7CgkJCX0KCgkJCXdpZHRoICA9IGdldFNjYWxhciggb3JpZ1dpZHRoICk7CgkJCWhlaWdodCA9IGdldFNjYWxhciggb3JpZ0hlaWdodCApOwoKCQkJcmF0aW8gID0gb3JpZ1dpZHRoIC8gb3JpZ0hlaWdodDsKCgkJCS8vIENhbGN1bGF0aW9ucyBmb3IgdGhlIGNvbnRlbnQKCQkJbWluV2lkdGggID0gZ2V0U2NhbGFyKGlzUGVyY2VudGFnZShtaW5XaWR0aCkgPyBnZXRTY2FsYXIobWluV2lkdGgsICd3JykgLSB3U3BhY2UgOiBtaW5XaWR0aCk7CgkJCW1heFdpZHRoICA9IGdldFNjYWxhcihpc1BlcmNlbnRhZ2UobWF4V2lkdGgpID8gZ2V0U2NhbGFyKG1heFdpZHRoLCAndycpIC0gd1NwYWNlIDogbWF4V2lkdGgpOwoKCQkJbWluSGVpZ2h0ID0gZ2V0U2NhbGFyKGlzUGVyY2VudGFnZShtaW5IZWlnaHQpID8gZ2V0U2NhbGFyKG1pbkhlaWdodCwgJ2gnKSAtIGhTcGFjZSA6IG1pbkhlaWdodCk7CgkJCW1heEhlaWdodCA9IGdldFNjYWxhcihpc1BlcmNlbnRhZ2UobWF4SGVpZ2h0KSA/IGdldFNjYWxhcihtYXhIZWlnaHQsICdoJykgLSBoU3BhY2UgOiBtYXhIZWlnaHQpOwoKCQkJLy8gVGhlc2Ugd2lsbCBiZSB1c2VkIHRvIGRldGVybWluZSBpZiB3cmFwIGNhbiBmaXQgaW4gdGhlIHZpZXdwb3J0CgkJCW9yaWdNYXhXaWR0aCAgPSBtYXhXaWR0aDsKCQkJb3JpZ01heEhlaWdodCA9IG1heEhlaWdodDsKCgkJCWlmIChjdXJyZW50LmZpdFRvVmlldykgewoJCQkJbWF4V2lkdGggID0gTWF0aC5taW4odmlld3BvcnQudyAtIHdTcGFjZSwgbWF4V2lkdGgpOwoJCQkJbWF4SGVpZ2h0ID0gTWF0aC5taW4odmlld3BvcnQuaCAtIGhTcGFjZSwgbWF4SGVpZ2h0KTsKCQkJfQoKCQkJbWF4V2lkdGhfICA9IHZpZXdwb3J0LncgLSB3TWFyZ2luOwoJCQltYXhIZWlnaHRfID0gdmlld3BvcnQuaCAtIGhNYXJnaW47CgoJCQlpZiAoY3VycmVudC5hc3BlY3RSYXRpbykgewoJCQkJaWYgKHdpZHRoID4gbWF4V2lkdGgpIHsKCQkJCQl3aWR0aCAgPSBtYXhXaWR0aDsKCQkJCQloZWlnaHQgPSBnZXRTY2FsYXIod2lkdGggLyByYXRpbyk7CgkJCQl9CgoJCQkJaWYgKGhlaWdodCA+IG1heEhlaWdodCkgewoJCQkJCWhlaWdodCA9IG1heEhlaWdodDsKCQkJCQl3aWR0aCAgPSBnZXRTY2FsYXIoaGVpZ2h0ICogcmF0aW8pOwoJCQkJfQoKCQkJCWlmICh3aWR0aCA8IG1pbldpZHRoKSB7CgkJCQkJd2lkdGggID0gbWluV2lkdGg7CgkJCQkJaGVpZ2h0ID0gZ2V0U2NhbGFyKHdpZHRoIC8gcmF0aW8pOwoJCQkJfQoKCQkJCWlmIChoZWlnaHQgPCBtaW5IZWlnaHQpIHsKCQkJCQloZWlnaHQgPSBtaW5IZWlnaHQ7CgkJCQkJd2lkdGggID0gZ2V0U2NhbGFyKGhlaWdodCAqIHJhdGlvKTsKCQkJCX0KCgkJCX0gZWxzZSB7CgkJCQl3aWR0aCA9IE1hdGgubWF4KG1pbldpZHRoLCBNYXRoLm1pbih3aWR0aCwgbWF4V2lkdGgpKTsKCgkJCQlpZiAoY3VycmVudC5hdXRvSGVpZ2h0ICYmIGN1cnJlbnQudHlwZSAhPT0gJ2lmcmFtZScpIHsKCQkJCQlpbm5lci53aWR0aCggd2lkdGggKTsKCgkJCQkJaGVpZ2h0ID0gaW5uZXIuaGVpZ2h0KCk7CgkJCQl9CgoJCQkJaGVpZ2h0ID0gTWF0aC5tYXgobWluSGVpZ2h0LCBNYXRoLm1pbihoZWlnaHQsIG1heEhlaWdodCkpOwoJCQl9CgoJCQkvLyBUcnkgdG8gZml0IGluc2lkZSB2aWV3cG9ydCAoaW5jbHVkaW5nIHRoZSB0aXRsZSkKCQkJaWYgKGN1cnJlbnQuZml0VG9WaWV3KSB7CgkJCQlpbm5lci53aWR0aCggd2lkdGggKS5oZWlnaHQoIGhlaWdodCApOwoKCQkJCXdyYXAud2lkdGgoIHdpZHRoICsgd1BhZGRpbmcgKTsKCgkJCQkvLyBSZWFsIHdyYXAgZGltZW5zaW9ucwoJCQkJd2lkdGhfICA9IHdyYXAud2lkdGgoKTsKCQkJCWhlaWdodF8gPSB3cmFwLmhlaWdodCgpOwoKCQkJCWlmIChjdXJyZW50LmFzcGVjdFJhdGlvKSB7CgkJCQkJd2hpbGUgKCh3aWR0aF8gPiBtYXhXaWR0aF8gfHwgaGVpZ2h0XyA+IG1heEhlaWdodF8pICYmIHdpZHRoID4gbWluV2lkdGggJiYgaGVpZ2h0ID4gbWluSGVpZ2h0KSB7CgkJCQkJCWlmIChzdGVwcysrID4gMTkpIHsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgoJCQkJCQloZWlnaHQgPSBNYXRoLm1heChtaW5IZWlnaHQsIE1hdGgubWluKG1heEhlaWdodCwgaGVpZ2h0IC0gMTApKTsKCQkJCQkJd2lkdGggID0gZ2V0U2NhbGFyKGhlaWdodCAqIHJhdGlvKTsKCgkJCQkJCWlmICh3aWR0aCA8IG1pbldpZHRoKSB7CgkJCQkJCQl3aWR0aCAgPSBtaW5XaWR0aDsKCQkJCQkJCWhlaWdodCA9IGdldFNjYWxhcih3aWR0aCAvIHJhdGlvKTsKCQkJCQkJfQoKCQkJCQkJaWYgKHdpZHRoID4gbWF4V2lkdGgpIHsKCQkJCQkJCXdpZHRoICA9IG1heFdpZHRoOwoJCQkJCQkJaGVpZ2h0ID0gZ2V0U2NhbGFyKHdpZHRoIC8gcmF0aW8pOwoJCQkJCQl9CgoJCQkJCQlpbm5lci53aWR0aCggd2lkdGggKS5oZWlnaHQoIGhlaWdodCApOwoKCQkJCQkJd3JhcC53aWR0aCggd2lkdGggKyB3UGFkZGluZyApOwoKCQkJCQkJd2lkdGhfICA9IHdyYXAud2lkdGgoKTsKCQkJCQkJaGVpZ2h0XyA9IHdyYXAuaGVpZ2h0KCk7CgkJCQkJfQoKCQkJCX0gZWxzZSB7CgkJCQkJd2lkdGggID0gTWF0aC5tYXgobWluV2lkdGgsICBNYXRoLm1pbih3aWR0aCwgIHdpZHRoICAtICh3aWR0aF8gIC0gbWF4V2lkdGhfKSkpOwoJCQkJCWhlaWdodCA9IE1hdGgubWF4KG1pbkhlaWdodCwgTWF0aC5taW4oaGVpZ2h0LCBoZWlnaHQgLSAoaGVpZ2h0XyAtIG1heEhlaWdodF8pKSk7CgkJCQl9CgkJCX0KCgkJCWlmIChzY3JvbGxPdXQgJiYgc2Nyb2xsaW5nID09PSAnYXV0bycgJiYgaGVpZ2h0IDwgb3JpZ0hlaWdodCAmJiAod2lkdGggKyB3UGFkZGluZyArIHNjcm9sbE91dCkgPCBtYXhXaWR0aF8pIHsKCQkJCXdpZHRoICs9IHNjcm9sbE91dDsKCQkJfQoKCQkJaW5uZXIud2lkdGgoIHdpZHRoICkuaGVpZ2h0KCBoZWlnaHQgKTsKCgkJCXdyYXAud2lkdGgoIHdpZHRoICsgd1BhZGRpbmcgKTsKCgkJCXdpZHRoXyAgPSB3cmFwLndpZHRoKCk7CgkJCWhlaWdodF8gPSB3cmFwLmhlaWdodCgpOwoKCQkJY2FuU2hyaW5rID0gKHdpZHRoXyA+IG1heFdpZHRoXyB8fCBoZWlnaHRfID4gbWF4SGVpZ2h0XykgJiYgd2lkdGggPiBtaW5XaWR0aCAmJiBoZWlnaHQgPiBtaW5IZWlnaHQ7CgkJCWNhbkV4cGFuZCA9IGN1cnJlbnQuYXNwZWN0UmF0aW8gPyAod2lkdGggPCBvcmlnTWF4V2lkdGggJiYgaGVpZ2h0IDwgb3JpZ01heEhlaWdodCAmJiB3aWR0aCA8IG9yaWdXaWR0aCAmJiBoZWlnaHQgPCBvcmlnSGVpZ2h0KSA6ICgod2lkdGggPCBvcmlnTWF4V2lkdGggfHwgaGVpZ2h0IDwgb3JpZ01heEhlaWdodCkgJiYgKHdpZHRoIDwgb3JpZ1dpZHRoIHx8IGhlaWdodCA8IG9yaWdIZWlnaHQpKTsKCgkJCSQuZXh0ZW5kKGN1cnJlbnQsIHsKCQkJCWRpbSA6IHsKCQkJCQl3aWR0aAk6IGdldFZhbHVlKCB3aWR0aF8gKSwKCQkJCQloZWlnaHQJOiBnZXRWYWx1ZSggaGVpZ2h0XyApCgkJCQl9LAoJCQkJb3JpZ1dpZHRoICA6IG9yaWdXaWR0aCwKCQkJCW9yaWdIZWlnaHQgOiBvcmlnSGVpZ2h0LAoJCQkJY2FuU2hyaW5rICA6IGNhblNocmluaywKCQkJCWNhbkV4cGFuZCAgOiBjYW5FeHBhbmQsCgkJCQl3UGFkZGluZyAgIDogd1BhZGRpbmcsCgkJCQloUGFkZGluZyAgIDogaFBhZGRpbmcsCgkJCQl3cmFwU3BhY2UgIDogaGVpZ2h0XyAtIHNraW4ub3V0ZXJIZWlnaHQodHJ1ZSksCgkJCQlza2luU3BhY2UgIDogc2tpbi5oZWlnaHQoKSAtIGhlaWdodAoJCQl9KTsKCgkJCWlmICghaWZyYW1lICYmIGN1cnJlbnQuYXV0b0hlaWdodCAmJiBoZWlnaHQgPiBtaW5IZWlnaHQgJiYgaGVpZ2h0IDwgbWF4SGVpZ2h0ICYmICFjYW5FeHBhbmQpIHsKCQkJCWlubmVyLmhlaWdodCgnYXV0bycpOwoJCQl9CgkJfSwKCgkJX2dldFBvc2l0aW9uOiBmdW5jdGlvbiAob25seUFic29sdXRlKSB7CgkJCXZhciBjdXJyZW50ICA9IEYuY3VycmVudCwKCQkJCXZpZXdwb3J0ID0gRi5nZXRWaWV3cG9ydCgpLAoJCQkJbWFyZ2luICAgPSBjdXJyZW50Lm1hcmdpbiwKCQkJCXdpZHRoICAgID0gRi53cmFwLndpZHRoKCkgICsgbWFyZ2luWzFdICsgbWFyZ2luWzNdLAoJCQkJaGVpZ2h0ICAgPSBGLndyYXAuaGVpZ2h0KCkgKyBtYXJnaW5bMF0gKyBtYXJnaW5bMl0sCgkJCQlyZXogICAgICA9IHsKCQkJCQlwb3NpdGlvbjogJ2Fic29sdXRlJywKCQkJCQl0b3AgIDogbWFyZ2luWzBdLAoJCQkJCWxlZnQgOiBtYXJnaW5bM10KCQkJCX07CgoJCQlpZiAoY3VycmVudC5hdXRvQ2VudGVyICYmIGN1cnJlbnQuZml4ZWQgJiYgIW9ubHlBYnNvbHV0ZSAmJiBoZWlnaHQgPD0gdmlld3BvcnQuaCAmJiB3aWR0aCA8PSB2aWV3cG9ydC53KSB7CgkJCQlyZXoucG9zaXRpb24gPSAnZml4ZWQnOwoKCQkJfSBlbHNlIGlmICghY3VycmVudC5sb2NrZWQpIHsKCQkJCXJlei50b3AgICs9IHZpZXdwb3J0Lnk7CgkJCQlyZXoubGVmdCArPSB2aWV3cG9ydC54OwoJCQl9CgoJCQlyZXoudG9wICA9IGdldFZhbHVlKE1hdGgubWF4KHJlei50b3AsICByZXoudG9wICArICgodmlld3BvcnQuaCAtIGhlaWdodCkgKiBjdXJyZW50LnRvcFJhdGlvKSkpOwoJCQlyZXoubGVmdCA9IGdldFZhbHVlKE1hdGgubWF4KHJlei5sZWZ0LCByZXoubGVmdCArICgodmlld3BvcnQudyAtIHdpZHRoKSAgKiBjdXJyZW50LmxlZnRSYXRpbykpKTsKCgkJCXJldHVybiByZXo7CgkJfSwKCgkJX2FmdGVyWm9vbUluOiBmdW5jdGlvbiAoKSB7CgkJCXZhciBjdXJyZW50ID0gRi5jdXJyZW50OwoKCQkJaWYgKCFjdXJyZW50KSB7CgkJCQlyZXR1cm47CgkJCX0KCgkJCUYuaXNPcGVuID0gRi5pc09wZW5lZCA9IHRydWU7CgoJCQlGLndyYXAuY3NzKCdvdmVyZmxvdycsICd2aXNpYmxlJykuYWRkQ2xhc3MoJ2ZhbmN5Ym94LW9wZW5lZCcpOwoKCQkJRi51cGRhdGUoKTsKCgkJCS8vIEFzc2lnbiBhIGNsaWNrIGV2ZW50CgkJCWlmICggY3VycmVudC5jbG9zZUNsaWNrIHx8IChjdXJyZW50Lm5leHRDbGljayAmJiBGLmdyb3VwLmxlbmd0aCA+IDEpICkgewoJCQkJRi5pbm5lci5jc3MoJ2N1cnNvcicsICdwb2ludGVyJykuYmluZCgnY2xpY2suZmInLCBmdW5jdGlvbihlKSB7CgkJCQkJaWYgKCEkKGUudGFyZ2V0KS5pcygnYScpICYmICEkKGUudGFyZ2V0KS5wYXJlbnQoKS5pcygnYScpKSB7CgkJCQkJCWUucHJldmVudERlZmF1bHQoKTsKCgkJCQkJCUZbIGN1cnJlbnQuY2xvc2VDbGljayA/ICdjbG9zZScgOiAnbmV4dCcgXSgpOwoJCQkJCX0KCQkJCX0pOwoJCQl9CgoJCQkvLyBDcmVhdGUgYSBjbG9zZSBidXR0b24KCQkJaWYgKGN1cnJlbnQuY2xvc2VCdG4pIHsKCQkJCSQoY3VycmVudC50cGwuY2xvc2VCdG4pLmFwcGVuZFRvKEYuc2tpbikuYmluZCggaXNUb3VjaCA/ICd0b3VjaHN0YXJ0LmZiJyA6ICdjbGljay5mYicsIGZ1bmN0aW9uKGUpIHsKCQkJCQllLnByZXZlbnREZWZhdWx0KCk7CgoJCQkJCUYuY2xvc2UoKTsKCQkJCX0pOwoJCQl9CgoJCQkvLyBDcmVhdGUgbmF2aWdhdGlvbiBhcnJvd3MKCQkJaWYgKGN1cnJlbnQuYXJyb3dzICYmIEYuZ3JvdXAubGVuZ3RoID4gMSkgewoJCQkJaWYgKGN1cnJlbnQubG9vcCB8fCBjdXJyZW50LmluZGV4ID4gMCkgewoJCQkJCSQoY3VycmVudC50cGwucHJldikuYXBwZW5kVG8oRi5vdXRlcikuYmluZCgnY2xpY2suZmInLCBGLnByZXYpOwoJCQkJfQoKCQkJCWlmIChjdXJyZW50Lmxvb3AgfHwgY3VycmVudC5pbmRleCA8IEYuZ3JvdXAubGVuZ3RoIC0gMSkgewoJCQkJCSQoY3VycmVudC50cGwubmV4dCkuYXBwZW5kVG8oRi5vdXRlcikuYmluZCgnY2xpY2suZmInLCBGLm5leHQpOwoJCQkJfQoJCQl9CgoJCQlGLnRyaWdnZXIoJ2FmdGVyU2hvdycpOwoKCQkJLy8gU3RvcCB0aGUgc2xpZGVzaG93IGlmIHRoaXMgaXMgdGhlIGxhc3QgaXRlbQoJCQlpZiAoIWN1cnJlbnQubG9vcCAmJiBjdXJyZW50LmluZGV4ID09PSBjdXJyZW50Lmdyb3VwLmxlbmd0aCAtIDEpIHsKCQkJCUYucGxheSggZmFsc2UgKTsKCgkJCX0gZWxzZSBpZiAoRi5vcHRzLmF1dG9QbGF5ICYmICFGLnBsYXllci5pc0FjdGl2ZSkgewoJCQkJRi5vcHRzLmF1dG9QbGF5ID0gZmFsc2U7CgoJCQkJRi5wbGF5KCk7CgkJCX0KCQl9LAoKCQlfYWZ0ZXJab29tT3V0OiBmdW5jdGlvbiAoIG9iaiApIHsKCQkJb2JqID0gb2JqIHx8IEYuY3VycmVudDsKCgkJCSQoJy5mYW5jeWJveC13cmFwJykudHJpZ2dlcignb25SZXNldCcpLnJlbW92ZSgpOwoKCQkJJC5leHRlbmQoRiwgewoJCQkJZ3JvdXAgIDoge30sCgkJCQlvcHRzICAgOiB7fSwKCQkJCXJvdXRlciA6IGZhbHNlLAoJCQkJY3VycmVudCAgIDogbnVsbCwKCQkJCWlzQWN0aXZlICA6IGZhbHNlLAoJCQkJaXNPcGVuZWQgIDogZmFsc2UsCgkJCQlpc09wZW4gICAgOiBmYWxzZSwKCQkJCWlzQ2xvc2luZyA6IGZhbHNlLAoJCQkJd3JhcCAgIDogbnVsbCwKCQkJCXNraW4gICA6IG51bGwsCgkJCQlvdXRlciAgOiBudWxsLAoJCQkJaW5uZXIgIDogbnVsbAoJCQl9KTsKCgkJCUYudHJpZ2dlcignYWZ0ZXJDbG9zZScsIG9iaik7CgkJfQoJfSk7CgoJLyoKCSAqCURlZmF1bHQgdHJhbnNpdGlvbnMKCSAqLwoKCUYudHJhbnNpdGlvbnMgPSB7CgkJZ2V0T3JpZ1Bvc2l0aW9uOiBmdW5jdGlvbiAoKSB7CgkJCXZhciBjdXJyZW50ICA9IEYuY3VycmVudCwKCQkJCWVsZW1lbnQgID0gY3VycmVudC5lbGVtZW50LAoJCQkJb3JpZyAgICAgPSBjdXJyZW50Lm9yaWcsCgkJCQlwb3MgICAgICA9IHt9LAoJCQkJd2lkdGggICAgPSA1MCwKCQkJCWhlaWdodCAgID0gNTAsCgkJCQloUGFkZGluZyA9IGN1cnJlbnQuaFBhZGRpbmcsCgkJCQl3UGFkZGluZyA9IGN1cnJlbnQud1BhZGRpbmcsCgkJCQl2aWV3cG9ydCA9IEYuZ2V0Vmlld3BvcnQoKTsKCgkJCWlmICghb3JpZyAmJiBjdXJyZW50LmlzRG9tICYmIGVsZW1lbnQuaXMoJzp2aXNpYmxlJykpIHsKCQkJCW9yaWcgPSBlbGVtZW50LmZpbmQoJ2ltZzpmaXJzdCcpOwoKCQkJCWlmICghb3JpZy5sZW5ndGgpIHsKCQkJCQlvcmlnID0gZWxlbWVudDsKCQkJCX0KCQkJfQoKCQkJaWYgKGlzUXVlcnkob3JpZykpIHsKCQkJCXBvcyA9IG9yaWcub2Zmc2V0KCk7CgoJCQkJaWYgKG9yaWcuaXMoJ2ltZycpKSB7CgkJCQkJd2lkdGggID0gb3JpZy5vdXRlcldpZHRoKCk7CgkJCQkJaGVpZ2h0ID0gb3JpZy5vdXRlckhlaWdodCgpOwoJCQkJfQoKCQkJfSBlbHNlIHsKCQkJCXBvcy50b3AgID0gdmlld3BvcnQueSArICh2aWV3cG9ydC5oIC0gaGVpZ2h0KSAqIGN1cnJlbnQudG9wUmF0aW87CgkJCQlwb3MubGVmdCA9IHZpZXdwb3J0LnggKyAodmlld3BvcnQudyAtIHdpZHRoKSAgKiBjdXJyZW50LmxlZnRSYXRpbzsKCQkJfQoKCQkJaWYgKEYud3JhcC5jc3MoJ3Bvc2l0aW9uJykgPT09ICdmaXhlZCcgfHwgY3VycmVudC5sb2NrZWQpIHsKCQkJCXBvcy50b3AgIC09IHZpZXdwb3J0Lnk7CgkJCQlwb3MubGVmdCAtPSB2aWV3cG9ydC54OwoJCQl9CgoJCQlwb3MgPSB7CgkJCQl0b3AgICAgIDogZ2V0VmFsdWUocG9zLnRvcCAgLSBoUGFkZGluZyAqIGN1cnJlbnQudG9wUmF0aW8pLAoJCQkJbGVmdCAgICA6IGdldFZhbHVlKHBvcy5sZWZ0IC0gd1BhZGRpbmcgKiBjdXJyZW50LmxlZnRSYXRpbyksCgkJCQl3aWR0aCAgIDogZ2V0VmFsdWUod2lkdGggICsgd1BhZGRpbmcpLAoJCQkJaGVpZ2h0ICA6IGdldFZhbHVlKGhlaWdodCArIGhQYWRkaW5nKQoJCQl9OwoKCQkJcmV0dXJuIHBvczsKCQl9LAoKCQlzdGVwOiBmdW5jdGlvbiAobm93LCBmeCkgewoJCQl2YXIgcmF0aW8sCgkJCQlwYWRkaW5nLAoJCQkJdmFsdWUsCgkJCQlwcm9wICAgICAgID0gZngucHJvcCwKCQkJCWN1cnJlbnQgICAgPSBGLmN1cnJlbnQsCgkJCQl3cmFwU3BhY2UgID0gY3VycmVudC53cmFwU3BhY2UsCgkJCQlza2luU3BhY2UgID0gY3VycmVudC5za2luU3BhY2U7CgoJCQlpZiAocHJvcCA9PT0gJ3dpZHRoJyB8fCBwcm9wID09PSAnaGVpZ2h0JykgewoJCQkJcmF0aW8gPSBmeC5lbmQgPT09IGZ4LnN0YXJ0ID8gMSA6IChub3cgLSBmeC5zdGFydCkgLyAoZnguZW5kIC0gZnguc3RhcnQpOwoKCQkJCWlmIChGLmlzQ2xvc2luZykgewoJCQkJCXJhdGlvID0gMSAtIHJhdGlvOwoJCQkJfQoKCQkJCXBhZGRpbmcgPSBwcm9wID09PSAnd2lkdGgnID8gY3VycmVudC53UGFkZGluZyA6IGN1cnJlbnQuaFBhZGRpbmc7CgkJCQl2YWx1ZSAgID0gbm93IC0gcGFkZGluZzsKCgkJCQlGLnNraW5bIHByb3AgXSggIGdldFNjYWxhciggcHJvcCA9PT0gJ3dpZHRoJyA/ICB2YWx1ZSA6IHZhbHVlIC0gKHdyYXBTcGFjZSAqIHJhdGlvKSApICk7CgkJCQlGLmlubmVyWyBwcm9wIF0oIGdldFNjYWxhciggcHJvcCA9PT0gJ3dpZHRoJyA/ICB2YWx1ZSA6IHZhbHVlIC0gKHdyYXBTcGFjZSAqIHJhdGlvKSAtIChza2luU3BhY2UgKiByYXRpbykgKSApOwoJCQl9CgkJfSwKCgkJem9vbUluOiBmdW5jdGlvbiAoKSB7CgkJCXZhciBjdXJyZW50ICA9IEYuY3VycmVudCwKCQkJCXN0YXJ0UG9zID0gY3VycmVudC5wb3MsCgkJCQllZmZlY3QgICA9IGN1cnJlbnQub3BlbkVmZmVjdCwKCQkJCWVsYXN0aWMgID0gZWZmZWN0ID09PSAnZWxhc3RpYycsCgkJCQllbmRQb3MgICA9ICQuZXh0ZW5kKHtvcGFjaXR5IDogMX0sIHN0YXJ0UG9zKTsKCgkJCS8vIFJlbW92ZSAicG9zaXRpb24iIHByb3BlcnR5IHRoYXQgYnJlYWtzIG9sZGVyIElFCgkJCWRlbGV0ZSBlbmRQb3MucG9zaXRpb247CgoJCQlpZiAoZWxhc3RpYykgewoJCQkJc3RhcnRQb3MgPSB0aGlzLmdldE9yaWdQb3NpdGlvbigpOwoKCQkJCWlmIChjdXJyZW50Lm9wZW5PcGFjaXR5KSB7CgkJCQkJc3RhcnRQb3Mub3BhY2l0eSA9IDAuMTsKCQkJCX0KCgkJCX0gZWxzZSBpZiAoZWZmZWN0ID09PSAnZmFkZScpIHsKCQkJCXN0YXJ0UG9zLm9wYWNpdHkgPSAwLjE7CgkJCX0KCgkJCUYud3JhcC5jc3Moc3RhcnRQb3MpLmFuaW1hdGUoZW5kUG9zLCB7CgkJCQlkdXJhdGlvbiA6IGVmZmVjdCA9PT0gJ25vbmUnID8gMCA6IGN1cnJlbnQub3BlblNwZWVkLAoJCQkJZWFzaW5nICAgOiBjdXJyZW50Lm9wZW5FYXNpbmcsCgkJCQlzdGVwICAgICA6IGVsYXN0aWMgPyB0aGlzLnN0ZXAgOiBudWxsLAoJCQkJY29tcGxldGUgOiBGLl9hZnRlclpvb21JbgoJCQl9KTsKCQl9LAoKCQl6b29tT3V0OiBmdW5jdGlvbiAoKSB7CgkJCXZhciBjdXJyZW50ICA9IEYuY3VycmVudCwKCQkJCWVmZmVjdCAgID0gY3VycmVudC5jbG9zZUVmZmVjdCwKCQkJCWVsYXN0aWMgID0gZWZmZWN0ID09PSAnZWxhc3RpYycsCgkJCQllbmRQb3MgICA9IHtvcGFjaXR5IDogMC4xfTsKCgkJCWlmIChlbGFzdGljKSB7CgkJCQllbmRQb3MgPSB0aGlzLmdldE9yaWdQb3NpdGlvbigpOwoKCQkJCWlmIChjdXJyZW50LmNsb3NlT3BhY2l0eSkgewoJCQkJCWVuZFBvcy5vcGFjaXR5ID0gMC4xOwoJCQkJfQoJCQl9CgoJCQlGLndyYXAuYW5pbWF0ZShlbmRQb3MsIHsKCQkJCWR1cmF0aW9uIDogZWZmZWN0ID09PSAnbm9uZScgPyAwIDogY3VycmVudC5jbG9zZVNwZWVkLAoJCQkJZWFzaW5nICAgOiBjdXJyZW50LmNsb3NlRWFzaW5nLAoJCQkJc3RlcCAgICAgOiBlbGFzdGljID8gdGhpcy5zdGVwIDogbnVsbCwKCQkJCWNvbXBsZXRlIDogRi5fYWZ0ZXJab29tT3V0CgkJCX0pOwoJCX0sCgoJCWNoYW5nZUluOiBmdW5jdGlvbiAoKSB7CgkJCXZhciBjdXJyZW50ICAgPSBGLmN1cnJlbnQsCgkJCQllZmZlY3QgICAgPSBjdXJyZW50Lm5leHRFZmZlY3QsCgkJCQlzdGFydFBvcyAgPSBjdXJyZW50LnBvcywKCQkJCWVuZFBvcyAgICA9IHsgb3BhY2l0eSA6IDEgfSwKCQkJCWRpcmVjdGlvbiA9IEYuZGlyZWN0aW9uLAoJCQkJZGlzdGFuY2UgID0gMjAwLAoJCQkJZmllbGQ7CgoJCQlzdGFydFBvcy5vcGFjaXR5ID0gMC4xOwoKCQkJaWYgKGVmZmVjdCA9PT0gJ2VsYXN0aWMnKSB7CgkJCQlmaWVsZCA9IGRpcmVjdGlvbiA9PT0gJ2Rvd24nIHx8IGRpcmVjdGlvbiA9PT0gJ3VwJyA/ICd0b3AnIDogJ2xlZnQnOwoKCQkJCWlmIChkaXJlY3Rpb24gPT09ICdkb3duJyB8fCBkaXJlY3Rpb24gPT09ICdyaWdodCcpIHsKCQkJCQlzdGFydFBvc1sgZmllbGQgXSA9IGdldFZhbHVlKGdldFNjYWxhcihzdGFydFBvc1sgZmllbGQgXSkgLSBkaXN0YW5jZSk7CgkJCQkJZW5kUG9zWyBmaWVsZCBdICAgPSAnKz0nICsgZGlzdGFuY2UgKyAncHgnOwoKCQkJCX0gZWxzZSB7CgkJCQkJc3RhcnRQb3NbIGZpZWxkIF0gPSBnZXRWYWx1ZShnZXRTY2FsYXIoc3RhcnRQb3NbIGZpZWxkIF0pICsgZGlzdGFuY2UpOwoJCQkJCWVuZFBvc1sgZmllbGQgXSAgID0gJy09JyArIGRpc3RhbmNlICsgJ3B4JzsKCQkJCX0KCQkJfQoKCQkJLy8gV29ya2Fyb3VuZCBmb3IgaHR0cDovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvMTIyNzMKCQkJaWYgKGVmZmVjdCA9PT0gJ25vbmUnKSB7CgkJCQlGLl9hZnRlclpvb21JbigpOwoKCQkJfSBlbHNlIHsKCQkJCUYud3JhcC5jc3Moc3RhcnRQb3MpLmFuaW1hdGUoZW5kUG9zLCB7CgkJCQkJZHVyYXRpb24gOiBjdXJyZW50Lm5leHRTcGVlZCwKCQkJCQllYXNpbmcgICA6IGN1cnJlbnQubmV4dEVhc2luZywKCQkJCQljb21wbGV0ZSA6IGZ1bmN0aW9uKCkgewoJCQkJCQkvLyBUaGlzIGhlbHBzIEZpcmVGb3ggdG8gcHJvcGVybHkgcmVuZGVyIHRoZSBib3gKCQkJCQkJc2V0VGltZW91dChGLl9hZnRlclpvb21JbiwgMjApOwoJCQkJCX0KCQkJCX0pOwoJCQl9CgkJfSwKCgkJY2hhbmdlT3V0OiBmdW5jdGlvbiAoKSB7CgkJCXZhciBwcmV2aW91cyAgPSBGLnByZXZpb3VzLAoJCQkJZWZmZWN0ICAgID0gcHJldmlvdXMucHJldkVmZmVjdCwKCQkJCWVuZFBvcyAgICA9IHsgb3BhY2l0eSA6IDAuMSB9LAoJCQkJZGlyZWN0aW9uID0gRi5kaXJlY3Rpb24sCgkJCQlkaXN0YW5jZSAgPSAyMDA7CgoJCQlpZiAoZWZmZWN0ID09PSAnZWxhc3RpYycpIHsKCQkJCWVuZFBvc1sgZGlyZWN0aW9uID09PSAnZG93bicgfHwgZGlyZWN0aW9uID09PSAndXAnID8gJ3RvcCcgOiAnbGVmdCcgXSA9ICggZGlyZWN0aW9uID09PSAndXAnIHx8IGRpcmVjdGlvbiA9PT0gJ2xlZnQnID8gJy0nIDogJysnICkgKyAnPScgKyBkaXN0YW5jZSArICdweCc7CgkJCX0KCgkJCXByZXZpb3VzLndyYXAuYW5pbWF0ZShlbmRQb3MsIHsKCQkJCWR1cmF0aW9uIDogZWZmZWN0ID09PSAnbm9uZScgPyAwIDogcHJldmlvdXMucHJldlNwZWVkLAoJCQkJZWFzaW5nICAgOiBwcmV2aW91cy5wcmV2RWFzaW5nLAoJCQkJY29tcGxldGUgOiBmdW5jdGlvbiAoKSB7CgkJCQkJJCh0aGlzKS50cmlnZ2VyKCdvblJlc2V0JykucmVtb3ZlKCk7CgkJCQl9CgkJCX0pOwoJCX0KCX07CgoJLyoKCSAqCU92ZXJsYXkgaGVscGVyCgkgKi8KCglGLmhlbHBlcnMub3ZlcmxheSA9IHsKCQlkZWZhdWx0cyA6IHsKCQkJY2xvc2VDbGljayA6IHRydWUsICAvLyBpZiB0cnVlLCBmYW5jeUJveCB3aWxsIGJlIGNsb3NlZCB3aGVuIHVzZXIgY2xpY2tzIG9uIHRoZSBvdmVybGF5CgkJCXNwZWVkT3V0ICAgOiAyMDAsICAgLy8gZHVyYXRpb24gb2YgZmFkZU91dCBhbmltYXRpb24KCQkJc2hvd0Vhcmx5ICA6IHRydWUsICAvLyBpbmRpY2F0ZXMgaWYgc2hvdWxkIGJlIG9wZW5lZCBpbW1lZGlhdGVseSBvciB3YWl0IHVudGlsIHRoZSBjb250ZW50IGlzIHJlYWR5CgkJCWNzcyAgICAgICAgOiB7fSwgICAgLy8gY3VzdG9tIENTUyBwcm9wZXJ0aWVzCgkJCWxvY2tlZCAgICAgOiAhaXNUb3VjaCwgIC8vIGlmIHRydWUsIHRoZSBjb250ZW50IHdpbGwgYmUgbG9ja2VkIGludG8gb3ZlcmxheQoJCQlmaXhlZCAgICAgIDogdHJ1ZSAgIC8vIGlmIGZhbHNlLCB0aGUgb3ZlcmxheSBDU1MgcG9zaXRpb24gcHJvcGVydHkgd2lsbCBub3QgYmUgc2V0IHRvICJmaXhlZCIKCQl9LAoKCQlvdmVybGF5IDogbnVsbCwgICAvLyBjdXJyZW50IGhhbmRsZQoJCWZpeGVkICAgOiBmYWxzZSwgIC8vIGluZGljYXRlcyBpZiB0aGUgb3ZlcmxheSBoYXMgcG9zaXRpb24gImZpeGVkIgoKCQkvLyBQdWJsaWMgbWV0aG9kcwoJCWNyZWF0ZSA6IGZ1bmN0aW9uKG9wdHMpIHsKCQkJb3B0cyA9ICQuZXh0ZW5kKHt9LCB0aGlzLmRlZmF1bHRzLCBvcHRzKTsKCgkJCWlmICh0aGlzLm92ZXJsYXkpIHsKCQkJCXRoaXMuY2xvc2UoKTsKCQkJfQoKCQkJdGhpcy5vdmVybGF5ID0gJCgnPGRpdiBjbGFzcz0iZmFuY3lib3gtb3ZlcmxheSI+PC9kaXY+JykuYXBwZW5kVG8oICdib2R5JyApOwoJCQl0aGlzLmZpeGVkICAgPSBmYWxzZTsKCgkJCWlmIChvcHRzLmZpeGVkICYmIEYuZGVmYXVsdHMuZml4ZWQpIHsKCQkJCXRoaXMub3ZlcmxheS5hZGRDbGFzcygnZmFuY3lib3gtb3ZlcmxheS1maXhlZCcpOwoKCQkJCXRoaXMuZml4ZWQgPSB0cnVlOwoJCQl9CgkJfSwKCgkJb3BlbiA6IGZ1bmN0aW9uKG9wdHMpIHsKCQkJdmFyIHRoYXQgPSB0aGlzOwoKCQkJb3B0cyA9ICQuZXh0ZW5kKHt9LCB0aGlzLmRlZmF1bHRzLCBvcHRzKTsKCgkJCWlmICh0aGlzLm92ZXJsYXkpIHsKCQkJCXRoaXMub3ZlcmxheS51bmJpbmQoJy5vdmVybGF5Jykud2lkdGgoJ2F1dG8nKS5oZWlnaHQoJ2F1dG8nKTsKCgkJCX0gZWxzZSB7CgkJCQl0aGlzLmNyZWF0ZShvcHRzKTsKCQkJfQoKCQkJaWYgKCF0aGlzLmZpeGVkKSB7CgkJCQlXLmJpbmQoJ3Jlc2l6ZS5vdmVybGF5JywgJC5wcm94eSggdGhpcy51cGRhdGUsIHRoaXMpICk7CgoJCQkJdGhpcy51cGRhdGUoKTsKCQkJfQoKCQkJaWYgKG9wdHMuY2xvc2VDbGljaykgewoJCQkJdGhpcy5vdmVybGF5LmJpbmQoJ2NsaWNrLm92ZXJsYXknLCBmdW5jdGlvbihlKSB7CgkJCQkJaWYgKCQoZS50YXJnZXQpLmhhc0NsYXNzKCdmYW5jeWJveC1vdmVybGF5JykpIHsKCQkJCQkJaWYgKEYuaXNBY3RpdmUpIHsKCQkJCQkJCUYuY2xvc2UoKTsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCXRoYXQuY2xvc2UoKTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0pOwoJCQl9CgoJCQl0aGlzLm92ZXJsYXkuY3NzKCBvcHRzLmNzcyApLnNob3coKTsKCQl9LAoKCQljbG9zZSA6IGZ1bmN0aW9uKCkgewoJCQkkKCcuZmFuY3lib3gtb3ZlcmxheScpLnJlbW92ZSgpOwoKCQkJVy51bmJpbmQoJ3Jlc2l6ZS5vdmVybGF5Jyk7CgoJCQl0aGlzLm92ZXJsYXkgPSBudWxsOwoKCQkJaWYgKHRoaXMubWFyZ2luICE9PSBmYWxzZSkgewoJCQkJJCgnYm9keScpLmNzcygnbWFyZ2luLXJpZ2h0JywgdGhpcy5tYXJnaW4pOwoKCQkJCXRoaXMubWFyZ2luID0gZmFsc2U7CgkJCX0KCgkJCWlmICh0aGlzLmVsKSB7CgkJCQl0aGlzLmVsLnJlbW92ZUNsYXNzKCdmYW5jeWJveC1sb2NrJyk7CgkJCX0KCQl9LAoKCQkvLyBQcml2YXRlLCBjYWxsYmFja3MKCgkJdXBkYXRlIDogZnVuY3Rpb24gKCkgewoJCQl2YXIgd2lkdGggPSAnMTAwJScsIG9mZnNldFdpZHRoOwoKCQkJLy8gUmVzZXQgd2lkdGgvaGVpZ2h0IHNvIGl0IHdpbGwgbm90IG1lc3MKCQkJdGhpcy5vdmVybGF5LndpZHRoKHdpZHRoKS5oZWlnaHQoJzEwMCUnKTsKCgkJCS8vIGpRdWVyeSBkb2VzIG5vdCByZXR1cm4gcmVsaWFibGUgcmVzdWx0IGZvciBJRQoJCQlpZiAoJC5icm93c2VyLm1zaWUpIHsKCQkJCW9mZnNldFdpZHRoID0gTWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm9mZnNldFdpZHRoLCBkb2N1bWVudC5ib2R5Lm9mZnNldFdpZHRoKTsKCgkJCQlpZiAoRC53aWR0aCgpID4gb2Zmc2V0V2lkdGgpIHsKCQkJCQl3aWR0aCA9IEQud2lkdGgoKTsKCQkJCX0KCgkJCX0gZWxzZSBpZiAoRC53aWR0aCgpID4gVy53aWR0aCgpKSB7CgkJCQl3aWR0aCA9IEQud2lkdGgoKTsKCQkJfQoKCQkJdGhpcy5vdmVybGF5LndpZHRoKHdpZHRoKS5oZWlnaHQoRC5oZWlnaHQoKSk7CgkJfSwKCgkJLy8gVGhpcyBpcyB3aGVyZSB3ZSBjYW4gbWFuaXB1bGF0ZSBET00sIGJlY2F1c2UgbGF0ZXIgaXQgd291bGQgY2F1c2UgaWZyYW1lcyB0byByZWxvYWQKCQlvblJlYWR5IDogZnVuY3Rpb24gKG9wdHMsIG9iaikgewoJCQkkKCcuZmFuY3lib3gtb3ZlcmxheScpLnN0b3AodHJ1ZSwgdHJ1ZSk7CgoJCQlpZiAoIXRoaXMub3ZlcmxheSkgewoJCQkJdGhpcy5tYXJnaW4gPSBELmhlaWdodCgpID4gVy5oZWlnaHQoKSB8fCAkKCdib2R5JykuY3NzKCdvdmVyZmxvdy15JykgPT09ICdzY3JvbGwnID8gJCgnYm9keScpLmNzcygnbWFyZ2luLXJpZ2h0JykgOiBmYWxzZTsKCQkJCXRoaXMuZWwgICAgID0gZG9jdW1lbnQuYWxsICYmICFkb2N1bWVudC5xdWVyeVNlbGVjdG9yID8gJCgnaHRtbCcpIDogJCgnYm9keScpOwoKCQkJCXRoaXMuY3JlYXRlKG9wdHMpOwoJCQl9CgoJCQlpZiAob3B0cy5sb2NrZWQgJiYgdGhpcy5maXhlZCkgewoJCQkJb2JqLmxvY2tlZCA9IHRoaXMub3ZlcmxheS5hcHBlbmQoIG9iai53cmFwICk7CgkJCQlvYmouZml4ZWQgID0gZmFsc2U7CgkJCX0KCgkJCWlmIChvcHRzLnNob3dFYXJseSA9PT0gdHJ1ZSkgewoJCQkJdGhpcy5iZWZvcmVTaG93LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CgkJCX0KCQl9LAoKCQliZWZvcmVTaG93IDogZnVuY3Rpb24ob3B0cywgb2JqKSB7CgkJCWlmIChvYmoubG9ja2VkKSB7CgkJCQl0aGlzLmVsLmFkZENsYXNzKCdmYW5jeWJveC1sb2NrJyk7CgoJCQkJaWYgKHRoaXMubWFyZ2luICE9PSBmYWxzZSkgewoJCQkJCSQoJ2JvZHknKS5jc3MoJ21hcmdpbi1yaWdodCcsIGdldFNjYWxhciggdGhpcy5tYXJnaW4gKSArIG9iai5zY3JvbGxiYXJXaWR0aCk7CgkJCQl9CgkJCX0KCgkJCXRoaXMub3BlbihvcHRzKTsKCQl9LAoKCQlvblVwZGF0ZSA6IGZ1bmN0aW9uKCkgewoJCQlpZiAoIXRoaXMuZml4ZWQpIHsKCQkJCXRoaXMudXBkYXRlKCk7CgkJCX0KCQl9LAoKCQlhZnRlckNsb3NlOiBmdW5jdGlvbiAob3B0cykgewoJCQkvLyBSZW1vdmUgb3ZlcmxheSBpZiBleGlzdHMgYW5kIGZhbmN5Qm94IGlzIG5vdCBvcGVuaW5nCgkJCS8vIChlLmcuLCBpdCBpcyBub3QgYmVpbmcgb3BlbiB1c2luZyBhZnRlckNsb3NlIGNhbGxiYWNrKQoJCQlpZiAodGhpcy5vdmVybGF5ICYmICFGLmlzQWN0aXZlKSB7CgkJCQl0aGlzLm92ZXJsYXkuZmFkZU91dChvcHRzLnNwZWVkT3V0LCAkLnByb3h5KCB0aGlzLmNsb3NlLCB0aGlzICkpOwoJCQl9CgkJfQoJfTsKCgkvKgoJICoJVGl0bGUgaGVscGVyCgkgKi8KCglGLmhlbHBlcnMudGl0bGUgPSB7CgkJZGVmYXVsdHMgOiB7CgkJCXR5cGUgICAgIDogJ2Zsb2F0JywgLy8gJ2Zsb2F0JywgJ2luc2lkZScsICdvdXRzaWRlJyBvciAnb3ZlcicsCgkJCXBvc2l0aW9uIDogJ2JvdHRvbScgLy8gJ3RvcCcgb3IgJ2JvdHRvbScKCQl9LAoKCQliZWZvcmVTaG93OiBmdW5jdGlvbiAob3B0cykgewoJCQl2YXIgY3VycmVudCA9IEYuY3VycmVudCwKCQkJCXRleHQgICAgPSBjdXJyZW50LnRpdGxlLAoJCQkJdHlwZSAgICA9IG9wdHMudHlwZSwKCQkJCXRpdGxlLAoJCQkJdGFyZ2V0OwoKCQkJaWYgKCQuaXNGdW5jdGlvbih0ZXh0KSkgewoJCQkJdGV4dCA9IHRleHQuY2FsbChjdXJyZW50LmVsZW1lbnQsIGN1cnJlbnQpOwoJCQl9CgoJCQlpZiAoIWlzU3RyaW5nKHRleHQpIHx8ICQudHJpbSh0ZXh0KSA9PT0gJycpIHsKCQkJCXJldHVybjsKCQkJfQoKCQkJdGl0bGUgPSAkKCc8ZGl2IGNsYXNzPSJmYW5jeWJveC10aXRsZSBmYW5jeWJveC10aXRsZS0nICsgdHlwZSArICctd3JhcCI+JyArIHRleHQgKyAnPC9kaXY+Jyk7CgoJCQlzd2l0Y2ggKHR5cGUpIHsKCQkJCWNhc2UgJ2luc2lkZSc6CgkJCQkJdGFyZ2V0ID0gRi5za2luOwoJCQkJYnJlYWs7CgoJCQkJY2FzZSAnb3V0c2lkZSc6CgkJCQkJdGFyZ2V0ID0gRi53cmFwOwoJCQkJYnJlYWs7CgoJCQkJY2FzZSAnb3Zlcic6CgkJCQkJdGFyZ2V0ID0gRi5pbm5lcjsKCQkJCWJyZWFrOwoKCQkJCWRlZmF1bHQ6IC8vICdmbG9hdCcKCQkJCQl0YXJnZXQgPSBGLnNraW47CgoJCQkJCXRpdGxlLmFwcGVuZFRvKCdib2R5Jyk7CgoJCQkJCWlmICgkLmJyb3dzZXIubXNpZSkgewoJCQkJCQl0aXRsZS53aWR0aCggdGl0bGUud2lkdGgoKSApOwoJCQkJCX0KCgkJCQkJdGl0bGUud3JhcElubmVyKCc8c3BhbiBjbGFzcz0iY2hpbGQiPjwvc3Bhbj4nKTsKCgkJCQkJLy9JbmNyZWFzZSBib3R0b20gbWFyZ2luIHNvIHRoaXMgdGl0bGUgd2lsbCBhbHNvIGZpdCBpbnRvIHZpZXdwb3J0CgkJCQkJRi5jdXJyZW50Lm1hcmdpblsyXSArPSBNYXRoLmFicyggZ2V0U2NhbGFyKHRpdGxlLmNzcygnbWFyZ2luLWJvdHRvbScpKSApOwoJCQkJYnJlYWs7CgkJCX0KCgkJCXRpdGxlWyAob3B0cy5wb3NpdGlvbiA9PT0gJ3RvcCcgPyAncHJlcGVuZFRvJyAgOiAnYXBwZW5kVG8nKSBdKHRhcmdldCk7CgkJfQoJfTsKCgkvLyBqUXVlcnkgcGx1Z2luIGluaXRpYWxpemF0aW9uCgkkLmZuLmZhbmN5Ym94ID0gZnVuY3Rpb24gKG9wdGlvbnMpIHsKCQl2YXIgaW5kZXgsCgkJCXRoYXQgICAgID0gJCh0aGlzKSwKCQkJc2VsZWN0b3IgPSB0aGlzLnNlbGVjdG9yIHx8ICcnLAoJCQlydW4gICAgICA9IGZ1bmN0aW9uKGUpIHsKCQkJCXZhciB3aGF0ID0gJCh0aGlzKS5ibHVyKCksIGlkeCA9IGluZGV4LCByZWxUeXBlLCByZWxWYWw7CgoJCQkJaWYgKCEoZS5jdHJsS2V5IHx8IGUuYWx0S2V5IHx8IGUuc2hpZnRLZXkgfHwgZS5tZXRhS2V5KSAmJiAhd2hhdC5pcygnLmZhbmN5Ym94LXdyYXAnKSkgewoJCQkJCXJlbFR5cGUgPSBvcHRpb25zLmdyb3VwQXR0ciB8fCAnZGF0YS1mYW5jeWJveC1ncm91cCc7CgkJCQkJcmVsVmFsICA9IHdoYXQuYXR0cihyZWxUeXBlKTsKCgkJCQkJaWYgKCFyZWxWYWwpIHsKCQkJCQkJcmVsVHlwZSA9ICdyZWwnOwoJCQkJCQlyZWxWYWwgID0gd2hhdC5nZXQoMClbIHJlbFR5cGUgXTsKCQkJCQl9CgoJCQkJCWlmIChyZWxWYWwgJiYgcmVsVmFsICE9PSAnJyAmJiByZWxWYWwgIT09ICdub2ZvbGxvdycpIHsKCQkJCQkJd2hhdCA9IHNlbGVjdG9yLmxlbmd0aCA/ICQoc2VsZWN0b3IpIDogdGhhdDsKCQkJCQkJd2hhdCA9IHdoYXQuZmlsdGVyKCdbJyArIHJlbFR5cGUgKyAnPSInICsgcmVsVmFsICsgJyJdJyk7CgkJCQkJCWlkeCAgPSB3aGF0LmluZGV4KHRoaXMpOwoJCQkJCX0KCgkJCQkJb3B0aW9ucy5pbmRleCA9IGlkeDsKCgkJCQkJLy8gU3RvcCBhbiBldmVudCBmcm9tIGJ1YmJsaW5nIGlmIGV2ZXJ5dGhpbmcgaXMgZmluZQoJCQkJCWlmIChGLm9wZW4od2hhdCwgb3B0aW9ucykgIT09IGZhbHNlKSB7CgkJCQkJCWUucHJldmVudERlZmF1bHQoKTsKCQkJCQl9CgkJCQl9CgkJCX07CgoJCW9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwoJCWluZGV4ICAgPSBvcHRpb25zLmluZGV4IHx8IDA7CgoJCWlmICghc2VsZWN0b3IgfHwgb3B0aW9ucy5saXZlID09PSBmYWxzZSkgewoJCQl0aGF0LnVuYmluZCgnY2xpY2suZmItc3RhcnQnKS5iaW5kKCdjbGljay5mYi1zdGFydCcsIHJ1bik7CgoJCX0gZWxzZSB7CgkJCUQudW5kZWxlZ2F0ZShzZWxlY3RvciwgJ2NsaWNrLmZiLXN0YXJ0JykuZGVsZWdhdGUoc2VsZWN0b3IgKyAiOm5vdCgnLmZhbmN5Ym94LWl0ZW0sIC5mYW5jeWJveC1uYXYnKSIsICdjbGljay5mYi1zdGFydCcsIHJ1bik7CgkJfQoKCQl0aGlzLmZpbHRlcignW2RhdGEtZmFuY3lib3gtc3RhcnQ9MV0nKS50cmlnZ2VyKCdjbGljaycpOwoKCQlyZXR1cm4gdGhpczsKCX07CgoJLy8gVGVzdHMgdGhhdCBuZWVkIGEgYm9keSBhdCBkb2MgcmVhZHkKCUQucmVhZHkoZnVuY3Rpb24oKSB7CgkJaWYgKCAkLnNjcm9sbGJhcldpZHRoID09PSB1bmRlZmluZWQgKSB7CgkJCS8vIGh0dHA6Ly9iZW5hbG1hbi5jb20vcHJvamVjdHMvanF1ZXJ5LW1pc2MtcGx1Z2lucy8jc2Nyb2xsYmFyd2lkdGgKCQkJJC5zY3JvbGxiYXJXaWR0aCA9IGZ1bmN0aW9uKCkgewoJCQkJdmFyIHBhcmVudCA9ICQoJzxkaXYgc3R5bGU9IndpZHRoOjUwcHg7aGVpZ2h0OjUwcHg7b3ZlcmZsb3c6YXV0byI+PGRpdi8+PC9kaXY+JykuYXBwZW5kVG8oJ2JvZHknKSwKCQkJCQljaGlsZCAgPSBwYXJlbnQuY2hpbGRyZW4oKSwKCQkJCQl3aWR0aCAgPSBjaGlsZC5pbm5lcldpZHRoKCkgLSBjaGlsZC5oZWlnaHQoIDk5ICkuaW5uZXJXaWR0aCgpOwoKCQkJCXBhcmVudC5yZW1vdmUoKTsKCgkJCQlyZXR1cm4gd2lkdGg7CgkJCX07CgkJfQoKCQlpZiAoICQuc3VwcG9ydC5maXhlZFBvc2l0aW9uID09PSB1bmRlZmluZWQgKSB7CgkJCSQuc3VwcG9ydC5maXhlZFBvc2l0aW9uID0gKGZ1bmN0aW9uKCkgewoJCQkJdmFyIGVsZW0gID0gJCgnPGRpdiBzdHlsZT0icG9zaXRpb246Zml4ZWQ7dG9wOjIwcHg7Ij48L2Rpdj4nKS5hcHBlbmRUbygnYm9keScpLAoJCQkJCWZpeGVkID0gKCBlbGVtWzBdLm9mZnNldFRvcCA9PT0gMjAgfHwgZWxlbVswXS5vZmZzZXRUb3AgPT09IDE1ICk7CgoJCQkJZWxlbS5yZW1vdmUoKTsKCgkJCQlyZXR1cm4gZml4ZWQ7CgkJCX0oKSk7CgkJfQoKCQkkLmV4dGVuZChGLmRlZmF1bHRzLCB7CgkJCXNjcm9sbGJhcldpZHRoIDogJC5zY3JvbGxiYXJXaWR0aCgpLAoJCQlmaXhlZCAgOiAkLnN1cHBvcnQuZml4ZWRQb3NpdGlvbiwKCQkJcGFyZW50IDogJCgnYm9keScpCgkJfSk7Cgl9KTsKCn0od2luZG93LCBkb2N1bWVudCwgalF1ZXJ5KSk7]]></data>
	</file>
	<file>
	  <filename>/lib/fancybox.lib/jquery.fancybox.pack.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohIGZhbmN5Qm94IHYyLjEuMyBmYW5jeWFwcHMuY29tIHwgZmFuY3lhcHBzLmNvbS9mYW5jeWJveC8jbGljZW5zZSAqLwooZnVuY3Rpb24oQix4LGYscSl7dmFyIHI9ZihCKSxtPWYoeCksYj1mLmZhbmN5Ym94PWZ1bmN0aW9uKCl7Yi5vcGVuLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sdT1udWxsLG49eC5jcmVhdGVUb3VjaCE9PXEscz1mdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5oYXNPd25Qcm9wZXJ0eSYmYSBpbnN0YW5jZW9mIGZ9LHA9ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJiJzdHJpbmciPT09Zi50eXBlKGEpfSxFPWZ1bmN0aW9uKGEpe3JldHVybiBwKGEpJiYwPGEuaW5kZXhPZigiJSIpfSxrPWZ1bmN0aW9uKGEsZCl7dmFyIGU9cGFyc2VJbnQoYSwxMCl8fDA7ZCYmRShhKSYmKGUqPWIuZ2V0Vmlld3BvcnQoKVtkXS8xMDApO3JldHVybiBNYXRoLmNlaWwoZSl9LHY9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gayhhLGIpKyJweCJ9O2YuZXh0ZW5kKGIse3ZlcnNpb246IjIuMS4zIixkZWZhdWx0czp7cGFkZGluZzoxNSxtYXJnaW46MjAsd2lkdGg6ODAwLGhlaWdodDo2MDAsbWluV2lkdGg6MTAwLG1pbkhlaWdodDoxMDAsCm1heFdpZHRoOjk5OTksbWF4SGVpZ2h0Ojk5OTksYXV0b1NpemU6ITAsYXV0b0hlaWdodDohMSxhdXRvV2lkdGg6ITEsYXV0b1Jlc2l6ZTohMCxhdXRvQ2VudGVyOiFuLGZpdFRvVmlldzohMCxhc3BlY3RSYXRpbzohMSx0b3BSYXRpbzowLjUsbGVmdFJhdGlvOjAuNSxzY3JvbGxpbmc6ImF1dG8iLHdyYXBDU1M6IiIsYXJyb3dzOiEwLGNsb3NlQnRuOiEwLGNsb3NlQ2xpY2s6ITEsbmV4dENsaWNrOiExLG1vdXNlV2hlZWw6ITAsYXV0b1BsYXk6ITEscGxheVNwZWVkOjNFMyxwcmVsb2FkOjMsbW9kYWw6ITEsbG9vcDohMCxhamF4OntkYXRhVHlwZToiaHRtbCIsaGVhZGVyczp7IlgtZmFuY3lCb3giOiEwfX0saWZyYW1lOntzY3JvbGxpbmc6ImF1dG8iLHByZWxvYWQ6ITB9LHN3Zjp7d21vZGU6InRyYW5zcGFyZW50IixhbGxvd2Z1bGxzY3JlZW46InRydWUiLGFsbG93c2NyaXB0YWNjZXNzOiJhbHdheXMifSxrZXlzOntuZXh0OnsxMzoibGVmdCIsMzQ6InVwIiwzOToibGVmdCIsNDA6InVwIn0sCnByZXY6ezg6InJpZ2h0IiwzMzoiZG93biIsMzc6InJpZ2h0IiwzODoiZG93biJ9LGNsb3NlOlsyN10scGxheTpbMzJdLHRvZ2dsZTpbNzBdfSxkaXJlY3Rpb246e25leHQ6ImxlZnQiLHByZXY6InJpZ2h0In0sc2Nyb2xsT3V0c2lkZTohMCxpbmRleDowLHR5cGU6bnVsbCxocmVmOm51bGwsY29udGVudDpudWxsLHRpdGxlOm51bGwsdHBsOnt3cmFwOic8ZGl2IGNsYXNzPSJmYW5jeWJveC13cmFwIiB0YWJJbmRleD0iLTEiPjxkaXYgY2xhc3M9ImZhbmN5Ym94LXNraW4iPjxkaXYgY2xhc3M9ImZhbmN5Ym94LW91dGVyIj48ZGl2IGNsYXNzPSJmYW5jeWJveC1pbm5lciI+PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+JyxpbWFnZTonPGltZyBjbGFzcz0iZmFuY3lib3gtaW1hZ2UiIHNyYz0ie2hyZWZ9IiBhbHQ9IiIgLz4nLGlmcmFtZTonPGlmcmFtZSBpZD0iZmFuY3lib3gtZnJhbWV7cm5kfSIgbmFtZT0iZmFuY3lib3gtZnJhbWV7cm5kfSIgY2xhc3M9ImZhbmN5Ym94LWlmcmFtZSIgZnJhbWVib3JkZXI9IjAiIHZzcGFjZT0iMCIgaHNwYWNlPSIwIiB3ZWJraXRBbGxvd0Z1bGxTY3JlZW4gbW96YWxsb3dmdWxsc2NyZWVuIGFsbG93RnVsbFNjcmVlbicrCihmLmJyb3dzZXIubXNpZT8nIGFsbG93dHJhbnNwYXJlbmN5PSJ0cnVlIic6IiIpKyI+PC9pZnJhbWU+IixlcnJvcjonPHAgY2xhc3M9ImZhbmN5Ym94LWVycm9yIj5UaGUgcmVxdWVzdGVkIGNvbnRlbnQgY2Fubm90IGJlIGxvYWRlZC48YnIvPlBsZWFzZSB0cnkgYWdhaW4gbGF0ZXIuPC9wPicsY2xvc2VCdG46JzxhIHRpdGxlPSJDbG9zZSIgY2xhc3M9ImZhbmN5Ym94LWl0ZW0gZmFuY3lib3gtY2xvc2UiIGhyZWY9ImphdmFzY3JpcHQ6OyI+PC9hPicsbmV4dDonPGEgdGl0bGU9Ik5leHQiIGNsYXNzPSJmYW5jeWJveC1uYXYgZmFuY3lib3gtbmV4dCIgaHJlZj0iamF2YXNjcmlwdDo7Ij48c3Bhbj48L3NwYW4+PC9hPicscHJldjonPGEgdGl0bGU9IlByZXZpb3VzIiBjbGFzcz0iZmFuY3lib3gtbmF2IGZhbmN5Ym94LXByZXYiIGhyZWY9ImphdmFzY3JpcHQ6OyI+PHNwYW4+PC9zcGFuPjwvYT4nfSxvcGVuRWZmZWN0OiJmYWRlIixvcGVuU3BlZWQ6MjUwLG9wZW5FYXNpbmc6InN3aW5nIiwKb3Blbk9wYWNpdHk6ITAsb3Blbk1ldGhvZDoiem9vbUluIixjbG9zZUVmZmVjdDoiZmFkZSIsY2xvc2VTcGVlZDoyNTAsY2xvc2VFYXNpbmc6InN3aW5nIixjbG9zZU9wYWNpdHk6ITAsY2xvc2VNZXRob2Q6Inpvb21PdXQiLG5leHRFZmZlY3Q6ImVsYXN0aWMiLG5leHRTcGVlZDoyNTAsbmV4dEVhc2luZzoic3dpbmciLG5leHRNZXRob2Q6ImNoYW5nZUluIixwcmV2RWZmZWN0OiJlbGFzdGljIixwcmV2U3BlZWQ6MjUwLHByZXZFYXNpbmc6InN3aW5nIixwcmV2TWV0aG9kOiJjaGFuZ2VPdXQiLGhlbHBlcnM6e292ZXJsYXk6ITAsdGl0bGU6ITB9LG9uQ2FuY2VsOmYubm9vcCxiZWZvcmVMb2FkOmYubm9vcCxhZnRlckxvYWQ6Zi5ub29wLGJlZm9yZVNob3c6Zi5ub29wLGFmdGVyU2hvdzpmLm5vb3AsYmVmb3JlQ2hhbmdlOmYubm9vcCxiZWZvcmVDbG9zZTpmLm5vb3AsYWZ0ZXJDbG9zZTpmLm5vb3B9LGdyb3VwOnt9LG9wdHM6e30scHJldmlvdXM6bnVsbCxjb21pbmc6bnVsbCxjdXJyZW50Om51bGwsCmlzQWN0aXZlOiExLGlzT3BlbjohMSxpc09wZW5lZDohMSx3cmFwOm51bGwsc2tpbjpudWxsLG91dGVyOm51bGwsaW5uZXI6bnVsbCxwbGF5ZXI6e3RpbWVyOm51bGwsaXNBY3RpdmU6ITF9LGFqYXhMb2FkOm51bGwsaW1nUHJlbG9hZDpudWxsLHRyYW5zaXRpb25zOnt9LGhlbHBlcnM6e30sb3BlbjpmdW5jdGlvbihhLGQpe2lmKGEmJihmLmlzUGxhaW5PYmplY3QoZCl8fChkPXt9KSwhMSE9PWIuY2xvc2UoITApKSlyZXR1cm4gZi5pc0FycmF5KGEpfHwoYT1zKGEpP2YoYSkuZ2V0KCk6W2FdKSxmLmVhY2goYSxmdW5jdGlvbihlLGMpe3ZhciBqPXt9LGcsaCxpLGwsazsib2JqZWN0Ij09PWYudHlwZShjKSYmKGMubm9kZVR5cGUmJihjPWYoYykpLHMoYyk/KGo9e2hyZWY6Yy5kYXRhKCJmYW5jeWJveC1ocmVmIil8fGMuYXR0cigiaHJlZiIpLHRpdGxlOmMuZGF0YSgiZmFuY3lib3gtdGl0bGUiKXx8Yy5hdHRyKCJ0aXRsZSIpLGlzRG9tOiEwLGVsZW1lbnQ6Y30sZi5tZXRhZGF0YSYmZi5leHRlbmQoITAsCmosYy5tZXRhZGF0YSgpKSk6aj1jKTtnPWQuaHJlZnx8ai5ocmVmfHwocChjKT9jOm51bGwpO2g9ZC50aXRsZSE9PXE/ZC50aXRsZTpqLnRpdGxlfHwiIjtsPShpPWQuY29udGVudHx8ai5jb250ZW50KT8iaHRtbCI6ZC50eXBlfHxqLnR5cGU7IWwmJmouaXNEb20mJihsPWMuZGF0YSgiZmFuY3lib3gtdHlwZSIpLGx8fChsPShsPWMucHJvcCgiY2xhc3MiKS5tYXRjaCgvZmFuY3lib3hcLihcdyspLykpP2xbMV06bnVsbCkpO3AoZykmJihsfHwoYi5pc0ltYWdlKGcpP2w9ImltYWdlIjpiLmlzU1dGKGcpP2w9InN3ZiI6IiMiPT09Zy5jaGFyQXQoMCk/bD0iaW5saW5lIjpwKGMpJiYobD0iaHRtbCIsaT1jKSksImFqYXgiPT09bCYmKGs9Zy5zcGxpdCgvXHMrLywyKSxnPWsuc2hpZnQoKSxrPWsuc2hpZnQoKSkpO2l8fCgiaW5saW5lIj09PWw/Zz9pPWYocChnKT9nLnJlcGxhY2UoLy4qKD89I1teXHNdKyQpLywiIik6Zyk6ai5pc0RvbSYmKGk9Yyk6Imh0bWwiPT09bD9pPWc6IWwmJighZyYmCmouaXNEb20pJiYobD0iaW5saW5lIixpPWMpKTtmLmV4dGVuZChqLHtocmVmOmcsdHlwZTpsLGNvbnRlbnQ6aSx0aXRsZTpoLHNlbGVjdG9yOmt9KTthW2VdPWp9KSxiLm9wdHM9Zi5leHRlbmQoITAse30sYi5kZWZhdWx0cyxkKSxkLmtleXMhPT1xJiYoYi5vcHRzLmtleXM9ZC5rZXlzP2YuZXh0ZW5kKHt9LGIuZGVmYXVsdHMua2V5cyxkLmtleXMpOiExKSxiLmdyb3VwPWEsYi5fc3RhcnQoYi5vcHRzLmluZGV4KX0sY2FuY2VsOmZ1bmN0aW9uKCl7dmFyIGE9Yi5jb21pbmc7YSYmITEhPT1iLnRyaWdnZXIoIm9uQ2FuY2VsIikmJihiLmhpZGVMb2FkaW5nKCksYi5hamF4TG9hZCYmYi5hamF4TG9hZC5hYm9ydCgpLGIuYWpheExvYWQ9bnVsbCxiLmltZ1ByZWxvYWQmJihiLmltZ1ByZWxvYWQub25sb2FkPWIuaW1nUHJlbG9hZC5vbmVycm9yPW51bGwpLGEud3JhcCYmYS53cmFwLnN0b3AoITAsITApLnRyaWdnZXIoIm9uUmVzZXQiKS5yZW1vdmUoKSxiLmNvbWluZz1udWxsLGIuY3VycmVudHx8CmIuX2FmdGVyWm9vbU91dChhKSl9LGNsb3NlOmZ1bmN0aW9uKGEpe2IuY2FuY2VsKCk7ITEhPT1iLnRyaWdnZXIoImJlZm9yZUNsb3NlIikmJihiLnVuYmluZEV2ZW50cygpLGIuaXNBY3RpdmUmJighYi5pc09wZW58fCEwPT09YT8oZigiLmZhbmN5Ym94LXdyYXAiKS5zdG9wKCEwKS50cmlnZ2VyKCJvblJlc2V0IikucmVtb3ZlKCksYi5fYWZ0ZXJab29tT3V0KCkpOihiLmlzT3Blbj1iLmlzT3BlbmVkPSExLGIuaXNDbG9zaW5nPSEwLGYoIi5mYW5jeWJveC1pdGVtLCAuZmFuY3lib3gtbmF2IikucmVtb3ZlKCksYi53cmFwLnN0b3AoITAsITApLnJlbW92ZUNsYXNzKCJmYW5jeWJveC1vcGVuZWQiKSxiLnRyYW5zaXRpb25zW2IuY3VycmVudC5jbG9zZU1ldGhvZF0oKSkpKX0scGxheTpmdW5jdGlvbihhKXt2YXIgZD1mdW5jdGlvbigpe2NsZWFyVGltZW91dChiLnBsYXllci50aW1lcil9LGU9ZnVuY3Rpb24oKXtkKCk7Yi5jdXJyZW50JiZiLnBsYXllci5pc0FjdGl2ZSYmKGIucGxheWVyLnRpbWVyPQpzZXRUaW1lb3V0KGIubmV4dCxiLmN1cnJlbnQucGxheVNwZWVkKSl9LGM9ZnVuY3Rpb24oKXtkKCk7ZigiYm9keSIpLnVuYmluZCgiLnBsYXllciIpO2IucGxheWVyLmlzQWN0aXZlPSExO2IudHJpZ2dlcigib25QbGF5RW5kIil9O2lmKCEwPT09YXx8IWIucGxheWVyLmlzQWN0aXZlJiYhMSE9PWEpe2lmKGIuY3VycmVudCYmKGIuY3VycmVudC5sb29wfHxiLmN1cnJlbnQuaW5kZXg8Yi5ncm91cC5sZW5ndGgtMSkpYi5wbGF5ZXIuaXNBY3RpdmU9ITAsZigiYm9keSIpLmJpbmQoeyJhZnRlclNob3cucGxheWVyIG9uVXBkYXRlLnBsYXllciI6ZSwib25DYW5jZWwucGxheWVyIGJlZm9yZUNsb3NlLnBsYXllciI6YywiYmVmb3JlTG9hZC5wbGF5ZXIiOmR9KSxlKCksYi50cmlnZ2VyKCJvblBsYXlTdGFydCIpfWVsc2UgYygpfSxuZXh0OmZ1bmN0aW9uKGEpe3ZhciBkPWIuY3VycmVudDtkJiYocChhKXx8KGE9ZC5kaXJlY3Rpb24ubmV4dCksYi5qdW1wdG8oZC5pbmRleCsxLGEsIm5leHQiKSl9LApwcmV2OmZ1bmN0aW9uKGEpe3ZhciBkPWIuY3VycmVudDtkJiYocChhKXx8KGE9ZC5kaXJlY3Rpb24ucHJldiksYi5qdW1wdG8oZC5pbmRleC0xLGEsInByZXYiKSl9LGp1bXB0bzpmdW5jdGlvbihhLGQsZSl7dmFyIGM9Yi5jdXJyZW50O2MmJihhPWsoYSksYi5kaXJlY3Rpb249ZHx8Yy5kaXJlY3Rpb25bYT49Yy5pbmRleD8ibmV4dCI6InByZXYiXSxiLnJvdXRlcj1lfHwianVtcHRvIixjLmxvb3AmJigwPmEmJihhPWMuZ3JvdXAubGVuZ3RoK2ElYy5ncm91cC5sZW5ndGgpLGElPWMuZ3JvdXAubGVuZ3RoKSxjLmdyb3VwW2FdIT09cSYmKGIuY2FuY2VsKCksYi5fc3RhcnQoYSkpKX0scmVwb3NpdGlvbjpmdW5jdGlvbihhLGQpe3ZhciBlPWIuY3VycmVudCxjPWU/ZS53cmFwOm51bGwsajtjJiYoaj1iLl9nZXRQb3NpdGlvbihkKSxhJiYic2Nyb2xsIj09PWEudHlwZT8oZGVsZXRlIGoucG9zaXRpb24sYy5zdG9wKCEwLCEwKS5hbmltYXRlKGosMjAwKSk6KGMuY3NzKGopLGUucG9zPWYuZXh0ZW5kKHt9LAplLmRpbSxqKSkpfSx1cGRhdGU6ZnVuY3Rpb24oYSl7dmFyIGQ9YSYmYS50eXBlLGU9IWR8fCJvcmllbnRhdGlvbmNoYW5nZSI9PT1kO2UmJihjbGVhclRpbWVvdXQodSksdT1udWxsKTtiLmlzT3BlbiYmIXUmJih1PXNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYz1iLmN1cnJlbnQ7YyYmIWIuaXNDbG9zaW5nJiYoYi53cmFwLnJlbW92ZUNsYXNzKCJmYW5jeWJveC10bXAiKSwoZXx8ImxvYWQiPT09ZHx8InJlc2l6ZSI9PT1kJiZjLmF1dG9SZXNpemUpJiZiLl9zZXREaW1lbnNpb24oKSwic2Nyb2xsIj09PWQmJmMuY2FuU2hyaW5rfHxiLnJlcG9zaXRpb24oYSksYi50cmlnZ2VyKCJvblVwZGF0ZSIpLHU9bnVsbCl9LGUmJiFuPzA6MzAwKSl9LHRvZ2dsZTpmdW5jdGlvbihhKXtiLmlzT3BlbiYmKGIuY3VycmVudC5maXRUb1ZpZXc9ImJvb2xlYW4iPT09Zi50eXBlKGEpP2E6IWIuY3VycmVudC5maXRUb1ZpZXcsbiYmKGIud3JhcC5yZW1vdmVBdHRyKCJzdHlsZSIpLmFkZENsYXNzKCJmYW5jeWJveC10bXAiKSwKYi50cmlnZ2VyKCJvblVwZGF0ZSIpKSxiLnVwZGF0ZSgpKX0saGlkZUxvYWRpbmc6ZnVuY3Rpb24oKXttLnVuYmluZCgiLmxvYWRpbmciKTtmKCIjZmFuY3lib3gtbG9hZGluZyIpLnJlbW92ZSgpfSxzaG93TG9hZGluZzpmdW5jdGlvbigpe3ZhciBhLGQ7Yi5oaWRlTG9hZGluZygpO2E9ZignPGRpdiBpZD0iZmFuY3lib3gtbG9hZGluZyI+PGRpdj48L2Rpdj48L2Rpdj4nKS5jbGljayhiLmNhbmNlbCkuYXBwZW5kVG8oImJvZHkiKTttLmJpbmQoImtleWRvd24ubG9hZGluZyIsZnVuY3Rpb24oYSl7aWYoMjc9PT0oYS53aGljaHx8YS5rZXlDb2RlKSlhLnByZXZlbnREZWZhdWx0KCksYi5jYW5jZWwoKX0pO2IuZGVmYXVsdHMuZml4ZWR8fChkPWIuZ2V0Vmlld3BvcnQoKSxhLmNzcyh7cG9zaXRpb246ImFic29sdXRlIix0b3A6MC41KmQuaCtkLnksbGVmdDowLjUqZC53K2QueH0pKX0sZ2V0Vmlld3BvcnQ6ZnVuY3Rpb24oKXt2YXIgYT1iLmN1cnJlbnQmJmIuY3VycmVudC5sb2NrZWR8fAohMSxkPXt4OnIuc2Nyb2xsTGVmdCgpLHk6ci5zY3JvbGxUb3AoKX07YT8oZC53PWFbMF0uY2xpZW50V2lkdGgsZC5oPWFbMF0uY2xpZW50SGVpZ2h0KTooZC53PW4mJkIuaW5uZXJXaWR0aD9CLmlubmVyV2lkdGg6ci53aWR0aCgpLGQuaD1uJiZCLmlubmVySGVpZ2h0P0IuaW5uZXJIZWlnaHQ6ci5oZWlnaHQoKSk7cmV0dXJuIGR9LHVuYmluZEV2ZW50czpmdW5jdGlvbigpe2Iud3JhcCYmcyhiLndyYXApJiZiLndyYXAudW5iaW5kKCIuZmIiKTttLnVuYmluZCgiLmZiIik7ci51bmJpbmQoIi5mYiIpfSxiaW5kRXZlbnRzOmZ1bmN0aW9uKCl7dmFyIGE9Yi5jdXJyZW50LGQ7YSYmKHIuYmluZCgib3JpZW50YXRpb25jaGFuZ2UuZmIiKyhuPyIiOiIgcmVzaXplLmZiIikrKGEuYXV0b0NlbnRlciYmIWEubG9ja2VkPyIgc2Nyb2xsLmZiIjoiIiksYi51cGRhdGUpLChkPWEua2V5cykmJm0uYmluZCgia2V5ZG93bi5mYiIsZnVuY3Rpb24oZSl7dmFyIGM9ZS53aGljaHx8ZS5rZXlDb2RlLGo9CmUudGFyZ2V0fHxlLnNyY0VsZW1lbnQ7aWYoMjc9PT1jJiZiLmNvbWluZylyZXR1cm4hMTshZS5jdHJsS2V5JiYoIWUuYWx0S2V5JiYhZS5zaGlmdEtleSYmIWUubWV0YUtleSYmKCFqfHwhai50eXBlJiYhZihqKS5pcygiW2NvbnRlbnRlZGl0YWJsZV0iKSkpJiZmLmVhY2goZCxmdW5jdGlvbihkLGope2lmKDE8YS5ncm91cC5sZW5ndGgmJmpbY10hPT1xKXJldHVybiBiW2RdKGpbY10pLGUucHJldmVudERlZmF1bHQoKSwhMTtpZigtMTxmLmluQXJyYXkoYyxqKSlyZXR1cm4gYltkXSgpLGUucHJldmVudERlZmF1bHQoKSwhMX0pfSksZi5mbi5tb3VzZXdoZWVsJiZhLm1vdXNlV2hlZWwmJmIud3JhcC5iaW5kKCJtb3VzZXdoZWVsLmZiIixmdW5jdGlvbihkLGMsaixnKXtmb3IodmFyIGg9ZihkLnRhcmdldHx8bnVsbCksaT0hMTtoLmxlbmd0aCYmIWkmJiFoLmlzKCIuZmFuY3lib3gtc2tpbiIpJiYhaC5pcygiLmZhbmN5Ym94LXdyYXAiKTspaT1oWzBdJiYhKGhbMF0uc3R5bGUub3ZlcmZsb3cmJgoiaGlkZGVuIj09PWhbMF0uc3R5bGUub3ZlcmZsb3cpJiYoaFswXS5jbGllbnRXaWR0aCYmaFswXS5zY3JvbGxXaWR0aD5oWzBdLmNsaWVudFdpZHRofHxoWzBdLmNsaWVudEhlaWdodCYmaFswXS5zY3JvbGxIZWlnaHQ+aFswXS5jbGllbnRIZWlnaHQpLGg9ZihoKS5wYXJlbnQoKTtpZigwIT09YyYmIWkmJjE8Yi5ncm91cC5sZW5ndGgmJiFhLmNhblNocmluayl7aWYoMDxnfHwwPGopYi5wcmV2KDA8Zz8iZG93biI6ImxlZnQiKTtlbHNlIGlmKDA+Z3x8MD5qKWIubmV4dCgwPmc/InVwIjoicmlnaHQiKTtkLnByZXZlbnREZWZhdWx0KCl9fSkpfSx0cmlnZ2VyOmZ1bmN0aW9uKGEsZCl7dmFyIGUsYz1kfHxiLmNvbWluZ3x8Yi5jdXJyZW50O2lmKGMpe2YuaXNGdW5jdGlvbihjW2FdKSYmKGU9Y1thXS5hcHBseShjLEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSkpO2lmKCExPT09ZSlyZXR1cm4hMTtjLmhlbHBlcnMmJmYuZWFjaChjLmhlbHBlcnMsZnVuY3Rpb24oZCwKZSl7ZSYmKGIuaGVscGVyc1tkXSYmZi5pc0Z1bmN0aW9uKGIuaGVscGVyc1tkXVthXSkpJiYoZT1mLmV4dGVuZCghMCx7fSxiLmhlbHBlcnNbZF0uZGVmYXVsdHMsZSksYi5oZWxwZXJzW2RdW2FdKGUsYykpfSk7Zi5ldmVudC50cmlnZ2VyKGErIi5mYiIpfX0saXNJbWFnZTpmdW5jdGlvbihhKXtyZXR1cm4gcChhKSYmYS5tYXRjaCgvKF5kYXRhOmltYWdlXC8uKiwpfChcLihqcChlfGd8ZWcpfGdpZnxwbmd8Ym1wfHdlYnApKChcP3wjKS4qKT8kKS9pKX0saXNTV0Y6ZnVuY3Rpb24oYSl7cmV0dXJuIHAoYSkmJmEubWF0Y2goL1wuKHN3ZikoKFw/fCMpLiopPyQvaSl9LF9zdGFydDpmdW5jdGlvbihhKXt2YXIgZD17fSxlLGMsYT1rKGEpO2U9Yi5ncm91cFthXXx8bnVsbDtpZighZSlyZXR1cm4hMTtkPWYuZXh0ZW5kKCEwLHt9LGIub3B0cyxlKTtlPWQubWFyZ2luO2M9ZC5wYWRkaW5nOyJudW1iZXIiPT09Zi50eXBlKGUpJiYoZC5tYXJnaW49W2UsZSxlLGVdKTsibnVtYmVyIj09PWYudHlwZShjKSYmCihkLnBhZGRpbmc9W2MsYyxjLGNdKTtkLm1vZGFsJiZmLmV4dGVuZCghMCxkLHtjbG9zZUJ0bjohMSxjbG9zZUNsaWNrOiExLG5leHRDbGljazohMSxhcnJvd3M6ITEsbW91c2VXaGVlbDohMSxrZXlzOm51bGwsaGVscGVyczp7b3ZlcmxheTp7Y2xvc2VDbGljazohMX19fSk7ZC5hdXRvU2l6ZSYmKGQuYXV0b1dpZHRoPWQuYXV0b0hlaWdodD0hMCk7ImF1dG8iPT09ZC53aWR0aCYmKGQuYXV0b1dpZHRoPSEwKTsiYXV0byI9PT1kLmhlaWdodCYmKGQuYXV0b0hlaWdodD0hMCk7ZC5ncm91cD1iLmdyb3VwO2QuaW5kZXg9YTtiLmNvbWluZz1kO2lmKCExPT09Yi50cmlnZ2VyKCJiZWZvcmVMb2FkIikpYi5jb21pbmc9bnVsbDtlbHNle2M9ZC50eXBlO2U9ZC5ocmVmO2lmKCFjKXJldHVybiBiLmNvbWluZz1udWxsLGIuY3VycmVudCYmYi5yb3V0ZXImJiJqdW1wdG8iIT09Yi5yb3V0ZXI/KGIuY3VycmVudC5pbmRleD1hLGJbYi5yb3V0ZXJdKGIuZGlyZWN0aW9uKSk6ITE7Yi5pc0FjdGl2ZT0KITA7aWYoImltYWdlIj09PWN8fCJzd2YiPT09YylkLmF1dG9IZWlnaHQ9ZC5hdXRvV2lkdGg9ITEsZC5zY3JvbGxpbmc9InZpc2libGUiOyJpbWFnZSI9PT1jJiYoZC5hc3BlY3RSYXRpbz0hMCk7ImlmcmFtZSI9PT1jJiZuJiYoZC5zY3JvbGxpbmc9InNjcm9sbCIpO2Qud3JhcD1mKGQudHBsLndyYXApLmFkZENsYXNzKCJmYW5jeWJveC0iKyhuPyJtb2JpbGUiOiJkZXNrdG9wIikrIiBmYW5jeWJveC10eXBlLSIrYysiIGZhbmN5Ym94LXRtcCAiK2Qud3JhcENTUykuYXBwZW5kVG8oZC5wYXJlbnR8fCJib2R5Iik7Zi5leHRlbmQoZCx7c2tpbjpmKCIuZmFuY3lib3gtc2tpbiIsZC53cmFwKSxvdXRlcjpmKCIuZmFuY3lib3gtb3V0ZXIiLGQud3JhcCksaW5uZXI6ZigiLmZhbmN5Ym94LWlubmVyIixkLndyYXApfSk7Zi5lYWNoKFsiVG9wIiwiUmlnaHQiLCJCb3R0b20iLCJMZWZ0Il0sZnVuY3Rpb24oYSxiKXtkLnNraW4uY3NzKCJwYWRkaW5nIitiLHYoZC5wYWRkaW5nW2FdKSl9KTtiLnRyaWdnZXIoIm9uUmVhZHkiKTsKaWYoImlubGluZSI9PT1jfHwiaHRtbCI9PT1jKXtpZighZC5jb250ZW50fHwhZC5jb250ZW50Lmxlbmd0aClyZXR1cm4gYi5fZXJyb3IoImNvbnRlbnQiKX1lbHNlIGlmKCFlKXJldHVybiBiLl9lcnJvcigiaHJlZiIpOyJpbWFnZSI9PT1jP2IuX2xvYWRJbWFnZSgpOiJhamF4Ij09PWM/Yi5fbG9hZEFqYXgoKToiaWZyYW1lIj09PWM/Yi5fbG9hZElmcmFtZSgpOmIuX2FmdGVyTG9hZCgpfX0sX2Vycm9yOmZ1bmN0aW9uKGEpe2YuZXh0ZW5kKGIuY29taW5nLHt0eXBlOiJodG1sIixhdXRvV2lkdGg6ITAsYXV0b0hlaWdodDohMCxtaW5XaWR0aDowLG1pbkhlaWdodDowLHNjcm9sbGluZzoibm8iLGhhc0Vycm9yOmEsY29udGVudDpiLmNvbWluZy50cGwuZXJyb3J9KTtiLl9hZnRlckxvYWQoKX0sX2xvYWRJbWFnZTpmdW5jdGlvbigpe3ZhciBhPWIuaW1nUHJlbG9hZD1uZXcgSW1hZ2U7YS5vbmxvYWQ9ZnVuY3Rpb24oKXt0aGlzLm9ubG9hZD10aGlzLm9uZXJyb3I9bnVsbDtiLmNvbWluZy53aWR0aD0KdGhpcy53aWR0aDtiLmNvbWluZy5oZWlnaHQ9dGhpcy5oZWlnaHQ7Yi5fYWZ0ZXJMb2FkKCl9O2Eub25lcnJvcj1mdW5jdGlvbigpe3RoaXMub25sb2FkPXRoaXMub25lcnJvcj1udWxsO2IuX2Vycm9yKCJpbWFnZSIpfTthLnNyYz1iLmNvbWluZy5ocmVmOyEwIT09YS5jb21wbGV0ZSYmYi5zaG93TG9hZGluZygpfSxfbG9hZEFqYXg6ZnVuY3Rpb24oKXt2YXIgYT1iLmNvbWluZztiLnNob3dMb2FkaW5nKCk7Yi5hamF4TG9hZD1mLmFqYXgoZi5leHRlbmQoe30sYS5hamF4LHt1cmw6YS5ocmVmLGVycm9yOmZ1bmN0aW9uKGEsZSl7Yi5jb21pbmcmJiJhYm9ydCIhPT1lP2IuX2Vycm9yKCJhamF4IixhKTpiLmhpZGVMb2FkaW5nKCl9LHN1Y2Nlc3M6ZnVuY3Rpb24oZCxlKXsic3VjY2VzcyI9PT1lJiYoYS5jb250ZW50PWQsYi5fYWZ0ZXJMb2FkKCkpfX0pKX0sX2xvYWRJZnJhbWU6ZnVuY3Rpb24oKXt2YXIgYT1iLmNvbWluZyxkPWYoYS50cGwuaWZyYW1lLnJlcGxhY2UoL1x7cm5kXH0vZywKKG5ldyBEYXRlKS5nZXRUaW1lKCkpKS5hdHRyKCJzY3JvbGxpbmciLG4/ImF1dG8iOmEuaWZyYW1lLnNjcm9sbGluZykuYXR0cigic3JjIixhLmhyZWYpO2YoYS53cmFwKS5iaW5kKCJvblJlc2V0IixmdW5jdGlvbigpe3RyeXtmKHRoaXMpLmZpbmQoImlmcmFtZSIpLmhpZGUoKS5hdHRyKCJzcmMiLCIvL2Fib3V0OmJsYW5rIikuZW5kKCkuZW1wdHkoKX1jYXRjaChhKXt9fSk7YS5pZnJhbWUucHJlbG9hZCYmKGIuc2hvd0xvYWRpbmcoKSxkLm9uZSgibG9hZCIsZnVuY3Rpb24oKXtmKHRoaXMpLmRhdGEoInJlYWR5IiwxKTtufHxmKHRoaXMpLmJpbmQoImxvYWQuZmIiLGIudXBkYXRlKTtmKHRoaXMpLnBhcmVudHMoIi5mYW5jeWJveC13cmFwIikud2lkdGgoIjEwMCUiKS5yZW1vdmVDbGFzcygiZmFuY3lib3gtdG1wIikuc2hvdygpO2IuX2FmdGVyTG9hZCgpfSkpO2EuY29udGVudD1kLmFwcGVuZFRvKGEuaW5uZXIpO2EuaWZyYW1lLnByZWxvYWR8fGIuX2FmdGVyTG9hZCgpfSxfcHJlbG9hZEltYWdlczpmdW5jdGlvbigpe3ZhciBhPQpiLmdyb3VwLGQ9Yi5jdXJyZW50LGU9YS5sZW5ndGgsYz1kLnByZWxvYWQ/TWF0aC5taW4oZC5wcmVsb2FkLGUtMSk6MCxmLGc7Zm9yKGc9MTtnPD1jO2crPTEpZj1hWyhkLmluZGV4K2cpJWVdLCJpbWFnZSI9PT1mLnR5cGUmJmYuaHJlZiYmKChuZXcgSW1hZ2UpLnNyYz1mLmhyZWYpfSxfYWZ0ZXJMb2FkOmZ1bmN0aW9uKCl7dmFyIGE9Yi5jb21pbmcsZD1iLmN1cnJlbnQsZSxjLGosZyxoO2IuaGlkZUxvYWRpbmcoKTtpZihhJiYhMSE9PWIuaXNBY3RpdmUpaWYoITE9PT1iLnRyaWdnZXIoImFmdGVyTG9hZCIsYSxkKSlhLndyYXAuc3RvcCghMCkudHJpZ2dlcigib25SZXNldCIpLnJlbW92ZSgpLGIuY29taW5nPW51bGw7ZWxzZXtkJiYoYi50cmlnZ2VyKCJiZWZvcmVDaGFuZ2UiLGQpLGQud3JhcC5zdG9wKCEwKS5yZW1vdmVDbGFzcygiZmFuY3lib3gtb3BlbmVkIikuZmluZCgiLmZhbmN5Ym94LWl0ZW0sIC5mYW5jeWJveC1uYXYiKS5yZW1vdmUoKSk7Yi51bmJpbmRFdmVudHMoKTsKZT1hLmNvbnRlbnQ7Yz1hLnR5cGU7aj1hLnNjcm9sbGluZztmLmV4dGVuZChiLHt3cmFwOmEud3JhcCxza2luOmEuc2tpbixvdXRlcjphLm91dGVyLGlubmVyOmEuaW5uZXIsY3VycmVudDphLHByZXZpb3VzOmR9KTtnPWEuaHJlZjtzd2l0Y2goYyl7Y2FzZSAiaW5saW5lIjpjYXNlICJhamF4IjpjYXNlICJodG1sIjphLnNlbGVjdG9yP2U9ZigiPGRpdj4iKS5odG1sKGUpLmZpbmQoYS5zZWxlY3Rvcik6cyhlKSYmKGUuZGF0YSgiZmFuY3lib3gtcGxhY2Vob2xkZXIiKXx8ZS5kYXRhKCJmYW5jeWJveC1wbGFjZWhvbGRlciIsZignPGRpdiBjbGFzcz0iZmFuY3lib3gtcGxhY2Vob2xkZXIiPjwvZGl2PicpLmluc2VydEFmdGVyKGUpLmhpZGUoKSksZT1lLnNob3coKS5kZXRhY2goKSxhLndyYXAuYmluZCgib25SZXNldCIsZnVuY3Rpb24oKXtmKHRoaXMpLmZpbmQoZSkubGVuZ3RoJiZlLmhpZGUoKS5yZXBsYWNlQWxsKGUuZGF0YSgiZmFuY3lib3gtcGxhY2Vob2xkZXIiKSkuZGF0YSgiZmFuY3lib3gtcGxhY2Vob2xkZXIiLAohMSl9KSk7YnJlYWs7Y2FzZSAiaW1hZ2UiOmU9YS50cGwuaW1hZ2UucmVwbGFjZSgie2hyZWZ9IixnKTticmVhaztjYXNlICJzd2YiOmU9JzxvYmplY3QgaWQ9ImZhbmN5Ym94LXN3ZiIgY2xhc3NpZD0iY2xzaWQ6RDI3Q0RCNkUtQUU2RC0xMWNmLTk2QjgtNDQ0NTUzNTQwMDAwIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIj48cGFyYW0gbmFtZT0ibW92aWUiIHZhbHVlPSInK2crJyI+PC9wYXJhbT4nLGg9IiIsZi5lYWNoKGEuc3dmLGZ1bmN0aW9uKGEsYil7ZSs9JzxwYXJhbSBuYW1lPSInK2ErJyIgdmFsdWU9IicrYisnIj48L3BhcmFtPic7aCs9IiAiK2ErJz0iJytiKyciJ30pLGUrPSc8ZW1iZWQgc3JjPSInK2crJyIgdHlwZT0iYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiJytoKyI+PC9lbWJlZD48L29iamVjdD4ifSghcyhlKXx8IWUucGFyZW50KCkuaXMoYS5pbm5lcikpJiZhLmlubmVyLmFwcGVuZChlKTtiLnRyaWdnZXIoImJlZm9yZVNob3ciKTsKYS5pbm5lci5jc3MoIm92ZXJmbG93IiwieWVzIj09PWo/InNjcm9sbCI6Im5vIj09PWo/ImhpZGRlbiI6aik7Yi5fc2V0RGltZW5zaW9uKCk7Yi5yZXBvc2l0aW9uKCk7Yi5pc09wZW49ITE7Yi5jb21pbmc9bnVsbDtiLmJpbmRFdmVudHMoKTtpZihiLmlzT3BlbmVkKXtpZihkLnByZXZNZXRob2QpYi50cmFuc2l0aW9uc1tkLnByZXZNZXRob2RdKCl9ZWxzZSBmKCIuZmFuY3lib3gtd3JhcCIpLm5vdChhLndyYXApLnN0b3AoITApLnRyaWdnZXIoIm9uUmVzZXQiKS5yZW1vdmUoKTtiLnRyYW5zaXRpb25zW2IuaXNPcGVuZWQ/YS5uZXh0TWV0aG9kOmEub3Blbk1ldGhvZF0oKTtiLl9wcmVsb2FkSW1hZ2VzKCl9fSxfc2V0RGltZW5zaW9uOmZ1bmN0aW9uKCl7dmFyIGE9Yi5nZXRWaWV3cG9ydCgpLGQ9MCxlPSExLGM9ITEsZT1iLndyYXAsaj1iLnNraW4sZz1iLmlubmVyLGg9Yi5jdXJyZW50LGM9aC53aWR0aCxpPWguaGVpZ2h0LGw9aC5taW5XaWR0aCx0PWgubWluSGVpZ2h0LG09aC5tYXhXaWR0aCwKbj1oLm1heEhlaWdodCxyPWguc2Nyb2xsaW5nLHA9aC5zY3JvbGxPdXRzaWRlP2guc2Nyb2xsYmFyV2lkdGg6MCx3PWgubWFyZ2luLHk9ayh3WzFdK3dbM10pLHE9ayh3WzBdK3dbMl0pLHgseixzLEMsQSxGLEIsRCx1O2UuYWRkKGopLmFkZChnKS53aWR0aCgiYXV0byIpLmhlaWdodCgiYXV0byIpLnJlbW92ZUNsYXNzKCJmYW5jeWJveC10bXAiKTt3PWsoai5vdXRlcldpZHRoKCEwKS1qLndpZHRoKCkpO3g9ayhqLm91dGVySGVpZ2h0KCEwKS1qLmhlaWdodCgpKTt6PXkrdztzPXEreDtDPUUoYyk/KGEudy16KSprKGMpLzEwMDpjO0E9RShpKT8oYS5oLXMpKmsoaSkvMTAwOmk7aWYoImlmcmFtZSI9PT1oLnR5cGUpe2lmKHU9aC5jb250ZW50LGguYXV0b0hlaWdodCYmMT09PXUuZGF0YSgicmVhZHkiKSl0cnl7dVswXS5jb250ZW50V2luZG93LmRvY3VtZW50LmxvY2F0aW9uJiYoZy53aWR0aChDKS5oZWlnaHQoOTk5OSksRj11LmNvbnRlbnRzKCkuZmluZCgiYm9keSIpLHAmJkYuY3NzKCJvdmVyZmxvdy14IiwKImhpZGRlbiIpLEE9Ri5oZWlnaHQoKSl9Y2F0Y2goRyl7fX1lbHNlIGlmKGguYXV0b1dpZHRofHxoLmF1dG9IZWlnaHQpZy5hZGRDbGFzcygiZmFuY3lib3gtdG1wIiksaC5hdXRvV2lkdGh8fGcud2lkdGgoQyksaC5hdXRvSGVpZ2h0fHxnLmhlaWdodChBKSxoLmF1dG9XaWR0aCYmKEM9Zy53aWR0aCgpKSxoLmF1dG9IZWlnaHQmJihBPWcuaGVpZ2h0KCkpLGcucmVtb3ZlQ2xhc3MoImZhbmN5Ym94LXRtcCIpO2M9ayhDKTtpPWsoQSk7RD1DL0E7bD1rKEUobCk/ayhsLCJ3IiktejpsKTttPWsoRShtKT9rKG0sInciKS16Om0pO3Q9ayhFKHQpP2sodCwiaCIpLXM6dCk7bj1rKEUobik/ayhuLCJoIiktczpuKTtGPW07Qj1uO2guZml0VG9WaWV3JiYobT1NYXRoLm1pbihhLncteixtKSxuPU1hdGgubWluKGEuaC1zLG4pKTt6PWEudy15O3E9YS5oLXE7aC5hc3BlY3RSYXRpbz8oYz5tJiYoYz1tLGk9ayhjL0QpKSxpPm4mJihpPW4sYz1rKGkqRCkpLGM8bCYmKGM9bCxpPWsoYy9EKSksaTx0JiYKKGk9dCxjPWsoaSpEKSkpOihjPU1hdGgubWF4KGwsTWF0aC5taW4oYyxtKSksaC5hdXRvSGVpZ2h0JiYiaWZyYW1lIiE9PWgudHlwZSYmKGcud2lkdGgoYyksaT1nLmhlaWdodCgpKSxpPU1hdGgubWF4KHQsTWF0aC5taW4oaSxuKSkpO2lmKGguZml0VG9WaWV3KWlmKGcud2lkdGgoYykuaGVpZ2h0KGkpLGUud2lkdGgoYyt3KSxhPWUud2lkdGgoKSx5PWUuaGVpZ2h0KCksaC5hc3BlY3RSYXRpbylmb3IoOyhhPnp8fHk+cSkmJihjPmwmJmk+dCkmJiEoMTk8ZCsrKTspaT1NYXRoLm1heCh0LE1hdGgubWluKG4saS0xMCkpLGM9ayhpKkQpLGM8bCYmKGM9bCxpPWsoYy9EKSksYz5tJiYoYz1tLGk9ayhjL0QpKSxnLndpZHRoKGMpLmhlaWdodChpKSxlLndpZHRoKGMrdyksYT1lLndpZHRoKCkseT1lLmhlaWdodCgpO2Vsc2UgYz1NYXRoLm1heChsLE1hdGgubWluKGMsYy0oYS16KSkpLGk9TWF0aC5tYXgodCxNYXRoLm1pbihpLGktKHktcSkpKTtwJiYoImF1dG8iPT09ciYmaTxBJiZjK3crCnA8eikmJihjKz1wKTtnLndpZHRoKGMpLmhlaWdodChpKTtlLndpZHRoKGMrdyk7YT1lLndpZHRoKCk7eT1lLmhlaWdodCgpO2U9KGE+enx8eT5xKSYmYz5sJiZpPnQ7Yz1oLmFzcGVjdFJhdGlvP2M8RiYmaTxCJiZjPEMmJmk8QTooYzxGfHxpPEIpJiYoYzxDfHxpPEEpO2YuZXh0ZW5kKGgse2RpbTp7d2lkdGg6dihhKSxoZWlnaHQ6dih5KX0sb3JpZ1dpZHRoOkMsb3JpZ0hlaWdodDpBLGNhblNocmluazplLGNhbkV4cGFuZDpjLHdQYWRkaW5nOncsaFBhZGRpbmc6eCx3cmFwU3BhY2U6eS1qLm91dGVySGVpZ2h0KCEwKSxza2luU3BhY2U6ai5oZWlnaHQoKS1pfSk7IXUmJihoLmF1dG9IZWlnaHQmJmk+dCYmaTxuJiYhYykmJmcuaGVpZ2h0KCJhdXRvIil9LF9nZXRQb3NpdGlvbjpmdW5jdGlvbihhKXt2YXIgZD1iLmN1cnJlbnQsZT1iLmdldFZpZXdwb3J0KCksYz1kLm1hcmdpbixmPWIud3JhcC53aWR0aCgpK2NbMV0rY1szXSxnPWIud3JhcC5oZWlnaHQoKStjWzBdK2NbMl0sYz17cG9zaXRpb246ImFic29sdXRlIiwKdG9wOmNbMF0sbGVmdDpjWzNdfTtkLmF1dG9DZW50ZXImJmQuZml4ZWQmJiFhJiZnPD1lLmgmJmY8PWUudz9jLnBvc2l0aW9uPSJmaXhlZCI6ZC5sb2NrZWR8fChjLnRvcCs9ZS55LGMubGVmdCs9ZS54KTtjLnRvcD12KE1hdGgubWF4KGMudG9wLGMudG9wKyhlLmgtZykqZC50b3BSYXRpbykpO2MubGVmdD12KE1hdGgubWF4KGMubGVmdCxjLmxlZnQrKGUudy1mKSpkLmxlZnRSYXRpbykpO3JldHVybiBjfSxfYWZ0ZXJab29tSW46ZnVuY3Rpb24oKXt2YXIgYT1iLmN1cnJlbnQ7YSYmKGIuaXNPcGVuPWIuaXNPcGVuZWQ9ITAsYi53cmFwLmNzcygib3ZlcmZsb3ciLCJ2aXNpYmxlIikuYWRkQ2xhc3MoImZhbmN5Ym94LW9wZW5lZCIpLGIudXBkYXRlKCksKGEuY2xvc2VDbGlja3x8YS5uZXh0Q2xpY2smJjE8Yi5ncm91cC5sZW5ndGgpJiZiLmlubmVyLmNzcygiY3Vyc29yIiwicG9pbnRlciIpLmJpbmQoImNsaWNrLmZiIixmdW5jdGlvbihkKXshZihkLnRhcmdldCkuaXMoImEiKSYmIWYoZC50YXJnZXQpLnBhcmVudCgpLmlzKCJhIikmJgooZC5wcmV2ZW50RGVmYXVsdCgpLGJbYS5jbG9zZUNsaWNrPyJjbG9zZSI6Im5leHQiXSgpKX0pLGEuY2xvc2VCdG4mJmYoYS50cGwuY2xvc2VCdG4pLmFwcGVuZFRvKGIuc2tpbikuYmluZChuPyJ0b3VjaHN0YXJ0LmZiIjoiY2xpY2suZmIiLGZ1bmN0aW9uKGEpe2EucHJldmVudERlZmF1bHQoKTtiLmNsb3NlKCl9KSxhLmFycm93cyYmMTxiLmdyb3VwLmxlbmd0aCYmKChhLmxvb3B8fDA8YS5pbmRleCkmJmYoYS50cGwucHJldikuYXBwZW5kVG8oYi5vdXRlcikuYmluZCgiY2xpY2suZmIiLGIucHJldiksKGEubG9vcHx8YS5pbmRleDxiLmdyb3VwLmxlbmd0aC0xKSYmZihhLnRwbC5uZXh0KS5hcHBlbmRUbyhiLm91dGVyKS5iaW5kKCJjbGljay5mYiIsYi5uZXh0KSksYi50cmlnZ2VyKCJhZnRlclNob3ciKSwhYS5sb29wJiZhLmluZGV4PT09YS5ncm91cC5sZW5ndGgtMT9iLnBsYXkoITEpOmIub3B0cy5hdXRvUGxheSYmIWIucGxheWVyLmlzQWN0aXZlJiYoYi5vcHRzLmF1dG9QbGF5PQohMSxiLnBsYXkoKSkpfSxfYWZ0ZXJab29tT3V0OmZ1bmN0aW9uKGEpe2E9YXx8Yi5jdXJyZW50O2YoIi5mYW5jeWJveC13cmFwIikudHJpZ2dlcigib25SZXNldCIpLnJlbW92ZSgpO2YuZXh0ZW5kKGIse2dyb3VwOnt9LG9wdHM6e30scm91dGVyOiExLGN1cnJlbnQ6bnVsbCxpc0FjdGl2ZTohMSxpc09wZW5lZDohMSxpc09wZW46ITEsaXNDbG9zaW5nOiExLHdyYXA6bnVsbCxza2luOm51bGwsb3V0ZXI6bnVsbCxpbm5lcjpudWxsfSk7Yi50cmlnZ2VyKCJhZnRlckNsb3NlIixhKX19KTtiLnRyYW5zaXRpb25zPXtnZXRPcmlnUG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgYT1iLmN1cnJlbnQsZD1hLmVsZW1lbnQsZT1hLm9yaWcsYz17fSxmPTUwLGc9NTAsaD1hLmhQYWRkaW5nLGk9YS53UGFkZGluZyxsPWIuZ2V0Vmlld3BvcnQoKTshZSYmKGEuaXNEb20mJmQuaXMoIjp2aXNpYmxlIikpJiYoZT1kLmZpbmQoImltZzpmaXJzdCIpLGUubGVuZ3RofHwoZT1kKSk7cyhlKT8oYz1lLm9mZnNldCgpLAplLmlzKCJpbWciKSYmKGY9ZS5vdXRlcldpZHRoKCksZz1lLm91dGVySGVpZ2h0KCkpKTooYy50b3A9bC55KyhsLmgtZykqYS50b3BSYXRpbyxjLmxlZnQ9bC54KyhsLnctZikqYS5sZWZ0UmF0aW8pO2lmKCJmaXhlZCI9PT1iLndyYXAuY3NzKCJwb3NpdGlvbiIpfHxhLmxvY2tlZCljLnRvcC09bC55LGMubGVmdC09bC54O3JldHVybiBjPXt0b3A6dihjLnRvcC1oKmEudG9wUmF0aW8pLGxlZnQ6dihjLmxlZnQtaSphLmxlZnRSYXRpbyksd2lkdGg6dihmK2kpLGhlaWdodDp2KGcraCl9fSxzdGVwOmZ1bmN0aW9uKGEsZCl7dmFyIGUsYyxmPWQucHJvcDtjPWIuY3VycmVudDt2YXIgZz1jLndyYXBTcGFjZSxoPWMuc2tpblNwYWNlO2lmKCJ3aWR0aCI9PT1mfHwiaGVpZ2h0Ij09PWYpZT1kLmVuZD09PWQuc3RhcnQ/MTooYS1kLnN0YXJ0KS8oZC5lbmQtZC5zdGFydCksYi5pc0Nsb3NpbmcmJihlPTEtZSksYz0id2lkdGgiPT09Zj9jLndQYWRkaW5nOmMuaFBhZGRpbmcsYz1hLWMsYi5za2luW2ZdKGsoIndpZHRoIj09PQpmP2M6Yy1nKmUpKSxiLmlubmVyW2ZdKGsoIndpZHRoIj09PWY/YzpjLWcqZS1oKmUpKX0sem9vbUluOmZ1bmN0aW9uKCl7dmFyIGE9Yi5jdXJyZW50LGQ9YS5wb3MsZT1hLm9wZW5FZmZlY3QsYz0iZWxhc3RpYyI9PT1lLGo9Zi5leHRlbmQoe29wYWNpdHk6MX0sZCk7ZGVsZXRlIGoucG9zaXRpb247Yz8oZD10aGlzLmdldE9yaWdQb3NpdGlvbigpLGEub3Blbk9wYWNpdHkmJihkLm9wYWNpdHk9MC4xKSk6ImZhZGUiPT09ZSYmKGQub3BhY2l0eT0wLjEpO2Iud3JhcC5jc3MoZCkuYW5pbWF0ZShqLHtkdXJhdGlvbjoibm9uZSI9PT1lPzA6YS5vcGVuU3BlZWQsZWFzaW5nOmEub3BlbkVhc2luZyxzdGVwOmM/dGhpcy5zdGVwOm51bGwsY29tcGxldGU6Yi5fYWZ0ZXJab29tSW59KX0sem9vbU91dDpmdW5jdGlvbigpe3ZhciBhPWIuY3VycmVudCxkPWEuY2xvc2VFZmZlY3QsZT0iZWxhc3RpYyI9PT1kLGM9e29wYWNpdHk6MC4xfTtlJiYoYz10aGlzLmdldE9yaWdQb3NpdGlvbigpLGEuY2xvc2VPcGFjaXR5JiYKKGMub3BhY2l0eT0wLjEpKTtiLndyYXAuYW5pbWF0ZShjLHtkdXJhdGlvbjoibm9uZSI9PT1kPzA6YS5jbG9zZVNwZWVkLGVhc2luZzphLmNsb3NlRWFzaW5nLHN0ZXA6ZT90aGlzLnN0ZXA6bnVsbCxjb21wbGV0ZTpiLl9hZnRlclpvb21PdXR9KX0sY2hhbmdlSW46ZnVuY3Rpb24oKXt2YXIgYT1iLmN1cnJlbnQsZD1hLm5leHRFZmZlY3QsZT1hLnBvcyxjPXtvcGFjaXR5OjF9LGY9Yi5kaXJlY3Rpb24sZztlLm9wYWNpdHk9MC4xOyJlbGFzdGljIj09PWQmJihnPSJkb3duIj09PWZ8fCJ1cCI9PT1mPyJ0b3AiOiJsZWZ0IiwiZG93biI9PT1mfHwicmlnaHQiPT09Zj8oZVtnXT12KGsoZVtnXSktMjAwKSxjW2ddPSIrPTIwMHB4Iik6KGVbZ109dihrKGVbZ10pKzIwMCksY1tnXT0iLT0yMDBweCIpKTsibm9uZSI9PT1kP2IuX2FmdGVyWm9vbUluKCk6Yi53cmFwLmNzcyhlKS5hbmltYXRlKGMse2R1cmF0aW9uOmEubmV4dFNwZWVkLGVhc2luZzphLm5leHRFYXNpbmcsY29tcGxldGU6ZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGIuX2FmdGVyWm9vbUluLAoyMCl9fSl9LGNoYW5nZU91dDpmdW5jdGlvbigpe3ZhciBhPWIucHJldmlvdXMsZD1hLnByZXZFZmZlY3QsZT17b3BhY2l0eTowLjF9LGM9Yi5kaXJlY3Rpb247ImVsYXN0aWMiPT09ZCYmKGVbImRvd24iPT09Y3x8InVwIj09PWM/InRvcCI6ImxlZnQiXT0oInVwIj09PWN8fCJsZWZ0Ij09PWM/Ii0iOiIrIikrIj0yMDBweCIpO2Eud3JhcC5hbmltYXRlKGUse2R1cmF0aW9uOiJub25lIj09PWQ/MDphLnByZXZTcGVlZCxlYXNpbmc6YS5wcmV2RWFzaW5nLGNvbXBsZXRlOmZ1bmN0aW9uKCl7Zih0aGlzKS50cmlnZ2VyKCJvblJlc2V0IikucmVtb3ZlKCl9fSl9fTtiLmhlbHBlcnMub3ZlcmxheT17ZGVmYXVsdHM6e2Nsb3NlQ2xpY2s6ITAsc3BlZWRPdXQ6MjAwLHNob3dFYXJseTohMCxjc3M6e30sbG9ja2VkOiFuLGZpeGVkOiEwfSxvdmVybGF5Om51bGwsZml4ZWQ6ITEsY3JlYXRlOmZ1bmN0aW9uKGEpe2E9Zi5leHRlbmQoe30sdGhpcy5kZWZhdWx0cyxhKTt0aGlzLm92ZXJsYXkmJnRoaXMuY2xvc2UoKTsKdGhpcy5vdmVybGF5PWYoJzxkaXYgY2xhc3M9ImZhbmN5Ym94LW92ZXJsYXkiPjwvZGl2PicpLmFwcGVuZFRvKCJib2R5Iik7dGhpcy5maXhlZD0hMTthLmZpeGVkJiZiLmRlZmF1bHRzLmZpeGVkJiYodGhpcy5vdmVybGF5LmFkZENsYXNzKCJmYW5jeWJveC1vdmVybGF5LWZpeGVkIiksdGhpcy5maXhlZD0hMCl9LG9wZW46ZnVuY3Rpb24oYSl7dmFyIGQ9dGhpcyxhPWYuZXh0ZW5kKHt9LHRoaXMuZGVmYXVsdHMsYSk7dGhpcy5vdmVybGF5P3RoaXMub3ZlcmxheS51bmJpbmQoIi5vdmVybGF5Iikud2lkdGgoImF1dG8iKS5oZWlnaHQoImF1dG8iKTp0aGlzLmNyZWF0ZShhKTt0aGlzLmZpeGVkfHwoci5iaW5kKCJyZXNpemUub3ZlcmxheSIsZi5wcm94eSh0aGlzLnVwZGF0ZSx0aGlzKSksdGhpcy51cGRhdGUoKSk7YS5jbG9zZUNsaWNrJiZ0aGlzLm92ZXJsYXkuYmluZCgiY2xpY2sub3ZlcmxheSIsZnVuY3Rpb24oYSl7ZihhLnRhcmdldCkuaGFzQ2xhc3MoImZhbmN5Ym94LW92ZXJsYXkiKSYmCihiLmlzQWN0aXZlP2IuY2xvc2UoKTpkLmNsb3NlKCkpfSk7dGhpcy5vdmVybGF5LmNzcyhhLmNzcykuc2hvdygpfSxjbG9zZTpmdW5jdGlvbigpe2YoIi5mYW5jeWJveC1vdmVybGF5IikucmVtb3ZlKCk7ci51bmJpbmQoInJlc2l6ZS5vdmVybGF5Iik7dGhpcy5vdmVybGF5PW51bGw7ITEhPT10aGlzLm1hcmdpbiYmKGYoImJvZHkiKS5jc3MoIm1hcmdpbi1yaWdodCIsdGhpcy5tYXJnaW4pLHRoaXMubWFyZ2luPSExKTt0aGlzLmVsJiZ0aGlzLmVsLnJlbW92ZUNsYXNzKCJmYW5jeWJveC1sb2NrIil9LHVwZGF0ZTpmdW5jdGlvbigpe3ZhciBhPSIxMDAlIixiO3RoaXMub3ZlcmxheS53aWR0aChhKS5oZWlnaHQoIjEwMCUiKTtmLmJyb3dzZXIubXNpZT8oYj1NYXRoLm1heCh4LmRvY3VtZW50RWxlbWVudC5vZmZzZXRXaWR0aCx4LmJvZHkub2Zmc2V0V2lkdGgpLG0ud2lkdGgoKT5iJiYoYT1tLndpZHRoKCkpKTptLndpZHRoKCk+ci53aWR0aCgpJiYoYT1tLndpZHRoKCkpO3RoaXMub3ZlcmxheS53aWR0aChhKS5oZWlnaHQobS5oZWlnaHQoKSl9LApvblJlYWR5OmZ1bmN0aW9uKGEsYil7ZigiLmZhbmN5Ym94LW92ZXJsYXkiKS5zdG9wKCEwLCEwKTt0aGlzLm92ZXJsYXl8fCh0aGlzLm1hcmdpbj1tLmhlaWdodCgpPnIuaGVpZ2h0KCl8fCJzY3JvbGwiPT09ZigiYm9keSIpLmNzcygib3ZlcmZsb3cteSIpP2YoImJvZHkiKS5jc3MoIm1hcmdpbi1yaWdodCIpOiExLHRoaXMuZWw9eC5hbGwmJiF4LnF1ZXJ5U2VsZWN0b3I/ZigiaHRtbCIpOmYoImJvZHkiKSx0aGlzLmNyZWF0ZShhKSk7YS5sb2NrZWQmJnRoaXMuZml4ZWQmJihiLmxvY2tlZD10aGlzLm92ZXJsYXkuYXBwZW5kKGIud3JhcCksYi5maXhlZD0hMSk7ITA9PT1hLnNob3dFYXJseSYmdGhpcy5iZWZvcmVTaG93LmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sYmVmb3JlU2hvdzpmdW5jdGlvbihhLGIpe2IubG9ja2VkJiYodGhpcy5lbC5hZGRDbGFzcygiZmFuY3lib3gtbG9jayIpLCExIT09dGhpcy5tYXJnaW4mJmYoImJvZHkiKS5jc3MoIm1hcmdpbi1yaWdodCIsayh0aGlzLm1hcmdpbikrCmIuc2Nyb2xsYmFyV2lkdGgpKTt0aGlzLm9wZW4oYSl9LG9uVXBkYXRlOmZ1bmN0aW9uKCl7dGhpcy5maXhlZHx8dGhpcy51cGRhdGUoKX0sYWZ0ZXJDbG9zZTpmdW5jdGlvbihhKXt0aGlzLm92ZXJsYXkmJiFiLmlzQWN0aXZlJiZ0aGlzLm92ZXJsYXkuZmFkZU91dChhLnNwZWVkT3V0LGYucHJveHkodGhpcy5jbG9zZSx0aGlzKSl9fTtiLmhlbHBlcnMudGl0bGU9e2RlZmF1bHRzOnt0eXBlOiJmbG9hdCIscG9zaXRpb246ImJvdHRvbSJ9LGJlZm9yZVNob3c6ZnVuY3Rpb24oYSl7dmFyIGQ9Yi5jdXJyZW50LGU9ZC50aXRsZSxjPWEudHlwZTtmLmlzRnVuY3Rpb24oZSkmJihlPWUuY2FsbChkLmVsZW1lbnQsZCkpO2lmKHAoZSkmJiIiIT09Zi50cmltKGUpKXtkPWYoJzxkaXYgY2xhc3M9ImZhbmN5Ym94LXRpdGxlIGZhbmN5Ym94LXRpdGxlLScrYysnLXdyYXAiPicrZSsiPC9kaXY+Iik7c3dpdGNoKGMpe2Nhc2UgImluc2lkZSI6Yz1iLnNraW47YnJlYWs7Y2FzZSAib3V0c2lkZSI6Yz0KYi53cmFwO2JyZWFrO2Nhc2UgIm92ZXIiOmM9Yi5pbm5lcjticmVhaztkZWZhdWx0OmM9Yi5za2luLGQuYXBwZW5kVG8oImJvZHkiKSxmLmJyb3dzZXIubXNpZSYmZC53aWR0aChkLndpZHRoKCkpLGQud3JhcElubmVyKCc8c3BhbiBjbGFzcz0iY2hpbGQiPjwvc3Bhbj4nKSxiLmN1cnJlbnQubWFyZ2luWzJdKz1NYXRoLmFicyhrKGQuY3NzKCJtYXJnaW4tYm90dG9tIikpKX1kWyJ0b3AiPT09YS5wb3NpdGlvbj8icHJlcGVuZFRvIjoiYXBwZW5kVG8iXShjKX19fTtmLmZuLmZhbmN5Ym94PWZ1bmN0aW9uKGEpe3ZhciBkLGU9Zih0aGlzKSxjPXRoaXMuc2VsZWN0b3J8fCIiLGo9ZnVuY3Rpb24oZyl7dmFyIGg9Zih0aGlzKS5ibHVyKCksaT1kLGosazshZy5jdHJsS2V5JiYoIWcuYWx0S2V5JiYhZy5zaGlmdEtleSYmIWcubWV0YUtleSkmJiFoLmlzKCIuZmFuY3lib3gtd3JhcCIpJiYoaj1hLmdyb3VwQXR0cnx8ImRhdGEtZmFuY3lib3gtZ3JvdXAiLGs9aC5hdHRyKGopLGt8fChqPSJyZWwiLAprPWguZ2V0KDApW2pdKSxrJiYoIiIhPT1rJiYibm9mb2xsb3ciIT09aykmJihoPWMubGVuZ3RoP2YoYyk6ZSxoPWguZmlsdGVyKCJbIitqKyc9IicraysnIl0nKSxpPWguaW5kZXgodGhpcykpLGEuaW5kZXg9aSwhMSE9PWIub3BlbihoLGEpJiZnLnByZXZlbnREZWZhdWx0KCkpfSxhPWF8fHt9O2Q9YS5pbmRleHx8MDshY3x8ITE9PT1hLmxpdmU/ZS51bmJpbmQoImNsaWNrLmZiLXN0YXJ0IikuYmluZCgiY2xpY2suZmItc3RhcnQiLGopOm0udW5kZWxlZ2F0ZShjLCJjbGljay5mYi1zdGFydCIpLmRlbGVnYXRlKGMrIjpub3QoJy5mYW5jeWJveC1pdGVtLCAuZmFuY3lib3gtbmF2JykiLCJjbGljay5mYi1zdGFydCIsaik7dGhpcy5maWx0ZXIoIltkYXRhLWZhbmN5Ym94LXN0YXJ0PTFdIikudHJpZ2dlcigiY2xpY2siKTtyZXR1cm4gdGhpc307bS5yZWFkeShmdW5jdGlvbigpe2Yuc2Nyb2xsYmFyV2lkdGg9PT1xJiYoZi5zY3JvbGxiYXJXaWR0aD1mdW5jdGlvbigpe3ZhciBhPWYoJzxkaXYgc3R5bGU9IndpZHRoOjUwcHg7aGVpZ2h0OjUwcHg7b3ZlcmZsb3c6YXV0byI+PGRpdi8+PC9kaXY+JykuYXBwZW5kVG8oImJvZHkiKSwKYj1hLmNoaWxkcmVuKCksYj1iLmlubmVyV2lkdGgoKS1iLmhlaWdodCg5OSkuaW5uZXJXaWR0aCgpO2EucmVtb3ZlKCk7cmV0dXJuIGJ9KTtpZihmLnN1cHBvcnQuZml4ZWRQb3NpdGlvbj09PXEpe3ZhciBhPWYuc3VwcG9ydCxkPWYoJzxkaXYgc3R5bGU9InBvc2l0aW9uOmZpeGVkO3RvcDoyMHB4OyI+PC9kaXY+JykuYXBwZW5kVG8oImJvZHkiKSxlPTIwPT09ZFswXS5vZmZzZXRUb3B8fDE1PT09ZFswXS5vZmZzZXRUb3A7ZC5yZW1vdmUoKTthLmZpeGVkUG9zaXRpb249ZX1mLmV4dGVuZChiLmRlZmF1bHRzLHtzY3JvbGxiYXJXaWR0aDpmLnNjcm9sbGJhcldpZHRoKCksZml4ZWQ6Zi5zdXBwb3J0LmZpeGVkUG9zaXRpb24scGFyZW50OmYoImJvZHkiKX0pfSl9KSh3aW5kb3csZG9jdW1lbnQsalF1ZXJ5KTs=]]></data>
	</file>
	<file>
	  <filename>/lib/fancybox.lib/jquery.mousewheel-3.0.6.pack.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohIENvcHlyaWdodCAoYykgMjAxMSBCcmFuZG9uIEFhcm9uIChodHRwOi8vYnJhbmRvbmFhcm9uLm5ldCkKICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlIChMSUNFTlNFLnR4dCkuCiAqCiAqIFRoYW5rcyB0bzogaHR0cDovL2Fkb21hcy5vcmcvamF2YXNjcmlwdC1tb3VzZS13aGVlbC8gZm9yIHNvbWUgcG9pbnRlcnMuCiAqIFRoYW5rcyB0bzogTWF0aGlhcyBCYW5rKGh0dHA6Ly93d3cubWF0aGlhcy1iYW5rLmRlKSBmb3IgYSBzY29wZSBidWcgZml4LgogKiBUaGFua3MgdG86IFNlYW11cyBMZWFoeSBmb3IgYWRkaW5nIGRlbHRhWCBhbmQgZGVsdGFZCiAqCiAqIFZlcnNpb246IDMuMC42CiAqIAogKiBSZXF1aXJlczogMS4yLjIrCiAqLwooZnVuY3Rpb24oZCl7ZnVuY3Rpb24gZShhKXt2YXIgYj1hfHx3aW5kb3cuZXZlbnQsYz1bXS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSxmPTAsZT0wLGc9MCxhPWQuZXZlbnQuZml4KGIpO2EudHlwZT0ibW91c2V3aGVlbCI7Yi53aGVlbERlbHRhJiYoZj1iLndoZWVsRGVsdGEvMTIwKTtiLmRldGFpbCYmKGY9LWIuZGV0YWlsLzMpO2c9ZjtiLmF4aXMhPT12b2lkIDAmJmIuYXhpcz09PWIuSE9SSVpPTlRBTF9BWElTJiYoZz0wLGU9LTEqZik7Yi53aGVlbERlbHRhWSE9PXZvaWQgMCYmKGc9Yi53aGVlbERlbHRhWS8xMjApO2Iud2hlZWxEZWx0YVghPT12b2lkIDAmJihlPS0xKmIud2hlZWxEZWx0YVgvMTIwKTtjLnVuc2hpZnQoYSxmLGUsZyk7cmV0dXJuKGQuZXZlbnQuZGlzcGF0Y2h8fGQuZXZlbnQuaGFuZGxlKS5hcHBseSh0aGlzLGMpfXZhciBjPVsiRE9NTW91c2VTY3JvbGwiLCJtb3VzZXdoZWVsIl07aWYoZC5ldmVudC5maXhIb29rcylmb3IodmFyIGg9Yy5sZW5ndGg7aDspZC5ldmVudC5maXhIb29rc1tjWy0taF1dPQpkLmV2ZW50Lm1vdXNlSG9va3M7ZC5ldmVudC5zcGVjaWFsLm1vdXNld2hlZWw9e3NldHVwOmZ1bmN0aW9uKCl7aWYodGhpcy5hZGRFdmVudExpc3RlbmVyKWZvcih2YXIgYT1jLmxlbmd0aDthOyl0aGlzLmFkZEV2ZW50TGlzdGVuZXIoY1stLWFdLGUsZmFsc2UpO2Vsc2UgdGhpcy5vbm1vdXNld2hlZWw9ZX0sdGVhcmRvd246ZnVuY3Rpb24oKXtpZih0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIpZm9yKHZhciBhPWMubGVuZ3RoO2E7KXRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihjWy0tYV0sZSxmYWxzZSk7ZWxzZSB0aGlzLm9ubW91c2V3aGVlbD1udWxsfX07ZC5mbi5leHRlbmQoe21vdXNld2hlZWw6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5iaW5kKCJtb3VzZXdoZWVsIixhKTp0aGlzLnRyaWdnZXIoIm1vdXNld2hlZWwiKX0sdW5tb3VzZXdoZWVsOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnVuYmluZCgibW91c2V3aGVlbCIsYSl9fSl9KShqUXVlcnkpOw==]]></data>
	</file>
	<file>
	  <filename>/lib/fileupload.lib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/fileupload.lib/info.dat</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGluZm9bJ2pzJ10gPSBhcnJheSgnanMvanF1ZXJ5LmlmcmFtZS10cmFuc3BvcnQuanMnLCdqcy9qcXVlcnkuZmlsZXVwbG9hZC5qcycpOwokaW5mb1snZGVwZW5kcyddID0gYXJyYXkoJ2pxdWVyeScsJ3VpJyk7Cj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/fileupload.lib/js/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/fileupload.lib/js/cors/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/fileupload.lib/js/cors/jquery.postmessage-transport.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKICogalF1ZXJ5IHBvc3RNZXNzYWdlIFRyYW5zcG9ydCBQbHVnaW4gMS4xCiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ibHVlaW1wL2pRdWVyeS1GaWxlLVVwbG9hZAogKgogKiBDb3B5cmlnaHQgMjAxMSwgU2ViYXN0aWFuIFRzY2hhbgogKiBodHRwczovL2JsdWVpbXAubmV0CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZToKICogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQKICovCgovKmpzbGludCB1bnBhcmFtOiB0cnVlLCBub21lbjogdHJ1ZSAqLwovKmdsb2JhbCBkZWZpbmUsIHdpbmRvdywgZG9jdW1lbnQgKi8KCihmdW5jdGlvbiAoZmFjdG9yeSkgewogICAgJ3VzZSBzdHJpY3QnOwogICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkgewogICAgICAgIC8vIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBBTUQgbW9kdWxlOgogICAgICAgIGRlZmluZShbJ2pxdWVyeSddLCBmYWN0b3J5KTsKICAgIH0gZWxzZSB7CiAgICAgICAgLy8gQnJvd3NlciBnbG9iYWxzOgogICAgICAgIGZhY3Rvcnkod2luZG93LmpRdWVyeSk7CiAgICB9Cn0oZnVuY3Rpb24gKCQpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICB2YXIgY291bnRlciA9IDAsCiAgICAgICAgbmFtZXMgPSBbCiAgICAgICAgICAgICdhY2NlcHRzJywKICAgICAgICAgICAgJ2NhY2hlJywKICAgICAgICAgICAgJ2NvbnRlbnRzJywKICAgICAgICAgICAgJ2NvbnRlbnRUeXBlJywKICAgICAgICAgICAgJ2Nyb3NzRG9tYWluJywKICAgICAgICAgICAgJ2RhdGEnLAogICAgICAgICAgICAnZGF0YVR5cGUnLAogICAgICAgICAgICAnaGVhZGVycycsCiAgICAgICAgICAgICdpZk1vZGlmaWVkJywKICAgICAgICAgICAgJ21pbWVUeXBlJywKICAgICAgICAgICAgJ3Bhc3N3b3JkJywKICAgICAgICAgICAgJ3Byb2Nlc3NEYXRhJywKICAgICAgICAgICAgJ3RpbWVvdXQnLAogICAgICAgICAgICAndHJhZGl0aW9uYWwnLAogICAgICAgICAgICAndHlwZScsCiAgICAgICAgICAgICd1cmwnLAogICAgICAgICAgICAndXNlcm5hbWUnCiAgICAgICAgXSwKICAgICAgICBjb252ZXJ0ID0gZnVuY3Rpb24gKHApIHsKICAgICAgICAgICAgcmV0dXJuIHA7CiAgICAgICAgfTsKCiAgICAkLmFqYXhTZXR1cCh7CiAgICAgICAgY29udmVydGVyczogewogICAgICAgICAgICAncG9zdG1lc3NhZ2UgdGV4dCc6IGNvbnZlcnQsCiAgICAgICAgICAgICdwb3N0bWVzc2FnZSBqc29uJzogY29udmVydCwKICAgICAgICAgICAgJ3Bvc3RtZXNzYWdlIGh0bWwnOiBjb252ZXJ0CiAgICAgICAgfQogICAgfSk7CgogICAgJC5hamF4VHJhbnNwb3J0KCdwb3N0bWVzc2FnZScsIGZ1bmN0aW9uIChvcHRpb25zKSB7CiAgICAgICAgaWYgKG9wdGlvbnMucG9zdE1lc3NhZ2UgJiYgd2luZG93LnBvc3RNZXNzYWdlKSB7CiAgICAgICAgICAgIHZhciBpZnJhbWUsCiAgICAgICAgICAgICAgICBsb2MgPSAkKCc8YT4nKS5wcm9wKCdocmVmJywgb3B0aW9ucy5wb3N0TWVzc2FnZSlbMF0sCiAgICAgICAgICAgICAgICB0YXJnZXQgPSBsb2MucHJvdG9jb2wgKyAnLy8nICsgbG9jLmhvc3QsCiAgICAgICAgICAgICAgICB4aHJVcGxvYWQgPSBvcHRpb25zLnhocigpLnVwbG9hZDsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIHNlbmQ6IGZ1bmN0aW9uIChfLCBjb21wbGV0ZUNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogJ3Bvc3RtZXNzYWdlLXRyYW5zcG9ydC0nICsgKGNvdW50ZXIgKz0gMSkKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnROYW1lID0gJ21lc3NhZ2UuJyArIG1lc3NhZ2UuaWQ7CiAgICAgICAgICAgICAgICAgICAgaWZyYW1lID0gJCgKICAgICAgICAgICAgICAgICAgICAgICAgJzxpZnJhbWUgc3R5bGU9ImRpc3BsYXk6bm9uZTsiIHNyYz0iJyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnBvc3RNZXNzYWdlICsgJyIgbmFtZT0iJyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmlkICsgJyI+PC9pZnJhbWU+JwogICAgICAgICAgICAgICAgICAgICkuYmluZCgnbG9hZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKG5hbWVzLCBmdW5jdGlvbiAoaSwgbmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVtuYW1lXSA9IG9wdGlvbnNbbmFtZV07CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmRhdGFUeXBlID0gbWVzc2FnZS5kYXRhVHlwZS5yZXBsYWNlKCdwb3N0bWVzc2FnZSAnLCAnJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICQod2luZG93KS5iaW5kKGV2ZW50TmFtZSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBlLm9yaWdpbmFsRXZlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IGUuZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLm9yaWdpbiA9PT0gdGFyZ2V0ICYmIGRhdGEuaWQgPT09IG1lc3NhZ2UuaWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS50eXBlID09PSAncHJvZ3Jlc3MnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2LmluaXRFdmVudChkYXRhLnR5cGUsIGZhbHNlLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJC5leHRlbmQoZXYsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4aHJVcGxvYWQuZGlzcGF0Y2hFdmVudChldik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVDYWxsYmFjaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuc3RhdHVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5zdGF0dXNUZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3Bvc3RtZXNzYWdlOiBkYXRhLnJlc3VsdH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmhlYWRlcnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZyYW1lLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHdpbmRvdykudW5iaW5kKGV2ZW50TmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgaWZyYW1lWzBdLmNvbnRlbnRXaW5kb3cucG9zdE1lc3NhZ2UoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0CiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfSkuYXBwZW5kVG8oZG9jdW1lbnQuYm9keSk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgYWJvcnQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaWZyYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmcmFtZS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfSk7Cgp9KSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/fileupload.lib/js/cors/jquery.xdr-transport.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKICogalF1ZXJ5IFhEb21haW5SZXF1ZXN0IFRyYW5zcG9ydCBQbHVnaW4gMS4xLjIKICogaHR0cHM6Ly9naXRodWIuY29tL2JsdWVpbXAvalF1ZXJ5LUZpbGUtVXBsb2FkCiAqCiAqIENvcHlyaWdodCAyMDExLCBTZWJhc3RpYW4gVHNjaGFuCiAqIGh0dHBzOi8vYmx1ZWltcC5uZXQKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlOgogKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVAogKgogKiBCYXNlZCBvbiBKdWxpYW4gQXVib3VyZydzIGFqYXhIb29rcyB4ZHIuanM6CiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9qYXVib3VyZy9hamF4SG9va3MvCiAqLwoKLypqc2xpbnQgdW5wYXJhbTogdHJ1ZSAqLwovKmdsb2JhbCBkZWZpbmUsIHdpbmRvdywgWERvbWFpblJlcXVlc3QgKi8KCihmdW5jdGlvbiAoZmFjdG9yeSkgewogICAgJ3VzZSBzdHJpY3QnOwogICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkgewogICAgICAgIC8vIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBBTUQgbW9kdWxlOgogICAgICAgIGRlZmluZShbJ2pxdWVyeSddLCBmYWN0b3J5KTsKICAgIH0gZWxzZSB7CiAgICAgICAgLy8gQnJvd3NlciBnbG9iYWxzOgogICAgICAgIGZhY3Rvcnkod2luZG93LmpRdWVyeSk7CiAgICB9Cn0oZnVuY3Rpb24gKCQpIHsKICAgICd1c2Ugc3RyaWN0JzsKICAgIGlmICh3aW5kb3cuWERvbWFpblJlcXVlc3QgJiYgISQuc3VwcG9ydC5jb3JzKSB7CiAgICAgICAgJC5hamF4VHJhbnNwb3J0KGZ1bmN0aW9uIChzKSB7CiAgICAgICAgICAgIGlmIChzLmNyb3NzRG9tYWluICYmIHMuYXN5bmMpIHsKICAgICAgICAgICAgICAgIGlmIChzLnRpbWVvdXQpIHsKICAgICAgICAgICAgICAgICAgICBzLnhkclRpbWVvdXQgPSBzLnRpbWVvdXQ7CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHMudGltZW91dDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciB4ZHI7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHNlbmQ6IGZ1bmN0aW9uIChoZWFkZXJzLCBjb21wbGV0ZUNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGNhbGxiYWNrKHN0YXR1cywgc3RhdHVzVGV4dCwgcmVzcG9uc2VzLCByZXNwb25zZUhlYWRlcnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhkci5vbmxvYWQgPSB4ZHIub25lcnJvciA9IHhkci5vbnRpbWVvdXQgPSAkLm5vb3A7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ZHIgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVDYWxsYmFjayhzdGF0dXMsIHN0YXR1c1RleHQsIHJlc3BvbnNlcywgcmVzcG9uc2VIZWFkZXJzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB4ZHIgPSBuZXcgWERvbWFpblJlcXVlc3QoKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gWERvbWFpblJlcXVlc3Qgb25seSBzdXBwb3J0cyBHRVQgYW5kIFBPU1Q6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLnR5cGUgPT09ICdERUxFVEUnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnVybCA9IHMudXJsICsgKC9cPy8udGVzdChzLnVybCkgPyAnJicgOiAnPycpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnX21ldGhvZD1ERUxFVEUnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcy50eXBlID0gJ1BPU1QnOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHMudHlwZSA9PT0gJ1BVVCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMudXJsID0gcy51cmwgKyAoL1w/Ly50ZXN0KHMudXJsKSA/ICcmJyA6ICc/JykgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdfbWV0aG9kPVBVVCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnR5cGUgPSAnUE9TVCc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgeGRyLm9wZW4ocy50eXBlLCBzLnVybCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHhkci5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ09LJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dGV4dDogeGRyLnJlc3BvbnNlVGV4dH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZTogJyArIHhkci5jb250ZW50VHlwZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgeGRyLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayg0MDQsICdOb3QgRm91bmQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMueGRyVGltZW91dCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgeGRyLm9udGltZW91dCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygwLCAndGltZW91dCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhkci50aW1lb3V0ID0gcy54ZHJUaW1lb3V0OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHhkci5zZW5kKChzLmhhc0NvbnRlbnQgJiYgcy5kYXRhKSB8fCBudWxsKTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGFib3J0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4ZHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhkci5vbmVycm9yID0gJC5ub29wKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ZHIuYWJvcnQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH0KfSkpOwo=]]></data>
	</file>
	<file>
	  <filename>/lib/fileupload.lib/js/jquery.fileupload-fp.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIEZpbGUgUHJvY2Vzc2luZyBQbHVnaW4gMS4yLjEKICogaHR0cHM6Ly9naXRodWIuY29tL2JsdWVpbXAvalF1ZXJ5LUZpbGUtVXBsb2FkCiAqCiAqIENvcHlyaWdodCAyMDEyLCBTZWJhc3RpYW4gVHNjaGFuCiAqIGh0dHBzOi8vYmx1ZWltcC5uZXQKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlOgogKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVAogKi8KCi8qanNsaW50IG5vbWVuOiB0cnVlLCB1bnBhcmFtOiB0cnVlLCByZWdleHA6IHRydWUgKi8KLypnbG9iYWwgZGVmaW5lLCB3aW5kb3csIGRvY3VtZW50ICovCgooZnVuY3Rpb24gKGZhY3RvcnkpIHsKICAgICd1c2Ugc3RyaWN0JzsKICAgIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHsKICAgICAgICAvLyBSZWdpc3RlciBhcyBhbiBhbm9ueW1vdXMgQU1EIG1vZHVsZToKICAgICAgICBkZWZpbmUoWwogICAgICAgICAgICAnanF1ZXJ5JywKICAgICAgICAgICAgJ2xvYWQtaW1hZ2UnLAogICAgICAgICAgICAnY2FudmFzLXRvLWJsb2InLAogICAgICAgICAgICAnLi9qcXVlcnkuZmlsZXVwbG9hZCcKICAgICAgICBdLCBmYWN0b3J5KTsKICAgIH0gZWxzZSB7CiAgICAgICAgLy8gQnJvd3NlciBnbG9iYWxzOgogICAgICAgIGZhY3RvcnkoCiAgICAgICAgICAgIHdpbmRvdy5qUXVlcnksCiAgICAgICAgICAgIHdpbmRvdy5sb2FkSW1hZ2UKICAgICAgICApOwogICAgfQp9KGZ1bmN0aW9uICgkLCBsb2FkSW1hZ2UpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICAvLyBUaGUgRmlsZSBVcGxvYWQgRlAgdmVyc2lvbiBleHRlbmRzIHRoZSBmaWxldXBsb2FkIHdpZGdldAogICAgLy8gd2l0aCBmaWxlIHByb2Nlc3NpbmcgZnVuY3Rpb25hbGl0eToKICAgICQud2lkZ2V0KCdibHVlaW1wLmZpbGV1cGxvYWQnLCAkLmJsdWVpbXAuZmlsZXVwbG9hZCwgewoKICAgICAgICBvcHRpb25zOiB7CiAgICAgICAgICAgIC8vIFRoZSBsaXN0IG9mIGZpbGUgcHJvY2Vzc2luZyBhY3Rpb25zOgogICAgICAgICAgICBwcm9jZXNzOiBbCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAnbG9hZCcsCiAgICAgICAgICAgICAgICAgICAgZmlsZVR5cGVzOiAvXmltYWdlXC8oZ2lmfGpwZWd8cG5nKSQvLAogICAgICAgICAgICAgICAgICAgIG1heEZpbGVTaXplOiAyMDAwMDAwMCAvLyAyME1CCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFjdGlvbjogJ3Jlc2l6ZScsCiAgICAgICAgICAgICAgICAgICAgbWF4V2lkdGg6IDE5MjAsCiAgICAgICAgICAgICAgICAgICAgbWF4SGVpZ2h0OiAxMjAwLAogICAgICAgICAgICAgICAgICAgIG1pbldpZHRoOiA4MDAsCiAgICAgICAgICAgICAgICAgICAgbWluSGVpZ2h0OiA2MDAKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAnc2F2ZScKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKi8KICAgICAgICAgICAgXSwKCiAgICAgICAgICAgIC8vIFRoZSBhZGQgY2FsbGJhY2sgaXMgaW52b2tlZCBhcyBzb29uIGFzIGZpbGVzIGFyZSBhZGRlZCB0byB0aGUKICAgICAgICAgICAgLy8gZmlsZXVwbG9hZCB3aWRnZXQgKHZpYSBmaWxlIGlucHV0IHNlbGVjdGlvbiwgZHJhZyAmIGRyb3Agb3IgYWRkCiAgICAgICAgICAgIC8vIEFQSSBjYWxsKS4gU2VlIHRoZSBiYXNpYyBmaWxlIHVwbG9hZCB3aWRnZXQgZm9yIG1vcmUgaW5mb3JtYXRpb246CiAgICAgICAgICAgIGFkZDogZnVuY3Rpb24gKGUsIGRhdGEpIHsKICAgICAgICAgICAgICAgICQodGhpcykuZmlsZXVwbG9hZCgncHJvY2VzcycsIGRhdGEpLmRvbmUoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGRhdGEuc3VibWl0KCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIHByb2Nlc3NBY3Rpb25zOiB7CiAgICAgICAgICAgIC8vIExvYWRzIHRoZSBpbWFnZSBnaXZlbiB2aWEgZGF0YS5maWxlcyBhbmQgZGF0YS5pbmRleAogICAgICAgICAgICAvLyBhcyBpbWcgZWxlbWVudCBpZiB0aGUgYnJvd3NlciBzdXBwb3J0cyBjYW52YXMuCiAgICAgICAgICAgIC8vIEFjY2VwdHMgdGhlIG9wdGlvbnMgZmlsZVR5cGVzIChyZWd1bGFyIGV4cHJlc3Npb24pCiAgICAgICAgICAgIC8vIGFuZCBtYXhGaWxlU2l6ZSAoaW50ZWdlcikgdG8gbGltaXQgdGhlIGZpbGVzIHRvIGxvYWQ6CiAgICAgICAgICAgIGxvYWQ6IGZ1bmN0aW9uIChkYXRhLCBvcHRpb25zKSB7CiAgICAgICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICAgICAgZmlsZSA9IGRhdGEuZmlsZXNbZGF0YS5pbmRleF0sCiAgICAgICAgICAgICAgICAgICAgZGZkID0gJC5EZWZlcnJlZCgpOwogICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5IVE1MQ2FudmFzRWxlbWVudCAmJgogICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuSFRNTENhbnZhc0VsZW1lbnQucHJvdG90eXBlLnRvQmxvYiAmJgogICAgICAgICAgICAgICAgICAgICAgICAoJC50eXBlKG9wdGlvbnMubWF4RmlsZVNpemUpICE9PSAnbnVtYmVyJyB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZS5zaXplIDwgb3B0aW9ucy5tYXhGaWxlU2l6ZSkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgKCFvcHRpb25zLmZpbGVUeXBlcyB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5maWxlVHlwZXMudGVzdChmaWxlLnR5cGUpKSkgewogICAgICAgICAgICAgICAgICAgIGxvYWRJbWFnZSgKICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGltZykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbWcuc3JjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRmZC5yZWplY3RXaXRoKHRoYXQsIFtkYXRhXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmltZyA9IGltZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlV2l0aCh0aGF0LCBbZGF0YV0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZGZkLnJlamVjdFdpdGgodGhhdCwgW2RhdGFdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBkZmQucHJvbWlzZSgpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBSZXNpemVzIHRoZSBpbWFnZSBnaXZlbiBhcyBkYXRhLmltZyBhbmQgdXBkYXRlcwogICAgICAgICAgICAvLyBkYXRhLmNhbnZhcyB3aXRoIHRoZSByZXNpemVkIGltYWdlIGFzIGNhbnZhcyBlbGVtZW50LgogICAgICAgICAgICAvLyBBY2NlcHRzIHRoZSBvcHRpb25zIG1heFdpZHRoLCBtYXhIZWlnaHQsIG1pbldpZHRoIGFuZAogICAgICAgICAgICAvLyBtaW5IZWlnaHQgdG8gc2NhbGUgdGhlIGdpdmVuIGltYWdlOgogICAgICAgICAgICByZXNpemU6IGZ1bmN0aW9uIChkYXRhLCBvcHRpb25zKSB7CiAgICAgICAgICAgICAgICB2YXIgaW1nID0gZGF0YS5pbWcsCiAgICAgICAgICAgICAgICAgICAgY2FudmFzOwogICAgICAgICAgICAgICAgb3B0aW9ucyA9ICQuZXh0ZW5kKHtjYW52YXM6IHRydWV9LCBvcHRpb25zKTsKICAgICAgICAgICAgICAgIGlmIChpbWcpIHsKICAgICAgICAgICAgICAgICAgICBjYW52YXMgPSBsb2FkSW1hZ2Uuc2NhbGUoaW1nLCBvcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICBpZiAoY2FudmFzLndpZHRoICE9PSBpbWcud2lkdGggfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5oZWlnaHQgIT09IGltZy5oZWlnaHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5jYW52YXMgPSBjYW52YXM7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIC8vIFNhdmVzIHRoZSBwcm9jZXNzZWQgaW1hZ2UgZ2l2ZW4gYXMgZGF0YS5jYW52YXMKICAgICAgICAgICAgLy8gaW5wbGFjZSBhdCBkYXRhLmluZGV4IG9mIGRhdGEuZmlsZXM6CiAgICAgICAgICAgIHNhdmU6IGZ1bmN0aW9uIChkYXRhLCBvcHRpb25zKSB7CiAgICAgICAgICAgICAgICAvLyBEbyBub3RoaW5nIGlmIG5vIHByb2Nlc3NpbmcgaGFzIGhhcHBlbmVkOgogICAgICAgICAgICAgICAgaWYgKCFkYXRhLmNhbnZhcykgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRhOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLAogICAgICAgICAgICAgICAgICAgIGZpbGUgPSBkYXRhLmZpbGVzW2RhdGEuaW5kZXhdLAogICAgICAgICAgICAgICAgICAgIG5hbWUgPSBmaWxlLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgZGZkID0gJC5EZWZlcnJlZCgpLAogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24gKGJsb2IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFibG9iLm5hbWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlLnR5cGUgPT09IGJsb2IudHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2IubmFtZSA9IGZpbGUubmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmlsZS5uYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvYi5uYW1lID0gZmlsZS5uYW1lLnJlcGxhY2UoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC9cLi4rJC8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcuJyArIGJsb2IudHlwZS5zdWJzdHIoNikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN0b3JlIHRoZSBjcmVhdGVkIGJsb2IgYXQgdGhlIHBvc2l0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mIHRoZSBvcmlnaW5hbCBmaWxlIGluIHRoZSBmaWxlcyBsaXN0OgogICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmZpbGVzW2RhdGEuaW5kZXhdID0gYmxvYjsKICAgICAgICAgICAgICAgICAgICAgICAgZGZkLnJlc29sdmVXaXRoKHRoYXQsIFtkYXRhXSk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIC8vIFVzZSBjYW52YXMubW96R2V0QXNGaWxlIGRpcmVjdGx5LCB0byByZXRhaW4gdGhlIGZpbGVuYW1lLCBhcwogICAgICAgICAgICAgICAgLy8gR2Vja28gZG9lc24ndCBzdXBwb3J0IHRoZSBmaWxlbmFtZSBvcHRpb24gZm9yIEZvcm1EYXRhLmFwcGVuZDoKICAgICAgICAgICAgICAgIGlmIChkYXRhLmNhbnZhcy5tb3pHZXRBc0ZpbGUpIHsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhkYXRhLmNhbnZhcy5tb3pHZXRBc0ZpbGUoCiAgICAgICAgICAgICAgICAgICAgICAgICgvXmltYWdlXC8oanBlZ3xwbmcpJC8udGVzdChmaWxlLnR5cGUpICYmIG5hbWUpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKG5hbWUgJiYgbmFtZS5yZXBsYWNlKC9cLi4rJC8sICcnKSkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYmxvYicpICsgJy5wbmcnLAogICAgICAgICAgICAgICAgICAgICAgICBmaWxlLnR5cGUKICAgICAgICAgICAgICAgICAgICApKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZGF0YS5jYW52YXMudG9CbG9iKGNhbGxiYWNrLCBmaWxlLnR5cGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIGRmZC5wcm9taXNlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvLyBSZXNpemVzIHRoZSBmaWxlIGF0IHRoZSBnaXZlbiBpbmRleCBhbmQgc3RvcmVzIHRoZSBjcmVhdGVkIGJsb2IgYXQKICAgICAgICAvLyB0aGUgb3JpZ2luYWwgcG9zaXRpb24gb2YgdGhlIGZpbGVzIGxpc3QsIHJldHVybnMgYSBQcm9taXNlIG9iamVjdDoKICAgICAgICBfcHJvY2Vzc0ZpbGU6IGZ1bmN0aW9uIChmaWxlcywgaW5kZXgsIG9wdGlvbnMpIHsKICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLAogICAgICAgICAgICAgICAgZGZkID0gJC5EZWZlcnJlZCgpLnJlc29sdmVXaXRoKHRoYXQsIFt7CiAgICAgICAgICAgICAgICAgICAgZmlsZXM6IGZpbGVzLAogICAgICAgICAgICAgICAgICAgIGluZGV4OiBpbmRleAogICAgICAgICAgICAgICAgfV0pLAogICAgICAgICAgICAgICAgY2hhaW4gPSBkZmQucHJvbWlzZSgpOwogICAgICAgICAgICB0aGF0Ll9wcm9jZXNzaW5nICs9IDE7CiAgICAgICAgICAgICQuZWFjaChvcHRpb25zLnByb2Nlc3MsIGZ1bmN0aW9uIChpLCBzZXR0aW5ncykgewogICAgICAgICAgICAgICAgY2hhaW4gPSBjaGFpbi5waXBlKGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoYXQucHJvY2Vzc0FjdGlvbnNbc2V0dGluZ3MuYWN0aW9uXQogICAgICAgICAgICAgICAgICAgICAgICAuY2FsbCh0aGlzLCBkYXRhLCBzZXR0aW5ncyk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGNoYWluLmFsd2F5cyhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB0aGF0Ll9wcm9jZXNzaW5nIC09IDE7CiAgICAgICAgICAgICAgICBpZiAodGhhdC5fcHJvY2Vzc2luZyA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgIHRoYXQuZWxlbWVudAogICAgICAgICAgICAgICAgICAgICAgICAucmVtb3ZlQ2xhc3MoJ2ZpbGV1cGxvYWQtcHJvY2Vzc2luZycpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgaWYgKHRoYXQuX3Byb2Nlc3NpbmcgPT09IDEpIHsKICAgICAgICAgICAgICAgIHRoYXQuZWxlbWVudC5hZGRDbGFzcygnZmlsZXVwbG9hZC1wcm9jZXNzaW5nJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGNoYWluOwogICAgICAgIH0sCgogICAgICAgIC8vIFByb2Nlc3NlcyB0aGUgZmlsZXMgZ2l2ZW4gYXMgZmlsZXMgcHJvcGVydHkgb2YgdGhlIGRhdGEgcGFyYW1ldGVyLAogICAgICAgIC8vIHJldHVybnMgYSBQcm9taXNlIG9iamVjdCB0aGF0IGFsbG93cyB0byBiaW5kIGEgZG9uZSBoYW5kbGVyLCB3aGljaAogICAgICAgIC8vIHdpbGwgYmUgaW52b2tlZCBhZnRlciBwcm9jZXNzaW5nIGFsbCBmaWxlcyAoaW5wbGFjZSkgaXMgZG9uZToKICAgICAgICBwcm9jZXNzOiBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICBvcHRpb25zID0gJC5leHRlbmQoe30sIHRoaXMub3B0aW9ucywgZGF0YSk7CiAgICAgICAgICAgIGlmIChvcHRpb25zLnByb2Nlc3MgJiYgb3B0aW9ucy5wcm9jZXNzLmxlbmd0aCAmJgogICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzWEhSVXBsb2FkKG9wdGlvbnMpKSB7CiAgICAgICAgICAgICAgICAkLmVhY2goZGF0YS5maWxlcywgZnVuY3Rpb24gKGluZGV4LCBmaWxlKSB7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fcHJvY2Vzc2luZ1F1ZXVlID0gdGhhdC5fcHJvY2Vzc2luZ1F1ZXVlLnBpcGUoCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkZmQgPSAkLkRlZmVycmVkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9wcm9jZXNzRmlsZShkYXRhLmZpbGVzLCBpbmRleCwgb3B0aW9ucykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWx3YXlzKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGZkLnJlc29sdmVXaXRoKHRoYXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRmZC5wcm9taXNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2Nlc3NpbmdRdWV1ZTsKICAgICAgICB9LAoKICAgICAgICBfY3JlYXRlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuX3N1cGVyKCk7CiAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3NpbmcgPSAwOwogICAgICAgICAgICB0aGlzLl9wcm9jZXNzaW5nUXVldWUgPSAkLkRlZmVycmVkKCkucmVzb2x2ZVdpdGgodGhpcykKICAgICAgICAgICAgICAgIC5wcm9taXNlKCk7CiAgICAgICAgfQoKICAgIH0pOwoKfSkpOwo=]]></data>
	</file>
	<file>
	  <filename>/lib/fileupload.lib/js/jquery.fileupload-ui.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFVzZXIgSW50ZXJmYWNlIFBsdWdpbiA3LjEKICogaHR0cHM6Ly9naXRodWIuY29tL2JsdWVpbXAvalF1ZXJ5LUZpbGUtVXBsb2FkCiAqCiAqIENvcHlyaWdodCAyMDEwLCBTZWJhc3RpYW4gVHNjaGFuCiAqIGh0dHBzOi8vYmx1ZWltcC5uZXQKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlOgogKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVAogKi8KCi8qanNsaW50IG5vbWVuOiB0cnVlLCB1bnBhcmFtOiB0cnVlLCByZWdleHA6IHRydWUgKi8KLypnbG9iYWwgZGVmaW5lLCB3aW5kb3csIFVSTCwgd2Via2l0VVJMLCBGaWxlUmVhZGVyICovCgooZnVuY3Rpb24gKGZhY3RvcnkpIHsKICAgICd1c2Ugc3RyaWN0JzsKICAgIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHsKICAgICAgICAvLyBSZWdpc3RlciBhcyBhbiBhbm9ueW1vdXMgQU1EIG1vZHVsZToKICAgICAgICBkZWZpbmUoWwogICAgICAgICAgICAnanF1ZXJ5JywKICAgICAgICAgICAgJ3RtcGwnLAogICAgICAgICAgICAnbG9hZC1pbWFnZScsCiAgICAgICAgICAgICcuL2pxdWVyeS5maWxldXBsb2FkLWZwJwogICAgICAgIF0sIGZhY3RvcnkpOwogICAgfSBlbHNlIHsKICAgICAgICAvLyBCcm93c2VyIGdsb2JhbHM6CiAgICAgICAgZmFjdG9yeSgKICAgICAgICAgICAgd2luZG93LmpRdWVyeSwKICAgICAgICAgICAgd2luZG93LnRtcGwsCiAgICAgICAgICAgIHdpbmRvdy5sb2FkSW1hZ2UKICAgICAgICApOwogICAgfQp9KGZ1bmN0aW9uICgkLCB0bXBsLCBsb2FkSW1hZ2UpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICAvLyBUaGUgVUkgdmVyc2lvbiBleHRlbmRzIHRoZSBmaWxlIHVwbG9hZCB3aWRnZXQKICAgIC8vIGFuZCBhZGRzIGNvbXBsZXRlIHVzZXIgaW50ZXJmYWNlIGludGVyYWN0aW9uOgogICAgJC53aWRnZXQoJ2JsdWVpbXAuZmlsZXVwbG9hZCcsICQuYmx1ZWltcC5maWxldXBsb2FkLCB7CgogICAgICAgIG9wdGlvbnM6IHsKICAgICAgICAgICAgLy8gQnkgZGVmYXVsdCwgZmlsZXMgYWRkZWQgdG8gdGhlIHdpZGdldCBhcmUgdXBsb2FkZWQgYXMgc29vbgogICAgICAgICAgICAvLyBhcyB0aGUgdXNlciBjbGlja3Mgb24gdGhlIHN0YXJ0IGJ1dHRvbnMuIFRvIGVuYWJsZSBhdXRvbWF0aWMKICAgICAgICAgICAgLy8gdXBsb2Fkcywgc2V0IHRoZSBmb2xsb3dpbmcgb3B0aW9uIHRvIHRydWU6CiAgICAgICAgICAgIGF1dG9VcGxvYWQ6IGZhbHNlLAogICAgICAgICAgICAvLyBUaGUgZm9sbG93aW5nIG9wdGlvbiBsaW1pdHMgdGhlIG51bWJlciBvZiBmaWxlcyB0aGF0IGFyZQogICAgICAgICAgICAvLyBhbGxvd2VkIHRvIGJlIHVwbG9hZGVkIHVzaW5nIHRoaXMgd2lkZ2V0OgogICAgICAgICAgICBtYXhOdW1iZXJPZkZpbGVzOiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIFRoZSBtYXhpbXVtIGFsbG93ZWQgZmlsZSBzaXplOgogICAgICAgICAgICBtYXhGaWxlU2l6ZTogdW5kZWZpbmVkLAogICAgICAgICAgICAvLyBUaGUgbWluaW11bSBhbGxvd2VkIGZpbGUgc2l6ZToKICAgICAgICAgICAgbWluRmlsZVNpemU6IHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBmb3IgYWxsb3dlZCBmaWxlIHR5cGVzLCBtYXRjaGVzCiAgICAgICAgICAgIC8vIGFnYWluc3QgZWl0aGVyIGZpbGUgdHlwZSBvciBmaWxlIG5hbWU6CiAgICAgICAgICAgIGFjY2VwdEZpbGVUeXBlczogIC8uKyQvaSwKICAgICAgICAgICAgLy8gVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBkZWZpbmUgZm9yIHdoaWNoIGZpbGVzIGEgcHJldmlldwogICAgICAgICAgICAvLyBpbWFnZSBpcyBzaG93biwgbWF0Y2hlZCBhZ2FpbnN0IHRoZSBmaWxlIHR5cGU6CiAgICAgICAgICAgIHByZXZpZXdTb3VyY2VGaWxlVHlwZXM6IC9eaW1hZ2VcLyhnaWZ8anBlZ3xwbmcpJC8sCiAgICAgICAgICAgIC8vIFRoZSBtYXhpbXVtIGZpbGUgc2l6ZSBvZiBpbWFnZXMgdGhhdCBhcmUgdG8gYmUgZGlzcGxheWVkIGFzIHByZXZpZXc6CiAgICAgICAgICAgIHByZXZpZXdTb3VyY2VNYXhGaWxlU2l6ZTogNTAwMDAwMCwgLy8gNU1CCiAgICAgICAgICAgIC8vIFRoZSBtYXhpbXVtIHdpZHRoIG9mIHRoZSBwcmV2aWV3IGltYWdlczoKICAgICAgICAgICAgcHJldmlld01heFdpZHRoOiA4MCwKICAgICAgICAgICAgLy8gVGhlIG1heGltdW0gaGVpZ2h0IG9mIHRoZSBwcmV2aWV3IGltYWdlczoKICAgICAgICAgICAgcHJldmlld01heEhlaWdodDogODAsCiAgICAgICAgICAgIC8vIEJ5IGRlZmF1bHQsIHByZXZpZXcgaW1hZ2VzIGFyZSBkaXNwbGF5ZWQgYXMgY2FudmFzIGVsZW1lbnRzCiAgICAgICAgICAgIC8vIGlmIHN1cHBvcnRlZCBieSB0aGUgYnJvd3Nlci4gU2V0IHRoZSBmb2xsb3dpbmcgb3B0aW9uIHRvIGZhbHNlCiAgICAgICAgICAgIC8vIHRvIGFsd2F5cyBkaXNwbGF5IHByZXZpZXcgaW1hZ2VzIGFzIGltZyBlbGVtZW50czoKICAgICAgICAgICAgcHJldmlld0FzQ2FudmFzOiB0cnVlLAogICAgICAgICAgICAvLyBUaGUgSUQgb2YgdGhlIHVwbG9hZCB0ZW1wbGF0ZToKICAgICAgICAgICAgdXBsb2FkVGVtcGxhdGVJZDogJ3RlbXBsYXRlLXVwbG9hZCcsCiAgICAgICAgICAgIC8vIFRoZSBJRCBvZiB0aGUgZG93bmxvYWQgdGVtcGxhdGU6CiAgICAgICAgICAgIGRvd25sb2FkVGVtcGxhdGVJZDogJ3RlbXBsYXRlLWRvd25sb2FkJywKICAgICAgICAgICAgLy8gVGhlIGNvbnRhaW5lciBmb3IgdGhlIGxpc3Qgb2YgZmlsZXMuIElmIHVuZGVmaW5lZCwgaXQgaXMgc2V0IHRvCiAgICAgICAgICAgIC8vIGFuIGVsZW1lbnQgd2l0aCBjbGFzcyAiZmlsZXMiIGluc2lkZSBvZiB0aGUgd2lkZ2V0IGVsZW1lbnQ6CiAgICAgICAgICAgIGZpbGVzQ29udGFpbmVyOiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIEJ5IGRlZmF1bHQsIGZpbGVzIGFyZSBhcHBlbmRlZCB0byB0aGUgZmlsZXMgY29udGFpbmVyLgogICAgICAgICAgICAvLyBTZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gdHJ1ZSwgdG8gcHJlcGVuZCBmaWxlcyBpbnN0ZWFkOgogICAgICAgICAgICBwcmVwZW5kRmlsZXM6IGZhbHNlLAogICAgICAgICAgICAvLyBUaGUgZXhwZWN0ZWQgZGF0YSB0eXBlIG9mIHRoZSB1cGxvYWQgcmVzcG9uc2UsIHNldHMgdGhlIGRhdGFUeXBlCiAgICAgICAgICAgIC8vIG9wdGlvbiBvZiB0aGUgJC5hamF4IHVwbG9hZCByZXF1ZXN0czoKICAgICAgICAgICAgZGF0YVR5cGU6ICdqc29uJywKCiAgICAgICAgICAgIC8vIFRoZSBhZGQgY2FsbGJhY2sgaXMgaW52b2tlZCBhcyBzb29uIGFzIGZpbGVzIGFyZSBhZGRlZCB0byB0aGUgZmlsZXVwbG9hZAogICAgICAgICAgICAvLyB3aWRnZXQgKHZpYSBmaWxlIGlucHV0IHNlbGVjdGlvbiwgZHJhZyAmIGRyb3Agb3IgYWRkIEFQSSBjYWxsKS4KICAgICAgICAgICAgLy8gU2VlIHRoZSBiYXNpYyBmaWxlIHVwbG9hZCB3aWRnZXQgZm9yIG1vcmUgaW5mb3JtYXRpb246CiAgICAgICAgICAgIGFkZDogZnVuY3Rpb24gKGUsIGRhdGEpIHsKICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gJCh0aGlzKS5kYXRhKCdmaWxldXBsb2FkJyksCiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyA9IHRoYXQub3B0aW9ucywKICAgICAgICAgICAgICAgICAgICBmaWxlcyA9IGRhdGEuZmlsZXM7CiAgICAgICAgICAgICAgICAkKHRoaXMpLmZpbGV1cGxvYWQoJ3Byb2Nlc3MnLCBkYXRhKS5kb25lKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll9hZGp1c3RNYXhOdW1iZXJPZkZpbGVzKC1maWxlcy5sZW5ndGgpOwogICAgICAgICAgICAgICAgICAgIGRhdGEubWF4TnVtYmVyT2ZGaWxlc0FkanVzdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBkYXRhLmZpbGVzLnZhbGlkID0gZGF0YS5pc1ZhbGlkYXRlZCA9IHRoYXQuX3ZhbGlkYXRlKGZpbGVzKTsKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQgPSB0aGF0Ll9yZW5kZXJVcGxvYWQoZmlsZXMpLmRhdGEoJ2RhdGEnLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVzQ29udGFpbmVyWwogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnByZXBlbmRGaWxlcyA/ICdwcmVwZW5kJyA6ICdhcHBlbmQnCiAgICAgICAgICAgICAgICAgICAgXShkYXRhLmNvbnRleHQpOwogICAgICAgICAgICAgICAgICAgIHRoYXQuX3JlbmRlclByZXZpZXdzKGZpbGVzLCBkYXRhLmNvbnRleHQpOwogICAgICAgICAgICAgICAgICAgIHRoYXQuX2ZvcmNlUmVmbG93KGRhdGEuY29udGV4dCk7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJhbnNpdGlvbihkYXRhLmNvbnRleHQpLmRvbmUoCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodGhhdC5fdHJpZ2dlcignYWRkZWQnLCBlLCBkYXRhKSAhPT0gZmFsc2UpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcHRpb25zLmF1dG9VcGxvYWQgfHwgZGF0YS5hdXRvVXBsb2FkKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmF1dG9VcGxvYWQgIT09IGZhbHNlICYmIGRhdGEuaXNWYWxpZGF0ZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnN1Ym1pdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgdGhlIHN0YXJ0IG9mIGVhY2ggZmlsZSB1cGxvYWQgcmVxdWVzdDoKICAgICAgICAgICAgc2VuZDogZnVuY3Rpb24gKGUsIGRhdGEpIHsKICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gJCh0aGlzKS5kYXRhKCdmaWxldXBsb2FkJyk7CiAgICAgICAgICAgICAgICBpZiAoIWRhdGEuaXNWYWxpZGF0ZWQpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIWRhdGEubWF4TnVtYmVyT2ZGaWxlc0FkanVzdGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX2FkanVzdE1heE51bWJlck9mRmlsZXMoLWRhdGEuZmlsZXMubGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5tYXhOdW1iZXJPZkZpbGVzQWRqdXN0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoIXRoYXQuX3ZhbGlkYXRlKGRhdGEuZmlsZXMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoZGF0YS5jb250ZXh0ICYmIGRhdGEuZGF0YVR5cGUgJiYKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5kYXRhVHlwZS5zdWJzdHIoMCwgNikgPT09ICdpZnJhbWUnKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gSWZyYW1lIFRyYW5zcG9ydCBkb2VzIG5vdCBzdXBwb3J0IHByb2dyZXNzIGV2ZW50cy4KICAgICAgICAgICAgICAgICAgICAvLyBJbiBsYWNrIG9mIGFuIGluZGV0ZXJtaW5hdGUgcHJvZ3Jlc3MgYmFyLCB3ZSBzZXQKICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcHJvZ3Jlc3MgdG8gMTAwJSwgc2hvd2luZyB0aGUgZnVsbCBhbmltYXRlZCBiYXI6CiAgICAgICAgICAgICAgICAgICAgZGF0YS5jb250ZXh0CiAgICAgICAgICAgICAgICAgICAgICAgIC5maW5kKCcucHJvZ3Jlc3MnKS5hZGRDbGFzcygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICEkLnN1cHBvcnQudHJhbnNpdGlvbiAmJiAncHJvZ3Jlc3MtYW5pbWF0ZWQnCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2FyaWEtdmFsdWVub3cnLCAxMDApCiAgICAgICAgICAgICAgICAgICAgICAgIC5maW5kKCcuYmFyJykuY3NzKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3dpZHRoJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICcxMDAlJwogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHRoYXQuX3RyaWdnZXIoJ3NlbnQnLCBlLCBkYXRhKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHN1Y2Nlc3NmdWwgdXBsb2FkczoKICAgICAgICAgICAgZG9uZTogZnVuY3Rpb24gKGUsIGRhdGEpIHsKICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gJCh0aGlzKS5kYXRhKCdmaWxldXBsb2FkJyksCiAgICAgICAgICAgICAgICAgICAgZmlsZXMgPSB0aGF0Ll9nZXRGaWxlc0Zyb21SZXNwb25zZShkYXRhKSwKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSwKICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZDsKICAgICAgICAgICAgICAgIGlmIChkYXRhLmNvbnRleHQpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQuZWFjaChmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpbGUgPSBmaWxlc1tpbmRleF0gfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ZXJyb3I6ICdFbXB0eSBmaWxlIHVwbG9hZCByZXN1bHQnfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkID0gdGhhdC5fYWRkRmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGUuZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX2FkanVzdE1heE51bWJlck9mRmlsZXMoMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJhbnNpdGlvbigkKHRoaXMpKS5kb25lKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBub2RlID0gJCh0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9IHRoYXQuX3JlbmRlckRvd25sb2FkKFtmaWxlXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2VBbGwobm9kZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fZm9yY2VSZWZsb3codGVtcGxhdGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24odGVtcGxhdGUpLmRvbmUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuY29udGV4dCA9ICQodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdjb21wbGV0ZWQnLCBlLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ2ZpbmlzaGVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaChmaWxlcywgZnVuY3Rpb24gKGluZGV4LCBmaWxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5tYXhOdW1iZXJPZkZpbGVzQWRqdXN0ZWQgJiYgZmlsZS5lcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX2FkanVzdE1heE51bWJlck9mRmlsZXMoMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFkYXRhLm1heE51bWJlck9mRmlsZXNBZGp1c3RlZCAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZmlsZS5lcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX2FkanVzdE1heE51bWJlck9mRmlsZXMoLTEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5tYXhOdW1iZXJPZkZpbGVzQWRqdXN0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9IHRoYXQuX3JlbmRlckRvd25sb2FkKGZpbGVzKQogICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kVG8odGhhdC5vcHRpb25zLmZpbGVzQ29udGFpbmVyKTsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll9mb3JjZVJlZmxvdyh0ZW1wbGF0ZSk7CiAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQgPSB0aGF0Ll9hZGRGaW5pc2hlZERlZmVycmVkcygpOwogICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24odGVtcGxhdGUpLmRvbmUoCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuY29udGV4dCA9ICQodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdjb21wbGV0ZWQnLCBlLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ2ZpbmlzaGVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgZmFpbGVkIChhYm9ydCBvciBlcnJvcikgdXBsb2FkczoKICAgICAgICAgICAgZmFpbDogZnVuY3Rpb24gKGUsIGRhdGEpIHsKICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gJCh0aGlzKS5kYXRhKCdmaWxldXBsb2FkJyksCiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUsCiAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQ7CiAgICAgICAgICAgICAgICBpZiAoZGF0YS5tYXhOdW1iZXJPZkZpbGVzQWRqdXN0ZWQpIHsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll9hZGp1c3RNYXhOdW1iZXJPZkZpbGVzKGRhdGEuZmlsZXMubGVuZ3RoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChkYXRhLmNvbnRleHQpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQuZWFjaChmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuZXJyb3JUaHJvd24gIT09ICdhYm9ydCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaWxlID0gZGF0YS5maWxlc1tpbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLmVycm9yID0gZmlsZS5lcnJvciB8fCBkYXRhLmVycm9yVGhyb3duIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkID0gdGhhdC5fYWRkRmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oJCh0aGlzKSkuZG9uZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBub2RlID0gJCh0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGF0Ll9yZW5kZXJEb3dubG9hZChbZmlsZV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZUFsbChub2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fZm9yY2VSZWZsb3codGVtcGxhdGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmFuc2l0aW9uKHRlbXBsYXRlKS5kb25lKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuY29udGV4dCA9ICQodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZmFpbGVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZmluaXNoZWQnLCBlLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkID0gdGhhdC5fYWRkRmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oJCh0aGlzKSkuZG9uZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ2ZhaWxlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmaW5pc2hlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhLmVycm9yVGhyb3duICE9PSAnYWJvcnQnKSB7CiAgICAgICAgICAgICAgICAgICAgZGF0YS5jb250ZXh0ID0gdGhhdC5fcmVuZGVyVXBsb2FkKGRhdGEuZmlsZXMpCiAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmRUbyh0aGF0Lm9wdGlvbnMuZmlsZXNDb250YWluZXIpCiAgICAgICAgICAgICAgICAgICAgICAgIC5kYXRhKCdkYXRhJywgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fZm9yY2VSZWZsb3coZGF0YS5jb250ZXh0KTsKICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZCA9IHRoYXQuX2FkZEZpbmlzaGVkRGVmZXJyZWRzKCk7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJhbnNpdGlvbihkYXRhLmNvbnRleHQpLmRvbmUoCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuY29udGV4dCA9ICQodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmYWlsZWQnLCBlLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ2ZpbmlzaGVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmYWlsZWQnLCBlLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmaW5pc2hlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgIHRoYXQuX2FkZEZpbmlzaGVkRGVmZXJyZWRzKCkucmVzb2x2ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgdXBsb2FkIHByb2dyZXNzIGV2ZW50czoKICAgICAgICAgICAgcHJvZ3Jlc3M6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICBpZiAoZGF0YS5jb250ZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHByb2dyZXNzID0gcGFyc2VJbnQoZGF0YS5sb2FkZWQgLyBkYXRhLnRvdGFsICogMTAwLCAxMCk7CiAgICAgICAgICAgICAgICAgICAgZGF0YS5jb250ZXh0LmZpbmQoJy5wcm9ncmVzcycpCiAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCdhcmlhLXZhbHVlbm93JywgcHJvZ3Jlc3MpCiAgICAgICAgICAgICAgICAgICAgICAgIC5maW5kKCcuYmFyJykuY3NzKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3dpZHRoJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyZXNzICsgJyUnCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBnbG9iYWwgdXBsb2FkIHByb2dyZXNzIGV2ZW50czoKICAgICAgICAgICAgcHJvZ3Jlc3NhbGw6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICB2YXIgJHRoaXMgPSAkKHRoaXMpLAogICAgICAgICAgICAgICAgICAgIHByb2dyZXNzID0gcGFyc2VJbnQoZGF0YS5sb2FkZWQgLyBkYXRhLnRvdGFsICogMTAwLCAxMCksCiAgICAgICAgICAgICAgICAgICAgZ2xvYmFsUHJvZ3Jlc3NOb2RlID0gJHRoaXMuZmluZCgnLmZpbGV1cGxvYWQtcHJvZ3Jlc3MnKSwKICAgICAgICAgICAgICAgICAgICBleHRlbmRlZFByb2dyZXNzTm9kZSA9IGdsb2JhbFByb2dyZXNzTm9kZQogICAgICAgICAgICAgICAgICAgICAgICAuZmluZCgnLnByb2dyZXNzLWV4dGVuZGVkJyk7CiAgICAgICAgICAgICAgICBpZiAoZXh0ZW5kZWRQcm9ncmVzc05vZGUubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgZXh0ZW5kZWRQcm9ncmVzc05vZGUuaHRtbCgKICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMuZGF0YSgnZmlsZXVwbG9hZCcpLl9yZW5kZXJFeHRlbmRlZFByb2dyZXNzKGRhdGEpCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGdsb2JhbFByb2dyZXNzTm9kZQogICAgICAgICAgICAgICAgICAgIC5maW5kKCcucHJvZ3Jlc3MnKQogICAgICAgICAgICAgICAgICAgIC5hdHRyKCdhcmlhLXZhbHVlbm93JywgcHJvZ3Jlc3MpCiAgICAgICAgICAgICAgICAgICAgLmZpbmQoJy5iYXInKS5jc3MoCiAgICAgICAgICAgICAgICAgICAgICAgICd3aWR0aCcsCiAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyZXNzICsgJyUnCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHVwbG9hZHMgc3RhcnQsIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RhcnQgZXZlbnQ6CiAgICAgICAgICAgIHN0YXJ0OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgdmFyIHRoYXQgPSAkKHRoaXMpLmRhdGEoJ2ZpbGV1cGxvYWQnKTsKICAgICAgICAgICAgICAgIHRoYXQuX3Jlc2V0RmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oJCh0aGlzKS5maW5kKCcuZmlsZXVwbG9hZC1wcm9ncmVzcycpKS5kb25lKAogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignc3RhcnRlZCcsIGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciB1cGxvYWRzIHN0b3AsIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RvcCBldmVudDoKICAgICAgICAgICAgc3RvcDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gJCh0aGlzKS5kYXRhKCdmaWxldXBsb2FkJyksCiAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQgPSB0aGF0Ll9hZGRGaW5pc2hlZERlZmVycmVkcygpOwogICAgICAgICAgICAgICAgJC53aGVuLmFwcGx5KCQsIHRoYXQuX2dldEZpbmlzaGVkRGVmZXJyZWRzKCkpCiAgICAgICAgICAgICAgICAgICAgLmRvbmUoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdzdG9wcGVkJywgZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB0aGF0Ll90cmFuc2l0aW9uKCQodGhpcykuZmluZCgnLmZpbGV1cGxvYWQtcHJvZ3Jlc3MnKSkuZG9uZSgKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuZmluZCgnLnByb2dyZXNzJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCdhcmlhLXZhbHVlbm93JywgJzAnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoJy5iYXInKS5jc3MoJ3dpZHRoJywgJzAlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuZmluZCgnLnByb2dyZXNzLWV4dGVuZGVkJykuaHRtbCgnJm5ic3A7Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgZmlsZSBkZWxldGlvbjoKICAgICAgICAgICAgZGVzdHJveTogZnVuY3Rpb24gKGUsIGRhdGEpIHsKICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gJCh0aGlzKS5kYXRhKCdmaWxldXBsb2FkJyk7CiAgICAgICAgICAgICAgICBpZiAoZGF0YS51cmwpIHsKICAgICAgICAgICAgICAgICAgICAkLmFqYXgoZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fYWRqdXN0TWF4TnVtYmVyT2ZGaWxlcygxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oZGF0YS5jb250ZXh0KS5kb25lKAogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZGVzdHJveWVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9yZXNldEZpbmlzaGVkRGVmZXJyZWRzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuX2ZpbmlzaGVkVXBsb2FkcyA9IFtdOwogICAgICAgIH0sCgogICAgICAgIF9hZGRGaW5pc2hlZERlZmVycmVkczogZnVuY3Rpb24gKGRlZmVycmVkKSB7CiAgICAgICAgICAgIGlmICghZGVmZXJyZWQpIHsKICAgICAgICAgICAgICAgIGRlZmVycmVkID0gJC5EZWZlcnJlZCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX2ZpbmlzaGVkVXBsb2Fkcy5wdXNoKGRlZmVycmVkKTsKICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkOwogICAgICAgIH0sCiAgICAgICAgCiAgICAgICAgX2dldEZpbmlzaGVkRGVmZXJyZWRzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9maW5pc2hlZFVwbG9hZHM7CiAgICAgICAgfSwKCiAgICAgICAgX2dldEZpbGVzRnJvbVJlc3BvbnNlOiBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICBpZiAoZGF0YS5yZXN1bHQgJiYgJC5pc0FycmF5KGRhdGEucmVzdWx0LmZpbGVzKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGRhdGEucmVzdWx0LmZpbGVzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICB9LAoKICAgICAgICAvLyBMaW5rIGhhbmRsZXIsIHRoYXQgYWxsb3dzIHRvIGRvd25sb2FkIGZpbGVzCiAgICAgICAgLy8gYnkgZHJhZyAmIGRyb3Agb2YgdGhlIGxpbmtzIHRvIHRoZSBkZXNrdG9wOgogICAgICAgIF9lbmFibGVEcmFnVG9EZXNrdG9wOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBsaW5rID0gJCh0aGlzKSwKICAgICAgICAgICAgICAgIHVybCA9IGxpbmsucHJvcCgnaHJlZicpLAogICAgICAgICAgICAgICAgbmFtZSA9IGxpbmsucHJvcCgnZG93bmxvYWQnKSwKICAgICAgICAgICAgICAgIHR5cGUgPSAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJzsKICAgICAgICAgICAgbGluay5iaW5kKCdkcmFnc3RhcnQnLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBlLm9yaWdpbmFsRXZlbnQuZGF0YVRyYW5zZmVyLnNldERhdGEoCiAgICAgICAgICAgICAgICAgICAgICAgICdEb3dubG9hZFVSTCcsCiAgICAgICAgICAgICAgICAgICAgICAgIFt0eXBlLCBuYW1lLCB1cmxdLmpvaW4oJzonKQogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHt9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIF9hZGp1c3RNYXhOdW1iZXJPZkZpbGVzOiBmdW5jdGlvbiAob3BlcmFuZCkgewogICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMub3B0aW9ucy5tYXhOdW1iZXJPZkZpbGVzID09PSAnbnVtYmVyJykgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLm1heE51bWJlck9mRmlsZXMgKz0gb3BlcmFuZDsKICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA8IDEpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9kaXNhYmxlRmlsZUlucHV0QnV0dG9uKCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX2VuYWJsZUZpbGVJbnB1dEJ1dHRvbigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2Zvcm1hdEZpbGVTaXplOiBmdW5jdGlvbiAoYnl0ZXMpIHsKICAgICAgICAgICAgaWYgKHR5cGVvZiBieXRlcyAhPT0gJ251bWJlcicpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYnl0ZXMgPj0gMTAwMDAwMDAwMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChieXRlcyAvIDEwMDAwMDAwMDApLnRvRml4ZWQoMikgKyAnIEdCJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYnl0ZXMgPj0gMTAwMDAwMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChieXRlcyAvIDEwMDAwMDApLnRvRml4ZWQoMikgKyAnIE1CJzsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gKGJ5dGVzIC8gMTAwMCkudG9GaXhlZCgyKSArICcgS0InOwogICAgICAgIH0sCgogICAgICAgIF9mb3JtYXRCaXRyYXRlOiBmdW5jdGlvbiAoYml0cykgewogICAgICAgICAgICBpZiAodHlwZW9mIGJpdHMgIT09ICdudW1iZXInKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGJpdHMgPj0gMTAwMDAwMDAwMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChiaXRzIC8gMTAwMDAwMDAwMCkudG9GaXhlZCgyKSArICcgR2JpdC9zJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYml0cyA+PSAxMDAwMDAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKGJpdHMgLyAxMDAwMDAwKS50b0ZpeGVkKDIpICsgJyBNYml0L3MnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChiaXRzID49IDEwMDApIHsKICAgICAgICAgICAgICAgIHJldHVybiAoYml0cyAvIDEwMDApLnRvRml4ZWQoMikgKyAnIGtiaXQvcyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGJpdHMudG9GaXhlZCgyKSArICcgYml0L3MnOwogICAgICAgIH0sCgogICAgICAgIF9mb3JtYXRUaW1lOiBmdW5jdGlvbiAoc2Vjb25kcykgewogICAgICAgICAgICB2YXIgZGF0ZSA9IG5ldyBEYXRlKHNlY29uZHMgKiAxMDAwKSwKICAgICAgICAgICAgICAgIGRheXMgPSBwYXJzZUludChzZWNvbmRzIC8gODY0MDAsIDEwKTsKICAgICAgICAgICAgZGF5cyA9IGRheXMgPyBkYXlzICsgJ2QgJyA6ICcnOwogICAgICAgICAgICByZXR1cm4gZGF5cyArCiAgICAgICAgICAgICAgICAoJzAnICsgZGF0ZS5nZXRVVENIb3VycygpKS5zbGljZSgtMikgKyAnOicgKwogICAgICAgICAgICAgICAgKCcwJyArIGRhdGUuZ2V0VVRDTWludXRlcygpKS5zbGljZSgtMikgKyAnOicgKwogICAgICAgICAgICAgICAgKCcwJyArIGRhdGUuZ2V0VVRDU2Vjb25kcygpKS5zbGljZSgtMik7CiAgICAgICAgfSwKCiAgICAgICAgX2Zvcm1hdFBlcmNlbnRhZ2U6IGZ1bmN0aW9uIChmbG9hdFZhbHVlKSB7CiAgICAgICAgICAgIHJldHVybiAoZmxvYXRWYWx1ZSAqIDEwMCkudG9GaXhlZCgyKSArICcgJSc7CiAgICAgICAgfSwKCiAgICAgICAgX3JlbmRlckV4dGVuZGVkUHJvZ3Jlc3M6IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9mb3JtYXRCaXRyYXRlKGRhdGEuYml0cmF0ZSkgKyAnIHwgJyArCiAgICAgICAgICAgICAgICB0aGlzLl9mb3JtYXRUaW1lKAogICAgICAgICAgICAgICAgICAgIChkYXRhLnRvdGFsIC0gZGF0YS5sb2FkZWQpICogOCAvIGRhdGEuYml0cmF0ZQogICAgICAgICAgICAgICAgKSArICcgfCAnICsKICAgICAgICAgICAgICAgIHRoaXMuX2Zvcm1hdFBlcmNlbnRhZ2UoCiAgICAgICAgICAgICAgICAgICAgZGF0YS5sb2FkZWQgLyBkYXRhLnRvdGFsCiAgICAgICAgICAgICAgICApICsgJyB8ICcgKwogICAgICAgICAgICAgICAgdGhpcy5fZm9ybWF0RmlsZVNpemUoZGF0YS5sb2FkZWQpICsgJyAvICcgKwogICAgICAgICAgICAgICAgdGhpcy5fZm9ybWF0RmlsZVNpemUoZGF0YS50b3RhbCk7CiAgICAgICAgfSwKCiAgICAgICAgX2hhc0Vycm9yOiBmdW5jdGlvbiAoZmlsZSkgewogICAgICAgICAgICBpZiAoZmlsZS5lcnJvcikgewogICAgICAgICAgICAgICAgcmV0dXJuIGZpbGUuZXJyb3I7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gVGhlIG51bWJlciBvZiBhZGRlZCBmaWxlcyBpcyBzdWJ0cmFjdGVkIGZyb20KICAgICAgICAgICAgLy8gbWF4TnVtYmVyT2ZGaWxlcyBiZWZvcmUgdmFsaWRhdGlvbiwgc28gd2UgY2hlY2sgaWYKICAgICAgICAgICAgLy8gbWF4TnVtYmVyT2ZGaWxlcyBpcyBiZWxvdyAwIChpbnN0ZWFkIG9mIGJlbG93IDEpOgogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLm1heE51bWJlck9mRmlsZXMgPCAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJ01heGltdW0gbnVtYmVyIG9mIGZpbGVzIGV4Y2VlZGVkJzsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBGaWxlcyBhcmUgYWNjZXB0ZWQgaWYgZWl0aGVyIHRoZSBmaWxlIHR5cGUgb3IgdGhlIGZpbGUgbmFtZQogICAgICAgICAgICAvLyBtYXRjaGVzIGFnYWluc3QgdGhlIGFjY2VwdEZpbGVUeXBlcyByZWd1bGFyIGV4cHJlc3Npb24sIGFzCiAgICAgICAgICAgIC8vIG9ubHkgYnJvd3NlcnMgd2l0aCBzdXBwb3J0IGZvciB0aGUgRmlsZSBBUEkgcmVwb3J0IHRoZSB0eXBlOgogICAgICAgICAgICBpZiAoISh0aGlzLm9wdGlvbnMuYWNjZXB0RmlsZVR5cGVzLnRlc3QoZmlsZS50eXBlKSB8fAogICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5hY2NlcHRGaWxlVHlwZXMudGVzdChmaWxlLm5hbWUpKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICdGaWxldHlwZSBub3QgYWxsb3dlZCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5tYXhGaWxlU2l6ZSAmJgogICAgICAgICAgICAgICAgICAgIGZpbGUuc2l6ZSA+IHRoaXMub3B0aW9ucy5tYXhGaWxlU2l6ZSkgewogICAgICAgICAgICAgICAgcmV0dXJuICdGaWxlIGlzIHRvbyBiaWcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0eXBlb2YgZmlsZS5zaXplID09PSAnbnVtYmVyJyAmJgogICAgICAgICAgICAgICAgICAgIGZpbGUuc2l6ZSA8IHRoaXMub3B0aW9ucy5taW5GaWxlU2l6ZSkgewogICAgICAgICAgICAgICAgcmV0dXJuICdGaWxlIGlzIHRvbyBzbWFsbCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfSwKCiAgICAgICAgX3ZhbGlkYXRlOiBmdW5jdGlvbiAoZmlsZXMpIHsKICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLAogICAgICAgICAgICAgICAgdmFsaWQgPSAhIWZpbGVzLmxlbmd0aDsKICAgICAgICAgICAgJC5lYWNoKGZpbGVzLCBmdW5jdGlvbiAoaW5kZXgsIGZpbGUpIHsKICAgICAgICAgICAgICAgIGZpbGUuZXJyb3IgPSB0aGF0Ll9oYXNFcnJvcihmaWxlKTsKICAgICAgICAgICAgICAgIGlmIChmaWxlLmVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiB2YWxpZDsKICAgICAgICB9LAoKICAgICAgICBfcmVuZGVyVGVtcGxhdGU6IGZ1bmN0aW9uIChmdW5jLCBmaWxlcykgewogICAgICAgICAgICBpZiAoIWZ1bmMpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMoewogICAgICAgICAgICAgICAgZmlsZXM6IGZpbGVzLAogICAgICAgICAgICAgICAgZm9ybWF0RmlsZVNpemU6IHRoaXMuX2Zvcm1hdEZpbGVTaXplLAogICAgICAgICAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgJCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJCh0aGlzLm9wdGlvbnMudGVtcGxhdGVzQ29udGFpbmVyKS5odG1sKHJlc3VsdCkuY2hpbGRyZW4oKTsKICAgICAgICB9LAoKICAgICAgICBfcmVuZGVyUHJldmlldzogZnVuY3Rpb24gKGZpbGUsIG5vZGUpIHsKICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLAogICAgICAgICAgICAgICAgb3B0aW9ucyA9IHRoaXMub3B0aW9ucywKICAgICAgICAgICAgICAgIGRmZCA9ICQuRGVmZXJyZWQoKTsKICAgICAgICAgICAgcmV0dXJuICgobG9hZEltYWdlICYmIGxvYWRJbWFnZSgKICAgICAgICAgICAgICAgIGZpbGUsCiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoaW1nKSB7CiAgICAgICAgICAgICAgICAgICAgbm9kZS5hcHBlbmQoaW1nKTsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll9mb3JjZVJlZmxvdyhub2RlKTsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmFuc2l0aW9uKG5vZGUpLmRvbmUoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBkZmQucmVzb2x2ZVdpdGgobm9kZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEkLmNvbnRhaW5zKHRoYXQuZG9jdW1lbnRbMF0uYm9keSwgbm9kZVswXSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGVsZW1lbnQgaXMgbm90IHBhcnQgb2YgdGhlIERPTSwKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJhbnNpdGlvbiBldmVudHMgYXJlIG5vdCB0cmlnZ2VyZWQsCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvIHdlIGhhdmUgdG8gcmVzb2x2ZSBtYW51YWxseToKICAgICAgICAgICAgICAgICAgICAgICAgZGZkLnJlc29sdmVXaXRoKG5vZGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbWF4V2lkdGg6IG9wdGlvbnMucHJldmlld01heFdpZHRoLAogICAgICAgICAgICAgICAgICAgIG1heEhlaWdodDogb3B0aW9ucy5wcmV2aWV3TWF4SGVpZ2h0LAogICAgICAgICAgICAgICAgICAgIGNhbnZhczogb3B0aW9ucy5wcmV2aWV3QXNDYW52YXMKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKSkgfHwgZGZkLnJlc29sdmVXaXRoKG5vZGUpKSAmJiBkZmQ7CiAgICAgICAgfSwKCiAgICAgICAgX3JlbmRlclByZXZpZXdzOiBmdW5jdGlvbiAoZmlsZXMsIG5vZGVzKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7CiAgICAgICAgICAgIG5vZGVzLmZpbmQoJy5wcmV2aWV3IHNwYW4nKS5lYWNoKGZ1bmN0aW9uIChpbmRleCwgZWxlbWVudCkgewogICAgICAgICAgICAgICAgdmFyIGZpbGUgPSBmaWxlc1tpbmRleF07CiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5wcmV2aWV3U291cmNlRmlsZVR5cGVzLnRlc3QoZmlsZS50eXBlKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAoJC50eXBlKG9wdGlvbnMucHJldmlld1NvdXJjZU1heEZpbGVTaXplKSAhPT0gJ251bWJlcicgfHwKICAgICAgICAgICAgICAgICAgICAgICAgZmlsZS5zaXplIDwgb3B0aW9ucy5wcmV2aWV3U291cmNlTWF4RmlsZVNpemUpKSB7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fcHJvY2Vzc2luZ1F1ZXVlID0gdGhhdC5fcHJvY2Vzc2luZ1F1ZXVlLnBpcGUoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGZkID0gJC5EZWZlcnJlZCgpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9yZW5kZXJQcmV2aWV3KGZpbGUsICQoZWxlbWVudCkpLmRvbmUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGZkLnJlc29sdmVXaXRoKHRoYXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGZkLnByb21pc2UoKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcm9jZXNzaW5nUXVldWU7CiAgICAgICAgfSwKCiAgICAgICAgX3JlbmRlclVwbG9hZDogZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZW5kZXJUZW1wbGF0ZSgKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy51cGxvYWRUZW1wbGF0ZSwKICAgICAgICAgICAgICAgIGZpbGVzCiAgICAgICAgICAgICk7CiAgICAgICAgfSwKCiAgICAgICAgX3JlbmRlckRvd25sb2FkOiBmdW5jdGlvbiAoZmlsZXMpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JlbmRlclRlbXBsYXRlKAogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmRvd25sb2FkVGVtcGxhdGUsCiAgICAgICAgICAgICAgICBmaWxlcwogICAgICAgICAgICApLmZpbmQoJ2FbZG93bmxvYWRdJykuZWFjaCh0aGlzLl9lbmFibGVEcmFnVG9EZXNrdG9wKS5lbmQoKTsKICAgICAgICB9LAoKICAgICAgICBfc3RhcnRIYW5kbGVyOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgIHZhciBidXR0b24gPSAkKGUuY3VycmVudFRhcmdldCksCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9IGJ1dHRvbi5jbG9zZXN0KCcudGVtcGxhdGUtdXBsb2FkJyksCiAgICAgICAgICAgICAgICBkYXRhID0gdGVtcGxhdGUuZGF0YSgnZGF0YScpOwogICAgICAgICAgICBpZiAoZGF0YSAmJiBkYXRhLnN1Ym1pdCAmJiAhZGF0YS5qcVhIUiAmJiBkYXRhLnN1Ym1pdCgpKSB7CiAgICAgICAgICAgICAgICBidXR0b24ucHJvcCgnZGlzYWJsZWQnLCB0cnVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9jYW5jZWxIYW5kbGVyOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgIHZhciB0ZW1wbGF0ZSA9ICQoZS5jdXJyZW50VGFyZ2V0KS5jbG9zZXN0KCcudGVtcGxhdGUtdXBsb2FkJyksCiAgICAgICAgICAgICAgICBkYXRhID0gdGVtcGxhdGUuZGF0YSgnZGF0YScpIHx8IHt9OwogICAgICAgICAgICBpZiAoIWRhdGEuanFYSFIpIHsKICAgICAgICAgICAgICAgIGRhdGEuZXJyb3JUaHJvd24gPSAnYWJvcnQnOwogICAgICAgICAgICAgICAgdGhpcy5fdHJpZ2dlcignZmFpbCcsIGUsIGRhdGEpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZGF0YS5qcVhIUi5hYm9ydCgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2RlbGV0ZUhhbmRsZXI6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgdmFyIGJ1dHRvbiA9ICQoZS5jdXJyZW50VGFyZ2V0KTsKICAgICAgICAgICAgdGhpcy5fdHJpZ2dlcignZGVzdHJveScsIGUsICQuZXh0ZW5kKHsKICAgICAgICAgICAgICAgIGNvbnRleHQ6IGJ1dHRvbi5jbG9zZXN0KCcudGVtcGxhdGUtZG93bmxvYWQnKSwKICAgICAgICAgICAgICAgIHR5cGU6ICdERUxFVEUnLAogICAgICAgICAgICAgICAgZGF0YVR5cGU6IHRoaXMub3B0aW9ucy5kYXRhVHlwZQogICAgICAgICAgICB9LCBidXR0b24uZGF0YSgpKSk7CiAgICAgICAgfSwKCiAgICAgICAgX2ZvcmNlUmVmbG93OiBmdW5jdGlvbiAobm9kZSkgewogICAgICAgICAgICByZXR1cm4gJC5zdXBwb3J0LnRyYW5zaXRpb24gJiYgbm9kZS5sZW5ndGggJiYKICAgICAgICAgICAgICAgIG5vZGVbMF0ub2Zmc2V0V2lkdGg7CiAgICAgICAgfSwKCiAgICAgICAgX3RyYW5zaXRpb246IGZ1bmN0aW9uIChub2RlKSB7CiAgICAgICAgICAgIHZhciBkZmQgPSAkLkRlZmVycmVkKCk7CiAgICAgICAgICAgIGlmICgkLnN1cHBvcnQudHJhbnNpdGlvbiAmJiBub2RlLmhhc0NsYXNzKCdmYWRlJykpIHsKICAgICAgICAgICAgICAgIG5vZGUuYmluZCgKICAgICAgICAgICAgICAgICAgICAkLnN1cHBvcnQudHJhbnNpdGlvbi5lbmQsCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGRvbid0IHJlc3BvbmQgdG8gb3RoZXIgdHJhbnNpdGlvbnMgZXZlbnRzCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIHRoZSBjb250YWluZXIgZWxlbWVudCwgZS5nLiBmcm9tIGJ1dHRvbiBlbGVtZW50czoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUudGFyZ2V0ID09PSBub2RlWzBdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLnVuYmluZCgkLnN1cHBvcnQudHJhbnNpdGlvbi5lbmQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGZkLnJlc29sdmVXaXRoKG5vZGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKS50b2dnbGVDbGFzcygnaW4nKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIG5vZGUudG9nZ2xlQ2xhc3MoJ2luJyk7CiAgICAgICAgICAgICAgICBkZmQucmVzb2x2ZVdpdGgobm9kZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGRmZDsKICAgICAgICB9LAoKICAgICAgICBfaW5pdEJ1dHRvbkJhckV2ZW50SGFuZGxlcnM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIGZpbGVVcGxvYWRCdXR0b25CYXIgPSB0aGlzLmVsZW1lbnQuZmluZCgnLmZpbGV1cGxvYWQtYnV0dG9uYmFyJyksCiAgICAgICAgICAgICAgICBmaWxlc0xpc3QgPSB0aGlzLm9wdGlvbnMuZmlsZXNDb250YWluZXI7CiAgICAgICAgICAgIHRoaXMuX29uKGZpbGVVcGxvYWRCdXR0b25CYXIuZmluZCgnLnN0YXJ0JyksIHsKICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICBmaWxlc0xpc3QuZmluZCgnLnN0YXJ0IGJ1dHRvbicpLmNsaWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLl9vbihmaWxlVXBsb2FkQnV0dG9uQmFyLmZpbmQoJy5jYW5jZWwnKSwgewogICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgIGZpbGVzTGlzdC5maW5kKCcuY2FuY2VsIGJ1dHRvbicpLmNsaWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLl9vbihmaWxlVXBsb2FkQnV0dG9uQmFyLmZpbmQoJy5kZWxldGUnKSwgewogICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgIGZpbGVzTGlzdC5maW5kKCcuZGVsZXRlIGlucHV0OmNoZWNrZWQnKQogICAgICAgICAgICAgICAgICAgICAgICAuc2libGluZ3MoJ2J1dHRvbicpLmNsaWNrKCk7CiAgICAgICAgICAgICAgICAgICAgZmlsZVVwbG9hZEJ1dHRvbkJhci5maW5kKCcudG9nZ2xlJykKICAgICAgICAgICAgICAgICAgICAgICAgLnByb3AoJ2NoZWNrZWQnLCBmYWxzZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLl9vbihmaWxlVXBsb2FkQnV0dG9uQmFyLmZpbmQoJy50b2dnbGUnKSwgewogICAgICAgICAgICAgICAgY2hhbmdlOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGZpbGVzTGlzdC5maW5kKCcuZGVsZXRlIGlucHV0JykucHJvcCgKICAgICAgICAgICAgICAgICAgICAgICAgJ2NoZWNrZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAkKGUuY3VycmVudFRhcmdldCkuaXMoJzpjaGVja2VkJykKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBfZGVzdHJveUJ1dHRvbkJhckV2ZW50SGFuZGxlcnM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5fb2ZmKAogICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50LmZpbmQoJy5maWxldXBsb2FkLWJ1dHRvbmJhciBidXR0b24nKSwKICAgICAgICAgICAgICAgICdjbGljaycKICAgICAgICAgICAgKTsKICAgICAgICAgICAgdGhpcy5fb2ZmKAogICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50LmZpbmQoJy5maWxldXBsb2FkLWJ1dHRvbmJhciAudG9nZ2xlJyksCiAgICAgICAgICAgICAgICAnY2hhbmdlLicKICAgICAgICAgICAgKTsKICAgICAgICB9LAoKICAgICAgICBfaW5pdEV2ZW50SGFuZGxlcnM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5fc3VwZXIoKTsKICAgICAgICAgICAgdGhpcy5fb24odGhpcy5vcHRpb25zLmZpbGVzQ29udGFpbmVyLCB7CiAgICAgICAgICAgICAgICAnY2xpY2sgLnN0YXJ0IGJ1dHRvbic6IHRoaXMuX3N0YXJ0SGFuZGxlciwKICAgICAgICAgICAgICAgICdjbGljayAuY2FuY2VsIGJ1dHRvbic6IHRoaXMuX2NhbmNlbEhhbmRsZXIsCiAgICAgICAgICAgICAgICAnY2xpY2sgLmRlbGV0ZSBidXR0b24nOiB0aGlzLl9kZWxldGVIYW5kbGVyCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLl9pbml0QnV0dG9uQmFyRXZlbnRIYW5kbGVycygpOwogICAgICAgIH0sCgogICAgICAgIF9kZXN0cm95RXZlbnRIYW5kbGVyczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLl9kZXN0cm95QnV0dG9uQmFyRXZlbnRIYW5kbGVycygpOwogICAgICAgICAgICB0aGlzLl9vZmYodGhpcy5vcHRpb25zLmZpbGVzQ29udGFpbmVyLCAnY2xpY2snKTsKICAgICAgICAgICAgdGhpcy5fc3VwZXIoKTsKICAgICAgICB9LAoKICAgICAgICBfZW5hYmxlRmlsZUlucHV0QnV0dG9uOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5maW5kKCcuZmlsZWlucHV0LWJ1dHRvbiBpbnB1dCcpCiAgICAgICAgICAgICAgICAucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSkKICAgICAgICAgICAgICAgIC5wYXJlbnQoKS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTsKICAgICAgICB9LAoKICAgICAgICBfZGlzYWJsZUZpbGVJbnB1dEJ1dHRvbjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLmVsZW1lbnQuZmluZCgnLmZpbGVpbnB1dC1idXR0b24gaW5wdXQnKQogICAgICAgICAgICAgICAgLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSkKICAgICAgICAgICAgICAgIC5wYXJlbnQoKS5hZGRDbGFzcygnZGlzYWJsZWQnKTsKICAgICAgICB9LAoKICAgICAgICBfaW5pdFRlbXBsYXRlczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9uczsKICAgICAgICAgICAgb3B0aW9ucy50ZW1wbGF0ZXNDb250YWluZXIgPSB0aGlzLmRvY3VtZW50WzBdLmNyZWF0ZUVsZW1lbnQoCiAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVzQ29udGFpbmVyLnByb3AoJ25vZGVOYW1lJykKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKHRtcGwpIHsKICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnVwbG9hZFRlbXBsYXRlSWQpIHsKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnVwbG9hZFRlbXBsYXRlID0gdG1wbChvcHRpb25zLnVwbG9hZFRlbXBsYXRlSWQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuZG93bmxvYWRUZW1wbGF0ZUlkKSB7CiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5kb3dubG9hZFRlbXBsYXRlID0gdG1wbChvcHRpb25zLmRvd25sb2FkVGVtcGxhdGVJZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBfaW5pdEZpbGVzQ29udGFpbmVyOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zOwogICAgICAgICAgICBpZiAob3B0aW9ucy5maWxlc0NvbnRhaW5lciA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVzQ29udGFpbmVyID0gdGhpcy5lbGVtZW50LmZpbmQoJy5maWxlcycpOwogICAgICAgICAgICB9IGVsc2UgaWYgKCEob3B0aW9ucy5maWxlc0NvbnRhaW5lciBpbnN0YW5jZW9mICQpKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVzQ29udGFpbmVyID0gJChvcHRpb25zLmZpbGVzQ29udGFpbmVyKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9zdHJpbmdUb1JlZ0V4cDogZnVuY3Rpb24gKHN0cikgewogICAgICAgICAgICB2YXIgcGFydHMgPSBzdHIuc3BsaXQoJy8nKSwKICAgICAgICAgICAgICAgIG1vZGlmaWVycyA9IHBhcnRzLnBvcCgpOwogICAgICAgICAgICBwYXJ0cy5zaGlmdCgpOwogICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChwYXJ0cy5qb2luKCcvJyksIG1vZGlmaWVycyk7CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRSZWdFeHBPcHRpb25zOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zOwogICAgICAgICAgICBpZiAoJC50eXBlKG9wdGlvbnMuYWNjZXB0RmlsZVR5cGVzKSA9PT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuYWNjZXB0RmlsZVR5cGVzID0gdGhpcy5fc3RyaW5nVG9SZWdFeHAoCiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5hY2NlcHRGaWxlVHlwZXMKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCQudHlwZShvcHRpb25zLnByZXZpZXdTb3VyY2VGaWxlVHlwZXMpID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgb3B0aW9ucy5wcmV2aWV3U291cmNlRmlsZVR5cGVzID0gdGhpcy5fc3RyaW5nVG9SZWdFeHAoCiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wcmV2aWV3U291cmNlRmlsZVR5cGVzCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRTcGVjaWFsT3B0aW9uczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLl9zdXBlcigpOwogICAgICAgICAgICB0aGlzLl9pbml0RmlsZXNDb250YWluZXIoKTsKICAgICAgICAgICAgdGhpcy5faW5pdFRlbXBsYXRlcygpOwogICAgICAgICAgICB0aGlzLl9pbml0UmVnRXhwT3B0aW9ucygpOwogICAgICAgIH0sCgogICAgICAgIF9jcmVhdGU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5fc3VwZXIoKTsKICAgICAgICAgICAgdGhpcy5fcmVmcmVzaE9wdGlvbnNMaXN0LnB1c2goCiAgICAgICAgICAgICAgICAnZmlsZXNDb250YWluZXInLAogICAgICAgICAgICAgICAgJ3VwbG9hZFRlbXBsYXRlSWQnLAogICAgICAgICAgICAgICAgJ2Rvd25sb2FkVGVtcGxhdGVJZCcKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCF0aGlzLl9wcm9jZXNzaW5nUXVldWUpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3NpbmdRdWV1ZSA9ICQuRGVmZXJyZWQoKS5yZXNvbHZlV2l0aCh0aGlzKS5wcm9taXNlKCk7CiAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3MgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2Nlc3NpbmdRdWV1ZTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fcmVzZXRGaW5pc2hlZERlZmVycmVkcygpOwogICAgICAgIH0sCgogICAgICAgIGVuYWJsZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgd2FzRGlzYWJsZWQgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5kaXNhYmxlZCkgewogICAgICAgICAgICAgICAgd2FzRGlzYWJsZWQgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX3N1cGVyKCk7CiAgICAgICAgICAgIGlmICh3YXNEaXNhYmxlZCkgewogICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50LmZpbmQoJ2lucHV0LCBidXR0b24nKS5wcm9wKCdkaXNhYmxlZCcsIGZhbHNlKTsKICAgICAgICAgICAgICAgIHRoaXMuX2VuYWJsZUZpbGVJbnB1dEJ1dHRvbigpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZGlzYWJsZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5kaXNhYmxlZCkgewogICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50LmZpbmQoJ2lucHV0LCBidXR0b24nKS5wcm9wKCdkaXNhYmxlZCcsIHRydWUpOwogICAgICAgICAgICAgICAgdGhpcy5fZGlzYWJsZUZpbGVJbnB1dEJ1dHRvbigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX3N1cGVyKCk7CiAgICAgICAgfQoKICAgIH0pOwoKfSkpOwo=]]></data>
	</file>
	<file>
	  <filename>/lib/fileupload.lib/js/jquery.fileupload.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFBsdWdpbiA1LjE5LjcKICogaHR0cHM6Ly9naXRodWIuY29tL2JsdWVpbXAvalF1ZXJ5LUZpbGUtVXBsb2FkCiAqCiAqIENvcHlyaWdodCAyMDEwLCBTZWJhc3RpYW4gVHNjaGFuCiAqIGh0dHBzOi8vYmx1ZWltcC5uZXQKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlOgogKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVAogKi8KCi8qanNsaW50IG5vbWVuOiB0cnVlLCB1bnBhcmFtOiB0cnVlLCByZWdleHA6IHRydWUgKi8KLypnbG9iYWwgZGVmaW5lLCB3aW5kb3csIGRvY3VtZW50LCBGaWxlLCBCbG9iLCBGb3JtRGF0YSwgbG9jYXRpb24gKi8KCihmdW5jdGlvbiAoZmFjdG9yeSkgewogICAgJ3VzZSBzdHJpY3QnOwogICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkgewogICAgICAgIC8vIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBBTUQgbW9kdWxlOgogICAgICAgIGRlZmluZShbCiAgICAgICAgICAgICdqcXVlcnknLAogICAgICAgICAgICAnanF1ZXJ5LnVpLndpZGdldCcKICAgICAgICBdLCBmYWN0b3J5KTsKICAgIH0gZWxzZSB7CiAgICAgICAgLy8gQnJvd3NlciBnbG9iYWxzOgogICAgICAgIGZhY3Rvcnkod2luZG93LmpRdWVyeSk7CiAgICB9Cn0oZnVuY3Rpb24gKCQpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICAvLyBUaGUgRmlsZVJlYWRlciBBUEkgaXMgbm90IGFjdHVhbGx5IHVzZWQsIGJ1dCB3b3JrcyBhcyBmZWF0dXJlIGRldGVjdGlvbiwKICAgIC8vIGFzIGUuZy4gU2FmYXJpIHN1cHBvcnRzIFhIUiBmaWxlIHVwbG9hZHMgdmlhIHRoZSBGb3JtRGF0YSBBUEksCiAgICAvLyBidXQgbm90IG5vbi1tdWx0aXBhcnQgWEhSIGZpbGUgdXBsb2FkczoKICAgICQuc3VwcG9ydC54aHJGaWxlVXBsb2FkID0gISEod2luZG93LlhNTEh0dHBSZXF1ZXN0VXBsb2FkICYmIHdpbmRvdy5GaWxlUmVhZGVyKTsKICAgICQuc3VwcG9ydC54aHJGb3JtRGF0YUZpbGVVcGxvYWQgPSAhIXdpbmRvdy5Gb3JtRGF0YTsKCiAgICAvLyBUaGUgZmlsZXVwbG9hZCB3aWRnZXQgbGlzdGVucyBmb3IgY2hhbmdlIGV2ZW50cyBvbiBmaWxlIGlucHV0IGZpZWxkcyBkZWZpbmVkCiAgICAvLyB2aWEgZmlsZUlucHV0IHNldHRpbmcgYW5kIHBhc3RlIG9yIGRyb3AgZXZlbnRzIG9mIHRoZSBnaXZlbiBkcm9wWm9uZS4KICAgIC8vIEluIGFkZGl0aW9uIHRvIHRoZSBkZWZhdWx0IGpRdWVyeSBXaWRnZXQgbWV0aG9kcywgdGhlIGZpbGV1cGxvYWQgd2lkZ2V0CiAgICAvLyBleHBvc2VzIHRoZSAiYWRkIiBhbmQgInNlbmQiIG1ldGhvZHMsIHRvIGFkZCBvciBkaXJlY3RseSBzZW5kIGZpbGVzIHVzaW5nCiAgICAvLyB0aGUgZmlsZXVwbG9hZCBBUEkuCiAgICAvLyBCeSBkZWZhdWx0LCBmaWxlcyBhZGRlZCB2aWEgZmlsZSBpbnB1dCBzZWxlY3Rpb24sIHBhc3RlLCBkcmFnICYgZHJvcCBvcgogICAgLy8gImFkZCIgbWV0aG9kIGFyZSB1cGxvYWRlZCBpbW1lZGlhdGVseSwgYnV0IGl0IGlzIHBvc3NpYmxlIHRvIG92ZXJyaWRlCiAgICAvLyB0aGUgImFkZCIgY2FsbGJhY2sgb3B0aW9uIHRvIHF1ZXVlIGZpbGUgdXBsb2Fkcy4KICAgICQud2lkZ2V0KCdibHVlaW1wLmZpbGV1cGxvYWQnLCB7CgogICAgICAgIG9wdGlvbnM6IHsKICAgICAgICAgICAgLy8gVGhlIGRyb3AgdGFyZ2V0IGVsZW1lbnQocyksIGJ5IHRoZSBkZWZhdWx0IHRoZSBjb21wbGV0ZSBkb2N1bWVudC4KICAgICAgICAgICAgLy8gU2V0IHRvIG51bGwgdG8gZGlzYWJsZSBkcmFnICYgZHJvcCBzdXBwb3J0OgogICAgICAgICAgICBkcm9wWm9uZTogJChkb2N1bWVudCksCiAgICAgICAgICAgIC8vIFRoZSBwYXN0ZSB0YXJnZXQgZWxlbWVudChzKSwgYnkgdGhlIGRlZmF1bHQgdGhlIGNvbXBsZXRlIGRvY3VtZW50LgogICAgICAgICAgICAvLyBTZXQgdG8gbnVsbCB0byBkaXNhYmxlIHBhc3RlIHN1cHBvcnQ6CiAgICAgICAgICAgIHBhc3RlWm9uZTogJChkb2N1bWVudCksCiAgICAgICAgICAgIC8vIFRoZSBmaWxlIGlucHV0IGZpZWxkKHMpLCB0aGF0IGFyZSBsaXN0ZW5lZCB0byBmb3IgY2hhbmdlIGV2ZW50cy4KICAgICAgICAgICAgLy8gSWYgdW5kZWZpbmVkLCBpdCBpcyBzZXQgdG8gdGhlIGZpbGUgaW5wdXQgZmllbGRzIGluc2lkZQogICAgICAgICAgICAvLyBvZiB0aGUgd2lkZ2V0IGVsZW1lbnQgb24gcGx1Z2luIGluaXRpYWxpemF0aW9uLgogICAgICAgICAgICAvLyBTZXQgdG8gbnVsbCB0byBkaXNhYmxlIHRoZSBjaGFuZ2UgbGlzdGVuZXIuCiAgICAgICAgICAgIGZpbGVJbnB1dDogdW5kZWZpbmVkLAogICAgICAgICAgICAvLyBCeSBkZWZhdWx0LCB0aGUgZmlsZSBpbnB1dCBmaWVsZCBpcyByZXBsYWNlZCB3aXRoIGEgY2xvbmUgYWZ0ZXIKICAgICAgICAgICAgLy8gZWFjaCBpbnB1dCBmaWVsZCBjaGFuZ2UgZXZlbnQuIFRoaXMgaXMgcmVxdWlyZWQgZm9yIGlmcmFtZSB0cmFuc3BvcnQKICAgICAgICAgICAgLy8gcXVldWVzIGFuZCBhbGxvd3MgY2hhbmdlIGV2ZW50cyB0byBiZSBmaXJlZCBmb3IgdGhlIHNhbWUgZmlsZQogICAgICAgICAgICAvLyBzZWxlY3Rpb24sIGJ1dCBjYW4gYmUgZGlzYWJsZWQgYnkgc2V0dGluZyB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byBmYWxzZToKICAgICAgICAgICAgcmVwbGFjZUZpbGVJbnB1dDogdHJ1ZSwKICAgICAgICAgICAgLy8gVGhlIHBhcmFtZXRlciBuYW1lIGZvciB0aGUgZmlsZSBmb3JtIGRhdGEgKHRoZSByZXF1ZXN0IGFyZ3VtZW50IG5hbWUpLgogICAgICAgICAgICAvLyBJZiB1bmRlZmluZWQgb3IgZW1wdHksIHRoZSBuYW1lIHByb3BlcnR5IG9mIHRoZSBmaWxlIGlucHV0IGZpZWxkIGlzCiAgICAgICAgICAgIC8vIHVzZWQsIG9yICJmaWxlc1tdIiBpZiB0aGUgZmlsZSBpbnB1dCBuYW1lIHByb3BlcnR5IGlzIGFsc28gZW1wdHksCiAgICAgICAgICAgIC8vIGNhbiBiZSBhIHN0cmluZyBvciBhbiBhcnJheSBvZiBzdHJpbmdzOgogICAgICAgICAgICBwYXJhbU5hbWU6IHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gQnkgZGVmYXVsdCwgZWFjaCBmaWxlIG9mIGEgc2VsZWN0aW9uIGlzIHVwbG9hZGVkIHVzaW5nIGFuIGluZGl2aWR1YWwKICAgICAgICAgICAgLy8gcmVxdWVzdCBmb3IgWEhSIHR5cGUgdXBsb2Fkcy4gU2V0IHRvIGZhbHNlIHRvIHVwbG9hZCBmaWxlCiAgICAgICAgICAgIC8vIHNlbGVjdGlvbnMgaW4gb25lIHJlcXVlc3QgZWFjaDoKICAgICAgICAgICAgc2luZ2xlRmlsZVVwbG9hZHM6IHRydWUsCiAgICAgICAgICAgIC8vIFRvIGxpbWl0IHRoZSBudW1iZXIgb2YgZmlsZXMgdXBsb2FkZWQgd2l0aCBvbmUgWEhSIHJlcXVlc3QsCiAgICAgICAgICAgIC8vIHNldCB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byBhbiBpbnRlZ2VyIGdyZWF0ZXIgdGhhbiAwOgogICAgICAgICAgICBsaW1pdE11bHRpRmlsZVVwbG9hZHM6IHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gU2V0IHRoZSBmb2xsb3dpbmcgb3B0aW9uIHRvIHRydWUgdG8gaXNzdWUgYWxsIGZpbGUgdXBsb2FkIHJlcXVlc3RzCiAgICAgICAgICAgIC8vIGluIGEgc2VxdWVudGlhbCBvcmRlcjoKICAgICAgICAgICAgc2VxdWVudGlhbFVwbG9hZHM6IGZhbHNlLAogICAgICAgICAgICAvLyBUbyBsaW1pdCB0aGUgbnVtYmVyIG9mIGNvbmN1cnJlbnQgdXBsb2FkcywKICAgICAgICAgICAgLy8gc2V0IHRoZSBmb2xsb3dpbmcgb3B0aW9uIHRvIGFuIGludGVnZXIgZ3JlYXRlciB0aGFuIDA6CiAgICAgICAgICAgIGxpbWl0Q29uY3VycmVudFVwbG9hZHM6IHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gU2V0IHRoZSBmb2xsb3dpbmcgb3B0aW9uIHRvIHRydWUgdG8gZm9yY2UgaWZyYW1lIHRyYW5zcG9ydCB1cGxvYWRzOgogICAgICAgICAgICBmb3JjZUlmcmFtZVRyYW5zcG9ydDogZmFsc2UsCiAgICAgICAgICAgIC8vIFNldCB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byB0aGUgbG9jYXRpb24gb2YgYSByZWRpcmVjdCB1cmwgb24gdGhlCiAgICAgICAgICAgIC8vIG9yaWdpbiBzZXJ2ZXIsIGZvciBjcm9zcy1kb21haW4gaWZyYW1lIHRyYW5zcG9ydCB1cGxvYWRzOgogICAgICAgICAgICByZWRpcmVjdDogdW5kZWZpbmVkLAogICAgICAgICAgICAvLyBUaGUgcGFyYW1ldGVyIG5hbWUgZm9yIHRoZSByZWRpcmVjdCB1cmwsIHNlbnQgYXMgcGFydCBvZiB0aGUgZm9ybQogICAgICAgICAgICAvLyBkYXRhIGFuZCBzZXQgdG8gJ3JlZGlyZWN0JyBpZiB0aGlzIG9wdGlvbiBpcyBlbXB0eToKICAgICAgICAgICAgcmVkaXJlY3RQYXJhbU5hbWU6IHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gU2V0IHRoZSBmb2xsb3dpbmcgb3B0aW9uIHRvIHRoZSBsb2NhdGlvbiBvZiBhIHBvc3RNZXNzYWdlIHdpbmRvdywKICAgICAgICAgICAgLy8gdG8gZW5hYmxlIHBvc3RNZXNzYWdlIHRyYW5zcG9ydCB1cGxvYWRzOgogICAgICAgICAgICBwb3N0TWVzc2FnZTogdW5kZWZpbmVkLAogICAgICAgICAgICAvLyBCeSBkZWZhdWx0LCBYSFIgZmlsZSB1cGxvYWRzIGFyZSBzZW50IGFzIG11bHRpcGFydC9mb3JtLWRhdGEuCiAgICAgICAgICAgIC8vIFRoZSBpZnJhbWUgdHJhbnNwb3J0IGlzIGFsd2F5cyB1c2luZyBtdWx0aXBhcnQvZm9ybS1kYXRhLgogICAgICAgICAgICAvLyBTZXQgdG8gZmFsc2UgdG8gZW5hYmxlIG5vbi1tdWx0aXBhcnQgWEhSIHVwbG9hZHM6CiAgICAgICAgICAgIG11bHRpcGFydDogdHJ1ZSwKICAgICAgICAgICAgLy8gVG8gdXBsb2FkIGxhcmdlIGZpbGVzIGluIHNtYWxsZXIgY2h1bmtzLCBzZXQgdGhlIGZvbGxvd2luZyBvcHRpb24KICAgICAgICAgICAgLy8gdG8gYSBwcmVmZXJyZWQgbWF4aW11bSBjaHVuayBzaXplLiBJZiBzZXQgdG8gMCwgbnVsbCBvciB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIG9yIHRoZSBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgdGhlIHJlcXVpcmVkIEJsb2IgQVBJLCBmaWxlcyB3aWxsCiAgICAgICAgICAgIC8vIGJlIHVwbG9hZGVkIGFzIGEgd2hvbGUuCiAgICAgICAgICAgIG1heENodW5rU2l6ZTogdW5kZWZpbmVkLAogICAgICAgICAgICAvLyBXaGVuIGEgbm9uLW11bHRpcGFydCB1cGxvYWQgb3IgYSBjaHVua2VkIG11bHRpcGFydCB1cGxvYWQgaGFzIGJlZW4KICAgICAgICAgICAgLy8gYWJvcnRlZCwgdGhpcyBvcHRpb24gY2FuIGJlIHVzZWQgdG8gcmVzdW1lIHRoZSB1cGxvYWQgYnkgc2V0dGluZwogICAgICAgICAgICAvLyBpdCB0byB0aGUgc2l6ZSBvZiB0aGUgYWxyZWFkeSB1cGxvYWRlZCBieXRlcy4gVGhpcyBvcHRpb24gaXMgbW9zdAogICAgICAgICAgICAvLyB1c2VmdWwgd2hlbiBtb2RpZnlpbmcgdGhlIG9wdGlvbnMgb2JqZWN0IGluc2lkZSBvZiB0aGUgImFkZCIgb3IKICAgICAgICAgICAgLy8gInNlbmQiIGNhbGxiYWNrcywgYXMgdGhlIG9wdGlvbnMgYXJlIGNsb25lZCBmb3IgZWFjaCBmaWxlIHVwbG9hZC4KICAgICAgICAgICAgdXBsb2FkZWRCeXRlczogdW5kZWZpbmVkLAogICAgICAgICAgICAvLyBCeSBkZWZhdWx0LCBmYWlsZWQgKGFib3J0IG9yIGVycm9yKSBmaWxlIHVwbG9hZHMgYXJlIHJlbW92ZWQgZnJvbSB0aGUKICAgICAgICAgICAgLy8gZ2xvYmFsIHByb2dyZXNzIGNhbGN1bGF0aW9uLiBTZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gZmFsc2UgdG8KICAgICAgICAgICAgLy8gcHJldmVudCByZWNhbGN1bGF0aW5nIHRoZSBnbG9iYWwgcHJvZ3Jlc3MgZGF0YToKICAgICAgICAgICAgcmVjYWxjdWxhdGVQcm9ncmVzczogdHJ1ZSwKICAgICAgICAgICAgLy8gSW50ZXJ2YWwgaW4gbWlsbGlzZWNvbmRzIHRvIGNhbGN1bGF0ZSBhbmQgdHJpZ2dlciBwcm9ncmVzcyBldmVudHM6CiAgICAgICAgICAgIHByb2dyZXNzSW50ZXJ2YWw6IDEwMCwKICAgICAgICAgICAgLy8gSW50ZXJ2YWwgaW4gbWlsbGlzZWNvbmRzIHRvIGNhbGN1bGF0ZSBwcm9ncmVzcyBiaXRyYXRlOgogICAgICAgICAgICBiaXRyYXRlSW50ZXJ2YWw6IDUwMCwKCiAgICAgICAgICAgIC8vIEFkZGl0aW9uYWwgZm9ybSBkYXRhIHRvIGJlIHNlbnQgYWxvbmcgd2l0aCB0aGUgZmlsZSB1cGxvYWRzIGNhbiBiZSBzZXQKICAgICAgICAgICAgLy8gdXNpbmcgdGhpcyBvcHRpb24sIHdoaWNoIGFjY2VwdHMgYW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoIG5hbWUgYW5kCiAgICAgICAgICAgIC8vIHZhbHVlIHByb3BlcnRpZXMsIGEgZnVuY3Rpb24gcmV0dXJuaW5nIHN1Y2ggYW4gYXJyYXksIGEgRm9ybURhdGEKICAgICAgICAgICAgLy8gb2JqZWN0IChmb3IgWEhSIGZpbGUgdXBsb2FkcyksIG9yIGEgc2ltcGxlIG9iamVjdC4KICAgICAgICAgICAgLy8gVGhlIGZvcm0gb2YgdGhlIGZpcnN0IGZpbGVJbnB1dCBpcyBnaXZlbiBhcyBwYXJhbWV0ZXIgdG8gdGhlIGZ1bmN0aW9uOgogICAgICAgICAgICBmb3JtRGF0YTogZnVuY3Rpb24gKGZvcm0pIHsKICAgICAgICAgICAgICAgIHJldHVybiBmb3JtLnNlcmlhbGl6ZUFycmF5KCk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvLyBUaGUgYWRkIGNhbGxiYWNrIGlzIGludm9rZWQgYXMgc29vbiBhcyBmaWxlcyBhcmUgYWRkZWQgdG8gdGhlIGZpbGV1cGxvYWQKICAgICAgICAgICAgLy8gd2lkZ2V0ICh2aWEgZmlsZSBpbnB1dCBzZWxlY3Rpb24sIGRyYWcgJiBkcm9wLCBwYXN0ZSBvciBhZGQgQVBJIGNhbGwpLgogICAgICAgICAgICAvLyBJZiB0aGUgc2luZ2xlRmlsZVVwbG9hZHMgb3B0aW9uIGlzIGVuYWJsZWQsIHRoaXMgY2FsbGJhY2sgd2lsbCBiZQogICAgICAgICAgICAvLyBjYWxsZWQgb25jZSBmb3IgZWFjaCBmaWxlIGluIHRoZSBzZWxlY3Rpb24gZm9yIFhIUiBmaWxlIHVwbGFvZHMsIGVsc2UKICAgICAgICAgICAgLy8gb25jZSBmb3IgZWFjaCBmaWxlIHNlbGVjdGlvbi4KICAgICAgICAgICAgLy8gVGhlIHVwbG9hZCBzdGFydHMgd2hlbiB0aGUgc3VibWl0IG1ldGhvZCBpcyBpbnZva2VkIG9uIHRoZSBkYXRhIHBhcmFtZXRlci4KICAgICAgICAgICAgLy8gVGhlIGRhdGEgb2JqZWN0IGNvbnRhaW5zIGEgZmlsZXMgcHJvcGVydHkgaG9sZGluZyB0aGUgYWRkZWQgZmlsZXMKICAgICAgICAgICAgLy8gYW5kIGFsbG93cyB0byBvdmVycmlkZSBwbHVnaW4gb3B0aW9ucyBhcyB3ZWxsIGFzIGRlZmluZSBhamF4IHNldHRpbmdzLgogICAgICAgICAgICAvLyBMaXN0ZW5lcnMgZm9yIHRoaXMgY2FsbGJhY2sgY2FuIGFsc28gYmUgYm91bmQgdGhlIGZvbGxvd2luZyB3YXk6CiAgICAgICAgICAgIC8vIC5iaW5kKCdmaWxldXBsb2FkYWRkJywgZnVuYyk7CiAgICAgICAgICAgIC8vIGRhdGEuc3VibWl0KCkgcmV0dXJucyBhIFByb21pc2Ugb2JqZWN0IGFuZCBhbGxvd3MgdG8gYXR0YWNoIGFkZGl0aW9uYWwKICAgICAgICAgICAgLy8gaGFuZGxlcnMgdXNpbmcgalF1ZXJ5J3MgRGVmZXJyZWQgY2FsbGJhY2tzOgogICAgICAgICAgICAvLyBkYXRhLnN1Ym1pdCgpLmRvbmUoZnVuYykuZmFpbChmdW5jKS5hbHdheXMoZnVuYyk7CiAgICAgICAgICAgIGFkZDogZnVuY3Rpb24gKGUsIGRhdGEpIHsKICAgICAgICAgICAgICAgIGRhdGEuc3VibWl0KCk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvLyBPdGhlciBjYWxsYmFja3M6CiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciB0aGUgc3VibWl0IGV2ZW50IG9mIGVhY2ggZmlsZSB1cGxvYWQ6CiAgICAgICAgICAgIC8vIHN1Ym1pdDogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZHN1Ym1pdCcsIGZ1bmMpOwogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgdGhlIHN0YXJ0IG9mIGVhY2ggZmlsZSB1cGxvYWQgcmVxdWVzdDoKICAgICAgICAgICAgLy8gc2VuZDogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZHNlbmQnLCBmdW5jKTsKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHN1Y2Nlc3NmdWwgdXBsb2FkczoKICAgICAgICAgICAgLy8gZG9uZTogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZGRvbmUnLCBmdW5jKTsKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIGZhaWxlZCAoYWJvcnQgb3IgZXJyb3IpIHVwbG9hZHM6CiAgICAgICAgICAgIC8vIGZhaWw6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRmYWlsJywgZnVuYyk7CiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBjb21wbGV0ZWQgKHN1Y2Nlc3MsIGFib3J0IG9yIGVycm9yKSByZXF1ZXN0czoKICAgICAgICAgICAgLy8gYWx3YXlzOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkYWx3YXlzJywgZnVuYyk7CiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciB1cGxvYWQgcHJvZ3Jlc3MgZXZlbnRzOgogICAgICAgICAgICAvLyBwcm9ncmVzczogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZHByb2dyZXNzJywgZnVuYyk7CiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBnbG9iYWwgdXBsb2FkIHByb2dyZXNzIGV2ZW50czoKICAgICAgICAgICAgLy8gcHJvZ3Jlc3NhbGw6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRwcm9ncmVzc2FsbCcsIGZ1bmMpOwogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgdXBsb2FkcyBzdGFydCwgZXF1aXZhbGVudCB0byB0aGUgZ2xvYmFsIGFqYXhTdGFydCBldmVudDoKICAgICAgICAgICAgLy8gc3RhcnQ6IGZ1bmN0aW9uIChlKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRzdGFydCcsIGZ1bmMpOwogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgdXBsb2FkcyBzdG9wLCBlcXVpdmFsZW50IHRvIHRoZSBnbG9iYWwgYWpheFN0b3AgZXZlbnQ6CiAgICAgICAgICAgIC8vIHN0b3A6IGZ1bmN0aW9uIChlKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRzdG9wJywgZnVuYyk7CiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBjaGFuZ2UgZXZlbnRzIG9mIHRoZSBmaWxlSW5wdXQocyk6CiAgICAgICAgICAgIC8vIGNoYW5nZTogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZGNoYW5nZScsIGZ1bmMpOwogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgcGFzdGUgZXZlbnRzIHRvIHRoZSBwYXN0ZVpvbmUocyk6CiAgICAgICAgICAgIC8vIHBhc3RlOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkcGFzdGUnLCBmdW5jKTsKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIGRyb3AgZXZlbnRzIG9mIHRoZSBkcm9wWm9uZShzKToKICAgICAgICAgICAgLy8gZHJvcDogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZGRyb3AnLCBmdW5jKTsKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIGRyYWdvdmVyIGV2ZW50cyBvZiB0aGUgZHJvcFpvbmUocyk6CiAgICAgICAgICAgIC8vIGRyYWdvdmVyOiBmdW5jdGlvbiAoZSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkZHJhZ292ZXInLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIFRoZSBwbHVnaW4gb3B0aW9ucyBhcmUgdXNlZCBhcyBzZXR0aW5ncyBvYmplY3QgZm9yIHRoZSBhamF4IGNhbGxzLgogICAgICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGFyZSBqUXVlcnkgYWpheCBzZXR0aW5ncyByZXF1aXJlZCBmb3IgdGhlIGZpbGUgdXBsb2FkczoKICAgICAgICAgICAgcHJvY2Vzc0RhdGE6IGZhbHNlLAogICAgICAgICAgICBjb250ZW50VHlwZTogZmFsc2UsCiAgICAgICAgICAgIGNhY2hlOiBmYWxzZQogICAgICAgIH0sCgogICAgICAgIC8vIEEgbGlzdCBvZiBvcHRpb25zIHRoYXQgcmVxdWlyZSBhIHJlZnJlc2ggYWZ0ZXIgYXNzaWduaW5nIGEgbmV3IHZhbHVlOgogICAgICAgIF9yZWZyZXNoT3B0aW9uc0xpc3Q6IFsKICAgICAgICAgICAgJ2ZpbGVJbnB1dCcsCiAgICAgICAgICAgICdkcm9wWm9uZScsCiAgICAgICAgICAgICdwYXN0ZVpvbmUnLAogICAgICAgICAgICAnbXVsdGlwYXJ0JywKICAgICAgICAgICAgJ2ZvcmNlSWZyYW1lVHJhbnNwb3J0JwogICAgICAgIF0sCgogICAgICAgIF9CaXRyYXRlVGltZXI6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy50aW1lc3RhbXAgPSArKG5ldyBEYXRlKCkpOwogICAgICAgICAgICB0aGlzLmxvYWRlZCA9IDA7CiAgICAgICAgICAgIHRoaXMuYml0cmF0ZSA9IDA7CiAgICAgICAgICAgIHRoaXMuZ2V0Qml0cmF0ZSA9IGZ1bmN0aW9uIChub3csIGxvYWRlZCwgaW50ZXJ2YWwpIHsKICAgICAgICAgICAgICAgIHZhciB0aW1lRGlmZiA9IG5vdyAtIHRoaXMudGltZXN0YW1wOwogICAgICAgICAgICAgICAgaWYgKCF0aGlzLmJpdHJhdGUgfHwgIWludGVydmFsIHx8IHRpbWVEaWZmID4gaW50ZXJ2YWwpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmJpdHJhdGUgPSAobG9hZGVkIC0gdGhpcy5sb2FkZWQpICogKDEwMDAgLyB0aW1lRGlmZikgKiA4OwogICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGVkID0gbG9hZGVkOwogICAgICAgICAgICAgICAgICAgIHRoaXMudGltZXN0YW1wID0gbm93OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYml0cmF0ZTsKICAgICAgICAgICAgfTsKICAgICAgICB9LAoKICAgICAgICBfaXNYSFJVcGxvYWQ6IGZ1bmN0aW9uIChvcHRpb25zKSB7CiAgICAgICAgICAgIHJldHVybiAhb3B0aW9ucy5mb3JjZUlmcmFtZVRyYW5zcG9ydCAmJgogICAgICAgICAgICAgICAgKCghb3B0aW9ucy5tdWx0aXBhcnQgJiYgJC5zdXBwb3J0LnhockZpbGVVcGxvYWQpIHx8CiAgICAgICAgICAgICAgICAkLnN1cHBvcnQueGhyRm9ybURhdGFGaWxlVXBsb2FkKTsKICAgICAgICB9LAoKICAgICAgICBfZ2V0Rm9ybURhdGE6IGZ1bmN0aW9uIChvcHRpb25zKSB7CiAgICAgICAgICAgIHZhciBmb3JtRGF0YTsKICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmZvcm1EYXRhID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5mb3JtRGF0YShvcHRpb25zLmZvcm0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkLmlzQXJyYXkob3B0aW9ucy5mb3JtRGF0YSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmZvcm1EYXRhOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChvcHRpb25zLmZvcm1EYXRhKSB7CiAgICAgICAgICAgICAgICBmb3JtRGF0YSA9IFtdOwogICAgICAgICAgICAgICAgJC5lYWNoKG9wdGlvbnMuZm9ybURhdGEsIGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhLnB1c2goe25hbWU6IG5hbWUsIHZhbHVlOiB2YWx1ZX0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICByZXR1cm4gZm9ybURhdGE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgIH0sCgogICAgICAgIF9nZXRUb3RhbDogZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgIHZhciB0b3RhbCA9IDA7CiAgICAgICAgICAgICQuZWFjaChmaWxlcywgZnVuY3Rpb24gKGluZGV4LCBmaWxlKSB7CiAgICAgICAgICAgICAgICB0b3RhbCArPSBmaWxlLnNpemUgfHwgMTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiB0b3RhbDsKICAgICAgICB9LAoKICAgICAgICBfb25Qcm9ncmVzczogZnVuY3Rpb24gKGUsIGRhdGEpIHsKICAgICAgICAgICAgaWYgKGUubGVuZ3RoQ29tcHV0YWJsZSkgewogICAgICAgICAgICAgICAgdmFyIG5vdyA9ICsobmV3IERhdGUoKSksCiAgICAgICAgICAgICAgICAgICAgdG90YWwsCiAgICAgICAgICAgICAgICAgICAgbG9hZGVkOwogICAgICAgICAgICAgICAgaWYgKGRhdGEuX3RpbWUgJiYgZGF0YS5wcm9ncmVzc0ludGVydmFsICYmCiAgICAgICAgICAgICAgICAgICAgICAgIChub3cgLSBkYXRhLl90aW1lIDwgZGF0YS5wcm9ncmVzc0ludGVydmFsKSAmJgogICAgICAgICAgICAgICAgICAgICAgICBlLmxvYWRlZCAhPT0gZS50b3RhbCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRhdGEuX3RpbWUgPSBub3c7CiAgICAgICAgICAgICAgICB0b3RhbCA9IGRhdGEudG90YWwgfHwgdGhpcy5fZ2V0VG90YWwoZGF0YS5maWxlcyk7CiAgICAgICAgICAgICAgICBsb2FkZWQgPSBwYXJzZUludCgKICAgICAgICAgICAgICAgICAgICBlLmxvYWRlZCAvIGUudG90YWwgKiAoZGF0YS5jaHVua1NpemUgfHwgdG90YWwpLAogICAgICAgICAgICAgICAgICAgIDEwCiAgICAgICAgICAgICAgICApICsgKGRhdGEudXBsb2FkZWRCeXRlcyB8fCAwKTsKICAgICAgICAgICAgICAgIHRoaXMuX2xvYWRlZCArPSBsb2FkZWQgLSAoZGF0YS5sb2FkZWQgfHwgZGF0YS51cGxvYWRlZEJ5dGVzIHx8IDApOwogICAgICAgICAgICAgICAgZGF0YS5sZW5ndGhDb21wdXRhYmxlID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGRhdGEubG9hZGVkID0gbG9hZGVkOwogICAgICAgICAgICAgICAgZGF0YS50b3RhbCA9IHRvdGFsOwogICAgICAgICAgICAgICAgZGF0YS5iaXRyYXRlID0gZGF0YS5fYml0cmF0ZVRpbWVyLmdldEJpdHJhdGUoCiAgICAgICAgICAgICAgICAgICAgbm93LAogICAgICAgICAgICAgICAgICAgIGxvYWRlZCwKICAgICAgICAgICAgICAgICAgICBkYXRhLmJpdHJhdGVJbnRlcnZhbAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIC8vIFRyaWdnZXIgYSBjdXN0b20gcHJvZ3Jlc3MgZXZlbnQgd2l0aCBhIHRvdGFsIGRhdGEgcHJvcGVydHkgc2V0CiAgICAgICAgICAgICAgICAvLyB0byB0aGUgZmlsZSBzaXplKHMpIG9mIHRoZSBjdXJyZW50IHVwbG9hZCBhbmQgYSBsb2FkZWQgZGF0YQogICAgICAgICAgICAgICAgLy8gcHJvcGVydHkgY2FsY3VsYXRlZCBhY2NvcmRpbmdseToKICAgICAgICAgICAgICAgIHRoaXMuX3RyaWdnZXIoJ3Byb2dyZXNzJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAvLyBUcmlnZ2VyIGEgZ2xvYmFsIHByb2dyZXNzIGV2ZW50IGZvciBhbGwgY3VycmVudCBmaWxlIHVwbG9hZHMsCiAgICAgICAgICAgICAgICAvLyBpbmNsdWRpbmcgYWpheCBjYWxscyBxdWV1ZWQgZm9yIHNlcXVlbnRpYWwgZmlsZSB1cGxvYWRzOgogICAgICAgICAgICAgICAgdGhpcy5fdHJpZ2dlcigncHJvZ3Jlc3NhbGwnLCBlLCB7CiAgICAgICAgICAgICAgICAgICAgbGVuZ3RoQ29tcHV0YWJsZTogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBsb2FkZWQ6IHRoaXMuX2xvYWRlZCwKICAgICAgICAgICAgICAgICAgICB0b3RhbDogdGhpcy5fdG90YWwsCiAgICAgICAgICAgICAgICAgICAgYml0cmF0ZTogdGhpcy5fYml0cmF0ZVRpbWVyLmdldEJpdHJhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgIG5vdywKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9hZGVkLAogICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmJpdHJhdGVJbnRlcnZhbAogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRQcm9ncmVzc0xpc3RlbmVyOiBmdW5jdGlvbiAob3B0aW9ucykgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICB4aHIgPSBvcHRpb25zLnhociA/IG9wdGlvbnMueGhyKCkgOiAkLmFqYXhTZXR0aW5ncy54aHIoKTsKICAgICAgICAgICAgLy8gQWNjZXNzcyB0byB0aGUgbmF0aXZlIFhIUiBvYmplY3QgaXMgcmVxdWlyZWQgdG8gYWRkIGV2ZW50IGxpc3RlbmVycwogICAgICAgICAgICAvLyBmb3IgdGhlIHVwbG9hZCBwcm9ncmVzcyBldmVudDoKICAgICAgICAgICAgaWYgKHhoci51cGxvYWQpIHsKICAgICAgICAgICAgICAgICQoeGhyLnVwbG9hZCkuYmluZCgncHJvZ3Jlc3MnLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHZhciBvZSA9IGUub3JpZ2luYWxFdmVudDsKICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHByb2dyZXNzIGV2ZW50IHByb3BlcnRpZXMgZ2V0IGNvcGllZCBvdmVyOgogICAgICAgICAgICAgICAgICAgIGUubGVuZ3RoQ29tcHV0YWJsZSA9IG9lLmxlbmd0aENvbXB1dGFibGU7CiAgICAgICAgICAgICAgICAgICAgZS5sb2FkZWQgPSBvZS5sb2FkZWQ7CiAgICAgICAgICAgICAgICAgICAgZS50b3RhbCA9IG9lLnRvdGFsOwogICAgICAgICAgICAgICAgICAgIHRoYXQuX29uUHJvZ3Jlc3MoZSwgb3B0aW9ucyk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG9wdGlvbnMueGhyID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB4aHI7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRYSFJEYXRhOiBmdW5jdGlvbiAob3B0aW9ucykgewogICAgICAgICAgICB2YXIgZm9ybURhdGEsCiAgICAgICAgICAgICAgICBmaWxlID0gb3B0aW9ucy5maWxlc1swXSwKICAgICAgICAgICAgICAgIC8vIElnbm9yZSBub24tbXVsdGlwYXJ0IHNldHRpbmcgaWYgbm90IHN1cHBvcnRlZDoKICAgICAgICAgICAgICAgIG11bHRpcGFydCA9IG9wdGlvbnMubXVsdGlwYXJ0IHx8ICEkLnN1cHBvcnQueGhyRmlsZVVwbG9hZCwKICAgICAgICAgICAgICAgIHBhcmFtTmFtZSA9IG9wdGlvbnMucGFyYW1OYW1lWzBdOwogICAgICAgICAgICBvcHRpb25zLmhlYWRlcnMgPSBvcHRpb25zLmhlYWRlcnMgfHwge307CiAgICAgICAgICAgIGlmIChvcHRpb25zLmNvbnRlbnRSYW5nZSkgewogICAgICAgICAgICAgICAgb3B0aW9ucy5oZWFkZXJzWydDb250ZW50LVJhbmdlJ10gPSBvcHRpb25zLmNvbnRlbnRSYW5nZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIW11bHRpcGFydCkgewogICAgICAgICAgICAgICAgb3B0aW9ucy5oZWFkZXJzWydDb250ZW50LURpc3Bvc2l0aW9uJ10gPSAnYXR0YWNobWVudDsgZmlsZW5hbWU9IicgKwogICAgICAgICAgICAgICAgICAgIGVuY29kZVVSSShmaWxlLm5hbWUpICsgJyInOwogICAgICAgICAgICAgICAgb3B0aW9ucy5jb250ZW50VHlwZSA9IGZpbGUudHlwZTsKICAgICAgICAgICAgICAgIG9wdGlvbnMuZGF0YSA9IG9wdGlvbnMuYmxvYiB8fCBmaWxlOwogICAgICAgICAgICB9IGVsc2UgaWYgKCQuc3VwcG9ydC54aHJGb3JtRGF0YUZpbGVVcGxvYWQpIHsKICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnBvc3RNZXNzYWdlKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gd2luZG93LnBvc3RNZXNzYWdlIGRvZXMgbm90IGFsbG93IHNlbmRpbmcgRm9ybURhdGEKICAgICAgICAgICAgICAgICAgICAvLyBvYmplY3RzLCBzbyB3ZSBqdXN0IGFkZCB0aGUgRmlsZS9CbG9iIG9iamVjdHMgdG8KICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZm9ybURhdGEgYXJyYXkgYW5kIGxldCB0aGUgcG9zdE1lc3NhZ2Ugd2luZG93CiAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIHRoZSBGb3JtRGF0YSBvYmplY3Qgb3V0IG9mIHRoaXMgYXJyYXk6CiAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEgPSB0aGlzLl9nZXRGb3JtRGF0YShvcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5ibG9iKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogcGFyYW1OYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG9wdGlvbnMuYmxvYgogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkLmVhY2gob3B0aW9ucy5maWxlcywgZnVuY3Rpb24gKGluZGV4LCBmaWxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtRGF0YS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBvcHRpb25zLnBhcmFtTmFtZVtpbmRleF0gfHwgcGFyYW1OYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmaWxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5mb3JtRGF0YSBpbnN0YW5jZW9mIEZvcm1EYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhID0gb3B0aW9ucy5mb3JtRGF0YTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpOwogICAgICAgICAgICAgICAgICAgICAgICAkLmVhY2godGhpcy5fZ2V0Rm9ybURhdGEob3B0aW9ucyksIGZ1bmN0aW9uIChpbmRleCwgZmllbGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChmaWVsZC5uYW1lLCBmaWVsZC52YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5ibG9iKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuaGVhZGVyc1snQ29udGVudC1EaXNwb3NpdGlvbiddID0gJ2F0dGFjaG1lbnQ7IGZpbGVuYW1lPSInICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZVVSSShmaWxlLm5hbWUpICsgJyInOwogICAgICAgICAgICAgICAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQocGFyYW1OYW1lLCBvcHRpb25zLmJsb2IsIGZpbGUubmFtZSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKG9wdGlvbnMuZmlsZXMsIGZ1bmN0aW9uIChpbmRleCwgZmlsZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlsZXMgYXJlIGFsc28gQmxvYiBpbnN0YW5jZXMsIGJ1dCBzb21lIGJyb3dzZXJzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoRmlyZWZveCAzLjYpIHN1cHBvcnQgdGhlIEZpbGUgQVBJIGJ1dCBub3QgQmxvYnMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGNoZWNrIGFsbG93cyB0aGUgdGVzdHMgdG8gcnVuIHdpdGgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGR1bW15IG9iamVjdHM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHdpbmRvdy5CbG9iICYmIGZpbGUgaW5zdGFuY2VvZiBCbG9iKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2luZG93LkZpbGUgJiYgZmlsZSBpbnN0YW5jZW9mIEZpbGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnBhcmFtTmFtZVtpbmRleF0gfHwgcGFyYW1OYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLm5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBvcHRpb25zLmRhdGEgPSBmb3JtRGF0YTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBCbG9iIHJlZmVyZW5jZSBpcyBub3QgbmVlZGVkIGFueW1vcmUsIGZyZWUgbWVtb3J5OgogICAgICAgICAgICBvcHRpb25zLmJsb2IgPSBudWxsOwogICAgICAgIH0sCgogICAgICAgIF9pbml0SWZyYW1lU2V0dGluZ3M6IGZ1bmN0aW9uIChvcHRpb25zKSB7CiAgICAgICAgICAgIC8vIFNldHRpbmcgdGhlIGRhdGFUeXBlIHRvIGlmcmFtZSBlbmFibGVzIHRoZSBpZnJhbWUgdHJhbnNwb3J0OgogICAgICAgICAgICBvcHRpb25zLmRhdGFUeXBlID0gJ2lmcmFtZSAnICsgKG9wdGlvbnMuZGF0YVR5cGUgfHwgJycpOwogICAgICAgICAgICAvLyBUaGUgaWZyYW1lIHRyYW5zcG9ydCBhY2NlcHRzIGEgc2VyaWFsaXplZCBhcnJheSBhcyBmb3JtIGRhdGE6CiAgICAgICAgICAgIG9wdGlvbnMuZm9ybURhdGEgPSB0aGlzLl9nZXRGb3JtRGF0YShvcHRpb25zKTsKICAgICAgICAgICAgLy8gQWRkIHJlZGlyZWN0IHVybCB0byBmb3JtIGRhdGEgb24gY3Jvc3MtZG9tYWluIHVwbG9hZHM6CiAgICAgICAgICAgIGlmIChvcHRpb25zLnJlZGlyZWN0ICYmICQoJzxhPjwvYT4nKS5wcm9wKCdocmVmJywgb3B0aW9ucy51cmwpCiAgICAgICAgICAgICAgICAgICAgLnByb3AoJ2hvc3QnKSAhPT0gbG9jYXRpb24uaG9zdCkgewogICAgICAgICAgICAgICAgb3B0aW9ucy5mb3JtRGF0YS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICBuYW1lOiBvcHRpb25zLnJlZGlyZWN0UGFyYW1OYW1lIHx8ICdyZWRpcmVjdCcsCiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG9wdGlvbnMucmVkaXJlY3QKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2luaXREYXRhU2V0dGluZ3M6IGZ1bmN0aW9uIChvcHRpb25zKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9pc1hIUlVwbG9hZChvcHRpb25zKSkgewogICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9jaHVua2VkVXBsb2FkKG9wdGlvbnMsIHRydWUpKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zLmRhdGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5pdFhIUkRhdGEob3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRoaXMuX2luaXRQcm9ncmVzc0xpc3RlbmVyKG9wdGlvbnMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMucG9zdE1lc3NhZ2UpIHsKICAgICAgICAgICAgICAgICAgICAvLyBTZXR0aW5nIHRoZSBkYXRhVHlwZSB0byBwb3N0bWVzc2FnZSBlbmFibGVzIHRoZQogICAgICAgICAgICAgICAgICAgIC8vIHBvc3RNZXNzYWdlIHRyYW5zcG9ydDoKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmRhdGFUeXBlID0gJ3Bvc3RtZXNzYWdlICcgKyAob3B0aW9ucy5kYXRhVHlwZSB8fCAnJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLl9pbml0SWZyYW1lU2V0dGluZ3Mob3B0aW9ucywgJ2lmcmFtZScpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2dldFBhcmFtTmFtZTogZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAgICAgICAgICAgdmFyIGZpbGVJbnB1dCA9ICQob3B0aW9ucy5maWxlSW5wdXQpLAogICAgICAgICAgICAgICAgcGFyYW1OYW1lID0gb3B0aW9ucy5wYXJhbU5hbWU7CiAgICAgICAgICAgIGlmICghcGFyYW1OYW1lKSB7CiAgICAgICAgICAgICAgICBwYXJhbU5hbWUgPSBbXTsKICAgICAgICAgICAgICAgIGZpbGVJbnB1dC5lYWNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaW5wdXQgPSAkKHRoaXMpLAogICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gaW5wdXQucHJvcCgnbmFtZScpIHx8ICdmaWxlc1tdJywKICAgICAgICAgICAgICAgICAgICAgICAgaSA9IChpbnB1dC5wcm9wKCdmaWxlcycpIHx8IFsxXSkubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgIHdoaWxlIChpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtTmFtZS5wdXNoKG5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICBpIC09IDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBpZiAoIXBhcmFtTmFtZS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWUgPSBbZmlsZUlucHV0LnByb3AoJ25hbWUnKSB8fCAnZmlsZXNbXSddOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgaWYgKCEkLmlzQXJyYXkocGFyYW1OYW1lKSkgewogICAgICAgICAgICAgICAgcGFyYW1OYW1lID0gW3BhcmFtTmFtZV07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHBhcmFtTmFtZTsKICAgICAgICB9LAoKICAgICAgICBfaW5pdEZvcm1TZXR0aW5nczogZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAgICAgICAgICAgLy8gUmV0cmlldmUgbWlzc2luZyBvcHRpb25zIGZyb20gdGhlIGlucHV0IGZpZWxkIGFuZCB0aGUKICAgICAgICAgICAgLy8gYXNzb2NpYXRlZCBmb3JtLCBpZiBhdmFpbGFibGU6CiAgICAgICAgICAgIGlmICghb3B0aW9ucy5mb3JtIHx8ICFvcHRpb25zLmZvcm0ubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmZvcm0gPSAkKG9wdGlvbnMuZmlsZUlucHV0LnByb3AoJ2Zvcm0nKSk7CiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgZ2l2ZW4gZmlsZSBpbnB1dCBkb2Vzbid0IGhhdmUgYW4gYXNzb2NpYXRlZCBmb3JtLAogICAgICAgICAgICAgICAgLy8gdXNlIHRoZSBkZWZhdWx0IHdpZGdldCBmaWxlIGlucHV0J3MgZm9ybToKICAgICAgICAgICAgICAgIGlmICghb3B0aW9ucy5mb3JtLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZm9ybSA9ICQodGhpcy5vcHRpb25zLmZpbGVJbnB1dC5wcm9wKCdmb3JtJykpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIG9wdGlvbnMucGFyYW1OYW1lID0gdGhpcy5fZ2V0UGFyYW1OYW1lKG9wdGlvbnMpOwogICAgICAgICAgICBpZiAoIW9wdGlvbnMudXJsKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLnVybCA9IG9wdGlvbnMuZm9ybS5wcm9wKCdhY3Rpb24nKSB8fCBsb2NhdGlvbi5ocmVmOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFRoZSBIVFRQIHJlcXVlc3QgbWV0aG9kIG11c3QgYmUgIlBPU1QiIG9yICJQVVQiOgogICAgICAgICAgICBvcHRpb25zLnR5cGUgPSAob3B0aW9ucy50eXBlIHx8IG9wdGlvbnMuZm9ybS5wcm9wKCdtZXRob2QnKSB8fCAnJykKICAgICAgICAgICAgICAgIC50b1VwcGVyQ2FzZSgpOwogICAgICAgICAgICBpZiAob3B0aW9ucy50eXBlICE9PSAnUE9TVCcgJiYgb3B0aW9ucy50eXBlICE9PSAnUFVUJykgewogICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gJ1BPU1QnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghb3B0aW9ucy5mb3JtQWNjZXB0Q2hhcnNldCkgewogICAgICAgICAgICAgICAgb3B0aW9ucy5mb3JtQWNjZXB0Q2hhcnNldCA9IG9wdGlvbnMuZm9ybS5hdHRyKCdhY2NlcHQtY2hhcnNldCcpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2dldEFKQVhTZXR0aW5nczogZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSAkLmV4dGVuZCh7fSwgdGhpcy5vcHRpb25zLCBkYXRhKTsKICAgICAgICAgICAgdGhpcy5faW5pdEZvcm1TZXR0aW5ncyhvcHRpb25zKTsKICAgICAgICAgICAgdGhpcy5faW5pdERhdGFTZXR0aW5ncyhvcHRpb25zKTsKICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnM7CiAgICAgICAgfSwKCiAgICAgICAgLy8gTWFwcyBqcVhIUiBjYWxsYmFja3MgdG8gdGhlIGVxdWl2YWxlbnQKICAgICAgICAvLyBtZXRob2RzIG9mIHRoZSBnaXZlbiBQcm9taXNlIG9iamVjdDoKICAgICAgICBfZW5oYW5jZVByb21pc2U6IGZ1bmN0aW9uIChwcm9taXNlKSB7CiAgICAgICAgICAgIHByb21pc2Uuc3VjY2VzcyA9IHByb21pc2UuZG9uZTsKICAgICAgICAgICAgcHJvbWlzZS5lcnJvciA9IHByb21pc2UuZmFpbDsKICAgICAgICAgICAgcHJvbWlzZS5jb21wbGV0ZSA9IHByb21pc2UuYWx3YXlzOwogICAgICAgICAgICByZXR1cm4gcHJvbWlzZTsKICAgICAgICB9LAoKICAgICAgICAvLyBDcmVhdGVzIGFuZCByZXR1cm5zIGEgUHJvbWlzZSBvYmplY3QgZW5oYW5jZWQgd2l0aAogICAgICAgIC8vIHRoZSBqcVhIUiBtZXRob2RzIGFib3J0LCBzdWNjZXNzLCBlcnJvciBhbmQgY29tcGxldGU6CiAgICAgICAgX2dldFhIUlByb21pc2U6IGZ1bmN0aW9uIChyZXNvbHZlT3JSZWplY3QsIGNvbnRleHQsIGFyZ3MpIHsKICAgICAgICAgICAgdmFyIGRmZCA9ICQuRGVmZXJyZWQoKSwKICAgICAgICAgICAgICAgIHByb21pc2UgPSBkZmQucHJvbWlzZSgpOwogICAgICAgICAgICBjb250ZXh0ID0gY29udGV4dCB8fCB0aGlzLm9wdGlvbnMuY29udGV4dCB8fCBwcm9taXNlOwogICAgICAgICAgICBpZiAocmVzb2x2ZU9yUmVqZWN0ID09PSB0cnVlKSB7CiAgICAgICAgICAgICAgICBkZmQucmVzb2x2ZVdpdGgoY29udGV4dCwgYXJncyk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzb2x2ZU9yUmVqZWN0ID09PSBmYWxzZSkgewogICAgICAgICAgICAgICAgZGZkLnJlamVjdFdpdGgoY29udGV4dCwgYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHJvbWlzZS5hYm9ydCA9IGRmZC5wcm9taXNlOwogICAgICAgICAgICByZXR1cm4gdGhpcy5fZW5oYW5jZVByb21pc2UocHJvbWlzZSk7CiAgICAgICAgfSwKCiAgICAgICAgLy8gUGFyc2VzIHRoZSBSYW5nZSBoZWFkZXIgZnJvbSB0aGUgc2VydmVyIHJlc3BvbnNlCiAgICAgICAgLy8gYW5kIHJldHVybnMgdGhlIHVwbG9hZGVkIGJ5dGVzOgogICAgICAgIF9nZXRVcGxvYWRlZEJ5dGVzOiBmdW5jdGlvbiAoanFYSFIpIHsKICAgICAgICAgICAgdmFyIHJhbmdlID0ganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoJ1JhbmdlJyksCiAgICAgICAgICAgICAgICBwYXJ0cyA9IHJhbmdlICYmIHJhbmdlLnNwbGl0KCctJyksCiAgICAgICAgICAgICAgICB1cHBlckJ5dGVzUG9zID0gcGFydHMgJiYgcGFydHMubGVuZ3RoID4gMSAmJgogICAgICAgICAgICAgICAgICAgIHBhcnNlSW50KHBhcnRzWzFdLCAxMCk7CiAgICAgICAgICAgIHJldHVybiB1cHBlckJ5dGVzUG9zICYmIHVwcGVyQnl0ZXNQb3MgKyAxOwogICAgICAgIH0sCgogICAgICAgIC8vIFVwbG9hZHMgYSBmaWxlIGluIG11bHRpcGxlLCBzZXF1ZW50aWFsIHJlcXVlc3RzCiAgICAgICAgLy8gYnkgc3BsaXR0aW5nIHRoZSBmaWxlIHVwIGluIG11bHRpcGxlIGJsb2IgY2h1bmtzLgogICAgICAgIC8vIElmIHRoZSBzZWNvbmQgcGFyYW1ldGVyIGlzIHRydWUsIG9ubHkgdGVzdHMgaWYgdGhlIGZpbGUKICAgICAgICAvLyBzaG91bGQgYmUgdXBsb2FkZWQgaW4gY2h1bmtzLCBidXQgZG9lcyBub3QgaW52b2tlIGFueQogICAgICAgIC8vIHVwbG9hZCByZXF1ZXN0czoKICAgICAgICBfY2h1bmtlZFVwbG9hZDogZnVuY3Rpb24gKG9wdGlvbnMsIHRlc3RPbmx5KSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgIGZpbGUgPSBvcHRpb25zLmZpbGVzWzBdLAogICAgICAgICAgICAgICAgZnMgPSBmaWxlLnNpemUsCiAgICAgICAgICAgICAgICB1YiA9IG9wdGlvbnMudXBsb2FkZWRCeXRlcyA9IG9wdGlvbnMudXBsb2FkZWRCeXRlcyB8fCAwLAogICAgICAgICAgICAgICAgbWNzID0gb3B0aW9ucy5tYXhDaHVua1NpemUgfHwgZnMsCiAgICAgICAgICAgICAgICBzbGljZSA9IGZpbGUuc2xpY2UgfHwgZmlsZS53ZWJraXRTbGljZSB8fCBmaWxlLm1velNsaWNlLAogICAgICAgICAgICAgICAgZGZkID0gJC5EZWZlcnJlZCgpLAogICAgICAgICAgICAgICAgcHJvbWlzZSA9IGRmZC5wcm9taXNlKCksCiAgICAgICAgICAgICAgICBqcVhIUiwKICAgICAgICAgICAgICAgIHVwbG9hZDsKICAgICAgICAgICAgaWYgKCEodGhpcy5faXNYSFJVcGxvYWQob3B0aW9ucykgJiYgc2xpY2UgJiYgKHViIHx8IG1jcyA8IGZzKSkgfHwKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmRhdGEpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGVzdE9ubHkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh1YiA+PSBmcykgewogICAgICAgICAgICAgICAgZmlsZS5lcnJvciA9ICdVcGxvYWRlZCBieXRlcyBleGNlZWQgZmlsZSBzaXplJzsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRYSFJQcm9taXNlKAogICAgICAgICAgICAgICAgICAgIGZhbHNlLAogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuY29udGV4dCwKICAgICAgICAgICAgICAgICAgICBbbnVsbCwgJ2Vycm9yJywgZmlsZS5lcnJvcl0KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gVGhlIGNodW5rIHVwbG9hZCBtZXRob2Q6CiAgICAgICAgICAgIHVwbG9hZCA9IGZ1bmN0aW9uIChpKSB7CiAgICAgICAgICAgICAgICAvLyBDbG9uZSB0aGUgb3B0aW9ucyBvYmplY3QgZm9yIGVhY2ggY2h1bmsgdXBsb2FkOgogICAgICAgICAgICAgICAgdmFyIG8gPSAkLmV4dGVuZCh7fSwgb3B0aW9ucyk7CiAgICAgICAgICAgICAgICBvLmJsb2IgPSBzbGljZS5jYWxsKAogICAgICAgICAgICAgICAgICAgIGZpbGUsCiAgICAgICAgICAgICAgICAgICAgdWIsCiAgICAgICAgICAgICAgICAgICAgdWIgKyBtY3MsCiAgICAgICAgICAgICAgICAgICAgZmlsZS50eXBlCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgLy8gU3RvcmUgdGhlIGN1cnJlbnQgY2h1bmsgc2l6ZSwgYXMgdGhlIGJsb2IgaXRzZWxmCiAgICAgICAgICAgICAgICAvLyB3aWxsIGJlIGRlcmVmZXJlbmNlZCBhZnRlciBkYXRhIHByb2Nlc3Npbmc6CiAgICAgICAgICAgICAgICBvLmNodW5rU2l6ZSA9IG8uYmxvYi5zaXplOwogICAgICAgICAgICAgICAgLy8gRXhwb3NlIHRoZSBjaHVuayBieXRlcyBwb3NpdGlvbiByYW5nZToKICAgICAgICAgICAgICAgIG8uY29udGVudFJhbmdlID0gJ2J5dGVzICcgKyB1YiArICctJyArCiAgICAgICAgICAgICAgICAgICAgKHViICsgby5jaHVua1NpemUgLSAxKSArICcvJyArIGZzOwogICAgICAgICAgICAgICAgLy8gUHJvY2VzcyB0aGUgdXBsb2FkIGRhdGEgKHRoZSBibG9iIGFuZCBwb3RlbnRpYWwgZm9ybSBkYXRhKToKICAgICAgICAgICAgICAgIHRoYXQuX2luaXRYSFJEYXRhKG8pOwogICAgICAgICAgICAgICAgLy8gQWRkIHByb2dyZXNzIGxpc3RlbmVycyBmb3IgdGhpcyBjaHVuayB1cGxvYWQ6CiAgICAgICAgICAgICAgICB0aGF0Ll9pbml0UHJvZ3Jlc3NMaXN0ZW5lcihvKTsKICAgICAgICAgICAgICAgIGpxWEhSID0gKCQuYWpheChvKSB8fCB0aGF0Ll9nZXRYSFJQcm9taXNlKGZhbHNlLCBvLmNvbnRleHQpKQogICAgICAgICAgICAgICAgICAgIC5kb25lKGZ1bmN0aW9uIChyZXN1bHQsIHRleHRTdGF0dXMsIGpxWEhSKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHViID0gdGhhdC5fZ2V0VXBsb2FkZWRCeXRlcyhqcVhIUikgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1YiArIG8uY2h1bmtTaXplKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgcHJvZ3Jlc3MgZXZlbnQgaWYgdXBsb2FkIGlzIGRvbmUgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIHByb2dyZXNzIGV2ZW50IGhhcyBiZWVuIGludm9rZWQgZm9yIHRoaXMgY2h1bms6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghby5sb2FkZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX29uUHJvZ3Jlc3MoJC5FdmVudCgncHJvZ3Jlc3MnLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoQ29tcHV0YWJsZTogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWQ6IHViIC0gby51cGxvYWRlZEJ5dGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsOiB1YiAtIG8udXBsb2FkZWRCeXRlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIG8pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMudXBsb2FkZWRCeXRlcyA9IG8udXBsb2FkZWRCeXRlcyA9IHViOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodWIgPCBmcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlsZSB1cGxvYWQgbm90IHlldCBjb21wbGV0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnRpbnVlIHdpdGggdGhlIG5leHQgY2h1bms6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGxvYWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlV2l0aCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLmNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jlc3VsdCwgdGV4dFN0YXR1cywganFYSFJdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAuZmFpbChmdW5jdGlvbiAoanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRmZC5yZWplY3RXaXRoKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgby5jb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgW2pxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bl0KICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdGhpcy5fZW5oYW5jZVByb21pc2UocHJvbWlzZSk7CiAgICAgICAgICAgIHByb21pc2UuYWJvcnQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4ganFYSFIuYWJvcnQoKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdXBsb2FkKCk7CiAgICAgICAgICAgIHJldHVybiBwcm9taXNlOwogICAgICAgIH0sCgogICAgICAgIF9iZWZvcmVTZW5kOiBmdW5jdGlvbiAoZSwgZGF0YSkgewogICAgICAgICAgICBpZiAodGhpcy5fYWN0aXZlID09PSAwKSB7CiAgICAgICAgICAgICAgICAvLyB0aGUgc3RhcnQgY2FsbGJhY2sgaXMgdHJpZ2dlcmVkIHdoZW4gYW4gdXBsb2FkIHN0YXJ0cwogICAgICAgICAgICAgICAgLy8gYW5kIG5vIG90aGVyIHVwbG9hZHMgYXJlIGN1cnJlbnRseSBydW5uaW5nLAogICAgICAgICAgICAgICAgLy8gZXF1aXZhbGVudCB0byB0aGUgZ2xvYmFsIGFqYXhTdGFydCBldmVudDoKICAgICAgICAgICAgICAgIHRoaXMuX3RyaWdnZXIoJ3N0YXJ0Jyk7CiAgICAgICAgICAgICAgICAvLyBTZXQgdGltZXIgZm9yIGdsb2JhbCBiaXRyYXRlIHByb2dyZXNzIGNhbGN1bGF0aW9uOgogICAgICAgICAgICAgICAgdGhpcy5fYml0cmF0ZVRpbWVyID0gbmV3IHRoaXMuX0JpdHJhdGVUaW1lcigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX2FjdGl2ZSArPSAxOwogICAgICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBnbG9iYWwgcHJvZ3Jlc3MgdmFsdWVzOgogICAgICAgICAgICB0aGlzLl9sb2FkZWQgKz0gZGF0YS51cGxvYWRlZEJ5dGVzIHx8IDA7CiAgICAgICAgICAgIHRoaXMuX3RvdGFsICs9IHRoaXMuX2dldFRvdGFsKGRhdGEuZmlsZXMpOwogICAgICAgIH0sCgogICAgICAgIF9vbkRvbmU6IGZ1bmN0aW9uIChyZXN1bHQsIHRleHRTdGF0dXMsIGpxWEhSLCBvcHRpb25zKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5faXNYSFJVcGxvYWQob3B0aW9ucykpIHsKICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIHByb2dyZXNzIGV2ZW50IGZvciBlYWNoIGlmcmFtZSBsb2FkOgogICAgICAgICAgICAgICAgdGhpcy5fb25Qcm9ncmVzcygkLkV2ZW50KCdwcm9ncmVzcycsIHsKICAgICAgICAgICAgICAgICAgICBsZW5ndGhDb21wdXRhYmxlOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIGxvYWRlZDogMSwKICAgICAgICAgICAgICAgICAgICB0b3RhbDogMQogICAgICAgICAgICAgICAgfSksIG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG9wdGlvbnMucmVzdWx0ID0gcmVzdWx0OwogICAgICAgICAgICBvcHRpb25zLnRleHRTdGF0dXMgPSB0ZXh0U3RhdHVzOwogICAgICAgICAgICBvcHRpb25zLmpxWEhSID0ganFYSFI7CiAgICAgICAgICAgIHRoaXMuX3RyaWdnZXIoJ2RvbmUnLCBudWxsLCBvcHRpb25zKTsKICAgICAgICB9LAoKICAgICAgICBfb25GYWlsOiBmdW5jdGlvbiAoanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duLCBvcHRpb25zKSB7CiAgICAgICAgICAgIG9wdGlvbnMuanFYSFIgPSBqcVhIUjsKICAgICAgICAgICAgb3B0aW9ucy50ZXh0U3RhdHVzID0gdGV4dFN0YXR1czsKICAgICAgICAgICAgb3B0aW9ucy5lcnJvclRocm93biA9IGVycm9yVGhyb3duOwogICAgICAgICAgICB0aGlzLl90cmlnZ2VyKCdmYWlsJywgbnVsbCwgb3B0aW9ucyk7CiAgICAgICAgICAgIGlmIChvcHRpb25zLnJlY2FsY3VsYXRlUHJvZ3Jlc3MpIHsKICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgZmFpbGVkIChlcnJvciBvciBhYm9ydCkgZmlsZSB1cGxvYWQgZnJvbQogICAgICAgICAgICAgICAgLy8gdGhlIGdsb2JhbCBwcm9ncmVzcyBjYWxjdWxhdGlvbjoKICAgICAgICAgICAgICAgIHRoaXMuX2xvYWRlZCAtPSBvcHRpb25zLmxvYWRlZCB8fCBvcHRpb25zLnVwbG9hZGVkQnl0ZXMgfHwgMDsKICAgICAgICAgICAgICAgIHRoaXMuX3RvdGFsIC09IG9wdGlvbnMudG90YWwgfHwgdGhpcy5fZ2V0VG90YWwob3B0aW9ucy5maWxlcyk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBfb25BbHdheXM6IGZ1bmN0aW9uIChqcVhIUm9yUmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUm9yRXJyb3IsIG9wdGlvbnMpIHsKICAgICAgICAgICAgdGhpcy5fYWN0aXZlIC09IDE7CiAgICAgICAgICAgIG9wdGlvbnMudGV4dFN0YXR1cyA9IHRleHRTdGF0dXM7CiAgICAgICAgICAgIGlmIChqcVhIUm9yRXJyb3IgJiYganFYSFJvckVycm9yLmFsd2F5cykgewogICAgICAgICAgICAgICAgb3B0aW9ucy5qcVhIUiA9IGpxWEhSb3JFcnJvcjsKICAgICAgICAgICAgICAgIG9wdGlvbnMucmVzdWx0ID0ganFYSFJvclJlc3VsdDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuanFYSFIgPSBqcVhIUm9yUmVzdWx0OwogICAgICAgICAgICAgICAgb3B0aW9ucy5lcnJvclRocm93biA9IGpxWEhSb3JFcnJvcjsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl90cmlnZ2VyKCdhbHdheXMnLCBudWxsLCBvcHRpb25zKTsKICAgICAgICAgICAgaWYgKHRoaXMuX2FjdGl2ZSA9PT0gMCkgewogICAgICAgICAgICAgICAgLy8gVGhlIHN0b3AgY2FsbGJhY2sgaXMgdHJpZ2dlcmVkIHdoZW4gYWxsIHVwbG9hZHMgaGF2ZQogICAgICAgICAgICAgICAgLy8gYmVlbiBjb21wbGV0ZWQsIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RvcCBldmVudDoKICAgICAgICAgICAgICAgIHRoaXMuX3RyaWdnZXIoJ3N0b3AnKTsKICAgICAgICAgICAgICAgIC8vIFJlc2V0IHRoZSBnbG9iYWwgcHJvZ3Jlc3MgdmFsdWVzOgogICAgICAgICAgICAgICAgdGhpcy5fbG9hZGVkID0gdGhpcy5fdG90YWwgPSAwOwogICAgICAgICAgICAgICAgdGhpcy5fYml0cmF0ZVRpbWVyID0gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9vblNlbmQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgIGpxWEhSLAogICAgICAgICAgICAgICAgYWJvcnRlZCwKICAgICAgICAgICAgICAgIHNsb3QsCiAgICAgICAgICAgICAgICBwaXBlLAogICAgICAgICAgICAgICAgb3B0aW9ucyA9IHRoYXQuX2dldEFKQVhTZXR0aW5ncyhkYXRhKSwKICAgICAgICAgICAgICAgIHNlbmQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fc2VuZGluZyArPSAxOwogICAgICAgICAgICAgICAgICAgIC8vIFNldCB0aW1lciBmb3IgYml0cmF0ZSBwcm9ncmVzcyBjYWxjdWxhdGlvbjoKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLl9iaXRyYXRlVGltZXIgPSBuZXcgdGhhdC5fQml0cmF0ZVRpbWVyKCk7CiAgICAgICAgICAgICAgICAgICAganFYSFIgPSBqcVhIUiB8fCAoCiAgICAgICAgICAgICAgICAgICAgICAgICgoYWJvcnRlZCB8fCB0aGF0Ll90cmlnZ2VyKCdzZW5kJywgZSwgb3B0aW9ucykgPT09IGZhbHNlKSAmJgogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9nZXRYSFJQcm9taXNlKGZhbHNlLCBvcHRpb25zLmNvbnRleHQsIGFib3J0ZWQpKSB8fAogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9jaHVua2VkVXBsb2FkKG9wdGlvbnMpIHx8ICQuYWpheChvcHRpb25zKQogICAgICAgICAgICAgICAgICAgICkuZG9uZShmdW5jdGlvbiAocmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUikgewogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9vbkRvbmUocmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUiwgb3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgfSkuZmFpbChmdW5jdGlvbiAoanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX29uRmFpbChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24sIG9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIH0pLmFsd2F5cyhmdW5jdGlvbiAoanFYSFJvclJlc3VsdCwgdGV4dFN0YXR1cywganFYSFJvckVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3NlbmRpbmcgLT0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fb25BbHdheXMoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqcVhIUm9yUmVzdWx0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dFN0YXR1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpxWEhSb3JFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMubGltaXRDb25jdXJyZW50VXBsb2FkcyAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMubGltaXRDb25jdXJyZW50VXBsb2FkcyA+IHRoYXQuX3NlbmRpbmcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN0YXJ0IHRoZSBuZXh0IHF1ZXVlZCB1cGxvYWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGF0IGhhcyBub3QgYmVlbiBhYm9ydGVkOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5leHRTbG90ID0gdGhhdC5fc2xvdHMuc2hpZnQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1BlbmRpbmc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobmV4dFNsb3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBqUXVlcnkgMS42IGRvZXNuJ3QgcHJvdmlkZSAuc3RhdGUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGlsZSBqUXVlcnkgMS44KyByZW1vdmVkIC5pc1JlamVjdGVkKCk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNQZW5kaW5nID0gbmV4dFNsb3Quc3RhdGUgPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFNsb3Quc3RhdGUoKSA9PT0gJ3BlbmRpbmcnIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFuZXh0U2xvdC5pc1JlamVjdGVkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzUGVuZGluZykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0U2xvdC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0U2xvdCA9IHRoYXQuX3Nsb3RzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4ganFYSFI7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB0aGlzLl9iZWZvcmVTZW5kKGUsIG9wdGlvbnMpOwogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNlcXVlbnRpYWxVcGxvYWRzIHx8CiAgICAgICAgICAgICAgICAgICAgKHRoaXMub3B0aW9ucy5saW1pdENvbmN1cnJlbnRVcGxvYWRzICYmCiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmxpbWl0Q29uY3VycmVudFVwbG9hZHMgPD0gdGhpcy5fc2VuZGluZykpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMubGltaXRDb25jdXJyZW50VXBsb2FkcyA+IDEpIHsKICAgICAgICAgICAgICAgICAgICBzbG90ID0gJC5EZWZlcnJlZCgpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX3Nsb3RzLnB1c2goc2xvdCk7CiAgICAgICAgICAgICAgICAgICAgcGlwZSA9IHNsb3QucGlwZShzZW5kKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcGlwZSA9ICh0aGlzLl9zZXF1ZW5jZSA9IHRoaXMuX3NlcXVlbmNlLnBpcGUoc2VuZCwgc2VuZCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSBwaXBlZCBQcm9taXNlIG9iamVjdCwgZW5oYW5jZWQgd2l0aCBhbiBhYm9ydCBtZXRob2QsCiAgICAgICAgICAgICAgICAvLyB3aGljaCBpcyBkZWxlZ2F0ZWQgdG8gdGhlIGpxWEhSIG9iamVjdCBvZiB0aGUgY3VycmVudCB1cGxvYWQsCiAgICAgICAgICAgICAgICAvLyBhbmQganFYSFIgY2FsbGJhY2tzIG1hcHBlZCB0byB0aGUgZXF1aXZhbGVudCBQcm9taXNlIG1ldGhvZHM6CiAgICAgICAgICAgICAgICBwaXBlLmFib3J0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGFib3J0ZWQgPSBbdW5kZWZpbmVkLCAnYWJvcnQnLCAnYWJvcnQnXTsKICAgICAgICAgICAgICAgICAgICBpZiAoIWpxWEhSKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzbG90KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90LnJlamVjdFdpdGgob3B0aW9ucy5jb250ZXh0LCBhYm9ydGVkKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VuZCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4ganFYSFIuYWJvcnQoKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZW5oYW5jZVByb21pc2UocGlwZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHNlbmQoKTsKICAgICAgICB9LAoKICAgICAgICBfb25BZGQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRydWUsCiAgICAgICAgICAgICAgICBvcHRpb25zID0gJC5leHRlbmQoe30sIHRoaXMub3B0aW9ucywgZGF0YSksCiAgICAgICAgICAgICAgICBsaW1pdCA9IG9wdGlvbnMubGltaXRNdWx0aUZpbGVVcGxvYWRzLAogICAgICAgICAgICAgICAgcGFyYW1OYW1lID0gdGhpcy5fZ2V0UGFyYW1OYW1lKG9wdGlvbnMpLAogICAgICAgICAgICAgICAgcGFyYW1OYW1lU2V0LAogICAgICAgICAgICAgICAgcGFyYW1OYW1lU2xpY2UsCiAgICAgICAgICAgICAgICBmaWxlU2V0LAogICAgICAgICAgICAgICAgaTsKICAgICAgICAgICAgaWYgKCEob3B0aW9ucy5zaW5nbGVGaWxlVXBsb2FkcyB8fCBsaW1pdCkgfHwKICAgICAgICAgICAgICAgICAgICAhdGhpcy5faXNYSFJVcGxvYWQob3B0aW9ucykpIHsKICAgICAgICAgICAgICAgIGZpbGVTZXQgPSBbZGF0YS5maWxlc107CiAgICAgICAgICAgICAgICBwYXJhbU5hbWVTZXQgPSBbcGFyYW1OYW1lXTsKICAgICAgICAgICAgfSBlbHNlIGlmICghb3B0aW9ucy5zaW5nbGVGaWxlVXBsb2FkcyAmJiBsaW1pdCkgewogICAgICAgICAgICAgICAgZmlsZVNldCA9IFtdOwogICAgICAgICAgICAgICAgcGFyYW1OYW1lU2V0ID0gW107CiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZGF0YS5maWxlcy5sZW5ndGg7IGkgKz0gbGltaXQpIHsKICAgICAgICAgICAgICAgICAgICBmaWxlU2V0LnB1c2goZGF0YS5maWxlcy5zbGljZShpLCBpICsgbGltaXQpKTsKICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVTbGljZSA9IHBhcmFtTmFtZS5zbGljZShpLCBpICsgbGltaXQpOwogICAgICAgICAgICAgICAgICAgIGlmICghcGFyYW1OYW1lU2xpY2UubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtTmFtZVNsaWNlID0gcGFyYW1OYW1lOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVTZXQucHVzaChwYXJhbU5hbWVTbGljZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBwYXJhbU5hbWVTZXQgPSBwYXJhbU5hbWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGF0YS5vcmlnaW5hbEZpbGVzID0gZGF0YS5maWxlczsKICAgICAgICAgICAgJC5lYWNoKGZpbGVTZXQgfHwgZGF0YS5maWxlcywgZnVuY3Rpb24gKGluZGV4LCBlbGVtZW50KSB7CiAgICAgICAgICAgICAgICB2YXIgbmV3RGF0YSA9ICQuZXh0ZW5kKHt9LCBkYXRhKTsKICAgICAgICAgICAgICAgIG5ld0RhdGEuZmlsZXMgPSBmaWxlU2V0ID8gZWxlbWVudCA6IFtlbGVtZW50XTsKICAgICAgICAgICAgICAgIG5ld0RhdGEucGFyYW1OYW1lID0gcGFyYW1OYW1lU2V0W2luZGV4XTsKICAgICAgICAgICAgICAgIG5ld0RhdGEuc3VibWl0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIG5ld0RhdGEuanFYSFIgPSB0aGlzLmpxWEhSID0KICAgICAgICAgICAgICAgICAgICAgICAgKHRoYXQuX3RyaWdnZXIoJ3N1Ym1pdCcsIGUsIHRoaXMpICE9PSBmYWxzZSkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fb25TZW5kKGUsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmpxWEhSOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRoYXQuX3RyaWdnZXIoJ2FkZCcsIGUsIG5ld0RhdGEpOwogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfSwKCiAgICAgICAgX3JlcGxhY2VGaWxlSW5wdXQ6IGZ1bmN0aW9uIChpbnB1dCkgewogICAgICAgICAgICB2YXIgaW5wdXRDbG9uZSA9IGlucHV0LmNsb25lKHRydWUpOwogICAgICAgICAgICAkKCc8Zm9ybT48L2Zvcm0+JykuYXBwZW5kKGlucHV0Q2xvbmUpWzBdLnJlc2V0KCk7CiAgICAgICAgICAgIC8vIERldGFjaGluZyBhbGxvd3MgdG8gaW5zZXJ0IHRoZSBmaWxlSW5wdXQgb24gYW5vdGhlciBmb3JtCiAgICAgICAgICAgIC8vIHdpdGhvdXQgbG9vc2luZyB0aGUgZmlsZSBpbnB1dCB2YWx1ZToKICAgICAgICAgICAgaW5wdXQuYWZ0ZXIoaW5wdXRDbG9uZSkuZGV0YWNoKCk7CiAgICAgICAgICAgIC8vIEF2b2lkIG1lbW9yeSBsZWFrcyB3aXRoIHRoZSBkZXRhY2hlZCBmaWxlIGlucHV0OgogICAgICAgICAgICAkLmNsZWFuRGF0YShpbnB1dC51bmJpbmQoJ3JlbW92ZScpKTsKICAgICAgICAgICAgLy8gUmVwbGFjZSB0aGUgb3JpZ2luYWwgZmlsZSBpbnB1dCBlbGVtZW50IGluIHRoZSBmaWxlSW5wdXQKICAgICAgICAgICAgLy8gZWxlbWVudHMgc2V0IHdpdGggdGhlIGNsb25lLCB3aGljaCBoYXMgYmVlbiBjb3BpZWQgaW5jbHVkaW5nCiAgICAgICAgICAgIC8vIGV2ZW50IGhhbmRsZXJzOgogICAgICAgICAgICB0aGlzLm9wdGlvbnMuZmlsZUlucHV0ID0gdGhpcy5vcHRpb25zLmZpbGVJbnB1dC5tYXAoZnVuY3Rpb24gKGksIGVsKSB7CiAgICAgICAgICAgICAgICBpZiAoZWwgPT09IGlucHV0WzBdKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0Q2xvbmVbMF07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gZWw7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAvLyBJZiB0aGUgd2lkZ2V0IGhhcyBiZWVuIGluaXRpYWxpemVkIG9uIHRoZSBmaWxlIGlucHV0IGl0c2VsZiwKICAgICAgICAgICAgLy8gb3ZlcnJpZGUgdGhpcy5lbGVtZW50IHdpdGggdGhlIGZpbGUgaW5wdXQgY2xvbmU6CiAgICAgICAgICAgIGlmIChpbnB1dFswXSA9PT0gdGhpcy5lbGVtZW50WzBdKSB7CiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQgPSBpbnB1dENsb25lOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2hhbmRsZUZpbGVUcmVlRW50cnk6IGZ1bmN0aW9uIChlbnRyeSwgcGF0aCkgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICBkZmQgPSAkLkRlZmVycmVkKCksCiAgICAgICAgICAgICAgICBlcnJvckhhbmRsZXIgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChlICYmICFlLmVudHJ5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUuZW50cnkgPSBlbnRyeTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy8gU2luY2UgJC53aGVuIHJldHVybnMgaW1tZWRpYXRlbHkgaWYgb25lCiAgICAgICAgICAgICAgICAgICAgLy8gRGVmZXJyZWQgaXMgcmVqZWN0ZWQsIHdlIHVzZSByZXNvbHZlIGluc3RlYWQuCiAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBhbGxvd3MgdmFsaWQgZmlsZXMgYW5kIGludmFsaWQgaXRlbXMKICAgICAgICAgICAgICAgICAgICAvLyB0byBiZSByZXR1cm5lZCB0b2dldGhlciBpbiBvbmUgc2V0OgogICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlKFtlXSk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZGlyUmVhZGVyOwogICAgICAgICAgICBwYXRoID0gcGF0aCB8fCAnJzsKICAgICAgICAgICAgaWYgKGVudHJ5LmlzRmlsZSkgewogICAgICAgICAgICAgICAgaWYgKGVudHJ5Ll9maWxlKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gV29ya2Fyb3VuZCBmb3IgQ2hyb21lIGJ1ZyAjMTQ5NzM1CiAgICAgICAgICAgICAgICAgICAgZW50cnkuX2ZpbGUucmVsYXRpdmVQYXRoID0gcGF0aDsKICAgICAgICAgICAgICAgICAgICBkZmQucmVzb2x2ZShlbnRyeS5fZmlsZSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGVudHJ5LmZpbGUoZnVuY3Rpb24gKGZpbGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZmlsZS5yZWxhdGl2ZVBhdGggPSBwYXRoOwogICAgICAgICAgICAgICAgICAgICAgICBkZmQucmVzb2x2ZShmaWxlKTsKICAgICAgICAgICAgICAgICAgICB9LCBlcnJvckhhbmRsZXIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KSB7CiAgICAgICAgICAgICAgICBkaXJSZWFkZXIgPSBlbnRyeS5jcmVhdGVSZWFkZXIoKTsKICAgICAgICAgICAgICAgIGRpclJlYWRlci5yZWFkRW50cmllcyhmdW5jdGlvbiAoZW50cmllcykgewogICAgICAgICAgICAgICAgICAgIHRoYXQuX2hhbmRsZUZpbGVUcmVlRW50cmllcygKICAgICAgICAgICAgICAgICAgICAgICAgZW50cmllcywKICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCArIGVudHJ5Lm5hbWUgKyAnLycKICAgICAgICAgICAgICAgICAgICApLmRvbmUoZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlKGZpbGVzKTsKICAgICAgICAgICAgICAgICAgICB9KS5mYWlsKGVycm9ySGFuZGxlcik7CiAgICAgICAgICAgICAgICB9LCBlcnJvckhhbmRsZXIpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgLy8gUmV0dXJuIGFuIGVtcHkgbGlzdCBmb3IgZmlsZSBzeXN0ZW0gaXRlbXMKICAgICAgICAgICAgICAgIC8vIG90aGVyIHRoYW4gZmlsZXMgb3IgZGlyZWN0b3JpZXM6CiAgICAgICAgICAgICAgICBkZmQucmVzb2x2ZShbXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGRmZC5wcm9taXNlKCk7CiAgICAgICAgfSwKCiAgICAgICAgX2hhbmRsZUZpbGVUcmVlRW50cmllczogZnVuY3Rpb24gKGVudHJpZXMsIHBhdGgpIHsKICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzOwogICAgICAgICAgICByZXR1cm4gJC53aGVuLmFwcGx5KAogICAgICAgICAgICAgICAgJCwKICAgICAgICAgICAgICAgICQubWFwKGVudHJpZXMsIGZ1bmN0aW9uIChlbnRyeSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGF0Ll9oYW5kbGVGaWxlVHJlZUVudHJ5KGVudHJ5LCBwYXRoKTsKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICkucGlwZShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLmNvbmNhdC5hcHBseSgKICAgICAgICAgICAgICAgICAgICBbXSwKICAgICAgICAgICAgICAgICAgICBhcmd1bWVudHMKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIF9nZXREcm9wcGVkRmlsZXM6IGZ1bmN0aW9uIChkYXRhVHJhbnNmZXIpIHsKICAgICAgICAgICAgZGF0YVRyYW5zZmVyID0gZGF0YVRyYW5zZmVyIHx8IHt9OwogICAgICAgICAgICB2YXIgaXRlbXMgPSBkYXRhVHJhbnNmZXIuaXRlbXM7CiAgICAgICAgICAgIGlmIChpdGVtcyAmJiBpdGVtcy5sZW5ndGggJiYgKGl0ZW1zWzBdLndlYmtpdEdldEFzRW50cnkgfHwKICAgICAgICAgICAgICAgICAgICBpdGVtc1swXS5nZXRBc0VudHJ5KSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUZpbGVUcmVlRW50cmllcygKICAgICAgICAgICAgICAgICAgICAkLm1hcChpdGVtcywgZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVudHJ5OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS53ZWJraXRHZXRBc0VudHJ5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeSA9IGl0ZW0ud2Via2l0R2V0QXNFbnRyeSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV29ya2Fyb3VuZCBmb3IgQ2hyb21lIGJ1ZyAjMTQ5NzM1OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5Ll9maWxlID0gaXRlbS5nZXRBc0ZpbGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnRyeTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS5nZXRBc0VudHJ5KCk7CiAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICQuRGVmZXJyZWQoKS5yZXNvbHZlKAogICAgICAgICAgICAgICAgJC5tYWtlQXJyYXkoZGF0YVRyYW5zZmVyLmZpbGVzKQogICAgICAgICAgICApLnByb21pc2UoKTsKICAgICAgICB9LAoKICAgICAgICBfZ2V0U2luZ2xlRmlsZUlucHV0RmlsZXM6IGZ1bmN0aW9uIChmaWxlSW5wdXQpIHsKICAgICAgICAgICAgZmlsZUlucHV0ID0gJChmaWxlSW5wdXQpOwogICAgICAgICAgICB2YXIgZW50cmllcyA9IGZpbGVJbnB1dC5wcm9wKCd3ZWJraXRFbnRyaWVzJykgfHwKICAgICAgICAgICAgICAgICAgICBmaWxlSW5wdXQucHJvcCgnZW50cmllcycpLAogICAgICAgICAgICAgICAgZmlsZXMsCiAgICAgICAgICAgICAgICB2YWx1ZTsKICAgICAgICAgICAgaWYgKGVudHJpZXMgJiYgZW50cmllcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVGaWxlVHJlZUVudHJpZXMoZW50cmllcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZmlsZXMgPSAkLm1ha2VBcnJheShmaWxlSW5wdXQucHJvcCgnZmlsZXMnKSk7CiAgICAgICAgICAgIGlmICghZmlsZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICB2YWx1ZSA9IGZpbGVJbnB1dC5wcm9wKCd2YWx1ZScpOwogICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkLkRlZmVycmVkKCkucmVzb2x2ZShbXSkucHJvbWlzZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gSWYgdGhlIGZpbGVzIHByb3BlcnR5IGlzIG5vdCBhdmFpbGFibGUsIHRoZSBicm93c2VyIGRvZXMgbm90CiAgICAgICAgICAgICAgICAvLyBzdXBwb3J0IHRoZSBGaWxlIEFQSSBhbmQgd2UgYWRkIGEgcHNldWRvIEZpbGUgb2JqZWN0IHdpdGgKICAgICAgICAgICAgICAgIC8vIHRoZSBpbnB1dCB2YWx1ZSBhcyBuYW1lIHdpdGggcGF0aCBpbmZvcm1hdGlvbiByZW1vdmVkOgogICAgICAgICAgICAgICAgZmlsZXMgPSBbe25hbWU6IHZhbHVlLnJlcGxhY2UoL14uKlxcLywgJycpfV07CiAgICAgICAgICAgIH0gZWxzZSBpZiAoZmlsZXNbMF0ubmFtZSA9PT0gdW5kZWZpbmVkICYmIGZpbGVzWzBdLmZpbGVOYW1lKSB7CiAgICAgICAgICAgICAgICAvLyBGaWxlIG5vcm1hbGl6YXRpb24gZm9yIFNhZmFyaSA0IGFuZCBGaXJlZm94IDM6CiAgICAgICAgICAgICAgICAkLmVhY2goZmlsZXMsIGZ1bmN0aW9uIChpbmRleCwgZmlsZSkgewogICAgICAgICAgICAgICAgICAgIGZpbGUubmFtZSA9IGZpbGUuZmlsZU5hbWU7CiAgICAgICAgICAgICAgICAgICAgZmlsZS5zaXplID0gZmlsZS5maWxlU2l6ZTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAkLkRlZmVycmVkKCkucmVzb2x2ZShmaWxlcykucHJvbWlzZSgpOwogICAgICAgIH0sCgogICAgICAgIF9nZXRGaWxlSW5wdXRGaWxlczogZnVuY3Rpb24gKGZpbGVJbnB1dCkgewogICAgICAgICAgICBpZiAoIShmaWxlSW5wdXQgaW5zdGFuY2VvZiAkKSB8fCBmaWxlSW5wdXQubGVuZ3RoID09PSAxKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0U2luZ2xlRmlsZUlucHV0RmlsZXMoZmlsZUlucHV0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJC53aGVuLmFwcGx5KAogICAgICAgICAgICAgICAgJCwKICAgICAgICAgICAgICAgICQubWFwKGZpbGVJbnB1dCwgdGhpcy5fZ2V0U2luZ2xlRmlsZUlucHV0RmlsZXMpCiAgICAgICAgICAgICkucGlwZShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLmNvbmNhdC5hcHBseSgKICAgICAgICAgICAgICAgICAgICBbXSwKICAgICAgICAgICAgICAgICAgICBhcmd1bWVudHMKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIF9vbkNoYW5nZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLAogICAgICAgICAgICAgICAgZGF0YSA9IHsKICAgICAgICAgICAgICAgICAgICBmaWxlSW5wdXQ6ICQoZS50YXJnZXQpLAogICAgICAgICAgICAgICAgICAgIGZvcm06ICQoZS50YXJnZXQuZm9ybSkKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIHRoaXMuX2dldEZpbGVJbnB1dEZpbGVzKGRhdGEuZmlsZUlucHV0KS5hbHdheXMoZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgICAgICBkYXRhLmZpbGVzID0gZmlsZXM7CiAgICAgICAgICAgICAgICBpZiAodGhhdC5vcHRpb25zLnJlcGxhY2VGaWxlSW5wdXQpIHsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll9yZXBsYWNlRmlsZUlucHV0KGRhdGEuZmlsZUlucHV0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0aGF0Ll90cmlnZ2VyKCdjaGFuZ2UnLCBlLCBkYXRhKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll9vbkFkZChlLCBkYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgX29uUGFzdGU6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIHZhciBjYmQgPSBlLm9yaWdpbmFsRXZlbnQuY2xpcGJvYXJkRGF0YSwKICAgICAgICAgICAgICAgIGl0ZW1zID0gKGNiZCAmJiBjYmQuaXRlbXMpIHx8IFtdLAogICAgICAgICAgICAgICAgZGF0YSA9IHtmaWxlczogW119OwogICAgICAgICAgICAkLmVhY2goaXRlbXMsIGZ1bmN0aW9uIChpbmRleCwgaXRlbSkgewogICAgICAgICAgICAgICAgdmFyIGZpbGUgPSBpdGVtLmdldEFzRmlsZSAmJiBpdGVtLmdldEFzRmlsZSgpOwogICAgICAgICAgICAgICAgaWYgKGZpbGUpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmZpbGVzLnB1c2goZmlsZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBpZiAodGhpcy5fdHJpZ2dlcigncGFzdGUnLCBlLCBkYXRhKSA9PT0gZmFsc2UgfHwKICAgICAgICAgICAgICAgICAgICB0aGlzLl9vbkFkZChlLCBkYXRhKSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9vbkRyb3A6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgIGRhdGFUcmFuc2ZlciA9IGUuZGF0YVRyYW5zZmVyID0gZS5vcmlnaW5hbEV2ZW50LmRhdGFUcmFuc2ZlciwKICAgICAgICAgICAgICAgIGRhdGEgPSB7fTsKICAgICAgICAgICAgaWYgKGRhdGFUcmFuc2ZlciAmJiBkYXRhVHJhbnNmZXIuZmlsZXMgJiYgZGF0YVRyYW5zZmVyLmZpbGVzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX2dldERyb3BwZWRGaWxlcyhkYXRhVHJhbnNmZXIpLmFsd2F5cyhmdW5jdGlvbiAoZmlsZXMpIHsKICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMgPSBmaWxlczsKICAgICAgICAgICAgICAgIGlmICh0aGF0Ll90cmlnZ2VyKCdkcm9wJywgZSwgZGF0YSkgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fb25BZGQoZSwgZGF0YSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIF9vbkRyYWdPdmVyOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICB2YXIgZGF0YVRyYW5zZmVyID0gZS5kYXRhVHJhbnNmZXIgPSBlLm9yaWdpbmFsRXZlbnQuZGF0YVRyYW5zZmVyOwogICAgICAgICAgICBpZiAodGhpcy5fdHJpZ2dlcignZHJhZ292ZXInLCBlKSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZGF0YVRyYW5zZmVyICYmICQuaW5BcnJheSgnRmlsZXMnLCBkYXRhVHJhbnNmZXIudHlwZXMpICE9PSAtMSkgewogICAgICAgICAgICAgICAgZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSAnY29weSc7CiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBfaW5pdEV2ZW50SGFuZGxlcnM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX2lzWEhSVXBsb2FkKHRoaXMub3B0aW9ucykpIHsKICAgICAgICAgICAgICAgIHRoaXMuX29uKHRoaXMub3B0aW9ucy5kcm9wWm9uZSwgewogICAgICAgICAgICAgICAgICAgIGRyYWdvdmVyOiB0aGlzLl9vbkRyYWdPdmVyLAogICAgICAgICAgICAgICAgICAgIGRyb3A6IHRoaXMuX29uRHJvcAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB0aGlzLl9vbih0aGlzLm9wdGlvbnMucGFzdGVab25lLCB7CiAgICAgICAgICAgICAgICAgICAgcGFzdGU6IHRoaXMuX29uUGFzdGUKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX29uKHRoaXMub3B0aW9ucy5maWxlSW5wdXQsIHsKICAgICAgICAgICAgICAgIGNoYW5nZTogdGhpcy5fb25DaGFuZ2UKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgX2Rlc3Ryb3lFdmVudEhhbmRsZXJzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuX29mZih0aGlzLm9wdGlvbnMuZHJvcFpvbmUsICdkcmFnb3ZlciBkcm9wJyk7CiAgICAgICAgICAgIHRoaXMuX29mZih0aGlzLm9wdGlvbnMucGFzdGVab25lLCAncGFzdGUnKTsKICAgICAgICAgICAgdGhpcy5fb2ZmKHRoaXMub3B0aW9ucy5maWxlSW5wdXQsICdjaGFuZ2UnKTsKICAgICAgICB9LAoKICAgICAgICBfc2V0T3B0aW9uOiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewogICAgICAgICAgICB2YXIgcmVmcmVzaCA9ICQuaW5BcnJheShrZXksIHRoaXMuX3JlZnJlc2hPcHRpb25zTGlzdCkgIT09IC0xOwogICAgICAgICAgICBpZiAocmVmcmVzaCkgewogICAgICAgICAgICAgICAgdGhpcy5fZGVzdHJveUV2ZW50SGFuZGxlcnMoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9zdXBlcihrZXksIHZhbHVlKTsKICAgICAgICAgICAgaWYgKHJlZnJlc2gpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2luaXRTcGVjaWFsT3B0aW9ucygpOwogICAgICAgICAgICAgICAgdGhpcy5faW5pdEV2ZW50SGFuZGxlcnMoKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9pbml0U3BlY2lhbE9wdGlvbnM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7CiAgICAgICAgICAgIGlmIChvcHRpb25zLmZpbGVJbnB1dCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVJbnB1dCA9IHRoaXMuZWxlbWVudC5pcygnaW5wdXRbdHlwZT0iZmlsZSJdJykgPwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQgOiB0aGlzLmVsZW1lbnQuZmluZCgnaW5wdXRbdHlwZT0iZmlsZSJdJyk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoIShvcHRpb25zLmZpbGVJbnB1dCBpbnN0YW5jZW9mICQpKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVJbnB1dCA9ICQob3B0aW9ucy5maWxlSW5wdXQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghKG9wdGlvbnMuZHJvcFpvbmUgaW5zdGFuY2VvZiAkKSkgewogICAgICAgICAgICAgICAgb3B0aW9ucy5kcm9wWm9uZSA9ICQob3B0aW9ucy5kcm9wWm9uZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCEob3B0aW9ucy5wYXN0ZVpvbmUgaW5zdGFuY2VvZiAkKSkgewogICAgICAgICAgICAgICAgb3B0aW9ucy5wYXN0ZVpvbmUgPSAkKG9wdGlvbnMucGFzdGVab25lKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9jcmVhdGU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7CiAgICAgICAgICAgIC8vIEluaXRpYWxpemUgb3B0aW9ucyBzZXQgdmlhIEhUTUw1IGRhdGEtYXR0cmlidXRlczoKICAgICAgICAgICAgJC5leHRlbmQob3B0aW9ucywgJCh0aGlzLmVsZW1lbnRbMF0uY2xvbmVOb2RlKGZhbHNlKSkuZGF0YSgpKTsKICAgICAgICAgICAgdGhpcy5faW5pdFNwZWNpYWxPcHRpb25zKCk7CiAgICAgICAgICAgIHRoaXMuX3Nsb3RzID0gW107CiAgICAgICAgICAgIHRoaXMuX3NlcXVlbmNlID0gdGhpcy5fZ2V0WEhSUHJvbWlzZSh0cnVlKTsKICAgICAgICAgICAgdGhpcy5fc2VuZGluZyA9IHRoaXMuX2FjdGl2ZSA9IHRoaXMuX2xvYWRlZCA9IHRoaXMuX3RvdGFsID0gMDsKICAgICAgICAgICAgdGhpcy5faW5pdEV2ZW50SGFuZGxlcnMoKTsKICAgICAgICB9LAoKICAgICAgICBfZGVzdHJveTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLl9kZXN0cm95RXZlbnRIYW5kbGVycygpOwogICAgICAgIH0sCgogICAgICAgIC8vIFRoaXMgbWV0aG9kIGlzIGV4cG9zZWQgdG8gdGhlIHdpZGdldCBBUEkgYW5kIGFsbG93cyBhZGRpbmcgZmlsZXMKICAgICAgICAvLyB1c2luZyB0aGUgZmlsZXVwbG9hZCBBUEkuIFRoZSBkYXRhIHBhcmFtZXRlciBhY2NlcHRzIGFuIG9iamVjdCB3aGljaAogICAgICAgIC8vIG11c3QgaGF2ZSBhIGZpbGVzIHByb3BlcnR5IGFuZCBjYW4gY29udGFpbiBhZGRpdGlvbmFsIG9wdGlvbnM6CiAgICAgICAgLy8gLmZpbGV1cGxvYWQoJ2FkZCcsIHtmaWxlczogZmlsZXNMaXN0fSk7CiAgICAgICAgYWRkOiBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7CiAgICAgICAgICAgIGlmICghZGF0YSB8fCB0aGlzLm9wdGlvbnMuZGlzYWJsZWQpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZGF0YS5maWxlSW5wdXQgJiYgIWRhdGEuZmlsZXMpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2dldEZpbGVJbnB1dEZpbGVzKGRhdGEuZmlsZUlucHV0KS5hbHdheXMoZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgICAgICAgICAgZGF0YS5maWxlcyA9IGZpbGVzOwogICAgICAgICAgICAgICAgICAgIHRoYXQuX29uQWRkKG51bGwsIGRhdGEpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBkYXRhLmZpbGVzID0gJC5tYWtlQXJyYXkoZGF0YS5maWxlcyk7CiAgICAgICAgICAgICAgICB0aGlzLl9vbkFkZChudWxsLCBkYXRhKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8vIFRoaXMgbWV0aG9kIGlzIGV4cG9zZWQgdG8gdGhlIHdpZGdldCBBUEkgYW5kIGFsbG93cyBzZW5kaW5nIGZpbGVzCiAgICAgICAgLy8gdXNpbmcgdGhlIGZpbGV1cGxvYWQgQVBJLiBUaGUgZGF0YSBwYXJhbWV0ZXIgYWNjZXB0cyBhbiBvYmplY3Qgd2hpY2gKICAgICAgICAvLyBtdXN0IGhhdmUgYSBmaWxlcyBvciBmaWxlSW5wdXQgcHJvcGVydHkgYW5kIGNhbiBjb250YWluIGFkZGl0aW9uYWwgb3B0aW9uczoKICAgICAgICAvLyAuZmlsZXVwbG9hZCgnc2VuZCcsIHtmaWxlczogZmlsZXNMaXN0fSk7CiAgICAgICAgLy8gVGhlIG1ldGhvZCByZXR1cm5zIGEgUHJvbWlzZSBvYmplY3QgZm9yIHRoZSBmaWxlIHVwbG9hZCBjYWxsLgogICAgICAgIHNlbmQ6IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgIGlmIChkYXRhICYmICF0aGlzLm9wdGlvbnMuZGlzYWJsZWQpIHsKICAgICAgICAgICAgICAgIGlmIChkYXRhLmZpbGVJbnB1dCAmJiAhZGF0YS5maWxlcykgewogICAgICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgICAgICAgICAgZGZkID0gJC5EZWZlcnJlZCgpLAogICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlID0gZGZkLnByb21pc2UoKSwKICAgICAgICAgICAgICAgICAgICAgICAganFYSFIsCiAgICAgICAgICAgICAgICAgICAgICAgIGFib3J0ZWQ7CiAgICAgICAgICAgICAgICAgICAgcHJvbWlzZS5hYm9ydCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWJvcnRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqcVhIUikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGpxWEhSLmFib3J0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZGZkLnJlamVjdChudWxsLCAnYWJvcnQnLCAnYWJvcnQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb21pc2U7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9nZXRGaWxlSW5wdXRGaWxlcyhkYXRhLmZpbGVJbnB1dCkuYWx3YXlzKAogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZmlsZXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhYm9ydGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5maWxlcyA9IGZpbGVzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAganFYSFIgPSB0aGF0Ll9vblNlbmQobnVsbCwgZGF0YSkudGhlbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAocmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZmQucmVzb2x2ZShyZXN1bHQsIHRleHRTdGF0dXMsIGpxWEhSKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGZkLnJlamVjdChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbmhhbmNlUHJvbWlzZShwcm9taXNlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMgPSAkLm1ha2VBcnJheShkYXRhLmZpbGVzKTsKICAgICAgICAgICAgICAgIGlmIChkYXRhLmZpbGVzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9vblNlbmQobnVsbCwgZGF0YSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldFhIUlByb21pc2UoZmFsc2UsIGRhdGEgJiYgZGF0YS5jb250ZXh0KTsKICAgICAgICB9CgogICAgfSk7Cgp9KSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/fileupload.lib/js/jquery.iframe-transport.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKICogalF1ZXJ5IElmcmFtZSBUcmFuc3BvcnQgUGx1Z2luIDEuNQogKiBodHRwczovL2dpdGh1Yi5jb20vYmx1ZWltcC9qUXVlcnktRmlsZS1VcGxvYWQKICoKICogQ29weXJpZ2h0IDIwMTEsIFNlYmFzdGlhbiBUc2NoYW4KICogaHR0cHM6Ly9ibHVlaW1wLm5ldAogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2U6CiAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUCiAqLwoKLypqc2xpbnQgdW5wYXJhbTogdHJ1ZSwgbm9tZW46IHRydWUgKi8KLypnbG9iYWwgZGVmaW5lLCB3aW5kb3csIGRvY3VtZW50ICovCgooZnVuY3Rpb24gKGZhY3RvcnkpIHsKICAgICd1c2Ugc3RyaWN0JzsKICAgIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHsKICAgICAgICAvLyBSZWdpc3RlciBhcyBhbiBhbm9ueW1vdXMgQU1EIG1vZHVsZToKICAgICAgICBkZWZpbmUoWydqcXVlcnknXSwgZmFjdG9yeSk7CiAgICB9IGVsc2UgewogICAgICAgIC8vIEJyb3dzZXIgZ2xvYmFsczoKICAgICAgICBmYWN0b3J5KHdpbmRvdy5qUXVlcnkpOwogICAgfQp9KGZ1bmN0aW9uICgkKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgLy8gSGVscGVyIHZhcmlhYmxlIHRvIGNyZWF0ZSB1bmlxdWUgbmFtZXMgZm9yIHRoZSB0cmFuc3BvcnQgaWZyYW1lczoKICAgIHZhciBjb3VudGVyID0gMDsKCiAgICAvLyBUaGUgaWZyYW1lIHRyYW5zcG9ydCBhY2NlcHRzIHRocmVlIGFkZGl0aW9uYWwgb3B0aW9uczoKICAgIC8vIG9wdGlvbnMuZmlsZUlucHV0OiBhIGpRdWVyeSBjb2xsZWN0aW9uIG9mIGZpbGUgaW5wdXQgZmllbGRzCiAgICAvLyBvcHRpb25zLnBhcmFtTmFtZTogdGhlIHBhcmFtZXRlciBuYW1lIGZvciB0aGUgZmlsZSBmb3JtIGRhdGEsCiAgICAvLyAgb3ZlcnJpZGVzIHRoZSBuYW1lIHByb3BlcnR5IG9mIHRoZSBmaWxlIGlucHV0IGZpZWxkKHMpLAogICAgLy8gIGNhbiBiZSBhIHN0cmluZyBvciBhbiBhcnJheSBvZiBzdHJpbmdzLgogICAgLy8gb3B0aW9ucy5mb3JtRGF0YTogYW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoIG5hbWUgYW5kIHZhbHVlIHByb3BlcnRpZXMsCiAgICAvLyAgZXF1aXZhbGVudCB0byB0aGUgcmV0dXJuIGRhdGEgb2YgLnNlcmlhbGl6ZUFycmF5KCksIGUuZy46CiAgICAvLyAgW3tuYW1lOiAnYScsIHZhbHVlOiAxfSwge25hbWU6ICdiJywgdmFsdWU6IDJ9XQogICAgJC5hamF4VHJhbnNwb3J0KCdpZnJhbWUnLCBmdW5jdGlvbiAob3B0aW9ucykgewogICAgICAgIGlmIChvcHRpb25zLmFzeW5jICYmIChvcHRpb25zLnR5cGUgPT09ICdQT1NUJyB8fCBvcHRpb25zLnR5cGUgPT09ICdHRVQnKSkgewogICAgICAgICAgICB2YXIgZm9ybSwKICAgICAgICAgICAgICAgIGlmcmFtZTsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIHNlbmQ6IGZ1bmN0aW9uIChfLCBjb21wbGV0ZUNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgZm9ybSA9ICQoJzxmb3JtIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij48L2Zvcm0+Jyk7CiAgICAgICAgICAgICAgICAgICAgZm9ybS5hdHRyKCdhY2NlcHQtY2hhcnNldCcsIG9wdGlvbnMuZm9ybUFjY2VwdENoYXJzZXQpOwogICAgICAgICAgICAgICAgICAgIC8vIGphdmFzY3JpcHQ6ZmFsc2UgYXMgaW5pdGlhbCBpZnJhbWUgc3JjCiAgICAgICAgICAgICAgICAgICAgLy8gcHJldmVudHMgd2FybmluZyBwb3B1cHMgb24gSFRUUFMgaW4gSUU2LgogICAgICAgICAgICAgICAgICAgIC8vIElFIHZlcnNpb25zIGJlbG93IElFOCBjYW5ub3Qgc2V0IHRoZSBuYW1lIHByb3BlcnR5IG9mCiAgICAgICAgICAgICAgICAgICAgLy8gZWxlbWVudHMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBhZGRlZCB0byB0aGUgRE9NLAogICAgICAgICAgICAgICAgICAgIC8vIHNvIHdlIHNldCB0aGUgbmFtZSBhbG9uZyB3aXRoIHRoZSBpZnJhbWUgSFRNTCBtYXJrdXA6CiAgICAgICAgICAgICAgICAgICAgaWZyYW1lID0gJCgKICAgICAgICAgICAgICAgICAgICAgICAgJzxpZnJhbWUgc3JjPSJqYXZhc2NyaXB0OmZhbHNlOyIgbmFtZT0iaWZyYW1lLXRyYW5zcG9ydC0nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb3VudGVyICs9IDEpICsgJyI+PC9pZnJhbWU+JwogICAgICAgICAgICAgICAgICAgICkuYmluZCgnbG9hZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpbGVJbnB1dENsb25lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtTmFtZXMgPSAkLmlzQXJyYXkob3B0aW9ucy5wYXJhbU5hbWUpID8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wYXJhbU5hbWUgOiBbb3B0aW9ucy5wYXJhbU5hbWVdOwogICAgICAgICAgICAgICAgICAgICAgICBpZnJhbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC51bmJpbmQoJ2xvYWQnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJpbmQoJ2xvYWQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3BvbnNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdyYXAgaW4gYSB0cnkvY2F0Y2ggYmxvY2sgdG8gY2F0Y2ggZXhjZXB0aW9ucyB0aHJvd24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIHRyeWluZyB0byBhY2Nlc3MgY3Jvc3MtZG9tYWluIGlmcmFtZSBjb250ZW50czoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IGlmcmFtZS5jb250ZW50cygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHb29nbGUgQ2hyb21lIGFuZCBGaXJlZm94IGRvIG5vdCB0aHJvdyBhbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleGNlcHRpb24gd2hlbiBjYWxsaW5nIGlmcmFtZS5jb250ZW50cygpIG9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyb3NzLWRvbWFpbiByZXF1ZXN0cywgc28gd2UgdW5pZnkgdGhlIHJlc3BvbnNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3BvbnNlLmxlbmd0aCB8fCAhcmVzcG9uc2VbMF0uZmlyc3RDaGlsZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgY29tcGxldGUgY2FsbGJhY2sgcmV0dXJucyB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZnJhbWUgY29udGVudCBkb2N1bWVudCBhcyByZXNwb25zZSBvYmplY3Q6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVDYWxsYmFjaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3VjY2VzcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsnaWZyYW1lJzogcmVzcG9uc2V9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGaXggZm9yIElFIGVuZGxlc3MgcHJvZ3Jlc3MgYmFyIGFjdGl2aXR5IGJ1ZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChoYXBwZW5zIG9uIGZvcm0gc3VibWl0cyB0byBpZnJhbWUgdGFyZ2V0cyk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnPGlmcmFtZSBzcmM9ImphdmFzY3JpcHQ6ZmFsc2U7Ij48L2lmcmFtZT4nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kVG8oZm9ybSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBmb3JtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHJvcCgndGFyZ2V0JywgaWZyYW1lLnByb3AoJ25hbWUnKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCdhY3Rpb24nLCBvcHRpb25zLnVybCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCdtZXRob2QnLCBvcHRpb25zLnR5cGUpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5mb3JtRGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKG9wdGlvbnMuZm9ybURhdGEsIGZ1bmN0aW9uIChpbmRleCwgZmllbGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCc8aW5wdXQgdHlwZT0iaGlkZGVuIi8+JykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByb3AoJ25hbWUnLCBmaWVsZC5uYW1lKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudmFsKGZpZWxkLnZhbHVlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kVG8oZm9ybSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5maWxlSW5wdXQgJiYgb3B0aW9ucy5maWxlSW5wdXQubGVuZ3RoICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlID09PSAnUE9TVCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVJbnB1dENsb25lcyA9IG9wdGlvbnMuZmlsZUlucHV0LmNsb25lKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnNlcnQgYSBjbG9uZSBmb3IgZWFjaCBmaWxlIGlucHV0IGZpZWxkOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5maWxlSW5wdXQuYWZ0ZXIoZnVuY3Rpb24gKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpbGVJbnB1dENsb25lc1tpbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnBhcmFtTmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZmlsZUlucHV0LmVhY2goZnVuY3Rpb24gKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucHJvcCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtTmFtZXNbaW5kZXhdIHx8IG9wdGlvbnMucGFyYW1OYW1lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBcHBlbmRpbmcgdGhlIGZpbGUgaW5wdXQgZmllbGRzIHRvIHRoZSBoaWRkZW4gZm9ybQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlcyB0aGVtIGZyb20gdGhlaXIgb3JpZ2luYWwgbG9jYXRpb246CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChvcHRpb25zLmZpbGVJbnB1dCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHJvcCgnZW5jdHlwZScsICdtdWx0aXBhcnQvZm9ybS1kYXRhJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlbmN0eXBlIG11c3QgYmUgc2V0IGFzIGVuY29kaW5nIGZvciBJRToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHJvcCgnZW5jb2RpbmcnLCAnbXVsdGlwYXJ0L2Zvcm0tZGF0YScpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0uc3VibWl0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluc2VydCB0aGUgZmlsZSBpbnB1dCBmaWVsZHMgYXQgdGhlaXIgb3JpZ2luYWwgbG9jYXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnkgcmVwbGFjaW5nIHRoZSBjbG9uZXMgd2l0aCB0aGUgb3JpZ2luYWxzOgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZUlucHV0Q2xvbmVzICYmIGZpbGVJbnB1dENsb25lcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZmlsZUlucHV0LmVhY2goZnVuY3Rpb24gKGluZGV4LCBpbnB1dCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjbG9uZSA9ICQoZmlsZUlucHV0Q2xvbmVzW2luZGV4XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChpbnB1dCkucHJvcCgnbmFtZScsIGNsb25lLnByb3AoJ25hbWUnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvbmUucmVwbGFjZVdpdGgoaW5wdXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBmb3JtLmFwcGVuZChpZnJhbWUpLmFwcGVuZFRvKGRvY3VtZW50LmJvZHkpOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGFib3J0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGlmcmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBqYXZhc2NyaXB0OmZhbHNlIGFzIGlmcmFtZSBzcmMgYWJvcnRzIHRoZSByZXF1ZXN0CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBwcmV2ZW50cyB3YXJuaW5nIHBvcHVwcyBvbiBIVFRQUyBpbiBJRTYuCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbmNhdCBpcyB1c2VkIHRvIGF2b2lkIHRoZSAiU2NyaXB0IFVSTCIgSlNMaW50IGVycm9yOgogICAgICAgICAgICAgICAgICAgICAgICBpZnJhbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC51bmJpbmQoJ2xvYWQnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByb3AoJ3NyYycsICdqYXZhc2NyaXB0Jy5jb25jYXQoJzpmYWxzZTsnKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChmb3JtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0ucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0pOwoKICAgIC8vIFRoZSBpZnJhbWUgdHJhbnNwb3J0IHJldHVybnMgdGhlIGlmcmFtZSBjb250ZW50IGRvY3VtZW50IGFzIHJlc3BvbnNlLgogICAgLy8gVGhlIGZvbGxvd2luZyBhZGRzIGNvbnZlcnRlcnMgZnJvbSBpZnJhbWUgdG8gdGV4dCwganNvbiwgaHRtbCwgYW5kIHNjcmlwdDoKICAgICQuYWpheFNldHVwKHsKICAgICAgICBjb252ZXJ0ZXJzOiB7CiAgICAgICAgICAgICdpZnJhbWUgdGV4dCc6IGZ1bmN0aW9uIChpZnJhbWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkKGlmcmFtZVswXS5ib2R5KS50ZXh0KCk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICdpZnJhbWUganNvbic6IGZ1bmN0aW9uIChpZnJhbWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkLnBhcnNlSlNPTigkKGlmcmFtZVswXS5ib2R5KS50ZXh0KCkpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAnaWZyYW1lIGh0bWwnOiBmdW5jdGlvbiAoaWZyYW1lKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJChpZnJhbWVbMF0uYm9keSkuaHRtbCgpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAnaWZyYW1lIHNjcmlwdCc6IGZ1bmN0aW9uIChpZnJhbWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkLmdsb2JhbEV2YWwoJChpZnJhbWVbMF0uYm9keSkudGV4dCgpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKfSkpOwo=]]></data>
	</file>
	<file>
	  <filename>/lib/fileupload.lib/js/vendor/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/fileupload.lib/js/vendor/jquery.ui.widget.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKICogalF1ZXJ5IFVJIFdpZGdldCAxLjkuMSthbWQKICogaHR0cHM6Ly9naXRodWIuY29tL2JsdWVpbXAvalF1ZXJ5LUZpbGUtVXBsb2FkCiAqCiAqIENvcHlyaWdodCAyMDEyIGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMKICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLgogKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlCiAqCiAqIGh0dHA6Ly9hcGkuanF1ZXJ5dWkuY29tL2pRdWVyeS53aWRnZXQvCiAqLwoKKGZ1bmN0aW9uIChmYWN0b3J5KSB7CiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kKSB7CiAgICAgICAgLy8gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIEFNRCBtb2R1bGU6CiAgICAgICAgZGVmaW5lKFsianF1ZXJ5Il0sIGZhY3RvcnkpOwogICAgfSBlbHNlIHsKICAgICAgICAvLyBCcm93c2VyIGdsb2JhbHM6CiAgICAgICAgZmFjdG9yeShqUXVlcnkpOwogICAgfQp9KGZ1bmN0aW9uKCAkLCB1bmRlZmluZWQgKSB7Cgp2YXIgdXVpZCA9IDAsCglzbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZSwKCV9jbGVhbkRhdGEgPSAkLmNsZWFuRGF0YTsKJC5jbGVhbkRhdGEgPSBmdW5jdGlvbiggZWxlbXMgKSB7Cglmb3IgKCB2YXIgaSA9IDAsIGVsZW07IChlbGVtID0gZWxlbXNbaV0pICE9IG51bGw7IGkrKyApIHsKCQl0cnkgewoJCQkkKCBlbGVtICkudHJpZ2dlckhhbmRsZXIoICJyZW1vdmUiICk7CgkJLy8gaHR0cDovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvODIzNQoJCX0gY2F0Y2goIGUgKSB7fQoJfQoJX2NsZWFuRGF0YSggZWxlbXMgKTsKfTsKCiQud2lkZ2V0ID0gZnVuY3Rpb24oIG5hbWUsIGJhc2UsIHByb3RvdHlwZSApIHsKCXZhciBmdWxsTmFtZSwgZXhpc3RpbmdDb25zdHJ1Y3RvciwgY29uc3RydWN0b3IsIGJhc2VQcm90b3R5cGUsCgkJbmFtZXNwYWNlID0gbmFtZS5zcGxpdCggIi4iIClbIDAgXTsKCgluYW1lID0gbmFtZS5zcGxpdCggIi4iIClbIDEgXTsKCWZ1bGxOYW1lID0gbmFtZXNwYWNlICsgIi0iICsgbmFtZTsKCglpZiAoICFwcm90b3R5cGUgKSB7CgkJcHJvdG90eXBlID0gYmFzZTsKCQliYXNlID0gJC5XaWRnZXQ7Cgl9CgoJLy8gY3JlYXRlIHNlbGVjdG9yIGZvciBwbHVnaW4KCSQuZXhwclsgIjoiIF1bIGZ1bGxOYW1lLnRvTG93ZXJDYXNlKCkgXSA9IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiAhISQuZGF0YSggZWxlbSwgZnVsbE5hbWUgKTsKCX07CgoJJFsgbmFtZXNwYWNlIF0gPSAkWyBuYW1lc3BhY2UgXSB8fCB7fTsKCWV4aXN0aW5nQ29uc3RydWN0b3IgPSAkWyBuYW1lc3BhY2UgXVsgbmFtZSBdOwoJY29uc3RydWN0b3IgPSAkWyBuYW1lc3BhY2UgXVsgbmFtZSBdID0gZnVuY3Rpb24oIG9wdGlvbnMsIGVsZW1lbnQgKSB7CgkJLy8gYWxsb3cgaW5zdGFudGlhdGlvbiB3aXRob3V0ICJuZXciIGtleXdvcmQKCQlpZiAoICF0aGlzLl9jcmVhdGVXaWRnZXQgKSB7CgkJCXJldHVybiBuZXcgY29uc3RydWN0b3IoIG9wdGlvbnMsIGVsZW1lbnQgKTsKCQl9CgoJCS8vIGFsbG93IGluc3RhbnRpYXRpb24gd2l0aG91dCBpbml0aWFsaXppbmcgZm9yIHNpbXBsZSBpbmhlcml0YW5jZQoJCS8vIG11c3QgdXNlICJuZXciIGtleXdvcmQgKHRoZSBjb2RlIGFib3ZlIGFsd2F5cyBwYXNzZXMgYXJncykKCQlpZiAoIGFyZ3VtZW50cy5sZW5ndGggKSB7CgkJCXRoaXMuX2NyZWF0ZVdpZGdldCggb3B0aW9ucywgZWxlbWVudCApOwoJCX0KCX07CgkvLyBleHRlbmQgd2l0aCB0aGUgZXhpc3RpbmcgY29uc3RydWN0b3IgdG8gY2Fycnkgb3ZlciBhbnkgc3RhdGljIHByb3BlcnRpZXMKCSQuZXh0ZW5kKCBjb25zdHJ1Y3RvciwgZXhpc3RpbmdDb25zdHJ1Y3RvciwgewoJCXZlcnNpb246IHByb3RvdHlwZS52ZXJzaW9uLAoJCS8vIGNvcHkgdGhlIG9iamVjdCB1c2VkIHRvIGNyZWF0ZSB0aGUgcHJvdG90eXBlIGluIGNhc2Ugd2UgbmVlZCB0bwoJCS8vIHJlZGVmaW5lIHRoZSB3aWRnZXQgbGF0ZXIKCQlfcHJvdG86ICQuZXh0ZW5kKCB7fSwgcHJvdG90eXBlICksCgkJLy8gdHJhY2sgd2lkZ2V0cyB0aGF0IGluaGVyaXQgZnJvbSB0aGlzIHdpZGdldCBpbiBjYXNlIHRoaXMgd2lkZ2V0IGlzCgkJLy8gcmVkZWZpbmVkIGFmdGVyIGEgd2lkZ2V0IGluaGVyaXRzIGZyb20gaXQKCQlfY2hpbGRDb25zdHJ1Y3RvcnM6IFtdCgl9KTsKCgliYXNlUHJvdG90eXBlID0gbmV3IGJhc2UoKTsKCS8vIHdlIG5lZWQgdG8gbWFrZSB0aGUgb3B0aW9ucyBoYXNoIGEgcHJvcGVydHkgZGlyZWN0bHkgb24gdGhlIG5ldyBpbnN0YW5jZQoJLy8gb3RoZXJ3aXNlIHdlJ2xsIG1vZGlmeSB0aGUgb3B0aW9ucyBoYXNoIG9uIHRoZSBwcm90b3R5cGUgdGhhdCB3ZSdyZQoJLy8gaW5oZXJpdGluZyBmcm9tCgliYXNlUHJvdG90eXBlLm9wdGlvbnMgPSAkLndpZGdldC5leHRlbmQoIHt9LCBiYXNlUHJvdG90eXBlLm9wdGlvbnMgKTsKCSQuZWFjaCggcHJvdG90eXBlLCBmdW5jdGlvbiggcHJvcCwgdmFsdWUgKSB7CgkJaWYgKCAkLmlzRnVuY3Rpb24oIHZhbHVlICkgKSB7CgkJCXByb3RvdHlwZVsgcHJvcCBdID0gKGZ1bmN0aW9uKCkgewoJCQkJdmFyIF9zdXBlciA9IGZ1bmN0aW9uKCkgewoJCQkJCQlyZXR1cm4gYmFzZS5wcm90b3R5cGVbIHByb3AgXS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgkJCQkJfSwKCQkJCQlfc3VwZXJBcHBseSA9IGZ1bmN0aW9uKCBhcmdzICkgewoJCQkJCQlyZXR1cm4gYmFzZS5wcm90b3R5cGVbIHByb3AgXS5hcHBseSggdGhpcywgYXJncyApOwoJCQkJCX07CgkJCQlyZXR1cm4gZnVuY3Rpb24oKSB7CgkJCQkJdmFyIF9fc3VwZXIgPSB0aGlzLl9zdXBlciwKCQkJCQkJX19zdXBlckFwcGx5ID0gdGhpcy5fc3VwZXJBcHBseSwKCQkJCQkJcmV0dXJuVmFsdWU7CgoJCQkJCXRoaXMuX3N1cGVyID0gX3N1cGVyOwoJCQkJCXRoaXMuX3N1cGVyQXBwbHkgPSBfc3VwZXJBcHBseTsKCgkJCQkJcmV0dXJuVmFsdWUgPSB2YWx1ZS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgoJCQkJCXRoaXMuX3N1cGVyID0gX19zdXBlcjsKCQkJCQl0aGlzLl9zdXBlckFwcGx5ID0gX19zdXBlckFwcGx5OwoKCQkJCQlyZXR1cm4gcmV0dXJuVmFsdWU7CgkJCQl9OwoJCQl9KSgpOwoJCX0KCX0pOwoJY29uc3RydWN0b3IucHJvdG90eXBlID0gJC53aWRnZXQuZXh0ZW5kKCBiYXNlUHJvdG90eXBlLCB7CgkJLy8gVE9ETzogcmVtb3ZlIHN1cHBvcnQgZm9yIHdpZGdldEV2ZW50UHJlZml4CgkJLy8gYWx3YXlzIHVzZSB0aGUgbmFtZSArIGEgY29sb24gYXMgdGhlIHByZWZpeCwgZS5nLiwgZHJhZ2dhYmxlOnN0YXJ0CgkJLy8gZG9uJ3QgcHJlZml4IGZvciB3aWRnZXRzIHRoYXQgYXJlbid0IERPTS1iYXNlZAoJCXdpZGdldEV2ZW50UHJlZml4OiBiYXNlUHJvdG90eXBlLndpZGdldEV2ZW50UHJlZml4IHx8IG5hbWUKCX0sIHByb3RvdHlwZSwgewoJCWNvbnN0cnVjdG9yOiBjb25zdHJ1Y3RvciwKCQluYW1lc3BhY2U6IG5hbWVzcGFjZSwKCQl3aWRnZXROYW1lOiBuYW1lLAoJCS8vIFRPRE8gcmVtb3ZlIHdpZGdldEJhc2VDbGFzcywgc2VlICM4MTU1CgkJd2lkZ2V0QmFzZUNsYXNzOiBmdWxsTmFtZSwKCQl3aWRnZXRGdWxsTmFtZTogZnVsbE5hbWUKCX0pOwoKCS8vIElmIHRoaXMgd2lkZ2V0IGlzIGJlaW5nIHJlZGVmaW5lZCB0aGVuIHdlIG5lZWQgdG8gZmluZCBhbGwgd2lkZ2V0cyB0aGF0CgkvLyBhcmUgaW5oZXJpdGluZyBmcm9tIGl0IGFuZCByZWRlZmluZSBhbGwgb2YgdGhlbSBzbyB0aGF0IHRoZXkgaW5oZXJpdCBmcm9tCgkvLyB0aGUgbmV3IHZlcnNpb24gb2YgdGhpcyB3aWRnZXQuIFdlJ3JlIGVzc2VudGlhbGx5IHRyeWluZyB0byByZXBsYWNlIG9uZQoJLy8gbGV2ZWwgaW4gdGhlIHByb3RvdHlwZSBjaGFpbi4KCWlmICggZXhpc3RpbmdDb25zdHJ1Y3RvciApIHsKCQkkLmVhY2goIGV4aXN0aW5nQ29uc3RydWN0b3IuX2NoaWxkQ29uc3RydWN0b3JzLCBmdW5jdGlvbiggaSwgY2hpbGQgKSB7CgkJCXZhciBjaGlsZFByb3RvdHlwZSA9IGNoaWxkLnByb3RvdHlwZTsKCgkJCS8vIHJlZGVmaW5lIHRoZSBjaGlsZCB3aWRnZXQgdXNpbmcgdGhlIHNhbWUgcHJvdG90eXBlIHRoYXQgd2FzCgkJCS8vIG9yaWdpbmFsbHkgdXNlZCwgYnV0IGluaGVyaXQgZnJvbSB0aGUgbmV3IHZlcnNpb24gb2YgdGhlIGJhc2UKCQkJJC53aWRnZXQoIGNoaWxkUHJvdG90eXBlLm5hbWVzcGFjZSArICIuIiArIGNoaWxkUHJvdG90eXBlLndpZGdldE5hbWUsIGNvbnN0cnVjdG9yLCBjaGlsZC5fcHJvdG8gKTsKCQl9KTsKCQkvLyByZW1vdmUgdGhlIGxpc3Qgb2YgZXhpc3RpbmcgY2hpbGQgY29uc3RydWN0b3JzIGZyb20gdGhlIG9sZCBjb25zdHJ1Y3RvcgoJCS8vIHNvIHRoZSBvbGQgY2hpbGQgY29uc3RydWN0b3JzIGNhbiBiZSBnYXJiYWdlIGNvbGxlY3RlZAoJCWRlbGV0ZSBleGlzdGluZ0NvbnN0cnVjdG9yLl9jaGlsZENvbnN0cnVjdG9yczsKCX0gZWxzZSB7CgkJYmFzZS5fY2hpbGRDb25zdHJ1Y3RvcnMucHVzaCggY29uc3RydWN0b3IgKTsKCX0KCgkkLndpZGdldC5icmlkZ2UoIG5hbWUsIGNvbnN0cnVjdG9yICk7Cn07CgokLndpZGdldC5leHRlbmQgPSBmdW5jdGlvbiggdGFyZ2V0ICkgewoJdmFyIGlucHV0ID0gc2xpY2UuY2FsbCggYXJndW1lbnRzLCAxICksCgkJaW5wdXRJbmRleCA9IDAsCgkJaW5wdXRMZW5ndGggPSBpbnB1dC5sZW5ndGgsCgkJa2V5LAoJCXZhbHVlOwoJZm9yICggOyBpbnB1dEluZGV4IDwgaW5wdXRMZW5ndGg7IGlucHV0SW5kZXgrKyApIHsKCQlmb3IgKCBrZXkgaW4gaW5wdXRbIGlucHV0SW5kZXggXSApIHsKCQkJdmFsdWUgPSBpbnB1dFsgaW5wdXRJbmRleCBdWyBrZXkgXTsKCQkJaWYgKCBpbnB1dFsgaW5wdXRJbmRleCBdLmhhc093blByb3BlcnR5KCBrZXkgKSAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkICkgewoJCQkJLy8gQ2xvbmUgb2JqZWN0cwoJCQkJaWYgKCAkLmlzUGxhaW5PYmplY3QoIHZhbHVlICkgKSB7CgkJCQkJdGFyZ2V0WyBrZXkgXSA9ICQuaXNQbGFpbk9iamVjdCggdGFyZ2V0WyBrZXkgXSApID8KCQkJCQkJJC53aWRnZXQuZXh0ZW5kKCB7fSwgdGFyZ2V0WyBrZXkgXSwgdmFsdWUgKSA6CgkJCQkJCS8vIERvbid0IGV4dGVuZCBzdHJpbmdzLCBhcnJheXMsIGV0Yy4gd2l0aCBvYmplY3RzCgkJCQkJCSQud2lkZ2V0LmV4dGVuZCgge30sIHZhbHVlICk7CgkJCQkvLyBDb3B5IGV2ZXJ5dGhpbmcgZWxzZSBieSByZWZlcmVuY2UKCQkJCX0gZWxzZSB7CgkJCQkJdGFyZ2V0WyBrZXkgXSA9IHZhbHVlOwoJCQkJfQoJCQl9CgkJfQoJfQoJcmV0dXJuIHRhcmdldDsKfTsKCiQud2lkZ2V0LmJyaWRnZSA9IGZ1bmN0aW9uKCBuYW1lLCBvYmplY3QgKSB7Cgl2YXIgZnVsbE5hbWUgPSBvYmplY3QucHJvdG90eXBlLndpZGdldEZ1bGxOYW1lOwoJJC5mblsgbmFtZSBdID0gZnVuY3Rpb24oIG9wdGlvbnMgKSB7CgkJdmFyIGlzTWV0aG9kQ2FsbCA9IHR5cGVvZiBvcHRpb25zID09PSAic3RyaW5nIiwKCQkJYXJncyA9IHNsaWNlLmNhbGwoIGFyZ3VtZW50cywgMSApLAoJCQlyZXR1cm5WYWx1ZSA9IHRoaXM7CgoJCS8vIGFsbG93IG11bHRpcGxlIGhhc2hlcyB0byBiZSBwYXNzZWQgb24gaW5pdAoJCW9wdGlvbnMgPSAhaXNNZXRob2RDYWxsICYmIGFyZ3MubGVuZ3RoID8KCQkJJC53aWRnZXQuZXh0ZW5kLmFwcGx5KCBudWxsLCBbIG9wdGlvbnMgXS5jb25jYXQoYXJncykgKSA6CgkJCW9wdGlvbnM7CgoJCWlmICggaXNNZXRob2RDYWxsICkgewoJCQl0aGlzLmVhY2goZnVuY3Rpb24oKSB7CgkJCQl2YXIgbWV0aG9kVmFsdWUsCgkJCQkJaW5zdGFuY2UgPSAkLmRhdGEoIHRoaXMsIGZ1bGxOYW1lICk7CgkJCQlpZiAoICFpbnN0YW5jZSApIHsKCQkJCQlyZXR1cm4gJC5lcnJvciggImNhbm5vdCBjYWxsIG1ldGhvZHMgb24gIiArIG5hbWUgKyAiIHByaW9yIHRvIGluaXRpYWxpemF0aW9uOyAiICsKCQkJCQkJImF0dGVtcHRlZCB0byBjYWxsIG1ldGhvZCAnIiArIG9wdGlvbnMgKyAiJyIgKTsKCQkJCX0KCQkJCWlmICggISQuaXNGdW5jdGlvbiggaW5zdGFuY2Vbb3B0aW9uc10gKSB8fCBvcHRpb25zLmNoYXJBdCggMCApID09PSAiXyIgKSB7CgkJCQkJcmV0dXJuICQuZXJyb3IoICJubyBzdWNoIG1ldGhvZCAnIiArIG9wdGlvbnMgKyAiJyBmb3IgIiArIG5hbWUgKyAiIHdpZGdldCBpbnN0YW5jZSIgKTsKCQkJCX0KCQkJCW1ldGhvZFZhbHVlID0gaW5zdGFuY2VbIG9wdGlvbnMgXS5hcHBseSggaW5zdGFuY2UsIGFyZ3MgKTsKCQkJCWlmICggbWV0aG9kVmFsdWUgIT09IGluc3RhbmNlICYmIG1ldGhvZFZhbHVlICE9PSB1bmRlZmluZWQgKSB7CgkJCQkJcmV0dXJuVmFsdWUgPSBtZXRob2RWYWx1ZSAmJiBtZXRob2RWYWx1ZS5qcXVlcnkgPwoJCQkJCQlyZXR1cm5WYWx1ZS5wdXNoU3RhY2soIG1ldGhvZFZhbHVlLmdldCgpICkgOgoJCQkJCQltZXRob2RWYWx1ZTsKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9CgkJCX0pOwoJCX0gZWxzZSB7CgkJCXRoaXMuZWFjaChmdW5jdGlvbigpIHsKCQkJCXZhciBpbnN0YW5jZSA9ICQuZGF0YSggdGhpcywgZnVsbE5hbWUgKTsKCQkJCWlmICggaW5zdGFuY2UgKSB7CgkJCQkJaW5zdGFuY2Uub3B0aW9uKCBvcHRpb25zIHx8IHt9ICkuX2luaXQoKTsKCQkJCX0gZWxzZSB7CgkJCQkJbmV3IG9iamVjdCggb3B0aW9ucywgdGhpcyApOwoJCQkJfQoJCQl9KTsKCQl9CgoJCXJldHVybiByZXR1cm5WYWx1ZTsKCX07Cn07CgokLldpZGdldCA9IGZ1bmN0aW9uKCAvKiBvcHRpb25zLCBlbGVtZW50ICovICkge307CiQuV2lkZ2V0Ll9jaGlsZENvbnN0cnVjdG9ycyA9IFtdOwoKJC5XaWRnZXQucHJvdG90eXBlID0gewoJd2lkZ2V0TmFtZTogIndpZGdldCIsCgl3aWRnZXRFdmVudFByZWZpeDogIiIsCglkZWZhdWx0RWxlbWVudDogIjxkaXY+IiwKCW9wdGlvbnM6IHsKCQlkaXNhYmxlZDogZmFsc2UsCgoJCS8vIGNhbGxiYWNrcwoJCWNyZWF0ZTogbnVsbAoJfSwKCV9jcmVhdGVXaWRnZXQ6IGZ1bmN0aW9uKCBvcHRpb25zLCBlbGVtZW50ICkgewoJCWVsZW1lbnQgPSAkKCBlbGVtZW50IHx8IHRoaXMuZGVmYXVsdEVsZW1lbnQgfHwgdGhpcyApWyAwIF07CgkJdGhpcy5lbGVtZW50ID0gJCggZWxlbWVudCApOwoJCXRoaXMudXVpZCA9IHV1aWQrKzsKCQl0aGlzLmV2ZW50TmFtZXNwYWNlID0gIi4iICsgdGhpcy53aWRnZXROYW1lICsgdGhpcy51dWlkOwoJCXRoaXMub3B0aW9ucyA9ICQud2lkZ2V0LmV4dGVuZCgge30sCgkJCXRoaXMub3B0aW9ucywKCQkJdGhpcy5fZ2V0Q3JlYXRlT3B0aW9ucygpLAoJCQlvcHRpb25zICk7CgoJCXRoaXMuYmluZGluZ3MgPSAkKCk7CgkJdGhpcy5ob3ZlcmFibGUgPSAkKCk7CgkJdGhpcy5mb2N1c2FibGUgPSAkKCk7CgoJCWlmICggZWxlbWVudCAhPT0gdGhpcyApIHsKCQkJLy8gMS45IEJDIGZvciAjNzgxMAoJCQkvLyBUT0RPIHJlbW92ZSBkdWFsIHN0b3JhZ2UKCQkJJC5kYXRhKCBlbGVtZW50LCB0aGlzLndpZGdldE5hbWUsIHRoaXMgKTsKCQkJJC5kYXRhKCBlbGVtZW50LCB0aGlzLndpZGdldEZ1bGxOYW1lLCB0aGlzICk7CgkJCXRoaXMuX29uKCB0aGlzLmVsZW1lbnQsIHsKCQkJCXJlbW92ZTogZnVuY3Rpb24oIGV2ZW50ICkgewoJCQkJCWlmICggZXZlbnQudGFyZ2V0ID09PSBlbGVtZW50ICkgewoJCQkJCQl0aGlzLmRlc3Ryb3koKTsKCQkJCQl9CgkJCQl9CgkJCX0pOwoJCQl0aGlzLmRvY3VtZW50ID0gJCggZWxlbWVudC5zdHlsZSA/CgkJCQkvLyBlbGVtZW50IHdpdGhpbiB0aGUgZG9jdW1lbnQKCQkJCWVsZW1lbnQub3duZXJEb2N1bWVudCA6CgkJCQkvLyBlbGVtZW50IGlzIHdpbmRvdyBvciBkb2N1bWVudAoJCQkJZWxlbWVudC5kb2N1bWVudCB8fCBlbGVtZW50ICk7CgkJCXRoaXMud2luZG93ID0gJCggdGhpcy5kb2N1bWVudFswXS5kZWZhdWx0VmlldyB8fCB0aGlzLmRvY3VtZW50WzBdLnBhcmVudFdpbmRvdyApOwoJCX0KCgkJdGhpcy5fY3JlYXRlKCk7CgkJdGhpcy5fdHJpZ2dlciggImNyZWF0ZSIsIG51bGwsIHRoaXMuX2dldENyZWF0ZUV2ZW50RGF0YSgpICk7CgkJdGhpcy5faW5pdCgpOwoJfSwKCV9nZXRDcmVhdGVPcHRpb25zOiAkLm5vb3AsCglfZ2V0Q3JlYXRlRXZlbnREYXRhOiAkLm5vb3AsCglfY3JlYXRlOiAkLm5vb3AsCglfaW5pdDogJC5ub29wLAoKCWRlc3Ryb3k6IGZ1bmN0aW9uKCkgewoJCXRoaXMuX2Rlc3Ryb3koKTsKCQkvLyB3ZSBjYW4gcHJvYmFibHkgcmVtb3ZlIHRoZSB1bmJpbmQgY2FsbHMgaW4gMi4wCgkJLy8gYWxsIGV2ZW50IGJpbmRpbmdzIHNob3VsZCBnbyB0aHJvdWdoIHRoaXMuX29uKCkKCQl0aGlzLmVsZW1lbnQKCQkJLnVuYmluZCggdGhpcy5ldmVudE5hbWVzcGFjZSApCgkJCS8vIDEuOSBCQyBmb3IgIzc4MTAKCQkJLy8gVE9ETyByZW1vdmUgZHVhbCBzdG9yYWdlCgkJCS5yZW1vdmVEYXRhKCB0aGlzLndpZGdldE5hbWUgKQoJCQkucmVtb3ZlRGF0YSggdGhpcy53aWRnZXRGdWxsTmFtZSApCgkJCS8vIHN1cHBvcnQ6IGpxdWVyeSA8MS42LjMKCQkJLy8gaHR0cDovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvOTQxMwoJCQkucmVtb3ZlRGF0YSggJC5jYW1lbENhc2UoIHRoaXMud2lkZ2V0RnVsbE5hbWUgKSApOwoJCXRoaXMud2lkZ2V0KCkKCQkJLnVuYmluZCggdGhpcy5ldmVudE5hbWVzcGFjZSApCgkJCS5yZW1vdmVBdHRyKCAiYXJpYS1kaXNhYmxlZCIgKQoJCQkucmVtb3ZlQ2xhc3MoCgkJCQl0aGlzLndpZGdldEZ1bGxOYW1lICsgIi1kaXNhYmxlZCAiICsKCQkJCSJ1aS1zdGF0ZS1kaXNhYmxlZCIgKTsKCgkJLy8gY2xlYW4gdXAgZXZlbnRzIGFuZCBzdGF0ZXMKCQl0aGlzLmJpbmRpbmdzLnVuYmluZCggdGhpcy5ldmVudE5hbWVzcGFjZSApOwoJCXRoaXMuaG92ZXJhYmxlLnJlbW92ZUNsYXNzKCAidWktc3RhdGUtaG92ZXIiICk7CgkJdGhpcy5mb2N1c2FibGUucmVtb3ZlQ2xhc3MoICJ1aS1zdGF0ZS1mb2N1cyIgKTsKCX0sCglfZGVzdHJveTogJC5ub29wLAoKCXdpZGdldDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuZWxlbWVudDsKCX0sCgoJb3B0aW9uOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHsKCQl2YXIgb3B0aW9ucyA9IGtleSwKCQkJcGFydHMsCgkJCWN1ck9wdGlvbiwKCQkJaTsKCgkJaWYgKCBhcmd1bWVudHMubGVuZ3RoID09PSAwICkgewoJCQkvLyBkb24ndCByZXR1cm4gYSByZWZlcmVuY2UgdG8gdGhlIGludGVybmFsIGhhc2gKCQkJcmV0dXJuICQud2lkZ2V0LmV4dGVuZCgge30sIHRoaXMub3B0aW9ucyApOwoJCX0KCgkJaWYgKCB0eXBlb2Yga2V5ID09PSAic3RyaW5nIiApIHsKCQkJLy8gaGFuZGxlIG5lc3RlZCBrZXlzLCBlLmcuLCAiZm9vLmJhciIgPT4geyBmb286IHsgYmFyOiBfX18gfSB9CgkJCW9wdGlvbnMgPSB7fTsKCQkJcGFydHMgPSBrZXkuc3BsaXQoICIuIiApOwoJCQlrZXkgPSBwYXJ0cy5zaGlmdCgpOwoJCQlpZiAoIHBhcnRzLmxlbmd0aCApIHsKCQkJCWN1ck9wdGlvbiA9IG9wdGlvbnNbIGtleSBdID0gJC53aWRnZXQuZXh0ZW5kKCB7fSwgdGhpcy5vcHRpb25zWyBrZXkgXSApOwoJCQkJZm9yICggaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGggLSAxOyBpKysgKSB7CgkJCQkJY3VyT3B0aW9uWyBwYXJ0c1sgaSBdIF0gPSBjdXJPcHRpb25bIHBhcnRzWyBpIF0gXSB8fCB7fTsKCQkJCQljdXJPcHRpb24gPSBjdXJPcHRpb25bIHBhcnRzWyBpIF0gXTsKCQkJCX0KCQkJCWtleSA9IHBhcnRzLnBvcCgpOwoJCQkJaWYgKCB2YWx1ZSA9PT0gdW5kZWZpbmVkICkgewoJCQkJCXJldHVybiBjdXJPcHRpb25bIGtleSBdID09PSB1bmRlZmluZWQgPyBudWxsIDogY3VyT3B0aW9uWyBrZXkgXTsKCQkJCX0KCQkJCWN1ck9wdGlvblsga2V5IF0gPSB2YWx1ZTsKCQkJfSBlbHNlIHsKCQkJCWlmICggdmFsdWUgPT09IHVuZGVmaW5lZCApIHsKCQkJCQlyZXR1cm4gdGhpcy5vcHRpb25zWyBrZXkgXSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHRoaXMub3B0aW9uc1sga2V5IF07CgkJCQl9CgkJCQlvcHRpb25zWyBrZXkgXSA9IHZhbHVlOwoJCQl9CgkJfQoKCQl0aGlzLl9zZXRPcHRpb25zKCBvcHRpb25zICk7CgoJCXJldHVybiB0aGlzOwoJfSwKCV9zZXRPcHRpb25zOiBmdW5jdGlvbiggb3B0aW9ucyApIHsKCQl2YXIga2V5OwoKCQlmb3IgKCBrZXkgaW4gb3B0aW9ucyApIHsKCQkJdGhpcy5fc2V0T3B0aW9uKCBrZXksIG9wdGlvbnNbIGtleSBdICk7CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCglfc2V0T3B0aW9uOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHsKCQl0aGlzLm9wdGlvbnNbIGtleSBdID0gdmFsdWU7CgoJCWlmICgga2V5ID09PSAiZGlzYWJsZWQiICkgewoJCQl0aGlzLndpZGdldCgpCgkJCQkudG9nZ2xlQ2xhc3MoIHRoaXMud2lkZ2V0RnVsbE5hbWUgKyAiLWRpc2FibGVkIHVpLXN0YXRlLWRpc2FibGVkIiwgISF2YWx1ZSApCgkJCQkuYXR0ciggImFyaWEtZGlzYWJsZWQiLCB2YWx1ZSApOwoJCQl0aGlzLmhvdmVyYWJsZS5yZW1vdmVDbGFzcyggInVpLXN0YXRlLWhvdmVyIiApOwoJCQl0aGlzLmZvY3VzYWJsZS5yZW1vdmVDbGFzcyggInVpLXN0YXRlLWZvY3VzIiApOwoJCX0KCgkJcmV0dXJuIHRoaXM7Cgl9LAoKCWVuYWJsZTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuX3NldE9wdGlvbiggImRpc2FibGVkIiwgZmFsc2UgKTsKCX0sCglkaXNhYmxlOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5fc2V0T3B0aW9uKCAiZGlzYWJsZWQiLCB0cnVlICk7Cgl9LAoKCV9vbjogZnVuY3Rpb24oIGVsZW1lbnQsIGhhbmRsZXJzICkgewoJCXZhciBkZWxlZ2F0ZUVsZW1lbnQsCgkJCWluc3RhbmNlID0gdGhpczsKCQkvLyBubyBlbGVtZW50IGFyZ3VtZW50LCBzaHVmZmxlIGFuZCB1c2UgdGhpcy5lbGVtZW50CgkJaWYgKCAhaGFuZGxlcnMgKSB7CgkJCWhhbmRsZXJzID0gZWxlbWVudDsKCQkJZWxlbWVudCA9IHRoaXMuZWxlbWVudDsKCQkJZGVsZWdhdGVFbGVtZW50ID0gdGhpcy53aWRnZXQoKTsKCQl9IGVsc2UgewoJCQkvLyBhY2NlcHQgc2VsZWN0b3JzLCBET00gZWxlbWVudHMKCQkJZWxlbWVudCA9IGRlbGVnYXRlRWxlbWVudCA9ICQoIGVsZW1lbnQgKTsKCQkJdGhpcy5iaW5kaW5ncyA9IHRoaXMuYmluZGluZ3MuYWRkKCBlbGVtZW50ICk7CgkJfQoKCQkkLmVhY2goIGhhbmRsZXJzLCBmdW5jdGlvbiggZXZlbnQsIGhhbmRsZXIgKSB7CgkJCWZ1bmN0aW9uIGhhbmRsZXJQcm94eSgpIHsKCQkJCS8vIGFsbG93IHdpZGdldHMgdG8gY3VzdG9taXplIHRoZSBkaXNhYmxlZCBoYW5kbGluZwoJCQkJLy8gLSBkaXNhYmxlZCBhcyBhbiBhcnJheSBpbnN0ZWFkIG9mIGJvb2xlYW4KCQkJCS8vIC0gZGlzYWJsZWQgY2xhc3MgYXMgbWV0aG9kIGZvciBkaXNhYmxpbmcgaW5kaXZpZHVhbCBwYXJ0cwoJCQkJaWYgKCBpbnN0YW5jZS5vcHRpb25zLmRpc2FibGVkID09PSB0cnVlIHx8CgkJCQkJCSQoIHRoaXMgKS5oYXNDbGFzcyggInVpLXN0YXRlLWRpc2FibGVkIiApICkgewoJCQkJCXJldHVybjsKCQkJCX0KCQkJCXJldHVybiAoIHR5cGVvZiBoYW5kbGVyID09PSAic3RyaW5nIiA/IGluc3RhbmNlWyBoYW5kbGVyIF0gOiBoYW5kbGVyICkKCQkJCQkuYXBwbHkoIGluc3RhbmNlLCBhcmd1bWVudHMgKTsKCQkJfQoKCQkJLy8gY29weSB0aGUgZ3VpZCBzbyBkaXJlY3QgdW5iaW5kaW5nIHdvcmtzCgkJCWlmICggdHlwZW9mIGhhbmRsZXIgIT09ICJzdHJpbmciICkgewoJCQkJaGFuZGxlclByb3h5Lmd1aWQgPSBoYW5kbGVyLmd1aWQgPQoJCQkJCWhhbmRsZXIuZ3VpZCB8fCBoYW5kbGVyUHJveHkuZ3VpZCB8fCAkLmd1aWQrKzsKCQkJfQoKCQkJdmFyIG1hdGNoID0gZXZlbnQubWF0Y2goIC9eKFx3KylccyooLiopJC8gKSwKCQkJCWV2ZW50TmFtZSA9IG1hdGNoWzFdICsgaW5zdGFuY2UuZXZlbnROYW1lc3BhY2UsCgkJCQlzZWxlY3RvciA9IG1hdGNoWzJdOwoJCQlpZiAoIHNlbGVjdG9yICkgewoJCQkJZGVsZWdhdGVFbGVtZW50LmRlbGVnYXRlKCBzZWxlY3RvciwgZXZlbnROYW1lLCBoYW5kbGVyUHJveHkgKTsKCQkJfSBlbHNlIHsKCQkJCWVsZW1lbnQuYmluZCggZXZlbnROYW1lLCBoYW5kbGVyUHJveHkgKTsKCQkJfQoJCX0pOwoJfSwKCglfb2ZmOiBmdW5jdGlvbiggZWxlbWVudCwgZXZlbnROYW1lICkgewoJCWV2ZW50TmFtZSA9IChldmVudE5hbWUgfHwgIiIpLnNwbGl0KCAiICIgKS5qb2luKCB0aGlzLmV2ZW50TmFtZXNwYWNlICsgIiAiICkgKyB0aGlzLmV2ZW50TmFtZXNwYWNlOwoJCWVsZW1lbnQudW5iaW5kKCBldmVudE5hbWUgKS51bmRlbGVnYXRlKCBldmVudE5hbWUgKTsKCX0sCgoJX2RlbGF5OiBmdW5jdGlvbiggaGFuZGxlciwgZGVsYXkgKSB7CgkJZnVuY3Rpb24gaGFuZGxlclByb3h5KCkgewoJCQlyZXR1cm4gKCB0eXBlb2YgaGFuZGxlciA9PT0gInN0cmluZyIgPyBpbnN0YW5jZVsgaGFuZGxlciBdIDogaGFuZGxlciApCgkJCQkuYXBwbHkoIGluc3RhbmNlLCBhcmd1bWVudHMgKTsKCQl9CgkJdmFyIGluc3RhbmNlID0gdGhpczsKCQlyZXR1cm4gc2V0VGltZW91dCggaGFuZGxlclByb3h5LCBkZWxheSB8fCAwICk7Cgl9LAoKCV9ob3ZlcmFibGU6IGZ1bmN0aW9uKCBlbGVtZW50ICkgewoJCXRoaXMuaG92ZXJhYmxlID0gdGhpcy5ob3ZlcmFibGUuYWRkKCBlbGVtZW50ICk7CgkJdGhpcy5fb24oIGVsZW1lbnQsIHsKCQkJbW91c2VlbnRlcjogZnVuY3Rpb24oIGV2ZW50ICkgewoJCQkJJCggZXZlbnQuY3VycmVudFRhcmdldCApLmFkZENsYXNzKCAidWktc3RhdGUtaG92ZXIiICk7CgkJCX0sCgkJCW1vdXNlbGVhdmU6IGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCSQoIGV2ZW50LmN1cnJlbnRUYXJnZXQgKS5yZW1vdmVDbGFzcyggInVpLXN0YXRlLWhvdmVyIiApOwoJCQl9CgkJfSk7Cgl9LAoKCV9mb2N1c2FibGU6IGZ1bmN0aW9uKCBlbGVtZW50ICkgewoJCXRoaXMuZm9jdXNhYmxlID0gdGhpcy5mb2N1c2FibGUuYWRkKCBlbGVtZW50ICk7CgkJdGhpcy5fb24oIGVsZW1lbnQsIHsKCQkJZm9jdXNpbjogZnVuY3Rpb24oIGV2ZW50ICkgewoJCQkJJCggZXZlbnQuY3VycmVudFRhcmdldCApLmFkZENsYXNzKCAidWktc3RhdGUtZm9jdXMiICk7CgkJCX0sCgkJCWZvY3Vzb3V0OiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQkkKCBldmVudC5jdXJyZW50VGFyZ2V0ICkucmVtb3ZlQ2xhc3MoICJ1aS1zdGF0ZS1mb2N1cyIgKTsKCQkJfQoJCX0pOwoJfSwKCglfdHJpZ2dlcjogZnVuY3Rpb24oIHR5cGUsIGV2ZW50LCBkYXRhICkgewoJCXZhciBwcm9wLCBvcmlnLAoJCQljYWxsYmFjayA9IHRoaXMub3B0aW9uc1sgdHlwZSBdOwoKCQlkYXRhID0gZGF0YSB8fCB7fTsKCQlldmVudCA9ICQuRXZlbnQoIGV2ZW50ICk7CgkJZXZlbnQudHlwZSA9ICggdHlwZSA9PT0gdGhpcy53aWRnZXRFdmVudFByZWZpeCA/CgkJCXR5cGUgOgoJCQl0aGlzLndpZGdldEV2ZW50UHJlZml4ICsgdHlwZSApLnRvTG93ZXJDYXNlKCk7CgkJLy8gdGhlIG9yaWdpbmFsIGV2ZW50IG1heSBjb21lIGZyb20gYW55IGVsZW1lbnQKCQkvLyBzbyB3ZSBuZWVkIHRvIHJlc2V0IHRoZSB0YXJnZXQgb24gdGhlIG5ldyBldmVudAoJCWV2ZW50LnRhcmdldCA9IHRoaXMuZWxlbWVudFsgMCBdOwoKCQkvLyBjb3B5IG9yaWdpbmFsIGV2ZW50IHByb3BlcnRpZXMgb3ZlciB0byB0aGUgbmV3IGV2ZW50CgkJb3JpZyA9IGV2ZW50Lm9yaWdpbmFsRXZlbnQ7CgkJaWYgKCBvcmlnICkgewoJCQlmb3IgKCBwcm9wIGluIG9yaWcgKSB7CgkJCQlpZiAoICEoIHByb3AgaW4gZXZlbnQgKSApIHsKCQkJCQlldmVudFsgcHJvcCBdID0gb3JpZ1sgcHJvcCBdOwoJCQkJfQoJCQl9CgkJfQoKCQl0aGlzLmVsZW1lbnQudHJpZ2dlciggZXZlbnQsIGRhdGEgKTsKCQlyZXR1cm4gISggJC5pc0Z1bmN0aW9uKCBjYWxsYmFjayApICYmCgkJCWNhbGxiYWNrLmFwcGx5KCB0aGlzLmVsZW1lbnRbMF0sIFsgZXZlbnQgXS5jb25jYXQoIGRhdGEgKSApID09PSBmYWxzZSB8fAoJCQlldmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSApOwoJfQp9OwoKJC5lYWNoKCB7IHNob3c6ICJmYWRlSW4iLCBoaWRlOiAiZmFkZU91dCIgfSwgZnVuY3Rpb24oIG1ldGhvZCwgZGVmYXVsdEVmZmVjdCApIHsKCSQuV2lkZ2V0LnByb3RvdHlwZVsgIl8iICsgbWV0aG9kIF0gPSBmdW5jdGlvbiggZWxlbWVudCwgb3B0aW9ucywgY2FsbGJhY2sgKSB7CgkJaWYgKCB0eXBlb2Ygb3B0aW9ucyA9PT0gInN0cmluZyIgKSB7CgkJCW9wdGlvbnMgPSB7IGVmZmVjdDogb3B0aW9ucyB9OwoJCX0KCQl2YXIgaGFzT3B0aW9ucywKCQkJZWZmZWN0TmFtZSA9ICFvcHRpb25zID8KCQkJCW1ldGhvZCA6CgkJCQlvcHRpb25zID09PSB0cnVlIHx8IHR5cGVvZiBvcHRpb25zID09PSAibnVtYmVyIiA/CgkJCQkJZGVmYXVsdEVmZmVjdCA6CgkJCQkJb3B0aW9ucy5lZmZlY3QgfHwgZGVmYXVsdEVmZmVjdDsKCQlvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKCQlpZiAoIHR5cGVvZiBvcHRpb25zID09PSAibnVtYmVyIiApIHsKCQkJb3B0aW9ucyA9IHsgZHVyYXRpb246IG9wdGlvbnMgfTsKCQl9CgkJaGFzT3B0aW9ucyA9ICEkLmlzRW1wdHlPYmplY3QoIG9wdGlvbnMgKTsKCQlvcHRpb25zLmNvbXBsZXRlID0gY2FsbGJhY2s7CgkJaWYgKCBvcHRpb25zLmRlbGF5ICkgewoJCQllbGVtZW50LmRlbGF5KCBvcHRpb25zLmRlbGF5ICk7CgkJfQoJCWlmICggaGFzT3B0aW9ucyAmJiAkLmVmZmVjdHMgJiYgKCAkLmVmZmVjdHMuZWZmZWN0WyBlZmZlY3ROYW1lIF0gfHwgJC51aUJhY2tDb21wYXQgIT09IGZhbHNlICYmICQuZWZmZWN0c1sgZWZmZWN0TmFtZSBdICkgKSB7CgkJCWVsZW1lbnRbIG1ldGhvZCBdKCBvcHRpb25zICk7CgkJfSBlbHNlIGlmICggZWZmZWN0TmFtZSAhPT0gbWV0aG9kICYmIGVsZW1lbnRbIGVmZmVjdE5hbWUgXSApIHsKCQkJZWxlbWVudFsgZWZmZWN0TmFtZSBdKCBvcHRpb25zLmR1cmF0aW9uLCBvcHRpb25zLmVhc2luZywgY2FsbGJhY2sgKTsKCQl9IGVsc2UgewoJCQllbGVtZW50LnF1ZXVlKGZ1bmN0aW9uKCBuZXh0ICkgewoJCQkJJCggdGhpcyApWyBtZXRob2QgXSgpOwoJCQkJaWYgKCBjYWxsYmFjayApIHsKCQkJCQljYWxsYmFjay5jYWxsKCBlbGVtZW50WyAwIF0gKTsKCQkJCX0KCQkJCW5leHQoKTsKCQkJfSk7CgkJfQoJfTsKfSk7CgovLyBERVBSRUNBVEVECmlmICggJC51aUJhY2tDb21wYXQgIT09IGZhbHNlICkgewoJJC5XaWRnZXQucHJvdG90eXBlLl9nZXRDcmVhdGVPcHRpb25zID0gZnVuY3Rpb24oKSB7CgkJcmV0dXJuICQubWV0YWRhdGEgJiYgJC5tZXRhZGF0YS5nZXQoIHRoaXMuZWxlbWVudFswXSApWyB0aGlzLndpZGdldE5hbWUgXTsKCX07Cn0KCn0pKTsK]]></data>
	</file>
	<file>
	  <filename>/lib/form.lib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/form.lib/info.dat</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGluZm9bJ2pzJ10gPSAnanF1ZXJ5LmZvcm0uanMnOwokaW5mb1snZGVwZW5kcyddID0gJ2pxdWVyeSc7Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/form.lib/jquery.form.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohCiAqIGpRdWVyeSBGb3JtIFBsdWdpbgogKiB2ZXJzaW9uOiAzLjIzICgxMS1ERUMtMjAxMikKICogQHJlcXVpcmVzIGpRdWVyeSB2MS41IG9yIGxhdGVyCiAqCiAqIEV4YW1wbGVzIGFuZCBkb2N1bWVudGF0aW9uIGF0OiBodHRwOi8vbWFsc3VwLmNvbS9qcXVlcnkvZm9ybS8KICogUHJvamVjdCByZXBvc2l0b3J5OiBodHRwczovL2dpdGh1Yi5jb20vbWFsc3VwL2Zvcm0KICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCBHUEwgbGljZW5zZXM6CiAqICAgIGh0dHA6Ly9tYWxzdXAuZ2l0aHViLmNvbS9taXQtbGljZW5zZS50eHQKICogICAgaHR0cDovL21hbHN1cC5naXRodWIuY29tL2dwbC1saWNlbnNlLXYyLnR4dAogKi8KLypnbG9iYWwgQWN0aXZlWE9iamVjdCBhbGVydCAqLwo7KGZ1bmN0aW9uKCQpIHsKInVzZSBzdHJpY3QiOwoKLyoKICAgIFVzYWdlIE5vdGU6CiAgICAtLS0tLS0tLS0tLQogICAgRG8gbm90IHVzZSBib3RoIGFqYXhTdWJtaXQgYW5kIGFqYXhGb3JtIG9uIHRoZSBzYW1lIGZvcm0uICBUaGVzZQogICAgZnVuY3Rpb25zIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuICBVc2UgYWpheFN1Ym1pdCBpZiB5b3Ugd2FudAogICAgdG8gYmluZCB5b3VyIG93biBzdWJtaXQgaGFuZGxlciB0byB0aGUgZm9ybS4gIEZvciBleGFtcGxlLAoKICAgICQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkgewogICAgICAgICQoJyNteUZvcm0nKS5vbignc3VibWl0JywgZnVuY3Rpb24oZSkgewogICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7IC8vIDwtLSBpbXBvcnRhbnQKICAgICAgICAgICAgJCh0aGlzKS5hamF4U3VibWl0KHsKICAgICAgICAgICAgICAgIHRhcmdldDogJyNvdXRwdXQnCiAgICAgICAgICAgIH0pOwogICAgICAgIH0pOwogICAgfSk7CgogICAgVXNlIGFqYXhGb3JtIHdoZW4geW91IHdhbnQgdGhlIHBsdWdpbiB0byBtYW5hZ2UgYWxsIHRoZSBldmVudCBiaW5kaW5nCiAgICBmb3IgeW91LiAgRm9yIGV4YW1wbGUsCgogICAgJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKSB7CiAgICAgICAgJCgnI215Rm9ybScpLmFqYXhGb3JtKHsKICAgICAgICAgICAgdGFyZ2V0OiAnI291dHB1dCcKICAgICAgICB9KTsKICAgIH0pOwogICAgCiAgICBZb3UgY2FuIGFsc28gdXNlIGFqYXhGb3JtIHdpdGggZGVsZWdhdGlvbiAocmVxdWlyZXMgalF1ZXJ5IHYxLjcrKSwgc28gdGhlCiAgICBmb3JtIGRvZXMgbm90IGhhdmUgdG8gZXhpc3Qgd2hlbiB5b3UgaW52b2tlIGFqYXhGb3JtOgoKICAgICQoJyNteUZvcm0nKS5hamF4Rm9ybSh7CiAgICAgICAgZGVsZWdhdGlvbjogdHJ1ZSwKICAgICAgICB0YXJnZXQ6ICcjb3V0cHV0JwogICAgfSk7CiAgICAKICAgIFdoZW4gdXNpbmcgYWpheEZvcm0sIHRoZSBhamF4U3VibWl0IGZ1bmN0aW9uIHdpbGwgYmUgaW52b2tlZCBmb3IgeW91CiAgICBhdCB0aGUgYXBwcm9wcmlhdGUgdGltZS4KKi8KCi8qKgogKiBGZWF0dXJlIGRldGVjdGlvbgogKi8KdmFyIGZlYXR1cmUgPSB7fTsKZmVhdHVyZS5maWxlYXBpID0gJCgiPGlucHV0IHR5cGU9J2ZpbGUnLz4iKS5nZXQoMCkuZmlsZXMgIT09IHVuZGVmaW5lZDsKZmVhdHVyZS5mb3JtZGF0YSA9IHdpbmRvdy5Gb3JtRGF0YSAhPT0gdW5kZWZpbmVkOwoKLyoqCiAqIGFqYXhTdWJtaXQoKSBwcm92aWRlcyBhIG1lY2hhbmlzbSBmb3IgaW1tZWRpYXRlbHkgc3VibWl0dGluZwogKiBhbiBIVE1MIGZvcm0gdXNpbmcgQUpBWC4KICovCiQuZm4uYWpheFN1Ym1pdCA9IGZ1bmN0aW9uKG9wdGlvbnMpIHsKICAgIC8qanNoaW50IHNjcmlwdHVybDp0cnVlICovCgogICAgLy8gZmFzdCBmYWlsIGlmIG5vdGhpbmcgc2VsZWN0ZWQgKGh0dHA6Ly9kZXYuanF1ZXJ5LmNvbS90aWNrZXQvMjc1MikKICAgIGlmICghdGhpcy5sZW5ndGgpIHsKICAgICAgICBsb2coJ2FqYXhTdWJtaXQ6IHNraXBwaW5nIHN1Ym1pdCBwcm9jZXNzIC0gbm8gZWxlbWVudCBzZWxlY3RlZCcpOwogICAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgCiAgICB2YXIgbWV0aG9kLCBhY3Rpb24sIHVybCwgJGZvcm0gPSB0aGlzOwoKICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgb3B0aW9ucyA9IHsgc3VjY2Vzczogb3B0aW9ucyB9OwogICAgfQoKICAgIG1ldGhvZCA9IHRoaXMuYXR0cignbWV0aG9kJyk7CiAgICBhY3Rpb24gPSB0aGlzLmF0dHIoJ2FjdGlvbicpOwogICAgdXJsID0gKHR5cGVvZiBhY3Rpb24gPT09ICdzdHJpbmcnKSA/ICQudHJpbShhY3Rpb24pIDogJyc7CiAgICB1cmwgPSB1cmwgfHwgd2luZG93LmxvY2F0aW9uLmhyZWYgfHwgJyc7CiAgICBpZiAodXJsKSB7CiAgICAgICAgLy8gY2xlYW4gdXJsIChkb24ndCBpbmNsdWRlIGhhc2ggdmF1ZSkKICAgICAgICB1cmwgPSAodXJsLm1hdGNoKC9eKFteI10rKS8pfHxbXSlbMV07CiAgICB9CgogICAgb3B0aW9ucyA9ICQuZXh0ZW5kKHRydWUsIHsKICAgICAgICB1cmw6ICB1cmwsCiAgICAgICAgc3VjY2VzczogJC5hamF4U2V0dGluZ3Muc3VjY2VzcywKICAgICAgICB0eXBlOiBtZXRob2QgfHwgJ0dFVCcsCiAgICAgICAgaWZyYW1lU3JjOiAvXmh0dHBzL2kudGVzdCh3aW5kb3cubG9jYXRpb24uaHJlZiB8fCAnJykgPyAnamF2YXNjcmlwdDpmYWxzZScgOiAnYWJvdXQ6YmxhbmsnCiAgICB9LCBvcHRpb25zKTsKCiAgICAvLyBob29rIGZvciBtYW5pcHVsYXRpbmcgdGhlIGZvcm0gZGF0YSBiZWZvcmUgaXQgaXMgZXh0cmFjdGVkOwogICAgLy8gY29udmVuaWVudCBmb3IgdXNlIHdpdGggcmljaCBlZGl0b3JzIGxpa2UgdGlueU1DRSBvciBGQ0tFZGl0b3IKICAgIHZhciB2ZXRvID0ge307CiAgICB0aGlzLnRyaWdnZXIoJ2Zvcm0tcHJlLXNlcmlhbGl6ZScsIFt0aGlzLCBvcHRpb25zLCB2ZXRvXSk7CiAgICBpZiAodmV0by52ZXRvKSB7CiAgICAgICAgbG9nKCdhamF4U3VibWl0OiBzdWJtaXQgdmV0b2VkIHZpYSBmb3JtLXByZS1zZXJpYWxpemUgdHJpZ2dlcicpOwogICAgICAgIHJldHVybiB0aGlzOwogICAgfQoKICAgIC8vIHByb3ZpZGUgb3Bwb3J0dW5pdHkgdG8gYWx0ZXIgZm9ybSBkYXRhIGJlZm9yZSBpdCBpcyBzZXJpYWxpemVkCiAgICBpZiAob3B0aW9ucy5iZWZvcmVTZXJpYWxpemUgJiYgb3B0aW9ucy5iZWZvcmVTZXJpYWxpemUodGhpcywgb3B0aW9ucykgPT09IGZhbHNlKSB7CiAgICAgICAgbG9nKCdhamF4U3VibWl0OiBzdWJtaXQgYWJvcnRlZCB2aWEgYmVmb3JlU2VyaWFsaXplIGNhbGxiYWNrJyk7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CgogICAgdmFyIHRyYWRpdGlvbmFsID0gb3B0aW9ucy50cmFkaXRpb25hbDsKICAgIGlmICggdHJhZGl0aW9uYWwgPT09IHVuZGVmaW5lZCApIHsKICAgICAgICB0cmFkaXRpb25hbCA9ICQuYWpheFNldHRpbmdzLnRyYWRpdGlvbmFsOwogICAgfQogICAgCiAgICB2YXIgZWxlbWVudHMgPSBbXTsKICAgIHZhciBxeCwgYSA9IHRoaXMuZm9ybVRvQXJyYXkob3B0aW9ucy5zZW1hbnRpYywgZWxlbWVudHMpOwogICAgaWYgKG9wdGlvbnMuZGF0YSkgewogICAgICAgIG9wdGlvbnMuZXh0cmFEYXRhID0gb3B0aW9ucy5kYXRhOwogICAgICAgIHF4ID0gJC5wYXJhbShvcHRpb25zLmRhdGEsIHRyYWRpdGlvbmFsKTsKICAgIH0KCiAgICAvLyBnaXZlIHByZS1zdWJtaXQgY2FsbGJhY2sgYW4gb3Bwb3J0dW5pdHkgdG8gYWJvcnQgdGhlIHN1Ym1pdAogICAgaWYgKG9wdGlvbnMuYmVmb3JlU3VibWl0ICYmIG9wdGlvbnMuYmVmb3JlU3VibWl0KGEsIHRoaXMsIG9wdGlvbnMpID09PSBmYWxzZSkgewogICAgICAgIGxvZygnYWpheFN1Ym1pdDogc3VibWl0IGFib3J0ZWQgdmlhIGJlZm9yZVN1Ym1pdCBjYWxsYmFjaycpOwogICAgICAgIHJldHVybiB0aGlzOwogICAgfQoKICAgIC8vIGZpcmUgdmV0b2FibGUgJ3ZhbGlkYXRlJyBldmVudAogICAgdGhpcy50cmlnZ2VyKCdmb3JtLXN1Ym1pdC12YWxpZGF0ZScsIFthLCB0aGlzLCBvcHRpb25zLCB2ZXRvXSk7CiAgICBpZiAodmV0by52ZXRvKSB7CiAgICAgICAgbG9nKCdhamF4U3VibWl0OiBzdWJtaXQgdmV0b2VkIHZpYSBmb3JtLXN1Ym1pdC12YWxpZGF0ZSB0cmlnZ2VyJyk7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CgogICAgdmFyIHEgPSAkLnBhcmFtKGEsIHRyYWRpdGlvbmFsKTsKICAgIGlmIChxeCkgewogICAgICAgIHEgPSAoIHEgPyAocSArICcmJyArIHF4KSA6IHF4ICk7CiAgICB9ICAgIAogICAgaWYgKG9wdGlvbnMudHlwZS50b1VwcGVyQ2FzZSgpID09ICdHRVQnKSB7CiAgICAgICAgb3B0aW9ucy51cmwgKz0gKG9wdGlvbnMudXJsLmluZGV4T2YoJz8nKSA+PSAwID8gJyYnIDogJz8nKSArIHE7CiAgICAgICAgb3B0aW9ucy5kYXRhID0gbnVsbDsgIC8vIGRhdGEgaXMgbnVsbCBmb3IgJ2dldCcKICAgIH0KICAgIGVsc2UgewogICAgICAgIG9wdGlvbnMuZGF0YSA9IHE7IC8vIGRhdGEgaXMgdGhlIHF1ZXJ5IHN0cmluZyBmb3IgJ3Bvc3QnCiAgICB9CgogICAgdmFyIGNhbGxiYWNrcyA9IFtdOwogICAgaWYgKG9wdGlvbnMucmVzZXRGb3JtKSB7CiAgICAgICAgY2FsbGJhY2tzLnB1c2goZnVuY3Rpb24oKSB7ICRmb3JtLnJlc2V0Rm9ybSgpOyB9KTsKICAgIH0KICAgIGlmIChvcHRpb25zLmNsZWFyRm9ybSkgewogICAgICAgIGNhbGxiYWNrcy5wdXNoKGZ1bmN0aW9uKCkgeyAkZm9ybS5jbGVhckZvcm0ob3B0aW9ucy5pbmNsdWRlSGlkZGVuKTsgfSk7CiAgICB9CgogICAgLy8gcGVyZm9ybSBhIGxvYWQgb24gdGhlIHRhcmdldCBvbmx5IGlmIGRhdGFUeXBlIGlzIG5vdCBwcm92aWRlZAogICAgaWYgKCFvcHRpb25zLmRhdGFUeXBlICYmIG9wdGlvbnMudGFyZ2V0KSB7CiAgICAgICAgdmFyIG9sZFN1Y2Nlc3MgPSBvcHRpb25zLnN1Y2Nlc3MgfHwgZnVuY3Rpb24oKXt9OwogICAgICAgIGNhbGxiYWNrcy5wdXNoKGZ1bmN0aW9uKGRhdGEpIHsKICAgICAgICAgICAgdmFyIGZuID0gb3B0aW9ucy5yZXBsYWNlVGFyZ2V0ID8gJ3JlcGxhY2VXaXRoJyA6ICdodG1sJzsKICAgICAgICAgICAgJChvcHRpb25zLnRhcmdldClbZm5dKGRhdGEpLmVhY2gob2xkU3VjY2VzcywgYXJndW1lbnRzKTsKICAgICAgICB9KTsKICAgIH0KICAgIGVsc2UgaWYgKG9wdGlvbnMuc3VjY2VzcykgewogICAgICAgIGNhbGxiYWNrcy5wdXNoKG9wdGlvbnMuc3VjY2Vzcyk7CiAgICB9CgogICAgb3B0aW9ucy5zdWNjZXNzID0gZnVuY3Rpb24oZGF0YSwgc3RhdHVzLCB4aHIpIHsgLy8galF1ZXJ5IDEuNCsgcGFzc2VzIHhociBhcyAzcmQgYXJnCiAgICAgICAgdmFyIGNvbnRleHQgPSBvcHRpb25zLmNvbnRleHQgfHwgdGhpcyA7ICAgIC8vIGpRdWVyeSAxLjQrIHN1cHBvcnRzIHNjb3BlIGNvbnRleHQgCiAgICAgICAgZm9yICh2YXIgaT0wLCBtYXg9Y2FsbGJhY2tzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CiAgICAgICAgICAgIGNhbGxiYWNrc1tpXS5hcHBseShjb250ZXh0LCBbZGF0YSwgc3RhdHVzLCB4aHIgfHwgJGZvcm0sICRmb3JtXSk7CiAgICAgICAgfQogICAgfTsKCiAgICAvLyBhcmUgdGhlcmUgZmlsZXMgdG8gdXBsb2FkPwoKICAgIC8vIFt2YWx1ZV0gKGlzc3VlICMxMTMpLCBhbHNvIHNlZSBjb21tZW50OgogICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL21hbHN1cC9mb3JtL2NvbW1pdC81ODgzMDZhZWRiYTFkZTAxMzg4MDMyZDVmNDJhNjAxNTllZWE5MjI4I2NvbW1pdGNvbW1lbnQtMjE4MDIxOQogICAgdmFyIGZpbGVJbnB1dHMgPSAkKCdpbnB1dFt0eXBlPWZpbGVdOmVuYWJsZWRbdmFsdWUhPSIiXScsIHRoaXMpOyAKCiAgICB2YXIgaGFzRmlsZUlucHV0cyA9IGZpbGVJbnB1dHMubGVuZ3RoID4gMDsKICAgIHZhciBtcCA9ICdtdWx0aXBhcnQvZm9ybS1kYXRhJzsKICAgIHZhciBtdWx0aXBhcnQgPSAoJGZvcm0uYXR0cignZW5jdHlwZScpID09IG1wIHx8ICRmb3JtLmF0dHIoJ2VuY29kaW5nJykgPT0gbXApOwoKICAgIHZhciBmaWxlQVBJID0gZmVhdHVyZS5maWxlYXBpICYmIGZlYXR1cmUuZm9ybWRhdGE7CiAgICBsb2coImZpbGVBUEkgOiIgKyBmaWxlQVBJKTsKICAgIHZhciBzaG91bGRVc2VGcmFtZSA9IChoYXNGaWxlSW5wdXRzIHx8IG11bHRpcGFydCkgJiYgIWZpbGVBUEk7CgogICAgdmFyIGpxeGhyOwoKICAgIC8vIG9wdGlvbnMuaWZyYW1lIGFsbG93cyB1c2VyIHRvIGZvcmNlIGlmcmFtZSBtb2RlCiAgICAvLyAwNi1OT1YtMDk6IG5vdyBkZWZhdWx0aW5nIHRvIGlmcmFtZSBtb2RlIGlmIGZpbGUgaW5wdXQgaXMgZGV0ZWN0ZWQKICAgIGlmIChvcHRpb25zLmlmcmFtZSAhPT0gZmFsc2UgJiYgKG9wdGlvbnMuaWZyYW1lIHx8IHNob3VsZFVzZUZyYW1lKSkgewogICAgICAgIC8vIGhhY2sgdG8gZml4IFNhZmFyaSBoYW5nICh0aGFua3MgdG8gVGltIE1vbGVuZGlqayBmb3IgdGhpcykKICAgICAgICAvLyBzZWU6ICBodHRwOi8vZ3JvdXBzLmdvb2dsZS5jb20vZ3JvdXAvanF1ZXJ5LWRldi9icm93c2VfdGhyZWFkL3RocmVhZC8zNjM5NWI3YWI1MTBkZDVkCiAgICAgICAgaWYgKG9wdGlvbnMuY2xvc2VLZWVwQWxpdmUpIHsKICAgICAgICAgICAgJC5nZXQob3B0aW9ucy5jbG9zZUtlZXBBbGl2ZSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBqcXhociA9IGZpbGVVcGxvYWRJZnJhbWUoYSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAganF4aHIgPSBmaWxlVXBsb2FkSWZyYW1lKGEpOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYgKChoYXNGaWxlSW5wdXRzIHx8IG11bHRpcGFydCkgJiYgZmlsZUFQSSkgewogICAgICAgIGpxeGhyID0gZmlsZVVwbG9hZFhocihhKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIGpxeGhyID0gJC5hamF4KG9wdGlvbnMpOwogICAgfQoKICAgICRmb3JtLnJlbW92ZURhdGEoJ2pxeGhyJykuZGF0YSgnanF4aHInLCBqcXhocik7CgogICAgLy8gY2xlYXIgZWxlbWVudCBhcnJheQogICAgZm9yICh2YXIgaz0wOyBrIDwgZWxlbWVudHMubGVuZ3RoOyBrKyspCiAgICAgICAgZWxlbWVudHNba10gPSBudWxsOwoKICAgIC8vIGZpcmUgJ25vdGlmeScgZXZlbnQKICAgIHRoaXMudHJpZ2dlcignZm9ybS1zdWJtaXQtbm90aWZ5JywgW3RoaXMsIG9wdGlvbnNdKTsKICAgIHJldHVybiB0aGlzOwoKICAgIC8vIHV0aWxpdHkgZm4gZm9yIGRlZXAgc2VyaWFsaXphdGlvbgogICAgZnVuY3Rpb24gZGVlcFNlcmlhbGl6ZShleHRyYURhdGEpewogICAgICAgIHZhciBzZXJpYWxpemVkID0gJC5wYXJhbShleHRyYURhdGEpLnNwbGl0KCcmJyk7CiAgICAgICAgdmFyIGxlbiA9IHNlcmlhbGl6ZWQubGVuZ3RoOwogICAgICAgIHZhciByZXN1bHQgPSB7fTsKICAgICAgICB2YXIgaSwgcGFydDsKICAgICAgICBmb3IgKGk9MDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgIC8vICMyNTI7IHVuZG8gcGFyYW0gc3BhY2UgcmVwbGFjZW1lbnQKICAgICAgICAgICAgc2VyaWFsaXplZFtpXSA9IHNlcmlhbGl6ZWRbaV0ucmVwbGFjZSgvXCsvZywnICcpOwogICAgICAgICAgICBwYXJ0ID0gc2VyaWFsaXplZFtpXS5zcGxpdCgnPScpOwogICAgICAgICAgICByZXN1bHRbZGVjb2RlVVJJQ29tcG9uZW50KHBhcnRbMF0pXSA9IGRlY29kZVVSSUNvbXBvbmVudChwYXJ0WzFdKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KCiAgICAgLy8gWE1MSHR0cFJlcXVlc3QgTGV2ZWwgMiBmaWxlIHVwbG9hZHMgKGJpZyBoYXQgdGlwIHRvIGZyYW5jb2lzMm1ldHopCiAgICBmdW5jdGlvbiBmaWxlVXBsb2FkWGhyKGEpIHsKICAgICAgICB2YXIgZm9ybWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKCiAgICAgICAgZm9yICh2YXIgaT0wOyBpIDwgYS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBmb3JtZGF0YS5hcHBlbmQoYVtpXS5uYW1lLCBhW2ldLnZhbHVlKTsKICAgICAgICB9CgogICAgICAgIGlmIChvcHRpb25zLmV4dHJhRGF0YSkgewogICAgICAgICAgICB2YXIgc2VyaWFsaXplZERhdGEgPSBkZWVwU2VyaWFsaXplKG9wdGlvbnMuZXh0cmFEYXRhKTsKICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzZXJpYWxpemVkRGF0YSkKICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVkRGF0YS5oYXNPd25Qcm9wZXJ0eShwKSkKICAgICAgICAgICAgICAgICAgICBmb3JtZGF0YS5hcHBlbmQocCwgc2VyaWFsaXplZERhdGFbcF0pOwogICAgICAgIH0KCiAgICAgICAgb3B0aW9ucy5kYXRhID0gbnVsbDsKCiAgICAgICAgdmFyIHMgPSAkLmV4dGVuZCh0cnVlLCB7fSwgJC5hamF4U2V0dGluZ3MsIG9wdGlvbnMsIHsKICAgICAgICAgICAgY29udGVudFR5cGU6IGZhbHNlLAogICAgICAgICAgICBwcm9jZXNzRGF0YTogZmFsc2UsCiAgICAgICAgICAgIGNhY2hlOiBmYWxzZSwKICAgICAgICAgICAgdHlwZTogbWV0aG9kIHx8ICdQT1NUJwogICAgICAgIH0pOwogICAgICAgIAogICAgICAgIGlmIChvcHRpb25zLnVwbG9hZFByb2dyZXNzKSB7CiAgICAgICAgICAgIC8vIHdvcmthcm91bmQgYmVjYXVzZSBqcVhIUiBkb2VzIG5vdCBleHBvc2UgdXBsb2FkIHByb3BlcnR5CiAgICAgICAgICAgIHMueGhyID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICB2YXIgeGhyID0galF1ZXJ5LmFqYXhTZXR0aW5ncy54aHIoKTsKICAgICAgICAgICAgICAgIGlmICh4aHIudXBsb2FkKSB7CiAgICAgICAgICAgICAgICAgICAgeGhyLnVwbG9hZC5vbnByb2dyZXNzID0gZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBlcmNlbnQgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcG9zaXRpb24gPSBldmVudC5sb2FkZWQgfHwgZXZlbnQucG9zaXRpb247IC8qZXZlbnQucG9zaXRpb24gaXMgZGVwcmVjYXRlZCovCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b3RhbCA9IGV2ZW50LnRvdGFsOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQubGVuZ3RoQ29tcHV0YWJsZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyY2VudCA9IE1hdGguY2VpbChwb3NpdGlvbiAvIHRvdGFsICogMTAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnVwbG9hZFByb2dyZXNzKGV2ZW50LCBwb3NpdGlvbiwgdG90YWwsIHBlcmNlbnQpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4geGhyOwogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgcy5kYXRhID0gbnVsbDsKICAgICAgICAgICAgdmFyIGJlZm9yZVNlbmQgPSBzLmJlZm9yZVNlbmQ7CiAgICAgICAgICAgIHMuYmVmb3JlU2VuZCA9IGZ1bmN0aW9uKHhociwgbykgewogICAgICAgICAgICAgICAgby5kYXRhID0gZm9ybWRhdGE7CiAgICAgICAgICAgICAgICBpZihiZWZvcmVTZW5kKQogICAgICAgICAgICAgICAgICAgIGJlZm9yZVNlbmQuY2FsbCh0aGlzLCB4aHIsIG8pOwogICAgICAgIH07CiAgICAgICAgcmV0dXJuICQuYWpheChzKTsKICAgIH0KCiAgICAvLyBwcml2YXRlIGZ1bmN0aW9uIGZvciBoYW5kbGluZyBmaWxlIHVwbG9hZHMgKGhhdCB0aXAgdG8gWUFIT08hKQogICAgZnVuY3Rpb24gZmlsZVVwbG9hZElmcmFtZShhKSB7CiAgICAgICAgdmFyIGZvcm0gPSAkZm9ybVswXSwgZWwsIGksIHMsIGcsIGlkLCAkaW8sIGlvLCB4aHIsIHN1YiwgbiwgdGltZWRPdXQsIHRpbWVvdXRIYW5kbGU7CiAgICAgICAgdmFyIHVzZVByb3AgPSAhISQuZm4ucHJvcDsKICAgICAgICB2YXIgZGVmZXJyZWQgPSAkLkRlZmVycmVkKCk7CgogICAgICAgIGlmICgkKCdbbmFtZT1zdWJtaXRdLFtpZD1zdWJtaXRdJywgZm9ybSkubGVuZ3RoKSB7CiAgICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIGFuIGlucHV0IHdpdGggYSBuYW1lIG9yIGlkIG9mICdzdWJtaXQnIHRoZW4gd2Ugd29uJ3QgYmUKICAgICAgICAgICAgLy8gYWJsZSB0byBpbnZva2UgdGhlIHN1Ym1pdCBmbiBvbiB0aGUgZm9ybSAoYXQgbGVhc3Qgbm90IHgtYnJvd3NlcikKICAgICAgICAgICAgYWxlcnQoJ0Vycm9yOiBGb3JtIGVsZW1lbnRzIG11c3Qgbm90IGhhdmUgbmFtZSBvciBpZCBvZiAic3VibWl0Ii4nKTsKICAgICAgICAgICAgZGVmZXJyZWQucmVqZWN0KCk7CiAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZDsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYgKGEpIHsKICAgICAgICAgICAgLy8gZW5zdXJlIHRoYXQgZXZlcnkgc2VyaWFsaXplZCBpbnB1dCBpcyBzdGlsbCBlbmFibGVkCiAgICAgICAgICAgIGZvciAoaT0wOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGVsID0gJChlbGVtZW50c1tpXSk7CiAgICAgICAgICAgICAgICBpZiAoIHVzZVByb3AgKQogICAgICAgICAgICAgICAgICAgIGVsLnByb3AoJ2Rpc2FibGVkJywgZmFsc2UpOwogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIGVsLnJlbW92ZUF0dHIoJ2Rpc2FibGVkJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHMgPSAkLmV4dGVuZCh0cnVlLCB7fSwgJC5hamF4U2V0dGluZ3MsIG9wdGlvbnMpOwogICAgICAgIHMuY29udGV4dCA9IHMuY29udGV4dCB8fCBzOwogICAgICAgIGlkID0gJ2pxRm9ybUlPJyArIChuZXcgRGF0ZSgpLmdldFRpbWUoKSk7CiAgICAgICAgaWYgKHMuaWZyYW1lVGFyZ2V0KSB7CiAgICAgICAgICAgICRpbyA9ICQocy5pZnJhbWVUYXJnZXQpOwogICAgICAgICAgICBuID0gJGlvLmF0dHIoJ25hbWUnKTsKICAgICAgICAgICAgaWYgKCFuKQogICAgICAgICAgICAgICAgICRpby5hdHRyKCduYW1lJywgaWQpOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBpZCA9IG47CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkaW8gPSAkKCc8aWZyYW1lIG5hbWU9IicgKyBpZCArICciIHNyYz0iJysgcy5pZnJhbWVTcmMgKyciIC8+Jyk7CiAgICAgICAgICAgICRpby5jc3MoeyBwb3NpdGlvbjogJ2Fic29sdXRlJywgdG9wOiAnLTEwMDBweCcsIGxlZnQ6ICctMTAwMHB4JyB9KTsKICAgICAgICB9CiAgICAgICAgaW8gPSAkaW9bMF07CgoKICAgICAgICB4aHIgPSB7IC8vIG1vY2sgb2JqZWN0CiAgICAgICAgICAgIGFib3J0ZWQ6IDAsCiAgICAgICAgICAgIHJlc3BvbnNlVGV4dDogbnVsbCwKICAgICAgICAgICAgcmVzcG9uc2VYTUw6IG51bGwsCiAgICAgICAgICAgIHN0YXR1czogMCwKICAgICAgICAgICAgc3RhdHVzVGV4dDogJ24vYScsCiAgICAgICAgICAgIGdldEFsbFJlc3BvbnNlSGVhZGVyczogZnVuY3Rpb24oKSB7fSwKICAgICAgICAgICAgZ2V0UmVzcG9uc2VIZWFkZXI6IGZ1bmN0aW9uKCkge30sCiAgICAgICAgICAgIHNldFJlcXVlc3RIZWFkZXI6IGZ1bmN0aW9uKCkge30sCiAgICAgICAgICAgIGFib3J0OiBmdW5jdGlvbihzdGF0dXMpIHsKICAgICAgICAgICAgICAgIHZhciBlID0gKHN0YXR1cyA9PT0gJ3RpbWVvdXQnID8gJ3RpbWVvdXQnIDogJ2Fib3J0ZWQnKTsKICAgICAgICAgICAgICAgIGxvZygnYWJvcnRpbmcgdXBsb2FkLi4uICcgKyBlKTsKICAgICAgICAgICAgICAgIHRoaXMuYWJvcnRlZCA9IDE7CgogICAgICAgICAgICAgICAgdHJ5IHsgLy8gIzIxNCwgIzI1NwogICAgICAgICAgICAgICAgICAgIGlmIChpby5jb250ZW50V2luZG93LmRvY3VtZW50LmV4ZWNDb21tYW5kKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlvLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ1N0b3AnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICAgY2F0Y2goaWdub3JlKSB7fQoKICAgICAgICAgICAgICAgICRpby5hdHRyKCdzcmMnLCBzLmlmcmFtZVNyYyk7IC8vIGFib3J0IG9wIGluIHByb2dyZXNzCiAgICAgICAgICAgICAgICB4aHIuZXJyb3IgPSBlOwogICAgICAgICAgICAgICAgaWYgKHMuZXJyb3IpCiAgICAgICAgICAgICAgICAgICAgcy5lcnJvci5jYWxsKHMuY29udGV4dCwgeGhyLCBlLCBzdGF0dXMpOwogICAgICAgICAgICAgICAgaWYgKGcpCiAgICAgICAgICAgICAgICAgICAgJC5ldmVudC50cmlnZ2VyKCJhamF4RXJyb3IiLCBbeGhyLCBzLCBlXSk7CiAgICAgICAgICAgICAgICBpZiAocy5jb21wbGV0ZSkKICAgICAgICAgICAgICAgICAgICBzLmNvbXBsZXRlLmNhbGwocy5jb250ZXh0LCB4aHIsIGUpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgZyA9IHMuZ2xvYmFsOwogICAgICAgIC8vIHRyaWdnZXIgYWpheCBnbG9iYWwgZXZlbnRzIHNvIHRoYXQgYWN0aXZpdHkvYmxvY2sgaW5kaWNhdG9ycyB3b3JrIGxpa2Ugbm9ybWFsCiAgICAgICAgaWYgKGcgJiYgMCA9PT0gJC5hY3RpdmUrKykgewogICAgICAgICAgICAkLmV2ZW50LnRyaWdnZXIoImFqYXhTdGFydCIpOwogICAgICAgIH0KICAgICAgICBpZiAoZykgewogICAgICAgICAgICAkLmV2ZW50LnRyaWdnZXIoImFqYXhTZW5kIiwgW3hociwgc10pOwogICAgICAgIH0KCiAgICAgICAgaWYgKHMuYmVmb3JlU2VuZCAmJiBzLmJlZm9yZVNlbmQuY2FsbChzLmNvbnRleHQsIHhociwgcykgPT09IGZhbHNlKSB7CiAgICAgICAgICAgIGlmIChzLmdsb2JhbCkgewogICAgICAgICAgICAgICAgJC5hY3RpdmUtLTsKICAgICAgICAgICAgfQogICAgICAgICAgICBkZWZlcnJlZC5yZWplY3QoKTsKICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkOwogICAgICAgIH0KICAgICAgICBpZiAoeGhyLmFib3J0ZWQpIHsKICAgICAgICAgICAgZGVmZXJyZWQucmVqZWN0KCk7CiAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZDsKICAgICAgICB9CgogICAgICAgIC8vIGFkZCBzdWJtaXR0aW5nIGVsZW1lbnQgdG8gZGF0YSBpZiB3ZSBrbm93IGl0CiAgICAgICAgc3ViID0gZm9ybS5jbGs7CiAgICAgICAgaWYgKHN1YikgewogICAgICAgICAgICBuID0gc3ViLm5hbWU7CiAgICAgICAgICAgIGlmIChuICYmICFzdWIuZGlzYWJsZWQpIHsKICAgICAgICAgICAgICAgIHMuZXh0cmFEYXRhID0gcy5leHRyYURhdGEgfHwge307CiAgICAgICAgICAgICAgICBzLmV4dHJhRGF0YVtuXSA9IHN1Yi52YWx1ZTsKICAgICAgICAgICAgICAgIGlmIChzdWIudHlwZSA9PSAiaW1hZ2UiKSB7CiAgICAgICAgICAgICAgICAgICAgcy5leHRyYURhdGFbbisnLngnXSA9IGZvcm0uY2xrX3g7CiAgICAgICAgICAgICAgICAgICAgcy5leHRyYURhdGFbbisnLnknXSA9IGZvcm0uY2xrX3k7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgdmFyIENMSUVOVF9USU1FT1VUX0FCT1JUID0gMTsKICAgICAgICB2YXIgU0VSVkVSX0FCT1JUID0gMjsKCiAgICAgICAgZnVuY3Rpb24gZ2V0RG9jKGZyYW1lKSB7CiAgICAgICAgICAgIHZhciBkb2MgPSBmcmFtZS5jb250ZW50V2luZG93ID8gZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudCA6IGZyYW1lLmNvbnRlbnREb2N1bWVudCA/IGZyYW1lLmNvbnRlbnREb2N1bWVudCA6IGZyYW1lLmRvY3VtZW50OwogICAgICAgICAgICByZXR1cm4gZG9jOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAvLyBSYWlscyBDU1JGIGhhY2sgKHRoYW5rcyB0byBZdmFuIEJhcnRoZWxlbXkpCiAgICAgICAgdmFyIGNzcmZfdG9rZW4gPSAkKCdtZXRhW25hbWU9Y3NyZi10b2tlbl0nKS5hdHRyKCdjb250ZW50Jyk7CiAgICAgICAgdmFyIGNzcmZfcGFyYW0gPSAkKCdtZXRhW25hbWU9Y3NyZi1wYXJhbV0nKS5hdHRyKCdjb250ZW50Jyk7CiAgICAgICAgaWYgKGNzcmZfcGFyYW0gJiYgY3NyZl90b2tlbikgewogICAgICAgICAgICBzLmV4dHJhRGF0YSA9IHMuZXh0cmFEYXRhIHx8IHt9OwogICAgICAgICAgICBzLmV4dHJhRGF0YVtjc3JmX3BhcmFtXSA9IGNzcmZfdG9rZW47CiAgICAgICAgfQoKICAgICAgICAvLyB0YWtlIGEgYnJlYXRoIHNvIHRoYXQgcGVuZGluZyByZXBhaW50cyBnZXQgc29tZSBjcHUgdGltZSBiZWZvcmUgdGhlIHVwbG9hZCBzdGFydHMKICAgICAgICBmdW5jdGlvbiBkb1N1Ym1pdCgpIHsKICAgICAgICAgICAgLy8gbWFrZSBzdXJlIGZvcm0gYXR0cnMgYXJlIHNldAogICAgICAgICAgICB2YXIgdCA9ICRmb3JtLmF0dHIoJ3RhcmdldCcpLCBhID0gJGZvcm0uYXR0cignYWN0aW9uJyk7CgogICAgICAgICAgICAvLyB1cGRhdGUgZm9ybSBhdHRycyBpbiBJRSBmcmllbmRseSB3YXkKICAgICAgICAgICAgZm9ybS5zZXRBdHRyaWJ1dGUoJ3RhcmdldCcsaWQpOwogICAgICAgICAgICBpZiAoIW1ldGhvZCkgewogICAgICAgICAgICAgICAgZm9ybS5zZXRBdHRyaWJ1dGUoJ21ldGhvZCcsICdQT1NUJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGEgIT0gcy51cmwpIHsKICAgICAgICAgICAgICAgIGZvcm0uc2V0QXR0cmlidXRlKCdhY3Rpb24nLCBzLnVybCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGllIGJvcmtzIGluIHNvbWUgY2FzZXMgd2hlbiBzZXR0aW5nIGVuY29kaW5nCiAgICAgICAgICAgIGlmICghIHMuc2tpcEVuY29kaW5nT3ZlcnJpZGUgJiYgKCFtZXRob2QgfHwgL3Bvc3QvaS50ZXN0KG1ldGhvZCkpKSB7CiAgICAgICAgICAgICAgICAkZm9ybS5hdHRyKHsKICAgICAgICAgICAgICAgICAgICBlbmNvZGluZzogJ211bHRpcGFydC9mb3JtLWRhdGEnLAogICAgICAgICAgICAgICAgICAgIGVuY3R5cGU6ICAnbXVsdGlwYXJ0L2Zvcm0tZGF0YScKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzdXBwb3J0IHRpbW91dAogICAgICAgICAgICBpZiAocy50aW1lb3V0KSB7CiAgICAgICAgICAgICAgICB0aW1lb3V0SGFuZGxlID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsgdGltZWRPdXQgPSB0cnVlOyBjYihDTElFTlRfVElNRU9VVF9BQk9SVCk7IH0sIHMudGltZW91dCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIGxvb2sgZm9yIHNlcnZlciBhYm9ydHMKICAgICAgICAgICAgZnVuY3Rpb24gY2hlY2tTdGF0ZSgpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHN0YXRlID0gZ2V0RG9jKGlvKS5yZWFkeVN0YXRlOwogICAgICAgICAgICAgICAgICAgIGxvZygnc3RhdGUgPSAnICsgc3RhdGUpOwogICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZSAmJiBzdGF0ZS50b0xvd2VyQ2FzZSgpID09ICd1bmluaXRpYWxpemVkJykKICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChjaGVja1N0YXRlLDUwKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoKGUpIHsKICAgICAgICAgICAgICAgICAgICBsb2coJ1NlcnZlciBhYm9ydDogJyAsIGUsICcgKCcsIGUubmFtZSwgJyknKTsKICAgICAgICAgICAgICAgICAgICBjYihTRVJWRVJfQUJPUlQpOwogICAgICAgICAgICAgICAgICAgIGlmICh0aW1lb3V0SGFuZGxlKQogICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dEhhbmRsZSk7CiAgICAgICAgICAgICAgICAgICAgdGltZW91dEhhbmRsZSA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYWRkICJleHRyYSIgZGF0YSB0byBmb3JtIGlmIHByb3ZpZGVkIGluIG9wdGlvbnMKICAgICAgICAgICAgdmFyIGV4dHJhSW5wdXRzID0gW107CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBpZiAocy5leHRyYURhdGEpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuIGluIHMuZXh0cmFEYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLmV4dHJhRGF0YS5oYXNPd25Qcm9wZXJ0eShuKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB1c2luZyB0aGUgJC5wYXJhbSBmb3JtYXQgdGhhdCBhbGxvd3MgZm9yIG11bHRpcGxlIHZhbHVlcyB3aXRoIHRoZSBzYW1lIG5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoJC5pc1BsYWluT2JqZWN0KHMuZXh0cmFEYXRhW25dKSAmJiBzLmV4dHJhRGF0YVtuXS5oYXNPd25Qcm9wZXJ0eSgnbmFtZScpICYmIHMuZXh0cmFEYXRhW25dLmhhc093blByb3BlcnR5KCd2YWx1ZScpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYUlucHV0cy5wdXNoKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iJytzLmV4dHJhRGF0YVtuXS5uYW1lKyciPicpLmF0dHIoJ3ZhbHVlJyxzLmV4dHJhRGF0YVtuXS52YWx1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kVG8oZm9ybSlbMF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFJbnB1dHMucHVzaCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJzxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IicrbisnIj4nKS5hdHRyKCd2YWx1ZScscy5leHRyYURhdGFbbl0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZFRvKGZvcm0pWzBdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghcy5pZnJhbWVUYXJnZXQpIHsKICAgICAgICAgICAgICAgICAgICAvLyBhZGQgaWZyYW1lIHRvIGRvYyBhbmQgc3VibWl0IHRoZSBmb3JtCiAgICAgICAgICAgICAgICAgICAgJGlvLmFwcGVuZFRvKCdib2R5Jyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGlvLmF0dGFjaEV2ZW50KQogICAgICAgICAgICAgICAgICAgICAgICBpby5hdHRhY2hFdmVudCgnb25sb2FkJywgY2IpOwogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgaW8uYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIGNiLCBmYWxzZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGNoZWNrU3RhdGUsMTUpOwogICAgICAgICAgICAgICAgZm9ybS5zdWJtaXQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgICAgIC8vIHJlc2V0IGF0dHJzIGFuZCByZW1vdmUgImV4dHJhIiBpbnB1dCBlbGVtZW50cwogICAgICAgICAgICAgICAgZm9ybS5zZXRBdHRyaWJ1dGUoJ2FjdGlvbicsYSk7CiAgICAgICAgICAgICAgICBpZih0KSB7CiAgICAgICAgICAgICAgICAgICAgZm9ybS5zZXRBdHRyaWJ1dGUoJ3RhcmdldCcsIHQpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkZm9ybS5yZW1vdmVBdHRyKCd0YXJnZXQnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICQoZXh0cmFJbnB1dHMpLnJlbW92ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAocy5mb3JjZVN5bmMpIHsKICAgICAgICAgICAgZG9TdWJtaXQoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHNldFRpbWVvdXQoZG9TdWJtaXQsIDEwKTsgLy8gdGhpcyBsZXRzIGRvbSB1cGRhdGVzIHJlbmRlcgogICAgICAgIH0KCiAgICAgICAgdmFyIGRhdGEsIGRvYywgZG9tQ2hlY2tDb3VudCA9IDUwLCBjYWxsYmFja1Byb2Nlc3NlZDsKCiAgICAgICAgZnVuY3Rpb24gY2IoZSkgewogICAgICAgICAgICBpZiAoeGhyLmFib3J0ZWQgfHwgY2FsbGJhY2tQcm9jZXNzZWQpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgZG9jID0gZ2V0RG9jKGlvKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaChleCkgewogICAgICAgICAgICAgICAgbG9nKCdjYW5ub3QgYWNjZXNzIHJlc3BvbnNlIGRvY3VtZW50OiAnLCBleCk7CiAgICAgICAgICAgICAgICBlID0gU0VSVkVSX0FCT1JUOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChlID09PSBDTElFTlRfVElNRU9VVF9BQk9SVCAmJiB4aHIpIHsKICAgICAgICAgICAgICAgIHhoci5hYm9ydCgndGltZW91dCcpOwogICAgICAgICAgICAgICAgZGVmZXJyZWQucmVqZWN0KHhociwgJ3RpbWVvdXQnKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChlID09IFNFUlZFUl9BQk9SVCAmJiB4aHIpIHsKICAgICAgICAgICAgICAgIHhoci5hYm9ydCgnc2VydmVyIGFib3J0Jyk7CiAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZWplY3QoeGhyLCAnZXJyb3InLCAnc2VydmVyIGFib3J0Jyk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghZG9jIHx8IGRvYy5sb2NhdGlvbi5ocmVmID09IHMuaWZyYW1lU3JjKSB7CiAgICAgICAgICAgICAgICAvLyByZXNwb25zZSBub3QgcmVjZWl2ZWQgeWV0CiAgICAgICAgICAgICAgICBpZiAoIXRpbWVkT3V0KQogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoaW8uZGV0YWNoRXZlbnQpCiAgICAgICAgICAgICAgICBpby5kZXRhY2hFdmVudCgnb25sb2FkJywgY2IpOwogICAgICAgICAgICBlbHNlICAgIAogICAgICAgICAgICAgICAgaW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignbG9hZCcsIGNiLCBmYWxzZSk7CgogICAgICAgICAgICB2YXIgc3RhdHVzID0gJ3N1Y2Nlc3MnLCBlcnJNc2c7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBpZiAodGltZWRPdXQpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyAndGltZW91dCc7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIGlzWG1sID0gcy5kYXRhVHlwZSA9PSAneG1sJyB8fCBkb2MuWE1MRG9jdW1lbnQgfHwgJC5pc1hNTERvYyhkb2MpOwogICAgICAgICAgICAgICAgbG9nKCdpc1htbD0nK2lzWG1sKTsKICAgICAgICAgICAgICAgIGlmICghaXNYbWwgJiYgd2luZG93Lm9wZXJhICYmIChkb2MuYm9keSA9PT0gbnVsbCB8fCAhZG9jLmJvZHkuaW5uZXJIVE1MKSkgewogICAgICAgICAgICAgICAgICAgIGlmICgtLWRvbUNoZWNrQ291bnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gc29tZSBicm93c2VycyAoT3BlcmEpIHRoZSBpZnJhbWUgRE9NIGlzIG5vdCBhbHdheXMgdHJhdmVyc2FibGUgd2hlbgogICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgb25sb2FkIGNhbGxiYWNrIGZpcmVzLCBzbyB3ZSBsb29wIGEgYml0IHRvIGFjY29tbW9kYXRlCiAgICAgICAgICAgICAgICAgICAgICAgIGxvZygncmVxdWVpbmcgb25Mb2FkIGNhbGxiYWNrLCBET00gbm90IGF2YWlsYWJsZScpOwogICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGNiLCAyNTApOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vIGxldCB0aGlzIGZhbGwgdGhyb3VnaCBiZWNhdXNlIHNlcnZlciByZXNwb25zZSBjb3VsZCBiZSBhbiBlbXB0eSBkb2N1bWVudAogICAgICAgICAgICAgICAgICAgIC8vbG9nKCdDb3VsZCBub3QgYWNjZXNzIGlmcmFtZSBET00gYWZ0ZXIgbXV0aXBsZSB0cmllcy4nKTsKICAgICAgICAgICAgICAgICAgICAvL3Rocm93ICdET01FeGNlcHRpb246IG5vdCBhdmFpbGFibGUnOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vbG9nKCdyZXNwb25zZSBkZXRlY3RlZCcpOwogICAgICAgICAgICAgICAgdmFyIGRvY1Jvb3QgPSBkb2MuYm9keSA/IGRvYy5ib2R5IDogZG9jLmRvY3VtZW50RWxlbWVudDsKICAgICAgICAgICAgICAgIHhoci5yZXNwb25zZVRleHQgPSBkb2NSb290ID8gZG9jUm9vdC5pbm5lckhUTUwgOiBudWxsOwogICAgICAgICAgICAgICAgeGhyLnJlc3BvbnNlWE1MID0gZG9jLlhNTERvY3VtZW50ID8gZG9jLlhNTERvY3VtZW50IDogZG9jOwogICAgICAgICAgICAgICAgaWYgKGlzWG1sKQogICAgICAgICAgICAgICAgICAgIHMuZGF0YVR5cGUgPSAneG1sJzsKICAgICAgICAgICAgICAgIHhoci5nZXRSZXNwb25zZUhlYWRlciA9IGZ1bmN0aW9uKGhlYWRlcil7CiAgICAgICAgICAgICAgICAgICAgdmFyIGhlYWRlcnMgPSB7J2NvbnRlbnQtdHlwZSc6IHMuZGF0YVR5cGV9OwogICAgICAgICAgICAgICAgICAgIHJldHVybiBoZWFkZXJzW2hlYWRlcl07CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgLy8gc3VwcG9ydCBmb3IgWEhSICdzdGF0dXMnICYgJ3N0YXR1c1RleHQnIGVtdWxhdGlvbiA6CiAgICAgICAgICAgICAgICBpZiAoZG9jUm9vdCkgewogICAgICAgICAgICAgICAgICAgIHhoci5zdGF0dXMgPSBOdW1iZXIoIGRvY1Jvb3QuZ2V0QXR0cmlidXRlKCdzdGF0dXMnKSApIHx8IHhoci5zdGF0dXM7CiAgICAgICAgICAgICAgICAgICAgeGhyLnN0YXR1c1RleHQgPSBkb2NSb290LmdldEF0dHJpYnV0ZSgnc3RhdHVzVGV4dCcpIHx8IHhoci5zdGF0dXNUZXh0OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciBkdCA9IChzLmRhdGFUeXBlIHx8ICcnKS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICAgICAgdmFyIHNjciA9IC8oanNvbnxzY3JpcHR8dGV4dCkvLnRlc3QoZHQpOwogICAgICAgICAgICAgICAgaWYgKHNjciB8fCBzLnRleHRhcmVhKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gc2VlIGlmIHVzZXIgZW1iZWRkZWQgcmVzcG9uc2UgaW4gdGV4dGFyZWEKICAgICAgICAgICAgICAgICAgICB2YXIgdGEgPSBkb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3RleHRhcmVhJylbMF07CiAgICAgICAgICAgICAgICAgICAgaWYgKHRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHhoci5yZXNwb25zZVRleHQgPSB0YS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VwcG9ydCBmb3IgWEhSICdzdGF0dXMnICYgJ3N0YXR1c1RleHQnIGVtdWxhdGlvbiA6CiAgICAgICAgICAgICAgICAgICAgICAgIHhoci5zdGF0dXMgPSBOdW1iZXIoIHRhLmdldEF0dHJpYnV0ZSgnc3RhdHVzJykgKSB8fCB4aHIuc3RhdHVzOwogICAgICAgICAgICAgICAgICAgICAgICB4aHIuc3RhdHVzVGV4dCA9IHRhLmdldEF0dHJpYnV0ZSgnc3RhdHVzVGV4dCcpIHx8IHhoci5zdGF0dXNUZXh0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzY3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWNjb3VudCBmb3IgYnJvd3NlcnMgaW5qZWN0aW5nIHByZSBhcm91bmQganNvbiByZXNwb25zZQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJlID0gZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdwcmUnKVswXTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBkb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2JvZHknKVswXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgeGhyLnJlc3BvbnNlVGV4dCA9IHByZS50ZXh0Q29udGVudCA/IHByZS50ZXh0Q29udGVudCA6IHByZS5pbm5lclRleHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgeGhyLnJlc3BvbnNlVGV4dCA9IGIudGV4dENvbnRlbnQgPyBiLnRleHRDb250ZW50IDogYi5pbm5lclRleHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChkdCA9PSAneG1sJyAmJiAheGhyLnJlc3BvbnNlWE1MICYmIHhoci5yZXNwb25zZVRleHQpIHsKICAgICAgICAgICAgICAgICAgICB4aHIucmVzcG9uc2VYTUwgPSB0b1htbCh4aHIucmVzcG9uc2VUZXh0KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGRhdGEgPSBodHRwRGF0YSh4aHIsIGR0LCBzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gJ3BhcnNlcmVycm9yJzsKICAgICAgICAgICAgICAgICAgICB4aHIuZXJyb3IgPSBlcnJNc2cgPSAoZSB8fCBzdGF0dXMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICBsb2coJ2Vycm9yIGNhdWdodDogJyxlKTsKICAgICAgICAgICAgICAgIHN0YXR1cyA9ICdlcnJvcic7CiAgICAgICAgICAgICAgICB4aHIuZXJyb3IgPSBlcnJNc2cgPSAoZSB8fCBzdGF0dXMpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoeGhyLmFib3J0ZWQpIHsKICAgICAgICAgICAgICAgIGxvZygndXBsb2FkIGFib3J0ZWQnKTsKICAgICAgICAgICAgICAgIHN0YXR1cyA9IG51bGw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh4aHIuc3RhdHVzKSB7IC8vIHdlJ3ZlIHNldCB4aHIuc3RhdHVzCiAgICAgICAgICAgICAgICBzdGF0dXMgPSAoeGhyLnN0YXR1cyA+PSAyMDAgJiYgeGhyLnN0YXR1cyA8IDMwMCB8fCB4aHIuc3RhdHVzID09PSAzMDQpID8gJ3N1Y2Nlc3MnIDogJ2Vycm9yJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gb3JkZXJpbmcgb2YgdGhlc2UgY2FsbGJhY2tzL3RyaWdnZXJzIGlzIG9kZCwgYnV0IHRoYXQncyBob3cgJC5hamF4IGRvZXMgaXQKICAgICAgICAgICAgaWYgKHN0YXR1cyA9PT0gJ3N1Y2Nlc3MnKSB7CiAgICAgICAgICAgICAgICBpZiAocy5zdWNjZXNzKQogICAgICAgICAgICAgICAgICAgIHMuc3VjY2Vzcy5jYWxsKHMuY29udGV4dCwgZGF0YSwgJ3N1Y2Nlc3MnLCB4aHIpOwogICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZSh4aHIucmVzcG9uc2VUZXh0LCAnc3VjY2VzcycsIHhocik7CiAgICAgICAgICAgICAgICBpZiAoZykKICAgICAgICAgICAgICAgICAgICAkLmV2ZW50LnRyaWdnZXIoImFqYXhTdWNjZXNzIiwgW3hociwgc10pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHN0YXR1cykgewogICAgICAgICAgICAgICAgaWYgKGVyck1zZyA9PT0gdW5kZWZpbmVkKQogICAgICAgICAgICAgICAgICAgIGVyck1zZyA9IHhoci5zdGF0dXNUZXh0OwogICAgICAgICAgICAgICAgaWYgKHMuZXJyb3IpCiAgICAgICAgICAgICAgICAgICAgcy5lcnJvci5jYWxsKHMuY29udGV4dCwgeGhyLCBzdGF0dXMsIGVyck1zZyk7CiAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZWplY3QoeGhyLCAnZXJyb3InLCBlcnJNc2cpOwogICAgICAgICAgICAgICAgaWYgKGcpCiAgICAgICAgICAgICAgICAgICAgJC5ldmVudC50cmlnZ2VyKCJhamF4RXJyb3IiLCBbeGhyLCBzLCBlcnJNc2ddKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGcpCiAgICAgICAgICAgICAgICAkLmV2ZW50LnRyaWdnZXIoImFqYXhDb21wbGV0ZSIsIFt4aHIsIHNdKTsKCiAgICAgICAgICAgIGlmIChnICYmICEgLS0kLmFjdGl2ZSkgewogICAgICAgICAgICAgICAgJC5ldmVudC50cmlnZ2VyKCJhamF4U3RvcCIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAocy5jb21wbGV0ZSkKICAgICAgICAgICAgICAgIHMuY29tcGxldGUuY2FsbChzLmNvbnRleHQsIHhociwgc3RhdHVzKTsKCiAgICAgICAgICAgIGNhbGxiYWNrUHJvY2Vzc2VkID0gdHJ1ZTsKICAgICAgICAgICAgaWYgKHMudGltZW91dCkKICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SGFuZGxlKTsKCiAgICAgICAgICAgIC8vIGNsZWFuIHVwCiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBpZiAoIXMuaWZyYW1lVGFyZ2V0KQogICAgICAgICAgICAgICAgICAgICRpby5yZW1vdmUoKTsKICAgICAgICAgICAgICAgIHhoci5yZXNwb25zZVhNTCA9IG51bGw7CiAgICAgICAgICAgIH0sIDEwMCk7CiAgICAgICAgfQoKICAgICAgICB2YXIgdG9YbWwgPSAkLnBhcnNlWE1MIHx8IGZ1bmN0aW9uKHMsIGRvYykgeyAvLyB1c2UgcGFyc2VYTUwgaWYgYXZhaWxhYmxlIChqUXVlcnkgMS41KykKICAgICAgICAgICAgaWYgKHdpbmRvdy5BY3RpdmVYT2JqZWN0KSB7CiAgICAgICAgICAgICAgICBkb2MgPSBuZXcgQWN0aXZlWE9iamVjdCgnTWljcm9zb2Z0LlhNTERPTScpOwogICAgICAgICAgICAgICAgZG9jLmFzeW5jID0gJ2ZhbHNlJzsKICAgICAgICAgICAgICAgIGRvYy5sb2FkWE1MKHMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgZG9jID0gKG5ldyBET01QYXJzZXIoKSkucGFyc2VGcm9tU3RyaW5nKHMsICd0ZXh0L3htbCcpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAoZG9jICYmIGRvYy5kb2N1bWVudEVsZW1lbnQgJiYgZG9jLmRvY3VtZW50RWxlbWVudC5ub2RlTmFtZSAhPSAncGFyc2VyZXJyb3InKSA/IGRvYyA6IG51bGw7CiAgICAgICAgfTsKICAgICAgICB2YXIgcGFyc2VKU09OID0gJC5wYXJzZUpTT04gfHwgZnVuY3Rpb24ocykgewogICAgICAgICAgICAvKmpzbGludCBldmlsOnRydWUgKi8KICAgICAgICAgICAgcmV0dXJuIHdpbmRvd1snZXZhbCddKCcoJyArIHMgKyAnKScpOwogICAgICAgIH07CgogICAgICAgIHZhciBodHRwRGF0YSA9IGZ1bmN0aW9uKCB4aHIsIHR5cGUsIHMgKSB7IC8vIG1vc3RseSBsaWZ0ZWQgZnJvbSBqcTEuNC40CgogICAgICAgICAgICB2YXIgY3QgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ2NvbnRlbnQtdHlwZScpIHx8ICcnLAogICAgICAgICAgICAgICAgeG1sID0gdHlwZSA9PT0gJ3htbCcgfHwgIXR5cGUgJiYgY3QuaW5kZXhPZigneG1sJykgPj0gMCwKICAgICAgICAgICAgICAgIGRhdGEgPSB4bWwgPyB4aHIucmVzcG9uc2VYTUwgOiB4aHIucmVzcG9uc2VUZXh0OwoKICAgICAgICAgICAgaWYgKHhtbCAmJiBkYXRhLmRvY3VtZW50RWxlbWVudC5ub2RlTmFtZSA9PT0gJ3BhcnNlcmVycm9yJykgewogICAgICAgICAgICAgICAgaWYgKCQuZXJyb3IpCiAgICAgICAgICAgICAgICAgICAgJC5lcnJvcigncGFyc2VyZXJyb3InKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocyAmJiBzLmRhdGFGaWx0ZXIpIHsKICAgICAgICAgICAgICAgIGRhdGEgPSBzLmRhdGFGaWx0ZXIoZGF0YSwgdHlwZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdqc29uJyB8fCAhdHlwZSAmJiBjdC5pbmRleE9mKCdqc29uJykgPj0gMCkgewogICAgICAgICAgICAgICAgICAgIGRhdGEgPSBwYXJzZUpTT04oZGF0YSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICJzY3JpcHQiIHx8ICF0eXBlICYmIGN0LmluZGV4T2YoImphdmFzY3JpcHQiKSA+PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgJC5nbG9iYWxFdmFsKGRhdGEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBkYXRhOwogICAgICAgIH07CgogICAgICAgIHJldHVybiBkZWZlcnJlZDsKICAgIH0KfTsKCi8qKgogKiBhamF4Rm9ybSgpIHByb3ZpZGVzIGEgbWVjaGFuaXNtIGZvciBmdWxseSBhdXRvbWF0aW5nIGZvcm0gc3VibWlzc2lvbi4KICoKICogVGhlIGFkdmFudGFnZXMgb2YgdXNpbmcgdGhpcyBtZXRob2QgaW5zdGVhZCBvZiBhamF4U3VibWl0KCkgYXJlOgogKgogKiAxOiBUaGlzIG1ldGhvZCB3aWxsIGluY2x1ZGUgY29vcmRpbmF0ZXMgZm9yIDxpbnB1dCB0eXBlPSJpbWFnZSIgLz4gZWxlbWVudHMgKGlmIHRoZSBlbGVtZW50CiAqICAgIGlzIHVzZWQgdG8gc3VibWl0IHRoZSBmb3JtKS4KICogMi4gVGhpcyBtZXRob2Qgd2lsbCBpbmNsdWRlIHRoZSBzdWJtaXQgZWxlbWVudCdzIG5hbWUvdmFsdWUgZGF0YSAoZm9yIHRoZSBlbGVtZW50IHRoYXQgd2FzCiAqICAgIHVzZWQgdG8gc3VibWl0IHRoZSBmb3JtKS4KICogMy4gVGhpcyBtZXRob2QgYmluZHMgdGhlIHN1Ym1pdCgpIG1ldGhvZCB0byB0aGUgZm9ybSBmb3IgeW91LgogKgogKiBUaGUgb3B0aW9ucyBhcmd1bWVudCBmb3IgYWpheEZvcm0gd29ya3MgZXhhY3RseSBhcyBpdCBkb2VzIGZvciBhamF4U3VibWl0LiAgYWpheEZvcm0gbWVyZWx5CiAqIHBhc3NlcyB0aGUgb3B0aW9ucyBhcmd1bWVudCBhbG9uZyBhZnRlciBwcm9wZXJseSBiaW5kaW5nIGV2ZW50cyBmb3Igc3VibWl0IGVsZW1lbnRzIGFuZAogKiB0aGUgZm9ybSBpdHNlbGYuCiAqLwokLmZuLmFqYXhGb3JtID0gZnVuY3Rpb24ob3B0aW9ucykgewogICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CiAgICBvcHRpb25zLmRlbGVnYXRpb24gPSBvcHRpb25zLmRlbGVnYXRpb24gJiYgJC5pc0Z1bmN0aW9uKCQuZm4ub24pOwogICAgCiAgICAvLyBpbiBqUXVlcnkgMS4zKyB3ZSBjYW4gZml4IG1pc3Rha2VzIHdpdGggdGhlIHJlYWR5IHN0YXRlCiAgICBpZiAoIW9wdGlvbnMuZGVsZWdhdGlvbiAmJiB0aGlzLmxlbmd0aCA9PT0gMCkgewogICAgICAgIHZhciBvID0geyBzOiB0aGlzLnNlbGVjdG9yLCBjOiB0aGlzLmNvbnRleHQgfTsKICAgICAgICBpZiAoISQuaXNSZWFkeSAmJiBvLnMpIHsKICAgICAgICAgICAgbG9nKCdET00gbm90IHJlYWR5LCBxdWV1aW5nIGFqYXhGb3JtJyk7CiAgICAgICAgICAgICQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAkKG8ucyxvLmMpLmFqYXhGb3JtKG9wdGlvbnMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfQogICAgICAgIC8vIGlzIHlvdXIgRE9NIHJlYWR5PyAgaHR0cDovL2RvY3MuanF1ZXJ5LmNvbS9UdXRvcmlhbHM6SW50cm9kdWNpbmdfJChkb2N1bWVudCkucmVhZHkoKQogICAgICAgIGxvZygndGVybWluYXRpbmc7IHplcm8gZWxlbWVudHMgZm91bmQgYnkgc2VsZWN0b3InICsgKCQuaXNSZWFkeSA/ICcnIDogJyAoRE9NIG5vdCByZWFkeSknKSk7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CgogICAgaWYgKCBvcHRpb25zLmRlbGVnYXRpb24gKSB7CiAgICAgICAgJChkb2N1bWVudCkKICAgICAgICAgICAgLm9mZignc3VibWl0LmZvcm0tcGx1Z2luJywgdGhpcy5zZWxlY3RvciwgZG9BamF4U3VibWl0KQogICAgICAgICAgICAub2ZmKCdjbGljay5mb3JtLXBsdWdpbicsIHRoaXMuc2VsZWN0b3IsIGNhcHR1cmVTdWJtaXR0aW5nRWxlbWVudCkKICAgICAgICAgICAgLm9uKCdzdWJtaXQuZm9ybS1wbHVnaW4nLCB0aGlzLnNlbGVjdG9yLCBvcHRpb25zLCBkb0FqYXhTdWJtaXQpCiAgICAgICAgICAgIC5vbignY2xpY2suZm9ybS1wbHVnaW4nLCB0aGlzLnNlbGVjdG9yLCBvcHRpb25zLCBjYXB0dXJlU3VibWl0dGluZ0VsZW1lbnQpOwogICAgICAgIHJldHVybiB0aGlzOwogICAgfQoKICAgIHJldHVybiB0aGlzLmFqYXhGb3JtVW5iaW5kKCkKICAgICAgICAuYmluZCgnc3VibWl0LmZvcm0tcGx1Z2luJywgb3B0aW9ucywgZG9BamF4U3VibWl0KQogICAgICAgIC5iaW5kKCdjbGljay5mb3JtLXBsdWdpbicsIG9wdGlvbnMsIGNhcHR1cmVTdWJtaXR0aW5nRWxlbWVudCk7Cn07CgovLyBwcml2YXRlIGV2ZW50IGhhbmRsZXJzICAgIApmdW5jdGlvbiBkb0FqYXhTdWJtaXQoZSkgewogICAgLypqc2hpbnQgdmFsaWR0aGlzOnRydWUgKi8KICAgIHZhciBvcHRpb25zID0gZS5kYXRhOwogICAgaWYgKCFlLmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7IC8vIGlmIGV2ZW50IGhhcyBiZWVuIGNhbmNlbGVkLCBkb24ndCBwcm9jZWVkCiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICQodGhpcykuYWpheFN1Ym1pdChvcHRpb25zKTsKICAgIH0KfQogICAgCmZ1bmN0aW9uIGNhcHR1cmVTdWJtaXR0aW5nRWxlbWVudChlKSB7CiAgICAvKmpzaGludCB2YWxpZHRoaXM6dHJ1ZSAqLwogICAgdmFyIHRhcmdldCA9IGUudGFyZ2V0OwogICAgdmFyICRlbCA9ICQodGFyZ2V0KTsKICAgIGlmICghKCRlbC5pcygiW3R5cGU9c3VibWl0XSxbdHlwZT1pbWFnZV0iKSkpIHsKICAgICAgICAvLyBpcyB0aGlzIGEgY2hpbGQgZWxlbWVudCBvZiB0aGUgc3VibWl0IGVsPyAgKGV4OiBhIHNwYW4gd2l0aGluIGEgYnV0dG9uKQogICAgICAgIHZhciB0ID0gJGVsLmNsb3Nlc3QoJ1t0eXBlPXN1Ym1pdF0nKTsKICAgICAgICBpZiAodC5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB0YXJnZXQgPSB0WzBdOwogICAgfQogICAgdmFyIGZvcm0gPSB0aGlzOwogICAgZm9ybS5jbGsgPSB0YXJnZXQ7CiAgICBpZiAodGFyZ2V0LnR5cGUgPT0gJ2ltYWdlJykgewogICAgICAgIGlmIChlLm9mZnNldFggIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICBmb3JtLmNsa194ID0gZS5vZmZzZXRYOwogICAgICAgICAgICBmb3JtLmNsa195ID0gZS5vZmZzZXRZOwogICAgICAgIH0gZWxzZSBpZiAodHlwZW9mICQuZm4ub2Zmc2V0ID09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgdmFyIG9mZnNldCA9ICRlbC5vZmZzZXQoKTsKICAgICAgICAgICAgZm9ybS5jbGtfeCA9IGUucGFnZVggLSBvZmZzZXQubGVmdDsKICAgICAgICAgICAgZm9ybS5jbGtfeSA9IGUucGFnZVkgLSBvZmZzZXQudG9wOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGZvcm0uY2xrX3ggPSBlLnBhZ2VYIC0gdGFyZ2V0Lm9mZnNldExlZnQ7CiAgICAgICAgICAgIGZvcm0uY2xrX3kgPSBlLnBhZ2VZIC0gdGFyZ2V0Lm9mZnNldFRvcDsKICAgICAgICB9CiAgICB9CiAgICAvLyBjbGVhciBmb3JtIHZhcnMKICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IGZvcm0uY2xrID0gZm9ybS5jbGtfeCA9IGZvcm0uY2xrX3kgPSBudWxsOyB9LCAxMDApOwp9CgoKLy8gYWpheEZvcm1VbmJpbmQgdW5iaW5kcyB0aGUgZXZlbnQgaGFuZGxlcnMgdGhhdCB3ZXJlIGJvdW5kIGJ5IGFqYXhGb3JtCiQuZm4uYWpheEZvcm1VbmJpbmQgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLnVuYmluZCgnc3VibWl0LmZvcm0tcGx1Z2luIGNsaWNrLmZvcm0tcGx1Z2luJyk7Cn07CgovKioKICogZm9ybVRvQXJyYXkoKSBnYXRoZXJzIGZvcm0gZWxlbWVudCBkYXRhIGludG8gYW4gYXJyYXkgb2Ygb2JqZWN0cyB0aGF0IGNhbgogKiBiZSBwYXNzZWQgdG8gYW55IG9mIHRoZSBmb2xsb3dpbmcgYWpheCBmdW5jdGlvbnM6ICQuZ2V0LCAkLnBvc3QsIG9yIGxvYWQuCiAqIEVhY2ggb2JqZWN0IGluIHRoZSBhcnJheSBoYXMgYm90aCBhICduYW1lJyBhbmQgJ3ZhbHVlJyBwcm9wZXJ0eS4gIEFuIGV4YW1wbGUgb2YKICogYW4gYXJyYXkgZm9yIGEgc2ltcGxlIGxvZ2luIGZvcm0gbWlnaHQgYmU6CiAqCiAqIFsgeyBuYW1lOiAndXNlcm5hbWUnLCB2YWx1ZTogJ2pyZXNpZycgfSwgeyBuYW1lOiAncGFzc3dvcmQnLCB2YWx1ZTogJ3NlY3JldCcgfSBdCiAqCiAqIEl0IGlzIHRoaXMgYXJyYXkgdGhhdCBpcyBwYXNzZWQgdG8gcHJlLXN1Ym1pdCBjYWxsYmFjayBmdW5jdGlvbnMgcHJvdmlkZWQgdG8gdGhlCiAqIGFqYXhTdWJtaXQoKSBhbmQgYWpheEZvcm0oKSBtZXRob2RzLgogKi8KJC5mbi5mb3JtVG9BcnJheSA9IGZ1bmN0aW9uKHNlbWFudGljLCBlbGVtZW50cykgewogICAgdmFyIGEgPSBbXTsKICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMCkgewogICAgICAgIHJldHVybiBhOwogICAgfQoKICAgIHZhciBmb3JtID0gdGhpc1swXTsKICAgIHZhciBlbHMgPSBzZW1hbnRpYyA/IGZvcm0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoJyonKSA6IGZvcm0uZWxlbWVudHM7CiAgICBpZiAoIWVscykgewogICAgICAgIHJldHVybiBhOwogICAgfQoKICAgIHZhciBpLGosbix2LGVsLG1heCxqbWF4OwogICAgZm9yKGk9MCwgbWF4PWVscy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgewogICAgICAgIGVsID0gZWxzW2ldOwogICAgICAgIG4gPSBlbC5uYW1lOwogICAgICAgIGlmICghbikgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CgogICAgICAgIGlmIChzZW1hbnRpYyAmJiBmb3JtLmNsayAmJiBlbC50eXBlID09ICJpbWFnZSIpIHsKICAgICAgICAgICAgLy8gaGFuZGxlIGltYWdlIGlucHV0cyBvbiB0aGUgZmx5IHdoZW4gc2VtYW50aWMgPT0gdHJ1ZQogICAgICAgICAgICBpZighZWwuZGlzYWJsZWQgJiYgZm9ybS5jbGsgPT0gZWwpIHsKICAgICAgICAgICAgICAgIGEucHVzaCh7bmFtZTogbiwgdmFsdWU6ICQoZWwpLnZhbCgpLCB0eXBlOiBlbC50eXBlIH0pOwogICAgICAgICAgICAgICAgYS5wdXNoKHtuYW1lOiBuKycueCcsIHZhbHVlOiBmb3JtLmNsa194fSwge25hbWU6IG4rJy55JywgdmFsdWU6IGZvcm0uY2xrX3l9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CgogICAgICAgIHYgPSAkLmZpZWxkVmFsdWUoZWwsIHRydWUpOwogICAgICAgIGlmICh2ICYmIHYuY29uc3RydWN0b3IgPT0gQXJyYXkpIHsKICAgICAgICAgICAgaWYgKGVsZW1lbnRzKSAKICAgICAgICAgICAgICAgIGVsZW1lbnRzLnB1c2goZWwpOwogICAgICAgICAgICBmb3Ioaj0wLCBqbWF4PXYubGVuZ3RoOyBqIDwgam1heDsgaisrKSB7CiAgICAgICAgICAgICAgICBhLnB1c2goe25hbWU6IG4sIHZhbHVlOiB2W2pdfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZmVhdHVyZS5maWxlYXBpICYmIGVsLnR5cGUgPT0gJ2ZpbGUnICYmICFlbC5kaXNhYmxlZCkgewogICAgICAgICAgICBpZiAoZWxlbWVudHMpIAogICAgICAgICAgICAgICAgZWxlbWVudHMucHVzaChlbCk7CiAgICAgICAgICAgIHZhciBmaWxlcyA9IGVsLmZpbGVzOwogICAgICAgICAgICBpZiAoZmlsZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICBmb3IgKGo9MDsgaiA8IGZpbGVzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgYS5wdXNoKHtuYW1lOiBuLCB2YWx1ZTogZmlsZXNbal0sIHR5cGU6IGVsLnR5cGV9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8vICMxODAKICAgICAgICAgICAgICAgIGEucHVzaCh7IG5hbWU6IG4sIHZhbHVlOiAnJywgdHlwZTogZWwudHlwZSB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIGlmICh2ICE9PSBudWxsICYmIHR5cGVvZiB2ICE9ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgIGlmIChlbGVtZW50cykgCiAgICAgICAgICAgICAgICBlbGVtZW50cy5wdXNoKGVsKTsKICAgICAgICAgICAgYS5wdXNoKHtuYW1lOiBuLCB2YWx1ZTogdiwgdHlwZTogZWwudHlwZSwgcmVxdWlyZWQ6IGVsLnJlcXVpcmVkfSk7CiAgICAgICAgfQogICAgfQoKICAgIGlmICghc2VtYW50aWMgJiYgZm9ybS5jbGspIHsKICAgICAgICAvLyBpbnB1dCB0eXBlPT0naW1hZ2UnIGFyZSBub3QgZm91bmQgaW4gZWxlbWVudHMgYXJyYXkhIGhhbmRsZSBpdCBoZXJlCiAgICAgICAgdmFyICRpbnB1dCA9ICQoZm9ybS5jbGspLCBpbnB1dCA9ICRpbnB1dFswXTsKICAgICAgICBuID0gaW5wdXQubmFtZTsKICAgICAgICBpZiAobiAmJiAhaW5wdXQuZGlzYWJsZWQgJiYgaW5wdXQudHlwZSA9PSAnaW1hZ2UnKSB7CiAgICAgICAgICAgIGEucHVzaCh7bmFtZTogbiwgdmFsdWU6ICRpbnB1dC52YWwoKX0pOwogICAgICAgICAgICBhLnB1c2goe25hbWU6IG4rJy54JywgdmFsdWU6IGZvcm0uY2xrX3h9LCB7bmFtZTogbisnLnknLCB2YWx1ZTogZm9ybS5jbGtfeX0pOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBhOwp9OwoKLyoqCiAqIFNlcmlhbGl6ZXMgZm9ybSBkYXRhIGludG8gYSAnc3VibWl0dGFibGUnIHN0cmluZy4gVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gYSBzdHJpbmcKICogaW4gdGhlIGZvcm1hdDogbmFtZTE9dmFsdWUxJmFtcDtuYW1lMj12YWx1ZTIKICovCiQuZm4uZm9ybVNlcmlhbGl6ZSA9IGZ1bmN0aW9uKHNlbWFudGljKSB7CiAgICAvL2hhbmQgb2ZmIHRvIGpRdWVyeS5wYXJhbSBmb3IgcHJvcGVyIGVuY29kaW5nCiAgICByZXR1cm4gJC5wYXJhbSh0aGlzLmZvcm1Ub0FycmF5KHNlbWFudGljKSk7Cn07CgovKioKICogU2VyaWFsaXplcyBhbGwgZmllbGQgZWxlbWVudHMgaW4gdGhlIGpRdWVyeSBvYmplY3QgaW50byBhIHF1ZXJ5IHN0cmluZy4KICogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gYSBzdHJpbmcgaW4gdGhlIGZvcm1hdDogbmFtZTE9dmFsdWUxJmFtcDtuYW1lMj12YWx1ZTIKICovCiQuZm4uZmllbGRTZXJpYWxpemUgPSBmdW5jdGlvbihzdWNjZXNzZnVsKSB7CiAgICB2YXIgYSA9IFtdOwogICAgdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBuID0gdGhpcy5uYW1lOwogICAgICAgIGlmICghbikgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHZhciB2ID0gJC5maWVsZFZhbHVlKHRoaXMsIHN1Y2Nlc3NmdWwpOwogICAgICAgIGlmICh2ICYmIHYuY29uc3RydWN0b3IgPT0gQXJyYXkpIHsKICAgICAgICAgICAgZm9yICh2YXIgaT0wLG1heD12Lmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CiAgICAgICAgICAgICAgICBhLnB1c2goe25hbWU6IG4sIHZhbHVlOiB2W2ldfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAodiAhPT0gbnVsbCAmJiB0eXBlb2YgdiAhPSAndW5kZWZpbmVkJykgewogICAgICAgICAgICBhLnB1c2goe25hbWU6IHRoaXMubmFtZSwgdmFsdWU6IHZ9KTsKICAgICAgICB9CiAgICB9KTsKICAgIC8vaGFuZCBvZmYgdG8galF1ZXJ5LnBhcmFtIGZvciBwcm9wZXIgZW5jb2RpbmcKICAgIHJldHVybiAkLnBhcmFtKGEpOwp9OwoKLyoqCiAqIFJldHVybnMgdGhlIHZhbHVlKHMpIG9mIHRoZSBlbGVtZW50IGluIHRoZSBtYXRjaGVkIHNldC4gIEZvciBleGFtcGxlLCBjb25zaWRlciB0aGUgZm9sbG93aW5nIGZvcm06CiAqCiAqICA8Zm9ybT48ZmllbGRzZXQ+CiAqICAgICAgPGlucHV0IG5hbWU9IkEiIHR5cGU9InRleHQiIC8+CiAqICAgICAgPGlucHV0IG5hbWU9IkEiIHR5cGU9InRleHQiIC8+CiAqICAgICAgPGlucHV0IG5hbWU9IkIiIHR5cGU9ImNoZWNrYm94IiB2YWx1ZT0iQjEiIC8+CiAqICAgICAgPGlucHV0IG5hbWU9IkIiIHR5cGU9ImNoZWNrYm94IiB2YWx1ZT0iQjIiLz4KICogICAgICA8aW5wdXQgbmFtZT0iQyIgdHlwZT0icmFkaW8iIHZhbHVlPSJDMSIgLz4KICogICAgICA8aW5wdXQgbmFtZT0iQyIgdHlwZT0icmFkaW8iIHZhbHVlPSJDMiIgLz4KICogIDwvZmllbGRzZXQ+PC9mb3JtPgogKgogKiAgdmFyIHYgPSAkKCdpbnB1dFt0eXBlPXRleHRdJykuZmllbGRWYWx1ZSgpOwogKiAgLy8gaWYgbm8gdmFsdWVzIGFyZSBlbnRlcmVkIGludG8gdGhlIHRleHQgaW5wdXRzCiAqICB2ID09IFsnJywnJ10KICogIC8vIGlmIHZhbHVlcyBlbnRlcmVkIGludG8gdGhlIHRleHQgaW5wdXRzIGFyZSAnZm9vJyBhbmQgJ2JhcicKICogIHYgPT0gWydmb28nLCdiYXInXQogKgogKiAgdmFyIHYgPSAkKCdpbnB1dFt0eXBlPWNoZWNrYm94XScpLmZpZWxkVmFsdWUoKTsKICogIC8vIGlmIG5laXRoZXIgY2hlY2tib3ggaXMgY2hlY2tlZAogKiAgdiA9PT0gdW5kZWZpbmVkCiAqICAvLyBpZiBib3RoIGNoZWNrYm94ZXMgYXJlIGNoZWNrZWQKICogIHYgPT0gWydCMScsICdCMiddCiAqCiAqICB2YXIgdiA9ICQoJ2lucHV0W3R5cGU9cmFkaW9dJykuZmllbGRWYWx1ZSgpOwogKiAgLy8gaWYgbmVpdGhlciByYWRpbyBpcyBjaGVja2VkCiAqICB2ID09PSB1bmRlZmluZWQKICogIC8vIGlmIGZpcnN0IHJhZGlvIGlzIGNoZWNrZWQKICogIHYgPT0gWydDMSddCiAqCiAqIFRoZSBzdWNjZXNzZnVsIGFyZ3VtZW50IGNvbnRyb2xzIHdoZXRoZXIgb3Igbm90IHRoZSBmaWVsZCBlbGVtZW50IG11c3QgYmUgJ3N1Y2Nlc3NmdWwnCiAqIChwZXIgaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvaW50ZXJhY3QvZm9ybXMuaHRtbCNzdWNjZXNzZnVsLWNvbnRyb2xzKS4KICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIHN1Y2Nlc3NmdWwgYXJndW1lbnQgaXMgdHJ1ZS4gIElmIHRoaXMgdmFsdWUgaXMgZmFsc2UgdGhlIHZhbHVlKHMpCiAqIGZvciBlYWNoIGVsZW1lbnQgaXMgcmV0dXJuZWQuCiAqCiAqIE5vdGU6IFRoaXMgbWV0aG9kICphbHdheXMqIHJldHVybnMgYW4gYXJyYXkuICBJZiBubyB2YWxpZCB2YWx1ZSBjYW4gYmUgZGV0ZXJtaW5lZCB0aGUKICogICAgYXJyYXkgd2lsbCBiZSBlbXB0eSwgb3RoZXJ3aXNlIGl0IHdpbGwgY29udGFpbiBvbmUgb3IgbW9yZSB2YWx1ZXMuCiAqLwokLmZuLmZpZWxkVmFsdWUgPSBmdW5jdGlvbihzdWNjZXNzZnVsKSB7CiAgICBmb3IgKHZhciB2YWw9W10sIGk9MCwgbWF4PXRoaXMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKICAgICAgICB2YXIgZWwgPSB0aGlzW2ldOwogICAgICAgIHZhciB2ID0gJC5maWVsZFZhbHVlKGVsLCBzdWNjZXNzZnVsKTsKICAgICAgICBpZiAodiA9PT0gbnVsbCB8fCB0eXBlb2YgdiA9PSAndW5kZWZpbmVkJyB8fCAodi5jb25zdHJ1Y3RvciA9PSBBcnJheSAmJiAhdi5sZW5ndGgpKSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAodi5jb25zdHJ1Y3RvciA9PSBBcnJheSkKICAgICAgICAgICAgJC5tZXJnZSh2YWwsIHYpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgdmFsLnB1c2godik7CiAgICB9CiAgICByZXR1cm4gdmFsOwp9OwoKLyoqCiAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBlbGVtZW50LgogKi8KJC5maWVsZFZhbHVlID0gZnVuY3Rpb24oZWwsIHN1Y2Nlc3NmdWwpIHsKICAgIHZhciBuID0gZWwubmFtZSwgdCA9IGVsLnR5cGUsIHRhZyA9IGVsLnRhZ05hbWUudG9Mb3dlckNhc2UoKTsKICAgIGlmIChzdWNjZXNzZnVsID09PSB1bmRlZmluZWQpIHsKICAgICAgICBzdWNjZXNzZnVsID0gdHJ1ZTsKICAgIH0KCiAgICBpZiAoc3VjY2Vzc2Z1bCAmJiAoIW4gfHwgZWwuZGlzYWJsZWQgfHwgdCA9PSAncmVzZXQnIHx8IHQgPT0gJ2J1dHRvbicgfHwKICAgICAgICAodCA9PSAnY2hlY2tib3gnIHx8IHQgPT0gJ3JhZGlvJykgJiYgIWVsLmNoZWNrZWQgfHwKICAgICAgICAodCA9PSAnc3VibWl0JyB8fCB0ID09ICdpbWFnZScpICYmIGVsLmZvcm0gJiYgZWwuZm9ybS5jbGsgIT0gZWwgfHwKICAgICAgICB0YWcgPT0gJ3NlbGVjdCcgJiYgZWwuc2VsZWN0ZWRJbmRleCA9PSAtMSkpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgaWYgKHRhZyA9PSAnc2VsZWN0JykgewogICAgICAgIHZhciBpbmRleCA9IGVsLnNlbGVjdGVkSW5kZXg7CiAgICAgICAgaWYgKGluZGV4IDwgMCkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgdmFyIGEgPSBbXSwgb3BzID0gZWwub3B0aW9uczsKICAgICAgICB2YXIgb25lID0gKHQgPT0gJ3NlbGVjdC1vbmUnKTsKICAgICAgICB2YXIgbWF4ID0gKG9uZSA/IGluZGV4KzEgOiBvcHMubGVuZ3RoKTsKICAgICAgICBmb3IodmFyIGk9KG9uZSA/IGluZGV4IDogMCk7IGkgPCBtYXg7IGkrKykgewogICAgICAgICAgICB2YXIgb3AgPSBvcHNbaV07CiAgICAgICAgICAgIGlmIChvcC5zZWxlY3RlZCkgewogICAgICAgICAgICAgICAgdmFyIHYgPSBvcC52YWx1ZTsKICAgICAgICAgICAgICAgIGlmICghdikgeyAvLyBleHRyYSBwYWluIGZvciBJRS4uLgogICAgICAgICAgICAgICAgICAgIHYgPSAob3AuYXR0cmlidXRlcyAmJiBvcC5hdHRyaWJ1dGVzWyd2YWx1ZSddICYmICEob3AuYXR0cmlidXRlc1sndmFsdWUnXS5zcGVjaWZpZWQpKSA/IG9wLnRleHQgOiBvcC52YWx1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChvbmUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGEucHVzaCh2KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gYTsKICAgIH0KICAgIHJldHVybiAkKGVsKS52YWwoKTsKfTsKCi8qKgogKiBDbGVhcnMgdGhlIGZvcm0gZGF0YS4gIFRha2VzIHRoZSBmb2xsb3dpbmcgYWN0aW9ucyBvbiB0aGUgZm9ybSdzIGlucHV0IGZpZWxkczoKICogIC0gaW5wdXQgdGV4dCBmaWVsZHMgd2lsbCBoYXZlIHRoZWlyICd2YWx1ZScgcHJvcGVydHkgc2V0IHRvIHRoZSBlbXB0eSBzdHJpbmcKICogIC0gc2VsZWN0IGVsZW1lbnRzIHdpbGwgaGF2ZSB0aGVpciAnc2VsZWN0ZWRJbmRleCcgcHJvcGVydHkgc2V0IHRvIC0xCiAqICAtIGNoZWNrYm94IGFuZCByYWRpbyBpbnB1dHMgd2lsbCBoYXZlIHRoZWlyICdjaGVja2VkJyBwcm9wZXJ0eSBzZXQgdG8gZmFsc2UKICogIC0gaW5wdXRzIG9mIHR5cGUgc3VibWl0LCBidXR0b24sIHJlc2V0LCBhbmQgaGlkZGVuIHdpbGwgKm5vdCogYmUgZWZmZWN0ZWQKICogIC0gYnV0dG9uIGVsZW1lbnRzIHdpbGwgKm5vdCogYmUgZWZmZWN0ZWQKICovCiQuZm4uY2xlYXJGb3JtID0gZnVuY3Rpb24oaW5jbHVkZUhpZGRlbikgewogICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAkKCdpbnB1dCxzZWxlY3QsdGV4dGFyZWEnLCB0aGlzKS5jbGVhckZpZWxkcyhpbmNsdWRlSGlkZGVuKTsKICAgIH0pOwp9OwoKLyoqCiAqIENsZWFycyB0aGUgc2VsZWN0ZWQgZm9ybSBlbGVtZW50cy4KICovCiQuZm4uY2xlYXJGaWVsZHMgPSAkLmZuLmNsZWFySW5wdXRzID0gZnVuY3Rpb24oaW5jbHVkZUhpZGRlbikgewogICAgdmFyIHJlID0gL14oPzpjb2xvcnxkYXRlfGRhdGV0aW1lfGVtYWlsfG1vbnRofG51bWJlcnxwYXNzd29yZHxyYW5nZXxzZWFyY2h8dGVsfHRleHR8dGltZXx1cmx8d2VlaykkL2k7IC8vICdoaWRkZW4nIGlzIG5vdCBpbiB0aGlzIGxpc3QKICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHQgPSB0aGlzLnR5cGUsIHRhZyA9IHRoaXMudGFnTmFtZS50b0xvd2VyQ2FzZSgpOwogICAgICAgIGlmIChyZS50ZXN0KHQpIHx8IHRhZyA9PSAndGV4dGFyZWEnKSB7CiAgICAgICAgICAgIHRoaXMudmFsdWUgPSAnJzsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAodCA9PSAnY2hlY2tib3gnIHx8IHQgPT0gJ3JhZGlvJykgewogICAgICAgICAgICB0aGlzLmNoZWNrZWQgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAodGFnID09ICdzZWxlY3QnKSB7CiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJbmRleCA9IC0xOwogICAgICAgIH0KCQllbHNlIGlmICh0ID09ICJmaWxlIikgewoJCQlpZiAoJC5icm93c2VyLm1zaWUpIHsKCQkJCSQodGhpcykucmVwbGFjZVdpdGgoJCh0aGlzKS5jbG9uZSgpKTsKCQkJfSBlbHNlIHsKCQkJCSQodGhpcykudmFsKCcnKTsKCQkJfQoJCX0KICAgICAgICBlbHNlIGlmIChpbmNsdWRlSGlkZGVuKSB7CiAgICAgICAgICAgIC8vIGluY2x1ZGVIaWRkZW4gY2FuIGJlIHRoZSB2YWx1ZSB0cnVlLCBvciBpdCBjYW4gYmUgYSBzZWxlY3RvciBzdHJpbmcKICAgICAgICAgICAgLy8gaW5kaWNhdGluZyBhIHNwZWNpYWwgdGVzdDsgZm9yIGV4YW1wbGU6CiAgICAgICAgICAgIC8vICAkKCcjbXlGb3JtJykuY2xlYXJGb3JtKCcuc3BlY2lhbDpoaWRkZW4nKQogICAgICAgICAgICAvLyB0aGUgYWJvdmUgd291bGQgY2xlYW4gaGlkZGVuIGlucHV0cyB0aGF0IGhhdmUgdGhlIGNsYXNzIG9mICdzcGVjaWFsJwogICAgICAgICAgICBpZiAoIChpbmNsdWRlSGlkZGVuID09PSB0cnVlICYmIC9oaWRkZW4vLnRlc3QodCkpIHx8CiAgICAgICAgICAgICAgICAgKHR5cGVvZiBpbmNsdWRlSGlkZGVuID09ICdzdHJpbmcnICYmICQodGhpcykuaXMoaW5jbHVkZUhpZGRlbikpICkKICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSAnJzsKICAgICAgICB9CiAgICB9KTsKfTsKCi8qKgogKiBSZXNldHMgdGhlIGZvcm0gZGF0YS4gIENhdXNlcyBhbGwgZm9ybSBlbGVtZW50cyB0byBiZSByZXNldCB0byB0aGVpciBvcmlnaW5hbCB2YWx1ZS4KICovCiQuZm4ucmVzZXRGb3JtID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgIC8vIGd1YXJkIGFnYWluc3QgYW4gaW5wdXQgd2l0aCB0aGUgbmFtZSBvZiAncmVzZXQnCiAgICAgICAgLy8gbm90ZSB0aGF0IElFIHJlcG9ydHMgdGhlIHJlc2V0IGZ1bmN0aW9uIGFzIGFuICdvYmplY3QnCiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnJlc2V0ID09ICdmdW5jdGlvbicgfHwgKHR5cGVvZiB0aGlzLnJlc2V0ID09ICdvYmplY3QnICYmICF0aGlzLnJlc2V0Lm5vZGVUeXBlKSkgewogICAgICAgICAgICB0aGlzLnJlc2V0KCk7CiAgICAgICAgfQogICAgfSk7Cn07CgovKioKICogRW5hYmxlcyBvciBkaXNhYmxlcyBhbnkgbWF0Y2hpbmcgZWxlbWVudHMuCiAqLwokLmZuLmVuYWJsZSA9IGZ1bmN0aW9uKGIpIHsKICAgIGlmIChiID09PSB1bmRlZmluZWQpIHsKICAgICAgICBiID0gdHJ1ZTsKICAgIH0KICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5kaXNhYmxlZCA9ICFiOwogICAgfSk7Cn07CgovKioKICogQ2hlY2tzL3VuY2hlY2tzIGFueSBtYXRjaGluZyBjaGVja2JveGVzIG9yIHJhZGlvIGJ1dHRvbnMgYW5kCiAqIHNlbGVjdHMvZGVzZWxlY3RzIGFuZCBtYXRjaGluZyBvcHRpb24gZWxlbWVudHMuCiAqLwokLmZuLnNlbGVjdGVkID0gZnVuY3Rpb24oc2VsZWN0KSB7CiAgICBpZiAoc2VsZWN0ID09PSB1bmRlZmluZWQpIHsKICAgICAgICBzZWxlY3QgPSB0cnVlOwogICAgfQogICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICB2YXIgdCA9IHRoaXMudHlwZTsKICAgICAgICBpZiAodCA9PSAnY2hlY2tib3gnIHx8IHQgPT0gJ3JhZGlvJykgewogICAgICAgICAgICB0aGlzLmNoZWNrZWQgPSBzZWxlY3Q7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHRoaXMudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09ICdvcHRpb24nKSB7CiAgICAgICAgICAgIHZhciAkc2VsID0gJCh0aGlzKS5wYXJlbnQoJ3NlbGVjdCcpOwogICAgICAgICAgICBpZiAoc2VsZWN0ICYmICRzZWxbMF0gJiYgJHNlbFswXS50eXBlID09ICdzZWxlY3Qtb25lJykgewogICAgICAgICAgICAgICAgLy8gZGVzZWxlY3QgYWxsIG90aGVyIG9wdGlvbnMKICAgICAgICAgICAgICAgICRzZWwuZmluZCgnb3B0aW9uJykuc2VsZWN0ZWQoZmFsc2UpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWQgPSBzZWxlY3Q7CiAgICAgICAgfQogICAgfSk7Cn07CgovLyBleHBvc2UgZGVidWcgdmFyCiQuZm4uYWpheFN1Ym1pdC5kZWJ1ZyA9IGZhbHNlOwoKLy8gaGVscGVyIGZuIGZvciBjb25zb2xlIGxvZ2dpbmcKZnVuY3Rpb24gbG9nKCkgewogICAgaWYgKCEkLmZuLmFqYXhTdWJtaXQuZGVidWcpIAogICAgICAgIHJldHVybjsKICAgIHZhciBtc2cgPSAnW2pxdWVyeS5mb3JtXSAnICsgQXJyYXkucHJvdG90eXBlLmpvaW4uY2FsbChhcmd1bWVudHMsJycpOwogICAgaWYgKHdpbmRvdy5jb25zb2xlICYmIHdpbmRvdy5jb25zb2xlLmxvZykgewogICAgICAgIHdpbmRvdy5jb25zb2xlLmxvZyhtc2cpOwogICAgfQogICAgZWxzZSBpZiAod2luZG93Lm9wZXJhICYmIHdpbmRvdy5vcGVyYS5wb3N0RXJyb3IpIHsKICAgICAgICB3aW5kb3cub3BlcmEucG9zdEVycm9yKG1zZyk7CiAgICB9Cn0KCn0pKGpRdWVyeSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/jquery.lib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/jquery.lib/info.dat</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGluZm9bJ2pzJ10gPSBhcnJheSgnanF1ZXJ5LTEuMTEuMy5taW4uanMnLCdqcXVlcnktbWlncmF0ZS0xLjIuMS5taW4uanMnKTsKJGluZm9bJ2pzX25vbWluaWZ5J10gPSAxOwo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lib/jquery.lib/jquery-1.11.3.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohIGpRdWVyeSB2MS4xMS4zIHwgKGMpIDIwMDUsIDIwMTUgalF1ZXJ5IEZvdW5kYXRpb24sIEluYy4gfCBqcXVlcnkub3JnL2xpY2Vuc2UgKi8KIWZ1bmN0aW9uKGEsYil7Im9iamVjdCI9PXR5cGVvZiBtb2R1bGUmJiJvYmplY3QiPT10eXBlb2YgbW9kdWxlLmV4cG9ydHM/bW9kdWxlLmV4cG9ydHM9YS5kb2N1bWVudD9iKGEsITApOmZ1bmN0aW9uKGEpe2lmKCFhLmRvY3VtZW50KXRocm93IG5ldyBFcnJvcigialF1ZXJ5IHJlcXVpcmVzIGEgd2luZG93IHdpdGggYSBkb2N1bWVudCIpO3JldHVybiBiKGEpfTpiKGEpfSgidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6dGhpcyxmdW5jdGlvbihhLGIpe3ZhciBjPVtdLGQ9Yy5zbGljZSxlPWMuY29uY2F0LGY9Yy5wdXNoLGc9Yy5pbmRleE9mLGg9e30saT1oLnRvU3RyaW5nLGo9aC5oYXNPd25Qcm9wZXJ0eSxrPXt9LGw9IjEuMTEuMyIsbT1mdW5jdGlvbihhLGIpe3JldHVybiBuZXcgbS5mbi5pbml0KGEsYil9LG49L15bXHNcdUZFRkZceEEwXSt8W1xzXHVGRUZGXHhBMF0rJC9nLG89L14tbXMtLyxwPS8tKFtcZGEtel0pL2dpLHE9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYi50b1VwcGVyQ2FzZSgpfTttLmZuPW0ucHJvdG90eXBlPXtqcXVlcnk6bCxjb25zdHJ1Y3RvcjptLHNlbGVjdG9yOiIiLGxlbmd0aDowLHRvQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gZC5jYWxsKHRoaXMpfSxnZXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPWE/MD5hP3RoaXNbYSt0aGlzLmxlbmd0aF06dGhpc1thXTpkLmNhbGwodGhpcyl9LHB1c2hTdGFjazpmdW5jdGlvbihhKXt2YXIgYj1tLm1lcmdlKHRoaXMuY29uc3RydWN0b3IoKSxhKTtyZXR1cm4gYi5wcmV2T2JqZWN0PXRoaXMsYi5jb250ZXh0PXRoaXMuY29udGV4dCxifSxlYWNoOmZ1bmN0aW9uKGEsYil7cmV0dXJuIG0uZWFjaCh0aGlzLGEsYil9LG1hcDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2sobS5tYXAodGhpcyxmdW5jdGlvbihiLGMpe3JldHVybiBhLmNhbGwoYixjLGIpfSkpfSxzbGljZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnB1c2hTdGFjayhkLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9LGZpcnN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoMCl9LGxhc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgtMSl9LGVxOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMubGVuZ3RoLGM9K2ErKDA+YT9iOjApO3JldHVybiB0aGlzLnB1c2hTdGFjayhjPj0wJiZiPmM/W3RoaXNbY11dOltdKX0sZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJldk9iamVjdHx8dGhpcy5jb25zdHJ1Y3RvcihudWxsKX0scHVzaDpmLHNvcnQ6Yy5zb3J0LHNwbGljZTpjLnNwbGljZX0sbS5leHRlbmQ9bS5mbi5leHRlbmQ9ZnVuY3Rpb24oKXt2YXIgYSxiLGMsZCxlLGYsZz1hcmd1bWVudHNbMF18fHt9LGg9MSxpPWFyZ3VtZW50cy5sZW5ndGgsaj0hMTtmb3IoImJvb2xlYW4iPT10eXBlb2YgZyYmKGo9ZyxnPWFyZ3VtZW50c1toXXx8e30saCsrKSwib2JqZWN0Ij09dHlwZW9mIGd8fG0uaXNGdW5jdGlvbihnKXx8KGc9e30pLGg9PT1pJiYoZz10aGlzLGgtLSk7aT5oO2grKylpZihudWxsIT0oZT1hcmd1bWVudHNbaF0pKWZvcihkIGluIGUpYT1nW2RdLGM9ZVtkXSxnIT09YyYmKGomJmMmJihtLmlzUGxhaW5PYmplY3QoYyl8fChiPW0uaXNBcnJheShjKSkpPyhiPyhiPSExLGY9YSYmbS5pc0FycmF5KGEpP2E6W10pOmY9YSYmbS5pc1BsYWluT2JqZWN0KGEpP2E6e30sZ1tkXT1tLmV4dGVuZChqLGYsYykpOnZvaWQgMCE9PWMmJihnW2RdPWMpKTtyZXR1cm4gZ30sbS5leHRlbmQoe2V4cGFuZG86ImpRdWVyeSIrKGwrTWF0aC5yYW5kb20oKSkucmVwbGFjZSgvXEQvZywiIiksaXNSZWFkeTohMCxlcnJvcjpmdW5jdGlvbihhKXt0aHJvdyBuZXcgRXJyb3IoYSl9LG5vb3A6ZnVuY3Rpb24oKXt9LGlzRnVuY3Rpb246ZnVuY3Rpb24oYSl7cmV0dXJuImZ1bmN0aW9uIj09PW0udHlwZShhKX0saXNBcnJheTpBcnJheS5pc0FycmF5fHxmdW5jdGlvbihhKXtyZXR1cm4iYXJyYXkiPT09bS50eXBlKGEpfSxpc1dpbmRvdzpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9YSYmYT09YS53aW5kb3d9LGlzTnVtZXJpYzpmdW5jdGlvbihhKXtyZXR1cm4hbS5pc0FycmF5KGEpJiZhLXBhcnNlRmxvYXQoYSkrMT49MH0saXNFbXB0eU9iamVjdDpmdW5jdGlvbihhKXt2YXIgYjtmb3IoYiBpbiBhKXJldHVybiExO3JldHVybiEwfSxpc1BsYWluT2JqZWN0OmZ1bmN0aW9uKGEpe3ZhciBiO2lmKCFhfHwib2JqZWN0IiE9PW0udHlwZShhKXx8YS5ub2RlVHlwZXx8bS5pc1dpbmRvdyhhKSlyZXR1cm4hMTt0cnl7aWYoYS5jb25zdHJ1Y3RvciYmIWouY2FsbChhLCJjb25zdHJ1Y3RvciIpJiYhai5jYWxsKGEuY29uc3RydWN0b3IucHJvdG90eXBlLCJpc1Byb3RvdHlwZU9mIikpcmV0dXJuITF9Y2F0Y2goYyl7cmV0dXJuITF9aWYoay5vd25MYXN0KWZvcihiIGluIGEpcmV0dXJuIGouY2FsbChhLGIpO2ZvcihiIGluIGEpO3JldHVybiB2b2lkIDA9PT1ifHxqLmNhbGwoYSxiKX0sdHlwZTpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09YT9hKyIiOiJvYmplY3QiPT10eXBlb2YgYXx8ImZ1bmN0aW9uIj09dHlwZW9mIGE/aFtpLmNhbGwoYSldfHwib2JqZWN0Ijp0eXBlb2YgYX0sZ2xvYmFsRXZhbDpmdW5jdGlvbihiKXtiJiZtLnRyaW0oYikmJihhLmV4ZWNTY3JpcHR8fGZ1bmN0aW9uKGIpe2EuZXZhbC5jYWxsKGEsYil9KShiKX0sY2FtZWxDYXNlOmZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UobywibXMtIikucmVwbGFjZShwLHEpfSxub2RlTmFtZTpmdW5jdGlvbihhLGIpe3JldHVybiBhLm5vZGVOYW1lJiZhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1iLnRvTG93ZXJDYXNlKCl9LGVhY2g6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGU9MCxmPWEubGVuZ3RoLGc9cihhKTtpZihjKXtpZihnKXtmb3IoO2Y+ZTtlKyspaWYoZD1iLmFwcGx5KGFbZV0sYyksZD09PSExKWJyZWFrfWVsc2UgZm9yKGUgaW4gYSlpZihkPWIuYXBwbHkoYVtlXSxjKSxkPT09ITEpYnJlYWt9ZWxzZSBpZihnKXtmb3IoO2Y+ZTtlKyspaWYoZD1iLmNhbGwoYVtlXSxlLGFbZV0pLGQ9PT0hMSlicmVha31lbHNlIGZvcihlIGluIGEpaWYoZD1iLmNhbGwoYVtlXSxlLGFbZV0pLGQ9PT0hMSlicmVhaztyZXR1cm4gYX0sdHJpbTpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09YT8iIjooYSsiIikucmVwbGFjZShuLCIiKX0sbWFrZUFycmF5OmZ1bmN0aW9uKGEsYil7dmFyIGM9Ynx8W107cmV0dXJuIG51bGwhPWEmJihyKE9iamVjdChhKSk/bS5tZXJnZShjLCJzdHJpbmciPT10eXBlb2YgYT9bYV06YSk6Zi5jYWxsKGMsYSkpLGN9LGluQXJyYXk6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkO2lmKGIpe2lmKGcpcmV0dXJuIGcuY2FsbChiLGEsYyk7Zm9yKGQ9Yi5sZW5ndGgsYz1jPzA+Yz9NYXRoLm1heCgwLGQrYyk6YzowO2Q+YztjKyspaWYoYyBpbiBiJiZiW2NdPT09YSlyZXR1cm4gY31yZXR1cm4tMX0sbWVyZ2U6ZnVuY3Rpb24oYSxiKXt2YXIgYz0rYi5sZW5ndGgsZD0wLGU9YS5sZW5ndGg7d2hpbGUoYz5kKWFbZSsrXT1iW2QrK107aWYoYyE9PWMpd2hpbGUodm9pZCAwIT09YltkXSlhW2UrK109YltkKytdO3JldHVybiBhLmxlbmd0aD1lLGF9LGdyZXA6ZnVuY3Rpb24oYSxiLGMpe2Zvcih2YXIgZCxlPVtdLGY9MCxnPWEubGVuZ3RoLGg9IWM7Zz5mO2YrKylkPSFiKGFbZl0sZiksZCE9PWgmJmUucHVzaChhW2ZdKTtyZXR1cm4gZX0sbWFwOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxmPTAsZz1hLmxlbmd0aCxoPXIoYSksaT1bXTtpZihoKWZvcig7Zz5mO2YrKylkPWIoYVtmXSxmLGMpLG51bGwhPWQmJmkucHVzaChkKTtlbHNlIGZvcihmIGluIGEpZD1iKGFbZl0sZixjKSxudWxsIT1kJiZpLnB1c2goZCk7cmV0dXJuIGUuYXBwbHkoW10saSl9LGd1aWQ6MSxwcm94eTpmdW5jdGlvbihhLGIpe3ZhciBjLGUsZjtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGImJihmPWFbYl0sYj1hLGE9ZiksbS5pc0Z1bmN0aW9uKGEpPyhjPWQuY2FsbChhcmd1bWVudHMsMiksZT1mdW5jdGlvbigpe3JldHVybiBhLmFwcGx5KGJ8fHRoaXMsYy5jb25jYXQoZC5jYWxsKGFyZ3VtZW50cykpKX0sZS5ndWlkPWEuZ3VpZD1hLmd1aWR8fG0uZ3VpZCsrLGUpOnZvaWQgMH0sbm93OmZ1bmN0aW9uKCl7cmV0dXJuK25ldyBEYXRlfSxzdXBwb3J0Omt9KSxtLmVhY2goIkJvb2xlYW4gTnVtYmVyIFN0cmluZyBGdW5jdGlvbiBBcnJheSBEYXRlIFJlZ0V4cCBPYmplY3QgRXJyb3IiLnNwbGl0KCIgIiksZnVuY3Rpb24oYSxiKXtoWyJbb2JqZWN0ICIrYisiXSJdPWIudG9Mb3dlckNhc2UoKX0pO2Z1bmN0aW9uIHIoYSl7dmFyIGI9Imxlbmd0aCJpbiBhJiZhLmxlbmd0aCxjPW0udHlwZShhKTtyZXR1cm4iZnVuY3Rpb24iPT09Y3x8bS5pc1dpbmRvdyhhKT8hMToxPT09YS5ub2RlVHlwZSYmYj8hMDoiYXJyYXkiPT09Y3x8MD09PWJ8fCJudW1iZXIiPT10eXBlb2YgYiYmYj4wJiZiLTEgaW4gYX12YXIgcz1mdW5jdGlvbihhKXt2YXIgYixjLGQsZSxmLGcsaCxpLGosayxsLG0sbixvLHAscSxyLHMsdCx1PSJzaXp6bGUiKzEqbmV3IERhdGUsdj1hLmRvY3VtZW50LHc9MCx4PTAseT1oYSgpLHo9aGEoKSxBPWhhKCksQj1mdW5jdGlvbihhLGIpe3JldHVybiBhPT09YiYmKGw9ITApLDB9LEM9MTw8MzEsRD17fS5oYXNPd25Qcm9wZXJ0eSxFPVtdLEY9RS5wb3AsRz1FLnB1c2gsSD1FLnB1c2gsST1FLnNsaWNlLEo9ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9MCxkPWEubGVuZ3RoO2Q+YztjKyspaWYoYVtjXT09PWIpcmV0dXJuIGM7cmV0dXJuLTF9LEs9ImNoZWNrZWR8c2VsZWN0ZWR8YXN5bmN8YXV0b2ZvY3VzfGF1dG9wbGF5fGNvbnRyb2xzfGRlZmVyfGRpc2FibGVkfGhpZGRlbnxpc21hcHxsb29wfG11bHRpcGxlfG9wZW58cmVhZG9ubHl8cmVxdWlyZWR8c2NvcGVkIixMPSJbXFx4MjBcXHRcXHJcXG5cXGZdIixNPSIoPzpcXFxcLnxbXFx3LV18W15cXHgwMC1cXHhhMF0pKyIsTj1NLnJlcGxhY2UoInciLCJ3IyIpLE89IlxcWyIrTCsiKigiK00rIikoPzoiK0wrIiooWypeJHwhfl0/PSkiK0wrIiooPzonKCg/OlxcXFwufFteXFxcXCddKSopJ3xcIigoPzpcXFxcLnxbXlxcXFxcIl0pKilcInwoIitOKyIpKXwpIitMKyIqXFxdIixQPSI6KCIrTSsiKSg/OlxcKCgoJygoPzpcXFxcLnxbXlxcXFwnXSkqKSd8XCIoKD86XFxcXC58W15cXFxcXCJdKSopXCIpfCgoPzpcXFxcLnxbXlxcXFwoKVtcXF1dfCIrTysiKSopfC4qKVxcKXwpIixRPW5ldyBSZWdFeHAoTCsiKyIsImciKSxSPW5ldyBSZWdFeHAoIl4iK0wrIit8KCg/Ol58W15cXFxcXSkoPzpcXFxcLikqKSIrTCsiKyQiLCJnIiksUz1uZXcgUmVnRXhwKCJeIitMKyIqLCIrTCsiKiIpLFQ9bmV3IFJlZ0V4cCgiXiIrTCsiKihbPit+XXwiK0wrIikiK0wrIioiKSxVPW5ldyBSZWdFeHAoIj0iK0wrIiooW15cXF0nXCJdKj8pIitMKyIqXFxdIiwiZyIpLFY9bmV3IFJlZ0V4cChQKSxXPW5ldyBSZWdFeHAoIl4iK04rIiQiKSxYPXtJRDpuZXcgUmVnRXhwKCJeIygiK00rIikiKSxDTEFTUzpuZXcgUmVnRXhwKCJeXFwuKCIrTSsiKSIpLFRBRzpuZXcgUmVnRXhwKCJeKCIrTS5yZXBsYWNlKCJ3IiwidyoiKSsiKSIpLEFUVFI6bmV3IFJlZ0V4cCgiXiIrTyksUFNFVURPOm5ldyBSZWdFeHAoIl4iK1ApLENISUxEOm5ldyBSZWdFeHAoIl46KG9ubHl8Zmlyc3R8bGFzdHxudGh8bnRoLWxhc3QpLShjaGlsZHxvZi10eXBlKSg/OlxcKCIrTCsiKihldmVufG9kZHwoKFsrLV18KShcXGQqKW58KSIrTCsiKig/OihbKy1dfCkiK0wrIiooXFxkKyl8KSkiK0wrIipcXCl8KSIsImkiKSxib29sOm5ldyBSZWdFeHAoIl4oPzoiK0srIikkIiwiaSIpLG5lZWRzQ29udGV4dDpuZXcgUmVnRXhwKCJeIitMKyIqWz4rfl18OihldmVufG9kZHxlcXxndHxsdHxudGh8Zmlyc3R8bGFzdCkoPzpcXCgiK0wrIiooKD86LVxcZCk/XFxkKikiK0wrIipcXCl8KSg/PVteLV18JCkiLCJpIil9LFk9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSxaPS9eaFxkJC9pLCQ9L15bXntdK1x7XHMqXFtuYXRpdmUgXHcvLF89L14oPzojKFtcdy1dKyl8KFx3Kyl8XC4oW1x3LV0rKSkkLyxhYT0vWyt+XS8sYmE9Lyd8XFwvZyxjYT1uZXcgUmVnRXhwKCJcXFxcKFtcXGRhLWZdezEsNn0iK0wrIj98KCIrTCsiKXwuKSIsImlnIiksZGE9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPSIweCIrYi02NTUzNjtyZXR1cm4gZCE9PWR8fGM/YjowPmQ/U3RyaW5nLmZyb21DaGFyQ29kZShkKzY1NTM2KTpTdHJpbmcuZnJvbUNoYXJDb2RlKGQ+PjEwfDU1Mjk2LDEwMjMmZHw1NjMyMCl9LGVhPWZ1bmN0aW9uKCl7bSgpfTt0cnl7SC5hcHBseShFPUkuY2FsbCh2LmNoaWxkTm9kZXMpLHYuY2hpbGROb2RlcyksRVt2LmNoaWxkTm9kZXMubGVuZ3RoXS5ub2RlVHlwZX1jYXRjaChmYSl7SD17YXBwbHk6RS5sZW5ndGg/ZnVuY3Rpb24oYSxiKXtHLmFwcGx5KGEsSS5jYWxsKGIpKX06ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmxlbmd0aCxkPTA7d2hpbGUoYVtjKytdPWJbZCsrXSk7YS5sZW5ndGg9Yy0xfX19ZnVuY3Rpb24gZ2EoYSxiLGQsZSl7dmFyIGYsaCxqLGssbCxvLHIscyx3LHg7aWYoKGI/Yi5vd25lckRvY3VtZW50fHxiOnYpIT09biYmbShiKSxiPWJ8fG4sZD1kfHxbXSxrPWIubm9kZVR5cGUsInN0cmluZyIhPXR5cGVvZiBhfHwhYXx8MSE9PWsmJjkhPT1rJiYxMSE9PWspcmV0dXJuIGQ7aWYoIWUmJnApe2lmKDExIT09ayYmKGY9Xy5leGVjKGEpKSlpZihqPWZbMV0pe2lmKDk9PT1rKXtpZihoPWIuZ2V0RWxlbWVudEJ5SWQoaiksIWh8fCFoLnBhcmVudE5vZGUpcmV0dXJuIGQ7aWYoaC5pZD09PWopcmV0dXJuIGQucHVzaChoKSxkfWVsc2UgaWYoYi5vd25lckRvY3VtZW50JiYoaD1iLm93bmVyRG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaikpJiZ0KGIsaCkmJmguaWQ9PT1qKXJldHVybiBkLnB1c2goaCksZH1lbHNle2lmKGZbMl0pcmV0dXJuIEguYXBwbHkoZCxiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpKSxkO2lmKChqPWZbM10pJiZjLmdldEVsZW1lbnRzQnlDbGFzc05hbWUpcmV0dXJuIEguYXBwbHkoZCxiLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoaikpLGR9aWYoYy5xc2EmJighcXx8IXEudGVzdChhKSkpe2lmKHM9cj11LHc9Yix4PTEhPT1rJiZhLDE9PT1rJiYib2JqZWN0IiE9PWIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSl7bz1nKGEpLChyPWIuZ2V0QXR0cmlidXRlKCJpZCIpKT9zPXIucmVwbGFjZShiYSwiXFwkJiIpOmIuc2V0QXR0cmlidXRlKCJpZCIscykscz0iW2lkPSciK3MrIiddICIsbD1vLmxlbmd0aDt3aGlsZShsLS0pb1tsXT1zK3JhKG9bbF0pO3c9YWEudGVzdChhKSYmcGEoYi5wYXJlbnROb2RlKXx8Yix4PW8uam9pbigiLCIpfWlmKHgpdHJ5e3JldHVybiBILmFwcGx5KGQsdy5xdWVyeVNlbGVjdG9yQWxsKHgpKSxkfWNhdGNoKHkpe31maW5hbGx5e3J8fGIucmVtb3ZlQXR0cmlidXRlKCJpZCIpfX19cmV0dXJuIGkoYS5yZXBsYWNlKFIsIiQxIiksYixkLGUpfWZ1bmN0aW9uIGhhKCl7dmFyIGE9W107ZnVuY3Rpb24gYihjLGUpe3JldHVybiBhLnB1c2goYysiICIpPmQuY2FjaGVMZW5ndGgmJmRlbGV0ZSBiW2Euc2hpZnQoKV0sYltjKyIgIl09ZX1yZXR1cm4gYn1mdW5jdGlvbiBpYShhKXtyZXR1cm4gYVt1XT0hMCxhfWZ1bmN0aW9uIGphKGEpe3ZhciBiPW4uY3JlYXRlRWxlbWVudCgiZGl2Iik7dHJ5e3JldHVybiEhYShiKX1jYXRjaChjKXtyZXR1cm4hMX1maW5hbGx5e2IucGFyZW50Tm9kZSYmYi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpLGI9bnVsbH19ZnVuY3Rpb24ga2EoYSxiKXt2YXIgYz1hLnNwbGl0KCJ8IiksZT1hLmxlbmd0aDt3aGlsZShlLS0pZC5hdHRySGFuZGxlW2NbZV1dPWJ9ZnVuY3Rpb24gbGEoYSxiKXt2YXIgYz1iJiZhLGQ9YyYmMT09PWEubm9kZVR5cGUmJjE9PT1iLm5vZGVUeXBlJiYofmIuc291cmNlSW5kZXh8fEMpLSh+YS5zb3VyY2VJbmRleHx8Qyk7aWYoZClyZXR1cm4gZDtpZihjKXdoaWxlKGM9Yy5uZXh0U2libGluZylpZihjPT09YilyZXR1cm4tMTtyZXR1cm4gYT8xOi0xfWZ1bmN0aW9uIG1hKGEpe3JldHVybiBmdW5jdGlvbihiKXt2YXIgYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PWMmJmIudHlwZT09PWF9fWZ1bmN0aW9uIG5hKGEpe3JldHVybiBmdW5jdGlvbihiKXt2YXIgYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuKCJpbnB1dCI9PT1jfHwiYnV0dG9uIj09PWMpJiZiLnR5cGU9PT1hfX1mdW5jdGlvbiBvYShhKXtyZXR1cm4gaWEoZnVuY3Rpb24oYil7cmV0dXJuIGI9K2IsaWEoZnVuY3Rpb24oYyxkKXt2YXIgZSxmPWEoW10sYy5sZW5ndGgsYiksZz1mLmxlbmd0aDt3aGlsZShnLS0pY1tlPWZbZ11dJiYoY1tlXT0hKGRbZV09Y1tlXSkpfSl9KX1mdW5jdGlvbiBwYShhKXtyZXR1cm4gYSYmInVuZGVmaW5lZCIhPXR5cGVvZiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lJiZhfWM9Z2Euc3VwcG9ydD17fSxmPWdhLmlzWE1MPWZ1bmN0aW9uKGEpe3ZhciBiPWEmJihhLm93bmVyRG9jdW1lbnR8fGEpLmRvY3VtZW50RWxlbWVudDtyZXR1cm4gYj8iSFRNTCIhPT1iLm5vZGVOYW1lOiExfSxtPWdhLnNldERvY3VtZW50PWZ1bmN0aW9uKGEpe3ZhciBiLGUsZz1hP2Eub3duZXJEb2N1bWVudHx8YTp2O3JldHVybiBnIT09biYmOT09PWcubm9kZVR5cGUmJmcuZG9jdW1lbnRFbGVtZW50PyhuPWcsbz1nLmRvY3VtZW50RWxlbWVudCxlPWcuZGVmYXVsdFZpZXcsZSYmZSE9PWUudG9wJiYoZS5hZGRFdmVudExpc3RlbmVyP2UuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixlYSwhMSk6ZS5hdHRhY2hFdmVudCYmZS5hdHRhY2hFdmVudCgib251bmxvYWQiLGVhKSkscD0hZihnKSxjLmF0dHJpYnV0ZXM9amEoZnVuY3Rpb24oYSl7cmV0dXJuIGEuY2xhc3NOYW1lPSJpIiwhYS5nZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIpfSksYy5nZXRFbGVtZW50c0J5VGFnTmFtZT1qYShmdW5jdGlvbihhKXtyZXR1cm4gYS5hcHBlbmRDaGlsZChnLmNyZWF0ZUNvbW1lbnQoIiIpKSwhYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLmxlbmd0aH0pLGMuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZT0kLnRlc3QoZy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKSxjLmdldEJ5SWQ9amEoZnVuY3Rpb24oYSl7cmV0dXJuIG8uYXBwZW5kQ2hpbGQoYSkuaWQ9dSwhZy5nZXRFbGVtZW50c0J5TmFtZXx8IWcuZ2V0RWxlbWVudHNCeU5hbWUodSkubGVuZ3RofSksYy5nZXRCeUlkPyhkLmZpbmQuSUQ9ZnVuY3Rpb24oYSxiKXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIGIuZ2V0RWxlbWVudEJ5SWQmJnApe3ZhciBjPWIuZ2V0RWxlbWVudEJ5SWQoYSk7cmV0dXJuIGMmJmMucGFyZW50Tm9kZT9bY106W119fSxkLmZpbHRlci5JRD1mdW5jdGlvbihhKXt2YXIgYj1hLnJlcGxhY2UoY2EsZGEpO3JldHVybiBmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoImlkIik9PT1ifX0pOihkZWxldGUgZC5maW5kLklELGQuZmlsdGVyLklEPWZ1bmN0aW9uKGEpe3ZhciBiPWEucmVwbGFjZShjYSxkYSk7cmV0dXJuIGZ1bmN0aW9uKGEpe3ZhciBjPSJ1bmRlZmluZWQiIT10eXBlb2YgYS5nZXRBdHRyaWJ1dGVOb2RlJiZhLmdldEF0dHJpYnV0ZU5vZGUoImlkIik7cmV0dXJuIGMmJmMudmFsdWU9PT1ifX0pLGQuZmluZC5UQUc9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZT9mdW5jdGlvbihhLGIpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgYi5nZXRFbGVtZW50c0J5VGFnTmFtZT9iLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpOmMucXNhP2IucXVlcnlTZWxlY3RvckFsbChhKTp2b2lkIDB9OmZ1bmN0aW9uKGEsYil7dmFyIGMsZD1bXSxlPTAsZj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpO2lmKCIqIj09PWEpe3doaWxlKGM9ZltlKytdKTE9PT1jLm5vZGVUeXBlJiZkLnB1c2goYyk7cmV0dXJuIGR9cmV0dXJuIGZ9LGQuZmluZC5DTEFTUz1jLmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJmZ1bmN0aW9uKGEsYil7cmV0dXJuIHA/Yi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGEpOnZvaWQgMH0scj1bXSxxPVtdLChjLnFzYT0kLnRlc3QoZy5xdWVyeVNlbGVjdG9yQWxsKSkmJihqYShmdW5jdGlvbihhKXtvLmFwcGVuZENoaWxkKGEpLmlubmVySFRNTD0iPGEgaWQ9JyIrdSsiJz48L2E+PHNlbGVjdCBpZD0nIit1KyItXGZdJyBtc2FsbG93Y2FwdHVyZT0nJz48b3B0aW9uIHNlbGVjdGVkPScnPjwvb3B0aW9uPjwvc2VsZWN0PiIsYS5xdWVyeVNlbGVjdG9yQWxsKCJbbXNhbGxvd2NhcHR1cmVePScnXSIpLmxlbmd0aCYmcS5wdXNoKCJbKl4kXT0iK0wrIiooPzonJ3xcIlwiKSIpLGEucXVlcnlTZWxlY3RvckFsbCgiW3NlbGVjdGVkXSIpLmxlbmd0aHx8cS5wdXNoKCJcXFsiK0wrIiooPzp2YWx1ZXwiK0srIikiKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIltpZH49Iit1KyItXSIpLmxlbmd0aHx8cS5wdXNoKCJ+PSIpLGEucXVlcnlTZWxlY3RvckFsbCgiOmNoZWNrZWQiKS5sZW5ndGh8fHEucHVzaCgiOmNoZWNrZWQiKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoImEjIit1KyIrKiIpLmxlbmd0aHx8cS5wdXNoKCIuIy4rWyt+XSIpfSksamEoZnVuY3Rpb24oYSl7dmFyIGI9Zy5jcmVhdGVFbGVtZW50KCJpbnB1dCIpO2Iuc2V0QXR0cmlidXRlKCJ0eXBlIiwiaGlkZGVuIiksYS5hcHBlbmRDaGlsZChiKS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJEIiksYS5xdWVyeVNlbGVjdG9yQWxsKCJbbmFtZT1kXSIpLmxlbmd0aCYmcS5wdXNoKCJuYW1lIitMKyIqWypeJHwhfl0/PSIpLGEucXVlcnlTZWxlY3RvckFsbCgiOmVuYWJsZWQiKS5sZW5ndGh8fHEucHVzaCgiOmVuYWJsZWQiLCI6ZGlzYWJsZWQiKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIiosOngiKSxxLnB1c2goIiwuKjoiKX0pKSwoYy5tYXRjaGVzU2VsZWN0b3I9JC50ZXN0KHM9by5tYXRjaGVzfHxvLndlYmtpdE1hdGNoZXNTZWxlY3Rvcnx8by5tb3pNYXRjaGVzU2VsZWN0b3J8fG8ub01hdGNoZXNTZWxlY3Rvcnx8by5tc01hdGNoZXNTZWxlY3RvcikpJiZqYShmdW5jdGlvbihhKXtjLmRpc2Nvbm5lY3RlZE1hdGNoPXMuY2FsbChhLCJkaXYiKSxzLmNhbGwoYSwiW3MhPScnXTp4Iiksci5wdXNoKCIhPSIsUCl9KSxxPXEubGVuZ3RoJiZuZXcgUmVnRXhwKHEuam9pbigifCIpKSxyPXIubGVuZ3RoJiZuZXcgUmVnRXhwKHIuam9pbigifCIpKSxiPSQudGVzdChvLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKSx0PWJ8fCQudGVzdChvLmNvbnRhaW5zKT9mdW5jdGlvbihhLGIpe3ZhciBjPTk9PT1hLm5vZGVUeXBlP2EuZG9jdW1lbnRFbGVtZW50OmEsZD1iJiZiLnBhcmVudE5vZGU7cmV0dXJuIGE9PT1kfHwhKCFkfHwxIT09ZC5ub2RlVHlwZXx8IShjLmNvbnRhaW5zP2MuY29udGFpbnMoZCk6YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiYmMTYmYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihkKSkpfTpmdW5jdGlvbihhLGIpe2lmKGIpd2hpbGUoYj1iLnBhcmVudE5vZGUpaWYoYj09PWEpcmV0dXJuITA7cmV0dXJuITF9LEI9Yj9mdW5jdGlvbihhLGIpe2lmKGE9PT1iKXJldHVybiBsPSEwLDA7dmFyIGQ9IWEuY29tcGFyZURvY3VtZW50UG9zaXRpb24tIWIuY29tcGFyZURvY3VtZW50UG9zaXRpb247cmV0dXJuIGQ/ZDooZD0oYS5vd25lckRvY3VtZW50fHxhKT09PShiLm93bmVyRG9jdW1lbnR8fGIpP2EuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYik6MSwxJmR8fCFjLnNvcnREZXRhY2hlZCYmYi5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihhKT09PWQ/YT09PWd8fGEub3duZXJEb2N1bWVudD09PXYmJnQodixhKT8tMTpiPT09Z3x8Yi5vd25lckRvY3VtZW50PT09diYmdCh2LGIpPzE6az9KKGssYSktSihrLGIpOjA6NCZkPy0xOjEpfTpmdW5jdGlvbihhLGIpe2lmKGE9PT1iKXJldHVybiBsPSEwLDA7dmFyIGMsZD0wLGU9YS5wYXJlbnROb2RlLGY9Yi5wYXJlbnROb2RlLGg9W2FdLGk9W2JdO2lmKCFlfHwhZilyZXR1cm4gYT09PWc/LTE6Yj09PWc/MTplPy0xOmY/MTprP0ooayxhKS1KKGssYik6MDtpZihlPT09ZilyZXR1cm4gbGEoYSxiKTtjPWE7d2hpbGUoYz1jLnBhcmVudE5vZGUpaC51bnNoaWZ0KGMpO2M9Yjt3aGlsZShjPWMucGFyZW50Tm9kZSlpLnVuc2hpZnQoYyk7d2hpbGUoaFtkXT09PWlbZF0pZCsrO3JldHVybiBkP2xhKGhbZF0saVtkXSk6aFtkXT09PXY/LTE6aVtkXT09PXY/MTowfSxnKTpufSxnYS5tYXRjaGVzPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGdhKGEsbnVsbCxudWxsLGIpfSxnYS5tYXRjaGVzU2VsZWN0b3I9ZnVuY3Rpb24oYSxiKXtpZigoYS5vd25lckRvY3VtZW50fHxhKSE9PW4mJm0oYSksYj1iLnJlcGxhY2UoVSwiPSckMSddIiksISghYy5tYXRjaGVzU2VsZWN0b3J8fCFwfHxyJiZyLnRlc3QoYil8fHEmJnEudGVzdChiKSkpdHJ5e3ZhciBkPXMuY2FsbChhLGIpO2lmKGR8fGMuZGlzY29ubmVjdGVkTWF0Y2h8fGEuZG9jdW1lbnQmJjExIT09YS5kb2N1bWVudC5ub2RlVHlwZSlyZXR1cm4gZH1jYXRjaChlKXt9cmV0dXJuIGdhKGIsbixudWxsLFthXSkubGVuZ3RoPjB9LGdhLmNvbnRhaW5zPWZ1bmN0aW9uKGEsYil7cmV0dXJuKGEub3duZXJEb2N1bWVudHx8YSkhPT1uJiZtKGEpLHQoYSxiKX0sZ2EuYXR0cj1mdW5jdGlvbihhLGIpeyhhLm93bmVyRG9jdW1lbnR8fGEpIT09biYmbShhKTt2YXIgZT1kLmF0dHJIYW5kbGVbYi50b0xvd2VyQ2FzZSgpXSxmPWUmJkQuY2FsbChkLmF0dHJIYW5kbGUsYi50b0xvd2VyQ2FzZSgpKT9lKGEsYiwhcCk6dm9pZCAwO3JldHVybiB2b2lkIDAhPT1mP2Y6Yy5hdHRyaWJ1dGVzfHwhcD9hLmdldEF0dHJpYnV0ZShiKTooZj1hLmdldEF0dHJpYnV0ZU5vZGUoYikpJiZmLnNwZWNpZmllZD9mLnZhbHVlOm51bGx9LGdhLmVycm9yPWZ1bmN0aW9uKGEpe3Rocm93IG5ldyBFcnJvcigiU3ludGF4IGVycm9yLCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbjogIithKX0sZ2EudW5pcXVlU29ydD1mdW5jdGlvbihhKXt2YXIgYixkPVtdLGU9MCxmPTA7aWYobD0hYy5kZXRlY3REdXBsaWNhdGVzLGs9IWMuc29ydFN0YWJsZSYmYS5zbGljZSgwKSxhLnNvcnQoQiksbCl7d2hpbGUoYj1hW2YrK10pYj09PWFbZl0mJihlPWQucHVzaChmKSk7d2hpbGUoZS0tKWEuc3BsaWNlKGRbZV0sMSl9cmV0dXJuIGs9bnVsbCxhfSxlPWdhLmdldFRleHQ9ZnVuY3Rpb24oYSl7dmFyIGIsYz0iIixkPTAsZj1hLm5vZGVUeXBlO2lmKGYpe2lmKDE9PT1mfHw5PT09Znx8MTE9PT1mKXtpZigic3RyaW5nIj09dHlwZW9mIGEudGV4dENvbnRlbnQpcmV0dXJuIGEudGV4dENvbnRlbnQ7Zm9yKGE9YS5maXJzdENoaWxkO2E7YT1hLm5leHRTaWJsaW5nKWMrPWUoYSl9ZWxzZSBpZigzPT09Znx8ND09PWYpcmV0dXJuIGEubm9kZVZhbHVlfWVsc2Ugd2hpbGUoYj1hW2QrK10pYys9ZShiKTtyZXR1cm4gY30sZD1nYS5zZWxlY3RvcnM9e2NhY2hlTGVuZ3RoOjUwLGNyZWF0ZVBzZXVkbzppYSxtYXRjaDpYLGF0dHJIYW5kbGU6e30sZmluZDp7fSxyZWxhdGl2ZTp7Ij4iOntkaXI6InBhcmVudE5vZGUiLGZpcnN0OiEwfSwiICI6e2RpcjoicGFyZW50Tm9kZSJ9LCIrIjp7ZGlyOiJwcmV2aW91c1NpYmxpbmciLGZpcnN0OiEwfSwifiI6e2RpcjoicHJldmlvdXNTaWJsaW5nIn19LHByZUZpbHRlcjp7QVRUUjpmdW5jdGlvbihhKXtyZXR1cm4gYVsxXT1hWzFdLnJlcGxhY2UoY2EsZGEpLGFbM109KGFbM118fGFbNF18fGFbNV18fCIiKS5yZXBsYWNlKGNhLGRhKSwifj0iPT09YVsyXSYmKGFbM109IiAiK2FbM10rIiAiKSxhLnNsaWNlKDAsNCl9LENISUxEOmZ1bmN0aW9uKGEpe3JldHVybiBhWzFdPWFbMV0udG9Mb3dlckNhc2UoKSwibnRoIj09PWFbMV0uc2xpY2UoMCwzKT8oYVszXXx8Z2EuZXJyb3IoYVswXSksYVs0XT0rKGFbNF0/YVs1XSsoYVs2XXx8MSk6MiooImV2ZW4iPT09YVszXXx8Im9kZCI9PT1hWzNdKSksYVs1XT0rKGFbN10rYVs4XXx8Im9kZCI9PT1hWzNdKSk6YVszXSYmZ2EuZXJyb3IoYVswXSksYX0sUFNFVURPOmZ1bmN0aW9uKGEpe3ZhciBiLGM9IWFbNl0mJmFbMl07cmV0dXJuIFguQ0hJTEQudGVzdChhWzBdKT9udWxsOihhWzNdP2FbMl09YVs0XXx8YVs1XXx8IiI6YyYmVi50ZXN0KGMpJiYoYj1nKGMsITApKSYmKGI9Yy5pbmRleE9mKCIpIixjLmxlbmd0aC1iKS1jLmxlbmd0aCkmJihhWzBdPWFbMF0uc2xpY2UoMCxiKSxhWzJdPWMuc2xpY2UoMCxiKSksYS5zbGljZSgwLDMpKX19LGZpbHRlcjp7VEFHOmZ1bmN0aW9uKGEpe3ZhciBiPWEucmVwbGFjZShjYSxkYSkudG9Mb3dlckNhc2UoKTtyZXR1cm4iKiI9PT1hP2Z1bmN0aW9uKCl7cmV0dXJuITB9OmZ1bmN0aW9uKGEpe3JldHVybiBhLm5vZGVOYW1lJiZhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1ifX0sQ0xBU1M6ZnVuY3Rpb24oYSl7dmFyIGI9eVthKyIgIl07cmV0dXJuIGJ8fChiPW5ldyBSZWdFeHAoIihefCIrTCsiKSIrYSsiKCIrTCsifCQpIikpJiZ5KGEsZnVuY3Rpb24oYSl7cmV0dXJuIGIudGVzdCgic3RyaW5nIj09dHlwZW9mIGEuY2xhc3NOYW1lJiZhLmNsYXNzTmFtZXx8InVuZGVmaW5lZCIhPXR5cGVvZiBhLmdldEF0dHJpYnV0ZSYmYS5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiKX0pfSxBVFRSOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gZnVuY3Rpb24oZCl7dmFyIGU9Z2EuYXR0cihkLGEpO3JldHVybiBudWxsPT1lPyIhPSI9PT1iOmI/KGUrPSIiLCI9Ij09PWI/ZT09PWM6IiE9Ij09PWI/ZSE9PWM6Il49Ij09PWI/YyYmMD09PWUuaW5kZXhPZihjKToiKj0iPT09Yj9jJiZlLmluZGV4T2YoYyk+LTE6IiQ9Ij09PWI/YyYmZS5zbGljZSgtYy5sZW5ndGgpPT09Yzoifj0iPT09Yj8oIiAiK2UucmVwbGFjZShRLCIgIikrIiAiKS5pbmRleE9mKGMpPi0xOiJ8PSI9PT1iP2U9PT1jfHxlLnNsaWNlKDAsYy5sZW5ndGgrMSk9PT1jKyItIjohMSk6ITB9fSxDSElMRDpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPSJudGgiIT09YS5zbGljZSgwLDMpLGc9Imxhc3QiIT09YS5zbGljZSgtNCksaD0ib2YtdHlwZSI9PT1iO3JldHVybiAxPT09ZCYmMD09PWU/ZnVuY3Rpb24oYSl7cmV0dXJuISFhLnBhcmVudE5vZGV9OmZ1bmN0aW9uKGIsYyxpKXt2YXIgaixrLGwsbSxuLG8scD1mIT09Zz8ibmV4dFNpYmxpbmciOiJwcmV2aW91c1NpYmxpbmciLHE9Yi5wYXJlbnROb2RlLHI9aCYmYi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLHM9IWkmJiFoO2lmKHEpe2lmKGYpe3doaWxlKHApe2w9Yjt3aGlsZShsPWxbcF0paWYoaD9sLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1yOjE9PT1sLm5vZGVUeXBlKXJldHVybiExO289cD0ib25seSI9PT1hJiYhbyYmIm5leHRTaWJsaW5nIn1yZXR1cm4hMH1pZihvPVtnP3EuZmlyc3RDaGlsZDpxLmxhc3RDaGlsZF0sZyYmcyl7az1xW3VdfHwocVt1XT17fSksaj1rW2FdfHxbXSxuPWpbMF09PT13JiZqWzFdLG09alswXT09PXcmJmpbMl0sbD1uJiZxLmNoaWxkTm9kZXNbbl07d2hpbGUobD0rK24mJmwmJmxbcF18fChtPW49MCl8fG8ucG9wKCkpaWYoMT09PWwubm9kZVR5cGUmJisrbSYmbD09PWIpe2tbYV09W3csbixtXTticmVha319ZWxzZSBpZihzJiYoaj0oYlt1XXx8KGJbdV09e30pKVthXSkmJmpbMF09PT13KW09alsxXTtlbHNlIHdoaWxlKGw9KytuJiZsJiZsW3BdfHwobT1uPTApfHxvLnBvcCgpKWlmKChoP2wubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXI6MT09PWwubm9kZVR5cGUpJiYrK20mJihzJiYoKGxbdV18fChsW3VdPXt9KSlbYV09W3csbV0pLGw9PT1iKSlicmVhaztyZXR1cm4gbS09ZSxtPT09ZHx8bSVkPT09MCYmbS9kPj0wfX19LFBTRVVETzpmdW5jdGlvbihhLGIpe3ZhciBjLGU9ZC5wc2V1ZG9zW2FdfHxkLnNldEZpbHRlcnNbYS50b0xvd2VyQ2FzZSgpXXx8Z2EuZXJyb3IoInVuc3VwcG9ydGVkIHBzZXVkbzogIithKTtyZXR1cm4gZVt1XT9lKGIpOmUubGVuZ3RoPjE/KGM9W2EsYSwiIixiXSxkLnNldEZpbHRlcnMuaGFzT3duUHJvcGVydHkoYS50b0xvd2VyQ2FzZSgpKT9pYShmdW5jdGlvbihhLGMpe3ZhciBkLGY9ZShhLGIpLGc9Zi5sZW5ndGg7d2hpbGUoZy0tKWQ9SihhLGZbZ10pLGFbZF09IShjW2RdPWZbZ10pfSk6ZnVuY3Rpb24oYSl7cmV0dXJuIGUoYSwwLGMpfSk6ZX19LHBzZXVkb3M6e25vdDppYShmdW5jdGlvbihhKXt2YXIgYj1bXSxjPVtdLGQ9aChhLnJlcGxhY2UoUiwiJDEiKSk7cmV0dXJuIGRbdV0/aWEoZnVuY3Rpb24oYSxiLGMsZSl7dmFyIGYsZz1kKGEsbnVsbCxlLFtdKSxoPWEubGVuZ3RoO3doaWxlKGgtLSkoZj1nW2hdKSYmKGFbaF09IShiW2hdPWYpKX0pOmZ1bmN0aW9uKGEsZSxmKXtyZXR1cm4gYlswXT1hLGQoYixudWxsLGYsYyksYlswXT1udWxsLCFjLnBvcCgpfX0pLGhhczppYShmdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oYil7cmV0dXJuIGdhKGEsYikubGVuZ3RoPjB9fSksY29udGFpbnM6aWEoZnVuY3Rpb24oYSl7cmV0dXJuIGE9YS5yZXBsYWNlKGNhLGRhKSxmdW5jdGlvbihiKXtyZXR1cm4oYi50ZXh0Q29udGVudHx8Yi5pbm5lclRleHR8fGUoYikpLmluZGV4T2YoYSk+LTF9fSksbGFuZzppYShmdW5jdGlvbihhKXtyZXR1cm4gVy50ZXN0KGF8fCIiKXx8Z2EuZXJyb3IoInVuc3VwcG9ydGVkIGxhbmc6ICIrYSksYT1hLnJlcGxhY2UoY2EsZGEpLnRvTG93ZXJDYXNlKCksZnVuY3Rpb24oYil7dmFyIGM7ZG8gaWYoYz1wP2IubGFuZzpiLmdldEF0dHJpYnV0ZSgieG1sOmxhbmciKXx8Yi5nZXRBdHRyaWJ1dGUoImxhbmciKSlyZXR1cm4gYz1jLnRvTG93ZXJDYXNlKCksYz09PWF8fDA9PT1jLmluZGV4T2YoYSsiLSIpO3doaWxlKChiPWIucGFyZW50Tm9kZSkmJjE9PT1iLm5vZGVUeXBlKTtyZXR1cm4hMX19KSx0YXJnZXQ6ZnVuY3Rpb24oYil7dmFyIGM9YS5sb2NhdGlvbiYmYS5sb2NhdGlvbi5oYXNoO3JldHVybiBjJiZjLnNsaWNlKDEpPT09Yi5pZH0scm9vdDpmdW5jdGlvbihhKXtyZXR1cm4gYT09PW99LGZvY3VzOmZ1bmN0aW9uKGEpe3JldHVybiBhPT09bi5hY3RpdmVFbGVtZW50JiYoIW4uaGFzRm9jdXN8fG4uaGFzRm9jdXMoKSkmJiEhKGEudHlwZXx8YS5ocmVmfHx+YS50YWJJbmRleCl9LGVuYWJsZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZGlzYWJsZWQ9PT0hMX0sZGlzYWJsZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZGlzYWJsZWQ9PT0hMH0sY2hlY2tlZDpmdW5jdGlvbihhKXt2YXIgYj1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PWImJiEhYS5jaGVja2VkfHwib3B0aW9uIj09PWImJiEhYS5zZWxlY3RlZH0sc2VsZWN0ZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEucGFyZW50Tm9kZSYmYS5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgsYS5zZWxlY3RlZD09PSEwfSxlbXB0eTpmdW5jdGlvbihhKXtmb3IoYT1hLmZpcnN0Q2hpbGQ7YTthPWEubmV4dFNpYmxpbmcpaWYoYS5ub2RlVHlwZTw2KXJldHVybiExO3JldHVybiEwfSxwYXJlbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIWQucHNldWRvcy5lbXB0eShhKX0saGVhZGVyOmZ1bmN0aW9uKGEpe3JldHVybiBaLnRlc3QoYS5ub2RlTmFtZSl9LGlucHV0OmZ1bmN0aW9uKGEpe3JldHVybiBZLnRlc3QoYS5ub2RlTmFtZSl9LGJ1dHRvbjpmdW5jdGlvbihhKXt2YXIgYj1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PWImJiJidXR0b24iPT09YS50eXBlfHwiYnV0dG9uIj09PWJ9LHRleHQ6ZnVuY3Rpb24oYSl7dmFyIGI7cmV0dXJuImlucHV0Ij09PWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYmInRleHQiPT09YS50eXBlJiYobnVsbD09KGI9YS5nZXRBdHRyaWJ1dGUoInR5cGUiKSl8fCJ0ZXh0Ij09PWIudG9Mb3dlckNhc2UoKSl9LGZpcnN0Om9hKGZ1bmN0aW9uKCl7cmV0dXJuWzBdfSksbGFzdDpvYShmdW5jdGlvbihhLGIpe3JldHVybltiLTFdfSksZXE6b2EoZnVuY3Rpb24oYSxiLGMpe3JldHVyblswPmM/YytiOmNdfSksZXZlbjpvYShmdW5jdGlvbihhLGIpe2Zvcih2YXIgYz0wO2I+YztjKz0yKWEucHVzaChjKTtyZXR1cm4gYX0pLG9kZDpvYShmdW5jdGlvbihhLGIpe2Zvcih2YXIgYz0xO2I+YztjKz0yKWEucHVzaChjKTtyZXR1cm4gYX0pLGx0Om9hKGZ1bmN0aW9uKGEsYixjKXtmb3IodmFyIGQ9MD5jP2MrYjpjOy0tZD49MDspYS5wdXNoKGQpO3JldHVybiBhfSksZ3Q6b2EoZnVuY3Rpb24oYSxiLGMpe2Zvcih2YXIgZD0wPmM/YytiOmM7KytkPGI7KWEucHVzaChkKTtyZXR1cm4gYX0pfX0sZC5wc2V1ZG9zLm50aD1kLnBzZXVkb3MuZXE7Zm9yKGIgaW57cmFkaW86ITAsY2hlY2tib3g6ITAsZmlsZTohMCxwYXNzd29yZDohMCxpbWFnZTohMH0pZC5wc2V1ZG9zW2JdPW1hKGIpO2ZvcihiIGlue3N1Ym1pdDohMCxyZXNldDohMH0pZC5wc2V1ZG9zW2JdPW5hKGIpO2Z1bmN0aW9uIHFhKCl7fXFhLnByb3RvdHlwZT1kLmZpbHRlcnM9ZC5wc2V1ZG9zLGQuc2V0RmlsdGVycz1uZXcgcWEsZz1nYS50b2tlbml6ZT1mdW5jdGlvbihhLGIpe3ZhciBjLGUsZixnLGgsaSxqLGs9elthKyIgIl07aWYoaylyZXR1cm4gYj8wOmsuc2xpY2UoMCk7aD1hLGk9W10saj1kLnByZUZpbHRlcjt3aGlsZShoKXsoIWN8fChlPVMuZXhlYyhoKSkpJiYoZSYmKGg9aC5zbGljZShlWzBdLmxlbmd0aCl8fGgpLGkucHVzaChmPVtdKSksYz0hMSwoZT1ULmV4ZWMoaCkpJiYoYz1lLnNoaWZ0KCksZi5wdXNoKHt2YWx1ZTpjLHR5cGU6ZVswXS5yZXBsYWNlKFIsIiAiKX0pLGg9aC5zbGljZShjLmxlbmd0aCkpO2ZvcihnIGluIGQuZmlsdGVyKSEoZT1YW2ddLmV4ZWMoaCkpfHxqW2ddJiYhKGU9altnXShlKSl8fChjPWUuc2hpZnQoKSxmLnB1c2goe3ZhbHVlOmMsdHlwZTpnLG1hdGNoZXM6ZX0pLGg9aC5zbGljZShjLmxlbmd0aCkpO2lmKCFjKWJyZWFrfXJldHVybiBiP2gubGVuZ3RoOmg/Z2EuZXJyb3IoYSk6eihhLGkpLnNsaWNlKDApfTtmdW5jdGlvbiByYShhKXtmb3IodmFyIGI9MCxjPWEubGVuZ3RoLGQ9IiI7Yz5iO2IrKylkKz1hW2JdLnZhbHVlO3JldHVybiBkfWZ1bmN0aW9uIHNhKGEsYixjKXt2YXIgZD1iLmRpcixlPWMmJiJwYXJlbnROb2RlIj09PWQsZj14Kys7cmV0dXJuIGIuZmlyc3Q/ZnVuY3Rpb24oYixjLGYpe3doaWxlKGI9YltkXSlpZigxPT09Yi5ub2RlVHlwZXx8ZSlyZXR1cm4gYShiLGMsZil9OmZ1bmN0aW9uKGIsYyxnKXt2YXIgaCxpLGo9W3csZl07aWYoZyl7d2hpbGUoYj1iW2RdKWlmKCgxPT09Yi5ub2RlVHlwZXx8ZSkmJmEoYixjLGcpKXJldHVybiEwfWVsc2Ugd2hpbGUoYj1iW2RdKWlmKDE9PT1iLm5vZGVUeXBlfHxlKXtpZihpPWJbdV18fChiW3VdPXt9KSwoaD1pW2RdKSYmaFswXT09PXcmJmhbMV09PT1mKXJldHVybiBqWzJdPWhbMl07aWYoaVtkXT1qLGpbMl09YShiLGMsZykpcmV0dXJuITB9fX1mdW5jdGlvbiB0YShhKXtyZXR1cm4gYS5sZW5ndGg+MT9mdW5jdGlvbihiLGMsZCl7dmFyIGU9YS5sZW5ndGg7d2hpbGUoZS0tKWlmKCFhW2VdKGIsYyxkKSlyZXR1cm4hMTtyZXR1cm4hMH06YVswXX1mdW5jdGlvbiB1YShhLGIsYyl7Zm9yKHZhciBkPTAsZT1iLmxlbmd0aDtlPmQ7ZCsrKWdhKGEsYltkXSxjKTtyZXR1cm4gY31mdW5jdGlvbiB2YShhLGIsYyxkLGUpe2Zvcih2YXIgZixnPVtdLGg9MCxpPWEubGVuZ3RoLGo9bnVsbCE9YjtpPmg7aCsrKShmPWFbaF0pJiYoIWN8fGMoZixkLGUpKSYmKGcucHVzaChmKSxqJiZiLnB1c2goaCkpO3JldHVybiBnfWZ1bmN0aW9uIHdhKGEsYixjLGQsZSxmKXtyZXR1cm4gZCYmIWRbdV0mJihkPXdhKGQpKSxlJiYhZVt1XSYmKGU9d2EoZSxmKSksaWEoZnVuY3Rpb24oZixnLGgsaSl7dmFyIGosayxsLG09W10sbj1bXSxvPWcubGVuZ3RoLHA9Znx8dWEoYnx8IioiLGgubm9kZVR5cGU/W2hdOmgsW10pLHE9IWF8fCFmJiZiP3A6dmEocCxtLGEsaCxpKSxyPWM/ZXx8KGY/YTpvfHxkKT9bXTpnOnE7aWYoYyYmYyhxLHIsaCxpKSxkKXtqPXZhKHIsbiksZChqLFtdLGgsaSksaz1qLmxlbmd0aDt3aGlsZShrLS0pKGw9altrXSkmJihyW25ba11dPSEocVtuW2tdXT1sKSl9aWYoZil7aWYoZXx8YSl7aWYoZSl7aj1bXSxrPXIubGVuZ3RoO3doaWxlKGstLSkobD1yW2tdKSYmai5wdXNoKHFba109bCk7ZShudWxsLHI9W10saixpKX1rPXIubGVuZ3RoO3doaWxlKGstLSkobD1yW2tdKSYmKGo9ZT9KKGYsbCk6bVtrXSk+LTEmJihmW2pdPSEoZ1tqXT1sKSl9fWVsc2Ugcj12YShyPT09Zz9yLnNwbGljZShvLHIubGVuZ3RoKTpyKSxlP2UobnVsbCxnLHIsaSk6SC5hcHBseShnLHIpfSl9ZnVuY3Rpb24geGEoYSl7Zm9yKHZhciBiLGMsZSxmPWEubGVuZ3RoLGc9ZC5yZWxhdGl2ZVthWzBdLnR5cGVdLGg9Z3x8ZC5yZWxhdGl2ZVsiICJdLGk9Zz8xOjAsaz1zYShmdW5jdGlvbihhKXtyZXR1cm4gYT09PWJ9LGgsITApLGw9c2EoZnVuY3Rpb24oYSl7cmV0dXJuIEooYixhKT4tMX0saCwhMCksbT1bZnVuY3Rpb24oYSxjLGQpe3ZhciBlPSFnJiYoZHx8YyE9PWopfHwoKGI9Yykubm9kZVR5cGU/ayhhLGMsZCk6bChhLGMsZCkpO3JldHVybiBiPW51bGwsZX1dO2Y+aTtpKyspaWYoYz1kLnJlbGF0aXZlW2FbaV0udHlwZV0pbT1bc2EodGEobSksYyldO2Vsc2V7aWYoYz1kLmZpbHRlclthW2ldLnR5cGVdLmFwcGx5KG51bGwsYVtpXS5tYXRjaGVzKSxjW3VdKXtmb3IoZT0rK2k7Zj5lO2UrKylpZihkLnJlbGF0aXZlW2FbZV0udHlwZV0pYnJlYWs7cmV0dXJuIHdhKGk+MSYmdGEobSksaT4xJiZyYShhLnNsaWNlKDAsaS0xKS5jb25jYXQoe3ZhbHVlOiIgIj09PWFbaS0yXS50eXBlPyIqIjoiIn0pKS5yZXBsYWNlKFIsIiQxIiksYyxlPmkmJnhhKGEuc2xpY2UoaSxlKSksZj5lJiZ4YShhPWEuc2xpY2UoZSkpLGY+ZSYmcmEoYSkpfW0ucHVzaChjKX1yZXR1cm4gdGEobSl9ZnVuY3Rpb24geWEoYSxiKXt2YXIgYz1iLmxlbmd0aD4wLGU9YS5sZW5ndGg+MCxmPWZ1bmN0aW9uKGYsZyxoLGksayl7dmFyIGwsbSxvLHA9MCxxPSIwIixyPWYmJltdLHM9W10sdD1qLHU9Znx8ZSYmZC5maW5kLlRBRygiKiIsayksdj13Kz1udWxsPT10PzE6TWF0aC5yYW5kb20oKXx8LjEseD11Lmxlbmd0aDtmb3IoayYmKGo9ZyE9PW4mJmcpO3EhPT14JiZudWxsIT0obD11W3FdKTtxKyspe2lmKGUmJmwpe209MDt3aGlsZShvPWFbbSsrXSlpZihvKGwsZyxoKSl7aS5wdXNoKGwpO2JyZWFrfWsmJih3PXYpfWMmJigobD0hbyYmbCkmJnAtLSxmJiZyLnB1c2gobCkpfWlmKHArPXEsYyYmcSE9PXApe209MDt3aGlsZShvPWJbbSsrXSlvKHIscyxnLGgpO2lmKGYpe2lmKHA+MCl3aGlsZShxLS0pcltxXXx8c1txXXx8KHNbcV09Ri5jYWxsKGkpKTtzPXZhKHMpfUguYXBwbHkoaSxzKSxrJiYhZiYmcy5sZW5ndGg+MCYmcCtiLmxlbmd0aD4xJiZnYS51bmlxdWVTb3J0KGkpfXJldHVybiBrJiYodz12LGo9dCkscn07cmV0dXJuIGM/aWEoZik6Zn1yZXR1cm4gaD1nYS5jb21waWxlPWZ1bmN0aW9uKGEsYil7dmFyIGMsZD1bXSxlPVtdLGY9QVthKyIgIl07aWYoIWYpe2J8fChiPWcoYSkpLGM9Yi5sZW5ndGg7d2hpbGUoYy0tKWY9eGEoYltjXSksZlt1XT9kLnB1c2goZik6ZS5wdXNoKGYpO2Y9QShhLHlhKGUsZCkpLGYuc2VsZWN0b3I9YX1yZXR1cm4gZn0saT1nYS5zZWxlY3Q9ZnVuY3Rpb24oYSxiLGUsZil7dmFyIGksaixrLGwsbSxuPSJmdW5jdGlvbiI9PXR5cGVvZiBhJiZhLG89IWYmJmcoYT1uLnNlbGVjdG9yfHxhKTtpZihlPWV8fFtdLDE9PT1vLmxlbmd0aCl7aWYoaj1vWzBdPW9bMF0uc2xpY2UoMCksai5sZW5ndGg+MiYmIklEIj09PShrPWpbMF0pLnR5cGUmJmMuZ2V0QnlJZCYmOT09PWIubm9kZVR5cGUmJnAmJmQucmVsYXRpdmVbalsxXS50eXBlXSl7aWYoYj0oZC5maW5kLklEKGsubWF0Y2hlc1swXS5yZXBsYWNlKGNhLGRhKSxiKXx8W10pWzBdLCFiKXJldHVybiBlO24mJihiPWIucGFyZW50Tm9kZSksYT1hLnNsaWNlKGouc2hpZnQoKS52YWx1ZS5sZW5ndGgpfWk9WC5uZWVkc0NvbnRleHQudGVzdChhKT8wOmoubGVuZ3RoO3doaWxlKGktLSl7aWYoaz1qW2ldLGQucmVsYXRpdmVbbD1rLnR5cGVdKWJyZWFrO2lmKChtPWQuZmluZFtsXSkmJihmPW0oay5tYXRjaGVzWzBdLnJlcGxhY2UoY2EsZGEpLGFhLnRlc3QoalswXS50eXBlKSYmcGEoYi5wYXJlbnROb2RlKXx8YikpKXtpZihqLnNwbGljZShpLDEpLGE9Zi5sZW5ndGgmJnJhKGopLCFhKXJldHVybiBILmFwcGx5KGUsZiksZTticmVha319fXJldHVybihufHxoKGEsbykpKGYsYiwhcCxlLGFhLnRlc3QoYSkmJnBhKGIucGFyZW50Tm9kZSl8fGIpLGV9LGMuc29ydFN0YWJsZT11LnNwbGl0KCIiKS5zb3J0KEIpLmpvaW4oIiIpPT09dSxjLmRldGVjdER1cGxpY2F0ZXM9ISFsLG0oKSxjLnNvcnREZXRhY2hlZD1qYShmdW5jdGlvbihhKXtyZXR1cm4gMSZhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKG4uY3JlYXRlRWxlbWVudCgiZGl2IikpfSksamEoZnVuY3Rpb24oYSl7cmV0dXJuIGEuaW5uZXJIVE1MPSI8YSBocmVmPScjJz48L2E+IiwiIyI9PT1hLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIil9KXx8a2EoInR5cGV8aHJlZnxoZWlnaHR8d2lkdGgiLGZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gYz92b2lkIDA6YS5nZXRBdHRyaWJ1dGUoYiwidHlwZSI9PT1iLnRvTG93ZXJDYXNlKCk/MToyKX0pLGMuYXR0cmlidXRlcyYmamEoZnVuY3Rpb24oYSl7cmV0dXJuIGEuaW5uZXJIVE1MPSI8aW5wdXQvPiIsYS5maXJzdENoaWxkLnNldEF0dHJpYnV0ZSgidmFsdWUiLCIiKSwiIj09PWEuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoInZhbHVlIil9KXx8a2EoInZhbHVlIixmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGN8fCJpbnB1dCIhPT1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk/dm9pZCAwOmEuZGVmYXVsdFZhbHVlfSksamEoZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PWEuZ2V0QXR0cmlidXRlKCJkaXNhYmxlZCIpfSl8fGthKEssZnVuY3Rpb24oYSxiLGMpe3ZhciBkO3JldHVybiBjP3ZvaWQgMDphW2JdPT09ITA/Yi50b0xvd2VyQ2FzZSgpOihkPWEuZ2V0QXR0cmlidXRlTm9kZShiKSkmJmQuc3BlY2lmaWVkP2QudmFsdWU6bnVsbH0pLGdhfShhKTttLmZpbmQ9cyxtLmV4cHI9cy5zZWxlY3RvcnMsbS5leHByWyI6Il09bS5leHByLnBzZXVkb3MsbS51bmlxdWU9cy51bmlxdWVTb3J0LG0udGV4dD1zLmdldFRleHQsbS5pc1hNTERvYz1zLmlzWE1MLG0uY29udGFpbnM9cy5jb250YWluczt2YXIgdD1tLmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LHU9L148KFx3KylccypcLz8+KD86PFwvXDE+fCkkLyx2PS9eLlteOiNcW1wuLF0qJC87ZnVuY3Rpb24gdyhhLGIsYyl7aWYobS5pc0Z1bmN0aW9uKGIpKXJldHVybiBtLmdyZXAoYSxmdW5jdGlvbihhLGQpe3JldHVybiEhYi5jYWxsKGEsZCxhKSE9PWN9KTtpZihiLm5vZGVUeXBlKXJldHVybiBtLmdyZXAoYSxmdW5jdGlvbihhKXtyZXR1cm4gYT09PWIhPT1jfSk7aWYoInN0cmluZyI9PXR5cGVvZiBiKXtpZih2LnRlc3QoYikpcmV0dXJuIG0uZmlsdGVyKGIsYSxjKTtiPW0uZmlsdGVyKGIsYSl9cmV0dXJuIG0uZ3JlcChhLGZ1bmN0aW9uKGEpe3JldHVybiBtLmluQXJyYXkoYSxiKT49MCE9PWN9KX1tLmZpbHRlcj1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YlswXTtyZXR1cm4gYyYmKGE9Ijpub3QoIithKyIpIiksMT09PWIubGVuZ3RoJiYxPT09ZC5ub2RlVHlwZT9tLmZpbmQubWF0Y2hlc1NlbGVjdG9yKGQsYSk/W2RdOltdOm0uZmluZC5tYXRjaGVzKGEsbS5ncmVwKGIsZnVuY3Rpb24oYSl7cmV0dXJuIDE9PT1hLm5vZGVUeXBlfSkpfSxtLmZuLmV4dGVuZCh7ZmluZDpmdW5jdGlvbihhKXt2YXIgYixjPVtdLGQ9dGhpcyxlPWQubGVuZ3RoO2lmKCJzdHJpbmciIT10eXBlb2YgYSlyZXR1cm4gdGhpcy5wdXNoU3RhY2sobShhKS5maWx0ZXIoZnVuY3Rpb24oKXtmb3IoYj0wO2U+YjtiKyspaWYobS5jb250YWlucyhkW2JdLHRoaXMpKXJldHVybiEwfSkpO2ZvcihiPTA7ZT5iO2IrKyltLmZpbmQoYSxkW2JdLGMpO3JldHVybiBjPXRoaXMucHVzaFN0YWNrKGU+MT9tLnVuaXF1ZShjKTpjKSxjLnNlbGVjdG9yPXRoaXMuc2VsZWN0b3I/dGhpcy5zZWxlY3RvcisiICIrYTphLGN9LGZpbHRlcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2sodyh0aGlzLGF8fFtdLCExKSl9LG5vdDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2sodyh0aGlzLGF8fFtdLCEwKSl9LGlzOmZ1bmN0aW9uKGEpe3JldHVybiEhdyh0aGlzLCJzdHJpbmciPT10eXBlb2YgYSYmdC50ZXN0KGEpP20oYSk6YXx8W10sITEpLmxlbmd0aH19KTt2YXIgeCx5PWEuZG9jdW1lbnQsej0vXig/OlxzKig8W1x3XFddKz4pW14+XSp8IyhbXHctXSopKSQvLEE9bS5mbi5pbml0PWZ1bmN0aW9uKGEsYil7dmFyIGMsZDtpZighYSlyZXR1cm4gdGhpcztpZigic3RyaW5nIj09dHlwZW9mIGEpe2lmKGM9IjwiPT09YS5jaGFyQXQoMCkmJiI+Ij09PWEuY2hhckF0KGEubGVuZ3RoLTEpJiZhLmxlbmd0aD49Mz9bbnVsbCxhLG51bGxdOnouZXhlYyhhKSwhY3x8IWNbMV0mJmIpcmV0dXJuIWJ8fGIuanF1ZXJ5PyhifHx4KS5maW5kKGEpOnRoaXMuY29uc3RydWN0b3IoYikuZmluZChhKTtpZihjWzFdKXtpZihiPWIgaW5zdGFuY2VvZiBtP2JbMF06YixtLm1lcmdlKHRoaXMsbS5wYXJzZUhUTUwoY1sxXSxiJiZiLm5vZGVUeXBlP2Iub3duZXJEb2N1bWVudHx8Yjp5LCEwKSksdS50ZXN0KGNbMV0pJiZtLmlzUGxhaW5PYmplY3QoYikpZm9yKGMgaW4gYiltLmlzRnVuY3Rpb24odGhpc1tjXSk/dGhpc1tjXShiW2NdKTp0aGlzLmF0dHIoYyxiW2NdKTtyZXR1cm4gdGhpc31pZihkPXkuZ2V0RWxlbWVudEJ5SWQoY1syXSksZCYmZC5wYXJlbnROb2RlKXtpZihkLmlkIT09Y1syXSlyZXR1cm4geC5maW5kKGEpO3RoaXMubGVuZ3RoPTEsdGhpc1swXT1kfXJldHVybiB0aGlzLmNvbnRleHQ9eSx0aGlzLnNlbGVjdG9yPWEsdGhpc31yZXR1cm4gYS5ub2RlVHlwZT8odGhpcy5jb250ZXh0PXRoaXNbMF09YSx0aGlzLmxlbmd0aD0xLHRoaXMpOm0uaXNGdW5jdGlvbihhKT8idW5kZWZpbmVkIiE9dHlwZW9mIHgucmVhZHk/eC5yZWFkeShhKTphKG0pOih2b2lkIDAhPT1hLnNlbGVjdG9yJiYodGhpcy5zZWxlY3Rvcj1hLnNlbGVjdG9yLHRoaXMuY29udGV4dD1hLmNvbnRleHQpLG0ubWFrZUFycmF5KGEsdGhpcykpfTtBLnByb3RvdHlwZT1tLmZuLHg9bSh5KTt2YXIgQj0vXig/OnBhcmVudHN8cHJldig/OlVudGlsfEFsbCkpLyxDPXtjaGlsZHJlbjohMCxjb250ZW50czohMCxuZXh0OiEwLHByZXY6ITB9O20uZXh0ZW5kKHtkaXI6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPVtdLGU9YVtiXTt3aGlsZShlJiY5IT09ZS5ub2RlVHlwZSYmKHZvaWQgMD09PWN8fDEhPT1lLm5vZGVUeXBlfHwhbShlKS5pcyhjKSkpMT09PWUubm9kZVR5cGUmJmQucHVzaChlKSxlPWVbYl07cmV0dXJuIGR9LHNpYmxpbmc6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9W107YTthPWEubmV4dFNpYmxpbmcpMT09PWEubm9kZVR5cGUmJmEhPT1iJiZjLnB1c2goYSk7cmV0dXJuIGN9fSksbS5mbi5leHRlbmQoe2hhczpmdW5jdGlvbihhKXt2YXIgYixjPW0oYSx0aGlzKSxkPWMubGVuZ3RoO3JldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpe2ZvcihiPTA7ZD5iO2IrKylpZihtLmNvbnRhaW5zKHRoaXMsY1tiXSkpcmV0dXJuITB9KX0sY2xvc2VzdDpmdW5jdGlvbihhLGIpe2Zvcih2YXIgYyxkPTAsZT10aGlzLmxlbmd0aCxmPVtdLGc9dC50ZXN0KGEpfHwic3RyaW5nIiE9dHlwZW9mIGE/bShhLGJ8fHRoaXMuY29udGV4dCk6MDtlPmQ7ZCsrKWZvcihjPXRoaXNbZF07YyYmYyE9PWI7Yz1jLnBhcmVudE5vZGUpaWYoYy5ub2RlVHlwZTwxMSYmKGc/Zy5pbmRleChjKT4tMToxPT09Yy5ub2RlVHlwZSYmbS5maW5kLm1hdGNoZXNTZWxlY3RvcihjLGEpKSl7Zi5wdXNoKGMpO2JyZWFrfXJldHVybiB0aGlzLnB1c2hTdGFjayhmLmxlbmd0aD4xP20udW5pcXVlKGYpOmYpfSxpbmRleDpmdW5jdGlvbihhKXtyZXR1cm4gYT8ic3RyaW5nIj09dHlwZW9mIGE/bS5pbkFycmF5KHRoaXNbMF0sbShhKSk6bS5pbkFycmF5KGEuanF1ZXJ5P2FbMF06YSx0aGlzKTp0aGlzWzBdJiZ0aGlzWzBdLnBhcmVudE5vZGU/dGhpcy5maXJzdCgpLnByZXZBbGwoKS5sZW5ndGg6LTF9LGFkZDpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLnB1c2hTdGFjayhtLnVuaXF1ZShtLm1lcmdlKHRoaXMuZ2V0KCksbShhLGIpKSkpfSxhZGRCYWNrOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmFkZChudWxsPT1hP3RoaXMucHJldk9iamVjdDp0aGlzLnByZXZPYmplY3QuZmlsdGVyKGEpKX19KTtmdW5jdGlvbiBEKGEsYil7ZG8gYT1hW2JdO3doaWxlKGEmJjEhPT1hLm5vZGVUeXBlKTtyZXR1cm4gYX1tLmVhY2goe3BhcmVudDpmdW5jdGlvbihhKXt2YXIgYj1hLnBhcmVudE5vZGU7cmV0dXJuIGImJjExIT09Yi5ub2RlVHlwZT9iOm51bGx9LHBhcmVudHM6ZnVuY3Rpb24oYSl7cmV0dXJuIG0uZGlyKGEsInBhcmVudE5vZGUiKX0scGFyZW50c1VudGlsOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbS5kaXIoYSwicGFyZW50Tm9kZSIsYyl9LG5leHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIEQoYSwibmV4dFNpYmxpbmciKX0scHJldjpmdW5jdGlvbihhKXtyZXR1cm4gRChhLCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dEFsbDpmdW5jdGlvbihhKXtyZXR1cm4gbS5kaXIoYSwibmV4dFNpYmxpbmciKX0scHJldkFsbDpmdW5jdGlvbihhKXtyZXR1cm4gbS5kaXIoYSwicHJldmlvdXNTaWJsaW5nIil9LG5leHRVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG0uZGlyKGEsIm5leHRTaWJsaW5nIixjKX0scHJldlVudGlsOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbS5kaXIoYSwicHJldmlvdXNTaWJsaW5nIixjKX0sc2libGluZ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIG0uc2libGluZygoYS5wYXJlbnROb2RlfHx7fSkuZmlyc3RDaGlsZCxhKX0sY2hpbGRyZW46ZnVuY3Rpb24oYSl7cmV0dXJuIG0uc2libGluZyhhLmZpcnN0Q2hpbGQpfSxjb250ZW50czpmdW5jdGlvbihhKXtyZXR1cm4gbS5ub2RlTmFtZShhLCJpZnJhbWUiKT9hLmNvbnRlbnREb2N1bWVudHx8YS5jb250ZW50V2luZG93LmRvY3VtZW50Om0ubWVyZ2UoW10sYS5jaGlsZE5vZGVzKX19LGZ1bmN0aW9uKGEsYil7bS5mblthXT1mdW5jdGlvbihjLGQpe3ZhciBlPW0ubWFwKHRoaXMsYixjKTtyZXR1cm4iVW50aWwiIT09YS5zbGljZSgtNSkmJihkPWMpLGQmJiJzdHJpbmciPT10eXBlb2YgZCYmKGU9bS5maWx0ZXIoZCxlKSksdGhpcy5sZW5ndGg+MSYmKENbYV18fChlPW0udW5pcXVlKGUpKSxCLnRlc3QoYSkmJihlPWUucmV2ZXJzZSgpKSksdGhpcy5wdXNoU3RhY2soZSl9fSk7dmFyIEU9L1xTKy9nLEY9e307ZnVuY3Rpb24gRyhhKXt2YXIgYj1GW2FdPXt9O3JldHVybiBtLmVhY2goYS5tYXRjaChFKXx8W10sZnVuY3Rpb24oYSxjKXtiW2NdPSEwfSksYn1tLkNhbGxiYWNrcz1mdW5jdGlvbihhKXthPSJzdHJpbmciPT10eXBlb2YgYT9GW2FdfHxHKGEpOm0uZXh0ZW5kKHt9LGEpO3ZhciBiLGMsZCxlLGYsZyxoPVtdLGk9IWEub25jZSYmW10saj1mdW5jdGlvbihsKXtmb3IoYz1hLm1lbW9yeSYmbCxkPSEwLGY9Z3x8MCxnPTAsZT1oLmxlbmd0aCxiPSEwO2gmJmU+ZjtmKyspaWYoaFtmXS5hcHBseShsWzBdLGxbMV0pPT09ITEmJmEuc3RvcE9uRmFsc2Upe2M9ITE7YnJlYWt9Yj0hMSxoJiYoaT9pLmxlbmd0aCYmaihpLnNoaWZ0KCkpOmM/aD1bXTprLmRpc2FibGUoKSl9LGs9e2FkZDpmdW5jdGlvbigpe2lmKGgpe3ZhciBkPWgubGVuZ3RoOyFmdW5jdGlvbiBmKGIpe20uZWFjaChiLGZ1bmN0aW9uKGIsYyl7dmFyIGQ9bS50eXBlKGMpOyJmdW5jdGlvbiI9PT1kP2EudW5pcXVlJiZrLmhhcyhjKXx8aC5wdXNoKGMpOmMmJmMubGVuZ3RoJiYic3RyaW5nIiE9PWQmJmYoYyl9KX0oYXJndW1lbnRzKSxiP2U9aC5sZW5ndGg6YyYmKGc9ZCxqKGMpKX1yZXR1cm4gdGhpc30scmVtb3ZlOmZ1bmN0aW9uKCl7cmV0dXJuIGgmJm0uZWFjaChhcmd1bWVudHMsZnVuY3Rpb24oYSxjKXt2YXIgZDt3aGlsZSgoZD1tLmluQXJyYXkoYyxoLGQpKT4tMSloLnNwbGljZShkLDEpLGImJihlPj1kJiZlLS0sZj49ZCYmZi0tKX0pLHRoaXN9LGhhczpmdW5jdGlvbihhKXtyZXR1cm4gYT9tLmluQXJyYXkoYSxoKT4tMTohKCFofHwhaC5sZW5ndGgpfSxlbXB0eTpmdW5jdGlvbigpe3JldHVybiBoPVtdLGU9MCx0aGlzfSxkaXNhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIGg9aT1jPXZvaWQgMCx0aGlzfSxkaXNhYmxlZDpmdW5jdGlvbigpe3JldHVybiFofSxsb2NrOmZ1bmN0aW9uKCl7cmV0dXJuIGk9dm9pZCAwLGN8fGsuZGlzYWJsZSgpLHRoaXN9LGxvY2tlZDpmdW5jdGlvbigpe3JldHVybiFpfSxmaXJlV2l0aDpmdW5jdGlvbihhLGMpe3JldHVybiFofHxkJiYhaXx8KGM9Y3x8W10sYz1bYSxjLnNsaWNlP2Muc2xpY2UoKTpjXSxiP2kucHVzaChjKTpqKGMpKSx0aGlzfSxmaXJlOmZ1bmN0aW9uKCl7cmV0dXJuIGsuZmlyZVdpdGgodGhpcyxhcmd1bWVudHMpLHRoaXN9LGZpcmVkOmZ1bmN0aW9uKCl7cmV0dXJuISFkfX07cmV0dXJuIGt9LG0uZXh0ZW5kKHtEZWZlcnJlZDpmdW5jdGlvbihhKXt2YXIgYj1bWyJyZXNvbHZlIiwiZG9uZSIsbS5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksInJlc29sdmVkIl0sWyJyZWplY3QiLCJmYWlsIixtLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSwicmVqZWN0ZWQiXSxbIm5vdGlmeSIsInByb2dyZXNzIixtLkNhbGxiYWNrcygibWVtb3J5IildXSxjPSJwZW5kaW5nIixkPXtzdGF0ZTpmdW5jdGlvbigpe3JldHVybiBjfSxhbHdheXM6ZnVuY3Rpb24oKXtyZXR1cm4gZS5kb25lKGFyZ3VtZW50cykuZmFpbChhcmd1bWVudHMpLHRoaXN9LHRoZW46ZnVuY3Rpb24oKXt2YXIgYT1hcmd1bWVudHM7cmV0dXJuIG0uRGVmZXJyZWQoZnVuY3Rpb24oYyl7bS5lYWNoKGIsZnVuY3Rpb24oYixmKXt2YXIgZz1tLmlzRnVuY3Rpb24oYVtiXSkmJmFbYl07ZVtmWzFdXShmdW5jdGlvbigpe3ZhciBhPWcmJmcuYXBwbHkodGhpcyxhcmd1bWVudHMpO2EmJm0uaXNGdW5jdGlvbihhLnByb21pc2UpP2EucHJvbWlzZSgpLmRvbmUoYy5yZXNvbHZlKS5mYWlsKGMucmVqZWN0KS5wcm9ncmVzcyhjLm5vdGlmeSk6Y1tmWzBdKyJXaXRoIl0odGhpcz09PWQ/Yy5wcm9taXNlKCk6dGhpcyxnP1thXTphcmd1bWVudHMpfSl9KSxhPW51bGx9KS5wcm9taXNlKCl9LHByb21pc2U6ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPWE/bS5leHRlbmQoYSxkKTpkfX0sZT17fTtyZXR1cm4gZC5waXBlPWQudGhlbixtLmVhY2goYixmdW5jdGlvbihhLGYpe3ZhciBnPWZbMl0saD1mWzNdO2RbZlsxXV09Zy5hZGQsaCYmZy5hZGQoZnVuY3Rpb24oKXtjPWh9LGJbMV5hXVsyXS5kaXNhYmxlLGJbMl1bMl0ubG9jayksZVtmWzBdXT1mdW5jdGlvbigpe3JldHVybiBlW2ZbMF0rIldpdGgiXSh0aGlzPT09ZT9kOnRoaXMsYXJndW1lbnRzKSx0aGlzfSxlW2ZbMF0rIldpdGgiXT1nLmZpcmVXaXRofSksZC5wcm9taXNlKGUpLGEmJmEuY2FsbChlLGUpLGV9LHdoZW46ZnVuY3Rpb24oYSl7dmFyIGI9MCxjPWQuY2FsbChhcmd1bWVudHMpLGU9Yy5sZW5ndGgsZj0xIT09ZXx8YSYmbS5pc0Z1bmN0aW9uKGEucHJvbWlzZSk/ZTowLGc9MT09PWY/YTptLkRlZmVycmVkKCksaD1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIGZ1bmN0aW9uKGUpe2JbYV09dGhpcyxjW2FdPWFyZ3VtZW50cy5sZW5ndGg+MT9kLmNhbGwoYXJndW1lbnRzKTplLGM9PT1pP2cubm90aWZ5V2l0aChiLGMpOi0tZnx8Zy5yZXNvbHZlV2l0aChiLGMpfX0saSxqLGs7aWYoZT4xKWZvcihpPW5ldyBBcnJheShlKSxqPW5ldyBBcnJheShlKSxrPW5ldyBBcnJheShlKTtlPmI7YisrKWNbYl0mJm0uaXNGdW5jdGlvbihjW2JdLnByb21pc2UpP2NbYl0ucHJvbWlzZSgpLmRvbmUoaChiLGssYykpLmZhaWwoZy5yZWplY3QpLnByb2dyZXNzKGgoYixqLGkpKTotLWY7cmV0dXJuIGZ8fGcucmVzb2x2ZVdpdGgoayxjKSxnLnByb21pc2UoKX19KTt2YXIgSDttLmZuLnJlYWR5PWZ1bmN0aW9uKGEpe3JldHVybiBtLnJlYWR5LnByb21pc2UoKS5kb25lKGEpLHRoaXN9LG0uZXh0ZW5kKHtpc1JlYWR5OiExLHJlYWR5V2FpdDoxLGhvbGRSZWFkeTpmdW5jdGlvbihhKXthP20ucmVhZHlXYWl0Kys6bS5yZWFkeSghMCl9LHJlYWR5OmZ1bmN0aW9uKGEpe2lmKGE9PT0hMD8hLS1tLnJlYWR5V2FpdDohbS5pc1JlYWR5KXtpZigheS5ib2R5KXJldHVybiBzZXRUaW1lb3V0KG0ucmVhZHkpO20uaXNSZWFkeT0hMCxhIT09ITAmJi0tbS5yZWFkeVdhaXQ+MHx8KEgucmVzb2x2ZVdpdGgoeSxbbV0pLG0uZm4udHJpZ2dlckhhbmRsZXImJihtKHkpLnRyaWdnZXJIYW5kbGVyKCJyZWFkeSIpLG0oeSkub2ZmKCJyZWFkeSIpKSl9fX0pO2Z1bmN0aW9uIEkoKXt5LmFkZEV2ZW50TGlzdGVuZXI/KHkucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsSiwhMSksYS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkIixKLCExKSk6KHkuZGV0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIsSiksYS5kZXRhY2hFdmVudCgib25sb2FkIixKKSl9ZnVuY3Rpb24gSigpeyh5LmFkZEV2ZW50TGlzdGVuZXJ8fCJsb2FkIj09PWV2ZW50LnR5cGV8fCJjb21wbGV0ZSI9PT15LnJlYWR5U3RhdGUpJiYoSSgpLG0ucmVhZHkoKSl9bS5yZWFkeS5wcm9taXNlPWZ1bmN0aW9uKGIpe2lmKCFIKWlmKEg9bS5EZWZlcnJlZCgpLCJjb21wbGV0ZSI9PT15LnJlYWR5U3RhdGUpc2V0VGltZW91dChtLnJlYWR5KTtlbHNlIGlmKHkuYWRkRXZlbnRMaXN0ZW5lcil5LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLEosITEpLGEuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsSiwhMSk7ZWxzZXt5LmF0dGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLEopLGEuYXR0YWNoRXZlbnQoIm9ubG9hZCIsSik7dmFyIGM9ITE7dHJ5e2M9bnVsbD09YS5mcmFtZUVsZW1lbnQmJnkuZG9jdW1lbnRFbGVtZW50fWNhdGNoKGQpe31jJiZjLmRvU2Nyb2xsJiYhZnVuY3Rpb24gZSgpe2lmKCFtLmlzUmVhZHkpe3RyeXtjLmRvU2Nyb2xsKCJsZWZ0Iil9Y2F0Y2goYSl7cmV0dXJuIHNldFRpbWVvdXQoZSw1MCl9SSgpLG0ucmVhZHkoKX19KCl9cmV0dXJuIEgucHJvbWlzZShiKX07dmFyIEs9InVuZGVmaW5lZCIsTDtmb3IoTCBpbiBtKGspKWJyZWFrO2sub3duTGFzdD0iMCIhPT1MLGsuaW5saW5lQmxvY2tOZWVkc0xheW91dD0hMSxtKGZ1bmN0aW9uKCl7dmFyIGEsYixjLGQ7Yz15LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF0sYyYmYy5zdHlsZSYmKGI9eS5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPXkuY3JlYXRlRWxlbWVudCgiZGl2IiksZC5zdHlsZS5jc3NUZXh0PSJwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXI6MDt3aWR0aDowO2hlaWdodDowO3RvcDowO2xlZnQ6LTk5OTlweCIsYy5hcHBlbmRDaGlsZChkKS5hcHBlbmRDaGlsZChiKSx0eXBlb2YgYi5zdHlsZS56b29tIT09SyYmKGIuc3R5bGUuY3NzVGV4dD0iZGlzcGxheTppbmxpbmU7bWFyZ2luOjA7Ym9yZGVyOjA7cGFkZGluZzoxcHg7d2lkdGg6MXB4O3pvb206MSIsay5pbmxpbmVCbG9ja05lZWRzTGF5b3V0PWE9Mz09PWIub2Zmc2V0V2lkdGgsYSYmKGMuc3R5bGUuem9vbT0xKSksYy5yZW1vdmVDaGlsZChkKSl9KSxmdW5jdGlvbigpe3ZhciBhPXkuY3JlYXRlRWxlbWVudCgiZGl2Iik7aWYobnVsbD09ay5kZWxldGVFeHBhbmRvKXtrLmRlbGV0ZUV4cGFuZG89ITA7dHJ5e2RlbGV0ZSBhLnRlc3R9Y2F0Y2goYil7ay5kZWxldGVFeHBhbmRvPSExfX1hPW51bGx9KCksbS5hY2NlcHREYXRhPWZ1bmN0aW9uKGEpe3ZhciBiPW0ubm9EYXRhWyhhLm5vZGVOYW1lKyIgIikudG9Mb3dlckNhc2UoKV0sYz0rYS5ub2RlVHlwZXx8MTtyZXR1cm4gMSE9PWMmJjkhPT1jPyExOiFifHxiIT09ITAmJmEuZ2V0QXR0cmlidXRlKCJjbGFzc2lkIik9PT1ifTt2YXIgTT0vXig/Olx7W1x3XFddKlx9fFxbW1x3XFddKlxdKSQvLE49LyhbQS1aXSkvZztmdW5jdGlvbiBPKGEsYixjKXtpZih2b2lkIDA9PT1jJiYxPT09YS5ub2RlVHlwZSl7dmFyIGQ9ImRhdGEtIitiLnJlcGxhY2UoTiwiLSQxIikudG9Mb3dlckNhc2UoKTtpZihjPWEuZ2V0QXR0cmlidXRlKGQpLCJzdHJpbmciPT10eXBlb2YgYyl7dHJ5e2M9InRydWUiPT09Yz8hMDoiZmFsc2UiPT09Yz8hMToibnVsbCI9PT1jP251bGw6K2MrIiI9PT1jPytjOk0udGVzdChjKT9tLnBhcnNlSlNPTihjKTpjfWNhdGNoKGUpe31tLmRhdGEoYSxiLGMpfWVsc2UgYz12b2lkIDB9cmV0dXJuIGN9ZnVuY3Rpb24gUChhKXt2YXIgYjtmb3IoYiBpbiBhKWlmKCgiZGF0YSIhPT1ifHwhbS5pc0VtcHR5T2JqZWN0KGFbYl0pKSYmInRvSlNPTiIhPT1iKXJldHVybiExOwoKcmV0dXJuITB9ZnVuY3Rpb24gUShhLGIsZCxlKXtpZihtLmFjY2VwdERhdGEoYSkpe3ZhciBmLGcsaD1tLmV4cGFuZG8saT1hLm5vZGVUeXBlLGo9aT9tLmNhY2hlOmEsaz1pP2FbaF06YVtoXSYmaDtpZihrJiZqW2tdJiYoZXx8altrXS5kYXRhKXx8dm9pZCAwIT09ZHx8InN0cmluZyIhPXR5cGVvZiBiKXJldHVybiBrfHwoaz1pP2FbaF09Yy5wb3AoKXx8bS5ndWlkKys6aCksaltrXXx8KGpba109aT97fTp7dG9KU09OOm0ubm9vcH0pLCgib2JqZWN0Ij09dHlwZW9mIGJ8fCJmdW5jdGlvbiI9PXR5cGVvZiBiKSYmKGU/altrXT1tLmV4dGVuZChqW2tdLGIpOmpba10uZGF0YT1tLmV4dGVuZChqW2tdLmRhdGEsYikpLGc9altrXSxlfHwoZy5kYXRhfHwoZy5kYXRhPXt9KSxnPWcuZGF0YSksdm9pZCAwIT09ZCYmKGdbbS5jYW1lbENhc2UoYildPWQpLCJzdHJpbmciPT10eXBlb2YgYj8oZj1nW2JdLG51bGw9PWYmJihmPWdbbS5jYW1lbENhc2UoYildKSk6Zj1nLGZ9fWZ1bmN0aW9uIFIoYSxiLGMpe2lmKG0uYWNjZXB0RGF0YShhKSl7dmFyIGQsZSxmPWEubm9kZVR5cGUsZz1mP20uY2FjaGU6YSxoPWY/YVttLmV4cGFuZG9dOm0uZXhwYW5kbztpZihnW2hdKXtpZihiJiYoZD1jP2dbaF06Z1toXS5kYXRhKSl7bS5pc0FycmF5KGIpP2I9Yi5jb25jYXQobS5tYXAoYixtLmNhbWVsQ2FzZSkpOmIgaW4gZD9iPVtiXTooYj1tLmNhbWVsQ2FzZShiKSxiPWIgaW4gZD9bYl06Yi5zcGxpdCgiICIpKSxlPWIubGVuZ3RoO3doaWxlKGUtLSlkZWxldGUgZFtiW2VdXTtpZihjPyFQKGQpOiFtLmlzRW1wdHlPYmplY3QoZCkpcmV0dXJufShjfHwoZGVsZXRlIGdbaF0uZGF0YSxQKGdbaF0pKSkmJihmP20uY2xlYW5EYXRhKFthXSwhMCk6ay5kZWxldGVFeHBhbmRvfHxnIT1nLndpbmRvdz9kZWxldGUgZ1toXTpnW2hdPW51bGwpfX19bS5leHRlbmQoe2NhY2hlOnt9LG5vRGF0YTp7ImFwcGxldCAiOiEwLCJlbWJlZCAiOiEwLCJvYmplY3QgIjoiY2xzaWQ6RDI3Q0RCNkUtQUU2RC0xMWNmLTk2QjgtNDQ0NTUzNTQwMDAwIn0saGFzRGF0YTpmdW5jdGlvbihhKXtyZXR1cm4gYT1hLm5vZGVUeXBlP20uY2FjaGVbYVttLmV4cGFuZG9dXTphW20uZXhwYW5kb10sISFhJiYhUChhKX0sZGF0YTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIFEoYSxiLGMpfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEsYil7cmV0dXJuIFIoYSxiKX0sX2RhdGE6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBRKGEsYixjLCEwKX0sX3JlbW92ZURhdGE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gUihhLGIsITApfX0pLG0uZm4uZXh0ZW5kKHtkYXRhOmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGY9dGhpc1swXSxnPWYmJmYuYXR0cmlidXRlcztpZih2b2lkIDA9PT1hKXtpZih0aGlzLmxlbmd0aCYmKGU9bS5kYXRhKGYpLDE9PT1mLm5vZGVUeXBlJiYhbS5fZGF0YShmLCJwYXJzZWRBdHRycyIpKSl7Yz1nLmxlbmd0aDt3aGlsZShjLS0pZ1tjXSYmKGQ9Z1tjXS5uYW1lLDA9PT1kLmluZGV4T2YoImRhdGEtIikmJihkPW0uY2FtZWxDYXNlKGQuc2xpY2UoNSkpLE8oZixkLGVbZF0pKSk7bS5fZGF0YShmLCJwYXJzZWRBdHRycyIsITApfXJldHVybiBlfXJldHVybiJvYmplY3QiPT10eXBlb2YgYT90aGlzLmVhY2goZnVuY3Rpb24oKXttLmRhdGEodGhpcyxhKX0pOmFyZ3VtZW50cy5sZW5ndGg+MT90aGlzLmVhY2goZnVuY3Rpb24oKXttLmRhdGEodGhpcyxhLGIpfSk6Zj9PKGYsYSxtLmRhdGEoZixhKSk6dm9pZCAwfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXttLnJlbW92ZURhdGEodGhpcyxhKX0pfX0pLG0uZXh0ZW5kKHtxdWV1ZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ7cmV0dXJuIGE/KGI9KGJ8fCJmeCIpKyJxdWV1ZSIsZD1tLl9kYXRhKGEsYiksYyYmKCFkfHxtLmlzQXJyYXkoYyk/ZD1tLl9kYXRhKGEsYixtLm1ha2VBcnJheShjKSk6ZC5wdXNoKGMpKSxkfHxbXSk6dm9pZCAwfSxkZXF1ZXVlOmZ1bmN0aW9uKGEsYil7Yj1ifHwiZngiO3ZhciBjPW0ucXVldWUoYSxiKSxkPWMubGVuZ3RoLGU9Yy5zaGlmdCgpLGY9bS5fcXVldWVIb29rcyhhLGIpLGc9ZnVuY3Rpb24oKXttLmRlcXVldWUoYSxiKX07ImlucHJvZ3Jlc3MiPT09ZSYmKGU9Yy5zaGlmdCgpLGQtLSksZSYmKCJmeCI9PT1iJiZjLnVuc2hpZnQoImlucHJvZ3Jlc3MiKSxkZWxldGUgZi5zdG9wLGUuY2FsbChhLGcsZikpLCFkJiZmJiZmLmVtcHR5LmZpcmUoKX0sX3F1ZXVlSG9va3M6ZnVuY3Rpb24oYSxiKXt2YXIgYz1iKyJxdWV1ZUhvb2tzIjtyZXR1cm4gbS5fZGF0YShhLGMpfHxtLl9kYXRhKGEsYyx7ZW1wdHk6bS5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IikuYWRkKGZ1bmN0aW9uKCl7bS5fcmVtb3ZlRGF0YShhLGIrInF1ZXVlIiksbS5fcmVtb3ZlRGF0YShhLGMpfSl9KX19KSxtLmZuLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24oYSxiKXt2YXIgYz0yO3JldHVybiJzdHJpbmciIT10eXBlb2YgYSYmKGI9YSxhPSJmeCIsYy0tKSxhcmd1bWVudHMubGVuZ3RoPGM/bS5xdWV1ZSh0aGlzWzBdLGEpOnZvaWQgMD09PWI/dGhpczp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYz1tLnF1ZXVlKHRoaXMsYSxiKTttLl9xdWV1ZUhvb2tzKHRoaXMsYSksImZ4Ij09PWEmJiJpbnByb2dyZXNzIiE9PWNbMF0mJm0uZGVxdWV1ZSh0aGlzLGEpfSl9LGRlcXVldWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe20uZGVxdWV1ZSh0aGlzLGEpfSl9LGNsZWFyUXVldWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucXVldWUoYXx8ImZ4IixbXSl9LHByb21pc2U6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPTEsZT1tLkRlZmVycmVkKCksZj10aGlzLGc9dGhpcy5sZW5ndGgsaD1mdW5jdGlvbigpey0tZHx8ZS5yZXNvbHZlV2l0aChmLFtmXSl9OyJzdHJpbmciIT10eXBlb2YgYSYmKGI9YSxhPXZvaWQgMCksYT1hfHwiZngiO3doaWxlKGctLSljPW0uX2RhdGEoZltnXSxhKyJxdWV1ZUhvb2tzIiksYyYmYy5lbXB0eSYmKGQrKyxjLmVtcHR5LmFkZChoKSk7cmV0dXJuIGgoKSxlLnByb21pc2UoYil9fSk7dmFyIFM9L1srLV0/KD86XGQqXC58KVxkKyg/OltlRV1bKy1dP1xkK3wpLy5zb3VyY2UsVD1bIlRvcCIsIlJpZ2h0IiwiQm90dG9tIiwiTGVmdCJdLFU9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT1ifHxhLCJub25lIj09PW0uY3NzKGEsImRpc3BsYXkiKXx8IW0uY29udGFpbnMoYS5vd25lckRvY3VtZW50LGEpfSxWPW0uYWNjZXNzPWZ1bmN0aW9uKGEsYixjLGQsZSxmLGcpe3ZhciBoPTAsaT1hLmxlbmd0aCxqPW51bGw9PWM7aWYoIm9iamVjdCI9PT1tLnR5cGUoYykpe2U9ITA7Zm9yKGggaW4gYyltLmFjY2VzcyhhLGIsaCxjW2hdLCEwLGYsZyl9ZWxzZSBpZih2b2lkIDAhPT1kJiYoZT0hMCxtLmlzRnVuY3Rpb24oZCl8fChnPSEwKSxqJiYoZz8oYi5jYWxsKGEsZCksYj1udWxsKTooaj1iLGI9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBqLmNhbGwobShhKSxjKX0pKSxiKSlmb3IoO2k+aDtoKyspYihhW2hdLGMsZz9kOmQuY2FsbChhW2hdLGgsYihhW2hdLGMpKSk7cmV0dXJuIGU/YTpqP2IuY2FsbChhKTppP2IoYVswXSxjKTpmfSxXPS9eKD86Y2hlY2tib3h8cmFkaW8pJC9pOyFmdW5jdGlvbigpe3ZhciBhPXkuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxiPXkuY3JlYXRlRWxlbWVudCgiZGl2IiksYz15LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtpZihiLmlubmVySFRNTD0iICA8bGluay8+PHRhYmxlPjwvdGFibGU+PGEgaHJlZj0nL2EnPmE8L2E+PGlucHV0IHR5cGU9J2NoZWNrYm94Jy8+IixrLmxlYWRpbmdXaGl0ZXNwYWNlPTM9PT1iLmZpcnN0Q2hpbGQubm9kZVR5cGUsay50Ym9keT0hYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKS5sZW5ndGgsay5odG1sU2VyaWFsaXplPSEhYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgibGluayIpLmxlbmd0aCxrLmh0bWw1Q2xvbmU9Ijw6bmF2PjwvOm5hdj4iIT09eS5jcmVhdGVFbGVtZW50KCJuYXYiKS5jbG9uZU5vZGUoITApLm91dGVySFRNTCxhLnR5cGU9ImNoZWNrYm94IixhLmNoZWNrZWQ9ITAsYy5hcHBlbmRDaGlsZChhKSxrLmFwcGVuZENoZWNrZWQ9YS5jaGVja2VkLGIuaW5uZXJIVE1MPSI8dGV4dGFyZWE+eDwvdGV4dGFyZWE+IixrLm5vQ2xvbmVDaGVja2VkPSEhYi5jbG9uZU5vZGUoITApLmxhc3RDaGlsZC5kZWZhdWx0VmFsdWUsYy5hcHBlbmRDaGlsZChiKSxiLmlubmVySFRNTD0iPGlucHV0IHR5cGU9J3JhZGlvJyBjaGVja2VkPSdjaGVja2VkJyBuYW1lPSd0Jy8+IixrLmNoZWNrQ2xvbmU9Yi5jbG9uZU5vZGUoITApLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmNoZWNrZWQsay5ub0Nsb25lRXZlbnQ9ITAsYi5hdHRhY2hFdmVudCYmKGIuYXR0YWNoRXZlbnQoIm9uY2xpY2siLGZ1bmN0aW9uKCl7ay5ub0Nsb25lRXZlbnQ9ITF9KSxiLmNsb25lTm9kZSghMCkuY2xpY2soKSksbnVsbD09ay5kZWxldGVFeHBhbmRvKXtrLmRlbGV0ZUV4cGFuZG89ITA7dHJ5e2RlbGV0ZSBiLnRlc3R9Y2F0Y2goZCl7ay5kZWxldGVFeHBhbmRvPSExfX19KCksZnVuY3Rpb24oKXt2YXIgYixjLGQ9eS5jcmVhdGVFbGVtZW50KCJkaXYiKTtmb3IoYiBpbntzdWJtaXQ6ITAsY2hhbmdlOiEwLGZvY3VzaW46ITB9KWM9Im9uIitiLChrW2IrIkJ1YmJsZXMiXT1jIGluIGEpfHwoZC5zZXRBdHRyaWJ1dGUoYywidCIpLGtbYisiQnViYmxlcyJdPWQuYXR0cmlidXRlc1tjXS5leHBhbmRvPT09ITEpO2Q9bnVsbH0oKTt2YXIgWD0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYSkkL2ksWT0vXmtleS8sWj0vXig/Om1vdXNlfHBvaW50ZXJ8Y29udGV4dG1lbnUpfGNsaWNrLywkPS9eKD86Zm9jdXNpbmZvY3VzfGZvY3Vzb3V0Ymx1cikkLyxfPS9eKFteLl0qKSg/OlwuKC4rKXwpJC87ZnVuY3Rpb24gYWEoKXtyZXR1cm4hMH1mdW5jdGlvbiBiYSgpe3JldHVybiExfWZ1bmN0aW9uIGNhKCl7dHJ5e3JldHVybiB5LmFjdGl2ZUVsZW1lbnR9Y2F0Y2goYSl7fX1tLmV2ZW50PXtnbG9iYWw6e30sYWRkOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGYsZyxoLGksaixrLGwsbixvLHAscSxyPW0uX2RhdGEoYSk7aWYocil7Yy5oYW5kbGVyJiYoaT1jLGM9aS5oYW5kbGVyLGU9aS5zZWxlY3RvciksYy5ndWlkfHwoYy5ndWlkPW0uZ3VpZCsrKSwoZz1yLmV2ZW50cyl8fChnPXIuZXZlbnRzPXt9KSwoaz1yLmhhbmRsZSl8fChrPXIuaGFuZGxlPWZ1bmN0aW9uKGEpe3JldHVybiB0eXBlb2YgbT09PUt8fGEmJm0uZXZlbnQudHJpZ2dlcmVkPT09YS50eXBlP3ZvaWQgMDptLmV2ZW50LmRpc3BhdGNoLmFwcGx5KGsuZWxlbSxhcmd1bWVudHMpfSxrLmVsZW09YSksYj0oYnx8IiIpLm1hdGNoKEUpfHxbIiJdLGg9Yi5sZW5ndGg7d2hpbGUoaC0tKWY9Xy5leGVjKGJbaF0pfHxbXSxvPXE9ZlsxXSxwPShmWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksbyYmKGo9bS5ldmVudC5zcGVjaWFsW29dfHx7fSxvPShlP2ouZGVsZWdhdGVUeXBlOmouYmluZFR5cGUpfHxvLGo9bS5ldmVudC5zcGVjaWFsW29dfHx7fSxsPW0uZXh0ZW5kKHt0eXBlOm8sb3JpZ1R5cGU6cSxkYXRhOmQsaGFuZGxlcjpjLGd1aWQ6Yy5ndWlkLHNlbGVjdG9yOmUsbmVlZHNDb250ZXh0OmUmJm0uZXhwci5tYXRjaC5uZWVkc0NvbnRleHQudGVzdChlKSxuYW1lc3BhY2U6cC5qb2luKCIuIil9LGkpLChuPWdbb10pfHwobj1nW29dPVtdLG4uZGVsZWdhdGVDb3VudD0wLGouc2V0dXAmJmouc2V0dXAuY2FsbChhLGQscCxrKSE9PSExfHwoYS5hZGRFdmVudExpc3RlbmVyP2EuYWRkRXZlbnRMaXN0ZW5lcihvLGssITEpOmEuYXR0YWNoRXZlbnQmJmEuYXR0YWNoRXZlbnQoIm9uIitvLGspKSksai5hZGQmJihqLmFkZC5jYWxsKGEsbCksbC5oYW5kbGVyLmd1aWR8fChsLmhhbmRsZXIuZ3VpZD1jLmd1aWQpKSxlP24uc3BsaWNlKG4uZGVsZWdhdGVDb3VudCsrLDAsbCk6bi5wdXNoKGwpLG0uZXZlbnQuZ2xvYmFsW29dPSEwKTthPW51bGx9fSxyZW1vdmU6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZixnLGgsaSxqLGssbCxuLG8scCxxLHI9bS5oYXNEYXRhKGEpJiZtLl9kYXRhKGEpO2lmKHImJihrPXIuZXZlbnRzKSl7Yj0oYnx8IiIpLm1hdGNoKEUpfHxbIiJdLGo9Yi5sZW5ndGg7d2hpbGUoai0tKWlmKGg9Xy5leGVjKGJbal0pfHxbXSxvPXE9aFsxXSxwPShoWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksbyl7bD1tLmV2ZW50LnNwZWNpYWxbb118fHt9LG89KGQ/bC5kZWxlZ2F0ZVR5cGU6bC5iaW5kVHlwZSl8fG8sbj1rW29dfHxbXSxoPWhbMl0mJm5ldyBSZWdFeHAoIihefFxcLikiK3Auam9pbigiXFwuKD86LipcXC58KSIpKyIoXFwufCQpIiksaT1mPW4ubGVuZ3RoO3doaWxlKGYtLSlnPW5bZl0sIWUmJnEhPT1nLm9yaWdUeXBlfHxjJiZjLmd1aWQhPT1nLmd1aWR8fGgmJiFoLnRlc3QoZy5uYW1lc3BhY2UpfHxkJiZkIT09Zy5zZWxlY3RvciYmKCIqKiIhPT1kfHwhZy5zZWxlY3Rvcil8fChuLnNwbGljZShmLDEpLGcuc2VsZWN0b3ImJm4uZGVsZWdhdGVDb3VudC0tLGwucmVtb3ZlJiZsLnJlbW92ZS5jYWxsKGEsZykpO2kmJiFuLmxlbmd0aCYmKGwudGVhcmRvd24mJmwudGVhcmRvd24uY2FsbChhLHAsci5oYW5kbGUpIT09ITF8fG0ucmVtb3ZlRXZlbnQoYSxvLHIuaGFuZGxlKSxkZWxldGUga1tvXSl9ZWxzZSBmb3IobyBpbiBrKW0uZXZlbnQucmVtb3ZlKGEsbytiW2pdLGMsZCwhMCk7bS5pc0VtcHR5T2JqZWN0KGspJiYoZGVsZXRlIHIuaGFuZGxlLG0uX3JlbW92ZURhdGEoYSwiZXZlbnRzIikpfX0sdHJpZ2dlcjpmdW5jdGlvbihiLGMsZCxlKXt2YXIgZixnLGgsaSxrLGwsbixvPVtkfHx5XSxwPWouY2FsbChiLCJ0eXBlIik/Yi50eXBlOmIscT1qLmNhbGwoYiwibmFtZXNwYWNlIik/Yi5uYW1lc3BhY2Uuc3BsaXQoIi4iKTpbXTtpZihoPWw9ZD1kfHx5LDMhPT1kLm5vZGVUeXBlJiY4IT09ZC5ub2RlVHlwZSYmISQudGVzdChwK20uZXZlbnQudHJpZ2dlcmVkKSYmKHAuaW5kZXhPZigiLiIpPj0wJiYocT1wLnNwbGl0KCIuIikscD1xLnNoaWZ0KCkscS5zb3J0KCkpLGc9cC5pbmRleE9mKCI6Iik8MCYmIm9uIitwLGI9YlttLmV4cGFuZG9dP2I6bmV3IG0uRXZlbnQocCwib2JqZWN0Ij09dHlwZW9mIGImJmIpLGIuaXNUcmlnZ2VyPWU/MjozLGIubmFtZXNwYWNlPXEuam9pbigiLiIpLGIubmFtZXNwYWNlX3JlPWIubmFtZXNwYWNlP25ldyBSZWdFeHAoIihefFxcLikiK3Euam9pbigiXFwuKD86LipcXC58KSIpKyIoXFwufCQpIik6bnVsbCxiLnJlc3VsdD12b2lkIDAsYi50YXJnZXR8fChiLnRhcmdldD1kKSxjPW51bGw9PWM/W2JdOm0ubWFrZUFycmF5KGMsW2JdKSxrPW0uZXZlbnQuc3BlY2lhbFtwXXx8e30sZXx8IWsudHJpZ2dlcnx8ay50cmlnZ2VyLmFwcGx5KGQsYykhPT0hMSkpe2lmKCFlJiYhay5ub0J1YmJsZSYmIW0uaXNXaW5kb3coZCkpe2ZvcihpPWsuZGVsZWdhdGVUeXBlfHxwLCQudGVzdChpK3ApfHwoaD1oLnBhcmVudE5vZGUpO2g7aD1oLnBhcmVudE5vZGUpby5wdXNoKGgpLGw9aDtsPT09KGQub3duZXJEb2N1bWVudHx8eSkmJm8ucHVzaChsLmRlZmF1bHRWaWV3fHxsLnBhcmVudFdpbmRvd3x8YSl9bj0wO3doaWxlKChoPW9bbisrXSkmJiFiLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpYi50eXBlPW4+MT9pOmsuYmluZFR5cGV8fHAsZj0obS5fZGF0YShoLCJldmVudHMiKXx8e30pW2IudHlwZV0mJm0uX2RhdGEoaCwiaGFuZGxlIiksZiYmZi5hcHBseShoLGMpLGY9ZyYmaFtnXSxmJiZmLmFwcGx5JiZtLmFjY2VwdERhdGEoaCkmJihiLnJlc3VsdD1mLmFwcGx5KGgsYyksYi5yZXN1bHQ9PT0hMSYmYi5wcmV2ZW50RGVmYXVsdCgpKTtpZihiLnR5cGU9cCwhZSYmIWIuaXNEZWZhdWx0UHJldmVudGVkKCkmJighay5fZGVmYXVsdHx8ay5fZGVmYXVsdC5hcHBseShvLnBvcCgpLGMpPT09ITEpJiZtLmFjY2VwdERhdGEoZCkmJmcmJmRbcF0mJiFtLmlzV2luZG93KGQpKXtsPWRbZ10sbCYmKGRbZ109bnVsbCksbS5ldmVudC50cmlnZ2VyZWQ9cDt0cnl7ZFtwXSgpfWNhdGNoKHIpe31tLmV2ZW50LnRyaWdnZXJlZD12b2lkIDAsbCYmKGRbZ109bCl9cmV0dXJuIGIucmVzdWx0fX0sZGlzcGF0Y2g6ZnVuY3Rpb24oYSl7YT1tLmV2ZW50LmZpeChhKTt2YXIgYixjLGUsZixnLGg9W10saT1kLmNhbGwoYXJndW1lbnRzKSxqPShtLl9kYXRhKHRoaXMsImV2ZW50cyIpfHx7fSlbYS50eXBlXXx8W10saz1tLmV2ZW50LnNwZWNpYWxbYS50eXBlXXx8e307aWYoaVswXT1hLGEuZGVsZWdhdGVUYXJnZXQ9dGhpcywhay5wcmVEaXNwYXRjaHx8ay5wcmVEaXNwYXRjaC5jYWxsKHRoaXMsYSkhPT0hMSl7aD1tLmV2ZW50LmhhbmRsZXJzLmNhbGwodGhpcyxhLGopLGI9MDt3aGlsZSgoZj1oW2IrK10pJiYhYS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKXthLmN1cnJlbnRUYXJnZXQ9Zi5lbGVtLGc9MDt3aGlsZSgoZT1mLmhhbmRsZXJzW2crK10pJiYhYS5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpKSghYS5uYW1lc3BhY2VfcmV8fGEubmFtZXNwYWNlX3JlLnRlc3QoZS5uYW1lc3BhY2UpKSYmKGEuaGFuZGxlT2JqPWUsYS5kYXRhPWUuZGF0YSxjPSgobS5ldmVudC5zcGVjaWFsW2Uub3JpZ1R5cGVdfHx7fSkuaGFuZGxlfHxlLmhhbmRsZXIpLmFwcGx5KGYuZWxlbSxpKSx2b2lkIDAhPT1jJiYoYS5yZXN1bHQ9Yyk9PT0hMSYmKGEucHJldmVudERlZmF1bHQoKSxhLnN0b3BQcm9wYWdhdGlvbigpKSl9cmV0dXJuIGsucG9zdERpc3BhdGNoJiZrLnBvc3REaXNwYXRjaC5jYWxsKHRoaXMsYSksYS5yZXN1bHR9fSxoYW5kbGVyczpmdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxmLGc9W10saD1iLmRlbGVnYXRlQ291bnQsaT1hLnRhcmdldDtpZihoJiZpLm5vZGVUeXBlJiYoIWEuYnV0dG9ufHwiY2xpY2siIT09YS50eXBlKSlmb3IoO2khPXRoaXM7aT1pLnBhcmVudE5vZGV8fHRoaXMpaWYoMT09PWkubm9kZVR5cGUmJihpLmRpc2FibGVkIT09ITB8fCJjbGljayIhPT1hLnR5cGUpKXtmb3IoZT1bXSxmPTA7aD5mO2YrKylkPWJbZl0sYz1kLnNlbGVjdG9yKyIgIix2b2lkIDA9PT1lW2NdJiYoZVtjXT1kLm5lZWRzQ29udGV4dD9tKGMsdGhpcykuaW5kZXgoaSk+PTA6bS5maW5kKGMsdGhpcyxudWxsLFtpXSkubGVuZ3RoKSxlW2NdJiZlLnB1c2goZCk7ZS5sZW5ndGgmJmcucHVzaCh7ZWxlbTppLGhhbmRsZXJzOmV9KX1yZXR1cm4gaDxiLmxlbmd0aCYmZy5wdXNoKHtlbGVtOnRoaXMsaGFuZGxlcnM6Yi5zbGljZShoKX0pLGd9LGZpeDpmdW5jdGlvbihhKXtpZihhW20uZXhwYW5kb10pcmV0dXJuIGE7dmFyIGIsYyxkLGU9YS50eXBlLGY9YSxnPXRoaXMuZml4SG9va3NbZV07Z3x8KHRoaXMuZml4SG9va3NbZV09Zz1aLnRlc3QoZSk/dGhpcy5tb3VzZUhvb2tzOlkudGVzdChlKT90aGlzLmtleUhvb2tzOnt9KSxkPWcucHJvcHM/dGhpcy5wcm9wcy5jb25jYXQoZy5wcm9wcyk6dGhpcy5wcm9wcyxhPW5ldyBtLkV2ZW50KGYpLGI9ZC5sZW5ndGg7d2hpbGUoYi0tKWM9ZFtiXSxhW2NdPWZbY107cmV0dXJuIGEudGFyZ2V0fHwoYS50YXJnZXQ9Zi5zcmNFbGVtZW50fHx5KSwzPT09YS50YXJnZXQubm9kZVR5cGUmJihhLnRhcmdldD1hLnRhcmdldC5wYXJlbnROb2RlKSxhLm1ldGFLZXk9ISFhLm1ldGFLZXksZy5maWx0ZXI/Zy5maWx0ZXIoYSxmKTphfSxwcm9wczoiYWx0S2V5IGJ1YmJsZXMgY2FuY2VsYWJsZSBjdHJsS2V5IGN1cnJlbnRUYXJnZXQgZXZlbnRQaGFzZSBtZXRhS2V5IHJlbGF0ZWRUYXJnZXQgc2hpZnRLZXkgdGFyZ2V0IHRpbWVTdGFtcCB2aWV3IHdoaWNoIi5zcGxpdCgiICIpLGZpeEhvb2tzOnt9LGtleUhvb2tzOntwcm9wczoiY2hhciBjaGFyQ29kZSBrZXkga2V5Q29kZSIuc3BsaXQoIiAiKSxmaWx0ZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbnVsbD09YS53aGljaCYmKGEud2hpY2g9bnVsbCE9Yi5jaGFyQ29kZT9iLmNoYXJDb2RlOmIua2V5Q29kZSksYX19LG1vdXNlSG9va3M6e3Byb3BzOiJidXR0b24gYnV0dG9ucyBjbGllbnRYIGNsaWVudFkgZnJvbUVsZW1lbnQgb2Zmc2V0WCBvZmZzZXRZIHBhZ2VYIHBhZ2VZIHNjcmVlblggc2NyZWVuWSB0b0VsZW1lbnQiLnNwbGl0KCIgIiksZmlsdGVyOmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGY9Yi5idXR0b24sZz1iLmZyb21FbGVtZW50O3JldHVybiBudWxsPT1hLnBhZ2VYJiZudWxsIT1iLmNsaWVudFgmJihkPWEudGFyZ2V0Lm93bmVyRG9jdW1lbnR8fHksZT1kLmRvY3VtZW50RWxlbWVudCxjPWQuYm9keSxhLnBhZ2VYPWIuY2xpZW50WCsoZSYmZS5zY3JvbGxMZWZ0fHxjJiZjLnNjcm9sbExlZnR8fDApLShlJiZlLmNsaWVudExlZnR8fGMmJmMuY2xpZW50TGVmdHx8MCksYS5wYWdlWT1iLmNsaWVudFkrKGUmJmUuc2Nyb2xsVG9wfHxjJiZjLnNjcm9sbFRvcHx8MCktKGUmJmUuY2xpZW50VG9wfHxjJiZjLmNsaWVudFRvcHx8MCkpLCFhLnJlbGF0ZWRUYXJnZXQmJmcmJihhLnJlbGF0ZWRUYXJnZXQ9Zz09PWEudGFyZ2V0P2IudG9FbGVtZW50OmcpLGEud2hpY2h8fHZvaWQgMD09PWZ8fChhLndoaWNoPTEmZj8xOjImZj8zOjQmZj8yOjApLGF9fSxzcGVjaWFsOntsb2FkOntub0J1YmJsZTohMH0sZm9jdXM6e3RyaWdnZXI6ZnVuY3Rpb24oKXtpZih0aGlzIT09Y2EoKSYmdGhpcy5mb2N1cyl0cnl7cmV0dXJuIHRoaXMuZm9jdXMoKSwhMX1jYXRjaChhKXt9fSxkZWxlZ2F0ZVR5cGU6ImZvY3VzaW4ifSxibHVyOnt0cmlnZ2VyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXM9PT1jYSgpJiZ0aGlzLmJsdXI/KHRoaXMuYmx1cigpLCExKTp2b2lkIDB9LGRlbGVnYXRlVHlwZToiZm9jdXNvdXQifSxjbGljazp7dHJpZ2dlcjpmdW5jdGlvbigpe3JldHVybiBtLm5vZGVOYW1lKHRoaXMsImlucHV0IikmJiJjaGVja2JveCI9PT10aGlzLnR5cGUmJnRoaXMuY2xpY2s/KHRoaXMuY2xpY2soKSwhMSk6dm9pZCAwfSxfZGVmYXVsdDpmdW5jdGlvbihhKXtyZXR1cm4gbS5ub2RlTmFtZShhLnRhcmdldCwiYSIpfX0sYmVmb3JldW5sb2FkOntwb3N0RGlzcGF0Y2g6ZnVuY3Rpb24oYSl7dm9pZCAwIT09YS5yZXN1bHQmJmEub3JpZ2luYWxFdmVudCYmKGEub3JpZ2luYWxFdmVudC5yZXR1cm5WYWx1ZT1hLnJlc3VsdCl9fX0sc2ltdWxhdGU6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9bS5leHRlbmQobmV3IG0uRXZlbnQsYyx7dHlwZTphLGlzU2ltdWxhdGVkOiEwLG9yaWdpbmFsRXZlbnQ6e319KTtkP20uZXZlbnQudHJpZ2dlcihlLG51bGwsYik6bS5ldmVudC5kaXNwYXRjaC5jYWxsKGIsZSksZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSYmYy5wcmV2ZW50RGVmYXVsdCgpfX0sbS5yZW1vdmVFdmVudD15LnJlbW92ZUV2ZW50TGlzdGVuZXI/ZnVuY3Rpb24oYSxiLGMpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lciYmYS5yZW1vdmVFdmVudExpc3RlbmVyKGIsYywhMSl9OmZ1bmN0aW9uKGEsYixjKXt2YXIgZD0ib24iK2I7YS5kZXRhY2hFdmVudCYmKHR5cGVvZiBhW2RdPT09SyYmKGFbZF09bnVsbCksYS5kZXRhY2hFdmVudChkLGMpKX0sbS5FdmVudD1mdW5jdGlvbihhLGIpe3JldHVybiB0aGlzIGluc3RhbmNlb2YgbS5FdmVudD8oYSYmYS50eXBlPyh0aGlzLm9yaWdpbmFsRXZlbnQ9YSx0aGlzLnR5cGU9YS50eXBlLHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPWEuZGVmYXVsdFByZXZlbnRlZHx8dm9pZCAwPT09YS5kZWZhdWx0UHJldmVudGVkJiZhLnJldHVyblZhbHVlPT09ITE/YWE6YmEpOnRoaXMudHlwZT1hLGImJm0uZXh0ZW5kKHRoaXMsYiksdGhpcy50aW1lU3RhbXA9YSYmYS50aW1lU3RhbXB8fG0ubm93KCksdm9pZCh0aGlzW20uZXhwYW5kb109ITApKTpuZXcgbS5FdmVudChhLGIpfSxtLkV2ZW50LnByb3RvdHlwZT17aXNEZWZhdWx0UHJldmVudGVkOmJhLGlzUHJvcGFnYXRpb25TdG9wcGVkOmJhLGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOmJhLHByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNEZWZhdWx0UHJldmVudGVkPWFhLGEmJihhLnByZXZlbnREZWZhdWx0P2EucHJldmVudERlZmF1bHQoKTphLnJldHVyblZhbHVlPSExKX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9YWEsYSYmKGEuc3RvcFByb3BhZ2F0aW9uJiZhLnN0b3BQcm9wYWdhdGlvbigpLGEuY2FuY2VsQnViYmxlPSEwKX0sc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ9YWEsYSYmYS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24mJmEuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCksdGhpcy5zdG9wUHJvcGFnYXRpb24oKX19LG0uZWFjaCh7bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCIscG9pbnRlcmVudGVyOiJwb2ludGVyb3ZlciIscG9pbnRlcmxlYXZlOiJwb2ludGVyb3V0In0sZnVuY3Rpb24oYSxiKXttLmV2ZW50LnNwZWNpYWxbYV09e2RlbGVnYXRlVHlwZTpiLGJpbmRUeXBlOmIsaGFuZGxlOmZ1bmN0aW9uKGEpe3ZhciBjLGQ9dGhpcyxlPWEucmVsYXRlZFRhcmdldCxmPWEuaGFuZGxlT2JqO3JldHVybighZXx8ZSE9PWQmJiFtLmNvbnRhaW5zKGQsZSkpJiYoYS50eXBlPWYub3JpZ1R5cGUsYz1mLmhhbmRsZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpLGEudHlwZT1iKSxjfX19KSxrLnN1Ym1pdEJ1YmJsZXN8fChtLmV2ZW50LnNwZWNpYWwuc3VibWl0PXtzZXR1cDpmdW5jdGlvbigpe3JldHVybiBtLm5vZGVOYW1lKHRoaXMsImZvcm0iKT8hMTp2b2lkIG0uZXZlbnQuYWRkKHRoaXMsImNsaWNrLl9zdWJtaXQga2V5cHJlc3MuX3N1Ym1pdCIsZnVuY3Rpb24oYSl7dmFyIGI9YS50YXJnZXQsYz1tLm5vZGVOYW1lKGIsImlucHV0Iil8fG0ubm9kZU5hbWUoYiwiYnV0dG9uIik/Yi5mb3JtOnZvaWQgMDtjJiYhbS5fZGF0YShjLCJzdWJtaXRCdWJibGVzIikmJihtLmV2ZW50LmFkZChjLCJzdWJtaXQuX3N1Ym1pdCIsZnVuY3Rpb24oYSl7YS5fc3VibWl0X2J1YmJsZT0hMH0pLG0uX2RhdGEoYywic3VibWl0QnViYmxlcyIsITApKX0pfSxwb3N0RGlzcGF0Y2g6ZnVuY3Rpb24oYSl7YS5fc3VibWl0X2J1YmJsZSYmKGRlbGV0ZSBhLl9zdWJtaXRfYnViYmxlLHRoaXMucGFyZW50Tm9kZSYmIWEuaXNUcmlnZ2VyJiZtLmV2ZW50LnNpbXVsYXRlKCJzdWJtaXQiLHRoaXMucGFyZW50Tm9kZSxhLCEwKSl9LHRlYXJkb3duOmZ1bmN0aW9uKCl7cmV0dXJuIG0ubm9kZU5hbWUodGhpcywiZm9ybSIpPyExOnZvaWQgbS5ldmVudC5yZW1vdmUodGhpcywiLl9zdWJtaXQiKX19KSxrLmNoYW5nZUJ1YmJsZXN8fChtLmV2ZW50LnNwZWNpYWwuY2hhbmdlPXtzZXR1cDpmdW5jdGlvbigpe3JldHVybiBYLnRlc3QodGhpcy5ub2RlTmFtZSk/KCgiY2hlY2tib3giPT09dGhpcy50eXBlfHwicmFkaW8iPT09dGhpcy50eXBlKSYmKG0uZXZlbnQuYWRkKHRoaXMsInByb3BlcnR5Y2hhbmdlLl9jaGFuZ2UiLGZ1bmN0aW9uKGEpeyJjaGVja2VkIj09PWEub3JpZ2luYWxFdmVudC5wcm9wZXJ0eU5hbWUmJih0aGlzLl9qdXN0X2NoYW5nZWQ9ITApfSksbS5ldmVudC5hZGQodGhpcywiY2xpY2suX2NoYW5nZSIsZnVuY3Rpb24oYSl7dGhpcy5fanVzdF9jaGFuZ2VkJiYhYS5pc1RyaWdnZXImJih0aGlzLl9qdXN0X2NoYW5nZWQ9ITEpLG0uZXZlbnQuc2ltdWxhdGUoImNoYW5nZSIsdGhpcyxhLCEwKX0pKSwhMSk6dm9pZCBtLmV2ZW50LmFkZCh0aGlzLCJiZWZvcmVhY3RpdmF0ZS5fY2hhbmdlIixmdW5jdGlvbihhKXt2YXIgYj1hLnRhcmdldDtYLnRlc3QoYi5ub2RlTmFtZSkmJiFtLl9kYXRhKGIsImNoYW5nZUJ1YmJsZXMiKSYmKG0uZXZlbnQuYWRkKGIsImNoYW5nZS5fY2hhbmdlIixmdW5jdGlvbihhKXshdGhpcy5wYXJlbnROb2RlfHxhLmlzU2ltdWxhdGVkfHxhLmlzVHJpZ2dlcnx8bS5ldmVudC5zaW11bGF0ZSgiY2hhbmdlIix0aGlzLnBhcmVudE5vZGUsYSwhMCl9KSxtLl9kYXRhKGIsImNoYW5nZUJ1YmJsZXMiLCEwKSl9KX0saGFuZGxlOmZ1bmN0aW9uKGEpe3ZhciBiPWEudGFyZ2V0O3JldHVybiB0aGlzIT09Ynx8YS5pc1NpbXVsYXRlZHx8YS5pc1RyaWdnZXJ8fCJyYWRpbyIhPT1iLnR5cGUmJiJjaGVja2JveCIhPT1iLnR5cGU/YS5oYW5kbGVPYmouaGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dm9pZCAwfSx0ZWFyZG93bjpmdW5jdGlvbigpe3JldHVybiBtLmV2ZW50LnJlbW92ZSh0aGlzLCIuX2NoYW5nZSIpLCFYLnRlc3QodGhpcy5ub2RlTmFtZSl9fSksay5mb2N1c2luQnViYmxlc3x8bS5lYWNoKHtmb2N1czoiZm9jdXNpbiIsYmx1cjoiZm9jdXNvdXQifSxmdW5jdGlvbihhLGIpe3ZhciBjPWZ1bmN0aW9uKGEpe20uZXZlbnQuc2ltdWxhdGUoYixhLnRhcmdldCxtLmV2ZW50LmZpeChhKSwhMCl9O20uZXZlbnQuc3BlY2lhbFtiXT17c2V0dXA6ZnVuY3Rpb24oKXt2YXIgZD10aGlzLm93bmVyRG9jdW1lbnR8fHRoaXMsZT1tLl9kYXRhKGQsYik7ZXx8ZC5hZGRFdmVudExpc3RlbmVyKGEsYywhMCksbS5fZGF0YShkLGIsKGV8fDApKzEpfSx0ZWFyZG93bjpmdW5jdGlvbigpe3ZhciBkPXRoaXMub3duZXJEb2N1bWVudHx8dGhpcyxlPW0uX2RhdGEoZCxiKS0xO2U/bS5fZGF0YShkLGIsZSk6KGQucmVtb3ZlRXZlbnRMaXN0ZW5lcihhLGMsITApLG0uX3JlbW92ZURhdGEoZCxiKSl9fX0pLG0uZm4uZXh0ZW5kKHtvbjpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmLGc7aWYoIm9iamVjdCI9PXR5cGVvZiBhKXsic3RyaW5nIiE9dHlwZW9mIGImJihjPWN8fGIsYj12b2lkIDApO2ZvcihmIGluIGEpdGhpcy5vbihmLGIsYyxhW2ZdLGUpO3JldHVybiB0aGlzfWlmKG51bGw9PWMmJm51bGw9PWQ/KGQ9YixjPWI9dm9pZCAwKTpudWxsPT1kJiYoInN0cmluZyI9PXR5cGVvZiBiPyhkPWMsYz12b2lkIDApOihkPWMsYz1iLGI9dm9pZCAwKSksZD09PSExKWQ9YmE7ZWxzZSBpZighZClyZXR1cm4gdGhpcztyZXR1cm4gMT09PWUmJihnPWQsZD1mdW5jdGlvbihhKXtyZXR1cm4gbSgpLm9mZihhKSxnLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZC5ndWlkPWcuZ3VpZHx8KGcuZ3VpZD1tLmd1aWQrKykpLHRoaXMuZWFjaChmdW5jdGlvbigpe20uZXZlbnQuYWRkKHRoaXMsYSxkLGMsYil9KX0sb25lOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLm9uKGEsYixjLGQsMSl9LG9mZjpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZTtpZihhJiZhLnByZXZlbnREZWZhdWx0JiZhLmhhbmRsZU9iailyZXR1cm4gZD1hLmhhbmRsZU9iaixtKGEuZGVsZWdhdGVUYXJnZXQpLm9mZihkLm5hbWVzcGFjZT9kLm9yaWdUeXBlKyIuIitkLm5hbWVzcGFjZTpkLm9yaWdUeXBlLGQuc2VsZWN0b3IsZC5oYW5kbGVyKSx0aGlzO2lmKCJvYmplY3QiPT10eXBlb2YgYSl7Zm9yKGUgaW4gYSl0aGlzLm9mZihlLGIsYVtlXSk7cmV0dXJuIHRoaXN9cmV0dXJuKGI9PT0hMXx8ImZ1bmN0aW9uIj09dHlwZW9mIGIpJiYoYz1iLGI9dm9pZCAwKSxjPT09ITEmJihjPWJhKSx0aGlzLmVhY2goZnVuY3Rpb24oKXttLmV2ZW50LnJlbW92ZSh0aGlzLGEsYyxiKX0pfSx0cmlnZ2VyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe20uZXZlbnQudHJpZ2dlcihhLGIsdGhpcyl9KX0sdHJpZ2dlckhhbmRsZXI6ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzWzBdO3JldHVybiBjP20uZXZlbnQudHJpZ2dlcihhLGIsYywhMCk6dm9pZCAwfX0pO2Z1bmN0aW9uIGRhKGEpe3ZhciBiPWVhLnNwbGl0KCJ8IiksYz1hLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtpZihjLmNyZWF0ZUVsZW1lbnQpd2hpbGUoYi5sZW5ndGgpYy5jcmVhdGVFbGVtZW50KGIucG9wKCkpO3JldHVybiBjfXZhciBlYT0iYWJicnxhcnRpY2xlfGFzaWRlfGF1ZGlvfGJkaXxjYW52YXN8ZGF0YXxkYXRhbGlzdHxkZXRhaWxzfGZpZ2NhcHRpb258ZmlndXJlfGZvb3RlcnxoZWFkZXJ8aGdyb3VwfG1hcmt8bWV0ZXJ8bmF2fG91dHB1dHxwcm9ncmVzc3xzZWN0aW9ufHN1bW1hcnl8dGltZXx2aWRlbyIsZmE9LyBqUXVlcnlcZCs9Iig/Om51bGx8XGQrKSIvZyxnYT1uZXcgUmVnRXhwKCI8KD86IitlYSsiKVtcXHMvPl0iLCJpIiksaGE9L15ccysvLGlhPS88KD8hYXJlYXxicnxjb2x8ZW1iZWR8aHJ8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJhbSkoKFtcdzpdKylbXj5dKilcLz4vZ2ksamE9LzwoW1x3Ol0rKS8sa2E9Lzx0Ym9keS9pLGxhPS88fCYjP1x3KzsvLG1hPS88KD86c2NyaXB0fHN0eWxlfGxpbmspL2ksbmE9L2NoZWNrZWRccyooPzpbXj1dfD1ccyouY2hlY2tlZC4pL2ksb2E9L14kfFwvKD86amF2YXxlY21hKXNjcmlwdC9pLHBhPS9edHJ1ZVwvKC4qKS8scWE9L15ccyo8ISg/OlxbQ0RBVEFcW3wtLSl8KD86XF1cXXwtLSk+XHMqJC9nLHJhPXtvcHRpb246WzEsIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz4iLCI8L3NlbGVjdD4iXSxsZWdlbmQ6WzEsIjxmaWVsZHNldD4iLCI8L2ZpZWxkc2V0PiJdLGFyZWE6WzEsIjxtYXA+IiwiPC9tYXA+Il0scGFyYW06WzEsIjxvYmplY3Q+IiwiPC9vYmplY3Q+Il0sdGhlYWQ6WzEsIjx0YWJsZT4iLCI8L3RhYmxlPiJdLHRyOlsyLCI8dGFibGU+PHRib2R5PiIsIjwvdGJvZHk+PC90YWJsZT4iXSxjb2w6WzIsIjx0YWJsZT48dGJvZHk+PC90Ym9keT48Y29sZ3JvdXA+IiwiPC9jb2xncm91cD48L3RhYmxlPiJdLHRkOlszLCI8dGFibGU+PHRib2R5Pjx0cj4iLCI8L3RyPjwvdGJvZHk+PC90YWJsZT4iXSxfZGVmYXVsdDprLmh0bWxTZXJpYWxpemU/WzAsIiIsIiJdOlsxLCJYPGRpdj4iLCI8L2Rpdj4iXX0sc2E9ZGEoeSksdGE9c2EuYXBwZW5kQ2hpbGQoeS5jcmVhdGVFbGVtZW50KCJkaXYiKSk7cmEub3B0Z3JvdXA9cmEub3B0aW9uLHJhLnRib2R5PXJhLnRmb290PXJhLmNvbGdyb3VwPXJhLmNhcHRpb249cmEudGhlYWQscmEudGg9cmEudGQ7ZnVuY3Rpb24gdWEoYSxiKXt2YXIgYyxkLGU9MCxmPXR5cGVvZiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lIT09Sz9hLmdldEVsZW1lbnRzQnlUYWdOYW1lKGJ8fCIqIik6dHlwZW9mIGEucXVlcnlTZWxlY3RvckFsbCE9PUs/YS5xdWVyeVNlbGVjdG9yQWxsKGJ8fCIqIik6dm9pZCAwO2lmKCFmKWZvcihmPVtdLGM9YS5jaGlsZE5vZGVzfHxhO251bGwhPShkPWNbZV0pO2UrKykhYnx8bS5ub2RlTmFtZShkLGIpP2YucHVzaChkKTptLm1lcmdlKGYsdWEoZCxiKSk7cmV0dXJuIHZvaWQgMD09PWJ8fGImJm0ubm9kZU5hbWUoYSxiKT9tLm1lcmdlKFthXSxmKTpmfWZ1bmN0aW9uIHZhKGEpe1cudGVzdChhLnR5cGUpJiYoYS5kZWZhdWx0Q2hlY2tlZD1hLmNoZWNrZWQpfWZ1bmN0aW9uIHdhKGEsYil7cmV0dXJuIG0ubm9kZU5hbWUoYSwidGFibGUiKSYmbS5ub2RlTmFtZSgxMSE9PWIubm9kZVR5cGU/YjpiLmZpcnN0Q2hpbGQsInRyIik/YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKVswXXx8YS5hcHBlbmRDaGlsZChhLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGJvZHkiKSk6YX1mdW5jdGlvbiB4YShhKXtyZXR1cm4gYS50eXBlPShudWxsIT09bS5maW5kLmF0dHIoYSwidHlwZSIpKSsiLyIrYS50eXBlLGF9ZnVuY3Rpb24geWEoYSl7dmFyIGI9cGEuZXhlYyhhLnR5cGUpO3JldHVybiBiP2EudHlwZT1iWzFdOmEucmVtb3ZlQXR0cmlidXRlKCJ0eXBlIiksYX1mdW5jdGlvbiB6YShhLGIpe2Zvcih2YXIgYyxkPTA7bnVsbCE9KGM9YVtkXSk7ZCsrKW0uX2RhdGEoYywiZ2xvYmFsRXZhbCIsIWJ8fG0uX2RhdGEoYltkXSwiZ2xvYmFsRXZhbCIpKX1mdW5jdGlvbiBBYShhLGIpe2lmKDE9PT1iLm5vZGVUeXBlJiZtLmhhc0RhdGEoYSkpe3ZhciBjLGQsZSxmPW0uX2RhdGEoYSksZz1tLl9kYXRhKGIsZiksaD1mLmV2ZW50cztpZihoKXtkZWxldGUgZy5oYW5kbGUsZy5ldmVudHM9e307Zm9yKGMgaW4gaClmb3IoZD0wLGU9aFtjXS5sZW5ndGg7ZT5kO2QrKyltLmV2ZW50LmFkZChiLGMsaFtjXVtkXSl9Zy5kYXRhJiYoZy5kYXRhPW0uZXh0ZW5kKHt9LGcuZGF0YSkpfX1mdW5jdGlvbiBCYShhLGIpe3ZhciBjLGQsZTtpZigxPT09Yi5ub2RlVHlwZSl7aWYoYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksIWsubm9DbG9uZUV2ZW50JiZiW20uZXhwYW5kb10pe2U9bS5fZGF0YShiKTtmb3IoZCBpbiBlLmV2ZW50cyltLnJlbW92ZUV2ZW50KGIsZCxlLmhhbmRsZSk7Yi5yZW1vdmVBdHRyaWJ1dGUobS5leHBhbmRvKX0ic2NyaXB0Ij09PWMmJmIudGV4dCE9PWEudGV4dD8oeGEoYikudGV4dD1hLnRleHQseWEoYikpOiJvYmplY3QiPT09Yz8oYi5wYXJlbnROb2RlJiYoYi5vdXRlckhUTUw9YS5vdXRlckhUTUwpLGsuaHRtbDVDbG9uZSYmYS5pbm5lckhUTUwmJiFtLnRyaW0oYi5pbm5lckhUTUwpJiYoYi5pbm5lckhUTUw9YS5pbm5lckhUTUwpKToiaW5wdXQiPT09YyYmVy50ZXN0KGEudHlwZSk/KGIuZGVmYXVsdENoZWNrZWQ9Yi5jaGVja2VkPWEuY2hlY2tlZCxiLnZhbHVlIT09YS52YWx1ZSYmKGIudmFsdWU9YS52YWx1ZSkpOiJvcHRpb24iPT09Yz9iLmRlZmF1bHRTZWxlY3RlZD1iLnNlbGVjdGVkPWEuZGVmYXVsdFNlbGVjdGVkOigiaW5wdXQiPT09Y3x8InRleHRhcmVhIj09PWMpJiYoYi5kZWZhdWx0VmFsdWU9YS5kZWZhdWx0VmFsdWUpfX1tLmV4dGVuZCh7Y2xvbmU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZixnLGgsaT1tLmNvbnRhaW5zKGEub3duZXJEb2N1bWVudCxhKTtpZihrLmh0bWw1Q2xvbmV8fG0uaXNYTUxEb2MoYSl8fCFnYS50ZXN0KCI8IithLm5vZGVOYW1lKyI+Iik/Zj1hLmNsb25lTm9kZSghMCk6KHRhLmlubmVySFRNTD1hLm91dGVySFRNTCx0YS5yZW1vdmVDaGlsZChmPXRhLmZpcnN0Q2hpbGQpKSwhKGsubm9DbG9uZUV2ZW50JiZrLm5vQ2xvbmVDaGVja2VkfHwxIT09YS5ub2RlVHlwZSYmMTEhPT1hLm5vZGVUeXBlfHxtLmlzWE1MRG9jKGEpKSlmb3IoZD11YShmKSxoPXVhKGEpLGc9MDtudWxsIT0oZT1oW2ddKTsrK2cpZFtnXSYmQmEoZSxkW2ddKTtpZihiKWlmKGMpZm9yKGg9aHx8dWEoYSksZD1kfHx1YShmKSxnPTA7bnVsbCE9KGU9aFtnXSk7ZysrKUFhKGUsZFtnXSk7ZWxzZSBBYShhLGYpO3JldHVybiBkPXVhKGYsInNjcmlwdCIpLGQubGVuZ3RoPjAmJnphKGQsIWkmJnVhKGEsInNjcmlwdCIpKSxkPWg9ZT1udWxsLGZ9LGJ1aWxkRnJhZ21lbnQ6ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlLGYsZyxoLGksaixsLG49YS5sZW5ndGgsbz1kYShiKSxwPVtdLHE9MDtuPnE7cSsrKWlmKGY9YVtxXSxmfHwwPT09ZilpZigib2JqZWN0Ij09PW0udHlwZShmKSltLm1lcmdlKHAsZi5ub2RlVHlwZT9bZl06Zik7ZWxzZSBpZihsYS50ZXN0KGYpKXtoPWh8fG8uYXBwZW5kQ2hpbGQoYi5jcmVhdGVFbGVtZW50KCJkaXYiKSksaT0oamEuZXhlYyhmKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKSxsPXJhW2ldfHxyYS5fZGVmYXVsdCxoLmlubmVySFRNTD1sWzFdK2YucmVwbGFjZShpYSwiPCQxPjwvJDI+IikrbFsyXSxlPWxbMF07d2hpbGUoZS0tKWg9aC5sYXN0Q2hpbGQ7aWYoIWsubGVhZGluZ1doaXRlc3BhY2UmJmhhLnRlc3QoZikmJnAucHVzaChiLmNyZWF0ZVRleHROb2RlKGhhLmV4ZWMoZilbMF0pKSwhay50Ym9keSl7Zj0idGFibGUiIT09aXx8a2EudGVzdChmKT8iPHRhYmxlPiIhPT1sWzFdfHxrYS50ZXN0KGYpPzA6aDpoLmZpcnN0Q2hpbGQsZT1mJiZmLmNoaWxkTm9kZXMubGVuZ3RoO3doaWxlKGUtLSltLm5vZGVOYW1lKGo9Zi5jaGlsZE5vZGVzW2VdLCJ0Ym9keSIpJiYhai5jaGlsZE5vZGVzLmxlbmd0aCYmZi5yZW1vdmVDaGlsZChqKX1tLm1lcmdlKHAsaC5jaGlsZE5vZGVzKSxoLnRleHRDb250ZW50PSIiO3doaWxlKGguZmlyc3RDaGlsZCloLnJlbW92ZUNoaWxkKGguZmlyc3RDaGlsZCk7aD1vLmxhc3RDaGlsZH1lbHNlIHAucHVzaChiLmNyZWF0ZVRleHROb2RlKGYpKTtoJiZvLnJlbW92ZUNoaWxkKGgpLGsuYXBwZW5kQ2hlY2tlZHx8bS5ncmVwKHVhKHAsImlucHV0IiksdmEpLHE9MDt3aGlsZShmPXBbcSsrXSlpZigoIWR8fC0xPT09bS5pbkFycmF5KGYsZCkpJiYoZz1tLmNvbnRhaW5zKGYub3duZXJEb2N1bWVudCxmKSxoPXVhKG8uYXBwZW5kQ2hpbGQoZiksInNjcmlwdCIpLGcmJnphKGgpLGMpKXtlPTA7d2hpbGUoZj1oW2UrK10pb2EudGVzdChmLnR5cGV8fCIiKSYmYy5wdXNoKGYpfXJldHVybiBoPW51bGwsb30sY2xlYW5EYXRhOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkLGUsZixnLGg9MCxpPW0uZXhwYW5kbyxqPW0uY2FjaGUsbD1rLmRlbGV0ZUV4cGFuZG8sbj1tLmV2ZW50LnNwZWNpYWw7bnVsbCE9KGQ9YVtoXSk7aCsrKWlmKChifHxtLmFjY2VwdERhdGEoZCkpJiYoZj1kW2ldLGc9ZiYmaltmXSkpe2lmKGcuZXZlbnRzKWZvcihlIGluIGcuZXZlbnRzKW5bZV0/bS5ldmVudC5yZW1vdmUoZCxlKTptLnJlbW92ZUV2ZW50KGQsZSxnLmhhbmRsZSk7altmXSYmKGRlbGV0ZSBqW2ZdLGw/ZGVsZXRlIGRbaV06dHlwZW9mIGQucmVtb3ZlQXR0cmlidXRlIT09Sz9kLnJlbW92ZUF0dHJpYnV0ZShpKTpkW2ldPW51bGwsYy5wdXNoKGYpKX19fSksbS5mbi5leHRlbmQoe3RleHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIFYodGhpcyxmdW5jdGlvbihhKXtyZXR1cm4gdm9pZCAwPT09YT9tLnRleHQodGhpcyk6dGhpcy5lbXB0eSgpLmFwcGVuZCgodGhpc1swXSYmdGhpc1swXS5vd25lckRvY3VtZW50fHx5KS5jcmVhdGVUZXh0Tm9kZShhKSl9LG51bGwsYSxhcmd1bWVudHMubGVuZ3RoKX0sYXBwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLGZ1bmN0aW9uKGEpe2lmKDE9PT10aGlzLm5vZGVUeXBlfHwxMT09PXRoaXMubm9kZVR5cGV8fDk9PT10aGlzLm5vZGVUeXBlKXt2YXIgYj13YSh0aGlzLGEpO2IuYXBwZW5kQ2hpbGQoYSl9fSl9LHByZXBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24oYSl7aWYoMT09PXRoaXMubm9kZVR5cGV8fDExPT09dGhpcy5ub2RlVHlwZXx8OT09PXRoaXMubm9kZVR5cGUpe3ZhciBiPXdhKHRoaXMsYSk7Yi5pbnNlcnRCZWZvcmUoYSxiLmZpcnN0Q2hpbGQpfX0pfSxiZWZvcmU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGEsdGhpcyl9KX0sYWZ0ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGEsdGhpcy5uZXh0U2libGluZyl9KX0scmVtb3ZlOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjLGQ9YT9tLmZpbHRlcihhLHRoaXMpOnRoaXMsZT0wO251bGwhPShjPWRbZV0pO2UrKylifHwxIT09Yy5ub2RlVHlwZXx8bS5jbGVhbkRhdGEodWEoYykpLGMucGFyZW50Tm9kZSYmKGImJm0uY29udGFpbnMoYy5vd25lckRvY3VtZW50LGMpJiZ6YSh1YShjLCJzY3JpcHQiKSksYy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGMpKTtyZXR1cm4gdGhpc30sZW1wdHk6ZnVuY3Rpb24oKXtmb3IodmFyIGEsYj0wO251bGwhPShhPXRoaXNbYl0pO2IrKyl7MT09PWEubm9kZVR5cGUmJm0uY2xlYW5EYXRhKHVhKGEsITEpKTt3aGlsZShhLmZpcnN0Q2hpbGQpYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2Eub3B0aW9ucyYmbS5ub2RlTmFtZShhLCJzZWxlY3QiKSYmKGEub3B0aW9ucy5sZW5ndGg9MCl9cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGE9bnVsbD09YT8hMTphLGI9bnVsbD09Yj9hOmIsdGhpcy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gbS5jbG9uZSh0aGlzLGEsYil9KX0saHRtbDpmdW5jdGlvbihhKXtyZXR1cm4gVih0aGlzLGZ1bmN0aW9uKGEpe3ZhciBiPXRoaXNbMF18fHt9LGM9MCxkPXRoaXMubGVuZ3RoO2lmKHZvaWQgMD09PWEpcmV0dXJuIDE9PT1iLm5vZGVUeXBlP2IuaW5uZXJIVE1MLnJlcGxhY2UoZmEsIiIpOnZvaWQgMDtpZighKCJzdHJpbmciIT10eXBlb2YgYXx8bWEudGVzdChhKXx8IWsuaHRtbFNlcmlhbGl6ZSYmZ2EudGVzdChhKXx8IWsubGVhZGluZ1doaXRlc3BhY2UmJmhhLnRlc3QoYSl8fHJhWyhqYS5leGVjKGEpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpXSkpe2E9YS5yZXBsYWNlKGlhLCI8JDE+PC8kMj4iKTt0cnl7Zm9yKDtkPmM7YysrKWI9dGhpc1tjXXx8e30sMT09PWIubm9kZVR5cGUmJihtLmNsZWFuRGF0YSh1YShiLCExKSksYi5pbm5lckhUTUw9YSk7Yj0wfWNhdGNoKGUpe319YiYmdGhpcy5lbXB0eSgpLmFwcGVuZChhKX0sbnVsbCxhLGFyZ3VtZW50cy5sZW5ndGgpfSxyZXBsYWNlV2l0aDpmdW5jdGlvbigpe3ZhciBhPWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24oYil7YT10aGlzLnBhcmVudE5vZGUsbS5jbGVhbkRhdGEodWEodGhpcykpLGEmJmEucmVwbGFjZUNoaWxkKGIsdGhpcyl9KSxhJiYoYS5sZW5ndGh8fGEubm9kZVR5cGUpP3RoaXM6dGhpcy5yZW1vdmUoKX0sZGV0YWNoOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnJlbW92ZShhLCEwKX0sZG9tTWFuaXA6ZnVuY3Rpb24oYSxiKXthPWUuYXBwbHkoW10sYSk7dmFyIGMsZCxmLGcsaCxpLGo9MCxsPXRoaXMubGVuZ3RoLG49dGhpcyxvPWwtMSxwPWFbMF0scT1tLmlzRnVuY3Rpb24ocCk7aWYocXx8bD4xJiYic3RyaW5nIj09dHlwZW9mIHAmJiFrLmNoZWNrQ2xvbmUmJm5hLnRlc3QocCkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihjKXt2YXIgZD1uLmVxKGMpO3EmJihhWzBdPXAuY2FsbCh0aGlzLGMsZC5odG1sKCkpKSxkLmRvbU1hbmlwKGEsYil9KTtpZihsJiYoaT1tLmJ1aWxkRnJhZ21lbnQoYSx0aGlzWzBdLm93bmVyRG9jdW1lbnQsITEsdGhpcyksYz1pLmZpcnN0Q2hpbGQsMT09PWkuY2hpbGROb2Rlcy5sZW5ndGgmJihpPWMpLGMpKXtmb3IoZz1tLm1hcCh1YShpLCJzY3JpcHQiKSx4YSksZj1nLmxlbmd0aDtsPmo7aisrKWQ9aSxqIT09byYmKGQ9bS5jbG9uZShkLCEwLCEwKSxmJiZtLm1lcmdlKGcsdWEoZCwic2NyaXB0IikpKSxiLmNhbGwodGhpc1tqXSxkLGopO2lmKGYpZm9yKGg9Z1tnLmxlbmd0aC0xXS5vd25lckRvY3VtZW50LG0ubWFwKGcseWEpLGo9MDtmPmo7aisrKWQ9Z1tqXSxvYS50ZXN0KGQudHlwZXx8IiIpJiYhbS5fZGF0YShkLCJnbG9iYWxFdmFsIikmJm0uY29udGFpbnMoaCxkKSYmKGQuc3JjP20uX2V2YWxVcmwmJm0uX2V2YWxVcmwoZC5zcmMpOm0uZ2xvYmFsRXZhbCgoZC50ZXh0fHxkLnRleHRDb250ZW50fHxkLmlubmVySFRNTHx8IiIpLnJlcGxhY2UocWEsIiIpKSk7aT1jPW51bGx9cmV0dXJuIHRoaXN9fSksbS5lYWNoKHthcHBlbmRUbzoiYXBwZW5kIixwcmVwZW5kVG86InByZXBlbmQiLGluc2VydEJlZm9yZToiYmVmb3JlIixpbnNlcnRBZnRlcjoiYWZ0ZXIiLHJlcGxhY2VBbGw6InJlcGxhY2VXaXRoIn0sZnVuY3Rpb24oYSxiKXttLmZuW2FdPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYyxkPTAsZT1bXSxnPW0oYSksaD1nLmxlbmd0aC0xO2g+PWQ7ZCsrKWM9ZD09PWg/dGhpczp0aGlzLmNsb25lKCEwKSxtKGdbZF0pW2JdKGMpLGYuYXBwbHkoZSxjLmdldCgpKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soZSl9fSk7dmFyIENhLERhPXt9O2Z1bmN0aW9uIEVhKGIsYyl7dmFyIGQsZT1tKGMuY3JlYXRlRWxlbWVudChiKSkuYXBwZW5kVG8oYy5ib2R5KSxmPWEuZ2V0RGVmYXVsdENvbXB1dGVkU3R5bGUmJihkPWEuZ2V0RGVmYXVsdENvbXB1dGVkU3R5bGUoZVswXSkpP2QuZGlzcGxheTptLmNzcyhlWzBdLCJkaXNwbGF5Iik7cmV0dXJuIGUuZGV0YWNoKCksZn1mdW5jdGlvbiBGYShhKXt2YXIgYj15LGM9RGFbYV07cmV0dXJuIGN8fChjPUVhKGEsYiksIm5vbmUiIT09YyYmY3x8KENhPShDYXx8bSgiPGlmcmFtZSBmcmFtZWJvcmRlcj0nMCcgd2lkdGg9JzAnIGhlaWdodD0nMCcvPiIpKS5hcHBlbmRUbyhiLmRvY3VtZW50RWxlbWVudCksYj0oQ2FbMF0uY29udGVudFdpbmRvd3x8Q2FbMF0uY29udGVudERvY3VtZW50KS5kb2N1bWVudCxiLndyaXRlKCksYi5jbG9zZSgpLGM9RWEoYSxiKSxDYS5kZXRhY2goKSksRGFbYV09YyksY30hZnVuY3Rpb24oKXt2YXIgYTtrLnNocmlua1dyYXBCbG9ja3M9ZnVuY3Rpb24oKXtpZihudWxsIT1hKXJldHVybiBhO2E9ITE7dmFyIGIsYyxkO3JldHVybiBjPXkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHkiKVswXSxjJiZjLnN0eWxlPyhiPXkuY3JlYXRlRWxlbWVudCgiZGl2IiksZD15LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGQuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyOjA7d2lkdGg6MDtoZWlnaHQ6MDt0b3A6MDtsZWZ0Oi05OTk5cHgiLGMuYXBwZW5kQ2hpbGQoZCkuYXBwZW5kQ2hpbGQoYiksdHlwZW9mIGIuc3R5bGUuem9vbSE9PUsmJihiLnN0eWxlLmNzc1RleHQ9Ii13ZWJraXQtYm94LXNpemluZzpjb250ZW50LWJveDstbW96LWJveC1zaXppbmc6Y29udGVudC1ib3g7Ym94LXNpemluZzpjb250ZW50LWJveDtkaXNwbGF5OmJsb2NrO21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MXB4O3dpZHRoOjFweDt6b29tOjEiLGIuYXBwZW5kQ2hpbGQoeS5jcmVhdGVFbGVtZW50KCJkaXYiKSkuc3R5bGUud2lkdGg9IjVweCIsYT0zIT09Yi5vZmZzZXRXaWR0aCksYy5yZW1vdmVDaGlsZChkKSxhKTp2b2lkIDB9fSgpO3ZhciBHYT0vXm1hcmdpbi8sSGE9bmV3IFJlZ0V4cCgiXigiK1MrIikoPyFweClbYS16JV0rJCIsImkiKSxJYSxKYSxLYT0vXih0b3B8cmlnaHR8Ym90dG9tfGxlZnQpJC87YS5nZXRDb21wdXRlZFN0eWxlPyhJYT1mdW5jdGlvbihiKXtyZXR1cm4gYi5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3Lm9wZW5lcj9iLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpOmEuZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpfSxKYT1mdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmLGcsaD1hLnN0eWxlO3JldHVybiBjPWN8fElhKGEpLGc9Yz9jLmdldFByb3BlcnR5VmFsdWUoYil8fGNbYl06dm9pZCAwLGMmJigiIiE9PWd8fG0uY29udGFpbnMoYS5vd25lckRvY3VtZW50LGEpfHwoZz1tLnN0eWxlKGEsYikpLEhhLnRlc3QoZykmJkdhLnRlc3QoYikmJihkPWgud2lkdGgsZT1oLm1pbldpZHRoLGY9aC5tYXhXaWR0aCxoLm1pbldpZHRoPWgubWF4V2lkdGg9aC53aWR0aD1nLGc9Yy53aWR0aCxoLndpZHRoPWQsaC5taW5XaWR0aD1lLGgubWF4V2lkdGg9ZikpLHZvaWQgMD09PWc/ZzpnKyIifSk6eS5kb2N1bWVudEVsZW1lbnQuY3VycmVudFN0eWxlJiYoSWE9ZnVuY3Rpb24oYSl7cmV0dXJuIGEuY3VycmVudFN0eWxlfSxKYT1mdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmLGcsaD1hLnN0eWxlO3JldHVybiBjPWN8fElhKGEpLGc9Yz9jW2JdOnZvaWQgMCxudWxsPT1nJiZoJiZoW2JdJiYoZz1oW2JdKSxIYS50ZXN0KGcpJiYhS2EudGVzdChiKSYmKGQ9aC5sZWZ0LGU9YS5ydW50aW1lU3R5bGUsZj1lJiZlLmxlZnQsZiYmKGUubGVmdD1hLmN1cnJlbnRTdHlsZS5sZWZ0KSxoLmxlZnQ9ImZvbnRTaXplIj09PWI/IjFlbSI6ZyxnPWgucGl4ZWxMZWZ0KyJweCIsaC5sZWZ0PWQsZiYmKGUubGVmdD1mKSksdm9pZCAwPT09Zz9nOmcrIiJ8fCJhdXRvIn0pO2Z1bmN0aW9uIExhKGEsYil7cmV0dXJue2dldDpmdW5jdGlvbigpe3ZhciBjPWEoKTtpZihudWxsIT1jKXJldHVybiBjP3ZvaWQgZGVsZXRlIHRoaXMuZ2V0Oih0aGlzLmdldD1iKS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fX0hZnVuY3Rpb24oKXt2YXIgYixjLGQsZSxmLGcsaDtpZihiPXkuY3JlYXRlRWxlbWVudCgiZGl2IiksYi5pbm5lckhUTUw9IiAgPGxpbmsvPjx0YWJsZT48L3RhYmxlPjxhIGhyZWY9Jy9hJz5hPC9hPjxpbnB1dCB0eXBlPSdjaGVja2JveCcvPiIsZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhIilbMF0sYz1kJiZkLnN0eWxlKXtjLmNzc1RleHQ9ImZsb2F0OmxlZnQ7b3BhY2l0eTouNSIsay5vcGFjaXR5PSIwLjUiPT09Yy5vcGFjaXR5LGsuY3NzRmxvYXQ9ISFjLmNzc0Zsb2F0LGIuc3R5bGUuYmFja2dyb3VuZENsaXA9ImNvbnRlbnQtYm94IixiLmNsb25lTm9kZSghMCkuc3R5bGUuYmFja2dyb3VuZENsaXA9IiIsay5jbGVhckNsb25lU3R5bGU9ImNvbnRlbnQtYm94Ij09PWIuc3R5bGUuYmFja2dyb3VuZENsaXAsay5ib3hTaXppbmc9IiI9PT1jLmJveFNpemluZ3x8IiI9PT1jLk1vekJveFNpemluZ3x8IiI9PT1jLldlYmtpdEJveFNpemluZyxtLmV4dGVuZChrLHtyZWxpYWJsZUhpZGRlbk9mZnNldHM6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbD09ZyYmaSgpLGd9LGJveFNpemluZ1JlbGlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PWYmJmkoKSxmfSxwaXhlbFBvc2l0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PWUmJmkoKSxlfSxyZWxpYWJsZU1hcmdpblJpZ2h0OmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PWgmJmkoKSxofX0pO2Z1bmN0aW9uIGkoKXt2YXIgYixjLGQsaTtjPXkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHkiKVswXSxjJiZjLnN0eWxlJiYoYj15LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGQ9eS5jcmVhdGVFbGVtZW50KCJkaXYiKSxkLnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOmFic29sdXRlO2JvcmRlcjowO3dpZHRoOjA7aGVpZ2h0OjA7dG9wOjA7bGVmdDotOTk5OXB4IixjLmFwcGVuZENoaWxkKGQpLmFwcGVuZENoaWxkKGIpLGIuc3R5bGUuY3NzVGV4dD0iLXdlYmtpdC1ib3gtc2l6aW5nOmJvcmRlci1ib3g7LW1vei1ib3gtc2l6aW5nOmJvcmRlci1ib3g7Ym94LXNpemluZzpib3JkZXItYm94O2Rpc3BsYXk6YmxvY2s7bWFyZ2luLXRvcDoxJTt0b3A6MSU7Ym9yZGVyOjFweDtwYWRkaW5nOjFweDt3aWR0aDo0cHg7cG9zaXRpb246YWJzb2x1dGUiLGU9Zj0hMSxoPSEwLGEuZ2V0Q29tcHV0ZWRTdHlsZSYmKGU9IjElIiE9PShhLmdldENvbXB1dGVkU3R5bGUoYixudWxsKXx8e30pLnRvcCxmPSI0cHgiPT09KGEuZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpfHx7d2lkdGg6IjRweCJ9KS53aWR0aCxpPWIuYXBwZW5kQ2hpbGQoeS5jcmVhdGVFbGVtZW50KCJkaXYiKSksaS5zdHlsZS5jc3NUZXh0PWIuc3R5bGUuY3NzVGV4dD0iLXdlYmtpdC1ib3gtc2l6aW5nOmNvbnRlbnQtYm94Oy1tb3otYm94LXNpemluZzpjb250ZW50LWJveDtib3gtc2l6aW5nOmNvbnRlbnQtYm94O2Rpc3BsYXk6YmxvY2s7bWFyZ2luOjA7Ym9yZGVyOjA7cGFkZGluZzowIixpLnN0eWxlLm1hcmdpblJpZ2h0PWkuc3R5bGUud2lkdGg9IjAiLGIuc3R5bGUud2lkdGg9IjFweCIsaD0hcGFyc2VGbG9hdCgoYS5nZXRDb21wdXRlZFN0eWxlKGksbnVsbCl8fHt9KS5tYXJnaW5SaWdodCksYi5yZW1vdmVDaGlsZChpKSksYi5pbm5lckhUTUw9Ijx0YWJsZT48dHI+PHRkPjwvdGQ+PHRkPnQ8L3RkPjwvdHI+PC90YWJsZT4iLGk9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGQiKSxpWzBdLnN0eWxlLmNzc1RleHQ9Im1hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MDtkaXNwbGF5Om5vbmUiLGc9MD09PWlbMF0ub2Zmc2V0SGVpZ2h0LGcmJihpWzBdLnN0eWxlLmRpc3BsYXk9IiIsaVsxXS5zdHlsZS5kaXNwbGF5PSJub25lIixnPTA9PT1pWzBdLm9mZnNldEhlaWdodCksYy5yZW1vdmVDaGlsZChkKSl9fX0oKSxtLnN3YXA9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGUsZixnPXt9O2ZvcihmIGluIGIpZ1tmXT1hLnN0eWxlW2ZdLGEuc3R5bGVbZl09YltmXTtlPWMuYXBwbHkoYSxkfHxbXSk7Zm9yKGYgaW4gYilhLnN0eWxlW2ZdPWdbZl07cmV0dXJuIGV9O3ZhciBNYT0vYWxwaGFcKFteKV0qXCkvaSxOYT0vb3BhY2l0eVxzKj1ccyooW14pXSopLyxPYT0vXihub25lfHRhYmxlKD8hLWNbZWFdKS4rKS8sUGE9bmV3IFJlZ0V4cCgiXigiK1MrIikoLiopJCIsImkiKSxRYT1uZXcgUmVnRXhwKCJeKFsrLV0pPSgiK1MrIikiLCJpIiksUmE9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdmlzaWJpbGl0eToiaGlkZGVuIixkaXNwbGF5OiJibG9jayJ9LFNhPXtsZXR0ZXJTcGFjaW5nOiIwIixmb250V2VpZ2h0OiI0MDAifSxUYT1bIldlYmtpdCIsIk8iLCJNb3oiLCJtcyJdO2Z1bmN0aW9uIFVhKGEsYil7aWYoYiBpbiBhKXJldHVybiBiO3ZhciBjPWIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYi5zbGljZSgxKSxkPWIsZT1UYS5sZW5ndGg7d2hpbGUoZS0tKWlmKGI9VGFbZV0rYyxiIGluIGEpcmV0dXJuIGI7cmV0dXJuIGR9ZnVuY3Rpb24gVmEoYSxiKXtmb3IodmFyIGMsZCxlLGY9W10sZz0wLGg9YS5sZW5ndGg7aD5nO2crKylkPWFbZ10sZC5zdHlsZSYmKGZbZ109bS5fZGF0YShkLCJvbGRkaXNwbGF5IiksYz1kLnN0eWxlLmRpc3BsYXksYj8oZltnXXx8Im5vbmUiIT09Y3x8KGQuc3R5bGUuZGlzcGxheT0iIiksIiI9PT1kLnN0eWxlLmRpc3BsYXkmJlUoZCkmJihmW2ddPW0uX2RhdGEoZCwib2xkZGlzcGxheSIsRmEoZC5ub2RlTmFtZSkpKSk6KGU9VShkKSwoYyYmIm5vbmUiIT09Y3x8IWUpJiZtLl9kYXRhKGQsIm9sZGRpc3BsYXkiLGU/YzptLmNzcyhkLCJkaXNwbGF5IikpKSk7Zm9yKGc9MDtoPmc7ZysrKWQ9YVtnXSxkLnN0eWxlJiYoYiYmIm5vbmUiIT09ZC5zdHlsZS5kaXNwbGF5JiYiIiE9PWQuc3R5bGUuZGlzcGxheXx8KGQuc3R5bGUuZGlzcGxheT1iP2ZbZ118fCIiOiJub25lIikpO3JldHVybiBhfWZ1bmN0aW9uIFdhKGEsYixjKXt2YXIgZD1QYS5leGVjKGIpO3JldHVybiBkP01hdGgubWF4KDAsZFsxXS0oY3x8MCkpKyhkWzJdfHwicHgiKTpifWZ1bmN0aW9uIFhhKGEsYixjLGQsZSl7Zm9yKHZhciBmPWM9PT0oZD8iYm9yZGVyIjoiY29udGVudCIpPzQ6IndpZHRoIj09PWI/MTowLGc9MDs0PmY7Zis9MikibWFyZ2luIj09PWMmJihnKz1tLmNzcyhhLGMrVFtmXSwhMCxlKSksZD8oImNvbnRlbnQiPT09YyYmKGctPW0uY3NzKGEsInBhZGRpbmciK1RbZl0sITAsZSkpLCJtYXJnaW4iIT09YyYmKGctPW0uY3NzKGEsImJvcmRlciIrVFtmXSsiV2lkdGgiLCEwLGUpKSk6KGcrPW0uY3NzKGEsInBhZGRpbmciK1RbZl0sITAsZSksInBhZGRpbmciIT09YyYmKGcrPW0uY3NzKGEsImJvcmRlciIrVFtmXSsiV2lkdGgiLCEwLGUpKSk7cmV0dXJuIGd9ZnVuY3Rpb24gWWEoYSxiLGMpe3ZhciBkPSEwLGU9IndpZHRoIj09PWI/YS5vZmZzZXRXaWR0aDphLm9mZnNldEhlaWdodCxmPUlhKGEpLGc9ay5ib3hTaXppbmcmJiJib3JkZXItYm94Ij09PW0uY3NzKGEsImJveFNpemluZyIsITEsZik7aWYoMD49ZXx8bnVsbD09ZSl7aWYoZT1KYShhLGIsZiksKDA+ZXx8bnVsbD09ZSkmJihlPWEuc3R5bGVbYl0pLEhhLnRlc3QoZSkpcmV0dXJuIGU7ZD1nJiYoay5ib3hTaXppbmdSZWxpYWJsZSgpfHxlPT09YS5zdHlsZVtiXSksZT1wYXJzZUZsb2F0KGUpfHwwfXJldHVybiBlK1hhKGEsYixjfHwoZz8iYm9yZGVyIjoiY29udGVudCIpLGQsZikrInB4In1tLmV4dGVuZCh7Y3NzSG9va3M6e29wYWNpdHk6e2dldDpmdW5jdGlvbihhLGIpe2lmKGIpe3ZhciBjPUphKGEsIm9wYWNpdHkiKTtyZXR1cm4iIj09PWM/IjEiOmN9fX19LGNzc051bWJlcjp7Y29sdW1uQ291bnQ6ITAsZmlsbE9wYWNpdHk6ITAsZmxleEdyb3c6ITAsZmxleFNocmluazohMCxmb250V2VpZ2h0OiEwLGxpbmVIZWlnaHQ6ITAsb3BhY2l0eTohMCxvcmRlcjohMCxvcnBoYW5zOiEwLHdpZG93czohMCx6SW5kZXg6ITAsem9vbTohMH0sY3NzUHJvcHM6eyJmbG9hdCI6ay5jc3NGbG9hdD8iY3NzRmxvYXQiOiJzdHlsZUZsb2F0In0sc3R5bGU6ZnVuY3Rpb24oYSxiLGMsZCl7aWYoYSYmMyE9PWEubm9kZVR5cGUmJjghPT1hLm5vZGVUeXBlJiZhLnN0eWxlKXt2YXIgZSxmLGcsaD1tLmNhbWVsQ2FzZShiKSxpPWEuc3R5bGU7aWYoYj1tLmNzc1Byb3BzW2hdfHwobS5jc3NQcm9wc1toXT1VYShpLGgpKSxnPW0uY3NzSG9va3NbYl18fG0uY3NzSG9va3NbaF0sdm9pZCAwPT09YylyZXR1cm4gZyYmImdldCJpbiBnJiZ2b2lkIDAhPT0oZT1nLmdldChhLCExLGQpKT9lOmlbYl07aWYoZj10eXBlb2YgYywic3RyaW5nIj09PWYmJihlPVFhLmV4ZWMoYykpJiYoYz0oZVsxXSsxKSplWzJdK3BhcnNlRmxvYXQobS5jc3MoYSxiKSksZj0ibnVtYmVyIiksbnVsbCE9YyYmYz09PWMmJigibnVtYmVyIiE9PWZ8fG0uY3NzTnVtYmVyW2hdfHwoYys9InB4Iiksay5jbGVhckNsb25lU3R5bGV8fCIiIT09Y3x8MCE9PWIuaW5kZXhPZigiYmFja2dyb3VuZCIpfHwoaVtiXT0iaW5oZXJpdCIpLCEoZyYmInNldCJpbiBnJiZ2b2lkIDA9PT0oYz1nLnNldChhLGMsZCkpKSkpdHJ5e2lbYl09Y31jYXRjaChqKXt9fX0sY3NzOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlLGYsZyxoPW0uY2FtZWxDYXNlKGIpO3JldHVybiBiPW0uY3NzUHJvcHNbaF18fChtLmNzc1Byb3BzW2hdPVVhKGEuc3R5bGUsaCkpLGc9bS5jc3NIb29rc1tiXXx8bS5jc3NIb29rc1toXSxnJiYiZ2V0ImluIGcmJihmPWcuZ2V0KGEsITAsYykpLHZvaWQgMD09PWYmJihmPUphKGEsYixkKSksIm5vcm1hbCI9PT1mJiZiIGluIFNhJiYoZj1TYVtiXSksIiI9PT1jfHxjPyhlPXBhcnNlRmxvYXQoZiksYz09PSEwfHxtLmlzTnVtZXJpYyhlKT9lfHwwOmYpOmZ9fSksbS5lYWNoKFsiaGVpZ2h0Iiwid2lkdGgiXSxmdW5jdGlvbihhLGIpe20uY3NzSG9va3NbYl09e2dldDpmdW5jdGlvbihhLGMsZCl7cmV0dXJuIGM/T2EudGVzdChtLmNzcyhhLCJkaXNwbGF5IikpJiYwPT09YS5vZmZzZXRXaWR0aD9tLnN3YXAoYSxSYSxmdW5jdGlvbigpe3JldHVybiBZYShhLGIsZCl9KTpZYShhLGIsZCk6dm9pZCAwfSxzZXQ6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlPWQmJklhKGEpO3JldHVybiBXYShhLGMsZD9YYShhLGIsZCxrLmJveFNpemluZyYmImJvcmRlci1ib3giPT09bS5jc3MoYSwiYm94U2l6aW5nIiwhMSxlKSxlKTowKX19fSksay5vcGFjaXR5fHwobS5jc3NIb29rcy5vcGFjaXR5PXtnZXQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gTmEudGVzdCgoYiYmYS5jdXJyZW50U3R5bGU/YS5jdXJyZW50U3R5bGUuZmlsdGVyOmEuc3R5bGUuZmlsdGVyKXx8IiIpPy4wMSpwYXJzZUZsb2F0KFJlZ0V4cC4kMSkrIiI6Yj8iMSI6IiJ9LHNldDpmdW5jdGlvbihhLGIpe3ZhciBjPWEuc3R5bGUsZD1hLmN1cnJlbnRTdHlsZSxlPW0uaXNOdW1lcmljKGIpPyJhbHBoYShvcGFjaXR5PSIrMTAwKmIrIikiOiIiLGY9ZCYmZC5maWx0ZXJ8fGMuZmlsdGVyfHwiIjtjLnpvb209MSwoYj49MXx8IiI9PT1iKSYmIiI9PT1tLnRyaW0oZi5yZXBsYWNlKE1hLCIiKSkmJmMucmVtb3ZlQXR0cmlidXRlJiYoYy5yZW1vdmVBdHRyaWJ1dGUoImZpbHRlciIpLCIiPT09Ynx8ZCYmIWQuZmlsdGVyKXx8KGMuZmlsdGVyPU1hLnRlc3QoZik/Zi5yZXBsYWNlKE1hLGUpOmYrIiAiK2UpfX0pLG0uY3NzSG9va3MubWFyZ2luUmlnaHQ9TGEoay5yZWxpYWJsZU1hcmdpblJpZ2h0LGZ1bmN0aW9uKGEsYil7cmV0dXJuIGI/bS5zd2FwKGEse2Rpc3BsYXk6ImlubGluZS1ibG9jayJ9LEphLFthLCJtYXJnaW5SaWdodCJdKTp2b2lkIDB9KSxtLmVhY2goe21hcmdpbjoiIixwYWRkaW5nOiIiLGJvcmRlcjoiV2lkdGgifSxmdW5jdGlvbihhLGIpe20uY3NzSG9va3NbYStiXT17ZXhwYW5kOmZ1bmN0aW9uKGMpe2Zvcih2YXIgZD0wLGU9e30sZj0ic3RyaW5nIj09dHlwZW9mIGM/Yy5zcGxpdCgiICIpOltjXTs0PmQ7ZCsrKWVbYStUW2RdK2JdPWZbZF18fGZbZC0yXXx8ZlswXTtyZXR1cm4gZX19LEdhLnRlc3QoYSl8fChtLmNzc0hvb2tzW2ErYl0uc2V0PVdhKX0pLG0uZm4uZXh0ZW5kKHtjc3M6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gVih0aGlzLGZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGY9e30sZz0wO2lmKG0uaXNBcnJheShiKSl7Zm9yKGQ9SWEoYSksZT1iLmxlbmd0aDtlPmc7ZysrKWZbYltnXV09bS5jc3MoYSxiW2ddLCExLGQpO3JldHVybiBmfXJldHVybiB2b2lkIDAhPT1jP20uc3R5bGUoYSxiLGMpOm0uY3NzKGEsYil9LGEsYixhcmd1bWVudHMubGVuZ3RoPjEpfSxzaG93OmZ1bmN0aW9uKCl7cmV0dXJuIFZhKHRoaXMsITApfSxoaWRlOmZ1bmN0aW9uKCl7cmV0dXJuIFZhKHRoaXMpfSx0b2dnbGU6ZnVuY3Rpb24oYSl7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgYT9hP3RoaXMuc2hvdygpOnRoaXMuaGlkZSgpOnRoaXMuZWFjaChmdW5jdGlvbigpe1UodGhpcyk/bSh0aGlzKS5zaG93KCk6bSh0aGlzKS5oaWRlKCl9KX19KTtmdW5jdGlvbiBaYShhLGIsYyxkLGUpewpyZXR1cm4gbmV3IFphLnByb3RvdHlwZS5pbml0KGEsYixjLGQsZSl9bS5Ud2Vlbj1aYSxaYS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlphLGluaXQ6ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe3RoaXMuZWxlbT1hLHRoaXMucHJvcD1jLHRoaXMuZWFzaW5nPWV8fCJzd2luZyIsdGhpcy5vcHRpb25zPWIsdGhpcy5zdGFydD10aGlzLm5vdz10aGlzLmN1cigpLHRoaXMuZW5kPWQsdGhpcy51bml0PWZ8fChtLmNzc051bWJlcltjXT8iIjoicHgiKX0sY3VyOmZ1bmN0aW9uKCl7dmFyIGE9WmEucHJvcEhvb2tzW3RoaXMucHJvcF07cmV0dXJuIGEmJmEuZ2V0P2EuZ2V0KHRoaXMpOlphLnByb3BIb29rcy5fZGVmYXVsdC5nZXQodGhpcyl9LHJ1bjpmdW5jdGlvbihhKXt2YXIgYixjPVphLnByb3BIb29rc1t0aGlzLnByb3BdO3JldHVybiB0aGlzLm9wdGlvbnMuZHVyYXRpb24/dGhpcy5wb3M9Yj1tLmVhc2luZ1t0aGlzLmVhc2luZ10oYSx0aGlzLm9wdGlvbnMuZHVyYXRpb24qYSwwLDEsdGhpcy5vcHRpb25zLmR1cmF0aW9uKTp0aGlzLnBvcz1iPWEsdGhpcy5ub3c9KHRoaXMuZW5kLXRoaXMuc3RhcnQpKmIrdGhpcy5zdGFydCx0aGlzLm9wdGlvbnMuc3RlcCYmdGhpcy5vcHRpb25zLnN0ZXAuY2FsbCh0aGlzLmVsZW0sdGhpcy5ub3csdGhpcyksYyYmYy5zZXQ/Yy5zZXQodGhpcyk6WmEucHJvcEhvb2tzLl9kZWZhdWx0LnNldCh0aGlzKSx0aGlzfX0sWmEucHJvdG90eXBlLmluaXQucHJvdG90eXBlPVphLnByb3RvdHlwZSxaYS5wcm9wSG9va3M9e19kZWZhdWx0OntnZXQ6ZnVuY3Rpb24oYSl7dmFyIGI7cmV0dXJuIG51bGw9PWEuZWxlbVthLnByb3BdfHxhLmVsZW0uc3R5bGUmJm51bGwhPWEuZWxlbS5zdHlsZVthLnByb3BdPyhiPW0uY3NzKGEuZWxlbSxhLnByb3AsIiIpLGImJiJhdXRvIiE9PWI/YjowKTphLmVsZW1bYS5wcm9wXX0sc2V0OmZ1bmN0aW9uKGEpe20uZnguc3RlcFthLnByb3BdP20uZnguc3RlcFthLnByb3BdKGEpOmEuZWxlbS5zdHlsZSYmKG51bGwhPWEuZWxlbS5zdHlsZVttLmNzc1Byb3BzW2EucHJvcF1dfHxtLmNzc0hvb2tzW2EucHJvcF0pP20uc3R5bGUoYS5lbGVtLGEucHJvcCxhLm5vdythLnVuaXQpOmEuZWxlbVthLnByb3BdPWEubm93fX19LFphLnByb3BIb29rcy5zY3JvbGxUb3A9WmEucHJvcEhvb2tzLnNjcm9sbExlZnQ9e3NldDpmdW5jdGlvbihhKXthLmVsZW0ubm9kZVR5cGUmJmEuZWxlbS5wYXJlbnROb2RlJiYoYS5lbGVtW2EucHJvcF09YS5ub3cpfX0sbS5lYXNpbmc9e2xpbmVhcjpmdW5jdGlvbihhKXtyZXR1cm4gYX0sc3dpbmc6ZnVuY3Rpb24oYSl7cmV0dXJuLjUtTWF0aC5jb3MoYSpNYXRoLlBJKS8yfX0sbS5meD1aYS5wcm90b3R5cGUuaW5pdCxtLmZ4LnN0ZXA9e307dmFyICRhLF9hLGFiPS9eKD86dG9nZ2xlfHNob3d8aGlkZSkkLyxiYj1uZXcgUmVnRXhwKCJeKD86KFsrLV0pPXwpKCIrUysiKShbYS16JV0qKSQiLCJpIiksY2I9L3F1ZXVlSG9va3MkLyxkYj1baWJdLGViPXsiKiI6W2Z1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5jcmVhdGVUd2VlbihhLGIpLGQ9Yy5jdXIoKSxlPWJiLmV4ZWMoYiksZj1lJiZlWzNdfHwobS5jc3NOdW1iZXJbYV0/IiI6InB4IiksZz0obS5jc3NOdW1iZXJbYV18fCJweCIhPT1mJiYrZCkmJmJiLmV4ZWMobS5jc3MoYy5lbGVtLGEpKSxoPTEsaT0yMDtpZihnJiZnWzNdIT09Zil7Zj1mfHxnWzNdLGU9ZXx8W10sZz0rZHx8MTtkbyBoPWh8fCIuNSIsZy89aCxtLnN0eWxlKGMuZWxlbSxhLGcrZik7d2hpbGUoaCE9PShoPWMuY3VyKCkvZCkmJjEhPT1oJiYtLWkpfXJldHVybiBlJiYoZz1jLnN0YXJ0PStnfHwrZHx8MCxjLnVuaXQ9ZixjLmVuZD1lWzFdP2crKGVbMV0rMSkqZVsyXTorZVsyXSksY31dfTtmdW5jdGlvbiBmYigpe3JldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7JGE9dm9pZCAwfSksJGE9bS5ub3coKX1mdW5jdGlvbiBnYihhLGIpe3ZhciBjLGQ9e2hlaWdodDphfSxlPTA7Zm9yKGI9Yj8xOjA7ND5lO2UrPTItYiljPVRbZV0sZFsibWFyZ2luIitjXT1kWyJwYWRkaW5nIitjXT1hO3JldHVybiBiJiYoZC5vcGFjaXR5PWQud2lkdGg9YSksZH1mdW5jdGlvbiBoYihhLGIsYyl7Zm9yKHZhciBkLGU9KGViW2JdfHxbXSkuY29uY2F0KGViWyIqIl0pLGY9MCxnPWUubGVuZ3RoO2c+ZjtmKyspaWYoZD1lW2ZdLmNhbGwoYyxiLGEpKXJldHVybiBkfWZ1bmN0aW9uIGliKGEsYixjKXt2YXIgZCxlLGYsZyxoLGksaixsLG49dGhpcyxvPXt9LHA9YS5zdHlsZSxxPWEubm9kZVR5cGUmJlUoYSkscj1tLl9kYXRhKGEsImZ4c2hvdyIpO2MucXVldWV8fChoPW0uX3F1ZXVlSG9va3MoYSwiZngiKSxudWxsPT1oLnVucXVldWVkJiYoaC51bnF1ZXVlZD0wLGk9aC5lbXB0eS5maXJlLGguZW1wdHkuZmlyZT1mdW5jdGlvbigpe2gudW5xdWV1ZWR8fGkoKX0pLGgudW5xdWV1ZWQrKyxuLmFsd2F5cyhmdW5jdGlvbigpe24uYWx3YXlzKGZ1bmN0aW9uKCl7aC51bnF1ZXVlZC0tLG0ucXVldWUoYSwiZngiKS5sZW5ndGh8fGguZW1wdHkuZmlyZSgpfSl9KSksMT09PWEubm9kZVR5cGUmJigiaGVpZ2h0ImluIGJ8fCJ3aWR0aCJpbiBiKSYmKGMub3ZlcmZsb3c9W3Aub3ZlcmZsb3cscC5vdmVyZmxvd1gscC5vdmVyZmxvd1ldLGo9bS5jc3MoYSwiZGlzcGxheSIpLGw9Im5vbmUiPT09aj9tLl9kYXRhKGEsIm9sZGRpc3BsYXkiKXx8RmEoYS5ub2RlTmFtZSk6aiwiaW5saW5lIj09PWwmJiJub25lIj09PW0uY3NzKGEsImZsb2F0IikmJihrLmlubGluZUJsb2NrTmVlZHNMYXlvdXQmJiJpbmxpbmUiIT09RmEoYS5ub2RlTmFtZSk/cC56b29tPTE6cC5kaXNwbGF5PSJpbmxpbmUtYmxvY2siKSksYy5vdmVyZmxvdyYmKHAub3ZlcmZsb3c9ImhpZGRlbiIsay5zaHJpbmtXcmFwQmxvY2tzKCl8fG4uYWx3YXlzKGZ1bmN0aW9uKCl7cC5vdmVyZmxvdz1jLm92ZXJmbG93WzBdLHAub3ZlcmZsb3dYPWMub3ZlcmZsb3dbMV0scC5vdmVyZmxvd1k9Yy5vdmVyZmxvd1syXX0pKTtmb3IoZCBpbiBiKWlmKGU9YltkXSxhYi5leGVjKGUpKXtpZihkZWxldGUgYltkXSxmPWZ8fCJ0b2dnbGUiPT09ZSxlPT09KHE/ImhpZGUiOiJzaG93Iikpe2lmKCJzaG93IiE9PWV8fCFyfHx2b2lkIDA9PT1yW2RdKWNvbnRpbnVlO3E9ITB9b1tkXT1yJiZyW2RdfHxtLnN0eWxlKGEsZCl9ZWxzZSBqPXZvaWQgMDtpZihtLmlzRW1wdHlPYmplY3QobykpImlubGluZSI9PT0oIm5vbmUiPT09aj9GYShhLm5vZGVOYW1lKTpqKSYmKHAuZGlzcGxheT1qKTtlbHNle3I/ImhpZGRlbiJpbiByJiYocT1yLmhpZGRlbik6cj1tLl9kYXRhKGEsImZ4c2hvdyIse30pLGYmJihyLmhpZGRlbj0hcSkscT9tKGEpLnNob3coKTpuLmRvbmUoZnVuY3Rpb24oKXttKGEpLmhpZGUoKX0pLG4uZG9uZShmdW5jdGlvbigpe3ZhciBiO20uX3JlbW92ZURhdGEoYSwiZnhzaG93Iik7Zm9yKGIgaW4gbyltLnN0eWxlKGEsYixvW2JdKX0pO2ZvcihkIGluIG8pZz1oYihxP3JbZF06MCxkLG4pLGQgaW4gcnx8KHJbZF09Zy5zdGFydCxxJiYoZy5lbmQ9Zy5zdGFydCxnLnN0YXJ0PSJ3aWR0aCI9PT1kfHwiaGVpZ2h0Ij09PWQ/MTowKSl9fWZ1bmN0aW9uIGpiKGEsYil7dmFyIGMsZCxlLGYsZztmb3IoYyBpbiBhKWlmKGQ9bS5jYW1lbENhc2UoYyksZT1iW2RdLGY9YVtjXSxtLmlzQXJyYXkoZikmJihlPWZbMV0sZj1hW2NdPWZbMF0pLGMhPT1kJiYoYVtkXT1mLGRlbGV0ZSBhW2NdKSxnPW0uY3NzSG9va3NbZF0sZyYmImV4cGFuZCJpbiBnKXtmPWcuZXhwYW5kKGYpLGRlbGV0ZSBhW2RdO2ZvcihjIGluIGYpYyBpbiBhfHwoYVtjXT1mW2NdLGJbY109ZSl9ZWxzZSBiW2RdPWV9ZnVuY3Rpb24ga2IoYSxiLGMpe3ZhciBkLGUsZj0wLGc9ZGIubGVuZ3RoLGg9bS5EZWZlcnJlZCgpLmFsd2F5cyhmdW5jdGlvbigpe2RlbGV0ZSBpLmVsZW19KSxpPWZ1bmN0aW9uKCl7aWYoZSlyZXR1cm4hMTtmb3IodmFyIGI9JGF8fGZiKCksYz1NYXRoLm1heCgwLGouc3RhcnRUaW1lK2ouZHVyYXRpb24tYiksZD1jL2ouZHVyYXRpb258fDAsZj0xLWQsZz0wLGk9ai50d2VlbnMubGVuZ3RoO2k+ZztnKyspai50d2VlbnNbZ10ucnVuKGYpO3JldHVybiBoLm5vdGlmeVdpdGgoYSxbaixmLGNdKSwxPmYmJmk/YzooaC5yZXNvbHZlV2l0aChhLFtqXSksITEpfSxqPWgucHJvbWlzZSh7ZWxlbTphLHByb3BzOm0uZXh0ZW5kKHt9LGIpLG9wdHM6bS5leHRlbmQoITAse3NwZWNpYWxFYXNpbmc6e319LGMpLG9yaWdpbmFsUHJvcGVydGllczpiLG9yaWdpbmFsT3B0aW9uczpjLHN0YXJ0VGltZTokYXx8ZmIoKSxkdXJhdGlvbjpjLmR1cmF0aW9uLHR3ZWVuczpbXSxjcmVhdGVUd2VlbjpmdW5jdGlvbihiLGMpe3ZhciBkPW0uVHdlZW4oYSxqLm9wdHMsYixjLGoub3B0cy5zcGVjaWFsRWFzaW5nW2JdfHxqLm9wdHMuZWFzaW5nKTtyZXR1cm4gai50d2VlbnMucHVzaChkKSxkfSxzdG9wOmZ1bmN0aW9uKGIpe3ZhciBjPTAsZD1iP2oudHdlZW5zLmxlbmd0aDowO2lmKGUpcmV0dXJuIHRoaXM7Zm9yKGU9ITA7ZD5jO2MrKylqLnR3ZWVuc1tjXS5ydW4oMSk7cmV0dXJuIGI/aC5yZXNvbHZlV2l0aChhLFtqLGJdKTpoLnJlamVjdFdpdGgoYSxbaixiXSksdGhpc319KSxrPWoucHJvcHM7Zm9yKGpiKGssai5vcHRzLnNwZWNpYWxFYXNpbmcpO2c+ZjtmKyspaWYoZD1kYltmXS5jYWxsKGosYSxrLGoub3B0cykpcmV0dXJuIGQ7cmV0dXJuIG0ubWFwKGssaGIsaiksbS5pc0Z1bmN0aW9uKGoub3B0cy5zdGFydCkmJmoub3B0cy5zdGFydC5jYWxsKGEsaiksbS5meC50aW1lcihtLmV4dGVuZChpLHtlbGVtOmEsYW5pbTpqLHF1ZXVlOmoub3B0cy5xdWV1ZX0pKSxqLnByb2dyZXNzKGoub3B0cy5wcm9ncmVzcykuZG9uZShqLm9wdHMuZG9uZSxqLm9wdHMuY29tcGxldGUpLmZhaWwoai5vcHRzLmZhaWwpLmFsd2F5cyhqLm9wdHMuYWx3YXlzKX1tLkFuaW1hdGlvbj1tLmV4dGVuZChrYix7dHdlZW5lcjpmdW5jdGlvbihhLGIpe20uaXNGdW5jdGlvbihhKT8oYj1hLGE9WyIqIl0pOmE9YS5zcGxpdCgiICIpO2Zvcih2YXIgYyxkPTAsZT1hLmxlbmd0aDtlPmQ7ZCsrKWM9YVtkXSxlYltjXT1lYltjXXx8W10sZWJbY10udW5zaGlmdChiKX0scHJlZmlsdGVyOmZ1bmN0aW9uKGEsYil7Yj9kYi51bnNoaWZ0KGEpOmRiLnB1c2goYSl9fSksbS5zcGVlZD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YSYmIm9iamVjdCI9PXR5cGVvZiBhP20uZXh0ZW5kKHt9LGEpOntjb21wbGV0ZTpjfHwhYyYmYnx8bS5pc0Z1bmN0aW9uKGEpJiZhLGR1cmF0aW9uOmEsZWFzaW5nOmMmJmJ8fGImJiFtLmlzRnVuY3Rpb24oYikmJmJ9O3JldHVybiBkLmR1cmF0aW9uPW0uZngub2ZmPzA6Im51bWJlciI9PXR5cGVvZiBkLmR1cmF0aW9uP2QuZHVyYXRpb246ZC5kdXJhdGlvbiBpbiBtLmZ4LnNwZWVkcz9tLmZ4LnNwZWVkc1tkLmR1cmF0aW9uXTptLmZ4LnNwZWVkcy5fZGVmYXVsdCwobnVsbD09ZC5xdWV1ZXx8ZC5xdWV1ZT09PSEwKSYmKGQucXVldWU9ImZ4IiksZC5vbGQ9ZC5jb21wbGV0ZSxkLmNvbXBsZXRlPWZ1bmN0aW9uKCl7bS5pc0Z1bmN0aW9uKGQub2xkKSYmZC5vbGQuY2FsbCh0aGlzKSxkLnF1ZXVlJiZtLmRlcXVldWUodGhpcyxkLnF1ZXVlKX0sZH0sbS5mbi5leHRlbmQoe2ZhZGVUbzpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gdGhpcy5maWx0ZXIoVSkuY3NzKCJvcGFjaXR5IiwwKS5zaG93KCkuZW5kKCkuYW5pbWF0ZSh7b3BhY2l0eTpifSxhLGMsZCl9LGFuaW1hdGU6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9bS5pc0VtcHR5T2JqZWN0KGEpLGY9bS5zcGVlZChiLGMsZCksZz1mdW5jdGlvbigpe3ZhciBiPWtiKHRoaXMsbS5leHRlbmQoe30sYSksZik7KGV8fG0uX2RhdGEodGhpcywiZmluaXNoIikpJiZiLnN0b3AoITApfTtyZXR1cm4gZy5maW5pc2g9ZyxlfHxmLnF1ZXVlPT09ITE/dGhpcy5lYWNoKGcpOnRoaXMucXVldWUoZi5xdWV1ZSxnKX0sc3RvcDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5zdG9wO2RlbGV0ZSBhLnN0b3AsYihjKX07cmV0dXJuInN0cmluZyIhPXR5cGVvZiBhJiYoYz1iLGI9YSxhPXZvaWQgMCksYiYmYSE9PSExJiZ0aGlzLnF1ZXVlKGF8fCJmeCIsW10pLHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiPSEwLGU9bnVsbCE9YSYmYSsicXVldWVIb29rcyIsZj1tLnRpbWVycyxnPW0uX2RhdGEodGhpcyk7aWYoZSlnW2VdJiZnW2VdLnN0b3AmJmQoZ1tlXSk7ZWxzZSBmb3IoZSBpbiBnKWdbZV0mJmdbZV0uc3RvcCYmY2IudGVzdChlKSYmZChnW2VdKTtmb3IoZT1mLmxlbmd0aDtlLS07KWZbZV0uZWxlbSE9PXRoaXN8fG51bGwhPWEmJmZbZV0ucXVldWUhPT1hfHwoZltlXS5hbmltLnN0b3AoYyksYj0hMSxmLnNwbGljZShlLDEpKTsoYnx8IWMpJiZtLmRlcXVldWUodGhpcyxhKX0pfSxmaW5pc2g6ZnVuY3Rpb24oYSl7cmV0dXJuIGEhPT0hMSYmKGE9YXx8ImZ4IiksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGIsYz1tLl9kYXRhKHRoaXMpLGQ9Y1thKyJxdWV1ZSJdLGU9Y1thKyJxdWV1ZUhvb2tzIl0sZj1tLnRpbWVycyxnPWQ/ZC5sZW5ndGg6MDtmb3IoYy5maW5pc2g9ITAsbS5xdWV1ZSh0aGlzLGEsW10pLGUmJmUuc3RvcCYmZS5zdG9wLmNhbGwodGhpcywhMCksYj1mLmxlbmd0aDtiLS07KWZbYl0uZWxlbT09PXRoaXMmJmZbYl0ucXVldWU9PT1hJiYoZltiXS5hbmltLnN0b3AoITApLGYuc3BsaWNlKGIsMSkpO2ZvcihiPTA7Zz5iO2IrKylkW2JdJiZkW2JdLmZpbmlzaCYmZFtiXS5maW5pc2guY2FsbCh0aGlzKTtkZWxldGUgYy5maW5pc2h9KX19KSxtLmVhY2goWyJ0b2dnbGUiLCJzaG93IiwiaGlkZSJdLGZ1bmN0aW9uKGEsYil7dmFyIGM9bS5mbltiXTttLmZuW2JdPWZ1bmN0aW9uKGEsZCxlKXtyZXR1cm4gbnVsbD09YXx8ImJvb2xlYW4iPT10eXBlb2YgYT9jLmFwcGx5KHRoaXMsYXJndW1lbnRzKTp0aGlzLmFuaW1hdGUoZ2IoYiwhMCksYSxkLGUpfX0pLG0uZWFjaCh7c2xpZGVEb3duOmdiKCJzaG93Iiksc2xpZGVVcDpnYigiaGlkZSIpLHNsaWRlVG9nZ2xlOmdiKCJ0b2dnbGUiKSxmYWRlSW46e29wYWNpdHk6InNob3cifSxmYWRlT3V0OntvcGFjaXR5OiJoaWRlIn0sZmFkZVRvZ2dsZTp7b3BhY2l0eToidG9nZ2xlIn19LGZ1bmN0aW9uKGEsYil7bS5mblthXT1mdW5jdGlvbihhLGMsZCl7cmV0dXJuIHRoaXMuYW5pbWF0ZShiLGEsYyxkKX19KSxtLnRpbWVycz1bXSxtLmZ4LnRpY2s9ZnVuY3Rpb24oKXt2YXIgYSxiPW0udGltZXJzLGM9MDtmb3IoJGE9bS5ub3coKTtjPGIubGVuZ3RoO2MrKylhPWJbY10sYSgpfHxiW2NdIT09YXx8Yi5zcGxpY2UoYy0tLDEpO2IubGVuZ3RofHxtLmZ4LnN0b3AoKSwkYT12b2lkIDB9LG0uZngudGltZXI9ZnVuY3Rpb24oYSl7bS50aW1lcnMucHVzaChhKSxhKCk/bS5meC5zdGFydCgpOm0udGltZXJzLnBvcCgpfSxtLmZ4LmludGVydmFsPTEzLG0uZnguc3RhcnQ9ZnVuY3Rpb24oKXtfYXx8KF9hPXNldEludGVydmFsKG0uZngudGljayxtLmZ4LmludGVydmFsKSl9LG0uZnguc3RvcD1mdW5jdGlvbigpe2NsZWFySW50ZXJ2YWwoX2EpLF9hPW51bGx9LG0uZnguc3BlZWRzPXtzbG93OjYwMCxmYXN0OjIwMCxfZGVmYXVsdDo0MDB9LG0uZm4uZGVsYXk9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT1tLmZ4P20uZnguc3BlZWRzW2FdfHxhOmEsYj1ifHwiZngiLHRoaXMucXVldWUoYixmdW5jdGlvbihiLGMpe3ZhciBkPXNldFRpbWVvdXQoYixhKTtjLnN0b3A9ZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQoZCl9fSl9LGZ1bmN0aW9uKCl7dmFyIGEsYixjLGQsZTtiPXkuY3JlYXRlRWxlbWVudCgiZGl2IiksYi5zZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIsInQiKSxiLmlubmVySFRNTD0iICA8bGluay8+PHRhYmxlPjwvdGFibGU+PGEgaHJlZj0nL2EnPmE8L2E+PGlucHV0IHR5cGU9J2NoZWNrYm94Jy8+IixkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKVswXSxjPXkuY3JlYXRlRWxlbWVudCgic2VsZWN0IiksZT1jLmFwcGVuZENoaWxkKHkuY3JlYXRlRWxlbWVudCgib3B0aW9uIikpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKVswXSxkLnN0eWxlLmNzc1RleHQ9InRvcDoxcHgiLGsuZ2V0U2V0QXR0cmlidXRlPSJ0IiE9PWIuY2xhc3NOYW1lLGsuc3R5bGU9L3RvcC8udGVzdChkLmdldEF0dHJpYnV0ZSgic3R5bGUiKSksay5ocmVmTm9ybWFsaXplZD0iL2EiPT09ZC5nZXRBdHRyaWJ1dGUoImhyZWYiKSxrLmNoZWNrT249ISFhLnZhbHVlLGsub3B0U2VsZWN0ZWQ9ZS5zZWxlY3RlZCxrLmVuY3R5cGU9ISF5LmNyZWF0ZUVsZW1lbnQoImZvcm0iKS5lbmN0eXBlLGMuZGlzYWJsZWQ9ITAsay5vcHREaXNhYmxlZD0hZS5kaXNhYmxlZCxhPXkuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxhLnNldEF0dHJpYnV0ZSgidmFsdWUiLCIiKSxrLmlucHV0PSIiPT09YS5nZXRBdHRyaWJ1dGUoInZhbHVlIiksYS52YWx1ZT0idCIsYS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJyYWRpbyIpLGsucmFkaW9WYWx1ZT0idCI9PT1hLnZhbHVlfSgpO3ZhciBsYj0vXHIvZzttLmZuLmV4dGVuZCh7dmFsOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlPXRoaXNbMF07e2lmKGFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGQ9bS5pc0Z1bmN0aW9uKGEpLHRoaXMuZWFjaChmdW5jdGlvbihjKXt2YXIgZTsxPT09dGhpcy5ub2RlVHlwZSYmKGU9ZD9hLmNhbGwodGhpcyxjLG0odGhpcykudmFsKCkpOmEsbnVsbD09ZT9lPSIiOiJudW1iZXIiPT10eXBlb2YgZT9lKz0iIjptLmlzQXJyYXkoZSkmJihlPW0ubWFwKGUsZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PWE/IiI6YSsiIn0pKSxiPW0udmFsSG9va3NbdGhpcy50eXBlXXx8bS52YWxIb29rc1t0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldLGImJiJzZXQiaW4gYiYmdm9pZCAwIT09Yi5zZXQodGhpcyxlLCJ2YWx1ZSIpfHwodGhpcy52YWx1ZT1lKSl9KTtpZihlKXJldHVybiBiPW0udmFsSG9va3NbZS50eXBlXXx8bS52YWxIb29rc1tlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldLGImJiJnZXQiaW4gYiYmdm9pZCAwIT09KGM9Yi5nZXQoZSwidmFsdWUiKSk/YzooYz1lLnZhbHVlLCJzdHJpbmciPT10eXBlb2YgYz9jLnJlcGxhY2UobGIsIiIpOm51bGw9PWM/IiI6Yyl9fX0pLG0uZXh0ZW5kKHt2YWxIb29rczp7b3B0aW9uOntnZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9bS5maW5kLmF0dHIoYSwidmFsdWUiKTtyZXR1cm4gbnVsbCE9Yj9iOm0udHJpbShtLnRleHQoYSkpfX0sc2VsZWN0OntnZXQ6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiLGMsZD1hLm9wdGlvbnMsZT1hLnNlbGVjdGVkSW5kZXgsZj0ic2VsZWN0LW9uZSI9PT1hLnR5cGV8fDA+ZSxnPWY/bnVsbDpbXSxoPWY/ZSsxOmQubGVuZ3RoLGk9MD5lP2g6Zj9lOjA7aD5pO2krKylpZihjPWRbaV0sISghYy5zZWxlY3RlZCYmaSE9PWV8fChrLm9wdERpc2FibGVkP2MuZGlzYWJsZWQ6bnVsbCE9PWMuZ2V0QXR0cmlidXRlKCJkaXNhYmxlZCIpKXx8Yy5wYXJlbnROb2RlLmRpc2FibGVkJiZtLm5vZGVOYW1lKGMucGFyZW50Tm9kZSwib3B0Z3JvdXAiKSkpe2lmKGI9bShjKS52YWwoKSxmKXJldHVybiBiO2cucHVzaChiKX1yZXR1cm4gZ30sc2V0OmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlPWEub3B0aW9ucyxmPW0ubWFrZUFycmF5KGIpLGc9ZS5sZW5ndGg7d2hpbGUoZy0tKWlmKGQ9ZVtnXSxtLmluQXJyYXkobS52YWxIb29rcy5vcHRpb24uZ2V0KGQpLGYpPj0wKXRyeXtkLnNlbGVjdGVkPWM9ITB9Y2F0Y2goaCl7ZC5zY3JvbGxIZWlnaHR9ZWxzZSBkLnNlbGVjdGVkPSExO3JldHVybiBjfHwoYS5zZWxlY3RlZEluZGV4PS0xKSxlfX19fSksbS5lYWNoKFsicmFkaW8iLCJjaGVja2JveCJdLGZ1bmN0aW9uKCl7bS52YWxIb29rc1t0aGlzXT17c2V0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIG0uaXNBcnJheShiKT9hLmNoZWNrZWQ9bS5pbkFycmF5KG0oYSkudmFsKCksYik+PTA6dm9pZCAwfX0say5jaGVja09ufHwobS52YWxIb29rc1t0aGlzXS5nZXQ9ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PT1hLmdldEF0dHJpYnV0ZSgidmFsdWUiKT8ib24iOmEudmFsdWV9KX0pO3ZhciBtYixuYixvYj1tLmV4cHIuYXR0ckhhbmRsZSxwYj0vXig/OmNoZWNrZWR8c2VsZWN0ZWQpJC9pLHFiPWsuZ2V0U2V0QXR0cmlidXRlLHJiPWsuaW5wdXQ7bS5mbi5leHRlbmQoe2F0dHI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gVih0aGlzLG0uYXR0cixhLGIsYXJndW1lbnRzLmxlbmd0aD4xKX0scmVtb3ZlQXR0cjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7bS5yZW1vdmVBdHRyKHRoaXMsYSl9KX19KSxtLmV4dGVuZCh7YXR0cjpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmPWEubm9kZVR5cGU7aWYoYSYmMyE9PWYmJjghPT1mJiYyIT09ZilyZXR1cm4gdHlwZW9mIGEuZ2V0QXR0cmlidXRlPT09Sz9tLnByb3AoYSxiLGMpOigxPT09ZiYmbS5pc1hNTERvYyhhKXx8KGI9Yi50b0xvd2VyQ2FzZSgpLGQ9bS5hdHRySG9va3NbYl18fChtLmV4cHIubWF0Y2guYm9vbC50ZXN0KGIpP25iOm1iKSksdm9pZCAwPT09Yz9kJiYiZ2V0ImluIGQmJm51bGwhPT0oZT1kLmdldChhLGIpKT9lOihlPW0uZmluZC5hdHRyKGEsYiksbnVsbD09ZT92b2lkIDA6ZSk6bnVsbCE9PWM/ZCYmInNldCJpbiBkJiZ2b2lkIDAhPT0oZT1kLnNldChhLGMsYikpP2U6KGEuc2V0QXR0cmlidXRlKGIsYysiIiksYyk6dm9pZCBtLnJlbW92ZUF0dHIoYSxiKSl9LHJlbW92ZUF0dHI6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGU9MCxmPWImJmIubWF0Y2goRSk7aWYoZiYmMT09PWEubm9kZVR5cGUpd2hpbGUoYz1mW2UrK10pZD1tLnByb3BGaXhbY118fGMsbS5leHByLm1hdGNoLmJvb2wudGVzdChjKT9yYiYmcWJ8fCFwYi50ZXN0KGMpP2FbZF09ITE6YVttLmNhbWVsQ2FzZSgiZGVmYXVsdC0iK2MpXT1hW2RdPSExOm0uYXR0cihhLGMsIiIpLGEucmVtb3ZlQXR0cmlidXRlKHFiP2M6ZCl9LGF0dHJIb29rczp7dHlwZTp7c2V0OmZ1bmN0aW9uKGEsYil7aWYoIWsucmFkaW9WYWx1ZSYmInJhZGlvIj09PWImJm0ubm9kZU5hbWUoYSwiaW5wdXQiKSl7dmFyIGM9YS52YWx1ZTtyZXR1cm4gYS5zZXRBdHRyaWJ1dGUoInR5cGUiLGIpLGMmJihhLnZhbHVlPWMpLGJ9fX19fSksbmI9e3NldDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGI9PT0hMT9tLnJlbW92ZUF0dHIoYSxjKTpyYiYmcWJ8fCFwYi50ZXN0KGMpP2Euc2V0QXR0cmlidXRlKCFxYiYmbS5wcm9wRml4W2NdfHxjLGMpOmFbbS5jYW1lbENhc2UoImRlZmF1bHQtIitjKV09YVtjXT0hMCxjfX0sbS5lYWNoKG0uZXhwci5tYXRjaC5ib29sLnNvdXJjZS5tYXRjaCgvXHcrL2cpLGZ1bmN0aW9uKGEsYil7dmFyIGM9b2JbYl18fG0uZmluZC5hdHRyO29iW2JdPXJiJiZxYnx8IXBiLnRlc3QoYik/ZnVuY3Rpb24oYSxiLGQpe3ZhciBlLGY7cmV0dXJuIGR8fChmPW9iW2JdLG9iW2JdPWUsZT1udWxsIT1jKGEsYixkKT9iLnRvTG93ZXJDYXNlKCk6bnVsbCxvYltiXT1mKSxlfTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGM/dm9pZCAwOmFbbS5jYW1lbENhc2UoImRlZmF1bHQtIitiKV0/Yi50b0xvd2VyQ2FzZSgpOm51bGx9fSkscmImJnFifHwobS5hdHRySG9va3MudmFsdWU9e3NldDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG0ubm9kZU5hbWUoYSwiaW5wdXQiKT92b2lkKGEuZGVmYXVsdFZhbHVlPWIpOm1iJiZtYi5zZXQoYSxiLGMpfX0pLHFifHwobWI9e3NldDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5nZXRBdHRyaWJ1dGVOb2RlKGMpO3JldHVybiBkfHxhLnNldEF0dHJpYnV0ZU5vZGUoZD1hLm93bmVyRG9jdW1lbnQuY3JlYXRlQXR0cmlidXRlKGMpKSxkLnZhbHVlPWIrPSIiLCJ2YWx1ZSI9PT1jfHxiPT09YS5nZXRBdHRyaWJ1dGUoYyk/Yjp2b2lkIDB9fSxvYi5pZD1vYi5uYW1lPW9iLmNvb3Jkcz1mdW5jdGlvbihhLGIsYyl7dmFyIGQ7cmV0dXJuIGM/dm9pZCAwOihkPWEuZ2V0QXR0cmlidXRlTm9kZShiKSkmJiIiIT09ZC52YWx1ZT9kLnZhbHVlOm51bGx9LG0udmFsSG9va3MuYnV0dG9uPXtnZXQ6ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmdldEF0dHJpYnV0ZU5vZGUoYik7cmV0dXJuIGMmJmMuc3BlY2lmaWVkP2MudmFsdWU6dm9pZCAwfSxzZXQ6bWIuc2V0fSxtLmF0dHJIb29rcy5jb250ZW50ZWRpdGFibGU9e3NldDpmdW5jdGlvbihhLGIsYyl7bWIuc2V0KGEsIiI9PT1iPyExOmIsYyl9fSxtLmVhY2goWyJ3aWR0aCIsImhlaWdodCJdLGZ1bmN0aW9uKGEsYil7bS5hdHRySG9va3NbYl09e3NldDpmdW5jdGlvbihhLGMpe3JldHVybiIiPT09Yz8oYS5zZXRBdHRyaWJ1dGUoYiwiYXV0byIpLGMpOnZvaWQgMH19fSkpLGsuc3R5bGV8fChtLmF0dHJIb29rcy5zdHlsZT17Z2V0OmZ1bmN0aW9uKGEpe3JldHVybiBhLnN0eWxlLmNzc1RleHR8fHZvaWQgMH0sc2V0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuc3R5bGUuY3NzVGV4dD1iKyIifX0pO3ZhciBzYj0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b258b2JqZWN0KSQvaSx0Yj0vXig/OmF8YXJlYSkkL2k7bS5mbi5leHRlbmQoe3Byb3A6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gVih0aGlzLG0ucHJvcCxhLGIsYXJndW1lbnRzLmxlbmd0aD4xKX0scmVtb3ZlUHJvcDpmdW5jdGlvbihhKXtyZXR1cm4gYT1tLnByb3BGaXhbYV18fGEsdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dHJ5e3RoaXNbYV09dm9pZCAwLGRlbGV0ZSB0aGlzW2FdfWNhdGNoKGIpe319KX19KSxtLmV4dGVuZCh7cHJvcEZpeDp7ImZvciI6Imh0bWxGb3IiLCJjbGFzcyI6ImNsYXNzTmFtZSJ9LHByb3A6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZixnPWEubm9kZVR5cGU7aWYoYSYmMyE9PWcmJjghPT1nJiYyIT09ZylyZXR1cm4gZj0xIT09Z3x8IW0uaXNYTUxEb2MoYSksZiYmKGI9bS5wcm9wRml4W2JdfHxiLGU9bS5wcm9wSG9va3NbYl0pLHZvaWQgMCE9PWM/ZSYmInNldCJpbiBlJiZ2b2lkIDAhPT0oZD1lLnNldChhLGMsYikpP2Q6YVtiXT1jOmUmJiJnZXQiaW4gZSYmbnVsbCE9PShkPWUuZ2V0KGEsYikpP2Q6YVtiXX0scHJvcEhvb2tzOnt0YWJJbmRleDp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBiPW0uZmluZC5hdHRyKGEsInRhYmluZGV4Iik7cmV0dXJuIGI/cGFyc2VJbnQoYiwxMCk6c2IudGVzdChhLm5vZGVOYW1lKXx8dGIudGVzdChhLm5vZGVOYW1lKSYmYS5ocmVmPzA6LTF9fX19KSxrLmhyZWZOb3JtYWxpemVkfHxtLmVhY2goWyJocmVmIiwic3JjIl0sZnVuY3Rpb24oYSxiKXttLnByb3BIb29rc1tiXT17Z2V0OmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZShiLDQpfX19KSxrLm9wdFNlbGVjdGVkfHwobS5wcm9wSG9va3Muc2VsZWN0ZWQ9e2dldDpmdW5jdGlvbihhKXt2YXIgYj1hLnBhcmVudE5vZGU7cmV0dXJuIGImJihiLnNlbGVjdGVkSW5kZXgsYi5wYXJlbnROb2RlJiZiLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCksbnVsbH19KSxtLmVhY2goWyJ0YWJJbmRleCIsInJlYWRPbmx5IiwibWF4TGVuZ3RoIiwiY2VsbFNwYWNpbmciLCJjZWxsUGFkZGluZyIsInJvd1NwYW4iLCJjb2xTcGFuIiwidXNlTWFwIiwiZnJhbWVCb3JkZXIiLCJjb250ZW50RWRpdGFibGUiXSxmdW5jdGlvbigpe20ucHJvcEZpeFt0aGlzLnRvTG93ZXJDYXNlKCldPXRoaXN9KSxrLmVuY3R5cGV8fChtLnByb3BGaXguZW5jdHlwZT0iZW5jb2RpbmciKTt2YXIgdWI9L1tcdFxyXG5cZl0vZzttLmZuLmV4dGVuZCh7YWRkQ2xhc3M6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZixnLGg9MCxpPXRoaXMubGVuZ3RoLGo9InN0cmluZyI9PXR5cGVvZiBhJiZhO2lmKG0uaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe20odGhpcykuYWRkQ2xhc3MoYS5jYWxsKHRoaXMsYix0aGlzLmNsYXNzTmFtZSkpfSk7aWYoailmb3IoYj0oYXx8IiIpLm1hdGNoKEUpfHxbXTtpPmg7aCsrKWlmKGM9dGhpc1toXSxkPTE9PT1jLm5vZGVUeXBlJiYoYy5jbGFzc05hbWU/KCIgIitjLmNsYXNzTmFtZSsiICIpLnJlcGxhY2UodWIsIiAiKToiICIpKXtmPTA7d2hpbGUoZT1iW2YrK10pZC5pbmRleE9mKCIgIitlKyIgIik8MCYmKGQrPWUrIiAiKTtnPW0udHJpbShkKSxjLmNsYXNzTmFtZSE9PWcmJihjLmNsYXNzTmFtZT1nKX1yZXR1cm4gdGhpc30scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZixnLGg9MCxpPXRoaXMubGVuZ3RoLGo9MD09PWFyZ3VtZW50cy5sZW5ndGh8fCJzdHJpbmciPT10eXBlb2YgYSYmYTtpZihtLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXttKHRoaXMpLnJlbW92ZUNsYXNzKGEuY2FsbCh0aGlzLGIsdGhpcy5jbGFzc05hbWUpKX0pO2lmKGopZm9yKGI9KGF8fCIiKS5tYXRjaChFKXx8W107aT5oO2grKylpZihjPXRoaXNbaF0sZD0xPT09Yy5ub2RlVHlwZSYmKGMuY2xhc3NOYW1lPygiICIrYy5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKHViLCIgIik6IiIpKXtmPTA7d2hpbGUoZT1iW2YrK10pd2hpbGUoZC5pbmRleE9mKCIgIitlKyIgIik+PTApZD1kLnJlcGxhY2UoIiAiK2UrIiAiLCIgIik7Zz1hP20udHJpbShkKToiIixjLmNsYXNzTmFtZSE9PWcmJihjLmNsYXNzTmFtZT1nKX1yZXR1cm4gdGhpc30sdG9nZ2xlQ2xhc3M6ZnVuY3Rpb24oYSxiKXt2YXIgYz10eXBlb2YgYTtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiBiJiYic3RyaW5nIj09PWM/Yj90aGlzLmFkZENsYXNzKGEpOnRoaXMucmVtb3ZlQ2xhc3MoYSk6dGhpcy5lYWNoKG0uaXNGdW5jdGlvbihhKT9mdW5jdGlvbihjKXttKHRoaXMpLnRvZ2dsZUNsYXNzKGEuY2FsbCh0aGlzLGMsdGhpcy5jbGFzc05hbWUsYiksYil9OmZ1bmN0aW9uKCl7aWYoInN0cmluZyI9PT1jKXt2YXIgYixkPTAsZT1tKHRoaXMpLGY9YS5tYXRjaChFKXx8W107d2hpbGUoYj1mW2QrK10pZS5oYXNDbGFzcyhiKT9lLnJlbW92ZUNsYXNzKGIpOmUuYWRkQ2xhc3MoYil9ZWxzZShjPT09S3x8ImJvb2xlYW4iPT09YykmJih0aGlzLmNsYXNzTmFtZSYmbS5fZGF0YSh0aGlzLCJfX2NsYXNzTmFtZV9fIix0aGlzLmNsYXNzTmFtZSksdGhpcy5jbGFzc05hbWU9dGhpcy5jbGFzc05hbWV8fGE9PT0hMT8iIjptLl9kYXRhKHRoaXMsIl9fY2xhc3NOYW1lX18iKXx8IiIpfSl9LGhhc0NsYXNzOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iICIrYSsiICIsYz0wLGQ9dGhpcy5sZW5ndGg7ZD5jO2MrKylpZigxPT09dGhpc1tjXS5ub2RlVHlwZSYmKCIgIit0aGlzW2NdLmNsYXNzTmFtZSsiICIpLnJlcGxhY2UodWIsIiAiKS5pbmRleE9mKGIpPj0wKXJldHVybiEwO3JldHVybiExfX0pLG0uZWFjaCgiYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IGxvYWQgcmVzaXplIHNjcm9sbCB1bmxvYWQgY2xpY2sgZGJsY2xpY2sgbW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBlcnJvciBjb250ZXh0bWVudSIuc3BsaXQoIiAiKSxmdW5jdGlvbihhLGIpe20uZm5bYl09ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4wP3RoaXMub24oYixudWxsLGEsYyk6dGhpcy50cmlnZ2VyKGIpfX0pLG0uZm4uZXh0ZW5kKHtob3ZlcjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLm1vdXNlZW50ZXIoYSkubW91c2VsZWF2ZShifHxhKX0sYmluZDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMub24oYSxudWxsLGIsYyl9LHVuYmluZDpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLm9mZihhLG51bGwsYil9LGRlbGVnYXRlOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLm9uKGIsYSxjLGQpfSx1bmRlbGVnYXRlOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/dGhpcy5vZmYoYSwiKioiKTp0aGlzLm9mZihiLGF8fCIqKiIsYyl9fSk7dmFyIHZiPW0ubm93KCksd2I9L1w/Lyx4Yj0vKCwpfChcW3x7KXwofXxdKXwiKD86W14iXFxcclxuXXxcXFsiXFxcL2JmbnJ0XXxcXHVbXGRhLWZBLUZdezR9KSoiXHMqOj98dHJ1ZXxmYWxzZXxudWxsfC0/KD8hMFxkKVxkKyg/OlwuXGQrfCkoPzpbZUVdWystXT9cZCt8KS9nO20ucGFyc2VKU09OPWZ1bmN0aW9uKGIpe2lmKGEuSlNPTiYmYS5KU09OLnBhcnNlKXJldHVybiBhLkpTT04ucGFyc2UoYisiIik7dmFyIGMsZD1udWxsLGU9bS50cmltKGIrIiIpO3JldHVybiBlJiYhbS50cmltKGUucmVwbGFjZSh4YixmdW5jdGlvbihhLGIsZSxmKXtyZXR1cm4gYyYmYiYmKGQ9MCksMD09PWQ/YTooYz1lfHxiLGQrPSFmLSFlLCIiKX0pKT9GdW5jdGlvbigicmV0dXJuICIrZSkoKTptLmVycm9yKCJJbnZhbGlkIEpTT046ICIrYil9LG0ucGFyc2VYTUw9ZnVuY3Rpb24oYil7dmFyIGMsZDtpZighYnx8InN0cmluZyIhPXR5cGVvZiBiKXJldHVybiBudWxsO3RyeXthLkRPTVBhcnNlcj8oZD1uZXcgRE9NUGFyc2VyLGM9ZC5wYXJzZUZyb21TdHJpbmcoYiwidGV4dC94bWwiKSk6KGM9bmV3IEFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxET00iKSxjLmFzeW5jPSJmYWxzZSIsYy5sb2FkWE1MKGIpKX1jYXRjaChlKXtjPXZvaWQgMH1yZXR1cm4gYyYmYy5kb2N1bWVudEVsZW1lbnQmJiFjLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJwYXJzZXJlcnJvciIpLmxlbmd0aHx8bS5lcnJvcigiSW52YWxpZCBYTUw6ICIrYiksY307dmFyIHliLHpiLEFiPS8jLiokLyxCYj0vKFs/Jl0pXz1bXiZdKi8sQ2I9L14oLio/KTpbIFx0XSooW15cclxuXSopXHI/JC9nbSxEYj0vXig/OmFib3V0fGFwcHxhcHAtc3RvcmFnZXwuKy1leHRlbnNpb258ZmlsZXxyZXN8d2lkZ2V0KTokLyxFYj0vXig/OkdFVHxIRUFEKSQvLEZiPS9eXC9cLy8sR2I9L14oW1x3ListXSs6KSg/OlwvXC8oPzpbXlwvPyNdKkB8KShbXlwvPyM6XSopKD86OihcZCspfCl8KS8sSGI9e30sSWI9e30sSmI9IiovIi5jb25jYXQoIioiKTt0cnl7emI9bG9jYXRpb24uaHJlZn1jYXRjaChLYil7emI9eS5jcmVhdGVFbGVtZW50KCJhIiksemIuaHJlZj0iIix6Yj16Yi5ocmVmfXliPUdiLmV4ZWMoemIudG9Mb3dlckNhc2UoKSl8fFtdO2Z1bmN0aW9uIExiKGEpe3JldHVybiBmdW5jdGlvbihiLGMpeyJzdHJpbmciIT10eXBlb2YgYiYmKGM9YixiPSIqIik7dmFyIGQsZT0wLGY9Yi50b0xvd2VyQ2FzZSgpLm1hdGNoKEUpfHxbXTtpZihtLmlzRnVuY3Rpb24oYykpd2hpbGUoZD1mW2UrK10pIisiPT09ZC5jaGFyQXQoMCk/KGQ9ZC5zbGljZSgxKXx8IioiLChhW2RdPWFbZF18fFtdKS51bnNoaWZ0KGMpKTooYVtkXT1hW2RdfHxbXSkucHVzaChjKX19ZnVuY3Rpb24gTWIoYSxiLGMsZCl7dmFyIGU9e30sZj1hPT09SWI7ZnVuY3Rpb24gZyhoKXt2YXIgaTtyZXR1cm4gZVtoXT0hMCxtLmVhY2goYVtoXXx8W10sZnVuY3Rpb24oYSxoKXt2YXIgaj1oKGIsYyxkKTtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGp8fGZ8fGVbal0/Zj8hKGk9aik6dm9pZCAwOihiLmRhdGFUeXBlcy51bnNoaWZ0KGopLGcoaiksITEpfSksaX1yZXR1cm4gZyhiLmRhdGFUeXBlc1swXSl8fCFlWyIqIl0mJmcoIioiKX1mdW5jdGlvbiBOYihhLGIpe3ZhciBjLGQsZT1tLmFqYXhTZXR0aW5ncy5mbGF0T3B0aW9uc3x8e307Zm9yKGQgaW4gYil2b2lkIDAhPT1iW2RdJiYoKGVbZF0/YTpjfHwoYz17fSkpW2RdPWJbZF0pO3JldHVybiBjJiZtLmV4dGVuZCghMCxhLGMpLGF9ZnVuY3Rpb24gT2IoYSxiLGMpe3ZhciBkLGUsZixnLGg9YS5jb250ZW50cyxpPWEuZGF0YVR5cGVzO3doaWxlKCIqIj09PWlbMF0paS5zaGlmdCgpLHZvaWQgMD09PWUmJihlPWEubWltZVR5cGV8fGIuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtVHlwZSIpKTtpZihlKWZvcihnIGluIGgpaWYoaFtnXSYmaFtnXS50ZXN0KGUpKXtpLnVuc2hpZnQoZyk7YnJlYWt9aWYoaVswXWluIGMpZj1pWzBdO2Vsc2V7Zm9yKGcgaW4gYyl7aWYoIWlbMF18fGEuY29udmVydGVyc1tnKyIgIitpWzBdXSl7Zj1nO2JyZWFrfWR8fChkPWcpfWY9Znx8ZH1yZXR1cm4gZj8oZiE9PWlbMF0mJmkudW5zaGlmdChmKSxjW2ZdKTp2b2lkIDB9ZnVuY3Rpb24gUGIoYSxiLGMsZCl7dmFyIGUsZixnLGgsaSxqPXt9LGs9YS5kYXRhVHlwZXMuc2xpY2UoKTtpZihrWzFdKWZvcihnIGluIGEuY29udmVydGVycylqW2cudG9Mb3dlckNhc2UoKV09YS5jb252ZXJ0ZXJzW2ddO2Y9ay5zaGlmdCgpO3doaWxlKGYpaWYoYS5yZXNwb25zZUZpZWxkc1tmXSYmKGNbYS5yZXNwb25zZUZpZWxkc1tmXV09YiksIWkmJmQmJmEuZGF0YUZpbHRlciYmKGI9YS5kYXRhRmlsdGVyKGIsYS5kYXRhVHlwZSkpLGk9ZixmPWsuc2hpZnQoKSlpZigiKiI9PT1mKWY9aTtlbHNlIGlmKCIqIiE9PWkmJmkhPT1mKXtpZihnPWpbaSsiICIrZl18fGpbIiogIitmXSwhZylmb3IoZSBpbiBqKWlmKGg9ZS5zcGxpdCgiICIpLGhbMV09PT1mJiYoZz1qW2krIiAiK2hbMF1dfHxqWyIqICIraFswXV0pKXtnPT09ITA/Zz1qW2VdOmpbZV0hPT0hMCYmKGY9aFswXSxrLnVuc2hpZnQoaFsxXSkpO2JyZWFrfWlmKGchPT0hMClpZihnJiZhWyJ0aHJvd3MiXSliPWcoYik7ZWxzZSB0cnl7Yj1nKGIpfWNhdGNoKGwpe3JldHVybntzdGF0ZToicGFyc2VyZXJyb3IiLGVycm9yOmc/bDoiTm8gY29udmVyc2lvbiBmcm9tICIraSsiIHRvICIrZn19fXJldHVybntzdGF0ZToic3VjY2VzcyIsZGF0YTpifX1tLmV4dGVuZCh7YWN0aXZlOjAsbGFzdE1vZGlmaWVkOnt9LGV0YWc6e30sYWpheFNldHRpbmdzOnt1cmw6emIsdHlwZToiR0VUIixpc0xvY2FsOkRiLnRlc3QoeWJbMV0pLGdsb2JhbDohMCxwcm9jZXNzRGF0YTohMCxhc3luYzohMCxjb250ZW50VHlwZToiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04IixhY2NlcHRzOnsiKiI6SmIsdGV4dDoidGV4dC9wbGFpbiIsaHRtbDoidGV4dC9odG1sIix4bWw6ImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLGpzb246ImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCJ9LGNvbnRlbnRzOnt4bWw6L3htbC8saHRtbDovaHRtbC8sanNvbjovanNvbi99LHJlc3BvbnNlRmllbGRzOnt4bWw6InJlc3BvbnNlWE1MIix0ZXh0OiJyZXNwb25zZVRleHQiLGpzb246InJlc3BvbnNlSlNPTiJ9LGNvbnZlcnRlcnM6eyIqIHRleHQiOlN0cmluZywidGV4dCBodG1sIjohMCwidGV4dCBqc29uIjptLnBhcnNlSlNPTiwidGV4dCB4bWwiOm0ucGFyc2VYTUx9LGZsYXRPcHRpb25zOnt1cmw6ITAsY29udGV4dDohMH19LGFqYXhTZXR1cDpmdW5jdGlvbihhLGIpe3JldHVybiBiP05iKE5iKGEsbS5hamF4U2V0dGluZ3MpLGIpOk5iKG0uYWpheFNldHRpbmdzLGEpfSxhamF4UHJlZmlsdGVyOkxiKEhiKSxhamF4VHJhbnNwb3J0OkxiKEliKSxhamF4OmZ1bmN0aW9uKGEsYil7Im9iamVjdCI9PXR5cGVvZiBhJiYoYj1hLGE9dm9pZCAwKSxiPWJ8fHt9O3ZhciBjLGQsZSxmLGcsaCxpLGosaz1tLmFqYXhTZXR1cCh7fSxiKSxsPWsuY29udGV4dHx8ayxuPWsuY29udGV4dCYmKGwubm9kZVR5cGV8fGwuanF1ZXJ5KT9tKGwpOm0uZXZlbnQsbz1tLkRlZmVycmVkKCkscD1tLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSxxPWsuc3RhdHVzQ29kZXx8e30scj17fSxzPXt9LHQ9MCx1PSJjYW5jZWxlZCIsdj17cmVhZHlTdGF0ZTowLGdldFJlc3BvbnNlSGVhZGVyOmZ1bmN0aW9uKGEpe3ZhciBiO2lmKDI9PT10KXtpZighail7aj17fTt3aGlsZShiPUNiLmV4ZWMoZikpaltiWzFdLnRvTG93ZXJDYXNlKCldPWJbMl19Yj1qW2EudG9Mb3dlckNhc2UoKV19cmV0dXJuIG51bGw9PWI/bnVsbDpifSxnZXRBbGxSZXNwb25zZUhlYWRlcnM6ZnVuY3Rpb24oKXtyZXR1cm4gMj09PXQ/ZjpudWxsfSxzZXRSZXF1ZXN0SGVhZGVyOmZ1bmN0aW9uKGEsYil7dmFyIGM9YS50b0xvd2VyQ2FzZSgpO3JldHVybiB0fHwoYT1zW2NdPXNbY118fGEsclthXT1iKSx0aGlzfSxvdmVycmlkZU1pbWVUeXBlOmZ1bmN0aW9uKGEpe3JldHVybiB0fHwoay5taW1lVHlwZT1hKSx0aGlzfSxzdGF0dXNDb2RlOmZ1bmN0aW9uKGEpe3ZhciBiO2lmKGEpaWYoMj50KWZvcihiIGluIGEpcVtiXT1bcVtiXSxhW2JdXTtlbHNlIHYuYWx3YXlzKGFbdi5zdGF0dXNdKTtyZXR1cm4gdGhpc30sYWJvcnQ6ZnVuY3Rpb24oYSl7dmFyIGI9YXx8dTtyZXR1cm4gaSYmaS5hYm9ydChiKSx4KDAsYiksdGhpc319O2lmKG8ucHJvbWlzZSh2KS5jb21wbGV0ZT1wLmFkZCx2LnN1Y2Nlc3M9di5kb25lLHYuZXJyb3I9di5mYWlsLGsudXJsPSgoYXx8ay51cmx8fHpiKSsiIikucmVwbGFjZShBYiwiIikucmVwbGFjZShGYix5YlsxXSsiLy8iKSxrLnR5cGU9Yi5tZXRob2R8fGIudHlwZXx8ay5tZXRob2R8fGsudHlwZSxrLmRhdGFUeXBlcz1tLnRyaW0oay5kYXRhVHlwZXx8IioiKS50b0xvd2VyQ2FzZSgpLm1hdGNoKEUpfHxbIiJdLG51bGw9PWsuY3Jvc3NEb21haW4mJihjPUdiLmV4ZWMoay51cmwudG9Mb3dlckNhc2UoKSksay5jcm9zc0RvbWFpbj0hKCFjfHxjWzFdPT09eWJbMV0mJmNbMl09PT15YlsyXSYmKGNbM118fCgiaHR0cDoiPT09Y1sxXT8iODAiOiI0NDMiKSk9PT0oeWJbM118fCgiaHR0cDoiPT09eWJbMV0/IjgwIjoiNDQzIikpKSksay5kYXRhJiZrLnByb2Nlc3NEYXRhJiYic3RyaW5nIiE9dHlwZW9mIGsuZGF0YSYmKGsuZGF0YT1tLnBhcmFtKGsuZGF0YSxrLnRyYWRpdGlvbmFsKSksTWIoSGIsayxiLHYpLDI9PT10KXJldHVybiB2O2g9bS5ldmVudCYmay5nbG9iYWwsaCYmMD09PW0uYWN0aXZlKysmJm0uZXZlbnQudHJpZ2dlcigiYWpheFN0YXJ0Iiksay50eXBlPWsudHlwZS50b1VwcGVyQ2FzZSgpLGsuaGFzQ29udGVudD0hRWIudGVzdChrLnR5cGUpLGU9ay51cmwsay5oYXNDb250ZW50fHwoay5kYXRhJiYoZT1rLnVybCs9KHdiLnRlc3QoZSk/IiYiOiI/Iikray5kYXRhLGRlbGV0ZSBrLmRhdGEpLGsuY2FjaGU9PT0hMSYmKGsudXJsPUJiLnRlc3QoZSk/ZS5yZXBsYWNlKEJiLCIkMV89Iit2YisrKTplKyh3Yi50ZXN0KGUpPyImIjoiPyIpKyJfPSIrdmIrKykpLGsuaWZNb2RpZmllZCYmKG0ubGFzdE1vZGlmaWVkW2VdJiZ2LnNldFJlcXVlc3RIZWFkZXIoIklmLU1vZGlmaWVkLVNpbmNlIixtLmxhc3RNb2RpZmllZFtlXSksbS5ldGFnW2VdJiZ2LnNldFJlcXVlc3RIZWFkZXIoIklmLU5vbmUtTWF0Y2giLG0uZXRhZ1tlXSkpLChrLmRhdGEmJmsuaGFzQ29udGVudCYmay5jb250ZW50VHlwZSE9PSExfHxiLmNvbnRlbnRUeXBlKSYmdi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLGsuY29udGVudFR5cGUpLHYuc2V0UmVxdWVzdEhlYWRlcigiQWNjZXB0IixrLmRhdGFUeXBlc1swXSYmay5hY2NlcHRzW2suZGF0YVR5cGVzWzBdXT9rLmFjY2VwdHNbay5kYXRhVHlwZXNbMF1dKygiKiIhPT1rLmRhdGFUeXBlc1swXT8iLCAiK0piKyI7IHE9MC4wMSI6IiIpOmsuYWNjZXB0c1siKiJdKTtmb3IoZCBpbiBrLmhlYWRlcnMpdi5zZXRSZXF1ZXN0SGVhZGVyKGQsay5oZWFkZXJzW2RdKTtpZihrLmJlZm9yZVNlbmQmJihrLmJlZm9yZVNlbmQuY2FsbChsLHYsayk9PT0hMXx8Mj09PXQpKXJldHVybiB2LmFib3J0KCk7dT0iYWJvcnQiO2ZvcihkIGlue3N1Y2Nlc3M6MSxlcnJvcjoxLGNvbXBsZXRlOjF9KXZbZF0oa1tkXSk7aWYoaT1NYihJYixrLGIsdikpe3YucmVhZHlTdGF0ZT0xLGgmJm4udHJpZ2dlcigiYWpheFNlbmQiLFt2LGtdKSxrLmFzeW5jJiZrLnRpbWVvdXQ+MCYmKGc9c2V0VGltZW91dChmdW5jdGlvbigpe3YuYWJvcnQoInRpbWVvdXQiKX0say50aW1lb3V0KSk7dHJ5e3Q9MSxpLnNlbmQocix4KX1jYXRjaCh3KXtpZighKDI+dCkpdGhyb3cgdzt4KC0xLHcpfX1lbHNlIHgoLTEsIk5vIFRyYW5zcG9ydCIpO2Z1bmN0aW9uIHgoYSxiLGMsZCl7dmFyIGoscixzLHUsdyx4PWI7MiE9PXQmJih0PTIsZyYmY2xlYXJUaW1lb3V0KGcpLGk9dm9pZCAwLGY9ZHx8IiIsdi5yZWFkeVN0YXRlPWE+MD80OjAsaj1hPj0yMDAmJjMwMD5hfHwzMDQ9PT1hLGMmJih1PU9iKGssdixjKSksdT1QYihrLHUsdixqKSxqPyhrLmlmTW9kaWZpZWQmJih3PXYuZ2V0UmVzcG9uc2VIZWFkZXIoIkxhc3QtTW9kaWZpZWQiKSx3JiYobS5sYXN0TW9kaWZpZWRbZV09dyksdz12LmdldFJlc3BvbnNlSGVhZGVyKCJldGFnIiksdyYmKG0uZXRhZ1tlXT13KSksMjA0PT09YXx8IkhFQUQiPT09ay50eXBlP3g9Im5vY29udGVudCI6MzA0PT09YT94PSJub3Rtb2RpZmllZCI6KHg9dS5zdGF0ZSxyPXUuZGF0YSxzPXUuZXJyb3Isaj0hcykpOihzPXgsKGF8fCF4KSYmKHg9ImVycm9yIiwwPmEmJihhPTApKSksdi5zdGF0dXM9YSx2LnN0YXR1c1RleHQ9KGJ8fHgpKyIiLGo/by5yZXNvbHZlV2l0aChsLFtyLHgsdl0pOm8ucmVqZWN0V2l0aChsLFt2LHgsc10pLHYuc3RhdHVzQ29kZShxKSxxPXZvaWQgMCxoJiZuLnRyaWdnZXIoaj8iYWpheFN1Y2Nlc3MiOiJhamF4RXJyb3IiLFt2LGssaj9yOnNdKSxwLmZpcmVXaXRoKGwsW3YseF0pLGgmJihuLnRyaWdnZXIoImFqYXhDb21wbGV0ZSIsW3Ysa10pLC0tbS5hY3RpdmV8fG0uZXZlbnQudHJpZ2dlcigiYWpheFN0b3AiKSkpfXJldHVybiB2fSxnZXRKU09OOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbS5nZXQoYSxiLGMsImpzb24iKX0sZ2V0U2NyaXB0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIG0uZ2V0KGEsdm9pZCAwLGIsInNjcmlwdCIpfX0pLG0uZWFjaChbImdldCIsInBvc3QiXSxmdW5jdGlvbihhLGIpe21bYl09ZnVuY3Rpb24oYSxjLGQsZSl7cmV0dXJuIG0uaXNGdW5jdGlvbihjKSYmKGU9ZXx8ZCxkPWMsYz12b2lkIDApLG0uYWpheCh7dXJsOmEsdHlwZTpiLGRhdGFUeXBlOmUsZGF0YTpjLHN1Y2Nlc3M6ZH0pfX0pLG0uX2V2YWxVcmw9ZnVuY3Rpb24oYSl7cmV0dXJuIG0uYWpheCh7dXJsOmEsdHlwZToiR0VUIixkYXRhVHlwZToic2NyaXB0Iixhc3luYzohMSxnbG9iYWw6ITEsInRocm93cyI6ITB9KX0sbS5mbi5leHRlbmQoe3dyYXBBbGw6ZnVuY3Rpb24oYSl7aWYobS5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7bSh0aGlzKS53cmFwQWxsKGEuY2FsbCh0aGlzLGIpKX0pO2lmKHRoaXNbMF0pe3ZhciBiPW0oYSx0aGlzWzBdLm93bmVyRG9jdW1lbnQpLmVxKDApLmNsb25lKCEwKTt0aGlzWzBdLnBhcmVudE5vZGUmJmIuaW5zZXJ0QmVmb3JlKHRoaXNbMF0pLGIubWFwKGZ1bmN0aW9uKCl7dmFyIGE9dGhpczt3aGlsZShhLmZpcnN0Q2hpbGQmJjE9PT1hLmZpcnN0Q2hpbGQubm9kZVR5cGUpYT1hLmZpcnN0Q2hpbGQ7cmV0dXJuIGF9KS5hcHBlbmQodGhpcyl9cmV0dXJuIHRoaXN9LHdyYXBJbm5lcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKG0uaXNGdW5jdGlvbihhKT9mdW5jdGlvbihiKXttKHRoaXMpLndyYXBJbm5lcihhLmNhbGwodGhpcyxiKSl9OmZ1bmN0aW9uKCl7dmFyIGI9bSh0aGlzKSxjPWIuY29udGVudHMoKTtjLmxlbmd0aD9jLndyYXBBbGwoYSk6Yi5hcHBlbmQoYSl9KX0sd3JhcDpmdW5jdGlvbihhKXt2YXIgYj1tLmlzRnVuY3Rpb24oYSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihjKXttKHRoaXMpLndyYXBBbGwoYj9hLmNhbGwodGhpcyxjKTphKX0pfSx1bndyYXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYXJlbnQoKS5lYWNoKGZ1bmN0aW9uKCl7bS5ub2RlTmFtZSh0aGlzLCJib2R5Iil8fG0odGhpcykucmVwbGFjZVdpdGgodGhpcy5jaGlsZE5vZGVzKX0pLmVuZCgpfX0pLG0uZXhwci5maWx0ZXJzLmhpZGRlbj1mdW5jdGlvbihhKXtyZXR1cm4gYS5vZmZzZXRXaWR0aDw9MCYmYS5vZmZzZXRIZWlnaHQ8PTB8fCFrLnJlbGlhYmxlSGlkZGVuT2Zmc2V0cygpJiYibm9uZSI9PT0oYS5zdHlsZSYmYS5zdHlsZS5kaXNwbGF5fHxtLmNzcyhhLCJkaXNwbGF5IikpfSxtLmV4cHIuZmlsdGVycy52aXNpYmxlPWZ1bmN0aW9uKGEpe3JldHVybiFtLmV4cHIuZmlsdGVycy5oaWRkZW4oYSl9O3ZhciBRYj0vJTIwL2csUmI9L1xbXF0kLyxTYj0vXHI/XG4vZyxUYj0vXig/OnN1Ym1pdHxidXR0b258aW1hZ2V8cmVzZXR8ZmlsZSkkL2ksVWI9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8a2V5Z2VuKS9pO2Z1bmN0aW9uIFZiKGEsYixjLGQpe3ZhciBlO2lmKG0uaXNBcnJheShiKSltLmVhY2goYixmdW5jdGlvbihiLGUpe2N8fFJiLnRlc3QoYSk/ZChhLGUpOlZiKGErIlsiKygib2JqZWN0Ij09dHlwZW9mIGU/YjoiIikrIl0iLGUsYyxkKX0pO2Vsc2UgaWYoY3x8Im9iamVjdCIhPT1tLnR5cGUoYikpZChhLGIpO2Vsc2UgZm9yKGUgaW4gYilWYihhKyJbIitlKyJdIixiW2VdLGMsZCl9bS5wYXJhbT1mdW5jdGlvbihhLGIpe3ZhciBjLGQ9W10sZT1mdW5jdGlvbihhLGIpe2I9bS5pc0Z1bmN0aW9uKGIpP2IoKTpudWxsPT1iPyIiOmIsZFtkLmxlbmd0aF09ZW5jb2RlVVJJQ29tcG9uZW50KGEpKyI9IitlbmNvZGVVUklDb21wb25lbnQoYil9O2lmKHZvaWQgMD09PWImJihiPW0uYWpheFNldHRpbmdzJiZtLmFqYXhTZXR0aW5ncy50cmFkaXRpb25hbCksbS5pc0FycmF5KGEpfHxhLmpxdWVyeSYmIW0uaXNQbGFpbk9iamVjdChhKSltLmVhY2goYSxmdW5jdGlvbigpe2UodGhpcy5uYW1lLHRoaXMudmFsdWUpfSk7ZWxzZSBmb3IoYyBpbiBhKVZiKGMsYVtjXSxiLGUpO3JldHVybiBkLmpvaW4oIiYiKS5yZXBsYWNlKFFiLCIrIil9LG0uZm4uZXh0ZW5kKHtzZXJpYWxpemU6ZnVuY3Rpb24oKXtyZXR1cm4gbS5wYXJhbSh0aGlzLnNlcmlhbGl6ZUFycmF5KCkpfSxzZXJpYWxpemVBcnJheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3ZhciBhPW0ucHJvcCh0aGlzLCJlbGVtZW50cyIpO3JldHVybiBhP20ubWFrZUFycmF5KGEpOnRoaXN9KS5maWx0ZXIoZnVuY3Rpb24oKXt2YXIgYT10aGlzLnR5cGU7cmV0dXJuIHRoaXMubmFtZSYmIW0odGhpcykuaXMoIjpkaXNhYmxlZCIpJiZVYi50ZXN0KHRoaXMubm9kZU5hbWUpJiYhVGIudGVzdChhKSYmKHRoaXMuY2hlY2tlZHx8IVcudGVzdChhKSl9KS5tYXAoZnVuY3Rpb24oYSxiKXt2YXIgYz1tKHRoaXMpLnZhbCgpO3JldHVybiBudWxsPT1jP251bGw6bS5pc0FycmF5KGMpP20ubWFwKGMsZnVuY3Rpb24oYSl7cmV0dXJue25hbWU6Yi5uYW1lLHZhbHVlOmEucmVwbGFjZShTYiwiXHJcbiIpfX0pOntuYW1lOmIubmFtZSx2YWx1ZTpjLnJlcGxhY2UoU2IsIlxyXG4iKX19KS5nZXQoKX19KSxtLmFqYXhTZXR0aW5ncy54aHI9dm9pZCAwIT09YS5BY3RpdmVYT2JqZWN0P2Z1bmN0aW9uKCl7cmV0dXJuIXRoaXMuaXNMb2NhbCYmL14oZ2V0fHBvc3R8aGVhZHxwdXR8ZGVsZXRlfG9wdGlvbnMpJC9pLnRlc3QodGhpcy50eXBlKSYmWmIoKXx8JGIoKX06WmI7dmFyIFdiPTAsWGI9e30sWWI9bS5hamF4U2V0dGluZ3MueGhyKCk7YS5hdHRhY2hFdmVudCYmYS5hdHRhY2hFdmVudCgib251bmxvYWQiLGZ1bmN0aW9uKCl7Zm9yKHZhciBhIGluIFhiKVhiW2FdKHZvaWQgMCwhMCl9KSxrLmNvcnM9ISFZYiYmIndpdGhDcmVkZW50aWFscyJpbiBZYixZYj1rLmFqYXg9ISFZYixZYiYmbS5hamF4VHJhbnNwb3J0KGZ1bmN0aW9uKGEpe2lmKCFhLmNyb3NzRG9tYWlufHxrLmNvcnMpe3ZhciBiO3JldHVybntzZW5kOmZ1bmN0aW9uKGMsZCl7dmFyIGUsZj1hLnhocigpLGc9KytXYjtpZihmLm9wZW4oYS50eXBlLGEudXJsLGEuYXN5bmMsYS51c2VybmFtZSxhLnBhc3N3b3JkKSxhLnhockZpZWxkcylmb3IoZSBpbiBhLnhockZpZWxkcylmW2VdPWEueGhyRmllbGRzW2VdO2EubWltZVR5cGUmJmYub3ZlcnJpZGVNaW1lVHlwZSYmZi5vdmVycmlkZU1pbWVUeXBlKGEubWltZVR5cGUpLGEuY3Jvc3NEb21haW58fGNbIlgtUmVxdWVzdGVkLVdpdGgiXXx8KGNbIlgtUmVxdWVzdGVkLVdpdGgiXT0iWE1MSHR0cFJlcXVlc3QiKTtmb3IoZSBpbiBjKXZvaWQgMCE9PWNbZV0mJmYuc2V0UmVxdWVzdEhlYWRlcihlLGNbZV0rIiIpO2Yuc2VuZChhLmhhc0NvbnRlbnQmJmEuZGF0YXx8bnVsbCksYj1mdW5jdGlvbihjLGUpe3ZhciBoLGksajtpZihiJiYoZXx8ND09PWYucmVhZHlTdGF0ZSkpaWYoZGVsZXRlIFhiW2ddLGI9dm9pZCAwLGYub25yZWFkeXN0YXRlY2hhbmdlPW0ubm9vcCxlKTQhPT1mLnJlYWR5U3RhdGUmJmYuYWJvcnQoKTtlbHNle2o9e30saD1mLnN0YXR1cywic3RyaW5nIj09dHlwZW9mIGYucmVzcG9uc2VUZXh0JiYoai50ZXh0PWYucmVzcG9uc2VUZXh0KTt0cnl7aT1mLnN0YXR1c1RleHR9Y2F0Y2goayl7aT0iIn1ofHwhYS5pc0xvY2FsfHxhLmNyb3NzRG9tYWluPzEyMjM9PT1oJiYoaD0yMDQpOmg9ai50ZXh0PzIwMDo0MDR9aiYmZChoLGksaixmLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKX0sYS5hc3luYz80PT09Zi5yZWFkeVN0YXRlP3NldFRpbWVvdXQoYik6Zi5vbnJlYWR5c3RhdGVjaGFuZ2U9WGJbZ109YjpiKCl9LGFib3J0OmZ1bmN0aW9uKCl7YiYmYih2b2lkIDAsITApfX19fSk7ZnVuY3Rpb24gWmIoKXt0cnl7cmV0dXJuIG5ldyBhLlhNTEh0dHBSZXF1ZXN0fWNhdGNoKGIpe319ZnVuY3Rpb24gJGIoKXt0cnl7cmV0dXJuIG5ldyBhLkFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxIVFRQIil9Y2F0Y2goYil7fX1tLmFqYXhTZXR1cCh7YWNjZXB0czp7c2NyaXB0OiJ0ZXh0L2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2VjbWFzY3JpcHQsIGFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCJ9LGNvbnRlbnRzOntzY3JpcHQ6Lyg/OmphdmF8ZWNtYSlzY3JpcHQvfSxjb252ZXJ0ZXJzOnsidGV4dCBzY3JpcHQiOmZ1bmN0aW9uKGEpe3JldHVybiBtLmdsb2JhbEV2YWwoYSksYX19fSksbS5hamF4UHJlZmlsdGVyKCJzY3JpcHQiLGZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEuY2FjaGUmJihhLmNhY2hlPSExKSxhLmNyb3NzRG9tYWluJiYoYS50eXBlPSJHRVQiLGEuZ2xvYmFsPSExKX0pLG0uYWpheFRyYW5zcG9ydCgic2NyaXB0IixmdW5jdGlvbihhKXtpZihhLmNyb3NzRG9tYWluKXt2YXIgYixjPXkuaGVhZHx8bSgiaGVhZCIpWzBdfHx5LmRvY3VtZW50RWxlbWVudDtyZXR1cm57c2VuZDpmdW5jdGlvbihkLGUpe2I9eS5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxiLmFzeW5jPSEwLGEuc2NyaXB0Q2hhcnNldCYmKGIuY2hhcnNldD1hLnNjcmlwdENoYXJzZXQpLGIuc3JjPWEudXJsLGIub25sb2FkPWIub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKGEsYyl7KGN8fCFiLnJlYWR5U3RhdGV8fC9sb2FkZWR8Y29tcGxldGUvLnRlc3QoYi5yZWFkeVN0YXRlKSkmJihiLm9ubG9hZD1iLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsLGIucGFyZW50Tm9kZSYmYi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpLGI9bnVsbCxjfHxlKDIwMCwic3VjY2VzcyIpKX0sYy5pbnNlcnRCZWZvcmUoYixjLmZpcnN0Q2hpbGQpfSxhYm9ydDpmdW5jdGlvbigpe2ImJmIub25sb2FkKHZvaWQgMCwhMCl9fX19KTt2YXIgX2I9W10sYWM9Lyg9KVw/KD89JnwkKXxcP1w/LzttLmFqYXhTZXR1cCh7anNvbnA6ImNhbGxiYWNrIixqc29ucENhbGxiYWNrOmZ1bmN0aW9uKCl7dmFyIGE9X2IucG9wKCl8fG0uZXhwYW5kbysiXyIrdmIrKztyZXR1cm4gdGhpc1thXT0hMCxhfX0pLG0uYWpheFByZWZpbHRlcigianNvbiBqc29ucCIsZnVuY3Rpb24oYixjLGQpe3ZhciBlLGYsZyxoPWIuanNvbnAhPT0hMSYmKGFjLnRlc3QoYi51cmwpPyJ1cmwiOiJzdHJpbmciPT10eXBlb2YgYi5kYXRhJiYhKGIuY29udGVudFR5cGV8fCIiKS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSYmYWMudGVzdChiLmRhdGEpJiYiZGF0YSIpO3JldHVybiBofHwianNvbnAiPT09Yi5kYXRhVHlwZXNbMF0/KGU9Yi5qc29ucENhbGxiYWNrPW0uaXNGdW5jdGlvbihiLmpzb25wQ2FsbGJhY2spP2IuanNvbnBDYWxsYmFjaygpOmIuanNvbnBDYWxsYmFjayxoP2JbaF09YltoXS5yZXBsYWNlKGFjLCIkMSIrZSk6Yi5qc29ucCE9PSExJiYoYi51cmwrPSh3Yi50ZXN0KGIudXJsKT8iJiI6Ij8iKStiLmpzb25wKyI9IitlKSxiLmNvbnZlcnRlcnNbInNjcmlwdCBqc29uIl09ZnVuY3Rpb24oKXtyZXR1cm4gZ3x8bS5lcnJvcihlKyIgd2FzIG5vdCBjYWxsZWQiKSxnWzBdfSxiLmRhdGFUeXBlc1swXT0ianNvbiIsZj1hW2VdLGFbZV09ZnVuY3Rpb24oKXtnPWFyZ3VtZW50c30sZC5hbHdheXMoZnVuY3Rpb24oKXthW2VdPWYsYltlXSYmKGIuanNvbnBDYWxsYmFjaz1jLmpzb25wQ2FsbGJhY2ssX2IucHVzaChlKSksZyYmbS5pc0Z1bmN0aW9uKGYpJiZmKGdbMF0pLGc9Zj12b2lkIDB9KSwic2NyaXB0Iik6dm9pZCAwfSksbS5wYXJzZUhUTUw9ZnVuY3Rpb24oYSxiLGMpe2lmKCFhfHwic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIG51bGw7ImJvb2xlYW4iPT10eXBlb2YgYiYmKGM9YixiPSExKSxiPWJ8fHk7dmFyIGQ9dS5leGVjKGEpLGU9IWMmJltdO3JldHVybiBkP1tiLmNyZWF0ZUVsZW1lbnQoZFsxXSldOihkPW0uYnVpbGRGcmFnbWVudChbYV0sYixlKSxlJiZlLmxlbmd0aCYmbShlKS5yZW1vdmUoKSxtLm1lcmdlKFtdLGQuY2hpbGROb2RlcykpfTt2YXIgYmM9bS5mbi5sb2FkO20uZm4ubG9hZD1mdW5jdGlvbihhLGIsYyl7aWYoInN0cmluZyIhPXR5cGVvZiBhJiZiYylyZXR1cm4gYmMuYXBwbHkodGhpcyxhcmd1bWVudHMpO3ZhciBkLGUsZixnPXRoaXMsaD1hLmluZGV4T2YoIiAiKTtyZXR1cm4gaD49MCYmKGQ9bS50cmltKGEuc2xpY2UoaCxhLmxlbmd0aCkpLGE9YS5zbGljZSgwLGgpKSxtLmlzRnVuY3Rpb24oYik/KGM9YixiPXZvaWQgMCk6YiYmIm9iamVjdCI9PXR5cGVvZiBiJiYoZj0iUE9TVCIpLGcubGVuZ3RoPjAmJm0uYWpheCh7dXJsOmEsdHlwZTpmLGRhdGFUeXBlOiJodG1sIixkYXRhOmJ9KS5kb25lKGZ1bmN0aW9uKGEpe2U9YXJndW1lbnRzLGcuaHRtbChkP20oIjxkaXY+IikuYXBwZW5kKG0ucGFyc2VIVE1MKGEpKS5maW5kKGQpOmEpfSkuY29tcGxldGUoYyYmZnVuY3Rpb24oYSxiKXtnLmVhY2goYyxlfHxbYS5yZXNwb25zZVRleHQsYixhXSl9KSx0aGlzfSxtLmVhY2goWyJhamF4U3RhcnQiLCJhamF4U3RvcCIsImFqYXhDb21wbGV0ZSIsImFqYXhFcnJvciIsImFqYXhTdWNjZXNzIiwiYWpheFNlbmQiXSxmdW5jdGlvbihhLGIpe20uZm5bYl09ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMub24oYixhKX19KSxtLmV4cHIuZmlsdGVycy5hbmltYXRlZD1mdW5jdGlvbihhKXtyZXR1cm4gbS5ncmVwKG0udGltZXJzLGZ1bmN0aW9uKGIpe3JldHVybiBhPT09Yi5lbGVtfSkubGVuZ3RofTt2YXIgY2M9YS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7ZnVuY3Rpb24gZGMoYSl7cmV0dXJuIG0uaXNXaW5kb3coYSk/YTo5PT09YS5ub2RlVHlwZT9hLmRlZmF1bHRWaWV3fHxhLnBhcmVudFdpbmRvdzohMX1tLm9mZnNldD17c2V0T2Zmc2V0OmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGYsZyxoLGksaixrPW0uY3NzKGEsInBvc2l0aW9uIiksbD1tKGEpLG49e307InN0YXRpYyI9PT1rJiYoYS5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiKSxoPWwub2Zmc2V0KCksZj1tLmNzcyhhLCJ0b3AiKSxpPW0uY3NzKGEsImxlZnQiKSxqPSgiYWJzb2x1dGUiPT09a3x8ImZpeGVkIj09PWspJiZtLmluQXJyYXkoImF1dG8iLFtmLGldKT4tMSxqPyhkPWwucG9zaXRpb24oKSxnPWQudG9wLGU9ZC5sZWZ0KTooZz1wYXJzZUZsb2F0KGYpfHwwLGU9cGFyc2VGbG9hdChpKXx8MCksbS5pc0Z1bmN0aW9uKGIpJiYoYj1iLmNhbGwoYSxjLGgpKSxudWxsIT1iLnRvcCYmKG4udG9wPWIudG9wLWgudG9wK2cpLG51bGwhPWIubGVmdCYmKG4ubGVmdD1iLmxlZnQtaC5sZWZ0K2UpLCJ1c2luZyJpbiBiP2IudXNpbmcuY2FsbChhLG4pOmwuY3NzKG4pfX0sbS5mbi5leHRlbmQoe29mZnNldDpmdW5jdGlvbihhKXtpZihhcmd1bWVudHMubGVuZ3RoKXJldHVybiB2b2lkIDA9PT1hP3RoaXM6dGhpcy5lYWNoKGZ1bmN0aW9uKGIpe20ub2Zmc2V0LnNldE9mZnNldCh0aGlzLGEsYil9KTt2YXIgYixjLGQ9e3RvcDowLGxlZnQ6MH0sZT10aGlzWzBdLGY9ZSYmZS5vd25lckRvY3VtZW50O2lmKGYpcmV0dXJuIGI9Zi5kb2N1bWVudEVsZW1lbnQsbS5jb250YWlucyhiLGUpPyh0eXBlb2YgZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QhPT1LJiYoZD1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKSxjPWRjKGYpLHt0b3A6ZC50b3ArKGMucGFnZVlPZmZzZXR8fGIuc2Nyb2xsVG9wKS0oYi5jbGllbnRUb3B8fDApLGxlZnQ6ZC5sZWZ0KyhjLnBhZ2VYT2Zmc2V0fHxiLnNjcm9sbExlZnQpLShiLmNsaWVudExlZnR8fDApfSk6ZH0scG9zaXRpb246ZnVuY3Rpb24oKXtpZih0aGlzWzBdKXt2YXIgYSxiLGM9e3RvcDowLGxlZnQ6MH0sZD10aGlzWzBdO3JldHVybiJmaXhlZCI9PT1tLmNzcyhkLCJwb3NpdGlvbiIpP2I9ZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTooYT10aGlzLm9mZnNldFBhcmVudCgpLGI9dGhpcy5vZmZzZXQoKSxtLm5vZGVOYW1lKGFbMF0sImh0bWwiKXx8KGM9YS5vZmZzZXQoKSksYy50b3ArPW0uY3NzKGFbMF0sImJvcmRlclRvcFdpZHRoIiwhMCksYy5sZWZ0Kz1tLmNzcyhhWzBdLCJib3JkZXJMZWZ0V2lkdGgiLCEwKSkse3RvcDpiLnRvcC1jLnRvcC1tLmNzcyhkLCJtYXJnaW5Ub3AiLCEwKSxsZWZ0OmIubGVmdC1jLmxlZnQtbS5jc3MoZCwibWFyZ2luTGVmdCIsITApfX19LG9mZnNldFBhcmVudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3ZhciBhPXRoaXMub2Zmc2V0UGFyZW50fHxjYzt3aGlsZShhJiYhbS5ub2RlTmFtZShhLCJodG1sIikmJiJzdGF0aWMiPT09bS5jc3MoYSwicG9zaXRpb24iKSlhPWEub2Zmc2V0UGFyZW50O3JldHVybiBhfHxjY30pfX0pLG0uZWFjaCh7c2Nyb2xsTGVmdDoicGFnZVhPZmZzZXQiLHNjcm9sbFRvcDoicGFnZVlPZmZzZXQifSxmdW5jdGlvbihhLGIpe3ZhciBjPS9ZLy50ZXN0KGIpO20uZm5bYV09ZnVuY3Rpb24oZCl7cmV0dXJuIFYodGhpcyxmdW5jdGlvbihhLGQsZSl7dmFyIGY9ZGMoYSk7cmV0dXJuIHZvaWQgMD09PWU/Zj9iIGluIGY/ZltiXTpmLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFtkXTphW2RdOnZvaWQoZj9mLnNjcm9sbFRvKGM/bShmKS5zY3JvbGxMZWZ0KCk6ZSxjP2U6bShmKS5zY3JvbGxUb3AoKSk6YVtkXT1lKX0sYSxkLGFyZ3VtZW50cy5sZW5ndGgsbnVsbCl9fSksbS5lYWNoKFsidG9wIiwibGVmdCJdLGZ1bmN0aW9uKGEsYil7bS5jc3NIb29rc1tiXT1MYShrLnBpeGVsUG9zaXRpb24sZnVuY3Rpb24oYSxjKXtyZXR1cm4gYz8oYz1KYShhLGIpLEhhLnRlc3QoYyk/bShhKS5wb3NpdGlvbigpW2JdKyJweCI6Yyk6dm9pZCAwfSl9KSxtLmVhY2goe0hlaWdodDoiaGVpZ2h0IixXaWR0aDoid2lkdGgifSxmdW5jdGlvbihhLGIpe20uZWFjaCh7cGFkZGluZzoiaW5uZXIiK2EsY29udGVudDpiLCIiOiJvdXRlciIrYX0sZnVuY3Rpb24oYyxkKXttLmZuW2RdPWZ1bmN0aW9uKGQsZSl7dmFyIGY9YXJndW1lbnRzLmxlbmd0aCYmKGN8fCJib29sZWFuIiE9dHlwZW9mIGQpLGc9Y3x8KGQ9PT0hMHx8ZT09PSEwPyJtYXJnaW4iOiJib3JkZXIiKTtyZXR1cm4gVih0aGlzLGZ1bmN0aW9uKGIsYyxkKXt2YXIgZTtyZXR1cm4gbS5pc1dpbmRvdyhiKT9iLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsiY2xpZW50IithXTo5PT09Yi5ub2RlVHlwZT8oZT1iLmRvY3VtZW50RWxlbWVudCxNYXRoLm1heChiLmJvZHlbInNjcm9sbCIrYV0sZVsic2Nyb2xsIithXSxiLmJvZHlbIm9mZnNldCIrYV0sZVsib2Zmc2V0IithXSxlWyJjbGllbnQiK2FdKSk6dm9pZCAwPT09ZD9tLmNzcyhiLGMsZyk6bS5zdHlsZShiLGMsZCxnKX0sYixmP2Q6dm9pZCAwLGYsbnVsbCl9fSl9KSxtLmZuLnNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sZW5ndGh9LG0uZm4uYW5kU2VsZj1tLmZuLmFkZEJhY2ssImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZCYmZGVmaW5lKCJqcXVlcnkiLFtdLGZ1bmN0aW9uKCl7cmV0dXJuIG19KTt2YXIgZWM9YS5qUXVlcnksZmM9YS4kO3JldHVybiBtLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oYil7cmV0dXJuIGEuJD09PW0mJihhLiQ9ZmMpLGImJmEualF1ZXJ5PT09bSYmKGEualF1ZXJ5PWVjKSxtfSx0eXBlb2YgYj09PUsmJihhLmpRdWVyeT1hLiQ9bSksbX0pOwo=]]></data>
	</file>
	<file>
	  <filename>/lib/jquery.lib/jquery-migrate-1.2.1.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohIGpRdWVyeSBNaWdyYXRlIHYxLjIuMSB8IChjKSAyMDA1LCAyMDEzIGpRdWVyeSBGb3VuZGF0aW9uLCBJbmMuIGFuZCBvdGhlciBjb250cmlidXRvcnMgfCBqcXVlcnkub3JnL2xpY2Vuc2UgKi8KalF1ZXJ5Lm1pZ3JhdGVNdXRlPT09dm9pZCAwJiYoalF1ZXJ5Lm1pZ3JhdGVNdXRlPSEwKSxmdW5jdGlvbihlLHQsbil7ZnVuY3Rpb24gcihuKXt2YXIgcj10LmNvbnNvbGU7aVtuXXx8KGlbbl09ITAsZS5taWdyYXRlV2FybmluZ3MucHVzaChuKSxyJiZyLndhcm4mJiFlLm1pZ3JhdGVNdXRlJiYoci53YXJuKCJKUU1JR1JBVEU6ICIrbiksZS5taWdyYXRlVHJhY2UmJnIudHJhY2UmJnIudHJhY2UoKSkpfWZ1bmN0aW9uIGEodCxhLGksbyl7aWYoT2JqZWN0LmRlZmluZVByb3BlcnR5KXRyeXtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsYSx7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHIobyksaX0sc2V0OmZ1bmN0aW9uKGUpe3IobyksaT1lfX0pLG59Y2F0Y2gocyl7fWUuX2RlZmluZVByb3BlcnR5QnJva2VuPSEwLHRbYV09aX12YXIgaT17fTtlLm1pZ3JhdGVXYXJuaW5ncz1bXSwhZS5taWdyYXRlTXV0ZSYmdC5jb25zb2xlJiZ0LmNvbnNvbGUubG9nJiZ0LmNvbnNvbGUubG9nKCJKUU1JR1JBVEU6IExvZ2dpbmcgaXMgYWN0aXZlIiksZS5taWdyYXRlVHJhY2U9PT1uJiYoZS5taWdyYXRlVHJhY2U9ITApLGUubWlncmF0ZVJlc2V0PWZ1bmN0aW9uKCl7aT17fSxlLm1pZ3JhdGVXYXJuaW5ncy5sZW5ndGg9MH0sIkJhY2tDb21wYXQiPT09ZG9jdW1lbnQuY29tcGF0TW9kZSYmcigialF1ZXJ5IGlzIG5vdCBjb21wYXRpYmxlIHdpdGggUXVpcmtzIE1vZGUiKTt2YXIgbz1lKCI8aW5wdXQvPiIse3NpemU6MX0pLmF0dHIoInNpemUiKSYmZS5hdHRyRm4scz1lLmF0dHIsdT1lLmF0dHJIb29rcy52YWx1ZSYmZS5hdHRySG9va3MudmFsdWUuZ2V0fHxmdW5jdGlvbigpe3JldHVybiBudWxsfSxjPWUuYXR0ckhvb2tzLnZhbHVlJiZlLmF0dHJIb29rcy52YWx1ZS5zZXR8fGZ1bmN0aW9uKCl7cmV0dXJuIG59LGw9L14oPzppbnB1dHxidXR0b24pJC9pLGQ9L15bMjM4XSQvLHA9L14oPzphdXRvZm9jdXN8YXV0b3BsYXl8YXN5bmN8Y2hlY2tlZHxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZHxzZWxlY3RlZCkkL2ksZj0vXig/OmNoZWNrZWR8c2VsZWN0ZWQpJC9pO2EoZSwiYXR0ckZuIixvfHx7fSwialF1ZXJ5LmF0dHJGbiBpcyBkZXByZWNhdGVkIiksZS5hdHRyPWZ1bmN0aW9uKHQsYSxpLHUpe3ZhciBjPWEudG9Mb3dlckNhc2UoKSxnPXQmJnQubm9kZVR5cGU7cmV0dXJuIHUmJig0PnMubGVuZ3RoJiZyKCJqUXVlcnkuZm4uYXR0ciggcHJvcHMsIHBhc3MgKSBpcyBkZXByZWNhdGVkIiksdCYmIWQudGVzdChnKSYmKG8/YSBpbiBvOmUuaXNGdW5jdGlvbihlLmZuW2FdKSkpP2UodClbYV0oaSk6KCJ0eXBlIj09PWEmJmkhPT1uJiZsLnRlc3QodC5ub2RlTmFtZSkmJnQucGFyZW50Tm9kZSYmcigiQ2FuJ3QgY2hhbmdlIHRoZSAndHlwZScgb2YgYW4gaW5wdXQgb3IgYnV0dG9uIGluIElFIDYvNy84IiksIWUuYXR0ckhvb2tzW2NdJiZwLnRlc3QoYykmJihlLmF0dHJIb29rc1tjXT17Z2V0OmZ1bmN0aW9uKHQscil7dmFyIGEsaT1lLnByb3AodCxyKTtyZXR1cm4gaT09PSEwfHwiYm9vbGVhbiIhPXR5cGVvZiBpJiYoYT10LmdldEF0dHJpYnV0ZU5vZGUocikpJiZhLm5vZGVWYWx1ZSE9PSExP3IudG9Mb3dlckNhc2UoKTpufSxzZXQ6ZnVuY3Rpb24odCxuLHIpe3ZhciBhO3JldHVybiBuPT09ITE/ZS5yZW1vdmVBdHRyKHQscik6KGE9ZS5wcm9wRml4W3JdfHxyLGEgaW4gdCYmKHRbYV09ITApLHQuc2V0QXR0cmlidXRlKHIsci50b0xvd2VyQ2FzZSgpKSkscn19LGYudGVzdChjKSYmcigialF1ZXJ5LmZuLmF0dHIoJyIrYysiJykgbWF5IHVzZSBwcm9wZXJ0eSBpbnN0ZWFkIG9mIGF0dHJpYnV0ZSIpKSxzLmNhbGwoZSx0LGEsaSkpfSxlLmF0dHJIb29rcy52YWx1ZT17Z2V0OmZ1bmN0aW9uKGUsdCl7dmFyIG49KGUubm9kZU5hbWV8fCIiKS50b0xvd2VyQ2FzZSgpO3JldHVybiJidXR0b24iPT09bj91LmFwcGx5KHRoaXMsYXJndW1lbnRzKTooImlucHV0IiE9PW4mJiJvcHRpb24iIT09biYmcigialF1ZXJ5LmZuLmF0dHIoJ3ZhbHVlJykgbm8gbG9uZ2VyIGdldHMgcHJvcGVydGllcyIpLHQgaW4gZT9lLnZhbHVlOm51bGwpfSxzZXQ6ZnVuY3Rpb24oZSx0KXt2YXIgYT0oZS5ub2RlTmFtZXx8IiIpLnRvTG93ZXJDYXNlKCk7cmV0dXJuImJ1dHRvbiI9PT1hP2MuYXBwbHkodGhpcyxhcmd1bWVudHMpOigiaW5wdXQiIT09YSYmIm9wdGlvbiIhPT1hJiZyKCJqUXVlcnkuZm4uYXR0cigndmFsdWUnLCB2YWwpIG5vIGxvbmdlciBzZXRzIHByb3BlcnRpZXMiKSxlLnZhbHVlPXQsbil9fTt2YXIgZyxoLHY9ZS5mbi5pbml0LG09ZS5wYXJzZUpTT04seT0vXihbXjxdKikoPFtcd1xXXSs+KShbXj5dKikkLztlLmZuLmluaXQ9ZnVuY3Rpb24odCxuLGEpe3ZhciBpO3JldHVybiB0JiYic3RyaW5nIj09dHlwZW9mIHQmJiFlLmlzUGxhaW5PYmplY3QobikmJihpPXkuZXhlYyhlLnRyaW0odCkpKSYmaVswXSYmKCI8IiE9PXQuY2hhckF0KDApJiZyKCIkKGh0bWwpIEhUTUwgc3RyaW5ncyBtdXN0IHN0YXJ0IHdpdGggJzwnIGNoYXJhY3RlciIpLGlbM10mJnIoIiQoaHRtbCkgSFRNTCB0ZXh0IGFmdGVyIGxhc3QgdGFnIGlzIGlnbm9yZWQiKSwiIyI9PT1pWzBdLmNoYXJBdCgwKSYmKHIoIkhUTUwgc3RyaW5nIGNhbm5vdCBzdGFydCB3aXRoIGEgJyMnIGNoYXJhY3RlciIpLGUuZXJyb3IoIkpRTUlHUkFURTogSW52YWxpZCBzZWxlY3RvciBzdHJpbmcgKFhTUykiKSksbiYmbi5jb250ZXh0JiYobj1uLmNvbnRleHQpLGUucGFyc2VIVE1MKT92LmNhbGwodGhpcyxlLnBhcnNlSFRNTChpWzJdLG4sITApLG4sYSk6di5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGUuZm4uaW5pdC5wcm90b3R5cGU9ZS5mbixlLnBhcnNlSlNPTj1mdW5jdGlvbihlKXtyZXR1cm4gZXx8bnVsbD09PWU/bS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6KHIoImpRdWVyeS5wYXJzZUpTT04gcmVxdWlyZXMgYSB2YWxpZCBKU09OIHN0cmluZyIpLG51bGwpfSxlLnVhTWF0Y2g9ZnVuY3Rpb24oZSl7ZT1lLnRvTG93ZXJDYXNlKCk7dmFyIHQ9LyhjaHJvbWUpWyBcL10oW1x3Ll0rKS8uZXhlYyhlKXx8Lyh3ZWJraXQpWyBcL10oW1x3Ll0rKS8uZXhlYyhlKXx8LyhvcGVyYSkoPzouKnZlcnNpb258KVsgXC9dKFtcdy5dKykvLmV4ZWMoZSl8fC8obXNpZSkgKFtcdy5dKykvLmV4ZWMoZSl8fDA+ZS5pbmRleE9mKCJjb21wYXRpYmxlIikmJi8obW96aWxsYSkoPzouKj8gcnY6KFtcdy5dKyl8KS8uZXhlYyhlKXx8W107cmV0dXJue2Jyb3dzZXI6dFsxXXx8IiIsdmVyc2lvbjp0WzJdfHwiMCJ9fSxlLmJyb3dzZXJ8fChnPWUudWFNYXRjaChuYXZpZ2F0b3IudXNlckFnZW50KSxoPXt9LGcuYnJvd3NlciYmKGhbZy5icm93c2VyXT0hMCxoLnZlcnNpb249Zy52ZXJzaW9uKSxoLmNocm9tZT9oLndlYmtpdD0hMDpoLndlYmtpdCYmKGguc2FmYXJpPSEwKSxlLmJyb3dzZXI9aCksYShlLCJicm93c2VyIixlLmJyb3dzZXIsImpRdWVyeS5icm93c2VyIGlzIGRlcHJlY2F0ZWQiKSxlLnN1Yj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSxuKXtyZXR1cm4gbmV3IHQuZm4uaW5pdChlLG4pfWUuZXh0ZW5kKCEwLHQsdGhpcyksdC5zdXBlcmNsYXNzPXRoaXMsdC5mbj10LnByb3RvdHlwZT10aGlzKCksdC5mbi5jb25zdHJ1Y3Rvcj10LHQuc3ViPXRoaXMuc3ViLHQuZm4uaW5pdD1mdW5jdGlvbihyLGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgZSYmIShhIGluc3RhbmNlb2YgdCkmJihhPXQoYSkpLGUuZm4uaW5pdC5jYWxsKHRoaXMscixhLG4pfSx0LmZuLmluaXQucHJvdG90eXBlPXQuZm47dmFyIG49dChkb2N1bWVudCk7cmV0dXJuIHIoImpRdWVyeS5zdWIoKSBpcyBkZXByZWNhdGVkIiksdH0sZS5hamF4U2V0dXAoe2NvbnZlcnRlcnM6eyJ0ZXh0IGpzb24iOmUucGFyc2VKU09OfX0pO3ZhciBiPWUuZm4uZGF0YTtlLmZuLmRhdGE9ZnVuY3Rpb24odCl7dmFyIGEsaSxvPXRoaXNbMF07cmV0dXJuIW98fCJldmVudHMiIT09dHx8MSE9PWFyZ3VtZW50cy5sZW5ndGh8fChhPWUuZGF0YShvLHQpLGk9ZS5fZGF0YShvLHQpLGEhPT1uJiZhIT09aXx8aT09PW4pP2IuYXBwbHkodGhpcyxhcmd1bWVudHMpOihyKCJVc2Ugb2YgalF1ZXJ5LmZuLmRhdGEoJ2V2ZW50cycpIGlzIGRlcHJlY2F0ZWQiKSxpKX07dmFyIGo9L1wvKGphdmF8ZWNtYSlzY3JpcHQvaSx3PWUuZm4uYW5kU2VsZnx8ZS5mbi5hZGRCYWNrO2UuZm4uYW5kU2VsZj1mdW5jdGlvbigpe3JldHVybiByKCJqUXVlcnkuZm4uYW5kU2VsZigpIHJlcGxhY2VkIGJ5IGpRdWVyeS5mbi5hZGRCYWNrKCkiKSx3LmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZS5jbGVhbnx8KGUuY2xlYW49ZnVuY3Rpb24odCxhLGksbyl7YT1hfHxkb2N1bWVudCxhPSFhLm5vZGVUeXBlJiZhWzBdfHxhLGE9YS5vd25lckRvY3VtZW50fHxhLHIoImpRdWVyeS5jbGVhbigpIGlzIGRlcHJlY2F0ZWQiKTt2YXIgcyx1LGMsbCxkPVtdO2lmKGUubWVyZ2UoZCxlLmJ1aWxkRnJhZ21lbnQodCxhKS5jaGlsZE5vZGVzKSxpKWZvcihjPWZ1bmN0aW9uKGUpe3JldHVybiFlLnR5cGV8fGoudGVzdChlLnR5cGUpP28/by5wdXNoKGUucGFyZW50Tm9kZT9lLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZSk6ZSk6aS5hcHBlbmRDaGlsZChlKTpufSxzPTA7bnVsbCE9KHU9ZFtzXSk7cysrKWUubm9kZU5hbWUodSwic2NyaXB0IikmJmModSl8fChpLmFwcGVuZENoaWxkKHUpLHUuZ2V0RWxlbWVudHNCeVRhZ05hbWUhPT1uJiYobD1lLmdyZXAoZS5tZXJnZShbXSx1LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKSksYyksZC5zcGxpY2UuYXBwbHkoZCxbcysxLDBdLmNvbmNhdChsKSkscys9bC5sZW5ndGgpKTtyZXR1cm4gZH0pO3ZhciBRPWUuZXZlbnQuYWRkLHg9ZS5ldmVudC5yZW1vdmUsaz1lLmV2ZW50LnRyaWdnZXIsTj1lLmZuLnRvZ2dsZSxUPWUuZm4ubGl2ZSxNPWUuZm4uZGllLFM9ImFqYXhTdGFydHxhamF4U3RvcHxhamF4U2VuZHxhamF4Q29tcGxldGV8YWpheEVycm9yfGFqYXhTdWNjZXNzIixDPVJlZ0V4cCgiXFxiKD86IitTKyIpXFxiIiksSD0vKD86Xnxccylob3ZlcihcLlxTK3wpXGIvLEE9ZnVuY3Rpb24odCl7cmV0dXJuInN0cmluZyIhPXR5cGVvZiB0fHxlLmV2ZW50LnNwZWNpYWwuaG92ZXI/dDooSC50ZXN0KHQpJiZyKCInaG92ZXInIHBzZXVkby1ldmVudCBpcyBkZXByZWNhdGVkLCB1c2UgJ21vdXNlZW50ZXIgbW91c2VsZWF2ZSciKSx0JiZ0LnJlcGxhY2UoSCwibW91c2VlbnRlciQxIG1vdXNlbGVhdmUkMSIpKX07ZS5ldmVudC5wcm9wcyYmImF0dHJDaGFuZ2UiIT09ZS5ldmVudC5wcm9wc1swXSYmZS5ldmVudC5wcm9wcy51bnNoaWZ0KCJhdHRyQ2hhbmdlIiwiYXR0ck5hbWUiLCJyZWxhdGVkTm9kZSIsInNyY0VsZW1lbnQiKSxlLmV2ZW50LmRpc3BhdGNoJiZhKGUuZXZlbnQsImhhbmRsZSIsZS5ldmVudC5kaXNwYXRjaCwialF1ZXJ5LmV2ZW50LmhhbmRsZSBpcyB1bmRvY3VtZW50ZWQgYW5kIGRlcHJlY2F0ZWQiKSxlLmV2ZW50LmFkZD1mdW5jdGlvbihlLHQsbixhLGkpe2UhPT1kb2N1bWVudCYmQy50ZXN0KHQpJiZyKCJBSkFYIGV2ZW50cyBzaG91bGQgYmUgYXR0YWNoZWQgdG8gZG9jdW1lbnQ6ICIrdCksUS5jYWxsKHRoaXMsZSxBKHR8fCIiKSxuLGEsaSl9LGUuZXZlbnQucmVtb3ZlPWZ1bmN0aW9uKGUsdCxuLHIsYSl7eC5jYWxsKHRoaXMsZSxBKHQpfHwiIixuLHIsYSl9LGUuZm4uZXJyb3I9ZnVuY3Rpb24oKXt2YXIgZT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMCk7cmV0dXJuIHIoImpRdWVyeS5mbi5lcnJvcigpIGlzIGRlcHJlY2F0ZWQiKSxlLnNwbGljZSgwLDAsImVycm9yIiksYXJndW1lbnRzLmxlbmd0aD90aGlzLmJpbmQuYXBwbHkodGhpcyxlKToodGhpcy50cmlnZ2VySGFuZGxlci5hcHBseSh0aGlzLGUpLHRoaXMpfSxlLmZuLnRvZ2dsZT1mdW5jdGlvbih0LG4pe2lmKCFlLmlzRnVuY3Rpb24odCl8fCFlLmlzRnVuY3Rpb24obikpcmV0dXJuIE4uYXBwbHkodGhpcyxhcmd1bWVudHMpO3IoImpRdWVyeS5mbi50b2dnbGUoaGFuZGxlciwgaGFuZGxlci4uLikgaXMgZGVwcmVjYXRlZCIpO3ZhciBhPWFyZ3VtZW50cyxpPXQuZ3VpZHx8ZS5ndWlkKyssbz0wLHM9ZnVuY3Rpb24obil7dmFyIHI9KGUuX2RhdGEodGhpcywibGFzdFRvZ2dsZSIrdC5ndWlkKXx8MCklbztyZXR1cm4gZS5fZGF0YSh0aGlzLCJsYXN0VG9nZ2xlIit0Lmd1aWQscisxKSxuLnByZXZlbnREZWZhdWx0KCksYVtyXS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fCExfTtmb3Iocy5ndWlkPWk7YS5sZW5ndGg+bzspYVtvKytdLmd1aWQ9aTtyZXR1cm4gdGhpcy5jbGljayhzKX0sZS5mbi5saXZlPWZ1bmN0aW9uKHQsbixhKXtyZXR1cm4gcigialF1ZXJ5LmZuLmxpdmUoKSBpcyBkZXByZWNhdGVkIiksVD9ULmFwcGx5KHRoaXMsYXJndW1lbnRzKTooZSh0aGlzLmNvbnRleHQpLm9uKHQsdGhpcy5zZWxlY3RvcixuLGEpLHRoaXMpfSxlLmZuLmRpZT1mdW5jdGlvbih0LG4pe3JldHVybiByKCJqUXVlcnkuZm4uZGllKCkgaXMgZGVwcmVjYXRlZCIpLE0/TS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6KGUodGhpcy5jb250ZXh0KS5vZmYodCx0aGlzLnNlbGVjdG9yfHwiKioiLG4pLHRoaXMpfSxlLmV2ZW50LnRyaWdnZXI9ZnVuY3Rpb24oZSx0LG4sYSl7cmV0dXJuIG58fEMudGVzdChlKXx8cigiR2xvYmFsIGV2ZW50cyBhcmUgdW5kb2N1bWVudGVkIGFuZCBkZXByZWNhdGVkIiksay5jYWxsKHRoaXMsZSx0LG58fGRvY3VtZW50LGEpfSxlLmVhY2goUy5zcGxpdCgifCIpLGZ1bmN0aW9uKHQsbil7ZS5ldmVudC5zcGVjaWFsW25dPXtzZXR1cDpmdW5jdGlvbigpe3ZhciB0PXRoaXM7cmV0dXJuIHQhPT1kb2N1bWVudCYmKGUuZXZlbnQuYWRkKGRvY3VtZW50LG4rIi4iK2UuZ3VpZCxmdW5jdGlvbigpe2UuZXZlbnQudHJpZ2dlcihuLG51bGwsdCwhMCl9KSxlLl9kYXRhKHRoaXMsbixlLmd1aWQrKykpLCExfSx0ZWFyZG93bjpmdW5jdGlvbigpe3JldHVybiB0aGlzIT09ZG9jdW1lbnQmJmUuZXZlbnQucmVtb3ZlKGRvY3VtZW50LG4rIi4iK2UuX2RhdGEodGhpcyxuKSksITF9fX0pfShqUXVlcnksd2luZG93KTs=]]></data>
	</file>
	<file>
	  <filename>/lib/jquerytools.lib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/jquerytools.lib/info.dat</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGluZm9bJ2NzcyddID0gJ0pRdWVyeVRvb2xzLmNzcyc7CiRpbmZvWydkZXBlbmRzJ10gPSAndGFibGVzb3J0ZXInOwokaW5mb1snc29ydGluZyddID0gOTk7Cj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/jquerytools.lib/JQueryTools.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIHRhYmxlc29ydGVyICoqKioqKioqKioqKioqKiovCgp0YWJsZS50YWJsZXNvcnRlciB0aGVhZCB0ciAuaGVhZGVyIHsKICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoLi4vaW1ncy9iZy5naWYpOwogICAgICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7CiAgICAgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyIGxlZnQ7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwp9Cgp0YWJsZS50YWJsZXNvcnRlciB0aGVhZCB0ciAuaGVhZGVyU29ydFVwIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjNzc3OwovKiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKC4uL2ltZ3MvYXNjLmdpZik7ICovCn0KCnRhYmxlLnRhYmxlc29ydGVyIHRoZWFkIHRyIC5oZWFkZXJTb3J0RG93biB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzc3NzsKLyogIGJhY2tncm91bmQtaW1hZ2U6IHVybCguLi9pbWdzL2Rlc2MuZ2lmKTsgKi8KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIG5leHQgY3NzIHRvb2wgKioqKioqKioqKioqKioqKi8=]]></data>
	</file>
	<file>
	  <filename>/lib/json.lib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/json.lib/info.dat</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGluZm9bJ2pzJ10gPSAnanF1ZXJ5Lmpzb24tMi40Lm1pbi5qcyc7CiRpbmZvWydkZXBlbmRzJ10gPSAnanF1ZXJ5JzsKJGluZm9bJ2pzX25vbWluaWZ5J10gPSAxOwo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lib/json.lib/jquery.json-2.4.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohIGpRdWVyeSBKU09OIHBsdWdpbiAyLjQuMCB8IGNvZGUuZ29vZ2xlLmNvbS9wL2pxdWVyeS1qc29uICovCihmdW5jdGlvbigkKXsndXNlIHN0cmljdCc7dmFyIGVzY2FwZT0vWyJcXFx4MDAtXHgxZlx4N2YtXHg5Zl0vZyxtZXRhPXsnXGInOidcXGInLCdcdCc6J1xcdCcsJ1xuJzonXFxuJywnXGYnOidcXGYnLCdccic6J1xccicsJyInOidcXCInLCdcXCc6J1xcXFwnfSxoYXNPd249T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTskLnRvSlNPTj10eXBlb2YgSlNPTj09PSdvYmplY3QnJiZKU09OLnN0cmluZ2lmeT9KU09OLnN0cmluZ2lmeTpmdW5jdGlvbihvKXtpZihvPT09bnVsbCl7cmV0dXJuJ251bGwnO30KdmFyIHBhaXJzLGssbmFtZSx2YWwsdHlwZT0kLnR5cGUobyk7aWYodHlwZT09PSd1bmRlZmluZWQnKXtyZXR1cm4gdW5kZWZpbmVkO30KaWYodHlwZT09PSdudW1iZXInfHx0eXBlPT09J2Jvb2xlYW4nKXtyZXR1cm4gU3RyaW5nKG8pO30KaWYodHlwZT09PSdzdHJpbmcnKXtyZXR1cm4gJC5xdW90ZVN0cmluZyhvKTt9CmlmKHR5cGVvZiBvLnRvSlNPTj09PSdmdW5jdGlvbicpe3JldHVybiAkLnRvSlNPTihvLnRvSlNPTigpKTt9CmlmKHR5cGU9PT0nZGF0ZScpe3ZhciBtb250aD1vLmdldFVUQ01vbnRoKCkrMSxkYXk9by5nZXRVVENEYXRlKCkseWVhcj1vLmdldFVUQ0Z1bGxZZWFyKCksaG91cnM9by5nZXRVVENIb3VycygpLG1pbnV0ZXM9by5nZXRVVENNaW51dGVzKCksc2Vjb25kcz1vLmdldFVUQ1NlY29uZHMoKSxtaWxsaT1vLmdldFVUQ01pbGxpc2Vjb25kcygpO2lmKG1vbnRoPDEwKXttb250aD0nMCcrbW9udGg7fQppZihkYXk8MTApe2RheT0nMCcrZGF5O30KaWYoaG91cnM8MTApe2hvdXJzPScwJytob3Vyczt9CmlmKG1pbnV0ZXM8MTApe21pbnV0ZXM9JzAnK21pbnV0ZXM7fQppZihzZWNvbmRzPDEwKXtzZWNvbmRzPScwJytzZWNvbmRzO30KaWYobWlsbGk8MTAwKXttaWxsaT0nMCcrbWlsbGk7fQppZihtaWxsaTwxMCl7bWlsbGk9JzAnK21pbGxpO30KcmV0dXJuJyInK3llYXIrJy0nK21vbnRoKyctJytkYXkrJ1QnKwpob3VycysnOicrbWludXRlcysnOicrc2Vjb25kcysnLicrbWlsbGkrJ1oiJzt9CnBhaXJzPVtdO2lmKCQuaXNBcnJheShvKSl7Zm9yKGs9MDtrPG8ubGVuZ3RoO2srKyl7cGFpcnMucHVzaCgkLnRvSlNPTihvW2tdKXx8J251bGwnKTt9CnJldHVybidbJytwYWlycy5qb2luKCcsJykrJ10nO30KaWYodHlwZW9mIG89PT0nb2JqZWN0Jyl7Zm9yKGsgaW4gbyl7aWYoaGFzT3duLmNhbGwobyxrKSl7dHlwZT10eXBlb2YgaztpZih0eXBlPT09J251bWJlcicpe25hbWU9JyInK2srJyInO31lbHNlIGlmKHR5cGU9PT0nc3RyaW5nJyl7bmFtZT0kLnF1b3RlU3RyaW5nKGspO31lbHNle2NvbnRpbnVlO30KdHlwZT10eXBlb2Ygb1trXTtpZih0eXBlIT09J2Z1bmN0aW9uJyYmdHlwZSE9PSd1bmRlZmluZWQnKXt2YWw9JC50b0pTT04ob1trXSk7cGFpcnMucHVzaChuYW1lKyc6Jyt2YWwpO319fQpyZXR1cm4neycrcGFpcnMuam9pbignLCcpKyd9Jzt9fTskLmV2YWxKU09OPXR5cGVvZiBKU09OPT09J29iamVjdCcmJkpTT04ucGFyc2U/SlNPTi5wYXJzZTpmdW5jdGlvbihzdHIpe3JldHVybiBldmFsKCcoJytzdHIrJyknKTt9OyQuc2VjdXJlRXZhbEpTT049dHlwZW9mIEpTT049PT0nb2JqZWN0JyYmSlNPTi5wYXJzZT9KU09OLnBhcnNlOmZ1bmN0aW9uKHN0cil7dmFyIGZpbHRlcmVkPXN0ci5yZXBsYWNlKC9cXFsiXFxcL2JmbnJ0dV0vZywnQCcpLnJlcGxhY2UoLyJbXiJcXFxuXHJdKiJ8dHJ1ZXxmYWxzZXxudWxsfC0/XGQrKD86XC5cZCopPyg/OltlRV1bK1wtXT9cZCspPy9nLCddJykucmVwbGFjZSgvKD86Xnw6fCwpKD86XHMqXFspKy9nLCcnKTtpZigvXltcXSw6e31cc10qJC8udGVzdChmaWx0ZXJlZCkpe3JldHVybiBldmFsKCcoJytzdHIrJyknKTt9CnRocm93IG5ldyBTeW50YXhFcnJvcignRXJyb3IgcGFyc2luZyBKU09OLCBzb3VyY2UgaXMgbm90IHZhbGlkLicpO307JC5xdW90ZVN0cmluZz1mdW5jdGlvbihzdHIpe2lmKHN0ci5tYXRjaChlc2NhcGUpKXtyZXR1cm4nIicrc3RyLnJlcGxhY2UoZXNjYXBlLGZ1bmN0aW9uKGEpe3ZhciBjPW1ldGFbYV07aWYodHlwZW9mIGM9PT0nc3RyaW5nJyl7cmV0dXJuIGM7fQpjPWEuY2hhckNvZGVBdCgpO3JldHVybidcXHUwMCcrTWF0aC5mbG9vcihjLzE2KS50b1N0cmluZygxNikrKGMlMTYpLnRvU3RyaW5nKDE2KTt9KSsnIic7fQpyZXR1cm4nIicrc3RyKyciJzt9O30oalF1ZXJ5KSk7]]></data>
	</file>
	<file>
	  <filename>/lib/jsviews.lib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/jsviews.lib/info.dat</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGluZm9bJ2pzJ10gPSAnanN2aWV3cy5taW4uanMnOwokaW5mb1snZGVwZW5kcyddID0gJ2pxdWVyeSc7CiRpbmZvWydqc19ub21pbmlmeSddID0gMTsKPz4K]]></data>
	</file>
	<file>
	  <filename>/lib/jsviews.lib/jsviews.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[77u/LyohIGpzdmlld3MuanMgdjEuMC4wLWFscGhhIHNpbmdsZS1maWxlIHZlcnNpb246CmluY2x1ZGVzIEpzUmVuZGVyLCBKc09ic2VydmFibGUgYW5kIEpzVmlld3MgIGh0dHA6Ly9naXRodWIuY29tL0JvcmlzTW9vcmUvanNyZW5kZXIgYW5kIGh0dHA6Ly9qc3ZpZXdzLmNvbS9qc3ZpZXdzCmluZm9ybWFsIHByZSBWMS4wIGNvbW1pdCBjb3VudGVyOiA1MyAoQmV0YSBDYW5kaWRhdGUpICovCihmdW5jdGlvbihuLHQsaSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGt0KG4pe3JldHVybiBufWZ1bmN0aW9uIGtpKG4pe3JldHVybiBufWZ1bmN0aW9uIGR0KG4pe2UuX2RiZ01vZGU9bjt5dD1uPyJVbmF2YWlsYWJsZSAobmVzdGVkIHZpZXcpOiB1c2UgI2dldEluZGV4KCkiOiIiO2QoImRiZyIsb2kuZGJnPWx0LmRiZz1uP2tpOmt0KX1mdW5jdGlvbiBndChuKXtyZXR1cm57Z2V0VGd0Om4sbWFwOmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMscjtpLnNyYyE9PXQmJihpLnNyYyYmaS51bm1hcCgpLHR5cGVvZiB0PT0ib2JqZWN0IiYmKHI9bi5hcHBseShpLGFyZ3VtZW50cyksaS5zcmM9dCxpLnRndD1yKSl9fX1mdW5jdGlvbiBmdChuLHQpe3QmJnQub25FcnJvciYmdC5vbkVycm9yKG4pPT09ITF8fCh0aGlzLm5hbWU9KHUubGluaz8iSnNWaWV3cyI6IkpzUmVuZGVyIikrIiBFcnJvciIsdGhpcy5tZXNzYWdlPW58fHRoaXMubmFtZSl9ZnVuY3Rpb24gZihuLHQpe3ZhciBpO249bnx8e307Zm9yKGkgaW4gdCluW2ldPXRbaV07cmV0dXJuIG59ZnVuY3Rpb24gbmkobix0LGkpe3JldHVybighaC5yVGFnfHxuKSYmKHA9bj9uLmNoYXJBdCgwKTpwLHc9bj9uLmNoYXJBdCgxKTp3LG89dD90LmNoYXJBdCgwKTpvLGE9dD90LmNoYXJBdCgxKTphLGc9aXx8ZyxuPSJcXCIrcCsiKFxcIitnKyIpP1xcIit3LHQ9IlxcIitvKyJcXCIrYSx5PSIoPzooPzooXFx3Kyg/PVtcXC9cXHNcXCIrbysiXSkpfCg/OihcXHcrKT8oOil8KD4pfCEtLSgoPzpbXi1dfC0oPyEtKSkqKS0tfChcXCopKSlcXHMqKCg/OlteXFwiK28rIl18XFwiK28rIig/IVxcIithKyIpKSo/KSIsaC5yVGFnPXkrIikiLHk9bmV3IFJlZ0V4cChuK3krIihcXC8pP3woPzpcXC8oXFx3KykpKSIrdCwiZyIpLHZ0PW5ldyBSZWdFeHAoIjwuKj58KFteXFxcXF18Xilbe31dfCIrbisiLioiK3QpKSxbcCx3LG8sYSxnXX1mdW5jdGlvbiBkaShuLHQpe3R8fCh0PW4sbj1pKTt2YXIgZSxmLG8sdSxyPXRoaXMscz0hdHx8dD09PSJyb290IjtpZihuKXtpZih1PXIudHlwZT09PXQ/cjppLCF1KWlmKGU9ci52aWV3cyxyLl8udXNlS2V5KXtmb3IoZiBpbiBlKWlmKHU9ZVtmXS5nZXQobix0KSlicmVha31lbHNlIGZvcihmPTAsbz1lLmxlbmd0aDshdSYmZjxvO2YrKyl1PWVbZl0uZ2V0KG4sdCl9ZWxzZSBpZihzKXdoaWxlKHIucGFyZW50LnBhcmVudCl1PXI9ci5wYXJlbnQ7ZWxzZSB3aGlsZShyJiYhdSl1PXIudHlwZT09PXQ/cjppLHI9ci5wYXJlbnQ7cmV0dXJuIHV9ZnVuY3Rpb24gdGkoKXt2YXIgbj10aGlzLmdldCgiaXRlbSIpO3JldHVybiBuP24uaW5kZXg6aX1mdW5jdGlvbiBpaSgpe3JldHVybiB0aGlzLmluZGV4fWZ1bmN0aW9uIGdpKHQpe3ZhciB1LGU9dGhpcyxvPWUubGlua0N0eCxyPShlLmN0eHx8e30pW3RdO3JldHVybiByPT09aSYmbyYmby5jdHgmJihyPW8uY3R4W3RdKSxyPT09aSYmKHI9b2lbdF0pLHImJmF0KHIpJiYhci5fd3JwJiYodT1mdW5jdGlvbigpe3JldHVybiByLmFwcGx5KCF0aGlzfHx0aGlzPT09bj9lOnRoaXMsYXJndW1lbnRzKX0sdS5fd3JwPTEsZih1LHIpKSx1fHxyfWZ1bmN0aW9uIG5yKG4sdCx1KXt2YXIgZixlLGgsbz0rdT09PXUmJnUscz10LmxpbmtDdHg7aWYobyYmKHU9KG89dC50bXBsLmJuZHNbby0xXSkodC5kYXRhLHQscikpLGU9dS5hcmdzWzBdLG58fG8pe2Y9cyYmcy50YWd8fHtfOntpbmxpbmU6IXMsYm5kOm99LHRhZ05hbWU6bisiOiIsZmxvdzohMCxfaXM6InRhZyJ9O2ZvcihoIGluIHUucHJvcHMpcnQudGVzdChoKSYmKGZbaF09dS5wcm9wc1toXSk7cyYmKHMudGFnPWYsZi5saW5rQ3R4PWYubGlua0N0eHx8cyx1LmN0eD1sKHUuY3R4LHMudmlldy5jdHgpKTtmLnRhZ0N0eD11O3Uudmlldz10O2YuY3R4PXUuY3R4fHx7fTtkZWxldGUgdS5jdHg7dC5fLnRhZz1mO2U9ZXQoZixmLmNvbnZlcnR8fG4hPT0idHJ1ZSImJm4pWzBdO2U9ZSE9aT9lOiIiO2U9byYmdC5fLm9uUmVuZGVyP3QuXy5vblJlbmRlcihlLHQsbyk6ZTt0Ll8udGFnPWl9cmV0dXJuIGV9ZnVuY3Rpb24gZXQobix0KXt2YXIgcj1uLnRhZ0N0eCx1PXIudmlldyxpPXIuYXJncztyZXR1cm4gdD10JiYoIiIrdD09PXQ/dS5nZXRSc2MoImNvbnZlcnRlcnMiLHQpfHx2KCJVbmtub3duIGNvbnZlcnRlcjogJyIrdCsiJyIpOnQpLGk9IWkubGVuZ3RoJiYhci5pbmRleCYmbi5hdXRvQmluZD9bdS5kYXRhXTp0P2kuc2xpY2UoKTppLHQmJih0LmRlcGVuZHMmJihuLmRlcGVuZHM9aC5nZXREZXBzKG4uZGVwZW5kcyxuLHQuZGVwZW5kcyx0KSksaVswXT10LmFwcGx5KG4saSkpLGl9ZnVuY3Rpb24gdHIobix0KXtmb3IodmFyIGYsZSx1PXRoaXM7Zj09PWkmJnU7KWU9dS50bXBsW25dLGY9ZSYmZVt0XSx1PXUucGFyZW50O3JldHVybiBmfHxyW25dW3RdfWZ1bmN0aW9uIGlyKG4sdCx1LGUsbyl7dmFyIGN0LGgsd3QsYXQsdXQsYSx2dCx3LGMsZnQsdHQsYnQsayx5dCxwdCxudCx5LHN0LGQsa3QsZz0iIixodD0rZT09PWUmJmUscD10LmxpbmtDdHh8fDAsaXQ9dC5jdHgsZHQ9dXx8dC50bXBsO2ZvcihuLl9pcz09PSJ0YWciJiYoaD1uLG49aC50YWdOYW1lKSxoPWh8fHAudGFnLGh0JiYoZT0oYnQ9ZHQuYm5kc1todC0xXSkodC5kYXRhLHQscikpLHZ0PWUubGVuZ3RoLGE9MDthPHZ0O2ErKyl7aWYoYz1lW2FdLGQ9Yy5wcm9wcyx0dD1jLnRtcGwsdHQ9Yy5jb250ZW50PXR0JiZkdC50bXBsc1t0dC0xXSx1PWMucHJvcHMudG1wbCxhfHx1JiZofHwoaz10LmdldFJzYygidGFncyIsbil8fHYoIlVua25vd24gdGFnOiB7eyIrbisifX0iKSksdT11fHwoaD9oOmspLnRlbXBsYXRlfHx0dCx1PSIiK3U9PT11P3QuZ2V0UnNjKCJ0ZW1wbGF0ZXMiLHUpfHxzKHUpOnUsZihjLHt0bXBsOnUscmVuZGVyOm90LGluZGV4OmEsdmlldzp0LGN0eDpsKGMuY3R4LGl0KX0pLCFoKXtrLl9jdHI/KGg9bmV3IGsuX2N0cix5dD0hIWguaW5pdCxoLmF0dHI9aC5hdHRyfHxrLmF0dHJ8fGkpOmg9e3JlbmRlcjprLnJlbmRlcn07aC5fPXtpbmxpbmU6IXB9O3AmJihwLmF0dHI9aC5hdHRyPXAuYXR0cnx8aC5hdHRyLHAudGFnPWgsaC5saW5rQ3R4PXApOyhoLl8uYm5kPWJ0fHxwLmZuKT9oLl8uYXJyVndzPXt9OmguZGF0YUJvdW5kT25seSYmdigie157IituKyJ9fSB0YWcgbXVzdCBiZSBkYXRhLWJvdW5kIik7aC50YWdOYW1lPW47aC5wYXJlbnQ9dXQ9aXQmJml0LnRhZztoLl9pcz0idGFnIjtoLl9kZWY9aztmb3Ioc3QgaW4gZD1jLnByb3BzKXJ0LnRlc3Qoc3QpJiYoaFtzdF09ZFtzdF0pfWMudGFnPWg7aC5tYXAmJmgudGFnQ3R4cyYmKGMubWFwPWgudGFnQ3R4c1thXS5tYXApO2guZmxvd3x8KGZ0PWMuY3R4PWMuY3R4fHx7fSx3dD1oLnBhcmVudHM9ZnQucGFyZW50VGFncz1pdCYmbChmdC5wYXJlbnRUYWdzLGl0LnBhcmVudFRhZ3MpfHx7fSx1dCYmKHd0W3V0LnRhZ05hbWVdPXV0KSxmdC50YWc9aCl9Zm9yKGgudGFnQ3R4cz1lLHQuXy50YWc9aCxoLnJlbmRlcmluZz17fSxhPTA7YTx2dDthKyspYz1oLnRhZ0N0eD1lW2FdLGQ9Yy5wcm9wcyx5PWV0KGgsaC5jb252ZXJ0KSwocHQ9ZC5tYXB8fGgpLm1hcCYmKHkubGVuZ3RofHxkLm1hcCkmJihudD1jLm1hcD1mKGMubWFwfHx7dW5tYXA6cHQudW5tYXB9LGQpLG50LnNyYyE9PXlbMF0mJihudC5zcmMmJm50LnVubWFwKCkscHQubWFwLmFwcGx5KG50LHkpKSx5PVtudC50Z3RdKSxoLmN0eD1jLmN0eCwhYSYmeXQmJihrdD1oLnRlbXBsYXRlLGguaW5pdChjLHAsaC5jdHgpLHl0PWksaC50ZW1wbGF0ZSE9PWt0JiYoaC5fLnRtcGw9aC50ZW1wbGF0ZSkpLHc9aSxjdD1oLnJlbmRlciwoY3Q9aC5yZW5kZXIpJiYodz1jdC5hcHBseShoLHkpKSx5PXkubGVuZ3RoP3k6W3RdLHc9dyE9PWk/dzpjLnJlbmRlcih5WzBdLCEwKXx8KG8/aToiIiksZz1nP2crKHd8fCIiKTp3O3JldHVybiBkZWxldGUgaC5yZW5kZXJpbmcsaC50YWdDdHg9aC50YWdDdHhzWzBdLGguY3R4PWgudGFnQ3R4LmN0eCxoLl8uaW5saW5lJiYoYXQ9aC5hdHRyKSYmYXQhPT1iJiYoZz1hdD09PSJ0ZXh0Ij9sdC5odG1sKGcpOiIiKSxodCYmdC5fLm9uUmVuZGVyP3QuXy5vblJlbmRlcihnLHQsaHQpOmd9ZnVuY3Rpb24gbnQobix0LGkscix1LGYsZSxvKXt2YXIgYSxoLGMsdj10PT09ImFycmF5IixsPXtrZXk6MCx1c2VLZXk6dj8wOjEsaWQ6IiIrYmkrKyxvblJlbmRlcjpvLGJuZHM6e319LHM9e2RhdGE6cix0bXBsOnUsY29udGVudDplLHZpZXdzOnY/W106e30scGFyZW50OmksdHlwZTp0LGdldDpkaSxnZXRJbmRleDppaSxnZXRSc2M6dHIsaGxwOmdpLF86bCxfaXM6InZpZXcifTtyZXR1cm4gaT8oYT1pLnZpZXdzLGg9aS5fLGgudXNlS2V5PyhhW2wua2V5PSJfIitoLnVzZUtleSsrXT1zLHMuaW5kZXg9eXQscy5nZXRJbmRleD10aSxjPWgudGFnLGwuYm5kPXYmJighY3x8ISFjLl8uYm5kJiZjKSk6YS5zcGxpY2UobC5rZXk9cy5pbmRleD1mLDAscykscy5jdHg9bnx8aS5jdHgpOnMuY3R4PW4sc31mdW5jdGlvbiBycihuKXt2YXIgdCxpLHIsdSxmO2Zvcih0IGluIGspaWYodT1rW3RdLChmPXUuY29tcGlsZSkmJihpPW5bdCsicyJdKSlmb3IociBpbiBpKWlbcl09ZihyLGlbcl0sbix0LHUpfWZ1bmN0aW9uIHVyKG4sdCxpKXt2YXIgdSxyO3JldHVybiBhdCh0KT90PXtkZXBlbmRzOnQuZGVwZW5kcyxyZW5kZXI6dH06KChyPXQudGVtcGxhdGUpJiYodC50ZW1wbGF0ZT0iIityPT09cj9zW3JdfHxzKHIpOnIpLHQuaW5pdCE9PSExJiYodT10Ll9jdHI9ZnVuY3Rpb24oKXt9LCh1LnByb3RvdHlwZT10KS5jb25zdHJ1Y3Rvcj11KSksaSYmKHQuX3BhcmVudFRtcGw9aSksdH1mdW5jdGlvbiByaShyLHUsZixlLG8saCl7ZnVuY3Rpb24gdihpKXtpZigiIitpPT09aXx8aS5ub2RlVHlwZT4wKXt0cnl7YT1pLm5vZGVUeXBlPjA/aTohdnQudGVzdChpKSYmdCYmdChuLmRvY3VtZW50KS5maW5kKGkpWzBdfWNhdGNoKHUpe31yZXR1cm4gYSYmKGk9YS5nZXRBdHRyaWJ1dGUoYnQpLHI9cnx8aSxpPXNbaV0saXx8KHI9cnx8Il8iK3dpKyssYS5zZXRBdHRyaWJ1dGUoYnQsciksaT1zW3JdPXJpKHIsYS5pbm5lckhUTUwsZixlLG8saCkpLGE9bnVsbCksaX19dmFyIGMsYTtyZXR1cm4gdT11fHwiIixjPXYodSksaD1ofHwodS5tYXJrdXA/dTp7fSksaC50bXBsTmFtZT1yLGYmJihoLl9wYXJlbnRUbXBsPWYpLCFjJiZ1Lm1hcmt1cCYmKGM9dih1Lm1hcmt1cCkpJiZjLmZuJiYoYy5kZWJ1ZyE9PXUuZGVidWd8fGMuYWxsb3dDb2RlIT09dS5hbGxvd0NvZGUpJiYoYz1jLm1hcmt1cCksYyE9PWk/KHImJiFmJiYodXRbcl09ZnVuY3Rpb24oKXtyZXR1cm4gdS5yZW5kZXIuYXBwbHkodSxhcmd1bWVudHMpfSksYy5mbnx8dS5mbj9jLmZuJiYodT1yJiZyIT09Yy50bXBsTmFtZT9sKGgsYyk6Yyk6KHU9dWkoYyxoKSxzdChjLnJlcGxhY2UobGksIlxcJCYiKSx1KSkscnIoaCksdSk6dm9pZCAwfWZ1bmN0aW9uIHVpKG4sdCl7dmFyIGksbz1lLndyYXBNYXB8fHt9LHI9Zih7bWFya3VwOm4sdG1wbHM6W10sbGlua3M6e30sdGFnczp7fSxibmRzOltdLF9pczoidGVtcGxhdGUiLHJlbmRlcjpvdH0sdCk7cmV0dXJuIHQuaHRtbFRhZ3x8KGk9eWkuZXhlYyhuKSxyLmh0bWxUYWc9aT9pWzFdLnRvTG93ZXJDYXNlKCk6IiIpLGk9b1tyLmh0bWxUYWddLGkmJmkhPT1vLmRpdiYmKHIubWFya3VwPXUudHJpbShyLm1hcmt1cCkpLHJ9ZnVuY3Rpb24gZnIobix0KXtmdW5jdGlvbiB1KGUsbyxzKXt2YXIgYSxjLHYsbDtpZihlJiYiIitlIT09ZSYmIWUubm9kZVR5cGUmJiFlLm1hcmt1cCl7Zm9yKHYgaW4gZSl1KHYsZVt2XSxvKTtyZXR1cm4gcn1yZXR1cm4gbz09PWkmJihvPWUsZT1pKSxlJiYiIitlIT09ZSYmKHM9byxvPWUsZT1pKSxsPXM/c1tmXT1zW2ZdfHx7fTp1LGM9dC5jb21waWxlLChhPWgub25CZWZvcmVTdG9yZUl0ZW0pJiYoYz1hKGwsZSxvLGMpfHxjKSxlP289PT1udWxsP2RlbGV0ZSBsW2VdOmxbZV09Yz9vPWMoZSxvLHMsbix0KTpvOm89YyhpLG8pLGMmJm8mJihvLl9pcz1uKSwoYT1oLm9uU3RvcmVJdGVtKSYmYShsLGUsbyxjKSxvfXZhciBmPW4rInMiO3JbZl09dTtrW25dPXR9ZnVuY3Rpb24gb3Qobix0LGYsZSxvLGgpe3ZhciB3LGV0LHR0LHksaXQscnQsdXQsayxwLGZ0LGQsb3QsYyxhPXRoaXMsc3Q9IWEuYXR0cnx8YS5hdHRyPT09YixnPSIiO2lmKCEhdD09PXQmJihmPXQsdD1pKSxvPT09ITAmJih1dD0hMCxvPTApLGEudGFnPyhrPWEsYT1hLnRhZyxmdD1hLl8sb3Q9YS50YWdOYW1lLGM9ZnQudG1wbHx8ay50bXBsLHQ9bCh0LGEuY3R4KSxwPWsuY29udGVudCxrLnByb3BzLmxpbms9PT0hMSYmKHQ9dHx8e30sdC5saW5rPSExKSxlPWV8fGsudmlldyxuPWFyZ3VtZW50cy5sZW5ndGg/bjplKTpjPWEuanF1ZXJ5JiYoYVswXXx8dignVW5rbm93biB0ZW1wbGF0ZTogIicrYS5zZWxlY3RvcisnIicpKXx8YSxjJiYoIWUmJm4mJm4uX2lzPT09InZpZXciJiYoZT1uKSxlJiYocD1wfHxlLmNvbnRlbnQsaD1ofHxlLl8ub25SZW5kZXIsbj09PWUmJihuPWUuZGF0YSksdD1sKHQsZS5jdHgpKSxlJiZlLmRhdGEhPT1pfHwoKHQ9dHx8e30pLnJvb3Q9biksYy5mbnx8KGM9c1tjXXx8cyhjKSksYykpe2lmKGg9KHQmJnQubGluaykhPT0hMSYmc3QmJmgsZD1oLGg9PT0hMCYmKGQ9aSxoPWUuXy5vblJlbmRlciksdD1jLmhlbHBlcnM/bChjLmhlbHBlcnMsdCk6dCx1LmlzQXJyYXkobikmJiFmKWZvcih5PXV0P2U6byE9PWkmJmV8fG50KHQsImFycmF5IixlLG4sYyxvLHAsaCksdz0wLGV0PW4ubGVuZ3RoO3c8ZXQ7dysrKXR0PW5bd10saXQ9bnQodCwiaXRlbSIseSx0dCxjLChvfHwwKSt3LHAsaCkscnQ9Yy5mbih0dCxpdCxyKSxnKz15Ll8ub25SZW5kZXI/eS5fLm9uUmVuZGVyKHJ0LGl0KTpydDtlbHNlIHk9dXQ/ZTpudCh0LG90fHwiZGF0YSIsZSxuLGMsbyxwLGgpLGZ0JiYhYS5mbG93JiYoeS50YWc9YSksZys9Yy5mbihuLHkscik7cmV0dXJuIGQ/ZChnLHkpOmd9cmV0dXJuIiJ9ZnVuY3Rpb24gdihuKXt0aHJvdyBuZXcgaC5FcnIobik7fWZ1bmN0aW9uIGMobil7digiU3ludGF4IGVycm9yXG4iK24pfWZ1bmN0aW9uIHN0KG4sdCxpLHIpe2Z1bmN0aW9uIHYodCl7dC09Zjt0JiZzLnB1c2gobi5zdWJzdHIoZix0KS5yZXBsYWNlKGl0LCJcXG4iKSl9ZnVuY3Rpb24gaCh0KXt0JiZjKCdVbm1hdGNoZWQgb3IgbWlzc2luZyB0YWc6ICJ7ey8nK3QrJ319IiBpbiB0ZW1wbGF0ZTpcbicrbil9ZnVuY3Rpb24gcChlLHkscCxrLGQsZyxudCx0dCx1dCxmdCxldCxvdCl7ZyYmKGQ9IjoiLGs9Yik7ZnQ9ZnR8fGk7dmFyIHB0LGx0LGF0PXkmJltdLGN0PSIiLHN0PSIiLHZ0PSIiLHl0PSFmdCYmIWQmJiFudDtwPXB8fCh1dD11dHx8IiNkYXRhIixkKTt2KG90KTtmPW90K2UubGVuZ3RoO3R0P3cmJnMucHVzaChbIioiLCJcbiIrdXQucmVwbGFjZShjaSwiJDEiKSsiXG4iXSk6cD8ocD09PSJlbHNlIiYmKHZpLnRlc3QodXQpJiZjKCdmb3IgInt7ZWxzZSBpZiBleHByfX0iIHVzZSAie3tlbHNlIGV4cHJ9fSInKSxhdD11WzZdLHVbN109bi5zdWJzdHJpbmcodVs3XSxvdCksdT1vLnBvcCgpLHM9dVszXSx5dD0hMCksdXQmJih1dD11dC5yZXBsYWNlKGl0LCIgIiksY3Q9aHQodXQsYXQsdCkucmVwbGFjZShhaSxmdW5jdGlvbihuLHQsaSl7cmV0dXJuIHQ/dnQrPWkrIiwiOnN0Kz1pKyIsIixhPWF8fHJ0LnRlc3QoaS5zcGxpdCgiOiIpWzBdKSwiIn0pKSxzdD1zdC5zbGljZSgwLC0xKSxjdD1jdC5zbGljZSgwLC0xKSxwdD1zdCYmc3QuaW5kZXhPZigibm9lcnJvcjp0cnVlIikrMSYmc3R8fCIiLGw9W3Asa3x8ISFyfHxhfHwiIixjdCx5dCYmW10sJ1xuXHRwYXJhbXM6IicrdXQrJyIsXG5cdHByb3BzOnsnK3N0KyJ9IisodnQ/IixjdHg6eyIrdnQuc2xpY2UoMCwtMSkrIn0iOiIiKSxwdCxhdHx8MF0scy5wdXNoKGwpLHl0JiYoby5wdXNoKHUpLHU9bCx1WzddPWYpKTpldCYmKGx0PXVbMF0saChldCE9PWx0JiZsdCE9PSJlbHNlIiYmZXQpLHVbN109bi5zdWJzdHJpbmcodVs3XSxvdCksdT1vLnBvcCgpKTtoKCF1JiZldCk7cz11WzNdfXZhciBsLGEsdz10JiZ0LmFsbG93Q29kZSxlPVtdLGY9MCxvPVtdLHM9ZSx1PVssLCxlXTtyZXR1cm4gaChvWzBdJiZvWzBdWzNdLnBvcCgpWzBdKSxuLnJlcGxhY2UoeSxwKSx2KG4ubGVuZ3RoKSwoZj1lW2UubGVuZ3RoLTFdKSYmaCgiIitmIT09ZiYmK2ZbN109PT1mWzddJiZmWzBdKSxmaShlLGk/bjp0LGkpfWZ1bmN0aW9uIGZpKG4saSxyKXt2YXIgYSxmLG8sbCx2LHAsaHQsY3QsbHQsYXQsZXQsdyxzLG90LHksdHQsayxydCx2dCxkLHl0LHB0LHN0LHV0LGcsaD0wLHU9IiIsbnQ9IiIsZnQ9e30sd3Q9bi5sZW5ndGg7Zm9yKCIiK2k9PT1pPyh5PXI/J2RhdGEtbGluaz0iJytpLnJlcGxhY2UoaXQsIiAiKS5zbGljZSgxLC0xKSsnIic6aSxpPTApOih5PWkudG1wbE5hbWV8fCJ1bm5hbWVkIixpLmFsbG93Q29kZSYmKGZ0LmFsbG93Q29kZT0hMCksaS5kZWJ1ZyYmKGZ0LmRlYnVnPSEwKSx3PWkuYm5kcyxvdD1pLnRtcGxzKSxhPTA7YTx3dDthKyspaWYoZj1uW2FdLCIiK2Y9PT1mKXUrPSdcbnJldCs9IicrZisnIjsnO2Vsc2UgaWYobz1mWzBdLG89PT0iKiIpdSs9IiIrZlsxXTtlbHNle2lmKGw9ZlsxXSx2PWZbMl0scnQ9ZlszXSxwPWZbNF0sbnQ9Zls1XSx2dD1mWzddLChwdD1vPT09ImVsc2UiKXx8KGg9MCx3JiYocz1mWzZdKSYmKGg9dy5wdXNoKHMpKSksKHN0PW89PT0iOiIpPyhsJiYobz1sPT09Yj8iPiI6bCtvKSxudCYmKHV0PSJwcm0iK2EsbnQ9InRyeXt2YXIgIit1dCsiPVsiK3YrIl1bMF07fWNhdGNoKGUpeyIrdXQrJz0iIjt9XG4nLHY9dXQpKToocnQmJih0dD11aSh2dCxmdCksdHQudG1wbE5hbWU9eSsiLyIrbyxmaShydCx0dCksb3QucHVzaCh0dCkpLHB0fHwoaz1vLHl0PXUsdT0iIiksZD1uW2ErMV0sZD1kJiZkWzBdPT09ImVsc2UiKSxwKz0iLFxuXHRhcmdzOlsiK3YrIl19IixzdCYmKHN8fGwmJmwhPT1iKSl7aWYoZz1uZXcgRnVuY3Rpb24oImRhdGEsdmlldyxqLHUiLCIgLy8gIit5KyIgIitoKyIgIitvKyJcbiIrbnQrInJldHVybiB7IitwKyI7IiksZy5wYXRocz1zLGcuX2N0eHM9byxyKXJldHVybiBnO2V0PTF9aWYodSs9c3Q/IlxuIisocz8iIjpudCkrKHI/InJldHVybiAiOiJyZXQrPSIpKyhldD8oZXQ9MCxhdD0hMCwnYygiJytsKyciLHZpZXcsJysocz8od1toLTFdPWcsaCk6InsiK3ApKyIpOyIpOm89PT0iPiI/KGN0PSEwLCJoKCIrdisiKTsiKToobHQ9ITAsIih2PSIrdisiKSE9Iisocj8iPSI6IiIpKyd1P3Y6IiI7JykpOihodD0hMCwie3ZpZXc6dmlldyx0bXBsOiIrKHJ0P290Lmxlbmd0aDoiMCIpKyIsIitwKyIsIiksayYmIWQpe2lmKHU9IlsiK3Uuc2xpY2UoMCwtMSkrIl0iLChyfHxzKSYmKHU9bmV3IEZ1bmN0aW9uKCJkYXRhLHZpZXcsaix1IiwiIC8vICIreSsiICIraCsiICIraysiXG5yZXR1cm4gIit1KyI7IikscyYmKCh3W2gtMV09dSkucGF0aHM9cyksdS5fY3R4cz1vLHIpKXJldHVybiB1O3U9eXQrJ1xucmV0Kz10KCInK2srJyIsdmlldyx0aGlzLCcrKGh8fHUpKyIpOyI7cz0wO2s9MH19dT0iLy8gIit5KyJcbnZhciBqPWp8fCIrKHQ/ImpRdWVyeS4iOiJqcyIpKyJ2aWV3cyIrKGx0PyIsdiI6IiIpKyhodD8iLHQ9ai5fdGFnIjoiIikrKGF0PyIsYz1qLl9jbnZ0IjoiIikrKGN0PyIsaD1qLmNvbnZlcnRlcnMuaHRtbCI6IiIpKyhyPyI7XG4iOicscmV0PSIiO1xuJykrKGUudHJ5Q2F0Y2g/InRyeXtcbiI6IiIpKyhmdC5kZWJ1Zz8iZGVidWdnZXI7IjoiIikrdSsocj8iXG4iOiJcbnJldHVybiByZXQ7XG4iKSsoZS50cnlDYXRjaD8iXG59Y2F0Y2goZSl7cmV0dXJuIGouX2VycihlKTt9IjoiIik7dHJ5e3U9bmV3IEZ1bmN0aW9uKCJkYXRhLHZpZXcsaix1Iix1KX1jYXRjaChidCl7YygiQ29tcGlsZWQgdGVtcGxhdGUgY29kZTpcblxuIit1LGJ0KX1yZXR1cm4gaSYmKGkuZm49dSksdX1mdW5jdGlvbiBodChuLHQsaSl7ZnVuY3Rpb24gYihiLGssZCxnLG50LHR0LGl0LHJ0LHV0LGZ0LGV0LG90LGN0LGx0LGF0LHZ0LHl0LHB0LHd0LGJ0KXtmdW5jdGlvbiBkdChuLGkscixmLGUsbyxjLGwpe2lmKHImJih0JiYodT09PSJsaW5rVG8iJiYocz10Ll9qc3Z0bz10Ll9qc3Z0b3x8W10scy5wdXNoKG50KSksKCF1fHxoKSYmdC5wdXNoKG50LnNsaWNlKGkubGVuZ3RoKSkpLHIhPT0iLiIpKXt2YXIgYT0oZj8ndmlldy5obHAoIicrZisnIiknOmU/InZpZXciOiJkYXRhIikrKGw/KG8/Ii4iK286Zj8iIjplPyIiOiIuIityKSsoY3x8IiIpOihsPWY/IiI6ZT9vfHwiIjpyLCIiKSk7cmV0dXJuIGE9YSsobD8iLiIrbDoiIiksaSsoYS5zbGljZSgwLDkpPT09InZpZXcuZGF0YSI/YS5zbGljZSg1KTphKX1yZXR1cm4gbn12YXIga3Q7aWYodHQ9dHR8fCIiLGQ9ZHx8a3x8b3QsbnQ9bnR8fHV0LGZ0PWZ0fHx5dHx8IiIsIWl0fHxlfHxmKXJldHVybiB0JiZ2dCYmIWUmJiFmJiYoIXV8fGh8fHMpJiYoa3Q9dltyXSxidC5sZW5ndGgtMT53dC1rdCYmKGt0PWJ0LnNsaWNlKGt0LHd0KzEpLHZ0PXcrIjoiK2t0K28sdnQ9eVt2dF09eVt2dF18fHN0KHArdnQrYSxpLCEwKSx2dC5wYXRoc3x8aHQoa3QsdnQucGF0aHM9W10saSksKHN8fHQpLnB1c2goe19qc3ZPYjp2dH0pKSksZT8oZT0hY3QsZT9iOiciJyk6Zj8oZj0hbHQsZj9iOiciJyk6KGQ/KHIrKyx2W3JdPXd0KyssZCk6IiIpKyhwdD9yPyIiOnU/KHU9aD1zPSExLCJcYiIpOiIsIjpydD8ociYmYyhuKSx1PW50LGg9ZywiXGIiK250KyI6Iik6bnQ/bnQuc3BsaXQoIl4iKS5qb2luKCIuIikucmVwbGFjZShzaSxkdCkrKGZ0PyhsWysrcl09ITAsbnQuY2hhckF0KDApIT09Ii4iJiYodltyXT13dCksZnQpOnR0KTp0dD90dDphdD8obFtyLS1dPSExLGF0KSsoZnQ/KGxbKytyXT0hMCxmdCk6IiIpOmV0PyhsW3JdfHxjKG4pLCIsIik6az8iIjooZT1jdCxmPWx0LCciJykpO2Mobil9dmFyIHUscyxoLHk9aS5saW5rcyxsPXt9LHY9ezA6LTF9LHI9MCxmPSExLGU9ITE7cmV0dXJuKG4rIiAiKS5yZXBsYWNlKC9cKVxeL2csIikuIikucmVwbGFjZShoaSxiKX1mdW5jdGlvbiBsKG4sdCl7cmV0dXJuIG4mJm4hPT10P3Q/ZihmKHt9LHQpLG4pOm46dCYmZih7fSx0KX1mdW5jdGlvbiBlaShuKXtyZXR1cm4gd3Rbbl18fCh3dFtuXT0iJiMiK24uY2hhckNvZGVBdCgwKSsiOyIpfWZ1bmN0aW9uIGVyKG4pe3ZhciBpLHQscj1bXTtpZih0eXBlb2Ygbj09Im9iamVjdCIpZm9yKGkgaW4gbil0PW5baV0sdCYmdC50b0pTT04mJiF0LnRvSlNPTigpfHxhdCh0KXx8ci5wdXNoKHtrZXk6aSxwcm9wOm5baV19KTtyZXR1cm4gcn1pZigoIXR8fCF0LnZpZXdzKSYmIW4uanN2aWV3cyl7dmFyIHUsdHQseSx2dCx5dCxwPSJ7Iix3PSJ7IixvPSJ9IixhPSJ9IixnPSJeIixzaT0vXighKj8pKD86bnVsbHx0cnVlfGZhbHNlfFxkW1xkLl0qfChbXHckXSt8XC58fihbXHckXSspfCModmlld3woW1x3JF0rKSk/KShbXHckLl5dKj8pKD86Wy5bXl0oW1x3JF0rKVxdPyk/KSQvZyxoaT0vKFwoKSg/PVxzKlwoKXwoPzooWyhbXSlccyopPyg/OihcXj8pKCEqP1sjfl0/W1x3JC5eXSspP1xzKigoXCtcK3wtLSl8XCt8LXwmJnxcfFx8fD09PXwhPT18PT18IT18PD18Pj18Wzw+JSo6P1wvXXwoPSkpXHMqfCghKj9bI35dP1tcdyQuXl0rKShbKFtdKT8pfCgsXHMqKXwoXCg/KVxcPyg/OignKXwoIikpfCg/OlxzKigoWylcXV0pKD89XHMqXC58XHMqXF58XHMqJCl8WylcXV0pKFsoW10/KSl8KFxzKykvZyxpdD0vWyBcdF0qKFxyXG58XG58XHIpL2csY2k9L1xcKFsnIl0pL2csbGk9L1snIlxcXS9nLGFpPS9ceDA4KH4pPyhbXlx4MDhdKylceDA4L2csdmk9L15pZlxzLyx5aT0vPChcdyspWz5cc10vLHB0PS9bXHgwMGA+PCInJl0vZyxydD0vXm9uW0EtWl18XmNvbnZlcnQoQmFjayk/JC8scGk9cHQsd2k9MCxiaT0wLHd0PXsiJiI6IiZhbXA7IiwiPCI6IiZsdDsiLCI+IjoiJmd0OyIsIlx4MDAiOiImIzA7IiwiJyI6IiYjMzk7IiwnIic6IiYjMzQ7IiwiYCI6IiYjOTY7In0sYj0iaHRtbCIsYnQ9ImRhdGEtanN2LXRtcGwiLHV0PXt9LGs9e3RlbXBsYXRlOntjb21waWxlOnJpfSx0YWc6e2NvbXBpbGU6dXJ9LGhlbHBlcjp7fSxjb252ZXJ0ZXI6e319LHI9e2pzdmlld3M6InYxLjAuMC1iZXRhIixyZW5kZXI6dXQsc2V0dGluZ3M6ZnVuY3Rpb24obil7ZihlLG4pO2R0KGUuX2RiZ01vZGUpO2UuanN2JiZlLmpzdigpfSxzdWI6e1ZpZXc6bnQsRXJyOmZ0LHRtcGxGbjpzdCxjdnQ6ZXQscGFyc2U6aHQsZXh0ZW5kOmYsZXJyOnYsc3ludGF4RXJyOmMsaXNGbjpmdW5jdGlvbihuKXtyZXR1cm4gdHlwZW9mIG49PSJmdW5jdGlvbiJ9LERhdGFNYXA6Z3R9LF9jbnZ0Om5yLF90YWc6aXIsX2VycjpmdW5jdGlvbihuKXtyZXR1cm4gZS5fZGJnTW9kZT8iRXJyb3I6ICIrKG4ubWVzc2FnZXx8bikrIi4gIjoiIn19OyhmdC5wcm90b3R5cGU9bmV3IEVycm9yKS5jb25zdHJ1Y3Rvcj1mdDt0aS5kZXBlbmRzPWZ1bmN0aW9uKCl7cmV0dXJuW3RoaXMuZ2V0KCJpdGVtIiksImluZGV4Il19O2lpLmRlcGVuZHM9ZnVuY3Rpb24oKXtyZXR1cm5bImluZGV4Il19O2Zvcih0dCBpbiBrKWZyKHR0LGtbdHRdKTt2YXIgY3Qscz1yLnRlbXBsYXRlcyxsdD1yLmNvbnZlcnRlcnMsb2k9ci5oZWxwZXJzLGQ9ci50YWdzLGg9ci5zdWIsYXQ9aC5pc0ZuLGU9ci5zZXR0aW5nczt0Pyh1PXQsdS5mbi5yZW5kZXI9b3QsKGN0PXUub2JzZXJ2YWJsZSkmJihmKGgsY3Quc3ViKSxkZWxldGUgY3Quc3ViKSk6KHU9bi5qc3ZpZXdzPXt9LHUuaXNBcnJheT1BcnJheSYmQXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24obil7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChuKT09PSJbb2JqZWN0IEFycmF5XSJ9KTt1LnJlbmRlcj11dDt1LnZpZXdzPXI7dS50ZW1wbGF0ZXM9cz1yLnRlbXBsYXRlcztlKHtkZWJ1Z01vZGU6ZHQsZGVsaW1pdGVyczpuaSxfZGJnTW9kZTohMCx0cnlDYXRjaDohMH0pO2QoeyJlbHNlIjpmdW5jdGlvbigpe30sImlmIjp7cmVuZGVyOmZ1bmN0aW9uKG4pe3ZhciB0PXRoaXM7cmV0dXJuIHQucmVuZGVyaW5nLmRvbmV8fCFuJiYoYXJndW1lbnRzLmxlbmd0aHx8IXQudGFnQ3R4LmluZGV4KT8iIjoodC5yZW5kZXJpbmcuZG9uZT0hMCx0LnNlbGVjdGVkPXQudGFnQ3R4LmluZGV4LHQudGFnQ3R4LnJlbmRlcih0LnRhZ0N0eC52aWV3LCEwKSl9LG9uVXBkYXRlOmZ1bmN0aW9uKG4sdCxpKXtmb3IodmFyIHIsZix1PTA7KHI9dGhpcy50YWdDdHhzW3VdKSYmci5hcmdzLmxlbmd0aDt1KyspaWYocj1yLmFyZ3NbMF0sZj0hciE9IWlbdV0uYXJnc1swXSwhdGhpcy5jb252ZXJ0JiYhIXJ8fGYpcmV0dXJuIGY7cmV0dXJuITF9LGZsb3c6ITB9LCJmb3IiOntyZW5kZXI6ZnVuY3Rpb24obil7dmFyIGYsdD10aGlzLHI9dC50YWdDdHgsZT0iIixvPTA7cmV0dXJuIHQucmVuZGVyaW5nLmRvbmV8fCgoZj0hYXJndW1lbnRzLmxlbmd0aCkmJihuPXIudmlldy5kYXRhKSxuIT09aSYmKGUrPXIucmVuZGVyKG4sZiksbys9dS5pc0FycmF5KG4pP24ubGVuZ3RoOjEpLCh0LnJlbmRlcmluZy5kb25lPW8pJiYodC5zZWxlY3RlZD1yLmluZGV4KSksZX0sZmxvdzohMCxhdXRvQmluZDohMH0saW5jbHVkZTp7ZmxvdzohMCxhdXRvQmluZDohMH0sIioiOntyZW5kZXI6a3QsZmxvdzohMH19KTtkKHtwcm9wczpmKGYoe30sZFsiZm9yIl0pLGd0KGVyKSl9KTtkLnByb3BzLmF1dG9CaW5kPSEwO2x0KHtodG1sOmZ1bmN0aW9uKG4pe3JldHVybiBuIT1pP1N0cmluZyhuKS5yZXBsYWNlKHBpLGVpKToiIn0sYXR0cjpmdW5jdGlvbihuKXtyZXR1cm4gbiE9aT9TdHJpbmcobikucmVwbGFjZShwdCxlaSk6bj09PW51bGw/bjoiIn0sdXJsOmZ1bmN0aW9uKG4pe3JldHVybiBuIT1pP2VuY29kZVVSSShTdHJpbmcobikpOm49PT1udWxsP246IiJ9fSk7bmkoKX19KSh0aGlzLHRoaXMualF1ZXJ5KSxmdW5jdGlvbihuLHQsaSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGYobil7cmV0dXJuIHIobik/bmV3IGsobik6bmV3IGIobil9ZnVuY3Rpb24gYihuKXtyZXR1cm4gdGhpcy5fZGF0YT1uLHRoaXN9ZnVuY3Rpb24gayhuKXtyZXR1cm4gdGhpcy5fZGF0YT1uLHRoaXN9ZnVuY3Rpb24gY3Qobil7cmV0dXJuIHIobik/W25dOm59ZnVuY3Rpb24gcnQobix0KXtuPXIobik/bjpbbl07Zm9yKHZhciBpLGU9dCxvPWUsaD1uLmxlbmd0aCxmPVtdLHM9MDtzPGg7cysrKXtpZihpPW5bc10sdShpKSl7Zj1mLmNvbmNhdChydChpLmNhbGwodCx0KSx0KSk7Y29udGludWV9ZWxzZSBpZigiIitpIT09aSl7dD1vPWk7byE9PWUmJmYucHVzaChlPW8pO2NvbnRpbnVlfW8hPT1lJiZmLnB1c2goZT1vKTtmLnB1c2goaSl9cmV0dXJuIGZ9ZnVuY3Rpb24gdXQobix0KXt2YXIgcixpO2ZvcihyIGluIG4pe2k9ITA7YnJlYWt9aXx8ZGVsZXRlIHlbdF19ZnVuY3Rpb24gZChuLHQpe2lmKCEobi5kYXRhJiZuLmRhdGEub2ZmKSl7dmFyIHYseSxwLGY9dC5vbGRWYWx1ZSxvPXQudmFsdWUsdT1uLmRhdGEsaD11Lm9ic2VydmVBbGwsYz0hdS5jYi5ub0FycmF5LGE9dS5wYXRocztuLnR5cGU9PT1sPyh1LmNiLmFycmF5fHx1LmNiKS5jYWxsKHUsbix0KToodS5wcm9wPT09dC5wYXRofHx1LnByb3A9PT0iKiIpJiYoZj10eXBlb2YgZj09PXMmJihhWzBdfHxjJiZyKGYpKSYmZixvPXR5cGVvZihvPXQudmFsdWUpPT09cyYmKGFbMF18fGMmJnIobykpJiZvLGg/KHY9aC5fcGF0aCsiLiIrdC5wYXRoLHk9aC5maWx0ZXIscD1baC5wYXJlbnRzKCkuc2xpY2UoKV0sZiYmZShjLGgubnMsW2ZdLGEsdS5jYiwhMCx5LHAsdiksbyYmZShjLGgubnMsW29dLGEsdS5jYixpLHkscCx2KSk6KGYmJmUoYyxbZl0sYSx1LmNiLCEwKSxvJiZlKGMsW29dLGEsdS5jYikpLHUuY2Iobix0KSl9fWZ1bmN0aW9uIGEoKXtmdW5jdGlvbiBkdChpLHIsdSxmKXt2YXIgcyxlLHk9aXQobikscD1jdChuKTtpZihpPWF0P2krIi4iK2F0OmksZ3x8Zil5JiZ0KHApLm9mZihpLGQpO2Vsc2V7aWYobz15JiZ0Ll9kYXRhKG4pKWZvcihvPW8mJm8uZXZlbnRzLG89byYmb1t1P2w6Y10sa3Q9byYmby5sZW5ndGg7a3QtLTspaWYoKG50PW9ba3RdLmRhdGEpJiZudC5jYi5fY0lkPT09aC5fY0lkJiZudC5ucz09PWF0KXtpZih1KXJldHVybjsocj09PSIqIiYmbnQucHJvcCE9PXJ8fG50LnByb3A9PT12KSYmdChuKS5vZmYoaSxkKX1lPXU/e306e2Z1bGxQYXRoOmEscGF0aHM6cj9bcl06W10scHJvcDp2fTtlLm5zPWF0O2UuY2I9aDtsdCYmKGUub2JzZXJ2ZUFsbD17X3BhdGg6bHQscGF0aDpmdW5jdGlvbigpe3JldHVybiBzPWlpLmxlbmd0aCxsdC5yZXBsYWNlKC9bWy5dL2csZnVuY3Rpb24obil7cmV0dXJuIHMtLSxuPT09IlsiPyJbIit0LmluQXJyYXkoaWlbcy0xXSxpaVtzXSk6Ii4ifSl9LHBhcmVudHM6ZnVuY3Rpb24oKXtyZXR1cm4gaWl9LGZpbHRlcjplaSxuczphdH0pO3QocCkub24oaSxudWxsLGUsZCk7bmkmJihuaVt0LmRhdGEobiwib2JJZCIpfHx0LmRhdGEobiwib2JJZCIsaHQrKyldPW4pfX1mdW5jdGlvbiB2aShuLHQpe24uX29iPXl0KG4sZnQpO3ZhciBpPWZ0O3JldHVybiBmdW5jdGlvbih1LGYpe3ZhciBvPW4uX29iLGM9dC5sZW5ndGg7dHlwZW9mIG89PT1zJiYoZ3QobywhMCksKGN8fHZ0JiZyKG8pKSYmZSh2dCxbb10sdCxoLHl0LCEwKSk7bz1uLl9vYj15dChuLGkpO3R5cGVvZiBvPT09cyYmKGd0KG8pLChjfHx2dCYmcihvKSkmJmUodnQsW29dLHQsaCx5dCxbaV0pKTtoKHUsZil9fWZ1bmN0aW9uIGd0KHQsdSxlLG8pe2lmKHZ0KXt2YXIgcz1uLGM9bHQ7bj10O28mJihuPXRbb10sbHQrPSIuIitvLGVpJiYobj1mLl9mbHRyKG8sdCxsdCxlaSkpKTtuJiYoZXx8cihuKSkmJmR0KGwrIi5vYnNlcnZlIisoaD8iLm9icyIrKGJ0PWguX2NJZD1oLl9jSWR8fHcrKyk6IiIpLGksITAsdSk7bj1zO2x0PWN9fXZhciB3dCx1aSxvaSxldCx2LGEsZmksZyxoLGJ0LGt0LG50LG8seXQsc2ksbmksdGksaGksaWksbHQsZWksYXQsY2ksbGksdnQ9dGhpcyE9ITEsYWk9MSxyaT1zdCxiPUFycmF5LmFwcGx5KDAsYXJndW1lbnRzKSxrPWIucG9wKCksZnQ9Yi5zaGlmdCgpLHB0PWZ0LG49cHQsdHQ9Yi5sZW5ndGg7Zm9yKGZ0KyIiPT09ZnQmJnZ0JiYoYXQ9ZnQsZnQ9bj1wdD1iLnNoaWZ0KCksdHQtLSksdShrKT9oPWs6KGsrIiI9PT1rJiYobHQ9ayxpaT1iLnBvcCgpLGVpPWIucG9wKCksaz1iLnBvcCgpLHR0PXR0LTMpLGs9PT0hMD9nPWs6ayYmKGZ0PWssYWk9MCksaz1iW3R0LTFdLCh0dCYmaz09PWl8fHUoaykpJiYoaD1iLnBvcCgpLHR0LS0pKSx0dCYmdShiW3R0LTFdKSYmKHl0PWgsaD1iLnBvcCgpLHR0LS0pLHJpKz1nP2g/Ii5vYnMiK2guX2NJZDoiIjoiLm9icyIrKGJ0PWguX2NJZD1oLl9jSWR8fHcrKyksZ3x8KG5pPXlbYnRdPXlbYnRdfHx7fSksY2k9YXQmJmF0Lm1hdGNoKG90KXx8WyIiXSxsaT1jaS5sZW5ndGg7bGktLTspZm9yKGF0PWNpW2xpXSxyKHB0KT9ndChwdCxnLCEwKTpnJiZ0dD09PTAmJnB0JiZkdChyaSwiIiksdGk9MCx3dD0wO3d0PHR0O3d0KyspaWYoYT1iW3d0XSxhIT09IiIpe2lmKG49cHQsIiIrYT09PWEpe2lmKGV0PWEuc3BsaXQoIl4iKSxldFsxXSYmKHRpPWV0WzBdLnNwbGl0KCIuIikubGVuZ3RoLGE9ZXQuam9pbigiLiIpLHRpPWEuc3BsaXQoIi4iKS5sZW5ndGgtdGkpLHl0JiYoc2k9eXQoYSxwdCkpKXt0dCs9c2kubGVuZ3RoLTE7cC5hcHBseShiLFt3dC0tLDFdLmNvbmNhdChzaSkpO2NvbnRpbnVlfWV0PWEuc3BsaXQoIi4iKX1lbHNlIGFpJiYhdShhKSYmKGEuX2pzdk9iJiYoYS5fY2I9aGk9dmkoYSxiLnNsaWNlKHd0KzEpKSxoaS5ub0FycmF5PXZ0PT09ITEsaGkuX2NJZD1oLl9jSWQsZSh2dCxbZnRdLGIuc2xpY2UoMCx3dCksYS5fY2IseXQpLGE9YS5fb2IpLG49YSkscHQ9YSxldD1bcHRdO3doaWxlKG4mJih2PWV0LnNoaWZ0KCkpIT09aSlpZih0eXBlb2Ygbj09PXMpe2lmKCIiK3Y9PT12KXtpZih2PT09IiIpY29udGludWU7aWYoZXQubGVuZ3RoPHRpKzEmJiFuLm5vZGVUeXBlKXtpZighZyYmKG89aXQobikmJnQuX2RhdGEobikpKXtmb3Iobz1vLmV2ZW50cyxvPW8mJm9bY10sa3Q9byYmby5sZW5ndGgsb2k9MDtrdC0tOyludD1vW2t0XS5kYXRhLG50JiZudC5jYj09PWgmJm50Lm5zPT09YXQmJihudC5wcm9wPT09dnx8bnQucHJvcD09PSIqIikmJigodWk9ZXQuam9pbigiLiIpKSYmbnQucGF0aHMucHVzaCh1aSksb2krKyk7aWYob2kpe249blt2XTtjb250aW51ZX19aWYodj09PSIqIil7IWcmJm8mJm8ubGVuZ3RoJiZkdChyaSwiIiwhMSwhMCk7dShuKT8oZmk9bi5kZXBlbmRzKSYmZSh2dCxbZmldLGgsZ3x8ZnQpOmR0KHJpLCIiKTtmb3IodWkgaW4gbilndChuLGcsaSx1aSk7YnJlYWt9ZWxzZSB2JiZkdChyaSsiLiIrdixldC5qb2luKCIuIikpfWx0JiYobHQrPSIuIit2KTt2PW5bdl19aWYodSh2KSl7KGZpPXYuZGVwZW5kcykmJmUodnQsW25dLHJ0KGZpLG4pLGgseXQsZ3x8W2Z0XSk7YnJlYWt9bj12fWd0KG4sZyl9cmV0dXJuIGJ0JiZ1dChuaSxidCkse2NiSWQ6YnQsYm5kOm5pLGxlYWY6bn19ZnVuY3Rpb24gbHQoKXtyZXR1cm5bXS5wdXNoLmNhbGwoYXJndW1lbnRzLCEwKSxhLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiBlKCl7dmFyIG49W10uY29uY2F0LmFwcGx5KFtdLGFyZ3VtZW50cyk7cmV0dXJuIGEuYXBwbHkobi5zaGlmdCgpLG4pfWZ1bmN0aW9uIGZ0KG4sdCxpKXtyZXR1cm4gaS5pbmRleE9mKCIuIik8MCYmaS5pbmRleE9mKCJbIik8MCYmdFtuXX1mdW5jdGlvbiBhdChuLHIsdSxmLGUpe3JldHVybiBmPWZ8fGZ0LGU9ZXx8ZnQse2dldFRndDpuLG9ic1NyYzpyLG9ic1RndDp1LG1hcDpmdW5jdGlvbihpKXt2YXIgbz10aGlzLGgsYztyZXR1cm4gby5zcmMhPT1pJiYoby5zcmMmJm8udW5tYXAoKSx0eXBlb2YgaT09PXMmJihjPW4uYXBwbHkobyxhcmd1bWVudHMpLHQub2JzZXJ2YWJsZSYmKHQub2JzZXJ2YWJsZShpKS5vYnNlcnZlQWxsKG8ub2JzPWZ1bmN0aW9uKG4sdCl7IWgmJnImJihoPSEwLHIuY2FsbChvLGksYyxuLHQpLGg9ITEpfSxmKSx0Lm9ic2VydmFibGUoYykub2JzZXJ2ZUFsbChvLm9idD1mdW5jdGlvbihuLHQpeyFoJiZ1JiYoaD0hMCx1LmNhbGwobyxpLGMsbix0KSxoPSExKX0sZSkpLG8uc3JjPWksby50Z3Q9YykpLG99LHVubWFwOmZ1bmN0aW9uKCl7aWYodC5vYnNlcnZhYmxlKXt2YXIgbj10aGlzO24uc3JjJiYodC5vYnNlcnZhYmxlKG4uc3JjKS51bm9ic2VydmVBbGwobi5vYnMsZiksdC5vYnNlcnZhYmxlKG4udGd0KS51bm9ic2VydmVBbGwobi5vYnQsZSksbi5zcmM9bi50Z3Q9aSl9fX19ZnVuY3Rpb24gZyhuLHQsaSxyKXtuKyIiIT09biYmKGk9dCx0PW4sbj0iIik7dihuLHRoaXMuX2RhdGEsdCxpLFtdLCJyb290IixyKX1mdW5jdGlvbiBldChuLHQsaSl7Zy5jYWxsKHRoaXMsbix0LGksITApfWZ1bmN0aW9uIHYobix0LHUsZSxvLGgsYyl7ZnVuY3Rpb24gcCh0LGkpe2Zvcih5PXQubGVuZ3RoLGw9aCsiW10iO3ktLTspKGs9Zi5fZmx0cih5LHQsbCxlKSkmJnYobixrLHUsZXx8IiIsby5zbGljZSgpLGwsaSl9ZnVuY3Rpb24gZCh0LGkpe2g9dC5kYXRhLm9ic2VydmVBbGwuX3BhdGg7dmFyIHI9bztvWzBdIT09dC50YXJnZXQmJihvPW8uc2xpY2UoKSxvLnVuc2hpZnQodC50YXJnZXQpKTtzd2l0Y2goaS5jaGFuZ2Upe2Nhc2UiaW5zZXJ0IjpwKGkuaXRlbXMpO2JyZWFrO2Nhc2UicmVtb3ZlIjpwKGkuaXRlbXMsITApO2JyZWFrO2Nhc2UicmVmcmVzaCI6cChpLm9sZEl0ZW1zLCEwKTtwKHQudGFyZ2V0KTticmVhaztjYXNlInNldCI6bD1oKyIuIitpLnBhdGg7dihuLGkub2xkVmFsdWUsdSwwLG8uc2xpY2UoKSxsLCEwKTt2KG4saS52YWx1ZSx1LDAsby5zbGljZSgpLGwpfXUuYXBwbHkodGhpcyxhcmd1bWVudHMpO289cn12YXIgeSxiLGwsaztpZih0eXBlb2YgdD09PXMpaWYoYj1yKHQpPyIiOiIqIixvLnVuc2hpZnQodCksdT8oYnx8ZSE9PTApJiYoZC5fY0lkPXUuX2NJZD11Ll9jSWR8fHcrKyxhKG4sdCxiLGQsYyxlLG8uc2xpY2UoKSxoKSk6YShuLHQsYixpLGMsZSxvLnNsaWNlKCksaCksYilmb3IoeSBpbiB0KXkuY2hhckF0KDApIT09Il8iJiZ5IT09dHQmJihsPWgrIi4iK3ksKGs9Zi5fZmx0cih5LHQsbCxlKSkmJnYobixrLHUsZXx8MCxvLnNsaWNlKCksbCxjKSk7ZWxzZSBwKHQsYyl9aWYoIXQpdGhyb3cianNWaWV3cy9qc09ic2VydmFibGUgcmVxdWlyZSBqUXVlcnkiO2lmKCF0Lm9ic2VydmFibGUpe3ZhciBudD10LmV2ZW50LnNwZWNpYWwsbz10LnZpZXdzP3Qudmlld3Muc3ViOmYuc3ViPXt9LHA9W10uc3BsaWNlLHI9dC5pc0FycmF5LHR0PXQuZXhwYW5kbyxzPSJvYmplY3QiLGg9cGFyc2VJbnQsb3Q9L1xTKy9nLGM9by5wcm9wQ2huZz1vLnByb3BDaG5nfHwicHJvcGVydHlDaGFuZ2UiLGw9by5hcnJDaG5nPW8uYXJyQ2huZ3x8ImFycmF5Q2hhbmdlIix5PW8uX2NiQm5kcz1vLl9jYkJuZHN8fHt9LHN0PWMrIi5vYnNlcnZlIix1PW8uaXNGbixodD0xLHc9MSxpdD10Lmhhc0RhdGE7by5nZXREZXBzPWZ1bmN0aW9uKCl7dmFyIG49YXJndW1lbnRzO3JldHVybiBmdW5jdGlvbigpe2Zvcih2YXIgaSx0LHI9W10sZj1uLmxlbmd0aDtmLS07KWk9bltmLS1dLHQ9bltmXSx0JiYocj1yLmNvbmNhdCh1KHQpP3QoaSxpKTp0KSk7cmV0dXJuIHJ9fTtvLkRhdGFNYXA9YXQ7dC5vYnNlcnZhYmxlPWY7Zi5fZmx0cj1mdW5jdGlvbihuLHQsaSxyKXt2YXIgZj1yJiZ1KHIpP3Iobix0LGkpOnRbbl07cmV0dXJuIGYmJihmPXUoZik/Zi5zZXQmJmYuY2FsbCh0KTpmKSx0eXBlb2YgZj09PXMmJmZ9O2YuT2JqZWN0PWI7Zi5BcnJheT1rO3Qub2JzZXJ2ZT1mLm9ic2VydmU9YTt0LnVub2JzZXJ2ZT1mLnVub2JzZXJ2ZT1sdDtmLl9hcHBseT1lO2IucHJvdG90eXBlPXtfZGF0YTpudWxsLG9ic2VydmVBbGw6Zyx1bm9ic2VydmVBbGw6ZXQsZGF0YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9kYXRhfSxzZXRQcm9wZXJ0eTpmdW5jdGlvbihuLHQsdSl7dmFyIGYsaCxzLGU9dGhpcyxvPWUuX2RhdGE7aWYobj1ufHwiIixvKWlmKHIobikpZm9yKGY9bi5sZW5ndGg7Zi0tOyloPW5bZl0sZS5zZXRQcm9wZXJ0eShoLm5hbWUsaC52YWx1ZSx1PT09aXx8dSk7ZWxzZSBpZigiIituIT09bilmb3IoZiBpbiBuKWUuc2V0UHJvcGVydHkoZixuW2ZdLHQpO2Vsc2UgaWYobiE9PXR0KXtmb3Iocz1uLnNwbGl0KCIuIik7byYmcy5sZW5ndGg+MTspbz1vW3Muc2hpZnQoKV07ZS5fc2V0UHJvcGVydHkobyxzLmpvaW4oIi4iKSx0LHUpfXJldHVybiBlfSxfc2V0UHJvcGVydHk6ZnVuY3Rpb24obix0LGkscil7dmFyIGUsbyxmPXQ/blt0XTpuO3UoZikmJmYuc2V0JiYobz1mLGU9Zi5zZXQ9PT0hMD9mOmYuc2V0LGY9Zi5jYWxsKG4pKTsoZiE9PWl8fHImJmYhPWkpJiYoIShmIGluc3RhbmNlb2YgRGF0ZSl8fGY+aXx8ZjxpKSYmKGU/KGUuY2FsbChuLGkpLGk9by5jYWxsKG4pKTp0JiYoblt0XT1pKSx0aGlzLl90cmlnZ2VyKG4se2NoYW5nZToic2V0IixwYXRoOnQsdmFsdWU6aSxvbGRWYWx1ZTpmfSkpfSxfdHJpZ2dlcjpmdW5jdGlvbihuLGkpe3QobikudHJpZ2dlckhhbmRsZXIoYyxpKX19O2sucHJvdG90eXBlPXtfZGF0YTpudWxsLG9ic2VydmVBbGw6Zyx1bm9ic2VydmVBbGw6ZXQsZGF0YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9kYXRhfSxpbnNlcnQ6ZnVuY3Rpb24obix0KXt2YXIgaT10aGlzLl9kYXRhO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPT09MSYmKHQ9bixuPWkubGVuZ3RoKSxuPWgobiksbj4tMSYmbjw9aS5sZW5ndGgmJih0PXIodCk/dDpbdF0sdC5sZW5ndGgmJnRoaXMuX2luc2VydChuLHQpKSx0aGlzfSxfaW5zZXJ0OmZ1bmN0aW9uKG4sdCl7dmFyIGk9dGhpcy5fZGF0YSxyPWkubGVuZ3RoO3AuYXBwbHkoaSxbbiwwXS5jb25jYXQodCkpO3RoaXMuX3RyaWdnZXIoe2NoYW5nZToiaW5zZXJ0IixpbmRleDpuLGl0ZW1zOnR9LHIpfSxyZW1vdmU6ZnVuY3Rpb24obix0KXt2YXIgcix1PXRoaXMuX2RhdGE7cmV0dXJuIG49PT1pJiYobj11Lmxlbmd0aC0xKSxuPWgobiksdD10P2godCk6dD09PTA/MDoxLHQ+LTEmJm4+LTEmJihyPXUuc2xpY2UobixuK3QpLHQ9ci5sZW5ndGgsdCYmdGhpcy5fcmVtb3ZlKG4sdCxyKSksdGhpc30sX3JlbW92ZTpmdW5jdGlvbihuLHQsaSl7dmFyIHI9dGhpcy5fZGF0YSx1PXIubGVuZ3RoO3Iuc3BsaWNlKG4sdCk7dGhpcy5fdHJpZ2dlcih7Y2hhbmdlOiJyZW1vdmUiLGluZGV4Om4saXRlbXM6aX0sdSl9LG1vdmU6ZnVuY3Rpb24obix0LGkpe2lmKGk9aT9oKGkpOmk9PT0wPzA6MSxuPWgobiksdD1oKHQpLGk+MCYmbj4tMSYmdD4tMSYmbiE9PXQpe3ZhciByPXRoaXMuX2RhdGEuc2xpY2UobixuK2kpO2k9ci5sZW5ndGg7aSYmdGhpcy5fbW92ZShuLHQsaSxyKX1yZXR1cm4gdGhpc30sX21vdmU6ZnVuY3Rpb24obix0LGkscil7dmFyIHU9dGhpcy5fZGF0YSxmPXUubGVuZ3RoO3Uuc3BsaWNlKG4saSk7dS5zcGxpY2UuYXBwbHkodSxbdCwwXS5jb25jYXQocikpO3RoaXMuX3RyaWdnZXIoe2NoYW5nZToibW92ZSIsb2xkSW5kZXg6bixpbmRleDp0LGl0ZW1zOnJ9LGYpfSxyZWZyZXNoOmZ1bmN0aW9uKG4pe3ZhciB0PXRoaXMuX2RhdGEuc2xpY2UoKTtyZXR1cm4gdGhpcy5fcmVmcmVzaCh0LG4pLHRoaXN9LF9yZWZyZXNoOmZ1bmN0aW9uKG4sdCl7dmFyIGk9dGhpcy5fZGF0YSxyPWkubGVuZ3RoO3AuYXBwbHkoaSxbMCxpLmxlbmd0aF0uY29uY2F0KHQpKTt0aGlzLl90cmlnZ2VyKHtjaGFuZ2U6InJlZnJlc2giLG9sZEl0ZW1zOm59LHIpfSxfdHJpZ2dlcjpmdW5jdGlvbihuLGkpe3ZhciByPXRoaXMuX2RhdGEsdT1yLmxlbmd0aCxmPXQoW3JdKTtmLnRyaWdnZXJIYW5kbGVyKGwsbik7dSE9PWkmJmYudHJpZ2dlckhhbmRsZXIoYyx7Y2hhbmdlOiJzZXQiLHBhdGg6Imxlbmd0aCIsdmFsdWU6dSxvbGRWYWx1ZTppfSl9fTtudFtjXT1udFtsXT17cmVtb3ZlOmZ1bmN0aW9uKG4pe3ZhciByLHUsZixlLG8saT1uLmRhdGE7aWYoaSYmKGkub2ZmPTEsaT1pLmNiKSYmKHI9eVtpLl9jSWRdKSl7Zm9yKGY9dC5fZGF0YSh0aGlzKS5ldmVudHNbbi50eXBlXSxlPWYubGVuZ3RoO2UtLSYmIXU7KXU9KG89ZltlXS5kYXRhKSYmby5jYj09PWk7dXx8KGRlbGV0ZSByW3QuZGF0YSh0aGlzLCJvYklkIildLHV0KHIsaS5fY0lkKSl9fX19fSh0aGlzLHRoaXMualF1ZXJ5KSxmdW5jdGlvbihuLHQsaSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHNyKG4pe3ZhciB0PXRoaXMubGlua2VkRWxlbTt0JiZldCh7dGFyZ2V0OnRbMF19LG4pfWZ1bmN0aW9uIGV0KG4scil7dmFyIHAsbnQsaCxmLHcsbCxlLGIsbyxhLHR0LGssZyx1LHMsdix5PW4udGFyZ2V0LGl0PXkuX2pzdkJuZCx1dD0vJihcZCspXCs/L2c7aWYoaXQpd2hpbGUoYT11dC5leGVjKGl0KSlpZigoYT1jW2FbMV1dKSYmKHM9YS50bykpe2lmKGY9YS5saW5rQ3R4LG89Zi52aWV3LHU9Zi50YWcsYj10KHkpLGs9by5obHAod3QpLGc9by5obHAoYnQpLGg9b3QoeSkscD1ndFtoXSxyPT09aSYmKHI9cnQoaCk/aCh5KTpwP2JbcF0oKTpiLmF0dHIoaCkpLGw9c1sxXSxzPXNbMF0sbCYmKHc9cnQobCk/bDpvLmdldFJzYygiY29udmVydGVycyIsbCkpLHcmJihyPXcuY2FsbCh1LHIpKSx0dD1vLmxpbmtDdHgsby5saW5rQ3R4PWYsdj17Y2hhbmdlOiJjaGFuZ2UiLG9sZFZhbHVlOmYuX3ZhbCx2YWx1ZTpyfSwoIWt8fCEobnQ9ay5jYWxsKGYsbix2KT09PSExKSkmJighdXx8IXUub25CZWZvcmVDaGFuZ2V8fCEobnQ9dS5vbkJlZm9yZUNoYW5nZShuLHYpPT09ITEpKSYmciE9PWkmJihlPXNbMF0sciE9PWkmJmUpKXtpZihlPWUuX2pzdk9iP2UuX29iOmUsdSYmKHUuXy5jaGdpbmc9ITApLGQoZSkuc2V0UHJvcGVydHkoc1syXXx8c1sxXSxyKSxnJiZnLmNhbGwoZixuLHYpLHUpe2lmKHUub25BZnRlckNoYW5nZSl1Lm9uQWZ0ZXJDaGFuZ2Uobix2KTtkZWxldGUgdS5fLmNoZ2luZ31mLl92YWw9cn1vLmxpbmtDdHg9dHR9fWZ1bmN0aW9uIHl1KG4sdCx1KXt2YXIgYyxzLGYsZT10aGlzLHk9ZS5kYXRhLGE9ZS5lbGVtLGw9ZS5jb252ZXJ0LHA9YS5wYXJlbnROb2RlLGI9cCxvPWUudmlldyxrPW8uY3R4LHc9by5saW5rQ3R4LHY9by5obHAod3QpO2lmKG8ubGlua0N0eD1lLHAmJighdnx8ISh0JiZ2LmNhbGwoZSxuLHQpPT09ITEpKSYmISh0JiZuLmRhdGEucHJvcCE9PSIqIiYmbi5kYXRhLnByb3AhPT10LnBhdGgpKXtpZih0JiYoZS5ldmVudEFyZ3M9dCksdHx8ZS5faW5pdFZhbCl7aWYoZGVsZXRlIGUuX2luaXRWYWwscz11LmNhbGwoby50bXBsLHksbyxyKSxjPXB1KHMsZSxmLGUuYXR0cnx8b3QoYSwhMCxsIT09aSkpLGY9ZS50YWcpe2lmKHQmJmYub25VcGRhdGUmJmYub25VcGRhdGUobix0LHM9c1swXT9zOltzXSk9PT0hMXx8Yz09PSJub25lIil7Zi50YWdDdHhzPXM7Zi50YWdDdHg9c1swXTtjPT09aCYmZi5vbkJlZm9yZUxpbmsmJmYub25CZWZvcmVMaW5rKCk7Y3QoZixmLnRhZ0N0eCk7b2koZSx5LGEpO28ubGlua0N0eD13O3JldHVybn1pZihmLl8uY2hnaW5nKXJldHVybjtzPWYudGFnTmFtZS5zbGljZSgtMSk9PT0iOiI/ci5fY252dChmLnRhZ05hbWUuc2xpY2UoMCwtMSksbyxzKTpyLl90YWcoZixvLG8udG1wbCxzLCEwKX1lbHNlIHUuX2N0eHMmJihsPWw9PT0iIj8idHJ1ZSI6bCxzPWw/ci5fY252dChsLG8scyk6ci5fdGFnKHUuX2N0eHMsbyxvLnRtcGwscywhMCksZj1vLl8udGFnLGM9ZS5hdHRyfHxjKTtocihzLGUsYyxmKSYmdCYmKHY9by5obHAoYnQpKSYmdi5jYWxsKGUsbix0KX1mJiYoZi5jb250ZW50cz1jaSxmLm5vZGVzPWxpLGYuY2hpbGRUYWdzPWFpLGYuY3VycmVudEN0eHM9d3IsZi51cGRhdGU9c3IsZi5yZWZyZXNoPWtyLGN0KGYsZi50YWdDdHgpKTtvaShlLHksYSk7by5saW5rQ3R4PXd9fWZ1bmN0aW9uIHB1KG4scix1LGYpe3ZhciBlLGgsYyxvLHM9dSYmdS5wYXJlbnRFbGVtfHxyLmVsZW07aWYobiE9PWkpe2lmKG89dChzKSxmPXUmJnUuYXR0cnx8ZixydChuKSYmaXQoci5leHByKyI6IG1pc3NpbmcgcGFyZW5zIiksZj09PSJ2aXNpYmxlIiYmKGY9ImNzcy1kaXNwbGF5IiksYz0vXmNzcy0vLnRlc3QoZikmJmYuc2xpY2UoNCkpZT10LnN0eWxlKHMsYyksK249PT1uJiYoZT1wYXJzZUludChlKSksZT10LnN0eWxlKHMsYyk7ZWxzZSBpZihmIT09ImxpbmsiKXtpZihmPT09InZhbHVlIilzLnR5cGU9PT1rdCYmKGU9by5wcm9wKGY9cCkpO2Vsc2UgaWYoZj09PWZ0KWlmKHMudmFsdWU9PT0iIituKWU9by5wcm9wKHApO2Vsc2UgcmV0dXJuIGY7ZT09PWkmJihoPWd0W2ZdLGU9aD9vW2hdKCk6by5hdHRyKGYpKX1yLl92YWw9ZX1yZXR1cm4gZn1mdW5jdGlvbiBocihuLHIsdSxmKXt2YXIgdHQsbyxjLGssaXQsdyxhLGIsdix5LGQ9biE9PWkscnQ9ci5kYXRhLGU9ZiYmZi5wYXJlbnRFbGVtfHxyLmVsZW0sZz10KGUpLHM9ci52aWV3LG50PXIuX3ZhbCx1dD1zLmN0eCxldD1zLmxpbmtDdHgsbD1mfHx1PT09aDtpZihmJiYoZi5wYXJlbnRFbGVtPWYucGFyZW50RWxlbXx8ci5leHByfHxmLl9lbENudD9lOmUucGFyZW50Tm9kZSxvPWYuX3BydixjPWYuX254dCksIWQpe3U9PT1oJiZmJiZmLm9uQmVmb3JlTGluayYmZi5vbkJlZm9yZUxpbmsoKTtyZXR1cm59aWYoL15jc3MtLy50ZXN0KHUpKXIuYXR0cj09PSJ2aXNpYmxlIiYmKG49bj93dShlKToibm9uZSIpLChsPWx8fG50IT09bikmJnQuc3R5bGUoZSx1LnNsaWNlKDQpLG4pO2Vsc2UgaWYodSE9PSJsaW5rIil7aWYodT09PXApdz0xLG49biYmbiE9PSJmYWxzZSI7ZWxzZSBpZih1PT09ZnQpaWYoZS52YWx1ZT09PSIiK24pbj0hMCx3PTEsdT1wO2Vsc2V7b2kocixydCxlKTtyZXR1cm59ZWxzZSh1PT09InNlbGVjdGVkInx8dT09PSJkaXNhYmxlZCJ8fHU9PT0ibXVsdGlwbGUifHx1PT09InJlYWRvbmx5IikmJihuPW4mJm4hPT0iZmFsc2UiP3U6bnVsbCk7KHR0PWd0W3VdKT91PT09aD8ocy5saW5rQ3R4PXIscy5jdHg9ci5jdHgsZiYmZi5fLmlubGluZT8oaXQ9Zi5ub2RlcyghMCksZi5fZWxDbnQmJihvJiZvIT09Yz9waShvLGMsZSxmLl90Z0lkLCJeIiwhMCk6KGE9ZS5fZGZyKSYmKGI9Zi5fdGdJZCsiXiIsdj1hLmluZGV4T2YoIiMiK2IpKzEseT1hLmluZGV4T2YoIi8iK2IpLHYmJnk+MCYmKHYrPWIubGVuZ3RoLHk+diYmKGUuX2Rmcj1hLnNsaWNlKDAsdikrYS5zbGljZSh5KSxncihhLnNsaWNlKHYseSkpKSkpLG89bz9vLnByZXZpb3VzU2libGluZzpjP2MucHJldmlvdXNTaWJsaW5nOmUubGFzdENoaWxkKSx0KGl0KS5yZW1vdmUoKSxmJiZmLm9uQmVmb3JlTGluayYmZi5vbkJlZm9yZUxpbmsoKSxrPXMubGluayhzLmRhdGEsZSxvLGMsbixmJiZ7dGFnOmYuX3RnSWQsbGF6eUxpbms6Zi50YWdDdHgucHJvcHMubGF6eUxpbmt9KSk6KGQmJmcuZW1wdHkoKSxmJiZmLm9uQmVmb3JlTGluayYmZi5vbkJlZm9yZUxpbmsoKSxkJiYoaz1zLmxpbmsocnQsZSxvLGMsbixmJiZ7dGFnOmYuX3RnSWR9KSkpLHMubGlua0N0eD1ldCxzLmN0eD11dCk6KGw9bHx8bnQhPT1uKSYmKHU9PT0idGV4dCImJmUuY2hpbGRyZW4mJiFlLmNoaWxkcmVuWzBdP2UudGV4dENvbnRlbnQhPT1pP2UudGV4dENvbnRlbnQ9bjplLmlubmVyVGV4dD1uPT09bnVsbD8iIjpuOmdbdHRdKG4pKToobD1sfHxudCE9PW4pJiZnW3c/InByb3AiOiJhdHRyIl0odSxuPT09aSYmIXc/bnVsbDpuKTtyLl92YWw9bn1yZXR1cm4ga3x8bH1mdW5jdGlvbiBjcihuLHQpe3ZhciBpPXRoaXMscj1pLmhscCh3dCksdT1pLmhscChidCk7aWYoIXJ8fHIuY2FsbCh0aGlzLG4sdCkhPT0hMSl7aWYodCl7dmFyIG89dC5jaGFuZ2UsZj10LmluZGV4LGU9dC5pdGVtcztzd2l0Y2gobyl7Y2FzZSJpbnNlcnQiOmkuYWRkVmlld3MoZixlKTticmVhaztjYXNlInJlbW92ZSI6aS5yZW1vdmVWaWV3cyhmLGUubGVuZ3RoKTticmVhaztjYXNlIm1vdmUiOmkucmVmcmVzaCgpO2JyZWFrO2Nhc2UicmVmcmVzaCI6aS5yZWZyZXNoKCl9fXUmJnUuY2FsbCh0aGlzLG4sdCl9fWZ1bmN0aW9uIHd1KHQpe3ZhciBpLHUsZj1uLmdldENvbXB1dGVkU3R5bGUscj0odC5jdXJyZW50U3R5bGV8fGYuY2FsbChuLHQsIiIpKS5kaXNwbGF5O3JldHVybiByIT09Im5vbmUifHwocj1mclt1PXQubm9kZU5hbWVdKXx8KGk9ZS5jcmVhdGVFbGVtZW50KHUpLGUuYm9keS5hcHBlbmRDaGlsZChpKSxyPShmP2YuY2FsbChuLGksIiIpOmkuY3VycmVudFN0eWxlKS5kaXNwbGF5LGZyW3VdPXIsZS5ib2R5LnJlbW92ZUNoaWxkKGkpKSxyfWZ1bmN0aW9uIGZpKG4pe3ZhciBmLGUsdT1uLmRhdGEscj1uLl8uYm5kO2lmKCFuLl8udXNlS2V5JiZyKWlmKChlPW4uXy5ibmRBcnIpJiYodChbZVsxXV0pLm9mZihwdCxlWzBdKSxuLl8uYm5kQXJyPWkpLHIhPT0hIXImJnIuXy5pbmxpbmUpdT9yLl8uYXJyVndzW24uXy5pZF09bjpkZWxldGUgci5fLmFyclZ3c1tuLl8uaWRdO2Vsc2UgaWYodSl7Zj1mdW5jdGlvbih0KXt0LmRhdGEmJnQuZGF0YS5vZmZ8fGNyLmFwcGx5KG4sYXJndW1lbnRzKX07dChbdV0pLm9uKHB0LGYpO24uXy5ibmRBcnI9W2YsdV19fWZ1bmN0aW9uIG90KG4sdCxpKXt2YXIgdT1uLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkscj1mLm1lcmdlW3VdfHxuLmNvbnRlbnRFZGl0YWJsZT09PSJ0cnVlIiYme3RvOmgsZnJvbTpofTtyZXR1cm4gcj90P3U9PT0iaW5wdXQiJiZuLnR5cGU9PT1mdD9mdDpyLnRvOnIuZnJvbTp0P2k/InRleHQiOmg6IiJ9ZnVuY3Rpb24gbHIobixyLHUsZixlLG8scyl7dmFyIHAsYyx2LHcsYixsPW4ucGFyZW50RWxlbSxoPW4uX3BydixhPW4uX254dCx5PW4uX2VsQ250O2lmKGgmJmgucGFyZW50Tm9kZSE9PWwmJml0KCJNaXNzaW5nIHBhcmVudE5vZGUiKSxzKXt3PW4ubm9kZXMoKTt5JiZoJiZoIT09YSYmcGkoaCxhLGwsbi5fLmlkLCJfIiwhMCk7bi5yZW1vdmVWaWV3cyhpLGksITApO2M9YTt5JiYoaD1oP2gucHJldmlvdXNTaWJsaW5nOmE/YS5wcmV2aW91c1NpYmxpbmc6bC5sYXN0Q2hpbGQpO3QodykucmVtb3ZlKCk7Zm9yKGIgaW4gbi5fLmJuZHMpbHQoYil9ZWxzZXtpZihyKXtpZih2PWZbci0xXSwhdilyZXR1cm4hMTtoPXYuX254dH15PyhjPWgsaD1jP2MucHJldmlvdXNTaWJsaW5nOmwubGFzdENoaWxkKTpjPWgubmV4dFNpYmxpbmd9cD11LnJlbmRlcihlLG8sbi5fLnVzZUtleSYmcyxuLHN8fHIsITApO24ubGluayhlLGwsaCxjLHAsdil9ZnVuY3Rpb24gZWkobix0LHIpe3ZhciB1LGYsZTtyZXR1cm4gcj8oZT0iXmAiLGY9dC5fLnRhZ3x8e186e2lubGluZTohMCxibmQ6cn0sdGFnQ3R4Ont2aWV3OnR9LGZsb3c6ITB9LHU9Zi5fdGdJZCx1fHwoY1t1PWVyKytdPWYsZi5fdGdJZD0iIit1KSk6KGU9Il9gIix5W3U9dC5fLmlkXT10KSwiIyIrdStlKyhuPT09aT8iIjpuKSsiLyIrdStlfWZ1bmN0aW9uIG9pKG4sdCxyKXt2YXIgZSxsLGYsdT1uLnRhZyxhPW4uY29udmVydEJhY2ssbz1bXSxoPW4uX2JuZElkfHwiIitlcisrLHY9bi5faGRscjtpZihkZWxldGUgbi5fYm5kSWQsdSYmKG89dS5kZXBlbmRzfHxvLG89cnQobyk/dS5kZXBlbmRzKHUpOm8sZj11LmxpbmtlZEVsZW0pLCghbi5fZGVwZW5kc3x8IiIrbi5fZGVwZW5kcyE9IiIrbykmJihuLl9kZXBlbmRzJiZkLl9hcHBseSghMSxbdF0sbi5fZGVwZW5kcyx2LCEwKSxlPWQuX2FwcGx5KCExLFt0XSxuLmZuLnBhdGhzLG8sdixuLl9jdHhDYiksZS5lbGVtPXIsZS5saW5rQ3R4PW4sZS5fdGdJZD1oLHIuX2pzdkJuZD1yLl9qc3ZCbmR8fCIiLHIuX2pzdkJuZCs9IiYiK2gsbi5fZGVwZW5kcz1vLG4udmlldy5fLmJuZHNbaF09aCxjW2hdPWUsZiYmKGUudG89W1tdLGFdKSwoZnx8YSE9PWkpJiZicihlLHUmJnUuY29udmVydEJhY2t8fGEpLHUpKXtpZih1Lm9uQWZ0ZXJCaW5kKXUub25BZnRlckJpbmQoZSk7dS5mbG93fHx1Ll8uaW5saW5lfHwoci5zZXRBdHRyaWJ1dGUocywoci5nZXRBdHRyaWJ1dGUocyl8fCIiKSsiIyIraCsiXi8iK2grIl4iKSx1Ll90Z0lkPSIiK2gpfWlmKGYmJmZbMF0pZm9yKHUuXy5yYWRpbyYmKGY9Zi5jaGlsZHJlbigiaW5wdXRbdHlwZT1yYWRpb10iKSksbD1mLmxlbmd0aDtsLS07KWZbbF0uX2pzdkJuZD1mW2xdLl9qc3ZCbmR8fHIuX2pzdkJuZCsiKyIsZltsXS5fanN2TG5rZEVsPXV9ZnVuY3Rpb24gYXIobix0LGkscix1LGYsZSl7cmV0dXJuIHNpKHRoaXMsbix0LGkscix1LGYsZSl9ZnVuY3Rpb24gc2kobixyLHUsbyxzLGgsYyxhKXtpZihuJiZyKXtpZihyPXIuanF1ZXJ5P3I6dChyKSwhdyl7dz1lLmJvZHk7dCh3KS5vbihucixldCkub24oImJsdXIiLCJbY29udGVudGVkaXRhYmxlXSIsZnVuY3Rpb24obil7dmFyIHQ9Zi5ub1ZhbGlkYXRlO2Yubm9WYWxpZGF0ZT0hMDtldChuKTtmLm5vVmFsaWRhdGU9dH0pfWZvcih2YXIgayxudCx0dCxnLHAsZCx2LGl0LHJ0PWVpLGZ0PW8mJm8udGFyZ2V0PT09InJlcGxhY2UiLHV0PXIubGVuZ3RoO3V0LS07KWlmKHY9clt1dF0sIiIrbj09PW4pcD1iKHYpLGl0PXAuY3R4LHAuY3R4PW8sc3Qobix2LHAsdSkscC5jdHg9aXQ7ZWxzZXtpZihoPWh8fGIodiksbi5tYXJrdXAhPT1pKWgubGluaz09PSExJiYobz1vfHx7fSxvLmxpbms9cnQ9ITEpLGZ0JiYoZD12LnBhcmVudE5vZGUpLHR0PW4ucmVuZGVyKHUsbyxzLGgsaSxydCksZD8oYz12LnByZXZpb3VzU2libGluZyxhPXYubmV4dFNpYmxpbmcsdC5jbGVhbkRhdGEoW3ZdLCEwKSxkLnJlbW92ZUNoaWxkKHYpLHY9ZCk6KGM9YT1pLHQodikuZW1wdHkoKSk7ZWxzZSBpZihuIT09ITApYnJlYWs7aWYodi5fZGZyJiYhYSl7Zm9yKGc9bCh2Ll9kZnIsMSxvciksaz0wLG50PWcubGVuZ3RoO2s8bnQ7aysrKXA9Z1trXSwocD15W3AuaWRdKSYmcC5kYXRhIT09aSYmcC5wYXJlbnQucmVtb3ZlVmlld3MocC5fLmtleSxpLCEwKTt2Ll9kZnI9IiJ9aC5saW5rKHUsdixjLGEsdHQsaSxvKX19cmV0dXJuIHJ9ZnVuY3Rpb24gYnUobixyLHUsaCx2LHAsdyxkKXtmdW5jdGlvbiB5dShuLHQscix1LGUsbyxoLGMsbCxhLHkscCx3KXt2YXIgYixrPSIiO3JldHVybiB3PyhoaT0wLG4pOihnPWN8fGx8fCIiLHU9dXx8YSxyPXJ8fHAscGkmJiFyJiYodXx8Z3x8bykmJihwaT1pLHV0PWd0LnNoaWZ0KCkpLHU9dXx8cix1JiYoaGk9MCxwaT1pLGYubm9WYWxpZGF0ZXx8KHJ8fHA/dWlbdXRdfHwoYj0iJzwiK3V0KyIuLi4vIik6dWlbdV0/Yj0iJzxcLyIrdTpndC5sZW5ndGgmJnU9PT11dHx8KGI9Ik1pc21hdGNoOiAnPFwvIit1KSxiJiZ0aShiKyI+JyBpbjpcbiIrdikpLGVyPWZ0LHV0PWd0LnNoaWZ0KCksZnQ9cmlbdXRdLGE9YT8iPFwvIithKyI+IjoiIixlciYmKGF0Kz1wdCxwdD0iIixmdD9hdCs9Ii0iOihrPWEraXIrIkAiK2F0K3RyKyh5fHwiIiksYXQ9bHUuc2hpZnQoKSkpKSxmdD8obz9wdCs9bzp0PWF8fHB8fCIiLGcmJih0Kz1nLHB0JiYodCs9IiAiK3MrJz0iJytwdCsnIicscHQ9IiIpKSk6dD1vP3QraytlK2lyK28rdHIraCtnOmt8fG4saGkmJm8mJnRpKCIgTm8ge157IHRhZ3Mgd2l0aGluIGVsZW0gbWFya3VwICgiK2hpKycgKS4gVXNlIGRhdGEtbGluaz0iLi4uIicpLGcmJihoaT1nLGd0LnVuc2hpZnQodXQpLHV0PWcuc2xpY2UoMSksZ3RbMF0mJmd0WzBdPT09b3VbdXRdJiZpdCgiUGFyZW50IG9mIDx0cj4gbXVzdCBiZSA8dGJvZHk+IikscGk9dWlbdXRdLChmdD1yaVt1dF0pJiYhZXImJihsdS51bnNoaWZ0KGF0KSxhdD0iIiksZXI9ZnQsYXQmJmZ0JiYoYXQrPSIrIikpLHQpfWZ1bmN0aW9uIGJpKG4sdCl7dmFyIG8sbCx1LGUsZixhLHMsaD1bXTtpZihuKXtmb3Iobi5fdGtucy5jaGFyQXQoMCk9PT0iQCImJih0PW50LnByZXZpb3VzU2libGluZyxudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG50KSxudD1udWxsKSxidD1uLmxlbmd0aDtidC0tOyl7aWYob3Q9bltidF0sdT1vdC5jaCxvPW90LnBhdGgpZm9yKGV0PW8ubGVuZ3RoLTE7bD1vLmNoYXJBdChldC0tKTspbD09PSIrIj9vLmNoYXJBdChldCk9PT0iLSI/KGV0LS0sdD10LnByZXZpb3VzU2libGluZyk6dD10LnBhcmVudE5vZGU6dD10Lmxhc3RDaGlsZDt1PT09Il4iPyhnPWNbZj1vdC5pZF0pJiYocz10JiYoIW50fHxudC5wYXJlbnROb2RlIT09dCksKCFudHx8cykmJihnLnBhcmVudEVsZW09dCksb3QuZWxDbnQmJnMmJih0Ll9kZnI9KG90Lm9wZW4/IiMiOiIvIikrZit1Kyh0Ll9kZnJ8fCIiKSksaC5wdXNoKFtzP251bGw6bnQsb3RdKSk6KHJ0PXlbZj1vdC5pZF0pJiYocnQubGlua3x8KHJ0LnBhcmVudEVsZW09dHx8bnQmJm50LnBhcmVudE5vZGV8fHIsayhydCx2dCkscnQuXy5vblJlbmRlcj1laSxydC5fLm9uQXJyYXlDaGFuZ2U9Y3IsZmkocnQpKSxlPXJ0LnBhcmVudEVsZW0sb3Qub3Blbj8ocnQuX2VsQ250PW90LmVsQ250LHQ/dC5fZGZyPSIjIitmK3UrKHQuX2Rmcnx8IiIpOihydC5fcHJ2fHwoZS5fZGZyPWh0KGUuX2RmciwiIyIrZit1KSkscnQuX3Bydj1udCkpOih0JiYoIW50fHxudC5wYXJlbnROb2RlIT09dCk/KHQuX2Rmcj0iLyIrZit1Kyh0Ll9kZnJ8fCIiKSxydC5fbnh0PWkpOm50JiYocnQuX254dHx8KGUuX2Rmcj1odChlLl9kZnIsIi8iK2YrdSkpLHJ0Ll9ueHQ9bnQpLHZpPXJ0LmxpbmtDdHgsKGE9cnQuY3R4JiZydC5jdHgub25BZnRlckNyZWF0ZXx8d3UpJiZhLmNhbGwodmkscnQpKSl9Zm9yKGJ0PWgubGVuZ3RoO2J0LS07KWhyLnB1c2goaFtidF0pfXJldHVybiFufHxuLmVsQ250fWZ1bmN0aW9uIHB1KG4pe3ZhciB0LGk7aWYobilmb3IoYnQ9bi5sZW5ndGgsZXQ9MDtldDxidDtldCsrKWlmKG90PW5bZXRdLHl0LmlkKXl0LmlkPXl0LmlkIT09b3QuaWQmJnl0LmlkO2Vsc2UgaWYoaT1nPWNbb3QuaWRdLmxpbmtDdHgudGFnLCFnLmZsb3cpe2lmKCFicil7Zm9yKHQ9MTtpPWkucGFyZW50Oyl0Kys7cnI9cnJ8fHR9KGJyfHx0PT09cnIpJiYoIWRyfHxnLnRhZ05hbWU9PT1kcikmJnZyLnB1c2goZyl9fWZ1bmN0aW9uIHJ1KCl7Zm9yKGxyPWlpP3IucXVlcnlTZWxlY3RvckFsbCh0dCk6dCh0dCxyKS5nZXQoKSxuaT1sci5sZW5ndGgsdSYmdS5pbm5lckhUTUwmJihraT1paT91LnF1ZXJ5U2VsZWN0b3JBbGwodHQpOnQodHQsdSkuZ2V0KCksdT1raS5sZW5ndGg/a2lba2kubGVuZ3RoLTFdOnUpLHJyPTAsd3Q9MDt3dDxuaTt3dCsrKWlmKG50PWxyW3d0XSx1JiYhc3Upc3U9bnQ9PT11O2Vsc2UgaWYoaCYmbnQ9PT1oKWJyZWFrO2Vsc2UgbnQucGFyZW50Tm9kZSYmdnUobChudCxpLHZyJiZhdSkpJiYheXQmJm50LmdldEF0dHJpYnV0ZShhKSYmaHIucHVzaChbbnRdKTtpZih5cih1LGZ0KSx5cihoLGZ0KSx5dCl7a3QmJmt0LnJlc29sdmUoKTtyZXR1cm59Zm9yKGZ0JiZhdCtwdCYmKG50PWgsYXQmJihoP2JpKGwoYXQrIisiLDEpLGgpOmJpKGwoYXQsMSkscikpLGJpKGwocHQsMSksciksaCYmKGx0PWguZ2V0QXR0cmlidXRlKHMpLChuaT1sdC5pbmRleE9mKG9yKSsxKSYmKGx0PWx0LnNsaWNlKG5pK29yLmxlbmd0aC0xKSksaC5zZXRBdHRyaWJ1dGUocyxwdCtsdCkpKSxuaT1oci5sZW5ndGgsd3Q9MDt3dDxuaTt3dCsrKW50PWhyW3d0XSxkdD1udFsxXSxudD1udFswXSxkdD8oZz1jW2R0LmlkXSkmJigodmk9Zy5saW5rQ3R4KSYmKGc9dmkudGFnLGcubGlua0N0eD12aSksZHQub3Blbj8obnQmJihnLnBhcmVudEVsZW09bnQucGFyZW50Tm9kZSxnLl9wcnY9bnQpLGcuX2VsQ250PWR0LmVsQ250LCFnfHxnLm9uQmVmb3JlTGluayYmZy5vbkJlZm9yZUxpbmsoKT09PSExfHxnLl8uYm91bmR8fChnLl8uYm91bmQ9ITAscnQ9Zy50YWdDdHgudmlldyxzdChpLGcuX3BydixydCxuLGR0LmlkKSksZy5fLmxpbmtpbmc9ITApOihnLl9ueHQ9bnQsZy5fLmxpbmtpbmcmJihncj1nLnRhZ0N0eCxydD1nci52aWV3LGcuY29udGVudHM9Y2ksZy5ub2Rlcz1saSxnLmNoaWxkVGFncz1haSxnLmN1cnJlbnRDdHhzPXdyLGcudXBkYXRlPXNyLGcucmVmcmVzaD1rcixkZWxldGUgZy5fLmxpbmtpbmcsZy5fLmJvdW5kfHwoZy5fLmJvdW5kPSEwLHN0KGksZy5fcHJ2LHJ0LG4sZHQuaWQpKSxjdChnLGdyKSkpKToocnQ9YihudCksc3QobnQuZ2V0QXR0cmlidXRlKGEpLG50LHJ0LG4saSx3KSk7a3QmJmt0LnJlc29sdmUoKX12YXIgaGksdmksZyx3dCxuaSxldCxidCxscixudCxydCxvdCxkdCxraSxnaSxhcixucixvaSx2cixicixkcixncixycix5dCx1dSxudSxldSx5aSx1dCxwaSx3aSxmcixsdCxmdCxlcixzaSxwdCxvcixzdSxrdCx0dT10aGlzLGN1PXR1Ll8uaWQrIl8iLGF0PSIiLGhyPVtdLGd0PVtdLGx1PVtdLHd1PXR1LmhscChpdSksdnU9Ymk7aWYocCYmKGt0PXAubGF6eUxpbmsmJnQuRGVmZXJyZWQoKSxwLnRtcGw/YXI9Ii8iK3AuXy5pZCsiXyI6KHl0PXAuZ2V0LHAudGFnJiYoY3U9cC50YWcrIl4iLHA9ITApKSxwPXA9PT0hMCkseXQmJih2dT1wdSx2cj15dC50YWdzLGJyPXl0LmRlZXAsZHI9eXQubmFtZSkscj1yPyIiK3I9PT1yP3QocilbMF06ci5qcXVlcnk/clswXTpyOnR1LnBhcmVudEVsZW18fGUuYm9keSx1dD1yLnRhZ05hbWUudG9Mb3dlckNhc2UoKSxmdD0hIXJpW3V0XSx1PXUmJnByKHUsZnQpLGg9aCYmcHIoaCxmdCl8fG51bGwsdiE9PWkpe2lmKGZyPWUuY3JlYXRlRWxlbWVudCgiZGl2Iiksd2k9ZnIsb3I9cHQ9IiIsc2k9ci5uYW1lc3BhY2VVUkk9PT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPyJzdmdfbnMiOih5aT1mdS5leGVjKHYpKSYmeWlbMV18fCIiLGRpJiZ5aSYmeWlbMl0mJml0KCJVbnN1cHBvcnRlZDogIit5aVsyXSksZnQpe2ZvcihvaT1oO29pJiYhKG5yPWwob2kpKTspb2k9b2kubmV4dFNpYmxpbmc7KGx0PW5yP25yLl90a25zOnIuX2RmcikmJihnaT1hcnx8IiIsKHB8fCFhcikmJihnaSs9IiMiK2N1KSxldD1sdC5pbmRleE9mKGdpKSxldCsxJiYoZXQrPWdpLmxlbmd0aCxvcj1wdD1sdC5zbGljZSgwLGV0KSxsdD1sdC5zbGljZShldCksbnI/b2kuc2V0QXR0cmlidXRlKHMsbHQpOnIuX2Rmcj1sdCkpfWlmKHBpPWksdj0oIiIrdikucmVwbGFjZShodSx5dSksIWYubm9WYWxpZGF0ZSYmZ3QubGVuZ3RoJiZ0aSgiTWlzbWF0Y2hlZCAnPCIrdXQrIi4uLj4nIGluOlxuIit2KSxkKXJldHVybjtmb3IodXIuYXBwZW5kQ2hpbGQoZnIpLHNpPW9bc2ldfHxvLmRpdix1dT1zaVswXSx3aS5pbm5lckhUTUw9c2lbMV0rditzaVsyXTt1dS0tOyl3aT13aS5sYXN0Q2hpbGQ7Zm9yKHVyLnJlbW92ZUNoaWxkKGZyKSxudT1lLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtldT13aS5maXJzdENoaWxkOyludS5hcHBlbmRDaGlsZChldSk7ci5pbnNlcnRCZWZvcmUobnUsaCl9cmV0dXJuIGt0P3NldFRpbWVvdXQocnUsMCk6cnUoKSxrdCYma3QucHJvbWlzZSgpfWZ1bmN0aW9uIHN0KG4sdCxyLGYsZSxvKXt2YXIgdyx2LGIsbCxrLGQseSxwLGEscyx0dDtpZihmPXIuZGF0YT09PWk/Znx8e306ci5kYXRhLGUpcz1jW2VdLHM9cy5saW5rQ3R4P3MubGlua0N0eC50YWc6cyxhPXMubGlua0N0eHx8e2RhdGE6ZixlbGVtOnMuX2VsQ250P3MucGFyZW50RWxlbTp0LHZpZXc6cixjdHg6ci5jdHgsYXR0cjpoLGZuOnMuXy5ibmQsdGFnOnMsX2JuZElkOmV9LHZyKGEsYS5mbik7ZWxzZSBpZihuJiZ0KWZvcih3PXIudG1wbCxuPWt1KG4sb3QodCkpLGcubGFzdEluZGV4PTA7dj1nLmV4ZWMobik7KXR0PWcubGFzdEluZGV4LGI9ZT9oOnZbMV0seT12WzNdLGs9dlsxMF0sbD1pLGE9e2RhdGE6ZixlbGVtOnMmJnMuX2VsQ250P3MucGFyZW50RWxlbTp0LHZpZXc6cixjdHg6b3x8ci5jdHgsYXR0cjpiLF9pbml0VmFsOiF2WzJdfSx2WzZdJiYoIWImJihsPS86KFtcdyRdKikkLy5leGVjKGspKSYmKGw9bFsxXSxsIT09aSYmKGQ9LWwubGVuZ3RoLTEseT15LnNsaWNlKDAsZC0xKStudCxrPWsuc2xpY2UoMCxkKSkpLGw9PT1udWxsJiYobD1pKSxhLmNvbnZlcnQ9dls1XXx8IiIpLGEuZXhwcj1iK3kscD13LmxpbmtzW3ldLHB8fCh3LmxpbmtzW3ldPXA9dS50bXBsRm4od2kreStiaSx3LCEwLGwpLHUucGFyc2UoayxwLnBhdGhzPVtdLHcpKSxhLmZuPXAsYnx8bD09PWl8fChhLmNvbnZlcnRCYWNrPWwpLHZyKGEscCksZy5sYXN0SW5kZXg9dHR9ZnVuY3Rpb24gdnIobix0KXtmdW5jdGlvbiBpKGkscil7eXUuY2FsbChuLGkscix0KX1pLm5vQXJyYXk9ITA7bi5fY3R4Q2I9ZHUobi52aWV3KTtuLl9oZGxyPWk7aSghMCl9ZnVuY3Rpb24gaHQobix0KXt2YXIgaTtyZXR1cm4gbj8oaT1uLmluZGV4T2YodCksaSsxP24uc2xpY2UoMCxpKStuLnNsaWNlKGkrdC5sZW5ndGgpOm4pOiIifWZ1bmN0aW9uIGhpKG4pe3JldHVybiBuJiYoIiIrbj09PW4/bjpuLnRhZ05hbWU9PT0iU0NSSVBUIj9uLnR5cGUuc2xpY2UoMyk6bi5ub2RlVHlwZT09PTEmJm4uZ2V0QXR0cmlidXRlKHMpfHwiIil9ZnVuY3Rpb24gbChuLHQsaSl7ZnVuY3Rpb24gZShuLHQsaSxyLGUsbyl7dS5wdXNoKHtlbENudDpmLGlkOnIsY2g6ZSxvcGVuOnQsY2xvc2U6aSxwYXRoOm8sdG9rZW46bn0pfXZhciBmLHIsdT1bXTtpZihyPXQ/bjpoaShuKSlyZXR1cm4gdS5lbENudD0hbi50eXBlLGY9ci5jaGFyQXQoMCk9PT0iQCJ8fCFuLnR5cGUsdS5fdGtucz1yLHIucmVwbGFjZShpfHx2dSxlKSx1fWZ1bmN0aW9uIHlyKG4sdCl7biYmKG4udHlwZT09PSJqc3YiP24ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChuKTp0JiZuLmdldEF0dHJpYnV0ZShhKT09PSIiJiZuLnJlbW92ZUF0dHJpYnV0ZShhKSl9ZnVuY3Rpb24gcHIobix0KXtmb3IodmFyIGk9bjt0JiZpJiZpLm5vZGVUeXBlIT09MTspaT1pLnByZXZpb3VzU2libGluZztyZXR1cm4gaSYmKGkubm9kZVR5cGUhPT0xPyhpPWUuY3JlYXRlRWxlbWVudCgiU0NSSVBUIiksaS50eXBlPSJqc3YiLG4ucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaSxuKSk6aGkoaSl8fGkuZ2V0QXR0cmlidXRlKGEpfHxpLnNldEF0dHJpYnV0ZShhLCIiKSksaX1mdW5jdGlvbiBrdShuLGkpe3JldHVybiBuPXQudHJpbShuKS5yZXBsYWNlKGV1LCJcXCQmIiksbi5zbGljZSgtMSkhPT1udD9uPXl0KyI6IituKyhpPyI6IjoiIikrbnQ6bn1mdW5jdGlvbiBjaShuLHIpe24hPT0hIW4mJihyPW4sbj1pKTt2YXIgZix1PXQodGhpcy5ub2RlcygpKTtyZXR1cm4gdVswXSYmKGY9cj91LmZpbHRlcihyKTp1LHU9biYmcj9mLmFkZCh1LmZpbmQocikpOmYpLHV9ZnVuY3Rpb24gbGkobix0LGkpe3ZhciByLHU9dGhpcyxmPXUuX2VsQ250LG89IXQmJmYsZT1bXTtmb3IodD10fHx1Ll9wcnYsaT1pfHx1Ll9ueHQscj1vP3Q9PT11Ll9ueHQ/dS5wYXJlbnRFbGVtLmxhc3RTaWJsaW5nOnQ6dS5fLmlubGluZT09PSExP3R8fHUubGlua0N0eC5lbGVtLmZpcnN0Q2hpbGQ6dCYmdC5uZXh0U2libGluZztyJiYoIWl8fHIhPT1pKTspKG58fGZ8fHIudGFnTmFtZSE9PSJTQ1JJUFQiKSYmZS5wdXNoKHIpLHI9ci5uZXh0U2libGluZztyZXR1cm4gZX1mdW5jdGlvbiBhaShuLHQpe24hPT0hIW4mJih0PW4sbj1pKTt2YXIgcj10aGlzLG89ci5saW5rP3I6ci50YWdDdHgudmlldyx1PXIuX3BydixmPXIuX2VsQ250LGU9W107cmV0dXJuIHUmJm8ubGluayhpLHIucGFyZW50RWxlbSxmP3UucHJldmlvdXNTaWJsaW5nOnUsci5fbnh0LGkse2dldDp7dGFnczplLGRlZXA6bixuYW1lOnQsaWQ6ZiYmci5fdGdJZH19KSxlfWZ1bmN0aW9uIHdyKCl7dmFyIG49dGhpcy50YWdDdHgudmlldztyZXR1cm4gdGhpcy5fLmJuZC5jYWxsKG4udG1wbCxuLmRhdGEsbixyKX1mdW5jdGlvbiBjdChuLHQpe3ZhciBmLHIscyxlLG8sYSx2LGwseT10LnZpZXcsaD1uLmxpbmtDdHg9bi5saW5rQ3R4fHx7dGFnOm4sZGF0YTp5LmRhdGEsdmlldzp5LGN0eDp5LmN0eH07aWYobi5vbkFmdGVyTGluayluLm9uQWZ0ZXJMaW5rKHQsaCk7aWYoZj1uLnRhcmdldFRhZz9uLnRhcmdldFRhZy5saW5rZWRFbGVtOm4ubGlua2VkRWxlbSxmJiYocj1mWzBdKSYmKChzPW4uXy5yYWRpbykmJihmPWYuY2hpbGRyZW4oImlucHV0W3R5cGU9cmFkaW9dIikpLHN8fCFuLl8uY2hnaW5nKSl7aWYoZT11LmN2dChuLG4uY29udmVydClbMF0sc3x8ciE9PWguZWxlbSl7Zm9yKHY9Zi5sZW5ndGg7di0tOyl7aWYocj1mW3ZdLGw9ci5fanN2TG5rZEVsLG4uXy5pbmxpbmUmJighbHx8bCE9PW4mJmwudGFyZ2V0VGFnIT09bikpZm9yKHIuX2pzdkxua2RFbD1uLG89aC5lbGVtP2guZWxlbS5fanN2Qm5kOm4uX3Bydi5fanN2Qm5kLHIuX2pzdkJuZD1vKyIrIixvPW8uc2xpY2UoMSkuc3BsaXQoIiYiKSxhPW8ubGVuZ3RoO2EtLTspYnIoY1tvW2FdXSxuLmNvbnZlcnRCYWNrKTtzJiYocltwXT1lPT09ci52YWx1ZSl9aC5fdmFsPWV9c3x8ci52YWx1ZT09PWl8fGU9PT1pfHwoci50eXBlPT09a3Q/cltwXT1lJiZlIT09ImZhbHNlIjpmLnZhbChlKSl9fWZ1bmN0aW9uIGJyKG4sdCl7dmFyIGUsZixzLGksbyxyPW4ubGlua0N0eCxoPXIuZGF0YSx1PXIuZm4ucGF0aHM7aWYobil7Zm9yKChlPXUuX2pzdnRvKSYmKHU9ZSksZj11Lmxlbmd0aDtmJiYiIisoaT11Wy0tZl0pIT09aTspO2kmJighci50YWd8fHIudGFnLnRhZ0N0eC5hcmdzLmxlbmd0aCk/KGk9aS5zcGxpdCgiXiIpLmpvaW4oIi4iKSxuLnRvPWkuY2hhckF0KDApPT09Ii4iP1tbbz11W2YtMV0saS5zbGljZSgxKV0sdF06W3IuX2N0eENiKHM9Zj91WzBdLnNwbGl0KCJeIikuam9pbigiLiIpOmkpfHxbaCxzXSx0XSxlJiZvJiYobi50b1swXVswXT1yLl9jdHhDYihvLGgpKSk6bi50bz1bW10sdF19fWZ1bmN0aW9uIGtyKG4pe3ZhciB1LGYsdD10aGlzLGU9dC5saW5rQ3R4LG89dC50YWdDdHgudmlldztyZXR1cm4gdC5kaXNwb3NlZCYmaXQoIlJlbW92ZWQgdGFnIiksbj09PWkmJihuPXIuX3RhZyh0LG8sby50bXBsLHQuY3VycmVudEN0eHM/dC5jdXJyZW50Q3R4cygpOnQudGFnQ3R4cywhMCkpLG4rIiI9PT1uJiYoZj10Ll8uaW5saW5lP2g6ZS5hdHRyfHxvdCh0LnBhcmVudEVsZW0sITApLHU9aHIobixlLGYsdCkpLGN0KHQsdC50YWdDdHgpLHV8fHR9ZnVuY3Rpb24gdmkobil7Zm9yKHZhciB1LHQsaSxmPVtdLGU9bi5sZW5ndGgscj1lO3ItLTspZi5wdXNoKG5bcl0pO2ZvcihyPWU7ci0tOylpZih0PWZbcl0sdC5wYXJlbnROb2RlKXtpZihpPXQuX2pzdkJuZClmb3IoaT1pLnNsaWNlKDEpLnNwbGl0KCImIiksdC5fanN2Qm5kPSIiLHU9aS5sZW5ndGg7dS0tOylsdChpW3VdLHQuX2pzdkxua2RFbCx0KTtncihoaSh0KSsodC5fZGZyfHwiIikpfX1mdW5jdGlvbiBsdChuLGkscil7dmFyIGgsbCxmLG8scyxhLHYseSxlPWNbbl07aWYoaSlyPT09aS5saW5rZWRFbGVtWzBdJiYoZGVsZXRlIHIuX2pzdkxua2RFbCxkZWxldGUgaS5saW5rZWRFbGVtKTtlbHNlIGlmKGUpe2ZvcihoIGluIGUuYm5kKW89ZS5ibmRbaF0scz0iLm9icyIrZS5jYklkLHQuaXNBcnJheShvKT90KFtvXSkub2ZmKHB0K3MpLm9mZihnaStzKTp0KG8pLm9mZihnaStzKSxkZWxldGUgZS5ibmRbaF07aWYobD1lLmxpbmtDdHgpe2lmKGY9bC50YWcpe2lmKGE9Zi50YWdDdHhzKWZvcih2PWEubGVuZ3RoO3YtLTspKHk9YVt2XS5tYXApJiZ5LnVubWFwKCk7Zi5vbkRpc3Bvc2UmJmYub25EaXNwb3NlKCk7Zi5fZWxDbnR8fChmLl9wcnYmJmYuX3Bydi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGYuX3BydiksZi5fbnh0JiZmLl9ueHQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChmLl9ueHQpKTtmLmRpc3Bvc2VkPSEwfWRlbGV0ZSBsLnZpZXcuXy5ibmRzW25dfWRlbGV0ZSBjW25dO2RlbGV0ZSB1Ll9jYkJuZHNbZS5jYklkXX19ZnVuY3Rpb24geWkobixyKXtyZXR1cm4gbj09PWk/KHcmJih0KHcpLm9mZihucixldCksdz1pKSxuPSEwLHYucmVtb3ZlVmlld3MoKSx2aShlLmJvZHkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSkpOnImJihyPXIuanF1ZXJ5P3I6dChyKSxuPT09ITAmJnIuZWFjaChmdW5jdGlvbigpe2Zvcih2YXIgbjsobj1iKHRoaXMsITApKSYmbi5wYXJlbnQ7KW4ucGFyZW50LnJlbW92ZVZpZXdzKG4uXy5rZXksaSwhMCk7dmkodGhpcy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpKX0pKSxyfWZ1bmN0aW9uIGRyKG4sdCl7cmV0dXJuIHlpKHRoaXMsbix0KX1mdW5jdGlvbiBkdShuKXtyZXR1cm4gbj1ufHx0LnZpZXcoKSxmdW5jdGlvbih0LGkpe3ZhciBmLHUsZT1baV07aWYobiYmdCl7aWYodC5fanN2T2IpcmV0dXJuIHQuX2pzdk9iLmNhbGwobi50bXBsLGksbixyKTtpZih0LmNoYXJBdCgwKT09PSJ+IilyZXR1cm4gdC5zbGljZSgwLDQpPT09In50YWciJiYodT1uLmN0eCx0LmNoYXJBdCg0KT09PSIuIiYmKGY9dC5zbGljZSg1KS5zcGxpdCgiLiIpLHU9dS50YWcpLGYpP3U/W3UsZi5qb2luKCIuIiksaV06W106KHQ9dC5zbGljZSgxKS5zcGxpdCgiLiIpLChpPW4uaGxwKHQuc2hpZnQoKSkpJiYodC5sZW5ndGgmJmUudW5zaGlmdCh0LmpvaW4oIi4iKSksZS51bnNoaWZ0KGkpKSxpP2U6W10pO2lmKHQuY2hhckF0KDApPT09IiMiKXJldHVybiB0PT09IiNkYXRhIj9bXTpbbix0LnJlcGxhY2Uoc3UsIiIpLGldfX19ZnVuY3Rpb24gZ3Uobil7cmV0dXJuIG4udHlwZT09PWt0P25bcF06bi52YWx1ZX1mdW5jdGlvbiBwaShuLHQsaSxyLHUsZil7dmFyIHYsaCxwLG8sYixhLGUsdz0wLGs9bj09PXQ7aWYobil7Zm9yKHA9bChuKXx8W10sdj0wLGg9cC5sZW5ndGg7djxoO3YrKyl7aWYobz1wW3ZdLGE9by5pZCxhPT09ciYmby5jaD09PXUpaWYoZiloPTA7ZWxzZSBicmVhaztrfHwoYj1vLmNoPT09Il8iP3lbYV06Y1thXS5saW5rQ3R4LnRhZyxvLm9wZW4/Yi5fcHJ2PXQ6by5jbG9zZSYmKGIuX254dD10KSk7dys9YS5sZW5ndGgrMn13JiZuLnNldEF0dHJpYnV0ZShzLG4uZ2V0QXR0cmlidXRlKHMpLnNsaWNlKHcpKTtlPXQ/dC5nZXRBdHRyaWJ1dGUocyk6aS5fZGZyOyhoPWUuaW5kZXhPZigiLyIrcit1KSsxKSYmKGU9cC5fdGtucy5zbGljZSgwLHcpK2Uuc2xpY2UoaCsoZj8tMTpyLmxlbmd0aCsxKSkpO2UmJih0P3Quc2V0QXR0cmlidXRlKHMsZSk6aS5fZGZyPWUpfWVsc2UgaS5fZGZyPWh0KGkuX2RmciwiIyIrcit1KSxmfHx0fHwoaS5fZGZyPWh0KGkuX2RmciwiLyIrcit1KSl9ZnVuY3Rpb24gZ3Iobil7dmFyIHIsZix0LHU7aWYodT1sKG4sMSxjdSkpZm9yKHI9MCxmPXUubGVuZ3RoO3I8ZjtyKyspdD11W3JdLHQuY2g9PT0iXyI/KHQ9eVt0LmlkXSkmJnQuZGF0YSE9PWkmJnQucGFyZW50LnJlbW92ZVZpZXdzKHQuXy5rZXksaSwhMCk6bHQodC5pZCl9ZnVuY3Rpb24gbmYobixpLHIsdSl7c3dpdGNoKHUuY2hhbmdlKXtjYXNlInNldCI6Zm9yKHZhciBmPWkubGVuZ3RoO2YtLTspaWYoaVtmXS5rZXk9PT11LnBhdGgpYnJlYWs7Zj09PS0xP3UucGF0aCYmdC5vYnNlcnZhYmxlKGkpLmluc2VydCh7a2V5OnUucGF0aCxwcm9wOnUudmFsdWV9KTp1LnZhbHVlPT09bnVsbD8oZGVsZXRlIG5bdS5wYXRoXSx0Lm9ic2VydmFibGUoaSkucmVtb3ZlKGYpKTp0Lm9ic2VydmFibGUoaVtmXSkuc2V0UHJvcGVydHkoInByb3AiLHUudmFsdWUpfX1mdW5jdGlvbiB0ZihuLGkscix1KXt2YXIgZjtzd2l0Y2godS5jaGFuZ2Upe2Nhc2Uic2V0Ijp1LnBhdGg9PT0icHJvcCI/dC5vYnNlcnZhYmxlKG4pLnNldFByb3BlcnR5KHIudGFyZ2V0LmtleSx1LnZhbHVlKToodC5vYnNlcnZhYmxlKG4pLnNldFByb3BlcnR5KHUub2xkVmFsdWUsbnVsbCksZGVsZXRlIG5bdS5vbGRWYWx1ZV0sdC5vYnNlcnZhYmxlKG4pLnNldFByb3BlcnR5KHUudmFsdWUsci50YXJnZXQucHJvcCkpO2JyZWFrO2Nhc2UicmVtb3ZlIjpmPXUuaXRlbXNbMF07dC5vYnNlcnZhYmxlKG4pLnNldFByb3BlcnR5KGYua2V5LG51bGwpO2RlbGV0ZSBuW2Yua2V5XTticmVhaztjYXNlImluc2VydCI6Zj11Lml0ZW1zWzBdO2Yua2V5JiZ0Lm9ic2VydmFibGUobikuc2V0UHJvcGVydHkoZi5rZXksZi5wcm9wKX19ZnVuY3Rpb24gcmYobix0LGkpe3JldHVybiBpLmluZGV4T2YoIi4iKTwwJiZ0W25dfXZhciBhdD0iSnNWaWV3cyByZXF1aXJlcyAiLHZ0LHcsYixnLHdpLHl0LG50LGJpLGtpLGRpLGEsdHQsbyxlPW4uZG9jdW1lbnQscj10LnZpZXdzLHU9ci5zdWIsZj1yLnNldHRpbmdzLGs9dS5leHRlbmQsdj11LlZpZXcoaSwidG9wIikscnQ9dS5pc0ZuLG51PXIudGVtcGxhdGVzLHR1PXIuY29udmVydGVycyxkPXQub2JzZXJ2YWJsZSx1dD1kLm9ic2VydmUscz0iZGF0YS1qc3YiLGdpPXUucHJvcENobmc9dS5wcm9wQ2huZ3x8InByb3BlcnR5Q2hhbmdlIixwdD11LmFyckNobmc9dS5hcnJDaG5nfHwiYXJyYXlDaGFuZ2UiLHVmPXUuX2NiQm5kcz11Ll9jYkJuZHN8fHt9LG5yPSJjaGFuZ2UuanN2Iix3dD0ib25CZWZvcmVDaGFuZ2UiLGJ0PSJvbkFmdGVyQ2hhbmdlIixpdT0ib25BZnRlckNyZWF0ZSIscD0iY2hlY2tlZCIsa3Q9ImNoZWNrYm94IixmdD0icmFkaW8iLHRyPSciPjxcL3NjcmlwdD4nLGlyPSc8c2NyaXB0IHR5cGU9ImpzdicsZHQ9InNjcmlwdCxbIitzKyJdIixoPSJodG1sIixndD17dmFsdWU6InZhbCIsaW5wdXQ6InZhbCIsaHRtbDpoLHRleHQ6InRleHQifSxycj17ZnJvbToidmFsdWUiLHRvOiJ2YWx1ZSJ9LG5pPTAscnU9dC5jbGVhbkRhdGEsdXU9Zi5kZWxpbWl0ZXJzLGl0PXUuZXJyLHRpPXUuc3ludGF4RXJyLGZ1PS88KD8hc2NyaXB0KShcdyspKD86W14+XSoob25cdyspXHMqPSk/W14+XSo+LyxldT0vWyciXFxdL2csdXI9ZS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksaWk9ZS5xdWVyeVNlbGVjdG9yLHJpPXtvbDoxLHVsOjEsdGFibGU6MSx0Ym9keToxLHRoZWFkOjEsdGZvb3Q6MSx0cjoxLGNvbGdyb3VwOjEsZGw6MSxzZWxlY3Q6MSxvcHRncm91cDoxLHN2ZzoxLHN2Z19uczoxfSxvdT17dHI6InRhYmxlIn0sdWk9e2JyOjEsaW1nOjEsaW5wdXQ6MSxocjoxLGFyZWE6MSxiYXNlOjEsY29sOjEsbGluazoxLG1ldGE6MSxjb21tYW5kOjEsZW1iZWQ6MSxrZXlnZW46MSxwYXJhbToxLHNvdXJjZToxLHRyYWNrOjEsd2JyOjF9LGZyPXt9LHk9ezA6dn0sYz17fSxlcj0xLHN1PS9eIyh2aWV3XC4/KT8vLGh1PS8oXnwoXC8+KXw8XC8oXHcrKT58KShccyopKFsjXC9dXGQrW19eXSlgKFxzKikoPFx3Kyg/PVtcc1wvPl0pKT98XHMqKD86KDxcdysoPz1bXHNcLz5dKSl8PFwvKFx3Kyk+KFxzKil8KFwvPilccyp8KD4pKS9nLG9yPS8oIykoKShcZCspKF8pL2csY3U9LygjKSgpKFxkKykoW19eXSkvZyxsdT0vKD86KCMpfChcLykpKFxkKykoXykvZyxhdT0vKCMpKCkoXGQrKShcXikvZyx2dT0vKD86KCMpfChcLykpKFxkKykoW19eXSkoWy0rQFxkXSspPy9nO2lmKCF0KXRocm93IGF0KyJqUXVlcnkiO2lmKCF0LnZpZXdzKXRocm93IGF0KyJKc1JlbmRlciI7aWYoIXQub2JzZXJ2YWJsZSl0aHJvdyBhdCsianF1ZXJ5Lm9ic2VydmFibGUiO3QubGlua3x8KHUub25TdG9yZUl0ZW09ZnVuY3Rpb24obixpLHIpe3ImJm49PT1udSYmKHIubGluaz1hcixyLnVubGluaz1kcixpJiYodC5saW5rW2ldPWZ1bmN0aW9uKCl7cmV0dXJuIGFyLmFwcGx5KHIsYXJndW1lbnRzKX0sdC51bmxpbmtbaV09ZnVuY3Rpb24oKXtyZXR1cm4gZHIuYXBwbHkocixhcmd1bWVudHMpfSkpfSwoZi5kZWxpbWl0ZXJzPWZ1bmN0aW9uKCl7dmFyIG49dXUuYXBwbHkocixhcmd1bWVudHMpO3JldHVybiB3aT1uWzBdLHl0PW5bMV0sbnQ9blsyXSxiaT1uWzNdLGtpPW5bNF0sZz1uZXcgUmVnRXhwKCIoPzpefFxccyopKFtcXHctXSopKFxcIitraSsiKT8oXFwiK3l0K3UuclRhZysiXFwiK250KyIpIiwiZyIpLHRoaXN9KSgpLHUudmlld0luZm9zPWwsdnQ9e2FkZFZpZXdzOmZ1bmN0aW9uKG4sdCxpKXt2YXIgdSxvLHI9dGhpcyxmPXQubGVuZ3RoLGU9ci52aWV3cztpZighci5fLnVzZUtleSYmZiYmKGk9ci50bXBsKSYmKG89ZS5sZW5ndGgrZixscihyLG4saSxlLHQsci5jdHgpIT09ITEpKWZvcih1PW4rZjt1PG87dSsrKWQoZVt1XSkuc2V0UHJvcGVydHkoImluZGV4Iix1KTtyZXR1cm4gcn0scmVtb3ZlVmlld3M6ZnVuY3Rpb24obixyLHUpe2Z1bmN0aW9uIG8obil7dmFyIHMsaCxjLGUsbyxsLHI9ZltuXTtpZihyJiZyLmxpbmspe2lmKHM9ci5fLmlkLHV8fChsPXIubm9kZXMoKSksci5yZW1vdmVWaWV3cyhpLGksITApLHIuZGF0YT1pLGU9ci5fcHJ2LG89ci5fbnh0LGM9ci5wYXJlbnRFbGVtLHV8fChyLl9lbENudCYmcGkoZSxvLGMscywiXyIpLHQobCkucmVtb3ZlKCkpLCFyLl9lbENudCl0cnl7ZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpO28ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChvKX1jYXRjaChhKXt9Zmkocik7Zm9yKGggaW4gci5fLmJuZHMpbHQoaCk7ZGVsZXRlIHlbc119fXZhciBlLGwscyxoPXRoaXMsYz0haC5fLnVzZUtleSxmPWgudmlld3M7aWYoYyYmKHM9Zi5sZW5ndGgpLG49PT1pKWlmKGMpe2ZvcihlPXM7ZS0tOylvKGUpO2gudmlld3M9W119ZWxzZXtmb3IobCBpbiBmKW8obCk7aC52aWV3cz17fX1lbHNlIGlmKHI9PT1pJiYoYz9yPTE6KG8obiksZGVsZXRlIGZbbl0pKSxjJiZyKXtmb3IoZT1uK3I7ZS0tPm47KW8oZSk7aWYoZi5zcGxpY2UobixyKSxzPWYubGVuZ3RoKXdoaWxlKG48cylkKGZbbl0pLnNldFByb3BlcnR5KCJpbmRleCIsbisrKX1yZXR1cm4gdGhpc30scmVmcmVzaDpmdW5jdGlvbihuKXt2YXIgdD10aGlzLGk9dC5wYXJlbnQ7cmV0dXJuIGkmJihscih0LHQuaW5kZXgsdC50bXBsLGkudmlld3MsdC5kYXRhLG4sITApLGZpKHQpKSx0fSxub2RlczpsaSxjb250ZW50czpjaSxjaGlsZFRhZ3M6YWksbGluazpidX0sdHUubWVyZ2U9ZnVuY3Rpb24obil7dmFyIHQsaT10aGlzLmxpbmtDdHguX3ZhbHx8IiIscj10aGlzLnRhZ0N0eC5wcm9wcy50b2dnbGU7cmV0dXJuIHImJih0PXIucmVwbGFjZSgvW1xcXiQufD8qKygpW3tdL2csIlxcJCYiKSx0PSIoXFxzKD89Iit0KyIkKXwoXFxzKXxeKSgiK3QrIihcXHN8JCkpIixpPWkucmVwbGFjZShuZXcgUmVnRXhwKHQpLCIkMiIpLG49aSsobj8oaSYmIiAiKStyOiIiKSksbn0sci50YWdzKCJvbiIse2F0dHI6Im5vbmUiLG9uQWZ0ZXJMaW5rOmZ1bmN0aW9uKG4scil7dmFyIG89dGhpcyxzPXQoci5lbGVtKSxmPW4uYXJncyx1PW4ucHJvcHMuZGF0YSxlPWYucG9wKCksaD1mWzFdfHxudWxsLGM9bi5wcm9wcy5jb250ZXh0O2lmKHU9dSE9PWk/dTpudWxsLGUmJmUuY2FsbClzLm9uKGZbMF18fCJjbGljayIsaCx1LGZ1bmN0aW9uKG4pe2UuY2FsbChjfHxvLmxlYWYsbix7Y2hhbmdlOm4udHlwZSx2aWV3OnIudmlldyxsaW5rQ3R4OnJ9KX0pfSxvbkFmdGVyQmluZDpmdW5jdGlvbihuKXt0aGlzLmxlYWY9bi5sZWFmfSxmbG93OiEwfSksayhyLnRhZ3NbImZvciJdLHtvbkFycmF5Q2hhbmdlOmZ1bmN0aW9uKG4sdCl7dmFyIGkscj10aGlzLHU9dC5jaGFuZ2U7aWYoci50YWdDdHhzWzFdJiYodT09PSJpbnNlcnQiJiZuLnRhcmdldC5sZW5ndGg9PT10Lml0ZW1zLmxlbmd0aHx8dT09PSJyZW1vdmUiJiYhbi50YXJnZXQubGVuZ3RofHx1PT09InJlZnJlc2giJiYhdC5vbGRJdGVtcy5sZW5ndGghPSFuLnRhcmdldC5sZW5ndGgpKXIucmVmcmVzaCgpO2Vsc2UgZm9yKGkgaW4gci5fLmFyclZ3cylpPXIuXy5hcnJWd3NbaV0saS5kYXRhPT09bi50YXJnZXQmJmkuXy5vbkFycmF5Q2hhbmdlLmFwcGx5KGksYXJndW1lbnRzKTtuLmRvbmU9ITB9LG9uQWZ0ZXJMaW5rOmZ1bmN0aW9uKCl7Zm9yKHZhciB1LG8saSxmLGU9dGhpcyxyPWUuX2Fyc3x8e30scz1lLnRhZ0N0eHMsYz1zLmxlbmd0aCxoPWUuc2VsZWN0ZWR8fDAsbj0wO248PWg7bisrKXU9c1tuXSxmPXUubWFwP3UubWFwLnRndDp1LmFyZ3MubGVuZ3RoP3UuYXJnc1swXTp1LnZpZXcuZGF0YSwoaT1yW25dKSYmZiE9PWlbMF0mJih1dChpWzBdLGlbMV0sITApLGRlbGV0ZSByW25dKSwhcltuXSYmdC5pc0FycmF5KGYpJiYodXQoZixvPWZ1bmN0aW9uKG4sdCl7ZS5vbkFycmF5Q2hhbmdlKG4sdCl9KSxyW25dPVtmLG9dKTtmb3Iobj1oKzE7bjxjO24rKykoaT1yW25dKSYmKHV0KGlbMF0saVsxXSwhMCksZGVsZXRlIHJbbl0pO2UuX2Fycz1yfSxvbkRpc3Bvc2U6ZnVuY3Rpb24oKXt2YXIgbix0PXRoaXM7Zm9yKG4gaW4gdC5fYXJzKXV0KHQuX2Fyc1tuXVswXSx0Ll9hcnNbbl1bMV0sITApfX0pLHIudGFncyh7cHJvcHM6dC5leHRlbmQoe30sci50YWdzWyJmb3IiXSx1LkRhdGFNYXAoci50YWdzLnByb3BzLmdldFRndCxuZix0ZixpLHJmKSl9KSxrKHQse3ZpZXc6ci52aWV3PWI9ZnVuY3Rpb24obixyLHUpe3IhPT0hIXImJih1PXIscj1pKTt2YXIgZixvLGgsYyx3LHMsYixhLHA9MCxrPWUuYm9keTtpZihuJiZuIT09ayYmdi5fLnVzZUtleT4xJiYobj0iIituPT09bj90KG4pWzBdOm4uanF1ZXJ5P25bMF06bixuKSlpZihyKXtmb3IoYT1paT9uLnF1ZXJ5U2VsZWN0b3JBbGwoZHQpOnQoZHQsbikuZ2V0KCkscz1hLmxlbmd0aCxoPTA7aDxzO2grKylmb3IoYj1hW2hdLG89bChiLGksb3IpLGM9MCx3PW8ubGVuZ3RoO2M8dztjKyspaWYoZj1vW2NdLChmPXlbZi5pZF0pJiYoZj1mJiZ1P2YuZ2V0KCEwLHUpOmYsZikpcmV0dXJuIGZ9ZWxzZSB3aGlsZShuKXtpZihvPWwobixpLGx1KSlmb3Iocz1vLmxlbmd0aDtzLS07KWlmKGY9b1tzXSxmLm9wZW4pe2lmKHA8MSlyZXR1cm4gZj15W2YuaWRdLGYmJnU/Zi5nZXQodSk6Znx8djtwLS19ZWxzZSBwKys7bj1uLnByZXZpb3VzU2libGluZ3x8bi5wYXJlbnROb2RlfXJldHVybiByP2k6dn0sbGluazpyLmxpbms9c2ksdW5saW5rOnIudW5saW5rPXlpLGNsZWFuRGF0YTpmdW5jdGlvbihuKXtuLmxlbmd0aCYmbmkmJnZpKG4pO3J1LmFwcGx5KHQsYXJndW1lbnRzKX19KSxyLnV0aWxpdHk9e3ZhbGlkYXRlOmZ1bmN0aW9uKG4pe3RyeXt2LmxpbmsoaSxlLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGksaSxuLGksaSwxKX1jYXRjaCh0KXtyZXR1cm4gdC5tZXNzYWdlfX19LGsodC5mbix7bGluazpmdW5jdGlvbihuLHQsaSxyLHUsZixlKXtyZXR1cm4gc2kobix0aGlzLHQsaSxyLHUsZixlKX0sdW5saW5rOmZ1bmN0aW9uKG4pe3JldHVybiB5aShuLHRoaXMpfSx2aWV3OmZ1bmN0aW9uKG4pe3JldHVybiBiKHRoaXNbMF0sbil9fSksdC5lYWNoKFtoLCJyZXBsYWNlV2l0aCIsImVtcHR5IiwicmVtb3ZlIl0sZnVuY3Rpb24obixpKXt2YXIgcix1PXQuZm5baV07dC5mbltpXT1mdW5jdGlvbigpe25pPTE7dHJ5e3I9dS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZmluYWxseXtuaT0wfXJldHVybiByfX0pLGsodix7dG1wbDp7bGlua3M6e30sdGFnczp7fX19KSxrKHYsdnQpLHYuXy5vblJlbmRlcj1laSxmKHt3cmFwTWFwOm89e29wdGlvbjpbMSwiPHNlbGVjdCBtdWx0aXBsZT0nbXVsdGlwbGUnPiIsIjxcL3NlbGVjdD4iXSxsZWdlbmQ6WzEsIjxmaWVsZHNldD4iLCI8XC9maWVsZHNldD4iXSxhcmVhOlsxLCI8bWFwPiIsIjxcL21hcD4iXSxwYXJhbTpbMSwiPG9iamVjdD4iLCI8XC9vYmplY3Q+Il0sdGhlYWQ6WzEsIjx0YWJsZT4iLCI8XC90YWJsZT4iXSx0cjpbMiwiPHRhYmxlPjx0Ym9keT4iLCI8XC90Ym9keT48XC90YWJsZT4iXSx0ZDpbMywiPHRhYmxlPjx0Ym9keT48dHI+IiwiPFwvdHI+PFwvdGJvZHk+PFwvdGFibGU+Il0sY29sOlsyLCI8dGFibGU+PHRib2R5PjxcL3Rib2R5Pjxjb2xncm91cD4iLCI8XC9jb2xncm91cD48XC90YWJsZT4iXSxzdmdfbnM6WzEsIjxzdmc+IiwiPFwvc3ZnPiJdLGRpdjpqUXVlcnkuc3VwcG9ydC5odG1sU2VyaWFsaXplP1swLCIiLCIiXTpbMSwiWDxkaXY+IiwiPFwvZGl2PiJdfSxsaW5rQXR0cjphPSJkYXRhLWxpbmsiLG1lcmdlOntpbnB1dDp7ZnJvbTpndSx0bzoidmFsdWUifSx0ZXh0YXJlYTpycixzZWxlY3Q6cnIsb3B0Z3JvdXA6e3RvOiJsYWJlbCJ9fSxqc3JEYmdNb2RlOmYuZGVidWdNb2RlLGRlYnVnTW9kZTpmdW5jdGlvbih0KXtmLmpzckRiZ01vZGUodCk7dD9uLl9qc3Y9e3ZpZXdzOnksYmluZGluZ3M6Y306ZGVsZXRlIG4uX2pzdn0sanN2OmZ1bmN0aW9uKCl7Zi5kZWJ1Z01vZGUoZi5fZGJnTW9kZSk7YT1mLmxpbmtBdHRyO3R0PWR0KyIsWyIrYSsiXSI7ZGk9Zi5ub0RvbUxldmVsMDtvLm9wdGdyb3VwPW8ub3B0aW9uO28udGJvZHk9by50Zm9vdD1vLmNvbGdyb3VwPW8uY2FwdGlvbj1vLnRoZWFkO28udGg9by50ZH19KSl9KHRoaXMsdGhpcy5qUXVlcnkpOwovKgovLyMgc291cmNlTWFwcGluZ1VSTD1qc3ZpZXdzLm1pbi5qcy5tYXAKKi8=]]></data>
	</file>
	<file>
	  <filename>/lib/lightbox.lib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/lightbox.lib/css/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/lightbox.lib/css/jquery.lightbox-0.5.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBqUXVlcnkgbGlnaHRCb3ggcGx1Z2luDQogKiBUaGlzIGpRdWVyeSBwbHVnaW4gd2FzIGluc3BpcmVkIGFuZCBiYXNlZCBvbiBMaWdodGJveCAyIGJ5IExva2VzaCBEaGFrYXIgKGh0dHA6Ly93d3cuaHVkZGxldG9nZXRoZXIuY29tL3Byb2plY3RzL2xpZ2h0Ym94Mi8pDQogKiBhbmQgYWRhcHRlZCB0byBtZSBmb3IgdXNlIGxpa2UgYSBwbHVnaW4gZnJvbSBqUXVlcnkuDQogKiBAbmFtZSBqcXVlcnktbGlnaHRib3gtMC41LmNzcw0KICogQGF1dGhvciBMZWFuZHJvIFZpZWlyYSBQaW5obyAtIGh0dHA6Ly9sZWFuZHJvdmllaXJhLmNvbQ0KICogQHZlcnNpb24gMC41DQogKiBAZGF0ZSBBcHJpbCAxMSwgMjAwOA0KICogQGNhdGVnb3J5IGpRdWVyeSBwbHVnaW4NCiAqIEBjb3B5cmlnaHQgKGMpIDIwMDggTGVhbmRybyBWaWVpcmEgUGluaG8gKGxlYW5kcm92aWVpcmEuY29tKQ0KICogQGxpY2Vuc2UgQ0NBdHRyaWJ1dGlvbi1TaGFyZUFsaWtlIDIuNSBCcmF6aWwgLSBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS1zYS8yLjUvYnIvZGVlZC5lbl9VUw0KICogQGV4YW1wbGUgVmlzaXQgaHR0cDovL2xlYW5kcm92aWVpcmEuY29tL3Byb2plY3RzL2pxdWVyeS9saWdodGJveC8gZm9yIG1vcmUgaW5mb3JtYXRpb25zIGFib3V0IHRoaXMgalF1ZXJ5IHBsdWdpbg0KICovDQojanF1ZXJ5LW92ZXJsYXkgew0KCXBvc2l0aW9uOiBhYnNvbHV0ZTsNCgl0b3A6IDA7DQoJbGVmdDogMDsNCgl6LWluZGV4OiA5MDsNCgl3aWR0aDogMTAwJTsNCgloZWlnaHQ6IDUwMHB4Ow0KfQ0KI2pxdWVyeS1saWdodGJveCB7DQoJcG9zaXRpb246IGFic29sdXRlOw0KCXRvcDogMDsNCglsZWZ0OiAwOw0KCXdpZHRoOiAxMDAlOw0KCXotaW5kZXg6IDEwMDsNCgl0ZXh0LWFsaWduOiBjZW50ZXI7DQoJbGluZS1oZWlnaHQ6IDA7DQp9DQojanF1ZXJ5LWxpZ2h0Ym94IGEgaW1nIHsgYm9yZGVyOiBub25lOyB9DQojbGlnaHRib3gtY29udGFpbmVyLWltYWdlLWJveCB7DQoJcG9zaXRpb246IHJlbGF0aXZlOw0KCWJhY2tncm91bmQtY29sb3I6ICNmZmY7DQoJd2lkdGg6IDI1MHB4Ow0KCWhlaWdodDogMjUwcHg7DQoJbWFyZ2luOiAwIGF1dG87DQp9DQojbGlnaHRib3gtY29udGFpbmVyLWltYWdlIHsgcGFkZGluZzogMTBweDsgfQ0KI2xpZ2h0Ym94LWxvYWRpbmcgew0KCXBvc2l0aW9uOiBhYnNvbHV0ZTsNCgl0b3A6IDQwJTsNCglsZWZ0OiAwJTsNCgloZWlnaHQ6IDI1JTsNCgl3aWR0aDogMTAwJTsNCgl0ZXh0LWFsaWduOiBjZW50ZXI7DQoJbGluZS1oZWlnaHQ6IDA7DQp9DQojbGlnaHRib3gtbmF2IHsNCglwb3NpdGlvbjogYWJzb2x1dGU7DQoJdG9wOiAwOw0KCWxlZnQ6IDA7DQoJaGVpZ2h0OiAxMDAlOw0KCXdpZHRoOiAxMDAlOw0KCXotaW5kZXg6IDEwOw0KfQ0KI2xpZ2h0Ym94LWNvbnRhaW5lci1pbWFnZS1ib3ggPiAjbGlnaHRib3gtbmF2IHsgbGVmdDogMDsgfQ0KI2xpZ2h0Ym94LW5hdiBhIHsgb3V0bGluZTogbm9uZTt9DQojbGlnaHRib3gtbmF2LWJ0blByZXYsICNsaWdodGJveC1uYXYtYnRuTmV4dCB7DQoJd2lkdGg6IDQ5JTsNCgloZWlnaHQ6IDEwMCU7DQoJem9vbTogMTsNCglkaXNwbGF5OiBibG9jazsNCn0NCiNsaWdodGJveC1uYXYtYnRuUHJldiB7IA0KCWxlZnQ6IDA7IA0KCWZsb2F0OiBsZWZ0Ow0KfQ0KI2xpZ2h0Ym94LW5hdi1idG5OZXh0IHsgDQoJcmlnaHQ6IDA7IA0KCWZsb2F0OiByaWdodDsNCn0NCiNsaWdodGJveC1jb250YWluZXItaW1hZ2UtZGF0YS1ib3ggew0KCWZvbnQ6IDEwcHggVmVyZGFuYSwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOw0KCWJhY2tncm91bmQtY29sb3I6ICNmZmY7DQoJbWFyZ2luOiAwIGF1dG87DQoJbGluZS1oZWlnaHQ6IDEuNGVtOw0KCW92ZXJmbG93OiBhdXRvOw0KCXdpZHRoOiAxMDAlOw0KCXBhZGRpbmc6IDAgMTBweCAwOw0KfQ0KI2xpZ2h0Ym94LWNvbnRhaW5lci1pbWFnZS1kYXRhIHsNCglwYWRkaW5nOiAwIDEwcHg7IA0KCWNvbG9yOiAjNjY2OyANCn0NCiNsaWdodGJveC1jb250YWluZXItaW1hZ2UtZGF0YSAjbGlnaHRib3gtaW1hZ2UtZGV0YWlscyB7IA0KCXdpZHRoOiA3MCU7IA0KCWZsb2F0OiBsZWZ0OyANCgl0ZXh0LWFsaWduOiBsZWZ0OyANCn0JDQojbGlnaHRib3gtaW1hZ2UtZGV0YWlscy1jYXB0aW9uIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0NCiNsaWdodGJveC1pbWFnZS1kZXRhaWxzLWN1cnJlbnROdW1iZXIgew0KCWRpc3BsYXk6IGJsb2NrOyANCgljbGVhcjogbGVmdDsgDQoJcGFkZGluZy1ib3R0b206IDEuMGVtOwkNCn0JCQkNCiNsaWdodGJveC1zZWNOYXYtYnRuQ2xvc2Ugew0KCXdpZHRoOiA2NnB4OyANCglmbG9hdDogcmlnaHQ7DQoJcGFkZGluZy1ib3R0b206IDAuN2VtOwkNCn0=]]></data>
	</file>
	<file>
	  <filename>/lib/lightbox.lib/images/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/lightbox.lib/images/lightbox-blank.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhAQABAID/AMDAwAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==]]></data>
	</file>
	<file>
	  <filename>/lib/lightbox.lib/images/lightbox-btn-close.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhQgAWANUAAP////39/fr6+vj4+PX19fDw8Ovr6+np6ebm5uTk5N/f39zc3Nra2tfX19XV1dLS0svLy8jIyL6+vre3t7S0tLKysq+vr6ioqKOjo56enpubm5aWlpGRkY+Pj4yMjIeHh4KCgoCAgH19fXZ2dnNzc3FxcW5ubmlpaWdnZ2RkZGJiYl9fX11dXVpaWlVVVVNTU1BQUE5OTktLS0lJSUZGRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAHAP8ALAAAAABCABYAAAb/QIBwSCwaj8ikcslsOp/QqLQZmFqvRAHngYxsBEaCw3EYHhwE5IFykZSLZ7RQPK4PBxzaimGEtGgcaXMZL4UvH0IXLw5HEoaFF0MEIo8RAA6PhUMWNC8xKw1EES0xLzQYQ5QfY2yJi0YRh2UKlBRCHC8XDhEZZZgcdYxCBiQzLzIqC0KjpTMhBUIULxlHisJEKCiCAAQoLEIvJEaYkUcGIzKeKAt+pTQgA0Pe20TWRQrTRYSMLyjjuUnOGYOBgtQxENsOHEJij4g0S6IA4gpEBJOICxjfEDmXDgaMYx/iDSHH8FU9kyMBTnrBguKlTNeIFCjx0ZMGMBUBVkPpKubL2XKXKLFQ8HNJgRM1Y3Qwgo9DSZ+ObBFxJKGIIxFFkywwUcrjMQ1ViLDwt9OnQkREcGkcQuJF1iMLUKSLkWLFRxlgTwK91NMIJaJC8GE14u1tkQUr0skgkSCCV7xhubUF5gCXJUUcMGJkpIAFCwkOKHgGnCHDmA/5LGoGyiCxCxkjDAiZ8DjvHEqFWFADoChTOQcoDKEADAC1od2YMglhwEIxCdlDKsjwSKMCnDFQFJAxEqdJgQ4yZjw3UiGGjBN8sKjP4mH8EQsnEKyfP0QAvSIB5NPfz7+/+iAAOw==]]></data>
	</file>
	<file>
	  <filename>/lib/lightbox.lib/images/lightbox-btn-next.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhPwAgAOYAAP////39/fv7+/n5+ff39/X19fPz8/Hx8e/v7+3t7evr6+np6efn5+bm5uTk5OLi4uDg4N7e3tzc3NjY2NbW1tLS0tDQ0M7OzsrKysjIyMbGxsLCwsDAwLy8vLq6ura2trS0tLOzs7Gxsa+vr62traurq6mpqaenp6WlpaOjo52dnZubm5mZmZGRkY+Pj42NjYuLi4eHh4WFhYODg4GBgYCAgH5+fnp6enh4eHZ2dnR0dHBwcG5ubmxsbGpqamhoaGZmZmRkZGJiYmBgYF5eXlxcXFpaWlhYWFZWVlRUVFJSUlBQUE5OTk1NTUtLS0lJSUdHR0VFRUNDQ////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEHAFMALAAAAAA/ACAAAAf/gFNTAISFhoeIiYqLjIiDjZCRkpOUlZaXmJmam5ydnp+goaKjpKWmp6igARomF4UCHCIABiAlJrcnDxQoroQKJRsOKSYlIyUnIASeAS5PQxGEAzZFAAxCSUFCQkUXDD1GEADMTRgWSEJGSkNDOAfLLUlMMsoDNUQAC0UzCQz9yhhNYATIwGRFgAENFqh4UmHBggDLXPx4wQQEAAE07i0w8iIRCyUhdvBAYKgElAWhmPlogOOIAwAZ8Q3hUQJFChIFCBG4scRIhUMmoDRIKZHAhCTzYi4IYkSHyBruxM14UiScoaBDVUk8ECBFkxIxhuArIgNBAgUKIAIQoeSEkBtRiQlhJfqDZIEeRYIAwWekBaIIR2oA+PDkxFWhdEkCMLfkBz4iOTpI9vBgAA0kEgAMuJFkQqG5qlrsiJtCSQ98QJpAWS3lhAgnhglRODJabpSsoAgQUCtOt7gDCMwmSFDgQFpDBxYIIFRAwfJU0CkFEBCgunXr0TXxzs69u/fv4MOLdzRekqDykAIBADs=]]></data>
	</file>
	<file>
	  <filename>/lib/lightbox.lib/images/lightbox-btn-prev.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhPwAgAOYAAP////39/fv7+/n5+fj4+Pb29vT09PLy8vDw8O7u7urq6unp6efn5+Xl5ePj4+Hh4d/f393d3dvb29ra2tjY2NbW1tTU1NDQ0M7OzszMzMvLy8nJycfHx8XFxcPDw8HBwb+/v729vby8vLq6uri4uLa2trKysq6urq2traurq6mpqaenp6Ojo6GhoZ+fn56enpycnJqampiYmJSUlJCQkI+Pj42NjYWFhYODg4GBgYCAgHx8fHp6enh4eHZ2dnR0dHJycnFxcW9vb21tbWtra2lpaWVlZWNjY2JiYmBgYF5eXlxcXFpaWlhYWFZWVlRUVFNTU1FRUU9PT01NTUtLS0lJSUdHR0JCQkBAQP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEHAFkALAAAAAA/ACAAAAf/gACCg4SFhoeIiYqGWVmLj5CRj46SlZaXmJmam5ydnp+goaKjpKWmp6ipmwMYICAfFQSCE64hGQuCBx4fvLwMGhwBgwMbG6IFOVFJyzsQAC1QSkpIRikAEUtOS0xMShc1URKDE0o2xzpCBQclVDYCLUsSAxFBTRQOUjQQFPwBH1MuBqmoguEcEAEAAjDxYYCFkgaCVkT5wGDKikIIiAwpAKCAjyDCQhXQEQRBgRJWbARgsUTEhBBHkkBw8ARHiBEkPCCM8UQDAAtVRIwqgCOKkiVJekwAwAKKkSVPgHQAIGGJkiJGjuAYAGDCFBkAZCRhMDSHEQ8dKMh6tkQDCiojnQRJiDLDAYQIDkLuEALhyAyE534YcpFEgQAfSA5QnWLNEIcpN5IUHKoDCFdCLpQ4ACCCyotrUWhUGG0hgaAEQ6rwCHmMB5HLg2A8cWagR5UND55YucIbiwlBAWBcOVEqwIIGrAUpkLBWQYUFAyRMmD4dwaADFDiq2n6JwIABAsIL+E4gOfdEAgKoX7/+vPv38OPLn0+//iVK9hU1CgQAOw==]]></data>
	</file>
	<file>
	  <filename>/lib/lightbox.lib/images/lightbox-ico-loading.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[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]]></data>
	</file>
	<file>
	  <filename>/lib/lightbox.lib/info.dat</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGluZm9bJ2pzJ10gPSAnanF1ZXJ5LmxpZ2h0Ym94LTAuNS5taW4uanMnOwokaW5mb1snY3NzJ10gPSAnY3NzL2pxdWVyeS5saWdodGJveC0wLjUuY3NzJzsKJGluZm9bJ2RlcGVuZHMnXSA9ICdqcXVlcnknOwokaW5mb1snanNfbm9taW5pZnknXSA9IDE7Cj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/lightbox.lib/jquery.lightbox-0.5.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBqUXVlcnkgbGlnaHRCb3ggcGx1Z2luDQogKiBUaGlzIGpRdWVyeSBwbHVnaW4gd2FzIGluc3BpcmVkIGFuZCBiYXNlZCBvbiBMaWdodGJveCAyIGJ5IExva2VzaCBEaGFrYXIgKGh0dHA6Ly93d3cuaHVkZGxldG9nZXRoZXIuY29tL3Byb2plY3RzL2xpZ2h0Ym94Mi8pDQogKiBhbmQgYWRhcHRlZCB0byBtZSBmb3IgdXNlIGxpa2UgYSBwbHVnaW4gZnJvbSBqUXVlcnkuDQogKiBAbmFtZSBqcXVlcnktbGlnaHRib3gtMC41LmpzDQogKiBAYXV0aG9yIExlYW5kcm8gVmllaXJhIFBpbmhvIC0gaHR0cDovL2xlYW5kcm92aWVpcmEuY29tDQogKiBAdmVyc2lvbiAwLjUNCiAqIEBkYXRlIEFwcmlsIDExLCAyMDA4DQogKiBAY2F0ZWdvcnkgalF1ZXJ5IHBsdWdpbg0KICogQGNvcHlyaWdodCAoYykgMjAwOCBMZWFuZHJvIFZpZWlyYSBQaW5obyAobGVhbmRyb3ZpZWlyYS5jb20pDQogKiBAbGljZW5zZSBDQ0F0dHJpYnV0aW9uLVNoYXJlQWxpa2UgMi41IEJyYXppbCAtIGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LXNhLzIuNS9ici9kZWVkLmVuX1VTDQogKiBAZXhhbXBsZSBWaXNpdCBodHRwOi8vbGVhbmRyb3ZpZWlyYS5jb20vcHJvamVjdHMvanF1ZXJ5L2xpZ2h0Ym94LyBmb3IgbW9yZSBpbmZvcm1hdGlvbnMgYWJvdXQgdGhpcyBqUXVlcnkgcGx1Z2luDQogKi8NCg0KLy8gT2ZmZXJpbmcgYSBDdXN0b20gQWxpYXMgc3Vwb3J0IC0gTW9yZSBpbmZvOiBodHRwOi8vZG9jcy5qcXVlcnkuY29tL1BsdWdpbnMvQXV0aG9yaW5nI0N1c3RvbV9BbGlhcw0KKGZ1bmN0aW9uKCQpIHsNCgkvKioNCgkgKiAkIGlzIGFuIGFsaWFzIHRvIGpRdWVyeSBvYmplY3QNCgkgKg0KCSAqLw0KCSQuZm4ubGlnaHRCb3ggPSBmdW5jdGlvbihzZXR0aW5ncykgew0KCQkvLyBTZXR0aW5ncyB0byBjb25maWd1cmUgdGhlIGpRdWVyeSBsaWdodEJveCBwbHVnaW4gaG93IHlvdSBsaWtlDQoJCXNldHRpbmdzID0galF1ZXJ5LmV4dGVuZCh7DQoJCQkvLyBDb25maWd1cmF0aW9uIHJlbGF0ZWQgdG8gb3ZlcmxheQ0KCQkJb3ZlcmxheUJnQ29sb3I6IAkJJyMwMDAnLAkJLy8gKHN0cmluZykgQmFja2dyb3VuZCBjb2xvciB0byBvdmVybGF5OyBpbmZvcm0gYSBoZXhhZGVjaW1hbCB2YWx1ZSBsaWtlOiAjUlJHR0JCLiBXaGVyZSBSUiwgR0csIGFuZCBCQiBhcmUgdGhlIGhleGFkZWNpbWFsIHZhbHVlcyBmb3IgdGhlIHJlZCwgZ3JlZW4sIGFuZCBibHVlIHZhbHVlcyBvZiB0aGUgY29sb3IuDQoJCQlvdmVybGF5T3BhY2l0eToJCQkwLjgsCQkvLyAoaW50ZWdlcikgT3BhY2l0eSB2YWx1ZSB0byBvdmVybGF5OyBpbmZvcm06IDAuWC4gV2hlcmUgWCBhcmUgbnVtYmVyIGZyb20gMCB0byA5DQoJCQkvLyBDb25maWd1cmF0aW9uIHJlbGF0ZWQgdG8gbmF2aWdhdGlvbg0KCQkJZml4ZWROYXZpZ2F0aW9uOgkJZmFsc2UsCQkvLyAoYm9vbGVhbikgQm9vbGVhbiB0aGF0IGluZm9ybXMgaWYgdGhlIG5hdmlnYXRpb24gKG5leHQgYW5kIHByZXYgYnV0dG9uKSB3aWxsIGJlIGZpeGVkIG9yIG5vdCBpbiB0aGUgaW50ZXJmYWNlLg0KCQkJLy8gQ29uZmlndXJhdGlvbiByZWxhdGVkIHRvIGltYWdlcw0KCQkJaW1hZ2VMb2FkaW5nOgkJCSdpbWFnZXMvbGlnaHRib3gtaWNvLWxvYWRpbmcuZ2lmJywJCS8vIChzdHJpbmcpIFBhdGggYW5kIHRoZSBuYW1lIG9mIHRoZSBsb2FkaW5nIGljb24NCgkJCWltYWdlQnRuUHJldjoJCQknaW1hZ2VzL2xpZ2h0Ym94LWJ0bi1wcmV2LmdpZicsCQkJLy8gKHN0cmluZykgUGF0aCBhbmQgdGhlIG5hbWUgb2YgdGhlIHByZXYgYnV0dG9uIGltYWdlDQoJCQlpbWFnZUJ0bk5leHQ6CQkJJ2ltYWdlcy9saWdodGJveC1idG4tbmV4dC5naWYnLAkJCS8vIChzdHJpbmcpIFBhdGggYW5kIHRoZSBuYW1lIG9mIHRoZSBuZXh0IGJ1dHRvbiBpbWFnZQ0KCQkJaW1hZ2VCdG5DbG9zZToJCQknaW1hZ2VzL2xpZ2h0Ym94LWJ0bi1jbG9zZS5naWYnLAkJLy8gKHN0cmluZykgUGF0aCBhbmQgdGhlIG5hbWUgb2YgdGhlIGNsb3NlIGJ0bg0KCQkJaW1hZ2VCbGFuazoJCQkJJ2ltYWdlcy9saWdodGJveC1ibGFuay5naWYnLAkJCS8vIChzdHJpbmcpIFBhdGggYW5kIHRoZSBuYW1lIG9mIGEgYmxhbmsgaW1hZ2UgKG9uZSBwaXhlbCkNCgkJCS8vIENvbmZpZ3VyYXRpb24gcmVsYXRlZCB0byBjb250YWluZXIgaW1hZ2UgYm94DQoJCQljb250YWluZXJCb3JkZXJTaXplOgkxMCwJCQkvLyAoaW50ZWdlcikgSWYgeW91IGFkanVzdCB0aGUgcGFkZGluZyBpbiB0aGUgQ1NTIGZvciB0aGUgY29udGFpbmVyLCAjbGlnaHRib3gtY29udGFpbmVyLWltYWdlLWJveCwgeW91IHdpbGwgbmVlZCB0byB1cGRhdGUgdGhpcyB2YWx1ZQ0KCQkJY29udGFpbmVyUmVzaXplU3BlZWQ6CTQwMCwJCS8vIChpbnRlZ2VyKSBTcGVjaWZ5IHRoZSByZXNpemUgZHVyYXRpb24gb2YgY29udGFpbmVyIGltYWdlLiBUaGVzZSBudW1iZXIgYXJlIG1pbGlzZWNvbmRzLiA0MDAgaXMgZGVmYXVsdC4NCgkJCS8vIENvbmZpZ3VyYXRpb24gcmVsYXRlZCB0byB0ZXh0cyBpbiBjYXB0aW9uLiBGb3IgZXhhbXBsZTogSW1hZ2UgMiBvZiA4LiBZb3UgY2FuIGFsdGVyIGVpdGhlciAiSW1hZ2UiIGFuZCAib2YiIHRleHRzLg0KCQkJdHh0SW1hZ2U6CQkJCSdJbWFnZScsCS8vIChzdHJpbmcpIFNwZWNpZnkgdGV4dCAiSW1hZ2UiDQoJCQl0eHRPZjoJCQkJCSdvZicsCQkvLyAoc3RyaW5nKSBTcGVjaWZ5IHRleHQgIm9mIg0KCQkJLy8gQ29uZmlndXJhdGlvbiByZWxhdGVkIHRvIGtleWJvYXJkIG5hdmlnYXRpb24NCgkJCWtleVRvQ2xvc2U6CQkJCSdjJywJCS8vIChzdHJpbmcpIChjID0gY2xvc2UpIExldHRlciB0byBjbG9zZSB0aGUgalF1ZXJ5IGxpZ2h0Qm94IGludGVyZmFjZS4gQmV5b25kIHRoaXMgbGV0dGVyLCB0aGUgbGV0dGVyIFggYW5kIHRoZSBTQ0FQRSBrZXkgaXMgdXNlZCB0by4NCgkJCWtleVRvUHJldjoJCQkJJ3AnLAkJLy8gKHN0cmluZykgKHAgPSBwcmV2aW91cykgTGV0dGVyIHRvIHNob3cgdGhlIHByZXZpb3VzIGltYWdlDQoJCQlrZXlUb05leHQ6CQkJCSduJywJCS8vIChzdHJpbmcpIChuID0gbmV4dCkgTGV0dGVyIHRvIHNob3cgdGhlIG5leHQgaW1hZ2UuDQoJCQkvLyBEb260dCBhbHRlciB0aGVzZSB2YXJpYWJsZXMgaW4gYW55IHdheQ0KCQkJaW1hZ2VBcnJheToJCQkJW10sDQoJCQlhY3RpdmVJbWFnZToJCQkwDQoJCX0sc2V0dGluZ3MpOw0KCQkvLyBDYWNoaW5nIHRoZSBqUXVlcnkgb2JqZWN0IHdpdGggYWxsIGVsZW1lbnRzIG1hdGNoZWQNCgkJdmFyIGpRdWVyeU1hdGNoZWRPYmogPSB0aGlzOyAvLyBUaGlzLCBpbiB0aGlzIGNvbnRleHQsIHJlZmVyIHRvIGpRdWVyeSBvYmplY3QNCgkJLyoqDQoJCSAqIEluaXRpYWxpemluZyB0aGUgcGx1Z2luIGNhbGxpbmcgdGhlIHN0YXJ0IGZ1bmN0aW9uDQoJCSAqDQoJCSAqIEByZXR1cm4gYm9vbGVhbiBmYWxzZQ0KCQkgKi8NCgkJZnVuY3Rpb24gX2luaXRpYWxpemUoKSB7DQoJCQlfc3RhcnQodGhpcyxqUXVlcnlNYXRjaGVkT2JqKTsgLy8gVGhpcywgaW4gdGhpcyBjb250ZXh0LCByZWZlciB0byBvYmplY3QgKGxpbmspIHdoaWNoIHRoZSB1c2VyIGhhdmUgY2xpY2tlZA0KCQkJcmV0dXJuIGZhbHNlOyAvLyBBdm9pZCB0aGUgYnJvd3NlciBmb2xsb3dpbmcgdGhlIGxpbmsNCgkJfQ0KCQkvKioNCgkJICogU3RhcnQgdGhlIGpRdWVyeSBsaWdodEJveCBwbHVnaW4NCgkJICoNCgkJICogQHBhcmFtIG9iamVjdCBvYmpDbGlja2VkIFRoZSBvYmplY3QgKGxpbmspIHdoaWNrIHRoZSB1c2VyIGhhdmUgY2xpY2tlZA0KCQkgKiBAcGFyYW0gb2JqZWN0IGpRdWVyeU1hdGNoZWRPYmogVGhlIGpRdWVyeSBvYmplY3Qgd2l0aCBhbGwgZWxlbWVudHMgbWF0Y2hlZA0KCQkgKi8NCgkJZnVuY3Rpb24gX3N0YXJ0KG9iakNsaWNrZWQsalF1ZXJ5TWF0Y2hlZE9iaikgew0KCQkJLy8gSGltZSBzb21lIGVsZW1lbnRzIHRvIGF2b2lkIGNvbmZsaWN0IHdpdGggb3ZlcmxheSBpbiBJRS4gVGhlc2UgZWxlbWVudHMgYXBwZWFyIGFib3ZlIHRoZSBvdmVybGF5Lg0KCQkJJCgnZW1iZWQsIG9iamVjdCwgc2VsZWN0JykuY3NzKHsgJ3Zpc2liaWxpdHknIDogJ2hpZGRlbicgfSk7DQoJCQkvLyBDYWxsIHRoZSBmdW5jdGlvbiB0byBjcmVhdGUgdGhlIG1hcmt1cCBzdHJ1Y3R1cmU7IHN0eWxlIHNvbWUgZWxlbWVudHM7IGFzc2lnbiBldmVudHMgaW4gc29tZSBlbGVtZW50cy4NCgkJCV9zZXRfaW50ZXJmYWNlKCk7DQoJCQkvLyBVbnNldCB0b3RhbCBpbWFnZXMgaW4gaW1hZ2VBcnJheQ0KCQkJc2V0dGluZ3MuaW1hZ2VBcnJheS5sZW5ndGggPSAwOw0KCQkJLy8gVW5zZXQgaW1hZ2UgYWN0aXZlIGluZm9ybWF0aW9uDQoJCQlzZXR0aW5ncy5hY3RpdmVJbWFnZSA9IDA7DQoJCQkvLyBXZSBoYXZlIGFuIGltYWdlIHNldD8gT3IganVzdCBhbiBpbWFnZT8gTGV0tHMgc2VlIGl0Lg0KCQkJaWYgKCBqUXVlcnlNYXRjaGVkT2JqLmxlbmd0aCA9PSAxICkgew0KCQkJCXNldHRpbmdzLmltYWdlQXJyYXkucHVzaChuZXcgQXJyYXkob2JqQ2xpY2tlZC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSxvYmpDbGlja2VkLmdldEF0dHJpYnV0ZSgndGl0bGUnKSkpOw0KCQkJfSBlbHNlIHsNCgkJCQkvLyBBZGQgYW4gQXJyYXkgKGFzIG1hbnkgYXMgd2UgaGF2ZSksIHdpdGggaHJlZiBhbmQgdGl0bGUgYXRyaWJ1dGVzLCBpbnNpZGUgdGhlIEFycmF5IHRoYXQgc3RvcmFnZSB0aGUgaW1hZ2VzIHJlZmVyZW5jZXMJCQ0KCQkJCWZvciAoIHZhciBpID0gMDsgaSA8IGpRdWVyeU1hdGNoZWRPYmoubGVuZ3RoOyBpKysgKSB7DQoJCQkJCXNldHRpbmdzLmltYWdlQXJyYXkucHVzaChuZXcgQXJyYXkoalF1ZXJ5TWF0Y2hlZE9ialtpXS5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSxqUXVlcnlNYXRjaGVkT2JqW2ldLmdldEF0dHJpYnV0ZSgndGl0bGUnKSkpOw0KCQkJCX0NCgkJCX0NCgkJCXdoaWxlICggc2V0dGluZ3MuaW1hZ2VBcnJheVtzZXR0aW5ncy5hY3RpdmVJbWFnZV1bMF0gIT0gb2JqQ2xpY2tlZC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSApIHsNCgkJCQlzZXR0aW5ncy5hY3RpdmVJbWFnZSsrOw0KCQkJfQ0KCQkJLy8gQ2FsbCB0aGUgZnVuY3Rpb24gdGhhdCBwcmVwYXJlcyBpbWFnZSBleGliaXRpb24NCgkJCV9zZXRfaW1hZ2VfdG9fdmlldygpOw0KCQl9DQoJCS8qKg0KCQkgKiBDcmVhdGUgdGhlIGpRdWVyeSBsaWdodEJveCBwbHVnaW4gaW50ZXJmYWNlDQoJCSAqDQoJCSAqIFRoZSBIVE1MIG1hcmt1cCB3aWxsIGJlIGxpa2UgdGhhdDoNCgkJCTxkaXYgaWQ9ImpxdWVyeS1vdmVybGF5Ij48L2Rpdj4NCgkJCTxkaXYgaWQ9ImpxdWVyeS1saWdodGJveCI+DQoJCQkJPGRpdiBpZD0ibGlnaHRib3gtY29udGFpbmVyLWltYWdlLWJveCI+DQoJCQkJCTxkaXYgaWQ9ImxpZ2h0Ym94LWNvbnRhaW5lci1pbWFnZSI+DQoJCQkJCQk8aW1nIHNyYz0iLi4vZm90b3MvWFguanBnIiBpZD0ibGlnaHRib3gtaW1hZ2UiPg0KCQkJCQkJPGRpdiBpZD0ibGlnaHRib3gtbmF2Ij4NCgkJCQkJCQk8YSBocmVmPSIjIiBpZD0ibGlnaHRib3gtbmF2LWJ0blByZXYiPjwvYT4NCgkJCQkJCQk8YSBocmVmPSIjIiBpZD0ibGlnaHRib3gtbmF2LWJ0bk5leHQiPjwvYT4NCgkJCQkJCTwvZGl2Pg0KCQkJCQkJPGRpdiBpZD0ibGlnaHRib3gtbG9hZGluZyI+DQoJCQkJCQkJPGEgaHJlZj0iIyIgaWQ9ImxpZ2h0Ym94LWxvYWRpbmctbGluayI+DQoJCQkJCQkJCTxpbWcgc3JjPSIuLi9pbWFnZXMvbGlnaHRib3gtaWNvLWxvYWRpbmcuZ2lmIj4NCgkJCQkJCQk8L2E+DQoJCQkJCQk8L2Rpdj4NCgkJCQkJPC9kaXY+DQoJCQkJPC9kaXY+DQoJCQkJPGRpdiBpZD0ibGlnaHRib3gtY29udGFpbmVyLWltYWdlLWRhdGEtYm94Ij4NCgkJCQkJPGRpdiBpZD0ibGlnaHRib3gtY29udGFpbmVyLWltYWdlLWRhdGEiPg0KCQkJCQkJPGRpdiBpZD0ibGlnaHRib3gtaW1hZ2UtZGV0YWlscyI+DQoJCQkJCQkJPHNwYW4gaWQ9ImxpZ2h0Ym94LWltYWdlLWRldGFpbHMtY2FwdGlvbiI+PC9zcGFuPg0KCQkJCQkJCTxzcGFuIGlkPSJsaWdodGJveC1pbWFnZS1kZXRhaWxzLWN1cnJlbnROdW1iZXIiPjwvc3Bhbj4NCgkJCQkJCTwvZGl2Pg0KCQkJCQkJPGRpdiBpZD0ibGlnaHRib3gtc2VjTmF2Ij4NCgkJCQkJCQk8YSBocmVmPSIjIiBpZD0ibGlnaHRib3gtc2VjTmF2LWJ0bkNsb3NlIj4NCgkJCQkJCQkJPGltZyBzcmM9Ii4uL2ltYWdlcy9saWdodGJveC1idG4tY2xvc2UuZ2lmIj4NCgkJCQkJCQk8L2E+DQoJCQkJCQk8L2Rpdj4NCgkJCQkJPC9kaXY+DQoJCQkJPC9kaXY+DQoJCQk8L2Rpdj4NCgkJICoNCgkJICovDQoJCWZ1bmN0aW9uIF9zZXRfaW50ZXJmYWNlKCkgew0KCQkJLy8gQXBwbHkgdGhlIEhUTUwgbWFya3VwIGludG8gYm9keSB0YWcNCgkJCSQoJ2JvZHknKS5hcHBlbmQoJzxkaXYgaWQ9ImpxdWVyeS1vdmVybGF5Ij48L2Rpdj48ZGl2IGlkPSJqcXVlcnktbGlnaHRib3giPjxkaXYgaWQ9ImxpZ2h0Ym94LWNvbnRhaW5lci1pbWFnZS1ib3giPjxkaXYgaWQ9ImxpZ2h0Ym94LWNvbnRhaW5lci1pbWFnZSI+PGltZyBpZD0ibGlnaHRib3gtaW1hZ2UiPjxkaXYgc3R5bGU9IiIgaWQ9ImxpZ2h0Ym94LW5hdiI+PGEgaHJlZj0iIyIgaWQ9ImxpZ2h0Ym94LW5hdi1idG5QcmV2Ij48L2E+PGEgaHJlZj0iIyIgaWQ9ImxpZ2h0Ym94LW5hdi1idG5OZXh0Ij48L2E+PC9kaXY+PGRpdiBpZD0ibGlnaHRib3gtbG9hZGluZyI+PGEgaHJlZj0iIyIgaWQ9ImxpZ2h0Ym94LWxvYWRpbmctbGluayI+PGltZyBzcmM9IicgKyBzZXR0aW5ncy5pbWFnZUxvYWRpbmcgKyAnIj48L2E+PC9kaXY+PC9kaXY+PC9kaXY+PGRpdiBpZD0ibGlnaHRib3gtY29udGFpbmVyLWltYWdlLWRhdGEtYm94Ij48ZGl2IGlkPSJsaWdodGJveC1jb250YWluZXItaW1hZ2UtZGF0YSI+PGRpdiBpZD0ibGlnaHRib3gtaW1hZ2UtZGV0YWlscyI+PHNwYW4gaWQ9ImxpZ2h0Ym94LWltYWdlLWRldGFpbHMtY2FwdGlvbiI+PC9zcGFuPjxzcGFuIGlkPSJsaWdodGJveC1pbWFnZS1kZXRhaWxzLWN1cnJlbnROdW1iZXIiPjwvc3Bhbj48L2Rpdj48ZGl2IGlkPSJsaWdodGJveC1zZWNOYXYiPjxhIGhyZWY9IiMiIGlkPSJsaWdodGJveC1zZWNOYXYtYnRuQ2xvc2UiPjxpbWcgc3JjPSInICsgc2V0dGluZ3MuaW1hZ2VCdG5DbG9zZSArICciPjwvYT48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj4nKTsJDQoJCQkvLyBHZXQgcGFnZSBzaXplcw0KCQkJdmFyIGFyclBhZ2VTaXplcyA9IF9fX2dldFBhZ2VTaXplKCk7DQoJCQkvLyBTdHlsZSBvdmVybGF5IGFuZCBzaG93IGl0DQoJCQkkKCcjanF1ZXJ5LW92ZXJsYXknKS5jc3Moew0KCQkJCWJhY2tncm91bmRDb2xvcjoJc2V0dGluZ3Mub3ZlcmxheUJnQ29sb3IsDQoJCQkJb3BhY2l0eToJCQlzZXR0aW5ncy5vdmVybGF5T3BhY2l0eSwNCgkJCQl3aWR0aDoJCQkJYXJyUGFnZVNpemVzWzBdLA0KCQkJCWhlaWdodDoJCQkJYXJyUGFnZVNpemVzWzFdDQoJCQl9KS5mYWRlSW4oKTsNCgkJCS8vIEdldCBwYWdlIHNjcm9sbA0KCQkJdmFyIGFyclBhZ2VTY3JvbGwgPSBfX19nZXRQYWdlU2Nyb2xsKCk7DQoJCQkvLyBDYWxjdWxhdGUgdG9wIGFuZCBsZWZ0IG9mZnNldCBmb3IgdGhlIGpxdWVyeS1saWdodGJveCBkaXYgb2JqZWN0IGFuZCBzaG93IGl0DQoJCQkkKCcjanF1ZXJ5LWxpZ2h0Ym94JykuY3NzKHsNCgkJCQl0b3A6CWFyclBhZ2VTY3JvbGxbMV0gKyAoYXJyUGFnZVNpemVzWzNdIC8gMTApLA0KCQkJCWxlZnQ6CWFyclBhZ2VTY3JvbGxbMF0NCgkJCX0pLnNob3coKTsNCgkJCS8vIEFzc2lnbmluZyBjbGljayBldmVudHMgaW4gZWxlbWVudHMgdG8gY2xvc2Ugb3ZlcmxheQ0KCQkJJCgnI2pxdWVyeS1vdmVybGF5LCNqcXVlcnktbGlnaHRib3gnKS5jbGljayhmdW5jdGlvbigpIHsNCgkJCQlfZmluaXNoKCk7CQkJCQkJCQkJDQoJCQl9KTsNCgkJCS8vIEFzc2lnbiB0aGUgX2ZpbmlzaCBmdW5jdGlvbiB0byBsaWdodGJveC1sb2FkaW5nLWxpbmsgYW5kIGxpZ2h0Ym94LXNlY05hdi1idG5DbG9zZSBvYmplY3RzDQoJCQkkKCcjbGlnaHRib3gtbG9hZGluZy1saW5rLCNsaWdodGJveC1zZWNOYXYtYnRuQ2xvc2UnKS5jbGljayhmdW5jdGlvbigpIHsNCgkJCQlfZmluaXNoKCk7DQoJCQkJcmV0dXJuIGZhbHNlOw0KCQkJfSk7DQoJCQkvLyBJZiB3aW5kb3cgd2FzIHJlc2l6ZWQsIGNhbGN1bGF0ZSB0aGUgbmV3IG92ZXJsYXkgZGltZW5zaW9ucw0KCQkJJCh3aW5kb3cpLnJlc2l6ZShmdW5jdGlvbigpIHsNCgkJCQkvLyBHZXQgcGFnZSBzaXplcw0KCQkJCXZhciBhcnJQYWdlU2l6ZXMgPSBfX19nZXRQYWdlU2l6ZSgpOw0KCQkJCS8vIFN0eWxlIG92ZXJsYXkgYW5kIHNob3cgaXQNCgkJCQkkKCcjanF1ZXJ5LW92ZXJsYXknKS5jc3Moew0KCQkJCQl3aWR0aDoJCWFyclBhZ2VTaXplc1swXSwNCgkJCQkJaGVpZ2h0OgkJYXJyUGFnZVNpemVzWzFdDQoJCQkJfSk7DQoJCQkJLy8gR2V0IHBhZ2Ugc2Nyb2xsDQoJCQkJdmFyIGFyclBhZ2VTY3JvbGwgPSBfX19nZXRQYWdlU2Nyb2xsKCk7DQoJCQkJLy8gQ2FsY3VsYXRlIHRvcCBhbmQgbGVmdCBvZmZzZXQgZm9yIHRoZSBqcXVlcnktbGlnaHRib3ggZGl2IG9iamVjdCBhbmQgc2hvdyBpdA0KCQkJCSQoJyNqcXVlcnktbGlnaHRib3gnKS5jc3Moew0KCQkJCQl0b3A6CWFyclBhZ2VTY3JvbGxbMV0gKyAoYXJyUGFnZVNpemVzWzNdIC8gMTApLA0KCQkJCQlsZWZ0OglhcnJQYWdlU2Nyb2xsWzBdDQoJCQkJfSk7DQoJCQl9KTsNCgkJfQ0KCQkvKioNCgkJICogUHJlcGFyZXMgaW1hZ2UgZXhpYml0aW9uOyBkb2luZyBhIGltYWdltHMgcHJlbG9hZGVyIHRvIGNhbGN1bGF0ZSBpdLRzIHNpemUNCgkJICoNCgkJICovDQoJCWZ1bmN0aW9uIF9zZXRfaW1hZ2VfdG9fdmlldygpIHsgLy8gc2hvdyB0aGUgbG9hZGluZw0KCQkJLy8gU2hvdyB0aGUgbG9hZGluZw0KCQkJJCgnI2xpZ2h0Ym94LWxvYWRpbmcnKS5zaG93KCk7DQoJCQlpZiAoIHNldHRpbmdzLmZpeGVkTmF2aWdhdGlvbiApIHsNCgkJCQkkKCcjbGlnaHRib3gtaW1hZ2UsI2xpZ2h0Ym94LWNvbnRhaW5lci1pbWFnZS1kYXRhLWJveCwjbGlnaHRib3gtaW1hZ2UtZGV0YWlscy1jdXJyZW50TnVtYmVyJykuaGlkZSgpOw0KCQkJfSBlbHNlIHsNCgkJCQkvLyBIaWRlIHNvbWUgZWxlbWVudHMNCgkJCQkkKCcjbGlnaHRib3gtaW1hZ2UsI2xpZ2h0Ym94LW5hdiwjbGlnaHRib3gtbmF2LWJ0blByZXYsI2xpZ2h0Ym94LW5hdi1idG5OZXh0LCNsaWdodGJveC1jb250YWluZXItaW1hZ2UtZGF0YS1ib3gsI2xpZ2h0Ym94LWltYWdlLWRldGFpbHMtY3VycmVudE51bWJlcicpLmhpZGUoKTsNCgkJCX0NCgkJCS8vIEltYWdlIHByZWxvYWQgcHJvY2Vzcw0KCQkJdmFyIG9iakltYWdlUHJlbG9hZGVyID0gbmV3IEltYWdlKCk7DQoJCQlvYmpJbWFnZVByZWxvYWRlci5vbmxvYWQgPSBmdW5jdGlvbigpIHsNCgkJCQkkKCcjbGlnaHRib3gtaW1hZ2UnKS5hdHRyKCdzcmMnLHNldHRpbmdzLmltYWdlQXJyYXlbc2V0dGluZ3MuYWN0aXZlSW1hZ2VdWzBdKTsNCgkJCQkvLyBQZXJmb21hbmNlIGFuIGVmZmVjdCBpbiB0aGUgaW1hZ2UgY29udGFpbmVyIHJlc2l6aW5nIGl0DQoJCQkJX3Jlc2l6ZV9jb250YWluZXJfaW1hZ2VfYm94KG9iakltYWdlUHJlbG9hZGVyLndpZHRoLG9iakltYWdlUHJlbG9hZGVyLmhlaWdodCk7DQoJCQkJLy8JY2xlYXIgb25Mb2FkLCBJRSBiZWhhdmVzIGlycmF0aWNhbGx5IHdpdGggYW5pbWF0ZWQgZ2lmcyBvdGhlcndpc2UNCgkJCQlvYmpJbWFnZVByZWxvYWRlci5vbmxvYWQ9ZnVuY3Rpb24oKXt9Ow0KCQkJfTsNCgkJCW9iakltYWdlUHJlbG9hZGVyLnNyYyA9IHNldHRpbmdzLmltYWdlQXJyYXlbc2V0dGluZ3MuYWN0aXZlSW1hZ2VdWzBdOw0KCQl9Ow0KCQkvKioNCgkJICogUGVyZm9tYW5jZSBhbiBlZmZlY3QgaW4gdGhlIGltYWdlIGNvbnRhaW5lciByZXNpemluZyBpdA0KCQkgKg0KCQkgKiBAcGFyYW0gaW50ZWdlciBpbnRJbWFnZVdpZHRoIFRoZSBpbWFnZbRzIHdpZHRoIHRoYXQgd2lsbCBiZSBzaG93ZWQNCgkJICogQHBhcmFtIGludGVnZXIgaW50SW1hZ2VIZWlnaHQgVGhlIGltYWdltHMgaGVpZ2h0IHRoYXQgd2lsbCBiZSBzaG93ZWQNCgkJICovDQoJCWZ1bmN0aW9uIF9yZXNpemVfY29udGFpbmVyX2ltYWdlX2JveChpbnRJbWFnZVdpZHRoLGludEltYWdlSGVpZ2h0KSB7DQoJCQkvLyBHZXQgY3VycmVudCB3aWR0aCBhbmQgaGVpZ2h0DQoJCQl2YXIgaW50Q3VycmVudFdpZHRoID0gJCgnI2xpZ2h0Ym94LWNvbnRhaW5lci1pbWFnZS1ib3gnKS53aWR0aCgpOw0KCQkJdmFyIGludEN1cnJlbnRIZWlnaHQgPSAkKCcjbGlnaHRib3gtY29udGFpbmVyLWltYWdlLWJveCcpLmhlaWdodCgpOw0KCQkJLy8gR2V0IHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBzZWxlY3RlZCBpbWFnZSBwbHVzIHRoZSBwYWRkaW5nDQoJCQl2YXIgaW50V2lkdGggPSAoaW50SW1hZ2VXaWR0aCArIChzZXR0aW5ncy5jb250YWluZXJCb3JkZXJTaXplICogMikpOyAvLyBQbHVzIHRoZSBpbWFnZbRzIHdpZHRoIGFuZCB0aGUgbGVmdCBhbmQgcmlnaHQgcGFkZGluZyB2YWx1ZQ0KCQkJdmFyIGludEhlaWdodCA9IChpbnRJbWFnZUhlaWdodCArIChzZXR0aW5ncy5jb250YWluZXJCb3JkZXJTaXplICogMikpOyAvLyBQbHVzIHRoZSBpbWFnZbRzIGhlaWdodCBhbmQgdGhlIGxlZnQgYW5kIHJpZ2h0IHBhZGRpbmcgdmFsdWUNCgkJCS8vIERpZmVyZW5jZXMNCgkJCXZhciBpbnREaWZmVyA9IGludEN1cnJlbnRXaWR0aCAtIGludFdpZHRoOw0KCQkJdmFyIGludERpZmZIID0gaW50Q3VycmVudEhlaWdodCAtIGludEhlaWdodDsNCgkJCS8vIFBlcmZvbWFuY2UgdGhlIGVmZmVjdA0KCQkJJCgnI2xpZ2h0Ym94LWNvbnRhaW5lci1pbWFnZS1ib3gnKS5hbmltYXRlKHsgd2lkdGg6IGludFdpZHRoLCBoZWlnaHQ6IGludEhlaWdodCB9LHNldHRpbmdzLmNvbnRhaW5lclJlc2l6ZVNwZWVkLGZ1bmN0aW9uKCkgeyBfc2hvd19pbWFnZSgpOyB9KTsNCgkJCWlmICggKCBpbnREaWZmVyA9PSAwICkgJiYgKCBpbnREaWZmSCA9PSAwICkgKSB7DQoJCQkJaWYgKCAkLmJyb3dzZXIubXNpZSApIHsNCgkJCQkJX19fcGF1c2UoMjUwKTsNCgkJCQl9IGVsc2Ugew0KCQkJCQlfX19wYXVzZSgxMDApOwkNCgkJCQl9DQoJCQl9IA0KCQkJJCgnI2xpZ2h0Ym94LWNvbnRhaW5lci1pbWFnZS1kYXRhLWJveCcpLmNzcyh7IHdpZHRoOiBpbnRJbWFnZVdpZHRoIH0pOw0KCQkJJCgnI2xpZ2h0Ym94LW5hdi1idG5QcmV2LCNsaWdodGJveC1uYXYtYnRuTmV4dCcpLmNzcyh7IGhlaWdodDogaW50SW1hZ2VIZWlnaHQgKyAoc2V0dGluZ3MuY29udGFpbmVyQm9yZGVyU2l6ZSAqIDIpIH0pOw0KCQl9Ow0KCQkvKioNCgkJICogU2hvdyB0aGUgcHJlcGFyZWQgaW1hZ2UNCgkJICoNCgkJICovDQoJCWZ1bmN0aW9uIF9zaG93X2ltYWdlKCkgew0KCQkJJCgnI2xpZ2h0Ym94LWxvYWRpbmcnKS5oaWRlKCk7DQoJCQkkKCcjbGlnaHRib3gtaW1hZ2UnKS5mYWRlSW4oZnVuY3Rpb24oKSB7DQoJCQkJX3Nob3dfaW1hZ2VfZGF0YSgpOw0KCQkJCV9zZXRfbmF2aWdhdGlvbigpOw0KCQkJfSk7DQoJCQlfcHJlbG9hZF9uZWlnaGJvcl9pbWFnZXMoKTsNCgkJfTsNCgkJLyoqDQoJCSAqIFNob3cgdGhlIGltYWdlIGluZm9ybWF0aW9uDQoJCSAqDQoJCSAqLw0KCQlmdW5jdGlvbiBfc2hvd19pbWFnZV9kYXRhKCkgew0KCQkJJCgnI2xpZ2h0Ym94LWNvbnRhaW5lci1pbWFnZS1kYXRhLWJveCcpLnNsaWRlRG93bignZmFzdCcpOw0KCQkJJCgnI2xpZ2h0Ym94LWltYWdlLWRldGFpbHMtY2FwdGlvbicpLmhpZGUoKTsNCgkJCWlmICggc2V0dGluZ3MuaW1hZ2VBcnJheVtzZXR0aW5ncy5hY3RpdmVJbWFnZV1bMV0gKSB7DQoJCQkJJCgnI2xpZ2h0Ym94LWltYWdlLWRldGFpbHMtY2FwdGlvbicpLmh0bWwoc2V0dGluZ3MuaW1hZ2VBcnJheVtzZXR0aW5ncy5hY3RpdmVJbWFnZV1bMV0pLnNob3coKTsNCgkJCX0NCgkJCS8vIElmIHdlIGhhdmUgYSBpbWFnZSBzZXQsIGRpc3BsYXkgJ0ltYWdlIFggb2YgWCcNCgkJCWlmICggc2V0dGluZ3MuaW1hZ2VBcnJheS5sZW5ndGggPiAxICkgew0KCQkJCSQoJyNsaWdodGJveC1pbWFnZS1kZXRhaWxzLWN1cnJlbnROdW1iZXInKS5odG1sKHNldHRpbmdzLnR4dEltYWdlICsgJyAnICsgKCBzZXR0aW5ncy5hY3RpdmVJbWFnZSArIDEgKSArICcgJyArIHNldHRpbmdzLnR4dE9mICsgJyAnICsgc2V0dGluZ3MuaW1hZ2VBcnJheS5sZW5ndGgpLnNob3coKTsNCgkJCX0JCQ0KCQl9DQoJCS8qKg0KCQkgKiBEaXNwbGF5IHRoZSBidXR0b24gbmF2aWdhdGlvbnMNCgkJICoNCgkJICovDQoJCWZ1bmN0aW9uIF9zZXRfbmF2aWdhdGlvbigpIHsNCgkJCSQoJyNsaWdodGJveC1uYXYnKS5zaG93KCk7DQoNCgkJCS8vIEluc3RlYWQgdG8gZGVmaW5lIHRoaXMgY29uZmlndXJhdGlvbiBpbiBDU1MgZmlsZSwgd2UgZGVmaW5lIGhlcmUuIEFuZCBpdLRzIG5lZWQgdG8gSUUuIEp1c3QuDQoJCQkkKCcjbGlnaHRib3gtbmF2LWJ0blByZXYsI2xpZ2h0Ym94LW5hdi1idG5OZXh0JykuY3NzKHsgJ2JhY2tncm91bmQnIDogJ3RyYW5zcGFyZW50IHVybCgnICsgc2V0dGluZ3MuaW1hZ2VCbGFuayArICcpIG5vLXJlcGVhdCcgfSk7DQoJCQkNCgkJCS8vIFNob3cgdGhlIHByZXYgYnV0dG9uLCBpZiBub3QgdGhlIGZpcnN0IGltYWdlIGluIHNldA0KCQkJaWYgKCBzZXR0aW5ncy5hY3RpdmVJbWFnZSAhPSAwICkgew0KCQkJCWlmICggc2V0dGluZ3MuZml4ZWROYXZpZ2F0aW9uICkgew0KCQkJCQkkKCcjbGlnaHRib3gtbmF2LWJ0blByZXYnKS5jc3MoeyAnYmFja2dyb3VuZCcgOiAndXJsKCcgKyBzZXR0aW5ncy5pbWFnZUJ0blByZXYgKyAnKSBsZWZ0IDE1JSBuby1yZXBlYXQnIH0pDQoJCQkJCQkudW5iaW5kKCkNCgkJCQkJCS5iaW5kKCdjbGljaycsZnVuY3Rpb24oKSB7DQoJCQkJCQkJc2V0dGluZ3MuYWN0aXZlSW1hZ2UgPSBzZXR0aW5ncy5hY3RpdmVJbWFnZSAtIDE7DQoJCQkJCQkJX3NldF9pbWFnZV90b192aWV3KCk7DQoJCQkJCQkJcmV0dXJuIGZhbHNlOw0KCQkJCQkJfSk7DQoJCQkJfSBlbHNlIHsNCgkJCQkJLy8gU2hvdyB0aGUgaW1hZ2VzIGJ1dHRvbiBmb3IgTmV4dCBidXR0b25zDQoJCQkJCSQoJyNsaWdodGJveC1uYXYtYnRuUHJldicpLnVuYmluZCgpLmhvdmVyKGZ1bmN0aW9uKCkgew0KCQkJCQkJJCh0aGlzKS5jc3MoeyAnYmFja2dyb3VuZCcgOiAndXJsKCcgKyBzZXR0aW5ncy5pbWFnZUJ0blByZXYgKyAnKSBsZWZ0IDE1JSBuby1yZXBlYXQnIH0pOw0KCQkJCQl9LGZ1bmN0aW9uKCkgew0KCQkJCQkJJCh0aGlzKS5jc3MoeyAnYmFja2dyb3VuZCcgOiAndHJhbnNwYXJlbnQgdXJsKCcgKyBzZXR0aW5ncy5pbWFnZUJsYW5rICsgJykgbm8tcmVwZWF0JyB9KTsNCgkJCQkJfSkuc2hvdygpLmJpbmQoJ2NsaWNrJyxmdW5jdGlvbigpIHsNCgkJCQkJCXNldHRpbmdzLmFjdGl2ZUltYWdlID0gc2V0dGluZ3MuYWN0aXZlSW1hZ2UgLSAxOw0KCQkJCQkJX3NldF9pbWFnZV90b192aWV3KCk7DQoJCQkJCQlyZXR1cm4gZmFsc2U7DQoJCQkJCX0pOw0KCQkJCX0NCgkJCX0NCgkJCQ0KCQkJLy8gU2hvdyB0aGUgbmV4dCBidXR0b24sIGlmIG5vdCB0aGUgbGFzdCBpbWFnZSBpbiBzZXQNCgkJCWlmICggc2V0dGluZ3MuYWN0aXZlSW1hZ2UgIT0gKCBzZXR0aW5ncy5pbWFnZUFycmF5Lmxlbmd0aCAtMSApICkgew0KCQkJCWlmICggc2V0dGluZ3MuZml4ZWROYXZpZ2F0aW9uICkgew0KCQkJCQkkKCcjbGlnaHRib3gtbmF2LWJ0bk5leHQnKS5jc3MoeyAnYmFja2dyb3VuZCcgOiAndXJsKCcgKyBzZXR0aW5ncy5pbWFnZUJ0bk5leHQgKyAnKSByaWdodCAxNSUgbm8tcmVwZWF0JyB9KQ0KCQkJCQkJLnVuYmluZCgpDQoJCQkJCQkuYmluZCgnY2xpY2snLGZ1bmN0aW9uKCkgew0KCQkJCQkJCXNldHRpbmdzLmFjdGl2ZUltYWdlID0gc2V0dGluZ3MuYWN0aXZlSW1hZ2UgKyAxOw0KCQkJCQkJCV9zZXRfaW1hZ2VfdG9fdmlldygpOw0KCQkJCQkJCXJldHVybiBmYWxzZTsNCgkJCQkJCX0pOw0KCQkJCX0gZWxzZSB7DQoJCQkJCS8vIFNob3cgdGhlIGltYWdlcyBidXR0b24gZm9yIE5leHQgYnV0dG9ucw0KCQkJCQkkKCcjbGlnaHRib3gtbmF2LWJ0bk5leHQnKS51bmJpbmQoKS5ob3ZlcihmdW5jdGlvbigpIHsNCgkJCQkJCSQodGhpcykuY3NzKHsgJ2JhY2tncm91bmQnIDogJ3VybCgnICsgc2V0dGluZ3MuaW1hZ2VCdG5OZXh0ICsgJykgcmlnaHQgMTUlIG5vLXJlcGVhdCcgfSk7DQoJCQkJCX0sZnVuY3Rpb24oKSB7DQoJCQkJCQkkKHRoaXMpLmNzcyh7ICdiYWNrZ3JvdW5kJyA6ICd0cmFuc3BhcmVudCB1cmwoJyArIHNldHRpbmdzLmltYWdlQmxhbmsgKyAnKSBuby1yZXBlYXQnIH0pOw0KCQkJCQl9KS5zaG93KCkuYmluZCgnY2xpY2snLGZ1bmN0aW9uKCkgew0KCQkJCQkJc2V0dGluZ3MuYWN0aXZlSW1hZ2UgPSBzZXR0aW5ncy5hY3RpdmVJbWFnZSArIDE7DQoJCQkJCQlfc2V0X2ltYWdlX3RvX3ZpZXcoKTsNCgkJCQkJCXJldHVybiBmYWxzZTsNCgkJCQkJfSk7DQoJCQkJfQ0KCQkJfQ0KCQkJLy8gRW5hYmxlIGtleWJvYXJkIG5hdmlnYXRpb24NCgkJCV9lbmFibGVfa2V5Ym9hcmRfbmF2aWdhdGlvbigpOw0KCQl9DQoJCS8qKg0KCQkgKiBFbmFibGUgYSBzdXBwb3J0IHRvIGtleWJvYXJkIG5hdmlnYXRpb24NCgkJICoNCgkJICovDQoJCWZ1bmN0aW9uIF9lbmFibGVfa2V5Ym9hcmRfbmF2aWdhdGlvbigpIHsNCgkJCSQoZG9jdW1lbnQpLmtleWRvd24oZnVuY3Rpb24ob2JqRXZlbnQpIHsNCgkJCQlfa2V5Ym9hcmRfYWN0aW9uKG9iakV2ZW50KTsNCgkJCX0pOw0KCQl9DQoJCS8qKg0KCQkgKiBEaXNhYmxlIHRoZSBzdXBwb3J0IHRvIGtleWJvYXJkIG5hdmlnYXRpb24NCgkJICoNCgkJICovDQoJCWZ1bmN0aW9uIF9kaXNhYmxlX2tleWJvYXJkX25hdmlnYXRpb24oKSB7DQoJCQkkKGRvY3VtZW50KS51bmJpbmQoKTsNCgkJfQ0KCQkvKioNCgkJICogUGVyZm9ybSB0aGUga2V5Ym9hcmQgYWN0aW9ucw0KCQkgKg0KCQkgKi8NCgkJZnVuY3Rpb24gX2tleWJvYXJkX2FjdGlvbihvYmpFdmVudCkgew0KCQkJLy8gVG8gaWUNCgkJCWlmICggb2JqRXZlbnQgPT0gbnVsbCApIHsNCgkJCQlrZXljb2RlID0gZXZlbnQua2V5Q29kZTsNCgkJCQllc2NhcGVLZXkgPSAyNzsNCgkJCS8vIFRvIE1vemlsbGENCgkJCX0gZWxzZSB7DQoJCQkJa2V5Y29kZSA9IG9iakV2ZW50LmtleUNvZGU7DQoJCQkJZXNjYXBlS2V5ID0gb2JqRXZlbnQuRE9NX1ZLX0VTQ0FQRTsNCgkJCX0NCgkJCS8vIEdldCB0aGUga2V5IGluIGxvd2VyIGNhc2UgZm9ybQ0KCQkJa2V5ID0gU3RyaW5nLmZyb21DaGFyQ29kZShrZXljb2RlKS50b0xvd2VyQ2FzZSgpOw0KCQkJLy8gVmVyaWZ5IHRoZSBrZXlzIHRvIGNsb3NlIHRoZSBsaWd0aEJveA0KCQkJaWYgKCAoIGtleSA9PSBzZXR0aW5ncy5rZXlUb0Nsb3NlICkgfHwgKCBrZXkgPT0gJ3gnICkgfHwgKCBrZXljb2RlID09IGVzY2FwZUtleSApICkgew0KCQkJCV9maW5pc2goKTsNCgkJCX0NCgkJCS8vIFZlcmlmeSB0aGUga2V5IHRvIHNob3cgdGhlIHByZXZpb3VzIGltYWdlDQoJCQlpZiAoICgga2V5ID09IHNldHRpbmdzLmtleVRvUHJldiApIHx8ICgga2V5Y29kZSA9PSAzNyApICkgew0KCQkJCS8vIElmIHdltHJlIG5vdCBzaG93aW5nIHRoZSBmaXJzdCBpbWFnZSwgY2FsbCB0aGUgcHJldmlvdXMNCgkJCQlpZiAoIHNldHRpbmdzLmFjdGl2ZUltYWdlICE9IDAgKSB7DQoJCQkJCXNldHRpbmdzLmFjdGl2ZUltYWdlID0gc2V0dGluZ3MuYWN0aXZlSW1hZ2UgLSAxOw0KCQkJCQlfc2V0X2ltYWdlX3RvX3ZpZXcoKTsNCgkJCQkJX2Rpc2FibGVfa2V5Ym9hcmRfbmF2aWdhdGlvbigpOw0KCQkJCX0NCgkJCX0NCgkJCS8vIFZlcmlmeSB0aGUga2V5IHRvIHNob3cgdGhlIG5leHQgaW1hZ2UNCgkJCWlmICggKCBrZXkgPT0gc2V0dGluZ3Mua2V5VG9OZXh0ICkgfHwgKCBrZXljb2RlID09IDM5ICkgKSB7DQoJCQkJLy8gSWYgd2W0cmUgbm90IHNob3dpbmcgdGhlIGxhc3QgaW1hZ2UsIGNhbGwgdGhlIG5leHQNCgkJCQlpZiAoIHNldHRpbmdzLmFjdGl2ZUltYWdlICE9ICggc2V0dGluZ3MuaW1hZ2VBcnJheS5sZW5ndGggLSAxICkgKSB7DQoJCQkJCXNldHRpbmdzLmFjdGl2ZUltYWdlID0gc2V0dGluZ3MuYWN0aXZlSW1hZ2UgKyAxOw0KCQkJCQlfc2V0X2ltYWdlX3RvX3ZpZXcoKTsNCgkJCQkJX2Rpc2FibGVfa2V5Ym9hcmRfbmF2aWdhdGlvbigpOw0KCQkJCX0NCgkJCX0NCgkJfQ0KCQkvKioNCgkJICogUHJlbG9hZCBwcmV2IGFuZCBuZXh0IGltYWdlcyBiZWluZyBzaG93ZWQNCgkJICoNCgkJICovDQoJCWZ1bmN0aW9uIF9wcmVsb2FkX25laWdoYm9yX2ltYWdlcygpIHsNCgkJCWlmICggKHNldHRpbmdzLmltYWdlQXJyYXkubGVuZ3RoIC0xKSA+IHNldHRpbmdzLmFjdGl2ZUltYWdlICkgew0KCQkJCW9iak5leHQgPSBuZXcgSW1hZ2UoKTsNCgkJCQlvYmpOZXh0LnNyYyA9IHNldHRpbmdzLmltYWdlQXJyYXlbc2V0dGluZ3MuYWN0aXZlSW1hZ2UgKyAxXVswXTsNCgkJCX0NCgkJCWlmICggc2V0dGluZ3MuYWN0aXZlSW1hZ2UgPiAwICkgew0KCQkJCW9ialByZXYgPSBuZXcgSW1hZ2UoKTsNCgkJCQlvYmpQcmV2LnNyYyA9IHNldHRpbmdzLmltYWdlQXJyYXlbc2V0dGluZ3MuYWN0aXZlSW1hZ2UgLTFdWzBdOw0KCQkJfQ0KCQl9DQoJCS8qKg0KCQkgKiBSZW1vdmUgalF1ZXJ5IGxpZ2h0Qm94IHBsdWdpbiBIVE1MIG1hcmt1cA0KCQkgKg0KCQkgKi8NCgkJZnVuY3Rpb24gX2ZpbmlzaCgpIHsNCgkJCSQoJyNqcXVlcnktbGlnaHRib3gnKS5yZW1vdmUoKTsNCgkJCSQoJyNqcXVlcnktb3ZlcmxheScpLmZhZGVPdXQoZnVuY3Rpb24oKSB7ICQoJyNqcXVlcnktb3ZlcmxheScpLnJlbW92ZSgpOyB9KTsNCgkJCS8vIFNob3cgc29tZSBlbGVtZW50cyB0byBhdm9pZCBjb25mbGljdCB3aXRoIG92ZXJsYXkgaW4gSUUuIFRoZXNlIGVsZW1lbnRzIGFwcGVhciBhYm92ZSB0aGUgb3ZlcmxheS4NCgkJCSQoJ2VtYmVkLCBvYmplY3QsIHNlbGVjdCcpLmNzcyh7ICd2aXNpYmlsaXR5JyA6ICd2aXNpYmxlJyB9KTsNCgkJfQ0KCQkvKioNCgkJIC8gVEhJUkQgRlVOQ1RJT04NCgkJICogZ2V0UGFnZVNpemUoKSBieSBxdWlya3Ntb2RlLmNvbQ0KCQkgKg0KCQkgKiBAcmV0dXJuIEFycmF5IFJldHVybiBhbiBhcnJheSB3aXRoIHBhZ2Ugd2lkdGgsIGhlaWdodCBhbmQgd2luZG93IHdpZHRoLCBoZWlnaHQNCgkJICovDQoJCWZ1bmN0aW9uIF9fX2dldFBhZ2VTaXplKCkgew0KCQkJdmFyIHhTY3JvbGwsIHlTY3JvbGw7DQoJCQlpZiAod2luZG93LmlubmVySGVpZ2h0ICYmIHdpbmRvdy5zY3JvbGxNYXhZKSB7CQ0KCQkJCXhTY3JvbGwgPSB3aW5kb3cuaW5uZXJXaWR0aCArIHdpbmRvdy5zY3JvbGxNYXhYOw0KCQkJCXlTY3JvbGwgPSB3aW5kb3cuaW5uZXJIZWlnaHQgKyB3aW5kb3cuc2Nyb2xsTWF4WTsNCgkJCX0gZWxzZSBpZiAoZG9jdW1lbnQuYm9keS5zY3JvbGxIZWlnaHQgPiBkb2N1bWVudC5ib2R5Lm9mZnNldEhlaWdodCl7IC8vIGFsbCBidXQgRXhwbG9yZXIgTWFjDQoJCQkJeFNjcm9sbCA9IGRvY3VtZW50LmJvZHkuc2Nyb2xsV2lkdGg7DQoJCQkJeVNjcm9sbCA9IGRvY3VtZW50LmJvZHkuc2Nyb2xsSGVpZ2h0Ow0KCQkJfSBlbHNlIHsgLy8gRXhwbG9yZXIgTWFjLi4ud291bGQgYWxzbyB3b3JrIGluIEV4cGxvcmVyIDYgU3RyaWN0LCBNb3ppbGxhIGFuZCBTYWZhcmkNCgkJCQl4U2Nyb2xsID0gZG9jdW1lbnQuYm9keS5vZmZzZXRXaWR0aDsNCgkJCQl5U2Nyb2xsID0gZG9jdW1lbnQuYm9keS5vZmZzZXRIZWlnaHQ7DQoJCQl9DQoJCQl2YXIgd2luZG93V2lkdGgsIHdpbmRvd0hlaWdodDsNCgkJCWlmIChzZWxmLmlubmVySGVpZ2h0KSB7CS8vIGFsbCBleGNlcHQgRXhwbG9yZXINCgkJCQlpZihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpew0KCQkJCQl3aW5kb3dXaWR0aCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aDsgDQoJCQkJfSBlbHNlIHsNCgkJCQkJd2luZG93V2lkdGggPSBzZWxmLmlubmVyV2lkdGg7DQoJCQkJfQ0KCQkJCXdpbmRvd0hlaWdodCA9IHNlbGYuaW5uZXJIZWlnaHQ7DQoJCQl9IGVsc2UgaWYgKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSB7IC8vIEV4cGxvcmVyIDYgU3RyaWN0IE1vZGUNCgkJCQl3aW5kb3dXaWR0aCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aDsNCgkJCQl3aW5kb3dIZWlnaHQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0Ow0KCQkJfSBlbHNlIGlmIChkb2N1bWVudC5ib2R5KSB7IC8vIG90aGVyIEV4cGxvcmVycw0KCQkJCXdpbmRvd1dpZHRoID0gZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aDsNCgkJCQl3aW5kb3dIZWlnaHQgPSBkb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodDsNCgkJCX0JDQoJCQkvLyBmb3Igc21hbGwgcGFnZXMgd2l0aCB0b3RhbCBoZWlnaHQgbGVzcyB0aGVuIGhlaWdodCBvZiB0aGUgdmlld3BvcnQNCgkJCWlmKHlTY3JvbGwgPCB3aW5kb3dIZWlnaHQpew0KCQkJCXBhZ2VIZWlnaHQgPSB3aW5kb3dIZWlnaHQ7DQoJCQl9IGVsc2UgeyANCgkJCQlwYWdlSGVpZ2h0ID0geVNjcm9sbDsNCgkJCX0NCgkJCS8vIGZvciBzbWFsbCBwYWdlcyB3aXRoIHRvdGFsIHdpZHRoIGxlc3MgdGhlbiB3aWR0aCBvZiB0aGUgdmlld3BvcnQNCgkJCWlmKHhTY3JvbGwgPCB3aW5kb3dXaWR0aCl7CQ0KCQkJCXBhZ2VXaWR0aCA9IHhTY3JvbGw7CQkNCgkJCX0gZWxzZSB7DQoJCQkJcGFnZVdpZHRoID0gd2luZG93V2lkdGg7DQoJCQl9DQoJCQlhcnJheVBhZ2VTaXplID0gbmV3IEFycmF5KHBhZ2VXaWR0aCxwYWdlSGVpZ2h0LHdpbmRvd1dpZHRoLHdpbmRvd0hlaWdodCk7DQoJCQlyZXR1cm4gYXJyYXlQYWdlU2l6ZTsNCgkJfTsNCgkJLyoqDQoJCSAvIFRISVJEIEZVTkNUSU9ODQoJCSAqIGdldFBhZ2VTY3JvbGwoKSBieSBxdWlya3Ntb2RlLmNvbQ0KCQkgKg0KCQkgKiBAcmV0dXJuIEFycmF5IFJldHVybiBhbiBhcnJheSB3aXRoIHgseSBwYWdlIHNjcm9sbCB2YWx1ZXMuDQoJCSAqLw0KCQlmdW5jdGlvbiBfX19nZXRQYWdlU2Nyb2xsKCkgew0KCQkJdmFyIHhTY3JvbGwsIHlTY3JvbGw7DQoJCQlpZiAoc2VsZi5wYWdlWU9mZnNldCkgew0KCQkJCXlTY3JvbGwgPSBzZWxmLnBhZ2VZT2Zmc2V0Ow0KCQkJCXhTY3JvbGwgPSBzZWxmLnBhZ2VYT2Zmc2V0Ow0KCQkJfSBlbHNlIGlmIChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCkgewkgLy8gRXhwbG9yZXIgNiBTdHJpY3QNCgkJCQl5U2Nyb2xsID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcDsNCgkJCQl4U2Nyb2xsID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQ7DQoJCQl9IGVsc2UgaWYgKGRvY3VtZW50LmJvZHkpIHsvLyBhbGwgb3RoZXIgRXhwbG9yZXJzDQoJCQkJeVNjcm9sbCA9IGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wOw0KCQkJCXhTY3JvbGwgPSBkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQ7CQ0KCQkJfQ0KCQkJYXJyYXlQYWdlU2Nyb2xsID0gbmV3IEFycmF5KHhTY3JvbGwseVNjcm9sbCk7DQoJCQlyZXR1cm4gYXJyYXlQYWdlU2Nyb2xsOw0KCQl9Ow0KCQkgLyoqDQoJCSAgKiBTdG9wIHRoZSBjb2RlIGV4ZWN1dGlvbiBmcm9tIGEgZXNjaWZpZWQgdGltZSBpbiBtaWxpc2Vjb25kDQoJCSAgKg0KCQkgICovDQoJCSBmdW5jdGlvbiBfX19wYXVzZShtcykgew0KCQkJdmFyIGRhdGUgPSBuZXcgRGF0ZSgpOyANCgkJCWN1ckRhdGUgPSBudWxsOw0KCQkJZG8geyB2YXIgY3VyRGF0ZSA9IG5ldyBEYXRlKCk7IH0NCgkJCXdoaWxlICggY3VyRGF0ZSAtIGRhdGUgPCBtcyk7DQoJCSB9Ow0KCQkvLyBSZXR1cm4gdGhlIGpRdWVyeSBvYmplY3QgZm9yIGNoYWluaW5nLiBUaGUgdW5iaW5kIG1ldGhvZCBpcyB1c2VkIHRvIGF2b2lkIGNsaWNrIGNvbmZsaWN0IHdoZW4gdGhlIHBsdWdpbiBpcyBjYWxsZWQgbW9yZSB0aGFuIG9uY2UNCgkJcmV0dXJuIHRoaXMudW5iaW5kKCdjbGljaycpLmNsaWNrKF9pbml0aWFsaXplKTsNCgl9Ow0KfSkoalF1ZXJ5KTsgLy8gQ2FsbCBhbmQgZXhlY3V0ZSB0aGUgZnVuY3Rpb24gaW1tZWRpYXRlbHkgcGFzc2luZyB0aGUgalF1ZXJ5IG9iamVjdA==]]></data>
	</file>
	<file>
	  <filename>/lib/lightbox.lib/jquery.lightbox-0.5.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBqUXVlcnkgbGlnaHRCb3ggcGx1Z2luDQogKiBUaGlzIGpRdWVyeSBwbHVnaW4gd2FzIGluc3BpcmVkIGFuZCBiYXNlZCBvbiBMaWdodGJveCAyIGJ5IExva2VzaCBEaGFrYXIgKGh0dHA6Ly93d3cuaHVkZGxldG9nZXRoZXIuY29tL3Byb2plY3RzL2xpZ2h0Ym94Mi8pDQogKiBhbmQgYWRhcHRlZCB0byBtZSBmb3IgdXNlIGxpa2UgYSBwbHVnaW4gZnJvbSBqUXVlcnkuDQogKiBAbmFtZSBqcXVlcnktbGlnaHRib3gtMC41LmpzDQogKiBAYXV0aG9yIExlYW5kcm8gVmllaXJhIFBpbmhvIC0gaHR0cDovL2xlYW5kcm92aWVpcmEuY29tDQogKiBAdmVyc2lvbiAwLjUNCiAqIEBkYXRlIEFwcmlsIDExLCAyMDA4DQogKiBAY2F0ZWdvcnkgalF1ZXJ5IHBsdWdpbg0KICogQGNvcHlyaWdodCAoYykgMjAwOCBMZWFuZHJvIFZpZWlyYSBQaW5obyAobGVhbmRyb3ZpZWlyYS5jb20pDQogKiBAbGljZW5zZSBDQ0F0dHJpYnV0aW9uLVNoYXJlQWxpa2UgMi41IEJyYXppbCAtIGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LXNhLzIuNS9ici9kZWVkLmVuX1VTDQogKiBAZXhhbXBsZSBWaXNpdCBodHRwOi8vbGVhbmRyb3ZpZWlyYS5jb20vcHJvamVjdHMvanF1ZXJ5L2xpZ2h0Ym94LyBmb3IgbW9yZSBpbmZvcm1hdGlvbnMgYWJvdXQgdGhpcyBqUXVlcnkgcGx1Z2luDQogKi8NCihmdW5jdGlvbigkKXskLmZuLmxpZ2h0Qm94PWZ1bmN0aW9uKHNldHRpbmdzKXtzZXR0aW5ncz1qUXVlcnkuZXh0ZW5kKHtvdmVybGF5QmdDb2xvcjonIzAwMCcsb3ZlcmxheU9wYWNpdHk6MC44LGZpeGVkTmF2aWdhdGlvbjpmYWxzZSxpbWFnZUxvYWRpbmc6J2ltYWdlcy9saWdodGJveC1pY28tbG9hZGluZy5naWYnLGltYWdlQnRuUHJldjonaW1hZ2VzL2xpZ2h0Ym94LWJ0bi1wcmV2LmdpZicsaW1hZ2VCdG5OZXh0OidpbWFnZXMvbGlnaHRib3gtYnRuLW5leHQuZ2lmJyxpbWFnZUJ0bkNsb3NlOidpbWFnZXMvbGlnaHRib3gtYnRuLWNsb3NlLmdpZicsaW1hZ2VCbGFuazonaW1hZ2VzL2xpZ2h0Ym94LWJsYW5rLmdpZicsY29udGFpbmVyQm9yZGVyU2l6ZToxMCxjb250YWluZXJSZXNpemVTcGVlZDo0MDAsdHh0SW1hZ2U6J0ltYWdlJyx0eHRPZjonb2YnLGtleVRvQ2xvc2U6J2MnLGtleVRvUHJldjoncCcsa2V5VG9OZXh0OiduJyxpbWFnZUFycmF5OltdLGFjdGl2ZUltYWdlOjB9LHNldHRpbmdzKTt2YXIgalF1ZXJ5TWF0Y2hlZE9iaj10aGlzO2Z1bmN0aW9uIF9pbml0aWFsaXplKCl7X3N0YXJ0KHRoaXMsalF1ZXJ5TWF0Y2hlZE9iaik7cmV0dXJuIGZhbHNlO30NCmZ1bmN0aW9uIF9zdGFydChvYmpDbGlja2VkLGpRdWVyeU1hdGNoZWRPYmopeyQoJ2VtYmVkLCBvYmplY3QsIHNlbGVjdCcpLmNzcyh7J3Zpc2liaWxpdHknOidoaWRkZW4nfSk7X3NldF9pbnRlcmZhY2UoKTtzZXR0aW5ncy5pbWFnZUFycmF5Lmxlbmd0aD0wO3NldHRpbmdzLmFjdGl2ZUltYWdlPTA7aWYoalF1ZXJ5TWF0Y2hlZE9iai5sZW5ndGg9PTEpe3NldHRpbmdzLmltYWdlQXJyYXkucHVzaChuZXcgQXJyYXkob2JqQ2xpY2tlZC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSxvYmpDbGlja2VkLmdldEF0dHJpYnV0ZSgndGl0bGUnKSkpO31lbHNle2Zvcih2YXIgaT0wO2k8alF1ZXJ5TWF0Y2hlZE9iai5sZW5ndGg7aSsrKXtzZXR0aW5ncy5pbWFnZUFycmF5LnB1c2gobmV3IEFycmF5KGpRdWVyeU1hdGNoZWRPYmpbaV0uZ2V0QXR0cmlidXRlKCdocmVmJyksalF1ZXJ5TWF0Y2hlZE9ialtpXS5nZXRBdHRyaWJ1dGUoJ3RpdGxlJykpKTt9fQ0Kd2hpbGUoc2V0dGluZ3MuaW1hZ2VBcnJheVtzZXR0aW5ncy5hY3RpdmVJbWFnZV1bMF0hPW9iakNsaWNrZWQuZ2V0QXR0cmlidXRlKCdocmVmJykpe3NldHRpbmdzLmFjdGl2ZUltYWdlKys7fQ0KX3NldF9pbWFnZV90b192aWV3KCk7fQ0KZnVuY3Rpb24gX3NldF9pbnRlcmZhY2UoKXskKCdib2R5JykuYXBwZW5kKCc8ZGl2IGlkPSJqcXVlcnktb3ZlcmxheSI+PC9kaXY+PGRpdiBpZD0ianF1ZXJ5LWxpZ2h0Ym94Ij48ZGl2IGlkPSJsaWdodGJveC1jb250YWluZXItaW1hZ2UtYm94Ij48ZGl2IGlkPSJsaWdodGJveC1jb250YWluZXItaW1hZ2UiPjxpbWcgaWQ9ImxpZ2h0Ym94LWltYWdlIj48ZGl2IHN0eWxlPSIiIGlkPSJsaWdodGJveC1uYXYiPjxhIGhyZWY9IiMiIGlkPSJsaWdodGJveC1uYXYtYnRuUHJldiI+PC9hPjxhIGhyZWY9IiMiIGlkPSJsaWdodGJveC1uYXYtYnRuTmV4dCI+PC9hPjwvZGl2PjxkaXYgaWQ9ImxpZ2h0Ym94LWxvYWRpbmciPjxhIGhyZWY9IiMiIGlkPSJsaWdodGJveC1sb2FkaW5nLWxpbmsiPjxpbWcgc3JjPSInK3NldHRpbmdzLmltYWdlTG9hZGluZysnIj48L2E+PC9kaXY+PC9kaXY+PC9kaXY+PGRpdiBpZD0ibGlnaHRib3gtY29udGFpbmVyLWltYWdlLWRhdGEtYm94Ij48ZGl2IGlkPSJsaWdodGJveC1jb250YWluZXItaW1hZ2UtZGF0YSI+PGRpdiBpZD0ibGlnaHRib3gtaW1hZ2UtZGV0YWlscyI+PHNwYW4gaWQ9ImxpZ2h0Ym94LWltYWdlLWRldGFpbHMtY2FwdGlvbiI+PC9zcGFuPjxzcGFuIGlkPSJsaWdodGJveC1pbWFnZS1kZXRhaWxzLWN1cnJlbnROdW1iZXIiPjwvc3Bhbj48L2Rpdj48ZGl2IGlkPSJsaWdodGJveC1zZWNOYXYiPjxhIGhyZWY9IiMiIGlkPSJsaWdodGJveC1zZWNOYXYtYnRuQ2xvc2UiPjxpbWcgc3JjPSInK3NldHRpbmdzLmltYWdlQnRuQ2xvc2UrJyI+PC9hPjwvZGl2PjwvZGl2PjwvZGl2PjwvZGl2PicpO3ZhciBhcnJQYWdlU2l6ZXM9X19fZ2V0UGFnZVNpemUoKTskKCcjanF1ZXJ5LW92ZXJsYXknKS5jc3Moe2JhY2tncm91bmRDb2xvcjpzZXR0aW5ncy5vdmVybGF5QmdDb2xvcixvcGFjaXR5OnNldHRpbmdzLm92ZXJsYXlPcGFjaXR5LHdpZHRoOmFyclBhZ2VTaXplc1swXSxoZWlnaHQ6YXJyUGFnZVNpemVzWzFdfSkuZmFkZUluKCk7dmFyIGFyclBhZ2VTY3JvbGw9X19fZ2V0UGFnZVNjcm9sbCgpOyQoJyNqcXVlcnktbGlnaHRib3gnKS5jc3Moe3RvcDphcnJQYWdlU2Nyb2xsWzFdKyhhcnJQYWdlU2l6ZXNbM10vMTApLGxlZnQ6YXJyUGFnZVNjcm9sbFswXX0pLnNob3coKTskKCcjanF1ZXJ5LW92ZXJsYXksI2pxdWVyeS1saWdodGJveCcpLmNsaWNrKGZ1bmN0aW9uKCl7X2ZpbmlzaCgpO30pOyQoJyNsaWdodGJveC1sb2FkaW5nLWxpbmssI2xpZ2h0Ym94LXNlY05hdi1idG5DbG9zZScpLmNsaWNrKGZ1bmN0aW9uKCl7X2ZpbmlzaCgpO3JldHVybiBmYWxzZTt9KTskKHdpbmRvdykucmVzaXplKGZ1bmN0aW9uKCl7dmFyIGFyclBhZ2VTaXplcz1fX19nZXRQYWdlU2l6ZSgpOyQoJyNqcXVlcnktb3ZlcmxheScpLmNzcyh7d2lkdGg6YXJyUGFnZVNpemVzWzBdLGhlaWdodDphcnJQYWdlU2l6ZXNbMV19KTt2YXIgYXJyUGFnZVNjcm9sbD1fX19nZXRQYWdlU2Nyb2xsKCk7JCgnI2pxdWVyeS1saWdodGJveCcpLmNzcyh7dG9wOmFyclBhZ2VTY3JvbGxbMV0rKGFyclBhZ2VTaXplc1szXS8xMCksbGVmdDphcnJQYWdlU2Nyb2xsWzBdfSk7fSk7fQ0KZnVuY3Rpb24gX3NldF9pbWFnZV90b192aWV3KCl7JCgnI2xpZ2h0Ym94LWxvYWRpbmcnKS5zaG93KCk7aWYoc2V0dGluZ3MuZml4ZWROYXZpZ2F0aW9uKXskKCcjbGlnaHRib3gtaW1hZ2UsI2xpZ2h0Ym94LWNvbnRhaW5lci1pbWFnZS1kYXRhLWJveCwjbGlnaHRib3gtaW1hZ2UtZGV0YWlscy1jdXJyZW50TnVtYmVyJykuaGlkZSgpO31lbHNleyQoJyNsaWdodGJveC1pbWFnZSwjbGlnaHRib3gtbmF2LCNsaWdodGJveC1uYXYtYnRuUHJldiwjbGlnaHRib3gtbmF2LWJ0bk5leHQsI2xpZ2h0Ym94LWNvbnRhaW5lci1pbWFnZS1kYXRhLWJveCwjbGlnaHRib3gtaW1hZ2UtZGV0YWlscy1jdXJyZW50TnVtYmVyJykuaGlkZSgpO30NCnZhciBvYmpJbWFnZVByZWxvYWRlcj1uZXcgSW1hZ2UoKTtvYmpJbWFnZVByZWxvYWRlci5vbmxvYWQ9ZnVuY3Rpb24oKXskKCcjbGlnaHRib3gtaW1hZ2UnKS5hdHRyKCdzcmMnLHNldHRpbmdzLmltYWdlQXJyYXlbc2V0dGluZ3MuYWN0aXZlSW1hZ2VdWzBdKTtfcmVzaXplX2NvbnRhaW5lcl9pbWFnZV9ib3gob2JqSW1hZ2VQcmVsb2FkZXIud2lkdGgsb2JqSW1hZ2VQcmVsb2FkZXIuaGVpZ2h0KTtvYmpJbWFnZVByZWxvYWRlci5vbmxvYWQ9ZnVuY3Rpb24oKXt9O307b2JqSW1hZ2VQcmVsb2FkZXIuc3JjPXNldHRpbmdzLmltYWdlQXJyYXlbc2V0dGluZ3MuYWN0aXZlSW1hZ2VdWzBdO307ZnVuY3Rpb24gX3Jlc2l6ZV9jb250YWluZXJfaW1hZ2VfYm94KGludEltYWdlV2lkdGgsaW50SW1hZ2VIZWlnaHQpe3ZhciBpbnRDdXJyZW50V2lkdGg9JCgnI2xpZ2h0Ym94LWNvbnRhaW5lci1pbWFnZS1ib3gnKS53aWR0aCgpO3ZhciBpbnRDdXJyZW50SGVpZ2h0PSQoJyNsaWdodGJveC1jb250YWluZXItaW1hZ2UtYm94JykuaGVpZ2h0KCk7dmFyIGludFdpZHRoPShpbnRJbWFnZVdpZHRoKyhzZXR0aW5ncy5jb250YWluZXJCb3JkZXJTaXplKjIpKTt2YXIgaW50SGVpZ2h0PShpbnRJbWFnZUhlaWdodCsoc2V0dGluZ3MuY29udGFpbmVyQm9yZGVyU2l6ZSoyKSk7dmFyIGludERpZmZXPWludEN1cnJlbnRXaWR0aC1pbnRXaWR0aDt2YXIgaW50RGlmZkg9aW50Q3VycmVudEhlaWdodC1pbnRIZWlnaHQ7JCgnI2xpZ2h0Ym94LWNvbnRhaW5lci1pbWFnZS1ib3gnKS5hbmltYXRlKHt3aWR0aDppbnRXaWR0aCxoZWlnaHQ6aW50SGVpZ2h0fSxzZXR0aW5ncy5jb250YWluZXJSZXNpemVTcGVlZCxmdW5jdGlvbigpe19zaG93X2ltYWdlKCk7fSk7aWYoKGludERpZmZXPT0wKSYmKGludERpZmZIPT0wKSl7aWYoJC5icm93c2VyLm1zaWUpe19fX3BhdXNlKDI1MCk7fWVsc2V7X19fcGF1c2UoMTAwKTt9fQ0KJCgnI2xpZ2h0Ym94LWNvbnRhaW5lci1pbWFnZS1kYXRhLWJveCcpLmNzcyh7d2lkdGg6aW50SW1hZ2VXaWR0aH0pOyQoJyNsaWdodGJveC1uYXYtYnRuUHJldiwjbGlnaHRib3gtbmF2LWJ0bk5leHQnKS5jc3Moe2hlaWdodDppbnRJbWFnZUhlaWdodCsoc2V0dGluZ3MuY29udGFpbmVyQm9yZGVyU2l6ZSoyKX0pO307ZnVuY3Rpb24gX3Nob3dfaW1hZ2UoKXskKCcjbGlnaHRib3gtbG9hZGluZycpLmhpZGUoKTskKCcjbGlnaHRib3gtaW1hZ2UnKS5mYWRlSW4oZnVuY3Rpb24oKXtfc2hvd19pbWFnZV9kYXRhKCk7X3NldF9uYXZpZ2F0aW9uKCk7fSk7X3ByZWxvYWRfbmVpZ2hib3JfaW1hZ2VzKCk7fTtmdW5jdGlvbiBfc2hvd19pbWFnZV9kYXRhKCl7JCgnI2xpZ2h0Ym94LWNvbnRhaW5lci1pbWFnZS1kYXRhLWJveCcpLnNsaWRlRG93bignZmFzdCcpOyQoJyNsaWdodGJveC1pbWFnZS1kZXRhaWxzLWNhcHRpb24nKS5oaWRlKCk7aWYoc2V0dGluZ3MuaW1hZ2VBcnJheVtzZXR0aW5ncy5hY3RpdmVJbWFnZV1bMV0peyQoJyNsaWdodGJveC1pbWFnZS1kZXRhaWxzLWNhcHRpb24nKS5odG1sKHNldHRpbmdzLmltYWdlQXJyYXlbc2V0dGluZ3MuYWN0aXZlSW1hZ2VdWzFdKS5zaG93KCk7fQ0KaWYoc2V0dGluZ3MuaW1hZ2VBcnJheS5sZW5ndGg+MSl7JCgnI2xpZ2h0Ym94LWltYWdlLWRldGFpbHMtY3VycmVudE51bWJlcicpLmh0bWwoc2V0dGluZ3MudHh0SW1hZ2UrJyAnKyhzZXR0aW5ncy5hY3RpdmVJbWFnZSsxKSsnICcrc2V0dGluZ3MudHh0T2YrJyAnK3NldHRpbmdzLmltYWdlQXJyYXkubGVuZ3RoKS5zaG93KCk7fX0NCmZ1bmN0aW9uIF9zZXRfbmF2aWdhdGlvbigpeyQoJyNsaWdodGJveC1uYXYnKS5zaG93KCk7JCgnI2xpZ2h0Ym94LW5hdi1idG5QcmV2LCNsaWdodGJveC1uYXYtYnRuTmV4dCcpLmNzcyh7J2JhY2tncm91bmQnOid0cmFuc3BhcmVudCB1cmwoJytzZXR0aW5ncy5pbWFnZUJsYW5rKycpIG5vLXJlcGVhdCd9KTtpZihzZXR0aW5ncy5hY3RpdmVJbWFnZSE9MCl7aWYoc2V0dGluZ3MuZml4ZWROYXZpZ2F0aW9uKXskKCcjbGlnaHRib3gtbmF2LWJ0blByZXYnKS5jc3MoeydiYWNrZ3JvdW5kJzondXJsKCcrc2V0dGluZ3MuaW1hZ2VCdG5QcmV2KycpIGxlZnQgMTUlIG5vLXJlcGVhdCd9KS51bmJpbmQoKS5iaW5kKCdjbGljaycsZnVuY3Rpb24oKXtzZXR0aW5ncy5hY3RpdmVJbWFnZT1zZXR0aW5ncy5hY3RpdmVJbWFnZS0xO19zZXRfaW1hZ2VfdG9fdmlldygpO3JldHVybiBmYWxzZTt9KTt9ZWxzZXskKCcjbGlnaHRib3gtbmF2LWJ0blByZXYnKS51bmJpbmQoKS5ob3ZlcihmdW5jdGlvbigpeyQodGhpcykuY3NzKHsnYmFja2dyb3VuZCc6J3VybCgnK3NldHRpbmdzLmltYWdlQnRuUHJldisnKSBsZWZ0IDE1JSBuby1yZXBlYXQnfSk7fSxmdW5jdGlvbigpeyQodGhpcykuY3NzKHsnYmFja2dyb3VuZCc6J3RyYW5zcGFyZW50IHVybCgnK3NldHRpbmdzLmltYWdlQmxhbmsrJykgbm8tcmVwZWF0J30pO30pLnNob3coKS5iaW5kKCdjbGljaycsZnVuY3Rpb24oKXtzZXR0aW5ncy5hY3RpdmVJbWFnZT1zZXR0aW5ncy5hY3RpdmVJbWFnZS0xO19zZXRfaW1hZ2VfdG9fdmlldygpO3JldHVybiBmYWxzZTt9KTt9fQ0KaWYoc2V0dGluZ3MuYWN0aXZlSW1hZ2UhPShzZXR0aW5ncy5pbWFnZUFycmF5Lmxlbmd0aC0xKSl7aWYoc2V0dGluZ3MuZml4ZWROYXZpZ2F0aW9uKXskKCcjbGlnaHRib3gtbmF2LWJ0bk5leHQnKS5jc3MoeydiYWNrZ3JvdW5kJzondXJsKCcrc2V0dGluZ3MuaW1hZ2VCdG5OZXh0KycpIHJpZ2h0IDE1JSBuby1yZXBlYXQnfSkudW5iaW5kKCkuYmluZCgnY2xpY2snLGZ1bmN0aW9uKCl7c2V0dGluZ3MuYWN0aXZlSW1hZ2U9c2V0dGluZ3MuYWN0aXZlSW1hZ2UrMTtfc2V0X2ltYWdlX3RvX3ZpZXcoKTtyZXR1cm4gZmFsc2U7fSk7fWVsc2V7JCgnI2xpZ2h0Ym94LW5hdi1idG5OZXh0JykudW5iaW5kKCkuaG92ZXIoZnVuY3Rpb24oKXskKHRoaXMpLmNzcyh7J2JhY2tncm91bmQnOid1cmwoJytzZXR0aW5ncy5pbWFnZUJ0bk5leHQrJykgcmlnaHQgMTUlIG5vLXJlcGVhdCd9KTt9LGZ1bmN0aW9uKCl7JCh0aGlzKS5jc3MoeydiYWNrZ3JvdW5kJzondHJhbnNwYXJlbnQgdXJsKCcrc2V0dGluZ3MuaW1hZ2VCbGFuaysnKSBuby1yZXBlYXQnfSk7fSkuc2hvdygpLmJpbmQoJ2NsaWNrJyxmdW5jdGlvbigpe3NldHRpbmdzLmFjdGl2ZUltYWdlPXNldHRpbmdzLmFjdGl2ZUltYWdlKzE7X3NldF9pbWFnZV90b192aWV3KCk7cmV0dXJuIGZhbHNlO30pO319DQpfZW5hYmxlX2tleWJvYXJkX25hdmlnYXRpb24oKTt9DQpmdW5jdGlvbiBfZW5hYmxlX2tleWJvYXJkX25hdmlnYXRpb24oKXskKGRvY3VtZW50KS5rZXlkb3duKGZ1bmN0aW9uKG9iakV2ZW50KXtfa2V5Ym9hcmRfYWN0aW9uKG9iakV2ZW50KTt9KTt9DQpmdW5jdGlvbiBfZGlzYWJsZV9rZXlib2FyZF9uYXZpZ2F0aW9uKCl7JChkb2N1bWVudCkudW5iaW5kKCk7fQ0KZnVuY3Rpb24gX2tleWJvYXJkX2FjdGlvbihvYmpFdmVudCl7aWYob2JqRXZlbnQ9PW51bGwpe2tleWNvZGU9ZXZlbnQua2V5Q29kZTtlc2NhcGVLZXk9Mjc7fWVsc2V7a2V5Y29kZT1vYmpFdmVudC5rZXlDb2RlO2VzY2FwZUtleT1vYmpFdmVudC5ET01fVktfRVNDQVBFO30NCmtleT1TdHJpbmcuZnJvbUNoYXJDb2RlKGtleWNvZGUpLnRvTG93ZXJDYXNlKCk7aWYoKGtleT09c2V0dGluZ3Mua2V5VG9DbG9zZSl8fChrZXk9PSd4Jyl8fChrZXljb2RlPT1lc2NhcGVLZXkpKXtfZmluaXNoKCk7fQ0KaWYoKGtleT09c2V0dGluZ3Mua2V5VG9QcmV2KXx8KGtleWNvZGU9PTM3KSl7aWYoc2V0dGluZ3MuYWN0aXZlSW1hZ2UhPTApe3NldHRpbmdzLmFjdGl2ZUltYWdlPXNldHRpbmdzLmFjdGl2ZUltYWdlLTE7X3NldF9pbWFnZV90b192aWV3KCk7X2Rpc2FibGVfa2V5Ym9hcmRfbmF2aWdhdGlvbigpO319DQppZigoa2V5PT1zZXR0aW5ncy5rZXlUb05leHQpfHwoa2V5Y29kZT09MzkpKXtpZihzZXR0aW5ncy5hY3RpdmVJbWFnZSE9KHNldHRpbmdzLmltYWdlQXJyYXkubGVuZ3RoLTEpKXtzZXR0aW5ncy5hY3RpdmVJbWFnZT1zZXR0aW5ncy5hY3RpdmVJbWFnZSsxO19zZXRfaW1hZ2VfdG9fdmlldygpO19kaXNhYmxlX2tleWJvYXJkX25hdmlnYXRpb24oKTt9fX0NCmZ1bmN0aW9uIF9wcmVsb2FkX25laWdoYm9yX2ltYWdlcygpe2lmKChzZXR0aW5ncy5pbWFnZUFycmF5Lmxlbmd0aC0xKT5zZXR0aW5ncy5hY3RpdmVJbWFnZSl7b2JqTmV4dD1uZXcgSW1hZ2UoKTtvYmpOZXh0LnNyYz1zZXR0aW5ncy5pbWFnZUFycmF5W3NldHRpbmdzLmFjdGl2ZUltYWdlKzFdWzBdO30NCmlmKHNldHRpbmdzLmFjdGl2ZUltYWdlPjApe29ialByZXY9bmV3IEltYWdlKCk7b2JqUHJldi5zcmM9c2V0dGluZ3MuaW1hZ2VBcnJheVtzZXR0aW5ncy5hY3RpdmVJbWFnZS0xXVswXTt9fQ0KZnVuY3Rpb24gX2ZpbmlzaCgpeyQoJyNqcXVlcnktbGlnaHRib3gnKS5yZW1vdmUoKTskKCcjanF1ZXJ5LW92ZXJsYXknKS5mYWRlT3V0KGZ1bmN0aW9uKCl7JCgnI2pxdWVyeS1vdmVybGF5JykucmVtb3ZlKCk7fSk7JCgnZW1iZWQsIG9iamVjdCwgc2VsZWN0JykuY3NzKHsndmlzaWJpbGl0eSc6J3Zpc2libGUnfSk7fQ0KZnVuY3Rpb24gX19fZ2V0UGFnZVNpemUoKXt2YXIgeFNjcm9sbCx5U2Nyb2xsO2lmKHdpbmRvdy5pbm5lckhlaWdodCYmd2luZG93LnNjcm9sbE1heFkpe3hTY3JvbGw9d2luZG93LmlubmVyV2lkdGgrd2luZG93LnNjcm9sbE1heFg7eVNjcm9sbD13aW5kb3cuaW5uZXJIZWlnaHQrd2luZG93LnNjcm9sbE1heFk7fWVsc2UgaWYoZG9jdW1lbnQuYm9keS5zY3JvbGxIZWlnaHQ+ZG9jdW1lbnQuYm9keS5vZmZzZXRIZWlnaHQpe3hTY3JvbGw9ZG9jdW1lbnQuYm9keS5zY3JvbGxXaWR0aDt5U2Nyb2xsPWRvY3VtZW50LmJvZHkuc2Nyb2xsSGVpZ2h0O31lbHNle3hTY3JvbGw9ZG9jdW1lbnQuYm9keS5vZmZzZXRXaWR0aDt5U2Nyb2xsPWRvY3VtZW50LmJvZHkub2Zmc2V0SGVpZ2h0O30NCnZhciB3aW5kb3dXaWR0aCx3aW5kb3dIZWlnaHQ7aWYoc2VsZi5pbm5lckhlaWdodCl7aWYoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKXt3aW5kb3dXaWR0aD1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg7fWVsc2V7d2luZG93V2lkdGg9c2VsZi5pbm5lcldpZHRoO30NCndpbmRvd0hlaWdodD1zZWxmLmlubmVySGVpZ2h0O31lbHNlIGlmKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCYmZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCl7d2luZG93V2lkdGg9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoO3dpbmRvd0hlaWdodD1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0O31lbHNlIGlmKGRvY3VtZW50LmJvZHkpe3dpbmRvd1dpZHRoPWRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGg7d2luZG93SGVpZ2h0PWRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0O30NCmlmKHlTY3JvbGw8d2luZG93SGVpZ2h0KXtwYWdlSGVpZ2h0PXdpbmRvd0hlaWdodDt9ZWxzZXtwYWdlSGVpZ2h0PXlTY3JvbGw7fQ0KaWYoeFNjcm9sbDx3aW5kb3dXaWR0aCl7cGFnZVdpZHRoPXhTY3JvbGw7fWVsc2V7cGFnZVdpZHRoPXdpbmRvd1dpZHRoO30NCmFycmF5UGFnZVNpemU9bmV3IEFycmF5KHBhZ2VXaWR0aCxwYWdlSGVpZ2h0LHdpbmRvd1dpZHRoLHdpbmRvd0hlaWdodCk7cmV0dXJuIGFycmF5UGFnZVNpemU7fTtmdW5jdGlvbiBfX19nZXRQYWdlU2Nyb2xsKCl7dmFyIHhTY3JvbGwseVNjcm9sbDtpZihzZWxmLnBhZ2VZT2Zmc2V0KXt5U2Nyb2xsPXNlbGYucGFnZVlPZmZzZXQ7eFNjcm9sbD1zZWxmLnBhZ2VYT2Zmc2V0O31lbHNlIGlmKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCYmZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCl7eVNjcm9sbD1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wO3hTY3JvbGw9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQ7fWVsc2UgaWYoZG9jdW1lbnQuYm9keSl7eVNjcm9sbD1kb2N1bWVudC5ib2R5LnNjcm9sbFRvcDt4U2Nyb2xsPWRvY3VtZW50LmJvZHkuc2Nyb2xsTGVmdDt9DQphcnJheVBhZ2VTY3JvbGw9bmV3IEFycmF5KHhTY3JvbGwseVNjcm9sbCk7cmV0dXJuIGFycmF5UGFnZVNjcm9sbDt9O2Z1bmN0aW9uIF9fX3BhdXNlKG1zKXt2YXIgZGF0ZT1uZXcgRGF0ZSgpO2N1ckRhdGU9bnVsbDtkb3t2YXIgY3VyRGF0ZT1uZXcgRGF0ZSgpO30NCndoaWxlKGN1ckRhdGUtZGF0ZTxtcyk7fTtyZXR1cm4gdGhpcy51bmJpbmQoJ2NsaWNrJykuY2xpY2soX2luaXRpYWxpemUpO307fSkoalF1ZXJ5KTs=]]></data>
	</file>
	<file>
	  <filename>/lib/lightbox.lib/jquery.lightbox-0.5.pack.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBqUXVlcnkgbGlnaHRCb3ggcGx1Z2luDQogKiBUaGlzIGpRdWVyeSBwbHVnaW4gd2FzIGluc3BpcmVkIGFuZCBiYXNlZCBvbiBMaWdodGJveCAyIGJ5IExva2VzaCBEaGFrYXIgKGh0dHA6Ly93d3cuaHVkZGxldG9nZXRoZXIuY29tL3Byb2plY3RzL2xpZ2h0Ym94Mi8pDQogKiBhbmQgYWRhcHRlZCB0byBtZSBmb3IgdXNlIGxpa2UgYSBwbHVnaW4gZnJvbSBqUXVlcnkuDQogKiBAbmFtZSBqcXVlcnktbGlnaHRib3gtMC41LmpzDQogKiBAYXV0aG9yIExlYW5kcm8gVmllaXJhIFBpbmhvIC0gaHR0cDovL2xlYW5kcm92aWVpcmEuY29tDQogKiBAdmVyc2lvbiAwLjUNCiAqIEBkYXRlIEFwcmlsIDExLCAyMDA4DQogKiBAY2F0ZWdvcnkgalF1ZXJ5IHBsdWdpbg0KICogQGNvcHlyaWdodCAoYykgMjAwOCBMZWFuZHJvIFZpZWlyYSBQaW5obyAobGVhbmRyb3ZpZWlyYS5jb20pDQogKiBAbGljZW5zZSBDQ0F0dHJpYnV0aW9uLVNoYXJlQWxpa2UgMi41IEJyYXppbCAtIGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LXNhLzIuNS9ici9kZWVkLmVuX1VTDQogKiBAZXhhbXBsZSBWaXNpdCBodHRwOi8vbGVhbmRyb3ZpZWlyYS5jb20vcHJvamVjdHMvanF1ZXJ5L2xpZ2h0Ym94LyBmb3IgbW9yZSBpbmZvcm1hdGlvbnMgYWJvdXQgdGhpcyBqUXVlcnkgcGx1Z2luDQogKi8NCmV2YWwoZnVuY3Rpb24ocCxhLGMsayxlLHIpe2U9ZnVuY3Rpb24oYyl7cmV0dXJuKGM8YT8nJzplKHBhcnNlSW50KGMvYSkpKSsoKGM9YyVhKT4zNT9TdHJpbmcuZnJvbUNoYXJDb2RlKGMrMjkpOmMudG9TdHJpbmcoMzYpKX07aWYoIScnLnJlcGxhY2UoL14vLFN0cmluZykpe3doaWxlKGMtLSlyW2UoYyldPWtbY118fGUoYyk7az1bZnVuY3Rpb24oZSl7cmV0dXJuIHJbZV19XTtlPWZ1bmN0aW9uKCl7cmV0dXJuJ1xcdysnfTtjPTF9O3doaWxlKGMtLSlpZihrW2NdKXA9cC5yZXBsYWNlKG5ldyBSZWdFeHAoJ1xcYicrZShjKSsnXFxiJywnZycpLGtbY10pO3JldHVybiBwfSgnKDYoJCl7JC4yTi4zZz02KDQpezQ9MjMuMkgoezJCOlwnIzM0XCcsMmc6MC44LDFkOkYsMU06XCcxOC81LTMzLVkuMTZcJywxdjpcJzE4LzUtMXUtMlEuMTZcJywxRTpcJzE4LzUtMXUtMkwuMTZcJywxVzpcJzE4LzUtMXUtMkkuMTZcJywxOTpcJzE4LzUtMkYuMTZcJywxZjoxMCwyQTozZCwyczpcJzFqXCcsMm86XCczMlwnLDJqOlwnY1wnLDJmOlwncFwnLDJkOlwnblwnLGg6W10sOTowfSw0KTtmIEk9Tjs2IDIwKCl7MVgoTixJKTt1IEZ9NiAxWCgxZSxJKXskKFwnMVUsIDFTLCAxUlwnKS5sKHtcJzFRXCc6XCcyRVwnfSk7MU8oKTs0LmguQj0wOzQuOT0wOzcoSS5CPT0xKXs0LmguMUoodiAxbSgxZS4xNyhcJ0pcJyksMWUuMTcoXCcydlwnKSkpfWp7MzYoZiBpPTA7aTxJLkI7aSsrKXs0LmguMUoodiAxbShJW2ldLjE3KFwnSlwnKSxJW2ldLjE3KFwnMnZcJykpKX19Mm4oNC5oWzQuOV1bMF0hPTFlLjE3KFwnSlwnKSl7NC45Kyt9RCgpfTYgMU8oKXskKFwnbVwnKS4zMShcJzxlIGc9InEtMTMiPjwvZT48ZSBnPSJxLTUiPjxlIGc9IjUtcy1iLXciPjxlIGc9IjUtcy1iIj48MXcgZz0iNS1iIj48ZSAyVj0iIiBnPSI1LWsiPjxhIEo9IiMiIGc9IjUtay1WIj48L2E+PGEgSj0iIyIgZz0iNS1rLVgiPjwvYT48L2U+PGUgZz0iNS1ZIj48YSBKPSIjIiBnPSI1LVktMjkiPjwxdyBXPSJcJys0LjFNK1wnIj48L2E+PC9lPjwvZT48L2U+PGUgZz0iNS1zLWItVC13Ij48ZSBnPSI1LXMtYi1UIj48ZSBnPSI1LWItQSI+PDFpIGc9IjUtYi1BLTF0Ij48LzFpPjwxaSBnPSI1LWItQS0xZyI+PC8xaT48L2U+PGUgZz0iNS0xcyI+PGEgSj0iIyIgZz0iNS0xcy0yMiI+PDF3IFc9IlwnKzQuMVcrXCciPjwvYT48L2U+PC9lPjwvZT48L2U+XCcpO2Ygej0xRCgpOyQoXCcjcS0xM1wnKS5sKHsySzo0LjJCLDJKOjQuMmcsUzp6WzBdLFA6elsxXX0pLjFWKCk7ZiBSPTFwKCk7JChcJyNxLTVcJykubCh7MVQ6UlsxXSsoelszXS8xMCksMWM6UlswXX0pLkUoKTskKFwnI3EtMTMsI3EtNVwnKS5DKDYoKXsxYSgpfSk7JChcJyM1LVktMjksIzUtMXMtMjJcJykuQyg2KCl7MWEoKTt1IEZ9KTskKEcpLjJHKDYoKXtmIHo9MUQoKTskKFwnI3EtMTNcJykubCh7Uzp6WzBdLFA6elsxXX0pO2YgUj0xcCgpOyQoXCcjcS01XCcpLmwoezFUOlJbMV0rKHpbM10vMTApLDFjOlJbMF19KX0pfTYgRCgpeyQoXCcjNS1ZXCcpLkUoKTs3KDQuMWQpeyQoXCcjNS1iLCM1LXMtYi1ULXcsIzUtYi1BLTFnXCcpLjFiKCl9anskKFwnIzUtYiwjNS1rLCM1LWstViwjNS1rLVgsIzUtcy1iLVQtdywjNS1iLUEtMWdcJykuMWIoKX1mIFE9diAxaigpO1EuMVA9NigpeyQoXCcjNS1iXCcpLjJEKFwnV1wnLDQuaFs0LjldWzBdKTsxTihRLlMsUS5QKTtRLjFQPTYoKXt9fTtRLlc9NC5oWzQuOV1bMF19OzYgMU4oMW8sMXIpe2YgMUw9JChcJyM1LXMtYi13XCcpLlMoKTtmIDFLPSQoXCcjNS1zLWItd1wnKS5QKCk7ZiAxbj0oMW8rKDQuMWYqMikpO2YgMXk9KDFyKyg0LjFmKjIpKTtmIDFJPTFMLTFuO2YgMno9MUstMXk7JChcJyM1LXMtYi13XCcpLjNmKHtTOjFuLFA6MXl9LDQuMkEsNigpezJ5KCl9KTs3KCgxST09MCkmJigyej09MCkpezcoJC4zZS4zYyl7MUgoM2IpfWp7MUgoM2EpfX0kKFwnIzUtcy1iLVQtd1wnKS5sKHtTOjFvfSk7JChcJyM1LWstViwjNS1rLVhcJykubCh7UDoxcisoNC4xZioyKX0pfTs2IDJ5KCl7JChcJyM1LVlcJykuMWIoKTskKFwnIzUtYlwnKS4xVig2KCl7MnUoKTsydCgpfSk7MnIoKX07NiAydSgpeyQoXCcjNS1zLWItVC13XCcpLjM4KFwnMzVcJyk7JChcJyM1LWItQS0xdFwnKS4xYigpOzcoNC5oWzQuOV1bMV0peyQoXCcjNS1iLUEtMXRcJykuMnAoNC5oWzQuOV1bMV0pLkUoKX03KDQuaC5CPjEpeyQoXCcjNS1iLUEtMWdcJykuMnAoNC4ycytcJyBcJysoNC45KzEpK1wnIFwnKzQuMm8rXCcgXCcrNC5oLkIpLkUoKX19NiAydCgpeyQoXCcjNS1rXCcpLkUoKTskKFwnIzUtay1WLCM1LWstWFwnKS5sKHtcJ0tcJzpcJzFDIE0oXCcrNC4xOStcJykgTC1PXCd9KTs3KDQuOSE9MCl7Nyg0LjFkKXskKFwnIzUtay1WXCcpLmwoe1wnS1wnOlwnTShcJys0LjF2K1wnKSAxYyAxNSUgTC1PXCd9KS4xMSgpLjFrKFwnQ1wnLDYoKXs0Ljk9NC45LTE7RCgpO3UgRn0pfWp7JChcJyM1LWstVlwnKS4xMSgpLjJtKDYoKXskKE4pLmwoe1wnS1wnOlwnTShcJys0LjF2K1wnKSAxYyAxNSUgTC1PXCd9KX0sNigpeyQoTikubCh7XCdLXCc6XCcxQyBNKFwnKzQuMTkrXCcpIEwtT1wnfSl9KS5FKCkuMWsoXCdDXCcsNigpezQuOT00LjktMTtEKCk7dSBGfSl9fTcoNC45IT0oNC5oLkItMSkpezcoNC4xZCl7JChcJyM1LWstWFwnKS5sKHtcJ0tcJzpcJ00oXCcrNC4xRStcJykgMmwgMTUlIEwtT1wnfSkuMTEoKS4xayhcJ0NcJyw2KCl7NC45PTQuOSsxO0QoKTt1IEZ9KX1qeyQoXCcjNS1rLVhcJykuMTEoKS4ybSg2KCl7JChOKS5sKHtcJ0tcJzpcJ00oXCcrNC4xRStcJykgMmwgMTUlIEwtT1wnfSl9LDYoKXskKE4pLmwoe1wnS1wnOlwnMUMgTShcJys0LjE5K1wnKSBMLU9cJ30pfSkuRSgpLjFrKFwnQ1wnLDYoKXs0Ljk9NC45KzE7RCgpO3UgRn0pfX0yaygpfTYgMmsoKXskKGQpLjMwKDYoMTIpezJpKDEyKX0pfTYgMUcoKXskKGQpLjExKCl9NiAyaSgxMil7NygxMj09Mmgpe1U9MlouMmU7MXg9Mjd9antVPTEyLjJlOzF4PTEyLjJZfTE0PTJYLjJXKFUpLjJVKCk7NygoMTQ9PTQuMmopfHwoMTQ9PVwneFwnKXx8KFU9PTF4KSl7MWEoKX03KCgxND09NC4yZil8fChVPT0zNykpezcoNC45IT0wKXs0Ljk9NC45LTE7RCgpOzFHKCl9fTcoKDE0PT00LjJkKXx8KFU9PTM5KSl7Nyg0LjkhPSg0LmguQi0xKSl7NC45PTQuOSsxO0QoKTsxRygpfX19NiAycigpezcoKDQuaC5CLTEpPjQuOSl7MmM9diAxaigpOzJjLlc9NC5oWzQuOSsxXVswXX03KDQuOT4wKXsyYj12IDFqKCk7MmIuVz00LmhbNC45LTFdWzBdfX02IDFhKCl7JChcJyNxLTVcJykuMmEoKTskKFwnI3EtMTNcJykuMlQoNigpeyQoXCcjcS0xM1wnKS4yYSgpfSk7JChcJzFVLCAxUywgMVJcJykubCh7XCcxUVwnOlwnMlNcJ30pfTYgMUQoKXtmIG8scjs3KEcuMWgmJkcuMjgpe289Ry4yNitHLjJSO3I9Ry4xaCtHLjI4fWogNyhkLm0uMjU+ZC5tLjI0KXtvPWQubS4yUDtyPWQubS4yNX1qe289ZC5tLjJPO3I9ZC5tLjI0fWYgeSxIOzcoWi4xaCl7NyhkLnQuMWwpe3k9ZC50LjFsfWp7eT1aLjI2fUg9Wi4xaH1qIDcoZC50JiZkLnQuMUEpe3k9ZC50LjFsO0g9ZC50LjFBfWogNyhkLm0pe3k9ZC5tLjFsO0g9ZC5tLjFBfTcocjxIKXsxej1IfWp7MXo9cn03KG88eSl7MUI9b31qezFCPXl9MjE9diAxbSgxQiwxeix5LEgpO3UgMjF9OzYgMXAoKXtmIG8scjs3KFouMVope3I9Wi4xWjtvPVouMk19aiA3KGQudCYmZC50LjFGKXtyPWQudC4xRjtvPWQudC4xWX1qIDcoZC5tKXtyPWQubS4xRjtvPWQubS4xWX0ycT12IDFtKG8scik7dSAycX07NiAxSCgyQyl7ZiAyeD12IDJ3KCk7MXE9Mmg7M2h7ZiAxcT12IDJ3KCl9Mm4oMXEtMng8MkMpfTt1IE4uMTEoXCdDXCcpLkMoMjApfX0pKDIzKTsnLDYyLDIwNCwnfHx8fHNldHRpbmdzfGxpZ2h0Ym94fGZ1bmN0aW9ufGlmfHxhY3RpdmVJbWFnZXx8aW1hZ2V8fGRvY3VtZW50fGRpdnx2YXJ8aWR8aW1hZ2VBcnJheXx8ZWxzZXxuYXZ8Y3NzfGJvZHl8fHhTY3JvbGx8fGpxdWVyeXx5U2Nyb2xsfGNvbnRhaW5lcnxkb2N1bWVudEVsZW1lbnR8cmV0dXJufG5ld3xib3h8fHdpbmRvd1dpZHRofGFyclBhZ2VTaXplc3xkZXRhaWxzfGxlbmd0aHxjbGlja3xfc2V0X2ltYWdlX3RvX3ZpZXd8c2hvd3xmYWxzZXx3aW5kb3d8d2luZG93SGVpZ2h0fGpRdWVyeU1hdGNoZWRPYmp8aHJlZnxiYWNrZ3JvdW5kfG5vfHVybHx0aGlzfHJlcGVhdHxoZWlnaHR8b2JqSW1hZ2VQcmVsb2FkZXJ8YXJyUGFnZVNjcm9sbHx3aWR0aHxkYXRhfGtleWNvZGV8YnRuUHJldnxzcmN8YnRuTmV4dHxsb2FkaW5nfHNlbGZ8fHVuYmluZHxvYmpFdmVudHxvdmVybGF5fGtleXx8Z2lmfGdldEF0dHJpYnV0ZXxpbWFnZXN8aW1hZ2VCbGFua3xfZmluaXNofGhpZGV8bGVmdHxmaXhlZE5hdmlnYXRpb258b2JqQ2xpY2tlZHxjb250YWluZXJCb3JkZXJTaXplfGN1cnJlbnROdW1iZXJ8aW5uZXJIZWlnaHR8c3BhbnxJbWFnZXxiaW5kfGNsaWVudFdpZHRofEFycmF5fGludFdpZHRofGludEltYWdlV2lkdGh8X19fZ2V0UGFnZVNjcm9sbHxjdXJEYXRlfGludEltYWdlSGVpZ2h0fHNlY05hdnxjYXB0aW9ufGJ0bnxpbWFnZUJ0blByZXZ8aW1nfGVzY2FwZUtleXxpbnRIZWlnaHR8cGFnZUhlaWdodHxjbGllbnRIZWlnaHR8cGFnZVdpZHRofHRyYW5zcGFyZW50fF9fX2dldFBhZ2VTaXplfGltYWdlQnRuTmV4dHxzY3JvbGxUb3B8X2Rpc2FibGVfa2V5Ym9hcmRfbmF2aWdhdGlvbnxfX19wYXVzZXxpbnREaWZmV3xwdXNofGludEN1cnJlbnRIZWlnaHR8aW50Q3VycmVudFdpZHRofGltYWdlTG9hZGluZ3xfcmVzaXplX2NvbnRhaW5lcl9pbWFnZV9ib3h8X3NldF9pbnRlcmZhY2V8b25sb2FkfHZpc2liaWxpdHl8c2VsZWN0fG9iamVjdHx0b3B8ZW1iZWR8ZmFkZUlufGltYWdlQnRuQ2xvc2V8X3N0YXJ0fHNjcm9sbExlZnR8cGFnZVlPZmZzZXR8X2luaXRpYWxpemV8YXJyYXlQYWdlU2l6ZXxidG5DbG9zZXxqUXVlcnl8b2Zmc2V0SGVpZ2h0fHNjcm9sbEhlaWdodHxpbm5lcldpZHRofHxzY3JvbGxNYXhZfGxpbmt8cmVtb3ZlfG9ialByZXZ8b2JqTmV4dHxrZXlUb05leHR8a2V5Q29kZXxrZXlUb1ByZXZ8b3ZlcmxheU9wYWNpdHl8bnVsbHxfa2V5Ym9hcmRfYWN0aW9ufGtleVRvQ2xvc2V8X2VuYWJsZV9rZXlib2FyZF9uYXZpZ2F0aW9ufHJpZ2h0fGhvdmVyfHdoaWxlfHR4dE9mfGh0bWx8YXJyYXlQYWdlU2Nyb2xsfF9wcmVsb2FkX25laWdoYm9yX2ltYWdlc3x0eHRJbWFnZXxfc2V0X25hdmlnYXRpb258X3Nob3dfaW1hZ2VfZGF0YXx0aXRsZXxEYXRlfGRhdGV8X3Nob3dfaW1hZ2V8aW50RGlmZkh8Y29udGFpbmVyUmVzaXplU3BlZWR8b3ZlcmxheUJnQ29sb3J8bXN8YXR0cnxoaWRkZW58Ymxhbmt8cmVzaXplfGV4dGVuZHxjbG9zZXxvcGFjaXR5fGJhY2tncm91bmRDb2xvcnxuZXh0fHBhZ2VYT2Zmc2V0fGZufG9mZnNldFdpZHRofHNjcm9sbFdpZHRofHByZXZ8c2Nyb2xsTWF4WHx2aXNpYmxlfGZhZGVPdXR8dG9Mb3dlckNhc2V8c3R5bGV8ZnJvbUNoYXJDb2RlfFN0cmluZ3xET01fVktfRVNDQVBFfGV2ZW50fGtleWRvd258YXBwZW5kfG9mfGljb3wwMDB8ZmFzdHxmb3J8fHNsaWRlRG93bnx8MTAwfDI1MHxtc2llfDQwMHxicm93c2VyfGFuaW1hdGV8bGlnaHRCb3h8ZG8nLnNwbGl0KCd8JyksMCx7fSkp]]></data>
	</file>
	<file>
	  <filename>/lib/tablesorter.lib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/tablesorter.lib/addons/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/tablesorter.lib/addons/pager/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/tablesorter.lib/addons/pager/jquery.tablesorter.pager.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGl2LnRhYmxlc29ydGVyUGFnZXIgew0KCXBhZGRpbmc6IDEwcHggMCAxMHB4IDA7DQoJYmFja2dyb3VuZC1jb2xvcjogI0Q2RDJDMjsNCgl0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQpkaXYudGFibGVzb3J0ZXJQYWdlciBzcGFuIHsNCglwYWRkaW5nOiAwIDVweCAwIDVweDsNCn0NCmRpdi50YWJsZXNvcnRlclBhZ2VyIGlucHV0LnByZXYgew0KCXdpZHRoOiBhdXRvOw0KCW1hcmdpbi1yaWdodDogMTBweDsNCn0NCmRpdi50YWJsZXNvcnRlclBhZ2VyIGlucHV0Lm5leHQgew0KCXdpZHRoOiBhdXRvOw0KCW1hcmdpbi1sZWZ0OiAxMHB4Ow0KfQ0KZGl2LnRhYmxlc29ydGVyUGFnZXIgaW5wdXQgew0KCWZvbnQtc2l6ZTogOHB4Ow0KCXdpZHRoOiA1MHB4Ow0KCWJvcmRlcjogMXB4IHNvbGlkICMzMzAwMDA7DQoJdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQoNCiAg]]></data>
	</file>
	<file>
	  <filename>/lib/tablesorter.lib/addons/pager/jquery.tablesorter.pager.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKCQpIHsNCgkkLmV4dGVuZCh7DQoJCXRhYmxlc29ydGVyUGFnZXI6IG5ldyBmdW5jdGlvbigpIHsNCgkJCQ0KCQkJZnVuY3Rpb24gdXBkYXRlUGFnZURpc3BsYXkoYykgew0KCQkJCXZhciBzID0gJChjLmNzc1BhZ2VEaXNwbGF5LGMuY29udGFpbmVyKS52YWwoKGMucGFnZSsxKSArIGMuc2VwZXJhdG9yICsgYy50b3RhbFBhZ2VzKTsJDQoJCQl9DQoJCQkNCgkJCWZ1bmN0aW9uIHNldFBhZ2VTaXplKHRhYmxlLHNpemUpIHsNCgkJCQl2YXIgYyA9IHRhYmxlLmNvbmZpZzsNCgkJCQljLnNpemUgPSBzaXplOw0KCQkJCWMudG90YWxQYWdlcyA9IE1hdGguY2VpbChjLnRvdGFsUm93cyAvIGMuc2l6ZSk7DQoJCQkJYy5wYWdlclBvc2l0aW9uU2V0ID0gZmFsc2U7DQoJCQkJbW92ZVRvUGFnZSh0YWJsZSk7DQoJCQkJZml4UG9zaXRpb24odGFibGUpOw0KCQkJfQ0KCQkJDQoJCQlmdW5jdGlvbiBmaXhQb3NpdGlvbih0YWJsZSkgew0KCQkJCXZhciBjID0gdGFibGUuY29uZmlnOw0KCQkJCWlmKCFjLnBhZ2VyUG9zaXRpb25TZXQgJiYgYy5wb3NpdGlvbkZpeGVkKSB7DQoJCQkJCXZhciBjID0gdGFibGUuY29uZmlnLCBvID0gJCh0YWJsZSk7DQoJCQkJCWlmKG8ub2Zmc2V0KSB7DQoJCQkJCQljLmNvbnRhaW5lci5jc3Moew0KCQkJCQkJCXRvcDogby5vZmZzZXQoKS50b3AgKyBvLmhlaWdodCgpICsgJ3B4JywNCgkJCQkJCQlwb3NpdGlvbjogJ2Fic29sdXRlJw0KCQkJCQkJfSk7DQoJCQkJCX0NCgkJCQkJYy5wYWdlclBvc2l0aW9uU2V0ID0gdHJ1ZTsNCgkJCQl9DQoJCQl9DQoJCQkNCgkJCWZ1bmN0aW9uIG1vdmVUb0ZpcnN0UGFnZSh0YWJsZSkgew0KCQkJCXZhciBjID0gdGFibGUuY29uZmlnOw0KCQkJCWMucGFnZSA9IDA7DQoJCQkJbW92ZVRvUGFnZSh0YWJsZSk7DQoJCQl9DQoJCQkNCgkJCWZ1bmN0aW9uIG1vdmVUb0xhc3RQYWdlKHRhYmxlKSB7DQoJCQkJdmFyIGMgPSB0YWJsZS5jb25maWc7DQoJCQkJYy5wYWdlID0gKGMudG90YWxQYWdlcy0xKTsNCgkJCQltb3ZlVG9QYWdlKHRhYmxlKTsNCgkJCX0NCgkJCQ0KCQkJZnVuY3Rpb24gbW92ZVRvTmV4dFBhZ2UodGFibGUpIHsNCgkJCQl2YXIgYyA9IHRhYmxlLmNvbmZpZzsNCgkJCQljLnBhZ2UrKzsNCgkJCQlpZihjLnBhZ2UgPj0gKGMudG90YWxQYWdlcy0xKSkgew0KCQkJCQljLnBhZ2UgPSAoYy50b3RhbFBhZ2VzLTEpOw0KCQkJCX0NCgkJCQltb3ZlVG9QYWdlKHRhYmxlKTsNCgkJCX0NCgkJCQ0KCQkJZnVuY3Rpb24gbW92ZVRvUHJldlBhZ2UodGFibGUpIHsNCgkJCQl2YXIgYyA9IHRhYmxlLmNvbmZpZzsNCgkJCQljLnBhZ2UtLTsNCgkJCQlpZihjLnBhZ2UgPD0gMCkgew0KCQkJCQljLnBhZ2UgPSAwOw0KCQkJCX0NCgkJCQltb3ZlVG9QYWdlKHRhYmxlKTsNCgkJCX0NCgkJCQkJCQ0KCQkJDQoJCQlmdW5jdGlvbiBtb3ZlVG9QYWdlKHRhYmxlKSB7DQoJCQkJdmFyIGMgPSB0YWJsZS5jb25maWc7DQoJCQkJaWYoYy5wYWdlIDwgMCB8fCBjLnBhZ2UgPiAoYy50b3RhbFBhZ2VzLTEpKSB7DQoJCQkJCWMucGFnZSA9IDA7DQoJCQkJfQ0KCQkJCQ0KCQkJCXJlbmRlclRhYmxlKHRhYmxlLGMucm93c0NvcHkpOw0KCQkJfQ0KCQkJDQoJCQlmdW5jdGlvbiByZW5kZXJUYWJsZSh0YWJsZSxyb3dzKSB7DQoJCQkJDQoJCQkJdmFyIGMgPSB0YWJsZS5jb25maWc7DQoJCQkJdmFyIGwgPSByb3dzLmxlbmd0aDsNCgkJCQl2YXIgcyA9IChjLnBhZ2UgKiBjLnNpemUpOw0KCQkJCXZhciBlID0gKHMgKyBjLnNpemUpOw0KCQkJCWlmKGUgPiByb3dzLmxlbmd0aCApIHsNCgkJCQkJZSA9IHJvd3MubGVuZ3RoOw0KCQkJCX0NCgkJCQkNCgkJCQkNCgkJCQl2YXIgdGFibGVCb2R5ID0gJCh0YWJsZS50Qm9kaWVzWzBdKTsNCgkJCQkNCgkJCQkvLyBjbGVhciB0aGUgdGFibGUgYm9keQ0KCQkJCQ0KCQkJCSQudGFibGVzb3J0ZXIuY2xlYXJUYWJsZUJvZHkodGFibGUpOw0KCQkJCQ0KCQkJCWZvcih2YXIgaSA9IHM7IGkgPCBlOyBpKyspIHsNCgkJCQkJDQoJCQkJCS8vdGFibGVCb2R5LmFwcGVuZChyb3dzW2ldKTsNCgkJCQkJDQoJCQkJCXZhciBvID0gcm93c1tpXTsNCgkJCQkJdmFyIGwgPSBvLmxlbmd0aDsNCgkJCQkJZm9yKHZhciBqPTA7IGogPCBsOyBqKyspIHsNCgkJCQkJCQ0KCQkJCQkJdGFibGVCb2R5WzBdLmFwcGVuZENoaWxkKG9bal0pOw0KDQoJCQkJCX0NCgkJCQl9DQoJCQkJDQoJCQkJZml4UG9zaXRpb24odGFibGUsdGFibGVCb2R5KTsNCgkJCQkNCgkJCQkkKHRhYmxlKS50cmlnZ2VyKCJhcHBseVdpZGdldHMiKTsNCgkJCQkNCgkJCQlpZiggYy5wYWdlID49IGMudG90YWxQYWdlcyApIHsNCiAgICAgICAgCQkJbW92ZVRvTGFzdFBhZ2UodGFibGUpOw0KCQkJCX0NCgkJCQkNCgkJCQl1cGRhdGVQYWdlRGlzcGxheShjKTsNCgkJCX0NCgkJCQ0KCQkJdGhpcy5hcHBlbmRlciA9IGZ1bmN0aW9uKHRhYmxlLHJvd3MpIHsNCgkJCQkNCgkJCQl2YXIgYyA9IHRhYmxlLmNvbmZpZzsNCgkJCQkNCgkJCQljLnJvd3NDb3B5ID0gcm93czsNCgkJCQljLnRvdGFsUm93cyA9IHJvd3MubGVuZ3RoOw0KCQkJCWMudG90YWxQYWdlcyA9IE1hdGguY2VpbChjLnRvdGFsUm93cyAvIGMuc2l6ZSk7DQoJCQkJDQoJCQkJcmVuZGVyVGFibGUodGFibGUscm93cyk7DQoJCQl9Ow0KCQkJDQoJCQl0aGlzLmRlZmF1bHRzID0gew0KCQkJCXNpemU6IDEwLA0KCQkJCW9mZnNldDogMCwNCgkJCQlwYWdlOiAwLA0KCQkJCXRvdGFsUm93czogMCwNCgkJCQl0b3RhbFBhZ2VzOiAwLA0KCQkJCWNvbnRhaW5lcjogbnVsbCwNCgkJCQljc3NOZXh0OiAnLm5leHQnLA0KCQkJCWNzc1ByZXY6ICcucHJldicsDQoJCQkJY3NzRmlyc3Q6ICcuZmlyc3QnLA0KCQkJCWNzc0xhc3Q6ICcubGFzdCcsDQoJCQkJY3NzUGFnZURpc3BsYXk6ICcucGFnZWRpc3BsYXknLA0KCQkJCWNzc1BhZ2VTaXplOiAnLnBhZ2VzaXplJywNCgkJCQlzZXBlcmF0b3I6ICIvIiwNCgkJCQlwb3NpdGlvbkZpeGVkOiB0cnVlLA0KCQkJCWFwcGVuZGVyOiB0aGlzLmFwcGVuZGVyDQoJCQl9Ow0KCQkJDQoJCQl0aGlzLmNvbnN0cnVjdCA9IGZ1bmN0aW9uKHNldHRpbmdzKSB7DQoJCQkJDQoJCQkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsJDQoJCQkJCQ0KCQkJCQljb25maWcgPSAkLmV4dGVuZCh0aGlzLmNvbmZpZywgJC50YWJsZXNvcnRlclBhZ2VyLmRlZmF1bHRzLCBzZXR0aW5ncyk7DQoJCQkJCQ0KCQkJCQl2YXIgdGFibGUgPSB0aGlzLCBwYWdlciA9IGNvbmZpZy5jb250YWluZXI7DQoJCQkJDQoJCQkJCSQodGhpcykudHJpZ2dlcigiYXBwZW5kQ2FjaGUiKTsNCgkJCQkJDQoJCQkJCWNvbmZpZy5zaXplID0gcGFyc2VJbnQoJCgiLnBhZ2VzaXplIixwYWdlcikudmFsKCkpOw0KCQkJCQkNCgkJCQkJJChjb25maWcuY3NzRmlyc3QscGFnZXIpLmNsaWNrKGZ1bmN0aW9uKCkgew0KCQkJCQkJbW92ZVRvRmlyc3RQYWdlKHRhYmxlKTsNCgkJCQkJCXJldHVybiBmYWxzZTsNCgkJCQkJfSk7DQoJCQkJCSQoY29uZmlnLmNzc05leHQscGFnZXIpLmNsaWNrKGZ1bmN0aW9uKCkgew0KCQkJCQkJbW92ZVRvTmV4dFBhZ2UodGFibGUpOw0KCQkJCQkJcmV0dXJuIGZhbHNlOw0KCQkJCQl9KTsNCgkJCQkJJChjb25maWcuY3NzUHJldixwYWdlcikuY2xpY2soZnVuY3Rpb24oKSB7DQoJCQkJCQltb3ZlVG9QcmV2UGFnZSh0YWJsZSk7DQoJCQkJCQlyZXR1cm4gZmFsc2U7DQoJCQkJCX0pOw0KCQkJCQkkKGNvbmZpZy5jc3NMYXN0LHBhZ2VyKS5jbGljayhmdW5jdGlvbigpIHsNCgkJCQkJCW1vdmVUb0xhc3RQYWdlKHRhYmxlKTsNCgkJCQkJCXJldHVybiBmYWxzZTsNCgkJCQkJfSk7DQoJCQkJCSQoY29uZmlnLmNzc1BhZ2VTaXplLHBhZ2VyKS5jaGFuZ2UoZnVuY3Rpb24oKSB7DQoJCQkJCQlzZXRQYWdlU2l6ZSh0YWJsZSxwYXJzZUludCgkKHRoaXMpLnZhbCgpKSk7DQoJCQkJCQlyZXR1cm4gZmFsc2U7DQoJCQkJCX0pOw0KCQkJCX0pOw0KCQkJfTsNCgkJCQ0KCQl9DQoJfSk7DQoJLy8gZXh0ZW5kIHBsdWdpbiBzY29wZQ0KCSQuZm4uZXh0ZW5kKHsNCiAgICAgICAgdGFibGVzb3J0ZXJQYWdlcjogJC50YWJsZXNvcnRlclBhZ2VyLmNvbnN0cnVjdA0KCX0pOw0KCQ0KfSkoalF1ZXJ5KTsJCQkJ]]></data>
	</file>
	<file>
	  <filename>/lib/tablesorter.lib/info.dat</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGluZm9bJ2pzJ10gPSBhcnJheSgnanF1ZXJ5LnRhYmxlc29ydGVyLm1pbi5qcycsJ2pxdWVyeS5tZXRhZGF0YS5qcycpOwojJGluZm9bJ2NzcyddID0gJ3RoZW1lcy9ibHVlL3N0eWxlLmNzcyc7CiRpbmZvWydkZXBlbmRzJ10gPSAnanF1ZXJ5JzsKJGluZm9bJ2pzX25vbWluaWZ5J10gPSAxOwo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lib/tablesorter.lib/jquery.metadata.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKICogTWV0YWRhdGEgLSBqUXVlcnkgcGx1Z2luIGZvciBwYXJzaW5nIG1ldGFkYXRhIGZyb20gZWxlbWVudHMKICoKICogQ29weXJpZ2h0IChjKSAyMDA2IEpvaG4gUmVzaWcsIFllaHVkYSBLYXR6LCBK77+9w7ZybiBaYWVmZmVyZXIsIFBhdWwgTWNMYW5haGFuCiAqCiAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgR1BMIGxpY2Vuc2VzOgogKiAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwCiAqICAgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC5odG1sCiAqCiAqIFJldmlzaW9uOiAkSWQkCiAqCiAqLwoKLyoqCiAqIFNldHMgdGhlIHR5cGUgb2YgbWV0YWRhdGEgdG8gdXNlLiBNZXRhZGF0YSBpcyBlbmNvZGVkIGluIEpTT04sIGFuZCBlYWNoIHByb3BlcnR5CiAqIGluIHRoZSBKU09OIHdpbGwgYmVjb21lIGEgcHJvcGVydHkgb2YgdGhlIGVsZW1lbnQgaXRzZWxmLgogKgogKiBUaGVyZSBhcmUgdGhyZWUgc3VwcG9ydGVkIHR5cGVzIG9mIG1ldGFkYXRhIHN0b3JhZ2U6CiAqCiAqICAgYXR0cjogIEluc2lkZSBhbiBhdHRyaWJ1dGUuIFRoZSBuYW1lIHBhcmFtZXRlciBpbmRpY2F0ZXMgKndoaWNoKiBhdHRyaWJ1dGUuCiAqICAgICAgICAgIAogKiAgIGNsYXNzOiBJbnNpZGUgdGhlIGNsYXNzIGF0dHJpYnV0ZSwgd3JhcHBlZCBpbiBjdXJseSBicmFjZXM6IHsgfQogKiAgIAogKiAgIGVsZW06ICBJbnNpZGUgYSBjaGlsZCBlbGVtZW50IChlLmcuIGEgc2NyaXB0IHRhZykuIFRoZQogKiAgICAgICAgICBuYW1lIHBhcmFtZXRlciBpbmRpY2F0ZXMgKndoaWNoKiBlbGVtZW50LgogKiAgICAgICAgICAKICogVGhlIG1ldGFkYXRhIGZvciBhbiBlbGVtZW50IGlzIGxvYWRlZCB0aGUgZmlyc3QgdGltZSB0aGUgZWxlbWVudCBpcyBhY2Nlc3NlZCB2aWEgalF1ZXJ5LgogKgogKiBBcyBhIHJlc3VsdCwgeW91IGNhbiBkZWZpbmUgdGhlIG1ldGFkYXRhIHR5cGUsIHVzZSAkKGV4cHIpIHRvIGxvYWQgdGhlIG1ldGFkYXRhIGludG8gdGhlIGVsZW1lbnRzCiAqIG1hdGNoZWQgYnkgZXhwciwgdGhlbiByZWRlZmluZSB0aGUgbWV0YWRhdGEgdHlwZSBhbmQgcnVuIGFub3RoZXIgJChleHByKSBmb3Igb3RoZXIgZWxlbWVudHMuCiAqIAogKiBAbmFtZSAkLm1ldGFkYXRhLnNldFR5cGUKICoKICogQGV4YW1wbGUgPHAgaWQ9Im9uZSIgY2xhc3M9InNvbWVfY2xhc3Mge2l0ZW1faWQ6IDEsIGl0ZW1fbGFiZWw6ICdMYWJlbCd9Ij5UaGlzIGlzIGEgcDwvcD4KICogQGJlZm9yZSAkLm1ldGFkYXRhLnNldFR5cGUoImNsYXNzIikKICogQGFmdGVyICQoIiNvbmUiKS5tZXRhZGF0YSgpLml0ZW1faWQgPT0gMTsgJCgiI29uZSIpLm1ldGFkYXRhKCkuaXRlbV9sYWJlbCA9PSAiTGFiZWwiCiAqIEBkZXNjIFJlYWRzIG1ldGFkYXRhIGZyb20gdGhlIGNsYXNzIGF0dHJpYnV0ZQogKiAKICogQGV4YW1wbGUgPHAgaWQ9Im9uZSIgY2xhc3M9InNvbWVfY2xhc3MiIGRhdGE9IntpdGVtX2lkOiAxLCBpdGVtX2xhYmVsOiAnTGFiZWwnfSI+VGhpcyBpcyBhIHA8L3A+CiAqIEBiZWZvcmUgJC5tZXRhZGF0YS5zZXRUeXBlKCJhdHRyIiwgImRhdGEiKQogKiBAYWZ0ZXIgJCgiI29uZSIpLm1ldGFkYXRhKCkuaXRlbV9pZCA9PSAxOyAkKCIjb25lIikubWV0YWRhdGEoKS5pdGVtX2xhYmVsID09ICJMYWJlbCIKICogQGRlc2MgUmVhZHMgbWV0YWRhdGEgZnJvbSBhICJkYXRhIiBhdHRyaWJ1dGUKICogCiAqIEBleGFtcGxlIDxwIGlkPSJvbmUiIGNsYXNzPSJzb21lX2NsYXNzIj48c2NyaXB0PntpdGVtX2lkOiAxLCBpdGVtX2xhYmVsOiAnTGFiZWwnfTwvc2NyaXB0PlRoaXMgaXMgYSBwPC9wPgogKiBAYmVmb3JlICQubWV0YWRhdGEuc2V0VHlwZSgiZWxlbSIsICJzY3JpcHQiKQogKiBAYWZ0ZXIgJCgiI29uZSIpLm1ldGFkYXRhKCkuaXRlbV9pZCA9PSAxOyAkKCIjb25lIikubWV0YWRhdGEoKS5pdGVtX2xhYmVsID09ICJMYWJlbCIKICogQGRlc2MgUmVhZHMgbWV0YWRhdGEgZnJvbSBhIG5lc3RlZCBzY3JpcHQgZWxlbWVudAogKiAKICogQHBhcmFtIFN0cmluZyB0eXBlIFRoZSBlbmNvZGluZyB0eXBlCiAqIEBwYXJhbSBTdHJpbmcgbmFtZSBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRvIGJlIHVzZWQgdG8gZ2V0IG1ldGFkYXRhIChvcHRpb25hbCkKICogQGNhdCBQbHVnaW5zL01ldGFkYXRhCiAqIEBkZXNjciBTZXRzIHRoZSB0eXBlIG9mIGVuY29kaW5nIHRvIGJlIHVzZWQgd2hlbiBsb2FkaW5nIG1ldGFkYXRhIGZvciB0aGUgZmlyc3QgdGltZQogKiBAdHlwZSB1bmRlZmluZWQKICogQHNlZSBtZXRhZGF0YSgpCiAqLwoKKGZ1bmN0aW9uKCQpIHsKCiQuZXh0ZW5kKHsKCW1ldGFkYXRhIDogewoJCWRlZmF1bHRzIDogewoJCQl0eXBlOiAnY2xhc3MnLAoJCQluYW1lOiAnbWV0YWRhdGEnLAoJCQljcmU6IC8oey4qfSkvLAoJCQlzaW5nbGU6ICdtZXRhZGF0YScKCQl9LAoJCXNldFR5cGU6IGZ1bmN0aW9uKCB0eXBlLCBuYW1lICl7CgkJCXRoaXMuZGVmYXVsdHMudHlwZSA9IHR5cGU7CgkJCXRoaXMuZGVmYXVsdHMubmFtZSA9IG5hbWU7CgkJfSwKCQlnZXQ6IGZ1bmN0aW9uKCBlbGVtLCBvcHRzICl7CgkJCXZhciBzZXR0aW5ncyA9ICQuZXh0ZW5kKHt9LHRoaXMuZGVmYXVsdHMsb3B0cyk7CgkJCS8vIGNoZWNrIGZvciBlbXB0eSBzdHJpbmcgaW4gc2luZ2xlIHByb3BlcnR5CgkJCWlmICggIXNldHRpbmdzLnNpbmdsZS5sZW5ndGggKSBzZXR0aW5ncy5zaW5nbGUgPSAnbWV0YWRhdGEnOwoJCQkKCQkJdmFyIGRhdGEgPSAkLmRhdGEoZWxlbSwgc2V0dGluZ3Muc2luZ2xlKTsKCQkJLy8gcmV0dXJuZWQgY2FjaGVkIGRhdGEgaWYgaXQgYWxyZWFkeSBleGlzdHMKCQkJaWYgKCBkYXRhICkgcmV0dXJuIGRhdGE7CgkJCQoJCQlkYXRhID0gInt9IjsKCQkJCgkJCWlmICggc2V0dGluZ3MudHlwZSA9PSAiY2xhc3MiICkgewoJCQkJdmFyIG0gPSBzZXR0aW5ncy5jcmUuZXhlYyggZWxlbS5jbGFzc05hbWUgKTsKCQkJCWlmICggbSApCgkJCQkJZGF0YSA9IG1bMV07CgkJCX0gZWxzZSBpZiAoIHNldHRpbmdzLnR5cGUgPT0gImVsZW0iICkgewoJCQkJaWYoICFlbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lICkKCQkJCQlyZXR1cm4gdW5kZWZpbmVkOwoJCQkJdmFyIGUgPSBlbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lKHNldHRpbmdzLm5hbWUpOwoJCQkJaWYgKCBlLmxlbmd0aCApCgkJCQkJZGF0YSA9ICQudHJpbShlWzBdLmlubmVySFRNTCk7CgkJCX0gZWxzZSBpZiAoIGVsZW0uZ2V0QXR0cmlidXRlICE9IHVuZGVmaW5lZCApIHsKCQkJCXZhciBhdHRyID0gZWxlbS5nZXRBdHRyaWJ1dGUoIHNldHRpbmdzLm5hbWUgKTsKCQkJCWlmICggYXR0ciApCgkJCQkJZGF0YSA9IGF0dHI7CgkJCX0KCQkJCgkJCWlmICggZGF0YS5pbmRleE9mKCAneycgKSA8MCApCgkJCWRhdGEgPSAieyIgKyBkYXRhICsgIn0iOwoJCQkKCQkJZGF0YSA9IGV2YWwoIigiICsgZGF0YSArICIpIik7CgkJCQoJCQkkLmRhdGEoIGVsZW0sIHNldHRpbmdzLnNpbmdsZSwgZGF0YSApOwoJCQlyZXR1cm4gZGF0YTsKCQl9Cgl9Cn0pOwoKLyoqCiAqIFJldHVybnMgdGhlIG1ldGFkYXRhIG9iamVjdCBmb3IgdGhlIGZpcnN0IG1lbWJlciBvZiB0aGUgalF1ZXJ5IG9iamVjdC4KICoKICogQG5hbWUgbWV0YWRhdGEKICogQGRlc2NyIFJldHVybnMgZWxlbWVudCdzIG1ldGFkYXRhIG9iamVjdAogKiBAcGFyYW0gT2JqZWN0IG9wdHMgQW4gb2JqZWN0IGNvbnRpYW5pbmcgc2V0dGluZ3MgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHRzCiAqIEB0eXBlIGpRdWVyeQogKiBAY2F0IFBsdWdpbnMvTWV0YWRhdGEKICovCiQuZm4ubWV0YWRhdGEgPSBmdW5jdGlvbiggb3B0cyApewoJcmV0dXJuICQubWV0YWRhdGEuZ2V0KCB0aGlzWzBdLCBvcHRzICk7Cn07Cgp9KShqUXVlcnkpOw==]]></data>
	</file>
	<file>
	  <filename>/lib/tablesorter.lib/jquery.tablesorter.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoNCiAqIA0KICogVGFibGVTb3J0ZXIgMi4wIC0gQ2xpZW50LXNpZGUgdGFibGUgc29ydGluZyB3aXRoIGVhc2UhDQogKiBWZXJzaW9uIDIuMC41Yg0KICogQHJlcXVpcmVzIGpRdWVyeSB2MS4yLjMNCiAqIA0KICogQ29weXJpZ2h0IChjKSAyMDA3IENocmlzdGlhbiBCYWNoDQogKiBFeGFtcGxlcyBhbmQgZG9jcyBhdDogaHR0cDovL3RhYmxlc29ydGVyLmNvbQ0KICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCBHUEwgbGljZW5zZXM6DQogKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocA0KICogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC5odG1sDQogKiANCiAqLw0KLyoqDQogKiANCiAqIEBkZXNjcmlwdGlvbiBDcmVhdGUgYSBzb3J0YWJsZSB0YWJsZSB3aXRoIG11bHRpLWNvbHVtbiBzb3J0aW5nIGNhcGFiaWxpdHlzDQogKiANCiAqIEBleGFtcGxlICQoJ3RhYmxlJykudGFibGVzb3J0ZXIoKTsNCiAqIEBkZXNjIENyZWF0ZSBhIHNpbXBsZSB0YWJsZXNvcnRlciBpbnRlcmZhY2UuDQogKiANCiAqIEBleGFtcGxlICQoJ3RhYmxlJykudGFibGVzb3J0ZXIoeyBzb3J0TGlzdDpbWzAsMF0sWzEsMF1dIH0pOw0KICogQGRlc2MgQ3JlYXRlIGEgdGFibGVzb3J0ZXIgaW50ZXJmYWNlIGFuZCBzb3J0IG9uIHRoZSBmaXJzdCBhbmQgc2Vjb3VuZCBjb2x1bW4gY29sdW1uIGhlYWRlcnMuDQogKiANCiAqIEBleGFtcGxlICQoJ3RhYmxlJykudGFibGVzb3J0ZXIoeyBoZWFkZXJzOiB7IDA6IHsgc29ydGVyOiBmYWxzZX0sIDE6IHtzb3J0ZXI6IGZhbHNlfSB9IH0pOw0KICogICAgICAgICAgDQogKiBAZGVzYyBDcmVhdGUgYSB0YWJsZXNvcnRlciBpbnRlcmZhY2UgYW5kIGRpc2FibGVpbmcgdGhlIGZpcnN0IGFuZCBzZWNvbmQgIGNvbHVtbiBoZWFkZXJzLg0KICogICAgICANCiAqIA0KICogQGV4YW1wbGUgJCgndGFibGUnKS50YWJsZXNvcnRlcih7IGhlYWRlcnM6IHsgMDoge3NvcnRlcjoiaW50ZWdlciJ9LCAxOiB7c29ydGVyOiJjdXJyZW5jeSJ9IH0gfSk7DQogKiANCiAqIEBkZXNjIENyZWF0ZSBhIHRhYmxlc29ydGVyIGludGVyZmFjZSBhbmQgc2V0IGEgY29sdW1uIHBhcnNlciBmb3IgdGhlIGZpcnN0DQogKiAgICAgICBhbmQgc2Vjb25kIGNvbHVtbi4NCiAqIA0KICogDQogKiBAcGFyYW0gT2JqZWN0DQogKiAgICAgICAgICAgIHNldHRpbmdzIEFuIG9iamVjdCBsaXRlcmFsIGNvbnRhaW5pbmcga2V5L3ZhbHVlIHBhaXJzIHRvIHByb3ZpZGUNCiAqICAgICAgICAgICAgb3B0aW9uYWwgc2V0dGluZ3MuDQogKiANCiAqIA0KICogQG9wdGlvbiBTdHJpbmcgY3NzSGVhZGVyIChvcHRpb25hbCkgQSBzdHJpbmcgb2YgdGhlIGNsYXNzIG5hbWUgdG8gYmUgYXBwZW5kZWQNCiAqICAgICAgICAgdG8gc29ydGFibGUgdHIgZWxlbWVudHMgaW4gdGhlIHRoZWFkIG9mIHRoZSB0YWJsZS4gRGVmYXVsdCB2YWx1ZToNCiAqICAgICAgICAgImhlYWRlciINCiAqIA0KICogQG9wdGlvbiBTdHJpbmcgY3NzQXNjIChvcHRpb25hbCkgQSBzdHJpbmcgb2YgdGhlIGNsYXNzIG5hbWUgdG8gYmUgYXBwZW5kZWQgdG8NCiAqICAgICAgICAgc29ydGFibGUgdHIgZWxlbWVudHMgaW4gdGhlIHRoZWFkIG9uIGEgYXNjZW5kaW5nIHNvcnQuIERlZmF1bHQgdmFsdWU6DQogKiAgICAgICAgICJoZWFkZXJTb3J0VXAiDQogKiANCiAqIEBvcHRpb24gU3RyaW5nIGNzc0Rlc2MgKG9wdGlvbmFsKSBBIHN0cmluZyBvZiB0aGUgY2xhc3MgbmFtZSB0byBiZSBhcHBlbmRlZA0KICogICAgICAgICB0byBzb3J0YWJsZSB0ciBlbGVtZW50cyBpbiB0aGUgdGhlYWQgb24gYSBkZXNjZW5kaW5nIHNvcnQuIERlZmF1bHQNCiAqICAgICAgICAgdmFsdWU6ICJoZWFkZXJTb3J0RG93biINCiAqIA0KICogQG9wdGlvbiBTdHJpbmcgc29ydEluaXRpYWxPcmRlciAob3B0aW9uYWwpIEEgc3RyaW5nIG9mIHRoZSBpbml0YWwgc29ydGluZw0KICogICAgICAgICBvcmRlciBjYW4gYmUgYXNjIG9yIGRlc2MuIERlZmF1bHQgdmFsdWU6ICJhc2MiDQogKiANCiAqIEBvcHRpb24gU3RyaW5nIHNvcnRNdWx0aXNvcnRLZXkgKG9wdGlvbmFsKSBBIHN0cmluZyBvZiB0aGUgbXVsdGktY29sdW1uIHNvcnQNCiAqICAgICAgICAga2V5LiBEZWZhdWx0IHZhbHVlOiAic2hpZnRLZXkiDQogKiANCiAqIEBvcHRpb24gU3RyaW5nIHRleHRFeHRyYWN0aW9uIChvcHRpb25hbCkgQSBzdHJpbmcgb2YgdGhlIHRleHQtZXh0cmFjdGlvbg0KICogICAgICAgICBtZXRob2QgdG8gdXNlLiBGb3IgY29tcGxleCBodG1sIHN0cnVjdHVyZXMgaW5zaWRlIHRkIGNlbGwgc2V0IHRoaXMNCiAqICAgICAgICAgb3B0aW9uIHRvICJjb21wbGV4Iiwgb24gbGFyZ2UgdGFibGVzIHRoZSBjb21wbGV4IG9wdGlvbiBjYW4gYmUgc2xvdy4NCiAqICAgICAgICAgRGVmYXVsdCB2YWx1ZTogInNpbXBsZSINCiAqIA0KICogQG9wdGlvbiBPYmplY3QgaGVhZGVycyAob3B0aW9uYWwpIEFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGZvcmNlcyBzb3J0aW5nDQogKiAgICAgICAgIHJ1bGVzLiBUaGlzIG9wdGlvbiBsZXQncyB5b3Ugc3BlY2lmeSBhIGRlZmF1bHQgc29ydGluZyBydWxlLiBEZWZhdWx0DQogKiAgICAgICAgIHZhbHVlOiBudWxsDQogKiANCiAqIEBvcHRpb24gQXJyYXkgc29ydExpc3QgKG9wdGlvbmFsKSBBbiBhcnJheSBjb250YWluaW5nIHRoZSBmb3JjZXMgc29ydGluZw0KICogICAgICAgICBydWxlcy4gVGhpcyBvcHRpb24gbGV0J3MgeW91IHNwZWNpZnkgYSBkZWZhdWx0IHNvcnRpbmcgcnVsZS4gRGVmYXVsdA0KICogICAgICAgICB2YWx1ZTogbnVsbA0KICogDQogKiBAb3B0aW9uIEFycmF5IHNvcnRGb3JjZSAob3B0aW9uYWwpIEFuIGFycmF5IGNvbnRhaW5pbmcgZm9yY2VkIHNvcnRpbmcgcnVsZXMuDQogKiAgICAgICAgIFRoaXMgb3B0aW9uIGxldCdzIHlvdSBzcGVjaWZ5IGEgZGVmYXVsdCBzb3J0aW5nIHJ1bGUsIHdoaWNoIGlzDQogKiAgICAgICAgIHByZXBlbmRlZCB0byB1c2VyLXNlbGVjdGVkIHJ1bGVzLiBEZWZhdWx0IHZhbHVlOiBudWxsDQogKiANCiAqIEBvcHRpb24gQm9vbGVhbiBzb3J0TG9jYWxlQ29tcGFyZSAob3B0aW9uYWwpIEJvb2xlYW4gZmxhZyBpbmRpY2F0aW5nIHdoYXRldmVyDQogKiAgICAgICAgIHRvIHVzZSBTdHJpbmcubG9jYWxlQ2FtcGFyZSBtZXRob2Qgb3Igbm90LiBEZWZhdWx0IHNldCB0byB0cnVlLg0KICogDQogKiANCiAqIEBvcHRpb24gQXJyYXkgc29ydEFwcGVuZCAob3B0aW9uYWwpIEFuIGFycmF5IGNvbnRhaW5pbmcgZm9yY2VkIHNvcnRpbmcgcnVsZXMuDQogKiAgICAgICAgIFRoaXMgb3B0aW9uIGxldCdzIHlvdSBzcGVjaWZ5IGEgZGVmYXVsdCBzb3J0aW5nIHJ1bGUsIHdoaWNoIGlzDQogKiAgICAgICAgIGFwcGVuZGVkIHRvIHVzZXItc2VsZWN0ZWQgcnVsZXMuIERlZmF1bHQgdmFsdWU6IG51bGwNCiAqIA0KICogQG9wdGlvbiBCb29sZWFuIHdpZHRoRml4ZWQgKG9wdGlvbmFsKSBCb29sZWFuIGZsYWcgaW5kaWNhdGluZyBpZiB0YWJsZXNvcnRlcg0KICogICAgICAgICBzaG91bGQgYXBwbHkgZml4ZWQgd2lkdGhzIHRvIHRoZSB0YWJsZSBjb2x1bW5zLiBUaGlzIGlzIHVzZWZ1bGwgd2hlbg0KICogICAgICAgICB1c2luZyB0aGUgcGFnZXIgY29tcGFuaW9uIHBsdWdpbi4gVGhpcyBvcHRpb25zIHJlcXVpcmVzIHRoZSBkaW1lbnNpb24NCiAqICAgICAgICAganF1ZXJ5IHBsdWdpbi4gRGVmYXVsdCB2YWx1ZTogZmFsc2UNCiAqIA0KICogQG9wdGlvbiBCb29sZWFuIGNhbmNlbFNlbGVjdGlvbiAob3B0aW9uYWwpIEJvb2xlYW4gZmxhZyBpbmRpY2F0aW5nIGlmDQogKiAgICAgICAgIHRhYmxlc29ydGVyIHNob3VsZCBjYW5jZWwgc2VsZWN0aW9uIG9mIHRoZSB0YWJsZSBoZWFkZXJzIHRleHQuDQogKiAgICAgICAgIERlZmF1bHQgdmFsdWU6IHRydWUNCiAqIA0KICogQG9wdGlvbiBCb29sZWFuIGRlYnVnIChvcHRpb25hbCkgQm9vbGVhbiBmbGFnIGluZGljYXRpbmcgaWYgdGFibGVzb3J0ZXINCiAqICAgICAgICAgc2hvdWxkIGRpc3BsYXkgZGVidWdpbmcgaW5mb3JtYXRpb24gdXNlZnVsbCBmb3IgZGV2ZWxvcG1lbnQuDQogKiANCiAqIEB0eXBlIGpRdWVyeQ0KICogDQogKiBAbmFtZSB0YWJsZXNvcnRlcg0KICogDQogKiBAY2F0IFBsdWdpbnMvVGFibGVzb3J0ZXINCiAqIA0KICogQGF1dGhvciBDaHJpc3RpYW4gQmFjaC9jaHJpc3RpYW4uYmFjaEBwb2x5ZXN0ZXIuc2UNCiAqLw0KDQooZnVuY3Rpb24gKCQpIHsNCiAgICAkLmV4dGVuZCh7DQogICAgICAgIHRhYmxlc29ydGVyOiBuZXcNCiAgICAgICAgZnVuY3Rpb24gKCkgew0KDQogICAgICAgICAgICB2YXIgcGFyc2VycyA9IFtdLA0KICAgICAgICAgICAgICAgIHdpZGdldHMgPSBbXTsNCg0KICAgICAgICAgICAgdGhpcy5kZWZhdWx0cyA9IHsNCiAgICAgICAgICAgICAgICBjc3NIZWFkZXI6ICJoZWFkZXIiLA0KICAgICAgICAgICAgICAgIGNzc0FzYzogImhlYWRlclNvcnRVcCIsDQogICAgICAgICAgICAgICAgY3NzRGVzYzogImhlYWRlclNvcnREb3duIiwNCiAgICAgICAgICAgICAgICBjc3NDaGlsZFJvdzogImV4cGFuZC1jaGlsZCIsDQogICAgICAgICAgICAgICAgc29ydEluaXRpYWxPcmRlcjogImFzYyIsDQogICAgICAgICAgICAgICAgc29ydE11bHRpU29ydEtleTogInNoaWZ0S2V5IiwNCiAgICAgICAgICAgICAgICBzb3J0Rm9yY2U6IG51bGwsDQogICAgICAgICAgICAgICAgc29ydEFwcGVuZDogbnVsbCwNCiAgICAgICAgICAgICAgICBzb3J0TG9jYWxlQ29tcGFyZTogdHJ1ZSwNCiAgICAgICAgICAgICAgICB0ZXh0RXh0cmFjdGlvbjogInNpbXBsZSIsDQogICAgICAgICAgICAgICAgcGFyc2Vyczoge30sIHdpZGdldHM6IFtdLA0KICAgICAgICAgICAgICAgIHdpZGdldFplYnJhOiB7DQogICAgICAgICAgICAgICAgICAgIGNzczogWyJldmVuIiwgIm9kZCJdDQogICAgICAgICAgICAgICAgfSwgaGVhZGVyczoge30sIHdpZHRoRml4ZWQ6IGZhbHNlLA0KICAgICAgICAgICAgICAgIGNhbmNlbFNlbGVjdGlvbjogdHJ1ZSwNCiAgICAgICAgICAgICAgICBzb3J0TGlzdDogW10sDQogICAgICAgICAgICAgICAgaGVhZGVyTGlzdDogW10sDQogICAgICAgICAgICAgICAgZGF0ZUZvcm1hdDogInVzIiwNCiAgICAgICAgICAgICAgICBkZWNpbWFsOiAnL1wufFwsL2cnLA0KICAgICAgICAgICAgICAgIG9uUmVuZGVySGVhZGVyOiBudWxsLA0KICAgICAgICAgICAgICAgIHNlbGVjdG9ySGVhZGVyczogJ3RoZWFkIHRoJywNCiAgICAgICAgICAgICAgICBkZWJ1ZzogZmFsc2UNCiAgICAgICAgICAgIH07DQoNCiAgICAgICAgICAgIC8qIGRlYnVnaW5nIHV0aWxzICovDQoNCiAgICAgICAgICAgIGZ1bmN0aW9uIGJlbmNobWFyayhzLCBkKSB7DQogICAgICAgICAgICAgICAgbG9nKHMgKyAiLCIgKyAobmV3IERhdGUoKS5nZXRUaW1lKCkgLSBkLmdldFRpbWUoKSkgKyAibXMiKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgdGhpcy5iZW5jaG1hcmsgPSBiZW5jaG1hcms7DQoNCiAgICAgICAgICAgIGZ1bmN0aW9uIGxvZyhzKSB7DQogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjb25zb2xlICE9ICJ1bmRlZmluZWQiICYmIHR5cGVvZiBjb25zb2xlLmRlYnVnICE9ICJ1bmRlZmluZWQiKSB7DQogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHMpOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIGFsZXJ0KHMpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgLyogcGFyc2VycyB1dGlscyAqLw0KDQogICAgICAgICAgICBmdW5jdGlvbiBidWlsZFBhcnNlckNhY2hlKHRhYmxlLCAkaGVhZGVycykgew0KDQogICAgICAgICAgICAgICAgaWYgKHRhYmxlLmNvbmZpZy5kZWJ1Zykgew0KICAgICAgICAgICAgICAgICAgICB2YXIgcGFyc2Vyc0RlYnVnID0gIiI7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgaWYgKHRhYmxlLnRCb2RpZXMubGVuZ3RoID09IDApIHJldHVybjsgLy8gSW4gdGhlIGNhc2Ugb2YgZW1wdHkgdGFibGVzDQogICAgICAgICAgICAgICAgdmFyIHJvd3MgPSB0YWJsZS50Qm9kaWVzWzBdLnJvd3M7DQoNCiAgICAgICAgICAgICAgICBpZiAocm93c1swXSkgew0KDQogICAgICAgICAgICAgICAgICAgIHZhciBsaXN0ID0gW10sDQogICAgICAgICAgICAgICAgICAgICAgICBjZWxscyA9IHJvd3NbMF0uY2VsbHMsDQogICAgICAgICAgICAgICAgICAgICAgICBsID0gY2VsbHMubGVuZ3RoOw0KDQogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbDsgaSsrKSB7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwID0gZmFsc2U7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkLm1ldGFkYXRhICYmICgkKCRoZWFkZXJzW2ldKS5tZXRhZGF0YSgpICYmICQoJGhlYWRlcnNbaV0pLm1ldGFkYXRhKCkuc29ydGVyKSkgew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcCA9IGdldFBhcnNlckJ5SWQoJCgkaGVhZGVyc1tpXSkubWV0YWRhdGEoKS5zb3J0ZXIpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCh0YWJsZS5jb25maWcuaGVhZGVyc1tpXSAmJiB0YWJsZS5jb25maWcuaGVhZGVyc1tpXS5zb3J0ZXIpKSB7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwID0gZ2V0UGFyc2VyQnlJZCh0YWJsZS5jb25maWcuaGVhZGVyc1tpXS5zb3J0ZXIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwKSB7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwID0gZGV0ZWN0UGFyc2VyRm9yQ29sdW1uKHRhYmxlLCByb3dzLCAtMSwgaSk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YWJsZS5jb25maWcuZGVidWcpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXJzRGVidWcgKz0gImNvbHVtbjoiICsgaSArICIgcGFyc2VyOiIgKyBwLmlkICsgIlxuIjsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5wdXNoKHApOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgaWYgKHRhYmxlLmNvbmZpZy5kZWJ1Zykgew0KICAgICAgICAgICAgICAgICAgICBsb2cocGFyc2Vyc0RlYnVnKTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICByZXR1cm4gbGlzdDsNCiAgICAgICAgICAgIH07DQoNCiAgICAgICAgICAgIGZ1bmN0aW9uIGRldGVjdFBhcnNlckZvckNvbHVtbih0YWJsZSwgcm93cywgcm93SW5kZXgsIGNlbGxJbmRleCkgew0KICAgICAgICAgICAgICAgIHZhciBsID0gcGFyc2Vycy5sZW5ndGgsDQogICAgICAgICAgICAgICAgICAgIG5vZGUgPSBmYWxzZSwNCiAgICAgICAgICAgICAgICAgICAgbm9kZVZhbHVlID0gZmFsc2UsDQogICAgICAgICAgICAgICAgICAgIGtlZXBMb29raW5nID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICB3aGlsZSAobm9kZVZhbHVlID09ICcnICYmIGtlZXBMb29raW5nKSB7DQogICAgICAgICAgICAgICAgICAgIHJvd0luZGV4Kys7DQogICAgICAgICAgICAgICAgICAgIGlmIChyb3dzW3Jvd0luZGV4XSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSA9IGdldE5vZGVGcm9tUm93QW5kQ2VsbEluZGV4KHJvd3MsIHJvd0luZGV4LCBjZWxsSW5kZXgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgbm9kZVZhbHVlID0gdHJpbUFuZEdldE5vZGVUZXh0KHRhYmxlLmNvbmZpZywgbm9kZSk7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFibGUuY29uZmlnLmRlYnVnKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCdDaGVja2luZyBpZiB2YWx1ZSB3YXMgZW1wdHkgb24gcm93OicgKyByb3dJbmRleCk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICBrZWVwTG9va2luZyA9IGZhbHNlOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgbDsgaSsrKSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChwYXJzZXJzW2ldLmlzKG5vZGVWYWx1ZSwgdGFibGUsIG5vZGUpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2Vyc1tpXTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAvLyAwIGlzIGFsd2F5cyB0aGUgZ2VuZXJpYyBwYXJzZXIgKHRleHQpDQogICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlcnNbMF07DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGZ1bmN0aW9uIGdldE5vZGVGcm9tUm93QW5kQ2VsbEluZGV4KHJvd3MsIHJvd0luZGV4LCBjZWxsSW5kZXgpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gcm93c1tyb3dJbmRleF0uY2VsbHNbY2VsbEluZGV4XTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgZnVuY3Rpb24gdHJpbUFuZEdldE5vZGVUZXh0KGNvbmZpZywgbm9kZSkgew0KICAgICAgICAgICAgICAgIHJldHVybiAkLnRyaW0oZ2V0RWxlbWVudFRleHQoY29uZmlnLCBub2RlKSk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGZ1bmN0aW9uIGdldFBhcnNlckJ5SWQobmFtZSkgew0KICAgICAgICAgICAgICAgIHZhciBsID0gcGFyc2Vycy5sZW5ndGg7DQogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsOyBpKyspIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnNlcnNbaV0uaWQudG9Mb3dlckNhc2UoKSA9PSBuYW1lLnRvTG93ZXJDYXNlKCkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZXJzW2ldOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgLyogdXRpbHMgKi8NCg0KICAgICAgICAgICAgZnVuY3Rpb24gYnVpbGRDYWNoZSh0YWJsZSkgew0KDQogICAgICAgICAgICAgICAgaWYgKHRhYmxlLmNvbmZpZy5kZWJ1Zykgew0KICAgICAgICAgICAgICAgICAgICB2YXIgY2FjaGVUaW1lID0gbmV3IERhdGUoKTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICB2YXIgdG90YWxSb3dzID0gKHRhYmxlLnRCb2RpZXNbMF0gJiYgdGFibGUudEJvZGllc1swXS5yb3dzLmxlbmd0aCkgfHwgMCwNCiAgICAgICAgICAgICAgICAgICAgdG90YWxDZWxscyA9ICh0YWJsZS50Qm9kaWVzWzBdLnJvd3NbMF0gJiYgdGFibGUudEJvZGllc1swXS5yb3dzWzBdLmNlbGxzLmxlbmd0aCkgfHwgMCwNCiAgICAgICAgICAgICAgICAgICAgcGFyc2VycyA9IHRhYmxlLmNvbmZpZy5wYXJzZXJzLA0KICAgICAgICAgICAgICAgICAgICBjYWNoZSA9IHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdzogW10sDQogICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkOiBbXQ0KICAgICAgICAgICAgICAgICAgICB9Ow0KDQogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b3RhbFJvd3M7ICsraSkgew0KDQogICAgICAgICAgICAgICAgICAgIC8qKiBBZGQgdGhlIHRhYmxlIGRhdGEgdG8gbWFpbiBkYXRhIGFycmF5ICovDQogICAgICAgICAgICAgICAgICAgIHZhciBjID0gJCh0YWJsZS50Qm9kaWVzWzBdLnJvd3NbaV0pLA0KICAgICAgICAgICAgICAgICAgICAgICAgY29scyA9IFtdOw0KDQogICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoaXMgaXMgYSBjaGlsZCByb3csIGFkZCBpdCB0byB0aGUgbGFzdCByb3cncyBjaGlsZHJlbiBhbmQNCiAgICAgICAgICAgICAgICAgICAgLy8gY29udGludWUgdG8gdGhlIG5leHQgcm93DQogICAgICAgICAgICAgICAgICAgIGlmIChjLmhhc0NsYXNzKHRhYmxlLmNvbmZpZy5jc3NDaGlsZFJvdykpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlLnJvd1tjYWNoZS5yb3cubGVuZ3RoIC0gMV0gPSBjYWNoZS5yb3dbY2FjaGUucm93Lmxlbmd0aCAtIDFdLmFkZChjKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdvIHRvIHRoZSBuZXh0IGZvciBsb29wDQogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIGNhY2hlLnJvdy5wdXNoKGMpOw0KDQogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdG90YWxDZWxsczsgKytqKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBjb2xzLnB1c2gocGFyc2Vyc1tqXS5mb3JtYXQoZ2V0RWxlbWVudFRleHQodGFibGUuY29uZmlnLCBjWzBdLmNlbGxzW2pdKSwgdGFibGUsIGNbMF0uY2VsbHNbal0pKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIGNvbHMucHVzaChjYWNoZS5ub3JtYWxpemVkLmxlbmd0aCk7IC8vIGFkZCBwb3NpdGlvbiBmb3Igcm93Q2FjaGUNCiAgICAgICAgICAgICAgICAgICAgY2FjaGUubm9ybWFsaXplZC5wdXNoKGNvbHMpOw0KICAgICAgICAgICAgICAgICAgICBjb2xzID0gbnVsbDsNCiAgICAgICAgICAgICAgICB9Ow0KDQogICAgICAgICAgICAgICAgaWYgKHRhYmxlLmNvbmZpZy5kZWJ1Zykgew0KICAgICAgICAgICAgICAgICAgICBiZW5jaG1hcmsoIkJ1aWxkaW5nIGNhY2hlIGZvciAiICsgdG90YWxSb3dzICsgIiByb3dzOiIsIGNhY2hlVGltZSk7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlOw0KICAgICAgICAgICAgfTsNCg0KICAgICAgICAgICAgZnVuY3Rpb24gZ2V0RWxlbWVudFRleHQoY29uZmlnLCBub2RlKSB7DQoNCiAgICAgICAgICAgICAgICB2YXIgdGV4dCA9ICIiOw0KDQogICAgICAgICAgICAgICAgaWYgKCFub2RlKSByZXR1cm4gIiI7DQoNCiAgICAgICAgICAgICAgICBpZiAoIWNvbmZpZy5zdXBwb3J0c1RleHRDb250ZW50KSBjb25maWcuc3VwcG9ydHNUZXh0Q29udGVudCA9IG5vZGUudGV4dENvbnRlbnQgfHwgZmFsc2U7DQoNCiAgICAgICAgICAgICAgICBpZiAoY29uZmlnLnRleHRFeHRyYWN0aW9uID09ICJzaW1wbGUiKSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcuc3VwcG9ydHNUZXh0Q29udGVudCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IG5vZGUudGV4dENvbnRlbnQ7DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS5jaGlsZE5vZGVzWzBdICYmIG5vZGUuY2hpbGROb2Rlc1swXS5oYXNDaGlsZE5vZGVzKCkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gbm9kZS5jaGlsZE5vZGVzWzBdLmlubmVySFRNTDsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IG5vZGUuaW5uZXJIVE1MOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihjb25maWcudGV4dEV4dHJhY3Rpb24pID09ICJmdW5jdGlvbiIpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBjb25maWcudGV4dEV4dHJhY3Rpb24obm9kZSk7DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gJChub2RlKS50ZXh0KCk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgcmV0dXJuIHRleHQ7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGZ1bmN0aW9uIGFwcGVuZFRvVGFibGUodGFibGUsIGNhY2hlKSB7DQoNCiAgICAgICAgICAgICAgICBpZiAodGFibGUuY29uZmlnLmRlYnVnKSB7DQogICAgICAgICAgICAgICAgICAgIHZhciBhcHBlbmRUaW1lID0gbmV3IERhdGUoKQ0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIHZhciBjID0gY2FjaGUsDQogICAgICAgICAgICAgICAgICAgIHIgPSBjLnJvdywNCiAgICAgICAgICAgICAgICAgICAgbiA9IGMubm9ybWFsaXplZCwNCiAgICAgICAgICAgICAgICAgICAgdG90YWxSb3dzID0gbi5sZW5ndGgsDQogICAgICAgICAgICAgICAgICAgIGNoZWNrQ2VsbCA9IChuWzBdLmxlbmd0aCAtIDEpLA0KICAgICAgICAgICAgICAgICAgICB0YWJsZUJvZHkgPSAkKHRhYmxlLnRCb2RpZXNbMF0pLA0KICAgICAgICAgICAgICAgICAgICByb3dzID0gW107DQoNCg0KICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdG90YWxSb3dzOyBpKyspIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIHBvcyA9IG5baV1bY2hlY2tDZWxsXTsNCg0KICAgICAgICAgICAgICAgICAgICByb3dzLnB1c2gocltwb3NdKTsNCg0KICAgICAgICAgICAgICAgICAgICBpZiAoIXRhYmxlLmNvbmZpZy5hcHBlbmRlcikgew0KDQogICAgICAgICAgICAgICAgICAgICAgICAvL3ZhciBvID0gOw0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGwgPSByW3Bvc10ubGVuZ3RoOw0KICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBsOyBqKyspIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZUJvZHlbMF0uYXBwZW5kQ2hpbGQocltwb3NdW2pdKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQoNCg0KDQogICAgICAgICAgICAgICAgaWYgKHRhYmxlLmNvbmZpZy5hcHBlbmRlcikgew0KDQogICAgICAgICAgICAgICAgICAgIHRhYmxlLmNvbmZpZy5hcHBlbmRlcih0YWJsZSwgcm93cyk7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgcm93cyA9IG51bGw7DQoNCiAgICAgICAgICAgICAgICBpZiAodGFibGUuY29uZmlnLmRlYnVnKSB7DQogICAgICAgICAgICAgICAgICAgIGJlbmNobWFyaygiUmVidWlsdCB0YWJsZToiLCBhcHBlbmRUaW1lKTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAvLyBhcHBseSB0YWJsZSB3aWRnZXRzDQogICAgICAgICAgICAgICAgYXBwbHlXaWRnZXQodGFibGUpOw0KDQogICAgICAgICAgICAgICAgLy8gdHJpZ2dlciBzb3J0ZW5kDQogICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICAgICAgICAgICQodGFibGUpLnRyaWdnZXIoInNvcnRFbmQiKTsNCiAgICAgICAgICAgICAgICB9LCAwKTsNCg0KICAgICAgICAgICAgfTsNCg0KICAgICAgICAgICAgZnVuY3Rpb24gYnVpbGRIZWFkZXJzKHRhYmxlKSB7DQoNCiAgICAgICAgICAgICAgICBpZiAodGFibGUuY29uZmlnLmRlYnVnKSB7DQogICAgICAgICAgICAgICAgICAgIHZhciB0aW1lID0gbmV3IERhdGUoKTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICB2YXIgbWV0YSA9ICgkLm1ldGFkYXRhKSA/IHRydWUgOiBmYWxzZTsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICB2YXIgaGVhZGVyX2luZGV4ID0gY29tcHV0ZVRhYmxlSGVhZGVyQ2VsbEluZGV4ZXModGFibGUpOw0KDQogICAgICAgICAgICAgICAgJHRhYmxlSGVhZGVycyA9ICQodGFibGUuY29uZmlnLnNlbGVjdG9ySGVhZGVycywgdGFibGUpLmVhY2goZnVuY3Rpb24gKGluZGV4KSB7DQoNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb2x1bW4gPSBoZWFkZXJfaW5kZXhbdGhpcy5wYXJlbnROb2RlLnJvd0luZGV4ICsgIi0iICsgdGhpcy5jZWxsSW5kZXhdOw0KICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLmNvbHVtbiA9IGluZGV4Ow0KICAgICAgICAgICAgICAgICAgICB0aGlzLm9yZGVyID0gZm9ybWF0U29ydGluZ09yZGVyKHRhYmxlLmNvbmZpZy5zb3J0SW5pdGlhbE9yZGVyKTsNCiAgICAgICAgICAgICAgICAgICAgDQoJCQkJCQ0KCQkJCQl0aGlzLmNvdW50ID0gdGhpcy5vcmRlcjsNCg0KICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tIZWFkZXJNZXRhZGF0YSh0aGlzKSB8fCBjaGVja0hlYWRlck9wdGlvbnModGFibGUsIGluZGV4KSkgdGhpcy5zb3J0RGlzYWJsZWQgPSB0cnVlOw0KCQkJCQlpZiAoY2hlY2tIZWFkZXJPcHRpb25zU29ydGluZ0xvY2tlZCh0YWJsZSwgaW5kZXgpKSB0aGlzLm9yZGVyID0gdGhpcy5sb2NrZWRPcmRlciA9IGNoZWNrSGVhZGVyT3B0aW9uc1NvcnRpbmdMb2NrZWQodGFibGUsIGluZGV4KTsNCg0KICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc29ydERpc2FibGVkKSB7DQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgJHRoID0gJCh0aGlzKS5hZGRDbGFzcyh0YWJsZS5jb25maWcuY3NzSGVhZGVyKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YWJsZS5jb25maWcub25SZW5kZXJIZWFkZXIpIHRhYmxlLmNvbmZpZy5vblJlbmRlckhlYWRlci5hcHBseSgkdGgpOw0KICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgLy8gYWRkIGNlbGwgdG8gaGVhZGVyTGlzdA0KICAgICAgICAgICAgICAgICAgICB0YWJsZS5jb25maWcuaGVhZGVyTGlzdFtpbmRleF0gPSB0aGlzOw0KICAgICAgICAgICAgICAgIH0pOw0KDQogICAgICAgICAgICAgICAgaWYgKHRhYmxlLmNvbmZpZy5kZWJ1Zykgew0KICAgICAgICAgICAgICAgICAgICBiZW5jaG1hcmsoIkJ1aWx0IGhlYWRlcnM6IiwgdGltZSk7DQogICAgICAgICAgICAgICAgICAgIGxvZygkdGFibGVIZWFkZXJzKTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICByZXR1cm4gJHRhYmxlSGVhZGVyczsNCg0KICAgICAgICAgICAgfTsNCg0KICAgICAgICAgICAgLy8gZnJvbToNCiAgICAgICAgICAgIC8vIGh0dHA6Ly93d3cuamF2YXNjcmlwdHRvb2xib3guY29tL2xpYi90YWJsZS9leGFtcGxlcy5waHANCiAgICAgICAgICAgIC8vIGh0dHA6Ly93d3cuamF2YXNjcmlwdHRvb2xib3guY29tL3RlbXAvdGFibGVfY2VsbGluZGV4Lmh0bWwNCg0KDQogICAgICAgICAgICBmdW5jdGlvbiBjb21wdXRlVGFibGVIZWFkZXJDZWxsSW5kZXhlcyh0KSB7DQogICAgICAgICAgICAgICAgdmFyIG1hdHJpeCA9IFtdOw0KICAgICAgICAgICAgICAgIHZhciBsb29rdXAgPSB7fTsNCiAgICAgICAgICAgICAgICB2YXIgdGhlYWQgPSB0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdUSEVBRCcpWzBdOw0KICAgICAgICAgICAgICAgIHZhciB0cnMgPSB0aGVhZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnVFInKTsNCg0KICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdHJzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgICAgICAgIHZhciBjZWxscyA9IHRyc1tpXS5jZWxsczsNCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBjZWxscy5sZW5ndGg7IGorKykgew0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBjZWxsc1tqXTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJvd0luZGV4ID0gYy5wYXJlbnROb2RlLnJvd0luZGV4Ow0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNlbGxJZCA9IHJvd0luZGV4ICsgIi0iICsgYy5jZWxsSW5kZXg7DQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcm93U3BhbiA9IGMucm93U3BhbiB8fCAxOw0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbFNwYW4gPSBjLmNvbFNwYW4gfHwgMQ0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpcnN0QXZhaWxDb2w7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKG1hdHJpeFtyb3dJbmRleF0pID09ICJ1bmRlZmluZWQiKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0cml4W3Jvd0luZGV4XSA9IFtdOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmluZCBmaXJzdCBhdmFpbGFibGUgY29sdW1uIGluIHRoZSBmaXJzdCByb3cNCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgbWF0cml4W3Jvd0luZGV4XS5sZW5ndGggKyAxOyBrKyspIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKG1hdHJpeFtyb3dJbmRleF1ba10pID09ICJ1bmRlZmluZWQiKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0QXZhaWxDb2wgPSBrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBsb29rdXBbY2VsbElkXSA9IGZpcnN0QXZhaWxDb2w7DQogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrID0gcm93SW5kZXg7IGsgPCByb3dJbmRleCArIHJvd1NwYW47IGsrKykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YobWF0cml4W2tdKSA9PSAidW5kZWZpbmVkIikgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRyaXhba10gPSBbXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1hdHJpeHJvdyA9IG1hdHJpeFtrXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBsID0gZmlyc3RBdmFpbENvbDsgbCA8IGZpcnN0QXZhaWxDb2wgKyBjb2xTcGFuOyBsKyspIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0cml4cm93W2xdID0gIngiOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICByZXR1cm4gbG9va3VwOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBmdW5jdGlvbiBjaGVja0NlbGxDb2xTcGFuKHRhYmxlLCByb3dzLCByb3cpIHsNCiAgICAgICAgICAgICAgICB2YXIgYXJyID0gW10sDQogICAgICAgICAgICAgICAgICAgIHIgPSB0YWJsZS50SGVhZC5yb3dzLA0KICAgICAgICAgICAgICAgICAgICBjID0gcltyb3ddLmNlbGxzOw0KDQogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgICAgICAgIHZhciBjZWxsID0gY1tpXTsNCg0KICAgICAgICAgICAgICAgICAgICBpZiAoY2VsbC5jb2xTcGFuID4gMSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgYXJyID0gYXJyLmNvbmNhdChjaGVja0NlbGxDb2xTcGFuKHRhYmxlLCBoZWFkZXJBcnIsIHJvdysrKSk7DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFibGUudEhlYWQubGVuZ3RoID09IDEgfHwgKGNlbGwucm93U3BhbiA+IDEgfHwgIXJbcm93ICsgMV0pKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyLnB1c2goY2VsbCk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAvLyBoZWFkZXJBcnJbcm93XSA9IChpK3Jvdyk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgcmV0dXJuIGFycjsNCiAgICAgICAgICAgIH07DQoNCiAgICAgICAgICAgIGZ1bmN0aW9uIGNoZWNrSGVhZGVyTWV0YWRhdGEoY2VsbCkgew0KICAgICAgICAgICAgICAgIGlmICgoJC5tZXRhZGF0YSkgJiYgKCQoY2VsbCkubWV0YWRhdGEoKS5zb3J0ZXIgPT09IGZhbHNlKSkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgICAgICAgICB9Ow0KICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgZnVuY3Rpb24gY2hlY2tIZWFkZXJPcHRpb25zKHRhYmxlLCBpKSB7DQogICAgICAgICAgICAgICAgaWYgKCh0YWJsZS5jb25maWcuaGVhZGVyc1tpXSkgJiYgKHRhYmxlLmNvbmZpZy5oZWFkZXJzW2ldLnNvcnRlciA9PT0gZmFsc2UpKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgICAgICAgICAgIH07DQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgfQ0KCQkJDQoJCQkgZnVuY3Rpb24gY2hlY2tIZWFkZXJPcHRpb25zU29ydGluZ0xvY2tlZCh0YWJsZSwgaSkgew0KICAgICAgICAgICAgICAgIGlmICgodGFibGUuY29uZmlnLmhlYWRlcnNbaV0pICYmICh0YWJsZS5jb25maWcuaGVhZGVyc1tpXS5sb2NrZWRPcmRlcikpIHJldHVybiB0YWJsZS5jb25maWcuaGVhZGVyc1tpXS5sb2NrZWRPcmRlcjsNCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgICAgICB9DQoJCQkNCiAgICAgICAgICAgIGZ1bmN0aW9uIGFwcGx5V2lkZ2V0KHRhYmxlKSB7DQogICAgICAgICAgICAgICAgdmFyIGMgPSB0YWJsZS5jb25maWcud2lkZ2V0czsNCiAgICAgICAgICAgICAgICB2YXIgbCA9IGMubGVuZ3RoOw0KICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbDsgaSsrKSB7DQoNCiAgICAgICAgICAgICAgICAgICAgZ2V0V2lkZ2V0QnlJZChjW2ldKS5mb3JtYXQodGFibGUpOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBmdW5jdGlvbiBnZXRXaWRnZXRCeUlkKG5hbWUpIHsNCiAgICAgICAgICAgICAgICB2YXIgbCA9IHdpZGdldHMubGVuZ3RoOw0KICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbDsgaSsrKSB7DQogICAgICAgICAgICAgICAgICAgIGlmICh3aWRnZXRzW2ldLmlkLnRvTG93ZXJDYXNlKCkgPT0gbmFtZS50b0xvd2VyQ2FzZSgpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd2lkZ2V0c1tpXTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH07DQoNCiAgICAgICAgICAgIGZ1bmN0aW9uIGZvcm1hdFNvcnRpbmdPcmRlcih2KSB7DQogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih2KSAhPSAiTnVtYmVyIikgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHYudG9Mb3dlckNhc2UoKSA9PSAiZGVzYyIpID8gMSA6IDA7DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh2ID09IDEpID8gMSA6IDA7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBmdW5jdGlvbiBpc1ZhbHVlSW5BcnJheSh2LCBhKSB7DQogICAgICAgICAgICAgICAgdmFyIGwgPSBhLmxlbmd0aDsNCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGw7IGkrKykgew0KICAgICAgICAgICAgICAgICAgICBpZiAoYVtpXVswXSA9PSB2KSB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGZ1bmN0aW9uIHNldEhlYWRlcnNDc3ModGFibGUsICRoZWFkZXJzLCBsaXN0LCBjc3MpIHsNCiAgICAgICAgICAgICAgICAvLyByZW1vdmUgYWxsIGhlYWRlciBpbmZvcm1hdGlvbg0KICAgICAgICAgICAgICAgICRoZWFkZXJzLnJlbW92ZUNsYXNzKGNzc1swXSkucmVtb3ZlQ2xhc3MoY3NzWzFdKTsNCg0KICAgICAgICAgICAgICAgIHZhciBoID0gW107DQogICAgICAgICAgICAgICAgJGhlYWRlcnMuZWFjaChmdW5jdGlvbiAob2Zmc2V0KSB7DQogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5zb3J0RGlzYWJsZWQpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGhbdGhpcy5jb2x1bW5dID0gJCh0aGlzKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0pOw0KDQogICAgICAgICAgICAgICAgdmFyIGwgPSBsaXN0Lmxlbmd0aDsNCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGw7IGkrKykgew0KICAgICAgICAgICAgICAgICAgICBoW2xpc3RbaV1bMF1dLmFkZENsYXNzKGNzc1tsaXN0W2ldWzFdXSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBmdW5jdGlvbiBmaXhDb2x1bW5XaWR0aCh0YWJsZSwgJGhlYWRlcnMpIHsNCiAgICAgICAgICAgICAgICB2YXIgYyA9IHRhYmxlLmNvbmZpZzsNCiAgICAgICAgICAgICAgICBpZiAoYy53aWR0aEZpeGVkKSB7DQogICAgICAgICAgICAgICAgICAgIHZhciBjb2xncm91cCA9ICQoJzxjb2xncm91cD4nKTsNCiAgICAgICAgICAgICAgICAgICAgJCgidHI6Zmlyc3QgdGQiLCB0YWJsZS50Qm9kaWVzWzBdKS5lYWNoKGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbGdyb3VwLmFwcGVuZCgkKCc8Y29sPicpLmNzcygnd2lkdGgnLCAkKHRoaXMpLndpZHRoKCkpKTsNCiAgICAgICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICAgICAgICAgICQodGFibGUpLnByZXBlbmQoY29sZ3JvdXApOw0KICAgICAgICAgICAgICAgIH07DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGZ1bmN0aW9uIHVwZGF0ZUhlYWRlclNvcnRDb3VudCh0YWJsZSwgc29ydExpc3QpIHsNCiAgICAgICAgICAgICAgICB2YXIgYyA9IHRhYmxlLmNvbmZpZywNCiAgICAgICAgICAgICAgICAgICAgbCA9IHNvcnRMaXN0Lmxlbmd0aDsNCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGw7IGkrKykgew0KICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IHNvcnRMaXN0W2ldLA0KICAgICAgICAgICAgICAgICAgICAgICAgbyA9IGMuaGVhZGVyTGlzdFtzWzBdXTsNCiAgICAgICAgICAgICAgICAgICAgby5jb3VudCA9IHNbMV07DQogICAgICAgICAgICAgICAgICAgIG8uY291bnQrKzsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIC8qIHNvcnRpbmcgbWV0aG9kcyAqLw0KDQogICAgICAgICAgICBmdW5jdGlvbiBtdWx0aXNvcnQodGFibGUsIHNvcnRMaXN0LCBjYWNoZSkgew0KDQogICAgICAgICAgICAgICAgaWYgKHRhYmxlLmNvbmZpZy5kZWJ1Zykgew0KICAgICAgICAgICAgICAgICAgICB2YXIgc29ydFRpbWUgPSBuZXcgRGF0ZSgpOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIHZhciBkeW5hbWljRXhwID0gInZhciBzb3J0V3JhcHBlciA9IGZ1bmN0aW9uKGEsYikgeyIsDQogICAgICAgICAgICAgICAgICAgIGwgPSBzb3J0TGlzdC5sZW5ndGg7DQoNCiAgICAgICAgICAgICAgICAvLyBUT0RPOiBpbmxpbmUgZnVuY3Rpb25zLg0KICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbDsgaSsrKSB7DQoNCiAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBzb3J0TGlzdFtpXVswXTsNCiAgICAgICAgICAgICAgICAgICAgdmFyIG9yZGVyID0gc29ydExpc3RbaV1bMV07DQogICAgICAgICAgICAgICAgICAgIC8vIHZhciBzID0gKGdldENhY2hlZFNvcnRUeXBlKHRhYmxlLmNvbmZpZy5wYXJzZXJzLGMpID09ICJ0ZXh0IikgPw0KICAgICAgICAgICAgICAgICAgICAvLyAoKG9yZGVyID09IDApID8gInNvcnRUZXh0IiA6ICJzb3J0VGV4dERlc2MiKSA6ICgob3JkZXIgPT0gMCkgPw0KICAgICAgICAgICAgICAgICAgICAvLyAic29ydE51bWVyaWMiIDogInNvcnROdW1lcmljRGVzYyIpOw0KICAgICAgICAgICAgICAgICAgICAvLyB2YXIgcyA9ICh0YWJsZS5jb25maWcucGFyc2Vyc1tjXS50eXBlID09ICJ0ZXh0IikgPyAoKG9yZGVyID09IDApDQogICAgICAgICAgICAgICAgICAgIC8vID8gbWFrZVNvcnRUZXh0KGMpIDogbWFrZVNvcnRUZXh0RGVzYyhjKSkgOiAoKG9yZGVyID09IDApID8NCiAgICAgICAgICAgICAgICAgICAgLy8gbWFrZVNvcnROdW1lcmljKGMpIDogbWFrZVNvcnROdW1lcmljRGVzYyhjKSk7DQogICAgICAgICAgICAgICAgICAgIHZhciBzID0gKHRhYmxlLmNvbmZpZy5wYXJzZXJzW2NdLnR5cGUgPT0gInRleHQiKSA/ICgob3JkZXIgPT0gMCkgPyBtYWtlU29ydEZ1bmN0aW9uKCJ0ZXh0IiwgImFzYyIsIGMpIDogbWFrZVNvcnRGdW5jdGlvbigidGV4dCIsICJkZXNjIiwgYykpIDogKChvcmRlciA9PSAwKSA/IG1ha2VTb3J0RnVuY3Rpb24oIm51bWVyaWMiLCAiYXNjIiwgYykgOiBtYWtlU29ydEZ1bmN0aW9uKCJudW1lcmljIiwgImRlc2MiLCBjKSk7DQogICAgICAgICAgICAgICAgICAgIHZhciBlID0gImUiICsgaTsNCg0KICAgICAgICAgICAgICAgICAgICBkeW5hbWljRXhwICs9ICJ2YXIgIiArIGUgKyAiID0gIiArIHM7IC8vICsgIihhWyIgKyBjICsgIl0sYlsiICsgYw0KICAgICAgICAgICAgICAgICAgICAvLyArICJdKTsgIjsNCiAgICAgICAgICAgICAgICAgICAgZHluYW1pY0V4cCArPSAiaWYoIiArIGUgKyAiKSB7IHJldHVybiAiICsgZSArICI7IH0gIjsNCiAgICAgICAgICAgICAgICAgICAgZHluYW1pY0V4cCArPSAiZWxzZSB7ICI7DQoNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAvLyBpZiB2YWx1ZSBpcyB0aGUgc2FtZSBrZWVwIG9yaWduYWwgb3JkZXINCiAgICAgICAgICAgICAgICB2YXIgb3JnT3JkZXJDb2wgPSBjYWNoZS5ub3JtYWxpemVkWzBdLmxlbmd0aCAtIDE7DQogICAgICAgICAgICAgICAgZHluYW1pY0V4cCArPSAicmV0dXJuIGFbIiArIG9yZ09yZGVyQ29sICsgIl0tYlsiICsgb3JnT3JkZXJDb2wgKyAiXTsiOw0KDQogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsOyBpKyspIHsNCiAgICAgICAgICAgICAgICAgICAgZHluYW1pY0V4cCArPSAifTsgIjsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBkeW5hbWljRXhwICs9ICJyZXR1cm4gMDsgIjsNCiAgICAgICAgICAgICAgICBkeW5hbWljRXhwICs9ICJ9OyAiOw0KDQogICAgICAgICAgICAgICAgaWYgKHRhYmxlLmNvbmZpZy5kZWJ1Zykgew0KICAgICAgICAgICAgICAgICAgICBiZW5jaG1hcmsoIkV2YWxpbmcgZXhwcmVzc2lvbjoiICsgZHluYW1pY0V4cCwgbmV3IERhdGUoKSk7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgZXZhbChkeW5hbWljRXhwKTsNCg0KICAgICAgICAgICAgICAgIGNhY2hlLm5vcm1hbGl6ZWQuc29ydChzb3J0V3JhcHBlcik7DQoNCiAgICAgICAgICAgICAgICBpZiAodGFibGUuY29uZmlnLmRlYnVnKSB7DQogICAgICAgICAgICAgICAgICAgIGJlbmNobWFyaygiU29ydGluZyBvbiAiICsgc29ydExpc3QudG9TdHJpbmcoKSArICIgYW5kIGRpciAiICsgb3JkZXIgKyAiIHRpbWU6Iiwgc29ydFRpbWUpOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZTsNCiAgICAgICAgICAgIH07DQoNCiAgICAgICAgICAgIGZ1bmN0aW9uIG1ha2VTb3J0RnVuY3Rpb24odHlwZSwgZGlyZWN0aW9uLCBpbmRleCkgew0KICAgICAgICAgICAgICAgIHZhciBhID0gImFbIiArIGluZGV4ICsgIl0iLA0KICAgICAgICAgICAgICAgICAgICBiID0gImJbIiArIGluZGV4ICsgIl0iOw0KICAgICAgICAgICAgICAgIGlmICh0eXBlID09ICd0ZXh0JyAmJiBkaXJlY3Rpb24gPT0gJ2FzYycpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICIoIiArIGEgKyAiID09ICIgKyBiICsgIiA/IDAgOiAoIiArIGEgKyAiID09PSBudWxsID8gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZIDogKCIgKyBiICsgIiA9PT0gbnVsbCA/IE51bWJlci5ORUdBVElWRV9JTkZJTklUWSA6ICgiICsgYSArICIgPCAiICsgYiArICIpID8gLTEgOiAxICkpKTsiOw0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSAndGV4dCcgJiYgZGlyZWN0aW9uID09ICdkZXNjJykgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gIigiICsgYSArICIgPT0gIiArIGIgKyAiID8gMCA6ICgiICsgYSArICIgPT09IG51bGwgPyBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkgOiAoIiArIGIgKyAiID09PSBudWxsID8gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZIDogKCIgKyBiICsgIiA8ICIgKyBhICsgIikgPyAtMSA6IDEgKSkpOyI7DQogICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09ICdudW1lcmljJyAmJiBkaXJlY3Rpb24gPT0gJ2FzYycpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICIoIiArIGEgKyAiID09PSBudWxsICYmICIgKyBiICsgIiA9PT0gbnVsbCkgPyAwIDooIiArIGEgKyAiID09PSBudWxsID8gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZIDogKCIgKyBiICsgIiA9PT0gbnVsbCA/IE51bWJlci5ORUdBVElWRV9JTkZJTklUWSA6ICIgKyBhICsgIiAtICIgKyBiICsgIikpOyI7DQogICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09ICdudW1lcmljJyAmJiBkaXJlY3Rpb24gPT0gJ2Rlc2MnKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiAiKCIgKyBhICsgIiA9PT0gbnVsbCAmJiAiICsgYiArICIgPT09IG51bGwpID8gMCA6KCIgKyBhICsgIiA9PT0gbnVsbCA/IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSA6ICgiICsgYiArICIgPT09IG51bGwgPyBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkgOiAiICsgYiArICIgLSAiICsgYSArICIpKTsiOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH07DQoNCiAgICAgICAgICAgIGZ1bmN0aW9uIG1ha2VTb3J0VGV4dChpKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuICIoKGFbIiArIGkgKyAiXSA8IGJbIiArIGkgKyAiXSkgPyAtMSA6ICgoYVsiICsgaSArICJdID4gYlsiICsgaSArICJdKSA/IDEgOiAwKSk7IjsNCiAgICAgICAgICAgIH07DQoNCiAgICAgICAgICAgIGZ1bmN0aW9uIG1ha2VTb3J0VGV4dERlc2MoaSkgew0KICAgICAgICAgICAgICAgIHJldHVybiAiKChiWyIgKyBpICsgIl0gPCBhWyIgKyBpICsgIl0pID8gLTEgOiAoKGJbIiArIGkgKyAiXSA+IGFbIiArIGkgKyAiXSkgPyAxIDogMCkpOyI7DQogICAgICAgICAgICB9Ow0KDQogICAgICAgICAgICBmdW5jdGlvbiBtYWtlU29ydE51bWVyaWMoaSkgew0KICAgICAgICAgICAgICAgIHJldHVybiAiYVsiICsgaSArICJdLWJbIiArIGkgKyAiXTsiOw0KICAgICAgICAgICAgfTsNCg0KICAgICAgICAgICAgZnVuY3Rpb24gbWFrZVNvcnROdW1lcmljRGVzYyhpKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuICJiWyIgKyBpICsgIl0tYVsiICsgaSArICJdOyI7DQogICAgICAgICAgICB9Ow0KDQogICAgICAgICAgICBmdW5jdGlvbiBzb3J0VGV4dChhLCBiKSB7DQogICAgICAgICAgICAgICAgaWYgKHRhYmxlLmNvbmZpZy5zb3J0TG9jYWxlQ29tcGFyZSkgcmV0dXJuIGEubG9jYWxlQ29tcGFyZShiKTsNCiAgICAgICAgICAgICAgICByZXR1cm4gKChhIDwgYikgPyAtMSA6ICgoYSA+IGIpID8gMSA6IDApKTsNCiAgICAgICAgICAgIH07DQoNCiAgICAgICAgICAgIGZ1bmN0aW9uIHNvcnRUZXh0RGVzYyhhLCBiKSB7DQogICAgICAgICAgICAgICAgaWYgKHRhYmxlLmNvbmZpZy5zb3J0TG9jYWxlQ29tcGFyZSkgcmV0dXJuIGIubG9jYWxlQ29tcGFyZShhKTsNCiAgICAgICAgICAgICAgICByZXR1cm4gKChiIDwgYSkgPyAtMSA6ICgoYiA+IGEpID8gMSA6IDApKTsNCiAgICAgICAgICAgIH07DQoNCiAgICAgICAgICAgIGZ1bmN0aW9uIHNvcnROdW1lcmljKGEsIGIpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gYSAtIGI7DQogICAgICAgICAgICB9Ow0KDQogICAgICAgICAgICBmdW5jdGlvbiBzb3J0TnVtZXJpY0Rlc2MoYSwgYikgew0KICAgICAgICAgICAgICAgIHJldHVybiBiIC0gYTsNCiAgICAgICAgICAgIH07DQoNCiAgICAgICAgICAgIGZ1bmN0aW9uIGdldENhY2hlZFNvcnRUeXBlKHBhcnNlcnMsIGkpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2Vyc1tpXS50eXBlOw0KICAgICAgICAgICAgfTsgLyogcHVibGljIG1ldGhvZHMgKi8NCiAgICAgICAgICAgIHRoaXMuY29uc3RydWN0ID0gZnVuY3Rpb24gKHNldHRpbmdzKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICAgICAgICAgIC8vIGlmIG5vIHRoZWFkIG9yIHRib2R5IHF1aXQuDQogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy50SGVhZCB8fCAhdGhpcy50Qm9kaWVzKSByZXR1cm47DQogICAgICAgICAgICAgICAgICAgIC8vIGRlY2xhcmUNCiAgICAgICAgICAgICAgICAgICAgdmFyICR0aGlzLCAkZG9jdW1lbnQsICRoZWFkZXJzLCBjYWNoZSwgY29uZmlnLCBzaGlmdERvd24gPSAwLA0KICAgICAgICAgICAgICAgICAgICAgICAgc29ydE9yZGVyOw0KICAgICAgICAgICAgICAgICAgICAvLyBuZXcgYmxhbmsgY29uZmlnIG9iamVjdA0KICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZyA9IHt9Ow0KICAgICAgICAgICAgICAgICAgICAvLyBtZXJnZSBhbmQgZXh0ZW5kLg0KICAgICAgICAgICAgICAgICAgICBjb25maWcgPSAkLmV4dGVuZCh0aGlzLmNvbmZpZywgJC50YWJsZXNvcnRlci5kZWZhdWx0cywgc2V0dGluZ3MpOw0KICAgICAgICAgICAgICAgICAgICAvLyBzdG9yZSBjb21tb24gZXhwcmVzc2lvbiBmb3Igc3BlZWQNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMgPSAkKHRoaXMpOw0KICAgICAgICAgICAgICAgICAgICAvLyBzYXZlIHRoZSBzZXR0aW5ncyB3aGVyZSB0aGV5IHJlYWQNCiAgICAgICAgICAgICAgICAgICAgJC5kYXRhKHRoaXMsICJ0YWJsZXNvcnRlciIsIGNvbmZpZyk7DQogICAgICAgICAgICAgICAgICAgIC8vIGJ1aWxkIGhlYWRlcnMNCiAgICAgICAgICAgICAgICAgICAgJGhlYWRlcnMgPSBidWlsZEhlYWRlcnModGhpcyk7DQogICAgICAgICAgICAgICAgICAgIC8vIHRyeSB0byBhdXRvIGRldGVjdCBjb2x1bW4gdHlwZSwgYW5kIHN0b3JlIGluIHRhYmxlcyBjb25maWcNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWcucGFyc2VycyA9IGJ1aWxkUGFyc2VyQ2FjaGUodGhpcywgJGhlYWRlcnMpOw0KICAgICAgICAgICAgICAgICAgICAvLyBidWlsZCB0aGUgY2FjaGUgZm9yIHRoZSB0Ym9keSBjZWxscw0KICAgICAgICAgICAgICAgICAgICBjYWNoZSA9IGJ1aWxkQ2FjaGUodGhpcyk7DQogICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgY3NzIGNsYXNzIG5hbWVzLCBjb3VsZCBiZSBkb25lIGVsc2Ugd2hlcmUuDQogICAgICAgICAgICAgICAgICAgIHZhciBzb3J0Q1NTID0gW2NvbmZpZy5jc3NEZXNjLCBjb25maWcuY3NzQXNjXTsNCiAgICAgICAgICAgICAgICAgICAgLy8gZml4YXRlIGNvbHVtbnMgaWYgdGhlIHVzZXJzIHN1cHBsaWVzIHRoZSBmaXhlZFdpZHRoIG9wdGlvbg0KICAgICAgICAgICAgICAgICAgICBmaXhDb2x1bW5XaWR0aCh0aGlzKTsNCiAgICAgICAgICAgICAgICAgICAgLy8gYXBwbHkgZXZlbnQgaGFuZGxpbmcgdG8gaGVhZGVycw0KICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIHRvIGJpZywgcGVyaGFwcyBicmVhayBpdCBvdXQ/DQogICAgICAgICAgICAgICAgICAgICRoZWFkZXJzLmNsaWNrKA0KDQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdG90YWxSb3dzID0gKCR0aGlzWzBdLnRCb2RpZXNbMF0gJiYgJHRoaXNbMF0udEJvZGllc1swXS5yb3dzLmxlbmd0aCkgfHwgMDsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5zb3J0RGlzYWJsZWQgJiYgdG90YWxSb3dzID4gMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgY2FsbCBzb3J0U3RhcnQgaWYgc29ydGluZyBpcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVuYWJsZWQuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMudHJpZ2dlcigic29ydFN0YXJ0Iik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RvcmUgZXhwLCBmb3Igc3BlZWQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgJGNlbGwgPSAkKHRoaXMpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCBjdXJyZW50IGNvbHVtbiBpbmRleA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gdGhpcy5jb2x1bW47DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IGN1cnJlbnQgY29sdW1uIHNvcnQgb3JkZXINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9yZGVyID0gdGhpcy5jb3VudCsrICUgMjsNCgkJCQkJCQkvLyBhbHdheXMgc29ydCBvbiB0aGUgbG9ja2VkIG9yZGVyLg0KCQkJCQkJCWlmKHRoaXMubG9ja2VkT3JkZXIpIHRoaXMub3JkZXIgPSB0aGlzLmxvY2tlZE9yZGVyOw0KCQkJCQkJCQ0KCQkJCQkJCS8vIHVzZXIgb25seSB3aGFudHMgdG8gc29ydCBvbiBvbmUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2x1bW4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWVbY29uZmlnLnNvcnRNdWx0aVNvcnRLZXldKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZsdXNoIHRoZSBzb3J0IGxpc3QNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnNvcnRMaXN0ID0gW107DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcuc29ydEZvcmNlICE9IG51bGwpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gY29uZmlnLnNvcnRGb3JjZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgYS5sZW5ndGg7IGorKykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhW2pdWzBdICE9IGkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnNvcnRMaXN0LnB1c2goYVtqXSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZCBjb2x1bW4gdG8gc29ydCBsaXN0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zb3J0TGlzdC5wdXNoKFtpLCB0aGlzLm9yZGVyXSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG11bHRpIGNvbHVtbiBzb3J0aW5nDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHVzZXIgaGFzIGNsaWNrZWQgb24gYW4gYWxsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlYWR5IHNvcnRldCBjb2x1bW4uDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1ZhbHVlSW5BcnJheShpLCBjb25maWcuc29ydExpc3QpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXZlcnMgdGhlIHNvcnRpbmcgZGlyZWN0aW9uDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgYWxsIHRhYmxlcy4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgY29uZmlnLnNvcnRMaXN0Lmxlbmd0aDsgaisrKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSBjb25maWcuc29ydExpc3Rbal0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gPSBjb25maWcuaGVhZGVyTGlzdFtzWzBdXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc1swXSA9PSBpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8uY291bnQgPSBzWzFdOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLmNvdW50Kys7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNbMV0gPSBvLmNvdW50ICUgMjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGQgY29sdW1uIHRvIHNvcnQgbGlzdCBhcnJheQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnNvcnRMaXN0LnB1c2goW2ksIHRoaXMub3JkZXJdKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCBjc3MgZm9yIGhlYWRlcnMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SGVhZGVyc0NzcygkdGhpc1swXSwgJGhlYWRlcnMsIGNvbmZpZy5zb3J0TGlzdCwgc29ydENTUyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZFRvVGFibGUoDQoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpc1swXSwgbXVsdGlzb3J0KA0KCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXNbMF0sIGNvbmZpZy5zb3J0TGlzdCwgY2FjaGUpDQoJCQkJCQkJCSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgMSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RvcCBub3JtYWwgZXZlbnQgYnkgcmV0dXJuaW5nIGZhbHNlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FuY2VsIHNlbGVjdGlvbg0KICAgICAgICAgICAgICAgICAgICB9KS5tb3VzZWRvd24oZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5jYW5jZWxTZWxlY3Rpb24pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uc2VsZWN0c3RhcnQgPSBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICAgICAgICAgLy8gYXBwbHkgZWFzeSBtZXRob2RzIHRoYXQgdHJpZ2dlciBiaW5kZWQgZXZlbnRzDQogICAgICAgICAgICAgICAgICAgICR0aGlzLmJpbmQoInVwZGF0ZSIsIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtZSA9IHRoaXM7DQogICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWJ1aWxkIHBhcnNlcnMuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWUuY29uZmlnLnBhcnNlcnMgPSBidWlsZFBhcnNlckNhY2hlKA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lLCAkaGVhZGVycyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVidWlsZCB0aGUgY2FjaGUgbWFwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGUgPSBidWlsZENhY2hlKG1lKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0sIDEpOw0KICAgICAgICAgICAgICAgICAgICB9KS5iaW5kKCJ1cGRhdGVDZWxsIiwgZnVuY3Rpb24gKGUsIGNlbGwpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb25maWcgPSB0aGlzLmNvbmZpZzsNCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCBwb3NpdGlvbiBmcm9tIHRoZSBkb20uDQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcG9zID0gWyhjZWxsLnBhcmVudE5vZGUucm93SW5kZXggLSAxKSwgY2VsbC5jZWxsSW5kZXhdOw0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIGNhY2hlDQogICAgICAgICAgICAgICAgICAgICAgICBjYWNoZS5ub3JtYWxpemVkW3Bvc1swXV1bcG9zWzFdXSA9IGNvbmZpZy5wYXJzZXJzW3Bvc1sxXV0uZm9ybWF0KA0KICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RWxlbWVudFRleHQoY29uZmlnLCBjZWxsKSwgY2VsbCk7DQogICAgICAgICAgICAgICAgICAgIH0pLmJpbmQoInNvcnRvbiIsIGZ1bmN0aW9uIChlLCBsaXN0KSB7DQogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLnRyaWdnZXIoInNvcnRTdGFydCIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnNvcnRMaXN0ID0gbGlzdDsNCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBhbmQgc3RvcmUgdGhlIHNvcnRsaXN0DQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgc29ydExpc3QgPSBjb25maWcuc29ydExpc3Q7DQogICAgICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgaGVhZGVyIGNvdW50IGluZGV4DQogICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVIZWFkZXJTb3J0Q291bnQodGhpcywgc29ydExpc3QpOw0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IGNzcyBmb3IgaGVhZGVycw0KICAgICAgICAgICAgICAgICAgICAgICAgc2V0SGVhZGVyc0Nzcyh0aGlzLCAkaGVhZGVycywgc29ydExpc3QsIHNvcnRDU1MpOw0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gc29ydCB0aGUgdGFibGUgYW5kIGFwcGVuZCBpdCB0byB0aGUgZG9tDQogICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRUb1RhYmxlKHRoaXMsIG11bHRpc29ydCh0aGlzLCBzb3J0TGlzdCwgY2FjaGUpKTsNCiAgICAgICAgICAgICAgICAgICAgfSkuYmluZCgiYXBwZW5kQ2FjaGUiLCBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRUb1RhYmxlKHRoaXMsIGNhY2hlKTsNCiAgICAgICAgICAgICAgICAgICAgfSkuYmluZCgiYXBwbHlXaWRnZXRJZCIsIGZ1bmN0aW9uIChlLCBpZCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgZ2V0V2lkZ2V0QnlJZChpZCkuZm9ybWF0KHRoaXMpOw0KICAgICAgICAgICAgICAgICAgICB9KS5iaW5kKCJhcHBseVdpZGdldHMiLCBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAvLyBhcHBseSB3aWRnZXRzDQogICAgICAgICAgICAgICAgICAgICAgICBhcHBseVdpZGdldCh0aGlzKTsNCiAgICAgICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICAgICAgICAgIGlmICgkLm1ldGFkYXRhICYmICgkKHRoaXMpLm1ldGFkYXRhKCkgJiYgJCh0aGlzKS5tZXRhZGF0YSgpLnNvcnRsaXN0KSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnNvcnRMaXN0ID0gJCh0aGlzKS5tZXRhZGF0YSgpLnNvcnRsaXN0Ow0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIC8vIGlmIHVzZXIgaGFzIHN1cHBsaWVkIGEgc29ydCBsaXN0IHRvIGNvbnN0cnVjdG9yLg0KICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLnNvcnRMaXN0Lmxlbmd0aCA+IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLnRyaWdnZXIoInNvcnRvbiIsIFtjb25maWcuc29ydExpc3RdKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAvLyBhcHBseSB3aWRnZXRzDQogICAgICAgICAgICAgICAgICAgIGFwcGx5V2lkZ2V0KHRoaXMpOw0KICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgfTsNCiAgICAgICAgICAgIHRoaXMuYWRkUGFyc2VyID0gZnVuY3Rpb24gKHBhcnNlcikgew0KICAgICAgICAgICAgICAgIHZhciBsID0gcGFyc2Vycy5sZW5ndGgsDQogICAgICAgICAgICAgICAgICAgIGEgPSB0cnVlOw0KICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbDsgaSsrKSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChwYXJzZXJzW2ldLmlkLnRvTG93ZXJDYXNlKCkgPT0gcGFyc2VyLmlkLnRvTG93ZXJDYXNlKCkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGEgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAoYSkgew0KICAgICAgICAgICAgICAgICAgICBwYXJzZXJzLnB1c2gocGFyc2VyKTsNCiAgICAgICAgICAgICAgICB9Ow0KICAgICAgICAgICAgfTsNCiAgICAgICAgICAgIHRoaXMuYWRkV2lkZ2V0ID0gZnVuY3Rpb24gKHdpZGdldCkgew0KICAgICAgICAgICAgICAgIHdpZGdldHMucHVzaCh3aWRnZXQpOw0KICAgICAgICAgICAgfTsNCiAgICAgICAgICAgIHRoaXMuZm9ybWF0RmxvYXQgPSBmdW5jdGlvbiAocykgew0KICAgICAgICAgICAgICAgIHZhciBpID0gcGFyc2VGbG9hdChzKTsNCiAgICAgICAgICAgICAgICByZXR1cm4gKGlzTmFOKGkpKSA/IDAgOiBpOw0KICAgICAgICAgICAgfTsNCiAgICAgICAgICAgIHRoaXMuZm9ybWF0SW50ID0gZnVuY3Rpb24gKHMpIHsNCiAgICAgICAgICAgICAgICB2YXIgaSA9IHBhcnNlSW50KHMpOw0KICAgICAgICAgICAgICAgIHJldHVybiAoaXNOYU4oaSkpID8gMCA6IGk7DQogICAgICAgICAgICB9Ow0KICAgICAgICAgICAgdGhpcy5pc0RpZ2l0ID0gZnVuY3Rpb24gKHMsIGNvbmZpZykgew0KICAgICAgICAgICAgICAgIC8vIHJlcGxhY2UgYWxsIGFuIHdhbnRlZCBjaGFycyBhbmQgbWF0Y2guDQogICAgICAgICAgICAgICAgcmV0dXJuIC9eWy0rXT9cZCokLy50ZXN0KCQudHJpbShzLnJlcGxhY2UoL1ssLiddL2csICcnKSkpOw0KICAgICAgICAgICAgfTsNCiAgICAgICAgICAgIHRoaXMuY2xlYXJUYWJsZUJvZHkgPSBmdW5jdGlvbiAodGFibGUpIHsNCiAgICAgICAgICAgICAgICBpZiAoJC5icm93c2VyLm1zaWUpIHsNCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZW1wdHkoKSB7DQogICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAodGhpcy5maXJzdENoaWxkKQ0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVDaGlsZCh0aGlzLmZpcnN0Q2hpbGQpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVtcHR5LmFwcGx5KHRhYmxlLnRCb2RpZXNbMF0pOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIHRhYmxlLnRCb2RpZXNbMF0uaW5uZXJIVE1MID0gIiI7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfTsNCiAgICAgICAgfQ0KICAgIH0pOw0KDQogICAgLy8gZXh0ZW5kIHBsdWdpbiBzY29wZQ0KICAgICQuZm4uZXh0ZW5kKHsNCiAgICAgICAgdGFibGVzb3J0ZXI6ICQudGFibGVzb3J0ZXIuY29uc3RydWN0DQogICAgfSk7DQoNCiAgICAvLyBtYWtlIHNob3J0Y3V0DQogICAgdmFyIHRzID0gJC50YWJsZXNvcnRlcjsNCg0KICAgIC8vIGFkZCBkZWZhdWx0IHBhcnNlcnMNCiAgICB0cy5hZGRQYXJzZXIoew0KICAgICAgICBpZDogInRleHQiLA0KICAgICAgICBpczogZnVuY3Rpb24gKHMpIHsNCiAgICAgICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgICB9LCBmb3JtYXQ6IGZ1bmN0aW9uIChzKSB7DQogICAgICAgICAgICByZXR1cm4gJC50cmltKHMudG9Mb2NhbGVMb3dlckNhc2UoKSk7DQogICAgICAgIH0sIHR5cGU6ICJ0ZXh0Ig0KICAgIH0pOw0KDQogICAgdHMuYWRkUGFyc2VyKHsNCiAgICAgICAgaWQ6ICJkaWdpdCIsDQogICAgICAgIGlzOiBmdW5jdGlvbiAocywgdGFibGUpIHsNCiAgICAgICAgICAgIHZhciBjID0gdGFibGUuY29uZmlnOw0KICAgICAgICAgICAgcmV0dXJuICQudGFibGVzb3J0ZXIuaXNEaWdpdChzLCBjKTsNCiAgICAgICAgfSwgZm9ybWF0OiBmdW5jdGlvbiAocykgew0KICAgICAgICAgICAgcmV0dXJuICQudGFibGVzb3J0ZXIuZm9ybWF0RmxvYXQocyk7DQogICAgICAgIH0sIHR5cGU6ICJudW1lcmljIg0KICAgIH0pOw0KDQogICAgdHMuYWRkUGFyc2VyKHsNCiAgICAgICAgaWQ6ICJjdXJyZW5jeSIsDQogICAgICAgIGlzOiBmdW5jdGlvbiAocykgew0KICAgICAgICAgICAgcmV0dXJuIC9eW8KjJOKCrD8uXS8udGVzdChzKTsNCiAgICAgICAgfSwgZm9ybWF0OiBmdW5jdGlvbiAocykgew0KICAgICAgICAgICAgcmV0dXJuICQudGFibGVzb3J0ZXIuZm9ybWF0RmxvYXQocy5yZXBsYWNlKG5ldyBSZWdFeHAoL1vCoyTigqxdL2cpLCAiIikpOw0KICAgICAgICB9LCB0eXBlOiAibnVtZXJpYyINCiAgICB9KTsNCg0KICAgIHRzLmFkZFBhcnNlcih7DQogICAgICAgIGlkOiAiaXBBZGRyZXNzIiwNCiAgICAgICAgaXM6IGZ1bmN0aW9uIChzKSB7DQogICAgICAgICAgICByZXR1cm4gL15cZHsyLDN9W1wuXVxkezIsM31bXC5dXGR7MiwzfVtcLl1cZHsyLDN9JC8udGVzdChzKTsNCiAgICAgICAgfSwgZm9ybWF0OiBmdW5jdGlvbiAocykgew0KICAgICAgICAgICAgdmFyIGEgPSBzLnNwbGl0KCIuIiksDQogICAgICAgICAgICAgICAgciA9ICIiLA0KICAgICAgICAgICAgICAgIGwgPSBhLmxlbmd0aDsNCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbDsgaSsrKSB7DQogICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSBhW2ldOw0KICAgICAgICAgICAgICAgIGlmIChpdGVtLmxlbmd0aCA9PSAyKSB7DQogICAgICAgICAgICAgICAgICAgIHIgKz0gIjAiICsgaXRlbTsNCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICByICs9IGl0ZW07DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuICQudGFibGVzb3J0ZXIuZm9ybWF0RmxvYXQocik7DQogICAgICAgIH0sIHR5cGU6ICJudW1lcmljIg0KICAgIH0pOw0KDQogICAgdHMuYWRkUGFyc2VyKHsNCiAgICAgICAgaWQ6ICJ1cmwiLA0KICAgICAgICBpczogZnVuY3Rpb24gKHMpIHsNCiAgICAgICAgICAgIHJldHVybiAvXihodHRwcz98ZnRwfGZpbGUpOlwvXC8kLy50ZXN0KHMpOw0KICAgICAgICB9LCBmb3JtYXQ6IGZ1bmN0aW9uIChzKSB7DQogICAgICAgICAgICByZXR1cm4galF1ZXJ5LnRyaW0ocy5yZXBsYWNlKG5ldyBSZWdFeHAoLyhodHRwcz98ZnRwfGZpbGUpOlwvXC8vKSwgJycpKTsNCiAgICAgICAgfSwgdHlwZTogInRleHQiDQogICAgfSk7DQoNCiAgICB0cy5hZGRQYXJzZXIoew0KICAgICAgICBpZDogImlzb0RhdGUiLA0KICAgICAgICBpczogZnVuY3Rpb24gKHMpIHsNCiAgICAgICAgICAgIHJldHVybiAvXlxkezR9W1wvLV1cZHsxLDJ9W1wvLV1cZHsxLDJ9JC8udGVzdChzKTsNCiAgICAgICAgfSwgZm9ybWF0OiBmdW5jdGlvbiAocykgew0KICAgICAgICAgICAgcmV0dXJuICQudGFibGVzb3J0ZXIuZm9ybWF0RmxvYXQoKHMgIT0gIiIpID8gbmV3IERhdGUocy5yZXBsYWNlKA0KICAgICAgICAgICAgbmV3IFJlZ0V4cCgvLS9nKSwgIi8iKSkuZ2V0VGltZSgpIDogIjAiKTsNCiAgICAgICAgfSwgdHlwZTogIm51bWVyaWMiDQogICAgfSk7DQoNCiAgICB0cy5hZGRQYXJzZXIoew0KICAgICAgICBpZDogInBlcmNlbnQiLA0KICAgICAgICBpczogZnVuY3Rpb24gKHMpIHsNCiAgICAgICAgICAgIHJldHVybiAvXCUkLy50ZXN0KCQudHJpbShzKSk7DQogICAgICAgIH0sIGZvcm1hdDogZnVuY3Rpb24gKHMpIHsNCiAgICAgICAgICAgIHJldHVybiAkLnRhYmxlc29ydGVyLmZvcm1hdEZsb2F0KHMucmVwbGFjZShuZXcgUmVnRXhwKC8lL2cpLCAiIikpOw0KICAgICAgICB9LCB0eXBlOiAibnVtZXJpYyINCiAgICB9KTsNCg0KICAgIHRzLmFkZFBhcnNlcih7DQogICAgICAgIGlkOiAidXNMb25nRGF0ZSIsDQogICAgICAgIGlzOiBmdW5jdGlvbiAocykgew0KICAgICAgICAgICAgcmV0dXJuIHMubWF0Y2gobmV3IFJlZ0V4cCgvXltBLVphLXpdezMsMTB9XC4/IFswLTldezEsMn0sIChbMC05XXs0fXwnP1swLTldezJ9KSAoKFswLTJdP1swLTldOlswLTVdWzAtOV0pfChbMC0xXT9bMC05XTpbMC01XVswLTldXHMoQU18UE0pKSkkLykpOw0KICAgICAgICB9LCBmb3JtYXQ6IGZ1bmN0aW9uIChzKSB7DQogICAgICAgICAgICByZXR1cm4gJC50YWJsZXNvcnRlci5mb3JtYXRGbG9hdChuZXcgRGF0ZShzKS5nZXRUaW1lKCkpOw0KICAgICAgICB9LCB0eXBlOiAibnVtZXJpYyINCiAgICB9KTsNCg0KICAgIHRzLmFkZFBhcnNlcih7DQogICAgICAgIGlkOiAic2hvcnREYXRlIiwNCiAgICAgICAgaXM6IGZ1bmN0aW9uIChzKSB7DQogICAgICAgICAgICByZXR1cm4gL1xkezEsMn1bXC9cLV1cZHsxLDJ9W1wvXC1dXGR7Miw0fS8udGVzdChzKTsNCiAgICAgICAgfSwgZm9ybWF0OiBmdW5jdGlvbiAocywgdGFibGUpIHsNCiAgICAgICAgICAgIHZhciBjID0gdGFibGUuY29uZmlnOw0KICAgICAgICAgICAgcyA9IHMucmVwbGFjZSgvXC0vZywgIi8iKTsNCiAgICAgICAgICAgIGlmIChjLmRhdGVGb3JtYXQgPT0gInVzIikgew0KICAgICAgICAgICAgICAgIC8vIHJlZm9ybWF0IHRoZSBzdHJpbmcgaW4gSVNPIGZvcm1hdA0KICAgICAgICAgICAgICAgIHMgPSBzLnJlcGxhY2UoLyhcZHsxLDJ9KVtcL1wtXShcZHsxLDJ9KVtcL1wtXShcZHs0fSkvLCAiJDMvJDEvJDIiKTsNCiAgICAgICAgICAgIH0gZWxzZSBpZiAoYy5kYXRlRm9ybWF0ID09ICJ1ayIpIHsNCiAgICAgICAgICAgICAgICAvLyByZWZvcm1hdCB0aGUgc3RyaW5nIGluIElTTyBmb3JtYXQNCiAgICAgICAgICAgICAgICBzID0gcy5yZXBsYWNlKC8oXGR7MSwyfSlbXC9cLV0oXGR7MSwyfSlbXC9cLV0oXGR7NH0pLywgIiQzLyQyLyQxIik7DQogICAgICAgICAgICB9IGVsc2UgaWYgKGMuZGF0ZUZvcm1hdCA9PSAiZGQvbW0veXkiIHx8IGMuZGF0ZUZvcm1hdCA9PSAiZGQtbW0teXkiKSB7DQogICAgICAgICAgICAgICAgcyA9IHMucmVwbGFjZSgvKFxkezEsMn0pW1wvXC1dKFxkezEsMn0pW1wvXC1dKFxkezJ9KS8sICIkMS8kMi8kMyIpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuICQudGFibGVzb3J0ZXIuZm9ybWF0RmxvYXQobmV3IERhdGUocykuZ2V0VGltZSgpKTsNCiAgICAgICAgfSwgdHlwZTogIm51bWVyaWMiDQogICAgfSk7DQogICAgdHMuYWRkUGFyc2VyKHsNCiAgICAgICAgaWQ6ICJ0aW1lIiwNCiAgICAgICAgaXM6IGZ1bmN0aW9uIChzKSB7DQogICAgICAgICAgICByZXR1cm4gL14oKFswLTJdP1swLTldOlswLTVdWzAtOV0pfChbMC0xXT9bMC05XTpbMC01XVswLTldXHMoYW18cG0pKSkkLy50ZXN0KHMpOw0KICAgICAgICB9LCBmb3JtYXQ6IGZ1bmN0aW9uIChzKSB7DQogICAgICAgICAgICByZXR1cm4gJC50YWJsZXNvcnRlci5mb3JtYXRGbG9hdChuZXcgRGF0ZSgiMjAwMC8wMS8wMSAiICsgcykuZ2V0VGltZSgpKTsNCiAgICAgICAgfSwgdHlwZTogIm51bWVyaWMiDQogICAgfSk7DQogICAgdHMuYWRkUGFyc2VyKHsNCiAgICAgICAgaWQ6ICJtZXRhZGF0YSIsDQogICAgICAgIGlzOiBmdW5jdGlvbiAocykgew0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICB9LCBmb3JtYXQ6IGZ1bmN0aW9uIChzLCB0YWJsZSwgY2VsbCkgew0KICAgICAgICAgICAgdmFyIGMgPSB0YWJsZS5jb25maWcsDQogICAgICAgICAgICAgICAgcCA9ICghYy5wYXJzZXJNZXRhZGF0YU5hbWUpID8gJ3NvcnRWYWx1ZScgOiBjLnBhcnNlck1ldGFkYXRhTmFtZTsNCiAgICAgICAgICAgIHJldHVybiAkKGNlbGwpLm1ldGFkYXRhKClbcF07DQogICAgICAgIH0sIHR5cGU6ICJudW1lcmljIg0KICAgIH0pOw0KICAgIC8vIGFkZCBkZWZhdWx0IHdpZGdldHMNCiAgICB0cy5hZGRXaWRnZXQoew0KICAgICAgICBpZDogInplYnJhIiwNCiAgICAgICAgZm9ybWF0OiBmdW5jdGlvbiAodGFibGUpIHsNCiAgICAgICAgICAgIGlmICh0YWJsZS5jb25maWcuZGVidWcpIHsNCiAgICAgICAgICAgICAgICB2YXIgdGltZSA9IG5ldyBEYXRlKCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICB2YXIgJHRyLCByb3cgPSAtMSwNCiAgICAgICAgICAgICAgICBvZGQ7DQogICAgICAgICAgICAvLyBsb29wIHRocm91Z2ggdGhlIHZpc2libGUgcm93cw0KICAgICAgICAgICAgJCgidHI6dmlzaWJsZSIsIHRhYmxlLnRCb2RpZXNbMF0pLmVhY2goZnVuY3Rpb24gKGkpIHsNCiAgICAgICAgICAgICAgICAkdHIgPSAkKHRoaXMpOw0KICAgICAgICAgICAgICAgIC8vIHN0eWxlIGNoaWxkcmVuIHJvd3MgdGhlIHNhbWUgd2F5IHRoZSBwYXJlbnQNCiAgICAgICAgICAgICAgICAvLyByb3cgd2FzIHN0eWxlZA0KICAgICAgICAgICAgICAgIGlmICghJHRyLmhhc0NsYXNzKHRhYmxlLmNvbmZpZy5jc3NDaGlsZFJvdykpIHJvdysrOw0KICAgICAgICAgICAgICAgIG9kZCA9IChyb3cgJSAyID09IDApOw0KICAgICAgICAgICAgICAgICR0ci5yZW1vdmVDbGFzcygNCiAgICAgICAgICAgICAgICB0YWJsZS5jb25maWcud2lkZ2V0WmVicmEuY3NzW29kZCA/IDAgOiAxXSkuYWRkQ2xhc3MoDQogICAgICAgICAgICAgICAgdGFibGUuY29uZmlnLndpZGdldFplYnJhLmNzc1tvZGQgPyAxIDogMF0pDQogICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIGlmICh0YWJsZS5jb25maWcuZGVidWcpIHsNCiAgICAgICAgICAgICAgICAkLnRhYmxlc29ydGVyLmJlbmNobWFyaygiQXBwbHlpbmcgWmVicmEgd2lkZ2V0IiwgdGltZSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCn0pKGpRdWVyeSk7]]></data>
	</file>
	<file>
	  <filename>/lib/tablesorter.lib/jquery.tablesorter.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[CihmdW5jdGlvbigkKXskLmV4dGVuZCh7dGFibGVzb3J0ZXI6bmV3CmZ1bmN0aW9uKCl7dmFyIHBhcnNlcnM9W10sd2lkZ2V0cz1bXTt0aGlzLmRlZmF1bHRzPXtjc3NIZWFkZXI6ImhlYWRlciIsY3NzQXNjOiJoZWFkZXJTb3J0VXAiLGNzc0Rlc2M6ImhlYWRlclNvcnREb3duIixjc3NDaGlsZFJvdzoiZXhwYW5kLWNoaWxkIixzb3J0SW5pdGlhbE9yZGVyOiJhc2MiLHNvcnRNdWx0aVNvcnRLZXk6InNoaWZ0S2V5Iixzb3J0Rm9yY2U6bnVsbCxzb3J0QXBwZW5kOm51bGwsc29ydExvY2FsZUNvbXBhcmU6dHJ1ZSx0ZXh0RXh0cmFjdGlvbjoic2ltcGxlIixwYXJzZXJzOnt9LHdpZGdldHM6W10sd2lkZ2V0WmVicmE6e2NzczpbImV2ZW4iLCJvZGQiXX0saGVhZGVyczp7fSx3aWR0aEZpeGVkOmZhbHNlLGNhbmNlbFNlbGVjdGlvbjp0cnVlLHNvcnRMaXN0OltdLGhlYWRlckxpc3Q6W10sZGF0ZUZvcm1hdDoidXMiLGRlY2ltYWw6Jy9cLnxcLC9nJyxvblJlbmRlckhlYWRlcjpudWxsLHNlbGVjdG9ySGVhZGVyczondGhlYWQgdGgnLGRlYnVnOmZhbHNlfTtmdW5jdGlvbiBiZW5jaG1hcmsocyxkKXtsb2cocysiLCIrKG5ldyBEYXRlKCkuZ2V0VGltZSgpLWQuZ2V0VGltZSgpKSsibXMiKTt9dGhpcy5iZW5jaG1hcms9YmVuY2htYXJrO2Z1bmN0aW9uIGxvZyhzKXtpZih0eXBlb2YgY29uc29sZSE9InVuZGVmaW5lZCImJnR5cGVvZiBjb25zb2xlLmRlYnVnIT0idW5kZWZpbmVkIil7Y29uc29sZS5sb2cocyk7fWVsc2V7YWxlcnQocyk7fX1mdW5jdGlvbiBidWlsZFBhcnNlckNhY2hlKHRhYmxlLCRoZWFkZXJzKXtpZih0YWJsZS5jb25maWcuZGVidWcpe3ZhciBwYXJzZXJzRGVidWc9IiI7fWlmKHRhYmxlLnRCb2RpZXMubGVuZ3RoPT0wKXJldHVybjt2YXIgcm93cz10YWJsZS50Qm9kaWVzWzBdLnJvd3M7aWYocm93c1swXSl7dmFyIGxpc3Q9W10sY2VsbHM9cm93c1swXS5jZWxscyxsPWNlbGxzLmxlbmd0aDtmb3IodmFyIGk9MDtpPGw7aSsrKXt2YXIgcD1mYWxzZTtpZigkLm1ldGFkYXRhJiYoJCgkaGVhZGVyc1tpXSkubWV0YWRhdGEoKSYmJCgkaGVhZGVyc1tpXSkubWV0YWRhdGEoKS5zb3J0ZXIpKXtwPWdldFBhcnNlckJ5SWQoJCgkaGVhZGVyc1tpXSkubWV0YWRhdGEoKS5zb3J0ZXIpO31lbHNlIGlmKCh0YWJsZS5jb25maWcuaGVhZGVyc1tpXSYmdGFibGUuY29uZmlnLmhlYWRlcnNbaV0uc29ydGVyKSl7cD1nZXRQYXJzZXJCeUlkKHRhYmxlLmNvbmZpZy5oZWFkZXJzW2ldLnNvcnRlcik7fWlmKCFwKXtwPWRldGVjdFBhcnNlckZvckNvbHVtbih0YWJsZSxyb3dzLC0xLGkpO31pZih0YWJsZS5jb25maWcuZGVidWcpe3BhcnNlcnNEZWJ1Zys9ImNvbHVtbjoiK2krIiBwYXJzZXI6IitwLmlkKyJcbiI7fWxpc3QucHVzaChwKTt9fWlmKHRhYmxlLmNvbmZpZy5kZWJ1Zyl7bG9nKHBhcnNlcnNEZWJ1Zyk7fXJldHVybiBsaXN0O307ZnVuY3Rpb24gZGV0ZWN0UGFyc2VyRm9yQ29sdW1uKHRhYmxlLHJvd3Mscm93SW5kZXgsY2VsbEluZGV4KXt2YXIgbD1wYXJzZXJzLmxlbmd0aCxub2RlPWZhbHNlLG5vZGVWYWx1ZT1mYWxzZSxrZWVwTG9va2luZz10cnVlO3doaWxlKG5vZGVWYWx1ZT09JycmJmtlZXBMb29raW5nKXtyb3dJbmRleCsrO2lmKHJvd3Nbcm93SW5kZXhdKXtub2RlPWdldE5vZGVGcm9tUm93QW5kQ2VsbEluZGV4KHJvd3Mscm93SW5kZXgsY2VsbEluZGV4KTtub2RlVmFsdWU9dHJpbUFuZEdldE5vZGVUZXh0KHRhYmxlLmNvbmZpZyxub2RlKTtpZih0YWJsZS5jb25maWcuZGVidWcpe2xvZygnQ2hlY2tpbmcgaWYgdmFsdWUgd2FzIGVtcHR5IG9uIHJvdzonK3Jvd0luZGV4KTt9fWVsc2V7a2VlcExvb2tpbmc9ZmFsc2U7fX1mb3IodmFyIGk9MTtpPGw7aSsrKXtpZihwYXJzZXJzW2ldLmlzKG5vZGVWYWx1ZSx0YWJsZSxub2RlKSl7cmV0dXJuIHBhcnNlcnNbaV07fX1yZXR1cm4gcGFyc2Vyc1swXTt9ZnVuY3Rpb24gZ2V0Tm9kZUZyb21Sb3dBbmRDZWxsSW5kZXgocm93cyxyb3dJbmRleCxjZWxsSW5kZXgpe3JldHVybiByb3dzW3Jvd0luZGV4XS5jZWxsc1tjZWxsSW5kZXhdO31mdW5jdGlvbiB0cmltQW5kR2V0Tm9kZVRleHQoY29uZmlnLG5vZGUpe3JldHVybiAkLnRyaW0oZ2V0RWxlbWVudFRleHQoY29uZmlnLG5vZGUpKTt9ZnVuY3Rpb24gZ2V0UGFyc2VyQnlJZChuYW1lKXt2YXIgbD1wYXJzZXJzLmxlbmd0aDtmb3IodmFyIGk9MDtpPGw7aSsrKXtpZihwYXJzZXJzW2ldLmlkLnRvTG93ZXJDYXNlKCk9PW5hbWUudG9Mb3dlckNhc2UoKSl7cmV0dXJuIHBhcnNlcnNbaV07fX1yZXR1cm4gZmFsc2U7fWZ1bmN0aW9uIGJ1aWxkQ2FjaGUodGFibGUpe2lmKHRhYmxlLmNvbmZpZy5kZWJ1Zyl7dmFyIGNhY2hlVGltZT1uZXcgRGF0ZSgpO312YXIgdG90YWxSb3dzPSh0YWJsZS50Qm9kaWVzWzBdJiZ0YWJsZS50Qm9kaWVzWzBdLnJvd3MubGVuZ3RoKXx8MCx0b3RhbENlbGxzPSh0YWJsZS50Qm9kaWVzWzBdLnJvd3NbMF0mJnRhYmxlLnRCb2RpZXNbMF0ucm93c1swXS5jZWxscy5sZW5ndGgpfHwwLHBhcnNlcnM9dGFibGUuY29uZmlnLnBhcnNlcnMsY2FjaGU9e3JvdzpbXSxub3JtYWxpemVkOltdfTtmb3IodmFyIGk9MDtpPHRvdGFsUm93czsrK2kpe3ZhciBjPSQodGFibGUudEJvZGllc1swXS5yb3dzW2ldKSxjb2xzPVtdO2lmKGMuaGFzQ2xhc3ModGFibGUuY29uZmlnLmNzc0NoaWxkUm93KSl7Y2FjaGUucm93W2NhY2hlLnJvdy5sZW5ndGgtMV09Y2FjaGUucm93W2NhY2hlLnJvdy5sZW5ndGgtMV0uYWRkKGMpO2NvbnRpbnVlO31jYWNoZS5yb3cucHVzaChjKTtmb3IodmFyIGo9MDtqPHRvdGFsQ2VsbHM7KytqKXtjb2xzLnB1c2gocGFyc2Vyc1tqXS5mb3JtYXQoZ2V0RWxlbWVudFRleHQodGFibGUuY29uZmlnLGNbMF0uY2VsbHNbal0pLHRhYmxlLGNbMF0uY2VsbHNbal0pKTt9Y29scy5wdXNoKGNhY2hlLm5vcm1hbGl6ZWQubGVuZ3RoKTtjYWNoZS5ub3JtYWxpemVkLnB1c2goY29scyk7Y29scz1udWxsO307aWYodGFibGUuY29uZmlnLmRlYnVnKXtiZW5jaG1hcmsoIkJ1aWxkaW5nIGNhY2hlIGZvciAiK3RvdGFsUm93cysiIHJvd3M6IixjYWNoZVRpbWUpO31yZXR1cm4gY2FjaGU7fTtmdW5jdGlvbiBnZXRFbGVtZW50VGV4dChjb25maWcsbm9kZSl7dmFyIHRleHQ9IiI7aWYoIW5vZGUpcmV0dXJuIiI7aWYoIWNvbmZpZy5zdXBwb3J0c1RleHRDb250ZW50KWNvbmZpZy5zdXBwb3J0c1RleHRDb250ZW50PW5vZGUudGV4dENvbnRlbnR8fGZhbHNlO2lmKGNvbmZpZy50ZXh0RXh0cmFjdGlvbj09InNpbXBsZSIpe2lmKGNvbmZpZy5zdXBwb3J0c1RleHRDb250ZW50KXt0ZXh0PW5vZGUudGV4dENvbnRlbnQ7fWVsc2V7aWYobm9kZS5jaGlsZE5vZGVzWzBdJiZub2RlLmNoaWxkTm9kZXNbMF0uaGFzQ2hpbGROb2RlcygpKXt0ZXh0PW5vZGUuY2hpbGROb2Rlc1swXS5pbm5lckhUTUw7fWVsc2V7dGV4dD1ub2RlLmlubmVySFRNTDt9fX1lbHNle2lmKHR5cGVvZihjb25maWcudGV4dEV4dHJhY3Rpb24pPT0iZnVuY3Rpb24iKXt0ZXh0PWNvbmZpZy50ZXh0RXh0cmFjdGlvbihub2RlKTt9ZWxzZXt0ZXh0PSQobm9kZSkudGV4dCgpO319cmV0dXJuIHRleHQ7fWZ1bmN0aW9uIGFwcGVuZFRvVGFibGUodGFibGUsY2FjaGUpe2lmKHRhYmxlLmNvbmZpZy5kZWJ1Zyl7dmFyIGFwcGVuZFRpbWU9bmV3IERhdGUoKX12YXIgYz1jYWNoZSxyPWMucm93LG49Yy5ub3JtYWxpemVkLHRvdGFsUm93cz1uLmxlbmd0aCxjaGVja0NlbGw9KG5bMF0ubGVuZ3RoLTEpLHRhYmxlQm9keT0kKHRhYmxlLnRCb2RpZXNbMF0pLHJvd3M9W107Zm9yKHZhciBpPTA7aTx0b3RhbFJvd3M7aSsrKXt2YXIgcG9zPW5baV1bY2hlY2tDZWxsXTtyb3dzLnB1c2gocltwb3NdKTtpZighdGFibGUuY29uZmlnLmFwcGVuZGVyKXt2YXIgbD1yW3Bvc10ubGVuZ3RoO2Zvcih2YXIgaj0wO2o8bDtqKyspe3RhYmxlQm9keVswXS5hcHBlbmRDaGlsZChyW3Bvc11bal0pO319fWlmKHRhYmxlLmNvbmZpZy5hcHBlbmRlcil7dGFibGUuY29uZmlnLmFwcGVuZGVyKHRhYmxlLHJvd3MpO31yb3dzPW51bGw7aWYodGFibGUuY29uZmlnLmRlYnVnKXtiZW5jaG1hcmsoIlJlYnVpbHQgdGFibGU6IixhcHBlbmRUaW1lKTt9YXBwbHlXaWRnZXQodGFibGUpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXskKHRhYmxlKS50cmlnZ2VyKCJzb3J0RW5kIik7fSwwKTt9O2Z1bmN0aW9uIGJ1aWxkSGVhZGVycyh0YWJsZSl7aWYodGFibGUuY29uZmlnLmRlYnVnKXt2YXIgdGltZT1uZXcgRGF0ZSgpO312YXIgbWV0YT0oJC5tZXRhZGF0YSk/dHJ1ZTpmYWxzZTt2YXIgaGVhZGVyX2luZGV4PWNvbXB1dGVUYWJsZUhlYWRlckNlbGxJbmRleGVzKHRhYmxlKTskdGFibGVIZWFkZXJzPSQodGFibGUuY29uZmlnLnNlbGVjdG9ySGVhZGVycyx0YWJsZSkuZWFjaChmdW5jdGlvbihpbmRleCl7dGhpcy5jb2x1bW49aGVhZGVyX2luZGV4W3RoaXMucGFyZW50Tm9kZS5yb3dJbmRleCsiLSIrdGhpcy5jZWxsSW5kZXhdO3RoaXMub3JkZXI9Zm9ybWF0U29ydGluZ09yZGVyKHRhYmxlLmNvbmZpZy5zb3J0SW5pdGlhbE9yZGVyKTt0aGlzLmNvdW50PXRoaXMub3JkZXI7aWYoY2hlY2tIZWFkZXJNZXRhZGF0YSh0aGlzKXx8Y2hlY2tIZWFkZXJPcHRpb25zKHRhYmxlLGluZGV4KSl0aGlzLnNvcnREaXNhYmxlZD10cnVlO2lmKGNoZWNrSGVhZGVyT3B0aW9uc1NvcnRpbmdMb2NrZWQodGFibGUsaW5kZXgpKXRoaXMub3JkZXI9dGhpcy5sb2NrZWRPcmRlcj1jaGVja0hlYWRlck9wdGlvbnNTb3J0aW5nTG9ja2VkKHRhYmxlLGluZGV4KTtpZighdGhpcy5zb3J0RGlzYWJsZWQpe3ZhciAkdGg9JCh0aGlzKS5hZGRDbGFzcyh0YWJsZS5jb25maWcuY3NzSGVhZGVyKTtpZih0YWJsZS5jb25maWcub25SZW5kZXJIZWFkZXIpdGFibGUuY29uZmlnLm9uUmVuZGVySGVhZGVyLmFwcGx5KCR0aCk7fXRhYmxlLmNvbmZpZy5oZWFkZXJMaXN0W2luZGV4XT10aGlzO30pO2lmKHRhYmxlLmNvbmZpZy5kZWJ1Zyl7YmVuY2htYXJrKCJCdWlsdCBoZWFkZXJzOiIsdGltZSk7bG9nKCR0YWJsZUhlYWRlcnMpO31yZXR1cm4gJHRhYmxlSGVhZGVyczt9O2Z1bmN0aW9uIGNvbXB1dGVUYWJsZUhlYWRlckNlbGxJbmRleGVzKHQpe3ZhciBtYXRyaXg9W107dmFyIGxvb2t1cD17fTt2YXIgdGhlYWQ9dC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnVEhFQUQnKVswXTt2YXIgdHJzPXRoZWFkLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdUUicpO2Zvcih2YXIgaT0wO2k8dHJzLmxlbmd0aDtpKyspe3ZhciBjZWxscz10cnNbaV0uY2VsbHM7Zm9yKHZhciBqPTA7ajxjZWxscy5sZW5ndGg7aisrKXt2YXIgYz1jZWxsc1tqXTt2YXIgcm93SW5kZXg9Yy5wYXJlbnROb2RlLnJvd0luZGV4O3ZhciBjZWxsSWQ9cm93SW5kZXgrIi0iK2MuY2VsbEluZGV4O3ZhciByb3dTcGFuPWMucm93U3Bhbnx8MTt2YXIgY29sU3Bhbj1jLmNvbFNwYW58fDEKdmFyIGZpcnN0QXZhaWxDb2w7aWYodHlwZW9mKG1hdHJpeFtyb3dJbmRleF0pPT0idW5kZWZpbmVkIil7bWF0cml4W3Jvd0luZGV4XT1bXTt9Zm9yKHZhciBrPTA7azxtYXRyaXhbcm93SW5kZXhdLmxlbmd0aCsxO2srKyl7aWYodHlwZW9mKG1hdHJpeFtyb3dJbmRleF1ba10pPT0idW5kZWZpbmVkIil7Zmlyc3RBdmFpbENvbD1rO2JyZWFrO319bG9va3VwW2NlbGxJZF09Zmlyc3RBdmFpbENvbDtmb3IodmFyIGs9cm93SW5kZXg7azxyb3dJbmRleCtyb3dTcGFuO2srKyl7aWYodHlwZW9mKG1hdHJpeFtrXSk9PSJ1bmRlZmluZWQiKXttYXRyaXhba109W107fXZhciBtYXRyaXhyb3c9bWF0cml4W2tdO2Zvcih2YXIgbD1maXJzdEF2YWlsQ29sO2w8Zmlyc3RBdmFpbENvbCtjb2xTcGFuO2wrKyl7bWF0cml4cm93W2xdPSJ4Ijt9fX19cmV0dXJuIGxvb2t1cDt9ZnVuY3Rpb24gY2hlY2tDZWxsQ29sU3Bhbih0YWJsZSxyb3dzLHJvdyl7dmFyIGFycj1bXSxyPXRhYmxlLnRIZWFkLnJvd3MsYz1yW3Jvd10uY2VsbHM7Zm9yKHZhciBpPTA7aTxjLmxlbmd0aDtpKyspe3ZhciBjZWxsPWNbaV07aWYoY2VsbC5jb2xTcGFuPjEpe2Fycj1hcnIuY29uY2F0KGNoZWNrQ2VsbENvbFNwYW4odGFibGUsaGVhZGVyQXJyLHJvdysrKSk7fWVsc2V7aWYodGFibGUudEhlYWQubGVuZ3RoPT0xfHwoY2VsbC5yb3dTcGFuPjF8fCFyW3JvdysxXSkpe2Fyci5wdXNoKGNlbGwpO319fXJldHVybiBhcnI7fTtmdW5jdGlvbiBjaGVja0hlYWRlck1ldGFkYXRhKGNlbGwpe2lmKCgkLm1ldGFkYXRhKSYmKCQoY2VsbCkubWV0YWRhdGEoKS5zb3J0ZXI9PT1mYWxzZSkpe3JldHVybiB0cnVlO307cmV0dXJuIGZhbHNlO31mdW5jdGlvbiBjaGVja0hlYWRlck9wdGlvbnModGFibGUsaSl7aWYoKHRhYmxlLmNvbmZpZy5oZWFkZXJzW2ldKSYmKHRhYmxlLmNvbmZpZy5oZWFkZXJzW2ldLnNvcnRlcj09PWZhbHNlKSl7cmV0dXJuIHRydWU7fTtyZXR1cm4gZmFsc2U7fWZ1bmN0aW9uIGNoZWNrSGVhZGVyT3B0aW9uc1NvcnRpbmdMb2NrZWQodGFibGUsaSl7aWYoKHRhYmxlLmNvbmZpZy5oZWFkZXJzW2ldKSYmKHRhYmxlLmNvbmZpZy5oZWFkZXJzW2ldLmxvY2tlZE9yZGVyKSlyZXR1cm4gdGFibGUuY29uZmlnLmhlYWRlcnNbaV0ubG9ja2VkT3JkZXI7cmV0dXJuIGZhbHNlO31mdW5jdGlvbiBhcHBseVdpZGdldCh0YWJsZSl7dmFyIGM9dGFibGUuY29uZmlnLndpZGdldHM7dmFyIGw9Yy5sZW5ndGg7Zm9yKHZhciBpPTA7aTxsO2krKyl7Z2V0V2lkZ2V0QnlJZChjW2ldKS5mb3JtYXQodGFibGUpO319ZnVuY3Rpb24gZ2V0V2lkZ2V0QnlJZChuYW1lKXt2YXIgbD13aWRnZXRzLmxlbmd0aDtmb3IodmFyIGk9MDtpPGw7aSsrKXtpZih3aWRnZXRzW2ldLmlkLnRvTG93ZXJDYXNlKCk9PW5hbWUudG9Mb3dlckNhc2UoKSl7cmV0dXJuIHdpZGdldHNbaV07fX19O2Z1bmN0aW9uIGZvcm1hdFNvcnRpbmdPcmRlcih2KXtpZih0eXBlb2YodikhPSJOdW1iZXIiKXtyZXR1cm4odi50b0xvd2VyQ2FzZSgpPT0iZGVzYyIpPzE6MDt9ZWxzZXtyZXR1cm4odj09MSk/MTowO319ZnVuY3Rpb24gaXNWYWx1ZUluQXJyYXkodixhKXt2YXIgbD1hLmxlbmd0aDtmb3IodmFyIGk9MDtpPGw7aSsrKXtpZihhW2ldWzBdPT12KXtyZXR1cm4gdHJ1ZTt9fXJldHVybiBmYWxzZTt9ZnVuY3Rpb24gc2V0SGVhZGVyc0Nzcyh0YWJsZSwkaGVhZGVycyxsaXN0LGNzcyl7JGhlYWRlcnMucmVtb3ZlQ2xhc3MoY3NzWzBdKS5yZW1vdmVDbGFzcyhjc3NbMV0pO3ZhciBoPVtdOyRoZWFkZXJzLmVhY2goZnVuY3Rpb24ob2Zmc2V0KXtpZighdGhpcy5zb3J0RGlzYWJsZWQpe2hbdGhpcy5jb2x1bW5dPSQodGhpcyk7fX0pO3ZhciBsPWxpc3QubGVuZ3RoO2Zvcih2YXIgaT0wO2k8bDtpKyspe2hbbGlzdFtpXVswXV0uYWRkQ2xhc3MoY3NzW2xpc3RbaV1bMV1dKTt9fWZ1bmN0aW9uIGZpeENvbHVtbldpZHRoKHRhYmxlLCRoZWFkZXJzKXt2YXIgYz10YWJsZS5jb25maWc7aWYoYy53aWR0aEZpeGVkKXt2YXIgY29sZ3JvdXA9JCgnPGNvbGdyb3VwPicpOyQoInRyOmZpcnN0IHRkIix0YWJsZS50Qm9kaWVzWzBdKS5lYWNoKGZ1bmN0aW9uKCl7Y29sZ3JvdXAuYXBwZW5kKCQoJzxjb2w+JykuY3NzKCd3aWR0aCcsJCh0aGlzKS53aWR0aCgpKSk7fSk7JCh0YWJsZSkucHJlcGVuZChjb2xncm91cCk7fTt9ZnVuY3Rpb24gdXBkYXRlSGVhZGVyU29ydENvdW50KHRhYmxlLHNvcnRMaXN0KXt2YXIgYz10YWJsZS5jb25maWcsbD1zb3J0TGlzdC5sZW5ndGg7Zm9yKHZhciBpPTA7aTxsO2krKyl7dmFyIHM9c29ydExpc3RbaV0sbz1jLmhlYWRlckxpc3Rbc1swXV07by5jb3VudD1zWzFdO28uY291bnQrKzt9fWZ1bmN0aW9uIG11bHRpc29ydCh0YWJsZSxzb3J0TGlzdCxjYWNoZSl7aWYodGFibGUuY29uZmlnLmRlYnVnKXt2YXIgc29ydFRpbWU9bmV3IERhdGUoKTt9dmFyIGR5bmFtaWNFeHA9InZhciBzb3J0V3JhcHBlciA9IGZ1bmN0aW9uKGEsYikgeyIsbD1zb3J0TGlzdC5sZW5ndGg7Zm9yKHZhciBpPTA7aTxsO2krKyl7dmFyIGM9c29ydExpc3RbaV1bMF07dmFyIG9yZGVyPXNvcnRMaXN0W2ldWzFdO3ZhciBzPSh0YWJsZS5jb25maWcucGFyc2Vyc1tjXS50eXBlPT0idGV4dCIpPygob3JkZXI9PTApP21ha2VTb3J0RnVuY3Rpb24oInRleHQiLCJhc2MiLGMpOm1ha2VTb3J0RnVuY3Rpb24oInRleHQiLCJkZXNjIixjKSk6KChvcmRlcj09MCk/bWFrZVNvcnRGdW5jdGlvbigibnVtZXJpYyIsImFzYyIsYyk6bWFrZVNvcnRGdW5jdGlvbigibnVtZXJpYyIsImRlc2MiLGMpKTt2YXIgZT0iZSIraTtkeW5hbWljRXhwKz0idmFyICIrZSsiID0gIitzO2R5bmFtaWNFeHArPSJpZigiK2UrIikgeyByZXR1cm4gIitlKyI7IH0gIjtkeW5hbWljRXhwKz0iZWxzZSB7ICI7fXZhciBvcmdPcmRlckNvbD1jYWNoZS5ub3JtYWxpemVkWzBdLmxlbmd0aC0xO2R5bmFtaWNFeHArPSJyZXR1cm4gYVsiK29yZ09yZGVyQ29sKyJdLWJbIitvcmdPcmRlckNvbCsiXTsiO2Zvcih2YXIgaT0wO2k8bDtpKyspe2R5bmFtaWNFeHArPSJ9OyAiO31keW5hbWljRXhwKz0icmV0dXJuIDA7ICI7ZHluYW1pY0V4cCs9In07ICI7aWYodGFibGUuY29uZmlnLmRlYnVnKXtiZW5jaG1hcmsoIkV2YWxpbmcgZXhwcmVzc2lvbjoiK2R5bmFtaWNFeHAsbmV3IERhdGUoKSk7fWV2YWwoZHluYW1pY0V4cCk7Y2FjaGUubm9ybWFsaXplZC5zb3J0KHNvcnRXcmFwcGVyKTtpZih0YWJsZS5jb25maWcuZGVidWcpe2JlbmNobWFyaygiU29ydGluZyBvbiAiK3NvcnRMaXN0LnRvU3RyaW5nKCkrIiBhbmQgZGlyICIrb3JkZXIrIiB0aW1lOiIsc29ydFRpbWUpO31yZXR1cm4gY2FjaGU7fTtmdW5jdGlvbiBtYWtlU29ydEZ1bmN0aW9uKHR5cGUsZGlyZWN0aW9uLGluZGV4KXt2YXIgYT0iYVsiK2luZGV4KyJdIixiPSJiWyIraW5kZXgrIl0iO2lmKHR5cGU9PSd0ZXh0JyYmZGlyZWN0aW9uPT0nYXNjJyl7cmV0dXJuIigiK2ErIiA9PSAiK2IrIiA/IDAgOiAoIithKyIgPT09IG51bGwgPyBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkgOiAoIitiKyIgPT09IG51bGwgPyBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkgOiAoIithKyIgPCAiK2IrIikgPyAtMSA6IDEgKSkpOyI7fWVsc2UgaWYodHlwZT09J3RleHQnJiZkaXJlY3Rpb249PSdkZXNjJyl7cmV0dXJuIigiK2ErIiA9PSAiK2IrIiA/IDAgOiAoIithKyIgPT09IG51bGwgPyBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkgOiAoIitiKyIgPT09IG51bGwgPyBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkgOiAoIitiKyIgPCAiK2ErIikgPyAtMSA6IDEgKSkpOyI7fWVsc2UgaWYodHlwZT09J251bWVyaWMnJiZkaXJlY3Rpb249PSdhc2MnKXtyZXR1cm4iKCIrYSsiID09PSBudWxsICYmICIrYisiID09PSBudWxsKSA/IDAgOigiK2ErIiA9PT0gbnVsbCA/IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSA6ICgiK2IrIiA9PT0gbnVsbCA/IE51bWJlci5ORUdBVElWRV9JTkZJTklUWSA6ICIrYSsiIC0gIitiKyIpKTsiO31lbHNlIGlmKHR5cGU9PSdudW1lcmljJyYmZGlyZWN0aW9uPT0nZGVzYycpe3JldHVybiIoIithKyIgPT09IG51bGwgJiYgIitiKyIgPT09IG51bGwpID8gMCA6KCIrYSsiID09PSBudWxsID8gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZIDogKCIrYisiID09PSBudWxsID8gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZIDogIitiKyIgLSAiK2ErIikpOyI7fX07ZnVuY3Rpb24gbWFrZVNvcnRUZXh0KGkpe3JldHVybiIoKGFbIitpKyJdIDwgYlsiK2krIl0pID8gLTEgOiAoKGFbIitpKyJdID4gYlsiK2krIl0pID8gMSA6IDApKTsiO307ZnVuY3Rpb24gbWFrZVNvcnRUZXh0RGVzYyhpKXtyZXR1cm4iKChiWyIraSsiXSA8IGFbIitpKyJdKSA/IC0xIDogKChiWyIraSsiXSA+IGFbIitpKyJdKSA/IDEgOiAwKSk7Ijt9O2Z1bmN0aW9uIG1ha2VTb3J0TnVtZXJpYyhpKXtyZXR1cm4iYVsiK2krIl0tYlsiK2krIl07Ijt9O2Z1bmN0aW9uIG1ha2VTb3J0TnVtZXJpY0Rlc2MoaSl7cmV0dXJuImJbIitpKyJdLWFbIitpKyJdOyI7fTtmdW5jdGlvbiBzb3J0VGV4dChhLGIpe2lmKHRhYmxlLmNvbmZpZy5zb3J0TG9jYWxlQ29tcGFyZSlyZXR1cm4gYS5sb2NhbGVDb21wYXJlKGIpO3JldHVybigoYTxiKT8tMTooKGE+Yik/MTowKSk7fTtmdW5jdGlvbiBzb3J0VGV4dERlc2MoYSxiKXtpZih0YWJsZS5jb25maWcuc29ydExvY2FsZUNvbXBhcmUpcmV0dXJuIGIubG9jYWxlQ29tcGFyZShhKTtyZXR1cm4oKGI8YSk/LTE6KChiPmEpPzE6MCkpO307ZnVuY3Rpb24gc29ydE51bWVyaWMoYSxiKXtyZXR1cm4gYS1iO307ZnVuY3Rpb24gc29ydE51bWVyaWNEZXNjKGEsYil7cmV0dXJuIGItYTt9O2Z1bmN0aW9uIGdldENhY2hlZFNvcnRUeXBlKHBhcnNlcnMsaSl7cmV0dXJuIHBhcnNlcnNbaV0udHlwZTt9O3RoaXMuY29uc3RydWN0PWZ1bmN0aW9uKHNldHRpbmdzKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7aWYoIXRoaXMudEhlYWR8fCF0aGlzLnRCb2RpZXMpcmV0dXJuO3ZhciAkdGhpcywkZG9jdW1lbnQsJGhlYWRlcnMsY2FjaGUsY29uZmlnLHNoaWZ0RG93bj0wLHNvcnRPcmRlcjt0aGlzLmNvbmZpZz17fTtjb25maWc9JC5leHRlbmQodGhpcy5jb25maWcsJC50YWJsZXNvcnRlci5kZWZhdWx0cyxzZXR0aW5ncyk7JHRoaXM9JCh0aGlzKTskLmRhdGEodGhpcywidGFibGVzb3J0ZXIiLGNvbmZpZyk7JGhlYWRlcnM9YnVpbGRIZWFkZXJzKHRoaXMpO3RoaXMuY29uZmlnLnBhcnNlcnM9YnVpbGRQYXJzZXJDYWNoZSh0aGlzLCRoZWFkZXJzKTtjYWNoZT1idWlsZENhY2hlKHRoaXMpO3ZhciBzb3J0Q1NTPVtjb25maWcuY3NzRGVzYyxjb25maWcuY3NzQXNjXTtmaXhDb2x1bW5XaWR0aCh0aGlzKTskaGVhZGVycy5jbGljayhmdW5jdGlvbihlKXt2YXIgdG90YWxSb3dzPSgkdGhpc1swXS50Qm9kaWVzWzBdJiYkdGhpc1swXS50Qm9kaWVzWzBdLnJvd3MubGVuZ3RoKXx8MDtpZighdGhpcy5zb3J0RGlzYWJsZWQmJnRvdGFsUm93cz4wKXskdGhpcy50cmlnZ2VyKCJzb3J0U3RhcnQiKTt2YXIgJGNlbGw9JCh0aGlzKTt2YXIgaT10aGlzLmNvbHVtbjt0aGlzLm9yZGVyPXRoaXMuY291bnQrKyUyO2lmKHRoaXMubG9ja2VkT3JkZXIpdGhpcy5vcmRlcj10aGlzLmxvY2tlZE9yZGVyO2lmKCFlW2NvbmZpZy5zb3J0TXVsdGlTb3J0S2V5XSl7Y29uZmlnLnNvcnRMaXN0PVtdO2lmKGNvbmZpZy5zb3J0Rm9yY2UhPW51bGwpe3ZhciBhPWNvbmZpZy5zb3J0Rm9yY2U7Zm9yKHZhciBqPTA7ajxhLmxlbmd0aDtqKyspe2lmKGFbal1bMF0hPWkpe2NvbmZpZy5zb3J0TGlzdC5wdXNoKGFbal0pO319fWNvbmZpZy5zb3J0TGlzdC5wdXNoKFtpLHRoaXMub3JkZXJdKTt9ZWxzZXtpZihpc1ZhbHVlSW5BcnJheShpLGNvbmZpZy5zb3J0TGlzdCkpe2Zvcih2YXIgaj0wO2o8Y29uZmlnLnNvcnRMaXN0Lmxlbmd0aDtqKyspe3ZhciBzPWNvbmZpZy5zb3J0TGlzdFtqXSxvPWNvbmZpZy5oZWFkZXJMaXN0W3NbMF1dO2lmKHNbMF09PWkpe28uY291bnQ9c1sxXTtvLmNvdW50Kys7c1sxXT1vLmNvdW50JTI7fX19ZWxzZXtjb25maWcuc29ydExpc3QucHVzaChbaSx0aGlzLm9yZGVyXSk7fX07c2V0VGltZW91dChmdW5jdGlvbigpe3NldEhlYWRlcnNDc3MoJHRoaXNbMF0sJGhlYWRlcnMsY29uZmlnLnNvcnRMaXN0LHNvcnRDU1MpO2FwcGVuZFRvVGFibGUoJHRoaXNbMF0sbXVsdGlzb3J0KCR0aGlzWzBdLGNvbmZpZy5zb3J0TGlzdCxjYWNoZSkpO30sMSk7cmV0dXJuIGZhbHNlO319KS5tb3VzZWRvd24oZnVuY3Rpb24oKXtpZihjb25maWcuY2FuY2VsU2VsZWN0aW9uKXt0aGlzLm9uc2VsZWN0c3RhcnQ9ZnVuY3Rpb24oKXtyZXR1cm4gZmFsc2V9O3JldHVybiBmYWxzZTt9fSk7JHRoaXMuYmluZCgidXBkYXRlIixmdW5jdGlvbigpe3ZhciBtZT10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXttZS5jb25maWcucGFyc2Vycz1idWlsZFBhcnNlckNhY2hlKG1lLCRoZWFkZXJzKTtjYWNoZT1idWlsZENhY2hlKG1lKTt9LDEpO30pLmJpbmQoInVwZGF0ZUNlbGwiLGZ1bmN0aW9uKGUsY2VsbCl7dmFyIGNvbmZpZz10aGlzLmNvbmZpZzt2YXIgcG9zPVsoY2VsbC5wYXJlbnROb2RlLnJvd0luZGV4LTEpLGNlbGwuY2VsbEluZGV4XTtjYWNoZS5ub3JtYWxpemVkW3Bvc1swXV1bcG9zWzFdXT1jb25maWcucGFyc2Vyc1twb3NbMV1dLmZvcm1hdChnZXRFbGVtZW50VGV4dChjb25maWcsY2VsbCksY2VsbCk7fSkuYmluZCgic29ydG9uIixmdW5jdGlvbihlLGxpc3QpeyQodGhpcykudHJpZ2dlcigic29ydFN0YXJ0Iik7Y29uZmlnLnNvcnRMaXN0PWxpc3Q7dmFyIHNvcnRMaXN0PWNvbmZpZy5zb3J0TGlzdDt1cGRhdGVIZWFkZXJTb3J0Q291bnQodGhpcyxzb3J0TGlzdCk7c2V0SGVhZGVyc0Nzcyh0aGlzLCRoZWFkZXJzLHNvcnRMaXN0LHNvcnRDU1MpO2FwcGVuZFRvVGFibGUodGhpcyxtdWx0aXNvcnQodGhpcyxzb3J0TGlzdCxjYWNoZSkpO30pLmJpbmQoImFwcGVuZENhY2hlIixmdW5jdGlvbigpe2FwcGVuZFRvVGFibGUodGhpcyxjYWNoZSk7fSkuYmluZCgiYXBwbHlXaWRnZXRJZCIsZnVuY3Rpb24oZSxpZCl7Z2V0V2lkZ2V0QnlJZChpZCkuZm9ybWF0KHRoaXMpO30pLmJpbmQoImFwcGx5V2lkZ2V0cyIsZnVuY3Rpb24oKXthcHBseVdpZGdldCh0aGlzKTt9KTtpZigkLm1ldGFkYXRhJiYoJCh0aGlzKS5tZXRhZGF0YSgpJiYkKHRoaXMpLm1ldGFkYXRhKCkuc29ydGxpc3QpKXtjb25maWcuc29ydExpc3Q9JCh0aGlzKS5tZXRhZGF0YSgpLnNvcnRsaXN0O31pZihjb25maWcuc29ydExpc3QubGVuZ3RoPjApeyR0aGlzLnRyaWdnZXIoInNvcnRvbiIsW2NvbmZpZy5zb3J0TGlzdF0pO31hcHBseVdpZGdldCh0aGlzKTt9KTt9O3RoaXMuYWRkUGFyc2VyPWZ1bmN0aW9uKHBhcnNlcil7dmFyIGw9cGFyc2Vycy5sZW5ndGgsYT10cnVlO2Zvcih2YXIgaT0wO2k8bDtpKyspe2lmKHBhcnNlcnNbaV0uaWQudG9Mb3dlckNhc2UoKT09cGFyc2VyLmlkLnRvTG93ZXJDYXNlKCkpe2E9ZmFsc2U7fX1pZihhKXtwYXJzZXJzLnB1c2gocGFyc2VyKTt9O307dGhpcy5hZGRXaWRnZXQ9ZnVuY3Rpb24od2lkZ2V0KXt3aWRnZXRzLnB1c2god2lkZ2V0KTt9O3RoaXMuZm9ybWF0RmxvYXQ9ZnVuY3Rpb24ocyl7dmFyIGk9cGFyc2VGbG9hdChzKTtyZXR1cm4oaXNOYU4oaSkpPzA6aTt9O3RoaXMuZm9ybWF0SW50PWZ1bmN0aW9uKHMpe3ZhciBpPXBhcnNlSW50KHMpO3JldHVybihpc05hTihpKSk/MDppO307dGhpcy5pc0RpZ2l0PWZ1bmN0aW9uKHMsY29uZmlnKXtyZXR1cm4vXlstK10/XGQqJC8udGVzdCgkLnRyaW0ocy5yZXBsYWNlKC9bLC4nXS9nLCcnKSkpO307dGhpcy5jbGVhclRhYmxlQm9keT1mdW5jdGlvbih0YWJsZSl7aWYoJC5icm93c2VyLm1zaWUpe2Z1bmN0aW9uIGVtcHR5KCl7d2hpbGUodGhpcy5maXJzdENoaWxkKXRoaXMucmVtb3ZlQ2hpbGQodGhpcy5maXJzdENoaWxkKTt9ZW1wdHkuYXBwbHkodGFibGUudEJvZGllc1swXSk7fWVsc2V7dGFibGUudEJvZGllc1swXS5pbm5lckhUTUw9IiI7fX07fX0pOyQuZm4uZXh0ZW5kKHt0YWJsZXNvcnRlcjokLnRhYmxlc29ydGVyLmNvbnN0cnVjdH0pO3ZhciB0cz0kLnRhYmxlc29ydGVyO3RzLmFkZFBhcnNlcih7aWQ6InRleHQiLGlzOmZ1bmN0aW9uKHMpe3JldHVybiB0cnVlO30sZm9ybWF0OmZ1bmN0aW9uKHMpe3JldHVybiAkLnRyaW0ocy50b0xvY2FsZUxvd2VyQ2FzZSgpKTt9LHR5cGU6InRleHQifSk7dHMuYWRkUGFyc2VyKHtpZDoiZGlnaXQiLGlzOmZ1bmN0aW9uKHMsdGFibGUpe3ZhciBjPXRhYmxlLmNvbmZpZztyZXR1cm4gJC50YWJsZXNvcnRlci5pc0RpZ2l0KHMsYyk7fSxmb3JtYXQ6ZnVuY3Rpb24ocyl7cmV0dXJuICQudGFibGVzb3J0ZXIuZm9ybWF0RmxvYXQocyk7fSx0eXBlOiJudW1lcmljIn0pO3RzLmFkZFBhcnNlcih7aWQ6ImN1cnJlbmN5IixpczpmdW5jdGlvbihzKXtyZXR1cm4vXlvCoyTigqw/Ll0vLnRlc3Qocyk7fSxmb3JtYXQ6ZnVuY3Rpb24ocyl7cmV0dXJuICQudGFibGVzb3J0ZXIuZm9ybWF0RmxvYXQocy5yZXBsYWNlKG5ldyBSZWdFeHAoL1vCoyTigqxdL2cpLCIiKSk7fSx0eXBlOiJudW1lcmljIn0pO3RzLmFkZFBhcnNlcih7aWQ6ImlwQWRkcmVzcyIsaXM6ZnVuY3Rpb24ocyl7cmV0dXJuL15cZHsyLDN9W1wuXVxkezIsM31bXC5dXGR7MiwzfVtcLl1cZHsyLDN9JC8udGVzdChzKTt9LGZvcm1hdDpmdW5jdGlvbihzKXt2YXIgYT1zLnNwbGl0KCIuIikscj0iIixsPWEubGVuZ3RoO2Zvcih2YXIgaT0wO2k8bDtpKyspe3ZhciBpdGVtPWFbaV07aWYoaXRlbS5sZW5ndGg9PTIpe3IrPSIwIitpdGVtO31lbHNle3IrPWl0ZW07fX1yZXR1cm4gJC50YWJsZXNvcnRlci5mb3JtYXRGbG9hdChyKTt9LHR5cGU6Im51bWVyaWMifSk7dHMuYWRkUGFyc2VyKHtpZDoidXJsIixpczpmdW5jdGlvbihzKXtyZXR1cm4vXihodHRwcz98ZnRwfGZpbGUpOlwvXC8kLy50ZXN0KHMpO30sZm9ybWF0OmZ1bmN0aW9uKHMpe3JldHVybiBqUXVlcnkudHJpbShzLnJlcGxhY2UobmV3IFJlZ0V4cCgvKGh0dHBzP3xmdHB8ZmlsZSk6XC9cLy8pLCcnKSk7fSx0eXBlOiJ0ZXh0In0pO3RzLmFkZFBhcnNlcih7aWQ6Imlzb0RhdGUiLGlzOmZ1bmN0aW9uKHMpe3JldHVybi9eXGR7NH1bXC8tXVxkezEsMn1bXC8tXVxkezEsMn0kLy50ZXN0KHMpO30sZm9ybWF0OmZ1bmN0aW9uKHMpe3JldHVybiAkLnRhYmxlc29ydGVyLmZvcm1hdEZsb2F0KChzIT0iIik/bmV3IERhdGUocy5yZXBsYWNlKG5ldyBSZWdFeHAoLy0vZyksIi8iKSkuZ2V0VGltZSgpOiIwIik7fSx0eXBlOiJudW1lcmljIn0pO3RzLmFkZFBhcnNlcih7aWQ6InBlcmNlbnQiLGlzOmZ1bmN0aW9uKHMpe3JldHVybi9cJSQvLnRlc3QoJC50cmltKHMpKTt9LGZvcm1hdDpmdW5jdGlvbihzKXtyZXR1cm4gJC50YWJsZXNvcnRlci5mb3JtYXRGbG9hdChzLnJlcGxhY2UobmV3IFJlZ0V4cCgvJS9nKSwiIikpO30sdHlwZToibnVtZXJpYyJ9KTt0cy5hZGRQYXJzZXIoe2lkOiJ1c0xvbmdEYXRlIixpczpmdW5jdGlvbihzKXtyZXR1cm4gcy5tYXRjaChuZXcgUmVnRXhwKC9eW0EtWmEtel17MywxMH1cLj8gWzAtOV17MSwyfSwgKFswLTldezR9fCc/WzAtOV17Mn0pICgoWzAtMl0/WzAtOV06WzAtNV1bMC05XSl8KFswLTFdP1swLTldOlswLTVdWzAtOV1ccyhBTXxQTSkpKSQvKSk7fSxmb3JtYXQ6ZnVuY3Rpb24ocyl7cmV0dXJuICQudGFibGVzb3J0ZXIuZm9ybWF0RmxvYXQobmV3IERhdGUocykuZ2V0VGltZSgpKTt9LHR5cGU6Im51bWVyaWMifSk7dHMuYWRkUGFyc2VyKHtpZDoic2hvcnREYXRlIixpczpmdW5jdGlvbihzKXtyZXR1cm4vXGR7MSwyfVtcL1wtXVxkezEsMn1bXC9cLV1cZHsyLDR9Ly50ZXN0KHMpO30sZm9ybWF0OmZ1bmN0aW9uKHMsdGFibGUpe3ZhciBjPXRhYmxlLmNvbmZpZztzPXMucmVwbGFjZSgvXC0vZywiLyIpO2lmKGMuZGF0ZUZvcm1hdD09InVzIil7cz1zLnJlcGxhY2UoLyhcZHsxLDJ9KVtcL1wtXShcZHsxLDJ9KVtcL1wtXShcZHs0fSkvLCIkMy8kMS8kMiIpO31lbHNlIGlmKGMuZGF0ZUZvcm1hdD09InVrIil7cz1zLnJlcGxhY2UoLyhcZHsxLDJ9KVtcL1wtXShcZHsxLDJ9KVtcL1wtXShcZHs0fSkvLCIkMy8kMi8kMSIpO31lbHNlIGlmKGMuZGF0ZUZvcm1hdD09ImRkL21tL3l5Inx8Yy5kYXRlRm9ybWF0PT0iZGQtbW0teXkiKXtzPXMucmVwbGFjZSgvKFxkezEsMn0pW1wvXC1dKFxkezEsMn0pW1wvXC1dKFxkezJ9KS8sIiQxLyQyLyQzIik7fXJldHVybiAkLnRhYmxlc29ydGVyLmZvcm1hdEZsb2F0KG5ldyBEYXRlKHMpLmdldFRpbWUoKSk7fSx0eXBlOiJudW1lcmljIn0pO3RzLmFkZFBhcnNlcih7aWQ6InRpbWUiLGlzOmZ1bmN0aW9uKHMpe3JldHVybi9eKChbMC0yXT9bMC05XTpbMC01XVswLTldKXwoWzAtMV0/WzAtOV06WzAtNV1bMC05XVxzKGFtfHBtKSkpJC8udGVzdChzKTt9LGZvcm1hdDpmdW5jdGlvbihzKXtyZXR1cm4gJC50YWJsZXNvcnRlci5mb3JtYXRGbG9hdChuZXcgRGF0ZSgiMjAwMC8wMS8wMSAiK3MpLmdldFRpbWUoKSk7fSx0eXBlOiJudW1lcmljIn0pO3RzLmFkZFBhcnNlcih7aWQ6Im1ldGFkYXRhIixpczpmdW5jdGlvbihzKXtyZXR1cm4gZmFsc2U7fSxmb3JtYXQ6ZnVuY3Rpb24ocyx0YWJsZSxjZWxsKXt2YXIgYz10YWJsZS5jb25maWcscD0oIWMucGFyc2VyTWV0YWRhdGFOYW1lKT8nc29ydFZhbHVlJzpjLnBhcnNlck1ldGFkYXRhTmFtZTtyZXR1cm4gJChjZWxsKS5tZXRhZGF0YSgpW3BdO30sdHlwZToibnVtZXJpYyJ9KTt0cy5hZGRXaWRnZXQoe2lkOiJ6ZWJyYSIsZm9ybWF0OmZ1bmN0aW9uKHRhYmxlKXtpZih0YWJsZS5jb25maWcuZGVidWcpe3ZhciB0aW1lPW5ldyBEYXRlKCk7fXZhciAkdHIscm93PS0xLG9kZDskKCJ0cjp2aXNpYmxlIix0YWJsZS50Qm9kaWVzWzBdKS5lYWNoKGZ1bmN0aW9uKGkpeyR0cj0kKHRoaXMpO2lmKCEkdHIuaGFzQ2xhc3ModGFibGUuY29uZmlnLmNzc0NoaWxkUm93KSlyb3crKztvZGQ9KHJvdyUyPT0wKTskdHIucmVtb3ZlQ2xhc3ModGFibGUuY29uZmlnLndpZGdldFplYnJhLmNzc1tvZGQ/MDoxXSkuYWRkQ2xhc3ModGFibGUuY29uZmlnLndpZGdldFplYnJhLmNzc1tvZGQ/MTowXSl9KTtpZih0YWJsZS5jb25maWcuZGVidWcpeyQudGFibGVzb3J0ZXIuYmVuY2htYXJrKCJBcHBseWluZyBaZWJyYSB3aWRnZXQiLHRpbWUpO319fSk7fSkoalF1ZXJ5KTs=]]></data>
	</file>
	<file>
	  <filename>/lib/tablesorter.lib/themes/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/tablesorter.lib/themes/blue/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/tablesorter.lib/themes/blue/asc.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhFQAEAIAAACMtMP///yH5BAEAAAEALAAAAAAVAAQAAAINjB+gC+jP2ptn0WskLQA7]]></data>
	</file>
	<file>
	  <filename>/lib/tablesorter.lib/themes/blue/bg.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhFQAJAIAAACMtMP///yH5BAEAAAEALAAAAAAVAAkAAAIXjI+AywnaYnhUMoqt3gZXPmVg94yJVQAAOw==]]></data>
	</file>
	<file>
	  <filename>/lib/tablesorter.lib/themes/blue/blue.zip</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[UEsDBBQAAAAIAKV7DjcyBouJNQAAADYAAAAHAAAAYXNjLmdpZnP3dLOwTBRlYGFoYGBQ1jX4//+/4k8WRgYGRgYdBiAAyTAw8fbIL+B+cf7W7PSL2Sq6DNYAUEsDBBQAAAAIAKV7DjfeZTDnPwAAAEAAAAAGAAAAYmcuZ2lmc/d0s7BMFGXgZGhgYFDWNfj//7/iTxZGBgZGBh0GIADJMDCJ9/Q3nOa8lVQRYtS19h5buF1qwveezlAGBmsAUEsDBBQAAAAIAKV7Dje24DEINQAAADYAAAAIAAAAZGVzYy5naWZz93SzsEwUZWBhaGBgUNY1+P//v+JPFkYGBkYGHQYgAMkwMPH29DOeXLthTnOIUVckI4M1AFBLAwQUAAAACAAQCRA3k/FDzkoBAACQAwAACQAAAHN0eWxlLmNzc51S707CMBD/DE/RhJgokbFFJaR8FPcCxgfo1q67WHpNdwhofHdbNxIJGyHuvlzvmt+/bj5lJAqjGjadj3+7pD2jJ+XZ13hUoaVZJTZgDlx4EGY1HhWifNcet1bOSjToOZs8r2OF3UZ4DZZnqduz1BHLntx+1cE08Kk4WzoKgx1IqjnL0vQmnEjtaSYMaMuZUVW48N0jh2olJKPY3LOedYVI7Toq71GpFi/hiw7QSxUmWVDZoAHJJnme9+l0QkqwmrPH6OOiqiQ2bWp/uGEjdEDbenNb6ERDdXeaoFdOCeLMYteerh02QIAhl1LZSOdB1/FOufVNNOUQ4nxAW4HywEhGTccQHtaxzqz15dVm8qE8QSnM8YEI3UU2n6CUHekZ6CRPQy2ui/I1jN/ccKCiKbtEr0Vb484O40n1L8Den3HISk/MS1lIuYycP1BLAQIUABQAAAAIAKV7DjcyBouJNQAAADYAAAAHAAAAAAAAAAAAIAAAAAAAAABhc2MuZ2lmUEsBAhQAFAAAAAgApXsON95lMOc/AAAAQAAAAAYAAAAAAAAAAAAgAAAAWgAAAGJnLmdpZlBLAQIUABQAAAAIAKV7Dje24DEINQAAADYAAAAIAAAAAAAAAAAAIAAAAL0AAABkZXNjLmdpZlBLAQIUABQAAAAIABAJEDeT8UPOSgEAAJADAAAJAAAAAAAAAAEAIAAAABgBAABzdHlsZS5jc3NQSwUGAAAAAAQABADWAAAAiQIAAAAA]]></data>
	</file>
	<file>
	  <filename>/lib/tablesorter.lib/themes/blue/desc.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhFQAEAIAAACMtMP///yH5BAEAAAEALAAAAAAVAAQAAAINjI8Bya2wnINUMopZAQA7]]></data>
	</file>
	<file>
	  <filename>/lib/tablesorter.lib/themes/blue/style.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogdGFibGVzICovCnRhYmxlLnRhYmxlc29ydGVyIHsKCWZvbnQtZmFtaWx5OmFyaWFsOwoJYmFja2dyb3VuZC1jb2xvcjogI0NEQ0RDRDsKCW1hcmdpbjoxMHB4IDBwdCAxNXB4OwoJZm9udC1zaXplOiA4cHQ7Cgl3aWR0aDogMTAwJTsKCXRleHQtYWxpZ246IGxlZnQ7Cn0KdGFibGUudGFibGVzb3J0ZXIgdGhlYWQgdHIgdGgsIHRhYmxlLnRhYmxlc29ydGVyIHRmb290IHRyIHRoIHsKCWJhY2tncm91bmQtY29sb3I6ICNlNkVFRUU7Cglib3JkZXI6IDFweCBzb2xpZCAjRkZGOwoJZm9udC1zaXplOiA4cHQ7CglwYWRkaW5nOiA0cHg7Cn0KdGFibGUudGFibGVzb3J0ZXIgdGhlYWQgdHIgLmhlYWRlciB7CgliYWNrZ3JvdW5kLWltYWdlOiB1cmwoYmcuZ2lmKTsKCWJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7CgliYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXIgcmlnaHQ7CgljdXJzb3I6IHBvaW50ZXI7Cn0KdGFibGUudGFibGVzb3J0ZXIgdGJvZHkgdGQgewoJY29sb3I6ICMzRDNEM0Q7CglwYWRkaW5nOiA0cHg7CgliYWNrZ3JvdW5kLWNvbG9yOiAjRkZGOwoJdmVydGljYWwtYWxpZ246IHRvcDsKfQp0YWJsZS50YWJsZXNvcnRlciB0Ym9keSB0ci5vZGQgdGQgewoJYmFja2dyb3VuZC1jb2xvcjojRjBGMEY2Owp9CnRhYmxlLnRhYmxlc29ydGVyIHRoZWFkIHRyIC5oZWFkZXJTb3J0VXAgewoJYmFja2dyb3VuZC1pbWFnZTogdXJsKGFzYy5naWYpOwp9CnRhYmxlLnRhYmxlc29ydGVyIHRoZWFkIHRyIC5oZWFkZXJTb3J0RG93biB7CgliYWNrZ3JvdW5kLWltYWdlOiB1cmwoZGVzYy5naWYpOwp9CnRhYmxlLnRhYmxlc29ydGVyIHRoZWFkIHRyIC5oZWFkZXJTb3J0RG93biwgdGFibGUudGFibGVzb3J0ZXIgdGhlYWQgdHIgLmhlYWRlclNvcnRVcCB7CmJhY2tncm91bmQtY29sb3I6ICM4ZGJkZDg7Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/tablesorter.lib/themes/green/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/tablesorter.lib/themes/green/asc.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[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]]></data>
	</file>
	<file>
	  <filename>/lib/tablesorter.lib/themes/green/bg.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[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]]></data>
	</file>
	<file>
	  <filename>/lib/tablesorter.lib/themes/green/desc.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAASwAAAAhCAMAAABUSmYtAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAMAUExURWTEbWO+ZcbGxlDMWma9cMHWslq+S1HHU32+VFq/TaG3k4bGXpGlhG+wRWOkOz3DQEmxEvb29vX19fT09PPz8+np6cHBwfj4+G5ubuvr6+3t7ebm5t/f39zc3M3NzeTk5Pb29/Hy8d/g39ra2s7OzuTk4+np6vb39vHx8eDf4M7OzdbW1uLj4tXW1vDv7+/v7+Dg3/Py8+Pi49nY2czNzdjZ2d/g4O3u7e7t7erp6c3OztHS0uPj4+/w7/Lz89bW1eDf3/Lx8dLS0dnZ2fX19urq6ePk5NHR0c3NzPf2987Nztrb2tLR0ebm5enq6eLi4vb19fPz8u/v8O3s7dvb2trb29bV1fHx8vDw7/b399jY2fHy8tnZ2N/f4M3Mzdzb3NHR0vT19OTj4+zt7dLR0unq6tva2tjZ2PDw8Nra29zc2+Xm5u/w8PLy8+3t7Pf29vX29ePj4tHS0fX09NLS0uLj49vc3O3s7NbV1u3t7uLi49nY2Pf39tXV1tXW1dva2+7t7tjY2NXV1fT09eTj5OPi4u3u7u7u7tvb3M3OzfLx8s7Nze7u7erp6s3MzNvb2/Lz8ubl5v///+Dg4PLy8uzs7erq6vLy8czMzC7ALEbITdzb2+Pk41nPaDzFP+zs7Ozt7M3NzuXl5VnPXzfDLS7AIDnEO8zhv+np6L+/v2+rSUiuCY3HaFTNWNvc22POa1SuGufn5yW9H03LV+vq6mynSFexHjzFNE6zJF63JdfX10+oF1TNYLm5ube3t7GxsUmvEkqwFqipqVHMXInFYz3FQGPOaeLh4t/e3/b19k3LTfDv8PX09dnZ2vX29szNzOPj5Ofn6MvLzGbOeGbTeE2xDmbScOfo6FDMU1nFX8/OztTU0+jo6Ojp6E23Td7e3t7e38zLzN7f3k60JDfDOeXk5GPGZmbTd2PIY0bDQkbIQlq2TcHBwkqrFkquFka/QtDR0dHR0Fq6SdPT06WmpjnEMGTSc2bRcFHDU2TSdWbRd1qySk6wJEerCMvKy8rLy45tlFkAAAbsSURBVHja7Jp3WFNXGMavttatDXI7riG5JBAIJCEQEkMSIBICBGjCkCFbRMAFgqCCW8GqbW2LWkcLWlf30g7tdnbvvffee9t+J8lNzeV4PP6f7+bce77f+748fDyQJ+GGuTBU1MWEhYq6mPBQURczIVTUxUhCRV3ohxXj206V8DG8hOcB8ILc6j3zMRLe5Te2Slrhggw8ZfQMTpKI1TCUEorJKT3VMOjPcNrqCdOCf9/mwwG1Gp2mzRfE1b41bcLTsLwGqijRSRLxGpZSQjHx97TDMFclJs5NTCsMT4QnsLTCQnRJDN8E58JCoIVp3n7uXBATwxO9XVp4IXThc9PookQnScRrWEoJBxF/TzsM01yUkFqkS02do9PNSSgvSoCa09xcXtScmppQrkvQwQLanFqeoENOYDpdwlNF5ak6HV2U6CSJeA1LKaGYCD3tMEwxx3HTYbWg0w2jD71yaPQNXHHx5oUcV8y1AC/eMb2lpRgeO3du9vqmQ6QFZC4oyi30tYOiROcZvgxGw1JaKCJCTzsMw7Iq1j0jhb0ixXnjrYfPO/HrifMO33qjk3WyKieb4k6ZMcPtVrFggK3bqQKj28myKSpWNeOUqNOZcg2rcrMqlVMcJTpJIl7DUkooJkJPOwwze+LES+CAx65jBz/rP3rgaP+fHx3bNdFXV6PTbBBn+xow+qTZvuWPorrE754oihKdJBGvYSklFBOhpx2GsWmSkjSdHlu3Ztj5Lz+4/fi+49sffOn8YZq27qTeNo3Gk9TZ5unt7bTZPJq2Tk2vp63b1t1tg5Qt6f+oJ0nT5unstXWjjShKdJJEvIallHAQEXrKYRipwnvope+NGNm/fc+2vm17tvePHPGhVCo1SaVqqbQadlI7rGq9zypV2BVSu11hD0SRU4oUu/8aFCU5SeJpNBylhGIi9LTDMBFQC9bOiogw3HvHOQN7+/r6BgbO+fReB8JIWxsxK8JXs25fMGvBtYjeXotYbSBa6/PUglrr8wZHSU6iiNGwlBoOIjTfRWAYZrGhqaLKYTQ4frrljyd/6UO17wBzy1sGg9HYtNhQ4aioMjiaHAZDBSJVTQ7HYqPDAdhgDERXGpuqjFWGlRVGg9GxuEoUJTlJIl7DUkooJkJPOwwjS05OzpHVyGRD77zj9fv27t+/976B4UPuHCqTJefUJNfItspyZPB4rianBl2hamCzYUNOsiwQ9dKc5Bz/NjhKdJJEvIallFBMhJ52GCbOkptryY2Kixs6duRueM7atu3jL974auzQ66MsUXFRULLcyyxRUbmws3hPiMosSApE4+Isl0Wty5Wti7NYwBAcJTpJ4mk0HKWEYiL0tMMwdRkNVmt2dn7+v6Me/e22L8fvG//dbec+OupkXXaDta6uztqR0W5tyM9vh6Ou3ZqfbW3Pz8/ObujIyM4IRK3tGdaOhvx2QCA2BEeJTpKI17CUEoqJ0NMOw2i1q5aVxpemp//w9c0HX939+7vDd5/7980XfL+sdFFpaemi+KWw0hfFx6PHsmVa7aL0pfGr4tO1WrT8UUDxWtDTtfFLtau0wVGikySeRsNRSigmQk87DLN8pnJKXonyyrz7ZQ/d8+2PnzND/vrmnodk9yuVJcrljXlKpbJRuRwMjcoScCpnAlXmNTY2KvOmBKJK5czGkhLYz5wCFmVwlOgkiXgNSynhIOLvaYdhFGq1qdokVasfr3rx4THjHvjngXFjHv7A+L7dpFdU69Umk96uNingRZbUrtgoBVYNrz1M6AWIPhBV60HeqNDr1XYTIFGU5CSJeA1LKaGYCD3tMEy0XC6PzpJnRdc/1vjmTY8c+fnIIzdFXemJlttA6ZGDACXPqke7nuierOvqe+TR8ue9sUC0p74edllZ8utsCAdFiU6SiNewlBaKSKCnHAbeSLMp8B4S6p27PM90bD25tcPhuett1s2eWkKXwgaXP+pmfddgM70TKxI1LKWE/5Pgoc44DMNxl6/gzNykSWZu5867X/vEJn/h7s07Jq25lOPMa8xdK7q6utD/LDjzClhmcJnNHGwnXYpgIAprjZnjusxdnDhKdJJEvIallHAQ8fe0wzCVkZGTy8piIyfHxkbGrocuEjZbyipjKyvL1leWeXHZZJDRtnJT7JZNZcgxGWJ0UaKTJOI1LKWEYiL0tMMw8wp8NxALwvybsMxMdJ6XWRA2z7sJKyjIDHsCds96wTxEkCuTMkpykkS8droEFRQToacchpG4XDFTeXTrY8lUl/c+jkTi8t4IcS1ZwscskbS2TuVdrTwfw7t4SQx0MS4e6XwrXZTsJIp4DUMpoZgIPe0wofuGZ3PfMPQJhrP4rMPFoaIu5oJQURdzUaio6z8BBgBEVxm+ERVlyQAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/lib/tablesorter.lib/themes/green/green.zip</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[UEsDBBQAAAAIAJWIaDZDq0MDIAoAAGYKAAAIAAAAZGVzYy5wbmdVVgk81Gkfn9qSWlrptlYqIiS20oFVrszUTAYlE0WYTkKS0tauStFry5VNpdwk99EixLhi/v8xM2aaq5kxF3OZ04zS5v17393Pu+/3+Xye6/Mcv9/393yf50n3Rx00Xma2DAaDGcP9vANgsAUOUH2j4TdQHoTAboOKRWcOIA/AYHVDuxdniKH2+kSf44mBl7CJVyMSomEHoi6djraEx0SciQ6Ijoi6Fv8+2g0G+wbmfzjIJ6ovJrIremBgwB+PwXbG9VAbMV2H0IOBP3cFYbqRRW9y0gZOZpXduVTvE1nq6o7bD28w1el009PTWq1Wo9GIxeKenp6ZmZnY2FipVCqXy0UiEYfDYbFYAAAIBAKdTq9SqzhcDoPBAEFQIOCLxRKdXqdSqbgcLggCVCqVx+dRqFSlYh5cLkej1vB5fDqNjgcAGp3O4XLlU1CSS8RiAASJJBKfz1coFWqNhkqlcDkctUpFIhHpdPr0tE4iEfMFAiKRCAB4vU4PAiCDySARiSKRUCwR83g8yHSNRq1QKOUyOZPJYDCZVApFpVIrlQqdXk+j0VVqNZ1O43C4AB5gMVlEIkk7rRXw+TK5nEQkiSUSaBKNTlMqldBkFospFIkUSqVarZHLZXqIGd00n88jkogQQSQSicfnQ4PkMhmVQpXLp3jzftH0eh2FAnVQmAwm5BmNRqNQKFrttIAv4PN48ql5MJksAATUKjUIAFNTkO8SAI9nMplqjVokFM3NzXG5XLVaLZPJJRKJWq3C4/GO7xx8h5AsJhNaJoRw1q3fQwZBLgMAUCgUhhBO7cZtc3xnubfPFT/eLRZPdnd3X6qG+9UuzRw8GwQcZ7KYkeCFoFqziYkJ684NyJFgqURyscIvuMHCrX8nqsnq5BvrDx8+HKlcGwSEt7W1vXnzpqGhAV5niqhfU1lVhcaHpvdHuvfvjwTP8cZ5HDYH4gI5glQqlNPaaTqdMa3T4QE8ny+YmJgcGcFjwWQsORnZsBxLipuYnPTHB4b0nyKA4NgYeRKCeBL5BsmeBwc/gmdz2Khmq924vUKBIHIAiyVfjRyK9MV5+g55YlqRPT29iOo1iNo1vt2eo1DsiaOYdjiZTC4rL9/b5xRFuowlxqFxgVGkK1jiVUwjAlVvdbDacGQYSiO/xeSGwGAGMrj3gaBkhqzg6vHA4HUDda3UGuME19qNbVYmhlYbTUy9TC1NFy462/to4wnvd4tTX6ae6HkVE/MAc/BbTLCetFyelKTo1LNTmDdt3iMBYbLb1xcKESulizPb5XbD7ZHNeFqbU9BY/527Ge2/K/3Ra3dshFp+nj5hk/dW85moPKXz2zsTC5SpLIm7xtmULdzdisCMpxq5RWuNUNn3KU65phnvt7pTnCYJcQzJUnLqLY4It6DF7Hk5sLaP0rUrppdc/9bglS0Rbqoyexzg6azSN+Ocgq23gMjD9kZH7tjUN/d6JsKNOIsmej1f3j3HvjkVarISt7IzDJO8MXH8Mnmy2NsG3nfhOGLpkhW3jrgakUNzH2FKDyGfl5ABuO12xC8FZFboybFnBQX+tYdGexYynmEKX3qhwveF9Qb6CKv2/RCWO2mVnmx8aGvR74bucqfDzoPx5IiWl2Tjku86E85qjUPjVaK75sH4Fth2tnNnWdk6C9ersbrP5V6li6McbYe3aVtuF3tPrO8y8sUFYGw3eUI24BrtqO6b73Zu6r/Gr7lHcFVJ0zXLOddLcq402tk85aGeOOPkxxrCf6lhVi0sYb5v3Gp3bBc/t5L8JMG4OqHJLi/Q3HoffNNJXADCdsv8ejtSeH2HuL8M1kYu8ZB6XOeenXux4QfmLmJwcAn5osmZWTOnz6X0LuHD4vY+RaFthulzqxV1EVutV60sqvghreFcdvbO5xYn3mBpn7Z7/PHnTBefueGG+EtEQetUKdslcyBnjC4Sy+XNdLeCVhSyrqKGSf0Yczt3m3iu0gZOFollLVdKMm0Ridneb9PKcuNMVlwfjlhX1ZsyWabIXEfv/pnQ2hWT0qp/aK4qCrLbBS87X9VslhTg+vp8J8HuKG11QEdYxHfeWYEZqzrmzFZZ74Xzzu00L7tzepMWCvQK/2+pYMZ9J1bK4N5vUmY/fzYwAD9pTy7p9TvxvbN9b3BT7CmnCz0t99knHxyPscRINWOpUGZwEI4qvk+szzVbvmknxyd8HbahqKp4OGLnnpvtwoc2t8ReLQrY5ZETBreJtGaa/3hl5Y97CswNvBZvOopcPni6BLeAFm7kHWz29NW/jqblrfa9TWz4AzFv2j8433wIhQKzKENRXoq3/OlZ3RSnW9/167jXlLldjvXEmNWHodbhhChlcu2WCoOwovPhTRFeqEYHk2nSM4H5nMuev+nyP3ynMGndFjD76YX3mRkPvt+XJIhNBhmtcv529sx52ai0xAEdj/ZvZI04oNFt9U3JR+4PO/gt8+bzHPJ9akbyah40HX9nMn8e/knblfXGxy4kJd382l1i8ae8dfug4vu5jzETP+2TRIUl3W6prQUZWcTYmCHCpXsltR8LXsTEEAgEMHZyaAg09K6Rr6f+lvYlab+ly6KD6ZBIP9RDIk0fJS/HnW2pfpw3kF9eMaecBpac+vjnbAfu6otZPbD2RvfrRPS5c+LimbJ60tr+wZLBxmiMvFhbpqrmkVswzV/Q+1WYUXKL6lBLdXMPujjHqtAXh/6Ly6Yb5QmIk+nq4bez0d991Mgfvtjh9fWzqPBelN4+z3pYmHkNUdaIbjM3yhw2jbM7s/CoaJeLi52mfFExQogfyDalEZ4tXBMd97dQxy15inP3Iladb6liWB2t3lB3XTXuzLeYmfg1PtLi67uZro+lwUFSypYcdq3LVq7P47Famu3iY8Z17ocnF9//yeSo9AC7clRKSVppic4V/J/2m0MdH4LZZ3w+eFBnRMiH5p8+DW3e7RMmTn/M3C/Oug2zJrw62FE4WfhaKkkRENUTnQ37myu6LJJCQtTSi4ZLfP5ic02G38sKcwO2X9NWpYWp5HmHGyHxontbC268TRpDBQoxnvm9BvkeEuzPH8J3dK60N93lUHZnLodbBO4xwsXn13HxrFI4NnYC7Dg127fl1vgU4Lqlpi2Xj7+AD7Nvb28fnXPYo1l2HBv3BDC/aBOWEW657ELmE347PuzZnv/p9D83aV5WVs7I8OnNNoMDvgO19xxNXU4M20Xa249Qgx9fi6dHPSK2JgTKHiOjh5zXn06cjxtv3pj/HjPNshu7Tb7t/fK0Hn84sTA/xMSF0LHU3nbIKGVhEuF6j5v3I/ucHxEJ0IZJ7YtWz1835mlZf4Q6B15LlEa+D8rX//SbN0/NNozfFtI76JDV3IoShtW4bcB1JMONEp0dLcQ37MNyZVYZycZef0WgaDbtzGWOk3ZpWtPMa1x/UbGjKBV6dC6jKyulHgsMYN7B67tWrI5+D30UYXAflHetZ3jqvwFQSwMEFAAAAAgA8AgQN67s2hQTAQAAIQMAAAkAAABzdHlsZS5jc3ONUctugzAQPIevsJRLewCRR6uKXCk/UPUDDN4Yq67XMkuDWvXfi3lUSYE0Wsky3p0ZZpZ4riEif1boCBz7ClZHNBRW6hMSttna5hCscl68SYe1EWGBGl3C1vvUV9s7KUFlOxlv9/0sOgHtxMY2rEKtBFvHcXwIvgOaiFHp9QgaCrlW0iRMw5FaEsuFUEYm7GFJ//HZ1wKt8LTjZJZlE8Y5VAQfYDxwRm2X+lrAoRALsGs/GZXARR/4GVK9c9nmXjt9l8vIGnl/ad+BBU4JMzhcfxMPfXQXsffGh65TsqTpVsY2oZ3BDqEN1Lu4W8b42EGeuqcSenZeE151+9J+vdplz7wqbjP9j0aKp7+rPFMRcLPMD1BLAwQUAAAACACViGg2L0q8+zsKAABpCgAABwAAAGFzYy5wbmddVg04k+sbX/rQByVOUQnlI5WvTiGhskZtmvKRIvJN+SzHVzlEQkSdRlLhOOIgx2c+jgppjNimbW02m2222Ww2+7Sp0+H/dv7nXP/r/H/PdT3v+z7X89zXff/u5/7db8F5j9OaG3duBIFAmtAzEC8QaJUF8L5n/Wpg9oFFWgKPNVEucBcQqHXUfm0hH/jekeR6Kck7ITIpNSQxAuQSnhAaYQSNC4mK8IoICb9540OEEwi0GnT+rI9r+FBcWH8ECoU6j/aP7Ls+SOrw73f3HPHO6PfxH4D/0lOSh7ryqO5uQptrWK2jM/IktF1bqVQuLi4qFAq5XM7n8wcHB5eWluLj4+fn50UiEZfLZTAYNBoNg8FwOBylUiWVSRlMxtTUFBaL5XDYfL5AqVJKpVImg4nFYkgkEovNIpJIEvE3MJkMuUzOZrEpZAoagyFTKAwmU7QADJGAz8dgsTg8ns1miyVimVxOIhGZDIZMKsXjcRQKZXFRKRDw2RwODofDYNAqpQqLwU5Rp/A4HJc7yxfwWSwW4LpcLhOLJSKhiEqdmqJSSUSiVCqTSMRKlYpMpkhlMgqFzGAwMWgMjUrD4fCKRQWHzRaKRHgcni8QAIfIFLJEIgEO02jUWS5XLJHIZHKRSKgCmFEustksHB4HEITH41lsNrBJJBSSiCSRaIH1LS6ySqUkEoEFInWKCkRGJpOJRKJCschhc9gslmjhG6hUGgaLkUllWAxmYQGIXYBBo6lUqkwu485yV1ZWmEymTCYTCkUCgUAmk6LRaKt3Fm6jcBqVCpjxm7jqNHxCCEAkxGCws7OzfhNB9khLq3dGDkOO6JkBPn9uYGAgoQl6pmVD8chVH8wlKo0aho3xadnJ4/FM+wzh4xfnBYLY+jMX2w2cho94vDK50mM6OTl5rkHXBxPc29vb09PT3t4ObdWGtW1vaGz0RAcUDIc5D58Mw15jzbAYdAbABXwcLhFLFhWLFMrUolKJxqDZbA6PNzc+jo7EpkUS0uDtmyPx13lzc+fR3n7DQRNY7KdPhDkA/Dl4D5z+DQz0OJrOoHt0mtgjHWY5nDBUZCQhNWw0zA0JdhsF+3fDBwffw5q2w1q2uw2APwK5x330fw0lEAh1v/7qMGQTjv8hEnfdE+kdjk+OxKX6d8A82kxON60fHwPG+IO4Uj8QaJ0YCnHxSZsSPku95H1RD5XQ5RsXYzvaJbI1ebJGLdtkDTj0jBoEnAUy09jR4bImwMJlbdS2iuZu38tdLaTo/G6ir2NnV3KSuE9FT58Qm/Q29uo/GFmRT1ekT6jSGU/yrbdwoL/b6OYXvi5vO++pq2NwQBCKyit8rQdtaNjk7HeoX/TdBkOke5oByHo0jn7Y0HgmMDPsea2m1eg7b7cJpknBJc1T+38pryB5a+Zkas4/edi8Zfnm89XqnxKTXv5sfG88oylT6N32dt1LcxxUW7qzzAt8SKrqRNpcNDPDepw9qHHurm5b53twElSDsZ73Hlyde42eqYzV0kHq9AX6p+1JmnlFmKuB7IMOxVyCbVDXun3OUYPgVfqTf607vLKOgIGZW8OynhHxXlc+IZ49O9/i/nFQbQrhX1V9yiP4WOD7EtfZxmO7A0vnTArSNN0BP9c7i2zOHhq54R3SVUOA69JUsgxd2tA23YRnIzeGAw5KWJXely/fn2mPmTRrTTgA8Xfh3qmhOQU5GsGSqmbGg49Y1OXu3asA/LdoCp0meJEPelXYi09k0o0HnBLp0j/tHf32NSV27F8ovUagxW/btI78uvKAzetKi+c1oRcIHvePVe6fbDtg3+TlMOxZU2LCsrWouxv6l73DIw9/XqPuFH80WVxPPUdPTvzD0LDqdcjb1hZw/VMjrMI2WAE9nDFu6Gr7QWxgXahdabK1NWS/6Xc6v9Tvzmu/hkAcmTa43BpJLn+ywPgioef30FdY5SHPHtBrlzcXo0o+Tc/wxeJuitOzB/HwgfoXkyRqTE6pJX+lYR+UMMNf6FmsKTaHJSEgb/PqSq+Dtt4aC9FrfJ8+Vyd+oNebMV98uTu298a88pHx8Z9gdWaNPpaPfZEe0fkXmlV+dRvfgKN7DgqzzRNhj0JVQTk1Jvug+hCkJ8zcDAykS2eVbSqx6N565HSqxnQ7D+uoEpIPKUre7F5vHHdhqGh9EOb3jIWi3sk9t9ItQ7uyrzZPeG+Kbp7YpW/qULDXDekVfTTr44+62SHla/O4hQfyccylGwzxua9vVxHpb8ozEnZquIXJ1U7lvqgZY15N0dPYds/H1lF/U9Fm9eCcQ1p9aHJAxG/fB/iGHNHbveklxBPxL9Y7gD6g71d81o7zbnfr9Cv1qqb0FI0TvHdaTy0c6s163br9yoxzRl7ZOtjObbyw+nnyfCIiIrvhCdeEt9Qz+H8ZvFFGC3CP9wmg/eRpnIqMIeVZGmYsf3nyIi/AMKKg8P4dxGxLF8R19j2W5bznwCuj/VrF91/9VuxfefDy7qj2rD1HAfaHXI7o/2MueUexb0xKSubyAO+EYj4uqIju+IVKxWbMfb0t6NjVnJycTGop8ogJy8zcp59cSfoaGxOVmZmSEnbRLcXNKFqEbkux5aaqqbUfOvpPWs+fvVuVoufWFNj9+5H+I85//tEa36d6PD3Qd/hHVe/t6WMLb4br5O7u7rwR6zuPj584buC83ZoUzau3Lgza/nMLsWb2oVrh5J2qluKg2sBfNR8AV/CGlubpv4sKjeCPfbhpOrZ483T4Fv1lbv5E+Q/LX79IVncYwyIKEqHeVV6NsV5Wq06VdKypGOOffHwTDoePvf2Q3eDl0NdYu0ZJ2JfjukPf9Bh07xWkF+xo1lL6VIhern/cSzsoUTDy8srRlBnX0yvHb+FyR+j2/VH2/G3EW10fanua4BvTSky7DraUqTXlqQzMFOsghvdeLhoFNX+cJ6boGHmWcv5V/J0BVg+xiChXe6cpBcpyS9USfyinB9KsgozHVSs+uGQhomyrA4OSgkjdecdvdn51SLDQEsVczQr0LfvxueZM9d8yhgdv3aAoRb5Tv2a39vgpcF/GR3nSJPe2XaqDkzojdFrIN03aH3v984t4UqqmHcGxfa8nENTSiQ0GgiKkjX7qZy8sGl4ezE0RHVMIRuw+y/PtRBVtoaYjTy+Wp5cpFYrqAb/r3Lo2NPP75w5kj0sFwUYbY3Kfsm+hnSuO/q9M/1LSx48e6YyPhRrvQ6HcUC3ZVtp2k2UXUL6+Zc2NFnJWR4HRi7hZFDnGvmzPCOQezrXAA3Fvsq1Uu7DgI2EzslN3Kd5o+93P9iFPn87Rqvy0SAvTd7d9F57nvPlN1Nvq3Vs5Y7VFiApAbDTLqu8AN7MUaaP95GDkxofxGRYVLBl95NGZAPquPS25mz6X5yK6u/e/bSrmhaXpWhdkW6GGjSsTXtxHVEIArTL/r1aZJTEksQu78pZzZiyWJ2fwQM85bOXzaThA+4Dgy7msVSDzrB39BROHO4B/RRDU1QPSAg6+8x9QSwMEFAAAAAgAlYhoNsHYSPMgCgAAXwoAAAYAAABiZy5wbmdVlglU00cex2NVFCWUUkAExIpYD+6qHAIqCEiCiSApl0bFcAhK4gGIouIiIihiAWGtFOQoikQjiEvKLY2cOSCBBJIACUkIJJD7QlHYv7u1b/c37831Zr7vN5/5vflNbjD8MHidxToQCASGBPodA4FW2AP9LWtXAjUCGucANKvifWA+INDrPrfV90TAeGOyf0RyKCYu+Ur0pViQTwzmTOwPkKTo+NhjsdExVy/2x3qBQCtBwUcQ/qiO2J6enmBSVFz7hS7Gm6iOoJDe0BsdiKhOWCW+KLvnZEFNFqbeH/W7pzfhIKTBWKvVajQatVqtUqlEIlFXV9fCwgIajZ6bm5NIJEKhkMPhjI+Pk8lkgUCg1eoUSgWHy2GxWBQKRSDgi0RirU7L5XAVCgWDwaBQyDw+j85gyGVfTKVU8Xl8LpfDHGOSyOQxJpPD5UqkQJGIRSIyhUKl0fh8vkwuU6pUDAady+EoFQoajcpkMjUarVgs4gsEVCpVp9WRySQKmcJis2hUqkgsEgqneTwe4LpKpZTJ5JJ5CZvNYrHZDDpdoVDK5bKxMaZCqWQyx7Q6HZlE5nC44+xxAZ9PpdLUGvW8RAIsp1FpIrF4jDkG7JTL5ePjbJlcPi0UKpUqHYBFq5FI5vl8HpVGBQDRaDQeny+Zn2ePjzPoDB6PL5FIdTotc2xseXmZTgfm6GwWe2xsjE6nfzmiVKpWawR8AZ/Hk0qlbPY4mUJWAj6plGKRmAIAJZGkUsBttnBayOVyxWKxUqmcn5colQoSiQTsG2ezA/pgZDJlHjDJfOTg2cjBU9PT024EB6/uAyfx22ZmZkSi2fPPAwNx+ijKOQQ5AvLa+EHvWQwWAm+0ZY+zwxusSVOdMGL4nFjc2dk5OjqKwFkcrd2AIJ9ubm5uaGjA4/G1L16EkE7kdqOg9WZb26zsOi093jt7dx9EURI4k18KDA/jTQGotXKZXKPWMJksEpk0MzMbR0kbGRnWaLWwBsNgUmhk9ymv7j1xtAuzgIlmYUTY5OQkkUianOSQiKSoJti0QIDqiYO/tUX1odwIHjOzswEE34A+3+Hh4a6uP+OG0+KGr0CxZny+AIozG6RQAjp9h4C7pw5FtUCIA8SaZ8883nvG0C7HUS+EEEJjaClx1CtRb6DwetvD2LUDgBGJMe+TTDLJW0AgvWmInw8ijTX/5EpEaLh5z+vGRLpec1N7tqDw4NpfVgUGGkBuHVybVZC95XhJZs7KFT6rux0QrXexTRWvUsOTJliJusl0WbvOWusJQSc69vJFyx/QlPaZxXYZkdD7vdL2xOPLh/yRRyJqa+/rf2ua4lLk64/Ms0WM3LkZ4dIhSdbfTAhKswY59b2a3L156xTyJgr7u6lj37vQgEGubW4E+NDOyse/0ULBt2+C41+W7tm68KHJyLA2ZXYPqvIHnOrVxqLyW9N7g/1z4YU5o/WPjO/ldj7flN3s7nLx5pmokDSbtls1pqaVQWcWAtw3mK5wgKq0qpnbj83LZyW0P+9XrH/6NGDDtn0Qm5OEY1D3rIV0VvTjEl7WyBlkovhEGRrt63/xm5HxkpJ7vJKRkax1yExDs6GSkXurNl36ZlhkbO2EC6SLZqv8tkPen4uA6nf7zSbcjYa655fqY8FlUiu86kMZXyqAQl0deH8Y48Bp/Sm72Swo18W5vn+uVL/A9Zfmih34vlHDXOOy+IWfzMFBCZU5a70lzgbEugjdSxNtocnMA/xTcw138Nv8fRcXH8AZ/XW/nb/nGcuwxx/vzlzRhH6+Lg+9nfisNoL+MrQKHj9AfzlArkPALz6atc1NAwcB7L7okdp2hjreWmntmS9bui4vb5Vu/PS5ne/5bEEMTX6yhud1amXA0z2D+E8hiA0LE6F+IVVFtry99jVZZ2zUbwnOrrBjhc+IqDlGntdMI4FtPXvjNHsqnrLxRYIMLsaMnvWCICXlS0uOpeTqBBlNnc5qTZqYcA1kFi7dv1a4R1KOu3ncjZXzN6W7RpXPrbILdrXdPfnxYyRKD4/ksNnpn5u6XOK97YuhsGMvona9ulM2YogNkzVCTVPvjKDDx1aGCB7ZdEs79fwh8MI0C/Dhv052ZNUIT3PZxsYgHbPx5iGnOsvsztbRfzjTGIdJuXL6b973Z+w79KjeKTn01VUp+49uqk3Zj7nwSGB7D4D9YsrIV4VclR1dsvGJHXZTwG1+UWlGumRpUdqu61jMaJkTkActDAJQqp8O1VS/YXHPppobFOcg3DytiHmGa07fdjFCxp7HuYZZhv1sAQ7ofZMYAgj/D/U8ew8Pj/CwrUVgzzTieqcP5ZHVv94mxLwRjD8RWDDNInEG1kfpAkaFHQJ83rHV3i3SLOdaAvoSLsPS6mtI7vjR96inwfeYfmKjwL+791vLA3Gtur1ztx+evJ7+qf5ctX2IIiT4TVuQQ0jI1frGtKM5A/aB6/z4fId/BiT1FSXl4CPeGX0R4yXssfp6neBfYWHn4HCfrgMozOI04+F2LfyTkPEd/sHnyi3P+1lDQ6clpPl6V1OT5HfUoWiHvoZUExOBYE9KnDBGr4qRf+RcfKjPmh+MSjOr/z/u37LodgO8Adpw56I6f8IJs6wpoLIPf7raK8CEP3LYaWd33BhvFfax8A93dUSDLxZZ2OGFTjnREna/5MC6HfD111pc0c2p/3J1hyYXvh8+6/5VNowSBic6/XyyIONgquDZ646MZVtV7wa3TQWbgncFFdtZqoqhsdWXtplbFNdwERS9OhLm/HmE8Oh6v+IB5oOamvqn3mD7Ae4OKsRYYVFy7M8t7znDhoQdI4mhryB1YQcQn3saGrdbfZwbymp82B57fRhNs0vUJBZBMOGlJvIfgxLDT2xbHbZe5n1kFpyz3+jnOZ8OaOUoVvLjwaod/f+V9HX57hrwbJxtPmFd5jCYj8t4q5j7fFi2pJBWL1bj5H7EpAp1v8+twvjRauSp5FNaxsf9V99+CsLYG0mwr+8iU5uuY8FTFX85SPP9Tl/9iPBuTYLr6v2HfNtbiKqYmZJOfPI+r9aT0RPzL7Yl7zx/4UM1mnEF7Drs2WATAkTJwmZ9a3EewdnqygcLCglWlijU09PeWMiHLak7YKMwZPqW3l9Hn6QzgJ9LRWfkBeHeehL3p1KPMXi7UddBE0bU7l7N43T3v9+MKSOeDABfZ7N19wARtXX3GdRWlFOmo7FrKRF7Bls34FS3S8dTGvxCbUpEzQsfTPcVrHBp+Qr4Lxqr73RY5tyJXoJFhJntc+rbZXCcO5FlahZ3x1uvdabt9AqbvmL/jds8gCj3RGauu5c7FGpICDyBeyzyatE0JLcQ0zcftrl4FZP1R4njNKoEGnX8uQoXVv5wCtlmq9divuFhckexIzTV2L8tu/JR8JGs8tTHQzcIy5c5zurNBsv8jE2U/2QaIO+QrlZW4TJWm4PcElWXbfKwc8APEQTxh/vhfE9n/htQSwECFAAUAAAACACViGg2Q6tDAyAKAABmCgAACAAAAAAAAAAAACAAAAAAAAAAZGVzYy5wbmdQSwECFAAUAAAACADwCBA3ruzaFBMBAAAhAwAACQAAAAAAAAABACAAAABGCgAAc3R5bGUuY3NzUEsBAhQAFAAAAAgAlYhoNi9KvPs7CgAAaQoAAAcAAAAAAAAAAAAgAAAAgAsAAGFzYy5wbmdQSwECFAAUAAAACACViGg2wdhI8yAKAABfCgAABgAAAAAAAAAAACAAAADgFQAAYmcucG5nUEsFBgAAAAAEAAQA1gAAACQgAAAAAA==]]></data>
	</file>
	<file>
	  <filename>/lib/tablesorter.lib/themes/green/style.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[dGFibGUudGFibGVzb3J0ZXIgewoJZm9udC1zaXplOiAxMnB4OwoJYmFja2dyb3VuZC1jb2xvcjogIzRENEQ0RDsKCXdpZHRoOiAxMDI0cHg7Cglib3JkZXI6IDFweCBzb2xpZCAjMDAwOwp9CnRhYmxlLnRhYmxlc29ydGVyIHRoIHsKCXRleHQtYWxpZ246IGxlZnQ7CglwYWRkaW5nOiA1cHg7CgliYWNrZ3JvdW5kLWNvbG9yOiAjNkU2RTZFOwp9CnRhYmxlLnRhYmxlc29ydGVyIHRkIHsKCWNvbG9yOiAjRkZGOwoJcGFkZGluZzogNXB4Owp9CnRhYmxlLnRhYmxlc29ydGVyIC5ldmVuIHsKCWJhY2tncm91bmQtY29sb3I6ICMzRDNEM0Q7Cn0KdGFibGUudGFibGVzb3J0ZXIgLm9kZCB7CgliYWNrZ3JvdW5kLWNvbG9yOiAjNkU2RTZFOwp9CnRhYmxlLnRhYmxlc29ydGVyIC5oZWFkZXIgewoJYmFja2dyb3VuZC1pbWFnZTogdXJsKGJnLnBuZyk7CgliYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OwoJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjRkZGOwoJYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgIzAwMDsKCWJvcmRlci10b3A6IDFweCBzb2xpZCAjRkZGOwoJcGFkZGluZy1sZWZ0OiAzMHB4OwoJcGFkZGluZy10b3A6IDhweDsKCWhlaWdodDogYXV0bzsKfQp0YWJsZS50YWJsZXNvcnRlciAuaGVhZGVyU29ydFVwIHsKCWJhY2tncm91bmQtaW1hZ2U6IHVybChhc2MucG5nKTsKCWJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7Cn0KdGFibGUudGFibGVzb3J0ZXIgLmhlYWRlclNvcnREb3duIHsKCWJhY2tncm91bmQtaW1hZ2U6IHVybChkZXNjLnBuZyk7CgliYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0Owp9]]></data>
	</file>
	<file>
	  <filename>/lib/ui.lib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/ui.lib/images/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/ui.lib/images/animated-overlay.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[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]]></data>
	</file>
	<file>
	  <filename>/lib/ui.lib/images/ui-bg_diagonals-thick_18_b81900_40x40.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAACgAAAAoEAIAAABTDPN5AAAABmJLR0T///////8JWPfcAAAACXBIWXMAAABIAAAASABGyWs+AAAA4ElEQVRo3u3YMQoCMRBG4c02XkCQLcXKwsN5Eq+znScRa8FasLP4q0DGZASLecmr0mSHr9tMuh5Pr91+MnpfnofHfXK2OW9v9jdb+t/cuR+qCaZSC2A2NQP3QFVpXZfFfy0iVc3eC3GpmusAR6fq3ARmUJvAJGoFzKOaYCq1AGZTM3APVJW+v5ZIVOX+8YhL1dwfwRGpOrvBcalucHSqA8ygNoFJ1AqYRzXBVGoBzKZm4B6oauy0uNSx06JTm8AkagXMo5pgKrUAZlMzcA9UNXZaXOrYadGpbnB0qgPMoKoPsn/eaLRwj54AAAAldEVYdGRhdGU6Y3JlYXRlADIwMTUtMDMtMTFUMDg6NDk6MzUtMDc6MDA6ngyxAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTAzLTExVDA4OjQ5OjM1LTA3OjAwS8O0DQAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/lib/ui.lib/images/ui-bg_diagonals-thick_20_666666_40x40.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAACgAAAAoEAAAAAD5BTvyAAAAAmJLR0T//xSrMc0AAAAJcEhZcwAAAEgAAABIAEbJaz4AAAB6SURBVEjH7dXLEYAgDEVRqk0HNmpFMgxi+Lnw3Z0hSzJnmZuO8x6b3vPn530vsVwDKa6CHFdAkssgyy1AjTNLLDeAOteBBOdAhmsgxVWQ4wpIchlkuQ34nXPni+EWoMZNoMoNoM51IMFFU3QumqJz0RSdi6bo3C+bcgHap6IryOSd+AAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxNS0wMy0xMVQwODo0OTozNS0wNzowMDqeDLEAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTUtMDMtMTFUMDg6NDk6MzUtMDc6MDBLw7QNAAAAAElFTkSuQmCC]]></data>
	</file>
	<file>
	  <filename>/lib/ui.lib/images/ui-bg_flat_10_000000_40x100.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAACgAAABkAQAAAADcH0/XAAAAAmJLR0QAAd2KE6QAAAAJcEhZcwAAAEgAAABIAEbJaz4AAAAPSURBVCjPY2AYBaOA+gAAAlgAAXU2hncAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTUtMDMtMTFUMDg6NDk6MzUtMDc6MDA6ngyxAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTAzLTExVDA4OjQ5OjM1LTA3OjAwS8O0DQAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/lib/ui.lib/images/ui-bg_glass_65_ffffff_1x400.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAAEAAAGQAQAAAABHIzd2AAAAAmJLR0QAAd2KE6QAAAAJcEhZcwAAAEgAAABIAEbJaz4AAAARSURBVCjPY2hgGIWjcBTigACVaMgB0zSxaQAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxNS0wMy0xMVQwODo0OTozNC0wNzowMJzpBwUAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTUtMDMtMTFUMDg6NDk6MzQtMDc6MDDttL+5AAAAAElFTkSuQmCC]]></data>
	</file>
	<file>
	  <filename>/lib/ui.lib/images/ui-bg_glass_100_f6f6f6_1x400.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAAEAAAGQEAAAAAAao4lEAAAAAmJLR0T//xSrMc0AAAAJcEhZcwAAAEgAAABIAEbJaz4AAABISURBVDjLY/g1mWEUjSKqo2/fGL5LMXzPYfh+nOGHFsOPBQw/xRh+TmX4JcLwq4vhNwPD71yG3xcZ/igx/Ilk+JM0ikYRMQgA8pJH3iOhTlAAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTUtMDMtMTFUMDg6NDk6MzQtMDc6MDCc6QcFAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTAzLTExVDA4OjQ5OjM0LTA3OjAw7bS/uQAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/lib/ui.lib/images/ui-bg_glass_100_fdf5ce_1x400.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAAEAAAGQEAIAAACwqkHPAAAABmJLR0T///////8JWPfcAAAACXBIWXMAAABIAAAASABGyWs+AAAAmklEQVRIx+3PPwsBARgH4N/7s0gmXZSuKMvNdl/AV2A1X1ltzBaf5UazEp3RpKujFMV0uT/dy6cQwzs98wPdZVk8IwAAhmEYxrdBWSZJGFKq4smGaGDENeFgwgfREp8d6Ph1OEZEWxaVOXSVRieHcGXJALrNnvEQes6nlz20yO9Xl9IUn128e0VwS4k6BvQIoob+X6QNwzB+yAca/jJVRVy4gQAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxNS0wMy0xMVQwODo0OTozNS0wNzowMDqeDLEAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTUtMDMtMTFUMDg6NDk6MzUtMDc6MDBLw7QNAAAAAElFTkSuQmCC]]></data>
	</file>
	<file>
	  <filename>/lib/ui.lib/images/ui-bg_gloss-wave_35_f6a828_500x100.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[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]]></data>
	</file>
	<file>
	  <filename>/lib/ui.lib/images/ui-bg_highlight-soft_75_ffe45c_1x100.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAAEAAABkEAIAAACY3hF0AAAABmJLR0T///////8JWPfcAAAACXBIWXMAAABIAAAASABGyWs+AAAAhklEQVQoz+WQMQrCUBBEH1NaCzaxTc7iHcwhcoiktP6kS8BK8BIWHkYQrM1mLD5Bb6Bg9Xg7syws9mNztADgj3CjFbifk4A+0od1UWDfr2kloJkGgZsYBdRTKfB+qgTOtgzrqHJWCtg9T++9pdnEIHAb22yjwPk6XRQCzvNa4IsP3//ST+MF5uU/iXGyfBoAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTUtMDMtMTFUMDg6NDk6MzUtMDc6MDA6ngyxAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTAzLTExVDA4OjQ5OjM1LTA3OjAwS8O0DQAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/lib/ui.lib/images/ui-bg_highlight-soft_100_eeeeee_1x100.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAAEAAABkEAAAAAAy19n/AAAAAmJLR0T//xSrMc0AAAAJcEhZcwAAAEgAAABIAEbJaz4AAABYSURBVBjTxcK9DUBAAIDRjxk0dBQaE4gR7KFVM4rEDBIjEKVV7s79OZ0teHk8FR/NCAehJ6TcK3eD3/EtbsPV2AVbYmZMgh7RMdfAFaEmVIE8kR0yR4gfv1IulNTJHsTLAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE1LTAzLTExVDA4OjQ5OjM0LTA3OjAwnOkHBQAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNS0wMy0xMVQwODo0OTozNC0wNzowMO20v7kAAAAASUVORK5CYII=]]></data>
	</file>
	<file>
	  <filename>/lib/ui.lib/images/ui-icons_228ef1_256x240.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAQAAAADwCAMAAADYSUr5AAABDlBMVEUijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEzfqCuAAAAWXRSTlMAGRAzBAhQv4KZLyJVcUBmYBoTMswNITwWQkhLIB5aIycxUyyFNIeAw2rIz8Y4RRy8uL58q7WljKqorR+yKf0BnlEk7woGAgOPomKUSqCvbd+cR2M/b3+RaPlAXvEAAAABYktHRACIBR1IAAAACXBIWXMAAABIAAAASABGyWs+AAAPZElEQVR42u1dC2PbthEGyUiq6ZiSXblLE6ex1mTO5iXZq+u6ro3abG26pOkSd13v//+RAXzhcIeHWMoUbeOTLesIEMB9PIB3ACgLERERMQIkkOy6CTvWH0bOQO/mJeDXP8EMqMzDEkIsEBRMAmh7jHSVmuAjAKwC8FRAzi8/DmoS1AI5AQltj5FOryAjgJ7OK2CZkwEZYO23q+BJ5wwKkttfui1z4s20VTAL5k2kF5hbiPcKcwvwNGB4C7CTwproI4CdDcxEPKUTExx+DNiAj0u9C9AuNPxdYOe46Y5QRERERERExIhx6Z7gjv2ghEVrQJ33hJ5BsxsBfsIq8M0HsAkhWfqglFgawAhgGWh2M1xMWAWUAE90qUofMhhi7be32JNsmVFJPKeLwBQglAQMNh3ALVjYbNaI1jaYD0jM0nw9atcWYEXiaXH/+QDeQ3Y6BoRx3e8CERERERERERG7Qz/HP+iaBsvvHXj0LAD4cip0yN27fXw7AGtQoDTwH+HqkWTgWczTwZVmr8DbAEuqv35bCT6CWDorjGnAqwOSCI7EhlFWHjkBXIkb1M/DZQgRwCeAwK9B+HRPFlPBOjeZ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]]></data>
	</file>
	<file>
	  <filename>/lib/ui.lib/images/ui-icons_222222_256x240.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[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]]></data>
	</file>
	<file>
	  <filename>/lib/ui.lib/images/ui-icons_ef8c08_256x240.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[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]]></data>
	</file>
	<file>
	  <filename>/lib/ui.lib/images/ui-icons_ffd27a_256x240.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[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]]></data>
	</file>
	<file>
	  <filename>/lib/ui.lib/images/ui-icons_ffffff_256x240.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAQAAAADwCAQAAABFnnJAAAAAAmJLR0QA/4ePzL8AAAAJcEhZcwAAAEgAAABIAEbJaz4AABe4SURBVHja7V1diCXHdf56vbZmVl6nxwKFO2yyq1mM4qAwM7oDsR6C7iYIKesH3V1QHgyBu5YYJwHjrB9NQCuByIthHbAga6TZxeBgHMJKISZ+SDIb1oQgRtoVgtjGyD8PmSGQMIpfJmCLk4f+q6o+daq6+965P1VfM3Pv7VN16ud8Vd1dp6o6IUSEjBPTzkDEdBEJEDgiAXT0QOhNOxPHiUgAFT3sA9gPiQLjJsD0208Pbe9rM/OvwkaBQvP0yzhG6ASQO0AqDwmu9mOPT3nqPWsYV9qFEduVIDP/QU4BSfMC9REqAcbRAa520FDELdphc3SJCyRIcADgAAkSQXOXMs4ckrIxFEUs2oENBNSqR0WmJ2kVv2hltvRdaVPHvPtqdpVxjlD1AHIH6AupDbovH1nqkgllLd3apnQJUjV362dmDEnjOya5FUltsEqqbdtxa5Dbppx3uQ+sNLv6mblCcwLIoKlXTQ/7rQkmX4IKzdMv4xgxbgLMO3rYXyTzuhEJEDjiSGDgiAQIHJEAgSMSIHBEAgSOSIDAEQkQOOJ8ADPutPN/zGgyH8BvRoDLGdMT5wPIKbjN02U+gNsdnuV9oUjSbD6AnwdMrkK7gVYt3311u8zv0r5vfNq1L8xsgPp8gAz20fAilORvs8tdsX3mA0i5k1N3x5dBue7icyGgzwfgvus48OoF+DDu9ukzH0Bqf355s9OHnLMNmqQ0F2jjDJIcrrM+H0Ail6v/KUoe3cECpl85XecDTDv/x4zoDg4ccSAocEQCBI5IgMARCRA4IgECRyRA4IgECBwnp52BmQNNcZS/+1hp4/yf7BZ9IpUwzRyQMwftXUHumFMouX4JIED09fvsD0AtJE3RNg1X/jPTJ6IWNznaxvYrgU+oBnFPaAFcxU88CmCPn3hUkE8RSHD2+OQvEWT6Z7M0Com7BuQSygQiR2zA1Yi1/KuXAN/i22bruCspGUMHT6In0nUV7ZIDKmMnrFRNnUulaF72PJAgl3VXpZObgZrLBGh6E0gerccVyoed7dq4n3ETD+2SgXz0tq0BqQn66HbXQU3e5DGw6uJ8QvEyuQt0M1jW4epi/bpoVwtype5zE9kWboq75VoOTHdw6E8B851+i8fIOB8gcMSRwMARCRA4IgECRyRA4IgECByRAIEjEiBw6ItDi81Spwf3fuCThE8N+HhE28VzrY32TaURKgIUC6N8tntvVwHjQztdrpz71YC01Wzljes1jp35KYvDXoZe6xogI5cA+MWh8hJOH492jzk3PgrYdPltDWHPv18N2NLoGctre41iVyVw9UDdlqbXFujqQ8E+26m7lmDbFoj6zaRx58Cmx72FuzvnfhvS8z63umkTQ+5aWF4Zh1ufSJpm2WFsc1gn9TBNCeBfAUmDuH45kKvQJ3332n57+q7YLgK460A2oJsAMoEsBGj2FFBVQBuPVaLo4LWT9iml3wZVvtveQ0ipr+bS4grO7yAgpV/E5O8BXJqrvRuk9c1mLhvOB5AqQL+BkYovZ04qoqRDLZp72hdnAjcBpRIcGBtIHDTW4AfJvAfla2/8commlwA/XzU5t4iQr4JdYvtVL18Ov2tw9yltkp72L7Vx3wOwiPMBVPScb0xaOEQCBI44FBw4IgECRyRA4IgECByRAIEjEmDcmLPHKnM+gAuSv8qn6L2O/u5Jo3vuEsdg94yVvT4fQILkMfcZJSw8dqseC0zt6Lq4Sl4enjiXv7oNbIsvaZ8SqoEgNVvu3X7rg43q0sh2b//2HWgGJI+dK3ZiDaeetXk7pcWj5CX1L+mxgL8HsE06kP1V1aWhzaSFrOW4p03Z9zAg+Pr6kgZnuXS59N0rm2cS5vsCqips+gZu8xKSNIhbSP2WQLsXb7ffQkIyo6uH8Ncs7RFwzKh6ANVR2CZrrjcJuJ2tXa+OidKD8D2E/smFGE8r5lLQe48ZMb9+CTgoM8V14FkHn0334nEgzgfw8fa7t4eQUc0F4KdUyFVfXYTsu4sUIZOGUjVE2wk1EwHvDSRrB+7jLLXdBI7D2eo3a7HtjabPTSQAB0Fnxrg+iO5gHTPTNR8XIgECRxwKDhyRAIEjEiBwRAIEjkiAwDF7BEhny1u26DAJ4OfLllw25CW1hUhxeCxP4tPeB2Fm0Gy7eJ/tpBOsdMjPIQqSpGK4tlvWV1igN4B3gU4AeZRaHu0uWnWKQ5YCVA6U8mv3sq5/pQxxaIlffGu3qbra+/i9an7BURFA3+69jsofbtsyPUGSm/8DNi25a8+6/g+wIqydLVLn09dnFJha/LaPCA7FULDf6nYJxVwbm/nNuThmL+L6LZ2tS8xw5vYR0lvOg4I6JSxB3Uwm7FMZ/CZE2CeVmQSyTcngc+jaPkEn+IK9Ar4LqhdGqFVm32DE/dYL39dK2OQZBah2H1E4gvld+fX8+Lw2IgIAtz+A38r1ul/evUONJM1uHuUQurbE61wB9w5CgcL/hRH6rNjq+7hhv4voBv/tI4LCrM0HmJT5IyyYNQJEHDNmzxcQcayIBAgckQCBIxIgcCwSAfqlJ6A/Ef0nsZQfzd63OtPICDDMK24Xw9aaXnZ4+l0g3NBmCzQ1Yh975fc9Nna/Ez1O4ld4FEc4wqP4FUuBvjP3a7l0zZKGXe6KCTxnHHIKxtwOoqs0oAENSUUVtjo/JFgOKj+3tbhqCF57doyor8lHmrRPJvqN5HoOudytGfHXDPkSrRPREi0R0TotCTXAp1GHVEP+EjXEtncZyxAFk+8BAO5YJnPcxpdxD0CK2+W5O7hgZeMXLCOKy+W3o5rsJr4htL89ZBtLZNgHYU9LYQ9bSg8AbBlyN95Xcpfl0Ix/H8t4EEAf942wej6BLUbim5suL5+XsYb3y++lpoIA9/NPdRqGmuV7AH6EI3G2z1L+ecMa4qNC7Ct4D9uC/JLmSr6kUDHD2woFtvC2ISWoizP5FYYfxS/K759g8/AgPoEEp4RcXhRkpkeSl/MvoE4YLc0IXpj/D/DP6unqWnboUPAjHNXC6FnICLAiaLO1G8DVAwBvlRQgXMJbTIiCAnXzZ0iNz3rufl3M6Qb+G38I4B+xwcZ/GygpxOdgK++p9N7qOFCY/4+wrFPA936WM3+9AgG5o8razk9ZmasHKCgAi/mRpw7rTd5549PEEn6efzvLSB/Eu9jAfQAbeBcP4f8MuTkLqe0yU3dH7wrxOfxN7Vxm/i/gQQD/AADFBdz/MbBufrOAp3AKp7CMU9ZO8gE8gAcAcC3spsP8QA9v4RIu4S3LdM4+DjDEEAct7/OX8Vv5sVzLXw9nQPgFNrCBEyCcEaeUblmMf075s2EJLrhCfIs5l5H+Bj6G7wAALuBOJmj/RFsv4rIzzg+FkK4eoIcDIG/7B0z19zU5R4HfMD7NKspayQayOyK9n3gY9wH8pPx9HxvCjKIuHfxRxxD8hNmf5OXL7s9K86N8DEwdj1HuR5iXNfnL1scV+2PMjQk+BhYPSdWnLRd95hGQe4hzPeg1fQwGjayl9wmhlpDXXzwEDtSzs+MO7gP4HeX3e5YbqcmCAJxXWvr4tWeYztSUNbyvtX7E+QDBY5F8AREtEAkQOCIBAkckQOCIBFgsvIJXmkXQCZCC4FqYbQeVjoyujxZ9cB71LeXxte5vGxqPvUNDvm3IuUEn1Vu+NgE5APylo34GGLSut9P4Cr6C045QI4wwKn8pdZISUZ/6RJTWBhF2aSkfRrhG6zRkh0Fu5AMR23TDkMuebPPos+G3FE82EdEWOxBSHPX47oGcLMw6rdP6hORFmGxQx5QMqBiQS83hmtw6RNuEvHQpo/suERHdFWu3GEwa0TkCQU+gn4+h1dUT9RqNg3FyENGf5X9XrRXUp2wCSt+iH5YUXAYmAv07ge4R6N+InzJBtJ5L1gU5RPlpWqLTFnlR/SMaNa7BAtusfLsWe5tNf0hEI0qrkUTVHVw4Kfew1WqjFnWuAO85fAL7+DF+gJ/jPYtPsI89XMIbVpduF/wTfhffwwa+hyfwL9ZQ2Vj6hijXxyx1/LLmJ6wwwk0AyP/X6+9Q+8WDn21x1uMMAHwJwEp+eUzxAcoe4IYxmt6nG417ALWDs/UAV4noL4joFbaF9InY1j+uHuBvCfRdAn2Llpj0H3X0AIUcotzeA4y03JmXgIGS6wyDRuX7qib7KlOD5+hcPXUziX5OhHr1j4MAn6HfpM/R+fyvifn1WXE2AqRElFKaXy9N+XeI6Nv539/V5EX5bNfwSv64Q87Hr6692XG+IQFMd10q1JDsatLOmwrUT122RENCyaEBE0ImQN1f18T8ZvFkAvDys/Rdeph26WH6e/q0IV+t5W5trPLK/LAeuolTUW6T3s1vBE35iIpr/25bAsBxUJ6N1DM8b+C+Vb5lVDD3FJCWRecJYidghsccuesih8P8Pi73ggIpI3uKPsxv/LbpQ3qKIcBVGtXj+ibvNqh+H8rfg0qTlmXzmxTYqkld07plORFRz2GcLvKR0/yux8CKAqkl9nPl9+dqsa09kK87eB3v+gWM6IgBoHvsx4QRAOCWeTrOBwgc0RcQOCIBAkckQOCIBAgc4REgcxsPGMmgfDZ61EOPbTfFOburVgmwXlbAemt9NLUqSEHYyb/vwDar4Vq+qHS3RoHfxy4u4zI+hU/hh/h0LWZWO1fzX9mepeq+55v4LAhP4AkQPovNWnx5+4ph7cF+6JC7QgxraRgjQObZdSLapSEN6ZAqpwc34CENZpAzRPtjlOdrnR1UybBDoB1rLorhkHPsUNep8vgYOxa6Q8M8B5meAZO+fRyv8FKklmEw+UwVO7XoycYa+7k3B0z51BjrxXc1QDZKvENEh1YjTpMAxVgWn0Zh9uqzruGaONZ5gj5CCSX0ETrBGmRIIKJB6dPncicTQPWHmCuXMm9Iv6zjOgGgzaKoEyDTul2OyXIEOEOr+cEQYJhX4w4748dFAHJWgdu4cvx1Rcb1UDuKnDN/KuonSspjjUn9eh5rlx9SpWz3kOLgCWBPn8oZV7wGKn2cQwKdYwkAhQB8n7JOm7RZ+isZAuzkVcdP+XIxXA7RTMoTyOVTk1p/NeMpw8CQf5uI1vKD6DqjYVC6bLn0iU53IsBD+dmHyv9m7KL/GhLROUsPYK+/PhGdoTO0Smdok4iuZefV9wV8gBQ38fn8FknecR9OubSbuFvKpbBe7mOSrdE38U38cfn9+/g9TZYqM56AK/UxcazjS8qvl/EzIfWslszyrwD4EADwS2aDGcKKNs/KfMHFI9p5ws8MuT5f6Ca+bMzayrbwzybL7jHb+RMeB/BfAID/VGpX62APaUhD2qXZvAksWh+fxjfL1p/hrhG3n7f71Kp/s2w759jUd+gqUd4Odxh59vmQ5UbPnGhjtt/H6DHjv9x/NL8HGFKfNmmTNolos34JUK+xNvPP/lPAXSrmxnLVM3CksEPbtM1Op0IeO6MQRwESfpln12ohhrUOfGjEPFc7mt0DEA3Lw0IA31Y4LQLIR6q0+rtkes2z1uFTOlv+s57lkFIqbieTWtzP02eoJ9QSEZT7DF22lD8FZP/NbejqBDEpMhSlaum0MkZ3sIqH8BKAF/E/rHSEFdzM32aQ4n/xa9qbDVz3SIC+meUk5j23QCRA4AjPFxChIRIgcEQCBA6TAEPrfuEXcau8obwlbokaMU/QHhRuExHRbeYB5ou1h5AvTuVhLx5jPtQfz5TGfcYIdlF7eixwkVG4R0R71uR+6jkgA48Qx3/sKfTfm3puJkCA21T4nMw+4DWWAK8xCuWBoNowhNX8HEncy6tcIVxyor1yuGiPlfvlf46O6uszmoH1PsCGpgQAgV24WTd/vZ9Q19byBnSFGBHR07RET1s1+JVuQQmQXf8Lr7PeB+gFl6phm2zLwlTz7zKSQfnJXyZcxkFu+DQnAid/Ov/2tKBhT0hjgQkwIBOqAfwJwHfeuqZ7jEeuiGczvy8BUrL3MVSOsNf99RXsBOgT0R7t0R75+BXm5DArwPzelACuozBS3fyZ2W3mn4UeYIFvAqv2nyp+58oMX2cJ8HVGoasHsB1qD8THn/49gJuCc3hwRasX8ilW+hSj0FU5dqnU+nUDj1qH6PoUkIWZutHGT4A91sBqFTxfkz5vNeNASFCiR9ve43iPBSOAvzv4SQzx5/n3r+EN/Ou0xzCnhLbvAppRxPkAgSN6AwNHJEDgiAQIHJEAgSMSIHBEApgYgFpL5xAqAYjZNkEHYVyvhJgWbgjvNgeAAXZbS+cTxigd0a4wGqd6A0xJES+1ahjQbu4IGtCuoAGEfHmTLt/WNLVx1w4cg80Dj9hFDdi1zNXBV5/NhBIB1Hj1ah6UcQb5CntZg50Atvg+BJCksqOnLl2QIWFbIflpHS4CZCasfutSEErjuTTYCGCP7yZAUxPbpfwGDHN58DeBd3AB32hxPbmDC7iAbJ3cBWXMPFHOXhB3wi002OCKfzxYJG9AjeWLfA/gOgK8B1CdQYQ7eElsX5Szv/icL6hPLrbcZ/f57aRziegNNDHArmBiWTqHiAQIHHEkMHBEAgSOSIDAEQkQOCIBAodJAFJeLB4RACoCpPlWqWdx1rLXfjZ0dM0ijZhLFARIcVhuDvMIDlkjb+ACvoYXcejxQglzeGHbGIHcPmZ5hA15je0Q0V8RiOhFyvbFtY0ep+JewtWovOt3/1jl8bAchVGJ7hEI9CINCHSPbG+n3qFzlDllU6tSfqfapXw79dP5n7nT7WmSNlwv5CTKl8q/pdYOocCOkwCA8wDeBAC8BAB4Exs4X9vKdAObuIkreASXcIgruN6oq/mk0ukkqI9Afzz/S8Avvzqd/30S/ObyHwewkstXFmu8fpLIfAEpDnFfedHRPWxgRdsJt0CKQ9zBBezgClvJlO9UX9+t/re13/9h7JU7aXmEDXlXsEvVoukR8Zu4ZL7w7H0VtpfK2ObL6O8Wr883mrQ8Hpaj8AZm78O4jzfxLDbAv5Gjmg1wAWDcomrrX7A1tIuLyh28jmv5g+AbuBZfFh8K4nyAwBF9AYEjEiBwRAIEjkiAwFERwPU+gK7yJ3G9lF/Hk8cun3T5pi1vi1yn630AXeWubeYmLZ90+aYtb31kHxeJQ/U+gK5y10aTk5ZPunzTlnc4skvA5bJDSJQRvMvMNxWm/IU8boIXDPmzin4wZ5/l1FvkSYv4l9n4XPlc5Vfz3zz+20iUELb4klzNBW+VhsgGgqrRoKT2S5dzGSnkCYDnAbyunRmffp/4bv1qiKbxE/ALzKjBb1K01OV/AgD4a2v9FWc38Q7GskhNJYD+Lup6Blxy4AW8DuB5vCZWsK2C3PoTVpuvAdz6ZQJ0r5+kPN9O/jjeUcw/FgKc7K5CwYfK/+YgZ48gQ12O3kZDony2iU8ecV1usj8VZI/jnmb+sWDcl4ARgFtofwno3sXb81fX0K4Ll/T79SCuHsqW/uO4p5l/DD1AdhP4Kit7lfkmyZ8HcBM382+q/HUlFjFnX1ekLjlEOVi5nn+qnX1Vk7jkbeunKB+1lr+jmZ9PtSmCeAyb9mPopOWdxwEWfyBm2gNRk5Z3JgDoSbpeKr9OT9aCdpVfpFul/BYziDFp+aTLN215yyNOCAkc0RsYOCIBAkckQOCIBAgckQCBIxIgcKjOoLrTUcesyyNaQPcGLpffjtjQXeURM4f6JaCb6Y6cGrq13KSzhggNJgFcBjzCkShfxpHSD9ThMqA6JYoDtfT1R1hgEmAZEA24jGVRfoRlkSAEecJE7qGwIq47HjPql4DlFlr02LKGbu3XRaCIhtDfF6BJamFnXR7RAtEbGDjiQFDgiAQIHJEAgSMSIHBEAgSOSIDAMb8E6MUBoXFAJ0D3cTZCH4T+xPPdwz5WJ55KANAJsJr/TRuu1p2Z/2Da2VwE6ATYz/+mC1frjuYfI3x7AEKv9tcMzKokFpl57TQszB/vAcYCfUbQPhLss26WhPlrhi2vUIX5V0X5QbwHGBd0Akg9wGppmuKvWSe8VztTJ1FP0c9RTDd/vAiMAbPUA0TzTwG+PUB3uN/f0cz8PUu4iEbw7QGOA1Lvwpk/3gOMAfqEkB4O0JvJzpXyTt/8jOiIOCMocMyvLyBiLPh/gj9Qphd3t8gAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTUtMDMtMTFUMDg6NDc6MTEtMDc6MDCSPR9sAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTAzLTExVDA3OjU5OjM1LTA3OjAwrT2++AAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAAASUVORK5CYII=]]></data>
	</file>
	<file>
	  <filename>/lib/ui.lib/info.dat</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGluZm9bJ2NzcyddID0gJ2pxdWVyeS11aS5taW4uY3NzJzsKJGluZm9bJ2pzJ10gPSAnanF1ZXJ5LXVpLm1pbi5qcyc7CiRpbmZvWydkZXBlbmRzJ10gPSAnanF1ZXJ5JzsKJGluZm9bJ2Nzc19ub21pbmlmeSddID0gMTsKJGluZm9bJ2pzX25vbWluaWZ5J10gPSAxOwo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lib/ui.lib/jquery-ui.min.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohIGpRdWVyeSBVSSAtIHYxLjExLjQgLSAyMDE1LTAzLTExCiogaHR0cDovL2pxdWVyeXVpLmNvbQoqIEluY2x1ZGVzOiBjb3JlLmNzcywgYWNjb3JkaW9uLmNzcywgYXV0b2NvbXBsZXRlLmNzcywgYnV0dG9uLmNzcywgZGF0ZXBpY2tlci5jc3MsIGRpYWxvZy5jc3MsIGRyYWdnYWJsZS5jc3MsIG1lbnUuY3NzLCBwcm9ncmVzc2Jhci5jc3MsIHJlc2l6YWJsZS5jc3MsIHNlbGVjdGFibGUuY3NzLCBzZWxlY3RtZW51LmNzcywgc2xpZGVyLmNzcywgc29ydGFibGUuY3NzLCBzcGlubmVyLmNzcywgdGFicy5jc3MsIHRvb2x0aXAuY3NzLCB0aGVtZS5jc3MKKiBUbyB2aWV3IGFuZCBtb2RpZnkgdGhpcyB0aGVtZSwgdmlzaXQgaHR0cDovL2pxdWVyeXVpLmNvbS90aGVtZXJvbGxlci8/ZmZEZWZhdWx0PVRyZWJ1Y2hldCUyME1TJTJDVGFob21hJTJDVmVyZGFuYSUyQ0FyaWFsJTJDc2Fucy1zZXJpZiZmd0RlZmF1bHQ9Ym9sZCZmc0RlZmF1bHQ9MS4xZW0mY29ybmVyUmFkaXVzPTRweCZiZ0NvbG9ySGVhZGVyPWY2YTgyOCZiZ1RleHR1cmVIZWFkZXI9Z2xvc3Nfd2F2ZSZiZ0ltZ09wYWNpdHlIZWFkZXI9MzUmYm9yZGVyQ29sb3JIZWFkZXI9ZTc4ZjA4JmZjSGVhZGVyPWZmZmZmZiZpY29uQ29sb3JIZWFkZXI9ZmZmZmZmJmJnQ29sb3JDb250ZW50PWVlZWVlZSZiZ1RleHR1cmVDb250ZW50PWhpZ2hsaWdodF9zb2Z0JmJnSW1nT3BhY2l0eUNvbnRlbnQ9MTAwJmJvcmRlckNvbG9yQ29udGVudD1kZGRkZGQmZmNDb250ZW50PTMzMzMzMyZpY29uQ29sb3JDb250ZW50PTIyMjIyMiZiZ0NvbG9yRGVmYXVsdD1mNmY2ZjYmYmdUZXh0dXJlRGVmYXVsdD1nbGFzcyZiZ0ltZ09wYWNpdHlEZWZhdWx0PTEwMCZib3JkZXJDb2xvckRlZmF1bHQ9Y2NjY2NjJmZjRGVmYXVsdD0xYzk0YzQmaWNvbkNvbG9yRGVmYXVsdD1lZjhjMDgmYmdDb2xvckhvdmVyPWZkZjVjZSZiZ1RleHR1cmVIb3Zlcj1nbGFzcyZiZ0ltZ09wYWNpdHlIb3Zlcj0xMDAmYm9yZGVyQ29sb3JIb3Zlcj1mYmNiMDkmZmNIb3Zlcj1jNzc0MDUmaWNvbkNvbG9ySG92ZXI9ZWY4YzA4JmJnQ29sb3JBY3RpdmU9ZmZmZmZmJmJnVGV4dHVyZUFjdGl2ZT1nbGFzcyZiZ0ltZ09wYWNpdHlBY3RpdmU9NjUmYm9yZGVyQ29sb3JBY3RpdmU9ZmJkODUwJmZjQWN0aXZlPWViOGYwMCZpY29uQ29sb3JBY3RpdmU9ZWY4YzA4JmJnQ29sb3JIaWdobGlnaHQ9ZmZlNDVjJmJnVGV4dHVyZUhpZ2hsaWdodD1oaWdobGlnaHRfc29mdCZiZ0ltZ09wYWNpdHlIaWdobGlnaHQ9NzUmYm9yZGVyQ29sb3JIaWdobGlnaHQ9ZmVkMjJmJmZjSGlnaGxpZ2h0PTM2MzYzNiZpY29uQ29sb3JIaWdobGlnaHQ9MjI4ZWYxJmJnQ29sb3JFcnJvcj1iODE5MDAmYmdUZXh0dXJlRXJyb3I9ZGlhZ29uYWxzX3RoaWNrJmJnSW1nT3BhY2l0eUVycm9yPTE4JmJvcmRlckNvbG9yRXJyb3I9Y2QwYTBhJmZjRXJyb3I9ZmZmZmZmJmljb25Db2xvckVycm9yPWZmZDI3YSZiZ0NvbG9yT3ZlcmxheT02NjY2NjYmYmdUZXh0dXJlT3ZlcmxheT1kaWFnb25hbHNfdGhpY2smYmdJbWdPcGFjaXR5T3ZlcmxheT0yMCZvcGFjaXR5T3ZlcmxheT01MCZiZ0NvbG9yU2hhZG93PTAwMDAwMCZiZ1RleHR1cmVTaGFkb3c9ZmxhdCZiZ0ltZ09wYWNpdHlTaGFkb3c9MTAmb3BhY2l0eVNoYWRvdz0yMCZ0aGlja25lc3NTaGFkb3c9NXB4Jm9mZnNldFRvcFNoYWRvdz0tNXB4Jm9mZnNldExlZnRTaGFkb3c9LTVweCZjb3JuZXJSYWRpdXNTaGFkb3c9NXB4CiogQ29weXJpZ2h0IDIwMTUgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9yczsgTGljZW5zZWQgTUlUICovCgoudWktaGVscGVyLWhpZGRlbntkaXNwbGF5Om5vbmV9LnVpLWhlbHBlci1oaWRkZW4tYWNjZXNzaWJsZXtib3JkZXI6MDtjbGlwOnJlY3QoMCAwIDAgMCk7aGVpZ2h0OjFweDttYXJnaW46LTFweDtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzowO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjFweH0udWktaGVscGVyLXJlc2V0e21hcmdpbjowO3BhZGRpbmc6MDtib3JkZXI6MDtvdXRsaW5lOjA7bGluZS1oZWlnaHQ6MS4zO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtc2l6ZToxMDAlO2xpc3Qtc3R5bGU6bm9uZX0udWktaGVscGVyLWNsZWFyZml4OmJlZm9yZSwudWktaGVscGVyLWNsZWFyZml4OmFmdGVye2NvbnRlbnQ6IiI7ZGlzcGxheTp0YWJsZTtib3JkZXItY29sbGFwc2U6Y29sbGFwc2V9LnVpLWhlbHBlci1jbGVhcmZpeDphZnRlcntjbGVhcjpib3RofS51aS1oZWxwZXItY2xlYXJmaXh7bWluLWhlaWdodDowfS51aS1oZWxwZXItemZpeHt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO3RvcDowO2xlZnQ6MDtwb3NpdGlvbjphYnNvbHV0ZTtvcGFjaXR5OjA7ZmlsdGVyOkFscGhhKE9wYWNpdHk9MCl9LnVpLWZyb250e3otaW5kZXg6MTAwfS51aS1zdGF0ZS1kaXNhYmxlZHtjdXJzb3I6ZGVmYXVsdCFpbXBvcnRhbnR9LnVpLWljb257ZGlzcGxheTpibG9jazt0ZXh0LWluZGVudDotOTk5OTlweDtvdmVyZmxvdzpoaWRkZW47YmFja2dyb3VuZC1yZXBlYXQ6bm8tcmVwZWF0fS51aS13aWRnZXQtb3ZlcmxheXtwb3NpdGlvbjpmaXhlZDt0b3A6MDtsZWZ0OjA7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJX0udWktYWNjb3JkaW9uIC51aS1hY2NvcmRpb24taGVhZGVye2Rpc3BsYXk6YmxvY2s7Y3Vyc29yOnBvaW50ZXI7cG9zaXRpb246cmVsYXRpdmU7bWFyZ2luOjJweCAwIDAgMDtwYWRkaW5nOi41ZW0gLjVlbSAuNWVtIC43ZW07bWluLWhlaWdodDowO2ZvbnQtc2l6ZToxMDAlfS51aS1hY2NvcmRpb24gLnVpLWFjY29yZGlvbi1pY29uc3twYWRkaW5nLWxlZnQ6Mi4yZW19LnVpLWFjY29yZGlvbiAudWktYWNjb3JkaW9uLWljb25zIC51aS1hY2NvcmRpb24taWNvbnN7cGFkZGluZy1sZWZ0OjIuMmVtfS51aS1hY2NvcmRpb24gLnVpLWFjY29yZGlvbi1oZWFkZXIgLnVpLWFjY29yZGlvbi1oZWFkZXItaWNvbntwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0Oi41ZW07dG9wOjUwJTttYXJnaW4tdG9wOi04cHh9LnVpLWFjY29yZGlvbiAudWktYWNjb3JkaW9uLWNvbnRlbnR7cGFkZGluZzoxZW0gMi4yZW07Ym9yZGVyLXRvcDowO292ZXJmbG93OmF1dG99LnVpLWF1dG9jb21wbGV0ZXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjA7Y3Vyc29yOmRlZmF1bHR9LnVpLWJ1dHRvbntkaXNwbGF5OmlubGluZS1ibG9jaztwb3NpdGlvbjpyZWxhdGl2ZTtwYWRkaW5nOjA7bGluZS1oZWlnaHQ6bm9ybWFsO21hcmdpbi1yaWdodDouMWVtO2N1cnNvcjpwb2ludGVyO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTt0ZXh0LWFsaWduOmNlbnRlcjtvdmVyZmxvdzp2aXNpYmxlfS51aS1idXR0b24sLnVpLWJ1dHRvbjpsaW5rLC51aS1idXR0b246dmlzaXRlZCwudWktYnV0dG9uOmhvdmVyLC51aS1idXR0b246YWN0aXZle3RleHQtZGVjb3JhdGlvbjpub25lfS51aS1idXR0b24taWNvbi1vbmx5e3dpZHRoOjIuMmVtfWJ1dHRvbi51aS1idXR0b24taWNvbi1vbmx5e3dpZHRoOjIuNGVtfS51aS1idXR0b24taWNvbnMtb25seXt3aWR0aDozLjRlbX1idXR0b24udWktYnV0dG9uLWljb25zLW9ubHl7d2lkdGg6My43ZW19LnVpLWJ1dHRvbiAudWktYnV0dG9uLXRleHR7ZGlzcGxheTpibG9jaztsaW5lLWhlaWdodDpub3JtYWx9LnVpLWJ1dHRvbi10ZXh0LW9ubHkgLnVpLWJ1dHRvbi10ZXh0e3BhZGRpbmc6LjRlbSAxZW19LnVpLWJ1dHRvbi1pY29uLW9ubHkgLnVpLWJ1dHRvbi10ZXh0LC51aS1idXR0b24taWNvbnMtb25seSAudWktYnV0dG9uLXRleHR7cGFkZGluZzouNGVtO3RleHQtaW5kZW50Oi05OTk5OTk5cHh9LnVpLWJ1dHRvbi10ZXh0LWljb24tcHJpbWFyeSAudWktYnV0dG9uLXRleHQsLnVpLWJ1dHRvbi10ZXh0LWljb25zIC51aS1idXR0b24tdGV4dHtwYWRkaW5nOi40ZW0gMWVtIC40ZW0gMi4xZW19LnVpLWJ1dHRvbi10ZXh0LWljb24tc2Vjb25kYXJ5IC51aS1idXR0b24tdGV4dCwudWktYnV0dG9uLXRleHQtaWNvbnMgLnVpLWJ1dHRvbi10ZXh0e3BhZGRpbmc6LjRlbSAyLjFlbSAuNGVtIDFlbX0udWktYnV0dG9uLXRleHQtaWNvbnMgLnVpLWJ1dHRvbi10ZXh0e3BhZGRpbmctbGVmdDoyLjFlbTtwYWRkaW5nLXJpZ2h0OjIuMWVtfWlucHV0LnVpLWJ1dHRvbntwYWRkaW5nOi40ZW0gMWVtfS51aS1idXR0b24taWNvbi1vbmx5IC51aS1pY29uLC51aS1idXR0b24tdGV4dC1pY29uLXByaW1hcnkgLnVpLWljb24sLnVpLWJ1dHRvbi10ZXh0LWljb24tc2Vjb25kYXJ5IC51aS1pY29uLC51aS1idXR0b24tdGV4dC1pY29ucyAudWktaWNvbiwudWktYnV0dG9uLWljb25zLW9ubHkgLnVpLWljb257cG9zaXRpb246YWJzb2x1dGU7dG9wOjUwJTttYXJnaW4tdG9wOi04cHh9LnVpLWJ1dHRvbi1pY29uLW9ubHkgLnVpLWljb257bGVmdDo1MCU7bWFyZ2luLWxlZnQ6LThweH0udWktYnV0dG9uLXRleHQtaWNvbi1wcmltYXJ5IC51aS1idXR0b24taWNvbi1wcmltYXJ5LC51aS1idXR0b24tdGV4dC1pY29ucyAudWktYnV0dG9uLWljb24tcHJpbWFyeSwudWktYnV0dG9uLWljb25zLW9ubHkgLnVpLWJ1dHRvbi1pY29uLXByaW1hcnl7bGVmdDouNWVtfS51aS1idXR0b24tdGV4dC1pY29uLXNlY29uZGFyeSAudWktYnV0dG9uLWljb24tc2Vjb25kYXJ5LC51aS1idXR0b24tdGV4dC1pY29ucyAudWktYnV0dG9uLWljb24tc2Vjb25kYXJ5LC51aS1idXR0b24taWNvbnMtb25seSAudWktYnV0dG9uLWljb24tc2Vjb25kYXJ5e3JpZ2h0Oi41ZW19LnVpLWJ1dHRvbnNldHttYXJnaW4tcmlnaHQ6N3B4fS51aS1idXR0b25zZXQgLnVpLWJ1dHRvbnttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDotLjNlbX1pbnB1dC51aS1idXR0b246Oi1tb3otZm9jdXMtaW5uZXIsYnV0dG9uLnVpLWJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lcntib3JkZXI6MDtwYWRkaW5nOjB9LnVpLWRhdGVwaWNrZXJ7d2lkdGg6MTdlbTtwYWRkaW5nOi4yZW0gLjJlbSAwO2Rpc3BsYXk6bm9uZX0udWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci1oZWFkZXJ7cG9zaXRpb246cmVsYXRpdmU7cGFkZGluZzouMmVtIDB9LnVpLWRhdGVwaWNrZXIgLnVpLWRhdGVwaWNrZXItcHJldiwudWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci1uZXh0e3Bvc2l0aW9uOmFic29sdXRlO3RvcDoycHg7d2lkdGg6MS44ZW07aGVpZ2h0OjEuOGVtfS51aS1kYXRlcGlja2VyIC51aS1kYXRlcGlja2VyLXByZXYtaG92ZXIsLnVpLWRhdGVwaWNrZXIgLnVpLWRhdGVwaWNrZXItbmV4dC1ob3Zlcnt0b3A6MXB4fS51aS1kYXRlcGlja2VyIC51aS1kYXRlcGlja2VyLXByZXZ7bGVmdDoycHh9LnVpLWRhdGVwaWNrZXIgLnVpLWRhdGVwaWNrZXItbmV4dHtyaWdodDoycHh9LnVpLWRhdGVwaWNrZXIgLnVpLWRhdGVwaWNrZXItcHJldi1ob3ZlcntsZWZ0OjFweH0udWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci1uZXh0LWhvdmVye3JpZ2h0OjFweH0udWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci1wcmV2IHNwYW4sLnVpLWRhdGVwaWNrZXIgLnVpLWRhdGVwaWNrZXItbmV4dCBzcGFue2Rpc3BsYXk6YmxvY2s7cG9zaXRpb246YWJzb2x1dGU7bGVmdDo1MCU7bWFyZ2luLWxlZnQ6LThweDt0b3A6NTAlO21hcmdpbi10b3A6LThweH0udWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci10aXRsZXttYXJnaW46MCAyLjNlbTtsaW5lLWhlaWdodDoxLjhlbTt0ZXh0LWFsaWduOmNlbnRlcn0udWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci10aXRsZSBzZWxlY3R7Zm9udC1zaXplOjFlbTttYXJnaW46MXB4IDB9LnVpLWRhdGVwaWNrZXIgc2VsZWN0LnVpLWRhdGVwaWNrZXItbW9udGgsLnVpLWRhdGVwaWNrZXIgc2VsZWN0LnVpLWRhdGVwaWNrZXIteWVhcnt3aWR0aDo0NSV9LnVpLWRhdGVwaWNrZXIgdGFibGV7d2lkdGg6MTAwJTtmb250LXNpemU6LjllbTtib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7bWFyZ2luOjAgMCAuNGVtfS51aS1kYXRlcGlja2VyIHRoe3BhZGRpbmc6LjdlbSAuM2VtO3RleHQtYWxpZ246Y2VudGVyO2ZvbnQtd2VpZ2h0OmJvbGQ7Ym9yZGVyOjB9LnVpLWRhdGVwaWNrZXIgdGR7Ym9yZGVyOjA7cGFkZGluZzoxcHh9LnVpLWRhdGVwaWNrZXIgdGQgc3BhbiwudWktZGF0ZXBpY2tlciB0ZCBhe2Rpc3BsYXk6YmxvY2s7cGFkZGluZzouMmVtO3RleHQtYWxpZ246cmlnaHQ7dGV4dC1kZWNvcmF0aW9uOm5vbmV9LnVpLWRhdGVwaWNrZXIgLnVpLWRhdGVwaWNrZXItYnV0dG9ucGFuZXtiYWNrZ3JvdW5kLWltYWdlOm5vbmU7bWFyZ2luOi43ZW0gMCAwIDA7cGFkZGluZzowIC4yZW07Ym9yZGVyLWxlZnQ6MDtib3JkZXItcmlnaHQ6MDtib3JkZXItYm90dG9tOjB9LnVpLWRhdGVwaWNrZXIgLnVpLWRhdGVwaWNrZXItYnV0dG9ucGFuZSBidXR0b257ZmxvYXQ6cmlnaHQ7bWFyZ2luOi41ZW0gLjJlbSAuNGVtO2N1cnNvcjpwb2ludGVyO3BhZGRpbmc6LjJlbSAuNmVtIC4zZW0gLjZlbTt3aWR0aDphdXRvO292ZXJmbG93OnZpc2libGV9LnVpLWRhdGVwaWNrZXIgLnVpLWRhdGVwaWNrZXItYnV0dG9ucGFuZSBidXR0b24udWktZGF0ZXBpY2tlci1jdXJyZW50e2Zsb2F0OmxlZnR9LnVpLWRhdGVwaWNrZXIudWktZGF0ZXBpY2tlci1tdWx0aXt3aWR0aDphdXRvfS51aS1kYXRlcGlja2VyLW11bHRpIC51aS1kYXRlcGlja2VyLWdyb3Vwe2Zsb2F0OmxlZnR9LnVpLWRhdGVwaWNrZXItbXVsdGkgLnVpLWRhdGVwaWNrZXItZ3JvdXAgdGFibGV7d2lkdGg6OTUlO21hcmdpbjowIGF1dG8gLjRlbX0udWktZGF0ZXBpY2tlci1tdWx0aS0yIC51aS1kYXRlcGlja2VyLWdyb3Vwe3dpZHRoOjUwJX0udWktZGF0ZXBpY2tlci1tdWx0aS0zIC51aS1kYXRlcGlja2VyLWdyb3Vwe3dpZHRoOjMzLjMlfS51aS1kYXRlcGlja2VyLW11bHRpLTQgLnVpLWRhdGVwaWNrZXItZ3JvdXB7d2lkdGg6MjUlfS51aS1kYXRlcGlja2VyLW11bHRpIC51aS1kYXRlcGlja2VyLWdyb3VwLWxhc3QgLnVpLWRhdGVwaWNrZXItaGVhZGVyLC51aS1kYXRlcGlja2VyLW11bHRpIC51aS1kYXRlcGlja2VyLWdyb3VwLW1pZGRsZSAudWktZGF0ZXBpY2tlci1oZWFkZXJ7Ym9yZGVyLWxlZnQtd2lkdGg6MH0udWktZGF0ZXBpY2tlci1tdWx0aSAudWktZGF0ZXBpY2tlci1idXR0b25wYW5le2NsZWFyOmxlZnR9LnVpLWRhdGVwaWNrZXItcm93LWJyZWFre2NsZWFyOmJvdGg7d2lkdGg6MTAwJTtmb250LXNpemU6MH0udWktZGF0ZXBpY2tlci1ydGx7ZGlyZWN0aW9uOnJ0bH0udWktZGF0ZXBpY2tlci1ydGwgLnVpLWRhdGVwaWNrZXItcHJldntyaWdodDoycHg7bGVmdDphdXRvfS51aS1kYXRlcGlja2VyLXJ0bCAudWktZGF0ZXBpY2tlci1uZXh0e2xlZnQ6MnB4O3JpZ2h0OmF1dG99LnVpLWRhdGVwaWNrZXItcnRsIC51aS1kYXRlcGlja2VyLXByZXY6aG92ZXJ7cmlnaHQ6MXB4O2xlZnQ6YXV0b30udWktZGF0ZXBpY2tlci1ydGwgLnVpLWRhdGVwaWNrZXItbmV4dDpob3ZlcntsZWZ0OjFweDtyaWdodDphdXRvfS51aS1kYXRlcGlja2VyLXJ0bCAudWktZGF0ZXBpY2tlci1idXR0b25wYW5le2NsZWFyOnJpZ2h0fS51aS1kYXRlcGlja2VyLXJ0bCAudWktZGF0ZXBpY2tlci1idXR0b25wYW5lIGJ1dHRvbntmbG9hdDpsZWZ0fS51aS1kYXRlcGlja2VyLXJ0bCAudWktZGF0ZXBpY2tlci1idXR0b25wYW5lIGJ1dHRvbi51aS1kYXRlcGlja2VyLWN1cnJlbnQsLnVpLWRhdGVwaWNrZXItcnRsIC51aS1kYXRlcGlja2VyLWdyb3Vwe2Zsb2F0OnJpZ2h0fS51aS1kYXRlcGlja2VyLXJ0bCAudWktZGF0ZXBpY2tlci1ncm91cC1sYXN0IC51aS1kYXRlcGlja2VyLWhlYWRlciwudWktZGF0ZXBpY2tlci1ydGwgLnVpLWRhdGVwaWNrZXItZ3JvdXAtbWlkZGxlIC51aS1kYXRlcGlja2VyLWhlYWRlcntib3JkZXItcmlnaHQtd2lkdGg6MDtib3JkZXItbGVmdC13aWR0aDoxcHh9LnVpLWRpYWxvZ3tvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO3BhZGRpbmc6LjJlbTtvdXRsaW5lOjB9LnVpLWRpYWxvZyAudWktZGlhbG9nLXRpdGxlYmFye3BhZGRpbmc6LjRlbSAxZW07cG9zaXRpb246cmVsYXRpdmV9LnVpLWRpYWxvZyAudWktZGlhbG9nLXRpdGxle2Zsb2F0OmxlZnQ7bWFyZ2luOi4xZW0gMDt3aGl0ZS1zcGFjZTpub3dyYXA7d2lkdGg6OTAlO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzfS51aS1kaWFsb2cgLnVpLWRpYWxvZy10aXRsZWJhci1jbG9zZXtwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDouM2VtO3RvcDo1MCU7d2lkdGg6MjBweDttYXJnaW46LTEwcHggMCAwIDA7cGFkZGluZzoxcHg7aGVpZ2h0OjIwcHh9LnVpLWRpYWxvZyAudWktZGlhbG9nLWNvbnRlbnR7cG9zaXRpb246cmVsYXRpdmU7Ym9yZGVyOjA7cGFkZGluZzouNWVtIDFlbTtiYWNrZ3JvdW5kOm5vbmU7b3ZlcmZsb3c6YXV0b30udWktZGlhbG9nIC51aS1kaWFsb2ctYnV0dG9ucGFuZXt0ZXh0LWFsaWduOmxlZnQ7Ym9yZGVyLXdpZHRoOjFweCAwIDAgMDtiYWNrZ3JvdW5kLWltYWdlOm5vbmU7bWFyZ2luLXRvcDouNWVtO3BhZGRpbmc6LjNlbSAxZW0gLjVlbSAuNGVtfS51aS1kaWFsb2cgLnVpLWRpYWxvZy1idXR0b25wYW5lIC51aS1kaWFsb2ctYnV0dG9uc2V0e2Zsb2F0OnJpZ2h0fS51aS1kaWFsb2cgLnVpLWRpYWxvZy1idXR0b25wYW5lIGJ1dHRvbnttYXJnaW46LjVlbSAuNGVtIC41ZW0gMDtjdXJzb3I6cG9pbnRlcn0udWktZGlhbG9nIC51aS1yZXNpemFibGUtc2V7d2lkdGg6MTJweDtoZWlnaHQ6MTJweDtyaWdodDotNXB4O2JvdHRvbTotNXB4O2JhY2tncm91bmQtcG9zaXRpb246MTZweCAxNnB4fS51aS1kcmFnZ2FibGUgLnVpLWRpYWxvZy10aXRsZWJhcntjdXJzb3I6bW92ZX0udWktZHJhZ2dhYmxlLWhhbmRsZXstbXMtdG91Y2gtYWN0aW9uOm5vbmU7dG91Y2gtYWN0aW9uOm5vbmV9LnVpLW1lbnV7bGlzdC1zdHlsZTpub25lO3BhZGRpbmc6MDttYXJnaW46MDtkaXNwbGF5OmJsb2NrO291dGxpbmU6bm9uZX0udWktbWVudSAudWktbWVudXtwb3NpdGlvbjphYnNvbHV0ZX0udWktbWVudSAudWktbWVudS1pdGVte3Bvc2l0aW9uOnJlbGF0aXZlO21hcmdpbjowO3BhZGRpbmc6M3B4IDFlbSAzcHggLjRlbTtjdXJzb3I6cG9pbnRlcjttaW4taGVpZ2h0OjA7bGlzdC1zdHlsZS1pbWFnZTp1cmwoImRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEFRQUJBSUFBQUFBQUFQLy8veUg1QkFFQUFBQUFMQUFBQUFBQkFBRUFBQUlCUkFBNyIpfS51aS1tZW51IC51aS1tZW51LWRpdmlkZXJ7bWFyZ2luOjVweCAwO2hlaWdodDowO2ZvbnQtc2l6ZTowO2xpbmUtaGVpZ2h0OjA7Ym9yZGVyLXdpZHRoOjFweCAwIDAgMH0udWktbWVudSAudWktc3RhdGUtZm9jdXMsLnVpLW1lbnUgLnVpLXN0YXRlLWFjdGl2ZXttYXJnaW46LTFweH0udWktbWVudS1pY29uc3twb3NpdGlvbjpyZWxhdGl2ZX0udWktbWVudS1pY29ucyAudWktbWVudS1pdGVte3BhZGRpbmctbGVmdDoyZW19LnVpLW1lbnUgLnVpLWljb257cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7bGVmdDouMmVtO21hcmdpbjphdXRvIDB9LnVpLW1lbnUgLnVpLW1lbnUtaWNvbntsZWZ0OmF1dG87cmlnaHQ6MH0udWktcHJvZ3Jlc3NiYXJ7aGVpZ2h0OjJlbTt0ZXh0LWFsaWduOmxlZnQ7b3ZlcmZsb3c6aGlkZGVufS51aS1wcm9ncmVzc2JhciAudWktcHJvZ3Jlc3NiYXItdmFsdWV7bWFyZ2luOi0xcHg7aGVpZ2h0OjEwMCV9LnVpLXByb2dyZXNzYmFyIC51aS1wcm9ncmVzc2Jhci1vdmVybGF5e2JhY2tncm91bmQ6dXJsKCJkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhLQUFvQUlBQkFBQUFBUC8vL3lIL0MwNUZWRk5EUVZCRk1pNHdBd0VBQUFBaCtRUUpBUUFCQUN3QUFBQUFLQUFvQUFBQ2tZd05xWHJkQzUyRFMwNmE3TUZaSSs0RkhCQ0tvRGVXS1hxeW1QcUdxeHZKclhaYk14N1R0Yyt3OVhnVTJGQjNsT3lRUldFVDJJRkdpVTltMWZyRFZweFpaYzZiZkh3djRjMVlYUDZrMVZkeTI5MkZiNlVrdXZGdFhwdldTekErSHljWEpIVVhpR1lJaU1nMlI2VzQ1OWduV0dmSE5kaklxRFdWcWVtSDJla3BPYmtwT2xwcFdVcVppcXI2ZWRxcVdRQUFJZmtFQ1FFQUFRQXNBQUFBQUNnQUtBQUFBcFNNZ1puR2ZhcWNnMUUydXV6RG1tSFVCUjhRaWw5NWhpUEtxV24zYXF0THNTMTh5N0cxU3pOZW93V0JFTnRRZCtUMUprdFAwNW56UFRkSlpsUjZ2VXhOV1dqVit2VVdoV05rV0Z3eGw5VnBaUmVkWWNmbElPTGFmYWEyOFhkc0gveW5sY2MxdVBWRFp4UUlSMEsyNStjSUNDbW9xQ2U1bUdoWk9mZVlTVWg1eUpjSnlya1pXV3BhUjhkb0oybzROWXE2MmxBQUFDSDVCQWtCQUFFQUxBQUFBQUFvQUNnQUFBS1ZESTRZeTIyWm5JTlJOcW9zdzBCdjdpMWd5SFVrRmo3b1NhV2x1M292QzhHeE5zbzVmbHV6M3FMVmhCVmVUL0x6N1pUSHl4TDVkRGFsUVdQVk9zUVd0Um51d1hhRlRqOWpWVmg4cG1hOUpqWjR6WVNqNVpPeW1hN3V1b2xmZmgrSVI1YVc5N2NIdUJVWEtHS1hsS2puK0RpSFdNY1lKYWg0TjBsWUNNbEpPWGlwR1JyNXFkZ29TVHJxV1NxNldGbDJ5cG9hVUFBQUlma0VDUUVBQVFBc0FBQUFBQ2dBS0FBQUFwYUViNkhMZ2QvaU83Rk5XdGNGV2UrdWZPREdqUmZvaUoyYWtTaGJ1ZWIwd3RJNTB6bTAycGJ2d2ZXRU1XQlExektHbExJaHNraUVQbTlSNnZSWHhWNFp6V1QyeUhPR3BXTXlvcmJsS2xOcDhIbUhFYi9sQ1hqY1c3Ym10WFA4WHQyMjlPVldSMWZvZDJlV3FOZkh1TWpYQ1BrSUdOaWxlT2lJbVZtQ09FbW9TZm4zeVhsSldtb0hHaHFwNmlsWXVXWXBtVHFLVWdBQUlma0VDUUVBQVFBc0FBQUFBQ2dBS0FBQUFwaUVINmtiNThiaVEzRk5XdE1GV1czZU5WY29qdUZHZnFuWnFTZWJ1UzA2dzVWODAvWDAycEtlOHpGd1A2RUZXT1QxbERGazhyR0VSaDFUVE5Pb2NRNjFIbTRYbTJWZXhVSHB6anltVmlIckZiaUVMc2VmVnJuNlhLZm50MlE5Ry8rWGRpZTQ5OVhIZDJnNGg3aW9PR2hYR0pib0dBblhTQm5vQndLWXlmaW91YlpKMkhuMFJ1UlphZmxaT2lsNTZacDZpaW9LU1hwVUFBQWgrUVFKQVFBQkFDd0FBQUFBS0FBb0FBQUNrb1FScVJ2bnh1STdrVTFhMVVVNWJkNXRuU2VPWlhobW41bFdLM3FOVFd2UmRReFA4cXZhQysveWFZUXpYTzdCTXZhVUVtSlJkM1RzaU1BZ3N3bU5ZclNnWmRZclRYNnRTSEdaTzczZXp1QXcydXh1UStCYmVaZk14c2V4WTM1Ky9RZTRKMWluVjBnNHgzV0h1TWhJbDJqWE9LVDJRK1ZVNWZnb1NVSTUyVmZaeWZrSkdraGE2am1ZK2FhWWRpcnErbFFBQUNINUJBa0JBQUVBTEFBQUFBQW9BQ2dBQUFLV0JJS3BZZTBMM1lOS1RvcXN3VWx2em5pZ2Q0d2lSNEtoWnJLdDlVcHFpcDYxaTlFM3ZNdnhSZEhsYkVGaUVYZms5WUFSWXhPWlpENlZRMnBVdW5CbXRSWG8xTGY4aE1WVmNObDhKYWZWMzhhTTIvRnU1VjE2Qm42M3I2eHQ5N2owOStNWFNGaTRCbmlHRmFlM2h6Ykg5K2hZQnprcHVVaDVhWm1IdWFuWk9aZ0l1dmJHaU5lb21DbmF4eGFwMnVwYUNac3ErMWtBQUNINUJBa0JBQUVBTEFBQUFBQW9BQ2dBQUFLWGpJOEJ5NXpmNGtPeFRWclhOVmx2MVgwZDhJR1pHS0xuTnBZdG04THI5Y3FWZXVPU3ZmT1c3OUQ5YURIaXpOaERKaWRGWmhOeWRFYWhPYURINm5vbXRKanAxdHV0S29OV2t2QTZKcWZSVkxIVS9RVWZhdTlsMng3RzU0ZDFmbDk5NXhjSUdBZFhxTWZCTmFkb1lyaEgrTWcyS0JscFZwYmx1Q2lYbU1uWjJTaDRHQnFKK2NrSU9xcUo2TG1LU2xsWm1zb3E2d3BRQUFBaCtRUUpBUUFCQUN3QUFBQUFLQUFvQUFBQ2xZeC9vTHZveHVKRGtVMWExWVVaYko1OW5TZDJaWGhXcWJSYTIvZ0Y4R3UyRFkzaXFzN3lycSt4QllFa1l2RlNNOGFTU09iRStaZ1JsMUJIRlpOcjdwUkNhdlo1QlcyMTQyaFkzQU4veld0c21mMTJwOVh4eEZsMmxwTG4xcnNlenRmWFpqZElXSWYyczVkSXR3allLQmdvOXlnNXBIZ3pKWFRFZUdsWnVlbnB5UG1wR1FvS09Xa1ltU3BhU25xS2lsZUkyRkFBQUNINUJBa0JBQUVBTEFBQUFBQW9BQ2dBQUFLVmpCK2d1K2pHNGtPUlRWclZoUmxzbm4yZEozWmxlRmFwdEZyYitDWG1POU9vemVMNVZmUDk5SHZBV2hwaVVkY3drcEJIMzgyNUF3WWRVOHhUcWxMR2h0Q29zQXJLTXB2ZmExbU1SYWU5VnZXWmZlQjJYZlBrZUxtbTE4bFVjQmorcDVkbk44alhaM1lJR0VoWXVPVW40NWFvQ0RrcDE2aGw1SWpZSnZqV0tjbm9HUXBxeVBscE9ocjNhRWxhcXJxNTZCcTdWQUFBT3c9PSIpO2hlaWdodDoxMDAlO2ZpbHRlcjphbHBoYShvcGFjaXR5PTI1KTtvcGFjaXR5OjAuMjV9LnVpLXByb2dyZXNzYmFyLWluZGV0ZXJtaW5hdGUgLnVpLXByb2dyZXNzYmFyLXZhbHVle2JhY2tncm91bmQtaW1hZ2U6bm9uZX0udWktcmVzaXphYmxle3Bvc2l0aW9uOnJlbGF0aXZlfS51aS1yZXNpemFibGUtaGFuZGxle3Bvc2l0aW9uOmFic29sdXRlO2ZvbnQtc2l6ZTowLjFweDtkaXNwbGF5OmJsb2NrOy1tcy10b3VjaC1hY3Rpb246bm9uZTt0b3VjaC1hY3Rpb246bm9uZX0udWktcmVzaXphYmxlLWRpc2FibGVkIC51aS1yZXNpemFibGUtaGFuZGxlLC51aS1yZXNpemFibGUtYXV0b2hpZGUgLnVpLXJlc2l6YWJsZS1oYW5kbGV7ZGlzcGxheTpub25lfS51aS1yZXNpemFibGUtbntjdXJzb3I6bi1yZXNpemU7aGVpZ2h0OjdweDt3aWR0aDoxMDAlO3RvcDotNXB4O2xlZnQ6MH0udWktcmVzaXphYmxlLXN7Y3Vyc29yOnMtcmVzaXplO2hlaWdodDo3cHg7d2lkdGg6MTAwJTtib3R0b206LTVweDtsZWZ0OjB9LnVpLXJlc2l6YWJsZS1le2N1cnNvcjplLXJlc2l6ZTt3aWR0aDo3cHg7cmlnaHQ6LTVweDt0b3A6MDtoZWlnaHQ6MTAwJX0udWktcmVzaXphYmxlLXd7Y3Vyc29yOnctcmVzaXplO3dpZHRoOjdweDtsZWZ0Oi01cHg7dG9wOjA7aGVpZ2h0OjEwMCV9LnVpLXJlc2l6YWJsZS1zZXtjdXJzb3I6c2UtcmVzaXplO3dpZHRoOjEycHg7aGVpZ2h0OjEycHg7cmlnaHQ6MXB4O2JvdHRvbToxcHh9LnVpLXJlc2l6YWJsZS1zd3tjdXJzb3I6c3ctcmVzaXplO3dpZHRoOjlweDtoZWlnaHQ6OXB4O2xlZnQ6LTVweDtib3R0b206LTVweH0udWktcmVzaXphYmxlLW53e2N1cnNvcjpudy1yZXNpemU7d2lkdGg6OXB4O2hlaWdodDo5cHg7bGVmdDotNXB4O3RvcDotNXB4fS51aS1yZXNpemFibGUtbmV7Y3Vyc29yOm5lLXJlc2l6ZTt3aWR0aDo5cHg7aGVpZ2h0OjlweDtyaWdodDotNXB4O3RvcDotNXB4fS51aS1zZWxlY3RhYmxley1tcy10b3VjaC1hY3Rpb246bm9uZTt0b3VjaC1hY3Rpb246bm9uZX0udWktc2VsZWN0YWJsZS1oZWxwZXJ7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDA7Ym9yZGVyOjFweCBkb3R0ZWQgYmxhY2t9LnVpLXNlbGVjdG1lbnUtbWVudXtwYWRkaW5nOjA7bWFyZ2luOjA7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO2Rpc3BsYXk6bm9uZX0udWktc2VsZWN0bWVudS1tZW51IC51aS1tZW51e292ZXJmbG93OmF1dG87b3ZlcmZsb3cteDpoaWRkZW47cGFkZGluZy1ib3R0b206MXB4fS51aS1zZWxlY3RtZW51LW1lbnUgLnVpLW1lbnUgLnVpLXNlbGVjdG1lbnUtb3B0Z3JvdXB7Zm9udC1zaXplOjFlbTtmb250LXdlaWdodDpib2xkO2xpbmUtaGVpZ2h0OjEuNTtwYWRkaW5nOjJweCAwLjRlbTttYXJnaW46MC41ZW0gMCAwIDA7aGVpZ2h0OmF1dG87Ym9yZGVyOjB9LnVpLXNlbGVjdG1lbnUtb3BlbntkaXNwbGF5OmJsb2NrfS51aS1zZWxlY3RtZW51LWJ1dHRvbntkaXNwbGF5OmlubGluZS1ibG9jaztvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246cmVsYXRpdmU7dGV4dC1kZWNvcmF0aW9uOm5vbmU7Y3Vyc29yOnBvaW50ZXJ9LnVpLXNlbGVjdG1lbnUtYnV0dG9uIHNwYW4udWktaWNvbntyaWdodDowLjVlbTtsZWZ0OmF1dG87bWFyZ2luLXRvcDotOHB4O3Bvc2l0aW9uOmFic29sdXRlO3RvcDo1MCV9LnVpLXNlbGVjdG1lbnUtYnV0dG9uIHNwYW4udWktc2VsZWN0bWVudS10ZXh0e3RleHQtYWxpZ246bGVmdDtwYWRkaW5nOjAuNGVtIDIuMWVtIDAuNGVtIDFlbTtkaXNwbGF5OmJsb2NrO2xpbmUtaGVpZ2h0OjEuNDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpczt3aGl0ZS1zcGFjZTpub3dyYXB9LnVpLXNsaWRlcntwb3NpdGlvbjpyZWxhdGl2ZTt0ZXh0LWFsaWduOmxlZnR9LnVpLXNsaWRlciAudWktc2xpZGVyLWhhbmRsZXtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjI7d2lkdGg6MS4yZW07aGVpZ2h0OjEuMmVtO2N1cnNvcjpkZWZhdWx0Oy1tcy10b3VjaC1hY3Rpb246bm9uZTt0b3VjaC1hY3Rpb246bm9uZX0udWktc2xpZGVyIC51aS1zbGlkZXItcmFuZ2V7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxO2ZvbnQtc2l6ZTouN2VtO2Rpc3BsYXk6YmxvY2s7Ym9yZGVyOjA7YmFja2dyb3VuZC1wb3NpdGlvbjowIDB9LnVpLXNsaWRlci51aS1zdGF0ZS1kaXNhYmxlZCAudWktc2xpZGVyLWhhbmRsZSwudWktc2xpZGVyLnVpLXN0YXRlLWRpc2FibGVkIC51aS1zbGlkZXItcmFuZ2V7ZmlsdGVyOmluaGVyaXR9LnVpLXNsaWRlci1ob3Jpem9udGFse2hlaWdodDouOGVtfS51aS1zbGlkZXItaG9yaXpvbnRhbCAudWktc2xpZGVyLWhhbmRsZXt0b3A6LS4zZW07bWFyZ2luLWxlZnQ6LS42ZW19LnVpLXNsaWRlci1ob3Jpem9udGFsIC51aS1zbGlkZXItcmFuZ2V7dG9wOjA7aGVpZ2h0OjEwMCV9LnVpLXNsaWRlci1ob3Jpem9udGFsIC51aS1zbGlkZXItcmFuZ2UtbWlue2xlZnQ6MH0udWktc2xpZGVyLWhvcml6b250YWwgLnVpLXNsaWRlci1yYW5nZS1tYXh7cmlnaHQ6MH0udWktc2xpZGVyLXZlcnRpY2Fse3dpZHRoOi44ZW07aGVpZ2h0OjEwMHB4fS51aS1zbGlkZXItdmVydGljYWwgLnVpLXNsaWRlci1oYW5kbGV7bGVmdDotLjNlbTttYXJnaW4tbGVmdDowO21hcmdpbi1ib3R0b206LS42ZW19LnVpLXNsaWRlci12ZXJ0aWNhbCAudWktc2xpZGVyLXJhbmdle2xlZnQ6MDt3aWR0aDoxMDAlfS51aS1zbGlkZXItdmVydGljYWwgLnVpLXNsaWRlci1yYW5nZS1taW57Ym90dG9tOjB9LnVpLXNsaWRlci12ZXJ0aWNhbCAudWktc2xpZGVyLXJhbmdlLW1heHt0b3A6MH0udWktc29ydGFibGUtaGFuZGxley1tcy10b3VjaC1hY3Rpb246bm9uZTt0b3VjaC1hY3Rpb246bm9uZX0udWktc3Bpbm5lcntwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmlubGluZS1ibG9jaztvdmVyZmxvdzpoaWRkZW47cGFkZGluZzowO3ZlcnRpY2FsLWFsaWduOm1pZGRsZX0udWktc3Bpbm5lci1pbnB1dHtib3JkZXI6bm9uZTtiYWNrZ3JvdW5kOm5vbmU7Y29sb3I6aW5oZXJpdDtwYWRkaW5nOjA7bWFyZ2luOi4yZW0gMDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7bWFyZ2luLWxlZnQ6LjRlbTttYXJnaW4tcmlnaHQ6MjJweH0udWktc3Bpbm5lci1idXR0b257d2lkdGg6MTZweDtoZWlnaHQ6NTAlO2ZvbnQtc2l6ZTouNWVtO3BhZGRpbmc6MDttYXJnaW46MDt0ZXh0LWFsaWduOmNlbnRlcjtwb3NpdGlvbjphYnNvbHV0ZTtjdXJzb3I6ZGVmYXVsdDtkaXNwbGF5OmJsb2NrO292ZXJmbG93OmhpZGRlbjtyaWdodDowfS51aS1zcGlubmVyIGEudWktc3Bpbm5lci1idXR0b257Ym9yZGVyLXRvcDpub25lO2JvcmRlci1ib3R0b206bm9uZTtib3JkZXItcmlnaHQ6bm9uZX0udWktc3Bpbm5lciAudWktaWNvbntwb3NpdGlvbjphYnNvbHV0ZTttYXJnaW4tdG9wOi04cHg7dG9wOjUwJTtsZWZ0OjB9LnVpLXNwaW5uZXItdXB7dG9wOjB9LnVpLXNwaW5uZXItZG93bntib3R0b206MH0udWktc3Bpbm5lciAudWktaWNvbi10cmlhbmdsZS0xLXN7YmFja2dyb3VuZC1wb3NpdGlvbjotNjVweCAtMTZweH0udWktdGFic3twb3NpdGlvbjpyZWxhdGl2ZTtwYWRkaW5nOi4yZW19LnVpLXRhYnMgLnVpLXRhYnMtbmF2e21hcmdpbjowO3BhZGRpbmc6LjJlbSAuMmVtIDB9LnVpLXRhYnMgLnVpLXRhYnMtbmF2IGxpe2xpc3Qtc3R5bGU6bm9uZTtmbG9hdDpsZWZ0O3Bvc2l0aW9uOnJlbGF0aXZlO3RvcDowO21hcmdpbjoxcHggLjJlbSAwIDA7Ym9yZGVyLWJvdHRvbS13aWR0aDowO3BhZGRpbmc6MDt3aGl0ZS1zcGFjZTpub3dyYXB9LnVpLXRhYnMgLnVpLXRhYnMtbmF2IC51aS10YWJzLWFuY2hvcntmbG9hdDpsZWZ0O3BhZGRpbmc6LjVlbSAxZW07dGV4dC1kZWNvcmF0aW9uOm5vbmV9LnVpLXRhYnMgLnVpLXRhYnMtbmF2IGxpLnVpLXRhYnMtYWN0aXZle21hcmdpbi1ib3R0b206LTFweDtwYWRkaW5nLWJvdHRvbToxcHh9LnVpLXRhYnMgLnVpLXRhYnMtbmF2IGxpLnVpLXRhYnMtYWN0aXZlIC51aS10YWJzLWFuY2hvciwudWktdGFicyAudWktdGFicy1uYXYgbGkudWktc3RhdGUtZGlzYWJsZWQgLnVpLXRhYnMtYW5jaG9yLC51aS10YWJzIC51aS10YWJzLW5hdiBsaS51aS10YWJzLWxvYWRpbmcgLnVpLXRhYnMtYW5jaG9ye2N1cnNvcjp0ZXh0fS51aS10YWJzLWNvbGxhcHNpYmxlIC51aS10YWJzLW5hdiBsaS51aS10YWJzLWFjdGl2ZSAudWktdGFicy1hbmNob3J7Y3Vyc29yOnBvaW50ZXJ9LnVpLXRhYnMgLnVpLXRhYnMtcGFuZWx7ZGlzcGxheTpibG9jaztib3JkZXItd2lkdGg6MDtwYWRkaW5nOjFlbSAxLjRlbTtiYWNrZ3JvdW5kOm5vbmV9LnVpLXRvb2x0aXB7cGFkZGluZzo4cHg7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDo5OTk5O21heC13aWR0aDozMDBweDstd2Via2l0LWJveC1zaGFkb3c6MCAwIDVweCAjYWFhO2JveC1zaGFkb3c6MCAwIDVweCAjYWFhfWJvZHkgLnVpLXRvb2x0aXB7Ym9yZGVyLXdpZHRoOjJweH0udWktd2lkZ2V0e2ZvbnQtZmFtaWx5OlRyZWJ1Y2hldCBNUyxUYWhvbWEsVmVyZGFuYSxBcmlhbCxzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxLjFlbX0udWktd2lkZ2V0IC51aS13aWRnZXR7Zm9udC1zaXplOjFlbX0udWktd2lkZ2V0IGlucHV0LC51aS13aWRnZXQgc2VsZWN0LC51aS13aWRnZXQgdGV4dGFyZWEsLnVpLXdpZGdldCBidXR0b257Zm9udC1mYW1pbHk6VHJlYnVjaGV0IE1TLFRhaG9tYSxWZXJkYW5hLEFyaWFsLHNhbnMtc2VyaWY7Zm9udC1zaXplOjFlbX0udWktd2lkZ2V0LWNvbnRlbnR7Ym9yZGVyOjFweCBzb2xpZCAjZGRkO2JhY2tncm91bmQ6I2VlZSB1cmwoImltYWdlcy91aS1iZ19oaWdobGlnaHQtc29mdF8xMDBfZWVlZWVlXzF4MTAwLnBuZyIpIDUwJSB0b3AgcmVwZWF0LXg7Y29sb3I6IzMzM30udWktd2lkZ2V0LWNvbnRlbnQgYXtjb2xvcjojMzMzfS51aS13aWRnZXQtaGVhZGVye2JvcmRlcjoxcHggc29saWQgI2U3OGYwODtiYWNrZ3JvdW5kOiNmNmE4MjggdXJsKCJpbWFnZXMvdWktYmdfZ2xvc3Mtd2F2ZV8zNV9mNmE4MjhfNTAweDEwMC5wbmciKSA1MCUgNTAlIHJlcGVhdC14O2NvbG9yOiNmZmY7Zm9udC13ZWlnaHQ6Ym9sZH0udWktd2lkZ2V0LWhlYWRlciBhe2NvbG9yOiNmZmZ9LnVpLXN0YXRlLWRlZmF1bHQsLnVpLXdpZGdldC1jb250ZW50IC51aS1zdGF0ZS1kZWZhdWx0LC51aS13aWRnZXQtaGVhZGVyIC51aS1zdGF0ZS1kZWZhdWx0e2JvcmRlcjoxcHggc29saWQgI2NjYztiYWNrZ3JvdW5kOiNmNmY2ZjYgdXJsKCJpbWFnZXMvdWktYmdfZ2xhc3NfMTAwX2Y2ZjZmNl8xeDQwMC5wbmciKSA1MCUgNTAlIHJlcGVhdC14O2ZvbnQtd2VpZ2h0OmJvbGQ7Y29sb3I6IzFjOTRjNH0udWktc3RhdGUtZGVmYXVsdCBhLC51aS1zdGF0ZS1kZWZhdWx0IGE6bGluaywudWktc3RhdGUtZGVmYXVsdCBhOnZpc2l0ZWR7Y29sb3I6IzFjOTRjNDt0ZXh0LWRlY29yYXRpb246bm9uZX0udWktc3RhdGUtaG92ZXIsLnVpLXdpZGdldC1jb250ZW50IC51aS1zdGF0ZS1ob3ZlciwudWktd2lkZ2V0LWhlYWRlciAudWktc3RhdGUtaG92ZXIsLnVpLXN0YXRlLWZvY3VzLC51aS13aWRnZXQtY29udGVudCAudWktc3RhdGUtZm9jdXMsLnVpLXdpZGdldC1oZWFkZXIgLnVpLXN0YXRlLWZvY3Vze2JvcmRlcjoxcHggc29saWQgI2ZiY2IwOTtiYWNrZ3JvdW5kOiNmZGY1Y2UgdXJsKCJpbWFnZXMvdWktYmdfZ2xhc3NfMTAwX2ZkZjVjZV8xeDQwMC5wbmciKSA1MCUgNTAlIHJlcGVhdC14O2ZvbnQtd2VpZ2h0OmJvbGQ7Y29sb3I6I2M3NzQwNX0udWktc3RhdGUtaG92ZXIgYSwudWktc3RhdGUtaG92ZXIgYTpob3ZlciwudWktc3RhdGUtaG92ZXIgYTpsaW5rLC51aS1zdGF0ZS1ob3ZlciBhOnZpc2l0ZWQsLnVpLXN0YXRlLWZvY3VzIGEsLnVpLXN0YXRlLWZvY3VzIGE6aG92ZXIsLnVpLXN0YXRlLWZvY3VzIGE6bGluaywudWktc3RhdGUtZm9jdXMgYTp2aXNpdGVke2NvbG9yOiNjNzc0MDU7dGV4dC1kZWNvcmF0aW9uOm5vbmV9LnVpLXN0YXRlLWFjdGl2ZSwudWktd2lkZ2V0LWNvbnRlbnQgLnVpLXN0YXRlLWFjdGl2ZSwudWktd2lkZ2V0LWhlYWRlciAudWktc3RhdGUtYWN0aXZle2JvcmRlcjoxcHggc29saWQgI2ZiZDg1MDtiYWNrZ3JvdW5kOiNmZmYgdXJsKCJpbWFnZXMvdWktYmdfZ2xhc3NfNjVfZmZmZmZmXzF4NDAwLnBuZyIpIDUwJSA1MCUgcmVwZWF0LXg7Zm9udC13ZWlnaHQ6Ym9sZDtjb2xvcjojZWI4ZjAwfS51aS1zdGF0ZS1hY3RpdmUgYSwudWktc3RhdGUtYWN0aXZlIGE6bGluaywudWktc3RhdGUtYWN0aXZlIGE6dmlzaXRlZHtjb2xvcjojZWI4ZjAwO3RleHQtZGVjb3JhdGlvbjpub25lfS51aS1zdGF0ZS1oaWdobGlnaHQsLnVpLXdpZGdldC1jb250ZW50IC51aS1zdGF0ZS1oaWdobGlnaHQsLnVpLXdpZGdldC1oZWFkZXIgLnVpLXN0YXRlLWhpZ2hsaWdodHtib3JkZXI6MXB4IHNvbGlkICNmZWQyMmY7YmFja2dyb3VuZDojZmZlNDVjIHVybCgiaW1hZ2VzL3VpLWJnX2hpZ2hsaWdodC1zb2Z0Xzc1X2ZmZTQ1Y18xeDEwMC5wbmciKSA1MCUgdG9wIHJlcGVhdC14O2NvbG9yOiMzNjM2MzZ9LnVpLXN0YXRlLWhpZ2hsaWdodCBhLC51aS13aWRnZXQtY29udGVudCAudWktc3RhdGUtaGlnaGxpZ2h0IGEsLnVpLXdpZGdldC1oZWFkZXIgLnVpLXN0YXRlLWhpZ2hsaWdodCBhe2NvbG9yOiMzNjM2MzZ9LnVpLXN0YXRlLWVycm9yLC51aS13aWRnZXQtY29udGVudCAudWktc3RhdGUtZXJyb3IsLnVpLXdpZGdldC1oZWFkZXIgLnVpLXN0YXRlLWVycm9ye2JvcmRlcjoxcHggc29saWQgI2NkMGEwYTtiYWNrZ3JvdW5kOiNiODE5MDAgdXJsKCJpbWFnZXMvdWktYmdfZGlhZ29uYWxzLXRoaWNrXzE4X2I4MTkwMF80MHg0MC5wbmciKSA1MCUgNTAlIHJlcGVhdDtjb2xvcjojZmZmfS51aS1zdGF0ZS1lcnJvciBhLC51aS13aWRnZXQtY29udGVudCAudWktc3RhdGUtZXJyb3IgYSwudWktd2lkZ2V0LWhlYWRlciAudWktc3RhdGUtZXJyb3IgYXtjb2xvcjojZmZmfS51aS1zdGF0ZS1lcnJvci10ZXh0LC51aS13aWRnZXQtY29udGVudCAudWktc3RhdGUtZXJyb3ItdGV4dCwudWktd2lkZ2V0LWhlYWRlciAudWktc3RhdGUtZXJyb3ItdGV4dHtjb2xvcjojZmZmfS51aS1wcmlvcml0eS1wcmltYXJ5LC51aS13aWRnZXQtY29udGVudCAudWktcHJpb3JpdHktcHJpbWFyeSwudWktd2lkZ2V0LWhlYWRlciAudWktcHJpb3JpdHktcHJpbWFyeXtmb250LXdlaWdodDpib2xkfS51aS1wcmlvcml0eS1zZWNvbmRhcnksLnVpLXdpZGdldC1jb250ZW50IC51aS1wcmlvcml0eS1zZWNvbmRhcnksLnVpLXdpZGdldC1oZWFkZXIgLnVpLXByaW9yaXR5LXNlY29uZGFyeXtvcGFjaXR5Oi43O2ZpbHRlcjpBbHBoYShPcGFjaXR5PTcwKTtmb250LXdlaWdodDpub3JtYWx9LnVpLXN0YXRlLWRpc2FibGVkLC51aS13aWRnZXQtY29udGVudCAudWktc3RhdGUtZGlzYWJsZWQsLnVpLXdpZGdldC1oZWFkZXIgLnVpLXN0YXRlLWRpc2FibGVke29wYWNpdHk6LjM1O2ZpbHRlcjpBbHBoYShPcGFjaXR5PTM1KTtiYWNrZ3JvdW5kLWltYWdlOm5vbmV9LnVpLXN0YXRlLWRpc2FibGVkIC51aS1pY29ue2ZpbHRlcjpBbHBoYShPcGFjaXR5PTM1KX0udWktaWNvbnt3aWR0aDoxNnB4O2hlaWdodDoxNnB4fS51aS1pY29uLC51aS13aWRnZXQtY29udGVudCAudWktaWNvbntiYWNrZ3JvdW5kLWltYWdlOnVybCgiaW1hZ2VzL3VpLWljb25zXzIyMjIyMl8yNTZ4MjQwLnBuZyIpfS51aS13aWRnZXQtaGVhZGVyIC51aS1pY29ue2JhY2tncm91bmQtaW1hZ2U6dXJsKCJpbWFnZXMvdWktaWNvbnNfZmZmZmZmXzI1NngyNDAucG5nIil9LnVpLXN0YXRlLWRlZmF1bHQgLnVpLWljb257YmFja2dyb3VuZC1pbWFnZTp1cmwoImltYWdlcy91aS1pY29uc19lZjhjMDhfMjU2eDI0MC5wbmciKX0udWktc3RhdGUtaG92ZXIgLnVpLWljb24sLnVpLXN0YXRlLWZvY3VzIC51aS1pY29ue2JhY2tncm91bmQtaW1hZ2U6dXJsKCJpbWFnZXMvdWktaWNvbnNfZWY4YzA4XzI1NngyNDAucG5nIil9LnVpLXN0YXRlLWFjdGl2ZSAudWktaWNvbntiYWNrZ3JvdW5kLWltYWdlOnVybCgiaW1hZ2VzL3VpLWljb25zX2VmOGMwOF8yNTZ4MjQwLnBuZyIpfS51aS1zdGF0ZS1oaWdobGlnaHQgLnVpLWljb257YmFja2dyb3VuZC1pbWFnZTp1cmwoImltYWdlcy91aS1pY29uc18yMjhlZjFfMjU2eDI0MC5wbmciKX0udWktc3RhdGUtZXJyb3IgLnVpLWljb24sLnVpLXN0YXRlLWVycm9yLXRleHQgLnVpLWljb257YmFja2dyb3VuZC1pbWFnZTp1cmwoImltYWdlcy91aS1pY29uc19mZmQyN2FfMjU2eDI0MC5wbmciKX0udWktaWNvbi1ibGFua3tiYWNrZ3JvdW5kLXBvc2l0aW9uOjE2cHggMTZweH0udWktaWNvbi1jYXJhdC0xLW57YmFja2dyb3VuZC1wb3NpdGlvbjowIDB9LnVpLWljb24tY2FyYXQtMS1uZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNnB4IDB9LnVpLWljb24tY2FyYXQtMS1le2JhY2tncm91bmQtcG9zaXRpb246LTMycHggMH0udWktaWNvbi1jYXJhdC0xLXNle2JhY2tncm91bmQtcG9zaXRpb246LTQ4cHggMH0udWktaWNvbi1jYXJhdC0xLXN7YmFja2dyb3VuZC1wb3NpdGlvbjotNjRweCAwfS51aS1pY29uLWNhcmF0LTEtc3d7YmFja2dyb3VuZC1wb3NpdGlvbjotODBweCAwfS51aS1pY29uLWNhcmF0LTEtd3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi05NnB4IDB9LnVpLWljb24tY2FyYXQtMS1ud3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMTJweCAwfS51aS1pY29uLWNhcmF0LTItbi1ze2JhY2tncm91bmQtcG9zaXRpb246LTEyOHB4IDB9LnVpLWljb24tY2FyYXQtMi1lLXd7YmFja2dyb3VuZC1wb3NpdGlvbjotMTQ0cHggMH0udWktaWNvbi10cmlhbmdsZS0xLW57YmFja2dyb3VuZC1wb3NpdGlvbjowIC0xNnB4fS51aS1pY29uLXRyaWFuZ2xlLTEtbmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMTZweCAtMTZweH0udWktaWNvbi10cmlhbmdsZS0xLWV7YmFja2dyb3VuZC1wb3NpdGlvbjotMzJweCAtMTZweH0udWktaWNvbi10cmlhbmdsZS0xLXNle2JhY2tncm91bmQtcG9zaXRpb246LTQ4cHggLTE2cHh9LnVpLWljb24tdHJpYW5nbGUtMS1ze2JhY2tncm91bmQtcG9zaXRpb246LTY0cHggLTE2cHh9LnVpLWljb24tdHJpYW5nbGUtMS1zd3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi04MHB4IC0xNnB4fS51aS1pY29uLXRyaWFuZ2xlLTEtd3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi05NnB4IC0xNnB4fS51aS1pY29uLXRyaWFuZ2xlLTEtbnd7YmFja2dyb3VuZC1wb3NpdGlvbjotMTEycHggLTE2cHh9LnVpLWljb24tdHJpYW5nbGUtMi1uLXN7YmFja2dyb3VuZC1wb3NpdGlvbjotMTI4cHggLTE2cHh9LnVpLWljb24tdHJpYW5nbGUtMi1lLXd7YmFja2dyb3VuZC1wb3NpdGlvbjotMTQ0cHggLTE2cHh9LnVpLWljb24tYXJyb3ctMS1ue2JhY2tncm91bmQtcG9zaXRpb246MCAtMzJweH0udWktaWNvbi1hcnJvdy0xLW5le2JhY2tncm91bmQtcG9zaXRpb246LTE2cHggLTMycHh9LnVpLWljb24tYXJyb3ctMS1le2JhY2tncm91bmQtcG9zaXRpb246LTMycHggLTMycHh9LnVpLWljb24tYXJyb3ctMS1zZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi00OHB4IC0zMnB4fS51aS1pY29uLWFycm93LTEtc3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi02NHB4IC0zMnB4fS51aS1pY29uLWFycm93LTEtc3d7YmFja2dyb3VuZC1wb3NpdGlvbjotODBweCAtMzJweH0udWktaWNvbi1hcnJvdy0xLXd7YmFja2dyb3VuZC1wb3NpdGlvbjotOTZweCAtMzJweH0udWktaWNvbi1hcnJvdy0xLW53e2JhY2tncm91bmQtcG9zaXRpb246LTExMnB4IC0zMnB4fS51aS1pY29uLWFycm93LTItbi1ze2JhY2tncm91bmQtcG9zaXRpb246LTEyOHB4IC0zMnB4fS51aS1pY29uLWFycm93LTItbmUtc3d7YmFja2dyb3VuZC1wb3NpdGlvbjotMTQ0cHggLTMycHh9LnVpLWljb24tYXJyb3ctMi1lLXd7YmFja2dyb3VuZC1wb3NpdGlvbjotMTYwcHggLTMycHh9LnVpLWljb24tYXJyb3ctMi1zZS1ud3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNzZweCAtMzJweH0udWktaWNvbi1hcnJvd3N0b3AtMS1ue2JhY2tncm91bmQtcG9zaXRpb246LTE5MnB4IC0zMnB4fS51aS1pY29uLWFycm93c3RvcC0xLWV7YmFja2dyb3VuZC1wb3NpdGlvbjotMjA4cHggLTMycHh9LnVpLWljb24tYXJyb3dzdG9wLTEtc3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yMjRweCAtMzJweH0udWktaWNvbi1hcnJvd3N0b3AtMS13e2JhY2tncm91bmQtcG9zaXRpb246LTI0MHB4IC0zMnB4fS51aS1pY29uLWFycm93dGhpY2stMS1ue2JhY2tncm91bmQtcG9zaXRpb246MCAtNDhweH0udWktaWNvbi1hcnJvd3RoaWNrLTEtbmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMTZweCAtNDhweH0udWktaWNvbi1hcnJvd3RoaWNrLTEtZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zMnB4IC00OHB4fS51aS1pY29uLWFycm93dGhpY2stMS1zZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi00OHB4IC00OHB4fS51aS1pY29uLWFycm93dGhpY2stMS1ze2JhY2tncm91bmQtcG9zaXRpb246LTY0cHggLTQ4cHh9LnVpLWljb24tYXJyb3d0aGljay0xLXN3e2JhY2tncm91bmQtcG9zaXRpb246LTgwcHggLTQ4cHh9LnVpLWljb24tYXJyb3d0aGljay0xLXd7YmFja2dyb3VuZC1wb3NpdGlvbjotOTZweCAtNDhweH0udWktaWNvbi1hcnJvd3RoaWNrLTEtbnd7YmFja2dyb3VuZC1wb3NpdGlvbjotMTEycHggLTQ4cHh9LnVpLWljb24tYXJyb3d0aGljay0yLW4tc3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMjhweCAtNDhweH0udWktaWNvbi1hcnJvd3RoaWNrLTItbmUtc3d7YmFja2dyb3VuZC1wb3NpdGlvbjotMTQ0cHggLTQ4cHh9LnVpLWljb24tYXJyb3d0aGljay0yLWUtd3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNjBweCAtNDhweH0udWktaWNvbi1hcnJvd3RoaWNrLTItc2Utbnd7YmFja2dyb3VuZC1wb3NpdGlvbjotMTc2cHggLTQ4cHh9LnVpLWljb24tYXJyb3d0aGlja3N0b3AtMS1ue2JhY2tncm91bmQtcG9zaXRpb246LTE5MnB4IC00OHB4fS51aS1pY29uLWFycm93dGhpY2tzdG9wLTEtZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yMDhweCAtNDhweH0udWktaWNvbi1hcnJvd3RoaWNrc3RvcC0xLXN7YmFja2dyb3VuZC1wb3NpdGlvbjotMjI0cHggLTQ4cHh9LnVpLWljb24tYXJyb3d0aGlja3N0b3AtMS13e2JhY2tncm91bmQtcG9zaXRpb246LTI0MHB4IC00OHB4fS51aS1pY29uLWFycm93cmV0dXJudGhpY2stMS13e2JhY2tncm91bmQtcG9zaXRpb246MCAtNjRweH0udWktaWNvbi1hcnJvd3JldHVybnRoaWNrLTEtbntiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNnB4IC02NHB4fS51aS1pY29uLWFycm93cmV0dXJudGhpY2stMS1le2JhY2tncm91bmQtcG9zaXRpb246LTMycHggLTY0cHh9LnVpLWljb24tYXJyb3dyZXR1cm50aGljay0xLXN7YmFja2dyb3VuZC1wb3NpdGlvbjotNDhweCAtNjRweH0udWktaWNvbi1hcnJvd3JldHVybi0xLXd7YmFja2dyb3VuZC1wb3NpdGlvbjotNjRweCAtNjRweH0udWktaWNvbi1hcnJvd3JldHVybi0xLW57YmFja2dyb3VuZC1wb3NpdGlvbjotODBweCAtNjRweH0udWktaWNvbi1hcnJvd3JldHVybi0xLWV7YmFja2dyb3VuZC1wb3NpdGlvbjotOTZweCAtNjRweH0udWktaWNvbi1hcnJvd3JldHVybi0xLXN7YmFja2dyb3VuZC1wb3NpdGlvbjotMTEycHggLTY0cHh9LnVpLWljb24tYXJyb3dyZWZyZXNoLTEtd3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMjhweCAtNjRweH0udWktaWNvbi1hcnJvd3JlZnJlc2gtMS1ue2JhY2tncm91bmQtcG9zaXRpb246LTE0NHB4IC02NHB4fS51aS1pY29uLWFycm93cmVmcmVzaC0xLWV7YmFja2dyb3VuZC1wb3NpdGlvbjotMTYwcHggLTY0cHh9LnVpLWljb24tYXJyb3dyZWZyZXNoLTEtc3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNzZweCAtNjRweH0udWktaWNvbi1hcnJvdy00e2JhY2tncm91bmQtcG9zaXRpb246MCAtODBweH0udWktaWNvbi1hcnJvdy00LWRpYWd7YmFja2dyb3VuZC1wb3NpdGlvbjotMTZweCAtODBweH0udWktaWNvbi1leHRsaW5re2JhY2tncm91bmQtcG9zaXRpb246LTMycHggLTgwcHh9LnVpLWljb24tbmV3d2lue2JhY2tncm91bmQtcG9zaXRpb246LTQ4cHggLTgwcHh9LnVpLWljb24tcmVmcmVzaHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi02NHB4IC04MHB4fS51aS1pY29uLXNodWZmbGV7YmFja2dyb3VuZC1wb3NpdGlvbjotODBweCAtODBweH0udWktaWNvbi10cmFuc2Zlci1lLXd7YmFja2dyb3VuZC1wb3NpdGlvbjotOTZweCAtODBweH0udWktaWNvbi10cmFuc2ZlcnRoaWNrLWUtd3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMTJweCAtODBweH0udWktaWNvbi1mb2xkZXItY29sbGFwc2Vke2JhY2tncm91bmQtcG9zaXRpb246MCAtOTZweH0udWktaWNvbi1mb2xkZXItb3BlbntiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNnB4IC05NnB4fS51aS1pY29uLWRvY3VtZW50e2JhY2tncm91bmQtcG9zaXRpb246LTMycHggLTk2cHh9LnVpLWljb24tZG9jdW1lbnQtYntiYWNrZ3JvdW5kLXBvc2l0aW9uOi00OHB4IC05NnB4fS51aS1pY29uLW5vdGV7YmFja2dyb3VuZC1wb3NpdGlvbjotNjRweCAtOTZweH0udWktaWNvbi1tYWlsLWNsb3NlZHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi04MHB4IC05NnB4fS51aS1pY29uLW1haWwtb3BlbntiYWNrZ3JvdW5kLXBvc2l0aW9uOi05NnB4IC05NnB4fS51aS1pY29uLXN1aXRjYXNle2JhY2tncm91bmQtcG9zaXRpb246LTExMnB4IC05NnB4fS51aS1pY29uLWNvbW1lbnR7YmFja2dyb3VuZC1wb3NpdGlvbjotMTI4cHggLTk2cHh9LnVpLWljb24tcGVyc29ue2JhY2tncm91bmQtcG9zaXRpb246LTE0NHB4IC05NnB4fS51aS1pY29uLXByaW50e2JhY2tncm91bmQtcG9zaXRpb246LTE2MHB4IC05NnB4fS51aS1pY29uLXRyYXNoe2JhY2tncm91bmQtcG9zaXRpb246LTE3NnB4IC05NnB4fS51aS1pY29uLWxvY2tlZHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xOTJweCAtOTZweH0udWktaWNvbi11bmxvY2tlZHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yMDhweCAtOTZweH0udWktaWNvbi1ib29rbWFya3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yMjRweCAtOTZweH0udWktaWNvbi10YWd7YmFja2dyb3VuZC1wb3NpdGlvbjotMjQwcHggLTk2cHh9LnVpLWljb24taG9tZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTExMnB4fS51aS1pY29uLWZsYWd7YmFja2dyb3VuZC1wb3NpdGlvbjotMTZweCAtMTEycHh9LnVpLWljb24tY2FsZW5kYXJ7YmFja2dyb3VuZC1wb3NpdGlvbjotMzJweCAtMTEycHh9LnVpLWljb24tY2FydHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi00OHB4IC0xMTJweH0udWktaWNvbi1wZW5jaWx7YmFja2dyb3VuZC1wb3NpdGlvbjotNjRweCAtMTEycHh9LnVpLWljb24tY2xvY2t7YmFja2dyb3VuZC1wb3NpdGlvbjotODBweCAtMTEycHh9LnVpLWljb24tZGlza3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi05NnB4IC0xMTJweH0udWktaWNvbi1jYWxjdWxhdG9ye2JhY2tncm91bmQtcG9zaXRpb246LTExMnB4IC0xMTJweH0udWktaWNvbi16b29taW57YmFja2dyb3VuZC1wb3NpdGlvbjotMTI4cHggLTExMnB4fS51aS1pY29uLXpvb21vdXR7YmFja2dyb3VuZC1wb3NpdGlvbjotMTQ0cHggLTExMnB4fS51aS1pY29uLXNlYXJjaHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNjBweCAtMTEycHh9LnVpLWljb24td3JlbmNoe2JhY2tncm91bmQtcG9zaXRpb246LTE3NnB4IC0xMTJweH0udWktaWNvbi1nZWFye2JhY2tncm91bmQtcG9zaXRpb246LTE5MnB4IC0xMTJweH0udWktaWNvbi1oZWFydHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yMDhweCAtMTEycHh9LnVpLWljb24tc3RhcntiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yMjRweCAtMTEycHh9LnVpLWljb24tbGlua3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yNDBweCAtMTEycHh9LnVpLWljb24tY2FuY2Vse2JhY2tncm91bmQtcG9zaXRpb246MCAtMTI4cHh9LnVpLWljb24tcGx1c3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNnB4IC0xMjhweH0udWktaWNvbi1wbHVzdGhpY2t7YmFja2dyb3VuZC1wb3NpdGlvbjotMzJweCAtMTI4cHh9LnVpLWljb24tbWludXN7YmFja2dyb3VuZC1wb3NpdGlvbjotNDhweCAtMTI4cHh9LnVpLWljb24tbWludXN0aGlja3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi02NHB4IC0xMjhweH0udWktaWNvbi1jbG9zZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi04MHB4IC0xMjhweH0udWktaWNvbi1jbG9zZXRoaWNre2JhY2tncm91bmQtcG9zaXRpb246LTk2cHggLTEyOHB4fS51aS1pY29uLWtleXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMTJweCAtMTI4cHh9LnVpLWljb24tbGlnaHRidWxie2JhY2tncm91bmQtcG9zaXRpb246LTEyOHB4IC0xMjhweH0udWktaWNvbi1zY2lzc29yc3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNDRweCAtMTI4cHh9LnVpLWljb24tY2xpcGJvYXJke2JhY2tncm91bmQtcG9zaXRpb246LTE2MHB4IC0xMjhweH0udWktaWNvbi1jb3B5e2JhY2tncm91bmQtcG9zaXRpb246LTE3NnB4IC0xMjhweH0udWktaWNvbi1jb250YWN0e2JhY2tncm91bmQtcG9zaXRpb246LTE5MnB4IC0xMjhweH0udWktaWNvbi1pbWFnZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yMDhweCAtMTI4cHh9LnVpLWljb24tdmlkZW97YmFja2dyb3VuZC1wb3NpdGlvbjotMjI0cHggLTEyOHB4fS51aS1pY29uLXNjcmlwdHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yNDBweCAtMTI4cHh9LnVpLWljb24tYWxlcnR7YmFja2dyb3VuZC1wb3NpdGlvbjowIC0xNDRweH0udWktaWNvbi1pbmZve2JhY2tncm91bmQtcG9zaXRpb246LTE2cHggLTE0NHB4fS51aS1pY29uLW5vdGljZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zMnB4IC0xNDRweH0udWktaWNvbi1oZWxwe2JhY2tncm91bmQtcG9zaXRpb246LTQ4cHggLTE0NHB4fS51aS1pY29uLWNoZWNre2JhY2tncm91bmQtcG9zaXRpb246LTY0cHggLTE0NHB4fS51aS1pY29uLWJ1bGxldHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi04MHB4IC0xNDRweH0udWktaWNvbi1yYWRpby1vbntiYWNrZ3JvdW5kLXBvc2l0aW9uOi05NnB4IC0xNDRweH0udWktaWNvbi1yYWRpby1vZmZ7YmFja2dyb3VuZC1wb3NpdGlvbjotMTEycHggLTE0NHB4fS51aS1pY29uLXBpbi13e2JhY2tncm91bmQtcG9zaXRpb246LTEyOHB4IC0xNDRweH0udWktaWNvbi1waW4tc3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNDRweCAtMTQ0cHh9LnVpLWljb24tcGxheXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTE2MHB4fS51aS1pY29uLXBhdXNle2JhY2tncm91bmQtcG9zaXRpb246LTE2cHggLTE2MHB4fS51aS1pY29uLXNlZWstbmV4dHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zMnB4IC0xNjBweH0udWktaWNvbi1zZWVrLXByZXZ7YmFja2dyb3VuZC1wb3NpdGlvbjotNDhweCAtMTYwcHh9LnVpLWljb24tc2Vlay1lbmR7YmFja2dyb3VuZC1wb3NpdGlvbjotNjRweCAtMTYwcHh9LnVpLWljb24tc2Vlay1zdGFydHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi04MHB4IC0xNjBweH0udWktaWNvbi1zZWVrLWZpcnN0e2JhY2tncm91bmQtcG9zaXRpb246LTgwcHggLTE2MHB4fS51aS1pY29uLXN0b3B7YmFja2dyb3VuZC1wb3NpdGlvbjotOTZweCAtMTYwcHh9LnVpLWljb24tZWplY3R7YmFja2dyb3VuZC1wb3NpdGlvbjotMTEycHggLTE2MHB4fS51aS1pY29uLXZvbHVtZS1vZmZ7YmFja2dyb3VuZC1wb3NpdGlvbjotMTI4cHggLTE2MHB4fS51aS1pY29uLXZvbHVtZS1vbntiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNDRweCAtMTYwcHh9LnVpLWljb24tcG93ZXJ7YmFja2dyb3VuZC1wb3NpdGlvbjowIC0xNzZweH0udWktaWNvbi1zaWduYWwtZGlhZ3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNnB4IC0xNzZweH0udWktaWNvbi1zaWduYWx7YmFja2dyb3VuZC1wb3NpdGlvbjotMzJweCAtMTc2cHh9LnVpLWljb24tYmF0dGVyeS0we2JhY2tncm91bmQtcG9zaXRpb246LTQ4cHggLTE3NnB4fS51aS1pY29uLWJhdHRlcnktMXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi02NHB4IC0xNzZweH0udWktaWNvbi1iYXR0ZXJ5LTJ7YmFja2dyb3VuZC1wb3NpdGlvbjotODBweCAtMTc2cHh9LnVpLWljb24tYmF0dGVyeS0ze2JhY2tncm91bmQtcG9zaXRpb246LTk2cHggLTE3NnB4fS51aS1pY29uLWNpcmNsZS1wbHVze2JhY2tncm91bmQtcG9zaXRpb246MCAtMTkycHh9LnVpLWljb24tY2lyY2xlLW1pbnVze2JhY2tncm91bmQtcG9zaXRpb246LTE2cHggLTE5MnB4fS51aS1pY29uLWNpcmNsZS1jbG9zZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zMnB4IC0xOTJweH0udWktaWNvbi1jaXJjbGUtdHJpYW5nbGUtZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi00OHB4IC0xOTJweH0udWktaWNvbi1jaXJjbGUtdHJpYW5nbGUtc3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi02NHB4IC0xOTJweH0udWktaWNvbi1jaXJjbGUtdHJpYW5nbGUtd3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi04MHB4IC0xOTJweH0udWktaWNvbi1jaXJjbGUtdHJpYW5nbGUtbntiYWNrZ3JvdW5kLXBvc2l0aW9uOi05NnB4IC0xOTJweH0udWktaWNvbi1jaXJjbGUtYXJyb3ctZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMTJweCAtMTkycHh9LnVpLWljb24tY2lyY2xlLWFycm93LXN7YmFja2dyb3VuZC1wb3NpdGlvbjotMTI4cHggLTE5MnB4fS51aS1pY29uLWNpcmNsZS1hcnJvdy13e2JhY2tncm91bmQtcG9zaXRpb246LTE0NHB4IC0xOTJweH0udWktaWNvbi1jaXJjbGUtYXJyb3ctbntiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNjBweCAtMTkycHh9LnVpLWljb24tY2lyY2xlLXpvb21pbntiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNzZweCAtMTkycHh9LnVpLWljb24tY2lyY2xlLXpvb21vdXR7YmFja2dyb3VuZC1wb3NpdGlvbjotMTkycHggLTE5MnB4fS51aS1pY29uLWNpcmNsZS1jaGVja3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yMDhweCAtMTkycHh9LnVpLWljb24tY2lyY2xlc21hbGwtcGx1c3tiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTIwOHB4fS51aS1pY29uLWNpcmNsZXNtYWxsLW1pbnVze2JhY2tncm91bmQtcG9zaXRpb246LTE2cHggLTIwOHB4fS51aS1pY29uLWNpcmNsZXNtYWxsLWNsb3Nle2JhY2tncm91bmQtcG9zaXRpb246LTMycHggLTIwOHB4fS51aS1pY29uLXNxdWFyZXNtYWxsLXBsdXN7YmFja2dyb3VuZC1wb3NpdGlvbjotNDhweCAtMjA4cHh9LnVpLWljb24tc3F1YXJlc21hbGwtbWludXN7YmFja2dyb3VuZC1wb3NpdGlvbjotNjRweCAtMjA4cHh9LnVpLWljb24tc3F1YXJlc21hbGwtY2xvc2V7YmFja2dyb3VuZC1wb3NpdGlvbjotODBweCAtMjA4cHh9LnVpLWljb24tZ3JpcC1kb3R0ZWQtdmVydGljYWx7YmFja2dyb3VuZC1wb3NpdGlvbjowIC0yMjRweH0udWktaWNvbi1ncmlwLWRvdHRlZC1ob3Jpem9udGFse2JhY2tncm91bmQtcG9zaXRpb246LTE2cHggLTIyNHB4fS51aS1pY29uLWdyaXAtc29saWQtdmVydGljYWx7YmFja2dyb3VuZC1wb3NpdGlvbjotMzJweCAtMjI0cHh9LnVpLWljb24tZ3JpcC1zb2xpZC1ob3Jpem9udGFse2JhY2tncm91bmQtcG9zaXRpb246LTQ4cHggLTIyNHB4fS51aS1pY29uLWdyaXBzbWFsbC1kaWFnb25hbC1zZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi02NHB4IC0yMjRweH0udWktaWNvbi1ncmlwLWRpYWdvbmFsLXNle2JhY2tncm91bmQtcG9zaXRpb246LTgwcHggLTIyNHB4fS51aS1jb3JuZXItYWxsLC51aS1jb3JuZXItdG9wLC51aS1jb3JuZXItbGVmdCwudWktY29ybmVyLXRse2JvcmRlci10b3AtbGVmdC1yYWRpdXM6NHB4fS51aS1jb3JuZXItYWxsLC51aS1jb3JuZXItdG9wLC51aS1jb3JuZXItcmlnaHQsLnVpLWNvcm5lci10cntib3JkZXItdG9wLXJpZ2h0LXJhZGl1czo0cHh9LnVpLWNvcm5lci1hbGwsLnVpLWNvcm5lci1ib3R0b20sLnVpLWNvcm5lci1sZWZ0LC51aS1jb3JuZXItYmx7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czo0cHh9LnVpLWNvcm5lci1hbGwsLnVpLWNvcm5lci1ib3R0b20sLnVpLWNvcm5lci1yaWdodCwudWktY29ybmVyLWJye2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOjRweH0udWktd2lkZ2V0LW92ZXJsYXl7YmFja2dyb3VuZDojNjY2IHVybCgiaW1hZ2VzL3VpLWJnX2RpYWdvbmFscy10aGlja18yMF82NjY2NjZfNDB4NDAucG5nIikgNTAlIDUwJSByZXBlYXQ7b3BhY2l0eTouNTtmaWx0ZXI6QWxwaGEoT3BhY2l0eT01MCl9LnVpLXdpZGdldC1zaGFkb3d7bWFyZ2luOi01cHggMCAwIC01cHg7cGFkZGluZzo1cHg7YmFja2dyb3VuZDojMDAwIHVybCgiaW1hZ2VzL3VpLWJnX2ZsYXRfMTBfMDAwMDAwXzQweDEwMC5wbmciKSA1MCUgNTAlIHJlcGVhdC14O29wYWNpdHk6LjI7ZmlsdGVyOkFscGhhKE9wYWNpdHk9MjApO2JvcmRlci1yYWRpdXM6NXB4fQ==]]></data>
	</file>
	<file>
	  <filename>/lib/ui.lib/jquery-ui.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohIGpRdWVyeSBVSSAtIHYxLjExLjQgLSAyMDE1LTAzLTExCiogaHR0cDovL2pxdWVyeXVpLmNvbQoqIEluY2x1ZGVzOiBjb3JlLmpzLCB3aWRnZXQuanMsIG1vdXNlLmpzLCBwb3NpdGlvbi5qcywgYWNjb3JkaW9uLmpzLCBhdXRvY29tcGxldGUuanMsIGJ1dHRvbi5qcywgZGF0ZXBpY2tlci5qcywgZGlhbG9nLmpzLCBkcmFnZ2FibGUuanMsIGRyb3BwYWJsZS5qcywgZWZmZWN0LmpzLCBlZmZlY3QtYmxpbmQuanMsIGVmZmVjdC1ib3VuY2UuanMsIGVmZmVjdC1jbGlwLmpzLCBlZmZlY3QtZHJvcC5qcywgZWZmZWN0LWV4cGxvZGUuanMsIGVmZmVjdC1mYWRlLmpzLCBlZmZlY3QtZm9sZC5qcywgZWZmZWN0LWhpZ2hsaWdodC5qcywgZWZmZWN0LXB1ZmYuanMsIGVmZmVjdC1wdWxzYXRlLmpzLCBlZmZlY3Qtc2NhbGUuanMsIGVmZmVjdC1zaGFrZS5qcywgZWZmZWN0LXNpemUuanMsIGVmZmVjdC1zbGlkZS5qcywgZWZmZWN0LXRyYW5zZmVyLmpzLCBtZW51LmpzLCBwcm9ncmVzc2Jhci5qcywgcmVzaXphYmxlLmpzLCBzZWxlY3RhYmxlLmpzLCBzZWxlY3RtZW51LmpzLCBzbGlkZXIuanMsIHNvcnRhYmxlLmpzLCBzcGlubmVyLmpzLCB0YWJzLmpzLCB0b29sdGlwLmpzCiogQ29weXJpZ2h0IDIwMTUgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9yczsgTGljZW5zZWQgTUlUICovCgooZnVuY3Rpb24oZSl7ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoWyJqcXVlcnkiXSxlKTplKGpRdWVyeSl9KShmdW5jdGlvbihlKXtmdW5jdGlvbiB0KHQscyl7dmFyIG4sYSxvLHI9dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiJhcmVhIj09PXI/KG49dC5wYXJlbnROb2RlLGE9bi5uYW1lLHQuaHJlZiYmYSYmIm1hcCI9PT1uLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk/KG89ZSgiaW1nW3VzZW1hcD0nIyIrYSsiJ10iKVswXSwhIW8mJmkobykpOiExKTooL14oaW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbnxvYmplY3QpJC8udGVzdChyKT8hdC5kaXNhYmxlZDoiYSI9PT1yP3QuaHJlZnx8czpzKSYmaSh0KX1mdW5jdGlvbiBpKHQpe3JldHVybiBlLmV4cHIuZmlsdGVycy52aXNpYmxlKHQpJiYhZSh0KS5wYXJlbnRzKCkuYWRkQmFjaygpLmZpbHRlcihmdW5jdGlvbigpe3JldHVybiJoaWRkZW4iPT09ZS5jc3ModGhpcywidmlzaWJpbGl0eSIpfSkubGVuZ3RofWZ1bmN0aW9uIHMoZSl7Zm9yKHZhciB0LGk7ZS5sZW5ndGgmJmVbMF0hPT1kb2N1bWVudDspe2lmKHQ9ZS5jc3MoInBvc2l0aW9uIiksKCJhYnNvbHV0ZSI9PT10fHwicmVsYXRpdmUiPT09dHx8ImZpeGVkIj09PXQpJiYoaT1wYXJzZUludChlLmNzcygiekluZGV4IiksMTApLCFpc05hTihpKSYmMCE9PWkpKXJldHVybiBpO2U9ZS5wYXJlbnQoKX1yZXR1cm4gMH1mdW5jdGlvbiBuKCl7dGhpcy5fY3VySW5zdD1udWxsLHRoaXMuX2tleUV2ZW50PSExLHRoaXMuX2Rpc2FibGVkSW5wdXRzPVtdLHRoaXMuX2RhdGVwaWNrZXJTaG93aW5nPSExLHRoaXMuX2luRGlhbG9nPSExLHRoaXMuX21haW5EaXZJZD0idWktZGF0ZXBpY2tlci1kaXYiLHRoaXMuX2lubGluZUNsYXNzPSJ1aS1kYXRlcGlja2VyLWlubGluZSIsdGhpcy5fYXBwZW5kQ2xhc3M9InVpLWRhdGVwaWNrZXItYXBwZW5kIix0aGlzLl90cmlnZ2VyQ2xhc3M9InVpLWRhdGVwaWNrZXItdHJpZ2dlciIsdGhpcy5fZGlhbG9nQ2xhc3M9InVpLWRhdGVwaWNrZXItZGlhbG9nIix0aGlzLl9kaXNhYmxlQ2xhc3M9InVpLWRhdGVwaWNrZXItZGlzYWJsZWQiLHRoaXMuX3Vuc2VsZWN0YWJsZUNsYXNzPSJ1aS1kYXRlcGlja2VyLXVuc2VsZWN0YWJsZSIsdGhpcy5fY3VycmVudENsYXNzPSJ1aS1kYXRlcGlja2VyLWN1cnJlbnQtZGF5Iix0aGlzLl9kYXlPdmVyQ2xhc3M9InVpLWRhdGVwaWNrZXItZGF5cy1jZWxsLW92ZXIiLHRoaXMucmVnaW9uYWw9W10sdGhpcy5yZWdpb25hbFsiIl09e2Nsb3NlVGV4dDoiRG9uZSIscHJldlRleHQ6IlByZXYiLG5leHRUZXh0OiJOZXh0IixjdXJyZW50VGV4dDoiVG9kYXkiLG1vbnRoTmFtZXM6WyJKYW51YXJ5IiwiRmVicnVhcnkiLCJNYXJjaCIsIkFwcmlsIiwiTWF5IiwiSnVuZSIsIkp1bHkiLCJBdWd1c3QiLCJTZXB0ZW1iZXIiLCJPY3RvYmVyIiwiTm92ZW1iZXIiLCJEZWNlbWJlciJdLG1vbnRoTmFtZXNTaG9ydDpbIkphbiIsIkZlYiIsIk1hciIsIkFwciIsIk1heSIsIkp1biIsIkp1bCIsIkF1ZyIsIlNlcCIsIk9jdCIsIk5vdiIsIkRlYyJdLGRheU5hbWVzOlsiU3VuZGF5IiwiTW9uZGF5IiwiVHVlc2RheSIsIldlZG5lc2RheSIsIlRodXJzZGF5IiwiRnJpZGF5IiwiU2F0dXJkYXkiXSxkYXlOYW1lc1Nob3J0OlsiU3VuIiwiTW9uIiwiVHVlIiwiV2VkIiwiVGh1IiwiRnJpIiwiU2F0Il0sZGF5TmFtZXNNaW46WyJTdSIsIk1vIiwiVHUiLCJXZSIsIlRoIiwiRnIiLCJTYSJdLHdlZWtIZWFkZXI6IldrIixkYXRlRm9ybWF0OiJtbS9kZC95eSIsZmlyc3REYXk6MCxpc1JUTDohMSxzaG93TW9udGhBZnRlclllYXI6ITEseWVhclN1ZmZpeDoiIn0sdGhpcy5fZGVmYXVsdHM9e3Nob3dPbjoiZm9jdXMiLHNob3dBbmltOiJmYWRlSW4iLHNob3dPcHRpb25zOnt9LGRlZmF1bHREYXRlOm51bGwsYXBwZW5kVGV4dDoiIixidXR0b25UZXh0OiIuLi4iLGJ1dHRvbkltYWdlOiIiLGJ1dHRvbkltYWdlT25seTohMSxoaWRlSWZOb1ByZXZOZXh0OiExLG5hdmlnYXRpb25Bc0RhdGVGb3JtYXQ6ITEsZ290b0N1cnJlbnQ6ITEsY2hhbmdlTW9udGg6ITEsY2hhbmdlWWVhcjohMSx5ZWFyUmFuZ2U6ImMtMTA6YysxMCIsc2hvd090aGVyTW9udGhzOiExLHNlbGVjdE90aGVyTW9udGhzOiExLHNob3dXZWVrOiExLGNhbGN1bGF0ZVdlZWs6dGhpcy5pc284NjAxV2VlayxzaG9ydFllYXJDdXRvZmY6IisxMCIsbWluRGF0ZTpudWxsLG1heERhdGU6bnVsbCxkdXJhdGlvbjoiZmFzdCIsYmVmb3JlU2hvd0RheTpudWxsLGJlZm9yZVNob3c6bnVsbCxvblNlbGVjdDpudWxsLG9uQ2hhbmdlTW9udGhZZWFyOm51bGwsb25DbG9zZTpudWxsLG51bWJlck9mTW9udGhzOjEsc2hvd0N1cnJlbnRBdFBvczowLHN0ZXBNb250aHM6MSxzdGVwQmlnTW9udGhzOjEyLGFsdEZpZWxkOiIiLGFsdEZvcm1hdDoiIixjb25zdHJhaW5JbnB1dDohMCxzaG93QnV0dG9uUGFuZWw6ITEsYXV0b1NpemU6ITEsZGlzYWJsZWQ6ITF9LGUuZXh0ZW5kKHRoaXMuX2RlZmF1bHRzLHRoaXMucmVnaW9uYWxbIiJdKSx0aGlzLnJlZ2lvbmFsLmVuPWUuZXh0ZW5kKCEwLHt9LHRoaXMucmVnaW9uYWxbIiJdKSx0aGlzLnJlZ2lvbmFsWyJlbi1VUyJdPWUuZXh0ZW5kKCEwLHt9LHRoaXMucmVnaW9uYWwuZW4pLHRoaXMuZHBEaXY9YShlKCI8ZGl2IGlkPSciK3RoaXMuX21haW5EaXZJZCsiJyBjbGFzcz0ndWktZGF0ZXBpY2tlciB1aS13aWRnZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktaGVscGVyLWNsZWFyZml4IHVpLWNvcm5lci1hbGwnPjwvZGl2PiIpKX1mdW5jdGlvbiBhKHQpe3ZhciBpPSJidXR0b24sIC51aS1kYXRlcGlja2VyLXByZXYsIC51aS1kYXRlcGlja2VyLW5leHQsIC51aS1kYXRlcGlja2VyLWNhbGVuZGFyIHRkIGEiO3JldHVybiB0LmRlbGVnYXRlKGksIm1vdXNlb3V0IixmdW5jdGlvbigpe2UodGhpcykucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWhvdmVyIiksLTEhPT10aGlzLmNsYXNzTmFtZS5pbmRleE9mKCJ1aS1kYXRlcGlja2VyLXByZXYiKSYmZSh0aGlzKS5yZW1vdmVDbGFzcygidWktZGF0ZXBpY2tlci1wcmV2LWhvdmVyIiksLTEhPT10aGlzLmNsYXNzTmFtZS5pbmRleE9mKCJ1aS1kYXRlcGlja2VyLW5leHQiKSYmZSh0aGlzKS5yZW1vdmVDbGFzcygidWktZGF0ZXBpY2tlci1uZXh0LWhvdmVyIil9KS5kZWxlZ2F0ZShpLCJtb3VzZW92ZXIiLG8pfWZ1bmN0aW9uIG8oKXtlLmRhdGVwaWNrZXIuX2lzRGlzYWJsZWREYXRlcGlja2VyKHYuaW5saW5lP3YuZHBEaXYucGFyZW50KClbMF06di5pbnB1dFswXSl8fChlKHRoaXMpLnBhcmVudHMoIi51aS1kYXRlcGlja2VyLWNhbGVuZGFyIikuZmluZCgiYSIpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1ob3ZlciIpLGUodGhpcykuYWRkQ2xhc3MoInVpLXN0YXRlLWhvdmVyIiksLTEhPT10aGlzLmNsYXNzTmFtZS5pbmRleE9mKCJ1aS1kYXRlcGlja2VyLXByZXYiKSYmZSh0aGlzKS5hZGRDbGFzcygidWktZGF0ZXBpY2tlci1wcmV2LWhvdmVyIiksLTEhPT10aGlzLmNsYXNzTmFtZS5pbmRleE9mKCJ1aS1kYXRlcGlja2VyLW5leHQiKSYmZSh0aGlzKS5hZGRDbGFzcygidWktZGF0ZXBpY2tlci1uZXh0LWhvdmVyIikpfWZ1bmN0aW9uIHIodCxpKXtlLmV4dGVuZCh0LGkpO2Zvcih2YXIgcyBpbiBpKW51bGw9PWlbc10mJih0W3NdPWlbc10pO3JldHVybiB0fWZ1bmN0aW9uIGgoZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5lbGVtZW50LnZhbCgpO2UuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMuX3JlZnJlc2goKSx0IT09dGhpcy5lbGVtZW50LnZhbCgpJiZ0aGlzLl90cmlnZ2VyKCJjaGFuZ2UiKX19ZS51aT1lLnVpfHx7fSxlLmV4dGVuZChlLnVpLHt2ZXJzaW9uOiIxLjExLjQiLGtleUNvZGU6e0JBQ0tTUEFDRTo4LENPTU1BOjE4OCxERUxFVEU6NDYsRE9XTjo0MCxFTkQ6MzUsRU5URVI6MTMsRVNDQVBFOjI3LEhPTUU6MzYsTEVGVDozNyxQQUdFX0RPV046MzQsUEFHRV9VUDozMyxQRVJJT0Q6MTkwLFJJR0hUOjM5LFNQQUNFOjMyLFRBQjo5LFVQOjM4fX0pLGUuZm4uZXh0ZW5kKHtzY3JvbGxQYXJlbnQ6ZnVuY3Rpb24odCl7dmFyIGk9dGhpcy5jc3MoInBvc2l0aW9uIikscz0iYWJzb2x1dGUiPT09aSxuPXQ/LyhhdXRvfHNjcm9sbHxoaWRkZW4pLzovKGF1dG98c2Nyb2xsKS8sYT10aGlzLnBhcmVudHMoKS5maWx0ZXIoZnVuY3Rpb24oKXt2YXIgdD1lKHRoaXMpO3JldHVybiBzJiYic3RhdGljIj09PXQuY3NzKCJwb3NpdGlvbiIpPyExOm4udGVzdCh0LmNzcygib3ZlcmZsb3ciKSt0LmNzcygib3ZlcmZsb3cteSIpK3QuY3NzKCJvdmVyZmxvdy14IikpfSkuZXEoMCk7cmV0dXJuImZpeGVkIiE9PWkmJmEubGVuZ3RoP2E6ZSh0aGlzWzBdLm93bmVyRG9jdW1lbnR8fGRvY3VtZW50KX0sdW5pcXVlSWQ6ZnVuY3Rpb24oKXt2YXIgZT0wO3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt0aGlzLmlkfHwodGhpcy5pZD0idWktaWQtIisgKytlKX0pfX0oKSxyZW1vdmVVbmlxdWVJZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXsvXnVpLWlkLVxkKyQvLnRlc3QodGhpcy5pZCkmJmUodGhpcykucmVtb3ZlQXR0cigiaWQiKX0pfX0pLGUuZXh0ZW5kKGUuZXhwclsiOiJdLHtkYXRhOmUuZXhwci5jcmVhdGVQc2V1ZG8/ZS5leHByLmNyZWF0ZVBzZXVkbyhmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oaSl7cmV0dXJuISFlLmRhdGEoaSx0KX19KTpmdW5jdGlvbih0LGkscyl7cmV0dXJuISFlLmRhdGEodCxzWzNdKX0sZm9jdXNhYmxlOmZ1bmN0aW9uKGkpe3JldHVybiB0KGksIWlzTmFOKGUuYXR0cihpLCJ0YWJpbmRleCIpKSl9LHRhYmJhYmxlOmZ1bmN0aW9uKGkpe3ZhciBzPWUuYXR0cihpLCJ0YWJpbmRleCIpLG49aXNOYU4ocyk7cmV0dXJuKG58fHM+PTApJiZ0KGksIW4pfX0pLGUoIjxhPiIpLm91dGVyV2lkdGgoMSkuanF1ZXJ5fHxlLmVhY2goWyJXaWR0aCIsIkhlaWdodCJdLGZ1bmN0aW9uKHQsaSl7ZnVuY3Rpb24gcyh0LGkscyxhKXtyZXR1cm4gZS5lYWNoKG4sZnVuY3Rpb24oKXtpLT1wYXJzZUZsb2F0KGUuY3NzKHQsInBhZGRpbmciK3RoaXMpKXx8MCxzJiYoaS09cGFyc2VGbG9hdChlLmNzcyh0LCJib3JkZXIiK3RoaXMrIldpZHRoIikpfHwwKSxhJiYoaS09cGFyc2VGbG9hdChlLmNzcyh0LCJtYXJnaW4iK3RoaXMpKXx8MCl9KSxpfXZhciBuPSJXaWR0aCI9PT1pP1siTGVmdCIsIlJpZ2h0Il06WyJUb3AiLCJCb3R0b20iXSxhPWkudG9Mb3dlckNhc2UoKSxvPXtpbm5lcldpZHRoOmUuZm4uaW5uZXJXaWR0aCxpbm5lckhlaWdodDplLmZuLmlubmVySGVpZ2h0LG91dGVyV2lkdGg6ZS5mbi5vdXRlcldpZHRoLG91dGVySGVpZ2h0OmUuZm4ub3V0ZXJIZWlnaHR9O2UuZm5bImlubmVyIitpXT1mdW5jdGlvbih0KXtyZXR1cm4gdm9pZCAwPT09dD9vWyJpbm5lciIraV0uY2FsbCh0aGlzKTp0aGlzLmVhY2goZnVuY3Rpb24oKXtlKHRoaXMpLmNzcyhhLHModGhpcyx0KSsicHgiKX0pfSxlLmZuWyJvdXRlciIraV09ZnVuY3Rpb24odCxuKXtyZXR1cm4ibnVtYmVyIiE9dHlwZW9mIHQ/b1sib3V0ZXIiK2ldLmNhbGwodGhpcyx0KTp0aGlzLmVhY2goZnVuY3Rpb24oKXtlKHRoaXMpLmNzcyhhLHModGhpcyx0LCEwLG4pKyJweCIpfSl9fSksZS5mbi5hZGRCYWNrfHwoZS5mbi5hZGRCYWNrPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmFkZChudWxsPT1lP3RoaXMucHJldk9iamVjdDp0aGlzLnByZXZPYmplY3QuZmlsdGVyKGUpKX0pLGUoIjxhPiIpLmRhdGEoImEtYiIsImEiKS5yZW1vdmVEYXRhKCJhLWIiKS5kYXRhKCJhLWIiKSYmKGUuZm4ucmVtb3ZlRGF0YT1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oaSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dC5jYWxsKHRoaXMsZS5jYW1lbENhc2UoaSkpOnQuY2FsbCh0aGlzKX19KGUuZm4ucmVtb3ZlRGF0YSkpLGUudWkuaWU9ISEvbXNpZSBbXHcuXSsvLmV4ZWMobmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpKSxlLmZuLmV4dGVuZCh7Zm9jdXM6ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGkscyl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiBpP3RoaXMuZWFjaChmdW5jdGlvbigpe3ZhciB0PXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2UodCkuZm9jdXMoKSxzJiZzLmNhbGwodCl9LGkpfSk6dC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fShlLmZuLmZvY3VzKSxkaXNhYmxlU2VsZWN0aW9uOmZ1bmN0aW9uKCl7dmFyIGU9Im9uc2VsZWN0c3RhcnQiaW4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik/InNlbGVjdHN0YXJ0IjoibW91c2Vkb3duIjtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iaW5kKGUrIi51aS1kaXNhYmxlU2VsZWN0aW9uIixmdW5jdGlvbihlKXtlLnByZXZlbnREZWZhdWx0KCl9KX19KCksZW5hYmxlU2VsZWN0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudW5iaW5kKCIudWktZGlzYWJsZVNlbGVjdGlvbiIpfSx6SW5kZXg6ZnVuY3Rpb24odCl7aWYodm9pZCAwIT09dClyZXR1cm4gdGhpcy5jc3MoInpJbmRleCIsdCk7aWYodGhpcy5sZW5ndGgpZm9yKHZhciBpLHMsbj1lKHRoaXNbMF0pO24ubGVuZ3RoJiZuWzBdIT09ZG9jdW1lbnQ7KXtpZihpPW4uY3NzKCJwb3NpdGlvbiIpLCgiYWJzb2x1dGUiPT09aXx8InJlbGF0aXZlIj09PWl8fCJmaXhlZCI9PT1pKSYmKHM9cGFyc2VJbnQobi5jc3MoInpJbmRleCIpLDEwKSwhaXNOYU4ocykmJjAhPT1zKSlyZXR1cm4gcztuPW4ucGFyZW50KCl9cmV0dXJuIDB9fSksZS51aS5wbHVnaW49e2FkZDpmdW5jdGlvbih0LGkscyl7dmFyIG4sYT1lLnVpW3RdLnByb3RvdHlwZTtmb3IobiBpbiBzKWEucGx1Z2luc1tuXT1hLnBsdWdpbnNbbl18fFtdLGEucGx1Z2luc1tuXS5wdXNoKFtpLHNbbl1dKX0sY2FsbDpmdW5jdGlvbihlLHQsaSxzKXt2YXIgbixhPWUucGx1Z2luc1t0XTtpZihhJiYoc3x8ZS5lbGVtZW50WzBdLnBhcmVudE5vZGUmJjExIT09ZS5lbGVtZW50WzBdLnBhcmVudE5vZGUubm9kZVR5cGUpKWZvcihuPTA7YS5sZW5ndGg+bjtuKyspZS5vcHRpb25zW2Fbbl1bMF1dJiZhW25dWzFdLmFwcGx5KGUuZWxlbWVudCxpKX19O3ZhciBsPTAsdT1BcnJheS5wcm90b3R5cGUuc2xpY2U7ZS5jbGVhbkRhdGE9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGkpe3ZhciBzLG4sYTtmb3IoYT0wO251bGwhPShuPWlbYV0pO2ErKyl0cnl7cz1lLl9kYXRhKG4sImV2ZW50cyIpLHMmJnMucmVtb3ZlJiZlKG4pLnRyaWdnZXJIYW5kbGVyKCJyZW1vdmUiKX1jYXRjaChvKXt9dChpKX19KGUuY2xlYW5EYXRhKSxlLndpZGdldD1mdW5jdGlvbih0LGkscyl7dmFyIG4sYSxvLHIsaD17fSxsPXQuc3BsaXQoIi4iKVswXTtyZXR1cm4gdD10LnNwbGl0KCIuIilbMV0sbj1sKyItIit0LHN8fChzPWksaT1lLldpZGdldCksZS5leHByWyI6Il1bbi50b0xvd2VyQ2FzZSgpXT1mdW5jdGlvbih0KXtyZXR1cm4hIWUuZGF0YSh0LG4pfSxlW2xdPWVbbF18fHt9LGE9ZVtsXVt0XSxvPWVbbF1bdF09ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5fY3JlYXRlV2lkZ2V0Pyhhcmd1bWVudHMubGVuZ3RoJiZ0aGlzLl9jcmVhdGVXaWRnZXQoZSx0KSx2b2lkIDApOm5ldyBvKGUsdCl9LGUuZXh0ZW5kKG8sYSx7dmVyc2lvbjpzLnZlcnNpb24sX3Byb3RvOmUuZXh0ZW5kKHt9LHMpLF9jaGlsZENvbnN0cnVjdG9yczpbXX0pLHI9bmV3IGksci5vcHRpb25zPWUud2lkZ2V0LmV4dGVuZCh7fSxyLm9wdGlvbnMpLGUuZWFjaChzLGZ1bmN0aW9uKHQscyl7cmV0dXJuIGUuaXNGdW5jdGlvbihzKT8oaFt0XT1mdW5jdGlvbigpe3ZhciBlPWZ1bmN0aW9uKCl7cmV0dXJuIGkucHJvdG90eXBlW3RdLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sbj1mdW5jdGlvbihlKXtyZXR1cm4gaS5wcm90b3R5cGVbdF0uYXBwbHkodGhpcyxlKX07cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHQsaT10aGlzLl9zdXBlcixhPXRoaXMuX3N1cGVyQXBwbHk7cmV0dXJuIHRoaXMuX3N1cGVyPWUsdGhpcy5fc3VwZXJBcHBseT1uLHQ9cy5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5fc3VwZXI9aSx0aGlzLl9zdXBlckFwcGx5PWEsdH19KCksdm9pZCAwKTooaFt0XT1zLHZvaWQgMCl9KSxvLnByb3RvdHlwZT1lLndpZGdldC5leHRlbmQocix7d2lkZ2V0RXZlbnRQcmVmaXg6YT9yLndpZGdldEV2ZW50UHJlZml4fHx0OnR9LGgse2NvbnN0cnVjdG9yOm8sbmFtZXNwYWNlOmwsd2lkZ2V0TmFtZTp0LHdpZGdldEZ1bGxOYW1lOm59KSxhPyhlLmVhY2goYS5fY2hpbGRDb25zdHJ1Y3RvcnMsZnVuY3Rpb24odCxpKXt2YXIgcz1pLnByb3RvdHlwZTtlLndpZGdldChzLm5hbWVzcGFjZSsiLiIrcy53aWRnZXROYW1lLG8saS5fcHJvdG8pfSksZGVsZXRlIGEuX2NoaWxkQ29uc3RydWN0b3JzKTppLl9jaGlsZENvbnN0cnVjdG9ycy5wdXNoKG8pLGUud2lkZ2V0LmJyaWRnZSh0LG8pLG99LGUud2lkZ2V0LmV4dGVuZD1mdW5jdGlvbih0KXtmb3IodmFyIGkscyxuPXUuY2FsbChhcmd1bWVudHMsMSksYT0wLG89bi5sZW5ndGg7bz5hO2ErKylmb3IoaSBpbiBuW2FdKXM9blthXVtpXSxuW2FdLmhhc093blByb3BlcnR5KGkpJiZ2b2lkIDAhPT1zJiYodFtpXT1lLmlzUGxhaW5PYmplY3Qocyk/ZS5pc1BsYWluT2JqZWN0KHRbaV0pP2Uud2lkZ2V0LmV4dGVuZCh7fSx0W2ldLHMpOmUud2lkZ2V0LmV4dGVuZCh7fSxzKTpzKTtyZXR1cm4gdH0sZS53aWRnZXQuYnJpZGdlPWZ1bmN0aW9uKHQsaSl7dmFyIHM9aS5wcm90b3R5cGUud2lkZ2V0RnVsbE5hbWV8fHQ7ZS5mblt0XT1mdW5jdGlvbihuKXt2YXIgYT0ic3RyaW5nIj09dHlwZW9mIG4sbz11LmNhbGwoYXJndW1lbnRzLDEpLHI9dGhpcztyZXR1cm4gYT90aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgaSxhPWUuZGF0YSh0aGlzLHMpO3JldHVybiJpbnN0YW5jZSI9PT1uPyhyPWEsITEpOmE/ZS5pc0Z1bmN0aW9uKGFbbl0pJiYiXyIhPT1uLmNoYXJBdCgwKT8oaT1hW25dLmFwcGx5KGEsbyksaSE9PWEmJnZvaWQgMCE9PWk/KHI9aSYmaS5qcXVlcnk/ci5wdXNoU3RhY2soaS5nZXQoKSk6aSwhMSk6dm9pZCAwKTplLmVycm9yKCJubyBzdWNoIG1ldGhvZCAnIituKyInIGZvciAiK3QrIiB3aWRnZXQgaW5zdGFuY2UiKTplLmVycm9yKCJjYW5ub3QgY2FsbCBtZXRob2RzIG9uICIrdCsiIHByaW9yIHRvIGluaXRpYWxpemF0aW9uOyAiKyJhdHRlbXB0ZWQgdG8gY2FsbCBtZXRob2QgJyIrbisiJyIpfSk6KG8ubGVuZ3RoJiYobj1lLndpZGdldC5leHRlbmQuYXBwbHkobnVsbCxbbl0uY29uY2F0KG8pKSksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9ZS5kYXRhKHRoaXMscyk7dD8odC5vcHRpb24obnx8e30pLHQuX2luaXQmJnQuX2luaXQoKSk6ZS5kYXRhKHRoaXMscyxuZXcgaShuLHRoaXMpKX0pKSxyfX0sZS5XaWRnZXQ9ZnVuY3Rpb24oKXt9LGUuV2lkZ2V0Ll9jaGlsZENvbnN0cnVjdG9ycz1bXSxlLldpZGdldC5wcm90b3R5cGU9e3dpZGdldE5hbWU6IndpZGdldCIsd2lkZ2V0RXZlbnRQcmVmaXg6IiIsZGVmYXVsdEVsZW1lbnQ6IjxkaXY+IixvcHRpb25zOntkaXNhYmxlZDohMSxjcmVhdGU6bnVsbH0sX2NyZWF0ZVdpZGdldDpmdW5jdGlvbih0LGkpe2k9ZShpfHx0aGlzLmRlZmF1bHRFbGVtZW50fHx0aGlzKVswXSx0aGlzLmVsZW1lbnQ9ZShpKSx0aGlzLnV1aWQ9bCsrLHRoaXMuZXZlbnROYW1lc3BhY2U9Ii4iK3RoaXMud2lkZ2V0TmFtZSt0aGlzLnV1aWQsdGhpcy5iaW5kaW5ncz1lKCksdGhpcy5ob3ZlcmFibGU9ZSgpLHRoaXMuZm9jdXNhYmxlPWUoKSxpIT09dGhpcyYmKGUuZGF0YShpLHRoaXMud2lkZ2V0RnVsbE5hbWUsdGhpcyksdGhpcy5fb24oITAsdGhpcy5lbGVtZW50LHtyZW1vdmU6ZnVuY3Rpb24oZSl7ZS50YXJnZXQ9PT1pJiZ0aGlzLmRlc3Ryb3koKX19KSx0aGlzLmRvY3VtZW50PWUoaS5zdHlsZT9pLm93bmVyRG9jdW1lbnQ6aS5kb2N1bWVudHx8aSksdGhpcy53aW5kb3c9ZSh0aGlzLmRvY3VtZW50WzBdLmRlZmF1bHRWaWV3fHx0aGlzLmRvY3VtZW50WzBdLnBhcmVudFdpbmRvdykpLHRoaXMub3B0aW9ucz1lLndpZGdldC5leHRlbmQoe30sdGhpcy5vcHRpb25zLHRoaXMuX2dldENyZWF0ZU9wdGlvbnMoKSx0KSx0aGlzLl9jcmVhdGUoKSx0aGlzLl90cmlnZ2VyKCJjcmVhdGUiLG51bGwsdGhpcy5fZ2V0Q3JlYXRlRXZlbnREYXRhKCkpLHRoaXMuX2luaXQoKX0sX2dldENyZWF0ZU9wdGlvbnM6ZS5ub29wLF9nZXRDcmVhdGVFdmVudERhdGE6ZS5ub29wLF9jcmVhdGU6ZS5ub29wLF9pbml0OmUubm9vcCxkZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5fZGVzdHJveSgpLHRoaXMuZWxlbWVudC51bmJpbmQodGhpcy5ldmVudE5hbWVzcGFjZSkucmVtb3ZlRGF0YSh0aGlzLndpZGdldEZ1bGxOYW1lKS5yZW1vdmVEYXRhKGUuY2FtZWxDYXNlKHRoaXMud2lkZ2V0RnVsbE5hbWUpKSx0aGlzLndpZGdldCgpLnVuYmluZCh0aGlzLmV2ZW50TmFtZXNwYWNlKS5yZW1vdmVBdHRyKCJhcmlhLWRpc2FibGVkIikucmVtb3ZlQ2xhc3ModGhpcy53aWRnZXRGdWxsTmFtZSsiLWRpc2FibGVkICIrInVpLXN0YXRlLWRpc2FibGVkIiksdGhpcy5iaW5kaW5ncy51bmJpbmQodGhpcy5ldmVudE5hbWVzcGFjZSksdGhpcy5ob3ZlcmFibGUucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWhvdmVyIiksdGhpcy5mb2N1c2FibGUucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWZvY3VzIil9LF9kZXN0cm95OmUubm9vcCx3aWRnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbGVtZW50fSxvcHRpb246ZnVuY3Rpb24odCxpKXt2YXIgcyxuLGEsbz10O2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiBlLndpZGdldC5leHRlbmQoe30sdGhpcy5vcHRpb25zKTtpZigic3RyaW5nIj09dHlwZW9mIHQpaWYobz17fSxzPXQuc3BsaXQoIi4iKSx0PXMuc2hpZnQoKSxzLmxlbmd0aCl7Zm9yKG49b1t0XT1lLndpZGdldC5leHRlbmQoe30sdGhpcy5vcHRpb25zW3RdKSxhPTA7cy5sZW5ndGgtMT5hO2ErKyluW3NbYV1dPW5bc1thXV18fHt9LG49bltzW2FdXTtpZih0PXMucG9wKCksMT09PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHZvaWQgMD09PW5bdF0/bnVsbDpuW3RdO25bdF09aX1lbHNle2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiB2b2lkIDA9PT10aGlzLm9wdGlvbnNbdF0/bnVsbDp0aGlzLm9wdGlvbnNbdF07b1t0XT1pfXJldHVybiB0aGlzLl9zZXRPcHRpb25zKG8pLHRoaXN9LF9zZXRPcHRpb25zOmZ1bmN0aW9uKGUpe3ZhciB0O2Zvcih0IGluIGUpdGhpcy5fc2V0T3B0aW9uKHQsZVt0XSk7cmV0dXJuIHRoaXN9LF9zZXRPcHRpb246ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5vcHRpb25zW2VdPXQsImRpc2FibGVkIj09PWUmJih0aGlzLndpZGdldCgpLnRvZ2dsZUNsYXNzKHRoaXMud2lkZ2V0RnVsbE5hbWUrIi1kaXNhYmxlZCIsISF0KSx0JiYodGhpcy5ob3ZlcmFibGUucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWhvdmVyIiksdGhpcy5mb2N1c2FibGUucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWZvY3VzIikpKSx0aGlzfSxlbmFibGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2V0T3B0aW9ucyh7ZGlzYWJsZWQ6ITF9KX0sZGlzYWJsZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9zZXRPcHRpb25zKHtkaXNhYmxlZDohMH0pfSxfb246ZnVuY3Rpb24odCxpLHMpe3ZhciBuLGE9dGhpczsiYm9vbGVhbiIhPXR5cGVvZiB0JiYocz1pLGk9dCx0PSExKSxzPyhpPW49ZShpKSx0aGlzLmJpbmRpbmdzPXRoaXMuYmluZGluZ3MuYWRkKGkpKToocz1pLGk9dGhpcy5lbGVtZW50LG49dGhpcy53aWRnZXQoKSksZS5lYWNoKHMsZnVuY3Rpb24ocyxvKXtmdW5jdGlvbiByKCl7cmV0dXJuIHR8fGEub3B0aW9ucy5kaXNhYmxlZCE9PSEwJiYhZSh0aGlzKS5oYXNDbGFzcygidWktc3RhdGUtZGlzYWJsZWQiKT8oInN0cmluZyI9PXR5cGVvZiBvP2Fbb106bykuYXBwbHkoYSxhcmd1bWVudHMpOnZvaWQgMH0ic3RyaW5nIiE9dHlwZW9mIG8mJihyLmd1aWQ9by5ndWlkPW8uZ3VpZHx8ci5ndWlkfHxlLmd1aWQrKyk7dmFyIGg9cy5tYXRjaCgvXihbXHc6LV0qKVxzKiguKikkLyksbD1oWzFdK2EuZXZlbnROYW1lc3BhY2UsdT1oWzJdO3U/bi5kZWxlZ2F0ZSh1LGwscik6aS5iaW5kKGwscil9KX0sX29mZjpmdW5jdGlvbih0LGkpe2k9KGl8fCIiKS5zcGxpdCgiICIpLmpvaW4odGhpcy5ldmVudE5hbWVzcGFjZSsiICIpK3RoaXMuZXZlbnROYW1lc3BhY2UsdC51bmJpbmQoaSkudW5kZWxlZ2F0ZShpKSx0aGlzLmJpbmRpbmdzPWUodGhpcy5iaW5kaW5ncy5ub3QodCkuZ2V0KCkpLHRoaXMuZm9jdXNhYmxlPWUodGhpcy5mb2N1c2FibGUubm90KHQpLmdldCgpKSx0aGlzLmhvdmVyYWJsZT1lKHRoaXMuaG92ZXJhYmxlLm5vdCh0KS5nZXQoKSl9LF9kZWxheTpmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIGkoKXtyZXR1cm4oInN0cmluZyI9PXR5cGVvZiBlP3NbZV06ZSkuYXBwbHkocyxhcmd1bWVudHMpfXZhciBzPXRoaXM7cmV0dXJuIHNldFRpbWVvdXQoaSx0fHwwKX0sX2hvdmVyYWJsZTpmdW5jdGlvbih0KXt0aGlzLmhvdmVyYWJsZT10aGlzLmhvdmVyYWJsZS5hZGQodCksdGhpcy5fb24odCx7bW91c2VlbnRlcjpmdW5jdGlvbih0KXtlKHQuY3VycmVudFRhcmdldCkuYWRkQ2xhc3MoInVpLXN0YXRlLWhvdmVyIil9LG1vdXNlbGVhdmU6ZnVuY3Rpb24odCl7ZSh0LmN1cnJlbnRUYXJnZXQpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1ob3ZlciIpfX0pfSxfZm9jdXNhYmxlOmZ1bmN0aW9uKHQpe3RoaXMuZm9jdXNhYmxlPXRoaXMuZm9jdXNhYmxlLmFkZCh0KSx0aGlzLl9vbih0LHtmb2N1c2luOmZ1bmN0aW9uKHQpe2UodC5jdXJyZW50VGFyZ2V0KS5hZGRDbGFzcygidWktc3RhdGUtZm9jdXMiKX0sZm9jdXNvdXQ6ZnVuY3Rpb24odCl7ZSh0LmN1cnJlbnRUYXJnZXQpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1mb2N1cyIpfX0pfSxfdHJpZ2dlcjpmdW5jdGlvbih0LGkscyl7dmFyIG4sYSxvPXRoaXMub3B0aW9uc1t0XTtpZihzPXN8fHt9LGk9ZS5FdmVudChpKSxpLnR5cGU9KHQ9PT10aGlzLndpZGdldEV2ZW50UHJlZml4P3Q6dGhpcy53aWRnZXRFdmVudFByZWZpeCt0KS50b0xvd2VyQ2FzZSgpLGkudGFyZ2V0PXRoaXMuZWxlbWVudFswXSxhPWkub3JpZ2luYWxFdmVudClmb3IobiBpbiBhKW4gaW4gaXx8KGlbbl09YVtuXSk7cmV0dXJuIHRoaXMuZWxlbWVudC50cmlnZ2VyKGkscyksIShlLmlzRnVuY3Rpb24obykmJm8uYXBwbHkodGhpcy5lbGVtZW50WzBdLFtpXS5jb25jYXQocykpPT09ITF8fGkuaXNEZWZhdWx0UHJldmVudGVkKCkpfX0sZS5lYWNoKHtzaG93OiJmYWRlSW4iLGhpZGU6ImZhZGVPdXQifSxmdW5jdGlvbih0LGkpe2UuV2lkZ2V0LnByb3RvdHlwZVsiXyIrdF09ZnVuY3Rpb24ocyxuLGEpeyJzdHJpbmciPT10eXBlb2YgbiYmKG49e2VmZmVjdDpufSk7dmFyIG8scj1uP249PT0hMHx8Im51bWJlciI9PXR5cGVvZiBuP2k6bi5lZmZlY3R8fGk6dDtuPW58fHt9LCJudW1iZXIiPT10eXBlb2YgbiYmKG49e2R1cmF0aW9uOm59KSxvPSFlLmlzRW1wdHlPYmplY3Qobiksbi5jb21wbGV0ZT1hLG4uZGVsYXkmJnMuZGVsYXkobi5kZWxheSksbyYmZS5lZmZlY3RzJiZlLmVmZmVjdHMuZWZmZWN0W3JdP3NbdF0obik6ciE9PXQmJnNbcl0/c1tyXShuLmR1cmF0aW9uLG4uZWFzaW5nLGEpOnMucXVldWUoZnVuY3Rpb24oaSl7ZSh0aGlzKVt0XSgpLGEmJmEuY2FsbChzWzBdKSxpKCl9KX19KSxlLndpZGdldDt2YXIgZD0hMTtlKGRvY3VtZW50KS5tb3VzZXVwKGZ1bmN0aW9uKCl7ZD0hMX0pLGUud2lkZ2V0KCJ1aS5tb3VzZSIse3ZlcnNpb246IjEuMTEuNCIsb3B0aW9uczp7Y2FuY2VsOiJpbnB1dCx0ZXh0YXJlYSxidXR0b24sc2VsZWN0LG9wdGlvbiIsZGlzdGFuY2U6MSxkZWxheTowfSxfbW91c2VJbml0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLmVsZW1lbnQuYmluZCgibW91c2Vkb3duLiIrdGhpcy53aWRnZXROYW1lLGZ1bmN0aW9uKGUpe3JldHVybiB0Ll9tb3VzZURvd24oZSl9KS5iaW5kKCJjbGljay4iK3RoaXMud2lkZ2V0TmFtZSxmdW5jdGlvbihpKXtyZXR1cm4hMD09PWUuZGF0YShpLnRhcmdldCx0LndpZGdldE5hbWUrIi5wcmV2ZW50Q2xpY2tFdmVudCIpPyhlLnJlbW92ZURhdGEoaS50YXJnZXQsdC53aWRnZXROYW1lKyIucHJldmVudENsaWNrRXZlbnQiKSxpLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLCExKTp2b2lkIDB9KSx0aGlzLnN0YXJ0ZWQ9ITF9LF9tb3VzZURlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLmVsZW1lbnQudW5iaW5kKCIuIit0aGlzLndpZGdldE5hbWUpLHRoaXMuX21vdXNlTW92ZURlbGVnYXRlJiZ0aGlzLmRvY3VtZW50LnVuYmluZCgibW91c2Vtb3ZlLiIrdGhpcy53aWRnZXROYW1lLHRoaXMuX21vdXNlTW92ZURlbGVnYXRlKS51bmJpbmQoIm1vdXNldXAuIit0aGlzLndpZGdldE5hbWUsdGhpcy5fbW91c2VVcERlbGVnYXRlKX0sX21vdXNlRG93bjpmdW5jdGlvbih0KXtpZighZCl7dGhpcy5fbW91c2VNb3ZlZD0hMSx0aGlzLl9tb3VzZVN0YXJ0ZWQmJnRoaXMuX21vdXNlVXAodCksdGhpcy5fbW91c2VEb3duRXZlbnQ9dDt2YXIgaT10aGlzLHM9MT09PXQud2hpY2gsbj0ic3RyaW5nIj09dHlwZW9mIHRoaXMub3B0aW9ucy5jYW5jZWwmJnQudGFyZ2V0Lm5vZGVOYW1lP2UodC50YXJnZXQpLmNsb3Nlc3QodGhpcy5vcHRpb25zLmNhbmNlbCkubGVuZ3RoOiExO3JldHVybiBzJiYhbiYmdGhpcy5fbW91c2VDYXB0dXJlKHQpPyh0aGlzLm1vdXNlRGVsYXlNZXQ9IXRoaXMub3B0aW9ucy5kZWxheSx0aGlzLm1vdXNlRGVsYXlNZXR8fCh0aGlzLl9tb3VzZURlbGF5VGltZXI9c2V0VGltZW91dChmdW5jdGlvbigpe2kubW91c2VEZWxheU1ldD0hMH0sdGhpcy5vcHRpb25zLmRlbGF5KSksdGhpcy5fbW91c2VEaXN0YW5jZU1ldCh0KSYmdGhpcy5fbW91c2VEZWxheU1ldCh0KSYmKHRoaXMuX21vdXNlU3RhcnRlZD10aGlzLl9tb3VzZVN0YXJ0KHQpIT09ITEsIXRoaXMuX21vdXNlU3RhcnRlZCk/KHQucHJldmVudERlZmF1bHQoKSwhMCk6KCEwPT09ZS5kYXRhKHQudGFyZ2V0LHRoaXMud2lkZ2V0TmFtZSsiLnByZXZlbnRDbGlja0V2ZW50IikmJmUucmVtb3ZlRGF0YSh0LnRhcmdldCx0aGlzLndpZGdldE5hbWUrIi5wcmV2ZW50Q2xpY2tFdmVudCIpLHRoaXMuX21vdXNlTW92ZURlbGVnYXRlPWZ1bmN0aW9uKGUpe3JldHVybiBpLl9tb3VzZU1vdmUoZSl9LHRoaXMuX21vdXNlVXBEZWxlZ2F0ZT1mdW5jdGlvbihlKXtyZXR1cm4gaS5fbW91c2VVcChlKX0sdGhpcy5kb2N1bWVudC5iaW5kKCJtb3VzZW1vdmUuIit0aGlzLndpZGdldE5hbWUsdGhpcy5fbW91c2VNb3ZlRGVsZWdhdGUpLmJpbmQoIm1vdXNldXAuIit0aGlzLndpZGdldE5hbWUsdGhpcy5fbW91c2VVcERlbGVnYXRlKSx0LnByZXZlbnREZWZhdWx0KCksZD0hMCwhMCkpOiEwfX0sX21vdXNlTW92ZTpmdW5jdGlvbih0KXtpZih0aGlzLl9tb3VzZU1vdmVkKXtpZihlLnVpLmllJiYoIWRvY3VtZW50LmRvY3VtZW50TW9kZXx8OT5kb2N1bWVudC5kb2N1bWVudE1vZGUpJiYhdC5idXR0b24pcmV0dXJuIHRoaXMuX21vdXNlVXAodCk7aWYoIXQud2hpY2gpcmV0dXJuIHRoaXMuX21vdXNlVXAodCl9cmV0dXJuKHQud2hpY2h8fHQuYnV0dG9uKSYmKHRoaXMuX21vdXNlTW92ZWQ9ITApLHRoaXMuX21vdXNlU3RhcnRlZD8odGhpcy5fbW91c2VEcmFnKHQpLHQucHJldmVudERlZmF1bHQoKSk6KHRoaXMuX21vdXNlRGlzdGFuY2VNZXQodCkmJnRoaXMuX21vdXNlRGVsYXlNZXQodCkmJih0aGlzLl9tb3VzZVN0YXJ0ZWQ9dGhpcy5fbW91c2VTdGFydCh0aGlzLl9tb3VzZURvd25FdmVudCx0KSE9PSExLHRoaXMuX21vdXNlU3RhcnRlZD90aGlzLl9tb3VzZURyYWcodCk6dGhpcy5fbW91c2VVcCh0KSksIXRoaXMuX21vdXNlU3RhcnRlZCl9LF9tb3VzZVVwOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmRvY3VtZW50LnVuYmluZCgibW91c2Vtb3ZlLiIrdGhpcy53aWRnZXROYW1lLHRoaXMuX21vdXNlTW92ZURlbGVnYXRlKS51bmJpbmQoIm1vdXNldXAuIit0aGlzLndpZGdldE5hbWUsdGhpcy5fbW91c2VVcERlbGVnYXRlKSx0aGlzLl9tb3VzZVN0YXJ0ZWQmJih0aGlzLl9tb3VzZVN0YXJ0ZWQ9ITEsdC50YXJnZXQ9PT10aGlzLl9tb3VzZURvd25FdmVudC50YXJnZXQmJmUuZGF0YSh0LnRhcmdldCx0aGlzLndpZGdldE5hbWUrIi5wcmV2ZW50Q2xpY2tFdmVudCIsITApLHRoaXMuX21vdXNlU3RvcCh0KSksZD0hMSwhMX0sX21vdXNlRGlzdGFuY2VNZXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGgubWF4KE1hdGguYWJzKHRoaXMuX21vdXNlRG93bkV2ZW50LnBhZ2VYLWUucGFnZVgpLE1hdGguYWJzKHRoaXMuX21vdXNlRG93bkV2ZW50LnBhZ2VZLWUucGFnZVkpKT49dGhpcy5vcHRpb25zLmRpc3RhbmNlfSxfbW91c2VEZWxheU1ldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1vdXNlRGVsYXlNZXR9LF9tb3VzZVN0YXJ0OmZ1bmN0aW9uKCl7fSxfbW91c2VEcmFnOmZ1bmN0aW9uKCl7fSxfbW91c2VTdG9wOmZ1bmN0aW9uKCl7fSxfbW91c2VDYXB0dXJlOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSksZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUsdCxpKXtyZXR1cm5bcGFyc2VGbG9hdChlWzBdKSoocC50ZXN0KGVbMF0pP3QvMTAwOjEpLHBhcnNlRmxvYXQoZVsxXSkqKHAudGVzdChlWzFdKT9pLzEwMDoxKV19ZnVuY3Rpb24gaSh0LGkpe3JldHVybiBwYXJzZUludChlLmNzcyh0LGkpLDEwKXx8MH1mdW5jdGlvbiBzKHQpe3ZhciBpPXRbMF07cmV0dXJuIDk9PT1pLm5vZGVUeXBlP3t3aWR0aDp0LndpZHRoKCksaGVpZ2h0OnQuaGVpZ2h0KCksb2Zmc2V0Ont0b3A6MCxsZWZ0OjB9fTplLmlzV2luZG93KGkpP3t3aWR0aDp0LndpZHRoKCksaGVpZ2h0OnQuaGVpZ2h0KCksb2Zmc2V0Ont0b3A6dC5zY3JvbGxUb3AoKSxsZWZ0OnQuc2Nyb2xsTGVmdCgpfX06aS5wcmV2ZW50RGVmYXVsdD97d2lkdGg6MCxoZWlnaHQ6MCxvZmZzZXQ6e3RvcDppLnBhZ2VZLGxlZnQ6aS5wYWdlWH19Ont3aWR0aDp0Lm91dGVyV2lkdGgoKSxoZWlnaHQ6dC5vdXRlckhlaWdodCgpLG9mZnNldDp0Lm9mZnNldCgpfX1lLnVpPWUudWl8fHt9O3ZhciBuLGEsbz1NYXRoLm1heCxyPU1hdGguYWJzLGg9TWF0aC5yb3VuZCxsPS9sZWZ0fGNlbnRlcnxyaWdodC8sdT0vdG9wfGNlbnRlcnxib3R0b20vLGQ9L1tcK1wtXVxkKyhcLltcZF0rKT8lPy8sYz0vXlx3Ky8scD0vJSQvLGY9ZS5mbi5wb3NpdGlvbjtlLnBvc2l0aW9uPXtzY3JvbGxiYXJXaWR0aDpmdW5jdGlvbigpe2lmKHZvaWQgMCE9PW4pcmV0dXJuIG47dmFyIHQsaSxzPWUoIjxkaXYgc3R5bGU9J2Rpc3BsYXk6YmxvY2s7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6NTBweDtoZWlnaHQ6NTBweDtvdmVyZmxvdzpoaWRkZW47Jz48ZGl2IHN0eWxlPSdoZWlnaHQ6MTAwcHg7d2lkdGg6YXV0bzsnPjwvZGl2PjwvZGl2PiIpLGE9cy5jaGlsZHJlbigpWzBdO3JldHVybiBlKCJib2R5IikuYXBwZW5kKHMpLHQ9YS5vZmZzZXRXaWR0aCxzLmNzcygib3ZlcmZsb3ciLCJzY3JvbGwiKSxpPWEub2Zmc2V0V2lkdGgsdD09PWkmJihpPXNbMF0uY2xpZW50V2lkdGgpLHMucmVtb3ZlKCksbj10LWl9LGdldFNjcm9sbEluZm86ZnVuY3Rpb24odCl7dmFyIGk9dC5pc1dpbmRvd3x8dC5pc0RvY3VtZW50PyIiOnQuZWxlbWVudC5jc3MoIm92ZXJmbG93LXgiKSxzPXQuaXNXaW5kb3d8fHQuaXNEb2N1bWVudD8iIjp0LmVsZW1lbnQuY3NzKCJvdmVyZmxvdy15Iiksbj0ic2Nyb2xsIj09PWl8fCJhdXRvIj09PWkmJnQud2lkdGg8dC5lbGVtZW50WzBdLnNjcm9sbFdpZHRoLGE9InNjcm9sbCI9PT1zfHwiYXV0byI9PT1zJiZ0LmhlaWdodDx0LmVsZW1lbnRbMF0uc2Nyb2xsSGVpZ2h0O3JldHVybnt3aWR0aDphP2UucG9zaXRpb24uc2Nyb2xsYmFyV2lkdGgoKTowLGhlaWdodDpuP2UucG9zaXRpb24uc2Nyb2xsYmFyV2lkdGgoKTowfX0sZ2V0V2l0aGluSW5mbzpmdW5jdGlvbih0KXt2YXIgaT1lKHR8fHdpbmRvdykscz1lLmlzV2luZG93KGlbMF0pLG49ISFpWzBdJiY5PT09aVswXS5ub2RlVHlwZTtyZXR1cm57ZWxlbWVudDppLGlzV2luZG93OnMsaXNEb2N1bWVudDpuLG9mZnNldDppLm9mZnNldCgpfHx7bGVmdDowLHRvcDowfSxzY3JvbGxMZWZ0Omkuc2Nyb2xsTGVmdCgpLHNjcm9sbFRvcDppLnNjcm9sbFRvcCgpLHdpZHRoOnN8fG4/aS53aWR0aCgpOmkub3V0ZXJXaWR0aCgpLGhlaWdodDpzfHxuP2kuaGVpZ2h0KCk6aS5vdXRlckhlaWdodCgpfX19LGUuZm4ucG9zaXRpb249ZnVuY3Rpb24obil7aWYoIW58fCFuLm9mKXJldHVybiBmLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtuPWUuZXh0ZW5kKHt9LG4pO3ZhciBwLG0sZyx2LHksYixfPWUobi5vZikseD1lLnBvc2l0aW9uLmdldFdpdGhpbkluZm8obi53aXRoaW4pLHc9ZS5wb3NpdGlvbi5nZXRTY3JvbGxJbmZvKHgpLGs9KG4uY29sbGlzaW9ufHwiZmxpcCIpLnNwbGl0KCIgIiksVD17fTtyZXR1cm4gYj1zKF8pLF9bMF0ucHJldmVudERlZmF1bHQmJihuLmF0PSJsZWZ0IHRvcCIpLG09Yi53aWR0aCxnPWIuaGVpZ2h0LHY9Yi5vZmZzZXQseT1lLmV4dGVuZCh7fSx2KSxlLmVhY2goWyJteSIsImF0Il0sZnVuY3Rpb24oKXt2YXIgZSx0LGk9KG5bdGhpc118fCIiKS5zcGxpdCgiICIpOzE9PT1pLmxlbmd0aCYmKGk9bC50ZXN0KGlbMF0pP2kuY29uY2F0KFsiY2VudGVyIl0pOnUudGVzdChpWzBdKT9bImNlbnRlciJdLmNvbmNhdChpKTpbImNlbnRlciIsImNlbnRlciJdKSxpWzBdPWwudGVzdChpWzBdKT9pWzBdOiJjZW50ZXIiLGlbMV09dS50ZXN0KGlbMV0pP2lbMV06ImNlbnRlciIsZT1kLmV4ZWMoaVswXSksdD1kLmV4ZWMoaVsxXSksVFt0aGlzXT1bZT9lWzBdOjAsdD90WzBdOjBdLG5bdGhpc109W2MuZXhlYyhpWzBdKVswXSxjLmV4ZWMoaVsxXSlbMF1dfSksMT09PWsubGVuZ3RoJiYoa1sxXT1rWzBdKSwicmlnaHQiPT09bi5hdFswXT95LmxlZnQrPW06ImNlbnRlciI9PT1uLmF0WzBdJiYoeS5sZWZ0Kz1tLzIpLCJib3R0b20iPT09bi5hdFsxXT95LnRvcCs9ZzoiY2VudGVyIj09PW4uYXRbMV0mJih5LnRvcCs9Zy8yKSxwPXQoVC5hdCxtLGcpLHkubGVmdCs9cFswXSx5LnRvcCs9cFsxXSx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgcyxsLHU9ZSh0aGlzKSxkPXUub3V0ZXJXaWR0aCgpLGM9dS5vdXRlckhlaWdodCgpLGY9aSh0aGlzLCJtYXJnaW5MZWZ0IiksYj1pKHRoaXMsIm1hcmdpblRvcCIpLEQ9ZCtmK2kodGhpcywibWFyZ2luUmlnaHQiKSt3LndpZHRoLFM9YytiK2kodGhpcywibWFyZ2luQm90dG9tIikrdy5oZWlnaHQsTT1lLmV4dGVuZCh7fSx5KSxDPXQoVC5teSx1Lm91dGVyV2lkdGgoKSx1Lm91dGVySGVpZ2h0KCkpOyJyaWdodCI9PT1uLm15WzBdP00ubGVmdC09ZDoiY2VudGVyIj09PW4ubXlbMF0mJihNLmxlZnQtPWQvMiksImJvdHRvbSI9PT1uLm15WzFdP00udG9wLT1jOiJjZW50ZXIiPT09bi5teVsxXSYmKE0udG9wLT1jLzIpLE0ubGVmdCs9Q1swXSxNLnRvcCs9Q1sxXSxhfHwoTS5sZWZ0PWgoTS5sZWZ0KSxNLnRvcD1oKE0udG9wKSkscz17bWFyZ2luTGVmdDpmLG1hcmdpblRvcDpifSxlLmVhY2goWyJsZWZ0IiwidG9wIl0sZnVuY3Rpb24odCxpKXtlLnVpLnBvc2l0aW9uW2tbdF1dJiZlLnVpLnBvc2l0aW9uW2tbdF1dW2ldKE0se3RhcmdldFdpZHRoOm0sdGFyZ2V0SGVpZ2h0OmcsZWxlbVdpZHRoOmQsZWxlbUhlaWdodDpjLGNvbGxpc2lvblBvc2l0aW9uOnMsY29sbGlzaW9uV2lkdGg6RCxjb2xsaXNpb25IZWlnaHQ6UyxvZmZzZXQ6W3BbMF0rQ1swXSxwWzFdK0NbMV1dLG15Om4ubXksYXQ6bi5hdCx3aXRoaW46eCxlbGVtOnV9KX0pLG4udXNpbmcmJihsPWZ1bmN0aW9uKGUpe3ZhciB0PXYubGVmdC1NLmxlZnQsaT10K20tZCxzPXYudG9wLU0udG9wLGE9cytnLWMsaD17dGFyZ2V0OntlbGVtZW50Ol8sbGVmdDp2LmxlZnQsdG9wOnYudG9wLHdpZHRoOm0saGVpZ2h0Omd9LGVsZW1lbnQ6e2VsZW1lbnQ6dSxsZWZ0Ok0ubGVmdCx0b3A6TS50b3Asd2lkdGg6ZCxoZWlnaHQ6Y30saG9yaXpvbnRhbDowPmk/ImxlZnQiOnQ+MD8icmlnaHQiOiJjZW50ZXIiLHZlcnRpY2FsOjA+YT8idG9wIjpzPjA/ImJvdHRvbSI6Im1pZGRsZSJ9O2Q+bSYmbT5yKHQraSkmJihoLmhvcml6b250YWw9ImNlbnRlciIpLGM+ZyYmZz5yKHMrYSkmJihoLnZlcnRpY2FsPSJtaWRkbGUiKSxoLmltcG9ydGFudD1vKHIodCkscihpKSk+byhyKHMpLHIoYSkpPyJob3Jpem9udGFsIjoidmVydGljYWwiLG4udXNpbmcuY2FsbCh0aGlzLGUsaCl9KSx1Lm9mZnNldChlLmV4dGVuZChNLHt1c2luZzpsfSkpfSl9LGUudWkucG9zaXRpb249e2ZpdDp7bGVmdDpmdW5jdGlvbihlLHQpe3ZhciBpLHM9dC53aXRoaW4sbj1zLmlzV2luZG93P3Muc2Nyb2xsTGVmdDpzLm9mZnNldC5sZWZ0LGE9cy53aWR0aCxyPWUubGVmdC10LmNvbGxpc2lvblBvc2l0aW9uLm1hcmdpbkxlZnQsaD1uLXIsbD1yK3QuY29sbGlzaW9uV2lkdGgtYS1uO3QuY29sbGlzaW9uV2lkdGg+YT9oPjAmJjA+PWw/KGk9ZS5sZWZ0K2grdC5jb2xsaXNpb25XaWR0aC1hLW4sZS5sZWZ0Kz1oLWkpOmUubGVmdD1sPjAmJjA+PWg/bjpoPmw/bithLXQuY29sbGlzaW9uV2lkdGg6bjpoPjA/ZS5sZWZ0Kz1oOmw+MD9lLmxlZnQtPWw6ZS5sZWZ0PW8oZS5sZWZ0LXIsZS5sZWZ0KX0sdG9wOmZ1bmN0aW9uKGUsdCl7dmFyIGkscz10LndpdGhpbixuPXMuaXNXaW5kb3c/cy5zY3JvbGxUb3A6cy5vZmZzZXQudG9wLGE9dC53aXRoaW4uaGVpZ2h0LHI9ZS50b3AtdC5jb2xsaXNpb25Qb3NpdGlvbi5tYXJnaW5Ub3AsaD1uLXIsbD1yK3QuY29sbGlzaW9uSGVpZ2h0LWEtbjt0LmNvbGxpc2lvbkhlaWdodD5hP2g+MCYmMD49bD8oaT1lLnRvcCtoK3QuY29sbGlzaW9uSGVpZ2h0LWEtbixlLnRvcCs9aC1pKTplLnRvcD1sPjAmJjA+PWg/bjpoPmw/bithLXQuY29sbGlzaW9uSGVpZ2h0Om46aD4wP2UudG9wKz1oOmw+MD9lLnRvcC09bDplLnRvcD1vKGUudG9wLXIsZS50b3ApfX0sZmxpcDp7bGVmdDpmdW5jdGlvbihlLHQpe3ZhciBpLHMsbj10LndpdGhpbixhPW4ub2Zmc2V0LmxlZnQrbi5zY3JvbGxMZWZ0LG89bi53aWR0aCxoPW4uaXNXaW5kb3c/bi5zY3JvbGxMZWZ0Om4ub2Zmc2V0LmxlZnQsbD1lLmxlZnQtdC5jb2xsaXNpb25Qb3NpdGlvbi5tYXJnaW5MZWZ0LHU9bC1oLGQ9bCt0LmNvbGxpc2lvbldpZHRoLW8taCxjPSJsZWZ0Ij09PXQubXlbMF0/LXQuZWxlbVdpZHRoOiJyaWdodCI9PT10Lm15WzBdP3QuZWxlbVdpZHRoOjAscD0ibGVmdCI9PT10LmF0WzBdP3QudGFyZ2V0V2lkdGg6InJpZ2h0Ij09PXQuYXRbMF0/LXQudGFyZ2V0V2lkdGg6MCxmPS0yKnQub2Zmc2V0WzBdOzA+dT8oaT1lLmxlZnQrYytwK2YrdC5jb2xsaXNpb25XaWR0aC1vLWEsKDA+aXx8cih1KT5pKSYmKGUubGVmdCs9YytwK2YpKTpkPjAmJihzPWUubGVmdC10LmNvbGxpc2lvblBvc2l0aW9uLm1hcmdpbkxlZnQrYytwK2YtaCwocz4wfHxkPnIocykpJiYoZS5sZWZ0Kz1jK3ArZikpfSx0b3A6ZnVuY3Rpb24oZSx0KXt2YXIgaSxzLG49dC53aXRoaW4sYT1uLm9mZnNldC50b3Arbi5zY3JvbGxUb3Asbz1uLmhlaWdodCxoPW4uaXNXaW5kb3c/bi5zY3JvbGxUb3A6bi5vZmZzZXQudG9wLGw9ZS50b3AtdC5jb2xsaXNpb25Qb3NpdGlvbi5tYXJnaW5Ub3AsdT1sLWgsZD1sK3QuY29sbGlzaW9uSGVpZ2h0LW8taCxjPSJ0b3AiPT09dC5teVsxXSxwPWM/LXQuZWxlbUhlaWdodDoiYm90dG9tIj09PXQubXlbMV0/dC5lbGVtSGVpZ2h0OjAsZj0idG9wIj09PXQuYXRbMV0/dC50YXJnZXRIZWlnaHQ6ImJvdHRvbSI9PT10LmF0WzFdPy10LnRhcmdldEhlaWdodDowLG09LTIqdC5vZmZzZXRbMV07MD51PyhzPWUudG9wK3ArZittK3QuY29sbGlzaW9uSGVpZ2h0LW8tYSwoMD5zfHxyKHUpPnMpJiYoZS50b3ArPXArZittKSk6ZD4wJiYoaT1lLnRvcC10LmNvbGxpc2lvblBvc2l0aW9uLm1hcmdpblRvcCtwK2YrbS1oLChpPjB8fGQ+cihpKSkmJihlLnRvcCs9cCtmK20pKX19LGZsaXBmaXQ6e2xlZnQ6ZnVuY3Rpb24oKXtlLnVpLnBvc2l0aW9uLmZsaXAubGVmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyksZS51aS5wb3NpdGlvbi5maXQubGVmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LHRvcDpmdW5jdGlvbigpe2UudWkucG9zaXRpb24uZmxpcC50b3AuYXBwbHkodGhpcyxhcmd1bWVudHMpLGUudWkucG9zaXRpb24uZml0LnRvcC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fX0sZnVuY3Rpb24oKXt2YXIgdCxpLHMsbixvLHI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHkiKVswXSxoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3Q9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChyPyJkaXYiOiJib2R5Iikscz17dmlzaWJpbGl0eToiaGlkZGVuIix3aWR0aDowLGhlaWdodDowLGJvcmRlcjowLG1hcmdpbjowLGJhY2tncm91bmQ6Im5vbmUifSxyJiZlLmV4dGVuZChzLHtwb3NpdGlvbjoiYWJzb2x1dGUiLGxlZnQ6Ii0xMDAwcHgiLHRvcDoiLTEwMDBweCJ9KTtmb3IobyBpbiBzKXQuc3R5bGVbb109c1tvXTt0LmFwcGVuZENoaWxkKGgpLGk9cnx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGkuaW5zZXJ0QmVmb3JlKHQsaS5maXJzdENoaWxkKSxoLnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOiBhYnNvbHV0ZTsgbGVmdDogMTAuNzQzMjIyMnB4OyIsbj1lKGgpLm9mZnNldCgpLmxlZnQsYT1uPjEwJiYxMT5uLHQuaW5uZXJIVE1MPSIiLGkucmVtb3ZlQ2hpbGQodCl9KCl9KCksZS51aS5wb3NpdGlvbixlLndpZGdldCgidWkuYWNjb3JkaW9uIix7dmVyc2lvbjoiMS4xMS40IixvcHRpb25zOnthY3RpdmU6MCxhbmltYXRlOnt9LGNvbGxhcHNpYmxlOiExLGV2ZW50OiJjbGljayIsaGVhZGVyOiI+IGxpID4gOmZpcnN0LWNoaWxkLD4gOm5vdChsaSk6ZXZlbiIsaGVpZ2h0U3R5bGU6ImF1dG8iLGljb25zOnthY3RpdmVIZWFkZXI6InVpLWljb24tdHJpYW5nbGUtMS1zIixoZWFkZXI6InVpLWljb24tdHJpYW5nbGUtMS1lIn0sYWN0aXZhdGU6bnVsbCxiZWZvcmVBY3RpdmF0ZTpudWxsfSxoaWRlUHJvcHM6e2JvcmRlclRvcFdpZHRoOiJoaWRlIixib3JkZXJCb3R0b21XaWR0aDoiaGlkZSIscGFkZGluZ1RvcDoiaGlkZSIscGFkZGluZ0JvdHRvbToiaGlkZSIsaGVpZ2h0OiJoaWRlIn0sc2hvd1Byb3BzOntib3JkZXJUb3BXaWR0aDoic2hvdyIsYm9yZGVyQm90dG9tV2lkdGg6InNob3ciLHBhZGRpbmdUb3A6InNob3ciLHBhZGRpbmdCb3R0b206InNob3ciLGhlaWdodDoic2hvdyJ9LF9jcmVhdGU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wdGlvbnM7dGhpcy5wcmV2U2hvdz10aGlzLnByZXZIaWRlPWUoKSx0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLWFjY29yZGlvbiB1aS13aWRnZXQgdWktaGVscGVyLXJlc2V0IikuYXR0cigicm9sZSIsInRhYmxpc3QiKSx0LmNvbGxhcHNpYmxlfHx0LmFjdGl2ZSE9PSExJiZudWxsIT10LmFjdGl2ZXx8KHQuYWN0aXZlPTApLHRoaXMuX3Byb2Nlc3NQYW5lbHMoKSwwPnQuYWN0aXZlJiYodC5hY3RpdmUrPXRoaXMuaGVhZGVycy5sZW5ndGgpLHRoaXMuX3JlZnJlc2goKX0sX2dldENyZWF0ZUV2ZW50RGF0YTpmdW5jdGlvbigpe3JldHVybntoZWFkZXI6dGhpcy5hY3RpdmUscGFuZWw6dGhpcy5hY3RpdmUubGVuZ3RoP3RoaXMuYWN0aXZlLm5leHQoKTplKCl9fSxfY3JlYXRlSWNvbnM6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wdGlvbnMuaWNvbnM7dCYmKGUoIjxzcGFuPiIpLmFkZENsYXNzKCJ1aS1hY2NvcmRpb24taGVhZGVyLWljb24gdWktaWNvbiAiK3QuaGVhZGVyKS5wcmVwZW5kVG8odGhpcy5oZWFkZXJzKSx0aGlzLmFjdGl2ZS5jaGlsZHJlbigiLnVpLWFjY29yZGlvbi1oZWFkZXItaWNvbiIpLnJlbW92ZUNsYXNzKHQuaGVhZGVyKS5hZGRDbGFzcyh0LmFjdGl2ZUhlYWRlciksdGhpcy5oZWFkZXJzLmFkZENsYXNzKCJ1aS1hY2NvcmRpb24taWNvbnMiKSl9LF9kZXN0cm95SWNvbnM6ZnVuY3Rpb24oKXt0aGlzLmhlYWRlcnMucmVtb3ZlQ2xhc3MoInVpLWFjY29yZGlvbi1pY29ucyIpLmNoaWxkcmVuKCIudWktYWNjb3JkaW9uLWhlYWRlci1pY29uIikucmVtb3ZlKCl9LF9kZXN0cm95OmZ1bmN0aW9uKCl7dmFyIGU7dGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1hY2NvcmRpb24gdWktd2lkZ2V0IHVpLWhlbHBlci1yZXNldCIpLnJlbW92ZUF0dHIoInJvbGUiKSx0aGlzLmhlYWRlcnMucmVtb3ZlQ2xhc3MoInVpLWFjY29yZGlvbi1oZWFkZXIgdWktYWNjb3JkaW9uLWhlYWRlci1hY3RpdmUgdWktc3RhdGUtZGVmYXVsdCB1aS1jb3JuZXItYWxsIHVpLXN0YXRlLWFjdGl2ZSB1aS1zdGF0ZS1kaXNhYmxlZCB1aS1jb3JuZXItdG9wIikucmVtb3ZlQXR0cigicm9sZSIpLnJlbW92ZUF0dHIoImFyaWEtZXhwYW5kZWQiKS5yZW1vdmVBdHRyKCJhcmlhLXNlbGVjdGVkIikucmVtb3ZlQXR0cigiYXJpYS1jb250cm9scyIpLnJlbW92ZUF0dHIoInRhYkluZGV4IikucmVtb3ZlVW5pcXVlSWQoKSx0aGlzLl9kZXN0cm95SWNvbnMoKSxlPXRoaXMuaGVhZGVycy5uZXh0KCkucmVtb3ZlQ2xhc3MoInVpLWhlbHBlci1yZXNldCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYm90dG9tIHVpLWFjY29yZGlvbi1jb250ZW50IHVpLWFjY29yZGlvbi1jb250ZW50LWFjdGl2ZSB1aS1zdGF0ZS1kaXNhYmxlZCIpLmNzcygiZGlzcGxheSIsIiIpLnJlbW92ZUF0dHIoInJvbGUiKS5yZW1vdmVBdHRyKCJhcmlhLWhpZGRlbiIpLnJlbW92ZUF0dHIoImFyaWEtbGFiZWxsZWRieSIpLnJlbW92ZVVuaXF1ZUlkKCksImNvbnRlbnQiIT09dGhpcy5vcHRpb25zLmhlaWdodFN0eWxlJiZlLmNzcygiaGVpZ2h0IiwiIil9LF9zZXRPcHRpb246ZnVuY3Rpb24oZSx0KXtyZXR1cm4iYWN0aXZlIj09PWU/KHRoaXMuX2FjdGl2YXRlKHQpLHZvaWQgMCk6KCJldmVudCI9PT1lJiYodGhpcy5vcHRpb25zLmV2ZW50JiZ0aGlzLl9vZmYodGhpcy5oZWFkZXJzLHRoaXMub3B0aW9ucy5ldmVudCksdGhpcy5fc2V0dXBFdmVudHModCkpLHRoaXMuX3N1cGVyKGUsdCksImNvbGxhcHNpYmxlIiE9PWV8fHR8fHRoaXMub3B0aW9ucy5hY3RpdmUhPT0hMXx8dGhpcy5fYWN0aXZhdGUoMCksImljb25zIj09PWUmJih0aGlzLl9kZXN0cm95SWNvbnMoKSx0JiZ0aGlzLl9jcmVhdGVJY29ucygpKSwiZGlzYWJsZWQiPT09ZSYmKHRoaXMuZWxlbWVudC50b2dnbGVDbGFzcygidWktc3RhdGUtZGlzYWJsZWQiLCEhdCkuYXR0cigiYXJpYS1kaXNhYmxlZCIsdCksdGhpcy5oZWFkZXJzLmFkZCh0aGlzLmhlYWRlcnMubmV4dCgpKS50b2dnbGVDbGFzcygidWktc3RhdGUtZGlzYWJsZWQiLCEhdCkpLHZvaWQgMCl9LF9rZXlkb3duOmZ1bmN0aW9uKHQpe2lmKCF0LmFsdEtleSYmIXQuY3RybEtleSl7dmFyIGk9ZS51aS5rZXlDb2RlLHM9dGhpcy5oZWFkZXJzLmxlbmd0aCxuPXRoaXMuaGVhZGVycy5pbmRleCh0LnRhcmdldCksYT0hMTtzd2l0Y2godC5rZXlDb2RlKXtjYXNlIGkuUklHSFQ6Y2FzZSBpLkRPV046YT10aGlzLmhlYWRlcnNbKG4rMSklc107YnJlYWs7Y2FzZSBpLkxFRlQ6Y2FzZSBpLlVQOmE9dGhpcy5oZWFkZXJzWyhuLTErcyklc107YnJlYWs7Y2FzZSBpLlNQQUNFOmNhc2UgaS5FTlRFUjp0aGlzLl9ldmVudEhhbmRsZXIodCk7YnJlYWs7Y2FzZSBpLkhPTUU6YT10aGlzLmhlYWRlcnNbMF07YnJlYWs7Y2FzZSBpLkVORDphPXRoaXMuaGVhZGVyc1tzLTFdfWEmJihlKHQudGFyZ2V0KS5hdHRyKCJ0YWJJbmRleCIsLTEpLGUoYSkuYXR0cigidGFiSW5kZXgiLDApLGEuZm9jdXMoKSx0LnByZXZlbnREZWZhdWx0KCkpfX0sX3BhbmVsS2V5RG93bjpmdW5jdGlvbih0KXt0LmtleUNvZGU9PT1lLnVpLmtleUNvZGUuVVAmJnQuY3RybEtleSYmZSh0LmN1cnJlbnRUYXJnZXQpLnByZXYoKS5mb2N1cygpfSxyZWZyZXNoOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcHRpb25zO3RoaXMuX3Byb2Nlc3NQYW5lbHMoKSx0LmFjdGl2ZT09PSExJiZ0LmNvbGxhcHNpYmxlPT09ITB8fCF0aGlzLmhlYWRlcnMubGVuZ3RoPyh0LmFjdGl2ZT0hMSx0aGlzLmFjdGl2ZT1lKCkpOnQuYWN0aXZlPT09ITE/dGhpcy5fYWN0aXZhdGUoMCk6dGhpcy5hY3RpdmUubGVuZ3RoJiYhZS5jb250YWlucyh0aGlzLmVsZW1lbnRbMF0sdGhpcy5hY3RpdmVbMF0pP3RoaXMuaGVhZGVycy5sZW5ndGg9PT10aGlzLmhlYWRlcnMuZmluZCgiLnVpLXN0YXRlLWRpc2FibGVkIikubGVuZ3RoPyh0LmFjdGl2ZT0hMSx0aGlzLmFjdGl2ZT1lKCkpOnRoaXMuX2FjdGl2YXRlKE1hdGgubWF4KDAsdC5hY3RpdmUtMSkpOnQuYWN0aXZlPXRoaXMuaGVhZGVycy5pbmRleCh0aGlzLmFjdGl2ZSksdGhpcy5fZGVzdHJveUljb25zKCksdGhpcy5fcmVmcmVzaCgpfSxfcHJvY2Vzc1BhbmVsczpmdW5jdGlvbigpe3ZhciBlPXRoaXMuaGVhZGVycyx0PXRoaXMucGFuZWxzO3RoaXMuaGVhZGVycz10aGlzLmVsZW1lbnQuZmluZCh0aGlzLm9wdGlvbnMuaGVhZGVyKS5hZGRDbGFzcygidWktYWNjb3JkaW9uLWhlYWRlciB1aS1zdGF0ZS1kZWZhdWx0IHVpLWNvcm5lci1hbGwiKSx0aGlzLnBhbmVscz10aGlzLmhlYWRlcnMubmV4dCgpLmFkZENsYXNzKCJ1aS1hY2NvcmRpb24tY29udGVudCB1aS1oZWxwZXItcmVzZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWJvdHRvbSIpLmZpbHRlcigiOm5vdCgudWktYWNjb3JkaW9uLWNvbnRlbnQtYWN0aXZlKSIpLmhpZGUoKSx0JiYodGhpcy5fb2ZmKGUubm90KHRoaXMuaGVhZGVycykpLHRoaXMuX29mZih0Lm5vdCh0aGlzLnBhbmVscykpKX0sX3JlZnJlc2g6ZnVuY3Rpb24oKXt2YXIgdCxpPXRoaXMub3B0aW9ucyxzPWkuaGVpZ2h0U3R5bGUsbj10aGlzLmVsZW1lbnQucGFyZW50KCk7dGhpcy5hY3RpdmU9dGhpcy5fZmluZEFjdGl2ZShpLmFjdGl2ZSkuYWRkQ2xhc3MoInVpLWFjY29yZGlvbi1oZWFkZXItYWN0aXZlIHVpLXN0YXRlLWFjdGl2ZSB1aS1jb3JuZXItdG9wIikucmVtb3ZlQ2xhc3MoInVpLWNvcm5lci1hbGwiKSx0aGlzLmFjdGl2ZS5uZXh0KCkuYWRkQ2xhc3MoInVpLWFjY29yZGlvbi1jb250ZW50LWFjdGl2ZSIpLnNob3coKSx0aGlzLmhlYWRlcnMuYXR0cigicm9sZSIsInRhYiIpLmVhY2goZnVuY3Rpb24oKXt2YXIgdD1lKHRoaXMpLGk9dC51bmlxdWVJZCgpLmF0dHIoImlkIikscz10Lm5leHQoKSxuPXMudW5pcXVlSWQoKS5hdHRyKCJpZCIpO3QuYXR0cigiYXJpYS1jb250cm9scyIsbikscy5hdHRyKCJhcmlhLWxhYmVsbGVkYnkiLGkpfSkubmV4dCgpLmF0dHIoInJvbGUiLCJ0YWJwYW5lbCIpLHRoaXMuaGVhZGVycy5ub3QodGhpcy5hY3RpdmUpLmF0dHIoeyJhcmlhLXNlbGVjdGVkIjoiZmFsc2UiLCJhcmlhLWV4cGFuZGVkIjoiZmFsc2UiLHRhYkluZGV4Oi0xfSkubmV4dCgpLmF0dHIoeyJhcmlhLWhpZGRlbiI6InRydWUifSkuaGlkZSgpLHRoaXMuYWN0aXZlLmxlbmd0aD90aGlzLmFjdGl2ZS5hdHRyKHsiYXJpYS1zZWxlY3RlZCI6InRydWUiLCJhcmlhLWV4cGFuZGVkIjoidHJ1ZSIsdGFiSW5kZXg6MH0pLm5leHQoKS5hdHRyKHsiYXJpYS1oaWRkZW4iOiJmYWxzZSJ9KTp0aGlzLmhlYWRlcnMuZXEoMCkuYXR0cigidGFiSW5kZXgiLDApLHRoaXMuX2NyZWF0ZUljb25zKCksdGhpcy5fc2V0dXBFdmVudHMoaS5ldmVudCksImZpbGwiPT09cz8odD1uLmhlaWdodCgpLHRoaXMuZWxlbWVudC5zaWJsaW5ncygiOnZpc2libGUiKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGk9ZSh0aGlzKSxzPWkuY3NzKCJwb3NpdGlvbiIpOyJhYnNvbHV0ZSIhPT1zJiYiZml4ZWQiIT09cyYmKHQtPWkub3V0ZXJIZWlnaHQoITApKX0pLHRoaXMuaGVhZGVycy5lYWNoKGZ1bmN0aW9uKCl7dC09ZSh0aGlzKS5vdXRlckhlaWdodCghMCl9KSx0aGlzLmhlYWRlcnMubmV4dCgpLmVhY2goZnVuY3Rpb24oKXtlKHRoaXMpLmhlaWdodChNYXRoLm1heCgwLHQtZSh0aGlzKS5pbm5lckhlaWdodCgpK2UodGhpcykuaGVpZ2h0KCkpKX0pLmNzcygib3ZlcmZsb3ciLCJhdXRvIikpOiJhdXRvIj09PXMmJih0PTAsdGhpcy5oZWFkZXJzLm5leHQoKS5lYWNoKGZ1bmN0aW9uKCl7dD1NYXRoLm1heCh0LGUodGhpcykuY3NzKCJoZWlnaHQiLCIiKS5oZWlnaHQoKSl9KS5oZWlnaHQodCkpfSxfYWN0aXZhdGU6ZnVuY3Rpb24odCl7dmFyIGk9dGhpcy5fZmluZEFjdGl2ZSh0KVswXTtpIT09dGhpcy5hY3RpdmVbMF0mJihpPWl8fHRoaXMuYWN0aXZlWzBdLHRoaXMuX2V2ZW50SGFuZGxlcih7dGFyZ2V0OmksY3VycmVudFRhcmdldDppLHByZXZlbnREZWZhdWx0OmUubm9vcH0pKX0sX2ZpbmRBY3RpdmU6ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3RoaXMuaGVhZGVycy5lcSh0KTplKCl9LF9zZXR1cEV2ZW50czpmdW5jdGlvbih0KXt2YXIgaT17a2V5ZG93bjoiX2tleWRvd24ifTt0JiZlLmVhY2godC5zcGxpdCgiICIpLGZ1bmN0aW9uKGUsdCl7aVt0XT0iX2V2ZW50SGFuZGxlciJ9KSx0aGlzLl9vZmYodGhpcy5oZWFkZXJzLmFkZCh0aGlzLmhlYWRlcnMubmV4dCgpKSksdGhpcy5fb24odGhpcy5oZWFkZXJzLGkpLHRoaXMuX29uKHRoaXMuaGVhZGVycy5uZXh0KCkse2tleWRvd246Il9wYW5lbEtleURvd24ifSksdGhpcy5faG92ZXJhYmxlKHRoaXMuaGVhZGVycyksdGhpcy5fZm9jdXNhYmxlKHRoaXMuaGVhZGVycyl9LF9ldmVudEhhbmRsZXI6ZnVuY3Rpb24odCl7dmFyIGk9dGhpcy5vcHRpb25zLHM9dGhpcy5hY3RpdmUsbj1lKHQuY3VycmVudFRhcmdldCksYT1uWzBdPT09c1swXSxvPWEmJmkuY29sbGFwc2libGUscj1vP2UoKTpuLm5leHQoKSxoPXMubmV4dCgpLGw9e29sZEhlYWRlcjpzLG9sZFBhbmVsOmgsbmV3SGVhZGVyOm8/ZSgpOm4sbmV3UGFuZWw6cn07dC5wcmV2ZW50RGVmYXVsdCgpLGEmJiFpLmNvbGxhcHNpYmxlfHx0aGlzLl90cmlnZ2VyKCJiZWZvcmVBY3RpdmF0ZSIsdCxsKT09PSExfHwoaS5hY3RpdmU9bz8hMTp0aGlzLmhlYWRlcnMuaW5kZXgobiksdGhpcy5hY3RpdmU9YT9lKCk6bix0aGlzLl90b2dnbGUobCkscy5yZW1vdmVDbGFzcygidWktYWNjb3JkaW9uLWhlYWRlci1hY3RpdmUgdWktc3RhdGUtYWN0aXZlIiksaS5pY29ucyYmcy5jaGlsZHJlbigiLnVpLWFjY29yZGlvbi1oZWFkZXItaWNvbiIpLnJlbW92ZUNsYXNzKGkuaWNvbnMuYWN0aXZlSGVhZGVyKS5hZGRDbGFzcyhpLmljb25zLmhlYWRlciksYXx8KG4ucmVtb3ZlQ2xhc3MoInVpLWNvcm5lci1hbGwiKS5hZGRDbGFzcygidWktYWNjb3JkaW9uLWhlYWRlci1hY3RpdmUgdWktc3RhdGUtYWN0aXZlIHVpLWNvcm5lci10b3AiKSxpLmljb25zJiZuLmNoaWxkcmVuKCIudWktYWNjb3JkaW9uLWhlYWRlci1pY29uIikucmVtb3ZlQ2xhc3MoaS5pY29ucy5oZWFkZXIpLmFkZENsYXNzKGkuaWNvbnMuYWN0aXZlSGVhZGVyKSxuLm5leHQoKS5hZGRDbGFzcygidWktYWNjb3JkaW9uLWNvbnRlbnQtYWN0aXZlIikpKX0sX3RvZ2dsZTpmdW5jdGlvbih0KXt2YXIgaT10Lm5ld1BhbmVsLHM9dGhpcy5wcmV2U2hvdy5sZW5ndGg/dGhpcy5wcmV2U2hvdzp0Lm9sZFBhbmVsO3RoaXMucHJldlNob3cuYWRkKHRoaXMucHJldkhpZGUpLnN0b3AoITAsITApLHRoaXMucHJldlNob3c9aSx0aGlzLnByZXZIaWRlPXMsdGhpcy5vcHRpb25zLmFuaW1hdGU/dGhpcy5fYW5pbWF0ZShpLHMsdCk6KHMuaGlkZSgpLGkuc2hvdygpLHRoaXMuX3RvZ2dsZUNvbXBsZXRlKHQpKSxzLmF0dHIoeyJhcmlhLWhpZGRlbiI6InRydWUifSkscy5wcmV2KCkuYXR0cih7ImFyaWEtc2VsZWN0ZWQiOiJmYWxzZSIsImFyaWEtZXhwYW5kZWQiOiJmYWxzZSJ9KSxpLmxlbmd0aCYmcy5sZW5ndGg/cy5wcmV2KCkuYXR0cih7dGFiSW5kZXg6LTEsImFyaWEtZXhwYW5kZWQiOiJmYWxzZSJ9KTppLmxlbmd0aCYmdGhpcy5oZWFkZXJzLmZpbHRlcihmdW5jdGlvbigpe3JldHVybiAwPT09cGFyc2VJbnQoZSh0aGlzKS5hdHRyKCJ0YWJJbmRleCIpLDEwKX0pLmF0dHIoInRhYkluZGV4IiwtMSksaS5hdHRyKCJhcmlhLWhpZGRlbiIsImZhbHNlIikucHJldigpLmF0dHIoeyJhcmlhLXNlbGVjdGVkIjoidHJ1ZSIsImFyaWEtZXhwYW5kZWQiOiJ0cnVlIix0YWJJbmRleDowfSl9LF9hbmltYXRlOmZ1bmN0aW9uKGUsdCxpKXt2YXIgcyxuLGEsbz10aGlzLHI9MCxoPWUuY3NzKCJib3gtc2l6aW5nIiksbD1lLmxlbmd0aCYmKCF0Lmxlbmd0aHx8ZS5pbmRleCgpPHQuaW5kZXgoKSksdT10aGlzLm9wdGlvbnMuYW5pbWF0ZXx8e30sZD1sJiZ1LmRvd258fHUsYz1mdW5jdGlvbigpe28uX3RvZ2dsZUNvbXBsZXRlKGkpfTtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIGQmJihhPWQpLCJzdHJpbmciPT10eXBlb2YgZCYmKG49ZCksbj1ufHxkLmVhc2luZ3x8dS5lYXNpbmcsYT1hfHxkLmR1cmF0aW9ufHx1LmR1cmF0aW9uLHQubGVuZ3RoP2UubGVuZ3RoPyhzPWUuc2hvdygpLm91dGVySGVpZ2h0KCksdC5hbmltYXRlKHRoaXMuaGlkZVByb3BzLHtkdXJhdGlvbjphLGVhc2luZzpuLHN0ZXA6ZnVuY3Rpb24oZSx0KXt0Lm5vdz1NYXRoLnJvdW5kKGUpfX0pLGUuaGlkZSgpLmFuaW1hdGUodGhpcy5zaG93UHJvcHMse2R1cmF0aW9uOmEsZWFzaW5nOm4sY29tcGxldGU6YyxzdGVwOmZ1bmN0aW9uKGUsaSl7aS5ub3c9TWF0aC5yb3VuZChlKSwiaGVpZ2h0IiE9PWkucHJvcD8iY29udGVudC1ib3giPT09aCYmKHIrPWkubm93KToiY29udGVudCIhPT1vLm9wdGlvbnMuaGVpZ2h0U3R5bGUmJihpLm5vdz1NYXRoLnJvdW5kKHMtdC5vdXRlckhlaWdodCgpLXIpLHI9MCl9fSksdm9pZCAwKTp0LmFuaW1hdGUodGhpcy5oaWRlUHJvcHMsYSxuLGMpOmUuYW5pbWF0ZSh0aGlzLnNob3dQcm9wcyxhLG4sYyl9LF90b2dnbGVDb21wbGV0ZTpmdW5jdGlvbihlKXt2YXIgdD1lLm9sZFBhbmVsO3QucmVtb3ZlQ2xhc3MoInVpLWFjY29yZGlvbi1jb250ZW50LWFjdGl2ZSIpLnByZXYoKS5yZW1vdmVDbGFzcygidWktY29ybmVyLXRvcCIpLmFkZENsYXNzKCJ1aS1jb3JuZXItYWxsIiksdC5sZW5ndGgmJih0LnBhcmVudCgpWzBdLmNsYXNzTmFtZT10LnBhcmVudCgpWzBdLmNsYXNzTmFtZSksdGhpcy5fdHJpZ2dlcigiYWN0aXZhdGUiLG51bGwsZSl9fSksZS53aWRnZXQoInVpLm1lbnUiLHt2ZXJzaW9uOiIxLjExLjQiLGRlZmF1bHRFbGVtZW50OiI8dWw+IixkZWxheTozMDAsb3B0aW9uczp7aWNvbnM6e3N1Ym1lbnU6InVpLWljb24tY2FyYXQtMS1lIn0saXRlbXM6Ij4gKiIsbWVudXM6InVsIixwb3NpdGlvbjp7bXk6ImxlZnQtMSB0b3AiLGF0OiJyaWdodCB0b3AifSxyb2xlOiJtZW51IixibHVyOm51bGwsZm9jdXM6bnVsbCxzZWxlY3Q6bnVsbH0sX2NyZWF0ZTpmdW5jdGlvbigpe3RoaXMuYWN0aXZlTWVudT10aGlzLmVsZW1lbnQsdGhpcy5tb3VzZUhhbmRsZWQ9ITEsdGhpcy5lbGVtZW50LnVuaXF1ZUlkKCkuYWRkQ2xhc3MoInVpLW1lbnUgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IikudG9nZ2xlQ2xhc3MoInVpLW1lbnUtaWNvbnMiLCEhdGhpcy5lbGVtZW50LmZpbmQoIi51aS1pY29uIikubGVuZ3RoKS5hdHRyKHtyb2xlOnRoaXMub3B0aW9ucy5yb2xlLHRhYkluZGV4OjB9KSx0aGlzLm9wdGlvbnMuZGlzYWJsZWQmJnRoaXMuZWxlbWVudC5hZGRDbGFzcygidWktc3RhdGUtZGlzYWJsZWQiKS5hdHRyKCJhcmlhLWRpc2FibGVkIiwidHJ1ZSIpLHRoaXMuX29uKHsibW91c2Vkb3duIC51aS1tZW51LWl0ZW0iOmZ1bmN0aW9uKGUpe2UucHJldmVudERlZmF1bHQoKX0sImNsaWNrIC51aS1tZW51LWl0ZW0iOmZ1bmN0aW9uKHQpe3ZhciBpPWUodC50YXJnZXQpOyF0aGlzLm1vdXNlSGFuZGxlZCYmaS5ub3QoIi51aS1zdGF0ZS1kaXNhYmxlZCIpLmxlbmd0aCYmKHRoaXMuc2VsZWN0KHQpLHQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKXx8KHRoaXMubW91c2VIYW5kbGVkPSEwKSxpLmhhcygiLnVpLW1lbnUiKS5sZW5ndGg/dGhpcy5leHBhbmQodCk6IXRoaXMuZWxlbWVudC5pcygiOmZvY3VzIikmJmUodGhpcy5kb2N1bWVudFswXS5hY3RpdmVFbGVtZW50KS5jbG9zZXN0KCIudWktbWVudSIpLmxlbmd0aCYmKHRoaXMuZWxlbWVudC50cmlnZ2VyKCJmb2N1cyIsWyEwXSksdGhpcy5hY3RpdmUmJjE9PT10aGlzLmFjdGl2ZS5wYXJlbnRzKCIudWktbWVudSIpLmxlbmd0aCYmY2xlYXJUaW1lb3V0KHRoaXMudGltZXIpKSl9LCJtb3VzZWVudGVyIC51aS1tZW51LWl0ZW0iOmZ1bmN0aW9uKHQpe2lmKCF0aGlzLnByZXZpb3VzRmlsdGVyKXt2YXIgaT1lKHQuY3VycmVudFRhcmdldCk7Cmkuc2libGluZ3MoIi51aS1zdGF0ZS1hY3RpdmUiKS5yZW1vdmVDbGFzcygidWktc3RhdGUtYWN0aXZlIiksdGhpcy5mb2N1cyh0LGkpfX0sbW91c2VsZWF2ZToiY29sbGFwc2VBbGwiLCJtb3VzZWxlYXZlIC51aS1tZW51IjoiY29sbGFwc2VBbGwiLGZvY3VzOmZ1bmN0aW9uKGUsdCl7dmFyIGk9dGhpcy5hY3RpdmV8fHRoaXMuZWxlbWVudC5maW5kKHRoaXMub3B0aW9ucy5pdGVtcykuZXEoMCk7dHx8dGhpcy5mb2N1cyhlLGkpfSxibHVyOmZ1bmN0aW9uKHQpe3RoaXMuX2RlbGF5KGZ1bmN0aW9uKCl7ZS5jb250YWlucyh0aGlzLmVsZW1lbnRbMF0sdGhpcy5kb2N1bWVudFswXS5hY3RpdmVFbGVtZW50KXx8dGhpcy5jb2xsYXBzZUFsbCh0KX0pfSxrZXlkb3duOiJfa2V5ZG93biJ9KSx0aGlzLnJlZnJlc2goKSx0aGlzLl9vbih0aGlzLmRvY3VtZW50LHtjbGljazpmdW5jdGlvbihlKXt0aGlzLl9jbG9zZU9uRG9jdW1lbnRDbGljayhlKSYmdGhpcy5jb2xsYXBzZUFsbChlKSx0aGlzLm1vdXNlSGFuZGxlZD0hMX19KX0sX2Rlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLmVsZW1lbnQucmVtb3ZlQXR0cigiYXJpYS1hY3RpdmVkZXNjZW5kYW50IikuZmluZCgiLnVpLW1lbnUiKS5hZGRCYWNrKCkucmVtb3ZlQ2xhc3MoInVpLW1lbnUgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLW1lbnUtaWNvbnMgdWktZnJvbnQiKS5yZW1vdmVBdHRyKCJyb2xlIikucmVtb3ZlQXR0cigidGFiSW5kZXgiKS5yZW1vdmVBdHRyKCJhcmlhLWxhYmVsbGVkYnkiKS5yZW1vdmVBdHRyKCJhcmlhLWV4cGFuZGVkIikucmVtb3ZlQXR0cigiYXJpYS1oaWRkZW4iKS5yZW1vdmVBdHRyKCJhcmlhLWRpc2FibGVkIikucmVtb3ZlVW5pcXVlSWQoKS5zaG93KCksdGhpcy5lbGVtZW50LmZpbmQoIi51aS1tZW51LWl0ZW0iKS5yZW1vdmVDbGFzcygidWktbWVudS1pdGVtIikucmVtb3ZlQXR0cigicm9sZSIpLnJlbW92ZUF0dHIoImFyaWEtZGlzYWJsZWQiKS5yZW1vdmVVbmlxdWVJZCgpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1ob3ZlciIpLnJlbW92ZUF0dHIoInRhYkluZGV4IikucmVtb3ZlQXR0cigicm9sZSIpLnJlbW92ZUF0dHIoImFyaWEtaGFzcG9wdXAiKS5jaGlsZHJlbigpLmVhY2goZnVuY3Rpb24oKXt2YXIgdD1lKHRoaXMpO3QuZGF0YSgidWktbWVudS1zdWJtZW51LWNhcmF0IikmJnQucmVtb3ZlKCl9KSx0aGlzLmVsZW1lbnQuZmluZCgiLnVpLW1lbnUtZGl2aWRlciIpLnJlbW92ZUNsYXNzKCJ1aS1tZW51LWRpdmlkZXIgdWktd2lkZ2V0LWNvbnRlbnQiKX0sX2tleWRvd246ZnVuY3Rpb24odCl7dmFyIGkscyxuLGEsbz0hMDtzd2l0Y2godC5rZXlDb2RlKXtjYXNlIGUudWkua2V5Q29kZS5QQUdFX1VQOnRoaXMucHJldmlvdXNQYWdlKHQpO2JyZWFrO2Nhc2UgZS51aS5rZXlDb2RlLlBBR0VfRE9XTjp0aGlzLm5leHRQYWdlKHQpO2JyZWFrO2Nhc2UgZS51aS5rZXlDb2RlLkhPTUU6dGhpcy5fbW92ZSgiZmlyc3QiLCJmaXJzdCIsdCk7YnJlYWs7Y2FzZSBlLnVpLmtleUNvZGUuRU5EOnRoaXMuX21vdmUoImxhc3QiLCJsYXN0Iix0KTticmVhaztjYXNlIGUudWkua2V5Q29kZS5VUDp0aGlzLnByZXZpb3VzKHQpO2JyZWFrO2Nhc2UgZS51aS5rZXlDb2RlLkRPV046dGhpcy5uZXh0KHQpO2JyZWFrO2Nhc2UgZS51aS5rZXlDb2RlLkxFRlQ6dGhpcy5jb2xsYXBzZSh0KTticmVhaztjYXNlIGUudWkua2V5Q29kZS5SSUdIVDp0aGlzLmFjdGl2ZSYmIXRoaXMuYWN0aXZlLmlzKCIudWktc3RhdGUtZGlzYWJsZWQiKSYmdGhpcy5leHBhbmQodCk7YnJlYWs7Y2FzZSBlLnVpLmtleUNvZGUuRU5URVI6Y2FzZSBlLnVpLmtleUNvZGUuU1BBQ0U6dGhpcy5fYWN0aXZhdGUodCk7YnJlYWs7Y2FzZSBlLnVpLmtleUNvZGUuRVNDQVBFOnRoaXMuY29sbGFwc2UodCk7YnJlYWs7ZGVmYXVsdDpvPSExLHM9dGhpcy5wcmV2aW91c0ZpbHRlcnx8IiIsbj1TdHJpbmcuZnJvbUNoYXJDb2RlKHQua2V5Q29kZSksYT0hMSxjbGVhclRpbWVvdXQodGhpcy5maWx0ZXJUaW1lciksbj09PXM/YT0hMDpuPXMrbixpPXRoaXMuX2ZpbHRlck1lbnVJdGVtcyhuKSxpPWEmJi0xIT09aS5pbmRleCh0aGlzLmFjdGl2ZS5uZXh0KCkpP3RoaXMuYWN0aXZlLm5leHRBbGwoIi51aS1tZW51LWl0ZW0iKTppLGkubGVuZ3RofHwobj1TdHJpbmcuZnJvbUNoYXJDb2RlKHQua2V5Q29kZSksaT10aGlzLl9maWx0ZXJNZW51SXRlbXMobikpLGkubGVuZ3RoPyh0aGlzLmZvY3VzKHQsaSksdGhpcy5wcmV2aW91c0ZpbHRlcj1uLHRoaXMuZmlsdGVyVGltZXI9dGhpcy5fZGVsYXkoZnVuY3Rpb24oKXtkZWxldGUgdGhpcy5wcmV2aW91c0ZpbHRlcn0sMWUzKSk6ZGVsZXRlIHRoaXMucHJldmlvdXNGaWx0ZXJ9byYmdC5wcmV2ZW50RGVmYXVsdCgpfSxfYWN0aXZhdGU6ZnVuY3Rpb24oZSl7dGhpcy5hY3RpdmUuaXMoIi51aS1zdGF0ZS1kaXNhYmxlZCIpfHwodGhpcy5hY3RpdmUuaXMoIlthcmlhLWhhc3BvcHVwPSd0cnVlJ10iKT90aGlzLmV4cGFuZChlKTp0aGlzLnNlbGVjdChlKSl9LHJlZnJlc2g6ZnVuY3Rpb24oKXt2YXIgdCxpLHM9dGhpcyxuPXRoaXMub3B0aW9ucy5pY29ucy5zdWJtZW51LGE9dGhpcy5lbGVtZW50LmZpbmQodGhpcy5vcHRpb25zLm1lbnVzKTt0aGlzLmVsZW1lbnQudG9nZ2xlQ2xhc3MoInVpLW1lbnUtaWNvbnMiLCEhdGhpcy5lbGVtZW50LmZpbmQoIi51aS1pY29uIikubGVuZ3RoKSxhLmZpbHRlcigiOm5vdCgudWktbWVudSkiKS5hZGRDbGFzcygidWktbWVudSB1aS13aWRnZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktZnJvbnQiKS5oaWRlKCkuYXR0cih7cm9sZTp0aGlzLm9wdGlvbnMucm9sZSwiYXJpYS1oaWRkZW4iOiJ0cnVlIiwiYXJpYS1leHBhbmRlZCI6ImZhbHNlIn0pLmVhY2goZnVuY3Rpb24oKXt2YXIgdD1lKHRoaXMpLGk9dC5wYXJlbnQoKSxzPWUoIjxzcGFuPiIpLmFkZENsYXNzKCJ1aS1tZW51LWljb24gdWktaWNvbiAiK24pLmRhdGEoInVpLW1lbnUtc3VibWVudS1jYXJhdCIsITApO2kuYXR0cigiYXJpYS1oYXNwb3B1cCIsInRydWUiKS5wcmVwZW5kKHMpLHQuYXR0cigiYXJpYS1sYWJlbGxlZGJ5IixpLmF0dHIoImlkIikpfSksdD1hLmFkZCh0aGlzLmVsZW1lbnQpLGk9dC5maW5kKHRoaXMub3B0aW9ucy5pdGVtcyksaS5ub3QoIi51aS1tZW51LWl0ZW0iKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9ZSh0aGlzKTtzLl9pc0RpdmlkZXIodCkmJnQuYWRkQ2xhc3MoInVpLXdpZGdldC1jb250ZW50IHVpLW1lbnUtZGl2aWRlciIpfSksaS5ub3QoIi51aS1tZW51LWl0ZW0sIC51aS1tZW51LWRpdmlkZXIiKS5hZGRDbGFzcygidWktbWVudS1pdGVtIikudW5pcXVlSWQoKS5hdHRyKHt0YWJJbmRleDotMSxyb2xlOnRoaXMuX2l0ZW1Sb2xlKCl9KSxpLmZpbHRlcigiLnVpLXN0YXRlLWRpc2FibGVkIikuYXR0cigiYXJpYS1kaXNhYmxlZCIsInRydWUiKSx0aGlzLmFjdGl2ZSYmIWUuY29udGFpbnModGhpcy5lbGVtZW50WzBdLHRoaXMuYWN0aXZlWzBdKSYmdGhpcy5ibHVyKCl9LF9pdGVtUm9sZTpmdW5jdGlvbigpe3JldHVybnttZW51OiJtZW51aXRlbSIsbGlzdGJveDoib3B0aW9uIn1bdGhpcy5vcHRpb25zLnJvbGVdfSxfc2V0T3B0aW9uOmZ1bmN0aW9uKGUsdCl7Imljb25zIj09PWUmJnRoaXMuZWxlbWVudC5maW5kKCIudWktbWVudS1pY29uIikucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLmljb25zLnN1Ym1lbnUpLmFkZENsYXNzKHQuc3VibWVudSksImRpc2FibGVkIj09PWUmJnRoaXMuZWxlbWVudC50b2dnbGVDbGFzcygidWktc3RhdGUtZGlzYWJsZWQiLCEhdCkuYXR0cigiYXJpYS1kaXNhYmxlZCIsdCksdGhpcy5fc3VwZXIoZSx0KX0sZm9jdXM6ZnVuY3Rpb24oZSx0KXt2YXIgaSxzO3RoaXMuYmx1cihlLGUmJiJmb2N1cyI9PT1lLnR5cGUpLHRoaXMuX3Njcm9sbEludG9WaWV3KHQpLHRoaXMuYWN0aXZlPXQuZmlyc3QoKSxzPXRoaXMuYWN0aXZlLmFkZENsYXNzKCJ1aS1zdGF0ZS1mb2N1cyIpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKSx0aGlzLm9wdGlvbnMucm9sZSYmdGhpcy5lbGVtZW50LmF0dHIoImFyaWEtYWN0aXZlZGVzY2VuZGFudCIscy5hdHRyKCJpZCIpKSx0aGlzLmFjdGl2ZS5wYXJlbnQoKS5jbG9zZXN0KCIudWktbWVudS1pdGVtIikuYWRkQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpLGUmJiJrZXlkb3duIj09PWUudHlwZT90aGlzLl9jbG9zZSgpOnRoaXMudGltZXI9dGhpcy5fZGVsYXkoZnVuY3Rpb24oKXt0aGlzLl9jbG9zZSgpfSx0aGlzLmRlbGF5KSxpPXQuY2hpbGRyZW4oIi51aS1tZW51IiksaS5sZW5ndGgmJmUmJi9ebW91c2UvLnRlc3QoZS50eXBlKSYmdGhpcy5fc3RhcnRPcGVuaW5nKGkpLHRoaXMuYWN0aXZlTWVudT10LnBhcmVudCgpLHRoaXMuX3RyaWdnZXIoImZvY3VzIixlLHtpdGVtOnR9KX0sX3Njcm9sbEludG9WaWV3OmZ1bmN0aW9uKHQpe3ZhciBpLHMsbixhLG8scjt0aGlzLl9oYXNTY3JvbGwoKSYmKGk9cGFyc2VGbG9hdChlLmNzcyh0aGlzLmFjdGl2ZU1lbnVbMF0sImJvcmRlclRvcFdpZHRoIikpfHwwLHM9cGFyc2VGbG9hdChlLmNzcyh0aGlzLmFjdGl2ZU1lbnVbMF0sInBhZGRpbmdUb3AiKSl8fDAsbj10Lm9mZnNldCgpLnRvcC10aGlzLmFjdGl2ZU1lbnUub2Zmc2V0KCkudG9wLWktcyxhPXRoaXMuYWN0aXZlTWVudS5zY3JvbGxUb3AoKSxvPXRoaXMuYWN0aXZlTWVudS5oZWlnaHQoKSxyPXQub3V0ZXJIZWlnaHQoKSwwPm4/dGhpcy5hY3RpdmVNZW51LnNjcm9sbFRvcChhK24pOm4rcj5vJiZ0aGlzLmFjdGl2ZU1lbnUuc2Nyb2xsVG9wKGErbi1vK3IpKX0sYmx1cjpmdW5jdGlvbihlLHQpe3R8fGNsZWFyVGltZW91dCh0aGlzLnRpbWVyKSx0aGlzLmFjdGl2ZSYmKHRoaXMuYWN0aXZlLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1mb2N1cyIpLHRoaXMuYWN0aXZlPW51bGwsdGhpcy5fdHJpZ2dlcigiYmx1ciIsZSx7aXRlbTp0aGlzLmFjdGl2ZX0pKX0sX3N0YXJ0T3BlbmluZzpmdW5jdGlvbihlKXtjbGVhclRpbWVvdXQodGhpcy50aW1lciksInRydWUiPT09ZS5hdHRyKCJhcmlhLWhpZGRlbiIpJiYodGhpcy50aW1lcj10aGlzLl9kZWxheShmdW5jdGlvbigpe3RoaXMuX2Nsb3NlKCksdGhpcy5fb3BlbihlKX0sdGhpcy5kZWxheSkpfSxfb3BlbjpmdW5jdGlvbih0KXt2YXIgaT1lLmV4dGVuZCh7b2Y6dGhpcy5hY3RpdmV9LHRoaXMub3B0aW9ucy5wb3NpdGlvbik7Y2xlYXJUaW1lb3V0KHRoaXMudGltZXIpLHRoaXMuZWxlbWVudC5maW5kKCIudWktbWVudSIpLm5vdCh0LnBhcmVudHMoIi51aS1tZW51IikpLmhpZGUoKS5hdHRyKCJhcmlhLWhpZGRlbiIsInRydWUiKSx0LnNob3coKS5yZW1vdmVBdHRyKCJhcmlhLWhpZGRlbiIpLmF0dHIoImFyaWEtZXhwYW5kZWQiLCJ0cnVlIikucG9zaXRpb24oaSl9LGNvbGxhcHNlQWxsOmZ1bmN0aW9uKHQsaSl7Y2xlYXJUaW1lb3V0KHRoaXMudGltZXIpLHRoaXMudGltZXI9dGhpcy5fZGVsYXkoZnVuY3Rpb24oKXt2YXIgcz1pP3RoaXMuZWxlbWVudDplKHQmJnQudGFyZ2V0KS5jbG9zZXN0KHRoaXMuZWxlbWVudC5maW5kKCIudWktbWVudSIpKTtzLmxlbmd0aHx8KHM9dGhpcy5lbGVtZW50KSx0aGlzLl9jbG9zZShzKSx0aGlzLmJsdXIodCksdGhpcy5hY3RpdmVNZW51PXN9LHRoaXMuZGVsYXkpfSxfY2xvc2U6ZnVuY3Rpb24oZSl7ZXx8KGU9dGhpcy5hY3RpdmU/dGhpcy5hY3RpdmUucGFyZW50KCk6dGhpcy5lbGVtZW50KSxlLmZpbmQoIi51aS1tZW51IikuaGlkZSgpLmF0dHIoImFyaWEtaGlkZGVuIiwidHJ1ZSIpLmF0dHIoImFyaWEtZXhwYW5kZWQiLCJmYWxzZSIpLmVuZCgpLmZpbmQoIi51aS1zdGF0ZS1hY3RpdmUiKS5ub3QoIi51aS1zdGF0ZS1mb2N1cyIpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKX0sX2Nsb3NlT25Eb2N1bWVudENsaWNrOmZ1bmN0aW9uKHQpe3JldHVybiFlKHQudGFyZ2V0KS5jbG9zZXN0KCIudWktbWVudSIpLmxlbmd0aH0sX2lzRGl2aWRlcjpmdW5jdGlvbihlKXtyZXR1cm4hL1teXC1cdTIwMTRcdTIwMTNcc10vLnRlc3QoZS50ZXh0KCkpfSxjb2xsYXBzZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLmFjdGl2ZSYmdGhpcy5hY3RpdmUucGFyZW50KCkuY2xvc2VzdCgiLnVpLW1lbnUtaXRlbSIsdGhpcy5lbGVtZW50KTt0JiZ0Lmxlbmd0aCYmKHRoaXMuX2Nsb3NlKCksdGhpcy5mb2N1cyhlLHQpKX0sZXhwYW5kOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuYWN0aXZlJiZ0aGlzLmFjdGl2ZS5jaGlsZHJlbigiLnVpLW1lbnUgIikuZmluZCh0aGlzLm9wdGlvbnMuaXRlbXMpLmZpcnN0KCk7dCYmdC5sZW5ndGgmJih0aGlzLl9vcGVuKHQucGFyZW50KCkpLHRoaXMuX2RlbGF5KGZ1bmN0aW9uKCl7dGhpcy5mb2N1cyhlLHQpfSkpfSxuZXh0OmZ1bmN0aW9uKGUpe3RoaXMuX21vdmUoIm5leHQiLCJmaXJzdCIsZSl9LHByZXZpb3VzOmZ1bmN0aW9uKGUpe3RoaXMuX21vdmUoInByZXYiLCJsYXN0IixlKX0saXNGaXJzdEl0ZW06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hY3RpdmUmJiF0aGlzLmFjdGl2ZS5wcmV2QWxsKCIudWktbWVudS1pdGVtIikubGVuZ3RofSxpc0xhc3RJdGVtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYWN0aXZlJiYhdGhpcy5hY3RpdmUubmV4dEFsbCgiLnVpLW1lbnUtaXRlbSIpLmxlbmd0aH0sX21vdmU6ZnVuY3Rpb24oZSx0LGkpe3ZhciBzO3RoaXMuYWN0aXZlJiYocz0iZmlyc3QiPT09ZXx8Imxhc3QiPT09ZT90aGlzLmFjdGl2ZVsiZmlyc3QiPT09ZT8icHJldkFsbCI6Im5leHRBbGwiXSgiLnVpLW1lbnUtaXRlbSIpLmVxKC0xKTp0aGlzLmFjdGl2ZVtlKyJBbGwiXSgiLnVpLW1lbnUtaXRlbSIpLmVxKDApKSxzJiZzLmxlbmd0aCYmdGhpcy5hY3RpdmV8fChzPXRoaXMuYWN0aXZlTWVudS5maW5kKHRoaXMub3B0aW9ucy5pdGVtcylbdF0oKSksdGhpcy5mb2N1cyhpLHMpfSxuZXh0UGFnZTpmdW5jdGlvbih0KXt2YXIgaSxzLG47cmV0dXJuIHRoaXMuYWN0aXZlPyh0aGlzLmlzTGFzdEl0ZW0oKXx8KHRoaXMuX2hhc1Njcm9sbCgpPyhzPXRoaXMuYWN0aXZlLm9mZnNldCgpLnRvcCxuPXRoaXMuZWxlbWVudC5oZWlnaHQoKSx0aGlzLmFjdGl2ZS5uZXh0QWxsKCIudWktbWVudS1pdGVtIikuZWFjaChmdW5jdGlvbigpe3JldHVybiBpPWUodGhpcyksMD5pLm9mZnNldCgpLnRvcC1zLW59KSx0aGlzLmZvY3VzKHQsaSkpOnRoaXMuZm9jdXModCx0aGlzLmFjdGl2ZU1lbnUuZmluZCh0aGlzLm9wdGlvbnMuaXRlbXMpW3RoaXMuYWN0aXZlPyJsYXN0IjoiZmlyc3QiXSgpKSksdm9pZCAwKToodGhpcy5uZXh0KHQpLHZvaWQgMCl9LHByZXZpb3VzUGFnZTpmdW5jdGlvbih0KXt2YXIgaSxzLG47cmV0dXJuIHRoaXMuYWN0aXZlPyh0aGlzLmlzRmlyc3RJdGVtKCl8fCh0aGlzLl9oYXNTY3JvbGwoKT8ocz10aGlzLmFjdGl2ZS5vZmZzZXQoKS50b3Asbj10aGlzLmVsZW1lbnQuaGVpZ2h0KCksdGhpcy5hY3RpdmUucHJldkFsbCgiLnVpLW1lbnUtaXRlbSIpLmVhY2goZnVuY3Rpb24oKXtyZXR1cm4gaT1lKHRoaXMpLGkub2Zmc2V0KCkudG9wLXMrbj4wfSksdGhpcy5mb2N1cyh0LGkpKTp0aGlzLmZvY3VzKHQsdGhpcy5hY3RpdmVNZW51LmZpbmQodGhpcy5vcHRpb25zLml0ZW1zKS5maXJzdCgpKSksdm9pZCAwKToodGhpcy5uZXh0KHQpLHZvaWQgMCl9LF9oYXNTY3JvbGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbGVtZW50Lm91dGVySGVpZ2h0KCk8dGhpcy5lbGVtZW50LnByb3AoInNjcm9sbEhlaWdodCIpfSxzZWxlY3Q6ZnVuY3Rpb24odCl7dGhpcy5hY3RpdmU9dGhpcy5hY3RpdmV8fGUodC50YXJnZXQpLmNsb3Nlc3QoIi51aS1tZW51LWl0ZW0iKTt2YXIgaT17aXRlbTp0aGlzLmFjdGl2ZX07dGhpcy5hY3RpdmUuaGFzKCIudWktbWVudSIpLmxlbmd0aHx8dGhpcy5jb2xsYXBzZUFsbCh0LCEwKSx0aGlzLl90cmlnZ2VyKCJzZWxlY3QiLHQsaSl9LF9maWx0ZXJNZW51SXRlbXM6ZnVuY3Rpb24odCl7dmFyIGk9dC5yZXBsYWNlKC9bXC1cW1xde30oKSorPy4sXFxcXiR8I1xzXS9nLCJcXCQmIikscz1SZWdFeHAoIl4iK2ksImkiKTtyZXR1cm4gdGhpcy5hY3RpdmVNZW51LmZpbmQodGhpcy5vcHRpb25zLml0ZW1zKS5maWx0ZXIoIi51aS1tZW51LWl0ZW0iKS5maWx0ZXIoZnVuY3Rpb24oKXtyZXR1cm4gcy50ZXN0KGUudHJpbShlKHRoaXMpLnRleHQoKSkpfSl9fSksZS53aWRnZXQoInVpLmF1dG9jb21wbGV0ZSIse3ZlcnNpb246IjEuMTEuNCIsZGVmYXVsdEVsZW1lbnQ6IjxpbnB1dD4iLG9wdGlvbnM6e2FwcGVuZFRvOm51bGwsYXV0b0ZvY3VzOiExLGRlbGF5OjMwMCxtaW5MZW5ndGg6MSxwb3NpdGlvbjp7bXk6ImxlZnQgdG9wIixhdDoibGVmdCBib3R0b20iLGNvbGxpc2lvbjoibm9uZSJ9LHNvdXJjZTpudWxsLGNoYW5nZTpudWxsLGNsb3NlOm51bGwsZm9jdXM6bnVsbCxvcGVuOm51bGwscmVzcG9uc2U6bnVsbCxzZWFyY2g6bnVsbCxzZWxlY3Q6bnVsbH0scmVxdWVzdEluZGV4OjAscGVuZGluZzowLF9jcmVhdGU6ZnVuY3Rpb24oKXt2YXIgdCxpLHMsbj10aGlzLmVsZW1lbnRbMF0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxhPSJ0ZXh0YXJlYSI9PT1uLG89ImlucHV0Ij09PW47dGhpcy5pc011bHRpTGluZT1hPyEwOm8/ITE6dGhpcy5lbGVtZW50LnByb3AoImlzQ29udGVudEVkaXRhYmxlIiksdGhpcy52YWx1ZU1ldGhvZD10aGlzLmVsZW1lbnRbYXx8bz8idmFsIjoidGV4dCJdLHRoaXMuaXNOZXdNZW51PSEwLHRoaXMuZWxlbWVudC5hZGRDbGFzcygidWktYXV0b2NvbXBsZXRlLWlucHV0IikuYXR0cigiYXV0b2NvbXBsZXRlIiwib2ZmIiksdGhpcy5fb24odGhpcy5lbGVtZW50LHtrZXlkb3duOmZ1bmN0aW9uKG4pe2lmKHRoaXMuZWxlbWVudC5wcm9wKCJyZWFkT25seSIpKXJldHVybiB0PSEwLHM9ITAsaT0hMCx2b2lkIDA7dD0hMSxzPSExLGk9ITE7dmFyIGE9ZS51aS5rZXlDb2RlO3N3aXRjaChuLmtleUNvZGUpe2Nhc2UgYS5QQUdFX1VQOnQ9ITAsdGhpcy5fbW92ZSgicHJldmlvdXNQYWdlIixuKTticmVhaztjYXNlIGEuUEFHRV9ET1dOOnQ9ITAsdGhpcy5fbW92ZSgibmV4dFBhZ2UiLG4pO2JyZWFrO2Nhc2UgYS5VUDp0PSEwLHRoaXMuX2tleUV2ZW50KCJwcmV2aW91cyIsbik7YnJlYWs7Y2FzZSBhLkRPV046dD0hMCx0aGlzLl9rZXlFdmVudCgibmV4dCIsbik7YnJlYWs7Y2FzZSBhLkVOVEVSOnRoaXMubWVudS5hY3RpdmUmJih0PSEwLG4ucHJldmVudERlZmF1bHQoKSx0aGlzLm1lbnUuc2VsZWN0KG4pKTticmVhaztjYXNlIGEuVEFCOnRoaXMubWVudS5hY3RpdmUmJnRoaXMubWVudS5zZWxlY3Qobik7YnJlYWs7Y2FzZSBhLkVTQ0FQRTp0aGlzLm1lbnUuZWxlbWVudC5pcygiOnZpc2libGUiKSYmKHRoaXMuaXNNdWx0aUxpbmV8fHRoaXMuX3ZhbHVlKHRoaXMudGVybSksdGhpcy5jbG9zZShuKSxuLnByZXZlbnREZWZhdWx0KCkpO2JyZWFrO2RlZmF1bHQ6aT0hMCx0aGlzLl9zZWFyY2hUaW1lb3V0KG4pfX0sa2V5cHJlc3M6ZnVuY3Rpb24ocyl7aWYodClyZXR1cm4gdD0hMSwoIXRoaXMuaXNNdWx0aUxpbmV8fHRoaXMubWVudS5lbGVtZW50LmlzKCI6dmlzaWJsZSIpKSYmcy5wcmV2ZW50RGVmYXVsdCgpLHZvaWQgMDtpZighaSl7dmFyIG49ZS51aS5rZXlDb2RlO3N3aXRjaChzLmtleUNvZGUpe2Nhc2Ugbi5QQUdFX1VQOnRoaXMuX21vdmUoInByZXZpb3VzUGFnZSIscyk7YnJlYWs7Y2FzZSBuLlBBR0VfRE9XTjp0aGlzLl9tb3ZlKCJuZXh0UGFnZSIscyk7YnJlYWs7Y2FzZSBuLlVQOnRoaXMuX2tleUV2ZW50KCJwcmV2aW91cyIscyk7YnJlYWs7Y2FzZSBuLkRPV046dGhpcy5fa2V5RXZlbnQoIm5leHQiLHMpfX19LGlucHV0OmZ1bmN0aW9uKGUpe3JldHVybiBzPyhzPSExLGUucHJldmVudERlZmF1bHQoKSx2b2lkIDApOih0aGlzLl9zZWFyY2hUaW1lb3V0KGUpLHZvaWQgMCl9LGZvY3VzOmZ1bmN0aW9uKCl7dGhpcy5zZWxlY3RlZEl0ZW09bnVsbCx0aGlzLnByZXZpb3VzPXRoaXMuX3ZhbHVlKCl9LGJsdXI6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuY2FuY2VsQmx1cj8oZGVsZXRlIHRoaXMuY2FuY2VsQmx1cix2b2lkIDApOihjbGVhclRpbWVvdXQodGhpcy5zZWFyY2hpbmcpLHRoaXMuY2xvc2UoZSksdGhpcy5fY2hhbmdlKGUpLHZvaWQgMCl9fSksdGhpcy5faW5pdFNvdXJjZSgpLHRoaXMubWVudT1lKCI8dWw+IikuYWRkQ2xhc3MoInVpLWF1dG9jb21wbGV0ZSB1aS1mcm9udCIpLmFwcGVuZFRvKHRoaXMuX2FwcGVuZFRvKCkpLm1lbnUoe3JvbGU6bnVsbH0pLmhpZGUoKS5tZW51KCJpbnN0YW5jZSIpLHRoaXMuX29uKHRoaXMubWVudS5lbGVtZW50LHttb3VzZWRvd246ZnVuY3Rpb24odCl7dC5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuY2FuY2VsQmx1cj0hMCx0aGlzLl9kZWxheShmdW5jdGlvbigpe2RlbGV0ZSB0aGlzLmNhbmNlbEJsdXJ9KTt2YXIgaT10aGlzLm1lbnUuZWxlbWVudFswXTtlKHQudGFyZ2V0KS5jbG9zZXN0KCIudWktbWVudS1pdGVtIikubGVuZ3RofHx0aGlzLl9kZWxheShmdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5kb2N1bWVudC5vbmUoIm1vdXNlZG93biIsZnVuY3Rpb24ocyl7cy50YXJnZXQ9PT10LmVsZW1lbnRbMF18fHMudGFyZ2V0PT09aXx8ZS5jb250YWlucyhpLHMudGFyZ2V0KXx8dC5jbG9zZSgpfSl9KX0sbWVudWZvY3VzOmZ1bmN0aW9uKHQsaSl7dmFyIHMsbjtyZXR1cm4gdGhpcy5pc05ld01lbnUmJih0aGlzLmlzTmV3TWVudT0hMSx0Lm9yaWdpbmFsRXZlbnQmJi9ebW91c2UvLnRlc3QodC5vcmlnaW5hbEV2ZW50LnR5cGUpKT8odGhpcy5tZW51LmJsdXIoKSx0aGlzLmRvY3VtZW50Lm9uZSgibW91c2Vtb3ZlIixmdW5jdGlvbigpe2UodC50YXJnZXQpLnRyaWdnZXIodC5vcmlnaW5hbEV2ZW50KX0pLHZvaWQgMCk6KG49aS5pdGVtLmRhdGEoInVpLWF1dG9jb21wbGV0ZS1pdGVtIiksITEhPT10aGlzLl90cmlnZ2VyKCJmb2N1cyIsdCx7aXRlbTpufSkmJnQub3JpZ2luYWxFdmVudCYmL15rZXkvLnRlc3QodC5vcmlnaW5hbEV2ZW50LnR5cGUpJiZ0aGlzLl92YWx1ZShuLnZhbHVlKSxzPWkuaXRlbS5hdHRyKCJhcmlhLWxhYmVsIil8fG4udmFsdWUscyYmZS50cmltKHMpLmxlbmd0aCYmKHRoaXMubGl2ZVJlZ2lvbi5jaGlsZHJlbigpLmhpZGUoKSxlKCI8ZGl2PiIpLnRleHQocykuYXBwZW5kVG8odGhpcy5saXZlUmVnaW9uKSksdm9pZCAwKX0sbWVudXNlbGVjdDpmdW5jdGlvbihlLHQpe3ZhciBpPXQuaXRlbS5kYXRhKCJ1aS1hdXRvY29tcGxldGUtaXRlbSIpLHM9dGhpcy5wcmV2aW91czt0aGlzLmVsZW1lbnRbMF0hPT10aGlzLmRvY3VtZW50WzBdLmFjdGl2ZUVsZW1lbnQmJih0aGlzLmVsZW1lbnQuZm9jdXMoKSx0aGlzLnByZXZpb3VzPXMsdGhpcy5fZGVsYXkoZnVuY3Rpb24oKXt0aGlzLnByZXZpb3VzPXMsdGhpcy5zZWxlY3RlZEl0ZW09aX0pKSwhMSE9PXRoaXMuX3RyaWdnZXIoInNlbGVjdCIsZSx7aXRlbTppfSkmJnRoaXMuX3ZhbHVlKGkudmFsdWUpLHRoaXMudGVybT10aGlzLl92YWx1ZSgpLHRoaXMuY2xvc2UoZSksdGhpcy5zZWxlY3RlZEl0ZW09aX19KSx0aGlzLmxpdmVSZWdpb249ZSgiPHNwYW4+Iix7cm9sZToic3RhdHVzIiwiYXJpYS1saXZlIjoiYXNzZXJ0aXZlIiwiYXJpYS1yZWxldmFudCI6ImFkZGl0aW9ucyJ9KS5hZGRDbGFzcygidWktaGVscGVyLWhpZGRlbi1hY2Nlc3NpYmxlIikuYXBwZW5kVG8odGhpcy5kb2N1bWVudFswXS5ib2R5KSx0aGlzLl9vbih0aGlzLndpbmRvdyx7YmVmb3JldW5sb2FkOmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LnJlbW92ZUF0dHIoImF1dG9jb21wbGV0ZSIpfX0pfSxfZGVzdHJveTpmdW5jdGlvbigpe2NsZWFyVGltZW91dCh0aGlzLnNlYXJjaGluZyksdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1hdXRvY29tcGxldGUtaW5wdXQiKS5yZW1vdmVBdHRyKCJhdXRvY29tcGxldGUiKSx0aGlzLm1lbnUuZWxlbWVudC5yZW1vdmUoKSx0aGlzLmxpdmVSZWdpb24ucmVtb3ZlKCl9LF9zZXRPcHRpb246ZnVuY3Rpb24oZSx0KXt0aGlzLl9zdXBlcihlLHQpLCJzb3VyY2UiPT09ZSYmdGhpcy5faW5pdFNvdXJjZSgpLCJhcHBlbmRUbyI9PT1lJiZ0aGlzLm1lbnUuZWxlbWVudC5hcHBlbmRUbyh0aGlzLl9hcHBlbmRUbygpKSwiZGlzYWJsZWQiPT09ZSYmdCYmdGhpcy54aHImJnRoaXMueGhyLmFib3J0KCl9LF9hcHBlbmRUbzpmdW5jdGlvbigpe3ZhciB0PXRoaXMub3B0aW9ucy5hcHBlbmRUbztyZXR1cm4gdCYmKHQ9dC5qcXVlcnl8fHQubm9kZVR5cGU/ZSh0KTp0aGlzLmRvY3VtZW50LmZpbmQodCkuZXEoMCkpLHQmJnRbMF18fCh0PXRoaXMuZWxlbWVudC5jbG9zZXN0KCIudWktZnJvbnQiKSksdC5sZW5ndGh8fCh0PXRoaXMuZG9jdW1lbnRbMF0uYm9keSksdH0sX2luaXRTb3VyY2U6ZnVuY3Rpb24oKXt2YXIgdCxpLHM9dGhpcztlLmlzQXJyYXkodGhpcy5vcHRpb25zLnNvdXJjZSk/KHQ9dGhpcy5vcHRpb25zLnNvdXJjZSx0aGlzLnNvdXJjZT1mdW5jdGlvbihpLHMpe3MoZS51aS5hdXRvY29tcGxldGUuZmlsdGVyKHQsaS50ZXJtKSl9KToic3RyaW5nIj09dHlwZW9mIHRoaXMub3B0aW9ucy5zb3VyY2U/KGk9dGhpcy5vcHRpb25zLnNvdXJjZSx0aGlzLnNvdXJjZT1mdW5jdGlvbih0LG4pe3MueGhyJiZzLnhoci5hYm9ydCgpLHMueGhyPWUuYWpheCh7dXJsOmksZGF0YTp0LGRhdGFUeXBlOiJqc29uIixzdWNjZXNzOmZ1bmN0aW9uKGUpe24oZSl9LGVycm9yOmZ1bmN0aW9uKCl7bihbXSl9fSl9KTp0aGlzLnNvdXJjZT10aGlzLm9wdGlvbnMuc291cmNlfSxfc2VhcmNoVGltZW91dDpmdW5jdGlvbihlKXtjbGVhclRpbWVvdXQodGhpcy5zZWFyY2hpbmcpLHRoaXMuc2VhcmNoaW5nPXRoaXMuX2RlbGF5KGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy50ZXJtPT09dGhpcy5fdmFsdWUoKSxpPXRoaXMubWVudS5lbGVtZW50LmlzKCI6dmlzaWJsZSIpLHM9ZS5hbHRLZXl8fGUuY3RybEtleXx8ZS5tZXRhS2V5fHxlLnNoaWZ0S2V5OyghdHx8dCYmIWkmJiFzKSYmKHRoaXMuc2VsZWN0ZWRJdGVtPW51bGwsdGhpcy5zZWFyY2gobnVsbCxlKSl9LHRoaXMub3B0aW9ucy5kZWxheSl9LHNlYXJjaDpmdW5jdGlvbihlLHQpe3JldHVybiBlPW51bGwhPWU/ZTp0aGlzLl92YWx1ZSgpLHRoaXMudGVybT10aGlzLl92YWx1ZSgpLGUubGVuZ3RoPHRoaXMub3B0aW9ucy5taW5MZW5ndGg/dGhpcy5jbG9zZSh0KTp0aGlzLl90cmlnZ2VyKCJzZWFyY2giLHQpIT09ITE/dGhpcy5fc2VhcmNoKGUpOnZvaWQgMH0sX3NlYXJjaDpmdW5jdGlvbihlKXt0aGlzLnBlbmRpbmcrKyx0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLWF1dG9jb21wbGV0ZS1sb2FkaW5nIiksdGhpcy5jYW5jZWxTZWFyY2g9ITEsdGhpcy5zb3VyY2Uoe3Rlcm06ZX0sdGhpcy5fcmVzcG9uc2UoKSl9LF9yZXNwb25zZTpmdW5jdGlvbigpe3ZhciB0PSsrdGhpcy5yZXF1ZXN0SW5kZXg7cmV0dXJuIGUucHJveHkoZnVuY3Rpb24oZSl7dD09PXRoaXMucmVxdWVzdEluZGV4JiZ0aGlzLl9fcmVzcG9uc2UoZSksdGhpcy5wZW5kaW5nLS0sdGhpcy5wZW5kaW5nfHx0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLWF1dG9jb21wbGV0ZS1sb2FkaW5nIil9LHRoaXMpfSxfX3Jlc3BvbnNlOmZ1bmN0aW9uKGUpe2UmJihlPXRoaXMuX25vcm1hbGl6ZShlKSksdGhpcy5fdHJpZ2dlcigicmVzcG9uc2UiLG51bGwse2NvbnRlbnQ6ZX0pLCF0aGlzLm9wdGlvbnMuZGlzYWJsZWQmJmUmJmUubGVuZ3RoJiYhdGhpcy5jYW5jZWxTZWFyY2g/KHRoaXMuX3N1Z2dlc3QoZSksdGhpcy5fdHJpZ2dlcigib3BlbiIpKTp0aGlzLl9jbG9zZSgpfSxjbG9zZTpmdW5jdGlvbihlKXt0aGlzLmNhbmNlbFNlYXJjaD0hMCx0aGlzLl9jbG9zZShlKX0sX2Nsb3NlOmZ1bmN0aW9uKGUpe3RoaXMubWVudS5lbGVtZW50LmlzKCI6dmlzaWJsZSIpJiYodGhpcy5tZW51LmVsZW1lbnQuaGlkZSgpLHRoaXMubWVudS5ibHVyKCksdGhpcy5pc05ld01lbnU9ITAsdGhpcy5fdHJpZ2dlcigiY2xvc2UiLGUpKX0sX2NoYW5nZTpmdW5jdGlvbihlKXt0aGlzLnByZXZpb3VzIT09dGhpcy5fdmFsdWUoKSYmdGhpcy5fdHJpZ2dlcigiY2hhbmdlIixlLHtpdGVtOnRoaXMuc2VsZWN0ZWRJdGVtfSl9LF9ub3JtYWxpemU6ZnVuY3Rpb24odCl7cmV0dXJuIHQubGVuZ3RoJiZ0WzBdLmxhYmVsJiZ0WzBdLnZhbHVlP3Q6ZS5tYXAodCxmdW5jdGlvbih0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ/e2xhYmVsOnQsdmFsdWU6dH06ZS5leHRlbmQoe30sdCx7bGFiZWw6dC5sYWJlbHx8dC52YWx1ZSx2YWx1ZTp0LnZhbHVlfHx0LmxhYmVsfSl9KX0sX3N1Z2dlc3Q6ZnVuY3Rpb24odCl7dmFyIGk9dGhpcy5tZW51LmVsZW1lbnQuZW1wdHkoKTt0aGlzLl9yZW5kZXJNZW51KGksdCksdGhpcy5pc05ld01lbnU9ITAsdGhpcy5tZW51LnJlZnJlc2goKSxpLnNob3coKSx0aGlzLl9yZXNpemVNZW51KCksaS5wb3NpdGlvbihlLmV4dGVuZCh7b2Y6dGhpcy5lbGVtZW50fSx0aGlzLm9wdGlvbnMucG9zaXRpb24pKSx0aGlzLm9wdGlvbnMuYXV0b0ZvY3VzJiZ0aGlzLm1lbnUubmV4dCgpfSxfcmVzaXplTWVudTpmdW5jdGlvbigpe3ZhciBlPXRoaXMubWVudS5lbGVtZW50O2Uub3V0ZXJXaWR0aChNYXRoLm1heChlLndpZHRoKCIiKS5vdXRlcldpZHRoKCkrMSx0aGlzLmVsZW1lbnQub3V0ZXJXaWR0aCgpKSl9LF9yZW5kZXJNZW51OmZ1bmN0aW9uKHQsaSl7dmFyIHM9dGhpcztlLmVhY2goaSxmdW5jdGlvbihlLGkpe3MuX3JlbmRlckl0ZW1EYXRhKHQsaSl9KX0sX3JlbmRlckl0ZW1EYXRhOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuX3JlbmRlckl0ZW0oZSx0KS5kYXRhKCJ1aS1hdXRvY29tcGxldGUtaXRlbSIsdCl9LF9yZW5kZXJJdGVtOmZ1bmN0aW9uKHQsaSl7cmV0dXJuIGUoIjxsaT4iKS50ZXh0KGkubGFiZWwpLmFwcGVuZFRvKHQpfSxfbW92ZTpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLm1lbnUuZWxlbWVudC5pcygiOnZpc2libGUiKT90aGlzLm1lbnUuaXNGaXJzdEl0ZW0oKSYmL15wcmV2aW91cy8udGVzdChlKXx8dGhpcy5tZW51LmlzTGFzdEl0ZW0oKSYmL15uZXh0Ly50ZXN0KGUpPyh0aGlzLmlzTXVsdGlMaW5lfHx0aGlzLl92YWx1ZSh0aGlzLnRlcm0pLHRoaXMubWVudS5ibHVyKCksdm9pZCAwKToodGhpcy5tZW51W2VdKHQpLHZvaWQgMCk6KHRoaXMuc2VhcmNoKG51bGwsdCksdm9pZCAwKX0sd2lkZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWVudS5lbGVtZW50fSxfdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YWx1ZU1ldGhvZC5hcHBseSh0aGlzLmVsZW1lbnQsYXJndW1lbnRzKX0sX2tleUV2ZW50OmZ1bmN0aW9uKGUsdCl7KCF0aGlzLmlzTXVsdGlMaW5lfHx0aGlzLm1lbnUuZWxlbWVudC5pcygiOnZpc2libGUiKSkmJih0aGlzLl9tb3ZlKGUsdCksdC5wcmV2ZW50RGVmYXVsdCgpKX19KSxlLmV4dGVuZChlLnVpLmF1dG9jb21wbGV0ZSx7ZXNjYXBlUmVnZXg6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZSgvW1wtXFtcXXt9KCkqKz8uLFxcXF4kfCNcc10vZywiXFwkJiIpfSxmaWx0ZXI6ZnVuY3Rpb24odCxpKXt2YXIgcz1SZWdFeHAoZS51aS5hdXRvY29tcGxldGUuZXNjYXBlUmVnZXgoaSksImkiKTtyZXR1cm4gZS5ncmVwKHQsZnVuY3Rpb24oZSl7cmV0dXJuIHMudGVzdChlLmxhYmVsfHxlLnZhbHVlfHxlKX0pfX0pLGUud2lkZ2V0KCJ1aS5hdXRvY29tcGxldGUiLGUudWkuYXV0b2NvbXBsZXRlLHtvcHRpb25zOnttZXNzYWdlczp7bm9SZXN1bHRzOiJObyBzZWFyY2ggcmVzdWx0cy4iLHJlc3VsdHM6ZnVuY3Rpb24oZSl7cmV0dXJuIGUrKGU+MT8iIHJlc3VsdHMgYXJlIjoiIHJlc3VsdCBpcyIpKyIgYXZhaWxhYmxlLCB1c2UgdXAgYW5kIGRvd24gYXJyb3cga2V5cyB0byBuYXZpZ2F0ZS4ifX19LF9fcmVzcG9uc2U6ZnVuY3Rpb24odCl7dmFyIGk7dGhpcy5fc3VwZXJBcHBseShhcmd1bWVudHMpLHRoaXMub3B0aW9ucy5kaXNhYmxlZHx8dGhpcy5jYW5jZWxTZWFyY2h8fChpPXQmJnQubGVuZ3RoP3RoaXMub3B0aW9ucy5tZXNzYWdlcy5yZXN1bHRzKHQubGVuZ3RoKTp0aGlzLm9wdGlvbnMubWVzc2FnZXMubm9SZXN1bHRzLHRoaXMubGl2ZVJlZ2lvbi5jaGlsZHJlbigpLmhpZGUoKSxlKCI8ZGl2PiIpLnRleHQoaSkuYXBwZW5kVG8odGhpcy5saXZlUmVnaW9uKSl9fSksZS51aS5hdXRvY29tcGxldGU7dmFyIGMscD0idWktYnV0dG9uIHVpLXdpZGdldCB1aS1zdGF0ZS1kZWZhdWx0IHVpLWNvcm5lci1hbGwiLGY9InVpLWJ1dHRvbi1pY29ucy1vbmx5IHVpLWJ1dHRvbi1pY29uLW9ubHkgdWktYnV0dG9uLXRleHQtaWNvbnMgdWktYnV0dG9uLXRleHQtaWNvbi1wcmltYXJ5IHVpLWJ1dHRvbi10ZXh0LWljb24tc2Vjb25kYXJ5IHVpLWJ1dHRvbi10ZXh0LW9ubHkiLG09ZnVuY3Rpb24oKXt2YXIgdD1lKHRoaXMpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt0LmZpbmQoIjp1aS1idXR0b24iKS5idXR0b24oInJlZnJlc2giKX0sMSl9LGc9ZnVuY3Rpb24odCl7dmFyIGk9dC5uYW1lLHM9dC5mb3JtLG49ZShbXSk7cmV0dXJuIGkmJihpPWkucmVwbGFjZSgvJy9nLCJcXCciKSxuPXM/ZShzKS5maW5kKCJbbmFtZT0nIitpKyInXVt0eXBlPXJhZGlvXSIpOmUoIltuYW1lPSciK2krIiddW3R5cGU9cmFkaW9dIix0Lm93bmVyRG9jdW1lbnQpLmZpbHRlcihmdW5jdGlvbigpe3JldHVybiF0aGlzLmZvcm19KSksbn07ZS53aWRnZXQoInVpLmJ1dHRvbiIse3ZlcnNpb246IjEuMTEuNCIsZGVmYXVsdEVsZW1lbnQ6IjxidXR0b24+IixvcHRpb25zOntkaXNhYmxlZDpudWxsLHRleHQ6ITAsbGFiZWw6bnVsbCxpY29uczp7cHJpbWFyeTpudWxsLHNlY29uZGFyeTpudWxsfX0sX2NyZWF0ZTpmdW5jdGlvbigpe3RoaXMuZWxlbWVudC5jbG9zZXN0KCJmb3JtIikudW5iaW5kKCJyZXNldCIrdGhpcy5ldmVudE5hbWVzcGFjZSkuYmluZCgicmVzZXQiK3RoaXMuZXZlbnROYW1lc3BhY2UsbSksImJvb2xlYW4iIT10eXBlb2YgdGhpcy5vcHRpb25zLmRpc2FibGVkP3RoaXMub3B0aW9ucy5kaXNhYmxlZD0hIXRoaXMuZWxlbWVudC5wcm9wKCJkaXNhYmxlZCIpOnRoaXMuZWxlbWVudC5wcm9wKCJkaXNhYmxlZCIsdGhpcy5vcHRpb25zLmRpc2FibGVkKSx0aGlzLl9kZXRlcm1pbmVCdXR0b25UeXBlKCksdGhpcy5oYXNUaXRsZT0hIXRoaXMuYnV0dG9uRWxlbWVudC5hdHRyKCJ0aXRsZSIpO3ZhciB0PXRoaXMsaT10aGlzLm9wdGlvbnMscz0iY2hlY2tib3giPT09dGhpcy50eXBlfHwicmFkaW8iPT09dGhpcy50eXBlLG49cz8iIjoidWktc3RhdGUtYWN0aXZlIjtudWxsPT09aS5sYWJlbCYmKGkubGFiZWw9ImlucHV0Ij09PXRoaXMudHlwZT90aGlzLmJ1dHRvbkVsZW1lbnQudmFsKCk6dGhpcy5idXR0b25FbGVtZW50Lmh0bWwoKSksdGhpcy5faG92ZXJhYmxlKHRoaXMuYnV0dG9uRWxlbWVudCksdGhpcy5idXR0b25FbGVtZW50LmFkZENsYXNzKHApLmF0dHIoInJvbGUiLCJidXR0b24iKS5iaW5kKCJtb3VzZWVudGVyIit0aGlzLmV2ZW50TmFtZXNwYWNlLGZ1bmN0aW9uKCl7aS5kaXNhYmxlZHx8dGhpcz09PWMmJmUodGhpcykuYWRkQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpfSkuYmluZCgibW91c2VsZWF2ZSIrdGhpcy5ldmVudE5hbWVzcGFjZSxmdW5jdGlvbigpe2kuZGlzYWJsZWR8fGUodGhpcykucmVtb3ZlQ2xhc3Mobil9KS5iaW5kKCJjbGljayIrdGhpcy5ldmVudE5hbWVzcGFjZSxmdW5jdGlvbihlKXtpLmRpc2FibGVkJiYoZS5wcmV2ZW50RGVmYXVsdCgpLGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCkpfSksdGhpcy5fb24oe2ZvY3VzOmZ1bmN0aW9uKCl7dGhpcy5idXR0b25FbGVtZW50LmFkZENsYXNzKCJ1aS1zdGF0ZS1mb2N1cyIpfSxibHVyOmZ1bmN0aW9uKCl7dGhpcy5idXR0b25FbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1mb2N1cyIpfX0pLHMmJnRoaXMuZWxlbWVudC5iaW5kKCJjaGFuZ2UiK3RoaXMuZXZlbnROYW1lc3BhY2UsZnVuY3Rpb24oKXt0LnJlZnJlc2goKX0pLCJjaGVja2JveCI9PT10aGlzLnR5cGU/dGhpcy5idXR0b25FbGVtZW50LmJpbmQoImNsaWNrIit0aGlzLmV2ZW50TmFtZXNwYWNlLGZ1bmN0aW9uKCl7cmV0dXJuIGkuZGlzYWJsZWQ/ITE6dm9pZCAwfSk6InJhZGlvIj09PXRoaXMudHlwZT90aGlzLmJ1dHRvbkVsZW1lbnQuYmluZCgiY2xpY2siK3RoaXMuZXZlbnROYW1lc3BhY2UsZnVuY3Rpb24oKXtpZihpLmRpc2FibGVkKXJldHVybiExO2UodGhpcykuYWRkQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpLHQuYnV0dG9uRWxlbWVudC5hdHRyKCJhcmlhLXByZXNzZWQiLCJ0cnVlIik7dmFyIHM9dC5lbGVtZW50WzBdO2cocykubm90KHMpLm1hcChmdW5jdGlvbigpe3JldHVybiBlKHRoaXMpLmJ1dHRvbigid2lkZ2V0IilbMF19KS5yZW1vdmVDbGFzcygidWktc3RhdGUtYWN0aXZlIikuYXR0cigiYXJpYS1wcmVzc2VkIiwiZmFsc2UiKX0pOih0aGlzLmJ1dHRvbkVsZW1lbnQuYmluZCgibW91c2Vkb3duIit0aGlzLmV2ZW50TmFtZXNwYWNlLGZ1bmN0aW9uKCl7cmV0dXJuIGkuZGlzYWJsZWQ/ITE6KGUodGhpcykuYWRkQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpLGM9dGhpcyx0LmRvY3VtZW50Lm9uZSgibW91c2V1cCIsZnVuY3Rpb24oKXtjPW51bGx9KSx2b2lkIDApfSkuYmluZCgibW91c2V1cCIrdGhpcy5ldmVudE5hbWVzcGFjZSxmdW5jdGlvbigpe3JldHVybiBpLmRpc2FibGVkPyExOihlKHRoaXMpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKSx2b2lkIDApfSkuYmluZCgia2V5ZG93biIrdGhpcy5ldmVudE5hbWVzcGFjZSxmdW5jdGlvbih0KXtyZXR1cm4gaS5kaXNhYmxlZD8hMTooKHQua2V5Q29kZT09PWUudWkua2V5Q29kZS5TUEFDRXx8dC5rZXlDb2RlPT09ZS51aS5rZXlDb2RlLkVOVEVSKSYmZSh0aGlzKS5hZGRDbGFzcygidWktc3RhdGUtYWN0aXZlIiksdm9pZCAwKX0pLmJpbmQoImtleXVwIit0aGlzLmV2ZW50TmFtZXNwYWNlKyIgYmx1ciIrdGhpcy5ldmVudE5hbWVzcGFjZSxmdW5jdGlvbigpe2UodGhpcykucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpfSksdGhpcy5idXR0b25FbGVtZW50LmlzKCJhIikmJnRoaXMuYnV0dG9uRWxlbWVudC5rZXl1cChmdW5jdGlvbih0KXt0LmtleUNvZGU9PT1lLnVpLmtleUNvZGUuU1BBQ0UmJmUodGhpcykuY2xpY2soKX0pKSx0aGlzLl9zZXRPcHRpb24oImRpc2FibGVkIixpLmRpc2FibGVkKSx0aGlzLl9yZXNldEJ1dHRvbigpfSxfZGV0ZXJtaW5lQnV0dG9uVHlwZTpmdW5jdGlvbigpe3ZhciBlLHQsaTt0aGlzLnR5cGU9dGhpcy5lbGVtZW50LmlzKCJbdHlwZT1jaGVja2JveF0iKT8iY2hlY2tib3giOnRoaXMuZWxlbWVudC5pcygiW3R5cGU9cmFkaW9dIik/InJhZGlvIjp0aGlzLmVsZW1lbnQuaXMoImlucHV0Iik/ImlucHV0IjoiYnV0dG9uIiwiY2hlY2tib3giPT09dGhpcy50eXBlfHwicmFkaW8iPT09dGhpcy50eXBlPyhlPXRoaXMuZWxlbWVudC5wYXJlbnRzKCkubGFzdCgpLHQ9ImxhYmVsW2Zvcj0nIit0aGlzLmVsZW1lbnQuYXR0cigiaWQiKSsiJ10iLHRoaXMuYnV0dG9uRWxlbWVudD1lLmZpbmQodCksdGhpcy5idXR0b25FbGVtZW50Lmxlbmd0aHx8KGU9ZS5sZW5ndGg/ZS5zaWJsaW5ncygpOnRoaXMuZWxlbWVudC5zaWJsaW5ncygpLHRoaXMuYnV0dG9uRWxlbWVudD1lLmZpbHRlcih0KSx0aGlzLmJ1dHRvbkVsZW1lbnQubGVuZ3RofHwodGhpcy5idXR0b25FbGVtZW50PWUuZmluZCh0KSkpLHRoaXMuZWxlbWVudC5hZGRDbGFzcygidWktaGVscGVyLWhpZGRlbi1hY2Nlc3NpYmxlIiksaT10aGlzLmVsZW1lbnQuaXMoIjpjaGVja2VkIiksaSYmdGhpcy5idXR0b25FbGVtZW50LmFkZENsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKSx0aGlzLmJ1dHRvbkVsZW1lbnQucHJvcCgiYXJpYS1wcmVzc2VkIixpKSk6dGhpcy5idXR0b25FbGVtZW50PXRoaXMuZWxlbWVudH0sd2lkZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYnV0dG9uRWxlbWVudH0sX2Rlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLWhlbHBlci1oaWRkZW4tYWNjZXNzaWJsZSIpLHRoaXMuYnV0dG9uRWxlbWVudC5yZW1vdmVDbGFzcyhwKyIgdWktc3RhdGUtYWN0aXZlICIrZikucmVtb3ZlQXR0cigicm9sZSIpLnJlbW92ZUF0dHIoImFyaWEtcHJlc3NlZCIpLmh0bWwodGhpcy5idXR0b25FbGVtZW50LmZpbmQoIi51aS1idXR0b24tdGV4dCIpLmh0bWwoKSksdGhpcy5oYXNUaXRsZXx8dGhpcy5idXR0b25FbGVtZW50LnJlbW92ZUF0dHIoInRpdGxlIil9LF9zZXRPcHRpb246ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5fc3VwZXIoZSx0KSwiZGlzYWJsZWQiPT09ZT8odGhpcy53aWRnZXQoKS50b2dnbGVDbGFzcygidWktc3RhdGUtZGlzYWJsZWQiLCEhdCksdGhpcy5lbGVtZW50LnByb3AoImRpc2FibGVkIiwhIXQpLHQmJigiY2hlY2tib3giPT09dGhpcy50eXBlfHwicmFkaW8iPT09dGhpcy50eXBlP3RoaXMuYnV0dG9uRWxlbWVudC5yZW1vdmVDbGFzcygidWktc3RhdGUtZm9jdXMiKTp0aGlzLmJ1dHRvbkVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWZvY3VzIHVpLXN0YXRlLWFjdGl2ZSIpKSx2b2lkIDApOih0aGlzLl9yZXNldEJ1dHRvbigpLHZvaWQgMCl9LHJlZnJlc2g6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmVsZW1lbnQuaXMoImlucHV0LCBidXR0b24iKT90aGlzLmVsZW1lbnQuaXMoIjpkaXNhYmxlZCIpOnRoaXMuZWxlbWVudC5oYXNDbGFzcygidWktYnV0dG9uLWRpc2FibGVkIik7dCE9PXRoaXMub3B0aW9ucy5kaXNhYmxlZCYmdGhpcy5fc2V0T3B0aW9uKCJkaXNhYmxlZCIsdCksInJhZGlvIj09PXRoaXMudHlwZT9nKHRoaXMuZWxlbWVudFswXSkuZWFjaChmdW5jdGlvbigpe2UodGhpcykuaXMoIjpjaGVja2VkIik/ZSh0aGlzKS5idXR0b24oIndpZGdldCIpLmFkZENsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKS5hdHRyKCJhcmlhLXByZXNzZWQiLCJ0cnVlIik6ZSh0aGlzKS5idXR0b24oIndpZGdldCIpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKS5hdHRyKCJhcmlhLXByZXNzZWQiLCJmYWxzZSIpfSk6ImNoZWNrYm94Ij09PXRoaXMudHlwZSYmKHRoaXMuZWxlbWVudC5pcygiOmNoZWNrZWQiKT90aGlzLmJ1dHRvbkVsZW1lbnQuYWRkQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpLmF0dHIoImFyaWEtcHJlc3NlZCIsInRydWUiKTp0aGlzLmJ1dHRvbkVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpLmF0dHIoImFyaWEtcHJlc3NlZCIsImZhbHNlIikpfSxfcmVzZXRCdXR0b246ZnVuY3Rpb24oKXtpZigiaW5wdXQiPT09dGhpcy50eXBlKXJldHVybiB0aGlzLm9wdGlvbnMubGFiZWwmJnRoaXMuZWxlbWVudC52YWwodGhpcy5vcHRpb25zLmxhYmVsKSx2b2lkIDA7dmFyIHQ9dGhpcy5idXR0b25FbGVtZW50LnJlbW92ZUNsYXNzKGYpLGk9ZSgiPHNwYW4+PC9zcGFuPiIsdGhpcy5kb2N1bWVudFswXSkuYWRkQ2xhc3MoInVpLWJ1dHRvbi10ZXh0IikuaHRtbCh0aGlzLm9wdGlvbnMubGFiZWwpLmFwcGVuZFRvKHQuZW1wdHkoKSkudGV4dCgpLHM9dGhpcy5vcHRpb25zLmljb25zLG49cy5wcmltYXJ5JiZzLnNlY29uZGFyeSxhPVtdO3MucHJpbWFyeXx8cy5zZWNvbmRhcnk/KHRoaXMub3B0aW9ucy50ZXh0JiZhLnB1c2goInVpLWJ1dHRvbi10ZXh0LWljb24iKyhuPyJzIjpzLnByaW1hcnk/Ii1wcmltYXJ5IjoiLXNlY29uZGFyeSIpKSxzLnByaW1hcnkmJnQucHJlcGVuZCgiPHNwYW4gY2xhc3M9J3VpLWJ1dHRvbi1pY29uLXByaW1hcnkgdWktaWNvbiAiK3MucHJpbWFyeSsiJz48L3NwYW4+Iikscy5zZWNvbmRhcnkmJnQuYXBwZW5kKCI8c3BhbiBjbGFzcz0ndWktYnV0dG9uLWljb24tc2Vjb25kYXJ5IHVpLWljb24gIitzLnNlY29uZGFyeSsiJz48L3NwYW4+IiksdGhpcy5vcHRpb25zLnRleHR8fChhLnB1c2gobj8idWktYnV0dG9uLWljb25zLW9ubHkiOiJ1aS1idXR0b24taWNvbi1vbmx5IiksdGhpcy5oYXNUaXRsZXx8dC5hdHRyKCJ0aXRsZSIsZS50cmltKGkpKSkpOmEucHVzaCgidWktYnV0dG9uLXRleHQtb25seSIpLHQuYWRkQ2xhc3MoYS5qb2luKCIgIikpfX0pLGUud2lkZ2V0KCJ1aS5idXR0b25zZXQiLHt2ZXJzaW9uOiIxLjExLjQiLG9wdGlvbnM6e2l0ZW1zOiJidXR0b24sIGlucHV0W3R5cGU9YnV0dG9uXSwgaW5wdXRbdHlwZT1zdWJtaXRdLCBpbnB1dFt0eXBlPXJlc2V0XSwgaW5wdXRbdHlwZT1jaGVja2JveF0sIGlucHV0W3R5cGU9cmFkaW9dLCBhLCA6ZGF0YSh1aS1idXR0b24pIn0sX2NyZWF0ZTpmdW5jdGlvbigpe3RoaXMuZWxlbWVudC5hZGRDbGFzcygidWktYnV0dG9uc2V0Iil9LF9pbml0OmZ1bmN0aW9uKCl7dGhpcy5yZWZyZXNoKCl9LF9zZXRPcHRpb246ZnVuY3Rpb24oZSx0KXsiZGlzYWJsZWQiPT09ZSYmdGhpcy5idXR0b25zLmJ1dHRvbigib3B0aW9uIixlLHQpLHRoaXMuX3N1cGVyKGUsdCl9LHJlZnJlc2g6ZnVuY3Rpb24oKXt2YXIgdD0icnRsIj09PXRoaXMuZWxlbWVudC5jc3MoImRpcmVjdGlvbiIpLGk9dGhpcy5lbGVtZW50LmZpbmQodGhpcy5vcHRpb25zLml0ZW1zKSxzPWkuZmlsdGVyKCI6dWktYnV0dG9uIik7aS5ub3QoIjp1aS1idXR0b24iKS5idXR0b24oKSxzLmJ1dHRvbigicmVmcmVzaCIpLHRoaXMuYnV0dG9ucz1pLm1hcChmdW5jdGlvbigpe3JldHVybiBlKHRoaXMpLmJ1dHRvbigid2lkZ2V0IilbMF19KS5yZW1vdmVDbGFzcygidWktY29ybmVyLWFsbCB1aS1jb3JuZXItbGVmdCB1aS1jb3JuZXItcmlnaHQiKS5maWx0ZXIoIjpmaXJzdCIpLmFkZENsYXNzKHQ/InVpLWNvcm5lci1yaWdodCI6InVpLWNvcm5lci1sZWZ0IikuZW5kKCkuZmlsdGVyKCI6bGFzdCIpLmFkZENsYXNzKHQ/InVpLWNvcm5lci1sZWZ0IjoidWktY29ybmVyLXJpZ2h0IikuZW5kKCkuZW5kKCl9LF9kZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1idXR0b25zZXQiKSx0aGlzLmJ1dHRvbnMubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIGUodGhpcykuYnV0dG9uKCJ3aWRnZXQiKVswXX0pLnJlbW92ZUNsYXNzKCJ1aS1jb3JuZXItbGVmdCB1aS1jb3JuZXItcmlnaHQiKS5lbmQoKS5idXR0b24oImRlc3Ryb3kiKX19KSxlLnVpLmJ1dHRvbixlLmV4dGVuZChlLnVpLHtkYXRlcGlja2VyOnt2ZXJzaW9uOiIxLjExLjQifX0pO3ZhciB2O2UuZXh0ZW5kKG4ucHJvdG90eXBlLHttYXJrZXJDbGFzc05hbWU6Imhhc0RhdGVwaWNrZXIiLG1heFJvd3M6NCxfd2lkZ2V0RGF0ZXBpY2tlcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRwRGl2fSxzZXREZWZhdWx0czpmdW5jdGlvbihlKXtyZXR1cm4gcih0aGlzLl9kZWZhdWx0cyxlfHx7fSksdGhpc30sX2F0dGFjaERhdGVwaWNrZXI6ZnVuY3Rpb24odCxpKXt2YXIgcyxuLGE7cz10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksbj0iZGl2Ij09PXN8fCJzcGFuIj09PXMsdC5pZHx8KHRoaXMudXVpZCs9MSx0LmlkPSJkcCIrdGhpcy51dWlkKSxhPXRoaXMuX25ld0luc3QoZSh0KSxuKSxhLnNldHRpbmdzPWUuZXh0ZW5kKHt9LGl8fHt9KSwiaW5wdXQiPT09cz90aGlzLl9jb25uZWN0RGF0ZXBpY2tlcih0LGEpOm4mJnRoaXMuX2lubGluZURhdGVwaWNrZXIodCxhKX0sX25ld0luc3Q6ZnVuY3Rpb24odCxpKXt2YXIgcz10WzBdLmlkLnJlcGxhY2UoLyhbXkEtWmEtejAtOV9cLV0pL2csIlxcXFwkMSIpO3JldHVybntpZDpzLGlucHV0OnQsc2VsZWN0ZWREYXk6MCxzZWxlY3RlZE1vbnRoOjAsc2VsZWN0ZWRZZWFyOjAsZHJhd01vbnRoOjAsZHJhd1llYXI6MCxpbmxpbmU6aSxkcERpdjppP2EoZSgiPGRpdiBjbGFzcz0nIit0aGlzLl9pbmxpbmVDbGFzcysiIHVpLWRhdGVwaWNrZXIgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWhlbHBlci1jbGVhcmZpeCB1aS1jb3JuZXItYWxsJz48L2Rpdj4iKSk6dGhpcy5kcERpdn19LF9jb25uZWN0RGF0ZXBpY2tlcjpmdW5jdGlvbih0LGkpe3ZhciBzPWUodCk7aS5hcHBlbmQ9ZShbXSksaS50cmlnZ2VyPWUoW10pLHMuaGFzQ2xhc3ModGhpcy5tYXJrZXJDbGFzc05hbWUpfHwodGhpcy5fYXR0YWNobWVudHMocyxpKSxzLmFkZENsYXNzKHRoaXMubWFya2VyQ2xhc3NOYW1lKS5rZXlkb3duKHRoaXMuX2RvS2V5RG93bikua2V5cHJlc3ModGhpcy5fZG9LZXlQcmVzcykua2V5dXAodGhpcy5fZG9LZXlVcCksdGhpcy5fYXV0b1NpemUoaSksZS5kYXRhKHQsImRhdGVwaWNrZXIiLGkpLGkuc2V0dGluZ3MuZGlzYWJsZWQmJnRoaXMuX2Rpc2FibGVEYXRlcGlja2VyKHQpKX0sX2F0dGFjaG1lbnRzOmZ1bmN0aW9uKHQsaSl7dmFyIHMsbixhLG89dGhpcy5fZ2V0KGksImFwcGVuZFRleHQiKSxyPXRoaXMuX2dldChpLCJpc1JUTCIpO2kuYXBwZW5kJiZpLmFwcGVuZC5yZW1vdmUoKSxvJiYoaS5hcHBlbmQ9ZSgiPHNwYW4gY2xhc3M9JyIrdGhpcy5fYXBwZW5kQ2xhc3MrIic+IitvKyI8L3NwYW4+IiksdFtyPyJiZWZvcmUiOiJhZnRlciJdKGkuYXBwZW5kKSksdC51bmJpbmQoImZvY3VzIix0aGlzLl9zaG93RGF0ZXBpY2tlciksaS50cmlnZ2VyJiZpLnRyaWdnZXIucmVtb3ZlKCkscz10aGlzLl9nZXQoaSwic2hvd09uIiksKCJmb2N1cyI9PT1zfHwiYm90aCI9PT1zKSYmdC5mb2N1cyh0aGlzLl9zaG93RGF0ZXBpY2tlciksKCJidXR0b24iPT09c3x8ImJvdGgiPT09cykmJihuPXRoaXMuX2dldChpLCJidXR0b25UZXh0IiksYT10aGlzLl9nZXQoaSwiYnV0dG9uSW1hZ2UiKSxpLnRyaWdnZXI9ZSh0aGlzLl9nZXQoaSwiYnV0dG9uSW1hZ2VPbmx5Iik/ZSgiPGltZy8+IikuYWRkQ2xhc3ModGhpcy5fdHJpZ2dlckNsYXNzKS5hdHRyKHtzcmM6YSxhbHQ6bix0aXRsZTpufSk6ZSgiPGJ1dHRvbiB0eXBlPSdidXR0b24nPjwvYnV0dG9uPiIpLmFkZENsYXNzKHRoaXMuX3RyaWdnZXJDbGFzcykuaHRtbChhP2UoIjxpbWcvPiIpLmF0dHIoe3NyYzphLGFsdDpuLHRpdGxlOm59KTpuKSksdFtyPyJiZWZvcmUiOiJhZnRlciJdKGkudHJpZ2dlciksaS50cmlnZ2VyLmNsaWNrKGZ1bmN0aW9uKCl7cmV0dXJuIGUuZGF0ZXBpY2tlci5fZGF0ZXBpY2tlclNob3dpbmcmJmUuZGF0ZXBpY2tlci5fbGFzdElucHV0PT09dFswXT9lLmRhdGVwaWNrZXIuX2hpZGVEYXRlcGlja2VyKCk6ZS5kYXRlcGlja2VyLl9kYXRlcGlja2VyU2hvd2luZyYmZS5kYXRlcGlja2VyLl9sYXN0SW5wdXQhPT10WzBdPyhlLmRhdGVwaWNrZXIuX2hpZGVEYXRlcGlja2VyKCksZS5kYXRlcGlja2VyLl9zaG93RGF0ZXBpY2tlcih0WzBdKSk6ZS5kYXRlcGlja2VyLl9zaG93RGF0ZXBpY2tlcih0WzBdKSwhMX0pKX0sX2F1dG9TaXplOmZ1bmN0aW9uKGUpe2lmKHRoaXMuX2dldChlLCJhdXRvU2l6ZSIpJiYhZS5pbmxpbmUpe3ZhciB0LGkscyxuLGE9bmV3IERhdGUoMjAwOSwxMSwyMCksbz10aGlzLl9nZXQoZSwiZGF0ZUZvcm1hdCIpO28ubWF0Y2goL1tETV0vKSYmKHQ9ZnVuY3Rpb24oZSl7Zm9yKGk9MCxzPTAsbj0wO2UubGVuZ3RoPm47bisrKWVbbl0ubGVuZ3RoPmkmJihpPWVbbl0ubGVuZ3RoLHM9bik7cmV0dXJuIHN9LGEuc2V0TW9udGgodCh0aGlzLl9nZXQoZSxvLm1hdGNoKC9NTS8pPyJtb250aE5hbWVzIjoibW9udGhOYW1lc1Nob3J0IikpKSxhLnNldERhdGUodCh0aGlzLl9nZXQoZSxvLm1hdGNoKC9ERC8pPyJkYXlOYW1lcyI6ImRheU5hbWVzU2hvcnQiKSkrMjAtYS5nZXREYXkoKSkpLGUuaW5wdXQuYXR0cigic2l6ZSIsdGhpcy5fZm9ybWF0RGF0ZShlLGEpLmxlbmd0aCl9fSxfaW5saW5lRGF0ZXBpY2tlcjpmdW5jdGlvbih0LGkpe3ZhciBzPWUodCk7cy5oYXNDbGFzcyh0aGlzLm1hcmtlckNsYXNzTmFtZSl8fChzLmFkZENsYXNzKHRoaXMubWFya2VyQ2xhc3NOYW1lKS5hcHBlbmQoaS5kcERpdiksZS5kYXRhKHQsImRhdGVwaWNrZXIiLGkpLHRoaXMuX3NldERhdGUoaSx0aGlzLl9nZXREZWZhdWx0RGF0ZShpKSwhMCksdGhpcy5fdXBkYXRlRGF0ZXBpY2tlcihpKSx0aGlzLl91cGRhdGVBbHRlcm5hdGUoaSksaS5zZXR0aW5ncy5kaXNhYmxlZCYmdGhpcy5fZGlzYWJsZURhdGVwaWNrZXIodCksaS5kcERpdi5jc3MoImRpc3BsYXkiLCJibG9jayIpKX0sX2RpYWxvZ0RhdGVwaWNrZXI6ZnVuY3Rpb24odCxpLHMsbixhKXt2YXIgbyxoLGwsdSxkLGM9dGhpcy5fZGlhbG9nSW5zdDtyZXR1cm4gY3x8KHRoaXMudXVpZCs9MSxvPSJkcCIrdGhpcy51dWlkLHRoaXMuX2RpYWxvZ0lucHV0PWUoIjxpbnB1dCB0eXBlPSd0ZXh0JyBpZD0nIitvKyInIHN0eWxlPSdwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogLTEwMHB4OyB3aWR0aDogMHB4OycvPiIpLHRoaXMuX2RpYWxvZ0lucHV0LmtleWRvd24odGhpcy5fZG9LZXlEb3duKSxlKCJib2R5IikuYXBwZW5kKHRoaXMuX2RpYWxvZ0lucHV0KSxjPXRoaXMuX2RpYWxvZ0luc3Q9dGhpcy5fbmV3SW5zdCh0aGlzLl9kaWFsb2dJbnB1dCwhMSksYy5zZXR0aW5ncz17fSxlLmRhdGEodGhpcy5fZGlhbG9nSW5wdXRbMF0sImRhdGVwaWNrZXIiLGMpKSxyKGMuc2V0dGluZ3Msbnx8e30pLGk9aSYmaS5jb25zdHJ1Y3Rvcj09PURhdGU/dGhpcy5fZm9ybWF0RGF0ZShjLGkpOmksdGhpcy5fZGlhbG9nSW5wdXQudmFsKGkpLHRoaXMuX3Bvcz1hP2EubGVuZ3RoP2E6W2EucGFnZVgsYS5wYWdlWV06bnVsbCx0aGlzLl9wb3N8fChoPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCxsPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQsdT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdHx8ZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0LGQ9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcHx8ZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AsdGhpcy5fcG9zPVtoLzItMTAwK3UsbC8yLTE1MCtkXSksdGhpcy5fZGlhbG9nSW5wdXQuY3NzKCJsZWZ0Iix0aGlzLl9wb3NbMF0rMjArInB4IikuY3NzKCJ0b3AiLHRoaXMuX3Bvc1sxXSsicHgiKSxjLnNldHRpbmdzLm9uU2VsZWN0PXMsdGhpcy5faW5EaWFsb2c9ITAsdGhpcy5kcERpdi5hZGRDbGFzcyh0aGlzLl9kaWFsb2dDbGFzcyksdGhpcy5fc2hvd0RhdGVwaWNrZXIodGhpcy5fZGlhbG9nSW5wdXRbMF0pLGUuYmxvY2tVSSYmZS5ibG9ja1VJKHRoaXMuZHBEaXYpLGUuZGF0YSh0aGlzLl9kaWFsb2dJbnB1dFswXSwiZGF0ZXBpY2tlciIsYyksdGhpc30sX2Rlc3Ryb3lEYXRlcGlja2VyOmZ1bmN0aW9uKHQpe3ZhciBpLHM9ZSh0KSxuPWUuZGF0YSh0LCJkYXRlcGlja2VyIik7cy5oYXNDbGFzcyh0aGlzLm1hcmtlckNsYXNzTmFtZSkmJihpPXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxlLnJlbW92ZURhdGEodCwiZGF0ZXBpY2tlciIpLCJpbnB1dCI9PT1pPyhuLmFwcGVuZC5yZW1vdmUoKSxuLnRyaWdnZXIucmVtb3ZlKCkscy5yZW1vdmVDbGFzcyh0aGlzLm1hcmtlckNsYXNzTmFtZSkudW5iaW5kKCJmb2N1cyIsdGhpcy5fc2hvd0RhdGVwaWNrZXIpLnVuYmluZCgia2V5ZG93biIsdGhpcy5fZG9LZXlEb3duKS51bmJpbmQoImtleXByZXNzIix0aGlzLl9kb0tleVByZXNzKS51bmJpbmQoImtleXVwIix0aGlzLl9kb0tleVVwKSk6KCJkaXYiPT09aXx8InNwYW4iPT09aSkmJnMucmVtb3ZlQ2xhc3ModGhpcy5tYXJrZXJDbGFzc05hbWUpLmVtcHR5KCksdj09PW4mJih2PW51bGwpKX0sX2VuYWJsZURhdGVwaWNrZXI6ZnVuY3Rpb24odCl7dmFyIGkscyxuPWUodCksYT1lLmRhdGEodCwiZGF0ZXBpY2tlciIpO24uaGFzQ2xhc3ModGhpcy5tYXJrZXJDbGFzc05hbWUpJiYoaT10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksImlucHV0Ij09PWk/KHQuZGlzYWJsZWQ9ITEsYS50cmlnZ2VyLmZpbHRlcigiYnV0dG9uIikuZWFjaChmdW5jdGlvbigpe3RoaXMuZGlzYWJsZWQ9ITF9KS5lbmQoKS5maWx0ZXIoImltZyIpLmNzcyh7b3BhY2l0eToiMS4wIixjdXJzb3I6IiJ9KSk6KCJkaXYiPT09aXx8InNwYW4iPT09aSkmJihzPW4uY2hpbGRyZW4oIi4iK3RoaXMuX2lubGluZUNsYXNzKSxzLmNoaWxkcmVuKCkucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWRpc2FibGVkIikscy5maW5kKCJzZWxlY3QudWktZGF0ZXBpY2tlci1tb250aCwgc2VsZWN0LnVpLWRhdGVwaWNrZXIteWVhciIpLnByb3AoImRpc2FibGVkIiwhMSkpLHRoaXMuX2Rpc2FibGVkSW5wdXRzPWUubWFwKHRoaXMuX2Rpc2FibGVkSW5wdXRzLGZ1bmN0aW9uKGUpe3JldHVybiBlPT09dD9udWxsOmV9KSl9LF9kaXNhYmxlRGF0ZXBpY2tlcjpmdW5jdGlvbih0KXt2YXIgaSxzLG49ZSh0KSxhPWUuZGF0YSh0LCJkYXRlcGlja2VyIik7bi5oYXNDbGFzcyh0aGlzLm1hcmtlckNsYXNzTmFtZSkmJihpPXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSwiaW5wdXQiPT09aT8odC5kaXNhYmxlZD0hMCxhLnRyaWdnZXIuZmlsdGVyKCJidXR0b24iKS5lYWNoKGZ1bmN0aW9uKCl7dGhpcy5kaXNhYmxlZD0hMH0pLmVuZCgpLmZpbHRlcigiaW1nIikuY3NzKHtvcGFjaXR5OiIwLjUiLGN1cnNvcjoiZGVmYXVsdCJ9KSk6KCJkaXYiPT09aXx8InNwYW4iPT09aSkmJihzPW4uY2hpbGRyZW4oIi4iK3RoaXMuX2lubGluZUNsYXNzKSxzLmNoaWxkcmVuKCkuYWRkQ2xhc3MoInVpLXN0YXRlLWRpc2FibGVkIikscy5maW5kKCJzZWxlY3QudWktZGF0ZXBpY2tlci1tb250aCwgc2VsZWN0LnVpLWRhdGVwaWNrZXIteWVhciIpLnByb3AoImRpc2FibGVkIiwhMCkpLHRoaXMuX2Rpc2FibGVkSW5wdXRzPWUubWFwKHRoaXMuX2Rpc2FibGVkSW5wdXRzLGZ1bmN0aW9uKGUpe3JldHVybiBlPT09dD9udWxsOmV9KSx0aGlzLl9kaXNhYmxlZElucHV0c1t0aGlzLl9kaXNhYmxlZElucHV0cy5sZW5ndGhdPXQpfSxfaXNEaXNhYmxlZERhdGVwaWNrZXI6ZnVuY3Rpb24oZSl7aWYoIWUpcmV0dXJuITE7Zm9yKHZhciB0PTA7dGhpcy5fZGlzYWJsZWRJbnB1dHMubGVuZ3RoPnQ7dCsrKWlmKHRoaXMuX2Rpc2FibGVkSW5wdXRzW3RdPT09ZSlyZXR1cm4hMDtyZXR1cm4hMX0sX2dldEluc3Q6ZnVuY3Rpb24odCl7dHJ5e3JldHVybiBlLmRhdGEodCwiZGF0ZXBpY2tlciIpfWNhdGNoKGkpe3Rocm93Ik1pc3NpbmcgaW5zdGFuY2UgZGF0YSBmb3IgdGhpcyBkYXRlcGlja2VyIn19LF9vcHRpb25EYXRlcGlja2VyOmZ1bmN0aW9uKHQsaSxzKXt2YXIgbixhLG8saCxsPXRoaXMuX2dldEluc3QodCk7cmV0dXJuIDI9PT1hcmd1bWVudHMubGVuZ3RoJiYic3RyaW5nIj09dHlwZW9mIGk/ImRlZmF1bHRzIj09PWk/ZS5leHRlbmQoe30sZS5kYXRlcGlja2VyLl9kZWZhdWx0cyk6bD8iYWxsIj09PWk/ZS5leHRlbmQoe30sbC5zZXR0aW5ncyk6dGhpcy5fZ2V0KGwsaSk6bnVsbDoobj1pfHx7fSwic3RyaW5nIj09dHlwZW9mIGkmJihuPXt9LG5baV09cyksbCYmKHRoaXMuX2N1ckluc3Q9PT1sJiZ0aGlzLl9oaWRlRGF0ZXBpY2tlcigpLGE9dGhpcy5fZ2V0RGF0ZURhdGVwaWNrZXIodCwhMCksbz10aGlzLl9nZXRNaW5NYXhEYXRlKGwsIm1pbiIpLGg9dGhpcy5fZ2V0TWluTWF4RGF0ZShsLCJtYXgiKSxyKGwuc2V0dGluZ3MsbiksbnVsbCE9PW8mJnZvaWQgMCE9PW4uZGF0ZUZvcm1hdCYmdm9pZCAwPT09bi5taW5EYXRlJiYobC5zZXR0aW5ncy5taW5EYXRlPXRoaXMuX2Zvcm1hdERhdGUobCxvKSksbnVsbCE9PWgmJnZvaWQgMCE9PW4uZGF0ZUZvcm1hdCYmdm9pZCAwPT09bi5tYXhEYXRlJiYobC5zZXR0aW5ncy5tYXhEYXRlPXRoaXMuX2Zvcm1hdERhdGUobCxoKSksImRpc2FibGVkImluIG4mJihuLmRpc2FibGVkP3RoaXMuX2Rpc2FibGVEYXRlcGlja2VyKHQpOnRoaXMuX2VuYWJsZURhdGVwaWNrZXIodCkpLHRoaXMuX2F0dGFjaG1lbnRzKGUodCksbCksdGhpcy5fYXV0b1NpemUobCksdGhpcy5fc2V0RGF0ZShsLGEpLHRoaXMuX3VwZGF0ZUFsdGVybmF0ZShsKSx0aGlzLl91cGRhdGVEYXRlcGlja2VyKGwpKSx2b2lkIDApfSxfY2hhbmdlRGF0ZXBpY2tlcjpmdW5jdGlvbihlLHQsaSl7dGhpcy5fb3B0aW9uRGF0ZXBpY2tlcihlLHQsaSl9LF9yZWZyZXNoRGF0ZXBpY2tlcjpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9nZXRJbnN0KGUpO3QmJnRoaXMuX3VwZGF0ZURhdGVwaWNrZXIodCl9LF9zZXREYXRlRGF0ZXBpY2tlcjpmdW5jdGlvbihlLHQpe3ZhciBpPXRoaXMuX2dldEluc3QoZSk7aSYmKHRoaXMuX3NldERhdGUoaSx0KSx0aGlzLl91cGRhdGVEYXRlcGlja2VyKGkpLHRoaXMuX3VwZGF0ZUFsdGVybmF0ZShpKSl9LF9nZXREYXRlRGF0ZXBpY2tlcjpmdW5jdGlvbihlLHQpe3ZhciBpPXRoaXMuX2dldEluc3QoZSk7cmV0dXJuIGkmJiFpLmlubGluZSYmdGhpcy5fc2V0RGF0ZUZyb21GaWVsZChpLHQpLGk/dGhpcy5fZ2V0RGF0ZShpKTpudWxsfSxfZG9LZXlEb3duOmZ1bmN0aW9uKHQpe3ZhciBpLHMsbixhPWUuZGF0ZXBpY2tlci5fZ2V0SW5zdCh0LnRhcmdldCksbz0hMCxyPWEuZHBEaXYuaXMoIi51aS1kYXRlcGlja2VyLXJ0bCIpO2lmKGEuX2tleUV2ZW50PSEwLGUuZGF0ZXBpY2tlci5fZGF0ZXBpY2tlclNob3dpbmcpc3dpdGNoKHQua2V5Q29kZSl7Y2FzZSA5OmUuZGF0ZXBpY2tlci5faGlkZURhdGVwaWNrZXIoKSxvPSExO2JyZWFrO2Nhc2UgMTM6cmV0dXJuIG49ZSgidGQuIitlLmRhdGVwaWNrZXIuX2RheU92ZXJDbGFzcysiOm5vdCguIitlLmRhdGVwaWNrZXIuX2N1cnJlbnRDbGFzcysiKSIsYS5kcERpdiksblswXSYmZS5kYXRlcGlja2VyLl9zZWxlY3REYXkodC50YXJnZXQsYS5zZWxlY3RlZE1vbnRoLGEuc2VsZWN0ZWRZZWFyLG5bMF0pLGk9ZS5kYXRlcGlja2VyLl9nZXQoYSwib25TZWxlY3QiKSxpPyhzPWUuZGF0ZXBpY2tlci5fZm9ybWF0RGF0ZShhKSxpLmFwcGx5KGEuaW5wdXQ/YS5pbnB1dFswXTpudWxsLFtzLGFdKSk6ZS5kYXRlcGlja2VyLl9oaWRlRGF0ZXBpY2tlcigpLCExO2Nhc2UgMjc6ZS5kYXRlcGlja2VyLl9oaWRlRGF0ZXBpY2tlcigpO2JyZWFrO2Nhc2UgMzM6ZS5kYXRlcGlja2VyLl9hZGp1c3REYXRlKHQudGFyZ2V0LHQuY3RybEtleT8tZS5kYXRlcGlja2VyLl9nZXQoYSwic3RlcEJpZ01vbnRocyIpOi1lLmRhdGVwaWNrZXIuX2dldChhLCJzdGVwTW9udGhzIiksIk0iKTticmVhaztjYXNlIDM0OmUuZGF0ZXBpY2tlci5fYWRqdXN0RGF0ZSh0LnRhcmdldCx0LmN0cmxLZXk/K2UuZGF0ZXBpY2tlci5fZ2V0KGEsInN0ZXBCaWdNb250aHMiKTorZS5kYXRlcGlja2VyLl9nZXQoYSwic3RlcE1vbnRocyIpLCJNIik7YnJlYWs7Y2FzZSAzNToodC5jdHJsS2V5fHx0Lm1ldGFLZXkpJiZlLmRhdGVwaWNrZXIuX2NsZWFyRGF0ZSh0LnRhcmdldCksbz10LmN0cmxLZXl8fHQubWV0YUtleTticmVhaztjYXNlIDM2Oih0LmN0cmxLZXl8fHQubWV0YUtleSkmJmUuZGF0ZXBpY2tlci5fZ290b1RvZGF5KHQudGFyZ2V0KSxvPXQuY3RybEtleXx8dC5tZXRhS2V5O2JyZWFrO2Nhc2UgMzc6KHQuY3RybEtleXx8dC5tZXRhS2V5KSYmZS5kYXRlcGlja2VyLl9hZGp1c3REYXRlKHQudGFyZ2V0LHI/MTotMSwiRCIpLG89dC5jdHJsS2V5fHx0Lm1ldGFLZXksdC5vcmlnaW5hbEV2ZW50LmFsdEtleSYmZS5kYXRlcGlja2VyLl9hZGp1c3REYXRlKHQudGFyZ2V0LHQuY3RybEtleT8tZS5kYXRlcGlja2VyLl9nZXQoYSwic3RlcEJpZ01vbnRocyIpOi1lLmRhdGVwaWNrZXIuX2dldChhLCJzdGVwTW9udGhzIiksIk0iKTticmVhaztjYXNlIDM4Oih0LmN0cmxLZXl8fHQubWV0YUtleSkmJmUuZGF0ZXBpY2tlci5fYWRqdXN0RGF0ZSh0LnRhcmdldCwtNywiRCIpLG89dC5jdHJsS2V5fHx0Lm1ldGFLZXk7YnJlYWs7Y2FzZSAzOToodC5jdHJsS2V5fHx0Lm1ldGFLZXkpJiZlLmRhdGVwaWNrZXIuX2FkanVzdERhdGUodC50YXJnZXQscj8tMToxLCJEIiksbz10LmN0cmxLZXl8fHQubWV0YUtleSx0Lm9yaWdpbmFsRXZlbnQuYWx0S2V5JiZlLmRhdGVwaWNrZXIuX2FkanVzdERhdGUodC50YXJnZXQsdC5jdHJsS2V5PytlLmRhdGVwaWNrZXIuX2dldChhLCJzdGVwQmlnTW9udGhzIik6K2UuZGF0ZXBpY2tlci5fZ2V0KGEsInN0ZXBNb250aHMiKSwiTSIpO2JyZWFrO2Nhc2UgNDA6KHQuY3RybEtleXx8dC5tZXRhS2V5KSYmZS5kYXRlcGlja2VyLl9hZGp1c3REYXRlKHQudGFyZ2V0LDcsIkQiKSxvPXQuY3RybEtleXx8dC5tZXRhS2V5O2JyZWFrO2RlZmF1bHQ6bz0hMX1lbHNlIDM2PT09dC5rZXlDb2RlJiZ0LmN0cmxLZXk/ZS5kYXRlcGlja2VyLl9zaG93RGF0ZXBpY2tlcih0aGlzKTpvPSExO28mJih0LnByZXZlbnREZWZhdWx0KCksdC5zdG9wUHJvcGFnYXRpb24oKSl9LF9kb0tleVByZXNzOmZ1bmN0aW9uKHQpe3ZhciBpLHMsbj1lLmRhdGVwaWNrZXIuX2dldEluc3QodC50YXJnZXQpOwpyZXR1cm4gZS5kYXRlcGlja2VyLl9nZXQobiwiY29uc3RyYWluSW5wdXQiKT8oaT1lLmRhdGVwaWNrZXIuX3Bvc3NpYmxlQ2hhcnMoZS5kYXRlcGlja2VyLl9nZXQobiwiZGF0ZUZvcm1hdCIpKSxzPVN0cmluZy5mcm9tQ2hhckNvZGUobnVsbD09dC5jaGFyQ29kZT90LmtleUNvZGU6dC5jaGFyQ29kZSksdC5jdHJsS2V5fHx0Lm1ldGFLZXl8fCIgIj5zfHwhaXx8aS5pbmRleE9mKHMpPi0xKTp2b2lkIDB9LF9kb0tleVVwOmZ1bmN0aW9uKHQpe3ZhciBpLHM9ZS5kYXRlcGlja2VyLl9nZXRJbnN0KHQudGFyZ2V0KTtpZihzLmlucHV0LnZhbCgpIT09cy5sYXN0VmFsKXRyeXtpPWUuZGF0ZXBpY2tlci5wYXJzZURhdGUoZS5kYXRlcGlja2VyLl9nZXQocywiZGF0ZUZvcm1hdCIpLHMuaW5wdXQ/cy5pbnB1dC52YWwoKTpudWxsLGUuZGF0ZXBpY2tlci5fZ2V0Rm9ybWF0Q29uZmlnKHMpKSxpJiYoZS5kYXRlcGlja2VyLl9zZXREYXRlRnJvbUZpZWxkKHMpLGUuZGF0ZXBpY2tlci5fdXBkYXRlQWx0ZXJuYXRlKHMpLGUuZGF0ZXBpY2tlci5fdXBkYXRlRGF0ZXBpY2tlcihzKSl9Y2F0Y2gobil7fXJldHVybiEwfSxfc2hvd0RhdGVwaWNrZXI6ZnVuY3Rpb24odCl7aWYodD10LnRhcmdldHx8dCwiaW5wdXQiIT09dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpJiYodD1lKCJpbnB1dCIsdC5wYXJlbnROb2RlKVswXSksIWUuZGF0ZXBpY2tlci5faXNEaXNhYmxlZERhdGVwaWNrZXIodCkmJmUuZGF0ZXBpY2tlci5fbGFzdElucHV0IT09dCl7dmFyIGksbixhLG8saCxsLHU7aT1lLmRhdGVwaWNrZXIuX2dldEluc3QodCksZS5kYXRlcGlja2VyLl9jdXJJbnN0JiZlLmRhdGVwaWNrZXIuX2N1ckluc3QhPT1pJiYoZS5kYXRlcGlja2VyLl9jdXJJbnN0LmRwRGl2LnN0b3AoITAsITApLGkmJmUuZGF0ZXBpY2tlci5fZGF0ZXBpY2tlclNob3dpbmcmJmUuZGF0ZXBpY2tlci5faGlkZURhdGVwaWNrZXIoZS5kYXRlcGlja2VyLl9jdXJJbnN0LmlucHV0WzBdKSksbj1lLmRhdGVwaWNrZXIuX2dldChpLCJiZWZvcmVTaG93IiksYT1uP24uYXBwbHkodCxbdCxpXSk6e30sYSE9PSExJiYocihpLnNldHRpbmdzLGEpLGkubGFzdFZhbD1udWxsLGUuZGF0ZXBpY2tlci5fbGFzdElucHV0PXQsZS5kYXRlcGlja2VyLl9zZXREYXRlRnJvbUZpZWxkKGkpLGUuZGF0ZXBpY2tlci5faW5EaWFsb2cmJih0LnZhbHVlPSIiKSxlLmRhdGVwaWNrZXIuX3Bvc3x8KGUuZGF0ZXBpY2tlci5fcG9zPWUuZGF0ZXBpY2tlci5fZmluZFBvcyh0KSxlLmRhdGVwaWNrZXIuX3Bvc1sxXSs9dC5vZmZzZXRIZWlnaHQpLG89ITEsZSh0KS5wYXJlbnRzKCkuZWFjaChmdW5jdGlvbigpe3JldHVybiBvfD0iZml4ZWQiPT09ZSh0aGlzKS5jc3MoInBvc2l0aW9uIiksIW99KSxoPXtsZWZ0OmUuZGF0ZXBpY2tlci5fcG9zWzBdLHRvcDplLmRhdGVwaWNrZXIuX3Bvc1sxXX0sZS5kYXRlcGlja2VyLl9wb3M9bnVsbCxpLmRwRGl2LmVtcHR5KCksaS5kcERpdi5jc3Moe3Bvc2l0aW9uOiJhYnNvbHV0ZSIsZGlzcGxheToiYmxvY2siLHRvcDoiLTEwMDBweCJ9KSxlLmRhdGVwaWNrZXIuX3VwZGF0ZURhdGVwaWNrZXIoaSksaD1lLmRhdGVwaWNrZXIuX2NoZWNrT2Zmc2V0KGksaCxvKSxpLmRwRGl2LmNzcyh7cG9zaXRpb246ZS5kYXRlcGlja2VyLl9pbkRpYWxvZyYmZS5ibG9ja1VJPyJzdGF0aWMiOm8/ImZpeGVkIjoiYWJzb2x1dGUiLGRpc3BsYXk6Im5vbmUiLGxlZnQ6aC5sZWZ0KyJweCIsdG9wOmgudG9wKyJweCJ9KSxpLmlubGluZXx8KGw9ZS5kYXRlcGlja2VyLl9nZXQoaSwic2hvd0FuaW0iKSx1PWUuZGF0ZXBpY2tlci5fZ2V0KGksImR1cmF0aW9uIiksaS5kcERpdi5jc3MoInotaW5kZXgiLHMoZSh0KSkrMSksZS5kYXRlcGlja2VyLl9kYXRlcGlja2VyU2hvd2luZz0hMCxlLmVmZmVjdHMmJmUuZWZmZWN0cy5lZmZlY3RbbF0/aS5kcERpdi5zaG93KGwsZS5kYXRlcGlja2VyLl9nZXQoaSwic2hvd09wdGlvbnMiKSx1KTppLmRwRGl2W2x8fCJzaG93Il0obD91Om51bGwpLGUuZGF0ZXBpY2tlci5fc2hvdWxkRm9jdXNJbnB1dChpKSYmaS5pbnB1dC5mb2N1cygpLGUuZGF0ZXBpY2tlci5fY3VySW5zdD1pKSl9fSxfdXBkYXRlRGF0ZXBpY2tlcjpmdW5jdGlvbih0KXt0aGlzLm1heFJvd3M9NCx2PXQsdC5kcERpdi5lbXB0eSgpLmFwcGVuZCh0aGlzLl9nZW5lcmF0ZUhUTUwodCkpLHRoaXMuX2F0dGFjaEhhbmRsZXJzKHQpO3ZhciBpLHM9dGhpcy5fZ2V0TnVtYmVyT2ZNb250aHModCksbj1zWzFdLGE9MTcscj10LmRwRGl2LmZpbmQoIi4iK3RoaXMuX2RheU92ZXJDbGFzcysiIGEiKTtyLmxlbmd0aD4wJiZvLmFwcGx5KHIuZ2V0KDApKSx0LmRwRGl2LnJlbW92ZUNsYXNzKCJ1aS1kYXRlcGlja2VyLW11bHRpLTIgdWktZGF0ZXBpY2tlci1tdWx0aS0zIHVpLWRhdGVwaWNrZXItbXVsdGktNCIpLndpZHRoKCIiKSxuPjEmJnQuZHBEaXYuYWRkQ2xhc3MoInVpLWRhdGVwaWNrZXItbXVsdGktIituKS5jc3MoIndpZHRoIixhKm4rImVtIiksdC5kcERpdlsoMSE9PXNbMF18fDEhPT1zWzFdPyJhZGQiOiJyZW1vdmUiKSsiQ2xhc3MiXSgidWktZGF0ZXBpY2tlci1tdWx0aSIpLHQuZHBEaXZbKHRoaXMuX2dldCh0LCJpc1JUTCIpPyJhZGQiOiJyZW1vdmUiKSsiQ2xhc3MiXSgidWktZGF0ZXBpY2tlci1ydGwiKSx0PT09ZS5kYXRlcGlja2VyLl9jdXJJbnN0JiZlLmRhdGVwaWNrZXIuX2RhdGVwaWNrZXJTaG93aW5nJiZlLmRhdGVwaWNrZXIuX3Nob3VsZEZvY3VzSW5wdXQodCkmJnQuaW5wdXQuZm9jdXMoKSx0LnllYXJzaHRtbCYmKGk9dC55ZWFyc2h0bWwsc2V0VGltZW91dChmdW5jdGlvbigpe2k9PT10LnllYXJzaHRtbCYmdC55ZWFyc2h0bWwmJnQuZHBEaXYuZmluZCgic2VsZWN0LnVpLWRhdGVwaWNrZXIteWVhcjpmaXJzdCIpLnJlcGxhY2VXaXRoKHQueWVhcnNodG1sKSxpPXQueWVhcnNodG1sPW51bGx9LDApKX0sX3Nob3VsZEZvY3VzSW5wdXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuaW5wdXQmJmUuaW5wdXQuaXMoIjp2aXNpYmxlIikmJiFlLmlucHV0LmlzKCI6ZGlzYWJsZWQiKSYmIWUuaW5wdXQuaXMoIjpmb2N1cyIpfSxfY2hlY2tPZmZzZXQ6ZnVuY3Rpb24odCxpLHMpe3ZhciBuPXQuZHBEaXYub3V0ZXJXaWR0aCgpLGE9dC5kcERpdi5vdXRlckhlaWdodCgpLG89dC5pbnB1dD90LmlucHV0Lm91dGVyV2lkdGgoKTowLHI9dC5pbnB1dD90LmlucHV0Lm91dGVySGVpZ2h0KCk6MCxoPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCsocz8wOmUoZG9jdW1lbnQpLnNjcm9sbExlZnQoKSksbD1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KyhzPzA6ZShkb2N1bWVudCkuc2Nyb2xsVG9wKCkpO3JldHVybiBpLmxlZnQtPXRoaXMuX2dldCh0LCJpc1JUTCIpP24tbzowLGkubGVmdC09cyYmaS5sZWZ0PT09dC5pbnB1dC5vZmZzZXQoKS5sZWZ0P2UoZG9jdW1lbnQpLnNjcm9sbExlZnQoKTowLGkudG9wLT1zJiZpLnRvcD09PXQuaW5wdXQub2Zmc2V0KCkudG9wK3I/ZShkb2N1bWVudCkuc2Nyb2xsVG9wKCk6MCxpLmxlZnQtPU1hdGgubWluKGkubGVmdCxpLmxlZnQrbj5oJiZoPm4/TWF0aC5hYnMoaS5sZWZ0K24taCk6MCksaS50b3AtPU1hdGgubWluKGkudG9wLGkudG9wK2E+bCYmbD5hP01hdGguYWJzKGErcik6MCksaX0sX2ZpbmRQb3M6ZnVuY3Rpb24odCl7Zm9yKHZhciBpLHM9dGhpcy5fZ2V0SW5zdCh0KSxuPXRoaXMuX2dldChzLCJpc1JUTCIpO3QmJigiaGlkZGVuIj09PXQudHlwZXx8MSE9PXQubm9kZVR5cGV8fGUuZXhwci5maWx0ZXJzLmhpZGRlbih0KSk7KXQ9dFtuPyJwcmV2aW91c1NpYmxpbmciOiJuZXh0U2libGluZyJdO3JldHVybiBpPWUodCkub2Zmc2V0KCksW2kubGVmdCxpLnRvcF19LF9oaWRlRGF0ZXBpY2tlcjpmdW5jdGlvbih0KXt2YXIgaSxzLG4sYSxvPXRoaXMuX2N1ckluc3Q7IW98fHQmJm8hPT1lLmRhdGEodCwiZGF0ZXBpY2tlciIpfHx0aGlzLl9kYXRlcGlja2VyU2hvd2luZyYmKGk9dGhpcy5fZ2V0KG8sInNob3dBbmltIikscz10aGlzLl9nZXQobywiZHVyYXRpb24iKSxuPWZ1bmN0aW9uKCl7ZS5kYXRlcGlja2VyLl90aWR5RGlhbG9nKG8pfSxlLmVmZmVjdHMmJihlLmVmZmVjdHMuZWZmZWN0W2ldfHxlLmVmZmVjdHNbaV0pP28uZHBEaXYuaGlkZShpLGUuZGF0ZXBpY2tlci5fZ2V0KG8sInNob3dPcHRpb25zIikscyxuKTpvLmRwRGl2WyJzbGlkZURvd24iPT09aT8ic2xpZGVVcCI6ImZhZGVJbiI9PT1pPyJmYWRlT3V0IjoiaGlkZSJdKGk/czpudWxsLG4pLGl8fG4oKSx0aGlzLl9kYXRlcGlja2VyU2hvd2luZz0hMSxhPXRoaXMuX2dldChvLCJvbkNsb3NlIiksYSYmYS5hcHBseShvLmlucHV0P28uaW5wdXRbMF06bnVsbCxbby5pbnB1dD9vLmlucHV0LnZhbCgpOiIiLG9dKSx0aGlzLl9sYXN0SW5wdXQ9bnVsbCx0aGlzLl9pbkRpYWxvZyYmKHRoaXMuX2RpYWxvZ0lucHV0LmNzcyh7cG9zaXRpb246ImFic29sdXRlIixsZWZ0OiIwIix0b3A6Ii0xMDBweCJ9KSxlLmJsb2NrVUkmJihlLnVuYmxvY2tVSSgpLGUoImJvZHkiKS5hcHBlbmQodGhpcy5kcERpdikpKSx0aGlzLl9pbkRpYWxvZz0hMSl9LF90aWR5RGlhbG9nOmZ1bmN0aW9uKGUpe2UuZHBEaXYucmVtb3ZlQ2xhc3ModGhpcy5fZGlhbG9nQ2xhc3MpLnVuYmluZCgiLnVpLWRhdGVwaWNrZXItY2FsZW5kYXIiKX0sX2NoZWNrRXh0ZXJuYWxDbGljazpmdW5jdGlvbih0KXtpZihlLmRhdGVwaWNrZXIuX2N1ckluc3Qpe3ZhciBpPWUodC50YXJnZXQpLHM9ZS5kYXRlcGlja2VyLl9nZXRJbnN0KGlbMF0pOyhpWzBdLmlkIT09ZS5kYXRlcGlja2VyLl9tYWluRGl2SWQmJjA9PT1pLnBhcmVudHMoIiMiK2UuZGF0ZXBpY2tlci5fbWFpbkRpdklkKS5sZW5ndGgmJiFpLmhhc0NsYXNzKGUuZGF0ZXBpY2tlci5tYXJrZXJDbGFzc05hbWUpJiYhaS5jbG9zZXN0KCIuIitlLmRhdGVwaWNrZXIuX3RyaWdnZXJDbGFzcykubGVuZ3RoJiZlLmRhdGVwaWNrZXIuX2RhdGVwaWNrZXJTaG93aW5nJiYoIWUuZGF0ZXBpY2tlci5faW5EaWFsb2d8fCFlLmJsb2NrVUkpfHxpLmhhc0NsYXNzKGUuZGF0ZXBpY2tlci5tYXJrZXJDbGFzc05hbWUpJiZlLmRhdGVwaWNrZXIuX2N1ckluc3QhPT1zKSYmZS5kYXRlcGlja2VyLl9oaWRlRGF0ZXBpY2tlcigpfX0sX2FkanVzdERhdGU6ZnVuY3Rpb24odCxpLHMpe3ZhciBuPWUodCksYT10aGlzLl9nZXRJbnN0KG5bMF0pO3RoaXMuX2lzRGlzYWJsZWREYXRlcGlja2VyKG5bMF0pfHwodGhpcy5fYWRqdXN0SW5zdERhdGUoYSxpKygiTSI9PT1zP3RoaXMuX2dldChhLCJzaG93Q3VycmVudEF0UG9zIik6MCkscyksdGhpcy5fdXBkYXRlRGF0ZXBpY2tlcihhKSl9LF9nb3RvVG9kYXk6ZnVuY3Rpb24odCl7dmFyIGkscz1lKHQpLG49dGhpcy5fZ2V0SW5zdChzWzBdKTt0aGlzLl9nZXQobiwiZ290b0N1cnJlbnQiKSYmbi5jdXJyZW50RGF5PyhuLnNlbGVjdGVkRGF5PW4uY3VycmVudERheSxuLmRyYXdNb250aD1uLnNlbGVjdGVkTW9udGg9bi5jdXJyZW50TW9udGgsbi5kcmF3WWVhcj1uLnNlbGVjdGVkWWVhcj1uLmN1cnJlbnRZZWFyKTooaT1uZXcgRGF0ZSxuLnNlbGVjdGVkRGF5PWkuZ2V0RGF0ZSgpLG4uZHJhd01vbnRoPW4uc2VsZWN0ZWRNb250aD1pLmdldE1vbnRoKCksbi5kcmF3WWVhcj1uLnNlbGVjdGVkWWVhcj1pLmdldEZ1bGxZZWFyKCkpLHRoaXMuX25vdGlmeUNoYW5nZShuKSx0aGlzLl9hZGp1c3REYXRlKHMpfSxfc2VsZWN0TW9udGhZZWFyOmZ1bmN0aW9uKHQsaSxzKXt2YXIgbj1lKHQpLGE9dGhpcy5fZ2V0SW5zdChuWzBdKTthWyJzZWxlY3RlZCIrKCJNIj09PXM/Ik1vbnRoIjoiWWVhciIpXT1hWyJkcmF3IisoIk0iPT09cz8iTW9udGgiOiJZZWFyIildPXBhcnNlSW50KGkub3B0aW9uc1tpLnNlbGVjdGVkSW5kZXhdLnZhbHVlLDEwKSx0aGlzLl9ub3RpZnlDaGFuZ2UoYSksdGhpcy5fYWRqdXN0RGF0ZShuKX0sX3NlbGVjdERheTpmdW5jdGlvbih0LGkscyxuKXt2YXIgYSxvPWUodCk7ZShuKS5oYXNDbGFzcyh0aGlzLl91bnNlbGVjdGFibGVDbGFzcyl8fHRoaXMuX2lzRGlzYWJsZWREYXRlcGlja2VyKG9bMF0pfHwoYT10aGlzLl9nZXRJbnN0KG9bMF0pLGEuc2VsZWN0ZWREYXk9YS5jdXJyZW50RGF5PWUoImEiLG4pLmh0bWwoKSxhLnNlbGVjdGVkTW9udGg9YS5jdXJyZW50TW9udGg9aSxhLnNlbGVjdGVkWWVhcj1hLmN1cnJlbnRZZWFyPXMsdGhpcy5fc2VsZWN0RGF0ZSh0LHRoaXMuX2Zvcm1hdERhdGUoYSxhLmN1cnJlbnREYXksYS5jdXJyZW50TW9udGgsYS5jdXJyZW50WWVhcikpKX0sX2NsZWFyRGF0ZTpmdW5jdGlvbih0KXt2YXIgaT1lKHQpO3RoaXMuX3NlbGVjdERhdGUoaSwiIil9LF9zZWxlY3REYXRlOmZ1bmN0aW9uKHQsaSl7dmFyIHMsbj1lKHQpLGE9dGhpcy5fZ2V0SW5zdChuWzBdKTtpPW51bGwhPWk/aTp0aGlzLl9mb3JtYXREYXRlKGEpLGEuaW5wdXQmJmEuaW5wdXQudmFsKGkpLHRoaXMuX3VwZGF0ZUFsdGVybmF0ZShhKSxzPXRoaXMuX2dldChhLCJvblNlbGVjdCIpLHM/cy5hcHBseShhLmlucHV0P2EuaW5wdXRbMF06bnVsbCxbaSxhXSk6YS5pbnB1dCYmYS5pbnB1dC50cmlnZ2VyKCJjaGFuZ2UiKSxhLmlubGluZT90aGlzLl91cGRhdGVEYXRlcGlja2VyKGEpOih0aGlzLl9oaWRlRGF0ZXBpY2tlcigpLHRoaXMuX2xhc3RJbnB1dD1hLmlucHV0WzBdLCJvYmplY3QiIT10eXBlb2YgYS5pbnB1dFswXSYmYS5pbnB1dC5mb2N1cygpLHRoaXMuX2xhc3RJbnB1dD1udWxsKX0sX3VwZGF0ZUFsdGVybmF0ZTpmdW5jdGlvbih0KXt2YXIgaSxzLG4sYT10aGlzLl9nZXQodCwiYWx0RmllbGQiKTthJiYoaT10aGlzLl9nZXQodCwiYWx0Rm9ybWF0Iil8fHRoaXMuX2dldCh0LCJkYXRlRm9ybWF0Iikscz10aGlzLl9nZXREYXRlKHQpLG49dGhpcy5mb3JtYXREYXRlKGkscyx0aGlzLl9nZXRGb3JtYXRDb25maWcodCkpLGUoYSkuZWFjaChmdW5jdGlvbigpe2UodGhpcykudmFsKG4pfSkpfSxub1dlZWtlbmRzOmZ1bmN0aW9uKGUpe3ZhciB0PWUuZ2V0RGF5KCk7cmV0dXJuW3Q+MCYmNj50LCIiXX0saXNvODYwMVdlZWs6ZnVuY3Rpb24oZSl7dmFyIHQsaT1uZXcgRGF0ZShlLmdldFRpbWUoKSk7cmV0dXJuIGkuc2V0RGF0ZShpLmdldERhdGUoKSs0LShpLmdldERheSgpfHw3KSksdD1pLmdldFRpbWUoKSxpLnNldE1vbnRoKDApLGkuc2V0RGF0ZSgxKSxNYXRoLmZsb29yKE1hdGgucm91bmQoKHQtaSkvODY0ZTUpLzcpKzF9LHBhcnNlRGF0ZTpmdW5jdGlvbih0LGkscyl7aWYobnVsbD09dHx8bnVsbD09aSl0aHJvdyJJbnZhbGlkIGFyZ3VtZW50cyI7aWYoaT0ib2JqZWN0Ij09dHlwZW9mIGk/IiIraTppKyIiLCIiPT09aSlyZXR1cm4gbnVsbDt2YXIgbixhLG8scixoPTAsbD0ocz9zLnNob3J0WWVhckN1dG9mZjpudWxsKXx8dGhpcy5fZGVmYXVsdHMuc2hvcnRZZWFyQ3V0b2ZmLHU9InN0cmluZyIhPXR5cGVvZiBsP2w6KG5ldyBEYXRlKS5nZXRGdWxsWWVhcigpJTEwMCtwYXJzZUludChsLDEwKSxkPShzP3MuZGF5TmFtZXNTaG9ydDpudWxsKXx8dGhpcy5fZGVmYXVsdHMuZGF5TmFtZXNTaG9ydCxjPShzP3MuZGF5TmFtZXM6bnVsbCl8fHRoaXMuX2RlZmF1bHRzLmRheU5hbWVzLHA9KHM/cy5tb250aE5hbWVzU2hvcnQ6bnVsbCl8fHRoaXMuX2RlZmF1bHRzLm1vbnRoTmFtZXNTaG9ydCxmPShzP3MubW9udGhOYW1lczpudWxsKXx8dGhpcy5fZGVmYXVsdHMubW9udGhOYW1lcyxtPS0xLGc9LTEsdj0tMSx5PS0xLGI9ITEsXz1mdW5jdGlvbihlKXt2YXIgaT10Lmxlbmd0aD5uKzEmJnQuY2hhckF0KG4rMSk9PT1lO3JldHVybiBpJiZuKyssaX0seD1mdW5jdGlvbihlKXt2YXIgdD1fKGUpLHM9IkAiPT09ZT8xNDoiISI9PT1lPzIwOiJ5Ij09PWUmJnQ/NDoibyI9PT1lPzM6MixuPSJ5Ij09PWU/czoxLGE9UmVnRXhwKCJeXFxkeyIrbisiLCIrcysifSIpLG89aS5zdWJzdHJpbmcoaCkubWF0Y2goYSk7aWYoIW8pdGhyb3ciTWlzc2luZyBudW1iZXIgYXQgcG9zaXRpb24gIitoO3JldHVybiBoKz1vWzBdLmxlbmd0aCxwYXJzZUludChvWzBdLDEwKX0sdz1mdW5jdGlvbih0LHMsbil7dmFyIGE9LTEsbz1lLm1hcChfKHQpP246cyxmdW5jdGlvbihlLHQpe3JldHVybltbdCxlXV19KS5zb3J0KGZ1bmN0aW9uKGUsdCl7cmV0dXJuLShlWzFdLmxlbmd0aC10WzFdLmxlbmd0aCl9KTtpZihlLmVhY2gobyxmdW5jdGlvbihlLHQpe3ZhciBzPXRbMV07cmV0dXJuIGkuc3Vic3RyKGgscy5sZW5ndGgpLnRvTG93ZXJDYXNlKCk9PT1zLnRvTG93ZXJDYXNlKCk/KGE9dFswXSxoKz1zLmxlbmd0aCwhMSk6dm9pZCAwfSksLTEhPT1hKXJldHVybiBhKzE7dGhyb3ciVW5rbm93biBuYW1lIGF0IHBvc2l0aW9uICIraH0saz1mdW5jdGlvbigpe2lmKGkuY2hhckF0KGgpIT09dC5jaGFyQXQobikpdGhyb3ciVW5leHBlY3RlZCBsaXRlcmFsIGF0IHBvc2l0aW9uICIraDtoKyt9O2ZvcihuPTA7dC5sZW5ndGg+bjtuKyspaWYoYikiJyIhPT10LmNoYXJBdChuKXx8XygiJyIpP2soKTpiPSExO2Vsc2Ugc3dpdGNoKHQuY2hhckF0KG4pKXtjYXNlImQiOnY9eCgiZCIpO2JyZWFrO2Nhc2UiRCI6dygiRCIsZCxjKTticmVhaztjYXNlIm8iOnk9eCgibyIpO2JyZWFrO2Nhc2UibSI6Zz14KCJtIik7YnJlYWs7Y2FzZSJNIjpnPXcoIk0iLHAsZik7YnJlYWs7Y2FzZSJ5IjptPXgoInkiKTticmVhaztjYXNlIkAiOnI9bmV3IERhdGUoeCgiQCIpKSxtPXIuZ2V0RnVsbFllYXIoKSxnPXIuZ2V0TW9udGgoKSsxLHY9ci5nZXREYXRlKCk7YnJlYWs7Y2FzZSIhIjpyPW5ldyBEYXRlKCh4KCIhIiktdGhpcy5fdGlja3NUbzE5NzApLzFlNCksbT1yLmdldEZ1bGxZZWFyKCksZz1yLmdldE1vbnRoKCkrMSx2PXIuZ2V0RGF0ZSgpO2JyZWFrO2Nhc2UiJyI6XygiJyIpP2soKTpiPSEwO2JyZWFrO2RlZmF1bHQ6aygpfWlmKGkubGVuZ3RoPmgmJihvPWkuc3Vic3RyKGgpLCEvXlxzKy8udGVzdChvKSkpdGhyb3ciRXh0cmEvdW5wYXJzZWQgY2hhcmFjdGVycyBmb3VuZCBpbiBkYXRlOiAiK287aWYoLTE9PT1tP209KG5ldyBEYXRlKS5nZXRGdWxsWWVhcigpOjEwMD5tJiYobSs9KG5ldyBEYXRlKS5nZXRGdWxsWWVhcigpLShuZXcgRGF0ZSkuZ2V0RnVsbFllYXIoKSUxMDArKHU+PW0/MDotMTAwKSkseT4tMSlmb3IoZz0xLHY9eTs7KXtpZihhPXRoaXMuX2dldERheXNJbk1vbnRoKG0sZy0xKSxhPj12KWJyZWFrO2crKyx2LT1hfWlmKHI9dGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUobSxnLTEsdikpLHIuZ2V0RnVsbFllYXIoKSE9PW18fHIuZ2V0TW9udGgoKSsxIT09Z3x8ci5nZXREYXRlKCkhPT12KXRocm93IkludmFsaWQgZGF0ZSI7cmV0dXJuIHJ9LEFUT006Inl5LW1tLWRkIixDT09LSUU6IkQsIGRkIE0geXkiLElTT184NjAxOiJ5eS1tbS1kZCIsUkZDXzgyMjoiRCwgZCBNIHkiLFJGQ184NTA6IkRELCBkZC1NLXkiLFJGQ18xMDM2OiJELCBkIE0geSIsUkZDXzExMjM6IkQsIGQgTSB5eSIsUkZDXzI4MjI6IkQsIGQgTSB5eSIsUlNTOiJELCBkIE0geSIsVElDS1M6IiEiLFRJTUVTVEFNUDoiQCIsVzNDOiJ5eS1tbS1kZCIsX3RpY2tzVG8xOTcwOjFlNyo2MCo2MCoyNCooNzE4Njg1K01hdGguZmxvb3IoNDkyLjUpLU1hdGguZmxvb3IoMTkuNykrTWF0aC5mbG9vcig0LjkyNSkpLGZvcm1hdERhdGU6ZnVuY3Rpb24oZSx0LGkpe2lmKCF0KXJldHVybiIiO3ZhciBzLG49KGk/aS5kYXlOYW1lc1Nob3J0Om51bGwpfHx0aGlzLl9kZWZhdWx0cy5kYXlOYW1lc1Nob3J0LGE9KGk/aS5kYXlOYW1lczpudWxsKXx8dGhpcy5fZGVmYXVsdHMuZGF5TmFtZXMsbz0oaT9pLm1vbnRoTmFtZXNTaG9ydDpudWxsKXx8dGhpcy5fZGVmYXVsdHMubW9udGhOYW1lc1Nob3J0LHI9KGk/aS5tb250aE5hbWVzOm51bGwpfHx0aGlzLl9kZWZhdWx0cy5tb250aE5hbWVzLGg9ZnVuY3Rpb24odCl7dmFyIGk9ZS5sZW5ndGg+cysxJiZlLmNoYXJBdChzKzEpPT09dDtyZXR1cm4gaSYmcysrLGl9LGw9ZnVuY3Rpb24oZSx0LGkpe3ZhciBzPSIiK3Q7aWYoaChlKSlmb3IoO2k+cy5sZW5ndGg7KXM9IjAiK3M7cmV0dXJuIHN9LHU9ZnVuY3Rpb24oZSx0LGkscyl7cmV0dXJuIGgoZSk/c1t0XTppW3RdfSxkPSIiLGM9ITE7aWYodClmb3Iocz0wO2UubGVuZ3RoPnM7cysrKWlmKGMpIiciIT09ZS5jaGFyQXQocyl8fGgoIiciKT9kKz1lLmNoYXJBdChzKTpjPSExO2Vsc2Ugc3dpdGNoKGUuY2hhckF0KHMpKXtjYXNlImQiOmQrPWwoImQiLHQuZ2V0RGF0ZSgpLDIpO2JyZWFrO2Nhc2UiRCI6ZCs9dSgiRCIsdC5nZXREYXkoKSxuLGEpO2JyZWFrO2Nhc2UibyI6ZCs9bCgibyIsTWF0aC5yb3VuZCgobmV3IERhdGUodC5nZXRGdWxsWWVhcigpLHQuZ2V0TW9udGgoKSx0LmdldERhdGUoKSkuZ2V0VGltZSgpLW5ldyBEYXRlKHQuZ2V0RnVsbFllYXIoKSwwLDApLmdldFRpbWUoKSkvODY0ZTUpLDMpO2JyZWFrO2Nhc2UibSI6ZCs9bCgibSIsdC5nZXRNb250aCgpKzEsMik7YnJlYWs7Y2FzZSJNIjpkKz11KCJNIix0LmdldE1vbnRoKCksbyxyKTticmVhaztjYXNlInkiOmQrPWgoInkiKT90LmdldEZ1bGxZZWFyKCk6KDEwPnQuZ2V0WWVhcigpJTEwMD8iMCI6IiIpK3QuZ2V0WWVhcigpJTEwMDticmVhaztjYXNlIkAiOmQrPXQuZ2V0VGltZSgpO2JyZWFrO2Nhc2UiISI6ZCs9MWU0KnQuZ2V0VGltZSgpK3RoaXMuX3RpY2tzVG8xOTcwO2JyZWFrO2Nhc2UiJyI6aCgiJyIpP2QrPSInIjpjPSEwO2JyZWFrO2RlZmF1bHQ6ZCs9ZS5jaGFyQXQocyl9cmV0dXJuIGR9LF9wb3NzaWJsZUNoYXJzOmZ1bmN0aW9uKGUpe3ZhciB0LGk9IiIscz0hMSxuPWZ1bmN0aW9uKGkpe3ZhciBzPWUubGVuZ3RoPnQrMSYmZS5jaGFyQXQodCsxKT09PWk7cmV0dXJuIHMmJnQrKyxzfTtmb3IodD0wO2UubGVuZ3RoPnQ7dCsrKWlmKHMpIiciIT09ZS5jaGFyQXQodCl8fG4oIiciKT9pKz1lLmNoYXJBdCh0KTpzPSExO2Vsc2Ugc3dpdGNoKGUuY2hhckF0KHQpKXtjYXNlImQiOmNhc2UibSI6Y2FzZSJ5IjpjYXNlIkAiOmkrPSIwMTIzNDU2Nzg5IjticmVhaztjYXNlIkQiOmNhc2UiTSI6cmV0dXJuIG51bGw7Y2FzZSInIjpuKCInIik/aSs9IiciOnM9ITA7YnJlYWs7ZGVmYXVsdDppKz1lLmNoYXJBdCh0KX1yZXR1cm4gaX0sX2dldDpmdW5jdGlvbihlLHQpe3JldHVybiB2b2lkIDAhPT1lLnNldHRpbmdzW3RdP2Uuc2V0dGluZ3NbdF06dGhpcy5fZGVmYXVsdHNbdF19LF9zZXREYXRlRnJvbUZpZWxkOmZ1bmN0aW9uKGUsdCl7aWYoZS5pbnB1dC52YWwoKSE9PWUubGFzdFZhbCl7dmFyIGk9dGhpcy5fZ2V0KGUsImRhdGVGb3JtYXQiKSxzPWUubGFzdFZhbD1lLmlucHV0P2UuaW5wdXQudmFsKCk6bnVsbCxuPXRoaXMuX2dldERlZmF1bHREYXRlKGUpLGE9bixvPXRoaXMuX2dldEZvcm1hdENvbmZpZyhlKTt0cnl7YT10aGlzLnBhcnNlRGF0ZShpLHMsbyl8fG59Y2F0Y2gocil7cz10PyIiOnN9ZS5zZWxlY3RlZERheT1hLmdldERhdGUoKSxlLmRyYXdNb250aD1lLnNlbGVjdGVkTW9udGg9YS5nZXRNb250aCgpLGUuZHJhd1llYXI9ZS5zZWxlY3RlZFllYXI9YS5nZXRGdWxsWWVhcigpLGUuY3VycmVudERheT1zP2EuZ2V0RGF0ZSgpOjAsZS5jdXJyZW50TW9udGg9cz9hLmdldE1vbnRoKCk6MCxlLmN1cnJlbnRZZWFyPXM/YS5nZXRGdWxsWWVhcigpOjAsdGhpcy5fYWRqdXN0SW5zdERhdGUoZSl9fSxfZ2V0RGVmYXVsdERhdGU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3Jlc3RyaWN0TWluTWF4KGUsdGhpcy5fZGV0ZXJtaW5lRGF0ZShlLHRoaXMuX2dldChlLCJkZWZhdWx0RGF0ZSIpLG5ldyBEYXRlKSl9LF9kZXRlcm1pbmVEYXRlOmZ1bmN0aW9uKHQsaSxzKXt2YXIgbj1mdW5jdGlvbihlKXt2YXIgdD1uZXcgRGF0ZTtyZXR1cm4gdC5zZXREYXRlKHQuZ2V0RGF0ZSgpK2UpLHR9LGE9ZnVuY3Rpb24oaSl7dHJ5e3JldHVybiBlLmRhdGVwaWNrZXIucGFyc2VEYXRlKGUuZGF0ZXBpY2tlci5fZ2V0KHQsImRhdGVGb3JtYXQiKSxpLGUuZGF0ZXBpY2tlci5fZ2V0Rm9ybWF0Q29uZmlnKHQpKX1jYXRjaChzKXt9Zm9yKHZhciBuPShpLnRvTG93ZXJDYXNlKCkubWF0Y2goL15jLyk/ZS5kYXRlcGlja2VyLl9nZXREYXRlKHQpOm51bGwpfHxuZXcgRGF0ZSxhPW4uZ2V0RnVsbFllYXIoKSxvPW4uZ2V0TW9udGgoKSxyPW4uZ2V0RGF0ZSgpLGg9LyhbK1wtXT9bMC05XSspXHMqKGR8RHx3fFd8bXxNfHl8WSk/L2csbD1oLmV4ZWMoaSk7bDspe3N3aXRjaChsWzJdfHwiZCIpe2Nhc2UiZCI6Y2FzZSJEIjpyKz1wYXJzZUludChsWzFdLDEwKTticmVhaztjYXNlInciOmNhc2UiVyI6cis9NypwYXJzZUludChsWzFdLDEwKTticmVhaztjYXNlIm0iOmNhc2UiTSI6bys9cGFyc2VJbnQobFsxXSwxMCkscj1NYXRoLm1pbihyLGUuZGF0ZXBpY2tlci5fZ2V0RGF5c0luTW9udGgoYSxvKSk7YnJlYWs7Y2FzZSJ5IjpjYXNlIlkiOmErPXBhcnNlSW50KGxbMV0sMTApLHI9TWF0aC5taW4ocixlLmRhdGVwaWNrZXIuX2dldERheXNJbk1vbnRoKGEsbykpfWw9aC5leGVjKGkpfXJldHVybiBuZXcgRGF0ZShhLG8scil9LG89bnVsbD09aXx8IiI9PT1pP3M6InN0cmluZyI9PXR5cGVvZiBpP2EoaSk6Im51bWJlciI9PXR5cGVvZiBpP2lzTmFOKGkpP3M6bihpKTpuZXcgRGF0ZShpLmdldFRpbWUoKSk7cmV0dXJuIG89byYmIkludmFsaWQgRGF0ZSI9PSIiK28/czpvLG8mJihvLnNldEhvdXJzKDApLG8uc2V0TWludXRlcygwKSxvLnNldFNlY29uZHMoMCksby5zZXRNaWxsaXNlY29uZHMoMCkpLHRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG8pfSxfZGF5bGlnaHRTYXZpbmdBZGp1c3Q6ZnVuY3Rpb24oZSl7cmV0dXJuIGU/KGUuc2V0SG91cnMoZS5nZXRIb3VycygpPjEyP2UuZ2V0SG91cnMoKSsyOjApLGUpOm51bGx9LF9zZXREYXRlOmZ1bmN0aW9uKGUsdCxpKXt2YXIgcz0hdCxuPWUuc2VsZWN0ZWRNb250aCxhPWUuc2VsZWN0ZWRZZWFyLG89dGhpcy5fcmVzdHJpY3RNaW5NYXgoZSx0aGlzLl9kZXRlcm1pbmVEYXRlKGUsdCxuZXcgRGF0ZSkpO2Uuc2VsZWN0ZWREYXk9ZS5jdXJyZW50RGF5PW8uZ2V0RGF0ZSgpLGUuZHJhd01vbnRoPWUuc2VsZWN0ZWRNb250aD1lLmN1cnJlbnRNb250aD1vLmdldE1vbnRoKCksZS5kcmF3WWVhcj1lLnNlbGVjdGVkWWVhcj1lLmN1cnJlbnRZZWFyPW8uZ2V0RnVsbFllYXIoKSxuPT09ZS5zZWxlY3RlZE1vbnRoJiZhPT09ZS5zZWxlY3RlZFllYXJ8fGl8fHRoaXMuX25vdGlmeUNoYW5nZShlKSx0aGlzLl9hZGp1c3RJbnN0RGF0ZShlKSxlLmlucHV0JiZlLmlucHV0LnZhbChzPyIiOnRoaXMuX2Zvcm1hdERhdGUoZSkpfSxfZ2V0RGF0ZTpmdW5jdGlvbihlKXt2YXIgdD0hZS5jdXJyZW50WWVhcnx8ZS5pbnB1dCYmIiI9PT1lLmlucHV0LnZhbCgpP251bGw6dGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUoZS5jdXJyZW50WWVhcixlLmN1cnJlbnRNb250aCxlLmN1cnJlbnREYXkpKTtyZXR1cm4gdH0sX2F0dGFjaEhhbmRsZXJzOmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMuX2dldCh0LCJzdGVwTW9udGhzIikscz0iIyIrdC5pZC5yZXBsYWNlKC9cXFxcL2csIlxcIik7dC5kcERpdi5maW5kKCJbZGF0YS1oYW5kbGVyXSIpLm1hcChmdW5jdGlvbigpe3ZhciB0PXtwcmV2OmZ1bmN0aW9uKCl7ZS5kYXRlcGlja2VyLl9hZGp1c3REYXRlKHMsLWksIk0iKX0sbmV4dDpmdW5jdGlvbigpe2UuZGF0ZXBpY2tlci5fYWRqdXN0RGF0ZShzLCtpLCJNIil9LGhpZGU6ZnVuY3Rpb24oKXtlLmRhdGVwaWNrZXIuX2hpZGVEYXRlcGlja2VyKCl9LHRvZGF5OmZ1bmN0aW9uKCl7ZS5kYXRlcGlja2VyLl9nb3RvVG9kYXkocyl9LHNlbGVjdERheTpmdW5jdGlvbigpe3JldHVybiBlLmRhdGVwaWNrZXIuX3NlbGVjdERheShzLCt0aGlzLmdldEF0dHJpYnV0ZSgiZGF0YS1tb250aCIpLCt0aGlzLmdldEF0dHJpYnV0ZSgiZGF0YS15ZWFyIiksdGhpcyksITF9LHNlbGVjdE1vbnRoOmZ1bmN0aW9uKCl7cmV0dXJuIGUuZGF0ZXBpY2tlci5fc2VsZWN0TW9udGhZZWFyKHMsdGhpcywiTSIpLCExfSxzZWxlY3RZZWFyOmZ1bmN0aW9uKCl7cmV0dXJuIGUuZGF0ZXBpY2tlci5fc2VsZWN0TW9udGhZZWFyKHMsdGhpcywiWSIpLCExfX07ZSh0aGlzKS5iaW5kKHRoaXMuZ2V0QXR0cmlidXRlKCJkYXRhLWV2ZW50IiksdFt0aGlzLmdldEF0dHJpYnV0ZSgiZGF0YS1oYW5kbGVyIildKX0pfSxfZ2VuZXJhdGVIVE1MOmZ1bmN0aW9uKGUpe3ZhciB0LGkscyxuLGEsbyxyLGgsbCx1LGQsYyxwLGYsbSxnLHYseSxiLF8seCx3LGssVCxELFMsTSxDLE4sQSxQLEksSCx6LEYsRSxPLGosVyxMPW5ldyBEYXRlLFI9dGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUoTC5nZXRGdWxsWWVhcigpLEwuZ2V0TW9udGgoKSxMLmdldERhdGUoKSkpLFk9dGhpcy5fZ2V0KGUsImlzUlRMIiksQj10aGlzLl9nZXQoZSwic2hvd0J1dHRvblBhbmVsIiksSj10aGlzLl9nZXQoZSwiaGlkZUlmTm9QcmV2TmV4dCIpLHE9dGhpcy5fZ2V0KGUsIm5hdmlnYXRpb25Bc0RhdGVGb3JtYXQiKSxLPXRoaXMuX2dldE51bWJlck9mTW9udGhzKGUpLFY9dGhpcy5fZ2V0KGUsInNob3dDdXJyZW50QXRQb3MiKSxVPXRoaXMuX2dldChlLCJzdGVwTW9udGhzIiksUT0xIT09S1swXXx8MSE9PUtbMV0sRz10aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChlLmN1cnJlbnREYXk/bmV3IERhdGUoZS5jdXJyZW50WWVhcixlLmN1cnJlbnRNb250aCxlLmN1cnJlbnREYXkpOm5ldyBEYXRlKDk5OTksOSw5KSksWD10aGlzLl9nZXRNaW5NYXhEYXRlKGUsIm1pbiIpLCQ9dGhpcy5fZ2V0TWluTWF4RGF0ZShlLCJtYXgiKSxaPWUuZHJhd01vbnRoLVYsZXQ9ZS5kcmF3WWVhcjtpZigwPlomJihaKz0xMixldC0tKSwkKWZvcih0PXRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKCQuZ2V0RnVsbFllYXIoKSwkLmdldE1vbnRoKCktS1swXSpLWzFdKzEsJC5nZXREYXRlKCkpKSx0PVgmJlg+dD9YOnQ7dGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUoZXQsWiwxKSk+dDspWi0tLDA+WiYmKFo9MTEsZXQtLSk7Zm9yKGUuZHJhd01vbnRoPVosZS5kcmF3WWVhcj1ldCxpPXRoaXMuX2dldChlLCJwcmV2VGV4dCIpLGk9cT90aGlzLmZvcm1hdERhdGUoaSx0aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShldCxaLVUsMSkpLHRoaXMuX2dldEZvcm1hdENvbmZpZyhlKSk6aSxzPXRoaXMuX2NhbkFkanVzdE1vbnRoKGUsLTEsZXQsWik/IjxhIGNsYXNzPSd1aS1kYXRlcGlja2VyLXByZXYgdWktY29ybmVyLWFsbCcgZGF0YS1oYW5kbGVyPSdwcmV2JyBkYXRhLWV2ZW50PSdjbGljaycgdGl0bGU9JyIraSsiJz48c3BhbiBjbGFzcz0ndWktaWNvbiB1aS1pY29uLWNpcmNsZS10cmlhbmdsZS0iKyhZPyJlIjoidyIpKyInPiIraSsiPC9zcGFuPjwvYT4iOko/IiI6IjxhIGNsYXNzPSd1aS1kYXRlcGlja2VyLXByZXYgdWktY29ybmVyLWFsbCB1aS1zdGF0ZS1kaXNhYmxlZCcgdGl0bGU9JyIraSsiJz48c3BhbiBjbGFzcz0ndWktaWNvbiB1aS1pY29uLWNpcmNsZS10cmlhbmdsZS0iKyhZPyJlIjoidyIpKyInPiIraSsiPC9zcGFuPjwvYT4iLG49dGhpcy5fZ2V0KGUsIm5leHRUZXh0Iiksbj1xP3RoaXMuZm9ybWF0RGF0ZShuLHRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKGV0LForVSwxKSksdGhpcy5fZ2V0Rm9ybWF0Q29uZmlnKGUpKTpuLGE9dGhpcy5fY2FuQWRqdXN0TW9udGgoZSwxLGV0LFopPyI8YSBjbGFzcz0ndWktZGF0ZXBpY2tlci1uZXh0IHVpLWNvcm5lci1hbGwnIGRhdGEtaGFuZGxlcj0nbmV4dCcgZGF0YS1ldmVudD0nY2xpY2snIHRpdGxlPSciK24rIic+PHNwYW4gY2xhc3M9J3VpLWljb24gdWktaWNvbi1jaXJjbGUtdHJpYW5nbGUtIisoWT8idyI6ImUiKSsiJz4iK24rIjwvc3Bhbj48L2E+IjpKPyIiOiI8YSBjbGFzcz0ndWktZGF0ZXBpY2tlci1uZXh0IHVpLWNvcm5lci1hbGwgdWktc3RhdGUtZGlzYWJsZWQnIHRpdGxlPSciK24rIic+PHNwYW4gY2xhc3M9J3VpLWljb24gdWktaWNvbi1jaXJjbGUtdHJpYW5nbGUtIisoWT8idyI6ImUiKSsiJz4iK24rIjwvc3Bhbj48L2E+IixvPXRoaXMuX2dldChlLCJjdXJyZW50VGV4dCIpLHI9dGhpcy5fZ2V0KGUsImdvdG9DdXJyZW50IikmJmUuY3VycmVudERheT9HOlIsbz1xP3RoaXMuZm9ybWF0RGF0ZShvLHIsdGhpcy5fZ2V0Rm9ybWF0Q29uZmlnKGUpKTpvLGg9ZS5pbmxpbmU/IiI6IjxidXR0b24gdHlwZT0nYnV0dG9uJyBjbGFzcz0ndWktZGF0ZXBpY2tlci1jbG9zZSB1aS1zdGF0ZS1kZWZhdWx0IHVpLXByaW9yaXR5LXByaW1hcnkgdWktY29ybmVyLWFsbCcgZGF0YS1oYW5kbGVyPSdoaWRlJyBkYXRhLWV2ZW50PSdjbGljayc+Iit0aGlzLl9nZXQoZSwiY2xvc2VUZXh0IikrIjwvYnV0dG9uPiIsbD1CPyI8ZGl2IGNsYXNzPSd1aS1kYXRlcGlja2VyLWJ1dHRvbnBhbmUgdWktd2lkZ2V0LWNvbnRlbnQnPiIrKFk/aDoiIikrKHRoaXMuX2lzSW5SYW5nZShlLHIpPyI8YnV0dG9uIHR5cGU9J2J1dHRvbicgY2xhc3M9J3VpLWRhdGVwaWNrZXItY3VycmVudCB1aS1zdGF0ZS1kZWZhdWx0IHVpLXByaW9yaXR5LXNlY29uZGFyeSB1aS1jb3JuZXItYWxsJyBkYXRhLWhhbmRsZXI9J3RvZGF5JyBkYXRhLWV2ZW50PSdjbGljayc+IitvKyI8L2J1dHRvbj4iOiIiKSsoWT8iIjpoKSsiPC9kaXY+IjoiIix1PXBhcnNlSW50KHRoaXMuX2dldChlLCJmaXJzdERheSIpLDEwKSx1PWlzTmFOKHUpPzA6dSxkPXRoaXMuX2dldChlLCJzaG93V2VlayIpLGM9dGhpcy5fZ2V0KGUsImRheU5hbWVzIikscD10aGlzLl9nZXQoZSwiZGF5TmFtZXNNaW4iKSxmPXRoaXMuX2dldChlLCJtb250aE5hbWVzIiksbT10aGlzLl9nZXQoZSwibW9udGhOYW1lc1Nob3J0IiksZz10aGlzLl9nZXQoZSwiYmVmb3JlU2hvd0RheSIpLHY9dGhpcy5fZ2V0KGUsInNob3dPdGhlck1vbnRocyIpLHk9dGhpcy5fZ2V0KGUsInNlbGVjdE90aGVyTW9udGhzIiksYj10aGlzLl9nZXREZWZhdWx0RGF0ZShlKSxfPSIiLHc9MDtLWzBdPnc7dysrKXtmb3Ioaz0iIix0aGlzLm1heFJvd3M9NCxUPTA7S1sxXT5UO1QrKyl7aWYoRD10aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShldCxaLGUuc2VsZWN0ZWREYXkpKSxTPSIgdWktY29ybmVyLWFsbCIsTT0iIixRKXtpZihNKz0iPGRpdiBjbGFzcz0ndWktZGF0ZXBpY2tlci1ncm91cCIsS1sxXT4xKXN3aXRjaChUKXtjYXNlIDA6TSs9IiB1aS1kYXRlcGlja2VyLWdyb3VwLWZpcnN0IixTPSIgdWktY29ybmVyLSIrKFk/InJpZ2h0IjoibGVmdCIpO2JyZWFrO2Nhc2UgS1sxXS0xOk0rPSIgdWktZGF0ZXBpY2tlci1ncm91cC1sYXN0IixTPSIgdWktY29ybmVyLSIrKFk/ImxlZnQiOiJyaWdodCIpO2JyZWFrO2RlZmF1bHQ6TSs9IiB1aS1kYXRlcGlja2VyLWdyb3VwLW1pZGRsZSIsUz0iIn1NKz0iJz4ifWZvcihNKz0iPGRpdiBjbGFzcz0ndWktZGF0ZXBpY2tlci1oZWFkZXIgdWktd2lkZ2V0LWhlYWRlciB1aS1oZWxwZXItY2xlYXJmaXgiK1MrIic+IisoL2FsbHxsZWZ0Ly50ZXN0KFMpJiYwPT09dz9ZP2E6czoiIikrKC9hbGx8cmlnaHQvLnRlc3QoUykmJjA9PT13P1k/czphOiIiKSt0aGlzLl9nZW5lcmF0ZU1vbnRoWWVhckhlYWRlcihlLFosZXQsWCwkLHc+MHx8VD4wLGYsbSkrIjwvZGl2Pjx0YWJsZSBjbGFzcz0ndWktZGF0ZXBpY2tlci1jYWxlbmRhcic+PHRoZWFkPiIrIjx0cj4iLEM9ZD8iPHRoIGNsYXNzPSd1aS1kYXRlcGlja2VyLXdlZWstY29sJz4iK3RoaXMuX2dldChlLCJ3ZWVrSGVhZGVyIikrIjwvdGg+IjoiIix4PTA7Nz54O3grKylOPSh4K3UpJTcsQys9Ijx0aCBzY29wZT0nY29sJyIrKCh4K3UrNiklNz49NT8iIGNsYXNzPSd1aS1kYXRlcGlja2VyLXdlZWstZW5kJyI6IiIpKyI+IisiPHNwYW4gdGl0bGU9JyIrY1tOXSsiJz4iK3BbTl0rIjwvc3Bhbj48L3RoPiI7Zm9yKE0rPUMrIjwvdHI+PC90aGVhZD48dGJvZHk+IixBPXRoaXMuX2dldERheXNJbk1vbnRoKGV0LFopLGV0PT09ZS5zZWxlY3RlZFllYXImJlo9PT1lLnNlbGVjdGVkTW9udGgmJihlLnNlbGVjdGVkRGF5PU1hdGgubWluKGUuc2VsZWN0ZWREYXksQSkpLFA9KHRoaXMuX2dldEZpcnN0RGF5T2ZNb250aChldCxaKS11KzcpJTcsST1NYXRoLmNlaWwoKFArQSkvNyksSD1RP3RoaXMubWF4Um93cz5JP3RoaXMubWF4Um93czpJOkksdGhpcy5tYXhSb3dzPUgsej10aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShldCxaLDEtUCkpLEY9MDtIPkY7RisrKXtmb3IoTSs9Ijx0cj4iLEU9ZD8iPHRkIGNsYXNzPSd1aS1kYXRlcGlja2VyLXdlZWstY29sJz4iK3RoaXMuX2dldChlLCJjYWxjdWxhdGVXZWVrIikoeikrIjwvdGQ+IjoiIix4PTA7Nz54O3grKylPPWc/Zy5hcHBseShlLmlucHV0P2UuaW5wdXRbMF06bnVsbCxbel0pOlshMCwiIl0saj16LmdldE1vbnRoKCkhPT1aLFc9aiYmIXl8fCFPWzBdfHxYJiZYPnp8fCQmJno+JCxFKz0iPHRkIGNsYXNzPSciKygoeCt1KzYpJTc+PTU/IiB1aS1kYXRlcGlja2VyLXdlZWstZW5kIjoiIikrKGo/IiB1aS1kYXRlcGlja2VyLW90aGVyLW1vbnRoIjoiIikrKHouZ2V0VGltZSgpPT09RC5nZXRUaW1lKCkmJlo9PT1lLnNlbGVjdGVkTW9udGgmJmUuX2tleUV2ZW50fHxiLmdldFRpbWUoKT09PXouZ2V0VGltZSgpJiZiLmdldFRpbWUoKT09PUQuZ2V0VGltZSgpPyIgIit0aGlzLl9kYXlPdmVyQ2xhc3M6IiIpKyhXPyIgIit0aGlzLl91bnNlbGVjdGFibGVDbGFzcysiIHVpLXN0YXRlLWRpc2FibGVkIjoiIikrKGomJiF2PyIiOiIgIitPWzFdKyh6LmdldFRpbWUoKT09PUcuZ2V0VGltZSgpPyIgIit0aGlzLl9jdXJyZW50Q2xhc3M6IiIpKyh6LmdldFRpbWUoKT09PVIuZ2V0VGltZSgpPyIgdWktZGF0ZXBpY2tlci10b2RheSI6IiIpKSsiJyIrKGomJiF2fHwhT1syXT8iIjoiIHRpdGxlPSciK09bMl0ucmVwbGFjZSgvJy9nLCImIzM5OyIpKyInIikrKFc/IiI6IiBkYXRhLWhhbmRsZXI9J3NlbGVjdERheScgZGF0YS1ldmVudD0nY2xpY2snIGRhdGEtbW9udGg9JyIrei5nZXRNb250aCgpKyInIGRhdGEteWVhcj0nIit6LmdldEZ1bGxZZWFyKCkrIiciKSsiPiIrKGomJiF2PyImI3hhMDsiOlc/IjxzcGFuIGNsYXNzPSd1aS1zdGF0ZS1kZWZhdWx0Jz4iK3ouZ2V0RGF0ZSgpKyI8L3NwYW4+IjoiPGEgY2xhc3M9J3VpLXN0YXRlLWRlZmF1bHQiKyh6LmdldFRpbWUoKT09PVIuZ2V0VGltZSgpPyIgdWktc3RhdGUtaGlnaGxpZ2h0IjoiIikrKHouZ2V0VGltZSgpPT09Ry5nZXRUaW1lKCk/IiB1aS1zdGF0ZS1hY3RpdmUiOiIiKSsoaj8iIHVpLXByaW9yaXR5LXNlY29uZGFyeSI6IiIpKyInIGhyZWY9JyMnPiIrei5nZXREYXRlKCkrIjwvYT4iKSsiPC90ZD4iLHouc2V0RGF0ZSh6LmdldERhdGUoKSsxKSx6PXRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KHopO00rPUUrIjwvdHI+In1aKyssWj4xMSYmKFo9MCxldCsrKSxNKz0iPC90Ym9keT48L3RhYmxlPiIrKFE/IjwvZGl2PiIrKEtbMF0+MCYmVD09PUtbMV0tMT8iPGRpdiBjbGFzcz0ndWktZGF0ZXBpY2tlci1yb3ctYnJlYWsnPjwvZGl2PiI6IiIpOiIiKSxrKz1NfV8rPWt9cmV0dXJuIF8rPWwsZS5fa2V5RXZlbnQ9ITEsX30sX2dlbmVyYXRlTW9udGhZZWFySGVhZGVyOmZ1bmN0aW9uKGUsdCxpLHMsbixhLG8scil7dmFyIGgsbCx1LGQsYyxwLGYsbSxnPXRoaXMuX2dldChlLCJjaGFuZ2VNb250aCIpLHY9dGhpcy5fZ2V0KGUsImNoYW5nZVllYXIiKSx5PXRoaXMuX2dldChlLCJzaG93TW9udGhBZnRlclllYXIiKSxiPSI8ZGl2IGNsYXNzPSd1aS1kYXRlcGlja2VyLXRpdGxlJz4iLF89IiI7aWYoYXx8IWcpXys9IjxzcGFuIGNsYXNzPSd1aS1kYXRlcGlja2VyLW1vbnRoJz4iK29bdF0rIjwvc3Bhbj4iO2Vsc2V7Zm9yKGg9cyYmcy5nZXRGdWxsWWVhcigpPT09aSxsPW4mJm4uZ2V0RnVsbFllYXIoKT09PWksXys9IjxzZWxlY3QgY2xhc3M9J3VpLWRhdGVwaWNrZXItbW9udGgnIGRhdGEtaGFuZGxlcj0nc2VsZWN0TW9udGgnIGRhdGEtZXZlbnQ9J2NoYW5nZSc+Iix1PTA7MTI+dTt1KyspKCFofHx1Pj1zLmdldE1vbnRoKCkpJiYoIWx8fG4uZ2V0TW9udGgoKT49dSkmJihfKz0iPG9wdGlvbiB2YWx1ZT0nIit1KyInIisodT09PXQ/IiBzZWxlY3RlZD0nc2VsZWN0ZWQnIjoiIikrIj4iK3JbdV0rIjwvb3B0aW9uPiIpO18rPSI8L3NlbGVjdD4ifWlmKHl8fChiKz1fKyghYSYmZyYmdj8iIjoiJiN4YTA7IikpLCFlLnllYXJzaHRtbClpZihlLnllYXJzaHRtbD0iIixhfHwhdiliKz0iPHNwYW4gY2xhc3M9J3VpLWRhdGVwaWNrZXIteWVhcic+IitpKyI8L3NwYW4+IjtlbHNle2ZvcihkPXRoaXMuX2dldChlLCJ5ZWFyUmFuZ2UiKS5zcGxpdCgiOiIpLGM9KG5ldyBEYXRlKS5nZXRGdWxsWWVhcigpLHA9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5tYXRjaCgvY1srXC1dLiovKT9pK3BhcnNlSW50KGUuc3Vic3RyaW5nKDEpLDEwKTplLm1hdGNoKC9bK1wtXS4qLyk/YytwYXJzZUludChlLDEwKTpwYXJzZUludChlLDEwKTtyZXR1cm4gaXNOYU4odCk/Yzp0fSxmPXAoZFswXSksbT1NYXRoLm1heChmLHAoZFsxXXx8IiIpKSxmPXM/TWF0aC5tYXgoZixzLmdldEZ1bGxZZWFyKCkpOmYsbT1uP01hdGgubWluKG0sbi5nZXRGdWxsWWVhcigpKTptLGUueWVhcnNodG1sKz0iPHNlbGVjdCBjbGFzcz0ndWktZGF0ZXBpY2tlci15ZWFyJyBkYXRhLWhhbmRsZXI9J3NlbGVjdFllYXInIGRhdGEtZXZlbnQ9J2NoYW5nZSc+IjttPj1mO2YrKyllLnllYXJzaHRtbCs9IjxvcHRpb24gdmFsdWU9JyIrZisiJyIrKGY9PT1pPyIgc2VsZWN0ZWQ9J3NlbGVjdGVkJyI6IiIpKyI+IitmKyI8L29wdGlvbj4iO2UueWVhcnNodG1sKz0iPC9zZWxlY3Q+IixiKz1lLnllYXJzaHRtbCxlLnllYXJzaHRtbD1udWxsfXJldHVybiBiKz10aGlzLl9nZXQoZSwieWVhclN1ZmZpeCIpLHkmJihiKz0oIWEmJmcmJnY/IiI6IiYjeGEwOyIpK18pLGIrPSI8L2Rpdj4ifSxfYWRqdXN0SW5zdERhdGU6ZnVuY3Rpb24oZSx0LGkpe3ZhciBzPWUuZHJhd1llYXIrKCJZIj09PWk/dDowKSxuPWUuZHJhd01vbnRoKygiTSI9PT1pP3Q6MCksYT1NYXRoLm1pbihlLnNlbGVjdGVkRGF5LHRoaXMuX2dldERheXNJbk1vbnRoKHMsbikpKygiRCI9PT1pP3Q6MCksbz10aGlzLl9yZXN0cmljdE1pbk1heChlLHRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKHMsbixhKSkpO2Uuc2VsZWN0ZWREYXk9by5nZXREYXRlKCksZS5kcmF3TW9udGg9ZS5zZWxlY3RlZE1vbnRoPW8uZ2V0TW9udGgoKSxlLmRyYXdZZWFyPWUuc2VsZWN0ZWRZZWFyPW8uZ2V0RnVsbFllYXIoKSwoIk0iPT09aXx8IlkiPT09aSkmJnRoaXMuX25vdGlmeUNoYW5nZShlKX0sX3Jlc3RyaWN0TWluTWF4OmZ1bmN0aW9uKGUsdCl7dmFyIGk9dGhpcy5fZ2V0TWluTWF4RGF0ZShlLCJtaW4iKSxzPXRoaXMuX2dldE1pbk1heERhdGUoZSwibWF4Iiksbj1pJiZpPnQ/aTp0O3JldHVybiBzJiZuPnM/czpufSxfbm90aWZ5Q2hhbmdlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2dldChlLCJvbkNoYW5nZU1vbnRoWWVhciIpO3QmJnQuYXBwbHkoZS5pbnB1dD9lLmlucHV0WzBdOm51bGwsW2Uuc2VsZWN0ZWRZZWFyLGUuc2VsZWN0ZWRNb250aCsxLGVdKX0sX2dldE51bWJlck9mTW9udGhzOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2dldChlLCJudW1iZXJPZk1vbnRocyIpO3JldHVybiBudWxsPT10P1sxLDFdOiJudW1iZXIiPT10eXBlb2YgdD9bMSx0XTp0fSxfZ2V0TWluTWF4RGF0ZTpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLl9kZXRlcm1pbmVEYXRlKGUsdGhpcy5fZ2V0KGUsdCsiRGF0ZSIpLG51bGwpfSxfZ2V0RGF5c0luTW9udGg6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gMzItdGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUoZSx0LDMyKSkuZ2V0RGF0ZSgpfSxfZ2V0Rmlyc3REYXlPZk1vbnRoOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5ldyBEYXRlKGUsdCwxKS5nZXREYXkoKX0sX2NhbkFkanVzdE1vbnRoOmZ1bmN0aW9uKGUsdCxpLHMpe3ZhciBuPXRoaXMuX2dldE51bWJlck9mTW9udGhzKGUpLGE9dGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUoaSxzKygwPnQ/dDpuWzBdKm5bMV0pLDEpKTtyZXR1cm4gMD50JiZhLnNldERhdGUodGhpcy5fZ2V0RGF5c0luTW9udGgoYS5nZXRGdWxsWWVhcigpLGEuZ2V0TW9udGgoKSkpLHRoaXMuX2lzSW5SYW5nZShlLGEpfSxfaXNJblJhbmdlOmZ1bmN0aW9uKGUsdCl7dmFyIGkscyxuPXRoaXMuX2dldE1pbk1heERhdGUoZSwibWluIiksYT10aGlzLl9nZXRNaW5NYXhEYXRlKGUsIm1heCIpLG89bnVsbCxyPW51bGwsaD10aGlzLl9nZXQoZSwieWVhclJhbmdlIik7cmV0dXJuIGgmJihpPWguc3BsaXQoIjoiKSxzPShuZXcgRGF0ZSkuZ2V0RnVsbFllYXIoKSxvPXBhcnNlSW50KGlbMF0sMTApLHI9cGFyc2VJbnQoaVsxXSwxMCksaVswXS5tYXRjaCgvWytcLV0uKi8pJiYobys9cyksaVsxXS5tYXRjaCgvWytcLV0uKi8pJiYocis9cykpLCghbnx8dC5nZXRUaW1lKCk+PW4uZ2V0VGltZSgpKSYmKCFhfHx0LmdldFRpbWUoKTw9YS5nZXRUaW1lKCkpJiYoIW98fHQuZ2V0RnVsbFllYXIoKT49bykmJighcnx8cj49dC5nZXRGdWxsWWVhcigpKX0sX2dldEZvcm1hdENvbmZpZzpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9nZXQoZSwic2hvcnRZZWFyQ3V0b2ZmIik7cmV0dXJuIHQ9InN0cmluZyIhPXR5cGVvZiB0P3Q6KG5ldyBEYXRlKS5nZXRGdWxsWWVhcigpJTEwMCtwYXJzZUludCh0LDEwKSx7c2hvcnRZZWFyQ3V0b2ZmOnQsZGF5TmFtZXNTaG9ydDp0aGlzLl9nZXQoZSwiZGF5TmFtZXNTaG9ydCIpLGRheU5hbWVzOnRoaXMuX2dldChlLCJkYXlOYW1lcyIpLG1vbnRoTmFtZXNTaG9ydDp0aGlzLl9nZXQoZSwibW9udGhOYW1lc1Nob3J0IiksbW9udGhOYW1lczp0aGlzLl9nZXQoZSwibW9udGhOYW1lcyIpfX0sX2Zvcm1hdERhdGU6ZnVuY3Rpb24oZSx0LGkscyl7dHx8KGUuY3VycmVudERheT1lLnNlbGVjdGVkRGF5LGUuY3VycmVudE1vbnRoPWUuc2VsZWN0ZWRNb250aCxlLmN1cnJlbnRZZWFyPWUuc2VsZWN0ZWRZZWFyKTt2YXIgbj10PyJvYmplY3QiPT10eXBlb2YgdD90OnRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKHMsaSx0KSk6dGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUoZS5jdXJyZW50WWVhcixlLmN1cnJlbnRNb250aCxlLmN1cnJlbnREYXkpKTtyZXR1cm4gdGhpcy5mb3JtYXREYXRlKHRoaXMuX2dldChlLCJkYXRlRm9ybWF0Iiksbix0aGlzLl9nZXRGb3JtYXRDb25maWcoZSkpfX0pLGUuZm4uZGF0ZXBpY2tlcj1mdW5jdGlvbih0KXtpZighdGhpcy5sZW5ndGgpcmV0dXJuIHRoaXM7ZS5kYXRlcGlja2VyLmluaXRpYWxpemVkfHwoZShkb2N1bWVudCkubW91c2Vkb3duKGUuZGF0ZXBpY2tlci5fY2hlY2tFeHRlcm5hbENsaWNrKSxlLmRhdGVwaWNrZXIuaW5pdGlhbGl6ZWQ9ITApLDA9PT1lKCIjIitlLmRhdGVwaWNrZXIuX21haW5EaXZJZCkubGVuZ3RoJiZlKCJib2R5IikuYXBwZW5kKGUuZGF0ZXBpY2tlci5kcERpdik7dmFyIGk9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO3JldHVybiJzdHJpbmciIT10eXBlb2YgdHx8ImlzRGlzYWJsZWQiIT09dCYmImdldERhdGUiIT09dCYmIndpZGdldCIhPT10PyJvcHRpb24iPT09dCYmMj09PWFyZ3VtZW50cy5sZW5ndGgmJiJzdHJpbmciPT10eXBlb2YgYXJndW1lbnRzWzFdP2UuZGF0ZXBpY2tlclsiXyIrdCsiRGF0ZXBpY2tlciJdLmFwcGx5KGUuZGF0ZXBpY2tlcixbdGhpc1swXV0uY29uY2F0KGkpKTp0aGlzLmVhY2goZnVuY3Rpb24oKXsic3RyaW5nIj09dHlwZW9mIHQ/ZS5kYXRlcGlja2VyWyJfIit0KyJEYXRlcGlja2VyIl0uYXBwbHkoZS5kYXRlcGlja2VyLFt0aGlzXS5jb25jYXQoaSkpOmUuZGF0ZXBpY2tlci5fYXR0YWNoRGF0ZXBpY2tlcih0aGlzLHQpfSk6ZS5kYXRlcGlja2VyWyJfIit0KyJEYXRlcGlja2VyIl0uYXBwbHkoZS5kYXRlcGlja2VyLFt0aGlzWzBdXS5jb25jYXQoaSkpfSxlLmRhdGVwaWNrZXI9bmV3IG4sZS5kYXRlcGlja2VyLmluaXRpYWxpemVkPSExLGUuZGF0ZXBpY2tlci51dWlkPShuZXcgRGF0ZSkuZ2V0VGltZSgpLGUuZGF0ZXBpY2tlci52ZXJzaW9uPSIxLjExLjQiLGUuZGF0ZXBpY2tlcixlLndpZGdldCgidWkuZHJhZ2dhYmxlIixlLnVpLm1vdXNlLHt2ZXJzaW9uOiIxLjExLjQiLHdpZGdldEV2ZW50UHJlZml4OiJkcmFnIixvcHRpb25zOnthZGRDbGFzc2VzOiEwLGFwcGVuZFRvOiJwYXJlbnQiLGF4aXM6ITEsY29ubmVjdFRvU29ydGFibGU6ITEsY29udGFpbm1lbnQ6ITEsY3Vyc29yOiJhdXRvIixjdXJzb3JBdDohMSxncmlkOiExLGhhbmRsZTohMSxoZWxwZXI6Im9yaWdpbmFsIixpZnJhbWVGaXg6ITEsb3BhY2l0eTohMSxyZWZyZXNoUG9zaXRpb25zOiExLHJldmVydDohMSxyZXZlcnREdXJhdGlvbjo1MDAsc2NvcGU6ImRlZmF1bHQiLHNjcm9sbDohMCxzY3JvbGxTZW5zaXRpdml0eToyMCxzY3JvbGxTcGVlZDoyMCxzbmFwOiExLHNuYXBNb2RlOiJib3RoIixzbmFwVG9sZXJhbmNlOjIwLHN0YWNrOiExLHpJbmRleDohMSxkcmFnOm51bGwsc3RhcnQ6bnVsbCxzdG9wOm51bGx9LF9jcmVhdGU6ZnVuY3Rpb24oKXsib3JpZ2luYWwiPT09dGhpcy5vcHRpb25zLmhlbHBlciYmdGhpcy5fc2V0UG9zaXRpb25SZWxhdGl2ZSgpLHRoaXMub3B0aW9ucy5hZGRDbGFzc2VzJiZ0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLWRyYWdnYWJsZSIpLHRoaXMub3B0aW9ucy5kaXNhYmxlZCYmdGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS1kcmFnZ2FibGUtZGlzYWJsZWQiKSx0aGlzLl9zZXRIYW5kbGVDbGFzc05hbWUoKSx0aGlzLl9tb3VzZUluaXQoKX0sX3NldE9wdGlvbjpmdW5jdGlvbihlLHQpe3RoaXMuX3N1cGVyKGUsdCksImhhbmRsZSI9PT1lJiYodGhpcy5fcmVtb3ZlSGFuZGxlQ2xhc3NOYW1lKCksdGhpcy5fc2V0SGFuZGxlQ2xhc3NOYW1lKCkpfSxfZGVzdHJveTpmdW5jdGlvbigpe3JldHVybih0aGlzLmhlbHBlcnx8dGhpcy5lbGVtZW50KS5pcygiLnVpLWRyYWdnYWJsZS1kcmFnZ2luZyIpPyh0aGlzLmRlc3Ryb3lPbkNsZWFyPSEwLHZvaWQgMCk6KHRoaXMuZWxlbWVudC5yZW1vdmVDbGFzcygidWktZHJhZ2dhYmxlIHVpLWRyYWdnYWJsZS1kcmFnZ2luZyB1aS1kcmFnZ2FibGUtZGlzYWJsZWQiKSx0aGlzLl9yZW1vdmVIYW5kbGVDbGFzc05hbWUoKSx0aGlzLl9tb3VzZURlc3Ryb3koKSx2b2lkIDApfSxfbW91c2VDYXB0dXJlOmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMub3B0aW9ucztyZXR1cm4gdGhpcy5fYmx1ckFjdGl2ZUVsZW1lbnQodCksdGhpcy5oZWxwZXJ8fGkuZGlzYWJsZWR8fGUodC50YXJnZXQpLmNsb3Nlc3QoIi51aS1yZXNpemFibGUtaGFuZGxlIikubGVuZ3RoPjA/ITE6KHRoaXMuaGFuZGxlPXRoaXMuX2dldEhhbmRsZSh0KSx0aGlzLmhhbmRsZT8odGhpcy5fYmxvY2tGcmFtZXMoaS5pZnJhbWVGaXg9PT0hMD8iaWZyYW1lIjppLmlmcmFtZUZpeCksITApOiExKX0sX2Jsb2NrRnJhbWVzOmZ1bmN0aW9uKHQpe3RoaXMuaWZyYW1lQmxvY2tzPXRoaXMuZG9jdW1lbnQuZmluZCh0KS5tYXAoZnVuY3Rpb24oKXt2YXIgdD1lKHRoaXMpO3JldHVybiBlKCI8ZGl2PiIpLmNzcygicG9zaXRpb24iLCJhYnNvbHV0ZSIpLmFwcGVuZFRvKHQucGFyZW50KCkpLm91dGVyV2lkdGgodC5vdXRlcldpZHRoKCkpLm91dGVySGVpZ2h0KHQub3V0ZXJIZWlnaHQoKSkub2Zmc2V0KHQub2Zmc2V0KCkpWzBdfSl9LF91bmJsb2NrRnJhbWVzOmZ1bmN0aW9uKCl7dGhpcy5pZnJhbWVCbG9ja3MmJih0aGlzLmlmcmFtZUJsb2Nrcy5yZW1vdmUoKSxkZWxldGUgdGhpcy5pZnJhbWVCbG9ja3MpfSxfYmx1ckFjdGl2ZUVsZW1lbnQ6ZnVuY3Rpb24odCl7dmFyIGk9dGhpcy5kb2N1bWVudFswXTtpZih0aGlzLmhhbmRsZUVsZW1lbnQuaXModC50YXJnZXQpKXRyeXtpLmFjdGl2ZUVsZW1lbnQmJiJib2R5IiE9PWkuYWN0aXZlRWxlbWVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpJiZlKGkuYWN0aXZlRWxlbWVudCkuYmx1cigpfWNhdGNoKHMpe319LF9tb3VzZVN0YXJ0OmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMub3B0aW9ucztyZXR1cm4gdGhpcy5oZWxwZXI9dGhpcy5fY3JlYXRlSGVscGVyKHQpLHRoaXMuaGVscGVyLmFkZENsYXNzKCJ1aS1kcmFnZ2FibGUtZHJhZ2dpbmciKSx0aGlzLl9jYWNoZUhlbHBlclByb3BvcnRpb25zKCksZS51aS5kZG1hbmFnZXImJihlLnVpLmRkbWFuYWdlci5jdXJyZW50PXRoaXMpLHRoaXMuX2NhY2hlTWFyZ2lucygpLHRoaXMuY3NzUG9zaXRpb249dGhpcy5oZWxwZXIuY3NzKCJwb3NpdGlvbiIpLHRoaXMuc2Nyb2xsUGFyZW50PXRoaXMuaGVscGVyLnNjcm9sbFBhcmVudCghMCksdGhpcy5vZmZzZXRQYXJlbnQ9dGhpcy5oZWxwZXIub2Zmc2V0UGFyZW50KCksdGhpcy5oYXNGaXhlZEFuY2VzdG9yPXRoaXMuaGVscGVyLnBhcmVudHMoKS5maWx0ZXIoZnVuY3Rpb24oKXtyZXR1cm4iZml4ZWQiPT09ZSh0aGlzKS5jc3MoInBvc2l0aW9uIil9KS5sZW5ndGg+MCx0aGlzLnBvc2l0aW9uQWJzPXRoaXMuZWxlbWVudC5vZmZzZXQoKSx0aGlzLl9yZWZyZXNoT2Zmc2V0cyh0KSx0aGlzLm9yaWdpbmFsUG9zaXRpb249dGhpcy5wb3NpdGlvbj10aGlzLl9nZW5lcmF0ZVBvc2l0aW9uKHQsITEpLHRoaXMub3JpZ2luYWxQYWdlWD10LnBhZ2VYLHRoaXMub3JpZ2luYWxQYWdlWT10LnBhZ2VZLGkuY3Vyc29yQXQmJnRoaXMuX2FkanVzdE9mZnNldEZyb21IZWxwZXIoaS5jdXJzb3JBdCksdGhpcy5fc2V0Q29udGFpbm1lbnQoKSx0aGlzLl90cmlnZ2VyKCJzdGFydCIsdCk9PT0hMT8odGhpcy5fY2xlYXIoKSwhMSk6KHRoaXMuX2NhY2hlSGVscGVyUHJvcG9ydGlvbnMoKSxlLnVpLmRkbWFuYWdlciYmIWkuZHJvcEJlaGF2aW91ciYmZS51aS5kZG1hbmFnZXIucHJlcGFyZU9mZnNldHModGhpcyx0KSx0aGlzLl9ub3JtYWxpemVSaWdodEJvdHRvbSgpLHRoaXMuX21vdXNlRHJhZyh0LCEwKSxlLnVpLmRkbWFuYWdlciYmZS51aS5kZG1hbmFnZXIuZHJhZ1N0YXJ0KHRoaXMsdCksITApfSxfcmVmcmVzaE9mZnNldHM6ZnVuY3Rpb24oZSl7dGhpcy5vZmZzZXQ9e3RvcDp0aGlzLnBvc2l0aW9uQWJzLnRvcC10aGlzLm1hcmdpbnMudG9wLGxlZnQ6dGhpcy5wb3NpdGlvbkFicy5sZWZ0LXRoaXMubWFyZ2lucy5sZWZ0LHNjcm9sbDohMSxwYXJlbnQ6dGhpcy5fZ2V0UGFyZW50T2Zmc2V0KCkscmVsYXRpdmU6dGhpcy5fZ2V0UmVsYXRpdmVPZmZzZXQoKX0sdGhpcy5vZmZzZXQuY2xpY2s9e2xlZnQ6ZS5wYWdlWC10aGlzLm9mZnNldC5sZWZ0LHRvcDplLnBhZ2VZLXRoaXMub2Zmc2V0LnRvcH19LF9tb3VzZURyYWc6ZnVuY3Rpb24odCxpKXtpZih0aGlzLmhhc0ZpeGVkQW5jZXN0b3ImJih0aGlzLm9mZnNldC5wYXJlbnQ9dGhpcy5fZ2V0UGFyZW50T2Zmc2V0KCkpLHRoaXMucG9zaXRpb249dGhpcy5fZ2VuZXJhdGVQb3NpdGlvbih0LCEwKSx0aGlzLnBvc2l0aW9uQWJzPXRoaXMuX2NvbnZlcnRQb3NpdGlvblRvKCJhYnNvbHV0ZSIpLCFpKXt2YXIgcz10aGlzLl91aUhhc2goKTtpZih0aGlzLl90cmlnZ2VyKCJkcmFnIix0LHMpPT09ITEpcmV0dXJuIHRoaXMuX21vdXNlVXAoe30pLCExO3RoaXMucG9zaXRpb249cy5wb3NpdGlvbn1yZXR1cm4gdGhpcy5oZWxwZXJbMF0uc3R5bGUubGVmdD10aGlzLnBvc2l0aW9uLmxlZnQrInB4Iix0aGlzLmhlbHBlclswXS5zdHlsZS50b3A9dGhpcy5wb3NpdGlvbi50b3ArInB4IixlLnVpLmRkbWFuYWdlciYmZS51aS5kZG1hbmFnZXIuZHJhZyh0aGlzLHQpLCExfSxfbW91c2VTdG9wOmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMscz0hMTtyZXR1cm4gZS51aS5kZG1hbmFnZXImJiF0aGlzLm9wdGlvbnMuZHJvcEJlaGF2aW91ciYmKHM9ZS51aS5kZG1hbmFnZXIuZHJvcCh0aGlzLHQpKSx0aGlzLmRyb3BwZWQmJihzPXRoaXMuZHJvcHBlZCx0aGlzLmRyb3BwZWQ9ITEpLCJpbnZhbGlkIj09PXRoaXMub3B0aW9ucy5yZXZlcnQmJiFzfHwidmFsaWQiPT09dGhpcy5vcHRpb25zLnJldmVydCYmc3x8dGhpcy5vcHRpb25zLnJldmVydD09PSEwfHxlLmlzRnVuY3Rpb24odGhpcy5vcHRpb25zLnJldmVydCkmJnRoaXMub3B0aW9ucy5yZXZlcnQuY2FsbCh0aGlzLmVsZW1lbnQscyk/ZSh0aGlzLmhlbHBlcikuYW5pbWF0ZSh0aGlzLm9yaWdpbmFsUG9zaXRpb24scGFyc2VJbnQodGhpcy5vcHRpb25zLnJldmVydER1cmF0aW9uLDEwKSxmdW5jdGlvbigpe2kuX3RyaWdnZXIoInN0b3AiLHQpIT09ITEmJmkuX2NsZWFyKCl9KTp0aGlzLl90cmlnZ2VyKCJzdG9wIix0KSE9PSExJiZ0aGlzLl9jbGVhcigpLCExfSxfbW91c2VVcDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fdW5ibG9ja0ZyYW1lcygpLGUudWkuZGRtYW5hZ2VyJiZlLnVpLmRkbWFuYWdlci5kcmFnU3RvcCh0aGlzLHQpLHRoaXMuaGFuZGxlRWxlbWVudC5pcyh0LnRhcmdldCkmJnRoaXMuZWxlbWVudC5mb2N1cygpLGUudWkubW91c2UucHJvdG90eXBlLl9tb3VzZVVwLmNhbGwodGhpcyx0KX0sY2FuY2VsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaGVscGVyLmlzKCIudWktZHJhZ2dhYmxlLWRyYWdnaW5nIik/dGhpcy5fbW91c2VVcCh7fSk6dGhpcy5fY2xlYXIoKSx0aGlzfSxfZ2V0SGFuZGxlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm9wdGlvbnMuaGFuZGxlPyEhZSh0LnRhcmdldCkuY2xvc2VzdCh0aGlzLmVsZW1lbnQuZmluZCh0aGlzLm9wdGlvbnMuaGFuZGxlKSkubGVuZ3RoOiEwfSxfc2V0SGFuZGxlQ2xhc3NOYW1lOmZ1bmN0aW9uKCl7dGhpcy5oYW5kbGVFbGVtZW50PXRoaXMub3B0aW9ucy5oYW5kbGU/dGhpcy5lbGVtZW50LmZpbmQodGhpcy5vcHRpb25zLmhhbmRsZSk6dGhpcy5lbGVtZW50LHRoaXMuaGFuZGxlRWxlbWVudC5hZGRDbGFzcygidWktZHJhZ2dhYmxlLWhhbmRsZSIpfSxfcmVtb3ZlSGFuZGxlQ2xhc3NOYW1lOmZ1bmN0aW9uKCl7dGhpcy5oYW5kbGVFbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1kcmFnZ2FibGUtaGFuZGxlIil9LF9jcmVhdGVIZWxwZXI6ZnVuY3Rpb24odCl7dmFyIGk9dGhpcy5vcHRpb25zLHM9ZS5pc0Z1bmN0aW9uKGkuaGVscGVyKSxuPXM/ZShpLmhlbHBlci5hcHBseSh0aGlzLmVsZW1lbnRbMF0sW3RdKSk6ImNsb25lIj09PWkuaGVscGVyP3RoaXMuZWxlbWVudC5jbG9uZSgpLnJlbW92ZUF0dHIoImlkIik6dGhpcy5lbGVtZW50O3JldHVybiBuLnBhcmVudHMoImJvZHkiKS5sZW5ndGh8fG4uYXBwZW5kVG8oInBhcmVudCI9PT1pLmFwcGVuZFRvP3RoaXMuZWxlbWVudFswXS5wYXJlbnROb2RlOmkuYXBwZW5kVG8pLHMmJm5bMF09PT10aGlzLmVsZW1lbnRbMF0mJnRoaXMuX3NldFBvc2l0aW9uUmVsYXRpdmUoKSxuWzBdPT09dGhpcy5lbGVtZW50WzBdfHwvKGZpeGVkfGFic29sdXRlKS8udGVzdChuLmNzcygicG9zaXRpb24iKSl8fG4uY3NzKCJwb3NpdGlvbiIsImFic29sdXRlIiksbn0sX3NldFBvc2l0aW9uUmVsYXRpdmU6ZnVuY3Rpb24oKXsvXig/OnJ8YXxmKS8udGVzdCh0aGlzLmVsZW1lbnQuY3NzKCJwb3NpdGlvbiIpKXx8KHRoaXMuZWxlbWVudFswXS5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiKX0sX2FkanVzdE9mZnNldEZyb21IZWxwZXI6ZnVuY3Rpb24odCl7InN0cmluZyI9PXR5cGVvZiB0JiYodD10LnNwbGl0KCIgIikpLGUuaXNBcnJheSh0KSYmKHQ9e2xlZnQ6K3RbMF0sdG9wOit0WzFdfHwwfSksImxlZnQiaW4gdCYmKHRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ9dC5sZWZ0K3RoaXMubWFyZ2lucy5sZWZ0KSwicmlnaHQiaW4gdCYmKHRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ9dGhpcy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aC10LnJpZ2h0K3RoaXMubWFyZ2lucy5sZWZ0KSwidG9wImluIHQmJih0aGlzLm9mZnNldC5jbGljay50b3A9dC50b3ArdGhpcy5tYXJnaW5zLnRvcCksImJvdHRvbSJpbiB0JiYodGhpcy5vZmZzZXQuY2xpY2sudG9wPXRoaXMuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LXQuYm90dG9tK3RoaXMubWFyZ2lucy50b3ApfSxfaXNSb290Tm9kZTpmdW5jdGlvbihlKXtyZXR1cm4vKGh0bWx8Ym9keSkvaS50ZXN0KGUudGFnTmFtZSl8fGU9PT10aGlzLmRvY3VtZW50WzBdfSxfZ2V0UGFyZW50T2Zmc2V0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vZmZzZXRQYXJlbnQub2Zmc2V0KCksaT10aGlzLmRvY3VtZW50WzBdO3JldHVybiJhYnNvbHV0ZSI9PT10aGlzLmNzc1Bvc2l0aW9uJiZ0aGlzLnNjcm9sbFBhcmVudFswXSE9PWkmJmUuY29udGFpbnModGhpcy5zY3JvbGxQYXJlbnRbMF0sdGhpcy5vZmZzZXRQYXJlbnRbMF0pJiYodC5sZWZ0Kz10aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxMZWZ0KCksdC50b3ArPXRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbFRvcCgpKSx0aGlzLl9pc1Jvb3ROb2RlKHRoaXMub2Zmc2V0UGFyZW50WzBdKSYmKHQ9e3RvcDowLGxlZnQ6MH0pLHt0b3A6dC50b3ArKHBhcnNlSW50KHRoaXMub2Zmc2V0UGFyZW50LmNzcygiYm9yZGVyVG9wV2lkdGgiKSwxMCl8fDApLGxlZnQ6dC5sZWZ0KyhwYXJzZUludCh0aGlzLm9mZnNldFBhcmVudC5jc3MoImJvcmRlckxlZnRXaWR0aCIpLDEwKXx8MCl9fSxfZ2V0UmVsYXRpdmVPZmZzZXQ6ZnVuY3Rpb24oKXtpZigicmVsYXRpdmUiIT09dGhpcy5jc3NQb3NpdGlvbilyZXR1cm57dG9wOjAsbGVmdDowfTt2YXIgZT10aGlzLmVsZW1lbnQucG9zaXRpb24oKSx0PXRoaXMuX2lzUm9vdE5vZGUodGhpcy5zY3JvbGxQYXJlbnRbMF0pO3JldHVybnt0b3A6ZS50b3AtKHBhcnNlSW50KHRoaXMuaGVscGVyLmNzcygidG9wIiksMTApfHwwKSsodD8wOnRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbFRvcCgpKSxsZWZ0OmUubGVmdC0ocGFyc2VJbnQodGhpcy5oZWxwZXIuY3NzKCJsZWZ0IiksMTApfHwwKSsodD8wOnRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbExlZnQoKSl9fSxfY2FjaGVNYXJnaW5zOmZ1bmN0aW9uKCl7dGhpcy5tYXJnaW5zPXtsZWZ0OnBhcnNlSW50KHRoaXMuZWxlbWVudC5jc3MoIm1hcmdpbkxlZnQiKSwxMCl8fDAsdG9wOnBhcnNlSW50KHRoaXMuZWxlbWVudC5jc3MoIm1hcmdpblRvcCIpLDEwKXx8MCxyaWdodDpwYXJzZUludCh0aGlzLmVsZW1lbnQuY3NzKCJtYXJnaW5SaWdodCIpLDEwKXx8MCxib3R0b206cGFyc2VJbnQodGhpcy5lbGVtZW50LmNzcygibWFyZ2luQm90dG9tIiksMTApfHwwfX0sX2NhY2hlSGVscGVyUHJvcG9ydGlvbnM6ZnVuY3Rpb24oKXt0aGlzLmhlbHBlclByb3BvcnRpb25zPXt3aWR0aDp0aGlzLmhlbHBlci5vdXRlcldpZHRoKCksaGVpZ2h0OnRoaXMuaGVscGVyLm91dGVySGVpZ2h0KCl9fSxfc2V0Q29udGFpbm1lbnQ6ZnVuY3Rpb24oKXt2YXIgdCxpLHMsbj10aGlzLm9wdGlvbnMsYT10aGlzLmRvY3VtZW50WzBdO3JldHVybiB0aGlzLnJlbGF0aXZlQ29udGFpbmVyPW51bGwsbi5jb250YWlubWVudD8id2luZG93Ij09PW4uY29udGFpbm1lbnQ/KHRoaXMuY29udGFpbm1lbnQ9W2Uod2luZG93KS5zY3JvbGxMZWZ0KCktdGhpcy5vZmZzZXQucmVsYXRpdmUubGVmdC10aGlzLm9mZnNldC5wYXJlbnQubGVmdCxlKHdpbmRvdykuc2Nyb2xsVG9wKCktdGhpcy5vZmZzZXQucmVsYXRpdmUudG9wLXRoaXMub2Zmc2V0LnBhcmVudC50b3AsZSh3aW5kb3cpLnNjcm9sbExlZnQoKStlKHdpbmRvdykud2lkdGgoKS10aGlzLmhlbHBlclByb3BvcnRpb25zLndpZHRoLXRoaXMubWFyZ2lucy5sZWZ0LGUod2luZG93KS5zY3JvbGxUb3AoKSsoZSh3aW5kb3cpLmhlaWdodCgpfHxhLmJvZHkucGFyZW50Tm9kZS5zY3JvbGxIZWlnaHQpLXRoaXMuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LXRoaXMubWFyZ2lucy50b3BdLHZvaWQgMCk6ImRvY3VtZW50Ij09PW4uY29udGFpbm1lbnQ/KHRoaXMuY29udGFpbm1lbnQ9WzAsMCxlKGEpLndpZHRoKCktdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aC10aGlzLm1hcmdpbnMubGVmdCwoZShhKS5oZWlnaHQoKXx8YS5ib2R5LnBhcmVudE5vZGUuc2Nyb2xsSGVpZ2h0KS10aGlzLmhlbHBlclByb3BvcnRpb25zLmhlaWdodC10aGlzLm1hcmdpbnMudG9wXSx2b2lkIDApOm4uY29udGFpbm1lbnQuY29uc3RydWN0b3I9PT1BcnJheT8odGhpcy5jb250YWlubWVudD1uLmNvbnRhaW5tZW50LHZvaWQgMCk6KCJwYXJlbnQiPT09bi5jb250YWlubWVudCYmKG4uY29udGFpbm1lbnQ9dGhpcy5oZWxwZXJbMF0ucGFyZW50Tm9kZSksaT1lKG4uY29udGFpbm1lbnQpLHM9aVswXSxzJiYodD0vKHNjcm9sbHxhdXRvKS8udGVzdChpLmNzcygib3ZlcmZsb3ciKSksdGhpcy5jb250YWlubWVudD1bKHBhcnNlSW50KGkuY3NzKCJib3JkZXJMZWZ0V2lkdGgiKSwxMCl8fDApKyhwYXJzZUludChpLmNzcygicGFkZGluZ0xlZnQiKSwxMCl8fDApLChwYXJzZUludChpLmNzcygiYm9yZGVyVG9wV2lkdGgiKSwxMCl8fDApKyhwYXJzZUludChpLmNzcygicGFkZGluZ1RvcCIpLDEwKXx8MCksKHQ/TWF0aC5tYXgocy5zY3JvbGxXaWR0aCxzLm9mZnNldFdpZHRoKTpzLm9mZnNldFdpZHRoKS0ocGFyc2VJbnQoaS5jc3MoImJvcmRlclJpZ2h0V2lkdGgiKSwxMCl8fDApLShwYXJzZUludChpLmNzcygicGFkZGluZ1JpZ2h0IiksMTApfHwwKS10aGlzLmhlbHBlclByb3BvcnRpb25zLndpZHRoLXRoaXMubWFyZ2lucy5sZWZ0LXRoaXMubWFyZ2lucy5yaWdodCwodD9NYXRoLm1heChzLnNjcm9sbEhlaWdodCxzLm9mZnNldEhlaWdodCk6cy5vZmZzZXRIZWlnaHQpLShwYXJzZUludChpLmNzcygiYm9yZGVyQm90dG9tV2lkdGgiKSwxMCl8fDApLShwYXJzZUludChpLmNzcygicGFkZGluZ0JvdHRvbSIpLDEwKXx8MCktdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQtdGhpcy5tYXJnaW5zLnRvcC10aGlzLm1hcmdpbnMuYm90dG9tXSx0aGlzLnJlbGF0aXZlQ29udGFpbmVyPWkpLHZvaWQgMCk6KHRoaXMuY29udGFpbm1lbnQ9bnVsbCx2b2lkIDApCn0sX2NvbnZlcnRQb3NpdGlvblRvOmZ1bmN0aW9uKGUsdCl7dHx8KHQ9dGhpcy5wb3NpdGlvbik7dmFyIGk9ImFic29sdXRlIj09PWU/MTotMSxzPXRoaXMuX2lzUm9vdE5vZGUodGhpcy5zY3JvbGxQYXJlbnRbMF0pO3JldHVybnt0b3A6dC50b3ArdGhpcy5vZmZzZXQucmVsYXRpdmUudG9wKmkrdGhpcy5vZmZzZXQucGFyZW50LnRvcCppLSgiZml4ZWQiPT09dGhpcy5jc3NQb3NpdGlvbj8tdGhpcy5vZmZzZXQuc2Nyb2xsLnRvcDpzPzA6dGhpcy5vZmZzZXQuc2Nyb2xsLnRvcCkqaSxsZWZ0OnQubGVmdCt0aGlzLm9mZnNldC5yZWxhdGl2ZS5sZWZ0KmkrdGhpcy5vZmZzZXQucGFyZW50LmxlZnQqaS0oImZpeGVkIj09PXRoaXMuY3NzUG9zaXRpb24/LXRoaXMub2Zmc2V0LnNjcm9sbC5sZWZ0OnM/MDp0aGlzLm9mZnNldC5zY3JvbGwubGVmdCkqaX19LF9nZW5lcmF0ZVBvc2l0aW9uOmZ1bmN0aW9uKGUsdCl7dmFyIGkscyxuLGEsbz10aGlzLm9wdGlvbnMscj10aGlzLl9pc1Jvb3ROb2RlKHRoaXMuc2Nyb2xsUGFyZW50WzBdKSxoPWUucGFnZVgsbD1lLnBhZ2VZO3JldHVybiByJiZ0aGlzLm9mZnNldC5zY3JvbGx8fCh0aGlzLm9mZnNldC5zY3JvbGw9e3RvcDp0aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxUb3AoKSxsZWZ0OnRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbExlZnQoKX0pLHQmJih0aGlzLmNvbnRhaW5tZW50JiYodGhpcy5yZWxhdGl2ZUNvbnRhaW5lcj8ocz10aGlzLnJlbGF0aXZlQ29udGFpbmVyLm9mZnNldCgpLGk9W3RoaXMuY29udGFpbm1lbnRbMF0rcy5sZWZ0LHRoaXMuY29udGFpbm1lbnRbMV0rcy50b3AsdGhpcy5jb250YWlubWVudFsyXStzLmxlZnQsdGhpcy5jb250YWlubWVudFszXStzLnRvcF0pOmk9dGhpcy5jb250YWlubWVudCxlLnBhZ2VYLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ8aVswXSYmKGg9aVswXSt0aGlzLm9mZnNldC5jbGljay5sZWZ0KSxlLnBhZ2VZLXRoaXMub2Zmc2V0LmNsaWNrLnRvcDxpWzFdJiYobD1pWzFdK3RoaXMub2Zmc2V0LmNsaWNrLnRvcCksZS5wYWdlWC10aGlzLm9mZnNldC5jbGljay5sZWZ0PmlbMl0mJihoPWlbMl0rdGhpcy5vZmZzZXQuY2xpY2subGVmdCksZS5wYWdlWS10aGlzLm9mZnNldC5jbGljay50b3A+aVszXSYmKGw9aVszXSt0aGlzLm9mZnNldC5jbGljay50b3ApKSxvLmdyaWQmJihuPW8uZ3JpZFsxXT90aGlzLm9yaWdpbmFsUGFnZVkrTWF0aC5yb3VuZCgobC10aGlzLm9yaWdpbmFsUGFnZVkpL28uZ3JpZFsxXSkqby5ncmlkWzFdOnRoaXMub3JpZ2luYWxQYWdlWSxsPWk/bi10aGlzLm9mZnNldC5jbGljay50b3A+PWlbMV18fG4tdGhpcy5vZmZzZXQuY2xpY2sudG9wPmlbM10/bjpuLXRoaXMub2Zmc2V0LmNsaWNrLnRvcD49aVsxXT9uLW8uZ3JpZFsxXTpuK28uZ3JpZFsxXTpuLGE9by5ncmlkWzBdP3RoaXMub3JpZ2luYWxQYWdlWCtNYXRoLnJvdW5kKChoLXRoaXMub3JpZ2luYWxQYWdlWCkvby5ncmlkWzBdKSpvLmdyaWRbMF06dGhpcy5vcmlnaW5hbFBhZ2VYLGg9aT9hLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ+PWlbMF18fGEtdGhpcy5vZmZzZXQuY2xpY2subGVmdD5pWzJdP2E6YS10aGlzLm9mZnNldC5jbGljay5sZWZ0Pj1pWzBdP2Etby5ncmlkWzBdOmErby5ncmlkWzBdOmEpLCJ5Ij09PW8uYXhpcyYmKGg9dGhpcy5vcmlnaW5hbFBhZ2VYKSwieCI9PT1vLmF4aXMmJihsPXRoaXMub3JpZ2luYWxQYWdlWSkpLHt0b3A6bC10aGlzLm9mZnNldC5jbGljay50b3AtdGhpcy5vZmZzZXQucmVsYXRpdmUudG9wLXRoaXMub2Zmc2V0LnBhcmVudC50b3ArKCJmaXhlZCI9PT10aGlzLmNzc1Bvc2l0aW9uPy10aGlzLm9mZnNldC5zY3JvbGwudG9wOnI/MDp0aGlzLm9mZnNldC5zY3JvbGwudG9wKSxsZWZ0OmgtdGhpcy5vZmZzZXQuY2xpY2subGVmdC10aGlzLm9mZnNldC5yZWxhdGl2ZS5sZWZ0LXRoaXMub2Zmc2V0LnBhcmVudC5sZWZ0KygiZml4ZWQiPT09dGhpcy5jc3NQb3NpdGlvbj8tdGhpcy5vZmZzZXQuc2Nyb2xsLmxlZnQ6cj8wOnRoaXMub2Zmc2V0LnNjcm9sbC5sZWZ0KX19LF9jbGVhcjpmdW5jdGlvbigpe3RoaXMuaGVscGVyLnJlbW92ZUNsYXNzKCJ1aS1kcmFnZ2FibGUtZHJhZ2dpbmciKSx0aGlzLmhlbHBlclswXT09PXRoaXMuZWxlbWVudFswXXx8dGhpcy5jYW5jZWxIZWxwZXJSZW1vdmFsfHx0aGlzLmhlbHBlci5yZW1vdmUoKSx0aGlzLmhlbHBlcj1udWxsLHRoaXMuY2FuY2VsSGVscGVyUmVtb3ZhbD0hMSx0aGlzLmRlc3Ryb3lPbkNsZWFyJiZ0aGlzLmRlc3Ryb3koKX0sX25vcm1hbGl6ZVJpZ2h0Qm90dG9tOmZ1bmN0aW9uKCl7InkiIT09dGhpcy5vcHRpb25zLmF4aXMmJiJhdXRvIiE9PXRoaXMuaGVscGVyLmNzcygicmlnaHQiKSYmKHRoaXMuaGVscGVyLndpZHRoKHRoaXMuaGVscGVyLndpZHRoKCkpLHRoaXMuaGVscGVyLmNzcygicmlnaHQiLCJhdXRvIikpLCJ4IiE9PXRoaXMub3B0aW9ucy5heGlzJiYiYXV0byIhPT10aGlzLmhlbHBlci5jc3MoImJvdHRvbSIpJiYodGhpcy5oZWxwZXIuaGVpZ2h0KHRoaXMuaGVscGVyLmhlaWdodCgpKSx0aGlzLmhlbHBlci5jc3MoImJvdHRvbSIsImF1dG8iKSl9LF90cmlnZ2VyOmZ1bmN0aW9uKHQsaSxzKXtyZXR1cm4gcz1zfHx0aGlzLl91aUhhc2goKSxlLnVpLnBsdWdpbi5jYWxsKHRoaXMsdCxbaSxzLHRoaXNdLCEwKSwvXihkcmFnfHN0YXJ0fHN0b3ApLy50ZXN0KHQpJiYodGhpcy5wb3NpdGlvbkFicz10aGlzLl9jb252ZXJ0UG9zaXRpb25UbygiYWJzb2x1dGUiKSxzLm9mZnNldD10aGlzLnBvc2l0aW9uQWJzKSxlLldpZGdldC5wcm90b3R5cGUuX3RyaWdnZXIuY2FsbCh0aGlzLHQsaSxzKX0scGx1Z2luczp7fSxfdWlIYXNoOmZ1bmN0aW9uKCl7cmV0dXJue2hlbHBlcjp0aGlzLmhlbHBlcixwb3NpdGlvbjp0aGlzLnBvc2l0aW9uLG9yaWdpbmFsUG9zaXRpb246dGhpcy5vcmlnaW5hbFBvc2l0aW9uLG9mZnNldDp0aGlzLnBvc2l0aW9uQWJzfX19KSxlLnVpLnBsdWdpbi5hZGQoImRyYWdnYWJsZSIsImNvbm5lY3RUb1NvcnRhYmxlIix7c3RhcnQ6ZnVuY3Rpb24odCxpLHMpe3ZhciBuPWUuZXh0ZW5kKHt9LGkse2l0ZW06cy5lbGVtZW50fSk7cy5zb3J0YWJsZXM9W10sZShzLm9wdGlvbnMuY29ubmVjdFRvU29ydGFibGUpLmVhY2goZnVuY3Rpb24oKXt2YXIgaT1lKHRoaXMpLnNvcnRhYmxlKCJpbnN0YW5jZSIpO2kmJiFpLm9wdGlvbnMuZGlzYWJsZWQmJihzLnNvcnRhYmxlcy5wdXNoKGkpLGkucmVmcmVzaFBvc2l0aW9ucygpLGkuX3RyaWdnZXIoImFjdGl2YXRlIix0LG4pKX0pfSxzdG9wOmZ1bmN0aW9uKHQsaSxzKXt2YXIgbj1lLmV4dGVuZCh7fSxpLHtpdGVtOnMuZWxlbWVudH0pO3MuY2FuY2VsSGVscGVyUmVtb3ZhbD0hMSxlLmVhY2gocy5zb3J0YWJsZXMsZnVuY3Rpb24oKXt2YXIgZT10aGlzO2UuaXNPdmVyPyhlLmlzT3Zlcj0wLHMuY2FuY2VsSGVscGVyUmVtb3ZhbD0hMCxlLmNhbmNlbEhlbHBlclJlbW92YWw9ITEsZS5fc3RvcmVkQ1NTPXtwb3NpdGlvbjplLnBsYWNlaG9sZGVyLmNzcygicG9zaXRpb24iKSx0b3A6ZS5wbGFjZWhvbGRlci5jc3MoInRvcCIpLGxlZnQ6ZS5wbGFjZWhvbGRlci5jc3MoImxlZnQiKX0sZS5fbW91c2VTdG9wKHQpLGUub3B0aW9ucy5oZWxwZXI9ZS5vcHRpb25zLl9oZWxwZXIpOihlLmNhbmNlbEhlbHBlclJlbW92YWw9ITAsZS5fdHJpZ2dlcigiZGVhY3RpdmF0ZSIsdCxuKSl9KX0sZHJhZzpmdW5jdGlvbih0LGkscyl7ZS5lYWNoKHMuc29ydGFibGVzLGZ1bmN0aW9uKCl7dmFyIG49ITEsYT10aGlzO2EucG9zaXRpb25BYnM9cy5wb3NpdGlvbkFicyxhLmhlbHBlclByb3BvcnRpb25zPXMuaGVscGVyUHJvcG9ydGlvbnMsYS5vZmZzZXQuY2xpY2s9cy5vZmZzZXQuY2xpY2ssYS5faW50ZXJzZWN0c1dpdGgoYS5jb250YWluZXJDYWNoZSkmJihuPSEwLGUuZWFjaChzLnNvcnRhYmxlcyxmdW5jdGlvbigpe3JldHVybiB0aGlzLnBvc2l0aW9uQWJzPXMucG9zaXRpb25BYnMsdGhpcy5oZWxwZXJQcm9wb3J0aW9ucz1zLmhlbHBlclByb3BvcnRpb25zLHRoaXMub2Zmc2V0LmNsaWNrPXMub2Zmc2V0LmNsaWNrLHRoaXMhPT1hJiZ0aGlzLl9pbnRlcnNlY3RzV2l0aCh0aGlzLmNvbnRhaW5lckNhY2hlKSYmZS5jb250YWlucyhhLmVsZW1lbnRbMF0sdGhpcy5lbGVtZW50WzBdKSYmKG49ITEpLG59KSksbj8oYS5pc092ZXJ8fChhLmlzT3Zlcj0xLHMuX3BhcmVudD1pLmhlbHBlci5wYXJlbnQoKSxhLmN1cnJlbnRJdGVtPWkuaGVscGVyLmFwcGVuZFRvKGEuZWxlbWVudCkuZGF0YSgidWktc29ydGFibGUtaXRlbSIsITApLGEub3B0aW9ucy5faGVscGVyPWEub3B0aW9ucy5oZWxwZXIsYS5vcHRpb25zLmhlbHBlcj1mdW5jdGlvbigpe3JldHVybiBpLmhlbHBlclswXX0sdC50YXJnZXQ9YS5jdXJyZW50SXRlbVswXSxhLl9tb3VzZUNhcHR1cmUodCwhMCksYS5fbW91c2VTdGFydCh0LCEwLCEwKSxhLm9mZnNldC5jbGljay50b3A9cy5vZmZzZXQuY2xpY2sudG9wLGEub2Zmc2V0LmNsaWNrLmxlZnQ9cy5vZmZzZXQuY2xpY2subGVmdCxhLm9mZnNldC5wYXJlbnQubGVmdC09cy5vZmZzZXQucGFyZW50LmxlZnQtYS5vZmZzZXQucGFyZW50LmxlZnQsYS5vZmZzZXQucGFyZW50LnRvcC09cy5vZmZzZXQucGFyZW50LnRvcC1hLm9mZnNldC5wYXJlbnQudG9wLHMuX3RyaWdnZXIoInRvU29ydGFibGUiLHQpLHMuZHJvcHBlZD1hLmVsZW1lbnQsZS5lYWNoKHMuc29ydGFibGVzLGZ1bmN0aW9uKCl7dGhpcy5yZWZyZXNoUG9zaXRpb25zKCl9KSxzLmN1cnJlbnRJdGVtPXMuZWxlbWVudCxhLmZyb21PdXRzaWRlPXMpLGEuY3VycmVudEl0ZW0mJihhLl9tb3VzZURyYWcodCksaS5wb3NpdGlvbj1hLnBvc2l0aW9uKSk6YS5pc092ZXImJihhLmlzT3Zlcj0wLGEuY2FuY2VsSGVscGVyUmVtb3ZhbD0hMCxhLm9wdGlvbnMuX3JldmVydD1hLm9wdGlvbnMucmV2ZXJ0LGEub3B0aW9ucy5yZXZlcnQ9ITEsYS5fdHJpZ2dlcigib3V0Iix0LGEuX3VpSGFzaChhKSksYS5fbW91c2VTdG9wKHQsITApLGEub3B0aW9ucy5yZXZlcnQ9YS5vcHRpb25zLl9yZXZlcnQsYS5vcHRpb25zLmhlbHBlcj1hLm9wdGlvbnMuX2hlbHBlcixhLnBsYWNlaG9sZGVyJiZhLnBsYWNlaG9sZGVyLnJlbW92ZSgpLGkuaGVscGVyLmFwcGVuZFRvKHMuX3BhcmVudCkscy5fcmVmcmVzaE9mZnNldHModCksaS5wb3NpdGlvbj1zLl9nZW5lcmF0ZVBvc2l0aW9uKHQsITApLHMuX3RyaWdnZXIoImZyb21Tb3J0YWJsZSIsdCkscy5kcm9wcGVkPSExLGUuZWFjaChzLnNvcnRhYmxlcyxmdW5jdGlvbigpe3RoaXMucmVmcmVzaFBvc2l0aW9ucygpfSkpfSl9fSksZS51aS5wbHVnaW4uYWRkKCJkcmFnZ2FibGUiLCJjdXJzb3IiLHtzdGFydDpmdW5jdGlvbih0LGkscyl7dmFyIG49ZSgiYm9keSIpLGE9cy5vcHRpb25zO24uY3NzKCJjdXJzb3IiKSYmKGEuX2N1cnNvcj1uLmNzcygiY3Vyc29yIikpLG4uY3NzKCJjdXJzb3IiLGEuY3Vyc29yKX0sc3RvcDpmdW5jdGlvbih0LGkscyl7dmFyIG49cy5vcHRpb25zO24uX2N1cnNvciYmZSgiYm9keSIpLmNzcygiY3Vyc29yIixuLl9jdXJzb3IpfX0pLGUudWkucGx1Z2luLmFkZCgiZHJhZ2dhYmxlIiwib3BhY2l0eSIse3N0YXJ0OmZ1bmN0aW9uKHQsaSxzKXt2YXIgbj1lKGkuaGVscGVyKSxhPXMub3B0aW9ucztuLmNzcygib3BhY2l0eSIpJiYoYS5fb3BhY2l0eT1uLmNzcygib3BhY2l0eSIpKSxuLmNzcygib3BhY2l0eSIsYS5vcGFjaXR5KX0sc3RvcDpmdW5jdGlvbih0LGkscyl7dmFyIG49cy5vcHRpb25zO24uX29wYWNpdHkmJmUoaS5oZWxwZXIpLmNzcygib3BhY2l0eSIsbi5fb3BhY2l0eSl9fSksZS51aS5wbHVnaW4uYWRkKCJkcmFnZ2FibGUiLCJzY3JvbGwiLHtzdGFydDpmdW5jdGlvbihlLHQsaSl7aS5zY3JvbGxQYXJlbnROb3RIaWRkZW58fChpLnNjcm9sbFBhcmVudE5vdEhpZGRlbj1pLmhlbHBlci5zY3JvbGxQYXJlbnQoITEpKSxpLnNjcm9sbFBhcmVudE5vdEhpZGRlblswXSE9PWkuZG9jdW1lbnRbMF0mJiJIVE1MIiE9PWkuc2Nyb2xsUGFyZW50Tm90SGlkZGVuWzBdLnRhZ05hbWUmJihpLm92ZXJmbG93T2Zmc2V0PWkuc2Nyb2xsUGFyZW50Tm90SGlkZGVuLm9mZnNldCgpKX0sZHJhZzpmdW5jdGlvbih0LGkscyl7dmFyIG49cy5vcHRpb25zLGE9ITEsbz1zLnNjcm9sbFBhcmVudE5vdEhpZGRlblswXSxyPXMuZG9jdW1lbnRbMF07byE9PXImJiJIVE1MIiE9PW8udGFnTmFtZT8obi5heGlzJiYieCI9PT1uLmF4aXN8fChzLm92ZXJmbG93T2Zmc2V0LnRvcCtvLm9mZnNldEhlaWdodC10LnBhZ2VZPG4uc2Nyb2xsU2Vuc2l0aXZpdHk/by5zY3JvbGxUb3A9YT1vLnNjcm9sbFRvcCtuLnNjcm9sbFNwZWVkOnQucGFnZVktcy5vdmVyZmxvd09mZnNldC50b3A8bi5zY3JvbGxTZW5zaXRpdml0eSYmKG8uc2Nyb2xsVG9wPWE9by5zY3JvbGxUb3Atbi5zY3JvbGxTcGVlZCkpLG4uYXhpcyYmInkiPT09bi5heGlzfHwocy5vdmVyZmxvd09mZnNldC5sZWZ0K28ub2Zmc2V0V2lkdGgtdC5wYWdlWDxuLnNjcm9sbFNlbnNpdGl2aXR5P28uc2Nyb2xsTGVmdD1hPW8uc2Nyb2xsTGVmdCtuLnNjcm9sbFNwZWVkOnQucGFnZVgtcy5vdmVyZmxvd09mZnNldC5sZWZ0PG4uc2Nyb2xsU2Vuc2l0aXZpdHkmJihvLnNjcm9sbExlZnQ9YT1vLnNjcm9sbExlZnQtbi5zY3JvbGxTcGVlZCkpKToobi5heGlzJiYieCI9PT1uLmF4aXN8fCh0LnBhZ2VZLWUocikuc2Nyb2xsVG9wKCk8bi5zY3JvbGxTZW5zaXRpdml0eT9hPWUocikuc2Nyb2xsVG9wKGUocikuc2Nyb2xsVG9wKCktbi5zY3JvbGxTcGVlZCk6ZSh3aW5kb3cpLmhlaWdodCgpLSh0LnBhZ2VZLWUocikuc2Nyb2xsVG9wKCkpPG4uc2Nyb2xsU2Vuc2l0aXZpdHkmJihhPWUocikuc2Nyb2xsVG9wKGUocikuc2Nyb2xsVG9wKCkrbi5zY3JvbGxTcGVlZCkpKSxuLmF4aXMmJiJ5Ij09PW4uYXhpc3x8KHQucGFnZVgtZShyKS5zY3JvbGxMZWZ0KCk8bi5zY3JvbGxTZW5zaXRpdml0eT9hPWUocikuc2Nyb2xsTGVmdChlKHIpLnNjcm9sbExlZnQoKS1uLnNjcm9sbFNwZWVkKTplKHdpbmRvdykud2lkdGgoKS0odC5wYWdlWC1lKHIpLnNjcm9sbExlZnQoKSk8bi5zY3JvbGxTZW5zaXRpdml0eSYmKGE9ZShyKS5zY3JvbGxMZWZ0KGUocikuc2Nyb2xsTGVmdCgpK24uc2Nyb2xsU3BlZWQpKSkpLGEhPT0hMSYmZS51aS5kZG1hbmFnZXImJiFuLmRyb3BCZWhhdmlvdXImJmUudWkuZGRtYW5hZ2VyLnByZXBhcmVPZmZzZXRzKHMsdCl9fSksZS51aS5wbHVnaW4uYWRkKCJkcmFnZ2FibGUiLCJzbmFwIix7c3RhcnQ6ZnVuY3Rpb24odCxpLHMpe3ZhciBuPXMub3B0aW9ucztzLnNuYXBFbGVtZW50cz1bXSxlKG4uc25hcC5jb25zdHJ1Y3RvciE9PVN0cmluZz9uLnNuYXAuaXRlbXN8fCI6ZGF0YSh1aS1kcmFnZ2FibGUpIjpuLnNuYXApLmVhY2goZnVuY3Rpb24oKXt2YXIgdD1lKHRoaXMpLGk9dC5vZmZzZXQoKTt0aGlzIT09cy5lbGVtZW50WzBdJiZzLnNuYXBFbGVtZW50cy5wdXNoKHtpdGVtOnRoaXMsd2lkdGg6dC5vdXRlcldpZHRoKCksaGVpZ2h0OnQub3V0ZXJIZWlnaHQoKSx0b3A6aS50b3AsbGVmdDppLmxlZnR9KX0pfSxkcmFnOmZ1bmN0aW9uKHQsaSxzKXt2YXIgbixhLG8scixoLGwsdSxkLGMscCxmPXMub3B0aW9ucyxtPWYuc25hcFRvbGVyYW5jZSxnPWkub2Zmc2V0LmxlZnQsdj1nK3MuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgseT1pLm9mZnNldC50b3AsYj15K3MuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0O2ZvcihjPXMuc25hcEVsZW1lbnRzLmxlbmd0aC0xO2M+PTA7Yy0tKWg9cy5zbmFwRWxlbWVudHNbY10ubGVmdC1zLm1hcmdpbnMubGVmdCxsPWgrcy5zbmFwRWxlbWVudHNbY10ud2lkdGgsdT1zLnNuYXBFbGVtZW50c1tjXS50b3Atcy5tYXJnaW5zLnRvcCxkPXUrcy5zbmFwRWxlbWVudHNbY10uaGVpZ2h0LGgtbT52fHxnPmwrbXx8dS1tPmJ8fHk+ZCttfHwhZS5jb250YWlucyhzLnNuYXBFbGVtZW50c1tjXS5pdGVtLm93bmVyRG9jdW1lbnQscy5zbmFwRWxlbWVudHNbY10uaXRlbSk/KHMuc25hcEVsZW1lbnRzW2NdLnNuYXBwaW5nJiZzLm9wdGlvbnMuc25hcC5yZWxlYXNlJiZzLm9wdGlvbnMuc25hcC5yZWxlYXNlLmNhbGwocy5lbGVtZW50LHQsZS5leHRlbmQocy5fdWlIYXNoKCkse3NuYXBJdGVtOnMuc25hcEVsZW1lbnRzW2NdLml0ZW19KSkscy5zbmFwRWxlbWVudHNbY10uc25hcHBpbmc9ITEpOigiaW5uZXIiIT09Zi5zbmFwTW9kZSYmKG49bT49TWF0aC5hYnModS1iKSxhPW0+PU1hdGguYWJzKGQteSksbz1tPj1NYXRoLmFicyhoLXYpLHI9bT49TWF0aC5hYnMobC1nKSxuJiYoaS5wb3NpdGlvbi50b3A9cy5fY29udmVydFBvc2l0aW9uVG8oInJlbGF0aXZlIix7dG9wOnUtcy5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQsbGVmdDowfSkudG9wKSxhJiYoaS5wb3NpdGlvbi50b3A9cy5fY29udmVydFBvc2l0aW9uVG8oInJlbGF0aXZlIix7dG9wOmQsbGVmdDowfSkudG9wKSxvJiYoaS5wb3NpdGlvbi5sZWZ0PXMuX2NvbnZlcnRQb3NpdGlvblRvKCJyZWxhdGl2ZSIse3RvcDowLGxlZnQ6aC1zLmhlbHBlclByb3BvcnRpb25zLndpZHRofSkubGVmdCksciYmKGkucG9zaXRpb24ubGVmdD1zLl9jb252ZXJ0UG9zaXRpb25UbygicmVsYXRpdmUiLHt0b3A6MCxsZWZ0Omx9KS5sZWZ0KSkscD1ufHxhfHxvfHxyLCJvdXRlciIhPT1mLnNuYXBNb2RlJiYobj1tPj1NYXRoLmFicyh1LXkpLGE9bT49TWF0aC5hYnMoZC1iKSxvPW0+PU1hdGguYWJzKGgtZykscj1tPj1NYXRoLmFicyhsLXYpLG4mJihpLnBvc2l0aW9uLnRvcD1zLl9jb252ZXJ0UG9zaXRpb25UbygicmVsYXRpdmUiLHt0b3A6dSxsZWZ0OjB9KS50b3ApLGEmJihpLnBvc2l0aW9uLnRvcD1zLl9jb252ZXJ0UG9zaXRpb25UbygicmVsYXRpdmUiLHt0b3A6ZC1zLmhlbHBlclByb3BvcnRpb25zLmhlaWdodCxsZWZ0OjB9KS50b3ApLG8mJihpLnBvc2l0aW9uLmxlZnQ9cy5fY29udmVydFBvc2l0aW9uVG8oInJlbGF0aXZlIix7dG9wOjAsbGVmdDpofSkubGVmdCksciYmKGkucG9zaXRpb24ubGVmdD1zLl9jb252ZXJ0UG9zaXRpb25UbygicmVsYXRpdmUiLHt0b3A6MCxsZWZ0Omwtcy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aH0pLmxlZnQpKSwhcy5zbmFwRWxlbWVudHNbY10uc25hcHBpbmcmJihufHxhfHxvfHxyfHxwKSYmcy5vcHRpb25zLnNuYXAuc25hcCYmcy5vcHRpb25zLnNuYXAuc25hcC5jYWxsKHMuZWxlbWVudCx0LGUuZXh0ZW5kKHMuX3VpSGFzaCgpLHtzbmFwSXRlbTpzLnNuYXBFbGVtZW50c1tjXS5pdGVtfSkpLHMuc25hcEVsZW1lbnRzW2NdLnNuYXBwaW5nPW58fGF8fG98fHJ8fHApfX0pLGUudWkucGx1Z2luLmFkZCgiZHJhZ2dhYmxlIiwic3RhY2siLHtzdGFydDpmdW5jdGlvbih0LGkscyl7dmFyIG4sYT1zLm9wdGlvbnMsbz1lLm1ha2VBcnJheShlKGEuc3RhY2spKS5zb3J0KGZ1bmN0aW9uKHQsaSl7cmV0dXJuKHBhcnNlSW50KGUodCkuY3NzKCJ6SW5kZXgiKSwxMCl8fDApLShwYXJzZUludChlKGkpLmNzcygiekluZGV4IiksMTApfHwwKX0pO28ubGVuZ3RoJiYobj1wYXJzZUludChlKG9bMF0pLmNzcygiekluZGV4IiksMTApfHwwLGUobykuZWFjaChmdW5jdGlvbih0KXtlKHRoaXMpLmNzcygiekluZGV4IixuK3QpfSksdGhpcy5jc3MoInpJbmRleCIsbitvLmxlbmd0aCkpfX0pLGUudWkucGx1Z2luLmFkZCgiZHJhZ2dhYmxlIiwiekluZGV4Iix7c3RhcnQ6ZnVuY3Rpb24odCxpLHMpe3ZhciBuPWUoaS5oZWxwZXIpLGE9cy5vcHRpb25zO24uY3NzKCJ6SW5kZXgiKSYmKGEuX3pJbmRleD1uLmNzcygiekluZGV4IikpLG4uY3NzKCJ6SW5kZXgiLGEuekluZGV4KX0sc3RvcDpmdW5jdGlvbih0LGkscyl7dmFyIG49cy5vcHRpb25zO24uX3pJbmRleCYmZShpLmhlbHBlcikuY3NzKCJ6SW5kZXgiLG4uX3pJbmRleCl9fSksZS51aS5kcmFnZ2FibGUsZS53aWRnZXQoInVpLnJlc2l6YWJsZSIsZS51aS5tb3VzZSx7dmVyc2lvbjoiMS4xMS40Iix3aWRnZXRFdmVudFByZWZpeDoicmVzaXplIixvcHRpb25zOnthbHNvUmVzaXplOiExLGFuaW1hdGU6ITEsYW5pbWF0ZUR1cmF0aW9uOiJzbG93IixhbmltYXRlRWFzaW5nOiJzd2luZyIsYXNwZWN0UmF0aW86ITEsYXV0b0hpZGU6ITEsY29udGFpbm1lbnQ6ITEsZ2hvc3Q6ITEsZ3JpZDohMSxoYW5kbGVzOiJlLHMsc2UiLGhlbHBlcjohMSxtYXhIZWlnaHQ6bnVsbCxtYXhXaWR0aDpudWxsLG1pbkhlaWdodDoxMCxtaW5XaWR0aDoxMCx6SW5kZXg6OTAscmVzaXplOm51bGwsc3RhcnQ6bnVsbCxzdG9wOm51bGx9LF9udW06ZnVuY3Rpb24oZSl7cmV0dXJuIHBhcnNlSW50KGUsMTApfHwwfSxfaXNOdW1iZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIWlzTmFOKHBhcnNlSW50KGUsMTApKX0sX2hhc1Njcm9sbDpmdW5jdGlvbih0LGkpe2lmKCJoaWRkZW4iPT09ZSh0KS5jc3MoIm92ZXJmbG93IikpcmV0dXJuITE7dmFyIHM9aSYmImxlZnQiPT09aT8ic2Nyb2xsTGVmdCI6InNjcm9sbFRvcCIsbj0hMTtyZXR1cm4gdFtzXT4wPyEwOih0W3NdPTEsbj10W3NdPjAsdFtzXT0wLG4pfSxfY3JlYXRlOmZ1bmN0aW9uKCl7dmFyIHQsaSxzLG4sYSxvPXRoaXMscj10aGlzLm9wdGlvbnM7aWYodGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS1yZXNpemFibGUiKSxlLmV4dGVuZCh0aGlzLHtfYXNwZWN0UmF0aW86ISFyLmFzcGVjdFJhdGlvLGFzcGVjdFJhdGlvOnIuYXNwZWN0UmF0aW8sb3JpZ2luYWxFbGVtZW50OnRoaXMuZWxlbWVudCxfcHJvcG9ydGlvbmFsbHlSZXNpemVFbGVtZW50czpbXSxfaGVscGVyOnIuaGVscGVyfHxyLmdob3N0fHxyLmFuaW1hdGU/ci5oZWxwZXJ8fCJ1aS1yZXNpemFibGUtaGVscGVyIjpudWxsfSksdGhpcy5lbGVtZW50WzBdLm5vZGVOYW1lLm1hdGNoKC9eKGNhbnZhc3x0ZXh0YXJlYXxpbnB1dHxzZWxlY3R8YnV0dG9ufGltZykkL2kpJiYodGhpcy5lbGVtZW50LndyYXAoZSgiPGRpdiBjbGFzcz0ndWktd3JhcHBlcicgc3R5bGU9J292ZXJmbG93OiBoaWRkZW47Jz48L2Rpdj4iKS5jc3Moe3Bvc2l0aW9uOnRoaXMuZWxlbWVudC5jc3MoInBvc2l0aW9uIiksd2lkdGg6dGhpcy5lbGVtZW50Lm91dGVyV2lkdGgoKSxoZWlnaHQ6dGhpcy5lbGVtZW50Lm91dGVySGVpZ2h0KCksdG9wOnRoaXMuZWxlbWVudC5jc3MoInRvcCIpLGxlZnQ6dGhpcy5lbGVtZW50LmNzcygibGVmdCIpfSkpLHRoaXMuZWxlbWVudD10aGlzLmVsZW1lbnQucGFyZW50KCkuZGF0YSgidWktcmVzaXphYmxlIix0aGlzLmVsZW1lbnQucmVzaXphYmxlKCJpbnN0YW5jZSIpKSx0aGlzLmVsZW1lbnRJc1dyYXBwZXI9ITAsdGhpcy5lbGVtZW50LmNzcyh7bWFyZ2luTGVmdDp0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3MoIm1hcmdpbkxlZnQiKSxtYXJnaW5Ub3A6dGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKCJtYXJnaW5Ub3AiKSxtYXJnaW5SaWdodDp0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3MoIm1hcmdpblJpZ2h0IiksbWFyZ2luQm90dG9tOnRoaXMub3JpZ2luYWxFbGVtZW50LmNzcygibWFyZ2luQm90dG9tIil9KSx0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3Moe21hcmdpbkxlZnQ6MCxtYXJnaW5Ub3A6MCxtYXJnaW5SaWdodDowLG1hcmdpbkJvdHRvbTowfSksdGhpcy5vcmlnaW5hbFJlc2l6ZVN0eWxlPXRoaXMub3JpZ2luYWxFbGVtZW50LmNzcygicmVzaXplIiksdGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKCJyZXNpemUiLCJub25lIiksdGhpcy5fcHJvcG9ydGlvbmFsbHlSZXNpemVFbGVtZW50cy5wdXNoKHRoaXMub3JpZ2luYWxFbGVtZW50LmNzcyh7cG9zaXRpb246InN0YXRpYyIsem9vbToxLGRpc3BsYXk6ImJsb2NrIn0pKSx0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3Moe21hcmdpbjp0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3MoIm1hcmdpbiIpfSksdGhpcy5fcHJvcG9ydGlvbmFsbHlSZXNpemUoKSksdGhpcy5oYW5kbGVzPXIuaGFuZGxlc3x8KGUoIi51aS1yZXNpemFibGUtaGFuZGxlIix0aGlzLmVsZW1lbnQpLmxlbmd0aD97bjoiLnVpLXJlc2l6YWJsZS1uIixlOiIudWktcmVzaXphYmxlLWUiLHM6Ii51aS1yZXNpemFibGUtcyIsdzoiLnVpLXJlc2l6YWJsZS13IixzZToiLnVpLXJlc2l6YWJsZS1zZSIsc3c6Ii51aS1yZXNpemFibGUtc3ciLG5lOiIudWktcmVzaXphYmxlLW5lIixudzoiLnVpLXJlc2l6YWJsZS1udyJ9OiJlLHMsc2UiKSx0aGlzLl9oYW5kbGVzPWUoKSx0aGlzLmhhbmRsZXMuY29uc3RydWN0b3I9PT1TdHJpbmcpZm9yKCJhbGwiPT09dGhpcy5oYW5kbGVzJiYodGhpcy5oYW5kbGVzPSJuLGUscyx3LHNlLHN3LG5lLG53IiksdD10aGlzLmhhbmRsZXMuc3BsaXQoIiwiKSx0aGlzLmhhbmRsZXM9e30saT0wO3QubGVuZ3RoPmk7aSsrKXM9ZS50cmltKHRbaV0pLGE9InVpLXJlc2l6YWJsZS0iK3Msbj1lKCI8ZGl2IGNsYXNzPSd1aS1yZXNpemFibGUtaGFuZGxlICIrYSsiJz48L2Rpdj4iKSxuLmNzcyh7ekluZGV4OnIuekluZGV4fSksInNlIj09PXMmJm4uYWRkQ2xhc3MoInVpLWljb24gdWktaWNvbi1ncmlwc21hbGwtZGlhZ29uYWwtc2UiKSx0aGlzLmhhbmRsZXNbc109Ii51aS1yZXNpemFibGUtIitzLHRoaXMuZWxlbWVudC5hcHBlbmQobik7dGhpcy5fcmVuZGVyQXhpcz1mdW5jdGlvbih0KXt2YXIgaSxzLG4sYTt0PXR8fHRoaXMuZWxlbWVudDtmb3IoaSBpbiB0aGlzLmhhbmRsZXMpdGhpcy5oYW5kbGVzW2ldLmNvbnN0cnVjdG9yPT09U3RyaW5nP3RoaXMuaGFuZGxlc1tpXT10aGlzLmVsZW1lbnQuY2hpbGRyZW4odGhpcy5oYW5kbGVzW2ldKS5maXJzdCgpLnNob3coKToodGhpcy5oYW5kbGVzW2ldLmpxdWVyeXx8dGhpcy5oYW5kbGVzW2ldLm5vZGVUeXBlKSYmKHRoaXMuaGFuZGxlc1tpXT1lKHRoaXMuaGFuZGxlc1tpXSksdGhpcy5fb24odGhpcy5oYW5kbGVzW2ldLHttb3VzZWRvd246by5fbW91c2VEb3dufSkpLHRoaXMuZWxlbWVudElzV3JhcHBlciYmdGhpcy5vcmlnaW5hbEVsZW1lbnRbMF0ubm9kZU5hbWUubWF0Y2goL14odGV4dGFyZWF8aW5wdXR8c2VsZWN0fGJ1dHRvbikkL2kpJiYocz1lKHRoaXMuaGFuZGxlc1tpXSx0aGlzLmVsZW1lbnQpLGE9L3N3fG5lfG53fHNlfG58cy8udGVzdChpKT9zLm91dGVySGVpZ2h0KCk6cy5vdXRlcldpZHRoKCksbj1bInBhZGRpbmciLC9uZXxud3xuLy50ZXN0KGkpPyJUb3AiOi9zZXxzd3xzLy50ZXN0KGkpPyJCb3R0b20iOi9eZSQvLnRlc3QoaSk/IlJpZ2h0IjoiTGVmdCJdLmpvaW4oIiIpLHQuY3NzKG4sYSksdGhpcy5fcHJvcG9ydGlvbmFsbHlSZXNpemUoKSksdGhpcy5faGFuZGxlcz10aGlzLl9oYW5kbGVzLmFkZCh0aGlzLmhhbmRsZXNbaV0pfSx0aGlzLl9yZW5kZXJBeGlzKHRoaXMuZWxlbWVudCksdGhpcy5faGFuZGxlcz10aGlzLl9oYW5kbGVzLmFkZCh0aGlzLmVsZW1lbnQuZmluZCgiLnVpLXJlc2l6YWJsZS1oYW5kbGUiKSksdGhpcy5faGFuZGxlcy5kaXNhYmxlU2VsZWN0aW9uKCksdGhpcy5faGFuZGxlcy5tb3VzZW92ZXIoZnVuY3Rpb24oKXtvLnJlc2l6aW5nfHwodGhpcy5jbGFzc05hbWUmJihuPXRoaXMuY2xhc3NOYW1lLm1hdGNoKC91aS1yZXNpemFibGUtKHNlfHN3fG5lfG53fG58ZXxzfHcpL2kpKSxvLmF4aXM9biYmblsxXT9uWzFdOiJzZSIpfSksci5hdXRvSGlkZSYmKHRoaXMuX2hhbmRsZXMuaGlkZSgpLGUodGhpcy5lbGVtZW50KS5hZGRDbGFzcygidWktcmVzaXphYmxlLWF1dG9oaWRlIikubW91c2VlbnRlcihmdW5jdGlvbigpe3IuZGlzYWJsZWR8fChlKHRoaXMpLnJlbW92ZUNsYXNzKCJ1aS1yZXNpemFibGUtYXV0b2hpZGUiKSxvLl9oYW5kbGVzLnNob3coKSl9KS5tb3VzZWxlYXZlKGZ1bmN0aW9uKCl7ci5kaXNhYmxlZHx8by5yZXNpemluZ3x8KGUodGhpcykuYWRkQ2xhc3MoInVpLXJlc2l6YWJsZS1hdXRvaGlkZSIpLG8uX2hhbmRsZXMuaGlkZSgpKX0pKSx0aGlzLl9tb3VzZUluaXQoKX0sX2Rlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLl9tb3VzZURlc3Ryb3koKTt2YXIgdCxpPWZ1bmN0aW9uKHQpe2UodCkucmVtb3ZlQ2xhc3MoInVpLXJlc2l6YWJsZSB1aS1yZXNpemFibGUtZGlzYWJsZWQgdWktcmVzaXphYmxlLXJlc2l6aW5nIikucmVtb3ZlRGF0YSgicmVzaXphYmxlIikucmVtb3ZlRGF0YSgidWktcmVzaXphYmxlIikudW5iaW5kKCIucmVzaXphYmxlIikuZmluZCgiLnVpLXJlc2l6YWJsZS1oYW5kbGUiKS5yZW1vdmUoKX07cmV0dXJuIHRoaXMuZWxlbWVudElzV3JhcHBlciYmKGkodGhpcy5lbGVtZW50KSx0PXRoaXMuZWxlbWVudCx0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3Moe3Bvc2l0aW9uOnQuY3NzKCJwb3NpdGlvbiIpLHdpZHRoOnQub3V0ZXJXaWR0aCgpLGhlaWdodDp0Lm91dGVySGVpZ2h0KCksdG9wOnQuY3NzKCJ0b3AiKSxsZWZ0OnQuY3NzKCJsZWZ0Iil9KS5pbnNlcnRBZnRlcih0KSx0LnJlbW92ZSgpKSx0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3MoInJlc2l6ZSIsdGhpcy5vcmlnaW5hbFJlc2l6ZVN0eWxlKSxpKHRoaXMub3JpZ2luYWxFbGVtZW50KSx0aGlzfSxfbW91c2VDYXB0dXJlOmZ1bmN0aW9uKHQpe3ZhciBpLHMsbj0hMTtmb3IoaSBpbiB0aGlzLmhhbmRsZXMpcz1lKHRoaXMuaGFuZGxlc1tpXSlbMF0sKHM9PT10LnRhcmdldHx8ZS5jb250YWlucyhzLHQudGFyZ2V0KSkmJihuPSEwKTtyZXR1cm4hdGhpcy5vcHRpb25zLmRpc2FibGVkJiZufSxfbW91c2VTdGFydDpmdW5jdGlvbih0KXt2YXIgaSxzLG4sYT10aGlzLm9wdGlvbnMsbz10aGlzLmVsZW1lbnQ7cmV0dXJuIHRoaXMucmVzaXppbmc9ITAsdGhpcy5fcmVuZGVyUHJveHkoKSxpPXRoaXMuX251bSh0aGlzLmhlbHBlci5jc3MoImxlZnQiKSkscz10aGlzLl9udW0odGhpcy5oZWxwZXIuY3NzKCJ0b3AiKSksYS5jb250YWlubWVudCYmKGkrPWUoYS5jb250YWlubWVudCkuc2Nyb2xsTGVmdCgpfHwwLHMrPWUoYS5jb250YWlubWVudCkuc2Nyb2xsVG9wKCl8fDApLHRoaXMub2Zmc2V0PXRoaXMuaGVscGVyLm9mZnNldCgpLHRoaXMucG9zaXRpb249e2xlZnQ6aSx0b3A6c30sdGhpcy5zaXplPXRoaXMuX2hlbHBlcj97d2lkdGg6dGhpcy5oZWxwZXIud2lkdGgoKSxoZWlnaHQ6dGhpcy5oZWxwZXIuaGVpZ2h0KCl9Ont3aWR0aDpvLndpZHRoKCksaGVpZ2h0Om8uaGVpZ2h0KCl9LHRoaXMub3JpZ2luYWxTaXplPXRoaXMuX2hlbHBlcj97d2lkdGg6by5vdXRlcldpZHRoKCksaGVpZ2h0Om8ub3V0ZXJIZWlnaHQoKX06e3dpZHRoOm8ud2lkdGgoKSxoZWlnaHQ6by5oZWlnaHQoKX0sdGhpcy5zaXplRGlmZj17d2lkdGg6by5vdXRlcldpZHRoKCktby53aWR0aCgpLGhlaWdodDpvLm91dGVySGVpZ2h0KCktby5oZWlnaHQoKX0sdGhpcy5vcmlnaW5hbFBvc2l0aW9uPXtsZWZ0OmksdG9wOnN9LHRoaXMub3JpZ2luYWxNb3VzZVBvc2l0aW9uPXtsZWZ0OnQucGFnZVgsdG9wOnQucGFnZVl9LHRoaXMuYXNwZWN0UmF0aW89Im51bWJlciI9PXR5cGVvZiBhLmFzcGVjdFJhdGlvP2EuYXNwZWN0UmF0aW86dGhpcy5vcmlnaW5hbFNpemUud2lkdGgvdGhpcy5vcmlnaW5hbFNpemUuaGVpZ2h0fHwxLG49ZSgiLnVpLXJlc2l6YWJsZS0iK3RoaXMuYXhpcykuY3NzKCJjdXJzb3IiKSxlKCJib2R5IikuY3NzKCJjdXJzb3IiLCJhdXRvIj09PW4/dGhpcy5heGlzKyItcmVzaXplIjpuKSxvLmFkZENsYXNzKCJ1aS1yZXNpemFibGUtcmVzaXppbmciKSx0aGlzLl9wcm9wYWdhdGUoInN0YXJ0Iix0KSwhMH0sX21vdXNlRHJhZzpmdW5jdGlvbih0KXt2YXIgaSxzLG49dGhpcy5vcmlnaW5hbE1vdXNlUG9zaXRpb24sYT10aGlzLmF4aXMsbz10LnBhZ2VYLW4ubGVmdHx8MCxyPXQucGFnZVktbi50b3B8fDAsaD10aGlzLl9jaGFuZ2VbYV07cmV0dXJuIHRoaXMuX3VwZGF0ZVByZXZQcm9wZXJ0aWVzKCksaD8oaT1oLmFwcGx5KHRoaXMsW3QsbyxyXSksdGhpcy5fdXBkYXRlVmlydHVhbEJvdW5kYXJpZXModC5zaGlmdEtleSksKHRoaXMuX2FzcGVjdFJhdGlvfHx0LnNoaWZ0S2V5KSYmKGk9dGhpcy5fdXBkYXRlUmF0aW8oaSx0KSksaT10aGlzLl9yZXNwZWN0U2l6ZShpLHQpLHRoaXMuX3VwZGF0ZUNhY2hlKGkpLHRoaXMuX3Byb3BhZ2F0ZSgicmVzaXplIix0KSxzPXRoaXMuX2FwcGx5Q2hhbmdlcygpLCF0aGlzLl9oZWxwZXImJnRoaXMuX3Byb3BvcnRpb25hbGx5UmVzaXplRWxlbWVudHMubGVuZ3RoJiZ0aGlzLl9wcm9wb3J0aW9uYWxseVJlc2l6ZSgpLGUuaXNFbXB0eU9iamVjdChzKXx8KHRoaXMuX3VwZGF0ZVByZXZQcm9wZXJ0aWVzKCksdGhpcy5fdHJpZ2dlcigicmVzaXplIix0LHRoaXMudWkoKSksdGhpcy5fYXBwbHlDaGFuZ2VzKCkpLCExKTohMX0sX21vdXNlU3RvcDpmdW5jdGlvbih0KXt0aGlzLnJlc2l6aW5nPSExO3ZhciBpLHMsbixhLG8scixoLGw9dGhpcy5vcHRpb25zLHU9dGhpcztyZXR1cm4gdGhpcy5faGVscGVyJiYoaT10aGlzLl9wcm9wb3J0aW9uYWxseVJlc2l6ZUVsZW1lbnRzLHM9aS5sZW5ndGgmJi90ZXh0YXJlYS9pLnRlc3QoaVswXS5ub2RlTmFtZSksbj1zJiZ0aGlzLl9oYXNTY3JvbGwoaVswXSwibGVmdCIpPzA6dS5zaXplRGlmZi5oZWlnaHQsYT1zPzA6dS5zaXplRGlmZi53aWR0aCxvPXt3aWR0aDp1LmhlbHBlci53aWR0aCgpLWEsaGVpZ2h0OnUuaGVscGVyLmhlaWdodCgpLW59LHI9cGFyc2VJbnQodS5lbGVtZW50LmNzcygibGVmdCIpLDEwKSsodS5wb3NpdGlvbi5sZWZ0LXUub3JpZ2luYWxQb3NpdGlvbi5sZWZ0KXx8bnVsbCxoPXBhcnNlSW50KHUuZWxlbWVudC5jc3MoInRvcCIpLDEwKSsodS5wb3NpdGlvbi50b3AtdS5vcmlnaW5hbFBvc2l0aW9uLnRvcCl8fG51bGwsbC5hbmltYXRlfHx0aGlzLmVsZW1lbnQuY3NzKGUuZXh0ZW5kKG8se3RvcDpoLGxlZnQ6cn0pKSx1LmhlbHBlci5oZWlnaHQodS5zaXplLmhlaWdodCksdS5oZWxwZXIud2lkdGgodS5zaXplLndpZHRoKSx0aGlzLl9oZWxwZXImJiFsLmFuaW1hdGUmJnRoaXMuX3Byb3BvcnRpb25hbGx5UmVzaXplKCkpLGUoImJvZHkiKS5jc3MoImN1cnNvciIsImF1dG8iKSx0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXJlc2l6YWJsZS1yZXNpemluZyIpLHRoaXMuX3Byb3BhZ2F0ZSgic3RvcCIsdCksdGhpcy5faGVscGVyJiZ0aGlzLmhlbHBlci5yZW1vdmUoKSwhMX0sX3VwZGF0ZVByZXZQcm9wZXJ0aWVzOmZ1bmN0aW9uKCl7dGhpcy5wcmV2UG9zaXRpb249e3RvcDp0aGlzLnBvc2l0aW9uLnRvcCxsZWZ0OnRoaXMucG9zaXRpb24ubGVmdH0sdGhpcy5wcmV2U2l6ZT17d2lkdGg6dGhpcy5zaXplLndpZHRoLGhlaWdodDp0aGlzLnNpemUuaGVpZ2h0fX0sX2FwcGx5Q2hhbmdlczpmdW5jdGlvbigpe3ZhciBlPXt9O3JldHVybiB0aGlzLnBvc2l0aW9uLnRvcCE9PXRoaXMucHJldlBvc2l0aW9uLnRvcCYmKGUudG9wPXRoaXMucG9zaXRpb24udG9wKyJweCIpLHRoaXMucG9zaXRpb24ubGVmdCE9PXRoaXMucHJldlBvc2l0aW9uLmxlZnQmJihlLmxlZnQ9dGhpcy5wb3NpdGlvbi5sZWZ0KyJweCIpLHRoaXMuc2l6ZS53aWR0aCE9PXRoaXMucHJldlNpemUud2lkdGgmJihlLndpZHRoPXRoaXMuc2l6ZS53aWR0aCsicHgiKSx0aGlzLnNpemUuaGVpZ2h0IT09dGhpcy5wcmV2U2l6ZS5oZWlnaHQmJihlLmhlaWdodD10aGlzLnNpemUuaGVpZ2h0KyJweCIpLHRoaXMuaGVscGVyLmNzcyhlKSxlfSxfdXBkYXRlVmlydHVhbEJvdW5kYXJpZXM6ZnVuY3Rpb24oZSl7dmFyIHQsaSxzLG4sYSxvPXRoaXMub3B0aW9uczthPXttaW5XaWR0aDp0aGlzLl9pc051bWJlcihvLm1pbldpZHRoKT9vLm1pbldpZHRoOjAsbWF4V2lkdGg6dGhpcy5faXNOdW1iZXIoby5tYXhXaWR0aCk/by5tYXhXaWR0aDoxLzAsbWluSGVpZ2h0OnRoaXMuX2lzTnVtYmVyKG8ubWluSGVpZ2h0KT9vLm1pbkhlaWdodDowLG1heEhlaWdodDp0aGlzLl9pc051bWJlcihvLm1heEhlaWdodCk/by5tYXhIZWlnaHQ6MS8wfSwodGhpcy5fYXNwZWN0UmF0aW98fGUpJiYodD1hLm1pbkhlaWdodCp0aGlzLmFzcGVjdFJhdGlvLHM9YS5taW5XaWR0aC90aGlzLmFzcGVjdFJhdGlvLGk9YS5tYXhIZWlnaHQqdGhpcy5hc3BlY3RSYXRpbyxuPWEubWF4V2lkdGgvdGhpcy5hc3BlY3RSYXRpbyx0PmEubWluV2lkdGgmJihhLm1pbldpZHRoPXQpLHM+YS5taW5IZWlnaHQmJihhLm1pbkhlaWdodD1zKSxhLm1heFdpZHRoPmkmJihhLm1heFdpZHRoPWkpLGEubWF4SGVpZ2h0Pm4mJihhLm1heEhlaWdodD1uKSksdGhpcy5fdkJvdW5kYXJpZXM9YX0sX3VwZGF0ZUNhY2hlOmZ1bmN0aW9uKGUpe3RoaXMub2Zmc2V0PXRoaXMuaGVscGVyLm9mZnNldCgpLHRoaXMuX2lzTnVtYmVyKGUubGVmdCkmJih0aGlzLnBvc2l0aW9uLmxlZnQ9ZS5sZWZ0KSx0aGlzLl9pc051bWJlcihlLnRvcCkmJih0aGlzLnBvc2l0aW9uLnRvcD1lLnRvcCksdGhpcy5faXNOdW1iZXIoZS5oZWlnaHQpJiYodGhpcy5zaXplLmhlaWdodD1lLmhlaWdodCksdGhpcy5faXNOdW1iZXIoZS53aWR0aCkmJih0aGlzLnNpemUud2lkdGg9ZS53aWR0aCl9LF91cGRhdGVSYXRpbzpmdW5jdGlvbihlKXt2YXIgdD10aGlzLnBvc2l0aW9uLGk9dGhpcy5zaXplLHM9dGhpcy5heGlzO3JldHVybiB0aGlzLl9pc051bWJlcihlLmhlaWdodCk/ZS53aWR0aD1lLmhlaWdodCp0aGlzLmFzcGVjdFJhdGlvOnRoaXMuX2lzTnVtYmVyKGUud2lkdGgpJiYoZS5oZWlnaHQ9ZS53aWR0aC90aGlzLmFzcGVjdFJhdGlvKSwic3ciPT09cyYmKGUubGVmdD10LmxlZnQrKGkud2lkdGgtZS53aWR0aCksZS50b3A9bnVsbCksIm53Ij09PXMmJihlLnRvcD10LnRvcCsoaS5oZWlnaHQtZS5oZWlnaHQpLGUubGVmdD10LmxlZnQrKGkud2lkdGgtZS53aWR0aCkpLGV9LF9yZXNwZWN0U2l6ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl92Qm91bmRhcmllcyxpPXRoaXMuYXhpcyxzPXRoaXMuX2lzTnVtYmVyKGUud2lkdGgpJiZ0Lm1heFdpZHRoJiZ0Lm1heFdpZHRoPGUud2lkdGgsbj10aGlzLl9pc051bWJlcihlLmhlaWdodCkmJnQubWF4SGVpZ2h0JiZ0Lm1heEhlaWdodDxlLmhlaWdodCxhPXRoaXMuX2lzTnVtYmVyKGUud2lkdGgpJiZ0Lm1pbldpZHRoJiZ0Lm1pbldpZHRoPmUud2lkdGgsbz10aGlzLl9pc051bWJlcihlLmhlaWdodCkmJnQubWluSGVpZ2h0JiZ0Lm1pbkhlaWdodD5lLmhlaWdodCxyPXRoaXMub3JpZ2luYWxQb3NpdGlvbi5sZWZ0K3RoaXMub3JpZ2luYWxTaXplLndpZHRoLGg9dGhpcy5wb3NpdGlvbi50b3ArdGhpcy5zaXplLmhlaWdodCxsPS9zd3xud3x3Ly50ZXN0KGkpLHU9L253fG5lfG4vLnRlc3QoaSk7cmV0dXJuIGEmJihlLndpZHRoPXQubWluV2lkdGgpLG8mJihlLmhlaWdodD10Lm1pbkhlaWdodCkscyYmKGUud2lkdGg9dC5tYXhXaWR0aCksbiYmKGUuaGVpZ2h0PXQubWF4SGVpZ2h0KSxhJiZsJiYoZS5sZWZ0PXItdC5taW5XaWR0aCkscyYmbCYmKGUubGVmdD1yLXQubWF4V2lkdGgpLG8mJnUmJihlLnRvcD1oLXQubWluSGVpZ2h0KSxuJiZ1JiYoZS50b3A9aC10Lm1heEhlaWdodCksZS53aWR0aHx8ZS5oZWlnaHR8fGUubGVmdHx8IWUudG9wP2Uud2lkdGh8fGUuaGVpZ2h0fHxlLnRvcHx8IWUubGVmdHx8KGUubGVmdD1udWxsKTplLnRvcD1udWxsLGV9LF9nZXRQYWRkaW5nUGx1c0JvcmRlckRpbWVuc2lvbnM6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTAsaT1bXSxzPVtlLmNzcygiYm9yZGVyVG9wV2lkdGgiKSxlLmNzcygiYm9yZGVyUmlnaHRXaWR0aCIpLGUuY3NzKCJib3JkZXJCb3R0b21XaWR0aCIpLGUuY3NzKCJib3JkZXJMZWZ0V2lkdGgiKV0sbj1bZS5jc3MoInBhZGRpbmdUb3AiKSxlLmNzcygicGFkZGluZ1JpZ2h0IiksZS5jc3MoInBhZGRpbmdCb3R0b20iKSxlLmNzcygicGFkZGluZ0xlZnQiKV07ND50O3QrKylpW3RdPXBhcnNlSW50KHNbdF0sMTApfHwwLGlbdF0rPXBhcnNlSW50KG5bdF0sMTApfHwwO3JldHVybntoZWlnaHQ6aVswXStpWzJdLHdpZHRoOmlbMV0raVszXX19LF9wcm9wb3J0aW9uYWxseVJlc2l6ZTpmdW5jdGlvbigpe2lmKHRoaXMuX3Byb3BvcnRpb25hbGx5UmVzaXplRWxlbWVudHMubGVuZ3RoKWZvcih2YXIgZSx0PTAsaT10aGlzLmhlbHBlcnx8dGhpcy5lbGVtZW50O3RoaXMuX3Byb3BvcnRpb25hbGx5UmVzaXplRWxlbWVudHMubGVuZ3RoPnQ7dCsrKWU9dGhpcy5fcHJvcG9ydGlvbmFsbHlSZXNpemVFbGVtZW50c1t0XSx0aGlzLm91dGVyRGltZW5zaW9uc3x8KHRoaXMub3V0ZXJEaW1lbnNpb25zPXRoaXMuX2dldFBhZGRpbmdQbHVzQm9yZGVyRGltZW5zaW9ucyhlKSksZS5jc3Moe2hlaWdodDppLmhlaWdodCgpLXRoaXMub3V0ZXJEaW1lbnNpb25zLmhlaWdodHx8MCx3aWR0aDppLndpZHRoKCktdGhpcy5vdXRlckRpbWVuc2lvbnMud2lkdGh8fDB9KX0sX3JlbmRlclByb3h5OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5lbGVtZW50LGk9dGhpcy5vcHRpb25zO3RoaXMuZWxlbWVudE9mZnNldD10Lm9mZnNldCgpLHRoaXMuX2hlbHBlcj8odGhpcy5oZWxwZXI9dGhpcy5oZWxwZXJ8fGUoIjxkaXYgc3R5bGU9J292ZXJmbG93OmhpZGRlbjsnPjwvZGl2PiIpLHRoaXMuaGVscGVyLmFkZENsYXNzKHRoaXMuX2hlbHBlcikuY3NzKHt3aWR0aDp0aGlzLmVsZW1lbnQub3V0ZXJXaWR0aCgpLTEsaGVpZ2h0OnRoaXMuZWxlbWVudC5vdXRlckhlaWdodCgpLTEscG9zaXRpb246ImFic29sdXRlIixsZWZ0OnRoaXMuZWxlbWVudE9mZnNldC5sZWZ0KyJweCIsdG9wOnRoaXMuZWxlbWVudE9mZnNldC50b3ArInB4Iix6SW5kZXg6KytpLnpJbmRleH0pLHRoaXMuaGVscGVyLmFwcGVuZFRvKCJib2R5IikuZGlzYWJsZVNlbGVjdGlvbigpKTp0aGlzLmhlbHBlcj10aGlzLmVsZW1lbnR9LF9jaGFuZ2U6e2U6ZnVuY3Rpb24oZSx0KXtyZXR1cm57d2lkdGg6dGhpcy5vcmlnaW5hbFNpemUud2lkdGgrdH19LHc6ZnVuY3Rpb24oZSx0KXt2YXIgaT10aGlzLm9yaWdpbmFsU2l6ZSxzPXRoaXMub3JpZ2luYWxQb3NpdGlvbjtyZXR1cm57bGVmdDpzLmxlZnQrdCx3aWR0aDppLndpZHRoLXR9fSxuOmZ1bmN0aW9uKGUsdCxpKXt2YXIgcz10aGlzLm9yaWdpbmFsU2l6ZSxuPXRoaXMub3JpZ2luYWxQb3NpdGlvbjtyZXR1cm57dG9wOm4udG9wK2ksaGVpZ2h0OnMuaGVpZ2h0LWl9fSxzOmZ1bmN0aW9uKGUsdCxpKXtyZXR1cm57aGVpZ2h0OnRoaXMub3JpZ2luYWxTaXplLmhlaWdodCtpfX0sc2U6ZnVuY3Rpb24odCxpLHMpe3JldHVybiBlLmV4dGVuZCh0aGlzLl9jaGFuZ2Uucy5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5fY2hhbmdlLmUuYXBwbHkodGhpcyxbdCxpLHNdKSl9LHN3OmZ1bmN0aW9uKHQsaSxzKXtyZXR1cm4gZS5leHRlbmQodGhpcy5fY2hhbmdlLnMuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMuX2NoYW5nZS53LmFwcGx5KHRoaXMsW3QsaSxzXSkpfSxuZTpmdW5jdGlvbih0LGkscyl7cmV0dXJuIGUuZXh0ZW5kKHRoaXMuX2NoYW5nZS5uLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLl9jaGFuZ2UuZS5hcHBseSh0aGlzLFt0LGksc10pKX0sbnc6ZnVuY3Rpb24odCxpLHMpe3JldHVybiBlLmV4dGVuZCh0aGlzLl9jaGFuZ2Uubi5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5fY2hhbmdlLncuYXBwbHkodGhpcyxbdCxpLHNdKSl9fSxfcHJvcGFnYXRlOmZ1bmN0aW9uKHQsaSl7ZS51aS5wbHVnaW4uY2FsbCh0aGlzLHQsW2ksdGhpcy51aSgpXSksInJlc2l6ZSIhPT10JiZ0aGlzLl90cmlnZ2VyKHQsaSx0aGlzLnVpKCkpfSxwbHVnaW5zOnt9LHVpOmZ1bmN0aW9uKCl7cmV0dXJue29yaWdpbmFsRWxlbWVudDp0aGlzLm9yaWdpbmFsRWxlbWVudCxlbGVtZW50OnRoaXMuZWxlbWVudCxoZWxwZXI6dGhpcy5oZWxwZXIscG9zaXRpb246dGhpcy5wb3NpdGlvbixzaXplOnRoaXMuc2l6ZSxvcmlnaW5hbFNpemU6dGhpcy5vcmlnaW5hbFNpemUsb3JpZ2luYWxQb3NpdGlvbjp0aGlzLm9yaWdpbmFsUG9zaXRpb259fX0pLGUudWkucGx1Z2luLmFkZCgicmVzaXphYmxlIiwiYW5pbWF0ZSIse3N0b3A6ZnVuY3Rpb24odCl7dmFyIGk9ZSh0aGlzKS5yZXNpemFibGUoImluc3RhbmNlIikscz1pLm9wdGlvbnMsbj1pLl9wcm9wb3J0aW9uYWxseVJlc2l6ZUVsZW1lbnRzLGE9bi5sZW5ndGgmJi90ZXh0YXJlYS9pLnRlc3QoblswXS5ub2RlTmFtZSksbz1hJiZpLl9oYXNTY3JvbGwoblswXSwibGVmdCIpPzA6aS5zaXplRGlmZi5oZWlnaHQscj1hPzA6aS5zaXplRGlmZi53aWR0aCxoPXt3aWR0aDppLnNpemUud2lkdGgtcixoZWlnaHQ6aS5zaXplLmhlaWdodC1vfSxsPXBhcnNlSW50KGkuZWxlbWVudC5jc3MoImxlZnQiKSwxMCkrKGkucG9zaXRpb24ubGVmdC1pLm9yaWdpbmFsUG9zaXRpb24ubGVmdCl8fG51bGwsdT1wYXJzZUludChpLmVsZW1lbnQuY3NzKCJ0b3AiKSwxMCkrKGkucG9zaXRpb24udG9wLWkub3JpZ2luYWxQb3NpdGlvbi50b3ApfHxudWxsO2kuZWxlbWVudC5hbmltYXRlKGUuZXh0ZW5kKGgsdSYmbD97dG9wOnUsbGVmdDpsfTp7fSkse2R1cmF0aW9uOnMuYW5pbWF0ZUR1cmF0aW9uLGVhc2luZzpzLmFuaW1hdGVFYXNpbmcsc3RlcDpmdW5jdGlvbigpe3ZhciBzPXt3aWR0aDpwYXJzZUludChpLmVsZW1lbnQuY3NzKCJ3aWR0aCIpLDEwKSxoZWlnaHQ6cGFyc2VJbnQoaS5lbGVtZW50LmNzcygiaGVpZ2h0IiksMTApLHRvcDpwYXJzZUludChpLmVsZW1lbnQuY3NzKCJ0b3AiKSwxMCksbGVmdDpwYXJzZUludChpLmVsZW1lbnQuY3NzKCJsZWZ0IiksMTApfTtuJiZuLmxlbmd0aCYmZShuWzBdKS5jc3Moe3dpZHRoOnMud2lkdGgsaGVpZ2h0OnMuaGVpZ2h0fSksaS5fdXBkYXRlQ2FjaGUocyksaS5fcHJvcGFnYXRlKCJyZXNpemUiLHQpfX0pfX0pLGUudWkucGx1Z2luLmFkZCgicmVzaXphYmxlIiwiY29udGFpbm1lbnQiLHtzdGFydDpmdW5jdGlvbigpe3ZhciB0LGkscyxuLGEsbyxyLGg9ZSh0aGlzKS5yZXNpemFibGUoImluc3RhbmNlIiksbD1oLm9wdGlvbnMsdT1oLmVsZW1lbnQsZD1sLmNvbnRhaW5tZW50LGM9ZCBpbnN0YW5jZW9mIGU/ZC5nZXQoMCk6L3BhcmVudC8udGVzdChkKT91LnBhcmVudCgpLmdldCgwKTpkO2MmJihoLmNvbnRhaW5lckVsZW1lbnQ9ZShjKSwvZG9jdW1lbnQvLnRlc3QoZCl8fGQ9PT1kb2N1bWVudD8oaC5jb250YWluZXJPZmZzZXQ9e2xlZnQ6MCx0b3A6MH0saC5jb250YWluZXJQb3NpdGlvbj17bGVmdDowLHRvcDowfSxoLnBhcmVudERhdGE9e2VsZW1lbnQ6ZShkb2N1bWVudCksbGVmdDowLHRvcDowLHdpZHRoOmUoZG9jdW1lbnQpLndpZHRoKCksaGVpZ2h0OmUoZG9jdW1lbnQpLmhlaWdodCgpfHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGUuc2Nyb2xsSGVpZ2h0fSk6KHQ9ZShjKSxpPVtdLGUoWyJUb3AiLCJSaWdodCIsIkxlZnQiLCJCb3R0b20iXSkuZWFjaChmdW5jdGlvbihlLHMpe2lbZV09aC5fbnVtKHQuY3NzKCJwYWRkaW5nIitzKSl9KSxoLmNvbnRhaW5lck9mZnNldD10Lm9mZnNldCgpLGguY29udGFpbmVyUG9zaXRpb249dC5wb3NpdGlvbigpLGguY29udGFpbmVyU2l6ZT17aGVpZ2h0OnQuaW5uZXJIZWlnaHQoKS1pWzNdLHdpZHRoOnQuaW5uZXJXaWR0aCgpLWlbMV19LHM9aC5jb250YWluZXJPZmZzZXQsbj1oLmNvbnRhaW5lclNpemUuaGVpZ2h0LGE9aC5jb250YWluZXJTaXplLndpZHRoLG89aC5faGFzU2Nyb2xsKGMsImxlZnQiKT9jLnNjcm9sbFdpZHRoOmEscj1oLl9oYXNTY3JvbGwoYyk/Yy5zY3JvbGxIZWlnaHQ6bixoLnBhcmVudERhdGE9e2VsZW1lbnQ6YyxsZWZ0OnMubGVmdCx0b3A6cy50b3Asd2lkdGg6byxoZWlnaHQ6cn0pKX0scmVzaXplOmZ1bmN0aW9uKHQpe3ZhciBpLHMsbixhLG89ZSh0aGlzKS5yZXNpemFibGUoImluc3RhbmNlIikscj1vLm9wdGlvbnMsaD1vLmNvbnRhaW5lck9mZnNldCxsPW8ucG9zaXRpb24sdT1vLl9hc3BlY3RSYXRpb3x8dC5zaGlmdEtleSxkPXt0b3A6MCxsZWZ0OjB9LGM9by5jb250YWluZXJFbGVtZW50LHA9ITA7Y1swXSE9PWRvY3VtZW50JiYvc3RhdGljLy50ZXN0KGMuY3NzKCJwb3NpdGlvbiIpKSYmKGQ9aCksbC5sZWZ0PChvLl9oZWxwZXI/aC5sZWZ0OjApJiYoby5zaXplLndpZHRoPW8uc2l6ZS53aWR0aCsoby5faGVscGVyP28ucG9zaXRpb24ubGVmdC1oLmxlZnQ6by5wb3NpdGlvbi5sZWZ0LWQubGVmdCksdSYmKG8uc2l6ZS5oZWlnaHQ9by5zaXplLndpZHRoL28uYXNwZWN0UmF0aW8scD0hMSksby5wb3NpdGlvbi5sZWZ0PXIuaGVscGVyP2gubGVmdDowKSxsLnRvcDwoby5faGVscGVyP2gudG9wOjApJiYoby5zaXplLmhlaWdodD1vLnNpemUuaGVpZ2h0KyhvLl9oZWxwZXI/by5wb3NpdGlvbi50b3AtaC50b3A6by5wb3NpdGlvbi50b3ApLHUmJihvLnNpemUud2lkdGg9by5zaXplLmhlaWdodCpvLmFzcGVjdFJhdGlvLHA9ITEpLG8ucG9zaXRpb24udG9wPW8uX2hlbHBlcj9oLnRvcDowKSxuPW8uY29udGFpbmVyRWxlbWVudC5nZXQoMCk9PT1vLmVsZW1lbnQucGFyZW50KCkuZ2V0KDApLGE9L3JlbGF0aXZlfGFic29sdXRlLy50ZXN0KG8uY29udGFpbmVyRWxlbWVudC5jc3MoInBvc2l0aW9uIikpLG4mJmE/KG8ub2Zmc2V0LmxlZnQ9by5wYXJlbnREYXRhLmxlZnQrby5wb3NpdGlvbi5sZWZ0LG8ub2Zmc2V0LnRvcD1vLnBhcmVudERhdGEudG9wK28ucG9zaXRpb24udG9wKTooby5vZmZzZXQubGVmdD1vLmVsZW1lbnQub2Zmc2V0KCkubGVmdCxvLm9mZnNldC50b3A9by5lbGVtZW50Lm9mZnNldCgpLnRvcCksaT1NYXRoLmFicyhvLnNpemVEaWZmLndpZHRoKyhvLl9oZWxwZXI/by5vZmZzZXQubGVmdC1kLmxlZnQ6by5vZmZzZXQubGVmdC1oLmxlZnQpKSxzPU1hdGguYWJzKG8uc2l6ZURpZmYuaGVpZ2h0KyhvLl9oZWxwZXI/by5vZmZzZXQudG9wLWQudG9wOm8ub2Zmc2V0LnRvcC1oLnRvcCkpLGkrby5zaXplLndpZHRoPj1vLnBhcmVudERhdGEud2lkdGgmJihvLnNpemUud2lkdGg9by5wYXJlbnREYXRhLndpZHRoLWksdSYmKG8uc2l6ZS5oZWlnaHQ9by5zaXplLndpZHRoL28uYXNwZWN0UmF0aW8scD0hMSkpLHMrby5zaXplLmhlaWdodD49by5wYXJlbnREYXRhLmhlaWdodCYmKG8uc2l6ZS5oZWlnaHQ9by5wYXJlbnREYXRhLmhlaWdodC1zLHUmJihvLnNpemUud2lkdGg9by5zaXplLmhlaWdodCpvLmFzcGVjdFJhdGlvLHA9ITEpKSxwfHwoby5wb3NpdGlvbi5sZWZ0PW8ucHJldlBvc2l0aW9uLmxlZnQsby5wb3NpdGlvbi50b3A9by5wcmV2UG9zaXRpb24udG9wLG8uc2l6ZS53aWR0aD1vLnByZXZTaXplLndpZHRoLG8uc2l6ZS5oZWlnaHQ9by5wcmV2U2l6ZS5oZWlnaHQpfSxzdG9wOmZ1bmN0aW9uKCl7dmFyIHQ9ZSh0aGlzKS5yZXNpemFibGUoImluc3RhbmNlIiksaT10Lm9wdGlvbnMscz10LmNvbnRhaW5lck9mZnNldCxuPXQuY29udGFpbmVyUG9zaXRpb24sYT10LmNvbnRhaW5lckVsZW1lbnQsbz1lKHQuaGVscGVyKSxyPW8ub2Zmc2V0KCksaD1vLm91dGVyV2lkdGgoKS10LnNpemVEaWZmLndpZHRoLGw9by5vdXRlckhlaWdodCgpLXQuc2l6ZURpZmYuaGVpZ2h0O3QuX2hlbHBlciYmIWkuYW5pbWF0ZSYmL3JlbGF0aXZlLy50ZXN0KGEuY3NzKCJwb3NpdGlvbiIpKSYmZSh0aGlzKS5jc3Moe2xlZnQ6ci5sZWZ0LW4ubGVmdC1zLmxlZnQsd2lkdGg6aCxoZWlnaHQ6bH0pLHQuX2hlbHBlciYmIWkuYW5pbWF0ZSYmL3N0YXRpYy8udGVzdChhLmNzcygicG9zaXRpb24iKSkmJmUodGhpcykuY3NzKHtsZWZ0OnIubGVmdC1uLmxlZnQtcy5sZWZ0LHdpZHRoOmgsaGVpZ2h0Omx9KX19KSxlLnVpLnBsdWdpbi5hZGQoInJlc2l6YWJsZSIsImFsc29SZXNpemUiLHtzdGFydDpmdW5jdGlvbigpe3ZhciB0PWUodGhpcykucmVzaXphYmxlKCJpbnN0YW5jZSIpLGk9dC5vcHRpb25zO2UoaS5hbHNvUmVzaXplKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9ZSh0aGlzKTt0LmRhdGEoInVpLXJlc2l6YWJsZS1hbHNvcmVzaXplIix7d2lkdGg6cGFyc2VJbnQodC53aWR0aCgpLDEwKSxoZWlnaHQ6cGFyc2VJbnQodC5oZWlnaHQoKSwxMCksbGVmdDpwYXJzZUludCh0LmNzcygibGVmdCIpLDEwKSx0b3A6cGFyc2VJbnQodC5jc3MoInRvcCIpLDEwKX0pfSl9LHJlc2l6ZTpmdW5jdGlvbih0LGkpe3ZhciBzPWUodGhpcykucmVzaXphYmxlKCJpbnN0YW5jZSIpLG49cy5vcHRpb25zLGE9cy5vcmlnaW5hbFNpemUsbz1zLm9yaWdpbmFsUG9zaXRpb24scj17aGVpZ2h0OnMuc2l6ZS5oZWlnaHQtYS5oZWlnaHR8fDAsd2lkdGg6cy5zaXplLndpZHRoLWEud2lkdGh8fDAsdG9wOnMucG9zaXRpb24udG9wLW8udG9wfHwwLGxlZnQ6cy5wb3NpdGlvbi5sZWZ0LW8ubGVmdHx8MH07ZShuLmFsc29SZXNpemUpLmVhY2goZnVuY3Rpb24oKXt2YXIgdD1lKHRoaXMpLHM9ZSh0aGlzKS5kYXRhKCJ1aS1yZXNpemFibGUtYWxzb3Jlc2l6ZSIpLG49e30sYT10LnBhcmVudHMoaS5vcmlnaW5hbEVsZW1lbnRbMF0pLmxlbmd0aD9bIndpZHRoIiwiaGVpZ2h0Il06WyJ3aWR0aCIsImhlaWdodCIsInRvcCIsImxlZnQiXTtlLmVhY2goYSxmdW5jdGlvbihlLHQpe3ZhciBpPShzW3RdfHwwKSsoclt0XXx8MCk7aSYmaT49MCYmKG5bdF09aXx8bnVsbCl9KSx0LmNzcyhuKX0pfSxzdG9wOmZ1bmN0aW9uKCl7ZSh0aGlzKS5yZW1vdmVEYXRhKCJyZXNpemFibGUtYWxzb3Jlc2l6ZSIpfX0pLGUudWkucGx1Z2luLmFkZCgicmVzaXphYmxlIiwiZ2hvc3QiLHtzdGFydDpmdW5jdGlvbigpe3ZhciB0PWUodGhpcykucmVzaXphYmxlKCJpbnN0YW5jZSIpLGk9dC5vcHRpb25zLHM9dC5zaXplO3QuZ2hvc3Q9dC5vcmlnaW5hbEVsZW1lbnQuY2xvbmUoKSx0Lmdob3N0LmNzcyh7b3BhY2l0eTouMjUsZGlzcGxheToiYmxvY2siLHBvc2l0aW9uOiJyZWxhdGl2ZSIsaGVpZ2h0OnMuaGVpZ2h0LHdpZHRoOnMud2lkdGgsbWFyZ2luOjAsbGVmdDowLHRvcDowfSkuYWRkQ2xhc3MoInVpLXJlc2l6YWJsZS1naG9zdCIpLmFkZENsYXNzKCJzdHJpbmciPT10eXBlb2YgaS5naG9zdD9pLmdob3N0OiIiKSx0Lmdob3N0LmFwcGVuZFRvKHQuaGVscGVyKX0scmVzaXplOmZ1bmN0aW9uKCl7dmFyIHQ9ZSh0aGlzKS5yZXNpemFibGUoImluc3RhbmNlIik7dC5naG9zdCYmdC5naG9zdC5jc3Moe3Bvc2l0aW9uOiJyZWxhdGl2ZSIsaGVpZ2h0OnQuc2l6ZS5oZWlnaHQsd2lkdGg6dC5zaXplLndpZHRofSl9LHN0b3A6ZnVuY3Rpb24oKXt2YXIgdD1lKHRoaXMpLnJlc2l6YWJsZSgiaW5zdGFuY2UiKTt0Lmdob3N0JiZ0LmhlbHBlciYmdC5oZWxwZXIuZ2V0KDApLnJlbW92ZUNoaWxkKHQuZ2hvc3QuZ2V0KDApKX19KSxlLnVpLnBsdWdpbi5hZGQoInJlc2l6YWJsZSIsImdyaWQiLHtyZXNpemU6ZnVuY3Rpb24oKXt2YXIgdCxpPWUodGhpcykucmVzaXphYmxlKCJpbnN0YW5jZSIpLHM9aS5vcHRpb25zLG49aS5zaXplLGE9aS5vcmlnaW5hbFNpemUsbz1pLm9yaWdpbmFsUG9zaXRpb24scj1pLmF4aXMsaD0ibnVtYmVyIj09dHlwZW9mIHMuZ3JpZD9bcy5ncmlkLHMuZ3JpZF06cy5ncmlkLGw9aFswXXx8MSx1PWhbMV18fDEsZD1NYXRoLnJvdW5kKChuLndpZHRoLWEud2lkdGgpL2wpKmwsYz1NYXRoLnJvdW5kKChuLmhlaWdodC1hLmhlaWdodCkvdSkqdSxwPWEud2lkdGgrZCxmPWEuaGVpZ2h0K2MsbT1zLm1heFdpZHRoJiZwPnMubWF4V2lkdGgsZz1zLm1heEhlaWdodCYmZj5zLm1heEhlaWdodCx2PXMubWluV2lkdGgmJnMubWluV2lkdGg+cCx5PXMubWluSGVpZ2h0JiZzLm1pbkhlaWdodD5mO3MuZ3JpZD1oLHYmJihwKz1sKSx5JiYoZis9dSksbSYmKHAtPWwpLGcmJihmLT11KSwvXihzZXxzfGUpJC8udGVzdChyKT8oaS5zaXplLndpZHRoPXAsaS5zaXplLmhlaWdodD1mKTovXihuZSkkLy50ZXN0KHIpPyhpLnNpemUud2lkdGg9cCxpLnNpemUuaGVpZ2h0PWYsaS5wb3NpdGlvbi50b3A9by50b3AtYyk6L14oc3cpJC8udGVzdChyKT8oaS5zaXplLndpZHRoPXAsaS5zaXplLmhlaWdodD1mLGkucG9zaXRpb24ubGVmdD1vLmxlZnQtZCk6KCgwPj1mLXV8fDA+PXAtbCkmJih0PWkuX2dldFBhZGRpbmdQbHVzQm9yZGVyRGltZW5zaW9ucyh0aGlzKSksZi11PjA/KGkuc2l6ZS5oZWlnaHQ9ZixpLnBvc2l0aW9uLnRvcD1vLnRvcC1jKTooZj11LXQuaGVpZ2h0LGkuc2l6ZS5oZWlnaHQ9ZixpLnBvc2l0aW9uLnRvcD1vLnRvcCthLmhlaWdodC1mKSxwLWw+MD8oaS5zaXplLndpZHRoPXAsaS5wb3NpdGlvbi5sZWZ0PW8ubGVmdC1kKToocD1sLXQud2lkdGgsaS5zaXplLndpZHRoPXAsaS5wb3NpdGlvbi5sZWZ0PW8ubGVmdCthLndpZHRoLXApKX19KSxlLnVpLnJlc2l6YWJsZSxlLndpZGdldCgidWkuZGlhbG9nIix7dmVyc2lvbjoiMS4xMS40IixvcHRpb25zOnthcHBlbmRUbzoiYm9keSIsYXV0b09wZW46ITAsYnV0dG9uczpbXSxjbG9zZU9uRXNjYXBlOiEwLGNsb3NlVGV4dDoiQ2xvc2UiLGRpYWxvZ0NsYXNzOiIiLGRyYWdnYWJsZTohMCxoaWRlOm51bGwsaGVpZ2h0OiJhdXRvIixtYXhIZWlnaHQ6bnVsbCxtYXhXaWR0aDpudWxsLG1pbkhlaWdodDoxNTAsbWluV2lkdGg6MTUwLG1vZGFsOiExLHBvc2l0aW9uOntteToiY2VudGVyIixhdDoiY2VudGVyIixvZjp3aW5kb3csY29sbGlzaW9uOiJmaXQiLHVzaW5nOmZ1bmN0aW9uKHQpe3ZhciBpPWUodGhpcykuY3NzKHQpLm9mZnNldCgpLnRvcDswPmkmJmUodGhpcykuY3NzKCJ0b3AiLHQudG9wLWkpfX0scmVzaXphYmxlOiEwLHNob3c6bnVsbCx0aXRsZTpudWxsLHdpZHRoOjMwMCxiZWZvcmVDbG9zZTpudWxsLGNsb3NlOm51bGwsZHJhZzpudWxsLGRyYWdTdGFydDpudWxsLGRyYWdTdG9wOm51bGwsZm9jdXM6bnVsbCxvcGVuOm51bGwscmVzaXplOm51bGwscmVzaXplU3RhcnQ6bnVsbCxyZXNpemVTdG9wOm51bGx9LHNpemVSZWxhdGVkT3B0aW9uczp7YnV0dG9uczohMCxoZWlnaHQ6ITAsbWF4SGVpZ2h0OiEwLG1heFdpZHRoOiEwLG1pbkhlaWdodDohMCxtaW5XaWR0aDohMCx3aWR0aDohMH0scmVzaXphYmxlUmVsYXRlZE9wdGlvbnM6e21heEhlaWdodDohMCxtYXhXaWR0aDohMCxtaW5IZWlnaHQ6ITAsbWluV2lkdGg6ITB9LF9jcmVhdGU6ZnVuY3Rpb24oKXt0aGlzLm9yaWdpbmFsQ3NzPXtkaXNwbGF5OnRoaXMuZWxlbWVudFswXS5zdHlsZS5kaXNwbGF5LHdpZHRoOnRoaXMuZWxlbWVudFswXS5zdHlsZS53aWR0aCxtaW5IZWlnaHQ6dGhpcy5lbGVtZW50WzBdLnN0eWxlLm1pbkhlaWdodCxtYXhIZWlnaHQ6dGhpcy5lbGVtZW50WzBdLnN0eWxlLm1heEhlaWdodCxoZWlnaHQ6dGhpcy5lbGVtZW50WzBdLnN0eWxlLmhlaWdodH0sdGhpcy5vcmlnaW5hbFBvc2l0aW9uPXtwYXJlbnQ6dGhpcy5lbGVtZW50LnBhcmVudCgpLGluZGV4OnRoaXMuZWxlbWVudC5wYXJlbnQoKS5jaGlsZHJlbigpLmluZGV4KHRoaXMuZWxlbWVudCl9LHRoaXMub3JpZ2luYWxUaXRsZT10aGlzLmVsZW1lbnQuYXR0cigidGl0bGUiKSx0aGlzLm9wdGlvbnMudGl0bGU9dGhpcy5vcHRpb25zLnRpdGxlfHx0aGlzLm9yaWdpbmFsVGl0bGUsdGhpcy5fY3JlYXRlV3JhcHBlcigpLHRoaXMuZWxlbWVudC5zaG93KCkucmVtb3ZlQXR0cigidGl0bGUiKS5hZGRDbGFzcygidWktZGlhbG9nLWNvbnRlbnQgdWktd2lkZ2V0LWNvbnRlbnQiKS5hcHBlbmRUbyh0aGlzLnVpRGlhbG9nKSx0aGlzLl9jcmVhdGVUaXRsZWJhcigpLHRoaXMuX2NyZWF0ZUJ1dHRvblBhbmUoKSx0aGlzLm9wdGlvbnMuZHJhZ2dhYmxlJiZlLmZuLmRyYWdnYWJsZSYmdGhpcy5fbWFrZURyYWdnYWJsZSgpLHRoaXMub3B0aW9ucy5yZXNpemFibGUmJmUuZm4ucmVzaXphYmxlJiZ0aGlzLl9tYWtlUmVzaXphYmxlKCksdGhpcy5faXNPcGVuPSExLHRoaXMuX3RyYWNrRm9jdXMoKX0sX2luaXQ6ZnVuY3Rpb24oKXt0aGlzLm9wdGlvbnMuYXV0b09wZW4mJnRoaXMub3BlbigpfSxfYXBwZW5kVG86ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wdGlvbnMuYXBwZW5kVG87cmV0dXJuIHQmJih0LmpxdWVyeXx8dC5ub2RlVHlwZSk/ZSh0KTp0aGlzLmRvY3VtZW50LmZpbmQodHx8ImJvZHkiKS5lcSgwKX0sX2Rlc3Ryb3k6ZnVuY3Rpb24oKXt2YXIgZSx0PXRoaXMub3JpZ2luYWxQb3NpdGlvbjt0aGlzLl91bnRyYWNrSW5zdGFuY2UoKSx0aGlzLl9kZXN0cm95T3ZlcmxheSgpLHRoaXMuZWxlbWVudC5yZW1vdmVVbmlxdWVJZCgpLnJlbW92ZUNsYXNzKCJ1aS1kaWFsb2ctY29udGVudCB1aS13aWRnZXQtY29udGVudCIpLmNzcyh0aGlzLm9yaWdpbmFsQ3NzKS5kZXRhY2goKSx0aGlzLnVpRGlhbG9nLnN0b3AoITAsITApLnJlbW92ZSgpLHRoaXMub3JpZ2luYWxUaXRsZSYmdGhpcy5lbGVtZW50LmF0dHIoInRpdGxlIix0aGlzLm9yaWdpbmFsVGl0bGUpLGU9dC5wYXJlbnQuY2hpbGRyZW4oKS5lcSh0LmluZGV4KSxlLmxlbmd0aCYmZVswXSE9PXRoaXMuZWxlbWVudFswXT9lLmJlZm9yZSh0aGlzLmVsZW1lbnQpOnQucGFyZW50LmFwcGVuZCh0aGlzLmVsZW1lbnQpfSx3aWRnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51aURpYWxvZ30sZGlzYWJsZTplLm5vb3AsZW5hYmxlOmUubm9vcCxjbG9zZTpmdW5jdGlvbih0KXt2YXIgaSxzPXRoaXM7aWYodGhpcy5faXNPcGVuJiZ0aGlzLl90cmlnZ2VyKCJiZWZvcmVDbG9zZSIsdCkhPT0hMSl7aWYodGhpcy5faXNPcGVuPSExLHRoaXMuX2ZvY3VzZWRFbGVtZW50PW51bGwsdGhpcy5fZGVzdHJveU92ZXJsYXkoKSx0aGlzLl91bnRyYWNrSW5zdGFuY2UoKSwhdGhpcy5vcGVuZXIuZmlsdGVyKCI6Zm9jdXNhYmxlIikuZm9jdXMoKS5sZW5ndGgpdHJ5e2k9dGhpcy5kb2N1bWVudFswXS5hY3RpdmVFbGVtZW50LGkmJiJib2R5IiE9PWkubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYmZShpKS5ibHVyKCl9Y2F0Y2gobil7fXRoaXMuX2hpZGUodGhpcy51aURpYWxvZyx0aGlzLm9wdGlvbnMuaGlkZSxmdW5jdGlvbigpe3MuX3RyaWdnZXIoImNsb3NlIix0KX0pfX0saXNPcGVuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzT3Blbn0sbW92ZVRvVG9wOmZ1bmN0aW9uKCl7dGhpcy5fbW92ZVRvVG9wKCl9LF9tb3ZlVG9Ub3A6ZnVuY3Rpb24odCxpKXt2YXIgcz0hMSxuPXRoaXMudWlEaWFsb2cuc2libGluZ3MoIi51aS1mcm9udDp2aXNpYmxlIikubWFwKGZ1bmN0aW9uKCl7cmV0dXJuK2UodGhpcykuY3NzKCJ6LWluZGV4Iil9KS5nZXQoKSxhPU1hdGgubWF4LmFwcGx5KG51bGwsbik7cmV0dXJuIGE+PSt0aGlzLnVpRGlhbG9nLmNzcygiei1pbmRleCIpJiYodGhpcy51aURpYWxvZy5jc3MoInotaW5kZXgiLGErMSkscz0hMCkscyYmIWkmJnRoaXMuX3RyaWdnZXIoImZvY3VzIix0KSxzfSxvcGVuOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztyZXR1cm4gdGhpcy5faXNPcGVuPyh0aGlzLl9tb3ZlVG9Ub3AoKSYmdGhpcy5fZm9jdXNUYWJiYWJsZSgpLHZvaWQgMCk6KHRoaXMuX2lzT3Blbj0hMCx0aGlzLm9wZW5lcj1lKHRoaXMuZG9jdW1lbnRbMF0uYWN0aXZlRWxlbWVudCksdGhpcy5fc2l6ZSgpLHRoaXMuX3Bvc2l0aW9uKCksdGhpcy5fY3JlYXRlT3ZlcmxheSgpLHRoaXMuX21vdmVUb1RvcChudWxsLCEwKSx0aGlzLm92ZXJsYXkmJnRoaXMub3ZlcmxheS5jc3MoInotaW5kZXgiLHRoaXMudWlEaWFsb2cuY3NzKCJ6LWluZGV4IiktMSksdGhpcy5fc2hvdyh0aGlzLnVpRGlhbG9nLHRoaXMub3B0aW9ucy5zaG93LGZ1bmN0aW9uKCl7dC5fZm9jdXNUYWJiYWJsZSgpLHQuX3RyaWdnZXIoImZvY3VzIil9KSx0aGlzLl9tYWtlRm9jdXNUYXJnZXQoKSx0aGlzLl90cmlnZ2VyKCJvcGVuIiksdm9pZCAwKX0sX2ZvY3VzVGFiYmFibGU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9mb2N1c2VkRWxlbWVudDtlfHwoZT10aGlzLmVsZW1lbnQuZmluZCgiW2F1dG9mb2N1c10iKSksZS5sZW5ndGh8fChlPXRoaXMuZWxlbWVudC5maW5kKCI6dGFiYmFibGUiKSksZS5sZW5ndGh8fChlPXRoaXMudWlEaWFsb2dCdXR0b25QYW5lLmZpbmQoIjp0YWJiYWJsZSIpKSxlLmxlbmd0aHx8KGU9dGhpcy51aURpYWxvZ1RpdGxlYmFyQ2xvc2UuZmlsdGVyKCI6dGFiYmFibGUiKSksZS5sZW5ndGh8fChlPXRoaXMudWlEaWFsb2cpLGUuZXEoMCkuZm9jdXMoKX0sX2tlZXBGb2N1czpmdW5jdGlvbih0KXtmdW5jdGlvbiBpKCl7dmFyIHQ9dGhpcy5kb2N1bWVudFswXS5hY3RpdmVFbGVtZW50LGk9dGhpcy51aURpYWxvZ1swXT09PXR8fGUuY29udGFpbnModGhpcy51aURpYWxvZ1swXSx0KTtpfHx0aGlzLl9mb2N1c1RhYmJhYmxlKCl9dC5wcmV2ZW50RGVmYXVsdCgpLGkuY2FsbCh0aGlzKSx0aGlzLl9kZWxheShpKX0sX2NyZWF0ZVdyYXBwZXI6ZnVuY3Rpb24oKXt0aGlzLnVpRGlhbG9nPWUoIjxkaXY+IikuYWRkQ2xhc3MoInVpLWRpYWxvZyB1aS13aWRnZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWFsbCB1aS1mcm9udCAiK3RoaXMub3B0aW9ucy5kaWFsb2dDbGFzcykuaGlkZSgpLmF0dHIoe3RhYkluZGV4Oi0xLHJvbGU6ImRpYWxvZyJ9KS5hcHBlbmRUbyh0aGlzLl9hcHBlbmRUbygpKSx0aGlzLl9vbih0aGlzLnVpRGlhbG9nLHtrZXlkb3duOmZ1bmN0aW9uKHQpe2lmKHRoaXMub3B0aW9ucy5jbG9zZU9uRXNjYXBlJiYhdC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSYmdC5rZXlDb2RlJiZ0LmtleUNvZGU9PT1lLnVpLmtleUNvZGUuRVNDQVBFKXJldHVybiB0LnByZXZlbnREZWZhdWx0KCksdGhpcy5jbG9zZSh0KSx2b2lkIDA7CmlmKHQua2V5Q29kZT09PWUudWkua2V5Q29kZS5UQUImJiF0LmlzRGVmYXVsdFByZXZlbnRlZCgpKXt2YXIgaT10aGlzLnVpRGlhbG9nLmZpbmQoIjp0YWJiYWJsZSIpLHM9aS5maWx0ZXIoIjpmaXJzdCIpLG49aS5maWx0ZXIoIjpsYXN0Iik7dC50YXJnZXQhPT1uWzBdJiZ0LnRhcmdldCE9PXRoaXMudWlEaWFsb2dbMF18fHQuc2hpZnRLZXk/dC50YXJnZXQhPT1zWzBdJiZ0LnRhcmdldCE9PXRoaXMudWlEaWFsb2dbMF18fCF0LnNoaWZ0S2V5fHwodGhpcy5fZGVsYXkoZnVuY3Rpb24oKXtuLmZvY3VzKCl9KSx0LnByZXZlbnREZWZhdWx0KCkpOih0aGlzLl9kZWxheShmdW5jdGlvbigpe3MuZm9jdXMoKX0pLHQucHJldmVudERlZmF1bHQoKSl9fSxtb3VzZWRvd246ZnVuY3Rpb24oZSl7dGhpcy5fbW92ZVRvVG9wKGUpJiZ0aGlzLl9mb2N1c1RhYmJhYmxlKCl9fSksdGhpcy5lbGVtZW50LmZpbmQoIlthcmlhLWRlc2NyaWJlZGJ5XSIpLmxlbmd0aHx8dGhpcy51aURpYWxvZy5hdHRyKHsiYXJpYS1kZXNjcmliZWRieSI6dGhpcy5lbGVtZW50LnVuaXF1ZUlkKCkuYXR0cigiaWQiKX0pfSxfY3JlYXRlVGl0bGViYXI6ZnVuY3Rpb24oKXt2YXIgdDt0aGlzLnVpRGlhbG9nVGl0bGViYXI9ZSgiPGRpdj4iKS5hZGRDbGFzcygidWktZGlhbG9nLXRpdGxlYmFyIHVpLXdpZGdldC1oZWFkZXIgdWktY29ybmVyLWFsbCB1aS1oZWxwZXItY2xlYXJmaXgiKS5wcmVwZW5kVG8odGhpcy51aURpYWxvZyksdGhpcy5fb24odGhpcy51aURpYWxvZ1RpdGxlYmFyLHttb3VzZWRvd246ZnVuY3Rpb24odCl7ZSh0LnRhcmdldCkuY2xvc2VzdCgiLnVpLWRpYWxvZy10aXRsZWJhci1jbG9zZSIpfHx0aGlzLnVpRGlhbG9nLmZvY3VzKCl9fSksdGhpcy51aURpYWxvZ1RpdGxlYmFyQ2xvc2U9ZSgiPGJ1dHRvbiB0eXBlPSdidXR0b24nPjwvYnV0dG9uPiIpLmJ1dHRvbih7bGFiZWw6dGhpcy5vcHRpb25zLmNsb3NlVGV4dCxpY29uczp7cHJpbWFyeToidWktaWNvbi1jbG9zZXRoaWNrIn0sdGV4dDohMX0pLmFkZENsYXNzKCJ1aS1kaWFsb2ctdGl0bGViYXItY2xvc2UiKS5hcHBlbmRUbyh0aGlzLnVpRGlhbG9nVGl0bGViYXIpLHRoaXMuX29uKHRoaXMudWlEaWFsb2dUaXRsZWJhckNsb3NlLHtjbGljazpmdW5jdGlvbihlKXtlLnByZXZlbnREZWZhdWx0KCksdGhpcy5jbG9zZShlKX19KSx0PWUoIjxzcGFuPiIpLnVuaXF1ZUlkKCkuYWRkQ2xhc3MoInVpLWRpYWxvZy10aXRsZSIpLnByZXBlbmRUbyh0aGlzLnVpRGlhbG9nVGl0bGViYXIpLHRoaXMuX3RpdGxlKHQpLHRoaXMudWlEaWFsb2cuYXR0cih7ImFyaWEtbGFiZWxsZWRieSI6dC5hdHRyKCJpZCIpfSl9LF90aXRsZTpmdW5jdGlvbihlKXt0aGlzLm9wdGlvbnMudGl0bGV8fGUuaHRtbCgiJiMxNjA7IiksZS50ZXh0KHRoaXMub3B0aW9ucy50aXRsZSl9LF9jcmVhdGVCdXR0b25QYW5lOmZ1bmN0aW9uKCl7dGhpcy51aURpYWxvZ0J1dHRvblBhbmU9ZSgiPGRpdj4iKS5hZGRDbGFzcygidWktZGlhbG9nLWJ1dHRvbnBhbmUgdWktd2lkZ2V0LWNvbnRlbnQgdWktaGVscGVyLWNsZWFyZml4IiksdGhpcy51aUJ1dHRvblNldD1lKCI8ZGl2PiIpLmFkZENsYXNzKCJ1aS1kaWFsb2ctYnV0dG9uc2V0IikuYXBwZW5kVG8odGhpcy51aURpYWxvZ0J1dHRvblBhbmUpLHRoaXMuX2NyZWF0ZUJ1dHRvbnMoKX0sX2NyZWF0ZUJ1dHRvbnM6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGk9dGhpcy5vcHRpb25zLmJ1dHRvbnM7cmV0dXJuIHRoaXMudWlEaWFsb2dCdXR0b25QYW5lLnJlbW92ZSgpLHRoaXMudWlCdXR0b25TZXQuZW1wdHkoKSxlLmlzRW1wdHlPYmplY3QoaSl8fGUuaXNBcnJheShpKSYmIWkubGVuZ3RoPyh0aGlzLnVpRGlhbG9nLnJlbW92ZUNsYXNzKCJ1aS1kaWFsb2ctYnV0dG9ucyIpLHZvaWQgMCk6KGUuZWFjaChpLGZ1bmN0aW9uKGkscyl7dmFyIG4sYTtzPWUuaXNGdW5jdGlvbihzKT97Y2xpY2s6cyx0ZXh0Oml9OnMscz1lLmV4dGVuZCh7dHlwZToiYnV0dG9uIn0scyksbj1zLmNsaWNrLHMuY2xpY2s9ZnVuY3Rpb24oKXtuLmFwcGx5KHQuZWxlbWVudFswXSxhcmd1bWVudHMpfSxhPXtpY29uczpzLmljb25zLHRleHQ6cy5zaG93VGV4dH0sZGVsZXRlIHMuaWNvbnMsZGVsZXRlIHMuc2hvd1RleHQsZSgiPGJ1dHRvbj48L2J1dHRvbj4iLHMpLmJ1dHRvbihhKS5hcHBlbmRUbyh0LnVpQnV0dG9uU2V0KX0pLHRoaXMudWlEaWFsb2cuYWRkQ2xhc3MoInVpLWRpYWxvZy1idXR0b25zIiksdGhpcy51aURpYWxvZ0J1dHRvblBhbmUuYXBwZW5kVG8odGhpcy51aURpYWxvZyksdm9pZCAwKX0sX21ha2VEcmFnZ2FibGU6ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUpe3JldHVybntwb3NpdGlvbjplLnBvc2l0aW9uLG9mZnNldDplLm9mZnNldH19dmFyIGk9dGhpcyxzPXRoaXMub3B0aW9uczt0aGlzLnVpRGlhbG9nLmRyYWdnYWJsZSh7Y2FuY2VsOiIudWktZGlhbG9nLWNvbnRlbnQsIC51aS1kaWFsb2ctdGl0bGViYXItY2xvc2UiLGhhbmRsZToiLnVpLWRpYWxvZy10aXRsZWJhciIsY29udGFpbm1lbnQ6ImRvY3VtZW50IixzdGFydDpmdW5jdGlvbihzLG4pe2UodGhpcykuYWRkQ2xhc3MoInVpLWRpYWxvZy1kcmFnZ2luZyIpLGkuX2Jsb2NrRnJhbWVzKCksaS5fdHJpZ2dlcigiZHJhZ1N0YXJ0IixzLHQobikpfSxkcmFnOmZ1bmN0aW9uKGUscyl7aS5fdHJpZ2dlcigiZHJhZyIsZSx0KHMpKX0sc3RvcDpmdW5jdGlvbihuLGEpe3ZhciBvPWEub2Zmc2V0LmxlZnQtaS5kb2N1bWVudC5zY3JvbGxMZWZ0KCkscj1hLm9mZnNldC50b3AtaS5kb2N1bWVudC5zY3JvbGxUb3AoKTtzLnBvc2l0aW9uPXtteToibGVmdCB0b3AiLGF0OiJsZWZ0Iisobz49MD8iKyI6IiIpK28rIiAiKyJ0b3AiKyhyPj0wPyIrIjoiIikrcixvZjppLndpbmRvd30sZSh0aGlzKS5yZW1vdmVDbGFzcygidWktZGlhbG9nLWRyYWdnaW5nIiksaS5fdW5ibG9ja0ZyYW1lcygpLGkuX3RyaWdnZXIoImRyYWdTdG9wIixuLHQoYSkpfX0pfSxfbWFrZVJlc2l6YWJsZTpmdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSl7cmV0dXJue29yaWdpbmFsUG9zaXRpb246ZS5vcmlnaW5hbFBvc2l0aW9uLG9yaWdpbmFsU2l6ZTplLm9yaWdpbmFsU2l6ZSxwb3NpdGlvbjplLnBvc2l0aW9uLHNpemU6ZS5zaXplfX12YXIgaT10aGlzLHM9dGhpcy5vcHRpb25zLG49cy5yZXNpemFibGUsYT10aGlzLnVpRGlhbG9nLmNzcygicG9zaXRpb24iKSxvPSJzdHJpbmciPT10eXBlb2Ygbj9uOiJuLGUscyx3LHNlLHN3LG5lLG53Ijt0aGlzLnVpRGlhbG9nLnJlc2l6YWJsZSh7Y2FuY2VsOiIudWktZGlhbG9nLWNvbnRlbnQiLGNvbnRhaW5tZW50OiJkb2N1bWVudCIsYWxzb1Jlc2l6ZTp0aGlzLmVsZW1lbnQsbWF4V2lkdGg6cy5tYXhXaWR0aCxtYXhIZWlnaHQ6cy5tYXhIZWlnaHQsbWluV2lkdGg6cy5taW5XaWR0aCxtaW5IZWlnaHQ6dGhpcy5fbWluSGVpZ2h0KCksaGFuZGxlczpvLHN0YXJ0OmZ1bmN0aW9uKHMsbil7ZSh0aGlzKS5hZGRDbGFzcygidWktZGlhbG9nLXJlc2l6aW5nIiksaS5fYmxvY2tGcmFtZXMoKSxpLl90cmlnZ2VyKCJyZXNpemVTdGFydCIscyx0KG4pKX0scmVzaXplOmZ1bmN0aW9uKGUscyl7aS5fdHJpZ2dlcigicmVzaXplIixlLHQocykpfSxzdG9wOmZ1bmN0aW9uKG4sYSl7dmFyIG89aS51aURpYWxvZy5vZmZzZXQoKSxyPW8ubGVmdC1pLmRvY3VtZW50LnNjcm9sbExlZnQoKSxoPW8udG9wLWkuZG9jdW1lbnQuc2Nyb2xsVG9wKCk7cy5oZWlnaHQ9aS51aURpYWxvZy5oZWlnaHQoKSxzLndpZHRoPWkudWlEaWFsb2cud2lkdGgoKSxzLnBvc2l0aW9uPXtteToibGVmdCB0b3AiLGF0OiJsZWZ0Iisocj49MD8iKyI6IiIpK3IrIiAiKyJ0b3AiKyhoPj0wPyIrIjoiIikraCxvZjppLndpbmRvd30sZSh0aGlzKS5yZW1vdmVDbGFzcygidWktZGlhbG9nLXJlc2l6aW5nIiksaS5fdW5ibG9ja0ZyYW1lcygpLGkuX3RyaWdnZXIoInJlc2l6ZVN0b3AiLG4sdChhKSl9fSkuY3NzKCJwb3NpdGlvbiIsYSl9LF90cmFja0ZvY3VzOmZ1bmN0aW9uKCl7dGhpcy5fb24odGhpcy53aWRnZXQoKSx7Zm9jdXNpbjpmdW5jdGlvbih0KXt0aGlzLl9tYWtlRm9jdXNUYXJnZXQoKSx0aGlzLl9mb2N1c2VkRWxlbWVudD1lKHQudGFyZ2V0KX19KX0sX21ha2VGb2N1c1RhcmdldDpmdW5jdGlvbigpe3RoaXMuX3VudHJhY2tJbnN0YW5jZSgpLHRoaXMuX3RyYWNraW5nSW5zdGFuY2VzKCkudW5zaGlmdCh0aGlzKX0sX3VudHJhY2tJbnN0YW5jZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX3RyYWNraW5nSW5zdGFuY2VzKCksaT1lLmluQXJyYXkodGhpcyx0KTstMSE9PWkmJnQuc3BsaWNlKGksMSl9LF90cmFja2luZ0luc3RhbmNlczpmdW5jdGlvbigpe3ZhciBlPXRoaXMuZG9jdW1lbnQuZGF0YSgidWktZGlhbG9nLWluc3RhbmNlcyIpO3JldHVybiBlfHwoZT1bXSx0aGlzLmRvY3VtZW50LmRhdGEoInVpLWRpYWxvZy1pbnN0YW5jZXMiLGUpKSxlfSxfbWluSGVpZ2h0OmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vcHRpb25zO3JldHVybiJhdXRvIj09PWUuaGVpZ2h0P2UubWluSGVpZ2h0Ok1hdGgubWluKGUubWluSGVpZ2h0LGUuaGVpZ2h0KX0sX3Bvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy51aURpYWxvZy5pcygiOnZpc2libGUiKTtlfHx0aGlzLnVpRGlhbG9nLnNob3coKSx0aGlzLnVpRGlhbG9nLnBvc2l0aW9uKHRoaXMub3B0aW9ucy5wb3NpdGlvbiksZXx8dGhpcy51aURpYWxvZy5oaWRlKCl9LF9zZXRPcHRpb25zOmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMscz0hMSxuPXt9O2UuZWFjaCh0LGZ1bmN0aW9uKGUsdCl7aS5fc2V0T3B0aW9uKGUsdCksZSBpbiBpLnNpemVSZWxhdGVkT3B0aW9ucyYmKHM9ITApLGUgaW4gaS5yZXNpemFibGVSZWxhdGVkT3B0aW9ucyYmKG5bZV09dCl9KSxzJiYodGhpcy5fc2l6ZSgpLHRoaXMuX3Bvc2l0aW9uKCkpLHRoaXMudWlEaWFsb2cuaXMoIjpkYXRhKHVpLXJlc2l6YWJsZSkiKSYmdGhpcy51aURpYWxvZy5yZXNpemFibGUoIm9wdGlvbiIsbil9LF9zZXRPcHRpb246ZnVuY3Rpb24oZSx0KXt2YXIgaSxzLG49dGhpcy51aURpYWxvZzsiZGlhbG9nQ2xhc3MiPT09ZSYmbi5yZW1vdmVDbGFzcyh0aGlzLm9wdGlvbnMuZGlhbG9nQ2xhc3MpLmFkZENsYXNzKHQpLCJkaXNhYmxlZCIhPT1lJiYodGhpcy5fc3VwZXIoZSx0KSwiYXBwZW5kVG8iPT09ZSYmdGhpcy51aURpYWxvZy5hcHBlbmRUbyh0aGlzLl9hcHBlbmRUbygpKSwiYnV0dG9ucyI9PT1lJiZ0aGlzLl9jcmVhdGVCdXR0b25zKCksImNsb3NlVGV4dCI9PT1lJiZ0aGlzLnVpRGlhbG9nVGl0bGViYXJDbG9zZS5idXR0b24oe2xhYmVsOiIiK3R9KSwiZHJhZ2dhYmxlIj09PWUmJihpPW4uaXMoIjpkYXRhKHVpLWRyYWdnYWJsZSkiKSxpJiYhdCYmbi5kcmFnZ2FibGUoImRlc3Ryb3kiKSwhaSYmdCYmdGhpcy5fbWFrZURyYWdnYWJsZSgpKSwicG9zaXRpb24iPT09ZSYmdGhpcy5fcG9zaXRpb24oKSwicmVzaXphYmxlIj09PWUmJihzPW4uaXMoIjpkYXRhKHVpLXJlc2l6YWJsZSkiKSxzJiYhdCYmbi5yZXNpemFibGUoImRlc3Ryb3kiKSxzJiYic3RyaW5nIj09dHlwZW9mIHQmJm4ucmVzaXphYmxlKCJvcHRpb24iLCJoYW5kbGVzIix0KSxzfHx0PT09ITF8fHRoaXMuX21ha2VSZXNpemFibGUoKSksInRpdGxlIj09PWUmJnRoaXMuX3RpdGxlKHRoaXMudWlEaWFsb2dUaXRsZWJhci5maW5kKCIudWktZGlhbG9nLXRpdGxlIikpKX0sX3NpemU6ZnVuY3Rpb24oKXt2YXIgZSx0LGkscz10aGlzLm9wdGlvbnM7dGhpcy5lbGVtZW50LnNob3coKS5jc3Moe3dpZHRoOiJhdXRvIixtaW5IZWlnaHQ6MCxtYXhIZWlnaHQ6Im5vbmUiLGhlaWdodDowfSkscy5taW5XaWR0aD5zLndpZHRoJiYocy53aWR0aD1zLm1pbldpZHRoKSxlPXRoaXMudWlEaWFsb2cuY3NzKHtoZWlnaHQ6ImF1dG8iLHdpZHRoOnMud2lkdGh9KS5vdXRlckhlaWdodCgpLHQ9TWF0aC5tYXgoMCxzLm1pbkhlaWdodC1lKSxpPSJudW1iZXIiPT10eXBlb2Ygcy5tYXhIZWlnaHQ/TWF0aC5tYXgoMCxzLm1heEhlaWdodC1lKToibm9uZSIsImF1dG8iPT09cy5oZWlnaHQ/dGhpcy5lbGVtZW50LmNzcyh7bWluSGVpZ2h0OnQsbWF4SGVpZ2h0OmksaGVpZ2h0OiJhdXRvIn0pOnRoaXMuZWxlbWVudC5oZWlnaHQoTWF0aC5tYXgoMCxzLmhlaWdodC1lKSksdGhpcy51aURpYWxvZy5pcygiOmRhdGEodWktcmVzaXphYmxlKSIpJiZ0aGlzLnVpRGlhbG9nLnJlc2l6YWJsZSgib3B0aW9uIiwibWluSGVpZ2h0Iix0aGlzLl9taW5IZWlnaHQoKSl9LF9ibG9ja0ZyYW1lczpmdW5jdGlvbigpe3RoaXMuaWZyYW1lQmxvY2tzPXRoaXMuZG9jdW1lbnQuZmluZCgiaWZyYW1lIikubWFwKGZ1bmN0aW9uKCl7dmFyIHQ9ZSh0aGlzKTtyZXR1cm4gZSgiPGRpdj4iKS5jc3Moe3Bvc2l0aW9uOiJhYnNvbHV0ZSIsd2lkdGg6dC5vdXRlcldpZHRoKCksaGVpZ2h0OnQub3V0ZXJIZWlnaHQoKX0pLmFwcGVuZFRvKHQucGFyZW50KCkpLm9mZnNldCh0Lm9mZnNldCgpKVswXX0pfSxfdW5ibG9ja0ZyYW1lczpmdW5jdGlvbigpe3RoaXMuaWZyYW1lQmxvY2tzJiYodGhpcy5pZnJhbWVCbG9ja3MucmVtb3ZlKCksZGVsZXRlIHRoaXMuaWZyYW1lQmxvY2tzKX0sX2FsbG93SW50ZXJhY3Rpb246ZnVuY3Rpb24odCl7cmV0dXJuIGUodC50YXJnZXQpLmNsb3Nlc3QoIi51aS1kaWFsb2ciKS5sZW5ndGg/ITA6ISFlKHQudGFyZ2V0KS5jbG9zZXN0KCIudWktZGF0ZXBpY2tlciIpLmxlbmd0aH0sX2NyZWF0ZU92ZXJsYXk6ZnVuY3Rpb24oKXtpZih0aGlzLm9wdGlvbnMubW9kYWwpe3ZhciB0PSEwO3RoaXMuX2RlbGF5KGZ1bmN0aW9uKCl7dD0hMX0pLHRoaXMuZG9jdW1lbnQuZGF0YSgidWktZGlhbG9nLW92ZXJsYXlzIil8fHRoaXMuX29uKHRoaXMuZG9jdW1lbnQse2ZvY3VzaW46ZnVuY3Rpb24oZSl7dHx8dGhpcy5fYWxsb3dJbnRlcmFjdGlvbihlKXx8KGUucHJldmVudERlZmF1bHQoKSx0aGlzLl90cmFja2luZ0luc3RhbmNlcygpWzBdLl9mb2N1c1RhYmJhYmxlKCkpfX0pLHRoaXMub3ZlcmxheT1lKCI8ZGl2PiIpLmFkZENsYXNzKCJ1aS13aWRnZXQtb3ZlcmxheSB1aS1mcm9udCIpLmFwcGVuZFRvKHRoaXMuX2FwcGVuZFRvKCkpLHRoaXMuX29uKHRoaXMub3ZlcmxheSx7bW91c2Vkb3duOiJfa2VlcEZvY3VzIn0pLHRoaXMuZG9jdW1lbnQuZGF0YSgidWktZGlhbG9nLW92ZXJsYXlzIiwodGhpcy5kb2N1bWVudC5kYXRhKCJ1aS1kaWFsb2ctb3ZlcmxheXMiKXx8MCkrMSl9fSxfZGVzdHJveU92ZXJsYXk6ZnVuY3Rpb24oKXtpZih0aGlzLm9wdGlvbnMubW9kYWwmJnRoaXMub3ZlcmxheSl7dmFyIGU9dGhpcy5kb2N1bWVudC5kYXRhKCJ1aS1kaWFsb2ctb3ZlcmxheXMiKS0xO2U/dGhpcy5kb2N1bWVudC5kYXRhKCJ1aS1kaWFsb2ctb3ZlcmxheXMiLGUpOnRoaXMuZG9jdW1lbnQudW5iaW5kKCJmb2N1c2luIikucmVtb3ZlRGF0YSgidWktZGlhbG9nLW92ZXJsYXlzIiksdGhpcy5vdmVybGF5LnJlbW92ZSgpLHRoaXMub3ZlcmxheT1udWxsfX19KSxlLndpZGdldCgidWkuZHJvcHBhYmxlIix7dmVyc2lvbjoiMS4xMS40Iix3aWRnZXRFdmVudFByZWZpeDoiZHJvcCIsb3B0aW9uczp7YWNjZXB0OiIqIixhY3RpdmVDbGFzczohMSxhZGRDbGFzc2VzOiEwLGdyZWVkeTohMSxob3ZlckNsYXNzOiExLHNjb3BlOiJkZWZhdWx0Iix0b2xlcmFuY2U6ImludGVyc2VjdCIsYWN0aXZhdGU6bnVsbCxkZWFjdGl2YXRlOm51bGwsZHJvcDpudWxsLG91dDpudWxsLG92ZXI6bnVsbH0sX2NyZWF0ZTpmdW5jdGlvbigpe3ZhciB0LGk9dGhpcy5vcHRpb25zLHM9aS5hY2NlcHQ7dGhpcy5pc292ZXI9ITEsdGhpcy5pc291dD0hMCx0aGlzLmFjY2VwdD1lLmlzRnVuY3Rpb24ocyk/czpmdW5jdGlvbihlKXtyZXR1cm4gZS5pcyhzKX0sdGhpcy5wcm9wb3J0aW9ucz1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PWFyZ3VtZW50c1swXSx2b2lkIDApOnQ/dDp0PXt3aWR0aDp0aGlzLmVsZW1lbnRbMF0ub2Zmc2V0V2lkdGgsaGVpZ2h0OnRoaXMuZWxlbWVudFswXS5vZmZzZXRIZWlnaHR9fSx0aGlzLl9hZGRUb01hbmFnZXIoaS5zY29wZSksaS5hZGRDbGFzc2VzJiZ0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLWRyb3BwYWJsZSIpfSxfYWRkVG9NYW5hZ2VyOmZ1bmN0aW9uKHQpe2UudWkuZGRtYW5hZ2VyLmRyb3BwYWJsZXNbdF09ZS51aS5kZG1hbmFnZXIuZHJvcHBhYmxlc1t0XXx8W10sZS51aS5kZG1hbmFnZXIuZHJvcHBhYmxlc1t0XS5wdXNoKHRoaXMpfSxfc3BsaWNlOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0wO2UubGVuZ3RoPnQ7dCsrKWVbdF09PT10aGlzJiZlLnNwbGljZSh0LDEpfSxfZGVzdHJveTpmdW5jdGlvbigpe3ZhciB0PWUudWkuZGRtYW5hZ2VyLmRyb3BwYWJsZXNbdGhpcy5vcHRpb25zLnNjb3BlXTt0aGlzLl9zcGxpY2UodCksdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1kcm9wcGFibGUgdWktZHJvcHBhYmxlLWRpc2FibGVkIil9LF9zZXRPcHRpb246ZnVuY3Rpb24odCxpKXtpZigiYWNjZXB0Ij09PXQpdGhpcy5hY2NlcHQ9ZS5pc0Z1bmN0aW9uKGkpP2k6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuaXMoaSl9O2Vsc2UgaWYoInNjb3BlIj09PXQpe3ZhciBzPWUudWkuZGRtYW5hZ2VyLmRyb3BwYWJsZXNbdGhpcy5vcHRpb25zLnNjb3BlXTt0aGlzLl9zcGxpY2UocyksdGhpcy5fYWRkVG9NYW5hZ2VyKGkpfXRoaXMuX3N1cGVyKHQsaSl9LF9hY3RpdmF0ZTpmdW5jdGlvbih0KXt2YXIgaT1lLnVpLmRkbWFuYWdlci5jdXJyZW50O3RoaXMub3B0aW9ucy5hY3RpdmVDbGFzcyYmdGhpcy5lbGVtZW50LmFkZENsYXNzKHRoaXMub3B0aW9ucy5hY3RpdmVDbGFzcyksaSYmdGhpcy5fdHJpZ2dlcigiYWN0aXZhdGUiLHQsdGhpcy51aShpKSl9LF9kZWFjdGl2YXRlOmZ1bmN0aW9uKHQpe3ZhciBpPWUudWkuZGRtYW5hZ2VyLmN1cnJlbnQ7dGhpcy5vcHRpb25zLmFjdGl2ZUNsYXNzJiZ0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLmFjdGl2ZUNsYXNzKSxpJiZ0aGlzLl90cmlnZ2VyKCJkZWFjdGl2YXRlIix0LHRoaXMudWkoaSkpfSxfb3ZlcjpmdW5jdGlvbih0KXt2YXIgaT1lLnVpLmRkbWFuYWdlci5jdXJyZW50O2kmJihpLmN1cnJlbnRJdGVtfHxpLmVsZW1lbnQpWzBdIT09dGhpcy5lbGVtZW50WzBdJiZ0aGlzLmFjY2VwdC5jYWxsKHRoaXMuZWxlbWVudFswXSxpLmN1cnJlbnRJdGVtfHxpLmVsZW1lbnQpJiYodGhpcy5vcHRpb25zLmhvdmVyQ2xhc3MmJnRoaXMuZWxlbWVudC5hZGRDbGFzcyh0aGlzLm9wdGlvbnMuaG92ZXJDbGFzcyksdGhpcy5fdHJpZ2dlcigib3ZlciIsdCx0aGlzLnVpKGkpKSl9LF9vdXQ6ZnVuY3Rpb24odCl7dmFyIGk9ZS51aS5kZG1hbmFnZXIuY3VycmVudDtpJiYoaS5jdXJyZW50SXRlbXx8aS5lbGVtZW50KVswXSE9PXRoaXMuZWxlbWVudFswXSYmdGhpcy5hY2NlcHQuY2FsbCh0aGlzLmVsZW1lbnRbMF0saS5jdXJyZW50SXRlbXx8aS5lbGVtZW50KSYmKHRoaXMub3B0aW9ucy5ob3ZlckNsYXNzJiZ0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLmhvdmVyQ2xhc3MpLHRoaXMuX3RyaWdnZXIoIm91dCIsdCx0aGlzLnVpKGkpKSl9LF9kcm9wOmZ1bmN0aW9uKHQsaSl7dmFyIHM9aXx8ZS51aS5kZG1hbmFnZXIuY3VycmVudCxuPSExO3JldHVybiBzJiYocy5jdXJyZW50SXRlbXx8cy5lbGVtZW50KVswXSE9PXRoaXMuZWxlbWVudFswXT8odGhpcy5lbGVtZW50LmZpbmQoIjpkYXRhKHVpLWRyb3BwYWJsZSkiKS5ub3QoIi51aS1kcmFnZ2FibGUtZHJhZ2dpbmciKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGk9ZSh0aGlzKS5kcm9wcGFibGUoImluc3RhbmNlIik7cmV0dXJuIGkub3B0aW9ucy5ncmVlZHkmJiFpLm9wdGlvbnMuZGlzYWJsZWQmJmkub3B0aW9ucy5zY29wZT09PXMub3B0aW9ucy5zY29wZSYmaS5hY2NlcHQuY2FsbChpLmVsZW1lbnRbMF0scy5jdXJyZW50SXRlbXx8cy5lbGVtZW50KSYmZS51aS5pbnRlcnNlY3QocyxlLmV4dGVuZChpLHtvZmZzZXQ6aS5lbGVtZW50Lm9mZnNldCgpfSksaS5vcHRpb25zLnRvbGVyYW5jZSx0KT8obj0hMCwhMSk6dm9pZCAwfSksbj8hMTp0aGlzLmFjY2VwdC5jYWxsKHRoaXMuZWxlbWVudFswXSxzLmN1cnJlbnRJdGVtfHxzLmVsZW1lbnQpPyh0aGlzLm9wdGlvbnMuYWN0aXZlQ2xhc3MmJnRoaXMuZWxlbWVudC5yZW1vdmVDbGFzcyh0aGlzLm9wdGlvbnMuYWN0aXZlQ2xhc3MpLHRoaXMub3B0aW9ucy5ob3ZlckNsYXNzJiZ0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLmhvdmVyQ2xhc3MpLHRoaXMuX3RyaWdnZXIoImRyb3AiLHQsdGhpcy51aShzKSksdGhpcy5lbGVtZW50KTohMSk6ITF9LHVpOmZ1bmN0aW9uKGUpe3JldHVybntkcmFnZ2FibGU6ZS5jdXJyZW50SXRlbXx8ZS5lbGVtZW50LGhlbHBlcjplLmhlbHBlcixwb3NpdGlvbjplLnBvc2l0aW9uLG9mZnNldDplLnBvc2l0aW9uQWJzfX19KSxlLnVpLmludGVyc2VjdD1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0LGkpe3JldHVybiBlPj10JiZ0K2k+ZX1yZXR1cm4gZnVuY3Rpb24odCxpLHMsbil7aWYoIWkub2Zmc2V0KXJldHVybiExO3ZhciBhPSh0LnBvc2l0aW9uQWJzfHx0LnBvc2l0aW9uLmFic29sdXRlKS5sZWZ0K3QubWFyZ2lucy5sZWZ0LG89KHQucG9zaXRpb25BYnN8fHQucG9zaXRpb24uYWJzb2x1dGUpLnRvcCt0Lm1hcmdpbnMudG9wLHI9YSt0LmhlbHBlclByb3BvcnRpb25zLndpZHRoLGg9byt0LmhlbHBlclByb3BvcnRpb25zLmhlaWdodCxsPWkub2Zmc2V0LmxlZnQsdT1pLm9mZnNldC50b3AsZD1sK2kucHJvcG9ydGlvbnMoKS53aWR0aCxjPXUraS5wcm9wb3J0aW9ucygpLmhlaWdodDtzd2l0Y2gocyl7Y2FzZSJmaXQiOnJldHVybiBhPj1sJiZkPj1yJiZvPj11JiZjPj1oO2Nhc2UiaW50ZXJzZWN0IjpyZXR1cm4gYSt0LmhlbHBlclByb3BvcnRpb25zLndpZHRoLzI+bCYmZD5yLXQuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgvMiYmbyt0LmhlbHBlclByb3BvcnRpb25zLmhlaWdodC8yPnUmJmM+aC10LmhlbHBlclByb3BvcnRpb25zLmhlaWdodC8yO2Nhc2UicG9pbnRlciI6cmV0dXJuIGUobi5wYWdlWSx1LGkucHJvcG9ydGlvbnMoKS5oZWlnaHQpJiZlKG4ucGFnZVgsbCxpLnByb3BvcnRpb25zKCkud2lkdGgpO2Nhc2UidG91Y2giOnJldHVybihvPj11JiZjPj1vfHxoPj11JiZjPj1ofHx1Pm8mJmg+YykmJihhPj1sJiZkPj1hfHxyPj1sJiZkPj1yfHxsPmEmJnI+ZCk7ZGVmYXVsdDpyZXR1cm4hMX19fSgpLGUudWkuZGRtYW5hZ2VyPXtjdXJyZW50Om51bGwsZHJvcHBhYmxlczp7ImRlZmF1bHQiOltdfSxwcmVwYXJlT2Zmc2V0czpmdW5jdGlvbih0LGkpe3ZhciBzLG4sYT1lLnVpLmRkbWFuYWdlci5kcm9wcGFibGVzW3Qub3B0aW9ucy5zY29wZV18fFtdLG89aT9pLnR5cGU6bnVsbCxyPSh0LmN1cnJlbnRJdGVtfHx0LmVsZW1lbnQpLmZpbmQoIjpkYXRhKHVpLWRyb3BwYWJsZSkiKS5hZGRCYWNrKCk7ZTpmb3Iocz0wO2EubGVuZ3RoPnM7cysrKWlmKCEoYVtzXS5vcHRpb25zLmRpc2FibGVkfHx0JiYhYVtzXS5hY2NlcHQuY2FsbChhW3NdLmVsZW1lbnRbMF0sdC5jdXJyZW50SXRlbXx8dC5lbGVtZW50KSkpe2ZvcihuPTA7ci5sZW5ndGg+bjtuKyspaWYocltuXT09PWFbc10uZWxlbWVudFswXSl7YVtzXS5wcm9wb3J0aW9ucygpLmhlaWdodD0wO2NvbnRpbnVlIGV9YVtzXS52aXNpYmxlPSJub25lIiE9PWFbc10uZWxlbWVudC5jc3MoImRpc3BsYXkiKSxhW3NdLnZpc2libGUmJigibW91c2Vkb3duIj09PW8mJmFbc10uX2FjdGl2YXRlLmNhbGwoYVtzXSxpKSxhW3NdLm9mZnNldD1hW3NdLmVsZW1lbnQub2Zmc2V0KCksYVtzXS5wcm9wb3J0aW9ucyh7d2lkdGg6YVtzXS5lbGVtZW50WzBdLm9mZnNldFdpZHRoLGhlaWdodDphW3NdLmVsZW1lbnRbMF0ub2Zmc2V0SGVpZ2h0fSkpfX0sZHJvcDpmdW5jdGlvbih0LGkpe3ZhciBzPSExO3JldHVybiBlLmVhY2goKGUudWkuZGRtYW5hZ2VyLmRyb3BwYWJsZXNbdC5vcHRpb25zLnNjb3BlXXx8W10pLnNsaWNlKCksZnVuY3Rpb24oKXt0aGlzLm9wdGlvbnMmJighdGhpcy5vcHRpb25zLmRpc2FibGVkJiZ0aGlzLnZpc2libGUmJmUudWkuaW50ZXJzZWN0KHQsdGhpcyx0aGlzLm9wdGlvbnMudG9sZXJhbmNlLGkpJiYocz10aGlzLl9kcm9wLmNhbGwodGhpcyxpKXx8cyksIXRoaXMub3B0aW9ucy5kaXNhYmxlZCYmdGhpcy52aXNpYmxlJiZ0aGlzLmFjY2VwdC5jYWxsKHRoaXMuZWxlbWVudFswXSx0LmN1cnJlbnRJdGVtfHx0LmVsZW1lbnQpJiYodGhpcy5pc291dD0hMCx0aGlzLmlzb3Zlcj0hMSx0aGlzLl9kZWFjdGl2YXRlLmNhbGwodGhpcyxpKSkpfSksc30sZHJhZ1N0YXJ0OmZ1bmN0aW9uKHQsaSl7dC5lbGVtZW50LnBhcmVudHNVbnRpbCgiYm9keSIpLmJpbmQoInNjcm9sbC5kcm9wcGFibGUiLGZ1bmN0aW9uKCl7dC5vcHRpb25zLnJlZnJlc2hQb3NpdGlvbnN8fGUudWkuZGRtYW5hZ2VyLnByZXBhcmVPZmZzZXRzKHQsaSl9KX0sZHJhZzpmdW5jdGlvbih0LGkpe3Qub3B0aW9ucy5yZWZyZXNoUG9zaXRpb25zJiZlLnVpLmRkbWFuYWdlci5wcmVwYXJlT2Zmc2V0cyh0LGkpLGUuZWFjaChlLnVpLmRkbWFuYWdlci5kcm9wcGFibGVzW3Qub3B0aW9ucy5zY29wZV18fFtdLGZ1bmN0aW9uKCl7aWYoIXRoaXMub3B0aW9ucy5kaXNhYmxlZCYmIXRoaXMuZ3JlZWR5Q2hpbGQmJnRoaXMudmlzaWJsZSl7dmFyIHMsbixhLG89ZS51aS5pbnRlcnNlY3QodCx0aGlzLHRoaXMub3B0aW9ucy50b2xlcmFuY2UsaSkscj0hbyYmdGhpcy5pc292ZXI/Imlzb3V0IjpvJiYhdGhpcy5pc292ZXI/Imlzb3ZlciI6bnVsbDtyJiYodGhpcy5vcHRpb25zLmdyZWVkeSYmKG49dGhpcy5vcHRpb25zLnNjb3BlLGE9dGhpcy5lbGVtZW50LnBhcmVudHMoIjpkYXRhKHVpLWRyb3BwYWJsZSkiKS5maWx0ZXIoZnVuY3Rpb24oKXtyZXR1cm4gZSh0aGlzKS5kcm9wcGFibGUoImluc3RhbmNlIikub3B0aW9ucy5zY29wZT09PW59KSxhLmxlbmd0aCYmKHM9ZShhWzBdKS5kcm9wcGFibGUoImluc3RhbmNlIikscy5ncmVlZHlDaGlsZD0iaXNvdmVyIj09PXIpKSxzJiYiaXNvdmVyIj09PXImJihzLmlzb3Zlcj0hMSxzLmlzb3V0PSEwLHMuX291dC5jYWxsKHMsaSkpLHRoaXNbcl09ITAsdGhpc1siaXNvdXQiPT09cj8iaXNvdmVyIjoiaXNvdXQiXT0hMSx0aGlzWyJpc292ZXIiPT09cj8iX292ZXIiOiJfb3V0Il0uY2FsbCh0aGlzLGkpLHMmJiJpc291dCI9PT1yJiYocy5pc291dD0hMSxzLmlzb3Zlcj0hMCxzLl9vdmVyLmNhbGwocyxpKSkpfX0pfSxkcmFnU3RvcDpmdW5jdGlvbih0LGkpe3QuZWxlbWVudC5wYXJlbnRzVW50aWwoImJvZHkiKS51bmJpbmQoInNjcm9sbC5kcm9wcGFibGUiKSx0Lm9wdGlvbnMucmVmcmVzaFBvc2l0aW9uc3x8ZS51aS5kZG1hbmFnZXIucHJlcGFyZU9mZnNldHModCxpKX19LGUudWkuZHJvcHBhYmxlO3ZhciB5PSJ1aS1lZmZlY3RzLSIsYj1lO2UuZWZmZWN0cz17ZWZmZWN0Ont9fSxmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIGkoZSx0LGkpe3ZhciBzPWRbdC50eXBlXXx8e307cmV0dXJuIG51bGw9PWU/aXx8IXQuZGVmP251bGw6dC5kZWY6KGU9cy5mbG9vcj9+fmU6cGFyc2VGbG9hdChlKSxpc05hTihlKT90LmRlZjpzLm1vZD8oZStzLm1vZCklcy5tb2Q6MD5lPzA6ZT5zLm1heD9zLm1heDplKX1mdW5jdGlvbiBzKGkpe3ZhciBzPWwoKSxuPXMuX3JnYmE9W107cmV0dXJuIGk9aS50b0xvd2VyQ2FzZSgpLGYoaCxmdW5jdGlvbihlLGEpe3ZhciBvLHI9YS5yZS5leGVjKGkpLGg9ciYmYS5wYXJzZShyKSxsPWEuc3BhY2V8fCJyZ2JhIjtyZXR1cm4gaD8obz1zW2xdKGgpLHNbdVtsXS5jYWNoZV09b1t1W2xdLmNhY2hlXSxuPXMuX3JnYmE9by5fcmdiYSwhMSk6dH0pLG4ubGVuZ3RoPygiMCwwLDAsMCI9PT1uLmpvaW4oKSYmZS5leHRlbmQobixhLnRyYW5zcGFyZW50KSxzKTphW2ldfWZ1bmN0aW9uIG4oZSx0LGkpe3JldHVybiBpPShpKzEpJTEsMT42Kmk/ZSs2Kih0LWUpKmk6MT4yKmk/dDoyPjMqaT9lKzYqKHQtZSkqKDIvMy1pKTplfXZhciBhLG89ImJhY2tncm91bmRDb2xvciBib3JkZXJCb3R0b21Db2xvciBib3JkZXJMZWZ0Q29sb3IgYm9yZGVyUmlnaHRDb2xvciBib3JkZXJUb3BDb2xvciBjb2xvciBjb2x1bW5SdWxlQ29sb3Igb3V0bGluZUNvbG9yIHRleHREZWNvcmF0aW9uQ29sb3IgdGV4dEVtcGhhc2lzQ29sb3IiLHI9L14oW1wtK10pPVxzKihcZCtcLj9cZCopLyxoPVt7cmU6L3JnYmE/XChccyooXGR7MSwzfSlccyosXHMqKFxkezEsM30pXHMqLFxzKihcZHsxLDN9KVxzKig/OixccyooXGQ/KD86XC5cZCspPylccyopP1wpLyxwYXJzZTpmdW5jdGlvbihlKXtyZXR1cm5bZVsxXSxlWzJdLGVbM10sZVs0XV19fSx7cmU6L3JnYmE/XChccyooXGQrKD86XC5cZCspPylcJVxzKixccyooXGQrKD86XC5cZCspPylcJVxzKixccyooXGQrKD86XC5cZCspPylcJVxzKig/OixccyooXGQ/KD86XC5cZCspPylccyopP1wpLyxwYXJzZTpmdW5jdGlvbihlKXtyZXR1cm5bMi41NSplWzFdLDIuNTUqZVsyXSwyLjU1KmVbM10sZVs0XV19fSx7cmU6LyMoW2EtZjAtOV17Mn0pKFthLWYwLTldezJ9KShbYS1mMC05XXsyfSkvLHBhcnNlOmZ1bmN0aW9uKGUpe3JldHVybltwYXJzZUludChlWzFdLDE2KSxwYXJzZUludChlWzJdLDE2KSxwYXJzZUludChlWzNdLDE2KV19fSx7cmU6LyMoW2EtZjAtOV0pKFthLWYwLTldKShbYS1mMC05XSkvLHBhcnNlOmZ1bmN0aW9uKGUpe3JldHVybltwYXJzZUludChlWzFdK2VbMV0sMTYpLHBhcnNlSW50KGVbMl0rZVsyXSwxNikscGFyc2VJbnQoZVszXStlWzNdLDE2KV19fSx7cmU6L2hzbGE/XChccyooXGQrKD86XC5cZCspPylccyosXHMqKFxkKyg/OlwuXGQrKT8pXCVccyosXHMqKFxkKyg/OlwuXGQrKT8pXCVccyooPzosXHMqKFxkPyg/OlwuXGQrKT8pXHMqKT9cKS8sc3BhY2U6ImhzbGEiLHBhcnNlOmZ1bmN0aW9uKGUpe3JldHVybltlWzFdLGVbMl0vMTAwLGVbM10vMTAwLGVbNF1dfX1dLGw9ZS5Db2xvcj1mdW5jdGlvbih0LGkscyxuKXtyZXR1cm4gbmV3IGUuQ29sb3IuZm4ucGFyc2UodCxpLHMsbil9LHU9e3JnYmE6e3Byb3BzOntyZWQ6e2lkeDowLHR5cGU6ImJ5dGUifSxncmVlbjp7aWR4OjEsdHlwZToiYnl0ZSJ9LGJsdWU6e2lkeDoyLHR5cGU6ImJ5dGUifX19LGhzbGE6e3Byb3BzOntodWU6e2lkeDowLHR5cGU6ImRlZ3JlZXMifSxzYXR1cmF0aW9uOntpZHg6MSx0eXBlOiJwZXJjZW50In0sbGlnaHRuZXNzOntpZHg6Mix0eXBlOiJwZXJjZW50In19fX0sZD17ImJ5dGUiOntmbG9vcjohMCxtYXg6MjU1fSxwZXJjZW50OnttYXg6MX0sZGVncmVlczp7bW9kOjM2MCxmbG9vcjohMH19LGM9bC5zdXBwb3J0PXt9LHA9ZSgiPHA+IilbMF0sZj1lLmVhY2g7cC5zdHlsZS5jc3NUZXh0PSJiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMSwxLDEsLjUpIixjLnJnYmE9cC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IuaW5kZXhPZigicmdiYSIpPi0xLGYodSxmdW5jdGlvbihlLHQpe3QuY2FjaGU9Il8iK2UsdC5wcm9wcy5hbHBoYT17aWR4OjMsdHlwZToicGVyY2VudCIsZGVmOjF9fSksbC5mbj1lLmV4dGVuZChsLnByb3RvdHlwZSx7cGFyc2U6ZnVuY3Rpb24obixvLHIsaCl7aWYobj09PXQpcmV0dXJuIHRoaXMuX3JnYmE9W251bGwsbnVsbCxudWxsLG51bGxdLHRoaXM7KG4uanF1ZXJ5fHxuLm5vZGVUeXBlKSYmKG49ZShuKS5jc3Mobyksbz10KTt2YXIgZD10aGlzLGM9ZS50eXBlKG4pLHA9dGhpcy5fcmdiYT1bXTtyZXR1cm4gbyE9PXQmJihuPVtuLG8scixoXSxjPSJhcnJheSIpLCJzdHJpbmciPT09Yz90aGlzLnBhcnNlKHMobil8fGEuX2RlZmF1bHQpOiJhcnJheSI9PT1jPyhmKHUucmdiYS5wcm9wcyxmdW5jdGlvbihlLHQpe3BbdC5pZHhdPWkoblt0LmlkeF0sdCl9KSx0aGlzKToib2JqZWN0Ij09PWM/KG4gaW5zdGFuY2VvZiBsP2YodSxmdW5jdGlvbihlLHQpe25bdC5jYWNoZV0mJihkW3QuY2FjaGVdPW5bdC5jYWNoZV0uc2xpY2UoKSl9KTpmKHUsZnVuY3Rpb24odCxzKXt2YXIgYT1zLmNhY2hlO2Yocy5wcm9wcyxmdW5jdGlvbihlLHQpe2lmKCFkW2FdJiZzLnRvKXtpZigiYWxwaGEiPT09ZXx8bnVsbD09bltlXSlyZXR1cm47ZFthXT1zLnRvKGQuX3JnYmEpfWRbYV1bdC5pZHhdPWkobltlXSx0LCEwKX0pLGRbYV0mJjA+ZS5pbkFycmF5KG51bGwsZFthXS5zbGljZSgwLDMpKSYmKGRbYV1bM109MSxzLmZyb20mJihkLl9yZ2JhPXMuZnJvbShkW2FdKSkpfSksdGhpcyk6dH0saXM6ZnVuY3Rpb24oZSl7dmFyIGk9bChlKSxzPSEwLG49dGhpcztyZXR1cm4gZih1LGZ1bmN0aW9uKGUsYSl7dmFyIG8scj1pW2EuY2FjaGVdO3JldHVybiByJiYobz1uW2EuY2FjaGVdfHxhLnRvJiZhLnRvKG4uX3JnYmEpfHxbXSxmKGEucHJvcHMsZnVuY3Rpb24oZSxpKXtyZXR1cm4gbnVsbCE9cltpLmlkeF0/cz1yW2kuaWR4XT09PW9baS5pZHhdOnR9KSksc30pLHN9LF9zcGFjZTpmdW5jdGlvbigpe3ZhciBlPVtdLHQ9dGhpcztyZXR1cm4gZih1LGZ1bmN0aW9uKGkscyl7dFtzLmNhY2hlXSYmZS5wdXNoKGkpfSksZS5wb3AoKX0sdHJhbnNpdGlvbjpmdW5jdGlvbihlLHQpe3ZhciBzPWwoZSksbj1zLl9zcGFjZSgpLGE9dVtuXSxvPTA9PT10aGlzLmFscGhhKCk/bCgidHJhbnNwYXJlbnQiKTp0aGlzLHI9b1thLmNhY2hlXXx8YS50byhvLl9yZ2JhKSxoPXIuc2xpY2UoKTtyZXR1cm4gcz1zW2EuY2FjaGVdLGYoYS5wcm9wcyxmdW5jdGlvbihlLG4pe3ZhciBhPW4uaWR4LG89clthXSxsPXNbYV0sdT1kW24udHlwZV18fHt9O251bGwhPT1sJiYobnVsbD09PW8/aFthXT1sOih1Lm1vZCYmKGwtbz51Lm1vZC8yP28rPXUubW9kOm8tbD51Lm1vZC8yJiYoby09dS5tb2QpKSxoW2FdPWkoKGwtbykqdCtvLG4pKSl9KSx0aGlzW25dKGgpfSxibGVuZDpmdW5jdGlvbih0KXtpZigxPT09dGhpcy5fcmdiYVszXSlyZXR1cm4gdGhpczt2YXIgaT10aGlzLl9yZ2JhLnNsaWNlKCkscz1pLnBvcCgpLG49bCh0KS5fcmdiYTtyZXR1cm4gbChlLm1hcChpLGZ1bmN0aW9uKGUsdCl7cmV0dXJuKDEtcykqblt0XStzKmV9KSl9LHRvUmdiYVN0cmluZzpmdW5jdGlvbigpe3ZhciB0PSJyZ2JhKCIsaT1lLm1hcCh0aGlzLl9yZ2JhLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIG51bGw9PWU/dD4yPzE6MDplfSk7cmV0dXJuIDE9PT1pWzNdJiYoaS5wb3AoKSx0PSJyZ2IoIiksdCtpLmpvaW4oKSsiKSJ9LHRvSHNsYVN0cmluZzpmdW5jdGlvbigpe3ZhciB0PSJoc2xhKCIsaT1lLm1hcCh0aGlzLmhzbGEoKSxmdW5jdGlvbihlLHQpe3JldHVybiBudWxsPT1lJiYoZT10PjI/MTowKSx0JiYzPnQmJihlPU1hdGgucm91bmQoMTAwKmUpKyIlIiksZX0pO3JldHVybiAxPT09aVszXSYmKGkucG9wKCksdD0iaHNsKCIpLHQraS5qb2luKCkrIikifSx0b0hleFN0cmluZzpmdW5jdGlvbih0KXt2YXIgaT10aGlzLl9yZ2JhLnNsaWNlKCkscz1pLnBvcCgpO3JldHVybiB0JiZpLnB1c2gofn4oMjU1KnMpKSwiIyIrZS5tYXAoaSxmdW5jdGlvbihlKXtyZXR1cm4gZT0oZXx8MCkudG9TdHJpbmcoMTYpLDE9PT1lLmxlbmd0aD8iMCIrZTplfSkuam9pbigiIil9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLl9yZ2JhWzNdPyJ0cmFuc3BhcmVudCI6dGhpcy50b1JnYmFTdHJpbmcoKX19KSxsLmZuLnBhcnNlLnByb3RvdHlwZT1sLmZuLHUuaHNsYS50bz1mdW5jdGlvbihlKXtpZihudWxsPT1lWzBdfHxudWxsPT1lWzFdfHxudWxsPT1lWzJdKXJldHVybltudWxsLG51bGwsbnVsbCxlWzNdXTt2YXIgdCxpLHM9ZVswXS8yNTUsbj1lWzFdLzI1NSxhPWVbMl0vMjU1LG89ZVszXSxyPU1hdGgubWF4KHMsbixhKSxoPU1hdGgubWluKHMsbixhKSxsPXItaCx1PXIraCxkPS41KnU7cmV0dXJuIHQ9aD09PXI/MDpzPT09cj82MCoobi1hKS9sKzM2MDpuPT09cj82MCooYS1zKS9sKzEyMDo2MCoocy1uKS9sKzI0MCxpPTA9PT1sPzA6LjU+PWQ/bC91OmwvKDItdSksW01hdGgucm91bmQodCklMzYwLGksZCxudWxsPT1vPzE6b119LHUuaHNsYS5mcm9tPWZ1bmN0aW9uKGUpe2lmKG51bGw9PWVbMF18fG51bGw9PWVbMV18fG51bGw9PWVbMl0pcmV0dXJuW251bGwsbnVsbCxudWxsLGVbM11dO3ZhciB0PWVbMF0vMzYwLGk9ZVsxXSxzPWVbMl0sYT1lWzNdLG89LjU+PXM/cyooMStpKTpzK2ktcyppLHI9MipzLW87cmV0dXJuW01hdGgucm91bmQoMjU1Km4ocixvLHQrMS8zKSksTWF0aC5yb3VuZCgyNTUqbihyLG8sdCkpLE1hdGgucm91bmQoMjU1Km4ocixvLHQtMS8zKSksYV19LGYodSxmdW5jdGlvbihzLG4pe3ZhciBhPW4ucHJvcHMsbz1uLmNhY2hlLGg9bi50byx1PW4uZnJvbTtsLmZuW3NdPWZ1bmN0aW9uKHMpe2lmKGgmJiF0aGlzW29dJiYodGhpc1tvXT1oKHRoaXMuX3JnYmEpKSxzPT09dClyZXR1cm4gdGhpc1tvXS5zbGljZSgpO3ZhciBuLHI9ZS50eXBlKHMpLGQ9ImFycmF5Ij09PXJ8fCJvYmplY3QiPT09cj9zOmFyZ3VtZW50cyxjPXRoaXNbb10uc2xpY2UoKTtyZXR1cm4gZihhLGZ1bmN0aW9uKGUsdCl7dmFyIHM9ZFsib2JqZWN0Ij09PXI/ZTp0LmlkeF07bnVsbD09cyYmKHM9Y1t0LmlkeF0pLGNbdC5pZHhdPWkocyx0KX0pLHU/KG49bCh1KGMpKSxuW29dPWMsbik6bChjKX0sZihhLGZ1bmN0aW9uKHQsaSl7bC5mblt0XXx8KGwuZm5bdF09ZnVuY3Rpb24obil7dmFyIGEsbz1lLnR5cGUobiksaD0iYWxwaGEiPT09dD90aGlzLl9oc2xhPyJoc2xhIjoicmdiYSI6cyxsPXRoaXNbaF0oKSx1PWxbaS5pZHhdO3JldHVybiJ1bmRlZmluZWQiPT09bz91OigiZnVuY3Rpb24iPT09byYmKG49bi5jYWxsKHRoaXMsdSksbz1lLnR5cGUobikpLG51bGw9PW4mJmkuZW1wdHk/dGhpczooInN0cmluZyI9PT1vJiYoYT1yLmV4ZWMobiksYSYmKG49dStwYXJzZUZsb2F0KGFbMl0pKigiKyI9PT1hWzFdPzE6LTEpKSksbFtpLmlkeF09bix0aGlzW2hdKGwpKSl9KX0pfSksbC5ob29rPWZ1bmN0aW9uKHQpe3ZhciBpPXQuc3BsaXQoIiAiKTtmKGksZnVuY3Rpb24odCxpKXtlLmNzc0hvb2tzW2ldPXtzZXQ6ZnVuY3Rpb24odCxuKXt2YXIgYSxvLHI9IiI7aWYoInRyYW5zcGFyZW50IiE9PW4mJigic3RyaW5nIiE9PWUudHlwZShuKXx8KGE9cyhuKSkpKXtpZihuPWwoYXx8biksIWMucmdiYSYmMSE9PW4uX3JnYmFbM10pe2ZvcihvPSJiYWNrZ3JvdW5kQ29sb3IiPT09aT90LnBhcmVudE5vZGU6dDsoIiI9PT1yfHwidHJhbnNwYXJlbnQiPT09cikmJm8mJm8uc3R5bGU7KXRyeXtyPWUuY3NzKG8sImJhY2tncm91bmRDb2xvciIpLG89by5wYXJlbnROb2RlfWNhdGNoKGgpe31uPW4uYmxlbmQociYmInRyYW5zcGFyZW50IiE9PXI/cjoiX2RlZmF1bHQiKX1uPW4udG9SZ2JhU3RyaW5nKCl9dHJ5e3Quc3R5bGVbaV09bn1jYXRjaChoKXt9fX0sZS5meC5zdGVwW2ldPWZ1bmN0aW9uKHQpe3QuY29sb3JJbml0fHwodC5zdGFydD1sKHQuZWxlbSxpKSx0LmVuZD1sKHQuZW5kKSx0LmNvbG9ySW5pdD0hMCksZS5jc3NIb29rc1tpXS5zZXQodC5lbGVtLHQuc3RhcnQudHJhbnNpdGlvbih0LmVuZCx0LnBvcykpfX0pfSxsLmhvb2sobyksZS5jc3NIb29rcy5ib3JkZXJDb2xvcj17ZXhwYW5kOmZ1bmN0aW9uKGUpe3ZhciB0PXt9O3JldHVybiBmKFsiVG9wIiwiUmlnaHQiLCJCb3R0b20iLCJMZWZ0Il0sZnVuY3Rpb24oaSxzKXt0WyJib3JkZXIiK3MrIkNvbG9yIl09ZX0pLHR9fSxhPWUuQ29sb3IubmFtZXM9e2FxdWE6IiMwMGZmZmYiLGJsYWNrOiIjMDAwMDAwIixibHVlOiIjMDAwMGZmIixmdWNoc2lhOiIjZmYwMGZmIixncmF5OiIjODA4MDgwIixncmVlbjoiIzAwODAwMCIsbGltZToiIzAwZmYwMCIsbWFyb29uOiIjODAwMDAwIixuYXZ5OiIjMDAwMDgwIixvbGl2ZToiIzgwODAwMCIscHVycGxlOiIjODAwMDgwIixyZWQ6IiNmZjAwMDAiLHNpbHZlcjoiI2MwYzBjMCIsdGVhbDoiIzAwODA4MCIsd2hpdGU6IiNmZmZmZmYiLHllbGxvdzoiI2ZmZmYwMCIsdHJhbnNwYXJlbnQ6W251bGwsbnVsbCxudWxsLDBdLF9kZWZhdWx0OiIjZmZmZmZmIn19KGIpLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt2YXIgaSxzLG49dC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3P3Qub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKHQsbnVsbCk6dC5jdXJyZW50U3R5bGUsYT17fTtpZihuJiZuLmxlbmd0aCYmblswXSYmbltuWzBdXSlmb3Iocz1uLmxlbmd0aDtzLS07KWk9bltzXSwic3RyaW5nIj09dHlwZW9mIG5baV0mJihhW2UuY2FtZWxDYXNlKGkpXT1uW2ldKTtlbHNlIGZvcihpIGluIG4pInN0cmluZyI9PXR5cGVvZiBuW2ldJiYoYVtpXT1uW2ldKTtyZXR1cm4gYX1mdW5jdGlvbiBpKHQsaSl7dmFyIHMsYSxvPXt9O2ZvcihzIGluIGkpYT1pW3NdLHRbc10hPT1hJiYobltzXXx8KGUuZnguc3RlcFtzXXx8IWlzTmFOKHBhcnNlRmxvYXQoYSkpKSYmKG9bc109YSkpO3JldHVybiBvfXZhciBzPVsiYWRkIiwicmVtb3ZlIiwidG9nZ2xlIl0sbj17Ym9yZGVyOjEsYm9yZGVyQm90dG9tOjEsYm9yZGVyQ29sb3I6MSxib3JkZXJMZWZ0OjEsYm9yZGVyUmlnaHQ6MSxib3JkZXJUb3A6MSxib3JkZXJXaWR0aDoxLG1hcmdpbjoxLHBhZGRpbmc6MX07ZS5lYWNoKFsiYm9yZGVyTGVmdFN0eWxlIiwiYm9yZGVyUmlnaHRTdHlsZSIsImJvcmRlckJvdHRvbVN0eWxlIiwiYm9yZGVyVG9wU3R5bGUiXSxmdW5jdGlvbih0LGkpe2UuZnguc3RlcFtpXT1mdW5jdGlvbihlKXsoIm5vbmUiIT09ZS5lbmQmJiFlLnNldEF0dHJ8fDE9PT1lLnBvcyYmIWUuc2V0QXR0cikmJihiLnN0eWxlKGUuZWxlbSxpLGUuZW5kKSxlLnNldEF0dHI9ITApfX0pLGUuZm4uYWRkQmFja3x8KGUuZm4uYWRkQmFjaz1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5hZGQobnVsbD09ZT90aGlzLnByZXZPYmplY3Q6dGhpcy5wcmV2T2JqZWN0LmZpbHRlcihlKSl9KSxlLmVmZmVjdHMuYW5pbWF0ZUNsYXNzPWZ1bmN0aW9uKG4sYSxvLHIpe3ZhciBoPWUuc3BlZWQoYSxvLHIpO3JldHVybiB0aGlzLnF1ZXVlKGZ1bmN0aW9uKCl7dmFyIGEsbz1lKHRoaXMpLHI9by5hdHRyKCJjbGFzcyIpfHwiIixsPWguY2hpbGRyZW4/by5maW5kKCIqIikuYWRkQmFjaygpOm87bD1sLm1hcChmdW5jdGlvbigpe3ZhciBpPWUodGhpcyk7cmV0dXJue2VsOmksc3RhcnQ6dCh0aGlzKX19KSxhPWZ1bmN0aW9uKCl7ZS5lYWNoKHMsZnVuY3Rpb24oZSx0KXtuW3RdJiZvW3QrIkNsYXNzIl0oblt0XSl9KX0sYSgpLGw9bC5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbmQ9dCh0aGlzLmVsWzBdKSx0aGlzLmRpZmY9aSh0aGlzLnN0YXJ0LHRoaXMuZW5kKSx0aGlzfSksby5hdHRyKCJjbGFzcyIsciksbD1sLm1hcChmdW5jdGlvbigpe3ZhciB0PXRoaXMsaT1lLkRlZmVycmVkKCkscz1lLmV4dGVuZCh7fSxoLHtxdWV1ZTohMSxjb21wbGV0ZTpmdW5jdGlvbigpe2kucmVzb2x2ZSh0KX19KTtyZXR1cm4gdGhpcy5lbC5hbmltYXRlKHRoaXMuZGlmZixzKSxpLnByb21pc2UoKX0pLGUud2hlbi5hcHBseShlLGwuZ2V0KCkpLmRvbmUoZnVuY3Rpb24oKXthKCksZS5lYWNoKGFyZ3VtZW50cyxmdW5jdGlvbigpe3ZhciB0PXRoaXMuZWw7ZS5lYWNoKHRoaXMuZGlmZixmdW5jdGlvbihlKXt0LmNzcyhlLCIiKX0pfSksaC5jb21wbGV0ZS5jYWxsKG9bMF0pfSl9KX0sZS5mbi5leHRlbmQoe2FkZENsYXNzOmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihpLHMsbixhKXtyZXR1cm4gcz9lLmVmZmVjdHMuYW5pbWF0ZUNsYXNzLmNhbGwodGhpcyx7YWRkOml9LHMsbixhKTp0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX19KGUuZm4uYWRkQ2xhc3MpLHJlbW92ZUNsYXNzOmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihpLHMsbixhKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4xP2UuZWZmZWN0cy5hbmltYXRlQ2xhc3MuY2FsbCh0aGlzLHtyZW1vdmU6aX0scyxuLGEpOnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfX0oZS5mbi5yZW1vdmVDbGFzcyksdG9nZ2xlQ2xhc3M6ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGkscyxuLGEsbyl7cmV0dXJuImJvb2xlYW4iPT10eXBlb2Ygc3x8dm9pZCAwPT09cz9uP2UuZWZmZWN0cy5hbmltYXRlQ2xhc3MuY2FsbCh0aGlzLHM/e2FkZDppfTp7cmVtb3ZlOml9LG4sYSxvKTp0LmFwcGx5KHRoaXMsYXJndW1lbnRzKTplLmVmZmVjdHMuYW5pbWF0ZUNsYXNzLmNhbGwodGhpcyx7dG9nZ2xlOml9LHMsbixhKX19KGUuZm4udG9nZ2xlQ2xhc3MpLHN3aXRjaENsYXNzOmZ1bmN0aW9uKHQsaSxzLG4sYSl7cmV0dXJuIGUuZWZmZWN0cy5hbmltYXRlQ2xhc3MuY2FsbCh0aGlzLHthZGQ6aSxyZW1vdmU6dH0scyxuLGEpfX0pfSgpLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGkscyxuKXtyZXR1cm4gZS5pc1BsYWluT2JqZWN0KHQpJiYoaT10LHQ9dC5lZmZlY3QpLHQ9e2VmZmVjdDp0fSxudWxsPT1pJiYoaT17fSksZS5pc0Z1bmN0aW9uKGkpJiYobj1pLHM9bnVsbCxpPXt9KSwoIm51bWJlciI9PXR5cGVvZiBpfHxlLmZ4LnNwZWVkc1tpXSkmJihuPXMscz1pLGk9e30pLGUuaXNGdW5jdGlvbihzKSYmKG49cyxzPW51bGwpLGkmJmUuZXh0ZW5kKHQsaSkscz1zfHxpLmR1cmF0aW9uLHQuZHVyYXRpb249ZS5meC5vZmY/MDoibnVtYmVyIj09dHlwZW9mIHM/czpzIGluIGUuZnguc3BlZWRzP2UuZnguc3BlZWRzW3NdOmUuZnguc3BlZWRzLl9kZWZhdWx0LHQuY29tcGxldGU9bnx8aS5jb21wbGV0ZSx0fWZ1bmN0aW9uIGkodCl7cmV0dXJuIXR8fCJudW1iZXIiPT10eXBlb2YgdHx8ZS5meC5zcGVlZHNbdF0/ITA6InN0cmluZyIhPXR5cGVvZiB0fHxlLmVmZmVjdHMuZWZmZWN0W3RdP2UuaXNGdW5jdGlvbih0KT8hMDoib2JqZWN0IiE9dHlwZW9mIHR8fHQuZWZmZWN0PyExOiEwOiEwfWUuZXh0ZW5kKGUuZWZmZWN0cyx7dmVyc2lvbjoiMS4xMS40IixzYXZlOmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBpPTA7dC5sZW5ndGg+aTtpKyspbnVsbCE9PXRbaV0mJmUuZGF0YSh5K3RbaV0sZVswXS5zdHlsZVt0W2ldXSl9LHJlc3RvcmU6ZnVuY3Rpb24oZSx0KXt2YXIgaSxzO2ZvcihzPTA7dC5sZW5ndGg+cztzKyspbnVsbCE9PXRbc10mJihpPWUuZGF0YSh5K3Rbc10pLHZvaWQgMD09PWkmJihpPSIiKSxlLmNzcyh0W3NdLGkpKX0sc2V0TW9kZTpmdW5jdGlvbihlLHQpe3JldHVybiJ0b2dnbGUiPT09dCYmKHQ9ZS5pcygiOmhpZGRlbiIpPyJzaG93IjoiaGlkZSIpLHR9LGdldEJhc2VsaW5lOmZ1bmN0aW9uKGUsdCl7dmFyIGkscztzd2l0Y2goZVswXSl7Y2FzZSJ0b3AiOmk9MDticmVhaztjYXNlIm1pZGRsZSI6aT0uNTticmVhaztjYXNlImJvdHRvbSI6aT0xO2JyZWFrO2RlZmF1bHQ6aT1lWzBdL3QuaGVpZ2h0fXN3aXRjaChlWzFdKXtjYXNlImxlZnQiOnM9MDticmVhaztjYXNlImNlbnRlciI6cz0uNTticmVhaztjYXNlInJpZ2h0IjpzPTE7YnJlYWs7ZGVmYXVsdDpzPWVbMV0vdC53aWR0aH1yZXR1cm57eDpzLHk6aX19LGNyZWF0ZVdyYXBwZXI6ZnVuY3Rpb24odCl7aWYodC5wYXJlbnQoKS5pcygiLnVpLWVmZmVjdHMtd3JhcHBlciIpKXJldHVybiB0LnBhcmVudCgpO3ZhciBpPXt3aWR0aDp0Lm91dGVyV2lkdGgoITApLGhlaWdodDp0Lm91dGVySGVpZ2h0KCEwKSwiZmxvYXQiOnQuY3NzKCJmbG9hdCIpfSxzPWUoIjxkaXY+PC9kaXY+IikuYWRkQ2xhc3MoInVpLWVmZmVjdHMtd3JhcHBlciIpLmNzcyh7Zm9udFNpemU6IjEwMCUiLGJhY2tncm91bmQ6InRyYW5zcGFyZW50Iixib3JkZXI6Im5vbmUiLG1hcmdpbjowLHBhZGRpbmc6MH0pLG49e3dpZHRoOnQud2lkdGgoKSxoZWlnaHQ6dC5oZWlnaHQoKX0sYT1kb2N1bWVudC5hY3RpdmVFbGVtZW50O3RyeXthLmlkfWNhdGNoKG8pe2E9ZG9jdW1lbnQuYm9keX1yZXR1cm4gdC53cmFwKHMpLCh0WzBdPT09YXx8ZS5jb250YWlucyh0WzBdLGEpKSYmZShhKS5mb2N1cygpLHM9dC5wYXJlbnQoKSwic3RhdGljIj09PXQuY3NzKCJwb3NpdGlvbiIpPyhzLmNzcyh7cG9zaXRpb246InJlbGF0aXZlIn0pLHQuY3NzKHtwb3NpdGlvbjoicmVsYXRpdmUifSkpOihlLmV4dGVuZChpLHtwb3NpdGlvbjp0LmNzcygicG9zaXRpb24iKSx6SW5kZXg6dC5jc3MoInotaW5kZXgiKX0pLGUuZWFjaChbInRvcCIsImxlZnQiLCJib3R0b20iLCJyaWdodCJdLGZ1bmN0aW9uKGUscyl7aVtzXT10LmNzcyhzKSxpc05hTihwYXJzZUludChpW3NdLDEwKSkmJihpW3NdPSJhdXRvIil9KSx0LmNzcyh7cG9zaXRpb246InJlbGF0aXZlIix0b3A6MCxsZWZ0OjAscmlnaHQ6ImF1dG8iLGJvdHRvbToiYXV0byJ9KSksdC5jc3Mobikscy5jc3MoaSkuc2hvdygpfSxyZW1vdmVXcmFwcGVyOmZ1bmN0aW9uKHQpe3ZhciBpPWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7cmV0dXJuIHQucGFyZW50KCkuaXMoIi51aS1lZmZlY3RzLXdyYXBwZXIiKSYmKHQucGFyZW50KCkucmVwbGFjZVdpdGgodCksKHRbMF09PT1pfHxlLmNvbnRhaW5zKHRbMF0saSkpJiZlKGkpLmZvY3VzKCkpLHR9LHNldFRyYW5zaXRpb246ZnVuY3Rpb24odCxpLHMsbil7cmV0dXJuIG49bnx8e30sZS5lYWNoKGksZnVuY3Rpb24oZSxpKXt2YXIgYT10LmNzc1VuaXQoaSk7YVswXT4wJiYobltpXT1hWzBdKnMrYVsxXSl9KSxufX0pLGUuZm4uZXh0ZW5kKHtlZmZlY3Q6ZnVuY3Rpb24oKXtmdW5jdGlvbiBpKHQpe2Z1bmN0aW9uIGkoKXtlLmlzRnVuY3Rpb24oYSkmJmEuY2FsbChuWzBdKSxlLmlzRnVuY3Rpb24odCkmJnQoKX12YXIgbj1lKHRoaXMpLGE9cy5jb21wbGV0ZSxyPXMubW9kZTsobi5pcygiOmhpZGRlbiIpPyJoaWRlIj09PXI6InNob3ciPT09cik/KG5bcl0oKSxpKCkpOm8uY2FsbChuWzBdLHMsaSl9dmFyIHM9dC5hcHBseSh0aGlzLGFyZ3VtZW50cyksbj1zLm1vZGUsYT1zLnF1ZXVlLG89ZS5lZmZlY3RzLmVmZmVjdFtzLmVmZmVjdF07cmV0dXJuIGUuZngub2ZmfHwhbz9uP3RoaXNbbl0ocy5kdXJhdGlvbixzLmNvbXBsZXRlKTp0aGlzLmVhY2goZnVuY3Rpb24oKXtzLmNvbXBsZXRlJiZzLmNvbXBsZXRlLmNhbGwodGhpcyl9KTphPT09ITE/dGhpcy5lYWNoKGkpOnRoaXMucXVldWUoYXx8ImZ4IixpKX0sc2hvdzpmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24ocyl7aWYoaShzKSlyZXR1cm4gZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIG49dC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIG4ubW9kZT0ic2hvdyIsdGhpcy5lZmZlY3QuY2FsbCh0aGlzLG4pfX0oZS5mbi5zaG93KSxoaWRlOmZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbihzKXtpZihpKHMpKXJldHVybiBlLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgbj10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gbi5tb2RlPSJoaWRlIix0aGlzLmVmZmVjdC5jYWxsKHRoaXMsbil9fShlLmZuLmhpZGUpLHRvZ2dsZTpmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24ocyl7aWYoaShzKXx8ImJvb2xlYW4iPT10eXBlb2YgcylyZXR1cm4gZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIG49dC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIG4ubW9kZT0idG9nZ2xlIix0aGlzLmVmZmVjdC5jYWxsKHRoaXMsbil9fShlLmZuLnRvZ2dsZSksY3NzVW5pdDpmdW5jdGlvbih0KXt2YXIgaT10aGlzLmNzcyh0KSxzPVtdO3JldHVybiBlLmVhY2goWyJlbSIsInB4IiwiJSIsInB0Il0sZnVuY3Rpb24oZSx0KXtpLmluZGV4T2YodCk+MCYmKHM9W3BhcnNlRmxvYXQoaSksdF0pfSksc319KX0oKSxmdW5jdGlvbigpe3ZhciB0PXt9O2UuZWFjaChbIlF1YWQiLCJDdWJpYyIsIlF1YXJ0IiwiUXVpbnQiLCJFeHBvIl0sZnVuY3Rpb24oZSxpKXt0W2ldPWZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnBvdyh0LGUrMil9fSksZS5leHRlbmQodCx7U2luZTpmdW5jdGlvbihlKXtyZXR1cm4gMS1NYXRoLmNvcyhlKk1hdGguUEkvMil9LENpcmM6ZnVuY3Rpb24oZSl7cmV0dXJuIDEtTWF0aC5zcXJ0KDEtZSplKX0sRWxhc3RpYzpmdW5jdGlvbihlKXtyZXR1cm4gMD09PWV8fDE9PT1lP2U6LU1hdGgucG93KDIsOCooZS0xKSkqTWF0aC5zaW4oKDgwKihlLTEpLTcuNSkqTWF0aC5QSS8xNSl9LEJhY2s6ZnVuY3Rpb24oZSl7cmV0dXJuIGUqZSooMyplLTIpfSxCb3VuY2U6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0LGk9NDsoKHQ9TWF0aC5wb3coMiwtLWkpKS0xKS8xMT5lOyk7cmV0dXJuIDEvTWF0aC5wb3coNCwzLWkpLTcuNTYyNSpNYXRoLnBvdygoMyp0LTIpLzIyLWUsMil9fSksZS5lYWNoKHQsZnVuY3Rpb24odCxpKXtlLmVhc2luZ1siZWFzZUluIit0XT1pLGUuZWFzaW5nWyJlYXNlT3V0Iit0XT1mdW5jdGlvbihlKXtyZXR1cm4gMS1pKDEtZSl9LGUuZWFzaW5nWyJlYXNlSW5PdXQiK3RdPWZ1bmN0aW9uKGUpe3JldHVybi41PmU/aSgyKmUpLzI6MS1pKC0yKmUrMikvMn19KX0oKSxlLmVmZmVjdHMsZS5lZmZlY3RzLmVmZmVjdC5ibGluZD1mdW5jdGlvbih0LGkpe3ZhciBzLG4sYSxvPWUodGhpcykscj0vdXB8ZG93bnx2ZXJ0aWNhbC8saD0vdXB8bGVmdHx2ZXJ0aWNhbHxob3Jpem9udGFsLyxsPVsicG9zaXRpb24iLCJ0b3AiLCJib3R0b20iLCJsZWZ0IiwicmlnaHQiLCJoZWlnaHQiLCJ3aWR0aCJdLHU9ZS5lZmZlY3RzLnNldE1vZGUobyx0Lm1vZGV8fCJoaWRlIiksZD10LmRpcmVjdGlvbnx8InVwIixjPXIudGVzdChkKSxwPWM/ImhlaWdodCI6IndpZHRoIixmPWM/InRvcCI6ImxlZnQiLG09aC50ZXN0KGQpLGc9e30sdj0ic2hvdyI9PT11O28ucGFyZW50KCkuaXMoIi51aS1lZmZlY3RzLXdyYXBwZXIiKT9lLmVmZmVjdHMuc2F2ZShvLnBhcmVudCgpLGwpOmUuZWZmZWN0cy5zYXZlKG8sbCksby5zaG93KCkscz1lLmVmZmVjdHMuY3JlYXRlV3JhcHBlcihvKS5jc3Moe292ZXJmbG93OiJoaWRkZW4ifSksbj1zW3BdKCksYT1wYXJzZUZsb2F0KHMuY3NzKGYpKXx8MCxnW3BdPXY/bjowLG18fChvLmNzcyhjPyJib3R0b20iOiJyaWdodCIsMCkuY3NzKGM/InRvcCI6ImxlZnQiLCJhdXRvIikuY3NzKHtwb3NpdGlvbjoiYWJzb2x1dGUifSksZ1tmXT12P2E6bithKSx2JiYocy5jc3MocCwwKSxtfHxzLmNzcyhmLGErbikpLHMuYW5pbWF0ZShnLHtkdXJhdGlvbjp0LmR1cmF0aW9uLGVhc2luZzp0LmVhc2luZyxxdWV1ZTohMSxjb21wbGV0ZTpmdW5jdGlvbigpeyJoaWRlIj09PXUmJm8uaGlkZSgpLGUuZWZmZWN0cy5yZXN0b3JlKG8sbCksZS5lZmZlY3RzLnJlbW92ZVdyYXBwZXIobyksaSgpfX0pfSxlLmVmZmVjdHMuZWZmZWN0LmJvdW5jZT1mdW5jdGlvbih0LGkpe3ZhciBzLG4sYSxvPWUodGhpcykscj1bInBvc2l0aW9uIiwidG9wIiwiYm90dG9tIiwibGVmdCIsInJpZ2h0IiwiaGVpZ2h0Iiwid2lkdGgiXSxoPWUuZWZmZWN0cy5zZXRNb2RlKG8sdC5tb2RlfHwiZWZmZWN0IiksbD0iaGlkZSI9PT1oLHU9InNob3ciPT09aCxkPXQuZGlyZWN0aW9ufHwidXAiLGM9dC5kaXN0YW5jZSxwPXQudGltZXN8fDUsZj0yKnArKHV8fGw/MTowKSxtPXQuZHVyYXRpb24vZixnPXQuZWFzaW5nLHY9InVwIj09PWR8fCJkb3duIj09PWQ/InRvcCI6ImxlZnQiLHk9InVwIj09PWR8fCJsZWZ0Ij09PWQsYj1vLnF1ZXVlKCksXz1iLmxlbmd0aDtmb3IoKHV8fGwpJiZyLnB1c2goIm9wYWNpdHkiKSxlLmVmZmVjdHMuc2F2ZShvLHIpLG8uc2hvdygpLGUuZWZmZWN0cy5jcmVhdGVXcmFwcGVyKG8pLGN8fChjPW9bInRvcCI9PT12PyJvdXRlckhlaWdodCI6Im91dGVyV2lkdGgiXSgpLzMpLHUmJihhPXtvcGFjaXR5OjF9LGFbdl09MCxvLmNzcygib3BhY2l0eSIsMCkuY3NzKHYseT8yKi1jOjIqYykuYW5pbWF0ZShhLG0sZykpLGwmJihjLz1NYXRoLnBvdygyLHAtMSkpLGE9e30sYVt2XT0wLHM9MDtwPnM7cysrKW49e30sblt2XT0oeT8iLT0iOiIrPSIpK2Msby5hbmltYXRlKG4sbSxnKS5hbmltYXRlKGEsbSxnKSxjPWw/MipjOmMvMjtsJiYobj17b3BhY2l0eTowfSxuW3ZdPSh5PyItPSI6Iis9IikrYyxvLmFuaW1hdGUobixtLGcpKSxvLnF1ZXVlKGZ1bmN0aW9uKCl7bCYmby5oaWRlKCksZS5lZmZlY3RzLnJlc3RvcmUobyxyKSxlLmVmZmVjdHMucmVtb3ZlV3JhcHBlcihvKSxpKCl9KSxfPjEmJmIuc3BsaWNlLmFwcGx5KGIsWzEsMF0uY29uY2F0KGIuc3BsaWNlKF8sZisxKSkpLG8uZGVxdWV1ZSgpfSxlLmVmZmVjdHMuZWZmZWN0LmNsaXA9ZnVuY3Rpb24odCxpKXt2YXIgcyxuLGEsbz1lKHRoaXMpLHI9WyJwb3NpdGlvbiIsInRvcCIsImJvdHRvbSIsImxlZnQiLCJyaWdodCIsImhlaWdodCIsIndpZHRoIl0saD1lLmVmZmVjdHMuc2V0TW9kZShvLHQubW9kZXx8ImhpZGUiKSxsPSJzaG93Ij09PWgsdT10LmRpcmVjdGlvbnx8InZlcnRpY2FsIixkPSJ2ZXJ0aWNhbCI9PT11LGM9ZD8iaGVpZ2h0Ijoid2lkdGgiLHA9ZD8idG9wIjoibGVmdCIsZj17fTtlLmVmZmVjdHMuc2F2ZShvLHIpLG8uc2hvdygpLHM9ZS5lZmZlY3RzLmNyZWF0ZVdyYXBwZXIobykuY3NzKHtvdmVyZmxvdzoiaGlkZGVuIn0pLG49IklNRyI9PT1vWzBdLnRhZ05hbWU/czpvLGE9bltjXSgpLGwmJihuLmNzcyhjLDApLG4uY3NzKHAsYS8yKSksZltjXT1sP2E6MCxmW3BdPWw/MDphLzIsbi5hbmltYXRlKGYse3F1ZXVlOiExLGR1cmF0aW9uOnQuZHVyYXRpb24sZWFzaW5nOnQuZWFzaW5nLGNvbXBsZXRlOmZ1bmN0aW9uKCl7bHx8by5oaWRlKCksZS5lZmZlY3RzLnJlc3RvcmUobyxyKSxlLmVmZmVjdHMucmVtb3ZlV3JhcHBlcihvKSxpKCl9fSl9LGUuZWZmZWN0cy5lZmZlY3QuZHJvcD1mdW5jdGlvbih0LGkpe3ZhciBzLG49ZSh0aGlzKSxhPVsicG9zaXRpb24iLCJ0b3AiLCJib3R0b20iLCJsZWZ0IiwicmlnaHQiLCJvcGFjaXR5IiwiaGVpZ2h0Iiwid2lkdGgiXSxvPWUuZWZmZWN0cy5zZXRNb2RlKG4sdC5tb2RlfHwiaGlkZSIpLHI9InNob3ciPT09byxoPXQuZGlyZWN0aW9ufHwibGVmdCIsbD0idXAiPT09aHx8ImRvd24iPT09aD8idG9wIjoibGVmdCIsdT0idXAiPT09aHx8ImxlZnQiPT09aD8icG9zIjoibmVnIixkPXtvcGFjaXR5OnI/MTowfTtlLmVmZmVjdHMuc2F2ZShuLGEpLG4uc2hvdygpLGUuZWZmZWN0cy5jcmVhdGVXcmFwcGVyKG4pLHM9dC5kaXN0YW5jZXx8blsidG9wIj09PWw/Im91dGVySGVpZ2h0Ijoib3V0ZXJXaWR0aCJdKCEwKS8yLHImJm4uY3NzKCJvcGFjaXR5IiwwKS5jc3MobCwicG9zIj09PXU/LXM6cyksZFtsXT0ocj8icG9zIj09PXU/Iis9IjoiLT0iOiJwb3MiPT09dT8iLT0iOiIrPSIpK3Msbi5hbmltYXRlKGQse3F1ZXVlOiExLGR1cmF0aW9uOnQuZHVyYXRpb24sZWFzaW5nOnQuZWFzaW5nLGNvbXBsZXRlOmZ1bmN0aW9uKCl7ImhpZGUiPT09byYmbi5oaWRlKCksZS5lZmZlY3RzLnJlc3RvcmUobixhKSxlLmVmZmVjdHMucmVtb3ZlV3JhcHBlcihuKSxpKCl9fSl9LGUuZWZmZWN0cy5lZmZlY3QuZXhwbG9kZT1mdW5jdGlvbih0LGkpe2Z1bmN0aW9uIHMoKXtiLnB1c2godGhpcyksYi5sZW5ndGg9PT1kKmMmJm4oKX1mdW5jdGlvbiBuKCl7cC5jc3Moe3Zpc2liaWxpdHk6InZpc2libGUifSksZShiKS5yZW1vdmUoKSxtfHxwLmhpZGUoKSxpKCl9dmFyIGEsbyxyLGgsbCx1LGQ9dC5waWVjZXM/TWF0aC5yb3VuZChNYXRoLnNxcnQodC5waWVjZXMpKTozLGM9ZCxwPWUodGhpcyksZj1lLmVmZmVjdHMuc2V0TW9kZShwLHQubW9kZXx8ImhpZGUiKSxtPSJzaG93Ij09PWYsZz1wLnNob3coKS5jc3MoInZpc2liaWxpdHkiLCJoaWRkZW4iKS5vZmZzZXQoKSx2PU1hdGguY2VpbChwLm91dGVyV2lkdGgoKS9jKSx5PU1hdGguY2VpbChwLm91dGVySGVpZ2h0KCkvZCksYj1bXTtmb3IoYT0wO2Q+YTthKyspZm9yKGg9Zy50b3ArYSp5LHU9YS0oZC0xKS8yLG89MDtjPm87bysrKXI9Zy5sZWZ0K28qdixsPW8tKGMtMSkvMixwLmNsb25lKCkuYXBwZW5kVG8oImJvZHkiKS53cmFwKCI8ZGl2PjwvZGl2PiIpLmNzcyh7cG9zaXRpb246ImFic29sdXRlIix2aXNpYmlsaXR5OiJ2aXNpYmxlIixsZWZ0Oi1vKnYsdG9wOi1hKnl9KS5wYXJlbnQoKS5hZGRDbGFzcygidWktZWZmZWN0cy1leHBsb2RlIikuY3NzKHtwb3NpdGlvbjoiYWJzb2x1dGUiLG92ZXJmbG93OiJoaWRkZW4iLHdpZHRoOnYsaGVpZ2h0OnksbGVmdDpyKyhtP2wqdjowKSx0b3A6aCsobT91Knk6MCksb3BhY2l0eTptPzA6MX0pLmFuaW1hdGUoe2xlZnQ6cisobT8wOmwqdiksdG9wOmgrKG0/MDp1KnkpLG9wYWNpdHk6bT8xOjB9LHQuZHVyYXRpb258fDUwMCx0LmVhc2luZyxzKX0sZS5lZmZlY3RzLmVmZmVjdC5mYWRlPWZ1bmN0aW9uKHQsaSl7dmFyIHM9ZSh0aGlzKSxuPWUuZWZmZWN0cy5zZXRNb2RlKHMsdC5tb2RlfHwidG9nZ2xlIik7cy5hbmltYXRlKHtvcGFjaXR5Om59LHtxdWV1ZTohMSxkdXJhdGlvbjp0LmR1cmF0aW9uLGVhc2luZzp0LmVhc2luZyxjb21wbGV0ZTppfSl9LGUuZWZmZWN0cy5lZmZlY3QuZm9sZD1mdW5jdGlvbih0LGkpe3ZhciBzLG4sYT1lKHRoaXMpLG89WyJwb3NpdGlvbiIsInRvcCIsImJvdHRvbSIsImxlZnQiLCJyaWdodCIsImhlaWdodCIsIndpZHRoIl0scj1lLmVmZmVjdHMuc2V0TW9kZShhLHQubW9kZXx8ImhpZGUiKSxoPSJzaG93Ij09PXIsbD0iaGlkZSI9PT1yLHU9dC5zaXplfHwxNSxkPS8oWzAtOV0rKSUvLmV4ZWModSksYz0hIXQuaG9yaXpGaXJzdCxwPWghPT1jLGY9cD9bIndpZHRoIiwiaGVpZ2h0Il06WyJoZWlnaHQiLCJ3aWR0aCJdLG09dC5kdXJhdGlvbi8yLGc9e30sdj17fTtlLmVmZmVjdHMuc2F2ZShhLG8pLGEuc2hvdygpLHM9ZS5lZmZlY3RzLmNyZWF0ZVdyYXBwZXIoYSkuY3NzKHtvdmVyZmxvdzoiaGlkZGVuIn0pLG49cD9bcy53aWR0aCgpLHMuaGVpZ2h0KCldOltzLmhlaWdodCgpLHMud2lkdGgoKV0sZCYmKHU9cGFyc2VJbnQoZFsxXSwxMCkvMTAwKm5bbD8wOjFdKSxoJiZzLmNzcyhjP3toZWlnaHQ6MCx3aWR0aDp1fTp7aGVpZ2h0OnUsd2lkdGg6MH0pLGdbZlswXV09aD9uWzBdOnUsdltmWzFdXT1oP25bMV06MCxzLmFuaW1hdGUoZyxtLHQuZWFzaW5nKS5hbmltYXRlKHYsbSx0LmVhc2luZyxmdW5jdGlvbigpe2wmJmEuaGlkZSgpLGUuZWZmZWN0cy5yZXN0b3JlKGEsbyksZS5lZmZlY3RzLnJlbW92ZVdyYXBwZXIoYSksaSgpfSl9LGUuZWZmZWN0cy5lZmZlY3QuaGlnaGxpZ2h0PWZ1bmN0aW9uKHQsaSl7dmFyIHM9ZSh0aGlzKSxuPVsiYmFja2dyb3VuZEltYWdlIiwiYmFja2dyb3VuZENvbG9yIiwib3BhY2l0eSJdLGE9ZS5lZmZlY3RzLnNldE1vZGUocyx0Lm1vZGV8fCJzaG93Iiksbz17YmFja2dyb3VuZENvbG9yOnMuY3NzKCJiYWNrZ3JvdW5kQ29sb3IiKX07ImhpZGUiPT09YSYmKG8ub3BhY2l0eT0wKSxlLmVmZmVjdHMuc2F2ZShzLG4pLHMuc2hvdygpLmNzcyh7YmFja2dyb3VuZEltYWdlOiJub25lIixiYWNrZ3JvdW5kQ29sb3I6dC5jb2xvcnx8IiNmZmZmOTkifSkuYW5pbWF0ZShvLHtxdWV1ZTohMSxkdXJhdGlvbjp0LmR1cmF0aW9uLGVhc2luZzp0LmVhc2luZyxjb21wbGV0ZTpmdW5jdGlvbigpeyJoaWRlIj09PWEmJnMuaGlkZSgpLGUuZWZmZWN0cy5yZXN0b3JlKHMsbiksaSgpfX0pfSxlLmVmZmVjdHMuZWZmZWN0LnNpemU9ZnVuY3Rpb24odCxpKXt2YXIgcyxuLGEsbz1lKHRoaXMpLHI9WyJwb3NpdGlvbiIsInRvcCIsImJvdHRvbSIsImxlZnQiLCJyaWdodCIsIndpZHRoIiwiaGVpZ2h0Iiwib3ZlcmZsb3ciLCJvcGFjaXR5Il0saD1bInBvc2l0aW9uIiwidG9wIiwiYm90dG9tIiwibGVmdCIsInJpZ2h0Iiwib3ZlcmZsb3ciLCJvcGFjaXR5Il0sbD1bIndpZHRoIiwiaGVpZ2h0Iiwib3ZlcmZsb3ciXSx1PVsiZm9udFNpemUiXSxkPVsiYm9yZGVyVG9wV2lkdGgiLCJib3JkZXJCb3R0b21XaWR0aCIsInBhZGRpbmdUb3AiLCJwYWRkaW5nQm90dG9tIl0sYz1bImJvcmRlckxlZnRXaWR0aCIsImJvcmRlclJpZ2h0V2lkdGgiLCJwYWRkaW5nTGVmdCIsInBhZGRpbmdSaWdodCJdLHA9ZS5lZmZlY3RzLnNldE1vZGUobyx0Lm1vZGV8fCJlZmZlY3QiKSxmPXQucmVzdG9yZXx8ImVmZmVjdCIhPT1wLG09dC5zY2FsZXx8ImJvdGgiLGc9dC5vcmlnaW58fFsibWlkZGxlIiwiY2VudGVyIl0sdj1vLmNzcygicG9zaXRpb24iKSx5PWY/cjpoLGI9e2hlaWdodDowLHdpZHRoOjAsb3V0ZXJIZWlnaHQ6MCxvdXRlcldpZHRoOjB9OyJzaG93Ij09PXAmJm8uc2hvdygpLHM9e2hlaWdodDpvLmhlaWdodCgpLHdpZHRoOm8ud2lkdGgoKSxvdXRlckhlaWdodDpvLm91dGVySGVpZ2h0KCksb3V0ZXJXaWR0aDpvLm91dGVyV2lkdGgoKX0sInRvZ2dsZSI9PT10Lm1vZGUmJiJzaG93Ij09PXA/KG8uZnJvbT10LnRvfHxiLG8udG89dC5mcm9tfHxzKTooby5mcm9tPXQuZnJvbXx8KCJzaG93Ij09PXA/YjpzKSxvLnRvPXQudG98fCgiaGlkZSI9PT1wP2I6cykpLGE9e2Zyb206e3k6by5mcm9tLmhlaWdodC9zLmhlaWdodCx4Om8uZnJvbS53aWR0aC9zLndpZHRofSx0bzp7eTpvLnRvLmhlaWdodC9zLmhlaWdodCx4Om8udG8ud2lkdGgvcy53aWR0aH19LCgiYm94Ij09PW18fCJib3RoIj09PW0pJiYoYS5mcm9tLnkhPT1hLnRvLnkmJih5PXkuY29uY2F0KGQpLG8uZnJvbT1lLmVmZmVjdHMuc2V0VHJhbnNpdGlvbihvLGQsYS5mcm9tLnksby5mcm9tKSxvLnRvPWUuZWZmZWN0cy5zZXRUcmFuc2l0aW9uKG8sZCxhLnRvLnksby50bykpLGEuZnJvbS54IT09YS50by54JiYoeT15LmNvbmNhdChjKSxvLmZyb209ZS5lZmZlY3RzLnNldFRyYW5zaXRpb24obyxjLGEuZnJvbS54LG8uZnJvbSksby50bz1lLmVmZmVjdHMuc2V0VHJhbnNpdGlvbihvLGMsYS50by54LG8udG8pKSksKCJjb250ZW50Ij09PW18fCJib3RoIj09PW0pJiZhLmZyb20ueSE9PWEudG8ueSYmKHk9eS5jb25jYXQodSkuY29uY2F0KGwpLG8uZnJvbT1lLmVmZmVjdHMuc2V0VHJhbnNpdGlvbihvLHUsYS5mcm9tLnksby5mcm9tKSxvLnRvPWUuZWZmZWN0cy5zZXRUcmFuc2l0aW9uKG8sdSxhLnRvLnksby50bykpLGUuZWZmZWN0cy5zYXZlKG8seSksby5zaG93KCksZS5lZmZlY3RzLmNyZWF0ZVdyYXBwZXIobyksby5jc3MoIm92ZXJmbG93IiwiaGlkZGVuIikuY3NzKG8uZnJvbSksZyYmKG49ZS5lZmZlY3RzLmdldEJhc2VsaW5lKGcscyksby5mcm9tLnRvcD0ocy5vdXRlckhlaWdodC1vLm91dGVySGVpZ2h0KCkpKm4ueSxvLmZyb20ubGVmdD0ocy5vdXRlcldpZHRoLW8ub3V0ZXJXaWR0aCgpKSpuLngsby50by50b3A9KHMub3V0ZXJIZWlnaHQtby50by5vdXRlckhlaWdodCkqbi55LG8udG8ubGVmdD0ocy5vdXRlcldpZHRoLW8udG8ub3V0ZXJXaWR0aCkqbi54KSxvLmNzcyhvLmZyb20pLCgiY29udGVudCI9PT1tfHwiYm90aCI9PT1tKSYmKGQ9ZC5jb25jYXQoWyJtYXJnaW5Ub3AiLCJtYXJnaW5Cb3R0b20iXSkuY29uY2F0KHUpLGM9Yy5jb25jYXQoWyJtYXJnaW5MZWZ0IiwibWFyZ2luUmlnaHQiXSksbD1yLmNvbmNhdChkKS5jb25jYXQoYyksby5maW5kKCIqW3dpZHRoXSIpLmVhY2goZnVuY3Rpb24oKXt2YXIgaT1lKHRoaXMpLHM9e2hlaWdodDppLmhlaWdodCgpLHdpZHRoOmkud2lkdGgoKSxvdXRlckhlaWdodDppLm91dGVySGVpZ2h0KCksb3V0ZXJXaWR0aDppLm91dGVyV2lkdGgoKX07CmYmJmUuZWZmZWN0cy5zYXZlKGksbCksaS5mcm9tPXtoZWlnaHQ6cy5oZWlnaHQqYS5mcm9tLnksd2lkdGg6cy53aWR0aCphLmZyb20ueCxvdXRlckhlaWdodDpzLm91dGVySGVpZ2h0KmEuZnJvbS55LG91dGVyV2lkdGg6cy5vdXRlcldpZHRoKmEuZnJvbS54fSxpLnRvPXtoZWlnaHQ6cy5oZWlnaHQqYS50by55LHdpZHRoOnMud2lkdGgqYS50by54LG91dGVySGVpZ2h0OnMuaGVpZ2h0KmEudG8ueSxvdXRlcldpZHRoOnMud2lkdGgqYS50by54fSxhLmZyb20ueSE9PWEudG8ueSYmKGkuZnJvbT1lLmVmZmVjdHMuc2V0VHJhbnNpdGlvbihpLGQsYS5mcm9tLnksaS5mcm9tKSxpLnRvPWUuZWZmZWN0cy5zZXRUcmFuc2l0aW9uKGksZCxhLnRvLnksaS50bykpLGEuZnJvbS54IT09YS50by54JiYoaS5mcm9tPWUuZWZmZWN0cy5zZXRUcmFuc2l0aW9uKGksYyxhLmZyb20ueCxpLmZyb20pLGkudG89ZS5lZmZlY3RzLnNldFRyYW5zaXRpb24oaSxjLGEudG8ueCxpLnRvKSksaS5jc3MoaS5mcm9tKSxpLmFuaW1hdGUoaS50byx0LmR1cmF0aW9uLHQuZWFzaW5nLGZ1bmN0aW9uKCl7ZiYmZS5lZmZlY3RzLnJlc3RvcmUoaSxsKX0pfSkpLG8uYW5pbWF0ZShvLnRvLHtxdWV1ZTohMSxkdXJhdGlvbjp0LmR1cmF0aW9uLGVhc2luZzp0LmVhc2luZyxjb21wbGV0ZTpmdW5jdGlvbigpezA9PT1vLnRvLm9wYWNpdHkmJm8uY3NzKCJvcGFjaXR5IixvLmZyb20ub3BhY2l0eSksImhpZGUiPT09cCYmby5oaWRlKCksZS5lZmZlY3RzLnJlc3RvcmUobyx5KSxmfHwoInN0YXRpYyI9PT12P28uY3NzKHtwb3NpdGlvbjoicmVsYXRpdmUiLHRvcDpvLnRvLnRvcCxsZWZ0Om8udG8ubGVmdH0pOmUuZWFjaChbInRvcCIsImxlZnQiXSxmdW5jdGlvbihlLHQpe28uY3NzKHQsZnVuY3Rpb24odCxpKXt2YXIgcz1wYXJzZUludChpLDEwKSxuPWU/by50by5sZWZ0Om8udG8udG9wO3JldHVybiJhdXRvIj09PWk/bisicHgiOnMrbisicHgifSl9KSksZS5lZmZlY3RzLnJlbW92ZVdyYXBwZXIobyksaSgpfX0pfSxlLmVmZmVjdHMuZWZmZWN0LnNjYWxlPWZ1bmN0aW9uKHQsaSl7dmFyIHM9ZSh0aGlzKSxuPWUuZXh0ZW5kKCEwLHt9LHQpLGE9ZS5lZmZlY3RzLnNldE1vZGUocyx0Lm1vZGV8fCJlZmZlY3QiKSxvPXBhcnNlSW50KHQucGVyY2VudCwxMCl8fCgwPT09cGFyc2VJbnQodC5wZXJjZW50LDEwKT8wOiJoaWRlIj09PWE/MDoxMDApLHI9dC5kaXJlY3Rpb258fCJib3RoIixoPXQub3JpZ2luLGw9e2hlaWdodDpzLmhlaWdodCgpLHdpZHRoOnMud2lkdGgoKSxvdXRlckhlaWdodDpzLm91dGVySGVpZ2h0KCksb3V0ZXJXaWR0aDpzLm91dGVyV2lkdGgoKX0sdT17eToiaG9yaXpvbnRhbCIhPT1yP28vMTAwOjEseDoidmVydGljYWwiIT09cj9vLzEwMDoxfTtuLmVmZmVjdD0ic2l6ZSIsbi5xdWV1ZT0hMSxuLmNvbXBsZXRlPWksImVmZmVjdCIhPT1hJiYobi5vcmlnaW49aHx8WyJtaWRkbGUiLCJjZW50ZXIiXSxuLnJlc3RvcmU9ITApLG4uZnJvbT10LmZyb218fCgic2hvdyI9PT1hP3toZWlnaHQ6MCx3aWR0aDowLG91dGVySGVpZ2h0OjAsb3V0ZXJXaWR0aDowfTpsKSxuLnRvPXtoZWlnaHQ6bC5oZWlnaHQqdS55LHdpZHRoOmwud2lkdGgqdS54LG91dGVySGVpZ2h0Omwub3V0ZXJIZWlnaHQqdS55LG91dGVyV2lkdGg6bC5vdXRlcldpZHRoKnUueH0sbi5mYWRlJiYoInNob3ciPT09YSYmKG4uZnJvbS5vcGFjaXR5PTAsbi50by5vcGFjaXR5PTEpLCJoaWRlIj09PWEmJihuLmZyb20ub3BhY2l0eT0xLG4udG8ub3BhY2l0eT0wKSkscy5lZmZlY3Qobil9LGUuZWZmZWN0cy5lZmZlY3QucHVmZj1mdW5jdGlvbih0LGkpe3ZhciBzPWUodGhpcyksbj1lLmVmZmVjdHMuc2V0TW9kZShzLHQubW9kZXx8ImhpZGUiKSxhPSJoaWRlIj09PW4sbz1wYXJzZUludCh0LnBlcmNlbnQsMTApfHwxNTAscj1vLzEwMCxoPXtoZWlnaHQ6cy5oZWlnaHQoKSx3aWR0aDpzLndpZHRoKCksb3V0ZXJIZWlnaHQ6cy5vdXRlckhlaWdodCgpLG91dGVyV2lkdGg6cy5vdXRlcldpZHRoKCl9O2UuZXh0ZW5kKHQse2VmZmVjdDoic2NhbGUiLHF1ZXVlOiExLGZhZGU6ITAsbW9kZTpuLGNvbXBsZXRlOmkscGVyY2VudDphP286MTAwLGZyb206YT9oOntoZWlnaHQ6aC5oZWlnaHQqcix3aWR0aDpoLndpZHRoKnIsb3V0ZXJIZWlnaHQ6aC5vdXRlckhlaWdodCpyLG91dGVyV2lkdGg6aC5vdXRlcldpZHRoKnJ9fSkscy5lZmZlY3QodCl9LGUuZWZmZWN0cy5lZmZlY3QucHVsc2F0ZT1mdW5jdGlvbih0LGkpe3ZhciBzLG49ZSh0aGlzKSxhPWUuZWZmZWN0cy5zZXRNb2RlKG4sdC5tb2RlfHwic2hvdyIpLG89InNob3ciPT09YSxyPSJoaWRlIj09PWEsaD1vfHwiaGlkZSI9PT1hLGw9MioodC50aW1lc3x8NSkrKGg/MTowKSx1PXQuZHVyYXRpb24vbCxkPTAsYz1uLnF1ZXVlKCkscD1jLmxlbmd0aDtmb3IoKG98fCFuLmlzKCI6dmlzaWJsZSIpKSYmKG4uY3NzKCJvcGFjaXR5IiwwKS5zaG93KCksZD0xKSxzPTE7bD5zO3MrKyluLmFuaW1hdGUoe29wYWNpdHk6ZH0sdSx0LmVhc2luZyksZD0xLWQ7bi5hbmltYXRlKHtvcGFjaXR5OmR9LHUsdC5lYXNpbmcpLG4ucXVldWUoZnVuY3Rpb24oKXtyJiZuLmhpZGUoKSxpKCl9KSxwPjEmJmMuc3BsaWNlLmFwcGx5KGMsWzEsMF0uY29uY2F0KGMuc3BsaWNlKHAsbCsxKSkpLG4uZGVxdWV1ZSgpfSxlLmVmZmVjdHMuZWZmZWN0LnNoYWtlPWZ1bmN0aW9uKHQsaSl7dmFyIHMsbj1lKHRoaXMpLGE9WyJwb3NpdGlvbiIsInRvcCIsImJvdHRvbSIsImxlZnQiLCJyaWdodCIsImhlaWdodCIsIndpZHRoIl0sbz1lLmVmZmVjdHMuc2V0TW9kZShuLHQubW9kZXx8ImVmZmVjdCIpLHI9dC5kaXJlY3Rpb258fCJsZWZ0IixoPXQuZGlzdGFuY2V8fDIwLGw9dC50aW1lc3x8Myx1PTIqbCsxLGQ9TWF0aC5yb3VuZCh0LmR1cmF0aW9uL3UpLGM9InVwIj09PXJ8fCJkb3duIj09PXI/InRvcCI6ImxlZnQiLHA9InVwIj09PXJ8fCJsZWZ0Ij09PXIsZj17fSxtPXt9LGc9e30sdj1uLnF1ZXVlKCkseT12Lmxlbmd0aDtmb3IoZS5lZmZlY3RzLnNhdmUobixhKSxuLnNob3coKSxlLmVmZmVjdHMuY3JlYXRlV3JhcHBlcihuKSxmW2NdPShwPyItPSI6Iis9IikraCxtW2NdPShwPyIrPSI6Ii09IikrMipoLGdbY109KHA/Ii09IjoiKz0iKSsyKmgsbi5hbmltYXRlKGYsZCx0LmVhc2luZykscz0xO2w+cztzKyspbi5hbmltYXRlKG0sZCx0LmVhc2luZykuYW5pbWF0ZShnLGQsdC5lYXNpbmcpO24uYW5pbWF0ZShtLGQsdC5lYXNpbmcpLmFuaW1hdGUoZixkLzIsdC5lYXNpbmcpLnF1ZXVlKGZ1bmN0aW9uKCl7ImhpZGUiPT09byYmbi5oaWRlKCksZS5lZmZlY3RzLnJlc3RvcmUobixhKSxlLmVmZmVjdHMucmVtb3ZlV3JhcHBlcihuKSxpKCl9KSx5PjEmJnYuc3BsaWNlLmFwcGx5KHYsWzEsMF0uY29uY2F0KHYuc3BsaWNlKHksdSsxKSkpLG4uZGVxdWV1ZSgpfSxlLmVmZmVjdHMuZWZmZWN0LnNsaWRlPWZ1bmN0aW9uKHQsaSl7dmFyIHMsbj1lKHRoaXMpLGE9WyJwb3NpdGlvbiIsInRvcCIsImJvdHRvbSIsImxlZnQiLCJyaWdodCIsIndpZHRoIiwiaGVpZ2h0Il0sbz1lLmVmZmVjdHMuc2V0TW9kZShuLHQubW9kZXx8InNob3ciKSxyPSJzaG93Ij09PW8saD10LmRpcmVjdGlvbnx8ImxlZnQiLGw9InVwIj09PWh8fCJkb3duIj09PWg/InRvcCI6ImxlZnQiLHU9InVwIj09PWh8fCJsZWZ0Ij09PWgsZD17fTtlLmVmZmVjdHMuc2F2ZShuLGEpLG4uc2hvdygpLHM9dC5kaXN0YW5jZXx8blsidG9wIj09PWw/Im91dGVySGVpZ2h0Ijoib3V0ZXJXaWR0aCJdKCEwKSxlLmVmZmVjdHMuY3JlYXRlV3JhcHBlcihuKS5jc3Moe292ZXJmbG93OiJoaWRkZW4ifSksciYmbi5jc3MobCx1P2lzTmFOKHMpPyItIitzOi1zOnMpLGRbbF09KHI/dT8iKz0iOiItPSI6dT8iLT0iOiIrPSIpK3Msbi5hbmltYXRlKGQse3F1ZXVlOiExLGR1cmF0aW9uOnQuZHVyYXRpb24sZWFzaW5nOnQuZWFzaW5nLGNvbXBsZXRlOmZ1bmN0aW9uKCl7ImhpZGUiPT09byYmbi5oaWRlKCksZS5lZmZlY3RzLnJlc3RvcmUobixhKSxlLmVmZmVjdHMucmVtb3ZlV3JhcHBlcihuKSxpKCl9fSl9LGUuZWZmZWN0cy5lZmZlY3QudHJhbnNmZXI9ZnVuY3Rpb24odCxpKXt2YXIgcz1lKHRoaXMpLG49ZSh0LnRvKSxhPSJmaXhlZCI9PT1uLmNzcygicG9zaXRpb24iKSxvPWUoImJvZHkiKSxyPWE/by5zY3JvbGxUb3AoKTowLGg9YT9vLnNjcm9sbExlZnQoKTowLGw9bi5vZmZzZXQoKSx1PXt0b3A6bC50b3AtcixsZWZ0OmwubGVmdC1oLGhlaWdodDpuLmlubmVySGVpZ2h0KCksd2lkdGg6bi5pbm5lcldpZHRoKCl9LGQ9cy5vZmZzZXQoKSxjPWUoIjxkaXYgY2xhc3M9J3VpLWVmZmVjdHMtdHJhbnNmZXInPjwvZGl2PiIpLmFwcGVuZFRvKGRvY3VtZW50LmJvZHkpLmFkZENsYXNzKHQuY2xhc3NOYW1lKS5jc3Moe3RvcDpkLnRvcC1yLGxlZnQ6ZC5sZWZ0LWgsaGVpZ2h0OnMuaW5uZXJIZWlnaHQoKSx3aWR0aDpzLmlubmVyV2lkdGgoKSxwb3NpdGlvbjphPyJmaXhlZCI6ImFic29sdXRlIn0pLmFuaW1hdGUodSx0LmR1cmF0aW9uLHQuZWFzaW5nLGZ1bmN0aW9uKCl7Yy5yZW1vdmUoKSxpKCl9KX0sZS53aWRnZXQoInVpLnByb2dyZXNzYmFyIix7dmVyc2lvbjoiMS4xMS40IixvcHRpb25zOnttYXg6MTAwLHZhbHVlOjAsY2hhbmdlOm51bGwsY29tcGxldGU6bnVsbH0sbWluOjAsX2NyZWF0ZTpmdW5jdGlvbigpe3RoaXMub2xkVmFsdWU9dGhpcy5vcHRpb25zLnZhbHVlPXRoaXMuX2NvbnN0cmFpbmVkVmFsdWUoKSx0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLXByb2dyZXNzYmFyIHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYWxsIikuYXR0cih7cm9sZToicHJvZ3Jlc3NiYXIiLCJhcmlhLXZhbHVlbWluIjp0aGlzLm1pbn0pLHRoaXMudmFsdWVEaXY9ZSgiPGRpdiBjbGFzcz0ndWktcHJvZ3Jlc3NiYXItdmFsdWUgdWktd2lkZ2V0LWhlYWRlciB1aS1jb3JuZXItbGVmdCc+PC9kaXY+IikuYXBwZW5kVG8odGhpcy5lbGVtZW50KSx0aGlzLl9yZWZyZXNoVmFsdWUoKX0sX2Rlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXByb2dyZXNzYmFyIHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYWxsIikucmVtb3ZlQXR0cigicm9sZSIpLnJlbW92ZUF0dHIoImFyaWEtdmFsdWVtaW4iKS5yZW1vdmVBdHRyKCJhcmlhLXZhbHVlbWF4IikucmVtb3ZlQXR0cigiYXJpYS12YWx1ZW5vdyIpLHRoaXMudmFsdWVEaXYucmVtb3ZlKCl9LHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lP3RoaXMub3B0aW9ucy52YWx1ZToodGhpcy5vcHRpb25zLnZhbHVlPXRoaXMuX2NvbnN0cmFpbmVkVmFsdWUoZSksdGhpcy5fcmVmcmVzaFZhbHVlKCksdm9pZCAwKX0sX2NvbnN0cmFpbmVkVmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPXRoaXMub3B0aW9ucy52YWx1ZSksdGhpcy5pbmRldGVybWluYXRlPWU9PT0hMSwibnVtYmVyIiE9dHlwZW9mIGUmJihlPTApLHRoaXMuaW5kZXRlcm1pbmF0ZT8hMTpNYXRoLm1pbih0aGlzLm9wdGlvbnMubWF4LE1hdGgubWF4KHRoaXMubWluLGUpKX0sX3NldE9wdGlvbnM6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS52YWx1ZTtkZWxldGUgZS52YWx1ZSx0aGlzLl9zdXBlcihlKSx0aGlzLm9wdGlvbnMudmFsdWU9dGhpcy5fY29uc3RyYWluZWRWYWx1ZSh0KSx0aGlzLl9yZWZyZXNoVmFsdWUoKX0sX3NldE9wdGlvbjpmdW5jdGlvbihlLHQpeyJtYXgiPT09ZSYmKHQ9TWF0aC5tYXgodGhpcy5taW4sdCkpLCJkaXNhYmxlZCI9PT1lJiZ0aGlzLmVsZW1lbnQudG9nZ2xlQ2xhc3MoInVpLXN0YXRlLWRpc2FibGVkIiwhIXQpLmF0dHIoImFyaWEtZGlzYWJsZWQiLHQpLHRoaXMuX3N1cGVyKGUsdCl9LF9wZXJjZW50YWdlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW5kZXRlcm1pbmF0ZT8xMDA6MTAwKih0aGlzLm9wdGlvbnMudmFsdWUtdGhpcy5taW4pLyh0aGlzLm9wdGlvbnMubWF4LXRoaXMubWluKX0sX3JlZnJlc2hWYWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMub3B0aW9ucy52YWx1ZSxpPXRoaXMuX3BlcmNlbnRhZ2UoKTt0aGlzLnZhbHVlRGl2LnRvZ2dsZSh0aGlzLmluZGV0ZXJtaW5hdGV8fHQ+dGhpcy5taW4pLnRvZ2dsZUNsYXNzKCJ1aS1jb3JuZXItcmlnaHQiLHQ9PT10aGlzLm9wdGlvbnMubWF4KS53aWR0aChpLnRvRml4ZWQoMCkrIiUiKSx0aGlzLmVsZW1lbnQudG9nZ2xlQ2xhc3MoInVpLXByb2dyZXNzYmFyLWluZGV0ZXJtaW5hdGUiLHRoaXMuaW5kZXRlcm1pbmF0ZSksdGhpcy5pbmRldGVybWluYXRlPyh0aGlzLmVsZW1lbnQucmVtb3ZlQXR0cigiYXJpYS12YWx1ZW5vdyIpLHRoaXMub3ZlcmxheURpdnx8KHRoaXMub3ZlcmxheURpdj1lKCI8ZGl2IGNsYXNzPSd1aS1wcm9ncmVzc2Jhci1vdmVybGF5Jz48L2Rpdj4iKS5hcHBlbmRUbyh0aGlzLnZhbHVlRGl2KSkpOih0aGlzLmVsZW1lbnQuYXR0cih7ImFyaWEtdmFsdWVtYXgiOnRoaXMub3B0aW9ucy5tYXgsImFyaWEtdmFsdWVub3ciOnR9KSx0aGlzLm92ZXJsYXlEaXYmJih0aGlzLm92ZXJsYXlEaXYucmVtb3ZlKCksdGhpcy5vdmVybGF5RGl2PW51bGwpKSx0aGlzLm9sZFZhbHVlIT09dCYmKHRoaXMub2xkVmFsdWU9dCx0aGlzLl90cmlnZ2VyKCJjaGFuZ2UiKSksdD09PXRoaXMub3B0aW9ucy5tYXgmJnRoaXMuX3RyaWdnZXIoImNvbXBsZXRlIil9fSksZS53aWRnZXQoInVpLnNlbGVjdGFibGUiLGUudWkubW91c2Use3ZlcnNpb246IjEuMTEuNCIsb3B0aW9uczp7YXBwZW5kVG86ImJvZHkiLGF1dG9SZWZyZXNoOiEwLGRpc3RhbmNlOjAsZmlsdGVyOiIqIix0b2xlcmFuY2U6InRvdWNoIixzZWxlY3RlZDpudWxsLHNlbGVjdGluZzpudWxsLHN0YXJ0Om51bGwsc3RvcDpudWxsLHVuc2VsZWN0ZWQ6bnVsbCx1bnNlbGVjdGluZzpudWxsfSxfY3JlYXRlOmZ1bmN0aW9uKCl7dmFyIHQsaT10aGlzO3RoaXMuZWxlbWVudC5hZGRDbGFzcygidWktc2VsZWN0YWJsZSIpLHRoaXMuZHJhZ2dlZD0hMSx0aGlzLnJlZnJlc2g9ZnVuY3Rpb24oKXt0PWUoaS5vcHRpb25zLmZpbHRlcixpLmVsZW1lbnRbMF0pLHQuYWRkQ2xhc3MoInVpLXNlbGVjdGVlIiksdC5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9ZSh0aGlzKSxpPXQub2Zmc2V0KCk7ZS5kYXRhKHRoaXMsInNlbGVjdGFibGUtaXRlbSIse2VsZW1lbnQ6dGhpcywkZWxlbWVudDp0LGxlZnQ6aS5sZWZ0LHRvcDppLnRvcCxyaWdodDppLmxlZnQrdC5vdXRlcldpZHRoKCksYm90dG9tOmkudG9wK3Qub3V0ZXJIZWlnaHQoKSxzdGFydHNlbGVjdGVkOiExLHNlbGVjdGVkOnQuaGFzQ2xhc3MoInVpLXNlbGVjdGVkIiksc2VsZWN0aW5nOnQuaGFzQ2xhc3MoInVpLXNlbGVjdGluZyIpLHVuc2VsZWN0aW5nOnQuaGFzQ2xhc3MoInVpLXVuc2VsZWN0aW5nIil9KX0pfSx0aGlzLnJlZnJlc2goKSx0aGlzLnNlbGVjdGVlcz10LmFkZENsYXNzKCJ1aS1zZWxlY3RlZSIpLHRoaXMuX21vdXNlSW5pdCgpLHRoaXMuaGVscGVyPWUoIjxkaXYgY2xhc3M9J3VpLXNlbGVjdGFibGUtaGVscGVyJz48L2Rpdj4iKX0sX2Rlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGVlcy5yZW1vdmVDbGFzcygidWktc2VsZWN0ZWUiKS5yZW1vdmVEYXRhKCJzZWxlY3RhYmxlLWl0ZW0iKSx0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXNlbGVjdGFibGUgdWktc2VsZWN0YWJsZS1kaXNhYmxlZCIpLHRoaXMuX21vdXNlRGVzdHJveSgpfSxfbW91c2VTdGFydDpmdW5jdGlvbih0KXt2YXIgaT10aGlzLHM9dGhpcy5vcHRpb25zO3RoaXMub3Bvcz1bdC5wYWdlWCx0LnBhZ2VZXSx0aGlzLm9wdGlvbnMuZGlzYWJsZWR8fCh0aGlzLnNlbGVjdGVlcz1lKHMuZmlsdGVyLHRoaXMuZWxlbWVudFswXSksdGhpcy5fdHJpZ2dlcigic3RhcnQiLHQpLGUocy5hcHBlbmRUbykuYXBwZW5kKHRoaXMuaGVscGVyKSx0aGlzLmhlbHBlci5jc3Moe2xlZnQ6dC5wYWdlWCx0b3A6dC5wYWdlWSx3aWR0aDowLGhlaWdodDowfSkscy5hdXRvUmVmcmVzaCYmdGhpcy5yZWZyZXNoKCksdGhpcy5zZWxlY3RlZXMuZmlsdGVyKCIudWktc2VsZWN0ZWQiKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIHM9ZS5kYXRhKHRoaXMsInNlbGVjdGFibGUtaXRlbSIpO3Muc3RhcnRzZWxlY3RlZD0hMCx0Lm1ldGFLZXl8fHQuY3RybEtleXx8KHMuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXNlbGVjdGVkIikscy5zZWxlY3RlZD0hMSxzLiRlbGVtZW50LmFkZENsYXNzKCJ1aS11bnNlbGVjdGluZyIpLHMudW5zZWxlY3Rpbmc9ITAsaS5fdHJpZ2dlcigidW5zZWxlY3RpbmciLHQse3Vuc2VsZWN0aW5nOnMuZWxlbWVudH0pKX0pLGUodC50YXJnZXQpLnBhcmVudHMoKS5hZGRCYWNrKCkuZWFjaChmdW5jdGlvbigpe3ZhciBzLG49ZS5kYXRhKHRoaXMsInNlbGVjdGFibGUtaXRlbSIpO3JldHVybiBuPyhzPSF0Lm1ldGFLZXkmJiF0LmN0cmxLZXl8fCFuLiRlbGVtZW50Lmhhc0NsYXNzKCJ1aS1zZWxlY3RlZCIpLG4uJGVsZW1lbnQucmVtb3ZlQ2xhc3Mocz8idWktdW5zZWxlY3RpbmciOiJ1aS1zZWxlY3RlZCIpLmFkZENsYXNzKHM/InVpLXNlbGVjdGluZyI6InVpLXVuc2VsZWN0aW5nIiksbi51bnNlbGVjdGluZz0hcyxuLnNlbGVjdGluZz1zLG4uc2VsZWN0ZWQ9cyxzP2kuX3RyaWdnZXIoInNlbGVjdGluZyIsdCx7c2VsZWN0aW5nOm4uZWxlbWVudH0pOmkuX3RyaWdnZXIoInVuc2VsZWN0aW5nIix0LHt1bnNlbGVjdGluZzpuLmVsZW1lbnR9KSwhMSk6dm9pZCAwfSkpfSxfbW91c2VEcmFnOmZ1bmN0aW9uKHQpe2lmKHRoaXMuZHJhZ2dlZD0hMCwhdGhpcy5vcHRpb25zLmRpc2FibGVkKXt2YXIgaSxzPXRoaXMsbj10aGlzLm9wdGlvbnMsYT10aGlzLm9wb3NbMF0sbz10aGlzLm9wb3NbMV0scj10LnBhZ2VYLGg9dC5wYWdlWTtyZXR1cm4gYT5yJiYoaT1yLHI9YSxhPWkpLG8+aCYmKGk9aCxoPW8sbz1pKSx0aGlzLmhlbHBlci5jc3Moe2xlZnQ6YSx0b3A6byx3aWR0aDpyLWEsaGVpZ2h0Omgtb30pLHRoaXMuc2VsZWN0ZWVzLmVhY2goZnVuY3Rpb24oKXt2YXIgaT1lLmRhdGEodGhpcywic2VsZWN0YWJsZS1pdGVtIiksbD0hMTtpJiZpLmVsZW1lbnQhPT1zLmVsZW1lbnRbMF0mJigidG91Y2giPT09bi50b2xlcmFuY2U/bD0hKGkubGVmdD5yfHxhPmkucmlnaHR8fGkudG9wPmh8fG8+aS5ib3R0b20pOiJmaXQiPT09bi50b2xlcmFuY2UmJihsPWkubGVmdD5hJiZyPmkucmlnaHQmJmkudG9wPm8mJmg+aS5ib3R0b20pLGw/KGkuc2VsZWN0ZWQmJihpLiRlbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1zZWxlY3RlZCIpLGkuc2VsZWN0ZWQ9ITEpLGkudW5zZWxlY3RpbmcmJihpLiRlbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS11bnNlbGVjdGluZyIpLGkudW5zZWxlY3Rpbmc9ITEpLGkuc2VsZWN0aW5nfHwoaS4kZWxlbWVudC5hZGRDbGFzcygidWktc2VsZWN0aW5nIiksaS5zZWxlY3Rpbmc9ITAscy5fdHJpZ2dlcigic2VsZWN0aW5nIix0LHtzZWxlY3Rpbmc6aS5lbGVtZW50fSkpKTooaS5zZWxlY3RpbmcmJigodC5tZXRhS2V5fHx0LmN0cmxLZXkpJiZpLnN0YXJ0c2VsZWN0ZWQ/KGkuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXNlbGVjdGluZyIpLGkuc2VsZWN0aW5nPSExLGkuJGVsZW1lbnQuYWRkQ2xhc3MoInVpLXNlbGVjdGVkIiksaS5zZWxlY3RlZD0hMCk6KGkuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXNlbGVjdGluZyIpLGkuc2VsZWN0aW5nPSExLGkuc3RhcnRzZWxlY3RlZCYmKGkuJGVsZW1lbnQuYWRkQ2xhc3MoInVpLXVuc2VsZWN0aW5nIiksaS51bnNlbGVjdGluZz0hMCkscy5fdHJpZ2dlcigidW5zZWxlY3RpbmciLHQse3Vuc2VsZWN0aW5nOmkuZWxlbWVudH0pKSksaS5zZWxlY3RlZCYmKHQubWV0YUtleXx8dC5jdHJsS2V5fHxpLnN0YXJ0c2VsZWN0ZWR8fChpLiRlbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1zZWxlY3RlZCIpLGkuc2VsZWN0ZWQ9ITEsaS4kZWxlbWVudC5hZGRDbGFzcygidWktdW5zZWxlY3RpbmciKSxpLnVuc2VsZWN0aW5nPSEwLHMuX3RyaWdnZXIoInVuc2VsZWN0aW5nIix0LHt1bnNlbGVjdGluZzppLmVsZW1lbnR9KSkpKSl9KSwhMX19LF9tb3VzZVN0b3A6ZnVuY3Rpb24odCl7dmFyIGk9dGhpcztyZXR1cm4gdGhpcy5kcmFnZ2VkPSExLGUoIi51aS11bnNlbGVjdGluZyIsdGhpcy5lbGVtZW50WzBdKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIHM9ZS5kYXRhKHRoaXMsInNlbGVjdGFibGUtaXRlbSIpO3MuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXVuc2VsZWN0aW5nIikscy51bnNlbGVjdGluZz0hMSxzLnN0YXJ0c2VsZWN0ZWQ9ITEsaS5fdHJpZ2dlcigidW5zZWxlY3RlZCIsdCx7dW5zZWxlY3RlZDpzLmVsZW1lbnR9KX0pLGUoIi51aS1zZWxlY3RpbmciLHRoaXMuZWxlbWVudFswXSkuZWFjaChmdW5jdGlvbigpe3ZhciBzPWUuZGF0YSh0aGlzLCJzZWxlY3RhYmxlLWl0ZW0iKTtzLiRlbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1zZWxlY3RpbmciKS5hZGRDbGFzcygidWktc2VsZWN0ZWQiKSxzLnNlbGVjdGluZz0hMSxzLnNlbGVjdGVkPSEwLHMuc3RhcnRzZWxlY3RlZD0hMCxpLl90cmlnZ2VyKCJzZWxlY3RlZCIsdCx7c2VsZWN0ZWQ6cy5lbGVtZW50fSl9KSx0aGlzLl90cmlnZ2VyKCJzdG9wIix0KSx0aGlzLmhlbHBlci5yZW1vdmUoKSwhMX19KSxlLndpZGdldCgidWkuc2VsZWN0bWVudSIse3ZlcnNpb246IjEuMTEuNCIsZGVmYXVsdEVsZW1lbnQ6IjxzZWxlY3Q+IixvcHRpb25zOnthcHBlbmRUbzpudWxsLGRpc2FibGVkOm51bGwsaWNvbnM6e2J1dHRvbjoidWktaWNvbi10cmlhbmdsZS0xLXMifSxwb3NpdGlvbjp7bXk6ImxlZnQgdG9wIixhdDoibGVmdCBib3R0b20iLGNvbGxpc2lvbjoibm9uZSJ9LHdpZHRoOm51bGwsY2hhbmdlOm51bGwsY2xvc2U6bnVsbCxmb2N1czpudWxsLG9wZW46bnVsbCxzZWxlY3Q6bnVsbH0sX2NyZWF0ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMuZWxlbWVudC51bmlxdWVJZCgpLmF0dHIoImlkIik7dGhpcy5pZHM9e2VsZW1lbnQ6ZSxidXR0b246ZSsiLWJ1dHRvbiIsbWVudTplKyItbWVudSJ9LHRoaXMuX2RyYXdCdXR0b24oKSx0aGlzLl9kcmF3TWVudSgpLHRoaXMub3B0aW9ucy5kaXNhYmxlZCYmdGhpcy5kaXNhYmxlKCl9LF9kcmF3QnV0dG9uOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLmxhYmVsPWUoImxhYmVsW2Zvcj0nIit0aGlzLmlkcy5lbGVtZW50KyInXSIpLmF0dHIoImZvciIsdGhpcy5pZHMuYnV0dG9uKSx0aGlzLl9vbih0aGlzLmxhYmVsLHtjbGljazpmdW5jdGlvbihlKXt0aGlzLmJ1dHRvbi5mb2N1cygpLGUucHJldmVudERlZmF1bHQoKX19KSx0aGlzLmVsZW1lbnQuaGlkZSgpLHRoaXMuYnV0dG9uPWUoIjxzcGFuPiIseyJjbGFzcyI6InVpLXNlbGVjdG1lbnUtYnV0dG9uIHVpLXdpZGdldCB1aS1zdGF0ZS1kZWZhdWx0IHVpLWNvcm5lci1hbGwiLHRhYmluZGV4OnRoaXMub3B0aW9ucy5kaXNhYmxlZD8tMTowLGlkOnRoaXMuaWRzLmJ1dHRvbixyb2xlOiJjb21ib2JveCIsImFyaWEtZXhwYW5kZWQiOiJmYWxzZSIsImFyaWEtYXV0b2NvbXBsZXRlIjoibGlzdCIsImFyaWEtb3ducyI6dGhpcy5pZHMubWVudSwiYXJpYS1oYXNwb3B1cCI6InRydWUifSkuaW5zZXJ0QWZ0ZXIodGhpcy5lbGVtZW50KSxlKCI8c3Bhbj4iLHsiY2xhc3MiOiJ1aS1pY29uICIrdGhpcy5vcHRpb25zLmljb25zLmJ1dHRvbn0pLnByZXBlbmRUbyh0aGlzLmJ1dHRvbiksdGhpcy5idXR0b25UZXh0PWUoIjxzcGFuPiIseyJjbGFzcyI6InVpLXNlbGVjdG1lbnUtdGV4dCJ9KS5hcHBlbmRUbyh0aGlzLmJ1dHRvbiksdGhpcy5fc2V0VGV4dCh0aGlzLmJ1dHRvblRleHQsdGhpcy5lbGVtZW50LmZpbmQoIm9wdGlvbjpzZWxlY3RlZCIpLnRleHQoKSksdGhpcy5fcmVzaXplQnV0dG9uKCksdGhpcy5fb24odGhpcy5idXR0b24sdGhpcy5fYnV0dG9uRXZlbnRzKSx0aGlzLmJ1dHRvbi5vbmUoImZvY3VzaW4iLGZ1bmN0aW9uKCl7dC5tZW51SXRlbXN8fHQuX3JlZnJlc2hNZW51KCl9KSx0aGlzLl9ob3ZlcmFibGUodGhpcy5idXR0b24pLHRoaXMuX2ZvY3VzYWJsZSh0aGlzLmJ1dHRvbil9LF9kcmF3TWVudTpmdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5tZW51PWUoIjx1bD4iLHsiYXJpYS1oaWRkZW4iOiJ0cnVlIiwiYXJpYS1sYWJlbGxlZGJ5Ijp0aGlzLmlkcy5idXR0b24saWQ6dGhpcy5pZHMubWVudX0pLHRoaXMubWVudVdyYXA9ZSgiPGRpdj4iLHsiY2xhc3MiOiJ1aS1zZWxlY3RtZW51LW1lbnUgdWktZnJvbnQifSkuYXBwZW5kKHRoaXMubWVudSkuYXBwZW5kVG8odGhpcy5fYXBwZW5kVG8oKSksdGhpcy5tZW51SW5zdGFuY2U9dGhpcy5tZW51Lm1lbnUoe3JvbGU6Imxpc3Rib3giLHNlbGVjdDpmdW5jdGlvbihlLGkpe2UucHJldmVudERlZmF1bHQoKSx0Ll9zZXRTZWxlY3Rpb24oKSx0Ll9zZWxlY3QoaS5pdGVtLmRhdGEoInVpLXNlbGVjdG1lbnUtaXRlbSIpLGUpfSxmb2N1czpmdW5jdGlvbihlLGkpe3ZhciBzPWkuaXRlbS5kYXRhKCJ1aS1zZWxlY3RtZW51LWl0ZW0iKTtudWxsIT10LmZvY3VzSW5kZXgmJnMuaW5kZXghPT10LmZvY3VzSW5kZXgmJih0Ll90cmlnZ2VyKCJmb2N1cyIsZSx7aXRlbTpzfSksdC5pc09wZW58fHQuX3NlbGVjdChzLGUpKSx0LmZvY3VzSW5kZXg9cy5pbmRleCx0LmJ1dHRvbi5hdHRyKCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnQiLHQubWVudUl0ZW1zLmVxKHMuaW5kZXgpLmF0dHIoImlkIikpfX0pLm1lbnUoImluc3RhbmNlIiksdGhpcy5tZW51LmFkZENsYXNzKCJ1aS1jb3JuZXItYm90dG9tIikucmVtb3ZlQ2xhc3MoInVpLWNvcm5lci1hbGwiKSx0aGlzLm1lbnVJbnN0YW5jZS5fb2ZmKHRoaXMubWVudSwibW91c2VsZWF2ZSIpLHRoaXMubWVudUluc3RhbmNlLl9jbG9zZU9uRG9jdW1lbnRDbGljaz1mdW5jdGlvbigpe3JldHVybiExfSx0aGlzLm1lbnVJbnN0YW5jZS5faXNEaXZpZGVyPWZ1bmN0aW9uKCl7cmV0dXJuITF9fSxyZWZyZXNoOmZ1bmN0aW9uKCl7dGhpcy5fcmVmcmVzaE1lbnUoKSx0aGlzLl9zZXRUZXh0KHRoaXMuYnV0dG9uVGV4dCx0aGlzLl9nZXRTZWxlY3RlZEl0ZW0oKS50ZXh0KCkpLHRoaXMub3B0aW9ucy53aWR0aHx8dGhpcy5fcmVzaXplQnV0dG9uKCl9LF9yZWZyZXNoTWVudTpmdW5jdGlvbigpe3RoaXMubWVudS5lbXB0eSgpO3ZhciBlLHQ9dGhpcy5lbGVtZW50LmZpbmQoIm9wdGlvbiIpO3QubGVuZ3RoJiYodGhpcy5fcGFyc2VPcHRpb25zKHQpLHRoaXMuX3JlbmRlck1lbnUodGhpcy5tZW51LHRoaXMuaXRlbXMpLHRoaXMubWVudUluc3RhbmNlLnJlZnJlc2goKSx0aGlzLm1lbnVJdGVtcz10aGlzLm1lbnUuZmluZCgibGkiKS5ub3QoIi51aS1zZWxlY3RtZW51LW9wdGdyb3VwIiksZT10aGlzLl9nZXRTZWxlY3RlZEl0ZW0oKSx0aGlzLm1lbnVJbnN0YW5jZS5mb2N1cyhudWxsLGUpLHRoaXMuX3NldEFyaWEoZS5kYXRhKCJ1aS1zZWxlY3RtZW51LWl0ZW0iKSksdGhpcy5fc2V0T3B0aW9uKCJkaXNhYmxlZCIsdGhpcy5lbGVtZW50LnByb3AoImRpc2FibGVkIikpKX0sb3BlbjpmdW5jdGlvbihlKXt0aGlzLm9wdGlvbnMuZGlzYWJsZWR8fCh0aGlzLm1lbnVJdGVtcz8odGhpcy5tZW51LmZpbmQoIi51aS1zdGF0ZS1mb2N1cyIpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1mb2N1cyIpLHRoaXMubWVudUluc3RhbmNlLmZvY3VzKG51bGwsdGhpcy5fZ2V0U2VsZWN0ZWRJdGVtKCkpKTp0aGlzLl9yZWZyZXNoTWVudSgpLHRoaXMuaXNPcGVuPSEwLHRoaXMuX3RvZ2dsZUF0dHIoKSx0aGlzLl9yZXNpemVNZW51KCksdGhpcy5fcG9zaXRpb24oKSx0aGlzLl9vbih0aGlzLmRvY3VtZW50LHRoaXMuX2RvY3VtZW50Q2xpY2spLHRoaXMuX3RyaWdnZXIoIm9wZW4iLGUpKX0sX3Bvc2l0aW9uOmZ1bmN0aW9uKCl7dGhpcy5tZW51V3JhcC5wb3NpdGlvbihlLmV4dGVuZCh7b2Y6dGhpcy5idXR0b259LHRoaXMub3B0aW9ucy5wb3NpdGlvbikpfSxjbG9zZTpmdW5jdGlvbihlKXt0aGlzLmlzT3BlbiYmKHRoaXMuaXNPcGVuPSExLHRoaXMuX3RvZ2dsZUF0dHIoKSx0aGlzLnJhbmdlPW51bGwsdGhpcy5fb2ZmKHRoaXMuZG9jdW1lbnQpLHRoaXMuX3RyaWdnZXIoImNsb3NlIixlKSl9LHdpZGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJ1dHRvbn0sbWVudVdpZGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1lbnV9LF9yZW5kZXJNZW51OmZ1bmN0aW9uKHQsaSl7dmFyIHM9dGhpcyxuPSIiO2UuZWFjaChpLGZ1bmN0aW9uKGksYSl7YS5vcHRncm91cCE9PW4mJihlKCI8bGk+Iix7ImNsYXNzIjoidWktc2VsZWN0bWVudS1vcHRncm91cCB1aS1tZW51LWRpdmlkZXIiKyhhLmVsZW1lbnQucGFyZW50KCJvcHRncm91cCIpLnByb3AoImRpc2FibGVkIik/IiB1aS1zdGF0ZS1kaXNhYmxlZCI6IiIpLHRleHQ6YS5vcHRncm91cH0pLmFwcGVuZFRvKHQpLG49YS5vcHRncm91cCkscy5fcmVuZGVySXRlbURhdGEodCxhKX0pfSxfcmVuZGVySXRlbURhdGE6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5fcmVuZGVySXRlbShlLHQpLmRhdGEoInVpLXNlbGVjdG1lbnUtaXRlbSIsdCl9LF9yZW5kZXJJdGVtOmZ1bmN0aW9uKHQsaSl7dmFyIHM9ZSgiPGxpPiIpO3JldHVybiBpLmRpc2FibGVkJiZzLmFkZENsYXNzKCJ1aS1zdGF0ZS1kaXNhYmxlZCIpLHRoaXMuX3NldFRleHQocyxpLmxhYmVsKSxzLmFwcGVuZFRvKHQpfSxfc2V0VGV4dDpmdW5jdGlvbihlLHQpe3Q/ZS50ZXh0KHQpOmUuaHRtbCgiJiMxNjA7Iil9LF9tb3ZlOmZ1bmN0aW9uKGUsdCl7dmFyIGkscyxuPSIudWktbWVudS1pdGVtIjt0aGlzLmlzT3Blbj9pPXRoaXMubWVudUl0ZW1zLmVxKHRoaXMuZm9jdXNJbmRleCk6KGk9dGhpcy5tZW51SXRlbXMuZXEodGhpcy5lbGVtZW50WzBdLnNlbGVjdGVkSW5kZXgpLG4rPSI6bm90KC51aS1zdGF0ZS1kaXNhYmxlZCkiKSxzPSJmaXJzdCI9PT1lfHwibGFzdCI9PT1lP2lbImZpcnN0Ij09PWU/InByZXZBbGwiOiJuZXh0QWxsIl0obikuZXEoLTEpOmlbZSsiQWxsIl0obikuZXEoMCkscy5sZW5ndGgmJnRoaXMubWVudUluc3RhbmNlLmZvY3VzKHQscyl9LF9nZXRTZWxlY3RlZEl0ZW06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tZW51SXRlbXMuZXEodGhpcy5lbGVtZW50WzBdLnNlbGVjdGVkSW5kZXgpfSxfdG9nZ2xlOmZ1bmN0aW9uKGUpe3RoaXNbdGhpcy5pc09wZW4/ImNsb3NlIjoib3BlbiJdKGUpfSxfc2V0U2VsZWN0aW9uOmZ1bmN0aW9uKCl7dmFyIGU7dGhpcy5yYW5nZSYmKHdpbmRvdy5nZXRTZWxlY3Rpb24/KGU9d2luZG93LmdldFNlbGVjdGlvbigpLGUucmVtb3ZlQWxsUmFuZ2VzKCksZS5hZGRSYW5nZSh0aGlzLnJhbmdlKSk6dGhpcy5yYW5nZS5zZWxlY3QoKSx0aGlzLmJ1dHRvbi5mb2N1cygpKX0sX2RvY3VtZW50Q2xpY2s6e21vdXNlZG93bjpmdW5jdGlvbih0KXt0aGlzLmlzT3BlbiYmKGUodC50YXJnZXQpLmNsb3Nlc3QoIi51aS1zZWxlY3RtZW51LW1lbnUsICMiK3RoaXMuaWRzLmJ1dHRvbikubGVuZ3RofHx0aGlzLmNsb3NlKHQpKX19LF9idXR0b25FdmVudHM6e21vdXNlZG93bjpmdW5jdGlvbigpe3ZhciBlO3dpbmRvdy5nZXRTZWxlY3Rpb24/KGU9d2luZG93LmdldFNlbGVjdGlvbigpLGUucmFuZ2VDb3VudCYmKHRoaXMucmFuZ2U9ZS5nZXRSYW5nZUF0KDApKSk6dGhpcy5yYW5nZT1kb2N1bWVudC5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKX0sY2xpY2s6ZnVuY3Rpb24oZSl7dGhpcy5fc2V0U2VsZWN0aW9uKCksdGhpcy5fdG9nZ2xlKGUpfSxrZXlkb3duOmZ1bmN0aW9uKHQpe3ZhciBpPSEwO3N3aXRjaCh0LmtleUNvZGUpe2Nhc2UgZS51aS5rZXlDb2RlLlRBQjpjYXNlIGUudWkua2V5Q29kZS5FU0NBUEU6dGhpcy5jbG9zZSh0KSxpPSExO2JyZWFrO2Nhc2UgZS51aS5rZXlDb2RlLkVOVEVSOnRoaXMuaXNPcGVuJiZ0aGlzLl9zZWxlY3RGb2N1c2VkSXRlbSh0KTticmVhaztjYXNlIGUudWkua2V5Q29kZS5VUDp0LmFsdEtleT90aGlzLl90b2dnbGUodCk6dGhpcy5fbW92ZSgicHJldiIsdCk7YnJlYWs7Y2FzZSBlLnVpLmtleUNvZGUuRE9XTjp0LmFsdEtleT90aGlzLl90b2dnbGUodCk6dGhpcy5fbW92ZSgibmV4dCIsdCk7YnJlYWs7Y2FzZSBlLnVpLmtleUNvZGUuU1BBQ0U6dGhpcy5pc09wZW4/dGhpcy5fc2VsZWN0Rm9jdXNlZEl0ZW0odCk6dGhpcy5fdG9nZ2xlKHQpO2JyZWFrO2Nhc2UgZS51aS5rZXlDb2RlLkxFRlQ6dGhpcy5fbW92ZSgicHJldiIsdCk7YnJlYWs7Y2FzZSBlLnVpLmtleUNvZGUuUklHSFQ6dGhpcy5fbW92ZSgibmV4dCIsdCk7YnJlYWs7Y2FzZSBlLnVpLmtleUNvZGUuSE9NRTpjYXNlIGUudWkua2V5Q29kZS5QQUdFX1VQOnRoaXMuX21vdmUoImZpcnN0Iix0KTticmVhaztjYXNlIGUudWkua2V5Q29kZS5FTkQ6Y2FzZSBlLnVpLmtleUNvZGUuUEFHRV9ET1dOOnRoaXMuX21vdmUoImxhc3QiLHQpO2JyZWFrO2RlZmF1bHQ6dGhpcy5tZW51LnRyaWdnZXIodCksaT0hMX1pJiZ0LnByZXZlbnREZWZhdWx0KCl9fSxfc2VsZWN0Rm9jdXNlZEl0ZW06ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5tZW51SXRlbXMuZXEodGhpcy5mb2N1c0luZGV4KTt0Lmhhc0NsYXNzKCJ1aS1zdGF0ZS1kaXNhYmxlZCIpfHx0aGlzLl9zZWxlY3QodC5kYXRhKCJ1aS1zZWxlY3RtZW51LWl0ZW0iKSxlKX0sX3NlbGVjdDpmdW5jdGlvbihlLHQpe3ZhciBpPXRoaXMuZWxlbWVudFswXS5zZWxlY3RlZEluZGV4O3RoaXMuZWxlbWVudFswXS5zZWxlY3RlZEluZGV4PWUuaW5kZXgsdGhpcy5fc2V0VGV4dCh0aGlzLmJ1dHRvblRleHQsZS5sYWJlbCksdGhpcy5fc2V0QXJpYShlKSx0aGlzLl90cmlnZ2VyKCJzZWxlY3QiLHQse2l0ZW06ZX0pLGUuaW5kZXghPT1pJiZ0aGlzLl90cmlnZ2VyKCJjaGFuZ2UiLHQse2l0ZW06ZX0pLHRoaXMuY2xvc2UodCl9LF9zZXRBcmlhOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMubWVudUl0ZW1zLmVxKGUuaW5kZXgpLmF0dHIoImlkIik7dGhpcy5idXR0b24uYXR0cih7ImFyaWEtbGFiZWxsZWRieSI6dCwiYXJpYS1hY3RpdmVkZXNjZW5kYW50Ijp0fSksdGhpcy5tZW51LmF0dHIoImFyaWEtYWN0aXZlZGVzY2VuZGFudCIsdCl9LF9zZXRPcHRpb246ZnVuY3Rpb24oZSx0KXsiaWNvbnMiPT09ZSYmdGhpcy5idXR0b24uZmluZCgic3Bhbi51aS1pY29uIikucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLmljb25zLmJ1dHRvbikuYWRkQ2xhc3ModC5idXR0b24pLHRoaXMuX3N1cGVyKGUsdCksImFwcGVuZFRvIj09PWUmJnRoaXMubWVudVdyYXAuYXBwZW5kVG8odGhpcy5fYXBwZW5kVG8oKSksImRpc2FibGVkIj09PWUmJih0aGlzLm1lbnVJbnN0YW5jZS5vcHRpb24oImRpc2FibGVkIix0KSx0aGlzLmJ1dHRvbi50b2dnbGVDbGFzcygidWktc3RhdGUtZGlzYWJsZWQiLHQpLmF0dHIoImFyaWEtZGlzYWJsZWQiLHQpLHRoaXMuZWxlbWVudC5wcm9wKCJkaXNhYmxlZCIsdCksdD8odGhpcy5idXR0b24uYXR0cigidGFiaW5kZXgiLC0xKSx0aGlzLmNsb3NlKCkpOnRoaXMuYnV0dG9uLmF0dHIoInRhYmluZGV4IiwwKSksIndpZHRoIj09PWUmJnRoaXMuX3Jlc2l6ZUJ1dHRvbigpfSxfYXBwZW5kVG86ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wdGlvbnMuYXBwZW5kVG87cmV0dXJuIHQmJih0PXQuanF1ZXJ5fHx0Lm5vZGVUeXBlP2UodCk6dGhpcy5kb2N1bWVudC5maW5kKHQpLmVxKDApKSx0JiZ0WzBdfHwodD10aGlzLmVsZW1lbnQuY2xvc2VzdCgiLnVpLWZyb250IikpLHQubGVuZ3RofHwodD10aGlzLmRvY3VtZW50WzBdLmJvZHkpLHR9LF90b2dnbGVBdHRyOmZ1bmN0aW9uKCl7dGhpcy5idXR0b24udG9nZ2xlQ2xhc3MoInVpLWNvcm5lci10b3AiLHRoaXMuaXNPcGVuKS50b2dnbGVDbGFzcygidWktY29ybmVyLWFsbCIsIXRoaXMuaXNPcGVuKS5hdHRyKCJhcmlhLWV4cGFuZGVkIix0aGlzLmlzT3BlbiksdGhpcy5tZW51V3JhcC50b2dnbGVDbGFzcygidWktc2VsZWN0bWVudS1vcGVuIix0aGlzLmlzT3BlbiksdGhpcy5tZW51LmF0dHIoImFyaWEtaGlkZGVuIiwhdGhpcy5pc09wZW4pfSxfcmVzaXplQnV0dG9uOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vcHRpb25zLndpZHRoO2V8fChlPXRoaXMuZWxlbWVudC5zaG93KCkub3V0ZXJXaWR0aCgpLHRoaXMuZWxlbWVudC5oaWRlKCkpLHRoaXMuYnV0dG9uLm91dGVyV2lkdGgoZSl9LF9yZXNpemVNZW51OmZ1bmN0aW9uKCl7dGhpcy5tZW51Lm91dGVyV2lkdGgoTWF0aC5tYXgodGhpcy5idXR0b24ub3V0ZXJXaWR0aCgpLHRoaXMubWVudS53aWR0aCgiIikub3V0ZXJXaWR0aCgpKzEpKX0sX2dldENyZWF0ZU9wdGlvbnM6ZnVuY3Rpb24oKXtyZXR1cm57ZGlzYWJsZWQ6dGhpcy5lbGVtZW50LnByb3AoImRpc2FibGVkIil9fSxfcGFyc2VPcHRpb25zOmZ1bmN0aW9uKHQpe3ZhciBpPVtdO3QuZWFjaChmdW5jdGlvbih0LHMpe3ZhciBuPWUocyksYT1uLnBhcmVudCgib3B0Z3JvdXAiKTtpLnB1c2goe2VsZW1lbnQ6bixpbmRleDp0LHZhbHVlOm4udmFsKCksbGFiZWw6bi50ZXh0KCksb3B0Z3JvdXA6YS5hdHRyKCJsYWJlbCIpfHwiIixkaXNhYmxlZDphLnByb3AoImRpc2FibGVkIil8fG4ucHJvcCgiZGlzYWJsZWQiKX0pfSksdGhpcy5pdGVtcz1pfSxfZGVzdHJveTpmdW5jdGlvbigpe3RoaXMubWVudVdyYXAucmVtb3ZlKCksdGhpcy5idXR0b24ucmVtb3ZlKCksdGhpcy5lbGVtZW50LnNob3coKSx0aGlzLmVsZW1lbnQucmVtb3ZlVW5pcXVlSWQoKSx0aGlzLmxhYmVsLmF0dHIoImZvciIsdGhpcy5pZHMuZWxlbWVudCl9fSksZS53aWRnZXQoInVpLnNsaWRlciIsZS51aS5tb3VzZSx7dmVyc2lvbjoiMS4xMS40Iix3aWRnZXRFdmVudFByZWZpeDoic2xpZGUiLG9wdGlvbnM6e2FuaW1hdGU6ITEsZGlzdGFuY2U6MCxtYXg6MTAwLG1pbjowLG9yaWVudGF0aW9uOiJob3Jpem9udGFsIixyYW5nZTohMSxzdGVwOjEsdmFsdWU6MCx2YWx1ZXM6bnVsbCxjaGFuZ2U6bnVsbCxzbGlkZTpudWxsLHN0YXJ0Om51bGwsc3RvcDpudWxsfSxudW1QYWdlczo1LF9jcmVhdGU6ZnVuY3Rpb24oKXt0aGlzLl9rZXlTbGlkaW5nPSExLHRoaXMuX21vdXNlU2xpZGluZz0hMSx0aGlzLl9hbmltYXRlT2ZmPSEwLHRoaXMuX2hhbmRsZUluZGV4PW51bGwsdGhpcy5fZGV0ZWN0T3JpZW50YXRpb24oKSx0aGlzLl9tb3VzZUluaXQoKSx0aGlzLl9jYWxjdWxhdGVOZXdNYXgoKSx0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLXNsaWRlciB1aS1zbGlkZXItIit0aGlzLm9yaWVudGF0aW9uKyIgdWktd2lkZ2V0IisiIHVpLXdpZGdldC1jb250ZW50IisiIHVpLWNvcm5lci1hbGwiKSx0aGlzLl9yZWZyZXNoKCksdGhpcy5fc2V0T3B0aW9uKCJkaXNhYmxlZCIsdGhpcy5vcHRpb25zLmRpc2FibGVkKSx0aGlzLl9hbmltYXRlT2ZmPSExfSxfcmVmcmVzaDpmdW5jdGlvbigpe3RoaXMuX2NyZWF0ZVJhbmdlKCksdGhpcy5fY3JlYXRlSGFuZGxlcygpLHRoaXMuX3NldHVwRXZlbnRzKCksdGhpcy5fcmVmcmVzaFZhbHVlKCl9LF9jcmVhdGVIYW5kbGVzOmZ1bmN0aW9uKCl7dmFyIHQsaSxzPXRoaXMub3B0aW9ucyxuPXRoaXMuZWxlbWVudC5maW5kKCIudWktc2xpZGVyLWhhbmRsZSIpLmFkZENsYXNzKCJ1aS1zdGF0ZS1kZWZhdWx0IHVpLWNvcm5lci1hbGwiKSxhPSI8c3BhbiBjbGFzcz0ndWktc2xpZGVyLWhhbmRsZSB1aS1zdGF0ZS1kZWZhdWx0IHVpLWNvcm5lci1hbGwnIHRhYmluZGV4PScwJz48L3NwYW4+IixvPVtdO2ZvcihpPXMudmFsdWVzJiZzLnZhbHVlcy5sZW5ndGh8fDEsbi5sZW5ndGg+aSYmKG4uc2xpY2UoaSkucmVtb3ZlKCksbj1uLnNsaWNlKDAsaSkpLHQ9bi5sZW5ndGg7aT50O3QrKylvLnB1c2goYSk7dGhpcy5oYW5kbGVzPW4uYWRkKGUoby5qb2luKCIiKSkuYXBwZW5kVG8odGhpcy5lbGVtZW50KSksdGhpcy5oYW5kbGU9dGhpcy5oYW5kbGVzLmVxKDApLHRoaXMuaGFuZGxlcy5lYWNoKGZ1bmN0aW9uKHQpe2UodGhpcykuZGF0YSgidWktc2xpZGVyLWhhbmRsZS1pbmRleCIsdCl9KX0sX2NyZWF0ZVJhbmdlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcHRpb25zLGk9IiI7dC5yYW5nZT8odC5yYW5nZT09PSEwJiYodC52YWx1ZXM/dC52YWx1ZXMubGVuZ3RoJiYyIT09dC52YWx1ZXMubGVuZ3RoP3QudmFsdWVzPVt0LnZhbHVlc1swXSx0LnZhbHVlc1swXV06ZS5pc0FycmF5KHQudmFsdWVzKSYmKHQudmFsdWVzPXQudmFsdWVzLnNsaWNlKDApKTp0LnZhbHVlcz1bdGhpcy5fdmFsdWVNaW4oKSx0aGlzLl92YWx1ZU1pbigpXSksdGhpcy5yYW5nZSYmdGhpcy5yYW5nZS5sZW5ndGg/dGhpcy5yYW5nZS5yZW1vdmVDbGFzcygidWktc2xpZGVyLXJhbmdlLW1pbiB1aS1zbGlkZXItcmFuZ2UtbWF4IikuY3NzKHtsZWZ0OiIiLGJvdHRvbToiIn0pOih0aGlzLnJhbmdlPWUoIjxkaXY+PC9kaXY+IikuYXBwZW5kVG8odGhpcy5lbGVtZW50KSxpPSJ1aS1zbGlkZXItcmFuZ2UgdWktd2lkZ2V0LWhlYWRlciB1aS1jb3JuZXItYWxsIiksdGhpcy5yYW5nZS5hZGRDbGFzcyhpKygibWluIj09PXQucmFuZ2V8fCJtYXgiPT09dC5yYW5nZT8iIHVpLXNsaWRlci1yYW5nZS0iK3QucmFuZ2U6IiIpKSk6KHRoaXMucmFuZ2UmJnRoaXMucmFuZ2UucmVtb3ZlKCksdGhpcy5yYW5nZT1udWxsKX0sX3NldHVwRXZlbnRzOmZ1bmN0aW9uKCl7dGhpcy5fb2ZmKHRoaXMuaGFuZGxlcyksdGhpcy5fb24odGhpcy5oYW5kbGVzLHRoaXMuX2hhbmRsZUV2ZW50cyksdGhpcy5faG92ZXJhYmxlKHRoaXMuaGFuZGxlcyksdGhpcy5fZm9jdXNhYmxlKHRoaXMuaGFuZGxlcyl9LF9kZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5oYW5kbGVzLnJlbW92ZSgpLHRoaXMucmFuZ2UmJnRoaXMucmFuZ2UucmVtb3ZlKCksdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1zbGlkZXIgdWktc2xpZGVyLWhvcml6b250YWwgdWktc2xpZGVyLXZlcnRpY2FsIHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYWxsIiksdGhpcy5fbW91c2VEZXN0cm95KCl9LF9tb3VzZUNhcHR1cmU6ZnVuY3Rpb24odCl7dmFyIGkscyxuLGEsbyxyLGgsbCx1PXRoaXMsZD10aGlzLm9wdGlvbnM7cmV0dXJuIGQuZGlzYWJsZWQ/ITE6KHRoaXMuZWxlbWVudFNpemU9e3dpZHRoOnRoaXMuZWxlbWVudC5vdXRlcldpZHRoKCksaGVpZ2h0OnRoaXMuZWxlbWVudC5vdXRlckhlaWdodCgpfSx0aGlzLmVsZW1lbnRPZmZzZXQ9dGhpcy5lbGVtZW50Lm9mZnNldCgpLGk9e3g6dC5wYWdlWCx5OnQucGFnZVl9LHM9dGhpcy5fbm9ybVZhbHVlRnJvbU1vdXNlKGkpLG49dGhpcy5fdmFsdWVNYXgoKS10aGlzLl92YWx1ZU1pbigpKzEsdGhpcy5oYW5kbGVzLmVhY2goZnVuY3Rpb24odCl7dmFyIGk9TWF0aC5hYnMocy11LnZhbHVlcyh0KSk7KG4+aXx8bj09PWkmJih0PT09dS5fbGFzdENoYW5nZWRWYWx1ZXx8dS52YWx1ZXModCk9PT1kLm1pbikpJiYobj1pLGE9ZSh0aGlzKSxvPXQpfSkscj10aGlzLl9zdGFydCh0LG8pLHI9PT0hMT8hMToodGhpcy5fbW91c2VTbGlkaW5nPSEwLHRoaXMuX2hhbmRsZUluZGV4PW8sYS5hZGRDbGFzcygidWktc3RhdGUtYWN0aXZlIikuZm9jdXMoKSxoPWEub2Zmc2V0KCksbD0hZSh0LnRhcmdldCkucGFyZW50cygpLmFkZEJhY2soKS5pcygiLnVpLXNsaWRlci1oYW5kbGUiKSx0aGlzLl9jbGlja09mZnNldD1sP3tsZWZ0OjAsdG9wOjB9OntsZWZ0OnQucGFnZVgtaC5sZWZ0LWEud2lkdGgoKS8yLHRvcDp0LnBhZ2VZLWgudG9wLWEuaGVpZ2h0KCkvMi0ocGFyc2VJbnQoYS5jc3MoImJvcmRlclRvcFdpZHRoIiksMTApfHwwKS0ocGFyc2VJbnQoYS5jc3MoImJvcmRlckJvdHRvbVdpZHRoIiksMTApfHwwKSsocGFyc2VJbnQoYS5jc3MoIm1hcmdpblRvcCIpLDEwKXx8MCl9LHRoaXMuaGFuZGxlcy5oYXNDbGFzcygidWktc3RhdGUtaG92ZXIiKXx8dGhpcy5fc2xpZGUodCxvLHMpLHRoaXMuX2FuaW1hdGVPZmY9ITAsITApKX0sX21vdXNlU3RhcnQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sX21vdXNlRHJhZzpmdW5jdGlvbihlKXt2YXIgdD17eDplLnBhZ2VYLHk6ZS5wYWdlWX0saT10aGlzLl9ub3JtVmFsdWVGcm9tTW91c2UodCk7cmV0dXJuIHRoaXMuX3NsaWRlKGUsdGhpcy5faGFuZGxlSW5kZXgsaSksITF9LF9tb3VzZVN0b3A6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuaGFuZGxlcy5yZW1vdmVDbGFzcygidWktc3RhdGUtYWN0aXZlIiksdGhpcy5fbW91c2VTbGlkaW5nPSExLHRoaXMuX3N0b3AoZSx0aGlzLl9oYW5kbGVJbmRleCksdGhpcy5fY2hhbmdlKGUsdGhpcy5faGFuZGxlSW5kZXgpLHRoaXMuX2hhbmRsZUluZGV4PW51bGwsdGhpcy5fY2xpY2tPZmZzZXQ9bnVsbCx0aGlzLl9hbmltYXRlT2ZmPSExLCExfSxfZGV0ZWN0T3JpZW50YXRpb246ZnVuY3Rpb24oKXt0aGlzLm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCI9PT10aGlzLm9wdGlvbnMub3JpZW50YXRpb24/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCJ9LF9ub3JtVmFsdWVGcm9tTW91c2U6ZnVuY3Rpb24oZSl7dmFyIHQsaSxzLG4sYTtyZXR1cm4iaG9yaXpvbnRhbCI9PT10aGlzLm9yaWVudGF0aW9uPyh0PXRoaXMuZWxlbWVudFNpemUud2lkdGgsaT1lLngtdGhpcy5lbGVtZW50T2Zmc2V0LmxlZnQtKHRoaXMuX2NsaWNrT2Zmc2V0P3RoaXMuX2NsaWNrT2Zmc2V0LmxlZnQ6MCkpOih0PXRoaXMuZWxlbWVudFNpemUuaGVpZ2h0LGk9ZS55LXRoaXMuZWxlbWVudE9mZnNldC50b3AtKHRoaXMuX2NsaWNrT2Zmc2V0P3RoaXMuX2NsaWNrT2Zmc2V0LnRvcDowKSkscz1pL3Qscz4xJiYocz0xKSwwPnMmJihzPTApLCJ2ZXJ0aWNhbCI9PT10aGlzLm9yaWVudGF0aW9uJiYocz0xLXMpLG49dGhpcy5fdmFsdWVNYXgoKS10aGlzLl92YWx1ZU1pbigpLGE9dGhpcy5fdmFsdWVNaW4oKStzKm4sdGhpcy5fdHJpbUFsaWduVmFsdWUoYSl9LF9zdGFydDpmdW5jdGlvbihlLHQpe3ZhciBpPXtoYW5kbGU6dGhpcy5oYW5kbGVzW3RdLHZhbHVlOnRoaXMudmFsdWUoKX07cmV0dXJuIHRoaXMub3B0aW9ucy52YWx1ZXMmJnRoaXMub3B0aW9ucy52YWx1ZXMubGVuZ3RoJiYoaS52YWx1ZT10aGlzLnZhbHVlcyh0KSxpLnZhbHVlcz10aGlzLnZhbHVlcygpKSx0aGlzLl90cmlnZ2VyKCJzdGFydCIsZSxpKX0sX3NsaWRlOmZ1bmN0aW9uKGUsdCxpKXt2YXIgcyxuLGE7dGhpcy5vcHRpb25zLnZhbHVlcyYmdGhpcy5vcHRpb25zLnZhbHVlcy5sZW5ndGg/KHM9dGhpcy52YWx1ZXModD8wOjEpLDI9PT10aGlzLm9wdGlvbnMudmFsdWVzLmxlbmd0aCYmdGhpcy5vcHRpb25zLnJhbmdlPT09ITAmJigwPT09dCYmaT5zfHwxPT09dCYmcz5pKSYmKGk9cyksaSE9PXRoaXMudmFsdWVzKHQpJiYobj10aGlzLnZhbHVlcygpLG5bdF09aSxhPXRoaXMuX3RyaWdnZXIoInNsaWRlIixlLHtoYW5kbGU6dGhpcy5oYW5kbGVzW3RdLHZhbHVlOmksdmFsdWVzOm59KSxzPXRoaXMudmFsdWVzKHQ/MDoxKSxhIT09ITEmJnRoaXMudmFsdWVzKHQsaSkpKTppIT09dGhpcy52YWx1ZSgpJiYoYT10aGlzLl90cmlnZ2VyKCJzbGlkZSIsZSx7aGFuZGxlOnRoaXMuaGFuZGxlc1t0XSx2YWx1ZTppfSksYSE9PSExJiZ0aGlzLnZhbHVlKGkpKX0sX3N0b3A6ZnVuY3Rpb24oZSx0KXt2YXIgaT17aGFuZGxlOnRoaXMuaGFuZGxlc1t0XSx2YWx1ZTp0aGlzLnZhbHVlKCl9O3RoaXMub3B0aW9ucy52YWx1ZXMmJnRoaXMub3B0aW9ucy52YWx1ZXMubGVuZ3RoJiYoaS52YWx1ZT10aGlzLnZhbHVlcyh0KSxpLnZhbHVlcz10aGlzLnZhbHVlcygpKSx0aGlzLl90cmlnZ2VyKCJzdG9wIixlLGkpfSxfY2hhbmdlOmZ1bmN0aW9uKGUsdCl7aWYoIXRoaXMuX2tleVNsaWRpbmcmJiF0aGlzLl9tb3VzZVNsaWRpbmcpe3ZhciBpPXtoYW5kbGU6dGhpcy5oYW5kbGVzW3RdLHZhbHVlOnRoaXMudmFsdWUoKX07dGhpcy5vcHRpb25zLnZhbHVlcyYmdGhpcy5vcHRpb25zLnZhbHVlcy5sZW5ndGgmJihpLnZhbHVlPXRoaXMudmFsdWVzKHQpLGkudmFsdWVzPXRoaXMudmFsdWVzKCkpLHRoaXMuX2xhc3RDaGFuZ2VkVmFsdWU9dCx0aGlzLl90cmlnZ2VyKCJjaGFuZ2UiLGUsaSl9fSx2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odGhpcy5vcHRpb25zLnZhbHVlPXRoaXMuX3RyaW1BbGlnblZhbHVlKGUpLHRoaXMuX3JlZnJlc2hWYWx1ZSgpLHRoaXMuX2NoYW5nZShudWxsLDApLHZvaWQgMCk6dGhpcy5fdmFsdWUoKX0sdmFsdWVzOmZ1bmN0aW9uKHQsaSl7dmFyIHMsbixhO2lmKGFyZ3VtZW50cy5sZW5ndGg+MSlyZXR1cm4gdGhpcy5vcHRpb25zLnZhbHVlc1t0XT10aGlzLl90cmltQWxpZ25WYWx1ZShpKSx0aGlzLl9yZWZyZXNoVmFsdWUoKSx0aGlzLl9jaGFuZ2UobnVsbCx0KSx2b2lkIDA7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHRoaXMuX3ZhbHVlcygpO2lmKCFlLmlzQXJyYXkoYXJndW1lbnRzWzBdKSlyZXR1cm4gdGhpcy5vcHRpb25zLnZhbHVlcyYmdGhpcy5vcHRpb25zLnZhbHVlcy5sZW5ndGg/dGhpcy5fdmFsdWVzKHQpOnRoaXMudmFsdWUoKTtmb3Iocz10aGlzLm9wdGlvbnMudmFsdWVzLG49YXJndW1lbnRzWzBdLGE9MDtzLmxlbmd0aD5hO2ErPTEpc1thXT10aGlzLl90cmltQWxpZ25WYWx1ZShuW2FdKSx0aGlzLl9jaGFuZ2UobnVsbCxhKTt0aGlzLl9yZWZyZXNoVmFsdWUoKX0sX3NldE9wdGlvbjpmdW5jdGlvbih0LGkpe3ZhciBzLG49MDtzd2l0Y2goInJhbmdlIj09PXQmJnRoaXMub3B0aW9ucy5yYW5nZT09PSEwJiYoIm1pbiI9PT1pPyh0aGlzLm9wdGlvbnMudmFsdWU9dGhpcy5fdmFsdWVzKDApLHRoaXMub3B0aW9ucy52YWx1ZXM9bnVsbCk6Im1heCI9PT1pJiYodGhpcy5vcHRpb25zLnZhbHVlPXRoaXMuX3ZhbHVlcyh0aGlzLm9wdGlvbnMudmFsdWVzLmxlbmd0aC0xKSx0aGlzLm9wdGlvbnMudmFsdWVzPW51bGwpKSxlLmlzQXJyYXkodGhpcy5vcHRpb25zLnZhbHVlcykmJihuPXRoaXMub3B0aW9ucy52YWx1ZXMubGVuZ3RoKSwiZGlzYWJsZWQiPT09dCYmdGhpcy5lbGVtZW50LnRvZ2dsZUNsYXNzKCJ1aS1zdGF0ZS1kaXNhYmxlZCIsISFpKSx0aGlzLl9zdXBlcih0LGkpLHQpe2Nhc2Uib3JpZW50YXRpb24iOnRoaXMuX2RldGVjdE9yaWVudGF0aW9uKCksdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1zbGlkZXItaG9yaXpvbnRhbCB1aS1zbGlkZXItdmVydGljYWwiKS5hZGRDbGFzcygidWktc2xpZGVyLSIrdGhpcy5vcmllbnRhdGlvbiksdGhpcy5fcmVmcmVzaFZhbHVlKCksdGhpcy5oYW5kbGVzLmNzcygiaG9yaXpvbnRhbCI9PT1pPyJib3R0b20iOiJsZWZ0IiwiIik7YnJlYWs7Y2FzZSJ2YWx1ZSI6dGhpcy5fYW5pbWF0ZU9mZj0hMCx0aGlzLl9yZWZyZXNoVmFsdWUoKSx0aGlzLl9jaGFuZ2UobnVsbCwwKSx0aGlzLl9hbmltYXRlT2ZmPSExO2JyZWFrO2Nhc2UidmFsdWVzIjpmb3IodGhpcy5fYW5pbWF0ZU9mZj0hMCx0aGlzLl9yZWZyZXNoVmFsdWUoKSxzPTA7bj5zO3MrPTEpdGhpcy5fY2hhbmdlKG51bGwscyk7dGhpcy5fYW5pbWF0ZU9mZj0hMTticmVhaztjYXNlInN0ZXAiOmNhc2UibWluIjpjYXNlIm1heCI6dGhpcy5fYW5pbWF0ZU9mZj0hMCx0aGlzLl9jYWxjdWxhdGVOZXdNYXgoKSx0aGlzLl9yZWZyZXNoVmFsdWUoKSx0aGlzLl9hbmltYXRlT2ZmPSExO2JyZWFrO2Nhc2UicmFuZ2UiOnRoaXMuX2FuaW1hdGVPZmY9ITAsdGhpcy5fcmVmcmVzaCgpLHRoaXMuX2FuaW1hdGVPZmY9ITF9fSxfdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm9wdGlvbnMudmFsdWU7cmV0dXJuIGU9dGhpcy5fdHJpbUFsaWduVmFsdWUoZSl9LF92YWx1ZXM6ZnVuY3Rpb24oZSl7dmFyIHQsaSxzO2lmKGFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHQ9dGhpcy5vcHRpb25zLnZhbHVlc1tlXSx0PXRoaXMuX3RyaW1BbGlnblZhbHVlKHQpO2lmKHRoaXMub3B0aW9ucy52YWx1ZXMmJnRoaXMub3B0aW9ucy52YWx1ZXMubGVuZ3RoKXtmb3IoaT10aGlzLm9wdGlvbnMudmFsdWVzLnNsaWNlKCkscz0wO2kubGVuZ3RoPnM7cys9MSlpW3NdPXRoaXMuX3RyaW1BbGlnblZhbHVlKGlbc10pO3JldHVybiBpfXJldHVybltdfSxfdHJpbUFsaWduVmFsdWU6ZnVuY3Rpb24oZSl7aWYodGhpcy5fdmFsdWVNaW4oKT49ZSlyZXR1cm4gdGhpcy5fdmFsdWVNaW4oKTtpZihlPj10aGlzLl92YWx1ZU1heCgpKXJldHVybiB0aGlzLl92YWx1ZU1heCgpO3ZhciB0PXRoaXMub3B0aW9ucy5zdGVwPjA/dGhpcy5vcHRpb25zLnN0ZXA6MSxpPShlLXRoaXMuX3ZhbHVlTWluKCkpJXQscz1lLWk7cmV0dXJuIDIqTWF0aC5hYnMoaSk+PXQmJihzKz1pPjA/dDotdCkscGFyc2VGbG9hdChzLnRvRml4ZWQoNSkpfSxfY2FsY3VsYXRlTmV3TWF4OmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vcHRpb25zLm1heCx0PXRoaXMuX3ZhbHVlTWluKCksaT10aGlzLm9wdGlvbnMuc3RlcCxzPU1hdGguZmxvb3IoKyhlLXQpLnRvRml4ZWQodGhpcy5fcHJlY2lzaW9uKCkpL2kpKmk7ZT1zK3QsdGhpcy5tYXg9cGFyc2VGbG9hdChlLnRvRml4ZWQodGhpcy5fcHJlY2lzaW9uKCkpKX0sX3ByZWNpc2lvbjpmdW5jdGlvbigpe3ZhciBlPXRoaXMuX3ByZWNpc2lvbk9mKHRoaXMub3B0aW9ucy5zdGVwKTtyZXR1cm4gbnVsbCE9PXRoaXMub3B0aW9ucy5taW4mJihlPU1hdGgubWF4KGUsdGhpcy5fcHJlY2lzaW9uT2YodGhpcy5vcHRpb25zLm1pbikpKSxlfSxfcHJlY2lzaW9uT2Y6ZnVuY3Rpb24oZSl7dmFyIHQ9IiIrZSxpPXQuaW5kZXhPZigiLiIpO3JldHVybi0xPT09aT8wOnQubGVuZ3RoLWktMX0sX3ZhbHVlTWluOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3B0aW9ucy5taW59LF92YWx1ZU1heDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1heH0sX3JlZnJlc2hWYWx1ZTpmdW5jdGlvbigpe3ZhciB0LGkscyxuLGEsbz10aGlzLm9wdGlvbnMucmFuZ2Uscj10aGlzLm9wdGlvbnMsaD10aGlzLGw9dGhpcy5fYW5pbWF0ZU9mZj8hMTpyLmFuaW1hdGUsdT17fTt0aGlzLm9wdGlvbnMudmFsdWVzJiZ0aGlzLm9wdGlvbnMudmFsdWVzLmxlbmd0aD90aGlzLmhhbmRsZXMuZWFjaChmdW5jdGlvbihzKXtpPTEwMCooKGgudmFsdWVzKHMpLWguX3ZhbHVlTWluKCkpLyhoLl92YWx1ZU1heCgpLWguX3ZhbHVlTWluKCkpKSx1WyJob3Jpem9udGFsIj09PWgub3JpZW50YXRpb24/ImxlZnQiOiJib3R0b20iXT1pKyIlIixlKHRoaXMpLnN0b3AoMSwxKVtsPyJhbmltYXRlIjoiY3NzIl0odSxyLmFuaW1hdGUpLGgub3B0aW9ucy5yYW5nZT09PSEwJiYoImhvcml6b250YWwiPT09aC5vcmllbnRhdGlvbj8oMD09PXMmJmgucmFuZ2Uuc3RvcCgxLDEpW2w/ImFuaW1hdGUiOiJjc3MiXSh7bGVmdDppKyIlIn0sci5hbmltYXRlKSwxPT09cyYmaC5yYW5nZVtsPyJhbmltYXRlIjoiY3NzIl0oe3dpZHRoOmktdCsiJSJ9LHtxdWV1ZTohMSxkdXJhdGlvbjpyLmFuaW1hdGV9KSk6KDA9PT1zJiZoLnJhbmdlLnN0b3AoMSwxKVtsPyJhbmltYXRlIjoiY3NzIl0oe2JvdHRvbTppKyIlIn0sci5hbmltYXRlKSwxPT09cyYmaC5yYW5nZVtsPyJhbmltYXRlIjoiY3NzIl0oe2hlaWdodDppLXQrIiUifSx7cXVldWU6ITEsZHVyYXRpb246ci5hbmltYXRlfSkpKSx0PWl9KToocz10aGlzLnZhbHVlKCksbj10aGlzLl92YWx1ZU1pbigpLGE9dGhpcy5fdmFsdWVNYXgoKSxpPWEhPT1uPzEwMCooKHMtbikvKGEtbikpOjAsdVsiaG9yaXpvbnRhbCI9PT10aGlzLm9yaWVudGF0aW9uPyJsZWZ0IjoiYm90dG9tIl09aSsiJSIsdGhpcy5oYW5kbGUuc3RvcCgxLDEpW2w/ImFuaW1hdGUiOiJjc3MiXSh1LHIuYW5pbWF0ZSksIm1pbiI9PT1vJiYiaG9yaXpvbnRhbCI9PT10aGlzLm9yaWVudGF0aW9uJiZ0aGlzLnJhbmdlLnN0b3AoMSwxKVtsPyJhbmltYXRlIjoiY3NzIl0oe3dpZHRoOmkrIiUifSxyLmFuaW1hdGUpLCJtYXgiPT09byYmImhvcml6b250YWwiPT09dGhpcy5vcmllbnRhdGlvbiYmdGhpcy5yYW5nZVtsPyJhbmltYXRlIjoiY3NzIl0oe3dpZHRoOjEwMC1pKyIlIn0se3F1ZXVlOiExLGR1cmF0aW9uOnIuYW5pbWF0ZX0pLCJtaW4iPT09byYmInZlcnRpY2FsIj09PXRoaXMub3JpZW50YXRpb24mJnRoaXMucmFuZ2Uuc3RvcCgxLDEpW2w/ImFuaW1hdGUiOiJjc3MiXSh7aGVpZ2h0OmkrIiUifSxyLmFuaW1hdGUpLCJtYXgiPT09byYmInZlcnRpY2FsIj09PXRoaXMub3JpZW50YXRpb24mJnRoaXMucmFuZ2VbbD8iYW5pbWF0ZSI6ImNzcyJdKHtoZWlnaHQ6MTAwLWkrIiUifSx7cXVldWU6ITEsZHVyYXRpb246ci5hbmltYXRlfSkpfSxfaGFuZGxlRXZlbnRzOntrZXlkb3duOmZ1bmN0aW9uKHQpe3ZhciBpLHMsbixhLG89ZSh0LnRhcmdldCkuZGF0YSgidWktc2xpZGVyLWhhbmRsZS1pbmRleCIpO3N3aXRjaCh0LmtleUNvZGUpe2Nhc2UgZS51aS5rZXlDb2RlLkhPTUU6Y2FzZSBlLnVpLmtleUNvZGUuRU5EOmNhc2UgZS51aS5rZXlDb2RlLlBBR0VfVVA6Y2FzZSBlLnVpLmtleUNvZGUuUEFHRV9ET1dOOmNhc2UgZS51aS5rZXlDb2RlLlVQOmNhc2UgZS51aS5rZXlDb2RlLlJJR0hUOmNhc2UgZS51aS5rZXlDb2RlLkRPV046Y2FzZSBlLnVpLmtleUNvZGUuTEVGVDppZih0LnByZXZlbnREZWZhdWx0KCksIXRoaXMuX2tleVNsaWRpbmcmJih0aGlzLl9rZXlTbGlkaW5nPSEwLGUodC50YXJnZXQpLmFkZENsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKSxpPXRoaXMuX3N0YXJ0KHQsbyksaT09PSExKSlyZXR1cm59c3dpdGNoKGE9dGhpcy5vcHRpb25zLnN0ZXAscz1uPXRoaXMub3B0aW9ucy52YWx1ZXMmJnRoaXMub3B0aW9ucy52YWx1ZXMubGVuZ3RoP3RoaXMudmFsdWVzKG8pOnRoaXMudmFsdWUoKSx0LmtleUNvZGUpe2Nhc2UgZS51aS5rZXlDb2RlLkhPTUU6bj10aGlzLl92YWx1ZU1pbigpO2JyZWFrO2Nhc2UgZS51aS5rZXlDb2RlLkVORDpuPXRoaXMuX3ZhbHVlTWF4KCk7YnJlYWs7Y2FzZSBlLnVpLmtleUNvZGUuUEFHRV9VUDpuPXRoaXMuX3RyaW1BbGlnblZhbHVlKHMrKHRoaXMuX3ZhbHVlTWF4KCktdGhpcy5fdmFsdWVNaW4oKSkvdGhpcy5udW1QYWdlcyk7YnJlYWs7Y2FzZSBlLnVpLmtleUNvZGUuUEFHRV9ET1dOOm49dGhpcy5fdHJpbUFsaWduVmFsdWUocy0odGhpcy5fdmFsdWVNYXgoKS10aGlzLl92YWx1ZU1pbigpKS90aGlzLm51bVBhZ2VzKTticmVhaztjYXNlIGUudWkua2V5Q29kZS5VUDpjYXNlIGUudWkua2V5Q29kZS5SSUdIVDppZihzPT09dGhpcy5fdmFsdWVNYXgoKSlyZXR1cm47bj10aGlzLl90cmltQWxpZ25WYWx1ZShzK2EpO2JyZWFrO2Nhc2UgZS51aS5rZXlDb2RlLkRPV046Y2FzZSBlLnVpLmtleUNvZGUuTEVGVDppZihzPT09dGhpcy5fdmFsdWVNaW4oKSlyZXR1cm47bj10aGlzLl90cmltQWxpZ25WYWx1ZShzLWEpfXRoaXMuX3NsaWRlKHQsbyxuKX0sa2V5dXA6ZnVuY3Rpb24odCl7dmFyIGk9ZSh0LnRhcmdldCkuZGF0YSgidWktc2xpZGVyLWhhbmRsZS1pbmRleCIpO3RoaXMuX2tleVNsaWRpbmcmJih0aGlzLl9rZXlTbGlkaW5nPSExLHRoaXMuX3N0b3AodCxpKSx0aGlzLl9jaGFuZ2UodCxpKSxlKHQudGFyZ2V0KS5yZW1vdmVDbGFzcygidWktc3RhdGUtYWN0aXZlIikpfX19KSxlLndpZGdldCgidWkuc29ydGFibGUiLGUudWkubW91c2Use3ZlcnNpb246IjEuMTEuNCIsd2lkZ2V0RXZlbnRQcmVmaXg6InNvcnQiLHJlYWR5OiExLG9wdGlvbnM6e2FwcGVuZFRvOiJwYXJlbnQiLGF4aXM6ITEsY29ubmVjdFdpdGg6ITEsY29udGFpbm1lbnQ6ITEsY3Vyc29yOiJhdXRvIixjdXJzb3JBdDohMSxkcm9wT25FbXB0eTohMCxmb3JjZVBsYWNlaG9sZGVyU2l6ZTohMSxmb3JjZUhlbHBlclNpemU6ITEsZ3JpZDohMSxoYW5kbGU6ITEsaGVscGVyOiJvcmlnaW5hbCIsaXRlbXM6Ij4gKiIsb3BhY2l0eTohMSxwbGFjZWhvbGRlcjohMSxyZXZlcnQ6ITEsc2Nyb2xsOiEwLHNjcm9sbFNlbnNpdGl2aXR5OjIwLHNjcm9sbFNwZWVkOjIwLHNjb3BlOiJkZWZhdWx0Iix0b2xlcmFuY2U6ImludGVyc2VjdCIsekluZGV4OjFlMyxhY3RpdmF0ZTpudWxsLGJlZm9yZVN0b3A6bnVsbCxjaGFuZ2U6bnVsbCxkZWFjdGl2YXRlOm51bGwsb3V0Om51bGwsb3ZlcjpudWxsLHJlY2VpdmU6bnVsbCxyZW1vdmU6bnVsbCxzb3J0Om51bGwsc3RhcnQ6bnVsbCxzdG9wOm51bGwsdXBkYXRlOm51bGx9LF9pc092ZXJBeGlzOmZ1bmN0aW9uKGUsdCxpKXtyZXR1cm4gZT49dCYmdCtpPmV9LF9pc0Zsb2F0aW5nOmZ1bmN0aW9uKGUpe3JldHVybi9sZWZ0fHJpZ2h0Ly50ZXN0KGUuY3NzKCJmbG9hdCIpKXx8L2lubGluZXx0YWJsZS1jZWxsLy50ZXN0KGUuY3NzKCJkaXNwbGF5IikpfSxfY3JlYXRlOmZ1bmN0aW9uKCl7dGhpcy5jb250YWluZXJDYWNoZT17fSx0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLXNvcnRhYmxlIiksdGhpcy5yZWZyZXNoKCksdGhpcy5vZmZzZXQ9dGhpcy5lbGVtZW50Lm9mZnNldCgpLHRoaXMuX21vdXNlSW5pdCgpLHRoaXMuX3NldEhhbmRsZUNsYXNzTmFtZSgpLHRoaXMucmVhZHk9ITB9LF9zZXRPcHRpb246ZnVuY3Rpb24oZSx0KXt0aGlzLl9zdXBlcihlLHQpLCJoYW5kbGUiPT09ZSYmdGhpcy5fc2V0SGFuZGxlQ2xhc3NOYW1lKCl9LF9zZXRIYW5kbGVDbGFzc05hbWU6ZnVuY3Rpb24oKXt0aGlzLmVsZW1lbnQuZmluZCgiLnVpLXNvcnRhYmxlLWhhbmRsZSIpLnJlbW92ZUNsYXNzKCJ1aS1zb3J0YWJsZS1oYW5kbGUiKSxlLmVhY2godGhpcy5pdGVtcyxmdW5jdGlvbigpeyh0aGlzLmluc3RhbmNlLm9wdGlvbnMuaGFuZGxlP3RoaXMuaXRlbS5maW5kKHRoaXMuaW5zdGFuY2Uub3B0aW9ucy5oYW5kbGUpOnRoaXMuaXRlbSkuYWRkQ2xhc3MoInVpLXNvcnRhYmxlLWhhbmRsZSIpfSl9LF9kZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1zb3J0YWJsZSB1aS1zb3J0YWJsZS1kaXNhYmxlZCIpLmZpbmQoIi51aS1zb3J0YWJsZS1oYW5kbGUiKS5yZW1vdmVDbGFzcygidWktc29ydGFibGUtaGFuZGxlIiksdGhpcy5fbW91c2VEZXN0cm95KCk7Zm9yKHZhciBlPXRoaXMuaXRlbXMubGVuZ3RoLTE7ZT49MDtlLS0pdGhpcy5pdGVtc1tlXS5pdGVtLnJlbW92ZURhdGEodGhpcy53aWRnZXROYW1lKyItaXRlbSIpO3JldHVybiB0aGlzfSxfbW91c2VDYXB0dXJlOmZ1bmN0aW9uKHQsaSl7dmFyIHM9bnVsbCxuPSExLGE9dGhpcztyZXR1cm4gdGhpcy5yZXZlcnRpbmc/ITE6dGhpcy5vcHRpb25zLmRpc2FibGVkfHwic3RhdGljIj09PXRoaXMub3B0aW9ucy50eXBlPyExOih0aGlzLl9yZWZyZXNoSXRlbXModCksZSh0LnRhcmdldCkucGFyZW50cygpLmVhY2goZnVuY3Rpb24oKXtyZXR1cm4gZS5kYXRhKHRoaXMsYS53aWRnZXROYW1lKyItaXRlbSIpPT09YT8ocz1lKHRoaXMpLCExKTp2b2lkIDB9KSxlLmRhdGEodC50YXJnZXQsYS53aWRnZXROYW1lKyItaXRlbSIpPT09YSYmKHM9ZSh0LnRhcmdldCkpLHM/IXRoaXMub3B0aW9ucy5oYW5kbGV8fGl8fChlKHRoaXMub3B0aW9ucy5oYW5kbGUscykuZmluZCgiKiIpLmFkZEJhY2soKS5lYWNoKGZ1bmN0aW9uKCl7dGhpcz09PXQudGFyZ2V0JiYobj0hMCl9KSxuKT8odGhpcy5jdXJyZW50SXRlbT1zLHRoaXMuX3JlbW92ZUN1cnJlbnRzRnJvbUl0ZW1zKCksITApOiExOiExKX0sX21vdXNlU3RhcnQ6ZnVuY3Rpb24odCxpLHMpe3ZhciBuLGEsbz10aGlzLm9wdGlvbnM7aWYodGhpcy5jdXJyZW50Q29udGFpbmVyPXRoaXMsdGhpcy5yZWZyZXNoUG9zaXRpb25zKCksdGhpcy5oZWxwZXI9dGhpcy5fY3JlYXRlSGVscGVyKHQpLHRoaXMuX2NhY2hlSGVscGVyUHJvcG9ydGlvbnMoKSx0aGlzLl9jYWNoZU1hcmdpbnMoKSx0aGlzLnNjcm9sbFBhcmVudD10aGlzLmhlbHBlci5zY3JvbGxQYXJlbnQoKSx0aGlzLm9mZnNldD10aGlzLmN1cnJlbnRJdGVtLm9mZnNldCgpLHRoaXMub2Zmc2V0PXt0b3A6dGhpcy5vZmZzZXQudG9wLXRoaXMubWFyZ2lucy50b3AsbGVmdDp0aGlzLm9mZnNldC5sZWZ0LXRoaXMubWFyZ2lucy5sZWZ0fSxlLmV4dGVuZCh0aGlzLm9mZnNldCx7Y2xpY2s6e2xlZnQ6dC5wYWdlWC10aGlzLm9mZnNldC5sZWZ0LHRvcDp0LnBhZ2VZLXRoaXMub2Zmc2V0LnRvcH0scGFyZW50OnRoaXMuX2dldFBhcmVudE9mZnNldCgpLHJlbGF0aXZlOnRoaXMuX2dldFJlbGF0aXZlT2Zmc2V0KCl9KSx0aGlzLmhlbHBlci5jc3MoInBvc2l0aW9uIiwiYWJzb2x1dGUiKSx0aGlzLmNzc1Bvc2l0aW9uPXRoaXMuaGVscGVyLmNzcygicG9zaXRpb24iKSx0aGlzLm9yaWdpbmFsUG9zaXRpb249dGhpcy5fZ2VuZXJhdGVQb3NpdGlvbih0KSx0aGlzLm9yaWdpbmFsUGFnZVg9dC5wYWdlWCx0aGlzLm9yaWdpbmFsUGFnZVk9dC5wYWdlWSxvLmN1cnNvckF0JiZ0aGlzLl9hZGp1c3RPZmZzZXRGcm9tSGVscGVyKG8uY3Vyc29yQXQpLHRoaXMuZG9tUG9zaXRpb249e3ByZXY6dGhpcy5jdXJyZW50SXRlbS5wcmV2KClbMF0scGFyZW50OnRoaXMuY3VycmVudEl0ZW0ucGFyZW50KClbMF19LHRoaXMuaGVscGVyWzBdIT09dGhpcy5jdXJyZW50SXRlbVswXSYmdGhpcy5jdXJyZW50SXRlbS5oaWRlKCksdGhpcy5fY3JlYXRlUGxhY2Vob2xkZXIoKSxvLmNvbnRhaW5tZW50JiZ0aGlzLl9zZXRDb250YWlubWVudCgpLG8uY3Vyc29yJiYiYXV0byIhPT1vLmN1cnNvciYmKGE9dGhpcy5kb2N1bWVudC5maW5kKCJib2R5IiksdGhpcy5zdG9yZWRDdXJzb3I9YS5jc3MoImN1cnNvciIpLGEuY3NzKCJjdXJzb3IiLG8uY3Vyc29yKSx0aGlzLnN0b3JlZFN0eWxlc2hlZXQ9ZSgiPHN0eWxlPip7IGN1cnNvcjogIitvLmN1cnNvcisiICFpbXBvcnRhbnQ7IH08L3N0eWxlPiIpLmFwcGVuZFRvKGEpKSxvLm9wYWNpdHkmJih0aGlzLmhlbHBlci5jc3MoIm9wYWNpdHkiKSYmKHRoaXMuX3N0b3JlZE9wYWNpdHk9dGhpcy5oZWxwZXIuY3NzKCJvcGFjaXR5IikpLHRoaXMuaGVscGVyLmNzcygib3BhY2l0eSIsby5vcGFjaXR5KSksby56SW5kZXgmJih0aGlzLmhlbHBlci5jc3MoInpJbmRleCIpJiYodGhpcy5fc3RvcmVkWkluZGV4PXRoaXMuaGVscGVyLmNzcygiekluZGV4IikpLHRoaXMuaGVscGVyLmNzcygiekluZGV4IixvLnpJbmRleCkpLHRoaXMuc2Nyb2xsUGFyZW50WzBdIT09dGhpcy5kb2N1bWVudFswXSYmIkhUTUwiIT09dGhpcy5zY3JvbGxQYXJlbnRbMF0udGFnTmFtZSYmKHRoaXMub3ZlcmZsb3dPZmZzZXQ9dGhpcy5zY3JvbGxQYXJlbnQub2Zmc2V0KCkpLHRoaXMuX3RyaWdnZXIoInN0YXJ0Iix0LHRoaXMuX3VpSGFzaCgpKSx0aGlzLl9wcmVzZXJ2ZUhlbHBlclByb3BvcnRpb25zfHx0aGlzLl9jYWNoZUhlbHBlclByb3BvcnRpb25zKCksIXMpZm9yKG49dGhpcy5jb250YWluZXJzLmxlbmd0aC0xO24+PTA7bi0tKXRoaXMuY29udGFpbmVyc1tuXS5fdHJpZ2dlcigiYWN0aXZhdGUiLHQsdGhpcy5fdWlIYXNoKHRoaXMpKTsKcmV0dXJuIGUudWkuZGRtYW5hZ2VyJiYoZS51aS5kZG1hbmFnZXIuY3VycmVudD10aGlzKSxlLnVpLmRkbWFuYWdlciYmIW8uZHJvcEJlaGF2aW91ciYmZS51aS5kZG1hbmFnZXIucHJlcGFyZU9mZnNldHModGhpcyx0KSx0aGlzLmRyYWdnaW5nPSEwLHRoaXMuaGVscGVyLmFkZENsYXNzKCJ1aS1zb3J0YWJsZS1oZWxwZXIiKSx0aGlzLl9tb3VzZURyYWcodCksITB9LF9tb3VzZURyYWc6ZnVuY3Rpb24odCl7dmFyIGkscyxuLGEsbz10aGlzLm9wdGlvbnMscj0hMTtmb3IodGhpcy5wb3NpdGlvbj10aGlzLl9nZW5lcmF0ZVBvc2l0aW9uKHQpLHRoaXMucG9zaXRpb25BYnM9dGhpcy5fY29udmVydFBvc2l0aW9uVG8oImFic29sdXRlIiksdGhpcy5sYXN0UG9zaXRpb25BYnN8fCh0aGlzLmxhc3RQb3NpdGlvbkFicz10aGlzLnBvc2l0aW9uQWJzKSx0aGlzLm9wdGlvbnMuc2Nyb2xsJiYodGhpcy5zY3JvbGxQYXJlbnRbMF0hPT10aGlzLmRvY3VtZW50WzBdJiYiSFRNTCIhPT10aGlzLnNjcm9sbFBhcmVudFswXS50YWdOYW1lPyh0aGlzLm92ZXJmbG93T2Zmc2V0LnRvcCt0aGlzLnNjcm9sbFBhcmVudFswXS5vZmZzZXRIZWlnaHQtdC5wYWdlWTxvLnNjcm9sbFNlbnNpdGl2aXR5P3RoaXMuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbFRvcD1yPXRoaXMuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbFRvcCtvLnNjcm9sbFNwZWVkOnQucGFnZVktdGhpcy5vdmVyZmxvd09mZnNldC50b3A8by5zY3JvbGxTZW5zaXRpdml0eSYmKHRoaXMuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbFRvcD1yPXRoaXMuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbFRvcC1vLnNjcm9sbFNwZWVkKSx0aGlzLm92ZXJmbG93T2Zmc2V0LmxlZnQrdGhpcy5zY3JvbGxQYXJlbnRbMF0ub2Zmc2V0V2lkdGgtdC5wYWdlWDxvLnNjcm9sbFNlbnNpdGl2aXR5P3RoaXMuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbExlZnQ9cj10aGlzLnNjcm9sbFBhcmVudFswXS5zY3JvbGxMZWZ0K28uc2Nyb2xsU3BlZWQ6dC5wYWdlWC10aGlzLm92ZXJmbG93T2Zmc2V0LmxlZnQ8by5zY3JvbGxTZW5zaXRpdml0eSYmKHRoaXMuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbExlZnQ9cj10aGlzLnNjcm9sbFBhcmVudFswXS5zY3JvbGxMZWZ0LW8uc2Nyb2xsU3BlZWQpKToodC5wYWdlWS10aGlzLmRvY3VtZW50LnNjcm9sbFRvcCgpPG8uc2Nyb2xsU2Vuc2l0aXZpdHk/cj10aGlzLmRvY3VtZW50LnNjcm9sbFRvcCh0aGlzLmRvY3VtZW50LnNjcm9sbFRvcCgpLW8uc2Nyb2xsU3BlZWQpOnRoaXMud2luZG93LmhlaWdodCgpLSh0LnBhZ2VZLXRoaXMuZG9jdW1lbnQuc2Nyb2xsVG9wKCkpPG8uc2Nyb2xsU2Vuc2l0aXZpdHkmJihyPXRoaXMuZG9jdW1lbnQuc2Nyb2xsVG9wKHRoaXMuZG9jdW1lbnQuc2Nyb2xsVG9wKCkrby5zY3JvbGxTcGVlZCkpLHQucGFnZVgtdGhpcy5kb2N1bWVudC5zY3JvbGxMZWZ0KCk8by5zY3JvbGxTZW5zaXRpdml0eT9yPXRoaXMuZG9jdW1lbnQuc2Nyb2xsTGVmdCh0aGlzLmRvY3VtZW50LnNjcm9sbExlZnQoKS1vLnNjcm9sbFNwZWVkKTp0aGlzLndpbmRvdy53aWR0aCgpLSh0LnBhZ2VYLXRoaXMuZG9jdW1lbnQuc2Nyb2xsTGVmdCgpKTxvLnNjcm9sbFNlbnNpdGl2aXR5JiYocj10aGlzLmRvY3VtZW50LnNjcm9sbExlZnQodGhpcy5kb2N1bWVudC5zY3JvbGxMZWZ0KCkrby5zY3JvbGxTcGVlZCkpKSxyIT09ITEmJmUudWkuZGRtYW5hZ2VyJiYhby5kcm9wQmVoYXZpb3VyJiZlLnVpLmRkbWFuYWdlci5wcmVwYXJlT2Zmc2V0cyh0aGlzLHQpKSx0aGlzLnBvc2l0aW9uQWJzPXRoaXMuX2NvbnZlcnRQb3NpdGlvblRvKCJhYnNvbHV0ZSIpLHRoaXMub3B0aW9ucy5heGlzJiYieSI9PT10aGlzLm9wdGlvbnMuYXhpc3x8KHRoaXMuaGVscGVyWzBdLnN0eWxlLmxlZnQ9dGhpcy5wb3NpdGlvbi5sZWZ0KyJweCIpLHRoaXMub3B0aW9ucy5heGlzJiYieCI9PT10aGlzLm9wdGlvbnMuYXhpc3x8KHRoaXMuaGVscGVyWzBdLnN0eWxlLnRvcD10aGlzLnBvc2l0aW9uLnRvcCsicHgiKSxpPXRoaXMuaXRlbXMubGVuZ3RoLTE7aT49MDtpLS0paWYocz10aGlzLml0ZW1zW2ldLG49cy5pdGVtWzBdLGE9dGhpcy5faW50ZXJzZWN0c1dpdGhQb2ludGVyKHMpLGEmJnMuaW5zdGFuY2U9PT10aGlzLmN1cnJlbnRDb250YWluZXImJm4hPT10aGlzLmN1cnJlbnRJdGVtWzBdJiZ0aGlzLnBsYWNlaG9sZGVyWzE9PT1hPyJuZXh0IjoicHJldiJdKClbMF0hPT1uJiYhZS5jb250YWlucyh0aGlzLnBsYWNlaG9sZGVyWzBdLG4pJiYoInNlbWktZHluYW1pYyI9PT10aGlzLm9wdGlvbnMudHlwZT8hZS5jb250YWlucyh0aGlzLmVsZW1lbnRbMF0sbik6ITApKXtpZih0aGlzLmRpcmVjdGlvbj0xPT09YT8iZG93biI6InVwIiwicG9pbnRlciIhPT10aGlzLm9wdGlvbnMudG9sZXJhbmNlJiYhdGhpcy5faW50ZXJzZWN0c1dpdGhTaWRlcyhzKSlicmVhazt0aGlzLl9yZWFycmFuZ2UodCxzKSx0aGlzLl90cmlnZ2VyKCJjaGFuZ2UiLHQsdGhpcy5fdWlIYXNoKCkpO2JyZWFrfXJldHVybiB0aGlzLl9jb250YWN0Q29udGFpbmVycyh0KSxlLnVpLmRkbWFuYWdlciYmZS51aS5kZG1hbmFnZXIuZHJhZyh0aGlzLHQpLHRoaXMuX3RyaWdnZXIoInNvcnQiLHQsdGhpcy5fdWlIYXNoKCkpLHRoaXMubGFzdFBvc2l0aW9uQWJzPXRoaXMucG9zaXRpb25BYnMsITF9LF9tb3VzZVN0b3A6ZnVuY3Rpb24odCxpKXtpZih0KXtpZihlLnVpLmRkbWFuYWdlciYmIXRoaXMub3B0aW9ucy5kcm9wQmVoYXZpb3VyJiZlLnVpLmRkbWFuYWdlci5kcm9wKHRoaXMsdCksdGhpcy5vcHRpb25zLnJldmVydCl7dmFyIHM9dGhpcyxuPXRoaXMucGxhY2Vob2xkZXIub2Zmc2V0KCksYT10aGlzLm9wdGlvbnMuYXhpcyxvPXt9O2EmJiJ4IiE9PWF8fChvLmxlZnQ9bi5sZWZ0LXRoaXMub2Zmc2V0LnBhcmVudC5sZWZ0LXRoaXMubWFyZ2lucy5sZWZ0Kyh0aGlzLm9mZnNldFBhcmVudFswXT09PXRoaXMuZG9jdW1lbnRbMF0uYm9keT8wOnRoaXMub2Zmc2V0UGFyZW50WzBdLnNjcm9sbExlZnQpKSxhJiYieSIhPT1hfHwoby50b3A9bi50b3AtdGhpcy5vZmZzZXQucGFyZW50LnRvcC10aGlzLm1hcmdpbnMudG9wKyh0aGlzLm9mZnNldFBhcmVudFswXT09PXRoaXMuZG9jdW1lbnRbMF0uYm9keT8wOnRoaXMub2Zmc2V0UGFyZW50WzBdLnNjcm9sbFRvcCkpLHRoaXMucmV2ZXJ0aW5nPSEwLGUodGhpcy5oZWxwZXIpLmFuaW1hdGUobyxwYXJzZUludCh0aGlzLm9wdGlvbnMucmV2ZXJ0LDEwKXx8NTAwLGZ1bmN0aW9uKCl7cy5fY2xlYXIodCl9KX1lbHNlIHRoaXMuX2NsZWFyKHQsaSk7cmV0dXJuITF9fSxjYW5jZWw6ZnVuY3Rpb24oKXtpZih0aGlzLmRyYWdnaW5nKXt0aGlzLl9tb3VzZVVwKHt0YXJnZXQ6bnVsbH0pLCJvcmlnaW5hbCI9PT10aGlzLm9wdGlvbnMuaGVscGVyP3RoaXMuY3VycmVudEl0ZW0uY3NzKHRoaXMuX3N0b3JlZENTUykucmVtb3ZlQ2xhc3MoInVpLXNvcnRhYmxlLWhlbHBlciIpOnRoaXMuY3VycmVudEl0ZW0uc2hvdygpO2Zvcih2YXIgdD10aGlzLmNvbnRhaW5lcnMubGVuZ3RoLTE7dD49MDt0LS0pdGhpcy5jb250YWluZXJzW3RdLl90cmlnZ2VyKCJkZWFjdGl2YXRlIixudWxsLHRoaXMuX3VpSGFzaCh0aGlzKSksdGhpcy5jb250YWluZXJzW3RdLmNvbnRhaW5lckNhY2hlLm92ZXImJih0aGlzLmNvbnRhaW5lcnNbdF0uX3RyaWdnZXIoIm91dCIsbnVsbCx0aGlzLl91aUhhc2godGhpcykpLHRoaXMuY29udGFpbmVyc1t0XS5jb250YWluZXJDYWNoZS5vdmVyPTApfXJldHVybiB0aGlzLnBsYWNlaG9sZGVyJiYodGhpcy5wbGFjZWhvbGRlclswXS5wYXJlbnROb2RlJiZ0aGlzLnBsYWNlaG9sZGVyWzBdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5wbGFjZWhvbGRlclswXSksIm9yaWdpbmFsIiE9PXRoaXMub3B0aW9ucy5oZWxwZXImJnRoaXMuaGVscGVyJiZ0aGlzLmhlbHBlclswXS5wYXJlbnROb2RlJiZ0aGlzLmhlbHBlci5yZW1vdmUoKSxlLmV4dGVuZCh0aGlzLHtoZWxwZXI6bnVsbCxkcmFnZ2luZzohMSxyZXZlcnRpbmc6ITEsX25vRmluYWxTb3J0Om51bGx9KSx0aGlzLmRvbVBvc2l0aW9uLnByZXY/ZSh0aGlzLmRvbVBvc2l0aW9uLnByZXYpLmFmdGVyKHRoaXMuY3VycmVudEl0ZW0pOmUodGhpcy5kb21Qb3NpdGlvbi5wYXJlbnQpLnByZXBlbmQodGhpcy5jdXJyZW50SXRlbSkpLHRoaXN9LHNlcmlhbGl6ZTpmdW5jdGlvbih0KXt2YXIgaT10aGlzLl9nZXRJdGVtc0FzalF1ZXJ5KHQmJnQuY29ubmVjdGVkKSxzPVtdO3JldHVybiB0PXR8fHt9LGUoaSkuZWFjaChmdW5jdGlvbigpe3ZhciBpPShlKHQuaXRlbXx8dGhpcykuYXR0cih0LmF0dHJpYnV0ZXx8ImlkIil8fCIiKS5tYXRjaCh0LmV4cHJlc3Npb258fC8oLispW1wtPV9dKC4rKS8pO2kmJnMucHVzaCgodC5rZXl8fGlbMV0rIltdIikrIj0iKyh0LmtleSYmdC5leHByZXNzaW9uP2lbMV06aVsyXSkpfSksIXMubGVuZ3RoJiZ0LmtleSYmcy5wdXNoKHQua2V5KyI9Iikscy5qb2luKCImIil9LHRvQXJyYXk6ZnVuY3Rpb24odCl7dmFyIGk9dGhpcy5fZ2V0SXRlbXNBc2pRdWVyeSh0JiZ0LmNvbm5lY3RlZCkscz1bXTtyZXR1cm4gdD10fHx7fSxpLmVhY2goZnVuY3Rpb24oKXtzLnB1c2goZSh0Lml0ZW18fHRoaXMpLmF0dHIodC5hdHRyaWJ1dGV8fCJpZCIpfHwiIil9KSxzfSxfaW50ZXJzZWN0c1dpdGg6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5wb3NpdGlvbkFicy5sZWZ0LGk9dCt0aGlzLmhlbHBlclByb3BvcnRpb25zLndpZHRoLHM9dGhpcy5wb3NpdGlvbkFicy50b3Asbj1zK3RoaXMuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LGE9ZS5sZWZ0LG89YStlLndpZHRoLHI9ZS50b3AsaD1yK2UuaGVpZ2h0LGw9dGhpcy5vZmZzZXQuY2xpY2sudG9wLHU9dGhpcy5vZmZzZXQuY2xpY2subGVmdCxkPSJ4Ij09PXRoaXMub3B0aW9ucy5heGlzfHxzK2w+ciYmaD5zK2wsYz0ieSI9PT10aGlzLm9wdGlvbnMuYXhpc3x8dCt1PmEmJm8+dCt1LHA9ZCYmYztyZXR1cm4icG9pbnRlciI9PT10aGlzLm9wdGlvbnMudG9sZXJhbmNlfHx0aGlzLm9wdGlvbnMuZm9yY2VQb2ludGVyRm9yQ29udGFpbmVyc3x8InBvaW50ZXIiIT09dGhpcy5vcHRpb25zLnRvbGVyYW5jZSYmdGhpcy5oZWxwZXJQcm9wb3J0aW9uc1t0aGlzLmZsb2F0aW5nPyJ3aWR0aCI6ImhlaWdodCJdPmVbdGhpcy5mbG9hdGluZz8id2lkdGgiOiJoZWlnaHQiXT9wOnQrdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aC8yPmEmJm8+aS10aGlzLmhlbHBlclByb3BvcnRpb25zLndpZHRoLzImJnMrdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQvMj5yJiZoPm4tdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQvMn0sX2ludGVyc2VjdHNXaXRoUG9pbnRlcjpmdW5jdGlvbihlKXt2YXIgdD0ieCI9PT10aGlzLm9wdGlvbnMuYXhpc3x8dGhpcy5faXNPdmVyQXhpcyh0aGlzLnBvc2l0aW9uQWJzLnRvcCt0aGlzLm9mZnNldC5jbGljay50b3AsZS50b3AsZS5oZWlnaHQpLGk9InkiPT09dGhpcy5vcHRpb25zLmF4aXN8fHRoaXMuX2lzT3ZlckF4aXModGhpcy5wb3NpdGlvbkFicy5sZWZ0K3RoaXMub2Zmc2V0LmNsaWNrLmxlZnQsZS5sZWZ0LGUud2lkdGgpLHM9dCYmaSxuPXRoaXMuX2dldERyYWdWZXJ0aWNhbERpcmVjdGlvbigpLGE9dGhpcy5fZ2V0RHJhZ0hvcml6b250YWxEaXJlY3Rpb24oKTtyZXR1cm4gcz90aGlzLmZsb2F0aW5nP2EmJiJyaWdodCI9PT1hfHwiZG93biI9PT1uPzI6MTpuJiYoImRvd24iPT09bj8yOjEpOiExfSxfaW50ZXJzZWN0c1dpdGhTaWRlczpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9pc092ZXJBeGlzKHRoaXMucG9zaXRpb25BYnMudG9wK3RoaXMub2Zmc2V0LmNsaWNrLnRvcCxlLnRvcCtlLmhlaWdodC8yLGUuaGVpZ2h0KSxpPXRoaXMuX2lzT3ZlckF4aXModGhpcy5wb3NpdGlvbkFicy5sZWZ0K3RoaXMub2Zmc2V0LmNsaWNrLmxlZnQsZS5sZWZ0K2Uud2lkdGgvMixlLndpZHRoKSxzPXRoaXMuX2dldERyYWdWZXJ0aWNhbERpcmVjdGlvbigpLG49dGhpcy5fZ2V0RHJhZ0hvcml6b250YWxEaXJlY3Rpb24oKTtyZXR1cm4gdGhpcy5mbG9hdGluZyYmbj8icmlnaHQiPT09biYmaXx8ImxlZnQiPT09biYmIWk6cyYmKCJkb3duIj09PXMmJnR8fCJ1cCI9PT1zJiYhdCl9LF9nZXREcmFnVmVydGljYWxEaXJlY3Rpb246ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnBvc2l0aW9uQWJzLnRvcC10aGlzLmxhc3RQb3NpdGlvbkFicy50b3A7cmV0dXJuIDAhPT1lJiYoZT4wPyJkb3duIjoidXAiKX0sX2dldERyYWdIb3Jpem9udGFsRGlyZWN0aW9uOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5wb3NpdGlvbkFicy5sZWZ0LXRoaXMubGFzdFBvc2l0aW9uQWJzLmxlZnQ7cmV0dXJuIDAhPT1lJiYoZT4wPyJyaWdodCI6ImxlZnQiKX0scmVmcmVzaDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fcmVmcmVzaEl0ZW1zKGUpLHRoaXMuX3NldEhhbmRsZUNsYXNzTmFtZSgpLHRoaXMucmVmcmVzaFBvc2l0aW9ucygpLHRoaXN9LF9jb25uZWN0V2l0aDpmdW5jdGlvbigpe3ZhciBlPXRoaXMub3B0aW9ucztyZXR1cm4gZS5jb25uZWN0V2l0aC5jb25zdHJ1Y3Rvcj09PVN0cmluZz9bZS5jb25uZWN0V2l0aF06ZS5jb25uZWN0V2l0aH0sX2dldEl0ZW1zQXNqUXVlcnk6ZnVuY3Rpb24odCl7ZnVuY3Rpb24gaSgpe3IucHVzaCh0aGlzKX12YXIgcyxuLGEsbyxyPVtdLGg9W10sbD10aGlzLl9jb25uZWN0V2l0aCgpO2lmKGwmJnQpZm9yKHM9bC5sZW5ndGgtMTtzPj0wO3MtLSlmb3IoYT1lKGxbc10sdGhpcy5kb2N1bWVudFswXSksbj1hLmxlbmd0aC0xO24+PTA7bi0tKW89ZS5kYXRhKGFbbl0sdGhpcy53aWRnZXRGdWxsTmFtZSksbyYmbyE9PXRoaXMmJiFvLm9wdGlvbnMuZGlzYWJsZWQmJmgucHVzaChbZS5pc0Z1bmN0aW9uKG8ub3B0aW9ucy5pdGVtcyk/by5vcHRpb25zLml0ZW1zLmNhbGwoby5lbGVtZW50KTplKG8ub3B0aW9ucy5pdGVtcyxvLmVsZW1lbnQpLm5vdCgiLnVpLXNvcnRhYmxlLWhlbHBlciIpLm5vdCgiLnVpLXNvcnRhYmxlLXBsYWNlaG9sZGVyIiksb10pO2ZvcihoLnB1c2goW2UuaXNGdW5jdGlvbih0aGlzLm9wdGlvbnMuaXRlbXMpP3RoaXMub3B0aW9ucy5pdGVtcy5jYWxsKHRoaXMuZWxlbWVudCxudWxsLHtvcHRpb25zOnRoaXMub3B0aW9ucyxpdGVtOnRoaXMuY3VycmVudEl0ZW19KTplKHRoaXMub3B0aW9ucy5pdGVtcyx0aGlzLmVsZW1lbnQpLm5vdCgiLnVpLXNvcnRhYmxlLWhlbHBlciIpLm5vdCgiLnVpLXNvcnRhYmxlLXBsYWNlaG9sZGVyIiksdGhpc10pLHM9aC5sZW5ndGgtMTtzPj0wO3MtLSloW3NdWzBdLmVhY2goaSk7cmV0dXJuIGUocil9LF9yZW1vdmVDdXJyZW50c0Zyb21JdGVtczpmdW5jdGlvbigpe3ZhciB0PXRoaXMuY3VycmVudEl0ZW0uZmluZCgiOmRhdGEoIit0aGlzLndpZGdldE5hbWUrIi1pdGVtKSIpO3RoaXMuaXRlbXM9ZS5ncmVwKHRoaXMuaXRlbXMsZnVuY3Rpb24oZSl7Zm9yKHZhciBpPTA7dC5sZW5ndGg+aTtpKyspaWYodFtpXT09PWUuaXRlbVswXSlyZXR1cm4hMTtyZXR1cm4hMH0pfSxfcmVmcmVzaEl0ZW1zOmZ1bmN0aW9uKHQpe3RoaXMuaXRlbXM9W10sdGhpcy5jb250YWluZXJzPVt0aGlzXTt2YXIgaSxzLG4sYSxvLHIsaCxsLHU9dGhpcy5pdGVtcyxkPVtbZS5pc0Z1bmN0aW9uKHRoaXMub3B0aW9ucy5pdGVtcyk/dGhpcy5vcHRpb25zLml0ZW1zLmNhbGwodGhpcy5lbGVtZW50WzBdLHQse2l0ZW06dGhpcy5jdXJyZW50SXRlbX0pOmUodGhpcy5vcHRpb25zLml0ZW1zLHRoaXMuZWxlbWVudCksdGhpc11dLGM9dGhpcy5fY29ubmVjdFdpdGgoKTtpZihjJiZ0aGlzLnJlYWR5KWZvcihpPWMubGVuZ3RoLTE7aT49MDtpLS0pZm9yKG49ZShjW2ldLHRoaXMuZG9jdW1lbnRbMF0pLHM9bi5sZW5ndGgtMTtzPj0wO3MtLSlhPWUuZGF0YShuW3NdLHRoaXMud2lkZ2V0RnVsbE5hbWUpLGEmJmEhPT10aGlzJiYhYS5vcHRpb25zLmRpc2FibGVkJiYoZC5wdXNoKFtlLmlzRnVuY3Rpb24oYS5vcHRpb25zLml0ZW1zKT9hLm9wdGlvbnMuaXRlbXMuY2FsbChhLmVsZW1lbnRbMF0sdCx7aXRlbTp0aGlzLmN1cnJlbnRJdGVtfSk6ZShhLm9wdGlvbnMuaXRlbXMsYS5lbGVtZW50KSxhXSksdGhpcy5jb250YWluZXJzLnB1c2goYSkpO2ZvcihpPWQubGVuZ3RoLTE7aT49MDtpLS0pZm9yKG89ZFtpXVsxXSxyPWRbaV1bMF0scz0wLGw9ci5sZW5ndGg7bD5zO3MrKyloPWUocltzXSksaC5kYXRhKHRoaXMud2lkZ2V0TmFtZSsiLWl0ZW0iLG8pLHUucHVzaCh7aXRlbTpoLGluc3RhbmNlOm8sd2lkdGg6MCxoZWlnaHQ6MCxsZWZ0OjAsdG9wOjB9KX0scmVmcmVzaFBvc2l0aW9uczpmdW5jdGlvbih0KXt0aGlzLmZsb2F0aW5nPXRoaXMuaXRlbXMubGVuZ3RoPyJ4Ij09PXRoaXMub3B0aW9ucy5heGlzfHx0aGlzLl9pc0Zsb2F0aW5nKHRoaXMuaXRlbXNbMF0uaXRlbSk6ITEsdGhpcy5vZmZzZXRQYXJlbnQmJnRoaXMuaGVscGVyJiYodGhpcy5vZmZzZXQucGFyZW50PXRoaXMuX2dldFBhcmVudE9mZnNldCgpKTt2YXIgaSxzLG4sYTtmb3IoaT10aGlzLml0ZW1zLmxlbmd0aC0xO2k+PTA7aS0tKXM9dGhpcy5pdGVtc1tpXSxzLmluc3RhbmNlIT09dGhpcy5jdXJyZW50Q29udGFpbmVyJiZ0aGlzLmN1cnJlbnRDb250YWluZXImJnMuaXRlbVswXSE9PXRoaXMuY3VycmVudEl0ZW1bMF18fChuPXRoaXMub3B0aW9ucy50b2xlcmFuY2VFbGVtZW50P2UodGhpcy5vcHRpb25zLnRvbGVyYW5jZUVsZW1lbnQscy5pdGVtKTpzLml0ZW0sdHx8KHMud2lkdGg9bi5vdXRlcldpZHRoKCkscy5oZWlnaHQ9bi5vdXRlckhlaWdodCgpKSxhPW4ub2Zmc2V0KCkscy5sZWZ0PWEubGVmdCxzLnRvcD1hLnRvcCk7aWYodGhpcy5vcHRpb25zLmN1c3RvbSYmdGhpcy5vcHRpb25zLmN1c3RvbS5yZWZyZXNoQ29udGFpbmVycyl0aGlzLm9wdGlvbnMuY3VzdG9tLnJlZnJlc2hDb250YWluZXJzLmNhbGwodGhpcyk7ZWxzZSBmb3IoaT10aGlzLmNvbnRhaW5lcnMubGVuZ3RoLTE7aT49MDtpLS0pYT10aGlzLmNvbnRhaW5lcnNbaV0uZWxlbWVudC5vZmZzZXQoKSx0aGlzLmNvbnRhaW5lcnNbaV0uY29udGFpbmVyQ2FjaGUubGVmdD1hLmxlZnQsdGhpcy5jb250YWluZXJzW2ldLmNvbnRhaW5lckNhY2hlLnRvcD1hLnRvcCx0aGlzLmNvbnRhaW5lcnNbaV0uY29udGFpbmVyQ2FjaGUud2lkdGg9dGhpcy5jb250YWluZXJzW2ldLmVsZW1lbnQub3V0ZXJXaWR0aCgpLHRoaXMuY29udGFpbmVyc1tpXS5jb250YWluZXJDYWNoZS5oZWlnaHQ9dGhpcy5jb250YWluZXJzW2ldLmVsZW1lbnQub3V0ZXJIZWlnaHQoKTtyZXR1cm4gdGhpc30sX2NyZWF0ZVBsYWNlaG9sZGVyOmZ1bmN0aW9uKHQpe3Q9dHx8dGhpczt2YXIgaSxzPXQub3B0aW9ucztzLnBsYWNlaG9sZGVyJiZzLnBsYWNlaG9sZGVyLmNvbnN0cnVjdG9yIT09U3RyaW5nfHwoaT1zLnBsYWNlaG9sZGVyLHMucGxhY2Vob2xkZXI9e2VsZW1lbnQ6ZnVuY3Rpb24oKXt2YXIgcz10LmN1cnJlbnRJdGVtWzBdLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksbj1lKCI8IitzKyI+Iix0LmRvY3VtZW50WzBdKS5hZGRDbGFzcyhpfHx0LmN1cnJlbnRJdGVtWzBdLmNsYXNzTmFtZSsiIHVpLXNvcnRhYmxlLXBsYWNlaG9sZGVyIikucmVtb3ZlQ2xhc3MoInVpLXNvcnRhYmxlLWhlbHBlciIpO3JldHVybiJ0Ym9keSI9PT1zP3QuX2NyZWF0ZVRyUGxhY2Vob2xkZXIodC5jdXJyZW50SXRlbS5maW5kKCJ0ciIpLmVxKDApLGUoIjx0cj4iLHQuZG9jdW1lbnRbMF0pLmFwcGVuZFRvKG4pKToidHIiPT09cz90Ll9jcmVhdGVUclBsYWNlaG9sZGVyKHQuY3VycmVudEl0ZW0sbik6ImltZyI9PT1zJiZuLmF0dHIoInNyYyIsdC5jdXJyZW50SXRlbS5hdHRyKCJzcmMiKSksaXx8bi5jc3MoInZpc2liaWxpdHkiLCJoaWRkZW4iKSxufSx1cGRhdGU6ZnVuY3Rpb24oZSxuKXsoIWl8fHMuZm9yY2VQbGFjZWhvbGRlclNpemUpJiYobi5oZWlnaHQoKXx8bi5oZWlnaHQodC5jdXJyZW50SXRlbS5pbm5lckhlaWdodCgpLXBhcnNlSW50KHQuY3VycmVudEl0ZW0uY3NzKCJwYWRkaW5nVG9wIil8fDAsMTApLXBhcnNlSW50KHQuY3VycmVudEl0ZW0uY3NzKCJwYWRkaW5nQm90dG9tIil8fDAsMTApKSxuLndpZHRoKCl8fG4ud2lkdGgodC5jdXJyZW50SXRlbS5pbm5lcldpZHRoKCktcGFyc2VJbnQodC5jdXJyZW50SXRlbS5jc3MoInBhZGRpbmdMZWZ0Iil8fDAsMTApLXBhcnNlSW50KHQuY3VycmVudEl0ZW0uY3NzKCJwYWRkaW5nUmlnaHQiKXx8MCwxMCkpKX19KSx0LnBsYWNlaG9sZGVyPWUocy5wbGFjZWhvbGRlci5lbGVtZW50LmNhbGwodC5lbGVtZW50LHQuY3VycmVudEl0ZW0pKSx0LmN1cnJlbnRJdGVtLmFmdGVyKHQucGxhY2Vob2xkZXIpLHMucGxhY2Vob2xkZXIudXBkYXRlKHQsdC5wbGFjZWhvbGRlcil9LF9jcmVhdGVUclBsYWNlaG9sZGVyOmZ1bmN0aW9uKHQsaSl7dmFyIHM9dGhpczt0LmNoaWxkcmVuKCkuZWFjaChmdW5jdGlvbigpe2UoIjx0ZD4mIzE2MDs8L3RkPiIscy5kb2N1bWVudFswXSkuYXR0cigiY29sc3BhbiIsZSh0aGlzKS5hdHRyKCJjb2xzcGFuIil8fDEpLmFwcGVuZFRvKGkpfSl9LF9jb250YWN0Q29udGFpbmVyczpmdW5jdGlvbih0KXt2YXIgaSxzLG4sYSxvLHIsaCxsLHUsZCxjPW51bGwscD1udWxsO2ZvcihpPXRoaXMuY29udGFpbmVycy5sZW5ndGgtMTtpPj0wO2ktLSlpZighZS5jb250YWlucyh0aGlzLmN1cnJlbnRJdGVtWzBdLHRoaXMuY29udGFpbmVyc1tpXS5lbGVtZW50WzBdKSlpZih0aGlzLl9pbnRlcnNlY3RzV2l0aCh0aGlzLmNvbnRhaW5lcnNbaV0uY29udGFpbmVyQ2FjaGUpKXtpZihjJiZlLmNvbnRhaW5zKHRoaXMuY29udGFpbmVyc1tpXS5lbGVtZW50WzBdLGMuZWxlbWVudFswXSkpY29udGludWU7Yz10aGlzLmNvbnRhaW5lcnNbaV0scD1pfWVsc2UgdGhpcy5jb250YWluZXJzW2ldLmNvbnRhaW5lckNhY2hlLm92ZXImJih0aGlzLmNvbnRhaW5lcnNbaV0uX3RyaWdnZXIoIm91dCIsdCx0aGlzLl91aUhhc2godGhpcykpLHRoaXMuY29udGFpbmVyc1tpXS5jb250YWluZXJDYWNoZS5vdmVyPTApO2lmKGMpaWYoMT09PXRoaXMuY29udGFpbmVycy5sZW5ndGgpdGhpcy5jb250YWluZXJzW3BdLmNvbnRhaW5lckNhY2hlLm92ZXJ8fCh0aGlzLmNvbnRhaW5lcnNbcF0uX3RyaWdnZXIoIm92ZXIiLHQsdGhpcy5fdWlIYXNoKHRoaXMpKSx0aGlzLmNvbnRhaW5lcnNbcF0uY29udGFpbmVyQ2FjaGUub3Zlcj0xKTtlbHNle2ZvcihuPTFlNCxhPW51bGwsdT1jLmZsb2F0aW5nfHx0aGlzLl9pc0Zsb2F0aW5nKHRoaXMuY3VycmVudEl0ZW0pLG89dT8ibGVmdCI6InRvcCIscj11PyJ3aWR0aCI6ImhlaWdodCIsZD11PyJjbGllbnRYIjoiY2xpZW50WSIscz10aGlzLml0ZW1zLmxlbmd0aC0xO3M+PTA7cy0tKWUuY29udGFpbnModGhpcy5jb250YWluZXJzW3BdLmVsZW1lbnRbMF0sdGhpcy5pdGVtc1tzXS5pdGVtWzBdKSYmdGhpcy5pdGVtc1tzXS5pdGVtWzBdIT09dGhpcy5jdXJyZW50SXRlbVswXSYmKGg9dGhpcy5pdGVtc1tzXS5pdGVtLm9mZnNldCgpW29dLGw9ITEsdFtkXS1oPnRoaXMuaXRlbXNbc11bcl0vMiYmKGw9ITApLG4+TWF0aC5hYnModFtkXS1oKSYmKG49TWF0aC5hYnModFtkXS1oKSxhPXRoaXMuaXRlbXNbc10sdGhpcy5kaXJlY3Rpb249bD8idXAiOiJkb3duIikpO2lmKCFhJiYhdGhpcy5vcHRpb25zLmRyb3BPbkVtcHR5KXJldHVybjtpZih0aGlzLmN1cnJlbnRDb250YWluZXI9PT10aGlzLmNvbnRhaW5lcnNbcF0pcmV0dXJuIHRoaXMuY3VycmVudENvbnRhaW5lci5jb250YWluZXJDYWNoZS5vdmVyfHwodGhpcy5jb250YWluZXJzW3BdLl90cmlnZ2VyKCJvdmVyIix0LHRoaXMuX3VpSGFzaCgpKSx0aGlzLmN1cnJlbnRDb250YWluZXIuY29udGFpbmVyQ2FjaGUub3Zlcj0xKSx2b2lkIDA7YT90aGlzLl9yZWFycmFuZ2UodCxhLG51bGwsITApOnRoaXMuX3JlYXJyYW5nZSh0LG51bGwsdGhpcy5jb250YWluZXJzW3BdLmVsZW1lbnQsITApLHRoaXMuX3RyaWdnZXIoImNoYW5nZSIsdCx0aGlzLl91aUhhc2goKSksdGhpcy5jb250YWluZXJzW3BdLl90cmlnZ2VyKCJjaGFuZ2UiLHQsdGhpcy5fdWlIYXNoKHRoaXMpKSx0aGlzLmN1cnJlbnRDb250YWluZXI9dGhpcy5jb250YWluZXJzW3BdLHRoaXMub3B0aW9ucy5wbGFjZWhvbGRlci51cGRhdGUodGhpcy5jdXJyZW50Q29udGFpbmVyLHRoaXMucGxhY2Vob2xkZXIpLHRoaXMuY29udGFpbmVyc1twXS5fdHJpZ2dlcigib3ZlciIsdCx0aGlzLl91aUhhc2godGhpcykpLHRoaXMuY29udGFpbmVyc1twXS5jb250YWluZXJDYWNoZS5vdmVyPTF9fSxfY3JlYXRlSGVscGVyOmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMub3B0aW9ucyxzPWUuaXNGdW5jdGlvbihpLmhlbHBlcik/ZShpLmhlbHBlci5hcHBseSh0aGlzLmVsZW1lbnRbMF0sW3QsdGhpcy5jdXJyZW50SXRlbV0pKToiY2xvbmUiPT09aS5oZWxwZXI/dGhpcy5jdXJyZW50SXRlbS5jbG9uZSgpOnRoaXMuY3VycmVudEl0ZW07cmV0dXJuIHMucGFyZW50cygiYm9keSIpLmxlbmd0aHx8ZSgicGFyZW50IiE9PWkuYXBwZW5kVG8/aS5hcHBlbmRUbzp0aGlzLmN1cnJlbnRJdGVtWzBdLnBhcmVudE5vZGUpWzBdLmFwcGVuZENoaWxkKHNbMF0pLHNbMF09PT10aGlzLmN1cnJlbnRJdGVtWzBdJiYodGhpcy5fc3RvcmVkQ1NTPXt3aWR0aDp0aGlzLmN1cnJlbnRJdGVtWzBdLnN0eWxlLndpZHRoLGhlaWdodDp0aGlzLmN1cnJlbnRJdGVtWzBdLnN0eWxlLmhlaWdodCxwb3NpdGlvbjp0aGlzLmN1cnJlbnRJdGVtLmNzcygicG9zaXRpb24iKSx0b3A6dGhpcy5jdXJyZW50SXRlbS5jc3MoInRvcCIpLGxlZnQ6dGhpcy5jdXJyZW50SXRlbS5jc3MoImxlZnQiKX0pLCghc1swXS5zdHlsZS53aWR0aHx8aS5mb3JjZUhlbHBlclNpemUpJiZzLndpZHRoKHRoaXMuY3VycmVudEl0ZW0ud2lkdGgoKSksKCFzWzBdLnN0eWxlLmhlaWdodHx8aS5mb3JjZUhlbHBlclNpemUpJiZzLmhlaWdodCh0aGlzLmN1cnJlbnRJdGVtLmhlaWdodCgpKSxzfSxfYWRqdXN0T2Zmc2V0RnJvbUhlbHBlcjpmdW5jdGlvbih0KXsic3RyaW5nIj09dHlwZW9mIHQmJih0PXQuc3BsaXQoIiAiKSksZS5pc0FycmF5KHQpJiYodD17bGVmdDordFswXSx0b3A6K3RbMV18fDB9KSwibGVmdCJpbiB0JiYodGhpcy5vZmZzZXQuY2xpY2subGVmdD10LmxlZnQrdGhpcy5tYXJnaW5zLmxlZnQpLCJyaWdodCJpbiB0JiYodGhpcy5vZmZzZXQuY2xpY2subGVmdD10aGlzLmhlbHBlclByb3BvcnRpb25zLndpZHRoLXQucmlnaHQrdGhpcy5tYXJnaW5zLmxlZnQpLCJ0b3AiaW4gdCYmKHRoaXMub2Zmc2V0LmNsaWNrLnRvcD10LnRvcCt0aGlzLm1hcmdpbnMudG9wKSwiYm90dG9tImluIHQmJih0aGlzLm9mZnNldC5jbGljay50b3A9dGhpcy5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQtdC5ib3R0b20rdGhpcy5tYXJnaW5zLnRvcCl9LF9nZXRQYXJlbnRPZmZzZXQ6ZnVuY3Rpb24oKXt0aGlzLm9mZnNldFBhcmVudD10aGlzLmhlbHBlci5vZmZzZXRQYXJlbnQoKTt2YXIgdD10aGlzLm9mZnNldFBhcmVudC5vZmZzZXQoKTtyZXR1cm4iYWJzb2x1dGUiPT09dGhpcy5jc3NQb3NpdGlvbiYmdGhpcy5zY3JvbGxQYXJlbnRbMF0hPT10aGlzLmRvY3VtZW50WzBdJiZlLmNvbnRhaW5zKHRoaXMuc2Nyb2xsUGFyZW50WzBdLHRoaXMub2Zmc2V0UGFyZW50WzBdKSYmKHQubGVmdCs9dGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsTGVmdCgpLHQudG9wKz10aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxUb3AoKSksKHRoaXMub2Zmc2V0UGFyZW50WzBdPT09dGhpcy5kb2N1bWVudFswXS5ib2R5fHx0aGlzLm9mZnNldFBhcmVudFswXS50YWdOYW1lJiYiaHRtbCI9PT10aGlzLm9mZnNldFBhcmVudFswXS50YWdOYW1lLnRvTG93ZXJDYXNlKCkmJmUudWkuaWUpJiYodD17dG9wOjAsbGVmdDowfSkse3RvcDp0LnRvcCsocGFyc2VJbnQodGhpcy5vZmZzZXRQYXJlbnQuY3NzKCJib3JkZXJUb3BXaWR0aCIpLDEwKXx8MCksbGVmdDp0LmxlZnQrKHBhcnNlSW50KHRoaXMub2Zmc2V0UGFyZW50LmNzcygiYm9yZGVyTGVmdFdpZHRoIiksMTApfHwwKX19LF9nZXRSZWxhdGl2ZU9mZnNldDpmdW5jdGlvbigpe2lmKCJyZWxhdGl2ZSI9PT10aGlzLmNzc1Bvc2l0aW9uKXt2YXIgZT10aGlzLmN1cnJlbnRJdGVtLnBvc2l0aW9uKCk7cmV0dXJue3RvcDplLnRvcC0ocGFyc2VJbnQodGhpcy5oZWxwZXIuY3NzKCJ0b3AiKSwxMCl8fDApK3RoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbFRvcCgpLGxlZnQ6ZS5sZWZ0LShwYXJzZUludCh0aGlzLmhlbHBlci5jc3MoImxlZnQiKSwxMCl8fDApK3RoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbExlZnQoKX19cmV0dXJue3RvcDowLGxlZnQ6MH19LF9jYWNoZU1hcmdpbnM6ZnVuY3Rpb24oKXt0aGlzLm1hcmdpbnM9e2xlZnQ6cGFyc2VJbnQodGhpcy5jdXJyZW50SXRlbS5jc3MoIm1hcmdpbkxlZnQiKSwxMCl8fDAsdG9wOnBhcnNlSW50KHRoaXMuY3VycmVudEl0ZW0uY3NzKCJtYXJnaW5Ub3AiKSwxMCl8fDB9fSxfY2FjaGVIZWxwZXJQcm9wb3J0aW9uczpmdW5jdGlvbigpe3RoaXMuaGVscGVyUHJvcG9ydGlvbnM9e3dpZHRoOnRoaXMuaGVscGVyLm91dGVyV2lkdGgoKSxoZWlnaHQ6dGhpcy5oZWxwZXIub3V0ZXJIZWlnaHQoKX19LF9zZXRDb250YWlubWVudDpmdW5jdGlvbigpe3ZhciB0LGkscyxuPXRoaXMub3B0aW9uczsicGFyZW50Ij09PW4uY29udGFpbm1lbnQmJihuLmNvbnRhaW5tZW50PXRoaXMuaGVscGVyWzBdLnBhcmVudE5vZGUpLCgiZG9jdW1lbnQiPT09bi5jb250YWlubWVudHx8IndpbmRvdyI9PT1uLmNvbnRhaW5tZW50KSYmKHRoaXMuY29udGFpbm1lbnQ9WzAtdGhpcy5vZmZzZXQucmVsYXRpdmUubGVmdC10aGlzLm9mZnNldC5wYXJlbnQubGVmdCwwLXRoaXMub2Zmc2V0LnJlbGF0aXZlLnRvcC10aGlzLm9mZnNldC5wYXJlbnQudG9wLCJkb2N1bWVudCI9PT1uLmNvbnRhaW5tZW50P3RoaXMuZG9jdW1lbnQud2lkdGgoKTp0aGlzLndpbmRvdy53aWR0aCgpLXRoaXMuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgtdGhpcy5tYXJnaW5zLmxlZnQsKCJkb2N1bWVudCI9PT1uLmNvbnRhaW5tZW50P3RoaXMuZG9jdW1lbnQud2lkdGgoKTp0aGlzLndpbmRvdy5oZWlnaHQoKXx8dGhpcy5kb2N1bWVudFswXS5ib2R5LnBhcmVudE5vZGUuc2Nyb2xsSGVpZ2h0KS10aGlzLmhlbHBlclByb3BvcnRpb25zLmhlaWdodC10aGlzLm1hcmdpbnMudG9wXSksL14oZG9jdW1lbnR8d2luZG93fHBhcmVudCkkLy50ZXN0KG4uY29udGFpbm1lbnQpfHwodD1lKG4uY29udGFpbm1lbnQpWzBdLGk9ZShuLmNvbnRhaW5tZW50KS5vZmZzZXQoKSxzPSJoaWRkZW4iIT09ZSh0KS5jc3MoIm92ZXJmbG93IiksdGhpcy5jb250YWlubWVudD1baS5sZWZ0KyhwYXJzZUludChlKHQpLmNzcygiYm9yZGVyTGVmdFdpZHRoIiksMTApfHwwKSsocGFyc2VJbnQoZSh0KS5jc3MoInBhZGRpbmdMZWZ0IiksMTApfHwwKS10aGlzLm1hcmdpbnMubGVmdCxpLnRvcCsocGFyc2VJbnQoZSh0KS5jc3MoImJvcmRlclRvcFdpZHRoIiksMTApfHwwKSsocGFyc2VJbnQoZSh0KS5jc3MoInBhZGRpbmdUb3AiKSwxMCl8fDApLXRoaXMubWFyZ2lucy50b3AsaS5sZWZ0KyhzP01hdGgubWF4KHQuc2Nyb2xsV2lkdGgsdC5vZmZzZXRXaWR0aCk6dC5vZmZzZXRXaWR0aCktKHBhcnNlSW50KGUodCkuY3NzKCJib3JkZXJMZWZ0V2lkdGgiKSwxMCl8fDApLShwYXJzZUludChlKHQpLmNzcygicGFkZGluZ1JpZ2h0IiksMTApfHwwKS10aGlzLmhlbHBlclByb3BvcnRpb25zLndpZHRoLXRoaXMubWFyZ2lucy5sZWZ0LGkudG9wKyhzP01hdGgubWF4KHQuc2Nyb2xsSGVpZ2h0LHQub2Zmc2V0SGVpZ2h0KTp0Lm9mZnNldEhlaWdodCktKHBhcnNlSW50KGUodCkuY3NzKCJib3JkZXJUb3BXaWR0aCIpLDEwKXx8MCktKHBhcnNlSW50KGUodCkuY3NzKCJwYWRkaW5nQm90dG9tIiksMTApfHwwKS10aGlzLmhlbHBlclByb3BvcnRpb25zLmhlaWdodC10aGlzLm1hcmdpbnMudG9wXSl9LF9jb252ZXJ0UG9zaXRpb25UbzpmdW5jdGlvbih0LGkpe2l8fChpPXRoaXMucG9zaXRpb24pO3ZhciBzPSJhYnNvbHV0ZSI9PT10PzE6LTEsbj0iYWJzb2x1dGUiIT09dGhpcy5jc3NQb3NpdGlvbnx8dGhpcy5zY3JvbGxQYXJlbnRbMF0hPT10aGlzLmRvY3VtZW50WzBdJiZlLmNvbnRhaW5zKHRoaXMuc2Nyb2xsUGFyZW50WzBdLHRoaXMub2Zmc2V0UGFyZW50WzBdKT90aGlzLnNjcm9sbFBhcmVudDp0aGlzLm9mZnNldFBhcmVudCxhPS8oaHRtbHxib2R5KS9pLnRlc3QoblswXS50YWdOYW1lKTtyZXR1cm57dG9wOmkudG9wK3RoaXMub2Zmc2V0LnJlbGF0aXZlLnRvcCpzK3RoaXMub2Zmc2V0LnBhcmVudC50b3Aqcy0oImZpeGVkIj09PXRoaXMuY3NzUG9zaXRpb24/LXRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbFRvcCgpOmE/MDpuLnNjcm9sbFRvcCgpKSpzLGxlZnQ6aS5sZWZ0K3RoaXMub2Zmc2V0LnJlbGF0aXZlLmxlZnQqcyt0aGlzLm9mZnNldC5wYXJlbnQubGVmdCpzLSgiZml4ZWQiPT09dGhpcy5jc3NQb3NpdGlvbj8tdGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsTGVmdCgpOmE/MDpuLnNjcm9sbExlZnQoKSkqc319LF9nZW5lcmF0ZVBvc2l0aW9uOmZ1bmN0aW9uKHQpe3ZhciBpLHMsbj10aGlzLm9wdGlvbnMsYT10LnBhZ2VYLG89dC5wYWdlWSxyPSJhYnNvbHV0ZSIhPT10aGlzLmNzc1Bvc2l0aW9ufHx0aGlzLnNjcm9sbFBhcmVudFswXSE9PXRoaXMuZG9jdW1lbnRbMF0mJmUuY29udGFpbnModGhpcy5zY3JvbGxQYXJlbnRbMF0sdGhpcy5vZmZzZXRQYXJlbnRbMF0pP3RoaXMuc2Nyb2xsUGFyZW50OnRoaXMub2Zmc2V0UGFyZW50LGg9LyhodG1sfGJvZHkpL2kudGVzdChyWzBdLnRhZ05hbWUpO3JldHVybiJyZWxhdGl2ZSIhPT10aGlzLmNzc1Bvc2l0aW9ufHx0aGlzLnNjcm9sbFBhcmVudFswXSE9PXRoaXMuZG9jdW1lbnRbMF0mJnRoaXMuc2Nyb2xsUGFyZW50WzBdIT09dGhpcy5vZmZzZXRQYXJlbnRbMF18fCh0aGlzLm9mZnNldC5yZWxhdGl2ZT10aGlzLl9nZXRSZWxhdGl2ZU9mZnNldCgpKSx0aGlzLm9yaWdpbmFsUG9zaXRpb24mJih0aGlzLmNvbnRhaW5tZW50JiYodC5wYWdlWC10aGlzLm9mZnNldC5jbGljay5sZWZ0PHRoaXMuY29udGFpbm1lbnRbMF0mJihhPXRoaXMuY29udGFpbm1lbnRbMF0rdGhpcy5vZmZzZXQuY2xpY2subGVmdCksdC5wYWdlWS10aGlzLm9mZnNldC5jbGljay50b3A8dGhpcy5jb250YWlubWVudFsxXSYmKG89dGhpcy5jb250YWlubWVudFsxXSt0aGlzLm9mZnNldC5jbGljay50b3ApLHQucGFnZVgtdGhpcy5vZmZzZXQuY2xpY2subGVmdD50aGlzLmNvbnRhaW5tZW50WzJdJiYoYT10aGlzLmNvbnRhaW5tZW50WzJdK3RoaXMub2Zmc2V0LmNsaWNrLmxlZnQpLHQucGFnZVktdGhpcy5vZmZzZXQuY2xpY2sudG9wPnRoaXMuY29udGFpbm1lbnRbM10mJihvPXRoaXMuY29udGFpbm1lbnRbM10rdGhpcy5vZmZzZXQuY2xpY2sudG9wKSksbi5ncmlkJiYoaT10aGlzLm9yaWdpbmFsUGFnZVkrTWF0aC5yb3VuZCgoby10aGlzLm9yaWdpbmFsUGFnZVkpL24uZ3JpZFsxXSkqbi5ncmlkWzFdLG89dGhpcy5jb250YWlubWVudD9pLXRoaXMub2Zmc2V0LmNsaWNrLnRvcD49dGhpcy5jb250YWlubWVudFsxXSYmaS10aGlzLm9mZnNldC5jbGljay50b3A8PXRoaXMuY29udGFpbm1lbnRbM10/aTppLXRoaXMub2Zmc2V0LmNsaWNrLnRvcD49dGhpcy5jb250YWlubWVudFsxXT9pLW4uZ3JpZFsxXTppK24uZ3JpZFsxXTppLHM9dGhpcy5vcmlnaW5hbFBhZ2VYK01hdGgucm91bmQoKGEtdGhpcy5vcmlnaW5hbFBhZ2VYKS9uLmdyaWRbMF0pKm4uZ3JpZFswXSxhPXRoaXMuY29udGFpbm1lbnQ/cy10aGlzLm9mZnNldC5jbGljay5sZWZ0Pj10aGlzLmNvbnRhaW5tZW50WzBdJiZzLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ8PXRoaXMuY29udGFpbm1lbnRbMl0/czpzLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ+PXRoaXMuY29udGFpbm1lbnRbMF0/cy1uLmdyaWRbMF06cytuLmdyaWRbMF06cykpLHt0b3A6by10aGlzLm9mZnNldC5jbGljay50b3AtdGhpcy5vZmZzZXQucmVsYXRpdmUudG9wLXRoaXMub2Zmc2V0LnBhcmVudC50b3ArKCJmaXhlZCI9PT10aGlzLmNzc1Bvc2l0aW9uPy10aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxUb3AoKTpoPzA6ci5zY3JvbGxUb3AoKSksbGVmdDphLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQtdGhpcy5vZmZzZXQucmVsYXRpdmUubGVmdC10aGlzLm9mZnNldC5wYXJlbnQubGVmdCsoImZpeGVkIj09PXRoaXMuY3NzUG9zaXRpb24/LXRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbExlZnQoKTpoPzA6ci5zY3JvbGxMZWZ0KCkpfX0sX3JlYXJyYW5nZTpmdW5jdGlvbihlLHQsaSxzKXtpP2lbMF0uYXBwZW5kQ2hpbGQodGhpcy5wbGFjZWhvbGRlclswXSk6dC5pdGVtWzBdLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMucGxhY2Vob2xkZXJbMF0sImRvd24iPT09dGhpcy5kaXJlY3Rpb24/dC5pdGVtWzBdOnQuaXRlbVswXS5uZXh0U2libGluZyksdGhpcy5jb3VudGVyPXRoaXMuY291bnRlcj8rK3RoaXMuY291bnRlcjoxO3ZhciBuPXRoaXMuY291bnRlcjt0aGlzLl9kZWxheShmdW5jdGlvbigpe249PT10aGlzLmNvdW50ZXImJnRoaXMucmVmcmVzaFBvc2l0aW9ucyghcyl9KX0sX2NsZWFyOmZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gaShlLHQsaSl7cmV0dXJuIGZ1bmN0aW9uKHMpe2kuX3RyaWdnZXIoZSxzLHQuX3VpSGFzaCh0KSl9fXRoaXMucmV2ZXJ0aW5nPSExO3ZhciBzLG49W107aWYoIXRoaXMuX25vRmluYWxTb3J0JiZ0aGlzLmN1cnJlbnRJdGVtLnBhcmVudCgpLmxlbmd0aCYmdGhpcy5wbGFjZWhvbGRlci5iZWZvcmUodGhpcy5jdXJyZW50SXRlbSksdGhpcy5fbm9GaW5hbFNvcnQ9bnVsbCx0aGlzLmhlbHBlclswXT09PXRoaXMuY3VycmVudEl0ZW1bMF0pe2ZvcihzIGluIHRoaXMuX3N0b3JlZENTUykoImF1dG8iPT09dGhpcy5fc3RvcmVkQ1NTW3NdfHwic3RhdGljIj09PXRoaXMuX3N0b3JlZENTU1tzXSkmJih0aGlzLl9zdG9yZWRDU1Nbc109IiIpO3RoaXMuY3VycmVudEl0ZW0uY3NzKHRoaXMuX3N0b3JlZENTUykucmVtb3ZlQ2xhc3MoInVpLXNvcnRhYmxlLWhlbHBlciIpfWVsc2UgdGhpcy5jdXJyZW50SXRlbS5zaG93KCk7Zm9yKHRoaXMuZnJvbU91dHNpZGUmJiF0JiZuLnB1c2goZnVuY3Rpb24oZSl7dGhpcy5fdHJpZ2dlcigicmVjZWl2ZSIsZSx0aGlzLl91aUhhc2godGhpcy5mcm9tT3V0c2lkZSkpfSksIXRoaXMuZnJvbU91dHNpZGUmJnRoaXMuZG9tUG9zaXRpb24ucHJldj09PXRoaXMuY3VycmVudEl0ZW0ucHJldigpLm5vdCgiLnVpLXNvcnRhYmxlLWhlbHBlciIpWzBdJiZ0aGlzLmRvbVBvc2l0aW9uLnBhcmVudD09PXRoaXMuY3VycmVudEl0ZW0ucGFyZW50KClbMF18fHR8fG4ucHVzaChmdW5jdGlvbihlKXt0aGlzLl90cmlnZ2VyKCJ1cGRhdGUiLGUsdGhpcy5fdWlIYXNoKCkpfSksdGhpcyE9PXRoaXMuY3VycmVudENvbnRhaW5lciYmKHR8fChuLnB1c2goZnVuY3Rpb24oZSl7dGhpcy5fdHJpZ2dlcigicmVtb3ZlIixlLHRoaXMuX3VpSGFzaCgpKX0pLG4ucHVzaChmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCl7ZS5fdHJpZ2dlcigicmVjZWl2ZSIsdCx0aGlzLl91aUhhc2godGhpcykpfX0uY2FsbCh0aGlzLHRoaXMuY3VycmVudENvbnRhaW5lcikpLG4ucHVzaChmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCl7ZS5fdHJpZ2dlcigidXBkYXRlIix0LHRoaXMuX3VpSGFzaCh0aGlzKSl9fS5jYWxsKHRoaXMsdGhpcy5jdXJyZW50Q29udGFpbmVyKSkpKSxzPXRoaXMuY29udGFpbmVycy5sZW5ndGgtMTtzPj0wO3MtLSl0fHxuLnB1c2goaSgiZGVhY3RpdmF0ZSIsdGhpcyx0aGlzLmNvbnRhaW5lcnNbc10pKSx0aGlzLmNvbnRhaW5lcnNbc10uY29udGFpbmVyQ2FjaGUub3ZlciYmKG4ucHVzaChpKCJvdXQiLHRoaXMsdGhpcy5jb250YWluZXJzW3NdKSksdGhpcy5jb250YWluZXJzW3NdLmNvbnRhaW5lckNhY2hlLm92ZXI9MCk7aWYodGhpcy5zdG9yZWRDdXJzb3ImJih0aGlzLmRvY3VtZW50LmZpbmQoImJvZHkiKS5jc3MoImN1cnNvciIsdGhpcy5zdG9yZWRDdXJzb3IpLHRoaXMuc3RvcmVkU3R5bGVzaGVldC5yZW1vdmUoKSksdGhpcy5fc3RvcmVkT3BhY2l0eSYmdGhpcy5oZWxwZXIuY3NzKCJvcGFjaXR5Iix0aGlzLl9zdG9yZWRPcGFjaXR5KSx0aGlzLl9zdG9yZWRaSW5kZXgmJnRoaXMuaGVscGVyLmNzcygiekluZGV4IiwiYXV0byI9PT10aGlzLl9zdG9yZWRaSW5kZXg/IiI6dGhpcy5fc3RvcmVkWkluZGV4KSx0aGlzLmRyYWdnaW5nPSExLHR8fHRoaXMuX3RyaWdnZXIoImJlZm9yZVN0b3AiLGUsdGhpcy5fdWlIYXNoKCkpLHRoaXMucGxhY2Vob2xkZXJbMF0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLnBsYWNlaG9sZGVyWzBdKSx0aGlzLmNhbmNlbEhlbHBlclJlbW92YWx8fCh0aGlzLmhlbHBlclswXSE9PXRoaXMuY3VycmVudEl0ZW1bMF0mJnRoaXMuaGVscGVyLnJlbW92ZSgpLHRoaXMuaGVscGVyPW51bGwpLCF0KXtmb3Iocz0wO24ubGVuZ3RoPnM7cysrKW5bc10uY2FsbCh0aGlzLGUpO3RoaXMuX3RyaWdnZXIoInN0b3AiLGUsdGhpcy5fdWlIYXNoKCkpfXJldHVybiB0aGlzLmZyb21PdXRzaWRlPSExLCF0aGlzLmNhbmNlbEhlbHBlclJlbW92YWx9LF90cmlnZ2VyOmZ1bmN0aW9uKCl7ZS5XaWRnZXQucHJvdG90eXBlLl90cmlnZ2VyLmFwcGx5KHRoaXMsYXJndW1lbnRzKT09PSExJiZ0aGlzLmNhbmNlbCgpfSxfdWlIYXNoOmZ1bmN0aW9uKHQpe3ZhciBpPXR8fHRoaXM7cmV0dXJue2hlbHBlcjppLmhlbHBlcixwbGFjZWhvbGRlcjppLnBsYWNlaG9sZGVyfHxlKFtdKSxwb3NpdGlvbjppLnBvc2l0aW9uLG9yaWdpbmFsUG9zaXRpb246aS5vcmlnaW5hbFBvc2l0aW9uLG9mZnNldDppLnBvc2l0aW9uQWJzLGl0ZW06aS5jdXJyZW50SXRlbSxzZW5kZXI6dD90LmVsZW1lbnQ6bnVsbH19fSksZS53aWRnZXQoInVpLnNwaW5uZXIiLHt2ZXJzaW9uOiIxLjExLjQiLGRlZmF1bHRFbGVtZW50OiI8aW5wdXQ+Iix3aWRnZXRFdmVudFByZWZpeDoic3BpbiIsb3B0aW9uczp7Y3VsdHVyZTpudWxsLGljb25zOntkb3duOiJ1aS1pY29uLXRyaWFuZ2xlLTEtcyIsdXA6InVpLWljb24tdHJpYW5nbGUtMS1uIn0saW5jcmVtZW50YWw6ITAsbWF4Om51bGwsbWluOm51bGwsbnVtYmVyRm9ybWF0Om51bGwscGFnZToxMCxzdGVwOjEsY2hhbmdlOm51bGwsc3BpbjpudWxsLHN0YXJ0Om51bGwsc3RvcDpudWxsfSxfY3JlYXRlOmZ1bmN0aW9uKCl7dGhpcy5fc2V0T3B0aW9uKCJtYXgiLHRoaXMub3B0aW9ucy5tYXgpLHRoaXMuX3NldE9wdGlvbigibWluIix0aGlzLm9wdGlvbnMubWluKSx0aGlzLl9zZXRPcHRpb24oInN0ZXAiLHRoaXMub3B0aW9ucy5zdGVwKSwiIiE9PXRoaXMudmFsdWUoKSYmdGhpcy5fdmFsdWUodGhpcy5lbGVtZW50LnZhbCgpLCEwKSx0aGlzLl9kcmF3KCksdGhpcy5fb24odGhpcy5fZXZlbnRzKSx0aGlzLl9yZWZyZXNoKCksdGhpcy5fb24odGhpcy53aW5kb3cse2JlZm9yZXVubG9hZDpmdW5jdGlvbigpe3RoaXMuZWxlbWVudC5yZW1vdmVBdHRyKCJhdXRvY29tcGxldGUiKX19KX0sX2dldENyZWF0ZU9wdGlvbnM6ZnVuY3Rpb24oKXt2YXIgdD17fSxpPXRoaXMuZWxlbWVudDtyZXR1cm4gZS5lYWNoKFsibWluIiwibWF4Iiwic3RlcCJdLGZ1bmN0aW9uKGUscyl7dmFyIG49aS5hdHRyKHMpO3ZvaWQgMCE9PW4mJm4ubGVuZ3RoJiYodFtzXT1uKX0pLHR9LF9ldmVudHM6e2tleWRvd246ZnVuY3Rpb24oZSl7dGhpcy5fc3RhcnQoZSkmJnRoaXMuX2tleWRvd24oZSkmJmUucHJldmVudERlZmF1bHQoKX0sa2V5dXA6Il9zdG9wIixmb2N1czpmdW5jdGlvbigpe3RoaXMucHJldmlvdXM9dGhpcy5lbGVtZW50LnZhbCgpfSxibHVyOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmNhbmNlbEJsdXI/KGRlbGV0ZSB0aGlzLmNhbmNlbEJsdXIsdm9pZCAwKToodGhpcy5fc3RvcCgpLHRoaXMuX3JlZnJlc2goKSx0aGlzLnByZXZpb3VzIT09dGhpcy5lbGVtZW50LnZhbCgpJiZ0aGlzLl90cmlnZ2VyKCJjaGFuZ2UiLGUpLHZvaWQgMCl9LG1vdXNld2hlZWw6ZnVuY3Rpb24oZSx0KXtpZih0KXtpZighdGhpcy5zcGlubmluZyYmIXRoaXMuX3N0YXJ0KGUpKXJldHVybiExO3RoaXMuX3NwaW4oKHQ+MD8xOi0xKSp0aGlzLm9wdGlvbnMuc3RlcCxlKSxjbGVhclRpbWVvdXQodGhpcy5tb3VzZXdoZWVsVGltZXIpLHRoaXMubW91c2V3aGVlbFRpbWVyPXRoaXMuX2RlbGF5KGZ1bmN0aW9uKCl7dGhpcy5zcGlubmluZyYmdGhpcy5fc3RvcChlKX0sMTAwKSxlLnByZXZlbnREZWZhdWx0KCl9fSwibW91c2Vkb3duIC51aS1zcGlubmVyLWJ1dHRvbiI6ZnVuY3Rpb24odCl7ZnVuY3Rpb24gaSgpe3ZhciBlPXRoaXMuZWxlbWVudFswXT09PXRoaXMuZG9jdW1lbnRbMF0uYWN0aXZlRWxlbWVudDtlfHwodGhpcy5lbGVtZW50LmZvY3VzKCksdGhpcy5wcmV2aW91cz1zLHRoaXMuX2RlbGF5KGZ1bmN0aW9uKCl7dGhpcy5wcmV2aW91cz1zfSkpfXZhciBzO3M9dGhpcy5lbGVtZW50WzBdPT09dGhpcy5kb2N1bWVudFswXS5hY3RpdmVFbGVtZW50P3RoaXMucHJldmlvdXM6dGhpcy5lbGVtZW50LnZhbCgpLHQucHJldmVudERlZmF1bHQoKSxpLmNhbGwodGhpcyksdGhpcy5jYW5jZWxCbHVyPSEwLHRoaXMuX2RlbGF5KGZ1bmN0aW9uKCl7ZGVsZXRlIHRoaXMuY2FuY2VsQmx1cixpLmNhbGwodGhpcyl9KSx0aGlzLl9zdGFydCh0KSE9PSExJiZ0aGlzLl9yZXBlYXQobnVsbCxlKHQuY3VycmVudFRhcmdldCkuaGFzQ2xhc3MoInVpLXNwaW5uZXItdXAiKT8xOi0xLHQpfSwibW91c2V1cCAudWktc3Bpbm5lci1idXR0b24iOiJfc3RvcCIsIm1vdXNlZW50ZXIgLnVpLXNwaW5uZXItYnV0dG9uIjpmdW5jdGlvbih0KXtyZXR1cm4gZSh0LmN1cnJlbnRUYXJnZXQpLmhhc0NsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKT90aGlzLl9zdGFydCh0KT09PSExPyExOih0aGlzLl9yZXBlYXQobnVsbCxlKHQuY3VycmVudFRhcmdldCkuaGFzQ2xhc3MoInVpLXNwaW5uZXItdXAiKT8xOi0xLHQpLHZvaWQgMCk6dm9pZCAwfSwibW91c2VsZWF2ZSAudWktc3Bpbm5lci1idXR0b24iOiJfc3RvcCJ9LF9kcmF3OmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy51aVNwaW5uZXI9dGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS1zcGlubmVyLWlucHV0IikuYXR0cigiYXV0b2NvbXBsZXRlIiwib2ZmIikud3JhcCh0aGlzLl91aVNwaW5uZXJIdG1sKCkpLnBhcmVudCgpLmFwcGVuZCh0aGlzLl9idXR0b25IdG1sKCkpO3RoaXMuZWxlbWVudC5hdHRyKCJyb2xlIiwic3BpbmJ1dHRvbiIpLHRoaXMuYnV0dG9ucz1lLmZpbmQoIi51aS1zcGlubmVyLWJ1dHRvbiIpLmF0dHIoInRhYkluZGV4IiwtMSkuYnV0dG9uKCkucmVtb3ZlQ2xhc3MoInVpLWNvcm5lci1hbGwiKSx0aGlzLmJ1dHRvbnMuaGVpZ2h0KCk+TWF0aC5jZWlsKC41KmUuaGVpZ2h0KCkpJiZlLmhlaWdodCgpPjAmJmUuaGVpZ2h0KGUuaGVpZ2h0KCkpLHRoaXMub3B0aW9ucy5kaXNhYmxlZCYmdGhpcy5kaXNhYmxlKCl9LF9rZXlkb3duOmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMub3B0aW9ucyxzPWUudWkua2V5Q29kZTtzd2l0Y2godC5rZXlDb2RlKXtjYXNlIHMuVVA6cmV0dXJuIHRoaXMuX3JlcGVhdChudWxsLDEsdCksITA7Y2FzZSBzLkRPV046cmV0dXJuIHRoaXMuX3JlcGVhdChudWxsLC0xLHQpLCEwO2Nhc2Ugcy5QQUdFX1VQOnJldHVybiB0aGlzLl9yZXBlYXQobnVsbCxpLnBhZ2UsdCksITA7Y2FzZSBzLlBBR0VfRE9XTjpyZXR1cm4gdGhpcy5fcmVwZWF0KG51bGwsLWkucGFnZSx0KSwhMH1yZXR1cm4hMX0sX3VpU3Bpbm5lckh0bWw6ZnVuY3Rpb24oKXtyZXR1cm4iPHNwYW4gY2xhc3M9J3VpLXNwaW5uZXIgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWNvcm5lci1hbGwnPjwvc3Bhbj4ifSxfYnV0dG9uSHRtbDpmdW5jdGlvbigpe3JldHVybiI8YSBjbGFzcz0ndWktc3Bpbm5lci1idXR0b24gdWktc3Bpbm5lci11cCB1aS1jb3JuZXItdHInPjxzcGFuIGNsYXNzPSd1aS1pY29uICIrdGhpcy5vcHRpb25zLmljb25zLnVwKyInPiYjOTY1MDs8L3NwYW4+IisiPC9hPiIrIjxhIGNsYXNzPSd1aS1zcGlubmVyLWJ1dHRvbiB1aS1zcGlubmVyLWRvd24gdWktY29ybmVyLWJyJz4iKyI8c3BhbiBjbGFzcz0ndWktaWNvbiAiK3RoaXMub3B0aW9ucy5pY29ucy5kb3duKyInPiYjOTY2MDs8L3NwYW4+IisiPC9hPiJ9LF9zdGFydDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5zcGlubmluZ3x8dGhpcy5fdHJpZ2dlcigic3RhcnQiLGUpIT09ITE/KHRoaXMuY291bnRlcnx8KHRoaXMuY291bnRlcj0xKSx0aGlzLnNwaW5uaW5nPSEwLCEwKTohMX0sX3JlcGVhdDpmdW5jdGlvbihlLHQsaSl7ZT1lfHw1MDAsY2xlYXJUaW1lb3V0KHRoaXMudGltZXIpLHRoaXMudGltZXI9dGhpcy5fZGVsYXkoZnVuY3Rpb24oKXt0aGlzLl9yZXBlYXQoNDAsdCxpKX0sZSksdGhpcy5fc3Bpbih0KnRoaXMub3B0aW9ucy5zdGVwLGkpfSxfc3BpbjpmdW5jdGlvbihlLHQpe3ZhciBpPXRoaXMudmFsdWUoKXx8MDt0aGlzLmNvdW50ZXJ8fCh0aGlzLmNvdW50ZXI9MSksaT10aGlzLl9hZGp1c3RWYWx1ZShpK2UqdGhpcy5faW5jcmVtZW50KHRoaXMuY291bnRlcikpLHRoaXMuc3Bpbm5pbmcmJnRoaXMuX3RyaWdnZXIoInNwaW4iLHQse3ZhbHVlOml9KT09PSExfHwodGhpcy5fdmFsdWUoaSksdGhpcy5jb3VudGVyKyspfSxfaW5jcmVtZW50OmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMub3B0aW9ucy5pbmNyZW1lbnRhbDtyZXR1cm4gaT9lLmlzRnVuY3Rpb24oaSk/aSh0KTpNYXRoLmZsb29yKHQqdCp0LzVlNC10KnQvNTAwKzE3KnQvMjAwKzEpOjF9LF9wcmVjaXNpb246ZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9wcmVjaXNpb25PZih0aGlzLm9wdGlvbnMuc3RlcCk7cmV0dXJuIG51bGwhPT10aGlzLm9wdGlvbnMubWluJiYoZT1NYXRoLm1heChlLHRoaXMuX3ByZWNpc2lvbk9mKHRoaXMub3B0aW9ucy5taW4pKSksZX0sX3ByZWNpc2lvbk9mOmZ1bmN0aW9uKGUpe3ZhciB0PSIiK2UsaT10LmluZGV4T2YoIi4iKTtyZXR1cm4tMT09PWk/MDp0Lmxlbmd0aC1pLTF9LF9hZGp1c3RWYWx1ZTpmdW5jdGlvbihlKXt2YXIgdCxpLHM9dGhpcy5vcHRpb25zO3JldHVybiB0PW51bGwhPT1zLm1pbj9zLm1pbjowLGk9ZS10LGk9TWF0aC5yb3VuZChpL3Muc3RlcCkqcy5zdGVwLGU9dCtpLGU9cGFyc2VGbG9hdChlLnRvRml4ZWQodGhpcy5fcHJlY2lzaW9uKCkpKSxudWxsIT09cy5tYXgmJmU+cy5tYXg/cy5tYXg6bnVsbCE9PXMubWluJiZzLm1pbj5lP3MubWluOmV9LF9zdG9wOmZ1bmN0aW9uKGUpe3RoaXMuc3Bpbm5pbmcmJihjbGVhclRpbWVvdXQodGhpcy50aW1lciksY2xlYXJUaW1lb3V0KHRoaXMubW91c2V3aGVlbFRpbWVyKSx0aGlzLmNvdW50ZXI9MCx0aGlzLnNwaW5uaW5nPSExLHRoaXMuX3RyaWdnZXIoInN0b3AiLGUpKX0sX3NldE9wdGlvbjpmdW5jdGlvbihlLHQpe2lmKCJjdWx0dXJlIj09PWV8fCJudW1iZXJGb3JtYXQiPT09ZSl7dmFyIGk9dGhpcy5fcGFyc2UodGhpcy5lbGVtZW50LnZhbCgpKTtyZXR1cm4gdGhpcy5vcHRpb25zW2VdPXQsdGhpcy5lbGVtZW50LnZhbCh0aGlzLl9mb3JtYXQoaSkpLHZvaWQgMH0oIm1heCI9PT1lfHwibWluIj09PWV8fCJzdGVwIj09PWUpJiYic3RyaW5nIj09dHlwZW9mIHQmJih0PXRoaXMuX3BhcnNlKHQpKSwiaWNvbnMiPT09ZSYmKHRoaXMuYnV0dG9ucy5maXJzdCgpLmZpbmQoIi51aS1pY29uIikucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLmljb25zLnVwKS5hZGRDbGFzcyh0LnVwKSx0aGlzLmJ1dHRvbnMubGFzdCgpLmZpbmQoIi51aS1pY29uIikucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLmljb25zLmRvd24pLmFkZENsYXNzKHQuZG93bikpLHRoaXMuX3N1cGVyKGUsdCksImRpc2FibGVkIj09PWUmJih0aGlzLndpZGdldCgpLnRvZ2dsZUNsYXNzKCJ1aS1zdGF0ZS1kaXNhYmxlZCIsISF0KSx0aGlzLmVsZW1lbnQucHJvcCgiZGlzYWJsZWQiLCEhdCksdGhpcy5idXR0b25zLmJ1dHRvbih0PyJkaXNhYmxlIjoiZW5hYmxlIikpfSxfc2V0T3B0aW9uczpoKGZ1bmN0aW9uKGUpe3RoaXMuX3N1cGVyKGUpfSksX3BhcnNlOmZ1bmN0aW9uKGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZSYmIiIhPT1lJiYoZT13aW5kb3cuR2xvYmFsaXplJiZ0aGlzLm9wdGlvbnMubnVtYmVyRm9ybWF0P0dsb2JhbGl6ZS5wYXJzZUZsb2F0KGUsMTAsdGhpcy5vcHRpb25zLmN1bHR1cmUpOitlKSwiIj09PWV8fGlzTmFOKGUpP251bGw6ZX0sX2Zvcm1hdDpmdW5jdGlvbihlKXtyZXR1cm4iIj09PWU/IiI6d2luZG93Lkdsb2JhbGl6ZSYmdGhpcy5vcHRpb25zLm51bWJlckZvcm1hdD9HbG9iYWxpemUuZm9ybWF0KGUsdGhpcy5vcHRpb25zLm51bWJlckZvcm1hdCx0aGlzLm9wdGlvbnMuY3VsdHVyZSk6ZX0sX3JlZnJlc2g6ZnVuY3Rpb24oKXt0aGlzLmVsZW1lbnQuYXR0cih7ImFyaWEtdmFsdWVtaW4iOnRoaXMub3B0aW9ucy5taW4sImFyaWEtdmFsdWVtYXgiOnRoaXMub3B0aW9ucy5tYXgsImFyaWEtdmFsdWVub3ciOnRoaXMuX3BhcnNlKHRoaXMuZWxlbWVudC52YWwoKSl9KX0saXNWYWxpZDpmdW5jdGlvbigpe3ZhciBlPXRoaXMudmFsdWUoKTtyZXR1cm4gbnVsbD09PWU/ITE6ZT09PXRoaXMuX2FkanVzdFZhbHVlKGUpfSxfdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgaTsiIiE9PWUmJihpPXRoaXMuX3BhcnNlKGUpLG51bGwhPT1pJiYodHx8KGk9dGhpcy5fYWRqdXN0VmFsdWUoaSkpLGU9dGhpcy5fZm9ybWF0KGkpKSksdGhpcy5lbGVtZW50LnZhbChlKSx0aGlzLl9yZWZyZXNoKCl9LF9kZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1zcGlubmVyLWlucHV0IikucHJvcCgiZGlzYWJsZWQiLCExKS5yZW1vdmVBdHRyKCJhdXRvY29tcGxldGUiKS5yZW1vdmVBdHRyKCJyb2xlIikucmVtb3ZlQXR0cigiYXJpYS12YWx1ZW1pbiIpLnJlbW92ZUF0dHIoImFyaWEtdmFsdWVtYXgiKS5yZW1vdmVBdHRyKCJhcmlhLXZhbHVlbm93IiksdGhpcy51aVNwaW5uZXIucmVwbGFjZVdpdGgodGhpcy5lbGVtZW50KX0sc3RlcFVwOmgoZnVuY3Rpb24oZSl7dGhpcy5fc3RlcFVwKGUpfSksX3N0ZXBVcDpmdW5jdGlvbihlKXt0aGlzLl9zdGFydCgpJiYodGhpcy5fc3BpbigoZXx8MSkqdGhpcy5vcHRpb25zLnN0ZXApLHRoaXMuX3N0b3AoKSl9LHN0ZXBEb3duOmgoZnVuY3Rpb24oZSl7dGhpcy5fc3RlcERvd24oZSl9KSxfc3RlcERvd246ZnVuY3Rpb24oZSl7dGhpcy5fc3RhcnQoKSYmKHRoaXMuX3NwaW4oKGV8fDEpKi10aGlzLm9wdGlvbnMuc3RlcCksdGhpcy5fc3RvcCgpKX0scGFnZVVwOmgoZnVuY3Rpb24oZSl7dGhpcy5fc3RlcFVwKChlfHwxKSp0aGlzLm9wdGlvbnMucGFnZSl9KSxwYWdlRG93bjpoKGZ1bmN0aW9uKGUpe3RoaXMuX3N0ZXBEb3duKChlfHwxKSp0aGlzLm9wdGlvbnMucGFnZSl9KSx2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaCh0aGlzLl92YWx1ZSkuY2FsbCh0aGlzLGUpLHZvaWQgMCk6dGhpcy5fcGFyc2UodGhpcy5lbGVtZW50LnZhbCgpKX0sd2lkZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWlTcGlubmVyfX0pLGUud2lkZ2V0KCJ1aS50YWJzIix7dmVyc2lvbjoiMS4xMS40IixkZWxheTozMDAsb3B0aW9uczp7YWN0aXZlOm51bGwsY29sbGFwc2libGU6ITEsZXZlbnQ6ImNsaWNrIixoZWlnaHRTdHlsZToiY29udGVudCIsaGlkZTpudWxsLHNob3c6bnVsbCxhY3RpdmF0ZTpudWxsLGJlZm9yZUFjdGl2YXRlOm51bGwsYmVmb3JlTG9hZDpudWxsLGxvYWQ6bnVsbH0sX2lzTG9jYWw6ZnVuY3Rpb24oKXt2YXIgZT0vIy4qJC87cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBpLHM7dD10LmNsb25lTm9kZSghMSksaT10LmhyZWYucmVwbGFjZShlLCIiKSxzPWxvY2F0aW9uLmhyZWYucmVwbGFjZShlLCIiKTt0cnl7aT1kZWNvZGVVUklDb21wb25lbnQoaSl9Y2F0Y2gobil7fXRyeXtzPWRlY29kZVVSSUNvbXBvbmVudChzKX1jYXRjaChuKXt9cmV0dXJuIHQuaGFzaC5sZW5ndGg+MSYmaT09PXN9fSgpLF9jcmVhdGU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGk9dGhpcy5vcHRpb25zO3RoaXMucnVubmluZz0hMSx0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLXRhYnMgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWNvcm5lci1hbGwiKS50b2dnbGVDbGFzcygidWktdGFicy1jb2xsYXBzaWJsZSIsaS5jb2xsYXBzaWJsZSksdGhpcy5fcHJvY2Vzc1RhYnMoKSxpLmFjdGl2ZT10aGlzLl9pbml0aWFsQWN0aXZlKCksZS5pc0FycmF5KGkuZGlzYWJsZWQpJiYoaS5kaXNhYmxlZD1lLnVuaXF1ZShpLmRpc2FibGVkLmNvbmNhdChlLm1hcCh0aGlzLnRhYnMuZmlsdGVyKCIudWktc3RhdGUtZGlzYWJsZWQiKSxmdW5jdGlvbihlKXtyZXR1cm4gdC50YWJzLmluZGV4KGUpfSkpKS5zb3J0KCkpLHRoaXMuYWN0aXZlPXRoaXMub3B0aW9ucy5hY3RpdmUhPT0hMSYmdGhpcy5hbmNob3JzLmxlbmd0aD90aGlzLl9maW5kQWN0aXZlKGkuYWN0aXZlKTplKCksdGhpcy5fcmVmcmVzaCgpLHRoaXMuYWN0aXZlLmxlbmd0aCYmdGhpcy5sb2FkKGkuYWN0aXZlKX0sX2luaXRpYWxBY3RpdmU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wdGlvbnMuYWN0aXZlLGk9dGhpcy5vcHRpb25zLmNvbGxhcHNpYmxlLHM9bG9jYXRpb24uaGFzaC5zdWJzdHJpbmcoMSk7cmV0dXJuIG51bGw9PT10JiYocyYmdGhpcy50YWJzLmVhY2goZnVuY3Rpb24oaSxuKXtyZXR1cm4gZShuKS5hdHRyKCJhcmlhLWNvbnRyb2xzIik9PT1zPyh0PWksITEpOnZvaWQgMH0pLG51bGw9PT10JiYodD10aGlzLnRhYnMuaW5kZXgodGhpcy50YWJzLmZpbHRlcigiLnVpLXRhYnMtYWN0aXZlIikpKSwobnVsbD09PXR8fC0xPT09dCkmJih0PXRoaXMudGFicy5sZW5ndGg/MDohMSkpLHQhPT0hMSYmKHQ9dGhpcy50YWJzLmluZGV4KHRoaXMudGFicy5lcSh0KSksLTE9PT10JiYodD1pPyExOjApKSwhaSYmdD09PSExJiZ0aGlzLmFuY2hvcnMubGVuZ3RoJiYodD0wKSx0fSxfZ2V0Q3JlYXRlRXZlbnREYXRhOmZ1bmN0aW9uKCl7cmV0dXJue3RhYjp0aGlzLmFjdGl2ZSxwYW5lbDp0aGlzLmFjdGl2ZS5sZW5ndGg/dGhpcy5fZ2V0UGFuZWxGb3JUYWIodGhpcy5hY3RpdmUpOmUoKX19LF90YWJLZXlkb3duOmZ1bmN0aW9uKHQpe3ZhciBpPWUodGhpcy5kb2N1bWVudFswXS5hY3RpdmVFbGVtZW50KS5jbG9zZXN0KCJsaSIpLHM9dGhpcy50YWJzLmluZGV4KGkpLG49ITA7aWYoIXRoaXMuX2hhbmRsZVBhZ2VOYXYodCkpe3N3aXRjaCh0LmtleUNvZGUpe2Nhc2UgZS51aS5rZXlDb2RlLlJJR0hUOmNhc2UgZS51aS5rZXlDb2RlLkRPV046cysrO2JyZWFrO2Nhc2UgZS51aS5rZXlDb2RlLlVQOmNhc2UgZS51aS5rZXlDb2RlLkxFRlQ6bj0hMSxzLS07YnJlYWs7Y2FzZSBlLnVpLmtleUNvZGUuRU5EOnM9dGhpcy5hbmNob3JzLmxlbmd0aC0xO2JyZWFrO2Nhc2UgZS51aS5rZXlDb2RlLkhPTUU6cz0wO2JyZWFrO2Nhc2UgZS51aS5rZXlDb2RlLlNQQUNFOnJldHVybiB0LnByZXZlbnREZWZhdWx0KCksY2xlYXJUaW1lb3V0KHRoaXMuYWN0aXZhdGluZyksdGhpcy5fYWN0aXZhdGUocyksdm9pZCAwO2Nhc2UgZS51aS5rZXlDb2RlLkVOVEVSOnJldHVybiB0LnByZXZlbnREZWZhdWx0KCksY2xlYXJUaW1lb3V0KHRoaXMuYWN0aXZhdGluZyksdGhpcy5fYWN0aXZhdGUocz09PXRoaXMub3B0aW9ucy5hY3RpdmU/ITE6cyksdm9pZCAwO2RlZmF1bHQ6cmV0dXJufXQucHJldmVudERlZmF1bHQoKSxjbGVhclRpbWVvdXQodGhpcy5hY3RpdmF0aW5nKSxzPXRoaXMuX2ZvY3VzTmV4dFRhYihzLG4pLHQuY3RybEtleXx8dC5tZXRhS2V5fHwoaS5hdHRyKCJhcmlhLXNlbGVjdGVkIiwiZmFsc2UiKSx0aGlzLnRhYnMuZXEocykuYXR0cigiYXJpYS1zZWxlY3RlZCIsInRydWUiKSx0aGlzLmFjdGl2YXRpbmc9dGhpcy5fZGVsYXkoZnVuY3Rpb24oKXt0aGlzLm9wdGlvbigiYWN0aXZlIixzKX0sdGhpcy5kZWxheSkpfX0sX3BhbmVsS2V5ZG93bjpmdW5jdGlvbih0KXt0aGlzLl9oYW5kbGVQYWdlTmF2KHQpfHx0LmN0cmxLZXkmJnQua2V5Q29kZT09PWUudWkua2V5Q29kZS5VUCYmKHQucHJldmVudERlZmF1bHQoKSx0aGlzLmFjdGl2ZS5mb2N1cygpKX0sX2hhbmRsZVBhZ2VOYXY6ZnVuY3Rpb24odCl7cmV0dXJuIHQuYWx0S2V5JiZ0LmtleUNvZGU9PT1lLnVpLmtleUNvZGUuUEFHRV9VUD8odGhpcy5fYWN0aXZhdGUodGhpcy5fZm9jdXNOZXh0VGFiKHRoaXMub3B0aW9ucy5hY3RpdmUtMSwhMSkpLCEwKTp0LmFsdEtleSYmdC5rZXlDb2RlPT09ZS51aS5rZXlDb2RlLlBBR0VfRE9XTj8odGhpcy5fYWN0aXZhdGUodGhpcy5fZm9jdXNOZXh0VGFiKHRoaXMub3B0aW9ucy5hY3RpdmUrMSwhMCkpLCEwKTp2b2lkIDB9LF9maW5kTmV4dFRhYjpmdW5jdGlvbih0LGkpe2Z1bmN0aW9uIHMoKXtyZXR1cm4gdD5uJiYodD0wKSwwPnQmJih0PW4pLHR9Zm9yKHZhciBuPXRoaXMudGFicy5sZW5ndGgtMTstMSE9PWUuaW5BcnJheShzKCksdGhpcy5vcHRpb25zLmRpc2FibGVkKTspdD1pP3QrMTp0LTE7cmV0dXJuIHR9LF9mb2N1c05leHRUYWI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT10aGlzLl9maW5kTmV4dFRhYihlLHQpLHRoaXMudGFicy5lcShlKS5mb2N1cygpLGV9LF9zZXRPcHRpb246ZnVuY3Rpb24oZSx0KXtyZXR1cm4iYWN0aXZlIj09PWU/KHRoaXMuX2FjdGl2YXRlKHQpLHZvaWQgMCk6ImRpc2FibGVkIj09PWU/KHRoaXMuX3NldHVwRGlzYWJsZWQodCksdm9pZCAwKToodGhpcy5fc3VwZXIoZSx0KSwiY29sbGFwc2libGUiPT09ZSYmKHRoaXMuZWxlbWVudC50b2dnbGVDbGFzcygidWktdGFicy1jb2xsYXBzaWJsZSIsdCksdHx8dGhpcy5vcHRpb25zLmFjdGl2ZSE9PSExfHx0aGlzLl9hY3RpdmF0ZSgwKSksImV2ZW50Ij09PWUmJnRoaXMuX3NldHVwRXZlbnRzKHQpLCJoZWlnaHRTdHlsZSI9PT1lJiZ0aGlzLl9zZXR1cEhlaWdodFN0eWxlKHQpLHZvaWQgMCl9LF9zYW5pdGl6ZVNlbGVjdG9yOmZ1bmN0aW9uKGUpe3JldHVybiBlP2UucmVwbGFjZSgvWyEiJCUmJygpKissLlwvOjs8PT4/QFxbXF1cXmB7fH1+XS9nLCJcXCQmIik6IiJ9LHJlZnJlc2g6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wdGlvbnMsaT10aGlzLnRhYmxpc3QuY2hpbGRyZW4oIjpoYXMoYVtocmVmXSkiKTt0LmRpc2FibGVkPWUubWFwKGkuZmlsdGVyKCIudWktc3RhdGUtZGlzYWJsZWQiKSxmdW5jdGlvbihlKXtyZXR1cm4gaS5pbmRleChlKX0pLHRoaXMuX3Byb2Nlc3NUYWJzKCksdC5hY3RpdmUhPT0hMSYmdGhpcy5hbmNob3JzLmxlbmd0aD90aGlzLmFjdGl2ZS5sZW5ndGgmJiFlLmNvbnRhaW5zKHRoaXMudGFibGlzdFswXSx0aGlzLmFjdGl2ZVswXSk/dGhpcy50YWJzLmxlbmd0aD09PXQuZGlzYWJsZWQubGVuZ3RoPyh0LmFjdGl2ZT0hMSx0aGlzLmFjdGl2ZT1lKCkpOnRoaXMuX2FjdGl2YXRlKHRoaXMuX2ZpbmROZXh0VGFiKE1hdGgubWF4KDAsdC5hY3RpdmUtMSksITEpKTp0LmFjdGl2ZT10aGlzLnRhYnMuaW5kZXgodGhpcy5hY3RpdmUpOih0LmFjdGl2ZT0hMSx0aGlzLmFjdGl2ZT1lKCkpLHRoaXMuX3JlZnJlc2goKX0sX3JlZnJlc2g6ZnVuY3Rpb24oKXt0aGlzLl9zZXR1cERpc2FibGVkKHRoaXMub3B0aW9ucy5kaXNhYmxlZCksdGhpcy5fc2V0dXBFdmVudHModGhpcy5vcHRpb25zLmV2ZW50KSx0aGlzLl9zZXR1cEhlaWdodFN0eWxlKHRoaXMub3B0aW9ucy5oZWlnaHRTdHlsZSksdGhpcy50YWJzLm5vdCh0aGlzLmFjdGl2ZSkuYXR0cih7ImFyaWEtc2VsZWN0ZWQiOiJmYWxzZSIsImFyaWEtZXhwYW5kZWQiOiJmYWxzZSIsdGFiSW5kZXg6LTF9KSx0aGlzLnBhbmVscy5ub3QodGhpcy5fZ2V0UGFuZWxGb3JUYWIodGhpcy5hY3RpdmUpKS5oaWRlKCkuYXR0cih7ImFyaWEtaGlkZGVuIjoidHJ1ZSJ9KSx0aGlzLmFjdGl2ZS5sZW5ndGg/KHRoaXMuYWN0aXZlLmFkZENsYXNzKCJ1aS10YWJzLWFjdGl2ZSB1aS1zdGF0ZS1hY3RpdmUiKS5hdHRyKHsiYXJpYS1zZWxlY3RlZCI6InRydWUiLCJhcmlhLWV4cGFuZGVkIjoidHJ1ZSIsdGFiSW5kZXg6MH0pLHRoaXMuX2dldFBhbmVsRm9yVGFiKHRoaXMuYWN0aXZlKS5zaG93KCkuYXR0cih7ImFyaWEtaGlkZGVuIjoiZmFsc2UifSkpOnRoaXMudGFicy5lcSgwKS5hdHRyKCJ0YWJJbmRleCIsMCl9LF9wcm9jZXNzVGFiczpmdW5jdGlvbigpe3ZhciB0PXRoaXMsaT10aGlzLnRhYnMscz10aGlzLmFuY2hvcnMsbj10aGlzLnBhbmVsczsKdGhpcy50YWJsaXN0PXRoaXMuX2dldExpc3QoKS5hZGRDbGFzcygidWktdGFicy1uYXYgdWktaGVscGVyLXJlc2V0IHVpLWhlbHBlci1jbGVhcmZpeCB1aS13aWRnZXQtaGVhZGVyIHVpLWNvcm5lci1hbGwiKS5hdHRyKCJyb2xlIiwidGFibGlzdCIpLmRlbGVnYXRlKCI+IGxpIiwibW91c2Vkb3duIit0aGlzLmV2ZW50TmFtZXNwYWNlLGZ1bmN0aW9uKHQpe2UodGhpcykuaXMoIi51aS1zdGF0ZS1kaXNhYmxlZCIpJiZ0LnByZXZlbnREZWZhdWx0KCl9KS5kZWxlZ2F0ZSgiLnVpLXRhYnMtYW5jaG9yIiwiZm9jdXMiK3RoaXMuZXZlbnROYW1lc3BhY2UsZnVuY3Rpb24oKXtlKHRoaXMpLmNsb3Nlc3QoImxpIikuaXMoIi51aS1zdGF0ZS1kaXNhYmxlZCIpJiZ0aGlzLmJsdXIoKX0pLHRoaXMudGFicz10aGlzLnRhYmxpc3QuZmluZCgiPiBsaTpoYXMoYVtocmVmXSkiKS5hZGRDbGFzcygidWktc3RhdGUtZGVmYXVsdCB1aS1jb3JuZXItdG9wIikuYXR0cih7cm9sZToidGFiIix0YWJJbmRleDotMX0pLHRoaXMuYW5jaG9ycz10aGlzLnRhYnMubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIGUoImEiLHRoaXMpWzBdfSkuYWRkQ2xhc3MoInVpLXRhYnMtYW5jaG9yIikuYXR0cih7cm9sZToicHJlc2VudGF0aW9uIix0YWJJbmRleDotMX0pLHRoaXMucGFuZWxzPWUoKSx0aGlzLmFuY2hvcnMuZWFjaChmdW5jdGlvbihpLHMpe3ZhciBuLGEsbyxyPWUocykudW5pcXVlSWQoKS5hdHRyKCJpZCIpLGg9ZShzKS5jbG9zZXN0KCJsaSIpLGw9aC5hdHRyKCJhcmlhLWNvbnRyb2xzIik7dC5faXNMb2NhbChzKT8obj1zLmhhc2gsbz1uLnN1YnN0cmluZygxKSxhPXQuZWxlbWVudC5maW5kKHQuX3Nhbml0aXplU2VsZWN0b3IobikpKToobz1oLmF0dHIoImFyaWEtY29udHJvbHMiKXx8ZSh7fSkudW5pcXVlSWQoKVswXS5pZCxuPSIjIitvLGE9dC5lbGVtZW50LmZpbmQobiksYS5sZW5ndGh8fChhPXQuX2NyZWF0ZVBhbmVsKG8pLGEuaW5zZXJ0QWZ0ZXIodC5wYW5lbHNbaS0xXXx8dC50YWJsaXN0KSksYS5hdHRyKCJhcmlhLWxpdmUiLCJwb2xpdGUiKSksYS5sZW5ndGgmJih0LnBhbmVscz10LnBhbmVscy5hZGQoYSkpLGwmJmguZGF0YSgidWktdGFicy1hcmlhLWNvbnRyb2xzIixsKSxoLmF0dHIoeyJhcmlhLWNvbnRyb2xzIjpvLCJhcmlhLWxhYmVsbGVkYnkiOnJ9KSxhLmF0dHIoImFyaWEtbGFiZWxsZWRieSIscil9KSx0aGlzLnBhbmVscy5hZGRDbGFzcygidWktdGFicy1wYW5lbCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYm90dG9tIikuYXR0cigicm9sZSIsInRhYnBhbmVsIiksaSYmKHRoaXMuX29mZihpLm5vdCh0aGlzLnRhYnMpKSx0aGlzLl9vZmYocy5ub3QodGhpcy5hbmNob3JzKSksdGhpcy5fb2ZmKG4ubm90KHRoaXMucGFuZWxzKSkpfSxfZ2V0TGlzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnRhYmxpc3R8fHRoaXMuZWxlbWVudC5maW5kKCJvbCx1bCIpLmVxKDApfSxfY3JlYXRlUGFuZWw6ZnVuY3Rpb24odCl7cmV0dXJuIGUoIjxkaXY+IikuYXR0cigiaWQiLHQpLmFkZENsYXNzKCJ1aS10YWJzLXBhbmVsIHVpLXdpZGdldC1jb250ZW50IHVpLWNvcm5lci1ib3R0b20iKS5kYXRhKCJ1aS10YWJzLWRlc3Ryb3kiLCEwKX0sX3NldHVwRGlzYWJsZWQ6ZnVuY3Rpb24odCl7ZS5pc0FycmF5KHQpJiYodC5sZW5ndGg/dC5sZW5ndGg9PT10aGlzLmFuY2hvcnMubGVuZ3RoJiYodD0hMCk6dD0hMSk7Zm9yKHZhciBpLHM9MDtpPXRoaXMudGFic1tzXTtzKyspdD09PSEwfHwtMSE9PWUuaW5BcnJheShzLHQpP2UoaSkuYWRkQ2xhc3MoInVpLXN0YXRlLWRpc2FibGVkIikuYXR0cigiYXJpYS1kaXNhYmxlZCIsInRydWUiKTplKGkpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1kaXNhYmxlZCIpLnJlbW92ZUF0dHIoImFyaWEtZGlzYWJsZWQiKTt0aGlzLm9wdGlvbnMuZGlzYWJsZWQ9dH0sX3NldHVwRXZlbnRzOmZ1bmN0aW9uKHQpe3ZhciBpPXt9O3QmJmUuZWFjaCh0LnNwbGl0KCIgIiksZnVuY3Rpb24oZSx0KXtpW3RdPSJfZXZlbnRIYW5kbGVyIn0pLHRoaXMuX29mZih0aGlzLmFuY2hvcnMuYWRkKHRoaXMudGFicykuYWRkKHRoaXMucGFuZWxzKSksdGhpcy5fb24oITAsdGhpcy5hbmNob3JzLHtjbGljazpmdW5jdGlvbihlKXtlLnByZXZlbnREZWZhdWx0KCl9fSksdGhpcy5fb24odGhpcy5hbmNob3JzLGkpLHRoaXMuX29uKHRoaXMudGFicyx7a2V5ZG93bjoiX3RhYktleWRvd24ifSksdGhpcy5fb24odGhpcy5wYW5lbHMse2tleWRvd246Il9wYW5lbEtleWRvd24ifSksdGhpcy5fZm9jdXNhYmxlKHRoaXMudGFicyksdGhpcy5faG92ZXJhYmxlKHRoaXMudGFicyl9LF9zZXR1cEhlaWdodFN0eWxlOmZ1bmN0aW9uKHQpe3ZhciBpLHM9dGhpcy5lbGVtZW50LnBhcmVudCgpOyJmaWxsIj09PXQ/KGk9cy5oZWlnaHQoKSxpLT10aGlzLmVsZW1lbnQub3V0ZXJIZWlnaHQoKS10aGlzLmVsZW1lbnQuaGVpZ2h0KCksdGhpcy5lbGVtZW50LnNpYmxpbmdzKCI6dmlzaWJsZSIpLmVhY2goZnVuY3Rpb24oKXt2YXIgdD1lKHRoaXMpLHM9dC5jc3MoInBvc2l0aW9uIik7ImFic29sdXRlIiE9PXMmJiJmaXhlZCIhPT1zJiYoaS09dC5vdXRlckhlaWdodCghMCkpfSksdGhpcy5lbGVtZW50LmNoaWxkcmVuKCkubm90KHRoaXMucGFuZWxzKS5lYWNoKGZ1bmN0aW9uKCl7aS09ZSh0aGlzKS5vdXRlckhlaWdodCghMCl9KSx0aGlzLnBhbmVscy5lYWNoKGZ1bmN0aW9uKCl7ZSh0aGlzKS5oZWlnaHQoTWF0aC5tYXgoMCxpLWUodGhpcykuaW5uZXJIZWlnaHQoKStlKHRoaXMpLmhlaWdodCgpKSl9KS5jc3MoIm92ZXJmbG93IiwiYXV0byIpKToiYXV0byI9PT10JiYoaT0wLHRoaXMucGFuZWxzLmVhY2goZnVuY3Rpb24oKXtpPU1hdGgubWF4KGksZSh0aGlzKS5oZWlnaHQoIiIpLmhlaWdodCgpKX0pLmhlaWdodChpKSl9LF9ldmVudEhhbmRsZXI6ZnVuY3Rpb24odCl7dmFyIGk9dGhpcy5vcHRpb25zLHM9dGhpcy5hY3RpdmUsbj1lKHQuY3VycmVudFRhcmdldCksYT1uLmNsb3Nlc3QoImxpIiksbz1hWzBdPT09c1swXSxyPW8mJmkuY29sbGFwc2libGUsaD1yP2UoKTp0aGlzLl9nZXRQYW5lbEZvclRhYihhKSxsPXMubGVuZ3RoP3RoaXMuX2dldFBhbmVsRm9yVGFiKHMpOmUoKSx1PXtvbGRUYWI6cyxvbGRQYW5lbDpsLG5ld1RhYjpyP2UoKTphLG5ld1BhbmVsOmh9O3QucHJldmVudERlZmF1bHQoKSxhLmhhc0NsYXNzKCJ1aS1zdGF0ZS1kaXNhYmxlZCIpfHxhLmhhc0NsYXNzKCJ1aS10YWJzLWxvYWRpbmciKXx8dGhpcy5ydW5uaW5nfHxvJiYhaS5jb2xsYXBzaWJsZXx8dGhpcy5fdHJpZ2dlcigiYmVmb3JlQWN0aXZhdGUiLHQsdSk9PT0hMXx8KGkuYWN0aXZlPXI/ITE6dGhpcy50YWJzLmluZGV4KGEpLHRoaXMuYWN0aXZlPW8/ZSgpOmEsdGhpcy54aHImJnRoaXMueGhyLmFib3J0KCksbC5sZW5ndGh8fGgubGVuZ3RofHxlLmVycm9yKCJqUXVlcnkgVUkgVGFiczogTWlzbWF0Y2hpbmcgZnJhZ21lbnQgaWRlbnRpZmllci4iKSxoLmxlbmd0aCYmdGhpcy5sb2FkKHRoaXMudGFicy5pbmRleChhKSx0KSx0aGlzLl90b2dnbGUodCx1KSl9LF90b2dnbGU6ZnVuY3Rpb24odCxpKXtmdW5jdGlvbiBzKCl7YS5ydW5uaW5nPSExLGEuX3RyaWdnZXIoImFjdGl2YXRlIix0LGkpfWZ1bmN0aW9uIG4oKXtpLm5ld1RhYi5jbG9zZXN0KCJsaSIpLmFkZENsYXNzKCJ1aS10YWJzLWFjdGl2ZSB1aS1zdGF0ZS1hY3RpdmUiKSxvLmxlbmd0aCYmYS5vcHRpb25zLnNob3c/YS5fc2hvdyhvLGEub3B0aW9ucy5zaG93LHMpOihvLnNob3coKSxzKCkpfXZhciBhPXRoaXMsbz1pLm5ld1BhbmVsLHI9aS5vbGRQYW5lbDt0aGlzLnJ1bm5pbmc9ITAsci5sZW5ndGgmJnRoaXMub3B0aW9ucy5oaWRlP3RoaXMuX2hpZGUocix0aGlzLm9wdGlvbnMuaGlkZSxmdW5jdGlvbigpe2kub2xkVGFiLmNsb3Nlc3QoImxpIikucmVtb3ZlQ2xhc3MoInVpLXRhYnMtYWN0aXZlIHVpLXN0YXRlLWFjdGl2ZSIpLG4oKX0pOihpLm9sZFRhYi5jbG9zZXN0KCJsaSIpLnJlbW92ZUNsYXNzKCJ1aS10YWJzLWFjdGl2ZSB1aS1zdGF0ZS1hY3RpdmUiKSxyLmhpZGUoKSxuKCkpLHIuYXR0cigiYXJpYS1oaWRkZW4iLCJ0cnVlIiksaS5vbGRUYWIuYXR0cih7ImFyaWEtc2VsZWN0ZWQiOiJmYWxzZSIsImFyaWEtZXhwYW5kZWQiOiJmYWxzZSJ9KSxvLmxlbmd0aCYmci5sZW5ndGg/aS5vbGRUYWIuYXR0cigidGFiSW5kZXgiLC0xKTpvLmxlbmd0aCYmdGhpcy50YWJzLmZpbHRlcihmdW5jdGlvbigpe3JldHVybiAwPT09ZSh0aGlzKS5hdHRyKCJ0YWJJbmRleCIpfSkuYXR0cigidGFiSW5kZXgiLC0xKSxvLmF0dHIoImFyaWEtaGlkZGVuIiwiZmFsc2UiKSxpLm5ld1RhYi5hdHRyKHsiYXJpYS1zZWxlY3RlZCI6InRydWUiLCJhcmlhLWV4cGFuZGVkIjoidHJ1ZSIsdGFiSW5kZXg6MH0pfSxfYWN0aXZhdGU6ZnVuY3Rpb24odCl7dmFyIGkscz10aGlzLl9maW5kQWN0aXZlKHQpO3NbMF0hPT10aGlzLmFjdGl2ZVswXSYmKHMubGVuZ3RofHwocz10aGlzLmFjdGl2ZSksaT1zLmZpbmQoIi51aS10YWJzLWFuY2hvciIpWzBdLHRoaXMuX2V2ZW50SGFuZGxlcih7dGFyZ2V0OmksY3VycmVudFRhcmdldDppLHByZXZlbnREZWZhdWx0OmUubm9vcH0pKX0sX2ZpbmRBY3RpdmU6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT0hMT9lKCk6dGhpcy50YWJzLmVxKHQpfSxfZ2V0SW5kZXg6ZnVuY3Rpb24oZSl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBlJiYoZT10aGlzLmFuY2hvcnMuaW5kZXgodGhpcy5hbmNob3JzLmZpbHRlcigiW2hyZWYkPSciK2UrIiddIikpKSxlfSxfZGVzdHJveTpmdW5jdGlvbigpe3RoaXMueGhyJiZ0aGlzLnhoci5hYm9ydCgpLHRoaXMuZWxlbWVudC5yZW1vdmVDbGFzcygidWktdGFicyB1aS13aWRnZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWFsbCB1aS10YWJzLWNvbGxhcHNpYmxlIiksdGhpcy50YWJsaXN0LnJlbW92ZUNsYXNzKCJ1aS10YWJzLW5hdiB1aS1oZWxwZXItcmVzZXQgdWktaGVscGVyLWNsZWFyZml4IHVpLXdpZGdldC1oZWFkZXIgdWktY29ybmVyLWFsbCIpLnJlbW92ZUF0dHIoInJvbGUiKSx0aGlzLmFuY2hvcnMucmVtb3ZlQ2xhc3MoInVpLXRhYnMtYW5jaG9yIikucmVtb3ZlQXR0cigicm9sZSIpLnJlbW92ZUF0dHIoInRhYkluZGV4IikucmVtb3ZlVW5pcXVlSWQoKSx0aGlzLnRhYmxpc3QudW5iaW5kKHRoaXMuZXZlbnROYW1lc3BhY2UpLHRoaXMudGFicy5hZGQodGhpcy5wYW5lbHMpLmVhY2goZnVuY3Rpb24oKXtlLmRhdGEodGhpcywidWktdGFicy1kZXN0cm95Iik/ZSh0aGlzKS5yZW1vdmUoKTplKHRoaXMpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1kZWZhdWx0IHVpLXN0YXRlLWFjdGl2ZSB1aS1zdGF0ZS1kaXNhYmxlZCB1aS1jb3JuZXItdG9wIHVpLWNvcm5lci1ib3R0b20gdWktd2lkZ2V0LWNvbnRlbnQgdWktdGFicy1hY3RpdmUgdWktdGFicy1wYW5lbCIpLnJlbW92ZUF0dHIoInRhYkluZGV4IikucmVtb3ZlQXR0cigiYXJpYS1saXZlIikucmVtb3ZlQXR0cigiYXJpYS1idXN5IikucmVtb3ZlQXR0cigiYXJpYS1zZWxlY3RlZCIpLnJlbW92ZUF0dHIoImFyaWEtbGFiZWxsZWRieSIpLnJlbW92ZUF0dHIoImFyaWEtaGlkZGVuIikucmVtb3ZlQXR0cigiYXJpYS1leHBhbmRlZCIpLnJlbW92ZUF0dHIoInJvbGUiKX0pLHRoaXMudGFicy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9ZSh0aGlzKSxpPXQuZGF0YSgidWktdGFicy1hcmlhLWNvbnRyb2xzIik7aT90LmF0dHIoImFyaWEtY29udHJvbHMiLGkpLnJlbW92ZURhdGEoInVpLXRhYnMtYXJpYS1jb250cm9scyIpOnQucmVtb3ZlQXR0cigiYXJpYS1jb250cm9scyIpfSksdGhpcy5wYW5lbHMuc2hvdygpLCJjb250ZW50IiE9PXRoaXMub3B0aW9ucy5oZWlnaHRTdHlsZSYmdGhpcy5wYW5lbHMuY3NzKCJoZWlnaHQiLCIiKX0sZW5hYmxlOmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMub3B0aW9ucy5kaXNhYmxlZDtpIT09ITEmJih2b2lkIDA9PT10P2k9ITE6KHQ9dGhpcy5fZ2V0SW5kZXgodCksaT1lLmlzQXJyYXkoaSk/ZS5tYXAoaSxmdW5jdGlvbihlKXtyZXR1cm4gZSE9PXQ/ZTpudWxsfSk6ZS5tYXAodGhpcy50YWJzLGZ1bmN0aW9uKGUsaSl7cmV0dXJuIGkhPT10P2k6bnVsbH0pKSx0aGlzLl9zZXR1cERpc2FibGVkKGkpKX0sZGlzYWJsZTpmdW5jdGlvbih0KXt2YXIgaT10aGlzLm9wdGlvbnMuZGlzYWJsZWQ7aWYoaSE9PSEwKXtpZih2b2lkIDA9PT10KWk9ITA7ZWxzZXtpZih0PXRoaXMuX2dldEluZGV4KHQpLC0xIT09ZS5pbkFycmF5KHQsaSkpcmV0dXJuO2k9ZS5pc0FycmF5KGkpP2UubWVyZ2UoW3RdLGkpLnNvcnQoKTpbdF19dGhpcy5fc2V0dXBEaXNhYmxlZChpKX19LGxvYWQ6ZnVuY3Rpb24odCxpKXt0PXRoaXMuX2dldEluZGV4KHQpO3ZhciBzPXRoaXMsbj10aGlzLnRhYnMuZXEodCksYT1uLmZpbmQoIi51aS10YWJzLWFuY2hvciIpLG89dGhpcy5fZ2V0UGFuZWxGb3JUYWIobikscj17dGFiOm4scGFuZWw6b30saD1mdW5jdGlvbihlLHQpeyJhYm9ydCI9PT10JiZzLnBhbmVscy5zdG9wKCExLCEwKSxuLnJlbW92ZUNsYXNzKCJ1aS10YWJzLWxvYWRpbmciKSxvLnJlbW92ZUF0dHIoImFyaWEtYnVzeSIpLGU9PT1zLnhociYmZGVsZXRlIHMueGhyfTt0aGlzLl9pc0xvY2FsKGFbMF0pfHwodGhpcy54aHI9ZS5hamF4KHRoaXMuX2FqYXhTZXR0aW5ncyhhLGkscikpLHRoaXMueGhyJiYiY2FuY2VsZWQiIT09dGhpcy54aHIuc3RhdHVzVGV4dCYmKG4uYWRkQ2xhc3MoInVpLXRhYnMtbG9hZGluZyIpLG8uYXR0cigiYXJpYS1idXN5IiwidHJ1ZSIpLHRoaXMueGhyLmRvbmUoZnVuY3Rpb24oZSx0LG4pe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtvLmh0bWwoZSkscy5fdHJpZ2dlcigibG9hZCIsaSxyKSxoKG4sdCl9LDEpfSkuZmFpbChmdW5jdGlvbihlLHQpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtoKGUsdCl9LDEpfSkpKX0sX2FqYXhTZXR0aW5nczpmdW5jdGlvbih0LGkscyl7dmFyIG49dGhpcztyZXR1cm57dXJsOnQuYXR0cigiaHJlZiIpLGJlZm9yZVNlbmQ6ZnVuY3Rpb24odCxhKXtyZXR1cm4gbi5fdHJpZ2dlcigiYmVmb3JlTG9hZCIsaSxlLmV4dGVuZCh7anFYSFI6dCxhamF4U2V0dGluZ3M6YX0scykpfX19LF9nZXRQYW5lbEZvclRhYjpmdW5jdGlvbih0KXt2YXIgaT1lKHQpLmF0dHIoImFyaWEtY29udHJvbHMiKTtyZXR1cm4gdGhpcy5lbGVtZW50LmZpbmQodGhpcy5fc2FuaXRpemVTZWxlY3RvcigiIyIraSkpfX0pLGUud2lkZ2V0KCJ1aS50b29sdGlwIix7dmVyc2lvbjoiMS4xMS40IixvcHRpb25zOntjb250ZW50OmZ1bmN0aW9uKCl7dmFyIHQ9ZSh0aGlzKS5hdHRyKCJ0aXRsZSIpfHwiIjtyZXR1cm4gZSgiPGE+IikudGV4dCh0KS5odG1sKCl9LGhpZGU6ITAsaXRlbXM6Ilt0aXRsZV06bm90KFtkaXNhYmxlZF0pIixwb3NpdGlvbjp7bXk6ImxlZnQgdG9wKzE1IixhdDoibGVmdCBib3R0b20iLGNvbGxpc2lvbjoiZmxpcGZpdCBmbGlwIn0sc2hvdzohMCx0b29sdGlwQ2xhc3M6bnVsbCx0cmFjazohMSxjbG9zZTpudWxsLG9wZW46bnVsbH0sX2FkZERlc2NyaWJlZEJ5OmZ1bmN0aW9uKHQsaSl7dmFyIHM9KHQuYXR0cigiYXJpYS1kZXNjcmliZWRieSIpfHwiIikuc3BsaXQoL1xzKy8pO3MucHVzaChpKSx0LmRhdGEoInVpLXRvb2x0aXAtaWQiLGkpLmF0dHIoImFyaWEtZGVzY3JpYmVkYnkiLGUudHJpbShzLmpvaW4oIiAiKSkpfSxfcmVtb3ZlRGVzY3JpYmVkQnk6ZnVuY3Rpb24odCl7dmFyIGk9dC5kYXRhKCJ1aS10b29sdGlwLWlkIikscz0odC5hdHRyKCJhcmlhLWRlc2NyaWJlZGJ5Iil8fCIiKS5zcGxpdCgvXHMrLyksbj1lLmluQXJyYXkoaSxzKTstMSE9PW4mJnMuc3BsaWNlKG4sMSksdC5yZW1vdmVEYXRhKCJ1aS10b29sdGlwLWlkIikscz1lLnRyaW0ocy5qb2luKCIgIikpLHM/dC5hdHRyKCJhcmlhLWRlc2NyaWJlZGJ5IixzKTp0LnJlbW92ZUF0dHIoImFyaWEtZGVzY3JpYmVkYnkiKX0sX2NyZWF0ZTpmdW5jdGlvbigpe3RoaXMuX29uKHttb3VzZW92ZXI6Im9wZW4iLGZvY3VzaW46Im9wZW4ifSksdGhpcy50b29sdGlwcz17fSx0aGlzLnBhcmVudHM9e30sdGhpcy5vcHRpb25zLmRpc2FibGVkJiZ0aGlzLl9kaXNhYmxlKCksdGhpcy5saXZlUmVnaW9uPWUoIjxkaXY+IikuYXR0cih7cm9sZToibG9nIiwiYXJpYS1saXZlIjoiYXNzZXJ0aXZlIiwiYXJpYS1yZWxldmFudCI6ImFkZGl0aW9ucyJ9KS5hZGRDbGFzcygidWktaGVscGVyLWhpZGRlbi1hY2Nlc3NpYmxlIikuYXBwZW5kVG8odGhpcy5kb2N1bWVudFswXS5ib2R5KX0sX3NldE9wdGlvbjpmdW5jdGlvbih0LGkpe3ZhciBzPXRoaXM7cmV0dXJuImRpc2FibGVkIj09PXQ/KHRoaXNbaT8iX2Rpc2FibGUiOiJfZW5hYmxlIl0oKSx0aGlzLm9wdGlvbnNbdF09aSx2b2lkIDApOih0aGlzLl9zdXBlcih0LGkpLCJjb250ZW50Ij09PXQmJmUuZWFjaCh0aGlzLnRvb2x0aXBzLGZ1bmN0aW9uKGUsdCl7cy5fdXBkYXRlQ29udGVudCh0LmVsZW1lbnQpfSksdm9pZCAwKX0sX2Rpc2FibGU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2UuZWFjaCh0aGlzLnRvb2x0aXBzLGZ1bmN0aW9uKGkscyl7dmFyIG49ZS5FdmVudCgiYmx1ciIpO24udGFyZ2V0PW4uY3VycmVudFRhcmdldD1zLmVsZW1lbnRbMF0sdC5jbG9zZShuLCEwKX0pLHRoaXMuZWxlbWVudC5maW5kKHRoaXMub3B0aW9ucy5pdGVtcykuYWRkQmFjaygpLmVhY2goZnVuY3Rpb24oKXt2YXIgdD1lKHRoaXMpO3QuaXMoIlt0aXRsZV0iKSYmdC5kYXRhKCJ1aS10b29sdGlwLXRpdGxlIix0LmF0dHIoInRpdGxlIikpLnJlbW92ZUF0dHIoInRpdGxlIil9KX0sX2VuYWJsZTpmdW5jdGlvbigpe3RoaXMuZWxlbWVudC5maW5kKHRoaXMub3B0aW9ucy5pdGVtcykuYWRkQmFjaygpLmVhY2goZnVuY3Rpb24oKXt2YXIgdD1lKHRoaXMpO3QuZGF0YSgidWktdG9vbHRpcC10aXRsZSIpJiZ0LmF0dHIoInRpdGxlIix0LmRhdGEoInVpLXRvb2x0aXAtdGl0bGUiKSl9KX0sb3BlbjpmdW5jdGlvbih0KXt2YXIgaT10aGlzLHM9ZSh0P3QudGFyZ2V0OnRoaXMuZWxlbWVudCkuY2xvc2VzdCh0aGlzLm9wdGlvbnMuaXRlbXMpO3MubGVuZ3RoJiYhcy5kYXRhKCJ1aS10b29sdGlwLWlkIikmJihzLmF0dHIoInRpdGxlIikmJnMuZGF0YSgidWktdG9vbHRpcC10aXRsZSIscy5hdHRyKCJ0aXRsZSIpKSxzLmRhdGEoInVpLXRvb2x0aXAtb3BlbiIsITApLHQmJiJtb3VzZW92ZXIiPT09dC50eXBlJiZzLnBhcmVudHMoKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQscz1lKHRoaXMpO3MuZGF0YSgidWktdG9vbHRpcC1vcGVuIikmJih0PWUuRXZlbnQoImJsdXIiKSx0LnRhcmdldD10LmN1cnJlbnRUYXJnZXQ9dGhpcyxpLmNsb3NlKHQsITApKSxzLmF0dHIoInRpdGxlIikmJihzLnVuaXF1ZUlkKCksaS5wYXJlbnRzW3RoaXMuaWRdPXtlbGVtZW50OnRoaXMsdGl0bGU6cy5hdHRyKCJ0aXRsZSIpfSxzLmF0dHIoInRpdGxlIiwiIikpfSksdGhpcy5fcmVnaXN0ZXJDbG9zZUhhbmRsZXJzKHQscyksdGhpcy5fdXBkYXRlQ29udGVudChzLHQpKX0sX3VwZGF0ZUNvbnRlbnQ6ZnVuY3Rpb24oZSx0KXt2YXIgaSxzPXRoaXMub3B0aW9ucy5jb250ZW50LG49dGhpcyxhPXQ/dC50eXBlOm51bGw7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBzP3RoaXMuX29wZW4odCxlLHMpOihpPXMuY2FsbChlWzBdLGZ1bmN0aW9uKGkpe24uX2RlbGF5KGZ1bmN0aW9uKCl7ZS5kYXRhKCJ1aS10b29sdGlwLW9wZW4iKSYmKHQmJih0LnR5cGU9YSksdGhpcy5fb3Blbih0LGUsaSkpfSl9KSxpJiZ0aGlzLl9vcGVuKHQsZSxpKSx2b2lkIDApfSxfb3BlbjpmdW5jdGlvbih0LGkscyl7ZnVuY3Rpb24gbihlKXtsLm9mPWUsby5pcygiOmhpZGRlbiIpfHxvLnBvc2l0aW9uKGwpfXZhciBhLG8scixoLGw9ZS5leHRlbmQoe30sdGhpcy5vcHRpb25zLnBvc2l0aW9uKTtpZihzKXtpZihhPXRoaXMuX2ZpbmQoaSkpcmV0dXJuIGEudG9vbHRpcC5maW5kKCIudWktdG9vbHRpcC1jb250ZW50IikuaHRtbChzKSx2b2lkIDA7aS5pcygiW3RpdGxlXSIpJiYodCYmIm1vdXNlb3ZlciI9PT10LnR5cGU/aS5hdHRyKCJ0aXRsZSIsIiIpOmkucmVtb3ZlQXR0cigidGl0bGUiKSksYT10aGlzLl90b29sdGlwKGkpLG89YS50b29sdGlwLHRoaXMuX2FkZERlc2NyaWJlZEJ5KGksby5hdHRyKCJpZCIpKSxvLmZpbmQoIi51aS10b29sdGlwLWNvbnRlbnQiKS5odG1sKHMpLHRoaXMubGl2ZVJlZ2lvbi5jaGlsZHJlbigpLmhpZGUoKSxzLmNsb25lPyhoPXMuY2xvbmUoKSxoLnJlbW92ZUF0dHIoImlkIikuZmluZCgiW2lkXSIpLnJlbW92ZUF0dHIoImlkIikpOmg9cyxlKCI8ZGl2PiIpLmh0bWwoaCkuYXBwZW5kVG8odGhpcy5saXZlUmVnaW9uKSx0aGlzLm9wdGlvbnMudHJhY2smJnQmJi9ebW91c2UvLnRlc3QodC50eXBlKT8odGhpcy5fb24odGhpcy5kb2N1bWVudCx7bW91c2Vtb3ZlOm59KSxuKHQpKTpvLnBvc2l0aW9uKGUuZXh0ZW5kKHtvZjppfSx0aGlzLm9wdGlvbnMucG9zaXRpb24pKSxvLmhpZGUoKSx0aGlzLl9zaG93KG8sdGhpcy5vcHRpb25zLnNob3cpLHRoaXMub3B0aW9ucy5zaG93JiZ0aGlzLm9wdGlvbnMuc2hvdy5kZWxheSYmKHI9dGhpcy5kZWxheWVkU2hvdz1zZXRJbnRlcnZhbChmdW5jdGlvbigpe28uaXMoIjp2aXNpYmxlIikmJihuKGwub2YpLGNsZWFySW50ZXJ2YWwocikpfSxlLmZ4LmludGVydmFsKSksdGhpcy5fdHJpZ2dlcigib3BlbiIsdCx7dG9vbHRpcDpvfSl9fSxfcmVnaXN0ZXJDbG9zZUhhbmRsZXJzOmZ1bmN0aW9uKHQsaSl7dmFyIHM9e2tleXVwOmZ1bmN0aW9uKHQpe2lmKHQua2V5Q29kZT09PWUudWkua2V5Q29kZS5FU0NBUEUpe3ZhciBzPWUuRXZlbnQodCk7cy5jdXJyZW50VGFyZ2V0PWlbMF0sdGhpcy5jbG9zZShzLCEwKX19fTtpWzBdIT09dGhpcy5lbGVtZW50WzBdJiYocy5yZW1vdmU9ZnVuY3Rpb24oKXt0aGlzLl9yZW1vdmVUb29sdGlwKHRoaXMuX2ZpbmQoaSkudG9vbHRpcCl9KSx0JiYibW91c2VvdmVyIiE9PXQudHlwZXx8KHMubW91c2VsZWF2ZT0iY2xvc2UiKSx0JiYiZm9jdXNpbiIhPT10LnR5cGV8fChzLmZvY3Vzb3V0PSJjbG9zZSIpLHRoaXMuX29uKCEwLGkscyl9LGNsb3NlOmZ1bmN0aW9uKHQpe3ZhciBpLHM9dGhpcyxuPWUodD90LmN1cnJlbnRUYXJnZXQ6dGhpcy5lbGVtZW50KSxhPXRoaXMuX2ZpbmQobik7cmV0dXJuIGE/KGk9YS50b29sdGlwLGEuY2xvc2luZ3x8KGNsZWFySW50ZXJ2YWwodGhpcy5kZWxheWVkU2hvdyksbi5kYXRhKCJ1aS10b29sdGlwLXRpdGxlIikmJiFuLmF0dHIoInRpdGxlIikmJm4uYXR0cigidGl0bGUiLG4uZGF0YSgidWktdG9vbHRpcC10aXRsZSIpKSx0aGlzLl9yZW1vdmVEZXNjcmliZWRCeShuKSxhLmhpZGluZz0hMCxpLnN0b3AoITApLHRoaXMuX2hpZGUoaSx0aGlzLm9wdGlvbnMuaGlkZSxmdW5jdGlvbigpe3MuX3JlbW92ZVRvb2x0aXAoZSh0aGlzKSl9KSxuLnJlbW92ZURhdGEoInVpLXRvb2x0aXAtb3BlbiIpLHRoaXMuX29mZihuLCJtb3VzZWxlYXZlIGZvY3Vzb3V0IGtleXVwIiksblswXSE9PXRoaXMuZWxlbWVudFswXSYmdGhpcy5fb2ZmKG4sInJlbW92ZSIpLHRoaXMuX29mZih0aGlzLmRvY3VtZW50LCJtb3VzZW1vdmUiKSx0JiYibW91c2VsZWF2ZSI9PT10LnR5cGUmJmUuZWFjaCh0aGlzLnBhcmVudHMsZnVuY3Rpb24odCxpKXtlKGkuZWxlbWVudCkuYXR0cigidGl0bGUiLGkudGl0bGUpLGRlbGV0ZSBzLnBhcmVudHNbdF19KSxhLmNsb3Npbmc9ITAsdGhpcy5fdHJpZ2dlcigiY2xvc2UiLHQse3Rvb2x0aXA6aX0pLGEuaGlkaW5nfHwoYS5jbG9zaW5nPSExKSksdm9pZCAwKToobi5yZW1vdmVEYXRhKCJ1aS10b29sdGlwLW9wZW4iKSx2b2lkIDApfSxfdG9vbHRpcDpmdW5jdGlvbih0KXt2YXIgaT1lKCI8ZGl2PiIpLmF0dHIoInJvbGUiLCJ0b29sdGlwIikuYWRkQ2xhc3MoInVpLXRvb2x0aXAgdWktd2lkZ2V0IHVpLWNvcm5lci1hbGwgdWktd2lkZ2V0LWNvbnRlbnQgIisodGhpcy5vcHRpb25zLnRvb2x0aXBDbGFzc3x8IiIpKSxzPWkudW5pcXVlSWQoKS5hdHRyKCJpZCIpO3JldHVybiBlKCI8ZGl2PiIpLmFkZENsYXNzKCJ1aS10b29sdGlwLWNvbnRlbnQiKS5hcHBlbmRUbyhpKSxpLmFwcGVuZFRvKHRoaXMuZG9jdW1lbnRbMF0uYm9keSksdGhpcy50b29sdGlwc1tzXT17ZWxlbWVudDp0LHRvb2x0aXA6aX19LF9maW5kOmZ1bmN0aW9uKGUpe3ZhciB0PWUuZGF0YSgidWktdG9vbHRpcC1pZCIpO3JldHVybiB0P3RoaXMudG9vbHRpcHNbdF06bnVsbH0sX3JlbW92ZVRvb2x0aXA6ZnVuY3Rpb24oZSl7ZS5yZW1vdmUoKSxkZWxldGUgdGhpcy50b29sdGlwc1tlLmF0dHIoImlkIildfSxfZGVzdHJveTpmdW5jdGlvbigpe3ZhciB0PXRoaXM7ZS5lYWNoKHRoaXMudG9vbHRpcHMsZnVuY3Rpb24oaSxzKXt2YXIgbj1lLkV2ZW50KCJibHVyIiksYT1zLmVsZW1lbnQ7bi50YXJnZXQ9bi5jdXJyZW50VGFyZ2V0PWFbMF0sdC5jbG9zZShuLCEwKSxlKCIjIitpKS5yZW1vdmUoKSxhLmRhdGEoInVpLXRvb2x0aXAtdGl0bGUiKSYmKGEuYXR0cigidGl0bGUiKXx8YS5hdHRyKCJ0aXRsZSIsYS5kYXRhKCJ1aS10b29sdGlwLXRpdGxlIikpLGEucmVtb3ZlRGF0YSgidWktdG9vbHRpcC10aXRsZSIpKX0pLHRoaXMubGl2ZVJlZ2lvbi5yZW1vdmUoKX19KX0pOw==]]></data>
	</file>
	<file>
	  <filename>/method.install.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCmlmKCB2ZXJzaW9uX2NvbXBhcmUocGhwdmVyc2lvbigpLCc1LjQuMTEnKSA8IDAgKSB7CiAgICByZXR1cm4gIk1pbmltdW0gUEhQIHZlcnNpb24gb2YgNS40LjExIHJlcXVpcmVkIjsKfQoKJHRoaXMtPlJlZ2lzdGVyTGlicmFyaWVzKCk7Cgo/Pg==]]></data>
	</file>
	<file>
	  <filename>/method.uninstall.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKClxDR0V4dGVuc2lvbnNcanNsb2FkZXJcanNsb2FkZXI6OnVucmVnaXN0ZXJfYnlfbW9kdWxlKCR0aGlzLT5HZXROYW1lKCkpOwoKPz4=]]></data>
	</file>
	<file>
	  <filename>/method.upgrade.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCmlmKCB2ZXJzaW9uX2NvbXBhcmUocGhwdmVyc2lvbigpLCc1LjQuMTEnKSA8IDAgKSB7CiAgICByZXR1cm4gIk1pbmltdW0gUEhQIHZlcnNpb24gb2YgNS40LjExIHJlcXVpcmVkIjsKfQoKJHRoaXMtPlJlZ2lzdGVyTGlicmFyaWVzKHRydWUpOwoKPz4K]]></data>
	</file>
	<file>
	  <filename>/skeleton.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKI0JFR0lOX0xJQ0VOU0UKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IEpRdWVyeVRvb2xzIChjKSAyMDA4IGJ5IFJvYmVydCBDYW1wYmVsbCAKIyAgICAgICAgIChjYWxndXkxMDAwQGNtc21hZGVzaW1wbGUub3JnKQojICBBIHRvb2xib3ggb2YgY29udmVuaWVuY2VzIHRvIHByb3ZpZGUgZHluYW1pYyBqYXZhc2NyaXB0eSBmdW5jdGlvbmFsaXR5CiMgIGZvciBDTVMgbW9kdWxlcyBhbmQgd2Vic2l0ZSBkZXNpZ25lcnMuCiMgCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykKIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZwojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMKIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgSG93ZXZlciwgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR1BMLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkCiMgYXMgYW4gYWRkb24gbW9kdWxlIHRvIENNUyBNYWRlIFNpbXBsZS4gIFlvdSBtYXkgbm90IHVzZSB0aGlzIHNvZnR3YXJlCiMgaW4gYW55IE5vbiBHUEwgdmVyc2lvbiBvZiBDTVMgTWFkZSBzaW1wbGUsIG9yIGluIGFueSB2ZXJzaW9uIG9mIENNUwojIE1hZGUgc2ltcGxlIHRoYXQgZG9lcyBub3QgaW5kaWNhdGUgY2xlYXJseSBhbmQgb2J2aW91c2x5IGluIGl0cyBhZG1pbiAKIyBzZWN0aW9uIHRoYXQgdGhlIHNpdGUgd2FzIGJ1aWx0IHdpdGggQ01TIE1hZGUgc2ltcGxlLgojCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKIyBPciByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KI0VORF9MSUNFTlNFCgojCiMgRU9GCiMKPz4=]]></data>
	</file>
	<file>
	  <filename>/templates/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/templates/datepicker_plugin.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gYW4gZXh0ZW5zaW9uIG9uIHRoZSBqcXVlcnkgdWkgZGF0ZXBpY2tlciwgZm9yIGxvY2FsaXphdGlvbiBwdXJwb3NlcwooZnVuY3Rpb24oJCkgewogICAgJC5kYXRlcGlja2VyLnNldERlZmF1bHRzKHsKCWN1cnJlbnRUZXh0OiAneyRtb2QtPkxhbmcoJ2RwX3RvZGF5Jyl9JywKCWNsb3NlVGV4dDogJ3skbW9kLT5MYW5nKCdkcF9jbG9zZScpfScsCglidXR0b25UZXh0OiAneyRtb2QtPkxhbmcoJ2RiX2Nob29zZScpfScsCgluZXh0VGV4dDogJ3skbW9kLT5MYW5nKCdkYl9uZXh0Jyl9JywKCXByZXZUZXh0OiAneyRtb2QtPkxhbmcoJ2RiX3ByZXYnKX0nLAoJZGF0ZUZvcm1hdDogJ3skZGF0ZWZvcm1hdH0nLAoJZGF5TmFtZXM6IHtqc29uX2VuY29kZSgkbG9jYWxlSW5mby5kYXlOYW1lcyl9LAoJZGF5TmFtZXNTaG9ydDoge2pzb25fZW5jb2RlKCRsb2NhbGVJbmZvLmRheU5hbWVzU2hvcnQpfSwKCW1vbnRoTmFtZXM6IHtqc29uX2VuY29kZSgkbG9jYWxlSW5mby5tb250aE5hbWVzKX0sCgltb250aE5hbWVzU2hvcnQ6IHtqc29uX2VuY29kZSgkbG9jYWxlSW5mby5tb250aE5hbWVzU2hvcnQpfSwKCW51bWJlck9mTW9udGhzOiAzLAoJc2hvd0N1cnJlbnRBdFBvczogMSwKCXNob3dCdXR0b25QYW5lbDogdHJ1ZSwKCWNoYW5nZVllYXI6IHRydWUsCgl5ZWFyUmFuZ2U6ICdjLTEwOmMrMTAnCiAgICB9KTsKfSkgKGpRdWVyeSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/templates/incjs.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCEtLSB7JEpRdWVyeVRvb2xzLT5HZXROYW1lKCl9IHZlcnNpb24geyRKUXVlcnlUb29scy0+R2V0VmVyc2lvbigpfSAtLT4Ke2lmIGlzc2V0KCRsaWJzKX0Ke2ZvcmVhY2ggZnJvbT0kbGlicyBpdGVtPSdvbmUnfQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ7JG9uZX0iPjwvc2NyaXB0Pgp7L2ZvcmVhY2h9CnsvaWZ9CntpZiBpc3NldCgkY3NzKX0Ke2ZvcmVhY2ggZnJvbT0kY3NzIGl0ZW09J29uZSd9CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Inskb25lfSIgbWVkaWE9InNjcmVlbiIgLz4Key9mb3JlYWNofQp7L2lmfQ==]]></data>
	</file>
	<file>
	  <filename>/templates/ready.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[eyogaGVyZSB3ZSBzZXQgZGVmYXVsdCB2YWx1ZXMgYW5kIGF0dHJpYnV0ZXMgZm9yIHRoZSBsaWJzIHRoYXQgYXJlIGxvYWRlZC4gKn0Ke2NhcHR1cmUgYXNzaWduPSdvdXQnfXtzdHJpcH0Ke2lmIGlzc2V0KCRqcXVlcnlfbGlicy50YWJsZXNvcnRlcil9CmlmKCAkLnRhYmxlc29ydGVyICkgeyAkKCIuY21zX3NvcnRhYmxlIikudGFibGVzb3J0ZXIoeyB3aWR0aEZpeGVkOiB0cnVlLCB3aWRnZXRzOiBbJ3plYnJhJ10sIHNvcnRMaXN0OiBbWzAsMF1dIH0pIH0Key9pZn0KaWYoICQudWkgKSB7ICAkKCdkaXYuYWNjb3JkaW9uJykuYWNjb3JkaW9uKCk7IH0Ke2lmIGlzc2V0KCRqcXVlcnlfbGlicy5saWdodGJveCl9aWYoICQubGlnaHRib3ggKSB7ICQoJ2EubGlnaHRib3gnKS5saWdodEJveCgpOyB9ey9pZn0Ke2lmIGlzc2V0KCRqcXVlcnlfbGlicy5mYW5jeWJveCl9aWYoICQuZmFuY3lib3ggKSB7ICQoJ2EuZmFuY3lib3gnKS5mYW5jeWJveCgpOyB9ey9pZn0Ke2lmIGlzc2V0KCRqcXVlcnlfbGlicy5jbHVldGlwKX1pZiggJC5jbHVldGlwICkgeyAkKCJhLnRvb2x0aXAiKS5jbHVldGlwKHsgbG9jYWw6dHJ1ZSwgY3Vyc29yOiAncG9pbnRlcicgfSk7IH0gey9pZn0Key9zdHJpcH17L2NhcHR1cmV9CntpZiBzdHJsZW4oJG91dCl9CjwhLS0geyRKUXVlcnlUb29scy0+R2V0TmFtZSgpfSB2ZXJzaW9uIHskSlF1ZXJ5VG9vbHMtPkdldFZlcnNpb24oKX0gLS0+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBW3tqc21pbn0KJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oJCkgeyB7JG91dH0gfSk7ICAvL2VuZAp7L2pzbWlufS8vXV0+PC9zY3JpcHQ+CnsvaWZ9Cg==]]></data>
	</file>
</module>
