<?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>ECB2</name>
	<version>1.5.1</version>
    <mincmsversion>2.0</mincmsversion>
	<help><![CDATA[CjxoMz5XaGF0IERvZXMgVGhpcyBEbz88L2gzPgo8cD5Nb2R1bGUgYWRkcyBhZGl0aW9uYWwgY29udGVudCBibG9ja3MgZm9yIENNUyBNYWRlIFNpbXBsZSB2MisuIFRoaXMgaXMgYSBmb3JrIG9mIHRoZSBvcmlnaW5hbCBFQ0IgbW9kdWxlIHRoYXQgd29ya2VkIHdpdGggQ01TTVMgdjEuPC9wPgo8cD5Qcm92aWRlcyB0aGUgZm9sbG93aW5nIGZpZWxkIHR5cGVzOjxicj4KPG9sPgogICA8bGk+ZmlsZV9zZWxlY3RvcjwvbGk+CiAgIDxsaT5jb2xvcl9waWNrZXI8L2xpPgogICA8bGk+ZHJvcGRvd25fZnJvbV91ZHQ8L2xpPgogICA8bGk+ZHJvcGRvd248L2xpPgogICA8bGk+Y2hlY2tib3g8L2xpPgogICA8bGk+bW9kdWxlX2xpbms8L2xpPgogICA8bGk+bGluazwvbGk+CiAgIDxsaT50aW1lcGlja2VyPC9saT4KICAgPGxpPmRhdGVwaWNrZXI8L2xpPgogICA8bGk+aW5wdXQ8L2xpPgogICA8bGk+dGV4dGFyZWE8L2xpPgogICA8bGk+ZWRpdG9yICh0ZXh0YXJlYSB3aXRoIHd5c2l3eWcpPC9saT4KICAgPGxpPnRleHQgPC9saT4KICAgPGxpPnBhZ2VzIDwvbGk+CiAgIDxsaT5ociAoaG9yaXpvbnRhbCBsaW5lKTwvbGk+CiAgIDxsaT5zb3J0YWJsZWxpc3Q8L2xpPgogICA8bGk+cmFkaW88L2xpPgogICA8bGk+aGlkZGVuPC9saT4KICAgPGxpPmZpZWxkc2V0X3N0YXJ0PC9saT4KICAgPGxpPmZpZWxkc2V0X2VuZDwvbGk+CiAgIDxsaT5nYWxsZXJ5X3BpY2tlciA8c3BhbiBzdHlsZT0iY29sb3I6cmVkOyI+bmV3PC9zcGFuPjwvbGk+CiAgIDxsaT5kcm9wZG93bl9mcm9tX2N1c3RvbWdzIDxzcGFuIHN0eWxlPSJjb2xvcjpyZWQ7Ij5uZXc8L3NwYW4+PC9saT4KICAgPGxpPmlucHV0X3JlcGVhdGVyIDxzcGFuIHN0eWxlPSJjb2xvcjpyZWQ7Ij5uZXc8L3NwYW4+PC9saT4KPC9vbD4KPC9wPjxicj4KCjxwPklmIHlvdSBsaWtlIHRoaXMgbW9kdWxlIHBsZWFzZSA8YSBocmVmPSJodHRwOi8vd3d3LmNtc21hZGVzaW1wbGUub3JnL2Fib3V0LWxpbmsvZG9uYXRpb25zLyIgdGFyZ2V0PSJfYmxhbmsiIHN0eWxlPSJmb250LXdlaWdodDpib2xkOyI+ZG9uYXRlIHRvIENNU01TPC9hPjwvcD48YnI+Cgo8aDM+RmllbGRzPC9oMz4KCjxwPjxzdHJvbmc+ZmlsZV9zZWxlY3Rvcjwvc3Ryb25nPjwvcD4KPHA+RXhhbXBsZTogIHtjb250ZW50X21vZHVsZSBtb2R1bGU9IkVDQjIiIGZpZWxkPSJmaWxlX3NlbGVjdG9yIiBibG9jaz0idGVzdDEwIiBkaXI9ImltYWdlcyIgZmlsZXR5cGVzPSJqcGcsZ2lmLHBuZyIgZXhjbHVkZXByZWZpeD0idGh1bWJfIn0gICAgICAgIDwvcD4KPHA+UGFyYW1ldGVyczoKZmlsZXR5cGVzIC0gY29tbWEgc2VwYXJhdGVkPGJyPgpkaXIgKG9wdGlvbmFsKSAtIGRlZmF1bHQgdXBsb2Fkcy88YnI+CmV4Y2x1ZGVwcmVmaXggKG9wdGlvbmFsKTxicj4KcmVjdXJzZSAob3B0aW9uYWwpPGJyPgpzb3J0ZmlsZXMgKG9wdGlvbmFsKTxicj4KcHJldmlldyAob3B0aW9uYWwpIC0gb25seSBmb3IgaW1hZ2VzPGJyPgpkZXNjcmlwdGlvbiAob3B0aW9uYWwpIC0gYWRkcyBhZGRpdGlvbmFsIHRleHQgZXhwbGFuYXRpb24gZm9yIGVkaXRvcgo8L3A+PGJyPgoKPHA+PHN0cm9uZz5jb2xvcl9waWNrZXI8L3N0cm9uZz48L3A+CjxwPkV4YW1wbGU6ICB7Y29udGVudF9tb2R1bGUgbW9kdWxlPSJFQ0IyIiBmaWVsZD0iY29sb3JfcGlja2VyIiBibG9jaz0idGVzdDEiIGxhYmVsPSJDb2xvciIgZGVmYXVsdF92YWx1ZT0iIzAwMDAwMCJ9PC9wPgo8cD5QYXJhbWV0ZXJzOgpkZWZhdWx0X3ZhbHVlIChvcHRpb25hbCk8YnI+CnNpemUgKG9wdGlvbmFsKSAtIGRlZmF1bHQgMTA8YnI+CmRlc2NyaXB0aW9uIChvcHRpb25hbCkgLSBhZGRzIGFkZGl0aW9uYWwgdGV4dCBleHBsYW5hdGlvbiBmb3IgZWRpdG9yCjwvcD48YnI+Cgo8cD48c3Ryb25nPmRyb3Bkb3duX2Zyb21fdWR0PC9zdHJvbmc+PC9wPgo8cD5FeGFtcGxlOiB7Y29udGVudF9tb2R1bGUgbW9kdWxlPSJFQ0IyIiBmaWVsZD0iZHJvcGRvd25fZnJvbV91ZHQiIGJsb2NrPSJ0ZXN0MiIgbGFiZWw9IkdhbGxlcnkiIHVkdD0ibXljdXN0b211ZHQiICBmaXJzdF92YWx1ZT0iPXNlbGVjdD0ifTwvcD4KPHA+T3VwdXQgZnJvbSBVRFQgbXVzdCBiZSBhcnJheSgpIC0gZXhhbXBsZTogcmV0dXJuIGFycmF5KCJsYWJlbCI9PiJ2YWx1ZSIsICJsYWJlbCAyICI9PiJ2YWx1ZSAyIik8L3A+CjxwPlBhcmFtZXRlcnM6CnVkdCAocmVxdWlyZWQpIC0gdWR0IG5hbWU8YnI+CmZpcnN0X3ZhbHVlIChvcHRpb25hbCkgPGJyPgptdWx0aXBsZSAob3B0aW9uYWwpIC0gYWRkIG11bHRpcGxlIG9wdGlvbiBzZWxlY3Qgc3VwcG9ydDxicj4Kc2l6ZSAob3B0aW9uYWwpIC0gbXVsdGlwbGUgZW5hYmxlZCBvbmx5PGJyPgpkZXNjcmlwdGlvbiAob3B0aW9uYWwpIC0gYWRkcyBhZGRpdGlvbmFsIHRleHQgZXhwbGFuYXRpb24gZm9yIGVkaXRvcgo8L3A+CjxwPjxzdHJvbmc+RXhhbXBsZXMgVURUPC9zdHJvbmc+Ogo8YnI+CjxhIGhyZWY9Imh0dHBzOi8vZ2lzdC5naXRodWIuY29tL2t1em1hbnkvNjc3OWMxOTNiODEwNGFhNmFiZmUiPkdhbGxlcnkgbGlzdCBmcm9tIEdhbGxlcnkgbW9kdWxlPC9hPiA8YnI+CjxhIGhyZWY9Imh0dHBzOi8vZ2lzdC5naXRodWIuY29tL2t1em1hbnkvNDY0Mjc2ZTE2ZjNiNzRjMDc1NTUiPkdyb3VwIGxpc3QgZnJvbSBGRVU8L2E+IDxicj4KPGEgaHJlZj0iaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20va3V6bWFueS81MTU4M2M2NDM5Y2IwNDE2NzlhNiI+VXNlcnMgbGlzdCBmcm9tIEZFVTwvYT4KPC9wPjxicj4KCjxwPjxzdHJvbmc+ZHJvcGRvd248L3N0cm9uZz48L3A+CjxwPkV4YW1wbGU6IHtjb250ZW50X21vZHVsZSBtb2R1bGU9IkVDQjIiIGZpZWxkPSJkcm9wZG93biIgYmxvY2s9InRlc3Q1IiBsYWJlbD0iRnJ1aXQiICB2YWx1ZXM9IkFwcGxlPWFwcGxlLE9yYW5nZT1vcmFuZ2UiIGZpcnN0X3ZhbHVlPSJzZWxlY3QgZnJ1aXQifTwvcD4KPHA+UGFyYW1ldGVyczoKdmFsdWVzIChyZXF1aXJlZCkgLSBjb21tYSBzZXBhcmF0ZWQuIEV4YW1wbGU6IEFwcGxlPWFwcGxlLE9yYW5nZT1vcmFuZ2UsR3JlZW49Z3JlZW4gPGJyPgpmaXJzdF92YWx1ZSAob3B0aW9uYWwpPGJyPgptdWx0aXBsZSAob3B0aW9uYWwpIC0gYWRkIG11bHRpcGxlIG9wdGlvbiBzZWxlY3Qgc3VwcG9ydDxicj4Kc2l6ZSAob3B0aW9uYWwpIC0gbXVsdGlwbGUgZW5hYmxlZCBvbmx5PGJyPgpkZXNjcmlwdGlvbiAob3B0aW9uYWwpIC0gYWRkcyBhZGRpdGlvbmFsIHRleHQgZXhwbGFuYXRpb24gZm9yIGVkaXRvcgo8L3A+PGJyPgoKPHA+PHN0cm9uZz5jaGVja2JveDwvc3Ryb25nPjwvcD4KPHA+RXhhbXBsZToge2NvbnRlbnRfbW9kdWxlIG1vZHVsZT0iRUNCMiIgZmllbGQ9ImNoZWNrYm94IiBibG9jaz0idGVzdDExIiBsYWJlbD0iQ2hlY2tib3giIGRlZmF1bHRfdmFsdWU9IjEifTwvcD4KPHA+UGFyYW1ldGVyczoKZGVmYXVsdF92YWx1ZSAob3B0aW9uYWwpPGJyPgpkZXNjcmlwdGlvbiAob3B0aW9uYWwpIC0gYWRkcyBhZGRpdGlvbmFsIHRleHQgZXhwbGFuYXRpb24gZm9yIGVkaXRvcgo8L3A+PGJyPgoKPHA+PHN0cm9uZz5tb2R1bGVfbGluazwvc3Ryb25nPjwvcD4KPHA+RXhhbXBsZToge2NvbnRlbnRfbW9kdWxlIG1vZHVsZT0iRUNCMiIgZmllbGQ9Im1vZHVsZV9saW5rIiBsYWJlbD0iTW9kdWxlIGVkaXQiIGJsb2NrPSJ0ZXN0MyIgbW9kPSJDYXRhbG9nZXIiIHRleHQ9IkVkaXQgY2F0YWxvZyIgfTwvcD4KPHA+UGFyYW1ldGVyczoKbW9kIChyZXF1aXJlZCkgPGJyPgp0ZXh0IChyZXF1aXJlZCkgPGJyPgp0YXJnZXQgKG9wdGlvbmFsKSAtIGRlZmF1bHQgX3NlbGY8YnI+CmRlc2NyaXB0aW9uIChvcHRpb25hbCkgLSBhZGRzIGFkZGl0aW9uYWwgdGV4dCBleHBsYW5hdGlvbiBmb3IgZWRpdG9yCjwvcD48YnI+Cgo8cD48c3Ryb25nPmxpbms8L3N0cm9uZz48L3A+CjxwPkV4YW1wbGU6IHtjb250ZW50X21vZHVsZSBtb2R1bGU9IkVDQjIiIGZpZWxkPSJsaW5rIiBsYWJlbD0iU2VhcmNoIiBibG9jaz0idGVzdDQiIHRhcmdldD0iX2JsYW5rIiBsaW5rPSJodHRwOi8vd3d3LmJpbmcuY29tIiB0ZXh0PSJiaW5nIHNlYXJjaCJ9PC9wPgo8cD5QYXJhbWV0ZXJzOgpsaW5rIChyZXF1aXJlZCkgPGJyPgp0ZXh0IChyZXF1aXJlZCkgPGJyPgp0YXJnZXQgKG9wdGlvbmFsKSAtIGRlZmF1bHQgX3NlbGY8YnI+CmRlc2NyaXB0aW9uIChvcHRpb25hbCkgLSBhZGRzIGFkZGl0aW9uYWwgdGV4dCBleHBsYW5hdGlvbiBmb3IgZWRpdG9yCjwvcD48YnI+Cgo8cD48c3Ryb25nPnRpbWVwaWNrZXI8L3N0cm9uZz48L3A+CjxwPkV4YW1wbGU6IHtjb250ZW50X21vZHVsZSBtb2R1bGU9IkVDQjIiIGZpZWxkPSJ0aW1lcGlja2VyIiBsYWJlbD0iVGltZSIgYmxvY2s9InRlc3Q0NSJ9PC9wPgo8cD5QYXJhbWV0ZXJzOgpzaXplIChvcHRpb25hbCkgZGVmYXVsdCAxMDA8YnI+CnRpbWVfZm9ybWF0IChvcHRpb25hbCkgZGVmYXVsdCBISDo6c3M8YnI+Cm1heF9sZW5ndGggKG9wdGlvbmFsKSBkZWZhdWx0IDEwPGJyPgpkZXNjcmlwdGlvbiAob3B0aW9uYWwpIC0gYWRkcyBhZGRpdGlvbmFsIHRleHQgZXhwbGFuYXRpb24gZm9yIGVkaXRvcgo8L3A+PGJyPgoKPHA+PHN0cm9uZz5kYXRlcGlja2VyPC9zdHJvbmc+PC9wPgo8cD5FeGFtcGxlOiB7Y29udGVudF9tb2R1bGUgbW9kdWxlPSJFQ0IyIiBmaWVsZD0iZGF0ZXBpY2tlciIgbGFiZWw9IkRhdGUiIGJsb2NrPSJ0ZXN0NDQifTwvcD4KPHA+UGFyYW1ldGVyczoKc2l6ZSAob3B0aW9uYWwpIGRlZmF1bHQgMTAwPGJyPgpkYXRlX2Zvcm1hdCAob3B0aW9uYWwpIGRlZmF1bHQgeXktbW0tZGQ8YnI+CnRpbWUgKG9wdGlvbmFsKSAtIGFkZCB0aW1lIHBpY2tlciBkZWZhdWx0IDA8YnI+CnRpbWVfZm9ybWF0IChvcHRpb25hbCkgZGVmYXVsdCBISDo6c3M8YnI+Cm1heF9sZW5ndGggKG9wdGlvbmFsKSBkZWZhdWx0IDEwIDxicj4KZGVzY3JpcHRpb24gKG9wdGlvbmFsKSAtIGFkZHMgYWRkaXRpb25hbCB0ZXh0IGV4cGxhbmF0aW9uIGZvciBlZGl0b3IKPC9wPjxicj4KCjxwPjxzdHJvbmc+aW5wdXQ8L3N0cm9uZz48L3A+CjxwPkV4YW1wbGU6IHtjb250ZW50X21vZHVsZSBtb2R1bGU9IkVDQjIiIGZpZWxkPSJpbnB1dCIgbGFiZWw9IlRleHQiIGJsb2NrPSJ0ZXN0NSIgc2l6ZT01NSBtYXhfbGVuZ3RoPTU1IGRlZmF1bHRfdmFsdWU9ImZpbGwgaXQifTwvcD4KPHA+UGFyYW1ldGVyczoKc2l6ZSAob3B0aW9uYWwpIGRlZmF1bHQgMzA8YnI+Cm1heF9sZW5ndGggKG9wdGlvbmFsKSBkZWZhdWx0IDI1NSA8YnI+CmRlZmF1bHRfdmFsdWUgKG9wdGlvbmFsKSAtIGRlZmF1bHQgdmFsdWUgZm9yIGlucHV0PGJyPgpkZXNjcmlwdGlvbiAob3B0aW9uYWwpIC0gYWRkcyBhZGRpdGlvbmFsIHRleHQgZXhwbGFuYXRpb24gZm9yIGVkaXRvcgo8L3A+PGJyPgoKPHA+PHN0cm9uZz50ZXh0YXJlYTwvc3Ryb25nPjwvcD4KPHA+RXhhbXBsZToge2NvbnRlbnRfbW9kdWxlIG1vZHVsZT0iRUNCMiIgZmllbGQ9InRleHRhcmVhIiBsYWJlbD0iVGV4dGFyZWEiIGJsb2NrPSJ0ZXN0NiIgcm93cz0xMCBjb2xzPTQwIGRlZmF1bHRfdmFsdWU9ImZpbGwgaXQifTwvcD4KPHA+UGFyYW1ldGVyczoKcm93cyAob3B0aW9uYWwpIGRlZmF1bHQgMjA8YnI+CmNvbHMgKG9wdGlvbmFsKSBkZWZhdWx0IDgwIDxicj4KZGVmYXVsdF92YWx1ZSAob3B0aW9uYWwpIC0gZGVmYXVsdCB2YWx1ZSBmb3IgdGV4dGFyZWE8YnI+CmRlc2NyaXB0aW9uIChvcHRpb25hbCkgLSBhZGRzIGFkZGl0aW9uYWwgdGV4dCBleHBsYW5hdGlvbiBmb3IgZWRpdG9yCjwvcD48YnI+Cgo8cD48c3Ryb25nPmVkaXRvciAodGV4dGFyZWEgd2l0aCB3eXNpd3lnKTwvc3Ryb25nPjwvcD4KPHA+RXhhbXBsZToge2NvbnRlbnRfbW9kdWxlIG1vZHVsZT0iRUNCMiIgZmllbGQ9ImVkaXRvciIgbGFiZWw9IlRleHRhcmVhIiBibG9jaz0idGVzdDciIHJvd3M9MTAgY29scz00MCBkZWZhdWx0X3ZhbHVlPSJmaWxsIGl0In08L3A+CjxwPlBhcmFtZXRlcnM6CnJvd3MgKG9wdGlvbmFsKSBkZWZhdWx0IDIwPGJyPgpjb2xzIChvcHRpb25hbCkgZGVmYXVsdCA4MCA8YnI+CmRlZmF1bHRfdmFsdWUgKG9wdGlvbmFsKSAtIGRlZmF1bHQgdmFsdWUgZm9yIHRleHRhcmVhPGJyPgpkZXNjcmlwdGlvbiAob3B0aW9uYWwpIC0gYWRkcyBhZGRpdGlvbmFsIHRleHQgZXhwbGFuYXRpb24gZm9yIGVkaXRvcgo8L3A+PGJyPgoKPHA+PHN0cm9uZz50ZXh0IDwvc3Ryb25nPjwvcD4KPHA+RXhhbXBsZToge2NvbnRlbnRfbW9kdWxlIG1vZHVsZT0iRUNCMiIgZmllbGQ9InRleHQiIGxhYmVsPSJUZXh0IiBibG9jaz0idGVzdDgiIHRleHQ9IkhlbGxvIHdvcmQhIn08L3A+CjxwPlBhcmFtZXRlcnM6CnRleHQgKHJlcXVpcmVkKSB0ZXh0IGluIGFkbWluIChhZGQgaW5mb3JtYXRpb24gZm9yIHVzZXJzKTxicj4KZGVzY3JpcHRpb24gKG9wdGlvbmFsKSAtIGFkZHMgYWRkaXRpb25hbCB0ZXh0IGV4cGxhbmF0aW9uIGZvciBlZGl0b3IKPC9wPjxicj4KCjxwPjxzdHJvbmc+cGFnZXMgPC9zdHJvbmc+PC9wPgo8cD5FeGFtcGxlOiB7Y29udGVudF9tb2R1bGUgbW9kdWxlPSJFQ0IyIiBmaWVsZD0icGFnZXMiIGxhYmVsPSJQYWdlIiBibG9jaz0idGVzdDEwIn08L3A+CjxwPlBhcmFtZXRlcnM6CmRlc2NyaXB0aW9uIChvcHRpb25hbCkgLSBhZGRzIGFkZGl0aW9uYWwgdGV4dCBleHBsYW5hdGlvbiBmb3IgZWRpdG9yCjwvcD48YnI+Cgo8cD48c3Ryb25nPmhyIChob3Jpem9udGFsIGxpbmUpPC9zdHJvbmc+PC9wPgo8cD5FeGFtcGxlOiB7Y29udGVudF9tb2R1bGUgbW9kdWxlPSJFQ0IyIiBmaWVsZD0iaHIiIGxhYmVsPSJPdGhlciBibG9ja3MiIGJsb2NrPSJibG9ja25hbWUifTxwPgpQYXJhbWV0ZXJzOgpkZXNjcmlwdGlvbiAob3B0aW9uYWwpIC0gYWRkcyBhZGRpdGlvbmFsIHRleHQgZXhwbGFuYXRpb24gZm9yIGVkaXRvcgo8L3A+PGJyPgoKPHA+PHN0cm9uZz5zb3J0YWJsZWxpc3Q8L3N0cm9uZz48L3A+CjxwPkV4YW1wbGU6IHtjb250ZW50X21vZHVsZSBtb2R1bGU9IkVDQjIiIGZpZWxkPSJzb3J0YWJsZWxpc3QiIGJsb2NrPSJ0ZXN0c29ydGFibGVsaXN0IiBsYWJlbD0iQ2hvb3NlIGZydWl0IiB1ZHQ9Im15ZHV0In08L3A+CjxwPlBhcmFtZXRlcnM6CnZhbHVlcyAob3B0aW9uYWwpIC0gY29tbWEgc2VwYXJhdGVkLiBFeGFtcGxlOiBcJ0FwcGxlPWFwcGxlLE9yYW5nZT1vcmFuZ2UsR3JlZW49Z3JlZW4sdmFsdWU9TGFiZWxcJyA8YnI+CnVkdCAob3B0aW9uYWwpIC0gbmFtZSBvZiB1ZHQgdGhhdCByZXR1cm5zIGFuIGFycmF5IGluIHRoZSBmb3JtYXQgXCd2YWx1ZVwnID0+IFwnTGFiZWxcJyw8YnI+CmZpcnN0X3ZhbHVlIChvcHRpb25hbCk8YnI+CmxhYmVsX2xlZnQgKG9wdGlvbmFsKTxicj4KbGFiZWxfcmlnaHQgKG9wdGlvbmFsKTxicj4KbWF4X251bWJlciAob3B0aW9uYWwpIC0gbGltaXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBpdGVtcyB0aGF0IGNhbiBiZSBzZWxlY3RlZDxicj4KcmVxdWlyZWRfbnVtYmVyIChvcHRpb25hbCkgLSBzZXRzIGEgc3BlY2lmaWMgbnVtYmVyIG9mIGl0ZW1zIHRoYXQgbXVzdCBiZSBzZWxlY3RlZCAob3Igbm9uZSk8YnI+CmRlc2NyaXB0aW9uIChvcHRpb25hbCkgLSBhZGRzIGFkZGl0aW9uYWwgdGV4dCBleHBsYW5hdGlvbiBmb3IgZWRpdG9yCjwvcD48YnI+Cgo8cD48c3Ryb25nPnJhZGlvPC9zdHJvbmc+IDwvcD4KPHA+RXhhbXBsZToge2NvbnRlbnRfbW9kdWxlIG1vZHVsZT0iRUNCMiIgZmllbGQ9InJhZGlvIiBibG9jaz0idGVzdDE3IiBsYWJlbD0iRnJ1aXQiIHZhbHVlcz0iQXBwbGU9YXBwbGUsT3JhbmdlPW9yYW5nZSxLaXdpZnJ1aXQ9a2l3aWZydWl0IiBkZWZhdWx0X3ZhbHVlPSJPcmFuZ2UifTwvcD4KPHA+UGFyYW1ldGVyczoKdmFsdWVzIChyZXF1aXJlZCkgLSBjb21tYSBzZXBhcmF0ZWQuIEV4YW1wbGU6IEFwcGxlPWFwcGxlLE9yYW5nZT1vcmFuZ2UsS2l3aWZydWl0PWtpd2lmcnVpdDxicj4KZGVmYXVsdF92YWx1ZSAob3B0aW9uYWwpIC0gZGVmYXVsdCBpcyBmaXJzdCBjaG9pY2UgLSBzZXQgdG8gZGVmYXVsdCB2YWx1ZSBlLmcuICJPcmFuZ2UiCmlubGluZSAob3B0aW9uYWwpIC0gaWYgc2V0IGRpc3BsYXlzIGFkbWluIHJhZGlvIGJ1dHRvbnMgaW5saW5lPGJyPgpkZXNjcmlwdGlvbiAob3B0aW9uYWwpIC0gYWRkcyBhZGRpdGlvbmFsIHRleHQgZXhwbGFuYXRpb24gZm9yIGVkaXRvcgo8L3A+PGJyPgoKPHA+PHN0cm9uZz5oaWRkZW48L3N0cm9uZz48L3A+CjxwPkV4YW1wbGU6IHtjb250ZW50X21vZHVsZSBtb2R1bGU9J0VDQjInIGJsb2NrPSd0ZXN0MThoaWRkZW4nIGFzc2lnbj0ndGVzdGhpZGRlbicgZmllbGQ9J2hpZGRlbicgdmFsdWU9J21hcmtlcnZhbHVlJ308YnI+CkNhbiBiZSB1c2VkIHRvIHNldCBhIHBhZ2UgYXR0cmlidXRlIHRoYXQgY2FuIHRoZW4gYmUgYWNjZXNzZWQgKGUuZy4gZnJvbSBhIE5hdmlnYXRvci1UZW1wbGF0ZSksIHVzaW5nIHtwYWdlX2F0dHIgcGFnZT0kbm9kZS0+YWxpYXMga2V5PSd0ZXN0aGlkZGVuJ308L3A+CjxwPlBhcmFtZXRlcnM6CnZhbHVlIChyZXF1aXJlZCkgLSBoaWRkZW4gdmFsdWUgdG8gYmUgc2F2ZWQ8YnI+CmRlc2NyaXB0aW9uIChvcHRpb25hbCkgLSBhZGRzIGFkZGl0aW9uYWwgdGV4dCBleHBsYW5hdGlvbiBmb3IgZWRpdG9yCjwvcD48YnI+Cgo8cD48c3Ryb25nPmZpZWxkc2V0X3N0YXJ0PC9zdHJvbmc+PC9wPgo8cD5FeGFtcGxlOiB7Y29udGVudF9tb2R1bGUgbW9kdWxlPSdFQ0IyJyBmaWVsZD0nZmllbGRzZXRfc3RhcnQnIGxhYmVsPScmIG5ic3A7JyBibG9jaz0ndGVzdDE5ZmllbGRzZXQnIGFzc2lnbj0ndGVzdDE5ZmllbGRzZXQnIGxlZ2VuZD0nRmllbGRzZXQgVGVzdCBMZWdlbmQnIGRlc2NyaXB0aW9uPSdDYW4gYWRkIGEgZGVzY3JpcHRpb24gaW4gaGVyZSd9PGJyPgpDcmVhdGVzIHRoZSBzdGFydCBvZiBhIGZpZWxkc2V0IGZvciBncm91cGluZyByZWxhdmFudCBhZG1pbiBmaWVsZHMgdG9nZXRoZXIuIE5vdGU6IGEgbWF0Y2hpbmcgJ2ZpZWxkc2V0X2VuZCcgYmxvY2sgaXMgcmVxdWlyZWQgZm9yIGVhY2ggZmllbGRzZXRfc3RhcnQuPGJyPgpUSVA6IHNldCBsYWJlbD0nJiBuYnNwOycgdG8gbm90IHNob3cgdGhlIGZpZWxkIGxhYmVsLjwvcD4KPHA+UGFyYW1ldGVyczoKbGVnZW5kIChvcHRpb25hbCkgLSBhZGRzIGFuIG9wdGlvbmFsIGxlZ2VuZCAoZGVmYXVsdCA9IG5vIGxlZ2VuZCk8YnI+CmRlc2NyaXB0aW9uIChvcHRpb25hbCkgLSBhZGRzIGFkZGl0aW9uYWwgdGV4dCBleHBsYW5hdGlvbiBmb3IgZWRpdG9yCjwvcD48YnI+Cgo8cD48c3Ryb25nPmZpZWxkc2V0X2VuZDwvc3Ryb25nPjwvcD4KPHA+RXhhbXBsZToge2NvbnRlbnRfbW9kdWxlIG1vZHVsZT0nRUNCMicgZmllbGQ9J2ZpZWxkc2V0X2VuZCcgbGFiZWw9JyYgbmJzcDsnIGJsb2NrPSd0ZXN0MTlmaWVsZHNldGVuZCcgYXNzaWduPSd0ZXN0MTlmaWVsZHNldGVuZCcgfTxicj4KQ3JlYXRlcyB0aGUgZW5kIG9mIGEgZmllbGRzZXQgZm9yIGdyb3VwaW5nIHJlbGF2YW50IGFkbWluIGZpZWxkcyB0b2dldGhlci4gTm90ZTogYSBtYXRjaGluZyAnZmllbGRzZXRfc3RhcnQnIGJsb2NrIGlzIHJlcXVpcmVkIGZvciBlYWNoIGZpZWxkc2V0X2VuZC48YnI+ClRJUDogc2V0IGxhYmVsPScmIG5ic3A7JyB0byBub3Qgc2hvdyB0aGUgZmllbGQgbGFiZWwuCjwvcD48YnI+CgoKPHA+PHN0cm9uZz5nYWxsZXJ5X3BpY2tlcjwvc3Ryb25nPiA8c3BhbiBzdHlsZT0iY29sb3I6cmVkOyI+bmV3PC9zcGFuPjwvcD4KPHA+UHJvdmlkZXMgYSBnYWxsZXJ5IHBpY2tlciBmb3IgdGhlIEdhbGxlcnkgbW9kdWxlLjwvcD4KPHA+RXhhbXBsZToKICAgICAge2NvbnRlbnRfbW9kdWxlIG1vZHVsZT0nRUNCMicgZmllbGQ9J2dhbGxlcnlfcGlja2VyJyBibG9jaz1wYWdlVG9wR2FsbGVyeSBsYWJlbD0nUGFnZSBUb3AgR2FsbGVyeScgZGlyPSdwYWdlLXRvcC1nYWxsZXJpZXMnfTwvcD4KPHA+UGFyYW1ldGVyczo8L3A+Cjx1bD4KICAgPGxpPmRpciAob3B0aW9uYWwpIC0gb25seSByZXR1cm5zIGdhbGxlcmllcyB0aGF0IGFyZSBzdWItZ2FsbGVyaWVzIG9mIHRoaXMgZ2FsbGVyeSBkaXIsIGRlZmF1bHQgaXMgYWxsIGdhbGxlcmllcywgZXhjbHVkaW5nIGRlZmF1bHQgdG9wIGxldmVsIGdhbGxlcnk8L2xpPgogICA8bGk+ZGVzY3JpcHRpb24gKG9wdGlvbmFsKSAtIGEgZGVzY3JpcHRpb24gb2YgdGhlIGZpZWxkPC9saT4KPC91bD4KPGJyPgoKCjxwPjxzdHJvbmc+ZHJvcGRvd25fZnJvbV9jdXN0b21nczwvc3Ryb25nPiA8c3BhbiBzdHlsZT0iY29sb3I6cmVkOyI+bmV3PC9zcGFuPjwvcD4KPHA+UHJvdmlkZXMgYSBzaW5nbGUgb3IgbXVsdGlwbGUgc2VsZWN0IHVzaW5nIHRoZSBjb250ZW50IHNldCBpbiBhIEN1c3RvbUdTIE1vZHVsZSBmaWVsZC48L3A+CjxwPlJlcXVpcmVzIHRoZSBDdXN0b21HUyBtb2R1bGUgYW5kIHRvIGhhdmUgYSBmaWVsZCBvZiB0eXBlICd0ZXh0IGFyZWEnLjwvcD4KPHA+RXhhbXBsZToKICAgICAge2NvbnRlbnRfbW9kdWxlIG1vZHVsZT0nRUNCMicgZmllbGQ9J2Ryb3Bkb3duX2Zyb21fY3VzdG9tZ3MnIGN1c3RvbWdzX2ZpZWxkPSdTZWN0aW9uX1N0eWxlcycgYmxvY2s9c3R5bGUxIGxhYmVsPSdTZWN0aW9uIDEgTGF5b3V0IFN0eWxlJyBhc3NpZ249c3R5bGUxfTwvcD4KPHA+UGFyYW1ldGVyczo8L3A+Cjx1bD4KICAgPGxpPmN1c3RvbWdzX2ZpZWxkIChyZXF1aXJlZCkgLSBuYW1lIG9mIGN1c3RvbWdzX2ZpZWxkIHRvIHJldHJpZXZlICh3aXRoIHVuZGVyc2NvcmVzIG5vdCBzcGFjZXMpPC9saT4KICAgPGxpPmRlc2NyaXB0aW9uIChvcHRpb25hbCkgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGUgZmllbGQ8L2xpPgogICA8bGk+bXVsdGlwbGUgKG9wdGlvbmFsKSAtIGFuIG9wdGlvbiBpZiBzZXQsIHRvIG91cHV0IGEgbXVsdGktc2VsZWN0IGJveCByYXRoZXIgdGhhbiBhIHNpbmdsZSBzZWxlY3QgZHJvd25kb3duPC9saT4KICAgPGxpPnNpemUgKG9wdGlvbmFsKSAtIGFuIG9wdGlvbiB0byBzZXQgdGhlIHNpemUgb2YgYSBtdWx0aS1zZWxlY3QgYm94PC9saT4KPC91bD4KPGJyPgoKCjxwPjxzdHJvbmc+aW5wdXRfcmVwZWF0ZXI8L3N0cm9uZz4gPHNwYW4gc3R5bGU9ImNvbG9yOnJlZDsiPm5ldzwvc3Bhbj48L3A+CjxwPlByb3ZpZGVzIG9uZSBvciBtb3JlIHRleHQgaW5wdXRzIHRoYXQgY2FuIGJlIGFkZGVkIG9yIHJlbW92ZWQgYnkgdGhlIGVkaXRvci48L3A+CjxwPlRoZSBjb250ZW50IGJsb2NrIG91dHB1dCBpcyBhIHN0cmluZyB3aXRoIGVhY2ggaW5wdXQgZmllbGQncyBjb250ZW50cyBkZWxpbWl0ZXIgYnkgJ3x8Jy4gVG8gbWFrZSB0aGUgb3V0cHV0IGEgbW9yZSB1c2VmdWwgYXJyYXkgdXNlICdleHBsb2RlJywgZS5nLiB7Inx8InxleHBsb2RlOiRjb250ZW50X2Jsb2NrX25hbWV9PC9wPgo8cD5FeGFtcGxlOgogICAgICB7JGlucHV0X3JlcGVhdGVyX3Rlc3Q9Inx8InxleHBsb2RlOiJ7Y29udGVudF9tb2R1bGUgbW9kdWxlPSdFQ0IyJyBmaWVsZD0naW5wdXRfcmVwZWF0ZXInIGxhYmVsPSdUZXN0IDIyOiBpbnB1dF9yZXBlYXRlcicgYmxvY2s9J3Rlc3QyMicgc2l6ZT01MCBtYXhfbGVuZ3RoPTI1NSBkZXNjcmlwdGlvbj0nUHJlc3MgKCspIGFuZCAoLSkgdG8gYWRkIGFuZCByZW1vdmUgYWRkaXRpb25hbCBpbnB1dCBmaWVsZHMnfSIgc2NvcGU9Z2xvYmFsfTwvcD4KPHA+VG8gdXNlOiB7JGlucHV0X3JlcGVhdGVyX3Rlc3R8cHJpbnRfcn08L3A+Cjxicj4KCgoKPGgzPlVwZ3JhZGUgZnJvbSBFQ0I8L2gzPgo8cD5JbnN0YWxsIEVDQjIgbW9kdWxlIGFuZCBjaGFuZ2UgYWxsICJtb2R1bGUiIHBhcmFtZXRlcnMsIGluIGNvbnRlbnRfbW9kdWxlIHRhZ3MgdG8gYmUgbW9kdWxlPSJFQ0IyIiAod2FzICJFQ0IiKS4gVGhlbiBFQ0IgY2FuIGJlIHVuaW5zdGFsbGVkLjwvcD48YnI+PGgzPkRlcGVuZGVuY2llczwvaDM+PHVsPjxsaT5DR0V4dGVuc2lvbnMgPSZndDsgMS4zODwvbGk+PC91bD4=]]></help>
	<about><![CDATA[PGJyIC8+QXV0aG9yOiBDaHJpcyBUYXlsb3IgKHR3aXR0ZXIuY29tL0tpd2lDaHJpc0JUKSAmbHQ7Y2hyaXNAYmlubm92YXRpdmUuY28udWsmZ3Q7PGJyIC8+PGJyIC8+VmVyc2lvbjogMS41LjE8YnIgLz48YnIgLz5DaGFuZ2UgSGlzdG9yeTo8YnIgLz4KPGgzPlZlcnNpb24gMS41LjEgLSAxOEZlYjE5PC9oMz4KPHVsPgogICA8bGk+Z2FsbGVyeV9waWNrZXIgLSBidWcgZml4PC9saT4KPC91bD4KPGJyPgoKPGgzPlZlcnNpb24gMS41IC0gMTZGZWIxOTwvaDM+Cjx1bD4KICAgPGxpPmlucHV0X3JlcGVhdGVyIGNvbnRlbnQgYmxvY2sgLSBhZGRlZCAtIHRoYW5rcyB0byBTaW1vbiBSYWRmb3JkPC9saT4KICAgPGxpPmdhbGxlcnlfcGlja2VyIGNvbnRlbnQgYmxvY2sgLSBhZGRlZDwvbGk+CiAgIDxsaT5kcm9wZG93bl9mcm9tX2N1c3RvbWdzIGNvbnRlbnQgYmxvY2sgLSBhZGRlZDwvbGk+CiAgIDxsaT5hZGRlZCBlcnJvciBtZXNzYWdlIGZvciBtaXNzaW5nIG9yIGluY29ycmVjdGx5IHNwZWx0IGZpZWxkIHBhcmFtYXRlciAtIEJSIzExNTU3IC0gdGhhbmtzIEx1ZGdlcjwvbGk+CiAgIDxsaT5yZW1vdmVkIEFkbWluIHBhZ2UgdGhhdCBvbmx5IHNob3dlZCBoZWxwIC0gcmVkdW5kYW50IGFzIGhlbHAgZWFzaWx5IHZpc2libGUgZnJvbSB3aXRoaW4gTW9kdWxlIE1hbmFnZXI8L2xpPgogICA8bGk+cmVtb3ZlZCBQZXJtaXNzaW9uICdVc2UgRUNCMicgLSBhbHNvIHJlZHVuZGFudDwvbGk+CiAgIDxsaT5jb2RlIHRpZHkgdXAgLSBjb25zb2xpZGF0ZSBqcyAmIGNzcyBpbnRvIHNlcGFyYXRlIGV4dGVybmFsIGZpbGVzPC9saT4KPC91bD4KPGJyPgoKPGgzPlZlcnNpb24gMS4zLjEgLSAxMkp1bDE3PC9oMz4KPHVsPgogICA8bGk+bWlub3IgYnVnIGZpeDwvbGk+CjwvdWw+Cjxicj4KCjxoMz5WZXJzaW9uIDEuMyAtIDExSnVsMTc8L2gzPgo8dWw+CiAgIDxsaT5zb3J0YWJsZWxpc3QgLSBhZGRlZCBtYXhfbnVtYmVyIGFuZCByZXF1aXJlZF9udW1iZXIgb3B0aW9uczwvbGk+CiAgIDxsaT5BZGRlZCAnZmllbGRzZXRfc3RhcnQnIGFuZCAnZmllbGRzZXRfZW5kJyBmaWVsZHM8L2xpPgo8L3VsPgo8YnI+Cgo8aDM+VmVyc2lvbiAxLjIuMiAtIDA1SnVsMTc8L2gzPgo8dWw+CiAgIDxsaT50ZXN0IGZvciBhbmQgZGlzcGxheSB3YXJuaW5nIGluIGFkbWluIGlmIFVEVCBkb2VzIG5vdCBleGlzdDwvbGk+CjwvdWw+Cjxicj4KCjxoMz5WZXJzaW9uIDEuMi4xIC0gMTlBcHIxNzwvaDM+Cjx1bD4KICAgPGxpPmJ1ZyBmaXggZm9yIGNvbG9yX3BpY2tlciwgZGVmYXVsdF92YWx1ZSAtIEJSIzExMzU0IC0gdGhhbmtzIFN0dWFydDwvbGk+CiAgIDxsaT5jb2xvcl9waWNrZXIgLSB0d2Vha2VkIGxheW91dDwvbGk+CiAgIDxsaT5zb3J0YWJsZWxpc3QgLSBub3cgdXNlIGpxdWVyeSBzb3J0YWJsZSBpbnN0ZWFkIG9mIENHRXh0ZW5zaW9ucy4gUGFyYW1ldGVycyByZW1vdmVkOiAndGVtcGxhdGUnLiBQYXJhbWV0ZXJzIG5vdCBvcGVyYXRpb25hbDogJ21heF9zZWxlY3RlZCcsICdhbGxvd2R1cGxpY2F0ZXMnIChwbGVhc2UgYWR2aXNlIGlmIHlvdSByZXF1aXJlIHRoZXNlKS4gUGx1cyBzb21lIGJ1ZyBmaXhlcy48L2xpPgo8L3VsPgo8YnI+Cgo8aDM+VmVyc2lvbiAxLjIgLSAwN05vdjE2PC9oMz4KPHVsPgogICA8bGk+QWRkZWQgJ2Rlc2NyaXB0aW9uJyBwYXJhbWV0ZXIgZm9yIGFsbCBmaWVsZHMgKG9wdGlvbmFsKSAtIGFkZHMgYWRkaXRpb25hbCB0ZXh0IGV4cGxhbmF0aW9uIGZvciBlZGl0b3I8L2xpPgogICA8bGk+QWRkZWQgJ2hpZGRlbicgZmllbGQgLSBDYW4gYmUgdXNlZCB0byBzZXQgYSBwYWdlIGF0dHJpYnV0ZSB0aGF0IGNhbiB0aGVuIGJlIGFjY2Vzc2VkIChlLmcuIGZyb20gYSBOYXZpZ2F0b3ItVGVtcGxhdGUpLCB1c2luZyB7cGFnZV9hdHRyIHBhZ2U9JG5vZGUtPmFsaWFzIGtleT0ndGVzdGhpZGRlbid9PC9saT4KICAgPGxpPkJ1ZyBmaXggLSBmb3IgcGhwIG5vdGljZTwvbGk+CjwvdWw+Cjxicj4KCjxoMz5WZXJzaW9uIDEuMSAtIDE1QXByMTY8L2gzPgo8dWw+CiAgICA8bGk+QnVnIGZpeDwvbGk+CjwvdWw+Cjxicj4KCjxoMz5WZXJzaW9uIDEuMCAtIDE1QXByMTY8L2gzPgo8dWw+CiAgICA8bGk+SW5pdGlhbCByZWxlYXNlLiBBIGZvcmsgb2YgRUNCIG1vZHVsZSB2MS42LCB0aGF0IGlzIGNvbXBhdGlibGUgd2l0aCBDTVNNUyB2Mis8L2xpPgogICAgPGxpPkFkZGVkIHJhZGlvIGZpZWxkIC0gdG8gcHJvdmlkZSByYWRpbyBidXR0b25zIG9uIGFuIGFkbWluIHBhZ2U8L2xpPgo8L3VsPgo8YnI+PGJyIC8+]]></about>
	<requires>
	  <requiredname>CGExtensions</requiredname>
	  <requiredversion>1.38</requiredversion>
	</requires>
	<file>
	  <filename>/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/action.default.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIE1vZHVsZTogRUNCMiAtIEV4dGVuZGVkIENvbnRlbnQgQmxvY2tzIDIKIyBBdXRob3I6IENocmlzIFRheWxvcgojIENvcHlyaWdodDogKEMpIDIwMTYgQ2hyaXMgVGF5bG9yLCBjaHJpc0BiaW5ub3ZhdGl2ZS5jby51awojIExpY2VuY2U6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMwojICAgICAgICAgIHNlZSAvRUNCMi9sYW5nL0xJQ0VOQ0UudHh0IG9yIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoKaWYgKCFpc3NldCgkZ0NtcykpCiAgICBleGl0OwoKIyMgbm90aGluZyAtIHNob3VsZCBub3QgZ2V0IGhlcmUKCj8+]]></data>
	</file>
	<file>
	  <filename>/action.defaultadmin.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIE1vZHVsZTogRUNCMiAtIEV4dGVuZGVkIENvbnRlbnQgQmxvY2tzIDIKIyBBdXRob3I6IENocmlzIFRheWxvcgojIENvcHlyaWdodDogKEMpIDIwMTYgQ2hyaXMgVGF5bG9yLCBjaHJpc0BiaW5ub3ZhdGl2ZS5jby51awojIExpY2VuY2U6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMwojICAgICAgICAgIHNlZSAvRUNCMi9sYW5nL0xJQ0VOQ0UudHh0IG9yIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoKaWYgKCFpc3NldCgkZ0NtcykpCiAgICBleGl0OwoKIyMgbm90aGluZyAtIHNob3VsZCBub3QgZ2V0IGhlcmUKCj8+]]></data>
	</file>
	<file>
	  <filename>/action.refresh.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIE1vZHVsZTogRUNCMiAtIEV4dGVuZGVkIENvbnRlbnQgQmxvY2tzIDIKIyBBdXRob3I6IENocmlzIFRheWxvcgojIENvcHlyaWdodDogKEMpIDIwMTYgQ2hyaXMgVGF5bG9yLCBjaHJpc0BiaW5ub3ZhdGl2ZS5jby51awojIExpY2VuY2U6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMwojICAgICAgICAgIHNlZSAvRUNCMi9sYW5nL0xJQ0VOQ0UudHh0IG9yIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoKaWYgKCFpc3NldCgkZ0NtcykpIGV4aXQ7CgoKaWYgKCFpc3NldCgkcGFyYW1zWydibG9ja19uYW1lJ10pIHx8ICFpc3NldCgkcGFyYW1zWyd2YWx1ZSddKSB8fCAhaXNzZXQoJHBhcmFtc1snYWRkaW5nJ10pKQogICAgcmV0dXJuOwoKJGJsb2NrTmFtZSA9ICRwYXJhbXNbJ2Jsb2NrX25hbWUnXTsKJHZhbHVlID0gJHBhcmFtc1sndmFsdWUnXTsKJGFkZGluZyA9ICRwYXJhbXNbJ2FkZGluZyddOwoKCiRlY2IyID0gbmV3IGVjYjJfdG9vbHMoJGJsb2NrTmFtZSwgJHZhbHVlLCAkcGFyYW1zLCAkYWRkaW5nKTsKZWNobyAkZWNiMi0+Z2V0X2NvbnRlbnRfYmxvY2tfaW5wdXQoKTsKCj8+]]></data>
	</file>
	<file>
	  <filename>/ECB2.module.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIE1vZHVsZTogRUNCMiAtIEV4dGVuZGVkIENvbnRlbnQgQmxvY2tzIDIKIyBBdXRob3I6IENocmlzIFRheWxvcgojIENvcHlyaWdodDogKEMpIDIwMTYgQ2hyaXMgVGF5bG9yLCBjaHJpc0BiaW5ub3ZhdGl2ZS5jby51awojIExpY2VuY2U6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMwojICAgICAgICAgIHNlZSAvRUNCMi9sYW5nL0xJQ0VOQ0UudHh0IG9yIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQSBmb3JrIG9mIG1vZHVsZTogRXh0ZW5kZWQgQ29udGVudCBCbG9ja3MgKEVDQikKIyBPcmlnaW5hbCBBdXRob3I6IFpkZW5vIEt1em1hbnkgKHpkZW5vQGt1em1hbnkuYml6KSAvIGt1em1hbnkuYml6ICAvIHR3aXR0ZXIuY29tL2t1em1hbnkKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIENNUyAtIENNUyBNYWRlIFNpbXBsZSBpcyAoYykgMjAxMSBieSBUZWQgS3VscCAod2lzaHlAY21zbWFkZXNpbXBsZS5vcmcpCiMgUHJvamVjdCdzIGhvbWVwYWdlIGlzOiBodHRwOi8vd3d3LmNtc21hZGVzaW1wbGUub3JnCiMgTW9kdWxlJ3MgaG9tZXBhZ2UgaXM6IGh0dHA6Ly9kZXYuY21zbWFkZXNpbXBsZS5vcmcvcHJvamVjdHMvZWNiMgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzCiMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOwojIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiMgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uCiMgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoKLy8gZGVmaW5lKCdVU0VfRUNCMicsICdVc2UgRXh0ZW5kZWQgQ29udGVudCBCbG9ja3MgMicpOwoKY2xhc3MgRUNCMiBleHRlbmRzIENHRXh0ZW5zaW9ucyB7CgogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkgewogICAgICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gR2V0TmFtZSgpIHsgcmV0dXJuICdFQ0IyJzsgIH0KICAgIHB1YmxpYyBmdW5jdGlvbiBHZXRGcmllbmRseU5hbWUoKSB7IHJldHVybiAkdGhpcy0+TGFuZygnZnJpZW5kbHluYW1lJyk7IH0KICAgIHB1YmxpYyBmdW5jdGlvbiBHZXRWZXJzaW9uKCkgeyByZXR1cm4gJzEuNS4xJzsgfQogICAgcHVibGljIGZ1bmN0aW9uIE1pbmltdW1DTVNWZXJzaW9uKCkgeyByZXR1cm4gJzIuMCc7IH0KICAgIHB1YmxpYyBmdW5jdGlvbiBMYXp5TG9hZEZyb250ZW5kKCkgeyByZXR1cm4gVFJVRTsgfQogICAgcHVibGljIGZ1bmN0aW9uIEluaXRpYWxpemVBZG1pbigpIHsgJHRoaXMtPkFkZEltYWdlRGlyKCdpY29ucycpOyB9CiAgICBwdWJsaWMgZnVuY3Rpb24gR2V0SGVscCgpIHsgcmV0dXJuICR0aGlzLT5MYW5nKCdoZWxwJyk7IH0KICAgIHB1YmxpYyBmdW5jdGlvbiBHZXRBdXRob3IoKSB7IHJldHVybiAnQ2hyaXMgVGF5bG9yICh0d2l0dGVyLmNvbS9LaXdpQ2hyaXNCVCknOyB9CiAgICBwdWJsaWMgZnVuY3Rpb24gR2V0QXV0aG9yRW1haWwoKSB7IHJldHVybiAnY2hyaXNAYmlubm92YXRpdmUuY28udWsnOyB9CiAgICBwdWJsaWMgZnVuY3Rpb24gR2V0Q2hhbmdlTG9nKCkgeyByZXR1cm4gJHRoaXMtPkxhbmcoJ2NoYW5nZWxvZycpOyB9CiAgICBwdWJsaWMgZnVuY3Rpb24gSGFzQWRtaW4oKSB7IHJldHVybiBGQUxTRTt9CiAgICBwdWJsaWMgZnVuY3Rpb24gR2V0RGVzY3JpcHRpb24oKSB7IHJldHVybiAkdGhpcy0+TGFuZygnbW9kdWxlX2Rlc2NyaXB0aW9uJyk7IH0KICAgIHB1YmxpYyBmdW5jdGlvbiBHZXREZXBlbmRlbmNpZXMoKSB7IHJldHVybiBhcnJheSgnQ0dFeHRlbnNpb25zJyA9PiAnMS4zOCcpO30KICAgIHB1YmxpYyBmdW5jdGlvbiBJbnN0YWxsUG9zdE1lc3NhZ2UoKSB7IHJldHVybiAkdGhpcy0+TGFuZygncG9zdGluc3RhbGwnKTt9CiAgICBwdWJsaWMgZnVuY3Rpb24gVW5pbnN0YWxsUG9zdE1lc3NhZ2UoKSB7IHJldHVybiAkdGhpcy0+TGFuZygncG9zdHVuaW5zdGFsbCcpO30KICAgIHB1YmxpYyBmdW5jdGlvbiBVbmluc3RhbGxQcmVNZXNzYWdlKCkgeyByZXR1cm4gJHRoaXMtPkxhbmcoJ3JlYWxseV91bmluc3RhbGwnKTt9CgogICAgcHVibGljIGZ1bmN0aW9uIEluaXRpYWxpemVGcm9udGVuZCgpIHsKICAgICAgICAkdGhpcy0+UmVnaXN0ZXJNb2R1bGVQbHVnaW4oKTsKICAgICAgICAkdGhpcy0+UmVzdHJpY3RVbmtub3duUGFyYW1zKCk7CgogICAgICAgICR0aGlzLT5TZXRQYXJhbWV0ZXJUeXBlKCdibG9ja19uYW1lJywgQ0xFQU5fU1RSSU5HKTsKICAgICAgICAkdGhpcy0+U2V0UGFyYW1ldGVyVHlwZSgndmFsdWUnLCBDTEVBTl9TVFJJTkcpOwogICAgICAgICR0aGlzLT5TZXRQYXJhbWV0ZXJUeXBlKCdhZGRpbmcnLCBDTEVBTl9TVFJJTkcpOwogICAgICAgICR0aGlzLT5TZXRQYXJhbWV0ZXJUeXBlKCdzb3J0ZmlsZXMnLCBDTEVBTl9TVFJJTkcpOwogICAgICAgICR0aGlzLT5TZXRQYXJhbWV0ZXJUeXBlKCdleGNsdWRlcHJlZml4JywgQ0xFQU5fU1RSSU5HKTsKICAgICAgICAkdGhpcy0+U2V0UGFyYW1ldGVyVHlwZSgncmVjdXJzZScsIENMRUFOX1NUUklORyk7CiAgICAgICAgJHRoaXMtPlNldFBhcmFtZXRlclR5cGUoJ2ZpbGV0eXBlcycsIENMRUFOX1NUUklORyk7CiAgICAgICAgJHRoaXMtPlNldFBhcmFtZXRlclR5cGUoJ2ZpZWxkJywgQ0xFQU5fU1RSSU5HKTsKICAgICAgICAkdGhpcy0+U2V0UGFyYW1ldGVyVHlwZSgnZGlyJywgQ0xFQU5fU1RSSU5HKTsKICAgICAgICAkdGhpcy0+U2V0UGFyYW1ldGVyVHlwZSgncHJldmlldycsIENMRUFOX1NUUklORyk7CiAgICAgICAgJHRoaXMtPlNldFBhcmFtZXRlclR5cGUoJ2RhdGVfZm9ybWF0JywgQ0xFQU5fU1RSSU5HKTsKICAgICAgICAkdGhpcy0+U2V0UGFyYW1ldGVyVHlwZSgnZGVzY3JpcHRpb24nLCBDTEVBTl9TVFJJTkcpOwogICAgICAgICR0aGlzLT5TZXRQYXJhbWV0ZXJUeXBlKCdkZWZhdWx0X3ZhbHVlJywgQ0xFQU5fU1RSSU5HKTsKICAgICAgICAkdGhpcy0+U2V0UGFyYW1ldGVyVHlwZSgnbWF4X251bWJlcicsIENMRUFOX0lOVCk7CiAgICAgICAgJHRoaXMtPlNldFBhcmFtZXRlclR5cGUoJ21heG51bWJlcicsIENMRUFOX0lOVCk7CiAgICAgICAgJHRoaXMtPlNldFBhcmFtZXRlclR5cGUoJ2xlZ2VuZCcsIENMRUFOX1NUUklORyk7CgogICAgfQoKCiAgICAvKioKICAgICAqIEBsaW5rIGh0dHA6Ly93d3cuY21zbWFkZXNpbXBsZS5vcmcvYXBpZG9jL0NNUy9DTVNNb2R1bGUuaHRtbCNIYXNDYXBhYmlsaXR5CiAgICAgKiBAaWdub3JlCiAgICAgKi8KICAgIGZ1bmN0aW9uIEhhc0NhcGFiaWxpdHkoJGNhcGFiaWxpdHksICRwYXJhbXMgPSBhcnJheSgpKSB7CiAgICAgICAgc3dpdGNoICgkY2FwYWJpbGl0eSkgewogICAgICAgICAgICBjYXNlICdjb250ZW50YmxvY2tzJzoKICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgIH0KICAgIH0KCgoKICAgIC8vIGNvbnRlbnQgYmxvY2sKICAgIC8qKgogICAgICogQGxpbmsgaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZy9BUElET0MyXzAvY2xhc3Nlcy9DTVNNb2R1bGUuaHRtbCNtZXRob2RfR2V0Q29udGVudEJsb2NrRmllbGRJbnB1dAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gR2V0Q29udGVudEJsb2NrRmllbGRJbnB1dCgkYmxvY2tOYW1lLCAkdmFsdWUsICRwYXJhbXMsICRhZGRpbmc9ZmFsc2UsIENvbnRlbnRCYXNlICRjb250ZW50X29iaikgewoKICAgICAgICAkZWNiMiA9IG5ldyBlY2IyX3Rvb2xzKCRibG9ja05hbWUsICR2YWx1ZSwgJHBhcmFtcywgJGFkZGluZyk7CiAgICAgICAgcmV0dXJuICRlY2IyLT5nZXRfY29udGVudF9ibG9ja19pbnB1dCgpOwoKICAgIH0KCn0KCj8+]]></data>
	</file>
	<file>
	  <filename>/icons/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/icons/ajax-refresh-icon.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhEAAQAMQAAP///wAAAPj4+Dg4OISEhAYGBiYmJtbW1qioqBYWFnZ2dmZmZuTk5JiYmMbGxkhISFZWVgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAAALAAAAAAQABAAAAVQICCOZGmepTAUbCEqhGCqrZgUxpEaNYDwBtmIgFuNBDwCaYVQkRCFAYmFoo6sKSyASVr4oiRi8LpIkpA4hKg1Jh14iTVrIDwTFPJ5HcXvj0IAOw==]]></data>
	</file>
	<file>
	  <filename>/icons/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCEtLSBEVU1NWSBIVE1MIEZJTEUgLS0+]]></data>
	</file>
	<file>
	  <filename>/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[]]></data>
	</file>
	<file>
	  <filename>/lang/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lang/en_US.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCiRsYW5nWydmcmllbmRseW5hbWUnXSA9ICdFeHRlbmRlZCBDb250ZW50IEJsb2NrcyAyJzsKJGxhbmdbJ3Bvc3RpbnN0YWxsJ10gPSAnRXh0ZW5kZWQgQ29udGVudCBCbG9ja3MgMiB3YXMgc3VjY2Vzc2Z1bCBpbnN0YWxsZWQnOwokbGFuZ1sncG9zdHVuaW5zdGFsbCddID0gJ0V4dGVuZGVkIENvbnRlbnQgQmxvY2tzIDIgd2FzIHN1Y2Nlc3NmdWwgdW5pbnN0YWxsZWQnOwokbGFuZ1sncmVhbGx5X3VuaW5zdGFsbCddID0gJ1JlYWxseT8gQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIHVuc2luc3RhbGwgdGhpcyBmaW5lIG1vZHVsZT8nOwokbGFuZ1sndW5pbnN0YWxsZWQnXSA9ICdNb2R1bGUgVW5pbnN0YWxsZWQuJzsKJGxhbmdbJ2luc3RhbGxlZCddID0gJ01vZHVsZSB2ZXJzaW9uICVzIGluc3RhbGxlZC4nOwokbGFuZ1sndXBncmFkZWQnXSA9ICdNb2R1bGUgdXBncmFkZWQgdG8gdmVyc2lvbiAlcy4nOwovLyRsYW5nWydhZG1pbmRlc2NyaXB0aW9uJ10gPSAnVGhpcyBtb2R1bGUgYWRkcyBuZXcgY29udGVudCBibG9ja3MgdG8gQ01TIE1hZGUgU2ltcGxlIHYyKyc7CiRsYW5nWydtb2R1bGVfZGVzY3JpcHRpb24nXSA9ICdUaGlzIG1vZHVsZSBhZGRzIG5ldyBjb250ZW50IGJsb2NrcyB0byBDTVMgTWFkZSBTaW1wbGUgdjIrJzsKCiRsYW5nWydzZWxlY3RlZCddID0gJ1NlbGVjdGVkJzsKJGxhbmdbJ3NlbGVjdCddID0gJ1NlbGVjdCc7CiRsYW5nWydyZWZyZXNoJ10gPSAnUmVmcmVzaCc7CgokbGFuZ1snY29udGVudF9ibG9ja19sYWJlbF9zZWxlY3RlZCddID0gJ1NlbGVjdGVkJzsKJGxhbmdbJ2NvbnRlbnRfYmxvY2tfbGFiZWxfYXZhaWxhYmxlJ10gPSAnQXZhaWxhYmxlJzsKJGxhbmdbJ2Ryb3BfaXRlbXMnXSA9ICdObyBpdGVtcyBzZWxlY3RlZCAtIGRyb3Agc2VsZWN0ZWQgaXRlbXMgaGVyZSc7CiRsYW5nWydkcm9wX3JlcXVpcmVkX2l0ZW1zJ10gPSAnRHJvcCAlcyByZXF1aXJlZCBpdGVtcyBoZXJlJzsKJGxhbmdbJ3JlbW92ZSddID0gJ1JlbW92ZSc7CgokbGFuZ1sndWR0X2Vycm9yJ10gPSAnVURUIFwnJXNcJyBkb2VzIG5vdCBleGlzdCc7CiRsYW5nWydjdXN0b21nc19maWVsZF9lcnJvciddID0gIlBsZWFzZSBjcmVhdGUgb3B0aW9uICclcycgaW4gQ3VzdG9tR1MiOwokbGFuZ1snZmllbGRfZXJyb3InXSA9ICdQbGVhc2Ugc3BlY2lmeSBhIGNvcnJlY3QgZmllbGQgcGFyYW1ldGVyIGZvciB0aGUgRUNCMiBjb250ZW50IGJsb2NrLic7CgokbGFuZ1snZ2FsbGVyeV9tb2R1bGVfZXJyb3InXSA9ICdHYWxsZXJ5IG1vZHVsZSBpcyBub3QgaW5zdGFsbGVkLic7CgokbGFuZ1snYWRkX2xpbmUnXSA9ICdBZGQgbGluZSc7CiRsYW5nWydyZW1vdmVfbGluZSddID0gJ1JlbW92ZSBsaW5lJzsKCgoKCgoKCgojIyMgICAgIyMjICAgIyMjIyMjIyMjICAgIyMjICAgICAgICAjIyMjIyMjIyMKIyMjICAgICMjIyAgICMjIyMjIyMjIyAgICMjIyAgICAgICAgIyMjIyMjIyMjCiMjIyAgICAjIyMgICAjIyMgICAgICAgICAjIyMgICAgICAgICMjIyAgICMjIwojIyMjIyMjIyMjICAgIyMjIyMjIyMjICAgIyMjICAgICAgICAjIyMjIyMjIyMKIyMjIyMjIyMjIyAgICMjIyMjIyMjIyAgICMjIyAgICAgICAgIyMjIyMjIyMjCiMjIyAgICAjIyMgICAjIyMgICAgICAgICAjIyMgICAgICAgICMjIwojIyMgICAgIyMjICAgIyMjIyMjIyMjICAgIyMjIyMjIyMjICAjIyMKIyMjICAgICMjIyAgICMjIyMjIyMjIyAgICMjIyMjIyMjIyAgIyMjCgokbGFuZ1snaGVscCddID0gPDw8J0VPRCcKCjxoMz5XaGF0IERvZXMgVGhpcyBEbz88L2gzPgo8cD5Nb2R1bGUgYWRkcyBhZGl0aW9uYWwgY29udGVudCBibG9ja3MgZm9yIENNUyBNYWRlIFNpbXBsZSB2MisuIFRoaXMgaXMgYSBmb3JrIG9mIHRoZSBvcmlnaW5hbCBFQ0IgbW9kdWxlIHRoYXQgd29ya2VkIHdpdGggQ01TTVMgdjEuPC9wPgo8cD5Qcm92aWRlcyB0aGUgZm9sbG93aW5nIGZpZWxkIHR5cGVzOjxicj4KPG9sPgogICA8bGk+ZmlsZV9zZWxlY3RvcjwvbGk+CiAgIDxsaT5jb2xvcl9waWNrZXI8L2xpPgogICA8bGk+ZHJvcGRvd25fZnJvbV91ZHQ8L2xpPgogICA8bGk+ZHJvcGRvd248L2xpPgogICA8bGk+Y2hlY2tib3g8L2xpPgogICA8bGk+bW9kdWxlX2xpbms8L2xpPgogICA8bGk+bGluazwvbGk+CiAgIDxsaT50aW1lcGlja2VyPC9saT4KICAgPGxpPmRhdGVwaWNrZXI8L2xpPgogICA8bGk+aW5wdXQ8L2xpPgogICA8bGk+dGV4dGFyZWE8L2xpPgogICA8bGk+ZWRpdG9yICh0ZXh0YXJlYSB3aXRoIHd5c2l3eWcpPC9saT4KICAgPGxpPnRleHQgPC9saT4KICAgPGxpPnBhZ2VzIDwvbGk+CiAgIDxsaT5ociAoaG9yaXpvbnRhbCBsaW5lKTwvbGk+CiAgIDxsaT5zb3J0YWJsZWxpc3Q8L2xpPgogICA8bGk+cmFkaW88L2xpPgogICA8bGk+aGlkZGVuPC9saT4KICAgPGxpPmZpZWxkc2V0X3N0YXJ0PC9saT4KICAgPGxpPmZpZWxkc2V0X2VuZDwvbGk+CiAgIDxsaT5nYWxsZXJ5X3BpY2tlciA8c3BhbiBzdHlsZT0iY29sb3I6cmVkOyI+bmV3PC9zcGFuPjwvbGk+CiAgIDxsaT5kcm9wZG93bl9mcm9tX2N1c3RvbWdzIDxzcGFuIHN0eWxlPSJjb2xvcjpyZWQ7Ij5uZXc8L3NwYW4+PC9saT4KICAgPGxpPmlucHV0X3JlcGVhdGVyIDxzcGFuIHN0eWxlPSJjb2xvcjpyZWQ7Ij5uZXc8L3NwYW4+PC9saT4KPC9vbD4KPC9wPjxicj4KCjxwPklmIHlvdSBsaWtlIHRoaXMgbW9kdWxlIHBsZWFzZSA8YSBocmVmPSJodHRwOi8vd3d3LmNtc21hZGVzaW1wbGUub3JnL2Fib3V0LWxpbmsvZG9uYXRpb25zLyIgdGFyZ2V0PSJfYmxhbmsiIHN0eWxlPSJmb250LXdlaWdodDpib2xkOyI+ZG9uYXRlIHRvIENNU01TPC9hPjwvcD48YnI+Cgo8aDM+RmllbGRzPC9oMz4KCjxwPjxzdHJvbmc+ZmlsZV9zZWxlY3Rvcjwvc3Ryb25nPjwvcD4KPHA+RXhhbXBsZTogIHtjb250ZW50X21vZHVsZSBtb2R1bGU9IkVDQjIiIGZpZWxkPSJmaWxlX3NlbGVjdG9yIiBibG9jaz0idGVzdDEwIiBkaXI9ImltYWdlcyIgZmlsZXR5cGVzPSJqcGcsZ2lmLHBuZyIgZXhjbHVkZXByZWZpeD0idGh1bWJfIn0gICAgICAgIDwvcD4KPHA+UGFyYW1ldGVyczoKZmlsZXR5cGVzIC0gY29tbWEgc2VwYXJhdGVkPGJyPgpkaXIgKG9wdGlvbmFsKSAtIGRlZmF1bHQgdXBsb2Fkcy88YnI+CmV4Y2x1ZGVwcmVmaXggKG9wdGlvbmFsKTxicj4KcmVjdXJzZSAob3B0aW9uYWwpPGJyPgpzb3J0ZmlsZXMgKG9wdGlvbmFsKTxicj4KcHJldmlldyAob3B0aW9uYWwpIC0gb25seSBmb3IgaW1hZ2VzPGJyPgpkZXNjcmlwdGlvbiAob3B0aW9uYWwpIC0gYWRkcyBhZGRpdGlvbmFsIHRleHQgZXhwbGFuYXRpb24gZm9yIGVkaXRvcgo8L3A+PGJyPgoKPHA+PHN0cm9uZz5jb2xvcl9waWNrZXI8L3N0cm9uZz48L3A+CjxwPkV4YW1wbGU6ICB7Y29udGVudF9tb2R1bGUgbW9kdWxlPSJFQ0IyIiBmaWVsZD0iY29sb3JfcGlja2VyIiBibG9jaz0idGVzdDEiIGxhYmVsPSJDb2xvciIgZGVmYXVsdF92YWx1ZT0iIzAwMDAwMCJ9PC9wPgo8cD5QYXJhbWV0ZXJzOgpkZWZhdWx0X3ZhbHVlIChvcHRpb25hbCk8YnI+CnNpemUgKG9wdGlvbmFsKSAtIGRlZmF1bHQgMTA8YnI+CmRlc2NyaXB0aW9uIChvcHRpb25hbCkgLSBhZGRzIGFkZGl0aW9uYWwgdGV4dCBleHBsYW5hdGlvbiBmb3IgZWRpdG9yCjwvcD48YnI+Cgo8cD48c3Ryb25nPmRyb3Bkb3duX2Zyb21fdWR0PC9zdHJvbmc+PC9wPgo8cD5FeGFtcGxlOiB7Y29udGVudF9tb2R1bGUgbW9kdWxlPSJFQ0IyIiBmaWVsZD0iZHJvcGRvd25fZnJvbV91ZHQiIGJsb2NrPSJ0ZXN0MiIgbGFiZWw9IkdhbGxlcnkiIHVkdD0ibXljdXN0b211ZHQiICBmaXJzdF92YWx1ZT0iPXNlbGVjdD0ifTwvcD4KPHA+T3VwdXQgZnJvbSBVRFQgbXVzdCBiZSBhcnJheSgpIC0gZXhhbXBsZTogcmV0dXJuIGFycmF5KCJsYWJlbCI9PiJ2YWx1ZSIsICJsYWJlbCAyICI9PiJ2YWx1ZSAyIik8L3A+CjxwPlBhcmFtZXRlcnM6CnVkdCAocmVxdWlyZWQpIC0gdWR0IG5hbWU8YnI+CmZpcnN0X3ZhbHVlIChvcHRpb25hbCkgPGJyPgptdWx0aXBsZSAob3B0aW9uYWwpIC0gYWRkIG11bHRpcGxlIG9wdGlvbiBzZWxlY3Qgc3VwcG9ydDxicj4Kc2l6ZSAob3B0aW9uYWwpIC0gbXVsdGlwbGUgZW5hYmxlZCBvbmx5PGJyPgpkZXNjcmlwdGlvbiAob3B0aW9uYWwpIC0gYWRkcyBhZGRpdGlvbmFsIHRleHQgZXhwbGFuYXRpb24gZm9yIGVkaXRvcgo8L3A+CjxwPjxzdHJvbmc+RXhhbXBsZXMgVURUPC9zdHJvbmc+Ogo8YnI+CjxhIGhyZWY9Imh0dHBzOi8vZ2lzdC5naXRodWIuY29tL2t1em1hbnkvNjc3OWMxOTNiODEwNGFhNmFiZmUiPkdhbGxlcnkgbGlzdCBmcm9tIEdhbGxlcnkgbW9kdWxlPC9hPiA8YnI+CjxhIGhyZWY9Imh0dHBzOi8vZ2lzdC5naXRodWIuY29tL2t1em1hbnkvNDY0Mjc2ZTE2ZjNiNzRjMDc1NTUiPkdyb3VwIGxpc3QgZnJvbSBGRVU8L2E+IDxicj4KPGEgaHJlZj0iaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20va3V6bWFueS81MTU4M2M2NDM5Y2IwNDE2NzlhNiI+VXNlcnMgbGlzdCBmcm9tIEZFVTwvYT4KPC9wPjxicj4KCjxwPjxzdHJvbmc+ZHJvcGRvd248L3N0cm9uZz48L3A+CjxwPkV4YW1wbGU6IHtjb250ZW50X21vZHVsZSBtb2R1bGU9IkVDQjIiIGZpZWxkPSJkcm9wZG93biIgYmxvY2s9InRlc3Q1IiBsYWJlbD0iRnJ1aXQiICB2YWx1ZXM9IkFwcGxlPWFwcGxlLE9yYW5nZT1vcmFuZ2UiIGZpcnN0X3ZhbHVlPSJzZWxlY3QgZnJ1aXQifTwvcD4KPHA+UGFyYW1ldGVyczoKdmFsdWVzIChyZXF1aXJlZCkgLSBjb21tYSBzZXBhcmF0ZWQuIEV4YW1wbGU6IEFwcGxlPWFwcGxlLE9yYW5nZT1vcmFuZ2UsR3JlZW49Z3JlZW4gPGJyPgpmaXJzdF92YWx1ZSAob3B0aW9uYWwpPGJyPgptdWx0aXBsZSAob3B0aW9uYWwpIC0gYWRkIG11bHRpcGxlIG9wdGlvbiBzZWxlY3Qgc3VwcG9ydDxicj4Kc2l6ZSAob3B0aW9uYWwpIC0gbXVsdGlwbGUgZW5hYmxlZCBvbmx5PGJyPgpkZXNjcmlwdGlvbiAob3B0aW9uYWwpIC0gYWRkcyBhZGRpdGlvbmFsIHRleHQgZXhwbGFuYXRpb24gZm9yIGVkaXRvcgo8L3A+PGJyPgoKPHA+PHN0cm9uZz5jaGVja2JveDwvc3Ryb25nPjwvcD4KPHA+RXhhbXBsZToge2NvbnRlbnRfbW9kdWxlIG1vZHVsZT0iRUNCMiIgZmllbGQ9ImNoZWNrYm94IiBibG9jaz0idGVzdDExIiBsYWJlbD0iQ2hlY2tib3giIGRlZmF1bHRfdmFsdWU9IjEifTwvcD4KPHA+UGFyYW1ldGVyczoKZGVmYXVsdF92YWx1ZSAob3B0aW9uYWwpPGJyPgpkZXNjcmlwdGlvbiAob3B0aW9uYWwpIC0gYWRkcyBhZGRpdGlvbmFsIHRleHQgZXhwbGFuYXRpb24gZm9yIGVkaXRvcgo8L3A+PGJyPgoKPHA+PHN0cm9uZz5tb2R1bGVfbGluazwvc3Ryb25nPjwvcD4KPHA+RXhhbXBsZToge2NvbnRlbnRfbW9kdWxlIG1vZHVsZT0iRUNCMiIgZmllbGQ9Im1vZHVsZV9saW5rIiBsYWJlbD0iTW9kdWxlIGVkaXQiIGJsb2NrPSJ0ZXN0MyIgbW9kPSJDYXRhbG9nZXIiIHRleHQ9IkVkaXQgY2F0YWxvZyIgfTwvcD4KPHA+UGFyYW1ldGVyczoKbW9kIChyZXF1aXJlZCkgPGJyPgp0ZXh0IChyZXF1aXJlZCkgPGJyPgp0YXJnZXQgKG9wdGlvbmFsKSAtIGRlZmF1bHQgX3NlbGY8YnI+CmRlc2NyaXB0aW9uIChvcHRpb25hbCkgLSBhZGRzIGFkZGl0aW9uYWwgdGV4dCBleHBsYW5hdGlvbiBmb3IgZWRpdG9yCjwvcD48YnI+Cgo8cD48c3Ryb25nPmxpbms8L3N0cm9uZz48L3A+CjxwPkV4YW1wbGU6IHtjb250ZW50X21vZHVsZSBtb2R1bGU9IkVDQjIiIGZpZWxkPSJsaW5rIiBsYWJlbD0iU2VhcmNoIiBibG9jaz0idGVzdDQiIHRhcmdldD0iX2JsYW5rIiBsaW5rPSJodHRwOi8vd3d3LmJpbmcuY29tIiB0ZXh0PSJiaW5nIHNlYXJjaCJ9PC9wPgo8cD5QYXJhbWV0ZXJzOgpsaW5rIChyZXF1aXJlZCkgPGJyPgp0ZXh0IChyZXF1aXJlZCkgPGJyPgp0YXJnZXQgKG9wdGlvbmFsKSAtIGRlZmF1bHQgX3NlbGY8YnI+CmRlc2NyaXB0aW9uIChvcHRpb25hbCkgLSBhZGRzIGFkZGl0aW9uYWwgdGV4dCBleHBsYW5hdGlvbiBmb3IgZWRpdG9yCjwvcD48YnI+Cgo8cD48c3Ryb25nPnRpbWVwaWNrZXI8L3N0cm9uZz48L3A+CjxwPkV4YW1wbGU6IHtjb250ZW50X21vZHVsZSBtb2R1bGU9IkVDQjIiIGZpZWxkPSJ0aW1lcGlja2VyIiBsYWJlbD0iVGltZSIgYmxvY2s9InRlc3Q0NSJ9PC9wPgo8cD5QYXJhbWV0ZXJzOgpzaXplIChvcHRpb25hbCkgZGVmYXVsdCAxMDA8YnI+CnRpbWVfZm9ybWF0IChvcHRpb25hbCkgZGVmYXVsdCBISDo6c3M8YnI+Cm1heF9sZW5ndGggKG9wdGlvbmFsKSBkZWZhdWx0IDEwPGJyPgpkZXNjcmlwdGlvbiAob3B0aW9uYWwpIC0gYWRkcyBhZGRpdGlvbmFsIHRleHQgZXhwbGFuYXRpb24gZm9yIGVkaXRvcgo8L3A+PGJyPgoKPHA+PHN0cm9uZz5kYXRlcGlja2VyPC9zdHJvbmc+PC9wPgo8cD5FeGFtcGxlOiB7Y29udGVudF9tb2R1bGUgbW9kdWxlPSJFQ0IyIiBmaWVsZD0iZGF0ZXBpY2tlciIgbGFiZWw9IkRhdGUiIGJsb2NrPSJ0ZXN0NDQifTwvcD4KPHA+UGFyYW1ldGVyczoKc2l6ZSAob3B0aW9uYWwpIGRlZmF1bHQgMTAwPGJyPgpkYXRlX2Zvcm1hdCAob3B0aW9uYWwpIGRlZmF1bHQgeXktbW0tZGQ8YnI+CnRpbWUgKG9wdGlvbmFsKSAtIGFkZCB0aW1lIHBpY2tlciBkZWZhdWx0IDA8YnI+CnRpbWVfZm9ybWF0IChvcHRpb25hbCkgZGVmYXVsdCBISDo6c3M8YnI+Cm1heF9sZW5ndGggKG9wdGlvbmFsKSBkZWZhdWx0IDEwIDxicj4KZGVzY3JpcHRpb24gKG9wdGlvbmFsKSAtIGFkZHMgYWRkaXRpb25hbCB0ZXh0IGV4cGxhbmF0aW9uIGZvciBlZGl0b3IKPC9wPjxicj4KCjxwPjxzdHJvbmc+aW5wdXQ8L3N0cm9uZz48L3A+CjxwPkV4YW1wbGU6IHtjb250ZW50X21vZHVsZSBtb2R1bGU9IkVDQjIiIGZpZWxkPSJpbnB1dCIgbGFiZWw9IlRleHQiIGJsb2NrPSJ0ZXN0NSIgc2l6ZT01NSBtYXhfbGVuZ3RoPTU1IGRlZmF1bHRfdmFsdWU9ImZpbGwgaXQifTwvcD4KPHA+UGFyYW1ldGVyczoKc2l6ZSAob3B0aW9uYWwpIGRlZmF1bHQgMzA8YnI+Cm1heF9sZW5ndGggKG9wdGlvbmFsKSBkZWZhdWx0IDI1NSA8YnI+CmRlZmF1bHRfdmFsdWUgKG9wdGlvbmFsKSAtIGRlZmF1bHQgdmFsdWUgZm9yIGlucHV0PGJyPgpkZXNjcmlwdGlvbiAob3B0aW9uYWwpIC0gYWRkcyBhZGRpdGlvbmFsIHRleHQgZXhwbGFuYXRpb24gZm9yIGVkaXRvcgo8L3A+PGJyPgoKPHA+PHN0cm9uZz50ZXh0YXJlYTwvc3Ryb25nPjwvcD4KPHA+RXhhbXBsZToge2NvbnRlbnRfbW9kdWxlIG1vZHVsZT0iRUNCMiIgZmllbGQ9InRleHRhcmVhIiBsYWJlbD0iVGV4dGFyZWEiIGJsb2NrPSJ0ZXN0NiIgcm93cz0xMCBjb2xzPTQwIGRlZmF1bHRfdmFsdWU9ImZpbGwgaXQifTwvcD4KPHA+UGFyYW1ldGVyczoKcm93cyAob3B0aW9uYWwpIGRlZmF1bHQgMjA8YnI+CmNvbHMgKG9wdGlvbmFsKSBkZWZhdWx0IDgwIDxicj4KZGVmYXVsdF92YWx1ZSAob3B0aW9uYWwpIC0gZGVmYXVsdCB2YWx1ZSBmb3IgdGV4dGFyZWE8YnI+CmRlc2NyaXB0aW9uIChvcHRpb25hbCkgLSBhZGRzIGFkZGl0aW9uYWwgdGV4dCBleHBsYW5hdGlvbiBmb3IgZWRpdG9yCjwvcD48YnI+Cgo8cD48c3Ryb25nPmVkaXRvciAodGV4dGFyZWEgd2l0aCB3eXNpd3lnKTwvc3Ryb25nPjwvcD4KPHA+RXhhbXBsZToge2NvbnRlbnRfbW9kdWxlIG1vZHVsZT0iRUNCMiIgZmllbGQ9ImVkaXRvciIgbGFiZWw9IlRleHRhcmVhIiBibG9jaz0idGVzdDciIHJvd3M9MTAgY29scz00MCBkZWZhdWx0X3ZhbHVlPSJmaWxsIGl0In08L3A+CjxwPlBhcmFtZXRlcnM6CnJvd3MgKG9wdGlvbmFsKSBkZWZhdWx0IDIwPGJyPgpjb2xzIChvcHRpb25hbCkgZGVmYXVsdCA4MCA8YnI+CmRlZmF1bHRfdmFsdWUgKG9wdGlvbmFsKSAtIGRlZmF1bHQgdmFsdWUgZm9yIHRleHRhcmVhPGJyPgpkZXNjcmlwdGlvbiAob3B0aW9uYWwpIC0gYWRkcyBhZGRpdGlvbmFsIHRleHQgZXhwbGFuYXRpb24gZm9yIGVkaXRvcgo8L3A+PGJyPgoKPHA+PHN0cm9uZz50ZXh0IDwvc3Ryb25nPjwvcD4KPHA+RXhhbXBsZToge2NvbnRlbnRfbW9kdWxlIG1vZHVsZT0iRUNCMiIgZmllbGQ9InRleHQiIGxhYmVsPSJUZXh0IiBibG9jaz0idGVzdDgiIHRleHQ9IkhlbGxvIHdvcmQhIn08L3A+CjxwPlBhcmFtZXRlcnM6CnRleHQgKHJlcXVpcmVkKSB0ZXh0IGluIGFkbWluIChhZGQgaW5mb3JtYXRpb24gZm9yIHVzZXJzKTxicj4KZGVzY3JpcHRpb24gKG9wdGlvbmFsKSAtIGFkZHMgYWRkaXRpb25hbCB0ZXh0IGV4cGxhbmF0aW9uIGZvciBlZGl0b3IKPC9wPjxicj4KCjxwPjxzdHJvbmc+cGFnZXMgPC9zdHJvbmc+PC9wPgo8cD5FeGFtcGxlOiB7Y29udGVudF9tb2R1bGUgbW9kdWxlPSJFQ0IyIiBmaWVsZD0icGFnZXMiIGxhYmVsPSJQYWdlIiBibG9jaz0idGVzdDEwIn08L3A+CjxwPlBhcmFtZXRlcnM6CmRlc2NyaXB0aW9uIChvcHRpb25hbCkgLSBhZGRzIGFkZGl0aW9uYWwgdGV4dCBleHBsYW5hdGlvbiBmb3IgZWRpdG9yCjwvcD48YnI+Cgo8cD48c3Ryb25nPmhyIChob3Jpem9udGFsIGxpbmUpPC9zdHJvbmc+PC9wPgo8cD5FeGFtcGxlOiB7Y29udGVudF9tb2R1bGUgbW9kdWxlPSJFQ0IyIiBmaWVsZD0iaHIiIGxhYmVsPSJPdGhlciBibG9ja3MiIGJsb2NrPSJibG9ja25hbWUifTxwPgpQYXJhbWV0ZXJzOgpkZXNjcmlwdGlvbiAob3B0aW9uYWwpIC0gYWRkcyBhZGRpdGlvbmFsIHRleHQgZXhwbGFuYXRpb24gZm9yIGVkaXRvcgo8L3A+PGJyPgoKPHA+PHN0cm9uZz5zb3J0YWJsZWxpc3Q8L3N0cm9uZz48L3A+CjxwPkV4YW1wbGU6IHtjb250ZW50X21vZHVsZSBtb2R1bGU9IkVDQjIiIGZpZWxkPSJzb3J0YWJsZWxpc3QiIGJsb2NrPSJ0ZXN0c29ydGFibGVsaXN0IiBsYWJlbD0iQ2hvb3NlIGZydWl0IiB1ZHQ9Im15ZHV0In08L3A+CjxwPlBhcmFtZXRlcnM6CnZhbHVlcyAob3B0aW9uYWwpIC0gY29tbWEgc2VwYXJhdGVkLiBFeGFtcGxlOiBcJ0FwcGxlPWFwcGxlLE9yYW5nZT1vcmFuZ2UsR3JlZW49Z3JlZW4sdmFsdWU9TGFiZWxcJyA8YnI+CnVkdCAob3B0aW9uYWwpIC0gbmFtZSBvZiB1ZHQgdGhhdCByZXR1cm5zIGFuIGFycmF5IGluIHRoZSBmb3JtYXQgXCd2YWx1ZVwnID0+IFwnTGFiZWxcJyw8YnI+CmZpcnN0X3ZhbHVlIChvcHRpb25hbCk8YnI+CmxhYmVsX2xlZnQgKG9wdGlvbmFsKTxicj4KbGFiZWxfcmlnaHQgKG9wdGlvbmFsKTxicj4KbWF4X251bWJlciAob3B0aW9uYWwpIC0gbGltaXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBpdGVtcyB0aGF0IGNhbiBiZSBzZWxlY3RlZDxicj4KcmVxdWlyZWRfbnVtYmVyIChvcHRpb25hbCkgLSBzZXRzIGEgc3BlY2lmaWMgbnVtYmVyIG9mIGl0ZW1zIHRoYXQgbXVzdCBiZSBzZWxlY3RlZCAob3Igbm9uZSk8YnI+CmRlc2NyaXB0aW9uIChvcHRpb25hbCkgLSBhZGRzIGFkZGl0aW9uYWwgdGV4dCBleHBsYW5hdGlvbiBmb3IgZWRpdG9yCjwvcD48YnI+Cgo8cD48c3Ryb25nPnJhZGlvPC9zdHJvbmc+IDwvcD4KPHA+RXhhbXBsZToge2NvbnRlbnRfbW9kdWxlIG1vZHVsZT0iRUNCMiIgZmllbGQ9InJhZGlvIiBibG9jaz0idGVzdDE3IiBsYWJlbD0iRnJ1aXQiIHZhbHVlcz0iQXBwbGU9YXBwbGUsT3JhbmdlPW9yYW5nZSxLaXdpZnJ1aXQ9a2l3aWZydWl0IiBkZWZhdWx0X3ZhbHVlPSJPcmFuZ2UifTwvcD4KPHA+UGFyYW1ldGVyczoKdmFsdWVzIChyZXF1aXJlZCkgLSBjb21tYSBzZXBhcmF0ZWQuIEV4YW1wbGU6IEFwcGxlPWFwcGxlLE9yYW5nZT1vcmFuZ2UsS2l3aWZydWl0PWtpd2lmcnVpdDxicj4KZGVmYXVsdF92YWx1ZSAob3B0aW9uYWwpIC0gZGVmYXVsdCBpcyBmaXJzdCBjaG9pY2UgLSBzZXQgdG8gZGVmYXVsdCB2YWx1ZSBlLmcuICJPcmFuZ2UiCmlubGluZSAob3B0aW9uYWwpIC0gaWYgc2V0IGRpc3BsYXlzIGFkbWluIHJhZGlvIGJ1dHRvbnMgaW5saW5lPGJyPgpkZXNjcmlwdGlvbiAob3B0aW9uYWwpIC0gYWRkcyBhZGRpdGlvbmFsIHRleHQgZXhwbGFuYXRpb24gZm9yIGVkaXRvcgo8L3A+PGJyPgoKPHA+PHN0cm9uZz5oaWRkZW48L3N0cm9uZz48L3A+CjxwPkV4YW1wbGU6IHtjb250ZW50X21vZHVsZSBtb2R1bGU9J0VDQjInIGJsb2NrPSd0ZXN0MThoaWRkZW4nIGFzc2lnbj0ndGVzdGhpZGRlbicgZmllbGQ9J2hpZGRlbicgdmFsdWU9J21hcmtlcnZhbHVlJ308YnI+CkNhbiBiZSB1c2VkIHRvIHNldCBhIHBhZ2UgYXR0cmlidXRlIHRoYXQgY2FuIHRoZW4gYmUgYWNjZXNzZWQgKGUuZy4gZnJvbSBhIE5hdmlnYXRvci1UZW1wbGF0ZSksIHVzaW5nIHtwYWdlX2F0dHIgcGFnZT0kbm9kZS0+YWxpYXMga2V5PSd0ZXN0aGlkZGVuJ308L3A+CjxwPlBhcmFtZXRlcnM6CnZhbHVlIChyZXF1aXJlZCkgLSBoaWRkZW4gdmFsdWUgdG8gYmUgc2F2ZWQ8YnI+CmRlc2NyaXB0aW9uIChvcHRpb25hbCkgLSBhZGRzIGFkZGl0aW9uYWwgdGV4dCBleHBsYW5hdGlvbiBmb3IgZWRpdG9yCjwvcD48YnI+Cgo8cD48c3Ryb25nPmZpZWxkc2V0X3N0YXJ0PC9zdHJvbmc+PC9wPgo8cD5FeGFtcGxlOiB7Y29udGVudF9tb2R1bGUgbW9kdWxlPSdFQ0IyJyBmaWVsZD0nZmllbGRzZXRfc3RhcnQnIGxhYmVsPScmIG5ic3A7JyBibG9jaz0ndGVzdDE5ZmllbGRzZXQnIGFzc2lnbj0ndGVzdDE5ZmllbGRzZXQnIGxlZ2VuZD0nRmllbGRzZXQgVGVzdCBMZWdlbmQnIGRlc2NyaXB0aW9uPSdDYW4gYWRkIGEgZGVzY3JpcHRpb24gaW4gaGVyZSd9PGJyPgpDcmVhdGVzIHRoZSBzdGFydCBvZiBhIGZpZWxkc2V0IGZvciBncm91cGluZyByZWxhdmFudCBhZG1pbiBmaWVsZHMgdG9nZXRoZXIuIE5vdGU6IGEgbWF0Y2hpbmcgJ2ZpZWxkc2V0X2VuZCcgYmxvY2sgaXMgcmVxdWlyZWQgZm9yIGVhY2ggZmllbGRzZXRfc3RhcnQuPGJyPgpUSVA6IHNldCBsYWJlbD0nJiBuYnNwOycgdG8gbm90IHNob3cgdGhlIGZpZWxkIGxhYmVsLjwvcD4KPHA+UGFyYW1ldGVyczoKbGVnZW5kIChvcHRpb25hbCkgLSBhZGRzIGFuIG9wdGlvbmFsIGxlZ2VuZCAoZGVmYXVsdCA9IG5vIGxlZ2VuZCk8YnI+CmRlc2NyaXB0aW9uIChvcHRpb25hbCkgLSBhZGRzIGFkZGl0aW9uYWwgdGV4dCBleHBsYW5hdGlvbiBmb3IgZWRpdG9yCjwvcD48YnI+Cgo8cD48c3Ryb25nPmZpZWxkc2V0X2VuZDwvc3Ryb25nPjwvcD4KPHA+RXhhbXBsZToge2NvbnRlbnRfbW9kdWxlIG1vZHVsZT0nRUNCMicgZmllbGQ9J2ZpZWxkc2V0X2VuZCcgbGFiZWw9JyYgbmJzcDsnIGJsb2NrPSd0ZXN0MTlmaWVsZHNldGVuZCcgYXNzaWduPSd0ZXN0MTlmaWVsZHNldGVuZCcgfTxicj4KQ3JlYXRlcyB0aGUgZW5kIG9mIGEgZmllbGRzZXQgZm9yIGdyb3VwaW5nIHJlbGF2YW50IGFkbWluIGZpZWxkcyB0b2dldGhlci4gTm90ZTogYSBtYXRjaGluZyAnZmllbGRzZXRfc3RhcnQnIGJsb2NrIGlzIHJlcXVpcmVkIGZvciBlYWNoIGZpZWxkc2V0X2VuZC48YnI+ClRJUDogc2V0IGxhYmVsPScmIG5ic3A7JyB0byBub3Qgc2hvdyB0aGUgZmllbGQgbGFiZWwuCjwvcD48YnI+CgoKPHA+PHN0cm9uZz5nYWxsZXJ5X3BpY2tlcjwvc3Ryb25nPiA8c3BhbiBzdHlsZT0iY29sb3I6cmVkOyI+bmV3PC9zcGFuPjwvcD4KPHA+UHJvdmlkZXMgYSBnYWxsZXJ5IHBpY2tlciBmb3IgdGhlIEdhbGxlcnkgbW9kdWxlLjwvcD4KPHA+RXhhbXBsZToKICAgICAge2NvbnRlbnRfbW9kdWxlIG1vZHVsZT0nRUNCMicgZmllbGQ9J2dhbGxlcnlfcGlja2VyJyBibG9jaz1wYWdlVG9wR2FsbGVyeSBsYWJlbD0nUGFnZSBUb3AgR2FsbGVyeScgZGlyPSdwYWdlLXRvcC1nYWxsZXJpZXMnfTwvcD4KPHA+UGFyYW1ldGVyczo8L3A+Cjx1bD4KICAgPGxpPmRpciAob3B0aW9uYWwpIC0gb25seSByZXR1cm5zIGdhbGxlcmllcyB0aGF0IGFyZSBzdWItZ2FsbGVyaWVzIG9mIHRoaXMgZ2FsbGVyeSBkaXIsIGRlZmF1bHQgaXMgYWxsIGdhbGxlcmllcywgZXhjbHVkaW5nIGRlZmF1bHQgdG9wIGxldmVsIGdhbGxlcnk8L2xpPgogICA8bGk+ZGVzY3JpcHRpb24gKG9wdGlvbmFsKSAtIGEgZGVzY3JpcHRpb24gb2YgdGhlIGZpZWxkPC9saT4KPC91bD4KPGJyPgoKCjxwPjxzdHJvbmc+ZHJvcGRvd25fZnJvbV9jdXN0b21nczwvc3Ryb25nPiA8c3BhbiBzdHlsZT0iY29sb3I6cmVkOyI+bmV3PC9zcGFuPjwvcD4KPHA+UHJvdmlkZXMgYSBzaW5nbGUgb3IgbXVsdGlwbGUgc2VsZWN0IHVzaW5nIHRoZSBjb250ZW50IHNldCBpbiBhIEN1c3RvbUdTIE1vZHVsZSBmaWVsZC48L3A+CjxwPlJlcXVpcmVzIHRoZSBDdXN0b21HUyBtb2R1bGUgYW5kIHRvIGhhdmUgYSBmaWVsZCBvZiB0eXBlICd0ZXh0IGFyZWEnLjwvcD4KPHA+RXhhbXBsZToKICAgICAge2NvbnRlbnRfbW9kdWxlIG1vZHVsZT0nRUNCMicgZmllbGQ9J2Ryb3Bkb3duX2Zyb21fY3VzdG9tZ3MnIGN1c3RvbWdzX2ZpZWxkPSdTZWN0aW9uX1N0eWxlcycgYmxvY2s9c3R5bGUxIGxhYmVsPSdTZWN0aW9uIDEgTGF5b3V0IFN0eWxlJyBhc3NpZ249c3R5bGUxfTwvcD4KPHA+UGFyYW1ldGVyczo8L3A+Cjx1bD4KICAgPGxpPmN1c3RvbWdzX2ZpZWxkIChyZXF1aXJlZCkgLSBuYW1lIG9mIGN1c3RvbWdzX2ZpZWxkIHRvIHJldHJpZXZlICh3aXRoIHVuZGVyc2NvcmVzIG5vdCBzcGFjZXMpPC9saT4KICAgPGxpPmRlc2NyaXB0aW9uIChvcHRpb25hbCkgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGUgZmllbGQ8L2xpPgogICA8bGk+bXVsdGlwbGUgKG9wdGlvbmFsKSAtIGFuIG9wdGlvbiBpZiBzZXQsIHRvIG91cHV0IGEgbXVsdGktc2VsZWN0IGJveCByYXRoZXIgdGhhbiBhIHNpbmdsZSBzZWxlY3QgZHJvd25kb3duPC9saT4KICAgPGxpPnNpemUgKG9wdGlvbmFsKSAtIGFuIG9wdGlvbiB0byBzZXQgdGhlIHNpemUgb2YgYSBtdWx0aS1zZWxlY3QgYm94PC9saT4KPC91bD4KPGJyPgoKCjxwPjxzdHJvbmc+aW5wdXRfcmVwZWF0ZXI8L3N0cm9uZz4gPHNwYW4gc3R5bGU9ImNvbG9yOnJlZDsiPm5ldzwvc3Bhbj48L3A+CjxwPlByb3ZpZGVzIG9uZSBvciBtb3JlIHRleHQgaW5wdXRzIHRoYXQgY2FuIGJlIGFkZGVkIG9yIHJlbW92ZWQgYnkgdGhlIGVkaXRvci48L3A+CjxwPlRoZSBjb250ZW50IGJsb2NrIG91dHB1dCBpcyBhIHN0cmluZyB3aXRoIGVhY2ggaW5wdXQgZmllbGQncyBjb250ZW50cyBkZWxpbWl0ZXIgYnkgJ3x8Jy4gVG8gbWFrZSB0aGUgb3V0cHV0IGEgbW9yZSB1c2VmdWwgYXJyYXkgdXNlICdleHBsb2RlJywgZS5nLiB7Inx8InxleHBsb2RlOiRjb250ZW50X2Jsb2NrX25hbWV9PC9wPgo8cD5FeGFtcGxlOgogICAgICB7JGlucHV0X3JlcGVhdGVyX3Rlc3Q9Inx8InxleHBsb2RlOiJ7Y29udGVudF9tb2R1bGUgbW9kdWxlPSdFQ0IyJyBmaWVsZD0naW5wdXRfcmVwZWF0ZXInIGxhYmVsPSdUZXN0IDIyOiBpbnB1dF9yZXBlYXRlcicgYmxvY2s9J3Rlc3QyMicgc2l6ZT01MCBtYXhfbGVuZ3RoPTI1NSBkZXNjcmlwdGlvbj0nUHJlc3MgKCspIGFuZCAoLSkgdG8gYWRkIGFuZCByZW1vdmUgYWRkaXRpb25hbCBpbnB1dCBmaWVsZHMnfSIgc2NvcGU9Z2xvYmFsfTwvcD4KPHA+VG8gdXNlOiB7JGlucHV0X3JlcGVhdGVyX3Rlc3R8cHJpbnRfcn08L3A+Cjxicj4KCgoKPGgzPlVwZ3JhZGUgZnJvbSBFQ0I8L2gzPgo8cD5JbnN0YWxsIEVDQjIgbW9kdWxlIGFuZCBjaGFuZ2UgYWxsICJtb2R1bGUiIHBhcmFtZXRlcnMsIGluIGNvbnRlbnRfbW9kdWxlIHRhZ3MgdG8gYmUgbW9kdWxlPSJFQ0IyIiAod2FzICJFQ0IiKS4gVGhlbiBFQ0IgY2FuIGJlIHVuaW5zdGFsbGVkLjwvcD48YnI+CkVPRDsKCgoKCgoKCgojIyMjIyMjIyMgICMjIyAgICAjIyMgICMjIyMjIyMjIyMgICMjIyAgICAjIyMgICMjIyMjIyMjIyAgIyMjIyMjIyMgICMjIyAgICAgICAjIyMjIyMjIyMgICMjIyMjIyMjIwojIyMjIyMjIyMgICMjIyAgICAjIyMgICMjIyMjIyMjIyMgICMjIyMgICAjIyMgICMjIyMjIyMjIyAgIyMjIyMjIyMgICMjIyAgICAgICAjIyMjIyMjIyMgICMjIyMjIyMjIwojIyMgICAgICAgICMjIyAgICAjIyMgICMjIyAgICAjIyMgICMjIyMjICAjIyMgICMjIyAgICAgICAgIyMjICAgICAgICMjIyAgICAgICAjIyMgICAjIyMgICMjIwojIyMgICAgICAgICMjIyMjIyMjIyMgICMjIyMjIyMjIyMgICMjIyAjIyAjIyMgICMjIyAgICAgICAgIyMjIyMjIyMgICMjIyAgICAgICAjIyMgICAjIyMgICMjIwojIyMgICAgICAgICMjIyMjIyMjIyMgICMjIyMjIyMjIyMgICMjIyAgIyMjIyMgICMjIyAgICMjIyAgIyMjIyMjIyMgICMjIyAgICAgICAjIyMgICAjIyMgICMjIyAgICMjIwojIyMgICAgICAgICMjIyAgICAjIyMgICMjIyAgICAjIyMgICMjIyAgICMjIyMgICMjIyAgICMjIyAgIyMjICAgICAgICMjIyAgICAgICAjIyMgICAjIyMgICMjIyAgICMjIwojIyMjIyMjIyMgICMjIyAgICAjIyMgICMjIyAgICAjIyMgICMjIyAgICAjIyMgICMjIyMjIyMjIyAgIyMjIyMjIyMgICMjIyMjIyMjIyAjIyMjIyMjIyMgICMjIyMjIyMjIwojIyMjIyMjIyMgICMjIyAgICAjIyMgICMjIyAgICAjIyMgICMjIyAgICAjIyMgICMjIyMjIyMjIyAgIyMjIyMjIyMgICMjIyMjIyMjIyAjIyMjIyMjIyMgICMjIyMjIyMjIwoKJGxhbmdbJ2NoYW5nZWxvZyddID0gPDw8J0VPRCcKCjxoMz5WZXJzaW9uIDEuNS4xIC0gMThGZWIxOTwvaDM+Cjx1bD4KICAgPGxpPmdhbGxlcnlfcGlja2VyIC0gYnVnIGZpeDwvbGk+CjwvdWw+Cjxicj4KCjxoMz5WZXJzaW9uIDEuNSAtIDE2RmViMTk8L2gzPgo8dWw+CiAgIDxsaT5pbnB1dF9yZXBlYXRlciBjb250ZW50IGJsb2NrIC0gYWRkZWQgLSB0aGFua3MgdG8gU2ltb24gUmFkZm9yZDwvbGk+CiAgIDxsaT5nYWxsZXJ5X3BpY2tlciBjb250ZW50IGJsb2NrIC0gYWRkZWQ8L2xpPgogICA8bGk+ZHJvcGRvd25fZnJvbV9jdXN0b21ncyBjb250ZW50IGJsb2NrIC0gYWRkZWQ8L2xpPgogICA8bGk+YWRkZWQgZXJyb3IgbWVzc2FnZSBmb3IgbWlzc2luZyBvciBpbmNvcnJlY3RseSBzcGVsdCBmaWVsZCBwYXJhbWF0ZXIgLSBCUiMxMTU1NyAtIHRoYW5rcyBMdWRnZXI8L2xpPgogICA8bGk+cmVtb3ZlZCBBZG1pbiBwYWdlIHRoYXQgb25seSBzaG93ZWQgaGVscCAtIHJlZHVuZGFudCBhcyBoZWxwIGVhc2lseSB2aXNpYmxlIGZyb20gd2l0aGluIE1vZHVsZSBNYW5hZ2VyPC9saT4KICAgPGxpPnJlbW92ZWQgUGVybWlzc2lvbiAnVXNlIEVDQjInIC0gYWxzbyByZWR1bmRhbnQ8L2xpPgogICA8bGk+Y29kZSB0aWR5IHVwIC0gY29uc29saWRhdGUganMgJiBjc3MgaW50byBzZXBhcmF0ZSBleHRlcm5hbCBmaWxlczwvbGk+CjwvdWw+Cjxicj4KCjxoMz5WZXJzaW9uIDEuMy4xIC0gMTJKdWwxNzwvaDM+Cjx1bD4KICAgPGxpPm1pbm9yIGJ1ZyBmaXg8L2xpPgo8L3VsPgo8YnI+Cgo8aDM+VmVyc2lvbiAxLjMgLSAxMUp1bDE3PC9oMz4KPHVsPgogICA8bGk+c29ydGFibGVsaXN0IC0gYWRkZWQgbWF4X251bWJlciBhbmQgcmVxdWlyZWRfbnVtYmVyIG9wdGlvbnM8L2xpPgogICA8bGk+QWRkZWQgJ2ZpZWxkc2V0X3N0YXJ0JyBhbmQgJ2ZpZWxkc2V0X2VuZCcgZmllbGRzPC9saT4KPC91bD4KPGJyPgoKPGgzPlZlcnNpb24gMS4yLjIgLSAwNUp1bDE3PC9oMz4KPHVsPgogICA8bGk+dGVzdCBmb3IgYW5kIGRpc3BsYXkgd2FybmluZyBpbiBhZG1pbiBpZiBVRFQgZG9lcyBub3QgZXhpc3Q8L2xpPgo8L3VsPgo8YnI+Cgo8aDM+VmVyc2lvbiAxLjIuMSAtIDE5QXByMTc8L2gzPgo8dWw+CiAgIDxsaT5idWcgZml4IGZvciBjb2xvcl9waWNrZXIsIGRlZmF1bHRfdmFsdWUgLSBCUiMxMTM1NCAtIHRoYW5rcyBTdHVhcnQ8L2xpPgogICA8bGk+Y29sb3JfcGlja2VyIC0gdHdlYWtlZCBsYXlvdXQ8L2xpPgogICA8bGk+c29ydGFibGVsaXN0IC0gbm93IHVzZSBqcXVlcnkgc29ydGFibGUgaW5zdGVhZCBvZiBDR0V4dGVuc2lvbnMuIFBhcmFtZXRlcnMgcmVtb3ZlZDogJ3RlbXBsYXRlJy4gUGFyYW1ldGVycyBub3Qgb3BlcmF0aW9uYWw6ICdtYXhfc2VsZWN0ZWQnLCAnYWxsb3dkdXBsaWNhdGVzJyAocGxlYXNlIGFkdmlzZSBpZiB5b3UgcmVxdWlyZSB0aGVzZSkuIFBsdXMgc29tZSBidWcgZml4ZXMuPC9saT4KPC91bD4KPGJyPgoKPGgzPlZlcnNpb24gMS4yIC0gMDdOb3YxNjwvaDM+Cjx1bD4KICAgPGxpPkFkZGVkICdkZXNjcmlwdGlvbicgcGFyYW1ldGVyIGZvciBhbGwgZmllbGRzIChvcHRpb25hbCkgLSBhZGRzIGFkZGl0aW9uYWwgdGV4dCBleHBsYW5hdGlvbiBmb3IgZWRpdG9yPC9saT4KICAgPGxpPkFkZGVkICdoaWRkZW4nIGZpZWxkIC0gQ2FuIGJlIHVzZWQgdG8gc2V0IGEgcGFnZSBhdHRyaWJ1dGUgdGhhdCBjYW4gdGhlbiBiZSBhY2Nlc3NlZCAoZS5nLiBmcm9tIGEgTmF2aWdhdG9yLVRlbXBsYXRlKSwgdXNpbmcge3BhZ2VfYXR0ciBwYWdlPSRub2RlLT5hbGlhcyBrZXk9J3Rlc3RoaWRkZW4nfTwvbGk+CiAgIDxsaT5CdWcgZml4IC0gZm9yIHBocCBub3RpY2U8L2xpPgo8L3VsPgo8YnI+Cgo8aDM+VmVyc2lvbiAxLjEgLSAxNUFwcjE2PC9oMz4KPHVsPgogICAgPGxpPkJ1ZyBmaXg8L2xpPgo8L3VsPgo8YnI+Cgo8aDM+VmVyc2lvbiAxLjAgLSAxNUFwcjE2PC9oMz4KPHVsPgogICAgPGxpPkluaXRpYWwgcmVsZWFzZS4gQSBmb3JrIG9mIEVDQiBtb2R1bGUgdjEuNiwgdGhhdCBpcyBjb21wYXRpYmxlIHdpdGggQ01TTVMgdjIrPC9saT4KICAgIDxsaT5BZGRlZCByYWRpbyBmaWVsZCAtIHRvIHByb3ZpZGUgcmFkaW8gYnV0dG9ucyBvbiBhbiBhZG1pbiBwYWdlPC9saT4KPC91bD4KPGJyPgpFT0Q7CgoKCj8+]]></data>
	</file>
	<file>
	  <filename>/lang/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCEtLSBEVU1NWSBIVE1MIEZJTEUgLS0+]]></data>
	</file>
	<file>
	  <filename>/lang/LICENCE.txt</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Iy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KIyBNb2R1bGU6IEVDQjIgLSBFeHRlbmRlZCBDb250ZW50IEJsb2NrcyAyDQojIEF1dGhvcjogQ2hyaXMgVGF5bG9yDQojIENvcHlyaWdodDogKEMpIDIwMTYgQ2hyaXMgVGF5bG9yLCBjaHJpc0BiaW5ub3ZhdGl2ZS5jby51aw0KIyBMaWNlbmNlOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMNCiMgICAgICAgICAgc2VlIC9FQ0IyL2xhbmcvTElDRU5DRS50eHQgb3IgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+DQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIEEgZm9yayBvZiBtb2R1bGU6IEV4dGVuZGVkIENvbnRlbnQgQmxvY2tzIChFQ0IpDQojIE9yaWdpbmFsIEF1dGhvcjogWmRlbm8gS3V6bWFueSAoemRlbm9Aa3V6bWFueS5iaXopIC8ga3V6bWFueS5iaXogIC8gdHdpdHRlci5jb20va3V6bWFueQ0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMTEgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQ0KIyBQcm9qZWN0J3MgaG9tZXBhZ2UgaXM6IGh0dHA6Ly93d3cuY21zbWFkZXNpbXBsZS5vcmcNCiMgTW9kdWxlJ3MgaG9tZXBhZ2UgaXM6IGh0dHA6Ly9kZXYuY21zbWFkZXNpbXBsZS5vcmcvcHJvamVjdHMvZWNiMg0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlDQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzDQojIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KIw0KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOw0KIyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLg0KIyBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQojDQojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLg0KIyBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiAgICAgICAgICAgICAgICAgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UNCiAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAzLCAyOSBKdW5lIDIwMDcNCg0KIENvcHlyaWdodCAoQykgMjAwNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4gPGh0dHA6Ly9mc2Yub3JnLz4NCiBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMNCiBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZWFtYmxlDQoNCiAgVGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGEgZnJlZSwgY29weWxlZnQgbGljZW5zZSBmb3INCnNvZnR3YXJlIGFuZCBvdGhlciBraW5kcyBvZiB3b3Jrcy4NCg0KICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYW5kIG90aGVyIHByYWN0aWNhbCB3b3JrcyBhcmUgZGVzaWduZWQNCnRvIHRha2UgYXdheSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSB0aGUgd29ya3MuICBCeSBjb250cmFzdCwNCnRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvDQpzaGFyZSBhbmQgY2hhbmdlIGFsbCB2ZXJzaW9ucyBvZiBhIHByb2dyYW0tLXRvIG1ha2Ugc3VyZSBpdCByZW1haW5zIGZyZWUNCnNvZnR3YXJlIGZvciBhbGwgaXRzIHVzZXJzLiAgV2UsIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHVzZSB0aGUNCkdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3N0IG9mIG91ciBzb2Z0d2FyZTsgaXQgYXBwbGllcyBhbHNvIHRvDQphbnkgb3RoZXIgd29yayByZWxlYXNlZCB0aGlzIHdheSBieSBpdHMgYXV0aG9ycy4gIFlvdSBjYW4gYXBwbHkgaXQgdG8NCnlvdXIgcHJvZ3JhbXMsIHRvby4NCg0KICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90DQpwcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91DQpoYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yDQp0aGVtIGlmIHlvdSB3aXNoKSwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0IGl0IGlmIHlvdQ0Kd2FudCBpdCwgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgb3IgdXNlIHBpZWNlcyBvZiBpdCBpbiBuZXcNCmZyZWUgcHJvZ3JhbXMsIGFuZCB0aGF0IHlvdSBrbm93IHlvdSBjYW4gZG8gdGhlc2UgdGhpbmdzLg0KDQogIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gcHJldmVudCBvdGhlcnMgZnJvbSBkZW55aW5nIHlvdQ0KdGhlc2UgcmlnaHRzIG9yIGFza2luZyB5b3UgdG8gc3VycmVuZGVyIHRoZSByaWdodHMuICBUaGVyZWZvcmUsIHlvdSBoYXZlDQpjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSwgb3IgaWYNCnlvdSBtb2RpZnkgaXQ6IHJlc3BvbnNpYmlsaXRpZXMgdG8gcmVzcGVjdCB0aGUgZnJlZWRvbSBvZiBvdGhlcnMuDQoNCiAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiBzdWNoIGEgcHJvZ3JhbSwgd2hldGhlcg0KZ3JhdGlzIG9yIGZvciBhIGZlZSwgeW91IG11c3QgcGFzcyBvbiB0byB0aGUgcmVjaXBpZW50cyB0aGUgc2FtZQ0KZnJlZWRvbXMgdGhhdCB5b3UgcmVjZWl2ZWQuICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUNCm9yIGNhbiBnZXQgdGhlIHNvdXJjZSBjb2RlLiAgQW5kIHlvdSBtdXN0IHNob3cgdGhlbSB0aGVzZSB0ZXJtcyBzbyB0aGV5DQprbm93IHRoZWlyIHJpZ2h0cy4NCg0KICBEZXZlbG9wZXJzIHRoYXQgdXNlIHRoZSBHTlUgR1BMIHByb3RlY3QgeW91ciByaWdodHMgd2l0aCB0d28gc3RlcHM6DQooMSkgYXNzZXJ0IGNvcHlyaWdodCBvbiB0aGUgc29mdHdhcmUsIGFuZCAoMikgb2ZmZXIgeW91IHRoaXMgTGljZW5zZQ0KZ2l2aW5nIHlvdSBsZWdhbCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSBpdC4NCg0KICBGb3IgdGhlIGRldmVsb3BlcnMnIGFuZCBhdXRob3JzJyBwcm90ZWN0aW9uLCB0aGUgR1BMIGNsZWFybHkgZXhwbGFpbnMNCnRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoaXMgZnJlZSBzb2Z0d2FyZS4gIEZvciBib3RoIHVzZXJzJyBhbmQNCmF1dGhvcnMnIHNha2UsIHRoZSBHUEwgcmVxdWlyZXMgdGhhdCBtb2RpZmllZCB2ZXJzaW9ucyBiZSBtYXJrZWQgYXMNCmNoYW5nZWQsIHNvIHRoYXQgdGhlaXIgcHJvYmxlbXMgd2lsbCBub3QgYmUgYXR0cmlidXRlZCBlcnJvbmVvdXNseSB0bw0KYXV0aG9ycyBvZiBwcmV2aW91cyB2ZXJzaW9ucy4NCg0KICBTb21lIGRldmljZXMgYXJlIGRlc2lnbmVkIHRvIGRlbnkgdXNlcnMgYWNjZXNzIHRvIGluc3RhbGwgb3IgcnVuDQptb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgc29mdHdhcmUgaW5zaWRlIHRoZW0sIGFsdGhvdWdoIHRoZSBtYW51ZmFjdHVyZXINCmNhbiBkbyBzby4gIFRoaXMgaXMgZnVuZGFtZW50YWxseSBpbmNvbXBhdGlibGUgd2l0aCB0aGUgYWltIG9mDQpwcm90ZWN0aW5nIHVzZXJzJyBmcmVlZG9tIHRvIGNoYW5nZSB0aGUgc29mdHdhcmUuICBUaGUgc3lzdGVtYXRpYw0KcGF0dGVybiBvZiBzdWNoIGFidXNlIG9jY3VycyBpbiB0aGUgYXJlYSBvZiBwcm9kdWN0cyBmb3IgaW5kaXZpZHVhbHMgdG8NCnVzZSwgd2hpY2ggaXMgcHJlY2lzZWx5IHdoZXJlIGl0IGlzIG1vc3QgdW5hY2NlcHRhYmxlLiAgVGhlcmVmb3JlLCB3ZQ0KaGF2ZSBkZXNpZ25lZCB0aGlzIHZlcnNpb24gb2YgdGhlIEdQTCB0byBwcm9oaWJpdCB0aGUgcHJhY3RpY2UgZm9yIHRob3NlDQpwcm9kdWN0cy4gIElmIHN1Y2ggcHJvYmxlbXMgYXJpc2Ugc3Vic3RhbnRpYWxseSBpbiBvdGhlciBkb21haW5zLCB3ZQ0Kc3RhbmQgcmVhZHkgdG8gZXh0ZW5kIHRoaXMgcHJvdmlzaW9uIHRvIHRob3NlIGRvbWFpbnMgaW4gZnV0dXJlIHZlcnNpb25zDQpvZiB0aGUgR1BMLCBhcyBuZWVkZWQgdG8gcHJvdGVjdCB0aGUgZnJlZWRvbSBvZiB1c2Vycy4NCg0KICBGaW5hbGx5LCBldmVyeSBwcm9ncmFtIGlzIHRocmVhdGVuZWQgY29uc3RhbnRseSBieSBzb2Z0d2FyZSBwYXRlbnRzLg0KU3RhdGVzIHNob3VsZCBub3QgYWxsb3cgcGF0ZW50cyB0byByZXN0cmljdCBkZXZlbG9wbWVudCBhbmQgdXNlIG9mDQpzb2Z0d2FyZSBvbiBnZW5lcmFsLXB1cnBvc2UgY29tcHV0ZXJzLCBidXQgaW4gdGhvc2UgdGhhdCBkbywgd2Ugd2lzaCB0bw0KYXZvaWQgdGhlIHNwZWNpYWwgZGFuZ2VyIHRoYXQgcGF0ZW50cyBhcHBsaWVkIHRvIGEgZnJlZSBwcm9ncmFtIGNvdWxkDQptYWtlIGl0IGVmZmVjdGl2ZWx5IHByb3ByaWV0YXJ5LiAgVG8gcHJldmVudCB0aGlzLCB0aGUgR1BMIGFzc3VyZXMgdGhhdA0KcGF0ZW50cyBjYW5ub3QgYmUgdXNlZCB0byByZW5kZXIgdGhlIHByb2dyYW0gbm9uLWZyZWUuDQoNCiAgVGhlIHByZWNpc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQNCm1vZGlmaWNhdGlvbiBmb2xsb3cuDQoNCiAgICAgICAgICAgICAgICAgICAgICAgVEVSTVMgQU5EIENPTkRJVElPTlMNCg0KICAwLiBEZWZpbml0aW9ucy4NCg0KICAiVGhpcyBMaWNlbnNlIiByZWZlcnMgdG8gdmVyc2lvbiAzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4NCg0KICAiQ29weXJpZ2h0IiBhbHNvIG1lYW5zIGNvcHlyaWdodC1saWtlIGxhd3MgdGhhdCBhcHBseSB0byBvdGhlciBraW5kcyBvZg0Kd29ya3MsIHN1Y2ggYXMgc2VtaWNvbmR1Y3RvciBtYXNrcy4NCg0KICAiVGhlIFByb2dyYW0iIHJlZmVycyB0byBhbnkgY29weXJpZ2h0YWJsZSB3b3JrIGxpY2Vuc2VkIHVuZGVyIHRoaXMNCkxpY2Vuc2UuICBFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4gICJMaWNlbnNlZXMiIGFuZA0KInJlY2lwaWVudHMiIG1heSBiZSBpbmRpdmlkdWFscyBvciBvcmdhbml6YXRpb25zLg0KDQogIFRvICJtb2RpZnkiIGEgd29yayBtZWFucyB0byBjb3B5IGZyb20gb3IgYWRhcHQgYWxsIG9yIHBhcnQgb2YgdGhlIHdvcmsNCmluIGEgZmFzaGlvbiByZXF1aXJpbmcgY29weXJpZ2h0IHBlcm1pc3Npb24sIG90aGVyIHRoYW4gdGhlIG1ha2luZyBvZiBhbg0KZXhhY3QgY29weS4gIFRoZSByZXN1bHRpbmcgd29yayBpcyBjYWxsZWQgYSAibW9kaWZpZWQgdmVyc2lvbiIgb2YgdGhlDQplYXJsaWVyIHdvcmsgb3IgYSB3b3JrICJiYXNlZCBvbiIgdGhlIGVhcmxpZXIgd29yay4NCg0KICBBICJjb3ZlcmVkIHdvcmsiIG1lYW5zIGVpdGhlciB0aGUgdW5tb2RpZmllZCBQcm9ncmFtIG9yIGEgd29yayBiYXNlZA0Kb24gdGhlIFByb2dyYW0uDQoNCiAgVG8gInByb3BhZ2F0ZSIgYSB3b3JrIG1lYW5zIHRvIGRvIGFueXRoaW5nIHdpdGggaXQgdGhhdCwgd2l0aG91dA0KcGVybWlzc2lvbiwgd291bGQgbWFrZSB5b3UgZGlyZWN0bHkgb3Igc2Vjb25kYXJpbHkgbGlhYmxlIGZvcg0KaW5mcmluZ2VtZW50IHVuZGVyIGFwcGxpY2FibGUgY29weXJpZ2h0IGxhdywgZXhjZXB0IGV4ZWN1dGluZyBpdCBvbiBhDQpjb21wdXRlciBvciBtb2RpZnlpbmcgYSBwcml2YXRlIGNvcHkuICBQcm9wYWdhdGlvbiBpbmNsdWRlcyBjb3B5aW5nLA0KZGlzdHJpYnV0aW9uICh3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uKSwgbWFraW5nIGF2YWlsYWJsZSB0byB0aGUNCnB1YmxpYywgYW5kIGluIHNvbWUgY291bnRyaWVzIG90aGVyIGFjdGl2aXRpZXMgYXMgd2VsbC4NCg0KICBUbyAiY29udmV5IiBhIHdvcmsgbWVhbnMgYW55IGtpbmQgb2YgcHJvcGFnYXRpb24gdGhhdCBlbmFibGVzIG90aGVyDQpwYXJ0aWVzIHRvIG1ha2Ugb3IgcmVjZWl2ZSBjb3BpZXMuICBNZXJlIGludGVyYWN0aW9uIHdpdGggYSB1c2VyIHRocm91Z2gNCmEgY29tcHV0ZXIgbmV0d29yaywgd2l0aCBubyB0cmFuc2ZlciBvZiBhIGNvcHksIGlzIG5vdCBjb252ZXlpbmcuDQoNCiAgQW4gaW50ZXJhY3RpdmUgdXNlciBpbnRlcmZhY2UgZGlzcGxheXMgIkFwcHJvcHJpYXRlIExlZ2FsIE5vdGljZXMiDQp0byB0aGUgZXh0ZW50IHRoYXQgaXQgaW5jbHVkZXMgYSBjb252ZW5pZW50IGFuZCBwcm9taW5lbnRseSB2aXNpYmxlDQpmZWF0dXJlIHRoYXQgKDEpIGRpc3BsYXlzIGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UsIGFuZCAoMikNCnRlbGxzIHRoZSB1c2VyIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoZSB3b3JrIChleGNlcHQgdG8gdGhlDQpleHRlbnQgdGhhdCB3YXJyYW50aWVzIGFyZSBwcm92aWRlZCksIHRoYXQgbGljZW5zZWVzIG1heSBjb252ZXkgdGhlDQp3b3JrIHVuZGVyIHRoaXMgTGljZW5zZSwgYW5kIGhvdyB0byB2aWV3IGEgY29weSBvZiB0aGlzIExpY2Vuc2UuICBJZg0KdGhlIGludGVyZmFjZSBwcmVzZW50cyBhIGxpc3Qgb2YgdXNlciBjb21tYW5kcyBvciBvcHRpb25zLCBzdWNoIGFzIGENCm1lbnUsIGEgcHJvbWluZW50IGl0ZW0gaW4gdGhlIGxpc3QgbWVldHMgdGhpcyBjcml0ZXJpb24uDQoNCiAgMS4gU291cmNlIENvZGUuDQoNCiAgVGhlICJzb3VyY2UgY29kZSIgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsNCmZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gICJPYmplY3QgY29kZSIgbWVhbnMgYW55IG5vbi1zb3VyY2UNCmZvcm0gb2YgYSB3b3JrLg0KDQogIEEgIlN0YW5kYXJkIEludGVyZmFjZSIgbWVhbnMgYW4gaW50ZXJmYWNlIHRoYXQgZWl0aGVyIGlzIGFuIG9mZmljaWFsDQpzdGFuZGFyZCBkZWZpbmVkIGJ5IGEgcmVjb2duaXplZCBzdGFuZGFyZHMgYm9keSwgb3IsIGluIHRoZSBjYXNlIG9mDQppbnRlcmZhY2VzIHNwZWNpZmllZCBmb3IgYSBwYXJ0aWN1bGFyIHByb2dyYW1taW5nIGxhbmd1YWdlLCBvbmUgdGhhdA0KaXMgd2lkZWx5IHVzZWQgYW1vbmcgZGV2ZWxvcGVycyB3b3JraW5nIGluIHRoYXQgbGFuZ3VhZ2UuDQoNCiAgVGhlICJTeXN0ZW0gTGlicmFyaWVzIiBvZiBhbiBleGVjdXRhYmxlIHdvcmsgaW5jbHVkZSBhbnl0aGluZywgb3RoZXINCnRoYW4gdGhlIHdvcmsgYXMgYSB3aG9sZSwgdGhhdCAoYSkgaXMgaW5jbHVkZWQgaW4gdGhlIG5vcm1hbCBmb3JtIG9mDQpwYWNrYWdpbmcgYSBNYWpvciBDb21wb25lbnQsIGJ1dCB3aGljaCBpcyBub3QgcGFydCBvZiB0aGF0IE1ham9yDQpDb21wb25lbnQsIGFuZCAoYikgc2VydmVzIG9ubHkgdG8gZW5hYmxlIHVzZSBvZiB0aGUgd29yayB3aXRoIHRoYXQNCk1ham9yIENvbXBvbmVudCwgb3IgdG8gaW1wbGVtZW50IGEgU3RhbmRhcmQgSW50ZXJmYWNlIGZvciB3aGljaCBhbg0KaW1wbGVtZW50YXRpb24gaXMgYXZhaWxhYmxlIHRvIHRoZSBwdWJsaWMgaW4gc291cmNlIGNvZGUgZm9ybS4gIEENCiJNYWpvciBDb21wb25lbnQiLCBpbiB0aGlzIGNvbnRleHQsIG1lYW5zIGEgbWFqb3IgZXNzZW50aWFsIGNvbXBvbmVudA0KKGtlcm5lbCwgd2luZG93IHN5c3RlbSwgYW5kIHNvIG9uKSBvZiB0aGUgc3BlY2lmaWMgb3BlcmF0aW5nIHN5c3RlbQ0KKGlmIGFueSkgb24gd2hpY2ggdGhlIGV4ZWN1dGFibGUgd29yayBydW5zLCBvciBhIGNvbXBpbGVyIHVzZWQgdG8NCnByb2R1Y2UgdGhlIHdvcmssIG9yIGFuIG9iamVjdCBjb2RlIGludGVycHJldGVyIHVzZWQgdG8gcnVuIGl0Lg0KDQogIFRoZSAiQ29ycmVzcG9uZGluZyBTb3VyY2UiIGZvciBhIHdvcmsgaW4gb2JqZWN0IGNvZGUgZm9ybSBtZWFucyBhbGwNCnRoZSBzb3VyY2UgY29kZSBuZWVkZWQgdG8gZ2VuZXJhdGUsIGluc3RhbGwsIGFuZCAoZm9yIGFuIGV4ZWN1dGFibGUNCndvcmspIHJ1biB0aGUgb2JqZWN0IGNvZGUgYW5kIHRvIG1vZGlmeSB0aGUgd29yaywgaW5jbHVkaW5nIHNjcmlwdHMgdG8NCmNvbnRyb2wgdGhvc2UgYWN0aXZpdGllcy4gIEhvd2V2ZXIsIGl0IGRvZXMgbm90IGluY2x1ZGUgdGhlIHdvcmsncw0KU3lzdGVtIExpYnJhcmllcywgb3IgZ2VuZXJhbC1wdXJwb3NlIHRvb2xzIG9yIGdlbmVyYWxseSBhdmFpbGFibGUgZnJlZQ0KcHJvZ3JhbXMgd2hpY2ggYXJlIHVzZWQgdW5tb2RpZmllZCBpbiBwZXJmb3JtaW5nIHRob3NlIGFjdGl2aXRpZXMgYnV0DQp3aGljaCBhcmUgbm90IHBhcnQgb2YgdGhlIHdvcmsuICBGb3IgZXhhbXBsZSwgQ29ycmVzcG9uZGluZyBTb3VyY2UNCmluY2x1ZGVzIGludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzIGFzc29jaWF0ZWQgd2l0aCBzb3VyY2UgZmlsZXMgZm9yDQp0aGUgd29yaywgYW5kIHRoZSBzb3VyY2UgY29kZSBmb3Igc2hhcmVkIGxpYnJhcmllcyBhbmQgZHluYW1pY2FsbHkNCmxpbmtlZCBzdWJwcm9ncmFtcyB0aGF0IHRoZSB3b3JrIGlzIHNwZWNpZmljYWxseSBkZXNpZ25lZCB0byByZXF1aXJlLA0Kc3VjaCBhcyBieSBpbnRpbWF0ZSBkYXRhIGNvbW11bmljYXRpb24gb3IgY29udHJvbCBmbG93IGJldHdlZW4gdGhvc2UNCnN1YnByb2dyYW1zIGFuZCBvdGhlciBwYXJ0cyBvZiB0aGUgd29yay4NCg0KICBUaGUgQ29ycmVzcG9uZGluZyBTb3VyY2UgbmVlZCBub3QgaW5jbHVkZSBhbnl0aGluZyB0aGF0IHVzZXJzDQpjYW4gcmVnZW5lcmF0ZSBhdXRvbWF0aWNhbGx5IGZyb20gb3RoZXIgcGFydHMgb2YgdGhlIENvcnJlc3BvbmRpbmcNClNvdXJjZS4NCg0KICBUaGUgQ29ycmVzcG9uZGluZyBTb3VyY2UgZm9yIGEgd29yayBpbiBzb3VyY2UgY29kZSBmb3JtIGlzIHRoYXQNCnNhbWUgd29yay4NCg0KICAyLiBCYXNpYyBQZXJtaXNzaW9ucy4NCg0KICBBbGwgcmlnaHRzIGdyYW50ZWQgdW5kZXIgdGhpcyBMaWNlbnNlIGFyZSBncmFudGVkIGZvciB0aGUgdGVybSBvZg0KY29weXJpZ2h0IG9uIHRoZSBQcm9ncmFtLCBhbmQgYXJlIGlycmV2b2NhYmxlIHByb3ZpZGVkIHRoZSBzdGF0ZWQNCmNvbmRpdGlvbnMgYXJlIG1ldC4gIFRoaXMgTGljZW5zZSBleHBsaWNpdGx5IGFmZmlybXMgeW91ciB1bmxpbWl0ZWQNCnBlcm1pc3Npb24gdG8gcnVuIHRoZSB1bm1vZGlmaWVkIFByb2dyYW0uICBUaGUgb3V0cHV0IGZyb20gcnVubmluZyBhDQpjb3ZlcmVkIHdvcmsgaXMgY292ZXJlZCBieSB0aGlzIExpY2Vuc2Ugb25seSBpZiB0aGUgb3V0cHV0LCBnaXZlbiBpdHMNCmNvbnRlbnQsIGNvbnN0aXR1dGVzIGEgY292ZXJlZCB3b3JrLiAgVGhpcyBMaWNlbnNlIGFja25vd2xlZGdlcyB5b3VyDQpyaWdodHMgb2YgZmFpciB1c2Ugb3Igb3RoZXIgZXF1aXZhbGVudCwgYXMgcHJvdmlkZWQgYnkgY29weXJpZ2h0IGxhdy4NCg0KICBZb3UgbWF5IG1ha2UsIHJ1biBhbmQgcHJvcGFnYXRlIGNvdmVyZWQgd29ya3MgdGhhdCB5b3UgZG8gbm90DQpjb252ZXksIHdpdGhvdXQgY29uZGl0aW9ucyBzbyBsb25nIGFzIHlvdXIgbGljZW5zZSBvdGhlcndpc2UgcmVtYWlucw0KaW4gZm9yY2UuICBZb3UgbWF5IGNvbnZleSBjb3ZlcmVkIHdvcmtzIHRvIG90aGVycyBmb3IgdGhlIHNvbGUgcHVycG9zZQ0Kb2YgaGF2aW5nIHRoZW0gbWFrZSBtb2RpZmljYXRpb25zIGV4Y2x1c2l2ZWx5IGZvciB5b3UsIG9yIHByb3ZpZGUgeW91DQp3aXRoIGZhY2lsaXRpZXMgZm9yIHJ1bm5pbmcgdGhvc2Ugd29ya3MsIHByb3ZpZGVkIHRoYXQgeW91IGNvbXBseSB3aXRoDQp0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIGluIGNvbnZleWluZyBhbGwgbWF0ZXJpYWwgZm9yIHdoaWNoIHlvdSBkbw0Kbm90IGNvbnRyb2wgY29weXJpZ2h0LiAgVGhvc2UgdGh1cyBtYWtpbmcgb3IgcnVubmluZyB0aGUgY292ZXJlZCB3b3Jrcw0KZm9yIHlvdSBtdXN0IGRvIHNvIGV4Y2x1c2l2ZWx5IG9uIHlvdXIgYmVoYWxmLCB1bmRlciB5b3VyIGRpcmVjdGlvbg0KYW5kIGNvbnRyb2wsIG9uIHRlcm1zIHRoYXQgcHJvaGliaXQgdGhlbSBmcm9tIG1ha2luZyBhbnkgY29waWVzIG9mDQp5b3VyIGNvcHlyaWdodGVkIG1hdGVyaWFsIG91dHNpZGUgdGhlaXIgcmVsYXRpb25zaGlwIHdpdGggeW91Lg0KDQogIENvbnZleWluZyB1bmRlciBhbnkgb3RoZXIgY2lyY3Vtc3RhbmNlcyBpcyBwZXJtaXR0ZWQgc29sZWx5IHVuZGVyDQp0aGUgY29uZGl0aW9ucyBzdGF0ZWQgYmVsb3cuICBTdWJsaWNlbnNpbmcgaXMgbm90IGFsbG93ZWQ7IHNlY3Rpb24gMTANCm1ha2VzIGl0IHVubmVjZXNzYXJ5Lg0KDQogIDMuIFByb3RlY3RpbmcgVXNlcnMnIExlZ2FsIFJpZ2h0cyBGcm9tIEFudGktQ2lyY3VtdmVudGlvbiBMYXcuDQoNCiAgTm8gY292ZXJlZCB3b3JrIHNoYWxsIGJlIGRlZW1lZCBwYXJ0IG9mIGFuIGVmZmVjdGl2ZSB0ZWNobm9sb2dpY2FsDQptZWFzdXJlIHVuZGVyIGFueSBhcHBsaWNhYmxlIGxhdyBmdWxmaWxsaW5nIG9ibGlnYXRpb25zIHVuZGVyIGFydGljbGUNCjExIG9mIHRoZSBXSVBPIGNvcHlyaWdodCB0cmVhdHkgYWRvcHRlZCBvbiAyMCBEZWNlbWJlciAxOTk2LCBvcg0Kc2ltaWxhciBsYXdzIHByb2hpYml0aW5nIG9yIHJlc3RyaWN0aW5nIGNpcmN1bXZlbnRpb24gb2Ygc3VjaA0KbWVhc3VyZXMuDQoNCiAgV2hlbiB5b3UgY29udmV5IGEgY292ZXJlZCB3b3JrLCB5b3Ugd2FpdmUgYW55IGxlZ2FsIHBvd2VyIHRvIGZvcmJpZA0KY2lyY3VtdmVudGlvbiBvZiB0ZWNobm9sb2dpY2FsIG1lYXN1cmVzIHRvIHRoZSBleHRlbnQgc3VjaCBjaXJjdW12ZW50aW9uDQppcyBlZmZlY3RlZCBieSBleGVyY2lzaW5nIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2Ugd2l0aCByZXNwZWN0IHRvDQp0aGUgY292ZXJlZCB3b3JrLCBhbmQgeW91IGRpc2NsYWltIGFueSBpbnRlbnRpb24gdG8gbGltaXQgb3BlcmF0aW9uIG9yDQptb2RpZmljYXRpb24gb2YgdGhlIHdvcmsgYXMgYSBtZWFucyBvZiBlbmZvcmNpbmcsIGFnYWluc3QgdGhlIHdvcmsncw0KdXNlcnMsIHlvdXIgb3IgdGhpcmQgcGFydGllcycgbGVnYWwgcmlnaHRzIHRvIGZvcmJpZCBjaXJjdW12ZW50aW9uIG9mDQp0ZWNobm9sb2dpY2FsIG1lYXN1cmVzLg0KDQogIDQuIENvbnZleWluZyBWZXJiYXRpbSBDb3BpZXMuDQoNCiAgWW91IG1heSBjb252ZXkgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBQcm9ncmFtJ3Mgc291cmNlIGNvZGUgYXMgeW91DQpyZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0IHlvdSBjb25zcGljdW91c2x5IGFuZA0KYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbiBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlOw0Ka2VlcCBpbnRhY3QgYWxsIG5vdGljZXMgc3RhdGluZyB0aGF0IHRoaXMgTGljZW5zZSBhbmQgYW55DQpub24tcGVybWlzc2l2ZSB0ZXJtcyBhZGRlZCBpbiBhY2NvcmQgd2l0aCBzZWN0aW9uIDcgYXBwbHkgdG8gdGhlIGNvZGU7DQprZWVwIGludGFjdCBhbGwgbm90aWNlcyBvZiB0aGUgYWJzZW5jZSBvZiBhbnkgd2FycmFudHk7IGFuZCBnaXZlIGFsbA0KcmVjaXBpZW50cyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIFByb2dyYW0uDQoNCiAgWW91IG1heSBjaGFyZ2UgYW55IHByaWNlIG9yIG5vIHByaWNlIGZvciBlYWNoIGNvcHkgdGhhdCB5b3UgY29udmV5LA0KYW5kIHlvdSBtYXkgb2ZmZXIgc3VwcG9ydCBvciB3YXJyYW50eSBwcm90ZWN0aW9uIGZvciBhIGZlZS4NCg0KICA1LiBDb252ZXlpbmcgTW9kaWZpZWQgU291cmNlIFZlcnNpb25zLg0KDQogIFlvdSBtYXkgY29udmV5IGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSwgb3IgdGhlIG1vZGlmaWNhdGlvbnMgdG8NCnByb2R1Y2UgaXQgZnJvbSB0aGUgUHJvZ3JhbSwgaW4gdGhlIGZvcm0gb2Ygc291cmNlIGNvZGUgdW5kZXIgdGhlDQp0ZXJtcyBvZiBzZWN0aW9uIDQsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczoNCg0KICAgIGEpIFRoZSB3b3JrIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBtb2RpZmllZA0KICAgIGl0LCBhbmQgZ2l2aW5nIGEgcmVsZXZhbnQgZGF0ZS4NCg0KICAgIGIpIFRoZSB3b3JrIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IGl0IGlzDQogICAgcmVsZWFzZWQgdW5kZXIgdGhpcyBMaWNlbnNlIGFuZCBhbnkgY29uZGl0aW9ucyBhZGRlZCB1bmRlciBzZWN0aW9uDQogICAgNy4gIFRoaXMgcmVxdWlyZW1lbnQgbW9kaWZpZXMgdGhlIHJlcXVpcmVtZW50IGluIHNlY3Rpb24gNCB0bw0KICAgICJrZWVwIGludGFjdCBhbGwgbm90aWNlcyIuDQoNCiAgICBjKSBZb3UgbXVzdCBsaWNlbnNlIHRoZSBlbnRpcmUgd29yaywgYXMgYSB3aG9sZSwgdW5kZXIgdGhpcw0KICAgIExpY2Vuc2UgdG8gYW55b25lIHdobyBjb21lcyBpbnRvIHBvc3Nlc3Npb24gb2YgYSBjb3B5LiAgVGhpcw0KICAgIExpY2Vuc2Ugd2lsbCB0aGVyZWZvcmUgYXBwbHksIGFsb25nIHdpdGggYW55IGFwcGxpY2FibGUgc2VjdGlvbiA3DQogICAgYWRkaXRpb25hbCB0ZXJtcywgdG8gdGhlIHdob2xlIG9mIHRoZSB3b3JrLCBhbmQgYWxsIGl0cyBwYXJ0cywNCiAgICByZWdhcmRsZXNzIG9mIGhvdyB0aGV5IGFyZSBwYWNrYWdlZC4gIFRoaXMgTGljZW5zZSBnaXZlcyBubw0KICAgIHBlcm1pc3Npb24gdG8gbGljZW5zZSB0aGUgd29yayBpbiBhbnkgb3RoZXIgd2F5LCBidXQgaXQgZG9lcyBub3QNCiAgICBpbnZhbGlkYXRlIHN1Y2ggcGVybWlzc2lvbiBpZiB5b3UgaGF2ZSBzZXBhcmF0ZWx5IHJlY2VpdmVkIGl0Lg0KDQogICAgZCkgSWYgdGhlIHdvcmsgaGFzIGludGVyYWN0aXZlIHVzZXIgaW50ZXJmYWNlcywgZWFjaCBtdXN0IGRpc3BsYXkNCiAgICBBcHByb3ByaWF0ZSBMZWdhbCBOb3RpY2VzOyBob3dldmVyLCBpZiB0aGUgUHJvZ3JhbSBoYXMgaW50ZXJhY3RpdmUNCiAgICBpbnRlcmZhY2VzIHRoYXQgZG8gbm90IGRpc3BsYXkgQXBwcm9wcmlhdGUgTGVnYWwgTm90aWNlcywgeW91cg0KICAgIHdvcmsgbmVlZCBub3QgbWFrZSB0aGVtIGRvIHNvLg0KDQogIEEgY29tcGlsYXRpb24gb2YgYSBjb3ZlcmVkIHdvcmsgd2l0aCBvdGhlciBzZXBhcmF0ZSBhbmQgaW5kZXBlbmRlbnQNCndvcmtzLCB3aGljaCBhcmUgbm90IGJ5IHRoZWlyIG5hdHVyZSBleHRlbnNpb25zIG9mIHRoZSBjb3ZlcmVkIHdvcmssDQphbmQgd2hpY2ggYXJlIG5vdCBjb21iaW5lZCB3aXRoIGl0IHN1Y2ggYXMgdG8gZm9ybSBhIGxhcmdlciBwcm9ncmFtLA0KaW4gb3Igb24gYSB2b2x1bWUgb2YgYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0sIGlzIGNhbGxlZCBhbg0KImFnZ3JlZ2F0ZSIgaWYgdGhlIGNvbXBpbGF0aW9uIGFuZCBpdHMgcmVzdWx0aW5nIGNvcHlyaWdodCBhcmUgbm90DQp1c2VkIHRvIGxpbWl0IHRoZSBhY2Nlc3Mgb3IgbGVnYWwgcmlnaHRzIG9mIHRoZSBjb21waWxhdGlvbidzIHVzZXJzDQpiZXlvbmQgd2hhdCB0aGUgaW5kaXZpZHVhbCB3b3JrcyBwZXJtaXQuICBJbmNsdXNpb24gb2YgYSBjb3ZlcmVkIHdvcmsNCmluIGFuIGFnZ3JlZ2F0ZSBkb2VzIG5vdCBjYXVzZSB0aGlzIExpY2Vuc2UgdG8gYXBwbHkgdG8gdGhlIG90aGVyDQpwYXJ0cyBvZiB0aGUgYWdncmVnYXRlLg0KDQogIDYuIENvbnZleWluZyBOb24tU291cmNlIEZvcm1zLg0KDQogIFlvdSBtYXkgY29udmV5IGEgY292ZXJlZCB3b3JrIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgdGhlIHRlcm1zDQpvZiBzZWN0aW9ucyA0IGFuZCA1LCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIGNvbnZleSB0aGUNCm1hY2hpbmUtcmVhZGFibGUgQ29ycmVzcG9uZGluZyBTb3VyY2UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSwNCmluIG9uZSBvZiB0aGVzZSB3YXlzOg0KDQogICAgYSkgQ29udmV5IHRoZSBvYmplY3QgY29kZSBpbiwgb3IgZW1ib2RpZWQgaW4sIGEgcGh5c2ljYWwgcHJvZHVjdA0KICAgIChpbmNsdWRpbmcgYSBwaHlzaWNhbCBkaXN0cmlidXRpb24gbWVkaXVtKSwgYWNjb21wYW5pZWQgYnkgdGhlDQogICAgQ29ycmVzcG9uZGluZyBTb3VyY2UgZml4ZWQgb24gYSBkdXJhYmxlIHBoeXNpY2FsIG1lZGl1bQ0KICAgIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlLg0KDQogICAgYikgQ29udmV5IHRoZSBvYmplY3QgY29kZSBpbiwgb3IgZW1ib2RpZWQgaW4sIGEgcGh5c2ljYWwgcHJvZHVjdA0KICAgIChpbmNsdWRpbmcgYSBwaHlzaWNhbCBkaXN0cmlidXRpb24gbWVkaXVtKSwgYWNjb21wYW5pZWQgYnkgYQ0KICAgIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdCB0aHJlZSB5ZWFycyBhbmQgdmFsaWQgZm9yIGFzDQogICAgbG9uZyBhcyB5b3Ugb2ZmZXIgc3BhcmUgcGFydHMgb3IgY3VzdG9tZXIgc3VwcG9ydCBmb3IgdGhhdCBwcm9kdWN0DQogICAgbW9kZWwsIHRvIGdpdmUgYW55b25lIHdobyBwb3NzZXNzZXMgdGhlIG9iamVjdCBjb2RlIGVpdGhlciAoMSkgYQ0KICAgIGNvcHkgb2YgdGhlIENvcnJlc3BvbmRpbmcgU291cmNlIGZvciBhbGwgdGhlIHNvZnR3YXJlIGluIHRoZQ0KICAgIHByb2R1Y3QgdGhhdCBpcyBjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZSwgb24gYSBkdXJhYmxlIHBoeXNpY2FsDQogICAgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlLCBmb3IgYSBwcmljZSBubw0KICAgIG1vcmUgdGhhbiB5b3VyIHJlYXNvbmFibGUgY29zdCBvZiBwaHlzaWNhbGx5IHBlcmZvcm1pbmcgdGhpcw0KICAgIGNvbnZleWluZyBvZiBzb3VyY2UsIG9yICgyKSBhY2Nlc3MgdG8gY29weSB0aGUNCiAgICBDb3JyZXNwb25kaW5nIFNvdXJjZSBmcm9tIGEgbmV0d29yayBzZXJ2ZXIgYXQgbm8gY2hhcmdlLg0KDQogICAgYykgQ29udmV5IGluZGl2aWR1YWwgY29waWVzIG9mIHRoZSBvYmplY3QgY29kZSB3aXRoIGEgY29weSBvZiB0aGUNCiAgICB3cml0dGVuIG9mZmVyIHRvIHByb3ZpZGUgdGhlIENvcnJlc3BvbmRpbmcgU291cmNlLiAgVGhpcw0KICAgIGFsdGVybmF0aXZlIGlzIGFsbG93ZWQgb25seSBvY2Nhc2lvbmFsbHkgYW5kIG5vbmNvbW1lcmNpYWxseSwgYW5kDQogICAgb25seSBpZiB5b3UgcmVjZWl2ZWQgdGhlIG9iamVjdCBjb2RlIHdpdGggc3VjaCBhbiBvZmZlciwgaW4gYWNjb3JkDQogICAgd2l0aCBzdWJzZWN0aW9uIDZiLg0KDQogICAgZCkgQ29udmV5IHRoZSBvYmplY3QgY29kZSBieSBvZmZlcmluZyBhY2Nlc3MgZnJvbSBhIGRlc2lnbmF0ZWQNCiAgICBwbGFjZSAoZ3JhdGlzIG9yIGZvciBhIGNoYXJnZSksIGFuZCBvZmZlciBlcXVpdmFsZW50IGFjY2VzcyB0byB0aGUNCiAgICBDb3JyZXNwb25kaW5nIFNvdXJjZSBpbiB0aGUgc2FtZSB3YXkgdGhyb3VnaCB0aGUgc2FtZSBwbGFjZSBhdCBubw0KICAgIGZ1cnRoZXIgY2hhcmdlLiAgWW91IG5lZWQgbm90IHJlcXVpcmUgcmVjaXBpZW50cyB0byBjb3B5IHRoZQ0KICAgIENvcnJlc3BvbmRpbmcgU291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLiAgSWYgdGhlIHBsYWNlIHRvDQogICAgY29weSB0aGUgb2JqZWN0IGNvZGUgaXMgYSBuZXR3b3JrIHNlcnZlciwgdGhlIENvcnJlc3BvbmRpbmcgU291cmNlDQogICAgbWF5IGJlIG9uIGEgZGlmZmVyZW50IHNlcnZlciAob3BlcmF0ZWQgYnkgeW91IG9yIGEgdGhpcmQgcGFydHkpDQogICAgdGhhdCBzdXBwb3J0cyBlcXVpdmFsZW50IGNvcHlpbmcgZmFjaWxpdGllcywgcHJvdmlkZWQgeW91IG1haW50YWluDQogICAgY2xlYXIgZGlyZWN0aW9ucyBuZXh0IHRvIHRoZSBvYmplY3QgY29kZSBzYXlpbmcgd2hlcmUgdG8gZmluZCB0aGUNCiAgICBDb3JyZXNwb25kaW5nIFNvdXJjZS4gIFJlZ2FyZGxlc3Mgb2Ygd2hhdCBzZXJ2ZXIgaG9zdHMgdGhlDQogICAgQ29ycmVzcG9uZGluZyBTb3VyY2UsIHlvdSByZW1haW4gb2JsaWdhdGVkIHRvIGVuc3VyZSB0aGF0IGl0IGlzDQogICAgYXZhaWxhYmxlIGZvciBhcyBsb25nIGFzIG5lZWRlZCB0byBzYXRpc2Z5IHRoZXNlIHJlcXVpcmVtZW50cy4NCg0KICAgIGUpIENvbnZleSB0aGUgb2JqZWN0IGNvZGUgdXNpbmcgcGVlci10by1wZWVyIHRyYW5zbWlzc2lvbiwgcHJvdmlkZWQNCiAgICB5b3UgaW5mb3JtIG90aGVyIHBlZXJzIHdoZXJlIHRoZSBvYmplY3QgY29kZSBhbmQgQ29ycmVzcG9uZGluZw0KICAgIFNvdXJjZSBvZiB0aGUgd29yayBhcmUgYmVpbmcgb2ZmZXJlZCB0byB0aGUgZ2VuZXJhbCBwdWJsaWMgYXQgbm8NCiAgICBjaGFyZ2UgdW5kZXIgc3Vic2VjdGlvbiA2ZC4NCg0KICBBIHNlcGFyYWJsZSBwb3J0aW9uIG9mIHRoZSBvYmplY3QgY29kZSwgd2hvc2Ugc291cmNlIGNvZGUgaXMgZXhjbHVkZWQNCmZyb20gdGhlIENvcnJlc3BvbmRpbmcgU291cmNlIGFzIGEgU3lzdGVtIExpYnJhcnksIG5lZWQgbm90IGJlDQppbmNsdWRlZCBpbiBjb252ZXlpbmcgdGhlIG9iamVjdCBjb2RlIHdvcmsuDQoNCiAgQSAiVXNlciBQcm9kdWN0IiBpcyBlaXRoZXIgKDEpIGEgImNvbnN1bWVyIHByb2R1Y3QiLCB3aGljaCBtZWFucyBhbnkNCnRhbmdpYmxlIHBlcnNvbmFsIHByb3BlcnR5IHdoaWNoIGlzIG5vcm1hbGx5IHVzZWQgZm9yIHBlcnNvbmFsLCBmYW1pbHksDQpvciBob3VzZWhvbGQgcHVycG9zZXMsIG9yICgyKSBhbnl0aGluZyBkZXNpZ25lZCBvciBzb2xkIGZvciBpbmNvcnBvcmF0aW9uDQppbnRvIGEgZHdlbGxpbmcuICBJbiBkZXRlcm1pbmluZyB3aGV0aGVyIGEgcHJvZHVjdCBpcyBhIGNvbnN1bWVyIHByb2R1Y3QsDQpkb3VidGZ1bCBjYXNlcyBzaGFsbCBiZSByZXNvbHZlZCBpbiBmYXZvciBvZiBjb3ZlcmFnZS4gIEZvciBhIHBhcnRpY3VsYXINCnByb2R1Y3QgcmVjZWl2ZWQgYnkgYSBwYXJ0aWN1bGFyIHVzZXIsICJub3JtYWxseSB1c2VkIiByZWZlcnMgdG8gYQ0KdHlwaWNhbCBvciBjb21tb24gdXNlIG9mIHRoYXQgY2xhc3Mgb2YgcHJvZHVjdCwgcmVnYXJkbGVzcyBvZiB0aGUgc3RhdHVzDQpvZiB0aGUgcGFydGljdWxhciB1c2VyIG9yIG9mIHRoZSB3YXkgaW4gd2hpY2ggdGhlIHBhcnRpY3VsYXIgdXNlcg0KYWN0dWFsbHkgdXNlcywgb3IgZXhwZWN0cyBvciBpcyBleHBlY3RlZCB0byB1c2UsIHRoZSBwcm9kdWN0LiAgQSBwcm9kdWN0DQppcyBhIGNvbnN1bWVyIHByb2R1Y3QgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBwcm9kdWN0IGhhcyBzdWJzdGFudGlhbA0KY29tbWVyY2lhbCwgaW5kdXN0cmlhbCBvciBub24tY29uc3VtZXIgdXNlcywgdW5sZXNzIHN1Y2ggdXNlcyByZXByZXNlbnQNCnRoZSBvbmx5IHNpZ25pZmljYW50IG1vZGUgb2YgdXNlIG9mIHRoZSBwcm9kdWN0Lg0KDQogICJJbnN0YWxsYXRpb24gSW5mb3JtYXRpb24iIGZvciBhIFVzZXIgUHJvZHVjdCBtZWFucyBhbnkgbWV0aG9kcywNCnByb2NlZHVyZXMsIGF1dGhvcml6YXRpb24ga2V5cywgb3Igb3RoZXIgaW5mb3JtYXRpb24gcmVxdWlyZWQgdG8gaW5zdGFsbA0KYW5kIGV4ZWN1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgYSBjb3ZlcmVkIHdvcmsgaW4gdGhhdCBVc2VyIFByb2R1Y3QgZnJvbQ0KYSBtb2RpZmllZCB2ZXJzaW9uIG9mIGl0cyBDb3JyZXNwb25kaW5nIFNvdXJjZS4gIFRoZSBpbmZvcm1hdGlvbiBtdXN0DQpzdWZmaWNlIHRvIGVuc3VyZSB0aGF0IHRoZSBjb250aW51ZWQgZnVuY3Rpb25pbmcgb2YgdGhlIG1vZGlmaWVkIG9iamVjdA0KY29kZSBpcyBpbiBubyBjYXNlIHByZXZlbnRlZCBvciBpbnRlcmZlcmVkIHdpdGggc29sZWx5IGJlY2F1c2UNCm1vZGlmaWNhdGlvbiBoYXMgYmVlbiBtYWRlLg0KDQogIElmIHlvdSBjb252ZXkgYW4gb2JqZWN0IGNvZGUgd29yayB1bmRlciB0aGlzIHNlY3Rpb24gaW4sIG9yIHdpdGgsIG9yDQpzcGVjaWZpY2FsbHkgZm9yIHVzZSBpbiwgYSBVc2VyIFByb2R1Y3QsIGFuZCB0aGUgY29udmV5aW5nIG9jY3VycyBhcw0KcGFydCBvZiBhIHRyYW5zYWN0aW9uIGluIHdoaWNoIHRoZSByaWdodCBvZiBwb3NzZXNzaW9uIGFuZCB1c2Ugb2YgdGhlDQpVc2VyIFByb2R1Y3QgaXMgdHJhbnNmZXJyZWQgdG8gdGhlIHJlY2lwaWVudCBpbiBwZXJwZXR1aXR5IG9yIGZvciBhDQpmaXhlZCB0ZXJtIChyZWdhcmRsZXNzIG9mIGhvdyB0aGUgdHJhbnNhY3Rpb24gaXMgY2hhcmFjdGVyaXplZCksIHRoZQ0KQ29ycmVzcG9uZGluZyBTb3VyY2UgY29udmV5ZWQgdW5kZXIgdGhpcyBzZWN0aW9uIG11c3QgYmUgYWNjb21wYW5pZWQNCmJ5IHRoZSBJbnN0YWxsYXRpb24gSW5mb3JtYXRpb24uICBCdXQgdGhpcyByZXF1aXJlbWVudCBkb2VzIG5vdCBhcHBseQ0KaWYgbmVpdGhlciB5b3Ugbm9yIGFueSB0aGlyZCBwYXJ0eSByZXRhaW5zIHRoZSBhYmlsaXR5IHRvIGluc3RhbGwNCm1vZGlmaWVkIG9iamVjdCBjb2RlIG9uIHRoZSBVc2VyIFByb2R1Y3QgKGZvciBleGFtcGxlLCB0aGUgd29yayBoYXMNCmJlZW4gaW5zdGFsbGVkIGluIFJPTSkuDQoNCiAgVGhlIHJlcXVpcmVtZW50IHRvIHByb3ZpZGUgSW5zdGFsbGF0aW9uIEluZm9ybWF0aW9uIGRvZXMgbm90IGluY2x1ZGUgYQ0KcmVxdWlyZW1lbnQgdG8gY29udGludWUgdG8gcHJvdmlkZSBzdXBwb3J0IHNlcnZpY2UsIHdhcnJhbnR5LCBvciB1cGRhdGVzDQpmb3IgYSB3b3JrIHRoYXQgaGFzIGJlZW4gbW9kaWZpZWQgb3IgaW5zdGFsbGVkIGJ5IHRoZSByZWNpcGllbnQsIG9yIGZvcg0KdGhlIFVzZXIgUHJvZHVjdCBpbiB3aGljaCBpdCBoYXMgYmVlbiBtb2RpZmllZCBvciBpbnN0YWxsZWQuICBBY2Nlc3MgdG8gYQ0KbmV0d29yayBtYXkgYmUgZGVuaWVkIHdoZW4gdGhlIG1vZGlmaWNhdGlvbiBpdHNlbGYgbWF0ZXJpYWxseSBhbmQNCmFkdmVyc2VseSBhZmZlY3RzIHRoZSBvcGVyYXRpb24gb2YgdGhlIG5ldHdvcmsgb3IgdmlvbGF0ZXMgdGhlIHJ1bGVzIGFuZA0KcHJvdG9jb2xzIGZvciBjb21tdW5pY2F0aW9uIGFjcm9zcyB0aGUgbmV0d29yay4NCg0KICBDb3JyZXNwb25kaW5nIFNvdXJjZSBjb252ZXllZCwgYW5kIEluc3RhbGxhdGlvbiBJbmZvcm1hdGlvbiBwcm92aWRlZCwNCmluIGFjY29yZCB3aXRoIHRoaXMgc2VjdGlvbiBtdXN0IGJlIGluIGEgZm9ybWF0IHRoYXQgaXMgcHVibGljbHkNCmRvY3VtZW50ZWQgKGFuZCB3aXRoIGFuIGltcGxlbWVudGF0aW9uIGF2YWlsYWJsZSB0byB0aGUgcHVibGljIGluDQpzb3VyY2UgY29kZSBmb3JtKSwgYW5kIG11c3QgcmVxdWlyZSBubyBzcGVjaWFsIHBhc3N3b3JkIG9yIGtleSBmb3INCnVucGFja2luZywgcmVhZGluZyBvciBjb3B5aW5nLg0KDQogIDcuIEFkZGl0aW9uYWwgVGVybXMuDQoNCiAgIkFkZGl0aW9uYWwgcGVybWlzc2lvbnMiIGFyZSB0ZXJtcyB0aGF0IHN1cHBsZW1lbnQgdGhlIHRlcm1zIG9mIHRoaXMNCkxpY2Vuc2UgYnkgbWFraW5nIGV4Y2VwdGlvbnMgZnJvbSBvbmUgb3IgbW9yZSBvZiBpdHMgY29uZGl0aW9ucy4NCkFkZGl0aW9uYWwgcGVybWlzc2lvbnMgdGhhdCBhcmUgYXBwbGljYWJsZSB0byB0aGUgZW50aXJlIFByb2dyYW0gc2hhbGwNCmJlIHRyZWF0ZWQgYXMgdGhvdWdoIHRoZXkgd2VyZSBpbmNsdWRlZCBpbiB0aGlzIExpY2Vuc2UsIHRvIHRoZSBleHRlbnQNCnRoYXQgdGhleSBhcmUgdmFsaWQgdW5kZXIgYXBwbGljYWJsZSBsYXcuICBJZiBhZGRpdGlvbmFsIHBlcm1pc3Npb25zDQphcHBseSBvbmx5IHRvIHBhcnQgb2YgdGhlIFByb2dyYW0sIHRoYXQgcGFydCBtYXkgYmUgdXNlZCBzZXBhcmF0ZWx5DQp1bmRlciB0aG9zZSBwZXJtaXNzaW9ucywgYnV0IHRoZSBlbnRpcmUgUHJvZ3JhbSByZW1haW5zIGdvdmVybmVkIGJ5DQp0aGlzIExpY2Vuc2Ugd2l0aG91dCByZWdhcmQgdG8gdGhlIGFkZGl0aW9uYWwgcGVybWlzc2lvbnMuDQoNCiAgV2hlbiB5b3UgY29udmV5IGEgY29weSBvZiBhIGNvdmVyZWQgd29yaywgeW91IG1heSBhdCB5b3VyIG9wdGlvbg0KcmVtb3ZlIGFueSBhZGRpdGlvbmFsIHBlcm1pc3Npb25zIGZyb20gdGhhdCBjb3B5LCBvciBmcm9tIGFueSBwYXJ0IG9mDQppdC4gIChBZGRpdGlvbmFsIHBlcm1pc3Npb25zIG1heSBiZSB3cml0dGVuIHRvIHJlcXVpcmUgdGhlaXIgb3duDQpyZW1vdmFsIGluIGNlcnRhaW4gY2FzZXMgd2hlbiB5b3UgbW9kaWZ5IHRoZSB3b3JrLikgIFlvdSBtYXkgcGxhY2UNCmFkZGl0aW9uYWwgcGVybWlzc2lvbnMgb24gbWF0ZXJpYWwsIGFkZGVkIGJ5IHlvdSB0byBhIGNvdmVyZWQgd29yaywNCmZvciB3aGljaCB5b3UgaGF2ZSBvciBjYW4gZ2l2ZSBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgcGVybWlzc2lvbi4NCg0KICBOb3R3aXRoc3RhbmRpbmcgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UsIGZvciBtYXRlcmlhbCB5b3UNCmFkZCB0byBhIGNvdmVyZWQgd29yaywgeW91IG1heSAoaWYgYXV0aG9yaXplZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YNCnRoYXQgbWF0ZXJpYWwpIHN1cHBsZW1lbnQgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSB3aXRoIHRlcm1zOg0KDQogICAgYSkgRGlzY2xhaW1pbmcgd2FycmFudHkgb3IgbGltaXRpbmcgbGlhYmlsaXR5IGRpZmZlcmVudGx5IGZyb20gdGhlDQogICAgdGVybXMgb2Ygc2VjdGlvbnMgMTUgYW5kIDE2IG9mIHRoaXMgTGljZW5zZTsgb3INCg0KICAgIGIpIFJlcXVpcmluZyBwcmVzZXJ2YXRpb24gb2Ygc3BlY2lmaWVkIHJlYXNvbmFibGUgbGVnYWwgbm90aWNlcyBvcg0KICAgIGF1dGhvciBhdHRyaWJ1dGlvbnMgaW4gdGhhdCBtYXRlcmlhbCBvciBpbiB0aGUgQXBwcm9wcmlhdGUgTGVnYWwNCiAgICBOb3RpY2VzIGRpc3BsYXllZCBieSB3b3JrcyBjb250YWluaW5nIGl0OyBvcg0KDQogICAgYykgUHJvaGliaXRpbmcgbWlzcmVwcmVzZW50YXRpb24gb2YgdGhlIG9yaWdpbiBvZiB0aGF0IG1hdGVyaWFsLCBvcg0KICAgIHJlcXVpcmluZyB0aGF0IG1vZGlmaWVkIHZlcnNpb25zIG9mIHN1Y2ggbWF0ZXJpYWwgYmUgbWFya2VkIGluDQogICAgcmVhc29uYWJsZSB3YXlzIGFzIGRpZmZlcmVudCBmcm9tIHRoZSBvcmlnaW5hbCB2ZXJzaW9uOyBvcg0KDQogICAgZCkgTGltaXRpbmcgdGhlIHVzZSBmb3IgcHVibGljaXR5IHB1cnBvc2VzIG9mIG5hbWVzIG9mIGxpY2Vuc29ycyBvcg0KICAgIGF1dGhvcnMgb2YgdGhlIG1hdGVyaWFsOyBvcg0KDQogICAgZSkgRGVjbGluaW5nIHRvIGdyYW50IHJpZ2h0cyB1bmRlciB0cmFkZW1hcmsgbGF3IGZvciB1c2Ugb2Ygc29tZQ0KICAgIHRyYWRlIG5hbWVzLCB0cmFkZW1hcmtzLCBvciBzZXJ2aWNlIG1hcmtzOyBvcg0KDQogICAgZikgUmVxdWlyaW5nIGluZGVtbmlmaWNhdGlvbiBvZiBsaWNlbnNvcnMgYW5kIGF1dGhvcnMgb2YgdGhhdA0KICAgIG1hdGVyaWFsIGJ5IGFueW9uZSB3aG8gY29udmV5cyB0aGUgbWF0ZXJpYWwgKG9yIG1vZGlmaWVkIHZlcnNpb25zIG9mDQogICAgaXQpIHdpdGggY29udHJhY3R1YWwgYXNzdW1wdGlvbnMgb2YgbGlhYmlsaXR5IHRvIHRoZSByZWNpcGllbnQsIGZvcg0KICAgIGFueSBsaWFiaWxpdHkgdGhhdCB0aGVzZSBjb250cmFjdHVhbCBhc3N1bXB0aW9ucyBkaXJlY3RseSBpbXBvc2Ugb24NCiAgICB0aG9zZSBsaWNlbnNvcnMgYW5kIGF1dGhvcnMuDQoNCiAgQWxsIG90aGVyIG5vbi1wZXJtaXNzaXZlIGFkZGl0aW9uYWwgdGVybXMgYXJlIGNvbnNpZGVyZWQgImZ1cnRoZXINCnJlc3RyaWN0aW9ucyIgd2l0aGluIHRoZSBtZWFuaW5nIG9mIHNlY3Rpb24gMTAuICBJZiB0aGUgUHJvZ3JhbSBhcyB5b3UNCnJlY2VpdmVkIGl0LCBvciBhbnkgcGFydCBvZiBpdCwgY29udGFpbnMgYSBub3RpY2Ugc3RhdGluZyB0aGF0IGl0IGlzDQpnb3Zlcm5lZCBieSB0aGlzIExpY2Vuc2UgYWxvbmcgd2l0aCBhIHRlcm0gdGhhdCBpcyBhIGZ1cnRoZXINCnJlc3RyaWN0aW9uLCB5b3UgbWF5IHJlbW92ZSB0aGF0IHRlcm0uICBJZiBhIGxpY2Vuc2UgZG9jdW1lbnQgY29udGFpbnMNCmEgZnVydGhlciByZXN0cmljdGlvbiBidXQgcGVybWl0cyByZWxpY2Vuc2luZyBvciBjb252ZXlpbmcgdW5kZXIgdGhpcw0KTGljZW5zZSwgeW91IG1heSBhZGQgdG8gYSBjb3ZlcmVkIHdvcmsgbWF0ZXJpYWwgZ292ZXJuZWQgYnkgdGhlIHRlcm1zDQpvZiB0aGF0IGxpY2Vuc2UgZG9jdW1lbnQsIHByb3ZpZGVkIHRoYXQgdGhlIGZ1cnRoZXIgcmVzdHJpY3Rpb24gZG9lcw0Kbm90IHN1cnZpdmUgc3VjaCByZWxpY2Vuc2luZyBvciBjb252ZXlpbmcuDQoNCiAgSWYgeW91IGFkZCB0ZXJtcyB0byBhIGNvdmVyZWQgd29yayBpbiBhY2NvcmQgd2l0aCB0aGlzIHNlY3Rpb24sIHlvdQ0KbXVzdCBwbGFjZSwgaW4gdGhlIHJlbGV2YW50IHNvdXJjZSBmaWxlcywgYSBzdGF0ZW1lbnQgb2YgdGhlDQphZGRpdGlvbmFsIHRlcm1zIHRoYXQgYXBwbHkgdG8gdGhvc2UgZmlsZXMsIG9yIGEgbm90aWNlIGluZGljYXRpbmcNCndoZXJlIHRvIGZpbmQgdGhlIGFwcGxpY2FibGUgdGVybXMuDQoNCiAgQWRkaXRpb25hbCB0ZXJtcywgcGVybWlzc2l2ZSBvciBub24tcGVybWlzc2l2ZSwgbWF5IGJlIHN0YXRlZCBpbiB0aGUNCmZvcm0gb2YgYSBzZXBhcmF0ZWx5IHdyaXR0ZW4gbGljZW5zZSwgb3Igc3RhdGVkIGFzIGV4Y2VwdGlvbnM7DQp0aGUgYWJvdmUgcmVxdWlyZW1lbnRzIGFwcGx5IGVpdGhlciB3YXkuDQoNCiAgOC4gVGVybWluYXRpb24uDQoNCiAgWW91IG1heSBub3QgcHJvcGFnYXRlIG9yIG1vZGlmeSBhIGNvdmVyZWQgd29yayBleGNlcHQgYXMgZXhwcmVzc2x5DQpwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkgYXR0ZW1wdCBvdGhlcndpc2UgdG8gcHJvcGFnYXRlIG9yDQptb2RpZnkgaXQgaXMgdm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91ciByaWdodHMgdW5kZXINCnRoaXMgTGljZW5zZSAoaW5jbHVkaW5nIGFueSBwYXRlbnQgbGljZW5zZXMgZ3JhbnRlZCB1bmRlciB0aGUgdGhpcmQNCnBhcmFncmFwaCBvZiBzZWN0aW9uIDExKS4NCg0KICBIb3dldmVyLCBpZiB5b3UgY2Vhc2UgYWxsIHZpb2xhdGlvbiBvZiB0aGlzIExpY2Vuc2UsIHRoZW4geW91cg0KbGljZW5zZSBmcm9tIGEgcGFydGljdWxhciBjb3B5cmlnaHQgaG9sZGVyIGlzIHJlaW5zdGF0ZWQgKGEpDQpwcm92aXNpb25hbGx5LCB1bmxlc3MgYW5kIHVudGlsIHRoZSBjb3B5cmlnaHQgaG9sZGVyIGV4cGxpY2l0bHkgYW5kDQpmaW5hbGx5IHRlcm1pbmF0ZXMgeW91ciBsaWNlbnNlLCBhbmQgKGIpIHBlcm1hbmVudGx5LCBpZiB0aGUgY29weXJpZ2h0DQpob2xkZXIgZmFpbHMgdG8gbm90aWZ5IHlvdSBvZiB0aGUgdmlvbGF0aW9uIGJ5IHNvbWUgcmVhc29uYWJsZSBtZWFucw0KcHJpb3IgdG8gNjAgZGF5cyBhZnRlciB0aGUgY2Vzc2F0aW9uLg0KDQogIE1vcmVvdmVyLCB5b3VyIGxpY2Vuc2UgZnJvbSBhIHBhcnRpY3VsYXIgY29weXJpZ2h0IGhvbGRlciBpcw0KcmVpbnN0YXRlZCBwZXJtYW5lbnRseSBpZiB0aGUgY29weXJpZ2h0IGhvbGRlciBub3RpZmllcyB5b3Ugb2YgdGhlDQp2aW9sYXRpb24gYnkgc29tZSByZWFzb25hYmxlIG1lYW5zLCB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHlvdSBoYXZlDQpyZWNlaXZlZCBub3RpY2Ugb2YgdmlvbGF0aW9uIG9mIHRoaXMgTGljZW5zZSAoZm9yIGFueSB3b3JrKSBmcm9tIHRoYXQNCmNvcHlyaWdodCBob2xkZXIsIGFuZCB5b3UgY3VyZSB0aGUgdmlvbGF0aW9uIHByaW9yIHRvIDMwIGRheXMgYWZ0ZXINCnlvdXIgcmVjZWlwdCBvZiB0aGUgbm90aWNlLg0KDQogIFRlcm1pbmF0aW9uIG9mIHlvdXIgcmlnaHRzIHVuZGVyIHRoaXMgc2VjdGlvbiBkb2VzIG5vdCB0ZXJtaW5hdGUgdGhlDQpsaWNlbnNlcyBvZiBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcyBvciByaWdodHMgZnJvbSB5b3UgdW5kZXINCnRoaXMgTGljZW5zZS4gIElmIHlvdXIgcmlnaHRzIGhhdmUgYmVlbiB0ZXJtaW5hdGVkIGFuZCBub3QgcGVybWFuZW50bHkNCnJlaW5zdGF0ZWQsIHlvdSBkbyBub3QgcXVhbGlmeSB0byByZWNlaXZlIG5ldyBsaWNlbnNlcyBmb3IgdGhlIHNhbWUNCm1hdGVyaWFsIHVuZGVyIHNlY3Rpb24gMTAuDQoNCiAgOS4gQWNjZXB0YW5jZSBOb3QgUmVxdWlyZWQgZm9yIEhhdmluZyBDb3BpZXMuDQoNCiAgWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSBpbiBvcmRlciB0byByZWNlaXZlIG9yDQpydW4gYSBjb3B5IG9mIHRoZSBQcm9ncmFtLiAgQW5jaWxsYXJ5IHByb3BhZ2F0aW9uIG9mIGEgY292ZXJlZCB3b3JrDQpvY2N1cnJpbmcgc29sZWx5IGFzIGEgY29uc2VxdWVuY2Ugb2YgdXNpbmcgcGVlci10by1wZWVyIHRyYW5zbWlzc2lvbg0KdG8gcmVjZWl2ZSBhIGNvcHkgbGlrZXdpc2UgZG9lcyBub3QgcmVxdWlyZSBhY2NlcHRhbmNlLiAgSG93ZXZlciwNCm5vdGhpbmcgb3RoZXIgdGhhbiB0aGlzIExpY2Vuc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIHByb3BhZ2F0ZSBvcg0KbW9kaWZ5IGFueSBjb3ZlcmVkIHdvcmsuICBUaGVzZSBhY3Rpb25zIGluZnJpbmdlIGNvcHlyaWdodCBpZiB5b3UgZG8NCm5vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiAgVGhlcmVmb3JlLCBieSBtb2RpZnlpbmcgb3IgcHJvcGFnYXRpbmcgYQ0KY292ZXJlZCB3b3JrLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzby4NCg0KICAxMC4gQXV0b21hdGljIExpY2Vuc2luZyBvZiBEb3duc3RyZWFtIFJlY2lwaWVudHMuDQoNCiAgRWFjaCB0aW1lIHlvdSBjb252ZXkgYSBjb3ZlcmVkIHdvcmssIHRoZSByZWNpcGllbnQgYXV0b21hdGljYWxseQ0KcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlIG9yaWdpbmFsIGxpY2Vuc29ycywgdG8gcnVuLCBtb2RpZnkgYW5kDQpwcm9wYWdhdGUgdGhhdCB3b3JrLCBzdWJqZWN0IHRvIHRoaXMgTGljZW5zZS4gIFlvdSBhcmUgbm90IHJlc3BvbnNpYmxlDQpmb3IgZW5mb3JjaW5nIGNvbXBsaWFuY2UgYnkgdGhpcmQgcGFydGllcyB3aXRoIHRoaXMgTGljZW5zZS4NCg0KICBBbiAiZW50aXR5IHRyYW5zYWN0aW9uIiBpcyBhIHRyYW5zYWN0aW9uIHRyYW5zZmVycmluZyBjb250cm9sIG9mIGFuDQpvcmdhbml6YXRpb24sIG9yIHN1YnN0YW50aWFsbHkgYWxsIGFzc2V0cyBvZiBvbmUsIG9yIHN1YmRpdmlkaW5nIGFuDQpvcmdhbml6YXRpb24sIG9yIG1lcmdpbmcgb3JnYW5pemF0aW9ucy4gIElmIHByb3BhZ2F0aW9uIG9mIGEgY292ZXJlZA0Kd29yayByZXN1bHRzIGZyb20gYW4gZW50aXR5IHRyYW5zYWN0aW9uLCBlYWNoIHBhcnR5IHRvIHRoYXQNCnRyYW5zYWN0aW9uIHdobyByZWNlaXZlcyBhIGNvcHkgb2YgdGhlIHdvcmsgYWxzbyByZWNlaXZlcyB3aGF0ZXZlcg0KbGljZW5zZXMgdG8gdGhlIHdvcmsgdGhlIHBhcnR5J3MgcHJlZGVjZXNzb3IgaW4gaW50ZXJlc3QgaGFkIG9yIGNvdWxkDQpnaXZlIHVuZGVyIHRoZSBwcmV2aW91cyBwYXJhZ3JhcGgsIHBsdXMgYSByaWdodCB0byBwb3NzZXNzaW9uIG9mIHRoZQ0KQ29ycmVzcG9uZGluZyBTb3VyY2Ugb2YgdGhlIHdvcmsgZnJvbSB0aGUgcHJlZGVjZXNzb3IgaW4gaW50ZXJlc3QsIGlmDQp0aGUgcHJlZGVjZXNzb3IgaGFzIGl0IG9yIGNhbiBnZXQgaXQgd2l0aCByZWFzb25hYmxlIGVmZm9ydHMuDQoNCiAgWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyIHJlc3RyaWN0aW9ucyBvbiB0aGUgZXhlcmNpc2Ugb2YgdGhlDQpyaWdodHMgZ3JhbnRlZCBvciBhZmZpcm1lZCB1bmRlciB0aGlzIExpY2Vuc2UuICBGb3IgZXhhbXBsZSwgeW91IG1heQ0Kbm90IGltcG9zZSBhIGxpY2Vuc2UgZmVlLCByb3lhbHR5LCBvciBvdGhlciBjaGFyZ2UgZm9yIGV4ZXJjaXNlIG9mDQpyaWdodHMgZ3JhbnRlZCB1bmRlciB0aGlzIExpY2Vuc2UsIGFuZCB5b3UgbWF5IG5vdCBpbml0aWF0ZSBsaXRpZ2F0aW9uDQooaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdA0KYW55IHBhdGVudCBjbGFpbSBpcyBpbmZyaW5nZWQgYnkgbWFraW5nLCB1c2luZywgc2VsbGluZywgb2ZmZXJpbmcgZm9yDQpzYWxlLCBvciBpbXBvcnRpbmcgdGhlIFByb2dyYW0gb3IgYW55IHBvcnRpb24gb2YgaXQuDQoNCiAgMTEuIFBhdGVudHMuDQoNCiAgQSAiY29udHJpYnV0b3IiIGlzIGEgY29weXJpZ2h0IGhvbGRlciB3aG8gYXV0aG9yaXplcyB1c2UgdW5kZXIgdGhpcw0KTGljZW5zZSBvZiB0aGUgUHJvZ3JhbSBvciBhIHdvcmsgb24gd2hpY2ggdGhlIFByb2dyYW0gaXMgYmFzZWQuICBUaGUNCndvcmsgdGh1cyBsaWNlbnNlZCBpcyBjYWxsZWQgdGhlIGNvbnRyaWJ1dG9yJ3MgImNvbnRyaWJ1dG9yIHZlcnNpb24iLg0KDQogIEEgY29udHJpYnV0b3IncyAiZXNzZW50aWFsIHBhdGVudCBjbGFpbXMiIGFyZSBhbGwgcGF0ZW50IGNsYWltcw0Kb3duZWQgb3IgY29udHJvbGxlZCBieSB0aGUgY29udHJpYnV0b3IsIHdoZXRoZXIgYWxyZWFkeSBhY3F1aXJlZCBvcg0KaGVyZWFmdGVyIGFjcXVpcmVkLCB0aGF0IHdvdWxkIGJlIGluZnJpbmdlZCBieSBzb21lIG1hbm5lciwgcGVybWl0dGVkDQpieSB0aGlzIExpY2Vuc2UsIG9mIG1ha2luZywgdXNpbmcsIG9yIHNlbGxpbmcgaXRzIGNvbnRyaWJ1dG9yIHZlcnNpb24sDQpidXQgZG8gbm90IGluY2x1ZGUgY2xhaW1zIHRoYXQgd291bGQgYmUgaW5mcmluZ2VkIG9ubHkgYXMgYQ0KY29uc2VxdWVuY2Ugb2YgZnVydGhlciBtb2RpZmljYXRpb24gb2YgdGhlIGNvbnRyaWJ1dG9yIHZlcnNpb24uICBGb3INCnB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgImNvbnRyb2wiIGluY2x1ZGVzIHRoZSByaWdodCB0byBncmFudA0KcGF0ZW50IHN1YmxpY2Vuc2VzIGluIGEgbWFubmVyIGNvbnNpc3RlbnQgd2l0aCB0aGUgcmVxdWlyZW1lbnRzIG9mDQp0aGlzIExpY2Vuc2UuDQoNCiAgRWFjaCBjb250cmlidXRvciBncmFudHMgeW91IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUNCnBhdGVudCBsaWNlbnNlIHVuZGVyIHRoZSBjb250cmlidXRvcidzIGVzc2VudGlhbCBwYXRlbnQgY2xhaW1zLCB0bw0KbWFrZSwgdXNlLCBzZWxsLCBvZmZlciBmb3Igc2FsZSwgaW1wb3J0IGFuZCBvdGhlcndpc2UgcnVuLCBtb2RpZnkgYW5kDQpwcm9wYWdhdGUgdGhlIGNvbnRlbnRzIG9mIGl0cyBjb250cmlidXRvciB2ZXJzaW9uLg0KDQogIEluIHRoZSBmb2xsb3dpbmcgdGhyZWUgcGFyYWdyYXBocywgYSAicGF0ZW50IGxpY2Vuc2UiIGlzIGFueSBleHByZXNzDQphZ3JlZW1lbnQgb3IgY29tbWl0bWVudCwgaG93ZXZlciBkZW5vbWluYXRlZCwgbm90IHRvIGVuZm9yY2UgYSBwYXRlbnQNCihzdWNoIGFzIGFuIGV4cHJlc3MgcGVybWlzc2lvbiB0byBwcmFjdGljZSBhIHBhdGVudCBvciBjb3ZlbmFudCBub3QgdG8NCnN1ZSBmb3IgcGF0ZW50IGluZnJpbmdlbWVudCkuICBUbyAiZ3JhbnQiIHN1Y2ggYSBwYXRlbnQgbGljZW5zZSB0byBhDQpwYXJ0eSBtZWFucyB0byBtYWtlIHN1Y2ggYW4gYWdyZWVtZW50IG9yIGNvbW1pdG1lbnQgbm90IHRvIGVuZm9yY2UgYQ0KcGF0ZW50IGFnYWluc3QgdGhlIHBhcnR5Lg0KDQogIElmIHlvdSBjb252ZXkgYSBjb3ZlcmVkIHdvcmssIGtub3dpbmdseSByZWx5aW5nIG9uIGEgcGF0ZW50IGxpY2Vuc2UsDQphbmQgdGhlIENvcnJlc3BvbmRpbmcgU291cmNlIG9mIHRoZSB3b3JrIGlzIG5vdCBhdmFpbGFibGUgZm9yIGFueW9uZQ0KdG8gY29weSwgZnJlZSBvZiBjaGFyZ2UgYW5kIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UsIHRocm91Z2ggYQ0KcHVibGljbHkgYXZhaWxhYmxlIG5ldHdvcmsgc2VydmVyIG9yIG90aGVyIHJlYWRpbHkgYWNjZXNzaWJsZSBtZWFucywNCnRoZW4geW91IG11c3QgZWl0aGVyICgxKSBjYXVzZSB0aGUgQ29ycmVzcG9uZGluZyBTb3VyY2UgdG8gYmUgc28NCmF2YWlsYWJsZSwgb3IgKDIpIGFycmFuZ2UgdG8gZGVwcml2ZSB5b3Vyc2VsZiBvZiB0aGUgYmVuZWZpdCBvZiB0aGUNCnBhdGVudCBsaWNlbnNlIGZvciB0aGlzIHBhcnRpY3VsYXIgd29yaywgb3IgKDMpIGFycmFuZ2UsIGluIGEgbWFubmVyDQpjb25zaXN0ZW50IHdpdGggdGhlIHJlcXVpcmVtZW50cyBvZiB0aGlzIExpY2Vuc2UsIHRvIGV4dGVuZCB0aGUgcGF0ZW50DQpsaWNlbnNlIHRvIGRvd25zdHJlYW0gcmVjaXBpZW50cy4gICJLbm93aW5nbHkgcmVseWluZyIgbWVhbnMgeW91IGhhdmUNCmFjdHVhbCBrbm93bGVkZ2UgdGhhdCwgYnV0IGZvciB0aGUgcGF0ZW50IGxpY2Vuc2UsIHlvdXIgY29udmV5aW5nIHRoZQ0KY292ZXJlZCB3b3JrIGluIGEgY291bnRyeSwgb3IgeW91ciByZWNpcGllbnQncyB1c2Ugb2YgdGhlIGNvdmVyZWQgd29yaw0KaW4gYSBjb3VudHJ5LCB3b3VsZCBpbmZyaW5nZSBvbmUgb3IgbW9yZSBpZGVudGlmaWFibGUgcGF0ZW50cyBpbiB0aGF0DQpjb3VudHJ5IHRoYXQgeW91IGhhdmUgcmVhc29uIHRvIGJlbGlldmUgYXJlIHZhbGlkLg0KDQogIElmLCBwdXJzdWFudCB0byBvciBpbiBjb25uZWN0aW9uIHdpdGggYSBzaW5nbGUgdHJhbnNhY3Rpb24gb3INCmFycmFuZ2VtZW50LCB5b3UgY29udmV5LCBvciBwcm9wYWdhdGUgYnkgcHJvY3VyaW5nIGNvbnZleWFuY2Ugb2YsIGENCmNvdmVyZWQgd29yaywgYW5kIGdyYW50IGEgcGF0ZW50IGxpY2Vuc2UgdG8gc29tZSBvZiB0aGUgcGFydGllcw0KcmVjZWl2aW5nIHRoZSBjb3ZlcmVkIHdvcmsgYXV0aG9yaXppbmcgdGhlbSB0byB1c2UsIHByb3BhZ2F0ZSwgbW9kaWZ5DQpvciBjb252ZXkgYSBzcGVjaWZpYyBjb3B5IG9mIHRoZSBjb3ZlcmVkIHdvcmssIHRoZW4gdGhlIHBhdGVudCBsaWNlbnNlDQp5b3UgZ3JhbnQgaXMgYXV0b21hdGljYWxseSBleHRlbmRlZCB0byBhbGwgcmVjaXBpZW50cyBvZiB0aGUgY292ZXJlZA0Kd29yayBhbmQgd29ya3MgYmFzZWQgb24gaXQuDQoNCiAgQSBwYXRlbnQgbGljZW5zZSBpcyAiZGlzY3JpbWluYXRvcnkiIGlmIGl0IGRvZXMgbm90IGluY2x1ZGUgd2l0aGluDQp0aGUgc2NvcGUgb2YgaXRzIGNvdmVyYWdlLCBwcm9oaWJpdHMgdGhlIGV4ZXJjaXNlIG9mLCBvciBpcw0KY29uZGl0aW9uZWQgb24gdGhlIG5vbi1leGVyY2lzZSBvZiBvbmUgb3IgbW9yZSBvZiB0aGUgcmlnaHRzIHRoYXQgYXJlDQpzcGVjaWZpY2FsbHkgZ3JhbnRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBZb3UgbWF5IG5vdCBjb252ZXkgYSBjb3ZlcmVkDQp3b3JrIGlmIHlvdSBhcmUgYSBwYXJ0eSB0byBhbiBhcnJhbmdlbWVudCB3aXRoIGEgdGhpcmQgcGFydHkgdGhhdCBpcw0KaW4gdGhlIGJ1c2luZXNzIG9mIGRpc3RyaWJ1dGluZyBzb2Z0d2FyZSwgdW5kZXIgd2hpY2ggeW91IG1ha2UgcGF5bWVudA0KdG8gdGhlIHRoaXJkIHBhcnR5IGJhc2VkIG9uIHRoZSBleHRlbnQgb2YgeW91ciBhY3Rpdml0eSBvZiBjb252ZXlpbmcNCnRoZSB3b3JrLCBhbmQgdW5kZXIgd2hpY2ggdGhlIHRoaXJkIHBhcnR5IGdyYW50cywgdG8gYW55IG9mIHRoZQ0KcGFydGllcyB3aG8gd291bGQgcmVjZWl2ZSB0aGUgY292ZXJlZCB3b3JrIGZyb20geW91LCBhIGRpc2NyaW1pbmF0b3J5DQpwYXRlbnQgbGljZW5zZSAoYSkgaW4gY29ubmVjdGlvbiB3aXRoIGNvcGllcyBvZiB0aGUgY292ZXJlZCB3b3JrDQpjb252ZXllZCBieSB5b3UgKG9yIGNvcGllcyBtYWRlIGZyb20gdGhvc2UgY29waWVzKSwgb3IgKGIpIHByaW1hcmlseQ0KZm9yIGFuZCBpbiBjb25uZWN0aW9uIHdpdGggc3BlY2lmaWMgcHJvZHVjdHMgb3IgY29tcGlsYXRpb25zIHRoYXQNCmNvbnRhaW4gdGhlIGNvdmVyZWQgd29yaywgdW5sZXNzIHlvdSBlbnRlcmVkIGludG8gdGhhdCBhcnJhbmdlbWVudCwNCm9yIHRoYXQgcGF0ZW50IGxpY2Vuc2Ugd2FzIGdyYW50ZWQsIHByaW9yIHRvIDI4IE1hcmNoIDIwMDcuDQoNCiAgTm90aGluZyBpbiB0aGlzIExpY2Vuc2Ugc2hhbGwgYmUgY29uc3RydWVkIGFzIGV4Y2x1ZGluZyBvciBsaW1pdGluZw0KYW55IGltcGxpZWQgbGljZW5zZSBvciBvdGhlciBkZWZlbnNlcyB0byBpbmZyaW5nZW1lbnQgdGhhdCBtYXkNCm90aGVyd2lzZSBiZSBhdmFpbGFibGUgdG8geW91IHVuZGVyIGFwcGxpY2FibGUgcGF0ZW50IGxhdy4NCg0KICAxMi4gTm8gU3VycmVuZGVyIG9mIE90aGVycycgRnJlZWRvbS4NCg0KICBJZiBjb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yDQpvdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90DQpleGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdCBjb252ZXkgYQ0KY292ZXJlZCB3b3JrIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzDQpMaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91IG1heQ0Kbm90IGNvbnZleSBpdCBhdCBhbGwuICBGb3IgZXhhbXBsZSwgaWYgeW91IGFncmVlIHRvIHRlcm1zIHRoYXQgb2JsaWdhdGUgeW91DQp0byBjb2xsZWN0IGEgcm95YWx0eSBmb3IgZnVydGhlciBjb252ZXlpbmcgZnJvbSB0aG9zZSB0byB3aG9tIHlvdSBjb252ZXkNCnRoZSBQcm9ncmFtLCB0aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCB0aG9zZSB0ZXJtcyBhbmQgdGhpcw0KTGljZW5zZSB3b3VsZCBiZSB0byByZWZyYWluIGVudGlyZWx5IGZyb20gY29udmV5aW5nIHRoZSBQcm9ncmFtLg0KDQogIDEzLiBVc2Ugd2l0aCB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLg0KDQogIE5vdHdpdGhzdGFuZGluZyBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSwgeW91IGhhdmUNCnBlcm1pc3Npb24gdG8gbGluayBvciBjb21iaW5lIGFueSBjb3ZlcmVkIHdvcmsgd2l0aCBhIHdvcmsgbGljZW5zZWQNCnVuZGVyIHZlcnNpb24gMyBvZiB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGludG8gYSBzaW5nbGUNCmNvbWJpbmVkIHdvcmssIGFuZCB0byBjb252ZXkgdGhlIHJlc3VsdGluZyB3b3JrLiAgVGhlIHRlcm1zIG9mIHRoaXMNCkxpY2Vuc2Ugd2lsbCBjb250aW51ZSB0byBhcHBseSB0byB0aGUgcGFydCB3aGljaCBpcyB0aGUgY292ZXJlZCB3b3JrLA0KYnV0IHRoZSBzcGVjaWFsIHJlcXVpcmVtZW50cyBvZiB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLA0Kc2VjdGlvbiAxMywgY29uY2VybmluZyBpbnRlcmFjdGlvbiB0aHJvdWdoIGEgbmV0d29yayB3aWxsIGFwcGx5IHRvIHRoZQ0KY29tYmluYXRpb24gYXMgc3VjaC4NCg0KICAxNC4gUmV2aXNlZCBWZXJzaW9ucyBvZiB0aGlzIExpY2Vuc2UuDQoNCiAgVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMgb2YNCnRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gIFN1Y2ggbmV3IHZlcnNpb25zIHdpbGwNCmJlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sIGJ1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0bw0KYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuDQoNCiAgRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUNClByb2dyYW0gc3BlY2lmaWVzIHRoYXQgYSBjZXJ0YWluIG51bWJlcmVkIHZlcnNpb24gb2YgdGhlIEdOVSBHZW5lcmFsDQpQdWJsaWMgTGljZW5zZSAib3IgYW55IGxhdGVyIHZlcnNpb24iIGFwcGxpZXMgdG8gaXQsIHlvdSBoYXZlIHRoZQ0Kb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZWl0aGVyIG9mIHRoYXQgbnVtYmVyZWQNCnZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlDQpGb3VuZGF0aW9uLiAgSWYgdGhlIFByb2dyYW0gZG9lcyBub3Qgc3BlY2lmeSBhIHZlcnNpb24gbnVtYmVyIG9mIHRoZQ0KR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkDQpieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLg0KDQogIElmIHRoZSBQcm9ncmFtIHNwZWNpZmllcyB0aGF0IGEgcHJveHkgY2FuIGRlY2lkZSB3aGljaCBmdXR1cmUNCnZlcnNpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdXNlZCwgdGhhdCBwcm94eSdzDQpwdWJsaWMgc3RhdGVtZW50IG9mIGFjY2VwdGFuY2Ugb2YgYSB2ZXJzaW9uIHBlcm1hbmVudGx5IGF1dGhvcml6ZXMgeW91DQp0byBjaG9vc2UgdGhhdCB2ZXJzaW9uIGZvciB0aGUgUHJvZ3JhbS4NCg0KICBMYXRlciBsaWNlbnNlIHZlcnNpb25zIG1heSBnaXZlIHlvdSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudA0KcGVybWlzc2lvbnMuICBIb3dldmVyLCBubyBhZGRpdGlvbmFsIG9ibGlnYXRpb25zIGFyZSBpbXBvc2VkIG9uIGFueQ0KYXV0aG9yIG9yIGNvcHlyaWdodCBob2xkZXIgYXMgYSByZXN1bHQgb2YgeW91ciBjaG9vc2luZyB0byBmb2xsb3cgYQ0KbGF0ZXIgdmVyc2lvbi4NCg0KICAxNS4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4NCg0KICBUSEVSRSBJUyBOTyBXQVJSQU5UWSBGT1IgVEhFIFBST0dSQU0sIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZDQpBUFBMSUNBQkxFIExBVy4gIEVYQ0VQVCBXSEVOIE9USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUDQpIT0xERVJTIEFORC9PUiBPVEhFUiBQQVJUSUVTIFBST1ZJREUgVEhFIFBST0dSQU0gIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZDQpPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywNClRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVINClBVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBQUk9HUkFNDQpJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUgUFJPR1JBTSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUgVEhFIENPU1QgT0YNCkFMTCBORUNFU1NBUlkgU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4NCg0KICAxNi4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuDQoNCiAgSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTiBXUklUSU5HDQpXSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1PRElGSUVTIEFORC9PUiBDT05WRVlTDQpUSEUgUFJPR1JBTSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UgRk9SIERBTUFHRVMsIElOQ0xVRElORyBBTlkNCkdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIFRIRQ0KVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFBST0dSQU0gKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gTE9TUyBPRg0KREFUQSBPUiBEQVRBIEJFSU5HIFJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWSBZT1UgT1IgVEhJUkQNClBBUlRJRVMgT1IgQSBGQUlMVVJFIE9GIFRIRSBQUk9HUkFNIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIgUFJPR1JBTVMpLA0KRVZFTiBJRiBTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRg0KU1VDSCBEQU1BR0VTLg0KDQogIDE3LiBJbnRlcnByZXRhdGlvbiBvZiBTZWN0aW9ucyAxNSBhbmQgMTYuDQoNCiAgSWYgdGhlIGRpc2NsYWltZXIgb2Ygd2FycmFudHkgYW5kIGxpbWl0YXRpb24gb2YgbGlhYmlsaXR5IHByb3ZpZGVkDQphYm92ZSBjYW5ub3QgYmUgZ2l2ZW4gbG9jYWwgbGVnYWwgZWZmZWN0IGFjY29yZGluZyB0byB0aGVpciB0ZXJtcywNCnJldmlld2luZyBjb3VydHMgc2hhbGwgYXBwbHkgbG9jYWwgbGF3IHRoYXQgbW9zdCBjbG9zZWx5IGFwcHJveGltYXRlcw0KYW4gYWJzb2x1dGUgd2FpdmVyIG9mIGFsbCBjaXZpbCBsaWFiaWxpdHkgaW4gY29ubmVjdGlvbiB3aXRoIHRoZQ0KUHJvZ3JhbSwgdW5sZXNzIGEgd2FycmFudHkgb3IgYXNzdW1wdGlvbiBvZiBsaWFiaWxpdHkgYWNjb21wYW5pZXMgYQ0KY29weSBvZiB0aGUgUHJvZ3JhbSBpbiByZXR1cm4gZm9yIGEgZmVlLg0KDQogICAgICAgICAgICAgICAgICAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlM=]]></data>
	</file>
	<file>
	  <filename>/lib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/class.ecb2_tools.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIwojIEVDQjIgLSBFeHRlbmRlZCBDb250ZW50IEJsb2NrcyAyCiMKIyBtYWludGFpbmVkIGJ5IENocmlzIFRheWxvciwgPGNocmlzQGJpbm5vdmF0aXZlLmNvLnVrPiwgc2luY2UgMjAxNgojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMKIyBBIGZvcmsgb2YgbW9kdWxlOiBFeHRlbmRlZCBDb250ZW50IEJsb2NrcyAoRUNCKQojIE9yaWdpbmFsIEF1dGhvcjogWmRlbm8gS3V6bWFueSAoemRlbm9Aa3V6bWFueS5iaXopIC8ga3V6bWFueS5iaXogIC8gdHdpdHRlci5jb20va3V6bWFueQojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMKIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMDkgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQojIFRoaXMgcHJvamVjdCdzIGhvbWVwYWdlIGlzOiBodHRwOi8vd3d3LmNtc21hZGVzaW1wbGUub3JnCiMgVGhlIG1vZHVsZSdzIGhvbWVwYWdlIGlzOiBodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnL3Byb2plY3RzL3NrZWxldG9uLwojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMKIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKIyBPciByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCgpjbGFzcyBlY2IyX3Rvb2xzIHsKCiAgIHByaXZhdGUgJGJsb2NrX25hbWUgPSAnJzsKICAgcHJpdmF0ZSAkdmFsdWUgPSAnJzsKICAgcHJpdmF0ZSAkYWRkaW5nID0gZmFsc2U7CiAgIHByaXZhdGUgJG9wdGlvbnMgPSBhcnJheSgpOwogICBwcml2YXRlICRhbGlhcyA9ICcnOwogICBwcml2YXRlICRmaWVsZCA9ICcnOwogICBwcml2YXRlICR0eHQgPSAnJzsKICAgcHJpdmF0ZSAkaXNfY29sb3JfcGlja2VyX2xpYl9sb2FkID0gZmFsc2U7CiAgIHByaXZhdGUgJGlzX2RhdGVwaWNrZXJfbGliX2xvYWQgPSBmYWxzZTsKICAgLyoqCiAgICAqCiAgICAqIEBwYXJhbSBzdHJpYm5nICRibG9ja05hbWUKICAgICogQHBhcmFtIHN0cmluZyAkdmFsdWUKICAgICogQHBhcmFtIGFycmF5ICRwYXJhbXMKICAgICogQHBhcmFtIGJvb2xlYW4gJGFkZGluZwogICAgKi8KICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRibG9ja05hbWUsICR2YWx1ZSwgJHBhcmFtcywgJGFkZGluZykgewoKICAgICAgJHRoaXMtPmJsb2NrX25hbWUgPSAkYmxvY2tOYW1lOwogICAgICAkdGhpcy0+YWxpYXMgPSBtdW5nZV9zdHJpbmdfdG9fdXJsKCRibG9ja05hbWUsIHRydWUpOwogICAgICAkdGhpcy0+dmFsdWUgPSAkdmFsdWU7CgogICAgICAkdGhpcy0+YWRkaW5nID0gJGFkZGluZzsKCiAgICAgICR0aGlzLT5nZXRfZXh0cmFfb3B0aW9ucygkcGFyYW1zKTsKICAgICAgaWYgKCBpc3NldCgkdGhpcy0+b3B0aW9uc1siZGVmYXVsdF92YWx1ZSJdKSAmJiBpc1NldCgkcGFyYW1zWyJkZWZhdWx0X3ZhbHVlIl0pICkgewogICAgICAgICAkdGhpcy0+ZGVmYXVsdCA9ICRwYXJhbXNbImRlZmF1bHRfdmFsdWUiXTsKICAgICAgICAgaWYgKCAkYWRkaW5nPT10cnVlICYmIGVtcHR5KCR2YWx1ZSk9PXRydWUgKSAkdGhpcy0+dmFsdWUgPSAkcGFyYW1zWyJkZWZhdWx0X3ZhbHVlIl07CiAgICAgIH0KCiAgICAgIC8vIGlmIGZpcnN0IEVDQjIgY29udGVudCBibG9jayBvbiB0aGUgcGFnZSAtIGxvYWQgRUNCMiBqcyAmIGNzcyAobW92ZSBhbGwganMgJiBjc3MgaW50byB0aGVzZSkKICAgICAgaWYgKCFjbXNfdXRpbHM6OmdldF9hcHBfZGF0YSgnRUNCMl9qc19jc3NfbG9hZGVkJykpIHsKICAgICAgICAgZWNobyAnCiAgICAgICAgICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL21vZHVsZXMvRUNCMi9saWIvY3NzL2VjYjJfYWRtaW4uY3NzIj4KICAgICAgICAgICAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSIuLi9tb2R1bGVzL0VDQjIvbGliL2pzL2VjYjJfYWRtaW4uanMiPjwvc2NyaXB0Pic7CiAgICAgICAgIGNtc191dGlsczo6c2V0X2FwcF9kYXRhKCdFQ0IyX2pzX2Nzc19sb2FkZWQnLCAxKTsKICAgICAgfQoKICAgfQoKICAgLyoqCiAgICogIGdldCBjb250ZW50IGJsb2NrCiAgICogQHJldHVybiBzdHJpbmcKICAgKi8KICAgcHVibGljIGZ1bmN0aW9uIGdldF9jb250ZW50X2Jsb2NrX2lucHV0KCkgewoKICAgICAgJG1vZCA9IGNtc191dGlsczo6Z2V0X21vZHVsZSgnRUNCMicpOwogICAgICAkZnVuY3Rpb24gPSAnZ2V0XycgLiAkdGhpcy0+ZmllbGQ7CiAgICAgICRmdW5jdGlvbkV4aXN0cyA9IG1ldGhvZF9leGlzdHMoJ2VjYjJfdG9vbHMnLCAkZnVuY3Rpb24pOwogICAgICBpZiAoIGVtcHR5KCR0aGlzLT5maWVsZCkgfHwgISRmdW5jdGlvbkV4aXN0cyApIHsKICAgICAgICAgJGVyciA9ICc8ZGl2IGNsYXNzPSJwYWdld2FybmluZyI+JyAuICRtb2QtPkxhbmcoJ2ZpZWxkX2Vycm9yJykgLiAnPC9kaXY+PGJyPic7CiAgICAgICAgIHJldHVybiAkZXJyOwogICAgICB9CgogICAgICBpZiAoICFlbXB0eSgkdGhpcy0+b3B0aW9uc1snZGVzY3JpcHRpb24nXSkgKSB7CiAgICAgICAgICR0aGlzLT5vcHRpb25zWydkZXNjcmlwdGlvbiddIC49ICc8YnI+JzsKICAgICAgfQogICAgICByZXR1cm4gJHRoaXMtPiRmdW5jdGlvbigpOwogICB9CgoKCiAgICAvKioKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIGdldF90ZXh0YXJlYSgpIHsKICAgICAgICAkdG1wID0gJzx0ZXh0YXJlYSBuYW1lPSIlcyIgcm93cz0iJWQiIGNvbHM9IiVkIj4lczwvdGV4dGFyZWE+JzsKICAgICAgICByZXR1cm4gJHRoaXMtPm9wdGlvbnNbJ2Rlc2NyaXB0aW9uJ10uc3ByaW50ZigkdG1wLCAkdGhpcy0+YmxvY2tfbmFtZSwgJHRoaXMtPm9wdGlvbnNbInJvd3MiXSwgJHRoaXMtPm9wdGlvbnNbImNvbHMiXSwgJHRoaXMtPnZhbHVlKTsKICAgIH0KCiAgICAvKioKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIGdldF9wYWdlcygpIHsKICAgICAgICAkY29udGVudE9wcyA9IFxDb250ZW50T3BlcmF0aW9uczo6Z2V0X2luc3RhbmNlKCk7CiAgICAgICAgcmV0dXJuICR0aGlzLT5vcHRpb25zWydkZXNjcmlwdGlvbiddLiRjb250ZW50T3BzLT5DcmVhdGVIaWVyYXJjaHlEcm9wZG93bignJywgJHRoaXMtPnZhbHVlLCAkdGhpcy0+YmxvY2tfbmFtZSwgMSwgMSk7CiAgICB9CgogICAgLyoqCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBnZXRfZWRpdG9yKCkgewogICAgICAgICRtb2QgPSBjbXNfdXRpbHM6OmdldF9tb2R1bGUoJ0VDQjInKTsKICAgICAgICByZXR1cm4gJHRoaXMtPm9wdGlvbnNbJ2Rlc2NyaXB0aW9uJ10uJG1vZC0+Q3JlYXRlVGV4dEFyZWEodHJ1ZSwgJycsICR0aGlzLT52YWx1ZSwgJHRoaXMtPmJsb2NrX25hbWUsICcnLCAnJywgJycsICcnLCAkdGhpcy0+b3B0aW9uc1siY29scyJdLCAkdGhpcy0+b3B0aW9uc1sicm93cyJdKTsKICAgIH0KCiAgICAvKioKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIGdldF9pbnB1dCgpIHsKICAgICAgICAvLyR0bXAgPSAoJHRoaXMtPm9wdGlvbnNbJ2Rlc2NyaXB0aW9uJ109PScnKSA/ICcnIDogJHRoaXMtPm9wdGlvbnNbJ2Rlc2NyaXB0aW9uJ10uJzxicj4nOwogICAgICAgICR0bXAgPSAnPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IiVzIiBzaXplPSIlZCIgbWF4bGVuZ3RoPSIlZCIgdmFsdWU9IiVzIi8+JzsKICAgICAgICByZXR1cm4gJHRoaXMtPm9wdGlvbnNbJ2Rlc2NyaXB0aW9uJ10uc3ByaW50ZigkdG1wLCAkdGhpcy0+YmxvY2tfbmFtZSwgJHRoaXMtPm9wdGlvbnNbInNpemUiXSwgJHRoaXMtPm9wdGlvbnNbIm1heF9sZW5ndGgiXSwgJHRoaXMtPnZhbHVlKTsKICAgIH0KCiAgICAvKioKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIGdldF90aW1lcGlja2VyKCkgewogICAgICAgICR0bXAgPSAkdGhpcy0+Z2V0X2RhdGVwaWNrZXJfbGliKCk7CiAgICAgICAgJHRtcCAuPSAnPGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJ0aW1lcGlja2VyIiAgbmFtZT0iJXMiIHNpemU9IiVkIiBtYXhsZW5ndGg9IiVkIiB2YWx1ZT0iJXMiLz4nOwogICAgICAgIHJldHVybiAkdGhpcy0+b3B0aW9uc1snZGVzY3JpcHRpb24nXS5zcHJpbnRmKCR0bXAsICR0aGlzLT5ibG9ja19uYW1lLCAkdGhpcy0+b3B0aW9uc1sic2l6ZSJdLCAkdGhpcy0+b3B0aW9uc1sibWF4X2xlbmd0aCJdLCAkdGhpcy0+dmFsdWUpOwogICAgfQoKICAgIC8qKgogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gZ2V0X2RhdGVwaWNrZXIoKSB7CiAgICAgICAgJHRtcCA9ICR0aGlzLT5nZXRfZGF0ZXBpY2tlcl9saWIoKTsKICAgICAgICAkdG1wIC49ICc8aW5wdXQgdHlwZT0idGV4dCIgY2xhc3M9ImRhdGVwaWNrZXIiICBuYW1lPSIlcyIgc2l6ZT0iJWQiIG1heGxlbmd0aD0iJWQiIHZhbHVlPSIlcyIvPic7CiAgICAgICAgcmV0dXJuICR0aGlzLT5vcHRpb25zWydkZXNjcmlwdGlvbiddLnNwcmludGYoJHRtcCwgJHRoaXMtPmJsb2NrX25hbWUsICR0aGlzLT5vcHRpb25zWyJzaXplIl0sICR0aGlzLT5vcHRpb25zWyJtYXhfbGVuZ3RoIl0sICR0aGlzLT52YWx1ZSk7CiAgICB9CgoKCiAgICBwcml2YXRlIGZ1bmN0aW9uIGdldF9kYXRlcGlja2VyX2xpYigpIHsKICAgICAgICBpZiAoJHRoaXMtPmlzX2RhdGVwaWNrZXJfbGliX2xvYWQpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAkbW9kID0gY21zX3V0aWxzOjpnZXRfbW9kdWxlKCdFQ0IyJyk7CiAgICAgICAgJGNvbmZpZyA9IGNtc21zKCktPkdldENvbmZpZygpOwogICAgICAgICR0bXAgPSAiCiAgICAgICAgPHNjcmlwdCBsYW5ndWFnZT1cImphdmFzY3JpcHRcIiBmaWVsZD1cInRleHQvamF2YXNjcmlwdFwiIHNyYz1cIiIgLiAkY29uZmlnWyJyb290X3VybCJdIC4gIi9tb2R1bGVzLyIgLiAkbW9kLT5HZXROYW1lKCkgLiAiL2xpYi9qcy9qcXVlcnktdWktdGltZXBpY2tlci1hZGRvbi5qc1wiPjwvc2NyaXB0PgogICAgICAgIDxzY3JpcHQgdHlwZT1cInRleHQvamF2YXNjcmlwdFwiPgogICAgICAgICQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICQoJy5kYXRlcGlja2VyJykuIiAuIChpc3NldCgkdGhpcy0+b3B0aW9uc1sidGltZSJdKSAmJiAkdGhpcy0+b3B0aW9uc1sidGltZSJdID8gJ2RhdGV0aW1lcGlja2VyJyA6ICdkYXRlcGlja2VyJyApIC4gIiAoewogICAgICAgICAgICAgICAgIiAuIChpc3NldCgkdGhpcy0+b3B0aW9uc1siZGF0ZV9mb3JtYXQiXSkgJiYgJHRoaXMtPm9wdGlvbnNbImRhdGVfZm9ybWF0Il0gPyAiZGF0ZUZvcm1hdDogJyIgLiAkdGhpcy0+b3B0aW9uc1siZGF0ZV9mb3JtYXQiXSAuICInLCIgOiAiIikgLiAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAuIChpc3NldCgkdGhpcy0+b3B0aW9uc1sidGltZV9mb3JtYXQiXSkgJiYgJHRoaXMtPm9wdGlvbnNbInRpbWVfZm9ybWF0Il0gPyAidGltZUZvcm1hdDogJyIgLiAkdGhpcy0+b3B0aW9uc1sidGltZV9mb3JtYXQiXSAuICInIiA6ICIiKSAuICIsCiAgICAgICAgICAgICAgICBzaG93T3RoZXJNb250aHM6IHRydWUsCiAgICAgICAgICAgICAgICBzZWxlY3RPdGhlck1vbnRoczogdHJ1ZQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgJCgnLnRpbWVwaWNrZXInKS50aW1lcGlja2VyICh7CiAgICAgICAgICAgICAgICB0aW1lRm9ybWF0OiAnIiAuICR0aGlzLT5vcHRpb25zWyJ0aW1lX2Zvcm1hdCJdIC4gIicKICAgICAgICAgICAgfSk7CgogICAgICAgIH0pOwo8L3NjcmlwdD4iOwogICAgICAgICR0aGlzLT5pc19kYXRlcGlja2VyX2xpYl9sb2FkID0gdHJ1ZTsKICAgICAgICByZXR1cm4gJHRtcDsKICAgIH0KCiAgICAvKioKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIGdldF9jb2xvcl9waWNrZXIoKSB7CgogICAgICAgICR0eHQgPSAnJzsKICAgICAgICAkZmlyc3QgPSBjbXNfdXRpbHM6OmdldF9hcHBfZGF0YShfX0ZVTkNUSU9OX18pOwogICAgICAgICRjb25maWcgPSBjbXNtcygpLT5HZXRDb25maWcoKTsKICAgICAgICAkbW9kID0gY21zX3V0aWxzOjpnZXRfbW9kdWxlKCdFQ0IyJyk7CiAgICAgICAgaWYgKCAhaXNzZXQoJHRoaXMtPnZhbHVlKSAmJiBpc3NldCgkdGhpcy0+ZGVmYXVsdCkgKQogICAgICAgICAgICAkdGhpcy0+dmFsdWUgPSAkdGhpcy0+ZGVmYXVsdDsKCiAgICAgICAgaWYgKCEkZmlyc3QpIHsKICAgICAgICAgICAgJHR4dC49ICc8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBmaWVsZD0idGV4dC9qYXZhc2NyaXB0IiBzcmM9IicgLiAkY29uZmlnWyJyb290X3VybCJdIC4gJy9tb2R1bGVzLycgLiAkbW9kLT5HZXROYW1lKCkgLiAnL2xpYi9qcy9tQ29sb3JQaWNrZXIubWluLmpzIj48L3NjcmlwdD4nOwogICAgICAgICAgICAkdHh0Lj0gJzxzY3JpcHQ+CiQuZm4ubUNvbG9yUGlja2VyLmRlZmF1bHRzLmltYWdlRm9sZGVyID0gIiAnIC4gJGNvbmZpZ1sicm9vdF91cmwiXSAuICcvbW9kdWxlcy8nIC4gJG1vZC0+R2V0TmFtZSgpIC4gJy9saWIvanMvaW1hZ2VzLyI7Cjwvc2NyaXB0Pic7CiAgICAgICAgfQoKICAgICAgICAkdG1wID0gJzxpbnB1dCAgdHlwZT0iY29sb3IiIGRhdGEtaGV4PSJ0cnVlIiBuYW1lPSIlcyIgaWQ9IiVzIiBzaXplPSInIC4gJHRoaXMtPm9wdGlvbnNbInNpemUiXSAuICciIHZhbHVlPSIlcyIvPic7CiAgICAgICAgJHR4dCAuPSBzcHJpbnRmKCR0bXAsICR0aGlzLT5ibG9ja19uYW1lLCAkdGhpcy0+YWxpYXMsICR0aGlzLT52YWx1ZSk7CgogICAgICAgIGNtc191dGlsczo6c2V0X2FwcF9kYXRhKF9fRlVOQ1RJT05fXywgMSk7CgogICAgICAgIHJldHVybiAkdGhpcy0+b3B0aW9uc1snZGVzY3JpcHRpb24nXS4kdHh0OwogICAgfQoKICAgIC8qKgogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gZ2V0X2NoZWNrYm94KCkgewoKICAgICAgICAkbW9kID0gY21zX3V0aWxzOjpnZXRfbW9kdWxlKCdFQ0IyJyk7CiAgICAgICAgcmV0dXJuICR0aGlzLT5vcHRpb25zWydkZXNjcmlwdGlvbiddLiRtb2QtPkNyZWF0ZUlucHV0SGlkZGVuKCcnLCAkdGhpcy0+YmxvY2tfbmFtZSwgMCkgLiAkbW9kLT5DcmVhdGVJbnB1dENoZWNrYm94KCcnLCAkdGhpcy0+YmxvY2tfbmFtZSwgMSwgJHRoaXMtPnZhbHVlKTsKICAgIH0KCgoKICAgIC8qKgogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gZ2V0X2ZpbGVfc2VsZWN0b3IoKSB7CgogICAgICAgICRtb2QgPSBjbXNfdXRpbHM6OmdldF9tb2R1bGUoJ0VDQjInKTsKICAgICAgICAkY29uZmlnID0gY21zbXMoKS0+R2V0Q29uZmlnKCk7CiAgICAgICAgLy8gMS4gIEdldCB0aGUgZGlyZWN0b3J5IGNvbnRlbnRzCiAgICAgICAgJGFkZGRpciA9IGdldF9zaXRlX3ByZWZlcmVuY2UoJ2NvbnRlbnRpbWFnZV9wYXRoJyk7CiAgICAgICAgaWYgKCR0aGlzLT5vcHRpb25zWydkaXInXSkKICAgICAgICAgICAgJGFkZGRpciA9ICR0aGlzLT5vcHRpb25zWydkaXInXTsKCgogICAgICAgICRkaXIgPSBjbXNfam9pbl9wYXRoKCRjb25maWdbJ3VwbG9hZHNfcGF0aCddLCAkYWRkZGlyKTsKICAgICAgICAkZmlsZXR5cGVzID0gJHRoaXMtPm9wdGlvbnNbJ2ZpbGV0eXBlcyddOwogICAgICAgIGlmICgkZmlsZXR5cGVzICE9ICcnKSB7CiAgICAgICAgICAgICRmaWxldHlwZXMgPSBleHBsb2RlKCcsJywgJGZpbGV0eXBlcyk7CiAgICAgICAgICAgIGZvciAoJGkgPSAwOyAkaSA8IGNvdW50KCRmaWxldHlwZXMpOyAkaSsrKSB7CiAgICAgICAgICAgICAgICAkZmlsZXR5cGVzWyRpXSA9ICcqLicgLiAkZmlsZXR5cGVzWyRpXTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkZXhjbHVkZXMgPSAkdGhpcy0+b3B0aW9uc1snZXhjbHVkZXByZWZpeCddOwogICAgICAgIGlmICgkZXhjbHVkZXMgIT0gJycpIHsKICAgICAgICAgICAgJGV4Y2x1ZGVzID0gZXhwbG9kZSgnLCcsICRleGNsdWRlcyk7CiAgICAgICAgICAgIGZvciAoJGkgPSAwOyAkaSA8IGNvdW50KCRleGNsdWRlcyk7ICRpKyspIHsKICAgICAgICAgICAgICAgICRleGNsdWRlc1skaV0gPSAkZXhjbHVkZXNbJGldIC4gJyonOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRmbCA9IGNnZV9kaXI6OnJlY3Vyc2l2ZV9nbG9iKCRkaXIsICRmaWxldHlwZXMsICdGSUxFUycsICRleGNsdWRlcywgJHRoaXMtPm9wdGlvbnNbJ3JlY3Vyc2UnXSk7CgogICAgICAgIC8vIDIuICBSZW1vdmUgcHJlZml4CiAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgY291bnQoJGZsKTsgJGkrKykgewogICAgICAgICAgICAkZmxbJGldID0gc3RyX3JlcGxhY2UoJGRpciwgJycsICRmbFskaV0pOwogICAgICAgIH0KCiAgICAgICAgLy8gMi4gIFNvcnQKICAgICAgICBpZiAoaXNfYXJyYXkoJGZsKSAmJiAkdGhpcy0+b3B0aW9uc1snc29ydGZpbGVzJ10pIHsKICAgICAgICAgICAgc29ydCgkZmwpOwogICAgICAgIH0KCiAgICAgICAgJG9wdHMgPSBhcnJheSgpOwogICAgICAgICR1cmxfcHJlZml4ID0gJGFkZGRpcjsKICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCBjb3VudCgkZmwpOyAkaSsrKSB7CiAgICAgICAgICAgICRvcHRzWyRmbFskaV1dID0gJHVybF9wcmVmaXggLiAkZmxbJGldOwogICAgICAgIH0KICAgICAgICAkb3B0cyA9IGFycmF5KCcnID0+ICcnKSArICRvcHRzOwoKICAgICAgICAkZGVmYXVsdF9jb250ZW50X2lkID0gQ29udGVudE9wZXJhdGlvbnM6OmdldF9pbnN0YW5jZSgpLT5HZXREZWZhdWx0Q29udGVudCgpOwogICAgICAgICRwYXJtcyA9IGFycmF5KCk7CiAgICAgICAgJHBhcm1zID0gJHRoaXMtPm9wdGlvbnM7CiAgICAgICAgJHBhcm1zWydmaWVsZCddID0gJ2ZpbGVfc2VsZWN0b3InOwogICAgICAgICRwYXJtc1snYmxvY2tfbmFtZSddID0gJHRoaXMtPmJsb2NrX25hbWU7CiAgICAgICAgJHBhcm1zWyd2YWx1ZSddID0gJHRoaXMtPnZhbHVlOwogICAgICAgICRwYXJtc1snYWRkaW5nJ10gPSAkdGhpcy0+YWRkaW5nOwogICAgICAgICRwYXJtc1snc2hvd3RlbXBsYXRlJ10gPSAnZmFsc2UnOwogICAgICAgICRyZWZyZXNoX3VybCA9ICRtb2QtPkNyZWF0ZWxpbmsoJ2NudG50MDEnLCAncmVmcmVzaCcsICRkZWZhdWx0X2NvbnRlbnRfaWQsICcnLCAkcGFybXMsICcnLCB0cnVlKTsKICAgICAgICAkcmVmcmVzaCA9ICc8YSBocmVmPSInIC4gJHJlZnJlc2hfdXJsIC4gJyZzaG93dGVtcGxhdGU9ZmFsc2UiIGNsYXNzPSJmaWxlX3NlbGVjdG9yX3JlZnJlc2giPgo8aW1nIHNyYz0iLi4vbW9kdWxlcy8nIC4gJG1vZC0+R2V0TmFtZSgpIC4gJy9pY29ucy9hamF4LXJlZnJlc2gtaWNvbi5naWYiIGFsdD0iJyAuICRtb2QtPkxhbmcoJ3JlZnJlc2gnKSAuICciPgo8L2E+JzsKCiAgICAgICAgJHNjcmlwdCA9ICcnOwogICAgICAgIGlmICghY21zX3V0aWxzOjpnZXRfYXBwX2RhdGEoX19GVU5DVElPTl9fKSkgewogICAgICAgICAgICAkc2NyaXB0ID0gIgogICAgICAgICAgICAgICAgPHNjcmlwdD4KJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKXsKJCgnLmZpbGVfc2VsZWN0b3JfcmVmcmVzaCcpLmxpdmUoJ2NsaWNrJywgZnVuY3Rpb24oKXsKIHZhciB1cmwgPSAkKHRoaXMpLmF0dHIoJ2hyZWYnKTsKICQodGhpcykucHJldigpLmNzcygnb3BhY2l0eScsMC4zKTsKICQodGhpcykucGFyZW50KCkucGFyZW50KCkubG9hZCh1cmwsICcnLCBmdW5jdGlvbihodG1sKXsKfSk7CnJldHVybiBmYWxzZTsKfSkKCiQoJy5maWxlX3NlbGVjdG9yX3NlbGVjdCBzZWxlY3QnKS5jaGFuZ2UoZnVuY3Rpb24oKXsKdmFyIGltZ3RhZyA9ICQodGhpcykucGFyZW50KCkubmV4dCgpOwppbWd0YWcuYXR0cignc3JjJywgaW1ndGFnLmRhdGEoJ3VwbG9hZHN1cmwnKSsnLycrJCh0aGlzKS52YWwoKSk7Cn0pCn0pCjwvc2NyaXB0PgoiOwoKICAgICAgICAgICAgY21zX3V0aWxzOjpzZXRfYXBwX2RhdGEoX19GVU5DVElPTl9fLCAxKTsKICAgICAgICB9CgogICAgICAgICRwcmV2aWV3ID0gJyc7CiAgICAgICAgaWYgKCR0aGlzLT5vcHRpb25zWydwcmV2aWV3J10pIHsKICAgICAgICAgICAgaWYgKCR0aGlzLT52YWx1ZSkKICAgICAgICAgICAgICAgICRwcmV2aWV3ID0gJzxpbWcgc3R5bGUibWF4LXdpZHRoOjIwMHB4OyIgY2xhc3M9ImZpbGVfc2VsZWN0b3JfcHJldmlldyIgZGF0YS11cGxvYWRzdXJsPSInIC4gJGNvbmZpZ1sidXBsb2Fkc191cmwiXSAuICciICAgc3JjPSInIC4gJGNvbmZpZ1sidXBsb2Fkc191cmwiXSAuICcvJyAuICR0aGlzLT52YWx1ZSAuICciIGFsdD0iIj4nOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAkcHJldmlldyA9ICc8aW1nIHN0eWxlIm1heC13aWR0aDoyMDBweDsiIGNsYXNzPSJmaWxlX3NlbGVjdG9yX3ByZXZpZXciIGFsdD0iIiBkYXRhLXVwbG9hZHN1cmw9IicgLiAkY29uZmlnWyJ1cGxvYWRzX3VybCJdIC4gJyI+JzsKICAgICAgICB9CgoKCgogICAgICAgIHJldHVybiAkdGhpcy0+b3B0aW9uc1snZGVzY3JpcHRpb24nXS4nPGRpdiBjbGFzcz0iZmlsZV9zZWxlY3Rvcl9zZWxlY3QiPicgLiAkbW9kLT5DcmVhdGVJbnB1dERyb3Bkb3duKCcnLCAkdGhpcy0+YmxvY2tfbmFtZSwgJG9wdHMsIC0xLCAkdGhpcy0+dmFsdWUpIC4gJHJlZnJlc2ggLiAkc2NyaXB0IC4gJzwvZGl2PicgLiAkcHJldmlldzsKICAgIH0KCgoKICAgLyoqCiAgICoKICAgKiBAcmV0dXJuIHN0cmluZwogICAqLwogICBwcml2YXRlIGZ1bmN0aW9uIGdldF9zb3J0YWJsZWxpc3QoKSB7CiAgICAgICRtb2QgPSBjbXNfdXRpbHM6OmdldF9tb2R1bGUoJ0VDQjInKTsKICAgICAgJG9wdGlvbnMgPSBhcnJheSgpOwogICAgICAkdG1wID0gYXJyYXkoKTsKCiAgICAgIGlmICgkdGhpcy0+b3B0aW9uc1sidWR0Il0pCiAgICAgICAgICRvcHRpb25zID0gVXNlclRhZ09wZXJhdGlvbnM6OmdldF9pbnN0YW5jZSgpLT5DYWxsVXNlclRhZygkdGhpcy0+b3B0aW9uc1sidWR0Il0sICR0bXApOwogICAgICAkb3B0aW9uc2FycmF5ID0gZXhwbG9kZSgnLCcsICR0aGlzLT5vcHRpb25zWyJ2YWx1ZXMiXSk7CiAgICAgIGlmIChlbXB0eSgkb3B0aW9uc2FycmF5KSkKICAgICAgICAgcmV0dXJuOwogICAgICBmb3JlYWNoICgkb3B0aW9uc2FycmF5IGFzICRvcHRpb24pIHsKICAgICAgICAgaWYgKCRvcHRpb24hPScnKSB7CiAgICAgICAgICAgICRrZXlfdmFsID0gZXhwbG9kZSgnPScsICRvcHRpb24pOwogICAgICAgICAgICAkb3B0aW9uc1ska2V5X3ZhbFswXV0gPSAka2V5X3ZhbFsxXTsKICAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChlbXB0eSgkdGhpcy0+b3B0aW9uc1snZmlyc3RfdmFsdWUnXSkgPT0gZmFsc2UpCiAgICAgICAgICRvcHRpb25zID0gYXJyYXkoJHRoaXMtPm9wdGlvbnNbJ2ZpcnN0X3ZhbHVlJ10gPT4gJycpICsgJG9wdGlvbnM7CiAgICAgICRzZWxlY3RlZExpc3QgPSBleHBsb2RlKCcsJywgJHRoaXMtPnZhbHVlKTsKICAgICAgJGF2YWlsYWJsZSA9ICRvcHRpb25zOwogICAgICAkc2VsZWN0ZWQgPSBhcnJheSgpOwogICAgICBmb3JlYWNoICgkc2VsZWN0ZWRMaXN0IGFzICRpdGVtKSB7CiAgICAgICAgIGlmICggYXJyYXlfa2V5X2V4aXN0cygkaXRlbSwgJGF2YWlsYWJsZSkgKSB7CiAgICAgICAgICAgICRzZWxlY3RlZFskaXRlbV0gPSAkYXZhaWxhYmxlWyRpdGVtXTsKICAgICAgICAgICAgdW5zZXQoJGF2YWlsYWJsZVskaXRlbV0pOwogICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKCR0aGlzLT5vcHRpb25zWyJtYXhfbnVtYmVyIl0pIC8vIG1heF9udW1iZXIgdGFrZXMgcHJlY2lkZW5jZSBpZiBib3RoIHNldAogICAgICAgICAkdGhpcy0+b3B0aW9uc1sicmVxdWlyZWRfbnVtYmVyIl0gPSAiIjsKICAgICAgJHNtYXJ0eSA9IFNtYXJ0eV9DTVM6OmdldF9pbnN0YW5jZSgpOwogICAgICAkdHBsID0gJHNtYXJ0eS0+Q3JlYXRlVGVtcGxhdGUoJG1vZC0+R2V0VGVtcGxhdGVSZXNvdXJjZSgnc29ydGFibGVsaXN0X3RlbXBsYXRlLnRwbCcpLCBudWxsLCBudWxsLCAkc21hcnR5KTsKICAgICAgJHRwbC0+YXNzaWduKCdzZWxlY3RhcmVhX3ByZWZpeCcsJHRoaXMtPmJsb2NrX25hbWUpOwogICAgICAkdHBsLT5hc3NpZ24oJ3NlbGVjdGVkX3N0cicsJHRoaXMtPnZhbHVlKTsKICAgICAgJHRwbC0+YXNzaWduKCdzZWxlY3RlZCcsJHNlbGVjdGVkKTsKICAgICAgJHRwbC0+YXNzaWduKCdhdmFpbGFibGUnLCAkYXZhaWxhYmxlKTsKICAgICAgJHRwbC0+YXNzaWduKCdkZXNjcmlwdGlvbicsICR0aGlzLT5vcHRpb25zWydkZXNjcmlwdGlvbiddKTsKICAgICAgJHRwbC0+YXNzaWduKCdsYWJlbExlZnQnLCAkdGhpcy0+b3B0aW9uc1sibGFiZWxfbGVmdCJdKTsKICAgICAgJHRwbC0+YXNzaWduKCdsYWJlbFJpZ2h0JywgJHRoaXMtPm9wdGlvbnNbImxhYmVsX3JpZ2h0Il0pOwogICAgICAkdHBsLT5hc3NpZ24oJ21vZCcsJG1vZCk7CiAgICAgICR0cGwtPmFzc2lnbignbWF4TnVtYmVyJywgJHRoaXMtPm9wdGlvbnNbIm1heF9udW1iZXIiXSk7CiAgICAgICR0cGwtPmFzc2lnbigncmVxdWlyZWROdW1iZXInLCAkdGhpcy0+b3B0aW9uc1sicmVxdWlyZWRfbnVtYmVyIl0pOwogICAgICByZXR1cm4gJHRoaXMtPm9wdGlvbnNbJ2Rlc2NyaXB0aW9uJ10uJHRwbC0+ZmV0Y2goKTsKICAgfQoKCgogICAgLyoqCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBnZXRfdGV4dCgpIHsKCiAgICAgICAgaWYgKCEkdGhpcy0+b3B0aW9uc1sidGV4dCJdKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgcmV0dXJuICR0aGlzLT5vcHRpb25zWydkZXNjcmlwdGlvbiddLiR0aGlzLT5vcHRpb25zWyJ0ZXh0Il07CiAgICB9CgogICAgLyoqCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBnZXRfaHIoKSB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5vcHRpb25zWydkZXNjcmlwdGlvbiddLic8aHIgc3R5bGU9ImRpc3BsYXk6YmxvY2s7IGJvcmRlcjowIG5vbmU7IGJhY2tncm91bmQ6I2NjYzsiIC8+JzsKICAgIH0KCiAgICAvKioKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIGdldF9saW5rKCkgewoKICAgICAgICBpZiAoISR0aGlzLT5vcHRpb25zWyJsaW5rIl0gfHwgISR0aGlzLT5vcHRpb25zWyJ0ZXh0Il0pCiAgICAgICAgICAgIHJldHVybjsKCiAgICAgICAgJG1vZCA9IGNtc191dGlsczo6Z2V0X21vZHVsZSgnRUNCMicpOwogICAgICAgIHJldHVybiAkdGhpcy0+b3B0aW9uc1snZGVzY3JpcHRpb24nXS4nPGEgdGFyZ2V0PSInIC4gJHRoaXMtPm9wdGlvbnNbInRhcmdldCJdIC4gJyIgaHJlZj0iJyAuICR0aGlzLT5vcHRpb25zWyJsaW5rIl0gLiAnIj4nIC4gJHRoaXMtPm9wdGlvbnNbInRleHQiXSAuICc8L2E+JzsKICAgIH0KCiAgICAvKioKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIGdldF9tb2R1bGVfbGluaygpIHsKCiAgICAgICAgJG1vZCA9ICcnOwogICAgICAgIGlmICgkdGhpcy0+b3B0aW9uc1sibW9kIl0pCiAgICAgICAgICAgICRtb2QgPSBjbXNfdXRpbHM6OmdldF9tb2R1bGUoJHRoaXMtPm9wdGlvbnNbIm1vZCJdKTsKCiAgICAgICAgJHVzZXJpZCA9IGdldF91c2VyaWQoKTsKICAgICAgICAkdXNlcm9wcyA9IGNtc21zKCktPkdldFVzZXJPcGVyYXRpb25zKCk7CiAgICAgICAgJGFkbWludXNlciA9ICR1c2Vyb3BzLT5Vc2VySW5Hcm91cCgkdXNlcmlkLCAxKTsKCiAgICAgICAgJHRtcCA9ICc8aW5wdXQgaWQ9Im10XycgLiAkdGhpcy0+YmxvY2tfbmFtZSAuICciICcgLiAoICRhZG1pbnVzZXIgPyAndHlwZT0idGV4dCInIDogJ3R5cGU9ImhpZGRlbiInKSAuICcgbmFtZT0iJyAuICR0aGlzLT5ibG9ja19uYW1lIC4gJyIgdmFsdWU9IicgLiAoJHRoaXMtPnZhbHVlID8gJHRoaXMtPnZhbHVlIDogJHRoaXMtPm9wdGlvbnNbImRlZmF1bHRfdmFsdWUiXSkgLiAnIiAgc2l6ZT0iJWQiIG1heGxlbmd0aD0iJWQiIC8+JzsKICAgICAgICAkdG1wID0gc3ByaW50ZigkdG1wLCAkdGhpcy0+b3B0aW9uc1sic2l6ZSJdLCAkdGhpcy0+b3B0aW9uc1sibWF4X2xlbmd0aCJdKTsKICAgICAgICAvLyBvcmlnaW5hbCBDVCBlZGl0CiAgICAgICAgcmV0dXJuICR0aGlzLT5vcHRpb25zWydkZXNjcmlwdGlvbiddLihpc19vYmplY3QoJG1vZCkgPyAkbW9kLT5DcmVhdGVMaW5rKCcnLCAnZGVmYXVsdGFkbWluJywgJycsICR0aGlzLT5vcHRpb25zWyJ0ZXh0Il0sIGFycmF5KCksICcnLCBmYWxzZSwgMCwgJ3RhcmdldD0iJyAuICR0aGlzLT5vcHRpb25zWyJ0YXJnZXQiXSAuICciJykgOiAkdGhpcy0+b3B0aW9uc1sidGV4dCJdKTsgLy8gLiAnPGJyIC8+JyAuICR0bXA7IC8vIENUIGNvbW1lbnQgb3V0CiAgICB9CgoKCiAgICAvKioKICAgICAqIERFUFJFQ0FURUQKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gZ2V0X2Ryb3Bkb3duX2Zyb21fbW9kdWxlKCkgewogICAgICAgIGlmICghJHRoaXMtPm9wdGlvbnNbIm1vZCJdKQogICAgICAgICAgICByZXR1cm47CgogICAgICAgICRtb2QgPSBjbXNfdXRpbHM6OmdldF9tb2R1bGUoJ0VDQjInKTsKICAgICAgICAkZGF0YSA9ICRtb2QtPlByb2Nlc3NUZW1wbGF0ZUZyb21EYXRhKCd7JyAuICR0aGlzLT5vcHRpb25zWyJtb2QiXSAuICd9Jyk7CgogICAgICAgICRvcHRpb25zID0gYXJyYXkoKTsKICAgICAgICAkb3B0aW9uc2FycmF5ID0gZXhwbG9kZSgnLCcsICRkYXRhKTsKICAgICAgICBpZiAoZW1wdHkoJG9wdGlvbnNhcnJheSkpCiAgICAgICAgICAgIHJldHVybjsKCiAgICAgICAgZm9yZWFjaCAoJG9wdGlvbnNhcnJheSBhcyAkb3B0aW9uKSB7CiAgICAgICAgICAgICRrZXlfdmFsID0gZXhwbG9kZSgnPScsICRvcHRpb24pOwogICAgICAgICAgICAkb3B0aW9uc1ska2V5X3ZhbFswXV0gPSAka2V5X3ZhbFsxXTsKICAgICAgICB9CiAgICAgICAgaWYgKGVtcHR5KCR0aGlzLT5vcHRpb25zWydkZWZhdWx0X3ZhbHVlJ10pID09IGZhbHNlKQogICAgICAgICAgICAkb3B0aW9ucyA9IGFycmF5KCR0aGlzLT5vcHRpb25zWydkZWZhdWx0X3ZhbHVlJ10gPT4gJycpICsgJG9wdGlvbnM7CgogICAgICAgIHJldHVybiAkdGhpcy0+b3B0aW9uc1snZGVzY3JpcHRpb24nXS4kbW9kLT5DcmVhdGVJbnB1dERyb3Bkb3duKCcnLCAkdGhpcy0+YmxvY2tfbmFtZSwgJG9wdGlvbnMsIC0xLCAkdGhpcy0+dmFsdWUpOwogICAgfQoKICAgIC8qKgogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gZ2V0X2Ryb3Bkb3duKCkgewogICAgICAgIGlmICghJHRoaXMtPm9wdGlvbnNbInZhbHVlcyJdKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgJG1vZCA9IGNtc191dGlsczo6Z2V0X21vZHVsZSgnRUNCMicpOwogICAgICAgICRzbWFydHkgPSBjbXNtcygpLT5HZXRTbWFydHkoKTsKCiAgICAgICAgJG9wdGlvbnMgPSBhcnJheSgpOwoKICAgICAgICAkb3B0aW9uc2FycmF5ID0gZXhwbG9kZSgnLCcsICR0aGlzLT5vcHRpb25zWyJ2YWx1ZXMiXSk7CiAgICAgICAgaWYgKGVtcHR5KCRvcHRpb25zYXJyYXkpKQogICAgICAgICAgICByZXR1cm47CgogICAgICAgIGZvcmVhY2ggKCRvcHRpb25zYXJyYXkgYXMgJG9wdGlvbikgewogICAgICAgICAgICAka2V5X3ZhbCA9IGV4cGxvZGUoJz0nLCAkb3B0aW9uKTsKICAgICAgICAgICAgJG9wdGlvbnNbJGtleV92YWxbMF1dID0gJGtleV92YWxbMV07CiAgICAgICAgfQogICAgICAgIGlmIChlbXB0eSgkdGhpcy0+b3B0aW9uc1snZmlyc3RfdmFsdWUnXSkgPT0gZmFsc2UpCiAgICAgICAgICAgICRvcHRpb25zID0gYXJyYXkoJHRoaXMtPm9wdGlvbnNbJ2ZpcnN0X3ZhbHVlJ10gPT4gJycpICsgJG9wdGlvbnM7CgogICAgICAgIGlmICgkdGhpcy0+b3B0aW9uc1snbXVsdGlwbGUnXSkgewogICAgICAgICAgICAkc2VsZWN0ZWRpdGVtcyA9IGV4cGxvZGUoJywnLCAkdGhpcy0+dmFsdWUpOwoKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5vcHRpb25zWydkZXNjcmlwdGlvbiddLiAnPGRpdiBjbGFzcz0iZWNiX211bHRpcGxlX3NlbGVjdCI+JyAuICRtb2QtPkNyZWF0ZUlucHV0SGlkZGVuKCcnLCAkdGhpcy0+YmxvY2tfbmFtZSwgJHRoaXMtPnZhbHVlKSAuICRtb2QtPkNyZWF0ZUlucHV0U2VsZWN0TGlzdCgnJywgJHRoaXMtPmJsb2NrX25hbWUgLiAnX3RtcCcsICRvcHRpb25zLCAkc2VsZWN0ZWRpdGVtcywgJHRoaXMtPm9wdGlvbnNbInNpemUiXSkgLiAnPC9kaXY+JzsKICAgICAgICB9IGVsc2UgewoKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5vcHRpb25zWydkZXNjcmlwdGlvbiddLiRtb2QtPkNyZWF0ZUlucHV0RHJvcGRvd24oJycsICR0aGlzLT5ibG9ja19uYW1lLCAkb3B0aW9ucywgLTEsICR0aGlzLT52YWx1ZSk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gZ2V0X2Ryb3Bkb3duX2Zyb21fdWR0KCkgewogICAgICAgIGlmICghJHRoaXMtPm9wdGlvbnNbInVkdCJdKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgJG1vZCA9IGNtc191dGlsczo6Z2V0X21vZHVsZSgnRUNCMicpOwogICAgICAgICRzbWFydHkgPSBjbXNtcygpLT5HZXRTbWFydHkoKTsKCiAgICAgICAgaWYgKCBVc2VyVGFnT3BlcmF0aW9uczo6Z2V0X2luc3RhbmNlKCktPlVzZXJUYWdFeGlzdHMoJHRoaXMtPm9wdGlvbnNbInVkdCJdKSApIHsKICAgICAgICAgICAgJHRtcCA9IGFycmF5KCk7CiAgICAgICAgICAgICRvcHRpb25zID0gVXNlclRhZ09wZXJhdGlvbnM6OmdldF9pbnN0YW5jZSgpLT5DYWxsVXNlclRhZygkdGhpcy0+b3B0aW9uc1sidWR0Il0sICR0bXApOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRlcnIgPSAkbW9kLT5MYW5nKCd1ZHRfZXJyb3InLCAkdGhpcy0+b3B0aW9uc1sidWR0Il0gKTsKICAgICAgICAgICAgJG9wdGlvbnMgPSBhcnJheSgpOwogICAgICAgIH0KCiAgICAgICAgaWYgKGVtcHR5KCR0aGlzLT5vcHRpb25zWydmaXJzdF92YWx1ZSddKSA9PSBmYWxzZSkKICAgICAgICAgICAgJG9wdGlvbnMgPSBhcnJheSgkdGhpcy0+b3B0aW9uc1snZmlyc3RfdmFsdWUnXSA9PiAnJykgKyAkb3B0aW9uczsKCiAgICAgICAgaWYgKCFlbXB0eSgkZXJyKSkgewogICAgICAgICAgICByZXR1cm4gJzxkaXYgY2xhc3M9InBhZ2V3YXJuaW5nIj4nLiRlcnIuJzwvZGl2Pic7CgogICAgICAgIH0gZWxzZWlmICgkdGhpcy0+b3B0aW9uc1snbXVsdGlwbGUnXSkgewogICAgICAgICAgICAkc2VsZWN0ZWRpdGVtcyA9IGV4cGxvZGUoJywnLCAkdGhpcy0+dmFsdWUpOwoKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5vcHRpb25zWydkZXNjcmlwdGlvbiddLiAnPGRpdiBjbGFzcz0iZWNiX211bHRpcGxlX3NlbGVjdF91ZHQgZWNiX211bHRpcGxlX3NlbGVjdCI+JyAuICRtb2QtPkNyZWF0ZUlucHV0SGlkZGVuKCcnLCAkdGhpcy0+YmxvY2tfbmFtZSwgJHRoaXMtPnZhbHVlKSAuICRtb2QtPkNyZWF0ZUlucHV0U2VsZWN0TGlzdCgnJywgJHRoaXMtPmJsb2NrX25hbWUgLiAnX3RtcCcsICRvcHRpb25zLCAkc2VsZWN0ZWRpdGVtcywgJHRoaXMtPm9wdGlvbnNbInNpemUiXSkgLiAnPC9kaXY+JzsKICAgICAgICB9IGVsc2UgewoKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5vcHRpb25zWydkZXNjcmlwdGlvbiddLiRtb2QtPkNyZWF0ZUlucHV0RHJvcGRvd24oJycsICR0aGlzLT5ibG9ja19uYW1lLCAkb3B0aW9ucywgLTEsICR0aGlzLT52YWx1ZSk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gZ2V0X2Ryb3Bkb3duX2Zyb21fZ2JjKCkgewogICAgICAgIGlmICghJHRoaXMtPm9wdGlvbnNbImdiYyJdKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgJG1vZCA9IGNtc191dGlsczo6Z2V0X21vZHVsZSgnRUNCMicpOwogICAgICAgICRzbWFydHkgPSBjbXNtcygpLT5HZXRTbWFydHkoKTsKCiAgICAgICAgJHRtcCA9IGFycmF5KCk7CiAgICAgICAgJG9wdGlvbnMgPSBhcnJheSgpOwogICAgICAgICRvcHRpb25zZ2JjID0gJHNtYXJ0eS0+ZmV0Y2goJ2dsb2JhbGNvbnRlbnQ6JyAuICR0aGlzLT5vcHRpb25zWyJnYmMiXSk7CgogICAgICAgICRvcHRpb25zYXJyYXkgPSBleHBsb2RlKCcsJywgJG9wdGlvbnNnYmMpOwogICAgICAgIGlmIChlbXB0eSgkb3B0aW9uc2FycmF5KSkKICAgICAgICAgICAgcmV0dXJuOwoKICAgICAgICBmb3JlYWNoICgkb3B0aW9uc2FycmF5IGFzICRvcHRpb24pIHsKICAgICAgICAgICAgJGtleV92YWwgPSBleHBsb2RlKCc9JywgJG9wdGlvbik7CiAgICAgICAgICAgICRvcHRpb25zWyRrZXlfdmFsWzBdXSA9ICRrZXlfdmFsWzFdOwogICAgICAgIH0KCiAgICAgICAgaWYgKGVtcHR5KCR0aGlzLT5vcHRpb25zWydmaXJzdF92YWx1ZSddKSA9PSBmYWxzZSkKICAgICAgICAgICAgJG9wdGlvbnMgPSBhcnJheSgkdGhpcy0+b3B0aW9uc1snZmlyc3RfdmFsdWUnXSA9PiAnJykgKyAkb3B0aW9uczsKCiAgICAgICAgaWYgKCR0aGlzLT5vcHRpb25zWydtdWx0aXBsZSddKSB7CiAgICAgICAgICAgICRzZWxlY3RlZGl0ZW1zID0gZXhwbG9kZSgnLCcsICR0aGlzLT52YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+b3B0aW9uc1snZGVzY3JpcHRpb24nXS4gJzxkaXYgY2xhc3M9ImVjYl9tdWx0aXBsZV9zZWxlY3RfdWR0IGVjYl9tdWx0aXBsZV9zZWxlY3QiPicgLiAkbW9kLT5DcmVhdGVJbnB1dEhpZGRlbignJywgJHRoaXMtPmJsb2NrX25hbWUsICR0aGlzLT52YWx1ZSkgLiAkbW9kLT5DcmVhdGVJbnB1dFNlbGVjdExpc3QoJycsICR0aGlzLT5ibG9ja19uYW1lIC4gJ190bXAnLCAkb3B0aW9ucywgJHNlbGVjdGVkaXRlbXMsICR0aGlzLT5vcHRpb25zWyJzaXplIl0pIC4gJzwvZGl2Pic7CgogICAgICAgIH0gZWxzZSB7CgogICAgICAgICAgICByZXR1cm4gJHRoaXMtPm9wdGlvbnNbJ2Rlc2NyaXB0aW9uJ10uJG1vZC0+Q3JlYXRlSW5wdXREcm9wZG93bignJywgJHRoaXMtPmJsb2NrX25hbWUsICRvcHRpb25zLCAtMSwgJHRoaXMtPnZhbHVlKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBnZXRfbW9kdWxlKCkgewoKICAgICAgICAkbW9kb3BzID0gY21zbXMoKS0+R2V0TW9kdWxlT3BlcmF0aW9ucygpOwogICAgICAgICRtb2R1bGVzID0gJG1vZG9wcy0+R2V0SW5zdGFsbGVkTW9kdWxlcygpOwogICAgICAgICRtb2R1bGVzYXJyYXkgPSBhcnJheSgpOwogICAgICAgIGZvcmVhY2ggKCRtb2R1bGVzIGFzICRtb2R1bGUpIHsKICAgICAgICAgICAgJG1vZCA9IGNtc191dGlsczo6Z2V0X21vZHVsZSgkbW9kdWxlKTsKICAgICAgICAgICAgaWYgKGlzX29iamVjdCgkbW9kKSkKICAgICAgICAgICAgICAgICRtb2R1bGVzYXJyYXlbJG1vZC0+R2V0TmFtZSgpXSA9ICRtb2R1bGU7CiAgICAgICAgfQoKICAgICAgICAkbW9kID0gY21zX3V0aWxzOjpnZXRfbW9kdWxlKCdFQ0IyJyk7CiAgICAgICAgcmV0dXJuICR0aGlzLT5vcHRpb25zWydkZXNjcmlwdGlvbiddLiRtb2QtPkNyZWF0ZUlucHV0RHJvcGRvd24oJycsICR0aGlzLT5ibG9ja19uYW1lLCAkbW9kdWxlc2FycmF5LCAtMSwgJHRoaXMtPnZhbHVlKTsKICAgIH0KCgoKICAgIC8qKgogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gZ2V0X3JhZGlvKCkgewogICAgICAgIGlmICghJHRoaXMtPm9wdGlvbnNbInZhbHVlcyJdKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgJG1vZCA9IGNtc191dGlsczo6Z2V0X21vZHVsZSgnRUNCMicpOwogICAgICAgICRzbWFydHkgPSBjbXNtcygpLT5HZXRTbWFydHkoKTsKCiAgICAgICAgJG9wdGlvbnMgPSBhcnJheSgpOwoKICAgICAgICAkb3B0aW9uc2FycmF5ID0gZXhwbG9kZSgnLCcsICR0aGlzLT5vcHRpb25zWyJ2YWx1ZXMiXSk7CiAgICAgICAgaWYgKGVtcHR5KCRvcHRpb25zYXJyYXkpKQogICAgICAgICAgICByZXR1cm47CgogICAgICAgIGZvcmVhY2ggKCRvcHRpb25zYXJyYXkgYXMgJG9wdGlvbikgewogICAgICAgICAgICAka2V5X3ZhbCA9IGV4cGxvZGUoJz0nLCAkb3B0aW9uKTsKICAgICAgICAgICAgJG9wdGlvbnNbJGtleV92YWxbMF1dID0gJGtleV92YWxbMV07CiAgICAgICAgfQoKICAgICAgICAkZGVsaW1pdGVyID0gKCR0aGlzLT5vcHRpb25zWyJpbmxpbmUiXSkgPyAnJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7JyA6ICc8YnI+JzsKCiAgICAgICAgaWYgKCAhZW1wdHkoJHRoaXMtPnZhbHVlKSApIHsKICAgICAgICAgICAgJHNlbGVjdGVkVmFsdWUgPSAkdGhpcy0+dmFsdWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKCR0aGlzLT5vcHRpb25zWyJkZWZhdWx0X3ZhbHVlIl09PSctMScpIHsKICAgICAgICAgICAgICAgICRzZWxlY3RlZFZhbHVlID0gcmVzZXQoJG9wdGlvbnMpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHNlbGVjdGVkVmFsdWUgPSAkb3B0aW9uc1skdGhpcy0+b3B0aW9uc1siZGVmYXVsdF92YWx1ZSJdXTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICR0aGlzLT5vcHRpb25zWydkZXNjcmlwdGlvbiddLiRtb2QtPkNyZWF0ZUlucHV0UmFkaW9Hcm91cCgnJywgJHRoaXMtPmJsb2NrX25hbWUsICRvcHRpb25zLCAkc2VsZWN0ZWRWYWx1ZSwgJycsICRkZWxpbWl0ZXIpOwogICAgfQoKCgogICAgLyoqCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldF9oaWRkZW4oKSB7CiAgICAgICAgJHRtcCA9ICc8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSIlcyIgdmFsdWU9IiVzIj4nOwogICAgICAgICRpbnB1dCA9IHNwcmludGYoJHRtcCwgJHRoaXMtPmJsb2NrX25hbWUsICR0aGlzLT5vcHRpb25zWyd2YWx1ZSddKTsKICAgICAgICByZXR1cm4gJGlucHV0OwogICAgfQoKCgogICAgcHVibGljIGZ1bmN0aW9uIGdldF9maWVsZHNldF9zdGFydCgpIHsKICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgLy8KICAgIC8vCiAgICAvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAgICAkdG1wID0gJzwvcD4KICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGZpZWxkc2V0IG5hbWU9IiVzIj4KICAgICAgICAgICAgPGxlZ2VuZD4lczwvbGVnZW5kPgogICAgICAgICAgICAlcwogICAgICAgIDxkaXY+PHA+JzsKICAgICAgICAkaW5wdXQgPSBzcHJpbnRmKCR0bXAsICR0aGlzLT5ibG9ja19uYW1lLCAkdGhpcy0+b3B0aW9uc1snbGVnZW5kJ10sICR0aGlzLT5vcHRpb25zWydkZXNjcmlwdGlvbiddKTsKICAgICAgICByZXR1cm4gJGlucHV0OwogICAgfQoKCgogICAgcHVibGljIGZ1bmN0aW9uIGdldF9maWVsZHNldF9lbmQoKSB7CiAgICAvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIC8vCiAgICAvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAgICByZXR1cm4gJzwvcD4KICAgICAgICA8L2Rpdj4KICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgIDxkaXY+PHA+JzsKICAgIH0KCgoKICAgcHVibGljIGZ1bmN0aW9uIGdldF9nYWxsZXJ5X3BpY2tlcigpIHsKICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAvLyBnYWxsZXJ5X3BpY2tlciBDb250ZW50IEJsb2NrCiAgIC8vCiAgIC8vIHJldHVybnMgYW4gc2VsZWN0IGlucHV0IG9mIGdhbGxlcmllcyAnZ2FsbGVyeSB0aXRsZScgPT4gJ2dhbGxlcnktZGlyJywgaG9tZSBnYWxsZXJ5IGlzIGV4Y2x1ZGVkCiAgIC8vIFBhcmFtZXRlcnM6CiAgIC8vICAgIGRpciAtIG9ubHkgcmV0dXJuIGdhbGxlcmllcyB0aGF0IGFyZSBzdWItZ2FsbGVyaWVzIG9mIHRoaXMgZ2FsbGVyeSBkaXIsCiAgIC8vICAgICAgICAgIGRlZmF1bHQgaXMgYWxsIGdhbGxlcmllcywgZXhjbHVkaW5nIGRlZmF1bHQgdG9wIGxldmVsIGdhbGxlcnkKICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAkZGlyID0gJHRoaXMtPm9wdGlvbnNbJ2RpciddLicvJzsgICAgLy8gZGVmYXVsdCBkaXIgKG5lZWRzICcvJyBhdCBlbmQpCgogICAgICAkbW9kID0gY21zX3V0aWxzOjpnZXRfbW9kdWxlKCdFQ0IyJyk7CiAgICAgICRHYWxsZXJ5TW9kdWxlID0gY21zX3V0aWxzOjpnZXRfbW9kdWxlKCdHYWxsZXJ5Jyk7CiAgICAgIGlmICghaXNfb2JqZWN0KCRHYWxsZXJ5TW9kdWxlKSkgewogICAgICAgICAkZXJyID0gJzxkaXYgY2xhc3M9InBhZ2V3YXJuaW5nIj4nIC4gJG1vZC0+TGFuZygnZ2FsbGVyeV9tb2R1bGVfZXJyb3InKSAuICc8L2Rpdj48YnI+JzsKICAgICAgICAgcmV0dXJuICRlcnI7CiAgICAgIH0KCiAgICAgICRnYWxsZXJpZXMgPSBHYWxsZXJ5X3V0aWxzOjpHZXRHYWxsZXJpZXMoKTsKICAgICAgJGdhbGxlcnlBcnJheSA9IGFycmF5KCctLS0gbm9uZSAtLS0nID0+ICcnKTsKCiAgICAgIGZvcmVhY2ggKCRnYWxsZXJpZXMgYXMgJGdhbGxlcnkpIHsKICAgICAgICAgaWYgKCRnYWxsZXJ5WydmaWxlbmFtZSddIT0nJykgeyAgICAvLyBpZ25vcmVzIGRlZmF1bHQgZ2FsbGVyeQogICAgICAgICAgICBpZiAoJGRpciE9Jy8nKSB7CiAgICAgICAgICAgICAgIC8vIG9ubHkgc2VsZWN0IHN1Yi1nYWxsZXJpZXMgb2YgJGRpcgogICAgICAgICAgICAgICAkaXNTdWJEaXIgPSBzdHJpcG9zKCRnYWxsZXJ5WydmaWxlcGF0aCddLCAkZGlyKTsKCiAgICAgICAgICAgICAgIGlmICgkaXNTdWJEaXIhPT1GQUxTRSAmJiAkaXNTdWJEaXI9PTApIHsKICAgICAgICAgICAgICAgICAgJGdhbGxlcnlfZGlyID0gJGdhbGxlcnlbJ2ZpbGVwYXRoJ10ucnRyaW0oJGdhbGxlcnlbJ2ZpbGVuYW1lJ10sICcvJyk7CiAgICAgICAgICAgICAgICAgICRnYWxsZXJ5QXJyYXlbJGdhbGxlcnlbJ3RpdGxlJ11dID0gJGdhbGxlcnlfZGlyOwogICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAvLyBzZWxlY3QgYWxsIGdhbGxlcmllcwogICAgICAgICAgICAgICAkZ2FsbGVyeV9kaXIgPSAkZ2FsbGVyeVsnZmlsZXBhdGgnXS5ydHJpbSgkZ2FsbGVyeVsnZmlsZW5hbWUnXSwgJy8nKTsKICAgICAgICAgICAgICAgJGdhbGxlcnlBcnJheVskZ2FsbGVyeVsndGl0bGUnXV0gPSAkZ2FsbGVyeV9kaXI7CiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gJHRoaXMtPm9wdGlvbnNbJ2Rlc2NyaXB0aW9uJ10uJG1vZC0+Q3JlYXRlSW5wdXREcm9wZG93bignJywgJHRoaXMtPmJsb2NrX25hbWUsICRnYWxsZXJ5QXJyYXksIC0xLCAkdGhpcy0+dmFsdWUpOwogICB9CgoKCiAgIHB1YmxpYyBmdW5jdGlvbiBnZXRfZHJvcGRvd25fZnJvbV9jdXN0b21ncygpIHsKICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAvLwogICAvLyAgICBjcmVhdGVzIGEgZHJvcGRvd24gZnJvbSB0aGUgdmFsdWVzIGluIGEgQ3VzdG9tR1MgZmllbGQKICAgLy8gICAgbm90ZTogdGhlIEN1c3RvbUdTIGZpZWxkIHNob3VsZCBiZSBhIHBsYWluIHRleHRhcmVhCiAgIC8vICAgICAgICAgIHVzZSBlaXRoZXIgbmV3bGluZXMgb3IgY29tbWFzIHRvIHNlcGFyYXRlIGVhY2ggdGl0bGUtdmFsdWUgcGFpcgogICAvLwogICAvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgICRkcm9wZG93biA9IGFycmF5KCk7CiAgICAgICRlcnIgPSAnJzsKICAgICAgJG1vZCA9IGNtc191dGlsczo6Z2V0X21vZHVsZSgnRUNCMicpOwogICAgICAkQ3VzdG9tR1MgPSBjbXNfdXRpbHM6OmdldF9tb2R1bGUoJ0N1c3RvbUdTJyk7CgogICAgICBpZiggaXNfb2JqZWN0KCRDdXN0b21HUykgKSB7CiAgICAgICAgIC8vIGNyZWF0ZSBhcnJheSAkZHJvcGRvd24gd2l0aCBhCiAgICAgICAgICRzZWxlY3RPcHRpb25zID0gJEN1c3RvbUdTLT5HZXRGaWVsZCggJHRoaXMtPm9wdGlvbnNbJ2N1c3RvbWdzX2ZpZWxkJ10gKTsKICAgICAgICAgaWYgKCBlbXB0eSgkc2VsZWN0T3B0aW9uc1sndmFsdWUnXSkgKSB7CiAgICAgICAgICAgICRlcnIgPSAnPGRpdiBjbGFzcz0icGFnZXdhcm5pbmciPicgLiAkbW9kLT5MYW5nKCdjdXN0b21nc19maWVsZF9lcnJvcicsICR0aGlzLT5vcHRpb25zWydjdXN0b21nc19maWVsZCddICkgLiAnPC9kaXY+PGJyPic7CgogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyB1c2UgZWl0aGVyIG5ld2xpbmVzIG9yIGNvbW1hcyB0byBzZXBhcmF0ZSBlYWNoIHRpdGxlLXZhbHVlIHBhaXIKICAgICAgICAgICAgJHNlbGVjdE9wdGlvbnMgPSBzdHJfcmVwbGFjZShQSFBfRU9MLCAnLCcsICRzZWxlY3RPcHRpb25zWyd2YWx1ZSddKTsKICAgICAgICAgICAgJHNlbGVjdExpbmVzID0gZXhwbG9kZSgnLCcsICRzZWxlY3RPcHRpb25zKTsKICAgICAgICAgICAgZm9yZWFjaCAoJHNlbGVjdExpbmVzIGFzICRvbmVPcHRpb24pIHsKICAgICAgICAgICAgICAgJG9wdCA9IGV4cGxvZGUoICc9JywgdHJpbSgkb25lT3B0aW9uKSApOwogICAgICAgICAgICAgICAkZHJvcGRvd25bJG9wdFswXV0gPSBpc1NldCgkb3B0WzFdKSA/ICRvcHRbMV0gOiAkb3B0WzBdOwogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgKGVtcHR5KCR0aGlzLT5vcHRpb25zWydtdWx0aXBsZSddKSkgewogICAgICAgICAvLyBzaW5nbGUgc2VsZWN0IGRyb3Bkb3duCiAgICAgICAgIHJldHVybiAkZXJyLiR0aGlzLT5vcHRpb25zWydkZXNjcmlwdGlvbiddLiRtb2QtPkNyZWF0ZUlucHV0RHJvcGRvd24oJycsICR0aGlzLT5ibG9ja19uYW1lLCAkZHJvcGRvd24sIC0xLCAkdGhpcy0+dmFsdWUgKTsKCiAgICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIG11bHRpIHNlbGVjdAogICAgICAgICAkc2VsZWN0ZWRpdGVtcyA9IGV4cGxvZGUoJywnLCAkdGhpcy0+dmFsdWUpOwogICAgICAgICAkc2l6ZSA9ICcnOwogICAgICAgICBpZiAoIWVtcHR5KCR0aGlzLT5vcHRpb25zWydzaXplJ10pKSB7ICRzaXplID0gaW50dmFsKCR0aGlzLT5vcHRpb25zWydzaXplJ10pOyB9CgogICAgICAgICByZXR1cm4gJGVyci4kdGhpcy0+b3B0aW9uc1snZGVzY3JpcHRpb24nXS4nPGRpdiBjbGFzcz0iZWNiX211bHRpcGxlX3NlbGVjdCI+JyAuICRtb2QtPkNyZWF0ZUlucHV0SGlkZGVuKCcnLCAkdGhpcy0+YmxvY2tfbmFtZSwgJHRoaXMtPnZhbHVlKS4kbW9kLT5DcmVhdGVJbnB1dFNlbGVjdExpc3QoJycsICR0aGlzLT5ibG9ja19uYW1lIC4gJ190bXAnLCAkZHJvcGRvd24sICRzZWxlY3RlZGl0ZW1zLCAkc2l6ZSkgLiAnPC9kaXY+JzsKICAgICAgfQogICB9CgoKICAgcHJpdmF0ZSBmdW5jdGlvbiBnZXRfaW5wdXRfcmVwZWF0ZXIoKSB7CiAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgLy8gICAgY3JlYXRlcyBhIHJlcGVhdGluZyB0ZXh0IGZpZWxkIHRoYXQgY2FuIGJlCgogICAvLwogICAvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgICRzbWFydHkgPSBcQ21zQXBwOjpnZXRfaW5zdGFuY2UoKS0+R2V0U21hcnR5KCk7CiAgICAgICRtb2QgPSBjbXNfdXRpbHM6OmdldF9tb2R1bGUoJ0VDQjInKTsKCiAgICAgICRmaWVsZHMgPSBleHBsb2RlKCd8fCcsICR0aGlzLT52YWx1ZSk7CiAgICAgICR0cGwgPSAkc21hcnR5LT5DcmVhdGVUZW1wbGF0ZSggJG1vZC0+R2V0VGVtcGxhdGVSZXNvdXJjZSgnaW5wdXRfcmVwZWF0ZXJfdGVtcGxhdGUudHBsJyksIG51bGwsIG51bGwsICRzbWFydHkgKTsKICAgICAgJHRwbC0+YXNzaWduKCdibG9ja19uYW1lJywgJHRoaXMtPmJsb2NrX25hbWUgKTsKICAgICAgJHRwbC0+YXNzaWduKCdzaXplJywgJHRoaXMtPm9wdGlvbnNbInNpemUiXSApOwogICAgICAkdHBsLT5hc3NpZ24oJ21heF9sZW5ndGgnLCAkdGhpcy0+b3B0aW9uc1sibWF4X2xlbmd0aCJdICk7CiAgICAgICR0cGwtPmFzc2lnbigndmFsdWUnLCAkdGhpcy0+dmFsdWUgKTsKICAgICAgJHRwbC0+YXNzaWduKCdmaWVsZHMnLCAkZmllbGRzICk7CiAgICAgICR0cGwtPmFzc2lnbignZGVzY3JpcHRpb24nLCAkdGhpcy0+b3B0aW9uc1snZGVzY3JpcHRpb24nXSApOwogICAgICAkdHBsLT5hc3NpZ24oJ3RpdGxlX2FkZF9saW5lJywgJG1vZC0+TGFuZygnYWRkX2xpbmUnKSApOwogICAgICAkdHBsLT5hc3NpZ24oJ3RpdGxlX3JlbW92ZV9saW5lJywgJG1vZC0+TGFuZygncmVtb3ZlX2xpbmUnKSApOwogICAgICByZXR1cm4gJHRwbC0+ZmV0Y2goKTsKICAgfQoKCgogICBwcml2YXRlIGZ1bmN0aW9uIGdldF9leHRyYV9vcHRpb25zKGFycmF5ICRwYXJhbXMpIHsKICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAvLwogICAvLwogICAvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgIGlmICghaXNTZXQoJHBhcmFtc1siZmllbGQiXSkpCiAgICAgICAgIHJldHVybjsKCiAgICAgICRvcHRpb25zID0gYXJyYXkoKTsKICAgICAgJGRlZmF1bHRfb3B0aW9ucyA9IGFycmF5KCk7CiAgICAgIHN3aXRjaCAoc3RydG9sb3dlcigkcGFyYW1zWyJmaWVsZCJdKSkgewogICAgICAgICAgICBjYXNlICJjb2xvcl9waWNrZXIiOgogICAgICAgICAgICAgICAgJGRlZmF1bHRfb3B0aW9uc1sic2l6ZSJdID0gMTA7CiAgICAgICAgICAgICAgICAkZGVmYXVsdF9vcHRpb25zWyJkZWZhdWx0X3ZhbHVlIl0gPSAnJzsKICAgICAgICAgICAgICAgICRkZWZhdWx0X29wdGlvbnNbImRlc2NyaXB0aW9uIl0gPSAnJzsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJtb2R1bGVfbGluayI6CiAgICAgICAgICAgICAgICAkZGVmYXVsdF9vcHRpb25zWyJtb2QiXSA9ICcnOwogICAgICAgICAgICAgICAgJGRlZmF1bHRfb3B0aW9uc1sidGV4dCJdID0gJyc7CiAgICAgICAgICAgICAgICAkZGVmYXVsdF9vcHRpb25zWyJ0YXJnZXQiXSA9ICdfc2VsZic7CiAgICAgICAgICAgICAgICAkZGVmYXVsdF9vcHRpb25zWyJkZWZhdWx0X3ZhbHVlIl0gPSAnJzsKICAgICAgICAgICAgICAgICRkZWZhdWx0X29wdGlvbnNbInNpemUiXSA9IDMwOwogICAgICAgICAgICAgICAgJGRlZmF1bHRfb3B0aW9uc1sibWF4X2xlbmd0aCJdID0gMjU1OwogICAgICAgICAgICAgICAgJGRlZmF1bHRfb3B0aW9uc1siZGVzY3JpcHRpb24iXSA9ICcnOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgImxpbmsiOgogICAgICAgICAgICAgICAgJGRlZmF1bHRfb3B0aW9uc1sidGV4dCJdID0gJyc7CiAgICAgICAgICAgICAgICAkZGVmYXVsdF9vcHRpb25zWyJ0YXJnZXQiXSA9ICdfc2VsZic7CiAgICAgICAgICAgICAgICAkZGVmYXVsdF9vcHRpb25zWyJsaW5rIl0gPSAnJzsKICAgICAgICAgICAgICAgICRkZWZhdWx0X29wdGlvbnNbImRlc2NyaXB0aW9uIl0gPSAnJzsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJtb2R1bGUiOgogICAgICAgICAgICAgICAgJGRlZmF1bHRfb3B0aW9uc1siZGVmYXVsdF92YWx1ZSJdID0gJyc7CiAgICAgICAgICAgICAgICAkZGVmYXVsdF9vcHRpb25zWyJ0ZXh0Il0gPSAnJzsKICAgICAgICAgICAgICAgICRkZWZhdWx0X29wdGlvbnNbImxpbmsiXSA9ICcnOwogICAgICAgICAgICAgICAgJGRlZmF1bHRfb3B0aW9uc1siZGVzY3JpcHRpb24iXSA9ICcnOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgImRyb3Bkb3duX2Zyb21fbW9kdWxlIjoKICAgICAgICAgICAgICAgICRkZWZhdWx0X29wdGlvbnNbIm1vZCJdID0gJyc7CiAgICAgICAgICAgICAgICAkZGVmYXVsdF9vcHRpb25zWyJkZWZhdWx0X3ZhbHVlIl0gPSAnJzsKICAgICAgICAgICAgICAgICRkZWZhdWx0X29wdGlvbnNbImZpcnN0X3ZhbHVlIl0gPSAnJzsKICAgICAgICAgICAgICAgICRkZWZhdWx0X29wdGlvbnNbImRlc2NyaXB0aW9uIl0gPSAnJzsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJmaWxlX3NlbGVjdG9yIjoKICAgICAgICAgICAgICAgICRkZWZhdWx0X29wdGlvbnNbImZpbGV0eXBlcyJdID0gJyc7CiAgICAgICAgICAgICAgICAkZGVmYXVsdF9vcHRpb25zWyJleGNsdWRlcHJlZml4Il0gPSAnJzsKICAgICAgICAgICAgICAgICRkZWZhdWx0X29wdGlvbnNbInJlY3Vyc2UiXSA9ICcnOwogICAgICAgICAgICAgICAgJGRlZmF1bHRfb3B0aW9uc1sic29ydGZpbGVzIl0gPSAnJzsKICAgICAgICAgICAgICAgICRkZWZhdWx0X29wdGlvbnNbImRpciJdID0gJyc7CiAgICAgICAgICAgICAgICAkZGVmYXVsdF9vcHRpb25zWyJwcmV2aWV3Il0gPSAnJzsKICAgICAgICAgICAgICAgICRkZWZhdWx0X29wdGlvbnNbImRlc2NyaXB0aW9uIl0gPSAnJzsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJkcm9wZG93biI6CiAgICAgICAgICAgICAgICAkZGVmYXVsdF9vcHRpb25zWyJzaXplIl0gPSA1OwogICAgICAgICAgICAgICAgJGRlZmF1bHRfb3B0aW9uc1sibXVsdGlwbGUiXSA9ICcnOwogICAgICAgICAgICAgICAgJGRlZmF1bHRfb3B0aW9uc1sidmFsdWVzIl0gPSAnJzsKICAgICAgICAgICAgICAgICRkZWZhdWx0X29wdGlvbnNbImRlZmF1bHRfdmFsdWUiXSA9ICcnOwogICAgICAgICAgICAgICAgJGRlZmF1bHRfb3B0aW9uc1siZmlyc3RfdmFsdWUiXSA9ICcnOwogICAgICAgICAgICAgICAgJGRlZmF1bHRfb3B0aW9uc1siZGVzY3JpcHRpb24iXSA9ICcnOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgImRyb3Bkb3duX2Zyb21fdWR0IjoKICAgICAgICAgICAgICAgICRkZWZhdWx0X29wdGlvbnNbInNpemUiXSA9IDU7CiAgICAgICAgICAgICAgICAkZGVmYXVsdF9vcHRpb25zWyJtdWx0aXBsZSJdID0gJyc7CiAgICAgICAgICAgICAgICAkZGVmYXVsdF9vcHRpb25zWyJ2YWx1ZXMiXSA9ICcnOwogICAgICAgICAgICAgICAgJGRlZmF1bHRfb3B0aW9uc1siZGVmYXVsdF92YWx1ZSJdID0gJyc7CiAgICAgICAgICAgICAgICAkZGVmYXVsdF9vcHRpb25zWyJmaXJzdF92YWx1ZSJdID0gJyc7CiAgICAgICAgICAgICAgICAkZGVmYXVsdF9vcHRpb25zWyJ1ZHQiXSA9ICcnOwogICAgICAgICAgICAgICAgJGRlZmF1bHRfb3B0aW9uc1siZGVzY3JpcHRpb24iXSA9ICcnOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgImRyb3Bkb3duX2Zyb21fZ2JjIjoKICAgICAgICAgICAgICAgICRkZWZhdWx0X29wdGlvbnNbInNpemUiXSA9IDU7CiAgICAgICAgICAgICAgICAkZGVmYXVsdF9vcHRpb25zWyJtdWx0aXBsZSJdID0gJyc7CiAgICAgICAgICAgICAgICAkZGVmYXVsdF9vcHRpb25zWyJ2YWx1ZXMiXSA9ICcnOwogICAgICAgICAgICAgICAgJGRlZmF1bHRfb3B0aW9uc1siZGVmYXVsdF92YWx1ZSJdID0gJyc7CiAgICAgICAgICAgICAgICAkZGVmYXVsdF9vcHRpb25zWyJmaXJzdF92YWx1ZSJdID0gJyc7CiAgICAgICAgICAgICAgICAkZGVmYXVsdF9vcHRpb25zWyJnYmMiXSA9ICcnOwogICAgICAgICAgICAgICAgJGRlZmF1bHRfb3B0aW9uc1siZGVzY3JpcHRpb24iXSA9ICcnOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgInRleHRhcmVhIjoKICAgICAgICAgICAgICAgICRkZWZhdWx0X29wdGlvbnNbImRlZmF1bHRfdmFsdWUiXSA9ICcnOwogICAgICAgICAgICAgICAgJGRlZmF1bHRfb3B0aW9uc1sicm93cyJdID0gMjA7CiAgICAgICAgICAgICAgICAkZGVmYXVsdF9vcHRpb25zWyJjb2xzIl0gPSA4MDsKICAgICAgICAgICAgICAgICRkZWZhdWx0X29wdGlvbnNbImRlc2NyaXB0aW9uIl0gPSAnJzsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJlZGl0b3IiOgogICAgICAgICAgICAgICAgJGRlZmF1bHRfb3B0aW9uc1siZGVmYXVsdF92YWx1ZSJdID0gJyc7CiAgICAgICAgICAgICAgICAkZGVmYXVsdF9vcHRpb25zWyJyb3dzIl0gPSAyMDsKICAgICAgICAgICAgICAgICRkZWZhdWx0X29wdGlvbnNbImNvbHMiXSA9IDgwOwogICAgICAgICAgICAgICAgJGRlZmF1bHRfb3B0aW9uc1siZGVzY3JpcHRpb24iXSA9ICcnOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgImlucHV0IjoKICAgICAgICAgICAgICAgICRkZWZhdWx0X29wdGlvbnNbImRlZmF1bHRfdmFsdWUiXSA9ICcnOwogICAgICAgICAgICAgICAgJGRlZmF1bHRfb3B0aW9uc1sic2l6ZSJdID0gMzA7CiAgICAgICAgICAgICAgICAkZGVmYXVsdF9vcHRpb25zWyJtYXhfbGVuZ3RoIl0gPSAyNTU7CiAgICAgICAgICAgICAgICAkZGVmYXVsdF9vcHRpb25zWyJkZXNjcmlwdGlvbiJdID0gJyc7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAic29ydGFibGVsaXN0IjoKICAgICAgICAgICAgICAgICRkZWZhdWx0X29wdGlvbnNbInZhbHVlcyJdID0gJyc7CiAgICAgICAgICAgICAgICAkZGVmYXVsdF9vcHRpb25zWyJmaXJzdF92YWx1ZSJdID0gJyc7CiAgICAgICAgICAgICAgICAkZGVmYXVsdF9vcHRpb25zWyJhbGxvd2R1cGxpY2F0ZXMiXSA9IGZhbHNlOwogICAgICAgICAgICAgICAgJGRlZmF1bHRfb3B0aW9uc1sibWF4X3NlbGVjdGVkIl0gPSAtMTsKICAgICAgICAgICAgICAgICRkZWZhdWx0X29wdGlvbnNbImxhYmVsX2xlZnQiXSA9ICcnOwogICAgICAgICAgICAgICAgJGRlZmF1bHRfb3B0aW9uc1sibGFiZWxfcmlnaHQiXSA9ICcnOwogICAgICAgICAgICAgICAgJGRlZmF1bHRfb3B0aW9uc1sidWR0Il0gPSAnJzsKICAgICAgICAgICAgICAgICRkZWZhdWx0X29wdGlvbnNbImRlc2NyaXB0aW9uIl0gPSAnJzsKICAgICAgICAgICAgICAgICRkZWZhdWx0X29wdGlvbnNbIm1heF9udW1iZXIiXSA9ICcnOwogICAgICAgICAgICAgICAgJGRlZmF1bHRfb3B0aW9uc1sicmVxdWlyZWRfbnVtYmVyIl0gPSAnJzsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJ0ZXh0IjoKICAgICAgICAgICAgICAgICRkZWZhdWx0X29wdGlvbnNbInRleHQiXSA9ICcnOwogICAgICAgICAgICAgICAgJGRlZmF1bHRfb3B0aW9uc1siZXhlY3V0ZSJdID0gJyc7CiAgICAgICAgICAgICAgICAkZGVmYXVsdF9vcHRpb25zWyJkZXNjcmlwdGlvbiJdID0gJyc7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAicGFnZXMiOgogICAgICAgICAgICAgICAgJGRlZmF1bHRfb3B0aW9uc1siZGVmYXVsdF92YWx1ZSJdID0gJyc7CiAgICAgICAgICAgICAgICAkZGVmYXVsdF9vcHRpb25zWyJkZXNjcmlwdGlvbiJdID0gJyc7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAiY2hlY2tib3giOgogICAgICAgICAgICAgICAgJGRlZmF1bHRfb3B0aW9uc1siZGVmYXVsdF92YWx1ZSJdID0gJyc7CiAgICAgICAgICAgICAgICAkZGVmYXVsdF9vcHRpb25zWyJkZXNjcmlwdGlvbiJdID0gJyc7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAndGltZXBpY2tlcic6CiAgICAgICAgICAgICAgICAkZGVmYXVsdF9vcHRpb25zWyJzaXplIl0gPSAxMDsKICAgICAgICAgICAgICAgICRkZWZhdWx0X29wdGlvbnNbIm1heF9sZW5ndGgiXSA9IDEwOwogICAgICAgICAgICAgICAgJGRlZmF1bHRfb3B0aW9uc1sidGltZV9mb3JtYXQiXSA9ICdISDptbSc7CiAgICAgICAgICAgICAgICAkZGVmYXVsdF9vcHRpb25zWyJkZXNjcmlwdGlvbiJdID0gJyc7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnZGF0ZXBpY2tlcic6CiAgICAgICAgICAgICAgICAkZGVmYXVsdF9vcHRpb25zWyJzaXplIl0gPSAyMDsKICAgICAgICAgICAgICAgICRkZWZhdWx0X29wdGlvbnNbIm1heF9sZW5ndGgiXSA9IDIwOwogICAgICAgICAgICAgICAgJGRlZmF1bHRfb3B0aW9uc1siZGF0ZV9mb3JtYXQiXSA9ICd5eS1tbS1kZCc7CiAgICAgICAgICAgICAgICAkZGVmYXVsdF9vcHRpb25zWyJ0aW1lX2Zvcm1hdCJdID0gJ0hIOm1tJzsKICAgICAgICAgICAgICAgICRkZWZhdWx0X29wdGlvbnNbInRpbWUiXSA9ICcnOwogICAgICAgICAgICAgICAgJGRlZmF1bHRfb3B0aW9uc1siZGVzY3JpcHRpb24iXSA9ICcnOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3JhZGlvJzoKICAgICAgICAgICAgICAgICRkZWZhdWx0X29wdGlvbnNbIm11bHRpcGxlIl0gPSAnJzsKICAgICAgICAgICAgICAgICRkZWZhdWx0X29wdGlvbnNbInZhbHVlcyJdID0gJyc7CiAgICAgICAgICAgICAgICAkZGVmYXVsdF9vcHRpb25zWyJkZWZhdWx0X3ZhbHVlIl0gPSAtMTsKICAgICAgICAgICAgICAgICRkZWZhdWx0X29wdGlvbnNbImlubGluZSJdID0gZmFsc2U7CiAgICAgICAgICAgICAgICAkZGVmYXVsdF9vcHRpb25zWyJkZXNjcmlwdGlvbiJdID0gJyc7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAiaHIiOgogICAgICAgICAgICAgICAgJGRlZmF1bHRfb3B0aW9uc1siZGVzY3JpcHRpb24iXSA9ICcnOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgImltYWdlX3BpY2tlciI6CiAgICAgICAgICAgICAgICAkZGVmYXVsdF9vcHRpb25zWyJkZXNjcmlwdGlvbiJdID0gJyc7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnaGlkZGVuJzoKICAgICAgICAgICAgICAgICRkZWZhdWx0X29wdGlvbnNbJ3ZhbHVlJ10gPSAnJzsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdmaWVsZHNldF9zdGFydCc6CiAgICAgICAgICAgICAgICAkZGVmYXVsdF9vcHRpb25zWydsZWdlbmQnXSA9ICcnOwogICAgICAgICAgICAgICAgJGRlZmF1bHRfb3B0aW9uc1siZGVzY3JpcHRpb24iXSA9ICcnOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2dhbGxlcnlfcGlja2VyJzoKICAgICAgICAgICAgICAgJGRlZmF1bHRfb3B0aW9uc1snZGlyJ10gPSAnJzsKICAgICAgICAgICAgICAgJGRlZmF1bHRfb3B0aW9uc1snZGVzY3JpcHRpb24nXSA9ICcnOwogICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnZHJvcGRvd25fZnJvbV9jdXN0b21ncyc6CiAgICAgICAgICAgICAgICRkZWZhdWx0X29wdGlvbnNbJ211bHRpcGxlJ10gPSAnJzsKICAgICAgICAgICAgICAgJGRlZmF1bHRfb3B0aW9uc1snc2l6ZSddID0gJyc7CiAgICAgICAgICAgICAgICRkZWZhdWx0X29wdGlvbnNbJ2N1c3RvbWdzX2ZpZWxkJ10gPSAnJzsKICAgICAgICAgICAgICAgJGRlZmF1bHRfb3B0aW9uc1snZGVzY3JpcHRpb24nXSA9ICcnOwogICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAiaW5wdXRfcmVwZWF0ZXIiOgogICAgICAgICAgICAgICAgJGRlZmF1bHRfb3B0aW9uc1siZGVmYXVsdF92YWx1ZSJdID0gJyc7CiAgICAgICAgICAgICAgICAkZGVmYXVsdF9vcHRpb25zWyJzaXplIl0gPSA1MDsKICAgICAgICAgICAgICAgICRkZWZhdWx0X29wdGlvbnNbIm1heF9sZW5ndGgiXSA9IDI1NTsKICAgICAgICAgICAgICAgICRkZWZhdWx0X29wdGlvbnNbImRlc2NyaXB0aW9uIl0gPSAnJzsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICB9CgogICAgICAkdGhpcy0+ZmllbGQgPSAkcGFyYW1zWyJmaWVsZCJdOwoKICAgICAgaWYgKGVtcHR5KCRwYXJhbXMpID09IGZhbHNlKSB7CiAgICAgICAgIGZvcmVhY2ggKCRwYXJhbXMgYXMgJGtleSA9PiAkcGFyYW0pIHsKICAgICAgICAgICAgaWYgKGlzU2V0KCRkZWZhdWx0X29wdGlvbnNbJGtleV0pICYmIGVtcHR5KCRwYXJhbSkgPT0gZmFsc2UpCiAgICAgICAgICAgICAgICRkZWZhdWx0X29wdGlvbnNbJGtleV0gPSAkcGFyYW07CiAgICAgICAgIH0KICAgICAgfQoKICAgICAgJHRoaXMtPm9wdGlvbnMgPSAkZGVmYXVsdF9vcHRpb25zOwogICB9Cgp9Cgo/Pg==]]></data>
	</file>
	<file>
	  <filename>/lib/css/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/css/ecb2_admin.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogZWNiMl9hZG1pbi5jc3MgLSB2MS4xIC0gMTZGZWIxOQ0KDQogICAtIHYxLjEgLSAxNkZlYjE5IC0gZWNiX3JlcGVhdGVyIGFkZGVkICYgYmVnYW4gY29uc29saWRhdGluZyBDU1MgaW50byB0aGlzIGZpbGUNCiAgIC0gdjEuMCAtIDE4QXByMTcgLSBpbml0aWFsIGNzcyBmaWxlDQoNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCg0KLnNvcnRhYmxlLWVjYjItbGlzdCB0ciB7Y3Vyc29yOm1vdmU7fQ0KI2xvYWRlciB7cGFkZGluZy1sZWZ0OjUwcHg7fQ0KDQouZWNiMi1idXR0b24taW5saW5lIHtwYWRkaW5nLXJpZ2h0OjEwcHg7IHBhZGRpbmctbGVmdDoxMHB4OyBmb250LXNpemU6MjBweDsgZm9udC13ZWlnaHQ6Ym9sZDt9DQoNCi5lY2JfcmVwZWF0ZXIgLnJlcGVhdGVyLXdyYXBwZXIge3dpZHRoOjEwMCU7fQ0KLmVjYl9yZXBlYXRlciAucmVwZWF0ZXItd3JhcHBlcjpmaXJzdC1jaGlsZCAuZWNiMi1yZXBlYXRlci1yZW1vdmUge2Rpc3BsYXk6bm9uZTt9DQouZWNiX3JlcGVhdGVyIC5yZXBlYXRlci1maWVsZCB7bWF4LXdpZHRoOmNhbGMoMTAwJSAtIDEwMHB4KTt9DQoNCg==]]></data>
	</file>
	<file>
	  <filename>/lib/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCEtLSBEVU1NWSBIVE1MIEZJTEUgLS0+]]></data>
	</file>
	<file>
	  <filename>/lib/js/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/js/ecb2_admin.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gZWNiMl9hZG1pbi5qcyAtIHYxLjEgLSAxMUp1bDE3DQovLw0KLy8gICAgLSB2MS4xIC0gMTFKdWwxNyAtIHVwZGF0ZWQgZm9yIG1heF9udW1iZXIgJiByZXF1aXJlZF9udW1iZXIgJiB1cGRhdGVFQ0IyUGxhY2Vob2xkZXIoKQ0KLy8gICAgLSB2MS4wIC0gMThBcHIxNyAtIGluaXRpYWwganMgZmlsZQ0KLy8NCi8vICAgIGVuYWJsZXMgZHJhZy1uLWRyb3Agc2VsZWN0aW9uIG9mIGxpc3QgaXRlbXMsIHJlcXVpcmVzIGpxdWVyeSB1aSBzb3J0YWJsZQ0KLy8NCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiQoZnVuY3Rpb24oKSB7DQoNCiAgICAkKCd1bC5zb3J0YWJsZS1lY2IyLWxpc3QnKS5lYWNoKGZ1bmN0aW9uKCkgew0KICAgICAgICB2YXIgJHBhcmVudCA9ICQodGhpcykuY2xvc2VzdCgnLmVjYjItY2InKTsNCiAgICAgICAgdmFyICRzZWxlY3RlZCA9ICRwYXJlbnQuZmluZCgndWwuc2VsZWN0ZWQtaXRlbXMnKTsNCiAgICAgICAgJCh0aGlzKS5zb3J0YWJsZSh7DQogICAgICAgICAgICBjb25uZWN0V2l0aDogJHNlbGVjdGVkLA0KICAgICAgICAgICAgZGVsYXk6IDE1MCwNCiAgICAgICAgICAgIHJldmVydDogMzAwLA0KICAgICAgICAgICAgcGxhY2Vob2xkZXI6ICd1aS1zdGF0ZS1oaWdobGlnaHQnLA0KICAgICAgICAgICAgaXRlbXM6ICdsaTpub3QoLm5vLXNvcnQpJywNCiAgICAgICAgICAgIGhlbHBlcjogZnVuY3Rpb24gKGV2ZW50LCB1aSkgew0KICAgICAgICAgICAgICAgIGlmICghdWkuaGFzQ2xhc3MoJ3NlbGVjdGVkJykpIHsNCiAgICAgICAgICAgICAgICAgICAgdWkuYWRkQ2xhc3MoJ3NlbGVjdGVkJykNCiAgICAgICAgICAgICAgICAgICAgICAuc2libGluZ3MoKQ0KICAgICAgICAgICAgICAgICAgICAgIC5yZW1vdmVDbGFzcygnc2VsZWN0ZWQnKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgdmFyIGVsZW1lbnRzID0gdWkucGFyZW50KCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaGlsZHJlbignLnNlbGVjdGVkJykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jbG9uZSgpLA0KICAgICAgICAgICAgICAgICAgICBoZWxwZXIgPSAkKCc8bGkvPicpOw0KICAgICAgICAgICAgICAgIHVpLmRhdGEoJ211bHRpZHJhZycsIGVsZW1lbnRzKS5zaWJsaW5ncygnLnNlbGVjdGVkJykucmVtb3ZlKCk7DQogICAgICAgICAgICAgICAgcmV0dXJuIGhlbHBlci5hcHBlbmQoZWxlbWVudHMpOw0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIHN0b3A6IGZ1bmN0aW9uIChldmVudCwgdWkpIHsNCiAgICAgICAgICAgICAgICB2YXIgZWxlbWVudHMgPSB1aS5pdGVtLmRhdGEoJ211bHRpZHJhZycpOw0KICAgICAgICAgICAgICAgIHZhciAkdWxTZWxlY3RlZCA9ICQodWkuaXRlbSkucGFyZW50KCk7DQogICAgICAgICAgICAgICAgdWkuaXRlbS5hZnRlcihlbGVtZW50cykucmVtb3ZlKCk7DQogICAgICAgICAgICAgICAgdXBkYXRlRUNCMkNCSW5wdXQoJHVsU2VsZWN0ZWQpOw0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIHJlY2VpdmU6IGZ1bmN0aW9uKGV2ZW50LCB1aSkgew0KICAgICAgICAgICAgICAgIHZhciBlbGVtZW50cyA9IHVpLml0ZW0uZGF0YSgnbXVsdGlkcmFnJyk7DQogICAgICAgICAgICAgICAgaWYgKCQodGhpcykuZGF0YSgnbWF4LW51bWJlcicpICYmICQodGhpcykuY2hpbGRyZW4oKS5sZW5ndGgtMSA+ICQodGhpcykuZGF0YSgnbWF4LW51bWJlcicpKSB7DQogICAgICAgICAgICAgICAgICAgICQodWkuc2VuZGVyKS5zb3J0YWJsZSgnY2FuY2VsJyk7DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgdXBkYXRlRUNCMlBsYWNlaG9sZGVyKCAkKHRoaXMpICk7DQogICAgICAgICAgICAgICAgICAgICQoZWxlbWVudHMpLnJlbW92ZUNsYXNzKCdzZWxlY3RlZCB1aS1zdGF0ZS1ob3ZlcicpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoJy5zb3J0YWJsZS1yZW1vdmUnKS5yZW1vdmVDbGFzcygnaGlkZGVuJyk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9KTsNCiAgICB9KTsNCg0KICAgIC8vIHJlbW92ZSBmcm9tIHNlbGVjdGVkIGxpc3QgLSBieSBkcmFnZ2luZyBiYWNrIHRvIGF2YWlsYWJsZQ0KICAgICQoJ3VsLnNlbGVjdGVkLWl0ZW1zJykuZWFjaChmdW5jdGlvbigpIHsNCiAgICAgICAgdmFyICRwYXJlbnQgPSAkKHRoaXMpLmNsb3Nlc3QoJy5lY2IyLWNiJyk7DQogICAgICAgIHZhciAkYXZhaWxhYmxlID0gJHBhcmVudC5maW5kKCd1bC5hdmFpbGFibGUtaXRlbXMnKTsNCiAgICAgICAgJCh0aGlzKS5zb3J0YWJsZSh7DQogICAgICAgICAgICBjb25uZWN0V2l0aDogJGF2YWlsYWJsZSwNCiAgICAgICAgICAgIGRlbGF5OiAxNTAsDQogICAgICAgICAgICByZXZlcnQ6IDMwMCwNCiAgICAgICAgICAgIHBsYWNlaG9sZGVyOiAndWktc3RhdGUtaGlnaGxpZ2h0JywNCiAgICAgICAgICAgIHN0b3A6IGZ1bmN0aW9uIChldmVudCwgdWkpIHsNCiAgICAgICAgICAgICAgICB2YXIgJHVsU2VsZWN0ZWQgPSAkKHVpLml0ZW0pLmNsb3Nlc3QoJy5lY2IyLWNiJykuZmluZCgnLnNlbGVjdGVkLWl0ZW1zJyk7DQogICAgICAgICAgICAgICAgJCh1aS5pdGVtKS5yZW1vdmVDbGFzcygnc2VsZWN0ZWQnKQ0KICAgICAgICAgICAgICAgICQodWkuaXRlbSkuY2hpbGRyZW4oJy5zb3J0YWJsZS1yZW1vdmUnKS5hZGRDbGFzcygnaGlkZGVuJyk7DQogICAgICAgICAgICAgICAgdXBkYXRlRUNCMkNCSW5wdXQoJHVsU2VsZWN0ZWQpOw0KICAgICAgICAgICAgICAgIHVwZGF0ZUVDQjJQbGFjZWhvbGRlcigkdWxTZWxlY3RlZCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0pOw0KICAgIH0pOw0KDQogICAgLy8gcmVtb3ZlIGZyb20gc2VsZWN0ZWQgbGlzdCAtIGJ5IGNsaWNraW5nIHJlbW92ZSBpY29uDQogICAgJChkb2N1bWVudCkub24oJ2NsaWNrJywgJyNzZWxlY3RlZC1pdGVtcyAuc29ydGFibGUtcmVtb3ZlJywgZnVuY3Rpb24oZSkgew0KICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7DQogICAgICAgIHZhciAkdWxTZWxlY3RlZCA9ICQodGhpcykuY2xvc2VzdCgndWwuc2VsZWN0ZWQtaXRlbXMnKTsNCiAgICAgICAgdmFyICR1bEF2YWlsYWJsZSA9ICQodGhpcykuY2xvc2VzdCgnLmVjYjItY2InKS5maW5kKCcuYXZhaWxhYmxlLWl0ZW1zJyk7DQogICAgICAgICQodGhpcykuYWRkQ2xhc3MoJ2hpZGRlbicpDQogICAgICAgICAgICAgICAucGFyZW50KCdsaScpLnJlbW92ZUNsYXNzKCduby1zb3J0JykNCiAgICAgICAgICAgICAgIC5hcHBlbmRUbygkdWxBdmFpbGFibGUpOw0KICAgICAgICB1cGRhdGVFQ0IyQ0JJbnB1dCgkdWxTZWxlY3RlZCk7DQogICAgICAgIHVwZGF0ZUVDQjJQbGFjZWhvbGRlcigkdWxTZWxlY3RlZCk7DQogICAgfSk7DQoNCiAgICBmdW5jdGlvbiB1cGRhdGVFQ0IyQ0JJbnB1dCgkdWxTZWxlY3RlZCkgew0KICAgICAgICB2YXIgJGFsbFNlbGVjdGVkID0gJHVsU2VsZWN0ZWQuY2hpbGRyZW4oJ2xpOm5vdCgucGxhY2Vob2xkZXIpJyk7DQogICAgICAgIHZhciAkdGFyZ2V0SW5wdXQgPSAkKCAnIycgKyAkdWxTZWxlY3RlZC5kYXRhKCdjbXNtcy1jYi1pbnB1dCcpICk7DQogICAgICAgIHZhciBzZWxlY3RlZFN0ciA9ICcnOw0KICAgICAgICB2YXIgcmVxdWlyZWROdW1iZXIgPSAkdWxTZWxlY3RlZC5kYXRhKCdyZXF1aXJlZC1udW1iZXInKTsNCiAgICAgICAgaWYgKCByZXF1aXJlZE51bWJlciAmJiAkYWxsU2VsZWN0ZWQubGVuZ3RoIT1yZXF1aXJlZE51bWJlciApIHsNCiAgICAgICAgICAgICR0YXJnZXRJbnB1dC52YWwoJycpOyAgIC8vIHNldCB0byBlbXB0eQ0KDQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAkYWxsU2VsZWN0ZWQuZWFjaChmdW5jdGlvbigpIHsNCiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRTdHI9PScnKSB7DQogICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkU3RyID0gJCh0aGlzKS5kYXRhKCdjbXNtcy1pdGVtLWlkJyk7DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRTdHIgPSBzZWxlY3RlZFN0cisnLCcrJCh0aGlzKS5kYXRhKCdjbXNtcy1pdGVtLWlkJyk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgICAkdGFyZ2V0SW5wdXQudmFsKHNlbGVjdGVkU3RyKTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHVwZGF0ZUVDQjJQbGFjZWhvbGRlcigkdWxTZWxlY3RlZCkgew0KICAgICAgICB2YXIgcmVxdWlyZWROdW1iZXIgPSAkdWxTZWxlY3RlZC5kYXRhKCdyZXF1aXJlZC1udW1iZXInKTsNCiAgICAgICAgdmFyIG51bWJlclNlbGVjdGVkID0gJHVsU2VsZWN0ZWQuY2hpbGRyZW4oKS5sZW5ndGggLSAxOyAvLyBleGNsdWRlIHBsYWNlaG9sZGVyDQogICAgICAgIGlmICggKCFyZXF1aXJlZE51bWJlciAmJiBudW1iZXJTZWxlY3RlZD4wKSB8fCAocmVxdWlyZWROdW1iZXI+MCAmJiBudW1iZXJTZWxlY3RlZD09cmVxdWlyZWROdW1iZXIpICkgew0KICAgICAgICAgICAgJHVsU2VsZWN0ZWQuY2hpbGRyZW4oJy5wbGFjZWhvbGRlcicpLmFkZENsYXNzKCdoaWRkZW4nKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICR1bFNlbGVjdGVkLmNoaWxkcmVuKCcucGxhY2Vob2xkZXInKS5yZW1vdmVDbGFzcygnaGlkZGVuJyk7DQogICAgICAgIH0NCg0KDQogICAgfQ0KDQp9KTs=]]></data>
	</file>
	<file>
	  <filename>/lib/js/images/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/js/images/color.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAMOSURBVDjLVZNNaBxlAIafb+ab2Z3N7Oxv/nYTEyv2LzQJpKBgrQqNUKmY4kUIXqUHT70p9iB48CKIiN5E0It6KFiwiv9FpAVpKUggNc3mZ7vpJpv9n93ZnZ35PNRI+8B7e9/n9gqlFAeIVUfPeN3zh0R0eVpYM1OanhvTCEY0f3tU79+ctnpfHM73fuQhxIHAWHnmkOGXPjgZyS09l5hnNv4YOdMhoQmigzqGt4nhfeub1fpnVsl/e+hMv/q/QKy+Me0EO5dfso/OvzB8grgV4HGXJC7jwAQ2oxxDuC36xZ+Rhe+v6iutZf2iqklReNe0tPSHZ2Nz84ujR7ht3iJKjcexiOIQI8SiixxcR7QtRORFlK7O9t0rlyy4KBEj5+YisVeez85wy9zGIUeGDDYhDhYOITYuoh2BvTJ68y7B0GnCym8XGq+KL2U0MrE8Z2SRVhqdPmlCsvgk8RlCkgAivRbUNKj1YPMeeu4wcnjRql7/+jVpyvxsPjbK3whi5LEAB0WWgBRgqwAaFah04X4V7puwdwddz+FXjJMSbXI8aSTYCgU2oKMwEdgCEoDhug/G5SjsmFDUoV+DXJ7BnpiUVCNBaJqEXfDVfwG6CjoKnF4crZGCVvNBug0IPXzPZOCnAunfk8W6ro7H2gK3A02gGoDeA1MDGx2nkYG6C24bvDaMSzq7ZfxBsiC7O+aNDaWOn0oLfl0HMwDlQRCAHYUkEGvFkLsp2G9Bo0n41AiNG6sMBvY1yZr6/JsV//XZZ3WZaEp2t6DvgWFA1QRHQbwjSDeTUGvCiSPU1ovU/typQPIrTV0yrrl3vE+/+8XlaCIgq8H+BtSLUN2C2ibsl8ArR+HYGE0rwvbvRTr96HsL6od1CUDDf+enK92JwT+982cWEswvRmiug6qAr0E4AV4uoFXosnV1g8bN5kcp7E8eOZOYKtmUqm/ZiDdfPhV3Zp6IM5k0SIUBstwmXKvCX5UdM6y9n2b34wV1IXxEcEBU3J4dprU0zODpjFBTIyoIxgjXxlB/PIl1eUmdLjzc/xceOVXddrB6BQAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/lib/js/images/grid.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhFAAUAJEAAAAAAP///+zp2P///yH5BAEAAAMALAAAAAAUABQAAAIojI+iy+jBonhJLnrsxVBP7n1YyHVaSYKhh7Lq+VotPLo1TaW3HEtlAQA7]]></data>
	</file>
	<file>
	  <filename>/lib/js/images/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCEtLSBEVU1NWSBIVE1MIEZJTEUgLS0+]]></data>
	</file>
	<file>
	  <filename>/lib/js/images/meta100.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAAAAACMIRMSAAAACXBIWXMAAABIAAAASABGyWs+AAAACXZwQWcAAAAaAAAAGgAHsmYvAAACLklEQVQoz0VSW0hUURRd9zVvBcmhyKEMhCghMCT6KIwoiIgIIwZ6CNXHEEUf1cd81Jc9fiKjQoL6kLDQiqISmZgypCdoQUSIg2YoFNhrpgxm5px7V3uuA204j73X2efss/YCxTytlPbom+cqpdyKAxnarcRc/X/2lOdDisWRTGa0RC0hl+OPM8O/WNYCaWZbDMBsfUKt+Kk9DCBxxSt5UOwzYQeDFqx75GQjTCdgGzhGBc7E4VSyHDR84TYETMCwbAzIhRcQRENPVwwBXM/BhHXybrPsdwiUlLWHPCUnDt+SaS85BAuNeXANUDNNPoeNLWmEcJPFP8uA2BjyS4Gm8WnmpLLWpOC3f2iuk7QhzC4GaheFB7/XAM1bYTm10X5uliOD+LkEpmHhUCEGtOyEbVro4CaBnqK0AkZkQeL954CB9SnYVjTxTN43nVFwA4zY6zyzcNB+Vio877KQAOqmwH3iXiWPy3LigVS4S73otm0s/wvekFi8rzsk3+v/KrxEm4REB/vly3MrERJyrDBW/eZBhFF/5+OZoDlCaL6KwzANAwvfUhfagGvvkhOPuir0aub2xB2jvmOi0tO59OpvKdSNsey30uXs6FSequjqkjiXAmEcmYc8XebudInSc4/um+1C3NHT1L42RAIDds2B3uGXD8+12cDaD9SiIsyriDOpCHyLbOwtijK8KiRCcpnPXu7svHh/0pUUP1aFPFWu6pCuqu6qkK/Asti8On37BwKNc9D2ur7jAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDEwLTA4LTE1VDEyOjUwOjE3LTA0OjAwUhXmOgAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxMC0wOC0xNVQxMjo1MDoxNy0wNDowMCNIXoYAAAARdEVYdGpwZWc6Y29sb3JzcGFjZQAyLHVVnwAAACB0RVh0anBlZzpzYW1wbGluZy1mYWN0b3IAMngyLDF4MSwxeDFJ+qa0AAAAAElFTkSuQmCC]]></data>
	</file>
	<file>
	  <filename>/lib/js/images/picker.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAMAAAACICAIAAAA+tXNRAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAE6NJREFUeNrcXcGywrYOtR0WXXTRL3j9///rTBfE0gNCEtmWZAWiDC5zhwkhF84xx7Isy0rE+z08HjEwD/akcp574KGLzSeb82MTcEP/uBiDJ4GI//5bgIoC0igzUF9W7Y/B+hLVk7KAhiTghr4V0MkEIv7zT59BFFgaDrb2RwNAVF8ux7h+9hEB/ToBN/RUQC4EbmGea4wtXpZKJB/V/pTlWyg8K29JF6NmgUYl4IzekcBDQPcCZgzWl9iQiOuHq9i/ecmdtCP+RQIRvdH7EiAWiKKTjqWTyA3F5CT95haF8bg9KQhoJAKtgBzQOxIoBdT+tW9h+e7jZeLGbc6Gtiikk0G+AOpPY1EOQ+Aq9F4EbiHnDoNEqCSOE8hDcRCN6dG/LwT00wSuRX8+gcUC4Q4nCZpfsGdyzAYoVOWz2IE7E+R3mysruIMR8EfvSSBSAaVVz4njRHkAecsAX6LCosvrZbB+VXUZiAIaksC16M8msAsorbhSSSKtw2xsLCkbINj+XZ0MUCAtTGguoP8iCGhUAheidyAQ3z4Q7r4Zlq7a9jLJM8skuG24h7G6AyzIzy18KPpIFBCPQcAZvd3p+YjAU0D3+3MqmUr9L8+JePlYCpteXMUIVGOq45VOqrTiinVIAkvbX4X+bAJxmcZvJDZEkdjEDT49Q7nGxjraYijIoc7NSeW4FNCQBLa2d0PvSaAW0OM7p5IBEviJmylOckeQl+BY0wkC8OpM1gQ0HgEqIDf0bgRqAaXSDlK9tnPHtH5OapQd+96/UeSZgw+igMYjQNveE70PgaeAHk50xBpvxSBp+Sb7lZHDHE0kpD+9/aFGMB6Ba9GfTeA1jb8XvQDJgRTjZuGzf7EzAYCGRBbgS2fKDjwegYTe6D0JvONAi4CmZuGszTFhAURukVO2ocY5pUQi1/1ia/whCWwC8kfvQKAQ0OatTSUWJRsFyGIMChlIXM6SPg5ncpB7ZxrjORiBTUDO6H0I7AKaVuyhPAgNleoZuK7RkNDXYKSxt4KfOU5lBx6PQMIL0LsReAsoIZ+hdhOSJWMjfnaIDnUsAs3iz6Xmq2anB2v7j0og4TXofQhEWAW0mc5N/2FdVqsQVWkEyuK/Og6DoH/kukCWX+LucQ5JIOHF6E8l8BLQgwTU2IOKneaqSNixPwFAg91sX86igIYkkNAVvTOB9BBQngOAplsl5QnKVWPW04+dOYAUImmP55LQ/O6jqdfxfprAhegdCKS3DwRaHlsk9rRNfzIb0O00CGswUkdgu0MuLJCeiPfTBBJeg96HwC4g1n1fYObyuOoCSTCgsg0Nhjio1OBzc4z7AsCQBLYJjBt6TwKFgKqc7Mp65tJuJvLt1aJwLw6nZ6OwkQfgSDQCGpIAnQE7o3cgUAuIYs8lg8QJHhvTmILxYcluYhUzawIajwAbQvFHfxIBRkBszIHqH8pABLscrIaxQPDfutOADbsqoMEIVALyQe9G4CmgxywMYc9yy4Lfv3xUItgThycw4zAKoVBQ14JZl7l665XOPZVpeoMRmNAbvSeBBGQW1m6gTWQjSW40XwWikjYTqJYJocnb7q7E5Mb8z28BYbOLfCQCiBegdyPwFND90QuAnz6m0oYCIQRkQS9xW2CFFTy9C2QhkF5Zz+Xv/h7CQA6gDEAA0BW9M4G3D4TAxDtTOWtMjYVL3Kai454bGGwoyOMw7hsWhiSQ8Er0ZxN4+0B0e1K7RzI14hey26WQFprX8SwuHH139YFSGJbAhN7oPQmk3FigwDFInDqlba/H9d8NZs0EeGVGsa5wMhgBxCvRn02gEBDbBdLq/ScD/KAFs5RkuO4cAIRYRCmgIQkgXoPeh0AtoFjKPpG5I/R22oeGR+QduaDu3Ge7wCy4EI2AxiOAeAF6NwJ9AS0kJq4jsACCltNnH4ez8DdrQ9iQBHQBnYfeh8BLQDlgrlGnhkQS7NzBTKxgSEvJ5mW9udjWPyQBxMvQOxCY8hKJzh0SkzzR6xUl6pamsQdBVSd6VAKIruidCeA7Er1aoFmAnxseUr0S8wQAeindUObAzVwYurFA4xGgFsgZvQOBXUAb/JkzoBNZjJkMXUCo2hcOpnS3CzDtbBL32ktDEkB0Re9M4CmgfH8OYXnd2k8njhP5qMkci5DXAw5tKmGjENV84P7+5C1sOyQBf/RuBGBekurzO+wwlwwocHrMlq6yRSGkERiFrZtZyMQiSxk0bjIegYjXoPciQIawtL5FY1iZUEGD8xa+XY/Z6vSxqy9cHCgQB3RIApejP48AVgJqlV/Zs0ktz3hkGUb6y9x2/moElgU0JAFP9M4EXgK6FwKaSEeYiFUVSmNYNibZ14KzMI9U1sKgFtB4BC5EfzYBWAKJU65HutQ4b60o27QkdslFrREKvc1t3eRKLOz9eAQiXobeg8B7KSPv+p9fz1OTVASNbc2v3dtSOP3IOl63F4Dgws37LGxgAv7o3QggFdAGfybGNAtjYjsNDGKtLFQTu429YBZX40PT/oMRcEbvSeApoPv9LaDben4S7JYlEKHua0Ch0rUSxgJ1EvlyIbaiXkMSQLgGvQ8BWCzQ49TUYM/C2HtwNQ/l2kZgq9CnrybBu1bpwAQ80TsTeFqgZ5HNvIt/UvdygLAe05tHWpaAu4u/7OZgfO/CG5XAw4l2Ru9LgFigqfwhMleega1fbphHdm9SVVnSLAzCbR/G3QKNSsAfvRsBfAto3klIvQBJjWnshSDMJQahiWG13j+oCWVQCGhIApeg9yHwFFAuBXQTvH+jAZWKox/MRpFG4Gpb1RqHo40/GIEI16B3IgDL3Xqylj+UVV/OUs/YUCYUbblMHK5kvfAnCSS4DL0DgbjsTMV51/9MegHILhwYLGkvhgWGXCZQJzH32gcakoAzelcCy1rYMoRt8FsSmbtLBZtS8FGhXFBL4epxuJcPNIeRCVyC3ofAOxK9CKiF3zWgoO4xiRp26AXSlRlksxa5hXDHIxDhAvR+BCoBSeLXbSiY1oItQVCLDZ01AY1HgArIE70TARpItHtxUkq3ucay5YYfudnNdp4T/UMEPnCiv0B/NoGYbzC/jm5HXH8QUvq5GSLE+h0w3NzMvsUN3xZoVAIRXdGHyLx5HoGHgGZ71BvlCtSwZltXf1OYkQn9gfAZ+ZxkzYEJnI0+IB98PY1AKaBuCVgU4gUzicCr7V8lt2UuVP9FAYqxCTigbwV0MoFb7uYb4cG1tnLozOpwCupiIRiqCBgSpgYg4IY+BGcCt7ue8ajU8WQJLeM5kA4Mu92sbhQBctKCjt1sgQYj4IA+QDFynU+ADGFHN963wHO5oLy0fyqWrti+cDTSiudUDvgtAj7oQ6oXD08m8BKQpfKQNPbempczSfBK4T4VeOeD0w1l8+XB0km/S8AT/ePgHjwJlBaIvgvmMozQiJ8waH3QbqqUEiXrLXUOTMAHPetEn0ngBi0dXf/dMozlXzc+Ji30wIdVSIcncCr6EDwJxMWJxm78oR2HkbOnU/ny/urAUIy9bVrb9nnZVsvteNrpAATc0C9OtBeBuAxhqOz9qLSYyXdJd7ObiiT3xQeVgg9U/1g2TdUFgilIPzABH/SbE+1CYBUQyrs+kEsdyII9pcGs6e3CzYm5Q0oWbuqKhkVmQ9L4YAQ80dNZ2PkE4hJIxG6qGpprMFZ/99dy7ZFgVteGfpRr9+sE3NCHmxZl/JbAywdCMoR9kDXLrvZPe6mtbRJDx9svp49Hbmbx6wSc0dNZ2PkEXkNY3G8Yc2DPEMi5jqvpfLd/6swjFR6SPY3FTxDVDvzrBJzRh8Qspp5GgDjR2JsJGPMTaHmSpv2zOgjnrxYDxibghr71gc4kUM7CDhVBY7eecUUilQ4McsJUt4bt11XcfpGAA3rdAn1LoBGQUgjWUkQmMZ3i0f4fbFhhGRwv3jYegbPRh9RPi/ycwEtA+IoHsdsbdeCJG35zWekvhnvSBl5lJmAu5MbOj4ch4Iz+uZgX3AiUcSBLyiyuhY1aQtXwO7/hS3G41mh29+0a5vBDEvBErwQSTyDQRKJRvo2LMhSnBjvRfxuHm4WVGOyVUbI5QKMS8EHPBhJPI1DOwoKhkPkmdVo8PREXLpKDWORjGe1m7t2KxnZn0MEIuKGnCWXnE+AskOWOiMCVU5+aOxOlVyA3ifd7hF4NpeMpxQMT8EEfknbHzW8JHJnGo1zrkY66c33TvTaMohf/1LPi1OoTwxNwQM/GgU4j8F4Lg6ORLCh1Tv+q26YFJowy9+aRlijEd6G4nyPghp6NA51GIC3TeLDvK6HwWTaxPCDtfygQoey8lL3PIQk4ow+p7wN9TiAtQxh8UEiPRV0xeN2CJoNpIZgdk9t5rKEC16gEfNAHsC7Ff0KACAhtBUBYErGxnnFfJ2RdiFnGbvTf5KSaIQm4oZd8oHMIpBCJBQpr+fzp+GicyT27Sh40DiftSmqnjyjfiK+3JDA2gbPRV4HEkwk0Q5hS/UPpBS3wuFenmROTDDdzIQh2yAU5FhGPlS/5dQI+6IOQT3kOgVJA9lhELu9SyqHeHrMaS9f3lRxMShyegAP6oMbRvyVQ+kAfVKOm3hr9m/cetsXhZnUbyqEy7MfzgX6dgBv60IRBzySwCqglZqkaE5se0fYFfLZ/N6Vb2dpPO0Iw5YWOR8AT/SIgLwLEiZaUnwTPLRLxhwZ44Nt/VqteHSoAaI5Bj0HADX0loJMJND6QtJqXOPFT5cN7F6TS/q3zBrZ0JjhQnWN4AmejpwI6nwA3hCl9geq/5RFIp5j3k0scblbvggfcZAAPZBWPTcAT/RZIdCHAOdFsSlwsn6np3J5pu0xrGAvExexvvDjBDRqYgBt6ZTX+BAJcHGiDTAfhikdFJRP9N+a4msRIqFEIoYd+JhBblWA8Aj7og0H+nxPgfKDqekqi7RcU/sy3h9KB2/LoKNfnCsfy6gcmcCp63QJ9SyAtO1MB5bRKKvvtmH0IEXiIxzK5LSEIJLFc5FeYhiGA6Ip+KfPrReA5jX878NgrLrLdXDvw6wji4k60buQ2FvQ/siNsGAJu6C0C+orAc2tzxt5UMhIzVi34siEI8r+QrAlw9iJ9WG8NCOMScEb/kB0ENwK4+EA5qMMsNaOhDHNK+SzTPgJv7Q/CXsh8ELg5FDcSATf0VEDnE8DFB8r6ijBVe2h4bP84rc9rAOvd/pG5hRBbp+2DOrPIb6saiYAz+u1WBy4EIOAzJzqj2gtaKtIAQn/Y1W1f2n8mlZGMN7Ru0wuklSO1yOkABDzRbwJyIhDJEKaEsYIgfimRLu0ZubQD6weWMJa6o2FgAm7oKwt0MgHiA3VnAtjGi0jiJK6bTaaVwbTqP/Ews1r5Bns7s49PZX6dgA/6kETEJxDApUpr/ozK9jmpZENduPjcO2SpsWUsaXq8xMV4BE5F/yQQ3AhAYYG2wXOSlY/FOm/BmAZNSbY3RH7LdXf9F45VGf8vEHBAHyIP9xwCuGws3KfxUY6GBjIZQC7AHvkzlvZHQ4FrW0biqATc0BsF9DmBlwVCsqQby3L7iTwHsgMglFdWDIDvwG2OSW6SxlG9MbEcRhmYgCf6SkAnEyjjQG3KYigjoKHMHogllbgCT8XObOnORSgjVbC3s4+y/ccj4Iw+BE8CUESiI8eg6gVliKroNbHMQgCx/VHeOmvJZZKnYAMTcEMfgieBZhpPLSOsCmejoRR4Khkk8lEvhxCERAGUOSn3iultDh6VgBv6ENwIrE40NpltZUrSzqNaxMMSfiTD7/oS4vu/u/CVfdi2m7WNSsAT/eIDORIgcSDk9tmmclmPyj6W1rNd+lujEO1uyyA4ZtkQCOllYo1KwAd9CJ4EYLFAs0JISmGCJp9g6x2peEta6AlcWIytbxI+vIn22AROQq8stZ1D4DZvAkJxY8jurUVuXbiyrdBp/2A4kHwGuTrH8AR80IfgTIAEEqNAAhpzGeQkg1i/hdEKP8hUQieKODwBN/SHesBhAu8aiTP16VmGyGWjKIkq5BmjFuSwPEtvce0/JAFP9FRALgTiX7fbPM9i0sD3L7mvRfnkoXe5xJghCTij9yJwu93in4uAgvzl3WPDxSgkvtiPsecu/AcIuKH3IvAU0B9UQKGX9R/NJ4X2DwYdHLr4CNBhCJyN3ovAU0Dxs99FGbFDsXYcUZu3Hvq8Mx5jEziO/nFBDJ4E4v/+/puxQJYwhYVBeLf/oRaJ4YLH2ATM6DcBuRB4WiB8PZ7/tz7osf4AAOXMdiwdSM/0JXsN+1I6rq5vL1O+XYHd/RwWnkKKvaD6xu3kIcDtL6W/lB6sSN55bbje8imuYxoid4Ox3ogXDUPi9vXtPy7P7AXdL12up8fKh7OXWWBXHCu+9IuUNlFaiUUuYYivx2HrhWeOsumQFCzfXf02H8Blf4ZvWuSUJvu4b9gbzfjSCfw5Ajra1hTZZtws0Nm+1f13aj+qyyoDIxFp7dDpP0P359cbWTfA9DwdUC4zOdVnpnD5o/sz0BasLJk09Oht9JmpbwF3h/UTO/oH3oKfmVF+pnT6dxs7t+KmGF0EyT9Yjtt3qSIP+UAWg3FoCGs1R50bxXxWajaO9U7CWj42fWPlKqpGoEaTW0mq67qyxuZjXocUc3QIU1pD8h2V3nKZ41wNl4UF+mZ6ohse3RdR+m41kHXhbW9V+mN/zg98IPu0tGuBDjVvxesDx/EUg9T20uXM/wUYAOBDukFiC65yAAAAAElFTkSuQmCC]]></data>
	</file>
	<file>
	  <filename>/lib/js/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCEtLSBEVU1NWSBIVE1MIEZJTEUgLS0+]]></data>
	</file>
	<file>
	  <filename>/lib/js/jquery-ui-timepicker-addon.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKICogalF1ZXJ5IHRpbWVwaWNrZXIgYWRkb24KICogQnk6IFRyZW50IFJpY2hhcmRzb24gW2h0dHA6Ly90cmVudHJpY2hhcmRzb24uY29tXQogKiBWZXJzaW9uIDEuMS4xCiAqIExhc3QgTW9kaWZpZWQ6IDExLzA3LzIwMTIKICoKICogQ29weXJpZ2h0IDIwMTIgVHJlbnQgUmljaGFyZHNvbgogKiBZb3UgbWF5IHVzZSB0aGlzIHByb2plY3QgdW5kZXIgTUlUIG9yIEdQTCBsaWNlbnNlcy4KICogaHR0cDovL3RyZW50cmljaGFyZHNvbi5jb20vSW1wcm9tcHR1L0dQTC1MSUNFTlNFLnR4dAogKiBodHRwOi8vdHJlbnRyaWNoYXJkc29uLmNvbS9JbXByb21wdHUvTUlULUxJQ0VOU0UudHh0CiAqLwoKLypqc2xpbnQgZXZpbDogdHJ1ZSwgd2hpdGU6IGZhbHNlLCB1bmRlZjogZmFsc2UsIG5vbWVuOiBmYWxzZSAqLwoKKGZ1bmN0aW9uKCQpIHsKCgkvKgoJKiBMZXRzIG5vdCByZWRlZmluZSB0aW1lcGlja2VyLCBQcmV2ZW50ICJVbmNhdWdodCBSYW5nZUVycm9yOiBNYXhpbXVtIGNhbGwgc3RhY2sgc2l6ZSBleGNlZWRlZCIKCSovCgkkLnVpLnRpbWVwaWNrZXIgPSAkLnVpLnRpbWVwaWNrZXIgfHwge307CglpZiAoJC51aS50aW1lcGlja2VyLnZlcnNpb24pIHsKCQlyZXR1cm47Cgl9CgoJLyoKCSogRXh0ZW5kIGpRdWVyeVVJLCBnZXQgaXQgc3RhcnRlZCB3aXRoIG91ciB2ZXJzaW9uIG51bWJlcgoJKi8KCSQuZXh0ZW5kKCQudWksIHsKCQl0aW1lcGlja2VyOiB7CgkJCXZlcnNpb246ICIxLjEuMSIKCQl9Cgl9KTsKCgkvKiAKCSogVGltZXBpY2tlciBtYW5hZ2VyLgoJKiBVc2UgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLCAkLnRpbWVwaWNrZXIsIHRvIGludGVyYWN0IHdpdGggdGhlIHRpbWUgcGlja2VyLgoJKiBTZXR0aW5ncyBmb3IgKGdyb3VwcyBvZikgdGltZSBwaWNrZXJzIGFyZSBtYWludGFpbmVkIGluIGFuIGluc3RhbmNlIG9iamVjdCwKCSogYWxsb3dpbmcgbXVsdGlwbGUgZGlmZmVyZW50IHNldHRpbmdzIG9uIHRoZSBzYW1lIHBhZ2UuCgkqLwoJZnVuY3Rpb24gVGltZXBpY2tlcigpIHsKCQl0aGlzLnJlZ2lvbmFsID0gW107IC8vIEF2YWlsYWJsZSByZWdpb25hbCBzZXR0aW5ncywgaW5kZXhlZCBieSBsYW5ndWFnZSBjb2RlCgkJdGhpcy5yZWdpb25hbFsnJ10gPSB7IC8vIERlZmF1bHQgcmVnaW9uYWwgc2V0dGluZ3MKCQkJY3VycmVudFRleHQ6ICdOb3cnLAoJCQljbG9zZVRleHQ6ICdEb25lJywKCQkJYW1OYW1lczogWydBTScsICdBJ10sCgkJCXBtTmFtZXM6IFsnUE0nLCAnUCddLAoJCQl0aW1lRm9ybWF0OiAnSEg6bW0nLAoJCQl0aW1lU3VmZml4OiAnJywKCQkJdGltZU9ubHlUaXRsZTogJ0Nob29zZSBUaW1lJywKCQkJdGltZVRleHQ6ICdUaW1lJywKCQkJaG91clRleHQ6ICdIb3VyJywKCQkJbWludXRlVGV4dDogJ01pbnV0ZScsCgkJCXNlY29uZFRleHQ6ICdTZWNvbmQnLAoJCQltaWxsaXNlY1RleHQ6ICdNaWxsaXNlY29uZCcsCgkJCXRpbWV6b25lVGV4dDogJ1RpbWUgWm9uZScsCgkJCWlzUlRMOiBmYWxzZQoJCX07CgkJdGhpcy5fZGVmYXVsdHMgPSB7IC8vIEdsb2JhbCBkZWZhdWx0cyBmb3IgYWxsIHRoZSBkYXRldGltZSBwaWNrZXIgaW5zdGFuY2VzCgkJCXNob3dCdXR0b25QYW5lbDogdHJ1ZSwKCQkJdGltZU9ubHk6IGZhbHNlLAoJCQlzaG93SG91cjogdHJ1ZSwKCQkJc2hvd01pbnV0ZTogdHJ1ZSwKCQkJc2hvd1NlY29uZDogZmFsc2UsCgkJCXNob3dNaWxsaXNlYzogZmFsc2UsCgkJCXNob3dUaW1lem9uZTogZmFsc2UsCgkJCXNob3dUaW1lOiB0cnVlLAoJCQlzdGVwSG91cjogMSwKCQkJc3RlcE1pbnV0ZTogMSwKCQkJc3RlcFNlY29uZDogMSwKCQkJc3RlcE1pbGxpc2VjOiAxLAoJCQlob3VyOiAwLAoJCQltaW51dGU6IDAsCgkJCXNlY29uZDogMCwKCQkJbWlsbGlzZWM6IDAsCgkJCXRpbWV6b25lOiBudWxsLAoJCQl1c2VMb2NhbFRpbWV6b25lOiBmYWxzZSwKCQkJZGVmYXVsdFRpbWV6b25lOiAiKzAwMDAiLAoJCQlob3VyTWluOiAwLAoJCQltaW51dGVNaW46IDAsCgkJCXNlY29uZE1pbjogMCwKCQkJbWlsbGlzZWNNaW46IDAsCgkJCWhvdXJNYXg6IDIzLAoJCQltaW51dGVNYXg6IDU5LAoJCQlzZWNvbmRNYXg6IDU5LAoJCQltaWxsaXNlY01heDogOTk5LAoJCQltaW5EYXRlVGltZTogbnVsbCwKCQkJbWF4RGF0ZVRpbWU6IG51bGwsCgkJCW9uU2VsZWN0OiBudWxsLAoJCQlob3VyR3JpZDogMCwKCQkJbWludXRlR3JpZDogMCwKCQkJc2Vjb25kR3JpZDogMCwKCQkJbWlsbGlzZWNHcmlkOiAwLAoJCQlhbHdheXNTZXRUaW1lOiB0cnVlLAoJCQlzZXBhcmF0b3I6ICcgJywKCQkJYWx0RmllbGRUaW1lT25seTogdHJ1ZSwKCQkJYWx0VGltZUZvcm1hdDogbnVsbCwKCQkJYWx0U2VwYXJhdG9yOiBudWxsLAoJCQlhbHRUaW1lU3VmZml4OiBudWxsLAoJCQlwaWNrZXJUaW1lRm9ybWF0OiBudWxsLAoJCQlwaWNrZXJUaW1lU3VmZml4OiBudWxsLAoJCQlzaG93VGltZXBpY2tlcjogdHJ1ZSwKCQkJdGltZXpvbmVJc284NjAxOiBmYWxzZSwKCQkJdGltZXpvbmVMaXN0OiBudWxsLAoJCQlhZGRTbGlkZXJBY2Nlc3M6IGZhbHNlLAoJCQlzbGlkZXJBY2Nlc3NBcmdzOiBudWxsLAoJCQljb250cm9sVHlwZTogJ3NsaWRlcicsCgkJCWRlZmF1bHRWYWx1ZTogbnVsbCwKCQkJcGFyc2U6ICdzdHJpY3QnCgkJfTsKCQkkLmV4dGVuZCh0aGlzLl9kZWZhdWx0cywgdGhpcy5yZWdpb25hbFsnJ10pOwoJfQoKCSQuZXh0ZW5kKFRpbWVwaWNrZXIucHJvdG90eXBlLCB7CgkJJGlucHV0OiBudWxsLAoJCSRhbHRJbnB1dDogbnVsbCwKCQkkdGltZU9iajogbnVsbCwKCQlpbnN0OiBudWxsLAoJCWhvdXJfc2xpZGVyOiBudWxsLAoJCW1pbnV0ZV9zbGlkZXI6IG51bGwsCgkJc2Vjb25kX3NsaWRlcjogbnVsbCwKCQltaWxsaXNlY19zbGlkZXI6IG51bGwsCgkJdGltZXpvbmVfc2VsZWN0OiBudWxsLAoJCWhvdXI6IDAsCgkJbWludXRlOiAwLAoJCXNlY29uZDogMCwKCQltaWxsaXNlYzogMCwKCQl0aW1lem9uZTogbnVsbCwKCQlkZWZhdWx0VGltZXpvbmU6ICIrMDAwMCIsCgkJaG91ck1pbk9yaWdpbmFsOiBudWxsLAoJCW1pbnV0ZU1pbk9yaWdpbmFsOiBudWxsLAoJCXNlY29uZE1pbk9yaWdpbmFsOiBudWxsLAoJCW1pbGxpc2VjTWluT3JpZ2luYWw6IG51bGwsCgkJaG91ck1heE9yaWdpbmFsOiBudWxsLAoJCW1pbnV0ZU1heE9yaWdpbmFsOiBudWxsLAoJCXNlY29uZE1heE9yaWdpbmFsOiBudWxsLAoJCW1pbGxpc2VjTWF4T3JpZ2luYWw6IG51bGwsCgkJYW1wbTogJycsCgkJZm9ybWF0dGVkRGF0ZTogJycsCgkJZm9ybWF0dGVkVGltZTogJycsCgkJZm9ybWF0dGVkRGF0ZVRpbWU6ICcnLAoJCXRpbWV6b25lTGlzdDogbnVsbCwKCQl1bml0czogWydob3VyJywnbWludXRlJywnc2Vjb25kJywnbWlsbGlzZWMnXSwKCQljb250cm9sOiBudWxsLAoKCQkvKiAKCQkqIE92ZXJyaWRlIHRoZSBkZWZhdWx0IHNldHRpbmdzIGZvciBhbGwgaW5zdGFuY2VzIG9mIHRoZSB0aW1lIHBpY2tlci4KCQkqIEBwYXJhbSAgc2V0dGluZ3MgIG9iamVjdCAtIHRoZSBuZXcgc2V0dGluZ3MgdG8gdXNlIGFzIGRlZmF1bHRzIChhbm9ueW1vdXMgb2JqZWN0KQoJCSogQHJldHVybiB0aGUgbWFuYWdlciBvYmplY3QKCQkqLwoJCXNldERlZmF1bHRzOiBmdW5jdGlvbihzZXR0aW5ncykgewoJCQlleHRlbmRSZW1vdmUodGhpcy5fZGVmYXVsdHMsIHNldHRpbmdzIHx8IHt9KTsKCQkJcmV0dXJuIHRoaXM7CgkJfSwKCgkJLyoKCQkqIENyZWF0ZSBhIG5ldyBUaW1lcGlja2VyIGluc3RhbmNlCgkJKi8KCQlfbmV3SW5zdDogZnVuY3Rpb24oJGlucHV0LCBvKSB7CgkJCXZhciB0cF9pbnN0ID0gbmV3IFRpbWVwaWNrZXIoKSwKCQkJCWlubGluZVNldHRpbmdzID0ge30sCiAgICAgICAgICAgICAgICBmbnMgPSB7fSwKCQkgICAgICAgIG92ZXJyaWRlcywgaTsKCgkJCWZvciAodmFyIGF0dHJOYW1lIGluIHRoaXMuX2RlZmF1bHRzKSB7CgkJCQlpZih0aGlzLl9kZWZhdWx0cy5oYXNPd25Qcm9wZXJ0eShhdHRyTmFtZSkpewoJCQkJCXZhciBhdHRyVmFsdWUgPSAkaW5wdXQuYXR0cigndGltZTonICsgYXR0ck5hbWUpOwoJCQkJCWlmIChhdHRyVmFsdWUpIHsKCQkJCQkJdHJ5IHsKCQkJCQkJCWlubGluZVNldHRpbmdzW2F0dHJOYW1lXSA9IGV2YWwoYXR0clZhbHVlKTsKCQkJCQkJfSBjYXRjaCAoZXJyKSB7CgkJCQkJCQlpbmxpbmVTZXR0aW5nc1thdHRyTmFtZV0gPSBhdHRyVmFsdWU7CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCX0KCQkgICAgb3ZlcnJpZGVzID0gewoJCSAgICAgICAgYmVmb3JlU2hvdzogZnVuY3Rpb24gKGlucHV0LCBkcF9pbnN0KSB7CgkJICAgICAgICAgICAgaWYgKCQuaXNGdW5jdGlvbih0cF9pbnN0Ll9kZWZhdWx0cy5ldm50cy5iZWZvcmVTaG93KSkgewoJCSAgICAgICAgICAgICAgICByZXR1cm4gdHBfaW5zdC5fZGVmYXVsdHMuZXZudHMuYmVmb3JlU2hvdy5jYWxsKCRpbnB1dFswXSwgaW5wdXQsIGRwX2luc3QsIHRwX2luc3QpOwoJCSAgICAgICAgICAgIH0KCQkgICAgICAgIH0sCgkJICAgICAgICBvbkNoYW5nZU1vbnRoWWVhcjogZnVuY3Rpb24gKHllYXIsIG1vbnRoLCBkcF9pbnN0KSB7CgkJICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSB0aW1lIGFzIHdlbGwgOiB0aGlzIHByZXZlbnRzIHRoZSB0aW1lIGZyb20gZGlzYXBwZWFyaW5nIGZyb20gdGhlICRpbnB1dCBmaWVsZC4KCQkgICAgICAgICAgICB0cF9pbnN0Ll91cGRhdGVEYXRlVGltZShkcF9pbnN0KTsKCQkgICAgICAgICAgICBpZiAoJC5pc0Z1bmN0aW9uKHRwX2luc3QuX2RlZmF1bHRzLmV2bnRzLm9uQ2hhbmdlTW9udGhZZWFyKSkgewoJCSAgICAgICAgICAgICAgICB0cF9pbnN0Ll9kZWZhdWx0cy5ldm50cy5vbkNoYW5nZU1vbnRoWWVhci5jYWxsKCRpbnB1dFswXSwgeWVhciwgbW9udGgsIGRwX2luc3QsIHRwX2luc3QpOwoJCSAgICAgICAgICAgIH0KCQkgICAgICAgIH0sCgkJICAgICAgICBvbkNsb3NlOiBmdW5jdGlvbiAoZGF0ZVRleHQsIGRwX2luc3QpIHsKCQkgICAgICAgICAgICBpZiAodHBfaW5zdC50aW1lRGVmaW5lZCA9PT0gdHJ1ZSAmJiAkaW5wdXQudmFsKCkgIT09ICcnKSB7CgkJICAgICAgICAgICAgICAgIHRwX2luc3QuX3VwZGF0ZURhdGVUaW1lKGRwX2luc3QpOwoJCSAgICAgICAgICAgIH0KCQkgICAgICAgICAgICBpZiAoJC5pc0Z1bmN0aW9uKHRwX2luc3QuX2RlZmF1bHRzLmV2bnRzLm9uQ2xvc2UpKSB7CgkJICAgICAgICAgICAgICAgIHRwX2luc3QuX2RlZmF1bHRzLmV2bnRzLm9uQ2xvc2UuY2FsbCgkaW5wdXRbMF0sIGRhdGVUZXh0LCBkcF9pbnN0LCB0cF9pbnN0KTsKCQkgICAgICAgICAgICB9CgkJICAgICAgICB9CgkJICAgIH07CgkJICAgIGZvciAoaSBpbiBvdmVycmlkZXMpIHsKCQkgICAgICAgIGlmIChvdmVycmlkZXMuaGFzT3duUHJvcGVydHkoaSkpIHsKCQkgICAgICAgICAgICBmbnNbaV0gPSBvW2ldIHx8IG51bGw7CgkJICAgICAgICB9CgkJICAgIH0KCQkgICAgdHBfaW5zdC5fZGVmYXVsdHMgPSAkLmV4dGVuZCh7fSwgdGhpcy5fZGVmYXVsdHMsIGlubGluZVNldHRpbmdzLCBvLCBvdmVycmlkZXMsIHsKCQkgICAgICAgIGV2bnRzOmZucywKCQkgICAgICAgIHRpbWVwaWNrZXI6IHRwX2luc3QgLy8gYWRkIHRpbWVwaWNrZXIgYXMgYSBwcm9wZXJ0eSBvZiBkYXRlcGlja2VyOiAkLmRhdGVwaWNrZXIuX2dldChkcF9pbnN0LCAndGltZXBpY2tlcicpOwoJCSAgICB9KTsKCQkJdHBfaW5zdC5hbU5hbWVzID0gJC5tYXAodHBfaW5zdC5fZGVmYXVsdHMuYW1OYW1lcywgZnVuY3Rpb24odmFsKSB7CgkJCQlyZXR1cm4gdmFsLnRvVXBwZXJDYXNlKCk7CgkJCX0pOwoJCQl0cF9pbnN0LnBtTmFtZXMgPSAkLm1hcCh0cF9pbnN0Ll9kZWZhdWx0cy5wbU5hbWVzLCBmdW5jdGlvbih2YWwpIHsKCQkJCXJldHVybiB2YWwudG9VcHBlckNhc2UoKTsKCQkJfSk7CgoJCQkvLyBjb250cm9sVHlwZSBpcyBzdHJpbmcgLSBrZXkgdG8gb3VyIHRoaXMuX2NvbnRyb2xzCgkJCWlmKHR5cGVvZih0cF9pbnN0Ll9kZWZhdWx0cy5jb250cm9sVHlwZSkgPT09ICdzdHJpbmcnKXsKCQkJCWlmKCQuZm5bdHBfaW5zdC5fZGVmYXVsdHMuY29udHJvbFR5cGVdID09PSB1bmRlZmluZWQpewoJCQkJCXRwX2luc3QuX2RlZmF1bHRzLmNvbnRyb2xUeXBlID0gJ3NlbGVjdCc7CgkJCQl9CgkJCQl0cF9pbnN0LmNvbnRyb2wgPSB0cF9pbnN0Ll9jb250cm9sc1t0cF9pbnN0Ll9kZWZhdWx0cy5jb250cm9sVHlwZV07CgkJCX0KCQkJLy8gY29udHJvbFR5cGUgaXMgYW4gb2JqZWN0IGFuZCBtdXN0IGltcGxlbWVudCBjcmVhdGUsIG9wdGlvbnMsIHZhbHVlIG1ldGhvZHMKCQkJZWxzZXsgCgkJCQl0cF9pbnN0LmNvbnRyb2wgPSB0cF9pbnN0Ll9kZWZhdWx0cy5jb250cm9sVHlwZTsKCQkJfQoKCQkJaWYgKHRwX2luc3QuX2RlZmF1bHRzLnRpbWV6b25lTGlzdCA9PT0gbnVsbCkgewoJCQkJdmFyIHRpbWV6b25lTGlzdCA9IFsnLTEyMDAnLCAnLTExMDAnLCAnLTEwMDAnLCAnLTA5MzAnLCAnLTA5MDAnLCAnLTA4MDAnLCAnLTA3MDAnLCAnLTA2MDAnLCAnLTA1MDAnLCAnLTA0MzAnLCAnLTA0MDAnLCAnLTAzMzAnLCAnLTAzMDAnLCAnLTAyMDAnLCAnLTAxMDAnLCAnKzAwMDAnLCAKCQkJCQkJCQkJJyswMTAwJywgJyswMjAwJywgJyswMzAwJywgJyswMzMwJywgJyswNDAwJywgJyswNDMwJywgJyswNTAwJywgJyswNTMwJywgJyswNTQ1JywgJyswNjAwJywgJyswNjMwJywgJyswNzAwJywgJyswODAwJywgJyswODQ1JywgJyswOTAwJywgJyswOTMwJywgCgkJCQkJCQkJCScrMTAwMCcsICcrMTAzMCcsICcrMTEwMCcsICcrMTEzMCcsICcrMTIwMCcsICcrMTI0NScsICcrMTMwMCcsICcrMTQwMCddOwoKCQkJCWlmICh0cF9pbnN0Ll9kZWZhdWx0cy50aW1lem9uZUlzbzg2MDEpIHsKCQkJCQl0aW1lem9uZUxpc3QgPSAkLm1hcCh0aW1lem9uZUxpc3QsIGZ1bmN0aW9uKHZhbCkgewoJCQkJCQlyZXR1cm4gdmFsID09ICcrMDAwMCcgPyAnWicgOiAodmFsLnN1YnN0cmluZygwLCAzKSArICc6JyArIHZhbC5zdWJzdHJpbmcoMykpOwoJCQkJCX0pOwoJCQkJfQoJCQkJdHBfaW5zdC5fZGVmYXVsdHMudGltZXpvbmVMaXN0ID0gdGltZXpvbmVMaXN0OwoJCQl9CgoJCQl0cF9pbnN0LnRpbWV6b25lID0gdHBfaW5zdC5fZGVmYXVsdHMudGltZXpvbmU7CgkJCXRwX2luc3QuaG91ciA9IHRwX2luc3QuX2RlZmF1bHRzLmhvdXI7CgkJCXRwX2luc3QubWludXRlID0gdHBfaW5zdC5fZGVmYXVsdHMubWludXRlOwoJCQl0cF9pbnN0LnNlY29uZCA9IHRwX2luc3QuX2RlZmF1bHRzLnNlY29uZDsKCQkJdHBfaW5zdC5taWxsaXNlYyA9IHRwX2luc3QuX2RlZmF1bHRzLm1pbGxpc2VjOwoJCQl0cF9pbnN0LmFtcG0gPSAnJzsKCQkJdHBfaW5zdC4kaW5wdXQgPSAkaW5wdXQ7CgoJCQlpZiAoby5hbHRGaWVsZCkgewoJCQkJdHBfaW5zdC4kYWx0SW5wdXQgPSAkKG8uYWx0RmllbGQpLmNzcyh7CgkJCQkJY3Vyc29yOiAncG9pbnRlcicKCQkJCX0pLmZvY3VzKGZ1bmN0aW9uKCkgewoJCQkJCSRpbnB1dC50cmlnZ2VyKCJmb2N1cyIpOwoJCQkJfSk7CgkJCX0KCgkJCWlmICh0cF9pbnN0Ll9kZWZhdWx0cy5taW5EYXRlID09PSAwIHx8IHRwX2luc3QuX2RlZmF1bHRzLm1pbkRhdGVUaW1lID09PSAwKSB7CgkJCQl0cF9pbnN0Ll9kZWZhdWx0cy5taW5EYXRlID0gbmV3IERhdGUoKTsKCQkJfQoJCQlpZiAodHBfaW5zdC5fZGVmYXVsdHMubWF4RGF0ZSA9PT0gMCB8fCB0cF9pbnN0Ll9kZWZhdWx0cy5tYXhEYXRlVGltZSA9PT0gMCkgewoJCQkJdHBfaW5zdC5fZGVmYXVsdHMubWF4RGF0ZSA9IG5ldyBEYXRlKCk7CgkJCX0KCgkJCS8vIGRhdGVwaWNrZXIgbmVlZHMgbWluRGF0ZS9tYXhEYXRlLCB0aW1lcGlja2VyIG5lZWRzIG1pbkRhdGVUaW1lL21heERhdGVUaW1lLi4KCQkJaWYgKHRwX2luc3QuX2RlZmF1bHRzLm1pbkRhdGUgIT09IHVuZGVmaW5lZCAmJiB0cF9pbnN0Ll9kZWZhdWx0cy5taW5EYXRlIGluc3RhbmNlb2YgRGF0ZSkgewoJCQkJdHBfaW5zdC5fZGVmYXVsdHMubWluRGF0ZVRpbWUgPSBuZXcgRGF0ZSh0cF9pbnN0Ll9kZWZhdWx0cy5taW5EYXRlLmdldFRpbWUoKSk7CgkJCX0KCQkJaWYgKHRwX2luc3QuX2RlZmF1bHRzLm1pbkRhdGVUaW1lICE9PSB1bmRlZmluZWQgJiYgdHBfaW5zdC5fZGVmYXVsdHMubWluRGF0ZVRpbWUgaW5zdGFuY2VvZiBEYXRlKSB7CgkJCQl0cF9pbnN0Ll9kZWZhdWx0cy5taW5EYXRlID0gbmV3IERhdGUodHBfaW5zdC5fZGVmYXVsdHMubWluRGF0ZVRpbWUuZ2V0VGltZSgpKTsKCQkJfQoJCQlpZiAodHBfaW5zdC5fZGVmYXVsdHMubWF4RGF0ZSAhPT0gdW5kZWZpbmVkICYmIHRwX2luc3QuX2RlZmF1bHRzLm1heERhdGUgaW5zdGFuY2VvZiBEYXRlKSB7CgkJCQl0cF9pbnN0Ll9kZWZhdWx0cy5tYXhEYXRlVGltZSA9IG5ldyBEYXRlKHRwX2luc3QuX2RlZmF1bHRzLm1heERhdGUuZ2V0VGltZSgpKTsKCQkJfQoJCQlpZiAodHBfaW5zdC5fZGVmYXVsdHMubWF4RGF0ZVRpbWUgIT09IHVuZGVmaW5lZCAmJiB0cF9pbnN0Ll9kZWZhdWx0cy5tYXhEYXRlVGltZSBpbnN0YW5jZW9mIERhdGUpIHsKCQkJCXRwX2luc3QuX2RlZmF1bHRzLm1heERhdGUgPSBuZXcgRGF0ZSh0cF9pbnN0Ll9kZWZhdWx0cy5tYXhEYXRlVGltZS5nZXRUaW1lKCkpOwoJCQl9CgkJCXRwX2luc3QuJGlucHV0LmJpbmQoJ2ZvY3VzJywgZnVuY3Rpb24oKSB7CgkJCQl0cF9pbnN0Ll9vbkZvY3VzKCk7CgkJCX0pOwoKCQkJcmV0dXJuIHRwX2luc3Q7CgkJfSwKCgkJLyoKCQkqIGFkZCBvdXIgc2xpZGVycyB0byB0aGUgY2FsZW5kYXIKCQkqLwoJCV9hZGRUaW1lUGlja2VyOiBmdW5jdGlvbihkcF9pbnN0KSB7CgkJCXZhciBjdXJyRFQgPSAodGhpcy4kYWx0SW5wdXQgJiYgdGhpcy5fZGVmYXVsdHMuYWx0RmllbGRUaW1lT25seSkgPyB0aGlzLiRpbnB1dC52YWwoKSArICcgJyArIHRoaXMuJGFsdElucHV0LnZhbCgpIDogdGhpcy4kaW5wdXQudmFsKCk7CgoJCQl0aGlzLnRpbWVEZWZpbmVkID0gdGhpcy5fcGFyc2VUaW1lKGN1cnJEVCk7CgkJCXRoaXMuX2xpbWl0TWluTWF4RGF0ZVRpbWUoZHBfaW5zdCwgZmFsc2UpOwoJCQl0aGlzLl9pbmplY3RUaW1lUGlja2VyKCk7CgkJfSwKCgkJLyoKCQkqIHBhcnNlIHRoZSB0aW1lIHN0cmluZyBmcm9tIGlucHV0IHZhbHVlIG9yIF9zZXRUaW1lCgkJKi8KCQlfcGFyc2VUaW1lOiBmdW5jdGlvbih0aW1lU3RyaW5nLCB3aXRoRGF0ZSkgewoJCQlpZiAoIXRoaXMuaW5zdCkgewoJCQkJdGhpcy5pbnN0ID0gJC5kYXRlcGlja2VyLl9nZXRJbnN0KHRoaXMuJGlucHV0WzBdKTsKCQkJfQoKCQkJaWYgKHdpdGhEYXRlIHx8ICF0aGlzLl9kZWZhdWx0cy50aW1lT25seSkgewoJCQkJdmFyIGRwX2RhdGVGb3JtYXQgPSAkLmRhdGVwaWNrZXIuX2dldCh0aGlzLmluc3QsICdkYXRlRm9ybWF0Jyk7CgkJCQl0cnkgewoJCQkJCXZhciBwYXJzZVJlcyA9IHBhcnNlRGF0ZVRpbWVJbnRlcm5hbChkcF9kYXRlRm9ybWF0LCB0aGlzLl9kZWZhdWx0cy50aW1lRm9ybWF0LCB0aW1lU3RyaW5nLCAkLmRhdGVwaWNrZXIuX2dldEZvcm1hdENvbmZpZyh0aGlzLmluc3QpLCB0aGlzLl9kZWZhdWx0cyk7CgkJCQkJaWYgKCFwYXJzZVJlcy50aW1lT2JqKSB7CgkJCQkJCXJldHVybiBmYWxzZTsKCQkJCQl9CgkJCQkJJC5leHRlbmQodGhpcywgcGFyc2VSZXMudGltZU9iaik7CgkJCQl9IGNhdGNoIChlcnIpIHsKCQkJCQkkLmRhdGVwaWNrZXIubG9nKCJFcnJvciBwYXJzaW5nIHRoZSBkYXRlL3RpbWUgc3RyaW5nOiAiICsgZXJyICsKCQkJCQkJCQkJIlxuZGF0ZS90aW1lIHN0cmluZyA9ICIgKyB0aW1lU3RyaW5nICsKCQkJCQkJCQkJIlxudGltZUZvcm1hdCA9ICIgKyB0aGlzLl9kZWZhdWx0cy50aW1lRm9ybWF0ICsKCQkJCQkJCQkJIlxuZGF0ZUZvcm1hdCA9ICIgKyBkcF9kYXRlRm9ybWF0KTsKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9CgkJCQlyZXR1cm4gdHJ1ZTsKCQkJfSBlbHNlIHsKCQkJCXZhciB0aW1lT2JqID0gJC5kYXRlcGlja2VyLnBhcnNlVGltZSh0aGlzLl9kZWZhdWx0cy50aW1lRm9ybWF0LCB0aW1lU3RyaW5nLCB0aGlzLl9kZWZhdWx0cyk7CgkJCQlpZiAoIXRpbWVPYmopIHsKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9CgkJCQkkLmV4dGVuZCh0aGlzLCB0aW1lT2JqKTsKCQkJCXJldHVybiB0cnVlOwoJCQl9CgkJfSwKCgkJLyoKCQkqIGdlbmVyYXRlIGFuZCBpbmplY3QgaHRtbCBmb3IgdGltZXBpY2tlciBpbnRvIHVpIGRhdGVwaWNrZXIKCQkqLwoJCV9pbmplY3RUaW1lUGlja2VyOiBmdW5jdGlvbigpIHsKCQkJdmFyICRkcCA9IHRoaXMuaW5zdC5kcERpdiwKCQkJCW8gPSB0aGlzLmluc3Quc2V0dGluZ3MsCgkJCQl0cF9pbnN0ID0gdGhpcywKCQkJCWxpdGVtID0gJycsCgkJCQl1aXRlbSA9ICcnLAoJCQkJbWF4ID0ge30sCgkJCQlncmlkU2l6ZSA9IHt9LAoJCQkJc2l6ZSA9IG51bGw7CgoJCQkvLyBQcmV2ZW50IGRpc3BsYXlpbmcgdHdpY2UKCQkJaWYgKCRkcC5maW5kKCJkaXYudWktdGltZXBpY2tlci1kaXYiKS5sZW5ndGggPT09IDAgJiYgby5zaG93VGltZXBpY2tlcikgewoJCQkJdmFyIG5vRGlzcGxheSA9ICcgc3R5bGU9ImRpc3BsYXk6bm9uZTsiJywKCQkJCQlodG1sID0gJzxkaXYgY2xhc3M9InVpLXRpbWVwaWNrZXItZGl2JysgKG8uaXNSVEw/ICcgdWktdGltZXBpY2tlci1ydGwnIDogJycpICsnIj48ZGw+JyArICc8ZHQgY2xhc3M9InVpX3RwaWNrZXJfdGltZV9sYWJlbCInICsgKChvLnNob3dUaW1lKSA/ICcnIDogbm9EaXNwbGF5KSArICc+JyArIG8udGltZVRleHQgKyAnPC9kdD4nICsgCgkJCQkJCQkJJzxkZCBjbGFzcz0idWlfdHBpY2tlcl90aW1lIicgKyAoKG8uc2hvd1RpbWUpID8gJycgOiBub0Rpc3BsYXkpICsgJz48L2RkPic7CgoJCQkJLy8gQ3JlYXRlIHRoZSBtYXJrdXAKCQkJCWZvcih2YXIgaT0wLGw9dGhpcy51bml0cy5sZW5ndGg7IGk8bDsgaSsrKXsKCQkJCQlsaXRlbSA9IHRoaXMudW5pdHNbaV07CgkJCQkJdWl0ZW0gPSBsaXRlbS5zdWJzdHIoMCwxKS50b1VwcGVyQ2FzZSgpICsgbGl0ZW0uc3Vic3RyKDEpOwoJCQkJCS8vIEFkZGVkIGJ5IFBldGVyIE1lZGVpcm9zOgoJCQkJCS8vIC0gRmlndXJlIG91dCB3aGF0IHRoZSBob3VyL21pbnV0ZS9zZWNvbmQgbWF4IHNob3VsZCBiZSBiYXNlZCBvbiB0aGUgc3RlcCB2YWx1ZXMuCgkJCQkJLy8gLSBFeGFtcGxlOiBpZiBzdGVwTWludXRlIGlzIDE1LCB0aGVuIG1pbk1heCBpcyA0NS4KCQkJCQltYXhbbGl0ZW1dID0gcGFyc2VJbnQoKG9bbGl0ZW0rJ01heCddIC0gKChvW2xpdGVtKydNYXgnXSAtIG9bbGl0ZW0rJ01pbiddKSAlIG9bJ3N0ZXAnK3VpdGVtXSkpLCAxMCk7CgkJCQkJZ3JpZFNpemVbbGl0ZW1dID0gMDsKCgkJCQkJaHRtbCArPSAnPGR0IGNsYXNzPSJ1aV90cGlja2VyXycrIGxpdGVtICsnX2xhYmVsIicgKyAoKG9bJ3Nob3cnK3VpdGVtXSkgPyAnJyA6IG5vRGlzcGxheSkgKyAnPicgKyBvW2xpdGVtICsnVGV4dCddICsgJzwvZHQ+JyArIAoJCQkJCQkJCSc8ZGQgY2xhc3M9InVpX3RwaWNrZXJfJysgbGl0ZW0gKyciPjxkaXYgY2xhc3M9InVpX3RwaWNrZXJfJysgbGl0ZW0gKydfc2xpZGVyIicgKyAoKG9bJ3Nob3cnK3VpdGVtXSkgPyAnJyA6IG5vRGlzcGxheSkgKyAnPjwvZGl2Pic7CgoJCQkJCWlmIChvWydzaG93Jyt1aXRlbV0gJiYgb1tsaXRlbSsnR3JpZCddID4gMCkgewoJCQkJCQlodG1sICs9ICc8ZGl2IHN0eWxlPSJwYWRkaW5nLWxlZnQ6IDFweCI+PHRhYmxlIGNsYXNzPSJ1aS10cGlja2VyLWdyaWQtbGFiZWwiPjx0cj4nOwoKCQkJCQkJaWYobGl0ZW0gPT0gJ2hvdXInKXsKCQkJCQkJCWZvciAodmFyIGggPSBvW2xpdGVtKydNaW4nXTsgaCA8PSBtYXhbbGl0ZW1dOyBoICs9IHBhcnNlSW50KG9bbGl0ZW0rJ0dyaWQnXSwgMTApKSB7CgkJCQkJCQkJZ3JpZFNpemVbbGl0ZW1dKys7CgkJCQkJCQkJdmFyIHRtcGggPSAkLmRhdGVwaWNrZXIuZm9ybWF0VGltZSh1c2VBbXBtKG8ucGlja2VyVGltZUZvcm1hdCB8fCBvLnRpbWVGb3JtYXQpPyAnaGh0JzonSEgnLCB7aG91cjpofSwgbyk7CQkJCQkJCQkJCgkJCQkJCQkJaHRtbCArPSAnPHRkIGRhdGEtZm9yPSInK2xpdGVtKyciPicgKyB0bXBoICsgJzwvdGQ+JzsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQllbHNlewoJCQkJCQkJZm9yICh2YXIgbSA9IG9bbGl0ZW0rJ01pbiddOyBtIDw9IG1heFtsaXRlbV07IG0gKz0gcGFyc2VJbnQob1tsaXRlbSsnR3JpZCddLCAxMCkpIHsKCQkJCQkJCQlncmlkU2l6ZVtsaXRlbV0rKzsKCQkJCQkJCQlodG1sICs9ICc8dGQgZGF0YS1mb3I9IicrbGl0ZW0rJyI+JyArICgobSA8IDEwKSA/ICcwJyA6ICcnKSArIG0gKyAnPC90ZD4nOwoJCQkJCQkJfQoJCQkJCQl9CgoJCQkJCQlodG1sICs9ICc8L3RyPjwvdGFibGU+PC9kaXY+JzsKCQkJCQl9CgkJCQkJaHRtbCArPSAnPC9kZD4nOwoJCQkJfQoJCQkJCgkJCQkvLyBUaW1lem9uZQoJCQkJaHRtbCArPSAnPGR0IGNsYXNzPSJ1aV90cGlja2VyX3RpbWV6b25lX2xhYmVsIicgKyAoKG8uc2hvd1RpbWV6b25lKSA/ICcnIDogbm9EaXNwbGF5KSArICc+JyArIG8udGltZXpvbmVUZXh0ICsgJzwvZHQ+JzsKCQkJCWh0bWwgKz0gJzxkZCBjbGFzcz0idWlfdHBpY2tlcl90aW1lem9uZSIgJyArICgoby5zaG93VGltZXpvbmUpID8gJycgOiBub0Rpc3BsYXkpICsgJz48L2RkPic7CgoJCQkJLy8gQ3JlYXRlIHRoZSBlbGVtZW50cyBmcm9tIHN0cmluZwoJCQkJaHRtbCArPSAnPC9kbD48L2Rpdj4nOwoJCQkJdmFyICR0cCA9ICQoaHRtbCk7CgoJCQkJLy8gaWYgd2Ugb25seSB3YW50IHRpbWUgcGlja2VyLi4uCgkJCQlpZiAoby50aW1lT25seSA9PT0gdHJ1ZSkgewoJCQkJCSR0cC5wcmVwZW5kKCc8ZGl2IGNsYXNzPSJ1aS13aWRnZXQtaGVhZGVyIHVpLWhlbHBlci1jbGVhcmZpeCB1aS1jb3JuZXItYWxsIj4nICsgJzxkaXYgY2xhc3M9InVpLWRhdGVwaWNrZXItdGl0bGUiPicgKyBvLnRpbWVPbmx5VGl0bGUgKyAnPC9kaXY+JyArICc8L2Rpdj4nKTsKCQkJCQkkZHAuZmluZCgnLnVpLWRhdGVwaWNrZXItaGVhZGVyLCAudWktZGF0ZXBpY2tlci1jYWxlbmRhcicpLmhpZGUoKTsKCQkJCX0KCQkJCQoJCQkJLy8gYWRkIHNsaWRlcnMsIGFkanVzdCBncmlkcywgYWRkIGV2ZW50cwoJCQkJZm9yKHZhciBpPTAsbD10cF9pbnN0LnVuaXRzLmxlbmd0aDsgaTxsOyBpKyspewoJCQkJCWxpdGVtID0gdHBfaW5zdC51bml0c1tpXTsKCQkJCQl1aXRlbSA9IGxpdGVtLnN1YnN0cigwLDEpLnRvVXBwZXJDYXNlKCkgKyBsaXRlbS5zdWJzdHIoMSk7CgkJCQkJCgkJCQkJLy8gYWRkIHRoZSBzbGlkZXIKCQkJCQl0cF9pbnN0W2xpdGVtKydfc2xpZGVyJ10gPSB0cF9pbnN0LmNvbnRyb2wuY3JlYXRlKHRwX2luc3QsICR0cC5maW5kKCcudWlfdHBpY2tlcl8nK2xpdGVtKydfc2xpZGVyJyksIGxpdGVtLCB0cF9pbnN0W2xpdGVtXSwgb1tsaXRlbSsnTWluJ10sIG1heFtsaXRlbV0sIG9bJ3N0ZXAnK3VpdGVtXSk7CgoJCQkJCS8vIGFkanVzdCB0aGUgZ3JpZCBhbmQgYWRkIGNsaWNrIGV2ZW50CgkJCQkJaWYgKG9bJ3Nob3cnK3VpdGVtXSAmJiBvW2xpdGVtKydHcmlkJ10gPiAwKSB7CgkJCQkJCXNpemUgPSAxMDAgKiBncmlkU2l6ZVtsaXRlbV0gKiBvW2xpdGVtKydHcmlkJ10gLyAobWF4W2xpdGVtXSAtIG9bbGl0ZW0rJ01pbiddKTsKCQkJCQkJJHRwLmZpbmQoJy51aV90cGlja2VyXycrbGl0ZW0rJyB0YWJsZScpLmNzcyh7CgkJCQkJCQl3aWR0aDogc2l6ZSArICIlIiwKCQkJCQkJCW1hcmdpbkxlZnQ6IG8uaXNSVEw/ICcwJyA6ICgoc2l6ZSAvICgtMiAqIGdyaWRTaXplW2xpdGVtXSkpICsgIiUiKSwKCQkJCQkJCW1hcmdpblJpZ2h0OiBvLmlzUlRMPyAoKHNpemUgLyAoLTIgKiBncmlkU2l6ZVtsaXRlbV0pKSArICIlIikgOiAnMCcsCgkJCQkJCQlib3JkZXJDb2xsYXBzZTogJ2NvbGxhcHNlJwoJCQkJCQl9KS5maW5kKCJ0ZCIpLmNsaWNrKGZ1bmN0aW9uKGUpewoJCQkJCQkJCXZhciAkdCA9ICQodGhpcyksCgkJCQkJCQkJCWggPSAkdC5odG1sKCksCgkJCQkJCQkJCW4gPSBwYXJzZUludChoLnJlcGxhY2UoL1teMC05XS9nKSwxMCksCgkJCQkJCQkJCWFwID0gaC5yZXBsYWNlKC9bXmFwbV0vaWcpLAoJCQkJCQkJCQlmID0gJHQuZGF0YSgnZm9yJyk7IC8vIGxvc2VzIHNjb3BlLCBzbyB3ZSB1c2UgZGF0YS1mb3IKCgkJCQkJCQkJaWYoZiA9PSAnaG91cicpewoJCQkJCQkJCQlpZihhcC5pbmRleE9mKCdwJykgIT09IC0xICYmIG4gPCAxMil7CgkJCQkJCQkJCQluICs9IDEyOwoJCQkJCQkJCQl9CgkJCQkJCQkJCWVsc2V7CgkJCQkJCQkJCQlpZihhcC5pbmRleE9mKCdhJykgIT09IC0xICYmIG4gPT09IDEyKXsKCQkJCQkJCQkJCQluID0gMDsKCQkJCQkJCQkJCX0KCQkJCQkJCQkJfQoJCQkJCQkJCX0KCQkJCQkJCQkKCQkJCQkJCQl0cF9pbnN0LmNvbnRyb2wudmFsdWUodHBfaW5zdCwgdHBfaW5zdFtmKydfc2xpZGVyJ10sIGxpdGVtLCBuKTsKCgkJCQkJCQkJdHBfaW5zdC5fb25UaW1lQ2hhbmdlKCk7CgkJCQkJCQkJdHBfaW5zdC5fb25TZWxlY3RIYW5kbGVyKCk7CgkJCQkJCQl9KQoJCQkJCQkuY3NzKHsKCQkJCQkJCQljdXJzb3I6ICdwb2ludGVyJywKCQkJCQkJCQl3aWR0aDogKDEwMCAvIGdyaWRTaXplW2xpdGVtXSkgKyAnJScsCgkJCQkJCQkJdGV4dEFsaWduOiAnY2VudGVyJywKCQkJCQkJCQlvdmVyZmxvdzogJ2hpZGRlbicKCQkJCQkJCX0pOwoJCQkJCX0gLy8gZW5kIGlmIGdyaWQgPiAwCgkJCQl9IC8vIGVuZCBmb3IgbG9vcAoKCQkJCS8vIEFkZCB0aW1lem9uZSBvcHRpb25zCgkJCQl0aGlzLnRpbWV6b25lX3NlbGVjdCA9ICR0cC5maW5kKCcudWlfdHBpY2tlcl90aW1lem9uZScpLmFwcGVuZCgnPHNlbGVjdD48L3NlbGVjdD4nKS5maW5kKCJzZWxlY3QiKTsKCQkJCSQuZm4uYXBwZW5kLmFwcGx5KHRoaXMudGltZXpvbmVfc2VsZWN0LAoJCQkJJC5tYXAoby50aW1lem9uZUxpc3QsIGZ1bmN0aW9uKHZhbCwgaWR4KSB7CgkJCQkJcmV0dXJuICQoIjxvcHRpb24gLz4iKS52YWwodHlwZW9mIHZhbCA9PSAib2JqZWN0IiA/IHZhbC52YWx1ZSA6IHZhbCkudGV4dCh0eXBlb2YgdmFsID09ICJvYmplY3QiID8gdmFsLmxhYmVsIDogdmFsKTsKCQkJCX0pKTsKCQkJCWlmICh0eXBlb2YodGhpcy50aW1lem9uZSkgIT0gInVuZGVmaW5lZCIgJiYgdGhpcy50aW1lem9uZSAhPT0gbnVsbCAmJiB0aGlzLnRpbWV6b25lICE9PSAiIikgewoJCQkJCXZhciBsb2NhbF9kYXRlID0gbmV3IERhdGUodGhpcy5pbnN0LnNlbGVjdGVkWWVhciwgdGhpcy5pbnN0LnNlbGVjdGVkTW9udGgsIHRoaXMuaW5zdC5zZWxlY3RlZERheSwgMTIpOwoJCQkJCXZhciBsb2NhbF90aW1lem9uZSA9ICQudGltZXBpY2tlci50aW1lWm9uZU9mZnNldFN0cmluZyhsb2NhbF9kYXRlKTsKCQkJCQlpZiAobG9jYWxfdGltZXpvbmUgPT0gdGhpcy50aW1lem9uZSkgewoJCQkJCQlzZWxlY3RMb2NhbFRpbWVab25lKHRwX2luc3QpOwoJCQkJCX0gZWxzZSB7CgkJCQkJCXRoaXMudGltZXpvbmVfc2VsZWN0LnZhbCh0aGlzLnRpbWV6b25lKTsKCQkJCQl9CgkJCQl9IGVsc2UgewoJCQkJCWlmICh0eXBlb2YodGhpcy5ob3VyKSAhPSAidW5kZWZpbmVkIiAmJiB0aGlzLmhvdXIgIT09IG51bGwgJiYgdGhpcy5ob3VyICE9PSAiIikgewoJCQkJCQl0aGlzLnRpbWV6b25lX3NlbGVjdC52YWwoby5kZWZhdWx0VGltZXpvbmUpOwoJCQkJCX0gZWxzZSB7CgkJCQkJCXNlbGVjdExvY2FsVGltZVpvbmUodHBfaW5zdCk7CgkJCQkJfQoJCQkJfQoJCQkJdGhpcy50aW1lem9uZV9zZWxlY3QuY2hhbmdlKGZ1bmN0aW9uKCkgewoJCQkJCXRwX2luc3QuX2RlZmF1bHRzLnVzZUxvY2FsVGltZXpvbmUgPSBmYWxzZTsKCQkJCQl0cF9pbnN0Ll9vblRpbWVDaGFuZ2UoKTsKCQkJCX0pOwoJCQkJLy8gRW5kIHRpbWV6b25lIG9wdGlvbnMKCQkJCQoJCQkJLy8gaW5qZWN0IHRpbWVwaWNrZXIgaW50byBkYXRlcGlja2VyCgkJCQl2YXIgJGJ1dHRvblBhbmVsID0gJGRwLmZpbmQoJy51aS1kYXRlcGlja2VyLWJ1dHRvbnBhbmUnKTsKCQkJCWlmICgkYnV0dG9uUGFuZWwubGVuZ3RoKSB7CgkJCQkJJGJ1dHRvblBhbmVsLmJlZm9yZSgkdHApOwoJCQkJfSBlbHNlIHsKCQkJCQkkZHAuYXBwZW5kKCR0cCk7CgkJCQl9CgoJCQkJdGhpcy4kdGltZU9iaiA9ICR0cC5maW5kKCcudWlfdHBpY2tlcl90aW1lJyk7CgoJCQkJaWYgKHRoaXMuaW5zdCAhPT0gbnVsbCkgewoJCQkJCXZhciB0aW1lRGVmaW5lZCA9IHRoaXMudGltZURlZmluZWQ7CgkJCQkJdGhpcy5fb25UaW1lQ2hhbmdlKCk7CgkJCQkJdGhpcy50aW1lRGVmaW5lZCA9IHRpbWVEZWZpbmVkOwoJCQkJfQoKCQkJCS8vIHNsaWRlQWNjZXNzIGludGVncmF0aW9uOiBodHRwOi8vdHJlbnRyaWNoYXJkc29uLmNvbS8yMDExLzExLzExL2pxdWVyeS11aS1zbGlkZXJzLWFuZC10b3VjaC1hY2Nlc3NpYmlsaXR5LwoJCQkJaWYgKHRoaXMuX2RlZmF1bHRzLmFkZFNsaWRlckFjY2VzcykgewoJCQkJCXZhciBzbGlkZXJBY2Nlc3NBcmdzID0gdGhpcy5fZGVmYXVsdHMuc2xpZGVyQWNjZXNzQXJncywKCQkJCQkJcnRsID0gdGhpcy5fZGVmYXVsdHMuaXNSVEw7CgkJCQkJc2xpZGVyQWNjZXNzQXJncy5pc1JUTCA9IHJ0bDsKCQkJCQkJCgkJCQkJc2V0VGltZW91dChmdW5jdGlvbigpIHsgLy8gZml4IGZvciBpbmxpbmUgbW9kZQoJCQkJCQlpZiAoJHRwLmZpbmQoJy51aS1zbGlkZXItYWNjZXNzJykubGVuZ3RoID09PSAwKSB7CgkJCQkJCQkkdHAuZmluZCgnLnVpLXNsaWRlcjp2aXNpYmxlJykuc2xpZGVyQWNjZXNzKHNsaWRlckFjY2Vzc0FyZ3MpOwoKCQkJCQkJCS8vIGZpeCBhbnkgZ3JpZHMgc2luY2Ugc2xpZGVycyBhcmUgc2hvcnRlcgoJCQkJCQkJdmFyIHNsaWRlckFjY2Vzc1dpZHRoID0gJHRwLmZpbmQoJy51aS1zbGlkZXItYWNjZXNzOmVxKDApJykub3V0ZXJXaWR0aCh0cnVlKTsKCQkJCQkJCWlmIChzbGlkZXJBY2Nlc3NXaWR0aCkgewoJCQkJCQkJCSR0cC5maW5kKCd0YWJsZTp2aXNpYmxlJykuZWFjaChmdW5jdGlvbigpIHsKCQkJCQkJCQkJdmFyICRnID0gJCh0aGlzKSwKCQkJCQkJCQkJCW9sZFdpZHRoID0gJGcub3V0ZXJXaWR0aCgpLAoJCQkJCQkJCQkJb2xkTWFyZ2luTGVmdCA9ICRnLmNzcyhydGw/ICdtYXJnaW5SaWdodCc6J21hcmdpbkxlZnQnKS50b1N0cmluZygpLnJlcGxhY2UoJyUnLCAnJyksCgkJCQkJCQkJCQluZXdXaWR0aCA9IG9sZFdpZHRoIC0gc2xpZGVyQWNjZXNzV2lkdGgsCgkJCQkJCQkJCQluZXdNYXJnaW5MZWZ0ID0gKChvbGRNYXJnaW5MZWZ0ICogbmV3V2lkdGgpIC8gb2xkV2lkdGgpICsgJyUnLAoJCQkJCQkJCQkJY3NzID0geyB3aWR0aDogbmV3V2lkdGgsIG1hcmdpblJpZ2h0OiAwLCBtYXJnaW5MZWZ0OiAwIH07CgkJCQkJCQkJCWNzc1tydGw/ICdtYXJnaW5SaWdodCc6J21hcmdpbkxlZnQnXSA9IG5ld01hcmdpbkxlZnQ7CgkJCQkJCQkJCSRnLmNzcyhjc3MpOwoJCQkJCQkJCX0pOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfSwgMTApOwoJCQkJfQoJCQkJLy8gZW5kIHNsaWRlQWNjZXNzIGludGVncmF0aW9uCgoJCQl9CgkJfSwKCgkJLyoKCQkqIFRoaXMgZnVuY3Rpb24gdHJpZXMgdG8gbGltaXQgdGhlIGFiaWxpdHkgdG8gZ28gb3V0c2lkZSB0aGUKCQkqIG1pbi9tYXggZGF0ZSByYW5nZQoJCSovCgkJX2xpbWl0TWluTWF4RGF0ZVRpbWU6IGZ1bmN0aW9uKGRwX2luc3QsIGFkanVzdFNsaWRlcnMpIHsKCQkJdmFyIG8gPSB0aGlzLl9kZWZhdWx0cywKCQkJCWRwX2RhdGUgPSBuZXcgRGF0ZShkcF9pbnN0LnNlbGVjdGVkWWVhciwgZHBfaW5zdC5zZWxlY3RlZE1vbnRoLCBkcF9pbnN0LnNlbGVjdGVkRGF5KTsKCgkJCWlmICghdGhpcy5fZGVmYXVsdHMuc2hvd1RpbWVwaWNrZXIpIHsKCQkJCXJldHVybjsKCQkJfSAvLyBObyB0aW1lIHNvIG5vdGhpbmcgdG8gY2hlY2sgaGVyZQoKCQkJaWYgKCQuZGF0ZXBpY2tlci5fZ2V0KGRwX2luc3QsICdtaW5EYXRlVGltZScpICE9PSBudWxsICYmICQuZGF0ZXBpY2tlci5fZ2V0KGRwX2luc3QsICdtaW5EYXRlVGltZScpICE9PSB1bmRlZmluZWQgJiYgZHBfZGF0ZSkgewoJCQkJdmFyIG1pbkRhdGVUaW1lID0gJC5kYXRlcGlja2VyLl9nZXQoZHBfaW5zdCwgJ21pbkRhdGVUaW1lJyksCgkJCQkJbWluRGF0ZVRpbWVEYXRlID0gbmV3IERhdGUobWluRGF0ZVRpbWUuZ2V0RnVsbFllYXIoKSwgbWluRGF0ZVRpbWUuZ2V0TW9udGgoKSwgbWluRGF0ZVRpbWUuZ2V0RGF0ZSgpLCAwLCAwLCAwLCAwKTsKCgkJCQlpZiAodGhpcy5ob3VyTWluT3JpZ2luYWwgPT09IG51bGwgfHwgdGhpcy5taW51dGVNaW5PcmlnaW5hbCA9PT0gbnVsbCB8fCB0aGlzLnNlY29uZE1pbk9yaWdpbmFsID09PSBudWxsIHx8IHRoaXMubWlsbGlzZWNNaW5PcmlnaW5hbCA9PT0gbnVsbCkgewoJCQkJCXRoaXMuaG91ck1pbk9yaWdpbmFsID0gby5ob3VyTWluOwoJCQkJCXRoaXMubWludXRlTWluT3JpZ2luYWwgPSBvLm1pbnV0ZU1pbjsKCQkJCQl0aGlzLnNlY29uZE1pbk9yaWdpbmFsID0gby5zZWNvbmRNaW47CgkJCQkJdGhpcy5taWxsaXNlY01pbk9yaWdpbmFsID0gby5taWxsaXNlY01pbjsKCQkJCX0KCgkJCQlpZiAoZHBfaW5zdC5zZXR0aW5ncy50aW1lT25seSB8fCBtaW5EYXRlVGltZURhdGUuZ2V0VGltZSgpID09IGRwX2RhdGUuZ2V0VGltZSgpKSB7CgkJCQkJdGhpcy5fZGVmYXVsdHMuaG91ck1pbiA9IG1pbkRhdGVUaW1lLmdldEhvdXJzKCk7CgkJCQkJaWYgKHRoaXMuaG91ciA8PSB0aGlzLl9kZWZhdWx0cy5ob3VyTWluKSB7CgkJCQkJCXRoaXMuaG91ciA9IHRoaXMuX2RlZmF1bHRzLmhvdXJNaW47CgkJCQkJCXRoaXMuX2RlZmF1bHRzLm1pbnV0ZU1pbiA9IG1pbkRhdGVUaW1lLmdldE1pbnV0ZXMoKTsKCQkJCQkJaWYgKHRoaXMubWludXRlIDw9IHRoaXMuX2RlZmF1bHRzLm1pbnV0ZU1pbikgewoJCQkJCQkJdGhpcy5taW51dGUgPSB0aGlzLl9kZWZhdWx0cy5taW51dGVNaW47CgkJCQkJCQl0aGlzLl9kZWZhdWx0cy5zZWNvbmRNaW4gPSBtaW5EYXRlVGltZS5nZXRTZWNvbmRzKCk7CgkJCQkJCQlpZiAodGhpcy5zZWNvbmQgPD0gdGhpcy5fZGVmYXVsdHMuc2Vjb25kTWluKSB7CgkJCQkJCQkJdGhpcy5zZWNvbmQgPSB0aGlzLl9kZWZhdWx0cy5zZWNvbmRNaW47CgkJCQkJCQkJdGhpcy5fZGVmYXVsdHMubWlsbGlzZWNNaW4gPSBtaW5EYXRlVGltZS5nZXRNaWxsaXNlY29uZHMoKTsKCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJaWYgKHRoaXMubWlsbGlzZWMgPCB0aGlzLl9kZWZhdWx0cy5taWxsaXNlY01pbikgewoJCQkJCQkJCQl0aGlzLm1pbGxpc2VjID0gdGhpcy5fZGVmYXVsdHMubWlsbGlzZWNNaW47CgkJCQkJCQkJfQoJCQkJCQkJCXRoaXMuX2RlZmF1bHRzLm1pbGxpc2VjTWluID0gdGhpcy5taWxsaXNlY01pbk9yaWdpbmFsOwoJCQkJCQkJfQoJCQkJCQl9IGVsc2UgewoJCQkJCQkJdGhpcy5fZGVmYXVsdHMuc2Vjb25kTWluID0gdGhpcy5zZWNvbmRNaW5PcmlnaW5hbDsKCQkJCQkJCXRoaXMuX2RlZmF1bHRzLm1pbGxpc2VjTWluID0gdGhpcy5taWxsaXNlY01pbk9yaWdpbmFsOwoJCQkJCQl9CgkJCQkJfSBlbHNlIHsKCQkJCQkJdGhpcy5fZGVmYXVsdHMubWludXRlTWluID0gdGhpcy5taW51dGVNaW5PcmlnaW5hbDsKCQkJCQkJdGhpcy5fZGVmYXVsdHMuc2Vjb25kTWluID0gdGhpcy5zZWNvbmRNaW5PcmlnaW5hbDsKCQkJCQkJdGhpcy5fZGVmYXVsdHMubWlsbGlzZWNNaW4gPSB0aGlzLm1pbGxpc2VjTWluT3JpZ2luYWw7CgkJCQkJfQoJCQkJfSBlbHNlIHsKCQkJCQl0aGlzLl9kZWZhdWx0cy5ob3VyTWluID0gdGhpcy5ob3VyTWluT3JpZ2luYWw7CgkJCQkJdGhpcy5fZGVmYXVsdHMubWludXRlTWluID0gdGhpcy5taW51dGVNaW5PcmlnaW5hbDsKCQkJCQl0aGlzLl9kZWZhdWx0cy5zZWNvbmRNaW4gPSB0aGlzLnNlY29uZE1pbk9yaWdpbmFsOwoJCQkJCXRoaXMuX2RlZmF1bHRzLm1pbGxpc2VjTWluID0gdGhpcy5taWxsaXNlY01pbk9yaWdpbmFsOwoJCQkJfQoJCQl9CgoJCQlpZiAoJC5kYXRlcGlja2VyLl9nZXQoZHBfaW5zdCwgJ21heERhdGVUaW1lJykgIT09IG51bGwgJiYgJC5kYXRlcGlja2VyLl9nZXQoZHBfaW5zdCwgJ21heERhdGVUaW1lJykgIT09IHVuZGVmaW5lZCAmJiBkcF9kYXRlKSB7CgkJCQl2YXIgbWF4RGF0ZVRpbWUgPSAkLmRhdGVwaWNrZXIuX2dldChkcF9pbnN0LCAnbWF4RGF0ZVRpbWUnKSwKCQkJCQltYXhEYXRlVGltZURhdGUgPSBuZXcgRGF0ZShtYXhEYXRlVGltZS5nZXRGdWxsWWVhcigpLCBtYXhEYXRlVGltZS5nZXRNb250aCgpLCBtYXhEYXRlVGltZS5nZXREYXRlKCksIDAsIDAsIDAsIDApOwoKCQkJCWlmICh0aGlzLmhvdXJNYXhPcmlnaW5hbCA9PT0gbnVsbCB8fCB0aGlzLm1pbnV0ZU1heE9yaWdpbmFsID09PSBudWxsIHx8IHRoaXMuc2Vjb25kTWF4T3JpZ2luYWwgPT09IG51bGwpIHsKCQkJCQl0aGlzLmhvdXJNYXhPcmlnaW5hbCA9IG8uaG91ck1heDsKCQkJCQl0aGlzLm1pbnV0ZU1heE9yaWdpbmFsID0gby5taW51dGVNYXg7CgkJCQkJdGhpcy5zZWNvbmRNYXhPcmlnaW5hbCA9IG8uc2Vjb25kTWF4OwoJCQkJCXRoaXMubWlsbGlzZWNNYXhPcmlnaW5hbCA9IG8ubWlsbGlzZWNNYXg7CgkJCQl9CgoJCQkJaWYgKGRwX2luc3Quc2V0dGluZ3MudGltZU9ubHkgfHwgbWF4RGF0ZVRpbWVEYXRlLmdldFRpbWUoKSA9PSBkcF9kYXRlLmdldFRpbWUoKSkgewoJCQkJCXRoaXMuX2RlZmF1bHRzLmhvdXJNYXggPSBtYXhEYXRlVGltZS5nZXRIb3VycygpOwoJCQkJCWlmICh0aGlzLmhvdXIgPj0gdGhpcy5fZGVmYXVsdHMuaG91ck1heCkgewoJCQkJCQl0aGlzLmhvdXIgPSB0aGlzLl9kZWZhdWx0cy5ob3VyTWF4OwoJCQkJCQl0aGlzLl9kZWZhdWx0cy5taW51dGVNYXggPSBtYXhEYXRlVGltZS5nZXRNaW51dGVzKCk7CgkJCQkJCWlmICh0aGlzLm1pbnV0ZSA+PSB0aGlzLl9kZWZhdWx0cy5taW51dGVNYXgpIHsKCQkJCQkJCXRoaXMubWludXRlID0gdGhpcy5fZGVmYXVsdHMubWludXRlTWF4OwoJCQkJCQkJdGhpcy5fZGVmYXVsdHMuc2Vjb25kTWF4ID0gbWF4RGF0ZVRpbWUuZ2V0U2Vjb25kcygpOwoJCQkJCQl9IGVsc2UgaWYgKHRoaXMuc2Vjb25kID49IHRoaXMuX2RlZmF1bHRzLnNlY29uZE1heCkgewoJCQkJCQkJdGhpcy5zZWNvbmQgPSB0aGlzLl9kZWZhdWx0cy5zZWNvbmRNYXg7CgkJCQkJCQl0aGlzLl9kZWZhdWx0cy5taWxsaXNlY01heCA9IG1heERhdGVUaW1lLmdldE1pbGxpc2Vjb25kcygpOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJaWYgKHRoaXMubWlsbGlzZWMgPiB0aGlzLl9kZWZhdWx0cy5taWxsaXNlY01heCkgewoJCQkJCQkJCXRoaXMubWlsbGlzZWMgPSB0aGlzLl9kZWZhdWx0cy5taWxsaXNlY01heDsKCQkJCQkJCX0KCQkJCQkJCXRoaXMuX2RlZmF1bHRzLm1pbGxpc2VjTWF4ID0gdGhpcy5taWxsaXNlY01heE9yaWdpbmFsOwoJCQkJCQl9CgkJCQkJfSBlbHNlIHsKCQkJCQkJdGhpcy5fZGVmYXVsdHMubWludXRlTWF4ID0gdGhpcy5taW51dGVNYXhPcmlnaW5hbDsKCQkJCQkJdGhpcy5fZGVmYXVsdHMuc2Vjb25kTWF4ID0gdGhpcy5zZWNvbmRNYXhPcmlnaW5hbDsKCQkJCQkJdGhpcy5fZGVmYXVsdHMubWlsbGlzZWNNYXggPSB0aGlzLm1pbGxpc2VjTWF4T3JpZ2luYWw7CgkJCQkJfQoJCQkJfSBlbHNlIHsKCQkJCQl0aGlzLl9kZWZhdWx0cy5ob3VyTWF4ID0gdGhpcy5ob3VyTWF4T3JpZ2luYWw7CgkJCQkJdGhpcy5fZGVmYXVsdHMubWludXRlTWF4ID0gdGhpcy5taW51dGVNYXhPcmlnaW5hbDsKCQkJCQl0aGlzLl9kZWZhdWx0cy5zZWNvbmRNYXggPSB0aGlzLnNlY29uZE1heE9yaWdpbmFsOwoJCQkJCXRoaXMuX2RlZmF1bHRzLm1pbGxpc2VjTWF4ID0gdGhpcy5taWxsaXNlY01heE9yaWdpbmFsOwoJCQkJfQoJCQl9CgoJCQlpZiAoYWRqdXN0U2xpZGVycyAhPT0gdW5kZWZpbmVkICYmIGFkanVzdFNsaWRlcnMgPT09IHRydWUpIHsKCQkJCXZhciBob3VyTWF4ID0gcGFyc2VJbnQoKHRoaXMuX2RlZmF1bHRzLmhvdXJNYXggLSAoKHRoaXMuX2RlZmF1bHRzLmhvdXJNYXggLSB0aGlzLl9kZWZhdWx0cy5ob3VyTWluKSAlIHRoaXMuX2RlZmF1bHRzLnN0ZXBIb3VyKSksIDEwKSwKCQkJCQltaW5NYXggPSBwYXJzZUludCgodGhpcy5fZGVmYXVsdHMubWludXRlTWF4IC0gKCh0aGlzLl9kZWZhdWx0cy5taW51dGVNYXggLSB0aGlzLl9kZWZhdWx0cy5taW51dGVNaW4pICUgdGhpcy5fZGVmYXVsdHMuc3RlcE1pbnV0ZSkpLCAxMCksCgkJCQkJc2VjTWF4ID0gcGFyc2VJbnQoKHRoaXMuX2RlZmF1bHRzLnNlY29uZE1heCAtICgodGhpcy5fZGVmYXVsdHMuc2Vjb25kTWF4IC0gdGhpcy5fZGVmYXVsdHMuc2Vjb25kTWluKSAlIHRoaXMuX2RlZmF1bHRzLnN0ZXBTZWNvbmQpKSwgMTApLAoJCQkJCW1pbGxpc2VjTWF4ID0gcGFyc2VJbnQoKHRoaXMuX2RlZmF1bHRzLm1pbGxpc2VjTWF4IC0gKCh0aGlzLl9kZWZhdWx0cy5taWxsaXNlY01heCAtIHRoaXMuX2RlZmF1bHRzLm1pbGxpc2VjTWluKSAlIHRoaXMuX2RlZmF1bHRzLnN0ZXBNaWxsaXNlYykpLCAxMCk7CgoJCQkJaWYgKHRoaXMuaG91cl9zbGlkZXIpIHsKCQkJCQl0aGlzLmNvbnRyb2wub3B0aW9ucyh0aGlzLCB0aGlzLmhvdXJfc2xpZGVyLCAnaG91cicsIHsgbWluOiB0aGlzLl9kZWZhdWx0cy5ob3VyTWluLCBtYXg6IGhvdXJNYXggfSk7CgkJCQkJdGhpcy5jb250cm9sLnZhbHVlKHRoaXMsIHRoaXMuaG91cl9zbGlkZXIsICdob3VyJywgdGhpcy5ob3VyKTsKCQkJCX0KCQkJCWlmICh0aGlzLm1pbnV0ZV9zbGlkZXIpIHsKCQkJCQl0aGlzLmNvbnRyb2wub3B0aW9ucyh0aGlzLCB0aGlzLm1pbnV0ZV9zbGlkZXIsICdtaW51dGUnLCB7IG1pbjogdGhpcy5fZGVmYXVsdHMubWludXRlTWluLCBtYXg6IG1pbk1heCB9KTsKCQkJCQl0aGlzLmNvbnRyb2wudmFsdWUodGhpcywgdGhpcy5taW51dGVfc2xpZGVyLCAnbWludXRlJywgdGhpcy5taW51dGUpOwoJCQkJfQoJCQkJaWYgKHRoaXMuc2Vjb25kX3NsaWRlcikgewoJCQkJCXRoaXMuY29udHJvbC5vcHRpb25zKHRoaXMsIHRoaXMuc2Vjb25kX3NsaWRlciwgJ3NlY29uZCcsIHsgbWluOiB0aGlzLl9kZWZhdWx0cy5zZWNvbmRNaW4sIG1heDogc2VjTWF4IH0pOwoJCQkJCXRoaXMuY29udHJvbC52YWx1ZSh0aGlzLCB0aGlzLnNlY29uZF9zbGlkZXIsICdzZWNvbmQnLCB0aGlzLnNlY29uZCk7CgkJCQl9CgkJCQlpZiAodGhpcy5taWxsaXNlY19zbGlkZXIpIHsKCQkJCQl0aGlzLmNvbnRyb2wub3B0aW9ucyh0aGlzLCB0aGlzLm1pbGxpc2VjX3NsaWRlciwgJ21pbGxpc2VjJywgeyBtaW46IHRoaXMuX2RlZmF1bHRzLm1pbGxpc2VjTWluLCBtYXg6IG1pbGxpc2VjTWF4IH0pOwoJCQkJCXRoaXMuY29udHJvbC52YWx1ZSh0aGlzLCB0aGlzLm1pbGxpc2VjX3NsaWRlciwgJ21pbGxpc2VjJywgdGhpcy5taWxsaXNlYyk7CgkJCQl9CgkJCX0KCgkJfSwKCgkJLyoKCQkqIHdoZW4gYSBzbGlkZXIgbW92ZXMsIHNldCB0aGUgaW50ZXJuYWwgdGltZS4uLgoJCSogb24gdGltZSBjaGFuZ2UgaXMgYWxzbyBjYWxsZWQgd2hlbiB0aGUgdGltZSBpcyB1cGRhdGVkIGluIHRoZSB0ZXh0IGZpZWxkCgkJKi8KCQlfb25UaW1lQ2hhbmdlOiBmdW5jdGlvbigpIHsKCQkJdmFyIGhvdXIgPSAodGhpcy5ob3VyX3NsaWRlcikgPyB0aGlzLmNvbnRyb2wudmFsdWUodGhpcywgdGhpcy5ob3VyX3NsaWRlciwgJ2hvdXInKSA6IGZhbHNlLAoJCQkJbWludXRlID0gKHRoaXMubWludXRlX3NsaWRlcikgPyB0aGlzLmNvbnRyb2wudmFsdWUodGhpcywgdGhpcy5taW51dGVfc2xpZGVyLCAnbWludXRlJykgOiBmYWxzZSwKCQkJCXNlY29uZCA9ICh0aGlzLnNlY29uZF9zbGlkZXIpID8gdGhpcy5jb250cm9sLnZhbHVlKHRoaXMsIHRoaXMuc2Vjb25kX3NsaWRlciwgJ3NlY29uZCcpIDogZmFsc2UsCgkJCQltaWxsaXNlYyA9ICh0aGlzLm1pbGxpc2VjX3NsaWRlcikgPyB0aGlzLmNvbnRyb2wudmFsdWUodGhpcywgdGhpcy5taWxsaXNlY19zbGlkZXIsICdtaWxsaXNlYycpIDogZmFsc2UsCgkJCQl0aW1lem9uZSA9ICh0aGlzLnRpbWV6b25lX3NlbGVjdCkgPyB0aGlzLnRpbWV6b25lX3NlbGVjdC52YWwoKSA6IGZhbHNlLAoJCQkJbyA9IHRoaXMuX2RlZmF1bHRzLAoJCQkJcGlja2VyVGltZUZvcm1hdCA9IG8ucGlja2VyVGltZUZvcm1hdCB8fCBvLnRpbWVGb3JtYXQsCgkJCQlwaWNrZXJUaW1lU3VmZml4ID0gby5waWNrZXJUaW1lU3VmZml4IHx8IG8udGltZVN1ZmZpeDsKCgkJCWlmICh0eXBlb2YoaG91cikgPT0gJ29iamVjdCcpIHsKCQkJCWhvdXIgPSBmYWxzZTsKCQkJfQoJCQlpZiAodHlwZW9mKG1pbnV0ZSkgPT0gJ29iamVjdCcpIHsKCQkJCW1pbnV0ZSA9IGZhbHNlOwoJCQl9CgkJCWlmICh0eXBlb2Yoc2Vjb25kKSA9PSAnb2JqZWN0JykgewoJCQkJc2Vjb25kID0gZmFsc2U7CgkJCX0KCQkJaWYgKHR5cGVvZihtaWxsaXNlYykgPT0gJ29iamVjdCcpIHsKCQkJCW1pbGxpc2VjID0gZmFsc2U7CgkJCX0KCQkJaWYgKHR5cGVvZih0aW1lem9uZSkgPT0gJ29iamVjdCcpIHsKCQkJCXRpbWV6b25lID0gZmFsc2U7CgkJCX0KCgkJCWlmIChob3VyICE9PSBmYWxzZSkgewoJCQkJaG91ciA9IHBhcnNlSW50KGhvdXIsIDEwKTsKCQkJfQoJCQlpZiAobWludXRlICE9PSBmYWxzZSkgewoJCQkJbWludXRlID0gcGFyc2VJbnQobWludXRlLCAxMCk7CgkJCX0KCQkJaWYgKHNlY29uZCAhPT0gZmFsc2UpIHsKCQkJCXNlY29uZCA9IHBhcnNlSW50KHNlY29uZCwgMTApOwoJCQl9CgkJCWlmIChtaWxsaXNlYyAhPT0gZmFsc2UpIHsKCQkJCW1pbGxpc2VjID0gcGFyc2VJbnQobWlsbGlzZWMsIDEwKTsKCQkJfQoKCQkJdmFyIGFtcG0gPSBvW2hvdXIgPCAxMiA/ICdhbU5hbWVzJyA6ICdwbU5hbWVzJ11bMF07CgoJCQkvLyBJZiB0aGUgdXBkYXRlIHdhcyBkb25lIGluIHRoZSBpbnB1dCBmaWVsZCwgdGhlIGlucHV0IGZpZWxkIHNob3VsZCBub3QgYmUgdXBkYXRlZC4KCQkJLy8gSWYgdGhlIHVwZGF0ZSB3YXMgZG9uZSB1c2luZyB0aGUgc2xpZGVycywgdXBkYXRlIHRoZSBpbnB1dCBmaWVsZC4KCQkJdmFyIGhhc0NoYW5nZWQgPSAoaG91ciAhPSB0aGlzLmhvdXIgfHwgbWludXRlICE9IHRoaXMubWludXRlIHx8IHNlY29uZCAhPSB0aGlzLnNlY29uZCB8fCBtaWxsaXNlYyAhPSB0aGlzLm1pbGxpc2VjIAoJCQkJCQkJCXx8ICh0aGlzLmFtcG0ubGVuZ3RoID4gMCAmJiAoaG91ciA8IDEyKSAhPSAoJC5pbkFycmF5KHRoaXMuYW1wbS50b1VwcGVyQ2FzZSgpLCB0aGlzLmFtTmFtZXMpICE9PSAtMSkpIAoJCQkJCQkJCXx8ICgodGhpcy50aW1lem9uZSA9PT0gbnVsbCAmJiB0aW1lem9uZSAhPSB0aGlzLmRlZmF1bHRUaW1lem9uZSkgfHwgKHRoaXMudGltZXpvbmUgIT09IG51bGwgJiYgdGltZXpvbmUgIT0gdGhpcy50aW1lem9uZSkpKTsKCgkJCWlmIChoYXNDaGFuZ2VkKSB7CgoJCQkJaWYgKGhvdXIgIT09IGZhbHNlKSB7CgkJCQkJdGhpcy5ob3VyID0gaG91cjsKCQkJCX0KCQkJCWlmIChtaW51dGUgIT09IGZhbHNlKSB7CgkJCQkJdGhpcy5taW51dGUgPSBtaW51dGU7CgkJCQl9CgkJCQlpZiAoc2Vjb25kICE9PSBmYWxzZSkgewoJCQkJCXRoaXMuc2Vjb25kID0gc2Vjb25kOwoJCQkJfQoJCQkJaWYgKG1pbGxpc2VjICE9PSBmYWxzZSkgewoJCQkJCXRoaXMubWlsbGlzZWMgPSBtaWxsaXNlYzsKCQkJCX0KCQkJCWlmICh0aW1lem9uZSAhPT0gZmFsc2UpIHsKCQkJCQl0aGlzLnRpbWV6b25lID0gdGltZXpvbmU7CgkJCQl9CgoJCQkJaWYgKCF0aGlzLmluc3QpIHsKCQkJCQl0aGlzLmluc3QgPSAkLmRhdGVwaWNrZXIuX2dldEluc3QodGhpcy4kaW5wdXRbMF0pOwoJCQkJfQoKCQkJCXRoaXMuX2xpbWl0TWluTWF4RGF0ZVRpbWUodGhpcy5pbnN0LCB0cnVlKTsKCQkJfQoJCQlpZiAodXNlQW1wbShvLnRpbWVGb3JtYXQpKSB7CgkJCQl0aGlzLmFtcG0gPSBhbXBtOwoJCQl9CgoJCQkvLyBVcGRhdGVzIHRoZSB0aW1lIHdpdGhpbiB0aGUgdGltZXBpY2tlcgoJCQl0aGlzLmZvcm1hdHRlZFRpbWUgPSAkLmRhdGVwaWNrZXIuZm9ybWF0VGltZShvLnRpbWVGb3JtYXQsIHRoaXMsIG8pOwoJCQlpZiAodGhpcy4kdGltZU9iaikgewoJCQkJaWYocGlja2VyVGltZUZvcm1hdCA9PT0gby50aW1lRm9ybWF0KXsKCQkJCQl0aGlzLiR0aW1lT2JqLnRleHQodGhpcy5mb3JtYXR0ZWRUaW1lICsgcGlja2VyVGltZVN1ZmZpeCk7CgkJCQl9CgkJCQllbHNlewoJCQkJCXRoaXMuJHRpbWVPYmoudGV4dCgkLmRhdGVwaWNrZXIuZm9ybWF0VGltZShwaWNrZXJUaW1lRm9ybWF0LCB0aGlzLCBvKSArIHBpY2tlclRpbWVTdWZmaXgpOwoJCQkJfQoJCQl9CgoJCQl0aGlzLnRpbWVEZWZpbmVkID0gdHJ1ZTsKCQkJaWYgKGhhc0NoYW5nZWQpIHsKCQkJCXRoaXMuX3VwZGF0ZURhdGVUaW1lKCk7CgkJCX0KCQl9LAoKCQkvKgoJCSogY2FsbCBjdXN0b20gb25TZWxlY3QuCgkJKiBiaW5kIHRvIHNsaWRlcnMgc2xpZGVzdG9wLCBhbmQgZ3JpZCBjbGljay4KCQkqLwoJCV9vblNlbGVjdEhhbmRsZXI6IGZ1bmN0aW9uKCkgewoJCQl2YXIgb25TZWxlY3QgPSB0aGlzLl9kZWZhdWx0cy5vblNlbGVjdCB8fCB0aGlzLmluc3Quc2V0dGluZ3Mub25TZWxlY3Q7CgkJCXZhciBpbnB1dEVsID0gdGhpcy4kaW5wdXQgPyB0aGlzLiRpbnB1dFswXSA6IG51bGw7CgkJCWlmIChvblNlbGVjdCAmJiBpbnB1dEVsKSB7CgkJCQlvblNlbGVjdC5hcHBseShpbnB1dEVsLCBbdGhpcy5mb3JtYXR0ZWREYXRlVGltZSwgdGhpc10pOwoJCQl9CgkJfSwKCgkJLyoKCQkqIHVwZGF0ZSBvdXIgaW5wdXQgd2l0aCB0aGUgbmV3IGRhdGUgdGltZS4uCgkJKi8KCQlfdXBkYXRlRGF0ZVRpbWU6IGZ1bmN0aW9uKGRwX2luc3QpIHsKCQkJZHBfaW5zdCA9IHRoaXMuaW5zdCB8fCBkcF9pbnN0OwoJCQl2YXIgZHQgPSAkLmRhdGVwaWNrZXIuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKGRwX2luc3Quc2VsZWN0ZWRZZWFyLCBkcF9pbnN0LnNlbGVjdGVkTW9udGgsIGRwX2luc3Quc2VsZWN0ZWREYXkpKSwKCQkJCWRhdGVGbXQgPSAkLmRhdGVwaWNrZXIuX2dldChkcF9pbnN0LCAnZGF0ZUZvcm1hdCcpLAoJCQkJZm9ybWF0Q2ZnID0gJC5kYXRlcGlja2VyLl9nZXRGb3JtYXRDb25maWcoZHBfaW5zdCksCgkJCQl0aW1lQXZhaWxhYmxlID0gZHQgIT09IG51bGwgJiYgdGhpcy50aW1lRGVmaW5lZDsKCQkJdGhpcy5mb3JtYXR0ZWREYXRlID0gJC5kYXRlcGlja2VyLmZvcm1hdERhdGUoZGF0ZUZtdCwgKGR0ID09PSBudWxsID8gbmV3IERhdGUoKSA6IGR0KSwgZm9ybWF0Q2ZnKTsKCQkJdmFyIGZvcm1hdHRlZERhdGVUaW1lID0gdGhpcy5mb3JtYXR0ZWREYXRlOwoKCQkJLyoKCQkJKiByZW1vdmUgZm9sbG93aW5nIGxpbmVzIHRvIGZvcmNlIGV2ZXJ5IGNoYW5nZXMgaW4gZGF0ZSBwaWNrZXIgdG8gY2hhbmdlIHRoZSBpbnB1dCB2YWx1ZQoJCQkqIEJ1ZyBkZXNjcmlwdGlvbnM6IHdoZW4gYW4gaW5wdXQgZmllbGQgaGFzIGEgZGVmYXVsdCB2YWx1ZSwgYW5kIGNsaWNrIG9uIHRoZSBmaWVsZCB0byBwb3AgdXAgdGhlIGRhdGUgcGlja2VyLiAKCQkJKiBJZiB0aGUgdXNlciBtYW51YWxseSBlbXB0eSB0aGUgdmFsdWUgaW4gdGhlIGlucHV0IGZpZWxkLCB0aGUgZGF0ZSBwaWNrZXIgd2lsbCBuZXZlciBjaGFuZ2Ugc2VsZWN0ZWQgdmFsdWUuCgkJCSovCgkJCS8vaWYgKGRwX2luc3QubGFzdFZhbCAhPT0gdW5kZWZpbmVkICYmIChkcF9pbnN0Lmxhc3RWYWwubGVuZ3RoID4gMCAmJiB0aGlzLiRpbnB1dC52YWwoKS5sZW5ndGggPT09IDApKSB7CgkJCS8vCXJldHVybjsKCQkJLy99CgoJCQlpZiAodGhpcy5fZGVmYXVsdHMudGltZU9ubHkgPT09IHRydWUpIHsKCQkJCWZvcm1hdHRlZERhdGVUaW1lID0gdGhpcy5mb3JtYXR0ZWRUaW1lOwoJCQl9IGVsc2UgaWYgKHRoaXMuX2RlZmF1bHRzLnRpbWVPbmx5ICE9PSB0cnVlICYmICh0aGlzLl9kZWZhdWx0cy5hbHdheXNTZXRUaW1lIHx8IHRpbWVBdmFpbGFibGUpKSB7CgkJCQlmb3JtYXR0ZWREYXRlVGltZSArPSB0aGlzLl9kZWZhdWx0cy5zZXBhcmF0b3IgKyB0aGlzLmZvcm1hdHRlZFRpbWUgKyB0aGlzLl9kZWZhdWx0cy50aW1lU3VmZml4OwoJCQl9CgoJCQl0aGlzLmZvcm1hdHRlZERhdGVUaW1lID0gZm9ybWF0dGVkRGF0ZVRpbWU7CgoJCQlpZiAoIXRoaXMuX2RlZmF1bHRzLnNob3dUaW1lcGlja2VyKSB7CgkJCQl0aGlzLiRpbnB1dC52YWwodGhpcy5mb3JtYXR0ZWREYXRlKTsKCQkJfSBlbHNlIGlmICh0aGlzLiRhbHRJbnB1dCAmJiB0aGlzLl9kZWZhdWx0cy5hbHRGaWVsZFRpbWVPbmx5ID09PSB0cnVlKSB7CgkJCQl0aGlzLiRhbHRJbnB1dC52YWwodGhpcy5mb3JtYXR0ZWRUaW1lKTsKCQkJCXRoaXMuJGlucHV0LnZhbCh0aGlzLmZvcm1hdHRlZERhdGUpOwoJCQl9IGVsc2UgaWYgKHRoaXMuJGFsdElucHV0KSB7CgkJCQl0aGlzLiRpbnB1dC52YWwoZm9ybWF0dGVkRGF0ZVRpbWUpOwoJCQkJdmFyIGFsdEZvcm1hdHRlZERhdGVUaW1lID0gJycsCgkJCQkJYWx0U2VwYXJhdG9yID0gdGhpcy5fZGVmYXVsdHMuYWx0U2VwYXJhdG9yID8gdGhpcy5fZGVmYXVsdHMuYWx0U2VwYXJhdG9yIDogdGhpcy5fZGVmYXVsdHMuc2VwYXJhdG9yLAoJCQkJCWFsdFRpbWVTdWZmaXggPSB0aGlzLl9kZWZhdWx0cy5hbHRUaW1lU3VmZml4ID8gdGhpcy5fZGVmYXVsdHMuYWx0VGltZVN1ZmZpeCA6IHRoaXMuX2RlZmF1bHRzLnRpbWVTdWZmaXg7CgoJCQkJaWYgKHRoaXMuX2RlZmF1bHRzLmFsdEZvcm1hdCkgYWx0Rm9ybWF0dGVkRGF0ZVRpbWUgPSAkLmRhdGVwaWNrZXIuZm9ybWF0RGF0ZSh0aGlzLl9kZWZhdWx0cy5hbHRGb3JtYXQsIChkdCA9PT0gbnVsbCA/IG5ldyBEYXRlKCkgOiBkdCksIGZvcm1hdENmZyk7CgkJCQllbHNlIGFsdEZvcm1hdHRlZERhdGVUaW1lID0gdGhpcy5mb3JtYXR0ZWREYXRlOwoJCQkJaWYgKGFsdEZvcm1hdHRlZERhdGVUaW1lKSBhbHRGb3JtYXR0ZWREYXRlVGltZSArPSBhbHRTZXBhcmF0b3I7CgkJCQlpZiAodGhpcy5fZGVmYXVsdHMuYWx0VGltZUZvcm1hdCkgYWx0Rm9ybWF0dGVkRGF0ZVRpbWUgKz0gJC5kYXRlcGlja2VyLmZvcm1hdFRpbWUodGhpcy5fZGVmYXVsdHMuYWx0VGltZUZvcm1hdCwgdGhpcywgdGhpcy5fZGVmYXVsdHMpICsgYWx0VGltZVN1ZmZpeDsKCQkJCWVsc2UgYWx0Rm9ybWF0dGVkRGF0ZVRpbWUgKz0gdGhpcy5mb3JtYXR0ZWRUaW1lICsgYWx0VGltZVN1ZmZpeDsKCQkJCXRoaXMuJGFsdElucHV0LnZhbChhbHRGb3JtYXR0ZWREYXRlVGltZSk7CgkJCX0gZWxzZSB7CgkJCQl0aGlzLiRpbnB1dC52YWwoZm9ybWF0dGVkRGF0ZVRpbWUpOwoJCQl9CgoJCQl0aGlzLiRpbnB1dC50cmlnZ2VyKCJjaGFuZ2UiKTsKCQl9LAoKCQlfb25Gb2N1czogZnVuY3Rpb24oKSB7CgkJCWlmICghdGhpcy4kaW5wdXQudmFsKCkgJiYgdGhpcy5fZGVmYXVsdHMuZGVmYXVsdFZhbHVlKSB7CgkJCQl0aGlzLiRpbnB1dC52YWwodGhpcy5fZGVmYXVsdHMuZGVmYXVsdFZhbHVlKTsKCQkJCXZhciBpbnN0ID0gJC5kYXRlcGlja2VyLl9nZXRJbnN0KHRoaXMuJGlucHV0LmdldCgwKSksCgkJCQkJdHBfaW5zdCA9ICQuZGF0ZXBpY2tlci5fZ2V0KGluc3QsICd0aW1lcGlja2VyJyk7CgkJCQlpZiAodHBfaW5zdCkgewoJCQkJCWlmICh0cF9pbnN0Ll9kZWZhdWx0cy50aW1lT25seSAmJiAoaW5zdC5pbnB1dC52YWwoKSAhPSBpbnN0Lmxhc3RWYWwpKSB7CgkJCQkJCXRyeSB7CgkJCQkJCQkkLmRhdGVwaWNrZXIuX3VwZGF0ZURhdGVwaWNrZXIoaW5zdCk7CgkJCQkJCX0gY2F0Y2ggKGVycikgewoJCQkJCQkJJC5kYXRlcGlja2VyLmxvZyhlcnIpOwoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQl9CgkJfSwKCgkJLyoKCQkqIFNtYWxsIGFic3RyYWN0aW9uIHRvIGNvbnRyb2wgdHlwZXMKCQkqIFdlIGNhbiBhZGQgbW9yZSwganVzdCBiZSBzdXJlIHRvIGZvbGxvdyB0aGUgcGF0dGVybjogY3JlYXRlLCBvcHRpb25zLCB2YWx1ZQoJCSovCgkJX2NvbnRyb2xzOiB7CgkJCS8vIHNsaWRlciBtZXRob2RzCgkJCXNsaWRlcjogewoJCQkJY3JlYXRlOiBmdW5jdGlvbih0cF9pbnN0LCBvYmosIHVuaXQsIHZhbCwgbWluLCBtYXgsIHN0ZXApewoJCQkJCXZhciBydGwgPSB0cF9pbnN0Ll9kZWZhdWx0cy5pc1JUTDsgLy8gaWYgcnRsIGdvIC02MC0+MCBpbnN0ZWFkIG9mIDAtPjYwCgkJCQkJcmV0dXJuIG9iai5wcm9wKCdzbGlkZScsIG51bGwpLnNsaWRlcih7CgkJCQkJCW9yaWVudGF0aW9uOiAiaG9yaXpvbnRhbCIsCgkJCQkJCXZhbHVlOiBydGw/IHZhbCotMSA6IHZhbCwKCQkJCQkJbWluOiBydGw/IG1heCotMSA6IG1pbiwKCQkJCQkJbWF4OiBydGw/IG1pbiotMSA6IG1heCwKCQkJCQkJc3RlcDogc3RlcCwKCQkJCQkJc2xpZGU6IGZ1bmN0aW9uKGV2ZW50LCB1aSkgewoJCQkJCQkJdHBfaW5zdC5jb250cm9sLnZhbHVlKHRwX2luc3QsICQodGhpcyksIHVuaXQsIHJ0bD8gdWkudmFsdWUqLTE6dWkudmFsdWUpOwoJCQkJCQkJdHBfaW5zdC5fb25UaW1lQ2hhbmdlKCk7CgkJCQkJCX0sCgkJCQkJCXN0b3A6IGZ1bmN0aW9uKGV2ZW50LCB1aSkgewoJCQkJCQkJdHBfaW5zdC5fb25TZWxlY3RIYW5kbGVyKCk7CgkJCQkJCX0KCQkJCQl9KTsJCgkJCQl9LAoJCQkJb3B0aW9uczogZnVuY3Rpb24odHBfaW5zdCwgb2JqLCB1bml0LCBvcHRzLCB2YWwpewoJCQkJCWlmKHRwX2luc3QuX2RlZmF1bHRzLmlzUlRMKXsKCQkJCQkJaWYodHlwZW9mKG9wdHMpID09ICdzdHJpbmcnKXsKCQkJCQkJCWlmKG9wdHMgPT0gJ21pbicgfHwgb3B0cyA9PSAnbWF4Jyl7CgkJCQkJCQkJaWYodmFsICE9PSB1bmRlZmluZWQpCgkJCQkJCQkJCXJldHVybiBvYmouc2xpZGVyKG9wdHMsIHZhbCotMSk7CgkJCQkJCQkJcmV0dXJuIE1hdGguYWJzKG9iai5zbGlkZXIob3B0cykpOwoJCQkJCQkJfQoJCQkJCQkJcmV0dXJuIG9iai5zbGlkZXIob3B0cyk7CgkJCQkJCX0KCQkJCQkJdmFyIG1pbiA9IG9wdHMubWluLCAKCQkJCQkJCW1heCA9IG9wdHMubWF4OwoJCQkJCQlvcHRzLm1pbiA9IG9wdHMubWF4ID0gbnVsbDsKCQkJCQkJaWYobWluICE9PSB1bmRlZmluZWQpCgkJCQkJCQlvcHRzLm1heCA9IG1pbiAqIC0xOwoJCQkJCQlpZihtYXggIT09IHVuZGVmaW5lZCkKCQkJCQkJCW9wdHMubWluID0gbWF4ICogLTE7CgkJCQkJCXJldHVybiBvYmouc2xpZGVyKG9wdHMpOwoJCQkJCX0KCQkJCQlpZih0eXBlb2Yob3B0cykgPT0gJ3N0cmluZycgJiYgdmFsICE9PSB1bmRlZmluZWQpCgkJCQkJCQlyZXR1cm4gb2JqLnNsaWRlcihvcHRzLCB2YWwpOwoJCQkJCXJldHVybiBvYmouc2xpZGVyKG9wdHMpOwoJCQkJfSwKCQkJCXZhbHVlOiBmdW5jdGlvbih0cF9pbnN0LCBvYmosIHVuaXQsIHZhbCl7CgkJCQkJaWYodHBfaW5zdC5fZGVmYXVsdHMuaXNSVEwpewoJCQkJCQlpZih2YWwgIT09IHVuZGVmaW5lZCkKCQkJCQkJCXJldHVybiBvYmouc2xpZGVyKCd2YWx1ZScsIHZhbCotMSk7CgkJCQkJCXJldHVybiBNYXRoLmFicyhvYmouc2xpZGVyKCd2YWx1ZScpKTsKCQkJCQl9CgkJCQkJaWYodmFsICE9PSB1bmRlZmluZWQpCgkJCQkJCXJldHVybiBvYmouc2xpZGVyKCd2YWx1ZScsIHZhbCk7CgkJCQkJcmV0dXJuIG9iai5zbGlkZXIoJ3ZhbHVlJyk7CgkJCQl9CgkJCX0sCgkJCS8vIHNlbGVjdCBtZXRob2RzCgkJCXNlbGVjdDogewoJCQkJY3JlYXRlOiBmdW5jdGlvbih0cF9pbnN0LCBvYmosIHVuaXQsIHZhbCwgbWluLCBtYXgsIHN0ZXApewoJCQkJCXZhciBzZWwgPSAnPHNlbGVjdCBjbGFzcz0idWktdGltZXBpY2tlci1zZWxlY3QiIGRhdGEtdW5pdD0iJysgdW5pdCArJyIgZGF0YS1taW49IicrIG1pbiArJyIgZGF0YS1tYXg9IicrIG1heCArJyIgZGF0YS1zdGVwPSInKyBzdGVwICsnIj4nLAoJCQkJCQl1bCA9IHRwX2luc3QuX2RlZmF1bHRzLnRpbWVGb3JtYXQuaW5kZXhPZigndCcpICE9PSAtMT8gJ3RvTG93ZXJDYXNlJzondG9VcHBlckNhc2UnLAoJCQkJCQltID0gMDsKCgkJCQkJZm9yKHZhciBpPW1pbjsgaTw9bWF4OyBpKz1zdGVwKXsJCQkJCQkKCQkJCQkJc2VsICs9ICc8b3B0aW9uIHZhbHVlPSInKyBpICsnIicrIChpPT12YWw/ICcgc2VsZWN0ZWQnOicnKSArJz4nOwoJCQkJCQlpZih1bml0ID09ICdob3VyJyAmJiB1c2VBbXBtKHRwX2luc3QuX2RlZmF1bHRzLnBpY2tlclRpbWVGb3JtYXQgfHwgdHBfaW5zdC5fZGVmYXVsdHMudGltZUZvcm1hdCkpCgkJCQkJCQlzZWwgKz0gJC5kYXRlcGlja2VyLmZvcm1hdFRpbWUoImhoIFRUIiwge2hvdXI6aX0sIHRwX2luc3QuX2RlZmF1bHRzKTsKCQkJCQkJZWxzZSBpZih1bml0ID09ICdtaWxsaXNlYycgfHwgaSA+PSAxMCkgc2VsICs9IGk7CgkJCQkJCWVsc2Ugc2VsICs9ICcwJysgaS50b1N0cmluZygpOwoJCQkJCQlzZWwgKz0gJzwvb3B0aW9uPic7CgkJCQkJfQoJCQkJCXNlbCArPSAnPC9zZWxlY3Q+JzsKCgkJCQkJb2JqLmNoaWxkcmVuKCdzZWxlY3QnKS5yZW1vdmUoKTsKCgkJCQkJJChzZWwpLmFwcGVuZFRvKG9iaikuY2hhbmdlKGZ1bmN0aW9uKGUpewoJCQkJCQl0cF9pbnN0Ll9vblRpbWVDaGFuZ2UoKTsKCQkJCQkJdHBfaW5zdC5fb25TZWxlY3RIYW5kbGVyKCk7CgkJCQkJfSk7CgoJCQkJCXJldHVybiBvYmo7CgkJCQl9LAoJCQkJb3B0aW9uczogZnVuY3Rpb24odHBfaW5zdCwgb2JqLCB1bml0LCBvcHRzLCB2YWwpewoJCQkJCXZhciBvID0ge30sCgkJCQkJCSR0ID0gb2JqLmNoaWxkcmVuKCdzZWxlY3QnKTsKCQkJCQlpZih0eXBlb2Yob3B0cykgPT0gJ3N0cmluZycpewoJCQkJCQlpZih2YWwgPT09IHVuZGVmaW5lZCkKCQkJCQkJCXJldHVybiAkdC5kYXRhKG9wdHMpOwoJCQkJCQlvW29wdHNdID0gdmFsOwkKCQkJCQl9CgkJCQkJZWxzZSBvID0gb3B0czsKCQkJCQlyZXR1cm4gdHBfaW5zdC5jb250cm9sLmNyZWF0ZSh0cF9pbnN0LCBvYmosICR0LmRhdGEoJ3VuaXQnKSwgJHQudmFsKCksIG8ubWluIHx8ICR0LmRhdGEoJ21pbicpLCBvLm1heCB8fCAkdC5kYXRhKCdtYXgnKSwgby5zdGVwIHx8ICR0LmRhdGEoJ3N0ZXAnKSk7CgkJCQl9LAoJCQkJdmFsdWU6IGZ1bmN0aW9uKHRwX2luc3QsIG9iaiwgdW5pdCwgdmFsKXsKCQkJCQl2YXIgJHQgPSBvYmouY2hpbGRyZW4oJ3NlbGVjdCcpOwoJCQkJCWlmKHZhbCAhPT0gdW5kZWZpbmVkKQoJCQkJCQlyZXR1cm4gJHQudmFsKHZhbCk7CgkJCQkJcmV0dXJuICR0LnZhbCgpOwoJCQkJfQoJCQl9CgkJfSAvLyBlbmQgX2NvbnRyb2xzCgoJfSk7CgoJJC5mbi5leHRlbmQoewoJCS8qCgkJKiBzaG9ydGhhbmQganVzdCB0byB1c2UgdGltZXBpY2tlci4uCgkJKi8KCQl0aW1lcGlja2VyOiBmdW5jdGlvbihvKSB7CgkJCW8gPSBvIHx8IHt9OwoJCQl2YXIgdG1wX2FyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwoKCQkJaWYgKHR5cGVvZiBvID09ICdvYmplY3QnKSB7CgkJCQl0bXBfYXJnc1swXSA9ICQuZXh0ZW5kKG8sIHsKCQkJCQl0aW1lT25seTogdHJ1ZQoJCQkJfSk7CgkJCX0KCgkJCXJldHVybiAkKHRoaXMpLmVhY2goZnVuY3Rpb24oKSB7CgkJCQkkLmZuLmRhdGV0aW1lcGlja2VyLmFwcGx5KCQodGhpcyksIHRtcF9hcmdzKTsKCQkJfSk7CgkJfSwKCgkJLyoKCQkqIGV4dGVuZCB0aW1lcGlja2VyIHRvIGRhdGVwaWNrZXIKCQkqLwoJCWRhdGV0aW1lcGlja2VyOiBmdW5jdGlvbihvKSB7CgkJCW8gPSBvIHx8IHt9OwoJCQl2YXIgdG1wX2FyZ3MgPSBhcmd1bWVudHM7CgoJCQlpZiAodHlwZW9mKG8pID09ICdzdHJpbmcnKSB7CgkJCQlpZiAobyA9PSAnZ2V0RGF0ZScpIHsKCQkJCQlyZXR1cm4gJC5mbi5kYXRlcGlja2VyLmFwcGx5KCQodGhpc1swXSksIHRtcF9hcmdzKTsKCQkJCX0gZWxzZSB7CgkJCQkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKCQkJCQkJdmFyICR0ID0gJCh0aGlzKTsKCQkJCQkJJHQuZGF0ZXBpY2tlci5hcHBseSgkdCwgdG1wX2FyZ3MpOwoJCQkJCX0pOwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKCQkJCQl2YXIgJHQgPSAkKHRoaXMpOwoJCQkJCSR0LmRhdGVwaWNrZXIoJC50aW1lcGlja2VyLl9uZXdJbnN0KCR0LCBvKS5fZGVmYXVsdHMpOwoJCQkJfSk7CgkJCX0KCQl9Cgl9KTsKCgkvKgoJKiBQdWJsaWMgVXRpbGl0eSB0byBwYXJzZSBkYXRlIGFuZCB0aW1lCgkqLwoJJC5kYXRlcGlja2VyLnBhcnNlRGF0ZVRpbWUgPSBmdW5jdGlvbihkYXRlRm9ybWF0LCB0aW1lRm9ybWF0LCBkYXRlVGltZVN0cmluZywgZGF0ZVNldHRpbmdzLCB0aW1lU2V0dGluZ3MpIHsKCQl2YXIgcGFyc2VSZXMgPSBwYXJzZURhdGVUaW1lSW50ZXJuYWwoZGF0ZUZvcm1hdCwgdGltZUZvcm1hdCwgZGF0ZVRpbWVTdHJpbmcsIGRhdGVTZXR0aW5ncywgdGltZVNldHRpbmdzKTsKCQlpZiAocGFyc2VSZXMudGltZU9iaikgewoJCQl2YXIgdCA9IHBhcnNlUmVzLnRpbWVPYmo7CgkJCXBhcnNlUmVzLmRhdGUuc2V0SG91cnModC5ob3VyLCB0Lm1pbnV0ZSwgdC5zZWNvbmQsIHQubWlsbGlzZWMpOwoJCX0KCgkJcmV0dXJuIHBhcnNlUmVzLmRhdGU7Cgl9OwoKCS8qCgkqIFB1YmxpYyB1dGlsaXR5IHRvIHBhcnNlIHRpbWUKCSovCgkkLmRhdGVwaWNrZXIucGFyc2VUaW1lID0gZnVuY3Rpb24odGltZUZvcm1hdCwgdGltZVN0cmluZywgb3B0aW9ucykgewkJCgkJdmFyIG8gPSBleHRlbmRSZW1vdmUoZXh0ZW5kUmVtb3ZlKHt9LCAkLnRpbWVwaWNrZXIuX2RlZmF1bHRzKSwgb3B0aW9ucyB8fCB7fSk7CgoJCS8vIFN0cmljdCBwYXJzZSByZXF1aXJlcyB0aGUgdGltZVN0cmluZyB0byBtYXRjaCB0aGUgdGltZUZvcm1hdCBleGFjdGx5CgkJdmFyIHN0cmljdFBhcnNlID0gZnVuY3Rpb24oZiwgcywgbyl7CgoJCQkvLyBwYXR0ZXJuIGZvciBzdGFuZGFyZCBhbmQgbG9jYWxpemVkIEFNL1BNIG1hcmtlcnMKCQkJdmFyIGdldFBhdHRlcm5BbXBtID0gZnVuY3Rpb24oYW1OYW1lcywgcG1OYW1lcykgewoJCQkJdmFyIG1hcmtlcnMgPSBbXTsKCQkJCWlmIChhbU5hbWVzKSB7CgkJCQkJJC5tZXJnZShtYXJrZXJzLCBhbU5hbWVzKTsKCQkJCX0KCQkJCWlmIChwbU5hbWVzKSB7CgkJCQkJJC5tZXJnZShtYXJrZXJzLCBwbU5hbWVzKTsKCQkJCX0KCQkJCW1hcmtlcnMgPSAkLm1hcChtYXJrZXJzLCBmdW5jdGlvbih2YWwpIHsKCQkJCQlyZXR1cm4gdmFsLnJlcGxhY2UoL1suKis/fCgpXFtcXXt9XFxdL2csICdcXCQmJyk7CgkJCQl9KTsKCQkJCXJldHVybiAnKCcgKyBtYXJrZXJzLmpvaW4oJ3wnKSArICcpPyc7CgkJCX07CgoJCQkvLyBmaWd1cmUgb3V0IHBvc2l0aW9uIG9mIHRpbWUgZWxlbWVudHMuLiBjYXVzZSBqcyBjYW50IGRvIG5hbWVkIGNhcHR1cmVzCgkJCXZhciBnZXRGb3JtYXRQb3NpdGlvbnMgPSBmdW5jdGlvbih0aW1lRm9ybWF0KSB7CgkJCQl2YXIgZmluZHMgPSB0aW1lRm9ybWF0LnRvTG93ZXJDYXNlKCkubWF0Y2goLyhoezEsMn18bXsxLDJ9fHN7MSwyfXxsezF9fHR7MSwyfXx6fCcuKj8nKS9nKSwKCQkJCQlvcmRlcnMgPSB7CgkJCQkJCWg6IC0xLAoJCQkJCQltOiAtMSwKCQkJCQkJczogLTEsCgkJCQkJCWw6IC0xLAoJCQkJCQl0OiAtMSwKCQkJCQkJejogLTEKCQkJCQl9OwoKCQkJCWlmIChmaW5kcykgewoJCQkJCWZvciAodmFyIGkgPSAwOyBpIDwgZmluZHMubGVuZ3RoOyBpKyspIHsKCQkJCQkJaWYgKG9yZGVyc1tmaW5kc1tpXS50b1N0cmluZygpLmNoYXJBdCgwKV0gPT0gLTEpIHsKCQkJCQkJCW9yZGVyc1tmaW5kc1tpXS50b1N0cmluZygpLmNoYXJBdCgwKV0gPSBpICsgMTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJCXJldHVybiBvcmRlcnM7CgkJCX07CgoJCQl2YXIgcmVnc3RyID0gJ14nICsgZi50b1N0cmluZygpCgkJCQkJLnJlcGxhY2UoLyhbaEhdezEsMn18bW0/fHNzP3xbdFRdezEsMn18W2x6XXwnLio/JykvZywgZnVuY3Rpb24gKG1hdGNoKSB7CgkJCQkJCQlzd2l0Y2ggKG1hdGNoLmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpKSB7CgkJCQkJCQkJY2FzZSAnaCc6IHJldHVybiAnKFxcZD9cXGQpJzsKCQkJCQkJCQljYXNlICdtJzogcmV0dXJuICcoXFxkP1xcZCknOwoJCQkJCQkJCWNhc2UgJ3MnOiByZXR1cm4gJyhcXGQ/XFxkKSc7CgkJCQkJCQkJY2FzZSAnbCc6IHJldHVybiAnKFxcZD9cXGQ/XFxkKSc7CgkJCQkJCQkJY2FzZSAneic6IHJldHVybiAnKHp8Wy0rXVxcZFxcZDo/XFxkXFxkfFxcUyspPyc7CgkJCQkJCQkJY2FzZSAndCc6IHJldHVybiBnZXRQYXR0ZXJuQW1wbShvLmFtTmFtZXMsIG8ucG1OYW1lcyk7CgkJCQkJCQkJZGVmYXVsdDogICAgLy8gbGl0ZXJhbCBlc2NhcGVkIGluIHF1b3RlcwoJCQkJCQkJCQlyZXR1cm4gJygnICsgbWF0Y2gucmVwbGFjZSgvXCcvZywgIiIpLnJlcGxhY2UoLyhcLnxcJHxcXnxcXHxcL3xcKHxcKXxcW3xcXXxcP3xcK3xcKikvZywgZnVuY3Rpb24gKG0pIHsgcmV0dXJuICJcXCIgKyBtOyB9KSArICcpPyc7CgkJCQkJCQl9CgkJCQkJCX0pCgkJCQkJLnJlcGxhY2UoL1xzL2csICdcXHM/JykgKwoJCQkJCW8udGltZVN1ZmZpeCArICckJywKCQkJCW9yZGVyID0gZ2V0Rm9ybWF0UG9zaXRpb25zKGYpLAoJCQkJYW1wbSA9ICcnLAoJCQkJdHJlZzsKCgkJCXRyZWcgPSBzLm1hdGNoKG5ldyBSZWdFeHAocmVnc3RyLCAnaScpKTsKCgkJCXZhciByZXNUaW1lID0gewoJCQkJaG91cjogMCwKCQkJCW1pbnV0ZTogMCwKCQkJCXNlY29uZDogMCwKCQkJCW1pbGxpc2VjOiAwCgkJCX07CgoJCQlpZiAodHJlZykgewoJCQkJaWYgKG9yZGVyLnQgIT09IC0xKSB7CgkJCQkJaWYgKHRyZWdbb3JkZXIudF0gPT09IHVuZGVmaW5lZCB8fCB0cmVnW29yZGVyLnRdLmxlbmd0aCA9PT0gMCkgewoJCQkJCQlhbXBtID0gJyc7CgkJCQkJCXJlc1RpbWUuYW1wbSA9ICcnOwoJCQkJCX0gZWxzZSB7CgkJCQkJCWFtcG0gPSAkLmluQXJyYXkodHJlZ1tvcmRlci50XS50b1VwcGVyQ2FzZSgpLCBvLmFtTmFtZXMpICE9PSAtMSA/ICdBTScgOiAnUE0nOwoJCQkJCQlyZXNUaW1lLmFtcG0gPSBvW2FtcG0gPT0gJ0FNJyA/ICdhbU5hbWVzJyA6ICdwbU5hbWVzJ11bMF07CgkJCQkJfQoJCQkJfQoKCQkJCWlmIChvcmRlci5oICE9PSAtMSkgewoJCQkJCWlmIChhbXBtID09ICdBTScgJiYgdHJlZ1tvcmRlci5oXSA9PSAnMTInKSB7CgkJCQkJCXJlc1RpbWUuaG91ciA9IDA7IC8vIDEyYW0gPSAwIGhvdXIKCQkJCQl9IGVsc2UgewoJCQkJCQlpZiAoYW1wbSA9PSAnUE0nICYmIHRyZWdbb3JkZXIuaF0gIT0gJzEyJykgewoJCQkJCQkJcmVzVGltZS5ob3VyID0gcGFyc2VJbnQodHJlZ1tvcmRlci5oXSwgMTApICsgMTI7IC8vIDEycG0gPSAxMiBob3VyLCBhbnkgb3RoZXIgcG0gPSBob3VyICsgMTIKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCXJlc1RpbWUuaG91ciA9IE51bWJlcih0cmVnW29yZGVyLmhdKTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCgkJCQlpZiAob3JkZXIubSAhPT0gLTEpIHsKCQkJCQlyZXNUaW1lLm1pbnV0ZSA9IE51bWJlcih0cmVnW29yZGVyLm1dKTsKCQkJCX0KCQkJCWlmIChvcmRlci5zICE9PSAtMSkgewoJCQkJCXJlc1RpbWUuc2Vjb25kID0gTnVtYmVyKHRyZWdbb3JkZXIuc10pOwoJCQkJfQoJCQkJaWYgKG9yZGVyLmwgIT09IC0xKSB7CgkJCQkJcmVzVGltZS5taWxsaXNlYyA9IE51bWJlcih0cmVnW29yZGVyLmxdKTsKCQkJCX0KCQkJCWlmIChvcmRlci56ICE9PSAtMSAmJiB0cmVnW29yZGVyLnpdICE9PSB1bmRlZmluZWQpIHsKCQkJCQl2YXIgdHogPSB0cmVnW29yZGVyLnpdLnRvVXBwZXJDYXNlKCk7CgkJCQkJc3dpdGNoICh0ei5sZW5ndGgpIHsKCQkJCQljYXNlIDE6CgkJCQkJCS8vIFoKCQkJCQkJdHogPSBvLnRpbWV6b25lSXNvODYwMSA/ICdaJyA6ICcrMDAwMCc7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgNToKCQkJCQkJLy8gK2hobW0KCQkJCQkJaWYgKG8udGltZXpvbmVJc284NjAxKSB7CgkJCQkJCQl0eiA9IHR6LnN1YnN0cmluZygxKSA9PSAnMDAwMCcgPyAnWicgOiB0ei5zdWJzdHJpbmcoMCwgMykgKyAnOicgKyB0ei5zdWJzdHJpbmcoMyk7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSA2OgoJCQkJCQkvLyAraGg6bW0KCQkJCQkJaWYgKCFvLnRpbWV6b25lSXNvODYwMSkgewoJCQkJCQkJdHogPSB0eiA9PSAnWicgfHwgdHouc3Vic3RyaW5nKDEpID09ICcwMDowMCcgPyAnKzAwMDAnIDogdHoucmVwbGFjZSgvOi8sICcnKTsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCWlmICh0ei5zdWJzdHJpbmcoMSkgPT0gJzAwOjAwJykgewoJCQkJCQkJCXR6ID0gJ1onOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCQlyZXNUaW1lLnRpbWV6b25lID0gdHo7CgkJCQl9CgoKCQkJCXJldHVybiByZXNUaW1lOwoJCQl9CgkJCXJldHVybiBmYWxzZTsKCQl9Oy8vIGVuZCBzdHJpY3RQYXJzZQoKCQkvLyBGaXJzdCB0cnkgSlMgRGF0ZSwgaWYgdGhhdCBmYWlscywgdXNlIHN0cmljdFBhcnNlCgkJdmFyIGxvb3NlUGFyc2UgPSBmdW5jdGlvbihmLHMsbyl7CgkJCXRyeXsKCQkJCXZhciBkID0gbmV3IERhdGUoJzIwMTItMDEtMDEgJysgcyk7CgkJCQlyZXR1cm4gewoJCQkJCWhvdXI6IGQuZ2V0SG91cnMoKSwKCQkJCQltaW51dGVzOiBkLmdldE1pbnV0ZXMoKSwKCQkJCQlzZWNvbmRzOiBkLmdldFNlY29uZHMoKSwKCQkJCQltaWxsaXNlYzogZC5nZXRNaWxsaXNlY29uZHMoKSwKCQkJCQl0aW1lem9uZTogJC50aW1lcGlja2VyLnRpbWVab25lT2Zmc2V0U3RyaW5nKGQpCgkJCQl9OwoJCQl9CgkJCWNhdGNoKGVycil7CgkJCQl0cnl7CgkJCQkJcmV0dXJuIHN0cmljdFBhcnNlKGYscyxvKTsKCQkJCX0KCQkJCWNhdGNoKGVycjIpewoJCQkJCSQuZGF0ZXBpY2tlci5sb2coIlVuYWJsZSB0byBwYXJzZSBcbnRpbWVTdHJpbmc6ICIrIHMgKyJcbnRpbWVGb3JtYXQ6ICIrIGYpOwoJCQkJfQkJCQkKCQkJfQoJCQlyZXR1cm4gZmFsc2U7CgkJfTsgLy8gZW5kIGxvb3NlUGFyc2UKCQkKCQlpZih0eXBlb2Ygby5wYXJzZSA9PT0gImZ1bmN0aW9uIil7CgkJCXJldHVybiBvLnBhcnNlKHRpbWVGb3JtYXQsIHRpbWVTdHJpbmcsIG8pCgkJfQoJCWlmKG8ucGFyc2UgPT09ICdsb29zZScpewoJCQlyZXR1cm4gbG9vc2VQYXJzZSh0aW1lRm9ybWF0LCB0aW1lU3RyaW5nLCBvKTsKCQl9CgkJcmV0dXJuIHN0cmljdFBhcnNlKHRpbWVGb3JtYXQsIHRpbWVTdHJpbmcsIG8pOwoJfTsKCgkvKgoJKiBQdWJsaWMgdXRpbGl0eSB0byBmb3JtYXQgdGhlIHRpbWUKCSogZm9ybWF0ID0gc3RyaW5nIGZvcm1hdCBvZiB0aGUgdGltZQoJKiB0aW1lID0gYSB7fSwgbm90IGEgRGF0ZSgpIGZvciB0aW1lem9uZXMKCSogb3B0aW9ucyA9IGVzc2VudGlhbGx5IHRoZSByZWdpb25hbFtdLi4gYW1OYW1lcywgcG1OYW1lcywgYW1wbQoJKi8KCSQuZGF0ZXBpY2tlci5mb3JtYXRUaW1lID0gZnVuY3Rpb24oZm9ybWF0LCB0aW1lLCBvcHRpb25zKSB7CgkJb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CgkJb3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCAkLnRpbWVwaWNrZXIuX2RlZmF1bHRzLCBvcHRpb25zKTsKCQl0aW1lID0gJC5leHRlbmQoewoJCQlob3VyOiAwLAoJCQltaW51dGU6IDAsCgkJCXNlY29uZDogMCwKCQkJbWlsbGlzZWM6IDAsCgkJCXRpbWV6b25lOiAnKzAwMDAnCgkJfSwgdGltZSk7CgoJCXZhciB0bXB0aW1lID0gZm9ybWF0LAoJCQlhbXBtTmFtZSA9IG9wdGlvbnMuYW1OYW1lc1swXSwKCQkJaG91ciA9IHBhcnNlSW50KHRpbWUuaG91ciwgMTApOwoKCQlpZiAoaG91ciA+IDExKSB7CgkJCWFtcG1OYW1lID0gb3B0aW9ucy5wbU5hbWVzWzBdOwoJCX0KCgkJdG1wdGltZSA9IHRtcHRpbWUucmVwbGFjZSgvKD86SEg/fGhoP3xtbT98c3M/fFt0VF17MSwyfXxbbHpdfCgnLio/J3wiLio/IikpL2csIGZ1bmN0aW9uKG1hdGNoKSB7CgkJc3dpdGNoIChtYXRjaCkgewoJCQljYXNlICdISCc6CgkJCQlyZXR1cm4gKCcwJyArIGhvdXIpLnNsaWNlKC0yKTsKCQkJY2FzZSAnSCc6CgkJCQlyZXR1cm4gaG91cjsKCQkJY2FzZSAnaGgnOgoJCQkJcmV0dXJuICgnMCcgKyBjb252ZXJ0MjR0bzEyKGhvdXIpKS5zbGljZSgtMik7CgkJCWNhc2UgJ2gnOgoJCQkJcmV0dXJuIGNvbnZlcnQyNHRvMTIoaG91cik7CgkJCWNhc2UgJ21tJzoKCQkJCXJldHVybiAoJzAnICsgdGltZS5taW51dGUpLnNsaWNlKC0yKTsKCQkJY2FzZSAnbSc6CgkJCQlyZXR1cm4gdGltZS5taW51dGU7CgkJCWNhc2UgJ3NzJzoKCQkJCXJldHVybiAoJzAnICsgdGltZS5zZWNvbmQpLnNsaWNlKC0yKTsKCQkJY2FzZSAncyc6CgkJCQlyZXR1cm4gdGltZS5zZWNvbmQ7CgkJCWNhc2UgJ2wnOgoJCQkJcmV0dXJuICgnMDAnICsgdGltZS5taWxsaXNlYykuc2xpY2UoLTMpOwoJCQljYXNlICd6JzoKCQkJCXJldHVybiB0aW1lLnRpbWV6b25lID09PSBudWxsPyBvcHRpb25zLmRlZmF1bHRUaW1lem9uZSA6IHRpbWUudGltZXpvbmU7CgkJCWNhc2UgJ1QnOiAKCQkJCXJldHVybiBhbXBtTmFtZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKTsKCQkJY2FzZSAnVFQnOiAKCQkJCXJldHVybiBhbXBtTmFtZS50b1VwcGVyQ2FzZSgpOwoJCQljYXNlICd0JzoKCQkJCXJldHVybiBhbXBtTmFtZS5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKTsKCQkJY2FzZSAndHQnOgoJCQkJcmV0dXJuIGFtcG1OYW1lLnRvTG93ZXJDYXNlKCk7CgkJCWRlZmF1bHQ6CgkJCQlyZXR1cm4gbWF0Y2gucmVwbGFjZSgvXCcvZywgIiIpIHx8ICInIjsKCQkJfQoJCX0pOwoKCQl0bXB0aW1lID0gJC50cmltKHRtcHRpbWUpOwoJCXJldHVybiB0bXB0aW1lOwoJfTsKCgkvKgoJKiB0aGUgYmFkIGhhY2sgOi8gb3ZlcnJpZGUgZGF0ZXBpY2tlciBzbyBpdCBkb2VzbnQgY2xvc2Ugb24gc2VsZWN0CgkvLyBpbnNwaXJlZDogaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xMjUyNTEyL2pxdWVyeS1kYXRlcGlja2VyLXByZXZlbnQtY2xvc2luZy1waWNrZXItd2hlbi1jbGlja2luZy1hLWRhdGUvMTc2MjM3OCMxNzYyMzc4CgkqLwoJJC5kYXRlcGlja2VyLl9iYXNlX3NlbGVjdERhdGUgPSAkLmRhdGVwaWNrZXIuX3NlbGVjdERhdGU7CgkkLmRhdGVwaWNrZXIuX3NlbGVjdERhdGUgPSBmdW5jdGlvbihpZCwgZGF0ZVN0cikgewoJCXZhciBpbnN0ID0gdGhpcy5fZ2V0SW5zdCgkKGlkKVswXSksCgkJCXRwX2luc3QgPSB0aGlzLl9nZXQoaW5zdCwgJ3RpbWVwaWNrZXInKTsKCgkJaWYgKHRwX2luc3QpIHsKCQkJdHBfaW5zdC5fbGltaXRNaW5NYXhEYXRlVGltZShpbnN0LCB0cnVlKTsKCQkJaW5zdC5pbmxpbmUgPSBpbnN0LnN0YXlfb3BlbiA9IHRydWU7CgkJCS8vVGhpcyB3YXkgdGhlIG9uU2VsZWN0IGhhbmRsZXIgY2FsbGVkIGZyb20gY2FsZW5kYXJwaWNrZXIgZ2V0IHRoZSBmdWxsIGRhdGVUaW1lCgkJCXRoaXMuX2Jhc2Vfc2VsZWN0RGF0ZShpZCwgZGF0ZVN0cik7CgkJCWluc3QuaW5saW5lID0gaW5zdC5zdGF5X29wZW4gPSBmYWxzZTsKCQkJdGhpcy5fbm90aWZ5Q2hhbmdlKGluc3QpOwoJCQl0aGlzLl91cGRhdGVEYXRlcGlja2VyKGluc3QpOwoJCX0gZWxzZSB7CgkJCXRoaXMuX2Jhc2Vfc2VsZWN0RGF0ZShpZCwgZGF0ZVN0cik7CgkJfQoJfTsKCgkvKgoJKiBzZWNvbmQgYmFkIGhhY2sgOi8gb3ZlcnJpZGUgZGF0ZXBpY2tlciBzbyBpdCB0cmlnZ2VycyBhbiBldmVudCB3aGVuIGNoYW5naW5nIHRoZSBpbnB1dCBmaWVsZAoJKiBhbmQgZG9lcyBub3QgcmVkcmF3IHRoZSBkYXRlcGlja2VyIG9uIGV2ZXJ5IHNlbGVjdERhdGUgZXZlbnQKCSovCgkkLmRhdGVwaWNrZXIuX2Jhc2VfdXBkYXRlRGF0ZXBpY2tlciA9ICQuZGF0ZXBpY2tlci5fdXBkYXRlRGF0ZXBpY2tlcjsKCSQuZGF0ZXBpY2tlci5fdXBkYXRlRGF0ZXBpY2tlciA9IGZ1bmN0aW9uKGluc3QpIHsKCgkJLy8gZG9uJ3QgcG9wdXAgdGhlIGRhdGVwaWNrZXIgaWYgdGhlcmUgaXMgYW5vdGhlciBpbnN0YW5jZSBhbHJlYWR5IG9wZW5lZAoJCXZhciBpbnB1dCA9IGluc3QuaW5wdXRbMF07CgkJaWYgKCQuZGF0ZXBpY2tlci5fY3VySW5zdCAmJiAkLmRhdGVwaWNrZXIuX2N1ckluc3QgIT0gaW5zdCAmJiAkLmRhdGVwaWNrZXIuX2RhdGVwaWNrZXJTaG93aW5nICYmICQuZGF0ZXBpY2tlci5fbGFzdElucHV0ICE9IGlucHV0KSB7CgkJCXJldHVybjsKCQl9CgoJCWlmICh0eXBlb2YoaW5zdC5zdGF5X29wZW4pICE9PSAnYm9vbGVhbicgfHwgaW5zdC5zdGF5X29wZW4gPT09IGZhbHNlKSB7CgoJCQl0aGlzLl9iYXNlX3VwZGF0ZURhdGVwaWNrZXIoaW5zdCk7CgoJCQkvLyBSZWxvYWQgdGhlIHRpbWUgY29udHJvbCB3aGVuIGNoYW5naW5nIHNvbWV0aGluZyBpbiB0aGUgaW5wdXQgdGV4dCBmaWVsZC4KCQkJdmFyIHRwX2luc3QgPSB0aGlzLl9nZXQoaW5zdCwgJ3RpbWVwaWNrZXInKTsKCQkJaWYgKHRwX2luc3QpIHsKCQkJCXRwX2luc3QuX2FkZFRpbWVQaWNrZXIoaW5zdCk7CgoJCQkJaWYgKHRwX2luc3QuX2RlZmF1bHRzLnVzZUxvY2FsVGltZXpvbmUpIHsgLy9jaGVja3MgZGF5bGlnaHQgc2F2aW5nIHdpdGggdGhlIG5ldyBkYXRlLgoJCQkJCXZhciBkYXRlID0gbmV3IERhdGUoaW5zdC5zZWxlY3RlZFllYXIsIGluc3Quc2VsZWN0ZWRNb250aCwgaW5zdC5zZWxlY3RlZERheSwgMTIpOwoJCQkJCXNlbGVjdExvY2FsVGltZVpvbmUodHBfaW5zdCwgZGF0ZSk7CgkJCQkJdHBfaW5zdC5fb25UaW1lQ2hhbmdlKCk7CgkJCQl9CgkJCX0KCQl9Cgl9OwoKCS8qCgkqIHRoaXJkIGJhZCBoYWNrIDovIG92ZXJyaWRlIGRhdGVwaWNrZXIgc28gaXQgYWxsb3dzIHNwYWNlcyBhbmQgY29sb24gaW4gdGhlIGlucHV0IGZpZWxkCgkqLwoJJC5kYXRlcGlja2VyLl9iYXNlX2RvS2V5UHJlc3MgPSAkLmRhdGVwaWNrZXIuX2RvS2V5UHJlc3M7CgkkLmRhdGVwaWNrZXIuX2RvS2V5UHJlc3MgPSBmdW5jdGlvbihldmVudCkgewoJCXZhciBpbnN0ID0gJC5kYXRlcGlja2VyLl9nZXRJbnN0KGV2ZW50LnRhcmdldCksCgkJCXRwX2luc3QgPSAkLmRhdGVwaWNrZXIuX2dldChpbnN0LCAndGltZXBpY2tlcicpOwoKCQlpZiAodHBfaW5zdCkgewoJCQlpZiAoJC5kYXRlcGlja2VyLl9nZXQoaW5zdCwgJ2NvbnN0cmFpbklucHV0JykpIHsKCQkJCXZhciBhbXBtID0gdXNlQW1wbSh0cF9pbnN0Ll9kZWZhdWx0cy50aW1lRm9ybWF0KSwKCQkJCQlkYXRlQ2hhcnMgPSAkLmRhdGVwaWNrZXIuX3Bvc3NpYmxlQ2hhcnMoJC5kYXRlcGlja2VyLl9nZXQoaW5zdCwgJ2RhdGVGb3JtYXQnKSksCgkJCQkJZGF0ZXRpbWVDaGFycyA9IHRwX2luc3QuX2RlZmF1bHRzLnRpbWVGb3JtYXQudG9TdHJpbmcoKQoJCQkJCQkJCQkJCS5yZXBsYWNlKC9baG1zXS9nLCAnJykKCQkJCQkJCQkJCQkucmVwbGFjZSgvVFQvZywgYW1wbSA/ICdBUE0nIDogJycpCgkJCQkJCQkJCQkJLnJlcGxhY2UoL1R0L2csIGFtcG0gPyAnQWFQcE1tJyA6ICcnKQoJCQkJCQkJCQkJCS5yZXBsYWNlKC90VC9nLCBhbXBtID8gJ0FhUHBNbScgOiAnJykKCQkJCQkJCQkJCQkucmVwbGFjZSgvVC9nLCBhbXBtID8gJ0FQJyA6ICcnKQoJCQkJCQkJCQkJCS5yZXBsYWNlKC90dC9nLCBhbXBtID8gJ2FwbScgOiAnJykKCQkJCQkJCQkJCQkucmVwbGFjZSgvdC9nLCBhbXBtID8gJ2FwJyA6ICcnKSArIAoJCQkJCQkJCQkJCSIgIiArIHRwX2luc3QuX2RlZmF1bHRzLnNlcGFyYXRvciArIAoJCQkJCQkJCQkJCXRwX2luc3QuX2RlZmF1bHRzLnRpbWVTdWZmaXggKyAKCQkJCQkJCQkJCQkodHBfaW5zdC5fZGVmYXVsdHMuc2hvd1RpbWV6b25lID8gdHBfaW5zdC5fZGVmYXVsdHMudGltZXpvbmVMaXN0LmpvaW4oJycpIDogJycpICsgCgkJCQkJCQkJCQkJKHRwX2luc3QuX2RlZmF1bHRzLmFtTmFtZXMuam9pbignJykpICsgKHRwX2luc3QuX2RlZmF1bHRzLnBtTmFtZXMuam9pbignJykpICsgCgkJCQkJCQkJCQkJZGF0ZUNoYXJzLAoJCQkJCWNociA9IFN0cmluZy5mcm9tQ2hhckNvZGUoZXZlbnQuY2hhckNvZGUgPT09IHVuZGVmaW5lZCA/IGV2ZW50LmtleUNvZGUgOiBldmVudC5jaGFyQ29kZSk7CgkJCQlyZXR1cm4gZXZlbnQuY3RybEtleSB8fCAoY2hyIDwgJyAnIHx8ICFkYXRlQ2hhcnMgfHwgZGF0ZXRpbWVDaGFycy5pbmRleE9mKGNocikgPiAtMSk7CgkJCX0KCQl9CgoJCXJldHVybiAkLmRhdGVwaWNrZXIuX2Jhc2VfZG9LZXlQcmVzcyhldmVudCk7Cgl9OwoKCS8qCgkqIEZvdXJ0aCBiYWQgaGFjayA6LyBvdmVycmlkZSBfdXBkYXRlQWx0ZXJuYXRlIGZ1bmN0aW9uIHVzZWQgaW4gaW5saW5lIG1vZGUgdG8gaW5pdCBhbHRGaWVsZAoJKi8KCSQuZGF0ZXBpY2tlci5fYmFzZV91cGRhdGVBbHRlcm5hdGUgPSAkLmRhdGVwaWNrZXIuX3VwZGF0ZUFsdGVybmF0ZTsKCS8qIFVwZGF0ZSBhbnkgYWx0ZXJuYXRlIGZpZWxkIHRvIHN5bmNocm9uaXNlIHdpdGggdGhlIG1haW4gZmllbGQuICovCgkkLmRhdGVwaWNrZXIuX3VwZGF0ZUFsdGVybmF0ZSA9IGZ1bmN0aW9uKGluc3QpIHsKCQl2YXIgdHBfaW5zdCA9IHRoaXMuX2dldChpbnN0LCAndGltZXBpY2tlcicpOwoJCWlmKHRwX2luc3QpewoJCQl2YXIgYWx0RmllbGQgPSB0cF9pbnN0Ll9kZWZhdWx0cy5hbHRGaWVsZDsKCQkJaWYgKGFsdEZpZWxkKSB7IC8vIHVwZGF0ZSBhbHRlcm5hdGUgZmllbGQgdG9vCgkJCQl2YXIgYWx0Rm9ybWF0ID0gdHBfaW5zdC5fZGVmYXVsdHMuYWx0Rm9ybWF0IHx8IHRwX2luc3QuX2RlZmF1bHRzLmRhdGVGb3JtYXQsCgkJCQkJZGF0ZSA9IHRoaXMuX2dldERhdGUoaW5zdCksCgkJCQkJZm9ybWF0Q2ZnID0gJC5kYXRlcGlja2VyLl9nZXRGb3JtYXRDb25maWcoaW5zdCksCgkJCQkJYWx0Rm9ybWF0dGVkRGF0ZVRpbWUgPSAnJywgCgkJCQkJYWx0U2VwYXJhdG9yID0gdHBfaW5zdC5fZGVmYXVsdHMuYWx0U2VwYXJhdG9yID8gdHBfaW5zdC5fZGVmYXVsdHMuYWx0U2VwYXJhdG9yIDogdHBfaW5zdC5fZGVmYXVsdHMuc2VwYXJhdG9yLCAKCQkJCQlhbHRUaW1lU3VmZml4ID0gdHBfaW5zdC5fZGVmYXVsdHMuYWx0VGltZVN1ZmZpeCA/IHRwX2luc3QuX2RlZmF1bHRzLmFsdFRpbWVTdWZmaXggOiB0cF9pbnN0Ll9kZWZhdWx0cy50aW1lU3VmZml4LAoJCQkJCWFsdFRpbWVGb3JtYXQgPSB0cF9pbnN0Ll9kZWZhdWx0cy5hbHRUaW1lRm9ybWF0ICE9PSBudWxsID8gdHBfaW5zdC5fZGVmYXVsdHMuYWx0VGltZUZvcm1hdCA6IHRwX2luc3QuX2RlZmF1bHRzLnRpbWVGb3JtYXQ7CgkJCQkKCQkJCWFsdEZvcm1hdHRlZERhdGVUaW1lICs9ICQuZGF0ZXBpY2tlci5mb3JtYXRUaW1lKGFsdFRpbWVGb3JtYXQsIHRwX2luc3QsIHRwX2luc3QuX2RlZmF1bHRzKSArIGFsdFRpbWVTdWZmaXg7CgkJCQlpZighdHBfaW5zdC5fZGVmYXVsdHMudGltZU9ubHkgJiYgIXRwX2luc3QuX2RlZmF1bHRzLmFsdEZpZWxkVGltZU9ubHkpewoJCQkJCWlmKHRwX2luc3QuX2RlZmF1bHRzLmFsdEZvcm1hdCkKCQkJCQkJYWx0Rm9ybWF0dGVkRGF0ZVRpbWUgPSAkLmRhdGVwaWNrZXIuZm9ybWF0RGF0ZSh0cF9pbnN0Ll9kZWZhdWx0cy5hbHRGb3JtYXQsIChkYXRlID09PSBudWxsID8gbmV3IERhdGUoKSA6IGRhdGUpLCBmb3JtYXRDZmcpICsgYWx0U2VwYXJhdG9yICsgYWx0Rm9ybWF0dGVkRGF0ZVRpbWU7CgkJCQkJZWxzZSBhbHRGb3JtYXR0ZWREYXRlVGltZSA9IHRwX2luc3QuZm9ybWF0dGVkRGF0ZSArIGFsdFNlcGFyYXRvciArIGFsdEZvcm1hdHRlZERhdGVUaW1lOwoJCQkJfQoJCQkJJChhbHRGaWVsZCkudmFsKGFsdEZvcm1hdHRlZERhdGVUaW1lKTsKCQkJfQoJCX0KCQllbHNlewoJCQkkLmRhdGVwaWNrZXIuX2Jhc2VfdXBkYXRlQWx0ZXJuYXRlKGluc3QpOwoJCX0KCX07CgoJLyoKCSogT3ZlcnJpZGUga2V5IHVwIGV2ZW50IHRvIHN5bmMgbWFudWFsIGlucHV0IGNoYW5nZXMuCgkqLwoJJC5kYXRlcGlja2VyLl9iYXNlX2RvS2V5VXAgPSAkLmRhdGVwaWNrZXIuX2RvS2V5VXA7CgkkLmRhdGVwaWNrZXIuX2RvS2V5VXAgPSBmdW5jdGlvbihldmVudCkgewoJCXZhciBpbnN0ID0gJC5kYXRlcGlja2VyLl9nZXRJbnN0KGV2ZW50LnRhcmdldCksCgkJCXRwX2luc3QgPSAkLmRhdGVwaWNrZXIuX2dldChpbnN0LCAndGltZXBpY2tlcicpOwoKCQlpZiAodHBfaW5zdCkgewoJCQlpZiAodHBfaW5zdC5fZGVmYXVsdHMudGltZU9ubHkgJiYgKGluc3QuaW5wdXQudmFsKCkgIT0gaW5zdC5sYXN0VmFsKSkgewoJCQkJdHJ5IHsKCQkJCQkkLmRhdGVwaWNrZXIuX3VwZGF0ZURhdGVwaWNrZXIoaW5zdCk7CgkJCQl9IGNhdGNoIChlcnIpIHsKCQkJCQkkLmRhdGVwaWNrZXIubG9nKGVycik7CgkJCQl9CgkJCX0KCQl9CgoJCXJldHVybiAkLmRhdGVwaWNrZXIuX2Jhc2VfZG9LZXlVcChldmVudCk7Cgl9OwoKCS8qCgkqIG92ZXJyaWRlICJUb2RheSIgYnV0dG9uIHRvIGFsc28gZ3JhYiB0aGUgdGltZS4KCSovCgkkLmRhdGVwaWNrZXIuX2Jhc2VfZ290b1RvZGF5ID0gJC5kYXRlcGlja2VyLl9nb3RvVG9kYXk7CgkkLmRhdGVwaWNrZXIuX2dvdG9Ub2RheSA9IGZ1bmN0aW9uKGlkKSB7CgkJdmFyIGluc3QgPSB0aGlzLl9nZXRJbnN0KCQoaWQpWzBdKSwKCQkJJGRwID0gaW5zdC5kcERpdjsKCQl0aGlzLl9iYXNlX2dvdG9Ub2RheShpZCk7CgkJdmFyIHRwX2luc3QgPSB0aGlzLl9nZXQoaW5zdCwgJ3RpbWVwaWNrZXInKTsKCQlzZWxlY3RMb2NhbFRpbWVab25lKHRwX2luc3QpOwoJCXZhciBub3cgPSBuZXcgRGF0ZSgpOwoJCXRoaXMuX3NldFRpbWUoaW5zdCwgbm93KTsKCQkkKCcudWktZGF0ZXBpY2tlci10b2RheScsICRkcCkuY2xpY2soKTsKCX07CgoJLyoKCSogRGlzYWJsZSAmIGVuYWJsZSB0aGUgVGltZSBpbiB0aGUgZGF0ZXRpbWVwaWNrZXIKCSovCgkkLmRhdGVwaWNrZXIuX2Rpc2FibGVUaW1lcGlja2VyRGF0ZXBpY2tlciA9IGZ1bmN0aW9uKHRhcmdldCkgewoJCXZhciBpbnN0ID0gdGhpcy5fZ2V0SW5zdCh0YXJnZXQpOwoJCWlmICghaW5zdCkgewoJCQlyZXR1cm47CgkJfQoKCQl2YXIgdHBfaW5zdCA9IHRoaXMuX2dldChpbnN0LCAndGltZXBpY2tlcicpOwoJCSQodGFyZ2V0KS5kYXRlcGlja2VyKCdnZXREYXRlJyk7IC8vIEluaXQgc2VsZWN0ZWRbWWVhcnxNb250aHxEYXldCgkJaWYgKHRwX2luc3QpIHsKCQkJdHBfaW5zdC5fZGVmYXVsdHMuc2hvd1RpbWVwaWNrZXIgPSBmYWxzZTsKCQkJdHBfaW5zdC5fdXBkYXRlRGF0ZVRpbWUoaW5zdCk7CgkJfQoJfTsKCgkkLmRhdGVwaWNrZXIuX2VuYWJsZVRpbWVwaWNrZXJEYXRlcGlja2VyID0gZnVuY3Rpb24odGFyZ2V0KSB7CgkJdmFyIGluc3QgPSB0aGlzLl9nZXRJbnN0KHRhcmdldCk7CgkJaWYgKCFpbnN0KSB7CgkJCXJldHVybjsKCQl9CgoJCXZhciB0cF9pbnN0ID0gdGhpcy5fZ2V0KGluc3QsICd0aW1lcGlja2VyJyk7CgkJJCh0YXJnZXQpLmRhdGVwaWNrZXIoJ2dldERhdGUnKTsgLy8gSW5pdCBzZWxlY3RlZFtZZWFyfE1vbnRofERheV0KCQlpZiAodHBfaW5zdCkgewoJCQl0cF9pbnN0Ll9kZWZhdWx0cy5zaG93VGltZXBpY2tlciA9IHRydWU7CgkJCXRwX2luc3QuX2FkZFRpbWVQaWNrZXIoaW5zdCk7IC8vIENvdWxkIGJlIGRpc2FibGVkIG9uIHBhZ2UgbG9hZAoJCQl0cF9pbnN0Ll91cGRhdGVEYXRlVGltZShpbnN0KTsKCQl9Cgl9OwoKCS8qCgkqIENyZWF0ZSBvdXIgb3duIHNldCB0aW1lIGZ1bmN0aW9uCgkqLwoJJC5kYXRlcGlja2VyLl9zZXRUaW1lID0gZnVuY3Rpb24oaW5zdCwgZGF0ZSkgewoJCXZhciB0cF9pbnN0ID0gdGhpcy5fZ2V0KGluc3QsICd0aW1lcGlja2VyJyk7CgkJaWYgKHRwX2luc3QpIHsKCQkJdmFyIGRlZmF1bHRzID0gdHBfaW5zdC5fZGVmYXVsdHM7CgoJCQkvLyBjYWxsaW5nIF9zZXRUaW1lIHdpdGggbm8gZGF0ZSBzZXRzIHRpbWUgdG8gZGVmYXVsdHMKCQkJdHBfaW5zdC5ob3VyID0gZGF0ZSA/IGRhdGUuZ2V0SG91cnMoKSA6IGRlZmF1bHRzLmhvdXI7CgkJCXRwX2luc3QubWludXRlID0gZGF0ZSA/IGRhdGUuZ2V0TWludXRlcygpIDogZGVmYXVsdHMubWludXRlOwoJCQl0cF9pbnN0LnNlY29uZCA9IGRhdGUgPyBkYXRlLmdldFNlY29uZHMoKSA6IGRlZmF1bHRzLnNlY29uZDsKCQkJdHBfaW5zdC5taWxsaXNlYyA9IGRhdGUgPyBkYXRlLmdldE1pbGxpc2Vjb25kcygpIDogZGVmYXVsdHMubWlsbGlzZWM7CgoJCQkvL2NoZWNrIGlmIHdpdGhpbiBtaW4vbWF4IHRpbWVzLi4gCgkJCXRwX2luc3QuX2xpbWl0TWluTWF4RGF0ZVRpbWUoaW5zdCwgdHJ1ZSk7CgoJCQl0cF9pbnN0Ll9vblRpbWVDaGFuZ2UoKTsKCQkJdHBfaW5zdC5fdXBkYXRlRGF0ZVRpbWUoaW5zdCk7CgkJfQoJfTsKCgkvKgoJKiBDcmVhdGUgbmV3IHB1YmxpYyBtZXRob2QgdG8gc2V0IG9ubHkgdGltZSwgY2FsbGFibGUgYXMgJCgpLmRhdGVwaWNrZXIoJ3NldFRpbWUnLCBkYXRlKQoJKi8KCSQuZGF0ZXBpY2tlci5fc2V0VGltZURhdGVwaWNrZXIgPSBmdW5jdGlvbih0YXJnZXQsIGRhdGUsIHdpdGhEYXRlKSB7CgkJdmFyIGluc3QgPSB0aGlzLl9nZXRJbnN0KHRhcmdldCk7CgkJaWYgKCFpbnN0KSB7CgkJCXJldHVybjsKCQl9CgoJCXZhciB0cF9pbnN0ID0gdGhpcy5fZ2V0KGluc3QsICd0aW1lcGlja2VyJyk7CgoJCWlmICh0cF9pbnN0KSB7CgkJCXRoaXMuX3NldERhdGVGcm9tRmllbGQoaW5zdCk7CgkJCXZhciB0cF9kYXRlOwoJCQlpZiAoZGF0ZSkgewoJCQkJaWYgKHR5cGVvZiBkYXRlID09ICJzdHJpbmciKSB7CgkJCQkJdHBfaW5zdC5fcGFyc2VUaW1lKGRhdGUsIHdpdGhEYXRlKTsKCQkJCQl0cF9kYXRlID0gbmV3IERhdGUoKTsKCQkJCQl0cF9kYXRlLnNldEhvdXJzKHRwX2luc3QuaG91ciwgdHBfaW5zdC5taW51dGUsIHRwX2luc3Quc2Vjb25kLCB0cF9pbnN0Lm1pbGxpc2VjKTsKCQkJCX0gZWxzZSB7CgkJCQkJdHBfZGF0ZSA9IG5ldyBEYXRlKGRhdGUuZ2V0VGltZSgpKTsKCQkJCX0KCQkJCWlmICh0cF9kYXRlLnRvU3RyaW5nKCkgPT0gJ0ludmFsaWQgRGF0ZScpIHsKCQkJCQl0cF9kYXRlID0gdW5kZWZpbmVkOwoJCQkJfQoJCQkJdGhpcy5fc2V0VGltZShpbnN0LCB0cF9kYXRlKTsKCQkJfQoJCX0KCgl9OwoKCS8qCgkqIG92ZXJyaWRlIHNldERhdGUoKSB0byBhbGxvdyBzZXR0aW5nIHRpbWUgdG9vIHdpdGhpbiBEYXRlIG9iamVjdAoJKi8KCSQuZGF0ZXBpY2tlci5fYmFzZV9zZXREYXRlRGF0ZXBpY2tlciA9ICQuZGF0ZXBpY2tlci5fc2V0RGF0ZURhdGVwaWNrZXI7CgkkLmRhdGVwaWNrZXIuX3NldERhdGVEYXRlcGlja2VyID0gZnVuY3Rpb24odGFyZ2V0LCBkYXRlKSB7CgkJdmFyIGluc3QgPSB0aGlzLl9nZXRJbnN0KHRhcmdldCk7CgkJaWYgKCFpbnN0KSB7CgkJCXJldHVybjsKCQl9CgoJCXZhciB0cF9kYXRlID0gKGRhdGUgaW5zdGFuY2VvZiBEYXRlKSA/IG5ldyBEYXRlKGRhdGUuZ2V0VGltZSgpKSA6IGRhdGU7CgoJCXRoaXMuX3VwZGF0ZURhdGVwaWNrZXIoaW5zdCk7CgkJdGhpcy5fYmFzZV9zZXREYXRlRGF0ZXBpY2tlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwoJCXRoaXMuX3NldFRpbWVEYXRlcGlja2VyKHRhcmdldCwgdHBfZGF0ZSwgdHJ1ZSk7Cgl9OwoKCS8qCgkqIG92ZXJyaWRlIGdldERhdGUoKSB0byBhbGxvdyBnZXR0aW5nIHRpbWUgdG9vIHdpdGhpbiBEYXRlIG9iamVjdAoJKi8KCSQuZGF0ZXBpY2tlci5fYmFzZV9nZXREYXRlRGF0ZXBpY2tlciA9ICQuZGF0ZXBpY2tlci5fZ2V0RGF0ZURhdGVwaWNrZXI7CgkkLmRhdGVwaWNrZXIuX2dldERhdGVEYXRlcGlja2VyID0gZnVuY3Rpb24odGFyZ2V0LCBub0RlZmF1bHQpIHsKCQl2YXIgaW5zdCA9IHRoaXMuX2dldEluc3QodGFyZ2V0KTsKCQlpZiAoIWluc3QpIHsKCQkJcmV0dXJuOwoJCX0KCgkJdmFyIHRwX2luc3QgPSB0aGlzLl9nZXQoaW5zdCwgJ3RpbWVwaWNrZXInKTsKCgkJaWYgKHRwX2luc3QpIHsKCQkJLy8gaWYgaXQgaGFzbid0IHlldCBiZWVuIGRlZmluZWQsIGdyYWIgZnJvbSBmaWVsZAoJCQlpZihpbnN0Lmxhc3RWYWwgPT09IHVuZGVmaW5lZCl7CgkJCQl0aGlzLl9zZXREYXRlRnJvbUZpZWxkKGluc3QsIG5vRGVmYXVsdCk7CgkJCX0KCgkJCXZhciBkYXRlID0gdGhpcy5fZ2V0RGF0ZShpbnN0KTsKCQkJaWYgKGRhdGUgJiYgdHBfaW5zdC5fcGFyc2VUaW1lKCQodGFyZ2V0KS52YWwoKSwgdHBfaW5zdC50aW1lT25seSkpIHsKCQkJCWRhdGUuc2V0SG91cnModHBfaW5zdC5ob3VyLCB0cF9pbnN0Lm1pbnV0ZSwgdHBfaW5zdC5zZWNvbmQsIHRwX2luc3QubWlsbGlzZWMpOwoJCQl9CgkJCXJldHVybiBkYXRlOwoJCX0KCQlyZXR1cm4gdGhpcy5fYmFzZV9nZXREYXRlRGF0ZXBpY2tlcih0YXJnZXQsIG5vRGVmYXVsdCk7Cgl9OwoKCS8qCgkqIG92ZXJyaWRlIHBhcnNlRGF0ZSgpIGJlY2F1c2UgVUkgMS44LjE0IHRocm93cyBhbiBlcnJvciBhYm91dCAiRXh0cmEgY2hhcmFjdGVycyIKCSogQW4gb3B0aW9uIGluIGRhdGFwaWNrZXIgdG8gaWdub3JlIGV4dHJhIGZvcm1hdCBjaGFyYWN0ZXJzIHdvdWxkIGJlIG5pY2VyLgoJKi8KCSQuZGF0ZXBpY2tlci5fYmFzZV9wYXJzZURhdGUgPSAkLmRhdGVwaWNrZXIucGFyc2VEYXRlOwoJJC5kYXRlcGlja2VyLnBhcnNlRGF0ZSA9IGZ1bmN0aW9uKGZvcm1hdCwgdmFsdWUsIHNldHRpbmdzKSB7CgkJdmFyIGRhdGU7CgkJdHJ5IHsKCQkJZGF0ZSA9IHRoaXMuX2Jhc2VfcGFyc2VEYXRlKGZvcm1hdCwgdmFsdWUsIHNldHRpbmdzKTsKCQl9IGNhdGNoIChlcnIpIHsKCQkJLy8gSGFjayEgIFRoZSBlcnJvciBtZXNzYWdlIGVuZHMgd2l0aCBhIGNvbG9uLCBhIHNwYWNlLCBhbmQKCQkJLy8gdGhlICJleHRyYSIgY2hhcmFjdGVycy4gIFdlIHJlbHkgb24gdGhhdCBpbnN0ZWFkIG9mCgkJCS8vIGF0dGVtcHRpbmcgdG8gcGVyZmVjdGx5IHJlcHJvZHVjZSB0aGUgcGFyc2luZyBhbGdvcml0aG0uCgkJCWRhdGUgPSB0aGlzLl9iYXNlX3BhcnNlRGF0ZShmb3JtYXQsIHZhbHVlLnN1YnN0cmluZygwLHZhbHVlLmxlbmd0aC0oZXJyLmxlbmd0aC1lcnIuaW5kZXhPZignOicpLTIpKSwgc2V0dGluZ3MpOwoJCQkkLmRhdGVwaWNrZXIubG9nKCJFcnJvciBwYXJzaW5nIHRoZSBkYXRlIHN0cmluZzogIiArIGVyciArICJcbmRhdGUgc3RyaW5nID0gIiArIHZhbHVlICsgIlxuZGF0ZSBmb3JtYXQgPSAiICsgZm9ybWF0KTsKCQl9CgkJcmV0dXJuIGRhdGU7Cgl9OwoKCS8qCgkqIG92ZXJyaWRlIGZvcm1hdERhdGUgdG8gc2V0IGRhdGUgd2l0aCB0aW1lIHRvIHRoZSBpbnB1dAoJKi8KCSQuZGF0ZXBpY2tlci5fYmFzZV9mb3JtYXREYXRlID0gJC5kYXRlcGlja2VyLl9mb3JtYXREYXRlOwoJJC5kYXRlcGlja2VyLl9mb3JtYXREYXRlID0gZnVuY3Rpb24oaW5zdCwgZGF5LCBtb250aCwgeWVhcikgewoJCXZhciB0cF9pbnN0ID0gdGhpcy5fZ2V0KGluc3QsICd0aW1lcGlja2VyJyk7CgkJaWYgKHRwX2luc3QpIHsKCQkJdHBfaW5zdC5fdXBkYXRlRGF0ZVRpbWUoaW5zdCk7CgkJCXJldHVybiB0cF9pbnN0LiRpbnB1dC52YWwoKTsKCQl9CgkJcmV0dXJuIHRoaXMuX2Jhc2VfZm9ybWF0RGF0ZShpbnN0KTsKCX07CgoJLyoKCSogb3ZlcnJpZGUgb3B0aW9ucyBzZXR0ZXIgdG8gYWRkIHRpbWUgdG8gbWF4RGF0ZShUaW1lKSBhbmQgbWluRGF0ZShUaW1lKS4gTWF4RGF0ZQoJKi8KCSQuZGF0ZXBpY2tlci5fYmFzZV9vcHRpb25EYXRlcGlja2VyID0gJC5kYXRlcGlja2VyLl9vcHRpb25EYXRlcGlja2VyOwoJJC5kYXRlcGlja2VyLl9vcHRpb25EYXRlcGlja2VyID0gZnVuY3Rpb24odGFyZ2V0LCBuYW1lLCB2YWx1ZSkgewoJCXZhciBpbnN0ID0gdGhpcy5fZ2V0SW5zdCh0YXJnZXQpLAoJICAgICAgICBuYW1lX2Nsb25lOwoJCWlmICghaW5zdCkgewoJCQlyZXR1cm4gbnVsbDsKCQl9CgoJCXZhciB0cF9pbnN0ID0gdGhpcy5fZ2V0KGluc3QsICd0aW1lcGlja2VyJyk7CgkJaWYgKHRwX2luc3QpIHsKCQkJdmFyIG1pbiA9IG51bGwsCgkJCQltYXggPSBudWxsLAoJCQkJb25zZWxlY3QgPSBudWxsLAoJCQkJb3ZlcnJpZGVzID0gdHBfaW5zdC5fZGVmYXVsdHMuZXZudHMsCgkJCQlmbnMgPSB7fSwKCQkJCXByb3A7CgkJICAgIGlmICh0eXBlb2YgbmFtZSA9PSAnc3RyaW5nJykgeyAvLyBpZiBtaW4vbWF4IHdhcyBzZXQgd2l0aCB0aGUgc3RyaW5nCgkJICAgICAgICBpZiAobmFtZSA9PT0gJ21pbkRhdGUnIHx8IG5hbWUgPT09ICdtaW5EYXRlVGltZScpIHsKCQkgICAgICAgICAgICBtaW4gPSB2YWx1ZTsKCQkgICAgICAgIH0gZWxzZSBpZiAobmFtZSA9PT0gJ21heERhdGUnIHx8IG5hbWUgPT09ICdtYXhEYXRlVGltZScpIHsKCQkgICAgICAgICAgICBtYXggPSB2YWx1ZTsKCQkgICAgICAgIH0gZWxzZSBpZiAobmFtZSA9PT0gJ29uU2VsZWN0JykgewoJCSAgICAgICAgICAgIG9uc2VsZWN0ID0gdmFsdWU7CgkJICAgICAgICB9IGVsc2UgaWYgKG92ZXJyaWRlcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkgewoJCSAgICAgICAgICAgIGlmICh0eXBlb2YgKHZhbHVlKSA9PT0gJ3VuZGVmaW5lZCcpIHsKCQkgICAgICAgICAgICAgICAgcmV0dXJuIG92ZXJyaWRlc1tuYW1lXTsKCQkgICAgICAgICAgICB9CgkJICAgICAgICAgICAgZm5zW25hbWVdID0gdmFsdWU7CgkJICAgICAgICAgICAgbmFtZV9jbG9uZSA9IHt9OyAvL2VtcHR5IHJlc3VsdHMgaW4gZXhpdGluZyBmdW5jdGlvbiBhZnRlciBvdmVycmlkZXMgdXBkYXRlZAoJCSAgICAgICAgfQoJCSAgICB9IGVsc2UgaWYgKHR5cGVvZiBuYW1lID09ICdvYmplY3QnKSB7IC8vaWYgbWluL21heCB3YXMgc2V0IHdpdGggdGhlIEpTT04KCQkgICAgICAgIGlmIChuYW1lLm1pbkRhdGUpIHsKCQkgICAgICAgICAgICBtaW4gPSBuYW1lLm1pbkRhdGU7CgkJICAgICAgICB9IGVsc2UgaWYgKG5hbWUubWluRGF0ZVRpbWUpIHsKCQkgICAgICAgICAgICBtaW4gPSBuYW1lLm1pbkRhdGVUaW1lOwoJCSAgICAgICAgfSBlbHNlIGlmIChuYW1lLm1heERhdGUpIHsKCQkgICAgICAgICAgICBtYXggPSBuYW1lLm1heERhdGU7CgkJICAgICAgICB9IGVsc2UgaWYgKG5hbWUubWF4RGF0ZVRpbWUpIHsKCQkgICAgICAgICAgICBtYXggPSBuYW1lLm1heERhdGVUaW1lOwoJCSAgICAgICAgfQoJCSAgICAgICAgZm9yIChwcm9wIGluIG92ZXJyaWRlcykgewoJCSAgICAgICAgICAgIGlmIChvdmVycmlkZXMuaGFzT3duUHJvcGVydHkocHJvcCkgJiYgbmFtZVtwcm9wXSkgewoJCSAgICAgICAgICAgICAgICBmbnNbcHJvcF0gPSBuYW1lW3Byb3BdOwoJCSAgICAgICAgICAgIH0KCQkgICAgICAgIH0KCQkgICAgfQoJCSAgICBmb3IgKHByb3AgaW4gZm5zKSB7CgkJICAgICAgICBpZiAoZm5zLmhhc093blByb3BlcnR5KHByb3ApKSB7CgkJICAgICAgICAgICAgb3ZlcnJpZGVzW3Byb3BdID0gZm5zW3Byb3BdOwoJCSAgICAgICAgICAgIGlmICghbmFtZV9jbG9uZSkgeyBuYW1lX2Nsb25lID0gJC5leHRlbmQoe30sIG5hbWUpO30KCQkgICAgICAgICAgICBkZWxldGUgbmFtZV9jbG9uZVtwcm9wXTsKCQkgICAgICAgIH0KCQkgICAgfQoJCSAgICBpZiAobmFtZV9jbG9uZSAmJiBpc0VtcHR5T2JqZWN0KG5hbWVfY2xvbmUpKSB7IHJldHVybjsgfQoJCSAgICBpZiAobWluKSB7IC8vaWYgbWluIHdhcyBzZXQKCQkgICAgICAgIGlmIChtaW4gPT09IDApIHsKCQkgICAgICAgICAgICBtaW4gPSBuZXcgRGF0ZSgpOwoJCSAgICAgICAgfSBlbHNlIHsKCQkgICAgICAgICAgICBtaW4gPSBuZXcgRGF0ZShtaW4pOwoJCSAgICAgICAgfQoJCSAgICAgICAgdHBfaW5zdC5fZGVmYXVsdHMubWluRGF0ZSA9IG1pbjsKCQkgICAgICAgIHRwX2luc3QuX2RlZmF1bHRzLm1pbkRhdGVUaW1lID0gbWluOwoJCSAgICB9IGVsc2UgaWYgKG1heCkgeyAvL2lmIG1heCB3YXMgc2V0CgkJICAgICAgICBpZiAobWF4ID09PSAwKSB7CgkJICAgICAgICAgICAgbWF4ID0gbmV3IERhdGUoKTsKCQkgICAgICAgIH0gZWxzZSB7CgkJICAgICAgICAgICAgbWF4ID0gbmV3IERhdGUobWF4KTsKCQkgICAgICAgIH0KCQkgICAgICAgIHRwX2luc3QuX2RlZmF1bHRzLm1heERhdGUgPSBtYXg7CgkJICAgICAgICB0cF9pbnN0Ll9kZWZhdWx0cy5tYXhEYXRlVGltZSA9IG1heDsKCQkgICAgfSBlbHNlIGlmIChvbnNlbGVjdCkgewoJCSAgICAgICAgdHBfaW5zdC5fZGVmYXVsdHMub25TZWxlY3QgPSBvbnNlbGVjdDsKCQkgICAgfQoJCX0KCQlpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgewoJCQlyZXR1cm4gdGhpcy5fYmFzZV9vcHRpb25EYXRlcGlja2VyLmNhbGwoJC5kYXRlcGlja2VyLCB0YXJnZXQsIG5hbWUpOwoJCX0KCQlyZXR1cm4gdGhpcy5fYmFzZV9vcHRpb25EYXRlcGlja2VyLmNhbGwoJC5kYXRlcGlja2VyLCB0YXJnZXQsIG5hbWVfY2xvbmUgfHwgbmFtZSwgdmFsdWUpOwoJfTsKCS8qCgkqIGpRdWVyeSBpc0VtcHR5T2JqZWN0IGRvZXMgbm90IGNoZWNrIGhhc093blByb3BlcnR5IC0gaWYgc29tZW9uZSBoYXMgYWRkZWQgdG8gdGhlIG9iamVjdCBwcm90b3R5cGUsCgkqIGl0IHdpbGwgcmV0dXJuIGZhbHNlIGZvciBhbGwgb2JqZWN0cwoJKi8KCXZhciBpc0VtcHR5T2JqZWN0ID0gZnVuY3Rpb24ob2JqKSB7CgkJdmFyIHByb3A7CgkJZm9yIChwcm9wIGluIG9iaikgewoJCQlpZiAob2JqLmhhc093blByb3BlcnR5KG9iaikpIHsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCX0KCQlyZXR1cm4gdHJ1ZTsKCX07CgoJLyoKCSogalF1ZXJ5IGV4dGVuZCBub3cgaWdub3JlcyBudWxscyEKCSovCgl2YXIgZXh0ZW5kUmVtb3ZlID0gZnVuY3Rpb24odGFyZ2V0LCBwcm9wcykgewoJCSQuZXh0ZW5kKHRhcmdldCwgcHJvcHMpOwoJCWZvciAodmFyIG5hbWUgaW4gcHJvcHMpIHsKCQkJaWYgKHByb3BzW25hbWVdID09PSBudWxsIHx8IHByb3BzW25hbWVdID09PSB1bmRlZmluZWQpIHsKCQkJCXRhcmdldFtuYW1lXSA9IHByb3BzW25hbWVdOwoJCQl9CgkJfQoJCXJldHVybiB0YXJnZXQ7Cgl9OwoKCS8qCgkqIERldGVybWluZSBieSB0aGUgdGltZSBmb3JtYXQgaWYgc2hvdWxkIHVzZSBhbXBtCgkqIFJldHVybnMgdHJ1ZSBpZiBzaG91bGQgdXNlIGFtcG0sIGZhbHNlIGlmIG5vdAoJKi8KCXZhciB1c2VBbXBtID0gZnVuY3Rpb24odGltZUZvcm1hdCl7CgkJcmV0dXJuICh0aW1lRm9ybWF0LmluZGV4T2YoJ3QnKSAhPT0gLTEgJiYgdGltZUZvcm1hdC5pbmRleE9mKCdoJykgIT09IC0xKTsKCX07CgoJLyoKCSogQ29udmVydHMgMjQgaG91ciBmb3JtYXQgaW50byAxMiBob3VyCgkqIFJldHVybnMgMTIgaG91ciB3aXRob3V0IGxlYWRpbmcgMAoJKi8KCXZhciBjb252ZXJ0MjR0bzEyID0gZnVuY3Rpb24oaG91cikgewoJCWlmIChob3VyID4gMTIpIHsKCQkJaG91ciA9IGhvdXIgLSAxMjsKCQl9CgoJCWlmIChob3VyID09IDApIHsKCQkJaG91ciA9IDEyOwoJCX0KCgkJcmV0dXJuIFN0cmluZyhob3VyKTsKCX07CgoJLyoKCSogU3BsaXRzIGRhdGV0aW1lIHN0cmluZyBpbnRvIGRhdGUgYW5zIHRpbWUgc3Vic3RyaW5ncy4KCSogVGhyb3dzIGV4Y2VwdGlvbiB3aGVuIGRhdGUgY2FuJ3QgYmUgcGFyc2VkCgkqIFJldHVybnMgW2RhdGVTdHJpbmcsIHRpbWVTdHJpbmddCgkqLwoJdmFyIHNwbGl0RGF0ZVRpbWUgPSBmdW5jdGlvbihkYXRlRm9ybWF0LCBkYXRlVGltZVN0cmluZywgZGF0ZVNldHRpbmdzLCB0aW1lU2V0dGluZ3MpIHsKCQl0cnkgewoJCQkvLyBUaGUgaWRlYSBpcyB0byBnZXQgdGhlIG51bWJlciBzZXBhcmF0b3Igb2NjdXJhbmNlcyBpbiBkYXRldGltZSBhbmQgdGhlIHRpbWUgZm9ybWF0IHJlcXVlc3RlZCAoc2luY2UgdGltZSBoYXMgCgkJCS8vIGZld2VyIHVua25vd25zLCBtb3N0bHkgbnVtYmVycyBhbmQgYW0vcG0pLiBXZSB3aWxsIHVzZSB0aGUgdGltZSBwYXR0ZXJuIHRvIHNwbGl0LgoJCQl2YXIgc2VwYXJhdG9yID0gdGltZVNldHRpbmdzICYmIHRpbWVTZXR0aW5ncy5zZXBhcmF0b3IgPyB0aW1lU2V0dGluZ3Muc2VwYXJhdG9yIDogJC50aW1lcGlja2VyLl9kZWZhdWx0cy5zZXBhcmF0b3IsCgkJCQlmb3JtYXQgPSB0aW1lU2V0dGluZ3MgJiYgdGltZVNldHRpbmdzLnRpbWVGb3JtYXQgPyB0aW1lU2V0dGluZ3MudGltZUZvcm1hdCA6ICQudGltZXBpY2tlci5fZGVmYXVsdHMudGltZUZvcm1hdCwKCQkJCXRpbWVQYXJ0cyA9IGZvcm1hdC5zcGxpdChzZXBhcmF0b3IpLCAvLyBob3cgbWFueSBvY2N1cmFuY2VzIG9mIHNlcGFyYXRvciBtYXkgYmUgaW4gb3VyIGZvcm1hdD8KCQkJCXRpbWVQYXJ0c0xlbiA9IHRpbWVQYXJ0cy5sZW5ndGgsCgkJCQlhbGxQYXJ0cyA9IGRhdGVUaW1lU3RyaW5nLnNwbGl0KHNlcGFyYXRvciksCgkJCQlhbGxQYXJ0c0xlbiA9IGFsbFBhcnRzLmxlbmd0aDsKCgkJCWlmIChhbGxQYXJ0c0xlbiA+IDEpIHsKCQkJCXJldHVybiBbCgkJCQkJCWFsbFBhcnRzLnNwbGljZSgwLGFsbFBhcnRzTGVuLXRpbWVQYXJ0c0xlbikuam9pbihzZXBhcmF0b3IpLAoJCQkJCQlhbGxQYXJ0cy5zcGxpY2UoMCx0aW1lUGFydHNMZW4pLmpvaW4oc2VwYXJhdG9yKQoJCQkJCV07CgkJCX0KCgkJfSBjYXRjaCAoZXJyKSB7CgkJCSQuZGF0ZXBpY2tlci5sb2coJ0NvdWxkIG5vdCBzcGxpdCB0aGUgZGF0ZSBmcm9tIHRoZSB0aW1lLiBQbGVhc2UgY2hlY2sgdGhlIGZvbGxvd2luZyBkYXRldGltZXBpY2tlciBvcHRpb25zJyArCgkJCQkJIlxudGhyb3duIGVycm9yOiAiICsgZXJyICsKCQkJCQkiXG5kYXRlVGltZVN0cmluZyIgKyBkYXRlVGltZVN0cmluZyArCgkJCQkJIlxuZGF0ZUZvcm1hdCA9ICIgKyBkYXRlRm9ybWF0ICsKCQkJCQkiXG5zZXBhcmF0b3IgPSAiICsgdGltZVNldHRpbmdzLnNlcGFyYXRvciArCgkJCQkJIlxudGltZUZvcm1hdCA9ICIgKyB0aW1lU2V0dGluZ3MudGltZUZvcm1hdCk7CgoJCQlpZiAoZXJyLmluZGV4T2YoIjoiKSA+PSAwKSB7CgkJCQkvLyBIYWNrISAgVGhlIGVycm9yIG1lc3NhZ2UgZW5kcyB3aXRoIGEgY29sb24sIGEgc3BhY2UsIGFuZAoJCQkJLy8gdGhlICJleHRyYSIgY2hhcmFjdGVycy4gIFdlIHJlbHkgb24gdGhhdCBpbnN0ZWFkIG9mCgkJCQkvLyBhdHRlbXB0aW5nIHRvIHBlcmZlY3RseSByZXByb2R1Y2UgdGhlIHBhcnNpbmcgYWxnb3JpdGhtLgoJCQkJdmFyIGRhdGVTdHJpbmdMZW5ndGggPSBkYXRlVGltZVN0cmluZy5sZW5ndGggLSAoZXJyLmxlbmd0aCAtIGVyci5pbmRleE9mKCc6JykgLSAyKSwKCQkJCQl0aW1lU3RyaW5nID0gZGF0ZVRpbWVTdHJpbmcuc3Vic3RyaW5nKGRhdGVTdHJpbmdMZW5ndGgpOwoKCQkJCXJldHVybiBbJC50cmltKGRhdGVUaW1lU3RyaW5nLnN1YnN0cmluZygwLCBkYXRlU3RyaW5nTGVuZ3RoKSksICQudHJpbShkYXRlVGltZVN0cmluZy5zdWJzdHJpbmcoZGF0ZVN0cmluZ0xlbmd0aCkpXTsKCgkJCX0gZWxzZSB7CgkJCQl0aHJvdyBlcnI7CgkJCX0KCQl9CgkJcmV0dXJuIFtkYXRlVGltZVN0cmluZywgJyddOwoJfTsKCgkvKgoJKiBJbnRlcm5hbCBmdW5jdGlvbiB0byBwYXJzZSBkYXRldGltZSBpbnRlcnZhbAoJKiBSZXR1cm5zOiB7ZGF0ZTogRGF0ZSwgdGltZU9iajogT2JqZWN0fSwgd2hlcmUKCSogICBkYXRlIC0gcGFyc2VkIGRhdGUgd2l0aG91dCB0aW1lICh0eXBlIERhdGUpCgkqICAgdGltZU9iaiA9IHtob3VyOiAsIG1pbnV0ZTogLCBzZWNvbmQ6ICwgbWlsbGlzZWM6IH0gLSBwYXJzZWQgdGltZS4gT3B0aW9uYWwKCSovCgl2YXIgcGFyc2VEYXRlVGltZUludGVybmFsID0gZnVuY3Rpb24oZGF0ZUZvcm1hdCwgdGltZUZvcm1hdCwgZGF0ZVRpbWVTdHJpbmcsIGRhdGVTZXR0aW5ncywgdGltZVNldHRpbmdzKSB7CgkJdmFyIGRhdGU7CgkJdmFyIHNwbGl0UmVzID0gc3BsaXREYXRlVGltZShkYXRlRm9ybWF0LCBkYXRlVGltZVN0cmluZywgZGF0ZVNldHRpbmdzLCB0aW1lU2V0dGluZ3MpOwoJCWRhdGUgPSAkLmRhdGVwaWNrZXIuX2Jhc2VfcGFyc2VEYXRlKGRhdGVGb3JtYXQsIHNwbGl0UmVzWzBdLCBkYXRlU2V0dGluZ3MpOwoJCWlmIChzcGxpdFJlc1sxXSAhPT0gJycpIHsKCQkJdmFyIHRpbWVTdHJpbmcgPSBzcGxpdFJlc1sxXSwKCQkJCXBhcnNlZFRpbWUgPSAkLmRhdGVwaWNrZXIucGFyc2VUaW1lKHRpbWVGb3JtYXQsIHRpbWVTdHJpbmcsIHRpbWVTZXR0aW5ncyk7CgoJCQlpZiAocGFyc2VkVGltZSA9PT0gbnVsbCkgewoJCQkJdGhyb3cgJ1dyb25nIHRpbWUgZm9ybWF0JzsKCQkJfQoJCQlyZXR1cm4gewoJCQkJZGF0ZTogZGF0ZSwKCQkJCXRpbWVPYmo6IHBhcnNlZFRpbWUKCQkJfTsKCQl9IGVsc2UgewoJCQlyZXR1cm4gewoJCQkJZGF0ZTogZGF0ZQoJCQl9OwoJCX0KCX07CgoJLyoKCSogSW50ZXJuYWwgZnVuY3Rpb24gdG8gc2V0IHRpbWV6b25lX3NlbGVjdCB0byB0aGUgbG9jYWwgdGltZXpvbmUKCSovCgl2YXIgc2VsZWN0TG9jYWxUaW1lWm9uZSA9IGZ1bmN0aW9uKHRwX2luc3QsIGRhdGUpIHsKCQlpZiAodHBfaW5zdCAmJiB0cF9pbnN0LnRpbWV6b25lX3NlbGVjdCkgewoJCQl0cF9pbnN0Ll9kZWZhdWx0cy51c2VMb2NhbFRpbWV6b25lID0gdHJ1ZTsKCQkJdmFyIG5vdyA9IHR5cGVvZiBkYXRlICE9PSAndW5kZWZpbmVkJyA/IGRhdGUgOiBuZXcgRGF0ZSgpOwoJCQl2YXIgdHpvZmZzZXQgPSAkLnRpbWVwaWNrZXIudGltZVpvbmVPZmZzZXRTdHJpbmcobm93KTsKCQkJaWYgKHRwX2luc3QuX2RlZmF1bHRzLnRpbWV6b25lSXNvODYwMSkgewoJCQkJdHpvZmZzZXQgPSB0em9mZnNldC5zdWJzdHJpbmcoMCwgMykgKyAnOicgKyB0em9mZnNldC5zdWJzdHJpbmcoMyk7CgkJCX0KCQkJdHBfaW5zdC50aW1lem9uZV9zZWxlY3QudmFsKHR6b2Zmc2V0KTsKCQl9Cgl9OwoKCS8qCgkqIENyZWF0ZSBhIFNpbmdsZXRvbiBJbnNhbmNlCgkqLwoJJC50aW1lcGlja2VyID0gbmV3IFRpbWVwaWNrZXIoKTsKCgkvKioKCSAqIEdldCB0aGUgdGltZXpvbmUgb2Zmc2V0IGFzIHN0cmluZyBmcm9tIGEgZGF0ZSBvYmplY3QgKGVnICcrMDUzMCcgZm9yIFVUQys1LjUpCgkgKiBAcGFyYW0gIGRhdGUKCSAqIEByZXR1cm4gc3RyaW5nCgkgKi8KCSQudGltZXBpY2tlci50aW1lWm9uZU9mZnNldFN0cmluZyA9IGZ1bmN0aW9uKGRhdGUpIHsKCQl2YXIgb2ZmID0gZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpICogLTEsCgkJCW1pbnV0ZXMgPSBvZmYgJSA2MCwKCQkJaG91cnMgPSAob2ZmIC0gbWludXRlcykgLyA2MDsKCQlyZXR1cm4gKG9mZiA+PSAwID8gJysnIDogJy0nKSArICgnMCcgKyAoaG91cnMgKiAxMDEpLnRvU3RyaW5nKCkpLnN1YnN0cigtMikgKyAoJzAnICsgKG1pbnV0ZXMgKiAxMDEpLnRvU3RyaW5nKCkpLnN1YnN0cigtMik7Cgl9OwoKCS8qKgoJICogQ2FsbHMgYHRpbWVwaWNrZXIoKWAgb24gdGhlIGBzdGFydFRpbWVgIGFuZCBgZW5kVGltZWAgZWxlbWVudHMsIGFuZCBjb25maWd1cmVzIHRoZW0gdG8KCSAqIGVuZm9yY2UgZGF0ZSByYW5nZSBsaW1pdHMuCgkgKiBuLmIuIFRoZSBpbnB1dCB2YWx1ZSBtdXN0IGJlIGNvcnJlY3RseSBmb3JtYXR0ZWQgKHJlZm9ybWF0dGluZyBpcyBub3Qgc3VwcG9ydGVkKQoJICogQHBhcmFtICBFbGVtZW50IHN0YXJ0VGltZQoJICogQHBhcmFtICBFbGVtZW50IGVuZFRpbWUKCSAqIEBwYXJhbSAgb2JqIG9wdGlvbnMgT3B0aW9ucyBmb3IgdGhlIHRpbWVwaWNrZXIoKSBjYWxsCgkgKiBAcmV0dXJuIGpRdWVyeQoJICovCgkkLnRpbWVwaWNrZXIudGltZVJhbmdlID0gZnVuY3Rpb24oc3RhcnRUaW1lLCBlbmRUaW1lLCBvcHRpb25zKSB7CgkJcmV0dXJuICQudGltZXBpY2tlci5oYW5kbGVSYW5nZSgndGltZXBpY2tlcicsIHN0YXJ0VGltZSwgZW5kVGltZSwgb3B0aW9ucyk7Cgl9OwoKCS8qKgoJICogQ2FsbHMgYGRhdGV0aW1lcGlja2VyYCBvbiB0aGUgYHN0YXJ0VGltZWAgYW5kIGBlbmRUaW1lYCBlbGVtZW50cywgYW5kIGNvbmZpZ3VyZXMgdGhlbSB0bwoJICogZW5mb3JjZSBkYXRlIHJhbmdlIGxpbWl0cy4KCSAqIEBwYXJhbSAgRWxlbWVudCBzdGFydFRpbWUKCSAqIEBwYXJhbSAgRWxlbWVudCBlbmRUaW1lCgkgKiBAcGFyYW0gIG9iaiBvcHRpb25zIE9wdGlvbnMgZm9yIHRoZSBgdGltZXBpY2tlcigpYCBjYWxsLiBBbHNvIHN1cHBvcnRzIGByZWZvcm1hdGAsCgkgKiAgIGEgYm9vbGVhbiB2YWx1ZSB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlZm9ybWF0IHRoZSBpbnB1dCB2YWx1ZXMgdG8gdGhlIGBkYXRlRm9ybWF0YC4KCSAqIEBwYXJhbSAgc3RyaW5nIG1ldGhvZCBDYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSB0eXBlIG9mIHBpY2tlciB0byBiZSBhZGRlZAoJICogQHJldHVybiBqUXVlcnkKCSAqLwoJJC50aW1lcGlja2VyLmRhdGVUaW1lUmFuZ2UgPSBmdW5jdGlvbihzdGFydFRpbWUsIGVuZFRpbWUsIG9wdGlvbnMpIHsKCQkkLnRpbWVwaWNrZXIuZGF0ZVJhbmdlKHN0YXJ0VGltZSwgZW5kVGltZSwgb3B0aW9ucywgJ2RhdGV0aW1lcGlja2VyJyk7Cgl9OwoKCS8qKgoJICogQ2FsbHMgYG1ldGhvZGAgb24gdGhlIGBzdGFydFRpbWVgIGFuZCBgZW5kVGltZWAgZWxlbWVudHMsIGFuZCBjb25maWd1cmVzIHRoZW0gdG8KCSAqIGVuZm9yY2UgZGF0ZSByYW5nZSBsaW1pdHMuCgkgKiBAcGFyYW0gIEVsZW1lbnQgc3RhcnRUaW1lCgkgKiBAcGFyYW0gIEVsZW1lbnQgZW5kVGltZQoJICogQHBhcmFtICBvYmogb3B0aW9ucyBPcHRpb25zIGZvciB0aGUgYHRpbWVwaWNrZXIoKWAgY2FsbC4gQWxzbyBzdXBwb3J0cyBgcmVmb3JtYXRgLAoJICogICBhIGJvb2xlYW4gdmFsdWUgdGhhdCBjYW4gYmUgdXNlZCB0byByZWZvcm1hdCB0aGUgaW5wdXQgdmFsdWVzIHRvIHRoZSBgZGF0ZUZvcm1hdGAuCgkgKiBAcGFyYW0gIHN0cmluZyBtZXRob2QgQ2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgdHlwZSBvZiBwaWNrZXIgdG8gYmUgYWRkZWQKCSAqIEByZXR1cm4galF1ZXJ5CgkgKi8KCSQudGltZXBpY2tlci5kYXRlUmFuZ2UgPSBmdW5jdGlvbihzdGFydFRpbWUsIGVuZFRpbWUsIG9wdGlvbnMsIG1ldGhvZCkgewoJCW1ldGhvZCA9IG1ldGhvZCB8fCAnZGF0ZXBpY2tlcic7CgkJJC50aW1lcGlja2VyLmhhbmRsZVJhbmdlKG1ldGhvZCwgc3RhcnRUaW1lLCBlbmRUaW1lLCBvcHRpb25zKTsKCX07CgoJLyoqCgkgKiBDYWxscyBgbWV0aG9kYCBvbiB0aGUgYHN0YXJ0VGltZWAgYW5kIGBlbmRUaW1lYCBlbGVtZW50cywgYW5kIGNvbmZpZ3VyZXMgdGhlbSB0bwoJICogZW5mb3JjZSBkYXRlIHJhbmdlIGxpbWl0cy4KCSAqIEBwYXJhbSAgc3RyaW5nIG1ldGhvZCBDYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSB0eXBlIG9mIHBpY2tlciB0byBiZSBhZGRlZAoJICogQHBhcmFtICBFbGVtZW50IHN0YXJ0VGltZQoJICogQHBhcmFtICBFbGVtZW50IGVuZFRpbWUKCSAqIEBwYXJhbSAgb2JqIG9wdGlvbnMgT3B0aW9ucyBmb3IgdGhlIGB0aW1lcGlja2VyKClgIGNhbGwuIEFsc28gc3VwcG9ydHMgYHJlZm9ybWF0YCwKCSAqICAgYSBib29sZWFuIHZhbHVlIHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVmb3JtYXQgdGhlIGlucHV0IHZhbHVlcyB0byB0aGUgYGRhdGVGb3JtYXRgLgoJICogQHJldHVybiBqUXVlcnkKCSAqLwoJJC50aW1lcGlja2VyLmhhbmRsZVJhbmdlID0gZnVuY3Rpb24obWV0aG9kLCBzdGFydFRpbWUsIGVuZFRpbWUsIG9wdGlvbnMpIHsKCQkkLmZuW21ldGhvZF0uY2FsbChzdGFydFRpbWUsICQuZXh0ZW5kKHsKCQkJb25DbG9zZTogZnVuY3Rpb24oZGF0ZVRleHQsIGluc3QpIHsKCQkJCWNoZWNrRGF0ZXModGhpcywgZW5kVGltZSwgZGF0ZVRleHQpOwoJCQl9LAoJCQlvblNlbGVjdDogZnVuY3Rpb24oc2VsZWN0ZWREYXRlVGltZSkgewoJCQkJc2VsZWN0ZWQodGhpcywgZW5kVGltZSwgJ21pbkRhdGUnKTsKCQkJfQoJCX0sIG9wdGlvbnMsIG9wdGlvbnMuc3RhcnQpKTsKCQkkLmZuW21ldGhvZF0uY2FsbChlbmRUaW1lLCAkLmV4dGVuZCh7CgkJCW9uQ2xvc2U6IGZ1bmN0aW9uKGRhdGVUZXh0LCBpbnN0KSB7CgkJCQljaGVja0RhdGVzKHRoaXMsIHN0YXJ0VGltZSwgZGF0ZVRleHQpOwoJCQl9LAoJCQlvblNlbGVjdDogZnVuY3Rpb24oc2VsZWN0ZWREYXRlVGltZSkgewoJCQkJc2VsZWN0ZWQodGhpcywgc3RhcnRUaW1lLCAnbWF4RGF0ZScpOwoJCQl9CgkJfSwgb3B0aW9ucywgb3B0aW9ucy5lbmQpKTsKCQkvLyB0aW1lcGlja2VyIGRvZXNuJ3QgcHJvdmlkZSBhY2Nlc3MgdG8gaXRzICd0aW1lRm9ybWF0JyBvcHRpb24sIAoJCS8vIG5vciBjb3VsZCBJIGdldCBkYXRlcGlja2VyLmZvcm1hdFRpbWUoKSB0byBiZWhhdmUgd2l0aCB0aW1lcywgc28gSQoJCS8vIGhhdmUgZGlzYWJsZWQgcmVmb3JtYXR0aW5nIGZvciB0aW1lcGlja2VyCgkJaWYgKG1ldGhvZCAhPSAndGltZXBpY2tlcicgJiYgb3B0aW9ucy5yZWZvcm1hdCkgewoJCQkkKFtzdGFydFRpbWUsIGVuZFRpbWVdKS5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJdmFyIGZvcm1hdCA9ICQodGhpcylbbWV0aG9kXS5jYWxsKCQodGhpcyksICdvcHRpb24nLCAnZGF0ZUZvcm1hdCcpLAoJCQkJCWRhdGUgPSBuZXcgRGF0ZSgkKHRoaXMpLnZhbCgpKTsKCQkJCWlmICgkKHRoaXMpLnZhbCgpICYmIGRhdGUpIHsKCQkJCQkkKHRoaXMpLnZhbCgkLmRhdGVwaWNrZXIuZm9ybWF0RGF0ZShmb3JtYXQsIGRhdGUpKTsKCQkJCX0KCQkJfSk7CgkJfQoJCWNoZWNrRGF0ZXMoc3RhcnRUaW1lLCBlbmRUaW1lLCBzdGFydFRpbWUudmFsKCkpOwoKCQlmdW5jdGlvbiBjaGVja0RhdGVzKGNoYW5nZWQsIG90aGVyLCBkYXRlVGV4dCkgewoJCQlpZiAob3RoZXIudmFsKCkgJiYgKG5ldyBEYXRlKHN0YXJ0VGltZS52YWwoKSkgPiBuZXcgRGF0ZShlbmRUaW1lLnZhbCgpKSkpIHsKCQkJCW90aGVyLnZhbChkYXRlVGV4dCk7CgkJCX0KCQl9CgkJc2VsZWN0ZWQoc3RhcnRUaW1lLCBlbmRUaW1lLCAnbWluRGF0ZScpOwoJCXNlbGVjdGVkKGVuZFRpbWUsIHN0YXJ0VGltZSwgJ21heERhdGUnKTsKCgkJZnVuY3Rpb24gc2VsZWN0ZWQoY2hhbmdlZCwgb3RoZXIsIG9wdGlvbikgewoJCQlpZiAoISQoY2hhbmdlZCkudmFsKCkpIHsKCQkJCXJldHVybjsKCQkJfQoJCQl2YXIgZGF0ZSA9ICQoY2hhbmdlZClbbWV0aG9kXS5jYWxsKCQoY2hhbmdlZCksICdnZXREYXRlJyk7CgkJCS8vIHRpbWVwaWNrZXIgZG9lc24ndCBpbXBsZW1lbnQgJ2dldERhdGUnIGFuZCByZXR1cm5zIGEgalF1ZXJ5CgkJCWlmIChkYXRlLmdldFRpbWUpIHsKCQkJCSQob3RoZXIpW21ldGhvZF0uY2FsbCgkKG90aGVyKSwgJ29wdGlvbicsIG9wdGlvbiwgZGF0ZSk7CgkJCX0KCQl9CgkJcmV0dXJuICQoW3N0YXJ0VGltZS5nZXQoMCksIGVuZFRpbWUuZ2V0KDApXSk7Cgl9OwoKCS8qCgkqIEtlZXAgdXAgd2l0aCB0aGUgdmVyc2lvbgoJKi8KCSQudGltZXBpY2tlci52ZXJzaW9uID0gIjEuMS4xIjsKCn0pKGpRdWVyeSk7]]></data>
	</file>
	<file>
	  <filename>/lib/js/mColorPicker.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[77u/LyoNCiAgbUNvbG9yUGlja2VyDQogIFZlcnNpb246IDEuMCByMzkNCg0KICBDb3B5cmlnaHQgKGMpIDIwMTAgTWV0YTEwMCBMTEMuDQogIGh0dHA6Ly93d3cubWV0YTEwMC5jb20vDQoNCiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlDQogIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwDQoqLw0KIWZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlLGY9YShkb2N1bWVudCksZz1hKCI8ZGl2PiIpLGg9YSgiPGRpdj4iKSxpPWEoIjxkaXY+Iiksaj1hKCI8aW5wdXQ+Iiksaz0vXnJnYlthXT9cKChcZCspLFxzKihcZCspLFxzKihcZCspKCxccyooXGQrXC5cZCspKik/XCkvLGw9LyhbYS1mMC05XSkoW2EtZjAtOV0pKFthLWYwLTldKS8sbT0vI1thLWYwLTldezN9LyxuPS8jW2EtZjAtOV17Nn0vO2EuZm4ubUNvbG9yUGlja2VyPWZ1bmN0aW9uKGQpe3ZhciBlPWEuZm4ubUNvbG9yUGlja2VyLmdldENvb2tpZSgic3dhdGNoZXMiKTtyZXR1cm4gYj1hLmV4dGVuZChhLmZuLm1Db2xvclBpY2tlci5kZWZhdWx0cyxkKSxhLmZuLm1Db2xvclBpY2tlci5kZWZhdWx0cy5zd2F0Y2hlcy5jb25jYXQoYi5zd2F0Y2hlcykuc2xpY2UoLTEwKSxjLmVuaGFuY2VkU3dhdGNoZXMmJmUmJihiLnN3YXRjaGVzPWUuc3BsaXQoInx8IikuY29uY2F0KGIuc3dhdGNoZXMpLnNsaWNlKDAsMTApfHxiLnN3YXRjaGVzKSxhKCJkaXYjbUNvbG9yUGlja2VyIikubGVuZ3RofHxhLmZuLm1Db2xvclBpY2tlci5kcmF3UGlja2VyKCksYSgiI2Nzc19kaXNhYmxlZF9jb2xvcl9waWNrZXIiKS5sZW5ndGh8fGEoImhlYWQiKS5wcmVwZW5kKCc8bWV0YSBkYXRhLXJlbW92ZS1tZT0idHJ1ZSIvPjxzdHlsZSBpZD0iY3NzX2Rpc2FibGVkX2NvbG9yX3BpY2tlciIgdHlwZT0idGV4dC9jc3MiPi5tQ29sb3JQaWNrZXJbZGlzYWJsZWRdICsgc3BhbiwgLm1Db2xvclBpY2tlcltkaXNhYmxlZD0iZGlzYWJsZWQiXSArIHNwYW4sIC5tQ29sb3JQaWNrZXJbZGlzYWJsZWQ9InRydWUiXSArIHNwYW4ge2ZpbHRlcjphbHBoYShvcGFjaXR5PTUwKTstbW96LW9wYWNpdHk6MC41Oy13ZWJraXQtb3BhY2l0eTowLjU7LWtodG1sLW9wYWNpdHk6IDAuNTtvcGFjaXR5OiAwLjU7Y3Vyc29yOmRlZmF1bHQ7fTwvc3R5bGU+JyksYSgibWV0YVtkYXRhLXJlbW92ZS1tZT10cnVlXSIpLnJlbW92ZSgpLHRoaXMuZWFjaChhLmZuLm1Db2xvclBpY2tlci5kcmF3UGlja2VyVHJpZ2dlcnMpLHRoaXN9LGEuZm4ubUNvbG9yUGlja2VyLmluaXQ9e3JlcGxhY2U6Ilt0eXBlPWNvbG9yXSIsaW5kZXg6MCxlbmhhbmNlZFN3YXRjaGVzOiEwLGFsbG93VHJhbnNwYXJlbmN5OiEwLHNsb2dhbjoiTWV0YTEwMCAtIERlc2lnbmluZyBGdW4iLHNob3dMb2dvOiEwfSxhLmZuLm1Db2xvclBpY2tlci5kZWZhdWx0cz17Y3VycmVudElkOiExLGN1cnJlbnRJbnB1dDohMSxjdXJyZW50Q29sb3I6ITEsY2hhbmdlQ29sb3I6ITEsY29sb3I6ITEsaW1hZ2VGb2xkZXI6ImltYWdlcy8iLHN3YXRjaGVzOiIjZmZmZmZmLCNmZmZmMDAsIzAwZmYwMCwjMDBmZmZmLCMwMDAwZmYsI2ZmMDBmZiwjZmYwMDAwLCM0YzJiMTEsIzNiM2IzYiwjMDAwMDAwIi5zcGxpdCgiLCIpfSxhLmZuLm1Db2xvclBpY2tlci5zdGFydD1mdW5jdGlvbigpe2EoJ2lucHV0W2RhdGEtbWNvbG9ycGlja2VyIT0idHJ1ZSJdJykuZmlsdGVyKGZ1bmN0aW9uKCl7cmV0dXJuIlt0eXBlPWNvbG9yXSI9PWMucmVwbGFjZT8iY29sb3IiPT10aGlzLmdldEF0dHJpYnV0ZSgidHlwZSIpOmEodGhpcykuaXMoYy5yZXBsYWNlKX0pLm1Db2xvclBpY2tlcigpfSxhLmZuLm1Db2xvclBpY2tlci5ldmVudHM9ZnVuY3Rpb24oKXthKCIjbUNvbG9yUGlja2VyQmciKS5saXZlKCJjbGljayIsYS5mbi5tQ29sb3JQaWNrZXIuY2xvc2VQaWNrZXIpLGEoIi5tQ29sb3JQaWNrZXIiKS5saXZlKCJrZXl1cCIsZnVuY3Rpb24oKXt0cnl7YSh0aGlzKS5jc3MoeyJiYWNrZ3JvdW5kLWNvbG9yIjphKHRoaXMpLnZhbCgpfSkuY3NzKHtjb2xvcjphLmZuLm1Db2xvclBpY2tlci50ZXh0Q29sb3IoYSh0aGlzKS5jc3MoImJhY2tncm91bmQtY29sb3IiKSl9KS50cmlnZ2VyKCJjaGFuZ2UiKX1jYXRjaChhKXt9fSksYSgiLm1Db2xvclBpY2tlclRyaWdnZXIiKS5saXZlKCJjbGljayIsYS5mbi5tQ29sb3JQaWNrZXIuY29sb3JTaG93KSxhKCIubUNvbG9yLCAubVBhc3RDb2xvciIpLmxpdmUoIm1vdXNlbW92ZSIsZnVuY3Rpb24oYyl7aWYoIWIuY2hhbmdlQ29sb3IpcmV0dXJuITE7dmFyIGQ9YSh0aGlzKSxlPWQub2Zmc2V0KCksZj1iLmN1cnJlbnRJbnB1dCxmPWYuYXR0cigiZGF0YS1oZXgiKXx8Zi5hdHRyKCJoZXgiKTtiLmNvbG9yPWQuY3NzKCJiYWNrZ3JvdW5kLWNvbG9yIiksZC5oYXNDbGFzcygibVBhc3RDb2xvciIpP2IuY29sb3I9YS5mbi5tQ29sb3JQaWNrZXIuc2V0Q29sb3IoYi5jb2xvcixmKTpkLmhhc0NsYXNzKCJtQ29sb3JUcmFuc3BhcmVudCIpP2IuY29sb3I9InRyYW5zcGFyZW50IjpkLmhhc0NsYXNzKCJtUGFzdENvbG9yIil8fChiLmNvbG9yPWEuZm4ubUNvbG9yUGlja2VyLndoaWNoQ29sb3IoYy5wYWdlWC1lLmxlZnQsYy5wYWdlWS1lLnRvcCxmKSksYi5jdXJyZW50SW5wdXQubVNldElucHV0Q29sb3IoYi5jb2xvcil9KS5saXZlKCJjbGljayIsYS5mbi5tQ29sb3JQaWNrZXIuY29sb3JQaWNrZWQpLGEoIiNtQ29sb3JQaWNrZXJJbnB1dCIpLmxpdmUoImtleXVwIixmdW5jdGlvbihjKXt0cnl7Yi5jb2xvcj1hKHRoaXMpLnZhbCgpLGIuY3VycmVudElucHV0Lm1TZXRJbnB1dENvbG9yKGIuY29sb3IpLDEzPT1jLndoaWNoJiZhLmZuLm1Db2xvclBpY2tlci5jb2xvclBpY2tlZCgpfWNhdGNoKGEpe319KS5saXZlKCJibHVyIixmdW5jdGlvbigpe2IuY3VycmVudElucHV0Lm1TZXRJbnB1dENvbG9yKGIuY29sb3IpfSksYSgiI21Db2xvclBpY2tlcldyYXBwZXIiKS5saXZlKCJtb3VzZWxlYXZlIixmdW5jdGlvbigpe2lmKCFiLmNoYW5nZUNvbG9yKXJldHVybiExO3ZhciBjPWIuY3VycmVudElucHV0O2IuY3VycmVudElucHV0Lm1TZXRJbnB1dENvbG9yKGEuZm4ubUNvbG9yUGlja2VyLnNldENvbG9yKGIuY3VycmVudENvbG9yLGMuYXR0cigiZGF0YS1oZXgiKXx8Yy5hdHRyKCJoZXgiKSkpfSl9LGEuZm4ubUNvbG9yUGlja2VyLmRyYXdQaWNrZXJUcmlnZ2Vycz1mdW5jdGlvbigpe3ZhciBkPWEodGhpcyksZj1kLmF0dHIoImlkIil8fCJjb2xvcl8iK2MuaW5kZXgrKyxnPSJoaWRkZW4iPT1kLmF0dHIoInRleHQiKXx8ImhpZGRlbiI9PWQuYXR0cigiZGF0YS10ZXh0IiksaD1hLmZuLm1Db2xvclBpY2tlci5zZXRDb2xvcihkLnZhbCgpLGQuYXR0cigiZGF0YS1oZXgiKXx8ZC5hdHRyKCJoZXgiKSksaT1kLndpZHRoKCksaj1kLmhlaWdodCgpLGs9ZC5jc3MoImZsb2F0IiksbD1hKCI8c3Bhbj4iKSxtPWEoIjxzcGFuPiIpLG49IiI7cmV0dXJuIGwuYXR0cih7aWQ6ImNvbG9yX3dvcmtfYXJlYSIsY2xhc3M6Im1Db2xvclBpY2tlcklucHV0In0pLmFwcGVuZFRvKGUpLG0uYXR0cih7aWQ6Im1jcF8iK2YsY2xhc3M6Im1Db2xvclBpY2tlclRyaWdnZXIifSkuY3NzKHtkaXNwbGF5OiJpbmxpbmUtYmxvY2siLGN1cnNvcjoicG9pbnRlciJ9KS5pbnNlcnRBZnRlcihkKSxhKCI8aW1nPiIpLmF0dHIoe3NyYzpiLmltYWdlRm9sZGVyKyJjb2xvci5wbmcifSkuY3NzKHtib3JkZXI6MCxtYXJnaW46IjAgMCAwIDNweCIsInZlcnRpY2FsLWFsaWduIjoidGV4dC1ib3R0b20ifSkuYXBwZW5kVG8obSksbC5hcHBlbmQoZCksbj1sLmh0bWwoKS5yZXBsYWNlKC90eXBlPVteYS16IF0qY29sb3JbXmEteiBcL1wvPl0qL2dpLCd0eXBlPSInKyhnPyJoaWRkZW4iOiJ0ZXh0IikrJyInKSxsLmh0bWwoIiIpLnJlbW92ZSgpLGQ9YShuKS5hdHRyKCJpZCIsZikuYWRkQ2xhc3MoIm1Db2xvclBpY2tlciIpLnZhbChoKS5pbnNlcnRCZWZvcmUobSksZyYmbS5jc3Moe2JvcmRlcjoiMXB4IHNvbGlkIGJsYWNrIixmbG9hdDprLHdpZHRoOmksaGVpZ2h0Omp9KS5hZGRDbGFzcyhkLmF0dHIoImNsYXNzIikpLmh0bWwoIiZuYnNwOyIpLGQubVNldElucHV0Q29sb3IoaCksZH0sYS5mbi5tQ29sb3JQaWNrZXIuZHJhd1BpY2tlcj1mdW5jdGlvbigpe3ZhciBmPWEoIjxkaXY+IiksbD0oYSgiPGE+IiksYSgiPGRpdj4iKSksbT1hKCI8ZGl2PiIpO2ZvcihoLmF0dHIoe2lkOiJtQ29sb3JQaWNrZXJCZyJ9KS5jc3Moe2Rpc3BsYXk6Im5vbmUiLGJhY2tncm91bmQ6ImJsYWNrIixvcGFjaXR5Oi4wMSxwb3NpdGlvbjoiYWJzb2x1dGUiLHRvcDowLHJpZ2h0OjAsYm90dG9tOjAsbGVmdDowfSkuYXBwZW5kVG8oZSksZy5hdHRyKHtpZDoibUNvbG9yUGlja2VyIiwiZGF0YS1tY29sb3JwaWNrZXIiOiEwfSkuY3NzKHtwb3NpdGlvbjoiYWJzb2x1dGUiLGJvcmRlcjoiMXB4IHNvbGlkICNjY2MiLGNvbG9yOiIjZmZmIix3aWR0aDoiMTk0cHgiLGhlaWdodDoiMTg0cHgiLCJmb250LXNpemUiOiIxMnB4IiwiZm9udC1mYW1pbHkiOiJ0aW1lcyIsZGlzcGxheToibm9uZSJ9KS5hcHBlbmRUbyhlKSxpLmF0dHIoe2lkOiJtQ29sb3JQaWNrZXJUZXN0In0pLmNzcyh7ZGlzcGxheToibm9uZSJ9KS5hcHBlbmRUbyhlKSxtLmF0dHIoe2lkOiJtQ29sb3JQaWNrZXJXcmFwcGVyIn0pLmNzcyh7cG9zaXRpb246InJlbGF0aXZlIixib3JkZXI6InNvbGlkIDFweCBncmF5In0pLmFwcGVuZFRvKGcpLGEoIjxkaXY+IikuYXR0cih7aWQ6Im1Db2xvclBpY2tlckltZyIsY2xhc3M6Im1Db2xvciJ9KS5jc3Moe2hlaWdodDoiMTM2cHgiLHdpZHRoOiIxOTJweCIsYm9yZGVyOjAsY3Vyc29yOiJjcm9zc2hhaXIiLCJiYWNrZ3JvdW5kLWltYWdlIjoidXJsKCIrYi5pbWFnZUZvbGRlcisicGlja2VyLnBuZykifSkuYXBwZW5kVG8obSksZi5hdHRyKHtpZDoibUNvbG9yUGlja2VyU3dhdGNoZXMifSkuY3NzKHsiYm9yZGVyLXJpZ2h0IjoiMXB4IHNvbGlkICMwMDAifSkuYXBwZW5kVG8obSksYSgiPGRpdj4iKS5hZGRDbGFzcygibUNsZWFyIikuY3NzKHtjbGVhcjoiYm90aCJ9KS5hcHBlbmRUbyhmKSxkPTk7LTE8ZDtkLS0pYSgiPGRpdj4iKS5hdHRyKHtpZDoiY2VsbCIrZCxjbGFzczoibVBhc3RDb2xvciIrKDA8ZD8iIG1Ob0xlZnRCb3JkZXIiOiIiKX0pLmNzcyh7ImJhY2tncm91bmQtY29sb3IiOmIuc3dhdGNoZXNbZF0udG9Mb3dlckNhc2UoKSxoZWlnaHQ6IjE4cHgiLHdpZHRoOiIxOHB4Iixib3JkZXI6IjFweCBzb2xpZCAjMDAwIixmbG9hdDoibGVmdCJ9KS5odG1sKCImbmJzcDsiKS5wcmVwZW5kVG8oZik7bC5hdHRyKHtpZDoibUNvbG9yUGlja2VyRm9vdGVyIn0pLmNzcyh7ImJhY2tncm91bmQtaW1hZ2UiOiJ1cmwoIitiLmltYWdlRm9sZGVyKyJncmlkLmdpZikiLHBvc2l0aW9uOiJyZWxhdGl2ZSJ9KS5hcHBlbmRUbyhtKSxqLmF0dHIoe2lkOiJtQ29sb3JQaWNrZXJJbnB1dCIsdHlwZToidGV4dCJ9KS5jc3Moe2JvcmRlcjoic29saWQgMXB4IGdyYXkiLCJmb250LXNpemUiOiIxMHB0IixtYXJnaW46IjNweCIsd2lkdGg6IjgwcHgifSkuYXBwZW5kVG8obCksYy5hbGxvd1RyYW5zcGFyZW5jeSYmYSgiPHNwYW4+IikuYXR0cih7aWQ6Im1Db2xvclBpY2tlclRyYW5zcGFyZW50IixjbGFzczoibUNvbG9yIG1Db2xvclRyYW5zcGFyZW50In0pLmNzcyh7ImZvbnQtc2l6ZSI6IjE2cHgiLGNvbG9yOiIjMDAwIiwicGFkZGluZy1yaWdodCI6IjEwcHgiLCJwYWRkaW5nLXRvcCI6IjZweCIsY3Vyc29yOiJwb2ludGVyIixvdmVyZmxvdzoiaGlkZGVuIixmbG9hdDoicmlnaHQifSkudGV4dCgidHJhbnNwYXJlbnQiKS5hcHBlbmRUbyhsKSxhKCIubU5vTGVmdEJvcmRlciIpLmNzcyh7ImJvcmRlci1sZWZ0IjowfSl9LGEuZm4ubUNvbG9yUGlja2VyLmNsb3NlUGlja2VyPWZ1bmN0aW9uKCl7aC5oaWRlKCksZy5mYWRlT3V0KCl9LGEuZm4ubUNvbG9yUGlja2VyLmNvbG9yU2hvdz1mdW5jdGlvbigpe3ZhciBjPWEodGhpcyksZD1jLmF0dHIoImlkIikucmVwbGFjZSgibWNwXyIsIiIpLGU9Yy5vZmZzZXQoKSxpPWEoIiMiK2QpLGs9ZS50b3ArYy5vdXRlckhlaWdodCgpLGw9ZS5sZWZ0O2lmKGkuYXR0cigiZGlzYWJsZWQiKSlyZXR1cm4hMTtiLmN1cnJlbnRDb2xvcj1pLmNzcygiYmFja2dyb3VuZC1jb2xvciIpLGIuY2hhbmdlQ29sb3I9ITAsYi5jdXJyZW50SW5wdXQ9aSxiLmN1cnJlbnRJZD1kLGsrZy5oZWlnaHQoKT5mLmhlaWdodCgpJiYoaz1lLnRvcC1nLmhlaWdodCgpKSxsK2cud2lkdGgoKT5mLndpZHRoKCkmJihsPWUubGVmdC1nLndpZHRoKCkrYy5vdXRlcldpZHRoKCkpLGcuY3NzKHt0b3A6aysicHgiLGxlZnQ6bCsicHgifSkuZmFkZUluKCJmYXN0IiksaC5zaG93KCksYi5jb2xvcj1hKCIjIitkKS5hdHRyKCJkYXRhLXRleHQiKT9jLmNzcygiYmFja2dyb3VuZC1jb2xvciIpOmkuY3NzKCJiYWNrZ3JvdW5kLWNvbG9yIiksYi5jb2xvcj1hLmZuLm1Db2xvclBpY2tlci5zZXRDb2xvcihiLmNvbG9yLGkuYXR0cigiZGF0YS1oZXgiKXx8aS5hdHRyKCJoZXgiKSksai52YWwoYi5jb2xvcil9LGEuZm4ubUNvbG9yUGlja2VyLnNldElucHV0Q29sb3I9ZnVuY3Rpb24oYixjKXthKCIjIitiKS5tU2V0SW5wdXRDb2xvcihjKX0sYS5mbi5tU2V0SW5wdXRDb2xvcj1mdW5jdGlvbihjKXt2YXIgZD1hKHRoaXMpLGU9eyJiYWNrZ3JvdW5kLWNvbG9yIjpjLCJiYWNrZ3JvdW5kLWltYWdlIjoidHJhbnNwYXJlbnQiPT1jPyJ1cmwoJyIrYi5pbWFnZUZvbGRlcisiZ3JpZC5naWYnKSI6IiIsY29sb3I6YS5mbi5tQ29sb3JQaWNrZXIudGV4dENvbG9yKGMpfTsoZC5hdHRyKCJkYXRhLXRleHQiKXx8ZC5hdHRyKCJ0ZXh0IikpJiZkLm5leHQoKS5jc3MoZSksZC52YWwoYykuY3NzKGUpLnRyaWdnZXIoImNoYW5nZSIpLGoudmFsKGMpfSxhLmZuLm1Db2xvclBpY2tlci50ZXh0Q29sb3I9ZnVuY3Rpb24oYil7cmV0dXJuIGI9YS5mbi5tQ29sb3JQaWNrZXIuUkdCdG9IZXgoYiksdm9pZCAwPT09Ynx8InRyYW5zcGFyZW50Ij09Yj8iYmxhY2siOjQwMD5wYXJzZUludChiLnN1YnN0cigxLDIpLDE2KStwYXJzZUludChiLnN1YnN0cigzLDIpLDE2KStwYXJzZUludChiLnN1YnN0cig1LDIpLDE2KT8id2hpdGUiOiJibGFjayJ9LGEuZm4ubUNvbG9yUGlja2VyLnNldENvb2tpZT1mdW5jdGlvbihhLGIsYyl7YT1hKyI9Iitlc2NhcGUoYiksYj1uZXcgRGF0ZSxiLnNldERhdGUoYi5nZXREYXRlKCkrYyksYSs9IjsgZXhwaXJlcz0iK2IudG9HTVRTdHJpbmcoKSxkb2N1bWVudC5jb29raWU9YX0sYS5mbi5tQ29sb3JQaWNrZXIuZ2V0Q29va2llPWZ1bmN0aW9uKGEpe3JldHVybihhPWRvY3VtZW50LmNvb2tpZS5tYXRjaCgiKF58OykgPyIrYSsiPShbXjtdKikoO3wkKSIpKT91bmVzY2FwZShhWzJdKTpudWxsfSxhLmZuLm1Db2xvclBpY2tlci5jb2xvclBpY2tlZD1mdW5jdGlvbigpe2IuY2hhbmdlQ29sb3I9ITEsYS5mbi5tQ29sb3JQaWNrZXIuY2xvc2VQaWNrZXIoKSxhLmZuLm1Db2xvclBpY2tlci5hZGRUb1N3YXRjaCgpLGIuY3VycmVudElucHV0LnRyaWdnZXIoImNvbG9ycGlja2VkIil9LGEuZm4ubUNvbG9yUGlja2VyLmFkZFRvU3dhdGNoPWZ1bmN0aW9uKGUpe2lmKCFjLmVuaGFuY2VkU3dhdGNoZXMpcmV0dXJuITE7dmFyIGY9W107ZD0wLCJzdHJpbmciPT10eXBlb2YgZSYmKGIuY29sb3I9ZSksInRyYW5zcGFyZW50IiE9Yi5jb2xvciYmKGZbMF09YS5mbi5tQ29sb3JQaWNrZXIuaGV4VG9SR0IoYi5jb2xvcikpLGEoIi5tUGFzdENvbG9yIikuZWFjaChmdW5jdGlvbigpe3ZhciBjPWEodGhpcyk7Yi5jb2xvcj1hLmZuLm1Db2xvclBpY2tlci5oZXhUb1JHQihjLmNzcygiYmFja2dyb3VuZC1jb2xvciIpKSxiLmNvbG9yIT1mWzBdJiZmLmxlbmd0aDwxMCYmKGZbZi5sZW5ndGhdPWIuY29sb3IpLGMuY3NzKCJiYWNrZ3JvdW5kLWNvbG9yIixmW2QrK10pfSksYy5lbmhhbmNlZFN3YXRjaGVzJiZhLmZuLm1Db2xvclBpY2tlci5zZXRDb29raWUoInN3YXRjaGVzIixmLmpvaW4oInx8IiksMzY1KX0sYS5mbi5tQ29sb3JQaWNrZXIud2hpY2hDb2xvcj1mdW5jdGlvbihiLGMsZCl7dmFyIGU9WzI1NSwyNTUsMjU1XTszMj5iPyhlWzFdPTgqYixlWzJdPTApOjY0PmI/KGVbMF09MjU2LTgqKGItMzIpLGVbMl09MCk6OTY+Yj8oZVswXT0wLGVbMl09OCooYi02NCkpOjEyOD5iPyhlWzBdPTAsZVsxXT0yNTYtOCooYi05NikpOjE2MD5iPyhlWzBdPTgqKGItMTI4KSxlWzFdPTApOihlWzFdPTAsZVsyXT0yNTYtOCooYi0xNjApKTtmb3IodmFyIGY9MDszPmY7ZisrKTY0PmM/ZVtmXSs9KDI1Ni1lW2ZdKSooNjQtYykvNjQ6MTI4Pj1jP2VbZl0tPWVbZl0qKGMtNjQpLzY0OjEyODxjJiYoZVtmXT0yNTYtYi8xOTIqMjU2KSxlW2ZdPU1hdGgucm91bmQoTWF0aC5taW4oZVtmXSwyNTUpKSwidHJ1ZSI9PWQmJihlW2ZdPWEuZm4ubUNvbG9yUGlja2VyLmRlY1RvSGV4KGVbZl0pKTtyZXR1cm4idHJ1ZSI9PWQ/IiMiK2Uuam9pbigiIik6InJnYigiK2Uuam9pbigiLCAiKSsiKSJ9LGEuZm4ubUNvbG9yUGlja2VyLnNldENvbG9yPWZ1bmN0aW9uKGIsYyl7cmV0dXJuInRydWUiPT1jP2EuZm4ubUNvbG9yUGlja2VyLlJHQnRvSGV4KGIpOmEuZm4ubUNvbG9yUGlja2VyLmhleFRvUkdCKGIpfSxhLmZuLm1Db2xvclBpY2tlci5jb2xvclRlc3Q9ZnVuY3Rpb24oYSl7cmV0dXJuIGkuY3NzKCJiYWNrZ3JvdW5kLWNvbG9yIixhKSxpLmNzcygiYmFja2dyb3VuZC1jb2xvciIpfSxhLmZuLm1Db2xvclBpY2tlci5kZWNUb0hleD1mdW5jdGlvbihhKXtyZXR1cm4gYT1wYXJzZUludChhKSwiMDEyMzQ1Njc4OUFCQ0RFRiIuY2hhckF0KE1hdGguZmxvb3IoYS8xNikpKyIiKyIwMTIzNDU2Nzg5QUJDREVGIi5jaGFyQXQoYS0xNipNYXRoLmZsb29yKGEvMTYpKX0sYS5mbi5tQ29sb3JQaWNrZXIuUkdCdG9IZXg9ZnVuY3Rpb24oYil7dmFyIGQsYz0iIyIsYj0hIWImJmIudG9Mb3dlckNhc2UoKTtpZighYilyZXR1cm4iIjtpZihuLnRlc3QoYikpcmV0dXJuIGIuc3Vic3RyKDAsNyk7aWYobS50ZXN0KGIpKXJldHVybiBiLnJlcGxhY2UobCwiJDEkMSQyJDIkMyQzIikuc3Vic3RyKDAsNyk7aWYoZD1iLm1hdGNoKGspKXtmb3IoYj0xOzQ+YjtiKyspYys9YS5mbi5tQ29sb3JQaWNrZXIuZGVjVG9IZXgoZFtiXSk7cmV0dXJuIGN9cmV0dXJuIGEuZm4ubUNvbG9yUGlja2VyLmNvbG9yVGVzdChiKX0sYS5mbi5tQ29sb3JQaWNrZXIuaGV4VG9SR0I9ZnVuY3Rpb24oYil7cmV0dXJuIGI9ISFiJiZiLnRvTG93ZXJDYXNlKCksYj9rLnRlc3QoYik/YjptLnRlc3QoYik/KG4udGVzdChiKXx8KGI9Yi5yZXBsYWNlKGwsIiQxJDEkMiQyJDMkMyIpKSwicmdiKCIrcGFyc2VJbnQoYi5zdWJzdHIoMSwyKSwxNikrIiwgIitwYXJzZUludChiLnN1YnN0cigzLDIpLDE2KSsiLCAiK3BhcnNlSW50KGIuc3Vic3RyKDUsMiksMTYpKyIpIik6YS5mbi5tQ29sb3JQaWNrZXIuY29sb3JUZXN0KGIpOiIifSxjPWEuZm4ubUNvbG9yUGlja2VyLmluaXQsZi5yZWFkeShmdW5jdGlvbigpe2U9YSgiYm9keSIpLGEuZm4ubUNvbG9yUGlja2VyLmV2ZW50cygpLGMucmVwbGFjZSYmKCJmdW5jdGlvbiI9PXR5cGVvZiBhLmZuLm1ET011cGRhdGU/YSgiaW5wdXQiKS5tRE9NdXBkYXRlKGEuZm4ubUNvbG9yUGlja2VyLnN0YXJ0KToiZnVuY3Rpb24iPT10eXBlb2YgYS5mbi5saXZlcXVlcnk/YSgiaW5wdXQiKS5saXZlcXVlcnkoYS5mbi5tQ29sb3JQaWNrZXIuc3RhcnQpOihhLmZuLm1Db2xvclBpY2tlci5zdGFydCgpLGYubGl2ZSgiYWpheFN1Y2Nlc3MubUNvbG9yUGlja2VyIixhLmZuLm1Db2xvclBpY2tlci5zdGFydCkpKX0pfShqUXVlcnkpOw==]]></data>
	</file>
	<file>
	  <filename>/method.install.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIE1vZHVsZTogRUNCMiAtIEV4dGVuZGVkIENvbnRlbnQgQmxvY2tzIDIKIyBBdXRob3I6IENocmlzIFRheWxvcgojIENvcHlyaWdodDogKEMpIDIwMTYgQ2hyaXMgVGF5bG9yLCBjaHJpc0BiaW5ub3ZhdGl2ZS5jby51awojIExpY2VuY2U6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMwojICAgICAgICAgIHNlZSAvRUNCMi9sYW5nL0xJQ0VOQ0UudHh0IG9yIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoKaWYgKCFpc3NldCgkZ0NtcykpIGV4aXQ7CgojIyBub3RoaW5nIHRvIGRvCgoK]]></data>
	</file>
	<file>
	  <filename>/method.uninstall.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIE1vZHVsZTogRUNCMiAtIEV4dGVuZGVkIENvbnRlbnQgQmxvY2tzIDIKIyBBdXRob3I6IENocmlzIFRheWxvcgojIENvcHlyaWdodDogKEMpIDIwMTYgQ2hyaXMgVGF5bG9yLCBjaHJpc0BiaW5ub3ZhdGl2ZS5jby51awojIExpY2VuY2U6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMwojICAgICAgICAgIHNlZSAvRUNCMi9sYW5nL0xJQ0VOQ0UudHh0IG9yIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoKaWYgKCFpc3NldCgkZ0NtcykpIGV4aXQ7CgoKLy8gcmVtb3ZlIHRoZSBwZXJtaXNzaW9ucwokdGhpcy0+UmVtb3ZlUGVybWlzc2lvbihVU0VfRUNCMik7CiR0aGlzLT5SZW1vdmVQcmVmZXJlbmNlKCk7CiR0aGlzLT5EZWxldGVUZW1wbGF0ZSgpOwoKCg==]]></data>
	</file>
	<file>
	  <filename>/method.upgrade.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIE1vZHVsZTogRUNCMiAtIEV4dGVuZGVkIENvbnRlbnQgQmxvY2tzIDIKIyBBdXRob3I6IENocmlzIFRheWxvcgojIENvcHlyaWdodDogKEMpIDIwMTYgQ2hyaXMgVGF5bG9yLCBjaHJpc0BiaW5ub3ZhdGl2ZS5jby51awojIExpY2VuY2U6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMwojICAgICAgICAgIHNlZSAvRUNCMi9sYW5nL0xJQ0VOQ0UudHh0IG9yIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoKaWYgKCFpc3NldCgkZ0NtcykpIGV4aXQ7CgovLyByZW1vdmUgcGVybWlzc2lvbiBVU0VfRUNCMgpkZWZpbmUoJ1VTRV9FQ0IyJywgJ1VzZSBFeHRlbmRlZCBDb250ZW50IEJsb2NrcyAyJyk7CiRkYiA9ICR0aGlzLT5HZXREYigpOwppZiAoIHZlcnNpb25fY29tcGFyZSgkb2xkdmVyc2lvbiwgJzEuNCcpIDwgMCApIHsKICAgJHRoaXMtPlJlbW92ZVBlcm1pc3Npb24oVVNFX0VDQjIpOwp9CgoKPz4=]]></data>
	</file>
	<file>
	  <filename>/moduleinfo.ini</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[W21vZHVsZV0KbmFtZSA9ICJFQ0IyIgp2ZXJzaW9uID0gIjEuNS4xIgphdXRob3IgPSAiQ2hyaXMgVGF5bG9yICh0d2l0dGVyLmNvbS9LaXdpQ2hyaXNCVCkiCmF1dGhvcmVtYWlsID0gImNocmlzQGJpbm5vdmF0aXZlLmNvLnVrIgptaW5jbXN2ZXJzaW9uID0gMi4wCmxhenlsb2FkYWRtaW4gPSAwCmxhenlsb2FkZnJvbnRlbmQgPSAxCltkZXBlbmRzXQpDR0V4dGVuc2lvbnMgPSAxLjM4Cg==]]></data>
	</file>
	<file>
	  <filename>/templates/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/templates/input_repeater_template.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[eyogaW5wdXRfcmVwZWF0ZXJfdGVtcGxhdGUudHBsIC0gdjEuMCAtIDE1RmViMTkNCg0KICAgLSB2MS4wIC0gMTVGZWIxOSAtIGluaXRpYWwNCg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqfQ0KICAgeyRkZXNjcmlwdGlvbn0NCiAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGlkPSJ7JGJsb2NrX25hbWV9IiBuYW1lPSJ7JGJsb2NrX25hbWV9IiB2YWx1ZT0ieyR2YWx1ZX0iIHNpemU9IjEwMCIvPg0KDQogICA8ZGl2IGlkPSJ7JGJsb2NrX25hbWV9LXJlcGVhdGVyIiBjbGFzcz0iZWNiX3JlcGVhdGVyIiBkYXRhLXBhcmVudD0iI3skYmxvY2tfbmFtZX0iPg0Ke2ZvcmVhY2ggJGZpZWxkcyBhcyAkZmllbGR9DQogICAgICA8ZGl2IGNsYXNzPSJyZXBlYXRlci13cmFwcGVyIj4NCiAgICAgICAgIDxpbnB1dCBpZD0icmVwZWF0ZXItZmllbGQteyRibG9ja19uYW1lfS17JGZpZWxkQGl0ZXJhdGlvbn0iIGNsYXNzPSJyZXBlYXRlci1maWVsZCIgc2l6ZT0ieyRzaXplfSIgbWF4bGVuZ3RoPSJ7JG1heF9sZW5ndGh9IiB2YWx1ZT0ieyRmaWVsZH0iIGRhdGEtcmVwZWF0ZXI9IiN7JGJsb2NrX25hbWV9LXJlcGVhdGVyIi8+DQogICAgICAgICA8YnV0dG9uIGNsYXNzPSJlY2IyLXJlcGVhdGVyLWFkZCBlY2IyLWJ1dHRvbi1pbmxpbmUgdWktYnV0dG9uIHVpLXdpZGdldCB1aS1zdGF0ZS1kZWZhdWx0IHVpLWNvcm5lci1hbGwgdWktYnV0dG9uLXRleHQtaWNvbi1wcmltYXJ5IiBkYXRhLXJlcGVhdGVyPSIjeyRibG9ja19uYW1lfS1yZXBlYXRlciIgdGl0bGU9InskdGl0bGVfYWRkX2xpbmV9IiByb2xlPSJidXR0b24iIGFyaWEtZGlzYWJsZWQ9ImZhbHNlIj4rPC9idXR0b24+DQogICAgICAgICA8YnV0dG9uIGNsYXNzPSJlY2IyLXJlcGVhdGVyLXJlbW92ZSBlY2IyLWJ1dHRvbi1pbmxpbmUgdWktYnV0dG9uIHVpLXdpZGdldCB1aS1zdGF0ZS1kZWZhdWx0IHVpLWNvcm5lci1hbGwgdWktYnV0dG9uLXRleHQtaWNvbi1wcmltYXJ5IiBkYXRhLXJlcGVhdGVyPSIjeyRibG9ja19uYW1lfS1yZXBlYXRlciIgdGl0bGU9InskdGl0bGVfcmVtb3ZlX2xpbmV9IiByb2xlPSJidXR0b24iIGFyaWEtZGlzYWJsZWQ9ImZhbHNlIj4mbWludXM7PC9idXR0b24+DQogICAgICA8L2Rpdj4NCnsvZm9yZWFjaH0NCiAgIDwvZGl2Pg==]]></data>
	</file>
	<file>
	  <filename>/templates/sortablelist_template.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[eyogc29ydGFibGVsaXN0X3RlbXBsYXRlLnRwbCAtIHYxLjEgLSAxNUZlYjE5DQoNCiAgIC0gdjEuMSAtIDE1RmViMTkgLSByZW1vdmVkIG91dHB1dCBvZiBqcyAmIGNzcyAtIG5vdyBtb2R1bGUgd2lkZSBvbiBmaXJzdCBjYWxsDQogICAtIHYxLjAgLSAxOEFwcjE3IC0gMXN0IHZlcnNpb24NCg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqfQ0KDQo8aW5wdXQgdHlwZT0iaGlkZGVuIiBpZD0ieyRzZWxlY3RhcmVhX3ByZWZpeH0iIG5hbWU9Inskc2VsZWN0YXJlYV9wcmVmaXh9IiB2YWx1ZT0ieyRzZWxlY3RlZF9zdHJ9IiBzaXplPSIxMDAiLz4NCjxkaXYgY2xhc3M9ImNfZnVsbCBjZiBlY2IyLWNiIHskc2VsZWN0YXJlYV9wcmVmaXh9Ij4NCiAgICA8ZGl2IGNsYXNzPSJncmlkXzYgYWxwaGEiPg0KICAgICAgICA8ZmllbGRzZXQ+DQogICAgICAgICAgICA8bGVnZW5kPntpZiAkbGFiZWxMZWZ0IT0nJ317JGxhYmVsTGVmdH17ZWxzZX17JG1vZC0+TGFuZygnY29udGVudF9ibG9ja19sYWJlbF9zZWxlY3RlZCcpfXsvaWZ9PC9sZWdlbmQ+DQogICAgICAgICAgICA8ZGl2IGlkPSJzZWxlY3RlZC1pdGVtcyI+DQogICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJzb3J0YWJsZS1lY2IyLWxpc3Qgc29ydGFibGUtbGlzdCBzZWxlY3RlZC1pdGVtcyIgZGF0YS1jbXNtcy1jYi1pbnB1dD0ieyRzZWxlY3RhcmVhX3ByZWZpeH0iDQogICAgICAgICAgICAgICAge2lmICRtYXhOdW1iZXJ9IGRhdGEtbWF4LW51bWJlcj0ieyRtYXhOdW1iZXJ9InsvaWZ9e2lmICRyZXF1aXJlZE51bWJlcn0gZGF0YS1yZXF1aXJlZC1udW1iZXI9InskcmVxdWlyZWROdW1iZXJ9InsvaWZ9Pg0KICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9InBsYWNlaG9sZGVyIG5vLXNvcnQge2lmICRzZWxlY3RlZHxAY291bnQ+MH0gaGlkZGVuey9pZn0iPntpZiAkcmVxdWlyZWROdW1iZXJ9eyRtb2QtPkxhbmcoJ2Ryb3BfcmVxdWlyZWRfaXRlbXMnLCAkcmVxdWlyZWROdW1iZXIpfXtlbHNlfXskbW9kLT5MYW5nKCdkcm9wX2l0ZW1zJyl9ey9pZn08L2xpPg0KICAgICAgICAgICAgICAgICAgICB7Zm9yZWFjaCAkc2VsZWN0ZWQgYXMgJGFsaWFzID0+ICRuYW1lfQ0KICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJ1aS1zdGF0ZS1kZWZhdWx0IGNmIHNvcnRhYmxlLWl0ZW0iIGRhdGEtY21zbXMtaXRlbS1pZD0ieyRhbGlhc30iPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHskbmFtZX0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiB0aXRsZT0ieyRtb2QtPkxhbmcoJ3JlbW92ZScpfSIgY2xhc3M9InVpLWljb24gdWktaWNvbi10cmFzaCBzb3J0YWJsZS1yZW1vdmUiPnskbW9kLT5MYW5nKCdyZW1vdmUnKX08L2E+DQogICAgICAgICAgICAgICAgICAgICAgICA8L2xpPg0KICAgICAgICAgICAgICAgICAgICB7L2ZvcmVhY2h9DQogICAgICAgICAgICAgICAgPC91bD4NCiAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICA8L2ZpZWxkc2V0Pg0KICAgIDwvZGl2Pg0KICAgIDxkaXYgY2xhc3M9ImdyaWRfNiBvbWVnYSBkcmFnZ2FibGUtYXJlYSI+DQogICAgICAgIDxmaWVsZHNldD4NCiAgICAgICAgICAgIDxsZWdlbmQ+e2lmICRsYWJlbFJpZ2h0IT0nJ317JGxhYmVsUmlnaHR9e2Vsc2V9eyRtb2QtPkxhbmcoJ2NvbnRlbnRfYmxvY2tfbGFiZWxfYXZhaWxhYmxlJyl9ey9pZn08L2xlZ2VuZD4NCiAgICAgICAgICAgIDxkaXYgaWQ9ImF2YWlsYWJsZS1pdGVtcyI+DQogICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJzb3J0YWJsZS1lY2IyLWxpc3Qgc29ydGFibGUtbGlzdCBhdmFpbGFibGUtaXRlbXMiPg0KICAgICAgICAgICAgICAgIHtmb3JlYWNoICRhdmFpbGFibGUgYXMgJGFsaWFzID0+ICRuYW1lfQ0KICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJ1aS1zdGF0ZS1kZWZhdWx0IiBkYXRhLWNtc21zLWl0ZW0taWQ9InskYWxpYXN9Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7JG5hbWV9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgdGl0bGU9InskbW9kLT5MYW5nKCdyZW1vdmUnKX0iIGNsYXNzPSJ1aS1pY29uIHVpLWljb24tdHJhc2ggc29ydGFibGUtcmVtb3ZlIGhpZGRlbiI+eyRtb2QtPkxhbmcoJ3JlbW92ZScpfTwvYT4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+DQogICAgICAgICAgICAgICAgey9mb3JlYWNofQ0KICAgICAgICAgICAgICAgIDwvdWw+DQogICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgPC9maWVsZHNldD4NCiAgICA8L2Rpdj4NCjwvZGl2Pg==]]></data>
	</file>
</module>
